ZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWEyNmVmCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL01ha2VmaWxlCkBAIC0wLDAgKzEsMTY2IEBACisjIENlbnRyYWwgTWFrZWZpbGUKKyMKK1BMQVRGT1JNID89IG1hcGxlCitUT1BfRElSPSQoc2hlbGwgcHdkKQorZXhwb3J0IFBMQVRGT1JNCitleHBvcnQgVE9QX0RJUgorCitpZmVxICgiJChQTEFURk9STSkiLCAibWFwbGUiKQorICAgIERFVklDRT1iY202ODYyMAorICAgIGV4cG9ydCBERVZJQ0UKK2Vsc2UKKyAgICAkKGVycm9yIFNldCBERVZJQ0UgZm9yICQoUExBVEZPUk0pKQorZW5kaWYKKworTUFLRV9ESVI9JChUT1BfRElSKS9tYWtlCitNQUtFX0RFVklDRV9ESVI9JChNQUtFX0RJUikvJChERVZJQ0UpCitleHBvcnQgTUFLRV9ESVIKK2V4cG9ydCBNQUtFX0RFVklDRV9ESVIKKworaW5jbHVkZSAkKE1BS0VfRElSKS9NYWtlZmlsZS5pbml0aWFsX2NvbmZpZworT1VUX0RJUiAgICAgICAgICA/PSAkKFRPUF9ESVIpL2J1aWxkCitPVVRfRE9DU19ESVIJID89ICQoT1VUX0RJUikvZG9jCisKKyMgSWRlbnRpZnkgd2hldGhlciBpdCBpcyBjdXN0b21lciBvciBkZXZlbG9wbWVudCBidWlsZAorRU1CX01PRFVMRV9MSVNUPSQocmVhbHBhdGggJChNQUtFX0RFVklDRV9ESVIpL21vZHVsZXMuZW1iZWRkZWQpCitpZmVxICgiJChFTUJfTU9EVUxFX0xJU1QpIiwgIiIpCisgICAgUkVMRUFTRV9CVUlMRD15CisgICAgZXhwb3J0IFJFTEVBU0VfQlVJTEQKKyAgICBVU0VfTElOVD1uCisgICAgZXhwb3J0IFVTRV9MSU5UCisgICAgT1VUX0hPU1RfRElSIAkgPz0gJChPVVRfRElSKQorICAgIENPUFlfRlNfU0gJCSA9ICQoVE9QX0RJUikvbWFrZS9jb3B5X2hvc3RfZnMuc2ggCitlbHNlCisgICAgT1VUX0hPU1RfRElSIAkgPz0gJChPVVRfRElSKS8kKFBMQVRGT1JNKS9ob3N0CisgICAgT1VUX0VNQkVEREVEX0RJUiA/PSAkKE9VVF9ESVIpLyQoUExBVEZPUk0pL2VtYmVkZGVkCisgICAgQ09QWV9GU19TSAkJID0gJChUT1BfRElSKS9zY3JpcHRzL2NvcHlfaG9zdF9mcy5zaCAKKyAgICBleHBvcnQgT1VUX0VNQkVEREVEX0RJUgorZW5kaWYKKworaWZuZXEgKCIkKEJPQVJEKSIsICIiKQorICAgIENPUFlfSE9TVF9GU19DTUQgPSAkKFNJTEVOVF9CVUlMRCkkKENPUFlfRlNfU0gpIFRPUF9ESVI9JChUT1BfRElSKSBPVVRfSE9TVF9ESVI9JChPVVRfSE9TVF9ESVIpCitlbmRpZgorCitleHBvcnQgT1VUX0hPU1RfRElSCitleHBvcnQgT1VUX0RPQ1NfRElSCisKKyMgTGlzdCBvZiBhbGwgbW9kdWxlcywgYWxsIGxpYnJhcnkgbW9kdWxlcyBhbmQgYWxsIGFwcGxpY2F0aW9uIG1vZHVsZXMKK2V4cG9ydCBBTExfTU9EVUxFUworZXhwb3J0IEFMTF9MSUJfTU9EVUxFUworZXhwb3J0IEFMTF9BUFBfTU9EVUxFUworCisjIEN1cnJlbnQgYm9hcmQKK2V4cG9ydCBCT0FSRAorCitWID89IDAKK2lmZXEgKHgiJChWKSIsIHgiMCIpCisJU0lMRU5UID0gLXMKKwlleHBvcnQgU0lMRU5UCisJU0lMRU5UX0JVSUxEPUAKK2VuZGlmCisKK2lmZXEgKCIkKFJFTEVBU0VfQlVJTEQpIiwgInkiKQorYWxsOiBidWlsZF9ob3N0CitlbHNlCithbGw6IGJ1aWxkX2hvc3QgYnVpbGRfZW1iZWRkZWQKK2VuZGlmCisJJChDT1BZX0hPU1RfRlNfQ01EKQorCUBlY2hvIC0tLSBBbGwgZG9uZSAtLS0gICAgCisKK2NvcHlfaG9zdF9mczoKKwkkKENPUFlfSE9TVF9GU19DTUQpCisKK2lmZXEgKCIkKFJFTEVBU0VfQlVJTEQpIiwgInkiKQorY2xlYW46IGNsZWFuX2hvc3QKK2Vsc2UKK2NsZWFuOiBjbGVhbl9ob3N0IGNsZWFuX2VtYmVkZGVkCitlbmRpZgorCXJtIC1mciAkKE9VVF9ESVIpCisKK2hlbHBfZ2VuZXJhbDoKKwlAZWNobyAibWFrZSBwYXJhbWV0ZXJzOiIKKwlAZWNobyAiICAgUExBVEZPUk0gICAgICAgICAgLSBwbGF0Zm9ybSB0byBwZXJmb3JtIHRoZSBidWlsZCBmb3IuIFRoZSBkZWZhdWx0IHBsYXRmb3JtIGlzICQkUExBVEZPUk0iCisJQGVjaG8gIiAgICAgICAgICAgICAgICAgICAgICAgU3VwcG9ydGVkIHBsYXRmb3JtcyBhcmU6IG1hcGxlIgorCUBlY2hvICIgICBCT0FSRCAgICAgICAgICAgICAtIFRCRCBib2FyZCIKKwlAZWNobyAiICAgRU5BQkxFX0VQT04gICAgICAgLSBJbmNsdWRlIEVQT04vMTBHRVBPTiBzdXBwb3J0LiBEZWZhdWx0ID15LCB1bmxlc3Mgb3ZlcndyaXR0ZW4gaW4gcGxhdGZvcm0gY29uZmlndXJhdGlvbiIKKwlAZWNobyAiICAgRU5BQkxFX0dQT04gICAgICAgLSBJbmNsdWRlIEdQT04gc3VwcG9ydC4gRGVmYXVsdCA9eSwgdW5sZXNzIG92ZXJ3cml0dGVuIGluIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb24iCisJQGVjaG8gIiAgIEVOQUJMRV9YR1BPTiAgICAgIC0gSW5jbHVkZSBYR1BPTiBzdXBwb3J0LiBEZWZhdWx0ID15LCB1bmxlc3Mgb3ZlcndyaXR0ZW4gaW4gcGxhdGZvcm0gY29uZmlndXJhdGlvbiIKKwlAZWNobyAiICAgVj08b3V0cHV0X2xldmVsPiAgLSA9MS12ZXJib3NlIGNvbW1hbmQgb3V0cHV0LCA9Mi1tYWtlZmlsZSBkZWJ1ZyBvdXRwdXQiCisJQGVjaG8gIiAgIEdFTl9PQkpUQUdTICAgICAgIC0gTG93LWxldmVsIG9wdGlvbi4gT0JHVEFHUyB0byBiZSBwYXNzZWQgdG8gY29kZSBnZW5lcmF0b3IiCisJQGVjaG8gIiAgIEVYVFJBX1RZUEVTICAgICAgIC0gTG93LWxldmVsIG9wdGlvbi4gU3BhY2UtZGVsaW1pdGVkIGxpc3Qgb2YgZXh0cmEgdHlwZXMgd2l0aG91dCBiY21vbHRfIHByZWZpeCIKKwlAZWNobyAiICAgRU5BQkxFX0NMSSAgICAgICAgLSA9bi1leGNsdWRlIENMSSBzdXBwb3J0LiBJbmNsdWRlZCBieSBkZWZhdWx0IgorCUBlY2hvICIgICBFTkFCTEVfTE9HICAgICAgICAtID1uLWV4Y2x1ZGUgZGV2X2xvZyBzdXBwb3J0LiBJbmNsdWRlZCBieSBkZWZhdWx0IgorCUBlY2hvICJtYWtlIHRhcmdldHM6IgorCUBlY2hvICIgICBhbGwgICAgICAgICAgICAgICAtIGJ1aWxkIGV2ZXJ5dGhpbmcgZm9yIHRoZSBQTEFURk9STS4gVGhpcyBpcyB0aGUgZGVmYXVsdCB0YXJnZXQiCisJQGVjaG8gIiAgIGhvc3QgICAgICAgICAgICAgIC0gYnVpbGQgUExBVEZPUk0ncyBob3N0IHNpZGUiCisJQGVjaG8gIiAgIGVtYmVkZGVkICAgICAgICAgIC0gYnVpbGQgUExBVEZPUk0ncyBlbWJlZGRlZCBzaWRlIgorCUBlY2hvICIgICBjbGVhbiAgICAgICAgICAgICAtIGNsZWFuIGV2ZXJ5dGhpbmcgZm9yIHRoZSBQTEFURk9STSIKKwlAZWNobyAiICAgY2xlYW5faG9zdCAgICAgICAgLSBjbGVhbiBQTEFURk9STSdzIGhvc3Qgc2lkZSIKKwlAZWNobyAiICAgY2xlYW5fZW1iZWRkZWQgICAgLSBjbGVhbiBQTEFURk9STSdzIGVtYmVkZGVkIHNpZGUiCisJQGVjaG8gIiAgIGRvY3MgICAgICAgICAgICAgIC0gZ2VuZXJhdGUgcmVmZXJlbmNlIGRvY3VtZW50IGluIGh0bWwgZm9ybWF0IgorCUBlY2hvICIgICBkb2NzX3BkZiAgICAgICAgICAtIGdlbmVyYXRlIHJlZmVyZW5jZSBkb2N1bWVudCBpbiBwZGYgZm9ybWF0IgorCUBlY2hvICIgICBkcml2ZXJzICAgICAgICAgICAtIGdlbmVyYXRlIGxpYnJkYiwgcnVfZ2VuIGFuZCBoYWxfZ2VuZXJhdG9yIGRyaXZlciBsYXllcnMiCisJQGVjaG8gIiAgIGNsZWFuX2RyaXZlcnMgICAgIC0gY2xlYW4gbGlicmRiLCBydV9nZW4gYW5kIGhhbF9nZW5lcmF0b3IiCisKKworaWZlcSAoIiQoUkVMRUFTRV9CVUlMRCkiLCAieSIpCitoZWxwOiBoZWxwX2dlbmVyYWwgaGVscF9ob3N0CitlbHNlCitoZWxwOiBoZWxwX2dlbmVyYWwgaGVscF9ob3N0IGhlbHBfZW1iZWRkZWQKK2VuZGlmCisJCitkb2NzOiBkb2NzX2hvc3QKKwkKK2RvY3NfaG9zdDoKKwkkKFNJTEVOVF9CVUlMRCkkKE1BS0UpIFNVQlNZU1RFTT1ob3N0IC1mICQoTUFLRV9ESVIpL01ha2VmaWxlLm1haW4gJEAKKworZG9jc19wZGY6IGRvY3MKKwkkKFNJTEVOVF9CVUlMRCkkKE1BS0UpIC1DICQoT1VUX0RPQ1NfRElSKS9sYXRleAorCitkb2NzX2NsZWFuOgorCSQoU0lMRU5UX0JVSUxEKSQoQk9MRF9QUklOVCkgIkNsZWFuaW5nIGRvY3MiCisJJChTSUxFTlRfQlVJTEQpcm0gLWZyICQoT1VUX0RPQ1NfRElSKQorCitjbG9iYmVyOiBjbGVhbiBkb2NzX2NsZWFuCisKK2hvc3Q6IGJ1aWxkX2hvc3QKKwkkKENPUFlfSE9TVF9GU19DTUQpCisKK2NsZWFuX2hvc3Q6CisJJChTSUxFTlRfQlVJTEQpcm0gLWZyICQoT1VUX0hPU1RfRElSKQorCSQoU0lMRU5UX0JVSUxEKSQoTUFLRSkgJChTSUxFTlQpIFNVQlNZU1RFTT1ob3N0IC1mICQoTUFLRV9ESVIpL01ha2VmaWxlLm1haW4gJEAKKworJV9ob3N0OgorCSQoU0lMRU5UX0JVSUxEKSQoTUFLRSkgJChTSUxFTlQpIFNVQlNZU1RFTT1ob3N0IC1mICQoTUFLRV9ESVIpL01ha2VmaWxlLm1haW4gJEAKKworaWZuZXEgKCIkKFJFTEVBU0VfQlVJTEQpIiwgInkiKQorZW1iZWRkZWQ6IGJ1aWxkX2VtYmVkZGVkCisJJChDT1BZX0hPU1RfRlNfQ01EKQorCQorY2xlYW5fZW1iZWRkZWQ6CisJJChTSUxFTlRfQlVJTEQpcm0gLWZyICQoT1VUX0VNQkVEREVEX0RJUikKKwkkKFNJTEVOVF9CVUlMRCkkKE1BS0UpICQoU0lMRU5UKSBTVUJTWVNURU09ZW1iZWRkZWQgLWYgJChNQUtFX0RJUikvTWFrZWZpbGUubWFpbiAkQAorCitkb2NzX2VtYmVkZGVkOgorCislX2VtYmVkZGVkOgorCSQoU0lMRU5UX0JVSUxEKSQoTUFLRSkgJChTSUxFTlQpIFNVQlNZU1RFTT1lbWJlZGRlZCAtZiAkKE1BS0VfRElSKS9NYWtlZmlsZS5tYWluICRACisKK2VuZGlmCisJCisKK2hhbF9nZW5lcmF0b3I6CisJJChTSUxFTlRfQlVJTEQpJChNQUtFKSAkKFNMSUVOVCkgLUMgJChUT1BfRElSKS9lbWJlZGRlZC9oYWxfZ2VuZXJhdG9yL3NyYworCitkcml2ZXJzOgorCSQoU0lMRU5UX0JVSUxEKSQoTUFLRSkgJChTTElFTlQpIC1DICQoVE9QX0RJUikvZW1iZWRkZWQvaGFsX2dlbmVyYXRvci9saWJyZGIKKwkkKFNJTEVOVF9CVUlMRCkkKE1BS0UpICQoU0xJRU5UKSAtQyAkKFRPUF9ESVIpL2VtYmVkZGVkL2hhbF9nZW5lcmF0b3IvcnVfZ2VuCisJJChTSUxFTlRfQlVJTEQpJChNQUtFKSAkKFNMSUVOVCkgLUMgJChUT1BfRElSKS9lbWJlZGRlZC9wbV9kcnZfZ2VuZXJhdG9yCisKKworY2xlYW5fZHJpdmVyczoKKwkkKFNJTEVOVF9CVUlMRCkkKE1BS0UpICQoU0xJRU5UKSAtQyAkKFRPUF9ESVIpL2VtYmVkZGVkL2hhbF9nZW5lcmF0b3IvbGlicmRiIGNsZWFuIAorCSQoU0lMRU5UX0JVSUxEKSQoTUFLRSkgJChTTElFTlQpIC1DICQoVE9QX0RJUikvZW1iZWRkZWQvaGFsX2dlbmVyYXRvci9ydV9nZW4gY2xlYW4KKwkkKFNJTEVOVF9CVUlMRCkkKE1BS0UpICQoU0xJRU5UKSAtQyAkKFRPUF9ESVIpL2VtYmVkZGVkL2hhbF9nZW5lcmF0b3Ivc3JjIGNsZWFuCisJJChTSUxFTlRfQlVJTEQpJChNQUtFKSAkKFNMSUVOVCkgLUMgJChUT1BfRElSKS9lbWJlZGRlZC9wbV9kcnZfZ2VuZXJhdG9yIGNsZWFuCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9kb2NzLzY4NjIwLVNXUk4xMTYtU1dSRFMucGRmIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2RvY3MvNjg2MjAtU1dSTjExNi1TV1JEUy5wZGYKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWY1NDUzMgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9kb2NzLzY4NjIwLVNXUk4xMTYtU1dSRFMucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9lbWJlZGRlZF9iaW5hcmllcy9iY202ODYyMF9hcHBsLmJpbiBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9lbWJlZGRlZF9iaW5hcmllcy9iY202ODYyMF9hcHBsLmJpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjBkMDNlCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2VtYmVkZGVkX2JpbmFyaWVzL2JjbTY4NjIwX2FwcGwuYmluCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9lbWJlZGRlZF9iaW5hcmllcy9iY202ODYyMF9ib290LmJpbiBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9lbWJlZGRlZF9iaW5hcmllcy9iY202ODYyMF9ib290LmJpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmE2NTBkCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2VtYmVkZGVkX2JpbmFyaWVzL2JjbTY4NjIwX2Jvb3QuYmluCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9lbWJlZGRlZF9iaW5hcmllcy9saWNlbnNlLnR4dCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9lbWJlZGRlZF9iaW5hcmllcy9saWNlbnNlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNmQyMWU5Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2VtYmVkZGVkX2JpbmFyaWVzL2xpY2Vuc2UudHh0CkBAIC0wLDAgKzEsNDYgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6cHJvcHJpZXRhcnk6c3RhbmRhcmQKKyAKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAKK1RoaXMgcHJvZ3JhbSBpcyB0aGUgcHJvcHJpZXRhcnkgc29mdHdhcmUgb2YgQnJvYWRjb20gQ29ycG9yYXRpb24gYW5kL29yIGl0cworbGljZW5zb3JzLCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgZHVwbGljYXRlZCwgbW9kaWZpZWQgb3IgZGlzdHJpYnV0ZWQgcHVyc3VhbnQKK3RvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiBhIHNlcGFyYXRlLCB3cml0dGVuIGxpY2Vuc2UgYWdyZWVtZW50IGV4ZWN1dGVkCitiZXR3ZWVuIHlvdSBhbmQgQnJvYWRjb20gKGFuICJBdXRob3JpemVkIExpY2Vuc2UiKS4gIEV4Y2VwdCBhcyBzZXQgZm9ydGggaW4KK2FuIEF1dGhvcml6ZWQgTGljZW5zZSwgQnJvYWRjb20gZ3JhbnRzIG5vIGxpY2Vuc2UgKGV4cHJlc3Mgb3IgaW1wbGllZCksIHJpZ2h0Cit0byB1c2UsIG9yIHdhaXZlciBvZiBhbnkga2luZCB3aXRoIHJlc3BlY3QgdG8gdGhlIFNvZnR3YXJlLCBhbmQgQnJvYWRjb20KK2V4cHJlc3NseSByZXNlcnZlcyBhbGwgcmlnaHRzIGluIGFuZCB0byB0aGUgU29mdHdhcmUgYW5kIGFsbCBpbnRlbGxlY3R1YWwKK3Byb3BlcnR5IHJpZ2h0cyB0aGVyZWluLiAgSUYgWU9VIEhBVkUgTk8gQVVUSE9SSVpFRCBMSUNFTlNFLCBUSEVOIFlPVSBIQVZFCitOTyBSSUdIVCBUTyBVU0UgVEhJUyBTT0ZUV0FSRSBJTiBBTlkgV0FZLCBBTkQgU0hPVUxEIElNTUVESUFURUxZIE5PVElGWQorQlJPQURDT00gQU5EIERJU0NPTlRJTlVFIEFMTCBVU0UgT0YgVEhFIFNPRlRXQVJFLgorIAorRXhjZXB0IGFzIGV4cHJlc3NseSBzZXQgZm9ydGggaW4gdGhlIEF1dGhvcml6ZWQgTGljZW5zZSwKKyAKKzEuIFRoaXMgcHJvZ3JhbSwgaW5jbHVkaW5nIGl0cyBzdHJ1Y3R1cmUsIHNlcXVlbmNlIGFuZCBvcmdhbml6YXRpb24sCisgICAgY29uc3RpdHV0ZXMgdGhlIHZhbHVhYmxlIHRyYWRlIHNlY3JldHMgb2YgQnJvYWRjb20sIGFuZCB5b3Ugc2hhbGwgdXNlCisgICAgYWxsIHJlYXNvbmFibGUgZWZmb3J0cyB0byBwcm90ZWN0IHRoZSBjb25maWRlbnRpYWxpdHkgdGhlcmVvZiwgYW5kIHRvCisgICAgdXNlIHRoaXMgaW5mb3JtYXRpb24gb25seSBpbiBjb25uZWN0aW9uIHdpdGggeW91ciB1c2Ugb2YgQnJvYWRjb20KKyAgICBpbnRlZ3JhdGVkIGNpcmN1aXQgcHJvZHVjdHMuCisgCisyLiBUTyBUSEUgTUFYSU1VTSBFWFRFTlQgUEVSTUlUVEVEIEJZIExBVywgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIKKyAgICBBTkQgV0lUSCBBTEwgRkFVTFRTIEFORCBCUk9BRENPTSBNQUtFUyBOTyBQUk9NSVNFUywgUkVQUkVTRU5UQVRJT05TIE9SCisgICAgV0FSUkFOVElFUywgRUlUSEVSIEVYUFJFU1MsIElNUExJRUQsIFNUQVRVVE9SWSwgT1IgT1RIRVJXSVNFLCBXSVRICisgICAgUkVTUEVDVCBUTyBUSEUgU09GVFdBUkUuICBCUk9BRENPTSBTUEVDSUZJQ0FMTFkgRElTQ0xBSU1TIEFOWSBBTkQKKyAgICBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIFRJVExFLCBNRVJDSEFOVEFCSUxJVFksIE5PTklORlJJTkdFTUVOVCwKKyAgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgTEFDSyBPRiBWSVJVU0VTLCBBQ0NVUkFDWSBPUgorICAgIENPTVBMRVRFTkVTUywgUVVJRVQgRU5KT1lNRU5ULCBRVUlFVCBQT1NTRVNTSU9OIE9SIENPUlJFU1BPTkRFTkNFCisgICAgVE8gREVTQ1JJUFRJT04uIFlPVSBBU1NVTUUgVEhFIEVOVElSRSBSSVNLIEFSSVNJTkcgT1VUIE9GIFVTRSBPUgorICAgIFBFUkZPUk1BTkNFIE9GIFRIRSBTT0ZUV0FSRS4KKyAKKzMuIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBJTiBOTyBFVkVOVCBTSEFMTCBCUk9BRENPTSBPUgorICAgIElUUyBMSUNFTlNPUlMgQkUgTElBQkxFIEZPUiAoaSkgQ09OU0VRVUVOVElBTCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAgICBJTkRJUkVDVCwgT1IgRVhFTVBMQVJZIERBTUFHRVMgV0hBVFNPRVZFUiBBUklTSU5HIE9VVCBPRiBPUiBJTiBBTlkKKyAgICBXQVkgUkVMQVRJTkcgVE8gWU9VUiBVU0UgT0YgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgU09GVFdBUkUgRVZFTgorICAgIElGIEJST0FEQ09NIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUzsKKyAgICBPUiAoaWkpIEFOWSBBTU9VTlQgSU4gRVhDRVNTIE9GIFRIRSBBTU9VTlQgQUNUVUFMTFkgUEFJRCBGT1IgVEhFCisgICAgU09GVFdBUkUgSVRTRUxGIE9SIFUuUy4gJDEsIFdISUNIRVZFUiBJUyBHUkVBVEVSLiBUSEVTRSBMSU1JVEFUSU9OUworICAgIFNIQUxMIEFQUExZIE5PVFdJVEhTVEFORElORyBBTlkgRkFJTFVSRSBPRiBFU1NFTlRJQUwgUFVSUE9TRSBPRiBBTlkKKyAgICBMSU1JVEVEIFJFTUVEWS4KKzo+CisqLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvYXBpX2xpbnV4L01ha2VmaWxlIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9hcGlfbGludXgvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE2MTdiNQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvYXBpX2xpbnV4L01ha2VmaWxlCkBAIC0wLDAgKzEsMTYgQEAKKyMgTWFrZWZpbGUgZm9yIGJ1aWxkaW5nIHV0aWxpdGllcyBhcyBsaW51eCBtb2R1bGUKKyMKK2lmZXEgKCIkKE9TX0tFUk5FTCkiLCAibGludXgiKQorCitNT0RfTkFNRSA9IGFwaV9saW51eAorTU9EX1RZUEUgPSBsaW51eF9saWIKK01PRF9ERVBTID0gdXRpbHNfbGludXggc3lzbW9kZWwKK3NyY3MgPSBiY21vbHRfbXNnLmMKKworIyBJZiBjYWxsZWQgYnkgbGludXgga2VybmVsIGJ1aWxkZXIgLSBhZGQgaW5jbHVkZSBwYXRocyBtYW51YWxseS4KKyMgSXQgaXMgbm90IGVsZWdhbnQsIGJ1dCB3ZSdsbCBub3QgaGF2ZSBtYW55IGxpbnV4IG1vZHVsZXMKK2lmbmVxICgiJChLQlVJTERfU1JDKSIsICIiKQorCS1pbmNsdWRlICQoT1VUX0RJUl9CQVNFKS9NYWtlZmlsZS5jb25maWcuJChNT0RfTkFNRSkKK2VuZGlmCisKK2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2FwaV9saW51eC9iY21vbHRfYXBpLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2FwaV9saW51eC9iY21vbHRfYXBpLmMKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNGFlYTIxOAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvYXBpX2xpbnV4L2JjbW9sdF9hcGkuYwpAQCAtMCwwICsxIEBACisuLi8uLi9ob3N0X2RyaXZlci9hcGkvYmNtb2x0X2FwaS5jClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9hcGlfbGludXgvYmNtb2x0X2FwaS5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9hcGlfbGludXgvYmNtb2x0X2FwaS5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmZlNTNlMjUKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2FwaV9saW51eC9iY21vbHRfYXBpLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vaG9zdF9kcml2ZXIvYXBpL2JjbW9sdF9hcGkuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvYXBpX2xpbnV4L2JjbW9sdF9tc2cuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvYXBpX2xpbnV4L2JjbW9sdF9tc2cuYwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5jMzg3NWYzCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9hcGlfbGludXgvYmNtb2x0X21zZy5jCkBAIC0wLDAgKzEgQEAKKy4uLy4uL2hvc3RfZHJpdmVyL2FwaS9iY21vbHRfbXNnLmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2FwaV9saW51eC9iY21vbHRfbXNnLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2FwaV9saW51eC9iY21vbHRfbXNnLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNTQ2YTc0ZQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvYXBpX2xpbnV4L2JjbW9sdF9tc2cuaApAQCAtMCwwICsxIEBACisuLi8uLi9ob3N0X2RyaXZlci9hcGkvYmNtb2x0X21zZy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9ib2FyZC93cngvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2JvYXJkL3dyeC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2QxZTA3Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9ib2FyZC93cngvTWFrZWZpbGUKQEAgLTAsMCArMSwxNCBAQAorIyBNYXBsZSBib2FyZCBzcGVjaWZpYyBjb25maWd1cmF0aW9ucy4gUmVsZXZhbnQgb25seSBpZiB3b3JraW5nIGluIExpbnV4CisjCitNT0RfVFlQRSA9IGxpYgorTU9EX05BTUUgPSBiY21fYm9hcmQKKworaWZlcSAoIiQoT1NfS0VSTkVMKSIsICJsaW51eCIpCitpZmVxICgiJChFTkFCTEVfQ0xJKSIsICJ5IikKKworTU9EX0RFUFMgPSBjbGkgaTJjX2RldnMgYXBpX2NsaSBiY21fZGV2X2N0cmxfbGludXgKKworc3JjcyA9IGJjbW9sdF9ib2FyZC5jIGJjbW9sdF9ib2FyZF9jbGkuYworZW5kaWYKK2VuZGlmCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvYm9hcmQvd3J4L2JjbW9sdF9ib2FyZC5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9ib2FyZC93cngvYmNtb2x0X2JvYXJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc5YzVmOQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvYm9hcmQvd3J4L2JjbW9sdF9ib2FyZC5jCkBAIC0wLDAgKzEsNzAyIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyovCisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGJjbWNsaS5oPgorI2luY2x1ZGUgPGJjbW9sdF9pMmNfZGV2c19pb2N0bC5oPgorI2luY2x1ZGUgPGJjbW9sdF9kZXZfY3RybF9pb2N0bC5oPgorI2luY2x1ZGUgPGJjbW9sdF9hcGkuaD4KKyNpbmNsdWRlIDxiY21vbHRfbW9kZWxfdHlwZXMuaD4KKyNpbmNsdWRlIDxiY21vbHRfZmxkLmg+CisjaW5jbHVkZSAiYmNtb2x0X2JvYXJkLmgiCisjaW5jbHVkZSAiYmNtb2x0X2RwbGxfdGFibGUuaCIKKworI2RlZmluZSBCQ01fSTJDX0RFVl9BRERSX1NUQVJUIHR5cGVkZWYgZW51bSB7CisjZGVmaW5lIEJDTV9JMkNfREVWX0FERFIobmFtZSwgZGVzYywgdmFsKSBuYW1lID0gdmFsLAorI2RlZmluZSBCQ01fSTJDX0RFVl9BRERSX0VORCB9IGJjbV9pMmNfZGV2X2FkZHI7CisKKyNkZWZpbmUgQkNNX0ZQR0FfUkVHX0ZQR0FfVkVSU0lPTiAweDAKKyNkZWZpbmUgQkNNX0ZQR0FfUkVHX0JPQVJEX0NPTkYgMHgxCisjZGVmaW5lIEJDTV9GUEdBX1JFR19SRVNFVFMgMHgyCisvKiBFbmFibGUvZGlzYWJsZSB0cmFuc2NlaXZlciAqLworI2RlZmluZSBCQ01fRlBHQV9SRUdfVFJYX0VOQUJMRSAweDMKKyNkZWZpbmUgQkNNX0ZQR0FfUkVHX1RSWF9GQUlMIDB4NAorLyogSXMgdHJhbnNjZWl2ZXIgcHJlc2VudCA/ICovCisjZGVmaW5lIEJDTV9GUEdBX1JFR19UUlhfSVNfUFJFU0VOVCAweDUKKyNkZWZpbmUgQkNNX0ZQR0FfUkVHX0NYUF9DT05UUk9MUyAweDYKKyNkZWZpbmUgQkNNX0ZQR0FfUkVHX1NISUZUX1JFR0lTVEVSX0RBVEEgMHg3CisjZGVmaW5lIEJDTV9GUEdBX1JFR19TSElGVF9SRUdJU1RFUl9DT05UUk9MIDB4OAorI2RlZmluZSBCQ01fRlBHQV9SRUdfTEVEUyAweDkKKyNkZWZpbmUgQkNNX0ZQR0FfUkVHX0RFQlVHX0xFRFMgMHhBCisjZGVmaW5lIEJDTV9GUEdBX1JFR19HUElPX0RJUiAweEIKKyNkZWZpbmUgQkNNX0ZQR0FfUkVHX0dQSU9fSU5QVVQgMHhDCisjZGVmaW5lIEJDTV9GUEdBX1JFR19HUElPX09VVFBVVCAweEQKKyNkZWZpbmUgQkNNX0ZQR0FfUkVHX0dQSU9fSVJRIDB4RQorCisjZGVmaW5lIEJDTV9GUEdBX1JFR19MT1cgQkNNX0ZQR0FfUkVHX0ZQR0FfVkVSU0lPTgorI2RlZmluZSBCQ01fRlBHQV9SRUdfSElHSCBCQ01fRlBHQV9SRUdfR1BJT19JUlEKKworI2RlZmluZSBCQ01fUlNUX0JJVF9ERVZJQ0UgMHgwCisjZGVmaW5lIEJDTV9SU1RfQklUX1BPTl9EUExMIDB4MQorI2RlZmluZSBCQ01fUlNUX0JJVF9QTV9EUExMIDB4MgorI2RlZmluZSBCQ01fUlNUX0JJVF9LVDIgMHg0CisKKyNkZWZpbmUgU1ZLNF9JREVOVF9GSUxFICAgICAgICAgICAgICAgICAiL2V0Yy9zdms0IgorCisjaW5jbHVkZSA8YmNtb2x0X2kyY19kZXZzX2FkZHIuaD4KKworI2RlZmluZSBNQVhfQ01EX1NUUl9MRU4gMTAyNAorCisvKiBTaW5jZSB0aGUgYm9hcmQgZHJpdmVyIGNvbmZpZ3VyYXRpb24gaXMgc3BlY2lmaWMgZm9yIExpbnV4LCB0aGVyZSBpcyBubyBwb2ludCB1c2luZyBPUyBhYnN0cmFjdGlvbiBsYXllciB0byBwZXJmb3JtIG9wZXJhdGlvbnMgbGlrZSBpb2N0bCgpLiAqLworCitzdGF0aWMgaW50IG1hcGxlX2kyY19mZDsKK3N0YXRpYyBpbnQgbWFwbGVfZGV2X2N0cmxfZmQ7CisKK3N0YXRpYyBiY21vc19ib29sIGJjbV9ib2FyZF9pc19zdms0KHZvaWQpCit7CisgICAgYmNtb3NfYm9vbCBpc19zdms0ID0gQkNNT1NfRkFMU0U7CisgICAgRklMRSAqZiA9IGZvcGVuKFNWSzRfSURFTlRfRklMRSwgInIiKTsKKyAgICBpZiAoZikKKyAgICB7CisgICAgICAgIGlzX3N2azQgPSBCQ01PU19UUlVFOworICAgICAgICBmY2xvc2UoZik7CisgICAgfQorICAgIHJldHVybiBpc19zdms0OworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtX2FjY2Vzc19mcGdhKHZvaWQpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgaWYgKGJjbV9ib2FyZF9pc19zdms0KCkpCisgICAgeworICAgICAgICByYyA9IGJjbV9ib2FyZF9kZXZfY2hhbmdlKEkyQ19TVzFfSTJDX0FERFIpOworICAgICAgICBCQ01PU19UUkFDRV9DSEVDS19SRVRVUk4ocmMsIHJjLCAiYmNtX2JvYXJkX2Rldl9jaGFuZ2UoSTJDX1NXMV9JMkNfQUREUikgZmFpbGVkXG4iKTsKKyAgICAgICAgcmMgPSBiY21fYm9hcmRfc3dpdGNoX3dyaXRlKDB4NCk7CisgICAgICAgIEJDTU9TX1RSQUNFX0NIRUNLX1JFVFVSTihyYywgcmMsICJiY21fYm9hcmRfc3dpdGNoX3dyaXRlKDEpIGZhaWxlZFxuIik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJjID0gYmNtX2JvYXJkX2Rldl9jaGFuZ2UoSTJDX1NXMF9JMkNfQUREUik7CisgICAgICAgIEJDTU9TX1RSQUNFX0NIRUNLX1JFVFVSTihyYywgcmMsICJiY21fYm9hcmRfZGV2X2NoYW5nZShJMkNfU1cwX0kyQ19BRERSKSBmYWlsZWRcbiIpOworICAgICAgICByYyA9IGJjbV9ib2FyZF9zd2l0Y2hfd3JpdGUoMSk7CisgICAgICAgIEJDTU9TX1RSQUNFX0NIRUNLX1JFVFVSTihyYywgcmMsICJiY21fYm9hcmRfc3dpdGNoX3dyaXRlKDEpIGZhaWxlZFxuIik7CisgICAgfQorICAgIHJjID0gYmNtX2JvYXJkX2Rldl9jaGFuZ2UoRlBHQV9JMkNfQUREUik7CisgICAgQkNNT1NfVFJBQ0VfQ0hFQ0tfUkVUVVJOKHJjLCByYywgImJjbV9ib2FyZF9kZXZfY2hhbmdlKEZQR0FfSTJDX0FERFIpIGZhaWxlZCBcbiIpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIGJjbV9ib2FyZF9kZXZfY2hhbmdlKHVpbnQzMl90IGFkZHIpCit7CisgICAgaW50IHJjOworICAgIG1hcGxlX2kyY19pb2N0bF9wYXJhbSBwYXJhbXMgPQorICAgIHsKKyAgICAgICAgLmFkZHIgPSBhZGRyLAorICAgIH07CisKKyAgICByYyA9IGlvY3RsKG1hcGxlX2kyY19mZCwgTUFQTEVfSTJDX0lPQ1RMX09QX0RFVl9DSEFOR0UsICZwYXJhbXMpOworICAgIEJDTU9TX1RSQUNFX0NIRUNLX1JFVFVSTihyYywgQkNNX0VSUl9JTlRFUk5BTCwgImlvY3RsIGZhaWxlZCBmb3IgbWFwbGVfaTJjX2ZkXG4iKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19lcnJubyBiY21fYm9hcmRfZGV2X3dyaXRlKHVpbnQzMl90IGNvdW50LCB1aW50MzJfdCBhZGRyLCB1aW50MzJfdCB2YWwpCit7CisgICAgaW50IHJjOworICAgIG1hcGxlX2kyY19pb2N0bF9wYXJhbSBwYXJhbXMgPQorICAgIHsKKyAgICAgICAgLmNvdW50ID0gY291bnQsCisgICAgICAgIC5hZGRyID0gYWRkciwKKyAgICAgICAgLnZhbCA9IHZhbCwKKyAgICB9OworCisgICAgcmMgPSBpb2N0bChtYXBsZV9pMmNfZmQsIE1BUExFX0kyQ19JT0NUTF9PUF9ERVZfV1JJVEUsICZwYXJhbXMpOworICAgIEJDTU9TX1RSQUNFX0NIRUNLX1JFVFVSTihyYywgQkNNX0VSUl9JTlRFUk5BTCwgImlvY3RsIGZhaWxlZCBmb3IgbWFwbGVfaTJjX2ZkXG4iKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19lcnJubyBiY21fYm9hcmRfZGV2X3JlYWQodWludDMyX3QgY291bnQsIHVpbnQzMl90IGFkZHIsIHVpbnQzMl90ICp2YWwpCit7CisgICAgaW50IHJjOworICAgIG1hcGxlX2kyY19pb2N0bF9wYXJhbSBwYXJhbXMgPQorICAgIHsKKyAgICAgICAgLmNvdW50ID0gY291bnQsCisgICAgICAgIC5hZGRyID0gYWRkciwKKyAgICB9OworCisgICAgcmMgPSBpb2N0bChtYXBsZV9pMmNfZmQsIE1BUExFX0kyQ19JT0NUTF9PUF9ERVZfUkVBRCwgJnBhcmFtcyk7CisgICAgQkNNT1NfVFJBQ0VfQ0hFQ0tfUkVUVVJOKHJjLCBCQ01fRVJSX0lOVEVSTkFMLCAiaW9jdGwgZmFpbGVkIGZvciBtYXBsZV9pMmNfZmRcbiIpOworICAgICp2YWwgPSBwYXJhbXMudmFsOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIGJjbV9ib2FyZF9zd2l0Y2hfd3JpdGUodWludDMyX3QgdmFsKQoreworICAgIGludCByYzsKKyAgICBtYXBsZV9pMmNfaW9jdGxfcGFyYW0gcGFyYW1zID0KKyAgICB7CisgICAgICAgIC52YWwgPSB2YWwsCisgICAgfTsKKworICAgIHJjID0gaW9jdGwobWFwbGVfaTJjX2ZkLCBNQVBMRV9JMkNfSU9DVExfT1BfU1dJVENIX1dSSVRFLCAmcGFyYW1zKTsKKyAgICBCQ01PU19UUkFDRV9DSEVDS19SRVRVUk4ocmMsIEJDTV9FUlJfSU5URVJOQUwsICJpb2N0bCBmYWlsZWQgZm9yIG1hcGxlX2kyY19mZFxuIik7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtX2JvYXJkX3N3aXRjaF9yZWFkKHVpbnQzMl90ICp2YWwpCit7CisgICAgaW50IHJjOworICAgIG1hcGxlX2kyY19pb2N0bF9wYXJhbSBwYXJhbXMgPSB7fTsKKworICAgIHJjID0gaW9jdGwobWFwbGVfaTJjX2ZkLCBNQVBMRV9JMkNfSU9DVExfT1BfU1dJVENIX1JFQUQsICZwYXJhbXMpOworICAgIEJDTU9TX1RSQUNFX0NIRUNLX1JFVFVSTihyYywgQkNNX0VSUl9JTlRFUk5BTCwgImlvY3RsIGZhaWxlZCBmb3IgbWFwbGVfaTJjX2ZkXG4iKTsKKyAgICAqdmFsID0gcGFyYW1zLnZhbDsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19lcnJubyBiY21fYm9hcmRfZnBnYV93cml0ZSh1aW50MzJfdCBhZGRyLCB1aW50MzJfdCB2YWwpCit7CisgICAgaW50IHJjOworICAgIG1hcGxlX2kyY19pb2N0bF9wYXJhbSBwYXJhbXMgPQorICAgIHsKKyAgICAgICAgLmFkZHIgPSBhZGRyLAorICAgICAgICAudmFsID0gdmFsLAorICAgIH07CisKKyAgICByYyA9IGlvY3RsKG1hcGxlX2kyY19mZCwgTUFQTEVfSTJDX0lPQ1RMX09QX0ZQR0FfV1JJVEUsICZwYXJhbXMpOworICAgIEJDTU9TX1RSQUNFX0NIRUNLX1JFVFVSTihyYywgQkNNX0VSUl9JTlRFUk5BTCwgImlvY3RsIGZhaWxlZCBmb3IgZnBnYV93cml0ZVxuIik7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtX2JvYXJkX2hvc3RfZXZlbnRfd3JpdGUodWludDMyX3QgdmFsKQoreworICAgIGludCByYzsKKyAgICBkZXZfY3RybF9pb2N0bF9wYXJhbSBwYXJhbXMgPQorICAgIHsKKyAgICAgICAgLmV2ZW50ID0gdmFsLAorICAgIH07CisKKyAgICByYyA9IGlvY3RsKG1hcGxlX2Rldl9jdHJsX2ZkLCBNQVBMRV9ERVZfQ1RSTF9JT0NUTF9PUF9IT1NUX0VWRU5UX1dSSVRFLCAmcGFyYW1zKTsKKyAgICBCQ01PU19UUkFDRV9DSEVDS19SRVRVUk4ocmMsIEJDTV9FUlJfSU5URVJOQUwsICJpb2N0bCBmYWlsZWQgZm9yIGhvc3RfZXZlbnRfd3JpdGVcbiIpOworCisjaWZkZWYgQ09ORklHX09OVV9TSU0KKyAgICAvKiBSYWlzZSBhbiBpbnRlcnJ1cHQgb24gZXh0X2lycTEgZm9yIHRoZSBlbWJlZGRlZCBzaWRlLiAqLworICAgIHJjID0gYmNtX2JvYXJkX2ZwZ2FfZ2VuX2dwaW9faXJxKEJDTU9MVF9FWFRfSVJRX0VYVF9JUlExKTsKKyAgICBCQ01PU19UUkFDRV9DSEVDS19SRVRVUk4ocmMsIEJDTV9FUlJfSU5URVJOQUwsICJpb2N0bCBmYWlsZWQgZm9yIGJjbV9ib2FyZF9mcGdhX2dlbl9ncGlvX2lycVxuIik7CisjZW5kaWYKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19lcnJubyBiY21fYm9hcmRfcGNpX2RlYnVnKHVpbnQzMl90IGRldmljZSwgdWludDMyX3QgY29tbWFuZCwgaW50MzJfdCBzdGFydCwgaW50MzJfdCBob3dtYW55LCB1aW50MzJfdCAqZHVtcHB0cikKK3sKKyAgICBpbnQgcmM7CisgICAgZGV2X2N0cmxfaW9jdGxfcGFyYW0gcGFyYW1zID0KKyAgICB7CisgICAgICAgIC5kZXZpY2UgPSBkZXZpY2UsCisgICAgICAgIC5kdW1wcHRyID0gZHVtcHB0ciwKKyAgICAgICAgLnN0YXJ0X2luZGV4ID0gc3RhcnQsCisgICAgICAgIC5ob3dtYW55ID0gaG93bWFueQorICAgIH07CisKKyAgICByYyA9IGlvY3RsKG1hcGxlX2Rldl9jdHJsX2ZkLCBjb21tYW5kLCAmcGFyYW1zKTsKKyAgICBCQ01PU19UUkFDRV9DSEVDS19SRVRVUk4ocmMsIEJDTV9FUlJfSU5URVJOQUwsICJpb2N0bCBmYWlsZWQgZm9yIGRldl9jdHJsXG4iKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorYmNtb3NfZXJybm8gYmNtX2JvYXJkX2ZwZ2FfcmVhZCh1aW50MzJfdCBhZGRyLCB1aW50MzJfdCAqdmFsKQoreworICAgIGludCByYzsKKyAgICBtYXBsZV9pMmNfaW9jdGxfcGFyYW0gcGFyYW1zID0KKyAgICB7CisgICAgICAgIC5hZGRyID0gYWRkciwKKyAgICB9OworCisgICAgcmMgPSBpb2N0bChtYXBsZV9pMmNfZmQsIE1BUExFX0kyQ19JT0NUTF9PUF9GUEdBX1JFQUQsICZwYXJhbXMpOworICAgIEJDTU9TX1RSQUNFX0NIRUNLX1JFVFVSTihyYywgQkNNX0VSUl9JTlRFUk5BTCwgImlvY3RsIGZhaWxlZCBmb3IgZnBnYV9yZWFkXG4iKTsKKyAgICAqdmFsID0gcGFyYW1zLnZhbDsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19lcnJubyBiY21fYm9hcmRfZnBnYV9yZWdfcmVhZCh1aW50MzJfdCByZWcsIHVpbnQzMl90ICp2YWwpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICBpZiAocmVnID4gQkNNX0ZQR0FfUkVHX0hJR0gpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworCisgICAgcmMgPSBiY21fYWNjZXNzX2ZwZ2EoKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk4ocmMsIHJjLCByYyk7CisKKyAgICByZXR1cm4gYmNtX2JvYXJkX2ZwZ2FfcmVhZChyZWcsIHZhbCk7Cit9CisKK2JjbW9zX2Vycm5vIGJjbV9ib2FyZF9mcGdhX3JlZ193cml0ZSh1aW50MzJfdCByZWcsIHVpbnQzMl90IHZhbCkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIGlmIChyZWcgPiBCQ01fRlBHQV9SRUdfSElHSCkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisKKyAgICByYyA9IGJjbV9hY2Nlc3NfZnBnYSgpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTihyYywgcmMsIHJjKTsKKworICAgIHJldHVybiBiY21fYm9hcmRfZnBnYV93cml0ZShyZWcsIHZhbCk7Cit9CisKK2JjbW9zX2Vycm5vIGJjbV9ib2FyZF9mcGdhX3ZlcnNpb25fZ2V0KHVpbnQzMl90ICp2ZXJzaW9uKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgcmMgPSBiY21fYWNjZXNzX2ZwZ2EoKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk4ocmMsIHJjLCByYyk7CisKKyAgICByZXR1cm4gYmNtX2JvYXJkX2ZwZ2FfcmVhZChCQ01fRlBHQV9SRUdfRlBHQV9WRVJTSU9OLCB2ZXJzaW9uKTsKK30KKworYmNtb3NfZXJybm8gYmNtX2JvYXJkX2ZwZ2Ffc2V0X2dwaW9fZGlyKGJjbW9sdF9ncGlvX3BpbiBncGlvX3BpbiwgYmNtX2ZwZ2FfZ3Bpb19kaXIgZGlyKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIHVpbnQzMl90IGdwaW9fZGlyX21hc2s7CisKKyAgICByYyA9IGJjbV9hY2Nlc3NfZnBnYSgpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTihyYywgcmMsIHJjKTsKKworICAgIC8qIFJlYWQtbW9kaWZ5LXdyaXRlIGRpcmVjdGlvbiByZWdpc3RlciAod2UgZG9uJ3Qgd2FudCB0byBhZmZlY3Qgb3RoZXIgR1BJTydzKS4gKi8KKyAgICByYyA9IGJjbV9ib2FyZF9mcGdhX3JlYWQoQkNNX0ZQR0FfUkVHX0dQSU9fRElSLCAmZ3Bpb19kaXJfbWFzayk7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOKHJjLCByYywgcmMpOworICAgIGlmIChkaXIgPT0gQkNNX0ZQR0FfR1BJT19ESVJfSU5QVVQpCisgICAgICAgIGdwaW9fZGlyX21hc2sgJj0gfigxIDw8IChncGlvX3BpbiAtIEJDTU9MVF9HUElPX1BJTl9QSU40KSk7CisgICAgZWxzZQorICAgICAgICBncGlvX2Rpcl9tYXNrIHw9ICgxIDw8IChncGlvX3BpbiAtIEJDTU9MVF9HUElPX1BJTl9QSU40KSk7CisKKyAgICByZXR1cm4gYmNtX2JvYXJkX2ZwZ2Ffd3JpdGUoQkNNX0ZQR0FfUkVHX0dQSU9fRElSLCBncGlvX2Rpcl9tYXNrKTsKK30KKworYmNtb3NfZXJybm8gYmNtX2JvYXJkX2ZwZ2FfZ2V0X2dwaW9fZGlyKGJjbW9sdF9ncGlvX3BpbiBncGlvX3BpbiwgYmNtX2ZwZ2FfZ3Bpb19kaXIgKmRpcikKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICB1aW50MzJfdCBncGlvX2Rpcl9tYXNrOworCisgICAgcmMgPSBiY21fYWNjZXNzX2ZwZ2EoKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk4ocmMsIHJjLCByYyk7CisKKyAgICByYyA9IGJjbV9ib2FyZF9mcGdhX3JlYWQoQkNNX0ZQR0FfUkVHX0dQSU9fRElSLCAmZ3Bpb19kaXJfbWFzayk7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOKHJjLCByYywgcmMpOworCisgICAgKmRpciA9IChncGlvX2Rpcl9tYXNrICYgKDEgPDwgKGdwaW9fcGluIC0gQkNNT0xUX0dQSU9fUElOX1BJTjQpKSkgPyBCQ01fRlBHQV9HUElPX0RJUl9PVVRQVVQgOiBCQ01fRlBHQV9HUElPX0RJUl9JTlBVVDsKKworICAgIHJldHVybiByYzsKK30KKworYmNtb3NfZXJybm8gYmNtX2JvYXJkX2ZwZ2Ffd3JpdGVfZ3BpbyhiY21vbHRfZ3Bpb19waW4gZ3Bpb19waW4sIHVpbnQzMl90IHZhbCkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICB1aW50MzJfdCBncGlvX3dyaXRlX21hc2s7CisKKyAgICByYyA9IGJjbV9hY2Nlc3NfZnBnYSgpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTihyYywgcmMsIHJjKTsKKworICAgIC8qIFJlYWQtbW9kaWZ5LXdyaXRlIGRpcmVjdGlvbiByZWdpc3RlciAod2UgZG9uJ3Qgd2FudCB0byBhZmZlY3Qgb3RoZXIgR1BJTydzKS4gKi8KKyAgICByYyA9IGJjbV9ib2FyZF9mcGdhX3JlYWQoQkNNX0ZQR0FfUkVHX0dQSU9fT1VUUFVULCAmZ3Bpb193cml0ZV9tYXNrKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk4ocmMsIHJjLCByYyk7CisgICAgaWYgKCF2YWwpCisgICAgICAgIGdwaW9fd3JpdGVfbWFzayAmPSB+KDEgPDwgKGdwaW9fcGluIC0gQkNNT0xUX0dQSU9fUElOX1BJTjQpKTsKKyAgICBlbHNlCisgICAgICAgIGdwaW9fd3JpdGVfbWFzayB8PSAoMSA8PCAoZ3Bpb19waW4gLSBCQ01PTFRfR1BJT19QSU5fUElONCkpOworCisgICAgcmV0dXJuIGJjbV9ib2FyZF9mcGdhX3dyaXRlKEJDTV9GUEdBX1JFR19HUElPX09VVFBVVCwgZ3Bpb193cml0ZV9tYXNrKTsKK30KKworYmNtb3NfZXJybm8gYmNtX2JvYXJkX2ZwZ2FfcmVhZF9ncGlvKGJjbW9sdF9ncGlvX3BpbiBncGlvX3BpbiwgdWludDMyX3QgKnZhbCkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICB1aW50MzJfdCBncGlvX3JlYWRfbWFzazsKKworICAgIHJjID0gYmNtX2FjY2Vzc19mcGdhKCk7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOKHJjLCByYywgcmMpOworCisgICAgcmMgPSBiY21fYm9hcmRfZnBnYV9yZWFkKEJDTV9GUEdBX1JFR19HUElPX0lOUFVULCAmZ3Bpb19yZWFkX21hc2spOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTihyYywgcmMsIHJjKTsKKworICAgICp2YWwgPSAoZ3Bpb19yZWFkX21hc2sgJiAoMSA8PCAoZ3Bpb19waW4gLSBCQ01PTFRfR1BJT19QSU5fUElONCkpKTsKKworICAgIHJldHVybiByYzsKK30KKworYmNtb3NfZXJybm8gYmNtX2JvYXJkX2ZwZ2FfZ2VuX2dwaW9faXJxKGJjbW9sdF9leHRfaXJxIGV4dF9pcnEpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgdWludDMyX3QgZ3Bpb19pcnFfbWFzazsKKworICAgIHJjID0gYmNtX2FjY2Vzc19mcGdhKCk7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOKHJjLCByYywgcmMpOworCisgICAgLyogUmVhZC1tb2RpZnktd3JpdGUgZGlyZWN0aW9uIHJlZ2lzdGVyICh3ZSBkb24ndCB3YW50IHRvIGFmZmVjdCBvdGhlciBHUElPJ3MpLiAqLworICAgIHJjID0gYmNtX2JvYXJkX2ZwZ2FfcmVhZChCQ01fRlBHQV9SRUdfR1BJT19JUlEsICZncGlvX2lycV9tYXNrKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk4ocmMsIHJjLCByYyk7CisKKyAgICBncGlvX2lycV9tYXNrIHw9ICgxIDw8IGV4dF9pcnEpOworICAgIHJjID0gYmNtX2JvYXJkX2ZwZ2Ffd3JpdGUoQkNNX0ZQR0FfUkVHX0dQSU9fSVJRLCBncGlvX2lycV9tYXNrKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk4ocmMsIHJjLCByYyk7CisKKyAgICBiY21vc191c2xlZXAoMTAwMCk7CisKKyAgICBncGlvX2lycV9tYXNrICY9IH4oMSA8PCBleHRfaXJxKTsKKyAgICByYyA9IGJjbV9ib2FyZF9mcGdhX3dyaXRlKEJDTV9GUEdBX1JFR19HUElPX0lSUSwgZ3Bpb19pcnFfbWFzayk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKK2JjbW9zX2Vycm5vIGJjbV9ib2FyZF90cnhfcHJlc2VudCh1aW50OF90IHBvbikKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICB1aW50MzJfdCB0cnhfYWJzZW5jZV9tYXNrOworCisgICAgcmMgPSBiY21fYWNjZXNzX2ZwZ2EoKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk4ocmMsIHJjLCByYyk7CisKKyAgICAvKiBDaGVjayB0aGF0IHRoZSB0cmFuc2NlaXZlciBpcyBwcmVzZW50IChwbHVnZ2VkIGluKS4gRm9yIE9OVSBzaW11bGF0b3IsIHdlIGFsbG93IHdvcmtpbmcgd2l0aG91dCB0cmFuc2NlaXZlcnMuICovCisgICAgcmMgPSBiY21fYm9hcmRfZnBnYV9yZWFkKEJDTV9GUEdBX1JFR19UUlhfSVNfUFJFU0VOVCwgJnRyeF9hYnNlbmNlX21hc2spOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTihyYywgcmMsIHJjKTsKKworICAgIGlmICh0cnhfYWJzZW5jZV9tYXNrICYgKDEgPDwgcG9uKSkKKyAgICB7CisgICAgICAgIC8qIFRoZSB0cmFuc2NlaXZlciBpcyBhYnNlbnQuICovCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PREVWOworICAgIH0KKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtX2JvYXJkX3RyeF9lbmFibGUodWludDhfdCBwb24sIGJjbW9zX2Jvb2wgaXNfZW5hYmxlZCkKK3sKKyNpZmRlZiBDT05GSUdfT05VX1NJTQorICAgIHN0YXRpYyB1aW50MzJfdCB0cnhfZGlzYWJsZV9tYXNrID0gMHhGRkZGRkZGRjsKKworICAgIC8qIEtlZXAgdHJhY2sgb2Ygd2hpY2ggVFJYcyBhcmUgbG9naWNhbGx5IGVuYWJsZWQuICovCisgICAgaWYgKGlzX2VuYWJsZWQpCisgICAgICAgIHRyeF9kaXNhYmxlX21hc2sgJj0gfigxIDw8IHBvbik7CisgICAgZWxzZQorICAgICAgICB0cnhfZGlzYWJsZV9tYXNrIHw9ICgxIDw8IHBvbik7CisKKyAgICByZXR1cm4gYmNtX2JvYXJkX2hvc3RfZXZlbnRfd3JpdGUodHJ4X2Rpc2FibGVfbWFzayk7CisjZWxzZQorICAgIHVpbnQzMl90IHRyeF9kaXNhYmxlX21hc2s7CisgICAgdWludDMyX3QgdHJ4X2Fic2VuY2VfbWFzazsKKworICAgIGJjbW9zX2Vycm5vIHJjID0gYmNtX2FjY2Vzc19mcGdhKCk7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOKHJjLCByYywgcmMpOworCisgICAgLyogQ2hlY2sgdGhhdCB0aGUgdHJhbnNjZWl2ZXIgaXMgcHJlc2VudCAocGx1Z2dlZCBpbikuICovCisgICAgcmMgPSBiY21fYm9hcmRfZnBnYV9yZWFkKEJDTV9GUEdBX1JFR19UUlhfSVNfUFJFU0VOVCwgJnRyeF9hYnNlbmNlX21hc2spOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTihyYywgcmMsIHJjKTsKKyAgICBpZiAodHJ4X2Fic2VuY2VfbWFzayAmICgxIDw8IHBvbikpCisgICAgeworICAgICAgICAvKiBUaGUgdHJhbnNjZWl2ZXIgaXMgYWJzZW50LiAqLworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT0RFVjsKKyAgICB9CisKKyAgICAvKiBSZWFkLW1vZGlmeS13cml0ZSB0cmFuc2NlaXZlciBkaXNhYmxlIG1hc2sgKHdlIGRvbid0IHdhbnQgdG8gYWZmZWN0IG90aGVyIFBPTidzKS4gKi8KKyAgICByYyA9IGJjbV9ib2FyZF9mcGdhX3JlYWQoQkNNX0ZQR0FfUkVHX1RSWF9FTkFCTEUsICZ0cnhfZGlzYWJsZV9tYXNrKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk4ocmMsIHJjLCByYyk7CisgICAgaWYgKGlzX2VuYWJsZWQgPT0gQkNNT1NfVFJVRSkKKyAgICAgICAgdHJ4X2Rpc2FibGVfbWFzayAmPSB+KDEgPDwgcG9uKTsKKyAgICBlbHNlCisgICAgICAgIHRyeF9kaXNhYmxlX21hc2sgfD0gKDEgPDwgcG9uKTsKKworICAgIHJjID0gYmNtX2JvYXJkX2ZwZ2Ffd3JpdGUoQkNNX0ZQR0FfUkVHX1RSWF9FTkFCTEUsIHRyeF9kaXNhYmxlX21hc2spOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICByZXR1cm4gYmNtX2JvYXJkX2hvc3RfZXZlbnRfd3JpdGUodHJ4X2Rpc2FibGVfbWFzayk7CisjZW5kaWYKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbV9ib2FyZF9jb25maWdfcmVzZXRfdmFsdWUodWludDMyX3QgcnN0X2JpdCwgYmNtb3NfYm9vbCBpc19vbikKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICB1aW50MzJfdCByZXNldF92YWx1ZXM7CisKKyAgICByYyA9IGJjbV9hY2Nlc3NfZnBnYSgpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTihyYywgcmMsIHJjKTsKKworICAgIC8qIFJlYWQtbW9kaWZ5LXdyaXRlIHNvIHdlIGNhbiBzZXQgb25seSB0aGUgcmVsZXZhbnQgYml0IHRvIDAgKi8KKyAgICByYyA9IGJjbV9ib2FyZF9mcGdhX3JlYWQoQkNNX0ZQR0FfUkVHX1JFU0VUUywgJnJlc2V0X3ZhbHVlcyk7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOKHJjLCByYywgcmMpOworCisgICAgaWYgKGlzX29uID09IEJDTU9TX1RSVUUpCisgICAgICAgIHJlc2V0X3ZhbHVlcyB8PSAxIDw8IHJzdF9iaXQ7CisgICAgZWxzZQorICAgICAgICByZXNldF92YWx1ZXMgJj0gfigxIDw8IHJzdF9iaXQpOworCisgICAgcmV0dXJuIGJjbV9ib2FyZF9mcGdhX3dyaXRlKEJDTV9GUEdBX1JFR19SRVNFVFMsIHJlc2V0X3ZhbHVlcyk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBkZXZpY2VfZGlzY29ubmVjdCh2b2lkKQoreworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGtleSA9IHt9OworICAgIGJjbW9sdF9kZXZpY2VfY2ZnIGRldl9jZmc7CisgICAgYmNtb2x0X2RldmljZV9kaXNjb25uZWN0IGRldl9kaXNjb25uZWN0OworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgQkNNT0xUX0NGR19JTklUKCZkZXZfY2ZnLCBkZXZpY2UsIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmZGV2X2NmZywgZGV2aWNlLCBzdGF0ZSk7CisgICAgcmMgPSBiY21vbHRfY2ZnX2dldCgwLCAmZGV2X2NmZy5oZHIpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTihyYywgcmMsIHJjKTsKKyAgICBpZiAoZGV2X2NmZy5kYXRhLnN0YXRlICE9IEJDTU9MVF9ERVZJQ0VfU1RBVEVfRElTQ09OTkVDVEVEKQorICAgIHsKKyAgICAgICAgQkNNT0xUX09QRVJfSU5JVCgmZGV2X2Rpc2Nvbm5lY3QsIGRldmljZSwgZGlzY29ubmVjdCwga2V5KTsKKyAgICAgICAgcmV0dXJuIGJjbW9sdF9vcGVyX3N1Ym1pdCgwLCAmZGV2X2Rpc2Nvbm5lY3QuaGRyKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtX2JvYXJkX2RldmljZV9yZXNldCh2b2lkKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgcmMgPSBkZXZpY2VfZGlzY29ubmVjdCgpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTihyYywgcmMsIHJjKTsKKyAgICByYyA9IGJjbV9ib2FyZF9jb25maWdfcmVzZXRfdmFsdWUoQkNNX1JTVF9CSVRfREVWSUNFLCBCQ01PU19GQUxTRSk7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOKHJjLCByYywgcmMpOworCisgICAgcmV0dXJuIGJjbV9ib2FyZF9jb25maWdfcmVzZXRfdmFsdWUoQkNNX1JTVF9CSVRfREVWSUNFLCBCQ01PU19UUlVFKTsKK30KKworLyogRGV2aWNlIG9uIGtlZXBzIHRoZSByZXNldCBiaXQgb24gYWN0aXZlIGhpZ2ggKi8KK2JjbW9zX2Vycm5vIGJjbV9ib2FyZF9kZXZpY2Vfb24odm9pZCkKK3sKKyAgICByZXR1cm4gYmNtX2JvYXJkX2NvbmZpZ19yZXNldF92YWx1ZShCQ01fUlNUX0JJVF9ERVZJQ0UsIEJDTU9TX1RSVUUpOworfQorCisvKiBEZXZpY2Ugb2ZmIGtlZXBzIHRoZSByZXNldCBiaXQgb24gYWN0aXZlIGxvdyAqLworYmNtb3NfZXJybm8gYmNtX2JvYXJkX2RldmljZV9vZmYodm9pZCkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIHJjID0gZGV2aWNlX2Rpc2Nvbm5lY3QoKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk4ocmMsIHJjLCByYyk7CisKKyAgICByZXR1cm4gYmNtX2JvYXJkX2NvbmZpZ19yZXNldF92YWx1ZShCQ01fUlNUX0JJVF9ERVZJQ0UsIEJDTU9TX0ZBTFNFKTsKK30KKworLyogS2F0YW5hMiBEZXZpY2Ugb24ga2VlcHMgdGhlIHJlc2V0IGJpdCBvbiBhY3RpdmUgaGlnaCAqLworYmNtb3NfZXJybm8gYmNtX2JvYXJkX2t0Ml9kZXZpY2Vfb24odm9pZCkKK3sKKyAgICAvKiB0YWtlIHRoZSBLVDIgb3V0IG9mIHJlc2V0ICovCisgICAgcmV0dXJuIGJjbV9ib2FyZF9jb25maWdfcmVzZXRfdmFsdWUoQkNNX1JTVF9CSVRfS1QyLCBCQ01PU19UUlVFKTsKK30KKworLyogRGV2aWNlIG9mZiBrZWVwcyB0aGUgcmVzZXQgYml0IG9uIGFjdGl2ZSBsb3cgKi8KK2JjbW9zX2Vycm5vIGJjbV9ib2FyZF9rdDJfZGV2aWNlX29mZih2b2lkKQoreworICAgIHJldHVybiBiY21fYm9hcmRfY29uZmlnX3Jlc2V0X3ZhbHVlKEJDTV9SU1RfQklUX0tUMiwgQkNNT1NfRkFMU0UpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtX2FjY2Vzc19kcGxsKHZvaWQpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICBpZiAoYmNtX2JvYXJkX2lzX3N2azQoKSkKKyAgICB7CisgICAgICAgIHJjID0gYmNtX2JvYXJkX2Rldl9jaGFuZ2UoSTJDX1NXMV9JMkNfQUREUik7CisgICAgICAgIEJDTU9TX1RSQUNFX0NIRUNLX1JFVFVSTihyYywgcmMsICJiY21fYm9hcmRfZGV2X2NoYW5nZShJMkNfU1cxX0kyQ19BRERSKSBmYWlsZWRcbiIpOworICAgICAgICByYyA9IGJjbV9ib2FyZF9zd2l0Y2hfd3JpdGUoMHgyMCk7CisgICAgICAgIEJDTU9TX1RSQUNFX0NIRUNLX1JFVFVSTihyYywgcmMsICJiY21fYm9hcmRfc3dpdGNoX3dyaXRlKDB4MjApIGZhaWxlZFxuIik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJjID0gYmNtX2JvYXJkX2Rldl9jaGFuZ2UoSTJDX1NXMF9JMkNfQUREUik7CisgICAgICAgIEJDTU9TX1RSQUNFX0NIRUNLX1JFVFVSTihyYywgcmMsICJiY21fYm9hcmRfZGV2X2NoYW5nZShJMkNfU1cwX0kyQ19BRERSKSBmYWlsZWRcbiIpOworICAgICAgICByYyA9IGJjbV9ib2FyZF9zd2l0Y2hfd3JpdGUoMik7CisgICAgICAgIEJDTU9TX1RSQUNFX0NIRUNLX1JFVFVSTihyYywgcmMsICJiY21fYm9hcmRfc3dpdGNoX3dyaXRlKDIpIGZhaWxlZFxuIik7CisgICAgfQorCisgICAgcmMgPSBiY21fYm9hcmRfZGV2X2NoYW5nZShQT05fRFBMTF9JMkNfQUREUik7CisgICAgQkNNT1NfVFJBQ0VfQ0hFQ0tfUkVUVVJOKHJjLCByYywgImJjbV9ib2FyZF9kZXZfY2hhbmdlKFBPTl9EUExMX0kyQ19BRERSKSBmYWlsZWQgXG4iKTsKKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGludCBiY21fYm9hcmRfc2V0X3BhZ2VfZHBsbCh1aW50MzJfdCBwYWdlKQoreworICAgIGludCByY2lvY3RsOworICAgIG1hcGxlX2kyY19pb2N0bF9wYXJhbSBwYXJhbXMgPQorICAgIHsKKyAgICAgICAgLmNvdW50ID0gOCwKKyAgICAgICAgLmFkZHIgPSAxLAorICAgICAgICAudmFsID0gcGFnZSwKKyAgICB9OworCisgICAgcmNpb2N0bCA9IGlvY3RsKG1hcGxlX2kyY19mZCwgTUFQTEVfSTJDX0lPQ1RMX09QX0RFVl9XUklURSwgJnBhcmFtcyk7CisgICAgQkNNT1NfVFJBQ0VfQ0hFQ0tfUkVUVVJOKHJjaW9jdGwsIEJDTV9FUlJfSU5URVJOQUwsICJpb2N0bCB3cml0ZSBjaGFuZ2UgcGFnZSBmYWlsZWRcbiIpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIGJjbV9ib2FyZF9yZWFkX2RwbGwodWludDMyX3QgcGFnZSwgdWludDMyX3QgcmVnLCB1aW50MzJfdCAqdmFsKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGludCByY2lvY3RsOworICAgIG1hcGxlX2kyY19pb2N0bF9wYXJhbSBwYXJhbXMgPQorICAgIHsKKyAgICAgICAgLmNvdW50ID0gOCwKKyAgICAgICAgLmFkZHIgPSByZWcsCisgICAgICAgIC52YWwgPSAwLAorICAgIH07CisKKyAgICByYyA9IGJjbV9hY2Nlc3NfZHBsbCgpOworICAgIGJjbV9ib2FyZF9zZXRfcGFnZV9kcGxsKHBhZ2UpOworICAgIHJjaW9jdGwgPSBpb2N0bChtYXBsZV9pMmNfZmQsIE1BUExFX0kyQ19JT0NUTF9PUF9ERVZfUkVBRCwgJnBhcmFtcyk7CisgICAgQkNNT1NfVFJBQ0VfQ0hFQ0tfUkVUVVJOKHJjaW9jdGwsIEJDTV9FUlJfSU5URVJOQUwsICJpb2N0bCByZWFkIGZhaWxlZCBmb3IgbWFwbGVfaTJjX2ZkXG4iKTsKKyAgICAqdmFsID0gcGFyYW1zLnZhbDsKKworICAgIHJldHVybiByYzsKK30KKworYmNtb3NfZXJybm8gYmNtX2JvYXJkX3dyaXRlX2RwbGwodWludDMyX3QgcGFnZSwgdWludDMyX3QgcmVnLCB1aW50MzJfdCB2YWwpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgaW50IHJjaW9jdGw7CisgICAgbWFwbGVfaTJjX2lvY3RsX3BhcmFtIHBhcmFtcyA9CisgICAgeworICAgICAgICAuY291bnQgPSA4LAorICAgICAgICAuYWRkciA9IHJlZywKKyAgICAgICAgLnZhbCA9IHZhbCwKKyAgICB9OworCisgICAgcmMgPSBiY21fYWNjZXNzX2RwbGwoKTsKKyAgICBiY21fYm9hcmRfc2V0X3BhZ2VfZHBsbChwYWdlKTsKKyAgICByY2lvY3RsID0gaW9jdGwobWFwbGVfaTJjX2ZkLCBNQVBMRV9JMkNfSU9DVExfT1BfREVWX1dSSVRFLCAmcGFyYW1zKTsKKyAgICBCQ01PU19UUkFDRV9DSEVDS19SRVRVUk4ocmNpb2N0bCwgQkNNX0VSUl9JTlRFUk5BTCwgImlvY3RsIHdyaXRlIGZhaWxlZCBmb3IgbWFwbGVfaTJjX2ZkXG4iKTsKKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbV9ib2FyZF9sb2FkX2RwbGwoZHBsbF9jb21tYW5kICpjb21tYW5kcywgaW50IGNtZGxlbikKK3sKKyAgICBpbnQgcmNpb2N0bCxpOworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIHVpbnQ4X3QgcHJldmlvdXNfcGFnZSA9IDA7CisKKyAgICBtYXBsZV9pMmNfaW9jdGxfcGFyYW0gcGFyYW1zID0KKyAgICB7CisgICAgICAgIC5jb3VudCA9IDgsCisgICAgICAgIC5hZGRyID0gMCwKKyAgICAgICAgLnZhbCA9IDAsCisgICAgfTsKKworICAgIHJjID0gYmNtX2FjY2Vzc19kcGxsKCk7CisgICAgZm9yIChpPTA7IGkgPCBjbWRsZW47IGkrKykKKyAgICB7CisgICAgICAgIGlmIChjb21tYW5kc1tpXS5wYWdlICE9IHByZXZpb3VzX3BhZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbV9ib2FyZF9zZXRfcGFnZV9kcGxsKGNvbW1hbmRzW2ldLnBhZ2UpOworICAgICAgICAgICAgcHJldmlvdXNfcGFnZSA9IGNvbW1hbmRzW2ldLnBhZ2U7CisgICAgICAgIH0KKyAgICAgICAgcGFyYW1zLmFkZHIgPSBjb21tYW5kc1tpXS5yZWc7CisgICAgICAgIHBhcmFtcy52YWwgPSBjb21tYW5kc1tpXS5kYXRhOworICAgICAgICByY2lvY3RsID0gaW9jdGwobWFwbGVfaTJjX2ZkLCBNQVBMRV9JMkNfSU9DVExfT1BfREVWX1dSSVRFLCAmcGFyYW1zKTsKKyAgICAgICAgQkNNT1NfVFJBQ0VfQ0hFQ0tfUkVUVVJOKHJjaW9jdGwsIEJDTV9FUlJfSU5URVJOQUwsICJpb2N0bCB3cml0ZSBkYXRhIHBhZ2UgZmFpbGVkXG4iKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorYmNtb3NfZXJybm8gYmNtX2JvYXJkX2J1cm5fcG9uX2RwbGwoYmNtX2RwbGxfdXNlcnMgZHBsbF9kZXYpCit7CisgICAgc3dpdGNoKGRwbGxfZGV2KQorICAgIHsKKyAgICAgICAgY2FzZSBHUE9OX0RQTEw6CisgICAgICAgICAgICByZXR1cm4gYmNtX2JvYXJkX2xvYWRfZHBsbChncG9uX2RwbGxfdGFibGUsc2l6ZW9mKGdwb25fZHBsbF90YWJsZSkvc2l6ZW9mKGRwbGxfY29tbWFuZCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRVBPTl9EUExMOgorICAgICAgICAgICAgcmV0dXJuIGJjbV9ib2FyZF9sb2FkX2RwbGwoZXBvbl9kcGxsX3RhYmxlLHNpemVvZihlcG9uX2RwbGxfdGFibGUpL3NpemVvZihkcGxsX2NvbW1hbmQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdQT05fU1lOQ0U6CisgICAgICAgICAgICByZXR1cm4gYmNtX2JvYXJkX2xvYWRfZHBsbChncG9uX3N5bmNlX2RwbGxfdGFibGUsc2l6ZW9mKGdwb25fc3luY2VfZHBsbF90YWJsZSkvc2l6ZW9mKGRwbGxfY29tbWFuZCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworfQorCitiY21vc19lcnJubyBiY21fYm9hcmRfaW5pdCh2b2lkKQoreworICAgIG1hcGxlX2Rldl9jdHJsX2ZkID0gb3BlbigiL2Rldi9tYXBsZV9kZXZfY3RybCIsIE9fUkRXUik7CisgICAgQkNNT1NfVFJBQ0VfQ0hFQ0tfUkVUVVJOKG1hcGxlX2Rldl9jdHJsX2ZkIDwgMCwgZXJybm8sICJtYXBsZV9kZXZfY3RybF9mZCBvcGVuIGZhaWxlZFxuIik7CisKKyAgICBtYXBsZV9pMmNfZmQgPSBvcGVuKCIvZGV2L21hcGxlX2kyYyIsIE9fUkRXUik7CisgICAgQkNNT1NfVFJBQ0VfQ0hFQ0tfUkVUVVJOKG1hcGxlX2kyY19mZCA8IDAsIGVycm5vLCAibWFwbGVfaTJjX2ZkIG9wZW4gZmFpbGVkXG4iKTsKKworI2lmZGVmIENPTkZJR19PTlVfU0lNCisgICAgLyogSWYgdGhlIE9OVSBzaW0gaXMgcnVubmluZywgYWx3YXlzIGxlYXZlIGFsbCB0cmFuc2NlaXZlcnMgcGh5c2ljYWxseSBkaXNhYmxlZC4gKi8KKyAgICBiY21vc19lcnJubyByYyA9IGJjbV9hY2Nlc3NfZnBnYSgpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTihyYywgcmMsIHJjKTsKKyAgICByYyA9IGJjbV9ib2FyZF9mcGdhX3dyaXRlKEJDTV9GUEdBX1JFR19UUlhfRU5BQkxFLCAweEZGRkZGRkZGKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7CisjZW5kaWYKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19lcnJubyBiY21fYm9hcmRfZ2V0X2JvYXJkX2lkKGJjbV9ib2FyZF9zdmtfYm9hcmRfaWQgKiBib2FyZF9pZCkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICB1aW50MzJfdCB2YWw7CisKKyAgICByYyA9IGJjbV9hY2Nlc3NfZnBnYSgpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTihyYywgcmMsIHJjKTsKKworICAgIHJjID0gYmNtX2JvYXJkX2ZwZ2FfcmVhZCgweDEsICZ2YWwpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTihyYywgcmMsIHJjKTsKKworICAgICpib2FyZF9pZCA9IHZhbCAmIDB4NzsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKwordm9pZCBiY21fYm9hcmRfdW5pbml0KHZvaWQpCit7CisgICAgY2xvc2UobWFwbGVfaTJjX2ZkKTsKKyAgICBtYXBsZV9pMmNfZmQgPSAwOworCisgICAgY2xvc2UobWFwbGVfZGV2X2N0cmxfZmQpOworICAgIG1hcGxlX2Rldl9jdHJsX2ZkID0gLTE7Cit9CisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvYm9hcmQvd3J4L2JjbW9sdF9ib2FyZC5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9ib2FyZC93cngvYmNtb2x0X2JvYXJkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E1OGViYQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvYm9hcmQvd3J4L2JjbW9sdF9ib2FyZC5oCkBAIC0wLDAgKzEsMTAwIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworI2lmbmRlZiBfQkNNT0xUX0JPQVJEX0hfCisjZGVmaW5lIF9CQ01PTFRfQk9BUkRfSF8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbW9sdF9tb2RlbF90eXBlcy5oPgorCit0eXBlZGVmIGVudW0KK3sKKyAgICBTVktfMSAgICA9IDB4NywgLyogU1ZLICMxIC0gQkNNOTY4NjIwUzogYWxsIFBPTiBmbGF2b3JzIHN1cHBvcnRlZCwgU0ZQKyAqLworICAgIFNWS18yX1hHID0gMHg2LCAvKiBTVksgIzIgLSBCQ005Njg2MjBYRzogWEdQT04gKi8KKyAgICBTVktfMl9YRSA9IDB4NSwgLyogU1ZLICMyIC0gQkNNOTY4NjIwWEU6IDEwRyBFUE9OICovCisgICAgU1ZLXzMgICAgPSAweDQsIC8qIFNWSyAjMyAtIEJDTTk2ODYyMEs6IGFsbCBQT04gZmxhdm9ycyBzdXBwb3J0ZWQsIFhGUCAqLworfSBiY21fYm9hcmRfc3ZrX2JvYXJkX2lkOworCitiY21vc19lcnJubyBiY21fYm9hcmRfZGV2X2NoYW5nZSh1aW50MzJfdCBhZGRyKTsKK2JjbW9zX2Vycm5vIGJjbV9ib2FyZF9kZXZfd3JpdGUodWludDMyX3QgY291bnQsIHVpbnQzMl90IGFkZHIsIHVpbnQzMl90IHZhbCk7CitiY21vc19lcnJubyBiY21fYm9hcmRfZGV2X3JlYWQodWludDMyX3QgY291bnQsIHVpbnQzMl90IGFkZHIsIHVpbnQzMl90ICp2YWwpOworYmNtb3NfZXJybm8gYmNtX2JvYXJkX3N3aXRjaF93cml0ZSh1aW50MzJfdCB2YWwpOworYmNtb3NfZXJybm8gYmNtX2JvYXJkX3N3aXRjaF9yZWFkKHVpbnQzMl90ICp2YWwpOworYmNtb3NfZXJybm8gYmNtX2JvYXJkX2ZwZ2Ffd3JpdGUodWludDMyX3QgYWRkciwgdWludDMyX3QgdmFsKTsKK2JjbW9zX2Vycm5vIGJjbV9ib2FyZF9mcGdhX3JlYWQodWludDMyX3QgYWRkciwgdWludDMyX3QgKnZhbCk7CitiY21vc19lcnJubyBiY21fYm9hcmRfaG9zdF9ldmVudF93cml0ZSh1aW50MzJfdCB2YWwpOworCitiY21vc19lcnJubyBiY21fYm9hcmRfZnBnYV92ZXJzaW9uX2dldCh1aW50MzJfdCAqdmVyc2lvbik7CisKKy8qIEZQR0EgR1BJTyBhY2Nlc3MgKi8KK3R5cGVkZWYgZW51bQoreworICAgIEJDTV9GUEdBX0dQSU9fRElSX0lOUFVULAorICAgIEJDTV9GUEdBX0dQSU9fRElSX09VVFBVVCwKK30gYmNtX2ZwZ2FfZ3Bpb19kaXI7CisKK3R5cGVkZWYgZW51bQoreworICAgIEdQT05fRFBMTCwKKyAgICBFUE9OX0RQTEwsCisgICAgR1BPTl9TWU5DRQorfSBiY21fZHBsbF91c2VyczsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50OF90ICBwYWdlOworICAgIHVpbnQ4X3QgIHJlZzsKKyAgICB1aW50OF90ICBkYXRhOworfSBkcGxsX2NvbW1hbmQ7CisKK2JjbW9zX2Vycm5vIGJjbV9ib2FyZF9mcGdhX3NldF9ncGlvX2RpcihiY21vbHRfZ3Bpb19waW4gZ3Bpb19waW4sIGJjbV9mcGdhX2dwaW9fZGlyIGRpcik7CitiY21vc19lcnJubyBiY21fYm9hcmRfZnBnYV9nZXRfZ3Bpb19kaXIoYmNtb2x0X2dwaW9fcGluIGdwaW9fcGluLCBiY21fZnBnYV9ncGlvX2RpciAqZGlyKTsKK2JjbW9zX2Vycm5vIGJjbV9ib2FyZF9mcGdhX3dyaXRlX2dwaW8oYmNtb2x0X2dwaW9fcGluIGdwaW9fcGluLCB1aW50MzJfdCB2YWwpOworYmNtb3NfZXJybm8gYmNtX2JvYXJkX2ZwZ2FfcmVhZF9ncGlvKGJjbW9sdF9ncGlvX3BpbiBncGlvX3BpbiwgdWludDMyX3QgKnZhbCk7CitiY21vc19lcnJubyBiY21fYm9hcmRfZnBnYV9nZW5fZ3Bpb19pcnEoYmNtb2x0X2V4dF9pcnEgZXh0X2lycSk7CisKK2JjbW9zX2Vycm5vIGJjbV9ib2FyZF90cnhfZW5hYmxlKHVpbnQ4X3QgcG9uLCBiY21vc19ib29sIGlzX2VuYWJsZWQpOworYmNtb3NfZXJybm8gYmNtX2JvYXJkX3RyeF9wcmVzZW50KHVpbnQ4X3QgcG9uKTsKK2JjbW9zX2Vycm5vIGJjbV9ib2FyZF9kZXZpY2VfcmVzZXQodm9pZCk7CitiY21vc19lcnJubyBiY21fYm9hcmRfZGV2aWNlX29uKHZvaWQpOworYmNtb3NfZXJybm8gYmNtX2JvYXJkX2RldmljZV9vZmYodm9pZCk7CitiY21vc19lcnJubyBiY21fYm9hcmRfa3QyX2RldmljZV9vbih2b2lkKTsKK2JjbW9zX2Vycm5vIGJjbV9ib2FyZF9rdDJfZGV2aWNlX29mZih2b2lkKTsKK2JjbW9zX2Vycm5vIGJjbV9ib2FyZF9nZXRfYm9hcmRfaWQoYmNtX2JvYXJkX3N2a19ib2FyZF9pZCAqIGJvYXJkX2lkKTsKK2JjbW9zX2Vycm5vIGJjbV9ib2FyZF9mcGdhX3JlZ19yZWFkKHVpbnQzMl90IHJlZywgdWludDMyX3QgKnZhbCk7CitiY21vc19lcnJubyBiY21fYm9hcmRfZnBnYV9yZWdfd3JpdGUodWludDMyX3QgcmVnLCB1aW50MzJfdCB2YWwpOworYmNtb3NfZXJybm8gYmNtX2JvYXJkX3BjaV9kZWJ1Zyh1aW50MzJfdCBkZXZpY2UsIHVpbnQzMl90IGNvbW1hbmQsIGludDMyX3Qgc3RhcnQsIGludDMyX3QgaG93bWFueSwgdWludDMyX3QgKmR1bXBwdHIpOworYmNtb3NfZXJybm8gYmNtX2JvYXJkX2J1cm5fcG9uX2RwbGwoYmNtX2RwbGxfdXNlcnMgZHBsbF9kZXYpOworYmNtb3NfZXJybm8gYmNtX2JvYXJkX3dyaXRlX2RwbGwodWludDMyX3QgcGFnZSwgdWludDMyX3QgcmVnLCB1aW50MzJfdCB2YWwpOworYmNtb3NfZXJybm8gYmNtX2JvYXJkX3JlYWRfZHBsbCh1aW50MzJfdCBwYWdlLCB1aW50MzJfdCByZWcsIHVpbnQzMl90ICp2YWwpOworCitiY21vc19lcnJubyBiY21fYm9hcmRfaW5pdCh2b2lkKTsKK3ZvaWQgYmNtX2JvYXJkX3VuaW5pdCh2b2lkKTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvYm9hcmQvd3J4L2JjbW9sdF9ib2FyZF9jbGkuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvYm9hcmQvd3J4L2JjbW9sdF9ib2FyZF9jbGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2I1OWZhCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9ib2FyZC93cngvYmNtb2x0X2JvYXJkX2NsaS5jCkBAIC0wLDAgKzEsNTgxIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaW5jbHVkZSA8YmNtY2xpLmg+CisjaW5jbHVkZSAiYmNtb2x0X2JvYXJkLmgiCisjaW5jbHVkZSAiYmNtb2x0X2JvYXJkX2NsaS5oIgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjZGVmaW5lIEJDTV9JMkNfREVWX0FERFJfU1RBUlQgc3RhdGljIGJjbWNsaV9lbnVtX3ZhbCBiY21faTJjX2Rldl9hZGRyX3RhYmxlW10gPSB7CisjZGVmaW5lIEJDTV9JMkNfREVWX0FERFIobmFtZSwgZGVzYywgdmFsKSB7ZGVzYywgdmFsfSwKKyNkZWZpbmUgQkNNX0kyQ19ERVZfQUREUl9FTkQgQkNNQ0xJX0VOVU1fTEFTVH07CisjaW5jbHVkZSA8YmNtb2x0X2kyY19kZXZzX2FkZHIuaD4KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbV9ib2FyZF9jbGlfZGV2X2NoYW5nZShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICB1aW50MzJfdCBhZGRyID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGV2IiktPnZhbHVlLnVudW1iZXI7CisKKyAgICByZXR1cm4gYmNtX2JvYXJkX2Rldl9jaGFuZ2UoYWRkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21fYm9hcmRfY2xpX2Rldl93cml0ZShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIndpZHRoIiktPnZhbHVlLnVudW1iZXI7CisgICAgdWludDMyX3QgYWRkciA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFkZHIiKS0+dmFsdWUudW51bWJlcjsKKyAgICB1aW50MzJfdCB2YWwgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ2YWwiKS0+dmFsdWUudW51bWJlcjsKKworICAgIHN3aXRjaCAoY291bnQpCisgICAgeworICAgIGNhc2UgODoKKyAgICBjYXNlIDE2OgorICAgIGNhc2UgMzI6CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJDb3VudCBjYW4gYmUgOHwxNnwzMlxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorICAgIHJldHVybiBiY21fYm9hcmRfZGV2X3dyaXRlKGNvdW50LCBhZGRyLCB2YWwpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtX2JvYXJkX2NsaV9kZXZfcmVhZChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIndpZHRoIiktPnZhbHVlLnVudW1iZXI7CisgICAgdWludDMyX3QgYWRkciA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFkZHIiKS0+dmFsdWUudW51bWJlcjsKKyAgICB1aW50MzJfdCB2YWw7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgCisgICAgc3dpdGNoIChjb3VudCkKKyAgICB7CisgICAgY2FzZSA4OgorICAgIGNhc2UgMTY6CisgICAgY2FzZSAzMjoKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIkNvdW50IGNhbiBiZSA4fDE2fDMyXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgcmMgPSBiY21fYm9hcmRfZGV2X3JlYWQoY291bnQsIGFkZHIsICZ2YWwpOworICAgIEJDTU9TX1RSQUNFX0NIRUNLX1JFVFVSTihyYywgcmMsICJiY21fYm9hcmRfZGV2X3JlYWQoKSBmYWlsZWRcbiIpOworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIweCV4XG4iLCB2YWwpOworICAgIAorICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtX2JvYXJkX2NsaV9zd2l0Y2hfd3JpdGUoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgdWludDMyX3QgdmFsID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidmFsIiktPnZhbHVlLnVudW1iZXI7CisKKyAgICByZXR1cm4gYmNtX2JvYXJkX3N3aXRjaF93cml0ZSh2YWwpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtX2JvYXJkX2NsaV9zd2l0Y2hfcmVhZChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICB1aW50MzJfdCB2YWw7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICByYyA9IGJjbV9ib2FyZF9zd2l0Y2hfcmVhZCgmdmFsKTsKKyAgICBCQ01PU19UUkFDRV9DSEVDS19SRVRVUk4ocmMsIHJjLCAiYmNtX2JvYXJkX3N3aXRjaF9yZWFkKCkgZmFpbGVkXG4iKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiMHgleFxuIiwgdmFsKTsKKyAgICAKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbV9ib2FyZF9jbGlfZnBnYV93cml0ZShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICB1aW50MzJfdCBhZGRyID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWRkciIpLT52YWx1ZS51bnVtYmVyOworICAgIHVpbnQzMl90IHZhbCA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInZhbCIpLT52YWx1ZS51bnVtYmVyOworICAgIAorICAgIHJldHVybiBiY21fYm9hcmRfZnBnYV93cml0ZShhZGRyLCB2YWwpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtX2JvYXJkX2NsaV9mcGdhX3JlYWQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgdWludDMyX3QgYWRkciA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFkZHIiKS0+dmFsdWUudW51bWJlcjsKKyAgICB1aW50MzJfdCB2YWw7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgCisgICAgcmMgPSBiY21fYm9hcmRfZnBnYV9yZWFkKGFkZHIsICZ2YWwpOworICAgIEJDTU9TX1RSQUNFX0NIRUNLX1JFVFVSTihyYywgcmMsICJiY21fYm9hcmRfZnBnYV9yZWFkKCkgZmFpbGVkXG4iKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiMHgleFxuIiwgdmFsKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtX2JvYXJkX2NsaV9mcGdhX3ZlcnNpb24oYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgdWludDMyX3QgdmVyc2lvbjsKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIHJjID0gYmNtX2JvYXJkX2ZwZ2FfdmVyc2lvbl9nZXQoJnZlcnNpb24pOworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIweCV4XG4iLCB2ZXJzaW9uKTsKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21fYm9hcmRfY2xpX2ZwZ2Ffc2V0X2dwaW9fZGlyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGJjbW9sdF9ncGlvX3BpbiBncGlvX3BpbiA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdwaW9fcGluIiktPnZhbHVlLnVudW1iZXI7CisgICAgYmNtX2ZwZ2FfZ3Bpb19kaXIgZGlyID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGlyIiktPnZhbHVlLnVudW1iZXI7CisKKyAgICByZXR1cm4gYmNtX2JvYXJkX2ZwZ2Ffc2V0X2dwaW9fZGlyKGdwaW9fcGluLCBkaXIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtX2JvYXJkX2NsaV9mcGdhX2dldF9ncGlvX2RpcihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21vbHRfZ3Bpb19waW4gZ3Bpb19waW4gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJncGlvX3BpbiIpLT52YWx1ZS51bnVtYmVyOworICAgIGJjbV9mcGdhX2dwaW9fZGlyIGRpcjsKKyAgICBiY21vc19lcnJubyByYzsKKyAgCisgICAgcmMgPSBiY21fYm9hcmRfZnBnYV9nZXRfZ3Bpb19kaXIoZ3Bpb19waW4sICZkaXIpOworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIlc1xuIiwgZGlyID09IEJDTV9GUEdBX0dQSU9fRElSX0lOUFVUID8gImlucHV0IiA6ICJvdXRwdXQiKTsKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21fYm9hcmRfY2xpX2ZwZ2Ffd3JpdGVfZ3BpbyhiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21vbHRfZ3Bpb19waW4gZ3Bpb19waW4gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJncGlvX3BpbiIpLT52YWx1ZS51bnVtYmVyOworICAgIHVpbnQzMl90IHZhbCA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInZhbCIpLT52YWx1ZS51bnVtYmVyOworCisgICAgcmV0dXJuIGJjbV9ib2FyZF9mcGdhX3dyaXRlX2dwaW8oZ3Bpb19waW4sIHZhbCk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21fYm9hcmRfY2xpX2ZwZ2FfcmVhZF9ncGlvKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGJjbW9sdF9ncGlvX3BpbiBncGlvX3BpbiA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdwaW9fcGluIiktPnZhbHVlLnVudW1iZXI7CisgICAgdWludDMyX3QgdmFsOworICAgIGJjbW9zX2Vycm5vIHJjOworICAKKyAgICByYyA9IGJjbV9ib2FyZF9mcGdhX3JlYWRfZ3BpbyhncGlvX3BpbiwgJnZhbCk7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIjB4JXhcbiIsIHZhbCk7CisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtX2JvYXJkX2NsaV9mcGdhX2dlbl9ncGlvX2lycShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21vbHRfZXh0X2lycSBleHRfaXJxID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaXJxIiktPnZhbHVlLnVudW1iZXI7CisgIAorICAgIHJldHVybiBiY21fYm9hcmRfZnBnYV9nZW5fZ3Bpb19pcnEoZXh0X2lycSk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21fYm9hcmRfY2xpX3RyeF9lbmFibGUoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgdWludDhfdCBwb25faWQgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25faWQiKS0+dmFsdWUudW51bWJlcjsKKworICAgIHJldHVybiBiY21fYm9hcmRfdHJ4X2VuYWJsZShwb25faWQsIEJDTU9TX1RSVUUpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtX2JvYXJkX2NsaV90cnhfZGlzYWJsZShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICB1aW50OF90IHBvbl9pZCA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9pZCIpLT52YWx1ZS51bnVtYmVyOworCisgICAgcmV0dXJuIGJjbV9ib2FyZF90cnhfZW5hYmxlKHBvbl9pZCwgQkNNT1NfRkFMU0UpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtX2JvYXJkX2NsaV9kZXZpY2VfcmVzZXQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgcmV0dXJuIGJjbV9ib2FyZF9kZXZpY2VfcmVzZXQoKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbV9ib2FyZF9jbGlfZGV2aWNlX29uKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIHJldHVybiBiY21fYm9hcmRfZGV2aWNlX29uKCk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21fYm9hcmRfY2xpX2RldmljZV9vZmYoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgcmV0dXJuIGJjbV9ib2FyZF9kZXZpY2Vfb2ZmKCk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21fYm9hcmRfY2xpX2t0Ml9vbihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICByZXR1cm4gYmNtX2JvYXJkX2t0Ml9kZXZpY2Vfb24oKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbV9ib2FyZF9jbGlfa3QyX29mZihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICByZXR1cm4gYmNtX2JvYXJkX2t0Ml9kZXZpY2Vfb2ZmKCk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21fYm9hcmRfY2xpX2ZwZ2FfcmVnX3JlYWQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisJdWludDMyX3QgYWRkciA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFkZHIiKS0+dmFsdWUudW51bWJlcjsKKwl1aW50MzJfdCB2YWw7CisJYmNtb3NfZXJybm8gcmM7CisKKwlyYyA9IGJjbV9ib2FyZF9mcGdhX3JlZ19yZWFkKGFkZHIsICZ2YWwpOworCUJDTU9TX1RSQUNFX0NIRUNLX1JFVFVSTihyYywgcmMsICJiY21fYm9hcmRfZnBnYV9yZWdfcmVhZCgpIGZhaWxlZFxuIik7CisJYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIjB4JXhcbiIsIHZhbCk7CisKKwlyZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbV9ib2FyZF9jbGlfZnBnYV9yZWdfd3JpdGUoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisJdWludDMyX3QgYWRkciA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFkZHIiKS0+dmFsdWUudW51bWJlcjsKKwl1aW50MzJfdCB2YWwgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ2YWwiKS0+dmFsdWUudW51bWJlcjsKKworICAgIHJldHVybiBiY21fYm9hcmRfZnBnYV9yZWdfd3JpdGUoYWRkciwgdmFsKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbV9ib2FyZF9jbGlfYnVybl9kcGxsKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworCWJjbW9zX2Vycm5vIHJjOworCisgICAgdWludDMyX3QgZGV2ID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGV2aWNlIiktPnZhbHVlLnVudW1iZXI7CisgICAgcmMgPSBiY21fYm9hcmRfYnVybl9wb25fZHBsbChkZXYpOworCUJDTU9TX1RSQUNFX0NIRUNLX1JFVFVSTihyYywgcmMsICJiY21fYm9hcmRfYnVybl9wb25fZHBsbCgpIGZhaWxlZFxuIik7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbV9ib2FyZF9jbGlfZHBsbF93cml0ZShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICB1aW50MzJfdCBwYWdlID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGFnZSIpLT52YWx1ZS51bnVtYmVyOworICAgIHVpbnQzMl90IGFkZHIgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhZGRyIiktPnZhbHVlLnVudW1iZXI7CisgICAgdWludDMyX3QgdmFsID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidmFsIiktPnZhbHVlLnVudW1iZXI7CisgICAgCisgICAgcmV0dXJuIGJjbV9ib2FyZF93cml0ZV9kcGxsKHBhZ2UsIGFkZHIsIHZhbCk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21fYm9hcmRfY2xpX2RwbGxfcmVhZChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICB1aW50MzJfdCBwYWdlID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGFnZSIpLT52YWx1ZS51bnVtYmVyOworICAgIHVpbnQzMl90IGFkZHIgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhZGRyIiktPnZhbHVlLnVudW1iZXI7CisgICAgdWludDMyX3QgdmFsOworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIAorICAgIHJjID0gYmNtX2JvYXJkX3JlYWRfZHBsbChwYWdlLCBhZGRyLCAmdmFsKTsKKyAgICBCQ01PU19UUkFDRV9DSEVDS19SRVRVUk4ocmMsIHJjLCAiYmNtX2JvYXJkX2RwbGxfcmVhZCgpIGZhaWxlZFxuIik7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIjB4JXhcbiIsIHZhbCk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogTFVLX01BWF9EQVRBX1NJWkUgKDIqMTAyNCkgKi8KKyNkZWZpbmUgU1dJVENIX1JFQ0VJVkVfQlVGRkVSX0xFTkdUSCAgICgyKjEwMjQpCitzdGF0aWMgaW50IHN3aXRjaF9zb2NrZXQgPSAtMTsKK3N0YXRpYyBjaGFyICpzd2l0Y2hfYnVmZmVyID0gTlVMTDsKK3N0YXRpYyBiY21vc19ib29sIHN3aXRjaF9maXJzdF9jb25uZWN0aW9uID0gQkNNT1NfVFJVRTsKKworc3RhdGljIHZvaWQgc3dpdGNoX3Jlc3BvbnNlKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGludCBsZW47CisgICAgY2hhciAqcHJvbXB0ID0gTlVMTDsKKworICAgIHdoaWxlICgxKQorICAgIHsKKyAgICAgICAgbGVuID0gcmVhZChzd2l0Y2hfc29ja2V0LCBzd2l0Y2hfYnVmZmVyLCBTV0lUQ0hfUkVDRUlWRV9CVUZGRVJfTEVOR1RILTEpOworICAgICAgICBpZiAobGVuID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoX2J1ZmZlcltsZW5dID0gJ1wwJzsKKyAgICAgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiJXMiLCBzd2l0Y2hfYnVmZmVyKTsKKyAgICAgICAgICAgIHByb21wdCA9IHN0cnN0cihzd2l0Y2hfYnVmZmVyLCAiQkNNIik7CisgICAgICAgICAgICB3aGlsZSAocHJvbXB0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxlbiA9IHN0cmxlbihwcm9tcHQpOworICAgICAgICAgICAgICAgIGlmIChsZW4gPj0gNikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICgocHJvbXB0WzNdID09ICc+JykgfHwgKChwcm9tcHRbM10gPT0gJy4nKSAmJiAocHJvbXB0WzVdID09ICc+JykpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChsZW4gPj0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcm9tcHRbM10gPT0gJz4nKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcm9tcHQgPSBzdHJzdHIoJnByb21wdFsyXSwgIkJDTSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGt0Ml9jb25uKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCAgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc2VydmVyOworCisgICAgaWYgKHN3aXRjaF9zb2NrZXQgIT0gLTEpCisgICAgeworICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIkEgY29ubmVjdGlvbiBhbHJlYWR5IGV4aXN0c1xuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX0FMUkVBRFk7CisgICAgfQorCisgICAgc3dpdGNoX2J1ZmZlciA9IGJjbW9zX2FsbG9jKFNXSVRDSF9SRUNFSVZFX0JVRkZFUl9MRU5HVEgpOworICAgIGlmICghc3dpdGNoX2J1ZmZlcikKKyAgICB7CisgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlclxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKyAgICBtZW1zZXQoKHZvaWQgKikmc2VydmVyLCAwLCBzaXplb2Yoc2VydmVyKSk7CisgICAgc2VydmVyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgIHNlcnZlci5zaW5fcG9ydCA9IGh0b25zKHBhcm1bMF0udmFsdWUubnVtYmVyKTsKKyAgICBzZXJ2ZXIuc2luX2FkZHIuc19hZGRyID0gaW5ldF9hZGRyKCIxMjcuMC4wLjEiKTsKKyAgICBzd2l0Y2hfc29ja2V0ID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKKyAgICBpZiAoc3dpdGNoX3NvY2tldCA8IDApCisgICAgeworICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIkNhbid0IG9wZW4gY2xpZW50IHNvY2tldFxuIik7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisgICAgaWYgKGNvbm5lY3Qoc3dpdGNoX3NvY2tldCwgKHN0cnVjdCBzb2NrYWRkciAqKSZzZXJ2ZXIsIHNpemVvZihzZXJ2ZXIpKSA9PSAtMSkKKyAgICB7CisgICAgICAgIGNsb3NlKHN3aXRjaF9zb2NrZXQpOworICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIkZhaWxlZCB0byBjb25uZWN0XG4iKTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKyAgICBpZiAoc3dpdGNoX2ZpcnN0X2Nvbm5lY3Rpb24pCisgICAgeworICAgICAgICBzd2l0Y2hfZmlyc3RfY29ubmVjdGlvbiA9IEJDTU9TX0ZBTFNFOworICAgICAgICBzd2l0Y2hfcmVzcG9uc2Uoc2Vzc2lvbik7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisKK2V4aXQ6CisgICAgYmNtb3NfZnJlZShzd2l0Y2hfYnVmZmVyKTsKKyAgICByZXR1cm4gQkNNX0VSUl9DT01NX0ZBSUw7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBrdDJfZGlzY29ubihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgaWYgKHN3aXRjaF9zb2NrZXQgIT0gLTEpCisgICAgeworICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIlNlbmQgJ2V4aXQnXG4iKTsKKyAgICAgICAgaWYgKHdyaXRlKHN3aXRjaF9zb2NrZXQsICJleGl0XHIiLCBzdHJsZW4oImV4aXRcciIpKSA8IDApCisgICAgICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIlNlbmQgJ2V4aXQnIHRvIHN3aXRjaCBmYWlsZWRcbiIpOworICAgICAgICBmc3luYyhzd2l0Y2hfc29ja2V0KTsKKyAgICB9CisgICAgYmNtb3NfdXNsZWVwKDEwMDApOworICAgIGlmIChzd2l0Y2hfc29ja2V0ICE9IC0xKQorICAgICAgICBjbG9zZShzd2l0Y2hfc29ja2V0KTsKKyAgICBpZiAoc3dpdGNoX2J1ZmZlcikKKyAgICAgICAgYmNtb3NfZnJlZShzd2l0Y2hfYnVmZmVyKTsKKyAgICAvKiBzZXQgc29ja2V0IGFuZCBidWZmZXIgd2l0aCBpbml0aWFsIHZhbHVlcyAqLworICAgIHN3aXRjaF9zb2NrZXQgPSAtMTsKKyAgICBzd2l0Y2hfYnVmZmVyID0gTlVMTDsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8ga3QyX2NtZChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgaW50IGxlbiwgc2VudF9sZW47CisgICAgY2hhciAqc3RyOworCisgICAgaWYgKChzd2l0Y2hfc29ja2V0ID09IC0xKSB8fCAoIXN3aXRjaF9idWZmZXIpKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICJDb25uZWN0aW9uIG9yIGJ1ZmZlciBkbyBub3QgZXhpc3RcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT1JFUzsKKyAgICB9CisgICAgLyogc3dpdGNoIHVzZXIgc3BhY2UgYXBwbGljYXRpb24gcmVjZWl2ZXMgdGhydSBfZmRfaW5wdXRfY2IgYW5kCisgICAgICAgc2VuZCB0byBrZXJuZWwgdGhydSBfa2VybmVsX3Byb3h5X291dHB1dF9jYiAqLworICAgIGxlbiA9IChpbnQpc3RybGVuKHBhcm1bMF0udmFsdWUuc3RyaW5nKTsKKyAgICB7CisgICAgICAgIC8qIGRpcnR5IC0ganVzdCB0byBhdm9pZCBlcnJvciA6IGNhc3QgZGlzY2FyZHMgJ19fYXR0cmlidXRlX18oKGNvbnN0KSknIHF1YWxpZmllciBpZiB1c2Vpbmcgc3RyY2F0ICovCisgICAgICAgIHVuc2lnbmVkIGxvbmcgc3RycCA9ICh1bnNpZ25lZCBsb25nKSZwYXJtWzBdLnZhbHVlLnN0cmluZzsKKyAgICAgICAgc3RyID0gKihjaGFyICoqKXN0cnA7CisgICAgfQorICAgIHN0cltsZW4rK10gPSAnXHInOworICAgIHN0cltsZW5dID0gJ1wwJzsKKyAgICBzZW50X2xlbiA9IDA7CisgICAgZG8KKyAgICB7CisgICAgICAgIHNlbnRfbGVuID0gd3JpdGUoc3dpdGNoX3NvY2tldCwgc3RyICsgc2VudF9sZW4gLCBsZW4gLSBzZW50X2xlbik7CisgICAgICAgIGlmIChzZW50X2xlbiA9PSAtMSB8fCAoKHNlbnRfbGVuID09IDApICYmIGVycm5vKSkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICJTZW5kIGNvbW1hbmQgdG8gc3dpdGNoIGZhaWxlZCAod3JpdGUgdG8gc29ja2V0IGVycm9yOiAlZClcbiIsIGVycm5vKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX0NPTU1fRkFJTDsKKyAgICAgICAgfQorICAgICAgICBmc3luYyhzd2l0Y2hfc29ja2V0KTsKKyAgICB9IHdoaWxlKGxlbiAtIHNlbnRfbGVuKTsKKyAgICAvKiBzd2l0Y2gga2VybmVsIHNlbmQgdGhydSBfa2VybmVsX3Byb3h5X2lucHV0X2NiCisgICAgICAgdG8gc3dpdGNoIHVzZXIgc3BhY2UgYXBwbGljYXRpb24gdGhydSBfZmRfb3V0b3V0X2NiICovCisgICAgc3dpdGNoX3Jlc3BvbnNlKHNlc3Npb24pOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIGJjbV9ib2FyZF9jbGlfaW5pdChiY21jbGlfZW50cnkgKnRvcF9kaXIpCit7CisgICAgYmNtY2xpX2VudHJ5ICpib2FyZF9kaXIsICppMmNfZGlyOworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGJjbV9ib2FyZF9zdmtfYm9hcmRfaWQgYm9hcmRfaWQ7CisgICAgYmNtY2xpX2VudHJ5ICpkaXI7CisgICAgc3RhdGljIGJjbWNsaV9lbnVtX3ZhbCBmcGdhX2dwaW9fcGluX3RhYmxlW10gPQorICAgIHsKKyAgICAgICAgeyJwaW40IiwgQkNNT0xUX0dQSU9fUElOX1BJTjR9LAorICAgICAgICB7InBpbjUiLCBCQ01PTFRfR1BJT19QSU5fUElONX0sCisgICAgICAgIHsicGluNiIsIEJDTU9MVF9HUElPX1BJTl9QSU42fSwKKyAgICAgICAgeyJwaW43IiwgQkNNT0xUX0dQSU9fUElOX1BJTjd9LAorICAgICAgICB7InBpbjgiLCBCQ01PTFRfR1BJT19QSU5fUElOOH0sCisgICAgICAgIHsicGluOSIsIEJDTU9MVF9HUElPX1BJTl9QSU45fSwKKyAgICAgICAgeyJwaW4xMCIsIEJDTU9MVF9HUElPX1BJTl9QSU4xMH0sCisgICAgICAgIHsicGluMTEiLCBCQ01PTFRfR1BJT19QSU5fUElOMTF9LAorICAgICAgICB7InBpbjEyIiwgQkNNT0xUX0dQSU9fUElOX1BJTjEyfSwKKyAgICAgICAgeyJwaW4xMyIsIEJDTU9MVF9HUElPX1BJTl9QSU4xM30sCisgICAgICAgIHsicGluMTQiLCBCQ01PTFRfR1BJT19QSU5fUElOMTR9LAorICAgICAgICB7InBpbjE1IiwgQkNNT0xUX0dQSU9fUElOX1BJTjE1fSwKKyAgICAgICAgeyJwaW4xNiIsIEJDTU9MVF9HUElPX1BJTl9QSU4xNn0sCisgICAgICAgIHsicGluMTciLCBCQ01PTFRfR1BJT19QSU5fUElOMTd9LAorICAgICAgICB7InBpbjE4IiwgQkNNT0xUX0dQSU9fUElOX1BJTjE4fSwKKyAgICAgICAgeyJwaW4xOSIsIEJDTU9MVF9HUElPX1BJTl9QSU4xOX0sCisgICAgICAgIHsicGluMjAiLCBCQ01PTFRfR1BJT19QSU5fUElOMjB9LAorICAgICAgICB7InBpbjIxIiwgQkNNT0xUX0dQSU9fUElOX1BJTjIxfSwKKyAgICAgICAgeyJwaW4yMiIsIEJDTU9MVF9HUElPX1BJTl9QSU4yMn0sCisgICAgICAgIHsicGluMjMiLCBCQ01PTFRfR1BJT19QSU5fUElOMjN9LAorICAgICAgICB7InBpbjI0IiwgQkNNT0xUX0dQSU9fUElOX1BJTjI0fSwKKyAgICAgICAgeyJwaW4yNSIsIEJDTU9MVF9HUElPX1BJTl9QSU4yNX0sCisgICAgICAgIHsicGluMjYiLCBCQ01PTFRfR1BJT19QSU5fUElOMjZ9LAorICAgICAgICB7InBpbjI3IiwgQkNNT0xUX0dQSU9fUElOX1BJTjI3fSwKKyAgICAgICAgeyJwaW4yOCIsIEJDTU9MVF9HUElPX1BJTl9QSU4yOH0sCisgICAgICAgIHsicGluMjkiLCBCQ01PTFRfR1BJT19QSU5fUElOMjl9LAorICAgICAgICB7InBpbjMwIiwgQkNNT0xUX0dQSU9fUElOX1BJTjMwfSwKKyAgICAgICAgeyJwaW4zMSIsIEJDTU9MVF9HUElPX1BJTl9QSU4zMX0sCisgICAgICAgIEJDTUNMSV9FTlVNX0xBU1QKKyAgICB9OworICAgIHN0YXRpYyBiY21jbGlfZW51bV92YWwgZnBnYV9leHRfaXJxX3RhYmxlW10gPQorICAgIHsKKyAgICAgICAgeyJleHRfaXJxMCIsIEJDTU9MVF9FWFRfSVJRX0VYVF9JUlEwfSwKKyAgICAgICAgeyJleHRfaXJxMSIsIEJDTU9MVF9FWFRfSVJRX0VYVF9JUlExfSwKKyAgICAgICAgeyJleHRfaXJxMiIsIEJDTU9MVF9FWFRfSVJRX0VYVF9JUlEyfSwKKyAgICAgICAgeyJleHRfaXJxMyIsIEJDTU9MVF9FWFRfSVJRX0VYVF9JUlEzfSwKKyAgICAgICAgeyJleHRfaXJxNCIsIEJDTU9MVF9FWFRfSVJRX0VYVF9JUlE0fSwKKyAgICAgICAgeyJleHRfaXJxNSIsIEJDTU9MVF9FWFRfSVJRX0VYVF9JUlE1fSwKKyAgICAgICAgQkNNQ0xJX0VOVU1fTEFTVAorICAgIH07CisKKyAgICBzdGF0aWMgYmNtY2xpX2VudW1fdmFsIGZwZ2FfZ3Bpb19kaXJfdGFibGVbXSA9CisgICAgeworICAgICAgICB7ImlucHV0IiwgQkNNX0ZQR0FfR1BJT19ESVJfSU5QVVR9LAorICAgICAgICB7Im91dHB1dCIsIEJDTV9GUEdBX0dQSU9fRElSX09VVFBVVH0sCisgICAgICAgIEJDTUNMSV9FTlVNX0xBU1QKKyAgICB9OworCisgICAgc3RhdGljIGJjbWNsaV9lbnVtX3ZhbCBkcGxsX2RldmljZXNbXSA9IHsKKyAgICAgICAgeyAubmFtZT0iZ3BvbiIsIC52YWw9R1BPTl9EUExMfSwKKyAgICAgICAgeyAubmFtZT0iZXBvbiIsIC52YWw9RVBPTl9EUExMfSwKKyAgICAgICAgeyAubmFtZT0ic3luY2UiLCAudmFsPUdQT05fU1lOQ0V9LAorICAgICAgICBCQ01DTElfRU5VTV9MQVNUCisgICAgfTsKKyAgICAKKyAgICBib2FyZF9kaXIgPSBiY21jbGlfZGlyX2FkZCh0b3BfZGlyLCAiYm9hcmQiLCAiQm9hcmQiLCBCQ01DTElfQUNDRVNTX0dVRVNULCBOVUxMKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoIWJvYXJkX2RpciwgQkNNX0VSUl9JTlRFUk5BTCk7CisKKyAgICBpMmNfZGlyID0gYmNtY2xpX2Rpcl9hZGQoYm9hcmRfZGlyLCAiaTJjIiwgImkyYyIsIEJDTUNMSV9BQ0NFU1NfR1VFU1QsIE5VTEwpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUighaTJjX2RpciwgQkNNX0VSUl9JTlRFUk5BTCk7CisKKyAgICBCQ01DTElfTUFLRV9DTUQoaTJjX2RpciwgImRldl9jaGFuZ2UiLCAiQ2hhbmdlIGN1cnJlbnQgZGV2aWNlIiwgYmNtX2JvYXJkX2NsaV9kZXZfY2hhbmdlLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oImRldiIsICJkZXZpY2UiLCBiY21faTJjX2Rldl9hZGRyX3RhYmxlLCAwKSk7CisKKyAgICBCQ01DTElfTUFLRV9DTUQoaTJjX2RpciwgImRldl93cml0ZSIsICJXcml0ZSB0byBjdXJyZW50IGkyYyBkZXZpY2UiLCBiY21fYm9hcmRfY2xpX2Rldl93cml0ZSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgid2lkdGgiLCAiV2lkdGggb2YgcmVnaXN0ZXIgaW4gYml0cyAoOHwxNnwzMikiLCBCQ01DTElfUEFSTV9OVU1CRVIsIDApLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJhZGRyIiwgImFkZHJlc3MiLCBCQ01DTElfUEFSTV9IRVgsIDApLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJ2YWwiLCAidmFsdWUiLCBCQ01DTElfUEFSTV9IRVgsIDApKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRChpMmNfZGlyLCAiZGV2X3JlYWQiLCAiUmVhZCBmcm9tIGN1cnJlbnQgaTJjIGRldmljZSIsIGJjbV9ib2FyZF9jbGlfZGV2X3JlYWQsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oIndpZHRoIiwgIldpZHRoIG9mIHJlZ2lzdGVyIGluIGJpdHMgKDh8MTZ8MzIpIiwgQkNNQ0xJX1BBUk1fTlVNQkVSLCAwKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiYWRkciIsICJhZGRyZXNzIiwgQkNNQ0xJX1BBUk1fSEVYLCAwKSk7CisKKyAgICBCQ01DTElfTUFLRV9DTUQoaTJjX2RpciwgInN3aXRjaF93cml0ZSIsICJXcml0ZSB0byBzd2l0Y2giLCBiY21fYm9hcmRfY2xpX3N3aXRjaF93cml0ZSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9SQU5HRSgidmFsIiwgInZhbHVlIiwgQkNNQ0xJX1BBUk1fSEVYLCAwLCAwLCBVQ0hBUl9NQVgpKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oaTJjX2RpciwgInN3aXRjaF9yZWFkIiwgIlJlYWQgZnJvbSBzd2l0Y2giLCBiY21fYm9hcmRfY2xpX3N3aXRjaF9yZWFkKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRChpMmNfZGlyLCAiZnBnYV93cml0ZSIsICJXcml0ZSB0byBGUEdBIiwgYmNtX2JvYXJkX2NsaV9mcGdhX3dyaXRlLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJhZGRyIiwgImFkZHJlc3MiLCBCQ01DTElfUEFSTV9IRVgsIDApLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJ2YWwiLCAidmFsdWUiLCBCQ01DTElfUEFSTV9IRVgsIDApKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRChpMmNfZGlyLCAiZnBnYV9yZWFkIiwgIlJlYWQgZnJvbSBGUEdBIiwgYmNtX2JvYXJkX2NsaV9mcGdhX3JlYWQsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImFkZHIiLCAiYWRkcmVzcyIsIEJDTUNMSV9QQVJNX0hFWCwgMCkpOworCisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShib2FyZF9kaXIsICJmcGdhX3ZlcnNpb24iLCAiRlBHQSB2ZXJzaW9uIiwgYmNtX2JvYXJkX2NsaV9mcGdhX3ZlcnNpb24pOworICAgIAorICAgIEJDTUNMSV9NQUtFX0NNRChib2FyZF9kaXIsICJmcGdhX3NldF9ncGlvX2RpciIsICJTZXQgR1BJTyBkaXJlY3Rpb24iLCBiY21fYm9hcmRfY2xpX2ZwZ2Ffc2V0X2dwaW9fZGlyLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oImdwaW9fcGluIiwgIkdQSU8gcGluIiwgZnBnYV9ncGlvX3Bpbl90YWJsZSwgMCksCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fRU5VTSgiZGlyIiwgIkRpcmVjdGlvbiIsIGZwZ2FfZ3Bpb19kaXJfdGFibGUsIDApKTsKKyAgICBCQ01DTElfTUFLRV9DTUQoYm9hcmRfZGlyLCAiZnBnYV9nZXRfZ3Bpb19kaXIiLCAiR2V0IEdQSU8gZGlyZWN0aW9uIiwgYmNtX2JvYXJkX2NsaV9mcGdhX2dldF9ncGlvX2RpciwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNKCJncGlvX3BpbiIsICJHUElPIHBpbiIsIGZwZ2FfZ3Bpb19waW5fdGFibGUsIDApKTsKKyAgICBCQ01DTElfTUFLRV9DTUQoYm9hcmRfZGlyLCAiZnBnYV93cml0ZV9ncGlvIiwgIldyaXRlIHRvIEdQSU8gcGluIiwgYmNtX2JvYXJkX2NsaV9mcGdhX3dyaXRlX2dwaW8sCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fRU5VTSgiZ3Bpb19waW4iLCAiR1BJTyBwaW4iLCBmcGdhX2dwaW9fcGluX3RhYmxlLCAwKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgidmFsIiwgIlZhbHVlIiwgQkNNQ0xJX1BBUk1fSEVYLCAwKSk7CisgICAgQkNNQ0xJX01BS0VfQ01EKGJvYXJkX2RpciwgImZwZ2FfcmVhZF9ncGlvIiwgIlJlYWQgZnJvbSBHUElPIHBpbiIsIGJjbV9ib2FyZF9jbGlfZnBnYV9yZWFkX2dwaW8sCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fRU5VTSgiZ3Bpb19waW4iLCAiR1BJTyBwaW4iLCBmcGdhX2dwaW9fcGluX3RhYmxlLCAwKSk7CisgICAgQkNNQ0xJX01BS0VfQ01EKGJvYXJkX2RpciwgImZwZ2FfZ2VuX2lycSIsICJHZW5lcmF0ZSBHUElPIElSUSIsIGJjbV9ib2FyZF9jbGlfZnBnYV9nZW5fZ3Bpb19pcnEsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fRU5VTSgiaXJxIiwgIklSUSIsIGZwZ2FfZXh0X2lycV90YWJsZSwgMCkpOworCisgICAgQkNNQ0xJX01BS0VfQ01EKGJvYXJkX2RpciwgInRyeF9lbmFibGUiLCAiRW5hYmxlIHRyYW5zY2VpdmVyIiwgYmNtX2JvYXJkX2NsaV90cnhfZW5hYmxlLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJwb25faWQiLCAicG9uX2lkIiwgQkNNQ0xJX1BBUk1fVURFQ0lNQUwsIDApKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRChib2FyZF9kaXIsICJ0cnhfZGlzYWJsZSIsICJEaXNhYmxlIHRyYW5zY2VpdmVyIiwgYmNtX2JvYXJkX2NsaV90cnhfZGlzYWJsZSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgicG9uX2lkIiwgInBvbl9pZCIsIEJDTUNMSV9QQVJNX1VERUNJTUFMLCAwKSk7CisKKyAgICBCQ01DTElfTUFLRV9DTURfTk9QQVJNKGJvYXJkX2RpciwgImRldmljZV9yZXNldCIsICJSZXNldCB0aGUgZGV2aWNlIC0gY2xlYXJzIHRoZSByZXNldCBiaXQgYW5kIHRoZW4gc2V0IGl0IG9uIiwgYmNtX2JvYXJkX2NsaV9kZXZpY2VfcmVzZXQpOworCisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShib2FyZF9kaXIsICJkZXZpY2Vfb24iLCAiS2VlcHMgdGhlIGRldmljZSB3aXRoIHJlc2V0IGJpdCBvbiIsIGJjbV9ib2FyZF9jbGlfZGV2aWNlX29uKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oYm9hcmRfZGlyLCAiZGV2aWNlX29mZiIsICJLZWVwcyB0aGUgZGV2aWNlIHdpdGggcmVzZXQgYml0IG9mZiIsIGJjbV9ib2FyZF9jbGlfZGV2aWNlX29mZik7CisKKyAgICBCQ01DTElfTUFLRV9DTUQoYm9hcmRfZGlyLCAiZnBnYV9yZWdfcmVhZCIsICJSZWFkIGRhdGEgZnJvbSBhbiBGUEdBIHJlZ2lzdGVyIiwgYmNtX2JvYXJkX2NsaV9mcGdhX3JlZ19yZWFkLAorICAgIAlCQ01DTElfTUFLRV9QQVJNKCJhZGRyIiwgImFkZHJlc3MiLCBCQ01DTElfUEFSTV9IRVgsIDApKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRChib2FyZF9kaXIsICJmcGdhX3JlZ193cml0ZSIsICJXcml0ZSBkYXRhIHRvIGFuIEZQR0EgcmVnaXN0ZXIiLCBiY21fYm9hcmRfY2xpX2ZwZ2FfcmVnX3dyaXRlLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJhZGRyIiwgImFkZHJlc3MiLCBCQ01DTElfUEFSTV9IRVgsIDApLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJ2YWwiLCAidmFsdWUiLCBCQ01DTElfUEFSTV9IRVgsIDApKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRChib2FyZF9kaXIsICJkcGxsIiwgIkJ1cm4gRFBMTCIsIGJjbV9ib2FyZF9jbGlfYnVybl9kcGxsLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oImRldmljZSIsICJEZXZpY2UiLCBkcGxsX2RldmljZXMsIDApKTsKKyAgICAKKyAgICBCQ01DTElfTUFLRV9DTUQoYm9hcmRfZGlyLCAiZHBsbF93cml0ZSIsICJXcml0ZSB0byBEUExMIiwgYmNtX2JvYXJkX2NsaV9kcGxsX3dyaXRlLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJwYWdlIiwgInBhZ2UiLCBCQ01DTElfUEFSTV9IRVgsIDApLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJhZGRyIiwgImFkZHJlc3MiLCBCQ01DTElfUEFSTV9IRVgsIDApLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJ2YWwiLCAidmFsdWUiLCBCQ01DTElfUEFSTV9IRVgsIDApKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRChib2FyZF9kaXIsICJkcGxsX3JlYWQiLCAiUmVhZCBmcm9tIERQTEwiLCBiY21fYm9hcmRfY2xpX2RwbGxfcmVhZCwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgicGFnZSIsICJwYWdlIiwgQkNNQ0xJX1BBUk1fSEVYLCAwKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiYWRkciIsICJhZGRyZXNzIiwgQkNNQ0xJX1BBUk1fSEVYLCAwKSk7CisKKyAgICByYyA9IGJjbV9ib2FyZF9nZXRfYm9hcmRfaWQoJmJvYXJkX2lkKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk4ocmMsIHJjLCByYyk7CisgICAgLyogY2hlY2sgaWYgdGhlIGJvYXJkIGlzIFNWSyMzICovCisgICAgaWYgKGJvYXJkX2lkID09IFNWS18zKQorICAgIHsKKyAgICAgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShib2FyZF9kaXIsICJrdDJfb24iLCAiS2VlcHMgdGhlIEthdGFuYTIgd2l0aCByZXNldCBiaXQgb24iLCBiY21fYm9hcmRfY2xpX2t0Ml9vbik7CisKKyAgICAgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShib2FyZF9kaXIsICJrdDJfb2ZmIiwgIktlZXBzIHRoZSBLYXRhbmEyIHdpdGggcmVzZXQgYml0IG9mZiIsIGJjbV9ib2FyZF9jbGlfa3QyX29mZik7CisKKyAgICAgICAgZGlyID0gYmNtY2xpX2Rpcl9hZGQoYm9hcmRfZGlyLCAic3dpdGNoIiwgIlN3aXRjaCIsIEJDTUNMSV9BQ0NFU1NfQURNSU4sIE5VTEwpOworICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoIWRpciwgQkNNX0VSUl9OT01FTSk7CisgICAgICAgIEJDTUNMSV9NQUtFX0NNRChkaXIsICJjb25uIiwgImNvbm5lY3QgdG8gc3dpdGNoIGRhZW1vbiIsIGt0Ml9jb25uLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgicG9ydCIsICJjb25uZWN0aW9uIHBvcnQgb24gbG9jYWxob3N0IiwgQkNNQ0xJX1BBUk1fTlVNQkVSLCAwKSk7CisgICAgICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oZGlyLCAiZGlzY29ubiIsICJkaXNjb25uZWN0IGZyb20gc3dpdGNoIGRhZW1vbiIsIGt0Ml9kaXNjb25uKTsKKyAgICAgICAgQkNNQ0xJX01BS0VfQ01EKGRpciwgImNtZCIsICJjb21tYW5kIHRvIHN3aXRjaCAtIHN0cmluZyBiZXR3ZWVuIHF1b3RlcyIsIGt0Ml9jbWQsCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCIiLCAiIiwgQkNNQ0xJX1BBUk1fU1RSSU5HLCAwKSk7CisgICAgfQorICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2JvYXJkL3dyeC9iY21vbHRfYm9hcmRfY2xpLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2JvYXJkL3dyeC9iY21vbHRfYm9hcmRfY2xpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFhOTA0YQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvYm9hcmQvd3J4L2JjbW9sdF9ib2FyZF9jbGkuaApAQCAtMCwwICsxLDM5IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaWZuZGVmIF9CQ01PTFRfQk9BUkRfQ0xJX0hfCisjZGVmaW5lIF9CQ01PTFRfQk9BUkRfQ0xJX0hfCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21jbGkuaD4KKworYmNtb3NfZXJybm8gYmNtX2JvYXJkX2NsaV9pbml0KGJjbWNsaV9lbnRyeSAqdG9wX2Rpcik7CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2JvYXJkL3dyeC9iY21vbHRfZHBsbF90YWJsZS5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9ib2FyZC93cngvYmNtb2x0X2RwbGxfdGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hN2Q2MTBlCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9ib2FyZC93cngvYmNtb2x0X2RwbGxfdGFibGUuaApAQCAtMCwwICsxLDExNDQgQEAKKyNpZm5kZWYgX0JDTU9MVF9EUExMX1RBQkxFX0hfCisjZGVmaW5lIF9CQ01PTFRfRFBMTF9UQUJMRV9IXworCisvKiBhdXRvIGdlbmVyYXRlZCBsb2FkaW5nIGZpbGVzICovCisKK3N0YXRpYyBkcGxsX2NvbW1hbmQgZ3Bvbl9kcGxsX3RhYmxlW10gPQoreworICAgIHsweDBCLDB4MjQsMHhEOH0sCisgICAgezB4MEIsMHgyNSwweDAwfSwKKyAgICB7MHgwMCwweDBCLDB4Njh9LAorICAgIHsweDAwLDB4MTYsMHgwMn0sCisgICAgezB4MDAsMHgxNywweDFDfSwKKyAgICB7MHgwMCwweDE4LDB4RUV9LAorICAgIHsweDAwLDB4MTksMHhERH0sCisgICAgezB4MDAsMHgxQSwweERGfSwKKyAgICB7MHgwMCwweDJCLDB4MDJ9LAorICAgIHsweDAwLDB4MkMsMHgwMX0sCisgICAgezB4MDAsMHgyRCwweDAxfSwKKyAgICB7MHgwMCwweDJFLDB4NkZ9LAorICAgIHsweDAwLDB4MkYsMHgwMH0sCisgICAgezB4MDAsMHgzMCwweDAwfSwKKyAgICB7MHgwMCwweDMxLDB4MDB9LAorICAgIHsweDAwLDB4MzIsMHgwMH0sCisgICAgezB4MDAsMHgzMywweDAwfSwKKyAgICB7MHgwMCwweDM0LDB4MDB9LAorICAgIHsweDAwLDB4MzUsMHgwMH0sCisgICAgezB4MDAsMHgzNiwweDZGfSwKKyAgICB7MHgwMCwweDM3LDB4MDB9LAorICAgIHsweDAwLDB4MzgsMHgwMH0sCisgICAgezB4MDAsMHgzOSwweDAwfSwKKyAgICB7MHgwMCwweDNBLDB4MDB9LAorICAgIHsweDAwLDB4M0IsMHgwMH0sCisgICAgezB4MDAsMHgzQywweDAwfSwKKyAgICB7MHgwMCwweDNELDB4MDB9LAorICAgIHsweDAwLDB4M0YsMHgxMX0sCisgICAgezB4MDAsMHg0MCwweDA0fSwKKyAgICB7MHgwMCwweDQxLDB4MEV9LAorICAgIHsweDAwLDB4NDIsMHgwMH0sCisgICAgezB4MDAsMHg0MywweDAwfSwKKyAgICB7MHgwMCwweDQ0LDB4MDB9LAorICAgIHsweDAwLDB4NDUsMHgwQ30sCisgICAgezB4MDAsMHg0NiwweDMyfSwKKyAgICB7MHgwMCwweDQ3LDB4MDB9LAorICAgIHsweDAwLDB4NDgsMHgwMH0sCisgICAgezB4MDAsMHg0OSwweDAwfSwKKyAgICB7MHgwMCwweDRBLDB4MzJ9LAorICAgIHsweDAwLDB4NEIsMHgwMH0sCisgICAgezB4MDAsMHg0QywweDAwfSwKKyAgICB7MHgwMCwweDRELDB4MDB9LAorICAgIHsweDAwLDB4NEUsMHgwNX0sCisgICAgezB4MDAsMHg0RiwweDAwfSwKKyAgICB7MHgwMCwweDUxLDB4MDN9LAorICAgIHsweDAwLDB4NTIsMHgwMH0sCisgICAgezB4MDAsMHg1MywweDAwfSwKKyAgICB7MHgwMCwweDU0LDB4MDB9LAorICAgIHsweDAwLDB4NTUsMHgwM30sCisgICAgezB4MDAsMHg1NiwweDAwfSwKKyAgICB7MHgwMCwweDU3LDB4MDB9LAorICAgIHsweDAwLDB4NTgsMHgwMH0sCisgICAgezB4MDAsMHg1OSwweDAzfSwKKyAgICB7MHgwMCwweDVBLDB4NTV9LAorICAgIHsweDAwLDB4NUIsMHg1NX0sCisgICAgezB4MDAsMHg1QywweEQwfSwKKyAgICB7MHgwMCwweDVELDB4MDB9LAorICAgIHsweDAwLDB4NUUsMHgwMH0sCisgICAgezB4MDAsMHg1RiwweDAwfSwKKyAgICB7MHgwMCwweDYwLDB4MDB9LAorICAgIHsweDAwLDB4NjEsMHgwMH0sCisgICAgezB4MDAsMHg2MiwweDAwfSwKKyAgICB7MHgwMCwweDYzLDB4MDB9LAorICAgIHsweDAwLDB4NjQsMHgwMH0sCisgICAgezB4MDAsMHg2NSwweDAwfSwKKyAgICB7MHgwMCwweDY2LDB4MDB9LAorICAgIHsweDAwLDB4NjcsMHgwMH0sCisgICAgezB4MDAsMHg2OCwweDAwfSwKKyAgICB7MHgwMCwweDY5LDB4MDB9LAorICAgIHsweDAwLDB4OTIsMHgwMH0sCisgICAgezB4MDAsMHg5MywweDAwfSwKKyAgICB7MHgwMCwweDk1LDB4MDB9LAorICAgIHsweDAwLDB4OTYsMHgwMH0sCisgICAgezB4MDAsMHg5OCwweDAwfSwKKyAgICB7MHgwMCwweDlBLDB4MDJ9LAorICAgIHsweDAwLDB4OUIsMHgxMH0sCisgICAgezB4MDAsMHg5RCwweDAwfSwKKyAgICB7MHgwMCwweDlFLDB4MjB9LAorICAgIHsweDAwLDB4QTAsMHgwMH0sCisgICAgezB4MDAsMHhBMiwweDAyfSwKKyAgICB7MHgwMCwweEE4LDB4Qzl9LAorICAgIHsweDAwLDB4QTksMHg2Mn0sCisgICAgezB4MDAsMHhBQSwweDEwfSwKKyAgICB7MHgwMCwweEFCLDB4MDB9LAorICAgIHsweDAwLDB4QUMsMHgwMH0sCisgICAgezB4MDEsMHgwMiwweDAxfSwKKyAgICB7MHgwMSwweDA4LDB4MDZ9LAorICAgIHsweDAxLDB4MDksMHgwOX0sCisgICAgezB4MDEsMHgwQSwweDZCfSwKKyAgICB7MHgwMSwweDBCLDB4MDB9LAorICAgIHsweDAxLDB4MEQsMHgwMX0sCisgICAgezB4MDEsMHgwRSwweDA5fSwKKyAgICB7MHgwMSwweDBGLDB4M0J9LAorICAgIHsweDAxLDB4MTAsMHgwMH0sCisgICAgezB4MDEsMHgxMiwweDA2fSwKKyAgICB7MHgwMSwweDEzLDB4MDl9LAorICAgIHsweDAxLDB4MTQsMHg2Qn0sCisgICAgezB4MDEsMHgxNSwweDAwfSwKKyAgICB7MHgwMSwweDE3LDB4MDF9LAorICAgIHsweDAxLDB4MTgsMHgwOX0sCisgICAgezB4MDEsMHgxOSwweDNCfSwKKyAgICB7MHgwMSwweDFBLDB4MDB9LAorICAgIHsweDAxLDB4MUMsMHgwNn0sCisgICAgezB4MDEsMHgxRCwweDA5fSwKKyAgICB7MHgwMSwweDFFLDB4NkJ9LAorICAgIHsweDAxLDB4MUYsMHgwMH0sCisgICAgezB4MDEsMHgyMSwweDAxfSwKKyAgICB7MHgwMSwweDIyLDB4MDl9LAorICAgIHsweDAxLDB4MjMsMHgzQn0sCisgICAgezB4MDEsMHgyNCwweDAwfSwKKyAgICB7MHgwMSwweDI2LDB4MDZ9LAorICAgIHsweDAxLDB4MjcsMHgwOX0sCisgICAgezB4MDEsMHgyOCwweDZCfSwKKyAgICB7MHgwMSwweDI5LDB4MDB9LAorICAgIHsweDAxLDB4MkIsMHgwMX0sCisgICAgezB4MDEsMHgyQywweDA5fSwKKyAgICB7MHgwMSwweDJELDB4M0J9LAorICAgIHsweDAxLDB4MkUsMHgwMH0sCisgICAgezB4MDEsMHgzMCwweDA2fSwKKyAgICB7MHgwMSwweDMxLDB4MDl9LAorICAgIHsweDAxLDB4MzIsMHg2Qn0sCisgICAgezB4MDEsMHgzMywweDAwfSwKKyAgICB7MHgwMSwweDNBLDB4MDZ9LAorICAgIHsweDAxLDB4M0IsMHhDQ30sCisgICAgezB4MDEsMHgzQywweDAwfSwKKyAgICB7MHgwMSwweDNELDB4MDB9LAorICAgIHsweDAxLDB4M0YsMHgwMH0sCisgICAgezB4MDEsMHg0MCwweDAwfSwKKyAgICB7MHgwMSwweDQxLDB4NDB9LAorICAgIHsweDAxLDB4NDIsMHhGRn0sCisgICAgezB4MDIsMHgwMiwweDAwfSwKKyAgICB7MHgwMiwweDAzLDB4MDB9LAorICAgIHsweDAyLDB4MDQsMHgwMH0sCisgICAgezB4MDIsMHgwNSwweDAwfSwKKyAgICB7MHgwMiwweDA2LDB4MDB9LAorICAgIHsweDAyLDB4MDgsMHg0Rn0sCisgICAgezB4MDIsMHgwOSwweDAwfSwKKyAgICB7MHgwMiwweDBBLDB4MDB9LAorICAgIHsweDAyLDB4MEIsMHgwMH0sCisgICAgezB4MDIsMHgwQywweDAwfSwKKyAgICB7MHgwMiwweDBELDB4MDB9LAorICAgIHsweDAyLDB4MEUsMHgwMX0sCisgICAgezB4MDIsMHgwRiwweDAwfSwKKyAgICB7MHgwMiwweDEwLDB4MDB9LAorICAgIHsweDAyLDB4MTEsMHgwMH0sCisgICAgezB4MDIsMHgxMiwweDAwfSwKKyAgICB7MHgwMiwweDEzLDB4MDB9LAorICAgIHsweDAyLDB4MTQsMHgwMH0sCisgICAgezB4MDIsMHgxNSwweDAwfSwKKyAgICB7MHgwMiwweDE2LDB4MDB9LAorICAgIHsweDAyLDB4MTcsMHgwMH0sCisgICAgezB4MDIsMHgxOCwweDAwfSwKKyAgICB7MHgwMiwweDE5LDB4MDB9LAorICAgIHsweDAyLDB4MUEsMHgwMH0sCisgICAgezB4MDIsMHgxQiwweDAwfSwKKyAgICB7MHgwMiwweDFDLDB4MDB9LAorICAgIHsweDAyLDB4MUQsMHgwMH0sCisgICAgezB4MDIsMHgxRSwweDAwfSwKKyAgICB7MHgwMiwweDFGLDB4MDB9LAorICAgIHsweDAyLDB4MjAsMHgwMH0sCisgICAgezB4MDIsMHgyMSwweDAwfSwKKyAgICB7MHgwMiwweDIyLDB4MDB9LAorICAgIHsweDAyLDB4MjMsMHgwMH0sCisgICAgezB4MDIsMHgyNCwweDAwfSwKKyAgICB7MHgwMiwweDI1LDB4MDB9LAorICAgIHsweDAyLDB4MjYsMHgwMH0sCisgICAgezB4MDIsMHgyNywweDAwfSwKKyAgICB7MHgwMiwweDI4LDB4MDB9LAorICAgIHsweDAyLDB4MjksMHgwMH0sCisgICAgezB4MDIsMHgyQSwweDAwfSwKKyAgICB7MHgwMiwweDJCLDB4MDB9LAorICAgIHsweDAyLDB4MkMsMHgwMH0sCisgICAgezB4MDIsMHgyRCwweDAwfSwKKyAgICB7MHgwMiwweDJFLDB4MDB9LAorICAgIHsweDAyLDB4MkYsMHgwMH0sCisgICAgezB4MDIsMHgzMSwweDAzfSwKKyAgICB7MHgwMiwweDMyLDB4MDN9LAorICAgIHsweDAyLDB4MzMsMHgwM30sCisgICAgezB4MDIsMHgzNCwweDAzfSwKKyAgICB7MHgwMiwweDM1LDB4MDB9LAorICAgIHsweDAyLDB4MzYsMHgwMH0sCisgICAgezB4MDIsMHgzNywweDAwfSwKKyAgICB7MHgwMiwweDM4LDB4QzB9LAorICAgIHsweDAyLDB4MzksMHhERX0sCisgICAgezB4MDIsMHgzQSwweDAwfSwKKyAgICB7MHgwMiwweDNCLDB4MDB9LAorICAgIHsweDAyLDB4M0MsMHgwMH0sCisgICAgezB4MDIsMHgzRCwweDAwfSwKKyAgICB7MHgwMiwweDNFLDB4Qzh9LAorICAgIHsweDAyLDB4NEEsMHgwMH0sCisgICAgezB4MDIsMHg0QiwweDAwfSwKKyAgICB7MHgwMiwweDRDLDB4MDB9LAorICAgIHsweDAyLDB4NEQsMHgwMH0sCisgICAgezB4MDIsMHg0RSwweDAwfSwKKyAgICB7MHgwMiwweDRGLDB4MDB9LAorICAgIHsweDAyLDB4NTAsMHgwMH0sCisgICAgezB4MDIsMHg1MSwweDAwfSwKKyAgICB7MHgwMiwweDUyLDB4MDB9LAorICAgIHsweDAyLDB4NTMsMHgwMH0sCisgICAgezB4MDIsMHg1NCwweDAwfSwKKyAgICB7MHgwMiwweDU1LDB4MDB9LAorICAgIHsweDAyLDB4NTYsMHgwMH0sCisgICAgezB4MDIsMHg1NywweDAwfSwKKyAgICB7MHgwMiwweDU4LDB4MDB9LAorICAgIHsweDAyLDB4NTksMHgwMH0sCisgICAgezB4MDIsMHg1QSwweDAwfSwKKyAgICB7MHgwMiwweDVCLDB4MDB9LAorICAgIHsweDAyLDB4NUMsMHgwMH0sCisgICAgezB4MDIsMHg1RCwweDAwfSwKKyAgICB7MHgwMiwweDVFLDB4MDB9LAorICAgIHsweDAyLDB4NUYsMHgwMH0sCisgICAgezB4MDIsMHg2MCwweDAwfSwKKyAgICB7MHgwMiwweDYxLDB4MDB9LAorICAgIHsweDAyLDB4NjIsMHgwMH0sCisgICAgezB4MDIsMHg2MywweDAwfSwKKyAgICB7MHgwMiwweDY0LDB4MDB9LAorICAgIHsweDAyLDB4NjgsMHgwMH0sCisgICAgezB4MDIsMHg2OSwweDAwfSwKKyAgICB7MHgwMiwweDZBLDB4MDB9LAorICAgIHsweDAyLDB4NkIsMHg0N30sCisgICAgezB4MDIsMHg2QywweDUwfSwKKyAgICB7MHgwMiwweDZELDB4NEZ9LAorICAgIHsweDAyLDB4NkUsMHg0RX0sCisgICAgezB4MDIsMHg2RiwweDVGfSwKKyAgICB7MHgwMiwweDcwLDB4NDN9LAorICAgIHsweDAyLDB4NzEsMHg0Q30sCisgICAgezB4MDIsMHg3MiwweDRCfSwKKyAgICB7MHgwMywweDAyLDB4MDB9LAorICAgIHsweDAzLDB4MDMsMHgwMH0sCisgICAgezB4MDMsMHgwNCwweDAwfSwKKyAgICB7MHgwMywweDA1LDB4MDB9LAorICAgIHsweDAzLDB4MDYsMHgxNn0sCisgICAgezB4MDMsMHgwNywweDAwfSwKKyAgICB7MHgwMywweDA4LDB4MDB9LAorICAgIHsweDAzLDB4MDksMHgwMH0sCisgICAgezB4MDMsMHgwQSwweDAwfSwKKyAgICB7MHgwMywweDBCLDB4ODB9LAorICAgIHsweDAzLDB4MEQsMHgwMH0sCisgICAgezB4MDMsMHgwRSwweDAwfSwKKyAgICB7MHgwMywweDBGLDB4MDB9LAorICAgIHsweDAzLDB4MTAsMHgwMH0sCisgICAgezB4MDMsMHgxMSwweDAwfSwKKyAgICB7MHgwMywweDEyLDB4MDB9LAorICAgIHsweDAzLDB4MTMsMHgwMH0sCisgICAgezB4MDMsMHgxNCwweDAwfSwKKyAgICB7MHgwMywweDE1LDB4MDB9LAorICAgIHsweDAzLDB4MTYsMHgwMH0sCisgICAgezB4MDMsMHgxOCwweDAwfSwKKyAgICB7MHgwMywweDE5LDB4MDB9LAorICAgIHsweDAzLDB4MUEsMHgwMH0sCisgICAgezB4MDMsMHgxQiwweDAwfSwKKyAgICB7MHgwMywweDFDLDB4MDB9LAorICAgIHsweDAzLDB4MUQsMHgwMH0sCisgICAgezB4MDMsMHgxRSwweDAwfSwKKyAgICB7MHgwMywweDFGLDB4MDB9LAorICAgIHsweDAzLDB4MjAsMHgwMH0sCisgICAgezB4MDMsMHgyMSwweDAwfSwKKyAgICB7MHgwMywweDIzLDB4MDB9LAorICAgIHsweDAzLDB4MjQsMHgwMH0sCisgICAgezB4MDMsMHgyNSwweDAwfSwKKyAgICB7MHgwMywweDI2LDB4MDB9LAorICAgIHsweDAzLDB4MjcsMHgwMH0sCisgICAgezB4MDMsMHgyOCwweDAwfSwKKyAgICB7MHgwMywweDI5LDB4MDB9LAorICAgIHsweDAzLDB4MkEsMHgwMH0sCisgICAgezB4MDMsMHgyQiwweDAwfSwKKyAgICB7MHgwMywweDJDLDB4MDB9LAorICAgIHsweDAzLDB4MkUsMHgwMH0sCisgICAgezB4MDMsMHgyRiwweDAwfSwKKyAgICB7MHgwMywweDMwLDB4MDB9LAorICAgIHsweDAzLDB4MzEsMHgwMH0sCisgICAgezB4MDMsMHgzMiwweDAwfSwKKyAgICB7MHgwMywweDMzLDB4MDB9LAorICAgIHsweDAzLDB4MzQsMHgwMH0sCisgICAgezB4MDMsMHgzNSwweDAwfSwKKyAgICB7MHgwMywweDM2LDB4MDB9LAorICAgIHsweDAzLDB4MzcsMHgwMH0sCisgICAgezB4MDMsMHgzOSwweDFGfSwKKyAgICB7MHgwMywweDNCLDB4MDB9LAorICAgIHsweDAzLDB4M0MsMHgwMH0sCisgICAgezB4MDMsMHgzRCwweDAwfSwKKyAgICB7MHgwMywweDNFLDB4MDB9LAorICAgIHsweDAzLDB4M0YsMHgwMH0sCisgICAgezB4MDMsMHg0MCwweDAwfSwKKyAgICB7MHgwMywweDQxLDB4MDB9LAorICAgIHsweDAzLDB4NDIsMHgwMH0sCisgICAgezB4MDMsMHg0MywweDAwfSwKKyAgICB7MHgwMywweDQ0LDB4MDB9LAorICAgIHsweDAzLDB4NDUsMHgwMH0sCisgICAgezB4MDMsMHg0NiwweDAwfSwKKyAgICB7MHgwMywweDQ3LDB4MDB9LAorICAgIHsweDAzLDB4NDgsMHgwMH0sCisgICAgezB4MDMsMHg0OSwweDAwfSwKKyAgICB7MHgwMywweDRBLDB4MDB9LAorICAgIHsweDAzLDB4NEIsMHgwMH0sCisgICAgezB4MDMsMHg0QywweDAwfSwKKyAgICB7MHgwMywweDRELDB4MDB9LAorICAgIHsweDAzLDB4NEUsMHgwMH0sCisgICAgezB4MDMsMHg0RiwweDAwfSwKKyAgICB7MHgwMywweDUwLDB4MDB9LAorICAgIHsweDAzLDB4NTEsMHgwMH0sCisgICAgezB4MDMsMHg1MiwweDAwfSwKKyAgICB7MHgwMywweDUzLDB4MDB9LAorICAgIHsweDAzLDB4NTQsMHgwMH0sCisgICAgezB4MDMsMHg1NSwweDAwfSwKKyAgICB7MHgwMywweDU2LDB4MDB9LAorICAgIHsweDAzLDB4NTcsMHgwMH0sCisgICAgezB4MDMsMHg1OCwweDAwfSwKKyAgICB7MHgwMywweDU5LDB4MDB9LAorICAgIHsweDAzLDB4NUEsMHgwMH0sCisgICAgezB4MDMsMHg1QiwweDAwfSwKKyAgICB7MHgwMywweDVDLDB4MDB9LAorICAgIHsweDAzLDB4NUQsMHgwMH0sCisgICAgezB4MDMsMHg1RSwweDAwfSwKKyAgICB7MHgwMywweDVGLDB4MDB9LAorICAgIHsweDAzLDB4NjAsMHgwMH0sCisgICAgezB4MDMsMHg2MSwweDAwfSwKKyAgICB7MHgwMywweDYyLDB4MDB9LAorICAgIHsweDA0LDB4ODcsMHgwMH0sCisgICAgezB4MDUsMHgwMiwweDAxfSwKKyAgICB7MHgwNSwweDA4LDB4MTR9LAorICAgIHsweDA1LDB4MDksMHgyMn0sCisgICAgezB4MDUsMHgwQSwweDBEfSwKKyAgICB7MHgwNSwweDBCLDB4MEN9LAorICAgIHsweDA1LDB4MEMsMHgwMX0sCisgICAgezB4MDUsMHgwRCwweDNGfSwKKyAgICB7MHgwNSwweDBFLDB4MTV9LAorICAgIHsweDA1LDB4MEYsMHgyNn0sCisgICAgezB4MDUsMHgxMCwweDBDfSwKKyAgICB7MHgwNSwweDExLDB4MEJ9LAorICAgIHsweDA1LDB4MTIsMHgwMX0sCisgICAgezB4MDUsMHgxMywweDNGfSwKKyAgICB7MHgwNSwweDE1LDB4MDB9LAorICAgIHsweDA1LDB4MTYsMHgwMH0sCisgICAgezB4MDUsMHgxNywweDAwfSwKKyAgICB7MHgwNSwweDE4LDB4REZ9LAorICAgIHsweDA1LDB4MTksMHgzOH0sCisgICAgezB4MDUsMHgxQSwweDAzfSwKKyAgICB7MHgwNSwweDFCLDB4MDB9LAorICAgIHsweDA1LDB4MUMsMHgwMH0sCisgICAgezB4MDUsMHgxRCwweDgwfSwKKyAgICB7MHgwNSwweDFFLDB4OTZ9LAorICAgIHsweDA1LDB4MUYsMHg5OH0sCisgICAgezB4MDUsMHgyMSwweDMzfSwKKyAgICB7MHgwNSwweDJBLDB4MDF9LAorICAgIHsweDA1LDB4MkIsMHgwMX0sCisgICAgezB4MDUsMHgyQywweDBGfSwKKyAgICB7MHgwNSwweDJELDB4MDN9LAorICAgIHsweDA1LDB4MkUsMHgxOX0sCisgICAgezB4MDUsMHgyRiwweDE5fSwKKyAgICB7MHgwNSwweDMxLDB4MDB9LAorICAgIHsweDA1LDB4MzIsMHg0Qn0sCisgICAgezB4MDUsMHgzMywweDAzfSwKKyAgICB7MHgwNSwweDM0LDB4MDB9LAorICAgIHsweDA1LDB4MzYsMHgwQ30sCisgICAgezB4MDUsMHgzNywweDAwfSwKKyAgICB7MHgwNSwweDM4LDB4MDF9LAorICAgIHsweDA1LDB4MzksMHgwMH0sCisgICAgezB4MDksMHgwRSwweDAyfSwKKyAgICB7MHgwOSwweDQzLDB4MDF9LAorICAgIHsweDA5LDB4NDksMHgwMX0sCisgICAgezB4MDksMHg0QSwweDAxfSwKKyAgICB7MHgwQSwweDAyLDB4MDB9LAorICAgIHsweDBBLDB4MDMsMHgwMX0sCisgICAgezB4MEEsMHgwNCwweDAxfSwKKyAgICB7MHgwQSwweDA1LDB4MDF9LAorICAgIHsweDBCLDB4NDQsMHgwRn0sCisgICAgezB4MEIsMHg0NiwweDAwfSwKKyAgICB7MHgwQiwweDQ3LDB4MDB9LAorICAgIHsweDBCLDB4NDgsMHgwRX0sCisgICAgezB4MEIsMHg0QSwweDFFfSwKKyAgICB7MHgwNSwweDE0LDB4MDF9LAorICAgIHsweDAwLDB4MUMsMHgwMX0sCisgICAgezB4MEIsMHgyNCwweERCfSwKKyAgICB7MHgwQiwweDI1LDB4MDJ9Cit9OworCitzdGF0aWMgZHBsbF9jb21tYW5kIGVwb25fZHBsbF90YWJsZVtdID0KK3sKKyAgICB7MHgwQiwweDI0LDB4RDh9LAorICAgIHsweDBCLDB4MjUsMHgwMH0sCisgICAgezB4MDAsMHgwQiwweDY4fSwKKyAgICB7MHgwMCwweDE2LDB4MDJ9LAorICAgIHsweDAwLDB4MTcsMHgxQ30sCisgICAgezB4MDAsMHgxOCwweEVFfSwKKyAgICB7MHgwMCwweDE5LDB4RER9LAorICAgIHsweDAwLDB4MUEsMHhERn0sCisgICAgezB4MDAsMHgyQiwweDAyfSwKKyAgICB7MHgwMCwweDJDLDB4MDF9LAorICAgIHsweDAwLDB4MkQsMHgwMX0sCisgICAgezB4MDAsMHgyRSwweDcwfSwKKyAgICB7MHgwMCwweDJGLDB4MDB9LAorICAgIHsweDAwLDB4MzAsMHgwMH0sCisgICAgezB4MDAsMHgzMSwweDAwfSwKKyAgICB7MHgwMCwweDMyLDB4MDB9LAorICAgIHsweDAwLDB4MzMsMHgwMH0sCisgICAgezB4MDAsMHgzNCwweDAwfSwKKyAgICB7MHgwMCwweDM1LDB4MDB9LAorICAgIHsweDAwLDB4MzYsMHg3MH0sCisgICAgezB4MDAsMHgzNywweDAwfSwKKyAgICB7MHgwMCwweDM4LDB4MDB9LAorICAgIHsweDAwLDB4MzksMHgwMH0sCisgICAgezB4MDAsMHgzQSwweDAwfSwKKyAgICB7MHgwMCwweDNCLDB4MDB9LAorICAgIHsweDAwLDB4M0MsMHgwMH0sCisgICAgezB4MDAsMHgzRCwweDAwfSwKKyAgICB7MHgwMCwweDNGLDB4MTF9LAorICAgIHsweDAwLDB4NDAsMHgwNH0sCisgICAgezB4MDAsMHg0MSwweDBFfSwKKyAgICB7MHgwMCwweDQyLDB4MDB9LAorICAgIHsweDAwLDB4NDMsMHgwMH0sCisgICAgezB4MDAsMHg0NCwweDAwfSwKKyAgICB7MHgwMCwweDQ1LDB4MEN9LAorICAgIHsweDAwLDB4NDYsMHgzMn0sCisgICAgezB4MDAsMHg0NywweDAwfSwKKyAgICB7MHgwMCwweDQ4LDB4MDB9LAorICAgIHsweDAwLDB4NDksMHgwMH0sCisgICAgezB4MDAsMHg0QSwweDMyfSwKKyAgICB7MHgwMCwweDRCLDB4MDB9LAorICAgIHsweDAwLDB4NEMsMHgwMH0sCisgICAgezB4MDAsMHg0RCwweDAwfSwKKyAgICB7MHgwMCwweDRFLDB4MDV9LAorICAgIHsweDAwLDB4NEYsMHgwMH0sCisgICAgezB4MDAsMHg1MSwweDAzfSwKKyAgICB7MHgwMCwweDUyLDB4MDB9LAorICAgIHsweDAwLDB4NTMsMHgwMH0sCisgICAgezB4MDAsMHg1NCwweDAwfSwKKyAgICB7MHgwMCwweDU1LDB4MDN9LAorICAgIHsweDAwLDB4NTYsMHgwMH0sCisgICAgezB4MDAsMHg1NywweDAwfSwKKyAgICB7MHgwMCwweDU4LDB4MDB9LAorICAgIHsweDAwLDB4NTksMHgwM30sCisgICAgezB4MDAsMHg1QSwweDU1fSwKKyAgICB7MHgwMCwweDVCLDB4NTV9LAorICAgIHsweDAwLDB4NUMsMHhEMH0sCisgICAgezB4MDAsMHg1RCwweDAwfSwKKyAgICB7MHgwMCwweDVFLDB4MDB9LAorICAgIHsweDAwLDB4NUYsMHgwMH0sCisgICAgezB4MDAsMHg2MCwweDAwfSwKKyAgICB7MHgwMCwweDYxLDB4MDB9LAorICAgIHsweDAwLDB4NjIsMHgwMH0sCisgICAgezB4MDAsMHg2MywweDAwfSwKKyAgICB7MHgwMCwweDY0LDB4MDB9LAorICAgIHsweDAwLDB4NjUsMHgwMH0sCisgICAgezB4MDAsMHg2NiwweDAwfSwKKyAgICB7MHgwMCwweDY3LDB4MDB9LAorICAgIHsweDAwLDB4NjgsMHgwMH0sCisgICAgezB4MDAsMHg2OSwweDAwfSwKKyAgICB7MHgwMCwweDkyLDB4MDB9LAorICAgIHsweDAwLDB4OTMsMHgwMH0sCisgICAgezB4MDAsMHg5NSwweDAwfSwKKyAgICB7MHgwMCwweDk2LDB4MDB9LAorICAgIHsweDAwLDB4OTgsMHgwMH0sCisgICAgezB4MDAsMHg5QSwweDAyfSwKKyAgICB7MHgwMCwweDlCLDB4MTB9LAorICAgIHsweDAwLDB4OUQsMHgwMH0sCisgICAgezB4MDAsMHg5RSwweDIwfSwKKyAgICB7MHgwMCwweEEwLDB4MDB9LAorICAgIHsweDAwLDB4QTIsMHgwMn0sCisgICAgezB4MDAsMHhBOCwweDFFfSwKKyAgICB7MHgwMCwweEE5LDB4OTR9LAorICAgIHsweDAwLDB4QUEsMHgxMH0sCisgICAgezB4MDAsMHhBQiwweDAwfSwKKyAgICB7MHgwMCwweEFDLDB4MDB9LAorICAgIHsweDAxLDB4MDIsMHgwMX0sCisgICAgezB4MDEsMHgwOCwweDA2fSwKKyAgICB7MHgwMSwweDA5LDB4MDl9LAorICAgIHsweDAxLDB4MEEsMHg2Qn0sCisgICAgezB4MDEsMHgwQiwweDAwfSwKKyAgICB7MHgwMSwweDBELDB4MDF9LAorICAgIHsweDAxLDB4MEUsMHgwOX0sCisgICAgezB4MDEsMHgwRiwweDNCfSwKKyAgICB7MHgwMSwweDEwLDB4MDB9LAorICAgIHsweDAxLDB4MTIsMHgwNn0sCisgICAgezB4MDEsMHgxMywweDA5fSwKKyAgICB7MHgwMSwweDE0LDB4NkJ9LAorICAgIHsweDAxLDB4MTUsMHgwMH0sCisgICAgezB4MDEsMHgxNywweDAxfSwKKyAgICB7MHgwMSwweDE4LDB4MDl9LAorICAgIHsweDAxLDB4MTksMHgzQn0sCisgICAgezB4MDEsMHgxQSwweDAwfSwKKyAgICB7MHgwMSwweDFDLDB4MDZ9LAorICAgIHsweDAxLDB4MUQsMHgwOX0sCisgICAgezB4MDEsMHgxRSwweDZCfSwKKyAgICB7MHgwMSwweDFGLDB4MDB9LAorICAgIHsweDAxLDB4MjEsMHgwMX0sCisgICAgezB4MDEsMHgyMiwweDA5fSwKKyAgICB7MHgwMSwweDIzLDB4M0J9LAorICAgIHsweDAxLDB4MjQsMHgwMH0sCisgICAgezB4MDEsMHgyNiwweDA2fSwKKyAgICB7MHgwMSwweDI3LDB4MDl9LAorICAgIHsweDAxLDB4MjgsMHg2Qn0sCisgICAgezB4MDEsMHgyOSwweDAwfSwKKyAgICB7MHgwMSwweDJCLDB4MDF9LAorICAgIHsweDAxLDB4MkMsMHgwOX0sCisgICAgezB4MDEsMHgyRCwweDNCfSwKKyAgICB7MHgwMSwweDJFLDB4MDB9LAorICAgIHsweDAxLDB4MzAsMHgwNn0sCisgICAgezB4MDEsMHgzMSwweDA5fSwKKyAgICB7MHgwMSwweDMyLDB4NkJ9LAorICAgIHsweDAxLDB4MzMsMHgwMH0sCisgICAgezB4MDEsMHgzQSwweDA2fSwKKyAgICB7MHgwMSwweDNCLDB4Q0N9LAorICAgIHsweDAxLDB4M0MsMHgwMH0sCisgICAgezB4MDEsMHgzRCwweDAwfSwKKyAgICB7MHgwMSwweDNGLDB4MDB9LAorICAgIHsweDAxLDB4NDAsMHgwMH0sCisgICAgezB4MDEsMHg0MSwweDQwfSwKKyAgICB7MHgwMSwweDQyLDB4RkZ9LAorICAgIHsweDAyLDB4MDIsMHgwMH0sCisgICAgezB4MDIsMHgwMywweDAwfSwKKyAgICB7MHgwMiwweDA0LDB4MDB9LAorICAgIHsweDAyLDB4MDUsMHgwMH0sCisgICAgezB4MDIsMHgwNiwweDAwfSwKKyAgICB7MHgwMiwweDA4LDB4NEZ9LAorICAgIHsweDAyLDB4MDksMHgwMH0sCisgICAgezB4MDIsMHgwQSwweDAwfSwKKyAgICB7MHgwMiwweDBCLDB4MDB9LAorICAgIHsweDAyLDB4MEMsMHgwMH0sCisgICAgezB4MDIsMHgwRCwweDAwfSwKKyAgICB7MHgwMiwweDBFLDB4MDF9LAorICAgIHsweDAyLDB4MEYsMHgwMH0sCisgICAgezB4MDIsMHgxMCwweDAwfSwKKyAgICB7MHgwMiwweDExLDB4MDB9LAorICAgIHsweDAyLDB4MTIsMHgwMH0sCisgICAgezB4MDIsMHgxMywweDAwfSwKKyAgICB7MHgwMiwweDE0LDB4MDB9LAorICAgIHsweDAyLDB4MTUsMHgwMH0sCisgICAgezB4MDIsMHgxNiwweDAwfSwKKyAgICB7MHgwMiwweDE3LDB4MDB9LAorICAgIHsweDAyLDB4MTgsMHgwMH0sCisgICAgezB4MDIsMHgxOSwweDAwfSwKKyAgICB7MHgwMiwweDFBLDB4MDB9LAorICAgIHsweDAyLDB4MUIsMHgwMH0sCisgICAgezB4MDIsMHgxQywweDAwfSwKKyAgICB7MHgwMiwweDFELDB4MDB9LAorICAgIHsweDAyLDB4MUUsMHgwMH0sCisgICAgezB4MDIsMHgxRiwweDAwfSwKKyAgICB7MHgwMiwweDIwLDB4MDB9LAorICAgIHsweDAyLDB4MjEsMHgwMH0sCisgICAgezB4MDIsMHgyMiwweDAwfSwKKyAgICB7MHgwMiwweDIzLDB4MDB9LAorICAgIHsweDAyLDB4MjQsMHgwMH0sCisgICAgezB4MDIsMHgyNSwweDAwfSwKKyAgICB7MHgwMiwweDI2LDB4MDB9LAorICAgIHsweDAyLDB4MjcsMHgwMH0sCisgICAgezB4MDIsMHgyOCwweDAwfSwKKyAgICB7MHgwMiwweDI5LDB4MDB9LAorICAgIHsweDAyLDB4MkEsMHgwMH0sCisgICAgezB4MDIsMHgyQiwweDAwfSwKKyAgICB7MHgwMiwweDJDLDB4MDB9LAorICAgIHsweDAyLDB4MkQsMHgwMH0sCisgICAgezB4MDIsMHgyRSwweDAwfSwKKyAgICB7MHgwMiwweDJGLDB4MDB9LAorICAgIHsweDAyLDB4MzEsMHgwM30sCisgICAgezB4MDIsMHgzMiwweDAzfSwKKyAgICB7MHgwMiwweDMzLDB4MDN9LAorICAgIHsweDAyLDB4MzQsMHgwM30sCisgICAgezB4MDIsMHgzNSwweDAwfSwKKyAgICB7MHgwMiwweDM2LDB4MDB9LAorICAgIHsweDAyLDB4MzcsMHgwMH0sCisgICAgezB4MDIsMHgzOCwweEQ4fSwKKyAgICB7MHgwMiwweDM5LDB4RDZ9LAorICAgIHsweDAyLDB4M0EsMHgwMH0sCisgICAgezB4MDIsMHgzQiwweDAwfSwKKyAgICB7MHgwMiwweDNDLDB4MDB9LAorICAgIHsweDAyLDB4M0QsMHgwMH0sCisgICAgezB4MDIsMHgzRSwweEMwfSwKKyAgICB7MHgwMiwweDRBLDB4MDB9LAorICAgIHsweDAyLDB4NEIsMHgwMH0sCisgICAgezB4MDIsMHg0QywweDAwfSwKKyAgICB7MHgwMiwweDRELDB4MDB9LAorICAgIHsweDAyLDB4NEUsMHgwMH0sCisgICAgezB4MDIsMHg0RiwweDAwfSwKKyAgICB7MHgwMiwweDUwLDB4MDB9LAorICAgIHsweDAyLDB4NTEsMHgwMH0sCisgICAgezB4MDIsMHg1MiwweDAwfSwKKyAgICB7MHgwMiwweDUzLDB4MDB9LAorICAgIHsweDAyLDB4NTQsMHgwMH0sCisgICAgezB4MDIsMHg1NSwweDAwfSwKKyAgICB7MHgwMiwweDU2LDB4MDB9LAorICAgIHsweDAyLDB4NTcsMHgwMH0sCisgICAgezB4MDIsMHg1OCwweDAwfSwKKyAgICB7MHgwMiwweDU5LDB4MDB9LAorICAgIHsweDAyLDB4NUEsMHgwMH0sCisgICAgezB4MDIsMHg1QiwweDAwfSwKKyAgICB7MHgwMiwweDVDLDB4MDB9LAorICAgIHsweDAyLDB4NUQsMHgwMH0sCisgICAgezB4MDIsMHg1RSwweDAwfSwKKyAgICB7MHgwMiwweDVGLDB4MDB9LAorICAgIHsweDAyLDB4NjAsMHgwMH0sCisgICAgezB4MDIsMHg2MSwweDAwfSwKKyAgICB7MHgwMiwweDYyLDB4MDB9LAorICAgIHsweDAyLDB4NjMsMHgwMH0sCisgICAgezB4MDIsMHg2NCwweDAwfSwKKyAgICB7MHgwMiwweDY4LDB4MDB9LAorICAgIHsweDAyLDB4NjksMHgwMH0sCisgICAgezB4MDIsMHg2QSwweDAwfSwKKyAgICB7MHgwMiwweDZCLDB4NDV9LAorICAgIHsweDAyLDB4NkMsMHg1MH0sCisgICAgezB4MDIsMHg2RCwweDRGfSwKKyAgICB7MHgwMiwweDZFLDB4NEV9LAorICAgIHsweDAyLDB4NkYsMHg1Rn0sCisgICAgezB4MDIsMHg3MCwweDQzfSwKKyAgICB7MHgwMiwweDcxLDB4NEN9LAorICAgIHsweDAyLDB4NzIsMHg0Qn0sCisgICAgezB4MDMsMHgwMiwweDAwfSwKKyAgICB7MHgwMywweDAzLDB4MDB9LAorICAgIHsweDAzLDB4MDQsMHgwMH0sCisgICAgezB4MDMsMHgwNSwweDAwfSwKKyAgICB7MHgwMywweDA2LDB4MTZ9LAorICAgIHsweDAzLDB4MDcsMHgwMH0sCisgICAgezB4MDMsMHgwOCwweDAwfSwKKyAgICB7MHgwMywweDA5LDB4MDB9LAorICAgIHsweDAzLDB4MEEsMHgwMH0sCisgICAgezB4MDMsMHgwQiwweDgwfSwKKyAgICB7MHgwMywweDBELDB4MDB9LAorICAgIHsweDAzLDB4MEUsMHgwMH0sCisgICAgezB4MDMsMHgwRiwweDAwfSwKKyAgICB7MHgwMywweDEwLDB4MDB9LAorICAgIHsweDAzLDB4MTEsMHgwMH0sCisgICAgezB4MDMsMHgxMiwweDAwfSwKKyAgICB7MHgwMywweDEzLDB4MDB9LAorICAgIHsweDAzLDB4MTQsMHgwMH0sCisgICAgezB4MDMsMHgxNSwweDAwfSwKKyAgICB7MHgwMywweDE2LDB4MDB9LAorICAgIHsweDAzLDB4MTgsMHgwMH0sCisgICAgezB4MDMsMHgxOSwweDAwfSwKKyAgICB7MHgwMywweDFBLDB4MDB9LAorICAgIHsweDAzLDB4MUIsMHgwMH0sCisgICAgezB4MDMsMHgxQywweDAwfSwKKyAgICB7MHgwMywweDFELDB4MDB9LAorICAgIHsweDAzLDB4MUUsMHgwMH0sCisgICAgezB4MDMsMHgxRiwweDAwfSwKKyAgICB7MHgwMywweDIwLDB4MDB9LAorICAgIHsweDAzLDB4MjEsMHgwMH0sCisgICAgezB4MDMsMHgyMywweDAwfSwKKyAgICB7MHgwMywweDI0LDB4MDB9LAorICAgIHsweDAzLDB4MjUsMHgwMH0sCisgICAgezB4MDMsMHgyNiwweDAwfSwKKyAgICB7MHgwMywweDI3LDB4MDB9LAorICAgIHsweDAzLDB4MjgsMHgwMH0sCisgICAgezB4MDMsMHgyOSwweDAwfSwKKyAgICB7MHgwMywweDJBLDB4MDB9LAorICAgIHsweDAzLDB4MkIsMHgwMH0sCisgICAgezB4MDMsMHgyQywweDAwfSwKKyAgICB7MHgwMywweDJFLDB4MDB9LAorICAgIHsweDAzLDB4MkYsMHgwMH0sCisgICAgezB4MDMsMHgzMCwweDAwfSwKKyAgICB7MHgwMywweDMxLDB4MDB9LAorICAgIHsweDAzLDB4MzIsMHgwMH0sCisgICAgezB4MDMsMHgzMywweDAwfSwKKyAgICB7MHgwMywweDM0LDB4MDB9LAorICAgIHsweDAzLDB4MzUsMHgwMH0sCisgICAgezB4MDMsMHgzNiwweDAwfSwKKyAgICB7MHgwMywweDM3LDB4MDB9LAorICAgIHsweDAzLDB4MzksMHgxRn0sCisgICAgezB4MDMsMHgzQiwweDAwfSwKKyAgICB7MHgwMywweDNDLDB4MDB9LAorICAgIHsweDAzLDB4M0QsMHgwMH0sCisgICAgezB4MDMsMHgzRSwweDAwfSwKKyAgICB7MHgwMywweDNGLDB4MDB9LAorICAgIHsweDAzLDB4NDAsMHgwMH0sCisgICAgezB4MDMsMHg0MSwweDAwfSwKKyAgICB7MHgwMywweDQyLDB4MDB9LAorICAgIHsweDAzLDB4NDMsMHgwMH0sCisgICAgezB4MDMsMHg0NCwweDAwfSwKKyAgICB7MHgwMywweDQ1LDB4MDB9LAorICAgIHsweDAzLDB4NDYsMHgwMH0sCisgICAgezB4MDMsMHg0NywweDAwfSwKKyAgICB7MHgwMywweDQ4LDB4MDB9LAorICAgIHsweDAzLDB4NDksMHgwMH0sCisgICAgezB4MDMsMHg0QSwweDAwfSwKKyAgICB7MHgwMywweDRCLDB4MDB9LAorICAgIHsweDAzLDB4NEMsMHgwMH0sCisgICAgezB4MDMsMHg0RCwweDAwfSwKKyAgICB7MHgwMywweDRFLDB4MDB9LAorICAgIHsweDAzLDB4NEYsMHgwMH0sCisgICAgezB4MDMsMHg1MCwweDAwfSwKKyAgICB7MHgwMywweDUxLDB4MDB9LAorICAgIHsweDAzLDB4NTIsMHgwMH0sCisgICAgezB4MDMsMHg1MywweDAwfSwKKyAgICB7MHgwMywweDU0LDB4MDB9LAorICAgIHsweDAzLDB4NTUsMHgwMH0sCisgICAgezB4MDMsMHg1NiwweDAwfSwKKyAgICB7MHgwMywweDU3LDB4MDB9LAorICAgIHsweDAzLDB4NTgsMHgwMH0sCisgICAgezB4MDMsMHg1OSwweDAwfSwKKyAgICB7MHgwMywweDVBLDB4MDB9LAorICAgIHsweDAzLDB4NUIsMHgwMH0sCisgICAgezB4MDMsMHg1QywweDAwfSwKKyAgICB7MHgwMywweDVELDB4MDB9LAorICAgIHsweDAzLDB4NUUsMHgwMH0sCisgICAgezB4MDMsMHg1RiwweDAwfSwKKyAgICB7MHgwMywweDYwLDB4MDB9LAorICAgIHsweDAzLDB4NjEsMHgwMH0sCisgICAgezB4MDMsMHg2MiwweDAwfSwKKyAgICB7MHgwNCwweDg3LDB4MDB9LAorICAgIHsweDA1LDB4MDIsMHgwMX0sCisgICAgezB4MDUsMHgwOCwweDE0fSwKKyAgICB7MHgwNSwweDA5LDB4MjJ9LAorICAgIHsweDA1LDB4MEEsMHgwRH0sCisgICAgezB4MDUsMHgwQiwweDBDfSwKKyAgICB7MHgwNSwweDBDLDB4MDF9LAorICAgIHsweDA1LDB4MEQsMHgzRn0sCisgICAgezB4MDUsMHgwRSwweDE1fSwKKyAgICB7MHgwNSwweDBGLDB4MjZ9LAorICAgIHsweDA1LDB4MTAsMHgwQ30sCisgICAgezB4MDUsMHgxMSwweDBCfSwKKyAgICB7MHgwNSwweDEyLDB4MDF9LAorICAgIHsweDA1LDB4MTMsMHgzRn0sCisgICAgezB4MDUsMHgxNSwweDAwfSwKKyAgICB7MHgwNSwweDE2LDB4MDB9LAorICAgIHsweDA1LDB4MTcsMHgwMH0sCisgICAgezB4MDUsMHgxOCwweDAwfSwKKyAgICB7MHgwNSwweDE5LDB4NjV9LAorICAgIHsweDA1LDB4MUEsMHgwM30sCisgICAgezB4MDUsMHgxQiwweDAwfSwKKyAgICB7MHgwNSwweDFDLDB4MDB9LAorICAgIHsweDA1LDB4MUQsMHgwMH0sCisgICAgezB4MDUsMHgxRSwweDAwfSwKKyAgICB7MHgwNSwweDFGLDB4QTB9LAorICAgIHsweDA1LDB4MjEsMHgzM30sCisgICAgezB4MDUsMHgyQSwweDAxfSwKKyAgICB7MHgwNSwweDJCLDB4MDF9LAorICAgIHsweDA1LDB4MkMsMHgwRn0sCisgICAgezB4MDUsMHgyRCwweDAzfSwKKyAgICB7MHgwNSwweDJFLDB4MTl9LAorICAgIHsweDA1LDB4MkYsMHgxOX0sCisgICAgezB4MDUsMHgzMSwweDAwfSwKKyAgICB7MHgwNSwweDMyLDB4NEJ9LAorICAgIHsweDA1LDB4MzMsMHgwM30sCisgICAgezB4MDUsMHgzNCwweDAwfSwKKyAgICB7MHgwNSwweDM2LDB4MEN9LAorICAgIHsweDA1LDB4MzcsMHgwMH0sCisgICAgezB4MDUsMHgzOCwweDAxfSwKKyAgICB7MHgwNSwweDM5LDB4MDB9LAorICAgIHsweDA5LDB4MEUsMHgwMn0sCisgICAgezB4MDksMHg0MywweDAxfSwKKyAgICB7MHgwOSwweDQ5LDB4MDF9LAorICAgIHsweDA5LDB4NEEsMHgwMX0sCisgICAgezB4MEEsMHgwMiwweDAwfSwKKyAgICB7MHgwQSwweDAzLDB4MDF9LAorICAgIHsweDBBLDB4MDQsMHgwMX0sCisgICAgezB4MEEsMHgwNSwweDAxfSwKKyAgICB7MHgwQiwweDQ0LDB4MEZ9LAorICAgIHsweDBCLDB4NDYsMHgwMH0sCisgICAgezB4MEIsMHg0NywweDAwfSwKKyAgICB7MHgwQiwweDQ4LDB4MEV9LAorICAgIHsweDBCLDB4NEEsMHgxRX0sCisgICAgezB4MDUsMHgxNCwweDAxfSwKKyAgICB7MHgwMCwweDFDLDB4MDF9LAorICAgIHsweDBCLDB4MjQsMHhEQn0sCisgICAgezB4MEIsMHgyNSwweDAyfQorfTsKKworc3RhdGljIGRwbGxfY29tbWFuZCBncG9uX3N5bmNlX2RwbGxfdGFibGVbXSA9Cit7CisgICAgezB4MEIsMHgyNCwweEQ4fSwKKyAgICB7MHgwQiwweDI1LDB4MDB9LAorICAgIHsweDAwLDB4MEIsMHg2OH0sCisgICAgezB4MDAsMHgxNiwweDAyfSwKKyAgICB7MHgwMCwweDE3LDB4MUN9LAorICAgIHsweDAwLDB4MTgsMHhDQ30sCisgICAgezB4MDAsMHgxOSwweEREfSwKKyAgICB7MHgwMCwweDFBLDB4REZ9LAorICAgIHsweDAwLDB4MkIsMHgwMn0sCisgICAgezB4MDAsMHgyQywweDAzfSwKKyAgICB7MHgwMCwweDJELDB4MDV9LAorICAgIHsweDAwLDB4MkUsMHg2RX0sCisgICAgezB4MDAsMHgyRiwweDAwfSwKKyAgICB7MHgwMCwweDMwLDB4Mzd9LAorICAgIHsweDAwLDB4MzEsMHgwMH0sCisgICAgezB4MDAsMHgzMiwweDAwfSwKKyAgICB7MHgwMCwweDMzLDB4MDB9LAorICAgIHsweDAwLDB4MzQsMHgwMH0sCisgICAgezB4MDAsMHgzNSwweDAwfSwKKyAgICB7MHgwMCwweDM2LDB4NkV9LAorICAgIHsweDAwLDB4MzcsMHgwMH0sCisgICAgezB4MDAsMHgzOCwweDM3fSwKKyAgICB7MHgwMCwweDM5LDB4MDB9LAorICAgIHsweDAwLDB4M0EsMHgwMH0sCisgICAgezB4MDAsMHgzQiwweDAwfSwKKyAgICB7MHgwMCwweDNDLDB4MDB9LAorICAgIHsweDAwLDB4M0QsMHgwMH0sCisgICAgezB4MDAsMHgzRiwweDMzfSwKKyAgICB7MHgwMCwweDQwLDB4MDR9LAorICAgIHsweDAwLDB4NDEsMHgwRX0sCisgICAgezB4MDAsMHg0MiwweDBBfSwKKyAgICB7MHgwMCwweDQzLDB4MDB9LAorICAgIHsweDAwLDB4NDQsMHgwMH0sCisgICAgezB4MDAsMHg0NSwweDBDfSwKKyAgICB7MHgwMCwweDQ2LDB4MzJ9LAorICAgIHsweDAwLDB4NDcsMHgzMn0sCisgICAgezB4MDAsMHg0OCwweDAwfSwKKyAgICB7MHgwMCwweDQ5LDB4MDB9LAorICAgIHsweDAwLDB4NEEsMHgzMn0sCisgICAgezB4MDAsMHg0QiwweDMyfSwKKyAgICB7MHgwMCwweDRDLDB4MDB9LAorICAgIHsweDAwLDB4NEQsMHgwMH0sCisgICAgezB4MDAsMHg0RSwweDU1fSwKKyAgICB7MHgwMCwweDRGLDB4MDB9LAorICAgIHsweDAwLDB4NTEsMHgwM30sCisgICAgezB4MDAsMHg1MiwweDAzfSwKKyAgICB7MHgwMCwweDUzLDB4MDB9LAorICAgIHsweDAwLDB4NTQsMHgwMH0sCisgICAgezB4MDAsMHg1NSwweDAzfSwKKyAgICB7MHgwMCwweDU2LDB4MDN9LAorICAgIHsweDAwLDB4NTcsMHgwMH0sCisgICAgezB4MDAsMHg1OCwweDAwfSwKKyAgICB7MHgwMCwweDU5LDB4MEZ9LAorICAgIHsweDAwLDB4NUEsMHg1NX0sCisgICAgezB4MDAsMHg1QiwweDU1fSwKKyAgICB7MHgwMCwweDVDLDB4RDB9LAorICAgIHsweDAwLDB4NUQsMHgwMH0sCisgICAgezB4MDAsMHg1RSwweDU1fSwKKyAgICB7MHgwMCwweDVGLDB4NTV9LAorICAgIHsweDAwLDB4NjAsMHhENX0sCisgICAgezB4MDAsMHg2MSwweDAwfSwKKyAgICB7MHgwMCwweDYyLDB4MDB9LAorICAgIHsweDAwLDB4NjMsMHgwMH0sCisgICAgezB4MDAsMHg2NCwweDAwfSwKKyAgICB7MHgwMCwweDY1LDB4MDB9LAorICAgIHsweDAwLDB4NjYsMHgwMH0sCisgICAgezB4MDAsMHg2NywweDAwfSwKKyAgICB7MHgwMCwweDY4LDB4MDB9LAorICAgIHsweDAwLDB4NjksMHgwMH0sCisgICAgezB4MDAsMHg5MiwweDAwfSwKKyAgICB7MHgwMCwweDkzLDB4MDB9LAorICAgIHsweDAwLDB4OTUsMHgwMH0sCisgICAgezB4MDAsMHg5NiwweDAwfSwKKyAgICB7MHgwMCwweDk4LDB4MDB9LAorICAgIHsweDAwLDB4OUEsMHgwMn0sCisgICAgezB4MDAsMHg5QiwweDAwfSwKKyAgICB7MHgwMCwweDlELDB4MDB9LAorICAgIHsweDAwLDB4OUUsMHg2MH0sCisgICAgezB4MDAsMHhBMCwweDQwfSwKKyAgICB7MHgwMCwweEEyLDB4MDJ9LAorICAgIHsweDAwLDB4QTgsMHhCN30sCisgICAgezB4MDAsMHhBOSwweDI4fSwKKyAgICB7MHgwMCwweEFBLDB4MTB9LAorICAgIHsweDAwLDB4QUIsMHgwMH0sCisgICAgezB4MDAsMHhBQywweDAwfSwKKyAgICB7MHgwMSwweDAyLDB4MDF9LAorICAgIHsweDAxLDB4MDgsMHgwNn0sCisgICAgezB4MDEsMHgwOSwweDA5fSwKKyAgICB7MHgwMSwweDBBLDB4NkJ9LAorICAgIHsweDAxLDB4MEIsMHgwMH0sCisgICAgezB4MDEsMHgwRCwweDAxfSwKKyAgICB7MHgwMSwweDBFLDB4MDl9LAorICAgIHsweDAxLDB4MEYsMHgzQn0sCisgICAgezB4MDEsMHgxMCwweDAwfSwKKyAgICB7MHgwMSwweDEyLDB4MDZ9LAorICAgIHsweDAxLDB4MTMsMHgwOX0sCisgICAgezB4MDEsMHgxNCwweDZCfSwKKyAgICB7MHgwMSwweDE1LDB4MDB9LAorICAgIHsweDAxLDB4MTcsMHgwMX0sCisgICAgezB4MDEsMHgxOCwweDA5fSwKKyAgICB7MHgwMSwweDE5LDB4M0J9LAorICAgIHsweDAxLDB4MUEsMHgwMH0sCisgICAgezB4MDEsMHgxQywweDA2fSwKKyAgICB7MHgwMSwweDFELDB4MDl9LAorICAgIHsweDAxLDB4MUUsMHg2Qn0sCisgICAgezB4MDEsMHgxRiwweDAwfSwKKyAgICB7MHgwMSwweDIxLDB4MDF9LAorICAgIHsweDAxLDB4MjIsMHgwOX0sCisgICAgezB4MDEsMHgyMywweDNCfSwKKyAgICB7MHgwMSwweDI0LDB4MDB9LAorICAgIHsweDAxLDB4MjYsMHgwNn0sCisgICAgezB4MDEsMHgyNywweDA5fSwKKyAgICB7MHgwMSwweDI4LDB4NkJ9LAorICAgIHsweDAxLDB4MjksMHgwMH0sCisgICAgezB4MDEsMHgyQiwweDAxfSwKKyAgICB7MHgwMSwweDJDLDB4MDl9LAorICAgIHsweDAxLDB4MkQsMHgzQn0sCisgICAgezB4MDEsMHgyRSwweDAwfSwKKyAgICB7MHgwMSwweDMwLDB4MDZ9LAorICAgIHsweDAxLDB4MzEsMHgwOX0sCisgICAgezB4MDEsMHgzMiwweDZCfSwKKyAgICB7MHgwMSwweDMzLDB4MDB9LAorICAgIHsweDAxLDB4M0EsMHgwNn0sCisgICAgezB4MDEsMHgzQiwweENDfSwKKyAgICB7MHgwMSwweDNDLDB4MDB9LAorICAgIHsweDAxLDB4M0QsMHgwMH0sCisgICAgezB4MDEsMHgzRiwweDAwfSwKKyAgICB7MHgwMSwweDQwLDB4MDB9LAorICAgIHsweDAxLDB4NDEsMHg0MH0sCisgICAgezB4MDEsMHg0MiwweEZGfSwKKyAgICB7MHgwMiwweDAyLDB4MDB9LAorICAgIHsweDAyLDB4MDMsMHgwMH0sCisgICAgezB4MDIsMHgwNCwweDAwfSwKKyAgICB7MHgwMiwweDA1LDB4MDB9LAorICAgIHsweDAyLDB4MDYsMHgwMH0sCisgICAgezB4MDIsMHgwOCwweERCfSwKKyAgICB7MHgwMiwweDA5LDB4MUF9LAorICAgIHsweDAyLDB4MEEsMHgwMH0sCisgICAgezB4MDIsMHgwQiwweEM0fSwKKyAgICB7MHgwMiwweDBDLDB4MDl9LAorICAgIHsweDAyLDB4MEQsMHgwMH0sCisgICAgezB4MDIsMHgwRSwweDAwfSwKKyAgICB7MHgwMiwweDBGLDB4MDB9LAorICAgIHsweDAyLDB4MTAsMHgwMH0sCisgICAgezB4MDIsMHgxMSwweDIwfSwKKyAgICB7MHgwMiwweDEyLDB4Mzd9LAorICAgIHsweDAyLDB4MTMsMHgwMH0sCisgICAgezB4MDIsMHgxNCwweDAwfSwKKyAgICB7MHgwMiwweDE1LDB4MTR9LAorICAgIHsweDAyLDB4MTYsMHgwMH0sCisgICAgezB4MDIsMHgxNywweDAwfSwKKyAgICB7MHgwMiwweDE4LDB4MDB9LAorICAgIHsweDAyLDB4MTksMHgwMH0sCisgICAgezB4MDIsMHgxQSwweDAwfSwKKyAgICB7MHgwMiwweDFCLDB4MDR9LAorICAgIHsweDAyLDB4MUMsMHgwMH0sCisgICAgezB4MDIsMHgxRCwweDAwfSwKKyAgICB7MHgwMiwweDFFLDB4MDB9LAorICAgIHsweDAyLDB4MUYsMHgwMH0sCisgICAgezB4MDIsMHgyMCwweDAwfSwKKyAgICB7MHgwMiwweDIxLDB4MDB9LAorICAgIHsweDAyLDB4MjIsMHgwMH0sCisgICAgezB4MDIsMHgyMywweDAwfSwKKyAgICB7MHgwMiwweDI0LDB4MDB9LAorICAgIHsweDAyLDB4MjUsMHgwMH0sCisgICAgezB4MDIsMHgyNiwweDAwfSwKKyAgICB7MHgwMiwweDI3LDB4MDB9LAorICAgIHsweDAyLDB4MjgsMHgwMH0sCisgICAgezB4MDIsMHgyOSwweDAwfSwKKyAgICB7MHgwMiwweDJBLDB4MDB9LAorICAgIHsweDAyLDB4MkIsMHgwMH0sCisgICAgezB4MDIsMHgyQywweDAwfSwKKyAgICB7MHgwMiwweDJELDB4MDB9LAorICAgIHsweDAyLDB4MkUsMHgwMH0sCisgICAgezB4MDIsMHgyRiwweDAwfSwKKyAgICB7MHgwMiwweDMxLDB4MTF9LAorICAgIHsweDAyLDB4MzIsMHgxMX0sCisgICAgezB4MDIsMHgzMywweDAxfSwKKyAgICB7MHgwMiwweDM0LDB4MDF9LAorICAgIHsweDAyLDB4MzUsMHgwMH0sCisgICAgezB4MDIsMHgzNiwweDAwfSwKKyAgICB7MHgwMiwweDM3LDB4MDB9LAorICAgIHsweDAyLDB4MzgsMHhDMH0sCisgICAgezB4MDIsMHgzOSwweERFfSwKKyAgICB7MHgwMiwweDNBLDB4MDB9LAorICAgIHsweDAyLDB4M0IsMHgwMH0sCisgICAgezB4MDIsMHgzQywweDAwfSwKKyAgICB7MHgwMiwweDNELDB4MDB9LAorICAgIHsweDAyLDB4M0UsMHhDOH0sCisgICAgezB4MDIsMHg0QSwweDAwfSwKKyAgICB7MHgwMiwweDRCLDB4MDB9LAorICAgIHsweDAyLDB4NEMsMHgwMH0sCisgICAgezB4MDIsMHg0RCwweDAwfSwKKyAgICB7MHgwMiwweDRFLDB4MDB9LAorICAgIHsweDAyLDB4NEYsMHgwMH0sCisgICAgezB4MDIsMHg1MCwweDAwfSwKKyAgICB7MHgwMiwweDUxLDB4MDB9LAorICAgIHsweDAyLDB4NTIsMHgwMH0sCisgICAgezB4MDIsMHg1MywweDAwfSwKKyAgICB7MHgwMiwweDU0LDB4MDB9LAorICAgIHsweDAyLDB4NTUsMHgwMH0sCisgICAgezB4MDIsMHg1NiwweDAwfSwKKyAgICB7MHgwMiwweDU3LDB4MDB9LAorICAgIHsweDAyLDB4NTgsMHgwMH0sCisgICAgezB4MDIsMHg1OSwweDAwfSwKKyAgICB7MHgwMiwweDVBLDB4MDB9LAorICAgIHsweDAyLDB4NUIsMHgwMH0sCisgICAgezB4MDIsMHg1QywweDAwfSwKKyAgICB7MHgwMiwweDVELDB4MDB9LAorICAgIHsweDAyLDB4NUUsMHgwMH0sCisgICAgezB4MDIsMHg1RiwweDAwfSwKKyAgICB7MHgwMiwweDYwLDB4MDB9LAorICAgIHsweDAyLDB4NjEsMHgwMH0sCisgICAgezB4MDIsMHg2MiwweDAwfSwKKyAgICB7MHgwMiwweDYzLDB4MDB9LAorICAgIHsweDAyLDB4NjQsMHgwMH0sCisgICAgezB4MDIsMHg2OCwweDAwfSwKKyAgICB7MHgwMiwweDY5LDB4MDB9LAorICAgIHsweDAyLDB4NkEsMHgwMH0sCisgICAgezB4MDIsMHg2QiwweDQ3fSwKKyAgICB7MHgwMiwweDZDLDB4NTB9LAorICAgIHsweDAyLDB4NkQsMHg0Rn0sCisgICAgezB4MDIsMHg2RSwweDRFfSwKKyAgICB7MHgwMiwweDZGLDB4NUZ9LAorICAgIHsweDAyLDB4NzAsMHg0M30sCisgICAgezB4MDIsMHg3MSwweDRDfSwKKyAgICB7MHgwMiwweDcyLDB4NEJ9LAorICAgIHsweDAzLDB4MDIsMHgwMH0sCisgICAgezB4MDMsMHgwMywweDAwfSwKKyAgICB7MHgwMywweDA0LDB4MDB9LAorICAgIHsweDAzLDB4MDUsMHgwMH0sCisgICAgezB4MDMsMHgwNiwweDE2fSwKKyAgICB7MHgwMywweDA3LDB4MDB9LAorICAgIHsweDAzLDB4MDgsMHgwMH0sCisgICAgezB4MDMsMHgwOSwweDAwfSwKKyAgICB7MHgwMywweDBBLDB4MDB9LAorICAgIHsweDAzLDB4MEIsMHg4MH0sCisgICAgezB4MDMsMHgwRCwweDAwfSwKKyAgICB7MHgwMywweDBFLDB4MDB9LAorICAgIHsweDAzLDB4MEYsMHgwMH0sCisgICAgezB4MDMsMHgxMCwweDAwfSwKKyAgICB7MHgwMywweDExLDB4MDB9LAorICAgIHsweDAzLDB4MTIsMHgwMH0sCisgICAgezB4MDMsMHgxMywweDAwfSwKKyAgICB7MHgwMywweDE0LDB4MDB9LAorICAgIHsweDAzLDB4MTUsMHgwMH0sCisgICAgezB4MDMsMHgxNiwweDAwfSwKKyAgICB7MHgwMywweDE4LDB4MDB9LAorICAgIHsweDAzLDB4MTksMHgwMH0sCisgICAgezB4MDMsMHgxQSwweDAwfSwKKyAgICB7MHgwMywweDFCLDB4MDB9LAorICAgIHsweDAzLDB4MUMsMHgwMH0sCisgICAgezB4MDMsMHgxRCwweDAwfSwKKyAgICB7MHgwMywweDFFLDB4MDB9LAorICAgIHsweDAzLDB4MUYsMHgwMH0sCisgICAgezB4MDMsMHgyMCwweDAwfSwKKyAgICB7MHgwMywweDIxLDB4MDB9LAorICAgIHsweDAzLDB4MjMsMHgwMH0sCisgICAgezB4MDMsMHgyNCwweDAwfSwKKyAgICB7MHgwMywweDI1LDB4MDB9LAorICAgIHsweDAzLDB4MjYsMHgwMH0sCisgICAgezB4MDMsMHgyNywweDAwfSwKKyAgICB7MHgwMywweDI4LDB4MDB9LAorICAgIHsweDAzLDB4MjksMHgwMH0sCisgICAgezB4MDMsMHgyQSwweDAwfSwKKyAgICB7MHgwMywweDJCLDB4MDB9LAorICAgIHsweDAzLDB4MkMsMHgwMH0sCisgICAgezB4MDMsMHgyRSwweDAwfSwKKyAgICB7MHgwMywweDJGLDB4MDB9LAorICAgIHsweDAzLDB4MzAsMHgwMH0sCisgICAgezB4MDMsMHgzMSwweDAwfSwKKyAgICB7MHgwMywweDMyLDB4MDB9LAorICAgIHsweDAzLDB4MzMsMHgwMH0sCisgICAgezB4MDMsMHgzNCwweDAwfSwKKyAgICB7MHgwMywweDM1LDB4MDB9LAorICAgIHsweDAzLDB4MzYsMHgwMH0sCisgICAgezB4MDMsMHgzNywweDAwfSwKKyAgICB7MHgwMywweDM5LDB4MUZ9LAorICAgIHsweDAzLDB4M0IsMHgwMH0sCisgICAgezB4MDMsMHgzQywweDAwfSwKKyAgICB7MHgwMywweDNELDB4MDB9LAorICAgIHsweDAzLDB4M0UsMHgwMH0sCisgICAgezB4MDMsMHgzRiwweDAwfSwKKyAgICB7MHgwMywweDQwLDB4MDB9LAorICAgIHsweDAzLDB4NDEsMHgwMH0sCisgICAgezB4MDMsMHg0MiwweDAwfSwKKyAgICB7MHgwMywweDQzLDB4MDB9LAorICAgIHsweDAzLDB4NDQsMHgwMH0sCisgICAgezB4MDMsMHg0NSwweDAwfSwKKyAgICB7MHgwMywweDQ2LDB4MDB9LAorICAgIHsweDAzLDB4NDcsMHgwMH0sCisgICAgezB4MDMsMHg0OCwweDAwfSwKKyAgICB7MHgwMywweDQ5LDB4MDB9LAorICAgIHsweDAzLDB4NEEsMHgwMH0sCisgICAgezB4MDMsMHg0QiwweDAwfSwKKyAgICB7MHgwMywweDRDLDB4MDB9LAorICAgIHsweDAzLDB4NEQsMHgwMH0sCisgICAgezB4MDMsMHg0RSwweDAwfSwKKyAgICB7MHgwMywweDRGLDB4MDB9LAorICAgIHsweDAzLDB4NTAsMHgwMH0sCisgICAgezB4MDMsMHg1MSwweDAwfSwKKyAgICB7MHgwMywweDUyLDB4MDB9LAorICAgIHsweDAzLDB4NTMsMHgwMH0sCisgICAgezB4MDMsMHg1NCwweDAwfSwKKyAgICB7MHgwMywweDU1LDB4MDB9LAorICAgIHsweDAzLDB4NTYsMHgwMH0sCisgICAgezB4MDMsMHg1NywweDAwfSwKKyAgICB7MHgwMywweDU4LDB4MDB9LAorICAgIHsweDAzLDB4NTksMHgwMH0sCisgICAgezB4MDMsMHg1QSwweDAwfSwKKyAgICB7MHgwMywweDVCLDB4MDB9LAorICAgIHsweDAzLDB4NUMsMHgwMH0sCisgICAgezB4MDMsMHg1RCwweDAwfSwKKyAgICB7MHgwMywweDVFLDB4MDB9LAorICAgIHsweDAzLDB4NUYsMHgwMH0sCisgICAgezB4MDMsMHg2MCwweDAwfSwKKyAgICB7MHgwMywweDYxLDB4MDB9LAorICAgIHsweDAzLDB4NjIsMHgwMH0sCisgICAgezB4MDQsMHg4NywweDAwfSwKKyAgICB7MHgwNSwweDAyLDB4MDF9LAorICAgIHsweDA1LDB4MDgsMHgxNH0sCisgICAgezB4MDUsMHgwOSwweDIyfSwKKyAgICB7MHgwNSwweDBBLDB4MER9LAorICAgIHsweDA1LDB4MEIsMHgwQ30sCisgICAgezB4MDUsMHgwQywweDAxfSwKKyAgICB7MHgwNSwweDBELDB4M0Z9LAorICAgIHsweDA1LDB4MEUsMHgxNX0sCisgICAgezB4MDUsMHgwRiwweDI2fSwKKyAgICB7MHgwNSwweDEwLDB4MEN9LAorICAgIHsweDA1LDB4MTEsMHgwQn0sCisgICAgezB4MDUsMHgxMiwweDAxfSwKKyAgICB7MHgwNSwweDEzLDB4M0Z9LAorICAgIHsweDA1LDB4MTUsMHgwMH0sCisgICAgezB4MDUsMHgxNiwweEI4fSwKKyAgICB7MHgwNSwweDE3LDB4QzF9LAorICAgIHsweDA1LDB4MTgsMHg0OX0sCisgICAgezB4MDUsMHgxOSwweEFDfSwKKyAgICB7MHgwNSwweDFBLDB4MDJ9LAorICAgIHsweDA1LDB4MUIsMHgwMH0sCisgICAgezB4MDUsMHgxQywweDAwfSwKKyAgICB7MHgwNSwweDFELDB4MDB9LAorICAgIHsweDA1LDB4MUUsMHgwMH0sCisgICAgezB4MDUsMHgxRiwweDgwfSwKKyAgICB7MHgwNSwweDIxLDB4MzF9LAorICAgIHsweDA1LDB4MkEsMHgwMH0sCisgICAgezB4MDUsMHgyQiwweDAxfSwKKyAgICB7MHgwNSwweDJDLDB4MEZ9LAorICAgIHsweDA1LDB4MkQsMHgwM30sCisgICAgezB4MDUsMHgyRSwweDE5fSwKKyAgICB7MHgwNSwweDJGLDB4MTl9LAorICAgIHsweDA1LDB4MzEsMHgwMH0sCisgICAgezB4MDUsMHgzMiwweDQyfSwKKyAgICB7MHgwNSwweDMzLDB4MDN9LAorICAgIHsweDA1LDB4MzQsMHgwMH0sCisgICAgezB4MDUsMHgzNiwweDBDfSwKKyAgICB7MHgwNSwweDM3LDB4MDB9LAorICAgIHsweDA1LDB4MzgsMHgyMX0sCisgICAgezB4MDUsMHgzOSwweDAwfSwKKyAgICB7MHgwOSwweDBFLDB4MDJ9LAorICAgIHsweDA5LDB4NDMsMHgwMX0sCisgICAgezB4MDksMHg0OSwweDAzfSwKKyAgICB7MHgwOSwweDRBLDB4MDN9LAorICAgIHsweDBBLDB4MDIsMHgwMH0sCisgICAgezB4MEEsMHgwMywweDAxfSwKKyAgICB7MHgwQSwweDA0LDB4MDF9LAorICAgIHsweDBBLDB4MDUsMHgwMX0sCisgICAgezB4MEIsMHg0NCwweDBDfSwKKyAgICB7MHgwQiwweDQ2LDB4MDB9LAorICAgIHsweDBCLDB4NDcsMHgwMH0sCisgICAgezB4MEIsMHg0OCwweDBDfSwKKyAgICB7MHgwQiwweDRBLDB4MUV9LAorICAgIHsweDA1LDB4MTQsMHgwMX0sCisgICAgezB4MDAsMHgxQywweDAxfSwKKyAgICB7MHgwQiwweDI0LDB4REJ9LAorICAgIHsweDBCLDB4MjUsMHgwMn0KK307IAorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9ib2FyZC93cngvZnMvaTJjX2FkZHJzLnNoIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9ib2FyZC93cngvZnMvaTJjX2FkZHJzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY0M2ZkNGMKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2JvYXJkL3dyeC9mcy9pMmNfYWRkcnMuc2gKQEAgLTAsMCArMSw0IEBACisjISAvYmluL2Jhc2gKKworIyBCb2R5IHdpbGwgYmUgaW5zZXJ0ZWQgaGVyZSBieSBjb3B5X2hvc3RfZnMgdGFyZ2V0IGluIHByb2plY3QncyBtYWluIE1ha2VmaWxlCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvYm9hcmQvd3J4L2ZzL3N2a19pbml0LnNoIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9ib2FyZC93cngvZnMvc3ZrX2luaXQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzFlZWNlMAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvYm9hcmQvd3J4L2ZzL3N2a19pbml0LnNoCkBAIC0wLDAgKzEsMTU2IEBACisjISAvYmluL2Jhc2gKK2NkIC9vcHQvYmNtNjg2MjAKKworIyBUaGVzZSBmaWxlcyBhcmUgbW91bnRlZCB1c2luZyB0bXBmcywgc28gdGhleSB3aWxsIGJlIGRlbGV0ZWQgdXBvbiByZWJvb3QKK0xPQ0tfRElSX0lOSVQ9L3RtcC9iY202ODYyMF9zdmtfaW5pdAorRklMRV9JTklUX0RPTkU9IiRMT0NLX0RJUl9JTklUL2RvbmUiCitMT0NLX0RJUl9LRVJORUxfTE9HX09XTkVEPS90bXAvYmNtNjg2MjBfa2VybmVsX2xvZ19vd25lZAorCitVU0VSX0FQUExfQVJHUz0iIgorS1QyX1BPUlQ9IiIKK1NXS1QyX1BPUlQ9IiIKK0tFUk5FTF9MT0c9InkiCitDT09QX0RCQT0ibiIKKword2hpbGUgKCgkIykpOyBkbworICAgIGNhc2UgIiQxIiBpbgorICAgIC0ta3QyKQorICAgICAgICBzaGlmdAorICAgICAgICBLVDJfUE9SVD0iJDEiCisgICAgICAgIDs7CisgICAgLS1zd2t0MikKKyAgICAgICAgc2hpZnQKKyAgICAgICAgU1dLVDJfUE9SVD0iJDEiCisgICAgICAgIDs7CisgICAgLS1wcm94eSkgIyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAoY291bGQganVzdCB1c2UgJy1wcm94eScpCisgICAgICAgIHNoaWZ0CisgICAgICAgIFVTRVJfQVBQTF9BUkdTPSIkVVNFUl9BUFBMX0FSR1MgLXByb3h5ICQxIgorICAgICAgICA7OworICAgIC1ubCkKKyAgICAgICAgS0VSTkVMX0xPRz0ibiIKKyAgICAgICAgVVNFUl9BUFBMX0FSR1M9IiRVU0VSX0FQUExfQVJHUyAkMSIKKyAgICAgICAgOzsKKyAgICAtY29vcF9kYmEpCisgICAgICAgIENPT1BfREJBPSJ5IgorICAgICAgICA7OworICAgICopCisgICAgICAgIFVTRVJfQVBQTF9BUkdTPSIkVVNFUl9BUFBMX0FSR1MgJDEiCisgICAgICAgIDs7CisgICAgZXNhYworICAgIHNoaWZ0Citkb25lCisKKyMgQ2hlY2sgaWYgdGhlIGluaXRpYWxpemF0aW9uIHN0ZXBzIChpbnN0YWxsaW5nIGtlcm5lbCBtb2R1bGVzLCBldGMpIGhhdmUgYWxyZWFkeSBiZWVuIGRvbmUuCisjIElmIG5vdCwgc3RhcnQgdGhlIGluaXRpYWxpemF0aW9uIHByb2Nlc3MuCitpZiBta2RpciAiJExPQ0tfRElSX0lOSVQiIDI+L2Rldi9udWxsOyB0aGVuCisgICAgdHJhcCAicm1kaXIgXCIkTE9DS19ESVJfSU5JVFwiIiBFWElUCisgICAgZWNobyAiSW5pdGlhbGl6aW5nIEJDTTY4NjIwIFNWSy4uLiIKKworICAgIGluc21vZCBsbF9wY2llLmtvCisgICAgc2xlZXAgMQorCisgICAgaW5zbW9kIG9zX2xpbnV4LmtvCisgICAgc2xlZXAgMQorCisgICAgc291cmNlIC4vaTJjX2FkZHJzLnNoCisgICAgaW5zbW9kIGkyY19kZXZzLmtvCisgICAgc2xlZXAgMQorCisgICAgZnVuY3Rpb24gcHJvYmVfZGV2CisgICAgeworICAgICAgICAyPi9kZXYvbnVsbCBlY2hvIG1hcGxlX2kyYyAweCQxID4gL3N5cy9idXMvaTJjL2RldmljZXMvaTJjLTAvbmV3X2RldmljZQorICAgIH0KKworICAgICMgU3VwcHJlc3MgZXJyb3Igd2FybmluZ3MgaW4gY2FzZSBkZXZpY2UgY2Fubm90IGJlIHByb2JlZCBiZWNhdXNlIGl0IGlzIGluZXhpc3RlbnQuCisgICAgZG1lc2cgLW4gMQorICAgIHByb2JlX2RldiAkSTJDX1NXMF9JMkNfQUREUgorICAgIHByb2JlX2RldiAkSTJDX1NXMV9JMkNfQUREUgorICAgIHByb2JlX2RldiAkSTJDX1NXMl9JMkNfQUREUgorICAgIHByb2JlX2RldiAkSTJDX1NXM19JMkNfQUREUgorICAgIHByb2JlX2RldiAkSTJDX1NXNF9JMkNfQUREUgorICAgIHByb2JlX2RldiAkU0ZQX0kyQ19BRERSMQorICAgIHByb2JlX2RldiAkU0ZQX0kyQ19BRERSMgorICAgIHByb2JlX2RldiAkRlBHQV9JMkNfQUREUgorICAgIHByb2JlX2RldiAkUE9OX0RQTExfSTJDX0FERFIKKyAgICBwcm9iZV9kZXYgJFBNX0RQTExfSTJDX0FERFIKKyAgICBwcm9iZV9kZXYgJENYUF9UX0kyQ19BRERSCisgICAgcHJvYmVfZGV2ICRDWFBfUl9JMkNfQUREUgorICAgIHByb2JlX2RldiAkUENJRV9TV19JMkNfQUREUgorICAgIGRtZXNnIC1uIDgKKworICAgIHJtIC1mIC9kZXYvbWFwbGVfaTJjCisgICAgbWtub2QgL2Rldi9tYXBsZV9pMmMgYyBgY2F0IC9zeXMvbW9kdWxlL2kyY19kZXZzL3BhcmFtZXRlcnMvbWFwbGVfaTJjX2NocmRldl9tYWpvcmAgMAorCisgICAgaWYgWyAiJEtUMl9QT1JUIiAhPSAiIiBdOyB0aGVuCisgICAgICAgIGVjaG8gayAxID4gL3Byb2MvbWFwbGVfaTJjL2kyYworICAgICAgICBpbnNtb2QgbGludXgta2VybmVsLWJkZS5rbworICAgICAgICBzbGVlcCAxCisgICAgICAgIGNhdCAvcHJvYy9saW51eC1rZXJuZWwtYmRlCisgICAgICAgIHNsZWVwIDEKKyAgICAgICAgaW5zbW9kIGxpbnV4LXVrLXByb3h5LmtvCisgICAgICAgIHNsZWVwIDEKKyAgICAgICAgbWtub2QgL2Rldi9saW51eC11ay1wcm94eSBjIDEyNSAwCisgICAgICAgIHNsZWVwIDEKKyAgICAgICAgaW5zbW9kIGxpbnV4LWJjbS1kaWFnLWZ1bGwua28KKyAgICAgICAgc2xlZXAgMQorICAgICAgICBlY2hvICJLVDIgd2lsbCB3YWl0IG9uIHBvcnQgJEtUMl9QT1JUIgorICAgICAgICAuL2JjbS51c2VyLnByb3h5IC1kICRLVDJfUE9SVCAmCisgICAgZmkKKworICAgIGlmIFsgIiRTV0tUMl9QT1JUIiAhPSAiIiBdOyB0aGVuCisgICAgICAgIGVjaG8gIlNXIEtUMiBpbml0IgorICAgICAgICBpbnNtb2QgbGludXgta2VybmVsLWJkZS5rbworICAgICAgICBzbGVlcCAxCisgICAgICAgIGNhdCAvcHJvYy9saW51eC1rZXJuZWwtYmRlCisgICAgICAgIHNsZWVwIDEKKyAgICAgICAgaW5zbW9kIGxpbnV4LXVrLXByb3h5LmtvCisgICAgICAgIHNsZWVwIDEKKyAgICAgICAgbWtub2QgL2Rldi9saW51eC11ay1wcm94eSBjIDEyNSAwCisgICAgICAgIHNsZWVwIDEKKyAgICAgICAgaW5zbW9kIGxpbnV4LWJjbS1kaWFnLWZ1bGwua28KKyAgICAgICAgc2xlZXAgMQorICAgICAgICBlY2hvICJLVDIgd2lsbCB3YWl0IG9uIHBvcnQgJFNXS1QyX1BPUlQiCisgICAgICAgIC4vYmNtLnVzZXIucHJveHkgLWQgJFNXS1QyX1BPUlQgJgorICAgIGZpCisKKyAgICBpbnNtb2QgYmNtX2Rldl9jdHJsX2xpbnV4LmtvCisgICAgc2xlZXAgMQorICAgIAorICAgIGlmIFsgIiRDT09QX0RCQSIgIT0gIm4iIF07IHRoZW4KKyAgICAgICAgaW5zbW9kIGNvb3BfZGJhX2xpbnV4LmtvCisgICAgICAgIHNsZWVwIDEKKyAgICBmaQorICAgIAorICAgIHJtIC1mIC9kZXYvYmNtX2xvZworICAgIG1rbm9kIC9kZXYvYmNtX2xvZyBjIGBjYXQgL3N5cy9tb2R1bGUvYmNtX2Rldl9jdHJsX2xpbnV4L3BhcmFtZXRlcnMvZGV2X2xvZ19jaHJkZXZfbWFqb3JgIDAKKyAgICBta25vZCAvZGV2L21hcGxlX2Rldl9jdHJsIGMgYGNhdCAvc3lzL21vZHVsZS9iY21fZGV2X2N0cmxfbGludXgvcGFyYW1ldGVycy9tYXBsZV9kZXZfY3RybF9jaHJkZXZfbWFqb3JgIDAKKworICAgIHRvdWNoICIkRklMRV9JTklUX0RPTkUiCisgICAgdHJhcCAtIEVYSVQKK2Vsc2UKKyAgICBpZiBbIC1mICIkRklMRV9JTklUX0RPTkUiIF07IHRoZW4KKyAgICAgICAgZWNobyAiU2tpcHBlZCBCQ002ODYyMCBTVksgaW5pdGlhbGl6YXRpb24gc2luY2UgaXQgaGFzIGFscmVhZHkgYmVlbiBkb25lIgorICAgIGVsc2UKKyAgICAgICAgZWNobyAiV2FpdGluZyBmb3IgU1ZLIGluaXRpYWxpemF0aW9uIHRvIGNvbXBsZXRlLi4uIgorICAgICAgICB3aGlsZSBbICEgLWYgIiRGSUxFX0lOSVRfRE9ORSIgXTsgZG8KKyAgICAgICAgICAgIHNsZWVwIDEKKyAgICAgICAgZG9uZQorICAgIGZpCitmaQorCisjIE9ubHkgb25lIGFwcGxpY2F0aW9uIGNhbiBoYXZlIHRoZSBrZXJuZWwgbG9nZ2VyIGVuYWJsZWQgYXQgb25jZS4KKyMgSWYgc29tZW9uZSBlbHNlIGFscmVhZHkgb3ducyB0aGUga2VybmVsIGxvZ2dlciwgcnVuIHdpdGhvdXQgaXQuCitpZiBbICIkS0VSTkVMX0xPRyIgPT0gInkiIF07IHRoZW4KKyAgICBpZiBta2RpciAiJExPQ0tfRElSX0tFUk5FTF9MT0dfT1dORUQiIDI+L2Rldi9udWxsOyB0aGVuCisgICAgICAgIHRyYXAgInJtZGlyIFwiJExPQ0tfRElSX0tFUk5FTF9MT0dfT1dORURcIiIgRVhJVAorICAgIGVsc2UKKyAgICAgICAgVVNFUl9BUFBMX0FSR1M9IiRVU0VSX0FQUExfQVJHUyAtbmwiCisgICAgICAgIGVjaG8gIlJ1bm5pbmcgd2l0aG91dCBrZXJuZWwgbG9nZ2VyIHNpbmNlIHNvbWVvbmUgZWxzZSBvd25zIGl0IgorICAgIGZpCitmaQorCisjZWNobyAiSW4gQmFuZDogTGF1bmNoaW5nIEJDTTY4NjIwIHVzZXIgc3BhY2UgZGV2aWNlIGNvbnRyb2wgYXBwbGljYXRpb24gIgorIy4vYmNtX2Rldl9jdHJsX3VzZXIgPiAvZGV2L251bGwgMj4mMSAmCisKK2VjaG8gIkxhdW5jaGluZyBCQ002ODYyMCB1c2VyIGFwcGxpY2F0aW9uIHdpdGggb3B0aW9ucyBcIiRVU0VSX0FQUExfQVJHU1wiIgorLi9iY21fdXNlcl9hcHBsICRVU0VSX0FQUExfQVJHUwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9jb29wX2RiYV9saW51eC9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvY29vcF9kYmFfbGludXgvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUyMDQzZQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvY29vcF9kYmFfbGludXgvTWFrZWZpbGUKQEAgLTAsMCArMSwzOCBAQAorIyBDb29wZXJhdGl2ZSBEQkEKKworaWZlcSAoIiQoT1NfS0VSTkVMKSIsICJsaW51eCIpCisKK01PRF9OQU1FID0gY29vcF9kYmFfbGludXgKK01PRF9UWVBFID0gbGludXhfbW9kdWxlCitNT0RfREVQUyA9IGNvb3BfZGJhCisKK3NyY3MgPSBiY21vbHRfY29vcF9kYmFfbGludXguYworCitNT0RfSU5DX0RJUlMgPSAkKFNSQ19ESVIpICQoTU9ERUxfT1VUX0RJUikKKworIyBJZiBjYWxsZWQgYnkgbGludXgga2VybmVsIGJ1aWxkZXIgLSBhZGQgaW5jbHVkZSBwYXRocyBtYW51YWxseS4KKyMgSXQgaXMgbm90IGVsZWdhbnQsIGJ1dCB3ZSdsbCBub3QgaGF2ZSBtYW55IGxpbnV4IG1vZHVsZXMKK2lmbmVxICgiJChLQlVJTERfU1JDKSIsICIiKQorCS1pbmNsdWRlICQoT1VUX0RJUl9CQVNFKS9NYWtlZmlsZS5jb25maWcuJChNT0RfTkFNRSkKK2VuZGlmCisgICAgaWZlcSAoIiQoUkVMRUFTRV9CVUlMRCkiLCAieSIpCisJICAgIEtCVUlMRF9FWFRSQV9TWU1CT0xTICs9ICQoVE9QX0RJUikvaG9zdF9kcml2ZXIvZGV2X2N0cmwvbGludXgvTW9kdWxlLnN5bXZlcnMKKyAgICAJRVhUUkFfQ0ZMQUdTICs9IC1JJChUT1BfRElSKS9ob3N0X2RyaXZlci9jb21tb25fZ3BvbiBcCistSSQoVE9QX0RJUikvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L3BjaWVfc3dfcXVldWUgXAorLUkkKFRPUF9ESVIpL2hvc3RfZHJpdmVyL3BjaWUgXAorLUkkKFRPUF9ESVIpL2hvc3RfZHJpdmVyL2FwaSBcCistSSQoVE9QX0RJUikvaG9zdF9kcml2ZXIvdXRpbHMgXAorLUkkKFRPUF9ESVIpL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2cgXAorLUkkKFRPUF9ESVIpL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9tdXggCisgICAgZWxzZQorCSAgICBLQlVJTERfRVhUUkFfU1lNQk9MUyArPSAkKFRPUF9ESVIpL2hvc3QvZGV2X2N0cmwvbGludXgvTW9kdWxlLnN5bXZlcnMKKwkgICAgRVhUUkFfQ0ZMQUdTICs9IC1JJChUT1BfRElSKS9jb21tb24vZ3BvbiBcCistSSQoVE9QX0RJUikvY29tbW9uL21vZGVsL21hcGxlIFwKKy1JJChUT1BfRElSKS9jb21tb24vdHJhbnNwb3J0L2RyaXZlci9tYXBsZS9wY2llX3N3X3F1ZXVlIFwKKy1JJChUT1BfRElSKS9jb21tb24vZHJpdmVycy9tYXBsZS9wY2llIFwKKy1JJChUT1BfRElSKS9jb21tb24vYXBpIFwKKy1JJChUT1BfRElSKS9jb21tb24vdXRpbHMgXAorLUkkKFRPUF9ESVIpL2NvbW1vbi9kZXZfbG9nIFwKKy1JJChUT1BfRElSKS9ob3N0L3RyYW5zcG9ydC9kcml2ZXIvbWFwbGUvbXV4CisgICAgZW5kaWYKK2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9jb29wX2RiYV9saW51eC9iY21vbHRfY29vcF9kYmFfbGludXguYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvY29vcF9kYmFfbGludXgvYmNtb2x0X2Nvb3BfZGJhX2xpbnV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBmYzUyYwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvY29vcF9kYmFfbGludXgvYmNtb2x0X2Nvb3BfZGJhX2xpbnV4LmMKQEAgLTAsMCArMSw4MSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2luY2x1ZGUgImJjbW9sdF9jb29wX2RiYS5oIgorCittb2R1bGVfcGFyYW0oYmNtb3Nfc3lzX3RyYWNlX2xldmVsLCB1aW50LCBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lST1RIKTsKK01PRFVMRV9QQVJNX0RFU0MoYmNtb3Nfc3lzX3RyYWNlX2xldmVsLCAidHJhY2VfbGV2ZWwiKTsKKworc3RhdGljIHZvaWQgYmNtb2x0X2Nvb3BfZGJhX3VucmVnaXN0ZXJfcmVnaXN0ZXJlZF9kZXZpY2VzKGJjbW9sdF9kZXZpZCBtYXhfZGV2aWQsIGJjbXRybXV4X2NoYW5uZWwgY2hhbm5lbCkKK3sKKwliY21vbHRfZGV2aWQgZGV2aWQ7CisKKwlmb3IgKGRldmlkID0gMDsgZGV2aWQgPCBtYXhfZGV2aWQ7IGRldmlkKyspCisJeworCQliY21vbHRfY29vcF9kYmFfZXhpdChkZXZpZCwgY2hhbm5lbCk7CisJfQorfQorc3RhdGljIHZvaWQgYmNtb2x0X2Nvb3BfZGJhX21vZHVsZV9leGl0KHZvaWQpCit7CisJYmNtb2x0X2Nvb3BfZGJhX3VucmVnaXN0ZXJfcmVnaXN0ZXJlZF9kZXZpY2VzKEJDTVRSX01BWF9PTFRTLCBVUkdFTlRfQ0hBTk5FTCk7CisKKyAgICBwcmludGsoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworfQorCitzdGF0aWMgaW50IGJjbW9sdF9jb29wX2RiYV9tb2R1bGVfaW5pdCh2b2lkKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGJjbW9sdF9kZXZpZCBkZXZpZDsKKyAgICBiY210cm11eF9jaGFubmVsIGNoYW5uZWwgPSBVUkdFTlRfQ0hBTk5FTDsKKworICAgIHByaW50aygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKyNpZiAwCisgICAgYmNtb3NfdHJhY2VfbGV2ZWxfc2V0KEJDTU9TX1RSQUNFX0xFVkVMX0RFQlVHKTsKKyNlbmRpZgorCisJZm9yIChkZXZpZCA9IDA7IGRldmlkIDwgQkNNVFJfTUFYX09MVFM7IGRldmlkKyspCisJeworCQlyYyA9IGJjbW9sdF9jb29wX2RiYV9pbml0KGRldmlkLCAmY2hhbm5lbCwgYmNtb2x0X2Nvb3BfZGJhX3J4LCBOVUxMKTsKKwkJaWYgKHJjICE9IEJDTV9FUlJfT0spCisJCXsKKwkJCXByaW50aygiZXJyb3IgaW4gYmNtb2x0X2Nvb3BfZGJhX2luaXQgcmM9JWRcbiIsIHJjKTsKKwkJCWJjbW9sdF9jb29wX2RiYV91bnJlZ2lzdGVyX3JlZ2lzdGVyZWRfZGV2aWNlcyhkZXZpZCwgY2hhbm5lbCk7CisJCQlicmVhazsKKwkJfQorCX0KKworICAgIHJldHVybiByYyA/IC1FSU5WQUwgOiAwOworfQorCittb2R1bGVfaW5pdChiY21vbHRfY29vcF9kYmFfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQoYmNtb2x0X2Nvb3BfZGJhX21vZHVsZV9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb29wZXJhdGl2ZSBEQkEiKTsKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvZGV2X2N0cmxfbGludXgvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2Rldl9jdHJsX2xpbnV4L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5YTU2ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2Rldl9jdHJsX2xpbnV4L01ha2VmaWxlCkBAIC0wLDAgKzEsMTcgQEAKKyMgZGV2aWNlX2NvbnRyb2wgTGludXggd3JhcHBlcgorCitpZmVxICgiJChPU19LRVJORUwpIiwgImxpbnV4IikKKworTU9EX05BTUUgPSBiY21fZGV2X2N0cmxfbGludXgKK01PRF9UWVBFID0gbGludXhfbW9kdWxlCitNT0RfREVQUyA9IGRldl9jdHJsIG5sdHIgZGV2X2xvZ19rZXJuZWwgdXNlcl9jb25maWcgaG9zdF9hcGlfbGludXggYXBpX2xpbnV4IHBjaWUgcGNpZV9tb2QKKworc3JjcyA9IGJjbW9sdF9kZXZfY3RybF9saW51eC5jCisKKyMgSWYgY2FsbGVkIGJ5IGxpbnV4IGtlcm5lbCBidWlsZGVyIC0gYWRkIGluY2x1ZGUgcGF0aHMgbWFudWFsbHkuCisjIEl0IGlzIG5vdCBlbGVnYW50LCBidXQgd2UnbGwgbm90IGhhdmUgbWFueSBsaW51eCBtb2R1bGVzCitpZm5lcSAoIiQoS0JVSUxEX1NSQykiLCAiIikKKwktaW5jbHVkZSAkKE9VVF9ESVJfQkFTRSkvTWFrZWZpbGUuY29uZmlnLiQoTU9EX05BTUUpCitlbmRpZgorZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9kZXZfY3RybF9saW51eC9iY21vbHRfZGV2X2N0cmxfaW9jdGwuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvZGV2X2N0cmxfbGludXgvYmNtb2x0X2Rldl9jdHJsX2lvY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDM3YzQ2NwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvZGV2X2N0cmxfbGludXgvYmNtb2x0X2Rldl9jdHJsX2lvY3RsLmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIGJjbW9sdF9kZXZfY3RybF9pb2N0bC5oCisgKgorICogIENyZWF0ZWQgb246IDcgPz8/PyAyMDE1CisgKiAgICAgIEF1dGhvcjogbWlseWEKKyAqLworCisjaWZuZGVmIEhPU1RfREVWX0NUUkxfTElOVVhfQkNNT0xUX0RFVl9DVFJMX0lPQ1RMX0hfCisjZGVmaW5lIEhPU1RfREVWX0NUUkxfTElOVVhfQkNNT0xUX0RFVl9DVFJMX0lPQ1RMX0hfCisKKworI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDMyX3QgKmR1bXBwdHI7CisgICAgaW50MzJfdCBzdGFydF9pbmRleDsKKyAgICBpbnQzMl90IGhvd21hbnk7CisgICAgdWludDhfdCBkZXZpY2U7CisgICAgdWludDMyX3QgZXZlbnQ7IC8qIEZvciBNQVBMRV9ERVZfQ1RSTF9JT0NUTF9PUF9IT1NUX0VWRU5UX1dSSVRFIG9ubHkgKi8KK30gZGV2X2N0cmxfaW9jdGxfcGFyYW07CisKKyNkZWZpbmUgTUFQTEVfREVWX0NUUkxfSU9DVExfTUFHSUMgJ0onCisKKyNkZWZpbmUgTUFQTEVfREVWX0NUUkxfSU9DVExfT1BfUENJX1NUQVQgICAgX0lPVyhNQVBMRV9ERVZfQ1RSTF9JT0NUTF9NQUdJQywgMSwgZGV2X2N0cmxfaW9jdGxfcGFyYW0pCisjZGVmaW5lIE1BUExFX0RFVl9DVFJMX0lPQ1RMX09QX1BDSV9EVU1QX1RYIF9JT1coTUFQTEVfREVWX0NUUkxfSU9DVExfTUFHSUMsIDIsIGRldl9jdHJsX2lvY3RsX3BhcmFtKQorI2RlZmluZSBNQVBMRV9ERVZfQ1RSTF9JT0NUTF9PUF9QQ0lfRFVNUF9SWCBfSU9XUihNQVBMRV9ERVZfQ1RSTF9JT0NUTF9NQUdJQywgMywgZGV2X2N0cmxfaW9jdGxfcGFyYW0pCisjZGVmaW5lIE1BUExFX0RFVl9DVFJMX0lPQ1RMX09QX0hPU1RfRVZFTlRfV1JJVEUgX0lPVyhNQVBMRV9ERVZfQ1RSTF9JT0NUTF9NQUdJQywgNCwgZGV2X2N0cmxfaW9jdGxfcGFyYW0pCisKKyNlbmRpZiAvKiBIT1NUX0RFVl9DVFJMX0xJTlVYX0JDTU9MVF9ERVZfQ1RSTF9JT0NUTF9IXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9kZXZfY3RybF9saW51eC9iY21vbHRfZGV2X2N0cmxfbGludXguYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvZGV2X2N0cmxfbGludXgvYmNtb2x0X2Rldl9jdHJsX2xpbnV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY0OGRlNAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvZGV2X2N0cmxfbGludXgvYmNtb2x0X2Rldl9jdHJsX2xpbnV4LmMKQEAgLTAsMCArMSwzNzAgQEAKKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8YmNtb2x0X3RyX25sX2RyaXZlci5oPgorI2luY2x1ZGUgPGJjbW9sdF9kZXZfbG9nX2tlcm5lbC5oPgorI2luY2x1ZGUgPGJjbV9kZXZfbG9nLmg+CisjaW5jbHVkZSA8YmNtb2x0X2Rldl9jdHJsLmg+CisjaW5jbHVkZSA8YmNtb2x0X3RyX211eC5oPgorI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPiAvKmNvcHlfZnJvbV91c2VyKi8KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8YmNtb2x0X2Rldl9jdHJsX2lvY3RsLmg+CisjaW5jbHVkZSA8YmNtb2x0X3VzZXJfdXRpbHMuaD4KKyNpbmNsdWRlIDxiY21vbHRfaG9zdF9hcGkuaD4KKyNpbmNsdWRlIDxiY21vbHRfZmxkLmg+CisjaW5jbHVkZSA8YmNtdHJfcGNpZS5oPgorCittb2R1bGVfcGFyYW0oYmNtb3Nfc3lzX3RyYWNlX2xldmVsLCB1aW50LCBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lST1RIKTsKK01PRFVMRV9QQVJNX0RFU0MoYmNtb3Nfc3lzX3RyYWNlX2xldmVsLCAidHJhY2VfbGV2ZWwiKTsKKworCitpbnQgbWFwbGVfZGV2X2N0cmxfY2hyZGV2X21ham9yID0gMjM3OworbW9kdWxlX3BhcmFtKG1hcGxlX2Rldl9jdHJsX2NocmRldl9tYWpvciwgaW50LCBTX0lSVVNSIHwgU19JUkdSUCB8IFNfSVdHUlApOworTU9EVUxFX1BBUk1fREVTQyhtYXBsZV9kZXZfY3RybF9jaHJkZXZfbWFqb3IsICJtYXBsZV9kZXZfY3RybF9tYWpvciIpOworc3RhdGljIGNoYXIgaXNfY2hyZGV2X3JlZzsKK3N0YXRpYyBjaGFyIGlzX2NkZXZfYWRkOworCitleHRlcm4gc3RydWN0IHByb2NfZGlyX2VudHJ5ICpiY21vbHRfZGlyOworCitiY21vc19lcnJubyBiY210cl9pbml0KHZvaWQpCit7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIC9wcm9jL2JjbW9sdC90cm11eCByZWFkIG9wZXJhdGlvbiAqLworc3RhdGljIGludCB0cm11eF9zdGF0c19yZWFkKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworICAgIHN0YXRpYyBiY210cm11eF9zdGF0IHByZXZfc3RhdDsKKyAgICBpbnQgbGVuOworICAgIGJjbXRybXV4X3N0YXQgc3RhdDsKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBiY21vbHRfZGV2aWQgKmRldmljZV9pZCA9IGRhdGE7CisKKyAgICByYyA9IGJjbXRybXV4X3N0YXRfZ2V0KCpkZXZpY2VfaWQsICZzdGF0KTsKKyAgICBpZiAocmMpCisgICAgeworICAgICAgICBsZW4gPSBzbnByaW50ZihwYWdlLCBjb3VudCwgIkNhbid0IHJlYWQgdHJtdXggc3RhdGlzdGljcyByYz0lc1xuIiwgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICAgICAgcmV0dXJuIGxlbjsKKyAgICB9CisKKyAgICBsZW4gPSBzbnByaW50ZihwYWdlLCBjb3VudCwgInRybXV4IHN0YXRpc3RpY3NcblxuIik7CisgICAgbGVuICs9IHNwcmludGYocGFnZSArIGxlbiwgInR4X3JlbW90ZSAgICAgIDogJXVcbiIsIHN0YXQudHhfcmVtb3RlIC0gcHJldl9zdGF0LnR4X3JlbW90ZSk7CisgICAgbGVuICs9IHNwcmludGYocGFnZSArIGxlbiwgInR4X2xvY2FsICAgICAgIDogJXVcbiIsIHN0YXQudHhfbG9jYWwgLSBwcmV2X3N0YXQudHhfbG9jYWwpOworICAgIGxlbiArPSBzcHJpbnRmKHBhZ2UgKyBsZW4sICJ0eF9kaXNjX3JlbW90ZSA6ICV1XG4iLCBzdGF0LnR4X2Rpc2NfcmVtb3RlIC0gcHJldl9zdGF0LnR4X2Rpc2NfcmVtb3RlKTsKKyAgICBsZW4gKz0gc3ByaW50ZihwYWdlICsgbGVuLCAidHhfZGlzY19sb2NhbCAgOiAldVxuIiwgc3RhdC50eF9kaXNjX2xvY2FsIC0gcHJldl9zdGF0LnR4X2Rpc2NfbG9jYWwpOworICAgIGxlbiArPSBzcHJpbnRmKHBhZ2UgKyBsZW4sICJyeF9yZW1vdGUgICAgICA6ICV1XG4iLCBzdGF0LnJ4X3JlbW90ZSAtIHByZXZfc3RhdC5yeF9yZW1vdGUpOworICAgIGxlbiArPSBzcHJpbnRmKHBhZ2UgKyBsZW4sICJyeF9sb2NhbCAgICAgICA6ICV1XG4iLCBzdGF0LnJ4X2xvY2FsIC0gcHJldl9zdGF0LnJ4X2xvY2FsKTsKKyAgICBsZW4gKz0gc3ByaW50ZihwYWdlICsgbGVuLCAicnhfYXV0byAgICAgICAgOiAldVxuIiwgc3RhdC5yeF9hdXRvIC0gcHJldl9zdGF0LnJ4X2F1dG8pOworICAgIGxlbiArPSBzcHJpbnRmKHBhZ2UgKyBsZW4sICJyeF9kaXNjX3JlbW90ZSA6ICV1XG4iLCBzdGF0LnJ4X2Rpc2NfcmVtb3RlIC0gcHJldl9zdGF0LnJ4X2Rpc2NfcmVtb3RlKTsKKyAgICBsZW4gKz0gc3ByaW50ZihwYWdlICsgbGVuLCAicnhfZGlzY19sb2NhbCAgOiAldVxuIiwgc3RhdC5yeF9kaXNjX2xvY2FsIC0gcHJldl9zdGF0LnJ4X2Rpc2NfbG9jYWwpOworICAgIGxlbiArPSBzcHJpbnRmKHBhZ2UgKyBsZW4sICJyeF9kaXNjX2F1dG8gICA6ICV1XG4iLCBzdGF0LnJ4X2Rpc2NfYXV0byAtIHByZXZfc3RhdC5yeF9kaXNjX2F1dG8pOworICAgIGxlbiArPSBzcHJpbnRmKHBhZ2UgKyBsZW4sICJjdGxfdG9faG9zdCAgICA6ICV1XG4iLCBzdGF0LmNvbnRyb2xfdG9faG9zdCAtIHByZXZfc3RhdC5jb250cm9sX3RvX2hvc3QpOworICAgIGxlbiArPSBzcHJpbnRmKHBhZ2UgKyBsZW4sICJjdGxfdG9fbGluZSAgICA6ICV1XG4iLCBzdGF0LmNvbnRyb2xfdG9fbGluZSAtIHByZXZfc3RhdC5jb250cm9sX3RvX2xpbmUpOworICAgIGxlbiArPSBzcHJpbnRmKHBhZ2UgKyBsZW4sICJyeF9kaXNjX2ludl9jaCA6ICV1XG4iLCBzdGF0LnJ4X2Rpc2NfaW52X2NoIC0gcHJldl9zdGF0LnJ4X2Rpc2NfaW52X2NoKTsKKyAgICBsZW4gKz0gc3ByaW50ZihwYWdlICsgbGVuLCAicnhfcG9sbF91cmdlbnQgOiAldVxuIiwgc3RhdC5yeF9wb2xsX3VyZ2VudCAtIHByZXZfc3RhdC5yeF9wb2xsX3VyZ2VudCk7CisgICAgbGVuICs9IHNwcmludGYocGFnZSArIGxlbiwgInJ4X3BvbGxfbm9ybWFsIDogJXVcbiIsIHN0YXQucnhfcG9sbF9ub3JtYWwgLSBwcmV2X3N0YXQucnhfcG9sbF9ub3JtYWwpOworICAgIHByZXZfc3RhdCA9IHN0YXQ7CisKKyAgICByZXR1cm4gbGVuOworfQorCisvKiAvcHJvYy9iY21vbHQvZGV2Y3RybCByZWFkIG9wZXJhdGlvbiAqLworc3RhdGljIGludCBkZXZjdHJsX2RlYnVnX3JlYWQoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisgICAgaW50IGxlbjsKKyAgICBkZXZfY3RybF9kYXRhYmFzZSBkYjsKKyAgICBiY21vbHRfZGV2aWQgKmRldmljZV9pZCA9IGRhdGE7CisKKyAgICBkZXZfY3RybF9yZWFkX2RiKCpkZXZpY2VfaWQsICZkYik7CisKKyAgICAvKiBkYiBjb250YWlucyB0aGUgZW50aXJlIGNvcHkgb2YgZGV2X2N0cmxfZGF0YWJhc2UuIGFkZCB3aGF0ZXZlciB5b3Ugd2FudCB0byBwcmludC4gKi8KKyAgICBsZW4gPSBzbnByaW50ZihwYWdlLCBjb3VudCwgImRldl9jdHJsIGRlYnVnIGluZm9ybWF0aW9uXG5cbiIpOworICAgIGxlbiArPSBzcHJpbnRmKHBhZ2UgKyBsZW4sICJ0YXNrIG5hbWUgICAgICAgICAgICAgICAgIDogJXNcbiIsIGRiLnRhc2tfaW5mby5uYW1lKTsKKyAgICBsZW4gKz0gc3ByaW50ZihwYWdlICsgbGVuLCAibW9kdWxlIG5hbWUgICAgICAgICAgICAgICA6ICVzXG4iLCBkYi5tb2R1bGVfaW5mby5uYW1lKTsKKyAgICBsZW4gKz0gc3ByaW50ZihwYWdlICsgbGVuLCAiY29ubmVjdGlvbiBzdGF0ZSAgICAgICAgICA6ICVzXG4iLAorICAgICAgICBiY21fc3RyX2hvc3RfY29ubmVjdGluZ19zdGF0ZShkYi5jb25uZWN0aW9uX2luZm8uc3RhdGUpKTsKKyAgICBsZW4gKz0gc3ByaW50ZihwYWdlICsgbGVuLCAidG9kICAgICAgICAgICAgICAgICAgICAgICA6ICVzXG4iLAorICAgICAgICAoZGIuZW5hYmxlX3RvZCA9PSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFKSA/ICJESVNBQkxFIiA6ICJFTkFCTEUiKTsKKyAgICBsZW4gKz0gc3ByaW50ZihwYWdlICsgbGVuLCAibGFzdCBldmVudCAgICAgICAgICAgICAgICA6ICVzXG4iLCBiY21fc3RyX2RldmljZV9ldmVudChkYi5sYXN0X2V2ZW50KSk7CisgICAgaWYgKGRiLmNvbm5fZmFpbF9yZWFzb24gPCBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX19OVU1fT0YpCisgICAgICAgIGxlbiArPSBzcHJpbnRmKHBhZ2UgKyBsZW4sICJjb25uZWN0aW9uIGZhaWx1cmUgcmVhc29uIDogJXNcbiIsCisgICAgICAgICAgICBiY21fc3RyX2hvc3RfY29ubmVjdGlvbl9mYWlsX3JlYXNvbihkYi5jb25uX2ZhaWxfcmVhc29uKSk7CisgICAgcmV0dXJuIGxlbjsKK30KKworI2lmZGVmIEVOQUJMRV9MT0cKK3N0YXRpYyBiY21vc19lcnJubyBkZXZfY3RybF9sb2dnZXJfaW5pdF9jYih2b2lkKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgLyogQ3JlYXRlIGtlcm5lbCBsb2dnZXIgKi8KKyAgICByYyA9IGJjbV9kZXZfbG9nX2xpbnV4X2luaXQoKTsKKyAgICBCVUdfT04ocmMpOworCisgICAgLyogRm9yIG5vdyBqdXN0IG1hcCBCQ01PU19UUkFDRV9YWCB0byBkZXZfbG9nLiBMYXRlciBvbiBkZXZfY29udHJvbAorICAgICAqIGNhbiBkZWZpbmUgaXRzIG93biBsb2cgaWRzCisgICAgICovCisgICAgcmMgPSBiY21fZGV2X2xvZ19vc190cmFjZV9pbml0KCk7CisgICAgQlVHX09OKHJjKTsKKworICAgIHJldHVybiByYzsKK30KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGNkZXYgbWFwbGVfZGV2X2N0cmxfY2hyZGV2X2NkZXY7CitzdGF0aWMgaW50IG1hcGxlX2Rldl9jdHJsX2NocmRldl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1hcGxlX2Rldl9jdHJsX2NocmRldl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgbG9uZyBtYXBsZV9kZXZfY3RybF9jaHJkZXZfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworICAgIGJjbW9zX2Vycm5vIGJjbXJjOworICAgIGludCBsaW51eF9yYyA9IDA7CisgICAgaW50IHJjID0gMDsKKyAgICBkZXZfY3RybF9pb2N0bF9wYXJhbSBwYXJhbXM7CisKKyAgICAvKiBkb24ndCBldmVuIGRlY29kZSB3cm9uZyBjbWRzOiBiZXR0ZXIgcmV0dXJuaW5nICBFTk9UVFkgdGhhbiBFRkFVTFQgKi8KKyAgICBpZiAoX0lPQ19UWVBFKGNtZCkgIT0gTUFQTEVfREVWX0NUUkxfSU9DVExfTUFHSUMpCisgICAgICAgIHJldHVybiAtRU5PVFRZOworCisgICAgcmMgPSBjb3B5X2Zyb21fdXNlcigoY2hhciAqKSZwYXJhbXMsIChjaGFyICopYXJnLCBzaXplb2YocGFyYW1zKSk7CisgICAgaWYgKHJjIDwgMCkKKyAgICAgICAgcmV0dXJuIHJjOworCisgICAgc3dpdGNoIChjbWQpCisgICAgeworICAgIGNhc2UgTUFQTEVfREVWX0NUUkxfSU9DVExfT1BfUENJX1NUQVQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbV9wY2llZF9zdGF0IHN0YXQ7CisKKyAgICAgICAgICAgIG1lbXNldChwYXJhbXMuZHVtcHB0ciwgMCwgc2l6ZW9mKGJjbV9wY2llZF9zdGF0KSk7CisgICAgICAgICAgICBiY21yYyA9IGJjbXRyX3BjaWVfZ2V0X3N0YXRpc3RpY3MocGFyYW1zLmRldmljZSwgcGFyYW1zLnN0YXJ0X2luZGV4LCAmc3RhdCk7CisgICAgICAgICAgICBpZiAoYmNtcmMgPT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgICAgICBtZW1jcHkocGFyYW1zLmR1bXBwdHIsICZzdGF0LCBzaXplb2YoYmNtX3BjaWVkX3N0YXQpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBsaW51eF9yYyA9IChpbnQpYmNtcmM7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNQVBMRV9ERVZfQ1RSTF9JT0NUTF9PUF9QQ0lfRFVNUF9UWDoKKyAgICAgICAgbGludXhfcmMgPSAoaW50KWJjbXRyX3BjaWVfdHhfZHVtcCgoY2hhciAqKXBhcmFtcy5kdW1wcHRyLCBwYXJhbXMuZGV2aWNlLCBwYXJhbXMuc3RhcnRfaW5kZXgsIHBhcmFtcy5ob3dtYW55KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNQVBMRV9ERVZfQ1RSTF9JT0NUTF9PUF9QQ0lfRFVNUF9SWDoKKyAgICAgICAgbGludXhfcmMgPSAoaW50KWJjbXRyX3BjaWVfcnhfZHVtcCgoY2hhciAqKXBhcmFtcy5kdW1wcHRyLCBwYXJhbXMuZGV2aWNlLCBwYXJhbXMuc3RhcnRfaW5kZXgsIHBhcmFtcy5ob3dtYW55KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNQVBMRV9ERVZfQ1RSTF9JT0NUTF9PUF9IT1NUX0VWRU5UX1dSSVRFOgorICAgICAgICBsaW51eF9yYyA9IChpbnQpYmNtb2x0X2Rldl9jdHJsX2hvc3RfZXZlbnRfd3JpdGUocGFyYW1zLmRldmljZSwgcGFyYW1zLmV2ZW50KTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmMgPSAtRU5PVFRZOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gbGludXhfcmM7Cit9CitzdGF0aWMgc3NpemVfdCBtYXBsZV9kZXZfY3RybF9jaHJkZXZfd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKmZfcG9zKQoreworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtYXBsZV9kZXZfY3RybF9jaHJkZXZfZm9wcyA9Cit7CisgICAgLm93bmVyID0gVEhJU19NT0RVTEUsCisgICAgLm9wZW4gPSBtYXBsZV9kZXZfY3RybF9jaHJkZXZfb3BlbiwKKyAgICAucmVsZWFzZSA9IG1hcGxlX2Rldl9jdHJsX2NocmRldl9yZWxlYXNlLAorICAgIC53cml0ZSA9IG1hcGxlX2Rldl9jdHJsX2NocmRldl93cml0ZSwKKyAgICAudW5sb2NrZWRfaW9jdGwgPSBtYXBsZV9kZXZfY3RybF9jaHJkZXZfaW9jdGwKK307CisKK3N0YXRpYyBpbnQgbWFwbGVfZGV2X2N0cmxfZGV2X2NyZWF0ZV9jaHJkZXYodm9pZCkKK3sKKyAgICBkZXZfdCBkZXYgPSBNS0RFVihtYXBsZV9kZXZfY3RybF9jaHJkZXZfbWFqb3IsIDApOworICAgIGludCBsaW51eF9yYzsKKyAgICBpc19jaHJkZXZfcmVnID0gMDsKKyAgICBpc19jZGV2X2FkZCA9IDA7CisgICAgLyoKKyAgICAgKiBSZWdpc3RlciB5b3VyIG1ham9yLCBhbmQgYWNjZXB0IGEgZHluYW1pYyBudW1iZXIuCisgICAgICovCisgICAgaWYgKCFtYXBsZV9kZXZfY3RybF9jaHJkZXZfbWFqb3IpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBsaW51eF9yYyA9IHJlZ2lzdGVyX2NocmRldl9yZWdpb24oZGV2LCAwLCAibWFwbGVfZGV2X2N0cmwiKTsKKyAgICBpZiAobGludXhfcmMgPCAwKQorICAgIHsKKyAgICAgICAgcHJpbnRrKCJyZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKCktPiVkXG4iLCBsaW51eF9yYyk7CisgICAgICAgIHJldHVybiAtRUlPOworICAgIH0KKyAgICBpc19jaHJkZXZfcmVnID0gMTsKKworICAgIGNkZXZfaW5pdCgmbWFwbGVfZGV2X2N0cmxfY2hyZGV2X2NkZXYsICZtYXBsZV9kZXZfY3RybF9jaHJkZXZfZm9wcyk7CisgICAgbGludXhfcmMgPSBjZGV2X2FkZCgmbWFwbGVfZGV2X2N0cmxfY2hyZGV2X2NkZXYsIGRldiwgMSk7CisgICAgaWYgKGxpbnV4X3JjIDwgMCkKKyAgICB7CisgICAgICAgIHByaW50aygiY2Rldl9hZGQoKS0+JWRcbiIsIGxpbnV4X3JjKTsKKyAgICAgICAgcmV0dXJuIC1FSU87CisgICAgfQorICAgIGlzX2NkZXZfYWRkID0gMTsKKyAgICByZXR1cm4gMDsKK30KKworCisjZGVmaW5lIEJDTU9MVF9QUk9DRlNfTkFNRV9MRU4gIDQgICAgICAgLyogZGV2aWNlX2lkIGlzIDEtYnl0ZSwgd2hpY2ggY2FuIGJlIDMgZGlnaXQgaW4gZGVjaW1hbC4gKi8KKyNkZWZpbmUgUFJPQ19UUk1VWF9OQU1FICAgICAgICAgInRybXV4IgorI2RlZmluZSBQUk9DX0RFVkNUUkxfTkFNRSAgICAgICAiZGV2Y3RybCIKKyNkZWZpbmUgUFJPQ19FTlRSWV9NT0RFICAgICAgICAgKFNfSUZSRUcgfCBTX0lXVVNSIHwgU19JUlVHTykKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlX2lkOworICAgIGNoYXIgbmFtZVtCQ01PTFRfUFJPQ0ZTX05BTUVfTEVOXTsKK30gYmNtb2x0X3Byb2NfY3R4X3Q7CisKK3N0YXRpYyBiY21vbHRfcHJvY19jdHhfdCBiY21vbHRfcHJvY19jdHhbQkNNVFJfTUFYX09MVFNdOworc3RhdGljIGJjbW9zX2Jvb2wgYmNtZGV2X2JjbW9sdF9wcm9jX2luaXRpYWxpemVkOworc3RydWN0IHByb2NfZGlyX2VudHJ5ICp0cm11eF9kaXIgPSBOVUxMOworc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkZXZjdHJsX2RpciA9IE5VTEw7CisKK3N0YXRpYyB2b2lkIGJjbWRldl9iY21vbHRfcHJvY19pbml0KHZvaWQpCit7CisgICAgYmNtb2x0X2RldmlkIGRldmlkOworICAgIGlmICghYmNtZGV2X2JjbW9sdF9wcm9jX2luaXRpYWxpemVkKQorICAgIHsKKyAgICAgICAgZm9yIChkZXZpZCA9IDA7IGRldmlkIDwgQkNNVFJfTUFYX09MVFM7IGRldmlkKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9wcm9jX2N0eFtkZXZpZF0uZGV2aWNlX2lkID0gZGV2aWQ7CisgICAgICAgICAgICBzcHJpbnRmKGJjbW9sdF9wcm9jX2N0eFtkZXZpZF0ubmFtZSwgIiVkIiwgZGV2aWQpOworICAgICAgICB9CisgICAgICAgIGJjbWRldl9iY21vbHRfcHJvY19pbml0aWFsaXplZCA9IEJDTU9TX1RSVUU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBiY21kZXZfbW9kdWxlX2V4aXQodm9pZCkKK3sKKyAgICBpbnQgZGV2aWQ7CisKKyAgICBpZiAodHJtdXhfZGlyKQorICAgIHsKKyAgICAgICAgZm9yIChkZXZpZCA9IDA7IGRldmlkIDwgQkNNVFJfTUFYX09MVFM7IGRldmlkKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlbW92ZV9wcm9jX2VudHJ5KGJjbW9sdF9wcm9jX2N0eFtkZXZpZF0ubmFtZSwgdHJtdXhfZGlyKTsKKyAgICAgICAgfQorICAgICAgICByZW1vdmVfcHJvY19lbnRyeShQUk9DX1RSTVVYX05BTUUsIGJjbW9sdF9kaXIpOworICAgIH0KKyAgICBpZiAoZGV2Y3RybF9kaXIpCisgICAgeworICAgICAgICBmb3IgKGRldmlkID0gMDsgZGV2aWQgPCBCQ01UUl9NQVhfT0xUUzsgZGV2aWQrKykKKyAgICAgICAgeworICAgICAgICAgICAgcmVtb3ZlX3Byb2NfZW50cnkoYmNtb2x0X3Byb2NfY3R4W2RldmlkXS5uYW1lLCBkZXZjdHJsX2Rpcik7CisgICAgICAgIH0KKyAgICAgICAgcmVtb3ZlX3Byb2NfZW50cnkoUFJPQ19ERVZDVFJMX05BTUUsIGJjbW9sdF9kaXIpOworICAgIH0KKworICAgIGJjbW9sdF9kZXZfY3RybF9leGl0KCk7CisgICAgYmNtdHJfbmxfZXhpdCgpOworICAgIGlmIChpc19jZGV2X2FkZCkKKyAgICAgICBjZGV2X2RlbCgmbWFwbGVfZGV2X2N0cmxfY2hyZGV2X2NkZXYpOworICAgIGlmIChpc19jaHJkZXZfcmVnKQorICAgICAgIHVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihNS0RFVihtYXBsZV9kZXZfY3RybF9jaHJkZXZfbWFqb3IsIDApLCAxKTsKKyNpZiBkZWZpbmVkKEVOQUJMRV9MT0cpCisgICAgYmNtX2Rldl9sb2dfbGludXhfZXhpdCgpOworICAgIGJjbV9kZXZfbG9nX2Rlc3Ryb3koKTsKKyNlbmRpZgorICAgIHByaW50aygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7Cit9CisKK3N0YXRpYyBpbnQgYmNtZGV2X21vZHVsZV9pbml0KHZvaWQpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgc3RydWN0IHByb2NfZGlyX2VudHJ5ICp0cm11eF9maWxlOworICAgIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGV2Y3RybF9maWxlOworICAgIGJjbW9sdF9kZXZpZCBkZXZpZDsKKyAgICBiY21vbHRfaG9zdF9pbml0X3BhcmFtcyBwYXJhbXMgPQorICAgIHsKKyNpZmRlZiBFTkFCTEVfTE9HCisgICAgICAgIC5sb2dnZXJfaW5pdF9jYiA9IGRldl9jdHJsX2xvZ2dlcl9pbml0X2NiLAorI2VuZGlmCisgICAgICAgIC5kZXZfY3RybF9wYXJhbXMgPQorICAgICAgICB7CisgICAgICAgICAgICAuaW1hZ2VfcmVhZF9jYiA9IGJjbXVzZXJfaW1hZ2VfcmVhZCwKKyAgICAgICAgICAgIC5zeXN0ZW1fbW9kZV92YWxpZGF0ZV9jYiA9IGJjbXVzZXJfc3lzdGVtX21vZGVfdmFsaWRhdGUsCisgICAgICAgICAgICAuZGV2aWNlX29mZl9jYiA9IGJjbXVzZXJfZGV2aWNlX29mZiwKKyAgICAgICAgICAgIC5kZXZpY2Vfb25fY2IgPSBiY211c2VyX2RldmljZV9vbiwKKyAgICAgICAgICAgIC5kZXZpY2VfaXNfcnVubmluZ19jYiA9IGJjbXVzZXJfZGV2aWNlX2lzX3J1bm5pbmcsCisgICAgICAgICAgICAuaG9zdF9yZXNldF9jYiA9IGJjbXVzZXJfaG9zdF9yZXNldCwKKyAgICAgICAgICAgIC5wY2llX2NoYW5uZWxfcHJlcGFyZV9jYiA9IGJjbXVzZXJfcGNpZV9jaGFubmVsX3ByZXBhcmUsCisgICAgICAgICAgICAucGNpZV9jaGFubmVsX3JlbW92ZV9jYiA9IGJjbXVzZXJfcGNpZV9jaGFubmVsX3JlbW92ZSwKKyAgICAgICAgfQorICAgIH07CisKKyAgICBpZiAoIWlzX2NkZXZfYWRkKQorICAgIHsKKyAgICAgICAgaWYgKG1hcGxlX2Rldl9jdHJsX2Rldl9jcmVhdGVfY2hyZGV2KCkgPCAwKQorICAgICAgICAgICAgcHJpbnRrKCIlcyBlcnJvciB0byBjcmVhdGUgZGV2IGN0cmwgY2RldiBcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgfQorCisgICAgcHJpbnRrKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKworICAgIHJjID0gYmNtb2x0X2hvc3RfaW5pdCgmcGFyYW1zKTsKKyAgICBCVUdfT04ocmMpOworCisgICAgYmNtb3NfdHJhY2VfbGV2ZWxfc2V0KEJDTU9TX1RSQUNFX0xFVkVMX0RFQlVHKTsKKworICAgIGJjbWRldl9iY21vbHRfcHJvY19pbml0KCk7CisKKyAgICByYyA9IGJjbXRyX25sX2luaXQoKTsKKyAgICBCVUdfT04ocmMpOworCisgICAgcmMgPSBiY211c2VyX3BjaWVfcHJlcGFyZSgpOworCisgICAgaWYgKHJjID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBpZiAoKHRybXV4X2RpciA9IGNyZWF0ZV9wcm9jX2VudHJ5KFBST0NfVFJNVVhfTkFNRSwgU19JRkRJUiwgYmNtb2x0X2RpcikpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50aygiVW5hYmxlIHRvIGNyZWF0ZSAvcHJvYy9iY21vbHQvdHJtdXggZGlyZWN0b3J5XG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoZGV2Y3RybF9kaXIgPSBjcmVhdGVfcHJvY19lbnRyeShQUk9DX0RFVkNUUkxfTkFNRSwgU19JRkRJUiwgYmNtb2x0X2RpcikpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50aygiVW5hYmxlIHRvIGNyZWF0ZSAvcHJvYy9iY21vbHQvZGV2Y3RybCBkaXJlY3RvcnlcbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChkZXZpZCA9IDA7IGRldmlkIDwgQkNNVFJfTUFYX09MVFM7IGRldmlkKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgodHJtdXhfZmlsZSA9IGNyZWF0ZV9wcm9jX2VudHJ5KGJjbW9sdF9wcm9jX2N0eFtkZXZpZF0ubmFtZSwgUFJPQ19FTlRSWV9NT0RFLCB0cm11eF9kaXIpKSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50aygiVW5hYmxlIHRvIGNyZWF0ZSAvcHJvYy9iY21vbHQvJXMvJXNcbiIsIFBST0NfVFJNVVhfTkFNRSwgYmNtb2x0X3Byb2NfY3R4W2RldmlkXS5uYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cm11eF9maWxlLT5yZWFkX3Byb2MgPSAocmVhZF9wcm9jX3QgKil0cm11eF9zdGF0c19yZWFkOworICAgICAgICAgICAgdHJtdXhfZmlsZS0+ZGF0YSA9ICZiY21vbHRfcHJvY19jdHhbZGV2aWRdLmRldmljZV9pZDsKKworICAgICAgICAgICAgaWYgKChkZXZjdHJsX2ZpbGUgPSBjcmVhdGVfcHJvY19lbnRyeShiY21vbHRfcHJvY19jdHhbZGV2aWRdLm5hbWUsIFBST0NfRU5UUllfTU9ERSwgZGV2Y3RybF9kaXIpKSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50aygiVW5hYmxlIHRvIGNyZWF0ZSAvcHJvYy9iY21vbHQvJXMvJXNcbiIsIFBST0NfREVWQ1RSTF9OQU1FLCBiY21vbHRfcHJvY19jdHhbZGV2aWRdLm5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRldmN0cmxfZmlsZS0+cmVhZF9wcm9jID0gKHJlYWRfcHJvY190ICopZGV2Y3RybF9kZWJ1Z19yZWFkOworICAgICAgICAgICAgZGV2Y3RybF9maWxlLT5kYXRhID0gJmJjbW9sdF9wcm9jX2N0eFtkZXZpZF0uZGV2aWNlX2lkOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgCWJjbW9zX3VzbGVlcCgyMDAwMDAwKTsKKyAgICAJYmNtZGV2X21vZHVsZV9leGl0KCk7CisgICAgfQorCisgICAgcmV0dXJuIHJjID8gLUVJTlZBTCA6IDA7Cit9CisKK21vZHVsZV9pbml0KGJjbWRldl9tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChiY21kZXZfbW9kdWxlX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oImRldmljZV9jb250cm9sIik7CitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2VtYmVkZGVkX2NsaS9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvZW1iZWRkZWRfY2xpL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NjdhYzMKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2VtYmVkZGVkX2NsaS9NYWtlZmlsZQpAQCAtMCwwICsxLDEzIEBACisjIEhvc3QgQVBJCisjCitpZmVxICgiJChFTkFCTEVfQ0xJKSIsICJ5IikKKyAgICBNT0RfTkFNRSA9IGVtYmVkZGVkX2NsaQorICAgIE1PRF9UWVBFID0gbGliCisgICAgTU9EX0RFUFMgPSB0cmFuc3BvcnQgbW9kZWwgY2xpCitpZmVxICgiJChSRUxFQVNFX0JVSUxEKSIsICJ5IikKKyAgICBNT0RfREVQUyArPSBjb21tb25fYXBpCitlbHNlCisgICAgTU9EX0RFUFMgKz0gYXBpCitlbmRpZgorICAgIHNyY3MgPSBiY21vbHRfZW1iZWRkZWRfY2xpLmMKK2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2VtYmVkZGVkX2NsaS9iY21vbHRfZW1iZWRkZWRfY2xpLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2VtYmVkZGVkX2NsaS9iY21vbHRfZW1iZWRkZWRfY2xpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM1YThmNwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvZW1iZWRkZWRfY2xpL2JjbW9sdF9lbWJlZGRlZF9jbGkuYwpAQCAtMCwwICsxLDI2OCBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworLyoKKyAqIGJjbV9lbWJlZGRlZF9jbGkuYyAtIGVtYmVkZGVkIENMSSBhY2Nlc3MgZnJvbSB0aGUgaG9zdAorICovCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21vbHRfZW1iZWRkZWRfY2xpLmg+CisjaW5jbHVkZSA8YmNtb2x0X21vZGVsX3R5cGVzLmg+CisjaW5jbHVkZSA8YmNtb2x0X2FwaS5oPgorI2luY2x1ZGUgPGJjbXRyX2ludGVyZmFjZS5oPgorI2luY2x1ZGUgPGJjbWNsaS5oPgorCisjZGVmaW5lIEVNQkVEREVEX0NMSV9CVUZGRVJfU0laRSAgICAgICAgMjA0OAorI2RlZmluZSBFTUJFRERFRF9DTElfVElNRVJfREVMQVlfVVMgICAgIDEwMDAwMAorCisvKiBFbWJlZGRlZCBDTEkgY2xpZW50IGNvbnRleHQgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgYmNtb2x0X2RldmlkIGRldmljZTsKKyAgICBiY21vc190YXNrIHRhc2s7CisgICAgYmNtb3NfdGltZXIgdGltZXI7CisgICAgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb247CisgICAgdWludDhfdCBpbmJ1ZltFTUJFRERFRF9DTElfQlVGRkVSX1NJWkVdOworICAgIHVpbnQzMl90IGluYnVmX2xlbmd0aDsKK30gZW1iZWRkZWRfY2xpX2NvbnRleHQ7CisKK3N0YXRpYyBlbWJlZGRlZF9jbGlfY29udGV4dCAqY2xpX2NvbnRleHQ7CisKK3N0YXRpYyBiY21vc190aW1lcl9yYyBlbWJlZGRlZF9jbGlfdGltZXJfaGFuZGxlcihiY21vc190aW1lciAqdGltZXIsIGxvbmcgZGF0YSkKK3sKKyAgICAvKiBGRlU6IHRoaXMgdGltZXIgaXMgZm9yIGZ1dHVyZSBsaW5lIGVkaXRpbmcgc3VwcG9ydCAqLworICAgIHJldHVybiBCQ01PU19USU1FUl9PSzsKK30KKworc3RhdGljIHZvaWQgZW1iZWRkZWRfY2xpX291dHB1dF9tc2dfaGFuZGxlcihiY21vbHRfZGV2aWQgb2x0LCBiY21vbHRfbXNnICptc2cpCit7CisgICAgYmNtb2x0X2RlYnVnX2NsaV9pbnB1dCAqY2xpX21zZyA9IChiY21vbHRfZGVidWdfY2xpX2lucHV0ICopbXNnOworCisgICAgaWYgKGNsaV9jb250ZXh0ICYmIGNsaV9tc2ctPmRhdGEuZGF0YS52YWwpCisgICAgeworICAgICAgICAvKiBwcmludCBkaXJlY3RseSBiZWNhdXNlIG91dHB1dCBjYW4gY29udGFpbiBFU0Mgc2VxdWVuY2VzICovCisgICAgICAgIHVpbnQ4X3QgKnZhbCA9IGNsaV9tc2ctPmRhdGEuZGF0YS52YWw7CisgICAgICAgIHdoaWxlICgqdmFsKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19wdXRjaGFyKCoodmFsKyspKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBiY21vbHRfbXNnX2ZyZWUobXNnKTsKK30KKworc3RhdGljIHZvaWQgZW1iZWRkZWRfY2xpX3NlbmRfaW5wdXQoZW1iZWRkZWRfY2xpX2NvbnRleHQgKmNvbnRleHQpCit7CisgICAgYmNtb2x0X2RlYnVnX2tleSBrZXkgPSB7fTsKKyAgICBiY21vbHRfZGVidWdfY2xpX2lucHV0IG1zZzsKKyAgICBiY21vbHRfdThfbGlzdF91MzIgZGF0YSA9IHsgY29udGV4dC0+aW5idWZfbGVuZ3RoLCBjb250ZXh0LT5pbmJ1ZiB9OworCisgICAgaWYgKCFjb250ZXh0LT5pbmJ1Zl9sZW5ndGgpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEJDTU9MVF9PUEVSX0lOSVQoJm1zZywgZGVidWcsIGNsaV9pbnB1dCwga2V5KTsKKyAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmbXNnLCBkZWJ1ZywgY2xpX2lucHV0LCBkYXRhLCBkYXRhKTsKKyAgICBiY21vbHRfb3Blcl9zdWJtaXQoY29udGV4dC0+ZGV2aWNlLCAmbXNnLmhkcik7CisgICAgY29udGV4dC0+aW5idWZfbGVuZ3RoID0gMDsKK30KKworLyogSW5pdGlhbGl6ZSBlbWJlZGRlZCBDTEkgbW9kdWxlICovCitiY21vc19lcnJubyBiY21fZW1iZWRkZWRfY2xpX2VudGVyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBiY21vbHRfZGV2aWQgZGV2aWNlKQoreworICAgIHN0YXRpYyBjaGFyICplbWJlZGRlZF9jbGlfdGFza19uYW1lID0gImVtYmVkZGVkX2NsaSI7CisgICAgYmNtb3NfdGFza19wYXJtIHRhc2twID0KKyAgICB7CisgICAgICAgIC5uYW1lID0gZW1iZWRkZWRfY2xpX3Rhc2tfbmFtZSwKKyAgICAgICAgLnByaW9yaXR5ID0gVEFTS19QUklPUklUWV9DTEksCisgICAgICAgIC5kYXRhID0gZGV2aWNlCisgICAgfTsKKyAgICBiY21vc19tb2R1bGVfcGFybSBtb2R1bGVwID0ge307CisgICAgYmNtb3NfdGltZXJfcGFybSB0aW1lcnAgPQorICAgIHsKKyAgICAgICAgLm93bmVyID0gQkNNT1NfTU9EVUxFX0lEX0NMSV9PVkVSX1BDSUUsCisgICAgICAgIC5oYW5kbGVyID0gZW1iZWRkZWRfY2xpX3RpbWVyX2hhbmRsZXIsCisgICAgICAgIC5kYXRhID0gZGV2aWNlCisgICAgfTsKKyAgICBiY210cl9oYW5kbGVyX3Bhcm0gbXNncCA9CisgICAgeworICAgICAgICAub2JqZWN0ID0gQkNNT0xUX09CSl9JRF9ERUJVRywKKyAgICAgICAgLmdyb3VwID0gQkNNT0xUX01HVF9HUk9VUF9BVVRPLAorICAgICAgICAuc3ViZ3JvdXAgPSBCQ01PTFRfREVCVUdfQVVUT19JRF9DTElfT1VUUFVULAorICAgICAgICAubW9kdWxlID0gQkNNT1NfTU9EVUxFX0lEX0NMSV9PVkVSX1BDSUUsCisgICAgICAgIC5hcHBfY2IgPSBlbWJlZGRlZF9jbGlfb3V0cHV0X21zZ19oYW5kbGVyLAorICAgICAgICAuZmxhZ3MgPSBCQ01PTFRfQVVUT19GTEFHU19ESVNQQVRDSAorICAgIH07CisgICAgYmNtdHJfaGFuZGxlcl9wYXJtIG9sZF9tc2dwID0KKyAgICB7CisgICAgICAgIC5vYmplY3QgPSBCQ01PTFRfT0JKX0lEX0RFQlVHLAorICAgICAgICAuZ3JvdXAgPSBCQ01PTFRfTUdUX0dST1VQX0FVVE8sCisgICAgICAgIC5zdWJncm91cCA9IEJDTU9MVF9ERUJVR19BVVRPX0lEX0NMSV9PVVRQVVQsCisgICAgfTsKKworICAgIGludCBjOworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGJjbW9zX2Jvb2wgcmF3X21vZGUgPSBCQ01PU19GQUxTRTsKKworICAgIC8qIE9ubHkgMSBpbnN0YW5jZSBpcyBzdXBwb3J0ZWQgKi8KKyAgICBpZiAoY2xpX2NvbnRleHQpCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9BTFJFQURZLCAiZW1iZWRkZWRfY2xpIGNsaWVudCBpcyBhbHJlYWR5IGFjdGl2ZSBmb3IgZGV2aWNlICV1XG4iLAorICAgICAgICAgICAgY2xpX2NvbnRleHQtPmRldmljZSk7CisgICAgfQorICAgIGNsaV9jb250ZXh0ID0gYmNtb3NfY2FsbG9jKHNpemVvZigqY2xpX2NvbnRleHQpKTsKKyAgICBpZiAoIWNsaV9jb250ZXh0KQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfTk9NRU0sICJjYW4ndCBhbGxvY2F0ZSBlbWJlZGRlZCBDTEkgY29udGV4dFxuIik7CisgICAgfQorICAgIGNsaV9jb250ZXh0LT5zZXNzaW9uID0gc2Vzc2lvbjsKKyAgICBjbGlfY29udGV4dC0+ZGV2aWNlID0gZGV2aWNlOworCisgICAgLyogQ3JlYXRlIGlucHV0L291dHB1dCB0YXNrICYgbW9kdWxlICovCisgICAgcmMgPSBiY21vc190YXNrX2NyZWF0ZSgmY2xpX2NvbnRleHQtPnRhc2ssICZ0YXNrcCk7CisgICAgaWYgKHJjKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJDYW4ndCBjcmVhdGUgZW1iZWRkZWQgY2xpIHRhc2s6ICVzXG4iLCBiY21vc19zdHJlcnJvcihyYykpOworICAgICAgICBnb3RvIGNsZWFudXAxOworICAgIH0KKworICAgIG1vZHVsZXAuZGF0YSA9IChsb25nKWNsaV9jb250ZXh0OworICAgIHJjID0gYmNtb3NfbW9kdWxlX2NyZWF0ZShCQ01PU19NT0RVTEVfSURfQ0xJX09WRVJfUENJRSwgJmNsaV9jb250ZXh0LT50YXNrLCAmbW9kdWxlcCk7CisgICAgaWYgKHJjKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJDYW4ndCBjcmVhdGUgZW1iZWRkZWQgY2xpIG1vZHVsZTogJXNcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgICAgIGdvdG8gY2xlYW51cDI7CisgICAgfQorCisgICAgdGltZXJwLmRhdGEgPSAobG9uZyljbGlfY29udGV4dDsKKyAgICByYyA9IGJjbW9zX3RpbWVyX2NyZWF0ZSgmY2xpX2NvbnRleHQtPnRpbWVyLCAmdGltZXJwKTsKKyAgICBpZiAocmMpCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9FUlIoIkNhbid0IGNyZWF0ZSBlbWJlZGRlZCBjbGkgdGltZXI6ICVzXG4iLCBiY21vc19zdHJlcnJvcihyYykpOworICAgICAgICBnb3RvIGNsZWFudXAzOworICAgIH0KKworICAgIC8qIFF1ZXJ5IGV4aXN0aW5nIGluZGljYXRpb24gaW4gb3JkZXIgdG8gYmUgYWJsZSB0byByZXN0b3JlIGl0ICovCisgICAgYmNtdHJfbXNnX2hhbmRsZXJfcmVnaXN0ZXJfZ2V0KGRldmljZSwgJm9sZF9tc2dwKTsKKworICAgIC8qIFVucmVnaXN0ZXIgb2xkIGhhbmRsZXIgKi8KKyAgICBiY210cl9tc2dfaGFuZGxlcl91bnJlZ2lzdGVyKGRldmljZSwgJm9sZF9tc2dwKTsKKworICAgIC8qIFJlZ2lzdGVyIGZvciBjbGlfb3V0cHV0IGluZGljYXRpb24gKi8KKyAgICByYyA9IGJjbXRyX21zZ19oYW5kbGVyX3JlZ2lzdGVyKGRldmljZSwgJm1zZ3ApOworICAgIGlmIChyYykKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiQ2FuJ3QgcmVnaXN0ZXIgZm9yIGNsaV9vdXRwdXQgaW5kaWNhdGlvbjogJXNcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgICAgIGdvdG8gY2xlYW51cDQ7CisgICAgfQorCisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIkRldmljZSAldTogRW50ZXJpbmcgZW1iZWRkZWQgQ0xJLiBUeXBlICVjIHRvIHRlcm1pbmF0ZVxuIiwKKyAgICAgICAgZGV2aWNlLCBCQ01fRU1CRURERURfQ09OU09MRV9FWElUX0NIQVIpOworCisgICAgLyogVHJ5IHRvIGVudGVyIHJhdyBtb2RlIGlmIGxpbmUgZWRpdGluZyBpcyByZXF1ZXN0ZWQgKi8KKyAgICByYyA9IGJjbWNsaV9zZXNzaW9uX3Jhd19tb2RlX3NldChzZXNzaW9uLCBCQ01PU19UUlVFKTsKKyAgICBpZiAocmMpCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiQ2FuJ3QgZW5hYmxlIFJBVyBpbnB1dCBtb2RlLiBMaW5lIGVkaXRpbmcgaXMgZGlzYWJsZWRcbiIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByYXdfbW9kZSA9IEJDTU9TX1RSVUU7CisgICAgfQorICAgIC8qIE5vIHdlIHJlYWQgaW5wdXQgYW5kIHB1c2ggaXQgaW50byBpbnB1dCBidWZmZXIgKi8KKyAgICBpZiAocmF3X21vZGUpCisgICAgeworICAgICAgICBjID0gYmNtb3NfZ2V0Y2hhcigpOworICAgICAgICB3aGlsZSAoYyA+PSAwICYmIGMgIT0gQkNNX0VNQkVEREVEX0NPTlNPTEVfRVhJVF9DSEFSKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfY29udGV4dC0+aW5idWZbY2xpX2NvbnRleHQtPmluYnVmX2xlbmd0aCsrXSA9IGM7CisgICAgICAgICAgICBlbWJlZGRlZF9jbGlfc2VuZF9pbnB1dChjbGlfY29udGV4dCk7CisgICAgICAgICAgICBjID0gYmNtb3NfZ2V0Y2hhcigpOworICAgICAgICB9CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3Jhd19tb2RlX3NldChzZXNzaW9uLCBCQ01PU19GQUxTRSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIExpbmUgbW9kZSAqLworICAgICAgICBjaGFyICpidWY7CisKKyAgICAgICAgYnVmID0gYmNtY2xpX3Nlc3Npb25fZ2V0cyhzZXNzaW9uLCAoY2hhciAqKWNsaV9jb250ZXh0LT5pbmJ1Ziwgc2l6ZW9mKGNsaV9jb250ZXh0LT5pbmJ1ZikpOworICAgICAgICB3aGlsZSAoYnVmICYmIGJ1ZlswXSAhPSBCQ01fRU1CRURERURfQ09OU09MRV9FWElUX0NIQVIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9jb250ZXh0LT5pbmJ1Zl9sZW5ndGggPSBzdHJsZW4oYnVmKTsKKyAgICAgICAgICAgIGlmICghY2xpX2NvbnRleHQtPmluYnVmX2xlbmd0aCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChidWZbY2xpX2NvbnRleHQtPmluYnVmX2xlbmd0aC0xXSAhPSAnXG4nICYmIGJ1ZltjbGlfY29udGV4dC0+aW5idWZfbGVuZ3RoLTFdICE9ICdccicgJiYKKyAgICAgICAgICAgICAgICBjbGlfY29udGV4dC0+aW5idWZfbGVuZ3RoIDwgc2l6ZW9mKGNsaV9jb250ZXh0LT5pbmJ1ZikgLSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ1ZltjbGlfY29udGV4dC0+aW5idWZfbGVuZ3RoKytdID0gJ1xuJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVtYmVkZGVkX2NsaV9zZW5kX2lucHV0KGNsaV9jb250ZXh0KTsKKyAgICAgICAgICAgIGJ1ZiA9IGJjbWNsaV9zZXNzaW9uX2dldHMoc2Vzc2lvbiwgKGNoYXIgKiljbGlfY29udGV4dC0+aW5idWYsIHNpemVvZihjbGlfY29udGV4dC0+aW5idWYpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJjbW9zX3RpbWVyX3N0b3AoJmNsaV9jb250ZXh0LT50aW1lcik7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIkRldmljZSAldTogRW1iZWRkZWQgQ0xJIHRlcm1pbmF0ZWRcbiIsIGRldmljZSk7CisgICAgYmNtdHJfbXNnX2hhbmRsZXJfdW5yZWdpc3RlcihkZXZpY2UsICZtc2dwKTsKKyAgICBpZiAob2xkX21zZ3AuYXBwX2NiKQorICAgICAgICByYyA9IGJjbXRyX21zZ19oYW5kbGVyX3JlZ2lzdGVyKGRldmljZSwgJm9sZF9tc2dwKTsKKworY2xlYW51cDQ6CisgICAgYmNtb3NfdGltZXJfZGVzdHJveSgmY2xpX2NvbnRleHQtPnRpbWVyKTsKK2NsZWFudXAzOgorICAgIGJjbW9zX21vZHVsZV9kZXN0cm95KEJDTU9TX01PRFVMRV9JRF9DTElfT1ZFUl9QQ0lFKTsKK2NsZWFudXAyOgorICAgIGJjbW9zX3Rhc2tfZGVzdHJveSgmY2xpX2NvbnRleHQtPnRhc2spOworY2xlYW51cDE6CisgICAgYmNtb3NfZnJlZShjbGlfY29udGV4dCk7CisgICAgY2xpX2NvbnRleHQgPSBOVUxMOworCisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtX2VtYmVkZGVkX2NsaV9jb21tYW5kKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgYmNtb2x0X2RldmlkIGRldmljZSA9IHBhcm1bMF0udmFsdWUubnVtYmVyOworICAgIHJldHVybiBiY21fZW1iZWRkZWRfY2xpX2VudGVyKHNlc3Npb24sIGRldmljZSk7Cit9CisKKy8qIEluaXRpYWxpemUgZW1iZWRkZWQgQ0xJIG1vZHVsZSAqLworYmNtb3NfZXJybm8gYmNtX2VtYmVkZGVkX2NsaV9pbml0KHZvaWQpCit7CisgICAgQkNNQ0xJX01BS0VfQ01EKE5VTEwsICJlbWJlZGRlZCIsICJFbWJlZGRlZCBDTEkiLCBiY21fZW1iZWRkZWRfY2xpX2NvbW1hbmQsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fUkFOR0UoImRldmljZSIsICJEZXZpY2UgaW5kZXgiLCBCQ01DTElfUEFSTV9ERUNJTUFMLCAwLCAwLCBCQ01UUl9NQVhfT0xUUy0xKSk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogQ2xlYW51cCBlbWJlZGRlZCBDVkxJIG1vZHVsZSAqLworYmNtb3NfZXJybm8gYmNtX2VtYmVkZGVkX2NsaV9leGl0KHZvaWQpCit7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2VtYmVkZGVkX2NsaS9iY21vbHRfZW1iZWRkZWRfY2xpLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2VtYmVkZGVkX2NsaS9iY21vbHRfZW1iZWRkZWRfY2xpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGExZTUxOQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvZW1iZWRkZWRfY2xpL2JjbW9sdF9lbWJlZGRlZF9jbGkuaApAQCAtMCwwICsxLDY0IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisvKgorICogYmNtX2VtYmVkZGVkX2NsaS5oIC0gZW1iZWRkZWQgQ0xJIGFjY2VzcyBmcm9tIHRoZSBob3N0CisgKi8KKworI2lmbmRlZiBCQ01PTFRfRU1CRURERURfQ0xJX0hfCisjZGVmaW5lIEJDTU9MVF9FTUJFRERFRF9DTElfSF8KKworI2luY2x1ZGUgPGJjbWNsaV9zZXNzaW9uLmg+CisjaW5jbHVkZSA8YmNtb2x0X21zZy5oPgorCisvKiBDaGFyYWN0ZXIgdXNlZCB0byBleGl0IGZyb20gZW1iZWRkZWQgY29uc29sZSAqLworI2RlZmluZSBCQ01fRU1CRURERURfQ09OU09MRV9FWElUX0NIQVIgICchJworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEluaXRpYWxpemUgZW1iZWRkZWQgQ0xJIG1vZHVsZSAqLworYmNtb3NfZXJybm8gYmNtX2VtYmVkZGVkX2NsaV9pbml0KHZvaWQpOworCisvKiBDbGVhbnVwIGVtYmVkZGVkIENMSSBtb2R1bGUgKi8KK2JjbW9zX2Vycm5vIGJjbV9lbWJlZGRlZF9jbGlfZXhpdCh2b2lkKTsKKworLyogQ29ubmVjdCB0byBlbWJlZGRlZCBDTEkgY29uc29sZS4KKyAqIFRoZSBmdW5jdGlvbiB3YWl0cyBmb3IgdXNlciBpbnB1dCBhbmQKKyAqIHJldHVybnMgd2hlbiBlbmNvdW50ZXJzIEJDTV9FTUJFRERFRF9DT05TT0xFX0VYSVRfQ0hBUgorICovCitiY21vc19lcnJubyBiY21fZW1iZWRkZWRfY2xpX2VudGVyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBiY21vbHRfZGV2aWQgZGV2aWNlKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvZW1iZWRkZWRfY2xpL21haW4vTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2VtYmVkZGVkX2NsaS9tYWluL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZjdjOTUKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2VtYmVkZGVkX2NsaS9tYWluL01ha2VmaWxlCkBAIC0wLDAgKzEsOSBAQAorIyBFbWJlZGRlZCBDTEkgY29uc29sZSBhcHBsaWNhdGlvbgorIworaWZlcSAoIiQoRU5BQkxFX0NMSSkiLCAieSIpCisgICAgTU9EX05BTUUgPSBlbWJlZGRlZF9jb25zb2xlCisgICAgTU9EX1RZUEUgPSBhcHAKKyAgICBNT0RfREVQUyA9IGVtYmVkZGVkX2NsaQorICAgIAorICAgIHNyY3MgPSBiY21vbHRfZW1iZWRkZWRfY29uc29sZS5jCitlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9lbWJlZGRlZF9jbGkvbWFpbi9iY21vbHRfZW1iZWRkZWRfY29uc29sZS5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9lbWJlZGRlZF9jbGkvbWFpbi9iY21vbHRfZW1iZWRkZWRfY29uc29sZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZTc2N2IKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2VtYmVkZGVkX2NsaS9tYWluL2JjbW9sdF9lbWJlZGRlZF9jb25zb2xlLmMKQEAgLTAsMCArMSw3OSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbW9sdF9lbWJlZGRlZF9jbGkuaD4KKworc3RhdGljIGludCBfY2xpX2hlbHAodm9pZCkKK3sKKyAgICBmcHJpbnRmKHN0ZGVyciwgImVtYmVkZGVkX2NvbnNvbGUgWy1kIGRldmljZV9pbmRleF0iKTsKKyAgICByZXR1cm4gLTE7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgYmNtY2xpX3Nlc3Npb25fcGFybSBtb25fc2Vzc2lvbl9wYXJtOworICAgIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uOworICAgIGludCBkZXZpY2UgPSAwOworICAgIGludCBpOworCisgICAgLyogYXJnYyBtdXN0IGJlIG9kZCBiZWNhdXNlIGFsbCBvcHRpb25zIGV4Y2VwdCBmb3IgYXJndlswXSBnbyBpbiBwYWlycyAqLworICAgIGlmICghKGFyZ2MgJSAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBfY2xpX2hlbHAoKTsKKyAgICB9CisKKyAgICBtZW1zZXQoJm1vbl9zZXNzaW9uX3Bhcm0sIDAsIHNpemVvZihtb25fc2Vzc2lvbl9wYXJtKSk7CisgICAgbW9uX3Nlc3Npb25fcGFybS5hY2Nlc3NfcmlnaHQgPSBCQ01DTElfQUNDRVNTX0FETUlOOworICAgIGZvcihpPTE7IGk8YXJnYzsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1kIikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgKnBlbmQ7CisgICAgICAgICAgICArK2k7CisgICAgICAgICAgICBkZXZpY2UgPSBzdHJ0b3VsKGFyZ3ZbaV0sICZwZW5kLCAwKTsKKyAgICAgICAgICAgIGlmIChwZW5kICYmICpwZW5kKQorICAgICAgICAgICAgICAgIHJldHVybiBfY2xpX2hlbHAoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChiY21jbGlfc2Vzc2lvbl9vcGVuKCZtb25fc2Vzc2lvbl9wYXJtLCAmc2Vzc2lvbikpCisgICAgeworICAgICAgICBwcmludGYoIkNhbid0IG9wZW4gQ0xJIHNlc3Npb25cbiIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICAvKiBQcm9jZXNzIHVzZXIgaW5wdXQgdW50aWwgRU9GIG9yICEgY29tbWFuZCAqLworICAgIGJjbV9lbWJlZGRlZF9jbGlfZW50ZXIoc2Vzc2lvbiwgZGV2aWNlKTsKKworICAgIGJjbWNsaV9zZXNzaW9uX2Nsb3NlKHNlc3Npb24pOworCisgICAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvaG9zdF9hcGlfbGludXgvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2hvc3RfYXBpX2xpbnV4L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYjgzYjUKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2hvc3RfYXBpX2xpbnV4L01ha2VmaWxlCkBAIC0wLDAgKzEsMTcgQEAKKyMgTWFrZWZpbGUgZm9yIGJ1aWxkaW5nIGhvc3QvaG9zdF9hcGkgYXMgbGludXggbGlicmFyeSB0byBiZSBjYWxsZWQgZnJvbSBrZXJuZWwgbW9kdWxlcworIworaWZlcSAoIiQoT1NfS0VSTkVMKSIsICJsaW51eCIpCisKK01PRF9OQU1FID0gaG9zdF9hcGlfbGludXgKK01PRF9UWVBFID0gbGludXhfbGliCitNT0RfREVQUyA9IGNvbW1vbl9ncG9uCisKK3NyY3MgPSBiY21vbHRfaG9zdF9hcGkuYworCisjIElmIGNhbGxlZCBieSBsaW51eCBrZXJuZWwgYnVpbGRlciAtIGFkZCBpbmNsdWRlIHBhdGhzIG1hbnVhbGx5LgorIyBJdCBpcyBub3QgZWxlZ2FudCwgYnV0IHdlJ2xsIG5vdCBoYXZlIG1hbnkgbGludXggbW9kdWxlcworaWZuZXEgKCIkKEtCVUlMRF9TUkMpIiwgIiIpCisJLWluY2x1ZGUgJChPVVRfRElSX0JBU0UpL01ha2VmaWxlLmNvbmZpZy4kKE1PRF9OQU1FKQorZW5kaWYKK2VuZGlmCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvaG9zdF9hcGlfbGludXgvYmNtb2x0X2hvc3RfYXBpLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2hvc3RfYXBpX2xpbnV4L2JjbW9sdF9ob3N0X2FwaS5jCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjQyMDg4N2UKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2hvc3RfYXBpX2xpbnV4L2JjbW9sdF9ob3N0X2FwaS5jCkBAIC0wLDAgKzEgQEAKKy4uLy4uL2hvc3RfZHJpdmVyL2hvc3RfYXBpL2JjbW9sdF9ob3N0X2FwaS5jClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9ob3N0X2FwaV9saW51eC9iY21vbHRfaG9zdF9hcGkuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvaG9zdF9hcGlfbGludXgvYmNtb2x0X2hvc3RfYXBpLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMGViYmUyOAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvaG9zdF9hcGlfbGludXgvYmNtb2x0X2hvc3RfYXBpLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vaG9zdF9kcml2ZXIvaG9zdF9hcGkvYmNtb2x0X2hvc3RfYXBpLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2hvc3RfYXBpX2xpbnV4L2JjbW9sdF9ob3N0X2FwaV9ncG9uX3V0aWxzLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2hvc3RfYXBpX2xpbnV4L2JjbW9sdF9ob3N0X2FwaV9ncG9uX3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNjZiZTk5ZQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvaG9zdF9hcGlfbGludXgvYmNtb2x0X2hvc3RfYXBpX2dwb25fdXRpbHMuaApAQCAtMCwwICsxIEBACisuLi8uLi9ob3N0X2RyaXZlci9ob3N0X2FwaS9iY21vbHRfaG9zdF9hcGlfZ3Bvbl91dGlscy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9pMmMvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2kyYy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzNjMmRiCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9pMmMvTWFrZWZpbGUKQEAgLTAsMCArMSwxOSBAQAorIyBJMkMgZGV2aWNlcyBkcml2ZXIKKyMKK2lmZXEgKCIkKE9TX0tFUk5FTCkiLCAibGludXgiKQorCitNT0RfTkFNRSA9IGkyY19kZXZzCitNT0RfVFlQRSA9IGxpbnV4X21vZHVsZQorCitzcmNzID0gYmNtb2x0X2kyY19kZXZzLmMKKworIyBJZiBjYWxsZWQgYnkgbGludXgga2VybmVsIGJ1aWxkZXIgLSBhZGQgaW5jbHVkZSBwYXRocyBtYW51YWxseS4KKyMgSXQgaXMgbm90IGVsZWdhbnQsIGJ1dCB3ZSdsbCBub3QgaGF2ZSBtYW55IGxpbnV4IG1vZHVsZXMKK2lmbmVxICgiJChLQlVJTERfU1JDKSIsICIiKQorCS1pbmNsdWRlICQoT1VUX0RJUl9CQVNFKS9NYWtlZmlsZS5jb25maWcuJChNT0RfTkFNRSkKK2VuZGlmCisKK2VuZGlmCisKK1VTRV9MSU5UID0geWVzCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvaTJjL2JjbW9sdF9pMmNfZGV2cy5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9pMmMvYmNtb2x0X2kyY19kZXZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhlOWVjNAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvaTJjL2JjbW9sdF9pMmNfZGV2cy5jCkBAIC0wLDAgKzEsMTAzOCBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPiAvKmNvcHlfZnJvbV91c2VyKi8KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSAiYmNtb3Nfc3lzdGVtLmgiCisjaW5jbHVkZSAiYmNtb2x0X2kyY19kZXZzLmgiCisjaW5jbHVkZSAiYmNtb2x0X2kyY19kZXZzX2lvY3RsLmgiCisKKyNkZWZpbmUgQkNNX0kyQ19ERVZfQUREUl9TVEFSVCB0eXBlZGVmIGVudW0geworI2RlZmluZSBCQ01fSTJDX0RFVl9BRERSKG5hbWUsIGRlc2MsIHZhbCkgbmFtZSA9IHZhbCwKKyNkZWZpbmUgQkNNX0kyQ19ERVZfQUREUl9FTkQgfSBiY21faTJjX2Rldl9hZGRyOworCisjaW5jbHVkZSAiYmNtb2x0X2kyY19kZXZzX2FkZHIuaCIKKworI2RlZmluZSBQUk9DX0RJUl9OQU1FICAgICAgICJtYXBsZV9pMmMiCisjZGVmaW5lIFBST0NfRU5UUllfTkFNRSAgICAgImkyYyIKKyNkZWZpbmUgTUFYX0VBR0FJTl9JVEVSUyAgICAyMDAgLyogMTBtcyBwZXIgaXRlciAqLworCisvKiB1bmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBlbmFibGUgZGVidWcgb3V0cHV0IHRvIHRoZSBrZXJuZWwgQ0xJICovCisvKiAjZGVmaW5lIEkyQ19ERUJVR19QUklOVFMgMSAqLworI2lmZGVmIEkyQ19ERUJVR19QUklOVFMKKyNkZWZpbmUgaTJjX2RlYnVnX3ByaW50KGZtdCwgYXJncy4uLikgcHJpbnRrKCIlcyMlZDogIiBmbXQsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBpMmNfZGVidWdfcHJpbnQoLi4uKQorI2VuZGlmCisKK2ludCBtYXBsZV9pMmNfY2hyZGV2X21ham9yID0gMjE2OworbW9kdWxlX3BhcmFtKG1hcGxlX2kyY19jaHJkZXZfbWFqb3IsIGludCwgU19JUlVTUiB8IFNfSVJHUlAgfCBTX0lXR1JQKTsKK01PRFVMRV9QQVJNX0RFU0MobWFwbGVfaTJjX2NocmRldl9tYWpvciwgIm1hcGxlX2kyY19tYWpvciIpOworCitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICppMmNfcHJvY19kaXI7CitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICppMmNfcHJvY19lbnRyeTsKK3N0YXRpYyBjaGFyIGlzX2NocmRldl9yZWc7CitzdGF0aWMgY2hhciBpc19jZGV2X2FkZDsKK3N0YXRpYyBpbnQgaTJjX2NsaWVudF9udW07CitzdGF0aWMgaW50IGkyY19udW1fY2xpZW50czsKKworY29uc3QgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geworICAgIEkyQ19TVzBfSTJDX0FERFIsCisgICAgSTJDX1NXMV9JMkNfQUREUiwKKyAgICBJMkNfU1cyX0kyQ19BRERSLAorICAgIEkyQ19TVzNfSTJDX0FERFIsCisgICAgSTJDX1NXNF9JMkNfQUREUiwKKyAgICBTRlBfSTJDX0FERFIxLAorICAgIFNGUF9JMkNfQUREUjIsCisgICAgRlBHQV9JMkNfQUREUiwKKyAgICBQT05fRFBMTF9JMkNfQUREUiwKKyAgICBQTV9EUExMX0kyQ19BRERSLAorICAgIENYUF9SX0kyQ19BRERSLAorICAgIFBDSUVfU1dfSTJDX0FERFIsCisgICAgSTJDX0NMSUVOVF9FTkQKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHNsYXZlX3ZhbGlkW1NMQVZFX05VTV9PRl9TTEFWRVNdID0gezB9OworCisvKgorICogRHJpdmVyIGRhdGEgKGNvbW1vbiB0byBhbGwgY2xpZW50cykKKyAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgbWFwbGVfaTJjX2lkX3RhYmxlW10gPSB7CisgICAgeyAibWFwbGVfaTJjIiwgMCB9LAorICAgIHsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBtYXBsZV9pMmNfaWRfdGFibGUpOworCitzdGF0aWMgdm9pZCBiY21fYWNjZXNzX2ZwZ2Eodm9pZCk7CisKKy8qCisgKiBDbGllbnQgZGF0YSAoZWFjaCBjbGllbnQgZ2V0cyBpdHMgb3duKQorICovCitzdHJ1Y3QgbWFwbGVfaTJjX2RhdGEgeworICAgIHN0cnVjdCBpMmNfY2xpZW50IGNsaWVudDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWFwbGVfaTJjX2RhdGEgKnBjbGllbnRfZGF0YV9hcltTTEFWRV9OVU1fT0ZfU0xBVkVTXTsKKworc3RhdGljIGludCBnZXRfY2xpZW50KHVuc2lnbmVkIGNoYXIgY2xpZW50X251bSwgc3RydWN0IGkyY19jbGllbnQgKipjbGllbnQpCit7CisgICAgaWYgKChjbGllbnRfbnVtID49IFNMQVZFX05VTV9PRl9TTEFWRVMpIHx8ICFzbGF2ZV92YWxpZFtjbGllbnRfbnVtXSkKKyAgICB7CisgICAgICAgIGkyY19kZWJ1Z19wcmludCgiSTJDIGVycm9yOiBXcm9uZyBjbGllbnQgbnVtYmVyIDB4JXhcbiIsIGNsaWVudF9udW0pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgICpjbGllbnQgPSAmcGNsaWVudF9kYXRhX2FyW2NsaWVudF9udW1dLT5jbGllbnQ7CisKKyAgICByZXR1cm4gMDsKK30KKworCisvKgorICogSGVscGVyIGZ1bmN0aW9ucyB3aGljaCBhdHRlbXB0IEkyQyB0cmFuc2ZlciB1bnRpbCBzdWNjZXNzZnVsLCBvciBlcnJvciBjb2RlIGlzIG90aGVyIHRoYW4gLUVBR0FJTgorICovCisKK3N0YXRpYyBpbnQgbWFwbGVfaTJjX3NlbmQodW5zaWduZWQgY2hhciBjbGllbnRfbnVtLCB1OCAqYnVmLCBzaXplX3QgY291bnQpCit7CisgICAgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKyAgICBpbnQgcmM7CisgICAgaW50IG5pdGVyID0gMDsKKworICAgIGlmIChnZXRfY2xpZW50KGNsaWVudF9udW0sICZjbGllbnQpKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBkbyB7CisgICAgICAgIHJjID0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgYnVmLCBjb3VudCk7CisgICAgICAgIGlmIChyYyA9PSAtRUFHQUlOKQorICAgICAgICAgICAgbXNsZWVwKDEwKTsKKyAgICB9IHdoaWxlIChyYyA9PSAtRUFHQUlOICYmICsrbml0ZXIgPCBNQVhfRUFHQUlOX0lURVJTKTsKKyAgICByYyA9IChyYyA9PSBjb3VudCkgPyAwIDogKHJjIDwgMCApID8gcmMgOiAtMTsKKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGludCBtYXBsZV9pMmNfcmVjdih1bnNpZ25lZCBjaGFyIGNsaWVudF9udW0sIHU4ICpidWYsIHNpemVfdCBjb3VudCkKK3sKKyAgICBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworICAgIGludCByYzsKKyAgICBpbnQgbml0ZXIgPSAwOworCisgICAgaWYgKGdldF9jbGllbnQoY2xpZW50X251bSwgJmNsaWVudCkpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGRvIHsKKyAgICAgICAgcmMgPSBpMmNfbWFzdGVyX3JlY3YoY2xpZW50LCBidWYsIGNvdW50KTsKKyAgICAgICAgaWYgKHJjID09IC1FQUdBSU4pCisgICAgICAgICAgICBtc2xlZXAoMTApOworICAgIH0gd2hpbGUgKHJjID09IC1FQUdBSU4gJiYgKytuaXRlciA8IE1BWF9FQUdBSU5fSVRFUlMpOworICAgIHJjID0gKHJjID09IGNvdW50KSA/IDAgOiAocmMgPCAwICkgPyByYyA6IC0xOworCisgICAgcmV0dXJuIHJjOworfQorCisKK3N0YXRpYyBpbnQgbWFwbGVfaTJjX3JlYWRfd2l0aF9vZmZzZXQodW5zaWduZWQgY2hhciBjbGllbnRfbnVtLCB1OCAqb2Zmc2V0LCBzaXplX3Qgb2Zmc2V0X3NpemUsIHU4ICpidWYsIHNpemVfdCBjb3VudCkKK3sKKyAgICBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworICAgIHN0cnVjdCBpMmNfbXNnIG1zZ1syXTsKKyAgICBpbnQgcmM7CisgICAgaW50IG5pdGVyID0gMDsKKworICAgIGlmIChnZXRfY2xpZW50KGNsaWVudF9udW0sICZjbGllbnQpKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBtc2dbMF0uYWRkciA9IG1zZ1sxXS5hZGRyID0gY2xpZW50LT5hZGRyOworICAgIG1zZ1swXS5mbGFncyA9IG1zZ1sxXS5mbGFncyA9IGNsaWVudC0+ZmxhZ3MgJiBJMkNfTV9URU47CisKKyAgICBtc2dbMF0ubGVuID0gb2Zmc2V0X3NpemU7CisgICAgbXNnWzBdLmJ1ZiA9IG9mZnNldDsKKworICAgIG1zZ1sxXS5mbGFncyB8PSBJMkNfTV9SRDsKKyAgICBtc2dbMV0ubGVuID0gY291bnQ7CisgICAgbXNnWzFdLmJ1ZiA9IGJ1ZjsKKworICAgIGRvIHsKKyAgICAgICAgcmMgPSBpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCBtc2csIDIpOworICAgICAgICBpZiAocmMgPT0gLUVBR0FJTikKKyAgICAgICAgICAgIG1zbGVlcCgxMCk7CisgICAgfSB3aGlsZSAocmMgPT0gLUVBR0FJTiAmJiArK25pdGVyIDwgTUFYX0VBR0FJTl9JVEVSUyk7CisKKyAgICByYyA9IChyYyA9PSAyKSA/IDAgOiAocmMgPCAwICkgPyByYyA6IC0xOworCisgICAgcmV0dXJuIHJjOworfQorCitzc2l6ZV90IG1hcGxlX2kyY193cml0ZSh1bnNpZ25lZCBjaGFyIGNsaWVudF9udW0sIGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworICAgIGludCByYzsKKworICAgIGkyY19kZWJ1Z19wcmludCgiV3JpdGUgdG8gc3dpdGNoOiBjbGllbnQ9MHgleCB2YWwgPSAweCV4XG4iLCBub3JtYWxfaTJjW2NsaWVudF9udW1dLCAqYnVmKTsKKyAgICByYyA9IG1hcGxlX2kyY19zZW5kKGNsaWVudF9udW0sICh1OCAqKWJ1ZiwgY291bnQpOworCisgICAgaWYgKHJjIDwgMCkKKyAgICAgICAgaTJjX2RlYnVnX3ByaW50KCJXcml0ZSBGYWlsZWQuIHJjPSVkICBjbGllbnQ9JXVbJXVdXG4iLCByYywKKyAgICAgICAgICAgIG5vcm1hbF9pMmNbY2xpZW50X251bV0sIGNsaWVudF9udW0pOworICAgIGVsc2UKKyAgICAgICAgaTJjX2RlYnVnX3ByaW50KCJXcml0ZSBTdWNjZXNzZnVsIGNsaWVudD0ldVsldV1cbiIsCisgICAgICAgICAgICBub3JtYWxfaTJjW2NsaWVudF9udW1dLCBjbGllbnRfbnVtKTsKKyAgICByZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MKG1hcGxlX2kyY193cml0ZSk7CisKK3NzaXplX3QgbWFwbGVfaTJjX3JlYWQodW5zaWduZWQgY2hhciBjbGllbnRfbnVtLCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKyAgICBpbnQgcmM7CisKKyAgICBpMmNfZGVidWdfcHJpbnQoIlJlYWQgZnJvbSBzd2l0Y2g6IGNsaWVudCAweCV4XG4iLCBub3JtYWxfaTJjW2NsaWVudF9udW1dKTsKKyAgICByYyA9IG1hcGxlX2kyY19yZWN2KGNsaWVudF9udW0sICh1OCAqKWJ1ZiwgY291bnQpOworCisgICAgaWYgKHJjIDwgMCkKKyAgICAgICAgaTJjX2RlYnVnX3ByaW50KCJSZWFkIEZhaWxlZC4gcmM9JWQgIGNsaWVudD0ldVsldV1cbiIsIHJjLAorICAgICAgICAgICAgbm9ybWFsX2kyY1tjbGllbnRfbnVtXSwgY2xpZW50X251bSk7CisgICAgZWxzZQorICAgICAgICBpMmNfZGVidWdfcHJpbnQoIlJlYWQgU3VjY2Vzc2Z1bDogY291bnQ9JXUgdmFsID0gMHgleFxuIiwgKHVuc2lnbmVkKWNvdW50LCAqYnVmKTsKKyAgICByZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MKG1hcGxlX2kyY19yZWFkKTsKKworaW50IG1hcGxlX2kyY193cml0ZV9ieXRlKHVuc2lnbmVkIGNoYXIgY2xpZW50X251bSwgdW5zaWduZWQgY2hhciBvZmZzZXQsIHVuc2lnbmVkIGNoYXIgdmFsKQoreworICAgIHU4IGJ1ZlsyXTsKKyAgICBpbnQgcmM7CisKKyAgICBpMmNfZGVidWdfcHJpbnQoIldyaXRlIEJ5dGU6IGNsaWVudD0weCV4IG9mZnNldCA9IDB4JXgsIHZhbCA9IDB4JXhcbiIsIG5vcm1hbF9pMmNbY2xpZW50X251bV0sIG9mZnNldCwgdmFsKTsKKworICAgIGJ1ZlswXSA9IG9mZnNldDsKKyAgICBidWZbMV0gPSB2YWw7CisgICAgcmMgPSBtYXBsZV9pMmNfc2VuZChjbGllbnRfbnVtLCBidWYsIDIpOworCisgICAgaWYgKHJjIDwgMCkKKyAgICAgICAgaTJjX2RlYnVnX3ByaW50KCJXcml0ZSBCeXRlIEZhaWxlZC4gcmM9JWQgIG9mZnNldD0weCV4IHZhbD0weCV4IGNsaWVudD0ldVsldV1cbiIsCisgICAgICAgICAgICByYywgb2Zmc2V0LCB2YWwsCisgICAgICAgICAgICBub3JtYWxfaTJjW2NsaWVudF9udW1dLCBjbGllbnRfbnVtKTsKKyAgICBlbHNlCisgICAgICAgIGkyY19kZWJ1Z19wcmludCgiV3JpdGUgQnl0ZTogb2Zmc2V0PTB4JXggdmFsPTB4JXggY2xpZW50PSV1LyV1XG4iLAorICAgICAgICAgICAgb2Zmc2V0LCB2YWwsCisgICAgICAgICAgICBub3JtYWxfaTJjW2NsaWVudF9udW1dLCBjbGllbnRfbnVtKTsKKyAgICByZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MKG1hcGxlX2kyY193cml0ZV9ieXRlKTsKKworaW50IG1hcGxlX2kyY19yZWFkX2J5dGUodW5zaWduZWQgY2hhciBjbGllbnRfbnVtLCB1bnNpZ25lZCBjaGFyIG9mZnNldCwgdW5zaWduZWQgY2hhciAqZGF0YSkKK3sKKyAgICB1OCBvID0gb2Zmc2V0OworICAgIHU4IHZhbDsKKyAgICBpbnQgcmM7CisKKyAgICBpMmNfZGVidWdfcHJpbnQoIldyaXRlIEJ5dGU6IGNsaWVudD0weCV4IG9mZnNldCA9IDB4JXgsIHZhbCA9IDB4JXhcbiIsIG5vcm1hbF9pMmNbY2xpZW50X251bV0sIG9mZnNldCwgdmFsKTsKKworICAgIHJjID0gbWFwbGVfaTJjX3JlYWRfd2l0aF9vZmZzZXQoY2xpZW50X251bSwgJm8sIDEsICZ2YWwsIDEpOworCisgICAgaWYgKHJjIDwgMCkKKyAgICAgICAgaTJjX2RlYnVnX3ByaW50KCJSZWFkIEJ5dGUgRmFpbGVkLiByYz0lZCAgY2xpZW50PSV1WyV1XVxuIiwgcmMsCisgICAgICAgICAgICBub3JtYWxfaTJjW2NsaWVudF9udW1dLCBjbGllbnRfbnVtKTsKKyAgICBlbHNlCisgICAgeworICAgICAgICAqZGF0YSA9IHZhbDsKKyAgICAgICAgaTJjX2RlYnVnX3ByaW50KCJSZWFkIEJ5dGU6IGNsaWVudD0weCV4IG9mZnNldCA9IDB4JXgsIHZhbCA9IDB4JXhcbiIsCisgICAgICAgICAgICBub3JtYWxfaTJjW2NsaWVudF9udW1dLCBvZmZzZXQsICpkYXRhKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTChtYXBsZV9pMmNfcmVhZF9ieXRlKTsKKworCitpbnQgbWFwbGVfaTJjX3dyaXRlX3dvcmQodW5zaWduZWQgY2hhciBjbGllbnRfbnVtLCB1bnNpZ25lZCBjaGFyIG9mZnNldCwgdW5zaWduZWQgc2hvcnQgdmFsKQoreworICAgIHU4IGJ1ZlszXTsKKyAgICBpbnQgcmM7CisKKyAgICBpMmNfZGVidWdfcHJpbnQoIldyaXRlIFdvcmQ6IG9mZnNldCA9IDB4JXgsIHZhbCA9IDB4JXhcbiIsIG9mZnNldCwgdmFsKTsKKworICAgIC8qIFRoZSBvZmZzZXQgdG8gYmUgd3JpdHRlbiBzaG91bGQgYmUgdGhlIGZpcnN0IGJ5dGUgaW4gdGhlIEkyQyB3cml0ZSAqLworICAgIGJ1ZlswXSA9IG9mZnNldDsKKyAgICBidWZbMV0gPSAoY2hhcikodmFsJjB4RkYpOworICAgIGJ1ZlsyXSA9IChjaGFyKSh2YWw+PjgpOworICAgIHJjID0gbWFwbGVfaTJjX3NlbmQoY2xpZW50X251bSwgYnVmLCBzaXplb2YoYnVmKSk7CisKKyAgICBpZiAocmMgPCAwKQorICAgICAgICBpMmNfZGVidWdfcHJpbnQoIldyaXRlIFdvcmQgRmFpbGVkLiByYz0lZCAgb2Zmc2V0PTB4JXggdmFsPTB4JXgsIGNsaWVudD0ldVsldV1cbiIsCisgICAgICAgICAgICByYywgb2Zmc2V0LCB2YWwsCisgICAgICAgICAgICBub3JtYWxfaTJjW2NsaWVudF9udW1dLCBjbGllbnRfbnVtKTsKKyAgICBlbHNlCisgICAgICAgIGkyY19kZWJ1Z19wcmludCgiV3JpdGUgV29yZDogb2Zmc2V0PTB4JXggdmFsPTB4JXgsIGNsaWVudD0ldVsldV1cbiIsCisgICAgICAgICAgICBvZmZzZXQsIHZhbCwKKyAgICAgICAgICAgIG5vcm1hbF9pMmNbY2xpZW50X251bV0sIGNsaWVudF9udW0pOworICAgIHJldHVybiByYzsKK30KK0VYUE9SVF9TWU1CT0wobWFwbGVfaTJjX3dyaXRlX3dvcmQpOworCitpbnQgbWFwbGVfaTJjX3JlYWRfd29yZCh1bnNpZ25lZCBjaGFyIGNsaWVudF9udW0sIHVuc2lnbmVkIGNoYXIgb2Zmc2V0LCB1bnNpZ25lZCBzaG9ydCAqZGF0YSkKK3sKKyAgICB1OCBvID0gb2Zmc2V0OworICAgIHU4IGJ1ZlsyXTsKKyAgICBpbnQgcmM7CisKKyAgICByYyA9IG1hcGxlX2kyY19yZWFkX3dpdGhfb2Zmc2V0KGNsaWVudF9udW0sICZvLCAxLCBidWYsIHNpemVvZihidWYpKTsKKworICAgIGlmIChyYyA8IDApCisgICAgICAgIGkyY19kZWJ1Z19wcmludCgiUmVhZCBXb3JkIEZhaWxlZC4gcmM9JWQgIG9mZnNldD0weCV4IGNsaWVudD0ldVsldV1cbiIsCisgICAgICAgICAgICByYywgb2Zmc2V0LAorICAgICAgICAgICAgbm9ybWFsX2kyY1tjbGllbnRfbnVtXSwgY2xpZW50X251bSk7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKmRhdGEgPSAoYnVmWzFdPDw4KSB8IGJ1ZlswXTsgLyogSTJDIGRhdGEgaXMgTEUgKi8KKyAgICAgICAgaTJjX2RlYnVnX3ByaW50KCJSZWFkIFdvcmQ6IG9mZnNldCA9IDB4JXgsIHZhbCA9IDB4JXggY2xpZW50PSV1WyV1XVxuIiwKKyAgICAgICAgICAgIG9mZnNldCwgKmRhdGEsCisgICAgICAgICAgICBub3JtYWxfaTJjW2NsaWVudF9udW1dLCBjbGllbnRfbnVtKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTChtYXBsZV9pMmNfcmVhZF93b3JkKTsKKworCitpbnQgbWFwbGVfaTJjX3dyaXRlX3JlZyh1bnNpZ25lZCBjaGFyIGNsaWVudF9udW0sIHVuc2lnbmVkIGNoYXIgb2Zmc2V0LCBpbnQgdmFsKQoreworICAgIHU4IGJ1Zls1XTsKKyAgICBpbnQgcmM7CisKKyAgICBpMmNfZGVidWdfcHJpbnQoIldyaXRlIFJlZ2lzdGVyOiBvZmZzZXQgPSAweCV4LCB2YWwgPSAweCV4XG4iLCBvZmZzZXQsIHZhbCk7CisKKyAgICAvKiBTZXQgdGhlIGJ1ZlswXSB0byBiZSB0aGUgb2Zmc2V0IGZvciB3cml0ZSBvcGVyYXRpb24gKi8KKyAgICBidWZbMF0gPSBvZmZzZXQ7CisKKyAgICAvKiBPbiB0aGUgSTJDIGJ1cywgTFMgQnl0ZSBzaG91bGQgZ28gZmlyc3QgKi8KKyAgICBidWZbMV0gPSB2YWwgJiAweGZmOworICAgIGJ1ZlsyXSA9ICh2YWwgPj4gOCkgJiAweGZmOworICAgIGJ1ZlszXSA9ICh2YWwgPj4gMTYpICYgMHhmZjsKKyAgICBidWZbNF0gPSAodmFsID4+IDI0KSAmIDB4ZmY7CisgICAgcmMgPSBtYXBsZV9pMmNfc2VuZChjbGllbnRfbnVtLCBidWYsIHNpemVvZihidWYpKTsKKworICAgIGlmIChyYyA8IDApCisgICAgICAgIGkyY19kZWJ1Z19wcmludCgiV3JpdGUgUmVnIEZhaWxlZC4gcmM9JWQgb2Zmc2V0PTB4JXggdmFsPTB4JXggY2xpZW50PSV1WyV1XVxuIiwKKyAgICAgICAgICAgIHJjLCBvZmZzZXQsIHZhbCwKKyAgICAgICAgICAgIG5vcm1hbF9pMmNbY2xpZW50X251bV0sIGNsaWVudF9udW0pOworICAgIGVsc2UKKyAgICAgICAgaTJjX2RlYnVnX3ByaW50KCJXcml0ZSBSZWcgU3VjY2Vzc2Z1bC4gb2Zmc2V0PTB4JXggdmFsPTB4JXggY2xpZW50PSV1WyV1XVxuIiwKKyAgICAgICAgICAgIG9mZnNldCwgdmFsLAorICAgICAgICAgICAgbm9ybWFsX2kyY1tjbGllbnRfbnVtXSwgY2xpZW50X251bSk7CisgICAgcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTChtYXBsZV9pMmNfd3JpdGVfcmVnKTsKKworCitpbnQgbWFwbGVfaTJjX3JlYWRfcmVnKHVuc2lnbmVkIGNoYXIgY2xpZW50X251bSwgdW5zaWduZWQgY2hhciBvZmZzZXQsIHVuc2lnbmVkIGludCAqZGF0YSkKK3sKKyAgICB1OCBvID0gb2Zmc2V0OworICAgIHU4IGJ1Zls0XTsKKyAgICBpbnQgcmM7CisKKyAgICByYyA9IG1hcGxlX2kyY19yZWFkX3dpdGhfb2Zmc2V0KGNsaWVudF9udW0sICZvLCAxLCBidWYsIHNpemVvZihidWYpKTsKKworICAgIGlmIChyYyA8IDApCisgICAgICAgIGkyY19kZWJ1Z19wcmludCgiUmVhZCBSZWcgRmFpbGVkLiByYz0lZCBvZmZzZXQ9MHgleCBjbGllbnQ9JXVbJXVdXG4iLAorICAgICAgICAgICAgcmMsIG9mZnNldCwKKyAgICAgICAgICAgIG5vcm1hbF9pMmNbY2xpZW50X251bV0sIGNsaWVudF9udW0pOworICAgIGVsc2UKKyAgICB7CisgICAgICAgICpkYXRhID0gYnVmWzBdIHwgKGJ1ZlsxXSA8PCA4KSB8IChidWZbMl0gPDwgMTYpIHwgKGJ1ZlszXSA8PCAyNCk7IC8qIExTIGJ5dGUgaXMgdHJhbnNmZXJyZWQgZmlyc3QgKi8KKyAgICAgICAgaTJjX2RlYnVnX3ByaW50KCJSZWFkIFJlZ2lzdGVyOiBjbGllbnQ9MHgleCBvZmZzZXQgPSAweCV4LCB2YWwgPSAweCV4XG4iLCBub3JtYWxfaTJjW2NsaWVudF9udW1dLCBvZmZzZXQsICpkYXRhKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTChtYXBsZV9pMmNfcmVhZF9yZWcpOworCisKK2ludCBtYXBsZV9pMmNfd3JpdGVfZnBnYSh1bnNpZ25lZCBjaGFyIGNsaWVudF9udW0sIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCB2YWwpCit7CisgICAgdTggYnVmWzhdOworICAgIGludCByYzsKKworICAgIGJjbV9hY2Nlc3NfZnBnYSgpOworCisgICAgaTJjX2RlYnVnX3ByaW50KCJXcml0ZSBmcGdhOiBvZmZzZXQgPSAweCV4LCB2YWwgPSAweCV4XG4iLCBvZmZzZXQsIHZhbCk7CisKKyAgICAvKiBTZXQgdGhlIG9mZnNldCBmb3Igd3JpdGUgb3BlcmF0aW9uICovCisgICAgLy8gICAgb2Zmc2V0ID0gc3dhYjMyKG9mZnNldCk7CisgICAgbWVtY3B5KCZidWZbMF0sIChjaGFyKikmb2Zmc2V0LCA0KTsKKworICAgIC8qIE9uIHRoZSBJMkMgYnVzLCBMUyBCeXRlIHNob3VsZCBnbyBmaXJzdCAqLworICAgIC8vICAgIHZhbCA9IHN3YWIzMih2YWwpOworICAgIG1lbWNweSgmYnVmWzRdLCAoY2hhciopJnZhbCwgNCk7CisKKyAgICByYyA9IG1hcGxlX2kyY19zZW5kKGNsaWVudF9udW0sIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCisgICAgaWYgKHJjIDwgMCkKKyAgICAgICAgaTJjX2RlYnVnX3ByaW50KCJXcml0ZSBGUEdBIEZhaWxlZC4gcmM9JWQgb2Zmc2V0PTB4JXggdmFsPTB4JXggY2xpZW50PSV1WyV1XVxuIiwKKyAgICAgICAgICAgIHJjLCBvZmZzZXQsIHZhbCwKKyAgICAgICAgICAgIG5vcm1hbF9pMmNbY2xpZW50X251bV0sIGNsaWVudF9udW0pOworICAgIGVsc2UKKyAgICAgICAgaTJjX2RlYnVnX3ByaW50KCJXcml0ZSBGUEdBOiBvZmZzZXQ9MHgleCB2YWw9MHgleCBjbGllbnQ9JXVbJXVdXG4iLAorICAgICAgICAgICAgb2Zmc2V0LCB2YWwsCisgICAgICAgICAgICBub3JtYWxfaTJjW2NsaWVudF9udW1dLCBjbGllbnRfbnVtKTsKKyAgICByZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MKG1hcGxlX2kyY193cml0ZV9mcGdhKTsKKworaW50IG1hcGxlX2kyY19yZWFkX2ZwZ2EodW5zaWduZWQgY2hhciBjbGllbnRfbnVtLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgKmRhdGEpCit7CisgICAgdTggb2J1Zls0XTsKKyAgICB1OCBidWZbNF07CisgICAgaW50IHJjOworCisgICAgYmNtX2FjY2Vzc19mcGdhKCk7CisKKyAgICAvKiBGUEdBIGV4cGVjdHMgNCBieXRlIG9mZnNldCBpbiBCSUcgRU5ESUFOIGZvcm1hdCAqLworICAgIG9idWZbMF0gPSAob2Zmc2V0ID4+IDI0KSAmIDB4ZmY7CisgICAgb2J1ZlsxXSA9IChvZmZzZXQgPj4gMTYpICYgMHhmZjsKKyAgICBvYnVmWzJdID0gKG9mZnNldCA+PiA4KSAmIDB4ZmY7CisgICAgb2J1ZlszXSA9IG9mZnNldCAmIDB4ZmY7CisgICAgcmMgPSBtYXBsZV9pMmNfcmVhZF93aXRoX29mZnNldChjbGllbnRfbnVtLCBvYnVmLCBzaXplb2Yob2J1ZiksIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCisgICAgaWYgKHJjIDwgMCkKKyAgICAgICAgaTJjX2RlYnVnX3ByaW50KCJSZWFkIEZQR0EgRmFpbGVkLiByYz0lZCBvZmZzZXQ9MHgleCBjbGllbnQ9JXVbJXVdXG4iLAorICAgICAgICAgICAgcmMsIG9mZnNldCwKKyAgICAgICAgICAgIG5vcm1hbF9pMmNbY2xpZW50X251bV0sIGNsaWVudF9udW0pOworICAgIGVsc2UKKyAgICB7CisgICAgICAgICpkYXRhID0gYnVmWzNdIHwgKGJ1ZlsyXSA8PCA4KSB8IChidWZbMV0gPDwgMTYpIHwgKGJ1ZlswXSA8PCAyNCk7IC8qIE1TIGJ5dGUgaXMgdHJhbnNmZXJyZWQgZmlyc3QgKi8KKyAgICAgICAgaTJjX2RlYnVnX3ByaW50KCJSZWFkIEZQR0E6IG9mZnNldCA9IDB4JXgsIHZhbCA9IDB4JXggJTAyeCAlMDJ4ICUwMnggJTAyeCAgY2xpZW50PSV1WyV1XVxuIiwKKyAgICAgICAgICAgIG9mZnNldCwgKmRhdGEsIGJ1ZlswXSwgYnVmWzFdLCBidWZbMl0sIGJ1ZlszXSwKKyAgICAgICAgICAgIG5vcm1hbF9pMmNbY2xpZW50X251bV0sIGNsaWVudF9udW0pOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MKG1hcGxlX2kyY19yZWFkX2ZwZ2EpOworCitlbnVtIGNsaWVudF9udW0gbWFwbGVfaTJjX2dldF9jbGllbnQodTMyIGFkZHIpCit7CisgICAgZW51bSBjbGllbnRfbnVtIGkgPSAwOworICAgIHdoaWxlIChpIDwgU0xBVkVfTlVNX09GX1NMQVZFUykKKyAgICB7CisgICAgICAgIGlmIChwY2xpZW50X2RhdGFfYXJbaV0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzbGF2ZV92YWxpZFtpXSAmJiBwY2xpZW50X2RhdGFfYXJbaV0tPmNsaWVudC5hZGRyID09IGFkZHIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaSsrOworICAgIH0KKyAgICByZXR1cm4gaTsKK30KK0VYUE9SVF9TWU1CT0wobWFwbGVfaTJjX2dldF9jbGllbnQpOworCitzdGF0aWMgaW50IGRldl9jaGFuZ2UodTMyIGFkZHIpCit7CisgICAgZW51bSBjbGllbnRfbnVtIGkgPSBtYXBsZV9pMmNfZ2V0X2NsaWVudChhZGRyKTsKKworICAgIGlmIChpIDwgU0xBVkVfTlVNX09GX1NMQVZFUykKKyAgICB7CisgICAgICAgIGkyY19jbGllbnRfbnVtID0gaTsKKyAgICAgICAgaTJjX2RlYnVnX3ByaW50KCJTbGF2ZSB3YXMgc2V0IHN1Y2Nlc3NmdWxseSBpICVkLCBhZGRyIDB4JXhcbiIsIGksIGFkZHIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpMmNfZGVidWdfcHJpbnQoIkZhaWxlZCB0byBzZXQgc2xhdmUgaSAlZCwgYWRkciAweCV4XG4iLCBpLCBhZGRyKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYmNtX2FjY2Vzc19mcGdhKHZvaWQpCit7CisgICAgc3RhdGljIGludCBhY2Nlc3NfZW5hYmxlZDsKKyAgICBpbnQgZnBnYV9jbGllbnRfbnVtICA9IG1hcGxlX2kyY19nZXRfY2xpZW50KEkyQ19TVzFfSTJDX0FERFIpOworICAgIHVpbnQ4X3QgIGI7CisKKyAgICBpZiAoYWNjZXNzX2VuYWJsZWQpCisgICAgCXJldHVybjsKKyAgICBiID0gNDsKKyAgICBtYXBsZV9pMmNfd3JpdGUoZnBnYV9jbGllbnRfbnVtLCAmYiwgMSk7CisgICAgYWNjZXNzX2VuYWJsZWQgPSAxOworfQorI2RlZmluZSBCQ01fRlBHQV9SRUdfUkVTRVRTIDB4MgorI2RlZmluZSBCQ01fRlBHQV9SRUdfRlBHQV9WRVJTSU9OIDB4MAorLyogMSA9IG91dCBvZiByZXNldCBiY21fYm9hcmRfY29uZmlnX3Jlc2V0X3ZhbHVlICovCit2b2lkIHJlc2V0X21hcGxlKGludCBiaXQsaW50IHBhcmFtKQoreworICAgIGludCBmcGdhX2NsaWVudF9udW0gID0gbWFwbGVfaTJjX2dldF9jbGllbnQoRlBHQV9JMkNfQUREUik7CisgICAgaW50IHN3X2NsaWVudF9udW0gID0gbWFwbGVfaTJjX2dldF9jbGllbnQoSTJDX1NXMF9JMkNfQUREUik7CisgICAgdWludDhfdCAgYiA9IDE7CisgICAgdWludDMyX3QgcmVzZXRfdmFsdWVzOworCisgICAgbWFwbGVfaTJjX3dyaXRlKHN3X2NsaWVudF9udW0sICZiLCAxKTsKKworICAgIC8qIFJlYWQtbW9kaWZ5LXdyaXRlIHNvIHdlIGNhbiBzZXQgb25seSB0aGUgcmVsZXZhbnQgYml0ICovCisgICAgbWFwbGVfaTJjX3JlYWRfZnBnYShmcGdhX2NsaWVudF9udW0sIEJDTV9GUEdBX1JFR19SRVNFVFMsICZyZXNldF92YWx1ZXMpOworCisgICAgaWYgKHBhcmFtKQorICAgICAgICByZXNldF92YWx1ZXMgfD0gMSA8PCBiaXQ7CisgICAgZWxzZQorICAgICAgICByZXNldF92YWx1ZXMgJj0gfigxIDw8IGJpdCk7CisgICAgbWFwbGVfaTJjX3dyaXRlX2ZwZ2EoZnBnYV9jbGllbnRfbnVtLCBCQ01fRlBHQV9SRUdfUkVTRVRTLCByZXNldF92YWx1ZXMpOworfQorRVhQT1JUX1NZTUJPTChyZXNldF9tYXBsZSk7CisKKy8qIENhbGxzIHRoZSBhcHByb3ByaWF0ZSBmdW5jdGlvbiBiYXNlZCBvbiB1c2VyIGNvbW1hbmQgKi8KK3N0YXRpYyBpbnQgZXhlY19jb21tYW5kKGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworI2RlZmluZSBNQVhfQVJHUyA0CisjZGVmaW5lIE1BWF9BUkdfU0laRSAzMgorICAgIGludCBpLCBhcmdjID0gMCwgdmFsID0gMDsKKyAgICBjaGFyIGNtZDsKKyAgICB1MzIgb2Zmc2V0ID0gMDsKKyAgICBjaGFyIGFyZ1tNQVhfQVJHU11bTUFYX0FSR19TSVpFXTsKKyNkZWZpbmUgTE9HX1dSX0tCVUZfU0laRSAxMjgKKyAgICBjaGFyIGtidWZbTE9HX1dSX0tCVUZfU0laRV07CisKKyAgICBpZiAoKGNvdW50ID4gTE9HX1dSX0tCVUZfU0laRS0xKSB8fCAoY29weV9mcm9tX3VzZXIoa2J1ZiwgYnVmLCBjb3VudCkgIT0gMCkpCisgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgIGtidWZbY291bnRdPTA7CisgICAgYXJnYyA9IHNzY2FuZihrYnVmLCAiJWMgJXMgJXMgJXMgJXMiLCAmY21kLCBhcmdbMF0sIGFyZ1sxXSwgYXJnWzJdLCBhcmdbM10pOworCisgICAgaWYgKGFyZ2MgPCAxKQorICAgIHsKKyAgICAgICAgcHJpbnRrKCJOZWVkIGF0LWxlYXN0IDIgYXJndW1lbnRzXG4iKTsKKyAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgfQorCisgICAgZm9yIChpPTA7IGk8TUFYX0FSR1M7ICsraSkgeworICAgICAgICBhcmdbaV1bTUFYX0FSR19TSVpFLTFdID0gJ1wwJzsKKyAgICB9CisgICAgb2Zmc2V0ID0gKHUzMilzaW1wbGVfc3RydG91bChhcmdbMF0sIE5VTEwsIDApOworICAgIGlmIChhcmdjID09IDMpCisgICAgICAgIHZhbCA9IChpbnQpc2ltcGxlX3N0cnRvdWwoYXJnWzFdLCBOVUxMLCAwKTsKKworICAgIHN3aXRjaCAoY21kKQorICAgIHsKKyAgICBjYXNlICdtJzoKKyAgICAgICAgcmVzZXRfbWFwbGUoMCxvZmZzZXQpOyAvLyBtYXBsZSBvdXQgb2YgcmVzZXQoMSkgfCByZXNldCAoMCkKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnayc6CisgICAgICAgIHJlc2V0X21hcGxlKDQsb2Zmc2V0KTsgLy8ga2F0YW5hMiBvdXQgb2YgcmVzZXQoMSkgfCByZXNldCAoMCkKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnYic6CisgICAgICAgIGlmIChhcmdjID09IDMpCisgICAgICAgICAgICBtYXBsZV9pMmNfd3JpdGVfYnl0ZShpMmNfY2xpZW50X251bSwgKHU4KW9mZnNldCwgKHU4KXZhbCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdTggZGF0YTsKKyAgICAgICAgICAgIG1hcGxlX2kyY19yZWFkX2J5dGUoaTJjX2NsaWVudF9udW0sICh1OClvZmZzZXQsICZkYXRhKTsKKyAgICAgICAgICAgIHByaW50aygiY2xpZW50IDB4JXgsIG9mZnNldCAweCV4LCBkYXRhPTB4JXhcbiIsIG5vcm1hbF9pMmNbaTJjX2NsaWVudF9udW1dLCBvZmZzZXQsIGRhdGEpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAncyc6CisgICAgICAgIGlmIChhcmdjID09IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHU4IGRhdGEgPSAodTgpb2Zmc2V0OworICAgICAgICAgICAgbWFwbGVfaTJjX3dyaXRlKGkyY19jbGllbnRfbnVtLCAmZGF0YSwgMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB1OCBkYXRhID0gb2Zmc2V0OworICAgICAgICAgICAgbWFwbGVfaTJjX3JlYWQoaTJjX2NsaWVudF9udW0sICZkYXRhLCAxKTsKKyAgICAgICAgICAgIHByaW50aygiY2xpZW50IDB4JXgsIGRhdGE9MHgleFxuIiwgbm9ybWFsX2kyY1tpMmNfY2xpZW50X251bV0sIGRhdGEpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAndyc6CisgICAgICAgIGlmIChhcmdjID09IDMpCisgICAgICAgICAgICBtYXBsZV9pMmNfd3JpdGVfd29yZChpMmNfY2xpZW50X251bSwgKHU4KW9mZnNldCwgKHUxNil2YWwpOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHUxNiBkYXRhOworICAgICAgICAgICAgbWFwbGVfaTJjX3JlYWRfd29yZChpMmNfY2xpZW50X251bSwgKHU4KW9mZnNldCwgJmRhdGEpOworICAgICAgICAgICAgcHJpbnRrKCJjbGllbnQgMHgleCwgb2Zmc2V0IDB4JXgsIGRhdGE9MHgleFxuIiwgbm9ybWFsX2kyY1tpMmNfY2xpZW50X251bV0sIG9mZnNldCwgZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdkJzoKKyAgICAgICAgaWYgKGFyZ2MgPT0gMykKKyAgICAgICAgICAgIG1hcGxlX2kyY193cml0ZV9yZWcoaTJjX2NsaWVudF9udW0sICh1OClvZmZzZXQsIHZhbCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdTMyIGRhdGE7CisgICAgICAgICAgICBtYXBsZV9pMmNfcmVhZF9yZWcoaTJjX2NsaWVudF9udW0sICh1OClvZmZzZXQsICZkYXRhKTsKKyAgICAgICAgICAgIHByaW50aygiY2xpZW50IDB4JXgsIG9mZnNldCAweCV4LCBkYXRhPTB4JXhcbiIsIG5vcm1hbF9pMmNbaTJjX2NsaWVudF9udW1dLCBvZmZzZXQsIGRhdGEpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAnZic6CisgICAgICAgIGlmIChhcmdjID09IDMpCisgICAgICAgICAgICBtYXBsZV9pMmNfd3JpdGVfZnBnYShpMmNfY2xpZW50X251bSwgb2Zmc2V0LCB2YWwpOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHUzMiBkYXRhOworICAgICAgICAgICAgbWFwbGVfaTJjX3JlYWRfZnBnYShpMmNfY2xpZW50X251bSwgb2Zmc2V0LCAmZGF0YSk7CisgICAgICAgICAgICBwcmludGsoImNsaWVudCAweCV4LCBvZmZzZXQgMHgleCwgZGF0YT0weCV4XG4iLCBub3JtYWxfaTJjW2kyY19jbGllbnRfbnVtXSwgb2Zmc2V0LCBkYXRhKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgJ2MnOgorICAgICAgICBkZXZfY2hhbmdlKG9mZnNldCk7CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgcHJpbnRrKCJJbnZhbGlkIGNvbW1hbmQuXG4gVmFsaWQgY29tbWFuZHM6XG4iCisgICAgICAgICAgICAiICBDaGFuZ2UgSTJDIEFkZHI6IGMgYWRkclxuIgorICAgICAgICAgICAgIiAgV3JpdGUgUmVnOiAgICAgICBkIG9mZnNldCB2YWxcbiIKKyAgICAgICAgICAgICIgIFJlYWQgUmVnOiAgICAgICAgZCBvZmZzZXRcbiIKKyAgICAgICAgICAgICIgIFdyaXRlIFdvcmQ6ICAgICAgdyBvZmZzZXQgdmFsXG4iCisgICAgICAgICAgICAiICBSZWFkIFdvcmQ6ICAgICAgIHcgb2Zmc2V0XG4iCisgICAgICAgICAgICAiICBXcml0ZSBCeXRlOiAgICAgIGIgb2Zmc2V0IHZhbFxuIgorICAgICAgICAgICAgIiAgUmVhZCBCeXRlOiAgICAgICBiIG9mZnNldFxuIgorICAgICAgICAgICAgIiAgV3JpdGUgZnBnYTogICAgICBmIG9mZnNldCB2YWxcbiIKKyAgICAgICAgICAgICIgIFJlYWQgZnBnYTogICAgICAgZiBvZmZzZXRcbiIKKyAgICAgICAgICAgICIgIFdyaXRlIHRvIHN3aXRjaDogcyB2YWwgKG9uZSBieXRlKVxuIgorICAgICAgICAgICAgIiAgUmVhZCBmcm9tIHN3aXRjaDpzXG4iCisgICAgICAgICAgICAiICBNYXBsZTogICAgICAgICAgIG0gPDB8MT5cbiIKKyAgICAgICAgICAgICIgIEthdGFuYTI6ICAgICAgICAgayA8MHwxPlxuIgorICAgICAgICAgICAgKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBjb3VudDsKK30KKworCisKKy8qIFJlYWQgRnVuY3Rpb24gb2YgUFJPQ0ZTIGF0dHJpYnV0ZSAibWFwbGVfaTJjL3Rlc3QiICovCitzdGF0aWMgc3NpemVfdCBtYXBsZV9pMmNfcHJvY190ZXN0X3JlYWQoc3RydWN0IGZpbGUgKmYsIGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorICAgIGxvZmZfdCAqcG9zKQoreworICAgIHByaW50aygiIFVzYWdlOiBlY2hvIGNvbW1hbmQgPiAiCisgICAgICAgICIgL3Byb2MvbWFwbGVfaTJjL3Rlc3RcbiIpOworICAgIHByaW50aygiIHN1cHBvcnRlZCBjb21tYW5kczpcbiIKKyAgICAgICAgIiAgQ2hhbmdlIEkyQyBBZGRyOiBjIGFkZHJcbiIKKyAgICAgICAgIiAgV3JpdGUgUmVnOiAgICAgICBkIG9mZnNldCB2YWxcbiIKKyAgICAgICAgIiAgUmVhZCBSZWc6ICAgICAgICBkIG9mZnNldFxuIgorICAgICAgICAiICBXcml0ZSBXb3JkOiAgICAgIHcgb2Zmc2V0IHZhbFxuIgorICAgICAgICAiICBSZWFkIFdvcmQ6ICAgICAgIHcgb2Zmc2V0XG4iCisgICAgICAgICIgIFdyaXRlIEJ5dGU6ICAgICAgYiBvZmZzZXQgdmFsXG4iCisgICAgICAgICIgIFJlYWQgQnl0ZTogICAgICAgYiBvZmZzZXRcbiIKKyAgICAgICAgIiAgV3JpdGUgZnBnYTogICAgICBmIG9mZnNldCB2YWxcbiIKKyAgICAgICAgIiAgUmVhZCBmcGdhOiAgICAgICBmIG9mZnNldFxuIgorICAgICAgICAiICBXcml0ZSB0byBzd2l0Y2g6IHMgdmFsIChvbmUgYnl0ZSlcbiIKKyAgICAgICAgIiAgUmVhZCBmcm9tIHN3aXRjaDpzXG4iCisgICAgICAgICk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIFdyaXRlIEZ1bmN0aW9uIG9mIFBST0NGUyBhdHRyaWJ1dGUgIm1hcGxlX2kyYy90ZXN0IiAqLworc3RhdGljIHNzaXplX3QgbWFwbGVfaTJjX3Byb2NfdGVzdF93cml0ZShzdHJ1Y3QgZmlsZSAqZiwgY29uc3QgY2hhciAqYnVmLAorICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCit7CisgICAgcmV0dXJuIGV4ZWNfY29tbWFuZChidWYsIGNvdW50KTsKK30KKworLyogUmV0dXJuIDAgaWYgZGV0ZWN0aW9uIGlzIHN1Y2Nlc3NmdWwsIC1FTk9ERVYgb3RoZXJ3aXNlICovCitzdGF0aWMgaW50IG1hcGxlX2kyY19kZXZfZGV0ZWN0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyAqaW5mbykKK3sKKyAgICBpMmNfZGVidWdfcHJpbnQoImRldGVjdGluZyBpMmMgZGV2aWNlIDB4JXhcbiIsIGNsaWVudC0+YWRkcik7CisKKyAgICAvKiBUT0RPOiBkZXRlY3Rpb24gYW5kIGlkZW50aWZpY2F0aW9uICovCisKKyAgICBzdHJjcHkoaW5mby0+dHlwZSwgIm1hcGxlX2kyYyIpOworICAgIGluZm8tPmZsYWdzID0gMDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbWFwbGVfaTJjX2ZvcHMgPQoreworICAgIHJlYWQ6IG1hcGxlX2kyY19wcm9jX3Rlc3RfcmVhZCwKKyAgICB3cml0ZTogbWFwbGVfaTJjX3Byb2NfdGVzdF93cml0ZQorfTsKKworc3RhdGljIGludCBtYXBsZV9pMmNfZGV2X2NyZWF0ZV9wcm9jKHZvaWQpCit7CisgICAgaTJjX3Byb2NfZGlyID0gcHJvY19ta2RpcihQUk9DX0RJUl9OQU1FLCBOVUxMKTsKKyAgICBpZiAoIWkyY19wcm9jX2RpcikKKyAgICB7CisgICAgICAgIGkyY19kZWJ1Z19wcmludCgiZmFpbCB0byBjcmVhdGUgcHJvYyBkaXJcbiIpOworICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICB9CisKKyAgICBpMmNfcHJvY19lbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KFBST0NfRU5UUllfTkFNRSwgMCwgaTJjX3Byb2NfZGlyKTsKKyAgICBpZiAoIWkyY19wcm9jX2VudHJ5KQorICAgIHsKKyAgICAgICAgcmVtb3ZlX3Byb2NfZW50cnkoUFJPQ19ESVJfTkFNRSwgTlVMTCk7CisgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgIH0KKworICAgIGkyY19wcm9jX2VudHJ5LT5wcm9jX2ZvcHMgPSAmbWFwbGVfaTJjX2ZvcHM7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYXBsZV9pMmNfY2hyZGV2X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWFwbGVfaTJjX2NocmRldl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgbG9uZyBtYXBsZV9pMmNfY2hyZGV2X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKyAgICBpbnQgbGludXhfcmMgPSAwOworICAgIGludCByYzsKKyAgICBtYXBsZV9pMmNfaW9jdGxfcGFyYW0gcGFyYW1zOworCisgICAgLyogZG9uJ3QgZXZlbiBkZWNvZGUgd3JvbmcgY21kczogYmV0dGVyIHJldHVybmluZyAgRU5PVFRZIHRoYW4gRUZBVUxUICovCisgICAgaWYgKF9JT0NfVFlQRShjbWQpICE9IE1BUExFX0kyQ19JT0NUTF9NQUdJQykKKyAgICAgICAgcmV0dXJuIC1FTk9UVFk7CisKKyAgICAvKgorICAgICAqIHRoZSB0eXBlIGlzIGEgYml0bWFzaywgYW5kIFZFUklGWV9XUklURSBjYXRjaGVzIFIvVworICAgICAqIHRyYW5zZmVycy4gTm90ZSB0aGF0IHRoZSB0eXBlIGlzIHVzZXItb3JpZW50ZWQsIHdoaWxlCisgICAgICogdmVyaWZ5X2FyZWEgaXMga2VybmVsLW9yaWVudGVkLCBzbyB0aGUgY29uY2VwdCBvZiAicmVhZCIgYW5kCisgICAgICogIndyaXRlIiBpcyByZXZlcnNlZAorICAgICAqLworICAgIGlmIChfSU9DX0RJUihjbWQpICYgX0lPQ19SRUFEKQorICAgICAgICBsaW51eF9yYyA9ICFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCAodm9pZCBfX3VzZXIgKilhcmcsIF9JT0NfU0laRShjbWQpKTsKKyAgICBlbHNlIGlmIChfSU9DX0RJUihjbWQpICYgX0lPQ19XUklURSkKKyAgICAgICAgbGludXhfcmMgPSAgIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgKHZvaWQgX191c2VyICopYXJnLCBfSU9DX1NJWkUoY21kKSk7CisgICAgaWYgKGxpbnV4X3JjKQorICAgICAgICByZXR1cm4gLUVGQVVMVDsKKworICAgIHN3aXRjaCAoY21kKQorICAgIHsKKyAgICBjYXNlIE1BUExFX0kyQ19JT0NUTF9PUF9ERVZfQ0hBTkdFOgorICAgICAgICB7CisgICAgICAgICAgICBsaW51eF9yYyA9IGNvcHlfZnJvbV91c2VyKChjaGFyICopJnBhcmFtcywgKGNoYXIgKilhcmcsIHNpemVvZihwYXJhbXMpKTsKKyAgICAgICAgICAgIGlmIChsaW51eF9yYyA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICByZXR1cm4gZGV2X2NoYW5nZShwYXJhbXMuYWRkcik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNQVBMRV9JMkNfSU9DVExfT1BfREVWX1dSSVRFOgorICAgICAgICB7CisgICAgICAgICAgICBsaW51eF9yYyA9IGNvcHlfZnJvbV91c2VyKChjaGFyICopJnBhcmFtcywgKGNoYXIgKilhcmcsIHNpemVvZihwYXJhbXMpKTsKKyAgICAgICAgICAgIGlmIChsaW51eF9yYyA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBzd2l0Y2ggKHBhcmFtcy5jb3VudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICByZXR1cm4gbWFwbGVfaTJjX3dyaXRlX2J5dGUoaTJjX2NsaWVudF9udW0sIHBhcmFtcy5hZGRyLCBwYXJhbXMudmFsKTsKKyAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1hcGxlX2kyY193cml0ZV93b3JkKGkyY19jbGllbnRfbnVtLCBwYXJhbXMuYWRkciwgcGFyYW1zLnZhbCk7CisgICAgICAgICAgICBjYXNlIDMyOgorICAgICAgICAgICAgICAgIHJldHVybiBtYXBsZV9pMmNfd3JpdGVfcmVnKGkyY19jbGllbnRfbnVtLCBwYXJhbXMuYWRkciwgcGFyYW1zLnZhbCk7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUFQTEVfSTJDX0lPQ1RMX09QX0RFVl9SRUFEOgorICAgICAgICB7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGI7CisgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCB3OworICAgICAgICAgICAgdW5zaWduZWQgaW50IHI7CisKKyAgICAgICAgICAgIGxpbnV4X3JjID0gY29weV9mcm9tX3VzZXIoKGNoYXIgKikmcGFyYW1zLCAoY2hhciAqKWFyZywgc2l6ZW9mKHBhcmFtcykpOworICAgICAgICAgICAgaWYgKGxpbnV4X3JjIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHN3aXRjaCAocGFyYW1zLmNvdW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgIGxpbnV4X3JjID0gbWFwbGVfaTJjX3JlYWRfYnl0ZShpMmNfY2xpZW50X251bSwgcGFyYW1zLmFkZHIsICZiKTsKKyAgICAgICAgICAgICAgICBpZiAobGludXhfcmMgPCAwKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBwYXJhbXMudmFsID0gYjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgbGludXhfcmMgPSBtYXBsZV9pMmNfcmVhZF93b3JkKGkyY19jbGllbnRfbnVtLCBwYXJhbXMuYWRkciwgJncpOworICAgICAgICAgICAgICAgIGlmIChsaW51eF9yYyA8IDApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHBhcmFtcy52YWwgPSB3OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzMjoKKyAgICAgICAgICAgICAgICBsaW51eF9yYyA9IG1hcGxlX2kyY19yZWFkX3JlZyhpMmNfY2xpZW50X251bSwgcGFyYW1zLmFkZHIsICZyKTsKKyAgICAgICAgICAgICAgICBpZiAobGludXhfcmMgPCAwKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBwYXJhbXMudmFsID0gcjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGludXhfcmMgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcmV0dXJuIGNvcHlfdG9fdXNlcigoY2hhciAqKWFyZywgKGNoYXIgKikmcGFyYW1zLCBzaXplb2YocGFyYW1zKSk7CisgICAgICAgIH0KKyAgICBjYXNlIE1BUExFX0kyQ19JT0NUTF9PUF9TV0lUQ0hfV1JJVEU6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgYjsKKworICAgICAgICAgICAgbGludXhfcmMgPSBjb3B5X2Zyb21fdXNlcigoY2hhciAqKSZwYXJhbXMsIChjaGFyICopYXJnLCBzaXplb2YocGFyYW1zKSk7CisgICAgICAgICAgICBpZiAobGludXhfcmMgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgYiA9IHBhcmFtcy52YWw7CisgICAgICAgICAgICByZXR1cm4gbWFwbGVfaTJjX3dyaXRlKGkyY19jbGllbnRfbnVtLCAmYiwgMSk7CisgICAgICAgIH0KKyAgICBjYXNlIE1BUExFX0kyQ19JT0NUTF9PUF9TV0lUQ0hfUkVBRDoKKyAgICAgICAgeworICAgICAgICAgICAgY2hhciBiOworCisgICAgICAgICAgICBsaW51eF9yYyA9IG1hcGxlX2kyY19yZWFkKGkyY19jbGllbnRfbnVtLCAmYiwgMSk7CisgICAgICAgICAgICBpZiAobGludXhfcmMgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcGFyYW1zLnZhbCA9IGI7CisgICAgICAgICAgICByZXR1cm4gY29weV90b191c2VyKChjaGFyICopYXJnLCAoY2hhciAqKSZwYXJhbXMsIHNpemVvZihwYXJhbXMpKTsKKyAgICAgICAgfQorICAgIGNhc2UgTUFQTEVfSTJDX0lPQ1RMX09QX0ZQR0FfV1JJVEU6CisgICAgICAgIHsKKyAgICAgICAgICAgIGxpbnV4X3JjID0gY29weV9mcm9tX3VzZXIoKGNoYXIgKikmcGFyYW1zLCAoY2hhciAqKWFyZywgc2l6ZW9mKHBhcmFtcykpOworICAgICAgICAgICAgaWYgKGxpbnV4X3JjIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHJldHVybiBtYXBsZV9pMmNfd3JpdGVfZnBnYShpMmNfY2xpZW50X251bSwgcGFyYW1zLmFkZHIsIHBhcmFtcy52YWwpOworICAgICAgICB9CisgICAgY2FzZSBNQVBMRV9JMkNfSU9DVExfT1BfRlBHQV9SRUFEOgorICAgICAgICB7CisgICAgICAgICAgICBsaW51eF9yYyA9IGNvcHlfZnJvbV91c2VyKChjaGFyICopJnBhcmFtcywgKGNoYXIgKilhcmcsIHNpemVvZihwYXJhbXMpKTsKKyAgICAgICAgICAgIGlmIChsaW51eF9yYyA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBsaW51eF9yYyA9IG1hcGxlX2kyY19yZWFkX2ZwZ2EoaTJjX2NsaWVudF9udW0sIHBhcmFtcy5hZGRyLCAmcGFyYW1zLnZhbCk7CisgICAgICAgICAgICBpZiAobGludXhfcmMgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcmV0dXJuIGNvcHlfdG9fdXNlcigoY2hhciAqKWFyZywgKGNoYXIgKikmcGFyYW1zLCBzaXplb2YocGFyYW1zKSk7CisgICAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICByYyA9IC1FTk9UVFk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBsaW51eF9yYzsKK30KKworc3RhdGljIHNzaXplX3QgbWFwbGVfaTJjX2NocmRldl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlscCwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKyAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqZl9wb3MpCit7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG1hcGxlX2kyY19jaHJkZXZfZm9wcyA9Cit7CisgICAgLm93bmVyID0gVEhJU19NT0RVTEUsCisgICAgLm9wZW4gPSBtYXBsZV9pMmNfY2hyZGV2X29wZW4sCisgICAgLnJlbGVhc2UgPSBtYXBsZV9pMmNfY2hyZGV2X3JlbGVhc2UsCisgICAgLndyaXRlID0gbWFwbGVfaTJjX2NocmRldl93cml0ZSwKKyAgICAudW5sb2NrZWRfaW9jdGwgPSBtYXBsZV9pMmNfY2hyZGV2X2lvY3RsCit9OworCitzdGF0aWMgc3RydWN0IGNkZXYgbWFwbGVfaTJjX2NocmRldl9jZGV2OworCitzdGF0aWMgaW50IG1hcGxlX2kyY19kZXZfY3JlYXRlX2NocmRldih2b2lkKQoreworICAgIGRldl90IGRldiA9IE1LREVWKG1hcGxlX2kyY19jaHJkZXZfbWFqb3IsIDApOworICAgIGludCBsaW51eF9yYzsKKworICAgIGlzX2NocmRldl9yZWcgPSAwOworICAgIGlzX2NkZXZfYWRkID0gMDsKKyAgICAvKgorICAgICAqIFJlZ2lzdGVyIHlvdXIgbWFqb3IsIGFuZCBhY2NlcHQgYSBkeW5hbWljIG51bWJlci4KKyAgICAgKi8KKyAgICBpZiAoIW1hcGxlX2kyY19jaHJkZXZfbWFqb3IpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBsaW51eF9yYyA9IHJlZ2lzdGVyX2NocmRldl9yZWdpb24oZGV2LCAwLCAibWFwbGVfaTJjIik7CisgICAgaWYgKGxpbnV4X3JjIDwgMCkKKyAgICB7CisgICAgICAgIGkyY19kZWJ1Z19wcmludCgicmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbigpLT4lZFxuIiwgbGludXhfcmMpOworICAgICAgICByZXR1cm4gLUVJTzsKKyAgICB9CisgICAgaXNfY2hyZGV2X3JlZyA9IDE7CisKKyAgICBjZGV2X2luaXQoJm1hcGxlX2kyY19jaHJkZXZfY2RldiwgJm1hcGxlX2kyY19jaHJkZXZfZm9wcyk7CisgICAgbGludXhfcmMgPSBjZGV2X2FkZCgmbWFwbGVfaTJjX2NocmRldl9jZGV2LCBkZXYsIDEpOworICAgIGlmIChsaW51eF9yYyA8IDApCisgICAgeworICAgICAgICBpMmNfZGVidWdfcHJpbnQoImNkZXZfYWRkKCktPiVkXG4iLCBsaW51eF9yYyk7CisgICAgICAgIHJldHVybiAtRUlPOworICAgIH0KKyAgICBpc19jZGV2X2FkZCA9IDE7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYXBsZV9pMmNfZGV2X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKyAgICBpbnQgZXJyID0gMDsKKyAgICBzdHJ1Y3QgbWFwbGVfaTJjX2RhdGEgKnBjbGllbnRfZGF0YTsKKworICAgIGkyY19kZWJ1Z19wcmludCgiISEhISBpMmMgZGV2aWNlIDB4JXggcHJvYmVcbiIsIGNsaWVudC0+YWRkcik7CisKKyAgICBpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwgSTJDX0ZVTkNfSTJDKSkKKyAgICAgICAgZ290byBleGl0OworCisgICAgaWYgKCEocGNsaWVudF9kYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1hcGxlX2kyY19kYXRhKSwgR0ZQX0tFUk5FTCkpKQorICAgIHsKKyAgICAgICAgZXJyID0gLUVOT01FTTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIHBjbGllbnRfZGF0YS0+Y2xpZW50LmFkZHIgPSBjbGllbnQtPmFkZHI7CisgICAgcGNsaWVudF9kYXRhLT5jbGllbnQuYWRhcHRlciA9IGNsaWVudC0+YWRhcHRlcjsKKyAgICBwY2xpZW50X2RhdGEtPmNsaWVudC5kcml2ZXIgPSBjbGllbnQtPmRyaXZlcjsKKyAgICBwY2xpZW50X2RhdGEtPmNsaWVudC5mbGFncyA9IGNsaWVudC0+ZmxhZ3M7CisKKyAgICBpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBwY2xpZW50X2RhdGEpOworCisgICAgc3dpdGNoKGNsaWVudC0+YWRkcikKKyAgICB7CisgICAgY2FzZSBJMkNfU1cwX0kyQ19BRERSOgorICAgICAgICBwY2xpZW50X2RhdGFfYXJbU0xBVkVfU1dJVENIXzcwXSA9IHBjbGllbnRfZGF0YTsKKyAgICAgICAgc2xhdmVfdmFsaWRbU0xBVkVfU1dJVENIXzcwXSA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSTJDX1NXMV9JMkNfQUREUjoKKyAgICAgICAgcGNsaWVudF9kYXRhX2FyW1NMQVZFX1NXSVRDSF83MV0gPSBwY2xpZW50X2RhdGE7CisgICAgICAgIHNsYXZlX3ZhbGlkW1NMQVZFX1NXSVRDSF83MV0gPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEkyQ19TVzJfSTJDX0FERFI6CisgICAgICAgIHBjbGllbnRfZGF0YV9hcltTTEFWRV9TV0lUQ0hfNzJdID0gcGNsaWVudF9kYXRhOworICAgICAgICBzbGF2ZV92YWxpZFtTTEFWRV9TV0lUQ0hfNzJdID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJMkNfU1czX0kyQ19BRERSOgorICAgICAgICBwY2xpZW50X2RhdGFfYXJbU0xBVkVfU1dJVENIXzczXSA9IHBjbGllbnRfZGF0YTsKKyAgICAgICAgc2xhdmVfdmFsaWRbU0xBVkVfU1dJVENIXzczXSA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSTJDX1NXNF9JMkNfQUREUjoKKyAgICAgICAgcGNsaWVudF9kYXRhX2FyW1NMQVZFX1NXSVRDSF83NF0gPSBwY2xpZW50X2RhdGE7CisgICAgICAgIHNsYXZlX3ZhbGlkW1NMQVZFX1NXSVRDSF83NF0gPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNGUF9JMkNfQUREUjE6CisgICAgICAgIHBjbGllbnRfZGF0YV9hcltTTEFWRV9TRlBfNTBdID0gcGNsaWVudF9kYXRhOworICAgICAgICBzbGF2ZV92YWxpZFtTTEFWRV9TRlBfNTBdID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTRlBfSTJDX0FERFIyOgorICAgICAgICBwY2xpZW50X2RhdGFfYXJbU0xBVkVfU0ZQXzUxXSA9IHBjbGllbnRfZGF0YTsKKyAgICAgICAgc2xhdmVfdmFsaWRbU0xBVkVfU0ZQXzUxXSA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRlBHQV9JMkNfQUREUjoKKyAgICAgICAgcGNsaWVudF9kYXRhX2FyW1NMQVZFX0ZQR0FfNDBdID0gcGNsaWVudF9kYXRhOworICAgICAgICBzbGF2ZV92YWxpZFtTTEFWRV9GUEdBXzQwXSA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUE9OX0RQTExfSTJDX0FERFI6CisgICAgICAgIHBjbGllbnRfZGF0YV9hcltTTEFWRV9QT05fRFBMTF82OF0gPSBwY2xpZW50X2RhdGE7CisgICAgICAgIHNsYXZlX3ZhbGlkW1NMQVZFX1BPTl9EUExMXzY4XSA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUE1fRFBMTF9JMkNfQUREUjoKKyAgICAgICAgcGNsaWVudF9kYXRhX2FyW1NMQVZFX1BNX0RQTExfNkFdID0gcGNsaWVudF9kYXRhOworICAgICAgICBzbGF2ZV92YWxpZFtTTEFWRV9QTV9EUExMXzZBXSA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1hQX1JfSTJDX0FERFI6CisgICAgICAgIHBjbGllbnRfZGF0YV9hcltTTEFWRV9DWFBfUl81NF0gPSBwY2xpZW50X2RhdGE7CisgICAgICAgIHNsYXZlX3ZhbGlkW1NMQVZFX0NYUF9SXzU0XSA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUENJRV9TV19JMkNfQUREUjoKKyAgICAgICAgcGNsaWVudF9kYXRhX2FyW1NMQVZFX1BDSUVfU1dfM0NdID0gcGNsaWVudF9kYXRhOworICAgICAgICBzbGF2ZV92YWxpZFtTTEFWRV9QQ0lFX1NXXzNDXSA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGkyY19kZWJ1Z19wcmludCgiJXMgY2xpZW50IGFkZHIgb3V0IG9mIHJhbmdlIDB4JXhcbiIsIF9fRlVOQ1RJT05fXywgY2xpZW50LT5hZGRyKTsKKyAgICAgICAgZ290byBleGl0X2tmcmVlOworICAgIH0KKworICAgIC8qIENyZWF0ZSBvbmx5IG9uY2UgKi8KKyAgICBpZiAoaTJjX3Byb2NfZW50cnkgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChtYXBsZV9pMmNfZGV2X2NyZWF0ZV9wcm9jKCkgPCAwKQorICAgICAgICAgICAgZ290byBleGl0X2tmcmVlOworICAgIH0KKyAgICBpZiAoIWlzX2NkZXZfYWRkKQorICAgIHsKKyAgICAgICAgaWYgKG1hcGxlX2kyY19kZXZfY3JlYXRlX2NocmRldigpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXhpdF9rZnJlZTsKKyAgICB9CisgICAgKytpMmNfbnVtX2NsaWVudHM7CisKKyAgICByZXR1cm4gMDsKKworZXhpdF9rZnJlZToKKyAgICBrZnJlZShwY2xpZW50X2RhdGEpOworZXhpdDoKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1hcGxlX2kyY19kZXZfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisgICAga2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOworICAgIC0taTJjX251bV9jbGllbnRzOworICAgIGlmICghaTJjX251bV9jbGllbnRzKQorICAgIHsKKyAgICAgICAgaWYgKGkyY19wcm9jX2VudHJ5ICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlbW92ZV9wcm9jX2VudHJ5KFBST0NfRU5UUllfTkFNRSwgaTJjX3Byb2NfZGlyKTsKKyAgICAgICAgICAgIGkyY19wcm9jX2VudHJ5ID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaTJjX3Byb2NfZGlyICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlbW92ZV9wcm9jX2VudHJ5KFBST0NfRElSX05BTUUsIE5VTEwpOworICAgICAgICAgICAgaTJjX3Byb2NfZGlyID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNfY2Rldl9hZGQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNkZXZfZGVsKCZtYXBsZV9pMmNfY2hyZGV2X2NkZXYpOworICAgICAgICAgICAgaXNfY2Rldl9hZGQgPSAwOworICAgICAgICB9CisgICAgICAgIGlmIChpc19jaHJkZXZfcmVnKQorICAgICAgICB7CisgICAgICAgICAgICB1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oTUtERVYobWFwbGVfaTJjX2NocmRldl9tYWpvciwgMCksIDEpOworICAgICAgICAgICAgaXNfY2hyZGV2X3JlZyA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG1hcGxlX2kyY19kZXZfZHJpdmVyID0geworICAgIC5jbGFzcwkJPSB+MCwKKyAgICAuZHJpdmVyID0geworICAgICAgICAubmFtZQk9ICJtYXBsZV9pMmMiLAorICAgIH0sCisgICAgLnByb2JlCQk9IG1hcGxlX2kyY19kZXZfcHJvYmUsCisgICAgLnJlbW92ZQkJPSBtYXBsZV9pMmNfZGV2X3JlbW92ZSwKKyAgICAuaWRfdGFibGUJPSBtYXBsZV9pMmNfaWRfdGFibGUsCisgICAgLmRldGVjdAkJPSBtYXBsZV9pMmNfZGV2X2RldGVjdCwKKyAgICAuYWRkcmVzc19saXN0CT0gbm9ybWFsX2kyYywKK307CisKK21vZHVsZV9pMmNfZHJpdmVyKG1hcGxlX2kyY19kZXZfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJtYXBsZSBpMmMgZGV2aWNlcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2kyYy9iY21vbHRfaTJjX2RldnMuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvaTJjL2JjbW9sdF9pMmNfZGV2cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMGVkYWEKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2kyYy9iY21vbHRfaTJjX2RldnMuaApAQCAtMCwwICsxLDIyNiBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBfQkNNT0xUX0kyQ19ERVZTX0hfCisjZGVmaW5lIF9CQ01PTFRfSTJDX0RFVlNfSF8KKworLyogV2hlbiBpbnNlcnRpbmcgdGhlIG1vZHVsZSAod2l0aCBpbnNtb2QpIG9ubHQgdGhlIEkyQyBzd2l0Y2ggZGV2aWNlcyAoSTJDX1NXWF9JMkNfQUREUikgCisgICB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQsIGFuZCB0aGVyZWZvcmUgd2lsbCBiZSBwcm9iZWQuCisgICBQcm9iaW5nIGFsbCBvdGhlciBkZXZpY2VzIGNhbiBiZSBkb25lIGFmdGVyIGluZXJ0aW5nIHRoZSBtb2R1bGUgdmlhIHN5c2ZzLgorICAgZm9yIGV4YW1wbGUsIGluIG9yZGVyIHRvIHByb2JlIEZQR0EgZGV2aWNlLCB0aGUgZm9sbG93aW5nIGxpbmUgc2hvdWxkIGJlIGFwcGxpZWQ6CisgICAtLSBlY2hvIG1hcGxlX2kyYyBGUEdBX0kyQ19BRERSID4gL3N5cy9idXMvaTJjL2RldmljZXMvaTJjLTAvbmV3X2RldmljZSAtLQorKi8gCitlbnVtIGNsaWVudF9udW0KK3sKKyAgICBTTEFWRV9TV0lUQ0hfNzAgICAgPSAwLAorICAgIFNMQVZFX1NXSVRDSF83MSAgICA9IDEsCisgICAgU0xBVkVfU1dJVENIXzcyICAgID0gMiwKKyAgICBTTEFWRV9TV0lUQ0hfNzMgICAgPSAzLAorICAgIFNMQVZFX1NXSVRDSF83NCAgICA9IDQsCisgICAgU0xBVkVfU0ZQXzUwICAgICAgID0gNSwKKyAgICBTTEFWRV9TRlBfNTEgICAgICAgPSA2LAorICAgIFNMQVZFX0ZQR0FfNDAgICAgICA9IDcsCisgICAgU0xBVkVfUE9OX0RQTExfNjggID0gOCwKKyAgICBTTEFWRV9QTV9EUExMXzZBICAgPSA5LAorICAgIFNMQVZFX0NYUF9SXzU0ICAgICA9IDEwLAorICAgIFNMQVZFX1BDSUVfU1dfM0MgICA9IDExLAorICAgIFNMQVZFX05VTV9PRl9TTEFWRVMKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBtYXBsZV9pMmNfd3JpdGUKKworICAgREVTQ1JJUFRJT046CisgICAgICAgV3JpdGVzIHNlcmlhbGx5IGRhdGEgdG8gSTJDIGRldmljZQorCisgICBQQVJBTUVURVJTOgorICAgICAgIGNsaWVudCBudW0gLSBUaGUgY2xpZW50IHRvIHdyaXRlIHRvLgorICAgICAgIGJ1ZiAgICAgICAgLSBUaGUgYnVmZmVyIHRvIHdyaXRlLgorICAgICAgIGNvdW50ICAgICAgLSBOdW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUKKworICAgT1VUUFVUOgorICAgICAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3ZXJlIHdyaXR0ZW4sIHdoZW4gZmFpbHMgcmV0dXJuIG5lZ2F0aXZlIG51bWJlcgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzc2l6ZV90IG1hcGxlX2kyY193cml0ZSh1bnNpZ25lZCBjaGFyIGNsaWVudF9udW0sIGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBtYXBsZV9pMmNfcmVhZAorCisgICBERVNDUklQVElPTjoKKyAgICAgICBSZWFkIHNlcmlhbGx5IGRhdGEgZnJvbSBJMkMgZGV2aWNlCisKKyAgIFBBUkFNRVRFUlM6CisgICAgICAgY2xpZW50IG51bSAtIFRoZSBjbGllbnQgdG8gd3JpdGUgdG8uCisgICAgICAgYnVmICAgICAgICAtIFRoZSBidWZmZXIgdG8gcmVhZCB0by4KKyAgICAgICBjb3VudCAgICAgIC0gTnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKKworICAgT1VUUFVUOgorICAgICAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3ZXJlIHJlYWQsIHdoZW4gZmFpbHMgcmV0dXJuIG5lZ2F0aXZlIG51bWJlcgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzc2l6ZV90IG1hcGxlX2kyY19yZWFkKHVuc2lnbmVkIGNoYXIgY2xpZW50X251bSwgY2hhciAqYnVmLCBzaXplX3QgY291bnQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIG1hcGxlX2kyY193cml0ZV9ieXRlCisKKyAgIERFU0NSSVBUSU9OOgorICAgICAgIFdyaXRlIGJ5dGUgdG8gSTJDIGRldmljZQorCisgICBQQVJBTUVURVJTOgorICAgICAgIGNsaWVudCBudW0gLSBUaGUgY2xpZW50IHRvIHdyaXRlIHRvLgorICAgICAgIG9mZnNldCAgICAgLSBUaGUgb2Zmc2V0IHRvIHdyaXRlIHRvLgorICAgICAgIHZhbCAgICAgICAgLSBUaGEgZGF0YSB0byB3cml0ZS4KKworICAgT1VUUFVUOgorICAgICAgIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IG1hcGxlX2kyY193cml0ZV9ieXRlKHVuc2lnbmVkIGNoYXIgY2xpZW50X251bSwgdW5zaWduZWQgY2hhciBvZmZzZXQsIHVuc2lnbmVkIGNoYXIgdmFsKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBtYXBsZV9pMmNfcmVhZF9ieXRlCisKKyAgIERFU0NSSVBUSU9OOgorICAgICAgIFJlYWQgYnl0ZSBmcm9tIEkyQyBkZXZpY2UKKworICAgUEFSQU1FVEVSUzoKKyAgICAgICBjbGllbnQgbnVtIC0gVGhlIGNsaWVudCB0byByZWFkIGZyb20uCisgICAgICAgb2Zmc2V0ICAgICAtIFRoZSBvZmZzZXQgdG8gcmVhZCBmcm9tLgorICAgICAgIGRhdGEgICAgICAgLSB0aGUgcmVhZCB2YWx1ZSBpcyB3cml0dGVuIHRvIHRoaXMgcG9pbnRlci4KKyAgIE9VVFBVVDoKKyAgICAgICAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBtYXBsZV9pMmNfcmVhZF9ieXRlKHVuc2lnbmVkIGNoYXIgY2xpZW50X251bSwgdW5zaWduZWQgY2hhciBvZmZzZXQsIHVuc2lnbmVkIGNoYXIqIGRhdGEpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIG1hcGxlX2kyY193cml0ZV93b3JkCisKKyAgIERFU0NSSVBUSU9OOgorICAgICAgIFdyaXRlIDE2IGJpdCB3b3JkIHRvIEkyQyBkZXZpY2UKKworICAgUEFSQU1FVEVSUzoKKyAgICAgICBjbGllbnQgbnVtIC0gVGhlIGNsaWVudCB0byB3cml0ZSB0by4KKyAgICAgICBvZmZzZXQgICAgIC0gVGhlIG9mZnNldCB0byB3cml0ZSB0by4KKyAgICAgICB2YWwgICAgICAgIC0gVGhhIGRhdGEgdG8gd3JpdGUuCisKKyAgIE9VVFBVVDoKKyAgICAgICAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBtYXBsZV9pMmNfd3JpdGVfd29yZCh1bnNpZ25lZCBjaGFyIGNsaWVudF9udW0sIHVuc2lnbmVkIGNoYXIgb2Zmc2V0LCB1bnNpZ25lZCBzaG9ydCB2YWwpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIG1hcGxlX2kyY19yZWFkX3dvcmQKKworICAgREVTQ1JJUFRJT046CisgICAgICAgUmVhZCAxNiBiaXQgd29yZCBmcm9tIEkyQyBkZXZpY2UKKworICAgUEFSQU1FVEVSUzoKKyAgICAgICBjbGllbnQgbnVtIC0gVGhlIGNsaWVudCB0byByZWFkIGZyb20uCisgICAgICAgb2Zmc2V0ICAgICAtIFRoZSBvZmZzZXQgdG8gcmVhZCBmcm9tLgorICAgICAgIGRhdGEgICAgICAgLSB0aGUgcmVhZCB2YWx1ZSBpcyB3cml0dGVuIHRvIHRoaXMgcG9pbnRlci4KKyAgIE9VVFBVVDoKKyAgICAgICAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBtYXBsZV9pMmNfcmVhZF93b3JkKHVuc2lnbmVkIGNoYXIgY2xpZW50X251bSwgdW5zaWduZWQgY2hhciBvZmZzZXQsIHVuc2lnbmVkIHNob3J0KiBkYXRhKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBtYXBsZV9pMmNfd3JpdGVfcmVnCisKKyAgIERFU0NSSVBUSU9OOgorICAgICAgIFdyaXRlIDMyIGJpdCByZWdpc3RlciB0byBJMkMgZGV2aWNlCisKKyAgIFBBUkFNRVRFUlM6CisgICAgICAgY2xpZW50IG51bSAtIFRoZSBjbGllbnQgdG8gd3JpdGUgdG8uCisgICAgICAgb2Zmc2V0ICAgICAtIFRoZSBvZmZzZXQgdG8gd3JpdGUgdG8uCisgICAgICAgdmFsICAgICAgICAtIFRoYSBkYXRhIHRvIHdyaXRlLgorCisgICBPVVRQVVQ6CisgICAgICAgMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgbWFwbGVfaTJjX3dyaXRlX3JlZyh1bnNpZ25lZCBjaGFyIGNsaWVudF9udW0sIHVuc2lnbmVkIGNoYXIgb2Zmc2V0LCBpbnQgdmFsKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBtYXBsZV9pMmNfcmVhZF9yZWcKKworICAgREVTQ1JJUFRJT046CisgICAgICAgUmVhZCAzMiBiaXQgd29yZCBmcm9tIEkyQyBkZXZpY2UKKworICAgUEFSQU1FVEVSUzoKKyAgICAgICBjbGllbnQgbnVtIC0gVGhlIGNsaWVudCB0byByZWFkIGZyb20uCisgICAgICAgb2Zmc2V0ICAgICAtIFRoZSBvZmZzZXQgdG8gcmVhZCBmcm9tLgorICAgICAgIGRhdGEgICAgICAgLSB0aGUgcmVhZCB2YWx1ZSBpcyB3cml0dGVuIHRvIHRoaXMgcG9pbnRlci4KKyAgIE9VVFBVVDoKKyAgICAgICAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBtYXBsZV9pMmNfcmVhZF9yZWcodW5zaWduZWQgY2hhciBjbGllbnRfbnVtLCB1bnNpZ25lZCBjaGFyIG9mZnNldCwgdW5zaWduZWQgaW50KiBkYXRhKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBtYXBsZV9pMmNfd3JpdGVfZnBnYQorCisgICBERVNDUklQVElPTjoKKyAgICAgICBXcml0ZSAzMiBiaXQgcmVnaXN0ZXIgdG8gSTJDIGZwZ2EgZGV2aWNlCisKKyAgIFBBUkFNRVRFUlM6CisgICAgICAgY2xpZW50IG51bSAtIFRoZSBjbGllbnQgdG8gd3JpdGUgdG8uCisgICAgICAgb2Zmc2V0ICAgICAtIFRoZSBvZmZzZXQgdG8gd3JpdGUgdG8uCisgICAgICAgdmFsICAgICAgICAtIFRoYSBkYXRhIHRvIHdyaXRlLgorCisgICBPVVRQVVQ6CisgICAgICAgMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgbWFwbGVfaTJjX3dyaXRlX2ZwZ2EodW5zaWduZWQgY2hhciBjbGllbnRfbnVtLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgdmFsKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBtYXBsZV9pMmNfcmVhZF9mcGdhCisKKyAgIERFU0NSSVBUSU9OOgorICAgICAgIFJlYWQgMzIgYml0IHdvcmQgZnJvbSBJMkMgZnBnYSBkZXZpY2UKKworICAgUEFSQU1FVEVSUzoKKyAgICAgICBjbGllbnQgbnVtIC0gVGhlIGNsaWVudCB0byByZWFkIGZyb20uCisgICAgICAgb2Zmc2V0ICAgICAtIFRoZSBvZmZzZXQgdG8gcmVhZCBmcm9tLgorICAgICAgIGRhdGEgICAgICAgLSB0aGUgcmVhZCB2YWx1ZSBpcyB3cml0dGVuIHRvIHRoaXMgcG9pbnRlci4KKyAgIE9VVFBVVDoKKyAgICAgICAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBtYXBsZV9pMmNfcmVhZF9mcGdhKHVuc2lnbmVkIGNoYXIgY2xpZW50X251bSwgdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50KiBkYXRhKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBtYXBsZV9pMmNfZ2V0X2NsaWVudAorCisgICBERVNDUklQVElPTjoKKyAgICAgICBHZXRzIGFuIEkyQyBjbGllbnQgbnVtYmVyIGZyb20gYW4gYWRkcmVzcworCisgICBQQVJBTUVURVJTOgorICAgICAgIGFkZHIgICAgICAgLSBUaGUgYWRkcmVzcyBvZiB0aGUgY2xpZW50LgorICAgT1VUUFVUOgorICAgICAgIFRoZSBjbGllbnQgbnVtYmVyIGZvciB0aGlzIGNsaWVudCwgb3IgU0xBVkVfTlVNX09GX1NMQVZFUyBvbiBmYWlsdXJlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitlbnVtIGNsaWVudF9udW0gbWFwbGVfaTJjX2dldF9jbGllbnQodW5zaWduZWQgaW50IGFkZHIpOworCisjZW5kaWYgICAvKiBfTUFQTEVfSTJDX0RFVlNfSF8gKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvaTJjL2JjbW9sdF9pMmNfZGV2c19hZGRyLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2kyYy9iY21vbHRfaTJjX2RldnNfYWRkci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxYTlhMmMKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2kyYy9iY21vbHRfaTJjX2RldnNfYWRkci5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgX0JDTU9MVF9JMkNfREVWU19BRERSX0hfCisjZGVmaW5lIF9CQ01PTFRfSTJDX0RFVlNfQUREUl9IXworCitCQ01fSTJDX0RFVl9BRERSX1NUQVJUCitCQ01fSTJDX0RFVl9BRERSKEkyQ19TVzBfSTJDX0FERFIsICJzdzAiLCAweDcwKQorQkNNX0kyQ19ERVZfQUREUihJMkNfU1cxX0kyQ19BRERSLCAic3cxIiwgMHg3MSkKK0JDTV9JMkNfREVWX0FERFIoSTJDX1NXMl9JMkNfQUREUiwgInN3MiIsIDB4NzIpCitCQ01fSTJDX0RFVl9BRERSKEkyQ19TVzNfSTJDX0FERFIsICJzdzMiLCAweDczKQorQkNNX0kyQ19ERVZfQUREUihJMkNfU1c0X0kyQ19BRERSLCAic3c0IiwgMHg3NCkKK0JDTV9JMkNfREVWX0FERFIoU0ZQX0kyQ19BRERSMSwgInNmcDEiLCAweDUwKQorQkNNX0kyQ19ERVZfQUREUihTRlBfSTJDX0FERFIyLCAic2ZwMiIsIDB4NTEpCitCQ01fSTJDX0RFVl9BRERSKEZQR0FfSTJDX0FERFIsICJmcGdhIiwgMHg0MCkKK0JDTV9JMkNfREVWX0FERFIoUE9OX0RQTExfSTJDX0FERFIsICJwb25fZHBsbCIsIDB4NjgpCitCQ01fSTJDX0RFVl9BRERSKFBNX0RQTExfSTJDX0FERFIsICJwbV9kcGxsIiwgMHg2YSkKK0JDTV9JMkNfREVWX0FERFIoQ1hQX1RfSTJDX0FERFIsICJjeHBfdCIsIDB4NTApCitCQ01fSTJDX0RFVl9BRERSKENYUF9SX0kyQ19BRERSLCAiY3hwX3IiLCAweDU0KQorQkNNX0kyQ19ERVZfQUREUihQQ0lFX1NXX0kyQ19BRERSLCAicGNpZV9zdyIsIDB4M2MpCitCQ01fSTJDX0RFVl9BRERSX0VORAorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9pMmMvYmNtb2x0X2kyY19kZXZzX2lvY3RsLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2kyYy9iY21vbHRfaTJjX2RldnNfaW9jdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTVmNzFhCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9pMmMvYmNtb2x0X2kyY19kZXZzX2lvY3RsLmgKQEAgLTAsMCArMSwyNCBAQAorI2lmbmRlZiBfQkNNT0xUX0kyQ19ERVZTX0lPQ1RMX0hfCisjZGVmaW5lIF9CQ01PTFRfSTJDX0RFVlNfSU9DVExfSF8KKworI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDMyX3QgY291bnQ7CisgICAgdWludDMyX3QgYWRkcjsKKyAgICB1aW50MzJfdCB2YWw7Cit9IG1hcGxlX2kyY19pb2N0bF9wYXJhbTsKKworI2RlZmluZSBNQVBMRV9JMkNfSU9DVExfTUFHSUMgJ0knCisKKyNkZWZpbmUgTUFQTEVfSTJDX0lPQ1RMX09QX0RFVl9DSEFOR0UgX0lPVyhNQVBMRV9JMkNfSU9DVExfTUFHSUMsIDEsIG1hcGxlX2kyY19pb2N0bF9wYXJhbSkKKyNkZWZpbmUgTUFQTEVfSTJDX0lPQ1RMX09QX0RFVl9XUklURSBfSU9XKE1BUExFX0kyQ19JT0NUTF9NQUdJQywgMiwgbWFwbGVfaTJjX2lvY3RsX3BhcmFtKQorI2RlZmluZSBNQVBMRV9JMkNfSU9DVExfT1BfREVWX1JFQUQgX0lPV1IoTUFQTEVfSTJDX0lPQ1RMX01BR0lDLCAzLCBtYXBsZV9pMmNfaW9jdGxfcGFyYW0pCisjZGVmaW5lIE1BUExFX0kyQ19JT0NUTF9PUF9TV0lUQ0hfV1JJVEUgX0lPVyhNQVBMRV9JMkNfSU9DVExfTUFHSUMsIDQsIG1hcGxlX2kyY19pb2N0bF9wYXJhbSkKKyNkZWZpbmUgTUFQTEVfSTJDX0lPQ1RMX09QX1NXSVRDSF9SRUFEIF9JT1IoTUFQTEVfSTJDX0lPQ1RMX01BR0lDLCA1LCBtYXBsZV9pMmNfaW9jdGxfcGFyYW0pCisjZGVmaW5lIE1BUExFX0kyQ19JT0NUTF9PUF9GUEdBX1dSSVRFIF9JT1coTUFQTEVfSTJDX0lPQ1RMX01BR0lDLCA2LCBtYXBsZV9pMmNfaW9jdGxfcGFyYW0pCisjZGVmaW5lIE1BUExFX0kyQ19JT0NUTF9PUF9GUEdBX1JFQUQgX0lPV1IoTUFQTEVfSTJDX0lPQ1RMX01BR0lDLCA3LCBtYXBsZV9pMmNfaW9jdGxfcGFyYW0pCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2xsX3BjaWUvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2xsX3BjaWUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGI3YWE3ZAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvbGxfcGNpZS9NYWtlZmlsZQpAQCAtMCwwICsxLDM2IEBACitNT0RfTkFNRSA9IGxsX3BjaWUKK01PRF9TVVBQUkVTU19PU19ERVAgPSB5CitNT0RfREVQUyA9IGJvYXJkX3NlbGVjdG9yCisKK2lmZXEgKCIkKFJFTEVBU0VfQlVJTEQpIiwgInkiKQorCUVYVFJBX0NGTEFHUyArPSAtSSQoU1JDX0RJUikgLUkkKFRPUF9ESVIpL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbiAKKwlFWFRSQV9DRkxBR1MgKz0gLUkkKFRPUF9ESVIpL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9saW51eCAtSSQoVE9QX0RJUikvaG9zdF9kcml2ZXIvY29uZmlnCitlbHNlCisJRVhUUkFfQ0ZMQUdTICs9IC1JJChTUkNfRElSKSAtSSQoVE9QX0RJUikvY29tbW9uL29zX2Fic3RyYWN0aW9uIC1JJChUT1BfRElSKS9ob3N0L2NvbmZpZworCUVYVFJBX0NGTEFHUyArPSAtSSQoVE9QX0RJUikvY29tbW9uL29zX2Fic3RyYWN0aW9uL2xpbnV4IC1JJChUT1BfRElSKS9ob3N0L29zX2Fic3RyYWN0aW9uLyQoUExBVEZPUk0pCitlbmRpZgorCitpZmVxICgiJChFTkFCTEVfVFJBQ0UpIiwgInkiKQorCU1PRF9ERUZTICs9IC1EVFhfRU5BQkxFX0VWRU5UX1RSQUNFCisJRVhUUkFfQ0ZMQUdTICs9IC1JJChUT1BfRElSKS9jb21tb24vZHJpdmVycy9tYXBsZS9mbGQKKyAgICBpZmVxICgiJChERUJVR19UUkFDRV9JTklUKSIsICJ5IikKKyAgICAgICBNT0RfREVGUyArPSAtRERFQlVHX1RSQUNFX0lOSVQKKyAgICBlbmRpZgorZW5kaWYKKworaWZlcSAoIiQoT1NfS0VSTkVMKSIsICJsaW51eCIpCisgICAgTU9EX1RZUEUgPSBsaW51eF9tb2R1bGUKKyAgICBzcmNzID0gYmNtb2x0X2xscGNpZS5jIAorZWxzZQorICAgIE1PRF9UWVBFID0gbGliCitlbmRpZgorCisjIElmIGNhbGxlZCBieSBsaW51eCBrZXJuZWwgYnVpbGRlciAtIGFkZCBpbmNsdWRlIHBhdGhzIG1hbnVhbGx5LgorIyBJdCBpcyBub3QgZWxlZ2FudCwgYnV0IHdlJ2xsIG5vdCBoYXZlIG1hbnkgbGludXggbW9kdWxlcworaWZuZXEgKCIkKEtCVUlMRF9TUkMpIiwgIiIpCisJLWluY2x1ZGUgJChPVVRfRElSX0JBU0UpL01ha2VmaWxlLmNvbmZpZy4kKE1PRF9OQU1FKQorZW5kaWYKKworVVNFX0xJTlQgPSB5ZXMKKworCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2xsX3BjaWUvYmNtb2x0X2xscGNpZS5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9sbF9wY2llL2JjbW9sdF9sbHBjaWUuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40YmIxNTA3Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9sbF9wY2llL2JjbW9sdF9sbHBjaWUuYwpAQCAtMCwwICsxLDEwMTAgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKy8qCisgICAgbWlnaHQgdXNlIHJlYWRsIG9yIGlvcmVhZDMyCisqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcGNpX3JlZ3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpZmRlZiBUWF9FTkFCTEVfRVZFTlRfVFJBQ0UKKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgImJjbV9mbGRfY29tbW9uLmgiCisjZW5kaWYKKyNpbmNsdWRlIDxiY21vbHRfYm9hcmRfc2VsZWN0b3IuaD4KKyNpbmNsdWRlICJiY21vbHRfbGxwY2llLmgiCisKKyNkZWZpbmUgRFJWX05BTUUJIm1hcGxlIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMS4wLjMiCisKKyNkZWZpbmUgQkFSX1JFR1MgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEJBUl9ERFIgICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBCQVJfU1JBTSAgICAgICAgICAgICAgICAgICAgICAgIDQKKy8qCitiYXIgMSA9IDggIE1ieXRlIHJlZ2lzdGVyIHNwYWNlCitiYXIgMiA9IDE2IE1ieXRlIEREUiBzcGFjZQorYmFyIDMgPSA2NCBLYnl0ZSBTUkFNIHNwYWNlCisqLworI2RlZmluZSBNQVBMRV9SRUdTX0xFTkdUSCAgICAgICAgICAgICAgICAgICAweDAwODAwMDAwCisjZGVmaW5lIE1BUExFX0REUl9MRU5HVEggICAgICAgICAgICAgICAgICAgIDB4MDEwMDAwMDAKKyNkZWZpbmUgTUFQTEVfU1JBTV9MRU5HVEggICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAorCisjaWZkZWYgVFhfRU5BQkxFX0VWRU5UX1RSQUNFCisjZGVmaW5lIFBDSUVfUENJRV8wX01JU0NfQ1BVXzJfUENJRV9NRU1fV0lOMV9MTwkJCTB4MDY0MDE0VQorI2RlZmluZSBQQ0lFX1BDSUVfMF9NSVNDX0NQVV8yX1BDSUVfTUVNX1dJTjFfSEkJCQkweDA2NDAxOFUKKyNkZWZpbmUgUENJRV9QQ0lFXzBfTUlTQ19DUFVfMl9QQ0lFX01FTV9XSU4xX0JBU0VfTElNSVQJMHgwNjQwNzRVCisjZW5kaWYKKyNkZWZpbmUgUENJRV9SRVZJU0lPTl9SRUdJU1RFUl9PRkZTRVQgICAgICAgMHg2NDA2Q1UgLyogUENJRV9QQ0lFX1BDSUVfMF9QQ0lFX1BDSUVfMF9NSVNDX1JFVklTSU9OICAgICovCisjZGVmaW5lIFBDSUVfU1RBVFVTX1JFR0lTVEVSX09GRlNFVCAgICAgICAgIDB4NjQwNjhVIC8qIFBDSUVfUENJRV9QQ0lFXzBfUENJRV9QQ0lFXzBfTUlTQ19QQ0lFX1NUQVRVUyAqLworI2RlZmluZSBQQ0lFX0hBUkRfREVCVUdfUkVHSVNURVJfT0ZGU0VUICAgICAweDY0MjA0VSAvKiBQQ0lFX1BDSUVfUENJRV8wX1BDSUVfUENJRV8wX01JU0NfSEFSRF9ERUJVRyAgKi8KKyNkZWZpbmUgUENJRV9JTlRfU1RBVFVTX1JFR0lTVEVSX09GRlNFVCAgICAgMHg2OTQwMFUgLyogUENJRV9QQ0lFX1BDSUVfMF9DUFVfSU5UUjFfSU5UUl9TVEFUVVMgICAgICAgICovCisjZGVmaW5lIFBDSUVfSU5UX0NMRUFSX01BU0tfT0ZGU0VUICAgICAgICAgIDB4Njk0MENVIC8qIFBDSUVfUENJRV9QQ0lFXzBfQ1BVX0lOVFIxX0lOVFJfTUFTS19DTEVBUiAgICAqLworI2RlZmluZSBQQ0lFX0lOVFIxX1NUQVRVU19SRUdJU1RFUl9PRkZTRVQgICAweDY5MzAwVSAvKiBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgUENJRV9NQVBMRV9WRU5ET1JfSUQgICAgICAgICAgICAgICAgMHgxNEU0IC8qIFBDSUVfQ0ZHX1RZUEUwX0VQX1NVQlNZU1RFTV9JRF9WRU5ET1JfSUQgICAgICAqLworI2RlZmluZSBQQ0lFX01BUExFX0RFVklDRV9JRCAgICAgICAgICAgICAgICAweDY4NjIKKyNkZWZpbmUgUENJRV9NQVBMRV82ODYzX1NLVV9ERVZJQ0VfSUQgICAgICAgMHg2ODYzCisjZGVmaW5lIFBDSUVfTUFQTEVfRVBPTl9ERVZJQ0VfSUQgICAgICAgICAgIDB4NTU1NAorCisjZGVmaW5lIE1BUExFX0RSSVZFUl9OQU1FICAgRFJWX05BTUUgIiBCQ002ODYyMCAoTWFwbGUpIFBDSSBkcml2ZXIgIiBEUlZfVkVSU0lPTgorCitzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmJjbW9sdF9kaXIgPSBOVUxMOworc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKG1hcGxlX3BjaV90YmwpID0KK3sgLyogdmVuZG9yX2lkLCAgICAgICAgICAgICAgICAgIGRldmljZV9pZCwgICAgICAgYW55LCAgICAgICBhbnkgKi8KKyAgICB7UENJX0RFVklDRShQQ0lFX01BUExFX1ZFTkRPUl9JRCwgUENJRV9NQVBMRV9ERVZJQ0VfSUQpfSwKKyAgICB7UENJX0RFVklDRShQQ0lFX01BUExFX1ZFTkRPUl9JRCwgUENJRV9NQVBMRV82ODYzX1NLVV9ERVZJQ0VfSUQpfSwKKyAgICB7UENJX0RFVklDRShQQ0lFX01BUExFX1ZFTkRPUl9JRCwgUENJRV9NQVBMRV9FUE9OX0RFVklDRV9JRCl9LAorICAgIHswfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUgKHBjaSwgbWFwbGVfcGNpX3RibCk7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgYmNtX2xsX2Rldl9pbmZvICBkZXZpY2U7CisgICAgc3BpbmxvY2tfdCAgICAgICBsb2NrOworICAgIGludCAgICAgICAgICAgICAgZXJyX3N0YXR1czsKKyAgICBpbnQgICAgICAgICAgICAgIHBoeWxpbms7CisgICAgaW50ICAgICAgICAgICAgICBwcmV2X2RhdGFsaW5rOworICAgIGludCAgICAgICAgICAgICAgZGF0YWxpbms7CisgICAgdWludDMyX3QgICAgICAgICBkZXZpY2VpZDsKKyAgICB1bnNpZ25lZCBpbnQgICAgKnRyYWNlYWRkcjsKKyAgICBzdHJ1Y3QgcGNpX2RldiAgKnBkZXY7CisgICAgaW50ICAgICAgICAgICAgICBlbmFibGVkOworfSBtYXBsZV9kZXZpY2VfaW5mbzsKKworc3RhdGljIGludCBjcnRfZGV2aWNlID0gMDsKK3N0YXRpYyBiY21fbGxfcGNpZV9zdGF0dXNfY2hhbmdlIGNhbGxiYWNrOworc3RhdGljIGJjbW9zX2Jvb2wgaXNfaW5pdGlhbGl6ZWQgPSBCQ01PU19GQUxTRTsKKworc3RhdGljIG1hcGxlX2RldmljZV9pbmZvIGRldmljZXNbTUFQTEVfTUFYX0RFVklDRVNdOworLy9zdGF0aWMgaXJxcmV0dXJuX3QgbWFwbGVfaW50ZXJydXB0IChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpOworc3RhdGljIG1hcGxlX2RldmljZV9pbmZvICpnZXRfbWFwbGVfcGNpX2luZm8oaW50IGNydCk7CisKK3N0YXRpYyBpbnQgbWFwbGVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsY29uc3QgY2hhciAqYnVmZmVyLHNpemVfdCBjb3VudCwgdm9pZCAqZGF0YSk7CitzdGF0aWMgaW50IG1hcGxlX3JlYWQoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpOworCisvKiBNYXAgYnVzL2RldmljZSB0byBkZXZpY2VfaWQgKi8KK3N0YXRpYyBpbnQgX3BjaWVfYnVzX2RldmZ2X3RvX2RldmlkKGludCBidXMsIGludCBkZXZmbikKK3sKKyAgICBjb25zdCBidXNfZGV2Zm5fZGV2aWQgKm1hcDsKKyAgICBmb3IgKG1hcCA9IGJjbW9sdF9ib2FyZF9wY2lfbWFwX3RhYmxlX2dldCgpOyBtYXAgJiYgbWFwLT5idXMgPiAwOyBtYXArKykKKyAgICB7CisgICAgICAgIGlmIChtYXAtPmJ1cyA9PSBidXMgJiYgbWFwLT5kZXZmbiA9PSBkZXZmbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1hcC0+ZGV2aWNlOworICAgICAgICB9CisgICAgfQorICAgIC8qIE5vdCBmb3VuZCAtIHVzZSBpbmNyZW1lbnRhbCBtYXBwaW5nICovCisgICAgcmV0dXJuIGNydF9kZXZpY2U7Cit9CisKKy8qIHByb2NlZHVyZSB1c2VkIGJ5IE9TIHRvIGNvbm5lY3QgTWFwbGUgUENJIHRvIGFsbG9jYXRlZCBtZW1vcnkgKi8KKworc3RhdGljIGludCBfX2RldmluaXQgbWFwbGVfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworICAgIGludCByYzsKKyAgICB2b2xhdGlsZSB1bnNpZ25lZCBpbnQgcmVhZHZhbDsKKyAgICBtYXBsZV9kZXZpY2VfaW5mbyAqZGV2aWNlX2luZm8gPSBOVUxMOworICAgIGludCBkZXZfaWQ7CisgICAgdTMyIHZhbDsKKworICAgIGlmICghcGRldikKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICBkZXZfaW5mbygmcGRldi0+ZGV2LAorICAgICAgICAiQnVzID0gJWQgU2xvdCA9ICVkIFZlbmRvcjpkZXZpY2UgPSAweCUwNHg6MHglMDR4IHJldmlzaW9uID0gMHglMDJ4XG4iLAorICAgICAgICBwZGV2LT5idXMtPm51bWJlciwgcGRldi0+ZGV2Zm4sCisgICAgICAgIHBkZXYtPnZlbmRvciwgcGRldi0+ZGV2aWNlLCBwZGV2LT5yZXZpc2lvbik7CisKKyAgICBpZiAoY3J0X2RldmljZSA9PSBNQVBMRV9NQVhfREVWSUNFUykKKyAgICB7CisgICAgICAgIHByaW50aygiIE1heGltdW0gTWFwbGUgZGV2aWNlcyBhbHJlYWR5IGRlZmluZWQgKCVkKVxuIiwgTUFQTEVfTUFYX0RFVklDRVMpOworICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICB9CisKKyAgICBkZXZfaWQgPSBfcGNpZV9idXNfZGV2ZnZfdG9fZGV2aWQocGRldi0+YnVzLT5udW1iZXIsIHBkZXYtPmRldmZuKTsKKyAgICArK2NydF9kZXZpY2U7CisgICAgZGV2aWNlX2luZm8gPSAmZGV2aWNlc1tkZXZfaWRdOworICAgIG1lbXNldChkZXZpY2VfaW5mbywgMCwgc2l6ZW9mKG1hcGxlX2RldmljZV9pbmZvKSk7CisKKyAgICBzcGluX2xvY2tfaW5pdCgmZGV2aWNlX2luZm8tPmxvY2spOworICAgIGRldmljZV9pbmZvLT5kZXZpY2VpZCA9IGRldl9pZDsKKyAgICBkZXZpY2VfaW5mby0+cGRldiA9IHBkZXY7CisKKyAgICAvKiBFbmFibGUgbWFwbGUgZGV2aWNlIG9uIFBDSWUgYnVzIGFuZCBmaXh1cCBCQVJzLgorICAgICAqIFdpdGhvdXQgZml4dXAsIG1vZHVsZSB1bmxvYWQvcmVsb2FkIGNyYXNoZXMgd2l0aCBXUlggaG9zdAorICAgICAqIGJlY2F1c2UgUENJIGhvdHBsdWcgZG9lc24ndCB3b3JrIGFuZCBhZnRlciB1bmxvYWQvcmUtbG9hZAorICAgICAqIGxpbnV4IGJlbGlldmVzIHRoYXQgQkFScyBhcmUgYWxyZWFkeSBzZXQuCisgICAgICovCisgICAgcmMgPSBiY21fbGxfcGNpZV9kZXZfZW5hYmxlKGRldl9pZCk7CisgICAgaWYgKHJjKQorICAgIHsKKyAgICAgICAgcHJpbnRrKCJFcnJvciBwY2lfZW5hYmxlX2RldmljZV9tZW0gPSAlZFxuIixyYyk7CisgICAgICAgIGdvdG8gZXJyX291dDsKKyAgICB9CisKKyAgICByYyA9IHBjaV9yZXF1ZXN0X3NlbGVjdGVkX3JlZ2lvbnMocGRldiwgcGNpX3NlbGVjdF9iYXJzKHBkZXYsIElPUkVTT1VSQ0VfTUVNKSwgRFJWX05BTUUpOworICAgIGlmIChyYykKKyAgICAgICAgZ290byBlcnJfb3V0OworCisgICAgcGNpX3NldF9tYXN0ZXIocGRldik7CisgICAgcGNpX3NhdmVfc3RhdGUocGRldik7CisKKyAgICBkZXZpY2VfaW5mby0+ZGV2aWNlLnNvY19yZWdzX2Jhc2UgPSAodW5zaWduZWQgbG9uZylwY2lfaW9yZW1hcF9iYXIocGRldiwgQkFSX1JFR1MpOworICAgIGRldmljZV9pbmZvLT5kZXZpY2Uuc29jX3NyYW1fYmFzZSA9ICh1bnNpZ25lZCBsb25nKXBjaV9pb3JlbWFwX2JhcihwZGV2LCBCQVJfU1JBTSk7CisgICAgZGV2aWNlX2luZm8tPmRldmljZS5zb2NfZGRyX2Jhc2UgPSAodW5zaWduZWQgbG9uZylwY2lfaW9yZW1hcF9iYXIocGRldiwgQkFSX0REUik7CisgICAgZGV2aWNlX2luZm8tPmRldmljZS5zb2NfZGRyX2xlbmd0aCA9ICh1aW50MzJfdClwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIEJBUl9ERFIpOworICAgIGRldmljZV9pbmZvLT5kZXZpY2UuaXJxID0gcGRldi0+aXJxOworICAgIHBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXZpY2VfaW5mbyk7CisKKyAgICAvL3JjID0gcmVxdWVzdF9pcnEoZGV2aWNlX2luZm8tPmRldmljZS5pcnEsIG1hcGxlX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsICJtYXBsZS1wY2llIiwgZGV2aWNlX2luZm8pOworICAgIGlmICghcmMgJiYgZGV2aWNlX2luZm8tPmRldmljZS5zb2Nfc3JhbV9iYXNlKQorICAgIHsKKyAgICAgICAgZGV2aWNlX2luZm8tPmRldmljZS5pcnFfY29ubmVjdGVkID0gMTsKKyAgICAgICAgcmVhZHZhbCA9IGJjbV9wY2lfcmVhZDMyKCh1aW50MzJfdCAqKShkZXZpY2VfaW5mby0+ZGV2aWNlLnNvY19yZWdzX2Jhc2UgKyBQQ0lFX1JFVklTSU9OX1JFR0lTVEVSX09GRlNFVCkpOworICAgICAgICBwcmludGsoIkNhcmQgJWQgdmVyc2lvbiBtYWpvcj0lMDJ4IG1pbm9yPSUwMnhcbiIsZGV2aWNlX2luZm8tPmRldmljZWlkLAorICAgICAgICAgICAgICAgKChyZWFkdmFsICYgMHgwMDAwZmYwMCkgPj4gOCksKHJlYWR2YWwgJiAweDAwMDAwMGZmKSk7CisgICAgICAgIHByaW50aygicmVnc19zdGFydCA9IDB4JWx4XG5kZHJfc3RhcnQgID0gMHglbHhcbnNyYW1fc3RhcnQgPSAweCVseFxuZGRyX2xlbmd0aCAgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgZGV2aWNlX2luZm8tPmRldmljZS5zb2NfcmVnc19iYXNlLGRldmljZV9pbmZvLT5kZXZpY2Uuc29jX2Rkcl9iYXNlLAorICAgICAgICAgICAgICAgICBkZXZpY2VfaW5mby0+ZGV2aWNlLnNvY19zcmFtX2Jhc2UsIChpbnQpZGV2aWNlX2luZm8tPmRldmljZS5zb2NfZGRyX2xlbmd0aCk7CisgICAgICAgIHBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LFBDSV9CQVNFX0FERFJFU1NfMCwmdmFsKTsKKyAgICAgICAgcHJpbnRrKCJCQVIgUkVHUyA9IDB4JXhcbiIsKHVuc2lnbmVkIGludCl2YWwpOworICAgICAgICBwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldixQQ0lfQkFTRV9BRERSRVNTXzIsJnZhbCk7CisgICAgICAgIHByaW50aygiQkFSIEREUiA9IDB4JXhcbiIsKHVuc2lnbmVkIGludCl2YWwpOworICAgICAgICBwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldixQQ0lfQkFTRV9BRERSRVNTXzQsJnZhbCk7CisgICAgICAgIHByaW50aygiQkFSIFNSQU0gPSAweCV4XG4iLCh1bnNpZ25lZCBpbnQpdmFsKTsKKyAgICAgICAgcmVhZHZhbCA9IGJjbV9wY2lfcmVhZDMyKCh1aW50MzJfdCAqKShkZXZpY2VfaW5mby0+ZGV2aWNlLnNvY19yZWdzX2Jhc2UgKyBQQ0lFX1NUQVRVU19SRUdJU1RFUl9PRkZTRVQpKTsKKyAgICAgICAgZGV2aWNlX2luZm8tPmVycl9zdGF0dXMgPSByZWFkdmFsICYgMHgwMDAwMDAwZjsKKyAgICAgICAgZGV2aWNlX2luZm8tPnBoeWxpbmsgICAgPSAocmVhZHZhbCA+PiA0KSAmIDB4MTsKKyAgICAgICAgZGV2aWNlX2luZm8tPmRhdGFsaW5rICAgPSAocmVhZHZhbCA+PiA1KSAmIDB4MTsKKyAgICAgICAgZGV2aWNlX2luZm8tPnByZXZfZGF0YWxpbmsgID0gZGV2aWNlX2luZm8tPmRhdGFsaW5rOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGdvdG8gZXJyX291dDsKKworICAgIHJldHVybiByYzsKKworZXJyX291dDoKKyAgICBwY2lfZGlzYWJsZV9kZXZpY2UgKHBkZXYpOworICAgIG1lbXNldChkZXZpY2VfaW5mbywgMCwgc2l6ZW9mKCpkZXZpY2VfaW5mbykpOworICAgIC0tY3J0X2RldmljZTsKKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IG1hcGxlX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisgICAgaW50IGk7CisgICAgbWFwbGVfZGV2aWNlX2luZm8gKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworICAgIGlmICghZGV2KQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoZGV2LT5kZXZpY2UuaXJxX2Nvbm5lY3RlZCkKKyAgICB7CisgICAgICAgIC8vZnJlZV9pcnEoZGV2LT5kZXZpY2UuaXJxLCBkZXYpOworICAgICAgICBkZXYtPmRldmljZS5pcnFfY29ubmVjdGVkID0gMDsKKyAgICB9CisgICAgaWYgKGNhbGxiYWNrKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNydF9kZXZpY2U7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGRldmljZXNbaV0ucGRldiA9PSBwZGV2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhbGxiYWNrKGksIEJDTV9MTF9QQ0lFX0xJTktfRE9XTik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworICAgIHBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisgICAgcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworICAgIGRldi0+ZGV2aWNlLnNvY19zcmFtX2Jhc2UgPSAwOworICAgIGRldi0+ZGV2aWNlLnNvY19yZWdzX2Jhc2UgPSAwOworICAgIGRldi0+cGRldiA9IE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBtYXBsZV9wY2lfZHJpdmVyID0geworICAgIC5uYW1lICAgICAgID0gRFJWX05BTUUsCisgICAgLmlkX3RhYmxlICAgPSBtYXBsZV9wY2lfdGJsLAorICAgIC5wcm9iZSAgICAgID0gbWFwbGVfcGNpX3Byb2JlLAorICAgIC5yZW1vdmUgICAgID0gX19kZXZleGl0X3AobWFwbGVfcGNpX3JlbW92ZSksCit9OworCitzdGF0aWMgbWFwbGVfZGV2aWNlX2luZm8gKmdldF9tYXBsZV9wY2lfaW5mbyhpbnQgY3J0KQoreworICAgIHVuc2lnbmVkIGludCByZWFkdmFsPTA7CisgICAgbWFwbGVfZGV2aWNlX2luZm8gKmRldmljZTsKKworICAgIGlmIChjcnQgPj0gQkNNVFJfTUFYX09MVFMpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgZGV2aWNlID0gJmRldmljZXNbY3J0XTsKKyAgICBpZiAoZGV2aWNlLT5kZXZpY2Uuc29jX3JlZ3NfYmFzZSkKKyAgICB7CisgICAgICAgIGlmIChkZXZpY2UtPmVuYWJsZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlYWR2YWwgPSBiY21fcGNpX3JlYWQzMigodWludDMyX3QgKikoZGV2aWNlLT5kZXZpY2Uuc29jX3JlZ3NfYmFzZSArIFBDSUVfU1RBVFVTX1JFR0lTVEVSX09GRlNFVCkpOworICAgICAgICAgICAgZGV2aWNlLT5lcnJfc3RhdHVzID0gcmVhZHZhbCAmIDB4MDAwMDAwMGY7CisgICAgICAgICAgICBkZXZpY2UtPnBoeWxpbmsgICAgPSAocmVhZHZhbCA+PiA0KSAmIDB4MTsKKyAgICAgICAgICAgIGRldmljZS0+ZGF0YWxpbmsgICA9IChyZWFkdmFsID4+IDUpICYgMHgxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZGV2aWNlLT5lcnJfc3RhdHVzID0gMDsKKyAgICAgICAgICAgIGRldmljZS0+cGh5bGluayAgICA9IDA7CisgICAgICAgICAgICBkZXZpY2UtPmRhdGFsaW5rICAgPSAwOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgZGV2aWNlID0gTlVMTDsKKworICAgIHJldHVybiBkZXZpY2U7Cit9CisKKyNpZiAwCitzdGF0aWMgaXJxcmV0dXJuX3QgbWFwbGVfaW50ZXJydXB0IChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpCit7CisgICAgdm9sYXRpbGUgdW5zaWduZWQgaW50IHZhbHVlOworICAgIG1hcGxlX2RldmljZV9pbmZvICpkZXZpY2VfaW5mbzsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIGludCBoYW5kbGVkID0gSVJRX05PTkU7CisgICAgdWludDMyX3QgZGV2aWNlOworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZV9pbmZvLT5sb2NrLCBmbGFncyk7CisgICAgdmFsdWUgPSBiY21fcGNpX3JlYWQzMigodWludDMyX3QgKikoZGV2aWNlX2luZm8tPmRldmljZS5zb2NfcmVnc19iYXNlICsgUENJRV9JTlRfU1RBVFVTX1JFR0lTVEVSX09GRlNFVCkpOworICAgIGlmICh2YWx1ZSkKKyAgICB7CisgICAgICAgIGlmIChkZXZpY2VfaW5mby0+ZGF0YWxpbmsgIT0gZGV2aWNlX2luZm8tPnByZXZfZGF0YWxpbmspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChkZXZpY2VfaW5mby0+ZGF0YWxpbmsgPT0gQkNNX0xMX1BDSUVfTElOS19VUCkKKyAgICAgICAgICAgICAgICBwcmludGsoIkRldmljZT0lZCA6IExpbmsgaXMgdXAgISEhXG4iLCBkZXZpY2UpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50aygiRGV2aWNlPSVkIDogTGluayBpcyBkb3duICEhIVxuIiwgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICBwcmludGsoInBoeSBzdGF0dXMgPSAweCV4IGVycm9yIHN0YXR1cyA9IDB4JXhcbiIsIGRldmljZV9pbmZvLT5waHlsaW5rLCBkZXZpY2VfaW5mby0+ZXJyX3N0YXR1cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXZpY2VfaW5mby0+cHJldl9kYXRhbGluayA9IGRldmljZV9pbmZvLT5kYXRhbGluazsKKyAgICAgICAgICAgIGlmIChjYWxsYmFjaykKKyAgICAgICAgICAgICAgICBjYWxsYmFjayhkZXZpY2UsIGRldmljZV9pbmZvLT5kYXRhbGluayk7CisgICAgICAgIH0KKyAgICAgICAgdmFsdWUgPSBiY21fcGNpX3JlYWQzMigodWludDMyX3QgKikoZGV2aWNlX2luZm8tPmRldmljZS5zb2NfcmVnc19iYXNlICsgUENJRV9JTlRSMV9TVEFUVVNfUkVHSVNURVJfT0ZGU0VUKSk7CisgICAgICAgIGlmICghdmFsdWUpCisgICAgICAgICAgICBoYW5kbGVkID0gSVJRX0hBTkRMRUQ7CisgICAgfQorICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmljZV9pbmZvLT5sb2NrLCBmbGFncyk7CisKKyAgICByZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKyNlbmRpZgorCisvKiBSZXR1cm5zIEJBUiByZWdpc3RlciBhZGRyZXNzICovCitzdGF0aWMgaW50IF9wY2lfYmFyX3JlZ19hZGRyKGludCByZXMpCit7CisgICAgcmV0dXJuIDB4MTAgKyByZXMqNDsKK30KKworc3RhdGljIHZvaWQgX3BjaV91cGRhdGVfcmVzb3VyY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHJlc25vKQoreworICAgICAgICBzdHJ1Y3QgcGNpX2J1c19yZWdpb24gcmVnaW9uOworICAgICAgICB1MTYgY21kOworICAgICAgICB1MzIgbmV3LCBjaGVjaywgbWFzazsKKyAgICAgICAgaW50IHJlZzsKKyAgICAgICAgc3RydWN0IHJlc291cmNlICpyZXMgPSBkZXYtPnJlc291cmNlICsgcmVzbm87CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSWdub3JlIHJlc291cmNlcyBmb3IgdW5pbXBsZW1lbnRlZCBCQVJzIGFuZCB1bnVzZWQgcmVzb3VyY2Ugc2xvdHMKKyAgICAgICAgICogZm9yIDY0IGJpdCBCQVJzLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCFyZXMtPmZsYWdzKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvKgorICAgICAgICAgKiBJZ25vcmUgbm9uLW1vdmVhYmxlIHJlc291cmNlcy4gIFRoaXMgbWlnaHQgYmUgbGVnYWN5IHJlc291cmNlcyBmb3IKKyAgICAgICAgICogd2hpY2ggbm8gZnVuY3Rpb25hbCBCQVIgcmVnaXN0ZXIgZXhpc3RzIG9yIGFub3RoZXIgaW1wb3J0YW50CisgICAgICAgICAqIHN5c3RlbSByZXNvdXJjZSB3ZSBzaG91bGRuJ3QgbW92ZSBhcm91bmQuCisgICAgICAgICAqLworICAgICAgICBpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfUENJX0ZJWEVEKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBwY2liaW9zX3Jlc291cmNlX3RvX2J1cyhkZXYsICZyZWdpb24sIHJlcyk7CisKKyAgICAgICAgbmV3ID0gcmVnaW9uLnN0YXJ0IHwgKHJlcy0+ZmxhZ3MgJiBQQ0lfUkVHSU9OX0ZMQUdfTUFTSyk7CisgICAgICAgIGlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9JTykKKyAgICAgICAgICAgICAgICBtYXNrID0gKHUzMilQQ0lfQkFTRV9BRERSRVNTX0lPX01BU0s7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtYXNrID0gKHUzMilQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLOworCisgICAgICAgIHJlZyA9IF9wY2lfYmFyX3JlZ19hZGRyKHJlc25vKTsKKworICAgICAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgcmVnLCBuZXcpOworICAgICAgICBwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCByZWcsICZjaGVjayk7CisKKyAgICAgICAgaWYgKChuZXcgXiBjaGVjaykgJiBtYXNrKSB7CisgICAgICAgICAgICAgICAgZGV2X2VycigmZGV2LT5kZXYsICJCQVIgJWQ6IGVycm9yIHVwZGF0aW5nICglIzA4eCAhPSAlIzA4eClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICByZXNubywgbmV3LCBjaGVjayk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNXzY0KSB7CisgICAgICAgICAgICAgICAgbmV3ID0gcmVnaW9uLnN0YXJ0ID4+IDE2ID4+IDE2OworICAgICAgICAgICAgICAgIHBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCByZWcgKyA0LCBuZXcpOworICAgICAgICAgICAgICAgIHBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIHJlZyArIDQsICZjaGVjayk7CisgICAgICAgICAgICAgICAgaWYgKGNoZWNrICE9IG5ldykgeworICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2VycigmZGV2LT5kZXYsICJCQVIgJWQ6IGVycm9yIHVwZGF0aW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKGhpZ2ggJSMwOHggIT0gJSMwOHgpXG4iLCByZXNubywgbmV3LCBjaGVjayk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgJmNtZCk7CisgICAgICAgIHBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCBjbWQgfCBQQ0lfQ09NTUFORF9NRU1PUlkgfCBQQ0lfQ09NTUFORF9NQVNURVIpOworCisgICAgICAgIHJlcy0+ZmxhZ3MgJj0gfklPUkVTT1VSQ0VfVU5TRVQ7CisgICAgICAgIGRldl9pbmZvKCZkZXYtPmRldiwgIkJBUiAlZDogc2V0IHRvICVwUiAoUENJIGFkZHJlc3MgWyUjbGx4LSUjbGx4XSlcbiIsCisgICAgICAgICAgICAgICAgcmVzbm8sIHJlcywgKHVuc2lnbmVkIGxvbmcgbG9uZylyZWdpb24uc3RhcnQsCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylyZWdpb24uZW5kKTsKK30KKworLyogRW5hYmxlIFBDSSBhY2Nlc3MgdG8gZGV2aWNlICovCitiY21vc19lcnJubyBiY21fbGxfcGNpZV9kZXZfZW5hYmxlKGludCBkZXZfaWQpCit7CisgICAgbWFwbGVfZGV2aWNlX2luZm8gKmRldmljZTsKKyAgICBpbnQgcmM7CisKKyAgICBpZiAoZGV2X2lkID49IE1BUExFX01BWF9ERVZJQ0VTKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworCisgICAgZGV2aWNlID0gJmRldmljZXNbZGV2X2lkXTsKKyAgICBpZiAoIWRldmljZS0+cGRldikKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU87CisKKyAgICByYyA9IHBjaV9lbmFibGVfZGV2aWNlX21lbShkZXZpY2UtPnBkZXYpOworICAgIGlmIChyYykKKyAgICB7CisgICAgICAgIHByaW50aygiRXJyb3IgcGNpX2VuYWJsZV9kZXZpY2VfbWVtIGZvciBkZXZpY2UgJWQgPSAlZFxuIiwgZGV2X2lkLCByYyk7XAorICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICAvKiBSZWZyZXNoIGRldmljZXMncyBQQ0llIGhlYWRlciAqLworICAgIF9wY2lfdXBkYXRlX3Jlc291cmNlKGRldmljZS0+cGRldiwgQkFSX1JFR1MpOworICAgIF9wY2lfdXBkYXRlX3Jlc291cmNlKGRldmljZS0+cGRldiwgQkFSX1NSQU0pOworICAgIF9wY2lfdXBkYXRlX3Jlc291cmNlKGRldmljZS0+cGRldiwgQkFSX0REUik7CisgICAgZGV2aWNlLT5lbmFibGVkID0gMTsKKworb3V0OgorICAgIHJldHVybiByYyA/IEJDTV9FUlJfSU8gOiBCQ01fRVJSX09LOworfQorCisvKiBEaXNhYmxlIFBDSSBhY2Nlc3MgdG8gZGV2aWNlICovCitiY21vc19lcnJubyBiY21fbGxfcGNpZV9kZXZfZGlzYWJsZShpbnQgZGV2X2lkKQoreworICAgIG1hcGxlX2RldmljZV9pbmZvICpkZXZpY2U7CisKKyAgICBwcmludGsoIiVzOiBkZXZpY2UgJWRcbiIsIF9fRlVOQ1RJT05fXywgZGV2X2lkKTsKKworICAgIGlmIChkZXZfaWQgPj0gTUFQTEVfTUFYX0RFVklDRVMpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisKKyAgICBkZXZpY2UgPSAmZGV2aWNlc1tkZXZfaWRdOworICAgIGlmICghZGV2aWNlLT5wZGV2IHx8ICFkZXZpY2UtPmVuYWJsZWQpCisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIHBjaV9kaXNhYmxlX2RldmljZShkZXZpY2UtPnBkZXYpOworICAgIGRldmljZS0+ZW5hYmxlZCA9IDA7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtX2xsX3BjaWVfaW5pdCh2b2lkKQoreworICAgIGludCByYzsKKyAgICBpZiAoaXNfaW5pdGlhbGl6ZWQpCisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIGlzX2luaXRpYWxpemVkID0gQkNNT1NfVFJVRTsKKyAgICByYyA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJm1hcGxlX3BjaV9kcml2ZXIpOworICAgIHByaW50ayhLRVJOX0lORk8gIk1hcGxlIFBDSSBkcml2ZXIgcmVnaXN0ZXJlZCB3aXRoIFBDSSBzdWJzeXN0ZW0uIHJjPSVkXG4iLCByYyk7CisgICAgcmV0dXJuIHJjID8gQkNNX0VSUl9JTlRFUk5BTCA6IEJDTV9FUlJfT0s7Cit9CisKK3ZvaWQgYmNtX2xsX3BjaWVfY2xlYW51cCh2b2lkKQoreworICAgIGlmICghaXNfaW5pdGlhbGl6ZWQpCisgICAgICAgIHJldHVybjsKKyAgICBpc19pbml0aWFsaXplZCA9IEJDTU9TX0ZBTFNFOworCisgICAgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZtYXBsZV9wY2lfZHJpdmVyKTsKKyAgICBjcnRfZGV2aWNlID0gMDsKKyAgICBtZW1zZXQoZGV2aWNlcywgMCwgc2l6ZW9mKGRldmljZXMpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBwcm9jZWR1cmVzIGV4ZWN1dGVkIG9uIGluc21vZCBhbmQgcm1tb2QgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBfX2luaXQgYmNtX2xsX2luaXRfbW9kdWxlKHZvaWQpCit7CisgICAgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpiY21vbHRfZmlsZSA9IE5VTEw7CisKKyAgICBpZiAoKGJjbW9sdF9kaXIgPSBjcmVhdGVfcHJvY19lbnRyeSgiYmNtb2x0IiwgU19JRkRJUiwgTlVMTCkpID09IE5VTEwpCisgICAgeworICAgICAgICBwcmludGsoIlVuYWJsZSB0byBjcmVhdGUgL3Byb2MvYmNtb2x0IGVudHJ5XG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoKGJjbW9sdF9maWxlID0gY3JlYXRlX3Byb2NfZW50cnkoImNhcmQiLCBTX0lGUkVHIHwgU19JV1VTUiB8IFNfSVJVR08sIGJjbW9sdF9kaXIpKSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcHJpbnRrKCJVbmFibGUgdG8gY3JlYXRlIC9wcm9jL2JjbW9sdC9jYXJkIGVudHJ5XG4iKTsKKyAgICAgICAgcmVtb3ZlX3Byb2NfZW50cnkoImJjbW9sdCIsIGJjbW9sdF9kaXIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGJjbW9sdF9maWxlLT53cml0ZV9wcm9jID0gKHdyaXRlX3Byb2NfdCAqKW1hcGxlX3dyaXRlOworICAgIGJjbW9sdF9maWxlLT5yZWFkX3Byb2MgPSAocmVhZF9wcm9jX3QgKiltYXBsZV9yZWFkOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBiY21fbGxfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKyAgICBiY21fbGxfcGNpZV9jbGVhbnVwKCk7CisgICAgcmVtb3ZlX3Byb2NfZW50cnkoImNhcmQiLCBiY21vbHRfZGlyKTsKKyAgICByZW1vdmVfcHJvY19lbnRyeSgiYmNtb2x0IiwgTlVMTCk7CisgICAgcHJpbnRrKCJVbnJlZ2lzdGVyIGRvbmVcbiIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBBUElzIHVzZWQgYnkgSG9zdCBkcml2ZXJzICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBiY21fbGxfcGNpZV9zdGF0dXNfY2hhbmdlX3JlZ2lzdGVyKGJjbV9sbF9wY2llX3N0YXR1c19jaGFuZ2UgY2IpCit7CisgICAgaW50IGk7CisgICAgbWFwbGVfZGV2aWNlX2luZm8gKmRldmljZV9pbmZvOworCisgICAgY2FsbGJhY2sgPSBjYjsKKyAgICBpZihjYWxsYmFjaykKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjcnRfZGV2aWNlOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGRldmljZV9pbmZvID0gZ2V0X21hcGxlX3BjaV9pbmZvKGkpOworICAgICAgICAgICAgaWYgKGRldmljZV9pbmZvKQorICAgICAgICAgICAgICAgIGNhbGxiYWNrKGksIGRldmljZV9pbmZvLT5kYXRhbGluayk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY2FsbGJhY2soaSwgQkNNX0xMX1BDSUVfTElOS19ET1dOKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19lcnJubyBiY21fbGxfcGNpZV9zdGF0dXNfY2hhbmdlX3VucmVnaXN0ZXIodm9pZCkKK3sKKyAgICBjYWxsYmFjayA9IE5VTEw7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtX2xsX3BjaWVfcXVlcnkodWludDhfdCBkZXZfaWQsIGJjbV9sbF9kZXZfaW5mbyAqaW5mbykKK3sKKyAgICBtYXBsZV9kZXZpY2VfaW5mbyAqZGV2aWNlX2luZm87CisKKyAgICBpZiAoIWluZm8pCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisKKyAgICBpZiAoZGV2X2lkIDwgTUFQTEVfTUFYX0RFVklDRVMpCisgICAgeworICAgICAgICBkZXZpY2VfaW5mbyA9IGdldF9tYXBsZV9wY2lfaW5mbyhkZXZfaWQpOworICAgICAgICBpZiAoZGV2aWNlX2luZm8gJiYgZGV2aWNlX2luZm8tPnBkZXYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChkZXZpY2VfaW5mby0+ZGF0YWxpbmsgPT0gQkNNX0xMX1BDSUVfTElOS19ET1dOKQorICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX0lPOworICAgICAgICAgICAgKmluZm8gPSBkZXZpY2VfaW5mby0+ZGV2aWNlOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU87CisgICAgfQorICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworfQorCitiY21fbGxfcGNpZV9kZXYgYmNtX2xsX3BjaWVfZGV2X2dldCh1aW50OF90IGRldl9pZCkKK3sKKyAgICBtYXBsZV9kZXZpY2VfaW5mbyAqZGV2aWNlX2luZm87CisKKyAgICBpZiAoZGV2X2lkIDwgY3J0X2RldmljZSkKKyAgICB7CisgICAgICAgIGRldmljZV9pbmZvID0gZ2V0X21hcGxlX3BjaV9pbmZvKGRldl9pZCk7CisgICAgICAgIHJldHVybiAoZGV2aWNlX2luZm8gPyBkZXZpY2VfaW5mby0+cGRldiA6IE5VTEwpOworICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCitiY21vc19lcnJubyBiY21fbGxfcGNpZV9ob3N0X3Jlc2V0X2VuYWJsZSh1aW50OF90IGRldl9pZCwgYmNtb3NfYm9vbCBlbmFibGVkKQoreworICAgIHVpbnQzMl90IHZhbDsKKworICAgIHZhbCA9IGVuYWJsZWQgPyAwIDogMTsKKyAgICBiY21fcGNpX3dyaXRlMzIoKHVpbnQzMl90ICopKGRldmljZXNbZGV2X2lkXS5kZXZpY2Uuc29jX3JlZ3NfYmFzZSArIFBDSUVfSEFSRF9ERUJVR19SRUdJU1RFUl9PRkZTRVQpLCB2YWwpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKyNpZmRlZiBUWF9FTkFCTEVfRVZFTlRfVFJBQ0UKK2JjbW9zX2Vycm5vIGJjbV9sbF9wY2llX3NldHJhY2UodWludDhfdCBkZXZfaWQpCit7CisgICAgbWFwbGVfZGV2aWNlX2luZm8gKmRldmljZV9pbmZvOworICAgIHVpbnQzMl90IHZhbCxsaW0sYmFzZSxzaXplOworICAgIHVpbnQzMl90IHJlZ2xvLHJlZ2hpLGJhc2VsaW07CisgICAgdW5zaWduZWQgbG9uZyBhZGRyOworCisgICAgaWYgKGRldl9pZCA8IGNydF9kZXZpY2UpCisgICAgeworICAgICAgICBkZXZpY2VfaW5mbyA9ICZkZXZpY2VzW2Rldl9pZF07CisgICAgICAgIGlmICghZGV2aWNlX2luZm8pCisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9JTzsKKyAgICAgICAgc2l6ZSA9IEVWRU5UX0JVRkZFUl9TSVpFOworICAgICAgICBkZXZpY2VfaW5mby0+dHJhY2VhZGRyID0gKHVuc2lnbmVkIGludCAqKWJjbW9zX2FsbG9jX25vdF9jYWNoZShzaXplKTsKKyAgICAgICAgbWVtc2V0KGRldmljZV9pbmZvLT50cmFjZWFkZHIsMCxzaXplKTsKKyAgICAgICAgYWRkciA9IGJjbW9zX3ZpcnRfdG9fcGh5cyhkZXZpY2VfaW5mby0+dHJhY2VhZGRyKTsgLyogfCAweDAyID0gcmV2ZXJzZSBieXRlIG9yZGVyID0gc3dhcCAqLworICAgICAgICBwcmludGsoInRyYWNlIHdpbmRvdyA6IGFsbG9jPTB4JWx4IHNpemU9MHgleFxuIiwodW5zaWduZWQgbG9uZylkZXZpY2VfaW5mby0+dHJhY2VhZGRyLCAodW5zaWduZWQgaW50KXNpemUpOworICAgICAgICByZWdsbyA9IFBDSUVfUENJRV8wX01JU0NfQ1BVXzJfUENJRV9NRU1fV0lOMV9MTzsKKyAgICAgICAgcmVnaGkgPSBQQ0lFX1BDSUVfMF9NSVNDX0NQVV8yX1BDSUVfTUVNX1dJTjFfSEk7CisgICAgICAgIGJhc2VsaW0gPSBQQ0lFX1BDSUVfMF9NSVNDX0NQVV8yX1BDSUVfTUVNX1dJTjFfQkFTRV9MSU1JVDsKKyAgICAgICAgYmNtX3BjaV93cml0ZTMyKCh1aW50MzJfdCAqKShkZXZpY2VfaW5mby0+ZGV2aWNlLnNvY19yZWdzX2Jhc2UgKyByZWdsbyksYWRkciAmIDB4ZmZmZmZmZmYpOworICAgICAgICBiY21fcGNpX3dyaXRlMzIoKHVpbnQzMl90ICopKGRldmljZV9pbmZvLT5kZXZpY2Uuc29jX3JlZ3NfYmFzZSArIHJlZ2hpKSksKChhZGRyID4+IDMyKSAmIDB4ZmZmZmZmZmYpOworICAgICAgICAvKiBiYXNlICovCisgICAgICAgIGJhc2UgPSBDUFVfMl9QQ0lFX01FTV9XSU4xX0JBU0U7CisgICAgICAgIC8qIGxpbWl0ICovCisgICAgICAgIGxpbSA9IGJhc2UgKyBzaXplOworICAgICAgICB2YWwgPSBsaW0gIHwgKGJhc2UgPj4gMTYpOworICAgICAgICBiY21fcGNpX3dyaXRlMzIoKHVpbnQzMl90ICopKGRldmljZV9pbmZvLT5kZXZpY2Uuc29jX3JlZ3NfYmFzZSArIGJhc2VsaW0pLHZhbCk7CisgICAgICAgIC8vYmNtX2ZsZF9zZXRfZXZlbnRfdHJhY2UoZGV2X2lkKTsKKyAgICAgICAgYmNtX3BjaV93cml0ZTMyKCh1aW50MzJfdCAqKShkZXZpY2VfaW5mby0+ZGV2aWNlLnNvY19zcmFtX2Jhc2UgKyBCQ01fRkxEX0VWRU5UX1RSQUNFX09GRlNFVCksMHgxKTsKKworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7Cit9CitiY21vc19lcnJubyBiY21fbGxfcGNpZV9jbGVhcnRyYWNlKHVpbnQ4X3QgZGV2X2lkKQoreworICAgIG1hcGxlX2RldmljZV9pbmZvICpkZXZpY2VfaW5mbzsKKworICAgIGlmIChkZXZfaWQgPCBjcnRfZGV2aWNlKQorICAgIHsKKyAgICAgICAgZGV2aWNlX2luZm8gPSAmZGV2aWNlc1tkZXZfaWRdOworICAgICAgICBpZiAoIWRldmljZV9pbmZvKQorICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU87CisgICAgICAgIC8vYmNtX2ZsZF9jbGVhcl9ldmVudF90cmFjZShkZXZfaWQpOworICAgICAgICBiY21fcGNpX3dyaXRlMzIoKHVpbnQzMl90ICopKGRldmljZV9pbmZvLT5kZXZpY2Uuc29jX3NyYW1fYmFzZSArIEJDTV9GTERfRVZFTlRfVFJBQ0VfT0ZGU0VUKSwweDApOworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7Cit9CitiY21vc19lcnJubyBiY21fbGxfcGNpZV9zYXZldHJhY2UodWludDhfdCBkZXZfaWQsIGNoYXIgKnRyYWNlZmlsZW5hbWUpCit7CisgICAgbWFwbGVfZGV2aWNlX2luZm8gKmRldmljZV9pbmZvOworICAgIHN0cnVjdCBmaWxlICAgICAgICAgKmZwOworICAgIHVuc2lnbmVkIGxvbmcgc2VnICAgPSAwOworICAgIG1tX3NlZ21lbnRfdCBtZW1zZWc7CisKKyAgICBpZiAoIXRyYWNlZmlsZW5hbWUpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisKKyAgICBwcmludGsoImRldmljZT0lZCBmcm9tPSVkLCBHbyB0byB3cml0ZSB0byBmaWxlICVzXG4iLGRldl9pZCAsIGNydF9kZXZpY2UsIHRyYWNlZmlsZW5hbWUpOworCisgICAgaWYgKGRldl9pZCA8IGNydF9kZXZpY2UpCisgICAgeworICAgICAgICBkZXZpY2VfaW5mbyA9ICZkZXZpY2VzW2Rldl9pZF07CisgICAgICAgIGlmICghZGV2aWNlX2luZm8pCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50aygiRXJyb3I6IGRldmljZV9pbmZvIGlzIG51bGxcbiIpOworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisgICAgICAgIGZwID0gZmlscF9vcGVuKHRyYWNlZmlsZW5hbWUsIE9fV1JPTkxZIHwgT19DUkVBVCwgMDY2Nik7CisgICAgICAgIGlmICgoZnAgPT0gTlVMTCkgfHwgKGZwID09ICh2b2lkICopLUVOT0VOVCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50aygiRXJyb3I6IENhbid0IG9wZW4gZmlsZSAlc1xuIix0cmFjZWZpbGVuYW1lKTsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorICAgICAgICAvLyBHZXQgY3VycmVudCBzZWdtZW50IGRlc2NyaXB0b3IKKyAgICAgICAgc2VnID0gZ2V0X2ZzKCkuc2VnOworCisgICAgICAgIC8vIFNldCBzZWdtZW50IGRlc2NyaXB0b3IgYXNzb2NpYXRlZCB0byBrZXJuZWwgc3BhY2UKKyAgICAgICAgc2V0X2ZzKGdldF9kcygpKTsKKyAgICAgICAgZnAtPmZfb3AtPndyaXRlKGZwLCAoY2hhciAqKWRldmljZV9pbmZvLT50cmFjZWFkZHIsRVZFTlRfQlVGRkVSX1NJWkUsICZmcC0+Zl9wb3MpOworCisgICAgICAgIG1lbXNlZy5zZWcgPSBzZWc7CisgICAgICAgIHNldF9mcyhtZW1zZWcpOworICAgICAgICBmaWxwX2Nsb3NlKGZwLCBOVUxMKTsKKyAgICAgICAgcHJpbnRrKCJXcm90ZSBmaWxlICVzXG4iLHRyYWNlZmlsZW5hbWUpOworZXhpdDoKKyAgICAgICAgYmNtb3NfZnJlZV9ub3RfY2FjaGUoZGV2aWNlX2luZm8tPnRyYWNlYWRkcik7CisKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogVXNlciBpbnRlcmZhY2UgZnVuY3Rpb25zIDogaW1wbGVtZW50IGVjaG8vY2F0IHRvIHByb2MgZmlsZSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBjaGFyICpuYW1lOworCXZvaWQgKCpjYWxsYmFjaykoaW50IGNtZGlkLCBjaGFyICpjbWQpOworICAgIGNoYXIgKmRlc2NyaXB0aW9uOworfSBtYXBsZV9jYXJkX2NvbW1hbmQ7CisKK3N0YXRpYyBjaGFyICpmaW5kX2NvbW1hbmQoY2hhciAqY21kKTsKK3N0YXRpYyB2b2lkIGNvbW1hbmRfcmVnKGludCBjbWRpZCwgY2hhciAqbGluZSk7CitzdGF0aWMgdm9pZCBjb21tYW5kX21lbShpbnQgY21kaWQsIGNoYXIgKmxpbmUpOworc3RhdGljIHZvaWQgY29tbWFuZF9jZmcoaW50IGNtZGlkLCBjaGFyICpsaW5lKTsKKyNpZmRlZiBUWF9FTkFCTEVfRVZFTlRfVFJBQ0UKK3N0YXRpYyB2b2lkIGNvbW1hbmRfdHJhY2UoaW50IGNtZGlkLCBjaGFyICpsaW5lKTsKKyNlbmRpZgorCisjZGVmaW5lIFJFQURDTUQgICAgIDAKKyNkZWZpbmUgV1JJVEVDTUQgICAgMQorCitzdGF0aWMgbWFwbGVfY2FyZF9jb21tYW5kIGNvbW1hbmRzW10gPQoreworICAgIHsicmVhZHJlZyIsICAgICBjb21tYW5kX3JlZywgInJlYWQgcmVnaXN0ZXIgPGluZGV4PiA8cmVnaXN0ZXIgb2Zmc2V0IC0gaGV4PiJ9LAorICAgIHsid3JpdGVyZWciLCAgICBjb21tYW5kX3JlZywgIndyaXRlIHJlZ2lzdGVyIDxpbmRleD4gPHJlZ2lzdGVyIG9mZnNldCAtIGhleD4gPHZhbHVlIC0gaGV4PiJ9LAorICAgIHsicmVhZCIsICAgICAgICBjb21tYW5kX21lbSwgInJlYWQgPGFkZHJlc3MgLSBoZXg+IDxudW1iZXIgb2Ygd29yZHMgLSBkZWM+In0sCisgICAgeyJ3cml0ZSIsICAgICAgIGNvbW1hbmRfbWVtLCAid3JpdGUgPGFkZHJlc3MgLSBoZXg+IDx2YWx1ZSAtIGhleD4ifSwKKyAgICB7InJjZmciLCAgICAgICAgY29tbWFuZF9jZmcsICJyZWFkIGRldiA8YWRkcmVzcyAtIGhleD4gPG51bWJlciBvZiB3b3JkcyAtIGRlYz4ifSwKKyAgICB7IndjZmciLCAgICAgICAgY29tbWFuZF9jZmcsICJ3cml0ZSBkZXYgPGFkZHJlc3MgLSBoZXg+IDx2YWx1ZSAtIGhleD4ifSwKKyNpZmRlZiBUWF9FTkFCTEVfRVZFTlRfVFJBQ0UKKyAgICB7InRyYWNlIiwgICAgICAgY29tbWFuZF90cmFjZSwgInRyYWNlIDxpbmRleD4gb24vb2ZmL3NhdmUgdHggdHJhY2UifSwKKyNlbmRpZgorICAgIHtOVUxMLCBOVUxMLCBOVUxMfQorfTsKKworc3RhdGljIGNoYXIgKmZpbmRfY29tbWFuZChjaGFyICpjbWQpCit7CisgICAgY2hhciAqcmVzdDsKKyAgICBpbnQgaSA9IDA7CisgICAgbWFwbGVfY2FyZF9jb21tYW5kICpjbWRwdHIgPSAmY29tbWFuZHNbMF07CisKKyAgICBjbWQgPSBza2lwX3NwYWNlcyhjbWQpOworICAgIGlmICghc3RybmNtcChjbWQsImhlbHAiLHN0cmxlbigiaGVscCIpKSkKKyAgICB7CisgICAgICAgIHdoaWxlIChjbWRwdHItPm5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50aygiJXNcdDogJXNcbiIsY21kcHRyLT5uYW1lLCBjbWRwdHItPmRlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgIGNtZHB0ciA9ICZjb21tYW5kc1srK2ldOworICAgICAgICB9CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICB3aGlsZSAoY21kcHRyLT5uYW1lKQorICAgIHsKKyAgICAgICAgaWYgKCFzdHJuY21wKGNtZHB0ci0+bmFtZSwgY21kLCBzdHJsZW4oY21kcHRyLT5uYW1lKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3QgPSBjbWQgKyBzdHJsZW4oY21kcHRyLT5uYW1lKTsKKyAgICAgICAgICAgIHJlc3QgPSBza2lwX3NwYWNlcyhyZXN0KTsKKyAgICAgICAgICAgIGNtZHB0ci0+Y2FsbGJhY2soaSUyLCByZXN0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGNtZHB0ciA9ICZjb21tYW5kc1srK2ldOworICAgIH0KKworICAgIHJldHVybiAiV3JvbmcgY29tbWFuZCBuYW1lIjsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIGFuc3dlcnMgdG8gY2F0IC9wcm9jL2JjbW9sdCBjb21tYW5kCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBtYXBsZV9yZWFkKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworICAgIGludCBpOworICAgIGludCBsZW47CisgICAgbWFwbGVfZGV2aWNlX2luZm8gKmRldiA9IE5VTEw7CisKKyAgICBsZW4gPSBzcHJpbnRmKHBhZ2UsICJNYXBsZSBEZXZpY2UgSW5mb1xuXG4iKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFQTEVfTUFYX0RFVklDRVM7IGkrKykKKyAgICB7CisgICAgICAgIGRldiA9IGdldF9tYXBsZV9wY2lfaW5mbyhpKTsKKyAgICAgICAgaWYgKGRldikKKyAgICAgICAgeworICAgICAgICAgICAgbGVuICs9IHNwcmludGYocGFnZSArIGxlbiwgImlkPSVkIHJlZ3Nfc3RhcnQ9MHglbHggZGRyX3N0YXJ0PTB4JWx4IHNyYW1fc3RhcnQ9MHglbHggZGRyX2xlbmd0aD0lZFxuIiwKKyAgICAgICAgICAgICAgICBkZXYtPmRldmljZWlkLAorICAgICAgICAgICAgICAgIGRldi0+ZGV2aWNlLnNvY19yZWdzX2Jhc2UsZGV2LT5kZXZpY2Uuc29jX2Rkcl9iYXNlLAorICAgICAgICAgICAgICAgIGRldi0+ZGV2aWNlLnNvY19zcmFtX2Jhc2UsIChpbnQpZGV2LT5kZXZpY2Uuc29jX2Rkcl9sZW5ndGgpOworICAgICAgICAgICAgbGVuICs9IHNwcmludGYocGFnZSArIGxlbiwgIlBoeSBMaW5rIGlzICVzIERhdGEgTGluayBpcyAlcyBFcnJvciBzdGF0dXMgPSAlZFxuXG4iLAorICAgICAgICAgICAgICAgIGRldi0+cGh5bGluayA9PSAxID8gIlVQIiA6ICJET1dOIiwgZGV2LT5kYXRhbGluayA9PSAxID8gIlVQIiA6ICJET1dOIiwgKGludClkZXYtPmVycl9zdGF0dXMpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGxlbjsKK30KKyNpZmRlZiBUWF9FTkFCTEVfRVZFTlRfVFJBQ0UKK3N0YXRpYyB2b2lkIGNvbW1hbmRfdHJhY2UoaW50IGNtZGlkLCBjaGFyICpsaW5lKQoreworICAgIGNoYXIgdG9rZW5bNV07CisgICAgaW50ICBpbmRleDsKKworICAgIGlmIChzc2NhbmYobGluZSwgIiVkICVzIiwgJmluZGV4LCB0b2tlbikgIT0gMikKKyAgICB7CisgICAgICAgIHByaW50aygiV3JvbmcgcGFyYW1ldGVyXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBwcmludGsoIlRSQUNFIGNvbW1hbmRzIDogJXNcbiIsdG9rZW4pOworICAgIGlmICghc3RybmNtcCh0b2tlbiwib24iLDIpKQorICAgIHsKKyAgICAgICAgLy9vbgorICAgICAgICBiY21fbGxfcGNpZV9zZXRyYWNlKGluZGV4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIXN0cm5jbXAodG9rZW4sIm9mZiIsMykpCisgICAgeworICAgICAgICAvLyBvZmYKKyAgICAgICAgYmNtX2xsX3BjaWVfY2xlYXJ0cmFjZShpbmRleCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCFzdHJuY21wKHRva2VuLCJzYXZlIiw0KSkKKyAgICB7CisgICAgICAgIC8vZ2V0CisgICAgICAgIGNoYXIgZmlsZW5hbWVbMjBdOworICAgICAgICBzcHJpbnRmKGZpbGVuYW1lLCIuL3R0X3RyYWNlXyVkLnRyeCIsaW5kZXgpOworICAgICAgICBiY21fbGxfcGNpZV9zYXZldHJhY2UoaW5kZXgsZmlsZW5hbWUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHByaW50aygiV3JvbmcgY29tbWFuZFxuIik7Cit9CisjZW5kaWYKKworCitzdGF0aWMgdm9pZCBjb21tYW5kX3JlZyhpbnQgY21kaW5kZXgsIGNoYXIgKmxpbmUpCit7CisgICAgY2hhciAqcmVzdDsKKyAgICBjaGFyICp0b2tlbjsKKyAgICBpbnQgIGluZGV4OworICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzczsKKyAgICB1bnNpZ25lZCBpbnQgcmVnOworCisgICAgaWYgKHNzY2FuZihsaW5lLCAiJWQgJWx4IiwgJmluZGV4LCAmYWRkcmVzcykgIT0gMikKKyAgICB7CisgICAgICAgIHByaW50aygiV3JvbmcgcGFyYW1ldGVyXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBhZGRyZXNzICs9ICh1bnNpZ25lZCBsb25nKWRldmljZXNbaW5kZXhdLmRldmljZS5zb2NfcmVnc19iYXNlOworICAgIHN3aXRjaCAoY21kaW5kZXgpCisgICAgeworICAgIGNhc2UgUkVBRENNRDoKKyAgICAgICAgcmVnID0gYmNtX3BjaV9yZWFkMzIoKHVpbnQzMl90ICopYWRkcmVzcyk7CisgICAgICAgIHByaW50aygiMHglbHggOiAlMDh4XG4iLCBhZGRyZXNzLCByZWcpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFdSSVRFQ01EOgorICAgICAgICByZXN0ID0gbGluZTsKKyAgICAgICAgdG9rZW4gPSBzdHJzZXAoJnJlc3QsICIgIik7IC8qIHNraXAgaW5kZXggKi8KKyAgICAgICAgdG9rZW4gPSBzdHJzZXAoJnJlc3QsICIgIik7IC8qIHNraXAgYWRkcmVzcyAqLworICAgICAgICB0b2tlbiA9IHN0cnNlcCgmcmVzdCwgIiAiKTsKKyAgICAgICAgaWYgKCF0b2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKCJXcm9uZyBwYXJhbWV0ZXJcbiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHNzY2FuZih0b2tlbiwgIiV4IiwgJnJlZyk7CisgICAgICAgIHByaW50aygid3JpdGUgMHgleCB0byAweCVseFxuIiwgcmVnLCBhZGRyZXNzKTsKKyAgICAgICAgYmNtX3BjaV93cml0ZTMyKCh1aW50MzJfdCAqKWFkZHJlc3MscmVnKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjb21tYW5kX21lbShpbnQgY21kaW5kZXgsIGNoYXIgKmxpbmUpCit7CisgICAgY2hhciAqdG9rZW47CisgICAgY2hhciAqcmVzdDsKKyAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3M7CisgICAgdW5zaWduZWQgaW50IHJlZzsKKyAgICBpbnQgaSwgbnVtYmVyX29mX3dvcmRzOworICAgIGludCBpbl9saW5lPTAsIG1heF9pbl9saW5lOworCisgICAgaWYgKHNzY2FuZihsaW5lLCAiJWx4IiwgJmFkZHJlc3MpICE9IDEpCisgICAgeworICAgICAgICBwcmludGsoIldyb25nIHBhcmFtZXRlclxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcmVzdCA9IGxpbmU7CisgICAgdG9rZW4gPSBzdHJzZXAoJnJlc3QsICIgIik7IC8qIHNraXAgYWRkcmVzcyAqLworICAgIHN3aXRjaCAoY21kaW5kZXgpCisgICAgeworICAgIGNhc2UgUkVBRENNRDoKKyAgICAgICAgdG9rZW4gPSBzdHJzZXAoJnJlc3QsICIgIik7CisgICAgICAgIGlmICghdG9rZW4pCisgICAgICAgICAgICBudW1iZXJfb2Zfd29yZHMgPSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzc2NhbmYodG9rZW4sICIlZCIsICZudW1iZXJfb2Zfd29yZHMpOworCisgICAgICAgIG1heF9pbl9saW5lID0gNDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bWJlcl9vZl93b3JkczsgaSsrLCBhZGRyZXNzICs9IDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghaW5fbGluZSkKKyAgICAgICAgICAgICAgICBwcmludGsoIiUwOGx4OiAiLCBhZGRyZXNzKTsKKyAgICAgICAgICAgIHJlZyA9IGJjbV9wY2lfcmVhZDMyKCh1aW50MzJfdCAqKWFkZHJlc3MpOworICAgICAgICAgICAgcHJpbnRrKCIlMDh4IiwgcmVnKTsKKyAgICAgICAgICAgIGlmICgrK2luX2xpbmUgPCBtYXhfaW5fbGluZSkKKyAgICAgICAgICAgICAgICBwcmludGsoIiAiKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGsoIlxuIik7CisgICAgICAgICAgICAgICAgaW5fbGluZSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGluX2xpbmUpCisgICAgICAgICAgICBwcmludGsoIlxuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgV1JJVEVDTUQ6CisgICAgICAgIHRva2VuID0gc3Ryc2VwKCZyZXN0LCAiICIpOworICAgICAgICBpZiAoIXRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoIldyb25nIHBhcmFtZXRlclxuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc3NjYW5mKHRva2VuLCAiJXgiLCAmcmVnKTsKKyAgICAgICAgYmNtX3BjaV93cml0ZTMyKCh1aW50MzJfdCAqKWFkZHJlc3MscmVnKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjb21tYW5kX2NmZyhpbnQgY21kaW5kZXgsIGNoYXIgKmxpbmUpCit7CisgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzOworICAgIHVuc2lnbmVkIGludCByZWc7CisgICAgdW5zaWduZWQgaW50IHZhbF9vcl9udW07CisgICAgaW50IGNydDsKKyAgICBpbnQgaTsKKyAgICBpbnQgaW5fbGluZT0wLCBtYXhfaW5fbGluZTsKKyAgICBtYXBsZV9kZXZpY2VfaW5mbyAqZGV2aWNlOworCisgICAgaWYgKHNzY2FuZihsaW5lLCAiJWQgJWx4ICV4IiwgJmNydCwgJmFkZHJlc3MsICZ2YWxfb3JfbnVtKSAhPSAzKQorICAgIHsKKyAgICAgICAgcHJpbnRrKCJXcm9uZyBwYXJhbWV0ZXJcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGNydCA+PSBjcnRfZGV2aWNlIHx8ICFkZXZpY2VzW2NydF0ucGRldikKKyAgICB7CisgICAgICAgIHByaW50aygiSW52YWxpZCBkZXZpY2UgJWRcbiIsIGNydCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBkZXZpY2UgPSAmZGV2aWNlc1tjcnRdOworCisgICAgc3dpdGNoIChjbWRpbmRleCkKKyAgICB7CisgICAgY2FzZSBSRUFEQ01EOgorICAgICAgICBtYXhfaW5fbGluZSA9IDQ7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB2YWxfb3JfbnVtOyBpKyssIGFkZHJlc3MgKz0gNCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFpbl9saW5lKQorICAgICAgICAgICAgICAgIHByaW50aygiJTA4bHg6ICIsIGFkZHJlc3MpOworICAgICAgICAgICAgcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldmljZS0+cGRldiwgYWRkcmVzcywgJnJlZyk7CisgICAgICAgICAgICBwcmludGsoIiUwOHgiLCByZWcpOworICAgICAgICAgICAgaWYgKCsraW5fbGluZSA8IG1heF9pbl9saW5lKQorICAgICAgICAgICAgICAgIHByaW50aygiICIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50aygiXG4iKTsKKyAgICAgICAgICAgICAgICBpbl9saW5lID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaW5fbGluZSkKKyAgICAgICAgICAgIHByaW50aygiXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFdSSVRFQ01EOgorICAgICAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldmljZS0+cGRldiwgYWRkcmVzcywgdmFsX29yX251bSk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgYW5zd2VycyB0byBlY2hvIFsuLi5dID4gL3Byb2MvYmNtb2x0IGNvbW1hbmQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IG1hcGxlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLGNvbnN0IGNoYXIgKmJ1ZmZlcixzaXplX3QgY291bnQsIHZvaWQgKmRhdGEpCit7CisgICAgY2hhciAqaW50ZXJuYWw7CisKKyAgICBpZiAoYnVmZmVyID09IE5VTEwpCisgICAgICAgIHJldHVybiAtRUZBVUxUOworCisgICAgaW50ZXJuYWwgPSBrbWFsbG9jKGNvdW50LCBHRlBfS0VSTkVMKTsKKyAgICBpZiAoIWludGVybmFsKQorICAgIHsKKyAgICAgICAgcHJpbnRrKCJOb3QgZW5vdWdoIG1lbW1vcnlcbiIpOworICAgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorCisgICAgbWVtc2V0KGludGVybmFsLCAwLCBjb3VudCk7CisgICAgaWYgKGNvcHlfZnJvbV91c2VyKGludGVybmFsLCBidWZmZXIsIGNvdW50KSkKKyAgICB7CisgICAgICAgIHByaW50aygiTm90IGVub3VnaCBtZW1tb3J5XG4iKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgZmluZF9jb21tYW5kKGludGVybmFsKTsKKworZXJyb3I6CisgICAga2ZyZWUoaW50ZXJuYWwpOworCisgICAgcmV0dXJuIGNvdW50OworfQorCitFWFBPUlRfU1lNQk9MKGJjbW9sdF9kaXIpOworRVhQT1JUX1NZTUJPTChiY21fbGxfcGNpZV9pbml0KTsKK0VYUE9SVF9TWU1CT0woYmNtX2xsX3BjaWVfY2xlYW51cCk7CitFWFBPUlRfU1lNQk9MKGJjbV9sbF9wY2llX3N0YXR1c19jaGFuZ2VfcmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTChiY21fbGxfcGNpZV9zdGF0dXNfY2hhbmdlX3VucmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTChiY21fbGxfcGNpZV9xdWVyeSk7CitFWFBPUlRfU1lNQk9MKGJjbV9sbF9wY2llX2Rldl9nZXQpOworRVhQT1JUX1NZTUJPTChiY21fbGxfcGNpZV9kZXZfZW5hYmxlKTsKK0VYUE9SVF9TWU1CT0woYmNtX2xsX3BjaWVfZGV2X2Rpc2FibGUpOworRVhQT1JUX1NZTUJPTChiY21fbGxfcGNpZV9ob3N0X3Jlc2V0X2VuYWJsZSk7CisKKyNpZmRlZiBUWF9FTkFCTEVfRVZFTlRfVFJBQ0UKK0VYUE9SVF9TWU1CT0woYmNtX2xsX3BjaWVfc2V0cmFjZSk7CitFWFBPUlRfU1lNQk9MKGJjbV9sbF9wY2llX2NsZWFydHJhY2UpOworRVhQT1JUX1NZTUJPTChiY21fbGxfcGNpZV9zYXZldHJhY2UpOworI2VuZGlmCittb2R1bGVfaW5pdChiY21fbGxfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoYmNtX2xsX2NsZWFudXBfbW9kdWxlKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJtYXBsZSBsaW5lIGNhcmQiKTsKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvbGxfcGNpZS9iY21vbHRfbGxwY2llLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2xsX3BjaWUvYmNtb2x0X2xscGNpZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJkMWE2MGUKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2xsX3BjaWUvYmNtb2x0X2xscGNpZS5oCkBAIC0wLDAgKzEsMTM0IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisvKgorICogYmNtX2xscGNpZS5oIC0gTG93LWxldmVsIFBDSWUgZHJpdmVyIGludGVyZmFjZQorICovCisKKyNpZm5kZWYgQkNNT0xUX0xMUENJRV9IXworI2RlZmluZSBCQ01PTFRfTExQQ0lFX0hfCisKKyNpbmNsdWRlICJiY21vc19zeXN0ZW0uaCIKKyNkZWZpbmUgTUFQTEVfTUFYX0RFVklDRVMgICAgICAgICAgICAgICBCQ01UUl9NQVhfT0xUUworCisvKiogTG93LWxldmVsIGRldmljZSBpbmZvICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbGxfZGV2X2luZm8KK3sKKyAgICB1bnNpZ25lZCBsb25nICAgc29jX3JlZ3NfYmFzZTsgICAgICAvKio8IERldmljZSByZWdpc3RlcnMgYmFzZSBpbiBob3N0IGFkZHJlc3Mgc3BhY2UgKi8KKyAgICB1bnNpZ25lZCBsb25nICAgc29jX3NyYW1fYmFzZTsgICAgICAvKio8IERldmljZSBTUkFNIGJhc2UgaW4gaG9zdCBhZGRyZXNzIHNwYWNlICovCisgICAgdW5zaWduZWQgbG9uZyAgIHNvY19kZHJfYmFzZTsgICAgICAgLyoqPCBEZXZpY2UgRERSIGJhc2UgaW4gaG9zdCBhZGRyZXNzIHNwYWNlICovCisgICAgdWludDMyX3QgICAgICAgIHNvY19kZHJfbGVuZ3RoOyAgICAgLyoqPCBEZXZpY2UgRERSIHdpbmRvdyBzaXplICovCisgICAgdWludDMyX3QgICAgICAgIGlycTsgICAgICAgICAgICAgICAgLyoqPCBEZXZpY2UgaXJxIG51bWJlciAqLworICAgIGludCAgICAgICAgICAgICBpcnFfY29ubmVjdGVkOyAgICAgIC8qKjwgRGV2aWNlIGlycSBudW1iZXIgY29ubmVjdGVkICovCit9IGJjbV9sbF9kZXZfaW5mbzsKKworLyoqIERldmljZSBQQ0llIGxpbmsgc3RhdHVzIGNoYW5nZSBub3RpZmljYXRpb24gY2FsbGJhY2sgKi8KK3R5cGVkZWYgZW51bQoreworICAgIEJDTV9MTF9QQ0lFX0xJTktfRE9XTiwgICAgICAgICAgICAgLyoqPCBQQ0llIGxpbmsgaXMgZG93biAqLworICAgIEJDTV9MTF9QQ0lFX0xJTktfVVAsICAgICAgICAgICAgICAgLyoqPCBQQ0llIGxpbmsgaXMgdXAgKi8KK30gYmNtX2xsX3BjaWVfbGlua19zdGF0dXM7CisKKy8qKiBMb3ctbGV2ZWwgZGV2aWNlIGhhbmRsZSAqLwordHlwZWRlZiB2b2lkICpiY21fbGxfcGNpZV9kZXY7CisKKy8qKiBTdGF0dXMgY2hhbmdlIGluZGljYXRpb24gKi8KK3R5cGVkZWYgdm9pZCAoKmJjbV9sbF9wY2llX3N0YXR1c19jaGFuZ2UpKHVpbnQ4X3QgZGV2X2lkLCBiY21fbGxfcGNpZV9saW5rX3N0YXR1cyBzdGF0dXMpOworCisvKiogUmVnaXN0ZXIgc3RhdHVzIGNoYW5nZSBub3RpZmljYXRpb24gY2FsbGJhY2sKKyAqIFxwYXJhbVtpbl0gICBjYiAgICAgIFN0YXR1cyBjaGFuZ2Ugbm90aWZpY2F0aW9uIGNhbGxiYWNrCisgKiBccmV0dXJuIDA9T0sgb3IgZXJyb3IgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtX2xsX3BjaWVfc3RhdHVzX2NoYW5nZV9yZWdpc3RlcihiY21fbGxfcGNpZV9zdGF0dXNfY2hhbmdlIGNiKTsKKworLyoqIFVucmVnaXN0ZXIgc3RhdHVzIGNoYW5nZSBub3RpZmljYXRpb24gY2FsbGJhY2sKKyAqIFxyZXR1cm4gMD1PSyBvciBlcnJvciA8MAorICovCitiY21vc19lcnJubyBiY21fbGxfcGNpZV9zdGF0dXNfY2hhbmdlX3VucmVnaXN0ZXIodm9pZCk7CisKKy8qKiBRdWVyeSBQQ0llIGRldmljZQorICogXHBhcmFtW2luXSAgIGRldl9pZCAgRGV2aWNlIGlkCisgKiBccGFyYW1bb3V0XSAgaW5mbyAgICBEZXZpY2UgaW5mbworICogXHJldHVybiAwPU9LLCBCQ01fRVJSX0lPLWRldl9pZCBpcyBpbiBwcm9wZXIgcmFuZ2UsIGJ1dCBsaW5rIGlzIGRvd24KKyAqLworYmNtb3NfZXJybm8gYmNtX2xsX3BjaWVfcXVlcnkodWludDhfdCBkZXZfaWQsIGJjbV9sbF9kZXZfaW5mbyAqaW5mbyk7CisKKy8qKiBHZXQgbG93LWxldmVsIGRldmljZSBoYW5kbGUKKyAqIFxwYXJhbVtpbl0gICBkZXZfaWQgIERldmljZSBpZAorICogXHBhcmFtW291dF0gIGxsZGV2ICAgTG93LWxldmVsIGRldmljZSBoYW5kbGUKKyAqIFxyZXR1cm4gZGV2aWNlIGhhbmRsZSBvciBOVUxMIGlmIGxpbmsgaXMgZG93bgorICovCitiY21fbGxfcGNpZV9kZXYgYmNtX2xsX3BjaWVfZGV2X2dldCh1aW50OF90IGRldl9pZCk7CisKKy8qIEluaXRpYWxpemUgbG93LWxldmVsIFBDSWUgZHJpdmVyCisgKiBccmV0dXJuCisgKiAgIC0gMD1PSworICogICAtIEJDTV9FUlJfSU5URVJOQUwgLSBmYWlsZWQgdG8gcmVnaXN0ZXIgd2l0aCBQQ0kgc3Vic3lzdGVtCisgKi8KK2JjbW9zX2Vycm5vIGJjbV9sbF9wY2llX2luaXQodm9pZCk7CisKKy8qIENsZWFudXAgbG93LWxldmVsIFBDSWUgZHJpdmVyICovCit2b2lkIGJjbV9sbF9wY2llX2NsZWFudXAodm9pZCk7CisKKy8qKiBFbmFibGUgUENJIGFjY2VzcyB0byBkZXZpY2UKKyAqIFxwYXJhbVtpbl0gICBkZXZfaWQgIERldmljZSBpZAorICogXHJldHVybgorICogICAtIDA9T0sKKyAqICAgLSBCQ01fRVJSX1BBUk0tZGV2X2lkIGlzIGludmFsaWQKKyAqICAgLSBCQ01fRVJSX0lPLWRldl9pZCBpcyBpbiBwcm9wZXIgcmFuZ2UsIGJ1dCBsaW5rIGlzIGRvd24KKyAqLworYmNtb3NfZXJybm8gYmNtX2xsX3BjaWVfZGV2X2VuYWJsZShpbnQgZGV2X2lkKTsKKworLyoqIERpc2FibGUgUENJIGFjY2VzcyB0byBkZXZpY2UKKyAqIFxwYXJhbVtpbl0gICBkZXZfaWQgIERldmljZSBpZAorICogXHJldHVybgorICogICAtIDA9T0sKKyAqICAgLSBCQ01fRVJSX1BBUk0tZGV2X2lkIGlzIGludmFsaWQKKyAqLworYmNtb3NfZXJybm8gYmNtX2xsX3BjaWVfZGV2X2Rpc2FibGUoaW50IGRldl9pZCk7CisKKy8qKiBFbmFibGUvZGlzYWJsZSBob3N0IHJlc2V0IGZvciBhbGwgUENJZSBpbnRlcmZhY2VzIChhdXRvbWF0aWMKKyAqICBkZXZpY2UgcmVzZXQgd2hlbiBob3N0IGlzIHJlc2V0KQorICogXHBhcmFtW2luXSAgIGVuYWJsZWQgV2hldGhlciBvciBub3QgaG90IHJlc2V0IHNob3VsZCBiZSBlbmFibGVkCisgKiBccmV0dXJuIDA9T0sgb3IgZXJyb3IgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtX2xsX3BjaWVfaG9zdF9yZXNldF9lbmFibGUodWludDhfdCBkZXZfaWQsIGJjbW9zX2Jvb2wgZW5hYmxlZCk7CisKKyNpZmRlZiBUWF9FTkFCTEVfRVZFTlRfVFJBQ0UKKy8qKiBIYW5kbGUgbG93LWxldmVsIHRyYWNlIG9uIHRhcmdldAorICogXHBhcmFtW2luXSAgIGRldl9pZCAgRGV2aWNlIGlkCisgKiBccGFyYW1baW5dICBsZmlsZSBuYW1lIGZvciB0cmFjZQorICogXHJldHVybiBkZXZpY2UgaGFuZGxlIG9yIE5VTEwgaWYgbGluayBpcyBkb3duCisgKi8KK2JjbW9zX2Vycm5vIGJjbV9sbF9wY2llX3NldHJhY2UodWludDhfdCBkZXZfaWQpOworYmNtb3NfZXJybm8gYmNtX2xsX3BjaWVfY2xlYXJ0cmFjZSh1aW50OF90IGRldl9pZCk7CitiY21vc19lcnJubyBiY21fbGxfcGNpZV9zYXZldHJhY2UodWludDhfdCBkZXZfaWQsIGNoYXIgKnRyYWNlZmlsZW5hbWUpOworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9sbF9wY2llL3Z4d29ya3MvYmNtb2x0X2xscGNpZS5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9sbF9wY2llL3Z4d29ya3MvYmNtb2x0X2xscGNpZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNmQzYzAKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2xsX3BjaWUvdnh3b3Jrcy9iY21vbHRfbGxwY2llLmMKQEAgLTAsMCArMSw0MTAgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorKi8gCisKKyNpbmNsdWRlIDx2eFdvcmtzLmg+CisjaW5jbHVkZSA8ZHJ2L3BjaS9wY2lDb25maWdMaWIuaD4KKyNpbmNsdWRlICJiY21vbHRfbGxwY2llLmgiCisKKy8qIERlZmluZSBQQ0lFIGRldmljZSBCQVIgcmVnaXN0ZXJzICovCisjZGVmaW5lIEJBUl9SRUdTICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBCQVJfRERSICAgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQkFSX1NSQU0gICAgICAgICAgICAgICAgICAgICAgICA0CisKKy8qIAorRGVmaW5lIFBDSUUgZGV2aWNlIEJBUiBzcGFjZSBsZW5ndGg6CisgICAgYmFyIDEgPSA4ICBNYnl0ZSByZWdpc3RlciBzcGFjZSAKKyAgICBiYXIgMiA9IDE2IE1ieXRlIEREUiBzcGFjZSAKKyAgICBiYXIgMyA9IDY0IEtieXRlIFNSQU0gc3BhY2UKKyovCisjZGVmaW5lIE1BUExFX1JFR1NfTEVOR1RIICAgICAgICAgICAgICAgICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgTUFQTEVfRERSX0xFTkdUSCAgICAgICAgICAgICAgICAgICAgMHgwMTAwMDAwMAorI2RlZmluZSBNQVBMRV9TUkFNX0xFTkdUSCAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwCisKKy8qIERlZmluZSBzcGVjaWFsIHJlZ2lzdGVycyBhZGRyZXNzICovCisjaWZkZWYgVFhfRU5BQkxFX0VWRU5UX1RSQUNFCisjZGVmaW5lIFBDSUVfUENJRV8wX01JU0NfQ1BVXzJfUENJRV9NRU1fV0lOMV9MTwkJCTB4MDY0MDE0VQkKKyNkZWZpbmUgUENJRV9QQ0lFXzBfTUlTQ19DUFVfMl9QQ0lFX01FTV9XSU4xX0hJCQkJMHgwNjQwMThVCisjZGVmaW5lIFBDSUVfUENJRV8wX01JU0NfQ1BVXzJfUENJRV9NRU1fV0lOMV9CQVNFX0xJTUlUCTB4MDY0MDc0VQkKKyNlbmRpZgorI2RlZmluZSBQQ0lFX1JFVklTSU9OX1JFR0lTVEVSX09GRlNFVCAgICAgICAweDY0MDZDIC8qIFBDSUVfUENJRV9QQ0lFXzBfUENJRV9QQ0lFXzBfTUlTQ19SRVZJU0lPTiAgICAqLworI2RlZmluZSBQQ0lFX1NUQVRVU19SRUdJU1RFUl9PRkZTRVQgICAgICAgICAweDY0MDY4IC8qIFBDSUVfUENJRV9QQ0lFXzBfUENJRV9QQ0lFXzBfTUlTQ19QQ0lFX1NUQVRVUyAqLworI2RlZmluZSBQQ0lFX0hBUkRfREVCVUdfUkVHSVNURVJfT0ZGU0VUICAgICAweDY0MjA0VSAvKiBQQ0lFX1BDSUVfUENJRV8wX1BDSUVfUENJRV8wX01JU0NfSEFSRF9ERUJVRyAgKi8KKyNkZWZpbmUgUENJRV9JTlRfU1RBVFVTX1JFR0lTVEVSX09GRlNFVCAgICAgMHg2OTQwMCAvKiBQQ0lFX1BDSUVfUENJRV8wX0NQVV9JTlRSMV9JTlRSX1NUQVRVUyAgICAgICAgKi8KKyNkZWZpbmUgUENJRV9JTlRfQ0xFQVJfTUFTS19PRkZTRVQgICAgICAgICAgMHg2OTQwQyAvKiBQQ0lFX1BDSUVfUENJRV8wX0NQVV9JTlRSMV9JTlRSX01BU0tfQ0xFQVIgICAgKi8KKyNkZWZpbmUgUENJRV9JTlRSMV9TVEFUVVNfUkVHSVNURVJfT0ZGU0VUICAgMHg2OTMwMCAvKiBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovICAgICAgIAkKKworLyogTWFwbGUgZGV2aWNlIElEICovCisjZGVmaW5lIFBDSUVfTUFQTEVfVkVORE9SX0lEICAgICAgICAgICAgICAgIDB4MTRFNCAvKiBQQ0lFX0NGR19UWVBFMF9FUF9TVUJTWVNURU1fSURfVkVORE9SX0lEICAgICAgKi8KKyNkZWZpbmUgUENJRV9NQVBMRV9ERVZJQ0VfSUQgICAgICAgICAgICAgICAgMHg2ODYyIAorI2RlZmluZSBQQ0lFX01BUExFXzY4NjNfU0tVX0RFVklDRV9JRCAgICAgICAweDY4NjMKKyNkZWZpbmUgUENJRV9NQVBMRV9FUE9OX0RFVklDRV9JRCAgICAgICAgICAgMHg1NTU0CisKKy8qIERlZmluZSBpbnRlcnJ1cHQgdmVjdG9yIG51bWJlciBhY2NvcmRpbmcgQkNNNTMwMDMgQlNQICovCisjZGVmaW5lIFBDSUUxX0lWXzAgODYKKyNkZWZpbmUgUENJRTFfSVZfMSA4NworI2RlZmluZSBQQ0lFMV9JTlRfTElORSA0CisKKy8qIE1hcGxlIGRldmljZSBvYmplY3Qgc3RydWN0ICovCit0eXBlZGVmIHN0cnVjdCAgCit7CisgICAgYmNtX2xsX2Rldl9pbmZvICBkZXZpY2U7CisgICAgYmNtb3NfZmFzdGxvY2sgICBsb2NrOworICAgIGludCAgICAgICAgICAgICAgZXJyX3N0YXR1czsKKyAgICBpbnQgICAgICAgICAgICAgIHBoeWxpbms7CisgICAgaW50ICAgICAgICAgICAgICBwcmV2X2RhdGFsaW5rOworICAgIGludCAgICAgICAgICAgICAgZGF0YWxpbms7CisgICAgdWludDMyX3QgICAgICAgICBkZXZpY2VpZDsgIC8vIHN0YXJ0IGZyb20gMAorICAgIHVuc2lnbmVkIGludCAgICAqdHJhY2VhZGRyOworICAgIHZvaWQgICpwZGV2OworICAgIGludCBwY2lCdXNObzsgICAgICAgLyogUENJIGJ1cyBudW1iZXIgKi8KKyAgICBpbnQgcGNpRGV2Tm87ICAgICAgIC8qIFBDSSBkZXZpY2UgbnVtYmVyICovCisgICAgaW50IHBjaUZ1bmNObzsgICAgICAvKiBQQ0kgZnVuY3Rpb24gbnVtYmVyICovCisgICAgdWludDMyX3QgZGV2X3N0YXR1c19pcnE7Cit9IG1hcGxlX2RldmljZV9pbmZvOworCisvKiBNYXBsZSBkZXZpY2Ugb2JqZWN0cyAqLworc3RhdGljIG1hcGxlX2RldmljZV9pbmZvIGRldmljZXNbTUFQTEVfTUFYX0RFVklDRVNdOworaW50IGNydF9kZXZpY2UgPSAwOworCisvKiBEZXZpY2UgUENJRSBpbnRlcmZhY2Ugc3RhdHVzIGNoYW5nZSBjYWxsYmFjayAqLworc3RhdGljIGJjbV9sbF9wY2llX3N0YXR1c19jaGFuZ2UgY2FsbGJhY2s7CisKKy8qKiBEZXZpY2Ugc3RhdHVzIGNoYW5nZSBJU1IKKyAqIFxpcnEgICAgICAgICAgSVJRIG51bWJlcgorICogXGRldl9pbnN0YW5jZSBkZXZpY2Ugb2JqZWN0IAorICovCitpbnQgZGV2X3N0YXR1c19pbnRlcnJ1cHQgKGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSkKK3sKKyAgICBiY21vc19lcnJubyBlcnIgPSBCQ01fRVJSX09LOworICAgIHVpbnQzMl90IHJlZ192YWx1ZSA9IDA7CisgICAgbWFwbGVfZGV2aWNlX2luZm8gKmRldmljZV9pbmZvID0gTlVMTDsgICAKKyAgICBsb25nIGZsYWdzID0gMDsKKyAgICBpbnQgaGFuZGxlZCA9IDA7CisgICAgdWludDMyX3QgZGV2X2lkID0gMDsKKyAgICAKKyAgICBkZXZpY2VfaW5mbyA9IChtYXBsZV9kZXZpY2VfaW5mbyAqKWRldl9pbnN0YW5jZTsKKyAgICBkZXZfaWQgPSBkZXZpY2VfaW5mby0+ZGV2aWNlaWQ7CisgICAgCisgICAgZmxhZ3MgPSBiY21vc19mYXN0bG9ja19sb2NrKCZkZXZpY2VfaW5mby0+bG9jayk7CisKKyAgICByZWdfdmFsdWUgPSBiY21fcGNpX3JlYWQzMigodWludDMyX3QgKikoZGV2aWNlX2luZm8tPmRldmljZS5zb2NfcmVnc19iYXNlICsgUENJRV9JTlRfU1RBVFVTX1JFR0lTVEVSX09GRlNFVCkpOworICAgIHsKKyAgICAgICAgaWYgKGRldmljZV9pbmZvLT5kYXRhbGluayAhPSBkZXZpY2VfaW5mby0+cHJldl9kYXRhbGluaykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGRldmljZV9pbmZvLT5kYXRhbGluayA9PSBCQ01fTExfUENJRV9MSU5LX1VQKQorICAgICAgICAgICAgICAgIHByaW50ZigiRGV2aWNlPSVkIDogTGluayBpcyB1cCAhISFcbiIsIGRldl9pZCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJEZXZpY2U9JWQgOiBMaW5rIGlzIGRvd24gISEhXG4iLCBkZXZfaWQpOworICAgICAgICAgICAgICAgIHByaW50ZigicGh5IHN0YXR1cyA9IDB4JXggZXJyb3Igc3RhdHVzID0gMHgleFxuIiwgZGV2aWNlX2luZm8tPnBoeWxpbmssIGRldmljZV9pbmZvLT5lcnJfc3RhdHVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRldmljZV9pbmZvLT5wcmV2X2RhdGFsaW5rID0gZGV2aWNlX2luZm8tPmRhdGFsaW5rOworICAgICAgICAgICAgaWYgKGNhbGxiYWNrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhbGxiYWNrKGRldl9pZCwgZGV2aWNlX2luZm8tPmRhdGFsaW5rKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmVnX3ZhbHVlID0gYmNtX3BjaV9yZWFkMzIoCisgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QgKikoZGV2aWNlX2luZm8tPmRldmljZS5zb2NfcmVnc19iYXNlICsgUENJRV9JTlRSMV9TVEFUVVNfUkVHSVNURVJfT0ZGU0VUKSk7CisgICAgICAgIHsKKyAgICAgICAgICAgIGhhbmRsZWQgPSAxOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmZGV2aWNlX2luZm8tPmxvY2ssIGZsYWdzKTsKKyAgICAKKyAgICByZXR1cm4gaGFuZGxlZDsKK30KKworLyoqIE1hcGxlIGRldmljZSBkZXRlY3Rpb24gYW5kIGluaXRpYWxpemF0aW9uCisgKi8KK2JjbW9zX2Vycm5vIGJjbV9sbF9wY2llX2ludGVyZmFjZV9pbml0KCkKK3sKKyAgICBTVEFUVVMgcmV0X3N0YXR1czsKKyAgICBtYXBsZV9kZXZpY2VfaW5mbyAqZGV2X2luZm8gPSBOVUxMOyAKKyAgICB1aW50MzJfdCByZWFkdmFsID0gMDsKKyAgICB1aW50OF90IHJlYWR2YWxiID0gMDsKKyAgICBiY21vc19lcnJubyBlcnIgPSBCQ01fRVJSX09LOworICAgIHVpbnQ4X3QgaXJxID0gMDsKKyAgICB1aW50MTZfdCBkZXZpY2VfaWQ7CisKKyAgICBwcmludGYoIiVzKClcclxuIiwgX19GVU5DVElPTl9fKTsKKworICAgIC8vIGNoZWNrIG1hcGxlIGRldmljZSBudW1iZXIKKyAgICBpZiAoY3J0X2RldmljZSA9PSBNQVBMRV9NQVhfREVWSUNFUykKKyAgICB7CisgICAgICAgIHByaW50ZigiIE1heGltdW0gTWFwbGUgZGV2aWNlcyBhbHJlYWR5IGRlZmluZWQgKCVkKVxuIiwgTUFQTEVfTUFYX0RFVklDRVMpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9BTFJFQURZOworICAgIH0gCisgICAgLy8gSW5pdCBkZXZpY2Ugb2JqZWN0IHN0cnVjdAorICAgIGRldl9pbmZvID0gJmRldmljZXNbY3J0X2RldmljZSsrXTsKKyAgICBtZW1zZXQoZGV2X2luZm8sIDAsIHNpemVvZihtYXBsZV9kZXZpY2VfaW5mbykpOworICAgIAorICAgIC8vIGZpbmQgbWFwbGUgNjg2MiBkZXZpY2UKKyAgICByZXRfc3RhdHVzID0gcGNpRmluZERldmljZShQQ0lFX01BUExFX1ZFTkRPUl9JRCwKKyAgICAgICAgUENJRV9NQVBMRV9ERVZJQ0VfSUQsCisgICAgICAgIDAsCisgICAgICAgICZkZXZfaW5mby0+cGNpQnVzTm8sCisgICAgICAgICZkZXZfaW5mby0+cGNpRGV2Tm8sCisgICAgICAgICZkZXZfaW5mby0+cGNpRnVuY05vKTsKKworICAgIGlmIChPSyA9PSByZXRfc3RhdHVzKQorICAgIHsKKyAgICAgICAgZGV2aWNlX2lkID0gUENJRV9NQVBMRV9ERVZJQ0VfSUQ7CisgICAgICAgIGdvdG8gZm91bmRfZGV2aWNlX2lkOworICAgIH0KKworICAgIC8vIGZpbmQgbWFwbGUgNjg2MyBkZXZpY2UKKyAgICByZXRfc3RhdHVzID0gcGNpRmluZERldmljZShQQ0lFX01BUExFX1ZFTkRPUl9JRCwKKyAgICAgICAgUENJRV9NQVBMRV82ODYzX1NLVV9ERVZJQ0VfSUQsCisgICAgICAgIDAsCisgICAgICAgICZkZXZfaW5mby0+cGNpQnVzTm8sCisgICAgICAgICZkZXZfaW5mby0+cGNpRGV2Tm8sCisgICAgICAgICZkZXZfaW5mby0+cGNpRnVuY05vKTsKKworICAgIGlmIChPSyA9PSByZXRfc3RhdHVzKQorICAgIHsKKyAgICAgICAgZGV2aWNlX2lkID0gUENJRV9NQVBMRV82ODYzX1NLVV9ERVZJQ0VfSUQ7CisgICAgICAgIGdvdG8gZm91bmRfZGV2aWNlX2lkOworICAgIH0KKworICAgIC8vIGZpbmQgbWFwbGUgZXBvbiBkZXZpY2UKKyAgICByZXRfc3RhdHVzID0gcGNpRmluZERldmljZShQQ0lFX01BUExFX1ZFTkRPUl9JRCwKKyAgICAgICAgUENJRV9NQVBMRV9FUE9OX0RFVklDRV9JRCwKKyAgICAgICAgMCwKKyAgICAgICAgJmRldl9pbmZvLT5wY2lCdXNObywKKyAgICAgICAgJmRldl9pbmZvLT5wY2lEZXZObywKKyAgICAgICAgJmRldl9pbmZvLT5wY2lGdW5jTm8pOworCisgICAgaWYgKE9LID09IHJldF9zdGF0dXMpCisgICAgeworICAgICAgICBkZXZpY2VfaWQgPSBQQ0lFX01BUExFX0VQT05fREVWSUNFX0lEOworICAgICAgICBnb3RvIGZvdW5kX2RldmljZV9pZDsKKyAgICB9CisKKyAgICBwcmludGYoIkNhbid0IGZpbmQgYW55IGRldmljZVslZF1cbiIsIFBDSUVfTUFQTEVfVkVORE9SX0lEKTsKKyAgICByZXR1cm4gQkNNX0VSUl9OT0RFVjsKKworZm91bmRfZGV2aWNlX2lkOgorICAgIHByaW50ZigiRm91bmQgbWFwbGUgZGV2aWNlWyV4IC0gJXhdXG4iLCBQQ0lFX01BUExFX1ZFTkRPUl9JRCwgZGV2aWNlX2lkKTsKKworICAgIC8vIGluaXQgICAgCisgICAgZGV2X2luZm8tPmRldmljZWlkID0gKGNydF9kZXZpY2UgLSAxKTsKKyAgICBkZXZfaW5mby0+cGRldiA9IE5VTEw7CisKKworICAgIC8vIEVuYWJsZSBQQ0kgYWRkcmVzcyBtYXAKKyAgICBwY2lDb25maWdJbkJ5dGUoZGV2X2luZm8tPnBjaUJ1c05vLAorICAgICAgICAgICAgICAgICAgICBkZXZfaW5mby0+cGNpRGV2Tm8sCisgICAgICAgICAgICAgICAgICAgIGRldl9pbmZvLT5wY2lGdW5jTm8sCisgICAgICAgICAgICAgICAgICAgIFBDSV9DRkdfQ09NTUFORCwKKyAgICAgICAgICAgICAgICAgICAgKFVJTlQ4ICopJnJlYWR2YWxiKTsKKyAgICBwcmludGYoIkNNRCByZWcgPSAweCV4XG4iLCByZWFkdmFsYik7CisKKyAgICByZWFkdmFsYiB8PSAweDY7CisgICAgcGNpQ29uZmlnT3V0Qnl0ZShkZXZfaW5mby0+cGNpQnVzTm8sCisgICAgICAgICAgICAgICAgICAgIGRldl9pbmZvLT5wY2lEZXZObywKKyAgICAgICAgICAgICAgICAgICAgZGV2X2luZm8tPnBjaUZ1bmNObywKKyAgICAgICAgICAgICAgICAgICAgUENJX0NGR19DT01NQU5ELAorICAgICAgICAgICAgICAgICAgICAoVUlOVDgpcmVhZHZhbGIpOworCisgICAgcGNpQ29uZmlnSW5CeXRlKGRldl9pbmZvLT5wY2lCdXNObywKKyAgICAgICAgICAgICAgICAgICAgZGV2X2luZm8tPnBjaURldk5vLAorICAgICAgICAgICAgICAgICAgICBkZXZfaW5mby0+cGNpRnVuY05vLAorICAgICAgICAgICAgICAgICAgICBQQ0lfQ0ZHX0NPTU1BTkQsCisgICAgICAgICAgICAgICAgICAgIChVSU5UOCAqKSZyZWFkdmFsYik7CisgICAgcHJpbnRmKCJBZGp1c3RlZCBDTUQgcmVnID0gMHgleFxuIiwgcmVhZHZhbGIpOworCisgICAgLy8gSW5pdCBiYXNlIGFkZHJlc3NlcworICAgIGRldl9pbmZvLT5kZXZpY2Uuc29jX3JlZ3NfYmFzZSA9IDB4ZTAwMDAwMDA7CisgICAgZGV2X2luZm8tPmRldmljZS5zb2Nfc3JhbV9iYXNlID0gMHhlMjAwMDAwMDsKKyAgICBkZXZfaW5mby0+ZGV2aWNlLnNvY19kZHJfYmFzZSAgPSAweGUxMDAwMDAwOworICAgIGRldl9pbmZvLT5kZXZpY2Uuc29jX2Rkcl9sZW5ndGggPSAweDEwMDAwMDA7IC8vIDE2TQorCisgICAgLy8gaW5pdCBpbnRlcnJ1cHQgbGluZQorICAgIHJlYWR2YWxiID0gUENJRTFfSU5UX0xJTkU7CisgICAgcGNpQ29uZmlnT3V0Qnl0ZShkZXZfaW5mby0+cGNpQnVzTm8sCisgICAgICAgICAgICAgICAgICAgIGRldl9pbmZvLT5wY2lEZXZObywKKyAgICAgICAgICAgICAgICAgICAgZGV2X2luZm8tPnBjaUZ1bmNObywKKyAgICAgICAgICAgICAgICAgICAgUENJX0NGR19ERVZfSU5UX0xJTkUsCisgICAgICAgICAgICAgICAgICAgIChVSU5UOClyZWFkdmFsYik7CisgICAgcGNpQ29uZmlnSW5CeXRlKGRldl9pbmZvLT5wY2lCdXNObywKKyAgICAgICAgICAgICAgICAgICAgZGV2X2luZm8tPnBjaURldk5vLAorICAgICAgICAgICAgICAgICAgICBkZXZfaW5mby0+cGNpRnVuY05vLAorICAgICAgICAgICAgICAgICAgICBQQ0lfQ0ZHX0RFVl9JTlRfTElORSwKKyAgICAgICAgICAgICAgICAgICAgKFVJTlQ4ICopJnJlYWR2YWxiKTsKKyAgICBwcmludGYoIkFkanVzdGVkIElOVCBMaW5lIHJlZyA9IDB4JXhcbiIsIHJlYWR2YWxiKTsKKworICAgIC8vIGluaXQgaW50ZXJydXB0CisgICAgZGV2X2luZm8tPmRldmljZS5pcnEgPSBQQ0lFMV9JVl8wOworICAgIGRldl9pbmZvLT5kZXZfc3RhdHVzX2lycSA9IFBDSUUxX0lWXzE7CisKKyAgICAvLyByZWFkIHJldmlzaW9uIHJlZ2lzdGVyCisgICAgcmVhZHZhbCA9IGJjbV9wY2lfcmVhZDMyKCh1aW50MzJfdCAqKShkZXZfaW5mby0+ZGV2aWNlLnNvY19yZWdzX2Jhc2UgKyBQQ0lFX1JFVklTSU9OX1JFR0lTVEVSX09GRlNFVCkpOworICAgIHByaW50ZigicmVhZHZhbCA9IDB4JXhcbiIsIHJlYWR2YWwpOworICAgIHByaW50ZigiQ2FyZCAlZCB2ZXJzaW9uIG1ham9yPSUwMnggbWlub3I9JTAyeFxuIiwKKyAgICAgICAgICAgICAgICBkZXZfaW5mby0+ZGV2aWNlaWQsIAorICAgICAgICAgICAgICAgICgocmVhZHZhbCAmIDB4MDAwMGZmMDApID4+IDgpLAorICAgICAgICAgICAgICAgIChyZWFkdmFsICYgMHgwMDAwMDBmZikpOyAKKyAgICAKKyAgICAvLyByZWFkIHN0YXR1cyByZWdpc3RlcgorICAgIHJlYWR2YWwgPSBiY21fcGNpX3JlYWQzMigodWludDMyX3QgKikoZGV2X2luZm8tPmRldmljZS5zb2NfcmVnc19iYXNlICsgUENJRV9TVEFUVVNfUkVHSVNURVJfT0ZGU0VUKSk7CisgICAgcHJpbnRmKCJyZWFkdmFsID0gMHgleFxuIiwgcmVhZHZhbCk7CisgICAgZGV2X2luZm8tPmVycl9zdGF0dXMgPSAocmVhZHZhbCAmIDB4MDAwMDAwMGYpOworICAgIGRldl9pbmZvLT5waHlsaW5rICAgID0gKChyZWFkdmFsID4+IDQpICYgMHgxKTsKKyAgICBkZXZfaW5mby0+ZGF0YWxpbmsgICA9ICgocmVhZHZhbCA+PiA1KSAmIDB4MSk7CisgICAgZGV2X2luZm8tPnByZXZfZGF0YWxpbmsgID0gZGV2X2luZm8tPmRhdGFsaW5rOworCisgICAgLy8gY29ubmVjdCBJTlQgZm9yIGRldmljZSBzdGF0dXMKKyAgICBiY21vc19mYXN0bG9ja19pbml0KCZkZXZfaW5mby0+bG9jaywgMCk7CisgICAgYmNtb3NfaW50X2Nvbm5lY3QoKGludClkZXZfaW5mby0+ZGV2X3N0YXR1c19pcnEsIAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgCisgICAgICAgICAgICAgICAgICAgICAgICBCQ01PU19JUlFfU0hBUkVELCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldl9zdGF0dXNfaW50ZXJydXB0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICJzdGF0dXNfaXNyIiwgCisgICAgICAgICAgICAgICAgICAgICAgICBkZXZfaW5mbyk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqIEdldCBNYXBsZSBkZXZpY2Ugb2JqZWN0IHN0cnVjdAorICogXGNydCBkZXZpZSBpbmRleCxzdGFydCBmcm9tIDAKKyAqLworc3RhdGljIG1hcGxlX2RldmljZV9pbmZvICpnZXRfbWFwbGVfcGNpX2luZm8oaW50IGNydCkKK3sKKyAgICBiY21vc19lcnJubyBlcnIgPSBCQ01fRVJSX09LOworICAgIHVpbnQzMl90IHJlYWR2YWwgPSAwOworICAgIG1hcGxlX2RldmljZV9pbmZvICpkZXZpY2VfaW5mbyA9IE5VTEw7CisKKyAgICAvKiBjaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KKyAgICBpZiAoTUFQTEVfTUFYX0RFVklDRVMgPD0gY3J0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGRldmljZV9pbmZvID0gJmRldmljZXNbY3J0XTsKKworICAgIC8qIHJlYWQgc3RhdHVzIHJlZ2lzdGVyICovCisgICAgcmVhZHZhbCA9IGJjbV9wY2lfcmVhZDMyKCh1aW50MzJfdCAqKShkZXZpY2VfaW5mby0+ZGV2aWNlLnNvY19yZWdzX2Jhc2UgKyBQQ0lFX1NUQVRVU19SRUdJU1RFUl9PRkZTRVQpKTsKKyAgICBkZXZpY2VfaW5mby0+ZXJyX3N0YXR1cyA9IChyZWFkdmFsICYgMHgwMDAwMDAwZik7CisgICAgZGV2aWNlX2luZm8tPnBoeWxpbmsgICAgPSAoKHJlYWR2YWwgPj4gNCkgJiAweDEpOworICAgIGRldmljZV9pbmZvLT5kYXRhbGluayAgID0gKChyZWFkdmFsID4+IDUpICYgMHgxKTsKKworICAgIC8qIHJldHVybiBkZXZpY2UgKi8KKyAgICByZXR1cm4gZGV2aWNlX2luZm87Cit9CisKKy8qKiBSZWdpc3RlciBzdGF0dXMgY2hhbmdlIG5vdGlmaWNhdGlvbiBjYWxsYmFjaworICogXHBhcmFtW2luXSAgIGNiICAgICAgU3RhdHVzIGNoYW5nZSBub3RpZmljYXRpb24gY2FsbGJhY2sKKyAqIFxyZXR1cm4gMD1PSyBvciBlcnJvciA8MCAKKyAqLworYmNtb3NfZXJybm8gYmNtX2xsX3BjaWVfc3RhdHVzX2NoYW5nZV9yZWdpc3RlcihiY21fbGxfcGNpZV9zdGF0dXNfY2hhbmdlIGNiKQoreworICAgIGludCBpOworICAgIG1hcGxlX2RldmljZV9pbmZvICpkZXZfaW5mbzsgCisgICAgCisgICAgY2FsbGJhY2sgPSBjYjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY3J0X2RldmljZTsgaSsrKQorICAgIHsKKyAgICAgICAgZGV2X2luZm8gPSBnZXRfbWFwbGVfcGNpX2luZm8oaSk7CisgICAgICAgIGNhbGxiYWNrKGksIGRldl9pbmZvLT5kYXRhbGluayk7CisgICAgfQorICAgIAorICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiogVW5yZWdpc3RlciBzdGF0dXMgY2hhbmdlIG5vdGlmaWNhdGlvbiBjYWxsYmFjaworICogXHJldHVybiAwPU9LIG9yIGVycm9yIDwwCisgKi8KK2JjbW9zX2Vycm5vIGJjbV9sbF9wY2llX3N0YXR1c19jaGFuZ2VfdW5yZWdpc3Rlcih2b2lkKQoreworICAgIGNhbGxiYWNrID0gTlVMTDsKKyAgICAKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqIFF1ZXJ5IFBDSWUgZGV2aWNlCisgKiBccGFyYW1baW5dICAgZGV2X2lkICBEZXZpY2UgaWQKKyAqIFxwYXJhbVtvdXRdICBpbmZvICAgIERldmljZSBpbmZvCisgKiBccmV0dXJuIDA9T0ssIEJDTV9FUlJfSU8tZGV2X2lkIGlzIGluIHByb3BlciByYW5nZSwgYnV0IGxpbmsgaXMgZG93bgorICovCitiY21vc19lcnJubyBiY21fbGxfcGNpZV9xdWVyeSh1aW50OF90IGRldl9pZCwgYmNtX2xsX2Rldl9pbmZvICppbmZvKQoreworICAgIG1hcGxlX2RldmljZV9pbmZvICpkZXZfaW5mbzsgCisgICAgCisgICAgaWYgKE5VTEwgPT0gaW5mbykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorICAgIAorICAgIGlmIChkZXZfaWQgPCBjcnRfZGV2aWNlKQorICAgIHsKKyAgICAgICAgZGV2X2luZm8gPSBnZXRfbWFwbGVfcGNpX2luZm8oZGV2X2lkKTsKKyAgICAgICAgaWYgKGRldl9pbmZvLT5kYXRhbGluayA9PSBCQ01fTExfUENJRV9MSU5LX0RPV04pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX0lPOworICAgICAgICB9CisKKyAgICAgICAgKmluZm8gPSBkZXZfaW5mby0+ZGV2aWNlOworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7ICAgCit9CisKKy8qKiBHZXQgbG93LWxldmVsIGRldmljZSBoYW5kbGUKKyAqIFxwYXJhbVtpbl0gICBkZXZfaWQgIERldmljZSBpZAorICogXHBhcmFtW291dF0gIGxsZGV2ICAgTG93LWxldmVsIGRldmljZSBoYW5kbGUgCisgKiBccmV0dXJuIGRldmljZSBoYW5kbGUgb3IgTlVMTCBpZiBsaW5rIGlzIGRvd24KKyAqLworYmNtX2xsX3BjaWVfZGV2IGJjbV9sbF9wY2llX2Rldl9nZXQodWludDhfdCBkZXZfaWQpCit7CisgICAgbWFwbGVfZGV2aWNlX2luZm8gKmRldl9pbmZvOyAKKyAgICAKKyAgICBpZiAoZGV2X2lkIDwgTUFQTEVfTUFYX0RFVklDRVMpCisgICAgeworICAgICAgICBkZXZfaW5mbyA9IGdldF9tYXBsZV9wY2lfaW5mbyhkZXZfaWQpOworICAgICAgICByZXR1cm4gZGV2X2luZm8tPnBkZXY7CisgICAgfSAKKyAgICAKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoqIEhvc3QgcmVzZXQgZW5hYmxlIAorICogXGVuYWJsZWQgCisgKi8KK2JjbW9zX2Vycm5vIGJjbV9sbF9wY2llX2hvc3RfcmVzZXRfZW5hYmxlKHVpbnQ4X3QgZGV2X2lkLCBiY21vc19ib29sIGVuYWJsZWQpCit7CisgICAgdWludDMyX3QgdmFsOworCisgICAgdmFsID0gZW5hYmxlZCA/IDAgOiAxOworICAgIGJjbV9wY2lfd3JpdGUzMigodWludDMyX3QgKikoZGV2aWNlc1tkZXZfaWRdLmRldmljZS5zb2NfcmVnc19iYXNlICsgUENJRV9IQVJEX0RFQlVHX1JFR0lTVEVSX09GRlNFVCkgLCB2YWwpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvbGxfcGNpZS92eHdvcmtzL2JjbW9sdF9sbHBjaWUuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvbGxfcGNpZS92eHdvcmtzL2JjbW9sdF9sbHBjaWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDg0OTc2Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9sbF9wY2llL3Z4d29ya3MvYmNtb2x0X2xscGNpZS5oCkBAIC0wLDAgKzEsMTA1IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisvKgorICogYmNtX2xscGNpZS5oIC0gTG93LWxldmVsIFBDSWUgZHJpdmVyIGludGVyZmFjZQorICovCisKKyNpZm5kZWYgQkNNT0xUX0xMUENJRV9IXworI2RlZmluZSBCQ01PTFRfTExQQ0lFX0hfCisKKyNpbmNsdWRlICJiY21vc19zeXN0ZW0uaCIKKyNkZWZpbmUgTUFQTEVfTUFYX0RFVklDRVMgICAgICAgICAgICAgICAxIC8qIDUgKi8KKworLyoqIExvdy1sZXZlbCBkZXZpY2UgaW5mbyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2xsX2Rldl9pbmZvCit7CisgICAgdW5zaWduZWQgbG9uZyAgIHNvY19yZWdzX2Jhc2U7ICAgICAgLyoqPCBEZXZpY2UgcmVnaXN0ZXJzIGJhc2UgaW4gaG9zdCBhZGRyZXNzIHNwYWNlICovCisgICAgdW5zaWduZWQgbG9uZyAgIHNvY19zcmFtX2Jhc2U7ICAgICAgLyoqPCBEZXZpY2UgU1JBTSBiYXNlIGluIGhvc3QgYWRkcmVzcyBzcGFjZSAqLworICAgIHVuc2lnbmVkIGxvbmcgICBzb2NfZGRyX2Jhc2U7ICAgICAgIC8qKjwgRGV2aWNlIEREUiBiYXNlIGluIGhvc3QgYWRkcmVzcyBzcGFjZSAqLworICAgIHVpbnQzMl90ICAgICAgICBzb2NfZGRyX2xlbmd0aDsgICAgIC8qKjwgRGV2aWNlIEREUiB3aW5kb3cgc2l6ZSAqLworICAgIHVpbnQzMl90ICAgICAgICBpcnE7ICAgICAgICAgICAgICAgIC8qKjwgRGV2aWNlIGlycSBudW1iZXIgKi8KK30gYmNtX2xsX2Rldl9pbmZvOworCisvKiogRGV2aWNlIFBDSWUgbGluayBzdGF0dXMgY2hhbmdlIG5vdGlmaWNhdGlvbiBjYWxsYmFjayAqLwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNX0xMX1BDSUVfTElOS19ET1dOLCAgICAgICAgICAgICAvKio8IFBDSWUgbGluayBpcyBkb3duICovCisgICAgQkNNX0xMX1BDSUVfTElOS19VUCwgICAgICAgICAgICAgICAvKio8IFBDSWUgbGluayBpcyB1cCAqLworfSBiY21fbGxfcGNpZV9saW5rX3N0YXR1czsKKworLyoqIExvdy1sZXZlbCBkZXZpY2UgaGFuZGxlICovCit0eXBlZGVmIHZvaWQgKmJjbV9sbF9wY2llX2RldjsKKworLyoqIFN0YXR1cyBjaGFuZ2UgaW5kaWNhdGlvbiAqLwordHlwZWRlZiB2b2lkICgqYmNtX2xsX3BjaWVfc3RhdHVzX2NoYW5nZSkodWludDhfdCBkZXZfaWQsIGJjbV9sbF9wY2llX2xpbmtfc3RhdHVzIHN0YXR1cyk7CisKKy8qKiBSZWdpc3RlciBzdGF0dXMgY2hhbmdlIG5vdGlmaWNhdGlvbiBjYWxsYmFjaworICogXHBhcmFtW2luXSAgIGNiICAgICAgU3RhdHVzIGNoYW5nZSBub3RpZmljYXRpb24gY2FsbGJhY2sKKyAqIFxyZXR1cm4gMD1PSyBvciBlcnJvciA8MAorICovCitiY21vc19lcnJubyBiY21fbGxfcGNpZV9zdGF0dXNfY2hhbmdlX3JlZ2lzdGVyKGJjbV9sbF9wY2llX3N0YXR1c19jaGFuZ2UgY2IpOworCisvKiogVW5yZWdpc3RlciBzdGF0dXMgY2hhbmdlIG5vdGlmaWNhdGlvbiBjYWxsYmFjaworICogXHJldHVybiAwPU9LIG9yIGVycm9yIDwwCisgKi8KK2JjbW9zX2Vycm5vIGJjbV9sbF9wY2llX3N0YXR1c19jaGFuZ2VfdW5yZWdpc3Rlcih2b2lkKTsKKworLyoqIFF1ZXJ5IFBDSWUgZGV2aWNlCisgKiBccGFyYW1baW5dICAgZGV2X2lkICBEZXZpY2UgaWQKKyAqIFxwYXJhbVtvdXRdICBpbmZvICAgIERldmljZSBpbmZvCisgKiBccmV0dXJuIDA9T0ssIEJDTV9FUlJfSU8tZGV2X2lkIGlzIGluIHByb3BlciByYW5nZSwgYnV0IGxpbmsgaXMgZG93bgorICovCitiY21vc19lcnJubyBiY21fbGxfcGNpZV9xdWVyeSh1aW50OF90IGRldl9pZCwgYmNtX2xsX2Rldl9pbmZvICppbmZvKTsKKworLyoqIEdldCBsb3ctbGV2ZWwgZGV2aWNlIGhhbmRsZQorICogXHBhcmFtW2luXSAgIGRldl9pZCAgRGV2aWNlIGlkCisgKiBccGFyYW1bb3V0XSAgbGxkZXYgICBMb3ctbGV2ZWwgZGV2aWNlIGhhbmRsZSAKKyAqIFxyZXR1cm4gZGV2aWNlIGhhbmRsZSBvciBOVUxMIGlmIGxpbmsgaXMgZG93bgorICovCitiY21fbGxfcGNpZV9kZXYgYmNtX2xsX3BjaWVfZGV2X2dldCh1aW50OF90IGRldl9pZCk7CisKKy8qKiBFbmFibGUvZGlzYWJsZSBob3N0IHJlc2V0IGZvciBhbGwgUENJZSBpbnRlcmZhY2VzIChhdXRvbWF0aWMKKyAqICBkZXZpY2UgcmVzZXQgd2hlbiBob3N0IGlzIHJlc2V0KQorICogXHBhcmFtW2luXSAgIGVuYWJsZWQgV2hldGhlciBvciBub3QgaG90IHJlc2V0IHNob3VsZCBiZSBlbmFibGVkCisgKiBccmV0dXJuIDA9T0sgb3IgZXJyb3IgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtX2xsX3BjaWVfaG9zdF9yZXNldF9lbmFibGUodWludDhfdCBkZXZfaWQsIGJjbW9zX2Jvb2wgZW5hYmxlZCk7CisKKyNpZmRlZiBUWF9FTkFCTEVfRVZFTlRfVFJBQ0UKKy8qKiBIYW5kbGUgbG93LWxldmVsIHRyYWNlIG9uIHRhcmdldAorICogXHBhcmFtW2luXSAgIGRldl9pZCAgRGV2aWNlIGlkCisgKiBccGFyYW1baW5dICBsZmlsZSBuYW1lIGZvciB0cmFjZQorICogXHJldHVybiBkZXZpY2UgaGFuZGxlIG9yIE5VTEwgaWYgbGluayBpcyBkb3duCisgKi8KK2JjbW9zX2Vycm5vIGJjbV9sbF9wY2llX3NldHJhY2UodWludDhfdCBkZXZfaWQpOworYmNtb3NfZXJybm8gYmNtX2xsX3BjaWVfY2xlYXJ0cmFjZSh1aW50OF90IGRldl9pZCk7CitiY21vc19lcnJubyBiY21fbGxfcGNpZV9zYXZldHJhY2UodWludDhfdCBkZXZfaWQsIGNoYXIgKnRyYWNlZmlsZW5hbWUpOworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvbGxfcGNpZS92eHdvcmtzL211bHRpX2RldmljZS9iY21vbHRfbGxwY2llLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2xsX3BjaWUvdnh3b3Jrcy9tdWx0aV9kZXZpY2UvYmNtb2x0X2xscGNpZS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFkZTc0NzUKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2xsX3BjaWUvdnh3b3Jrcy9tdWx0aV9kZXZpY2UvYmNtb2x0X2xscGNpZS5jCkBAIC0wLDAgKzEsNTA1IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyovIAorCisjaW5jbHVkZSA8dnhXb3Jrcy5oPgorI2luY2x1ZGUgPGRydi9wY2kvcGNpQ29uZmlnTGliLmg+CisjaW5jbHVkZSAiYmNtb2x0X2xscGNpZS5oIgorCisvKiBEZWZpbmUgUENJRSBkZXZpY2UgQkFSIHJlZ2lzdGVycyAqLworI2RlZmluZSBCQVJfUkVHUyAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQkFSX0REUiAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIEJBUl9TUkFNICAgICAgICAgICAgICAgICAgICAgICAgNAorCisvKiAKK0RlZmluZSBQQ0lFIGRldmljZSBCQVIgc3BhY2UgbGVuZ3RoOgorICAgIGJhciAwID0gOCAgTWJ5dGUgcmVnaXN0ZXIgc3BhY2UgCisgICAgYmFyIDIgPSAxNiBNYnl0ZSBERFIgc3BhY2UgCisgICAgYmFyIDQgPSA2NCBLYnl0ZSBTUkFNIHNwYWNlCisqLworI2RlZmluZSBNQVBMRV9SRUdTX0xFTkdUSCAgICAgICAgICAgICAgICAgICAweDAwODAwMDAwCisjZGVmaW5lIE1BUExFX0REUl9MRU5HVEggICAgICAgICAgICAgICAgICAgIDB4MDEwMDAwMDAKKyNkZWZpbmUgTUFQTEVfU1JBTV9MRU5HVEggICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAorCisvKiBEZWZpbmUgc3BlY2lhbCByZWdpc3RlcnMgYWRkcmVzcyAqLworI2lmZGVmIFRYX0VOQUJMRV9FVkVOVF9UUkFDRQorI2RlZmluZSBQQ0lFX1BDSUVfMF9NSVNDX0NQVV8yX1BDSUVfTUVNX1dJTjFfTE8JCQkweDA2NDAxNFUJCisjZGVmaW5lIFBDSUVfUENJRV8wX01JU0NfQ1BVXzJfUENJRV9NRU1fV0lOMV9ISQkJCTB4MDY0MDE4VQorI2RlZmluZSBQQ0lFX1BDSUVfMF9NSVNDX0NQVV8yX1BDSUVfTUVNX1dJTjFfQkFTRV9MSU1JVAkweDA2NDA3NFUJCisjZW5kaWYKKyNkZWZpbmUgUENJRV9SRVZJU0lPTl9SRUdJU1RFUl9PRkZTRVQgICAgICAgMHg2NDA2QyAvKiBQQ0lFX1BDSUVfUENJRV8wX1BDSUVfUENJRV8wX01JU0NfUkVWSVNJT04gICAgKi8KKyNkZWZpbmUgUENJRV9TVEFUVVNfUkVHSVNURVJfT0ZGU0VUICAgICAgICAgMHg2NDA2OCAvKiBQQ0lFX1BDSUVfUENJRV8wX1BDSUVfUENJRV8wX01JU0NfUENJRV9TVEFUVVMgKi8KKyNkZWZpbmUgUENJRV9IQVJEX0RFQlVHX1JFR0lTVEVSX09GRlNFVCAgICAgMHg2NDIwNFUgLyogUENJRV9QQ0lFX1BDSUVfMF9QQ0lFX1BDSUVfMF9NSVNDX0hBUkRfREVCVUcgICovCisjZGVmaW5lIFBDSUVfSU5UX1NUQVRVU19SRUdJU1RFUl9PRkZTRVQgICAgIDB4Njk0MDAgLyogUENJRV9QQ0lFX1BDSUVfMF9DUFVfSU5UUjFfSU5UUl9TVEFUVVMgICAgICAgICovCisjZGVmaW5lIFBDSUVfSU5UX0NMRUFSX01BU0tfT0ZGU0VUICAgICAgICAgIDB4Njk0MEMgLyogUENJRV9QQ0lFX1BDSUVfMF9DUFVfSU5UUjFfSU5UUl9NQVNLX0NMRUFSICAgICovCisjZGVmaW5lIFBDSUVfSU5UUjFfU1RBVFVTX1JFR0lTVEVSX09GRlNFVCAgIDB4NjkzMDAgLyogSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLyAgICAgICAJCisKKy8qIE1hcGxlIGRldmljZSBJRCAqLworI2RlZmluZSBQQ0lFX01BUExFX1ZFTkRPUl9JRCAgICAgICAgICAgICAgICAweDE0RTQgLyogUENJRV9DRkdfVFlQRTBfRVBfU1VCU1lTVEVNX0lEX1ZFTkRPUl9JRCAgICAgICovCisjZGVmaW5lIFBDSUVfTUFQTEVfREVWSUNFX0lEICAgICAgICAgICAgICAgIDB4Njg2MiAKKyNkZWZpbmUgUENJRV9NQVBMRV82ODYzX1NLVV9ERVZJQ0VfSUQgICAgICAgMHg2ODYzCisjZGVmaW5lIFBDSUVfTUFQTEVfRVBPTl9ERVZJQ0VfSUQgICAgICAgICAgIDB4NTU1NAorCisvKiBEZWZpbmUgaW50ZXJydXB0IHZlY3RvciBudW1iZXIgZm9yIE1QQzgzMDggKi8KKyNkZWZpbmUgRFJWX1BDSUVfSU5UX0lSUV9CQVNFIDk2CisjZGVmaW5lIFBDSUVfREVWMF9JVl8wICAgKERSVl9QQ0lFX0lOVF9JUlFfQkFTRSArIDI0KQorI2RlZmluZSBQQ0lFX0RFVjBfSVZfMSAgIChEUlZfUENJRV9JTlRfSVJRX0JBU0UgKyAyNSkKKyNkZWZpbmUgUENJRV9ERVYxX0lWXzAgICAoRFJWX1BDSUVfSU5UX0lSUV9CQVNFICsgMCkKKyNkZWZpbmUgUENJRV9ERVYxX0lWXzEgICAoRFJWX1BDSUVfSU5UX0lSUV9CQVNFICsgMSkKKworLyogTWFwbGUgZGV2aWNlIG9iamVjdCBzdHJ1Y3QgKi8KK3R5cGVkZWYgc3RydWN0ICAKK3sKKyAgICB1aW50MzJfdCBsbHBjaWVfaXJxOworICAgIHVpbnQzMl90IGxscGNpZV9zdGF0dXNfaXJxOworfSBtYXBsZV9sbHBjaWVfZGV2aWNlX2lycXM7CisKK21hcGxlX2xscGNpZV9kZXZpY2VfaXJxcyBsbHBjaWVfZGV2aWNlX2lycXNbQkNNT0xUX01BWF9NQVBMRV9ERVZJQ0VTXSA9Cit7CisgICAge1BDSUVfREVWMF9JVl8wLFBDSUVfREVWMF9JVl8xfSwKKyAgICB7UENJRV9ERVYxX0lWXzAsUENJRV9ERVYxX0lWXzF9Cit9OworCisKKyNpZmRlZiBMTFBDSUVfU0VUX0JBU0VfQUREUkVTU0VTX01BTlVBTExZIAorCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAgICB1bnNpZ25lZCBsb25nICAgc29jX3JlZ3NfYmFzZTsgICAgICAvKio8IERldmljZSByZWdpc3RlcnMgYmFzZSBpbiBob3N0IGFkZHJlc3Mgc3BhY2UgKi8KKyAgICB1bnNpZ25lZCBsb25nICAgc29jX3NyYW1fYmFzZTsgICAgICAvKio8IERldmljZSBTUkFNIGJhc2UgaW4gaG9zdCBhZGRyZXNzIHNwYWNlICovCisgICAgdW5zaWduZWQgbG9uZyAgIHNvY19kZHJfYmFzZTsgICAgICAgLyoqPCBEZXZpY2UgRERSIGJhc2UgaW4gaG9zdCBhZGRyZXNzIHNwYWNlICovCisKK30gbWFwbGVfbGxwY2llX2Jhc2VfYWRkcmVzc2VzOworCittYXBsZV9sbHBjaWVfYmFzZV9hZGRyZXNzZXMgbGxwY2llX2Jhc2VfYWRkcmVzc2VzW0JDTU9MVF9NQVhfTUFQTEVfREVWSUNFU10gPQoreworICAgICB7LnNvY19yZWdzX2Jhc2UgPSAweGUwMDAwMDAwLCAuc29jX3NyYW1fYmFzZSA9IDB4ZTIwMDAwMDAsIC5zb2NfZGRyX2Jhc2UgID0gMHhlMTAwMDAwMH0sCisgICAgIC8qIGluIHRoaXMgZXhhbXBsZSB0aGVyZSBpcyBvbmx5IG9uZSBkZXZpY2UqLworICAgICB7LnNvY19yZWdzX2Jhc2UgPSAweDAwMDAwMDAwLCAuc29jX3NyYW1fYmFzZSA9IDB4MDAwMDAwMDAsIC5zb2NfZGRyX2Jhc2UgID0gMHgwMDAwMDAwMH0KK307CisjZW5kaWYKKworLyogTWFwbGUgZGV2aWNlIG9iamVjdCBzdHJ1Y3QgKi8KK3R5cGVkZWYgc3RydWN0ICAKK3sKKyAgICBiY21fbGxfZGV2X2luZm8gIGRldmljZTsKKyAgICBiY21vc19mYXN0bG9jayAgIGxvY2s7CisgICAgaW50ICAgICAgICAgICAgICBlcnJfc3RhdHVzOworICAgIGludCAgICAgICAgICAgICAgcGh5bGluazsKKyAgICBpbnQgICAgICAgICAgICAgIHByZXZfZGF0YWxpbms7CisgICAgaW50ICAgICAgICAgICAgICBkYXRhbGluazsKKyAgICB1aW50MzJfdCAgICAgICAgIGRldmljZWlkOyAgLy8gc3RhcnQgZnJvbSAwCisgICAgdW5zaWduZWQgaW50ICAgICp0cmFjZWFkZHI7CisgICAgdm9pZCAgKnBkZXY7CisgICAgaW50IHBjaUJ1c05vOyAgICAgICAvKiBQQ0kgYnVzIG51bWJlciAqLworICAgIGludCBwY2lEZXZObzsgICAgICAgLyogUENJIGRldmljZSBudW1iZXIgKi8KKyAgICBpbnQgcGNpRnVuY05vOyAgICAgIC8qIFBDSSBmdW5jdGlvbiBudW1iZXIgKi8KKyAgICB1aW50MzJfdCBkZXZfc3RhdHVzX2lycTsKK30gbWFwbGVfZGV2aWNlX2luZm87CisKKy8qIE1hcGxlIGRldmljZSBvYmplY3RzICovCittYXBsZV9kZXZpY2VfaW5mbyBnX21hcGxlX2RldnNfaW5mb1tCQ01PTFRfTUFYX01BUExFX0RFVklDRVNdOworCitpbnQgZ19tYXBsZV9kZXZfbnVtID0gMDsKKworLyogRGV2aWNlIFBDSUUgaW50ZXJmYWNlIHN0YXR1cyBjaGFuZ2UgY2FsbGJhY2sgKi8KK2JjbV9sbF9wY2llX3N0YXR1c19jaGFuZ2UgZ19kZXZfc3RhdHVzX2NoYW5nZV9jYjsKKworLyoqIERldmljZSBzdGF0dXMgY2hhbmdlIElTUgorICogXGlycSAgICAgICAgICBJUlEgbnVtYmVyCisgKiBcZGV2X2luc3RhbmNlIGRldmljZSBvYmplY3QgCisgKi8KK2ludCBkZXZfc3RhdHVzX2ludGVycnVwdCAoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlKQoreworICAgIHVpbnQzMl90IHJlZ192YWx1ZSA9IDA7CisgICAgbWFwbGVfZGV2aWNlX2luZm8gKmRldmljZV9pbmZvID0gTlVMTDsgICAKKyAgICBsb25nIGZsYWdzID0gMDsKKyAgICBpbnQgaGFuZGxlZCA9IDA7CisgICAgdWludDMyX3QgZGV2X2lkID0gMDsKKyAgICAKKyAgICBkZXZpY2VfaW5mbyA9IChtYXBsZV9kZXZpY2VfaW5mbyAqKWRldl9pbnN0YW5jZTsKKyAgICBkZXZfaWQgPSBkZXZpY2VfaW5mby0+ZGV2aWNlaWQ7CisgICAgCisgICAgZmxhZ3MgPSBiY21vc19mYXN0bG9ja19sb2NrKCZkZXZpY2VfaW5mby0+bG9jayk7CisKKyAgICByZWdfdmFsdWUgPSBiY21fcGNpX3JlYWQzMigodWludDMyX3QgKikoZGV2aWNlX2luZm8tPmRldmljZS5zb2NfcmVnc19iYXNlICsgUENJRV9JTlRfU1RBVFVTX1JFR0lTVEVSX09GRlNFVCkpOworICAgIHsKKyAgICAgICAgaWYgKGRldmljZV9pbmZvLT5kYXRhbGluayAhPSBkZXZpY2VfaW5mby0+cHJldl9kYXRhbGluaykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGRldmljZV9pbmZvLT5kYXRhbGluayA9PSBCQ01fTExfUENJRV9MSU5LX1VQKQorICAgICAgICAgICAgICAgIHByaW50ZigiRGV2aWNlPSVkIDogTGluayBpcyB1cCAhISFcbiIsIGRldl9pZCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJEZXZpY2U9JWQgOiBMaW5rIGlzIGRvd24gISEhXG4iLCBkZXZfaWQpOworICAgICAgICAgICAgICAgIHByaW50ZigicGh5IHN0YXR1cyA9IDB4JXggZXJyb3Igc3RhdHVzID0gMHgleFxuIiwgZGV2aWNlX2luZm8tPnBoeWxpbmssIGRldmljZV9pbmZvLT5lcnJfc3RhdHVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRldmljZV9pbmZvLT5wcmV2X2RhdGFsaW5rID0gZGV2aWNlX2luZm8tPmRhdGFsaW5rOworICAgICAgICAgICAgaWYgKGdfZGV2X3N0YXR1c19jaGFuZ2VfY2IpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ19kZXZfc3RhdHVzX2NoYW5nZV9jYihkZXZfaWQsIGRldmljZV9pbmZvLT5kYXRhbGluayk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJlZ192YWx1ZSA9IGJjbV9wY2lfcmVhZDMyKAorICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90ICopKGRldmljZV9pbmZvLT5kZXZpY2Uuc29jX3JlZ3NfYmFzZSArIFBDSUVfSU5UUjFfU1RBVFVTX1JFR0lTVEVSX09GRlNFVCkpOworICAgICAgICB7CisgICAgICAgICAgICBoYW5kbGVkID0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBiY21vc19mYXN0bG9ja191bmxvY2soJmRldmljZV9pbmZvLT5sb2NrLCBmbGFncyk7CisgICAgCisgICAgcmV0dXJuIGhhbmRsZWQ7Cit9CisKKy8qKiBNYXBsZSBkZXZpY2UgZGV0ZWN0aW9uIGFuZCBpbml0aWFsaXphdGlvbgorICovCitiY21vc19lcnJubyBiY21fbGxfcGNpZV9pbnRlcmZhY2VfaW5pdCgpCit7CisgICAgU1RBVFVTIHJldF9zdGF0dXM7CisgICAgbWFwbGVfZGV2aWNlX2luZm8gKmRldl9pbmZvID0gTlVMTDsgCisgICAgdWludDMyX3QgcmVhZHZhbCA9IDA7CisgICAgdWludDhfdCByZWFkdmFsYiA9IDA7CisgICAgdWludDMyX3QgcGNpX2Rldl9pZHggPSAwOworCisgICAgcHJpbnRmKCIlcygpXHJcbiIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICAvLyBjaGVjayBtYXBsZSBkZXZpY2UgbnVtYmVyCisgICAgaWYgKGdfbWFwbGVfZGV2X251bSA+PSBCQ01PTFRfTUFYX01BUExFX0RFVklDRVMpCisgICAgeworICAgICAgICBwcmludGYoIk1heGltdW0gTWFwbGUgZGV2aWNlcyBhbHJlYWR5IGRlZmluZWQgKCVkKVxuIiwgQkNNT0xUX01BWF9NQVBMRV9ERVZJQ0VTKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfQUxSRUFEWTsKKyAgICB9IAorCisgICAgLy8gU3VwcG9ydCBtdWx0aXBsZSBNYXBsZSBkZXZpY2VzCisgICAgZm9yIChwY2lfZGV2X2lkeCA9IDA7IHBjaV9kZXZfaWR4IDwgQkNNT0xUX01BWF9NQVBMRV9ERVZJQ0VTOyBwY2lfZGV2X2lkeCsrKQorICAgIHsKKyAgICAgICAgdWludDE2X3QgZGV2aWNlX2lkOworCisgICAgICAgIC8vIEluaXQgZGV2aWNlIG9iamVjdCBzdHJ1Y3QKKyAgICAgICAgZGV2X2luZm8gPSAmZ19tYXBsZV9kZXZzX2luZm9bcGNpX2Rldl9pZHhdOworICAgICAgICBtZW1zZXQoZGV2X2luZm8sIDAsIHNpemVvZihtYXBsZV9kZXZpY2VfaW5mbykpOworICAgICAgICAKKyAgICAgICAgLy8gVHJ5IHRvIGZpbmQgbWFwbGUgZGV2aWNlCisgICAgICAgIHJldF9zdGF0dXMgPSBwY2lGaW5kRGV2aWNlKFBDSUVfTUFQTEVfVkVORE9SX0lELAorICAgICAgICAgICAgUENJRV9NQVBMRV9ERVZJQ0VfSUQsCisgICAgICAgICAgICBwY2lfZGV2X2lkeCwKKyAgICAgICAgICAgICZkZXZfaW5mby0+cGNpQnVzTm8sCisgICAgICAgICAgICAmZGV2X2luZm8tPnBjaURldk5vLAorICAgICAgICAgICAgJmRldl9pbmZvLT5wY2lGdW5jTm8pOworCisgICAgICAgIGlmIChyZXRfc3RhdHVzID09IE9LKQorICAgICAgICB7CisgICAgICAgICAgICBkZXZpY2VfaWQgPSBQQ0lFX01BUExFX0RFVklDRV9JRDsKKyAgICAgICAgICAgIGdvdG8gZm91bmRfZGV2aWNlX2lkOworICAgICAgICB9CisKKyAgICAgICAgcmV0X3N0YXR1cyA9IHBjaUZpbmREZXZpY2UoUENJRV9NQVBMRV9WRU5ET1JfSUQsCisgICAgICAgICAgICBQQ0lFX01BUExFXzY4NjNfU0tVX0RFVklDRV9JRCwKKyAgICAgICAgICAgIHBjaV9kZXZfaWR4LAorICAgICAgICAgICAgJmRldl9pbmZvLT5wY2lCdXNObywKKyAgICAgICAgICAgICZkZXZfaW5mby0+cGNpRGV2Tm8sCisgICAgICAgICAgICAmZGV2X2luZm8tPnBjaUZ1bmNObyk7CisKKyAgICAgICAgaWYgKHJldF9zdGF0dXMgPT0gT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIGRldmljZV9pZCA9IFBDSUVfTUFQTEVfNjg2M19TS1VfREVWSUNFX0lEOworICAgICAgICAgICAgZ290byBmb3VuZF9kZXZpY2VfaWQ7CisgICAgICAgIH0KKworICAgICAgICByZXRfc3RhdHVzID0gcGNpRmluZERldmljZShQQ0lFX01BUExFX1ZFTkRPUl9JRCwKKyAgICAgICAgICAgIFBDSUVfTUFQTEVfRVBPTl9ERVZJQ0VfSUQsCisgICAgICAgICAgICBwY2lfZGV2X2lkeCwKKyAgICAgICAgICAgICZkZXZfaW5mby0+cGNpQnVzTm8sCisgICAgICAgICAgICAmZGV2X2luZm8tPnBjaURldk5vLAorICAgICAgICAgICAgJmRldl9pbmZvLT5wY2lGdW5jTm8pOworCisgICAgICAgIGlmIChyZXRfc3RhdHVzID09IE9LKQorICAgICAgICB7CisgICAgICAgICAgICBkZXZpY2VfaWQgPSBQQ0lFX01BUExFX0VQT05fREVWSUNFX0lEOworICAgICAgICAgICAgZ290byBmb3VuZF9kZXZpY2VfaWQ7CisgICAgICAgIH0KKworICAgICAgICBwcmludGYoIk5vIG1vcmUgZGV2aWNlcywgRm91bmQgJWQgbWFwbGUgZGV2aWNlKHMpXG4iLCBnX21hcGxlX2Rldl9udW0pOworICAgICAgICBicmVhazsKKworZm91bmRfZGV2aWNlX2lkOgorICAgICAgICAvLyBGb3VuZCBuZXcgTWFwbGUgZGV2aWNlCisgICAgICAgIHByaW50ZigiRm91bmQgbWFwbGUgZGV2aWNlWyV4IC0gJXhdWyVkXSBAIEJ1cyAlZCwgRGV2ICVkLCBGdW5jICVkXG4iLCAKKyAgICAgICAgICAgIFBDSUVfTUFQTEVfVkVORE9SX0lELCBQQ0lFX01BUExFX0RFVklDRV9JRCwgcGNpX2Rldl9pZHgsCisgICAgICAgICAgICBkZXZfaW5mby0+cGNpQnVzTm8sIGRldl9pbmZvLT5wY2lEZXZObywgZGV2X2luZm8tPnBjaUZ1bmNObyk7CisgICAgICAgIGdfbWFwbGVfZGV2X251bSArPSAxOworICAgICAgICAKKyAgICAgICAgLy8gaW5pdCAgICAKKyAgICAgICAgZGV2X2luZm8tPmRldmljZWlkID0gcGNpX2Rldl9pZHg7CisgICAgICAgIGRldl9pbmZvLT5wZGV2ID0gTlVMTDsgICAgICAgIAorICAgIAorCisgICAgICAgIC8vIEVuYWJsZSBQQ0kgYWRkcmVzcyBtYXAKKyAgICAgICAgcGNpQ29uZmlnSW5CeXRlKGRldl9pbmZvLT5wY2lCdXNObywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldl9pbmZvLT5wY2lEZXZObywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldl9pbmZvLT5wY2lGdW5jTm8sCisgICAgICAgICAgICAgICAgICAgICAgICBQQ0lfQ0ZHX0NPTU1BTkQsCisgICAgICAgICAgICAgICAgICAgICAgICAoVUlOVDggKikmcmVhZHZhbGIpOworICAgICAgICBwcmludGYoIkNNRCByZWcgPSAweCV4XG4iLCByZWFkdmFsYik7CisKKyAgICAgICAgcmVhZHZhbGIgfD0gMHg2OworICAgICAgICBwY2lDb25maWdPdXRCeXRlKGRldl9pbmZvLT5wY2lCdXNObywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldl9pbmZvLT5wY2lEZXZObywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldl9pbmZvLT5wY2lGdW5jTm8sCisgICAgICAgICAgICAgICAgICAgICAgICBQQ0lfQ0ZHX0NPTU1BTkQsCisgICAgICAgICAgICAgICAgICAgICAgICAoVUlOVDgpcmVhZHZhbGIpOworCisgICAgICAgIHBjaUNvbmZpZ0luQnl0ZShkZXZfaW5mby0+cGNpQnVzTm8sCisgICAgICAgICAgICAgICAgICAgICAgICBkZXZfaW5mby0+cGNpRGV2Tm8sCisgICAgICAgICAgICAgICAgICAgICAgICBkZXZfaW5mby0+cGNpRnVuY05vLAorICAgICAgICAgICAgICAgICAgICAgICAgUENJX0NGR19DT01NQU5ELAorICAgICAgICAgICAgICAgICAgICAgICAgKFVJTlQ4ICopJnJlYWR2YWxiKTsKKyAgICAgICAgcHJpbnRmKCJBZGp1c3RlZCBDTUQgcmVnID0gMHgleFxuIiwgcmVhZHZhbGIpOworCisgICAgICAgIC8vIEluaXQgYmFzZSBhZGRyZXNzZXMKKworI2lmZGVmIExMUENJRV9TRVRfQkFTRV9BRERSRVNTRVNfTUFOVUFMTFkgCisgICAgICAgZGV2X2luZm8tPmRldmljZS5zb2NfcmVnc19iYXNlID0gbGxwY2llX2Jhc2VfYWRkcmVzc2VzLnNvY19yZWdzX2Jhc2U7CisgICAgICAgZGV2X2luZm8tPmRldmljZS5zb2Nfc3JhbV9iYXNlID0gbGxwY2llX2Jhc2VfYWRkcmVzc2VzLnNvY19zcmFtX2Jhc2U7CisgICAgICAgZGV2X2luZm8tPmRldmljZS5zb2NfZGRyX2Jhc2UgID0gbGxwY2llX2Jhc2VfYWRkcmVzc2VzLnNvY19kZHJfYmFzZTsKKyAgICAgICBkZXZfaW5mby0+ZGV2aWNlLnNvY19kZHJfbGVuZ3RoID0gTUFQTEVfRERSX0xFTkdUSDsgLy8gMTZNICovCisjZWxzZQorICAgICAgICBwY2lDb25maWdJbkxvbmcoZGV2X2luZm8tPnBjaUJ1c05vLAorICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2luZm8tPnBjaURldk5vLAorICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2luZm8tPnBjaUZ1bmNObywKKyAgICAgICAgICAgICAgICAgICAgICAgIFBDSV9DRkdfQkFTRV9BRERSRVNTXzAsCisgICAgICAgICAgICAgICAgICAgICAgICAoVUlOVDMyICopJnJlYWR2YWwpOworICAgICAgICBwcmludGYoIkJBUjAgPSAweCV4XG4iLCByZWFkdmFsKTsKKyAgICAgICAgZGV2X2luZm8tPmRldmljZS5zb2NfcmVnc19iYXNlID0gKHJlYWR2YWwgJiBQQ0lfTUVNQkFTRV9NQVNLKTsKKworICAgICAgICBwY2lDb25maWdJbkxvbmcoZGV2X2luZm8tPnBjaUJ1c05vLAorICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2luZm8tPnBjaURldk5vLAorICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2luZm8tPnBjaUZ1bmNObywKKyAgICAgICAgICAgICAgICAgICAgICAgIFBDSV9DRkdfQkFTRV9BRERSRVNTXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAoVUlOVDMyICopJnJlYWR2YWwpOworICAgICAgICBwcmludGYoIkJBUjIgPSAweCV4XG4iLCByZWFkdmFsKTsKKyAgICAgICAgZGV2X2luZm8tPmRldmljZS5zb2NfZGRyX2Jhc2UgPSAocmVhZHZhbCAmIFBDSV9NRU1CQVNFX01BU0spOworICAgICAgICBkZXZfaW5mby0+ZGV2aWNlLnNvY19kZHJfbGVuZ3RoID0gTUFQTEVfRERSX0xFTkdUSDsgICAgICAgICAvLyAxNk0gICAgICAgICAgIAorCisgICAgICAgIHBjaUNvbmZpZ0luTG9uZyhkZXZfaW5mby0+cGNpQnVzTm8sCisgICAgICAgICAgICAgICAgICAgICAgICBkZXZfaW5mby0+cGNpRGV2Tm8sCisgICAgICAgICAgICAgICAgICAgICAgICBkZXZfaW5mby0+cGNpRnVuY05vLAorICAgICAgICAgICAgICAgICAgICAgICAgUENJX0NGR19CQVNFX0FERFJFU1NfNCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChVSU5UMzIgKikmcmVhZHZhbCk7CisgICAgICAgIHByaW50ZigiQkFSNCA9IDB4JXhcbiIsIHJlYWR2YWwpOworICAgICAgICBkZXZfaW5mby0+ZGV2aWNlLnNvY19zcmFtX2Jhc2UgPSAocmVhZHZhbCAmIFBDSV9NRU1CQVNFX01BU0spOyAgIAorI2VuZGlmICAgICAgICAgICAgIAorCisgICAgICAgIHByaW50ZigiUmVncyBCYXNlID0gMHglbHgsIEREUiBCYXNlID0gMHglbHgsIEREUiBMZW5ndGggPSAweCV4LCBTUkFNIEJhc2UgPSAweCVseFxuIiwKKyAgICAgICAgICAgIGRldl9pbmZvLT5kZXZpY2Uuc29jX3JlZ3NfYmFzZSwKKyAgICAgICAgICAgIGRldl9pbmZvLT5kZXZpY2Uuc29jX2Rkcl9iYXNlLAorICAgICAgICAgICAgZGV2X2luZm8tPmRldmljZS5zb2NfZGRyX2xlbmd0aCwKKyAgICAgICAgICAgIGRldl9pbmZvLT5kZXZpY2Uuc29jX3NyYW1fYmFzZSk7CisKKyAgICAgICAgLy8gaW5pdCBpbnRlcnJ1cHQKKyAgICAgICAgZGV2X2luZm8tPmRldmljZS5pcnEgPSBsbHBjaWVfZGV2aWNlX2lycXNbcGNpX2Rldl9pZHhdLmxscGNpZV9pcnE7CisgICAgICAgIGRldl9pbmZvLT5kZXZfc3RhdHVzX2lycSA9IGxscGNpZV9kZXZpY2VfaXJxc1twY2lfZGV2X2lkeF0ubGxwY2llX3N0YXR1c19pcnE7CisgICAgICAgIHByaW50ZigiRE1BIElSUSA9ICVkLCBEZXZpY2Ugc3RhdHVzIElSUSA9ICVkXG4iLCAKKyAgICAgICAgICAgIGRldl9pbmZvLT5kZXZpY2UuaXJxLCBkZXZfaW5mby0+ZGV2X3N0YXR1c19pcnEpOworICAgICAgICAgICAgICAgIAorICAgICAgICAvLyByZWFkIHJldmlzaW9uIHJlZ2lzdGVyCisgICAgICAgIHJlYWR2YWwgPSBiY21fcGNpX3JlYWQzMigodWludDMyX3QgKikoZGV2X2luZm8tPmRldmljZS5zb2NfcmVnc19iYXNlICsgUENJRV9SRVZJU0lPTl9SRUdJU1RFUl9PRkZTRVQpKTsKKyAgICAgICAgcHJpbnRmKCJyZWFkdmFsID0gMHgleFxuIiwgcmVhZHZhbCk7CisgICAgICAgIHByaW50ZigiQ2FyZCAlZCB2ZXJzaW9uIG1ham9yPSUwMnggbWlub3I9JTAyeFxuIiwKKyAgICAgICAgICAgICAgICAgICAgZGV2X2luZm8tPmRldmljZWlkLCAKKyAgICAgICAgICAgICAgICAgICAgKChyZWFkdmFsICYgMHgwMDAwZmYwMCkgPj4gOCksCisgICAgICAgICAgICAgICAgICAgIChyZWFkdmFsICYgMHgwMDAwMDBmZikpOyAKKyAgICAgICAgCisgICAgICAgIC8vIHJlYWQgc3RhdHVzIHJlZ2lzdGVyCisgICAgICAgIHJlYWR2YWwgPSBiY21fcGNpX3JlYWQzMigodWludDMyX3QgKikoZGV2X2luZm8tPmRldmljZS5zb2NfcmVnc19iYXNlICsgUENJRV9TVEFUVVNfUkVHSVNURVJfT0ZGU0VUKSk7CisgICAgICAgIHByaW50ZigicmVhZHZhbCA9IDB4JXhcbiIsIHJlYWR2YWwpOworICAgICAgICBkZXZfaW5mby0+ZXJyX3N0YXR1cyA9IChyZWFkdmFsICYgMHgwMDAwMDAwZik7CisgICAgICAgIGRldl9pbmZvLT5waHlsaW5rICAgID0gKChyZWFkdmFsID4+IDQpICYgMHgxKTsKKyAgICAgICAgZGV2X2luZm8tPmRhdGFsaW5rICAgPSAoKHJlYWR2YWwgPj4gNSkgJiAweDEpOworICAgICAgICBkZXZfaW5mby0+cHJldl9kYXRhbGluayAgPSBkZXZfaW5mby0+ZGF0YWxpbms7CisKKyAgICAgICAgLy8gY29ubmVjdCBJTlQgZm9yIGRldmljZSBzdGF0dXMKKyAgICAgICAgYmNtb3NfZmFzdGxvY2tfaW5pdCgmZGV2X2luZm8tPmxvY2ssIDApOworICAgICAgICBiY21vc19pbnRfY29ubmVjdCgoaW50KWRldl9pbmZvLT5kZXZfc3RhdHVzX2lycSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT1NfSVJRX1NIQVJFRCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2X3N0YXR1c19pbnRlcnJ1cHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdGF0dXNfaXNyIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2luZm8pOworICAgIH0KKworICAgIC8vIFJldHVybiBzdGF0dXMKKyAgICBpZiAoMCA+PWdfbWFwbGVfZGV2X251bSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PREVWOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9Cit9CisKKy8qKiBHZXQgTWFwbGUgZGV2aWNlIG9iamVjdCBzdHJ1Y3QKKyAqIFxjcnQgZGV2aWUgaW5kZXgsc3RhcnQgZnJvbSAwCisgKi8KK3N0YXRpYyBtYXBsZV9kZXZpY2VfaW5mbyAqZ2V0X21hcGxlX3BjaV9pbmZvKGludCBjcnQpCit7CisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKyAgICB1aW50MzJfdCByZWFkdmFsID0gMDsKKyAgICBtYXBsZV9kZXZpY2VfaW5mbyAqZGV2aWNlX2luZm8gPSBOVUxMOworCisgICAgLyogY2hlY2sgaW5wdXQgcGFyYW1ldGVyICovCisgICAgLyogZG9uJ3QgYWNjZXNzIGludmFsaWQgZGV2aWNlIHJlZ3MgYmFzZSBhZGRyZXNzICovCisgICAgaWYgKGNydCA+PSBnX21hcGxlX2Rldl9udW0pCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZGV2aWNlX2luZm8gPSAmZ19tYXBsZV9kZXZzX2luZm9bY3J0XTsKKworICAgIC8qIHJlYWQgc3RhdHVzIHJlZ2lzdGVyICovCisgICAgcmVhZHZhbCA9IGJjbV9wY2lfcmVhZDMyKCh1aW50MzJfdCAqKShkZXZpY2VfaW5mby0+ZGV2aWNlLnNvY19yZWdzX2Jhc2UgKyBQQ0lFX1NUQVRVU19SRUdJU1RFUl9PRkZTRVQpKTsKKyAgICBkZXZpY2VfaW5mby0+ZXJyX3N0YXR1cyA9IChyZWFkdmFsICYgMHgwMDAwMDAwZik7CisgICAgZGV2aWNlX2luZm8tPnBoeWxpbmsgICAgPSAoKHJlYWR2YWwgPj4gNCkgJiAweDEpOworICAgIGRldmljZV9pbmZvLT5kYXRhbGluayAgID0gKChyZWFkdmFsID4+IDUpICYgMHgxKTsKKworICAgIC8qIHJldHVybiBkZXZpY2UgKi8KKyAgICByZXR1cm4gZGV2aWNlX2luZm87Cit9CisKKy8qKiBSZWdpc3RlciBzdGF0dXMgY2hhbmdlIG5vdGlmaWNhdGlvbiBjYWxsYmFjaworICogXHBhcmFtW2luXSAgIGNiICAgICAgU3RhdHVzIGNoYW5nZSBub3RpZmljYXRpb24gY2FsbGJhY2sKKyAqIFxyZXR1cm4gMD1PSyBvciBlcnJvciA8MCAKKyAqLworYmNtb3NfZXJybm8gYmNtX2xsX3BjaWVfc3RhdHVzX2NoYW5nZV9yZWdpc3RlcihiY21fbGxfcGNpZV9zdGF0dXNfY2hhbmdlIGNiKQoreworICAgIGludCBpOworICAgIG1hcGxlX2RldmljZV9pbmZvICpkZXZfaW5mbzsgCisgICAgCisgICAgZ19kZXZfc3RhdHVzX2NoYW5nZV9jYiA9IGNiOworICAgIGZvciAoaSA9IDA7IGkgPCBnX21hcGxlX2Rldl9udW07IGkrKykKKyAgICB7CisgICAgICAgIGRldl9pbmZvID0gZ2V0X21hcGxlX3BjaV9pbmZvKGkpOworICAgICAgICBnX2Rldl9zdGF0dXNfY2hhbmdlX2NiKGksIGRldl9pbmZvLT5kYXRhbGluayk7CisgICAgfQorICAgIAorICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiogVW5yZWdpc3RlciBzdGF0dXMgY2hhbmdlIG5vdGlmaWNhdGlvbiBjYWxsYmFjaworICogXHJldHVybiAwPU9LIG9yIGVycm9yIDwwCisgKi8KK2JjbW9zX2Vycm5vIGJjbV9sbF9wY2llX3N0YXR1c19jaGFuZ2VfdW5yZWdpc3Rlcih2b2lkKQoreworICAgIGdfZGV2X3N0YXR1c19jaGFuZ2VfY2IgPSBOVUxMOworICAgIAorICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiogUXVlcnkgUENJZSBkZXZpY2UKKyAqIFxwYXJhbVtpbl0gICBkZXZfaWQgIERldmljZSBpZAorICogXHBhcmFtW291dF0gIGluZm8gICAgRGV2aWNlIGluZm8KKyAqIFxyZXR1cm4gMD1PSywgQkNNX0VSUl9JTy1kZXZfaWQgaXMgaW4gcHJvcGVyIHJhbmdlLCBidXQgbGluayBpcyBkb3duCisgKi8KK2JjbW9zX2Vycm5vIGJjbV9sbF9wY2llX3F1ZXJ5KHVpbnQ4X3QgZGV2X2lkLCBiY21fbGxfZGV2X2luZm8gKmluZm8pCit7CisgICAgbWFwbGVfZGV2aWNlX2luZm8gKmRldl9pbmZvID0gTlVMTDsgCisKKyAgICAvKiBjaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8gICAgCisgICAgaWYgKE5VTEwgPT0gaW5mbykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogZG9uJ3QgYWNjZXNzIGludmFsaWQgZGV2aWNlIHJlZ3MgYmFzZSBhZGRyZXNzICovCisgICAgaWYgKGRldl9pZCA8IGdfbWFwbGVfZGV2X251bSkKKyAgICB7CisgICAgICAgIGRldl9pbmZvID0gZ2V0X21hcGxlX3BjaV9pbmZvKGRldl9pZCk7CisgICAgICAgIGlmIChOVUxMID09IGRldl9pbmZvKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT0VOVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGV2X2luZm8tPmRhdGFsaW5rID09IEJDTV9MTF9QQ0lFX0xJTktfRE9XTikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU87CisgICAgICAgIH0KKworICAgICAgICAqaW5mbyA9IGRldl9pbmZvLT5kZXZpY2U7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsgICAKK30KKworLyoqIEdldCBsb3ctbGV2ZWwgZGV2aWNlIGhhbmRsZQorICogXHBhcmFtW2luXSAgIGRldl9pZCAgRGV2aWNlIGlkCisgKiBccGFyYW1bb3V0XSAgbGxkZXYgICBMb3ctbGV2ZWwgZGV2aWNlIGhhbmRsZSAKKyAqIFxyZXR1cm4gZGV2aWNlIGhhbmRsZSBvciBOVUxMIGlmIGxpbmsgaXMgZG93bgorICovCitiY21fbGxfcGNpZV9kZXYgYmNtX2xsX3BjaWVfZGV2X2dldCh1aW50OF90IGRldl9pZCkKK3sKKyAgICBtYXBsZV9kZXZpY2VfaW5mbyAqZGV2X2luZm8gPSBOVUxMOyAKKworICAgIC8qIGNoZWNrIGlucHV0IHBhcmFtZXRlciAqLworICAgIC8qIGRvbid0IGFjY2VzcyBpbnZhbGlkIGRldmljZSByZWdzIGJhc2UgYWRkcmVzcyAqLworICAgIGlmIChkZXZfaWQgPCBnX21hcGxlX2Rldl9udW0pCisgICAgeworICAgICAgICBkZXZfaW5mbyA9IGdldF9tYXBsZV9wY2lfaW5mbyhkZXZfaWQpOworICAgICAgICBpZiAoTlVMTCA9PSBkZXZfaW5mbykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZGV2X2luZm8tPnBkZXY7CisgICAgICAgIH0KKyAgICB9IAorICAgIAorICAgIHJldHVybiBOVUxMOworfQorCisvKiogSG9zdCByZXNldCBlbmFibGUgCisgKiBcZW5hYmxlZCAKKyAqLworYmNtb3NfZXJybm8gYmNtX2xsX3BjaWVfaG9zdF9yZXNldF9lbmFibGUodWludDhfdCBkZXZfaWQsIGJjbW9zX2Jvb2wgZW5hYmxlZCkKK3sKKyAgICB1aW50MzJfdCB2YWw7CisKKyAgICAvKiBjaGVjayBpbnB1dCBwYXJhbWV0ZXIgKi8KKyAgICAvKiBkb24ndCBhY2Nlc3MgaW52YWxpZCBkZXZpY2UgcmVncyBiYXNlIGFkZHJlc3MgKi8KKyAgICBpZiAoZGV2X2lkID49IGdfbWFwbGVfZGV2X251bSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09WRVJGTE9XOworICAgIH0KKyAgICAKKyAgICB2YWwgPSBlbmFibGVkID8gMCA6IDE7CisgICAgYmNtX3BjaV93cml0ZTMyKCh1aW50MzJfdCAqKShnX21hcGxlX2RldnNfaW5mb1tkZXZfaWRdLmRldmljZS5zb2NfcmVnc19iYXNlICsgUENJRV9IQVJEX0RFQlVHX1JFR0lTVEVSX09GRlNFVCksIAorICAgICAgICAgICAgdmFsKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL2xsX3BjaWUvdnh3b3Jrcy9tdWx0aV9kZXZpY2UvYmNtb2x0X2xscGNpZS5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9sbF9wY2llL3Z4d29ya3MvbXVsdGlfZGV2aWNlL2JjbW9sdF9sbHBjaWUuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNDBkNTY1Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9sbF9wY2llL3Z4d29ya3MvbXVsdGlfZGV2aWNlL2JjbW9sdF9sbHBjaWUuaApAQCAtMCwwICsxLDEwNSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworLyoKKyAqIGJjbV9sbHBjaWUuaCAtIExvdy1sZXZlbCBQQ0llIGRyaXZlciBpbnRlcmZhY2UKKyAqLworCisjaWZuZGVmIEJDTU9MVF9MTFBDSUVfSF8KKyNkZWZpbmUgQkNNT0xUX0xMUENJRV9IXworCisjaW5jbHVkZSAiYmNtb3Nfc3lzdGVtLmgiCisjZGVmaW5lIEJDTU9MVF9NQVhfTUFQTEVfREVWSUNFUyAgICAgICAgICAgICAgIDIgLyogNSAqLworCisvKiogTG93LWxldmVsIGRldmljZSBpbmZvICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbGxfZGV2X2luZm8KK3sKKyAgICB1bnNpZ25lZCBsb25nICAgc29jX3JlZ3NfYmFzZTsgICAgICAvKio8IERldmljZSByZWdpc3RlcnMgYmFzZSBpbiBob3N0IGFkZHJlc3Mgc3BhY2UgKi8KKyAgICB1bnNpZ25lZCBsb25nICAgc29jX3NyYW1fYmFzZTsgICAgICAvKio8IERldmljZSBTUkFNIGJhc2UgaW4gaG9zdCBhZGRyZXNzIHNwYWNlICovCisgICAgdW5zaWduZWQgbG9uZyAgIHNvY19kZHJfYmFzZTsgICAgICAgLyoqPCBEZXZpY2UgRERSIGJhc2UgaW4gaG9zdCBhZGRyZXNzIHNwYWNlICovCisgICAgdWludDMyX3QgICAgICAgIHNvY19kZHJfbGVuZ3RoOyAgICAgLyoqPCBEZXZpY2UgRERSIHdpbmRvdyBzaXplICovCisgICAgdWludDMyX3QgICAgICAgIGlycTsgICAgICAgICAgICAgICAgLyoqPCBEZXZpY2UgaXJxIG51bWJlciAqLworfSBiY21fbGxfZGV2X2luZm87CisKKy8qKiBEZXZpY2UgUENJZSBsaW5rIHN0YXR1cyBjaGFuZ2Ugbm90aWZpY2F0aW9uIGNhbGxiYWNrICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBCQ01fTExfUENJRV9MSU5LX0RPV04sICAgICAgICAgICAgIC8qKjwgUENJZSBsaW5rIGlzIGRvd24gKi8KKyAgICBCQ01fTExfUENJRV9MSU5LX1VQLCAgICAgICAgICAgICAgIC8qKjwgUENJZSBsaW5rIGlzIHVwICovCit9IGJjbV9sbF9wY2llX2xpbmtfc3RhdHVzOworCisvKiogTG93LWxldmVsIGRldmljZSBoYW5kbGUgKi8KK3R5cGVkZWYgdm9pZCAqYmNtX2xsX3BjaWVfZGV2OworCisvKiogU3RhdHVzIGNoYW5nZSBpbmRpY2F0aW9uICovCit0eXBlZGVmIHZvaWQgKCpiY21fbGxfcGNpZV9zdGF0dXNfY2hhbmdlKSh1aW50OF90IGRldl9pZCwgYmNtX2xsX3BjaWVfbGlua19zdGF0dXMgc3RhdHVzKTsKKworLyoqIFJlZ2lzdGVyIHN0YXR1cyBjaGFuZ2Ugbm90aWZpY2F0aW9uIGNhbGxiYWNrCisgKiBccGFyYW1baW5dICAgY2IgICAgICBTdGF0dXMgY2hhbmdlIG5vdGlmaWNhdGlvbiBjYWxsYmFjaworICogXHJldHVybiAwPU9LIG9yIGVycm9yIDwwCisgKi8KK2JjbW9zX2Vycm5vIGJjbV9sbF9wY2llX3N0YXR1c19jaGFuZ2VfcmVnaXN0ZXIoYmNtX2xsX3BjaWVfc3RhdHVzX2NoYW5nZSBjYik7CisKKy8qKiBVbnJlZ2lzdGVyIHN0YXR1cyBjaGFuZ2Ugbm90aWZpY2F0aW9uIGNhbGxiYWNrCisgKiBccmV0dXJuIDA9T0sgb3IgZXJyb3IgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtX2xsX3BjaWVfc3RhdHVzX2NoYW5nZV91bnJlZ2lzdGVyKHZvaWQpOworCisvKiogUXVlcnkgUENJZSBkZXZpY2UKKyAqIFxwYXJhbVtpbl0gICBkZXZfaWQgIERldmljZSBpZAorICogXHBhcmFtW291dF0gIGluZm8gICAgRGV2aWNlIGluZm8KKyAqIFxyZXR1cm4gMD1PSywgQkNNX0VSUl9JTy1kZXZfaWQgaXMgaW4gcHJvcGVyIHJhbmdlLCBidXQgbGluayBpcyBkb3duCisgKi8KK2JjbW9zX2Vycm5vIGJjbV9sbF9wY2llX3F1ZXJ5KHVpbnQ4X3QgZGV2X2lkLCBiY21fbGxfZGV2X2luZm8gKmluZm8pOworCisvKiogR2V0IGxvdy1sZXZlbCBkZXZpY2UgaGFuZGxlCisgKiBccGFyYW1baW5dICAgZGV2X2lkICBEZXZpY2UgaWQKKyAqIFxwYXJhbVtvdXRdICBsbGRldiAgIExvdy1sZXZlbCBkZXZpY2UgaGFuZGxlIAorICogXHJldHVybiBkZXZpY2UgaGFuZGxlIG9yIE5VTEwgaWYgbGluayBpcyBkb3duCisgKi8KK2JjbV9sbF9wY2llX2RldiBiY21fbGxfcGNpZV9kZXZfZ2V0KHVpbnQ4X3QgZGV2X2lkKTsKKworLyoqIEVuYWJsZS9kaXNhYmxlIGhvc3QgcmVzZXQgZm9yIGFsbCBQQ0llIGludGVyZmFjZXMgKGF1dG9tYXRpYworICogIGRldmljZSByZXNldCB3aGVuIGhvc3QgaXMgcmVzZXQpCisgKiBccGFyYW1baW5dICAgZW5hYmxlZCBXaGV0aGVyIG9yIG5vdCBob3QgcmVzZXQgc2hvdWxkIGJlIGVuYWJsZWQKKyAqIFxyZXR1cm4gMD1PSyBvciBlcnJvciA8MAorICovCitiY21vc19lcnJubyBiY21fbGxfcGNpZV9ob3N0X3Jlc2V0X2VuYWJsZSh1aW50OF90IGRldl9pZCwgYmNtb3NfYm9vbCBlbmFibGVkKTsKKworI2lmZGVmIFRYX0VOQUJMRV9FVkVOVF9UUkFDRQorLyoqIEhhbmRsZSBsb3ctbGV2ZWwgdHJhY2Ugb24gdGFyZ2V0CisgKiBccGFyYW1baW5dICAgZGV2X2lkICBEZXZpY2UgaWQKKyAqIFxwYXJhbVtpbl0gIGxmaWxlIG5hbWUgZm9yIHRyYWNlCisgKiBccmV0dXJuIGRldmljZSBoYW5kbGUgb3IgTlVMTCBpZiBsaW5rIGlzIGRvd24KKyAqLworYmNtb3NfZXJybm8gYmNtX2xsX3BjaWVfc2V0cmFjZSh1aW50OF90IGRldl9pZCk7CitiY21vc19lcnJubyBiY21fbGxfcGNpZV9jbGVhcnRyYWNlKHVpbnQ4X3QgZGV2X2lkKTsKK2JjbW9zX2Vycm5vIGJjbV9sbF9wY2llX3NhdmV0cmFjZSh1aW50OF90IGRldl9pZCwgY2hhciAqdHJhY2VmaWxlbmFtZSk7CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9tb2RlbF9saW51eC9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvbW9kZWxfbGludXgvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVjNWMzMQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvbW9kZWxfbGludXgvTWFrZWZpbGUKQEAgLTAsMCArMSwxOSBAQAorIyBNYWtlZmlsZSBmb3IgYnVpbGRpbmcgc3lzdGVtIG1vZGVsIGFzIGxpbnV4IG1vZHVsZQorIworaWZlcSAoIiQoT1NfS0VSTkVMKSIsICJsaW51eCIpCisKK01PRF9OQU1FID0gc3lzbW9kZWwKK01PRF9ERVBTID0gdXRpbHMgY29tbW9uX2FwaSAKK01PRF9UWVBFID0gbGludXhfbGliCitTUkNfRElSID0gJChNT0RFTF9PVVRfRElSKS9saW51eAorc3JjcyA9IGJjbW9sdF9tb2RlbF90eXBlcy5jIGJjbW9sdF9tc2dfcGFjay5jCisKKyQoc2hlbGwgbWtkaXIgLXAgJChTUkNfRElSKTsgbG4gLXMgJChNT0RFTF9PVVRfRElSKS8qLltjaF0gJChTUkNfRElSKS8gMj4gL2Rldi9udWxsKQorCSAKKyMgSWYgY2FsbGVkIGJ5IGxpbnV4IGtlcm5lbCBidWlsZGVyIC0gYWRkIGluY2x1ZGUgcGF0aHMgbWFudWFsbHkuCisjIEl0IGlzIG5vdCBlbGVnYW50LCBidXQgd2UnbGwgbm90IGhhdmUgbWFueSBsaW51eCBtb2R1bGVzCitpZm5lcSAoIiQoS0JVSUxEX1NSQykiLCAiIikKKwktaW5jbHVkZSAkKE9VVF9ESVJfQkFTRSkvTWFrZWZpbGUuY29uZmlnLiQoTU9EX05BTUUpCitlbmRpZgorCitlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU4ZjQ1ZgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vTWFrZWZpbGUKQEAgLTAsMCArMSw1MSBAQAorIyBPUyBhYnN0cmFjdGlvbiBsYXllcgorIworTU9EX05BTUUgPSBvcworTU9EX1RZUEUgPSBsaWIKK01PRF9JTkNfRElSUyA9ICQoU1JDX0RJUikgJChTUkNfRElSKS8kKE9TKQorTU9EX0lOQ19ESVJTICs9ICQoT1NfUExBVEZPUk1fRElSKSAkKENPTkZJR19ESVIpCitNT0RfU1VQUFJFU1NfT1NfREVQID0geQorCitpZmVxICgiJChPUykiLCAidGhyZWFkeCIpCisJTU9EX0RFUFMgPSB0aHJlYWR4IGJzcAorCU1PRF9JTkNfRElSUyArPSAkKFNVQlNZU1RFTSkvc3lzL2luYworCU1PRF9ERUZTID0gLURCQ01PU19UUkFDRV9JTl9ERVZfTE9HCitlbmRpZgorCitpZmVxICgiJChPUykiLCAicG9zaXgiKQorCUVOQUJMRV9NU0dfUVVFVUVfRE9NQUlOX1NPQ0tFVCA/PSB5CisJRU5BQkxFX01TR19RVUVVRV9VRFBfU09DS0VUID89IHkKK2VuZGlmCisKK2lmZXEgKCIkKEVOQUJMRV9NU0dfUVVFVUVfRE9NQUlOX1NPQ0tFVCkiLCAieSIpCisJTU9EX0RFRlMgKz0gLURCQ01PU19NU0dfUVVFVUVfRE9NQUlOX1NPQ0tFVAorZW5kaWYKKworaWZlcSAoIiQoRU5BQkxFX01TR19RVUVVRV9VRFBfU09DS0VUKSIsICJ5IikKKwlNT0RfREVGUyArPSAtREJDTU9TX01TR19RVUVVRV9VRFBfU09DS0VUCitlbmRpZgorCitpZmVxICgiJChCVUZfSU5fRE1BX01FTSkiLCAieSIpCisJRVhUUkFfQ0ZMQUdTICs9IC1EQkNNT1NfQlVGX0lOX0RNQV9NRU0KKyAgICBCVUZfREFUQV9VTklUX1NJWkUgPz0gMTAyNAorCUVYVFJBX0NGTEFHUyArPSAtREJDTU9TX0JVRl9EQVRBX1VOSVRfU0laRT0kKEJVRl9EQVRBX1VOSVRfU0laRSkKK2VuZGlmCisKK2lmbmVxICgiJChCVUZfUE9PTF9TSVpFKSIsICIiKQorICAgIGlmZXEgKCIkKEJVRl9QT09MX0JVRl9TSVpFKSIsICIiKQorICAgICAgICBCVUZfUE9PTF9CVUZfU0laRSA9IDQwOTYKKyAgICBlbmRpZgorICAgIEVYVFJBX0NGTEFHUyArPSAtREJDTU9TX0JVRl9QT09MX1NJWkU9JChCVUZfUE9PTF9TSVpFKSAtREJDTU9TX0JVRl9QT09MX0JVRl9TSVpFPSQoQlVGX1BPT0xfQlVGX1NJWkUpCitlbmRpZgorCitzcmNzICA9IGJjbW9zX2NvbW1vbi5jIGJjbW9zX2Vycm5vLmMgYmNtb3NfaGFzaF90YWJsZS5jIGJjbW9zX3J3X2xvY2suYyAkKE9TKS9iY21vc19zeXN0ZW0uYworCitpZmVxICgiJChERUJVRykiLCAieSIpCisJTU9EX0RFRlMJKz0gLURCQ01PU19NRU1fREVCVUcgLURCQ01PU19TWVNfVU5JVFRFU1QKK2VuZGlmCisKK2lmZXEgKCIkKFNVQlNZU1RFTSkiLCAiZW1iZWRkZWQiKQorICAgIFVTRV9MSU5UID0geWVzCitlbmRpZgorCisjRVhUUkFfREVGSU5FUyArPSAtREJDTU9TX1NZU19VTklUVEVTVApkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9iY21vc19jb21tb24uYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vYmNtb3NfY29tbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJkNTUyYQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vYmNtb3NfY29tbW9uLmMKQEAgLTAsMCArMSwyNzcyIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaW5jbHVkZSAiYmNtb3Nfc3lzdGVtLmgiCisKKy8qIHRhc2sgY29udHJvbCBibG9ja3MgKi8KK1NUQUlMUV9IRUFEKHRhc2tfbGlzdCwgYmNtb3NfdGFzaykgdGFza19saXN0ID0gU1RBSUxRX0hFQURfSU5JVElBTElaRVIodGFza19saXN0KTsKKworLyogbW9kdWxlIGNvbnRyb2wgYmxvY2tzICovCitiY21vc19tb2R1bGUgKmJjbW9zX21vZHVsZXNbQkNNT1NfTU9EVUxFX0lEX19OVU1fT0ZdOworCisvKiBldmVudCBjb250cm9sIGJsb2NrcyAqLworYmNtb3NfZXZlbnQgKmJjbW9zX2V2ZW50c1tCQ01PU19FVkVOVF9JRF9fTlVNX09GXTsKKworLyogR2xvYmFsIHRyYWNlIGxldmVsICovCitiY21vc190cmFjZV9sZXZlbCBiY21vc19zeXNfdHJhY2VfbGV2ZWwgPSBCQ01PU19UUkFDRV9MRVZFTF9FUlJPUjsKKworLyogR2xvYmFsIE9TIG11dGV4ICovCitiY21vc19tdXRleCBiY21vc19yZXNfbG9jazsKKworLyogVG90YWwgbWVtb3J5IG9jY3VwaWVkIGJ5IGJsb2NrIHBvb2xzICovCit1aW50MzJfdCBiY21vc190b3RhbF9ibGtfcG9vbF9zaXplOworCisvKiBUb3RhbCBtZW1vcnkgb2NjdXBpZWQgYnkgbWVzc2FnZSBwb29scyAqLwordWludDMyX3QgYmNtb3NfdG90YWxfbXNnX3Bvb2xfc2l6ZTsKKworZl9iY21vbHRfc3dfZXJyb3JfaGFuZGxlciBzd19lcnJvcl9oYW5kbGVyOworCisvKiBCbG9jayBwb29scyAqLworc3RhdGljIFNUQUlMUV9IRUFEKGJsa19wb29sX2xpc3QsIGJjbW9zX2Jsa19wb29sKSBibGtfcG9vbF9saXN0ID0gU1RBSUxRX0hFQURfSU5JVElBTElaRVIoYmxrX3Bvb2xfbGlzdCk7CisKKy8qIE1lc3NhZ2UgcG9vbHMgKi8KK3N0YXRpYyBTVEFJTFFfSEVBRChtc2dfcG9vbF9saXN0LCBiY21vc19ibGtfcG9vbCkgbXNnX3Bvb2xfbGlzdCA9IFNUQUlMUV9IRUFEX0lOSVRJQUxJWkVSKG1zZ19wb29sX2xpc3QpOworCisvKiBNZXNzYWdlIHF1ZXVlcyAqLworc3RhdGljIFNUQUlMUV9IRUFEKG1zZ19xdWV1ZV9saXN0LCBiY21vc19tc2dfcXVldWUpIG1zZ19xdWV1ZV9saXN0ID0gU1RBSUxRX0hFQURfSU5JVElBTElaRVIobXNnX3F1ZXVlX2xpc3QpOworCisvKiBNZXNzYWdlIHF1ZXVlIGdyb3VwcyAqLworc3RhdGljIFNUQUlMUV9IRUFEKG1zZ19xZ3JvdXBfbGlzdCwgYmNtb3NfbXNnX3Fncm91cCkgbXNnX3Fncm91cF9saXN0ID0gU1RBSUxRX0hFQURfSU5JVElBTElaRVIobXNnX3Fncm91cF9saXN0KTsKKworLyogTG9jayB1c2VkIHRvIHByb3RlY3QgbXNnIHJlZ2lzdHJhdGlvbiAvIGRlcmVnaXN0cmF0aW9uICovCitzdGF0aWMgYmNtb3NfZmFzdGxvY2sgYmNtb3NfbXNnX3JlZ2lzdGVyX2xvY2s7CisKKy8qIFNodXRkb3duIG1vZGU6IHdoZW4gdGhpcyBpcyBzZXQsIHdlIGV4cGVjdCBtZXNzYWdlIGhhbmRsZXIgZGVyZWdpc3RyYXRpb24gdG8gaGFwcGVuIHdoaWxlIG1lc3NhZ2VzIGFyZSBzdGlsbCBiZWluZworICogc2VudC9yZWNlaXZlZC4gV2Ugc2hvdWxkIGhhbmRsZSB0aGlzIGdyYWNlZnVsbHkuICovCitzdGF0aWMgYmNtb3NfYm9vbCBiY21vc19tc2dfc2h1dGRvd25fbW9kZSA9IEJDTU9TX0ZBTFNFOworCisvKiBUaW1lciBtYW5hZ2VtZW50IGJsb2NrICovCit0eXBlZGVmIHN0cnVjdCBiY21vc190aW1lcl9wb29sCit7CisgICAgYmNtb3NfZmFzdGxvY2sgbG9jazsgICAgICAgICAgICAgICAgICAgICAgICAvKiBQb29sIHByb3RlY3Rpb24gbG9jayAqLworICAgIGJjbW9zX3N5c190aW1lciBzeXNfdGltZXI7ICAgICAgICAgICAgICAgICAgLyogU3lzdGVtIHRpbWVyIGhhbmRsZSAqLworICAgIHVpbnQzMl90IG51bV9hY3RpdmVfdGltZXJzOyAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGFjdGl2ZSB0aW1lcnMgaW4gdGhlIHBvb2wgKi8KKyNpZmRlZiBCQ01PU19USU1FUl9SQl9UUkVFCisgICAgUkJfSEVBRChiY21vc190aW1lcnMsIGJjbW9zX3RpbWVyKSBwb29sOyAgICAvKiBUaW1lciBwb29sLiBSQiB0cmVlICovCisjZWxzZQorICAgIFRBSUxRX0hFQUQoYmNtb3NfdGltZXJzLCBiY21vc190aW1lcikgcG9vbDsgLyogVGltZXIgcG9vbDogVEFJTFEgKi8KKyNlbmRpZgorfSBiY21vc190aW1lcl9wb29sOworCitzdGF0aWMgaW50MzJfdCBfYmNtb3NfdGltZXJfY29tcGFyZShiY21vc190aW1lciAqdDEsIGJjbW9zX3RpbWVyICp0Mik7CisKKy8qCisgKiBNYWNyb3MgZm9yIFJCLVRSRUUgYW5kIFRBSUxRLWJhc2VkIHRpbWVyIHRvb2wgaW1wbGVtZW50YXRpb25zCisgKi8KKworI2lmZGVmIEJDTU9TX1RJTUVSX1JCX1RSRUUKKworI2lmZGVmIF9fYXJtX18KKy8qIEFSTSBjb21waWxlciBkb2Vzbid0IGxpa2UgdW51c2VkIGlubGluZSBmdW5jdGlvbnMuIERpc2FibGUgdGhlIHdhcm5pbmcgKi8KKyNwcmFnbWEgZGlhZ19zdXBwcmVzcyAxNzcKKyNlbmRpZgorCisvKiBHZW5lcmF0ZSBSQiB0cmVlIGZ1bmN0aW9ucyAqLworUkJfR0VORVJBVEVfSU5MSU5FKGJjbW9zX3RpbWVycywgYmNtb3NfdGltZXIsIGVudHJ5LCBfYmNtb3NfdGltZXJfY29tcGFyZSkKKworI2RlZmluZSBUTVJfUE9PTF9JTklUKHRtcl9wb29sKSAgICAgICAgICAgICAgICAgUkJfSU5JVCgmKHRtcl9wb29sKS0+cG9vbCkKKyNkZWZpbmUgVE1SX1BPT0xfSU5TRVJUKHRtcl9wb29sLCB0bXIpICAgICAgICAgIFJCX0lOU0VSVChiY21vc190aW1lcnMsICYodG1yX3Bvb2wpLT5wb29sLCB0bXIpCisjZGVmaW5lIFRNUl9QT09MX1JFTU9WRSh0bXJfcG9vbCwgdG1yKSAgICAgICAgICBSQl9SRU1PVkUoYmNtb3NfdGltZXJzLCAmKHRtcl9wb29sKS0+cG9vbCwgdG1yKQorI2RlZmluZSBUTVJfUE9PTF9GSVJTVCh0bXJfcG9vbCkgICAgICAgICAgICAgICAgUkJfTUlOKGJjbW9zX3RpbWVycywgJih0bXJfcG9vbCktPnBvb2wpCisKKyNlbHNlCisKKyNkZWZpbmUgVE1SX1BPT0xfSU5JVCh0bXJfcG9vbCkgICAgICAgICAgICAgICAgIFRBSUxRX0lOSVQoJih0bXJfcG9vbCktPnBvb2wpCisKKyNkZWZpbmUgVE1SX1BPT0xfSU5TRVJUKHRtcl9wb29sLCB0bXIpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBiY21vc190aW1lciAqX2xhc3QgPSBUQUlMUV9MQVNUKCYodG1yX3Bvb2wpLT5wb29sLCBiY21vc190aW1lcnMpOyAgICBcCisgICAgICAgIGlmIChfbGFzdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmIChfYmNtb3NfdGltZXJfY29tcGFyZSh0bXIsIF9sYXN0KSA+PSAwKSAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIFRBSUxRX0lOU0VSVF9UQUlMKCYodG1yX3Bvb2wpLT5wb29sLCB0bXIsIGVudHJ5KTsgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGJjbW9zX3RpbWVyICpfdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpdGVyID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgVEFJTFFfRk9SRUFDSChfdCwgJih0bXJfcG9vbCktPnBvb2wsIGVudHJ5KSAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgQlVHX09OKGl0ZXIgPj0gKHRtcl9wb29sKS0+bnVtX2FjdGl2ZV90aW1lcnMpO1wKKyAgICAgICAgICAgICAgICAgICAgKytpdGVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGlmIChfYmNtb3NfdGltZXJfY29tcGFyZSh0bXIsIF90KSA8PSAwKSAgICAgXAorICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRBSUxRX0lOU0VSVF9CRUZPUkUoX3QsIHRtciwgZW50cnkpOyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgVEFJTFFfSU5TRVJUX0hFQUQoJih0bXJfcG9vbCktPnBvb2wsIHRtciwgZW50cnkpOyAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICsrKHRtcl9wb29sKS0+bnVtX2FjdGl2ZV90aW1lcnM7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgVE1SX1BPT0xfUkVNT1ZFKHRtcl9wb29sLCB0bXIpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBCVUdfT04oISh0bXJfcG9vbCktPm51bV9hY3RpdmVfdGltZXJzKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVEFJTFFfUkVNT1ZFKCYodG1yX3Bvb2wpLT5wb29sLCB0bXIsIGVudHJ5KTsgICAgICAgICAgICBcCisgICAgICAgIFRBSUxRX05FWFQodG1yLCBlbnRyeSkgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAtLSh0bXJfcG9vbCktPm51bV9hY3RpdmVfdGltZXJzOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFRNUl9QT09MX0ZJUlNUKHRtcl9wb29sKSAgICAgICAgICAgICAgICBUQUlMUV9GSVJTVCgmKHRtcl9wb29sKS0+cG9vbCkKKworI2VuZGlmCisKKyNkZWZpbmUgQkNNT1NfVElNRVJfSVNfUlVOTklORyh0bXIpICAgICAgICAgICAgICgodG1yLT5mbGFncyAmIEJDTU9TX1RJTUVSX0ZMQUdfUlVOTklORykgIT0gMCkKKyNkZWZpbmUgQkNNT1NfVElNRVJfSVNfRVhQSVJFRCh0bXIpICAgICAgICAgICAgICgodG1yLT5mbGFncyAmIEJDTU9TX1RJTUVSX0ZMQUdfRVhQSVJFRCkgIT0gMCkKKyNkZWZpbmUgQkNNT1NfVElNRVJfSVNfVkFMSUQodG1yKSAgICAgICAgICAgICAgICgodG1yLT5mbGFncyAmIEJDTU9TX1RJTUVSX0ZMQUdfVkFMSUQpICE9IDApCisjZGVmaW5lIEJDTU9TX1RJTUVSX0lTX0FDVElWRSh0bXIpICAgICAgICAgICAgICAoKHRtci0+ZmxhZ3MgJiBCQ01PU19USU1FUl9GTEFHX0FDVElWRSkgIT0gMCkKKworc3RhdGljIGJjbW9zX2Jvb2wgYmNtb3NfaW5pdGlhbGl6ZWQ7CitzdGF0aWMgYmNtb3NfdGltZXJfcG9vbCB0bXJfcG9vbDsKK3N0YXRpYyB2b2lkIF9zeXNfdGltZXJfaGFuZGxlcih2b2lkICpkYXRhKTsKKworLyoKKyAqIFByaW50IHZhcmlhYmxlcworICovCisKK3N0YXRpYyBiY21vc19wcmludF9yZWRpcmVjdF9tb2RlIHByaW50X3JlZGlyZWN0X21vZGU7CitzdGF0aWMgYmNtb3NfcHJpbnRfcmVkaXJlY3RfY2IgcHJpbnRfcmVkaXJlY3RfY2I7CitzdGF0aWMgdm9pZCAqcHJpbnRfcmVkaXJlY3RfY2JfZGF0YTsKK3N0YXRpYyBiY21vc19tdXRleCBiY21vc19wcmludF9sb2NrOworI2lmZGVmIEJDTU9TX0JVRl9QT09MX1NJWkUKK3N0YXRpYyBiY21vc19ibGtfcG9vbCBzeXNfYnVmX3Bvb2w7CitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb3NfYnVmX3Bvb2xfY3JlYXRlKHZvaWQpOworI2VuZGlmCisKKy8qKiBJbml0aWFsaXplIHN5c3RlbSBsaWJyYXJ5CisgKiBcaW5ncm91cCBzeXN0ZW0KKyAqIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIgc3lzdGVtIGZ1bmN0aW9uCisgKiBccmV0dXJucyAwPU9LIG9yIGVycm9yIGNvZGUgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfaW5pdCh2b2lkKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgaWYgKGJjbW9zX2luaXRpYWxpemVkKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICByYyA9IGJjbW9zX3N5c19pbml0KCk7CisgICAgYmNtb3NfbXV0ZXhfY3JlYXRlKCZiY21vc19yZXNfbG9jaywgMCwgInJlc19sb2NrIik7CisgICAgYmNtb3NfbXV0ZXhfY3JlYXRlKCZiY21vc19wcmludF9sb2NrLCAwLCAicHJpbnRfbG9jayIpOworICAgIFRNUl9QT09MX0lOSVQoJnRtcl9wb29sKTsKKyAgICBiY21vc19mYXN0bG9ja19pbml0KCZ0bXJfcG9vbC5sb2NrLCAwKTsKKyAgICBiY21vc19mYXN0bG9ja19pbml0KCZiY21vc19tc2dfcmVnaXN0ZXJfbG9jaywgMCk7CisgICAgcmMgPSByYyA/IHJjIDogYmNtb3Nfc3lzX3RpbWVyX2NyZWF0ZSgmdG1yX3Bvb2wuc3lzX3RpbWVyLCBfc3lzX3RpbWVyX2hhbmRsZXIsICZ0bXJfcG9vbCk7CisKKyAgICAvKiBDcmVhdGUgZGVmYXVsdCBidWZmZXIgcG9vbCBpZiBzbyByZXF1ZXN0ZWQgYnkgY29tcGlsYXRpb24gb3B0aW9ucyAqLworI2lmZGVmIEJDTU9TX0JVRl9QT09MX1NJWkUKKyAgICByYyA9IHJjID8gcmMgOiBiY21vc19idWZfcG9vbF9jcmVhdGUoKTsKKyNlbmRpZgorCisgICAgaWYgKCFyYykKKyAgICB7CisgICAgICAgIGJjbW9zX2luaXRpYWxpemVkID0gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKiBDbGVhbnVwIHN5c3RlbSBsaWJyYXJ5CisgKiBcaW5ncm91cCBzeXN0ZW0KKyAqLwordm9pZCBiY21vc19leGl0KHZvaWQpCit7CisgICAgaWYgKCFiY21vc19pbml0aWFsaXplZCkKKyAgICAgICAgcmV0dXJuOworICAgIGJjbW9zX3N5c190aW1lcl9kZXN0cm95KCZ0bXJfcG9vbC5zeXNfdGltZXIpOworICAgIGJjbW9zX211dGV4X2Rlc3Ryb3koJmJjbW9zX3ByaW50X2xvY2spOworICAgIGJjbW9zX211dGV4X2Rlc3Ryb3koJmJjbW9zX3Jlc19sb2NrKTsKKyNpZmRlZiBCQ01PU19CVUZfUE9PTF9TSVpFCisgICAgYmNtb3NfYmxrX3Bvb2xfcmVzZXQoJnN5c19idWZfcG9vbCk7CisgICAgYmNtb3NfYmxrX3Bvb2xfZGVzdHJveSgmc3lzX2J1Zl9wb29sKTsKKyNlbmRpZgorICAgIGJjbW9zX3N5c19leGl0KCk7CisgICAgYmNtb3NfaW5pdGlhbGl6ZWQgPSBCQ01PU19GQUxTRTsKK30KKworLyoKKyAqIENvbW1vbiB0YXNrIHNlcnZpY2VzCisgKi8KKworLyogUXVlcnkgdGFzayBpbmZvICovCitiY21vc19lcnJubyBiY21vc190YXNrX3F1ZXJ5KGNvbnN0IGJjbW9zX3Rhc2sgKnRhc2ssIGJjbW9zX3Rhc2tfcGFybSAqcGFybSkKK3sKKyAgICBpZiAodGFzayA9PSBOVUxMIHx8IHRhc2stPm1hZ2ljICE9IEJDTU9TX1RBU0tfTUFHSUMgfHwgcGFybSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgKnBhcm0gPSB0YXNrLT5wYXJtOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiogVGFzayBpdGVyYXRvcgorICogXHBhcmFtW2luXSBwcmV2ICAgICAgUHJldmlvdXMgdGFzay4gKnByZXY9PU5VTEwgLSBnZXQgZmlyc3QKKyAqIFxyZXR1cm46IEJDTV9FUlJfT0ssIEJDTV9FUlJfTk9FTlQsIEJDTV9FUlJfTk9fTU9SRQorICovCitiY21vc19lcnJubyBiY21vc190YXNrX2dldF9uZXh0KGJjbW9zX3Rhc2sgKipwcmV2KQoreworICAgIGJjbW9zX3Rhc2sgKnRhc2s7CisgICAgaWYgKHByZXYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorICAgIHRhc2sgPSAqcHJldjsKKyAgICBpZiAodGFzayAmJiB0YXNrLT5tYWdpYyAhPSBCQ01PU19UQVNLX01BR0lDKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgaWYgKHRhc2spCisgICAgeworICAgICAgICB0YXNrID0gU1RBSUxRX05FWFQodGFzaywgbGlzdCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHRhc2sgPSBTVEFJTFFfRklSU1QoJnRhc2tfbGlzdCk7CisgICAgfQorICAgICpwcmV2ID0gdGFzazsKKyAgICBpZiAoIXRhc2spCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT19NT1JFOworICAgIH0KKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoKKyAqIE1lc3NhZ2UgcXVldWUKKyAqLworCitzdGF0aWMgdm9pZCBfYmNtb3NfbXNncV9ub3RpZnkoYmNtb3NfbXNnX3F1ZXVlICpxLCBjb25zdCBjaGFyICp0eHQpCit7CisgICAgQkNNT1NfVFJBQ0VfSU5GTygiTXNnIHF1ZXVlICVzOiAlc1xuIiwgcS0+cS5wYXJtLm5hbWUsIHR4dCk7Cit9CisKKy8qIERlY3JlbWVudCBpbi1xdWV1ZSBzdGF0aXN0aWNzICovCitzdGF0aWMgaW5saW5lIHZvaWQgX2JjbW9zX21zZ3Ffc3RhdF9kZWMoYmNtb3NfbXNnX3F1ZXVlX253ICpxKQoreworICAgIGJjbW9zX21zZ19xdWV1ZV9zdGF0ICpzdGF0ID0gJnEtPnN0YXQ7CisgICAgdWludDMyX3Qgb2xkX2luID0gc3RhdC0+bXNnX2luOworCisgICAgaWYgKHN0YXQtPm1zZ19pbiA9PSAwKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJBdHRlbXB0IHRvIGRlY3JlbWVudCBzdGF0aXN0aWNzIGZvciBhbiBlbXB0eSBxdWV1ZSAoJyVzJylcbiIsIHEtPnBhcm0ubmFtZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC0tc3RhdC0+bXNnX2luOworICAgICAgICArK3N0YXQtPm1zZ19yZWNlaXZlZDsKKyAgICB9CisKKyAgICBpZiAob2xkX2luID09IHEtPnBhcm0ubG93X3dtKQorICAgIHsKKyAgICAgICAgcS0+cGFybS5ub3RpZnkoKGJjbW9zX21zZ19xdWV1ZSAqKXEsICJiZWNvbWVzIHVuY29uZ2VzdGVkIik7CisgICAgICAgIHN0YXQtPmlzX2Nvbmdlc3RlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KK30KKworLyogSW5jcmVtZW50IGluLXF1ZXVlIHN0YXRpc3RpY3MgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfYmNtb3NfbXNncV9zdGF0X2luYyhiY21vc19tc2dfcXVldWVfbncgKnEpCit7CisgICAgYmNtb3NfbXNnX3F1ZXVlX3N0YXQgKnN0YXQgPSAmcS0+c3RhdDsKKyAgICB1aW50MzJfdCBvbGRfaW4gPSBzdGF0LT5tc2dfaW47CisKKyAgICArK3N0YXQtPm1zZ19pbjsKKyAgICArK3N0YXQtPm1zZ19zZW50OworICAgIGlmIChvbGRfaW4gPT0gcS0+cGFybS5oaWdoX3dtKQorICAgIHsKKyAgICAgICAgcS0+cGFybS5ub3RpZnkoKGJjbW9zX21zZ19xdWV1ZSAqKXEsICJiZWNvbWVzIGNvbmdlc3RlZCIpOworICAgICAgICBzdGF0LT5pc19jb25nZXN0ZWQgPSBCQ01PU19UUlVFOworICAgIH0KKyAgICBpZiAoc3RhdC0+aXNfY29uZ2VzdGVkKQorICAgICAgICArK3N0YXQtPm1zZ19hbG1vc3RfZnVsbDsKK30KKworc3RhdGljIHZvaWQgX2JjbW9zX3Fncm91cF9ub3RpZnkoYmNtb3NfbXNnX3Fncm91cCAqcWdyb3VwLCBjb25zdCBjaGFyICp0eHQpCit7CisgICAgQkNNT1NfVFJBQ0VfSU5GTygiTXNnIHF1ZXVlICVzOiAlc1xuIiwgcWdyb3VwLT5wYXJtLm5hbWUsIHR4dCk7Cit9CisKKy8qIERlY3JlbWVudCBpbi1xdWV1ZSBzdGF0aXN0aWNzIGZvciBxdWV1ZSBncm91cCAqLworc3RhdGljIGlubGluZSB2b2lkIF9iY21vc19xZ3JvdXBfc3RhdF9kZWMoYmNtb3NfbXNnX3Fncm91cCAqcWdyb3VwKQoreworICAgIGJjbW9zX21zZ19xdWV1ZV9zdGF0ICpzdGF0ID0gJnFncm91cC0+c3RhdDsKKyAgICB1aW50MzJfdCBvbGRfaW4gPSBzdGF0LT5tc2dfaW47CisKKyAgICBpZiAoc3RhdC0+bXNnX2luID09IDApCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9FUlIoIkF0dGVtcHQgdG8gZGVjcmVtZW50IHN0YXRpc3RpY3MgZm9yIGFuIGVtcHR5IHF1ZXVlICgnJXMnKVxuIiwgcWdyb3VwLT5wYXJtLm5hbWUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAtLXN0YXQtPm1zZ19pbjsKKyAgICAgICAgKytzdGF0LT5tc2dfcmVjZWl2ZWQ7CisgICAgfQorCisgICAgaWYgKG9sZF9pbiA9PSBxZ3JvdXAtPnBhcm0ubG93X3dtKQorICAgIHsKKyAgICAgICAgcWdyb3VwLT5wYXJtLm5vdGlmeShxZ3JvdXAsICJiZWNvbWVzIHVuY29uZ2VzdGVkIik7CisgICAgICAgIHN0YXQtPmlzX2Nvbmdlc3RlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KK30KKworLyogSW5jcmVtZW50IGluLXF1ZXVlIHN0YXRpc3RpY3MgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfYmNtb3NfcWdyb3VwX3N0YXRfaW5jKGJjbW9zX21zZ19xZ3JvdXAgKnFncm91cCkKK3sKKyAgICBiY21vc19tc2dfcXVldWVfc3RhdCAqc3RhdCA9ICZxZ3JvdXAtPnN0YXQ7CisgICAgdWludDMyX3Qgb2xkX2luID0gc3RhdC0+bXNnX2luOworCisgICAgKytzdGF0LT5tc2dfaW47CisgICAgKytzdGF0LT5tc2dfc2VudDsKKyAgICBpZiAob2xkX2luID09IHFncm91cC0+cGFybS5oaWdoX3dtKQorICAgIHsKKyAgICAgICAgcWdyb3VwLT5wYXJtLm5vdGlmeShxZ3JvdXAsICJiZWNvbWVzIGNvbmdlc3RlZCIpOworICAgICAgICBzdGF0LT5pc19jb25nZXN0ZWQgPSBCQ01PU19UUlVFOworICAgIH0KKyAgICBpZiAoc3RhdC0+aXNfY29uZ2VzdGVkKQorICAgICAgICArK3N0YXQtPm1zZ19hbG1vc3RfZnVsbDsKK30KKworCisvKiBHZXQgbWVzc2FnZSBmcm9tIHF1ZXVlLgorICogVXJnZW50IHF1ZXVlIGlzIGNoZWNrZWQgMXN0LCB0aGVuIHJlZ3VsYXIgcXVldWUKKyAqIE11c3QgYmUgY2FsbGVkIHVuZGVyIGxvY2shCisgKiBSZXR1cm5zIG1zZyBvciBOVUxMIGlmIHF1ZXVlIGlzIGVtcHR5CisgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfbXNnICpfYmNtb3NfbXNnX2dldChiY21vc19tc2dfcXVldWVfbncgKnEpCit7CisgICAgYmNtb3NfbXNnICptc2c7CisKKyAgICBtc2cgPSBTVEFJTFFfRklSU1QoJnEtPm1zZ2xfdXJnKTsKKyAgICBpZiAobXNnKQorICAgIHsKKyAgICAgICAgU1RBSUxRX1JFTU9WRV9IRUFEKCZxLT5tc2dsX3VyZywgbmV4dCk7CisgICAgICAgIF9iY21vc19tc2dxX3N0YXRfZGVjKHEpOworICAgICAgICByZXR1cm4gbXNnOworICAgIH0KKworICAgIG1zZyA9IFNUQUlMUV9GSVJTVCgmcS0+bXNnbCk7CisgICAgaWYgKG1zZykKKyAgICB7CisgICAgICAgIFNUQUlMUV9SRU1PVkVfSEVBRCgmcS0+bXNnbCwgbmV4dCk7CisgICAgICAgIF9iY21vc19tc2dxX3N0YXRfZGVjKHEpOworICAgIH0KKworICAgIHJldHVybiBtc2c7Cit9CisKKy8qIFB1dCBtZXNzYWdlIG9uIHF1ZXVlLgorICogTXVzdCBiZSBjYWxsZWQgdW5kZXIgbG9jayEKKyAqIFJldHVybnMgZXJyb3IgaW4gY2FzZSBvZiBxdWV1ZSBvdmVyZmxvdworICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Vycm5vIF9iY21vc19tc2dfcHV0KGJjbW9zX21zZ19xdWV1ZV9udyAqcSwgYmNtb3NfbXNnICptc2csIGJjbW9zX21zZ19zZW5kX2ZsYWdzIGZsYWdzKQoreworICAgIC8qIE92ZXJmbG93IGNoZWNrICovCisgICAgaWYgKHEtPnN0YXQubXNnX2luID49IHEtPnBhcm0uc2l6ZSkKKyAgICB7CisgICAgICAgIGlmICghKGZsYWdzICYgQkNNT1NfTVNHX1NFTkRfTk9MSU1JVCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICsrcS0+c3RhdC5tc2dfZGlzY2FyZGVkOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT1ZFUkZMT1c7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogUHV0IG9udG8gdGhlIHJlbGV2YW50IHF1ZXVlICovCisgICAgaWYgKChmbGFncyAmIEJDTU9TX01TR19TRU5EX1VSR0VOVCkpCisgICAgICAgIFNUQUlMUV9JTlNFUlRfVEFJTCgmcS0+bXNnbF91cmcsIG1zZywgbmV4dCk7CisgICAgZWxzZQorICAgICAgICBTVEFJTFFfSU5TRVJUX1RBSUwoJnEtPm1zZ2wsIG1zZywgbmV4dCk7CisgICAgX2JjbW9zX21zZ3Ffc3RhdF9pbmMocSk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogQ3JlYXRlIG1lc3NhZ2UgcXVldWUgd2l0aG91dCB3YWl0IHN1cHBvcnQgKi8KK3N0YXRpYyB2b2lkIGJjbW9zX21zZ19xdWV1ZV9ud19pbml0KGJjbW9zX21zZ19xdWV1ZV9udyAqcSwgY29uc3QgYmNtb3NfbXNnX3F1ZXVlX3Bhcm0gKnBhcm0pCit7CisgICAgcS0+cGFybSA9ICpwYXJtOworICAgIFNUQUlMUV9JTklUKCZxLT5tc2dsKTsKKyAgICBTVEFJTFFfSU5JVCgmcS0+bXNnbF91cmcpOworICAgIGJjbW9zX2Zhc3Rsb2NrX2luaXQoJnEtPmxvY2ssIHBhcm0tPmZsYWdzKTsKKyAgICBtZW1zZXQoJnEtPnN0YXQsIDAsIHNpemVvZihxLT5zdGF0KSk7CisgICAgcS0+ZmxhZ3MgPSAwOworICAgIGlmICghcS0+cGFybS5zaXplKQorICAgICAgICBxLT5wYXJtLnNpemUgPSBCQ01PU19NU0dfUVVFVUVfU0laRV9VTkxJTUlURUQ7CisgICAgaWYgKCFxLT5wYXJtLmhpZ2hfd20pCisgICAgICAgIHEtPnBhcm0uaGlnaF93bSA9IEJDTU9TX01TR19RVUVVRV9TSVpFX1VOTElNSVRFRDsKKyAgICBpZiAoIXEtPnBhcm0ubG93X3dtKQorICAgICAgICBxLT5wYXJtLmxvd193bSA9IHEtPnBhcm0uaGlnaF93bTsKKyAgICBpZiAoIXEtPnBhcm0ubm90aWZ5KQorICAgICAgICBxLT5wYXJtLm5vdGlmeSA9IF9iY21vc19tc2dxX25vdGlmeTsKK30KKworLyogRGVzdHJveSBtZXNzYWdlIGxpc3QgKi8KK3N0YXRpYyB2b2lkIGJjbW9zX21zZ19saXN0X2Rlc3Ryb3koYmNtb3NfbXNnX2xpc3QgKmwpCit7CisgICAgYmNtb3NfbXNnICptc2csICp0bXA7CisgICAgU1RBSUxRX0ZPUkVBQ0hfU0FGRShtc2csIGwsIG5leHQsIHRtcCkKKyAgICB7CisgICAgICAgIFNUQUlMUV9SRU1PVkVfSEVBRChsLCBuZXh0KTsKKyAgICAgICAgYmNtb3NfbXNnX2ZyZWUobXNnKTsKKyAgICB9Cit9CisKKyNpZmRlZiBCQ01PU19NU0dfUVVFVUVfUkVNT1RFX1NVUFBPUlQKKworLyogUmVtb3RlIHF1ZXVlIHN1cHBvcnQgLSBjb21tb24gcGFydCBvZiBjcmVhdGUvZGVzdHJveSAqLworCitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbW9zX21zZ19xdWV1ZV9kZXN0cm95X3JlbW90ZV9lcChiY21vc19tc2dfcXVldWUgKnF1ZXVlKQoreworICAgIGlmIChxdWV1ZS0+cS5wYXJtLmNsb3NlKQorICAgICAgICBxdWV1ZS0+cS5wYXJtLmNsb3NlKHF1ZXVlKTsKKyAgICBiY21vc19tdXRleF9kZXN0cm95KCZxdWV1ZS0+c2VuZF9sb2NrKTsKKyAgICBpZiAocXVldWUtPnNlbmRfYnVmKQorICAgICAgICBiY21vc19mcmVlKHF1ZXVlLT5zZW5kX2J1Zik7CisgICAgaWYgKHF1ZXVlLT5yZWN2X2J1ZikKKyAgICAgICAgYmNtb3NfZnJlZShxdWV1ZS0+cmVjdl9idWYpOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbW9zX21zZ19xdWV1ZV9jcmVhdGVfcmVtb3RlX2VwKGJjbW9zX21zZ19xdWV1ZSAqcXVldWUpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICAvKiBBbGxvY2F0ZSB0eCBhbmQgcnggYnVmZmVycyAqLworICAgIGlmICghcXVldWUtPnEucGFybS5tYXhfbXR1KQorICAgIHsKKyAgICAgICAgcXVldWUtPnEucGFybS5tYXhfbXR1ID0gQkNNT1NfTVNHX1FVRVVFX0RFRkFVTFRfTUFYX01UVTsKKyAgICB9CisgICAgcXVldWUtPnNlbmRfYnVmID0gYmNtb3NfY2FsbG9jKHF1ZXVlLT5xLnBhcm0ubWF4X210dSk7CisgICAgaWYgKCFxdWV1ZS0+c2VuZF9idWYpCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9OT01FTSwgIkNhbid0IGFsbG9jYXRlIHNlbmRfYnVmXG4iKTsKKyAgICB9CisKKyAgICBxdWV1ZS0+cmVjdl9idWYgPSBiY21vc19jYWxsb2MocXVldWUtPnEucGFybS5tYXhfbXR1KTsKKyAgICBpZiAoIXF1ZXVlLT5yZWN2X2J1ZikKKyAgICB7CisgICAgICAgIGJjbW9zX2ZyZWUocXVldWUtPnNlbmRfYnVmKTsKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfTk9NRU0sICJDYW4ndCBhbGxvY2F0ZSByZWN2X2J1ZlxuIik7CisgICAgfQorICAgIGJjbW9zX211dGV4X2NyZWF0ZSgmcXVldWUtPnNlbmRfbG9jaywgMCwgcXVldWUtPnEucGFybS5uYW1lKTsKKworICAgIHN3aXRjaCAocXVldWUtPnEucGFybS5lcF90eXBlKQorICAgIHsKKyNpZmRlZiBCQ01PU19NU0dfUVVFVUVfRE9NQUlOX1NPQ0tFVAorICAgIGNhc2UgQkNNT1NfTVNHX1FVRVVFX0VQX0RPTUFJTl9TT0NLRVQ6CisgICAgICAgIHJjID0gYmNtb3Nfc3lzX21zZ19xdWV1ZV9kb21haW5fc29ja2V0X29wZW4ocXVldWUpOworICAgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIEJDTU9TX01TR19RVUVVRV9VRFBfU09DS0VUCisgICAgY2FzZSBCQ01PU19NU0dfUVVFVUVfRVBfVURQX1NPQ0tFVDoKKyAgICAgICAgcmMgPSBiY21vc19zeXNfbXNnX3F1ZXVlX3VkcF9zb2NrZXRfb3BlbihxdWV1ZSk7CisgICAgICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgQkNNT1NfTVNHX1FVRVVFX1VTRVJfREVGSU5FRAorICAgIGNhc2UgQkNNT1NfTVNHX1FVRVVFX0VQX1VTRVJfREVGSU5FRDoKKyAgICAgICAgaWYgKHBhcm0ub3BlbiA9PSBOVUxMIHx8IHBhcm0uY2xvc2UgPT0gTlVMTCB8fCBwYXJtLnNlbmQ9PU5VTEwgfHwgcGFybS5yZWN2ID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmMgPSBwYXJtLm9wZW4ocXVldWUpOworICAgICAgICBicmVhazsKKyNlbmRpZgorICAgIGRlZmF1bHQ6CisgICAgICAgIHJjID0gQkNNX0VSUl9QQVJNOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAocmMpCisgICAgeworICAgICAgICBfYmNtb3NfbXNnX3F1ZXVlX2Rlc3Ryb3lfcmVtb3RlX2VwKHF1ZXVlKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKyNlbmRpZiAvKiAjaWZkZWYgQkNNT1NfTVNHX1FVRVVFX1JFTU9URV9TVVBQT1JUICovCisKKy8qIENyZWF0ZSBtZXNzYWdlIHF1ZXVlLiAqLworYmNtb3NfZXJybm8gYmNtb3NfbXNnX3F1ZXVlX2NyZWF0ZShiY21vc19tc2dfcXVldWUgKnF1ZXVlLCBjb25zdCBiY21vc19tc2dfcXVldWVfcGFybSAqcGFybSkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIGlmICghcXVldWUgfHwgIXBhcm0pCisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX1BBUk0sICJxdWV1ZSAlcCwgcGFybSAlcFxuIiwgcXVldWUsIHBhcm0pOworICAgIG1lbXNldChxdWV1ZSwgMCwgc2l6ZW9mKCpxdWV1ZSkpOworICAgIHF1ZXVlLT5xLnBhcm0gPSAqcGFybTsKKworICAgIGlmIChwYXJtLT5lcF90eXBlID09IEJDTU9TX01TR19RVUVVRV9FUF9MT0NBTCkKKyAgICB7CisgICAgICAgIHJjID0gYmNtb3Nfc2VtX2NyZWF0ZSgmcXVldWUtPm0sIDAsIHBhcm0tPmZsYWdzLCBxdWV1ZS0+cS5wYXJtLm5hbWUpOworICAgICAgICBpZiAoIXJjKQorICAgICAgICAgICAgYmNtb3NfbXNnX3F1ZXVlX253X2luaXQoJnF1ZXVlLT5xLCBwYXJtKTsKKyAgICB9CisgICAgZWxzZQorI2lmZGVmIEJDTU9TX01TR19RVUVVRV9SRU1PVEVfU1VQUE9SVAorICAgIHsKKyAgICAgICAgcmMgPSBfYmNtb3NfbXNnX3F1ZXVlX2NyZWF0ZV9yZW1vdGVfZXAocXVldWUpOworICAgIH0KKyNlbHNlCisgICAgeworICAgICAgICByYyA9IEJDTV9FUlJfUEFSTTsKKyAgICB9CisjZW5kaWYKKworICAgIGlmIChyYykKKyAgICAgICAgcmV0dXJuIHJjOworCisgICAgcXVldWUtPm1hZ2ljID0gQkNNT1NfTVNHX1FVRVVFX1ZBTElEOworICAgIC8qIENvcHkgbmFtZSB0byBtYWtlIHN1cmUgdGhhdCBpdCBpcyBub3QgcmVsZWFzZWQgLSBpbiBjYXNlIGl0IHdhcyBvbiB0aGUgc3RhY2sgKi8KKyAgICBpZiAocXVldWUtPnEucGFybS5uYW1lKQorICAgIHsKKyAgICAgICAgc3RybmNweShxdWV1ZS0+bmFtZSwgcXVldWUtPnEucGFybS5uYW1lLCBzaXplb2YocXVldWUtPm5hbWUpIC0gMSk7CisgICAgICAgIHF1ZXVlLT5xLnBhcm0ubmFtZSA9IHF1ZXVlLT5uYW1lOworICAgIH0KKyAgICBiY21vc19tdXRleF9sb2NrKCZiY21vc19yZXNfbG9jayk7CisgICAgU1RBSUxRX0lOU0VSVF9UQUlMKCZtc2dfcXVldWVfbGlzdCwgcXVldWUsIGxpc3QpOworICAgIGJjbW9zX211dGV4X3VubG9jaygmYmNtb3NfcmVzX2xvY2spOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBEZXN0cm95IHF1ZXVlICovCitiY21vc19lcnJubyBiY21vc19tc2dfcXVldWVfZGVzdHJveShiY21vc19tc2dfcXVldWUgKnF1ZXVlKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIGlmICghcXVldWUgfHwgcXVldWUtPm1hZ2ljICE9IEJDTU9TX01TR19RVUVVRV9WQUxJRCkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX1BBUk0sICJxdWV1ZSBoYW5kbGUgaXMgaW52YWxpZFxuIik7CisgICAgfQorICAgIHF1ZXVlLT5tYWdpYyA9IEJDTU9TX01TR19RVUVVRV9ERUxFVEVEOworICAgIGJjbW9zX211dGV4X2xvY2soJmJjbW9zX3Jlc19sb2NrKTsKKyAgICBTVEFJTFFfUkVNT1ZFKCZtc2dfcXVldWVfbGlzdCwgcXVldWUsIGJjbW9zX21zZ19xdWV1ZSwgbGlzdCk7CisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZiY21vc19yZXNfbG9jayk7CisKKyAgICBpZiAocXVldWUtPnEucGFybS5lcF90eXBlID09IEJDTU9TX01TR19RVUVVRV9FUF9MT0NBTCkKKyAgICB7CisgICAgICAgIGJjbW9zX3NlbV9kZXN0cm95KCZxdWV1ZS0+bSk7CisgICAgICAgIC8qIFJlbGVhc2UgYWxsIHBlbmRpbmcgbWVzc2FnZXMgKi8KKyAgICAgICAgYmNtb3NfbXNnX2xpc3RfZGVzdHJveSgmcXVldWUtPnEubXNnbF91cmcpOworICAgICAgICBiY21vc19tc2dfbGlzdF9kZXN0cm95KCZxdWV1ZS0+cS5tc2dsKTsKKyAgICB9CisjaWZkZWYgQkNNT1NfTVNHX1FVRVVFX1JFTU9URV9TVVBQT1JUCisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmMgPSBfYmNtb3NfbXNnX3F1ZXVlX2Rlc3Ryb3lfcmVtb3RlX2VwKHF1ZXVlKTsKKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybiByYzsKK30KKworLyogR2V0IHF1ZXVlIGluZm8gKi8KK2JjbW9zX2Vycm5vIGJjbW9zX21zZ19xdWV1ZV9xdWVyeShjb25zdCBiY21vc19tc2dfcXVldWUgKnF1ZXVlLCBiY21vc19tc2dfcXVldWVfaW5mbyAqaW5mbykKK3sKKyAgICBpZiAoIXF1ZXVlIHx8ICFpbmZvKQorICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9QQVJNLCAicXVldWUgJXAsIGluZm8gJXBcbiIsIHF1ZXVlLCBpbmZvKTsKKyAgICBpbmZvLT5zdGF0ID0gcXVldWUtPnEuc3RhdDsKKyAgICBpbmZvLT5wYXJtID0gcXVldWUtPnEucGFybTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogTWVzc2FnZSBxdWV1ZSBpdGVyYXRvciAqLworYmNtb3NfZXJybm8gYmNtb3NfbXNnX3F1ZXVlX2dldF9uZXh0KGNvbnN0IGJjbW9zX21zZ19xdWV1ZSAqKnByZXYpCit7CisgICAgY29uc3QgYmNtb3NfbXNnX3F1ZXVlICpxdWV1ZTsKKworICAgIGlmIChwcmV2ID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKyAgICBxdWV1ZSA9ICpwcmV2OworICAgIGlmIChxdWV1ZSAmJiBxdWV1ZS0+bWFnaWMgIT0gQkNNT1NfTVNHX1FVRVVFX1ZBTElEKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgaWYgKHF1ZXVlKQorICAgIHsKKyAgICAgICAgcXVldWUgPSBTVEFJTFFfTkVYVChxdWV1ZSwgbGlzdCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHF1ZXVlID0gU1RBSUxRX0ZJUlNUKCZtc2dfcXVldWVfbGlzdCk7CisgICAgfQorICAgICpwcmV2ID0gcXVldWU7CisgICAgaWYgKCFxdWV1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PX01PUkU7CisgICAgfQorICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisjaWZkZWYgQkNNT1NfTVNHX1FVRVVFX1JFTU9URV9TVVBQT1JUCisKKy8qIFBhY2sgLyB1bnBhY2sgbWVzc2FnZSBoZWFkZXIuCisgKiBJbiB0aGUgZnV0dXJlIHdlIG1pZ2h0IGFkb3B0IGJjbW9sdF9idWYgc2VydmljZSBpbnRvIE9TIGFic3RyYWN0aW9uIGFuZCB1c2UgaXQKKyAqIGZvciBwYWNraW5nIC8gdW5wYWNraW5nLgorICovCisKK3ZvaWQgYmNtb3NfbXNnX2hkcl9wYWNrKGNvbnN0IGJjbW9zX21zZyAqbXNnLCB1aW50OF90ICpidWYsIHVpbnQzMl90IGRhdGFfc2l6ZSkKK3sKKyAgICB1aW50MTZfdCB2YWwxNjsKKyAgICB1aW50MzJfdCB2YWwzMjsKKyAgICB2YWwxNiA9IEJDTU9TX0VORElBTl9DUFVfVE9fQklHX1UxNihtc2ctPnR5cGUpOworICAgIG1lbWNweShidWYsICZ2YWwxNiwgc2l6ZW9mKHZhbDE2KSk7CisgICAgYnVmWzJdID0gKHVpbnQ4X3QpbXNnLT5pbnN0YW5jZTsKKyAgICBidWZbM10gPSAodWludDhfdCltc2ctPnNlbmRlcjsKKyAgICB2YWwzMiA9IEJDTU9TX0VORElBTl9DUFVfVE9fQklHX1UzMihkYXRhX3NpemUpOworICAgIG1lbWNweSgmYnVmWzRdLCAmdmFsMzIsIHNpemVvZih2YWwzMikpOworfQorCit2b2lkIGJjbW9zX21zZ19oZHJfdW5wYWNrKGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgYmNtb3NfbXNnICptc2cpCit7CisgICAgdWludDE2X3QgdmFsMTY7CisgICAgdWludDMyX3QgdmFsMzI7CisgICAgbWVtY3B5KCZ2YWwxNiwgYnVmLCBzaXplb2YodmFsMTYpKTsKKyAgICB2YWwxNiA9IEJDTU9TX0VORElBTl9CSUdfVE9fQ1BVX1UxNih2YWwxNik7CisgICAgbXNnLT50eXBlID0gKGJjbW9zX21zZ19pZCl2YWwxNjsKKyAgICBtc2ctPmluc3RhbmNlID0gKGJjbW9zX21zZ19pbnN0YW5jZSlidWZbMl07CisgICAgbXNnLT5zZW5kZXIgPSAoYmNtb3NfbW9kdWxlX2lkKWJ1ZlszXTsKKyAgICBtZW1jcHkoJnZhbDMyLCAmYnVmWzRdLCBzaXplb2YodmFsMzIpKTsKKyAgICBtc2ctPnNpemUgPSBCQ01PU19FTkRJQU5fQklHX1RPX0NQVV9VMzIodmFsMzIpOyAvKiBjYW4gYmUgb3ZlcndyaXR0ZW4gYnkgdW5wYWNrZXIgKi8KKyAgICBtc2ctPmhhbmRsZXIgPSBOVUxMOworICAgIG1zZy0+c2VuZF9mbGFncyA9IDA7Cit9CisKKy8qIFNlbmQgbWVzc2FnZSB0byByZW1vdGUgRVAgd3JhcHBlciAqLworc3RhdGljIGJjbW9zX2Vycm5vIF9iY21vc19tc2dfc2VuZF90b19yZW1vdGVfZXAoYmNtb3NfbXNnX3F1ZXVlICpxdWV1ZSwgYmNtb3NfbXNnICptc2csIGJjbW9zX21zZ19zZW5kX2ZsYWdzIGZsYWdzKQoreworICAgIHVpbnQ4X3QgKmJ1ZiA9IE5VTEw7CisgICAgdWludDMyX3QgYnVmX2xlbmd0aCA9IDA7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICBiY21vc19tdXRleF9sb2NrKCZxdWV1ZS0+c2VuZF9sb2NrKTsKKyAgICByYyA9IHF1ZXVlLT5xLnBhcm0ucGFjayhxdWV1ZSwgbXNnLCAmYnVmLCAmYnVmX2xlbmd0aCk7CisgICAgcmMgPSByYyA/IHJjIDogcXVldWUtPnEucGFybS5zZW5kKHF1ZXVlLCBidWYsIGJ1Zl9sZW5ndGgpOworICAgIGJjbW9zX211dGV4X3VubG9jaygmcXVldWUtPnNlbmRfbG9jayk7CisKKyAgICAvKiBSZWxlYXNlIGlmIHNlbnQgc3VjY2Vzc2Z1bGx5IG9yIGlmIGF1dG8tcmVsZWFzZSBmbGFnIGlzIHNldCAqLworICAgIGlmIChyYyA9PSBCQ01fRVJSX09LIHx8ICEoZmxhZ3MgJiBCQ01PU19NU0dfU0VORF9OT19GUkVFX09OX0VSUk9SKSkKKyAgICB7CisgICAgICAgIGJjbW9zX21zZ19mcmVlKG1zZyk7CisgICAgfQorICAgIGlmIChidWYgJiYgcXVldWUtPnEucGFybS5mcmVlX3BhY2tlZCkKKyAgICB7CisgICAgICAgIHF1ZXVlLT5xLnBhcm0uZnJlZV9wYWNrZWQocXVldWUsIGJ1Zik7CisgICAgfQorICAgIGlmIChyYykKKyAgICB7CisgICAgICAgICsrcXVldWUtPnEuc3RhdC5tc2dfZGlzY2FyZGVkOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICArK3F1ZXVlLT5xLnN0YXQubXNnX3NlbnQ7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKiBSZWNlaXZlIG1lc3NhZ2UgZnJvbSByZW1vdGUgRVAgd3JhcHBlciAqLworc3RhdGljIGJjbW9zX2Vycm5vIF9iY21vc19tc2dfcmVjdl9mcm9tX3JlbW90ZV9lcChiY21vc19tc2dfcXVldWUgKnF1ZXVlLCB1aW50MzJfdCB0aW1lb3V0LCBiY21vc19tc2cgKiptc2cpCit7CisgICAgdWludDhfdCAqYnVmID0gTlVMTDsKKyAgICB1aW50MzJfdCBidWZfbGVuZ3RoID0gMDsKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIHJjID0gcXVldWUtPnEucGFybS5yZWN2KHF1ZXVlLCB0aW1lb3V0LCAmYnVmLCAmYnVmX2xlbmd0aCk7CisgICAgcmMgPSByYyA/IHJjIDogcXVldWUtPnEucGFybS51bnBhY2socXVldWUsIGJ1ZiwgYnVmX2xlbmd0aCwgbXNnKTsKKyAgICBpZiAoYnVmICYmIHF1ZXVlLT5xLnBhcm0uZnJlZV9wYWNrZWQpCisgICAgeworICAgICAgICBxdWV1ZS0+cS5wYXJtLmZyZWVfcGFja2VkKHF1ZXVlLCBidWYpOworICAgIH0KKyAgICBpZiAoIXJjKQorICAgIHsKKyAgICAgICAgKytxdWV1ZS0+cS5zdGF0Lm1zZ19yZWNlaXZlZDsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKyNlbmRpZiAvKiBCQ01PU19NU0dfUVVFVUVfUkVNT1RFX1NVUFBPUlQgKi8KKworLyogU2VuZCBtZXNzYWdlIHRvIHF1ZXVlICovCitiY21vc19lcnJubyBiY21vc19tc2dfc2VuZChiY21vc19tc2dfcXVldWUgKnF1ZXVlLCBiY21vc19tc2cgKm1zZywgYmNtb3NfbXNnX3NlbmRfZmxhZ3MgZmxhZ3MpCit7CisgICAgbG9uZyBsb2NrX2ZsYWdzOworICAgIGJjbW9zX2Vycm5vIHJjOworCisjaWZkZWYgQkNNT1NfTVNHX1FVRVVFX1JFTU9URV9TVVBQT1JUCisgICAgaWYgKHF1ZXVlLT5xLnBhcm0uZXBfdHlwZSAhPSBCQ01PU19NU0dfUVVFVUVfRVBfTE9DQUwpCisgICAgeworICAgICAgICByZXR1cm4gX2JjbW9zX21zZ19zZW5kX3RvX3JlbW90ZV9lcChxdWV1ZSwgbXNnLCBmbGFncyk7CisgICAgfQorI2VuZGlmCisKKyAgICBsb2NrX2ZsYWdzID0gYmNtb3NfZmFzdGxvY2tfbG9jaygmcXVldWUtPnEubG9jayk7CisgICAgcmMgPSBfYmNtb3NfbXNnX3B1dCgmcXVldWUtPnEsIG1zZywgZmxhZ3MpOworICAgIGlmIChyYykKKyAgICB7CisgICAgICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmcXVldWUtPnEubG9jaywgbG9ja19mbGFncyk7CisgICAgICAgIGlmICghKGZsYWdzICYgQkNNT1NfTVNHX1NFTkRfTk9fRlJFRV9PTl9FUlJPUikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX21zZ19mcmVlKG1zZyk7CisgICAgICAgIH0KKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJPdmVyZmxvdzogUXVldWUgJXNcbiIsIHF1ZXVlLT5xLnBhcm0ubmFtZSk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICAvKiBTdWNjZXNzICovCisgICAgaWYgKHF1ZXVlLT5pc193YWl0aW5nKQorICAgIHsKKyAgICAgICAgLyogS2ljayB3YWl0aW5nIHRhc2sgKi8KKyAgICAgICAgcXVldWUtPmlzX3dhaXRpbmcgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZxdWV1ZS0+cS5sb2NrLCBsb2NrX2ZsYWdzKTsKKyAgICAgICAgYmNtb3Nfc2VtX3Bvc3QoJnF1ZXVlLT5tKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZxdWV1ZS0+cS5sb2NrLCBsb2NrX2ZsYWdzKTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogU2VuZCBtZXNzYWdlIHRvIG1vZHVsZSAoaW50ZXJuYWwpIC0gZG9lc24ndCBwb3N0IGFueSBzZW1hcGhvcmVzIHNvIGl0J3Mgc2FmZSB0byBjYWxsIHVuZGVyIGEgZmFzdGxvY2sgKi8KK3N0YXRpYyBiY21vc19lcnJubyBfYmNtb3NfbXNnX3NlbmRfdG9fbW9kdWxlKAorICAgIGJjbW9zX21vZHVsZV9pZCBtb2R1bGVfaWQsCisgICAgYmNtb3NfbXNnICptc2csCisgICAgYmNtb3NfbXNnX3NlbmRfZmxhZ3MgZmxhZ3MsCisgICAgYmNtb3Nfc2VtICoqc2VtX3RvX3Bvc3QpCit7CisgICAgYmNtb3NfbW9kdWxlICptb2R1bGUgPSBfYmNtb3NfbW9kdWxlX2dldChtb2R1bGVfaWQpOworICAgIGJjbW9zX3Rhc2sgKnRhc2s7CisgICAgbG9uZyBsb2NrX2ZsYWdzLCBxX2xvY2tfZmxhZ3M7CisgICAgdWludDMyX3QgYWN0aXZlX21vZHVsZXM7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgKnNlbV90b19wb3N0ID0gTlVMTDsKKworICAgIGlmICghbW9kdWxlIHx8ICFtc2ctPmhhbmRsZXIpCisgICAgeworICAgICAgICBpZiAoIW1vZHVsZSkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJNb2R1bGUgJWQgZG9lc24ndCBleGlzdFxuIiwgbW9kdWxlX2lkKTsKKyAgICAgICAgICAgIHJjID0gQkNNX0VSUl9OT0VOVDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9TX1RSQUNFX0VSUigibXNnLT5oYW5kbGVyIGlzIG5vdCBzZXQuIG1zZy0+dHlwZT0lZFxuIiwgbXNnLT50eXBlKTsKKyAgICAgICAgICAgIHJjID0gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisgICAgICAgIGlmICghKGZsYWdzICYgQkNNT1NfTVNHX1NFTkRfTk9fRlJFRV9PTl9FUlJPUikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX21zZ19mcmVlKG1zZyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIHRhc2sgPSBtb2R1bGUtPm15X3Rhc2s7CisgICAgbG9ja19mbGFncyA9IGJjbW9zX2Zhc3Rsb2NrX2xvY2soJnRhc2stPmFjdGl2ZV9sb2NrKTsKKyAgICBxX2xvY2tfZmxhZ3MgPSBiY21vc19mYXN0bG9ja19sb2NrKCZtb2R1bGUtPm1zZ3EubG9jayk7CisKKyAgICByYyA9IF9iY21vc19tc2dfcHV0KCZtb2R1bGUtPm1zZ3EsIG1zZywgZmxhZ3MpOworICAgIGlmIChyYykKKyAgICB7CisgICAgICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmbW9kdWxlLT5tc2dxLmxvY2ssIHFfbG9ja19mbGFncyk7CisgICAgICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmdGFzay0+YWN0aXZlX2xvY2ssIGxvY2tfZmxhZ3MpOworCisgICAgICAgIC8qIFF1ZXVlIG92ZXJmbG93ICovCisgICAgICAgIGlmICghKGZsYWdzICYgQkNNT1NfTVNHX1NFTkRfTk9fRlJFRV9PTl9FUlJPUikpCisgICAgICAgICAgICBiY21vc19tc2dfZnJlZShtc2cpOworCisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiT3ZlcmZsb3c6IFF1ZXVlICVzXG4iLCBtb2R1bGUtPnBhcm0ucXBhcm0ubmFtZSk7CisKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKyAgICBiY21vc19mYXN0bG9ja191bmxvY2soJm1vZHVsZS0+bXNncS5sb2NrLCBxX2xvY2tfZmxhZ3MpOworCisgICAgLyogU3VjY2Vzcy4gVXBkYXRlIGFjdGl2ZV9tb2R1bGVzIHRhc2sgYW5kIGtpY2sgdGhlIHRhc2sgKi8KKyAgICBhY3RpdmVfbW9kdWxlcyA9IHRhc2stPmFjdGl2ZV9tb2R1bGVzOworICAgIHRhc2stPmFjdGl2ZV9tb2R1bGVzIHw9ICgxIDw8IG1vZHVsZS0+aWR4KTsKKyAgICBiY21vc19mYXN0bG9ja191bmxvY2soJnRhc2stPmFjdGl2ZV9sb2NrLCBsb2NrX2ZsYWdzKTsKKworICAgIC8qIE5vdGlmeSBjYWxsZXIgdG8ga2ljayB0YXNrIGlmIHRoZXJlIGlzIGEgY2hhbmNlIGl0IHdhcyB3YWl0aW5nICovCisgICAgaWYgKCFhY3RpdmVfbW9kdWxlcykKKyAgICAgICAgKnNlbV90b19wb3N0ID0gJnRhc2stPmFjdGl2ZV9zZW07CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogU2VuZCBtZXNzYWdlIHRvIG1vZHVsZSAqLworYmNtb3NfZXJybm8gYmNtb3NfbXNnX3NlbmRfdG9fbW9kdWxlKGJjbW9zX21vZHVsZV9pZCBtb2R1bGVfaWQsIGJjbW9zX21zZyAqbXNnLCBiY21vc19tc2dfc2VuZF9mbGFncyBmbGFncykKK3sKKyAgICBiY21vc19zZW0gKnNlbV90b19wb3N0OworICAgIGJjbW9zX2Vycm5vIGVyciA9IF9iY21vc19tc2dfc2VuZF90b19tb2R1bGUobW9kdWxlX2lkLCBtc2csIGZsYWdzLCAmc2VtX3RvX3Bvc3QpOworICAgIGlmIChzZW1fdG9fcG9zdCkKKyAgICAgICAgYmNtb3Nfc2VtX3Bvc3Qoc2VtX3RvX3Bvc3QpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qIEdldCBtZXNzYWdlIGZyb20gdGhlIGhlYWQgb2YgbWVzc2FnZSBxdWV1ZSAqLworYmNtb3NfZXJybm8gYmNtb3NfbXNnX3JlY3YoYmNtb3NfbXNnX3F1ZXVlICpxdWV1ZSwgdWludDMyX3QgdGltZW91dCwgYmNtb3NfbXNnICoqbXNnKQoreworICAgIGxvbmcgbG9ja19mbGFnczsKKworICAgIGlmICghcXVldWUgfHwgIW1zZykKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfUEFSTSwgInF1ZXVlICVwLCBtc2cgJXBcbiIsIHF1ZXVlLCBtc2cpOworCisjaWZkZWYgQkNNT1NfTVNHX1FVRVVFX1JFTU9URV9TVVBQT1JUCisgICAgaWYgKHF1ZXVlLT5xLnBhcm0uZXBfdHlwZSAhPSBCQ01PU19NU0dfUVVFVUVfRVBfTE9DQUwpCisgICAgeworICAgICAgICByZXR1cm4gX2JjbW9zX21zZ19yZWN2X2Zyb21fcmVtb3RlX2VwKHF1ZXVlLCB0aW1lb3V0LCBtc2cpOworICAgIH0KKyNlbmRpZgorCisgICAgbG9ja19mbGFncyA9IGJjbW9zX2Zhc3Rsb2NrX2xvY2soJnF1ZXVlLT5xLmxvY2spOworICAgICptc2cgPSBfYmNtb3NfbXNnX2dldCgmcXVldWUtPnEpOworICAgIGlmICgqbXNnKQorICAgIHsKKyAgICAgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZxdWV1ZS0+cS5sb2NrLCBsb2NrX2ZsYWdzKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorICAgIGlmICghdGltZW91dCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmcXVldWUtPnEubG9jaywgbG9ja19mbGFncyk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PRU5UOworICAgIH0KKworICAgIC8qIFJlY2VpdmUgd2l0aCB3YWl0ICovCisgICAgcXVldWUtPmlzX3dhaXRpbmcgPSBCQ01PU19UUlVFOworICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmcXVldWUtPnEubG9jaywgbG9ja19mbGFncyk7CisKKyAgICAvKiB3YWl0IGZvciBpdCAqLworICAgIGJjbW9zX3NlbV93YWl0KCZxdWV1ZS0+bSwgdGltZW91dCk7CisgICAgbG9ja19mbGFncyA9IGJjbW9zX2Zhc3Rsb2NrX2xvY2soJnF1ZXVlLT5xLmxvY2spOworICAgICptc2cgPSBfYmNtb3NfbXNnX2dldCgmcXVldWUtPnEpOworICAgIHF1ZXVlLT5pc193YWl0aW5nID0gQkNNT1NfRkFMU0U7CisgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZxdWV1ZS0+cS5sb2NrLCBsb2NrX2ZsYWdzKTsKKyAgICBpZiAoISptc2cpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1RJTUVPVVQ7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworCisvKgorICogUXVldWUgZ3JvdXAgc3VwcG9ydAorICovCisKKy8qIENyZWF0ZSBtZXNzYWdlIHF1ZXVlIGdyb3VwLiAqLworYmNtb3NfZXJybm8gYmNtb3NfbXNnX3Fncm91cF9jcmVhdGUoYmNtb3NfbXNnX3Fncm91cCAqcWdyb3VwLCBjb25zdCBiY21vc19tc2dfcWdyb3VwX3Bhcm0gKnBhcm0pCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgYmNtb3NfcWdyb3VwX3BydHkgcHJ0eTsKKworICAgIGlmICghcWdyb3VwIHx8ICFwYXJtIHx8ICFwYXJtLT5ucXVldWVzIHx8IHBhcm0tPm5xdWV1ZXM+MzIpCisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX1BBUk0sICJxdWV1ZSAlcCwgcGFybSAlcCBucXVldWVzICV1XG4iLCBxZ3JvdXAsIHBhcm0sIHBhcm0gPyBwYXJtLT5ucXVldWVzOiAwKTsKKyAgICBtZW1zZXQocWdyb3VwLCAwLCBzaXplb2YoKnFncm91cCkpOworICAgIHJjID0gYmNtb3Nfc2VtX2NyZWF0ZSgmcWdyb3VwLT5tLCAwLCBwYXJtLT5mbGFncywgTlVMTCk7CisgICAgaWYgKHJjKQorICAgICAgICByZXR1cm4gcmM7CisgICAgcWdyb3VwLT5wYXJtID0gKnBhcm07CisgICAgYmNtb3NfZmFzdGxvY2tfaW5pdCgmcWdyb3VwLT5sb2NrLCBwYXJtLT5mbGFncyk7CisgICAgaWYgKCFxZ3JvdXAtPnBhcm0uc2l6ZSkKKyAgICAgICAgcWdyb3VwLT5wYXJtLnNpemUgPSBCQ01PU19NU0dfUVVFVUVfU0laRV9VTkxJTUlURUQ7CisgICAgaWYgKCFxZ3JvdXAtPnBhcm0uaGlnaF93bSkKKyAgICAgICAgcWdyb3VwLT5wYXJtLmhpZ2hfd20gPSBCQ01PU19NU0dfUVVFVUVfU0laRV9VTkxJTUlURUQ7CisgICAgaWYgKCFxZ3JvdXAtPnBhcm0ubG93X3dtKQorICAgICAgICBxZ3JvdXAtPnBhcm0ubG93X3dtID0gcWdyb3VwLT5wYXJtLmhpZ2hfd207CisgICAgaWYgKCFxZ3JvdXAtPnBhcm0ubm90aWZ5KQorICAgICAgICBxZ3JvdXAtPnBhcm0ubm90aWZ5ID0gX2JjbW9zX3Fncm91cF9ub3RpZnk7CisgICAgcWdyb3VwLT5tc2dsID0gYmNtb3NfY2FsbG9jKHNpemVvZihiY21vc19tc2dfbGlzdCkgKiAodWludDMyX3QpcGFybS0+bnF1ZXVlcyk7CisgICAgaWYgKCFxZ3JvdXAtPm1zZ2wpCisgICAgeworICAgICAgICBiY21vc19tc2dfcWdyb3VwX2Rlc3Ryb3kocWdyb3VwKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorICAgIGZvciAocHJ0eSA9IDA7IHBydHkgPCBxZ3JvdXAtPnBhcm0ubnF1ZXVlczsgcHJ0eSsrKQorICAgIHsKKyAgICAgICAgU1RBSUxRX0lOSVQoJnFncm91cC0+bXNnbFtwcnR5XSk7CisgICAgfQorICAgIC8qIENvcHkgbmFtZSB0byBtYWtlIHN1cmUgdGhhdCBpdCBpcyBub3QgcmVsZWFzZWQgLSBpbiBjYXNlIGl0IHdhcyBvbiB0aGUgc3RhY2sgKi8KKyAgICBpZiAocWdyb3VwLT5wYXJtLm5hbWUpCisgICAgeworICAgICAgICBzdHJuY3B5KHFncm91cC0+bmFtZSwgcWdyb3VwLT5wYXJtLm5hbWUsIHNpemVvZihxZ3JvdXAtPnBhcm0ubmFtZSkgLSAxKTsKKyAgICAgICAgcWdyb3VwLT5wYXJtLm5hbWUgPSBxZ3JvdXAtPm5hbWU7CisgICAgfQorICAgIHFncm91cC0+bWFnaWMgPSBCQ01PU19NU0dfUUdST1VQX1ZBTElEOworICAgIGJjbW9zX211dGV4X2xvY2soJmJjbW9zX3Jlc19sb2NrKTsKKyAgICBTVEFJTFFfSU5TRVJUX1RBSUwoJm1zZ19xZ3JvdXBfbGlzdCwgcWdyb3VwLCBsaXN0KTsKKyAgICBiY21vc19tdXRleF91bmxvY2soJmJjbW9zX3Jlc19sb2NrKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiogRGVzdHJveSBxdWV1ZSBncm91cAorICoKKyAqIFxwYXJhbVtpbl0gICBxZ3JvdXAgICAgICAgUXVldWUgZ3JvdXAgaGFuZGxlCisgKiBccmV0dXJucyAwPU9LIG9yIGVycm9yIGNvZGUgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfbXNnX3Fncm91cF9kZXN0cm95KGJjbW9zX21zZ19xZ3JvdXAgKnFncm91cCkKK3sKKyAgICBiY21vc19xZ3JvdXBfcHJ0eSBwcnR5OworCisgICAgaWYgKCFxZ3JvdXAgfHwgcWdyb3VwLT5tYWdpYyAhPSBCQ01PU19NU0dfUUdST1VQX1ZBTElEKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfUEFSTSwgInF1ZXVlIGdyb3VwIGhhbmRsZSBpcyBpbnZhbGlkXG4iKTsKKyAgICB9CisKKyAgICBxZ3JvdXAtPm1hZ2ljID0gQkNNT1NfTVNHX1FHUk9VUF9ERUxFVEVEOworCisgICAgYmNtb3NfbXV0ZXhfbG9jaygmYmNtb3NfcmVzX2xvY2spOworICAgIFNUQUlMUV9SRU1PVkUoJm1zZ19xZ3JvdXBfbGlzdCwgcWdyb3VwLCBiY21vc19tc2dfcWdyb3VwLCBsaXN0KTsKKyAgICBiY21vc19tdXRleF91bmxvY2soJmJjbW9zX3Jlc19sb2NrKTsKKworICAgIGJjbW9zX3NlbV9kZXN0cm95KCZxZ3JvdXAtPm0pOworCisgICAgLyogUmVsZWFzZSBhbGwgcGVuZGluZyBtZXNzYWdlcyAqLworICAgIGlmIChxZ3JvdXAtPm1zZ2wpCisgICAgeworICAgICAgICBmb3IgKHBydHkgPSAwOyBwcnR5IDwgcWdyb3VwLT5wYXJtLm5xdWV1ZXM7IHBydHkrKykKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfbXNnX2xpc3RfZGVzdHJveSgmcWdyb3VwLT5tc2dsW3BydHldKTsKKyAgICAgICAgfQorICAgICAgICBiY21vc19mcmVlKHFncm91cC0+bXNnbCk7CisgICAgfQorICAgIHJldHVybiBCQ01fRVJSX09LOworCit9CisKKy8qKiBHZXQgcXVldWUgZ3JvdXAgaW5mbyAqLworYmNtb3NfZXJybm8gYmNtb3NfbXNnX3Fncm91cF9xdWVyeShjb25zdCBiY21vc19tc2dfcWdyb3VwICpxZ3JvdXAsIGJjbW9zX21zZ19xZ3JvdXBfaW5mbyAqaW5mbykKK3sKKyAgICBpZiAoIXFncm91cCB8fCAhaW5mbykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKworICAgIGluZm8tPnBhcm0gPSBxZ3JvdXAtPnBhcm07CisgICAgaW5mby0+c3RhdCA9IHFncm91cC0+c3RhdDsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiogTWVzc2FnZSBxdWV1ZSBncm91cCBpdGVyYXRvcgorICogXHBhcmFtW2luXSBwcmV2ICAgICAgUHJldmlvdXMgcXVldWUgZ3JvdXAuICpwcmV2PT1OVUxMIC0gZ2V0IGZpcnN0CisgKiBccmV0dXJuOiBCQ01fRVJSX09LLCBCQ01fRVJSX05PRU5ULCBCQ01fRVJSX05PX01PUkUKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfbXNnX3Fncm91cF9nZXRfbmV4dChjb25zdCBiY21vc19tc2dfcWdyb3VwICoqcHJldikKK3sKKyAgICBjb25zdCBiY21vc19tc2dfcWdyb3VwICpxZ3JwOworCisgICAgaWYgKHByZXYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorICAgIHFncnAgPSAqcHJldjsKKyAgICBpZiAocWdycCAmJiBxZ3JwLT5tYWdpYyAhPSBCQ01PU19NU0dfUUdST1VQX1ZBTElEKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgaWYgKHFncnApCisgICAgeworICAgICAgICBxZ3JwID0gU1RBSUxRX05FWFQocWdycCwgbGlzdCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHFncnAgPSBTVEFJTFFfRklSU1QoJm1zZ19xZ3JvdXBfbGlzdCk7CisgICAgfQorICAgICpwcmV2ID0gcWdycDsKKyAgICBpZiAoIXFncnApCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT19NT1JFOworICAgIH0KKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogZ2V0IG1lc3NhZ2UgZnJvbSBub24tZW1wdHkgcXVldWUgZ3JvdXAgcXVldWUgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfbXNnICpfYmNtb3NfcWdyb3VwX21zZ19nZXQoYmNtb3NfbXNnX3Fncm91cCAqcWdyb3VwLCBiY21vc19xZ3JvdXBfcHJ0eSBwcnR5KQoreworICAgIGJjbW9zX21zZyAqbXNnOworICAgIG1zZyA9IFNUQUlMUV9GSVJTVCgmcWdyb3VwLT5tc2dsW3BydHldKTsKKyAgICBCVUdfT04oIW1zZyk7CisgICAgU1RBSUxRX1JFTU9WRV9IRUFEKCZxZ3JvdXAtPm1zZ2xbcHJ0eV0sIG5leHQpOworICAgIGlmIChTVEFJTFFfRU1QVFkoJnFncm91cC0+bXNnbFtwcnR5XSkpCisgICAgeworICAgICAgICBxZ3JvdXAtPmFjdGl2ZV9tYXNrICY9IH4oMSA8PCBwcnR5KTsKKyAgICB9CisgICAgcmV0dXJuIG1zZzsKK30KKworLyogU2VuZCBtZXNzYWdlIHRvIHF1ZXVlIGdyb3VwICovCitiY21vc19lcnJubyBiY21vc19tc2dfc2VuZF90b19xZ3JvdXAoYmNtb3NfbXNnX3Fncm91cCAqcWdyb3VwLCBiY21vc19tc2cgKm1zZywgYmNtb3NfcWdyb3VwX3BydHkgcHJ0eSwKKyAgICBiY21vc19tc2dfc2VuZF9mbGFncyBmbGFncykKK3sKKyAgICBsb25nIGxvY2tfZmxhZ3M7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworCisgICAgaWYgKHBydHkgPj0gcWdyb3VwLT5wYXJtLm5xdWV1ZXMpCisgICAgeworICAgICAgICBpZiAoIShmbGFncyAmIEJDTU9TX01TR19TRU5EX05PX0ZSRUVfT05fRVJST1IpKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19tc2dfZnJlZShtc2cpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorICAgIG1zZy0+c2VuZF9mbGFncyA9IGZsYWdzOworCisgICAgbG9ja19mbGFncyA9IGJjbW9zX2Zhc3Rsb2NrX2xvY2soJnFncm91cC0+bG9jayk7CisKKyAgICAvKiBQdXQgaW50byB0aGUgcmVsZXZhbnQgcXVldWUgKi8KKyAgICBTVEFJTFFfSU5TRVJUX1RBSUwoJnFncm91cC0+bXNnbFtwcnR5XSwgbXNnLCBuZXh0KTsKKyAgICBxZ3JvdXAtPmFjdGl2ZV9tYXNrIHw9ICgxIDw8IHBydHkpOworICAgIF9iY21vc19xZ3JvdXBfc3RhdF9pbmMocWdyb3VwKTsKKworICAgIC8qIE92ZXJmbG93IGNoZWNrICovCisgICAgaWYgKChxZ3JvdXAtPnN0YXQubXNnX2luID4gcWdyb3VwLT5wYXJtLnNpemUpKQorICAgIHsKKyAgICAgICAgYmNtb3NfbXNnICptOworICAgICAgICBiY21vc19xZ3JvdXBfcHJ0eSBpOworICAgICAgICAvKiBGaW5kIHRoZSBsb3dlc3QtcHJpb3JpdHkgcXVldWUgd2l0aCBkYXRhIGFuZCBkaXNjYXJkIHRoZSBoZWFkIG1lc3NhZ2UuCisgICAgICAgICAqIFRoZSBsb29wIGFsd2F5cyBmaW5kcyBzb21ldGhpbmcgYmVjYXVzZSB3ZSd2ZSBqdXN0IGFkZGVkIGEgbWVzc2FnZQorICAgICAgICAgKi8KKyAgICAgICAgZm9yIChpID0gcWdyb3VwLT5wYXJtLm5xdWV1ZXMgLSAxOyAocWdyb3VwLT5hY3RpdmVfbWFzayAmICgxIDw8IGkpKSA9PSAwOyBpLS0pCisgICAgICAgICAgICA7CisgICAgICAgIG0gPSBfYmNtb3NfcWdyb3VwX21zZ19nZXQocWdyb3VwLCBpKTsKKyAgICAgICAgLS1xZ3JvdXAtPnN0YXQubXNnX2luOworICAgICAgICArK3Fncm91cC0+c3RhdC5tc2dfZGlzY2FyZGVkOworICAgICAgICBpZiAoIShtLT5zZW5kX2ZsYWdzICYgQkNNT1NfTVNHX1NFTkRfTk9fRlJFRV9PTl9FUlJPUikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX21zZ19mcmVlKG0pOworICAgICAgICB9CisgICAgICAgIHJjID0gQkNNX0VSUl9PVkVSRkxPVzsKKyAgICB9CisKKyAgICAvKiBLaWNrIHdhaXRpbmcgdGFzayAqLworICAgIGlmIChxZ3JvdXAtPmlzX3dhaXRpbmcpCisgICAgeworICAgICAgICBxZ3JvdXAtPmlzX3dhaXRpbmcgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZxZ3JvdXAtPmxvY2ssIGxvY2tfZmxhZ3MpOworICAgICAgICBiY21vc19zZW1fcG9zdCgmcWdyb3VwLT5tKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZxZ3JvdXAtPmxvY2ssIGxvY2tfZmxhZ3MpOworICAgIH0KKworICAgIHJldHVybiByYzsKKworfQorCisvKiBHZXQgaGlnaGVzdCBwcmlvcml0eSBtZXNzYWdlIGZyb20gcXVldWUgZ3JvdXAgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX21zZ19yZWN2X2Zyb21fcWdyb3VwKGJjbW9zX21zZ19xZ3JvdXAgKnFncm91cCwgdWludDMyX3QgdGltZW91dCwgYmNtb3NfbXNnICoqbXNnKQoreworICAgIGxvbmcgbG9ja19mbGFnczsKKyAgICBiY21vc19xZ3JvdXBfcHJ0eSBwcnR5OworCisgICAgaWYgKCFxZ3JvdXAgfHwgIW1zZykKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfUEFSTSwgInFncm91cCAlcCwgbXNnICVwXG4iLCBxZ3JvdXAsIG1zZyk7CisKKyAgICBsb2NrX2ZsYWdzID0gYmNtb3NfZmFzdGxvY2tfbG9jaygmcWdyb3VwLT5sb2NrKTsKKyAgICBpZiAoIXFncm91cC0+YWN0aXZlX21hc2spCisgICAgeworICAgICAgICBpZiAoIXRpbWVvdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmcWdyb3VwLT5sb2NrLCBsb2NrX2ZsYWdzKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PRU5UOworICAgICAgICB9CisKKyAgICAgICAgLyogUmVjZWl2ZSB3aXRoIHdhaXQgKi8KKyAgICAgICAgcWdyb3VwLT5pc193YWl0aW5nID0gQkNNT1NfVFJVRTsKKyAgICAgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZxZ3JvdXAtPmxvY2ssIGxvY2tfZmxhZ3MpOworCisgICAgICAgIC8qIHdhaXQgZm9yIGl0ICovCisgICAgICAgIGJjbW9zX3NlbV93YWl0KCZxZ3JvdXAtPm0sIHRpbWVvdXQpOworCisgICAgICAgIC8qIERvbmUgd2FpdGluZy4gRWl0aGVyIGdvdCBhIG1lc3NhZ2Ugb3IgYSB0aW1lb3V0ICovCisgICAgICAgIGxvY2tfZmxhZ3MgPSBiY21vc19mYXN0bG9ja19sb2NrKCZxZ3JvdXAtPmxvY2spOworICAgICAgICBxZ3JvdXAtPmlzX3dhaXRpbmcgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgaWYgKCFxZ3JvdXAtPmFjdGl2ZV9tYXNrKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19mYXN0bG9ja191bmxvY2soJnFncm91cC0+bG9jaywgbG9ja19mbGFncyk7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9USU1FT1VUOworICAgICAgICB9CisgICAgfQorCisgICAgcHJ0eSA9IChiY21vc19xZ3JvdXBfcHJ0eSkoZmZzKHFncm91cC0+YWN0aXZlX21hc2spIC0gMSk7CisgICAgQlVHX09OKHBydHkgPj0gcWdyb3VwLT5wYXJtLm5xdWV1ZXMpOworICAgICptc2cgPSBfYmNtb3NfcWdyb3VwX21zZ19nZXQocWdyb3VwLCBwcnR5KTsKKyAgICBfYmNtb3NfcWdyb3VwX3N0YXRfZGVjKHFncm91cCk7CisgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZxZ3JvdXAtPmxvY2ssIGxvY2tfZmxhZ3MpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKworLyoKKyAqIE1lc3NhZ2UgcmVnaXN0cmF0aW9uIGFuZCBkaXNwYXRjaAorICovCisKKy8qIEhhc2ggZW50cnkgKi8KK3R5cGVkZWYgc3RydWN0IG1zZ19oYXNoX2VudHJ5IG1zZ19oYXNoX2VudHJ5OworCitzdHJ1Y3QgbXNnX2hhc2hfZW50cnkKK3sKKyAgICAvKiBLZXkgKi8KKyAgICB1aW50MzJfdCBrZXk7ICAgICAgIC8qIG1zZ190eXBlICsgaW5zdGFuY2UgKi8KKworICAgIC8qIFZhbHVlICovCisgICAgYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZDsKKyAgICBGX2JjbW9zX21zZ19oYW5kbGVyIGhhbmRsZXI7CisKKyAgICAvKiBMaXN0IG9mIGVudHJpZXMgd2l0aCB0aGUgc2FtZSBrZXkgKi8KKyAgICBTTElTVF9FTlRSWShtc2dfaGFzaF9lbnRyeSkgbGlzdDsKK307CisKKy8qIEhhc2ggdGFibGUgKi8KK3N0YXRpYyBTTElTVF9IRUFEKG1zZ19oYXNoLCBtc2dfaGFzaF9lbnRyeSkgbXNnX2hhc2hfdGFibGVbQkNNT1NfTVNHX0hBU0hfU0laRV07CisKKy8qIE1ha2UgaGFzaCBrZXkgZnJvbSBtc2dfdHlwZSBhbmQgaW5zdGFuY2UgKi8KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgX2JjbW9zX21zZ19oYXNoX2tleShiY21vc19tc2dfaWQgbXNnX3R5cGUsIGJjbW9zX21zZ19pbnN0YW5jZSBpbnN0YW5jZSkKK3sKKyAgICByZXR1cm4gKCh1aW50MzJfdClpbnN0YW5jZSA8PCAxNikgfCAodWludDMyX3QpbXNnX3R5cGU7Cit9CisKKy8qIEhhc2ggZnVuY3Rpb24gKi8KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgX2JjbW9zX21zZ19oYXNoX2Z1bmModWludDMyX3Qga2V5KQoreworICAgIGtleSBePSAoa2V5ID4+IDkpOworICAgIGtleSBePSAoa2V5IDw8IDMpOworICAgIGtleSBePSAoa2V5ID4+IDE1KTsKKyAgICByZXR1cm4ga2V5ICUgQkNNT1NfTVNHX0hBU0hfU0laRTsKK30KKworLyogRmluZCBlbnRyeSBpbiBoYXNoICovCitzdGF0aWMgaW5saW5lIG1zZ19oYXNoX2VudHJ5ICpfYmNtb3NfbXNnX2hhc2hfZmluZChiY21vc19tc2dfaWQgbXNnX3R5cGUsIGJjbW9zX21zZ19pbnN0YW5jZSBpbnN0YW5jZSkKK3sKKyAgICB1aW50MzJfdCBrZXkgPSBfYmNtb3NfbXNnX2hhc2hfa2V5KG1zZ190eXBlLCBpbnN0YW5jZSk7CisgICAgdWludDMyX3QgaGFzaCA9IF9iY21vc19tc2dfaGFzaF9mdW5jKGtleSk7CisgICAgbXNnX2hhc2hfZW50cnkgKmVudHJ5OworICAgIFNMSVNUX0ZPUkVBQ0goZW50cnksICZtc2dfaGFzaF90YWJsZVtoYXNoXSwgbGlzdCkKKyAgICB7CisgICAgICAgIGlmIChlbnRyeS0+a2V5ID09IGtleSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gZW50cnk7Cit9CisKKy8qIFJlZ2lzdGVyIG1lc3NhZ2VfdHlwZStpbnN0YW5jZSAtLT4gbW9kdWxlK2hhbmRsZXIgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX21zZ19yZWdpc3RlcihiY21vc19tc2dfaWQgbXNnX3R5cGUsIGJjbW9zX21zZ19pbnN0YW5jZSBpbnN0YW5jZSwKKyAgICBiY21vc19tb2R1bGVfaWQgbW9kdWxlX2lkLCBGX2JjbW9zX21zZ19oYW5kbGVyIGhhbmRsZXIpCit7CisgICAgdWludDMyX3Qga2V5ID0gX2JjbW9zX21zZ19oYXNoX2tleShtc2dfdHlwZSwgaW5zdGFuY2UpOworICAgIHVpbnQzMl90IGhhc2ggPSBfYmNtb3NfbXNnX2hhc2hfZnVuYyhrZXkpOworICAgIG1zZ19oYXNoX2VudHJ5ICplbnRyeTsKKyAgICBsb25nIGxvY2tfZmxhZ3M7CisKKyAgICBpZiAoIWhhbmRsZXIpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisKKyAgICBlbnRyeSA9IGJjbW9zX2NhbGxvYyhzaXplb2YoKmVudHJ5KSk7CisgICAgaWYgKCFlbnRyeSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisKKyAgICBlbnRyeS0+a2V5ID0ga2V5OworICAgIGVudHJ5LT5tb2R1bGVfaWQgPSBtb2R1bGVfaWQ7CisgICAgZW50cnktPmhhbmRsZXIgPSBoYW5kbGVyOworICAgIGxvY2tfZmxhZ3MgPSBiY21vc19mYXN0bG9ja19sb2NrKCZiY21vc19tc2dfcmVnaXN0ZXJfbG9jayk7CisgICAgaWYgKF9iY21vc19tc2dfaGFzaF9maW5kKG1zZ190eXBlLCBpbnN0YW5jZSkgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmYmNtb3NfbXNnX3JlZ2lzdGVyX2xvY2ssIGxvY2tfZmxhZ3MpOworICAgICAgICBiY21vc19mcmVlKGVudHJ5KTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfQUxSRUFEWTsKKyAgICB9CisgICAgU0xJU1RfSU5TRVJUX0hFQUQoJm1zZ19oYXNoX3RhYmxlW2hhc2hdLCBlbnRyeSwgbGlzdCk7CisgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZiY21vc19tc2dfcmVnaXN0ZXJfbG9jaywgbG9ja19mbGFncyk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtb3NfbXNnX3VucmVnaXN0ZXIoYmNtb3NfbXNnX2lkIG1zZ190eXBlLCBiY21vc19tc2dfaW5zdGFuY2UgaW5zdGFuY2UsIGJjbW9zX21vZHVsZV9pZCBtb2R1bGVfaWQpCit7CisgICAgdWludDMyX3Qga2V5ID0gX2JjbW9zX21zZ19oYXNoX2tleShtc2dfdHlwZSwgaW5zdGFuY2UpOworICAgIHVpbnQzMl90IGhhc2ggPSBfYmNtb3NfbXNnX2hhc2hfZnVuYyhrZXkpOworICAgIG1zZ19oYXNoX2VudHJ5ICplbnRyeTsKKyAgICBsb25nIGxvY2tfZmxhZ3M7CisKKyAgICBsb2NrX2ZsYWdzID0gYmNtb3NfZmFzdGxvY2tfbG9jaygmYmNtb3NfbXNnX3JlZ2lzdGVyX2xvY2spOworICAgIGVudHJ5ID0gX2JjbW9zX21zZ19oYXNoX2ZpbmQobXNnX3R5cGUsIGluc3RhbmNlKTsKKyAgICBpZiAoIWVudHJ5KQorICAgIHsKKyAgICAgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZiY21vc19tc2dfcmVnaXN0ZXJfbG9jaywgbG9ja19mbGFncyk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PRU5UOworICAgIH0KKworICAgIGlmIChlbnRyeS0+bW9kdWxlX2lkICE9IG1vZHVsZV9pZCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmYmNtb3NfbXNnX3JlZ2lzdGVyX2xvY2ssIGxvY2tfZmxhZ3MpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlZBTElEX09QOworICAgIH0KKworICAgIFNMSVNUX1JFTU9WRSgmbXNnX2hhc2hfdGFibGVbaGFzaF0sIGVudHJ5LCBtc2dfaGFzaF9lbnRyeSwgbGlzdCk7CisgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZiY21vc19tc2dfcmVnaXN0ZXJfbG9jaywgbG9ja19mbGFncyk7CisgICAgYmNtb3NfZnJlZShlbnRyeSk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKwordm9pZCBiY21vc19tc2dfc2h1dGRvd25fbW9kZV9zZXQoYmNtb3NfYm9vbCBzaHV0ZG93bl9tb2RlKQoreworICAgIGJjbW9zX21zZ19zaHV0ZG93bl9tb2RlID0gc2h1dGRvd25fbW9kZTsKK30KKworYmNtb3NfYm9vbCBiY21vc19tc2dfc2h1dGRvd25fbW9kZV9nZXQodm9pZCkKK3sKKyAgICByZXR1cm4gYmNtb3NfbXNnX3NodXRkb3duX21vZGU7Cit9CisKKy8qIERpc3BhdGNoIG1lc3NhZ2UgdG8gcmVnaXN0ZXJlZCBtb2R1bGUgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX21zZ19kaXNwYXRjaChiY21vc19tc2cgKm1zZywgYmNtb3NfbXNnX3NlbmRfZmxhZ3MgZmxhZ3MpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgaWYgKHVubGlrZWx5KGJjbW9zX21zZ19zaHV0ZG93bl9tb2RlKSkKKyAgICB7CisgICAgICAgIC8qIEluIHNodXRkb3duIG1vZGUsIHdlIG5lZWQgdG8gYWNxdWlyZSB0aGUgc2FtZSBsb2NrIHVzZWQgdG8gcHJvdGVjdCBiY21vc19tc2dfcmVnaXN0ZXIoKSAvCisgICAgICAgICAqIGJjbW9zX21zZ191bnJlZ2lzdGVyKCksIHNpbmNlIHdlIG11c3Qgc3VwcG9ydCBjYWxsaW5nIHRoZXNlIGZ1bmN0aW9ucyBjb25jdXJyZW50bHkuICovCisgICAgICAgIG1zZ19oYXNoX2VudHJ5ICplbnRyeTsKKyAgICAgICAgYmNtb3Nfc2VtICpzZW1fdG9fcG9zdCA9IE5VTEw7CisgICAgICAgIGxvbmcgbG9ja19mbGFncyA9IGJjbW9zX2Zhc3Rsb2NrX2xvY2soJmJjbW9zX21zZ19yZWdpc3Rlcl9sb2NrKTsKKyAgICAgICAgZW50cnkgPSBfYmNtb3NfbXNnX2hhc2hfZmluZChtc2ctPnR5cGUsIG1zZy0+aW5zdGFuY2UpOworCisgICAgICAgIGlmIChlbnRyeSkKKyAgICAgICAgeworICAgICAgICAgICAgbXNnLT5oYW5kbGVyID0gZW50cnktPmhhbmRsZXI7CisgICAgICAgICAgICBlcnIgPSBfYmNtb3NfbXNnX3NlbmRfdG9fbW9kdWxlKGVudHJ5LT5tb2R1bGVfaWQsIG1zZywgZmxhZ3MsICZzZW1fdG9fcG9zdCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBOb3QgZm91bmQuIFJlbGVhc2UgYXV0b21hdGljYWxseSBpZiByZXF1ZXN0ZWQuICovCisgICAgICAgICAgICBpZiAoIShmbGFncyAmIEJDTU9TX01TR19TRU5EX05PX0ZSRUVfT05fRVJST1IpKQorICAgICAgICAgICAgICAgIGJjbW9zX21zZ19mcmVlKG1zZyk7CisgICAgICAgICAgICBlcnIgPSBCQ01fRVJSX09LOworICAgICAgICB9CisKKyAgICAgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZiY21vc19tc2dfcmVnaXN0ZXJfbG9jaywgbG9ja19mbGFncyk7CisgICAgICAgIGlmIChzZW1fdG9fcG9zdCkKKyAgICAgICAgICAgIGJjbW9zX3NlbV9wb3N0KHNlbV90b19wb3N0KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbXNnX2hhc2hfZW50cnkgKmVudHJ5ID0gX2JjbW9zX21zZ19oYXNoX2ZpbmQobXNnLT50eXBlLCBtc2ctPmluc3RhbmNlKTsKKworICAgICAgICBpZiAoZW50cnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1zZy0+aGFuZGxlciA9IGVudHJ5LT5oYW5kbGVyOworICAgICAgICAgICAgZXJyID0gYmNtb3NfbXNnX3NlbmRfdG9fbW9kdWxlKGVudHJ5LT5tb2R1bGVfaWQsIG1zZywgZmxhZ3MpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogTm90IGZvdW5kLiBSZWxlYXNlIGF1dG9tYXRpY2FsbHkgaWYgcmVxdWVzdGVkLiAqLworICAgICAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJDYW4ndCBkaXNwYXRjaCB1bnJlZ2lzdGVyZWQgbXNnICVkOiVkXG4iLCBtc2ctPnR5cGUsIG1zZy0+aW5zdGFuY2UpOworICAgICAgICAgICAgaWYgKCEoZmxhZ3MgJiBCQ01PU19NU0dfU0VORF9OT19GUkVFX09OX0VSUk9SKSkKKyAgICAgICAgICAgICAgICBiY21vc19tc2dfZnJlZShtc2cpOworICAgICAgICAgICAgZXJyID0gQkNNX0VSUl9OT0VOVDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKKy8qCisgKiBUYXNrIG1hbmFnZW1lbnQKKyAqLworCisvKgorICogRGVmYXVsdCB0YXNrIGhhbmRsZXIKKyAqLworLypsaW50IC1lezYzMiw2MzMsNjM0fQorICogVGhlcmUgYXJlIGEgZmV3IHdhcm5pbmdzIGFib3V0CisgKiBpbXBsaWNpdCBiY21vc19lcnJubyBjb252ZXJzaW9uIHRvIGludC4gSXQgaXMgdG8gYm90aGVyc29tZSBub3cKKyAqIHRvIGNoYW5nZSB0YXNrIGhhbmRsZXIgcHJvdG90eXBlIGV2ZXJ5d2hlcmUgYW5kIHRoZSB3YXJuaW5nIGlzIGhhcm1sZXNzCisgKi8KK2ludCBiY21vc19kZnRfdGFza19oYW5kbGVyKGxvbmcgZGF0YSkKK3sKKyAgICBiY21vc190YXNrICp0YXNrID0gKGJjbW9zX3Rhc2sgKilkYXRhOworICAgIGxvbmcgZmxhZ3MgPSAwLCBxX2ZsYWdzID0gMDsKKyAgICB1aW50MzJfdCBhY3RpdmVfbW9kdWxlczsKKyAgICBpbnQgbGFzdF9tb2R1bGUgPSAwOyAvKiAxLWJhc2VkIGxhc3QgaGFuZGxlZCBtb2R1bGUgaW5kZXggKi8KKyAgICBiY21vc19tb2R1bGUgKm1vZHVsZTsKKyAgICBiY21vc19tc2cgKm1zZzsKKyAgICBpbnQgcmM7CisKKworICAgIC8qIFNldCAvIHZhbGlkYXRlIHRhc2sgdGltZW91dCAqLworICAgIHJjID0gYmNtb3NfdGFza190aW1lb3V0X3NldCh0YXNrLCB0YXNrLT5wYXJtLm1zZ193YWl0X3RpbWVvdXQsIHRhc2stPnBhcm0udGltZW91dF9oYW5kbGVyKTsKKyAgICBpZiAocmMpCisgICAgeworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgLyogQ2FsbCBpbml0IGNhbGxiYWNrIGlmIGFueSAqLworICAgIGlmICh0YXNrLT5wYXJtLmluaXRfaGFuZGxlcikKKyAgICB7CisgICAgICAgIHJjID0gdGFzay0+cGFybS5pbml0X2hhbmRsZXIodGFzay0+cGFybS5kYXRhKTsKKyAgICAgICAgaWYgKHJjKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PU19UUkFDRV9FUlIoIlRhc2sgJXM6IGluaXRfaGFuZGxlciByZXR1cm5lZCBlcnJvciAlcyAoJWQpXG4iLAorICAgICAgICAgICAgICAgIHRhc2stPnBhcm0ubmFtZSwgYmNtb3Nfc3RyZXJyb3IoKGJjbW9zX2Vycm5vKXJjKSwgcmMpOworICAgICAgICAgICAgYmNtb3NfdGFza19kZXN0cm95KHRhc2spOworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisgICAgfQorCisgICAgLyogV2FpdCBmb3IgbW9kdWxlIGFjdGl2aXR5ICovCisgICAgd2hpbGUgKCF0YXNrLT5kZXN0cm95X3JlcXVlc3QpCisgICAgeworICAgICAgICB0YXNrLT5jdXJyZW50X21vZHVsZSA9IEJDTU9TX01PRFVMRV9JRF9OT05FOworCisgICAgICAgIC8qIFdhaXQgZm9yIG1vZHVsZSBhY3Rpdml0eSAqLworICAgICAgICByYyA9IGJjbW9zX3NlbV93YWl0KCZ0YXNrLT5hY3RpdmVfc2VtLCB0YXNrLT5wYXJtLm1zZ193YWl0X3RpbWVvdXQpOworICAgICAgICBpZiAocmMgPT0gQkNNX0VSUl9USU1FT1VUKQorICAgICAgICB7CisgICAgICAgICAgICBGX2JjbW9zX3Rhc2tfaGFuZGxlciB0aW1lb3V0X2hhbmRsZXIgPSB0YXNrLT5wYXJtLnRpbWVvdXRfaGFuZGxlcjsKKworICAgICAgICAgICAgLyogSGFuZGxlIHBvc3NpYmxlIHJhY2UgY29uZGl0aW9uICovCisgICAgICAgICAgICBpZiAoIXRpbWVvdXRfaGFuZGxlcikKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIHJjID0gdGltZW91dF9oYW5kbGVyKGRhdGEpOworICAgICAgICAgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJUYXNrICVzOiB0ZXJtaW5hdGVkIGJ5IHRpbWVvdXRfaGFuZGxlci4gZXJyb3IgJXMgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgdGFzay0+cGFybS5uYW1lLCBiY21vc19zdHJlcnJvcihyYyksIHJjKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIEtlZXAgd2FpdGluZyAqLworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvKiBSUiBhY3RpdmUgbW9kdWxlcyAqLworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBmbGFncyA9IGJjbW9zX2Zhc3Rsb2NrX2xvY2soJnRhc2stPmFjdGl2ZV9sb2NrKTsKKyAgICAgICAgICAgIGFjdGl2ZV9tb2R1bGVzID0gKHRhc2stPmFjdGl2ZV9tb2R1bGVzID4+IGxhc3RfbW9kdWxlKTsKKyAgICAgICAgICAgIGlmICghYWN0aXZlX21vZHVsZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGFzdF9tb2R1bGUgPSAwOworICAgICAgICAgICAgICAgIGFjdGl2ZV9tb2R1bGVzID0gdGFzay0+YWN0aXZlX21vZHVsZXM7CisgICAgICAgICAgICAgICAgaWYgKCFhY3RpdmVfbW9kdWxlcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIE5vIG1vZHVsZXMgd2l0aCB3b3JrIHRvIGRvICovCisgICAgICAgICAgICAgICAgICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmdGFzay0+YWN0aXZlX2xvY2ssIGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbGFzdF9tb2R1bGUgKz0gZmZzKGFjdGl2ZV9tb2R1bGVzKTsKKyAgICAgICAgICAgIEJVR19PTihsYXN0X21vZHVsZSA+IEJDTU9TX01BWF9NT0RVTEVTX1BFUl9UQVNLKTsKKyAgICAgICAgICAgIG1vZHVsZSA9IHRhc2stPm1vZHVsZXNbbGFzdF9tb2R1bGUgLSAxXTsKKyAgICAgICAgICAgIEJVR19PTighbW9kdWxlKTsKKworICAgICAgICAgICAgcV9mbGFncyA9IGJjbW9zX2Zhc3Rsb2NrX2xvY2soJm1vZHVsZS0+bXNncS5sb2NrKTsKKyAgICAgICAgICAgIC8qIEdldCBtZXNzYWdlIGZyb20gdGhlIG1vZHVsZSdzIG1lc3NhZ2UgcXVldWUgKi8KKyAgICAgICAgICAgIG1zZyA9IF9iY21vc19tc2dfZ2V0KCZtb2R1bGUtPm1zZ3EpOworICAgICAgICAgICAgaWYgKCFtc2cpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZtb2R1bGUtPm1zZ3EubG9jaywgcV9mbGFncyk7CisgICAgICAgICAgICAgICAgdGFzay0+YWN0aXZlX21vZHVsZXMgJj0gfigxIDw8IChsYXN0X21vZHVsZSAtIDEpKTsKKyAgICAgICAgICAgICAgICBiY21vc19mYXN0bG9ja191bmxvY2soJnRhc2stPmFjdGl2ZV9sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmbW9kdWxlLT5tc2dxLmxvY2ssIHFfZmxhZ3MpOworICAgICAgICAgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZ0YXNrLT5hY3RpdmVfbG9jaywgZmxhZ3MpOworCisgICAgICAgICAgICAvKiBIYW5kbGUgdGhlIG1lc3NhZ2UgKi8KKyAgICAgICAgICAgIGlmIChtc2ctPmhhbmRsZXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGFzay0+Y3VycmVudF9tb2R1bGUgPSBtb2R1bGUtPmlkOworICAgICAgICAgICAgICAgIG1zZy0+aGFuZGxlcihtb2R1bGUtPmlkLCBtc2cpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTU9TX1RSQUNFX0VSUigibXNnLT5oYW5kbGVyIGlzIG5vdCBzZXQuIG1zZy0+dHlwZT0lZFxuIiwgbXNnLT50eXBlKTsKKyAgICAgICAgICAgICAgICBiY21vc19tc2dfZnJlZShtc2cpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gd2hpbGUgKHRhc2stPmFjdGl2ZV9tb2R1bGVzKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyogU2V0IHRhc2sgbWVzc2FnZSB0aW1lb3V0LgorICogVGhlIGZ1bmN0aW9uIGlzIG9ubHkgc3VwcG9ydGVkIGluIGludGVncmF0aW9uIG1vZGUKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfdGFza190aW1lb3V0X3NldChiY21vc190YXNrICp0YXNrLCB1aW50MzJfdCB0aW1lb3V0LCBGX2JjbW9zX3Rhc2tfaGFuZGxlciB0aW1lb3V0X2hhbmRsZXIpCit7CisgICAgaWYgKHRhc2stPnBhcm0uaGFuZGxlcikKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiJXM6IFRoZSBmdW5jdGlvbiBpcyBvbmx5IHN1cHBvcnRlZCBpbiBpbnRlZ3JhdGlvbiBtb2RlICh0YXNrIGhhbmRsZXIgPT0gTlVMTClcbiIsIHRhc2stPnBhcm0ubmFtZSk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisgICAgfQorICAgIGlmICgodGltZW91dCAmJiB0aW1lb3V0ICE9IEJDTU9TX1dBSVRfRk9SRVZFUikgJiYgIXRpbWVvdXRfaGFuZGxlcikKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiJXM6IHRpbWVvdXRfaGFuZGxlciBpcyBub3Qgc2V0XG4iLCB0YXNrLT5wYXJtLm5hbWUpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIDAgbWVhbnMgRk9SRVZFUiBoZXJlICovCisgICAgaWYgKCF0aW1lb3V0KQorICAgICAgICB0aW1lb3V0ID0gQkNNT1NfV0FJVF9GT1JFVkVSOworCisgICAgdGFzay0+cGFybS50aW1lb3V0X2hhbmRsZXIgPSB0aW1lb3V0X2hhbmRsZXI7CisgICAgdGFzay0+cGFybS5tc2dfd2FpdF90aW1lb3V0ID0gdGltZW91dDsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKgorICogTW9kdWxlCisgKi8KKworLyogUmVnaXN0ZXIgbW9kdWxlICovCitiY21vc19lcnJubyBiY21vc19tb2R1bGVfY3JlYXRlKGJjbW9zX21vZHVsZV9pZCBtb2R1bGVfaWQsIGJjbW9zX3Rhc2sgKnRhc2ssIGJjbW9zX21vZHVsZV9wYXJtICpwYXJtKQoreworICAgIGJjbW9zX21vZHVsZSAqbW9kdWxlOworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKyAgICBpbnQgaTsKKworICAgIGlmICgodW5zaWduZWQpbW9kdWxlX2lkID49ICh1bnNpZ25lZClCQ01PU19NT0RVTEVfSURfX05VTV9PRiB8fCAhcGFybSkKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfUEFSTSwgIm1vZHVsZSAlZCwgcGFybSAlcFxuIiwgbW9kdWxlX2lkLCBwYXJtKTsKKyAgICBpZiAoIXRhc2spCisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX05PVF9TVVBQT1JURUQsICJObyB0YXNrXG4iKTsKKyAgICBpZiAoYmNtb3NfbW9kdWxlc1ttb2R1bGVfaWRdKQorICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9BTFJFQURZLCAibW9kdWxlX2lkICVkXG4iLCBtb2R1bGVfaWQpOworCisgICAgbW9kdWxlID0gYmNtb3NfY2FsbG9jKHNpemVvZihiY21vc19tb2R1bGUpKTsKKyAgICBpZiAoIW1vZHVsZSkKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfTk9NRU0sICJtb2R1bGVfaWQgJWRcbiIsIG1vZHVsZV9pZCk7CisgICAgbW9kdWxlLT5pZCA9IG1vZHVsZV9pZDsKKyAgICBtb2R1bGUtPm15X3Rhc2sgPSB0YXNrOworICAgIG1vZHVsZS0+cGFybSA9ICpwYXJtOworICAgIG1vZHVsZS0+Y29udGV4dCA9ICh2b2lkICopcGFybS0+ZGF0YTsKKyAgICBiY21vc19tc2dfcXVldWVfbndfaW5pdCgmbW9kdWxlLT5tc2dxLCAmcGFybS0+cXBhcm0pOworICAgIC8qIENvcHkgbmFtZSB0byBtYWtlIHN1cmUgdGhhdCBpdCBpcyBub3QgcmVsZWFzZWQgLSBpbiBjYXNlIGl0IHdhcyBvbiB0aGUgc3RhY2sgKi8KKyAgICBpZiAobW9kdWxlLT5wYXJtLnFwYXJtLm5hbWUpCisgICAgeworICAgICAgICBzdHJuY3B5KG1vZHVsZS0+bmFtZSwgbW9kdWxlLT5wYXJtLnFwYXJtLm5hbWUsIHNpemVvZihtb2R1bGUtPm5hbWUpIC0gMSk7CisgICAgICAgIG1vZHVsZS0+cGFybS5xcGFybS5uYW1lID0gbW9kdWxlLT5uYW1lOworICAgIH0KKworICAgIC8qIEFzc2lnbiBtb2R1bGUgaWQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgQkNNT1NfTUFYX01PRFVMRVNfUEVSX1RBU0s7IGkrKykKKyAgICB7CisgICAgICAgIGlmICghdGFzay0+bW9kdWxlc1tpXSkKKyAgICAgICAgeworICAgICAgICAgICAgdGFzay0+bW9kdWxlc1tpXSA9IG1vZHVsZTsKKyAgICAgICAgICAgIG1vZHVsZS0+aWR4ID0gaTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpID09ICBCQ01PU19NQVhfTU9EVUxFU19QRVJfVEFTSykKKyAgICB7CisgICAgICAgIGJjbW9zX2ZyZWUobW9kdWxlKTsKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfVE9PX01BTlksICJtb2R1bGVfaWQgJWRcbiIsIG1vZHVsZV9pZCk7CisgICAgfQorCisgICAgYmNtb3NfbW9kdWxlc1ttb2R1bGVfaWRdID0gbW9kdWxlOworCisgICAgLyogSW5pdCBtb2R1bGUgKi8KKyAgICBpZiAocGFybS0+aW5pdCkKKyAgICB7CisgICAgICAgIHJjID0gcGFybS0+aW5pdChwYXJtLT5kYXRhKTsKKyAgICAgICAgaWYgKHJjKQorICAgICAgICAgICAgYmNtb3NfbW9kdWxlX2Rlc3Ryb3kobW9kdWxlX2lkKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qIFVuLXJlZ2lzdGVyIG1vZHVsZSAqLworYmNtb3NfZXJybm8gYmNtb3NfbW9kdWxlX2Rlc3Ryb3koYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZCkKK3sKKyAgICBiY21vc19tb2R1bGUgKm1vZHVsZSA9IF9iY21vc19tb2R1bGVfZ2V0KG1vZHVsZV9pZCk7CisgICAgYmNtb3NfdGFzayAqdGFzazsKKyAgICBsb25nIGxvY2tfZmxhZ3MsIHFfbG9ja19mbGFnczsKKyAgICBiY21vc19tc2dfbGlzdCBtc2dsX3VyZywgbXNnbDsKKworICAgIGlmICghbW9kdWxlKQorICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9OT0VOVCwgIm1vZHVsZV9pZCAlZFxuIiwgbW9kdWxlX2lkKTsKKworICAgIHRhc2sgPSBtb2R1bGUtPm15X3Rhc2s7CisgICAgbG9ja19mbGFncyA9IGJjbW9zX2Zhc3Rsb2NrX2xvY2soJnRhc2stPmFjdGl2ZV9sb2NrKTsKKyAgICB0YXNrLT5tb2R1bGVzW21vZHVsZS0+aWR4XSA9IE5VTEw7CisgICAgdGFzay0+YWN0aXZlX21vZHVsZXMgJj0gfigxIDw8IG1vZHVsZS0+aWR4KTsKKworICAgIC8qIEJlY2F1c2Ugd2UgYXJlIG5vdCBhbGxvd2VkIHRvIGZyZWUgbWVtb3J5ICh2aWEgYmNtb3NfZnJlZSgpKSB3aGVuIGludGVycnVwdHMgYXJlIGxvY2tlZCwgd2Ugb25seSBlbXB0eSB0aGUgbGlua2VkIGxpc3QgKHZpYSBTTElTVF9JTklUKCkpIGFuZCB0aGUgZnJlZSBjb21lcyBvdXRzaWRlIHRoZSBsb2NrZWQKKyAgICAgKiBzZWN0aW9uLiAqLworICAgIHFfbG9ja19mbGFncyA9IGJjbW9zX2Zhc3Rsb2NrX2xvY2soJm1vZHVsZS0+bXNncS5sb2NrKTsKKyAgICBtc2dsX3VyZyA9IG1vZHVsZS0+bXNncS5tc2dsX3VyZzsKKyAgICBtc2dsID0gbW9kdWxlLT5tc2dxLm1zZ2w7CisgICAgU1RBSUxRX0lOSVQoJm1vZHVsZS0+bXNncS5tc2dsX3VyZyk7CisgICAgU1RBSUxRX0lOSVQoJm1vZHVsZS0+bXNncS5tc2dsKTsKKyAgICBiY21vc19mYXN0bG9ja191bmxvY2soJm1vZHVsZS0+bXNncS5sb2NrLCBxX2xvY2tfZmxhZ3MpOworICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmdGFzay0+YWN0aXZlX2xvY2ssIGxvY2tfZmxhZ3MpOworCisgICAgYmNtb3NfbXNnX2xpc3RfZGVzdHJveSgmbXNnbF91cmcpOworICAgIGJjbW9zX21zZ19saXN0X2Rlc3Ryb3koJm1zZ2wpOworCisgICAgaWYgKG1vZHVsZS0+cGFybS5leGl0KQorICAgICAgICBtb2R1bGUtPnBhcm0uZXhpdChtb2R1bGUtPnBhcm0uZGF0YSk7CisgICAgYmNtb3NfbW9kdWxlc1ttb2R1bGVfaWRdID0gTlVMTDsKKyAgICBiY21vc19mcmVlKG1vZHVsZSk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogR2V0IGN1cnJlbnQgbW9kdWxlIGlkIGluIHRoZSBjdXJyZW50IHRhc2sgKi8KK2JjbW9zX21vZHVsZV9pZCBiY21vc19tb2R1bGVfY3VycmVudCh2b2lkKQoreworICAgIGJjbW9zX3Rhc2sgKnRhc2sgPSBiY21vc190YXNrX2N1cnJlbnQoKTsKKworICAgIGlmICghdGFzaykKKyAgICAgICAgcmV0dXJuIEJDTU9TX01PRFVMRV9JRF9OT05FOworICAgIHJldHVybiB0YXNrLT5jdXJyZW50X21vZHVsZTsKK30KKworLyogR2V0IG1vZHVsZSBjb250ZXh0IHNldCBieSBiY21vc19tb2R1bGVfY29udGV4dF9zZXQoKSAqLwordm9pZCAqYmNtb3NfbW9kdWxlX2NvbnRleHQoYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZCkKK3sKKyAgICBiY21vc19tb2R1bGUgKm1vZHVsZSA9IF9iY21vc19tb2R1bGVfZ2V0KG1vZHVsZV9pZCk7CisgICAgaWYgKCFtb2R1bGUpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBtb2R1bGUtPmNvbnRleHQ7Cit9CisKKy8qIFNldCBtb2R1bGUgY29udGV4dCAqLworYmNtb3NfZXJybm8gYmNtb3NfbW9kdWxlX2NvbnRleHRfc2V0KGJjbW9zX21vZHVsZV9pZCBtb2R1bGVfaWQsIHZvaWQgKmNvbnRleHQpCit7CisgICAgYmNtb3NfbW9kdWxlICptb2R1bGUgPSBfYmNtb3NfbW9kdWxlX2dldChtb2R1bGVfaWQpOworCisgICAgaWYgKCFtb2R1bGUpCisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX05PRU5ULCAibW9kdWxlX2lkICVkXG4iLCBtb2R1bGVfaWQpOworICAgIG1vZHVsZS0+Y29udGV4dCA9IGNvbnRleHQ7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIFF1ZXJ5IG1vZHVsZSBpbmZvICovCitiY21vc19lcnJubyBiY21vc19tb2R1bGVfcXVlcnkoYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZCwgY29uc3QgYmNtb3NfdGFzayAqKnRhc2ssIGJjbW9zX21zZ19xdWV1ZV9pbmZvICppbmZvKQoreworICAgIGJjbW9zX21vZHVsZSAqbW9kdWxlID0gX2JjbW9zX21vZHVsZV9nZXQobW9kdWxlX2lkKTsKKworICAgIGlmICghbW9kdWxlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9FTlQ7CisgICAgfQorICAgIGlmICh0YXNrKQorICAgIHsKKyAgICAgICAgKnRhc2sgPSBtb2R1bGUtPm15X3Rhc2s7CisgICAgfQorICAgIGlmIChpbmZvKQorICAgIHsKKyAgICAgICAgaW5mby0+cGFybSA9IG1vZHVsZS0+cGFybS5xcGFybTsKKyAgICAgICAgaW5mby0+c3RhdCA9IG1vZHVsZS0+bXNncS5zdGF0OworICAgIH0KKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoKKyAqIEV2ZW50cworICovCisKKy8qIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBldmVudCBhcnJpdmFsIGluIG1vZHVsZSBjb250ZXh0ICovCitzdGF0aWMgdm9pZCBfYmNtb3NfZXZfaW5fbW9kdWxlX2hhbmRsZXIoYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZCwgYmNtb3NfbXNnICptc2cpCit7CisgICAgYmNtb3NfZXZlbnQgKmV2ID0gX2JjbW9zX21zZ190b19ldmVudChtc2cpOworICAgIHVpbnQzMl90IGFjdGl2ZV9iaXRzOworICAgIGxvbmcgbG9ja19mbGFnczsKKworICAgIGFjdGl2ZV9iaXRzID0gZXYtPmFjdGl2ZV9iaXRzICYgZXYtPnBhcm0ubWFzazsKKyAgICBldi0+cGFybS5oYW5kbGVyKGV2LT5pZCwgYWN0aXZlX2JpdHMpOworCisgICAgbG9ja19mbGFncyA9IGJjbW9zX2Zhc3Rsb2NrX2xvY2soJmV2LT5sb2NrKTsKKyAgICBldi0+YWN0aXZlX2JpdHMgJj0gfmFjdGl2ZV9iaXRzOworICAgIGV2LT5pc193YWl0aW5nID0gQkNNT1NfVFJVRTsKKyAgICBiY21vc19mYXN0bG9ja191bmxvY2soJmV2LT5sb2NrLCBsb2NrX2ZsYWdzKTsKK30KKworLyogUmVsZWFzZSBldmVudCBtZXNzYWdlLiBPbmx5IGNhbGxlZCBpbiBleGNlcHRpb25hbCBzaXR1YXRpb25zLAorICogc3VjaCBhcyBtb2R1bGUgcXVldWUgZGVzdHJveS4gRG8gbm90aGluZy4KKyAqLworc3RhdGljIHZvaWQgX2JjbW9zX2V2X21zZ19yZWxlYXNlKGJjbW9zX21zZyAqbXNnKQoreworfQorCisvKiBDcmVhdGUgZXZlbnQgc2V0ICovCitiY21vc19lcnJubyBiY21vc19ldmVudF9jcmVhdGUoYmNtb3NfZXZlbnRfaWQgZXZlbnRfaWQsIGJjbW9zX2V2ZW50X3Bhcm0gKnBhcm0pCit7CisgICAgYmNtb3NfZXZlbnQgKmV2OworICAgIGJjbW9zX21vZHVsZSAqbW9kdWxlID0gTlVMTDsKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIGlmICgodW5zaWduZWQpZXZlbnRfaWQgPj0gKHVuc2lnbmVkKUJDTU9TX0VWRU5UX0lEX19OVU1fT0YpCisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX1BBUk0sICJldmVudF9pZCAlZFxuIiwgZXZlbnRfaWQpOworCisgICAgaWYgKF9iY21vc19ldmVudF9nZXQoZXZlbnRfaWQpKQorICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9BTFJFQURZLCAiZXZlbnRfaWQgJWRcbiIsIGV2ZW50X2lkKTsKKworICAgIGlmIChwYXJtICYmIHBhcm0tPm1vZHVsZV9pZCAhPSBCQ01PU19NT0RVTEVfSURfTk9ORSkKKyAgICB7CisgICAgICAgIG1vZHVsZSA9IF9iY21vc19tb2R1bGVfZ2V0KHBhcm0tPm1vZHVsZV9pZCk7CisgICAgICAgIGlmICghbW9kdWxlKQorICAgICAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfTk9FTlQsICJtb2R1bGVfaWQgJWRcbiIsIHBhcm0tPm1vZHVsZV9pZCk7CisgICAgICAgIGlmICghcGFybS0+aGFuZGxlciB8fCAhcGFybS0+bWFzaykKKyAgICAgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX1BBUk0sICJldmVudF9pZCAlZCwgaGFuZGxlciAlcCwgbWFzayAleFxuIiwgZXZlbnRfaWQsIHBhcm0tPmhhbmRsZXIsIHBhcm0tPm1hc2spOworICAgIH0KKworICAgIGV2ID0gYmNtb3NfY2FsbG9jKHNpemVvZihiY21vc19ldmVudCkpOworICAgIGlmICghZXYpCisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX05PTUVNLCAiZXZlbnRfaWQgJWRcbiIsIGV2ZW50X2lkKTsKKworICAgIGV2LT5pZCA9IGV2ZW50X2lkOworICAgIGlmIChwYXJtKQorICAgICAgICBldi0+cGFybSA9ICpwYXJtOworICAgIGJjbW9zX2Zhc3Rsb2NrX2luaXQoJmV2LT5sb2NrLCBldi0+cGFybS5mbGFncyk7CisgICAgeworICAgICAgICByYyA9IGJjbW9zX3NlbV9jcmVhdGUoJmV2LT5tLCAwLCBldi0+cGFybS5mbGFncywgZXYtPnBhcm0ubmFtZSk7CisgICAgICAgIGlmIChyYykKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfZnJlZShldik7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBJbml0aWFsaXplIGV2ZW50IG1lc3NhZ2UgaW4gaW50ZWdyYXRpb24gbW9kZSAqLworICAgIGlmIChldi0+cGFybS5tb2R1bGVfaWQgIT0gQkNNT1NfTU9EVUxFX0lEX05PTkUpCisgICAgeworICAgICAgICBldi0+bXNnLmhhbmRsZXIgPSBfYmNtb3NfZXZfaW5fbW9kdWxlX2hhbmRsZXI7CisgICAgICAgIGV2LT5tc2cucmVsZWFzZSA9IF9iY21vc19ldl9tc2dfcmVsZWFzZTsKKyAgICAgICAgZXYtPm1zZy5zZW5kZXIgPSBCQ01PU19NT0RVTEVfSURfTk9ORTsKKyAgICAgICAgZXYtPm1zZy50eXBlID0gQkNNT1NfTVNHX0lEX0lOVEVSTkFMX0VWRU5UOworICAgICAgICBldi0+aXNfd2FpdGluZyA9IEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgLyogQ29weSBuYW1lIHRvIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIG5vdCByZWxlYXNlZCAtIGluIGNhc2UgaXQgd2FzIG9uIHRoZSBzdGFjayAqLworICAgIGlmIChldi0+cGFybS5uYW1lKQorICAgIHsKKyAgICAgICAgc3RybmNweShldi0+bmFtZSwgZXYtPnBhcm0ubmFtZSwgc2l6ZW9mKGV2LT5uYW1lKSAtIDEpOworICAgICAgICBldi0+cGFybS5uYW1lID0gZXYtPm5hbWU7CisgICAgfQorCisgICAgYmNtb3NfZXZlbnRzW2V2ZW50X2lkXSA9IGV2OworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIERlc3Ryb3kgZXZlbnQgc2V0IGNyZWF0ZWQgYnkgYmNtb3NfZXZlbnRfY3JlYXRlKCkgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX2V2ZW50X2Rlc3Ryb3koYmNtb3NfZXZlbnRfaWQgZXZlbnRfaWQpCit7CisgICAgcmV0dXJuIEJDTV9FUlJfTk9UX1NVUFBPUlRFRDsKK30KKworLyogUmFpc2UgZXZlbnQgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX2V2ZW50X3JhaXNlKGJjbW9zX2V2ZW50X2lkIGV2ZW50X2lkLCB1aW50MzJfdCBhY3RpdmVfYml0cykKK3sKKyAgICBiY21vc19ldmVudCAqZXYgPSBfYmNtb3NfZXZlbnRfZ2V0KGV2ZW50X2lkKTsKKyAgICBsb25nIGxvY2tfZmxhZ3M7CisKKyAgICBpZiAoIWV2KQorICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9OT0VOVCwgImV2ZW50X2lkICVkXG4iLCBldmVudF9pZCk7CisKKyAgICBsb2NrX2ZsYWdzID0gYmNtb3NfZmFzdGxvY2tfbG9jaygmZXYtPmxvY2spOworICAgIGV2LT5hY3RpdmVfYml0cyB8PSBhY3RpdmVfYml0czsKKyAgICBpZiAoZXYtPmlzX3dhaXRpbmcgJiYgKGV2LT5hY3RpdmVfYml0cyAmIGV2LT5wYXJtLm1hc2spKQorICAgIHsKKyAgICAgICAgZXYtPmlzX3dhaXRpbmcgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZldi0+bG9jaywgbG9ja19mbGFncyk7CisgICAgICAgIGlmIChldi0+cGFybS5tb2R1bGVfaWQgIT0gQkNNT1NfTU9EVUxFX0lEX05PTkUpCisgICAgICAgICAgICBiY21vc19tc2dfc2VuZF90b19tb2R1bGUoZXYtPnBhcm0ubW9kdWxlX2lkLCAmZXYtPm1zZywgQkNNT1NfTVNHX1NFTkRfVVJHRU5UIHwgQkNNT1NfTVNHX1NFTkRfTk9MSU1JVCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJjbW9zX3NlbV9wb3N0KCZldi0+bSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmZXYtPmxvY2ssIGxvY2tfZmxhZ3MpOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBXYWl0IGZvciBldmVudCAqLworYmNtb3NfZXJybm8gYmNtb3NfZXZlbnRfcmVjdihiY21vc19ldmVudF9pZCBldmVudF9pZCwgdWludDMyX3QgbWFzaywKKyAgICB1aW50MzJfdCB0aW1lb3V0LCB1aW50MzJfdCAqYWN0aXZlX2JpdHMpCit7CisgICAgYmNtb3NfZXZlbnQgKmV2ID0gX2JjbW9zX2V2ZW50X2dldChldmVudF9pZCk7CisgICAgbG9uZyBsb2NrX2ZsYWdzOworCisgICAgQlVHX09OKCFhY3RpdmVfYml0cyk7CisgICAgaWYgKCFldikKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfTk9FTlQsICJldmVudF9pZCAlZCBpcyBub3QgcmVnaXN0ZXJlZFxuIiwgZXZlbnRfaWQpOworCisgICAgbG9ja19mbGFncyA9IGJjbW9zX2Zhc3Rsb2NrX2xvY2soJmV2LT5sb2NrKTsKKyAgICAqYWN0aXZlX2JpdHMgPSBldi0+YWN0aXZlX2JpdHMgJiBtYXNrOworICAgIGlmICgqYWN0aXZlX2JpdHMpCisgICAgeworICAgICAgICBldi0+YWN0aXZlX2JpdHMgJj0gfiAqYWN0aXZlX2JpdHM7CisgICAgICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmZXYtPmxvY2ssIGxvY2tfZmxhZ3MpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisgICAgaWYgKCF0aW1lb3V0KQorICAgIHsKKyAgICAgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZldi0+bG9jaywgbG9ja19mbGFncyk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PRU5UOworICAgIH0KKworICAgIC8qIHJlY3Ygd2l0aCB3YWl0ICovCisgICAgZXYtPmlzX3dhaXRpbmcgPSBCQ01PU19UUlVFOworICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmZXYtPmxvY2ssIGxvY2tfZmxhZ3MpOworCisgICAgLyogd2FpdCBmb3IgaXQgKi8KKyAgICBiY21vc19zZW1fd2FpdCgmZXYtPm0sIHRpbWVvdXQpOworICAgIC8qIEVpdGhlciBnb3QgZXZlbnQgb3IgdGltZW91dCAqLworICAgIGxvY2tfZmxhZ3MgPSBiY21vc19mYXN0bG9ja19sb2NrKCZldi0+bG9jayk7CisgICAgKmFjdGl2ZV9iaXRzID0gZXYtPmFjdGl2ZV9iaXRzICYgbWFzazsKKyAgICBldi0+YWN0aXZlX2JpdHMgJj0gfiAqYWN0aXZlX2JpdHM7CisgICAgZXYtPmlzX3dhaXRpbmcgPSBCQ01PU19GQUxTRTsKKyAgICBiY21vc19mYXN0bG9ja191bmxvY2soJmV2LT5sb2NrLCBsb2NrX2ZsYWdzKTsKKyAgICAvKiBJZiB3ZSB3YWl0IGZvcmV2ZXIgYW5kIHdlIGdvdCBhbiBldmVudCB0aGF0IGRvZXMgbm90IG1hdGNoIHRoZSBtYXNrIHdlIHdhaXQgb24gKHRoaXMgaXMgdGhlIG9ubHkgcG9zc2libGUgcmVhc29uIGdldHRpbmcgaGVyZSBpZiB3YWl0aW5nIGZvcmV2ZXIpLCB0aGVuIHdlCisgICAgICogd2FudCB0byBhdm9pZCByZXR1cm5pbmcgQkNNX0VSUl9USU1FT1VUIC0gaXQncyBub3QgYW4gZXJyb3IuICovCisgICAgaWYgKHRpbWVvdXQgIT0gQkNNT1NfV0FJVF9GT1JFVkVSICYmICEqYWN0aXZlX2JpdHMpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1RJTUVPVVQ7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qCisgKiBUaW1lcgorICovCisKKy8qIGNvbXBhcmUgdGltZXN0YW1wcyBtaW5kaW5nIHdyYXAtYXJvdW5kCisgKiByZXR1cm5zIGRlbHRhID49IDAgaWYgdHMxID49IHRzMgorICovCitzdGF0aWMgaW5saW5lIGludDMyX3QgX2JjbW9zX3RpbWVyX3RzX2RlbHRhKHVpbnQzMl90IHRzMSwgdWludDMyX3QgdHMyKQoreworICAgIGludDMyX3QgZGVsdGEgPSAoaW50KSh0czEgLSB0czIpOworICAgIHJldHVybiBkZWx0YTsKK30KKworc3RhdGljIGludDMyX3QgX2JjbW9zX3RpbWVyX2NvbXBhcmUoc3RydWN0IGJjbW9zX3RpbWVyICp0MSwgc3RydWN0IGJjbW9zX3RpbWVyICp0MikKK3sKKyAgICBpbnQzMl90IGRlbHRhID0gX2JjbW9zX3RpbWVyX3RzX2RlbHRhKHQxLT5leHBpcmVfYXQsIHQyLT5leHBpcmVfYXQpOworI2lmIGRlZmluZWQoQkNNT1NfVElNRVJfUkJfVFJFRSkgJiYgIWRlZmluZWQoQkNNT1NfVElNRVJfUkJfVFJFRV9MSVNUKQorICAgIC8qIEZyZWVCU0QgUkIgdHJlZSBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHN1cHBvcnQgMiBub2RlcyB3aXRoIHRoZSBzYW1lIGtleSAqLworICAgIGlmICghZGVsdGEpCisgICAgICAgIGRlbHRhID0gMTsKKyNlbmRpZgorICAgIHJldHVybiBkZWx0YTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9iY21vc19zdGFydF9zeXN0ZW1fdGltZXIoYmNtb3NfdGltZXIgKmhlYWQpCit7CisgICAgaWYgKGhlYWQpCisgICAgeworICAgICAgICBpbnQzMl90IGRlbGF5ID0gX2JjbW9zX3RpbWVyX3RzX2RlbHRhKGhlYWQtPmV4cGlyZV9hdCwgYmNtb3NfdGltZXN0YW1wKCkpOworICAgICAgICAvKiBIYW5kbGUgcmFyZSByYWNlIGNvbmRpdGlvbiB3aGVuIG5leHQgdGltZXIgZXhwaXJlZCB3aGlsZSB3ZSB3ZXJlIGZpZGRsaW5nCisgICAgICAgICAqIHdpdGggdGhlIHBvb2wuIEp1c3QgZ2l2ZSBpdCAxIG1vcmUgInRpY2siLiBTeXN0ZW0gaGFuZGxlciBoYW5kbGVzIGFsbCB0aW1lcnMKKyAgICAgICAgICogZXhwaXJlZCAoPG5vdyAuLiBub3cgKyBQUkVDSVNJT04vMikKKyAgICAgICAgICovCisgICAgICAgIGlmIChkZWxheSA8PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBkZWxheSA9IEJDTU9TX1RJTUVSX1BSRUNJU0lPTl9VUyAvIDI7CisgICAgICAgIH0KKyAgICAgICAgYmNtb3Nfc3lzX3RpbWVyX3N0YXJ0KCZ0bXJfcG9vbC5zeXNfdGltZXIsIGRlbGF5KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYmNtb3Nfc3lzX3RpbWVyX3N0b3AoJnRtcl9wb29sLnN5c190aW1lcik7CisgICAgfQorfQorCisvKgorICogVGltZXIgcG9vbDogUkIgdHJlZSBvciBUQUlMUS1iYXNlZCBpbXBsZW1lbnRhdGlvbgorICovCitzdGF0aWMgdm9pZCBfYmNtb3NfdGltZXJfcG9vbF9pbnNlcnQoYmNtb3NfdGltZXIgKnRpbWVyLCB1aW50MzJfdCBkZWxheSwgYmNtb3NfYm9vbCBzdGFydF9zeXNfdGltZXIpCit7CisgICAgbG9uZyBmbGFnczsKKyAgICBiY21vc190aW1lciAqaGVhZDsKKworICAgIGZsYWdzID0gYmNtb3NfZmFzdGxvY2tfbG9jaygmdG1yX3Bvb2wubG9jayk7CisgICAgaWYgKEJDTU9TX1RJTUVSX0lTX1JVTk5JTkcodGltZXIpKQorICAgIHsKKyAgICAgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZ0bXJfcG9vbC5sb2NrLCBmbGFncyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgdGltZXItPnBlcmlvZCA9IHRpbWVyLT5wYXJtLnBlcmlvZGljID8gZGVsYXkgOiAwOworICAgIHRpbWVyLT5leHBpcmVfYXQgPSBCQ01PU19ST1VORF9VUChiY21vc190aW1lc3RhbXAoKSArIGRlbGF5LCBCQ01PU19USU1FUl9QUkVDSVNJT05fVVMgLyAyKTsKKyAgICBUTVJfUE9PTF9JTlNFUlQoJnRtcl9wb29sLCB0aW1lcik7CisgICAgdGltZXItPmZsYWdzICY9IH5CQ01PU19USU1FUl9GTEFHX0VYUElSRUQ7CisgICAgdGltZXItPmZsYWdzIHw9IEJDTU9TX1RJTUVSX0ZMQUdfUlVOTklORzsKKworICAgIC8qIElmIG5ldyB0aW1lciBpcyBhdCB0aGUgdG9wIC0ga2ljayBzeXN0ZW0gdGltZXIgKi8KKyAgICBpZiAoc3RhcnRfc3lzX3RpbWVyKQorICAgIHsKKyAgICAgICAgaGVhZCA9IFRNUl9QT09MX0ZJUlNUKCZ0bXJfcG9vbCk7CisgICAgICAgIGlmICh0aW1lciA9PSBoZWFkKQorICAgICAgICB7CisgICAgICAgICAgICBfYmNtb3Nfc3RhcnRfc3lzdGVtX3RpbWVyKGhlYWQpOworICAgICAgICB9CisgICAgfQorICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmdG1yX3Bvb2wubG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBfYmNtb3NfdGltZXJfc3RvcChiY21vc190aW1lciAqdGltZXIpCit7CisgICAgbG9uZyBmbGFnczsKKyAgICBiY21vc19ib29sIHdhc190b3A7CisgICAgYmNtb3NfbXNnX3F1ZXVlX253ICpxdWV1ZTsKKworICAgIC8qIEZpcnN0IHRha2UgcnVubmluZyB0aW1lciBvdXQgb2YgdGhlIGFjdGl2ZSBwb29sICovCisgICAgZmxhZ3MgPSBiY21vc19mYXN0bG9ja19sb2NrKCZ0bXJfcG9vbC5sb2NrKTsKKyAgICB0aW1lci0+cGVyaW9kID0gMDsgLyogUHJldmVudCBwZXJpb2RpYyB0aW1lciByZXN0YXJ0ICovCisgICAgaWYgKEJDTU9TX1RJTUVSX0lTX1JVTk5JTkcodGltZXIpKQorICAgIHsKKyAgICAgICAgdGltZXItPmZsYWdzICY9IH5CQ01PU19USU1FUl9GTEFHX1JVTk5JTkc7CisgICAgICAgIHdhc190b3AgPSAodGltZXIgPT0gVE1SX1BPT0xfRklSU1QoJnRtcl9wb29sKSk7CisgICAgICAgIFRNUl9QT09MX1JFTU9WRSgmdG1yX3Bvb2wsIHRpbWVyKTsKKworICAgICAgICAvKiBJZiB0aW1lciB3YXMgdGhlIHRvcCAtIHN0b3AvcmVzdGFydCBzeXN0ZW0gdGltZXIgKi8KKyAgICAgICAgaWYgKHdhc190b3ApCisgICAgICAgIHsKKyAgICAgICAgICAgIF9iY21vc19zdGFydF9zeXN0ZW1fdGltZXIoVE1SX1BPT0xfRklSU1QoJnRtcl9wb29sKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZ0bXJfcG9vbC5sb2NrLCBmbGFncyk7CisKKyAgICAvKiBOb3cgdGltZXIgaXMgbm90IGluIHRoZSBhY3RpdmUgcG9vbC4gUGVyaGFwcyBpdCBpcyBhbHJlYWR5IGluCisgICAgICogZGVzdGluYXRpb24gbW9kdWxlJ3MgcXVldWUuIFRha2UgaXQgb3V0IGlmIHllcy4KKyAgICAgKi8KKyAgICBxdWV1ZSA9IHRpbWVyLT5xdWV1ZTsKKyAgICBpZiAocXVldWUpCisgICAgeworICAgICAgICBmbGFncyA9IGJjbW9zX2Zhc3Rsb2NrX2xvY2soJnF1ZXVlLT5sb2NrKTsKKyAgICAgICAgLyogQ2hlY2sgcXVldWUgYWdhaW4gYmVjYXVzZSB0aGUgcHJldmlvdXMgY2hlY2sgd2FzIHVucHJvdGVjdGVkICovCisgICAgICAgIGlmICh0aW1lci0+cXVldWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX21zZ19saXN0ICptc2dfbGlzdCA9ICgodGltZXItPnBhcm0uZmxhZ3MgJiBCQ01PU19USU1FUl9QQVJNX0ZMQUdTX05PTl9VUkdFTlQpKQorICAgICAgICAgICAgICAgID8gJnF1ZXVlLT5tc2dsIDogJnF1ZXVlLT5tc2dsX3VyZzsKKyAgICAgICAgICAgIGlmIChTVEFJTFFfUkVNT1ZFX1NBRkUobXNnX2xpc3QsICZ0aW1lci0+bXNnLCBiY21vc19tc2csIG5leHQpICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2JjbW9zX21zZ3Ffc3RhdF9kZWMocXVldWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGltZXItPnF1ZXVlID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICB0aW1lci0+ZmxhZ3MgJj0gfkJDTU9TX1RJTUVSX0ZMQUdfRVhQSVJFRDsKKyAgICAgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZxdWV1ZS0+bG9jaywgZmxhZ3MpOworICAgIH0KKworICAgIC8qIElmIHRpbWVyIGhhcyBhbHJlYWR5IGV4cGlyZWQgYW5kIHdlIHdlcmVuJ3QgYWJsZSB0byBzdG9wIGl0IC0KKyAgICAgKiB3YWl0IGZvciBleHBpcmF0aW9uIGNhbGxiYWNrIHRvIGZpbmlzaCBiZWZvcmUgbGVhdmluZyBfYmNtb3NfdGltZXJfc3RvcCgpCisgICAgICovCisgICAgaWYgKEJDTU9TX1RJTUVSX0lTX0VYUElSRUQodGltZXIpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdGFzayAqdCA9IGJjbW9zX3Rhc2tfY3VycmVudCgpOworCisgICAgICAgIC8qIFNraXAgd2FpdCBpZiB0aW1lciBpcyBiZWluZyBzdG9wcGVkIC8gcmVzdGFydGVkIGZyb20gaW5zaWRlIHRoZSBoYW5kbGVyICovCisgICAgICAgIGlmICh0ICE9IHRpbWVyLT50YXNrKQorICAgICAgICB7CisgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVElNRVJfSVNfRVhQSVJFRCh0aW1lcikgJiYgQkNNT1NfVElNRVJfSVNfVkFMSUQodGltZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9zX3VzbGVlcCgxMDAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRpbWVyLT5mbGFncyAmPSB+QkNNT1NfVElNRVJfRkxBR19FWFBJUkVEOworICAgICAgICB9CisgICAgfQorfQorCisKKy8qIFN5c3RlbSB0aW1lciBleHBpcmF0aW9uIGhhbmRsZXIuCisgKiBFeGVjdXRlIGFsbCB0aW1lcnMgdGhhdCBleHBpcmVkIGFuZCByZXN0YXJ0IHN5c3RlbSB0aW1lcgorICovCitzdGF0aWMgdm9pZCBfc3lzX3RpbWVyX2hhbmRsZXIodm9pZCAqZGF0YSkKK3sKKyAgICBiY21vc190aW1lcl9wb29sICpwb29sID0gKGJjbW9zX3RpbWVyX3Bvb2wgKilkYXRhOworICAgIGJjbW9zX3RpbWVyICp0aW1lcjsKKyAgICBiY21vc190aW1lcl9yYyByYzsKKyAgICBsb25nIGZsYWdzOworCisgICAgQlVHX09OKHBvb2wgIT0gJnRtcl9wb29sKTsKKyAgICBmbGFncyA9IGJjbW9zX2Zhc3Rsb2NrX2xvY2soJnBvb2wtPmxvY2spOworICAgIHdoaWxlICgodGltZXI9VE1SX1BPT0xfRklSU1QocG9vbCkpICE9IE5VTEwpCisgICAgeworICAgICAgICAvKiBTdG9wIHdoZW4gcmVhY2hlZCB0aW1lciB0aGF0IGhhc24ndCBleHBpcmVkIHlldCAqLworICAgICAgICBpZiAoX2JjbW9zX3RpbWVyX3RzX2RlbHRhKHRpbWVyLT5leHBpcmVfYXQsIGJjbW9zX3RpbWVzdGFtcCgpKSA+IEJDTU9TX1RJTUVSX1BSRUNJU0lPTl9VUyAvIDIpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgdGltZXItPmZsYWdzIHw9IEJDTU9TX1RJTUVSX0ZMQUdfRVhQSVJFRDsKKyAgICAgICAgdGltZXItPmZsYWdzICY9IH5CQ01PU19USU1FUl9GTEFHX1JVTk5JTkc7CisgICAgICAgIC8qIElUOiBCYXJyaWVyIGhlcmUgPyAqLworICAgICAgICBUTVJfUE9PTF9SRU1PVkUocG9vbCwgdGltZXIpOworCisgICAgICAgIC8qIEV4ZWN1dGUgaGFuZGxlci4gVW5sb2NrIGZpcnN0IGFuZCByZS1sb2NrIGluIHRoZSBlbmQKKyAgICAgICAgICogSXQgaXMgc2FmZSB0byB1bmxvY2sgaGVyZSBiZWNhdXNlIHRoZSB0b3AgbG9vcCBzdGFydHMgZnJvbSBNSU4gZXZlcnkgdGltZQorICAgICAgICAgKi8KKyAgICAgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZwb29sLT5sb2NrLCBmbGFncyk7CisgICAgICAgIHJjID0gdGltZXItPmhhbmRsZXIodGltZXIsIHRpbWVyLT5wYXJtLmRhdGEpOworICAgICAgICBpZiAoIXRpbWVyLT5wYXJtLm93bmVyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocmMgPT0gQkNNT1NfVElNRVJfT0sgJiYgdGltZXItPnBlcmlvZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpbnRlcnZhbCA9IHRpbWVyLT5wZXJpb2Q7CisgICAgICAgICAgICAgICAgdGltZXItPnBlcmlvZCA9IDA7CisgICAgICAgICAgICAgICAgX2JjbW9zX3RpbWVyX3Bvb2xfaW5zZXJ0KHRpbWVyLCBpbnRlcnZhbCwgQkNNT1NfRkFMU0UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRpbWVyLT5mbGFncyAmPSB+QkNNT1NfVElNRVJfRkxBR19FWFBJUkVEOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZsYWdzID0gYmNtb3NfZmFzdGxvY2tfbG9jaygmcG9vbC0+bG9jayk7CisgICAgfQorICAgIC8qIEZpbmFsbHkga2ljayBzeXN0ZW0gdGltZXIgKi8KKyAgICBfYmNtb3Nfc3RhcnRfc3lzdGVtX3RpbWVyKHRpbWVyKTsKKyAgICBiY21vc19mYXN0bG9ja191bmxvY2soJnBvb2wtPmxvY2ssIGZsYWdzKTsKK30KKworLyogU2VuZCB0aW1lciBleHBpcmF0aW9uIHRvIHRoZSB0YXJnZXQgbW9kdWxlIGFzIHVyZ2VudCBtZXNzYWdlLgorICogX2JjbW9zX3RpbWVyX2luX21vZHVsZV9oYW5kbGVyKCkgd2lsbCBnZXQgY2FsbGVkIGluIHRoZSBtb2R1bGUgY29udGV4dAorICovCitzdGF0aWMgYmNtb3NfdGltZXJfcmMgX2JjbW9zX3RpbWVyX3NlbmRfdG9fbW9kdWxlX2hhbmRsZXIoYmNtb3NfdGltZXIgKnRpbWVyLCBsb25nIGRhdGEpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgYmNtb3NfbW9kdWxlICptb2R1bGUgPSBfYmNtb3NfbW9kdWxlX2dldCh0aW1lci0+cGFybS5vd25lcik7CisgICAgYmNtb3NfbXNnX3NlbmRfZmxhZ3Mgc2VuZF9mbGFnczsKKyAgICBpZiAoIW1vZHVsZSkKKyAgICB7CisgICAgICAgIC8qIFNob3VsZG4ndCBoYXBwZW4sIHVubGVzcyB0aGUgbW9kdWxlIHdhcyBkZXN0cm95ZWQgKi8KKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJfYmNtb3NfdGltZXJfc2VuZF90b19tb2R1bGVfaGFuZGxlcigpIC0tIG5vIG1vZHVsZT0ldSAodGltZXItPnBhcm0uaGFuZGxlcj0weCVwKVxuIiwgdGltZXItPnBhcm0ub3duZXIsIHRpbWVyLT5wYXJtLmhhbmRsZXIpOworICAgICAgICB0aW1lci0+ZmxhZ3MgJj0gfkJDTU9TX1RJTUVSX0ZMQUdfRVhQSVJFRDsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RJTUVSX1NUT1A7ICAgICAgLyogd2lsbCByZXN0YXJ0IGluIG1vZHVsZSBjb250ZXh0IGlmIG5lY2Vzc2FyeSAqLworICAgIH0KKyAgICB0aW1lci0+cXVldWUgPSAmbW9kdWxlLT5tc2dxOworICAgIHNlbmRfZmxhZ3MgPSBCQ01PU19NU0dfU0VORF9OT0xJTUlUOworICAgIGlmICghKCh0aW1lci0+cGFybS5mbGFncyAmIEJDTU9TX1RJTUVSX1BBUk1fRkxBR1NfTk9OX1VSR0VOVCkpKQorICAgICAgICBzZW5kX2ZsYWdzIHw9IEJDTU9TX01TR19TRU5EX1VSR0VOVDsKKyAgICByYyA9IGJjbW9zX21zZ19zZW5kX3RvX21vZHVsZSh0aW1lci0+cGFybS5vd25lciwgJnRpbWVyLT5tc2csIHNlbmRfZmxhZ3MpOworICAgIGlmIChyYykKKyAgICB7CisgICAgICAgIC8qIFNob3VsZG4ndCBoYXBwZW4sIHVubGVzcyB0aGUgbW9kdWxlIHdhcyBkZXN0cm95ZWQuIFZlcnkgc2hvcnQgcmFjZSBjb25kaXRpb24gaGVyZSAqLworICAgICAgICB0aW1lci0+cXVldWUgPSBOVUxMOworICAgICAgICB0aW1lci0+ZmxhZ3MgJj0gfkJDTU9TX1RJTUVSX0ZMQUdfRVhQSVJFRDsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJfYmNtb3NfdGltZXJfc2VuZF90b19tb2R1bGVfaGFuZGxlcigpIC0tPiAlZFxuIiwgcmMpOworICAgIH0KKyAgICByZXR1cm4gQkNNT1NfVElNRVJfU1RPUDsgLyogd2lsbCByZXN0YXJ0IGluIG1vZHVsZSBjb250ZXh0IGlmIG5lY2Vzc2FyeSAqLworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGltZXIgZXhwaXJhdGlvbiBpbiBtb2R1bGUgY29udGV4dCAqLworc3RhdGljIHZvaWQgX2JjbW9zX3RpbWVyX2luX21vZHVsZV9oYW5kbGVyKGJjbW9zX21vZHVsZV9pZCBtb2R1bGVfaWQsIGJjbW9zX21zZyAqbXNnKQoreworICAgIGJjbW9zX3RpbWVyICp0aW1lciA9IF9iY21vc19tc2dfdG9fdGltZXIobXNnKTsKKyAgICBiY21vc19tb2R1bGUgKm1vZHVsZSA9IF9iY21vc19tb2R1bGVfZ2V0KHRpbWVyLT5wYXJtLm93bmVyKTsKKyAgICBiY21vc190aW1lcl9yYyByYzsKKworICAgIC8qIENhbGwgdGltZXIncyBjYWxsYmFjayBmdW5jdGlvbiBhbmQgcmVzdGFydCB0aGUgdGltZXIgaWYgbmVjZXNzYXJ5ICovCisgICAgdGltZXItPnF1ZXVlID0gTlVMTDsKKyAgICAvKiBtb2R1bGUgY2FuJ3QgYmUgTlVMTCBoZXJlLiBpdCBpcyBjaGVja2VkIGFueXdheSB0byBrZWVwIHN0YXRpYyBjb2RlIGFuYWx5emVyIGhhcHB5ICovCisgICAgdGltZXItPnRhc2sgPSBtb2R1bGUgPyBtb2R1bGUtPm15X3Rhc2sgOiAoYmNtb3NfdGFzayopTlVMTDsKKyAgICByYyA9IHRpbWVyLT5wYXJtLmhhbmRsZXIodGltZXIsIHRpbWVyLT5wYXJtLmRhdGEpOworICAgIHRpbWVyLT50YXNrID0gTlVMTDsKKyAgICBpZiAocmMgPT0gQkNNT1NfVElNRVJfT0sgJiYgdGltZXItPnBlcmlvZCkKKyAgICAgICAgX2JjbW9zX3RpbWVyX3Bvb2xfaW5zZXJ0KHRpbWVyLCB0aW1lci0+cGVyaW9kLCBCQ01PU19UUlVFKTsKKyAgICBlbHNlCisgICAgICAgIHRpbWVyLT5mbGFncyAmPSB+QkNNT1NfVElNRVJfRkxBR19FWFBJUkVEOworfQorCisvKiBSZWxlYXNlIHRpbWVyIG1lc3NhZ2UuIE9ubHkgY2FsbGVkIGluIGV4Y2VwdGlvbmFsIHNpdHVhdGlvbnMsCisgKiBzdWNoIGFzIG1vZHVsZSBxdWV1ZSBkZXN0cm95LiBEbyBub3RoaW5nCisgKi8KK3N0YXRpYyB2b2lkIF9iY21vc190aW1lcl9tc2dfcmVsZWFzZShiY21vc19tc2cgKm1zZykKK3sKK30KKworLyogQ3JlYXRlIHRpbWVyICovCitiY21vc19lcnJubyBiY21vc190aW1lcl9jcmVhdGUoYmNtb3NfdGltZXIgKnRpbWVyLCBiY21vc190aW1lcl9wYXJtICpwYXJtKQoreworICAgIGlmICghdGltZXIgfHwgIXBhcm0gfHwgIXBhcm0tPmhhbmRsZXIpCisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX1BBUk0sICJ0aW1lciAlcCwgcGFybSAlcCBoYW5kbGVyICVwXG4iLCB0aW1lciwgcGFybSwgcGFybSA/IHBhcm0tPmhhbmRsZXIgOiBOVUxMKTsKKyAgICBpZiAocGFybS0+b3duZXIgIT0gQkNNT1NfTU9EVUxFX0lEX05PTkUgJiYgX2JjbW9zX21vZHVsZV9nZXQocGFybS0+b3duZXIpID09IE5VTEwpCisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX05PRU5ULCAibW9kdWxlX2lkICVkXG4iLCBwYXJtLT5vd25lcik7CisgICAgbWVtc2V0KHRpbWVyLCAwLCBzaXplb2YoYmNtb3NfdGltZXIpKTsKKyAgICB0aW1lci0+cGFybSA9ICpwYXJtOworICAgIGlmIChwYXJtLT5vd25lciA9PSBCQ01PU19NT0RVTEVfSURfTk9ORSkKKyAgICAgICAgdGltZXItPmhhbmRsZXIgPSBwYXJtLT5oYW5kbGVyOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIHRpbWVyLT5oYW5kbGVyID0gX2JjbW9zX3RpbWVyX3NlbmRfdG9fbW9kdWxlX2hhbmRsZXI7CisgICAgICAgIHRpbWVyLT5tc2cuaGFuZGxlciA9IF9iY21vc190aW1lcl9pbl9tb2R1bGVfaGFuZGxlcjsKKyAgICAgICAgdGltZXItPm1zZy5yZWxlYXNlID0gX2JjbW9zX3RpbWVyX21zZ19yZWxlYXNlOworICAgICAgICB0aW1lci0+bXNnLnNlbmRlciA9IEJDTU9TX01PRFVMRV9JRF9OT05FOworICAgICAgICB0aW1lci0+bXNnLnR5cGUgPSBCQ01PU19NU0dfSURfSU5URVJOQUxfVElNRVI7CisgICAgfQorICAgIHRpbWVyLT5mbGFncyB8PSBCQ01PU19USU1FUl9GTEFHX1ZBTElEOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBEZXN0cm95IHRpbWVyICovCit2b2lkIGJjbW9zX3RpbWVyX2Rlc3Ryb3koYmNtb3NfdGltZXIgKnRpbWVyKQoreworICAgIEJVR19PTighdGltZXIpOworICAgIGJjbW9zX3RpbWVyX3N0b3AodGltZXIpOworICAgIHRpbWVyLT5mbGFncyAmPSB+QkNNT1NfVElNRVJfRkxBR19WQUxJRDsKK30KKworLyogKFJlKXN0YXJ0IHRpbWVyICovCit2b2lkIGJjbW9zX3RpbWVyX3N0YXJ0KGJjbW9zX3RpbWVyICp0aW1lciwgdWludDMyX3QgZGVsYXkpCit7CisgICAgQlVHX09OKCF0aW1lcik7CisgICAgQlVHX09OKCFCQ01PU19USU1FUl9JU19WQUxJRCh0aW1lcikpOworICAgIGlmICgoaW50MzJfdClkZWxheSA8IDApCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9FUlIoIkF0dGVtcHQgdG8gc3RhcnQgdGltZXIgKCVzKSBmb3IgcGVyaW9kIGxvbmdlciB0aGFuIDJeMzEtMS4gUmVkdWNlZCB0byAyXjMxLTFcbiIsCisgICAgICAgICAgICB0aW1lci0+cGFybS5uYW1lID8gdGltZXItPnBhcm0ubmFtZSA6ICIqdW5uYW1lZCoiKTsKKyAgICAgICAgZGVsYXkgPSAweDdmZmZmZmZmOworICAgIH0KKworICAgIGlmIChCQ01PU19USU1FUl9JU19SVU5OSU5HKHRpbWVyKSB8fCBCQ01PU19USU1FUl9JU19FWFBJUkVEKHRpbWVyKSkKKyAgICB7CisgICAgICAgIF9iY21vc190aW1lcl9zdG9wKHRpbWVyKTsKKyAgICB9CisgICAgX2JjbW9zX3RpbWVyX3Bvb2xfaW5zZXJ0KHRpbWVyLCBkZWxheSwgQkNNT1NfVFJVRSk7Cit9CisKKy8qIFN0b3AgdGltZXIgaWYgcnVubmluZyAqLwordm9pZCBiY21vc190aW1lcl9zdG9wKGJjbW9zX3RpbWVyICp0aW1lcikKK3sKKyAgICBCVUdfT04oIXRpbWVyKTsKKyAgICBfYmNtb3NfdGltZXJfc3RvcCh0aW1lcik7Cit9CisKKy8qKiBTZXQgdGltZXIgaGFuZGxlciAqLworYmNtb3NfZXJybm8gYmNtb3NfdGltZXJfaGFuZGxlcl9zZXQoYmNtb3NfdGltZXIgKnRpbWVyLCBGX2JjbW9zX3RpbWVyX2hhbmRsZXIgaGFuZGxlciwgbG9uZyBkYXRhKQoreworICAgIEJVR19PTighdGltZXIpOworICAgIEJVR19PTighaGFuZGxlcik7CisgICAgdGltZXItPnBhcm0uaGFuZGxlciA9IGhhbmRsZXI7CisgICAgdGltZXItPnBhcm0uZGF0YSA9IGRhdGE7CisgICAgaWYgKHRpbWVyLT5wYXJtLm93bmVyID09IEJDTU9TX01PRFVMRV9JRF9OT05FKQorICAgICAgICB0aW1lci0+aGFuZGxlciA9IGhhbmRsZXI7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qCisgKiBCbG9jayBtZW1vcnkgcG9vbAorICovCisKKy8qIE1lbW9yeSBibG9jayBzdHJ1Y3R1cmU6CisgKiAtIGJjbW9zX21lbWJsaworICogLSBibGtfc2l6ZSBieXRlcyBvZiB1c2VyIGRhdGEKKyAqIC0gW21hZ2ljIC0gZm9yIGJsb2NrIG92ZXJmbG93LWNvcnJ1cHRpb24gY2hlY2tdCisgKiAtIFtwYWRkaW5nIHRvIGFsaWduIHRvIHBvaW50ZXIgc2l6ZV0KKyAqLworCitzdHJ1Y3QgYmNtb3NfbWVtYmxrCit7CisgICAgU1RBSUxRX0VOVFJZKGJjbW9zX21lbWJsaykgbmV4dDsgLyoqPCBOZXh0IGJsb2NrIHBvaW50ZXIgKi8KKyAgICBiY21vc19ibGtfcG9vbCAqcG9vbDsgICAgICAgLyoqIHBvb2wgdGhhdCBvd25zIHRoZSBibG9jayAqLworI2lmZGVmIEJDTU9TX01FTV9ERUJVRworICAgIHVpbnQzMl90IG1hZ2ljOyAgICAgICAgICAgICAvKiogbWFnaWMgbnVtYmVyICovCisjZGVmaW5lIEJDTU9TX01FTV9NQUdJQ19BTExPQyAgICgoJ20nPDwyNCkgfCAoJ2InIDw8IDE2KSB8ICgnbCcgPDwgOCkgfCAnaycpCisjZGVmaW5lIEJDTU9TX01FTV9NQUdJQ19GUkVFICAgICgoJ20nPDwyNCkgfCAoJ2InIDw8IDE2KSB8ICgnbCcgPDwgOCkgfCAnficpCisjZGVmaW5lIEJDTU9TX01FTV9NQUdJQ19TVUZGSVggICgoJ20nPDwyNCkgfCAoJ2InIDw8IDE2KSB8ICgnbCcgPDwgOCkgfCAncycpCisgICAgdWludDMyX3QgbGluZW5vOyAgICAgICAgICAgIC8qKiBsaW5lIG51bWJlciB3aGVyZSB0aGUgYmxvY2sgd2FzIGFsbG9jYXRlZC9yZWxlYXNlZC4gRkZVICovCisjZW5kaWYKK307CisKKy8qIENyZWF0ZSBieXRlIG1lbW9yeSBwb29sICovCitiY21vc19lcnJubyBiY21vc19ibGtfcG9vbF9jcmVhdGUoYmNtb3NfYmxrX3Bvb2wgKnBvb2wsIGNvbnN0IGJjbW9zX2Jsa19wb29sX3Bhcm0gKnBhcm0pCit7CisgICAgdWludDMyX3QgYmxrX3NpemU7CisKKyAgICBpZiAoIXBvb2wgfHwgIXBhcm0gfHwgIXBhcm0tPmJsa19zaXplKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfUEFSTSwgInBvb2wgJXAsIHBhcm0gJXAsIGJsa19zaXplPSV1LCBudW1fYmxrcz0ldVxuIiwKKyAgICAgICAgICAgIHBvb2wsIHBhcm0sIHBhcm0gPyBwYXJtLT5ibGtfc2l6ZSA6IDAsIHBhcm0gPyBwYXJtLT5udW1fYmxrcyA6IDApOworICAgIH0KKyAgICBpZiAocGFybS0+bnVtX2Jsa3MgJiBwYXJtLT5wb29sX3NpemUpCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9QQVJNLCAiT25lIGFuZCBvbmx5IG9uZSBvZiBudW1fYmxrcyAoJXUpIGFuZCBwb29sX3NpemUgKCV1KSBtdXN0IGJlIHNldFxuIiwKKyAgICAgICAgICAgIHBhcm0tPm51bV9ibGtzLCBwYXJtLT5wb29sX3NpemUpOworICAgIH0KKyAgICBpZiAocGFybS0+bnVtX2Jsa3MgJiYgcGFybS0+c3RhcnQgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX1BBUk0sICJudW1fYmxrcyE9MCBjYW4ndCBiZSB1c2VkIHdpdGggc3RhcnQhPU5VTEwuIFVzZSBieXRlIHNpemUgaW5zdGVhZFxuIik7CisgICAgfQorCisgICAgQkNNX01FTVpFUk9fU1RSVUNUKHBvb2wpOworICAgIHBvb2wtPnBhcm0gPSAqcGFybTsKKworICAgIC8qIENvcHkgbmFtZSB0byBtYWtlIHN1cmUgdGhhdCBpdCBpcyBub3QgcmVsZWFzZWQgLSBpbiBjYXNlIGl0IHdhcyBvbiB0aGUgc3RhY2sgKi8KKyAgICBpZiAocG9vbC0+cGFybS5uYW1lKQorICAgIHsKKyAgICAgICAgc3RybmNweShwb29sLT5uYW1lLCBwb29sLT5wYXJtLm5hbWUsIHNpemVvZihwb29sLT5uYW1lKSAtIDEpOworICAgICAgICBwb29sLT5wYXJtLm5hbWUgPSBwb29sLT5uYW1lOworICAgIH0KKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIHRvdGFsIGJsb2NrIHNpemUgaW4gYnl0ZXMsIGluY2x1ZGluZyBvdmVyaGVhZHMKKyAgICAgKi8KKyAgICAvKiBSb3VuZCB1cCBibG9jayBzaXplIHRvIHRoZSBuZWFyZXN0IDMyLWJpdCB3b3JkIHRvIG1ha2UgTUFHSUMgY2hlY2sgY2hlYXBlci4KKyAgICAgKiBJdCBkb2Vzbid0IGFmZmVjdCB0aGUgYWN0dWFsIG92ZXJoZWFkIHNpemUgYmVjYXVzZSBvZiB0aGUgZmluYWwKKyAgICAgKiByb3VuZGluZyB1cCB0byBwb2ludGVyIHNpemUuCisgICAgICovCisgICAgcG9vbC0+cGFybS5ibGtfc2l6ZSA9IEJDTU9TX1JPVU5EX1VQKHBvb2wtPnBhcm0uYmxrX3NpemUsIHNpemVvZih1aW50MzJfdCkpOworICAgIGJsa19zaXplID0gcG9vbC0+cGFybS5ibGtfc2l6ZSArIHNpemVvZihiY21vc19tZW1ibGspOworI2lmZGVmIEJDTU9TX01FTV9ERUJVRworICAgIGJsa19zaXplICs9IHNpemVvZih1aW50MzJfdCk7IC8qIHJvb20gZm9yIG1hZ2ljIGFmdGVyIHVzZXIgZGF0YSBibG9jayAqLworI2VuZGlmCisgICAgYmxrX3NpemUgPSBCQ01PU19ST1VORF9VUChibGtfc2l6ZSwgc2l6ZW9mKHZvaWQgKikpOworCisgICAgLyogRGVyaXZlIG51bV9ibGtzIC8gcG9vbF9zaXplIGZyb20gb25lIGFub3RoZXIgKi8KKyAgICBpZiAocG9vbC0+cGFybS5udW1fYmxrcykKKyAgICB7CisgICAgICAgIHBvb2wtPnBhcm0ucG9vbF9zaXplID0gcGFybS0+bnVtX2Jsa3MgKiBibGtfc2l6ZTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcG9vbC0+cGFybS5udW1fYmxrcyA9IHBvb2wtPnBhcm0ucG9vbF9zaXplIC8gYmxrX3NpemU7CisgICAgICAgIGlmICghcG9vbC0+cGFybS5udW1fYmxrcykKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfUEFSTSwgInBvb2xfc2l6ZSAoJXUpIGlzIHRvbyBzbWFsbFxuIiwgcGFybS0+cG9vbF9zaXplKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHBvb2wgaWYgInN0YXJ0IiBpcyBub3Qgc2V0ICovCisgICAgcG9vbC0+c3RhcnQgPSBwb29sLT5wYXJtLnN0YXJ0OworICAgIGlmICghcG9vbC0+c3RhcnQpCisgICAgeworICAgICAgICBwb29sLT5zdGFydCA9IGJjbW9zX2FsbG9jKHBvb2wtPnBhcm0ucG9vbF9zaXplKTsKKyAgICAgICAgaWYgKCFwb29sLT5zdGFydCkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfTk9NRU0sICJDYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGJsb2NrIHBvb2wgJXNcbiIsIHBhcm0tPm5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgYmNtb3NfZmFzdGxvY2tfaW5pdCgmcG9vbC0+bG9jaywgcGFybS0+ZmxhZ3MpOworCisgICAgLyogUHV0IGFsbCBibG9ja3Mgb24gZnJlZSBsaXN0ICovCisgICAgYmNtb3NfYmxrX3Bvb2xfcmVzZXQocG9vbCk7CisKKyAgICBwb29sLT5tYWdpYyA9IEJDTU9TX0JMS19QT09MX1ZBTElEOworICAgIGlmICghKHBvb2wtPnBhcm0uZmxhZ3MgJiBCQ01PU19CTEtfUE9PTF9GTEFHX01TR19QT09MKSkKKyAgICB7CisgICAgICAgIGJjbW9zX211dGV4X2xvY2soJmJjbW9zX3Jlc19sb2NrKTsKKyAgICAgICAgU1RBSUxRX0lOU0VSVF9UQUlMKCZibGtfcG9vbF9saXN0LCBwb29sLCBsaXN0KTsKKyAgICAgICAgYmNtb3NfdG90YWxfYmxrX3Bvb2xfc2l6ZSArPSBwb29sLT5wYXJtLnBvb2xfc2l6ZTsKKyAgICAgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZiY21vc19yZXNfbG9jayk7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIERlc3Ryb3kgbWVtb3J5IHBvb2wgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX2Jsa19wb29sX2Rlc3Ryb3koYmNtb3NfYmxrX3Bvb2wgKnBvb2wpCit7CisgICAgaWYgKCFwb29sIHx8IHBvb2wtPm1hZ2ljICE9IEJDTU9TX0JMS19QT09MX1ZBTElEKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfUEFSTSwgInBvb2wgaGFuZGxlIGlzIGludmFsaWRcbiIpOworICAgIH0KKyAgICBpZiAocG9vbC0+c3RhdC5mcmVlIDwgcG9vbC0+cGFybS5udW1fYmxrcykKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX1NUQVRFLCAiJWkgYmxvY2tzIGFyZSBzdGlsbCBhbGxvY2F0ZWQgZnJvbSB0aGUgcG9vbCAlc1xuIiwKKyAgICAgICAgICAgIHBvb2wtPnBhcm0ubnVtX2Jsa3MgLSBwb29sLT5zdGF0LmZyZWUsIHBvb2wtPnBhcm0ubmFtZSk7CisgICAgfQorICAgIGlmICghKHBvb2wtPnBhcm0uZmxhZ3MgJiBCQ01PU19CTEtfUE9PTF9GTEFHX01TR19QT09MKSkKKyAgICB7CisgICAgICAgIGJjbW9zX211dGV4X2xvY2soJmJjbW9zX3Jlc19sb2NrKTsKKyAgICAgICAgU1RBSUxRX1JFTU9WRSgmYmxrX3Bvb2xfbGlzdCwgcG9vbCwgYmNtb3NfYmxrX3Bvb2wsIGxpc3QpOworICAgICAgICBiY21vc190b3RhbF9ibGtfcG9vbF9zaXplIC09IHBvb2wtPnBhcm0ucG9vbF9zaXplOworICAgICAgICBiY21vc19tdXRleF91bmxvY2soJmJjbW9zX3Jlc19sb2NrKTsKKyAgICB9CisgICAgaWYgKCFwb29sLT5wYXJtLnN0YXJ0ICYmIHBvb2wtPnN0YXJ0KQorICAgIHsKKyAgICAgICAgYmNtb3NfZnJlZShwb29sLT5zdGFydCk7CisgICAgfQorICAgIHBvb2wtPm1hZ2ljID0gQkNNT1NfQkxLX1BPT0xfREVMRVRFRDsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqIFJlbGVhc2UgYWxsIGJsb2NrcyBpbiBtZW1vcnkgcG9vbCAuIEJsb2NrIGNvbnRlbnQgaXMgbm90IGFmZmVjdGVkICovCit2b2lkIGJjbW9zX2Jsa19wb29sX3Jlc2V0KGJjbW9zX2Jsa19wb29sICpwb29sKQoreworICAgIHVpbnQzMl90IGJsa19zaXplOworICAgIGJjbW9zX21lbWJsayAqYmxrOworICAgIHVpbnQzMl90IGk7CisKKyAgICBTVEFJTFFfSU5JVCgmcG9vbC0+ZnJlZV9saXN0KTsKKworICAgIGJsa19zaXplID0gcG9vbC0+cGFybS5ibGtfc2l6ZSArIHNpemVvZihiY21vc19tZW1ibGspOworI2lmZGVmIEJDTU9TX01FTV9ERUJVRworICAgIGJsa19zaXplICs9IHNpemVvZih1aW50MzJfdCk7IC8qIHJvb20gZm9yIG1hZ2ljIGFmdGVyIHVzZXIgZGF0YSBibG9jayAqLworI2VuZGlmCisgICAgYmxrX3NpemUgPSBCQ01PU19ST1VORF9VUChibGtfc2l6ZSwgc2l6ZW9mKHZvaWQgKikpOworCisgICAgLyogUHV0IGFsbCBibG9ja3Mgb24gZnJlZSBsaXN0ICovCisgICAgYmxrID0gKGJjbW9zX21lbWJsayAqKXBvb2wtPnN0YXJ0OworICAgIGZvciAoaSA9IDA7IGkgPCBwb29sLT5wYXJtLm51bV9ibGtzOyBpKyspCisgICAgeworICAgICAgICBibGstPnBvb2wgPSBwb29sOworICAgICAgICBTVEFJTFFfSU5TRVJUX1RBSUwoJnBvb2wtPmZyZWVfbGlzdCwgYmxrLCBuZXh0KTsKKyNpZmRlZiBCQ01PU19NRU1fREVCVUcKKyAgICAgICAgKih1aW50MzJfdCopKChsb25nKWJsayArIHNpemVvZihiY21vc19tZW1ibGspICsgcG9vbC0+cGFybS5ibGtfc2l6ZSkgPSBCQ01PU19NRU1fTUFHSUNfU1VGRklYOworICAgICAgICBibGstPmxpbmVubyA9IDA7CisgICAgICAgIGJsay0+bWFnaWMgPSBCQ01PU19NRU1fTUFHSUNfRlJFRTsKKyNlbmRpZgorICAgICAgICBibGsgPSAoYmNtb3NfbWVtYmxrICopKChsb25nKWJsayArIGJsa19zaXplKTsKKyAgICB9CisKKyAgICAvKiBJbml0IHN0YXRpc3RpY3MgKi8KKyAgICBtZW1zZXQoJnBvb2wtPnN0YXQsIDAsIHNpemVvZihwb29sLT5zdGF0KSk7CisgICAgcG9vbC0+c3RhdC5mcmVlID0gcG9vbC0+cGFybS5udW1fYmxrczsKK30KKworLyogQWxsb2NhdGUgYmxvY2sgZnJvbSBibG9jayBtZW1vcnkgcG9vbCAqLwordm9pZCAqYmNtb3NfYmxrX3Bvb2xfYWxsb2MoYmNtb3NfYmxrX3Bvb2wgKnBvb2wpCit7CisgICAgYmNtb3NfbWVtYmxrICpibGs7CisgICAgbG9uZyBmbGFnczsKKworI2lmZGVmIEJDTU9TX01FTV9ERUJVRworICAgIEJVR19PTighcG9vbCk7CisgICAgQlVHX09OKHBvb2wtPm1hZ2ljICE9IEJDTU9TX0JMS19QT09MX1ZBTElEKTsKKyNlbmRpZgorICAgIGZsYWdzID0gYmNtb3NfZmFzdGxvY2tfbG9jaygmcG9vbC0+bG9jayk7CisgICAgYmxrID0gU1RBSUxRX0ZJUlNUKCZwb29sLT5mcmVlX2xpc3QpOworICAgIGlmIChibGspCisgICAgeworICAgICAgICBTVEFJTFFfUkVNT1ZFX0hFQUQoJnBvb2wtPmZyZWVfbGlzdCwgbmV4dCk7CisgICAgICAgICsrcG9vbC0+c3RhdC5hbGxvY2F0ZWQ7CisjaWZkZWYgQkNNT1NfTUVNX0RFQlVHCisgICAgICAgIGJsay0+bWFnaWMgPSBCQ01PU19NRU1fTUFHSUNfQUxMT0M7CisjZW5kaWYKKyAgICAgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZwb29sLT5sb2NrLCBmbGFncyk7CisgICAgICAgIHJldHVybiAodm9pZCAqKShibGsgKyAxKTsKKyAgICB9CisKKyAgICAvKiBObyBtZW1vcnkgKi8KKyAgICArK3Bvb2wtPnN0YXQuYWxsb2NfZmFpbGVkOworICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmcG9vbC0+bG9jaywgZmxhZ3MpOworICAgIHJldHVybiBOVUxMOworfQorCisvKiBBbGxvY2F0ZSBibG9jayBmcm9tIGJsb2NrIG1lbW9yeSBwb29sIGFuZCB6ZXJvIHRoZSBibG9jayAqLwordm9pZCAqYmNtb3NfYmxrX3Bvb2xfY2FsbG9jKGJjbW9zX2Jsa19wb29sICpwb29sKQoreworICAgIHZvaWQgKnB0ciA9IGJjbW9zX2Jsa19wb29sX2FsbG9jKHBvb2wpOworICAgIGlmIChwdHIpCisgICAgeworICAgICAgICBtZW1zZXQocHRyLCAwLCBwb29sLT5wYXJtLmJsa19zaXplKTsKKyAgICB9CisgICAgcmV0dXJuIHB0cjsKK30KKworLyogUmVsZWFzZSBtZW1vcnkgYWxsb2NhdGVkIHVzaW5nIGJjbW9zX3Bvb2xfYnl0ZV9hbGxvYygpIG9yIGJjbW9zX3Bvb2xfYmxrX2FsbG9jKCkgKi8KK3ZvaWQgYmNtb3NfYmxrX3Bvb2xfZnJlZSh2b2lkICpwdHIpCit7CisgICAgYmNtb3NfbWVtYmxrICpibGs7CisgICAgYmNtb3NfYmxrX3Bvb2wgKnBvb2w7CisgICAgbG9uZyBmbGFnczsKKworICAgIGJsayA9IChiY21vc19tZW1ibGsgKikoKGxvbmcpcHRyIC0gc2l6ZW9mKGJjbW9zX21lbWJsaykpOworICAgIHBvb2wgPSBibGstPnBvb2w7CisjaWZkZWYgQkNNT1NfTUVNX0RFQlVHCisgICAgQlVHX09OKGJsay0+bWFnaWMgIT0gQkNNT1NfTUVNX01BR0lDX0FMTE9DKTsKKyAgICBCVUdfT04ocG9vbCA9PSBOVUxMKTsKKyAgICBCVUdfT04ocG9vbC0+bWFnaWMgIT0gQkNNT1NfQkxLX1BPT0xfVkFMSUQpOworICAgIEJVR19PTigqKHVpbnQzMl90ICopKChsb25nKXB0ciArIHBvb2wtPnBhcm0uYmxrX3NpemUpICE9IEJDTU9TX01FTV9NQUdJQ19TVUZGSVgpOworICAgIGJsay0+bWFnaWMgPSBCQ01PU19NRU1fTUFHSUNfRlJFRTsKKyNlbmRpZgorICAgIGZsYWdzID0gYmNtb3NfZmFzdGxvY2tfbG9jaygmcG9vbC0+bG9jayk7CisgICAgU1RBSUxRX0lOU0VSVF9IRUFEKCZwb29sLT5mcmVlX2xpc3QsIGJsaywgbmV4dCk7CisgICAgKytwb29sLT5zdGF0LnJlbGVhc2VkOworICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmcG9vbC0+bG9jaywgZmxhZ3MpOworfQorCisvKiBHZXQgcG9vbCBpbmZvICovCitiY21vc19lcnJubyBiY21vc19ibGtfcG9vbF9xdWVyeShjb25zdCBiY21vc19ibGtfcG9vbCAqcG9vbCwgYmNtb3NfYmxrX3Bvb2xfaW5mbyAqaW5mbykKK3sKKyAgICBpZiAoIXBvb2wgfHwgIWluZm8pCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKyAgICBpbmZvLT5wYXJtID0gcG9vbC0+cGFybTsKKyAgICBpbmZvLT5zdGF0ID0gcG9vbC0+c3RhdDsKKyAgICBpbmZvLT5zdGF0LmZyZWUgPSBwb29sLT5wYXJtLm51bV9ibGtzIC0gKGluZm8tPnN0YXQuYWxsb2NhdGVkIC0gaW5mby0+c3RhdC5yZWxlYXNlZCk7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIEJsb2NrIHBvb2wgaXRlcmF0b3IgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX2Jsa19wb29sX2dldF9uZXh0KGNvbnN0IGJjbW9zX2Jsa19wb29sICoqcHJldikKK3sKKyAgICBjb25zdCBiY21vc19ibGtfcG9vbCAqcG9vbDsKKworICAgIGlmIChwcmV2ID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKyAgICBwb29sID0gKnByZXY7CisgICAgaWYgKHBvb2wgJiYgcG9vbC0+bWFnaWMgIT0gQkNNT1NfQkxLX1BPT0xfVkFMSUQpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKyAgICBpZiAocG9vbCkKKyAgICB7CisgICAgICAgIHBvb2wgPSBTVEFJTFFfTkVYVChwb29sLCBsaXN0KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcG9vbCA9IFNUQUlMUV9GSVJTVCgmYmxrX3Bvb2xfbGlzdCk7CisgICAgfQorICAgICpwcmV2ID0gcG9vbDsKKyAgICBpZiAoIXBvb2wpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT19NT1JFOworICAgIH0KKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoKKyAqIE1lc3NhZ2UgcG9vbAorICovCisKKy8qIHJlbGVhc2UgbWVzc2FnZSBjYWxsYmFjayAqLworc3RhdGljIHZvaWQgX2JjbW9zX21zZ19wb29sX3JlbGVhc2UoYmNtb3NfbXNnICptc2cpCit7CisgICAgaWYgKG1zZy0+ZGF0YV9yZWxlYXNlKQorICAgICAgICBtc2ctPmRhdGFfcmVsZWFzZShtc2cpOworICAgIGJjbW9zX2Jsa19wb29sX2ZyZWUobXNnKTsKK30KKworLyogQ3JlYXRlIG1lc3NhZ2UgcG9vbCAqLworYmNtb3NfZXJybm8gYmNtb3NfbXNnX3Bvb2xfY3JlYXRlKGJjbW9zX21zZ19wb29sICpwb29sLCBjb25zdCBiY21vc19tc2dfcG9vbF9wYXJtICpwYXJtKQoreworICAgIGJjbW9zX2Jsa19wb29sX3Bhcm0gcG9vbF9wYXJtID0ge307CisgICAgYmNtb3NfbWVtYmxrICpibGs7CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgaWYgKCFwb29sIHx8ICFwYXJtIHx8ICFwYXJtLT5zaXplKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgQkNNX01FTVpFUk9fU1RSVUNUKHBvb2wpOworICAgIHBvb2wtPnBhcm0gPSAqcGFybTsKKyAgICBwb29sX3Bhcm0ubnVtX2Jsa3MgPSBwYXJtLT5zaXplOworICAgIHBvb2xfcGFybS5ibGtfc2l6ZSA9IHBhcm0tPmRhdGFfc2l6ZSArIHNpemVvZihiY21vc19tc2cpOworICAgIHBvb2xfcGFybS5mbGFncyA9IHBhcm0tPmZsYWdzIHwgQkNNT1NfQkxLX1BPT0xfRkxBR19NU0dfUE9PTDsKKyAgICBwb29sX3Bhcm0ubmFtZSA9IHBhcm0tPm5hbWU7CisKKyAgICAvKiBDcmVhdGUgdW5kZXJseWluZyBibG9jayBwb29sICovCisgICAgZXJyID0gYmNtb3NfYmxrX3Bvb2xfY3JlYXRlKCZwb29sLT5ibGtfcG9vbCwgJnBvb2xfcGFybSk7CisgICAgaWYgKGVycikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIHBvb2wtPnBhcm0ubmFtZSA9IHBvb2wtPmJsa19wb29sLm5hbWU7CisKKyAgICAvKiBQcmUtaW5pdGlhbGl6ZSBhbGwgbWVzc2FnZXMgKi8KKyAgICBTVEFJTFFfRk9SRUFDSChibGssICZwb29sLT5ibGtfcG9vbC5mcmVlX2xpc3QsIG5leHQpCisgICAgeworICAgICAgICBiY21vc19tc2cgKm1zZyA9IChiY21vc19tc2cgKikoYmxrICsgMSk7CisgICAgICAgIG1zZy0+ZGF0YSA9ICh2b2lkICopKG1zZyArIDEpOworICAgICAgICBtc2ctPnNpemUgPSBwb29sLT5wYXJtLmRhdGFfc2l6ZTsKKyAgICAgICAgbXNnLT5yZWxlYXNlID0gX2JjbW9zX21zZ19wb29sX3JlbGVhc2U7CisgICAgICAgIG1zZy0+ZGF0YV9yZWxlYXNlID0gcGFybS0+ZGF0YV9yZWxlYXNlOworICAgIH0KKyAgICBiY21vc19tdXRleF9sb2NrKCZiY21vc19yZXNfbG9jayk7CisgICAgU1RBSUxRX0lOU0VSVF9UQUlMKCZtc2dfcG9vbF9saXN0LCAmcG9vbC0+YmxrX3Bvb2wsIGxpc3QpOworICAgIGJjbW9zX3RvdGFsX21zZ19wb29sX3NpemUgKz0gcG9vbC0+YmxrX3Bvb2wucGFybS5wb29sX3NpemU7CisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZiY21vc19yZXNfbG9jayk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqIERlc3Ryb3kgbWVzc2FnZSBwb29sICovCitiY21vc19lcnJubyBiY21vc19tc2dfcG9vbF9kZXN0cm95KGJjbW9zX21zZ19wb29sICpwb29sKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgcmMgPSBiY21vc19ibGtfcG9vbF9kZXN0cm95KCZwb29sLT5ibGtfcG9vbCk7CisgICAgaWYgKHJjKQorICAgICAgICByZXR1cm4gcmM7CisKKyAgICBiY21vc19tdXRleF9sb2NrKCZiY21vc19yZXNfbG9jayk7CisgICAgU1RBSUxRX1JFTU9WRSgmbXNnX3Bvb2xfbGlzdCwgJnBvb2wtPmJsa19wb29sLCBiY21vc19ibGtfcG9vbCwgbGlzdCk7CisgICAgYmNtb3NfdG90YWxfbXNnX3Bvb2xfc2l6ZSAtPSBwb29sLT5ibGtfcG9vbC5wYXJtLnBvb2xfc2l6ZTsKKyAgICBiY21vc19tdXRleF91bmxvY2soJmJjbW9zX3Jlc19sb2NrKTsKKworICAgIHBvb2wtPnBhcm0uc2l6ZSA9IHBvb2wtPnBhcm0uZGF0YV9zaXplID0gMDsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogQWxsb2NhdGUgbWVzc2FnZSBmcm9tIHBvb2wgKi8KK2JjbW9zX21zZyAqYmNtb3NfbXNnX3Bvb2xfYWxsb2MoYmNtb3NfbXNnX3Bvb2wgKnBvb2wpCit7CisgICAgcmV0dXJuIGJjbW9zX2Jsa19wb29sX2FsbG9jKCZwb29sLT5ibGtfcG9vbCk7Cit9CisKKy8qIEdldCBwb29sIGluZm8gKi8KK2JjbW9zX2Vycm5vIGJjbW9zX21zZ19wb29sX3F1ZXJ5KGNvbnN0IGJjbW9zX21zZ19wb29sICpwb29sLCBiY21vc19tc2dfcG9vbF9pbmZvICppbmZvKQoreworICAgIGJjbW9zX2Jsa19wb29sX2luZm8gcG9vbF9pbmZvOworICAgIGJjbW9zX2Vycm5vIGVycjsKKworICAgIGlmICghcG9vbCB8fCAhaW5mbykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorICAgIGVyciA9IGJjbW9zX2Jsa19wb29sX3F1ZXJ5KCZwb29sLT5ibGtfcG9vbCwgJnBvb2xfaW5mbyk7CisgICAgaWYgKGVycikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIGluZm8tPnBhcm0gPSBwb29sLT5wYXJtOworICAgIGluZm8tPnN0YXQgPSBwb29sX2luZm8uc3RhdDsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogQmxvY2sgcG9vbCBpdGVyYXRvciAqLworYmNtb3NfZXJybm8gYmNtb3NfbXNnX3Bvb2xfZ2V0X25leHQoY29uc3QgYmNtb3NfbXNnX3Bvb2wgKipwcmV2KQoreworICAgIGNvbnN0IGJjbW9zX21zZ19wb29sICpwb29sOworCisgICAgaWYgKHByZXYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorICAgIHBvb2wgPSAqcHJldjsKKyAgICBpZiAocG9vbCAmJiBwb29sLT5ibGtfcG9vbC5tYWdpYyAhPSBCQ01PU19CTEtfUE9PTF9WQUxJRCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorICAgIGlmIChwb29sKQorICAgIHsKKyAgICAgICAgcG9vbCA9IGNvbnRhaW5lcl9vZihTVEFJTFFfTkVYVCgmcG9vbC0+YmxrX3Bvb2wsIGxpc3QpLCBiY21vc19tc2dfcG9vbCwgYmxrX3Bvb2wpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwb29sID0gY29udGFpbmVyX29mKFNUQUlMUV9GSVJTVCgmbXNnX3Bvb2xfbGlzdCksIGJjbW9zX21zZ19wb29sLCBibGtfcG9vbCk7CisgICAgfQorICAgICpwcmV2ID0gcG9vbDsKKyAgICBpZiAoIXBvb2wpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT19NT1JFOworICAgIH0KKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqIFNldCB1cCBwcmludCByZWRpcmVjdGlvbi9jbG9uaW5nCisgKiBccGFyYW1baW5dICAgbW9kZSAgICByZWRpcmVjdGlvbi9jbG9uaW5nIG1vZGUKKyAqIFxwYXJhbVtpbl0gICBjYiAgICAgIHJlZGlyZWN0aW9uIGNhbGxiYWNrCisgKiBccGFyYW1baW5dICAgZGF0YSAgICBvcGFxdWUgZGF0YSB0byBiZSBwYXNzZWQgdG8gY2IKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfcHJpbnRfcmVkaXJlY3QoYmNtb3NfcHJpbnRfcmVkaXJlY3RfbW9kZSBtb2RlLCBiY21vc19wcmludF9yZWRpcmVjdF9jYiBjYiwgdm9pZCAqZGF0YSkKK3sKKyAgICBpZiAobW9kZSAhPSBCQ01PU19QUklOVF9SRURJUkVDVF9NT0RFX05PTkUgJiYgY2IgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX1BBUk0sICJSZWRpcmVjdGlvbiBjYWxsYmFjayBtdXN0IGJlIHNldFxuIik7CisgICAgfQorICAgIHByaW50X3JlZGlyZWN0X21vZGUgPSBtb2RlOworICAgIGlmIChtb2RlID09IEJDTU9TX1BSSU5UX1JFRElSRUNUX01PREVfTk9ORSkKKyAgICB7CisgICAgICAgIHByaW50X3JlZGlyZWN0X2NiID0gTlVMTDsKKyAgICAgICAgcHJpbnRfcmVkaXJlY3RfY2JfZGF0YSA9IE5VTEw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHByaW50X3JlZGlyZWN0X2NiID0gY2I7CisgICAgICAgIHByaW50X3JlZGlyZWN0X2NiX2RhdGEgPSBkYXRhOworICAgIH0KKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogUHJpbnQgb24gdGhlIGNvbnNvbGUgd2l0aCBvcHRpb25hbCBjbG9uaW5nIC8gcmVkaXJlY3Rpb24gKi8KKy8qbGludCAtZXs0NTR9Ki8KK2ludCBiY21vc192cHJpbnRmKGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCkKK3sKKyAgICBpbnQgcmMgPSAwOworICAgIGJjbW9zX2Jvb2wgcHJvdGVjdGVkX3NlY3Rpb24gPSBpc19pcnFfbW9kZSgpIHx8IGlzX2lycV9kaXNhYmxlZCgpOworCisgICAgLyogT25seSBwcm90ZWN0IGlmIGluIHRhc2sgY29udGV4dCAqLworICAgIGlmICghcHJvdGVjdGVkX3NlY3Rpb24pCisgICAgeworICAgICAgICBiY21vc19tdXRleF9sb2NrKCZiY21vc19wcmludF9sb2NrKTsKKyAgICB9CisgICAgaWYgKHByaW50X3JlZGlyZWN0X21vZGUgIT0gQkNNT1NfUFJJTlRfUkVESVJFQ1RfTU9ERV9SRURJUkVDVCkKKyAgICB7CisgICAgICAgIHJjID0gYmNtb3Nfc3lzX3ZwcmludGYoZm9ybWF0LCBhcCk7CisgICAgfQorICAgIGlmIChwcmludF9yZWRpcmVjdF9tb2RlICE9IEJDTU9TX1BSSU5UX1JFRElSRUNUX01PREVfTk9ORSkKKyAgICB7CisgICAgICAgIHJjID0gcHJpbnRfcmVkaXJlY3RfY2IocHJpbnRfcmVkaXJlY3RfY2JfZGF0YSwgZm9ybWF0LCBhcCk7CisgICAgfQorICAgIGlmICghcHJvdGVjdGVkX3NlY3Rpb24pCisgICAgeworICAgICAgICBiY21vc19tdXRleF91bmxvY2soJmJjbW9zX3ByaW50X2xvY2spOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKy8qbGludCAtZXs0NTR9Ki8KKworLyogUHJpbnQgb24gdGhlIGNvbnNvbGUgd2l0aCBvcHRpb25hbCBjbG9uaW5nIC8gcmVkaXJlY3Rpb24gKi8KK2ludCBiY21vc19wcmludGYoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgICAgdmFfbGlzdCBhcmdzOworICAgIGludCByYzsKKworICAgIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisgICAgcmMgPSBiY21vc192cHJpbnRmKGZvcm1hdCwgYXJncyk7CisgICAgdmFfZW5kKGFyZ3MpOworICAgIHJldHVybiByYzsKK30KKworI2lmbmRlZiBCQ01PU19QVVRDSEFSX0lOTElORQorLypsaW50IC1lezQ1NH0qLwordm9pZCBiY21vc19wdXRjaGFyKGludCBjKQoreworICAgIGJjbW9zX2Jvb2wgcHJvdGVjdGVkX3NlY3Rpb24gPSBpc19pcnFfbW9kZSgpIHx8IGlzX2lycV9kaXNhYmxlZCgpOworCisgICAgLyogT25seSBwcm90ZWN0IGlmIGluIHRhc2sgY29udGV4dCAqLworICAgIGlmICghcHJvdGVjdGVkX3NlY3Rpb24pCisgICAgeworICAgICAgICBiY21vc19tdXRleF9sb2NrKCZiY21vc19wcmludF9sb2NrKTsKKyAgICB9CisgICAgcHV0Y2hhcihjKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICBpZiAoIXByb3RlY3RlZF9zZWN0aW9uKQorICAgIHsKKyAgICAgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZiY21vc19wcmludF9sb2NrKTsKKyAgICB9Cit9CisvKmxpbnQgK2V7NDU0fSovCisjZW5kaWYKKworI2lmbmRlZiBCQ01PU19CVUZfT1NfU1BFQ0lGSUMKKworLyoKKyAqIEJ1ZmZlciBhbGxvY2F0aW9uL3JlbGVhc2UKKyAqLworCisjaWZkZWYgQkNNT1NfQlVGX1BPT0xfU0laRQorLyoqIENyZWF0ZSBidWZmZXIgcG9vbAorICogXHBhcmFtW2luXSAgIG51bSAgICAgTnVtYmVyIG9mIGJ1ZmZlcnMKKyAqIFxwYXJhbVtpbl0gICBzaXplICAgIEJ1ZmZlciBzaXplCisgKiBccGFyYW1baW5dICAgYWxpZ24gICBCdWZmZXIgYWxpZ25tZW50CisgKiBccmV0dXJucyBvPU9LIG9yIGVycm9yIDwwCisgKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vc19idWZfcG9vbF9jcmVhdGUodm9pZCkKK3sKKyAgICBiY21vc19ibGtfcG9vbF9wYXJtIHBvb2xfcGFybSA9CisgICAgeworICAgICAgICAubmFtZSA9ICJzeXNidWYiCisgICAgfTsKKyAgICBiY21vc19lcnJubyByYzsKKworI2lmbmRlZiBCQ01PU19CVUZfUE9PTF9CVUZfU0laRQorI2Vycm9yIEJDTU9TX0JVRl9QT09MX0JVRl9TSVpFIG11c3QgYmUgZGVmaW5lZAorI2VuZGlmCisKKyAgICAvKiBJZiBidWZmZXIgbWVtb3J5IHNob3VsZCBiZSBhbGxvY2F0ZWQgYnkgYmNtb3NfZG1hX2FsbG9jIC0gYWxsb2NhdGUKKyAgICAgKiBtZW1vcnkgZm9yIHRoZSB3aG9sZSBwb29sIGhlcmUgKi8KKyAgICBwb29sX3Bhcm0uYmxrX3NpemUgPSBCQ01PU19CVUZfUE9PTF9CVUZfU0laRSArIHNpemVvZihiY21vc19idWYpICsgQkNNVFJfQlVGX0VYVFJBX0hFQURST09NICsKKyAgICAgICAgMipCQ01PU19CVUZfREFUQV9BTElHTk1FTlQgKyBCQ01PU19CVUZfREFUQV9HVUFSRDsKKworI2lmZGVmIEJDTU9TX0JVRl9JTl9ETUFfTUVNCisgICAgcG9vbF9wYXJtLnBvb2xfc2l6ZSA9IChwb29sX3Bhcm0uYmxrX3NpemUgKyBzaXplb2YoYmNtb3NfbWVtYmxrKSkgKiBCQ01PU19CVUZfUE9PTF9TSVpFOworICAgIHBvb2xfcGFybS5zdGFydCA9IGJjbW9zX2RtYV9hbGxvYygwLCBwb29sX3Bhcm0ucG9vbF9zaXplKTsKKyAgICBpZiAoIXBvb2xfcGFybS5zdGFydCkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisjZWxzZQorICAgIHBvb2xfcGFybS5udW1fYmxrcyA9IEJDTU9TX0JVRl9QT09MX1NJWkU7CisjZW5kaWYKKworICAgIHJjID0gYmNtb3NfYmxrX3Bvb2xfY3JlYXRlKCZzeXNfYnVmX3Bvb2wsICZwb29sX3Bhcm0pOworICAgIGlmIChyYykKKyAgICB7CisgICAgICAgIGlmIChwb29sX3Bhcm0uc3RhcnQpCisgICAgICAgICAgICBiY21vc19kbWFfZnJlZSgwLCBwb29sX3Bhcm0uc3RhcnQpOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKyNlbmRpZgorCisvKiBBbGxvY2F0ZSBidWZmZXIgKi8KK2JjbW9zX2J1ZiAqYmNtb3NfYnVmX2FsbG9jKHVpbnQzMl90IHNpemUpCit7CisgICAgLyogQWxsb2NhdGUgZXh0cmEgMiAqIEJDTU9TX0JVRl9EQVRBX0FMSUdOTUVOVCB0byBtYWtlIHN1cmUgdGhhdCBuZWl0aGVyIGRhdGEgc3RhcnQgbm9yIGVuZAorICAgICAqIGVuZCB1cCBpbiB0aGUgbWlkZGxlIG9mIGNhY2hlIGxpbmUKKyAgICAgKi8KKyAgICBiY21vc19idWYgKmJ1ZjsKKworLyogQWxsb2NhdGUgZnJvbSB0aGUgcG9vbCAgKi8KKyNpZmRlZiBCQ01PU19CVUZfUE9PTF9TSVpFCisKKyAgICBpZiAoc2l6ZSA+IEJDTU9TX0JVRl9QT09MX0JVRl9TSVpFKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJBdHRlbXB0IHRvIGFsbG9jYXRlIGJ1ZmZlciBiaWdnZXIgdGhhbiBidWZmZXIgcG9vbCBibG9jayBzaXplLiAldSA+ICV1XG4iLAorICAgICAgICAgICAgc2l6ZSwgQkNNT1NfQlVGX1BPT0xfQlVGX1NJWkUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgYnVmID0gYmNtb3NfYmxrX3Bvb2xfYWxsb2MoJnN5c19idWZfcG9vbCk7CisKKyNlbHNlIC8qIGVsc2Ugb2YgI2lmIEJDTU9TX0JVRl9QT09MX1NJWkUgKi8KKyAgICB7CisgICAgICAgIHVpbnQzMl90IGFsbG9jX3NpemUgPSBzaXplb2YoYmNtb3NfYnVmKSArIHNpemUgKyBCQ01UUl9CVUZfRVhUUkFfSEVBRFJPT00gKworICAgICAgICAgICAgMipCQ01PU19CVUZfREFUQV9BTElHTk1FTlQgLSAxICsgQkNNT1NfQlVGX0RBVEFfR1VBUkQ7CisjaWZkZWYgQkNNT1NfQlVGX0RBVEFfVU5JVF9TSVpFCisjaWYgQkNNT1NfQlVGX0RBVEFfVU5JVF9TSVpFICYgKEJDTU9TX0JVRl9EQVRBX1VOSVRfU0laRSAtIDEpCisjZXJyb3IgQkNNT1NfQlVGX0RBVEFfVU5JVF9TSVpFIG11c3QgYmUgYSBwb3dlciBvZiAyCisjZW5kaWYKKyAgICAgICAgYWxsb2Nfc2l6ZSA9IEJDTU9TX1JPVU5EX1VQKGFsbG9jX3NpemUsIEJDTU9TX0JVRl9EQVRBX1VOSVRfU0laRSk7CisjZW5kaWYKKyNpZmRlZiBCQ01PU19CVUZfSU5fRE1BX01FTQorICAgICAgICBidWYgPSBiY21vc19kbWFfYWxsb2MoMCwgYWxsb2Nfc2l6ZSk7CisjZWxzZQorICAgICAgICBidWYgPSBiY21vc19hbGxvYyhhbGxvY19zaXplKTsKKyNlbmRpZgorICAgIH0KKyNlbmRpZiAvKiBlbmQgb2YgI2lmIEJDTU9TX0JVRl9QT09MX1NJWkUgKi8KKworICAgIGlmICghYnVmKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBidWYtPnN0YXJ0ID0gKHVpbnQ4X3QgKikoYnVmICsgMSkgKyBCQ01PU19CVUZfREFUQV9HVUFSRDsKKyAgICBidWYtPmRhdGEgPSAodWludDhfdCAqKShCQ01PU19ST1VORF9VUCgobG9uZylidWYtPnN0YXJ0ICsgQkNNVFJfQlVGX0VYVFJBX0hFQURST09NLCBCQ01PU19CVUZfREFUQV9BTElHTk1FTlQpKTsKKyAgICBidWYtPnNpemUgPSBzaXplICsgKGJ1Zi0+ZGF0YSAtIGJ1Zi0+c3RhcnQpOworICAgIGJ1Zi0+bGVuID0gMDsKKyNpZmRlZiBCQ01PU19CVUZfUE9PTF9TSVpFCisgICAgYnVmLT5wb29sID0gJnN5c19idWZfcG9vbDsKKyNlbHNlCisgICAgYnVmLT5wb29sID0gTlVMTDsKKyNlbmRpZgorICAgIHJldHVybiBidWY7Cit9CisKKy8qIFJlbGVhc2UgYnVmZmVyICovCit2b2lkIGJjbW9zX2J1Zl9mcmVlKGJjbW9zX2J1ZiAqYnVmKQoreworCisjaWZkZWYgQkNNT1NfQlVGX1BPT0xfU0laRQorICAgIC8qIEJ1ZmZlciBtaWdodCBoYXZlIGJlZW4gYWxsb2NhdGVkIGZyb20gdGhlIHN5c3RlbSBwb29sICovCisgICAgaWYgKGJ1Zi0+cG9vbCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jsa19wb29sX2ZyZWUoYnVmKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorCisjaWZkZWYgQkNNT1NfQlVGX0lOX0RNQV9NRU0KKyAgICBiY21vc19kbWFfZnJlZSgwLCBidWYpOworI2Vsc2UKKyAgICBiY21vc19mcmVlKGJ1Zik7CisjZW5kaWYKK30KKworI2VuZGlmCisKK0VYUE9SVF9TWU1CT0woYmNtb3NfaW5pdCk7CisKK0VYUE9SVF9TWU1CT0woYmNtb3NfbXNnX3F1ZXVlX2NyZWF0ZSk7CitFWFBPUlRfU1lNQk9MKGJjbW9zX21zZ19xdWV1ZV9kZXN0cm95KTsKK0VYUE9SVF9TWU1CT0woYmNtb3NfbXNnX3F1ZXVlX3F1ZXJ5KTsKK0VYUE9SVF9TWU1CT0woYmNtb3NfbXNnX3F1ZXVlX2dldF9uZXh0KTsKK0VYUE9SVF9TWU1CT0woYmNtb3NfbXNnX3NlbmQpOworRVhQT1JUX1NZTUJPTChiY21vc19tc2dfc2VuZF90b19tb2R1bGUpOworRVhQT1JUX1NZTUJPTChiY21vc19tc2dfcmVjdik7CitFWFBPUlRfU1lNQk9MKGJjbW9zX21zZ19yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKGJjbW9zX21zZ191bnJlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0woYmNtb3NfbXNnX2Rpc3BhdGNoKTsKKworRVhQT1JUX1NZTUJPTChiY21vc19tc2dfcWdyb3VwX2NyZWF0ZSk7CitFWFBPUlRfU1lNQk9MKGJjbW9zX21zZ19xZ3JvdXBfZGVzdHJveSk7CitFWFBPUlRfU1lNQk9MKGJjbW9zX21zZ19xZ3JvdXBfcXVlcnkpOworRVhQT1JUX1NZTUJPTChiY21vc19tc2dfcmVjdl9mcm9tX3Fncm91cCk7CitFWFBPUlRfU1lNQk9MKGJjbW9zX21zZ19zZW5kX3RvX3Fncm91cCk7CisKK0VYUE9SVF9TWU1CT0woYmNtb3NfdGFza190aW1lb3V0X3NldCk7CitFWFBPUlRfU1lNQk9MKGJjbW9zX3Rhc2tfZ2V0X25leHQpOworCitFWFBPUlRfU1lNQk9MKGJjbW9zX21vZHVsZV9jcmVhdGUpOworRVhQT1JUX1NZTUJPTChiY21vc19tb2R1bGVfZGVzdHJveSk7CitFWFBPUlRfU1lNQk9MKGJjbW9zX21vZHVsZV9jdXJyZW50KTsKK0VYUE9SVF9TWU1CT0woYmNtb3NfbW9kdWxlX2NvbnRleHQpOworRVhQT1JUX1NZTUJPTChiY21vc19tb2R1bGVfY29udGV4dF9zZXQpOworRVhQT1JUX1NZTUJPTChiY21vc19tb2R1bGVfcXVlcnkpOworCitFWFBPUlRfU1lNQk9MKGJjbW9zX2V2ZW50X2NyZWF0ZSk7CitFWFBPUlRfU1lNQk9MKGJjbW9zX2V2ZW50X2Rlc3Ryb3kpOworRVhQT1JUX1NZTUJPTChiY21vc19ldmVudF9yYWlzZSk7CitFWFBPUlRfU1lNQk9MKGJjbW9zX2V2ZW50X3JlY3YpOworCitFWFBPUlRfU1lNQk9MKGJjbW9zX3RpbWVyX2NyZWF0ZSk7CitFWFBPUlRfU1lNQk9MKGJjbW9zX3RpbWVyX2Rlc3Ryb3kpOworRVhQT1JUX1NZTUJPTChiY21vc190aW1lcl9zdGFydCk7CitFWFBPUlRfU1lNQk9MKGJjbW9zX3RpbWVyX3N0b3ApOworRVhQT1JUX1NZTUJPTChiY21vc190aW1lcl9oYW5kbGVyX3NldCk7CisKK0VYUE9SVF9TWU1CT0woYmNtb3NfYmxrX3Bvb2xfY3JlYXRlKTsKK0VYUE9SVF9TWU1CT0woYmNtb3NfYmxrX3Bvb2xfZGVzdHJveSk7CitFWFBPUlRfU1lNQk9MKGJjbW9zX2Jsa19wb29sX3Jlc2V0KTsKK0VYUE9SVF9TWU1CT0woYmNtb3NfYmxrX3Bvb2xfYWxsb2MpOworRVhQT1JUX1NZTUJPTChiY21vc19ibGtfcG9vbF9jYWxsb2MpOworRVhQT1JUX1NZTUJPTChiY21vc19ibGtfcG9vbF9mcmVlKTsKK0VYUE9SVF9TWU1CT0woYmNtb3NfYmxrX3Bvb2xfcXVlcnkpOworRVhQT1JUX1NZTUJPTChiY21vc19ibGtfcG9vbF9nZXRfbmV4dCk7CisKK0VYUE9SVF9TWU1CT0woYmNtb3NfbXNnX3Bvb2xfY3JlYXRlKTsKK0VYUE9SVF9TWU1CT0woYmNtb3NfbXNnX3Bvb2xfYWxsb2MpOworRVhQT1JUX1NZTUJPTChiY21vc19tc2dfcG9vbF9xdWVyeSk7CitFWFBPUlRfU1lNQk9MKGJjbW9zX21zZ19wb29sX2Rlc3Ryb3kpOworRVhQT1JUX1NZTUJPTChiY21vc19tc2dfcG9vbF9nZXRfbmV4dCk7CisKK0VYUE9SVF9TWU1CT0woYmNtb3NfcHJpbnRfcmVkaXJlY3QpOworRVhQT1JUX1NZTUJPTChiY21vc19wcmludGYpOworRVhQT1JUX1NZTUJPTChiY21vc192cHJpbnRmKTsKKworI2lmbmRlZiBCQ01PU19CVUZfT1NfU1BFQ0lGSUMKK0VYUE9SVF9TWU1CT0woYmNtb3NfYnVmX2FsbG9jKTsKK0VYUE9SVF9TWU1CT0woYmNtb3NfYnVmX2ZyZWUpOworI2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2JjbW9zX2NvbW1vbi5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9iY21vc19jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTA5YzFjCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9iY21vc19jb21tb24uaApAQCAtMCwwICsxLDE0NzkgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgQkNNT1NfQ09NTU9OX0hfCisjZGVmaW5lIEJDTU9TX0NPTU1PTl9IXworCisjaWZuZGVmIEJDTU9TX1NZU1RFTV9IXworI2Vycm9yIFBsZWFzZSBkbyBub3QgaW5jbHVkZSBiY21vc19jb21tb24uaCBkaXJlY3RseS4gSW5jbHVkZSBiY21vc19zeXN0ZW0uaAorI2VuZGlmCisKKyNpbmNsdWRlICJiY21vc19lcnJuby5oIgorI2luY2x1ZGUgImJjbW9zX3R5cGVzLmgiCisjaW5jbHVkZSAiYmNtb3NfcXVldWUuaCIKKyNpbmNsdWRlICJiY21vc190cmVlLmgiCisvKiBHZXQgY29uc3RhbnRzLCBzdWNoIGFzIHRhc2ssIG1vZHVsZSwgZXZlbnQgaWQgbGlzdHMgKi8KKyNpbmNsdWRlICJiY21vc19wbGF0Zm9ybS5oIgorI2luY2x1ZGUgImJjbW9zX3BhY2suaCIKKyNpbmNsdWRlICJiY21vc19zeXNpZi5oIgorCisjZGVmaW5lIE1BWF9UQVNLX05BTUVfU0laRSAgICAgICAgICA2NAorI2RlZmluZSBNQVhfTU9EVUxFX05BTUVfU0laRSAgICAgICAgNjQKKyNkZWZpbmUgTUFYX01TR19RVUVVRV9OQU1FX1NJWkUgICAgIDY0CisjZGVmaW5lIE1BWF9USU1FUl9OQU1FX1NJWkUgICAgICAgICA2NAorI2RlZmluZSBNQVhfUE9PTF9OQU1FX1NJWkUgICAgICAgICAgNjQKKyNkZWZpbmUgTUFYX0VWRU5UX05BTUVfU0laRSAgICAgICAgIDY0CisjZGVmaW5lIE1BWF9NVVRFWF9OQU1FX1NJWkUgICAgICAgICA2NAorI2RlZmluZSBCQ01PU19NU0dfUE9PTF9ERUZBVUxUX1NJWkUgNTEyCisKKy8qIERlZmluZSBiY21vc19ib29sIC0gdGhlIGJvb2xlYW4gdHlwZSBmb3IgYmNtb3MgLSBiYXNlZCBvbiBDOTkgc3RhbmRhcmQgYm9vbGVhbiB0eXBlICovCisjaWZuZGVmIEJDTU9TX0JPT0xFQU4KK3R5cGVkZWYgX0Jvb2wgYmNtb3NfYm9vbDsKKyNkZWZpbmUgQkNNT1NfRkFMU0UgMAorI2RlZmluZSBCQ01PU19UUlVFIDEKKyNlbmRpZgorCisjZGVmaW5lIEJDTV9TSVpFT0ZBUlJBWShhcnIpIChzaXplb2YoYXJyKS9zaXplb2YoKmFycikpCisjZGVmaW5lIEJDTV9TSVpFT0ZGSUVMRChzLCBmKSAoc2l6ZW9mKCgocyopTlVMTCktPmYpKQorI2RlZmluZSBCQ01fTUVNWkVST19TVFJVQ1QocHRyKSBtZW1zZXQocHRyLCAwLCBzaXplb2YoKihwdHIpKSkKKyNkZWZpbmUgQkNNX01FTUNQWV9BUlJBWShkc3QsIHNyYykgbWVtY3B5KGRzdCwgc3JjLCBzaXplb2YoZHN0KSkKKyNkZWZpbmUgVEFCICIgICIKKyNkZWZpbmUgVEFCMiBUQUIgVEFCCisjZGVmaW5lIFRBQjMgVEFCMiBUQUIKKyNkZWZpbmUgVEFCNCBUQUIyIFRBQjIKKworI2RlZmluZSBDSElQX1JFVklTSU9OX0EwIDB4QTAKKyNkZWZpbmUgQ0hJUF9SRVZJU0lPTl9CMCAweEIwCisKKyNpZmRlZiBTSU1VTEFUSU9OX0JVSUxECisjZGVmaW5lIEdFVF9DSElQX1JFVklTSU9OIENISVBfUkVWSVNJT05fQTAKKyNlbHNlCitleHRlcm4gdWludDMyX3QgY2hpcF9yZXZpc2lvbjsKKyNkZWZpbmUgR0VUX0NISVBfUkVWSVNJT04gKGNoaXBfcmV2aXNpb24gIT0gMCA/IGNoaXBfcmV2aXNpb24gOiAoY2hpcF9yZXZpc2lvbiA9IGdldF9jaGlwX3JldmlzaW9uKCkpKQorI2VuZGlmCisKK3R5cGVkZWYgdm9pZCAoKmZfYmNtb2x0X3N3X2Vycm9yX2hhbmRsZXIpKHVpbnQ4X3QgcG9uX2lkLCBjb25zdCBjaGFyICpmaWxlX25hbWUsIHVpbnQzMl90IGxpbmVfbnVtYmVyKTsKKworLyogU2ltaWxhciB0byBCVUdfT04oKSwgd2l0aCB0aGUgZm9sbG93aW5nIGZlYXR1cmVzOgorICogMS4gVGhlIGNvbmRpdGlvbiBpcyBjaGVja2VkIGFnYWluc3QgQkNNX0VSUl9PSy4KKyAqIDIuIEluIGNhc2Ugb24gYW4gZXJyb3IsIHRoZSBtYWNybyByZXR1cm5zIGZyb20gdGhlIGNhbGxpbmcgZnVuY3Rpb24gd2l0aCB0aGUgZXJyb3IgY29kZS4gKi8KKyNkZWZpbmUgQlVHX09OX0VSUl9SRVQoZikgXAorICAgIGRvIFwKKyAgICB7IFwKKyAgICAgICAgYmNtb3NfZXJybm8gX2VycjsgXAorICAgICAgICBfZXJyID0gZjsgXAorICAgICAgICBCVUdfT04oX2VyciAhPSBCQ01fRVJSX09LKTsgXAorICAgICAgICByZXR1cm4gX2VycjsgXAorICAgIH0gXAorICAgIHdoaWxlICgwKQorCisvKiogXGFkZHRvZ3JvdXAgc3lzdGVtX2luaXQKKyAqIEB7CisgKi8KKworLyoqIEluaXRpYWxpemUgc3lzdGVtIGxpYnJhcnkKKyAqIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIgc3lzdGVtIGZ1bmN0aW9uCisgKiBccmV0dXJucyAwPU9LIG9yIGVycm9yIGNvZGUgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfaW5pdCh2b2lkKTsKKworLyoqIENsZWFudXAgc3lzdGVtIGxpYnJhcnkKKyAqLwordm9pZCBiY21vc19leGl0KHZvaWQpOworCisvKiogQH0gc3lzdGVtX2luaXQgKi8KKworLyoqIFxhZGR0b2dyb3VwIHN5c3RlbV9tZW0KKyAqIEB7CisgKi8KKworI2lmbmRlZiBCQ01PU19NQUxMT0NfRlJFRV9JTkxJTkUKKworLyoqIFxkZWZncm91cCBzeXN0ZW1faGVhcCBEZWZhdWx0IEhlYXAKKyAqIEB7CisgKi8KKworLyoqIEFsbG9jYXRlIG1lbW9yeSBmcm9tIHRoZSBtYWluIGhlYXAKKyAqIFxwYXJhbVtpbl0gICBzaXplCisgKiBccmV0dXJucyBtZW1vcnkgYmxvY2sgcG9pbnRlciBvciBOVUxMCisgKi8KK3ZvaWQgKmJjbW9zX2FsbG9jKHVpbnQzMl90IHNpemUpOworCisvKiogUmVsZWFzZSBtZW1vcnkgdG8gdGhlIG1haW4gcG9vbAorICogXHBhcmFtW2luXSAgIHB0cgorICovCit2b2lkIGJjbW9zX2ZyZWUodm9pZCAqcHRyKTsKKworLyoqIEB9IHN5c3RlbV9oZWFwICovCisKKyNlbmRpZiAvKiAjaWZuZGVmIEJDTU9TX01BTExPQ19GUkVFX0lOTElORSAqLworCisvKiogXGRlZmdyb3VwIGJsa19wb29sIEJsb2NrIE1lbW9yeSBQb29sCisgKiBcaW5ncm91cCBzeXN0ZW1fbWVtCisgKiBAeworICovCisKKy8qKiBCbG9jayBtZW1vcnkgcG9vbCBwYXJhbWV0ZXJzICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIGNvbnN0IGNoYXIgKm5hbWU7ICAgLyoqPCBQb29sIG5hbWUgKi8KKyAgICB1aW50MzJfdCBibGtfc2l6ZTsgIC8qKjwgTWVtb3J5IGJsb2NrIHNpemUgPiAwICovCisgICAgdWludDMyX3QgbnVtX2Jsa3M7ICAvKio8IE51bWJlciBvZiBibG9ja3MgaW4gdGhlIHBvb2wuIElmIG5vdCBzZXQgLSBpdCBpcyBkZXJpdmVkIGZyb20gcG9vbF9zaXplICovCisgICAgdm9pZCAqc3RhcnQ7ICAgICAgICAvKio8IFN0YXJ0IGFkZHJlc3MuIENhbiBiZSBOVUxMICovCisgICAgdWludDMyX3QgcG9vbF9zaXplOyAvKio8IFRvdGFsIHBvb2wgc2l6ZSBpbiBieXRlcy4gT25seSAxIG9mIHBvb2xfc2l6ZSwgbnVtX2Jsa3MgbXVzdCBiZSBzZXQgKi8KKyAgICB1aW50MzJfdCBmbGFnczsgICAgIC8qKjwgVEJEIGZsYWdzICovCisjZGVmaW5lIEJDTU9TX0JMS19QT09MX0ZMQUdfTVNHX1BPT0wgIDB4ODAwMDAwMDAgLyogVXNlZCBieSBtZXNzYWdlIHBvb2wgKi8KK30gYmNtb3NfYmxrX3Bvb2xfcGFybTsKKworLyoqIEJsb2NrIG1lbW9yeSBwb29sIHN0YXRpc3RpY3MgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9zX2Jsa19wb29sX3N0YXQKK3sKKyAgICB1aW50MzJfdCBhbGxvY2F0ZWQ7ICAgICAvKio8IE51bWJlciBvZiBibG9ja3MgYWxsb2NhdGVkICovCisgICAgdWludDMyX3QgcmVsZWFzZWQ7ICAgICAgLyoqPCBOdW1iZXIgb2YgYmxvY2tzIHJlbGVhc2VkICovCisgICAgdWludDMyX3QgZnJlZTsgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZnJlZSBibG9ja3MgaW4gdGhlIHBvb2wgKi8KKyAgICB1aW50MzJfdCBhbGxvY19mYWlsZWQ7ICAvKio8IE51bWJlciBvZiBhbGxvY2F0aW9uIGZhaWx1cmVzICovCit9IGJjbW9zX2Jsa19wb29sX3N0YXQ7CisKKy8qKiBCbG9jayBtZW1vcnkgcG9vbCBpbmZvICovCit0eXBlZGVmIHN0cnVjdCBiY21vc19ibGtfcG9vbF9pbmZvCit7CisgICAgYmNtb3NfYmxrX3Bvb2xfcGFybSBwYXJtOyAgIC8qKjwgUG9vbCBwYXJhbWV0ZXJzICovCisgICAgYmNtb3NfYmxrX3Bvb2xfc3RhdCBzdGF0OyAgIC8qKjwgUG9vbCBzdGF0aXN0aWNzICovCit9IGJjbW9zX2Jsa19wb29sX2luZm87CisKKy8qKiBCbG9jayBtZW1vcnkgcG9vbCBjb250cm9sIGJsb2NrICovCit0eXBlZGVmIHN0cnVjdCBiY21vc19ibGtfcG9vbCBiY21vc19ibGtfcG9vbDsKKworLyoqIENyZWF0ZSBibG9jayBtZW1vcnkgcG9vbAorICogXHBhcmFtW2luLG91dF0gICAgICAgcG9vbCAgICBwb29sIGNvbnRyb2wgYmxvY2sKKyAqIFxwYXJhbVtpbl0gICAgICAgICAgIHBhcm0gICAgcG9vbCBwYXJhbWV0ZXJzCisgKiBccmV0dXJucyAwPU9LIG9yIGVycm9yIGNvZGUgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfYmxrX3Bvb2xfY3JlYXRlKGJjbW9zX2Jsa19wb29sICpwb29sLCBjb25zdCBiY21vc19ibGtfcG9vbF9wYXJtICpwYXJtKTsKKworLyoqIERlc3Ryb3kgYmxvY2sgbWVtb3J5IHBvb2wKKyAqIFxwYXJhbVtpbl0gICBwb29sICAgIHBvb2wgaGFuZGxlCisgKiBccmV0dXJucyAwPU9LIG9yIGVycm9yIGNvZGUgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfYmxrX3Bvb2xfZGVzdHJveShiY21vc19ibGtfcG9vbCAqcG9vbCk7CisKKy8qKiBBbGxvY2F0ZSBibG9jayBmcm9tIGJsb2NrIG1lbW9yeSBwb29sCisgKgorICogVGhpcyBhbGxvY2F0ZXMgYSBzaW5nbGUgdW5pdCAodW5pdF9zaXplIGJ5dGVzKQorICogXHBhcmFtW2luXSAgIHBvb2wgICAgUG9vbCBoYW5kbGUKKyAqIFxyZXR1cm4gbWVtb3J5IGJsb2NrIHBvaW50ZXIgb3IgTlVMTC4KKyAqIEl0IGlzIGd1YXJhbnRlZWQgdGhhdCB0aGUgcmV0dXJuZWQgcG9pbnRlciBpcyBhbGlnbmVkIHRvIHBvaW50ZXIgc2l6ZQorICovCit2b2lkICpiY21vc19ibGtfcG9vbF9hbGxvYyhiY21vc19ibGtfcG9vbCAqcG9vbCk7CisKKy8qKiBBbGxvY2F0ZSBibG9jayBmcm9tIGJsb2NrIG1lbW9yeSBwb29sIGFuZCB6ZXJvIHRoZSBibG9jaworICoKKyAqIFRoaXMgYWxsb2NhdGVzIGEgc2luZ2xlIHVuaXQgKHVuaXRfc2l6ZSBieXRlcykKKyAqIFxwYXJhbVtpbl0gICBwb29sICAgIFBvb2wgaGFuZGxlCisgKiBccmV0dXJuIG1lbW9yeSBibG9jayBwb2ludGVyIG9yIE5VTEwuCisgKiBJdCBpcyBndWFyYW50ZWVkIHRoYXQgdGhlIHJldHVybmVkIHBvaW50ZXIgaXMgYWxpZ25lZCB0byBwb2ludGVyIHNpemUKKyAqLwordm9pZCAqYmNtb3NfYmxrX3Bvb2xfY2FsbG9jKGJjbW9zX2Jsa19wb29sICpwb29sKTsKKworLyoqIFJlbGVhc2UgbWVtb3J5IGFsbG9jYXRlZCB1c2luZyBiY21vc19ibGtfcG9vbF9hbGxvYygpCisgKgorICogXHBhcmFtW2luXSAgIHB0ciAgICAgcG9pbnRlcgorICovCit2b2lkIGJjbW9zX2Jsa19wb29sX2ZyZWUodm9pZCAqcHRyKTsKKworLyoqIFJlbGVhc2UgYWxsIGJsb2NrcyBpbiBtZW1vcnkgcG9vbC4gQmxvY2sgY29udGVudCBpcyBub3QgYWZmZWN0ZWQKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIHdoZW4gYXBwbGljYXRpb24gd2FudHMgdG8gcHJlLWluaXRpYWxpemUKKyAqIHNvbWUgcG9ydGlvbiBvZiBlYWNoIG1lbW9yeSBibG9jayBhdCBpbml0IHRpbWUKKyAqCisgKiBccGFyYW1baW5dICAgcG9vbCAgICBQb29sIGhhbmRsZQorICovCit2b2lkIGJjbW9zX2Jsa19wb29sX3Jlc2V0KGJjbW9zX2Jsa19wb29sICpwb29sKTsKKworLyoqIEdldCBwb29sIGluZm8KKyAqCisgKiBUaGUgcG9vbCBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcgYmNtb3NfYmxrX3Bvb2xfY3JlYXRlKCkKKyAqIFxwYXJhbVtpbl0gICBwb29sICAgIEJsb2NrIG1lbW9yeSBwb29sIGhhbmRsZQorICogXHBhcmFtW291dF0gIGluZm8gICAgQmxvY2sgbWVtb3J5IHBvb2wgaW5mbworICogXHJldHVybnMgMD1PSyBvciBlcnJvciBjb2RlIDwwCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX2Jsa19wb29sX3F1ZXJ5KGNvbnN0IGJjbW9zX2Jsa19wb29sICpwb29sLCBiY21vc19ibGtfcG9vbF9pbmZvICppbmZvKTsKKworLyoqIEJsb2NrIHBvb2wgaXRlcmF0b3IKKyAqIFxwYXJhbVtpbl0gcHJldiAgICAgIFByZXZpb3VzIGJsb2NrIHBvb2wuICpwcmV2PT1OVUxMIC0gZ2V0IGZpcnN0CisgKiBccmV0dXJuOiBCQ01fRVJSX09LLCBCQ01fRVJSX05PRU5ULCBCQ01fRVJSX05PX01PUkUKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfYmxrX3Bvb2xfZ2V0X25leHQoY29uc3QgYmNtb3NfYmxrX3Bvb2wgKipwcmV2KTsKKworLyoqIEB9IGJsa19wb29sICovCisKKy8qKiBcZGVmZ3JvdXAgYnl0ZV9wb29sIEJ5dGUgTWVtb3J5IFBvb2wKKyAqIFxpbmdyb3VwIHN5c3RlbV9tZW0KKyAqIEB7CisgKi8KKworLyoqIEJ5dGUgbWVtb3J5IHBvb2wgcGFyYW1ldGVycyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBjb25zdCBjaGFyICpuYW1lOyAgIC8qKjwgUG9vbCBuYW1lICovCisgICAgdWludDMyX3Qgc2l6ZTsgICAgICAvKio8IFBvb2wgc2l6ZSAoYnl0ZXMpICovCisgICAgdm9pZCAqc3RhcnQ7ICAgICAgICAvKio8IFN0YXJ0IGFkZHJlc3MuIENhbiBiZSBOVUxMICovCit9IGJjbW9zX2J5dGVfcG9vbF9wYXJtOworCisvKiogQnl0ZSBtZW1vcnkgcG9vbCBjb250cm9sIGJsb2NrICovCit0eXBlZGVmIHN0cnVjdCBiY21vc19ieXRlX3Bvb2wgYmNtb3NfYnl0ZV9wb29sOworCisvKiogQ3JlYXRlIGJ5dGUgbWVtb3J5IHBvb2wKKyAqIFxwYXJhbVtpbixvdXRdICAgICAgIHBvb2wgICAgcG9vbCBjb250cm9sIGJsb2NrCisgKiBccGFyYW1baW5dICAgICAgICAgICBwYXJtICAgIHBvb2wgcGFyYW1ldGVycworICogXHJldHVybnMgMD1PSyBvciBlcnJvciBjb2RlIDwwCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX2J5dGVfcG9vbF9jcmVhdGUoYmNtb3NfYnl0ZV9wb29sICpwb29sLCBjb25zdCBiY21vc19ieXRlX3Bvb2xfcGFybSAqcGFybSk7CisKKy8qKiBEZXN0cm95IGJ5dGUgbWVtb3J5IHBvb2wKKyAqIFxwYXJhbVtpbl0gICBwb29sICAgIHBvb2wgaGFuZGxlCisgKiBccmV0dXJucyAwPU9LIG9yIGVycm9yIGNvZGUgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfYnl0ZV9wb29sX2Rlc3Ryb3koYmNtb3NfYnl0ZV9wb29sICpwb29sKTsKKworI2lmbmRlZiBCQ01PU19CWVRFX1BPT0xfQUxMT0NfRlJFRV9JTkxJTkUKKy8qKiBBbGxvY2F0ZSBtZW1vcnkgZnJvbSBieXRlIG1lbW9yeSBwb29sCisgKgorICogVGhpcyBmdW5jdGlvbiBjYW4gb25seSBiZSB1c2VkIHdpdGggYnl0ZSBtZW1vcnkgcG9vbHMgY3JlYXRlZAorICogd2l0aCB1bml0X3NpemU9PTEKKyAqIFxwYXJhbVtpbl0gICBwb29sICAgIFBvb2wgaGFuZGxlCisgKiBccGFyYW1baW5dICAgc2l6ZSAgICBCbG9jayBzaXplIChieXRlcykKKyAqIFxyZXR1cm4gbWVtb3J5IGJsb2NrIHBvaW50ZXIgb3IgTlVMTAorICovCit2b2lkICpiY21vc19ieXRlX3Bvb2xfYWxsb2MoYmNtb3NfYnl0ZV9wb29sICpwb29sLCB1aW50MzJfdCBzaXplKTsKKworLyoqIFJlbGVhc2UgbWVtb3J5IGFsbG9jYXRlZCB1c2luZyBiY21vc19wb29sX2J5dGVfYWxsb2MoKQorICoKKyAqIFxwYXJhbVtpbl0gICBwdHIgICAgIHBvaW50ZXIKKyAqLwordm9pZCBiY21vc19ieXRlX3Bvb2xfZnJlZSh2b2lkICpwdHIpOworCisjZW5kaWYgLyogQkNNT1NfQllURV9QT09MX0FMTE9DX0ZSRUVfSU5MSU5FICovCisKKy8qKiBAfSBieXRlX3Bvb2wgKi8KKworLyoqIEB9IHN5c3RlbV9tZW0gKi8KKworLyoqIFxhZGR0b2dyb3VwIHN5c3RlbV90YXNrCisgKiBAeworICovCisjaWZuZGVmIEJDTU9TX1dBSVRfRk9SRVZFUgorI2RlZmluZSBCQ01PU19XQUlUX0ZPUkVWRVIgICAgICAgIDB4RkZGRkZGRkYgIC8qKjwgV2FpdCB0aW1lb3V0LiBXYWl0IGZvcmV2ZXIgKi8KKyNlbmRpZgorI2lmbmRlZiBCQ01PU19OT19XQUlUCisjZGVmaW5lIEJDTU9TX05PX1dBSVQgICAgICAgICAgICAgMCAvKio8IFdhaXQgdGltZW91dC4gRG9uJ3Qgd2FpdCAqLworI2VuZGlmCisjZGVmaW5lIEJDTU9TX01JQ1JPU0VDT05EU19JTl9TRUNPTkRTICAgKDEwMDAwMDApCisKKy8qKiBUYXNrIHByaW9yaXR5ICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzAsIC8qKjwgUHJpb3JpdHkgMCAtIGhpZ2hlc3QgKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzEsIC8qKjwgUHJpb3JpdHkgMSAqLworICAgIEJDTU9TX1RBU0tfUFJJT1JJVFlfMiwgLyoqPCBQcmlvcml0eSAyICovCisgICAgQkNNT1NfVEFTS19QUklPUklUWV8zLCAvKio8IFByaW9yaXR5IDMgKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzQsIC8qKjwgUHJpb3JpdHkgNCAqLworICAgIEJDTU9TX1RBU0tfUFJJT1JJVFlfNSwgLyoqPCBQcmlvcml0eSA1ICovCisgICAgQkNNT1NfVEFTS19QUklPUklUWV82LCAvKio8IFByaW9yaXR5IDYgKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzcsIC8qKjwgUHJpb3JpdHkgNyAqLworICAgIEJDTU9TX1RBU0tfUFJJT1JJVFlfOCwgLyoqPCBQcmlvcml0eSA4ICovCisgICAgQkNNT1NfVEFTS19QUklPUklUWV85LCAvKio8IFByaW9yaXR5IDkgKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzEwLC8qKjwgUHJpb3JpdHkgMTAgKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzExLC8qKjwgUHJpb3JpdHkgMTEgKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzEyLC8qKjwgUHJpb3JpdHkgMTIgKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzEzLC8qKjwgUHJpb3JpdHkgMTMgKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzE0LC8qKjwgUHJpb3JpdHkgMTQgKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzE1LC8qKjwgUHJpb3JpdHkgMTUgKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzE2LC8qKjwgUHJpb3JpdHkgMTYgKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzE3LC8qKjwgUHJpb3JpdHkgMTcgKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzE4LC8qKjwgUHJpb3JpdHkgMTggKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzE5LC8qKjwgUHJpb3JpdHkgMTkgKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzIwLC8qKjwgUHJpb3JpdHkgMjAgKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzIxLC8qKjwgUHJpb3JpdHkgMjEgKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzIyLC8qKjwgUHJpb3JpdHkgMjIgKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzIzLC8qKjwgUHJpb3JpdHkgMjMgKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzI0LC8qKjwgUHJpb3JpdHkgMjQgKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzI1LC8qKjwgUHJpb3JpdHkgMjUgKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzI2LC8qKjwgUHJpb3JpdHkgMjYgKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzI3LC8qKjwgUHJpb3JpdHkgMjcgKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzI4LC8qKjwgUHJpb3JpdHkgMjggKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzI5LC8qKjwgUHJpb3JpdHkgMjkgKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzMwLC8qKjwgUHJpb3JpdHkgMzAgKi8KKyAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzMxLC8qKjwgUHJpb3JpdHkgMzEgLSBsb3dlc3QgKi8KK30gYmNtb3NfdGFza19wcmlvcml0eTsKKworLyoqIFRhc2sgaGFuZGxlciAqLwordHlwZWRlZiBpbnQgKCpGX2JjbW9zX3Rhc2tfaGFuZGxlcikobG9uZyBkYXRhKTsKKworLyogRGVmYXVsdCB0YXNrIGhhbmRsZXIgKi8KK2V4dGVybiBpbnQgYmNtb3NfZGZ0X3Rhc2tfaGFuZGxlcihsb25nIGRhdGEpOworCisvKiBUaGlzIGZsYWdzIGRldGVybWluZXMgd2hldGhlciBhIHRhc2sgaXMgdG8gYmUgc3VzcGVuZGVkIHVwb24gT09QUyBjb25kaXRpb24uICovCisjZGVmaW5lIEJDTU9TX1RBU0tfRkxBR19OT19TVVNQRU5EX09OX09PUFMgKDEgPDwgMCkKKworLyoqIFRhc2sgcGFyYW1ldGVycyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBjb25zdCBjaGFyICpuYW1lOyAgICAgICAgICAgICAgICAgICAvKio8IFRhc2sgbmFtZSAqLworICAgIGJjbW9zX3Rhc2tfcHJpb3JpdHkgcHJpb3JpdHk7ICAgICAgIC8qKjwgVGFzayBwcmlvcml0eSAqLworICAgIGJjbW9zX2NvcmUgY29yZTsgICAgICAgICAgICAgICAgICAgIC8qKjwgQ1BVIGNvcmUgdGhlIHRhc2sgaXMgbG9ja2VkIHRvICovCisgICAgdWludDMyX3Qgc3RhY2tfc2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBUYXNrIHN0YWNrIHNpemUgKi8KKyAgICB2b2lkICpzdGFjazsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFN0YWNrIGxvY2F0aW9uLiBOVUxMPWFsbG9jYXRlIGF1dG9tYXRpY2FsbHkgKi8KKyAgICBGX2JjbW9zX3Rhc2tfaGFuZGxlciBpbml0X2hhbmRsZXI7ICAvKio8IE9wdGlvbmFsICJpbml0IiBoYW5kbGVyLiBDYWxsZWQgb25jZSBpbiB0aGUgdGFzayBjb250ZXh0IHdoZW4gaXQgaXMgY3JlYXRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgY2FsbGJhY2sgaXMgb25seSBzdXBwb3J0ZWQgaW4gaW50ZWdyYXRpb24gbW9kZSAoaGFuZGxlcj09TlVMTCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0X2hhbmRsZXIgcmV0dXJucyBiY21vc19lcnJuby4gSWYgaXQgcmV0dXJucyB2YWx1ZSBvdGhlciB0aGFuIEJDTV9FUlJfT0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdGFzayBpcyBkZXN0cm95ZWQgKi8KKyAgICBGX2JjbW9zX3Rhc2tfaGFuZGxlciBoYW5kbGVyOyAgICAgICAvKio8IFRhc2sgaGFuZGxlci4gTlVMTD1kZWZhdWx0IChpbnRlZ3JhdGlvbiBtb2RlKSAqLworICAgIEZfYmNtb3NfdGFza19oYW5kbGVyIHRpbWVvdXRfaGFuZGxlcjsvKio8IFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBvbmx5IGluIGludGVncmF0aW9uIG1vZGUgKGhhbmRsZXI9PU5VTEwpIGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnX3dhaXRfdGltZW91dCBpcyA+IDAuIEl0IGlzIGNhbGxlZCBpZiB0aGVyZSB3ZXJlIG5vIG1lc3NhZ2VzIGZvciB0aGUgdGFzaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsb25nZXIgdGhhbiBtc2dfd2FpdF90aW1lb3V0IHVzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHRpbWVvdXQgaGFuZGxlciByZXR1cm5zIHZhbHVlIG90aGVyIHRoYW4gQkNNX0VSUl9PSywgdGFzayB0ZXJtaW5hdGVzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgdWludDMyX3QgbXNnX3dhaXRfdGltZW91dDsgICAgICAgICAgLyoqPCBUaGlzIHBhcmFtZXRlciBpcyB1c2VkIG9ubHkgaW4gaW50ZWdyYXRpb24gbW9kZSAoaGFuZGxlcj09TlVMTCkgdG9nZXRoZXIgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dF9oYW5kbGVyLiBJZiA+IDAgYW5kIHRoZXJlIHdlcmUgbm8gbWVzc2FnZXMgZm9yIGxvbmdlciB0aGFuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2dfd2FpdF90aW1lb3V0IHVzLCB0aW1lb3V0X2hhbmRsZXIgaXMgY2FsbGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgbG9uZyBkYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBEYXRhIHBhc3NlZCB0byB0aGUgdGFzayBoYW5kbGVyICovCisgICAgdWludDMyX3QgZmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBmbGFncyAqLworfSBiY21vc190YXNrX3Bhcm07CisKKy8qKiBUYXNrIGNvbnRyb2wgYmxvY2sgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9zX3Rhc2sgYmNtb3NfdGFzazsKKworLyoqIENyZWF0ZSBhIG5ldyB0YXNrCisgKgorICogXHBhcmFtW2luLG91dF0gIHRhc2sgICAgVGFzayBjb250cm9sIGJsb2NrCisgKiBccGFyYW1baW5dICAgICAgcGFybSAgICBUYXNrIHBhcmFtZXRlcnMKKyAqIFxyZXR1cm5zIDA9T0sgb3IgZXJyb3IgY29kZSA8MAorICovCitiY21vc19lcnJubyBiY21vc190YXNrX2NyZWF0ZShiY21vc190YXNrICp0YXNrLCBjb25zdCBiY21vc190YXNrX3Bhcm0gKnBhcm0pOworCisvKiogU2V0IHRhc2sgdGltZW91dAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgb25seSB1c2VkIGluIGludGVncmF0aW9uIG1vZGUgKGhhbmRsZXI9PU5VTEwpLgorICogSXQgc2V0cyBtYXggdGltZSB0aGUgZGVmYXVsdCB0YXNrIGhhbmRsZXIgd2FpdHMgZm9yIG1lc3NhZ2UgZGlyZWN0ZWQgdG8gb25lIG9mIHRoZQorICogdGFzaydzIG1vZHVsZXMuCisgKgorICogXHBhcmFtW2luLG91dF0gIHRhc2sgICAgICAgICAgICAgICAgIFRhc2sgY29udHJvbCBibG9jaworICogXHBhcmFtW2luXSAgICAgIHRpbWVvdXQgICAgICAgICAgICAgIE1heCB0aW1lICh1cykgdG8gd2FpdCBmb3IgbWVzc2FnZXMuIDA9Rk9SRVZFUgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5naW5nIHRpbWVvdXQgZnJvbSBpbmZpbml0ZSB0byBmaW5pdGUgb25seSB0YWtlcyBlZmZlY3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlciBtZXNzYWdlIGlzIHJlY2VpdmVkIGJ5IGFueSB0YXNrIG1vZHVsZS4KKyAqIFxwYXJhbVtpbl0gICAgICB0aW1lb3V0X2hhbmRsZXIgICAgICBIYW5kbGVyIHRvIGJlIGNhbGxlZCB1cG9uIHRpbWVvdXQuIE11c3QgYmUgIT0gTlVMTCBpZiB0aW1lb3V0ID4gMC4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgaGFuZGxlciByZXR1cm5zIGVycm9yICghPSBCQ01fRVJSX09LKSwgdGFzayB0ZXJtaW5hdGVzLgorICogXHJldHVybnMgMD1PSyBvciBlcnJvciBjb2RlIDwwCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX3Rhc2tfdGltZW91dF9zZXQoYmNtb3NfdGFzayAqdGFzaywgdWludDMyX3QgdGltZW91dCwgRl9iY21vc190YXNrX2hhbmRsZXIgdGltZW91dF9oYW5kbGVyKTsKKworLyoqIERlc3Ryb3kgdGFzaworICoKKyAqIFxwYXJhbVtpbl0gICB0YXNrICAgICAgICAgICAgVGFzayBoYW5kbGUKKyAqIFxyZXR1cm5zIDA9T0sgb3IgZXJyb3IgY29kZSA8MAorICovCitiY21vc19lcnJubyBiY21vc190YXNrX2Rlc3Ryb3koYmNtb3NfdGFzayAqdGFzayk7CisKKy8qKiBHZXQgY3VycmVudCB0YXNrCisgKiBccmV0dXJucyB0YXNrIGhhbmRsZSBvciBOVUxMIGlmIG5vdCBpbiB0YXNrIGNvbnRleHQKKyAqLworYmNtb3NfdGFzayAqYmNtb3NfdGFza19jdXJyZW50KHZvaWQpOworCisvKiogUXVlcnkgdGFzayBpbmZvCisgKiBccGFyYW1baW5dICB0YXNrICAgIFRhc2sgY29udHJvbCBibG9jaworICogXHBhcmFtW291dF0gcGFybSAgICBUYXNrIHBhcmFtZXRlcnMKKyAqIFxyZXR1cm5zIDA9T0sgb3IgZXJyb3IgY29kZSA8MAorICovCitiY21vc19lcnJubyBiY21vc190YXNrX3F1ZXJ5KGNvbnN0IGJjbW9zX3Rhc2sgKnRhc2ssIGJjbW9zX3Rhc2tfcGFybSAqcGFybSk7CisKKy8qKiBUYXNrIGl0ZXJhdG9yCisgKiBccGFyYW1baW5dIHByZXYgICAgICBQcmV2aW91cyB0YXNrLiAqcHJldj09TlVMTCAtIGdldCBmaXJzdAorICogXHJldHVybjogQkNNX0VSUl9PSywgQkNNX0VSUl9OT0VOVCwgQkNNX0VSUl9OT19NT1JFCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX3Rhc2tfZ2V0X25leHQoYmNtb3NfdGFzayAqKnByZXYpOworCisKKy8qKiBAfSBzeXN0ZW1fdGFzayAqLworCisvKiogXGFkZHRvZ3JvdXAgc3lzdGVtX21zZworICogQHsKKyAqLworCisvKiogTWVzc2FnZSBoZWFkZXIgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9zX21zZyBiY21vc19tc2c7CisKKy8qKiBNZXNzYWdlIHF1ZXVlIGNvbnRyb2wgYmxvY2sgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9zX21zZ19xdWV1ZSBiY21vc19tc2dfcXVldWU7CisKKy8qKiBNZXNzYWdlIHF1ZXVlIGdyb3VwIGNvbnRyb2wgYmxvY2sgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9zX21zZ19xZ3JvdXAgYmNtb3NfbXNnX3Fncm91cDsKKworI2lmIGRlZmluZWQoQkNNT1NfTVNHX1FVRVVFX0RPTUFJTl9TT0NLRVQpIHx8IGRlZmluZWQoQkNNT1NfTVNHX1FVRVVFX1VEUF9TT0NLRVQpIHx8IGRlZmluZWQoQkNNT1NfTVNHX1FVRVVFX1VTRVJfREVGSU5FRCkKKyNkZWZpbmUgQkNNT1NfTVNHX1FVRVVFX1JFTU9URV9TVVBQT1JUCisjZW5kaWYKKworLyoqIE1lc3NhZ2UgcXVldWUgZW5kcG9pbnQgdHlwZSAqLwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNT1NfTVNHX1FVRVVFX0VQX0xPQ0FMLCAgICAgICAgICAgLyoqPCBMb2NhbCBlbmRwb2ludCAoaW50ZXItdGhyZWFkIGNvbW11bmljYXRpb24pICovCisjaWZkZWYgQkNNT1NfTVNHX1FVRVVFX0RPTUFJTl9TT0NLRVQKKyAgICBCQ01PU19NU0dfUVVFVUVfRVBfRE9NQUlOX1NPQ0tFVCwgICAvKio8IERvbWFpbi1zb2NrZXQgYmFzZWQgZW5kcG9pbnQgKi8KKyNlbmRpZgorI2lmZGVmIEJDTU9TX01TR19RVUVVRV9VRFBfU09DS0VUCisgICAgQkNNT1NfTVNHX1FVRVVFX0VQX1VEUF9TT0NLRVQsICAgICAgLyoqPCBVRFAgc29ja2V0LWJhc2VkIGVuZHBvaW50ICovCisjZW5kaWYKKyNpZmRlZiBCQ01PU19NU0dfUVVFVUVfVVNFUl9ERUZJTkVECisgICAgQkNNT1NfTVNHX1FVRVVFX0VQX1VTRVJfREVGSU5FRCAgICAgLyoqPCBVc2VyLWRlZmluZWQgZW5kcG9pbnQgKi8KKyNlbmRpZgorfSBiY21vc19tc2dfcXVldWVfZXBfdHlwZTsKKworCisvKiogTWVzc2FnZSBxdWV1ZSBwYXJhbWV0ZXJzICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIGNvbnN0IGNoYXIgKm5hbWU7ICAgICAgICAgICAvKio8IFF1ZXVlIG5hbWUgKGZvciBsb2dnaW5nIGFuZCBkZWJ1Z2dpbmcpICovCisgICAgdWludDMyX3Qgc2l6ZTsgICAgICAgICAgICAgIC8qKjwgTWF4IHF1ZXVlIHNpemUuIDA9dW5saW1pdGVkICovCisgICAgdWludDMyX3QgaGlnaF93bTsgICAgICAgICAgIC8qKjwgT3B0aW9uYWwgaGlnaCB3YXRlciBtYXJrLiBMb2cgaXMgZ2VuZXJhdGVkIHdoZW4gcXVldWUgb2NjdXBhbmN5IGV4Y2VlZHMgaHdtICovCisgICAgdWludDMyX3QgbG93X3dtOyAgICAgICAgICAgIC8qKjwgT3B0aW9uYWwgbG93IHdhdGVyIG1hcmsuIExvZyBpcyBnZW5lcmF0ZWQgd2hlbiBxdWV1ZSBvY2N1cGFuY3kgZHJvcHMgYmVsb3cgbHdtICovCisgICAgdWludDMyX3QgZmxhZ3M7ICAgICAgICAgICAgIC8qKjwgVEJEIGZsYWdzLiBGb3IgZXhhbXBsZSwgc2luZ2xlLWNvcmUsIG0tY29yZSAqLworICAgIHZvaWQgKCpub3RpZnkpKGJjbW9zX21zZ19xdWV1ZSAqcSwgY29uc3QgY2hhciAqdHh0KTsgLyoqKjwgQ2FsbGVkIHdoZW4gcXVldWUgY29uZ2VzdGlvbiBzdGF0ZSBjaGFuZ2VzICovCisgICAgYmNtb3NfbXNnX3F1ZXVlX2VwX3R5cGUgZXBfdHlwZTsgLyoqPCBRdWV1ZSBlbmRwb2ludCB0eXBlICovCisKKyNpZmRlZiBCQ01PU19NU0dfUVVFVUVfUkVNT1RFX1NVUFBPUlQKKyAgICAvKiBSZW1vdGUgbWVzc2FnZSBxdWV1ZSBzdXBwb3J0IGFsbG93cyBxdWV1ZSBlbmRwb2ludHMgdG8gYmUgbG9jYXRlZCBpbgorICAgICAqIGRpZmZlcmVudCBwcm9jZXNzZXMgb3IgZXZlbiBwcm9jZXNzb3JzLgorICAgICAqLworICAgIGNvbnN0IGNoYXIgKmxvY2FsX2VwX2FkZHJlc3M7ICAgICAgIC8qKjwgUXVldWUgbG9jYWwgZW5kcG9pbnQgYWRkcmVzcyAqLworICAgIGNvbnN0IGNoYXIgKnJlbW90ZV9lcF9hZGRyZXNzOyAgICAgIC8qKjwgUXVldWUgbG9jYWwgZW5kcG9pbnQgYWRkcmVzcyAqLworCisgICAgdWludDMyX3QgbWF4X210dTsgICAgICAgICAgICAgICAgICAgLyoqPCBNYXggTVRVIHNpemUgKi8KKyNkZWZpbmUgQkNNT1NfTVNHX1FVRVVFX0RFRkFVTFRfTUFYX01UVSAgICAgICAgICg2NCoxMDI0KQorCisgICAgLyoqIE9wdGlvbmFsICJwYWNrIiBjYWxsYmFjay4gTm90IG5lZWRlZCBpZiAyIHByb2Nlc3NlcyBhcmUgb24gdGhlIHNhbWUgY29yZS4gKi8KKyAgICBiY21vc19lcnJubyAoKnBhY2spKGJjbW9zX21zZ19xdWV1ZSAqcXVldWUsIGJjbW9zX21zZyAqbXNnLCB1aW50OF90ICoqYnVmLCB1aW50MzJfdCAqYnVmX2xlbmd0aCk7CisKKyAgICAvKiogT3B0aW9uYWwgInVucGFjayIgY2FsbGJhY2suIE5vdCBuZWVkZWQgaWYgMiBwcm9jZXNzZXMgYXJlIG9uIHRoZSBzYW1lIGNvcmUuICovCisgICAgYmNtb3NfZXJybm8gKCp1bnBhY2spKGJjbW9zX21zZ19xdWV1ZSAqcXVldWUsIHVpbnQ4X3QgKmJ1ZiwgdWludDMyX3QgYnVmX2xlbmd0aCwgYmNtb3NfbXNnICoqbXNnKTsKKworICAgIC8qKiBPcHRpb25hbCBjYWxsYmFjayB0aGF0IHJlbGVhc2VzIHBhY2tlZCBidWZmZXIgKi8KKyAgICB2b2lkICgqZnJlZV9wYWNrZWQpKGJjbW9zX21zZ19xdWV1ZSAqcXVldWUsIHVpbnQ4X3QgKmJ1Zik7CisKKyAgICAvKiogT3B0aW9uYWwgIm9wZW4iIGNhbGxiYWNrLiBNdXN0IGJlIHNldCBmb3IgdXNlci1kZWZpbmVkIHF1ZXVlLCBOVUxMIG90aGVyd2lzZSAqLworICAgIGJjbW9zX2Vycm5vICgqb3BlbikoYmNtb3NfbXNnX3F1ZXVlICpxdWV1ZSk7CisKKyAgICAvKiogT3B0aW9uYWwgImNsb3NlIiBjYWxsYmFjay4gTXVzdCBiZSBzZXQgZm9yIHVzZXItZGVmaW5lZCBxdWV1ZSwgTlVMTCBvdGhlcndpc2UgKi8KKyAgICBiY21vc19lcnJubyAoKmNsb3NlKShiY21vc19tc2dfcXVldWUgKnF1ZXVlKTsKKworICAgIC8qKiBPcHRpb25hbCAic2VuZCIgY2FsbGJhY2suIE11c3QgYmUgc2V0IGZvciB1c2VyLWRlZmluZWQgcXVldWUsIE5VTEwgb3RoZXJ3aXNlICovCisgICAgYmNtb3NfZXJybm8gKCpzZW5kKShiY21vc19tc2dfcXVldWUgKnF1ZXVlLCB1aW50OF90ICpidWYsIHVpbnQzMl90IGJ1Zl9sZW5ndGgpOworCisgICAgLyoqIE9wdGlvbmFsICJyZWN2IiBjYWxsYmFjay4gTXVzdCBiZSBzZXQgZm9yIHVzZXItZGVmaW5lZCBxdWV1ZSwgTlVMTCBvdGhlcndpc2UgKi8KKyAgICBiY21vc19lcnJubyAoKnJlY3YpKGJjbW9zX21zZ19xdWV1ZSAqcXVldWUsIHVpbnQzMl90IHRpbWVvdXQsIHVpbnQ4X3QgKipidWYsIHVpbnQzMl90ICpidWZfbGVuZ3RoKTsKKyNlbmRpZgorCit9IGJjbW9zX21zZ19xdWV1ZV9wYXJtOworCisvKiogTWVzc2FnZSBxdWV1ZSBzdGF0aXN0aWNzICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVpbnQzMl90IG1zZ19pbjsgICAgICAgICAgICAvKio8IE51bWJlciBvZiBtZXNzYWdlcyBjdXJyZW50bHkgaW4gdGhlIHF1ZXVlICovCisgICAgdWludDMyX3QgbXNnX3NlbnQ7ICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIG1lc3NhZ2VzIHN1Y2Nlc3NmdWxseSBzdWJtaXR0ZWQgaW50byB0aGUgcXVldWUgKi8KKyAgICB1aW50MzJfdCBtc2dfcmVjZWl2ZWQ7ICAgICAgLyoqPCBOdW1iZXIgb2YgbWVzc2FnZXMgcmVjZWl2ZWQgZnJvbSB0aGUgcXVldWUgKi8KKyAgICB1aW50MzJfdCBtc2dfZGlzY2FyZGVkOyAgICAgLyoqPCBOdW1iZXIgb2YgbWVzc2FnZXMgZGlzY2FyZGVkIGJlY2F1c2Ugb2YgcXVldWUgb3ZlcmZsb3cgKi8KKyAgICB1aW50MzJfdCBtc2dfYWxtb3N0X2Z1bGw7ICAgLyoqPCBOdW1iZXIgb2YgbWVzc2FnZXMgc3VibWl0dGVkIHRvIHF1ZXVlIHdoZW4gaXQgd2FzIGFib3ZlIGhpZ2ggd2F0ZXIgbWFyayAqLworICAgIGJjbW9zX2Jvb2wgaXNfY29uZ2VzdGVkOyAgICAvKio8IFRydWU9dGhlIHF1ZXVlIGlzIGN1cnJlbnRseSBjb25nZXN0ZWQgKi8KK30gYmNtb3NfbXNnX3F1ZXVlX3N0YXQ7CisKKy8qKiBNZXNzYWdlIHF1ZXVlIGluZm8gKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgYmNtb3NfbXNnX3F1ZXVlX3Bhcm0gcGFybTsgICAgLyoqPCBRdWV1ZSBwYXJhbWV0ZXJzICovCisgICAgYmNtb3NfbXNnX3F1ZXVlX3N0YXQgc3RhdDsgICAgLyoqPCBRdWV1ZSBzdGF0aXN0aWNzICovCit9IGJjbW9zX21zZ19xdWV1ZV9pbmZvOworCisvKiogTWVzc2FnZSBwcmlvcml0eSBpbiBxdWV1ZSBncm91cCAqLwordHlwZWRlZiB1aW50MzJfdCBiY21vc19xZ3JvdXBfcHJ0eTsKKworLyoqIE1lc3NhZ2UgcXVldWUgZ3JvdXAgcGFyYW1ldGVycyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBjb25zdCBjaGFyICpuYW1lOyAgICAgICAgICAgLyoqPCBRdWV1ZSBncm91cCBuYW1lIChmb3IgbG9nZ2luZyBhbmQgZGVidWdnaW5nKSAqLworICAgIGJjbW9zX3Fncm91cF9wcnR5IG5xdWV1ZXM7ICAvKio8IE51bWJlciBvZiBxdWV1ZXMgaW4gdGhlIGdyb3VwICovCisgICAgdWludDMyX3Qgc2l6ZTsgICAgICAgICAgICAgIC8qKjwgVG90YWwgbnVtYmVyIG9mIG1lc3NhZ2VzIHRoYXQgY2FuIGJlIHN0b3JlZCBpbiBxdWV1ZSBncm91cC4gMD11bmxpbWl0ZWQgKi8KKyAgICB1aW50MzJfdCBoaWdoX3dtOyAgICAgICAgICAgLyoqPCBPcHRpb25hbCBoaWdoIHdhdGVyIG1hcmsuIExvZyBpcyBnZW5lcmF0ZWQgd2hlbiBxdWV1ZSBvY2N1cGFuY3kgZXhjZWVkcyBod20gKi8KKyAgICB1aW50MzJfdCBsb3dfd207ICAgICAgICAgICAgLyoqPCBPcHRpb25hbCBsb3cgd2F0ZXIgbWFyay4gTG9nIGlzIGdlbmVyYXRlZCB3aGVuIHF1ZXVlIG9jY3VwYW5jeSBkcm9wcyBiZWxvdyBsd20gKi8KKyAgICB1aW50MzJfdCBmbGFnczsgICAgICAgICAgICAgLyoqPCBUQkQgZmxhZ3MuIEZvciBleGFtcGxlLCBzaW5nbGUtY29yZSwgbS1jb3JlICovCisgICAgdm9pZCAoKm5vdGlmeSkoYmNtb3NfbXNnX3Fncm91cCAqcWdycCwgY29uc3QgY2hhciAqdHh0KTsgLyoqKjwgQ2FsbGVkIHdoZW4gcXVldWUgZ3JvdXAgY29uZ2VzdGlvbiBzdGF0ZSBjaGFuZ2VzICovCit9IGJjbW9zX21zZ19xZ3JvdXBfcGFybTsKKworLyoqIE1lc3NhZ2UgcXVldWUgZ3JvdXAgaW5mbyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21vc19tc2dfcWdyb3VwX3Bhcm0gcGFybTsgLyoqPCBRdWV1ZSBncm91cCBwYXJhbWV0ZXJzICovCisgICAgYmNtb3NfbXNnX3F1ZXVlX3N0YXQgIHN0YXQ7IC8qKjwgUXVldWUgZ3JvdXAgc3RhdGlzdGljcyAqLworfSBiY21vc19tc2dfcWdyb3VwX2luZm87CisKKy8qKiBNZXNzYWdlIHJlY2lwaWVudCBpbnN0YW5jZSAoZS5nLiwgb3B0aWNhbCBsaW5rIGlkKSAqLwordHlwZWRlZiB1aW50MTZfdCBiY21vc19tc2dfaW5zdGFuY2U7CisKKy8qKiBNZXNzYWdlIHNlbmQgZmxhZ3MgKi8KK3R5cGVkZWYgZW51bQoreworICAgIEJDTU9TX01TR19TRU5EX0FVVE9fRlJFRSA9IDB4MDAwMDAwMDAsICAgICAgLyoqPCBBdXRvbWF0aWNhbGx5IHJlbGVhc2UgbWVzc2FnZSBpbiBjYXNlIG9mIGVycm9yLiBUaGlzIGlzIHRoZSBkZWZhdWx0IGJlaGF2aW91ciAqLworICAgIEJDTU9TX01TR19TRU5EX05PX0ZSRUVfT05fRVJST1IgPTB4MDAwMDAwMDEsLyoqPCBEbyBOT1QgZnJlZSBtZXNzYWdlIGluIGNhc2Ugb2YgdHJhbnNtaXQgZXJyb3IgKi8KKyAgICBCQ01PU19NU0dfU0VORF9VUkdFTlQgICAgPSAweDAwMDAwMDAyLCAgICAgIC8qKjwgVXJnZW50IG1lc3NhZ2UgKi8KKyAgICBCQ01PU19NU0dfU0VORF9OT0xJTUlUICAgPSAweDAwMDAwMDA0LCAgICAgIC8qKjwgSWdub3JlIGRlc3RpbmF0aW9uIHF1ZXVlIHNpemUgbGltaXQgKi8KK30gYmNtb3NfbXNnX3NlbmRfZmxhZ3M7CisKKy8qKiBSZWdpc3RlcmVkIG1lc3NhZ2UgaGFuZGxlciAqLwordHlwZWRlZiB2b2lkICgqRl9iY21vc19tc2dfaGFuZGxlcikoYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZCwgYmNtb3NfbXNnICptc2cpOwordHlwZWRlZiBiY21vc19lcnJubyAoKkZfYmNtb3NfbW9kdWxlX2luaXQpKGxvbmcgZGF0YSk7Cit0eXBlZGVmIHZvaWQgKCpGX2JjbW9zX21vZHVsZV9leGl0KShsb25nIGRhdGEpOworCisvKiogTWVzc2FnZSBoZWFkZXIgKi8KK3N0cnVjdCBiY21vc19tc2cKK3sKKyAgICBiY21vc19tc2dfaWQgICB0eXBlOyAgICAgICAgLyoqPCBNZXNzYWdlIHR5cGUgKi8KKyAgICBiY21vc19tc2dfaW5zdGFuY2UgaW5zdGFuY2U7LyoqPCBNZXNzYWdlIHJlY2lwaWVudCBpbnN0YW5jZSAoZS5nLiwgb3B0aWNhbCBsaW5rIGlkKSAqLworICAgIEZfYmNtb3NfbXNnX2hhbmRsZXIgaGFuZGxlcjsvKio8IE1lc3NhZ2UgaGFuZGxlci4gQ2FuIGJlIHNldCBieSB0aGUgc2VuZGVyIG9yIG1lc3NhZ2UgZGlzcGF0Y2hlciAqLworICAgIGJjbW9zX21vZHVsZV9pZCBzZW5kZXI7ICAgICAvKio8IFNlbmRlciBtb2R1bGUgKi8KKyAgICBTVEFJTFFfRU5UUlkoYmNtb3NfbXNnKSBuZXh0OyAvKio8IE5leHQgbWVzc2FnZSBwb2ludGVyICovCisgICAgdm9pZCAqZGF0YTsgICAgICAgICAgICAgICAgIC8qKjwgTWVzc2FnZSBkYXRhIHBvaW50ZXIgKi8KKyAgICB2b2lkICpzdGFydDsgICAgICAgICAgICAgICAgLyoqPCBNZXNzYWdlIGRhdGEgYmxvY2sgc3RhcnQgKGZvciByZWxlYXNlKSAqLworICAgIHVpbnQzMl90IHNpemU7ICAgICAgICAgICAgICAvKio8IE1lc3NhZ2UgZGF0YSBzaXplICovCisgICAgYmNtb3NfbXNnX3NlbmRfZmxhZ3Mgc2VuZF9mbGFnczsgICAgLyoqPCBGbGFncyB0aGUgbWVzc2FnZSB3YXMgc2VudCB3aXRoICovCisjZGVmaW5lIEJDTU9TX01TR19RVUVVRV9TSVpFX1VOTElNSVRFRCAgICAweEZGRkZGRkZGICAgICAgLyoqPCBVbmxpbWl0ZWQgcXVldWUgKi8KKyAgICB2b2lkICgqcmVsZWFzZSkoYmNtb3NfbXNnICopOyAgICAgICAvKio8IFJlbGVhc2UgY2FsbGJhY2sgKi8KKyAgICB2b2lkICgqZGF0YV9yZWxlYXNlKShiY21vc19tc2cgKik7ICAvKio8IERhdGEgcmVsZWFzZSBjYWxsYmFjay4gVXNlZCB3aGVuIG1lc3NhZ2UgaXMgcmVsZWFzZWQgdG8gbWVzc2FnZSBwb29sICovCit9OworCisvKiBIZWxwZXIgZnVuY3Rpb25zIHRoYXQgcGFjayAvIHVucGFjayBtZXNzYWdlIGhlYWRlciBmb3IgSVBDICovCisjaWZkZWYgQkNNT1NfTVNHX1FVRVVFX1JFTU9URV9TVVBQT1JUCisKKy8qKiBTaXplIG9mIG1lc3NhZ2UgaGVhZGVyIG9uIHRoZSBsaW5lIGZvciBJUEMgKi8KKyNkZWZpbmUgQkNNT1NfTVNHX0hEUl9TSVpFICAgICAgOAorCit2b2lkIGJjbW9zX21zZ19oZHJfcGFjayhjb25zdCBiY21vc19tc2cgKm1zZywgdWludDhfdCAqYnVmLCB1aW50MzJfdCBkYXRhX3NpemUpOwordm9pZCBiY21vc19tc2dfaGRyX3VucGFjayhjb25zdCB1aW50OF90ICpidWYsIGJjbW9zX21zZyAqbXNnKTsKKworI2VuZGlmCisKKy8qKiBDcmVhdGUgbWVzc2FnZSBxdWV1ZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgZXhwbGljaXRseSBpbiAidHJhZGl0aW9uYWwiIG1vZGUKKyAqIG9yIGltcGxpY2l0bHkgYnkgYmNtb3NfbW9kdWxlX2NyZWF0ZSgpLgorICogXHBhcmFtW2luLG91dF0gIHF1ZXVlICAgICAgICBRdWV1ZSBjb250cm9sIGJsb2NrCisgKiBccGFyYW1baW5dICAgICAgcGFybSAgICAgICAgIFF1ZXVlIHBhcmFtZXRlcnMKKyAqIFxyZXR1cm5zIDA9T0sgb3IgZXJyb3IgY29kZSA8MAorICovCitiY21vc19lcnJubyBiY21vc19tc2dfcXVldWVfY3JlYXRlKGJjbW9zX21zZ19xdWV1ZSAqcXVldWUsIGNvbnN0IGJjbW9zX21zZ19xdWV1ZV9wYXJtICpwYXJtKTsKKworLyoqIERlc3Ryb3kgcXVldWUKKyAqCisgKiBccGFyYW1baW5dICAgcXVldWUgICAgICAgICAgIFF1ZXVlIGhhbmRsZQorICogXHJldHVybnMgMD1PSyBvciBlcnJvciBjb2RlIDwwCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX21zZ19xdWV1ZV9kZXN0cm95KGJjbW9zX21zZ19xdWV1ZSAqcXVldWUpOworCisvKiogR2V0IHF1ZXVlIGluZm8KKyAqCisgKiBccGFyYW1baW5dICAgcXVldWUgICAgICAgICAgIFF1ZXVlIGhhbmRsZQorICogXHBhcmFtW291dF0gIGluZm8gICAgICAgICAgICBRdWV1ZSBpbmZvcm1hdGlvbgorICogXHJldHVybnMgMD1PSyBvciBlcnJvciBjb2RlIDwwCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX21zZ19xdWV1ZV9xdWVyeShjb25zdCBiY21vc19tc2dfcXVldWUgKnF1ZXVlLCBiY21vc19tc2dfcXVldWVfaW5mbyAqaW5mbyk7CisKKy8qKiBNZXNzYWdlIHF1ZXVlIGl0ZXJhdG9yCisgKiBccGFyYW1baW5dIHByZXYgICAgICBQcmV2aW91cyBxdWV1ZS4gKnByZXY9PU5VTEwgLSBnZXQgZmlyc3QKKyAqIFxyZXR1cm46IEJDTV9FUlJfT0ssIEJDTV9FUlJfTk9FTlQsIEJDTV9FUlJfTk9fTU9SRQorICovCitiY21vc19lcnJubyBiY21vc19tc2dfcXVldWVfZ2V0X25leHQoY29uc3QgYmNtb3NfbXNnX3F1ZXVlICoqcHJldik7CisKKy8qKiBDcmVhdGUgbWVzc2FnZSBxdWV1ZSBncm91cC4KKyAqCisgKiBRdWV1ZSBncm91cCBjb250YWlucyBjb25maWd1cmFibGUgbnVtYmVyIG9mIHF1ZXVlcy4gVGhlIHF1ZXVlcyBhcmUgZHJhaW5lZAorICogaW4gc3RyaWN0IHByaW9yaXR5LiBQcmlvcml0eSAwIGlzIHRoZSBoaWdoZXN0LgorICoKKyAqIFxwYXJhbVtpbixvdXRdICBxZ3JvdXAgICAgICAgUXVldWUgZ3JvdXAgY29udHJvbCBibG9jaworICogXHBhcmFtW2luXSAgICAgIHBhcm0gICAgICAgICBRdWV1ZSBncm91cCBwYXJhbWV0ZXJzCisgKiBccmV0dXJucyAwPU9LIG9yIGVycm9yIGNvZGUgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfbXNnX3Fncm91cF9jcmVhdGUoYmNtb3NfbXNnX3Fncm91cCAqcWdyb3VwLCBjb25zdCBiY21vc19tc2dfcWdyb3VwX3Bhcm0gKnBhcm0pOworCisvKiogRGVzdHJveSBxdWV1ZSBncm91cAorICoKKyAqIFxwYXJhbVtpbl0gICBxZ3JvdXAgICAgICAgUXVldWUgZ3JvdXAgaGFuZGxlCisgKiBccmV0dXJucyAwPU9LIG9yIGVycm9yIGNvZGUgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfbXNnX3Fncm91cF9kZXN0cm95KGJjbW9zX21zZ19xZ3JvdXAgKnFncm91cCk7CisKKy8qKiBHZXQgcXVldWUgZ3JvdXAgaW5mbworICoKKyAqIFxwYXJhbVtpbl0gICBxZ3JvdXAgICAgICAgUXVldWUgZ3JvdXAgaGFuZGxlCisgKiBccGFyYW1bb3V0XSAgaW5mbyAgICAgICAgIFF1ZXVlIGdyb3VwIGluZm9ybWF0aW9uCisgKiBccmV0dXJucyAwPU9LIG9yIGVycm9yIGNvZGUgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfbXNnX3Fncm91cF9xdWVyeShjb25zdCBiY21vc19tc2dfcWdyb3VwICpxZ3JvdXAsIGJjbW9zX21zZ19xZ3JvdXBfaW5mbyAqaW5mbyk7CisKKy8qKiBNZXNzYWdlIHF1ZXVlIGdyb3VwIGl0ZXJhdG9yCisgKiBccGFyYW1baW5dIHByZXYgICAgICBQcmV2aW91cyBxdWV1ZSBncm91cC4gKnByZXY9PU5VTEwgLSBnZXQgZmlyc3QKKyAqIFxyZXR1cm46IEJDTV9FUlJfT0ssIEJDTV9FUlJfTk9FTlQsIEJDTV9FUlJfTk9fTU9SRQorICovCitiY21vc19lcnJubyBiY21vc19tc2dfcWdyb3VwX2dldF9uZXh0KGNvbnN0IGJjbW9zX21zZ19xZ3JvdXAgKipwcmV2KTsKKworLyoqIFNlbmQgbWVzc2FnZSB0byBxdWV1ZQorICoKKyAqIFxwYXJhbVtpbl0gICBxdWV1ZSAgICAgICAgICAgUXVldWUgaGFuZGxlCisgKiBccGFyYW1baW5dICAgbXNnICAgICAgICAgICAgIE1lc3NhZ2UKKyAqIFxwYXJhbVtpbl0gICBmbGFncyAgICAgICAgICAgZmxhZ3MuIENvbWJpbmF0aW9uIG9mIFxyZWYgYmNtb3NfbXNnX3NlbmRfZmxhZ3MgYml0cworICoKKyAqIG1zZyBpcyByZWxlYXNlZCBhdXRvbWF0aWNhbGx5IHJlZ2FyZGxlc3Mgb2YgYmNtb3NfbXNnX3NlbmQoKSBvdXRjb21lLCB1bmxlc3MKKyAqIEJDTU9TX01TR19TRU5EX05PX0ZSRUVfT05fRVJST1IgZmxhZyBpcyBzZXQuCisgKgorICogXHJldHVybnMgMD1PSyBvciBlcnJvciBjb2RlIDwwCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX21zZ19zZW5kKGJjbW9zX21zZ19xdWV1ZSAqcXVldWUsIGJjbW9zX21zZyAqbXNnLCBiY21vc19tc2dfc2VuZF9mbGFncyBmbGFncyk7CisKKy8qKiBTZW5kIG1lc3NhZ2UgdG8gbW9kdWxlCisgKgorICogRm9yIG1vZHVsZSB0byBiZSBhYmxlIHRvIHJlY2VpdmUgdGhlIG1lc3NhZ2UsIGl0IG11c3QgYmUgcmVnaXN0ZXJlZAorICogdXNpbmcgYmNtb3NfbXNnX3JlZ2lzdGVyKCkKKyAqCisgKiBccGFyYW1baW5dICAgbW9kdWxlX2lkICAgICAgIE1vZHVsZSBpZAorICogXHBhcmFtW2luXSAgIG1zZyAgICAgICAgICAgICBNZXNzYWdlLiBtc2ctPmhhbmRsZXIgbXVzdCBiZSBzZXQKKyAqIFxwYXJhbVtpbl0gICBmbGFncyAgICAgICAgICAgZmxhZ3MuIENvbWJpbmF0aW9uIG9mIFxyZWYgYmNtb3NfbXNnX3NlbmRfZmxhZ3MgYml0cworICoKKyAqIG1zZyBpcyByZWxlYXNlZCBhdXRvbWF0aWNhbGx5IHJlZ2FyZGxlc3Mgb2YgYmNtb3NfbXNnX3NlbmRfdG9fbW9kdWxlKCkgb3V0Y29tZSwgdW5sZXNzCisgKiBCQ01PU19NU0dfU0VORF9OT19GUkVFX09OX0VSUk9SIGZsYWcgaXMgc2V0LgorICoKKyAqIFxyZXR1cm5zIDA9T0sgb3IgZXJyb3IgY29kZSA8MAorICovCitiY21vc19lcnJubyBiY21vc19tc2dfc2VuZF90b19tb2R1bGUoYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZCwgYmNtb3NfbXNnICptc2csIGJjbW9zX21zZ19zZW5kX2ZsYWdzIGZsYWdzKTsKKworLyoqIFNlbmQgbWVzc2FnZSB0byBxdWV1ZSBncm91cAorICoKKyAqIFxwYXJhbVtpbl0gICBxZ3JvdXAgICAgICAgICAgUXVldWUgZ3JvdXAgaGFuZGxlCisgKiBccGFyYW1baW5dICAgbXNnICAgICAgICAgICAgIE1lc3NhZ2UKKyAqIFxwYXJhbVtpbl0gICBwcnR5ICAgICAgICAgICAgTWVzc2FnZSBwcmlvcml0eSBpbiByYW5nZSAwLW5xdWV1ZXNfaW5fZ3JvdXAtMS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCBwcmlvcml0eSBpcyB0aGUgaGlnaGVzdC4gSWYgTUFYIG51bWJlciBvZiBtZXNzYWdlcyBhcmUgYWxyZWFkeSBxdWV1ZXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHF1ZXVlIGdyb3VwLCBzZW5kaW5nIG1lc3NhZ2UgY2FuIGxlYXZlIHRvIGRpc2NhcmQgb2YgdGhlIGhlYWQgbWVzc2FnZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZWQgYXQgbG93ZXIgcHJpb3JpdHkKKyAqIFxwYXJhbVtpbl0gICBmbGFncyAgICAgICAgICAgQkNNT1NfTVNHX1NFTkRfQVVUT19GUkVFIG9yIEJDTU9TX01TR19TRU5EX05PX0ZSRUVfT05fRVJST1IgZmxhZworICoKKyAqCisgKiBtc2cgaXMgcmVsZWFzZWQgYXV0b21hdGljYWxseSByZWdhcmRsZXNzIG9mIGJjbW9zX21zZ19zZW5kX3RvX3Fncm91cCgpIG91dGNvbWUsIHVubGVzcworICogQkNNT1NfTVNHX1NFTkRfTk9fRlJFRV9PTl9FUlJPUiBmbGFnIGlzIHNldC4KKyAqCisgKiBccmV0dXJucyAwPU9LIG9yIGVycm9yIGNvZGUgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfbXNnX3NlbmRfdG9fcWdyb3VwKGJjbW9zX21zZ19xZ3JvdXAgKnFncm91cCwgYmNtb3NfbXNnICptc2csIGJjbW9zX3Fncm91cF9wcnR5IHBydHksCisgICAgYmNtb3NfbXNnX3NlbmRfZmxhZ3MgZmxhZ3MpOworCisvKiogR2V0IG1lc3NhZ2UgZnJvbSB0aGUgaGVhZCBvZiBtZXNzYWdlIHF1ZXVlCisgKgorICogVGhlIGZ1bmN0aW9uIGNhbiBsZWFkIHRvIHRoZSBjYWxsaW5nIHRhc2sgYmVpbmcgc3VzcGVuZGVkIGZvciBhIHBlcmlvZAorICogb2YgdGltZSBvciBpbmRlZmluaXRlbHksIHVudGlsIG1lc3NhZ2UgaXMgc3VibWl0dGVkIHRvIHRoZSBxdWV1ZS5cbgorICogVGhlIGZ1bmN0aW9uIGlzIG9ubHkgdXNlZCBpbiAidHJhZGl0aW9uYWwgdGFza3MiIChzZWUgXHJlZiBzeXN0ZW1fbW9kZWwpLgorICoKKyAqIFxwYXJhbVtpbl0gICBxdWV1ZSAgICAgICAgICAgUXVldWUgaGFuZGxlCisgKiBccGFyYW1baW5dICAgdGltZW91dCAgICAgICAgIHRpbWVvdXQuIGNhbiBiZSAwLCB0aW1lIGluIHVzIG9yIFxyZWYgQkNNT1NfV0FJVF9GT1JFVkVSCisgKiBccGFyYW1bb3V0XSAgbXNnICAgICAgICAgICAgIE1lc3NhZ2UgaGFuZGxlCisgKiBccmV0dXJucyAwPU9LIG9yIGVycm9yIGNvZGUgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfbXNnX3JlY3YoYmNtb3NfbXNnX3F1ZXVlICpxdWV1ZSwgdWludDMyX3QgdGltZW91dCwgYmNtb3NfbXNnICoqbXNnKTsKKworLyoqIEdldCBoaWdoZXN0IHByaW9yaXR5IG1lc3NhZ2UgZnJvbSBxdWV1ZSBncm91cAorICoKKyAqIFRoZSBmdW5jdGlvbiBjYW4gbGVhZCB0byB0aGUgY2FsbGluZyB0YXNrIGJlaW5nIHN1c3BlbmRlZCBmb3IgYSBwZXJpb2QKKyAqIG9mIHRpbWUgb3IgaW5kZWZpbml0ZWx5LCB1bnRpbCBtZXNzYWdlIGlzIHN1Ym1pdHRlZCB0byB0aGUgcXVldWUgZ3JvdXAuXG4KKyAqIFRoZSBmdW5jdGlvbiBpcyBvbmx5IHVzZWQgaW4gInRyYWRpdGlvbmFsIHRhc2tzIiAoc2VlIFxyZWYgc3lzdGVtX21vZGVsKS4KKyAqCisgKiBccGFyYW1baW5dICAgcWdyb3VwICAgICAgICAgIFF1ZXVlIGdyb3VwIGhhbmRsZQorICogXHBhcmFtW2luXSAgIHRpbWVvdXQgICAgICAgICB0aW1lb3V0LiBjYW4gYmUgMCwgdGltZSBpbiB1cyBvciBccmVmIEJDTU9TX1dBSVRfRk9SRVZFUgorICogXHBhcmFtW291dF0gIG1zZyAgICAgICAgICAgICBNZXNzYWdlIGhhbmRsZQorICogXHJldHVybnMgMD1PSyBvciBlcnJvciBjb2RlIDwwCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX21zZ19yZWN2X2Zyb21fcWdyb3VwKGJjbW9zX21zZ19xZ3JvdXAgKnFncm91cCwgdWludDMyX3QgdGltZW91dCwgYmNtb3NfbXNnICoqbXNnKTsKKworLyoqIERpc3BhdGNoIG1lc3NhZ2UuIFNlbmQgdG8gbW9kdWxlIHRoYXQgcmVnaXN0ZXJlZCBmb3IgaXQuCisgKgorICogVGhlIG1lc3NhZ2UgbXVzdCBiZSByZWdpc3RlcmVkIHVzaW5nIGJjbW9zX21zZ19yZWdpc3RlcigpCisgKgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgdXNlZCBpZiB0aGUgbWVzc2FnZSBzZW5kZXIgZG9lc24ndCBrbm93IHRoZSB0YXJnZXQgbW9kdWxlIGFuZC9vcgorICogbWVzc2FnZSBoYW5kbGluZyBjYWxsYmFjay4KKyAqCisgKiBccGFyYW1baW5dICAgbXNnICAgICAgICAgICAgIE1lc3NhZ2UgaGFuZGxlCisgKiBccGFyYW1baW5dICAgZmxhZ3MgICAgICAgICAgIGZsYWdzLiBDb21iaW5hdGlvbiBvZiBccmVmIGJjbW9zX21zZ19zZW5kX2ZsYWdzIGJpdHMKKyAqCisgKiBtc2cgaXMgcmVsZWFzZWQgYXV0b21hdGljYWxseSByZWdhcmRsZXNzIG9mIGJjbW9zX21zZ19kaXNwYXRjaCgpIG91dGNvbWUsIHVubGVzcworICogQkNNT1NfTVNHX1NFTkRfTk9fRlJFRV9PTl9FUlJPUiBmbGFnIGlzIHNldC4KKyAqCisgKiBccmV0dXJucyAwPU9LIG9yIGVycm9yIGNvZGUgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfbXNnX2Rpc3BhdGNoKGJjbW9zX21zZyAqbXNnLCBiY21vc19tc2dfc2VuZF9mbGFncyBmbGFncyk7CisKKy8qKiBSZWdpc3RlciBtZXNzYWdlIGZvciAicHVzaC1tb2RlIiBkZWxpdmVyeS4KKyAqCisgKiBXaGVuIHJlZ2lzdGVyZWQgbWVzc2FnZSBpcyBzZW50IHRvIHRoZSB0YXJnZXQgbW9kdWxlIGFuZAorICogdGhlIG1vZHVsZSdzIHRhc2sgd2FrZXMgdXAsIG1lc3NhZ2UgaGFuZGxlciBpcyBjYWxsZWQgaW4gdGhlIG1vZHVsZSdzIGNvbnRleHQuCisgKgorICogXHBhcmFtW2luXSAgIG1zZ190eXBlICAgICAgICBNZXNzYWdlIHR5cGUKKyAqIFxwYXJhbVtpbl0gICBpbnN0YW5jZSAgICAgICAgTWVzc2FnZSB0eXBlIGluc3RhbmNlCisgKiBccGFyYW1baW5dICAgbW9kdWxlX2lkICAgICAgIFRhcmdldCBtb2R1bGUgaWQKKyAqIFxwYXJhbVtpbl0gICBoYW5kbGVyICAgICAgICAgTWVzc2FnZSBoYW5kbGVyCisgKiBccmV0dXJucyAwPU9LIG9yIGVycm9yIGNvZGUgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfbXNnX3JlZ2lzdGVyKGJjbW9zX21zZ19pZCBtc2dfdHlwZSwgYmNtb3NfbXNnX2luc3RhbmNlIGluc3RhbmNlLAorICAgIGJjbW9zX21vZHVsZV9pZCBtb2R1bGVfaWQsIEZfYmNtb3NfbXNnX2hhbmRsZXIgaGFuZGxlcik7CisKKy8qKiBVbi1yZWdpc3RlciBtZXNzYWdlIHJlZ2lzdGVyZWQgYnkgYmNtb3NfbXNnX3JlZ2lzdGVyKCkKKyAqCisgKiBccGFyYW1baW5dICAgbXNnX3R5cGUgICAgICAgIE1lc3NhZ2UgdHlwZQorICogXHBhcmFtW2luXSAgIGluc3RhbmNlICAgICAgICBNZXNzYWdlIHR5cGUgaW5zdGFuY2UKKyAqIFxwYXJhbVtpbl0gICBtb2R1bGVfaWQgICAgICAgVGFyZ2V0IG1vZHVsZSBpZAorICogXHJldHVybnMgMD1PSyBvciBlcnJvciBjb2RlIDwwCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX21zZ191bnJlZ2lzdGVyKGJjbW9zX21zZ19pZCBtc2dfdHlwZSwgYmNtb3NfbXNnX2luc3RhbmNlIGluc3RhbmNlLAorICAgIGJjbW9zX21vZHVsZV9pZCBtb2R1bGVfaWQpOworCisvKiogUHV0IHRoZSBPUyBtZXNzYWdlIGluZnJhc3RydWN0dXJlIGluICJzaHV0ZG93biBtb2RlIi4KKyAqCisgKiBXaGVuIGluIHNodXRkb3duIG1vZGUsIGJjbW9zX21zZ19kaXNwYXRjaCgpIHdpbGwgcmV0dXJuIEJDTV9FUlJfT0sgaW5zdGVhZCBvZiBCQ01fRVJSX05PRU5UIHdoZW4gYSBoYW5kbGVyIGlzIG5vdAorICogZm91bmQgZm9yIHRoZSBtZXNzYWdlLiBBZGRpdGlvbmFsbHksIGJjbW9zX21zZ19kaXNwYXRjaCgpIGJlY29tZXMgc2FmZSB0byBjYWxsIGNvbmN1cnJlbnRseSB3aXRoCisgKiBiY21vc19tc2dfdW5yZWdpc3RlcigpICh0aGlzIGlzIG5vdCB0cnVlIGluIG5vcm1hbCBvcGVyYXRpb24pLgorICoKKyAqIFxwYXJhbVtpbl0gICBzaHV0ZG93bl9tb2RlICAgV2hldGhlciBvciBub3QgdG8gZW5hYmxlIHNodXRkb3duIG1vZGUKKyAqLwordm9pZCBiY21vc19tc2dfc2h1dGRvd25fbW9kZV9zZXQoYmNtb3NfYm9vbCBzaHV0ZG93bl9tb2RlKTsKKworLyoqIEdldHMgd2hldGhlciBvciBub3QgdGhlIE9TIG1lc3NhZ2UgaW5mcmFzdHJ1Y3R1cmUgaXMgY3VycmVudGx5IGluICJzaHV0ZG93biBtb2RlIi4KKyAqIFxyZXR1cm5zIEJDTU9TX1RSVUUgaWYgd2UgYXJlIGluIHNodXRkb3duIG1vZGUsIEJDTU9TX0ZBTFNFIG90aGVyd2lzZQorICovCitiY21vc19ib29sIGJjbW9zX21zZ19zaHV0ZG93bl9tb2RlX2dldCh2b2lkKTsKKworLyoqIEhlbHBlciB0eXBlIGZvciBzdG9yaW5nIG1lc3NhZ2UgdHlwZXMgYWxvbmdzaWRlIHRoZWlyIGhhbmRsZXJzLiAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21vc19tc2dfaWQgbXNnX3R5cGU7CisgICAgRl9iY21vc19tc2dfaGFuZGxlciBoYW5kbGVyOworfSBiY21vc19tc2dfaWQyaGFuZGxlcjsKKworLyoqIE1lc3NhZ2UgcG9vbCAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb3NfbXNnX3Bvb2wgYmNtb3NfbXNnX3Bvb2w7CisKKy8qKiBNZXNzYWdlIHBvb2wgcGFyYW1ldGVycyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb3NfbXNnX3Bvb2xfcGFybQoreworICAgIGNvbnN0IGNoYXIgKm5hbWU7ICAgICAgICAgICAvKio8IFBvb2wgbmFtZSAqLworICAgIHVpbnQzMl90IHNpemU7ICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBtZXNzYWdlcyBpbiB0aGUgcG9vbCAqLworICAgIHVpbnQzMl90IGRhdGFfc2l6ZTsgICAgICAgICAvKio8IE1lc3NhZ2UgZGF0YSBzaXplICovCisgICAgdWludDMyX3QgZmxhZ3M7ICAgICAgICAgICAgIC8qKjwgVEJEIGZsYWdzICovCisgICAgdm9pZCAoKmRhdGFfcmVsZWFzZSkoYmNtb3NfbXNnICptc2cpOyAvKio8IE9wdGlvbmFsIGRhdGEgcmVsZWFzZSBjYWxsYmFjay4gQ2FsbGVkIHdoZW4gbWVzc2FnZSBpcyByZWxlYXNlZCB0byB0aGUgcG9vbCAqLworfSBiY21vc19tc2dfcG9vbF9wYXJtOworCisvKiogTWVzc2FnZSBwb29sIHN0YXRpc3RpY3MgKi8KK3R5cGVkZWYgYmNtb3NfYmxrX3Bvb2xfc3RhdCBiY21vc19tc2dfcG9vbF9zdGF0OworCisvKiogTWVzc2FnZSBwb29sIGluZm8gKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9zX21zZ19wb29sX2luZm8KK3sKKyAgICBiY21vc19tc2dfcG9vbF9wYXJtIHBhcm07ICAgLyoqPCBQb29sIHBhcmFtZXRlcnMgKi8KKyAgICBiY21vc19tc2dfcG9vbF9zdGF0IHN0YXQ7ICAgLyoqPCBQb29sIHN0YXRpc3RpY3MgKi8KK30gYmNtb3NfbXNnX3Bvb2xfaW5mbzsKKworLyoqIENyZWF0ZSBtZXNzYWdlIHBvb2wKKyAqCisgKiBDcmVhdGUgcG9vbCBjb250YWluaW5nIHByZS1hbGxvY2F0ZWQgbWVzc2FnZXMgd2l0aCBzcGVjaWZpZWQgZGF0YSBzaXplCisgKiBccGFyYW1baW5dICAgcG9vbCAgICBNZXNzYWdlIHBvb2wgaGFuZGxlCisgKiBccGFyYW1baW5dICAgcGFybSAgICBNZXNzYWdlIHBvb2wgcGFyYW1ldGVycworICogXHJldHVybnMgMD1PSyBvciBlcnJvciBjb2RlIDwwCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX21zZ19wb29sX2NyZWF0ZShiY21vc19tc2dfcG9vbCAqcG9vbCwgY29uc3QgYmNtb3NfbXNnX3Bvb2xfcGFybSAqcGFybSk7CisKKy8qKiBEZXN0cm95IG1lc3NhZ2UgcG9vbAorICoKKyAqIEFsbCBtZXNzYWdlcyBtdXN0IGJlIHJlbGVhc2VkIHRvIHRoZSBwb29sIGJlZm9yZSBpdCBjYW4gYmUgZGVzdHJveWVkLgorICoKKyAqIFxwYXJhbVtpbl0gICBwb29sICAgIE1lc3NhZ2UgcG9vbCBoYW5kbGUKKyAqIFxyZXR1cm5zIDA9T0sgb3IgZXJyb3IgY29kZSA8MAorICovCitiY21vc19lcnJubyBiY21vc19tc2dfcG9vbF9kZXN0cm95KGJjbW9zX21zZ19wb29sICpwb29sKTsKKworLyoqIEFsbG9jYXRlIG1lc3NhZ2UgZnJvbSBwb29sCisgKgorICogVGhlIHBvb2wgbXVzdCBiZSBjcmVhdGVkIHVzaW5nIGJjbW9zX3Bvb2xfY3JlYXRlKCkKKyAqIFxwYXJhbVtpbl0gICBwb29sICAgIE1lc3NhZ2UgcG9vbCBoYW5kbGUKKyAqIFxyZXR1cm5zICAgICBtc2cgcG9pbnRlciBvciBOVUxMIGlmIHRoZSBwb29sIGlzIGVtcHR5LgorICogImRhdGEiIGFuZCAicmVsZWFzZSIgZmllbGRzIGluIHRoZSByZXR1cm5lZCBtZXNzYWdlIGFyZSBwcmUtc2V0CisgKiBPbmNlIG5vIGxvbmdlciBuZWVkZWQsIHRoZSBtZXNzYWdlIG11c3QgYmUgcmVsZWFzZWQgdXNpbmcgYmNtb3NfbXNnX2ZyZWUoKQorICovCitiY21vc19tc2cgKmJjbW9zX21zZ19wb29sX2FsbG9jKGJjbW9zX21zZ19wb29sICpwb29sKTsKKworLyoqIEFsbG9jYXRlIG1lc3NhZ2UgZnJvbSBwb29sIGFuZCBjbGVhciBkYXRhCisgKgorICogVGhlIHBvb2wgbXVzdCBiZSBjcmVhdGVkIHVzaW5nIGJjbW9zX3Bvb2xfY3JlYXRlKCkKKyAqIFxwYXJhbVtpbl0gICBwb29sICAgIE1lc3NhZ2UgcG9vbCBoYW5kbGUKKyAqIFxyZXR1cm5zICAgICBtc2cgcG9pbnRlciBvciBOVUxMIGlmIHRoZSBwb29sIGlzIGVtcHR5LgorICogImRhdGEiIGFuZCAicmVsZWFzZSIgZmllbGRzIGluIHRoZSByZXR1cm5lZCBtZXNzYWdlIGFyZSBwcmUtc2V0CisgKiBPbmNlIG5vIGxvbmdlciBuZWVkZWQsIHRoZSBtZXNzYWdlIG11c3QgYmUgcmVsZWFzZWQgdXNpbmcgYmNtb3NfbXNnX2ZyZWUoKQorICovCitzdGF0aWMgaW5saW5lIGJjbW9zX21zZyAqYmNtb3NfbXNnX3Bvb2xfY2FsbG9jKGJjbW9zX21zZ19wb29sICpwb29sKQoreworICAgIGJjbW9zX21zZyAqbXNnID0gYmNtb3NfbXNnX3Bvb2xfYWxsb2MocG9vbCk7CisgICAgaWYgKG1zZykKKyAgICB7CisgICAgICAgIG1lbXNldChtc2ctPmRhdGEsIDAsIG1zZy0+c2l6ZSk7CisgICAgfQorICAgIHJldHVybiBtc2c7Cit9CisKKy8qKiBHZXQgcG9vbCBpbmZvCisgKgorICogVGhlIHBvb2wgbXVzdCBiZSBjcmVhdGVkIHVzaW5nIGJjbW9zX3Bvb2xfY3JlYXRlKCkKKyAqIFxwYXJhbVtpbl0gICBwb29sICAgIE1lc3NhZ2UgcG9vbCBoYW5kbGUKKyAqIFxwYXJhbVtvdXRdICBpbmZvICAgIE1lc3NhZ2UgcG9vbCBpbmZvCisgKiBccmV0dXJucyAwPU9LIG9yIGVycm9yIGNvZGUgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfbXNnX3Bvb2xfcXVlcnkoY29uc3QgYmNtb3NfbXNnX3Bvb2wgKnBvb2wsIGJjbW9zX21zZ19wb29sX2luZm8gKmluZm8pOworCisvKiogTWVzc2FnZSBwb29sIGl0ZXJhdG9yCisgKiBccGFyYW1baW5dIHByZXYgICAgICBQcmV2aW91cyBtZXNzYWdlIHBvb2wuICpwcmV2PT1OVUxMIC0gZ2V0IGZpcnN0CisgKiBccmV0dXJuOiBCQ01fRVJSX09LLCBCQ01fRVJSX05PRU5ULCBCQ01fRVJSX05PX01PUkUKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfbXNnX3Bvb2xfZ2V0X25leHQoY29uc3QgYmNtb3NfbXNnX3Bvb2wgKipwcmV2KTsKKworLyoqIEB9IHN5c3RlbV9tc2cgKi8KKworLyoqIFxhZGR0b2dyb3VwIHN5c3RlbV9tb2R1bGUKKyAqIEB7CisgKi8KKworLyoqIE1heCBudW1iZXIgb2YgbW9kdWxlcyBwZXIgdGFzay4gTXVzdCBiZSA8PSAzMiAqLworI2RlZmluZSBCQ01PU19NQVhfTU9EVUxFU19QRVJfVEFTSyAgICAgICAgOAorCisvKiogTW9kdWxlIHBhcmFtZXRlcnMgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgYmNtb3NfbXNnX3F1ZXVlX3Bhcm0gcXBhcm07ICAvKio8IE1lc3NhZ2UgcXVldWUgcGFyYW1hdGVycyAqLworICAgIEZfYmNtb3NfbW9kdWxlX2luaXQgaW5pdDsgICAgLyoqPCBJbml0IGNhbGxiYWNrICovCisgICAgRl9iY21vc19tb2R1bGVfZXhpdCBleGl0OyAgICAvKio8IEV4aXQgY2FsbGJhY2sgKi8KKyAgICBsb25nIGRhdGE7ICAgICAgICAgICAgICAgICAgIC8qKjwgTW9kdWxlIGNvbnRleHQgaW5pdGlhbCB2YWx1ZS4gQWxzbyBwYXNzZWQgdG8gaW5pdCBhbmQgZXhpdCBjYWxsYmFja3MgKi8KK30gYmNtb3NfbW9kdWxlX3Bhcm07CisKKy8qKiBNb2R1bGUgY29udHJvbCBibG9jayAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb3NfbW9kdWxlIGJjbW9zX21vZHVsZTsKKworLyoqIFJlZ2lzdGVyIG1vZHVsZQorICoKKyAqIFxwYXJhbVtpbl0gICBtb2R1bGVfaWQgICAgICAgTW9kdWxlIGlkCisgKiBccGFyYW1baW5dICAgdGFzayAgICAgICAgICAgIE93bmVyIHRhc2sgSUQKKyAqIFxwYXJhbVtpbl0gICBwYXJtICAgICAgICAgICAgTW9kdWxlIHBhcmFtZXRlcnMKKyAqIFxyZXR1cm5zIDA9T0sgb3IgZXJyb3IgY29kZSA8MAorICovCitiY21vc19lcnJubyBiY21vc19tb2R1bGVfY3JlYXRlKGJjbW9zX21vZHVsZV9pZCBtb2R1bGVfaWQsIGJjbW9zX3Rhc2sgKnRhc2ssIGJjbW9zX21vZHVsZV9wYXJtICpwYXJtKTsKKworLyoqIFVuLXJlZ2lzdGVyIG1vZHVsZQorICoKKyAqIFxwYXJhbVtpbl0gICBtb2R1bGVfaWQgICAgICAgTW9kdWxlIGlkCisgKiBccmV0dXJucyAwPU9LIG9yIGVycm9yIGNvZGUgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfbW9kdWxlX2Rlc3Ryb3koYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZCk7CisKKy8qKiBHZXQgY3VycmVudCBtb2R1bGUgaWQgaW4gdGhlIGN1cnJlbnQgdGFzaworICoKKyAqIFxyZXR1cm5zIG1vZHVsZV9pZAorICovCitiY21vc19tb2R1bGVfaWQgYmNtb3NfbW9kdWxlX2N1cnJlbnQodm9pZCk7CisKKy8qKiBHZXQgbW9kdWxlIGNvbnRleHQKKyAqCisgKiBNb2R1bGUgY29udGV4dCBpcyBpbml0aWFsaXplZCBhcyBtb2R1bGVfcGFybS5kYXRhIGFuZCBjYW4gYmUgbW9kaWZpZWQgdXNpbmcKKyAqIGJjbW9zX21vZHVsZV9jb250ZXh0X3NldCgpCisgKgorICogXHBhcmFtW2luXSAgIG1vZHVsZV9pZCAgICAgICBNb2R1bGVfaWQKKyAqIFxyZXR1cm5zIGNvbnRleHQgcG9pbnRlciBzZXQgYnkgYmNtb3NfbW9kdWxlX2NvbnRleHRfc2V0KCkgb3IKKyAqCisgKiBOVUxMIGlmIG1vZHVsZV9pZCBpcyBpbnZhbGlkIG9yIGNvbnRleHQgaXMgbm90IHNldC4KKyAqLwordm9pZCAqYmNtb3NfbW9kdWxlX2NvbnRleHQoYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZCk7CisKKy8qKiBTZXQgbW9kdWxlIGNvbnRleHQKKyAqCisgKiBDb250ZXh0IGlzIGFuIGFyYml0cmFyeSBzdHJ1Y3R1cmUgdXNlZCB0byBzdG9yZSBtb2R1bGUtc3BlY2lmaWMgZGF0YS4KKyAqIFVzdWFsbHkgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBtb2R1bGUgaW5pdCgpIGNhbGxiYWNrCisgKgorICogXHBhcmFtW2luXSAgIG1vZHVsZV9pZCAgICAgICBNb2R1bGVfaWQKKyAqIFxwYXJhbVtpbl0gICBjb250ZXh0ICAgICAgICAgTW9kdWxlIGNvbnRleHQgcG9pbnRlcgorICogXHJldHVybnMgMD1PSyBvciBlcnJvciBjb2RlIDwwCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX21vZHVsZV9jb250ZXh0X3NldChiY21vc19tb2R1bGVfaWQgbW9kdWxlX2lkLCB2b2lkICpjb250ZXh0KTsKKworLyogbW9kdWxlIGNvbnRyb2wgYmxvY2tzICovCitleHRlcm4gYmNtb3NfbW9kdWxlICpiY21vc19tb2R1bGVzW0JDTU9TX01PRFVMRV9JRF9fTlVNX09GXTsKKworc3RhdGljIGlubGluZSBiY21vc19tb2R1bGUgKl9iY21vc19tb2R1bGVfZ2V0KGJjbW9zX21vZHVsZV9pZCBtb2R1bGVfaWQpCit7CisgICAgYmNtb3NfbW9kdWxlICptb2R1bGUgPSBiY21vc19tb2R1bGVzW21vZHVsZV9pZF07CisgICAgaWYgKCh1bnNpZ25lZCltb2R1bGVfaWQgPj0gQkNNT1NfTU9EVUxFX0lEX19OVU1fT0YpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBtb2R1bGU7Cit9CisKKy8qKiBRdWVyeSBtb2R1bGUKKyAqCisgKiBccGFyYW1baW5dICAgbW9kdWxlX2lkICAgICAgIE1vZHVsZV9pZAorICogXHBhcmFtW291dF0gIHRhc2sgICAgICAgICAgICBUYXNrIHRoYXQgb3ducyB0aGUgbW9kdWxlCisgKiBccGFyYW1bb3V0XSAgaW5mbyAgICAgICAgICAgIE1vZHVsZSBxdWV1ZSBpbmZvCisgKiBccmV0dXJucyAwPU9LIG9yIGVycm9yIGNvZGUgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfbW9kdWxlX3F1ZXJ5KGJjbW9zX21vZHVsZV9pZCBtb2R1bGVfaWQsIGNvbnN0IGJjbW9zX3Rhc2sgKip0YXNrLCBiY21vc19tc2dfcXVldWVfaW5mbyAqaW5mbyk7CisKKy8qKiBAfSBzeXN0ZW1fbW9kdWxlICovCisKKy8qKiBcYWRkdG9ncm91cCBzeXN0ZW1fZXZlbnQKKyAqIEB7CisgKi8KKworLyoqIFJlZ2lzdGVyZWQgZXZlbnQgaGFuZGxlciAqLwordHlwZWRlZiB2b2lkICgqRl9iY21vc19ldmVudF9oYW5kbGVyKShiY21vc19ldmVudF9pZCBldmVudF9pZCwgdWludDMyX3QgYWN0aXZlX2JpdHMpOworCisvKiogRXZlbnQgcGFyYW1ldGVycyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBjb25zdCBjaGFyICpuYW1lOyAgICAgICAgICAgICAgICAgICAvKio8IEV2ZW50IHNldCBuYW1lICovCisgICAgYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZDsgICAgICAgICAgLyoqPCBNb2R1bGUgaWQuIFRoZSBtb2R1bGUgbXVzdCBiZSByZWdpc3RlcmVkICovCisgICAgdWludDMyX3QgbWFzazsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBFdmVudCBiaXRzIG1vZHVsZSBpcyBpbnRlcmVzdGVkIGluICovCisgICAgRl9iY21vc19ldmVudF9oYW5kbGVyIGhhbmRsZXI7ICAgICAgLyoqPCBFdmVudCBoYW5kbGVyLiBDYWxsZWQgaW4gbW9kdWxlJ3MgY29udGV4dCAqLworICAgIHVpbnQzMl90IGZsYWdzOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVEJEIGZsYWdzLiBFLmcuLCBpbnRlci1jb3JlICovCit9IGJjbW9zX2V2ZW50X3Bhcm07CisKKy8qKiBFdmVudCBjb250cm9sIGJsb2NrICovCit0eXBlZGVmIHN0cnVjdCBiY21vc19ldmVudCBiY21vc19ldmVudDsKKworLyoqIENyZWF0ZSBldmVudCBzZXQKKyAqCisgKiBccGFyYW1baW5dICAgZXZlbnRfaWQgICAgICAgIEV2ZW50IHNldCBpZAorICogXHBhcmFtW2luXSAgIHBhcm0gICAgICAgICAgICBFdmVudCBwYXJhbWV0ZXJzLiBVc2VkIGluICJpbnRlZ3JhdGlvbiIgbW9kZS4gTlVMTCBpbiAidHJhZGl0aW9uYWwiIG1vZGUKKyAqIFxyZXR1cm5zIDA9T0sgb3IgZXJyb3IgY29kZSA8MAorICovCitiY21vc19lcnJubyBiY21vc19ldmVudF9jcmVhdGUoYmNtb3NfZXZlbnRfaWQgZXZlbnRfaWQsIGJjbW9zX2V2ZW50X3Bhcm0gKnBhcm0pOworCisvKiogRGVzdHJveSBldmVudCBzZXQgY3JlYXRlZCBieSBiY21vc19ldmVudF9jcmVhdGUoKQorICoKKyAqIFxwYXJhbVtpbl0gICBldmVudF9pZCAgICAgICAgRXZlbnQgc2V0IGlkCisgKiBccmV0dXJucyAwPU9LIG9yIGVycm9yIGNvZGUgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfZXZlbnRfZGVzdHJveShiY21vc19ldmVudF9pZCBldmVudF9pZCk7CisKKy8qKiBSYWlzZSBldmVudAorICoKKyAqIFJhaXNlZCBldmVudCBpcyBkZWxpdmVyZWQgdG8gbW9kdWxlKHMpIHRoYXQgcmVnaXN0ZXJlZCBmb3IgaXQKKyAqIHVzaW5nIGJjbW9zX2V2ZW50X3JlZ2lzdGVyKCkgb3IgdG8gdGhlIHRhc2sgd2FpdGluZyBmb3IgZXZlbnQKKyAqIHVzaW5nIGJjbW9zX2V2ZW50X3JlY3YoKQorICoKKyAqIFxwYXJhbVtpbl0gICBldmVudF9pZCAgICAgICAgRXZlbnQgc2V0IGlkCisgKiBccGFyYW1baW5dICAgYWN0aXZlX2JpdHMgICAgIEFjdGl2ZSBiaXQgbWFzaworICogXHJldHVybnMgMD1PSyBvciBlcnJvciBjb2RlIDwwLiBDYW4gb25seSBmYWlsIGlmIGV2ZW50IGlzIG5vdCByZWdpc3RlcmVkCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX2V2ZW50X3JhaXNlKGJjbW9zX2V2ZW50X2lkIGV2ZW50X2lkLCB1aW50MzJfdCBhY3RpdmVfYml0cyk7CisKKy8qKiBXYWl0IGZvciBldmVudAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbiAidHJhZGl0aW9uYWwiIG1vZGUuXG4KKyAqIFRoZSBjYWxsZXIgY2FuIGJsb2NrIGZvciBhIHRpbWUgb3IgaW5kZWZpbml0ZWx5CisgKgorICogXHBhcmFtW2luXSAgIGV2ZW50X2lkICAgICAgICBFdmVudCBzZXQgaWQKKyAqIFxwYXJhbVtpbl0gICBtYXNrICAgICAgICAgICAgSW50ZXJlc3RpbmcgYml0cy4gVGhlIGZ1bmN0aW9ucyByZXR1cm5zIHdoZW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSB0aW1lb3V0IGV4cGlyZXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBldmVudCB3aXRoIChhY3RpdmVfYml0cyAmIG1hc2spICE9IDAgaXMgcmFpc2VkCisgKiBccGFyYW1baW5dICAgdGltZW91dCAgICAgICAgIHRpbWVvdXQuIGNhbiBiZSAwLCB0aW1lIGluIHVzIG9yIFxyZWYgQkNNT1NfV0FJVF9GT1JFVkVSCisgKiBccGFyYW1bb3V0XSAgYWN0aXZlX2JpdHMgICAgIGFjdGl2ZSBiaXRzIGluIHRoZSBldmVudCBzZXQuIHZhbGlkIG9ubHkgaWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgMAorICogXHJldHVybnMgMD1PSyBvciBlcnJvciBjb2RlIDwwCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX2V2ZW50X3JlY3YoYmNtb3NfZXZlbnRfaWQgZXZlbnRfaWQsIHVpbnQzMl90IG1hc2ssCisgICAgdWludDMyX3QgdGltZW91dCwgdWludDMyX3QgKmFjdGl2ZV9iaXRzKTsKKworLyogRXZlbnQgc2V0IGFycmF5ICovCitleHRlcm4gYmNtb3NfZXZlbnQgKmJjbW9zX2V2ZW50c1tCQ01PU19FVkVOVF9JRF9fTlVNX09GXTsKKworLyogR2V0IGV2ZW50IGdpdmVybiB0aGUgZXZlbnQgaWQgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfZXZlbnQgKl9iY21vc19ldmVudF9nZXQoYmNtb3NfZXZlbnRfaWQgZXZlbnRfaWQpCit7CisgICAgYmNtb3NfZXZlbnQgKmV2ID0gYmNtb3NfZXZlbnRzW2V2ZW50X2lkXTsKKyAgICBpZiAoKHVuc2lnbmVkKWV2ZW50X2lkID49IEJDTU9TX0VWRU5UX0lEX19OVU1fT0YpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBldjsKK30KKworLyoqIEB9IHN5c3RlbV9ldmVudCAqLworCisvKiogXGFkZHRvZ3JvdXAgc3lzdGVtX3RpbWVyCisgKiBAeworICovCisKKy8qKiBNYXggdGltZXIgZHVyYXRpb24gKHVzKSAqLworI2RlZmluZSBCQ01PU19NQVhfVElNRVJfRFVSQVRJT04gICAweDgwMDAwMDAwCisKKy8qKiBUaW1lciBjb250cm9sIGJsb2NrICovCit0eXBlZGVmIHN0cnVjdCBiY21vc190aW1lciBiY21vc190aW1lcjsKKworLyoqIFRpbWVyIGhhbmRsZXIgY29tcGxldGlvbiBjb2RlICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBCQ01PU19USU1FUl9PSywgICAgICAgICAgICAgLyoqPCBSZXN0YXJ0IHRpbWVyIGlmIHBlcmlvZGljIG9yIGtlZXAgc3RvcHBlZCBpZiBub3QgKi8KKyAgICBCQ01PU19USU1FUl9TVE9QICAgICAgICAgICAgLyoqPCBEbyBub3QgcmVzdGFydCBwZXJpb2RpYyB0aW1lciAqLworfSBiY21vc190aW1lcl9yYzsKKworLyoqIFRpbWVyIGhhbmRsZXIKKyAqIFxwYXJhbVtpbl0gICB0aW1lciAgIEV4cGlyZWQgdGltZXIgaGFuZGxlCisgKiBccGFyYW1baW5dICAgZGF0YSAgICBVc2VyIGRhdGEgc3VwcGxpZWQgYXQgdGltZXIgY3JlYXRpb24gdGltZQorICogXHJldHVybnMgXHJlZiBiY21vc190aW1lcl9yYworICovCit0eXBlZGVmIGJjbW9zX3RpbWVyX3JjICgqRl9iY21vc190aW1lcl9oYW5kbGVyKShiY21vc190aW1lciAqdGltZXIsIGxvbmcgZGF0YSk7CisKK3R5cGVkZWYgZW51bQoreworICAgIEJDTU9TX1RJTUVSX1BBUk1fRkxBR1NfVVJHRU5UICAgICA9IDAsICAgICAgIC8qKjwgRGVmYXVsdCBiZWhhdmlvci4gSWYgdGhlIHRpbWVyIG93bmVyIGlzIHNldCwgdGltZXIgZXhwaXJhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBkZWxpdmVyZWQgYXMgYW4gdXJnZW50IG1lc3NhZ2UuICovCisgICAgQkNNT1NfVElNRVJfUEFSTV9GTEFHU19OT05fVVJHRU5UID0gMSA8PCAwLCAgLyoqPCBJZiB0aGUgdGltZXIgb3duZXIgaXMgc2V0LCB0aW1lciBleHBpcmF0aW9uIHdpbGwgYmUgZGVsaXZlcmVkIGFzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIG5vcm1hbCAobm9uLXVyZ2VudCkgbWVzc2FnZS4gKi8KK30gYmNtb3NfdGltZXJfcGFybV9mbGFnczsKKworLyoqIFRpbWVyIHBhcmFtZXRlcnMgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgY29uc3QgY2hhciAqbmFtZTsgICAgICAgICAgICAgICAgICAgLyoqPCBUaW1lciBuYW1lICovCisgICAgYmNtb3NfbW9kdWxlX2lkIG93bmVyOyAgICAgICAgICAgICAgLyoqPCBUaW1lciBvd25lci4gSWYgc2V0LCB0aW1lciBleHBpcmF0aW9uIGlzIGRlbGl2ZXJlZCB0byB0aGUgbW9kdWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyBhIG1lc3NhZ2UgKi8KKyAgICBiY21vc19ib29sIHBlcmlvZGljOyAgICAgICAgICAgICAgICAvKio8IFRSVUU9cGVyaW9kaWMgKi8KKyAgICBGX2JjbW9zX3RpbWVyX2hhbmRsZXIgaGFuZGxlcjsgICAgICAvKio8IFRpbWVyIGhhbmRsZXIuIENhbGxlZCBpbiBjb250ZXh0IG9mIG93bmVyIG1vZHVsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2V0IG9yIHRpbWVyIElTUiBpZiBvd25lcj09QkNNT1NfTU9EVUxFX0lEX05PTkUgKi8KKyAgICBsb25nIGRhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IGRhdGEgdG8gcGFzcyB0byB0aGUgaGFuZGxlciAqLworICAgIGJjbW9zX3RpbWVyX3Bhcm1fZmxhZ3MgZmxhZ3M7ICAgICAgIC8qKjwgRmxhZ3MgdG8gY2hhbmdlIHRoZSBiZWhhdmlvciBvZiB0aGUgdGltZXIgKi8KK30gYmNtb3NfdGltZXJfcGFybTsKKworI2lmbmRlZiBCQ01PU19USU1FU1RBTVBfSU5MSU5FCisKKy8qKiBHZXQgY3VycmVudCB0aW1lc3RhbXAKKyAqIFxyZXR1cm5zIHRoZSBjdXJyZW50IHN5c3RlbSB0aW1lc3RhbXAgKHVzKQorICovCit1aW50MzJfdCBiY21vc190aW1lc3RhbXAodm9pZCk7CisKKy8qKiBHZXQgY3VycmVudCA2NCBiaXQgdGltZXN0YW1wCisgKiBccmV0dXJucyB0aGUgY3VycmVudCBzeXN0ZW0gdGltZXN0YW1wICh1cykKKyAqIFxub3RlIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGFsbCA2NCBiaXQgY2FycnkgaW5mb3JtYXRpb24uCisgKiAgICAgICBIb3dldmVyLCBpdCBpcyBndWFyYW50ZWVkIHRoYXQgdGhlIHRpbWVzdGFtcCB3cmFwcyBhcm91bmQKKyAqICAgICAgIG5vdCBvZnRlbmVyIHRoYW4gZXZlcnkgNTAgZGF5cyAobXMgcmVzb2x1dGlvbikKKyAqLwordWludDY0X3QgYmNtb3NfdGltZXN0YW1wNjQodm9pZCk7CisKKyNlbmRpZiAvKiAjaWZuZGVmIEJDTU9TX1RJTUVTVEFNUF9JTkxJTkUgKi8KKworLyoqIENyZWF0ZSB0aW1lcgorICoKKyAqIFxwYXJhbVtpbixvdXRdICAgICAgIHRpbWVyICAgdGltZXIgY29udHJvbCBibG9jaworICogXHBhcmFtW2luXSAgICAgICAgICAgcGFybSAgICB0aW1lciBwYXJhbWV0ZXJzCisgKiBccmV0dXJucyAwPU9LIG9yIGVycm9yIGNvZGUgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfdGltZXJfY3JlYXRlKGJjbW9zX3RpbWVyICp0aW1lciwgYmNtb3NfdGltZXJfcGFybSAqcGFybSk7CisKKy8qKiBEZXN0cm95IHRpbWVyCisgKiBUaGUgdGltZXIgaXMgc3RvcHBlZCBpZiBydW5uaW5nIGFuZCBkZXN0cm95ZWQKKyAqIFxwYXJhbVtpbl0gICB0aW1lciAgIHRpbWVyIGhhbmRsZQorICovCit2b2lkIGJjbW9zX3RpbWVyX2Rlc3Ryb3koYmNtb3NfdGltZXIgKnRpbWVyKTsKKworLyoqIFNldCB0aW1lciBoYW5kbGVyCisgKgorICogXHBhcmFtW2luLG91dF0gICAgICAgdGltZXIgICB0aW1lciBjb250cm9sIGJsb2NrCisgKiBccGFyYW1baW5dICAgICAgICAgICBoYW5kbGVyIHRpbWVyIGhhbmRsZXIKKyAqIFxwYXJhbVtpbl0gICAgICAgICAgIGRhdGEgICAgZGF0YSB0byBiZSBwYXNzZWQgdG8gdGhlIGhhbmRsZXIKKyAqIFxyZXR1cm5zIDA9T0sgb3IgZXJyb3IgY29kZSA8MAorICovCitiY21vc19lcnJubyBiY21vc190aW1lcl9oYW5kbGVyX3NldChiY21vc190aW1lciAqdGltZXIsIEZfYmNtb3NfdGltZXJfaGFuZGxlciBoYW5kbGVyLCBsb25nIGRhdGEpOworCisvKiogKFJlKXN0YXJ0IHRpbWVyCisgKiBTdG9wIHRpbWVyIGlmIHJ1bm5pbmcgYW5kIHN0YXJ0IGl0LgorICoKKyAqIFxwYXJhbVtpbl0gICB0aW1lciAgIHRpbWVyIGhhbmRsZQorICogXHBhcmFtW2luXSAgIGRlbGF5ICAgZGVsYXkgaW4gdXMKKyAqLwordm9pZCBiY21vc190aW1lcl9zdGFydChiY21vc190aW1lciAqdGltZXIsIHVpbnQzMl90IGRlbGF5KTsKKworLyoqIFN0b3AgdGltZXIgaWYgcnVubmluZworICoKKyAqIFxwYXJhbVtpbl0gICB0aW1lciAgIHRpbWVyIGhhbmRsZQorICovCit2b2lkIGJjbW9zX3RpbWVyX3N0b3AoYmNtb3NfdGltZXIgKnRpbWVyKTsKKworLyoqIFN1c3BlbmQgY3VycmVudCB0YXNrIGZvciBhIHRpbWUKKyAqCisgKiBccGFyYW1baW5dICAgdXMgICAgICBzbGVlcCB0aW1lICh1cykKKyAqLworI2lmbmRlZiBCQ01PU19VU0xFRVBfSU5MSU5FCit2b2lkIGJjbW9zX3VzbGVlcCh1aW50MzJfdCB1cyk7CisjZW5kaWYgLyogI2lmbmRlZiBCQ01PU19VU0xFRVBfSU5MSU5FICovCisKKy8qKiBAfSBzeXN0ZW1fdGltZXIgKi8KKworLyoqIFxhZGR0b2dyb3VwIHN5c3RlbV9mYXN0bG9jaworICogQHsKKyAqLworCisvKiogRmFzdCBsb2NrIGNvbnRyb2wgYmxvY2sgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9zX2Zhc3Rsb2NrIGJjbW9zX2Zhc3Rsb2NrOworCisjaWZuZGVmIEJDTU9TX0ZBU1RMT0NLX0lOTElORQorCisvKiogSW5pdCBmYXN0bG9jaworICogXHBhcmFtW2luLCBvdXRdICAgICAgbG9jayAgICBmYXN0IGxvY2sgY29udHJvbCBibG9jaworICogXHBhcmFtW2luXSAgICAgICAgICAgZmxhZ3MgICBmbGFncyAtIFRCRC4gRS5nLiwgc2luZ2xlIGNvcmUgLyBTTVAKKyAqLwordm9pZCBiY21vc19mYXN0bG9ja19pbml0KGJjbW9zX2Zhc3Rsb2NrICpsb2NrLCB1aW50MzJfdCBmbGFncyk7CisKKy8qKiBUYWtlIGZhc3QgbG9jaworICogXHBhcmFtW2luXSAgIGxvY2sgICAgZmFzdCBsb2NrCisgKiBccmV0dXJucyB2YWx1ZSBvZiBpbnRlcnJ1cHQgZmxhZ3MgdGhhdCBzaG91bGQgYmUgdXNlZCBpbiB1bmxvY2sKKyAqLworbG9uZyBiY21vc19mYXN0bG9ja19sb2NrKGJjbW9zX2Zhc3Rsb2NrICpsb2NrKTsKKworLyoqIFJlbGVhc2UgZmFzdCBsb2NrCisgKiBccGFyYW1baW5dICAgbG9jayAgICBmYXN0IGxvY2sKKyAqIFxwYXJhbVtpbl0gICBmbGFncyAgIGludGVycnVwdCBmbGFncworICovCit2b2lkIGJjbW9zX2Zhc3Rsb2NrX3VubG9jayhiY21vc19mYXN0bG9jayAqbG9jaywgbG9uZyBmbGFncyk7CisKKyNlbmRpZiAvKiAjaWZuZGVmIEJDTU9TX0ZBU1RMT0NLX0lOTElORSAqLworCisvKiogQH0gc3lzdGVtX2Zhc3Rsb2NrICovCisKKy8qKiBcYWRkdG9ncm91cCBzeXN0ZW1fbXV0ZXgKKyAqIEB7CisgKi8KKworLyoqIE11dGV4IGNvbnRyb2wgYmxvY2sgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9zX211dGV4IGJjbW9zX211dGV4OworCisjaWZkZWYgQkNNT1NfTVVURVhfSU5MSU5FCisjZGVmaW5lIEJDTU9TX01VVEVYX0NSRUFURV9ERVNUUk9ZX0lOTElORQorI2RlZmluZSBCQ01PU19NVVRFWF9MT0NLX1VOTE9DS19JTkxJTkUKKyNlbmRpZgorCisjaWZuZGVmIEJDTU9TX01VVEVYX0NSRUFURV9ERVNUUk9ZX0lOTElORQorCisvKiogQ3JlYXRlIHJlY3Vyc2l2ZSBtdXRleAorICogXHBhcmFtW2luLCBvdXRdICAgICAgbXV0ZXggICBNdXRleCBjb250cm9sIGJsb2NrCisgKiBccGFyYW1baW5dICAgICAgICAgICBmbGFncyAgIGZsYWdzIC0gVEJELiBFLmcuLCBzaW5nbGUgY29yZSAvIFNNUAorICogXHBhcmFtW2luXSAgICAgICAgICAgbmFtZSBuYW1lIG9mIHRoZSBtdXRleCAoaWYgT1Mgc3VwcG9ydHMpLCBOVUxMIG1lYW5zIGl0IHdpbGwgYmUgYXV0by1nZW5lcmF0ZWQKKyAqIFxyZXR1cm5zIDA9T0sgb3IgZXJyb3IgY29kZSA8MAorICovCitiY21vc19lcnJubyBiY21vc19tdXRleF9jcmVhdGUoYmNtb3NfbXV0ZXggKm11dGV4LCB1aW50MzJfdCBmbGFncywgY29uc3QgY2hhciAqbmFtZSk7CisKKy8qKiBEZXN0cm95IG11dGV4CisgKiBccGFyYW1baW5dICAgbXV0ZXggICBNdXRleCBjb250cm9sIGJsb2NrCisgKi8KK3ZvaWQgYmNtb3NfbXV0ZXhfZGVzdHJveShiY21vc19tdXRleCAqbXV0ZXgpOworCisjZW5kaWYgLyogQkNNT1NfTVVURVhfQ1JFQVRFX0RFU1RST1lfSU5MSU5FICovCisKKworI2lmbmRlZiBCQ01PU19NVVRFWF9MT0NLX1VOTE9DS19JTkxJTkUKKworLyoqIExvY2sgbXV0ZXgKKyAqIFxwYXJhbVtpbl0gICBtdXRleCAgIE11dGV4IGNvbnRyb2wgYmxvY2sKKyAqLwordm9pZCBiY21vc19tdXRleF9sb2NrKGJjbW9zX211dGV4ICptdXRleCk7CisKKy8qKiBSZWxlYXNlIG11dGV4CisgKiBccGFyYW1baW5dICAgbXV0ZXggICBNdXRleCBjb250cm9sIGJsb2NrCisgKi8KK3ZvaWQgYmNtb3NfbXV0ZXhfdW5sb2NrKGJjbW9zX211dGV4ICptdXRleCk7CisKKyNlbmRpZiAvKiAjaWZuZGVmIEJDTU9TX01VVEVYX0xPQ0tfVU5MT0NLX0lOTElORSAqLworCisvKiogQH0gc3lzdGVtX211dGV4ICovCisKKy8qKiBcYWRkdG9ncm91cCBzeXN0ZW1fc2VtCisgKiBAeworICovCisKKy8qKiBTZW1hcGhvcmUgY29udHJvbCBibG9jayAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb3Nfc2VtIGJjbW9zX3NlbTsKKworI2lmZGVmIEJDTU9TX1NFTV9JTkxJTkUKKyNkZWZpbmUgQkNNT1NfU0VNX0NSRUFURV9ERVNUUk9ZX0lOTElORQorI2RlZmluZSBCQ01PU19TRU1fV0FJVF9JTkxJTkUKKyNkZWZpbmUgQkNNT1NfU0VNX1BPU1RfSU5MSU5FCisjZW5kaWYKKworI2lmbmRlZiBCQ01PU19TRU1fQ1JFQVRFX0RFU1RST1lfSU5MSU5FCisKKy8qKiBDcmVhdGUgc2VtYXBob3JlCisgKiBccGFyYW1baW4sIG91dF0gICAgc2VtICAgc2VtYXBob3JlIGNvbnRyb2wgYmxvY2sKKyAqIFxwYXJhbVtpbl0gICAgICAgICBjb3VudCBpbml0aWFsIHZhbHVlIG9mIHNlbWFwaG9yZSBjb3VudGVyCisgKiBccGFyYW1baW5dICAgICAgICAgZmxhZ3MgZmxhZ3MgLSBUQkQuIEUuZy4sIHNpbmdsZSBjb3JlIC8gU01QCisgKiBccGFyYW1baW5dICAgICAgICAgbmFtZSBuYW1lIG9mIHRoZSBzZW1hcGhvcmUgKGlmIE9TIHN1cHBvcnRzKSwgTlVMTCBtZWFucyBpdCB3aWxsIGJlIGF1dG8tZ2VuZXJhdGVkCisgKiBccmV0dXJucyAwPU9LIG9yIGVycm9yIGNvZGUgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtb3Nfc2VtX2NyZWF0ZShiY21vc19zZW0gKnNlbSwgdWludDMyX3QgY291bnQsIHVpbnQzMl90IGZsYWdzLCBjb25zdCBjaGFyICpuYW1lKTsKKworLyoqIERlc3Ryb3kgc2VtYXBob3JlCisgKiBccGFyYW1baW5dICAgc2VtICAgc2VtYXBob3JlIGNvbnRyb2wgYmxvY2sKKyAqLwordm9pZCBiY21vc19zZW1fZGVzdHJveShiY21vc19zZW0gKnNlbSk7CisKKyNlbmRpZiAvKiBCQ01PU19TRU1fQ1JFQVRFX0RFU1RST1lfSU5MSU5FICovCisKKyNpZm5kZWYgQkNNT1NfU0VNX1dBSVRfSU5MSU5FCisKKy8qKiBEZWNyZW1lbnQgc2VtYXBob3JlIGNvdW50ZXIuIFdhaXQgaWYgdGhlIGNvdW50ZXIgaXMgMAorICoKKyAqIFxwYXJhbVtpbl0gICBzZW0gICAgIHNlbWFwaG9yZSBjb250cm9sIGJsb2NrCisgKiBccGFyYW1baW5dICAgdGltZW91dCB0aW1lb3V0LiBjYW4gYmUgMCwgdGltZSBpbiB1cyBvciBccmVmIEJDTU9TX1dBSVRfRk9SRVZFUgorICogXHJldHVybnMgMD1PSyBvciBlcnJvciBjb2RlIDwwCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX3NlbV93YWl0KGJjbW9zX3NlbSAqc2VtLCB1aW50MzJfdCB0aW1lb3V0KTsKKworI2VuZGlmIC8qICNpZm5kZWYgQkNNT1NfU0VNX1dBSVRfSU5MSU5FICovCisKKyNpZm5kZWYgQkNNT1NfU0VNX1BPU1RfSU5MSU5FCisvKiogSW5jcmVtZW50IHNlbWFwaG9yZSBjb3VudGVyCisgKiBccGFyYW1baW5dICAgc2VtICAgc2VtYXBob3JlIGNvbnRyb2wgYmxvY2sKKyAqLwordm9pZCBiY21vc19zZW1fcG9zdChiY21vc19zZW0gKnNlbSk7CisKKyNlbmRpZiAvKiAjaWZuZGVmIEJDTU9TX1NFTV9QT1NUX0lOTElORSAqLworCisvKiogQH0gc3lzdGVtX3NlbSAqLworCisvKgorICogcHJpbnQgc3VwcG9ydAorICovCisKKy8qKiBQcmludCBjbG9uaW5nL3JlZGlyZWN0aW9uIG1vZGUgKi8KK3R5cGVkZWYgZW51bQoreworICAgIEJDTU9TX1BSSU5UX1JFRElSRUNUX01PREVfTk9ORSwgICAgIC8qKjwgTm8gY2xvbmluZywgcmVkaXJlY3Rpb24gKi8KKyAgICBCQ01PU19QUklOVF9SRURJUkVDVF9NT0RFX1JFRElSRUNULCAvKio8IFJlZGlyZWN0IGNvbnNvbGUgb3V0cHV0LiBEbyBub3QgcHJpbnQgb24gdGhlIHNlcmlhbCBjb25zb2xlICovCisgICAgQkNNT1NfUFJJTlRfUkVESVJFQ1RfTU9ERV9DTE9ORSAgICAgLyoqPCBDbG9uZSBjb25zb2xlIG91dHB1dCB0byByZWRpcmVjdGlvbiBjYWxsYmFjayAqLworfSBiY21vc19wcmludF9yZWRpcmVjdF9tb2RlOworCisvKiogUHJpbnQgcmUtZGlyZWN0aW9uL2Nsb25pbmcgY2FsbGJhY2sgKi8KK3R5cGVkZWYgaW50ICgqYmNtb3NfcHJpbnRfcmVkaXJlY3RfY2IpKHZvaWQgKmRhdGEsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCk7CisKKy8qKiBTZXQgdXAgcHJpbnQgcmVkaXJlY3Rpb24vY2xvbmluZworICogXHBhcmFtW2luXSAgIG1vZGUgICAgcmVkaXJlY3Rpb24vY2xvbmluZyBtb2RlCisgKiBccGFyYW1baW5dICAgY2IgICAgICByZWRpcmVjdGlvbiBjYWxsYmFjaworICogXHBhcmFtW2luXSAgIGRhdGEgICAgb3BhcXVlIGRhdGEgdG8gYmUgcGFzc2VkIHRvIGNiCisgKiBccmV0dXJucyAwPU9LIG9yIGVycm9yIDwwCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX3ByaW50X3JlZGlyZWN0KGJjbW9zX3ByaW50X3JlZGlyZWN0X21vZGUgbW9kZSwgYmNtb3NfcHJpbnRfcmVkaXJlY3RfY2IgY2IsIHZvaWQgKmRhdGEpOworCisvKiBQcmludCBvbiB0aGUgY29uc29sZSB3aXRoIG9wdGlvbmFsIGNsb25pbmcgLyByZWRpcmVjdGlvbgorICogXHBhcmFtW2luXSAgIGZvcm1hdCAgcHJpbnRmIGZvcm1hdAorICogXHBhcmFtW2luXSAgIGFwICAgICAgYXJndW1lbnQgbGlzdAorICogXHJldHVybnMgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZCA+PSAwIG9yIGVycm9yIDwgMAorICovCitpbnQgYmNtb3NfdnByaW50Zihjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXApOworCisvKiBQcmludCBvbiB0aGUgY29uc29sZSB3aXRoIG9wdGlvbmFsIGNsb25pbmcgLyByZWRpcmVjdGlvbgorICogXHBhcmFtW2luXSAgIGZvcm1hdCAgcHJpbnRmIGZvcm1hdAorICogXHJldHVybnMgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZCA+PSAwIG9yIGVycm9yIDwgMAorICovCitpbnQgYmNtb3NfcHJpbnRmKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKKworCisvKiogXGFkZHRvZ3JvdXAgc3lzdGVtX3RyYWNlCisgKiBAeworICovCisKKy8qKiBUcmFjZSBsZXZlbCAqLwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNT1NfVFJBQ0VfTEVWRUxfTk9ORSwgICAgIC8qKjwgTm8gdHJhY2Ugb3V0cHV0ICovCisgICAgQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICAgIC8qKjwgVHJhY2UgZXJyb3JzICovCisgICAgQkNNT1NfVFJBQ0VfTEVWRUxfV0FSTklORywgIC8qKjwgVHJhY2UgZXJyb3JzICsgd2FybmluZ3MgKi8KKyAgICBCQ01PU19UUkFDRV9MRVZFTF9JTkZPLCAgICAgLyoqPCBUcmFjZSBlcnJvcnMgKyB3YXJuaW5ncyArIGluZm8gKi8KKyAgICBCQ01PU19UUkFDRV9MRVZFTF9WRVJCT1NFLCAgLyoqPCBUcmFjZSBlcnJvcnMgKyB3YXJuaW5ncyArIGluZm8gKyB2ZXJib3NlIGluZm8gKi8KKyAgICBCQ01PU19UUkFDRV9MRVZFTF9ERUJVRywgICAgLyoqPCBUcmFjZSBldmVyeXRoaW5nICovCit9IGJjbW9zX3RyYWNlX2xldmVsOworCitleHRlcm4gYmNtb3NfdHJhY2VfbGV2ZWwgYmNtb3Nfc3lzX3RyYWNlX2xldmVsOworCisjaWZkZWYgQkNNT1NfVFJBQ0VfUFJJTlRGCisjZGVmaW5lIEJDTU9TX1RSQUNFX0lOTElORQorI2VuZGlmCisKKyNpZm5kZWYgQkNNT1NfVFJBQ0VfSU5MSU5FCisvKiogUHJpbnQgdHJhY2UKKyAqCisgKiBccGFyYW1baW5dICAgbGV2ZWwgICAgICAgICAgIFJlY29yZCB0cmFjZSBhdCBsZXZlbAorICogXHBhcmFtW2luXSAgIGZvcm1hdCAgICAgICAgICBwcmludGYtbGlrZSBmb3JtYXQKKyAqLwordm9pZCBiY21vc190cmFjZShiY21vc190cmFjZV9sZXZlbCBsZXZlbCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOworI2VuZGlmCisKKworLyogUHJpbnQgdHJhY2UgKi8KKyNpZmRlZiBCQ01PU19UUkFDRV9QUklOVEYKKyNkZWZpbmUgYmNtb3NfdHJhY2UobGV2ZWwsIGZtdCwgYXJncy4uLikgIGJjbW9zX3ByaW50ZihmbXQsICMjIGFyZ3MpCisjZW5kaWYKKworLyoqIFNldCBjdXJyZW50IHRyYWNlIGxldmVsCisgKiBccGFyYW1baW5dICAgbGV2ZWwgICAgICAgICAgIE5ldyB0cmFjZSBsZXZlbAorICogXHJldHVybnMgb2xkIHRyYWNlIGxldmVsCisgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfdHJhY2VfbGV2ZWwgYmNtb3NfdHJhY2VfbGV2ZWxfc2V0KGJjbW9zX3RyYWNlX2xldmVsIGxldmVsKQoreworICAgIGJjbW9zX3RyYWNlX2xldmVsIG9sZF9sZXZlbCA9IGJjbW9zX3N5c190cmFjZV9sZXZlbDsKKyAgICBiY21vc19zeXNfdHJhY2VfbGV2ZWwgPSBsZXZlbDsKKyAgICByZXR1cm4gb2xkX2xldmVsOworfQorCisvKiogR2V0IGN1cnJlbnQgdHJhY2UgbGV2ZWwKKyAqIFxyZXR1cm5zIHRyYWNlIGxldmVsCisgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfdHJhY2VfbGV2ZWwgYmNtb3NfdHJhY2VfbGV2ZWxfZ2V0KHZvaWQpCit7CisgICAgcmV0dXJuIGJjbW9zX3N5c190cmFjZV9sZXZlbDsKK30KKworLyoqIFByaW50IHRyYWNlIGNvbmRpdGlvbmFsbHksIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCB0cmFjZSBsZXZlbAorICogXHBhcmFtW2luXSAgIGxldmVsICAgUmVjb3JkIHRyYWNlIGF0IGxldmVsCisgKiBccGFyYW1baW5dICAgZm10ICAgICBwcmludGYtbGlrZSBmb3JtYXQKKyAqIFxwYXJhbVtpbl0gICBhcmdzICAgIHByaW50Zi1saWtlIGFyZ3VtZW50cworICovCisjZGVmaW5lIEJDTU9TX1RSQUNFKGxldmVsLCBmbXQsIGFyZ3MuLi4pIFwKKyAgICBkbyBcCisgICAgeyBcCisgICAgICAgIGlmIChsZXZlbCA8PSBiY21vc19zeXNfdHJhY2VfbGV2ZWwpIFwKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKGxldmVsLCAiJXMjJWQ+ICIgZm10LCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCAjIyBhcmdzKTsgXAorICAgIH0gd2hpbGUgKDApCisKKy8qKiBQcmludCBlcnJvciB0cmFjZSBjb25kaXRpb25hbGx5LCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgdHJhY2UgbGV2ZWwKKyAqIFxwYXJhbVtpbl0gICBmbXQgICAgIHByaW50Zi1saWtlIGZvcm1hdAorICogXHBhcmFtW2luXSAgIGFyZ3MgICAgcHJpbnRmLWxpa2UgYXJndW1lbnRzCisgKi8KKworZXh0ZXJuIGZfYmNtb2x0X3N3X2Vycm9yX2hhbmRsZXIgc3dfZXJyb3JfaGFuZGxlcjsKKworI2RlZmluZSBCQ01PU19UUkFDRV9FUlIoZm10LCBhcmdzLi4uKSBcCisgICAgZG8gXAorICAgIHsgXAorICAgICAgICBCQ01PU19UUkFDRShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVSUjogIiBmbXQsICMjIGFyZ3MpOyBcCisgICAgICAgIGlmIChzd19lcnJvcl9oYW5kbGVyICE9IE5VTEwpIFwKKyAgICAgICAgeyBcCisgICAgICAgICAgICBzd19lcnJvcl9oYW5kbGVyKDB4ZmYsIF9fRklMRV9fLCBfX0xJTkVfXyk7IFwKKyAgICAgICAgfSBcCisgICAgICAgIF9iY21vc19iYWNrdHJhY2UoKTsgXAorICAgfSB3aGlsZSAoMCkKKworCisvKiogUHJpbnQgaW5mbyB0cmFjZSBjb25kaXRpb25hbGx5LCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgdHJhY2UgbGV2ZWwKKyAqIFxwYXJhbVtpbl0gICBmbXQgICAgIHByaW50Zi1saWtlIGZvcm1hdAorICogXHBhcmFtW2luXSAgIGFyZ3MgICAgcHJpbnRmLWxpa2UgYXJndW1lbnRzCisgKi8KKyNkZWZpbmUgQkNNT1NfVFJBQ0VfSU5GTyhmbXQsIGFyZ3MuLi4pICAgICAgICAgIFwKKyAgICBCQ01PU19UUkFDRShCQ01PU19UUkFDRV9MRVZFTF9JTkZPLCAiSU5GOiAiIGZtdCwgIyMgYXJncykKKworLyoqIFByaW50IHZlcmJvc2UgaW5mbyB0cmFjZSBjb25kaXRpb25hbGx5LCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgdHJhY2UgbGV2ZWwKKyAqIFxwYXJhbVtpbl0gICBmbXQgICAgIHByaW50Zi1saWtlIGZvcm1hdAorICogXHBhcmFtW2luXSAgIGFyZ3MgICAgcHJpbnRmLWxpa2UgYXJndW1lbnRzCisgKi8KKyNkZWZpbmUgQkNNT1NfVFJBQ0VfVkVSQk9TRShmbXQsIGFyZ3MuLi4pICAgICAgXAorICAgIEJDTU9TX1RSQUNFKEJDTU9TX1RSQUNFX0xFVkVMX1ZFUkJPU0UsICJWUkI6ICIgZm10LCAjIyBhcmdzKQorCisvKiogUHJpbnQgZGVidWcgdHJhY2UgY29uZGl0aW9uYWxseSwgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IHRyYWNlIGxldmVsCisgKiBccGFyYW1baW5dICAgZm10ICAgICBwcmludGYtbGlrZSBmb3JtYXQKKyAqIFxwYXJhbVtpbl0gICBhcmdzICAgIHByaW50Zi1saWtlIGFyZ3VtZW50cworICovCisjZGVmaW5lIEJDTU9TX1RSQUNFX0RFQlVHKGZtdCwgYXJncy4uLikgICAgICAgIFwKKyAgICBCQ01PU19UUkFDRShCQ01PU19UUkFDRV9MRVZFTF9ERUJVRywgIkRCRzogIiBmbXQsICMjIGFyZ3MpCisKKy8qKiBQcmludCB0cmFjZSBjb25kaXRpb25hbGx5IGJhc2VkIG9uIHJldHVybiBjb2RlIGFuZCByZXR1cm4KKyAqIFxwYXJhbVtpbl0gICByYyAgICAgIHJldHVybiBjb2RlCisgKiBccGFyYW1baW5dICAgZm10ICAgICBwcmludGYtbGlrZSBmb3JtYXQKKyAqIFxwYXJhbVtpbl0gICBhcmdzICAgIHByaW50Zi1saWtlIGFyZ3VtZW50cworICogXHJldHVybnMgcmMKKyAqLworI2RlZmluZSBCQ01PU19UUkFDRV9SRVRVUk4ocmMsIGZtdCwgYXJncy4uLikgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAocmMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJzdGF0dXM6JXMgOiIgZm10LCBiY21vc19zdHJlcnJvcihyYyksICMjIGFyZ3MpOyBcCisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBCQ01PU19UUkFDRV9JTkZPKCJzdWNjZXNzOiAiIGZtdCwgIyMgYXJncyk7IFwKKyAgICAgICAgcmV0dXJuIHJjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIEJDTU9TX1RSQUNFX0NIRUNLX1JFVFVSTihjb25kLHJjLGZtdCxhcmdzLi4uKSAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChjb25kKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAge1wKKyAgICAgICAgICAgIEJDTU9TX1RSQUNFX0VSUiggI2NvbmQgIjogc3RhdHVzOiVzIDoiIGZtdCwgYmNtb3Nfc3RyZXJyb3IocmMpLCAjIyBhcmdzKTsgXAorICAgICAgICAgICAgcmV0dXJuIHJjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfVwKKyAgICB9IHdoaWxlICgwKQorI2RlZmluZSBCQ01PU19DSEVDS19SRVRVUk4oY29uZCxlcnIscmV0KSAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChjb25kKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAge1wKKyAgICAgICAgICAgIEJDTU9TX1RSQUNFX0VSUiggI2NvbmQgIjogc3RhdHVzOiVzXG4iLCBiY21vc19zdHJlcnJvcihlcnIpKTsgXAorICAgICAgICAgICAgcmV0dXJuIHJldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH1cCisgICAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKGNvbmQsZXJyKSBCQ01PU19DSEVDS19SRVRVUk4oY29uZCxlcnIsZXJyKQorI2RlZmluZSBCQ01PU19SRVRVUk5fT05fRVJST1IoZXJyKSBCQ01PU19DSEVDS19SRVRVUk4oQkNNX0VSUl9PSyAhPSBlcnIsIGVyciwgLyp0aGlzIHNwYWNlIGludGVudGlvbmFsbHkgbGVmdCBibGFuayovKQorI2RlZmluZSBCQ01PU19SRVRVUk5fSUZfRVJST1IoZXJyKSBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoQkNNX0VSUl9PSyAhPSBlcnIsIGVycikKKworLyoqIEB9IHN5c3RlbV90cmFjZSAqLworCisvKgorICogTG93IGxldmVsIHNlcnZpY2VzCisgKi8KKworLyoqIFxhZGR0b2dyb3VwIHN5c3RlbV9idWYKKyAqIEB7CisgKi8KKworLyoqIFRyYW5zcG9ydC9uZXR3b3JrIGJ1ZmZlciAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb3NfYnVmIGJjbW9zX2J1ZjsKKworLyoqIEB9IHN5c3RlbV9idWYgKi8KKworLyoqIFJvdW5kIGEgbnVtYmVyIHVwIHRvIHRoZSBzcGVjaWZpZWQgcG93ZXIgb2YgMiAqLworI2RlZmluZSBCQ01PU19ST1VORF9VUChuLCBtKSAoKChuKSArIChtKSAtIDEpICYgfigobSkgLSAxKSkKKworLyoqIFJvdW5kIGEgbnVtYmVyIHVwIHRvIHRoZSBuZWFyZXN0IHdvcmQgbXVsdGlwbGUgKi8KKyNkZWZpbmUgQkNNT1NfUk9VTkRfVE9fV09SRChuKSBCQ01PU19ST1VORF9VUChuLCBzaXplb2Yoc2l6ZV90KSkKKworLyogQkNNT1NfRElWSURFX1JPVU5EX1VQKGludGVnZXJfZGl2aWRlbmQgLyBpbnRlZ2VyX2Rpdmlzb3IpID09IChpbnRlZ2VyX2RpdmlkZW5kICsgaW50ZWdlcl9kaXZpc29yIC0gMSkgLyBpbnRlZ2VyX2Rpdmlzb3IgKi8KKyNkZWZpbmUgQkNNT1NfRElWSURFX1JPVU5EX1VQKG4sIG0pICgoKG4pICsgKG0pIC0gMSkgLyAobSkpCisKKyNlbmRpZiAvKiBCQ01PU19TWVNURU1fQ09NTU9OX0hfICovCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2JjbW9zX2NvbW1vbjIuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vYmNtb3NfY29tbW9uMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMTdhYWMKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2JjbW9zX2NvbW1vbjIuaApAQCAtMCwwICsxLDY3NiBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBCQ01PU19DT01NT04yX0hfCisjZGVmaW5lIEJDTU9TX0NPTU1PTjJfSF8KKworI2lmbmRlZiBCQ01PU19TWVNURU1fSF8KKyNlcnJvciBQbGVhc2UgZG8gbm90IGluY2x1ZGUgYmNtb3NfY29tbW9uMi5oIGRpcmVjdGx5LiBJbmNsdWRlIGJjbW9zX3N5c3RlbS5oCisjZW5kaWYKKworI2luY2x1ZGUgImJjbW9zX2VuZGlhbi5oIgorCisvKiBcYWRkdG9ncm91cCBzeXN0ZW0KKyAqIEB7CisgKi8KKworI2RlZmluZSBCQ01PU19NQVhfTkFNRV9MRU5HVEggICA0OAorCisvKiogXGFkZHRvZ3JvdXAgc3lzdGVtX3Rhc2sKKyAqIEB7CisgKi8KKworLyoqIFRhc2sgY29udHJvbCBibG9jayAqLworc3RydWN0IGJjbW9zX3Rhc2sKK3sKKyAgICAvKiBPUyBpbmRlcGVuZGVudCBmaWVsZHMgKi8KKyAgICBiY21vc190YXNrX3Bhcm0gcGFybTsgICAgICAgICAgICAgICAvKio8IFRhc2sgY3JlYXRpb24gcGFyYW1ldGVycyAqLworICAgIGJjbW9zX21vZHVsZSAqbW9kdWxlc1tCQ01PU19NQVhfTU9EVUxFU19QRVJfVEFTS107CisgICAgdWludDMyX3QgYWN0aXZlX21vZHVsZXM7ICAgICAgICAgICAgLyoqPCBCaXRtYXNrIG9mIG1vZHVsZXMgZm9yIHdoaWNoIGV2ZW50cyBhcmUgcGVuZGluZyAqLworICAgIGJjbW9zX3NlbSBhY3RpdmVfc2VtOyAgICAgICAgICAgICAgIC8qKjwgU2VtYXBob3JlIHVzZWQgdG8gd2FpdCBmb3IgbW9kdWxlIGFjdGl2aXR5ICovCisgICAgYmNtb3NfZmFzdGxvY2sgYWN0aXZlX2xvY2s7ICAgICAgICAgLyoqPCBMb2NrIHByb3RlY3RpbmcgYWN0aXZlX21vZHVsZXMgKi8KKyAgICBiY21vc19tb2R1bGVfaWQgY3VycmVudF9tb2R1bGU7ICAgICAvKio8IEN1cnJlbnQgbW9kdWxlICovCisgICAgYmNtb3NfYm9vbCBkZXN0cm95X3JlcXVlc3Q7ICAgICAgICAgLyoqPCBUYXNrIGRlc3Ryb3kgcmVxdWVzdCBwZW5kaW5nICovCisgICAgYmNtb3NfYm9vbCBkZXN0cm95ZWQ7ICAgICAgICAgICAgICAgLyoqPCBTZXQgYnkgdGFzayBoYW5kbGVyIGJlZm9yZSBpdCB0ZXJtaW5hdGVzICovCisgICAgU1RBSUxRX0VOVFJZKGJjbW9zX3Rhc2spIGxpc3Q7ICAgICAgLyoqPCBOZXh0IHRhc2sgcG9pbnRlciAqLworICAgIGNoYXIgbmFtZVtCQ01PU19NQVhfTkFNRV9MRU5HVEhdOyAgIC8qKjwgVGFzayBuYW1lICovCisgICAgYmNtb3Nfc3lzX3Rhc2sgc3lzX3Rhc2s7ICAgICAgICAgICAgLyoqPCBPUy1zcGVjaWZpYyB0YXNrIGV4dGVuc2lvbiAqLworICAgIHVpbnQzMl90IG1hZ2ljOyAgICAgICAgICAgICAgICAgICAgIC8qIG1hZ2ljIG51bWJlciAqLworI2RlZmluZSBCQ01PU19UQVNLX01BR0lDICAgICAgICAgICAgICAgICgoJ3QnIDw8IDI0KSB8ICgnYScgPDwgMTYpIHwgKCdzJyA8PCA4KSB8ICdrJykKKyNkZWZpbmUgQkNNT1NfVEFTS19NQUdJQ19ERVNUUk9ZRUQgICAgICAoKCd0JyA8PCAyNCkgfCAoJ2EnIDw8IDE2KSB8ICgncycgPDwgOCkgfCAnficpCit9OworCisvKiogXGFkZHRvZ3JvdXAgc3lzdGVtX21lbQorICogQHsKKyAqLworCisjaWZuZGVmIEJDTU9TX0NBTExPQ19JTkxJTkUKKworLyoqIEFsbG9jYXRlIG1lbW9yeSBmcm9tIHRoZSBtYWluIGhlYXAgYW5kIGNsZWFyIGl0CisgKiBcaW5ncm91cCBzeXN0ZW1faGVhcAorICogXHBhcmFtW2luXSAgIHNpemUKKyAqIFxyZXR1cm5zIG1lbW9yeSBibG9jayBwb2ludGVyIG9yIE5VTEwKKyAqLworc3RhdGljIGlubGluZSB2b2lkICpiY21vc19jYWxsb2ModWludDMyX3Qgc2l6ZSkKK3sKKyAgICB2b2lkICpwdHIgPSBiY21vc19hbGxvYyhzaXplKTsKKyAgICBpZiAocHRyKQorICAgICAgICBtZW1zZXQocHRyLCAwLCBzaXplKTsKKyAgICByZXR1cm4gcHRyOworfQorI2VuZGlmIC8qICNpZm5kZWYgQkNNT1NfQ0FMTE9DX0lOTElORSAqLworCisjaWZuZGVmIEJDTU9TX0RNQV9BTExPQ19GUkVFX0lOTElORQorCisvKiogQWxsb2NhdGUgRE1BLWFibGUgbWVtb3J5CisgKiBccGFyYW1baW5dICAgZGV2aWNlICBEZXZpY2UgaWQKKyAqIFxwYXJhbVtpbl0gICBzaXplICAgIEJsb2NrIHNpemUgKGJ5dGVzKQorICogXHJldHVybnMgbWVtb3J5IGJsb2NrIHBvaW50ZXIgb3IgTlVMTAorICovCit2b2lkICpiY21vc19kbWFfYWxsb2ModWludDhfdCBkZXZpY2UsIHVpbnQzMl90IHNpemUpOworCisvKiogUmVsZWFzZSBETUEtYWJsZSBtZW1vcnkKKyAqIFxwYXJhbVtpbl0gICBkZXZpY2UgIERldmljZSBpZAorICogXHBhcmFtW2luXSAgIHB0ciAgICAgQmxvY2sgcG9pbnRlcgorICovCit2b2lkIGJjbW9zX2RtYV9mcmVlKHVpbnQ4X3QgZGV2aWNlLCB2b2lkICpwdHIpOworCisjZW5kaWYgLyogI2lmbmRlZiBCQ01PU19ETUFfQUxMT0NfRlJFRV9JTkxJTkUgKi8KKworI2lmbmRlZiBCQ01PU19WSVJUX1RPX1BIWVNfSU5MSU5FCisKKy8qKiBDb252ZXJ0IHZpcnR1YWwgYWRkcmVzcyB0byBwaHlzaWNhbCBhZGRyZXNzCisgKgorICogXHBhcmFtW2luXSAgIHZhICAgICAgVmlydHVhbCBhZGRyZXNzCisgKiBccmV0dXJucyAtIHBoeXNpY2FsIGFkZHJlc3MgdmEgaXMgbWFwcGVkIHRvCisgKi8KK3Vuc2lnbmVkIGxvbmcgYmNtb3NfdmlydF90b19waHlzKHZvaWQgKnZhKTsKKworI2VuZGlmIC8qICNpZm5kZWYgQkNNT1NfVklSVF9UT19QSFlTX0lOTElORSAqLworCisvKiogQH0gKi8KKworLyoqIFxhZGR0b2dyb3VwIGJsa19wb29sCisgKiBAeworICovCisKKy8qIE1lbW9yeSBibG9jayBoZWFkZXIgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9zX21lbWJsayBiY21vc19tZW1ibGs7CisKKy8qIE1lbW9yeSBibG9jayBsaXN0ICovCit0eXBlZGVmIFNUQUlMUV9IRUFEKCwgYmNtb3NfbWVtYmxrKSBiY21vc19tZW1ibGtfbGlzdDsKKworLyogQmxvY2sgbWVtb3J5IHBvb2wgY29udHJvbCBibG9jayAqLworc3RydWN0IGJjbW9zX2Jsa19wb29sCit7CisgICAgYmNtb3NfZmFzdGxvY2sgbG9jazsgICAgICAgIC8qKjwgUG9vbCBwcm90ZWN0aW9uIGxvY2sgKi8KKyAgICBiY21vc19tZW1ibGtfbGlzdCBmcmVlX2xpc3Q7LyoqPCBGcmVlIGJsb2NrIGxpc3QgKi8KKyAgICBiY21vc19ibGtfcG9vbF9wYXJtIHBhcm07ICAgLyoqPCBQb29sIHBhcmFtZXRlcnMgKi8KKyAgICBiY21vc19ibGtfcG9vbF9zdGF0IHN0YXQ7ICAgLyoqPCBQb29sIHN0YXRpc3RpY3MgKi8KKyAgICB2b2lkICpzdGFydDsgICAgICAgICAgICAgICAgLyoqPCBQb29sIHN0YXJ0IHBvaW50ZXIgKi8KKyAgICBjaGFyIG5hbWVbQkNNT1NfTUFYX05BTUVfTEVOR1RIXTsgICAvKio8IFBvb2wgbmFtZSAqLworICAgIHVpbnQzMl90IG1hZ2ljOyAgICAgICAgICAgICAvKio8IG1hZ2ljIG51bWJlciAqLworI2RlZmluZSBCQ01PU19CTEtfUE9PTF9WQUxJRCAgICAgICAgICAgICgoJ2InPDwyNCkgfCAoJ2wnIDw8IDE2KSB8ICgncCcgPDwgOCkgfCAnbycpCisjZGVmaW5lIEJDTU9TX0JMS19QT09MX0RFTEVURUQgICAgICAgICAgKCgnYic8PDI0KSB8ICgnbCcgPDwgMTYpIHwgKCdwJyA8PCA4KSB8ICd+JykKKyAgICBTVEFJTFFfRU5UUlkoYmNtb3NfYmxrX3Bvb2wpIGxpc3Q7IC8qIFBvb2wgbGlzdCAqLworfTsKKworLyogVG90YWwgbWVtb3J5IG9jY3VwaWVkIGJ5IGFsbCBibG9jayBwb29scyAqLworZXh0ZXJuIHVpbnQzMl90IGJjbW9zX3RvdGFsX2Jsa19wb29sX3NpemU7CisKKy8qKiBAfSBibGtfcG9vbCAqLworCisvKiogXGFkZHRvZ3JvdXAgc3lzdGVtX21zZworICogQHsKKyAqLworCisvKiogUmVsZWFzZSBtZXNzYWdlCisgKiBccGFyYW1baW5dICAgbXNnICAgICAgICAgICAgIE1lc3NhZ2UgaGFuZGxlCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBiY21vc19tc2dfZnJlZShiY21vc19tc2cgKm1zZykKK3sKKyAgICBpZiAobXNnLT5yZWxlYXNlKQorICAgIHsKKyAgICAgICAgbXNnLT5yZWxlYXNlKG1zZyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbW9zX2ZyZWUobXNnKTsKKyAgICB9Cit9CisKK3R5cGVkZWYgU1RBSUxRX0hFQUQoLCBiY21vc19tc2cpIGJjbW9zX21zZ19saXN0OworCisvKiogU2ltcGxlIE1lc3NhZ2UgcXVldWUgY29udHJvbCBibG9jay4KKyAqIFNpbXBsZSBtZXNzYWdlIHF1ZXVlIGRvZXNuJ3Qgc3VwcG9ydCB3YWl0aW5nIG9uLgorICogSXQgaXMgdXNlZCBpbiBtb2R1bGUgcXVldWUgbWVjaGFuaXNtcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb3NfbXNnX3F1ZXVlX253Cit7CisgICAgYmNtb3NfbXNnX3F1ZXVlX3Bhcm0gcGFybTsgIC8qKjwgUXVldWUgcGFyYW1ldGVycyAqLworICAgIGJjbW9zX21zZ19xdWV1ZV9zdGF0IHN0YXQ7ICAvKio8IFF1ZXVlIHN0YXRpc3RpY3MgKi8KKyAgICBiY21vc19mYXN0bG9jayBsb2NrOyAgICAgICAgLyoqPCBRdWV1ZSBwcm90ZWN0aW9uIGxvY2sgKi8KKyAgICBiY21vc19tc2dfbGlzdCBtc2dsOyAgICAgICAgLyoqPCBNZXNzYWdlIGxpc3QgKi8KKyAgICBiY21vc19tc2dfbGlzdCBtc2dsX3VyZzsgICAgLyoqPCBVcmdlbnQgbWVzc2FnZSBsaXN0ICovCisgICAgdWludDMyX3QgZmxhZ3M7ICAgICAgICAgICAgIC8qKjwgUXVldWUgZmxhZ3MgKi8KK30gYmNtb3NfbXNnX3F1ZXVlX253OworCisvKiogTWVzc2FnZSBxdWV1ZSBjb250cm9sIGJsb2NrICovCitzdHJ1Y3QgYmNtb3NfbXNnX3F1ZXVlCit7CisgICAgYmNtb3NfbXNnX3F1ZXVlX253IHE7ICAgICAgIC8qKjwgUXVldWUgY29udHJvbCBibG9jayAqLworICAgIGJjbW9zX3NlbSBtOyAgICAgICAgICAgICAgICAvKio8IE11dGV4IHRvIHN1c3BlbmQgd2FpdGluZyB0YXNrIG9uICovCisgICAgYmNtb3NfYm9vbCBpc193YWl0aW5nOyAgICAgIC8qKjwgVFJVRSBpZiB0YXNrIGlzIHdhaXRpbmcgb24gcXVldWUgKi8KKyAgICBjaGFyIG5hbWVbQkNNT1NfTUFYX05BTUVfTEVOR1RIXTsgICAvKio8IFF1ZXVlIG5hbWUgKi8KKyNpZmRlZiBCQ01PU19NU0dfUVVFVUVfUkVNT1RFX1NVUFBPUlQKKyAgICBsb25nIGVwOyAgICAgICAgICAgICAgICAgICAgLyoqPCBFbmRwb2ludCBoYW5kbGUgKGUuZy4sIHNvY2tldCkgKi8KKyAgICB2b2lkICplcF9leHRyYV9kYXRhOyAgICAgICAgLyoqPCBFeHRyYSBkYXRhIC0gZGVwZW5kaW5nIG9uIGVwIHR5cGUgKi8KKyAgICB1aW50MzJfdCBlcF9leHRyYV9kYXRhX3NpemU7LyoqPCBFeHRyYSBkYXRhIHNpemUgKi8KKyAgICB1aW50OF90ICpzZW5kX2J1ZjsgICAgICAgICAgLyoqPCBTZW5kIGJ1ZmZlciAqLworICAgIHVpbnQ4X3QgKnJlY3ZfYnVmOyAgICAgICAgICAvKio8IFJlY2VpdmUgYnVmZmVyICovCisgICAgYmNtb3NfbXV0ZXggc2VuZF9sb2NrOyAgICAgIC8qKjwgTXV0ZXggdGhhdCBwcm90ZWN0cyBzZW5kX2J1ZiAqLworI2VuZGlmCisgICAgdWludDMyX3QgbWFnaWM7ICAgICAgICAgICAgIC8qKjwgbWFnaWMgbnVtYmVyICovCisjZGVmaW5lIEJDTU9TX01TR19RVUVVRV9WQUxJRCAgICAgICAgICAgKCgnbSc8PDI0KSB8ICgncScgPDwgMTYpIHwgKCd1JyA8PCA4KSB8ICdlJykKKyNkZWZpbmUgQkNNT1NfTVNHX1FVRVVFX0RFTEVURUQgICAgICAgICAoKCdtJzw8MjQpIHwgKCdxJyA8PCAxNikgfCAoJ3UnIDw8IDgpIHwgJ34nKQorICAgIFNUQUlMUV9FTlRSWShiY21vc19tc2dfcXVldWUpIGxpc3Q7IC8qIFF1ZXVlIGxpc3QgKi8KK307CisKKy8qKiBNZXNzYWdlIHF1ZXVlIGdyb3VwIGNvbnRyb2wgYmxvY2sgKi8KK3N0cnVjdCBiY21vc19tc2dfcWdyb3VwCit7CisgICAgYmNtb3NfbXNnX3Fncm91cF9wYXJtIHBhcm07IC8qKjwgUXVldWUgZ3JvdXAgcGFyYW1ldGVycyAqLworICAgIGJjbW9zX21zZ19saXN0ICptc2dsOyAgICAgICAvKio8IEFycmF5IG9mIHBhcm0ubnF1ZXVlcyBtZXNzYWdlIGxpc3RzICovCisgICAgYmNtb3NfbXNnX3F1ZXVlX3N0YXQgc3RhdDsgIC8qKjwgUXVldWUgZ3JvdXAgc3RhdGlzdGljcyAqLworICAgIGJjbW9zX3NlbSBtOyAgICAgICAgICAgICAgICAvKio8IE11dGV4IHRvIHN1c3BlbmQgd2FpdGluZyB0YXNrIG9uICovCisgICAgYmNtb3NfZmFzdGxvY2sgbG9jazsgICAgICAgIC8qKjwgUXVldWUgZ3JvdXAgcHJvdGVjdGlvbiBsb2NrICovCisgICAgdWludDMyX3QgYWN0aXZlX21hc2s7ICAgICAgIC8qKjwgQml0bWFzayBvZiBxdWV1ZXMgY29udGFpbmluZyBtZXNzYWdlcyAqLworICAgIGJjbW9zX2Jvb2wgaXNfd2FpdGluZzsgICAgICAvKio8IFRSVUUgaWYgdGFzayBpcyB3YWl0aW5nIG9uIHF1ZXVlIGdyb3VwICovCisgICAgY2hhciBuYW1lW0JDTU9TX01BWF9OQU1FX0xFTkdUSF07ICAgLyoqPCBRdWV1ZSBncm91cCBuYW1lICovCisgICAgdWludDMyX3QgbWFnaWM7ICAgICAgICAgICAgIC8qKjwgbWFnaWMgbnVtYmVyICovCisjZGVmaW5lIEJDTU9TX01TR19RR1JPVVBfVkFMSUQgICAgICAgICAgICgoJ20nPDwyNCkgfCAoJ3EnIDw8IDE2KSB8ICgnZycgPDwgOCkgfCAncicpCisjZGVmaW5lIEJDTU9TX01TR19RR1JPVVBfREVMRVRFRCAgICAgICAgICgoJ20nPDwyNCkgfCAoJ3EnIDw8IDE2KSB8ICgnZycgPDwgOCkgfCAnficpCisgICAgU1RBSUxRX0VOVFJZKGJjbW9zX21zZ19xZ3JvdXApIGxpc3Q7IC8qIFF1ZXVlIGdyb3VwIGxpc3QgKi8KK307CisKKy8qKiBNZXNzYWdlIHBvb2wgY29udHJvbCBibG9jayAqLworc3RydWN0IGJjbW9zX21zZ19wb29sCit7CisgICAgYmNtb3NfYmxrX3Bvb2wgYmxrX3Bvb2w7ICAgIC8qKjwgVW5kZXJseWluZyBibG9jayBtZW1vcnkgcG9vbCAqLworICAgIGJjbW9zX21zZ19wb29sX3Bhcm0gcGFybTsgICAvKio8IFBvb2wgcGFyYW1ldGVycyAqLworfTsKKworLyogVG90YWwgbWVtb3J5IG9jY3VwaWVkIGJ5IGFsbCBtZXNzYWdlIHBvb2xzICovCitleHRlcm4gdWludDMyX3QgYmNtb3NfdG90YWxfbXNnX3Bvb2xfc2l6ZTsKKworLyoqIEB9IHN5c3RlbV9tc2cgKi8KKworLyoqIFxhZGR0b2dyb3VwIHN5c3RlbV90aW1lciAqLworCisvKiBUaW1lciBwcmVjaXNpb24uIE11c3QgYmUgYSBtdWx0aXBsZSBvZiAyLgorICogVGltZWQgZXhwaXJhdGlvbiB0aW1lc3RhbXAgaXMgcm91bmRlZCB1cCB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiB0aW1lciBwcmVjaXNpb24KKyAqLworI2RlZmluZSBCQ01PU19USU1FUl9QUkVDSVNJT05fVVMgICAgICAgIDMyCisjaWYgKEJDTU9TX1RJTUVSX1BSRUNJU0lPTl9VUyAmIChCQ01PU19USU1FUl9QUkVDSVNJT05fVVMgLSAxKSkKKyAgICAjZXJyb3IgQkNNT1NfVElNRVJfUFJFQ0lTSU9OX1VTIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAyCisjZW5kaWYKKworLyogVGhlcmUgYXJlIDIgdGltZXIgaW1wbGVtZW50YXRpb25zCisgKiAtIERMSVNULWJhc2VkIC0gd29ya3Mgd2VsbCB3aGVuIG1vc3Qgb2YgYWN0aXZlIHRpbWVycyBoYXZlIHRoZSBzYW1lIGR1cmF0aW9uCisgKiAtIFJCLXRyZWUgYmFzZWQgLSBtb3JlIGV4cGVuc2l2ZSBpbiBzaW1wbGUgY2FzZSwgYnV0IHNjYWxlcyBiZXR0ZXIgZm9yIGxhcmdlIG51bWJlciBvZiB0aW1lcnMKKyAqICAgICAgICAgICAgICAgICAgIHdpdGggYXJiaXRyYXJ5IGR1cmF0aW9ucworICovCisjZGVmaW5lIEJDTU9TX1RJTUVSX1JCX1RSRUUKKworLyoqIFRpbWVyIGNvbnRyb2wgYmxvY2sgKi8KK3N0cnVjdCBiY21vc190aW1lcgoreworICAgIGJjbW9zX21zZyBtc2c7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVGltZXIgbWVzc2FnZSAqLworICAgIGJjbW9zX3RpbWVyX3Bhcm0gcGFybTsgICAgICAgICAgICAgIC8qKjwgVGltZXIgcGFyYW1ldGVycyAqLworICAgIEZfYmNtb3NfdGltZXJfaGFuZGxlciBoYW5kbGVyOyAgICAgIC8qKjwgVGltZXIgaGFuZGxlciAqLworICAgIHVpbnQzMl90IHBlcmlvZDsgICAgICAgICAgICAgICAgICAgIC8qKjwgVGltZXIgcGVyaW9kICh1cykgaWYgcGVyaW9kaWMgKi8KKyAgICB1aW50MzJfdCBleHBpcmVfYXQ7ICAgICAgICAgICAgICAgICAvKio8IFRpbWVzdGFtcCB3aGVuIHRpbWVyIHNob3VsZCBleHBpcmUgKi8KKyAgICB1aW50MzJfdCBmbGFnczsgICAgICAgICAgICAgICAgICAgICAvKiAgIEludGVybmFsIGZsYWdzICovCisjZGVmaW5lIEJDTU9TX1RJTUVSX0ZMQUdfUlVOTklORyAgICAgICAgMHgwMDAwMDAwMSAgICAgIC8qIFRpbWVyIGlzIHJ1bm5pbmcgKi8KKyNkZWZpbmUgQkNNT1NfVElNRVJfRkxBR19FWFBJUkVEICAgICAgICAweDAwMDAwMDAyICAgICAgLyogVGltZXIgaGFzIGV4cGlyZWQsIGJ1dCBub3QgeWV0IGhhbmRsZWQgKi8KKyNkZWZpbmUgQkNNT1NfVElNRVJfRkxBR19BQ1RJVkUgICAgICAgICAoQkNNT1NfVElNRVJfRkxBR19SVU5OSU5HIHwgQkNNT1NfVElNRVJfRkxBR19FWFBJUkVEKQorI2RlZmluZSBCQ01PU19USU1FUl9GTEFHX1ZBTElEICAgICAgICAgIDB4MDAwMDAwMDQKKyAgICBiY21vc19tc2dfcXVldWVfbncgKnF1ZXVlOyAgICAgICAgICAvKio8IFF1ZXVlIGV4cGlyZWQgdGltZXIgaXMgb24gKi8KKyAgICBiY21vc190YXNrICp0YXNrOyAgICAgICAgICAgICAgICAgICAvKio8IFRhc2sgdGhhdCBleGVjdXRlcyB0aW1lciBoYW5kbGVyICovCisjaWZkZWYgQkNNT1NfVElNRVJfUkJfVFJFRQorICAgIFJCX0VOVFJZKGJjbW9zX3RpbWVyKSBlbnRyeTsgICAgICAgIC8qKjwgVGltZXIgcG9vbCBlbnRyeSAqLworI2Vsc2UKKyAgICBUQUlMUV9FTlRSWShiY21vc190aW1lcikgZW50cnk7CisjZW5kaWYKK307CisKKy8qKiBDaGVjayBpZiB0aW1lciBpcyBydW5uaW5nCisgKiBccGFyYW1baW5dICAgdGltZXIgICBUaW1lciBoYW5kbGUKKyAqIFxyZXR1cm5zIFRSVUUgaWYgdGltZXIgaXMgcnVubmluZworICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgYmNtb3NfdGltZXJfaXNfcnVubmluZyhjb25zdCBiY21vc190aW1lciAqdGltZXIpCit7CisgICAgYmNtb3NfYm9vbCBydW5uaW5nID0gKCh0aW1lci0+ZmxhZ3MgJiBCQ01PU19USU1FUl9GTEFHX1JVTk5JTkcpICE9IDApIHx8CisgICAgICAgICh0aW1lci0+cGFybS5wZXJpb2RpYyAmJiAoKHRpbWVyLT5mbGFncyAmIEJDTU9TX1RJTUVSX0ZMQUdfRVhQSVJFRCkgIT0gMCkpOworICAgIHJldHVybiBydW5uaW5nOworfQorCitzdGF0aWMgaW5saW5lIGJjbW9zX3RpbWVyICpfYmNtb3NfbXNnX3RvX3RpbWVyKGJjbW9zX21zZyAqbXNnKQoreworICAgIEJVR19PTihtc2ctPnR5cGUgIT0gQkNNT1NfTVNHX0lEX0lOVEVSTkFMX1RJTUVSKTsKKyAgICByZXR1cm4gKGJjbW9zX3RpbWVyICopbXNnOworfQorCisvKiogQH0gKi8KKworLyoqIFxhZGR0b2dyb3VwIHN5c3RlbV9tb2R1bGUKKyAqIEB7CisgKi8KKworLyoqIE1vZHVsZSBjb250cm9sIGJsb2NrICovCitzdHJ1Y3QgYmNtb3NfbW9kdWxlCit7CisgICAgYmNtb3NfbW9kdWxlX3Bhcm0gcGFybTsgICAgIC8qKjwgTW9kdWxlIHBhcmFtZXRlcnMgKi8KKyAgICBiY21vc19tb2R1bGVfaWQgaWQ7ICAgICAgICAgLyoqPCBNb2R1bGUgaWQgKi8KKyAgICBpbnQgaWR4OyAgICAgICAgICAgICAgICAgICAgLyoqPCBNb2R1bGUgaW5kZXggaW4gdGFzayBjb250cm9sIGJsb2NrICovCisgICAgYmNtb3NfbXNnX3F1ZXVlX253IG1zZ3E7ICAgIC8qKjwgTWVzc2FnZSBxdWV1ZSAqLworICAgIGJjbW9zX3Rhc2sgKm15X3Rhc2s7ICAgICAgICAvKio8IFRhc2sgdGhlIG1vZHVsZSBpcyBhc3NvY2lhdGVkIHdpdGggKi8KKyAgICB2b2lkICpjb250ZXh0OyAgICAgICAgICAgICAgLyoqPCBVc2VyLWRlZmluZWQgY29udGV4dCAqLworICAgIGNoYXIgbmFtZVtCQ01PU19NQVhfTkFNRV9MRU5HVEhdOyAgIC8qKjwgTW9kdWxlIG5hbWUgKi8KK307CisKKy8qKiBAfSBzeXN0ZW1fbW9kdWxlICovCisKKy8qKiBcYWRkdG9ncm91cCBzeXN0ZW1fZXZlbnQKKyAqIEB7CisgKi8KKworLyoqIEV2ZW50IGNvbnRyb2wgYmxvY2sgKi8KK3N0cnVjdCBiY21vc19ldmVudAoreworICAgIGJjbW9zX21zZyBtc2c7ICAgICAgICAgICAgICAvKio8IE1lc3NhZ2UgaGVhZGVyLiBVc2VkIHRvIGRlbGl2ZXIgZXZlbnQgdG8gbW9kdWxlJ3MgcXVldWUgKi8KKyAgICBiY21vc19ldmVudF9pZCBpZDsgICAgICAgICAgLyoqPCBFdmVudCBzZXQgaWQgKi8KKyAgICBiY21vc19ldmVudF9wYXJtIHBhcm07ICAgICAgICAvKio8IEV2ZW50IHBhcmFtZXRlcnMgKi8KKyAgICBiY21vc19mYXN0bG9jayBsb2NrOyAgICAgICAgLyoqPCBQcm90ZWN0cyBldmVudCBjb250cm9sIGJsb2NrICovCisgICAgdWludDMyX3QgYWN0aXZlX2JpdHM7ICAgICAgIC8qKjwgQWN0aXZlIGV2ZW50IGJpdHMgKi8KKworICAgIGJjbW9zX3NlbSBtOyAgICAgICAgICAgICAgICAvKio8IE11dGV4IHRvIHN1c3BlbmQgdGFzayBvbi4gVHJhZGl0aW9uYWwgbW9kZSBvbmx5ICovCisgICAgYmNtb3NfYm9vbCBpc193YWl0aW5nOyAgICAgIC8qKjwgVFJVRSBpZiB0YXNrIGlzIHdhaXRpbmcgZm9yIGV2ZW50ICovCisgICAgY2hhciBuYW1lW0JDTU9TX01BWF9OQU1FX0xFTkdUSF07ICAgLyoqPCBFdmVudCBuYW1lICovCit9OworCisKK3N0YXRpYyBpbmxpbmUgYmNtb3NfZXZlbnQgKl9iY21vc19tc2dfdG9fZXZlbnQoYmNtb3NfbXNnICptc2cpCit7CisgICAgQlVHX09OKG1zZy0+dHlwZSAhPSBCQ01PU19NU0dfSURfSU5URVJOQUxfRVZFTlQpOworICAgIHJldHVybiAoYmNtb3NfZXZlbnQgKiltc2c7Cit9CisKKy8qCisgKiBMb3cgbGV2ZWwgc2VydmljZXMKKyAqLworCisvKiogXGFkZHRvZ3JvdXAgc3lzdGVtX2J1ZgorICogQHsKKyAqLworCisjaWZuZGVmIEJDTU9TX0JVRl9PU19TUEVDSUZJQworI2RlZmluZSBCQ01PU19CVUZfREFUQV9JTkxJTkUKKyNlbmRpZgorCisjaWZkZWYgQkNNT1NfQlVGX0lOTElORQorI2RlZmluZSBCQ01PU19CVUZfQUxMT0NfRlJFRV9JTkxJTkUKKyNkZWZpbmUgQkNNT1NfQlVGX0RBVEFfSU5MSU5FCisjZW5kaWYKKworI2lmbmRlZiBCQ01PU19CVUZfREFUQV9HVUFSRAorI2RlZmluZSBCQ01PU19CVUZfREFUQV9HVUFSRCAgICAgICAgICAgIDAKKyNlbmRpZgorCisjaWZuZGVmIEJDTU9TX0JVRl9EQVRBX0FMSUdOTUVOVAorI2RlZmluZSBCQ01PU19CVUZfREFUQV9BTElHTk1FTlQgICAgICAgIDY0CisjZW5kaWYKKworI2lmbmRlZiBCQ01PU19CVUZfQUxMT0NfRlJFRV9JTkxJTkUKKworLyoqIEFsbG9jYXRlIHRyYW5zcG9ydCBidWZmZXIuCisgKiBUaGUgYnVmZmVyIGNhbiBhY2NvbW1vZGF0ZSB1cCB0byBzaXplIGJ5dGVzIG9mIGRhdGEuCisgKiBJbiBhZGRpdGlvbiBpdCByZXNlcnZlcyBCQ01UUl9CVUZfRVhUUkFfSEVBRFJPT00gaGVhZHJvb20gYnl0ZXMKKyAqIGZvciBleHRyYSBoZWFkZXJzLgorICoKKyAqIFxwYXJhbVtpbl0gICBzaXplICAgIERhdGEgc2l6ZQorICogXHJldHVybnMgYnVmZmVyIHBvaW50ZXIgb3IgTlVMTCBpZiBubyBtZW1vcnkKKyAqLworYmNtb3NfYnVmICpiY21vc19idWZfYWxsb2ModWludDMyX3Qgc2l6ZSk7CisKKyAvKiogUmVsZWFzZSB0cmFuc3BvcnQgYnVmZmVyIGFsbG9jYXRlZCBieSBiY21vc19idWZfYWxsb2MoKQorICAqCisgICogXHBhcmFtW2luXSAgIGJ1ZiAgICBCdWZmZXIgdG8gYmUgcmVsZWFzZWQKKyAgKi8KK3ZvaWQgYmNtb3NfYnVmX2ZyZWUoYmNtb3NfYnVmICpidWYpOworCisjZW5kaWYgLyogQkNNT1NfQlVGX0FMTE9DX0ZSRUVfSU5MSU5FICovCisKKyNpZm5kZWYgQkNNT1NfQlVGX0RBVEFfSU5MSU5FCisKKy8qKiBHZXQgZGF0YSBsZW5ndGgKKyAqCisgKiBccGFyYW1baW5dICAgYnVmICAgICBCdWZmZXIKKyAqIFxyZXR1cm5zIGRhdGEgbGVuZ3RoCisgKi8KK3VpbnQzMl90IGJjbW9zX2J1Zl9sZW5ndGgoYmNtb3NfYnVmICpidWYpOworCisvKiogU2V0IGRhdGEgbGVuZ3RoCisgKgorICogXHBhcmFtW2luXSAgIGJ1ZiAgICAgQnVmZmVyCisgKiBccGFyYW1baW5dICAgbGVuZ3RoICBEYXRhIGxlbmd0aAorICogXHJldHVybnMgMD1PSywgb3IgQkNNX0VSUl9PVkVSRkxPVyBpZiBsZW5ndGggZXhjZWVkcyBzaXplCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX2J1Zl9sZW5ndGhfc2V0KGJjbW9zX2J1ZiAqYnVmLCB1aW50MzJfdCBsZW5ndGgpOworCisvKiogR2V0IGJ1ZmZlciBkYXRhIHBvaW50ZXIuCisgKiBccGFyYW1baW5dICAgYnVmICAgICBCdWZmZXIKKyAqIFxyZXR1cm5zIGRhdGEgcG9pbnRlcgorICovCit1aW50OF90ICpiY21vc19idWZfZGF0YShiY21vc19idWYgKmJ1Zik7CisKKyNlbmRpZiAvKiBCQ01PU19CVUZfREFUQV9JTkxJTkUgKi8KKworI2lmbmRlZiBCQ01PU19CVUZfT1NfU1BFQ0lGSUMKKworI2lmbmRlZiB1bmxpa2VseQorI2RlZmluZSB1bmxpa2VseSh4KSAgICAgKHgpCisjZW5kaWYKKworLyogR2VuZXJpYyAobm90IG9zLXNwZWNpZmljKSBzeXNiIGltcGxlbWVudGF0aW9uICovCisKKy8qCisgKiBOZXR3b3JrIC8gdHJhbnNwb3J0IGJ1ZmZlcgorICovCisKKworLyogTWVtb3J5IGJsb2NrIGxpc3QgKi8KK3R5cGVkZWYgU1RBSUxRX0hFQUQoLCBiY21vc19idWYpIGJjbW9zX2J1Zl9saXN0X2hlYWQ7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgYmNtb3NfYnVmX2xpc3RfaGVhZCBoZWFkOyAgICAgICAgICAgLyoqPCBCdWZmZXIgbGlzdCBoZWFkICovCit9IGJjbW9zX2J1Zl9xdWV1ZTsKKworLyogU3lzdGVtIGJ1ZmZlci4gV2UgcHJvYmFibHkgY2FuIHVzZSBtYnVmIGFzIHdlbGwuICAqLworc3RydWN0IGJjbW9zX2J1ZgoreworICAgIHVpbnQ4X3QgKnN0YXJ0OworICAgIHVpbnQ4X3QgKmRhdGE7CisgICAgYmNtb3NfYmxrX3Bvb2wgKnBvb2w7CisgICAgdWludDMyX3Qgc2l6ZTsKKyAgICB1aW50MzJfdCBsZW47CisgICAgU1RBSUxRX0VOVFJZKGJjbW9zX2J1ZikgbGlzdDsgICAgICAvKio8IE5leHQgYnVmZmVyIHBvaW50ZXIgKi8KKyAgICB1aW50OF90IGNoYW5uZWw7Cit9OworCisKKyNpZm5kZWYgQkNNVFJfQlVGX0VYVFJBX0hFQURST09NCisjZGVmaW5lIEJDTVRSX0JVRl9FWFRSQV9IRUFEUk9PTSAwCisjZW5kaWYKKworCisvKiogSW5pdGlhbGl6ZSBidWZmZXIgcXVldWUKKyAqIFxwYXJhbVtpbl0gICBxICAgICAgIEJ1ZmZlciBxdWV1ZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtb3NfYnVmX3F1ZXVlX2luaXQoYmNtb3NfYnVmX3F1ZXVlICpxKQoreworICAgIFNUQUlMUV9JTklUKCZxLT5oZWFkKTsKK30KKworLyogQ2hlY2sgaWYgYnVmZmVyIHF1ZXVlIGlzIGVtcHR5CisgKiBccGFyYW1baW5dICAgcSAgICAgICBCdWZmZXIgcXVldWUKKyAqIFxyZXR1cm5zIFRSVUUgaWYgdGhlIHF1ZXVlIGlzIGVtcHR5CisgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfYm9vbCBiY21vc19idWZfcXVldWVfaXNfZW1wdHkoYmNtb3NfYnVmX3F1ZXVlICpxKQoreworICAgIHJldHVybiAoYmNtb3NfYm9vbClTVEFJTFFfRU1QVFkoJnEtPmhlYWQpOworfQorCisvKiogRW5xdWV1ZSBidWZmZXIKKyAqCisgKiBNdXN0IGJlIGNhbGxlZCB1bmRlciBsb2NrLCBlLmcuLCBxLT5sb2NrCisgKgorICogXHBhcmFtW2luXSAgIHEgICAgICAgQnVmZmVyIHF1ZXVlCisgKiBccGFyYW1baW5dICAgYnVmICAgICBCdWZmZXIKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGJjbW9zX2J1Zl9xdWV1ZV9wdXQoYmNtb3NfYnVmX3F1ZXVlICpxLCBiY21vc19idWYgKmJ1ZikKK3sKKyAgICBTVEFJTFFfSU5TRVJUX1RBSUwoJnEtPmhlYWQsIGJ1ZiwgbGlzdCk7Cit9CisKKy8qIERlcXVldWUgYnVmZmVyCisgKgorICogTXVzdCBiZSBjYWxsZWQgdW5kZXIgbG9jaywgZS5nLiwgcS0+bG9jaworICoKKyAqIFJlbW92ZSBhbmQgcmV0dXJuIHRoZSAxc3QgcXVldWVkIGJ1ZmZlci4KKyAqIFxwYXJhbVtpbl0gICBxICAgICAgIEJ1ZmZlciBxdWV1ZQorICogXHJldHVybnMgdGhlICBidWZmZXIgcG9pbnRlcgorICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2J1ZiAqYmNtb3NfYnVmX3F1ZXVlX2dldChiY21vc19idWZfcXVldWUgKnEpCit7CisgICAgYmNtb3NfYnVmICpidWY7CisgICAgYnVmID0gU1RBSUxRX0ZJUlNUKCZxLT5oZWFkKTsKKyAgICBpZiAoYnVmKQorICAgICAgICBTVEFJTFFfUkVNT1ZFX0hFQUQoJnEtPmhlYWQsIGxpc3QpOworICAgIHJldHVybiBidWY7Cit9CisKKy8qIFBlZWsgaW50byBxdWV1ZSBhbmQgcmV0dXJuIHRoZSAxc3QgYnVmZmVyIHdpdGhvdXQgZGVxdWVpbmcgaXQKKyAqCisgKiBNdXN0IGJlIGNhbGxlZCB1bmRlciBsb2NrLCBlLmcuLCBxLT5sb2NrCisgKiBccGFyYW1baW5dICAgcSAgICAgICBCdWZmZXIgcXVldWUKKyAqIFxyZXR1cm5zIHRoZSAgYnVmZmVyIHBvaW50ZXIKKyAqLworc3RhdGljIGlubGluZSBiY21vc19idWYgKmJjbW9zX2J1Zl9xdWV1ZV9wZWVrKGJjbW9zX2J1Zl9xdWV1ZSAqcSkKK3sKKyAgICByZXR1cm4gU1RBSUxRX0ZJUlNUKCZxLT5oZWFkKTsKK30KKworLyogSW5pdGlhbGl6ZSBidWZmZXIgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfYnVmICpiY21vc19idWZfaW5pdChiY21vc19idWYgKmJ1ZiwgdWludDhfdCAqc3RhcnQsCisgICAgdWludDhfdCAqZGF0YSwgdWludDMyX3Qgc2l6ZSwgdWludDMyX3QgbGVuKQoreworICAgIEJVR19PTigodm9pZCAqKShidWYgKzEpICE9IHN0YXJ0KTsKKyAgICBidWYtPnN0YXJ0ID0gc3RhcnQ7CisgICAgYnVmLT5kYXRhID0gZGF0YTsKKyAgICBidWYtPnNpemUgPSBzaXplOworICAgIGJ1Zi0+bGVuID0gbGVuOworICAgIGJ1Zi0+cG9vbCA9IE5VTEw7CisgICAgcmV0dXJuIGJ1ZjsKK30KKworLyogR2V0IGRhdGEgbGVuZ3RoICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGJjbW9zX2J1Zl9sZW5ndGgoYmNtb3NfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJ1Zi0+bGVuOworfQorCisvKiBTZXQgZGF0YSBsZW5ndGggKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfZXJybm8gYmNtb3NfYnVmX2xlbmd0aF9zZXQoYmNtb3NfYnVmICpidWYsIHVpbnQzMl90IGxlbmd0aCkKK3sKKyAgICBpZiAodW5saWtlbHkobGVuZ3RoID4gYnVmLT5zaXplIC0gKGJ1Zi0+ZGF0YSAtIGJ1Zi0+c3RhcnQpKSkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiISEhJXM6IGxlbmd0aD0ldSBzaXplPSV1IGRhdGE9JXAgc3RhcnQ9JXAgZGF0YS1zdGFydD0ldVxuIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbGVuZ3RoLCBidWYtPnNpemUsIGJ1Zi0+ZGF0YSwgYnVmLT5zdGFydCwgKHVpbnQzMl90KShidWYtPmRhdGEgLSBidWYtPnN0YXJ0KSk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09WRVJGTE9XOworICAgIH0KKyAgICBidWYtPmxlbiA9IGxlbmd0aDsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogR2V0IGJ1ZmZlciBkYXRhIHBvaW50ZXIuICovCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgKmJjbW9zX2J1Zl9kYXRhKGJjbW9zX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBidWYtPmRhdGE7Cit9CisKKy8qIEdldCBidWZmZXIgY2hhbm5lbC4gKi8KK3N0YXRpYyBpbmxpbmUgdWludDhfdCBiY21vc19idWZfY2hhbm5lbChiY21vc19idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYnVmLT5jaGFubmVsOworfQorCisvKiBTZXQgYnVmZmVyIGNoYW5uZWwuICovCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtb3NfYnVmX2NoYW5uZWxfc2V0KGJjbW9zX2J1ZiAqYnVmLCB1aW50OF90IGNoYW5uZWwpCit7CisgICAgYnVmLT5jaGFubmVsID0gY2hhbm5lbDsKK30KKworI2VuZGlmIC8qICNpZm5kZWYgQkNNT1NfQlVGX09TX1NQRUNJRklDICovCisKKy8qKiBAfSBiY21vc19idWYgKi8KKworLyoqIFxhZGR0b2dyb3VwIHN5c3RlbV9jYWNoZQorICogQHsKKyAqLworCisjaWZuZGVmIEJDTU9TX0NBQ0hFX0lOTElORQorCisvKiogSW52YWxpZGF0ZSBhZGRyZXNzIGFyZWEgaW4gZGF0YSBjYWNoZS4gRGlydHkgY2FjaGUgbGluZXMgY29udGVudCBpcyBkaXNjYXJkZWQuCisgKiBccGFyYW1baW5dICAgc3RhcnQgICBBZGRyZXNzIGFyZWEgc3RhcnQKKyAqIFxwYXJhbVtpbl0gICBzaXplICAgIEFkZHJlc3MgYXJlYSBzaXplCisgKi8KK3ZvaWQgYmNtb3NfZGNhY2hlX2ludih2b2lkICpzdGFydCwgdWludDMyX3Qgc2l6ZSk7CisKKy8qKiBGbHVzaCBhZGRyZXNzIGFyZWEgaW4gZGF0YSBjYWNoZS4gRGlydHkgY2FjaGUgbGluZXMgYXJlIGNvbW1pdHRlZCB0byBtZW1vcnkuCisgKiBccGFyYW1baW5dICAgc3RhcnQgICBBZGRyZXNzIGFyZWEgc3RhcnQKKyAqIFxwYXJhbVtpbl0gICBzaXplICAgIEFkZHJlc3MgYXJlYSBzaXplCisgKi8KK3ZvaWQgYmNtb3NfZGNhY2hlX2ZsdXNoKHZvaWQgKnN0YXJ0LCB1aW50MzJfdCBzaXplKTsKKworI2VuZGlmIC8qIEJDTU9TX0NBQ0hFX0lOTElORSAqLworCisvKiogUHJlcGFyZSBmb3IgRE1BIHdyaXRlLgorICogT24gaC93IHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQgRE1BLWNhY2hlIGNvaGVyZW5jeSwgdGhpcyBmdW5jdGlvbiBzaG91bGQKKyAqIHBlcmZvcm0gd3JpdGUgYmFycmllci4KKyAqIE9uIHBsYXRmb3JtcyB0aGF0IGRvbid0IHN1cHBvcnQgRE1BIGNhY2hlIGNvaGVyZW5jeSB0aGlzIGZ1bmN0aW9uIHNob3VsZAorICogZmx1c2ggdGhlIHJlbGV2YW50IGRjYWNoZSBhcmVhCisgKgorICogXHBhcmFtW2luXSAgIHN0YXJ0ICAgRE1BIGJ1ZmZlciBzdGFydCBhZGRyZXNzCisgKiBccGFyYW1baW5dICAgc2l6ZSAgICBETUEgYnVmZmVyIHNpemUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGJjbW9zX3ByZXBhcmVfZm9yX2RtYV93cml0ZSh2b2lkICpzdGFydCwgdWludDMyX3Qgc2l6ZSkKK3sKKyNpZmRlZiBCQ01PU19ETUFfQ0FDSEVfQ09IRVJFTkNZCisgICAgYmNtb3NfYmFycmllcigpOworI2Vsc2UKKyAgICBiY21vc19kY2FjaGVfZmx1c2goc3RhcnQsIHNpemUpOworI2VuZGlmCit9CisKKy8qKiBQcmVwYXJlIGZvciBETUEgcmVhZC4KKyAqIE9uIGgvdyBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0IERNQS1jYWNoZSBjb2hlcmVuY3ksIHRoaXMgZnVuY3Rpb24gc2hvdWxkCisgKiBwZXJmb3JtIHdyaXRlIGJhcnJpZXIuCisgKiBPbiBwbGF0Zm9ybXMgdGhhdCBkb24ndCBzdXBwb3J0IERNQSBjYWNoZSBjb2hlcmVuY3kgdGhpcyBmdW5jdGlvbiBzaG91bGQKKyAqIGludmFsaWRhdGUgdGhlIHJlbGV2YW50IGRjYWNoZSBhcmVhCisgKgorICogXHBhcmFtW2luXSAgIHN0YXJ0ICAgRE1BIGJ1ZmZlciBzdGFydCBhZGRyZXNzCisgKiBccGFyYW1baW5dICAgc2l6ZSAgICBETUEgYnVmZmVyIHNpemUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGJjbW9zX3ByZXBhcmVfZm9yX2RtYV9yZWFkKHZvaWQgKnN0YXJ0LCB1aW50MzJfdCBzaXplKQoreworI2lmZGVmIEJDTU9TX0RNQV9DQUNIRV9DT0hFUkVOQ1kKKyAgICBiY21vc19iYXJyaWVyKCk7CisjZWxzZQorICAgIGJjbW9zX2RjYWNoZV9pbnYoc3RhcnQsIHNpemUpOworI2VuZGlmCit9CisKKy8qKiBAfSBzeXN0ZW1fY2FjaGUgKi8KKworLyoqIFxhZGR0b2dyb3VwIHN5c3RlbV9pbnRlcnJ1cHQKKyAqIEB7CisgKi8KKworI2lmZGVmIEJDTU9TX0lOVEVSUlVQVF9JTkxJTkUKKyNkZWZpbmUgQkNNT1NfSU5URVJSVVBUX0NPTk5FQ1RfRElTQ09OTkVDVF9JTkxJTkUKKyNkZWZpbmUgQkNNT1NfSU5URVJSVVBUX0VOQUJMRV9ESVNBQkxFX0lOTElORQorI2VuZGlmCisKKyNpZm5kZWYgQkNNT1NfSU5URVJSVVBUX0NPTk5FQ1RfRElTQ09OTkVDVF9JTkxJTkUKKy8qKiBDb25uZWN0IHN5c3RlbSBpbnRlcnJ1cHQKKyAqIFxwYXJhbVtpbl0gICBpcnEgICAgIElSUSBudW1iZXIKKyAqIFxwYXJhbVtpbl0gICBjcHUgICAgIENQVSBudW1iZXIgKGZvciBTTVApCisgKiBccGFyYW1baW5dICAgZmxhZ3MgICBJUlEgZmxhZ3MKKyAqIFxwYXJhbVtpbl0gICBpc3IgICAgIElTUgorICogXHBhcmFtW2luXSAgIG5hbWUgICAgZGV2aWNlIG5hbWUKKyAqIFxwYXJhbVtpbl0gICBwcml2ICAgIFByaXZhdGUgY29va2llCisgKiBccmV0dXJucyAwPU9LLCA8MC0gZXJyb3IKKyAqLworaW50IGJjbW9zX2ludF9jb25uZWN0KGludCBpcnEsIGludCBjcHUsIGludCBmbGFncywKKyAgICBpbnQgKCppc3IpKGludCBpcnEsIHZvaWQgKnByaXYpLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpwcml2KTsKKworLyoqIERpc2Nvbm5lY3Qgc3lzdGVtIGludGVycnVwdAorICogXHBhcmFtW2luXSAgIGlycSAgICAgSVJRIG51bWJlcgorICogXHBhcmFtW2luXSAgIHByaXYgICAgUHJpdmF0ZSBjb29raWUgcGFzc2VkIGluIGJjbW9zX2ludF9jb25uZWN0KCkKKyAqIFxyZXR1cm5zIDA9T0ssIDwwLSBlcnJvcgorICovCit2b2lkIGJjbW9zX2ludF9kaXNjb25uZWN0KGludCBpcnEsIHZvaWQgKnByaXYpOworI2VuZGlmCisKKyNpZm5kZWYgQkNNT1NfSU5URVJSVVBUX0VOQUJMRV9ESVNBQkxFX0lOTElORQorLyoqIFVubWFzayBJUlEKKyAqIFxwYXJhbVtpbl0gICBpcnEgSVJRCisgKi8KK3ZvaWQgYmNtb3NfaW50X2VuYWJsZShpbnQgaXJxKTsKKworLyoqIE1hc2sgSVJRCisgKiBccGFyYW1baW5dICAgaXJxIElSUQorICovCit2b2lkIGJjbW9zX2ludF9kaXNhYmxlKGludCBpcnEpOworI2VuZGlmCisKKy8qKiBAfSAqLworCisvKiBHZXQgY2hhciwgcHV0IGNoYXIgc3VwcG9ydCAqLworI2lmbmRlZiBCQ01PU19HRVRDSEFSX0lOTElORQorc3RhdGljIGlubGluZSBpbnQgYmNtb3NfZ2V0Y2hhcih2b2lkKQoreworICAgIHJldHVybiBnZXRjaGFyKCk7Cit9CisjZW5kaWYKKworI2lmbmRlZiBCQ01PU19QVVRDSEFSX0lOTElORQordm9pZCBiY21vc19wdXRjaGFyKGludCBjKTsKKyNlbmRpZgorCisjaWZuZGVmIEJDTU9TX1NFTV9QT1NUX0lTX0FMTE9XRURfSU5MSU5FCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgYmNtb3Nfc2VtX3Bvc3RfaXNfYWxsb3dlZCh2b2lkKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBCQ01PU19DT01NT04yX0hfICovCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2JjbW9zX2VuZGlhbi5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9iY21vc19lbmRpYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2U0MWRjCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9iY21vc19lbmRpYW4uaApAQCAtMCwwICsxLDEzMCBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBCQ01PU19FTkRJQU5fSF8KKyNkZWZpbmUgQkNNT1NfRU5ESUFOX0hfCisKKyNpZm5kZWYgQkNNT1NfU1lTVEVNX0hfCisjZXJyb3IgUGxlYXNlIGRvIG5vdCBpbmNsdWRlIGJjbW9zX2VuZGlhbi5oIGRpcmVjdGx5LiBJbmNsdWRlIGJjbW9zX3N5c3RlbS5oCisjZW5kaWYKKworCisKKy8qKiBAfSBzeXN0ZW1fZXZlbnQgKi8KKworLyoqIFxhZGR0b2dyb3VwIHN5c3RlbV9lbmRpYW4KKyAqIEB7CisgKi8KKyNpZm5kZWYgQkNNT1NfQVJDSF9FTkRJQU5fU1dBUAorCisvKiogU3dhcHMgdGhlIGVuZGlhbm5lc3Mgb2YgYSAxNi1iaXQgaW50ZWdlcgorICogXHBhcmFtW2luXSBuIHRoZSBvcmlnaW5hbCBudW1iZXIKKyAqIFxyZXR1cm4gbnVtYmVyIHdpdGggc3dhcHBlZCBlbmRpYW5uZXNzCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDE2X3QgYmNtb3NfZW5kaWFuX3N3YXBfdTE2KHVpbnQxNl90IG4pCit7CisgICAgcmV0dXJuICgobiA8PCA4ICkgJiAweEZGMDBVKXwoKG4gPj4gOCkgJiAweDAwRkZVKTsKK30KKworLyoqIFN3YXBzIHRoZSBlbmRpYW5uZXNzIG9mIGEgMjQtYml0IGludGVnZXIKKyAqIFxwYXJhbVtpbl0gbiB0aGUgb3JpZ2luYWwgbnVtYmVyCisgKiBccmV0dXJuIG51bWJlciB3aXRoIHN3YXBwZWQgZW5kaWFubmVzcworICovCitzdGF0aWMgaW5saW5lIHVpbnQyNF90IGJjbW9zX2VuZGlhbl9zd2FwX3UyNCh1aW50MjRfdCBuKQoreworICAgIHJldHVybiAodWludDI0X3QpeyAudTggPSB7IG4udThbMl0sIG4udThbMV0sIG4udThbMF0gfSB9OworfQorCisvKiogU3dhcHMgdGhlIGVuZGlhbm5lc3Mgb2YgYSAzMi1iaXQgaW50ZWdlcgorICogXHBhcmFtW2luXSBuIHRoZSBvcmlnaW5hbCBudW1iZXIKKyAqIFxyZXR1cm4gbnVtYmVyIHdpdGggc3dhcHBlZCBlbmRpYW5uZXNzCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgYmNtb3NfZW5kaWFuX3N3YXBfdTMyKHVpbnQzMl90IG4pCit7CisgICAgcmV0dXJuICgobiA8PCAyNCkgJiAweEZGMDAwMDAwVSl8KChuIDw8IDggKSAmIDB4MDBGRjAwMDBVKXwoKG4gPj4gOCkgJiAweDAwMDBGRjAwVSl8KChuID4+IDI0KSAmIDB4MDAwMDAwRkZVKTsKK30KKworLyoqIFN3YXBzIHRoZSBlbmRpYW5uZXNzIG9mIGEgNjQtYml0IGludGVnZXIKKyAqIFxwYXJhbVtpbl0gbiB0aGUgb3JpZ2luYWwgbnVtYmVyCisgKiBccmV0dXJuIG51bWJlciB3aXRoIHN3YXBwZWQgZW5kaWFubmVzcworICovCitzdGF0aWMgaW5saW5lIHVpbnQ2NF90IGJjbW9zX2VuZGlhbl9zd2FwX3U2NCh1aW50NjRfdCBuKQoreworICAgIHJldHVybiAoKCh1aW50NjRfdCliY21vc19lbmRpYW5fc3dhcF91MzIobiAmIDB4RkZGRkZGRkZVKSA8PCAzMikgfCBiY21vc19lbmRpYW5fc3dhcF91MzIoKG4gPj4gMzIpICYgMHhGRkZGRkZGRlUpKTsKK30KKworI2VuZGlmIC8qIEJDTU9TX0FSQ0hfRU5ESUFOX1NXQVAgKi8KKworI2lmIChCQ01fQ1BVX0VORElBTiA9PSBCQ01PU19FTkRJQU5fQklHKQorCisjZGVmaW5lIEJDTU9TX0VORElBTl9DUFVfVE9fQklHX1UxNihuKSAobikKKyNkZWZpbmUgQkNNT1NfRU5ESUFOX0NQVV9UT19CSUdfVTI0KG4pIChuKQorI2RlZmluZSBCQ01PU19FTkRJQU5fQ1BVX1RPX0JJR19VMzIobikgKG4pCisjZGVmaW5lIEJDTU9TX0VORElBTl9DUFVfVE9fQklHX1U2NChuKSAobikKKyNkZWZpbmUgQkNNT1NfRU5ESUFOX0JJR19UT19DUFVfVTE2KG4pIChuKQorI2RlZmluZSBCQ01PU19FTkRJQU5fQklHX1RPX0NQVV9VMjQobikgKG4pCisjZGVmaW5lIEJDTU9TX0VORElBTl9CSUdfVE9fQ1BVX1UzMihuKSAobikKKyNkZWZpbmUgQkNNT1NfRU5ESUFOX0JJR19UT19DUFVfVTY0KG4pIChuKQorCisjZGVmaW5lIEJDTU9TX0VORElBTl9DUFVfVE9fTElUVExFX1UxNihuKSAoYmNtb3NfZW5kaWFuX3N3YXBfdTE2KG4pKQorI2RlZmluZSBCQ01PU19FTkRJQU5fQ1BVX1RPX0xJVFRMRV9VMjQobikgKGJjbW9zX2VuZGlhbl9zd2FwX3UyNChuKSkKKyNkZWZpbmUgQkNNT1NfRU5ESUFOX0NQVV9UT19MSVRUTEVfVTMyKG4pIChiY21vc19lbmRpYW5fc3dhcF91MzIobikpCisjZGVmaW5lIEJDTU9TX0VORElBTl9DUFVfVE9fTElUVExFX1U2NChuKSAoYmNtb3NfZW5kaWFuX3N3YXBfdTY0KG4pKQorI2RlZmluZSBCQ01PU19FTkRJQU5fTElUVExFX1RPX0NQVV9VMTYobikgKGJjbW9zX2VuZGlhbl9zd2FwX3UxNihuKSkKKyNkZWZpbmUgQkNNT1NfRU5ESUFOX0xJVFRMRV9UT19DUFVfVTI0KG4pIChiY21vc19lbmRpYW5fc3dhcF91MjQobikpCisjZGVmaW5lIEJDTU9TX0VORElBTl9MSVRUTEVfVE9fQ1BVX1UzMihuKSAoYmNtb3NfZW5kaWFuX3N3YXBfdTMyKG4pKQorI2RlZmluZSBCQ01PU19FTkRJQU5fTElUVExFX1RPX0NQVV9VNjQobikgKGJjbW9zX2VuZGlhbl9zd2FwX3U2NChuKSkKKworI2VsaWYgKEJDTV9DUFVfRU5ESUFOID09IEJDTU9TX0VORElBTl9MSVRUTEUpCisKKyNkZWZpbmUgQkNNT1NfRU5ESUFOX0NQVV9UT19CSUdfVTE2KG4pIChiY21vc19lbmRpYW5fc3dhcF91MTYobikpCisjZGVmaW5lIEJDTU9TX0VORElBTl9DUFVfVE9fQklHX1UyNChuKSAoYmNtb3NfZW5kaWFuX3N3YXBfdTI0KG4pKQorI2RlZmluZSBCQ01PU19FTkRJQU5fQ1BVX1RPX0JJR19VMzIobikgKGJjbW9zX2VuZGlhbl9zd2FwX3UzMihuKSkKKyNkZWZpbmUgQkNNT1NfRU5ESUFOX0NQVV9UT19CSUdfVTY0KG4pIChiY21vc19lbmRpYW5fc3dhcF91NjQobikpCisjZGVmaW5lIEJDTU9TX0VORElBTl9CSUdfVE9fQ1BVX1UxNihuKSAoYmNtb3NfZW5kaWFuX3N3YXBfdTE2KG4pKQorI2RlZmluZSBCQ01PU19FTkRJQU5fQklHX1RPX0NQVV9VMjQobikgKGJjbW9zX2VuZGlhbl9zd2FwX3UyNChuKSkKKyNkZWZpbmUgQkNNT1NfRU5ESUFOX0JJR19UT19DUFVfVTMyKG4pIChiY21vc19lbmRpYW5fc3dhcF91MzIobikpCisjZGVmaW5lIEJDTU9TX0VORElBTl9CSUdfVE9fQ1BVX1U2NChuKSAoYmNtb3NfZW5kaWFuX3N3YXBfdTY0KG4pKQorCisjZGVmaW5lIEJDTU9TX0VORElBTl9DUFVfVE9fTElUVExFX1UxNihuKSAobikKKyNkZWZpbmUgQkNNT1NfRU5ESUFOX0NQVV9UT19MSVRUTEVfVTI0KG4pIChuKQorI2RlZmluZSBCQ01PU19FTkRJQU5fQ1BVX1RPX0xJVFRMRV9VMzIobikgKG4pCisjZGVmaW5lIEJDTU9TX0VORElBTl9DUFVfVE9fTElUVExFX1U2NChuKSAobikKKyNkZWZpbmUgQkNNT1NfRU5ESUFOX0xJVFRMRV9UT19DUFVfVTE2KG4pIChuKQorI2RlZmluZSBCQ01PU19FTkRJQU5fTElUVExFX1RPX0NQVV9VMjQobikgKG4pCisjZGVmaW5lIEJDTU9TX0VORElBTl9MSVRUTEVfVE9fQ1BVX1UzMihuKSAobikKKyNkZWZpbmUgQkNNT1NfRU5ESUFOX0xJVFRMRV9UT19DUFVfVTY0KG4pIChuKQorCisjZWxzZQorI2Vycm9yIEJDTV9DUFVfRU5ESUFOIG11c3QgYmUgQkNNT1NfRU5ESUFOX0JJRyBvciBfTElUVExFCisjZW5kaWYKKworLyoqIEB9IHN5c3RlbV9lbmRpYW4gKi8KKworI2VuZGlmIC8qIEJDTU9TX0NPTU1PTjJfSF8gKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vYmNtb3NfZXJybm8uYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vYmNtb3NfZXJybm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmEwZmY4Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9iY21vc19lcnJuby5jCkBAIC0wLDAgKzEsODYgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisjaW5jbHVkZSAiYmNtb3Nfc3lzdGVtLmgiCisKKy8qIE1hcCBlcnJvciBjb2RlIHRvIGVycm9yIHN0cmluZyAqLworY29uc3QgY2hhciAqYmNtb3Nfc3RyZXJyb3IoYmNtb3NfZXJybm8gZXJyKQoreworICAgIHN0YXRpYyBjb25zdCBjaGFyICplcnJzdHJbXSA9IHsKKyAgICAgICAgWy1CQ01fRVJSX09LXSAgICAgICAgICAgICAgICAgICAgICAgID0gIk9LIiwKKyAgICAgICAgWy1CQ01fRVJSX0lOX1BST0dSRVNTXSAgICAgICAgICAgICAgID0gIkluIHByb2dyZXNzIiwKKyAgICAgICAgWy1CQ01fRVJSX1BBUk1dICAgICAgICAgICAgICAgICAgICAgID0gIkVycm9yIGluIHBhcmFtZXRlcnMiLAorICAgICAgICBbLUJDTV9FUlJfTk9NRU1dICAgICAgICAgICAgICAgICAgICAgPSAiTm8gbWVtb3J5IiwKKyAgICAgICAgWy1CQ01fRVJSX05PUkVTXSAgICAgICAgICAgICAgICAgICAgID0gIk5vIHJlc291cmNlcyIsCisgICAgICAgIFstQkNNX0VSUl9JTlRFUk5BTF0gICAgICAgICAgICAgICAgICA9ICJJbnRlcm5hbCBlcnJvciIsCisgICAgICAgIFstQkNNX0VSUl9OT0VOVF0gICAgICAgICAgICAgICAgICAgICA9ICJFbnRyeSBkb2Vzbid0IGV4aXN0IiwKKyAgICAgICAgWy1CQ01fRVJSX05PREVWXSAgICAgICAgICAgICAgICAgICAgID0gIkRldmljZSBkb2Vzbid0IGV4aXN0IiwKKyAgICAgICAgWy1CQ01fRVJSX0FMUkVBRFldICAgICAgICAgICAgICAgICAgID0gIkVudHJ5IGFscmVhZHkgZXhpc3RzIiwKKyAgICAgICAgWy1CQ01fRVJSX1JBTkdFXSAgICAgICAgICAgICAgICAgICAgID0gIk91dCBvZiByYW5nZSIsCisgICAgICAgIFstQkNNX0VSUl9QRVJNXSAgICAgICAgICAgICAgICAgICAgICA9ICJObyBwZXJtaXNzaW9uIHRvIHBlcmZvcm0gYW4gb3BlcmF0aW9uIiwKKyAgICAgICAgWy1CQ01fRVJSX05PVF9TVVBQT1JURURdICAgICAgICAgICAgID0gIk9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIiwKKyAgICAgICAgWy1CQ01fRVJSX1BBUlNFXSAgICAgICAgICAgICAgICAgICAgID0gIlBhcnNpbmcgZXJyb3IiLAorICAgICAgICBbLUJDTV9FUlJfSU5WQUxJRF9PUF0gICAgICAgICAgICAgICAgPSAiSW52YWxpZCBvcGVyYXRpb24iLAorICAgICAgICBbLUJDTV9FUlJfSU9dICAgICAgICAgICAgICAgICAgICAgICAgPSAiSS9PIGVycm9yIiwKKyAgICAgICAgWy1CQ01fRVJSX1NUQVRFXSAgICAgICAgICAgICAgICAgICAgID0gIk9iamVjdCBpcyBpbiBiYWQgc3RhdGUiLAorICAgICAgICBbLUJDTV9FUlJfREVMRVRFRF0gICAgICAgICAgICAgICAgICAgPSAiT2JqZWN0IGlzIGRlbGV0ZWQiLAorICAgICAgICBbLUJDTV9FUlJfVE9PX01BTlldICAgICAgICAgICAgICAgICAgPSAiVG9vIG1hbnkgb2JqZWN0cyIsCisgICAgICAgIFstQkNNX0VSUl9OT19NT1JFXSAgICAgICAgICAgICAgICAgICA9ICJObyBtb3JlIGVudHJpZXMiLAorICAgICAgICBbLUJDTV9FUlJfT1ZFUkZMT1ddICAgICAgICAgICAgICAgICAgPSAiQnVmZmVyIG92ZXJmbG93IiwKKyAgICAgICAgWy1CQ01fRVJSX0NPTU1fRkFJTF0gICAgICAgICAgICAgICAgID0gIkNvbW11bmljYXRpb24gZmFpbHVyZSIsCisgICAgICAgIFstQkNNX0VSUl9OT1RfQ09OTkVDVEVEXSAgICAgICAgICAgICA9ICJObyBjb25uZWN0aW9uIHdpdGggdGhlIHRhcmdldCBzeXN0ZW0iLAorICAgICAgICBbLUJDTV9FUlJfU1lTQ0FMTF9FUlJdICAgICAgICAgICAgICAgPSAiU3lzdGVtIGNhbGwgcmV0dXJuZWQgZXJyb3IiLAorICAgICAgICBbLUJDTV9FUlJfTVNHX0VSUk9SXSAgICAgICAgICAgICAgICAgPSAiUmVjZWl2ZWQgbWVzc2FnZSBpcyBpbnNhbmUiLAorICAgICAgICBbLUJDTV9FUlJfVE9PX01BTllfUkVRU10gICAgICAgICAgICAgPSAiVG9vIG1hbnkgb3V0c3RhbmRpbmcgcmVxdWVzdHMiLAorICAgICAgICBbLUJDTV9FUlJfVElNRU9VVF0gICAgICAgICAgICAgICAgICAgPSAiT3BlcmF0aW9uIHRpbWVkIG91dCIsCisgICAgICAgIFstQkNNX0VSUl9UT09fTUFOWV9GUkFHU10gICAgICAgICAgICA9ICJUb28gbWFueSBmcmFnbWVudHMiLAorICAgICAgICBbLUJDTV9FUlJfTlVMTF0gICAgICAgICAgICAgICAgICAgICAgPSAiR290IE5VTEwgcG9pbnRlciIsCisgICAgICAgIFstQkNNX0VSUl9SRUFEX09OTFldICAgICAgICAgICAgICAgICA9ICJBdHRlbXB0IHRvIHNldCByZWFkLW9ubHkgcGFyYW1ldGVyIiwKKyAgICAgICAgWy1CQ01fRVJSX09OVV9FUlJfUkVTUF0gICAgICAgICAgICAgID0gIk9OVSByZXR1cm5lZCBhbiBlcnJvciByZXNwb25zZSIsCisgICAgICAgIFstQkNNX0VSUl9NQU5EQVRPUllfUEFSTV9JU19NSVNTSU5HXSA9ICJNYW5kYXRvcnkgcGFyYW1ldGVyIGlzIG1pc3NpbmciLAorICAgICAgICBbLUJDTV9FUlJfS0VZX1JBTkdFXSAgICAgICAgICAgICAgICAgPSAiS2V5IGZpZWxkIG91dCBvZiByYW5nZSIsCisgICAgICAgIFstQkNNX0VSUl9RVUVVRV9FTVBUWV0gICAgICAgICAgICAgICA9ICJSeCBvZiBQQ0llIGVtcHR5IiwKKyAgICAgICAgWy1CQ01fRVJSX1FVRVVFX0ZVTExdICAgICAgICAgICAgICAgID0gIlR4IG9mIFBDSWUgZnVsbCIsCisgICAgICAgIFstQkNNX0VSUl9UT09fTE9OR10gICAgICAgICAgICAgICAgICA9ICJQcm9jZXNzaW5nIGlzIHRha2luZyB0b28gbG9uZywgYnV0IHdpbGwgZmluaXNoIGV2ZW50dWFsbHkiLAorICAgICAgICBbLUJDTV9FUlJfSU5TVUZGSUNJRU5UX0xJU1RfTUVNXSAgICAgPSAiSW5zdWZmaWNpZW50IGxpc3QgbWVtb3J5IHByb3ZpZGVkIiwKKworICAgICAgICBbLUJDTV9FUlJfT1VUX09GX1NZTkNdICAgICAgICAgICAgICAgPSAiU2VxdWVuY2UgbnVtYmVyIG9yIG9wZXJhdGlvbiBzdGVwIHdhcyBvdXQgb2Ygc3luYyIsCisgICAgICAgIFstQkNNX0VSUl9DSEVDS1NVTV0gICAgICAgICAgICAgICAgICA9ICJDaGVja3N1bSBlcnJvciIsCisgICAgICAgIFstQkNNX0VSUl9JTUFHRV9UWVBFXSAgICAgICAgICAgICAgICA9ICJVbnN1cHBvcnRlZCBmaWxlL2ltYWdlIHR5cGUiLAorICAgICAgICBbLUJDTV9FUlJfSU5DT01QTEVURV9URVJNSU5BVElPTl0gICAgPSAiSW5jb21wbGV0ZSBwcmVtYXR1cmUgdGVybWluYXRpb24iLAorICAgIH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKnVua25vd24gPSAiKnVua25vd24qIjsKKworICAgIGlmICgodW5zaWduZWQpKC1lcnIpID49IHNpemVvZihlcnJzdHIpL3NpemVvZihlcnJzdHJbMF0pIHx8ICFlcnJzdHJbLWVycl0pCisgICAgICAgIHJldHVybiB1bmtub3duOworICAgIHJldHVybiBlcnJzdHJbLWVycl07Cit9CisKKyNpZmRlZiBfX0tFUk5FTF9fCitFWFBPUlRfU1lNQk9MKGJjbW9zX3N0cmVycm9yKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9iY21vc19lcnJuby5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9iY21vc19lcnJuby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZTg5MmEKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2JjbW9zX2Vycm5vLmgKQEAgLTAsMCArMSw5MSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBCQ01PU19FUlJOT19IXworI2RlZmluZSBCQ01PU19FUlJOT19IXworCisvKiogXGRlZmdyb3VwIHN5c3RlbV9lcnJubyBFcnJvciBDb2RlcworICogQHsKKyAqLworCisvKiogRXJyb3IgY29kZXMgKi8KK3R5cGVkZWYgZW51bQoreworICAgIEJDTV9FUlJfT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICAwLCAgIC8qKjwgT0sgKi8KKyAgICBCQ01fRVJSX0lOX1BST0dSRVNTICAgICAgICAgICAgICAgICAgICAgICAgPSAtMSwgICAvKio8IE9wZXJhdGlvbiBpcyBpbiBwcm9ncmVzcyAqLworICAgIEJDTV9FUlJfUEFSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IC0yLCAgIC8qKjwgRXJyb3IgaW4gcGFyYW1ldGVycyAqLworICAgIEJDTV9FUlJfTk9NRU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IC0zLCAgIC8qKjwgTm8gbWVtb3J5ICovCisgICAgQkNNX0VSUl9OT1JFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gLTQsICAgLyoqPCBObyByZXNvdXJjZXMgKi8KKyAgICBCQ01fRVJSX0lOVEVSTkFMICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAtNSwgICAvKio8IEludGVybmFsIGVycm9yICovCisgICAgQkNNX0VSUl9OT0VOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gLTYsICAgLyoqPCBFbnRyeSBkb2Vzbid0IGV4aXN0ICovCisgICAgQkNNX0VSUl9OT0RFViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gLTcsICAgLyoqPCBEZXZpY2UgZG9lc24ndCBleGlzdCAqLworICAgIEJDTV9FUlJfQUxSRUFEWSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IC04LCAgIC8qKjwgRW50cnkgYWxyZWFkeSBleGlzdHMgKi8KKyAgICBCQ01fRVJSX1JBTkdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAtOSwgICAvKio8IE91dCBvZiByYW5nZSAqLworICAgIEJDTV9FUlJfUEVSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IC0xMCwgIC8qKjwgTm8gcGVybWlzc2lvbiB0byBwZXJmb3JtIGFuIG9wZXJhdGlvbiAqLworICAgIEJDTV9FUlJfTk9UX1NVUFBPUlRFRCAgICAgICAgICAgICAgICAgICAgICA9IC0xMSwgIC8qKjwgT3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgKi8KKyAgICBCQ01fRVJSX1BBUlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAtMTIsICAvKio8IFBhcnNpbmcgZXJyb3IgKi8KKyAgICBCQ01fRVJSX0lOVkFMSURfT1AgICAgICAgICAgICAgICAgICAgICAgICAgPSAtMTMsICAvKio8IEludmFsaWQgb3BlcmF0aW9uICovCisgICAgQkNNX0VSUl9JTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gLTE0LCAgLyoqPCBJL08gZXJyb3IgKi8KKyAgICBCQ01fRVJSX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAtMTUsICAvKio8IE9iamVjdCBpcyBpbiBiYWQgc3RhdGUgKi8KKyAgICBCQ01fRVJSX0RFTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAtMTYsICAvKio8IE9iamVjdCBpcyBkZWxldGVkICovCisgICAgQkNNX0VSUl9UT09fTUFOWSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gLTE3LCAgLyoqPCBUb28gbWFueSBvYmplY3RzICovCisgICAgQkNNX0VSUl9OT19NT1JFICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gLTE4LCAgLyoqPCBObyBtb3JlIGVudHJpZXMgKi8KKyAgICBCQ01fRVJSX09WRVJGTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAtMTksICAvKio8IEJ1ZmZlciBvdmVyZmxvdyAqLworICAgIEJDTV9FUlJfQ09NTV9GQUlMICAgICAgICAgICAgICAgICAgICAgICAgICA9IC0yMCwgIC8qKjwgQ29tbXVuaWNhdGlvbiBmYWlsdXJlICovCisgICAgQkNNX0VSUl9OT1RfQ09OTkVDVEVEICAgICAgICAgICAgICAgICAgICAgID0gLTIxLCAgLyoqPCBObyBjb25uZWN0aW9uIHdpdGggdGhlIHRhcmdldCBzeXN0ZW0gKi8KKyAgICBCQ01fRVJSX1NZU0NBTExfRVJSICAgICAgICAgICAgICAgICAgICAgICAgPSAtMjIsICAvKio8IFN5c3RlbSBjYWxsIHJldHVybmVkIGVycm9yICovCisgICAgQkNNX0VSUl9NU0dfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgID0gLTIzLCAgLyoqPCBSZWNlaXZlZCBtZXNzYWdlIGlzIGluc2FuZSAqLworICAgIEJDTV9FUlJfVE9PX01BTllfUkVRUyAgICAgICAgICAgICAgICAgICAgICA9IC0yNCwgIC8qKjwgVG9vIG1hbnkgb3V0c3RhbmRpbmcgcmVxdWVzdHMgKi8KKyAgICBCQ01fRVJSX1RJTUVPVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAtMjUsICAvKio8IE9wZXJhdGlvbiB0aW1lZCBvdXQgKi8KKyAgICBCQ01fRVJSX1RPT19NQU5ZX0ZSQUdTICAgICAgICAgICAgICAgICAgICAgPSAtMjYsICAvKio8IFRvbyBtYW55IGZyYWdtZW50cyAqLworICAgIEJDTV9FUlJfTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IC0yNywgIC8qKjwgR290IE5VTEwgcG9pbnRlciAqLworICAgIEJDTV9FUlJfUkVBRF9PTkxZICAgICAgICAgICAgICAgICAgICAgICAgICA9IC0yOCwgIC8qKjwgQXR0ZW1wdCB0byBzZXQgcmVhZC1vbmx5IHBhcmFtZXRlciAqLworICAgIEJDTV9FUlJfT05VX0VSUl9SRVNQICAgICAgICAgICAgICAgICAgICAgICA9IC0yOSwgIC8qKjwgT05VIHJldHVybmVkIGFuIGVycm9yIHJlc3BvbnNlICovCisgICAgQkNNX0VSUl9NQU5EQVRPUllfUEFSTV9JU19NSVNTSU5HICAgICAgICAgID0gLTMwLCAgLyoqPCBNYW5kYXRvcnkgcGFyYW1ldGVyIGlzIG1pc3NpbmcgKi8KKyAgICBCQ01fRVJSX0tFWV9SQU5HRSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAtMzEsICAvKio8IEtleSBmaWVsZCB3YXMgb3V0IG9mIHJhbmdlICovCisgICAgQkNNX0VSUl9RVUVVRV9FTVBUWSAgICAgICAgICAgICAgICAgICAgICAgID0gLTMyLCAgLyoqPCBSeCBQQ0llIHF1ZXVlIGVtcHR5ICovCisgICAgQkNNX0VSUl9RVUVVRV9GVUxMICAgICAgICAgICAgICAgICAgICAgICAgID0gLTMzLCAgLyoqPCBUeCBQQ0llIHF1ZXVlIGZ1bGwgKi8KKyAgICBCQ01fRVJSX1RPT19MT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAtMzQsICAvKio8IFByb2Nlc3NpbmcgaXMgdGFraW5nIHRvbyBsb25nLCBidXQgd2lsbCBmaW5pc2ggZXZlbnR1YWxseSAqLworICAgIEJDTV9FUlJfSU5TVUZGSUNJRU5UX0xJU1RfTUVNICAgICAgICAgICAgICA9IC0zNSwgIC8qKjwgTm90IGVub3VnaCBtZW1vcnkgd2FzIHByb3ZpZGVkIGZvciB2YXJpYWJsZS1sZW5ndGggbGlzdHMgKi8KKworICAgIEJDTV9FUlJfT1VUX09GX1NZTkMgICAgICAgICAgICAgICAgICAgICAgICA9IC0zNiwgIC8qKjwgU2VxdWVuY2UgbnVtYmVyIG9yIG9wZXJhdGlvbiBzdGVwIHdhcyBvdXQgb2Ygc3luYy4gKi8KKyAgICBCQ01fRVJSX0NIRUNLU1VNICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAtMzcsICAvKio8IENoZWNrc3VtIGVycm9yICovCisgICAgQkNNX0VSUl9JTUFHRV9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgID0gLTM4LCAgLyoqPCBVbnN1cHBvcnRlZCBmaWxlL2ltYWdlIHR5cGUgKi8KKyAgICBCQ01fRVJSX0lOQ09NUExFVEVfVEVSTUlOQVRJT04gICAgICAgICAgICAgPSAtMzksICAvKio8IEluY29tcGxldGUgcHJlbWF0dXJlIHRlcm1pbmF0aW9uICovCit9IGJjbW9zX2Vycm5vOworCisvKiogTWFwIGVycm9yIGNvZGUgdG8gZXJyb3Igc3RyaW5nCisgKiBccGFyYW1baW5dICAgZXJyICAgICBFcnJvciBjb2RlCisgKiBccmV0dXJucyBFcnJvciBzdHJpbmcKKyAqLworY29uc3QgY2hhciAqYmNtb3Nfc3RyZXJyb3IoYmNtb3NfZXJybm8gZXJyKTsKKworLyoqIEB9IHN5c3RlbV9lcnJubyAqLworCisjZW5kaWYgLyogQkNNT1NfRVJSTk9fSF8gKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vYmNtb3NfaGFzaF90YWJsZS5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9iY21vc19oYXNoX3RhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJlMTk2MgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vYmNtb3NfaGFzaF90YWJsZS5jCkBAIC0wLDAgKzEsNDY3IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworI2luY2x1ZGUgImJjbW9zX2hhc2hfdGFibGUuaCIKKworI2RlZmluZSBodF9vdmVyaGVhZCAgICAgc2l6ZW9mKHZvaWQgKikKKworLyoqIENyZWF0ZSBhIGhhc2ggdGFibGUgdXNpbmcgYSBibG9jayBwb29sCisgKiAgXHBhcmFtW2luXSBwb29sX3Bhcm0gICAgICAgICAgICBwb2ludGVyIHRvIGJsb2NrIHBvb2wgcGFyYW1ldGVycworICogIFxwYXJhbVtpbl0gbWF4X2RhdGFfZW50cmllcyAgICAgTWF4aW11bSBlbnRyaWVzIHRoZSBoYXNoIHRhYmxlIG5lZWRzIHRvIGhvbGQKKyAqICBccGFyYW1baW5dIGVudHJ5X3NpemUgICAgICAgICAgIFNpemUgb2YgZWFjaCBlbnRyeSBpbiBieXRlcworICogIFxwYXJhbVtpbl0ga2V5X3NpemUgICAgICAgICAgICAgU2l6ZSBvZiBlYWNoIGtleSBpbiBieXRlcworICogIFxyZXR1cm4gcG9pbnRlciB0byBuZXdseSBjcmVhdGVkIGhhc2ggdGFibGUKKyAqLworc3RhdGljIGhhc2hfdGFibGUgKmhhc2hfdGFibGVfY3JlYXRlX2luX3Bvb2woYmNtb3NfYmxrX3Bvb2xfcGFybSAqcG9vbF9wYXJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4X2RhdGFfZW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGVudHJ5X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGtleV9zaXplKQoreworICAgIHVpbnQzMl90IGxvb2t1cF90YWJsZV9lbnRyaWVzID0gbWF4X2RhdGFfZW50cmllcyArIChtYXhfZGF0YV9lbnRyaWVzIC8gNCk7CisgICAgaGFzaF90YWJsZSAqaHQ7CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgaWYgKHBvb2xfcGFybSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgQlVHKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGVudHJ5X3NpemUgKz0ga2V5X3NpemU7CisKKyAgICBodCA9IGJjbW9zX2FsbG9jKHNpemVvZihoYXNoX3RhYmxlKSk7CisgICAgaWYgKGh0ID09IE5VTEwpCisgICAgeworICAgICAgICBCVUcoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaHQtPm9ial9sZW4gPSBlbnRyeV9zaXplOworICAgIGh0LT5rZXlfbGVuID0ga2V5X3NpemU7CisgICAgaHQtPmRhdGFfb2Zmc2V0ID0gaHRfb3ZlcmhlYWQ7CisgICAgaHQtPmh0X2xvb2t1cF90YmxfZW50cmllcyA9IGxvb2t1cF90YWJsZV9lbnRyaWVzOworICAgIGh0LT5odF9tYXhfZGF0YV9lbnRyaWVzID0gbWF4X2RhdGFfZW50cmllczsKKyAgICBodC0+bG9va191cF9lbnRyaWVzX3RibCA9IGJjbW9zX2FsbG9jKGxvb2t1cF90YWJsZV9lbnRyaWVzICogc2l6ZW9mKGh0X2Jsb2NrKSk7CisKKyAgICBpZiAoaHQtPmxvb2tfdXBfZW50cmllc190YmwgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2ZyZWUoaHQpOworICAgICAgICBCVUcoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaHQtPmh0X2N1cl9lbnRyaWVzID0gMDsKKyAgICBlcnIgPSBiY21vc19ibGtfcG9vbF9jcmVhdGUoJmh0LT5rZXlfZGF0YV9wb29sLCBwb29sX3Bhcm0pOworCisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgYmNtb3NfZnJlZShodC0+bG9va191cF9lbnRyaWVzX3RibCk7CisgICAgICAgIGJjbW9zX2ZyZWUoaHQpOworICAgICAgICBCVUcoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKGh0LT5odF9tYXhfZGF0YV9lbnRyaWVzID4gaHQtPmh0X2xvb2t1cF90YmxfZW50cmllcykKKyAgICB7CisgICAgICAgIEJVRygpOworICAgIH0KKworICAgIGh0LT5vYmpfbGVuIC09IGh0LT5rZXlfbGVuOworCisgICAgbWVtc2V0KGh0LT5sb29rX3VwX2VudHJpZXNfdGJsLCAwLCBsb29rdXBfdGFibGVfZW50cmllcyAqIHNpemVvZihodF9ibG9jaykpOworICAgIHJldHVybiBodDsKK30KKworaGFzaF90YWJsZSAqaGFzaF90YWJsZV9jcmVhdGUodWludDMyX3QgbWF4X2RhdGFfZW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGVudHJ5X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGtleV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcG9vbF9uYW1lKQoreworICAgIGJjbW9zX2Jsa19wb29sX3Bhcm0gcGFybSA9IHswfTsKKworICAgIHBhcm0ubmFtZSA9IHBvb2xfbmFtZTsKKyAgICBwYXJtLmJsa19zaXplID0gZW50cnlfc2l6ZSArIGtleV9zaXplICsgaHRfb3ZlcmhlYWQ7CisgICAgcGFybS5udW1fYmxrcyA9IG1heF9kYXRhX2VudHJpZXM7CisKKyAgICByZXR1cm4gaGFzaF90YWJsZV9jcmVhdGVfaW5fcG9vbCgmcGFybSwgbWF4X2RhdGFfZW50cmllcywgZW50cnlfc2l6ZSwga2V5X3NpemUpOworfQorCisvKiogSGFzaCBhIGxlbmd0aCBvZiBieXRlcyBpbnRvIGEgdWludDMyX3QKKyAqICBccGFyYW1baW5dIGtleSAgICAgIEJ5dGVzIHRvIGhhc2gKKyAqICBccGFyYW1baW5dIGxlbiAgICAgIE51bWJlciBvZiBieXRlcyBpbiBrZXkKKyAqICBccmV0dXJuIFRoZSBoYXNoIGFzIGEgdWludDMyX3QKKyAqLworc3RhdGljIHVpbnQzMl90IGdldF9oYXNoX2Zvcl9rZXkoY29uc3QgdWludDhfdCAqa2V5LCB1aW50OF90IGxlbikKK3sKKyAgICB1aW50MzJfdCBoYXNoID0gNTM4MTsKKyAgICB1aW50OF90IGk7CisgICAgY29uc3QgdWludDhfdCAqdG1wID0ga2V5OworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IHRtcCsrLCBpKyspCisgICAgeworICAgICAgICBoYXNoID0gKChoYXNoIDw8IDUpICsgaGFzaCkgKyAoKnRtcCk7CisgICAgfQorCisgICAgcmV0dXJuIGhhc2g7Cit9CisKKy8qKiBHZXRzIGEgaGFzaCBrZXkgdXNlZCBmb3IgdGhlIGtleURhdGFQb29sIGluIHRoZSBIYXNoVGFibGUKKyAqICBccGFyYW1baW5dIGh0ICAgQXNzb2NpYXRlZCBoYXNodGFibGUgd2UgYXJlIGdldHRpbmcgaGFzaCBmb3Iga2V5IGZvcgorICogIFxwYXJhbVtpbl0ga2V5ICBLZXkgd2UgYXJlIGdldHRpbmcgaGFzaCBmb3IKKyAqICBccmV0dXJuIEFuIGluZGV4IGludG8gdGhlIGtleURhdGFQb29sCisgKi8KK3N0YXRpYyB1aW50MzJfdCBnZXRfaGFzaF92YWxfZm9yX2tleShjb25zdCBoYXNoX3RhYmxlICpodCwgY29uc3QgdWludDhfdCAqa2V5KQoreworICAgIHJldHVybiBnZXRfaGFzaF9mb3Jfa2V5KGtleSwgaHQtPmtleV9sZW4pICUgaHQtPmh0X2xvb2t1cF90YmxfZW50cmllczsKK30KKworLyoqIFJldHVybnMgdGhlIGxvY2F0aW9uIG9mIHRoZSBrZXkgd2l0aGluIGFuIEh0QmxvY2sKKyAqICBccGFyYW1baW5dIGh0ICAgICAgIEhhc2ggdGFibGUgaW4gcXVlc3Rpb24KKyAqICBccGFyYW1baW5dIGJsb2NrICAgIEh0QmxvY2sgaW4gcXVlc3Rpb24KKyAqICBccmV0dXJuIHBvaW50ZXIgdG8gdGhlIGRhdGEgd2l0aGluIHRoZSBibG9jaworICovCitzdGF0aWMgdWludDhfdCAqZ2V0X2tleV9mcm9tX2Jsb2NrX2luX3RhYmxlKGNvbnN0IGhhc2hfdGFibGUgKmh0LCBodF9ibG9jayAqYmxvY2spCit7CisgICAgcmV0dXJuKHVpbnQ4X3QgKikgYmxvY2sgKyBodC0+ZGF0YV9vZmZzZXQgKyBodC0+b2JqX2xlbjsKK30KKworLyoqIEdldHMgYW5kIHBvcHVsYXRlcyBhIEh0QmxvY2sgd2l0aCBhbGwgb2YgaXRzIGRhdGEKKyAqICBccGFyYW1baW5dIG5leHQgICAgIE5leHQgYmxvY2sgaW4gdGhpcyBidWNrZXRzIGNoYWluCisgKiAgXHBhcmFtW2luXSBodCAgICAgICBIYXNoIHRhYmxlIGluIHF1ZXN0aW9uCisgKiAgXHBhcmFtW2luXSBrZXkgICAgICBUaGlzIGJsb2NrcyBrZXkKKyAqICBccGFyYW1baW5dIHZhbCAgICAgIFRoaXMgYmxvY2tzIGRhdGEKKyAqICBccmV0dXJuIFRoZSBibG9jayB0aGF0IHdlIGFsbG9jYXRlZCBhbmQgcmV0dXJuZWQKKyAqLworc3RhdGljIGh0X2Jsb2NrICpmaWxsX2h0X2Jsb2NrKGh0X2Jsb2NrICpuZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfdGFibGUgKmh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICp2YWwpCit7CisgICAgaHRfYmxvY2sgKmRlc3RfYmxvY2sgPSBiY21vc19ibGtfcG9vbF9hbGxvYygmaHQtPmtleV9kYXRhX3Bvb2wpOworCisgICAgaWYgKGRlc3RfYmxvY2sgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8qIHN0b3JhZ2UgaXMgbmV4dG9iaiBwdHIsIGhhc2ggb2JqLAorCSAgICBrZXkgd2hpY2gga2VlcHMgYWxsIHVpbnQzMl90IGFsaWduZWQuICovCisgICAgICAgIGRlc3RfYmxvY2stPm5leHRfY2hhaW4gPSBuZXh0OworCisgICAgICAgIGlmICh2YWwgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgbWVtY3B5KCh1aW50OF90ICopIGRlc3RfYmxvY2sgKyBodC0+ZGF0YV9vZmZzZXQsIHZhbCwgaHQtPm9ial9sZW4pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbWVtc2V0KCh1aW50OF90ICopIGRlc3RfYmxvY2sgKyBodC0+ZGF0YV9vZmZzZXQsMCxodC0+b2JqX2xlbik7CisgICAgICAgIH0KKworICAgICAgICAvKiBOZWVkIHRvIHB1dCBrZXkgaW4gYWZ0ZXIgb2JqICovCisgICAgICAgIG1lbWNweSgKKyAgICAgICAgICAgICAgKHVpbnQ4X3QgKikgZGVzdF9ibG9jayArIGh0LT5kYXRhX29mZnNldCArIGh0LT5vYmpfbGVuLAorICAgICAgICAgICAgICBrZXksCisgICAgICAgICAgICAgIGh0LT5rZXlfbGVuKTsKKyAgICB9CisKKyAgICByZXR1cm4gZGVzdF9ibG9jazsKK30KKworLyoqIERldGVybWluZSB3aGV0aGVyIHR3byBrZXlzIGluIGEgcGFydGljdWxhciBoYXNoIHRhYmxlIG1hdGNoCisgKiAgXHBhcmFtW2luXSBodCAgICAgICBIYXNodGFibGUKKyAqICBccGFyYW1baW5dIGtleV9hICAgIGZpcnN0IGtleSB0byBjb21wYXJlCisgKiAgXHBhcmFtW2luXSBrZXlfYiAgICBzZWNvbmQga2V5IHRvIGNvbXBhcmUKKyAqICBccmV0dXJuIHdoZXRoZXIgdGhleSBhcmUgdGhlIHNhbWUKKyAqLworc3RhdGljIGJjbW9zX2Jvb2wgaXNfa2V5X21hdGNoKGNvbnN0IGhhc2hfdGFibGUgKmh0LCBjb25zdCB1aW50OF90ICprZXlfYSwgY29uc3QgdWludDhfdCAqa2V5X2IpCit7CisgICAgcmV0dXJuIG1lbWNtcChrZXlfYSwga2V5X2IsIGh0LT5rZXlfbGVuKSA9PSAwOworfQorCisvKiogU2VhcmNoZXMgYSBjaGFpbmVkIGJ1Y2tldCBsb29raW5nIGZvciBhbiBpbnN0YW5jZSBvZiB0aGUga2V5LiAgSWYgZm91bmQgcmV0dXJucyB0aGUgYmxvY2sgaWYgZm91bmQgdGhlIGtleSBpbi4KKyAqICBQcmV2IGd1eSBpcyBzZXQgdG8gdGhlIGJsb2NrIGluIHRoZSBjaGFpbiBiZWZvcmUgdGhlIGJsb2NrIHdlIHJldHVybmVkIChleGNlcHQgaW4gdGhlIGNhc2UgKiB3aGVyZSB0aGVyZSBpcyBubworICogIGJsb2NrIGJlZm9yZSB0aGUgb25lIHdlIHJldHVybmVkLgorICogIFxwYXJhbVtpbl0gaHQgICAgICAgICAgIEhhc2hUYWJsZSBpbiBxdWVzdGlvbgorICogIFxwYXJhbVtpbl0ga2V5X3RvX2ZpbmQgIEtleSB3ZSB3b25kZXIgaWYgZXhpc3RzCisgKiAgXHBhcmFtW2luXSBjaGFpbl9zdGFydCAgV2hlcmUgdG8gc3RhcnQgbG9va2luZyBpbiB0aGUgY2hhaW4KKyAqICBccGFyYW1baW5dIHByZXZfYmxvY2sgICBUaGUgcHJldmlvdXMgZ3V5IGJlZm9yZSB0aGUgYmxvY2sgd2UgcmV0dXJuZWQgKGlmIGV4aXN0cykKKyAqICBccmV0dXJuIFRoZSBibG9jayB0aGF0IG1hdGNoZXMgZG9lc0V4aXN0cyAoaWYgZXhpc3RzKQorICovCitzdGF0aWMgaHRfYmxvY2sgKmdldF9rZXlfbG9jX2luX2NoYWluKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhc2hfdGFibGUgKmh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmtleV90b19maW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0X2Jsb2NrICpjaGFpbl9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodF9ibG9jayAqKnByZXZfYmxvY2spCit7CisgICAgKnByZXZfYmxvY2sgPSBOVUxMOworICAgIHdoaWxlIChjaGFpbl9zdGFydCAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGlzX2tleV9tYXRjaChodCwga2V5X3RvX2ZpbmQsIGdldF9rZXlfZnJvbV9ibG9ja19pbl90YWJsZShodCwgY2hhaW5fc3RhcnQpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGNoYWluX3N0YXJ0OworICAgICAgICB9CisgICAgICAgICpwcmV2X2Jsb2NrID0gY2hhaW5fc3RhcnQ7CisgICAgICAgIGNoYWluX3N0YXJ0ID0gY2hhaW5fc3RhcnQtPm5leHRfY2hhaW47CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitiY21vc19ib29sIGhhc2hfdGFibGVfcmVtb3ZlKGhhc2hfdGFibGUgKmh0LCBjb25zdCB1aW50OF90ICprZXkpCit7CisgICAgdWludDMyX3QgaGFzaF92YWwgPSBnZXRfaGFzaF92YWxfZm9yX2tleShodCwga2V5KTsKKyAgICBodF9ibG9jayAqcHJldl9lbnRyeTsKKyAgICBodF9ibG9jayAqZW50cnkgPSBnZXRfa2V5X2xvY19pbl9jaGFpbigKKyAgICAgICAgaHQsCisgICAgICAgIGtleSwKKyAgICAgICAgaHQtPmxvb2tfdXBfZW50cmllc190YmxbaGFzaF92YWxdLm5leHRfY2hhaW4sCisgICAgICAgICZwcmV2X2VudHJ5KTsKKworICAgIGlmIChlbnRyeSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgLyogTm8gb25lIHRvIGRlbGV0ZSAqLworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGh0LT5odF9jdXJfZW50cmllcy0tOworICAgICAgICBpZiAocHJldl9lbnRyeSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBsYXN0IGVudHJ5ICovCisgICAgICAgICAgICBodC0+bG9va191cF9lbnRyaWVzX3RibFtoYXNoX3ZhbF0ubmV4dF9jaGFpbiA9IGVudHJ5LT5uZXh0X2NoYWluOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcHJldl9lbnRyeS0+bmV4dF9jaGFpbiA9IGVudHJ5LT5uZXh0X2NoYWluOworICAgICAgICB9CisgICAgICAgIGJjbW9zX2Jsa19wb29sX2ZyZWUoZW50cnkpOworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9Cit9CisKKy8qKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZGF0YSB3aXRoaW4gdGhlIEhUCisgKiAgXHBhcmFtW2luXSBodCAgICAgICAgICAgSGFzaHRhYmxlIGluIHF1ZXN0aW9uCisgKiAgXHBhcmFtW2luXSBibG9ja19wdHIgICAgSHRCbG9jayB0aGF0IHdlIHdvbmRlciB3aGVyZSBpdHMgZGF0YSBpcworICovCitzdGF0aWMgdm9pZCAqZ2V0X2h0X2RhdGFfcHRyKGNvbnN0IGhhc2hfdGFibGUgKmh0LCBodF9ibG9jayAqYmxvY2tfcHRyKQoreworICAgIHJldHVybih1aW50OF90KilibG9ja19wdHIgKyBodC0+ZGF0YV9vZmZzZXQ7Cit9CisKKworLyoqIEdldCBhbiBlbnRyeSBpbiB0aGUgaGFzaCB0YWJsZQorICogIFxwYXJhbVtpbl0gaHQgICAgICAgcG9pbnRlciB0byBoYXNoIHRhYmxlCisgKiAgXHBhcmFtW2luXSBrZXkgICAgICBwb2ludGVyIHRvIGtleSBkYXRhCisgKiAgXHBhcmFtW2luXSBoYXNoX3ZhbCBoYXNoIHZhbHVlIG9mIGtleQorICogIFxyZXR1cm4gcG9pbnRlciB0byBoYXNoIHRhYmxlIGVudHJ5CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqaHRfZ2V0X2ludGVybmFsKGNvbnN0IGhhc2hfdGFibGUgKmh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaGFzaF92YWwpCit7CisgICAgaHRfYmxvY2sgKnRtcDsKKyAgICBodF9ibG9jayAqcmV0OworICAgIHJldCA9IGdldF9rZXlfbG9jX2luX2NoYWluKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodC0+bG9va191cF9lbnRyaWVzX3RibFtoYXNoX3ZhbF0ubmV4dF9jaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXApOworICAgIGlmIChyZXQgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBnZXRfaHRfZGF0YV9wdHIoaHQscmV0KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9Cit9CisKK3ZvaWQgKmhhc2hfdGFibGVfZ2V0KGNvbnN0IGhhc2hfdGFibGUgKmh0LCBjb25zdCB1aW50OF90ICprZXkpCit7CisgICAgdWludDMyX3QgaGFzaFZhbCA9IGdldF9oYXNoX3ZhbF9mb3Jfa2V5KGh0LCBrZXkpOworICAgIHJldHVybiBodF9nZXRfaW50ZXJuYWwoaHQsa2V5LGhhc2hWYWwpOworfQorCit2b2lkICpoYXNoX3RhYmxlX3B1dChoYXNoX3RhYmxlICpodCwgY29uc3QgdWludDhfdCAqa2V5LCBjb25zdCB2b2lkICp2YWwpCit7CisgICAgdm9pZCAqcmV0X2Jsb2NrOworICAgIHVpbnQzMl90IGhhc2hfdmFsOworICAgIGlmIChodC0+aHRfY3VyX2VudHJpZXMgPj0gaHQtPmh0X21heF9kYXRhX2VudHJpZXMpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaGFzaF92YWwgPSBnZXRfaGFzaF92YWxfZm9yX2tleShodCwga2V5KTsKKworICAgIHJldF9ibG9jayA9IGh0X2dldF9pbnRlcm5hbCgoY29uc3QgaGFzaF90YWJsZSAqKSBodCwga2V5LCBoYXNoX3ZhbCk7CisgICAgaWYgKHJldF9ibG9jayAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgLyogcmVwbGFjZSBleGlzdGluZyB2YWx1ZSB3aXRoIG5ldyB2YWx1ZSAqLworICAgICAgICBpZiAodmFsICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1lbWNweShyZXRfYmxvY2ssIHZhbCwgaHQtPm9ial9sZW4pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbWVtc2V0KHJldF9ibG9jaywgMCwgaHQtPm9ial9sZW4pOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXRfYmxvY2s7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGh0X2Jsb2NrICpuZXdfYmxvY2s9ZmlsbF9odF9ibG9jaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHQtPmxvb2tfdXBfZW50cmllc190YmxbaGFzaF92YWxdLm5leHRfY2hhaW4sIGh0LCBrZXksIHZhbCk7CisgICAgICAgIGlmIChuZXdfYmxvY2sgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaHQtPmxvb2tfdXBfZW50cmllc190YmxbaGFzaF92YWxdLm5leHRfY2hhaW4gPSBuZXdfYmxvY2s7CisgICAgICAgICAgICBodC0+aHRfY3VyX2VudHJpZXMrKzsKKyAgICAgICAgICAgIHJldHVybiBnZXRfaHRfZGF0YV9wdHIoaHQsbmV3X2Jsb2NrKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCit9CisKK2h0X2l0ZXJhdG9yIGh0X2l0ZXJhdG9yX2dldChjb25zdCBoYXNoX3RhYmxlICpodCkKK3sKKyAgICBodF9pdGVyYXRvciB0b19yZXQ7CisgICAgdG9fcmV0Lmh0ID0gaHQ7CisgICAgdG9fcmV0LmN1cl9pZHggPSAwOworICAgIHRvX3JldC5yZW1vdmVkX2F0ID0gQkNNT1NfRkFMU0U7CisgICAgdG9fcmV0LnN0aWxsX3ZhbGlkID0gQkNNT1NfVFJVRTsKKyAgICB0b19yZXQuY3VyX2Jsb2NrID0gTlVMTDsKKyAgICByZXR1cm4gdG9fcmV0OworfQorCitodF9pdGVyYXRvciBodF9pdGVyYXRvcl9nZXRfYnlfa2V5KGNvbnN0IGhhc2hfdGFibGUgKmh0LCBjb25zdCB1aW50OF90ICprZXkpCit7CisgICAgaHRfYmxvY2sgKnRtcDsKKyAgICB1aW50MzJfdCBoYXNoX3ZhbCA9IGdldF9oYXNoX3ZhbF9mb3Jfa2V5KGh0LCBrZXkpOworICAgIGh0X2l0ZXJhdG9yIHRvX3JldCA9IHt9OworICAgIHRvX3JldC5odCA9IGh0OworICAgIHRvX3JldC5yZW1vdmVkX2F0ID0gQkNNT1NfRkFMU0U7CisgICAgdG9fcmV0LmN1cl9ibG9jayA9IGdldF9rZXlfbG9jX2luX2NoYWluKGh0LCBrZXksIGh0LT5sb29rX3VwX2VudHJpZXNfdGJsW2hhc2hfdmFsXS5uZXh0X2NoYWluLCAmdG1wKTsKKyAgICB0b19yZXQuc3RpbGxfdmFsaWQgPSAodG9fcmV0LmN1cl9ibG9jayAhPSBOVUxMKTsKKyAgICB0b19yZXQuY3VyX2lkeCA9IGhhc2hfdmFsOworCisgICAgcmV0dXJuIHRvX3JldDsKK30KKworLyoqIEFkdmFuY2UgbGluZWFyIHNjYW4gaXRlcmF0b3IKKyAqICBccGFyYW1baW5dIGl0ICAgSXRlcmF0b3IgdG8gYWR2YW5jZQorICovCitzdGF0aWMgdm9pZCBodF9pdGVyYXRvcl9zY2FuX2FkdihodF9pdGVyYXRvciAqaXQpCit7CisgICAgaWYgKGl0LT5jdXJfYmxvY2sgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGl0LT5jdXJfYmxvY2sgPSBpdC0+Y3VyX2Jsb2NrLT5uZXh0X2NoYWluOworICAgICAgICBpZiAoaXQtPmN1cl9ibG9jayAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpdC0+c3RpbGxfdmFsaWQgPSBCQ01PU19UUlVFOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaXQtPmN1cl9pZHgrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBmaW5kIG5vbiBudWxsIGVudHJ5ICovCisgICAgd2hpbGUgKGl0LT5jdXJfaWR4IDwgaXQtPmh0LT5odF9sb29rdXBfdGJsX2VudHJpZXMpCisgICAgeworICAgICAgICBpZiAoaXQtPmh0LT5sb29rX3VwX2VudHJpZXNfdGJsW2l0LT5jdXJfaWR4XS5uZXh0X2NoYWluICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGl0LT5jdXJfYmxvY2sgPSBpdC0+aHQtPmxvb2tfdXBfZW50cmllc190YmxbaXQtPmN1cl9pZHhdLm5leHRfY2hhaW47CisgICAgICAgICAgICBpdC0+c3RpbGxfdmFsaWQgPSBCQ01PU19UUlVFOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaXQtPmN1cl9pZHgrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpdC0+c3RpbGxfdmFsaWQgPSBCQ01PU19GQUxTRTsKK30KKwordm9pZCBodF9pdGVyYXRvcl9kZXJlZihjb25zdCBodF9pdGVyYXRvciAqaHRpLCB1aW50OF90ICoqa2V5LCB2b2lkICoqb2JqKQoreworICAgIGlmICghaHRpLT5zdGlsbF92YWxpZCkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiJXM6IEludmFsaWQgZGVyZWZcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICprZXkgPSBnZXRfa2V5X2Zyb21fYmxvY2tfaW5fdGFibGUoaHRpLT5odCwgaHRpLT5jdXJfYmxvY2spOworICAgICAgICAqb2JqID0gZ2V0X2h0X2RhdGFfcHRyKGh0aS0+aHQsIGh0aS0+Y3VyX2Jsb2NrKTsgICAgLyogdG8gZGF0YSAqLworICAgIH0KK30KKwordm9pZCBodF9pdGVyYXRvcl9yZW1vdmVfYXQoaGFzaF90YWJsZSAqaHQsIGh0X2l0ZXJhdG9yICppdCkKK3sKKyAgICBpZiAoaHQgIT0gaXQtPmh0KQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCIlczogSW5jb3JyZWN0IHdyaXRlYWJsZSBoYXNoIHRhYmxlIHBvaW50ZXJcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgfQorICAgIGVsc2UgaWYgKGl0LT5yZW1vdmVkX2F0KQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCIlczogTm8gZGVsZXRlIHR3aWNlXG4iLCBfX0ZVTkNUSU9OX18pOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB1aW50OF90ICprZXk7CisgICAgICAgIHVpbnQ4X3QgKm9iajsKKyAgICAgICAgaHRfaXRlcmF0b3JfZGVyZWYoaXQsICZrZXksICh2b2lkICoqKSAmb2JqKTsKKyAgICAgICAgaXQtPnJlbW92ZWRfYXQgPSBCQ01PU19UUlVFOworICAgICAgICBpdC0+c3RpbGxfdmFsaWQgPSBodF9pdGVyYXRvcl9uZXh0KGl0KTsKKyAgICAgICAgaWYgKCFoYXNoX3RhYmxlX3JlbW92ZShodCwga2V5KSkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCIlczogUmVtb3ZlIGVycm9yXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICB9CisgICAgfQorfQorCitiY21vc19ib29sIGh0X2l0ZXJhdG9yX25leHQoaHRfaXRlcmF0b3IgKml0KQoreworICAgIGlmIChpdC0+c3RpbGxfdmFsaWQpCisgICAgeworICAgICAgICBpZiAoaXQtPnJlbW92ZWRfYXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGl0LT5yZW1vdmVkX2F0ID0gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBodF9pdGVyYXRvcl9zY2FuX2FkdihpdCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGl0LT5zdGlsbF92YWxpZDsgICAvKiBObyBlbnRyeSBmb3VuZCAqLworfQorCit2b2lkIGhhc2hfdGFibGVfY2xlYXIoaGFzaF90YWJsZSAqaHQpCit7CisgICAgaHRfaXRlcmF0b3IgaXQgPSBodF9pdGVyYXRvcl9nZXQoaHQpOworICAgIHdoaWxlIChodF9pdGVyYXRvcl9uZXh0KCZpdCkpCisgICAgeworICAgICAgICBodF9pdGVyYXRvcl9yZW1vdmVfYXQoaHQsICZpdCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9iY21vc19oYXNoX3RhYmxlLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2JjbW9zX2hhc2hfdGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTYxOGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9iY21vc19oYXNoX3RhYmxlLmgKQEAgLTAsMCArMSwxMzcgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgQkNNT1NfSEFTSF9UQUJMRV9IXworI2RlZmluZSBCQ01PU19IQVNIX1RBQkxFX0hfCisKKyNpbmNsdWRlICJiY21vc19zeXN0ZW0uaCIKKwordHlwZWRlZiBzdHJ1Y3QgaHRfYmxvY2sgaHRfYmxvY2s7CitzdHJ1Y3QgaHRfYmxvY2sKK3sKKyAgICBodF9ibG9jayAqbmV4dF9jaGFpbjsKK307CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDE2X3Qgb2JqX2xlbjsKKyAgICB1aW50OF90IGtleV9sZW47CisgICAgdWludDMyX3QgZGF0YV9vZmZzZXQ7CisgICAgdWludDMyX3QgaHRfbG9va3VwX3RibF9lbnRyaWVzOworICAgIHVpbnQzMl90IGh0X21heF9kYXRhX2VudHJpZXM7CisgICAgYmNtb3NfYmxrX3Bvb2wga2V5X2RhdGFfcG9vbDsKKyAgICBodF9ibG9jayAqbG9va191cF9lbnRyaWVzX3RibDsKKyAgICB1aW50MzJfdCBodF9jdXJfZW50cmllczsKK30gaGFzaF90YWJsZTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBjb25zdCBoYXNoX3RhYmxlICpodDsKKyAgICB1aW50MzJfdCBjdXJfaWR4OworICAgIGh0X2Jsb2NrICpjdXJfYmxvY2s7CisgICAgYmNtb3NfYm9vbCByZW1vdmVkX2F0OworICAgIGJjbW9zX2Jvb2wgc3RpbGxfdmFsaWQ7Cit9IGh0X2l0ZXJhdG9yOworCisvKiogQ3JlYXRlIGEgaGFzaCB0YWJsZQorICogIFxwYXJhbVtpbl0gbWF4X2RhdGFfZW50cmllcyAgICAgTWF4aW11bSBlbnRyaWVzIHRoZSBoYXNoIHRhYmxlIG5lZWRzIHRvIGhvbGQKKyAqICBccGFyYW1baW5dIGVudHJ5X3NpemUgICAgICAgICAgIFNpemUgb2YgZWFjaCBlbnRyeSBpbiBieXRlcworICogIFxwYXJhbVtpbl0ga2V5X3NpemUgICAgICAgICAgICAgU2l6ZSBvZiBlYWNoIGtleSBpbiBieXRlcworICogIFxwYXJhbVtpbl0gcG9vbF9uYW1lICAgICAgICAgICAgRnJpZW5kbHkgbmFtZSB0byBpZGVudGlmeSB0aGUgaGFzaCB0YWJsZSdzIG1lbW9yeSBwb29sCisgKiAgXHJldHVybiBwb2ludGVyIHRvIG5ld2x5IGNyZWF0ZWQgaGFzaCB0YWJsZQorICovCitoYXNoX3RhYmxlICpoYXNoX3RhYmxlX2NyZWF0ZSh1aW50MzJfdCBtYXhfZGF0YV9lbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZW50cnlfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qga2V5X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpwb29sX25hbWUpOworCisvKiogUmVtb3ZlcyBhbGwgZW50cmllcyBmcm9tIGEgSGFzaFRhYmxlLgorICogIFxwYXJhbVtpbl0gaHQgICBIYXNoIHRhYmxlIHRvIHJlbW92ZSBhbGwgZW50cmllcyBmcm9tCisgKi8KK3ZvaWQgaGFzaF90YWJsZV9jbGVhcihoYXNoX3RhYmxlICpodCk7CisKKy8qKiBHZXRzIGEgcG9pbnRlciB0byBhbiBlbnRyeSB3aXRoaW4gdGhlIGhhc2ggdGFibGUgKGlmIGV4aXN0cykKKyAqICBccGFyYW1baW5dIGh0ICAgSGFzaHRhYmxlIGluIHF1ZXN0aW9uCisgKiAgXHBhcmFtW2luXSBrZXkgIEtleSB0byBsb29rIGZvci4KKyAqICBccmV0dXJuIE5vbiBudWxsIGlmIHdlIGZvdW5kIGEgZGF0YSBpdGVtIGFzc29jaWF0ZWQgd2l0aCBLRVkuCisgKi8KK3ZvaWQgKmhhc2hfdGFibGVfZ2V0KGNvbnN0IGhhc2hfdGFibGUgKmh0LCBjb25zdCB1aW50OF90ICprZXkpOworCisvKiogUmV0dXJucyBwb2ludGVycyB0byB0aGUga2V5IGFuZCB2YWx1ZSB0aGF0IGFuIGl0ZXJhdG9yIGlzIHBvaW50aW5nIGF0LiBXYXJuaW5nOiBrZXkgbWF5IG5vdCBiZSB1aW50MzJfdCBhbGlnbmVkLgorICogIERPIE5PVCBERUxFVEUgVEhFIEVMRU1FTlQgVEhFIElURVJBVE9SIFBPSU5UUyBBVCBBTkQgQU5EIFRSWSBUTyBVU0UgVEhFIElURVJBVE9SIFNVQlNFUVVFTlRMWS4gSWYgeW91IG5lZWQgdG8gZG8KKyAqICB0aGlzIHVzZSBodF9pdGVyYXRvcl9yZW1vdmVfYXQKKyAqICBccGFyYW1baW5dIGh0aSAgSXRlcmF0b3IKKyAqICBccGFyYW1baW5dIGtleSAgUG9pbnRlciB0byBrZXkgdG8gZmlsbAorICogIFxwYXJhbVtpbl0gb2JqICBQb2ludGVyIHRvIG9iaiB0byBmaWxsLgorICovCit2b2lkIGh0X2l0ZXJhdG9yX2RlcmVmKGNvbnN0IGh0X2l0ZXJhdG9yICpodGksIHVpbnQ4X3QgKiprZXksIHZvaWQgKipvYmopOworCisvKiogR2V0IGFuIGludGVyYXRvciBmb3IgdHJhdmVyc2luZyBhIGhhc2h0YWJsZS4KKyAqICBccGFyYW1baW5dIGh0ICAgSGFzaHRhYmxlIHRvIHRyYXZlcnNlCisgKiAgXHJldHVybiBUaGUgaXRlcmF0b3IuCisgKi8KK2h0X2l0ZXJhdG9yIGh0X2l0ZXJhdG9yX2dldChjb25zdCBoYXNoX3RhYmxlICpodCk7CisKKy8qKiBHZXQgYW4gaW50ZXJhdG9yIGZvciB0cmF2ZXJzaW5nIGEgaGFzaHRhYmxlIGJhc2VkIG9uIGFuIGVudHJ5J3Mga2V5LgorICogIFxwYXJhbVtpbl0gaHQgICBIYXNodGFibGUgdG8gdHJhdmVyc2UKKyAqICBccGFyYW1baW5dIGtleSAga2V5IG9mIGVudHJ5IHRvIHJldHVybgorICogIFxyZXR1cm4gVGhlIGl0ZXJhdG9yLgorICovCitodF9pdGVyYXRvciBodF9pdGVyYXRvcl9nZXRfYnlfa2V5KGNvbnN0IGhhc2hfdGFibGUgKmh0LCBjb25zdCB1aW50OF90ICprZXkpOworCisvKiogQWR2YW5jZXMgYSBIYXNoVGFibGUgaXRlcmF0b3IgdG8gdGhlIG5leHQgbG9jYXRpb24gd2l0aGluIHRoZSBIYXNoVGFibGUuCisgKiAgXHBhcmFtW2luXSBpdCAgIEl0ZXJhdG9yIHRvIGFkdmFuY2UKKyAqICBccmV0dXJuIFRSVUUgaWYgdGhlcmUgd2FzIGEgbmV4dCBlbGVtZW50CisgKi8KK2JjbW9zX2Jvb2wgaHRfaXRlcmF0b3JfbmV4dChodF9pdGVyYXRvciAqaXQpOworCisvKiogRGVsZXRlcyB0aGUgZW50cnkgd2hlcmUgdGhlIGl0ZXJhdG9yIHBvaW50cyB0byBhbmQgYWR2YW5jZXMgdGhlIGl0ZXJhdG9yIHJldHVybmluZyB3aGV0aGVyIHRoZSBhZHZhbmNlIHdvcmtlZCBvcgorICogIG5vdC4KKyAqICBccGFyYW1baW5dIGh0ICAgV3JpdGFibGUgcmVmZXJlbmNlIHRvIHRoZSBoYXNoIHRhYmxlICh0aGUgaXRlcmF0b3Igb25seSBoYXMgcmVhZCBwZXJtaXNzaW9uKQorICogIFxwYXJhbVtpbl0gaXQgICBJdHJlYXRvciBwb2ludGluZyBhdCBlbnRyeSB0byBkZWxldGUuCisgKi8KK3ZvaWQgaHRfaXRlcmF0b3JfcmVtb3ZlX2F0KGhhc2hfdGFibGUgKmh0LCBodF9pdGVyYXRvciAqaXQpOworCisvKiogQXR0ZW1wdHMgdG8gYXNzb2NpYXRlIGtleSB3aXRoIHZhbCBpbiB0aGUgaGFzaCB0YWJsZS4gSWYga2V5IGFscmVhZHkgZXhpc3RzIG92ZXJ3cml0ZXMgd2hhdCB3YXMgYXQga2V5IHdpdGggdmFsLgorICogIE90aGVyd2lzZSBhbGxvY2F0ZXMgYW4gZW50cnkgd2l0aGluIHRoZSBoYXNodGFibGUgZm9yIGtleSBhbmQgY29waWVzIHZhbCBpbnRvIGl0LgorICogIFxwYXJhbVtpbl0gaHQgICBIYXNodGFibGUgdG8gYWRkIG9yIG1vZGlmeQorICogIFxwYXJhbVtpbl0ga2V5ICBLZXkgdG8gdHJ5IGFuZCBhc3NvY2lhdGUgd2l0aCB2YWwuCisgKiAgXHBhcmFtW2luXSB2YWwgIFZhbCB0byBhc3NvY2lhdGUKKyAqICBccmV0dXJuIE5VTEwgaWYgZmFpbCwgZWxzZSBwb2ludGVyIHRvIGp1c3QgYWRkZWQgYmxvY2suCisgKi8KK3ZvaWQgKmhhc2hfdGFibGVfcHV0KGhhc2hfdGFibGUgKmh0LCBjb25zdCB1aW50OF90ICprZXksIGNvbnN0IHZvaWQgKnZhbCk7CisKKy8qKiBSZW1vdmVzIGFuIGVudHJ5IChpZiBleGlzdHMpIGZyb20gdGhlIGhhc2ggdGFibGUuCisgKiAgXHBhcmFtW2luXSBodCAgIEhhc2hUYWJsZSB0byByZW1vdmUgZnJvbS4KKyAqICBccGFyYW1baW5dIGtleSAgS2V5IHRvIHJlbW92ZQorICogIFxyZXR1cm4gQkNNT1NfVFJVRSBpZiBhbnl0aGluZyB3YXMgcmVtb3ZlZCwgb3RoZXJ3aXNlIEJDTU9TX0ZBTFNFLgorICovCitiY21vc19ib29sIGhhc2hfdGFibGVfcmVtb3ZlKGhhc2hfdGFibGUgKmh0LCBjb25zdCB1aW50OF90ICprZXkpOworCisjZW5kaWYgLyogSGFzaC5oICovCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2JjbW9zX3BhY2suaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vYmNtb3NfcGFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNjEwNDUKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2JjbW9zX3BhY2suaApAQCAtMCwwICsxLDY3IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaWZuZGVmIEJDTU9TX1BBQ0tfSF8KKyNkZWZpbmUgQkNNT1NfUEFDS19IXworCisKKy8qCisgKiBQYWNraW5nIG1hY3JvcworICoKKyAqIFVzYWdlOgorICogc3RydWN0IF9fUEFDS0VEX0FUVFJfU1RBUlRfXyBteV9wYWNrZWRfc3RydWN0CisgKiB7CisgKiAgICAgIC4uLgorICogfSBfX1BBQ0tFRF9BVFRSX0VORF9fIDsKKyAqCisgKi8KKworI2lmZGVmIF9fR05VQ19fCisKKyNkZWZpbmUgX19QQUNLRURfQVRUUl9TVEFSVF9fCisjZGVmaW5lIF9fUEFDS0VEX0FUVFJfRU5EX18gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpCisKKyNlbHNlCisKKyNlcnJvciBkZWZpbmUgX19QQUNLRURfQVRUUl9TVEFSVF9fLCAgX19QQUNLRURfQVRUUl9FTkRfXyBmb3IgdGhpcyBjb21waWxlcgorCisjZW5kaWYKKworLyoKKyAqIE1hY3JvcyBmb3IgYml0LWZpZWxkIG1hbmlwdWxhdGlvbgorICogRm9yIGVhY2ggZmllbGQgRiByZXF1aXJlcyAyIGNvbnN0YW50cworICogLSBGX1MgLSBmaWVsZCBzaGlmdAorICogLSBGX1cgLSBmaWVsZCB3aWR0aAorICovCisjZGVmaW5lIEJDTV9GSUVMRF9HRVQoX3csIF9mKSAgICAgICAgICAgKCgoX3cpPj5fZiAjIyBfUykgJiAoKDEgPDwgX2YgIyMgX1cpIC0gMSkpCisjZGVmaW5lIEJDTV9GSUVMRChfZiwgX3YpICAgICAgICAgICAgICAgKChfdiAmICgoMSA8PCBfZiAjIyBfVykgLSAxKSkgPDwgX2YgIyMgX1MpCisjZGVmaW5lIEJDTV9GSUVMRF9TRVQoX3csIF9mLCBfdikgICAgICAgKF93KSB8PSBCQ01fRklFTEQoX2YsIF92KQorCisKKyNlbmRpZiAvKiBCQ01PU19QQUNLX0hfICovCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2JjbW9zX3BsYXRmb3JtLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2JjbW9zX3BsYXRmb3JtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I0MGZiMQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vYmNtb3NfcGxhdGZvcm0uaApAQCAtMCwwICsxLDIzNiBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBCQ01PU19QTEFURk9STV9IXworI2RlZmluZSBCQ01PU19QTEFURk9STV9IXworCisjaWZuZGVmIEJDTU9TX1NZU1RFTV9IXworI2Vycm9yIFBsZWFzZSBkbyBub3QgaW5jbHVkZSBiY21vc19wbGF0Zm9ybS5oIGRpcmVjdGx5LiBJbmNsdWRlIGJjbW9zX3N5c3RlbS5oCisjZW5kaWYKKworLyoqIEJDTTY4NjIwIENQVSBjb3JlCisgKiBcaW5ncm91cCBzeXN0ZW1fdGFzayAqLwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNT1NfQ1BVX0NPUkVfQU5ZLCAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEFueSBjb3JlICovCisKKyAgICBCQ01PU19DUFVfQ09SRV9fTlVNX09GID0gMSwgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNvcmVzICovCit9IGJjbW9zX2NvcmU7CisKKyNkZWZpbmUgTUFYX05VTUJFUl9PRl9QT05TX09OX0FMTF9ERVZJQ0VTIChCQ01UUl9NQVhfT0xUUyAqIEJDTVRSX01BWF9JTlNUQU5DRVMpCisKKy8qKiBCQ002ODYyMCBtb2R1bGUKKyAqIFxpbmdyb3VwIHN5c3RlbV9tb2R1bGUKKyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNT1NfTU9EVUxFX0lEX05PTkUsICAgICAgICAgICAgICAgICAgICAgICAvKio8IG5vIG1vZHVsZSAqLworCisjaWZkZWYgQkNNT1NfU1lTX1VOSVRURVNUCisgICAgQkNNT1NfTU9EVUxFX0lEX1RFU1QxLAorICAgIEJDTU9TX01PRFVMRV9JRF9URVNUMiwKKyNlbmRpZgorICAgIC8qIEVhY2ggRGV2aWNlIChCQ002ODYyWCkgbXVzdCBoYXZlIGl0cyBvd24gZGVkaWNhdGVkIERldmljZSBDb250cm9sIE1vZHVsZSBhdCB0aGUgaG9zdCAqLworICAgIEJDTU9TX01PRFVMRV9JRF9ERVZfQ1RSTF9ERVYwLAorICAgIEJDTU9TX01PRFVMRV9JRF9ERVZfQ1RSTF9ERVYxLAorICAgIEJDTU9TX01PRFVMRV9JRF9ERVZfQ1RSTF9ERVYyLAorICAgIEJDTU9TX01PRFVMRV9JRF9ERVZfQ1RSTF9ERVYzLAorICAgIEJDTU9TX01PRFVMRV9JRF9ERVZfQ1RSTF9ERVY0LAorICAgIEJDTU9TX01PRFVMRV9JRF9ERVZfQ1RSTF9ERVY1LAorICAgIEJDTU9TX01PRFVMRV9JRF9ERVZfQ1RSTF9ERVY2LAorICAgIEJDTU9TX01PRFVMRV9JRF9ERVZfQ1RSTF9ERVY3LAorCisgICAgLyogQ0xJIG92ZXIgUENJZSBjbGllbnQgKi8KKyAgICBCQ01PU19NT0RVTEVfSURfQ0xJX09WRVJfUENJRSwKKworICAgIC8qIFByb3RlY3Rpb24gc3dpdGNoaW5nIHVzZXIgYXBwbGljYXRpb24gKi8KKyAgICBCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX1BTLAorCisgICAgLyogUmVtb3RlIENMSSAqLworICAgIEJDTU9TX01PRFVMRV9JRF9SRU1PVEVfQ0xJX0RFVjAsCisKKyAgICAvKiBSZW1vdGUgbG9nZ2VyIGFwcGxpY2F0aW9uIChUbyBzdXBwb3J0IG11bHRpcGxlIGRldmljZXMgbmVlZCB0byBhZGQgbnVtYmVyIG9mIGRldmljZXMgdG8gcHJldmlvdXMgdmFsdWUpICovCisgICAgQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9SRU1PVEVfTE9HR0VSX0RFVjAgPSBCQ01PU19NT0RVTEVfSURfUkVNT1RFX0NMSV9ERVYwICsgQkNNVFJfTUFYX09MVFMsCisKKyAgICAvKiBPTUNJIFNXIGRvd25sb2FkIHVzZXIgYXBwbGljYXRpb24gKFRvIHN1cHBvcnQgbXVsdGlwbGUgZGV2aWNlcyBuZWVkIHRvIGFkZCBudW1iZXIgb2YgZGV2aWNlcyB0byBwcmV2aW91cyB2YWx1ZSkgKi8KKyAgICBCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX09NQ0lfU1dETF9ERVYwID0gQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9SRU1PVEVfTE9HR0VSX0RFVjAgKyBCQ01UUl9NQVhfT0xUUywKKworICAgIC8qIEdQT04gbWFjIGxlYXJuaW5nIC8gYWdpbmcgdXNlciBhcHBsaWNhdGlvbiAoVG8gc3VwcG9ydCBtdWx0aXBsZSBkZXZpY2VzIG5lZWQgdG8gYWRkIG51bWJlciBvZiBkZXZpY2VzIHRvIHByZXZpb3VzIHZhbHVlKSovCisgICAgQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9HUE9OX01BQ19MRUFSTklOR19ERVYwID0gQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9PTUNJX1NXRExfREVWMCArIEJDTVRSX01BWF9PTFRTLAorCisgICAgLyogR1BPTiBzdHJlc3MgdXNlciBhcHBsaWNhdGlvbiAoVG8gc3VwcG9ydCBtdWx0aXBsZSBkZXZpY2VzIG5lZWQgdG8gYWRkIG51bWJlciBvZiBkZXZpY2VzIHRvIHByZXZpb3VzIHZhbHVlKSovCisgICAgQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9HUE9OX1NUUkVTU19ERVYwID0gQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9HUE9OX01BQ19MRUFSTklOR19ERVYwICsgQkNNVFJfTUFYX09MVFMsCisKKyAgICAvKiBHUE9OIERTIE9NQ0kgcGFja2V0cyB1c2VyIGFwcGxpY2F0aW9uIChUbyBzdXBwb3J0IG11bHRpcGxlIGRldmljZXMgbmVlZCB0byBhZGQgbnVtYmVyIG9mIGRldmljZXMgdG8gcHJldmlvdXMgdmFsdWUpKi8KKyAgICBCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX0dQT05fRFNfT01DSTBfREVWMCA9IEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfR1BPTl9TVFJFU1NfREVWMCArIEJDTVRSX01BWF9PTFRTLAorCisgICAgLyogR1BPTiBTTiBhY3F1aXNpdGlvbiAoVG8gc3VwcG9ydCBtdWx0aXBsZSBkZXZpY2VzIG5lZWQgdG8gYWRkIG51bWJlciBvZiBkZXZpY2VzIG11bHRpcGx5IHdpdGggbWF4IFBPTiBudW1iZXIgdG8gcHJldmlvdXMgdmFsdWUpKi8KKyAgICBCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX0dQT05fU05fQUNRVUlTSVRJT04wX0RFVjAgPSBCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX0dQT05fRFNfT01DSTBfREVWMCArIE1BWF9OVU1CRVJfT0ZfUE9OU19PTl9BTExfREVWSUNFUywKKworICAgIC8qIEdQT04gc3RhdGlzdGljcyAoVG8gc3VwcG9ydCBtdWx0aXBsZSBkZXZpY2VzIG5lZWQgdG8gYWRkIG51bWJlciBvZiBkZXZpY2VzIG11bHRpcGx5IHdpdGggbWF4IFBPTiBudW1iZXIgdG8gcHJldmlvdXMgdmFsdWUpICovCisgICAgQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9HUE9OX1NUQVRJU1RJQ1MwX0RFVjAgPSBCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX0dQT05fU05fQUNRVUlTSVRJT04wX0RFVjAgKyBNQVhfTlVNQkVSX09GX1BPTlNfT05fQUxMX0RFVklDRVMsCisKKyAgICAvKiBHUE9OIFJTU0kgdXNlciBhcHBsaWNhdGlvbiAoVG8gc3VwcG9ydCBtdWx0aXBsZSBkZXZpY2VzIG5lZWQgdG8gYWRkIG51bWJlciBvZiBkZXZpY2VzIG11bHRpcGx5IHdpdGggbWF4IFBPTiBudW1iZXIgdG8gcHJldmlvdXMgdmFsdWUpICovCisgICAgQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9HUE9OX1JTU0lfREVWMCA9IEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfR1BPTl9TVEFUSVNUSUNTMF9ERVYwICsgTUFYX05VTUJFUl9PRl9QT05TX09OX0FMTF9ERVZJQ0VTLAorCisgICAgLyogRVBPTiBPQU0gbmVnb3RpYXRpb24gYXBwbGljYXRpb24gKFRvIHN1cHBvcnQgbXVsdGlwbGUgZGV2aWNlcyBuZWVkIHRvIGFkZCBudW1iZXIgb2YgZGV2aWNlcyB0byBwcmV2aW91cyB2YWx1ZSkqLworICAgIEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfRU9OID0gQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9HUE9OX1JTU0lfREVWMCArIEJDTVRSX01BWF9PTFRTLAorCisgICAgLyogRVBPTiBvcHRpY2FsIG1vbml0b3JpbmcgYXBwbGljYXRpb24gKi8KKyAgICBCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX09NT04gPSBCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX0VPTiArIEJDTVRSX01BWF9PTFRTLAorCisgICAgLyogRVBPTiBIb3N0IGRyaXZlbiBlbmNyeXB0aW9uIGFwcGxpY2F0aW9uICovCisgICAgQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9FUE9OX0hERSwKKworICAgIEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfRVBPTl9PQU0sCisKKyAgICBCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX0RQT0VfU0VDLAorCisgICAgQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9JTUFHRV9UUkFOU0ZFUjAgPSBCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX0RQT0VfU0VDICsgQkNNVFJfTUFYX09MVFMsCisgICAgQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9JTUFHRV9UUkFOU0ZFUjEsCisKKwlCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX09OVV9UVU5JTkdfREVWMCwKKwlCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX09OVV9UVU5JTkdfREVWMSwKKworICAgIEJDTU9TX01PRFVMRV9JRF9fTlVNX09GLCAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgbW9kdWxlcyAqLworICAgIEJDTU9TX01PRFVMRV9JRF9JTlZBTElEID0gQkNNT1NfTU9EVUxFX0lEX05PTkUKK30gYmNtb3NfbW9kdWxlX2lkOworCisvKiogQkNNNjg2MjAgZXZlbnQgZ3JvdXAuIEVhY2ggZ3JvdXAgc3VwcG9ydHMgdXAgdG8gMzIgZXZlbnRzLgorICogXGluZ3JvdXAgc3lzdGVtX2V2ZW50CisgKi8KK3R5cGVkZWYgZW51bQoreworI2lmZGVmIEJDTU9TX1NZU19VTklUVEVTVAorICAgIEJDTU9TX0VWRU5UX0lEX1RFU1QxLAorICAgIEJDTU9TX0VWRU5UX0lEX1RFU1QyLAorI2Vsc2UKKyAgICBCQ01PU19FVkVOVF9JRF9EVU1NWSwgICAgICAgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnRseSBPUyBzL3cgZG9lc24ndCB1c2UgZXZlbnRzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlIHRoaXMgY29uc3RhbnQgd2hlbiBhZGRpbmcgcmVhbCBldmVudHMgKi8KKyNlbmRpZgorCisgICAgQkNNT1NfRVZFTlRfSURfX05VTV9PRiwgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBldmVudCBncm91cHMgKi8KK30gYmNtb3NfZXZlbnRfaWQ7CisKKy8qKiBNZXNzYWdlIGhhc2ggc2l6ZQorICogXGluZ3JvdXAgc3lzdGVtX21zZworICovCisjZGVmaW5lIEJDTU9TX01TR19IQVNIX1NJWkUgICAgIDUxMgorCisvKiogTWFwbGUgT1MgbWVzc2FnZQorICogXGluZ3JvdXAgc3lzdGVtX21zZworICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBCQ01PU19NU0dfSURfX0JFR0lOLAorCisgICAgLyogSW50ZXJuYWwgbWVzc2FnZXMgKi8KKyAgICBCQ01PU19NU0dfSURfSU5URVJOQUxfVElNRVIgPSBCQ01PU19NU0dfSURfX0JFR0lOLCAvKio8IEludGVybmFsICJ0aW1lciBtZXNzYWdlIiB0eXBlICovCisgICAgQkNNT1NfTVNHX0lEX0lOVEVSTkFMX0VWRU5ULCAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBJbnRlcm5hbCAiZXZlbnQgbWVzc2FnZSIgdHlwZSAqLworICAgIEJDTU9TX01TR19JRF9JTlRFUk5BTF9JUEMsCisKKyAgICBCQ01PU19NU0dfSURfSU5JVElBVEVfUlhfUE9XRVIsCisgICAgQkNNT1NfTVNHX0lEX0lOSVRJQVRFX1RSWF9TVEFUVVMsCisgICAgQkNNT1NfTVNHX0lEX0lOSVRJQVRFX1JPR1VFX1NDQU4sCisgICAgQkNNT1NfTVNHX0lEX0lOSVRJQVRFX1JTU0lfUkVBRCwKKworICAgIEJDTU9TX01TR19JRF9HUE9OX1NUUkVTU19TVEFSVCwKKyAgICBCQ01PU19NU0dfSURfR1BPTl9TVFJFU1NfVElNRU9VVCwKKyAgICBCQ01PU19NU0dfSURfR1BPTl9TVFJFU1NfT05VX0RJU0NPVkVSRUQsCisgICAgQkNNT1NfTVNHX0lEX0dQT05fU1RSRVNTX1BPTl9ERUFDVElWQVRJT05fQ09NUExFVEVELAorICAgIEJDTU9TX01TR19JRF9HUE9OX1NUUkVTU19QT05fQUNUSVZBVElPTl9DT01QTEVURUQsCisgICAgQkNNT1NfTVNHX0lEX0dQT05fU1RSRVNTX0FMTF9PTlVTX0RFQUNUSVZBVElPTl9DT01QTEVURUQsCisgICAgQkNNT1NfTVNHX0lEX0dQT05fU1RSRVNTX0FMTF9PTlVTX0FDVElWQVRJT05fQ09NUExFVEVELAorICAgIEJDTU9TX01TR19JRF9HUE9OX1NUUkVTU19PTlVfREVBQ1RJVkFUSU9OX0NPTVBMRVRFRCwKKyAgICBCQ01PU19NU0dfSURfR1BPTl9TVFJFU1NfT05VX0FDVElWQVRJT05fQ09NUExFVEVELAorCisgICAgQkNNT1NfTVNHX0lEX0dQT05fRFNfT01DSV9TVEFSVCwKKyAgICBCQ01PU19NU0dfSURfR1BPTl9EU19PTUNJX1RJTUVPVVQsCisgICAgQkNNT1NfTVNHX0lEX0dQT05fRFNfT01DSV9TVE9QLAorICAgIEJDTU9TX01TR19JRF9HUE9OX0RTX09NQ0lfREVWSUNFX0NPTk5FQ1RFRCwKKyAgICBCQ01PU19NU0dfSURfR1BPTl9EU19PTUNJX0RFVklDRV9ESVNDT05ORUNURUQsCisKKyAgICBCQ01PU19NU0dfSURfR1BPTl9SU1NJX1NUQVJULAorCisgICAgQkNNT1NfTVNHX0lEX0dQT05fU1RBVElTVElDU19TVEFSVCwKKyAgICBCQ01PU19NU0dfSURfR1BPTl9TVEFUSVNUSUNTX1RJTUVPVVQsCisgICAgQkNNT1NfTVNHX0lEX0dQT05fU1RBVElTVElDU19TVE9QLAorCisgICAgQkNNT1NfTVNHX0lEX0VPTl9TVEFSVCwKKyAgICBCQ01PU19NU0dfSURfRU9OX1NUT1AsCisgICAgQkNNT1NfTVNHX0lEX0VPTl9QUk9YWV9SWCwKKworICAgIEJDTU9TX01TR19JRF9FUE9OX09BTV9QUk9YWV9SWCwKKyAgICBCQ01PU19NU0dfSURfRVBPTl9PQU1fVElNRU9VVCwKKworICAgIEJDTU9TX01TR19JRF9EUE9FX1NFQ19TVEFSVCwKKyAgICBCQ01PU19NU0dfSURfRFBPRV9TRUNfUlhfT0FNLAorICAgIEJDTU9TX01TR19JRF9EUE9FX1NFQ19SWF9FQVBPTCwKKworCUJDTU9TX01TR19JRF9PTlVfVFVOSU5HX1NUQVJULAorCUJDTU9TX01TR19JRF9PTlVfVFVOSU5HX1NUT1AsCisKKyAgICBCQ01PU19NU0dfSURfX05PTkUsCisgICAgQkNNT1NfTVNHX0lEX19FTkQsCisgICAgQkNNT1NfTVNHX0lEX19GT1JDRTE2ID0gMHg3ZmZmCit9IGJjbW9zX21zZ19pZDsKKworI2RlZmluZSBCQ01PU19NU0dfSURfX05VTV9PRiAoQkNNT1NfTVNHX0lEX19FTkQgLSBCQ01PU19NU0dfSURfX0JFR0lOKQorLyoKKyAqIFRhc2sgcHJpb3JpdGllcworICovCisKKyNkZWZpbmUgVEFTS19QUklPUklUWV9UUkFOU1BPUlRfVFggICAgICAgICAgICAgICAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzMKKyNkZWZpbmUgVEFTS19QUklPUklUWV9UUkFOU1BPUlRfUlggICAgICAgICAgICAgICAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzgKKyNkZWZpbmUgVEFTS19QUklPUklUWV9UUkFOU1BPUlRfUFJPWFkgICAgICAgICAgICAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzkKKyNkZWZpbmUgVEFTS19QUklPUklUWV9UUkFOU1BPUlRfUkVNT1RFX0NMSSAgICAgICAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzkKKyNkZWZpbmUgVEFTS19QUklPUklUWV9ERVZJQ0VfQ09OVFJPTCAgICAgICAgICAgICAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzEwCisjZGVmaW5lIFRBU0tfUFJJT1JJVFlfVVNFUl9BUFBMX1BTICAgICAgICAgICAgICAgICAgQkNNT1NfVEFTS19QUklPUklUWV8xMgorI2RlZmluZSBUQVNLX1BSSU9SSVRZX1VTRVJfQVBQTF9FT04gICAgICAgICAgICAgICAgIEJDTU9TX1RBU0tfUFJJT1JJVFlfMTIKKyNkZWZpbmUgVEFTS19QUklPUklUWV9VU0VSX0FQUExfT01PTiAgICAgICAgICAgICAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzEyCisjZGVmaW5lIFRBU0tfUFJJT1JJVFlfVVNFUl9BUFBMX0VQT05fSERFICAgICAgICAgICAgQkNNT1NfVEFTS19QUklPUklUWV8xMgorI2RlZmluZSBUQVNLX1BSSU9SSVRZX1VTRVJfQVBQTF9EUE9FX1NFQyAgICAgICAgICAgIEJDTU9TX1RBU0tfUFJJT1JJVFlfMTIKKyNkZWZpbmUgVEFTS19QUklPUklUWV9VU0VSX0FQUExfR1BPTl9NQUNfTEVBUk5JTkcgICBCQ01PU19UQVNLX1BSSU9SSVRZXzEyCisjZGVmaW5lIFRBU0tfUFJJT1JJVFlfVVNFUl9BUFBMX0dQT05fU1RSRVNTICAgICAgICAgQkNNT1NfVEFTS19QUklPUklUWV8xMgorI2RlZmluZSBUQVNLX1BSSU9SSVRZX1VTRVJfQVBQTF9HUE9OX1NOX0FDUVVJU0lUSU9OIEJDTU9TX1RBU0tfUFJJT1JJVFlfMTIKKyNkZWZpbmUgVEFTS19QUklPUklUWV9VU0VSX0FQUExfR1BPTl9EU19PTUNJICAgICAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzEyCisjZGVmaW5lIFRBU0tfUFJJT1JJVFlfVVNFUl9BUFBMX0dQT05fU1RBVElTVElDUyAgICAgQkNNT1NfVEFTS19QUklPUklUWV8xMgorI2RlZmluZSBUQVNLX1BSSU9SSVRZX1VTRVJfQVBQTF9PTlVfVFVOSU5HICAgICAgICAgIEJDTU9TX1RBU0tfUFJJT1JJVFlfMTIKKyNkZWZpbmUgVEFTS19QUklPUklUWV9VU0VSX0FQUExfR1BPTl9SU1NJICAgICAgICAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzEyCisjZGVmaW5lIFRBU0tfUFJJT1JJVFlfQ0xJICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT1NfVEFTS19QUklPUklUWV8xNQorI2RlZmluZSBUQVNLX1BSSU9SSVRZX1VTRVJfQVBQTF9PTUNJX1NXREwgICAgICAgICAgIEJDTU9TX1RBU0tfUFJJT1JJVFlfMTcKKyNkZWZpbmUgVEFTS19QUklPUklUWV9VU0VSX0FQUExfSU1BR0VfVFJBTlNGRVIgICAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzE3CisjZGVmaW5lIFRBU0tfUFJJT1JJVFlfREVWX0xPR19LRVJORUwgICAgICAgICAgICAgICAgQkNNT1NfVEFTS19QUklPUklUWV8yMAorI2RlZmluZSBUQVNLX1BSSU9SSVRZX0RFVl9MT0cgICAgICAgICAgICAgICAgICAgICAgIEJDTU9TX1RBU0tfUFJJT1JJVFlfMzAKKyNkZWZpbmUgVEFTS19QUklPUklUWV9VU0VSX0FQUExfUkVNT1RFX0xPR0dFUiAgICAgICBCQ01PU19UQVNLX1BSSU9SSVRZXzMwCisKKworCisKKyNlbmRpZiAvKiBCQ01PU19QTEFURk9STV9IXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9iY21vc19xdWV1ZS5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9iY21vc19xdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNzJlNGQKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2JjbW9zX3F1ZXVlLmgKQEAgLTAsMCArMSw2NTAgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKXF1ZXVlLmgJOC41IChCZXJrZWxleSkgOC8yMC85NAorICogJEZyZWVCU0QkCisgKi8KKworI2lmbmRlZiBfU1lTX1FVRVVFX0hfCisjZGVmaW5lCV9TWVNfUVVFVUVfSF8KKworLyogI2luY2x1ZGUgPHN5cy9jZGVmcy5oPiAqLworCisvKgorICogVGhpcyBmaWxlIGRlZmluZXMgZm91ciB0eXBlcyBvZiBkYXRhIHN0cnVjdHVyZXM6IHNpbmdseS1saW5rZWQgbGlzdHMsCisgKiBzaW5nbHktbGlua2VkIHRhaWwgcXVldWVzLCBsaXN0cyBhbmQgdGFpbCBxdWV1ZXMuCisgKgorICogQSBzaW5nbHktbGlua2VkIGxpc3QgaXMgaGVhZGVkIGJ5IGEgc2luZ2xlIGZvcndhcmQgcG9pbnRlci4gVGhlIGVsZW1lbnRzCisgKiBhcmUgc2luZ2x5IGxpbmtlZCBmb3IgbWluaW11bSBzcGFjZSBhbmQgcG9pbnRlciBtYW5pcHVsYXRpb24gb3ZlcmhlYWQgYXQKKyAqIHRoZSBleHBlbnNlIG9mIE8obikgcmVtb3ZhbCBmb3IgYXJiaXRyYXJ5IGVsZW1lbnRzLiBOZXcgZWxlbWVudHMgY2FuIGJlCisgKiBhZGRlZCB0byB0aGUgbGlzdCBhZnRlciBhbiBleGlzdGluZyBlbGVtZW50IG9yIGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0LgorICogRWxlbWVudHMgYmVpbmcgcmVtb3ZlZCBmcm9tIHRoZSBoZWFkIG9mIHRoZSBsaXN0IHNob3VsZCB1c2UgdGhlIGV4cGxpY2l0CisgKiBtYWNybyBmb3IgdGhpcyBwdXJwb3NlIGZvciBvcHRpbXVtIGVmZmljaWVuY3kuIEEgc2luZ2x5LWxpbmtlZCBsaXN0IG1heQorICogb25seSBiZSB0cmF2ZXJzZWQgaW4gdGhlIGZvcndhcmQgZGlyZWN0aW9uLiAgU2luZ2x5LWxpbmtlZCBsaXN0cyBhcmUgaWRlYWwKKyAqIGZvciBhcHBsaWNhdGlvbnMgd2l0aCBsYXJnZSBkYXRhc2V0cyBhbmQgZmV3IG9yIG5vIHJlbW92YWxzIG9yIGZvcgorICogaW1wbGVtZW50aW5nIGEgTElGTyBxdWV1ZS4KKyAqCisgKiBBIHNpbmdseS1saW5rZWQgdGFpbCBxdWV1ZSBpcyBoZWFkZWQgYnkgYSBwYWlyIG9mIHBvaW50ZXJzLCBvbmUgdG8gdGhlCisgKiBoZWFkIG9mIHRoZSBsaXN0IGFuZCB0aGUgb3RoZXIgdG8gdGhlIHRhaWwgb2YgdGhlIGxpc3QuIFRoZSBlbGVtZW50cyBhcmUKKyAqIHNpbmdseSBsaW5rZWQgZm9yIG1pbmltdW0gc3BhY2UgYW5kIHBvaW50ZXIgbWFuaXB1bGF0aW9uIG92ZXJoZWFkIGF0IHRoZQorICogZXhwZW5zZSBvZiBPKG4pIHJlbW92YWwgZm9yIGFyYml0cmFyeSBlbGVtZW50cy4gTmV3IGVsZW1lbnRzIGNhbiBiZSBhZGRlZAorICogdG8gdGhlIGxpc3QgYWZ0ZXIgYW4gZXhpc3RpbmcgZWxlbWVudCwgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QsIG9yIGF0IHRoZQorICogZW5kIG9mIHRoZSBsaXN0LiBFbGVtZW50cyBiZWluZyByZW1vdmVkIGZyb20gdGhlIGhlYWQgb2YgdGhlIHRhaWwgcXVldWUKKyAqIHNob3VsZCB1c2UgdGhlIGV4cGxpY2l0IG1hY3JvIGZvciB0aGlzIHB1cnBvc2UgZm9yIG9wdGltdW0gZWZmaWNpZW5jeS4KKyAqIEEgc2luZ2x5LWxpbmtlZCB0YWlsIHF1ZXVlIG1heSBvbmx5IGJlIHRyYXZlcnNlZCBpbiB0aGUgZm9yd2FyZCBkaXJlY3Rpb24uCisgKiBTaW5nbHktbGlua2VkIHRhaWwgcXVldWVzIGFyZSBpZGVhbCBmb3IgYXBwbGljYXRpb25zIHdpdGggbGFyZ2UgZGF0YXNldHMKKyAqIGFuZCBmZXcgb3Igbm8gcmVtb3ZhbHMgb3IgZm9yIGltcGxlbWVudGluZyBhIEZJRk8gcXVldWUuCisgKgorICogQSBsaXN0IGlzIGhlYWRlZCBieSBhIHNpbmdsZSBmb3J3YXJkIHBvaW50ZXIgKG9yIGFuIGFycmF5IG9mIGZvcndhcmQKKyAqIHBvaW50ZXJzIGZvciBhIGhhc2ggdGFibGUgaGVhZGVyKS4gVGhlIGVsZW1lbnRzIGFyZSBkb3VibHkgbGlua2VkCisgKiBzbyB0aGF0IGFuIGFyYml0cmFyeSBlbGVtZW50IGNhbiBiZSByZW1vdmVkIHdpdGhvdXQgYSBuZWVkIHRvCisgKiB0cmF2ZXJzZSB0aGUgbGlzdC4gTmV3IGVsZW1lbnRzIGNhbiBiZSBhZGRlZCB0byB0aGUgbGlzdCBiZWZvcmUKKyAqIG9yIGFmdGVyIGFuIGV4aXN0aW5nIGVsZW1lbnQgb3IgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QuIEEgbGlzdAorICogbWF5IG9ubHkgYmUgdHJhdmVyc2VkIGluIHRoZSBmb3J3YXJkIGRpcmVjdGlvbi4KKyAqCisgKiBBIHRhaWwgcXVldWUgaXMgaGVhZGVkIGJ5IGEgcGFpciBvZiBwb2ludGVycywgb25lIHRvIHRoZSBoZWFkIG9mIHRoZQorICogbGlzdCBhbmQgdGhlIG90aGVyIHRvIHRoZSB0YWlsIG9mIHRoZSBsaXN0LiBUaGUgZWxlbWVudHMgYXJlIGRvdWJseQorICogbGlua2VkIHNvIHRoYXQgYW4gYXJiaXRyYXJ5IGVsZW1lbnQgY2FuIGJlIHJlbW92ZWQgd2l0aG91dCBhIG5lZWQgdG8KKyAqIHRyYXZlcnNlIHRoZSBsaXN0LiBOZXcgZWxlbWVudHMgY2FuIGJlIGFkZGVkIHRvIHRoZSBsaXN0IGJlZm9yZSBvcgorICogYWZ0ZXIgYW4gZXhpc3RpbmcgZWxlbWVudCwgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QsIG9yIGF0IHRoZSBlbmQgb2YKKyAqIHRoZSBsaXN0LiBBIHRhaWwgcXVldWUgbWF5IGJlIHRyYXZlcnNlZCBpbiBlaXRoZXIgZGlyZWN0aW9uLgorICoKKyAqIEZvciBkZXRhaWxzIG9uIHRoZSB1c2Ugb2YgdGhlc2UgbWFjcm9zLCBzZWUgdGhlIHF1ZXVlKDMpIG1hbnVhbCBwYWdlLgorICoKKyAqCisgKgkJCQlTTElTVAlMSVNUCVNUQUlMUQlUQUlMUQorICogX0hFQUQJCQkrCSsJKwkrCisgKiBfSEVBRF9JTklUSUFMSVpFUgkJKwkrCSsJKworICogX0VOVFJZCQkJKwkrCSsJKworICogX0lOSVQJCQkrCSsJKwkrCisgKiBfRU1QVFkJCQkrCSsJKwkrCisgKiBfRklSU1QJCQkrCSsJKwkrCisgKiBfTkVYVAkJCSsJKwkrCSsKKyAqIF9QUkVWCQkJLQktCS0JKworICogX0xBU1QJCQktCS0JKwkrCisgKiBfRk9SRUFDSAkJCSsJKwkrCSsKKyAqIF9GT1JFQUNIX1NBRkUJCSsJKwkrCSsKKyAqIF9GT1JFQUNIX1JFVkVSU0UJCS0JLQktCSsKKyAqIF9GT1JFQUNIX1JFVkVSU0VfU0FGRQktCS0JLQkrCisgKiBfSU5TRVJUX0hFQUQJCQkrCSsJKwkrCisgKiBfSU5TRVJUX0JFRk9SRQkJLQkrCS0JKworICogX0lOU0VSVF9BRlRFUgkJKwkrCSsJKworICogX0lOU0VSVF9UQUlMCQkJLQktCSsJKworICogX0NPTkNBVAkJCS0JLQkrCSsKKyAqIF9SRU1PVkVfQUZURVIJCSsJLQkrCS0KKyAqIF9SRU1PVkVfSEVBRAkJCSsJLQkrCS0KKyAqIF9SRU1PVkUJCQkrCSsJKwkrCisgKgorICovCisjaWZkZWYgUVVFVUVfTUFDUk9fREVCVUcKKy8qIFN0b3JlIHRoZSBsYXN0IDIgcGxhY2VzIHRoZSBxdWV1ZSBlbGVtZW50IG9yIGhlYWQgd2FzIGFsdGVyZWQgKi8KK3N0cnVjdCBxbV90cmFjZSB7CisJY2hhciAqIGxhc3RmaWxlOworCWludCBsYXN0bGluZTsKKwljaGFyICogcHJldmZpbGU7CisJaW50IHByZXZsaW5lOworfTsKKworI2RlZmluZQlUUkFDRUJVRglzdHJ1Y3QgcW1fdHJhY2UgdHJhY2U7CisjZGVmaW5lCVRSQVNISVQoeCkJZG8geyh4KSA9ICh2b2lkICopLTE7fSB3aGlsZSAoMCkKKworI2RlZmluZQlRTURfVFJBQ0VfSEVBRChoZWFkKSBkbyB7CQkJCQlcCisJKGhlYWQpLT50cmFjZS5wcmV2bGluZSA9IChoZWFkKS0+dHJhY2UubGFzdGxpbmU7CQlcCisJKGhlYWQpLT50cmFjZS5wcmV2ZmlsZSA9IChoZWFkKS0+dHJhY2UubGFzdGZpbGU7CQlcCisJKGhlYWQpLT50cmFjZS5sYXN0bGluZSA9IF9fTElORV9fOwkJCQlcCisJKGhlYWQpLT50cmFjZS5sYXN0ZmlsZSA9IF9fRklMRV9fOwkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lCVFNRF9UUkFDRV9FTEVNKGVsZW0pIGRvIHsJCQkJCVwKKwkoZWxlbSktPnRyYWNlLnByZXZsaW5lID0gKGVsZW0pLT50cmFjZS5sYXN0bGluZTsJCVwKKwkoZWxlbSktPnRyYWNlLnByZXZmaWxlID0gKGVsZW0pLT50cmFjZS5sYXN0ZmlsZTsJCVwKKwkoZWxlbSktPnRyYWNlLmxhc3RsaW5lID0gX19MSU5FX187CQkJCVwKKwkoZWxlbSktPnRyYWNlLmxhc3RmaWxlID0gX19GSUxFX187CQkJCVwKK30gd2hpbGUgKDApCisKKyNlbHNlCisjZGVmaW5lCVFNRF9UUkFDRV9FTEVNKGVsZW0pCisjZGVmaW5lCVFNRF9UUkFDRV9IRUFEKGhlYWQpCisjZGVmaW5lCVRSQUNFQlVGCisjZGVmaW5lCVRSQVNISVQoeCkKKyNlbmRpZgkvKiBRVUVVRV9NQUNST19ERUJVRyAqLworCisvKiBMaW50IHN1cHBvcnQgcmVxdWlyZXMgdHlwZXMgdG8gYmUgZGVmaW5lZCB1c2luZyB0eXBlZGVmcy4KKyAgIE5vIGFkZGluZyAic3RydWN0IiBpbXBsaWNpdGx5CisqLworI2lmZGVmIFVTRV9MSU5UCisjZGVmaW5lIF9RX1RZUEVfQ0FTVCh0eXBlKSAgICAgICAgICAodHlwZSAqKQorI2RlZmluZSBfUV9UWVBFX0ZJRUxEKHR5cGUsIGZpZWxkKSAgdHlwZSBmaWVsZAorI2Vsc2UKKyNkZWZpbmUgX1FfVFlQRV9DQVNUKHR5cGUpICAgICAgICAgIChzdHJ1Y3QgdHlwZSAqKQorI2RlZmluZSBfUV9UWVBFX0ZJRUxEKHR5cGUsIGZpZWxkKSAgc3RydWN0IHR5cGUgZmllbGQKKyNlbmRpZgorCisvKgorICogU2luZ2x5LWxpbmtlZCBMaXN0IGRlY2xhcmF0aW9ucy4KKyAqLworI2RlZmluZQlTTElTVF9IRUFEKG5hbWUsIHR5cGUpCQkJCQkJXAorc3RydWN0IG5hbWUgewkJCQkJCQkJXAorICAgIF9RX1RZUEVfRklFTEQodHlwZSwgKnNsaF9maXJzdCk7CS8qIGZpcnN0IGVsZW1lbnQgKi8JCQlcCit9CisKKyNkZWZpbmUJU0xJU1RfSEVBRF9JTklUSUFMSVpFUihoZWFkKQkJCQkJXAorCXsgTlVMTCB9CisKKyNkZWZpbmUJU0xJU1RfRU5UUlkodHlwZSkJCQkJCQlcCitzdHJ1Y3QgewkJCQkJCQkJXAorICAgIF9RX1RZUEVfRklFTEQodHlwZSwgKnNsZV9uZXh0KTsJLyogbmV4dCBlbGVtZW50ICovCQkJXAorfQorCisvKgorICogU2luZ2x5LWxpbmtlZCBMaXN0IGZ1bmN0aW9ucy4KKyAqLworI2RlZmluZQlTTElTVF9FTVBUWShoZWFkKQkoKGhlYWQpLT5zbGhfZmlyc3QgPT0gTlVMTCkKKworI2RlZmluZQlTTElTVF9GSVJTVChoZWFkKQkoKGhlYWQpLT5zbGhfZmlyc3QpCisKKyNkZWZpbmUJU0xJU1RfRk9SRUFDSCh2YXIsIGhlYWQsIGZpZWxkKQkJCQkJXAorCWZvciAoKHZhcikgPSBTTElTVF9GSVJTVCgoaGVhZCkpOwkJCQlcCisJICAgICh2YXIpOwkJCQkJCQlcCisJICAgICh2YXIpID0gU0xJU1RfTkVYVCgodmFyKSwgZmllbGQpKQorCisjZGVmaW5lCVNMSVNUX0ZPUkVBQ0hfU0FGRSh2YXIsIGhlYWQsIGZpZWxkLCB0dmFyKQkJCVwKKwlmb3IgKCh2YXIpID0gU0xJU1RfRklSU1QoKGhlYWQpKTsJCQkJXAorCSAgICAodmFyKSAmJiAoKHR2YXIpID0gU0xJU1RfTkVYVCgodmFyKSwgZmllbGQpLCAxKTsJCVwKKwkgICAgKHZhcikgPSAodHZhcikpCisKKyNkZWZpbmUJU0xJU1RfRk9SRUFDSF9QUkVWUFRSKHZhciwgdmFycCwgaGVhZCwgZmllbGQpCQkJXAorCWZvciAoKHZhcnApID0gJlNMSVNUX0ZJUlNUKChoZWFkKSk7CQkJCVwKKwkgICAgKCh2YXIpID0gKih2YXJwKSkgIT0gTlVMTDsJCQkJCVwKKwkgICAgKHZhcnApID0gJlNMSVNUX05FWFQoKHZhciksIGZpZWxkKSkKKworI2RlZmluZQlTTElTVF9JTklUKGhlYWQpIGRvIHsJCQkJCQlcCisJU0xJU1RfRklSU1QoKGhlYWQpKSA9IE5VTEw7CQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lCVNMSVNUX0lOU0VSVF9BRlRFUihzbGlzdGVsbSwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwlTTElTVF9ORVhUKChlbG0pLCBmaWVsZCkgPSBTTElTVF9ORVhUKChzbGlzdGVsbSksIGZpZWxkKTsJXAorCVNMSVNUX05FWFQoKHNsaXN0ZWxtKSwgZmllbGQpID0gKGVsbSk7CQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJU0xJU1RfSU5TRVJUX0hFQUQoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwlTTElTVF9ORVhUKChlbG0pLCBmaWVsZCkgPSBTTElTVF9GSVJTVCgoaGVhZCkpOwkJCVwKKwlTTElTVF9GSVJTVCgoaGVhZCkpID0gKGVsbSk7CQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lCVNMSVNUX05FWFQoZWxtLCBmaWVsZCkJKChlbG0pLT5maWVsZC5zbGVfbmV4dCkKKworI2RlZmluZQlTTElTVF9SRU1PVkUoaGVhZCwgZWxtLCB0eXBlLCBmaWVsZCkgZG8gewkJCVwKKwlpZiAoU0xJU1RfRklSU1QoKGhlYWQpKSA9PSAoZWxtKSkgewkJCQlcCisJCVNMSVNUX1JFTU9WRV9IRUFEKChoZWFkKSwgZmllbGQpOwkJCVwKKwl9CQkJCQkJCQlcCisJZWxzZSB7CQkJCQkJCQlcCisgICAgICAgIF9RX1RZUEVfRklFTEQodHlwZSwgKmN1cmVsbSkgPSBTTElTVF9GSVJTVCgoaGVhZCkpOwkJXAorCQl3aGlsZSAoU0xJU1RfTkVYVChjdXJlbG0sIGZpZWxkKSAhPSAoZWxtKSkJCVwKKwkJCWN1cmVsbSA9IFNMSVNUX05FWFQoY3VyZWxtLCBmaWVsZCk7CQlcCisJCVNMSVNUX1JFTU9WRV9BRlRFUihjdXJlbG0sIGZpZWxkKTsJCQlcCisJfQkJCQkJCQkJXAorCVRSQVNISVQoKGVsbSktPmZpZWxkLnNsZV9uZXh0KTsJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgU0xJU1RfUkVNT1ZFX0FGVEVSKGVsbSwgZmllbGQpIGRvIHsJCQkJXAorCVNMSVNUX05FWFQoZWxtLCBmaWVsZCkgPQkJCQkJXAorCSAgICBTTElTVF9ORVhUKFNMSVNUX05FWFQoZWxtLCBmaWVsZCksIGZpZWxkKTsJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lCVNMSVNUX1JFTU9WRV9IRUFEKGhlYWQsIGZpZWxkKSBkbyB7CQkJCVwKKwlTTElTVF9GSVJTVCgoaGVhZCkpID0gU0xJU1RfTkVYVChTTElTVF9GSVJTVCgoaGVhZCkpLCBmaWVsZCk7CVwKK30gd2hpbGUgKDApCisKKy8qCisgKiBTaW5nbHktbGlua2VkIFRhaWwgcXVldWUgZGVjbGFyYXRpb25zLgorICovCisjZGVmaW5lCVNUQUlMUV9IRUFEKG5hbWUsIHR5cGUpCQkJCQkJXAorc3RydWN0IG5hbWUgewkJCQkJCQkJXAorICAgIF9RX1RZUEVfRklFTEQodHlwZSwgKnN0cWhfZmlyc3QpOy8qIGZpcnN0IGVsZW1lbnQgKi8JCQlcCisgICAgX1FfVFlQRV9GSUVMRCh0eXBlLCAqKnN0cWhfbGFzdCk7LyogYWRkciBvZiBsYXN0IG5leHQgZWxlbWVudCAqLwkJXAorfQorCisjZGVmaW5lCVNUQUlMUV9IRUFEX0lOSVRJQUxJWkVSKGhlYWQpCQkJCQlcCisJeyBOVUxMLCAmKGhlYWQpLnN0cWhfZmlyc3QgfQorCisjZGVmaW5lCVNUQUlMUV9FTlRSWSh0eXBlKQkJCQkJCVwKK3N0cnVjdCB7CQkJCQkJCQlcCisgICAgX1FfVFlQRV9GSUVMRCh0eXBlLCAqc3RxZV9uZXh0KTsJLyogbmV4dCBlbGVtZW50ICovCQkJXAorfQorCisvKgorICogU2luZ2x5LWxpbmtlZCBUYWlsIHF1ZXVlIGZ1bmN0aW9ucy4KKyAqLworI2RlZmluZQlTVEFJTFFfQ09OQ0FUKGhlYWQxLCBoZWFkMikgZG8gewkJCQlcCisJaWYgKCFTVEFJTFFfRU1QVFkoKGhlYWQyKSkpIHsJCQkJCVwKKwkJKihoZWFkMSktPnN0cWhfbGFzdCA9IChoZWFkMiktPnN0cWhfZmlyc3Q7CQlcCisJCShoZWFkMSktPnN0cWhfbGFzdCA9IChoZWFkMiktPnN0cWhfbGFzdDsJCVwKKwkJU1RBSUxRX0lOSVQoKGhlYWQyKSk7CQkJCQlcCisJfQkJCQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZQlTVEFJTFFfRU1QVFkoaGVhZCkJKChoZWFkKS0+c3RxaF9maXJzdCA9PSBOVUxMKQorCisjZGVmaW5lCVNUQUlMUV9GSVJTVChoZWFkKQkoKGhlYWQpLT5zdHFoX2ZpcnN0KQorCisjZGVmaW5lCVNUQUlMUV9GT1JFQUNIKHZhciwgaGVhZCwgZmllbGQpCQkJCVwKKwlmb3IoKHZhcikgPSBTVEFJTFFfRklSU1QoKGhlYWQpKTsJCQkJXAorCSAgICh2YXIpOwkJCQkJCQlcCisJICAgKHZhcikgPSBTVEFJTFFfTkVYVCgodmFyKSwgZmllbGQpKQorCisKKyNkZWZpbmUJU1RBSUxRX0ZPUkVBQ0hfU0FGRSh2YXIsIGhlYWQsIGZpZWxkLCB0dmFyKQkJCVwKKwlmb3IgKCh2YXIpID0gU1RBSUxRX0ZJUlNUKChoZWFkKSk7CQkJCVwKKwkgICAgKHZhcikgJiYgKCh0dmFyKSA9IFNUQUlMUV9ORVhUKCh2YXIpLCBmaWVsZCksIDEpOwkJXAorCSAgICAodmFyKSA9ICh0dmFyKSkKKworI2RlZmluZQlTVEFJTFFfSU5JVChoZWFkKSBkbyB7CQkJCQkJXAorCVNUQUlMUV9GSVJTVCgoaGVhZCkpID0gTlVMTDsJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKGhlYWQpLT5zdHFoX2xhc3QgPSAmU1RBSUxRX0ZJUlNUKChoZWFkKSk7CQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZQlTVEFJTFFfSU5TRVJUX0FGVEVSKGhlYWQsIHRxZWxtLCBlbG0sIGZpZWxkKSBkbyB7CQlcCisJaWYgKChTVEFJTFFfTkVYVCgoZWxtKSwgZmllbGQpID0gU1RBSUxRX05FWFQoKHRxZWxtKSwgZmllbGQpKSA9PSBOVUxMKVwKKwkJKGhlYWQpLT5zdHFoX2xhc3QgPSAmU1RBSUxRX05FWFQoKGVsbSksIGZpZWxkKTsJCVwKKwlTVEFJTFFfTkVYVCgodHFlbG0pLCBmaWVsZCkgPSAoZWxtKTsJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZQlTVEFJTFFfSU5TRVJUX0hFQUQoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwlpZiAoKFNUQUlMUV9ORVhUKChlbG0pLCBmaWVsZCkgPSBTVEFJTFFfRklSU1QoKGhlYWQpKSkgPT0gTlVMTCkJXAorCQkoaGVhZCktPnN0cWhfbGFzdCA9ICZTVEFJTFFfTkVYVCgoZWxtKSwgZmllbGQpOwkJXAorCVNUQUlMUV9GSVJTVCgoaGVhZCkpID0gKGVsbSk7CQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lCVNUQUlMUV9JTlNFUlRfVEFJTChoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCVNUQUlMUV9ORVhUKChlbG0pLCBmaWVsZCkgPSBOVUxMOwkJCQlcCisJKihoZWFkKS0+c3RxaF9sYXN0ID0gKGVsbSk7CQkJCQlcCisJKGhlYWQpLT5zdHFoX2xhc3QgPSAmU1RBSUxRX05FWFQoKGVsbSksIGZpZWxkKTsJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lCVNUQUlMUV9MQVNUKGhlYWQsIHR5cGUsIGZpZWxkKQkJCQkJXAorCShTVEFJTFFfRU1QVFkoKGhlYWQpKSA/CQkJCQkJXAorCQlfUV9UWVBFX0NBU1QodHlwZSlOVUxMIDoJCQkJCQkJXAorCSAgICAgICAgKCh0eXBlICopKHZvaWQgKikJCQkJXAorCQkoKGNoYXIgKikoKGhlYWQpLT5zdHFoX2xhc3QpIC0gb2Zmc2V0b2YodHlwZSwgZmllbGQpKSkpCisKKyNkZWZpbmUJU1RBSUxRX05FWFQoZWxtLCBmaWVsZCkJKChlbG0pLT5maWVsZC5zdHFlX25leHQpCisKKyNkZWZpbmUJU1RBSUxRX1JFTU9WRShoZWFkLCBlbG0sIHR5cGUsIGZpZWxkKSBkbyB7CQkJXAorCWlmIChTVEFJTFFfRklSU1QoKGhlYWQpKSA9PSAoZWxtKSkgewkJCQlcCisJCVNUQUlMUV9SRU1PVkVfSEVBRCgoaGVhZCksIGZpZWxkKTsJCQlcCisJfQkJCQkJCQkJXAorCWVsc2UgewkJCQkJCQkJXAorICAgICAgICBfUV9UWVBFX0ZJRUxEKHR5cGUsICpjdXJlbG0pID0gU1RBSUxRX0ZJUlNUKChoZWFkKSk7CQlcCisJCXdoaWxlIChTVEFJTFFfTkVYVChjdXJlbG0sIGZpZWxkKSAhPSAoZWxtKSkJCVwKKwkJCWN1cmVsbSA9IFNUQUlMUV9ORVhUKGN1cmVsbSwgZmllbGQpOwkJXAorCQlTVEFJTFFfUkVNT1ZFX0FGVEVSKGhlYWQsIGN1cmVsbSwgZmllbGQpOwkJXAorCX0JCQkJCQkJCVwKKwlUUkFTSElUKChlbG0pLT5maWVsZC5zdHFlX25leHQpOwkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFNUQUlMUV9SRU1PVkVfU0FGRShoZWFkLCBlbG0sIHR5cGUsIGZpZWxkKSAoeyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9RX1RZUEVfRklFTEQodHlwZSwgKmN1cmVsbSkgPSBTVEFJTFFfRklSU1QoKGhlYWQpKTsgICAgICAgICAgICBcCisgICAgICAgIGlmIChjdXJlbG0gPT0gKGVsbSkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgU1RBSUxRX1JFTU9WRV9IRUFEKChoZWFkKSwgZmllbGQpOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgd2hpbGUgKGN1cmVsbSAmJiBTVEFJTFFfTkVYVChjdXJlbG0sIGZpZWxkKSAhPSAoZWxtKSkgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJlbG0gPSBTVEFJTFFfTkVYVChjdXJlbG0sIGZpZWxkKTsgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKGN1cmVsbSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIFNUQUlMUV9SRU1PVkVfQUZURVIoaGVhZCwgY3VyZWxtLCBmaWVsZCk7ICAgICAgICAgICBcCisgICAgICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRSQVNISVQoKGVsbSktPmZpZWxkLnN0cWVfbmV4dCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGN1cmVsbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9KQorCisjZGVmaW5lCVNUQUlMUV9SRU1PVkVfSEVBRChoZWFkLCBmaWVsZCkgZG8gewkJCQlcCisJaWYgKChTVEFJTFFfRklSU1QoKGhlYWQpKSA9CQkJCQlcCisJICAgICBTVEFJTFFfTkVYVChTVEFJTFFfRklSU1QoKGhlYWQpKSwgZmllbGQpKSA9PSBOVUxMKQkJXAorCQkoaGVhZCktPnN0cWhfbGFzdCA9ICZTVEFJTFFfRklSU1QoKGhlYWQpKTsJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgU1RBSUxRX1JFTU9WRV9BRlRFUihoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCWlmICgoU1RBSUxRX05FWFQoZWxtLCBmaWVsZCkgPQkJCQkJXAorCSAgICAgU1RBSUxRX05FWFQoU1RBSUxRX05FWFQoZWxtLCBmaWVsZCksIGZpZWxkKSkgPT0gTlVMTCkJXAorCQkoaGVhZCktPnN0cWhfbGFzdCA9ICZTVEFJTFFfTkVYVCgoZWxtKSwgZmllbGQpOwkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBTVEFJTFFfU1dBUChoZWFkMSwgaGVhZDIsIHR5cGUpIGRvIHsJCQkJXAorICAgIF9RX1RZUEVfRklFTEQodHlwZSwgKnN3YXBfZmlyc3QpID0gU1RBSUxRX0ZJUlNUKGhlYWQxKTsJCQlcCisgICAgX1FfVFlQRV9GSUVMRCh0eXBlLCAqKnN3YXBfbGFzdCkgPSAoaGVhZDEpLT5zdHFoX2xhc3Q7CQkJXAorCVNUQUlMUV9GSVJTVChoZWFkMSkgPSBTVEFJTFFfRklSU1QoaGVhZDIpOwkJCVwKKwkoaGVhZDEpLT5zdHFoX2xhc3QgPSAoaGVhZDIpLT5zdHFoX2xhc3Q7CQkJXAorCVNUQUlMUV9GSVJTVChoZWFkMikgPSBzd2FwX2ZpcnN0OwkJCQlcCisJKGhlYWQyKS0+c3RxaF9sYXN0ID0gc3dhcF9sYXN0OwkJCQkJXAorCWlmIChTVEFJTFFfRU1QVFkoaGVhZDEpKQkJCQkJXAorCQkoaGVhZDEpLT5zdHFoX2xhc3QgPSAmU1RBSUxRX0ZJUlNUKGhlYWQxKTsJCVwKKwlpZiAoU1RBSUxRX0VNUFRZKGhlYWQyKSkJCQkJCVwKKwkJKGhlYWQyKS0+c3RxaF9sYXN0ID0gJlNUQUlMUV9GSVJTVChoZWFkMik7CQlcCit9IHdoaWxlICgwKQorCisKKy8qCisgKiBMaXN0IGRlY2xhcmF0aW9ucy4KKyAqLworI2RlZmluZQlETElTVF9IRUFEKG5hbWUsIHR5cGUpCQkJCQkJXAorc3RydWN0IG5hbWUgewkJCQkJCQkJXAorICAgIF9RX1RZUEVfRklFTEQodHlwZSwgKmxoX2ZpcnN0KTsJLyogZmlyc3QgZWxlbWVudCAqLwkJCVwKK30KKworI2RlZmluZQlETElTVF9IRUFEX0lOSVRJQUxJWkVSKGhlYWQpCQkJCQlcCisJeyBOVUxMIH0KKworI2RlZmluZQlETElTVF9FTlRSWSh0eXBlKQkJCQkJCVwKK3N0cnVjdCB7CQkJCQkJCQlcCisgICAgX1FfVFlQRV9GSUVMRCh0eXBlLCAqbGVfbmV4dCk7CS8qIG5leHQgZWxlbWVudCAqLwkJCVwKKyAgICBfUV9UWVBFX0ZJRUxEKHR5cGUsICoqbGVfcHJldik7CS8qIGFkZHJlc3Mgb2YgcHJldmlvdXMgbmV4dCBlbGVtZW50ICovCVwKK30KKworLyoKKyAqIExpc3QgZnVuY3Rpb25zLgorICovCisKKyNpZiAoZGVmaW5lZChfS0VSTkVMKSAmJiBkZWZpbmVkKElOVkFSSUFOVFMpKQorI2RlZmluZQlRTURfRExJU1RfQ0hFQ0tfSEVBRChoZWFkLCBmaWVsZCkgZG8gewkJCQlcCisJaWYgKERMSVNUX0ZJUlNUKChoZWFkKSkgIT0gTlVMTCAmJgkJCQlcCisJICAgIERMSVNUX0ZJUlNUKChoZWFkKSktPmZpZWxkLmxlX3ByZXYgIT0JCQlcCisJICAgICAmRExJU1RfRklSU1QoKGhlYWQpKSkJCQkJCVwKKwkJcGFuaWMoIkJhZCBsaXN0IGhlYWQgJXAgZmlyc3QtPnByZXYgIT0gaGVhZCIsIChoZWFkKSk7CVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJUU1EX0RMSVNUX0NIRUNLX05FWFQoZWxtLCBmaWVsZCkgZG8gewkJCQlcCisJaWYgKERMSVNUX05FWFQoKGVsbSksIGZpZWxkKSAhPSBOVUxMICYmCQkJCVwKKwkgICAgRExJU1RfTkVYVCgoZWxtKSwgZmllbGQpLT5maWVsZC5sZV9wcmV2ICE9CQkJXAorCSAgICAgJigoZWxtKS0+ZmllbGQubGVfbmV4dCkpCQkJCQlcCisJICAgICAJcGFuaWMoIkJhZCBsaW5rIGVsbSAlcCBuZXh0LT5wcmV2ICE9IGVsbSIsIChlbG0pKTsJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZQlRTURfRExJU1RfQ0hFQ0tfUFJFVihlbG0sIGZpZWxkKSBkbyB7CQkJCVwKKwlpZiAoKihlbG0pLT5maWVsZC5sZV9wcmV2ICE9IChlbG0pKQkJCQlcCisJCXBhbmljKCJCYWQgbGluayBlbG0gJXAgcHJldi0+bmV4dCAhPSBlbG0iLCAoZWxtKSk7CVwKK30gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZQlRTURfRExJU1RfQ0hFQ0tfSEVBRChoZWFkLCBmaWVsZCkKKyNkZWZpbmUJUU1EX0RMSVNUX0NIRUNLX05FWFQoZWxtLCBmaWVsZCkKKyNkZWZpbmUJUU1EX0RMSVNUX0NIRUNLX1BSRVYoZWxtLCBmaWVsZCkKKyNlbmRpZiAvKiAoX0tFUk5FTCAmJiBJTlZBUklBTlRTKSAqLworCisjZGVmaW5lCURMSVNUX0VNUFRZKGhlYWQpCSgoaGVhZCktPmxoX2ZpcnN0ID09IE5VTEwpCisKKyNkZWZpbmUJRExJU1RfRklSU1QoaGVhZCkJKChoZWFkKS0+bGhfZmlyc3QpCisKKyNkZWZpbmUJRExJU1RfRk9SRUFDSCh2YXIsIGhlYWQsIGZpZWxkKQkJCQkJXAorCWZvciAoKHZhcikgPSBETElTVF9GSVJTVCgoaGVhZCkpOwkJCQlcCisJICAgICh2YXIpOwkJCQkJCQlcCisJICAgICh2YXIpID0gRExJU1RfTkVYVCgodmFyKSwgZmllbGQpKQorCisjZGVmaW5lCURMSVNUX0ZPUkVBQ0hfU0FGRSh2YXIsIGhlYWQsIGZpZWxkLCB0dmFyKQkJCVwKKwlmb3IgKCh2YXIpID0gRExJU1RfRklSU1QoKGhlYWQpKTsJCQkJXAorCSAgICAodmFyKSAmJiAoKHR2YXIpID0gRExJU1RfTkVYVCgodmFyKSwgZmllbGQpLCAxKTsJCVwKKwkgICAgKHZhcikgPSAodHZhcikpCisKKyNkZWZpbmUJRExJU1RfSU5JVChoZWFkKSBkbyB7CQkJCQkJXAorCURMSVNUX0ZJUlNUKChoZWFkKSkgPSBOVUxMOwkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZQlETElTVF9JTlNFUlRfQUZURVIobGlzdGVsbSwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwlRTURfRExJU1RfQ0hFQ0tfTkVYVChsaXN0ZWxtLCBmaWVsZCk7CQkJCVwKKwlpZiAoKERMSVNUX05FWFQoKGVsbSksIGZpZWxkKSA9IERMSVNUX05FWFQoKGxpc3RlbG0pLCBmaWVsZCkpICE9IE5VTEwpXAorCQlETElTVF9ORVhUKChsaXN0ZWxtKSwgZmllbGQpLT5maWVsZC5sZV9wcmV2ID0JCVwKKwkJICAgICZETElTVF9ORVhUKChlbG0pLCBmaWVsZCk7CQkJCVwKKwlETElTVF9ORVhUKChsaXN0ZWxtKSwgZmllbGQpID0gKGVsbSk7CQkJCVwKKwkoZWxtKS0+ZmllbGQubGVfcHJldiA9ICZETElTVF9ORVhUKChsaXN0ZWxtKSwgZmllbGQpOwkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZQlETElTVF9JTlNFUlRfQkVGT1JFKGxpc3RlbG0sIGVsbSwgZmllbGQpIGRvIHsJCQlcCisJUU1EX0RMSVNUX0NIRUNLX1BSRVYobGlzdGVsbSwgZmllbGQpOwkJCQlcCisJKGVsbSktPmZpZWxkLmxlX3ByZXYgPSAobGlzdGVsbSktPmZpZWxkLmxlX3ByZXY7CQlcCisJRExJU1RfTkVYVCgoZWxtKSwgZmllbGQpID0gKGxpc3RlbG0pOwkJCQlcCisJKihsaXN0ZWxtKS0+ZmllbGQubGVfcHJldiA9IChlbG0pOwkJCQlcCisJKGxpc3RlbG0pLT5maWVsZC5sZV9wcmV2ID0gJkRMSVNUX05FWFQoKGVsbSksIGZpZWxkKTsJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJRExJU1RfSU5TRVJUX0hFQUQoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCQlcCisJUU1EX0RMSVNUX0NIRUNLX0hFQUQoKGhlYWQpLCBmaWVsZCk7CQkJCVwKKwlpZiAoKERMSVNUX05FWFQoKGVsbSksIGZpZWxkKSA9IERMSVNUX0ZJUlNUKChoZWFkKSkpICE9IE5VTEwpCVwKKwkJRExJU1RfRklSU1QoKGhlYWQpKS0+ZmllbGQubGVfcHJldiA9ICZETElTVF9ORVhUKChlbG0pLCBmaWVsZCk7XAorCURMSVNUX0ZJUlNUKChoZWFkKSkgPSAoZWxtKTsJCQkJCVwKKwkoZWxtKS0+ZmllbGQubGVfcHJldiA9ICZETElTVF9GSVJTVCgoaGVhZCkpOwkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJRExJU1RfTkVYVChlbG0sIGZpZWxkKQkoKGVsbSktPmZpZWxkLmxlX25leHQpCisKKyNkZWZpbmUJRExJU1RfUkVNT1ZFKGVsbSwgZmllbGQpIGRvIHsJCQkJICAgIFwKKyAgICBpZiAoKGVsbSktPmZpZWxkLmxlX3ByZXYpICB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBRTURfRExJU1RfQ0hFQ0tfTkVYVChlbG0sIGZpZWxkKTsJCQkJXAorICAgICAgICBRTURfRExJU1RfQ0hFQ0tfUFJFVihlbG0sIGZpZWxkKTsJCQkJXAorICAgICAgICBpZiAoRExJU1RfTkVYVCgoZWxtKSwgZmllbGQpICE9IE5VTEwpCQkJXAorCQkgICAgRExJU1RfTkVYVCgoZWxtKSwgZmllbGQpLT5maWVsZC5sZV9wcmV2ID0gCVwKKwkJICAgICAgICAoZWxtKS0+ZmllbGQubGVfcHJldjsJCQkJICAgIFwKKwkJKihlbG0pLT5maWVsZC5sZV9wcmV2ID0gRExJU1RfTkVYVCgoZWxtKSwgZmllbGQpOwkJXAorCQlUUkFTSElUKChlbG0pLT5maWVsZC5sZV9uZXh0KTsJCQkJCVwKKwkJVFJBU0hJVCgoZWxtKS0+ZmllbGQubGVfcHJldik7CQkJCQlcCisgICAgfSBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIERMSVNUX1NXQVAoaGVhZDEsIGhlYWQyLCB0eXBlLCBmaWVsZCkgZG8gewkJCVwKKyAgICBfUV9UWVBFX0ZJRUxEKHR5cGUsICpzd2FwX3RtcCkgPSBETElTVF9GSVJTVCgoaGVhZDEpKTsJCQlcCisJRExJU1RfRklSU1QoKGhlYWQxKSkgPSBETElTVF9GSVJTVCgoaGVhZDIpKTsJCQlcCisJRExJU1RfRklSU1QoKGhlYWQyKSkgPSBzd2FwX3RtcDsJCQkJCVwKKwlpZiAoKHN3YXBfdG1wID0gRExJU1RfRklSU1QoKGhlYWQxKSkpICE9IE5VTEwpCQkJXAorCQlzd2FwX3RtcC0+ZmllbGQubGVfcHJldiA9ICZETElTVF9GSVJTVCgoaGVhZDEpKTsJCVwKKwlpZiAoKHN3YXBfdG1wID0gRExJU1RfRklSU1QoKGhlYWQyKSkpICE9IE5VTEwpCQkJXAorCQlzd2FwX3RtcC0+ZmllbGQubGVfcHJldiA9ICZETElTVF9GSVJTVCgoaGVhZDIpKTsJCVwKK30gd2hpbGUgKDApCisKKy8qCisgKiBUYWlsIHF1ZXVlIGRlY2xhcmF0aW9ucy4KKyAqLworI2RlZmluZQlUQUlMUV9IRUFEKG5hbWUsIHR5cGUpCQkJCQkJXAorc3RydWN0IG5hbWUgewkJCQkJCQkJXAorICAgIF9RX1RZUEVfRklFTEQodHlwZSwgKnRxaF9maXJzdCk7CS8qIGZpcnN0IGVsZW1lbnQgKi8JCQlcCisgICAgX1FfVFlQRV9GSUVMRCh0eXBlLCAqKnRxaF9sYXN0KTsJLyogYWRkciBvZiBsYXN0IG5leHQgZWxlbWVudCAqLwkJXAorCVRSQUNFQlVGCQkJCQkJCVwKK30KKworI2RlZmluZQlUQUlMUV9IRUFEX0lOSVRJQUxJWkVSKGhlYWQpCQkJCQlcCisJeyBOVUxMLCAmKGhlYWQpLnRxaF9maXJzdCB9CisKKyNkZWZpbmUJVEFJTFFfRU5UUlkodHlwZSkJCQkJCQlcCitzdHJ1Y3QgewkJCQkJCQkJXAorICAgIF9RX1RZUEVfRklFTEQodHlwZSwgKnRxZV9uZXh0KTsJICAgIC8qIG5leHQgZWxlbWVudCAqLwkJCVwKKyAgICBfUV9UWVBFX0ZJRUxEKHR5cGUsICoqdHFlX3ByZXYpOwkvKiBhZGRyZXNzIG9mIHByZXZpb3VzIG5leHQgZWxlbWVudCAqLwlcCisJVFJBQ0VCVUYJCQkJCQkJXAorfQorCisvKgorICogVGFpbCBxdWV1ZSBmdW5jdGlvbnMuCisgKi8KKyNpZiAoZGVmaW5lZChfS0VSTkVMKSAmJiBkZWZpbmVkKElOVkFSSUFOVFMpKQorI2RlZmluZQlRTURfVEFJTFFfQ0hFQ0tfSEVBRChoZWFkLCBmaWVsZCkgZG8gewkJCQlcCisJaWYgKCFUQUlMUV9FTVBUWShoZWFkKSAmJgkJCQkJXAorCSAgICBUQUlMUV9GSVJTVCgoaGVhZCkpLT5maWVsZC50cWVfcHJldiAhPQkJCVwKKwkgICAgICZUQUlMUV9GSVJTVCgoaGVhZCkpKQkJCQkJXAorCQlwYW5pYygiQmFkIHRhaWxxIGhlYWQgJXAgZmlyc3QtPnByZXYgIT0gaGVhZCIsIChoZWFkKSk7CVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJUU1EX1RBSUxRX0NIRUNLX1RBSUwoaGVhZCwgZmllbGQpIGRvIHsJCQkJXAorCWlmICgqKGhlYWQpLT50cWhfbGFzdCAhPSBOVUxMKQkJCQkJXAorCSAgICAJcGFuaWMoIkJhZCB0YWlscSBORVhUKCVwLT50cWhfbGFzdCkgIT0gTlVMTCIsIChoZWFkKSk7IAlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lCVFNRF9UQUlMUV9DSEVDS19ORVhUKGVsbSwgZmllbGQpIGRvIHsJCQkJXAorCWlmIChUQUlMUV9ORVhUKChlbG0pLCBmaWVsZCkgIT0gTlVMTCAmJgkJCQlcCisJICAgIFRBSUxRX05FWFQoKGVsbSksIGZpZWxkKS0+ZmllbGQudHFlX3ByZXYgIT0JCQlcCisJICAgICAmKChlbG0pLT5maWVsZC50cWVfbmV4dCkpCQkJCQlcCisJCXBhbmljKCJCYWQgbGluayBlbG0gJXAgbmV4dC0+cHJldiAhPSBlbG0iLCAoZWxtKSk7CVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJUU1EX1RBSUxRX0NIRUNLX1BSRVYoZWxtLCBmaWVsZCkgZG8gewkJCQlcCisJaWYgKCooZWxtKS0+ZmllbGQudHFlX3ByZXYgIT0gKGVsbSkpCQkJCVwKKwkJcGFuaWMoIkJhZCBsaW5rIGVsbSAlcCBwcmV2LT5uZXh0ICE9IGVsbSIsIChlbG0pKTsJXAorfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lCVFNRF9UQUlMUV9DSEVDS19IRUFEKGhlYWQsIGZpZWxkKQorI2RlZmluZQlRTURfVEFJTFFfQ0hFQ0tfVEFJTChoZWFkLCBoZWFkbmFtZSkKKyNkZWZpbmUJUU1EX1RBSUxRX0NIRUNLX05FWFQoZWxtLCBmaWVsZCkKKyNkZWZpbmUJUU1EX1RBSUxRX0NIRUNLX1BSRVYoZWxtLCBmaWVsZCkKKyNlbmRpZiAvKiAoX0tFUk5FTCAmJiBJTlZBUklBTlRTKSAqLworCisjZGVmaW5lCVRBSUxRX0NPTkNBVChoZWFkMSwgaGVhZDIsIGZpZWxkKSBkbyB7CQkJCVwKKwlpZiAoIVRBSUxRX0VNUFRZKGhlYWQyKSkgewkJCQkJXAorCQkqKGhlYWQxKS0+dHFoX2xhc3QgPSAoaGVhZDIpLT50cWhfZmlyc3Q7CQlcCisJCShoZWFkMiktPnRxaF9maXJzdC0+ZmllbGQudHFlX3ByZXYgPSAoaGVhZDEpLT50cWhfbGFzdDsJXAorCQkoaGVhZDEpLT50cWhfbGFzdCA9IChoZWFkMiktPnRxaF9sYXN0OwkJCVwKKwkJVEFJTFFfSU5JVCgoaGVhZDIpKTsJCQkJCVwKKwkJUU1EX1RSQUNFX0hFQUQoaGVhZDEpOwkJCQkJXAorCQlRTURfVFJBQ0VfSEVBRChoZWFkMik7CQkJCQlcCisJfQkJCQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZQlUQUlMUV9FTVBUWShoZWFkKQkoKGhlYWQpLT50cWhfZmlyc3QgPT0gTlVMTCkKKworI2RlZmluZQlUQUlMUV9GSVJTVChoZWFkKQkoKGhlYWQpLT50cWhfZmlyc3QpCisKKyNkZWZpbmUJVEFJTFFfRk9SRUFDSCh2YXIsIGhlYWQsIGZpZWxkKQkJCQkJXAorCWZvciAoKHZhcikgPSBUQUlMUV9GSVJTVCgoaGVhZCkpOwkJCQlcCisJICAgICh2YXIpOwkJCQkJCQlcCisJICAgICh2YXIpID0gVEFJTFFfTkVYVCgodmFyKSwgZmllbGQpKQorCisjZGVmaW5lCVRBSUxRX0ZPUkVBQ0hfU0FGRSh2YXIsIGhlYWQsIGZpZWxkLCB0dmFyKQkJCVwKKwlmb3IgKCh2YXIpID0gVEFJTFFfRklSU1QoKGhlYWQpKTsJCQkJXAorCSAgICAodmFyKSAmJiAoKHR2YXIpID0gVEFJTFFfTkVYVCgodmFyKSwgZmllbGQpLCAxKTsJCVwKKwkgICAgKHZhcikgPSAodHZhcikpCisKKyNkZWZpbmUJVEFJTFFfRk9SRUFDSF9SRVZFUlNFKHZhciwgaGVhZCwgaGVhZG5hbWUsIGZpZWxkKQkJXAorCWZvciAoKHZhcikgPSBUQUlMUV9MQVNUKChoZWFkKSwgaGVhZG5hbWUpOwkJCVwKKwkgICAgKHZhcik7CQkJCQkJCVwKKwkgICAgKHZhcikgPSBUQUlMUV9QUkVWKCh2YXIpLCBoZWFkbmFtZSwgZmllbGQpKQorCisjZGVmaW5lCVRBSUxRX0ZPUkVBQ0hfUkVWRVJTRV9TQUZFKHZhciwgaGVhZCwgaGVhZG5hbWUsIGZpZWxkLCB0dmFyKQlcCisJZm9yICgodmFyKSA9IFRBSUxRX0xBU1QoKGhlYWQpLCBoZWFkbmFtZSk7CQkJXAorCSAgICAodmFyKSAmJiAoKHR2YXIpID0gVEFJTFFfUFJFVigodmFyKSwgaGVhZG5hbWUsIGZpZWxkKSwgMSk7CVwKKwkgICAgKHZhcikgPSAodHZhcikpCisKKyNkZWZpbmUJVEFJTFFfSU5JVChoZWFkKSBkbyB7CQkJCQkJXAorCVRBSUxRX0ZJUlNUKChoZWFkKSkgPSBOVUxMOwkJCQkJXAorCShoZWFkKS0+dHFoX2xhc3QgPSAmVEFJTFFfRklSU1QoKGhlYWQpKTsJCQlcCisJUU1EX1RSQUNFX0hFQUQoaGVhZCk7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZQlUQUlMUV9JTlNFUlRfQUZURVIoaGVhZCwgbGlzdGVsbSwgZWxtLCBmaWVsZCkgZG8gewkJXAorCVFNRF9UQUlMUV9DSEVDS19ORVhUKGxpc3RlbG0sIGZpZWxkKTsJCQkJXAorCWlmICgoVEFJTFFfTkVYVCgoZWxtKSwgZmllbGQpID0gVEFJTFFfTkVYVCgobGlzdGVsbSksIGZpZWxkKSkgIT0gTlVMTClcCisJCVRBSUxRX05FWFQoKGVsbSksIGZpZWxkKS0+ZmllbGQudHFlX3ByZXYgPSAJCVwKKwkJICAgICZUQUlMUV9ORVhUKChlbG0pLCBmaWVsZCk7CQkJCVwKKwllbHNlIHsJCQkJCQkJCVwKKwkJKGhlYWQpLT50cWhfbGFzdCA9ICZUQUlMUV9ORVhUKChlbG0pLCBmaWVsZCk7CQlcCisJCVFNRF9UUkFDRV9IRUFEKGhlYWQpOwkJCQkJXAorCX0JCQkJCQkJCVwKKwlUQUlMUV9ORVhUKChsaXN0ZWxtKSwgZmllbGQpID0gKGVsbSk7CQkJCVwKKwkoZWxtKS0+ZmllbGQudHFlX3ByZXYgPSAmVEFJTFFfTkVYVCgobGlzdGVsbSksIGZpZWxkKTsJCVwKKwlRTURfVFJBQ0VfRUxFTSgmKGVsbSktPmZpZWxkKTsJCQkJCVwKKwlRTURfVFJBQ0VfRUxFTSgmbGlzdGVsbS0+ZmllbGQpOwkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lCVRBSUxRX0lOU0VSVF9CRUZPUkUobGlzdGVsbSwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwlRTURfVEFJTFFfQ0hFQ0tfUFJFVihsaXN0ZWxtLCBmaWVsZCk7CQkJCVwKKwkoZWxtKS0+ZmllbGQudHFlX3ByZXYgPSAobGlzdGVsbSktPmZpZWxkLnRxZV9wcmV2OwkJXAorCVRBSUxRX05FWFQoKGVsbSksIGZpZWxkKSA9IChsaXN0ZWxtKTsJCQkJXAorCSoobGlzdGVsbSktPmZpZWxkLnRxZV9wcmV2ID0gKGVsbSk7CQkJCVwKKwkobGlzdGVsbSktPmZpZWxkLnRxZV9wcmV2ID0gJlRBSUxRX05FWFQoKGVsbSksIGZpZWxkKTsJCVwKKwlRTURfVFJBQ0VfRUxFTSgmKGVsbSktPmZpZWxkKTsJCQkJCVwKKwlRTURfVFJBQ0VfRUxFTSgmbGlzdGVsbS0+ZmllbGQpOwkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lCVRBSUxRX0lOU0VSVF9IRUFEKGhlYWQsIGVsbSwgZmllbGQpIGRvIHsJCQlcCisJUU1EX1RBSUxRX0NIRUNLX0hFQUQoaGVhZCwgZmllbGQpOwkJCQlcCisJaWYgKChUQUlMUV9ORVhUKChlbG0pLCBmaWVsZCkgPSBUQUlMUV9GSVJTVCgoaGVhZCkpKSAhPSBOVUxMKQlcCisJCVRBSUxRX0ZJUlNUKChoZWFkKSktPmZpZWxkLnRxZV9wcmV2ID0JCQlcCisJCSAgICAmVEFJTFFfTkVYVCgoZWxtKSwgZmllbGQpOwkJCQlcCisJZWxzZQkJCQkJCQkJXAorCQkoaGVhZCktPnRxaF9sYXN0ID0gJlRBSUxRX05FWFQoKGVsbSksIGZpZWxkKTsJCVwKKwlUQUlMUV9GSVJTVCgoaGVhZCkpID0gKGVsbSk7CQkJCQlcCisJKGVsbSktPmZpZWxkLnRxZV9wcmV2ID0gJlRBSUxRX0ZJUlNUKChoZWFkKSk7CQkJXAorCVFNRF9UUkFDRV9IRUFEKGhlYWQpOwkJCQkJCVwKKwlRTURfVFJBQ0VfRUxFTSgmKGVsbSktPmZpZWxkKTsJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJVEFJTFFfSU5TRVJUX1RBSUwoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwlRTURfVEFJTFFfQ0hFQ0tfVEFJTChoZWFkLCBmaWVsZCk7CQkJCVwKKwlUQUlMUV9ORVhUKChlbG0pLCBmaWVsZCkgPSBOVUxMOwkJCQlcCisJKGVsbSktPmZpZWxkLnRxZV9wcmV2ID0gKGhlYWQpLT50cWhfbGFzdDsJCQlcCisJKihoZWFkKS0+dHFoX2xhc3QgPSAoZWxtKTsJCQkJCVwKKwkoaGVhZCktPnRxaF9sYXN0ID0gJlRBSUxRX05FWFQoKGVsbSksIGZpZWxkKTsJCQlcCisJUU1EX1RSQUNFX0hFQUQoaGVhZCk7CQkJCQkJXAorCVFNRF9UUkFDRV9FTEVNKCYoZWxtKS0+ZmllbGQpOwkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZQlUQUlMUV9MQVNUKGhlYWQsIGhlYWRuYW1lKQkJCQkJXAorCSgqKCgoc3RydWN0IGhlYWRuYW1lICopKChoZWFkKS0+dHFoX2xhc3QpKS0+dHFoX2xhc3QpKQorCisjZGVmaW5lCVRBSUxRX05FWFQoZWxtLCBmaWVsZCkgKChlbG0pLT5maWVsZC50cWVfbmV4dCkKKworI2RlZmluZQlUQUlMUV9QUkVWKGVsbSwgaGVhZG5hbWUsIGZpZWxkKQkJCQlcCisJKCooKChzdHJ1Y3QgaGVhZG5hbWUgKikoKGVsbSktPmZpZWxkLnRxZV9wcmV2KSktPnRxaF9sYXN0KSkKKworI2RlZmluZQlUQUlMUV9SRU1PVkUoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCQlcCisJUU1EX1RBSUxRX0NIRUNLX05FWFQoZWxtLCBmaWVsZCk7CQkJCVwKKwlRTURfVEFJTFFfQ0hFQ0tfUFJFVihlbG0sIGZpZWxkKTsJCQkJXAorCWlmICgoVEFJTFFfTkVYVCgoZWxtKSwgZmllbGQpKSAhPSBOVUxMKQkJCQlcCisJCVRBSUxRX05FWFQoKGVsbSksIGZpZWxkKS0+ZmllbGQudHFlX3ByZXYgPSAJCVwKKwkJICAgIChlbG0pLT5maWVsZC50cWVfcHJldjsJCQkJXAorCWVsc2UgewkJCQkJCQkJXAorCQkoaGVhZCktPnRxaF9sYXN0ID0gKGVsbSktPmZpZWxkLnRxZV9wcmV2OwkJXAorCQlRTURfVFJBQ0VfSEVBRChoZWFkKTsJCQkJCVwKKwl9CQkJCQkJCQlcCisJKihlbG0pLT5maWVsZC50cWVfcHJldiA9IFRBSUxRX05FWFQoKGVsbSksIGZpZWxkKTsJCVwKKwlUUkFTSElUKChlbG0pLT5maWVsZC50cWVfbmV4dCk7CQkJCQlcCisJVFJBU0hJVCgoZWxtKS0+ZmllbGQudHFlX3ByZXYpOwkJCQkJXAorCVFNRF9UUkFDRV9FTEVNKCYoZWxtKS0+ZmllbGQpOwkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBUQUlMUV9TV0FQKGhlYWQxLCBoZWFkMiwgdHlwZSwgZmllbGQpIGRvIHsJCQlcCisgICAgX1FfVFlQRV9GSUVMRCh0eXBlLCAqc3dhcF9maXJzdCkgPSAoaGVhZDEpLT50cWhfZmlyc3Q7CQkJXAorICAgIF9RX1RZUEVfRklFTEQodHlwZSwgKipzd2FwX2xhc3QpID0gKGhlYWQxKS0+dHFoX2xhc3Q7CQkJXAorCShoZWFkMSktPnRxaF9maXJzdCA9IChoZWFkMiktPnRxaF9maXJzdDsJCQlcCisJKGhlYWQxKS0+dHFoX2xhc3QgPSAoaGVhZDIpLT50cWhfbGFzdDsJCQkJXAorCShoZWFkMiktPnRxaF9maXJzdCA9IHN3YXBfZmlyc3Q7CQkJCVwKKwkoaGVhZDIpLT50cWhfbGFzdCA9IHN3YXBfbGFzdDsJCQkJCVwKKwlpZiAoKHN3YXBfZmlyc3QgPSAoaGVhZDEpLT50cWhfZmlyc3QpICE9IE5VTEwpCQkJXAorCQlzd2FwX2ZpcnN0LT5maWVsZC50cWVfcHJldiA9ICYoaGVhZDEpLT50cWhfZmlyc3Q7CVwKKwllbHNlCQkJCQkJCQlcCisJCShoZWFkMSktPnRxaF9sYXN0ID0gJihoZWFkMSktPnRxaF9maXJzdDsJCVwKKwlpZiAoKHN3YXBfZmlyc3QgPSAoaGVhZDIpLT50cWhfZmlyc3QpICE9IE5VTEwpCQkJXAorCQlzd2FwX2ZpcnN0LT5maWVsZC50cWVfcHJldiA9ICYoaGVhZDIpLT50cWhfZmlyc3Q7CVwKKwllbHNlCQkJCQkJCQlcCisJCShoZWFkMiktPnRxaF9sYXN0ID0gJihoZWFkMiktPnRxaF9maXJzdDsJCVwKK30gd2hpbGUgKDApCisKKyNlbmRpZiAvKiAhX1NZU19RVUVVRV9IXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9iY21vc19yd19sb2NrLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2JjbW9zX3J3X2xvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2ViNWUwCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9iY21vc19yd19sb2NrLmMKQEAgLTAsMCArMSwxMjQgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisjaW5jbHVkZSAiYmNtb3NfcndfbG9jay5oIgorCitzdHJ1Y3QgYmNtb3NfcndfbG9jaworeworICAgIC8qIHRoZSBhY3R1YWwgbG9jaywgaGVsZCBieSB0aGUgd3JpdGVyLCB1c2VkIGJ5IHRoZSByZWFkZXIgdG8gc2FmZWx5IG9idGFpbiBhIHJlYWQgbG9jaywgYnV0IG5vdCBoZWxkIHRvIGFsbG93CisgICAgICogbXVsdGlwbGUgcmVhZGVycyAqLworICAgIGJjbW9zX211dGV4IGxvY2s7CisgICAgLyogdXNlZCBieSB0aGUgd3JpdGVyIHRvIHByZXZlbnQgbmV3IHJlYWRlcnMgZnJvbSBvYnRhaW5pbmcgcmVhZCBsb2NrcyB3aGlsZSBhIHdyaXRlciBpcyB3YWl0aW5nICovCisgICAgYmNtb3NfbXV0ZXggcmVhZF9sb2NrOworICAgIC8qIHVzZWQgYnkgcmVhZGVycyB0byBzaWduYWwgd2FpdGluZyB3cml0ZXJzIHRoYXQgdGhleSBoYXZlIGZpbmlzaGVkIHJlYWRpbmcgKi8KKyAgICBiY21vc19zZW0gd3JpdGVfbG9jazsKKyAgICAvKiBjdXJyZW50IG51bWJlciBvZiByZWFkZXJzICovCisgICAgdWludDMyX3QgcmVhZGVyczsKK307CisKK2JjbW9zX2Vycm5vIGJjbW9zX3J3X2xvY2tfY3JlYXRlKGJjbW9zX3J3X2xvY2sgKipsb2NrKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICAqbG9jayA9IChiY21vc19yd19sb2NrKiliY21vc19jYWxsb2Moc2l6ZW9mKGJjbW9zX3J3X2xvY2spKTsKKyAgICBpZiAoKmxvY2sgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIEJVRygpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICB9CisgICAgaWYgKEJDTV9FUlJfT0sgIT0gKGVyciA9IGJjbW9zX211dGV4X2NyZWF0ZSgmKCpsb2NrKS0+bG9jaywgMCwgImJjbW9zX3J3X2xvY2tfY3JlYXRlX2xvY2siKSkpCisgICAgeworICAgICAgICBCVUcoKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgaWYgKEJDTV9FUlJfT0sgIT0gKGVyciA9IGJjbW9zX211dGV4X2NyZWF0ZSgmKCpsb2NrKS0+cmVhZF9sb2NrLCAwLCAiYmNtb3NfcndfbG9ja19jcmVhdGVfcndfbG9jayIpKSkKKyAgICB7CisgICAgICAgIEJVRygpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICAoKmxvY2spLT5yZWFkZXJzID0gMDsKKyAgICBpZiAoQkNNX0VSUl9PSyAhPSAoZXJyID0gYmNtb3Nfc2VtX2NyZWF0ZSgmKCpsb2NrKS0+d3JpdGVfbG9jaywgMSwgMCwgImJjbW9zX3J3X2xvY2tfY3JlYXRlX3dyaXRlX2xvY2siKSkpCisgICAgeworICAgICAgICBCVUcoKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworLypsaW50IC1lezQ1NX0gc3VwcHJlc3MgInRocmVhZCBtdXRleCBoYXMgbm90IGJlZW4gbG9ja2VkIiAqLwordm9pZCBiY21vc19yd193cml0ZV9sb2NrKGJjbW9zX3J3X2xvY2sqIGxvY2spCit7CisgICAgLyogcHJldmVudCBhbnkgbmV3IHJlYWRlcnMgZnJvbSB0cnlpbmcgdG8gb2J0YWluIGEgcmVhZCBsb2NrICovCisgICAgYmNtb3NfbXV0ZXhfbG9jaygmbG9jay0+cmVhZF9sb2NrKTsKKyAgICAvKiBsb2NrIHRoZSBhY3R1YWwgbG9jayAqLworICAgIGJjbW9zX211dGV4X2xvY2soJmxvY2stPmxvY2spOworICAgIHdoaWxlIChsb2NrLT5yZWFkZXJzICE9IDApCisgICAgeworICAgICAgICAvKiB0aGVyZSBhcmUgc3RpbGwgcmVhZGVycyBob2xkaW5nIHJlYWQgbG9ja3MsIHJlbGVhc2UgdGhlIGxvY2sgKi8KKyAgICAgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZsb2NrLT5sb2NrKTsKKyAgICAgICAgLyogd2FpdCBmb3IgdGhlIHNpZ25hbCBmcm9tIHRoZSBsYXN0IHJlYWRlciBiZWZvcmUgdHJ5aW5nIGFnYWluICovCisgICAgICAgIGJjbW9zX3NlbV93YWl0KCZsb2NrLT53cml0ZV9sb2NrLCBCQ01PU19XQUlUX0ZPUkVWRVIpOworICAgICAgICAvKiBsb2NrIHRoZSBhY3R1YWwgbG9jayBhbmQgY2hlY2sgZm9yIHJlYWRlcnMgYWdhaW4gKi8KKyAgICAgICAgYmNtb3NfbXV0ZXhfbG9jaygmbG9jay0+bG9jayk7CisgICAgfQorICAgIC8qIG5vIG1vcmUgcmVhZGVycywgYWxsb3cgbmV3IHJlYWRlcnMgdG8gd2FpdCBvbiB0aGUgbG9jayAqLworICAgIGJjbW9zX211dGV4X3VubG9jaygmbG9jay0+cmVhZF9sb2NrKTsKK30KKy8qbGludCArZXs0NTR9IHN1cHByZXNzICJ0aHJlYWQgbXV0ZXggaGFzIG5vdCBiZWVuIGxvY2tlZCIgKi8KKwordm9pZCBiY21vc19yd193cml0ZV9yZWxlYXNlKGJjbW9zX3J3X2xvY2sqIGxvY2spCit7CisgICAgLypsaW50IC0tZXs0NTV9IHN1cHByZXNzICJ0aHJlYWQgbXV0ZXggaGFzIG5vdCBiZWVuIGxvY2tlZCIgKi8KKyAgICBiY21vc19tdXRleF91bmxvY2soJmxvY2stPmxvY2spOworfQorCit2b2lkIGJjbW9zX3J3X3JlYWRfbG9jayhiY21vc19yd19sb2NrKiBsb2NrKQoreworICAgIC8qIHdhaXQgZm9yIGFueW9uZSB0cnlpbmcgdG8gZ2V0IGEgd3JpdGUgbG9jayAqLworICAgIGJjbW9zX211dGV4X2xvY2soJmxvY2stPnJlYWRfbG9jayk7CisgICAgLyogd2FpdCBmb3IgdGhlIGxvY2sgdG8gYmUgcmVsZWFzZWQgKi8KKyAgICBiY21vc19tdXRleF9sb2NrKCZsb2NrLT5sb2NrKTsKKyAgICBsb2NrLT5yZWFkZXJzKys7CisgICAgLyogcmVzZXQgdGhlIHNpZ25hbCB0byB0aGUgd3JpdGVycyAqLworICAgIGJjbW9zX3NlbV93YWl0KCZsb2NrLT53cml0ZV9sb2NrLCBCQ01PU19OT19XQUlUKTsKKyAgICAvKiBhbGwgZG9uZSwgcmVsZWFzZSBldmVyeXRoaW5nIHNvIG90aGVyIHJlYWRlcnMgY2FuIGdldCBhIHJlYWQgbG9jayAqLworICAgIGJjbW9zX211dGV4X3VubG9jaygmbG9jay0+bG9jayk7CisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZsb2NrLT5yZWFkX2xvY2spOworfQorCit2b2lkIGJjbW9zX3J3X3JlYWRfcmVsZWFzZShiY21vc19yd19sb2NrKiBsb2NrKQoreworICAgIC8qIGdldCBhIGxvY2sgdG8gcHJldmVudCBpbnRlcnJ1cHRpb25zICovCisgICAgYmNtb3NfbXV0ZXhfbG9jaygmbG9jay0+bG9jayk7CisgICAgaWYgKC0tbG9jay0+cmVhZGVycyA9PSAwKQorICAgIHsKKyAgICAgICAgLyogaWYgd2UncmUgdGhlIGxhc3QgcmVhZGVyLCBzaWduYWwgdGhhdCB0aGUgbG9jayBpcyBhdmFpbGFibGUgZm9yIGEgd3JpdGVyICovCisgICAgICAgIGJjbW9zX3NlbV9wb3N0KCZsb2NrLT53cml0ZV9sb2NrKTsKKyAgICB9CisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZsb2NrLT5sb2NrKTsKK30KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9iY21vc19yd19sb2NrLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2JjbW9zX3J3X2xvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTJkNTMzCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9iY21vc19yd19sb2NrLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworLyoqIEEgd3JpdGUtYmlhc2VkIHJlYWRlcnMtd3JpdGVyIGxvY2sKKyAqICBOT1RFOiBETyBOT1QgYXR0ZW1wdCB0byBvYnRhaW4gYSB3cml0ZSBsb2NrIG9uIGEgdGhyZWFkIHRoYXQgaXMgYWxyZWFkeSBob2xkaW5nIGEgcmVhZCBsb2NrIG9yIHZpY2UgdmVyc2EgLSB0aGlzCisgKiAgd2lsbCByZXN1bHQgaW4gYSBkZWFkbG9jay4gTXVsdGlwbGUgcmVhZCBsb2NrcyBmcm9tIHRoZSBzYW1lIHRocmVhZCBhcmUgc2FmZSwgbXVsdGlwbGUgd3JpdGUgbG9ja3MgYXJlIE5PVC4KKyAqLworI2lmbmRlZiBCQ01PU19SV19MT0NLX0hfCisjZGVmaW5lIEJDTU9TX1JXX0xPQ0tfSF8KKyNpbmNsdWRlICJiY21vc19zeXN0ZW0uaCIKKwordHlwZWRlZiBzdHJ1Y3QgYmNtb3NfcndfbG9jayBiY21vc19yd19sb2NrOworCisvKiogSW5pdGlhbGl6ZSBhIGxvY2sKKyAqICBccGFyYW1bb3V0XSBsb2NrICAgIHRoZSBuZXdseSBjcmVhdGVkIGxvY2sKKyAqICBccmV0dXJuIGVycm9yIGNvZGUKKyAqLworYmNtb3NfZXJybm8gYmNtb3NfcndfbG9ja19jcmVhdGUoYmNtb3NfcndfbG9jayAqKmxvY2spOworCisvKiogT2J0YWluIGEgd3JpdGUgbG9jaworICogIFxwYXJhbVtpbl0gbG9jayAgICAgdGhlIGxvY2sgdG8gb3BlcmF0ZSBvbgorICovCit2b2lkIGJjbW9zX3J3X3dyaXRlX2xvY2soYmNtb3NfcndfbG9jayogbG9jayk7CisKKy8qKiBSZWxlYXNlIGEgd3JpdGUgbG9jaworICogIFxwYXJhbVtpbl0gbG9jayAgICAgdGhlIGxvY2sgdG8gb3BlcmF0ZSBvbgorICovCit2b2lkIGJjbW9zX3J3X3dyaXRlX3JlbGVhc2UoYmNtb3NfcndfbG9jayogbG9jayk7CisKKy8qKiBPYnRhaW4gYSByZWFkIGxvY2sKKyAqICBccGFyYW1baW5dIGxvY2sgICAgIHRoZSBsb2NrIHRvIG9wZXJhdGUgb24KKyAqLwordm9pZCBiY21vc19yd19yZWFkX2xvY2soYmNtb3NfcndfbG9jayogbG9jayk7CisKKy8qKiBSZWxlYXNlIGEgcmVhZCBsb2NrCisgKiAgXHBhcmFtW2luXSBsb2NrICAgICB0aGUgbG9jayB0byBvcGVyYXRlIG9uCisgKi8KK3ZvaWQgYmNtb3NfcndfcmVhZF9yZWxlYXNlKGJjbW9zX3J3X2xvY2sqIGxvY2spOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vYmNtb3Nfc3lzaWYuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vYmNtb3Nfc3lzaWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2RmNmRjCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9iY21vc19zeXNpZi5oCkBAIC0wLDAgKzEsOTMgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKy8qCisgKiBiY21vc19zeXNpZi5oCisgKgorICogVGhpcyBpbnRlcm5hbCBoZWFkZXIgZmlsZSBpbmNsdWRlcyBPUy1zcGVjaWZpYyBzZXJ2aWNlcworICogdGhhdCBhcmUgcmVmZXJyZWQgaW4gT1MtaW5kZXBlbmRlbnQgT1MgYWJzdHJhY3Rpb24gaW1wbGVtZW50YXRpb24KKyAqCisgKi8KKworI2lmbmRlZiBCQ01PU19TWVNJRl9IXworI2RlZmluZSBCQ01PU19TWVNJRl9IXworCisvKgorICogT1Mtc3BlY2lmaWMgaW5pdAorICovCisKKy8qKiBJbml0aWFsaXplIHN5c3RlbSBsaWJyYXJ5CisgKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIHN5c3RlbSBmdW5jdGlvbgorICogXHJldHVybnMgMD1PSyBvciBlcnJvciBjb2RlIDwwCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX3N5c19pbml0KHZvaWQpOworCisvKiogQ2xlYW4tdXAgc3lzdGVtIGxpYnJhcnkKKyAqLwordm9pZCBiY21vc19zeXNfZXhpdCh2b2lkKTsKKworCisvKgorICogVGltZXIgc3VwcG9ydAorICovCisKKy8qIE9TIGFic3RyYWN0aW9uIG11c3QgZGVmaW5lIHN0cnVjdCBiY21vc19zeXNfdGltZXIKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb3Nfc3lzX3RpbWVyIGJjbW9zX3N5c190aW1lcjsKKworLyogU3lzdGVtIHRpbWVyIGhhbmRsZXIuIEltcGxlbWVudGVkIGluIGNvbW1vbiBPUyBhYnN0cmFjdGlvbiBzZXJ2aWNlcyAqLwordHlwZWRlZiB2b2lkICgqYmNtb3Nfc3lzX3RpbWVyX2hhbmRsZXIpKHZvaWQgKmRhdGEpOworCisvKiBDcmVhdGUgc3lzdGVtIHRpbWVyCisgKiBJdCBpcyBleHBlY3RlZCB0aGF0IG9ubHkgb25lIGhpZ2gtcmVzb2x1dGlvbiBzeXN0ZW0gdGltZXIgaXMgbmVlZGVkLgorICogSXQgaXMgdXNlZCB0byAia2ljayIgdGltZXIgcG9vbCBpbXBsZW1lbnRlZCBpbiBPUyBhYnN0cmFjdGlvbgorICogXHBhcmFtW2luXSAgIHRpbWVyICAgU3lzdGVtIHRpbWVyCisgKiBccGFyYW1baW5dICAgaGFuZGxlciBUaW1lciBoYW5kbGVyCisgKiBccGFyYW1baW5dICAgZGF0YSAgICBEYXRhIHRvIGJlIHBhc3NlZCB0byB0aGUgaGFuZGxlcgorICogXHJldHVybnMgMCBpZiBPSyBvciBlcnJvciA8IDAKKyAqLworYmNtb3NfZXJybm8gYmNtb3Nfc3lzX3RpbWVyX2NyZWF0ZShiY21vc19zeXNfdGltZXIgKnRpbWVyLCBiY21vc19zeXNfdGltZXJfaGFuZGxlciBoYW5kbGVyLCB2b2lkICpkYXRhKTsKKworLyogRGVzdHJveSBzeXN0ZW0gdGltZXIKKyAqIFxwYXJhbVtpbl0gICB0aW1lciAgIFN5c3RlbSB0aW1lcgorICovCit2b2lkIGJjbW9zX3N5c190aW1lcl9kZXN0cm95KGJjbW9zX3N5c190aW1lciAqdGltZXIpOworCisvKiBTdGFydCBzeXN0ZW0gdGltZXIKKyAqIFxwYXJhbVtpbl0gICB0aW1lciAgICAgICAgICAgU3lzdGVtIHRpbWVyCisgKiBccGFyYW1baW5dICAgaW50ZXJ2YWwgICAgICAgIEludGVydmFsICh1cykKKyAqLwordm9pZCBiY21vc19zeXNfdGltZXJfc3RhcnQoYmNtb3Nfc3lzX3RpbWVyICp0aW1lciwgdWludDMyX3QgaW50ZXJ2YWwpOworCisvKiBTdG9wIHN5c3RlbSB0aW1lcgorICogXHBhcmFtW2luXSAgIHRpbWVyICAgICAgICAgICBTeXN0ZW0gdGltZXIKKyAqLwordm9pZCBiY21vc19zeXNfdGltZXJfc3RvcChiY21vc19zeXNfdGltZXIgKnRpbWVyKTsKKworI2VuZGlmIC8qIEJDTU9TX1NZU0lGX0hfICovCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2JjbW9zX3RyZWUuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vYmNtb3NfdHJlZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjgyZDkxNjQKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2JjbW9zX3RyZWUuaApAQCAtMCwwICsxLDc2NSBAQAorLyoJJE5ldEJTRDogdHJlZS5oLHYgMS44IDIwMDQvMDMvMjggMTk6Mzg6MzAgcHJvdm9zIEV4cCAkCSovCisvKgkkT3BlbkJTRDogdHJlZS5oLHYgMS43IDIwMDIvMTAvMTcgMjE6NTE6NTQgYXJ0IEV4cCAkCSovCisvKiAkRnJlZUJTRCQgKi8KKworLyotCisgKiBDb3B5cmlnaHQgMjAwMiBOaWVscyBQcm92b3MgPHByb3Zvc0BjaXRpLnVtaWNoLmVkdT4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYJX0JDTU9TX1RSRUVfSF8KKyNkZWZpbmUJX0JDTU9TX1RSRUVfSF8KKworLyoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIGRhdGEgc3RydWN0dXJlcyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIHRyZWVzOgorICogc3BsYXkgdHJlZXMgYW5kIHJlZC1ibGFjayB0cmVlcy4KKyAqCisgKiBBIHNwbGF5IHRyZWUgaXMgYSBzZWxmLW9yZ2FuaXppbmcgZGF0YSBzdHJ1Y3R1cmUuICBFdmVyeSBvcGVyYXRpb24KKyAqIG9uIHRoZSB0cmVlIGNhdXNlcyBhIHNwbGF5IHRvIGhhcHBlbi4gIFRoZSBzcGxheSBtb3ZlcyB0aGUgcmVxdWVzdGVkCisgKiBub2RlIHRvIHRoZSByb290IG9mIHRoZSB0cmVlIGFuZCBwYXJ0bHkgcmViYWxhbmNlcyBpdC4KKyAqCisgKiBUaGlzIGhhcyB0aGUgYmVuZWZpdCB0aGF0IHJlcXVlc3QgbG9jYWxpdHkgY2F1c2VzIGZhc3RlciBsb29rdXBzIGFzCisgKiB0aGUgcmVxdWVzdGVkIG5vZGVzIG1vdmUgdG8gdGhlIHRvcCBvZiB0aGUgdHJlZS4gIE9uIHRoZSBvdGhlciBoYW5kLAorICogZXZlcnkgbG9va3VwIGNhdXNlcyBtZW1vcnkgd3JpdGVzLgorICoKKyAqIFRoZSBCYWxhbmNlIFRoZW9yZW0gYm91bmRzIHRoZSB0b3RhbCBhY2Nlc3MgdGltZSBmb3IgbSBvcGVyYXRpb25zCisgKiBhbmQgbiBpbnNlcnRzIG9uIGFuIGluaXRpYWxseSBlbXB0eSB0cmVlIGFzIE8oKG0gKyBuKWxnIG4pLiAgVGhlCisgKiBhbW9ydGl6ZWQgY29zdCBmb3IgYSBzZXF1ZW5jZSBvZiBtIGFjY2Vzc2VzIHRvIGEgc3BsYXkgdHJlZSBpcyBPKGxnIG4pOworICoKKyAqIEEgcmVkLWJsYWNrIHRyZWUgaXMgYSBiaW5hcnkgc2VhcmNoIHRyZWUgd2l0aCB0aGUgbm9kZSBjb2xvciBhcyBhbgorICogZXh0cmEgYXR0cmlidXRlLiAgSXQgZnVsZmlsbHMgYSBzZXQgb2YgY29uZGl0aW9uczoKKyAqCS0gZXZlcnkgc2VhcmNoIHBhdGggZnJvbSB0aGUgcm9vdCB0byBhIGxlYWYgY29uc2lzdHMgb2YgdGhlCisgKgkgIHNhbWUgbnVtYmVyIG9mIGJsYWNrIG5vZGVzLAorICoJLSBlYWNoIHJlZCBub2RlIChleGNlcHQgZm9yIHRoZSByb290KSBoYXMgYSBibGFjayBwYXJlbnQsCisgKgktIGVhY2ggbGVhZiBub2RlIGlzIGJsYWNrLgorICoKKyAqIEV2ZXJ5IG9wZXJhdGlvbiBvbiBhIHJlZC1ibGFjayB0cmVlIGlzIGJvdW5kZWQgYXMgTyhsZyBuKS4KKyAqIFRoZSBtYXhpbXVtIGhlaWdodCBvZiBhIHJlZC1ibGFjayB0cmVlIGlzIDJsZyAobisxKS4KKyAqLworCisjZGVmaW5lIFNQTEFZX0hFQUQobmFtZSwgdHlwZSkJCQkJCQlcCitzdHJ1Y3QgbmFtZSB7CQkJCQkJCQlcCisJdHlwZSAqc3BoX3Jvb3Q7IC8qIHJvb3Qgb2YgdGhlIHRyZWUgKi8JCQkgICAgICAgIFwKK30KKworI2RlZmluZSBTUExBWV9JTklUSUFMSVpFUihyb290KQkJCQkJCVwKKwl7IE5VTEwgfQorCisjZGVmaW5lIFNQTEFZX0lOSVQocm9vdCkgZG8gewkJCQkJCVwKKwkocm9vdCktPnNwaF9yb290ID0gTlVMTDsJCQkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8gMCkKKworI2RlZmluZSBTUExBWV9FTlRSWSh0eXBlKQkJCQkJCVwKK3N0cnVjdCB7CQkJCQkJCQlcCisJdHlwZSAqc3BlX2xlZnQ7IC8qIGxlZnQgZWxlbWVudCAqLwkJCSAgICAgICAgXAorCXR5cGUgKnNwZV9yaWdodDsgLyogcmlnaHQgZWxlbWVudCAqLwkJCSAgICAgICAgXAorfQorCisjZGVmaW5lIFNQTEFZX0xFRlQoZWxtLCBmaWVsZCkJCShlbG0pLT5maWVsZC5zcGVfbGVmdAorI2RlZmluZSBTUExBWV9SSUdIVChlbG0sIGZpZWxkKQkJKGVsbSktPmZpZWxkLnNwZV9yaWdodAorI2RlZmluZSBTUExBWV9ST09UKGhlYWQpCQkoaGVhZCktPnNwaF9yb290CisjZGVmaW5lIFNQTEFZX0VNUFRZKGhlYWQpCQkoU1BMQVlfUk9PVChoZWFkKSA9PSBOVUxMKQorCisvKiBTUExBWV9ST1RBVEVfe0xFRlQsUklHSFR9IGV4cGVjdCB0aGF0IHRtcCBob2xkIFNQTEFZX3tSSUdIVCxMRUZUfSAqLworI2RlZmluZSBTUExBWV9ST1RBVEVfUklHSFQoaGVhZCwgdG1wLCBmaWVsZCkgZG8gewkJCVwKKwlTUExBWV9MRUZUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKSA9IFNQTEFZX1JJR0hUKHRtcCwgZmllbGQpOwlcCisJU1BMQVlfUklHSFQodG1wLCBmaWVsZCkgPSAoaGVhZCktPnNwaF9yb290OwkJCVwKKwkoaGVhZCktPnNwaF9yb290ID0gdG1wOwkJCQkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8gMCkKKwkKKyNkZWZpbmUgU1BMQVlfUk9UQVRFX0xFRlQoaGVhZCwgdG1wLCBmaWVsZCkgZG8gewkJCVwKKwlTUExBWV9SSUdIVCgoaGVhZCktPnNwaF9yb290LCBmaWVsZCkgPSBTUExBWV9MRUZUKHRtcCwgZmllbGQpOwlcCisJU1BMQVlfTEVGVCh0bXAsIGZpZWxkKSA9IChoZWFkKS0+c3BoX3Jvb3Q7CQkJXAorCShoZWFkKS0+c3BoX3Jvb3QgPSB0bXA7CQkJCQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLyAwKQorCisjZGVmaW5lIFNQTEFZX0xJTktMRUZUKGhlYWQsIHRtcCwgZmllbGQpIGRvIHsJCQkJXAorCVNQTEFZX0xFRlQodG1wLCBmaWVsZCkgPSAoaGVhZCktPnNwaF9yb290OwkJCVwKKwl0bXAgPSAoaGVhZCktPnNwaF9yb290OwkJCQkJCVwKKwkoaGVhZCktPnNwaF9yb290ID0gU1BMQVlfTEVGVCgoaGVhZCktPnNwaF9yb290LCBmaWVsZCk7CQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovIDApCisKKyNkZWZpbmUgU1BMQVlfTElOS1JJR0hUKGhlYWQsIHRtcCwgZmllbGQpIGRvIHsJCQkJXAorCVNQTEFZX1JJR0hUKHRtcCwgZmllbGQpID0gKGhlYWQpLT5zcGhfcm9vdDsJCQlcCisJdG1wID0gKGhlYWQpLT5zcGhfcm9vdDsJCQkJCQlcCisJKGhlYWQpLT5zcGhfcm9vdCA9IFNQTEFZX1JJR0hUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKTsJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLyAwKQorCisjZGVmaW5lIFNQTEFZX0FTU0VNQkxFKGhlYWQsIG5vZGUsIGxlZnQsIHJpZ2h0LCBmaWVsZCkgZG8gewkJXAorCVNQTEFZX1JJR0hUKGxlZnQsIGZpZWxkKSA9IFNQTEFZX0xFRlQoKGhlYWQpLT5zcGhfcm9vdCwgZmllbGQpOwlcCisJU1BMQVlfTEVGVChyaWdodCwgZmllbGQpID0gU1BMQVlfUklHSFQoKGhlYWQpLT5zcGhfcm9vdCwgZmllbGQpO1wKKwlTUExBWV9MRUZUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKSA9IFNQTEFZX1JJR0hUKG5vZGUsIGZpZWxkKTsJXAorCVNQTEFZX1JJR0hUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKSA9IFNQTEFZX0xFRlQobm9kZSwgZmllbGQpOwlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovIDApCisKKy8qIEdlbmVyYXRlcyBwcm90b3R5cGVzIGFuZCBpbmxpbmUgZnVuY3Rpb25zICovCisKKyNkZWZpbmUgU1BMQVlfUFJPVE9UWVBFKG5hbWUsIHR5cGUsIGZpZWxkLCBjbXApCQkJCVwKK3ZvaWQgbmFtZSMjX1NQTEFZKHN0cnVjdCBuYW1lICosIHR5cGUgKik7CQkJICAgICAgICBcCit2b2lkIG5hbWUjI19TUExBWV9NSU5NQVgoc3RydWN0IG5hbWUgKiwgaW50KTsJCQkJXAordHlwZSAqbmFtZSMjX1NQTEFZX0lOU0VSVChzdHJ1Y3QgbmFtZSAqLCB0eXBlICopOwkJICAgICAgICBcCit0eXBlICpuYW1lIyNfU1BMQVlfUkVNT1ZFKHN0cnVjdCBuYW1lICosIHR5cGUgKik7CQkgICAgICAgIFwKKwkJCQkJCQkJCVwKKy8qIEZpbmRzIHRoZSBub2RlIHdpdGggdGhlIHNhbWUga2V5IGFzIGVsbSAqLwkJCQlcCitzdGF0aWMgX19pbmxpbmUgdHlwZSAqCQkJCQkJICAgICAgICBcCituYW1lIyNfU1BMQVlfRklORChzdHJ1Y3QgbmFtZSAqaGVhZCwgdHlwZSAqZWxtKQkJCSAgICAgICAgXAorewkJCQkJCQkJCVwKKwlpZiAoU1BMQVlfRU1QVFkoaGVhZCkpCQkJCQkJXAorCQlyZXR1cm4oTlVMTCk7CQkJCQkJXAorCW5hbWUjI19TUExBWShoZWFkLCBlbG0pOwkJCQkJXAorCWlmICgoY21wKShlbG0sIChoZWFkKS0+c3BoX3Jvb3QpID09IDApCQkJCVwKKwkJcmV0dXJuIChoZWFkLT5zcGhfcm9vdCk7CQkJCVwKKwlyZXR1cm4gKE5VTEwpOwkJCQkJCQlcCit9CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorc3RhdGljIF9faW5saW5lIHR5cGUgKgkJCQkJCSAgICAgICAgXAorbmFtZSMjX1NQTEFZX05FWFQoc3RydWN0IG5hbWUgKmhlYWQsIHR5cGUgKmVsbSkJCQkgICAgICAgIFwKK3sJCQkJCQkJCQlcCisJbmFtZSMjX1NQTEFZKGhlYWQsIGVsbSk7CQkJCQlcCisJaWYgKFNQTEFZX1JJR0hUKGVsbSwgZmllbGQpICE9IE5VTEwpIHsJCQkJXAorCQllbG0gPSBTUExBWV9SSUdIVChlbG0sIGZpZWxkKTsJCQkJXAorCQl3aGlsZSAoU1BMQVlfTEVGVChlbG0sIGZpZWxkKSAhPSBOVUxMKSB7CQlcCisJCQllbG0gPSBTUExBWV9MRUZUKGVsbSwgZmllbGQpOwkJCVwKKwkJfQkJCQkJCQlcCisJfSBlbHNlCQkJCQkJCQlcCisJCWVsbSA9IE5VTEw7CQkJCQkJXAorCXJldHVybiAoZWxtKTsJCQkJCQkJXAorfQkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKK3N0YXRpYyBfX2lubGluZSB0eXBlICoJCQkJCQkgICAgICAgIFwKK25hbWUjI19TUExBWV9NSU5fTUFYKHN0cnVjdCBuYW1lICpoZWFkLCBpbnQgdmFsKQkJCVwKK3sJCQkJCQkJCQlcCisJbmFtZSMjX1NQTEFZX01JTk1BWChoZWFkLCB2YWwpOwkJCQkJXAorICAgICAgICByZXR1cm4gKFNQTEFZX1JPT1QoaGVhZCkpOwkJCQkJXAorfQorCisvKiBNYWluIHNwbGF5IG9wZXJhdGlvbi4KKyAqIE1vdmVzIG5vZGUgY2xvc2UgdG8gdGhlIGtleSBvZiBlbG0gdG8gdG9wCisgKi8KKyNkZWZpbmUgU1BMQVlfR0VORVJBVEUobmFtZSwgdHlwZSwgZmllbGQsIGNtcCkJCQkJXAordHlwZSAqCQkJCQkJCQkgICAgICAgIFwKK25hbWUjI19TUExBWV9JTlNFUlQoc3RydWN0IG5hbWUgKmhlYWQsIHR5cGUgKmVsbSkJCSAgICAgICAgXAorewkJCQkJCQkJCVwKKyAgICBpZiAoU1BMQVlfRU1QVFkoaGVhZCkpIHsJCQkJCQlcCisJICAgIFNQTEFZX0xFRlQoZWxtLCBmaWVsZCkgPSBTUExBWV9SSUdIVChlbG0sIGZpZWxkKSA9IE5VTEw7CVwKKyAgICB9IGVsc2UgewkJCQkJCQkJXAorCSAgICBpbnQgX19jb21wOwkJCQkJCQlcCisJICAgIG5hbWUjI19TUExBWShoZWFkLCBlbG0pOwkJCQkJXAorCSAgICBfX2NvbXAgPSAoY21wKShlbG0sIChoZWFkKS0+c3BoX3Jvb3QpOwkJCVwKKwkgICAgaWYoX19jb21wIDwgMCkgewkJCQkJCVwKKwkJICAgIFNQTEFZX0xFRlQoZWxtLCBmaWVsZCkgPSBTUExBWV9MRUZUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKTtcCisJCSAgICBTUExBWV9SSUdIVChlbG0sIGZpZWxkKSA9IChoZWFkKS0+c3BoX3Jvb3Q7CQlcCisJCSAgICBTUExBWV9MRUZUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKSA9IE5VTEw7CQlcCisJICAgIH0gZWxzZSBpZiAoX19jb21wID4gMCkgewkJCQkJXAorCQkgICAgU1BMQVlfUklHSFQoZWxtLCBmaWVsZCkgPSBTUExBWV9SSUdIVCgoaGVhZCktPnNwaF9yb290LCBmaWVsZCk7XAorCQkgICAgU1BMQVlfTEVGVChlbG0sIGZpZWxkKSA9IChoZWFkKS0+c3BoX3Jvb3Q7CQlcCisJCSAgICBTUExBWV9SSUdIVCgoaGVhZCktPnNwaF9yb290LCBmaWVsZCkgPSBOVUxMOwlcCisJICAgIH0gZWxzZQkJCQkJCQlcCisJCSAgICByZXR1cm4gKChoZWFkKS0+c3BoX3Jvb3QpOwkJCQlcCisgICAgfQkJCQkJCQkJCVwKKyAgICAoaGVhZCktPnNwaF9yb290ID0gKGVsbSk7CQkJCQkJXAorICAgIHJldHVybiAoTlVMTCk7CQkJCQkJCVwKK30JCQkJCQkJCQlcCisJCQkJCQkJCQlcCit0eXBlICoJCQkJCQkJCSAgICAgICAgXAorbmFtZSMjX1NQTEFZX1JFTU9WRShzdHJ1Y3QgbmFtZSAqaGVhZCwgdHlwZSAqZWxtKQkJICAgICAgICBcCit7CQkJCQkJCQkJXAorCXR5cGUgKl9fdG1wOwkJCQkJCSAgICAgICAgXAorCWlmIChTUExBWV9FTVBUWShoZWFkKSkJCQkJCQlcCisJCXJldHVybiAoTlVMTCk7CQkJCQkJXAorCW5hbWUjI19TUExBWShoZWFkLCBlbG0pOwkJCQkJXAorCWlmICgoY21wKShlbG0sIChoZWFkKS0+c3BoX3Jvb3QpID09IDApIHsJCQlcCisJCWlmIChTUExBWV9MRUZUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKSA9PSBOVUxMKSB7CVwKKwkJCShoZWFkKS0+c3BoX3Jvb3QgPSBTUExBWV9SSUdIVCgoaGVhZCktPnNwaF9yb290LCBmaWVsZCk7XAorCQl9IGVsc2UgewkJCQkJCVwKKwkJCV9fdG1wID0gU1BMQVlfUklHSFQoKGhlYWQpLT5zcGhfcm9vdCwgZmllbGQpOwlcCisJCQkoaGVhZCktPnNwaF9yb290ID0gU1BMQVlfTEVGVCgoaGVhZCktPnNwaF9yb290LCBmaWVsZCk7XAorCQkJbmFtZSMjX1NQTEFZKGhlYWQsIGVsbSk7CQkJXAorCQkJU1BMQVlfUklHSFQoKGhlYWQpLT5zcGhfcm9vdCwgZmllbGQpID0gX190bXA7CVwKKwkJfQkJCQkJCQlcCisJCXJldHVybiAoZWxtKTsJCQkJCQlcCisJfQkJCQkJCQkJXAorCXJldHVybiAoTlVMTCk7CQkJCQkJCVwKK30JCQkJCQkJCQlcCisJCQkJCQkJCQlcCit2b2lkCQkJCQkJCQkJXAorbmFtZSMjX1NQTEFZKHN0cnVjdCBuYW1lICpoZWFkLCB0eXBlICplbG0pCQkJICAgICAgICBcCit7CQkJCQkJCQkJXAorCXR5cGUgX19ub2RlLCAqX19sZWZ0LCAqX19yaWdodCwgKl9fdG1wOwkJCSAgICAgICAgXAorCWludCBfX2NvbXA7CQkJCQkJCVwKK1wKKwlTUExBWV9MRUZUKCZfX25vZGUsIGZpZWxkKSA9IFNQTEFZX1JJR0hUKCZfX25vZGUsIGZpZWxkKSA9IE5VTEw7XAorCV9fbGVmdCA9IF9fcmlnaHQgPSAmX19ub2RlOwkJCQkJXAorXAorCXdoaWxlICgoX19jb21wID0gKGNtcCkoZWxtLCAoaGVhZCktPnNwaF9yb290KSkgIT0gMCkgewkJXAorCQlpZiAoX19jb21wIDwgMCkgewkJCQkJXAorCQkJX190bXAgPSBTUExBWV9MRUZUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKTsJXAorCQkJaWYgKF9fdG1wID09IE5VTEwpCQkJCVwKKwkJCQlicmVhazsJCQkJCVwKKwkJCWlmICgoY21wKShlbG0sIF9fdG1wKSA8IDApewkJCVwKKwkJCQlTUExBWV9ST1RBVEVfUklHSFQoaGVhZCwgX190bXAsIGZpZWxkKTsJXAorCQkJCWlmIChTUExBWV9MRUZUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKSA9PSBOVUxMKVwKKwkJCQkJYnJlYWs7CQkJCVwKKwkJCX0JCQkJCQlcCisJCQlTUExBWV9MSU5LTEVGVChoZWFkLCBfX3JpZ2h0LCBmaWVsZCk7CQlcCisJCX0gZWxzZSBpZiAoX19jb21wID4gMCkgewkJCQlcCisJCQlfX3RtcCA9IFNQTEFZX1JJR0hUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKTsJXAorCQkJaWYgKF9fdG1wID09IE5VTEwpCQkJCVwKKwkJCQlicmVhazsJCQkJCVwKKwkJCWlmICgoY21wKShlbG0sIF9fdG1wKSA+IDApewkJCVwKKwkJCQlTUExBWV9ST1RBVEVfTEVGVChoZWFkLCBfX3RtcCwgZmllbGQpOwlcCisJCQkJaWYgKFNQTEFZX1JJR0hUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKSA9PSBOVUxMKVwKKwkJCQkJYnJlYWs7CQkJCVwKKwkJCX0JCQkJCQlcCisJCQlTUExBWV9MSU5LUklHSFQoaGVhZCwgX19sZWZ0LCBmaWVsZCk7CQlcCisJCX0JCQkJCQkJXAorCX0JCQkJCQkJCVwKKwlTUExBWV9BU1NFTUJMRShoZWFkLCAmX19ub2RlLCBfX2xlZnQsIF9fcmlnaHQsIGZpZWxkKTsJCVwKK30JCQkJCQkJCQlcCisJCQkJCQkJCQlcCisvKiBTcGxheSB3aXRoIGVpdGhlciB0aGUgbWluaW11bSBvciB0aGUgbWF4aW11bSBlbGVtZW50CQkJXAorICogVXNlZCB0byBmaW5kIG1pbmltdW0gb3IgbWF4aW11bSBlbGVtZW50IGluIHRyZWUuCQkJXAorICovCQkJCQkJCQkJXAordm9pZCBuYW1lIyNfU1BMQVlfTUlOTUFYKHN0cnVjdCBuYW1lICpoZWFkLCBpbnQgX19jb21wKSAgICAgICAgICAgICAgICAgXAorewkJCQkJCQkJCVwKKwl0eXBlIF9fbm9kZSwgKl9fbGVmdCwgKl9fcmlnaHQsICpfX3RtcDsJCQkgICAgICAgIFwKK1wKKwlTUExBWV9MRUZUKCZfX25vZGUsIGZpZWxkKSA9IFNQTEFZX1JJR0hUKCZfX25vZGUsIGZpZWxkKSA9IE5VTEw7XAorCV9fbGVmdCA9IF9fcmlnaHQgPSAmX19ub2RlOwkJCQkJXAorXAorCXdoaWxlICgxKSB7CQkJCQkJCVwKKwkJaWYgKF9fY29tcCA8IDApIHsJCQkJCVwKKwkJCV9fdG1wID0gU1BMQVlfTEVGVCgoaGVhZCktPnNwaF9yb290LCBmaWVsZCk7CVwKKwkJCWlmIChfX3RtcCA9PSBOVUxMKQkJCQlcCisJCQkJYnJlYWs7CQkJCQlcCisJCQlpZiAoX19jb21wIDwgMCl7CQkJCVwKKwkJCQlTUExBWV9ST1RBVEVfUklHSFQoaGVhZCwgX190bXAsIGZpZWxkKTsJXAorCQkJCWlmIChTUExBWV9MRUZUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKSA9PSBOVUxMKVwKKwkJCQkJYnJlYWs7CQkJCVwKKwkJCX0JCQkJCQlcCisJCQlTUExBWV9MSU5LTEVGVChoZWFkLCBfX3JpZ2h0LCBmaWVsZCk7CQlcCisJCX0gZWxzZSBpZiAoX19jb21wID4gMCkgewkJCQlcCisJCQlfX3RtcCA9IFNQTEFZX1JJR0hUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKTsJXAorCQkJaWYgKF9fdG1wID09IE5VTEwpCQkJCVwKKwkJCQlicmVhazsJCQkJCVwKKwkJCWlmIChfX2NvbXAgPiAwKSB7CQkJCVwKKwkJCQlTUExBWV9ST1RBVEVfTEVGVChoZWFkLCBfX3RtcCwgZmllbGQpOwlcCisJCQkJaWYgKFNQTEFZX1JJR0hUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKSA9PSBOVUxMKVwKKwkJCQkJYnJlYWs7CQkJCVwKKwkJCX0JCQkJCQlcCisJCQlTUExBWV9MSU5LUklHSFQoaGVhZCwgX19sZWZ0LCBmaWVsZCk7CQlcCisJCX0JCQkJCQkJXAorCX0JCQkJCQkJCVwKKwlTUExBWV9BU1NFTUJMRShoZWFkLCAmX19ub2RlLCBfX2xlZnQsIF9fcmlnaHQsIGZpZWxkKTsJCVwKK30KKworI2RlZmluZSBTUExBWV9ORUdJTkYJLTEKKyNkZWZpbmUgU1BMQVlfSU5GCTEKKworI2RlZmluZSBTUExBWV9JTlNFUlQobmFtZSwgeCwgeSkJbmFtZSMjX1NQTEFZX0lOU0VSVCh4LCB5KQorI2RlZmluZSBTUExBWV9SRU1PVkUobmFtZSwgeCwgeSkJbmFtZSMjX1NQTEFZX1JFTU9WRSh4LCB5KQorI2RlZmluZSBTUExBWV9GSU5EKG5hbWUsIHgsIHkpCQluYW1lIyNfU1BMQVlfRklORCh4LCB5KQorI2RlZmluZSBTUExBWV9ORVhUKG5hbWUsIHgsIHkpCQluYW1lIyNfU1BMQVlfTkVYVCh4LCB5KQorI2RlZmluZSBTUExBWV9NSU4obmFtZSwgeCkJCShTUExBWV9FTVBUWSh4KSA/IE5VTEwJXAorCQkJCQk6IG5hbWUjI19TUExBWV9NSU5fTUFYKHgsIFNQTEFZX05FR0lORikpCisjZGVmaW5lIFNQTEFZX01BWChuYW1lLCB4KQkJKFNQTEFZX0VNUFRZKHgpID8gTlVMTAlcCisJCQkJCTogbmFtZSMjX1NQTEFZX01JTl9NQVgoeCwgU1BMQVlfSU5GKSkKKworI2RlZmluZSBTUExBWV9GT1JFQUNIKHgsIG5hbWUsIGhlYWQpCQkJCQlcCisJZm9yICgoeCkgPSBTUExBWV9NSU4obmFtZSwgaGVhZCk7CQkJCVwKKwkgICAgICh4KSAhPSBOVUxMOwkJCQkJCVwKKwkgICAgICh4KSA9IFNQTEFZX05FWFQobmFtZSwgaGVhZCwgeCkpCisKKy8qIE1hY3JvcyB0aGF0IGRlZmluZSBhIHJlZC1ibGFjayB0cmVlICovCisjZGVmaW5lIFJCX0hFQUQobmFtZSwgdHlwZSkJCQkJCQlcCitzdHJ1Y3QgbmFtZSB7CQkJCQkJCQlcCisJdHlwZSAqcmJoX3Jvb3Q7IC8qIHJvb3Qgb2YgdGhlIHRyZWUgKi8JCQkgICAgICAgIFwKK30KKworI2RlZmluZSBSQl9JTklUSUFMSVpFUihyb290KQkJCQkJCVwKKwl7IE5VTEwgfQorCisjZGVmaW5lIFJCX0lOSVQocm9vdCkgZG8gewkJCQkJCVwKKwkocm9vdCktPnJiaF9yb290ID0gTlVMTDsJCQkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8gMCkKKworI2RlZmluZSBSQl9CTEFDSwkwCisjZGVmaW5lIFJCX1JFRAkJMQorI2RlZmluZSBSQl9FTlRSWSh0eXBlKQkJCQkJCQlcCitzdHJ1Y3QgewkJCQkJCQkJXAorCXR5cGUgKnJiZV9sZWZ0OwkJLyogbGVmdCBlbGVtZW50ICovCQkgICAgICAgIFwKKwl0eXBlICpyYmVfcmlnaHQ7CQkvKiByaWdodCBlbGVtZW50ICovCQlcCisJdHlwZSAqcmJlX3BhcmVudDsJLyogcGFyZW50IGVsZW1lbnQgKi8JCSAgICAgICAgXAorCWludCByYmVfY29sb3I7CQkJLyogbm9kZSBjb2xvciAqLwkJXAorfQorCisjZGVmaW5lIFJCX0xFRlQoZWxtLCBmaWVsZCkJCShlbG0pLT5maWVsZC5yYmVfbGVmdAorI2RlZmluZSBSQl9SSUdIVChlbG0sIGZpZWxkKQkJKGVsbSktPmZpZWxkLnJiZV9yaWdodAorI2RlZmluZSBSQl9QQVJFTlQoZWxtLCBmaWVsZCkJCShlbG0pLT5maWVsZC5yYmVfcGFyZW50CisjZGVmaW5lIFJCX0NPTE9SKGVsbSwgZmllbGQpCQkoZWxtKS0+ZmllbGQucmJlX2NvbG9yCisjZGVmaW5lIFJCX1JPT1RfTk9ERShoZWFkKQkJKGhlYWQpLT5yYmhfcm9vdAorI2RlZmluZSBSQl9FTVBUWShoZWFkKQkJCShSQl9ST09UX05PREUoaGVhZCkgPT0gTlVMTCkKKworI2RlZmluZSBSQl9TRVQoZWxtLCBwYXJlbnQsIGZpZWxkKSBkbyB7CQkJCQlcCisJUkJfUEFSRU5UKGVsbSwgZmllbGQpID0gcGFyZW50OwkJCQkJXAorCVJCX0xFRlQoZWxtLCBmaWVsZCkgPSBSQl9SSUdIVChlbG0sIGZpZWxkKSA9IE5VTEw7CQlcCisJUkJfQ09MT1IoZWxtLCBmaWVsZCkgPSBSQl9SRUQ7CQkJCQlcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovIDApCisKKyNkZWZpbmUgUkJfU0VUX0JMQUNLUkVEKGJsYWNrLCByZWQsIGZpZWxkKSBkbyB7CQkJCVwKKwlSQl9DT0xPUihibGFjaywgZmllbGQpID0gUkJfQkxBQ0s7CQkJCVwKKwlSQl9DT0xPUihyZWQsIGZpZWxkKSA9IFJCX1JFRDsJCQkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8gMCkKKworI2lmbmRlZiBSQl9BVUdNRU5UCisjZGVmaW5lIFJCX0FVR01FTlQoeCkJZG8ge30gd2hpbGUgKDApCisjZW5kaWYKKworI2RlZmluZSBSQl9ST1RBVEVfTEVGVChoZWFkLCBlbG0sIHRtcCwgZmllbGQpIGRvIHsJCQlcCisJKHRtcCkgPSBSQl9SSUdIVChlbG0sIGZpZWxkKTsJCQkJCVwKKwlpZiAoKFJCX1JJR0hUKGVsbSwgZmllbGQpID0gUkJfTEVGVCh0bXAsIGZpZWxkKSkgIT0gTlVMTCkgewlcCisJCVJCX1BBUkVOVChSQl9MRUZUKHRtcCwgZmllbGQpLCBmaWVsZCkgPSAoZWxtKTsJCVwKKwl9CQkJCQkJCQlcCisJUkJfQVVHTUVOVChlbG0pOwkJCQkJCVwKKwlpZiAoKFJCX1BBUkVOVCh0bXAsIGZpZWxkKSA9IFJCX1BBUkVOVChlbG0sIGZpZWxkKSkgIT0gTlVMTCkgewlcCisJCWlmICgoZWxtKSA9PSBSQl9MRUZUKFJCX1BBUkVOVChlbG0sIGZpZWxkKSwgZmllbGQpKQlcCisJCQlSQl9MRUZUKFJCX1BBUkVOVChlbG0sIGZpZWxkKSwgZmllbGQpID0gKHRtcCk7CVwKKwkJZWxzZQkJCQkJCQlcCisJCQlSQl9SSUdIVChSQl9QQVJFTlQoZWxtLCBmaWVsZCksIGZpZWxkKSA9ICh0bXApOwlcCisJfSBlbHNlCQkJCQkJCQlcCisJCShoZWFkKS0+cmJoX3Jvb3QgPSAodG1wKTsJCQkJXAorCVJCX0xFRlQodG1wLCBmaWVsZCkgPSAoZWxtKTsJCQkJCVwKKwlSQl9QQVJFTlQoZWxtLCBmaWVsZCkgPSAodG1wKTsJCQkJCVwKKwlSQl9BVUdNRU5UKHRtcCk7CQkJCQkJXAorCWlmICgoUkJfUEFSRU5UKHRtcCwgZmllbGQpKSkJCQkJCVwKKwkJUkJfQVVHTUVOVChSQl9QQVJFTlQodG1wLCBmaWVsZCkpOwkJCVwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8gMCkKKworI2RlZmluZSBSQl9ST1RBVEVfUklHSFQoaGVhZCwgZWxtLCB0bXAsIGZpZWxkKSBkbyB7CQkJXAorCSh0bXApID0gUkJfTEVGVChlbG0sIGZpZWxkKTsJCQkJCVwKKwlpZiAoKFJCX0xFRlQoZWxtLCBmaWVsZCkgPSBSQl9SSUdIVCh0bXAsIGZpZWxkKSkgIT0gTlVMTCkgewlcCisJCVJCX1BBUkVOVChSQl9SSUdIVCh0bXAsIGZpZWxkKSwgZmllbGQpID0gKGVsbSk7CQlcCisJfQkJCQkJCQkJXAorCVJCX0FVR01FTlQoZWxtKTsJCQkJCQlcCisJaWYgKChSQl9QQVJFTlQodG1wLCBmaWVsZCkgPSBSQl9QQVJFTlQoZWxtLCBmaWVsZCkpICE9IE5VTEwpIHsJXAorCQlpZiAoKGVsbSkgPT0gUkJfTEVGVChSQl9QQVJFTlQoZWxtLCBmaWVsZCksIGZpZWxkKSkJXAorCQkJUkJfTEVGVChSQl9QQVJFTlQoZWxtLCBmaWVsZCksIGZpZWxkKSA9ICh0bXApOwlcCisJCWVsc2UJCQkJCQkJXAorCQkJUkJfUklHSFQoUkJfUEFSRU5UKGVsbSwgZmllbGQpLCBmaWVsZCkgPSAodG1wKTsJXAorCX0gZWxzZQkJCQkJCQkJXAorCQkoaGVhZCktPnJiaF9yb290ID0gKHRtcCk7CQkJCVwKKwlSQl9SSUdIVCh0bXAsIGZpZWxkKSA9IChlbG0pOwkJCQkJXAorCVJCX1BBUkVOVChlbG0sIGZpZWxkKSA9ICh0bXApOwkJCQkJXAorCVJCX0FVR01FTlQodG1wKTsJCQkJCQlcCisJaWYgKChSQl9QQVJFTlQodG1wLCBmaWVsZCkpKQkJCQkJXAorCQlSQl9BVUdNRU5UKFJCX1BBUkVOVCh0bXAsIGZpZWxkKSk7CQkJXAorfSB3aGlsZSAoLypDT05TVENPTkQqLyAwKQorCisvKiBHZW5lcmF0ZXMgcHJvdG90eXBlcyBhbmQgaW5saW5lIGZ1bmN0aW9ucyAqLworI2RlZmluZQlSQl9QUk9UT1RZUEUobmFtZSwgdHlwZSwgZmllbGQsIGNtcCkJCQkJXAorCVJCX1BST1RPVFlQRV9JTlRFUk5BTChuYW1lLCB0eXBlLCBmaWVsZCwgY21wLCkKKyNkZWZpbmUJUkJfUFJPVE9UWVBFX1NUQVRJQyhuYW1lLCB0eXBlLCBmaWVsZCwgY21wKQkJCVwKKwlSQl9QUk9UT1RZUEVfSU5URVJOQUwobmFtZSwgdHlwZSwgZmllbGQsIGNtcCwgX191bnVzZWQgc3RhdGljKQorI2RlZmluZSBSQl9QUk9UT1RZUEVfSU5URVJOQUwobmFtZSwgdHlwZSwgZmllbGQsIGNtcCwgYXR0cikJCVwKK2F0dHIgdm9pZCBuYW1lIyNfUkJfSU5TRVJUX0NPTE9SKHN0cnVjdCBuYW1lICosIHR5cGUgKik7CQlcCithdHRyIHZvaWQgbmFtZSMjX1JCX1JFTU9WRV9DT0xPUihzdHJ1Y3QgbmFtZSAqLCB0eXBlICosIHR5cGUgKik7ICAgICAgICBcCithdHRyIHR5cGUgKm5hbWUjI19SQl9SRU1PVkUoc3RydWN0IG5hbWUgKiwgdHlwZSAqKTsJICAgICAgICAgICAgICAgIFwKK2F0dHIgdHlwZSAqbmFtZSMjX1JCX0lOU0VSVChzdHJ1Y3QgbmFtZSAqLCB0eXBlICopOwkgICAgICAgICAgICAgICAgXAorYXR0ciB0eXBlICpuYW1lIyNfUkJfRklORChzdHJ1Y3QgbmFtZSAqLCB0eXBlICopOwkJICAgICAgICBcCithdHRyIHR5cGUgKm5hbWUjI19SQl9ORklORChzdHJ1Y3QgbmFtZSAqLCB0eXBlICopOwkgICAgICAgICAgICAgICAgXAorYXR0ciB0eXBlICpuYW1lIyNfUkJfTkVYVCh0eXBlICopOwkJCSAgICAgICAgICAgICAgICBcCithdHRyIHR5cGUgKm5hbWUjI19SQl9QUkVWKHR5cGUgKik7CQkJICAgICAgICAgICAgICAgIFwKK2F0dHIgdHlwZSAqbmFtZSMjX1JCX01JTk1BWChzdHJ1Y3QgbmFtZSAqLCBpbnQpOwkJCVwKKwkJCQkJCQkJCVwKKworLyogTWFpbiByYiBvcGVyYXRpb24uCisgKiBNb3ZlcyBub2RlIGNsb3NlIHRvIHRoZSBrZXkgb2YgZWxtIHRvIHRvcAorICovCisjZGVmaW5lCVJCX0dFTkVSQVRFKG5hbWUsIHR5cGUsIGZpZWxkLCBjbXApCQkJCVwKKwlSQl9HRU5FUkFURV9JTlRFUk5BTChuYW1lLCB0eXBlLCBmaWVsZCwgY21wLCkKKyNkZWZpbmUJUkJfR0VORVJBVEVfU1RBVElDKG5hbWUsIHR5cGUsIGZpZWxkLCBjbXApCQkJXAorCVJCX0dFTkVSQVRFX0lOVEVSTkFMKG5hbWUsIHR5cGUsIGZpZWxkLCBjbXAsIF9fdW51c2VkIHN0YXRpYykKKyNkZWZpbmUgUkJfR0VORVJBVEVfSU5MSU5FKG5hbWUsIHR5cGUsIGZpZWxkLCBjbXApICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUkJfR0VORVJBVEVfSU5URVJOQUwobmFtZSwgdHlwZSwgZmllbGQsIGNtcCwgc3RhdGljIGlubGluZSkKKyNkZWZpbmUgUkJfR0VORVJBVEVfSU5URVJOQUwobmFtZSwgdHlwZSwgZmllbGQsIGNtcCwgYXR0cikJCVwKK2F0dHIgdm9pZAkJCQkJCQkJXAorbmFtZSMjX1JCX0lOU0VSVF9DT0xPUihzdHJ1Y3QgbmFtZSAqaGVhZCwgdHlwZSAqZWxtKQkJICAgICAgICBcCit7CQkJCQkJCQkJXAorCXR5cGUgKnBhcmVudCwgKmdwYXJlbnQsICp0bXA7CQkJCSAgICAgICAgXAorCXdoaWxlICgocGFyZW50ID0gUkJfUEFSRU5UKGVsbSwgZmllbGQpKSAhPSBOVUxMICYmCQlcCisJICAgIFJCX0NPTE9SKHBhcmVudCwgZmllbGQpID09IFJCX1JFRCkgewkJCVwKKwkJZ3BhcmVudCA9IFJCX1BBUkVOVChwYXJlbnQsIGZpZWxkKTsJCQlcCisJCWlmIChwYXJlbnQgPT0gUkJfTEVGVChncGFyZW50LCBmaWVsZCkpIHsJCVwKKwkJCXRtcCA9IFJCX1JJR0hUKGdwYXJlbnQsIGZpZWxkKTsJCQlcCisJCQlpZiAodG1wICYmIFJCX0NPTE9SKHRtcCwgZmllbGQpID09IFJCX1JFRCkgewlcCisJCQkJUkJfQ09MT1IodG1wLCBmaWVsZCkgPSBSQl9CTEFDSzsJXAorCQkJCVJCX1NFVF9CTEFDS1JFRChwYXJlbnQsIGdwYXJlbnQsIGZpZWxkKTtcCisJCQkJZWxtID0gZ3BhcmVudDsJCQkJXAorCQkJCWNvbnRpbnVlOwkJCQlcCisJCQl9CQkJCQkJXAorCQkJaWYgKFJCX1JJR0hUKHBhcmVudCwgZmllbGQpID09IGVsbSkgewkJXAorCQkJCVJCX1JPVEFURV9MRUZUKGhlYWQsIHBhcmVudCwgdG1wLCBmaWVsZCk7XAorCQkJCXRtcCA9IHBhcmVudDsJCQkJXAorCQkJCXBhcmVudCA9IGVsbTsJCQkJXAorCQkJCWVsbSA9IHRtcDsJCQkJXAorCQkJfQkJCQkJCVwKKwkJCVJCX1NFVF9CTEFDS1JFRChwYXJlbnQsIGdwYXJlbnQsIGZpZWxkKTsJXAorCQkJUkJfUk9UQVRFX1JJR0hUKGhlYWQsIGdwYXJlbnQsIHRtcCwgZmllbGQpOwlcCisJCX0gZWxzZSB7CQkJCQkJXAorCQkJdG1wID0gUkJfTEVGVChncGFyZW50LCBmaWVsZCk7CQkJXAorCQkJaWYgKHRtcCAmJiBSQl9DT0xPUih0bXAsIGZpZWxkKSA9PSBSQl9SRUQpIHsJXAorCQkJCVJCX0NPTE9SKHRtcCwgZmllbGQpID0gUkJfQkxBQ0s7CVwKKwkJCQlSQl9TRVRfQkxBQ0tSRUQocGFyZW50LCBncGFyZW50LCBmaWVsZCk7XAorCQkJCWVsbSA9IGdwYXJlbnQ7CQkJCVwKKwkJCQljb250aW51ZTsJCQkJXAorCQkJfQkJCQkJCVwKKwkJCWlmIChSQl9MRUZUKHBhcmVudCwgZmllbGQpID09IGVsbSkgewkJXAorCQkJCVJCX1JPVEFURV9SSUdIVChoZWFkLCBwYXJlbnQsIHRtcCwgZmllbGQpO1wKKwkJCQl0bXAgPSBwYXJlbnQ7CQkJCVwKKwkJCQlwYXJlbnQgPSBlbG07CQkJCVwKKwkJCQllbG0gPSB0bXA7CQkJCVwKKwkJCX0JCQkJCQlcCisJCQlSQl9TRVRfQkxBQ0tSRUQocGFyZW50LCBncGFyZW50LCBmaWVsZCk7CVwKKwkJCVJCX1JPVEFURV9MRUZUKGhlYWQsIGdwYXJlbnQsIHRtcCwgZmllbGQpOwlcCisJCX0JCQkJCQkJXAorCX0JCQkJCQkJCVwKKwlSQl9DT0xPUihoZWFkLT5yYmhfcm9vdCwgZmllbGQpID0gUkJfQkxBQ0s7CQkJXAorfQkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKK2F0dHIgdm9pZAkJCQkJCQkJXAorbmFtZSMjX1JCX1JFTU9WRV9DT0xPUihzdHJ1Y3QgbmFtZSAqaGVhZCwgdHlwZSAqcGFyZW50LCB0eXBlICplbG0pICAgICAgXAorewkJCQkJCQkJCVwKKwl0eXBlICp0bXA7CQkJCQkJICAgICAgICBcCisJd2hpbGUgKChlbG0gPT0gTlVMTCB8fCBSQl9DT0xPUihlbG0sIGZpZWxkKSA9PSBSQl9CTEFDSykgJiYJXAorCSAgICBlbG0gIT0gUkJfUk9PVF9OT0RFKGhlYWQpKSB7CQkJCVwKKwkJaWYgKFJCX0xFRlQocGFyZW50LCBmaWVsZCkgPT0gZWxtKSB7CQkJXAorCQkJdG1wID0gUkJfUklHSFQocGFyZW50LCBmaWVsZCk7CQkJXAorCQkJaWYgKFJCX0NPTE9SKHRtcCwgZmllbGQpID09IFJCX1JFRCkgewkJXAorCQkJCVJCX1NFVF9CTEFDS1JFRCh0bXAsIHBhcmVudCwgZmllbGQpOwlcCisJCQkJUkJfUk9UQVRFX0xFRlQoaGVhZCwgcGFyZW50LCB0bXAsIGZpZWxkKTtcCisJCQkJdG1wID0gUkJfUklHSFQocGFyZW50LCBmaWVsZCk7CQlcCisJCQl9CQkJCQkJXAorCQkJaWYgKChSQl9MRUZUKHRtcCwgZmllbGQpID09IE5VTEwgfHwJCVwKKwkJCSAgICBSQl9DT0xPUihSQl9MRUZUKHRtcCwgZmllbGQpLCBmaWVsZCkgPT0gUkJfQkxBQ0spICYmXAorCQkJICAgIChSQl9SSUdIVCh0bXAsIGZpZWxkKSA9PSBOVUxMIHx8CQlcCisJCQkgICAgUkJfQ09MT1IoUkJfUklHSFQodG1wLCBmaWVsZCksIGZpZWxkKSA9PSBSQl9CTEFDSykpIHtcCisJCQkJUkJfQ09MT1IodG1wLCBmaWVsZCkgPSBSQl9SRUQ7CQlcCisJCQkJZWxtID0gcGFyZW50OwkJCQlcCisJCQkJcGFyZW50ID0gUkJfUEFSRU5UKGVsbSwgZmllbGQpOwkJXAorCQkJfSBlbHNlIHsJCQkJCVwKKwkJCQlpZiAoUkJfUklHSFQodG1wLCBmaWVsZCkgPT0gTlVMTCB8fAlcCisJCQkJICAgIFJCX0NPTE9SKFJCX1JJR0hUKHRtcCwgZmllbGQpLCBmaWVsZCkgPT0gUkJfQkxBQ0spIHtcCisJCQkJCXR5cGUgKm9sZWZ0OwkJXAorCQkJCQlpZiAoKG9sZWZ0ID0gUkJfTEVGVCh0bXAsIGZpZWxkKSkgXAorCQkJCQkgICAgIT0gTlVMTCkJCQlcCisJCQkJCQlSQl9DT0xPUihvbGVmdCwgZmllbGQpID0gUkJfQkxBQ0s7XAorCQkJCQlSQl9DT0xPUih0bXAsIGZpZWxkKSA9IFJCX1JFRDsJXAorCQkJCQlSQl9ST1RBVEVfUklHSFQoaGVhZCwgdG1wLCBvbGVmdCwgZmllbGQpO1wKKwkJCQkJdG1wID0gUkJfUklHSFQocGFyZW50LCBmaWVsZCk7CVwKKwkJCQl9CQkJCQlcCisJCQkJUkJfQ09MT1IodG1wLCBmaWVsZCkgPSBSQl9DT0xPUihwYXJlbnQsIGZpZWxkKTtcCisJCQkJUkJfQ09MT1IocGFyZW50LCBmaWVsZCkgPSBSQl9CTEFDSzsJXAorCQkJCWlmIChSQl9SSUdIVCh0bXAsIGZpZWxkKSkJCVwKKwkJCQkJUkJfQ09MT1IoUkJfUklHSFQodG1wLCBmaWVsZCksIGZpZWxkKSA9IFJCX0JMQUNLO1wKKwkJCQlSQl9ST1RBVEVfTEVGVChoZWFkLCBwYXJlbnQsIHRtcCwgZmllbGQpO1wKKwkJCQllbG0gPSBSQl9ST09UX05PREUoaGVhZCk7CQlcCisJCQkJYnJlYWs7CQkJCQlcCisJCQl9CQkJCQkJXAorCQl9IGVsc2UgewkJCQkJCVwKKwkJCXRtcCA9IFJCX0xFRlQocGFyZW50LCBmaWVsZCk7CQkJXAorCQkJaWYgKFJCX0NPTE9SKHRtcCwgZmllbGQpID09IFJCX1JFRCkgewkJXAorCQkJCVJCX1NFVF9CTEFDS1JFRCh0bXAsIHBhcmVudCwgZmllbGQpOwlcCisJCQkJUkJfUk9UQVRFX1JJR0hUKGhlYWQsIHBhcmVudCwgdG1wLCBmaWVsZCk7XAorCQkJCXRtcCA9IFJCX0xFRlQocGFyZW50LCBmaWVsZCk7CQlcCisJCQl9CQkJCQkJXAorCQkJaWYgKChSQl9MRUZUKHRtcCwgZmllbGQpID09IE5VTEwgfHwJCVwKKwkJCSAgICBSQl9DT0xPUihSQl9MRUZUKHRtcCwgZmllbGQpLCBmaWVsZCkgPT0gUkJfQkxBQ0spICYmXAorCQkJICAgIChSQl9SSUdIVCh0bXAsIGZpZWxkKSA9PSBOVUxMIHx8CQlcCisJCQkgICAgUkJfQ09MT1IoUkJfUklHSFQodG1wLCBmaWVsZCksIGZpZWxkKSA9PSBSQl9CTEFDSykpIHtcCisJCQkJUkJfQ09MT1IodG1wLCBmaWVsZCkgPSBSQl9SRUQ7CQlcCisJCQkJZWxtID0gcGFyZW50OwkJCQlcCisJCQkJcGFyZW50ID0gUkJfUEFSRU5UKGVsbSwgZmllbGQpOwkJXAorCQkJfSBlbHNlIHsJCQkJCVwKKwkJCQlpZiAoUkJfTEVGVCh0bXAsIGZpZWxkKSA9PSBOVUxMIHx8CVwKKwkJCQkgICAgUkJfQ09MT1IoUkJfTEVGVCh0bXAsIGZpZWxkKSwgZmllbGQpID09IFJCX0JMQUNLKSB7XAorCQkJCQl0eXBlICpvcmlnaHQ7CQlcCisJCQkJCWlmICgob3JpZ2h0ID0gUkJfUklHSFQodG1wLCBmaWVsZCkpIFwKKwkJCQkJICAgICE9IE5VTEwpCQkJXAorCQkJCQkJUkJfQ09MT1Iob3JpZ2h0LCBmaWVsZCkgPSBSQl9CTEFDSztcCisJCQkJCVJCX0NPTE9SKHRtcCwgZmllbGQpID0gUkJfUkVEOwlcCisJCQkJCVJCX1JPVEFURV9MRUZUKGhlYWQsIHRtcCwgb3JpZ2h0LCBmaWVsZCk7XAorCQkJCQl0bXAgPSBSQl9MRUZUKHBhcmVudCwgZmllbGQpOwlcCisJCQkJfQkJCQkJXAorCQkJCVJCX0NPTE9SKHRtcCwgZmllbGQpID0gUkJfQ09MT1IocGFyZW50LCBmaWVsZCk7XAorCQkJCVJCX0NPTE9SKHBhcmVudCwgZmllbGQpID0gUkJfQkxBQ0s7CVwKKwkJCQlpZiAoUkJfTEVGVCh0bXAsIGZpZWxkKSkJCVwKKwkJCQkJUkJfQ09MT1IoUkJfTEVGVCh0bXAsIGZpZWxkKSwgZmllbGQpID0gUkJfQkxBQ0s7XAorCQkJCVJCX1JPVEFURV9SSUdIVChoZWFkLCBwYXJlbnQsIHRtcCwgZmllbGQpO1wKKwkJCQllbG0gPSBSQl9ST09UX05PREUoaGVhZCk7CQlcCisJCQkJYnJlYWs7CQkJCQlcCisJCQl9CQkJCQkJXAorCQl9CQkJCQkJCVwKKwl9CQkJCQkJCQlcCisJaWYgKGVsbSkJCQkJCQkJXAorCQlSQl9DT0xPUihlbG0sIGZpZWxkKSA9IFJCX0JMQUNLOwkJCVwKK30JCQkJCQkJCQlcCisJCQkJCQkJCQlcCithdHRyIHR5cGUgKgkJCQkJCQkgICAgICAgIFwKK25hbWUjI19SQl9SRU1PVkUoc3RydWN0IG5hbWUgKmhlYWQsIHR5cGUgKmVsbSkJCQkgICAgICAgIFwKK3sJCQkJCQkJCQlcCisJdHlwZSAqY2hpbGQsICpwYXJlbnQsICpvbGQgPSBlbG07CQkJICAgICAgICBcCisJaW50IGNvbG9yOwkJCQkJCQlcCisJaWYgKFJCX0xFRlQoZWxtLCBmaWVsZCkgPT0gTlVMTCkJCQkJXAorCQljaGlsZCA9IFJCX1JJR0hUKGVsbSwgZmllbGQpOwkJCQlcCisJZWxzZSBpZiAoUkJfUklHSFQoZWxtLCBmaWVsZCkgPT0gTlVMTCkJCQkJXAorCQljaGlsZCA9IFJCX0xFRlQoZWxtLCBmaWVsZCk7CQkJCVwKKwllbHNlIHsJCQkJCQkJCVwKKwkJdHlwZSAqbGVmdDsJCQkJCSAgICAgICAgXAorCQllbG0gPSBSQl9SSUdIVChlbG0sIGZpZWxkKTsJCQkJXAorCQl3aGlsZSAoKGxlZnQgPSBSQl9MRUZUKGVsbSwgZmllbGQpKSAhPSBOVUxMKQkJXAorCQkJZWxtID0gbGVmdDsJCQkJCVwKKwkJY2hpbGQgPSBSQl9SSUdIVChlbG0sIGZpZWxkKTsJCQkJXAorCQlwYXJlbnQgPSBSQl9QQVJFTlQoZWxtLCBmaWVsZCk7CQkJCVwKKwkJY29sb3IgPSBSQl9DT0xPUihlbG0sIGZpZWxkKTsJCQkJXAorCQlpZiAoY2hpbGQpCQkJCQkJXAorCQkJUkJfUEFSRU5UKGNoaWxkLCBmaWVsZCkgPSBwYXJlbnQ7CQlcCisJCWlmIChwYXJlbnQpIHsJCQkJCQlcCisJCQlpZiAoUkJfTEVGVChwYXJlbnQsIGZpZWxkKSA9PSBlbG0pCQlcCisJCQkJUkJfTEVGVChwYXJlbnQsIGZpZWxkKSA9IGNoaWxkOwkJXAorCQkJZWxzZQkJCQkJCVwKKwkJCQlSQl9SSUdIVChwYXJlbnQsIGZpZWxkKSA9IGNoaWxkOwlcCisJCQlSQl9BVUdNRU5UKHBhcmVudCk7CQkJCVwKKwkJfSBlbHNlCQkJCQkJCVwKKwkJCVJCX1JPT1RfTk9ERShoZWFkKSA9IGNoaWxkOwkJCVwKKwkJaWYgKFJCX1BBUkVOVChlbG0sIGZpZWxkKSA9PSBvbGQpCQkJXAorCQkJcGFyZW50ID0gZWxtOwkJCQkJXAorCQkoZWxtKS0+ZmllbGQgPSAob2xkKS0+ZmllbGQ7CQkJCVwKKwkJaWYgKFJCX1BBUkVOVChvbGQsIGZpZWxkKSkgewkJCQlcCisJCQlpZiAoUkJfTEVGVChSQl9QQVJFTlQob2xkLCBmaWVsZCksIGZpZWxkKSA9PSBvbGQpXAorCQkJCVJCX0xFRlQoUkJfUEFSRU5UKG9sZCwgZmllbGQpLCBmaWVsZCkgPSBlbG07XAorCQkJZWxzZQkJCQkJCVwKKwkJCQlSQl9SSUdIVChSQl9QQVJFTlQob2xkLCBmaWVsZCksIGZpZWxkKSA9IGVsbTtcCisJCQlSQl9BVUdNRU5UKFJCX1BBUkVOVChvbGQsIGZpZWxkKSk7CQlcCisJCX0gZWxzZQkJCQkJCQlcCisJCQlSQl9ST09UX05PREUoaGVhZCkgPSBlbG07CQkJXAorCQlSQl9QQVJFTlQoUkJfTEVGVChvbGQsIGZpZWxkKSwgZmllbGQpID0gZWxtOwkJXAorCQlpZiAoUkJfUklHSFQob2xkLCBmaWVsZCkpCQkJCVwKKwkJCVJCX1BBUkVOVChSQl9SSUdIVChvbGQsIGZpZWxkKSwgZmllbGQpID0gZWxtOwlcCisJCWlmIChwYXJlbnQpIHsJCQkJCQlcCisJCQlsZWZ0ID0gcGFyZW50OwkJCQkJXAorCQkJZG8gewkJCQkJCVwKKwkJCQlSQl9BVUdNRU5UKGxlZnQpOwkJCVwKKwkJCX0gd2hpbGUgKChsZWZ0ID0gUkJfUEFSRU5UKGxlZnQsIGZpZWxkKSkgIT0gTlVMTCk7IFwKKwkJfQkJCQkJCQlcCisJCWdvdG8gY29sb3I7CQkJCQkJXAorCX0JCQkJCQkJCVwKKwlwYXJlbnQgPSBSQl9QQVJFTlQoZWxtLCBmaWVsZCk7CQkJCQlcCisJY29sb3IgPSBSQl9DT0xPUihlbG0sIGZpZWxkKTsJCQkJCVwKKwlpZiAoY2hpbGQpCQkJCQkJCVwKKwkJUkJfUEFSRU5UKGNoaWxkLCBmaWVsZCkgPSBwYXJlbnQ7CQkJXAorCWlmIChwYXJlbnQpIHsJCQkJCQkJXAorCQlpZiAoUkJfTEVGVChwYXJlbnQsIGZpZWxkKSA9PSBlbG0pCQkJXAorCQkJUkJfTEVGVChwYXJlbnQsIGZpZWxkKSA9IGNoaWxkOwkJCVwKKwkJZWxzZQkJCQkJCQlcCisJCQlSQl9SSUdIVChwYXJlbnQsIGZpZWxkKSA9IGNoaWxkOwkJXAorCQlSQl9BVUdNRU5UKHBhcmVudCk7CQkJCQlcCisJfSBlbHNlCQkJCQkJCQlcCisJCVJCX1JPT1RfTk9ERShoZWFkKSA9IGNoaWxkOwkJCQlcCitjb2xvcjoJCQkJCQkJCQlcCisJaWYgKGNvbG9yID09IFJCX0JMQUNLKQkJCQkJCVwKKwkJbmFtZSMjX1JCX1JFTU9WRV9DT0xPUihoZWFkLCBwYXJlbnQsIGNoaWxkKTsJCVwKKwlyZXR1cm4gKG9sZCk7CQkJCQkJCVwKK30JCQkJCQkJCQlcCisJCQkJCQkJCQlcCisvKiBJbnNlcnRzIGEgbm9kZSBpbnRvIHRoZSBSQiB0cmVlICovCQkJCQlcCithdHRyIHR5cGUgKgkJCQkJCQkgICAgICAgIFwKK25hbWUjI19SQl9JTlNFUlQoc3RydWN0IG5hbWUgKmhlYWQsIHR5cGUgKmVsbSkJCQkgICAgICAgIFwKK3sJCQkJCQkJCQlcCisJdHlwZSAqdG1wOwkJCQkJCSAgICAgICAgXAorCXR5cGUgKnBhcmVudCA9IE5VTEw7CQkJCQkgICAgICAgIFwKKwlpbnQgY29tcCA9IDA7CQkJCQkJCVwKKwl0bXAgPSBSQl9ST09UX05PREUoaGVhZCk7CQkJCQlcCisJd2hpbGUgKHRtcCkgewkJCQkJCQlcCisJCXBhcmVudCA9IHRtcDsJCQkJCQlcCisJCWNvbXAgPSAoY21wKShlbG0sIHBhcmVudCk7CQkJCVwKKwkJaWYgKGNvbXAgPCAwKQkJCQkJCVwKKwkJCXRtcCA9IFJCX0xFRlQodG1wLCBmaWVsZCk7CQkJXAorCQllbHNlIGlmIChjb21wID4gMCkJCQkJCVwKKwkJCXRtcCA9IFJCX1JJR0hUKHRtcCwgZmllbGQpOwkJCVwKKwkJZWxzZQkJCQkJCQlcCisJCQlyZXR1cm4gKHRtcCk7CQkJCQlcCisJfQkJCQkJCQkJXAorCVJCX1NFVChlbG0sIHBhcmVudCwgZmllbGQpOwkJCQkJXAorCWlmIChwYXJlbnQgIT0gTlVMTCkgewkJCQkJCVwKKwkJaWYgKGNvbXAgPCAwKQkJCQkJCVwKKwkJCVJCX0xFRlQocGFyZW50LCBmaWVsZCkgPSBlbG07CQkJXAorCQllbHNlCQkJCQkJCVwKKwkJCVJCX1JJR0hUKHBhcmVudCwgZmllbGQpID0gZWxtOwkJCVwKKwkJUkJfQVVHTUVOVChwYXJlbnQpOwkJCQkJXAorCX0gZWxzZQkJCQkJCQkJXAorCQlSQl9ST09UX05PREUoaGVhZCkgPSBlbG07CQkJCVwKKwluYW1lIyNfUkJfSU5TRVJUX0NPTE9SKGhlYWQsIGVsbSk7CQkJCVwKKwlyZXR1cm4gKE5VTEwpOwkJCQkJCQlcCit9CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorLyogRmluZHMgdGhlIG5vZGUgd2l0aCB0aGUgc2FtZSBrZXkgYXMgZWxtICovCQkJCVwKK2F0dHIgdHlwZSAqCQkJCQkJCSAgICAgICAgXAorbmFtZSMjX1JCX0ZJTkQoc3RydWN0IG5hbWUgKmhlYWQsIHR5cGUgKmVsbSkJCQkgICAgICAgIFwKK3sJCQkJCQkJCQlcCisJdHlwZSAqdG1wID0gUkJfUk9PVF9OT0RFKGhlYWQpOwkJCQkgICAgICAgIFwKKwlpbnQgY29tcDsJCQkJCQkJXAorCXdoaWxlICh0bXApIHsJCQkJCQkJXAorCQljb21wID0gY21wKGVsbSwgdG1wKTsJCQkJCVwKKwkJaWYgKGNvbXAgPCAwKQkJCQkJCVwKKwkJCXRtcCA9IFJCX0xFRlQodG1wLCBmaWVsZCk7CQkJXAorCQllbHNlIGlmIChjb21wID4gMCkJCQkJCVwKKwkJCXRtcCA9IFJCX1JJR0hUKHRtcCwgZmllbGQpOwkJCVwKKwkJZWxzZQkJCQkJCQlcCisJCQlyZXR1cm4gKHRtcCk7CQkJCQlcCisJfQkJCQkJCQkJXAorCXJldHVybiAoTlVMTCk7CQkJCQkJCVwKK30JCQkJCQkJCQlcCisJCQkJCQkJCQlcCisvKiBGaW5kcyB0aGUgZmlyc3Qgbm9kZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNlYXJjaCBrZXkgKi8JXAorYXR0ciB0eXBlICoJCQkJCQkJICAgICAgICBcCituYW1lIyNfUkJfTkZJTkQoc3RydWN0IG5hbWUgKmhlYWQsIHR5cGUgKmVsbSkJCQkgICAgICAgIFwKK3sJCQkJCQkJCQlcCisJdHlwZSAqdG1wID0gUkJfUk9PVF9OT0RFKGhlYWQpOwkJCQkgICAgICAgIFwKKwl0eXBlICpyZXMgPSBOVUxMOwkJCQkJICAgICAgICBcCisJaW50IGNvbXA7CQkJCQkJCVwKKwl3aGlsZSAodG1wKSB7CQkJCQkJCVwKKwkJY29tcCA9IGNtcChlbG0sIHRtcCk7CQkJCQlcCisJCWlmIChjb21wIDwgMCkgewkJCQkJCVwKKwkJCXJlcyA9IHRtcDsJCQkJCVwKKwkJCXRtcCA9IFJCX0xFRlQodG1wLCBmaWVsZCk7CQkJXAorCQl9CQkJCQkJCVwKKwkJZWxzZSBpZiAoY29tcCA+IDApCQkJCQlcCisJCQl0bXAgPSBSQl9SSUdIVCh0bXAsIGZpZWxkKTsJCQlcCisJCWVsc2UJCQkJCQkJXAorCQkJcmV0dXJuICh0bXApOwkJCQkJXAorCX0JCQkJCQkJCVwKKwlyZXR1cm4gKHJlcyk7CQkJCQkJCVwKK30JCQkJCQkJCQlcCisJCQkJCQkJCQlcCisvKiBBUkdTVVNFRCAqLwkJCQkJCQkJXAorYXR0ciB0eXBlICoJCQkJCQkJICAgICAgICBcCituYW1lIyNfUkJfTkVYVCh0eXBlICplbG0pCQkJCQkgICAgICAgIFwKK3sJCQkJCQkJCQlcCisJaWYgKFJCX1JJR0hUKGVsbSwgZmllbGQpKSB7CQkJCQlcCisJCWVsbSA9IFJCX1JJR0hUKGVsbSwgZmllbGQpOwkJCQlcCisJCXdoaWxlIChSQl9MRUZUKGVsbSwgZmllbGQpKQkJCQlcCisJCQllbG0gPSBSQl9MRUZUKGVsbSwgZmllbGQpOwkJCVwKKwl9IGVsc2UgewkJCQkJCQlcCisJCWlmIChSQl9QQVJFTlQoZWxtLCBmaWVsZCkgJiYJCQkJXAorCQkgICAgKGVsbSA9PSBSQl9MRUZUKFJCX1BBUkVOVChlbG0sIGZpZWxkKSwgZmllbGQpKSkJXAorCQkJZWxtID0gUkJfUEFSRU5UKGVsbSwgZmllbGQpOwkJCVwKKwkJZWxzZSB7CQkJCQkJCVwKKwkJCXdoaWxlIChSQl9QQVJFTlQoZWxtLCBmaWVsZCkgJiYJCQlcCisJCQkgICAgKGVsbSA9PSBSQl9SSUdIVChSQl9QQVJFTlQoZWxtLCBmaWVsZCksIGZpZWxkKSkpXAorCQkJCWVsbSA9IFJCX1BBUkVOVChlbG0sIGZpZWxkKTsJCVwKKwkJCWVsbSA9IFJCX1BBUkVOVChlbG0sIGZpZWxkKTsJCQlcCisJCX0JCQkJCQkJXAorCX0JCQkJCQkJCVwKKwlyZXR1cm4gKGVsbSk7CQkJCQkJCVwKK30JCQkJCQkJCQlcCisJCQkJCQkJCQlcCisvKiBBUkdTVVNFRCAqLwkJCQkJCQkJXAorYXR0ciB0eXBlICoJCQkJCQkJXAorbmFtZSMjX1JCX1BSRVYodHlwZSAqZWxtKQkJCQkJXAorewkJCQkJCQkJCVwKKwlpZiAoUkJfTEVGVChlbG0sIGZpZWxkKSkgewkJCQkJXAorCQllbG0gPSBSQl9MRUZUKGVsbSwgZmllbGQpOwkJCQlcCisJCXdoaWxlIChSQl9SSUdIVChlbG0sIGZpZWxkKSkJCQkJXAorCQkJZWxtID0gUkJfUklHSFQoZWxtLCBmaWVsZCk7CQkJXAorCX0gZWxzZSB7CQkJCQkJCVwKKwkJaWYgKFJCX1BBUkVOVChlbG0sIGZpZWxkKSAmJgkJCQlcCisJCSAgICAoZWxtID09IFJCX1JJR0hUKFJCX1BBUkVOVChlbG0sIGZpZWxkKSwgZmllbGQpKSkJXAorCQkJZWxtID0gUkJfUEFSRU5UKGVsbSwgZmllbGQpOwkJCVwKKwkJZWxzZSB7CQkJCQkJCVwKKwkJCXdoaWxlIChSQl9QQVJFTlQoZWxtLCBmaWVsZCkgJiYJCQlcCisJCQkgICAgKGVsbSA9PSBSQl9MRUZUKFJCX1BBUkVOVChlbG0sIGZpZWxkKSwgZmllbGQpKSlcCisJCQkJZWxtID0gUkJfUEFSRU5UKGVsbSwgZmllbGQpOwkJXAorCQkJZWxtID0gUkJfUEFSRU5UKGVsbSwgZmllbGQpOwkJCVwKKwkJfQkJCQkJCQlcCisJfQkJCQkJCQkJXAorCXJldHVybiAoZWxtKTsJCQkJCQkJXAorfQkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKK2F0dHIgdHlwZSAqCQkJCQkJCSAgICAgICAgXAorbmFtZSMjX1JCX01JTk1BWChzdHJ1Y3QgbmFtZSAqaGVhZCwgaW50IHZhbCkJCQkJXAorewkJCQkJCQkJCVwKKwl0eXBlICp0bXAgPSBSQl9ST09UX05PREUoaGVhZCk7CQkJCSAgICAgICAgXAorCXR5cGUgKnBhcmVudCA9IE5VTEw7CQkJCQkgICAgICAgIFwKKwl3aGlsZSAodG1wKSB7CQkJCQkJCVwKKwkJcGFyZW50ID0gdG1wOwkJCQkJCVwKKwkJaWYgKHZhbCA8IDApCQkJCQkJXAorCQkJdG1wID0gUkJfTEVGVCh0bXAsIGZpZWxkKTsJCQlcCisJCWVsc2UJCQkJCQkJXAorCQkJdG1wID0gUkJfUklHSFQodG1wLCBmaWVsZCk7CQkJXAorCX0JCQkJCQkJCVwKKwlyZXR1cm4gKHBhcmVudCk7CQkJCQkJXAorfQorCisjZGVmaW5lIFJCX05FR0lORgktMQorI2RlZmluZSBSQl9JTkYJMQorCisjZGVmaW5lIFJCX0lOU0VSVChuYW1lLCB4LCB5KQluYW1lIyNfUkJfSU5TRVJUKHgsIHkpCisjZGVmaW5lIFJCX1JFTU9WRShuYW1lLCB4LCB5KQluYW1lIyNfUkJfUkVNT1ZFKHgsIHkpCisjZGVmaW5lIFJCX0ZJTkQobmFtZSwgeCwgeSkJbmFtZSMjX1JCX0ZJTkQoeCwgeSkKKyNkZWZpbmUgUkJfTkZJTkQobmFtZSwgeCwgeSkJbmFtZSMjX1JCX05GSU5EKHgsIHkpCisjZGVmaW5lIFJCX05FWFQobmFtZSwgeCwgeSkJbmFtZSMjX1JCX05FWFQoeSkKKyNkZWZpbmUgUkJfUFJFVihuYW1lLCB4LCB5KQluYW1lIyNfUkJfUFJFVih5KQorI2RlZmluZSBSQl9NSU4obmFtZSwgeCkJCW5hbWUjI19SQl9NSU5NQVgoeCwgUkJfTkVHSU5GKQorI2RlZmluZSBSQl9NQVgobmFtZSwgeCkJCW5hbWUjI19SQl9NSU5NQVgoeCwgUkJfSU5GKQorCisjZGVmaW5lIFJCX0ZPUkVBQ0goeCwgbmFtZSwgaGVhZCkJCQkJCVwKKwlmb3IgKCh4KSA9IFJCX01JTihuYW1lLCBoZWFkKTsJCQkJCVwKKwkgICAgICh4KSAhPSBOVUxMOwkJCQkJCVwKKwkgICAgICh4KSA9IG5hbWUjI19SQl9ORVhUKHgpKQorCisjZGVmaW5lIFJCX0ZPUkVBQ0hfRlJPTSh4LCBuYW1lLCB5KQkJCQkJXAorCWZvciAoKHgpID0gKHkpOwkJCQkJCQlcCisJICAgICgoeCkgIT0gTlVMTCkgJiYgKCh5KSA9IG5hbWUjI19SQl9ORVhUKHgpLCAoeCkgIT0gTlVMTCk7CVwKKwkgICAgICh4KSA9ICh5KSkKKworI2RlZmluZSBSQl9GT1JFQUNIX1NBRkUoeCwgbmFtZSwgaGVhZCwgeSkJCQkJXAorCWZvciAoKHgpID0gUkJfTUlOKG5hbWUsIGhlYWQpOwkJCQkJXAorCSAgICAoKHgpICE9IE5VTEwpICYmICgoeSkgPSBuYW1lIyNfUkJfTkVYVCh4KSwgKHgpICE9IE5VTEwpOwlcCisJICAgICAoeCkgPSAoeSkpCisKKyNkZWZpbmUgUkJfRk9SRUFDSF9SRVZFUlNFKHgsIG5hbWUsIGhlYWQpCQkJCVwKKwlmb3IgKCh4KSA9IFJCX01BWChuYW1lLCBoZWFkKTsJCQkJCVwKKwkgICAgICh4KSAhPSBOVUxMOwkJCQkJCVwKKwkgICAgICh4KSA9IG5hbWUjI19SQl9QUkVWKHgpKQorCisjZGVmaW5lIFJCX0ZPUkVBQ0hfUkVWRVJTRV9GUk9NKHgsIG5hbWUsIHkpCQkJCVwKKwlmb3IgKCh4KSA9ICh5KTsJCQkJCQkJXAorCSAgICAoKHgpICE9IE5VTEwpICYmICgoeSkgPSBuYW1lIyNfUkJfUFJFVih4KSwgKHgpICE9IE5VTEwpOwlcCisJICAgICAoeCkgPSAoeSkpCisKKyNkZWZpbmUgUkJfRk9SRUFDSF9SRVZFUlNFX1NBRkUoeCwgbmFtZSwgaGVhZCwgeSkJCQlcCisJZm9yICgoeCkgPSBSQl9NQVgobmFtZSwgaGVhZCk7CQkJCQlcCisJICAgICgoeCkgIT0gTlVMTCkgJiYgKCh5KSA9IG5hbWUjI19SQl9QUkVWKHgpLCAoeCkgIT0gTlVMTCk7CVwKKwkgICAgICh4KSA9ICh5KSkKKworI2VuZGlmCS8qIF9CQ01PU19UUkVFX0hfICovCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2JjbW9zX3R5cGVzLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2JjbW9zX3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFmMDE5MQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vYmNtb3NfdHlwZXMuaApAQCAtMCwwICsxLDIwOCBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBCQ01PU19UWVBFU19IXworI2RlZmluZSBCQ01PU19UWVBFU19IXworCisjaWZuZGVmIEJDTU9TX1NZU1RFTV9IXworI2Vycm9yIFBsZWFzZSBkbyBub3QgaW5jbHVkZSBiY21vc190eXBlcy5oIGRpcmVjdGx5LiBJbmNsdWRlIGJjbW9zX3N5c3RlbS5oCisjZW5kaWYKKworI2luY2x1ZGUgImJjbW9zX3BhY2suaCIKKworLyoqIFxkZWZncm91cCBzeXN0ZW1fdHlwZXMgR2VuZXJpYyB0eXBlcworICogQHsKKyAqLworCisvKgorICogTGltaXRzIG9mIGludGVnZXIgdHlwZXMuCisgKi8KKworLyogTWluaW11bSBvZiBzaWduZWQgaW50ZWdlciB0eXBlcy4gICovCisjaWZuZGVmIElOVDhfTUlOCisjZGVmaW5lIElOVDhfTUlOICAgICAgICgweDgwKQorI2VuZGlmCisjaWZuZGVmIElOVDE2X01JTgorI2RlZmluZSBJTlQxNl9NSU4gICAgICAoMHg4MDAwKQorI2VuZGlmCisjaWZuZGVmIElOVDMyX01JTgorI2RlZmluZSBJTlQzMl9NSU4gICAgICAoMHg4MDAwMDAwMCkKKyNlbmRpZgorI2lmbmRlZiBJTlQ2NF9NSU4KKyNkZWZpbmUgSU5UNjRfTUlOICAgICAgKDB4ODAwMDAwMDAwMDAwMDAwMCkKKyNlbmRpZgorCisvKiBNYXhpbXVtIG9mIHNpZ25lZCBpbnRlZ2VyIHR5cGVzLiAgKi8KKyNpZm5kZWYgSU5UOF9NQVgKKyNkZWZpbmUgSU5UOF9NQVggICAgICAgKDB4N0YpCisjZW5kaWYKKyNpZm5kZWYgSU5UMTZfTUFYCisjZGVmaW5lIElOVDE2X01BWCAgICAgICgweDdGRkYpCisjZW5kaWYKKyNpZm5kZWYgSU5UMzJfTUFYCisjZGVmaW5lIElOVDMyX01BWCAgICAgICgweDdGRkZGRkZGKQorI2VuZGlmCisjaWZuZGVmIElOVDY0X01BWAorI2RlZmluZSBJTlQ2NF9NQVggICAgICAoMHg3RkZGRkZGRkZGRkZGRkZGKQorI2VuZGlmCisKKy8qIE1heGltdW0gb2YgdW5zaWduZWQgaW50ZWdlciB0eXBlcy4gICovCisjaWZuZGVmIFVJTlQ4X01BWAorI2RlZmluZSBVSU5UOF9NQVggICAgICAoMHhGRikKKyNlbmRpZgorI2lmbmRlZiBVSU5UMTZfTUFYCisjZGVmaW5lIFVJTlQxNl9NQVggICAgICgweEZGRkYpCisjZW5kaWYKKyNpZm5kZWYgVUlOVDMyX01BWAorI2RlZmluZSBVSU5UMzJfTUFYICAgICAoMHhGRkZGRkZGRikKKyNlbmRpZgorI2lmbmRlZiBVSU5UNjRfTUFYCisjZGVmaW5lIFVJTlQ2NF9NQVggICAgICgweEZGRkZGRkZGRkZGRkZGRkYpCisjZW5kaWYKKworCisvKiogRW5kaWFubmVzcyAqLworI2RlZmluZSBCQ01PU19FTkRJQU5fQklHICAgICAgICAwCisjZGVmaW5lIEJDTU9TX0VORElBTl9MSVRUTEUgICAgIDEKKwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNT1NfRU5ESUFOX0JJR19FICAgICAgICAgID0gQkNNT1NfRU5ESUFOX0JJRywKKyAgICBCQ01PU19FTkRJQU5fTElUVExFX0UgICAgICAgPSBCQ01PU19FTkRJQU5fTElUVExFLAorfSBiY21vc19lbmRpYW47CisKKy8qIElmIGVuZGlhbm5lc3MgaXMgbm90IHNldCBleHBsaWNpdGx5LCB0cnkgdG8gYXV0b2RldGVjdCBpdC4KKyAqIE1vZGVybiBnY2MgdmVyc2lvbnMgKG92ZXIgNC44KSBkZWZpbmUgX19CWVRFX09SREVSX18KKyAqIHNlZSAiZ2NjIC1FIC1kTSAtIDwgL2Rldi9udWxsIHwgZ3JlcCBFTkRJQU4iCisgKi8KKyNpZm5kZWYgQkNNX0NQVV9FTkRJQU4KKworI2lmZGVmIF9fQllURV9PUkRFUl9fCisKKyNpZiBfX0JZVEVfT1JERVJfXyA9PSBfX09SREVSX0xJVFRMRV9FTkRJQU5fXworI2RlZmluZSBCQ01fQ1BVX0VORElBTiBCQ01PU19FTkRJQU5fTElUVExFCisjZWxzZQorI2RlZmluZSBCQ01fQ1BVX0VORElBTiBCQ01PU19FTkRJQU5fQklHCisjZW5kaWYKKworI2Vsc2UKKworLyogV2UgYXJlIGRlYWxpbmcgd2l0aCBjb21waWxlciB0aGF0IGRvZXNuJ3Qgc2V0IF9fQllURV9PUkRFUl9fLgorICogSWYgaXQgaXMgc2ltdWxhdGlvbiBidWlsZCB0aGFuIGl0IG11c3QgYmUgTEUgeDg2LgorICogT3RoZXJ3aXNlLCBubyB3YXkgdG8gdGVsbC4KKyAqLworI2lmZGVmIFNJTVVMQVRJT05fQlVJTEQKKyNkZWZpbmUgQkNNX0NQVV9FTkRJQU4gQkNNT1NfRU5ESUFOX0xJVFRMRQorI2VuZGlmCisKKyNlbmRpZiAvKiAjaWZkZWYgX19CWVRFX09SREVSICovCisKKyNlbmRpZiAvKiAjaWZuZGVmIEJDTV9DUFVfRU5ESUFOICovCisKKyNpbmNsdWRlIDxiY21fY29uZmlnLmg+CisKKy8qKiAyNC1iaXQgdW5zaWduZWQgaW50ZWdlciAqLwordHlwZWRlZiB1bmlvbgoreworICAgIHVpbnQ4X3QgdThbM107CisgICAgc3RydWN0IF9fUEFDS0VEX0FUVFJfU1RBUlRfXworICAgIHsKKyNpZiAoQkNNX0NQVV9FTkRJQU4gPT0gQkNNT1NfRU5ESUFOX0JJRykKKyAgICAgICAgdWludDhfdCBoaTsKKyAgICAgICAgdWludDhfdCBtaWQ7CisgICAgICAgIHVpbnQ4X3QgbG93OworI2VsaWYgKEJDTV9DUFVfRU5ESUFOID09IEJDTU9TX0VORElBTl9MSVRUTEUpCisgICAgICAgIHVpbnQ4X3QgbG93OworICAgICAgICB1aW50OF90IG1pZDsKKyAgICAgICAgdWludDhfdCBoaTsKKyNlbHNlCisjZXJyb3IgQkNNX0NQVV9FTkRJQU4gbXVzdCBiZSBCQ01PU19FTkRJQU5fQklHIG9yIF9MSVRUTEUKKyNlbmRpZgorICAgIH0gX19QQUNLRURfQVRUUl9FTkRfXyBsb3dfaGk7Cit9IHVpbnQyNF90OworCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IHVpbnQyNF90b18zMih1aW50MjRfdCB1MjQpCit7CisgICAgcmV0dXJuICh1MjQubG93X2hpLmhpIDw8IDE2KSB8ICh1MjQubG93X2hpLm1pZCA8PCA4KSB8IHUyNC5sb3dfaGkubG93OworfQorCitzdGF0aWMgaW5saW5lIHVpbnQyNF90IHVpbnQzMl90b18yNCh1aW50MzJfdCB1MzIpCit7CisgICAgcmV0dXJuICh1aW50MjRfdCl7IC5sb3dfaGk9IHsgLmhpID0gKHUzMiA+PiAxNikgJiAweGZmLCAubWlkID0gKHUzMiA+PiA4KSAmIDB4ZmYsIC5sb3cgPSB1MzIgJiAweGZmIH0gfTsKK30KKworLyoqIFZMQU4gdGFnIChDb1MvQ0ZJL1ZJRCkgKi8KK3R5cGVkZWYgdWludDE2X3QgYmNtb3Nfdmxhbl90YWc7CisKKyNkZWZpbmUgQkNNT1NfRVRIX0FMRU4gICA2CisKKy8qKiBNQUMgYWRkcmVzcyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50OF90IHU4W0JDTU9TX0VUSF9BTEVOXTsKK30gYmNtb3NfbWFjX2FkZHJlc3M7CisKKy8qKiBJUHY0IGFkZHJlc3MuIEl0IGlzIHN0b3JlZCBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuICovCit0eXBlZGVmIHVuaW9uCit7CisgICAgdWludDMyX3QgdTMyOworICAgIHVpbnQ4X3QgdThbNF07Cit9IGJjbW9zX2lwdjRfYWRkcmVzczsKKworLyoqIElQdjYgYWRkcmVzcyAqLwordHlwZWRlZiB1aW50OF90IGJjbW9zX2lwdjZfYWRkcmVzc1sxNl07CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBiY21vc19tYWNfYWRkcmVzc19pbml0KGJjbW9zX21hY19hZGRyZXNzICptYWMpCit7CisgICAgbWVtc2V0KG1hYywgMCwgc2l6ZW9mKCptYWMpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJjbW9zX2lwdjRfYWRkcmVzc19pbml0KGJjbW9zX2lwdjRfYWRkcmVzcyAqaXApCit7CisgICAgbWVtc2V0KGlwLCAwLCBzaXplb2YoKmlwKSk7Cit9CisKKyNpZm5kZWYgQ0ZFX0JVSUxECitzdGF0aWMgaW5saW5lIGNoYXIgKmJjbW9zX2luZXRfbnRvYShiY21vc19pcHY0X2FkZHJlc3MgKmlwLCBjaGFyICppcF9zdHIpCit7CisgICAgc25wcmludGYoaXBfc3RyLCAxNiwgIiV1LiV1LiV1LiV1IiwgaXAtPnU4WzBdLCBpcC0+dThbMV0sIGlwLT51OFsyXSwgaXAtPnU4WzNdKTsKKworICAgIHJldHVybiBpcF9zdHI7Cit9CisjZW5kaWYKKworI2lmbmRlZiBjb250YWluZXJfb2YKKyNkZWZpbmUgY29udGFpbmVyX29mKHB0ciwgdHlwZSwgbWVtYmVyKSAoeyAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgdHlwZW9mKCAoKHR5cGUgKikwKS0+bWVtYmVyICkgKl9fbXB0ciA9IChwdHIpOyAgICBcCisgICAgICAgICh0eXBlICopKCAobG9uZylfX21wdHIgLSBvZmZzZXRvZih0eXBlLG1lbWJlcikgKTt9KQorI2VuZGlmCisKKy8qKiBAfSAqLworCisjZW5kaWYgLyogQkNNT1NfVFlQRVNfSF8gKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vY2ZlL2JjbW9sdF9tb2RlbF9kYXRhX2NmZV9leHQuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vY2ZlL2JjbW9sdF9tb2RlbF9kYXRhX2NmZV9leHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGNhOWNlCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9jZmUvYmNtb2x0X21vZGVsX2RhdGFfY2ZlX2V4dC5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6cHJvcHJpZXRhcnk6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitUaGlzIHByb2dyYW0gaXMgdGhlIHByb3ByaWV0YXJ5IHNvZnR3YXJlIG9mIEJyb2FkY29tIENvcnBvcmF0aW9uIGFuZC9vciBpdHMKK2xpY2Vuc29ycywgYW5kIG1heSBvbmx5IGJlIHVzZWQsIGR1cGxpY2F0ZWQsIG1vZGlmaWVkIG9yIGRpc3RyaWJ1dGVkIHB1cnN1YW50Cit0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgYSBzZXBhcmF0ZSwgd3JpdHRlbiBsaWNlbnNlIGFncmVlbWVudCBleGVjdXRlZAorYmV0d2VlbiB5b3UgYW5kIEJyb2FkY29tIChhbiAiQXV0aG9yaXplZCBMaWNlbnNlIikuICBFeGNlcHQgYXMgc2V0IGZvcnRoIGluCithbiBBdXRob3JpemVkIExpY2Vuc2UsIEJyb2FkY29tIGdyYW50cyBubyBsaWNlbnNlIChleHByZXNzIG9yIGltcGxpZWQpLCByaWdodAordG8gdXNlLCBvciB3YWl2ZXIgb2YgYW55IGtpbmQgd2l0aCByZXNwZWN0IHRvIHRoZSBTb2Z0d2FyZSwgYW5kIEJyb2FkY29tCitleHByZXNzbHkgcmVzZXJ2ZXMgYWxsIHJpZ2h0cyBpbiBhbmQgdG8gdGhlIFNvZnR3YXJlIGFuZCBhbGwgaW50ZWxsZWN0dWFsCitwcm9wZXJ0eSByaWdodHMgdGhlcmVpbi4gIElGIFlPVSBIQVZFIE5PIEFVVEhPUklaRUQgTElDRU5TRSwgVEhFTiBZT1UgSEFWRQorTk8gUklHSFQgVE8gVVNFIFRISVMgU09GVFdBUkUgSU4gQU5ZIFdBWSwgQU5EIFNIT1VMRCBJTU1FRElBVEVMWSBOT1RJRlkKK0JST0FEQ09NIEFORCBESVNDT05USU5VRSBBTEwgVVNFIE9GIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGV4cHJlc3NseSBzZXQgZm9ydGggaW4gdGhlIEF1dGhvcml6ZWQgTGljZW5zZSwKKworMS4gVGhpcyBwcm9ncmFtLCBpbmNsdWRpbmcgaXRzIHN0cnVjdHVyZSwgc2VxdWVuY2UgYW5kIG9yZ2FuaXphdGlvbiwKKyAgICBjb25zdGl0dXRlcyB0aGUgdmFsdWFibGUgdHJhZGUgc2VjcmV0cyBvZiBCcm9hZGNvbSwgYW5kIHlvdSBzaGFsbCB1c2UKKyAgICBhbGwgcmVhc29uYWJsZSBlZmZvcnRzIHRvIHByb3RlY3QgdGhlIGNvbmZpZGVudGlhbGl0eSB0aGVyZW9mLCBhbmQgdG8KKyAgICB1c2UgdGhpcyBpbmZvcm1hdGlvbiBvbmx5IGluIGNvbm5lY3Rpb24gd2l0aCB5b3VyIHVzZSBvZiBCcm9hZGNvbQorICAgIGludGVncmF0ZWQgY2lyY3VpdCBwcm9kdWN0cy4KKworMi4gVE8gVEhFIE1BWElNVU0gRVhURU5UIFBFUk1JVFRFRCBCWSBMQVcsIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiCisgICAgQU5EIFdJVEggQUxMIEZBVUxUUyBBTkQgQlJPQURDT00gTUFLRVMgTk8gUFJPTUlTRVMsIFJFUFJFU0VOVEFUSU9OUyBPUgorICAgIFdBUlJBTlRJRVMsIEVJVEhFUiBFWFBSRVNTLCBJTVBMSUVELCBTVEFUVVRPUlksIE9SIE9USEVSV0lTRSwgV0lUSAorICAgIFJFU1BFQ1QgVE8gVEhFIFNPRlRXQVJFLiAgQlJPQURDT00gU1BFQ0lGSUNBTExZIERJU0NMQUlNUyBBTlkgQU5ECisgICAgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBUSVRMRSwgTUVSQ0hBTlRBQklMSVRZLCBOT05JTkZSSU5HRU1FTlQsCisgICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIExBQ0sgT0YgVklSVVNFUywgQUNDVVJBQ1kgT1IKKyAgICBDT01QTEVURU5FU1MsIFFVSUVUIEVOSk9ZTUVOVCwgUVVJRVQgUE9TU0VTU0lPTiBPUiBDT1JSRVNQT05ERU5DRQorICAgIFRPIERFU0NSSVBUSU9OLiBZT1UgQVNTVU1FIFRIRSBFTlRJUkUgUklTSyBBUklTSU5HIE9VVCBPRiBVU0UgT1IKKyAgICBQRVJGT1JNQU5DRSBPRiBUSEUgU09GVFdBUkUuCisKKzMuIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBJTiBOTyBFVkVOVCBTSEFMTCBCUk9BRENPTSBPUgorICAgIElUUyBMSUNFTlNPUlMgQkUgTElBQkxFIEZPUiAoaSkgQ09OU0VRVUVOVElBTCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAgICBJTkRJUkVDVCwgT1IgRVhFTVBMQVJZIERBTUFHRVMgV0hBVFNPRVZFUiBBUklTSU5HIE9VVCBPRiBPUiBJTiBBTlkKKyAgICBXQVkgUkVMQVRJTkcgVE8gWU9VUiBVU0UgT0YgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgU09GVFdBUkUgRVZFTgorICAgIElGIEJST0FEQ09NIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUzsKKyAgICBPUiAoaWkpIEFOWSBBTU9VTlQgSU4gRVhDRVNTIE9GIFRIRSBBTU9VTlQgQUNUVUFMTFkgUEFJRCBGT1IgVEhFCisgICAgU09GVFdBUkUgSVRTRUxGIE9SIFUuUy4gJDEsIFdISUNIRVZFUiBJUyBHUkVBVEVSLiBUSEVTRSBMSU1JVEFUSU9OUworICAgIFNIQUxMIEFQUExZIE5PVFdJVEhTVEFORElORyBBTlkgRkFJTFVSRSBPRiBFU1NFTlRJQUwgUFVSUE9TRSBPRiBBTlkKKyAgICBMSU1JVEVEIFJFTUVEWS4KKzo+CisqLworCisjaWZuZGVmIEJDTU9TX01PREVMX0RBVEFfQ0ZFX0VYVF9IXworI2RlZmluZSBCQ01PU19NT0RFTF9EQVRBX0NGRV9FWFRfSF8KKworI2luY2x1ZGUgImJjbW9sdF9tb2RlbF9kYXRhLmgiCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgYmNtb2x0X3N5c3RlbV9tb2RlIHN5c3RlbV9tb2RlOworICAgIGJjbW9sdF9kZXZpY2Vfbm5pX3NwZWVkIG5uaV9zcGVlZDsKKyAgICBiY21vc19ib29sIHVzZV9wcmV2X25uaV9zZXJkZXNfZmlybXdhcmU7Cit9IGRiX3JlY19kZXZpY2U7CisKKy8qIFN5c3RlbSBtb2RlICovCitzdGF0aWMgYmNtb2x0X3N5c3RlbV9tb2RlIGRldmljZV9zeXN0ZW1fbW9kZTsKKworLyoqIFNldCBzeXN0ZW0gbW9kZQorICogXHBhcmFtW2luXSAgZGV2ICAgICAgICAgICAgRGV2aWNlIGlkCisgKiBccGFyYW1baW5dICBzeXN0ZW1fbW9kZSAgICBTeXN0ZW0gbW9kZQorICogXHJldHVybnMgQkNNX0VSUl9PSywgQkNNX0VSUl9OT1RfU1VQUE9SVEVECisgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfZXJybm8gYmNtb2x0X3N5c3RlbV9tb2RlX3NldCh1aW50MTZfdCBkZXYsIGJjbW9sdF9zeXN0ZW1fbW9kZSBzeXN0ZW1fbW9kZSkKK3sKKyAgICBkZXZpY2Vfc3lzdGVtX21vZGUgPSBzeXN0ZW1fbW9kZTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqIEdldCBzeXN0ZW0gbW9kZQorICogXHBhcmFtW2luXSAgZGV2ICAgICAgICAgICAgRGV2aWNlIGlkCisgKiBccGFyYW1baW5dICBzeXN0ZW1fbW9kZSAgICBTeXN0ZW0gbW9kZQorICogXHJldHVybnMgQkNNX0VSUl9PSworICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Vycm5vIGJjbW9sdF9zeXN0ZW1fbW9kZV9nZXQodWludDE2X3QgZGV2LCBiY21vbHRfc3lzdGVtX21vZGUgKnN5c3RlbV9tb2RlKQoreworICAgICpzeXN0ZW1fbW9kZSA9IGRldmljZV9zeXN0ZW1fbW9kZTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworCitzdGF0aWMgaW5saW5lIGludCBpc19pc3N1X2Jvb3Qodm9pZCkKK3sKKyAgICByZXR1cm4gQkNNT1NfRkFMU0U7Cit9CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2NmZS9iY21vc19zeXN0ZW0uaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vY2ZlL2JjbW9zX3N5c3RlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2M2NjNzkKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2NmZS9iY21vc19zeXN0ZW0uaApAQCAtMCwwICsxLDEzOCBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpwcm9wcmlldGFyeTpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1RoaXMgcHJvZ3JhbSBpcyB0aGUgcHJvcHJpZXRhcnkgc29mdHdhcmUgb2YgQnJvYWRjb20gQ29ycG9yYXRpb24gYW5kL29yIGl0cworbGljZW5zb3JzLCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgZHVwbGljYXRlZCwgbW9kaWZpZWQgb3IgZGlzdHJpYnV0ZWQgcHVyc3VhbnQKK3RvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiBhIHNlcGFyYXRlLCB3cml0dGVuIGxpY2Vuc2UgYWdyZWVtZW50IGV4ZWN1dGVkCitiZXR3ZWVuIHlvdSBhbmQgQnJvYWRjb20gKGFuICJBdXRob3JpemVkIExpY2Vuc2UiKS4gIEV4Y2VwdCBhcyBzZXQgZm9ydGggaW4KK2FuIEF1dGhvcml6ZWQgTGljZW5zZSwgQnJvYWRjb20gZ3JhbnRzIG5vIGxpY2Vuc2UgKGV4cHJlc3Mgb3IgaW1wbGllZCksIHJpZ2h0Cit0byB1c2UsIG9yIHdhaXZlciBvZiBhbnkga2luZCB3aXRoIHJlc3BlY3QgdG8gdGhlIFNvZnR3YXJlLCBhbmQgQnJvYWRjb20KK2V4cHJlc3NseSByZXNlcnZlcyBhbGwgcmlnaHRzIGluIGFuZCB0byB0aGUgU29mdHdhcmUgYW5kIGFsbCBpbnRlbGxlY3R1YWwKK3Byb3BlcnR5IHJpZ2h0cyB0aGVyZWluLiAgSUYgWU9VIEhBVkUgTk8gQVVUSE9SSVpFRCBMSUNFTlNFLCBUSEVOIFlPVSBIQVZFCitOTyBSSUdIVCBUTyBVU0UgVEhJUyBTT0ZUV0FSRSBJTiBBTlkgV0FZLCBBTkQgU0hPVUxEIElNTUVESUFURUxZIE5PVElGWQorQlJPQURDT00gQU5EIERJU0NPTlRJTlVFIEFMTCBVU0UgT0YgVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgZXhwcmVzc2x5IHNldCBmb3J0aCBpbiB0aGUgQXV0aG9yaXplZCBMaWNlbnNlLAorCisxLiBUaGlzIHByb2dyYW0sIGluY2x1ZGluZyBpdHMgc3RydWN0dXJlLCBzZXF1ZW5jZSBhbmQgb3JnYW5pemF0aW9uLAorICAgIGNvbnN0aXR1dGVzIHRoZSB2YWx1YWJsZSB0cmFkZSBzZWNyZXRzIG9mIEJyb2FkY29tLCBhbmQgeW91IHNoYWxsIHVzZQorICAgIGFsbCByZWFzb25hYmxlIGVmZm9ydHMgdG8gcHJvdGVjdCB0aGUgY29uZmlkZW50aWFsaXR5IHRoZXJlb2YsIGFuZCB0bworICAgIHVzZSB0aGlzIGluZm9ybWF0aW9uIG9ubHkgaW4gY29ubmVjdGlvbiB3aXRoIHlvdXIgdXNlIG9mIEJyb2FkY29tCisgICAgaW50ZWdyYXRlZCBjaXJjdWl0IHByb2R1Y3RzLgorCisyLiBUTyBUSEUgTUFYSU1VTSBFWFRFTlQgUEVSTUlUVEVEIEJZIExBVywgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIKKyAgICBBTkQgV0lUSCBBTEwgRkFVTFRTIEFORCBCUk9BRENPTSBNQUtFUyBOTyBQUk9NSVNFUywgUkVQUkVTRU5UQVRJT05TIE9SCisgICAgV0FSUkFOVElFUywgRUlUSEVSIEVYUFJFU1MsIElNUExJRUQsIFNUQVRVVE9SWSwgT1IgT1RIRVJXSVNFLCBXSVRICisgICAgUkVTUEVDVCBUTyBUSEUgU09GVFdBUkUuICBCUk9BRENPTSBTUEVDSUZJQ0FMTFkgRElTQ0xBSU1TIEFOWSBBTkQKKyAgICBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIFRJVExFLCBNRVJDSEFOVEFCSUxJVFksIE5PTklORlJJTkdFTUVOVCwKKyAgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgTEFDSyBPRiBWSVJVU0VTLCBBQ0NVUkFDWSBPUgorICAgIENPTVBMRVRFTkVTUywgUVVJRVQgRU5KT1lNRU5ULCBRVUlFVCBQT1NTRVNTSU9OIE9SIENPUlJFU1BPTkRFTkNFCisgICAgVE8gREVTQ1JJUFRJT04uIFlPVSBBU1NVTUUgVEhFIEVOVElSRSBSSVNLIEFSSVNJTkcgT1VUIE9GIFVTRSBPUgorICAgIFBFUkZPUk1BTkNFIE9GIFRIRSBTT0ZUV0FSRS4KKworMy4gVE8gVEhFIE1BWElNVU0gRVhURU5UIFBFUk1JVFRFRCBCWSBMQVcsIElOIE5PIEVWRU5UIFNIQUxMIEJST0FEQ09NIE9SCisgICAgSVRTIExJQ0VOU09SUyBCRSBMSUFCTEUgRk9SIChpKSBDT05TRVFVRU5USUFMLCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICAgIElORElSRUNULCBPUiBFWEVNUExBUlkgREFNQUdFUyBXSEFUU09FVkVSIEFSSVNJTkcgT1VUIE9GIE9SIElOIEFOWQorICAgIFdBWSBSRUxBVElORyBUTyBZT1VSIFVTRSBPRiBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBTT0ZUV0FSRSBFVkVOCisgICAgSUYgQlJPQURDT00gSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTOworICAgIE9SIChpaSkgQU5ZIEFNT1VOVCBJTiBFWENFU1MgT0YgVEhFIEFNT1VOVCBBQ1RVQUxMWSBQQUlEIEZPUiBUSEUKKyAgICBTT0ZUV0FSRSBJVFNFTEYgT1IgVS5TLiAkMSwgV0hJQ0hFVkVSIElTIEdSRUFURVIuIFRIRVNFIExJTUlUQVRJT05TCisgICAgU0hBTEwgQVBQTFkgTk9UV0lUSFNUQU5ESU5HIEFOWSBGQUlMVVJFIE9GIEVTU0VOVElBTCBQVVJQT1NFIE9GIEFOWQorICAgIExJTUlURUQgUkVNRURZLgorOj4KKyovCisjaWZuZGVmIEJDTU9TX1NZU1RFTV9IXworI2RlZmluZSBCQ01PU19TWVNURU1fSF8KKworI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjaW5jbHVkZSAibGliX3R5cGVzLmgiCisjaW5jbHVkZSAibGliX3N0cmluZy5oIgorCisjaW5jbHVkZSAiLi4vYmNtb3NfZXJybm8uaCIKKyNpbmNsdWRlICIuLi9iY21vc190eXBlcy5oIgorI2luY2x1ZGUgIi4uL2JjbW9zX2VuZGlhbi5oIgorI2luY2x1ZGUgImNmZV90aW1lci5oIgorI2luY2x1ZGUgImxpYl9wcmludGYuaCIKKworI2RlZmluZSBiY21vc19wcmludGYgcHJpbnRmCisKKyNkZWZpbmUgYmNtb3NfdXNsZWVwKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBjZmVfdXNsZWVwICh4KTsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoMCkgCisvKiBEZWZpbmUgYmNtb3NfYm9vbCAtIHRoZSBib29sZWFuIHR5cGUgZm9yIGJjbW9zIC0gYmFzZWQgb24gQzk5IHN0YW5kYXJkIGJvb2xlYW4gdHlwZSAqLworI2lmbmRlZiBCQ01PU19CT09MRUFOCit0eXBlZGVmIF9Cb29sIGJjbW9zX2Jvb2w7CisjZGVmaW5lIEJDTU9TX0ZBTFNFIDAKKyNkZWZpbmUgQkNNT1NfVFJVRSAxCisjZW5kaWYKKworI2RlZmluZSBQRVJJUEhfR0VOSU5UX1JFVklEICAgICAgICAgICAgICAweGZmZTAwMDAwCisjZGVmaW5lIENISVBfUkVWX01BU0sgICAgICAgICAgICAgICAgICAgIDB4RkYKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGdldF9jaGlwX3JldmlzaW9uKHZvaWQpCit7CisgICAgcmV0dXJuICoodm9sYXRpbGUgdW5zaWduZWQgaW50KilQRVJJUEhfR0VOSU5UX1JFVklEICYgQ0hJUF9SRVZfTUFTSzsKK30gCisKKyNkZWZpbmUgQ0hJUF9SRVZJU0lPTl9BMCAweEEwCisjZGVmaW5lIENISVBfUkVWSVNJT05fQjAgMHhCMAorCisjaWZkZWYgU0lNVUxBVElPTl9CVUlMRAorI2RlZmluZSBHRVRfQ0hJUF9SRVZJU0lPTiBDSElQX1JFVklTSU9OX0EwCisjZWxzZQorZXh0ZXJuIHVpbnQzMl90IGNoaXBfcmV2aXNpb247CisjZGVmaW5lIEdFVF9DSElQX1JFVklTSU9OIChjaGlwX3JldmlzaW9uICE9IDAgPyBjaGlwX3JldmlzaW9uIDogKGNoaXBfcmV2aXNpb24gPSBnZXRfY2hpcF9yZXZpc2lvbigpKSkKKyNlbmRpZgorCisKK3R5cGVkZWYgdWludDE2X3QgYmNtb3NfZmFzdGxvY2s7CisjZGVmaW5lIEJDTU9TX0ZBU1RMT0NLX0lOSVRJQUxJWkVSIDAKKyNkZWZpbmUgYmNtb3NfZmFzdGxvY2tfbG9jayhmYXN0bG9jaykgKGxvbmcpZmFzdGxvY2sKKyNkZWZpbmUgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKGZhc3Rsb2NrLCBmbGFncykgICh2b2lkKWZsYWdzCisKK3R5cGVkZWYgdWludDE2X3QgYmNtb3NfbXV0ZXg7CisjZGVmaW5lIGJjbW9zX211dGV4X2NyZWF0ZShtdXRleCwgZmxhZ3MsIG5hbWUpICAKKyNkZWZpbmUgYmNtb3NfbXV0ZXhfbG9jayhtdXRleCkKKyNkZWZpbmUgYmNtb3NfbXV0ZXhfdW5sb2NrKG11dGV4KQorCisKKyNkZWZpbmUgQkNNX1NJWkVPRkFSUkFZKGFycikgKHNpemVvZihhcnIpL3NpemVvZigqYXJyKSkKKyNkZWZpbmUgQkNNX1NJWkVPRkZJRUxEKHMsIGYpIChzaXplb2YoKChzKilOVUxMKS0+ZikpCisjZGVmaW5lIEJDTV9NRU1aRVJPX1NUUlVDVChwdHIpIG1lbXNldChwdHIsIDAsIHNpemVvZigqKHB0cikpKQorI2RlZmluZSBCQ01fTUVNQ1BZX0FSUkFZKGRzdCwgc3JjKSBtZW1jcHkoZHN0LCBzcmMsIHNpemVvZihkc3QpKQorCisKKyNkZWZpbmUgQlVHX09OX1BSSU5UKGNvbmRpdGlvbiwgZm10LCBhcmdzLi4uKSBcCisgICAgZG8gXAorICAgIHsgXAorICAgICAgICBpZiAoY29uZGl0aW9uKSBcCisgICAgICAgIHsgXAorICAgICAgICAgICAgcHJpbnRmKGZtdCwgIyNhcmdzKTsgXAorICAgICAgICAgICAgLyogT24gb25lIGhhbmQsIGRvbid0IGxldCB0aGlzIHRhc2sgY29udGludWUgLSBpdCBpcyBsaWtlbHkgdG8gY3Jhc2gvY3JlYXRlIGEgc3lzdGVtIGV4Y2VwdGlvbi4KKyAgICAgICAgICAgICAqIE9uIHRoZSBvdGhlciBoYW5kLCBpdCBtdXN0bid0IGRvIGEgYnVzeSBsb29wIC0gb3RoZXJ3aXNlIGl0IGNhbiBjYXVzZSBsb3dlciBwcmlvcml0eSB0YXNrcyB0byBzdG9wIHJlc3BvbmRpbmcuICovIFwKKyAgICAgICAgICAgIHdoaWxlICgxKSBcCisgICAgICAgICAgICAgICAgYmNtb3NfdXNsZWVwKDEwMDAwMDAwKTsgXAorICAgICAgICB9IFwKKyAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIEJVR19PTihjb25kaXRpb24pICAgICAgQlVHX09OX1BSSU5UKChjb25kaXRpb24pLCAiQlVHIGluICVzICVkIVxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXykKKyNkZWZpbmUgQlVHKCkgICAgICAgICAgICAgICAgICBCVUdfT04oMSkKKyNkZWZpbmUgQlVHX1VOTEVTUyhjb25kaXRpb24pICBCVUdfT04oIShjb25kaXRpb24pKQorCisKKyNkZWZpbmUgQkNNT1NfVFJBQ0VfRVJSKGZtdCwgYXJncy4uLikgXAorICAgIGRvIFwKKyAgICB7IFwKKyAgICAgICAgcHJpbnRmKCBmbXQsICMjIGFyZ3MpOyBcCisgICB9IHdoaWxlICgwKQorCisKKyNkZWZpbmUgYmNtb3NfdnByaW50ZiBwcmludGYKKyNkZWZpbmUgYmNtb3NfY2FsbG9jKHMpIEtNQUxMT0MoKHMpLCAwKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vbGludXgvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2xpbnV4L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NmY3MjYKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2xpbnV4L01ha2VmaWxlCkBAIC0wLDAgKzEsMzEgQEAKKyMgTGludXgga2VybmVsIE9TIGFic3RyYWN0aW9uCisjCitpZmVxICgiJChPU19LRVJORUwpIiwgImxpbnV4IikKKworTU9EX05BTUUgPSBvc19saW51eAorTU9EX1RZUEUgPSBsaW51eF9tb2R1bGUKK01PRF9TVVBQUkVTU19PU19ERVAgPSB5CitNT0RfREVQUyA9IGxsX3BjaWUKKworTU9EX0lOQ19ESVJTID0gJChTUkNfRElSKSAkKFNSQ19ESVIpLy4uCitpZmVxICgiJChSRUxFQVNFX0JVSUxEKSIsICJ5IikKKyAgICBNT0RfSU5DX0RJUlMgKz0gaG9zdF9kcml2ZXIvY29uZmlnCitlbHNlCisgICAgTU9EX0lOQ19ESVJTICs9ICQoU1VCU1lTVEVNKS9vc19hYnN0cmFjdGlvbi8kKFBMQVRGT1JNKSAkKFNVQlNZU1RFTSkvY29uZmlnCitlbmRpZgorCitFWFRSQV9DRkxBR1MgKz0gLURCQ01PU19UUkFDRV9QUklOVEYKKworc3JjcyA9IGJjbW9zX3N5c3RlbS5jIC4uL2JjbW9zX2Vycm5vLmMgLi4vYmNtb3NfY29tbW9uLmMKKworaWZlcSAoIiQoREVCVUcpIiwgInkiKQorCU1PRF9ERUZTCSs9IC1EQkNNT1NfTUVNX0RFQlVHIC1EQkNNT1NfU1lTX1VOSVRURVNUCitlbmRpZgorCisjIElmIGNhbGxlZCBieSBsaW51eCBrZXJuZWwgYnVpbGRlciAtIGFkZCBpbmNsdWRlIHBhdGhzIG1hbnVhbGx5LgorIyBJdCBpcyBub3QgZWxlZ2FudCwgYnV0IHdlJ2xsIG5vdCBoYXZlIG1hbnkgbGludXggbW9kdWxlcworaWZuZXEgKCIkKEtCVUlMRF9TUkMpIiwgIiIpCisJLWluY2x1ZGUgJChPVVRfRElSX0JBU0UpL01ha2VmaWxlLmNvbmZpZy4kKE1PRF9OQU1FKQorZW5kaWYKKworZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vbGludXgvYmNtb3Nfc3lzdGVtLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2xpbnV4L2JjbW9zX3N5c3RlbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNGEwMjMKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL2xpbnV4L2JjbW9zX3N5c3RlbS5jCkBAIC0wLDAgKzEsNTM2IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisvKgorICogYmNtb3Nfc3lzdGVtLmMKKyAqCisgKiBUaGlzIGZpbGUgaW1wbGVtZW50cyBhIHN1YnNldCBvZiBPUyBBYnN0cmFjdGlvbiBzZXJ2aWNlcworICogZm9yIGxpbnV4IGtlcm5lbAorICovCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGNpLWRtYS1jb21wYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZkdGFibGUuaD4KKworI2luY2x1ZGUgPGJjbW9sdF9sbHBjaWUuaD4KKworLyogdGFzayBjb250cm9sIGJsb2NrcyAqLworZXh0ZXJuIFNUQUlMUV9IRUFEKHRhc2tfbGlzdCwgYmNtb3NfdGFzaykgdGFza19saXN0OworCisvKiBnbG9iYWwgT1MgbG9jayAqLworZXh0ZXJuIGJjbW9zX211dGV4IGJjbW9zX3Jlc19sb2NrOworCisvKiBJbml0aWFsaXplIHN5c3RlbSBsaWJyYXJ5ICovCitiY21vc19lcnJubyBiY21vc19zeXNfaW5pdCh2b2lkKQoreworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorLyogQ2xlYW4tdXAgc3lzdGVtIGxpYnJhcnkgKi8KK3ZvaWQgYmNtb3Nfc3lzX2V4aXQodm9pZCkKK3sKK30KKworLyoKKyAqIFRocmVhZCBoYW5kbGVyCisgKi8KK3N0YXRpYyBpbnQgYmNtb3NfdGFza19oYW5kbGVyKHZvaWQgKmRhdGEpCit7CisgICAgYmNtb3NfdGFzayAqdGFzayA9IChiY21vc190YXNrICopZGF0YTsKKyAgICBGX2JjbW9zX3Rhc2tfaGFuZGxlciBoYW5kbGVyOworICAgIGxvbmcgaGFuZGxlcl9kYXRhOworCisgICAgdGFzay0+c3lzX3Rhc2sudCA9IGN1cnJlbnQ7CisKKyAgICBpZiAodGFzay0+cGFybS5oYW5kbGVyKQorICAgIHsKKyAgICAgICAgLyogInRyYWRpdGlvbmFsIHRhc2sgKi8KKyAgICAgICAgaGFuZGxlciA9IHRhc2stPnBhcm0uaGFuZGxlcjsKKyAgICAgICAgaGFuZGxlcl9kYXRhID0gdGFzay0+cGFybS5kYXRhOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiAiaW50ZWdyYXRlZCIgdGFzayAqLworICAgICAgICBoYW5kbGVyID0gYmNtb3NfZGZ0X3Rhc2tfaGFuZGxlcjsKKyAgICAgICAgaGFuZGxlcl9kYXRhID0gKGxvbmcpdGFzazsKKyAgICB9CisgICAgaGFuZGxlcihoYW5kbGVyX2RhdGEpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgX2JjbW9zX2JhY2t0cmFjZSh2b2lkKQoreworICAgIC8qdG9kbyBpbXBsZW1lbnQgdGhpcyovCit9CisKKy8qIENyZWF0ZSBhIG5ldyB0YXNrLgorICogQXR0ZW50aW9uISBQcmlvcml0eSBpcyBpZ25vcmVkLgorICovCitiY21vc19lcnJubyBiY21vc190YXNrX2NyZWF0ZShiY21vc190YXNrICp0YXNrLCBjb25zdCBiY21vc190YXNrX3Bhcm0gKnBhcm0pCit7CisgICAgc3RydWN0IHRhc2tfc3RydWN0ICp0OworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgaWYgKCF0YXNrIHx8ICFwYXJtKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworCisgICAgbWVtc2V0KHRhc2ssIDAsIHNpemVvZigqdGFzaykpOworICAgIHRhc2stPnBhcm0gPSAqcGFybTsKKyAgICBpZiAoIXBhcm0tPmhhbmRsZXIpCisgICAgeworICAgICAgICAvKiBJbml0aWFsaXplIGFuZCBsb2NrIG11dGV4IHRvIHdhaXQgb24gKi8KKyAgICAgICAgcmMgPSBiY21vc19zZW1fY3JlYXRlKCZ0YXNrLT5hY3RpdmVfc2VtLCAwLCB0YXNrLT5wYXJtLmZsYWdzLCBwYXJtLT5uYW1lKTsKKyAgICAgICAgaWYgKHJjKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PU19UUkFDRV9FUlIoIlRhc2sgJXM6IGNhbid0IGNyZWF0ZSBhY3RpdmVfc2VtLiBFcnJvciAlcyAoJWQpXG4iLAorICAgICAgICAgICAgICAgIHRhc2stPnBhcm0ubmFtZSwgYmNtb3Nfc3RyZXJyb3IocmMpLCByYyk7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogQ29weSBuYW1lIHRvIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIG5vdCByZWxlYXNlZCAtIGluIGNhc2UgaXQgd2FzIG9uIHRoZSBzdGFjayAqLworICAgIGlmICh0YXNrLT5wYXJtLm5hbWUpCisgICAgeworICAgICAgICBzdHJuY3B5KHRhc2stPm5hbWUsIHRhc2stPnBhcm0ubmFtZSwgc2l6ZW9mKHRhc2stPm5hbWUpIC0gMSk7CisgICAgICAgIHRhc2stPnBhcm0ubmFtZSA9IHRhc2stPm5hbWU7CisgICAgfQorICAgIGJjbW9zX2Zhc3Rsb2NrX2luaXQoJnRhc2stPmFjdGl2ZV9sb2NrLCAwKTsKKyAgICB0YXNrLT5tYWdpYyA9IEJDTU9TX1RBU0tfTUFHSUM7CisgICAgYmNtb3NfbXV0ZXhfbG9jaygmYmNtb3NfcmVzX2xvY2spOworICAgIFNUQUlMUV9JTlNFUlRfVEFJTCgmdGFza19saXN0LCB0YXNrLCBsaXN0KTsKKyAgICBiY21vc19tdXRleF91bmxvY2soJmJjbW9zX3Jlc19sb2NrKTsKKworICAgIHQgPSBrdGhyZWFkX3J1bihiY21vc190YXNrX2hhbmRsZXIsIHRhc2ssIHBhcm0tPm5hbWUpOworICAgIGlmICh0ID09IEVSUl9QVFIoLUVOT01FTSkpCisgICAgeworICAgICAgICBiY21vc19tdXRleF9sb2NrKCZiY21vc19yZXNfbG9jayk7CisgICAgICAgIFNUQUlMUV9SRU1PVkUoJnRhc2tfbGlzdCwgdGFzaywgYmNtb3NfdGFzaywgbGlzdCk7CisgICAgICAgIGJjbW9zX211dGV4X3VubG9jaygmYmNtb3NfcmVzX2xvY2spOworICAgICAgICB0YXNrLT5tYWdpYyA9IDA7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBEZXN0cm95IHRhc2sgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX3Rhc2tfZGVzdHJveShiY21vc190YXNrICp0YXNrKQoreworICAgIGlmICh0YXNrLT5tYWdpYyAhPSBCQ01PU19UQVNLX01BR0lDKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgaWYgKCF0YXNrLT5zeXNfdGFzay50KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9FTlQ7CisgICAgfQorICAgIHRhc2stPmRlc3Ryb3lfcmVxdWVzdCA9IEJDTU9TX1RSVUU7CisgICAgdGFzay0+bWFnaWMgPSBCQ01PU19UQVNLX01BR0lDX0RFU1RST1lFRDsKKyAgICBiY21vc19tdXRleF9sb2NrKCZiY21vc19yZXNfbG9jayk7CisgICAgU1RBSUxRX1JFTU9WRSgmdGFza19saXN0LCB0YXNrLCBiY21vc190YXNrLCBsaXN0KTsKKyAgICBiY21vc19tdXRleF91bmxvY2soJmJjbW9zX3Jlc19sb2NrKTsKKyAgICAvKiBUaGUgdGFzayBtYXkgYmUgd2FpdGluZyBvbiBzZW1hcGhvcmUuIEtpY2sgaXQgKi8KKyAgICBpZiAoIXRhc2stPnBhcm0uaGFuZGxlcikKKyAgICB7CisgICAgICAgIGJjbW9zX3NlbV9wb3N0KCZ0YXNrLT5hY3RpdmVfc2VtKTsKKyAgICB9CisKKyAgICAvKiBTb21ldGltZXMgYnkgdGhlIHRpbWUgd2UgZ2V0IGhlcmUgdGhlIHRhc2sgaGFzIGFscmVhZHkgYmVlbiBkaXNwb3NlZCBvZi4KKyAgICAgKiBUT0RPOiBpbnZlc3RpZ2F0ZSB3aHkgKi8KKyAgICBpZiAodGFzay0+c3lzX3Rhc2sudC0+Y3JlZCAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga3RocmVhZF9zdG9wKHRhc2stPnN5c190YXNrLnQpOworICAgIH0KKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqIEdldCBjdXJyZW50IHRhc2sKKyAqIFxyZXR1cm5zIHRhc2sgaGFuZGxlIG9yIE5VTEwgaWYgbm90IGluIHRhc2sgY29udGV4dAorICovCitiY21vc190YXNrICpiY21vc190YXNrX2N1cnJlbnQodm9pZCkKK3sKKyAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmt0ID0gY3VycmVudDsKKyAgICBiY21vc190YXNrICp0LCAqdG1wOworCisgICAgU1RBSUxRX0ZPUkVBQ0hfU0FGRSh0LCAmdGFza19saXN0LCBsaXN0LCB0bXApCisgICAgeworICAgICAgICBpZiAodC0+c3lzX3Rhc2sudCA9PSBrdCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gdDsKK30KKworLyogdGltZXIgc2lnbmFsIGhhbmRsZXIgKi8KK3N0YXRpYyB2b2lkIHN5c190aW1lcl9oYW5kbGVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKyAgICBiY21vc19zeXNfdGltZXIgKnRpbWVyID0gKGJjbW9zX3N5c190aW1lciAqKWRhdGE7CisgICAgdGltZXItPmhhbmRsZXIodGltZXItPmRhdGEpOworfQorCisvKiBDcmVhdGUgdGltZXIgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX3N5c190aW1lcl9jcmVhdGUoYmNtb3Nfc3lzX3RpbWVyICp0aW1lciwgYmNtb3Nfc3lzX3RpbWVyX2hhbmRsZXIgaGFuZGxlciwgdm9pZCAqZGF0YSkKK3sKKyAgICBpZiAoIXRpbWVyIHx8ICFoYW5kbGVyKQorICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9QQVJNLCAidGltZXIgJXAsIGhhbmRsZXIgJXBcbiIsIHRpbWVyLCBoYW5kbGVyKTsKKworICAgdGltZXItPmhhbmRsZXIgPSBoYW5kbGVyOworICAgdGltZXItPmRhdGEgPSBkYXRhOworICAgaW5pdF90aW1lcigmdGltZXItPnQpOworICAgdGltZXItPnQuZnVuY3Rpb24gPSBzeXNfdGltZXJfaGFuZGxlcjsKKyAgIHRpbWVyLT50LmRhdGEgPSAodW5zaWduZWQgbG9uZyl0aW1lcjsKKworICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIERlc3Ryb3kgdGltZXIgKi8KK3ZvaWQgYmNtb3Nfc3lzX3RpbWVyX2Rlc3Ryb3koYmNtb3Nfc3lzX3RpbWVyICp0aW1lcikKK3sKKyAgICBkZWxfdGltZXJfc3luYygmdGltZXItPnQpOworfQorCisvKiAoUmUpc3RhcnQgdGltZXIgKi8KK3ZvaWQgYmNtb3Nfc3lzX3RpbWVyX3N0YXJ0KGJjbW9zX3N5c190aW1lciAqdGltZXIsIHVpbnQzMl90IGRlbGF5KQoreworICAgIC8qIENvbnZlcnQgZGVsYXkgdXMgLS0+IHRpY2tzICovCisgICAgdWludDMyX3QgdGlja3MgPSB1c2Vjc190b19qaWZmaWVzKGRlbGF5KTsKKyAgICBtb2RfdGltZXIoJnRpbWVyLT50LCBqaWZmaWVzICsgdGlja3MpOworfQorCisvKiBTdG9wIHRpbWVyIGlmIHJ1bm5pbmcgKi8KK3ZvaWQgYmNtb3Nfc3lzX3RpbWVyX3N0b3AoYmNtb3Nfc3lzX3RpbWVyICp0aW1lcikKK3sKKyAgICAvKiBObyBuZWVkIHRvIGRvIGFueXRoaW5nLiBTeXN0ZW0gdGltZXIgaXNuJ3QgcnVubmluZyAqLworfQorCit2b2lkIGJjbW9zX3VzbGVlcCh1aW50MzJfdCB1KQoreworICAgIGlmICh1ID49IDEwMDAwKQorICAgICAgICBtc2xlZXAoKHUgKyA5OTkpIC8gMTAwMCk7CisgICAgZWxzZQorICAgICAgICB1ZGVsYXkodSk7Cit9CisKKy8qCisgKiBTZW1hcGhvcmUKKyAqLworCisvKiBEZWNyZW1lbnQgc2VtYXBob3JlIGNvdW50ZXIuIFdhaXQgaWYgdGhlIGNvdW50ZXIgaXMgMC4KKyAqLworYmNtb3NfZXJybm8gYmNtb3Nfc2VtX3dhaXQoYmNtb3Nfc2VtICpzZW0sIHVpbnQzMl90IHRpbWVvdXQpCit7CisgICAgaWYgKHRpbWVvdXQpCisgICAgeworICAgICAgICBpZiAodGltZW91dCAhPSBCQ01PU19XQUlUX0ZPUkVWRVIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChkb3duX3RpbWVvdXQoJnNlbS0+cywgdXNlY3NfdG9famlmZmllcyh0aW1lb3V0KSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChkb3duX2ludGVycnVwdGlibGUoJnNlbS0+cykpCisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgLyogMCB0aW1lb3V0ICovCisgICAgaWYgKGRvd25fdHJ5bG9jaygmc2VtLT5zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PRU5UOworICAgIH0KKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworCisvKgorICogQnl0ZSBtZW1vcnkgcG9vbAorICovCisKKy8qIE1lbW9yeSBibG9jayBoZWFkZXIgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9zX2J5dGVfbWVtYmxrCit7CisgICAgYmNtb3NfYnl0ZV9wb29sICpwb29sOyAgICAgIC8qKiBwb29sIHRoYXQgb3ducyB0aGUgYmxvY2sgKi8KKyAgICB1aW50MzJfdCBzaXplOyAgICAgICAgICAgICAgLyoqIGJsb2NrIHNpemUgKGJ5dGVzKSBpbmNsdWRpbmcgYmNtb3NfYnl0ZV9tZW1ibGsgaGVhZGVyICovCisjaWZkZWYgQkNNT1NfTUVNX0RFQlVHCisgICAgdWludDMyX3QgbWFnaWM7ICAgICAgICAgICAgIC8qKiBtYWdpYyBudW1iZXIgKi8KKyNkZWZpbmUgQkNNT1NfTUVNX01BR0lDX0FMTE9DICAgKCgnbSc8PDI0KSB8ICgnYicgPDwgMTYpIHwgKCdsJyA8PCA4KSB8ICdrJykKKyNkZWZpbmUgQkNNT1NfTUVNX01BR0lDX0ZSRUUgICAgKCgnbSc8PDI0KSB8ICgnYicgPDwgMTYpIHwgKCdsJyA8PCA4KSB8ICd+JykKKyNlbmRpZgorfSBiY21vc19ieXRlX21lbWJsazsKKworLyogQ3JlYXRlIGJ5dGUgbWVtb3J5IHBvb2wgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX2J5dGVfcG9vbF9jcmVhdGUoYmNtb3NfYnl0ZV9wb29sICpwb29sLCBjb25zdCBiY21vc19ieXRlX3Bvb2xfcGFybSAqcGFybSkKK3sKKyAgICBpZiAoIXBvb2wgfHwgIXBhcm0pCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9QQVJNLCAicG9vbCAlcCwgcGFybSAlcFxuIiwgcG9vbCwgcGFybSk7CisgICAgfQorCisgICAgQkNNX01FTVpFUk9fU1RSVUNUKHBvb2wpOworICAgIHBvb2wtPnBhcm0gPSAqcGFybTsKKyAgICBpZiAoIXBvb2wtPnBhcm0uc2l6ZSkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX1BBUk0sICJzaXplICV1XG4iLCBwYXJtLT5zaXplKTsKKyAgICB9CisjaWZkZWYgQkNNT1NfTUVNX0RFQlVHCisgICAgcG9vbC0+bWFnaWMgPSBCQ01PU19CWVRFX1BPT0xfVkFMSUQ7CisjZW5kaWYKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogRGVzdHJveSBtZW1vcnkgcG9vbCAqLworYmNtb3NfZXJybm8gYmNtb3NfYnl0ZV9wb29sX2Rlc3Ryb3koYmNtb3NfYnl0ZV9wb29sICpwb29sKQoreworICAgIGlmIChwb29sLT5hbGxvY2F0ZWQpCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9TVEFURSwgIiV1IGJ5dGVzIG9mIG1lbW9yeSBhcmUgc3RpbGwgYWxsb2NhdGVkIGZyb20gdGhlIHBvb2wgJXNcbiIsCisgICAgICAgICAgICBwb29sLT5hbGxvY2F0ZWQsIHBvb2wtPnBhcm0ubmFtZSk7CisgICAgfQorI2lmZGVmIEJDTU9TX01FTV9ERUJVRworICAgIHBvb2wtPm1hZ2ljID0gQkNNT1NfQllURV9QT09MX0RFTEVURUQ7CisjZW5kaWYKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogQWxsb2NhdGUgbWVtb3J5IGZyb20gbWVtb3J5IHBvb2wgKi8KK3ZvaWQgKmJjbW9zX2J5dGVfcG9vbF9hbGxvYyhiY21vc19ieXRlX3Bvb2wgKnBvb2wsIHVpbnQzMl90IHNpemUpCit7CisgICAgYmNtb3NfYnl0ZV9tZW1ibGsgKmJsazsKKyAgICB1aW50MzJfdCBieXRlX3NpemU7CisgICAgdm9pZCAqcHRyOworCisjaWZkZWYgQkNNT1NfTUVNX0RFQlVHCisgICAgQlVHX09OKHBvb2wtPm1hZ2ljICE9IEJDTU9TX0JZVEVfUE9PTF9WQUxJRCk7CisjZW5kaWYKKworICAgIGlmIChzaXplICsgcG9vbC0+YWxsb2NhdGVkID4gcG9vbC0+cGFybS5zaXplKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGJ5dGVfc2l6ZSA9IHNpemUgKyBzaXplb2YoYmNtb3NfYnl0ZV9tZW1ibGspOworI2lmZGVmIEJDTU9TX01FTV9ERUJVRworICAgIGJ5dGVfc2l6ZSArPSBzaXplb2YodWludDMyX3QpOyAvKiBibG9jayBzdWZmaXggKi8KKyNlbmRpZgorICAgIC8qIFRvRG86IE1haW50YWluIExMIG9mIGFsbG9jYXRlZCBibG9ja3MgKi8KKyAgICBibGsgPSAoYmNtb3NfYnl0ZV9tZW1ibGsgKiliY21vc19hbGxvYyhieXRlX3NpemUpOworICAgIGlmICghYmxrKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwdHIgPSAodm9pZCAqKShibGsgKyAxKTsKKyAgICBibGstPnNpemUgPSBieXRlX3NpemU7CisgICAgcG9vbC0+YWxsb2NhdGVkICs9IGJ5dGVfc2l6ZTsKKyAgICBibGstPnBvb2wgPSBwb29sOworI2lmZGVmIEJDTU9TX01FTV9ERUJVRworICAgIGJsay0+bWFnaWMgPSBCQ01PU19NRU1fTUFHSUNfQUxMT0M7CisgICAgKih1aW50MzJfdCAqKSgobG9uZylibGsgKyBieXRlX3NpemUgLSBzaXplb2YodWludDMyX3QpKSA9IEJDTU9TX01FTV9NQUdJQ19BTExPQzsKKyNlbmRpZgorCisgICAgcmV0dXJuIHB0cjsKK30KKworLyogUmVsZWFzZSBtZW1vcnkgYWxsb2NhdGVkIHVzaW5nIGJjbW9zX2J5dGVfcG9vbF9hbGxvYygpICovCit2b2lkIGJjbW9zX2J5dGVfcG9vbF9mcmVlKHZvaWQgKnB0cikKK3sKKyAgICBiY21vc19ieXRlX21lbWJsayAqYmxrOworICAgIGJjbW9zX2J5dGVfcG9vbCAqcG9vbDsKKworICAgIEJVR19PTighcHRyKTsKKyAgICBibGsgPSAoYmNtb3NfYnl0ZV9tZW1ibGsgKikoKGxvbmcpcHRyIC0gc2l6ZW9mKGJjbW9zX2J5dGVfbWVtYmxrKSk7CisgICAgcG9vbCA9IGJsay0+cG9vbDsKKyNpZmRlZiBCQ01PU19NRU1fREVCVUcKKyAgICBCVUdfT04ocG9vbC0+bWFnaWMgIT0gQkNNT1NfQllURV9QT09MX1ZBTElEKTsKKyAgICBCVUdfT04oYmxrLT5tYWdpYyAhPSBCQ01PU19NRU1fTUFHSUNfQUxMT0MpOworICAgIEJVR19PTigqKHVpbnQzMl90ICopKChsb25nKWJsayArIGJsay0+c2l6ZSAtIHNpemVvZih1aW50MzJfdCkpICE9IEJDTU9TX01FTV9NQUdJQ19BTExPQyk7CisgICAgYmxrLT5tYWdpYyA9IEJDTU9TX01FTV9NQUdJQ19GUkVFOworI2VuZGlmCisgICAgcG9vbC0+YWxsb2NhdGVkIC09IGJsay0+c2l6ZTsKKyAgICBiY21vc19mcmVlKGJsayk7Cit9CisKKy8qCisgKiBETUEtYWJsZSBtZW1vcnkgbWFuYWdlbWVudAorICovCisKKy8qIERtYS1hYmxlIGJsb2NrIGhlYWRlciAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKyAgICBkbWFfYWRkcl90IGRtYV9oYW5kbGU7CisgICAgdWludDMyX3Qgc2l6ZTsKK30gYmNtb3NfZG1hX21lbV9oZHI7CisKKy8qIEFsbG9jYXRlIERNQS1hYmxlIG1lbW9yeSAqLwordm9pZCAqYmNtb3NfZG1hX2FsbG9jKHVpbnQ4X3QgZGV2aWNlLCB1aW50MzJfdCBzaXplKQoreworICAgIGJjbW9zX2RtYV9tZW1faGRyIGhkciA9CisgICAgeworICAgICAgICAucGRldiA9IChzdHJ1Y3QgcGNpX2RldiAqKWJjbV9sbF9wY2llX2Rldl9nZXQoZGV2aWNlKSwKKyAgICAgICAgLnNpemUgPSBzaXplCisgICAgfTsKKyAgICB2b2lkICpwdHI7CisKKyAgICBpZiAoIWhkci5wZGV2KQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcHRyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoaGRyLnBkZXYsIHNpemUgKyBzaXplb2YoYmNtb3NfZG1hX21lbV9oZHIpLCAmaGRyLmRtYV9oYW5kbGUpOworICAgIGlmIChwdHIpCisgICAgeworICAgICAgICBtZW1jcHkocHRyLCAmaGRyLCBzaXplb2YoaGRyKSk7CisgICAgfQorICAgIHJldHVybiAodm9pZCAqKSgobG9uZylwdHIgKyBzaXplb2YoaGRyKSk7Cit9CisKKy8qIFJlbGVhc2UgRE1BLWFibGUgbWVtb3J5ICovCit2b2lkIGJjbW9zX2RtYV9mcmVlKHVpbnQ4X3QgZGV2aWNlLCB2b2lkICpwdHIpCit7CisgICAgYmNtb3NfZG1hX21lbV9oZHIgaGRyOworCisgICAgLyogU3RlcCBiYWNrIHRvIHByZWZpeCBhcmVhICovCisgICAgcHRyID0gKHZvaWQgKikoKGxvbmcpcHRyIC0gc2l6ZW9mKGhkcikpOworICAgIG1lbWNweSgmaGRyLCBwdHIsIHNpemVvZihoZHIpKTsKKworICAgIC8qIFNhbml0eSBjaGVjayAqLworICAgIGlmICghaGRyLnBkZXYgfHwgaGRyLnBkZXYgIT0gYmNtX2xsX3BjaWVfZGV2X2dldChkZXZpY2UpKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCIhISFBdHRlbXB0IHRvIHJlbGVhc2UgaW5zYW5lIERNQS1hYmxlIHBvaW50ZXIuIHB0cj0lcCBwZGV2PSVwLyVwXG4iLAorICAgICAgICAgICAgcHRyLCBoZHIucGRldiwgYmNtX2xsX3BjaWVfZGV2X2dldChkZXZpY2UpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBwY2lfZnJlZV9jb25zaXN0ZW50KGhkci5wZGV2LCBoZHIuc2l6ZSwgcHRyLCBoZHIuZG1hX2hhbmRsZSk7Cit9CisKKy8qCisgKiBQcmludCB0byB0aGUgY3VycmVudCBwcm9jZXNzJyBzdGRvdXQKKyAqLworCisjaWZuZGVmIFNURE9VVF9GSUxFTk8KKyNkZWZpbmUgU1RET1VUX0ZJTEVOTyAxCisjZW5kaWYKKworc3RhdGljIGludCBfYmNtb3Nfd3JpdGUoc3RydWN0IGZpbGUgKmZkLCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4pCit7CisgICAgbW1fc2VnbWVudF90IG9sZGZzOworICAgIGludCBsZW4wID0gbGVuOworICAgIG9sZGZzID0gZ2V0X2ZzKCk7CisgICAgc2V0X2ZzKEtFUk5FTF9EUyk7CisgICAgd2hpbGUobGVuKQorICAgIHsKKyAgICAgICAgaW50IGx3OworICAgICAgICBsdyA9IHZmc193cml0ZShmZCwgKGNoYXIgKilidWYsIGxlbiwgJmZkLT5mX3Bvcyk7CisgICAgICAgIGlmIChsdyA8IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgbGVuIC09IGx3OworICAgICAgICBpZiAobGVuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobXNsZWVwX2ludGVycnVwdGlibGUoMSkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBidWYgKz0gbHc7CisgICAgICAgIH0KKyAgICB9CisgICAgc2V0X2ZzKG9sZGZzKTsKKyAgICByZXR1cm4gKGxlbjAgLSBsZW4pOworfQorCitpbnQgYmNtb3Nfc3lzX3ZwcmludGYoY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCit7CisgICAgc3RydWN0IGZpbGUgKmY7CisgICAgaW50IHJjPTA7CisKKyAgICAvKiBHZXQgc3Rkb3V0IGZpbGUgaGFuZGxlIGlmIGFueSAqLworICAgIGlmIChpbl9pbnRlcnJ1cHQoKSB8fCAhY3VycmVudCB8fCAhY3VycmVudC0+ZmlsZXMpCisgICAgICAgIGYgPSAwOworICAgIGVsc2UKKyAgICAgICAgZiA9IGZjaGVjayhTVERPVVRfRklMRU5PKTsKKyAgICBpZiAoIWYpCisgICAgeworICAgICAgICAgcmMgPSB2cHJpbnRrKGZvcm1hdCwgYXJncyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGNoYXIgcHJpbnRidWZbMTAyNF07CisgICAgICAgIGNoYXIgKnAxPXByaW50YnVmLCAqcDI7CisgICAgICAgIHZzY25wcmludGYocHJpbnRidWYsIHNpemVvZihwcmludGJ1ZiktMSwgZm9ybWF0LCBhcmdzKTsKKyAgICAgICAgcHJpbnRidWZbc2l6ZW9mKHByaW50YnVmKS0xXT0wOworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBwMiA9IHN0cmNocihwMSwgJ1xuJyk7CisgICAgICAgICAgICBpZiAocDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmMgKz0gX2JjbW9zX3dyaXRlKGYsICh1bnNpZ25lZCBjaGFyKikgcDEsIHAyLXAxKzEpOworICAgICAgICAgICAgICAgIHJjICs9IF9iY21vc193cml0ZShmLCAodW5zaWduZWQgY2hhciopIlxyIiwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmMgKz0gX2JjbW9zX3dyaXRlKGYsICh1bnNpZ25lZCBjaGFyKilwMSwgc3RybGVuKHAxKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwMSA9IHAyICsgMTsKKyAgICAgICAgfSB3aGlsZShwMik7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGludCBvc19saW51eF9tb2R1bGVfaW5pdCh2b2lkKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgcmMgPSBiY21vc19pbml0KCk7CisKKyAgICByZXR1cm4gcmMgPyAtRUlOVkFMIDogMDsKK30KKworc3RhdGljIHZvaWQgb3NfbGludXhfbW9kdWxlX2V4aXQodm9pZCkKK3sKKyAgICBiY21vc19leGl0KCk7Cit9CisKK21vZHVsZV9pbml0KG9zX2xpbnV4X21vZHVsZV9pbml0KTsKK21vZHVsZV9leGl0KG9zX2xpbnV4X21vZHVsZV9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJPUyBBYnN0cmFjdGlvbiIpOworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworCitFWFBPUlRfU1lNQk9MKGJjbW9zX3Rhc2tfY3JlYXRlKTsKK0VYUE9SVF9TWU1CT0woYmNtb3NfdGFza19kZXN0cm95KTsKK0VYUE9SVF9TWU1CT0woYmNtb3NfdGFza19jdXJyZW50KTsKK0VYUE9SVF9TWU1CT0woYmNtb3Nfc2VtX3dhaXQpOworRVhQT1JUX1NZTUJPTChiY21vc19zeXNfdHJhY2VfbGV2ZWwpOworRVhQT1JUX1NZTUJPTChiY21vc191c2xlZXApOworRVhQT1JUX1NZTUJPTChiY21vc19ieXRlX3Bvb2xfY3JlYXRlKTsKK0VYUE9SVF9TWU1CT0woYmNtb3NfYnl0ZV9wb29sX2Rlc3Ryb3kpOworRVhQT1JUX1NZTUJPTChiY21vc19ieXRlX3Bvb2xfYWxsb2MpOworRVhQT1JUX1NZTUJPTChiY21vc19ieXRlX3Bvb2xfZnJlZSk7CitFWFBPUlRfU1lNQk9MKGJjbW9zX3N5c192cHJpbnRmKTsKK0VYUE9SVF9TWU1CT0woYmNtb3NfZG1hX2FsbG9jKTsKK0VYUE9SVF9TWU1CT0woYmNtb3NfZG1hX2ZyZWUpOworRVhQT1JUX1NZTUJPTChfYmNtb3NfYmFja3RyYWNlKTsKK0VYUE9SVF9TWU1CT0woc3dfZXJyb3JfaGFuZGxlcik7CitFWFBPUlRfU1lNQk9MKGJjbW9zX2V4aXQpOwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9saW51eC9iY21vc19zeXN0ZW0uaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vbGludXgvYmNtb3Nfc3lzdGVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZmMzZmZQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vbGludXgvYmNtb3Nfc3lzdGVtLmgKQEAgLTAsMCArMSw1MTkgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKy8qCisgKiBiY21vc19zeXN0ZW0uaAorICogTWFwbGUgU3lzdGVtIFNlcnZpY2VzCisgKiBwb3NpeCBwb3J0OiBzaW11bGF0aW9uCisgKi8KKworI2lmbmRlZiBCQ01PU19TWVNURU1fSF8KKyNkZWZpbmUgQkNNT1NfU1lTVEVNX0hfCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjZGVmaW5lIEJDTU9TX0lSUV9TSU5HTEUgICAgMAorI2RlZmluZSBCQ01PU19JUlFfU0hBUkVEICAgIElSUUZfU0hBUkVECisKKy8qIFJlLWRlZmluZSBHTlUgdHlwZW9mIGFzIElTTyBfX3R5cGVvZl9fICovCisjZGVmaW5lIHR5cGVvZiBfX3R5cGVvZl9fCisKKyNkZWZpbmUgc3RydG9sKHMscCxiKSBzaW1wbGVfc3RydG9sKHMscCxiKQorCisvKiBTcGVjaWZ5IGhlcmUgd2hpY2ggc3lzdGVtIGZ1bmN0aW9ucyBhcmUgaW5saW5lZCAqLworCisjZGVmaW5lIEJDTU9TX0ZBU1RMT0NLX0lOTElORQorI2RlZmluZSBCQ01PU19TRU1fSU5MSU5FCisjZGVmaW5lIEJDTU9TX01VVEVYX0lOTElORQorCisjaWZkZWYgRU5BQkxFX0xPRworI2RlZmluZSBCQ01PU19UUkFDRV9JTl9ERVZfTE9HCisjZW5kaWYKKworI2lmICFkZWZpbmVkKEJDTU9TX1RSQUNFX0lOX0RFVl9MT0cpICYmICFkZWZpbmVkKEJDTU9TX1RSQUNFX1BSSU5URikKKyNkZWZpbmUgQkNNT1NfVFJBQ0VfUFJJTlRGCisjZW5kaWYKKworLyogI2RlZmluZSBCQ01PU19CWVRFX1BPT0xfQUxMT0NfRlJFRV9JTkxJTkUgKi8KKyNkZWZpbmUgQkNNT1NfTUFMTE9DX0ZSRUVfSU5MSU5FCisvKiAjZGVmaW5lIEJDTU9TX0NBTExPQ19JTkxJTkUgKi8KKyNkZWZpbmUgQkNNT1NfQlVGX09TX1NQRUNJRklDCisjZGVmaW5lIEJDTU9TX0JVRl9JTkxJTkUKKyNkZWZpbmUgQkNNT1NfSU5URVJSVVBUX0lOTElORQorI2RlZmluZSBCQ01PU19USU1FU1RBTVBfSU5MSU5FCisvKiAjZGVmaW5lIEJDTU9TX0RNQV9BTExPQ19GUkVFX0lOTElORSAqLworI2RlZmluZSBCQ01PU19WSVJUX1RPX1BIWVNfSU5MSU5FCisjZGVmaW5lIEJDTU9TX0NBQ0hFX0lOTElORQorLyogVW5jb21tZW50dGhlIGZvbGxvd2luZyBsaW5lIGlmIGgvdyBzdXBwb3J0cyBETUEgY2FjaGUgY29oZXJlbmN5ICovCisvKiAjZGVmaW5lIEJDTU9TX0RNQV9DQUNIRV9DT0hFUkVOQ1kgKi8KKworLyogZ2V0Y2hhciwgcHV0Y2hhciBhcmUgbm90IHN1cHBvcnQuIGRlZmluZSBhcyBpbmxpbmUgYW5kIHByb3ZpdWRlIGR1bW15IHRhcmdldHMgKi8KKyNkZWZpbmUgQkNNT1NfR0VUQ0hBUl9JTkxJTkUKKyNkZWZpbmUgQkNNT1NfUFVUQ0hBUl9JTkxJTkUKKworI2luY2x1ZGUgImJjbW9zX2NvbW1vbi5oIgorCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtX3BjaV93cml0ZTMyKHZvbGF0aWxlIHVpbnQzMl90ICphZGRyZXNzLCB1aW50MzJfdCB2YWx1ZSkKK3sKKyAgICB3cml0ZWwodmFsdWUsIGFkZHJlc3MpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGJjbV9wY2lfcmVhZDMyKGNvbnN0IHZvbGF0aWxlIHVpbnQzMl90ICphZGRyZXNzKQoreworCXJldHVybiByZWFkbChhZGRyZXNzKTsKK30KKworCit2b2lkIF9iY21vc19iYWNrdHJhY2Uodm9pZCk7CitpbnQgYmNtb3Nfc3lzX3ZwcmludGYoY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpOworCisvKgorICogTWVtb3J5IGFsbG9jYXRpb24KKyAqLworCisvKiBBbGxvY2F0ZSBETUFhYmxlIG1lbW9yeSBmcm9tIHRoZSBtYWluIGhlYXAgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqYmNtb3NfYWxsb2ModWludDMyX3Qgc2l6ZSkKK3sKKyAgICByZXR1cm4ga21hbGxvYyhzaXplLCBHRlBfRE1BKTsKK30KKworLyogUmVsZWFzZSBtZW1vcnkgdG8gdGhlIG1haW4gcG9vbCAqLworc3RhdGljIGlubGluZSB2b2lkIGJjbW9zX2ZyZWUodm9pZCAqcHRyKQoreworICAgIHJldHVybiBrZnJlZShwdHIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKmJjbW9zX2FsbG9jX25vdF9jYWNoZShpbnQzMl90IHNpemUpCit7CisJcmV0dXJuIGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgYmNtb3NfZnJlZV9ub3RfY2FjaGUodm9pZCAqZGVzdCkKK3sKKwlrZnJlZShkZXN0KTsKK30KKy8qCisgKiBTeW5jaHJvbml6YXRpb24KKyAqLworCisvKiBNdXRleCBjb250cm9sIGJsb2NrICovCitzdHJ1Y3QgYmNtb3NfbXV0ZXgKK3sKKyAgICBzdHJ1Y3QgbXV0ZXggbTsgICAgICAgICAgICAgLyoqPCBsaW51eCBrZXJuZWwgbXV0ZXggKi8KK307CisKKy8qIENyZWF0ZSByZWN1cnNpdmUgbXV0ZXggKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfZXJybm8gYmNtb3NfbXV0ZXhfY3JlYXRlKGJjbW9zX211dGV4ICptdXRleCwgdWludDMyX3QgZmxhZ3MsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgbXV0ZXhfaW5pdCgmbXV0ZXgtPm0pOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBEZXN0cm95IG11dGV4ICovCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtb3NfbXV0ZXhfZGVzdHJveShiY21vc19tdXRleCAqbXV0ZXgpCit7CisgICAgbXV0ZXhfZGVzdHJveSgmbXV0ZXgtPm0pOworfQorCisvKiBMb2NrIG11dGV4ICovCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtb3NfbXV0ZXhfbG9jayhiY21vc19tdXRleCAqbXV0ZXgpCit7CisgICAgbXV0ZXhfbG9jaygmbXV0ZXgtPm0pOworfQorCisvKiBSZWxlYXNlIG11dGV4ICovCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtb3NfbXV0ZXhfdW5sb2NrKGJjbW9zX211dGV4ICptdXRleCkKK3sKKyAgICBtdXRleF91bmxvY2soJm11dGV4LT5tKTsKK30KKworLyoqIEZhc3QgbG9jayBjb250cm9sIGJsb2NrICovCitzdHJ1Y3QgYmNtb3NfZmFzdGxvY2sKK3sKKyAgICBzcGlubG9ja190IG07Cit9OworCisvKiogRmFzdGxvY2sgaW5pdGlhbGl6ZXIuIENhbiBiZSB1c2VkIGluc3RlYWQgb2YgY2FsbGluZyBiY21vc19mYXN0bG9ja19pbml0KCkgKi8KKyNkZWZpbmUgQkNNT1NfRkFTVExPQ0tfSU5JVElBTElaRVIgICAgICB7IFNQSU5MT0NLX1VOTE9DS0VEIH0KKworLyogSW5pdCBmYXN0bG9jayAqLworc3RhdGljIGlubGluZSB2b2lkIGJjbW9zX2Zhc3Rsb2NrX2luaXQoYmNtb3NfZmFzdGxvY2sgKmxvY2ssIHVpbnQzMl90IGZsYWdzKQoreworICAgIHNwaW5fbG9ja19pbml0KCZsb2NrLT5tKTsKK30KKworLyogVGFrZSBmYXN0IGxvY2sgKi8KK3N0YXRpYyBpbmxpbmUgbG9uZyBiY21vc19mYXN0bG9ja19sb2NrKGJjbW9zX2Zhc3Rsb2NrICpsb2NrKQoreworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2stPm0sIGZsYWdzKTsKKyAgICByZXR1cm4gKGxvbmcpZmxhZ3M7Cit9CisKKy8qIFJlbGVhc2UgZmFzdCBsb2NrICovCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKGJjbW9zX2Zhc3Rsb2NrICpsb2NrLCBsb25nIGZsYWdzKQoreworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2stPm0sICh1bnNpZ25lZCBsb25nKWZsYWdzKTsKK30KKworLyoqIFNlbWFwaG9yZSBjb250cm9sIGJsb2NrICovCitzdHJ1Y3QgYmNtb3Nfc2VtCit7CisgICAgc3RydWN0IHNlbWFwaG9yZSBzOyAgICAgIC8qKjwgbGludXgga2VybmVsIHNlbWFwaG9yZSAqLworfTsKKworLyogQ3JlYXRlIHNlbWFwaG9yZSAqLworc3RhdGljIGlubGluZSBiY21vc19lcnJubyBiY21vc19zZW1fY3JlYXRlKGJjbW9zX3NlbSAqc2VtLCB1aW50MzJfdCBjb3VudCwgdWludDMyX3QgZmxhZ3MsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgc2VtYV9pbml0KCZzZW0tPnMsIGNvdW50KTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogRGVzdHJveSBzZW1hcGhvcmUgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBiY21vc19zZW1fZGVzdHJveShiY21vc19zZW0gKnNlbSkKK3sKK30KKworLyogV2FpdCBmb3Igc2VtYXBob3JlICovCitiY21vc19lcnJubyBiY21vc19zZW1fd2FpdChiY21vc19zZW0gKnNlbSwgdWludDMyX3QgdGltZW91dCk7CisKKy8qIEluY3JlbWVudCBzZW1hcGhvcmUgY291bnRlciAqLworc3RhdGljIGlubGluZSB2b2lkIGJjbW9zX3NlbV9wb3N0KGJjbW9zX3NlbSAqc2VtKQoreworICAgIHVwKCZzZW0tPnMpOworfQorCisvKgorICogVGltZXJzCisgKi8KKworLyoqIFN5c3RlbSB0aW1lciAqLworc3RydWN0IGJjbW9zX3N5c190aW1lcgoreworICAgIHN0cnVjdCB0aW1lcl9saXN0IHQ7ICAgICAgICAgICAgICAgIC8qKjwgbGludXggdGltZXIgKi8KKyAgICBiY21vc19zeXNfdGltZXJfaGFuZGxlciBoYW5kbGVyOyAgICAvKio8IFRpbWVyIGhhbmRsZXIgKi8KKyAgICB2b2lkICpkYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFBhcmFtZXRlciB0byBiZSBwYXNzZWQgdG8gdGhlIGhhbmRsZXIgKi8KK307CisKKy8qIEdldCBjdXJyZW50IHRpbWVzdGFtcCAodXMpICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGJjbW9zX3RpbWVzdGFtcCh2b2lkKQoreworICAgIHN0cnVjdCB0aW1lc3BlYyB1cHRpbWU7CisgICAgZG9fcG9zaXhfY2xvY2tfbW9ub3RvbmljX2dldHRpbWUoJnVwdGltZSk7CisgICAgbW9ub3RvbmljX3RvX2Jvb3RiYXNlZCgmdXB0aW1lKTsKKyAgICByZXR1cm4gdXB0aW1lLnR2X3NlYyAqIFVTRUNfUEVSX1NFQyArIHVwdGltZS50dl9uc2VjIC8gTlNFQ19QRVJfVVNFQzsKK30KKworLyogR2V0IGN1cnJlbnQgdGltZXN0YW1wICh1cykgKi8KK3N0YXRpYyBpbmxpbmUgdWludDY0X3QgYmNtb3NfdGltZXN0YW1wNjQodm9pZCkKK3sKKyAgICBzdHJ1Y3QgdGltZXNwZWMgdXB0aW1lOworICAgIGRvX3Bvc2l4X2Nsb2NrX21vbm90b25pY19nZXR0aW1lKCZ1cHRpbWUpOworICAgIG1vbm90b25pY190b19ib290YmFzZWQoJnVwdGltZSk7CisgICAgcmV0dXJuICh1aW50NjRfdCl1cHRpbWUudHZfc2VjICogVVNFQ19QRVJfU0VDICsgKHVpbnQ2NF90KXVwdGltZS50dl9uc2VjIC8gTlNFQ19QRVJfVVNFQzsKK30KKworLyoKKyAqIFRhc2sgY29udHJvbAorICovCisKKy8qKiBPUy1zcGVjaWZpYyB0YXNrIGNvbnRyb2wgYmxvY2sgZXh0ZW5zaW9uICovCit0eXBlZGVmIHN0cnVjdCBiY21vc19zeXNfdGFzaworeworICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdDsKK30gYmNtb3Nfc3lzX3Rhc2s7CisKKy8qKiBNZW1vcnkgcG9vbCBjb250cm9sIGJsb2NrICovCitzdHJ1Y3QgYmNtb3NfYnl0ZV9wb29sCit7CisgICAgYmNtb3NfYnl0ZV9wb29sX3Bhcm0gcGFybTsgIC8qKjwgUG9vbCBwYXJhbWV0ZXJzICovCisgICAgdWludDMyX3QgYWxsb2NhdGVkOyAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGJ5dGVzIGFsbG9jYXRlZCAqLworI2lmZGVmIEJDTU9TX01FTV9ERUJVRworICAgIHVpbnQzMl90IG1hZ2ljOyAgICAgICAgICAgICAvKio8IG1hZ2ljIG51bWJlciAqLworI2RlZmluZSBCQ01PU19CWVRFX1BPT0xfVkFMSUQgICAgICAgICAgICgoJ2InPDwyNCkgfCAoJ3knIDw8IDE2KSB8ICgncCcgPDwgOCkgfCAnbycpCisjZGVmaW5lIEJDTU9TX0JZVEVfUE9PTF9ERUxFVEVEICAgICAgICAgKCgnYic8PDI0KSB8ICgneScgPDwgMTYpIHwgKCdwJyA8PCA4KSB8ICd+JykKKyNlbmRpZgorfTsKKworLyogVHJhbnNwb3J0IC8gbmV0d29yayBidWZmZXIgc2VydmljZSAqLworZXh0ZXJuIHVpbnQzMl90IGJjbW9zX2J1Zl9kZWZhdWx0X2hlYWRyb29tOworCisvKgorICogTmV0d29yayAvIHRyYW5zcG9ydCBidWZmZXIKKyAqLworCisvKiBEYXRhIGFsaWdubWVudC4gU2hvdWxkIGJlIGEgbWF4IGxmIEwxLCBMMiBjYWNoZSBsaW5lIHNpemUgKi8KKyNkZWZpbmUgQkNNT1NfQlVGX0RBVEFfQUxJR05NRU5UICAgICAgICAxMjgKKworLyogRW5jYXBzdWxhdGVkIHNrYiAqLworc3RydWN0IGJjbW9zX2J1ZgoreworICAgIHN0cnVjdCBza19idWZmIHNrYjsKK307CisKKy8qIEJ1ZmZlciBsaXN0ICovCit0eXBlZGVmIHN0cnVjdCBza19idWZmX2hlYWQgYmNtb3NfYnVmX3F1ZXVlOworCisvKiBBbGxvY2F0ZSBidWZmZXIgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfYnVmICpiY21vc19idWZfYWxsb2ModWludDMyX3Qgc2l6ZSkKK3sKKyAgICAvKiBBbGxvY2F0ZSBleHRyYSAyICogQkNNT1NfQlVGX0RBVEFfQUxJR05NRU5UIHRvIG1ha2Ugc3VyZSB0aGF0IG5laXRoZXIgZGF0YSBzdGFydCBub3IgZW5kCisgICAgICogZW5kIHVwIGluIHRoZSBtaWRkbGUgb2YgY2FjaGUgbGluZQorICAgICAqLworICAgIHN0cnVjdCBza19idWZmICpza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemUgKyBCQ01UUl9CVUZfRVhUUkFfSEVBRFJPT00gKyAyICogQkNNT1NfQlVGX0RBVEFfQUxJR05NRU5UIC0gMSk7CisgICAgaWYgKCFza2IpCisgICAgICAgIHJldHVybiBOVUxMOworI2lmIEJDTVRSX0JVRl9FWFRSQV9IRUFEUk9PTQorICAgIHNrYl9yZXNlcnZlKHNrYiwgQkNNVFJfQlVGX0VYVFJBX0hFQURST09NKTsKKyNlbmRpZgorICAgIGlmICgobG9uZylza2ItPmRhdGEgJiAoQkNNT1NfQlVGX0RBVEFfQUxJR05NRU5UIC0gMSkpCisgICAgeworICAgICAgICBza2JfcmVzZXJ2ZShza2IsIEJDTU9TX0JVRl9EQVRBX0FMSUdOTUVOVCAtICgobG9uZylza2ItPmRhdGEgJiAoQkNNT1NfQlVGX0RBVEFfQUxJR05NRU5UIC0gMSkpKTsKKyAgICB9CisgICAgcmV0dXJuIChiY21vc19idWYgKilza2I7Cit9CisKKy8qIFJlbGVhc2UgYnVmZmVyICovCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtb3NfYnVmX2ZyZWUoYmNtb3NfYnVmICpidWYpCit7CisgICAgY29uc3VtZV9za2IoJmJ1Zi0+c2tiKTsKK30KKworLyogR2V0IGRhdGEgbGVuZ3RoICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGJjbW9zX2J1Zl9sZW5ndGgoYmNtb3NfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJ1Zi0+c2tiLmxlbjsKK30KKworLyogU2V0IGRhdGEgbGVuZ3RoICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Vycm5vIGJjbW9zX2J1Zl9sZW5ndGhfc2V0KGJjbW9zX2J1ZiAqYnVmLCB1aW50MzJfdCBsZW5ndGgpCit7CisgICAgaWYgKHVubGlrZWx5KGxlbmd0aCA+IHNrYl90YWlscm9vbSgmYnVmLT5za2IpKSkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiISEhJXM6IGxlbmd0aD0ldSB0YWlscm9vbT0lZFxuIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbGVuZ3RoLCBza2JfdGFpbHJvb20oJmJ1Zi0+c2tiKSk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09WRVJGTE9XOworICAgIH0KKyAgICBidWYtPnNrYi5sZW4gPSBsZW5ndGg7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIEdldCBidWZmZXIgZGF0YSBwb2ludGVyLiAqLworc3RhdGljIGlubGluZSB1aW50OF90ICpiY21vc19idWZfZGF0YShiY21vc19idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYnVmLT5za2IuZGF0YTsKK30KKworLyogR2V0IGJ1ZmZlciBjaGFubmVsLiAqLworc3RhdGljIGlubGluZSB1aW50OF90IGJjbW9zX2J1Zl9jaGFubmVsKGJjbW9zX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBidWYtPnNrYi5jYlswXTsKK30KKworLyogU2V0IGJ1ZmZlciBjaGFubmVsLiAqLworc3RhdGljIGlubGluZSB2b2lkIGJjbW9zX2J1Zl9jaGFubmVsX3NldChiY21vc19idWYgKmJ1ZiwgdWludDhfdCBjaGFubmVsKQoreworICAgIGJ1Zi0+c2tiLmNiWzBdID0gY2hhbm5lbDsKK30KKworLyoqIEluaXRpYWxpemUgYnVmZmVyIHF1ZXVlCisgKiBccGFyYW1baW5dICAgcSAgICAgICBCdWZmZXIgcXVldWUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGJjbW9zX2J1Zl9xdWV1ZV9pbml0KGJjbW9zX2J1Zl9xdWV1ZSAqcSkKK3sKKyAgICBza2JfcXVldWVfaGVhZF9pbml0KHEpOworfQorCisvKiogRW5xdWV1ZSBidWZmZXIKKyAqCisgKiBNdXN0IGJlIGNhbGxlZCB1bmRlciBsb2NrLCBlLmcuLCBxLT5sb2NrCisgKgorICogXHBhcmFtW2luXSAgIHEgICAgICAgQnVmZmVyIHF1ZXVlCisgKiBccGFyYW1baW5dICAgYnVmICAgICBCdWZmZXIKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGJjbW9zX2J1Zl9xdWV1ZV9wdXQoYmNtb3NfYnVmX3F1ZXVlICpxLCBiY21vc19idWYgKmJ1ZikKK3sKKyAgICBfX3NrYl9xdWV1ZV90YWlsKHEsICZidWYtPnNrYik7Cit9CisKKy8qIENoZWNrIGlmIGJ1ZmZlciBxdWV1ZSBpcyBlbXB0eQorICogXHBhcmFtW2luXSAgIHEgICAgICAgQnVmZmVyIHF1ZXVlCisgKiBccmV0dXJucyBUUlVFIGlmIHRoZSBxdWV1ZSBpcyBlbXB0eQorICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgYmNtb3NfYnVmX3F1ZXVlX2lzX2VtcHR5KGJjbW9zX2J1Zl9xdWV1ZSAqcSkKK3sKKyAgICByZXR1cm4gKGJjbW9zX2Jvb2wpc2tiX3F1ZXVlX2VtcHR5KHEpOworfQorCisvKiBEZXF1ZXVlIGJ1ZmZlcgorICoKKyAqIE11c3QgYmUgY2FsbGVkIHVuZGVyIGxvY2ssIGUuZy4sIHEtPmxvY2sKKyAqCisgKiBSZW1vdmUgYW5kIHJldHVybiB0aGUgMXN0IHF1ZXVlZCBidWZmZXIuCisgKiBccGFyYW1baW5dICAgcSAgICAgICBCdWZmZXIgcXVldWUKKyAqIFxyZXR1cm5zIHRoZSAgYnVmZmVyIHBvaW50ZXIKKyAqLworc3RhdGljIGlubGluZSBiY21vc19idWYgKmJjbW9zX2J1Zl9xdWV1ZV9nZXQoYmNtb3NfYnVmX3F1ZXVlICpxKQoreworICAgIHN0cnVjdCBza19idWZmICpza2IgPSBfX3NrYl9kZXF1ZXVlKHEpOworICAgIHJldHVybiBza2IgPyBjb250YWluZXJfb2Yoc2tiLCBiY21vc19idWYsIHNrYikgOiBOVUxMOworfQorCisvKiBQZWVrIGludG8gcXVldWUgYW5kIHJldHVybiB0aGUgMXN0IGJ1ZmZlciB3aXRob3V0IGRlcXVlaW5nIGl0CisgKgorICogTXVzdCBiZSBjYWxsZWQgdW5kZXIgbG9jaywgZS5nLiwgcS0+bG9jaworICogXHBhcmFtW2luXSAgIHEgICAgICAgQnVmZmVyIHF1ZXVlCisgKiBccmV0dXJucyB0aGUgIGJ1ZmZlciBwb2ludGVyCisgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfYnVmICpiY21vc19idWZfcXVldWVfcGVlayhiY21vc19idWZfcXVldWUgKnEpCit7CisgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHNrYl9wZWVrKHEpOworICAgIHJldHVybiBza2IgPyBjb250YWluZXJfb2Yoc2tiLCBiY21vc19idWYsIHNrYikgOiBOVUxMOworfQorCisvKgorICogZGNhY2hlIHV0aWxpdGllcworICovCisvKiBJbnZhbGlkYXRlIGFkZHJlc3MgYXJlYSBpbiBkYXRhIGNhY2hlLiBEaXJ0eSBjYWNoZSBsaW5lcyBjb250ZW50IGlzIGRpc2NhcmRlZCAqLworc3RhdGljIGlubGluZSB2b2lkIGJjbW9zX2RjYWNoZV9pbnYodm9pZCAqc3RhcnQsIHVpbnQzMl90IHNpemUpCit7CisjaWYgZGVmaW5lZChDT05GSUdfTUlQUykKKyAgICBkbWFfY2FjaGVfaW52KCh1bnNpZ25lZCBsb25nKXN0YXJ0LCBzaXplKTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX1BQQykKKyAgICBpZiAoKCh1bnNpZ25lZCBsb25nKXN0YXJ0ICYgKEwxX0NBQ0hFX0JZVEVTIC0gMSkpIHx8IChzaXplICYgKEwxX0NBQ0hFX0JZVEVTIC0gMSkpKQorICAgICAgICBmbHVzaF9kY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpc3RhcnQsICh1bnNpZ25lZCBsb25nKXN0YXJ0ICsgc2l6ZSk7CisgICAgZWxzZQorICAgICAgICBpbnZhbGlkYXRlX2RjYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZylzdGFydCwgKHVuc2lnbmVkIGxvbmcpc3RhcnQgKyBzaXplKTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX1VNTCkKKyAgICAvKiBOb3RoaW5nIHRvIGRvICovCisjZWxzZQorI2Vycm9yIFBsZWFzZSBpbXBsZW1lbnQgYmNtb3NfZGNhY2hlX2ludigpCisjZW5kaWYKK30KKworLyogRmx1c2ggYWRkcmVzcyBhcmVhIGluIGRhdGEgY2FjaGUuIERpcnR5IGNhY2hlIGxpbmVzIGFyZSBjb21taXR0ZWQgdG8gbWVtb3J5ICovCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtb3NfZGNhY2hlX2ZsdXNoKHZvaWQgKnN0YXJ0LCB1aW50MzJfdCBzaXplKQoreworI2lmIGRlZmluZWQoQ09ORklHX01JUFMpCisgICAgZG1hX2NhY2hlX3diYWNrKCh1bnNpZ25lZCBsb25nKXN0YXJ0LCBzaXplKTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX1BQQykKKyAgICBjbGVhbl9kY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpc3RhcnQsICh1bnNpZ25lZCBsb25nKXN0YXJ0ICsgc2l6ZSk7CisjZWxpZiBkZWZpbmVkKENPTkZJR19VTUwpCisgICAgLyogTm90aGluZyB0byBkbyAqLworI2Vsc2UKKyNlcnJvciBQbGVhc2UgaW1wbGVtZW50IGJjbW9zX2RjYWNoZV9mbHVzaCgpCisjZW5kaWYKK30KKworLyoKKyAqIEludGVycnVwdCBzZXJ2aWNlCisgKi8KKworLyogQ29ubmVjdCBzeXN0ZW0gaW50ZXJydXB0ICovCitzdGF0aWMgaW5saW5lIGludCBiY21vc19pbnRfY29ubmVjdChpbnQgaXJxLCBpbnQgY3B1LCBpbnQgZmxhZ3MsCisgICAgaW50ICgqaXNyKShpbnQgaXJxLCB2b2lkICpwcml2KSwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqcHJpdikKK3sKKyAgICByZXR1cm4gcmVxdWVzdF9pcnEoaXJxLCAoaXJxX2hhbmRsZXJfdClpc3IsIGZsYWdzLCBuYW1lLCBwcml2KTsKK30KKworLyogRGlzY29ubmVjdCBzeXN0ZW0gaW50ZXJydXB0ICovCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtb3NfaW50X2Rpc2Nvbm5lY3QoaW50IGlycSwgdm9pZCAqcHJpdikKK3sKKyAgICBmcmVlX2lycShpcnEsIHByaXYpOworfQorCisvKiBVbm1hc2sgSVJRICovCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtb3NfaW50X2VuYWJsZShpbnQgaXJxKQoreworICAgIGVuYWJsZV9pcnEoaXJxKTsKK30KKworLyogTWFzayBJUlEgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBiY21vc19pbnRfZGlzYWJsZShpbnQgaXJxKQoreworICAgIGRpc2FibGVfaXJxKGlycSk7Cit9CisKKy8qIENoZWNrIGluLWlycSBzdGF0dXMgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlzX2lycV9tb2RlKHZvaWQpCit7CisgICAgcmV0dXJuIGluX2ludGVycnVwdCgpOworfQorCisvKiBDaGVjayBpZiBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCAqLworc3RhdGljIGlubGluZSBpbnQgaXNfaXJxX2Rpc2FibGVkKHZvaWQpCit7CisgICAgcmV0dXJuIGlycXNfZGlzYWJsZWQoKTsKK30KKworLyogQ29udmVydCB2aXJ0dWFsIGFkZHJlc3MgdG8gcGh5c2ljYWwgYWRkcmVzcyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGJjbW9zX3ZpcnRfdG9fcGh5cyh2b2lkICp2YSkKK3sKKyAgICByZXR1cm4gdmlydF90b19waHlzKHZhKTsKK30KKworLyogd3JpdGUgYmFycmllciAqLworc3RhdGljIGlubGluZSB2b2lkIGJjbW9zX2JhcnJpZXIodm9pZCkKK3sKKyAgICBzbXBfd21iKCk7Cit9CitzdGF0aWMgaW5saW5lIGludCBiY21vc19nZXRjaGFyKHZvaWQpCit7CisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtb3NfcHV0Y2hhcihpbnQgYykKK3sKK30KKworI2lmZGVmIEJDTU9TX01TR19RVUVVRV9ET01BSU5fU09DS0VUCisjdW5kZWYgQkNNT1NfTVNHX1FVRVVFX0RPTUFJTl9TT0NLRVQKKyNlbmRpZgorCisjaWZkZWYgQkNNT1NfTVNHX1FVRVVFX1VEUF9TT0NLRVQKKyN1bmRlZiBCQ01PU19NU0dfUVVFVUVfVURQX1NPQ0tFVAorI2VuZGlmCisKKy8qIDJuZCBwYXJ0IG9mIE9TLWluZGVwZW5kZW50IGRlY2xhcmF0aW9ucyAqLworI2luY2x1ZGUgImJjbW9zX2NvbW1vbjIuaCIKKworI2VuZGlmIC8qIEJDTU9TX1NZU1RFTV9IXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9vc19jbGkvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL29zX2NsaS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDVhODZhCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9vc19jbGkvTWFrZWZpbGUKQEAgLTAsMCArMSw3IEBACisjIE9TIENMSSBjb21tYW5kcworIworTU9EX05BTUUgPSBvc19jbGkKK01PRF9UWVBFID0gbGliCitNT0RfREVQUyA9IGNsaQorCitzcmNzID0gYmNtb3NfY2xpLmMKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vb3NfY2xpL2JjbW9zX2NsaS5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9vc19jbGkvYmNtb3NfY2xpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FlZjMxYQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vb3NfY2xpL2JjbW9zX2NsaS5jCkBAIC0wLDAgKzEsMzM1IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaW5jbHVkZSA8YmNtb3NfY2xpLmg+CisKK3N0YXRpYyBiY21jbGlfZW50cnkgKm9zX2NsaV9kaXI7CisKK3N0YXRpYyBiY21jbGlfZW51bV92YWwgdHJhY2VfbGV2ZWxfdGFibGVbXSA9Cit7CisgICAgeyAubmFtZT0ibm9uZSIsIC52YWw9QkNNT1NfVFJBQ0VfTEVWRUxfTk9ORSB9LAorICAgIHsgLm5hbWU9ImVycm9yIiwgLnZhbD1CQ01PU19UUkFDRV9MRVZFTF9FUlJPUiB9LAorICAgIHsgLm5hbWU9ImluZm8iLCAudmFsPUJDTU9TX1RSQUNFX0xFVkVMX0lORk8gfSwKKyAgICB7IC5uYW1lPSJ2ZXJib3NlX2luZm8iLCAudmFsPUJDTU9TX1RSQUNFX0xFVkVMX1ZFUkJPU0UgfSwKKyAgICB7IC5uYW1lPSJkZWJ1ZyIsIC52YWw9QkNNT1NfVFJBQ0VfTEVWRUxfREVCVUcgfSwKKyAgICBCQ01DTElfRU5VTV9MQVNUCit9OworCisvKgorICogQ29tbWFuZCBoYW5kbGVycworICovCisKK3N0YXRpYyBiY21vc19lcnJubyBfb3NjbGlfdHJhY2VfaGFuZGxlcihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIGJjbW9zX3RyYWNlX2xldmVsIGxldmVsID0gKGJjbW9zX3RyYWNlX2xldmVsKXBhcm1bMF0udmFsdWUubnVtYmVyOworCisgICAgaWYgKGJjbWNsaV9wYXJtX2lzX3NldChzZXNzaW9uLCAmcGFybVswXSkpCisgICAgeworICAgICAgICBiY21vc190cmFjZV9sZXZlbCBvbGRfbGV2ZWw7CisKKyAgICAgICAgb2xkX2xldmVsID0gYmNtb3NfdHJhY2VfbGV2ZWxfc2V0KGxldmVsKTsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIk9TIHRyYWNlIGxldmVsOiBvbGQ9JXMgIG5ldz0lc1xuIiwKKyAgICAgICAgICAgIGJjbWNsaV9lbnVtX3N0cmluZ3ZhbCh0cmFjZV9sZXZlbF90YWJsZSwgb2xkX2xldmVsKSwKKyAgICAgICAgICAgIGJjbWNsaV9lbnVtX3N0cmluZ3ZhbCh0cmFjZV9sZXZlbF90YWJsZSwgbGV2ZWwpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIk9TIHRyYWNlIGxldmVsOiAlc1xuIiwKKyAgICAgICAgICAgIGJjbWNsaV9lbnVtX3N0cmluZ3ZhbCh0cmFjZV9sZXZlbF90YWJsZSwgYmNtb3NfdHJhY2VfbGV2ZWxfZ2V0KCkpKTsKKyAgICB9CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfb3NjbGlfdGFza19oYW5kbGVyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgY29uc3QgY2hhciAqbmFtZSA9IGJjbWNsaV9wYXJtX2lzX3NldChzZXNzaW9uLCAmcGFybVswXSkgPyAoY29uc3QgY2hhciAqKXBhcm1bMF0udmFsdWUuc3RyaW5nIDogTlVMTDsKKyAgICBiY21vc190YXNrICp0YXNrID0gTlVMTDsKKyAgICBpbnQgbnQgPSAwOworCisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIiUtMjBzICU0cyAlNHMgJS0xMHMgJXNcbiIsICJ0YXNrIiwgInByaW8iLCAiY29yZSIsICJ0aW1lb3V0IiwgImhhbmRsZXIiKTsKKyAgICB3aGlsZSAoYmNtb3NfdGFza19nZXRfbmV4dCgmdGFzaykgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIGJjbW9zX3Rhc2tfcGFybSB0cCA9IHt9OworICAgICAgICBiY21vc190YXNrX3F1ZXJ5KHRhc2ssICZ0cCk7CisgICAgICAgIGlmICghbmFtZSB8fCAobmFtZSAmJiB0cC5uYW1lICYmIHN0cnN0cih0cC5uYW1lLCBuYW1lKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgY29yZV9uYW1lWzEwXTsKKyAgICAgICAgICAgIGlmICh0cC5jb3JlICE9IEJDTU9TX0NQVV9DT1JFX0FOWSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbnByaW50Zihjb3JlX25hbWUsIHNpemVvZihjb3JlX25hbWUpLCAiJWQiLCB0cC5jb3JlIC0gMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyY3B5KGNvcmVfbmFtZSwgImFueSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIiUtMjBzICUtNGQgJS00cyAlLTEwdSAlcFxuIiwKKyAgICAgICAgICAgICAgICB0cC5uYW1lLCB0cC5wcmlvcml0eSwgY29yZV9uYW1lLAorICAgICAgICAgICAgICAgICh0cC5tc2dfd2FpdF90aW1lb3V0ID09IEJDTU9TX1dBSVRfRk9SRVZFUikgPyAwIDogdHAubXNnX3dhaXRfdGltZW91dCwgdHAuaGFuZGxlcik7CisgICAgICAgICAgICArK250OworICAgICAgICB9CisgICAgfQorICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIlZCB0YXNrcyBsaXN0ZWRcbiIsIG50KTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgdm9pZCBfb3NjbGlfcHJpbnRfcWluZm9faGRyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIiUtOXMgJS05cyAlLTEwcyAlLTEwcyAlLTEwcyAlLTEwcyAlLThzICUtOHMgJS0xMHMgY29uZ2VzdGVkXG4iLAorICAgICAgICBwcmVmaXggPyBwcmVmaXggOiAiIiwgInNpemUiLCAiaW4iLCAicHV0IiwgImdldCIsICJkaXNjYXJkIiwgImxfdGhyZXNoIiwgImhfdGhyZXNoIiwgIm5lYXItZnVsbCIpOworfQorCitzdGF0aWMgdm9pZCBfb3NjbGlfcHJpbnRfcWluZm8oYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGJjbW9zX21zZ19xdWV1ZV9pbmZvICpxaSwgY29uc3QgY2hhciAqcHJlZml4KQoreworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIlLXMgJS05ZCAlLTEwdSAlLTEwdSAlLTEwdSAlLTEwdSAlLThkICUtOGQgJS0xMHUgJXNcbiIsCisgICAgICAgIHByZWZpeCA/IHByZWZpeCA6ICIiLCAoaW50KXFpLT5wYXJtLnNpemUsIHFpLT5zdGF0Lm1zZ19pbiwKKyAgICAgICAgcWktPnN0YXQubXNnX3NlbnQsIHFpLT5zdGF0Lm1zZ19yZWNlaXZlZCwKKyAgICAgICAgcWktPnN0YXQubXNnX2Rpc2NhcmRlZCwgKGludClxaS0+cGFybS5sb3dfd20sIChpbnQpcWktPnBhcm0uaGlnaF93bSwKKyAgICAgICAgcWktPnN0YXQubXNnX2FsbW9zdF9mdWxsLCBxaS0+c3RhdC5pc19jb25nZXN0ZWQgPyAieWVzIiA6ICJubyIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX29zY2xpX21vZHVsZV9oYW5kbGVyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgYmNtb3NfbW9kdWxlX2lkIGlkID0gYmNtY2xpX3Bhcm1faXNfc2V0KHNlc3Npb24sICZwYXJtWzBdKSA/CisgICAgICAgIChiY21vc19tb2R1bGVfaWQpcGFybVswXS52YWx1ZS5udW1iZXIgOiBCQ01PU19NT0RVTEVfSURfTk9ORTsKKyAgICBiY21vc19tb2R1bGVfaWQgaTsKKyAgICBpbnQgbm0gPSAwOworCisgICAgLyogSGVhZGluZyAqLworICAgIF9vc2NsaV9wcmludF9xaW5mb19oZHIoc2Vzc2lvbiwgIk1vZHVsZSBUYXNrICAgICAgICAgICAgICAgICAiKTsKKworICAgIGZvciAoaSA9IEJDTU9TX01PRFVMRV9JRF9OT05FICsgMTsgaSA8IEJDTU9TX01PRFVMRV9JRF9fTlVNX09GOyBpKyspCisgICAgeworICAgICAgICBiY21vc19lcnJubyByYzsKKyAgICAgICAgY29uc3QgYmNtb3NfdGFzayAqdCA9IE5VTEw7CisgICAgICAgIGJjbW9zX21zZ19xdWV1ZV9pbmZvIHFpID0ge307CisKKyAgICAgICAgcmMgPSBiY21vc19tb2R1bGVfcXVlcnkoaSwgJnQsICZxaSk7CisgICAgICAgIGlmICgoaWQgPT0gQkNNT1NfTU9EVUxFX0lEX05PTkUgfHwgaWQgPT0gaSkgJiYgcmMgPT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdGFza19wYXJtIHRwID0ge307CisKKyAgICAgICAgICAgIGJjbW9zX3Rhc2tfcXVlcnkodCwgJnRwKTsKKyAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIlLTZkICUtMjBzIiwgaSwgKHQgJiYgdC0+cGFybS5uYW1lKSA/IHQtPnBhcm0ubmFtZSA6ICIqdW5rbm93bioiKTsKKyAgICAgICAgICAgIF9vc2NsaV9wcmludF9xaW5mbyhzZXNzaW9uLCAmcWksICIgIik7CisgICAgICAgICAgICArK25tOworICAgICAgICB9CisgICAgfQorICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIlZCBtb2R1bGVzIGxpc3RlZFxuIiwgbm0pOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfb3NjbGlfYmxrX3Bvb2xfaGFuZGxlcihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBiY21jbGlfcGFybV9pc19zZXQoc2Vzc2lvbiwgJnBhcm1bMF0pID8gKGNvbnN0IGNoYXIgKilwYXJtWzBdLnZhbHVlLnN0cmluZyA6IE5VTEw7CisgICAgY29uc3QgYmNtb3NfYmxrX3Bvb2wgKmJwID0gTlVMTDsKKyAgICBpbnQgbmIgPSAwOworCisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIiUtMjRzICUtOXMgJS05cyAlLTlzICUtMTBzICUtMTBzICUtMTBzICUtMTBzXG4iLAorICAgICAgICAibmFtZSIsICJwb29sX3NpemUiLCAiYmxvY2tzIiwgImJsa19zaXplIiwgImZyZWUiLCAiYWxsb2NhdGVkIiwgInJlbGVhc2VkIiwgImZhaWxlZCIpOworICAgIHdoaWxlIChiY21vc19ibGtfcG9vbF9nZXRfbmV4dCgmYnApID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBiY21vc19ibGtfcG9vbF9pbmZvIHBpID0ge307CisKKyAgICAgICAgYmNtb3NfYmxrX3Bvb2xfcXVlcnkoYnAsICZwaSk7CisgICAgICAgIGlmIChuYW1lID09IE5VTEwgfHwgKHBpLnBhcm0ubmFtZSAmJiBzdHJzdHIocGkucGFybS5uYW1lLCBuYW1lKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIlLTI0cyAlLTl1ICUtOXUgJS05dSAlLTEwdSAlLTEwdSAlLTEwdSAlLTEwdVxuIiwKKyAgICAgICAgICAgICAgICBwaS5wYXJtLm5hbWUgPyBwaS5wYXJtLm5hbWUgOiAiIiwgcGkucGFybS5wb29sX3NpemUsIHBpLnBhcm0ubnVtX2Jsa3MsIHBpLnBhcm0uYmxrX3NpemUsCisgICAgICAgICAgICAgICAgICAgIHBpLnN0YXQuZnJlZSwgcGkuc3RhdC5hbGxvY2F0ZWQsIHBpLnN0YXQucmVsZWFzZWQsIHBpLnN0YXQuYWxsb2NfZmFpbGVkKTsKKyAgICAgICAgICAgICsrbmI7CisgICAgICAgIH0KKyAgICB9CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIlRvdGFsIG1lbW9yeSBvY2N1cGllZCBieSBhbGwgYmxvY2sgcG9vbHM6ICV1IGJ5dGVzXG4iLCBiY21vc190b3RhbF9ibGtfcG9vbF9zaXplKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiJWQgYmxvY2sgcG9vbHMgbGlzdGVkXG4iLCBuYik7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9vc2NsaV9tc2dfcG9vbF9oYW5kbGVyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgY29uc3QgY2hhciAqbmFtZSA9IGJjbWNsaV9wYXJtX2lzX3NldChzZXNzaW9uLCAmcGFybVswXSkgPyAoY29uc3QgY2hhciAqKXBhcm1bMF0udmFsdWUuc3RyaW5nIDogTlVMTDsKKyAgICBjb25zdCBiY21vc19tc2dfcG9vbCAqbXAgPSBOVUxMOworICAgIGludCBucCA9IDA7CisKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiJS0yNHMgJS05cyAlLTlzICUtMTBzICUtMTBzICUtMTBzICUtMTBzXG4iLAorICAgICAgICAibmFtZSIsICJzaXplIiwgImRhdGFfc2l6ZSIsICJmcmVlIiwgImFsbG9jYXRlZCIsICJyZWxlYXNlZCIsICJmYWlsZWQiKTsKKyAgICB3aGlsZSAoYmNtb3NfbXNnX3Bvb2xfZ2V0X25leHQoJm1wKSA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgYmNtb3NfbXNnX3Bvb2xfaW5mbyBwaSA9IHt9OworCisgICAgICAgIGJjbW9zX21zZ19wb29sX3F1ZXJ5KG1wLCAmcGkpOworICAgICAgICBpZiAobmFtZSA9PSBOVUxMIHx8IChwaS5wYXJtLm5hbWUgJiYgc3Ryc3RyKHBpLnBhcm0ubmFtZSwgbmFtZSkpKQorICAgICAgICB7CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiJS0yNHMgJS05dSAlLTl1ICUtMTB1ICUtMTB1ICUtMTB1ICUtMTB1XG4iLAorICAgICAgICAgICAgICAgIHBpLnBhcm0ubmFtZSA/IHBpLnBhcm0ubmFtZSA6ICIiLCBwaS5wYXJtLnNpemUsIHBpLnBhcm0uZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICBwaS5zdGF0LmZyZWUsIHBpLnN0YXQuYWxsb2NhdGVkLCBwaS5zdGF0LnJlbGVhc2VkLCBwaS5zdGF0LmFsbG9jX2ZhaWxlZCk7CisgICAgICAgICAgICArK25wOworICAgICAgICB9CisgICAgfQorICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJUb3RhbCBtZW1vcnkgb2NjdXBpZWQgYnkgYWxsIG1lc3NhZ2UgcG9vbHM6ICV1IGJ5dGVzXG4iLCBiY21vc190b3RhbF9tc2dfcG9vbF9zaXplKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiJWQgbXNnIHBvb2xzIGxpc3RlZFxuIiwgbnApOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfb3NjbGlfbXNnX3F1ZXVlX2hhbmRsZXIoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICBjb25zdCBjaGFyICpuYW1lID0gYmNtY2xpX3Bhcm1faXNfc2V0KHNlc3Npb24sICZwYXJtWzBdKSA/IChjb25zdCBjaGFyICopcGFybVswXS52YWx1ZS5zdHJpbmcgOiBOVUxMOworICAgIGNvbnN0IGJjbW9zX21zZ19xdWV1ZSAqbXEgPSBOVUxMOworICAgIGludCBucSA9IDA7CisKKyAgICBfb3NjbGlfcHJpbnRfcWluZm9faGRyKHNlc3Npb24sICJuYW1lICAgICAgICAgICAgICAgICAiKTsKKyAgICB3aGlsZSAoYmNtb3NfbXNnX3F1ZXVlX2dldF9uZXh0KCZtcSkgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIGJjbW9zX21zZ19xdWV1ZV9pbmZvIHFpID0ge307CisKKyAgICAgICAgYmNtb3NfbXNnX3F1ZXVlX3F1ZXJ5KG1xLCAmcWkpOworICAgICAgICBpZiAobmFtZSA9PSBOVUxMIHx8IChxaS5wYXJtLm5hbWUgJiYgc3Ryc3RyKHFpLnBhcm0ubmFtZSwgbmFtZSkpKQorICAgICAgICB7CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiJS0yMHMiLCBxaS5wYXJtLm5hbWUgPyBxaS5wYXJtLm5hbWUgOiAiIik7CisgICAgICAgICAgICBfb3NjbGlfcHJpbnRfcWluZm8oc2Vzc2lvbiwgJnFpLCAiICIpOworICAgICAgICAgICAgKytucTsKKyAgICAgICAgfQorICAgIH0KKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiJWQgbXNnIHF1ZXVlcyBsaXN0ZWRcbiIsIG5xKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgdm9pZCBfb3NjbGlfcHJpbnRfcWdyb3VwX2luZm9faGRyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIlLTEycyAlLTZzICUtOXMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS04cyAlLThzICUtMTBzIGNvbmdlc3RlZFxuIiwKKyAgICAgICAgIm5hbWUiLCAicXVldWVzIiwgInNpemUiLCAiaW4iLCAicHV0IiwgImdldCIsICJkaXNjYXJkIiwgImxfdGhyZXNoIiwgImhfdGhyZXNoIiwgIm5lYXItZnVsbCIpOworfQorCitzdGF0aWMgdm9pZCBfb3NjbGlfcHJpbnRfcWdyb3VwX2luZm8oYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGJjbW9zX21zZ19xZ3JvdXBfaW5mbyAqcWkpCit7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIiUtMTJzICUtNmQgJS05ZCAlLTEwdSAlLTEwdSAlLTEwdSAlLTEwdSAlLThkICUtOGQgJS0xMHUgJXNcbiIsCisgICAgICAgIHFpLT5wYXJtLm5hbWUgPyBxaS0+cGFybS5uYW1lIDogIiIsIChpbnQpcWktPnBhcm0ubnF1ZXVlcywgKGludClxaS0+cGFybS5zaXplLCBxaS0+c3RhdC5tc2dfaW4sCisgICAgICAgIHFpLT5zdGF0Lm1zZ19zZW50LCBxaS0+c3RhdC5tc2dfcmVjZWl2ZWQsCisgICAgICAgIHFpLT5zdGF0Lm1zZ19kaXNjYXJkZWQsIChpbnQpcWktPnBhcm0ubG93X3dtLCAoaW50KXFpLT5wYXJtLmhpZ2hfd20sCisgICAgICAgIHFpLT5zdGF0Lm1zZ19hbG1vc3RfZnVsbCwgcWktPnN0YXQuaXNfY29uZ2VzdGVkID8gInllcyIgOiAibm8iKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9vc2NsaV9tc2dfcWdyb3VwX2hhbmRsZXIoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICBjb25zdCBjaGFyICpuYW1lID0gYmNtY2xpX3Bhcm1faXNfc2V0KHNlc3Npb24sICZwYXJtWzBdKSA/IChjb25zdCBjaGFyICopcGFybVswXS52YWx1ZS5zdHJpbmcgOiBOVUxMOworICAgIGNvbnN0IGJjbW9zX21zZ19xZ3JvdXAgKnFncnAgPSBOVUxMOworICAgIGludCBuZ3JvdXBzID0gMDsKKworICAgIF9vc2NsaV9wcmludF9xZ3JvdXBfaW5mb19oZHIoc2Vzc2lvbik7CisgICAgd2hpbGUgKGJjbW9zX21zZ19xZ3JvdXBfZ2V0X25leHQoJnFncnApID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBiY21vc19tc2dfcWdyb3VwX2luZm8gcWkgPSB7fTsKKworICAgICAgICBiY21vc19tc2dfcWdyb3VwX3F1ZXJ5KHFncnAsICZxaSk7CisgICAgICAgIGlmIChuYW1lID09IE5VTEwgfHwgKHFpLnBhcm0ubmFtZSAmJiBzdHJzdHIocWkucGFybS5uYW1lLCBuYW1lKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9vc2NsaV9wcmludF9xZ3JvdXBfaW5mbyhzZXNzaW9uLCAmcWkpOworICAgICAgICAgICAgKytuZ3JvdXBzOworICAgICAgICB9CisgICAgfQorICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIlZCBtc2cgcXVldWUgZ3JvdXBzIGxpc3RlZFxuIiwgbmdyb3Vwcyk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworI2lmZGVmIEJDTV9PU19USFJFQURYCisKK2V4dGVybiBUWF9USFJFQUQgX19zeXNfc2hlbGxfXzsKK2V4dGVybiBUWF9USFJFQUQgKl9fdXNyX3NoZWxsX187CisKK3N0YXRpYyBiY21vc19lcnJubyBfb3NjbGlfc3lzX2hhbmRsZXIoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiQXBwbGljYXRpb24gQ0xJIGlzIHN1c3BlbmRlZC4gVHlwZSBcInN1c3BlbmRcIiBpbiBzeXN0ZW0gc2hlbGwgdG8gcmVzdW1lXG4iKTsKKyAgICB0eF90aHJlYWRfcmVzdW1lKCZfX3N5c19zaGVsbF9fKTsKKyAgICB0eF90aHJlYWRfc3VzcGVuZCh0eF90aHJlYWRfaWRlbnRpZnkoKSk7CisgICAgdHhfdGhyZWFkX3dhaXRfYWJvcnQodHhfdGhyZWFkX2lkZW50aWZ5KCkpOworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJBcHBsaWNhdGlvbiBDTEkgaXMgcmVzdW1lZFxuIik7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisjZW5kaWYKKworLyoKKyAqIEluaXQgLyBleGl0IGludGVyZmFjZQorICovCisKKworYmNtb3NfZXJybm8gYmNtb3NfY2xpX2luaXQoYmNtY2xpX2VudHJ5ICp0b3BfZGlyKQoreworICAgIGlmIChvc19jbGlfZGlyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfQUxSRUFEWTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIHJ4IGRpcmVjdG9yeQorICAgICAqLworICAgIG9zX2NsaV9kaXIgPSBiY21jbGlfZGlyX2FkZCh0b3BfZGlyLCAib3MiLCAiT1MgQWJzdHJhY3Rpb24iLCBCQ01DTElfQUNDRVNTX0dVRVNULCBOVUxMKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoIW9zX2NsaV9kaXIsIEJDTV9FUlJfSU5URVJOQUwpOworCisgICAgQkNNQ0xJX01BS0VfQ01EKG9zX2NsaV9kaXIsICJ0cmFjZSIsICJHZXQvU2V0IHRyYWNlIGxldmVsIiwgX29zY2xpX3RyYWNlX2hhbmRsZXIsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fRU5VTSgibGV2ZWwiLCAiVHJhY2UgbGV2ZWwiLCB0cmFjZV9sZXZlbF90YWJsZSwgQkNNQ0xJX1BBUk1fRkxBR19PUFRJT05BTCkpOworCisgICAgQkNNQ0xJX01BS0VfQ01EKG9zX2NsaV9kaXIsICJ0YXNrIiwgIlRhc2sgaW5mbyIsIF9vc2NsaV90YXNrX2hhbmRsZXIsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oIm5hbWUiLCAiVGFzayBuYW1lIG9yIHBhcnRpYWwgbmFtZSIsIEJDTUNMSV9QQVJNX1NUUklORywgQkNNQ0xJX1BBUk1fRkxBR19PUFRJT05BTCkpOworCisgICAgQkNNQ0xJX01BS0VfQ01EKG9zX2NsaV9kaXIsICJtb2R1bGUiLCAiTW9kdWxlKHMpIiwgX29zY2xpX21vZHVsZV9oYW5kbGVyLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX1JBTkdFKCJpZCIsICJNb2R1bGUgaWQiLCBCQ01DTElfUEFSTV9OVU1CRVIsIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwsCisgICAgICAgICAgICBCQ01PU19NT0RVTEVfSURfTk9ORSArIDEsIEJDTU9TX01PRFVMRV9JRF9fTlVNX09GIC0gMSkpOworCisgICAgQkNNQ0xJX01BS0VfQ01EKG9zX2NsaV9kaXIsICJibGtfcG9vbCIsICJCbG9jayBwb29sKHMpIiwgX29zY2xpX2Jsa19wb29sX2hhbmRsZXIsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oIm5hbWUiLCAiQmxvY2sgcG9vbCBuYW1lIG9yIHBhcnRpYWwgbmFtZSIsIEJDTUNMSV9QQVJNX1NUUklORywgQkNNQ0xJX1BBUk1fRkxBR19PUFRJT05BTCkpOworCisgICAgQkNNQ0xJX01BS0VfQ01EKG9zX2NsaV9kaXIsICJtc2dfcG9vbCIsICJNZXNzYWdlIHBvb2wocykiLCBfb3NjbGlfbXNnX3Bvb2xfaGFuZGxlciwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgibmFtZSIsICJNZXNzYWdlIHBvb2wgbmFtZSBvciBwYXJ0aWFsIG5hbWUiLCBCQ01DTElfUEFSTV9TVFJJTkcsIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwpKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRChvc19jbGlfZGlyLCAicXVldWUiLCAiTWVzc2FnZSBxdWV1ZShzKSIsIF9vc2NsaV9tc2dfcXVldWVfaGFuZGxlciwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgibmFtZSIsICJNZXNzYWdlIHF1ZXVlIG5hbWUgb3IgcGFydGlhbCBuYW1lIiwgQkNNQ0xJX1BBUk1fU1RSSU5HLCBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMKSk7CisKKyAgICBCQ01DTElfTUFLRV9DTUQob3NfY2xpX2RpciwgInFncm91cCIsICJNZXNzYWdlIHF1ZXVlIGdyb3VwKHMpIiwgX29zY2xpX21zZ19xZ3JvdXBfaGFuZGxlciwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgibmFtZSIsICJNZXNzYWdlIHF1ZXVlIGdyb3VwIG5hbWUgb3IgcGFydGlhbCBuYW1lIiwgQkNNQ0xJX1BBUk1fU1RSSU5HLCBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMKSk7CisKKyNpZmRlZiBCQ01fT1NfVEhSRUFEWAorICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0ob3NfY2xpX2RpciwgInN5cyIsICJTeXN0ZW0gc2hlbGwiLCBfb3NjbGlfc3lzX2hhbmRsZXIpOworI2VuZGlmCisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKwordm9pZCBiY21vc19jbGlfZXhpdCh2b2lkKQoreworICAgIGlmIChvc19jbGlfZGlyKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Rva2VuX2Rlc3Ryb3kob3NfY2xpX2Rpcik7CisgICAgICAgIG9zX2NsaV9kaXIgPSBOVUxMOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vb3NfY2xpL2JjbW9zX2NsaS5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9vc19jbGkvYmNtb3NfY2xpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg3OTUyYwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vb3NfY2xpL2JjbW9zX2NsaS5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgQkNNT1NfQ0xJX0hfCisjZGVmaW5lIEJDTU9TX0NMSV9IXworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtY2xpLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworYmNtb3NfZXJybm8gYmNtb3NfY2xpX2luaXQoYmNtY2xpX2VudHJ5ICp0b3BfZGlyKTsKKwordm9pZCBiY21vc19jbGlfZXhpdCh2b2lkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8qIEJDTU9TX0NMSV9IXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9wb3NpeC9iY21vc19zeXN0ZW0uYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vcG9zaXgvYmNtb3Nfc3lzdGVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNjYjkwMgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vcG9zaXgvYmNtb3Nfc3lzdGVtLmMKQEAgLTAsMCArMSw5MjEgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpbmNsdWRlICJiY21vc19zeXN0ZW0uaCIKKyNpZmRlZiBCQ01PU19NU0dfUVVFVUVfRE9NQUlOX1NPQ0tFVAorI2luY2x1ZGUgPHN5cy91bi5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisKKy8qIHRhc2sgY29udHJvbCBibG9ja3MgKi8KK2V4dGVybiBTVEFJTFFfSEVBRCh0YXNrX2xpc3QsIGJjbW9zX3Rhc2spIHRhc2tfbGlzdDsKKworLyogZ2xvYmFsIE9TIGxvY2sgKi8KK2V4dGVybiBiY21vc19tdXRleCBiY21vc19yZXNfbG9jazsKKworLyoKKyAqIEluaXQKKyAqLworCisjZGVmaW5lIFRJTUVSX1NJRyAgICAgICBTSUdSVE1JTgorCisvKiBJbml0aWFsaXplIHN5c3RlbSBsaWJyYXJ5ICovCitiY21vc19lcnJubyBiY21vc19zeXNfaW5pdCh2b2lkKQoreworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBDbGVhbi11cCBzeXN0ZW0gbGlicmFyeSAqLwordm9pZCBiY21vc19zeXNfZXhpdCh2b2lkKQoreworfQorCisvKgorICogVGFzayBtYW5hZ2VtZW50CisgKi8KKworLyoKKyAqIERlZmF1bHQgdGFzayBoYW5kbGVyCisgKi8KKworLyogQ3JlYXRlIGEgbmV3IHRhc2sgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX3Rhc2tfY3JlYXRlKGJjbW9zX3Rhc2sgKnRhc2ssIGNvbnN0IGJjbW9zX3Rhc2tfcGFybSAqcGFybSkKK3sKKyAgICBGX2JjbW9zX3Rhc2tfaGFuZGxlciBoYW5kbGVyOworICAgIHB0aHJlYWRfYXR0cl90IHB0aHJlYWRfYXR0cjsKKyAgICBzdHJ1Y3Qgc2NoZWRfcGFyYW0gcHRocmVhZF9zY2hlZF9wYXJhbSA9IHt9OworICAgIGludCBwdGhyZWFkX3ByaW87CisgICAgdWludDMyX3Qgc3RhY2tfc2l6ZTsKKyAgICB2b2lkICpkYXRhOworICAgIGludCByYzsKKworICAgIGlmICghdGFzayB8fCAhcGFybSkKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfUEFSTSwgInRhc2sgJXAsIHBhcm0gJXBcbiIsIHRhc2ssIHBhcm0pOworICAgIG1lbXNldCh0YXNrLCAwLCBzaXplb2YoKnRhc2spKTsKKyAgICBpZiAocGFybS0+aGFuZGxlcikKKyAgICB7CisgICAgICAgIC8qICJ0cmFkaXRpb25hbCB0YXNrICovCisgICAgICAgIGhhbmRsZXIgPSBwYXJtLT5oYW5kbGVyOworICAgICAgICBkYXRhID0gKHZvaWQgKilwYXJtLT5kYXRhOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiAiaW50ZWdyYXRlZCIgdGFzayAqLworICAgICAgICBoYW5kbGVyID0gYmNtb3NfZGZ0X3Rhc2tfaGFuZGxlcjsKKyAgICAgICAgZGF0YSA9IHRhc2s7CisKKyAgICAgICAgLyogSW5pdGlhbGl6ZSBhbmQgbG9jayBtdXRleCB0byB3YWl0IG9uICovCisgICAgICAgIHJjID0gYmNtb3Nfc2VtX2NyZWF0ZSgmdGFzay0+YWN0aXZlX3NlbSwgMCwgdGFzay0+cGFybS5mbGFncywgcGFybS0+bmFtZSk7CisgICAgICAgIGlmIChyYykKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJUYXNrICVzOiBjYW4ndCBjcmVhdGUgYWN0aXZlX3NlbS4gRXJyb3IgJXMgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICBwYXJtLT5uYW1lLCBiY21vc19zdHJlcnJvcihyYyksIHJjKTsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHRhc2stPnBhcm0gPSAqcGFybTsKKyAgICAvKiBDb3B5IG5hbWUgdG8gbWFrZSBzdXJlIHRoYXQgaXQgaXMgbm90IHJlbGVhc2VkIC0gaW4gY2FzZSBpdCB3YXMgb24gdGhlIHN0YWNrICovCisgICAgaWYgKHRhc2stPnBhcm0ubmFtZSkKKyAgICB7CisgICAgICAgIHN0cm5jcHkodGFzay0+bmFtZSwgdGFzay0+cGFybS5uYW1lLCBzaXplb2YodGFzay0+bmFtZSkgLSAxKTsKKyAgICAgICAgdGFzay0+cGFybS5uYW1lID0gdGFzay0+bmFtZTsKKyAgICB9CisgICAgYmNtb3NfZmFzdGxvY2tfaW5pdCgmdGFzay0+YWN0aXZlX2xvY2ssIDApOworICAgIGJjbW9zX211dGV4X2xvY2soJmJjbW9zX3Jlc19sb2NrKTsKKyAgICBTVEFJTFFfSU5TRVJUX1RBSUwoJnRhc2tfbGlzdCwgdGFzaywgbGlzdCk7CisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZiY21vc19yZXNfbG9jayk7CisgICAgdGFzay0+bWFnaWMgPSBCQ01PU19UQVNLX01BR0lDOworICAgIC8qIHB0aHJlYWQgcHJpb3JpdGllcyBhcmUgMS4uMzIsIDMyIGJlaW5nIHRoZSBoaWdoZXN0ICovCisgICAgcHRocmVhZF9wcmlvID0gMzIgLSAoaW50KXBhcm0tPnByaW9yaXR5OworICAgIGlmIChwdGhyZWFkX3ByaW8gPD0gMCkKKyAgICAgICAgcHRocmVhZF9wcmlvID0gMTsKKyAgICBzdGFja19zaXplID0gUFRIUkVBRF9TVEFDS19NSU47CisgICAgaWYgKHBhcm0tPnN0YWNrX3NpemUgJiYgcGFybS0+c3RhY2tfc2l6ZSA+IFBUSFJFQURfU1RBQ0tfTUlOKQorICAgICAgICBzdGFja19zaXplID0gcGFybS0+c3RhY2tfc2l6ZTsKKyAgICByYyA9IHB0aHJlYWRfYXR0cl9pbml0KCZwdGhyZWFkX2F0dHIpOworICAgIHB0aHJlYWRfc2NoZWRfcGFyYW0uc2NoZWRfcHJpb3JpdHkgPSBwdGhyZWFkX3ByaW87CisgICAgcmMgPSByYyA/IHJjIDogcHRocmVhZF9hdHRyX3NldGluaGVyaXRzY2hlZCgmcHRocmVhZF9hdHRyLCBQVEhSRUFEX0VYUExJQ0lUX1NDSEVEKTsKKyAgICByYyA9IHJjID8gcmMgOiBwdGhyZWFkX2F0dHJfc2V0c2NoZWRwb2xpY3koJnB0aHJlYWRfYXR0ciwgU0NIRURfUlIpOworICAgIHJjID0gcmMgPyByYyA6IHB0aHJlYWRfYXR0cl9zZXRzY2hlZHBhcmFtKCZwdGhyZWFkX2F0dHIsICZwdGhyZWFkX3NjaGVkX3BhcmFtKTsKKyAgICByYyA9IHJjID8gcmMgOiBwdGhyZWFkX2F0dHJfc2V0c3RhY2tzaXplKCZwdGhyZWFkX2F0dHIsIHN0YWNrX3NpemUpOworICAgIHJjID0gcmMgPyByYyA6IHB0aHJlYWRfY3JlYXRlKCZ0YXNrLT5zeXNfdGFzay50LCAmcHRocmVhZF9hdHRyLCAodm9pZCAqKCopKHZvaWQgKikpaGFuZGxlciwgZGF0YSk7CisgICAgcHRocmVhZF9hdHRyX2Rlc3Ryb3koJnB0aHJlYWRfYXR0cik7CisgICAgaWYgKHJjID09IEVQRVJNKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfSU5GTygiVGhyZWFkICVzOiBwcmlvcml0eSAlZCBpcyBpZ25vcmVkLiBTdGFydCBhcyByb290IHRvIGhvbm9yIHByaW9yaXRpZXNcbiIsCisgICAgICAgICAgICBwYXJtLT5uYW1lLCAoaW50KXBhcm0tPnByaW9yaXR5KTsKKyAgICAgICAgcmMgPSBwdGhyZWFkX2NyZWF0ZSgmdGFzay0+c3lzX3Rhc2sudCwgTlVMTCwgKHZvaWQgKigqKSh2b2lkICopKWhhbmRsZXIsIGRhdGEpOworICAgIH0KKyAgICBpZiAocmMpCisgICAgeworICAgICAgICBiY21vc19tdXRleF9sb2NrKCZiY21vc19yZXNfbG9jayk7CisgICAgICAgIFNUQUlMUV9SRU1PVkUoJnRhc2tfbGlzdCwgdGFzaywgYmNtb3NfdGFzaywgbGlzdCk7CisgICAgICAgIGJjbW9zX211dGV4X3VubG9jaygmYmNtb3NfcmVzX2xvY2spOworICAgICAgICB0YXNrLT5tYWdpYyA9IDA7CisgICAgICAgIGlmICghcGFybS0+aGFuZGxlcikKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3Nfc2VtX2Rlc3Ryb3koJnRhc2stPmFjdGl2ZV9zZW0pOworICAgICAgICB9CisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX1NZU0NBTExfRVJSLCAiJXMgKCVkKVxuIiwgc3RyZXJyb3IocmMpLCByYyk7CisgICAgfQorICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBEZXN0cm95IHRhc2sgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX3Rhc2tfZGVzdHJveShiY21vc190YXNrICp0YXNrKQoreworICAgIHZvaWQgKnJlczsKKyAgICBpbnQgcmNfY2FuY2VsOworICAgIGludCByYzsKKworICAgIGlmICh0YXNrLT5tYWdpYyAhPSBCQ01PU19UQVNLX01BR0lDKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgdGFzay0+ZGVzdHJveV9yZXF1ZXN0ID0gQkNNT1NfVFJVRTsKKyAgICB0YXNrLT5tYWdpYyA9IEJDTU9TX1RBU0tfTUFHSUNfREVTVFJPWUVEOworICAgIGJjbW9zX211dGV4X2xvY2soJmJjbW9zX3Jlc19sb2NrKTsKKyAgICBTVEFJTFFfUkVNT1ZFKCZ0YXNrX2xpc3QsIHRhc2ssIGJjbW9zX3Rhc2ssIGxpc3QpOworICAgIGJjbW9zX211dGV4X3VubG9jaygmYmNtb3NfcmVzX2xvY2spOworICAgIC8qIFRoZSB0YXNrIG1heSBiZSB3YWl0aW5nIG9uIHNlbWFwaG9yZS4gS2ljayBpdCAqLworICAgIGlmICghdGFzay0+cGFybS5oYW5kbGVyKQorICAgIHsKKyAgICAgICAgYmNtb3Nfc2VtX3Bvc3QoJnRhc2stPmFjdGl2ZV9zZW0pOworICAgIH0KKyAgICByY19jYW5jZWwgPSBwdGhyZWFkX2NhbmNlbCh0YXNrLT5zeXNfdGFzay50KTsKKyAgICByYyA9IHB0aHJlYWRfam9pbih0YXNrLT5zeXNfdGFzay50LCAmcmVzKTsKKyAgICByZXR1cm4gKHJjIHx8ICgoIXJjX2NhbmNlbCkgJiYgKHJlcyAhPSBQVEhSRUFEX0NBTkNFTEVEKSkpID8gQkNNX0VSUl9TWVNDQUxMX0VSUiA6IDA7Cit9CisKKy8qKiBHZXQgY3VycmVudCB0YXNrCisgKiBccmV0dXJucyB0YXNrIGhhbmRsZSBvciBOVUxMIGlmIG5vdCBpbiB0YXNrIGNvbnRleHQKKyAqLworYmNtb3NfdGFzayAqYmNtb3NfdGFza19jdXJyZW50KHZvaWQpCit7CisgICAgcHRocmVhZF90IHB0ID0gcHRocmVhZF9zZWxmKCk7CisgICAgYmNtb3NfdGFzayAqdCwgKnRtcDsKKworICAgIFNUQUlMUV9GT1JFQUNIX1NBRkUodCwgJnRhc2tfbGlzdCwgbGlzdCwgdG1wKQorICAgIHsKKyAgICAgICAgaWYgKHB0aHJlYWRfZXF1YWwocHQsIHQtPnN5c190YXNrLnQpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiB0OworfQorCisvKgorICogUmVjdXJzaXZlIG11dGV4CisgKi8KKworLyogQ3JlYXRlIHJlY3Vyc2l2ZSBtdXRleCAqLworYmNtb3NfZXJybm8gYmNtb3NfbXV0ZXhfY3JlYXRlKGJjbW9zX211dGV4ICptdXRleCwgdWludDMyX3QgZmxhZ3MsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgaW50IGVycjsKKyAgICBlcnIgPSBwdGhyZWFkX211dGV4YXR0cl9pbml0KCZtdXRleC0+YXR0cik7CisgICAgZXJyID0gZXJyID8gZXJyIDogcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSgmbXV0ZXgtPmF0dHIsIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFX05QKTsKKyAgICBlcnIgPSBlcnIgPyBlcnIgOiBwdGhyZWFkX211dGV4X2luaXQoJm11dGV4LT5tLCAmbXV0ZXgtPmF0dHIpOworICAgIGlmIChlcnIpCisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX1NZU0NBTExfRVJSLCAiZXJybm89JXNcbiIsIHN0cmVycm9yKGVycikpOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiogRGVzdHJveSBtdXRleAorICogXHBhcmFtW2luXSAgIG11dGV4ICAgTXV0ZXggY29udHJvbCBibG9jaworICovCit2b2lkIGJjbW9zX211dGV4X2Rlc3Ryb3koYmNtb3NfbXV0ZXggKm11dGV4KQoreworICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbXV0ZXgtPm0pOworICAgIHB0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3koJm11dGV4LT5hdHRyKTsKK30KKworLyogY2FsY3VsYXRlIGFic29sdXRlIHRpbWUgZXF1YWwgdG8gdGhlIGN1cnJlbnQgdGltZSArIHRpbWVvdXQgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfYmNtb3NfZ2V0X2Fic190aW1lKHN0cnVjdCB0aW1lc3BlYyAqdHMsIHVpbnQzMl90IHRpbWVvdXQpCit7CisgICAgaW50IHJjOworICAgIHJjID0gY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgdHMpOworICAgIEJVR19PTihyYyk7CisgICAgdHMtPnR2X3NlYyArPSB0aW1lb3V0IC8gMTAwMDAwMDsKKyAgICB0cy0+dHZfbnNlYyArPSAodGltZW91dCAlIDEwMDAwMDApICogMTAwMDsKKyAgICBpZiAodHMtPnR2X25zZWMgPiAxMDAwMDAwMDAwKQorICAgIHsKKyAgICAgICAgdHMtPnR2X3NlYyArPSB0cy0+dHZfbnNlYyAvIDEwMDAwMDAwMDA7CisgICAgICAgIHRzLT50dl9uc2VjICU9IDEwMDAwMDAwMDA7CisgICAgfQorfQorCisvKiogTG9jayBtdXRleAorICovCit2b2lkIGJjbW9zX211dGV4X2xvY2soYmNtb3NfbXV0ZXggKm11dGV4KQoreworICAgIGludCByYzsKKyAgICByYyA9IHB0aHJlYWRfbXV0ZXhfbG9jaygmbXV0ZXgtPm0pOworICAgIEJVR19PTihyYyk7CisgICAgcmV0dXJuOworfQorCisvKiogUmVsZWFzZSBtdXRleAorICogXHBhcmFtW2luXSAgIG11dGV4ICAgTXV0ZXggY29udHJvbCBibG9jaworICovCit2b2lkIGJjbW9zX211dGV4X3VubG9jayhiY21vc19tdXRleCAqbXV0ZXgpCit7CisgICAgaW50IHJjOworICAgIHJjID0gcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4LT5tKTsKKyAgICBpZiAocmMpCisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigicHRocmVhZF9tdXRleF91bmxvY2soKS0+JWRcbiIsIHJjKTsKKyAgICBCVUdfT04ocmMpOworfQorCisvKgorICogU2VtYXBob3JlcworICogTW9zdCBvZiBzZW1hcGhvcmUgZnVuY3Rpb25zIGFyZSBpbmxpbmUKKyAqLworCisvKiBDcmVhdGUgc2VtYXBob3JlICovCitiY21vc19lcnJubyBiY21vc19zZW1fY3JlYXRlKGJjbW9zX3NlbSAqc2VtLCB1aW50MzJfdCBjb3VudCwgdWludDMyX3QgZmxhZ3MsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgc2VtX2luaXQoJnNlbS0+cywgMCwgY291bnQpOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBEZXN0cm95IHNlbWFwaG9yZSAqLwordm9pZCBiY21vc19zZW1fZGVzdHJveShiY21vc19zZW0gKnNlbSkKK3sKKyAgICBzZW1fZGVzdHJveSgmc2VtLT5zKTsKK30KKworLyogRGVjcmVtZW50IHNlbWFwaG9yZSBjb3VudGVyLiBXYWl0IGlmIHRoZSBjb3VudGVyIGlzIDAgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX3NlbV93YWl0KGJjbW9zX3NlbSAqc2VtLCB1aW50MzJfdCB0aW1lb3V0KQoreworICAgIGludCByYzsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgdHM7CisKKyAgICAvKiBJbml0IGVuZCB0aW1lIGlmIG5lY2Vzc2FyeSAqLworICAgIGlmICh0aW1lb3V0ICYmIHRpbWVvdXQgIT0gQkNNT1NfV0FJVF9GT1JFVkVSKQorICAgIHsKKyAgICAgICAgX2JjbW9zX2dldF9hYnNfdGltZSgmdHMsIHRpbWVvdXQpOworICAgIH0KKworICAgIGRvCisgICAgeworICAgICAgICBpZiAodGltZW91dCA9PSBCQ01PU19XQUlUX0ZPUkVWRVIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gc2VtX3dhaXQoJnNlbS0+cyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodGltZW91dCkKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBzZW1fdGltZWR3YWl0KCZzZW0tPnMsICZ0cyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByYyA9IHNlbV90cnl3YWl0KCZzZW0tPnMpOworICAgICAgICB9CisgICAgfSB3aGlsZSAocmMgJiYgZXJybm8gPT0gRUlOVFIpOworCisgICAgaWYgKHJjKQorICAgIHsKKyAgICAgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgICAgIHJjID0gZXJybm87CisgICAgICAgIGlmIChyYyA9PSBFVElNRURPVVQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVyciA9IEJDTV9FUlJfVElNRU9VVDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGVyciA9IEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgICAgICBCQ01PU19UUkFDRV9FUlIoInNlbV93YWl0KCktPiVkXG4iLCByYyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworCisvKgorICogVGltZXJzCisgKi8KKworLyoqIEdldCBjdXJyZW50IHRpbWVzdGFtcAorICogXHJldHVybnMgdGhlIGN1cnJlbnQgc3lzdGVtIHRpbWVzdGFtcCAodXMpCisgKi8KK3VpbnQzMl90IGJjbW9zX3RpbWVzdGFtcCh2b2lkKQoreworICAgIHN0cnVjdCB0aW1lc3BlYyB0cDsKKyAgICBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnRwKTsKKyAgICByZXR1cm4gKHRwLnR2X3NlYyAqIDEwMDAwMDAgKyB0cC50dl9uc2VjIC8gMTAwMCk7Cit9CisKKy8qKiBHZXQgY3VycmVudCB0aW1lc3RhbXAgLSA2NCBiaXQKKyAqIFxyZXR1cm5zIHRoZSBjdXJyZW50IHN5c3RlbSB0aW1lc3RhbXAgKHVzKQorICovCit1aW50NjRfdCBiY21vc190aW1lc3RhbXA2NCh2b2lkKQoreworICAgIHN0cnVjdCB0aW1lc3BlYyB0cDsKKyAgICBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnRwKTsKKyAgICByZXR1cm4gKCh1aW50NjRfdCl0cC50dl9zZWMgKiAxMDAwMDAwTEwgKyAodWludDY0X3QpdHAudHZfbnNlYyAvIDEwMDBMTCk7Cit9CisKKy8qCisgKiBUaW1lciBoYW5kbGVycworICovCisKKworCisvKiBGb3IgcG9zaXggd2UgbXVzdCBjcmVhdGUgdGltZXIgdGFzaywgYmVjYXVzZSB0aGVyZSBpcyBubyB3YXkKKyAqIHRvIGVuZm9yY2UgcHJvdGVjdGlvbiBiZXR3ZWVuIGEgc2lnbmFsIGhhbmRsZXIgYW5kIGEgdGhyZWFkCisgKi8KK3N0YXRpYyBiY21vc190YXNrIF9iY21vc190aW1lcl90YXNrOworc3RhdGljIHNlbV90IF9iY21vc190aW1lcl9sb2NrOworCitzdGF0aWMgaW50IF9iY21vc190bXJfdGFza19oYW5kbGVyKGxvbmcgZGF0YSkKK3sKKyAgICBiY21vc19zeXNfdGltZXIgKnRpbWVyID0gKGJjbW9zX3N5c190aW1lciAqKWRhdGE7CisgICAgYmNtb3NfdGFzayAqdGhpc190YXNrID0gYmNtb3NfdGFza19jdXJyZW50KCk7CisKKyAgICB3aGlsZSghdGhpc190YXNrLT5kZXN0cm95X3JlcXVlc3QpCisgICAgeworICAgICAgICBzZW1fd2FpdCgmX2JjbW9zX3RpbWVyX2xvY2spOworICAgICAgICB0aW1lci0+aGFuZGxlcih0aW1lci0+ZGF0YSk7CisgICAgfQorICAgIHRoaXNfdGFzay0+ZGVzdHJveWVkID0gQkNNT1NfVFJVRTsKKworICAgIHJldHVybiAwOworfQorCisvKiB0aW1lciBzaWduYWwgaGFuZGxlciAqLworc3RhdGljIHZvaWQgdGltZXJfc2lnX2hhbmRsZXIoaW50IHNpZywgc2lnaW5mb190ICpzaSwgdm9pZCAqdWMpCit7CisgICAgQlVHX09OKHNpLT5zaV9jb2RlICE9IFNJX1RJTUVSKTsKKyAgICBzZW1fcG9zdCgmX2JjbW9zX3RpbWVyX2xvY2spOworfQorCisvKiBDcmVhdGUgdGltZXIgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX3N5c190aW1lcl9jcmVhdGUoYmNtb3Nfc3lzX3RpbWVyICp0aW1lciwgYmNtb3Nfc3lzX3RpbWVyX2hhbmRsZXIgaGFuZGxlciwgdm9pZCAqZGF0YSkKK3sKKyAgICBzdGF0aWMgYmNtb3NfdGFza19wYXJtIHRtcl90YXNrX3Bhcm0gPSB7CisgICAgICAgIC5uYW1lID0gInRtcl90YXNrIiwKKyAgICAgICAgLnByaW9yaXR5ID0gQkNNT1NfVEFTS19QUklPUklUWV8wLAorICAgICAgICAuaGFuZGxlciA9IF9iY21vc190bXJfdGFza19oYW5kbGVyCisgICAgfTsKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIHN0cnVjdCBzaWdhY3Rpb24gc2E7CisgICAgc3RydWN0IHNpZ2V2ZW50IHNldiA9IHt9OworCisgICAgaWYgKCF0aW1lciB8fCAhaGFuZGxlcikKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfUEFSTSwgInRpbWVyICVwLCBoYW5kbGVyICVwXG4iLCB0aW1lciwgaGFuZGxlcik7CisKKyAgICB0aW1lci0+aGFuZGxlciA9IGhhbmRsZXI7CisgICAgdGltZXItPmRhdGEgPSBkYXRhOworCisgICAgc2VtX2luaXQoJl9iY21vc190aW1lcl9sb2NrLCAwLCAwKTsKKyAgICB0bXJfdGFza19wYXJtLmRhdGEgPSAobG9uZyl0aW1lcjsKKyAgICByYyA9IGJjbW9zX3Rhc2tfY3JlYXRlKCZfYmNtb3NfdGltZXJfdGFzaywgJnRtcl90YXNrX3Bhcm0pOworICAgIGlmIChyYykKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKHJjLCAiQ2FuJ3QgY3JlYXRlIHRpbWVyIHRhc2tcbiIpOworCisgICAgc2Euc2FfZmxhZ3MgPSBTQV9TSUdJTkZPOworICAgIHNhLnNhX3NpZ2FjdGlvbiA9IHRpbWVyX3NpZ19oYW5kbGVyOworICAgIHNpZ2VtcHR5c2V0KCZzYS5zYV9tYXNrKTsKKyAgICBpZiAoc2lnYWN0aW9uKFRJTUVSX1NJRywgJnNhLCBOVUxMKSA9PSAtMSkKKyAgICAgICAgcGVycm9yKCJzaWdhY3Rpb24iKTsKKyAgICAvKiBQcmV2ZW50IHRpbWVyIHNpZ25hbCBmcm9tIGludGVycnVwdGluZyBzeXN0ZW0gY2FsbHMgKi8KKyAgICBpZiAoc2lnaW50ZXJydXB0KFRJTUVSX1NJRywgMCkgPT0gLTEpCisgICAgICAgIHBlcnJvcigic2lnaW50ZXJydXB0Iik7CisKKyAgIC8qIENyZWF0ZSBsaWJydCB0aW1lciAqLworICAgc2V2LnNpZ2V2X25vdGlmeSA9IFNJR0VWX1NJR05BTDsKKyAgIHNldi5zaWdldl9zaWdubyA9IFRJTUVSX1NJRzsKKyAgIHNldi5zaWdldl92YWx1ZS5zaXZhbF9wdHIgPSB0aW1lcjsKKyAgIGlmICh0aW1lcl9jcmVhdGUoQ0xPQ0tfUkVBTFRJTUUsICZzZXYsICZ0aW1lci0+dCkgPT0gLTEpCisgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfU1lTQ0FMTF9FUlIsICJlcnJubyAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKworICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIERlc3Ryb3kgdGltZXIgKi8KK3ZvaWQgYmNtb3Nfc3lzX3RpbWVyX2Rlc3Ryb3koYmNtb3Nfc3lzX3RpbWVyICp0aW1lcikKK3sKKyAgICB0aW1lcl9kZWxldGUodGltZXItPnQpOworICAgIHNlbV9kZXN0cm95KCZfYmNtb3NfdGltZXJfbG9jayk7CisgICAgYmNtb3NfdGFza19kZXN0cm95KCZfYmNtb3NfdGltZXJfdGFzayk7Cit9CisKKy8qIChSZSlzdGFydCB0aW1lciAqLwordm9pZCBiY21vc19zeXNfdGltZXJfc3RhcnQoYmNtb3Nfc3lzX3RpbWVyICp0aW1lciwgdWludDMyX3QgZGVsYXkpCit7CisgICAgc3RydWN0IGl0aW1lcnNwZWMgaXRzOworCisgICAgaXRzLml0X3ZhbHVlLnR2X3NlYyA9IGRlbGF5IC8gMTAwMDAwMDsKKyAgICBpdHMuaXRfdmFsdWUudHZfbnNlYyA9IChkZWxheSAlIDEwMDAwMDApICogMTAwMDsKKyAgICBpdHMuaXRfaW50ZXJ2YWwudHZfc2VjID0gMDsKKyAgICBpdHMuaXRfaW50ZXJ2YWwudHZfbnNlYyA9IDA7CisgICAgaWYgKHRpbWVyX3NldHRpbWUodGltZXItPnQsIDAsICZpdHMsIE5VTEwpID09IC0xKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJ0aW1lcl9zZXR0aW1lIGVycm5vICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICBCVUcoKTsKKyAgICB9Cit9CisKKy8qIFN0b3AgdGltZXIgaWYgcnVubmluZyAqLwordm9pZCBiY21vc19zeXNfdGltZXJfc3RvcChiY21vc19zeXNfdGltZXIgKnRpbWVyKQoreworICAgIHN0cnVjdCBpdGltZXJzcGVjIGl0czsKKworICAgIEJVR19PTighdGltZXIpOworICAgIG1lbXNldCgmaXRzLCAwLCBzaXplb2YoaXRzKSk7CisgICAgdGltZXJfc2V0dGltZSh0aW1lci0+dCwgMCwgJml0cywgTlVMTCk7Cit9CisKKworLyogU3VzcGVuZCBjdXJyZW50IHRhc2sgZm9yIGEgdGltZSAqLwordm9pZCBiY21vc191c2xlZXAodWludDMyX3QgdXMpCit7CisgICAgdWludDMyX3QgdHMgPSBiY21vc190aW1lc3RhbXAoKTsKKyAgICB1aW50MzJfdCB0c2UgPSB0cyArIHVzOworICAgIGludDMyX3QgZCA9ICh1cyA+IDEwMDAwMDApID8gMTAwMDAwMCA6IHVzOworCisgICAgZG8KKyAgICB7CisgICAgICAgIHVzbGVlcChkKTsKKyAgICAgICAgZCA9IHRzZSAtIGJjbW9zX3RpbWVzdGFtcCgpOworICAgICAgICBpZiAoZCA+IDEwMDAwMDApIGQgPSAxMDAwMDAwOworICAgIH0gd2hpbGUgKGQgPiAwKTsKK30KKworLyoKKyAqIE1lbW9yeSBtYW5hZ2VtZW50CisgKi8KKworLyogQWxsb2NhdGUgbWVtb3J5IGZyb20gdGhlIG1haW4gaGVhcCAqLwordm9pZCAqYmNtb3NfYWxsb2ModWludDMyX3Qgc2l6ZSkKK3sKKyAgICByZXR1cm4gbWFsbG9jKHNpemUpOworfQorCisvKiBSZWxlYXNlIG1lbW9yeSB0byB0aGUgbWFpbiBwb29sICovCit2b2lkIGJjbW9zX2ZyZWUodm9pZCAqcHRyKQoreworICAgIGZyZWUocHRyKTsKK30KKworLyoKKyAqIEJ5dGUgbWVtb3J5IHBvb2wKKyAqLworCisvKiBNZW1vcnkgYmxvY2sgaGVhZGVyICovCit0eXBlZGVmIHN0cnVjdCBiY21vc19ieXRlX21lbWJsaworeworICAgIGJjbW9zX2J5dGVfcG9vbCAqcG9vbDsgICAgICAvKiogcG9vbCB0aGF0IG93bnMgdGhlIGJsb2NrICovCisgICAgdWludDMyX3Qgc2l6ZTsgICAgICAgICAgICAgIC8qKiBibG9jayBzaXplIChieXRlcykgaW5jbHVkaW5nIGJjbW9zX2J5dGVfbWVtYmxrIGhlYWRlciAqLworI2lmZGVmIEJDTU9TX01FTV9ERUJVRworICAgIHVpbnQzMl90IG1hZ2ljOyAgICAgICAgICAgICAvKiogbWFnaWMgbnVtYmVyICovCisjZGVmaW5lIEJDTU9TX01FTV9NQUdJQ19BTExPQyAgICgoJ20nPDwyNCkgfCAoJ2InIDw8IDE2KSB8ICgnbCcgPDwgOCkgfCAnaycpCisjZGVmaW5lIEJDTU9TX01FTV9NQUdJQ19GUkVFICAgICgoJ20nPDwyNCkgfCAoJ2InIDw8IDE2KSB8ICgnbCcgPDwgOCkgfCAnficpCisjZW5kaWYKK30gYmNtb3NfYnl0ZV9tZW1ibGs7CisKKy8qIENyZWF0ZSBieXRlIG1lbW9yeSBwb29sICovCitiY21vc19lcnJubyBiY21vc19ieXRlX3Bvb2xfY3JlYXRlKGJjbW9zX2J5dGVfcG9vbCAqcG9vbCwgY29uc3QgYmNtb3NfYnl0ZV9wb29sX3Bhcm0gKnBhcm0pCit7CisgICAgaWYgKCFwb29sIHx8ICFwYXJtKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfUEFSTSwgInBvb2wgJXAsIHBhcm0gJXBcbiIsIHBvb2wsIHBhcm0pOworICAgIH0KKworICAgIEJDTV9NRU1aRVJPX1NUUlVDVChwb29sKTsKKyAgICBwb29sLT5wYXJtID0gKnBhcm07CisgICAgaWYgKCFwb29sLT5wYXJtLnNpemUpCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9QQVJNLCAic2l6ZSAldVxuIiwgcGFybS0+c2l6ZSk7CisgICAgfQorI2lmZGVmIEJDTU9TX01FTV9ERUJVRworICAgIHBvb2wtPm1hZ2ljID0gQkNNT1NfQllURV9QT09MX1ZBTElEOworI2VuZGlmCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIERlc3Ryb3kgbWVtb3J5IHBvb2wgKi8KK2JjbW9zX2Vycm5vIGJjbW9zX2J5dGVfcG9vbF9kZXN0cm95KGJjbW9zX2J5dGVfcG9vbCAqcG9vbCkKK3sKKyAgICBpZiAocG9vbC0+YWxsb2NhdGVkKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfU1RBVEUsICIldSBieXRlcyBvZiBtZW1vcnkgYXJlIHN0aWxsIGFsbG9jYXRlZCBmcm9tIHRoZSBwb29sICVzXG4iLAorICAgICAgICAgICAgcG9vbC0+YWxsb2NhdGVkLCBwb29sLT5wYXJtLm5hbWUpOworICAgIH0KKyNpZmRlZiBCQ01PU19NRU1fREVCVUcKKyAgICBwb29sLT5tYWdpYyA9IEJDTU9TX0JZVEVfUE9PTF9ERUxFVEVEOworI2VuZGlmCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIEFsbG9jYXRlIG1lbW9yeSBmcm9tIG1lbW9yeSBwb29sICovCit2b2lkICpiY21vc19ieXRlX3Bvb2xfYWxsb2MoYmNtb3NfYnl0ZV9wb29sICpwb29sLCB1aW50MzJfdCBzaXplKQoreworICAgIGJjbW9zX2J5dGVfbWVtYmxrICpibGs7CisgICAgdWludDMyX3QgYnl0ZV9zaXplOworICAgIHZvaWQgKnB0cjsKKworI2lmZGVmIEJDTU9TX01FTV9ERUJVRworICAgIEJVR19PTihwb29sLT5tYWdpYyAhPSBCQ01PU19CWVRFX1BPT0xfVkFMSUQpOworI2VuZGlmCisKKyAgICBpZiAoc2l6ZSArIHBvb2wtPmFsbG9jYXRlZCA+IHBvb2wtPnBhcm0uc2l6ZSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBieXRlX3NpemUgPSBzaXplICsgc2l6ZW9mKGJjbW9zX2J5dGVfbWVtYmxrKTsKKyNpZmRlZiBCQ01PU19NRU1fREVCVUcKKyAgICBieXRlX3NpemUgKz0gc2l6ZW9mKHVpbnQzMl90KTsgLyogYmxvY2sgc3VmZml4ICovCisjZW5kaWYKKyAgICAvKiBUb0RvOiBNYWludGFpbiBMTCBvZiBhbGxvY2F0ZWQgYmxvY2tzICovCisgICAgYmxrID0gKGJjbW9zX2J5dGVfbWVtYmxrICopbWFsbG9jKGJ5dGVfc2l6ZSk7CisgICAgaWYgKCFibGspCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHB0ciA9ICh2b2lkICopKGJsayArIDEpOworICAgIGJsay0+c2l6ZSA9IGJ5dGVfc2l6ZTsKKyAgICBwb29sLT5hbGxvY2F0ZWQgKz0gYnl0ZV9zaXplOworICAgIGJsay0+cG9vbCA9IHBvb2w7CisjaWZkZWYgQkNNT1NfTUVNX0RFQlVHCisgICAgYmxrLT5tYWdpYyA9IEJDTU9TX01FTV9NQUdJQ19BTExPQzsKKyAgICAqKHVpbnQzMl90ICopKChsb25nKWJsayArIGJ5dGVfc2l6ZSAtIHNpemVvZih1aW50MzJfdCkpID0gQkNNT1NfTUVNX01BR0lDX0FMTE9DOworI2VuZGlmCisKKyAgICByZXR1cm4gcHRyOworfQorCisvKiBSZWxlYXNlIG1lbW9yeSBhbGxvY2F0ZWQgdXNpbmcgYmNtb3NfYnl0ZV9wb29sX2FsbG9jKCkgKi8KK3ZvaWQgYmNtb3NfYnl0ZV9wb29sX2ZyZWUodm9pZCAqcHRyKQoreworICAgIGJjbW9zX2J5dGVfbWVtYmxrICpibGs7CisgICAgYmNtb3NfYnl0ZV9wb29sICpwb29sOworCisgICAgQlVHX09OKCFwdHIpOworICAgIGJsayA9IChiY21vc19ieXRlX21lbWJsayAqKSgobG9uZylwdHIgLSBzaXplb2YoYmNtb3NfYnl0ZV9tZW1ibGspKTsKKyAgICBwb29sID0gYmxrLT5wb29sOworI2lmZGVmIEJDTU9TX01FTV9ERUJVRworICAgIEJVR19PTihwb29sLT5tYWdpYyAhPSBCQ01PU19CWVRFX1BPT0xfVkFMSUQpOworICAgIEJVR19PTihibGstPm1hZ2ljICE9IEJDTU9TX01FTV9NQUdJQ19BTExPQyk7CisgICAgQlVHX09OKCoodWludDMyX3QgKikoKGxvbmcpYmxrICsgYmxrLT5zaXplIC0gc2l6ZW9mKHVpbnQzMl90KSkgIT0gQkNNT1NfTUVNX01BR0lDX0FMTE9DKTsKKyAgICBibGstPm1hZ2ljID0gQkNNT1NfTUVNX01BR0lDX0ZSRUU7CisjZW5kaWYKKyAgICBwb29sLT5hbGxvY2F0ZWQgLT0gYmxrLT5zaXplOworICAgIGZyZWUoYmxrKTsKK30KKwordm9pZCBfYmNtb3NfYmFja3RyYWNlKHZvaWQpCit7CisgICAgdm9pZCAqYXJyYXlbMzJdOworICAgIHNpemVfdCBzaXplOworICAgIGNoYXIgKipzdHJpbmdzOworICAgIHNpemVfdCBpOworCisgICAgc2l6ZSA9IGJhY2t0cmFjZShhcnJheSwgc2l6ZW9mKGFycmF5KS9zaXplb2YoYXJyYXlbMF0pKTsKKyAgICBzdHJpbmdzID0gYmFja3RyYWNlX3N5bWJvbHMoYXJyYXksIHNpemUpOworCisgICAgcHJpbnRmKCJPYnRhaW5lZCAlemQgc3RhY2sgZnJhbWVzLlxuIiwgc2l6ZSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgICAgICBwcmludGYoIiVzXG4iLCBzdHJpbmdzW2ldKTsKKworICAgIGZyZWUoc3RyaW5ncyk7Cit9CisKKy8qIHN0dWIgZm9yIGludCBlbmFibGUgKi8KK3ZvaWQgYmNtb3NfaW50X2VuYWJsZShpbnQgaXJxKQoreworfQorCit2b2lkIGJjbW9zX2ludF9kaXNhYmxlKGludCBpcnEpCit7Cit9CisKKy8qIHN0dWIgZm9yIGludCBjb25uZWN0ICovCitpbnQgYmNtb3NfaW50X2Nvbm5lY3QoaW50IGlycSwgaW50IGNwdSwgaW50IGZsYWdzLAorICAgIGludCAoKmlzcikoaW50IGlycSwgdm9pZCAqcHJpdiksIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKnByaXYpCit7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIEZ1bmN0aW9ucyBjb21tb24gZm9yIGRvbWFpbiBzb2NrZXQgYW5kIFVEUCBzb2NrZXQgLSBiYXNlZCBtZXNzYWdlIHF1ZXVlcyAqLworI2lmIGRlZmluZWQoQkNNT1NfTVNHX1FVRVVFX0RPTUFJTl9TT0NLRVQpIHx8IGRlZmluZWQoQkNNT1NfTVNHX1FVRVVFX1VEUF9TT0NLRVQpCisKKy8qKiAic2VuZCIgdG8gc29ja2V0ICovCitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbW9zX3NvY2tldF9zZW5kKGJjbW9zX21zZ19xdWV1ZSAqcXVldWUsIHVpbnQ4X3QgKmJ1ZiwgdWludDMyX3QgYnVmX2xlbmd0aCkKK3sKKyAgICBpbnQgcmM7CisgICAgLyogTWVzc2FnZSBxdWV1ZSB3aXRob3V0IHJlbW90ZSBlbmRwb2ludCBhZGRyZXNzIGRvZXNuJ3Qgc3VwcG9ydCB0cmFuc21pdCAqLworICAgIGlmICghcXVldWUtPmVwX2V4dHJhX2RhdGFfc2l6ZSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9UX1NVUFBPUlRFRDsKKyAgICByYyA9IHNlbmR0byhxdWV1ZS0+ZXAsIGJ1ZiwgYnVmX2xlbmd0aCwgMCwKKyAgICAgICAgKHN0cnVjdCBzb2NrYWRkciAqKXF1ZXVlLT5lcF9leHRyYV9kYXRhLCBxdWV1ZS0+ZXBfZXh0cmFfZGF0YV9zaXplKTsKKyAgICByZXR1cm4gKHJjID09IGJ1Zl9sZW5ndGgpID8gQkNNX0VSUl9PSyA6IEJDTV9FUlJfQ09NTV9GQUlMOworfQorCisvKiogInJlY3YiIGZyb20gc29ja2V0ICovCitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbW9zX3NvY2tldF9yZWN2KGJjbW9zX21zZ19xdWV1ZSAqcXVldWUsIHVpbnQzMl90IHRpbWVvdXQsIHVpbnQ4X3QgKipidWYsIHVpbnQzMl90ICpidWZfbGVuZ3RoKQoreworICAgIGludCByYzsKKyAgICBpbnQgd2FpdCA9IDA7CisKKyAgICAvKiBNZXNzYWdlIHF1ZXVlIHdpdGhvdXQgbG9jYWwgZW5kcG9pbnQgYWRkcmVzcyBkb2Vzbid0IHN1cHBvcnQgcmVjZWl2ZSAqLworICAgIGlmICghcXVldWUtPnEucGFybS5sb2NhbF9lcF9hZGRyZXNzKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworCisgICAgaWYgKHRpbWVvdXQgJiYgdGltZW91dCAhPSBCQ01PU19XQUlUX0ZPUkVWRVIpCisgICAgeworICAgICAgICBmZF9zZXQgcmVhZF9mZHM7CisgICAgICAgIHN0cnVjdCB0aW1ldmFsIHR2OworCisgICAgICAgIEZEX1pFUk8oJnJlYWRfZmRzKTsKKyAgICAgICAgRkRfU0VUKHF1ZXVlLT5lcCwgJnJlYWRfZmRzKTsKKyAgICAgICAgdHYudHZfc2VjID0gdGltZW91dCAvIDEwMDAwMDA7CisgICAgICAgIHR2LnR2X3VzZWMgPSAodGltZW91dCAlIDEwMDAwMDApICogMTAwMDsKKyAgICAgICAgcmMgPSBzZWxlY3QocXVldWUtPmVwICsgMSwgJnJlYWRfZmRzLCBOVUxMLCBOVUxMLCAmdHYpOworICAgICAgICBpZiAocmMgPCAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9DT01NX0ZBSUw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFyYyB8fCAhRkRfSVNTRVQocXVldWUtPmVwLCAmcmVhZF9mZHMpKQorICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfVElNRU9VVDsKKyAgICAgICAgd2FpdCA9IE1TR19ET05UV0FJVDsKKyAgICB9CisKKyAgICByYyA9IHJlY3YocXVldWUtPmVwLCBxdWV1ZS0+cmVjdl9idWYsIHF1ZXVlLT5xLnBhcm0ubWF4X210dSwgd2FpdCk7CisgICAgaWYgKHJjIDwgMCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX0NPTU1fRkFJTDsKKyAgICB9CisgICAgaWYgKHJjID09IDApCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PRU5UOworCisgICAgKmJ1ZiA9IHF1ZXVlLT5yZWN2X2J1ZjsKKyAgICAqYnVmX2xlbmd0aCA9IHJjOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisKK3N0YXRpYyBiY21vc19lcnJubyBfYmNtb3Nfc29ja2V0X2Nsb3NlKGJjbW9zX21zZ19xdWV1ZSAqcXVldWUpCit7CisgICAgLyogQ2xvc2UgZG9tYWluIHNvY2tldCAqLworICAgIGlmIChxdWV1ZS0+ZXAgPiAwKQorICAgIHsKKyAgICAgICAgY2xvc2UocXVldWUtPmVwKTsKKyAgICB9CisgICAgaWYgKHF1ZXVlLT5lcF9leHRyYV9kYXRhKQorICAgIHsKKyAgICAgICAgYmNtb3NfZnJlZShxdWV1ZS0+ZXBfZXh0cmFfZGF0YSk7CisgICAgfQorICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisKKy8qIFBhY2sgbWVzc2FnZSBmb3Igb3Zlci10aGUtc29ja2V0IHRyYW5zbWlzc2lvbi4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgZ29vZCBmb3IgY2FzZSB3aGVuIGJvdGggcXVldWUgZW5kcyBhcmUgb24gdGhlIHNhbWUgQ1BVCisgKiBhbmQgdGhlcmUgaXMgbm8gbmVlZCB0byBkbyBhbnkgdHJhbnNsYXRpb24uCisgKi8KK3N0YXRpYyBiY21vc19lcnJubyBfYmNtb3NfdHJhbnNwYXJlbnRfcGFjayhiY21vc19tc2dfcXVldWUgKnF1ZXVlLCBiY21vc19tc2cgKm1zZywgdWludDhfdCAqKmJ1ZiwgdWludDMyX3QgKmJ1Zl9sZW5ndGgpCit7CisgICAgdWludDMyX3Qgc2l6ZSA9IEJDTU9TX01TR19IRFJfU0laRSArIG1zZy0+c2l6ZTsKKworICAgIGlmIChzaXplID4gcXVldWUtPnEucGFybS5tYXhfbXR1KQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfT1ZFUkZMT1csICJBdHRlbXB0IHRvIHNlbmQgbWVzc2FnZSBsb25nZXIgdGhhbiBjb25maWd1cmVkIG1heF9tdHUgJXUgPiAldVxuIiwKKyAgICAgICAgICAgIHNpemUsIHF1ZXVlLT5xLnBhcm0ubWF4X210dSk7CisgICAgfQorICAgIGJjbW9zX21zZ19oZHJfcGFjayhtc2csIHF1ZXVlLT5zZW5kX2J1ZiwgbXNnLT5zaXplKTsKKyAgICBpZiAobXNnLT5zaXplKQorICAgIHsKKyAgICAgICAgQlVHX09OKG1zZy0+ZGF0YSA9PSBOVUxMKTsKKyAgICAgICAgbWVtY3B5KHF1ZXVlLT5zZW5kX2J1ZiArIEJDTU9TX01TR19IRFJfU0laRSwgbXNnLT5kYXRhLCBtc2ctPnNpemUpOworICAgIH0KKyAgICAqYnVmID0gcXVldWUtPnNlbmRfYnVmOworICAgICpidWZfbGVuZ3RoID0gc2l6ZTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqICJ1bnBhY2siIG1lc3NhZ2UuIEluIGNhc2Ugb2YgZG9tYWluIHNvY2tldCBib3RoIHF1ZXVlIGVuZHMgYXJlIGluIHRoZSBzYW1lIENQVS4KKyAqIE1lc3NhZ2UgaXMgc2VudCBhcy1pcworICovCitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbW9zX3RyYW5zcGFyZW50X3VucGFjayhiY21vc19tc2dfcXVldWUgKnF1ZXVlLCB1aW50OF90ICpidWYsIHVpbnQzMl90IGJ1Zl9sZW5ndGgsIGJjbW9zX21zZyAqKm1zZykKK3sKKyAgICBiY21vc19tc2cgKm07CisKKyAgICBpZiAoYnVmX2xlbmd0aCA8IEJDTU9TX01TR19IRFJfU0laRSkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX0lOVEVSTkFMLCAiUmVjZWl2ZWQgbWVzc2FnZSBpcyB0b28gc2hvcnQgKCV1KVxuIiwgYnVmX2xlbmd0aCk7CisgICAgfQorCisgICAgLyogQWRqdXN0IGJ1Zl9sZW5ndGggdG8gYWNjb3VudCBmb3IgZGlmZmVyZW5jZSBpbiBwYWNrZWQgYW5kIHVucGFja2VkIG1lc3NhZ2UgaGVhZGVyIHNpemVzICovCisgICAgYnVmX2xlbmd0aCAtPSBCQ01PU19NU0dfSERSX1NJWkU7CisgICAgYnVmX2xlbmd0aCArPSBzaXplb2YoYmNtb3NfbXNnKTsKKworICAgIG0gPSBiY21vc19hbGxvYyhidWZfbGVuZ3RoKTsKKyAgICBpZiAoIW0pCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9OT01FTSwgIlJlY2VpdmVkIG1lc3NhZ2UgZGlzY2FyZGVkOiAldSBieXRlc1xuIiwgYnVmX2xlbmd0aCk7CisgICAgfQorCisgICAgYmNtb3NfbXNnX2hkcl91bnBhY2soYnVmLCBtKTsKKyAgICBtLT5yZWxlYXNlID0gTlVMTDsKKyAgICBtLT5kYXRhX3JlbGVhc2UgPSBOVUxMOworICAgIGlmIChtLT5zaXplICE9IGJ1Zl9sZW5ndGggLSBzaXplb2YoYmNtb3NfbXNnKSkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiUmVjZWl2ZWQgbWVzc2FnZSBpcyBpbnNhbmUuIEV4cGVjdGVkIGRhdGEgbGVuZ3RoICV1LCBnb3QgJXVcbiIsCisgICAgICAgICAgICBtLT5zaXplLCBidWZfbGVuZ3RoIC0gc2l6ZW9mKGJjbW9zX21zZykpOworICAgICAgICBiY21vc19mcmVlKG0pOworICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICB9CisgICAgaWYgKG0tPnNpemUpCisgICAgeworICAgICAgICBtLT5kYXRhID0gbS0+c3RhcnQgPSAodm9pZCAqKShtICsgMSk7CisgICAgICAgIG1lbWNweShtLT5kYXRhLCAmYnVmW0JDTU9TX01TR19IRFJfU0laRV0sIG0tPnNpemUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBtLT5kYXRhID0gbS0+c3RhcnQgPSBOVUxMOworICAgIH0KKyAgICAqbXNnID0gbTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisKKyNlbmRpZgorCisvKiBEb21haW4tc29ja2V0LWJhc2VkIGludGVyLXByb2Nlc3MgY29tbXVuaWNhdGlvbiAqLworI2lmZGVmIEJDTU9TX01TR19RVUVVRV9ET01BSU5fU09DS0VUCisKK2JjbW9zX2Vycm5vIGJjbW9zX3N5c19tc2dfcXVldWVfZG9tYWluX3NvY2tldF9vcGVuKGJjbW9zX21zZ19xdWV1ZSAqcXVldWUpCit7CisgICAgc3RydWN0IHNvY2thZGRyX3VuIHNhOworCisgICAgLyogT3BlbiBkb21haW4gc29ja2V0ICovCisgICAgcXVldWUtPmVwID0gc29ja2V0KEFGX1VOSVgsIFNPQ0tfREdSQU0sIDApOworICAgIGlmIChxdWV1ZS0+ZXAgPCAwKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfUEFSTSwgIkNhbid0IGNyZWF0ZSBkb21haW4gc29ja2V0LiBlcnJvciAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICB9CisKKyAgICBtZW1zZXQoJnNhLCAwLCBzaXplb2Yoc2EpKTsKKyAgICBzYS5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKKworICAgIC8qIElmIGxvY2FsX2VwX2FkZHJlc3MgaXMgc2V0IC0gdGhlIHF1ZXVlIHN1cHBvcnRzIHJlY2VpdmUgKi8KKyAgICBpZiAocXVldWUtPnEucGFybS5sb2NhbF9lcF9hZGRyZXNzKQorICAgIHsKKyAgICAgICAgc3RybmNweShzYS5zdW5fcGF0aCwgcXVldWUtPnEucGFybS5sb2NhbF9lcF9hZGRyZXNzLCBzaXplb2Yoc2Euc3VuX3BhdGgpIC0gMSk7CisgICAgICAgIC8qIEluIGxpbnV4IHBhdGggY2FuIHN0YXJ0IGZyb20gMCBjaGFyYWN0ZXIgKi8KKyAgICAgICAgaWYgKCFzYS5zdW5fcGF0aFswXSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RybmNweSgmc2Euc3VuX3BhdGhbMV0sICZxdWV1ZS0+cS5wYXJtLmxvY2FsX2VwX2FkZHJlc3NbMV0sIHNpemVvZihzYS5zdW5fcGF0aCkgLSAxKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYmluZChxdWV1ZS0+ZXAsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2EsIHNpemVvZihzYSkpIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGVyciA9IGVycm5vOworICAgICAgICAgICAgY2xvc2UocXVldWUtPmVwKTsKKyAgICAgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX1BBUk0sICJDYW4ndCBiaW5kIGRvbWFpbiBzb2NrZXQgdG8gJXMuIGVycm9yICVzXG4iLAorICAgICAgICAgICAgICAgIHF1ZXVlLT5xLnBhcm0ubG9jYWxfZXBfYWRkcmVzcywgc3RyZXJyb3IoZXJyKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBJZiByZW1vdGVfZXBfYWRkcmVzcyBpcyBzZXQgLSB0aGUgcXVldWUgc3VwcG9ydHMgdHJhbnNtaXQgKi8KKyAgICBpZiAocXVldWUtPnEucGFybS5yZW1vdGVfZXBfYWRkcmVzcykKKyAgICB7CisgICAgICAgIHF1ZXVlLT5lcF9leHRyYV9kYXRhID0gYmNtb3NfY2FsbG9jKHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfdW4pKTsKKyAgICAgICAgaWYgKCFxdWV1ZS0+ZXBfZXh0cmFfZGF0YSkKKyAgICAgICAgeworICAgICAgICAgICAgY2xvc2UocXVldWUtPmVwKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICB9CisgICAgICAgIHN0cm5jcHkoc2Euc3VuX3BhdGgsIHF1ZXVlLT5xLnBhcm0ucmVtb3RlX2VwX2FkZHJlc3MsIHNpemVvZihzYS5zdW5fcGF0aCkgLSAxKTsKKyAgICAgICAgLyogSW4gbGludXggcGF0aCBjYW4gc3RhcnQgZnJvbSAwIGNoYXJhY3RlciAqLworICAgICAgICBpZiAoIXNhLnN1bl9wYXRoWzBdKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJuY3B5KCZzYS5zdW5fcGF0aFsxXSwgJnF1ZXVlLT5xLnBhcm0ucmVtb3RlX2VwX2FkZHJlc3NbMV0sIHNpemVvZihzYS5zdW5fcGF0aCkgLSAxKTsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkocXVldWUtPmVwX2V4dHJhX2RhdGEsICZzYSwgc2l6ZW9mKHNhKSk7CisgICAgICAgIHF1ZXVlLT5lcF9leHRyYV9kYXRhX3NpemUgPSBzaXplb2Yoc2EpOworICAgIH0KKworICAgIC8qIFNldCBjYWxsYmFja3MgKi8KKyAgICBxdWV1ZS0+cS5wYXJtLmNsb3NlID0gX2JjbW9zX3NvY2tldF9jbG9zZTsKKyAgICBxdWV1ZS0+cS5wYXJtLnNlbmQgPSBfYmNtb3Nfc29ja2V0X3NlbmQ7CisgICAgcXVldWUtPnEucGFybS5yZWN2ID0gX2JjbW9zX3NvY2tldF9yZWN2OworICAgIGlmICghcXVldWUtPnEucGFybS5wYWNrKQorICAgICAgICBxdWV1ZS0+cS5wYXJtLnBhY2sgPSBfYmNtb3NfdHJhbnNwYXJlbnRfcGFjazsKKyAgICBpZiAoIXF1ZXVlLT5xLnBhcm0udW5wYWNrKQorICAgICAgICBxdWV1ZS0+cS5wYXJtLnVucGFjayA9IF9iY21vc190cmFuc3BhcmVudF91bnBhY2s7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworI2VuZGlmCisKKy8qIFVEUC1zb2NrZXQtYmFzZWQgaW50ZXItcHJvY2VzcyBjb21tdW5pY2F0aW9uICovCisjaWZkZWYgQkNNT1NfTVNHX1FVRVVFX1VEUF9TT0NLRVQKKworc3RhdGljIGJjbW9zX2Vycm5vIF9iY21vc19wYXJzZV9pcF9wb3J0KGNvbnN0IGNoYXIgKnMsIHN0cnVjdCBzb2NrYWRkcl9pbiAqc2EpCit7CisgICAgdWludDMyX3QgaXA7CisgICAgaW50IG47CisgICAgdWludDMyX3QgaXAxLCBpcDIsIGlwMywgaXA0LCBwb3J0OworCisgICAgbiA9IHNzY2FuZihzLCAiJXUuJXUuJXUuJXU6JXUiLCAmaXAxLCAmaXAyLCAmaXAzLCAmaXA0LCAmcG9ydCk7CisgICAgaWYgKG4gIT0gNSB8fCBpcDEgPiAweGZmIHx8IGlwMiA+IDB4ZmYgfHwgaXAzID4gMHhmZiB8fCBpcDQgPiAweGZmIHx8IHBvcnQgPiAweGZmZmYpCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9QQVJNLCAiQ2FuJ3QgcGFyc2UgJXMuIE11c3QgYmUgaXBfYWRkcmVzczpwb3J0XG4iLCBzKTsKKyAgICB9CisgICAgaXAgPSAoaXAxIDw8IDI0KSB8IChpcDIgPDwgMTYpIHwgKGlwMyA8PCA4KSB8IGlwNDsKKyAgICBzYS0+c2luX3BvcnQgPSBodG9ucyhwb3J0KTsKKyAgICBzYS0+c2luX2FkZHIuc19hZGRyID0gaHRvbmwoaXApOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIGJjbW9zX3N5c19tc2dfcXVldWVfdWRwX3NvY2tldF9vcGVuKGJjbW9zX21zZ19xdWV1ZSAqcXVldWUpCit7CisgICAgc3RydWN0IHNvY2thZGRyX2luIHNhOworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgLyogT3BlbiBVRFAgc29ja2V0ICovCisgICAgcXVldWUtPmVwID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworICAgIGlmIChxdWV1ZS0+ZXAgPCAwKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfUEFSTSwgIkNhbid0IGNyZWF0ZSBVRFAgc29ja2V0LiBlcnJvciAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICB9CisKKyAgICBtZW1zZXQoJnNhLCAwLCBzaXplb2Yoc2EpKTsKKyAgICBzYS5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKworICAgIC8qIElmIGxvY2FsX2VwX2FkZHJlc3MgaXMgc2V0IC0gdGhlIHF1ZXVlIHN1cHBvcnRzIHJlY2VpdmUgKi8KKyAgICBpZiAocXVldWUtPnEucGFybS5sb2NhbF9lcF9hZGRyZXNzKQorICAgIHsKKyAgICAgICAgcmMgPSBfYmNtb3NfcGFyc2VfaXBfcG9ydChxdWV1ZS0+cS5wYXJtLmxvY2FsX2VwX2FkZHJlc3MsICZzYSk7CisgICAgICAgIGlmIChyYykKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgaWYgKCFzYS5zaW5fYWRkci5zX2FkZHIpCisgICAgICAgICAgICBzYS5zaW5fYWRkci5zX2FkZHIgPSBJTkFERFJfQU5ZOworICAgICAgICBpZiAoYmluZChxdWV1ZS0+ZXAsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2EsIHNpemVvZihzYSkpIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGVyciA9IGVycm5vOworICAgICAgICAgICAgY2xvc2UocXVldWUtPmVwKTsKKyAgICAgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX1BBUk0sICJDYW4ndCBiaW5kIFVEUCBzb2NrZXQgdG8gJXMuIGVycm9yICVzXG4iLAorICAgICAgICAgICAgICAgIHF1ZXVlLT5xLnBhcm0ubG9jYWxfZXBfYWRkcmVzcywgc3RyZXJyb3IoZXJyKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBJZiByZW1vdGVfZXBfYWRkcmVzcyBpcyBzZXQgLSB0aGUgcXVldWUgc3VwcG9ydHMgdHJhbnNtaXQgKi8KKyAgICBpZiAocXVldWUtPnEucGFybS5yZW1vdGVfZXBfYWRkcmVzcykKKyAgICB7CisgICAgICAgIHJjID0gX2JjbW9zX3BhcnNlX2lwX3BvcnQocXVldWUtPnEucGFybS5yZW1vdGVfZXBfYWRkcmVzcywgJnNhKTsKKyAgICAgICAgaWYgKHJjKQorICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICBxdWV1ZS0+ZXBfZXh0cmFfZGF0YSA9IGJjbW9zX2NhbGxvYyhzaXplb2Yoc2EpKTsKKyAgICAgICAgaWYgKCFxdWV1ZS0+ZXBfZXh0cmFfZGF0YSkKKyAgICAgICAgeworICAgICAgICAgICAgY2xvc2UocXVldWUtPmVwKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICB9CisgICAgICAgIG1lbWNweShxdWV1ZS0+ZXBfZXh0cmFfZGF0YSwgJnNhLCBzaXplb2Yoc2EpKTsKKyAgICAgICAgcXVldWUtPmVwX2V4dHJhX2RhdGFfc2l6ZSA9IHNpemVvZihzYSk7CisgICAgfQorCisgICAgLyogU2V0IGNhbGxiYWNrcyAqLworICAgIHF1ZXVlLT5xLnBhcm0uY2xvc2UgPSBfYmNtb3Nfc29ja2V0X2Nsb3NlOworICAgIHF1ZXVlLT5xLnBhcm0uc2VuZCA9IF9iY21vc19zb2NrZXRfc2VuZDsKKyAgICBxdWV1ZS0+cS5wYXJtLnJlY3YgPSBfYmNtb3Nfc29ja2V0X3JlY3Y7CisgICAgaWYgKCFxdWV1ZS0+cS5wYXJtLnBhY2spCisgICAgICAgIHF1ZXVlLT5xLnBhcm0ucGFjayA9IF9iY21vc190cmFuc3BhcmVudF9wYWNrOworICAgIGlmICghcXVldWUtPnEucGFybS51bnBhY2spCisgICAgICAgIHF1ZXVlLT5xLnBhcm0udW5wYWNrID0gX2JjbW9zX3RyYW5zcGFyZW50X3VucGFjazsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL3Bvc2l4L2JjbW9zX3N5c3RlbS5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9wb3NpeC9iY21vc19zeXN0ZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGM5MDJlCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9wb3NpeC9iY21vc19zeXN0ZW0uaApAQCAtMCwwICsxLDMwMSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworLyoKKyAqIGJjbW9zX3N5c3RlbS5oCisgKiBNYXBsZSBTeXN0ZW0gU2VydmljZXMKKyAqIHBvc2l4IHBvcnQ6IHNpbXVsYXRpb24KKyAqLworCisjaWZuZGVmIEJDTU9TX1NZU1RFTV9IXworI2RlZmluZSBCQ01PU19TWVNURU1fSF8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8c2VtYXBob3JlLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8ZXhlY2luZm8uaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisvKiBwb3NpeCBwb3J0IGhhcyBvbmx5IGJlZW4gdGVzdGVkIGluIGxpbnV4IHVzZXIgc3BhY2UgKi8KKyNkZWZpbmUgTElOVVhfVVNFUl9TUEFDRQorCisvKiBSZS1kZWZpbmUgR05VIHR5cGVvZiBhcyBJU08gX190eXBlb2ZfXyAqLworI2RlZmluZSB0eXBlb2YgX190eXBlb2ZfXworCit2b2lkIF9iY21vc19iYWNrdHJhY2Uodm9pZCk7CisKKyNkZWZpbmUgQlVHX09OX1BSSU5UKGNvbmRpdGlvbiwgZm10LCBhcmdzLi4uKSBcCisgICAgZG8gXAorICAgIHsgXAorICAgICAgICBpZiAoY29uZGl0aW9uKSBcCisgICAgICAgIHsgXAorICAgICAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKGZtdCwgIyNhcmdzKTsgXAorICAgICAgICAgICAgYXNzZXJ0KCEoY29uZGl0aW9uKSk7IFwKKyAgICAgICAgfSBcCisgICAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBCVUdfT04oY29uZGl0aW9uKSAgICAgQlVHX09OX1BSSU5UKChjb25kaXRpb24pLCAiQlVHIGluICVzICVkIVxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXykKKyNkZWZpbmUgQlVHKCkgICAgICAgICAgICAgICAgIEJVR19PTigxKQorI2RlZmluZSBCVUdfVU5MRVNTKGNvbmRpdGlvbikgQlVHX09OKCEoY29uZGl0aW9uKSkKKworLyogSWYgJ2VycicgaXMgbm90IEJDTV9FUlJfT0ssIHRoZXJlIGlzIGEgYnVnIGluIHRoZSBzb2Z0d2FyZSAtIGhhbHQgYW5kIHByaW50IHRoZSBzcGVjaWZpZWQgbWVzc2FnZSAqLworI2RlZmluZSBCVUdfT05fRVJST1IoZXJyLCBmbXQsIGFyZ3MuLi4pIFwKKyAgICBCVUdfT05fUFJJTlQoKGVycikgIT0gQkNNX0VSUl9PSywgXAorICAgICAgICAiJXM6JWQ6IGVycj0lcyAoJWQpOiAiIGZtdCwgXAorICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBiY21vc19zdHJlcnJvcihlcnIpLCAoZXJyKSwgIyNhcmdzKQorCisvKiBTcGVjaWZ5IGhlcmUgd2hpY2ggc3lzdGVtIGZ1bmN0aW9ucyBhcmUgaW5saW5lZCAqLworCisjZGVmaW5lIEJDTU9TX0ZBU1RMT0NLX0lOTElORQorLyogI2RlZmluZSBCQ01PU19TRU1fV0FJVF9JTkxJTkUgKi8KKyNkZWZpbmUgQkNNT1NfU0VNX1BPU1RfSU5MSU5FCisjZGVmaW5lIEJDTU9TX1RSQUNFX1BSSU5URgorLyogI2RlZmluZSBCQ01PU19CWVRFX1BPT0xfQUxMT0NfRlJFRV9JTkxJTkUgKi8KKy8qICNkZWZpbmUgQkNNT1NfTUFMTE9DX0ZSRUVfSU5MSU5FICovCisvKiAjZGVmaW5lIEJDTU9TX0NBTExPQ19JTkxJTkUgKi8KKyNkZWZpbmUgQkNNT1NfRE1BX0FMTE9DX0ZSRUVfSU5MSU5FCisjZGVmaW5lIEJDTU9TX1ZJUlRfVE9fUEhZU19JTkxJTkUKKyNkZWZpbmUgQkNNT1NfQ0FDSEVfSU5MSU5FCisKKyNpbmNsdWRlICJiY21vc19jb21tb24uaCIKKworLyogcG9zaXgtc3BlY2lmaWMgc3R1ZmYgKi8KKworLyoKKyAqIFN5bmNocm9uaXphdGlvbgorICovCisKKy8qKiBcYWRkdG9ncm91cCBzeXN0ZW1fbXV0ZXgKKyAqIEB7CisgKi8KKworLyoqIE11dGV4IGNvbnRyb2wgYmxvY2sgKi8KK3N0cnVjdCBiY21vc19tdXRleAoreworICAgIHB0aHJlYWRfbXV0ZXhfdCBtOyAgICAgICAgICAvKio8IHB0aHJlYWQgbXV0ZXggKi8KKyAgICBwdGhyZWFkX211dGV4YXR0cl90IGF0dHI7ICAgLyoqPCBwdGhyZWFkIG11dGV4IGF0dHJpYnV0ZSAqLworfTsKKworLyoqIEB9IHN5c3RlbV9tdXRleCAqLworCisvKiogXGFkZHRvZ3JvdXAgc3lzdGVtX2Zhc3Rsb2NrCisgKiBAeworICovCisKKy8qKiBGYXN0IGxvY2sgY29udHJvbCBibG9jayAqLworc3RydWN0IGJjbW9zX2Zhc3Rsb2NrCit7CisgICAgYmNtb3NfbXV0ZXggbTsKK307CisKKy8qKiBGYXN0bG9jayBpbml0aWFsaXplci4gQ2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBjYWxsaW5nIGJjbW9zX2Zhc3Rsb2NrX2luaXQoKSAqLworI2RlZmluZSBCQ01PU19GQVNUTE9DS19JTklUSUFMSVpFUiAgICAgIHsgeyBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSIH0gfQorCisvKiBJbml0IGZhc3Rsb2NrICovCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtb3NfZmFzdGxvY2tfaW5pdChiY21vc19mYXN0bG9jayAqbG9jaywgdWludDMyX3QgZmxhZ3MpCit7CisgICAgYmNtb3NfbXV0ZXhfY3JlYXRlKCZsb2NrLT5tLCAwLCBOVUxMKTsKK30KKworLyogVGFrZSBmYXN0IGxvY2sgKi8KK3N0YXRpYyBpbmxpbmUgbG9uZyBiY21vc19mYXN0bG9ja19sb2NrKGJjbW9zX2Zhc3Rsb2NrICpsb2NrKQoreworICAgIGJjbW9zX211dGV4X2xvY2soJmxvY2stPm0pOworICAgIHJldHVybiAwOworfQorCisvKiBSZWxlYXNlIGZhc3QgbG9jayAqLworc3RhdGljIGlubGluZSB2b2lkIGJjbW9zX2Zhc3Rsb2NrX3VubG9jayhiY21vc19mYXN0bG9jayAqbG9jaywgbG9uZyBmbGFncykKK3sKKyAgICBiY21vc19tdXRleF91bmxvY2soJmxvY2stPm0pOworfQorCisvKiogQH0gc3lzdGVtX2Zhc3Rsb2NrICovCisKKy8qKiBcYWRkdG9ncm91cCBzeXN0ZW1fc2VtCisgKiBAeworICovCisKKy8qKiBTZW1hcGhvcmUgY29udHJvbCBibG9jayAqLworc3RydWN0IGJjbW9zX3NlbQoreworICAgIHNlbV90IHM7ICAgICAgICAgICAgLyoqPCBwdGhyZWFkIHNlbWFwaG9yZSAqLworfTsKKworLyogSW5jcmVtZW50IHNlbWFwaG9yZSBjb3VudGVyICovCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtb3Nfc2VtX3Bvc3QoYmNtb3Nfc2VtICpzZW0pCit7CisgICAgc2VtX3Bvc3QoJnNlbS0+cyk7Cit9CisKKy8qKiBAfSBzeXN0ZW1fc2VtICovCisKKy8qKiBcYWRkdG9ncm91cCBzeXN0ZW1fdGltZXIKKyAqIEB7CisgKi8KKworLyoqIFN5c3RlbSB0aW1lciAqLworc3RydWN0IGJjbW9zX3N5c190aW1lcgoreworICAgIHRpbWVyX3QgdDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgbGlicnQgdGltZXIgKi8KKyAgICBiY21vc19zeXNfdGltZXJfaGFuZGxlciBoYW5kbGVyOyAgICAvKio8IFRpbWVyIGhhbmRsZXIgKi8KKyAgICB2b2lkICpkYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFBhcmFtZXRlciB0byBiZSBwYXNzZWQgdG8gdGhlIGhhbmRsZXIgKi8KK307CisKKy8qKiBAfSBzeXN0ZW1fdGltZXIgKi8KKworLyoqIFxhZGR0b2dyb3VwIHN5c3RlbV90YXNrCisgKiBAeworICovCisKKy8qKiBPUy1zcGVjaWZpYyB0YXNrIGNvbnRyb2wgYmxvY2sgZXh0ZW5zaW9uICovCit0eXBlZGVmIHN0cnVjdCBiY21vc19zeXNfdGFzaworeworICAgIHB0aHJlYWRfdCB0OyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgcG9zaXggcHRocmVhZCAqLworfSBiY21vc19zeXNfdGFzazsKKworLyoqIEB9IHN5c3RlbV90YXNrICovCisKKy8qKiBcYWRkdG9ncm91cCBieXRlX3Bvb2wKKyAqIEB7CisgKi8KKworLyoqIE1lbW9yeSBwb29sIGNvbnRyb2wgYmxvY2sgKi8KK3N0cnVjdCBiY21vc19ieXRlX3Bvb2wKK3sKKyAgICBiY21vc19ieXRlX3Bvb2xfcGFybSBwYXJtOyAgLyoqPCBQb29sIHBhcmFtZXRlcnMgKi8KKyAgICB1aW50MzJfdCBhbGxvY2F0ZWQ7ICAgICAgICAgLyoqPCBOdW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkICovCisjaWZkZWYgQkNNT1NfTUVNX0RFQlVHCisgICAgdWludDMyX3QgbWFnaWM7ICAgICAgICAgICAgIC8qKjwgbWFnaWMgbnVtYmVyICovCisjZGVmaW5lIEJDTU9TX0JZVEVfUE9PTF9WQUxJRCAgICAgICAgICAgKCgnYic8PDI0KSB8ICgneScgPDwgMTYpIHwgKCdwJyA8PCA4KSB8ICdvJykKKyNkZWZpbmUgQkNNT1NfQllURV9QT09MX0RFTEVURUQgICAgICAgICAoKCdiJzw8MjQpIHwgKCd5JyA8PCAxNikgfCAoJ3AnIDw8IDgpIHwgJ34nKQorI2VuZGlmCit9OworCisvKiogQH0gKi8KKworLyogUHJpbnQgKi8KKyNkZWZpbmUgYmNtb3Nfc3lzX3ZwcmludGYoZm10LCBhcmdzKSAgICAgICAgdnByaW50ZihmbXQsIGFyZ3MpCisKKy8qIEEgZmV3IG1hY3JvcyB0byBlbmFibGUgbGludXgga2VybmVsIHNwYWNlIGNvbXBpbGF0aW9uICovCisjZGVmaW5lIEVYUE9SVF9TWU1CT0woX3N5bSkKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgbG93LWxldmVsIGZ1bmN0aW9ucyBhcmUgbW9zdGx5IGZvciBzaW11bGF0aW9uCisgKi8KKworLyoKKyAqIERNQS1hYmxlIG1lbW9yeSBhbGxvY2F0aW9uCisgKi8KKworLyogQWxsb2NhdGUgRE1BLWFibGUgbWVtb3J5ICovCitzdGF0aWMgaW5saW5lIHZvaWQgKmJjbW9zX2RtYV9hbGxvYyh1aW50OF90IGRldmljZSwgdWludDMyX3Qgc2l6ZSkKK3sKKyAgICByZXR1cm4gYmNtb3NfYWxsb2Moc2l6ZSk7Cit9CisKKy8qIFJlbGVhc2UgRE1BLWFibGUgbWVtb3J5ICovCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtb3NfZG1hX2ZyZWUodWludDhfdCBkZXZpY2UsIHZvaWQgKnB0cikKK3sKKyAgICBiY21vc19mcmVlKHB0cik7Cit9CisKKy8qIENvbnZlcnQgdmlydHVhbCBhZGRyZXNzIHRvIHBoeXNpY2FsIGFkZHJlc3MgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBiY21vc192aXJ0X3RvX3BoeXModm9pZCAqdmEpCit7CisgICAgcmV0dXJuICh1bnNpZ25lZCBsb25nKSh2YSk7Cit9CisKKy8qIEludmFsaWRhdGUgYWRkcmVzcyBhcmVhIGluIGRhdGEgY2FjaGUuIERpcnR5IGNhY2hlIGxpbmVzIGNvbnRlbnQgaXMgZGlzY2FyZGVkLiAqLworc3RhdGljIGlubGluZSB2b2lkIGJjbW9zX2RjYWNoZV9pbnYodm9pZCAqc3RhcnQsIHVpbnQzMl90IHNpemUpCit7Cit9CisKKy8qIEZsdXNoIGFkZHJlc3MgYXJlYSBpbiBkYXRhIGNhY2hlLiBEaXJ0eSBjYWNoZSBsaW5lcyBhcmUgY29tbWl0dGVkIHRvIG1lbW9yeS4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBiY21vc19kY2FjaGVfZmx1c2godm9pZCAqc3RhcnQsIHVpbnQzMl90IHNpemUpCit7Cit9CisKKy8qIHdyaXRlIGJhcnJpZXIgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBiY21vc19iYXJyaWVyKHZvaWQpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBiY21fcGNpX3dyaXRlMzIodm9sYXRpbGUgdWludDMyX3QgKmFkZHJlc3MsIHVpbnQzMl90IHZhbHVlKQoreworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGJjbV9wY2lfcmVhZDMyKGNvbnN0IHZvbGF0aWxlIHVpbnQzMl90ICphZGRyZXNzKQoreworCXJldHVybiAtMTsKK30KKworLyogQ2hlY2sgaW4taXJxIHN0YXR1cyAqLworc3RhdGljIGlubGluZSBiY21vc19ib29sIGlzX2lycV9tb2RlKHZvaWQpCit7CisgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworfQorCisvKiBDaGVjayBpZiBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCAqLworc3RhdGljIGlubGluZSBiY21vc19ib29sIGlzX2lycV9kaXNhYmxlZCh2b2lkKQoreworICAgIHJldHVybiBCQ01PU19GQUxTRTsKK30KKworLyoKKyAqIEludGVybmFsICh0byBPUyBhYnN0cmFjdGlvbikgZnVuY3Rpb25zIGZvciBtZXNzYWdpbmcgb3ZlciBkb21haW4gYW5kIFVEUCBzb2NrZXRzCisgKi8KKyNpZmRlZiBCQ01PU19NU0dfUVVFVUVfRE9NQUlOX1NPQ0tFVAorYmNtb3NfZXJybm8gYmNtb3Nfc3lzX21zZ19xdWV1ZV9kb21haW5fc29ja2V0X29wZW4oYmNtb3NfbXNnX3F1ZXVlICpxdWV1ZSk7CisjZW5kaWYKKworI2lmZGVmIEJDTU9TX01TR19RVUVVRV9VRFBfU09DS0VUCitiY21vc19lcnJubyBiY21vc19zeXNfbXNnX3F1ZXVlX3VkcF9zb2NrZXRfb3BlbihiY21vc19tc2dfcXVldWUgKnF1ZXVlKTsKKyNlbmRpZgorCisvKiAybmQgcGFydCBvZiBPUy1pbmRlcGVuZGVudCBkZWNsYXJhdGlvbnMgKi8KKyNpbmNsdWRlICJiY21vc19jb21tb24yLmgiCisKKyNlbmRpZiAvKiBCQ01PU19TWVNURU1fSF8gKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vdnh3b3JrczU1L2JjbW9zX3N5c3RlbS5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi92eHdvcmtzNTUvYmNtb3Nfc3lzdGVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ1YzhkMAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vdnh3b3JrczU1L2JjbW9zX3N5c3RlbS5jCkBAIC0wLDAgKzEsNzQyIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaW5jbHVkZSAiYmNtb3Nfc3lzdGVtLmgiCisjaW5jbHVkZSA8dnhXb3Jrcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHRhc2tMaWIuaD4KKyNpbmNsdWRlIDx3ZExpYi5oPgorI2luY2x1ZGUgPHN5c0xpYi5oPgorI2luY2x1ZGUgPGVycm5vTGliLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGludExpYi5oPgorI2luY2x1ZGUgPGNhY2hlTGliLmg+CisjaW5jbHVkZSAibWVtUGFydExpYi5oIgorCisjaWZkZWYgSE9TVF9DUFVfSVNfTUlQUworI2luY2x1ZGUgImFyY2gvbWlwcy9hcmNoTWlwcy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxpdi5oPgorCisjZGVmaW5lIEJDTU9TX0RFRkFVTFRfU1RBQ0tfU0laRSAoMTAwKjEwMjQpLyoweDQwMDAqLworI2RlZmluZSBCQ01PU19NSUNST1NFQ09ORFNfVE9fVElDS1ModSkgKHUpLzEwMDAwMDAqYmNtb3NfdGltZXJfZ2V0X2ZyZXF1ZW5jeSgpICsgQkNNT1NfRElWSURFX1JPVU5EX1VQKCgodSklMTAwMDAwMCkqYmNtb3NfdGltZXJfZ2V0X2ZyZXF1ZW5jeSgpLDEwMDAwMDApCisKKy8qIHRhc2sgY29udHJvbCBibG9ja3MgKi8KK2V4dGVybiBTVEFJTFFfSEVBRCh0YXNrX2xpc3QsIGJjbW9zX3Rhc2spIHRhc2tfbGlzdDsKKworLyogZ2xvYmFsIE9TIGxvY2sgKi8KK2V4dGVybiBiY21vc19tdXRleCBiY21vc19yZXNfbG9jazsKKworLyoKKyAqIERlZmF1bHQgdGFzayBoYW5kbGVyCisgKi8KK2V4dGVybiBpbnQgYmNtb3NfZGZ0X3Rhc2tfaGFuZGxlcihsb25nIGRhdGEpOworCitiY21vc19lcnJubyBiY21vc19zeXNfaW5pdCh2b2lkKQoreworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBDbGVhbi11cCBzeXN0ZW0gbGlicmFyeSAqLwordm9pZCBiY21vc19zeXNfZXhpdCh2b2lkKQoreworfQorCitzdGF0aWMgdWludDMyX3QgYmNtb3NfdGltZXJfZ2V0X2ZyZXF1ZW5jeSgpCit7CisgICAgc3RhdGljIHVpbnQzMl90IGZyZXF1ZW5jeSA9IDA7CisgICAgaWYgKCFmcmVxdWVuY3kpCisgICAgICAgIGZyZXF1ZW5jeSA9IHN5c0Nsa1JhdGVHZXQoKTsKKyAgICByZXR1cm4gZnJlcXVlbmN5OworfQorCitiY21vc19lcnJubyBiY21vc190YXNrX2NyZWF0ZShiY21vc190YXNrICp0YXNrLCBjb25zdCBiY21vc190YXNrX3Bhcm0gKnBhcm0pCit7CisgICAgRl9iY21vc190YXNrX2hhbmRsZXIgaGFuZGxlcjsKKyAgICB2b2lkICpkYXRhOworCisgICAgaWYgKCF0YXNrIHx8ICFwYXJtKQorICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9QQVJNLCAidGFzayAlcCwgcGFybSAlcFxuIiwgKHZvaWQqICl0YXNrLCAodm9pZCogKXBhcm0pOworICAgIG1lbXNldCh0YXNrLCAwLCBzaXplb2YgKCAqdGFzayApKTsKKworICAgIGlmIChwYXJtLT5oYW5kbGVyKQorICAgIHsKKyAgICAgICAgLyogInRyYWRpdGlvbmFsIHRhc2sgKi8KKyAgICAgICAgaGFuZGxlciA9IHBhcm0tPmhhbmRsZXI7CisgICAgICAgIGRhdGEgPSAodm9pZCAqKXBhcm0tPmRhdGE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbW9zX2Vycm5vIHJjOworICAgICAgICAvKiAiaW50ZWdyYXRlZCIgdGFzayAqLworICAgICAgICBoYW5kbGVyID0gYmNtb3NfZGZ0X3Rhc2tfaGFuZGxlcjsKKyAgICAgICAgZGF0YSA9IHRhc2s7CisKKyAgICAgICAgLyogSW5pdGlhbGl6ZSBhbmQgbG9jayBtdXRleCB0byB3YWl0IG9uICovCisgICAgICAgIHJjID0gYmNtb3Nfc2VtX2NyZWF0ZSgmdGFzay0+YWN0aXZlX3NlbSwgMCwgdGFzay0+cGFybS5mbGFncywgcGFybS0+bmFtZSk7CisgICAgICAgIGlmIChyYykKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJUYXNrICVzOiBjYW4ndCBjcmVhdGUgYWN0aXZlX3NlbS4gRXJyb3IgJXMgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICBwYXJtLT5uYW1lLCBiY21vc19zdHJlcnJvcihyYyksIHJjKTsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHRhc2stPnBhcm0gPSAqcGFybTsKKyAgICAvKiBDb3B5IG5hbWUgdG8gbWFrZSBzdXJlIHRoYXQgaXQgaXMgbm90IHJlbGVhc2VkIC0gaW4gY2FzZSBpdCB3YXMgb24gdGhlIHN0YWNrICovCisgICAgaWYgKHRhc2stPnBhcm0ubmFtZSkKKyAgICB7CisgICAgICAgIHN0cm5jcHkodGFzay0+bmFtZSwgdGFzay0+cGFybS5uYW1lLCBzaXplb2YodGFzay0+bmFtZSkgLSAxKTsKKyAgICAgICAgdGFzay0+cGFybS5uYW1lID0gdGFzay0+bmFtZTsKKyAgICB9CisgICAgYmNtb3NfZmFzdGxvY2tfaW5pdCgmdGFzay0+YWN0aXZlX2xvY2ssIDApOworICAgIGJjbW9zX211dGV4X2xvY2soJmJjbW9zX3Jlc19sb2NrKTsKKyAgICBTVEFJTFFfSU5TRVJUX1RBSUwoJnRhc2tfbGlzdCwgdGFzaywgbGlzdCk7CisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZiY21vc19yZXNfbG9jayk7CisgICAgdGFzay0+bWFnaWMgPSBCQ01PU19UQVNLX01BR0lDOworICAgIHRhc2stPnN5c190YXNrLnQgPSB0YXNrU3Bhd24oKGNoYXIqKXBhcm0tPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAxMCArIHBhcm0tPnByaW9yaXR5ICogMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJtLT5zdGFja19zaXplID8gcGFybS0+c3RhY2tfc2l6ZSA6IEJDTU9TX0RFRkFVTFRfU1RBQ0tfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChGVU5DUFRSKWhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdClkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKworICAgIGlmICh0YXNrLT5zeXNfdGFzay50ID09IEVSUk9SKQorICAgIHsKKyAgICAgICAgYmNtb3NfbXV0ZXhfbG9jaygmYmNtb3NfcmVzX2xvY2spOworICAgICAgICBTVEFJTFFfUkVNT1ZFKCZ0YXNrX2xpc3QsIHRhc2ssIGJjbW9zX3Rhc2ssIGxpc3QpOworICAgICAgICBiY21vc19tdXRleF91bmxvY2soJmJjbW9zX3Jlc19sb2NrKTsKKyAgICAgICAgdGFzay0+bWFnaWMgPSAwOworICAgICAgICBpZiAoIXBhcm0tPmhhbmRsZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3NlbV9kZXN0cm95KCZ0YXNrLT5hY3RpdmVfc2VtKTsKKyAgICAgICAgfQorICAgICAgICBCQ01PU19UUkFDRV9FUlIoIiglcykgRXJyb3I6IHRhc2tTcGF3biwgZXJybm9HZXQoKT0lZFxuIiwgX19GVU5DVElPTl9fLCBlcnJub0dldCgpKTsKKyAgICAgICAgQlVHKCk7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIGJjbW9zX3Rhc2tfZGVzdHJveShiY21vc190YXNrICp0YXNrKQoreworICAgIGlmICh0YXNrLT5tYWdpYyAhPSBCQ01PU19UQVNLX01BR0lDKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgdGFzay0+ZGVzdHJveV9yZXF1ZXN0ID0gQkNNT1NfVFJVRTsKKyAgICBiY21vc19tdXRleF9sb2NrKCZiY21vc19yZXNfbG9jayk7CisgICAgU1RBSUxRX1JFTU9WRSgmdGFza19saXN0LCB0YXNrLCBiY21vc190YXNrLCBsaXN0KTsKKyAgICBiY21vc19tdXRleF91bmxvY2soJmJjbW9zX3Jlc19sb2NrKTsKKyAgICB0YXNrLT5tYWdpYyA9IEJDTU9TX1RBU0tfTUFHSUNfREVTVFJPWUVEOworICAgIC8qIFRoZSB0YXNrIG1heSBiZSB3YWl0aW5nIG9uIHNlbWFwaG9yZS4gS2ljayBpdCAqLworICAgIGlmICghdGFzay0+cGFybS5oYW5kbGVyKQorICAgIHsKKyAgICAgICAgYmNtb3Nfc2VtX3Bvc3QoJnRhc2stPmFjdGl2ZV9zZW0pOworICAgIH0KKyAgICBpZiAodGFza0RlbGV0ZSh0YXNrLT5zeXNfdGFzay50KSAhPSBPSykKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiKCVzKSBFcnJvcjogdGFza0RlbGV0ZSwgZXJybm9HZXQoKT0lZFxuIiwgX19GVU5DVElPTl9fLCBlcnJub0dldCgpKTsKKyAgICAgICAgQlVHKCk7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX3Rhc2sgKmJjbW9zX3Rhc2tfY3VycmVudCh2b2lkKQoreworICAgIHVpbnQzMl90IHB0ID0gdGFza0lkU2VsZigpOworICAgIGJjbW9zX3Rhc2sgKnQsICp0bXA7CisKKyAgICBTVEFJTFFfRk9SRUFDSF9TQUZFKHQsICZ0YXNrX2xpc3QsIGxpc3QsIHRtcCkKKyAgICB7CisgICAgICAgIGlmIChwdCA9PSB0LT5zeXNfdGFzay50KQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiB0OworfQorCit2b2lkICpiY21vc19hbGxvYyh1aW50MzJfdCBzaXplKQoreworICAgIHJldHVybiBtYWxsb2Moc2l6ZSk7Cit9CisKK3ZvaWQgYmNtb3NfZnJlZSh2b2lkICpwdHIpCit7CisgICAgZnJlZShwdHIpOworfQorCitpbmxpbmUgc3RhdGljIHZvaWQgYmNtb3Nfc2VtX211dGV4X2Rlc3Ryb3kodWludDMyX3Qgc20pCit7CisgICAgaWYgKHNlbURlbGV0ZSgoU0VNX0lEKXNtKSAhPSBPSykKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiKCVzKSBFcnJvcjogc2VtRGVsZXRlLCBlcnJub0dldCgpPSVkXG4iLCBfX0ZVTkNUSU9OX18sIGVycm5vR2V0KCkpOworICAgICAgICBCVUcoKTsKKyAgICB9Cit9CisKK2lubGluZSBzdGF0aWMgYmNtb3NfZXJybm8gYmNtb3Nfc2VtX211dGV4X3dhaXQodWludDMyX3Qgc20sIHVpbnQzMl90IHRpbWVvdXQpCit7CisgICAgaW50IGVycm5vOworICAgIFNUQVRVUyBzdGF0dXM7CisKKyAgICB0aW1lb3V0ID0gKCh0aW1lb3V0ID09IEJDTU9TX1dBSVRfRk9SRVZFUiApPyBXQUlUX0ZPUkVWRVIgOiBCQ01PU19NSUNST1NFQ09ORFNfVE9fVElDS1ModGltZW91dCkpOworICAgIHN0YXR1cyA9IHNlbVRha2UoKFNFTV9JRClzbSwgdGltZW91dCk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykKKyAgICB7CisgICAgICAgIGVycm5vID0gZXJybm9HZXQoKTsKKyAgICAgICAgaWYgKGVycm5vID09IFNfb2JqTGliX09CSl9USU1FT1VUKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9USU1FT1VUOworICAgICAgICB9CisgICAgICAgIEJVRygpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICB9CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2lubGluZSBzdGF0aWMgdm9pZCBiY21vc19zZW1fbXV0ZXhfcG9zdCh1aW50MzJfdCBzbSkKK3sKKyAgICBTVEFUVVMgc3RhdHVzOworCisgICAgc3RhdHVzID0gc2VtR2l2ZSgoU0VNX0lEKXNtKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCIoJXMpIEVycm9yOiBzZW1HaXZlLCBzdGF0dXM9JWRcbiIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKyAgICAgICAgQlVHKCk7CisgICAgfQorfQorCitiY21vc19lcnJubyBiY21vc19zZW1fY3JlYXRlKGJjbW9zX3NlbSAqc2VtLCB1aW50MzJfdCBjb3VudCwgdWludDMyX3QgZmxhZ3MsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgU0VNX0lEIHNlbWFwaG9yZTsKKworICAgIHNlbWFwaG9yZSA9IHNlbUNDcmVhdGUoU0VNX1FfUFJJT1JJVFksIChTRU1fQl9TVEFURSljb3VudCk7CisgICAgaWYgKHNlbWFwaG9yZSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCIoJXMpIEVycm9yOiBzZW1DQ3JlYXRlLCBlcnJub0dldCgpPSVkXG4iLCBfX0ZVTkNUSU9OX18sIGVycm5vR2V0KCkpOworICAgICAgICBCVUcoKTsKKyAgICB9CisgICAgc2VtLT5zID0gKHVpbnQzMl90KXNlbWFwaG9yZTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCit2b2lkIGJjbW9zX3NlbV9kZXN0cm95KGJjbW9zX3NlbSAqc2VtKQoreworICAgIGJjbW9zX3NlbV9tdXRleF9kZXN0cm95KHNlbS0+cyk7Cit9CisKK2JjbW9zX2Vycm5vIGJjbW9zX3NlbV93YWl0KGJjbW9zX3NlbSAqc2VtLCB1aW50MzJfdCB0aW1lb3V0KQoreworICAgIHJldHVybiBiY21vc19zZW1fbXV0ZXhfd2FpdChzZW0tPnMsIHRpbWVvdXQpOworfQorCit2b2lkIGJjbW9zX3NlbV9wb3N0KGJjbW9zX3NlbSAqc2VtKQoreworICAgIGJjbW9zX3NlbV9tdXRleF9wb3N0KHNlbS0+cyk7Cit9CisKK2JjbW9zX2Vycm5vIGJjbW9zX211dGV4X2NyZWF0ZShiY21vc19tdXRleCAqbXV0ZXgsIHVpbnQzMl90IGZsYWdzLCBjb25zdCBjaGFyICpuYW1lKQoreworICAgIFNFTV9JRCBzZW1hcGhvcmU7CisgICAgaW50IG9wdGlvbnM7CisKKyAgICAvKiBTRU1fSU5WRVJTSU9OX1NBRkU6IEVuYWJsZSAoYnkgZGVmYXVsdCkgdGhlIHByZXZlbnRpb24gb2YgcHJpb3JpdHkgaW52ZXJzaW9uIHByb2JsZW0gKi8KKyAgICBvcHRpb25zID0gU0VNX1FfUFJJT1JJVFkgfCBTRU1fSU5WRVJTSU9OX1NBRkU7CisKKyAgICBzZW1hcGhvcmUgPSBzZW1NQ3JlYXRlKG9wdGlvbnMpOworICAgIGlmIChzZW1hcGhvcmUgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiKCVzKSBFcnJvcjogc2VtQ0NyZWF0ZSwgZXJybm9HZXQoKT0lZFxuIiwgX19GVU5DVElPTl9fLCBlcnJub0dldCgpKTsKKyAgICAgICAgQlVHKCk7CisgICAgfQorCisgICAgbXV0ZXgtPm0gPSAodWludDMyX3Qpc2VtYXBob3JlOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3ZvaWQgYmNtb3NfbXV0ZXhfZGVzdHJveShiY21vc19tdXRleCAqbXV0ZXgpCit7CisgICAgYmNtb3Nfc2VtX211dGV4X2Rlc3Ryb3kobXV0ZXgtPm0pOworfQorCit2b2lkIGJjbW9zX211dGV4X2xvY2soYmNtb3NfbXV0ZXggKm11dGV4KQoreworICAgIGJjbW9zX3NlbV9tdXRleF93YWl0KG11dGV4LT5tLCBCQ01PU19XQUlUX0ZPUkVWRVIpOworfQorCit2b2lkIGJjbW9zX211dGV4X3VubG9jayhiY21vc19tdXRleCAqbXV0ZXgpCit7CisgICAgYmNtb3Nfc2VtX211dGV4X3Bvc3QobXV0ZXgtPm0pOworfQorCit2b2lkIGJjbW9zX2Zhc3Rsb2NrX2luaXQoYmNtb3NfZmFzdGxvY2sgKmxvY2ssIHVpbnQzMl90IGZsYWdzKQoreworfQorCitsb25nIGJjbW9zX2Zhc3Rsb2NrX2xvY2soYmNtb3NfZmFzdGxvY2sgKmxvY2spCit7CisgICAgcmV0dXJuIChsb25nKWludExvY2soKTsKK30KKwordm9pZCBiY21vc19mYXN0bG9ja191bmxvY2soYmNtb3NfZmFzdGxvY2sgKmxvY2ssIGxvbmcgZmxhZ3MpCit7CisgICAgaW50VW5sb2NrKGZsYWdzKTsKK30KKworYmNtb3NfZXJybm8gYmNtb3Nfc3lzX3RpbWVyX2NyZWF0ZShiY21vc19zeXNfdGltZXIgKnRpbWVyLCBiY21vc19zeXNfdGltZXJfaGFuZGxlciBoYW5kbGVyLCB2b2lkICpkYXRhKQoreworICAgIFdET0dfSUQgd2F0Y2hkb2c7CisKKyAgICBpZiAoIXRpbWVyIHx8ICFoYW5kbGVyKQorICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9QQVJNLCAidGltZXIgJXAsIGhhbmRsZXIgJXBcbiIsIHRpbWVyLCBoYW5kbGVyKTsKKworICAgIC8qIENhbGwgdGhlIHVuZGVybHlpbmcgT1MgKi8KKyAgICB3YXRjaGRvZyA9IHdkQ3JlYXRlKCk7CisgICAgaWYgKHdhdGNoZG9nID09IE5VTEwpCisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX1NZU0NBTExfRVJSLCAiZXJybm8gJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisKKyAgICB0aW1lci0+dCA9ICh1aW50MzJfdCl3YXRjaGRvZzsKKyAgICB0aW1lci0+aGFuZGxlciA9IGhhbmRsZXI7CisgICAgdGltZXItPmRhdGEgPSBkYXRhOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3ZvaWQgYmNtb3Nfc3lzX3RpbWVyX2Rlc3Ryb3koYmNtb3Nfc3lzX3RpbWVyICp0aW1lcikKK3sKKyAgICBTVEFUVVMgc3RhdHVzOworICAgIHN0YXR1cyA9IHdkRGVsZXRlKChXRE9HX0lEKXRpbWVyLT50KTsKKyAgICBCQ01PU19UUkFDRV9ERUJVRygid2REZWxldGU6IHN0YXR1cz0lZFxuIiwgc3RhdHVzKTsKK30KKworc3RhdGljIHZvaWQgX2JjbW9zX3RpbWVfaGFuZGxlcl93cmFwcGVyKGxvbmcgZGF0YSkKK3sKKyAgICBiY21vc19zeXNfdGltZXIgKiB0aW1lciA9IChiY21vc19zeXNfdGltZXIqKWRhdGEgOworICAgIHRpbWVyLT5oYW5kbGVyKHRpbWVyLT5kYXRhKTsKK30KKwordm9pZCBiY21vc19zeXNfdGltZXJfc3RhcnQoYmNtb3Nfc3lzX3RpbWVyICp0aW1lciwgdWludDMyX3QgZGVsYXkpCit7CisgICAgU1RBVFVTIHN0YXR1czsKKyAgICBzdGF0dXMgPSB3ZFN0YXJ0KChXRE9HX0lEKXRpbWVyLT50LCBCQ01PU19NSUNST1NFQ09ORFNfVE9fVElDS1MoZGVsYXkpLCAoRlVOQ1BUUilfYmNtb3NfdGltZV9oYW5kbGVyX3dyYXBwZXIsIChsb25nKXRpbWVyKTsKKyAgICBpZiAoc3RhdHVzID09IEVSUk9SKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJ3ZFN0YXJ0IHN0YXR1cyAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgQlVHKCk7CisgICAgfQorfQorCit2b2lkIGJjbW9zX3N5c190aW1lcl9zdG9wKGJjbW9zX3N5c190aW1lciAqdGltZXIpCit7CisgICAgU1RBVFVTIHN0YXR1czsKKyAgICBzdGF0dXMgPSB3ZENhbmNlbCgoV0RPR19JRCl0aW1lci0+dCk7CisgICAgaWYgKHN0YXR1cyA9PSBFUlJPUikKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigid2RDYW5jZWwgc3RhdHVzPSVkXG4iLCBzdGF0dXMpOworICAgICAgICBCVUcoKTsKKyAgICB9Cit9CisKK3ZvaWQgYmNtb3NfdXNsZWVwKHVpbnQzMl90IHVzKQoreworICAgIHN0cnVjdCB0aW1lc3BlYyB0czsKKworICAgIHRzLnR2X3NlYyA9IHVzIC8gMTAwMDAwMDsKKyAgICB0cy50dl9uc2VjID0gKCB1cyAlIDEwMDAwMDAgKSAqIDEwMDA7CisKKyAgICBuYW5vc2xlZXAoJnRzLCAwKTsKK30KKwordWludDMyX3QgYmNtb3NfdGltZXN0YW1wKHZvaWQpCit7CisgICAgc3RydWN0IHRpbWVzcGVjIHRzOworICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZ0cyk7CisgICAgcmV0dXJuICh0cy50dl9zZWMgKiAxMDAwMDAwICsgdHMudHZfbnNlYyAvIDEwMDApOworfQorCisvKiogR2V0IGN1cnJlbnQgdGltZXN0YW1wIC0gNjQgYml0CisgKiBccmV0dXJucyB0aGUgY3VycmVudCBzeXN0ZW0gdGltZXN0YW1wICh1cykKKyAqLwordWludDY0X3QgYmNtb3NfdGltZXN0YW1wNjQodm9pZCkKK3sKKyAgICBzdHJ1Y3QgdGltZXNwZWMgdHM7CisgICAgY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJnRzKTsKKyAgICByZXR1cm4gKCh1aW50NjRfdCl0cy50dl9zZWMgKiAxMDAwMDAwTEwgKyAodWludDY0X3QpdHMudHZfbnNlYyAvIDEwMDBMTCk7Cit9CisKKy8qCisgKiBCeXRlIG1lbW9yeSBwb29sCisgKi8KKworLyogTWVtb3J5IGJsb2NrIGhlYWRlciAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb3NfYnl0ZV9tZW1ibGsKK3sKKyAgICBiY21vc19ieXRlX3Bvb2wgKnBvb2w7ICAgICAgLyoqIHBvb2wgdGhhdCBvd25zIHRoZSBibG9jayAqLworICAgIHVpbnQzMl90IHNpemU7ICAgICAgICAgICAgICAvKiogYmxvY2sgc2l6ZSAoYnl0ZXMpIGluY2x1ZGluZyBiY21vc19ieXRlX21lbWJsayBoZWFkZXIgKi8KKyNpZmRlZiBCQ01PU19NRU1fREVCVUcKKyAgICB1aW50MzJfdCBtYWdpYzsgICAgICAgICAgICAgLyoqIG1hZ2ljIG51bWJlciAqLworI2RlZmluZSBCQ01PU19NRU1fTUFHSUNfQUxMT0MgICAoKCdtJzw8MjQpIHwgKCdiJyA8PCAxNikgfCAoJ2wnIDw8IDgpIHwgJ2snKQorI2RlZmluZSBCQ01PU19NRU1fTUFHSUNfRlJFRSAgICAoKCdtJzw8MjQpIHwgKCdiJyA8PCAxNikgfCAoJ2wnIDw8IDgpIHwgJ34nKQorI2VuZGlmCit9IGJjbW9zX2J5dGVfbWVtYmxrOworCisvKiBDcmVhdGUgYnl0ZSBtZW1vcnkgcG9vbCAqLworYmNtb3NfZXJybm8gYmNtb3NfYnl0ZV9wb29sX2NyZWF0ZShiY21vc19ieXRlX3Bvb2wgKnBvb2wsIGNvbnN0IGJjbW9zX2J5dGVfcG9vbF9wYXJtICpwYXJtKQoreworICAgIGlmICghcG9vbCB8fCAhcGFybSkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX1BBUk0sICJwb29sICVwLCBwYXJtICVwXG4iLCBwb29sLCBwYXJtKTsKKyAgICB9CisKKyAgICBCQ01fTUVNWkVST19TVFJVQ1QocG9vbCk7CisgICAgcG9vbC0+cGFybSA9ICpwYXJtOworICAgIGlmICghcG9vbC0+cGFybS5zaXplKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfUEFSTSwgInNpemUgJXVcbiIsIHBhcm0tPnNpemUpOworICAgIH0KKyNpZmRlZiBCQ01PU19NRU1fREVCVUcKKyAgICBwb29sLT5tYWdpYyA9IEJDTU9TX0JZVEVfUE9PTF9WQUxJRDsKKyNlbmRpZgorICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBEZXN0cm95IG1lbW9yeSBwb29sICovCitiY21vc19lcnJubyBiY21vc19ieXRlX3Bvb2xfZGVzdHJveShiY21vc19ieXRlX3Bvb2wgKnBvb2wpCit7CisgICAgaWYgKHBvb2wtPmFsbG9jYXRlZCkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX1NUQVRFLCAiJXUgYnl0ZXMgb2YgbWVtb3J5IGFyZSBzdGlsbCBhbGxvY2F0ZWQgZnJvbSB0aGUgcG9vbCAlc1xuIiwKKyAgICAgICAgICAgIHBvb2wtPmFsbG9jYXRlZCwgcG9vbC0+cGFybS5uYW1lKTsKKyAgICB9CisjaWZkZWYgQkNNT1NfTUVNX0RFQlVHCisgICAgcG9vbC0+bWFnaWMgPSBCQ01PU19CWVRFX1BPT0xfREVMRVRFRDsKKyNlbmRpZgorICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBBbGxvY2F0ZSBtZW1vcnkgZnJvbSBtZW1vcnkgcG9vbCAqLwordm9pZCAqYmNtb3NfYnl0ZV9wb29sX2FsbG9jKGJjbW9zX2J5dGVfcG9vbCAqcG9vbCwgdWludDMyX3Qgc2l6ZSkKK3sKKyAgICBiY21vc19ieXRlX21lbWJsayAqYmxrOworICAgIHVpbnQzMl90IGJ5dGVfc2l6ZTsKKyAgICB2b2lkICpwdHI7CisKKyNpZmRlZiBCQ01PU19NRU1fREVCVUcKKyAgICBCVUdfT04ocG9vbC0+bWFnaWMgIT0gQkNNT1NfQllURV9QT09MX1ZBTElEKTsKKyNlbmRpZgorCisgICAgaWYgKHNpemUgKyBwb29sLT5hbGxvY2F0ZWQgPiBwb29sLT5wYXJtLnNpemUpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgYnl0ZV9zaXplID0gc2l6ZSArIHNpemVvZihiY21vc19ieXRlX21lbWJsayk7CisjaWZkZWYgQkNNT1NfTUVNX0RFQlVHCisgICAgYnl0ZV9zaXplICs9IHNpemVvZih1aW50MzJfdCk7IC8qIGJsb2NrIHN1ZmZpeCAqLworI2VuZGlmCisgICAgLyogVG9EbzogTWFpbnRhaW4gTEwgb2YgYWxsb2NhdGVkIGJsb2NrcyAqLworICAgIGJsayA9IChiY21vc19ieXRlX21lbWJsayAqKW1hbGxvYyhieXRlX3NpemUpOworICAgIGlmICghYmxrKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwdHIgPSAodm9pZCAqKShibGsgKyAxKTsKKyAgICBibGstPnNpemUgPSBieXRlX3NpemU7CisgICAgcG9vbC0+YWxsb2NhdGVkICs9IGJ5dGVfc2l6ZTsKKyAgICBibGstPnBvb2wgPSBwb29sOworI2lmZGVmIEJDTU9TX01FTV9ERUJVRworICAgIGJsay0+bWFnaWMgPSBCQ01PU19NRU1fTUFHSUNfQUxMT0M7CisgICAgKih1aW50MzJfdCAqKSgobG9uZylibGsgKyBieXRlX3NpemUgLSBzaXplb2YodWludDMyX3QpKSA9IEJDTU9TX01FTV9NQUdJQ19BTExPQzsKKyNlbmRpZgorCisgICAgcmV0dXJuIHB0cjsKK30KKworLyogUmVsZWFzZSBtZW1vcnkgYWxsb2NhdGVkIHVzaW5nIGJjbW9zX2J5dGVfcG9vbF9hbGxvYygpICovCit2b2lkIGJjbW9zX2J5dGVfcG9vbF9mcmVlKHZvaWQgKnB0cikKK3sKKyAgICBiY21vc19ieXRlX21lbWJsayAqYmxrOworICAgIGJjbW9zX2J5dGVfcG9vbCAqcG9vbDsKKworICAgIEJVR19PTighcHRyKTsKKyAgICBibGsgPSAoYmNtb3NfYnl0ZV9tZW1ibGsgKikoKGxvbmcpcHRyIC0gc2l6ZW9mKGJjbW9zX2J5dGVfbWVtYmxrKSk7CisgICAgcG9vbCA9IGJsay0+cG9vbDsKKyNpZmRlZiBCQ01PU19NRU1fREVCVUcKKyAgICBCVUdfT04ocG9vbC0+bWFnaWMgIT0gQkNNT1NfQllURV9QT09MX1ZBTElEKTsKKyAgICBCVUdfT04oYmxrLT5tYWdpYyAhPSBCQ01PU19NRU1fTUFHSUNfQUxMT0MpOworICAgIEJVR19PTigqKHVpbnQzMl90ICopKChsb25nKWJsayArIGJsay0+c2l6ZSAtIHNpemVvZih1aW50MzJfdCkpICE9IEJDTU9TX01FTV9NQUdJQ19BTExPQyk7CisgICAgYmxrLT5tYWdpYyA9IEJDTU9TX01FTV9NQUdJQ19GUkVFOworI2VuZGlmCisgICAgcG9vbC0+YWxsb2NhdGVkIC09IGJsay0+c2l6ZTsKKyAgICBmcmVlKGJsayk7Cit9CisKK3ZvaWQgX2JjbW9zX2JhY2t0cmFjZSh2b2lkKQoreworICAgIC8qdG9kbyBpbXBsZW1lbnQgdGhpcyovCit9CisKK2ludCBmZnNsbChsb25nIGxvbmcgaW50IGkpCit7CisgICAgaW50IGwgPSBmZnMoaSAmIDB4RkZGRkZGRkYpOworICAgIGludCBoID0gZmZzKChpID4+IDMyKSAmIDB4RkZGRkZGRkYpOworCisgICAgaWYgKGwpCisgICAgICAgIHJldHVybiBsOworCisgICAgaWYgKGgpCisgICAgICAgIHJldHVybiBoICsgMzI7CisKKyAgICByZXR1cm4gMDsKK30KKworLyogc3R1YiBmb3IgaW50IGVuYWJsZSAqLwordm9pZCBiY21vc19pbnRfZW5hYmxlKGludCBpcnEpCit7Cit9CisKK3R5cGVkZWYgc3RydWN0IGJjbW9zX2ludF9kYXRhCit7CisgICBpbnQgKCppc3IpKGludCBpcnEsIHZvaWQgKnByaXYpOworICAgaW50IGlycTsKKyAgIHZvaWQgKnByaXY7Cit9IGJjbW9zX2ludF9kYXRhOworCitzdGF0aWMgdm9pZCBfYmNtb3NfaW50X2hhbmRsZXIobG9uZyBwcml2KQoreworICAgICBiY21vc19pbnRfZGF0YSAqZGF0YSA9IChiY21vc19pbnRfZGF0YSAqKXByaXY7CisgICAgIGRhdGEtPmlzcihkYXRhLT5pcnEsIGRhdGEtPnByaXYpOworfQorCitpbnQgYmNtb3NfaW50X2Nvbm5lY3QoaW50IGlycSwgaW50IGNwdSwgaW50IGZsYWdzLCBpbnQgKCppc3IpKGludCBpcnEsIHZvaWQgKnByaXYpLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpwcml2KQoreworICAgYmNtb3NfaW50X2RhdGEgKmRhdGEgPSBiY21vc19jYWxsb2Moc2l6ZW9mKGJjbW9zX2ludF9kYXRhKSk7CisgICBpZiAoIWRhdGEpCisgICAgICByZXR1cm4gKGludClCQ01fRVJSX05PTUVNOworICAgZGF0YS0+aXNyID0gaXNyOworICAgZGF0YS0+aXJxID0gaXJxOworICAgZGF0YS0+cHJpdiA9IHByaXY7CisgICByZXR1cm4gcGNpSW50Q29ubmVjdChJTlVNX1RPX0lWRUMoaXJxKSwgX2JjbW9zX2ludF9oYW5kbGVyLCAobG9uZylkYXRhKTsKK30KKworLyogRGlzY29ubmVjdCBzeXN0ZW0gaW50ZXJydXB0ICovCit2b2lkIGJjbW9zX2ludF9kaXNjb25uZWN0KGludCBpcnEsIHZvaWQgKnByaXYpCit7CisgICAgcGNpSW50RGlzY29ubmVjdChJTlVNX1RPX0lWRUMoaXJxKSwgX2JjbW9zX2ludF9oYW5kbGVyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDaGVjayBpbi1pcnEgc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIHJlbGF0ZWQgaGVhZGVyIGZpbGU6ICJpbnRMaWIuaCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogcGFyYW1baW5dICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBwYXJhbVtvdXRdICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIHJldHVybiAgICAgIEJDTU9TX1RSVUUgICgxKSAtIGluIGludGVycnVwdCBjb250ZXh0OyAgICAgICAgKgorICogICAgICAgICAgICAgQkNNT1NfRkFMU0UgKDApIC0gaW4gdGFzayBjb250ZXh0OyAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2JjbW9zX2Jvb2wgaXNfaXJxX21vZGUodm9pZCkKK3sKKyAgICByZXR1cm4gaW50Q29udGV4dCgpOworfQorCisvLyBmcm9tIGJzcAorZXh0ZXJuIGludCBpc0ludERpc2FibGVkKCk7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENoZWNrIGlmIGludGVycnVwdHMgYXJlIGRpc2FibGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogcmVsYXRlZCBoZWFkZXIgZmlsZTogIm1pcHNpbmMuaCIgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBwYXJhbVtpbl0gICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIHBhcmFtW291dF0gIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogcmV0dXJuICAgICAgQkNNT1NfVFJVRSAoMSkgLSAgR2xvYWwgaW50ZXJydXB0IGRpc2FibGUgICAgICAqCisgICAgICAgICAgICAgICBCQ01PU19GQUxTRSAoMCkgLSBHbG9hbCBpbnRlcnJ1cHQgZW5hYmxlOyAgICAgICoKKyAqIGNvbW1lbnQgICAgIGlmIEJTUCB0ZWFtIGNhbiBwcm92aWRlIHNpbWlsYXIgZnVuY3Rpb24sICAgICAgKgorICAgICAgICAgICAgICAgd2Ugd2lsbCBjYWxsIGl0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBBbm90aGVyIG9wdGlvbiBpcyBzaGFyZSB0aGlzIG1hY3JvIHVzZWQgb24gc3dpdGNoIHByb2R1Y3QgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBpc19pcnFfZGlzYWJsZWQodm9pZCkKK3sKKyAgICByZXR1cm4gaXNJbnREaXNhYmxlZCgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHdyaXRlIGJhcnJpZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogcmVsYXRlZCBoZWFkZXIgZmlsZTogbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBwYXJhbVtpbl0gICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIHBhcmFtW291dF0gIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogcmV0dXJuIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBjb21tZW50OnVzZSAic3luYyIgYmFzZSBvbiBNSVBTIChHTlUgc3R5bGUpICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGJjbW9zX2JhcnJpZXIodm9pZCkKK3sKKyAjaWYgZGVmaW5lZChIT1NUX0NQVV9JU19NSVBTKSB8fCBkZWZpbmVkKEhPU1RfQ1BVX0lTX1BQQykKKyAgICB7X19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmMiKTt9CisgI2Vsc2UKKyAgICNlcnJvciBIT1NUIENQVSBNVVNUIEJFIE1JUFMgT1IgUE9XRVJQQworICNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFsbG9jYXRlIERNQS1hYmxlIG1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogcmVsYXRlZCBoZWFkZXIgZmlsZTptZW1QYXJ0TGliLmggICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBwYXJhbVtpbl0gICBkZXZpY2UgIERldmljZSBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIHBhcmFtW2luXSAgIHNpemUgICAgQmxvY2sgc2l6ZSAoYnl0ZXMpICAgICAgICAgICAgICAgICAgICAgKgorICogcGFyYW1bb3V0XSAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiByZXR1cm5zICAgIG1lbW9yeSBibG9jayBwb2ludGVyKHVuY2FjaGVkIG1lbW9yeSkgb3IgTlVMTCAgICoKKyAqIGNvbW1lbnQ6ICAgQlNQIG5lZWQgdG8gYWxsb2NhdGUgdW5jYWNoZWQgbWVtb3J5IHBvb2wgZmlyc3QgKgorICogaWYgQlNQIHRlYW0gY2FuIHByb3ZpZGUgc3VjaCBmdW5jdGlvbixjYWxsIGl0IGRpcmVjdGx5OyAgICAqCisgKiBzdWdnZXN0aW9uOiBtZW1QYXJ0Q3JlYXRlKCljcmVhdGUgdW5jYWNoZWQgbWVtb3J5IGFuZCAgICAgICoKKyAqIHJldHVybiBtZW1vcnkgSUQ6dW5jYWNoZVBvb2xNZW1QYXJ0SWQgICAgICAgICAgICAgICAgICAgICAgKgorICogbWVtUGFydEFsbG9jKCkvbWVtUGFydEZyZWUoKTphbGxvY2F0ZS9mcmVlIG1lbW9yeSB2aWEgICAgICAqCisgKiBtZW1vcnkgSUQ6dW5jYWNoZVBvb2xNZW1QYXJ0SWQgYW5kIHNpemUgICAgICAgICAgICAgICAgICAgICoKKyAqIGlmIEJTUCBjYW4gZ3VyYW50ZWUgdGhlIE1lbW9yeSBhbGxvY2F0ZWQgYnkgY2FjaGVEbWFNYWxsb2MgKgorICogY2FjaGVEbWFGcmVlKCkgaXMgbm9uY2FjaGVkIG1lbW9yeSx3ZSBjYW4gY2FsbCB0aGVtIGRpcmVjdGx5KgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgKmJjbW9zX2RtYV9hbGxvYyh1aW50OF90IGRldmljZSwgdWludDMyX3Qgc2l6ZSkKK3sKKyAgICB2b2lkICogcEJ1ZmZlcjsKKyNpZmRlZiBOT05fQ0FDSEVEX01FTU9SWV9DUkVBVEVEX0JZX0NBQ0hFRE1BTUFMTE9DCisgICAgcEJ1ZmZlciA9IGNhY2hlRG1hTWFsbG9jKHNpemUpOworICAgIHJldHVybiAocEJ1ZmZlcik7CisjZWxzZQorICAgIHBCdWZmZXIgPSAodm9pZCAqKW1lbVBhcnRBbGxvYyh1bmNhY2hlUG9vbE1lbVBhcnRJZCwgc2l6ZSkpOworICAgIHJldHVybiAocEJ1ZmZlcik7CisjZW5kaWYKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZWxlYXNlIERNQS1hYmxlIG1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIHJlbGF0ZWQgaGVhZGVyIGZpbGU6IG1lbVBhcnRMaWIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogcGFyYW1baW5dICAgZGV2aWNlICBEZXZpY2UgaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBwYXJhbVtpbl0gICBwdHIgICAgIEJsb2NrIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIHBhcmFtW291dF0gIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogcmV0dXJuICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBjb21tZW50OiBzZWUgYWJvdmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vc19kbWFfZnJlZSh1aW50OF90IGRldmljZSwgdm9pZCAqcHRyKQoreworI2lmZGVmIE5PTl9DQUNIRURfTUVNT1JZX0NSRUFURURfQllfQ0FDSEVETUFNQUxMT0MKKyAgICBjYWNoZURtYUZyZWUoKHZvaWQgKikocHRyKSk7CisjZWxzZQorICAgIG1lbVBhcnRGcmVlKHVuY2FjaGVQb29sTWVtUGFydElkLHB0cik7CisjZW5kaWYKKyAgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29udmVydCB2aXJ0dWFsIGFkZHJlc3MgdG8gcGh5c2ljYWwgYWRkcmVzcyAgICAgICAgICAgICAgICAqCisgKiByZWxhdGVkIGhlYWRlciBmaWxlOmZvciBNSVBTIENQVQlhcmNoTWlwcy5oICAgICAgICAgICAgICAgICoKKyAqIHBhcmFtW2luXSAgIHZhICAgIFZpcnR1YWwgYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogcmV0dXJuIC0gcGh5c2ljYWwgYWRkcmVzcyB2YSBpcyBtYXBwZWQgdG8gICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vuc2lnbmVkIGxvbmcgYmNtb3NfdmlydF90b19waHlzKHZvaWQgKnZhKQoreworI2lmZGVmIEhPU1RfQ1BVX0lTX01JUFMKKyAgcmV0dXJuICh1bnNpZ25lZCBsb25nKShLMF9UT19QSFlTKHZhKSk7CisKKyNlbHNlCisJLyogdGhpcyBpcyBhbiBqdXN0IGFuIGV4YW1wbGUsCisJaWYgeW91IGFyZSBub3Qgd29ya2luZyB3aXRoIG1pcHMgbWFrZSBzdXJlIHlvdSBkZWZpbmUgdGhlIGNvcnJlY3QgbWFwcGluZyBmb3IgeW91ciBzeXN0ZW0gKi8KKyAgICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpKHZhKTsKKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEludmFsaWRhdGUgYWRkcmVzcyBhcmVhIGluIGRhdGEgY2FjaGUuICAgICAgICAgICAgICAgICAgICAgKgorICogcmVsYXRlZCBoZWFkZXIgZmlsZTogIGNhY2hlTGliLmggICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBwYXJhbVtpbl0gICBzdGFydCAgIEFkZHJlc3MgYXJlYSBzdGFydCAgICAgICAgICAgICAgICAgICAgICoKKyAqIHBhcmFtW2luXSAgIHNpemUgICAgQWRkcmVzcyBhcmVhIHNpemUgICAgICAgICAgICAgICAgICAgICAgKgorICogcmV0dXJuICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9zX2RjYWNoZV9pbnYodm9pZCAqc3RhcnQsIHVpbnQzMl90IHNpemUpCit7CisgICAgY2FjaGVJbnZhbGlkYXRlKERBVEFfQ0FDSEUsc3RhcnQsIHNpemUpOworICAgIHJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGbHVzaCBhZGRyZXNzIGFyZWEgaW4gZGF0YSBjYWNoZS4gICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIHJlbGF0ZWQgaGVhZGVyIGZpbGU6ICBjYWNoZUxpYi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogcGFyYW1baW5dICAgc3RhcnQgICBBZGRyZXNzIGFyZWEgc3RhcnQgICAgICAgICAgICAgICAgICAgICAqCisgKiBwYXJhbVtpbl0gICBzaXplICAgIEFkZHJlc3MgYXJlYSBzaXplICAgICAgICAgICAgICAgICAgICAgICoKKyAqIHJldHVybiAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9zX2RjYWNoZV9mbHVzaCh2b2lkICpzdGFydCwgdWludDMyX3Qgc2l6ZSkKK3sKKyAgICBjYWNoZUZsdXNoKERBVEFfQ0FDSEUsc3RhcnQsIHNpemUpOworICAgIHJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB3cml0ZSB2YWx1ZSB0byBQQ0kgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIHJlbGF0ZWQgaGVhZGVyIGZpbGU6IGJjbW9zX2NvbW1vbjIuaCAgICAgICAgICAgICAgICAgICAgICAgKgorICogcGFyYW1baW5dICAgYWRkcmVzcyAgcG9pbnRlciB0byBBZGRyZXNzICAgICAgICAgICAgICAgICAgICAqCisgKiBwYXJhbVtpbl0gICB2YWx1ZSAgICB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIHJldHVybiAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQ29tbWVudCByZS11c2UgQkNNT1NfRU5ESUFOX0NQVV9UT19MSVRUTEVfVTMyIHdoaWNoIGlzIGZyb20qCisgKiBiY21vc19jb21tb24yLmgsYnkgdGhpcyBtYWNybyxjYW4gc3VwcG9ydCBib3RoIGJpZyBlbmRpYW4gICoKKyAqIGhvc3QgYW5kIGxpdHRsZSBlbmRpYW4gaG9zdC5tb3ZlIFBDSSBhY2Nlc3MgZnVuY3Rpb25zIGFmdGVyKgorICogYmNtb3NfY29tbW9uMi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbV9wY2lfd3JpdGUzMih2b2xhdGlsZSB1aW50MzJfdCAqYWRkcmVzcywgdWludDMyX3QgdmFsdWUpCit7CisjaWZkZWYgSE9TVF9QQ0lFX1NXQVBfTkVFREVECisgICAgdmFsdWUgPSBCQ01PU19FTkRJQU5fQ1BVX1RPX0xJVFRMRV9VMzIodmFsdWUpOworI2VuZGlmCisgICAgKmFkZHJlc3MgPSB2YWx1ZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiByZWFkIHZhbHVlIHRvIFBDSSBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIHJlbGF0ZWQgaGVhZGVyIGZpbGU6IGJjbW9zX2NvbW1vbjIuaCAgICAgICAgICAgICAgICAgICAgICAgKgorICogcGFyYW1baW5dICAgYWRkcmVzcyAgcG9pbnRlciB0byBBZGRyZXNzICAgICAgICAgICAgICAgICAgICAqCisgKiByZXR1cm4gIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIENvbW1lbnQgc2VlIGFib3ZlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21fcGNpX3JlYWQzMihjb25zdCB2b2xhdGlsZSB1aW50MzJfdCAqYWRkcmVzcykKK3sKKyAgICB1aW50MzJfdCB2YWx1ZTsKKyAgICB2YWx1ZSA9ICphZGRyZXNzOworI2lmZGVmIEhPU1RfUENJRV9TV0FQX05FRURFRAorICAgIHZhbHVlID0gQkNNT1NfRU5ESUFOX0xJVFRMRV9UT19DUFVfVTMyKHZhbHVlKTsKKyNlbmRpZgorICAgIHJldHVybiB2YWx1ZTsKKworfQorCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vdnh3b3JrczU1L2JjbW9zX3N5c3RlbS5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi92eHdvcmtzNTUvYmNtb3Nfc3lzdGVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYzM2UyOAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24vdnh3b3JrczU1L2JjbW9zX3N5c3RlbS5oCkBAIC0wLDAgKzEsMTg0IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisvKgorICogYmNtb3Nfc3lzdGVtLmgKKyAqIE1hcGxlIFN5c3RlbSBTZXJ2aWNlcworICogdnhXb3JrcyA1LjUgcG9ydAorICovCisKKyNpZm5kZWYgQkNNT1NfU1lTVEVNX0hfCisjZGVmaW5lIEJDTU9TX1NZU1RFTV9IXworCisjZGVmaW5lIEJDTU9TX0lSUV9TSU5HTEUgICAgMAorI2RlZmluZSBCQ01PU19JUlFfU0hBUkVEICAgIDEKKworI2RlZmluZSBpbmxpbmUgX19pbmxpbmUKKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzb2NrTGliLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworLyogUmUtZGVmaW5lIEdOVSB0eXBlb2YgYXMgSVNPIF9fdHlwZW9mX18gKi8KKyNkZWZpbmUgdHlwZW9mIF9fdHlwZW9mX18KKworLyogU3BlY2lmeSBoZXJlIHdoaWNoIHN5c3RlbSBmdW5jdGlvbnMgYXJlIGlubGluZWQgKi8KKworLyogI2RlZmluZSBCQ01PU19GQVNUTE9DS19JTkxJTkUgKi8KKy8qICNkZWZpbmUgQkNNT1NfU0VNX1dBSVRfSU5MSU5FICovCisvKiAjZGVmaW5lIEJDTU9TX1NFTV9QT1NUX0lOTElORSAqLworLyogI2RlZmluZSBCQ01PU19VU0xFRVBfSU5MSU5FICovCisjZGVmaW5lIEJDTU9TX1RSQUNFX1BSSU5URgorI2RlZmluZSBCQ01PU19CWVRFX1BPT0xfQUxMT0NfRlJFRV9JTkxJTkUKKy8qICNkZWZpbmUgQkNNT1NfTUFMTE9DX0ZSRUVfSU5MSU5FICovCisvKiAjZGVmaW5lIEJDTU9TX0NBTExPQ19JTkxJTkUgKi8KKy8qIGlmIEhvc3QgY3B1IGlzIE1JUFMgY3B1LGVuYWJsZSB0aGlzIG1hY3JvICovCisvKiBIb3N0IGNwdSB0eXBlIHdpbGwgYmUgZGV0ZXJtaW5lZCBkdXJpbmcgY29tcGlsZSovCisvLyNkZWZpbmUgSE9TVF9DUFVfSVNfTUlQUworLy8jZGVmaW5lIEhPU1RfQ1BVX0lTX1BQQworLyppZiB0aGUgTWVtb3J5IGFsbG9jYXRlZCBieSBjYWNoZURtYU1hbGxvYy9hY2hlRG1hRnJlZSgpIGlzIG5vbi1jYWNoZWQgbWVtb3J5LGVuYWJsZSB0aGlzIG1hY3JvKi8KKyNkZWZpbmUgTk9OX0NBQ0hFRF9NRU1PUllfQ1JFQVRFRF9CWV9DQUNIRURNQU1BTExPQworLyogVW5jb21tZW50dGhlIGZvbGxvd2luZyBsaW5lIGlmIGgvdyBzdXBwb3J0cyBETUEgY2FjaGUgY29oZXJlbmN5ICovCisvKiAjZGVmaW5lIEJDTU9TX0RNQV9DQUNIRV9DT0hFUkVOQ1kgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGJjbW9zX2ludF9kaXNhYmxlKGludCBpcnEpCit7fQorCit2b2lkIF9iY21vc19iYWNrdHJhY2Uodm9pZCk7CisKKyNkZWZpbmUgQlVHX09OKF9mKSAgICAgIGRvIHsgaWYgKF9mKSB7IF9iY21vc19iYWNrdHJhY2UoKTsgfSB9IHdoaWxlICgwKQorI2RlZmluZSBCVUcoKSAgICAgICAgICAgQlVHX09OKDEpCisjZGVmaW5lIEJVR19VTkxFU1MoX2YpICBCVUdfT04oIShfZikpCisKKy8qKiBCb29sZWFuICovCisjZGVmaW5lIEJDTU9TX0JPT0xFQU4KK3R5cGVkZWYgZW51bQoreworICAgIEJDTU9TX0ZBTFNFID0gMCwKKyAgICBCQ01PU19UUlVFICA9IDEsCit9IGJjbW9zX2Jvb2w7CisKKyNpbmNsdWRlICJiY21vc19jb21tb24uaCIKKworI2RlZmluZSBmZnMobikgZmZzTHNiKG4pCisKKy8qKiBTZW1hcGhvcmUgY29udHJvbCBibG9jayAqLworc3RydWN0IGJjbW9zX3NlbQoreworICAgIHVpbnQzMl90IHM7Cit9OworCisKKy8qKiBNdXRleCBjb250cm9sIGJsb2NrICovCitzdHJ1Y3QgYmNtb3NfbXV0ZXgKK3sKKyAgICB1aW50MzJfdCBtOworfTsKKworLyoqIEZhc3QgbG9jayBjb250cm9sIGJsb2NrICovCitzdHJ1Y3QgYmNtb3NfZmFzdGxvY2sKK3sKKyAgICB1aW50MzJfdCBsOworfTsKKworLyoqIEZhc3Rsb2NrIGluaXRpYWxpemVyLiBDYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIGNhbGxpbmcgYmNtb3NfZmFzdGxvY2tfaW5pdCgpICovCisjZGVmaW5lIEJDTU9TX0ZBU1RMT0NLX0lOSVRJQUxJWkVSICAgICAgeyAwIH0KKworLyoqIE9TLXNwZWNpZmljIHRhc2sgY29udHJvbCBibG9jayBleHRlbnNpb24gKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9zX3N5c190YXNrCit7CisgICAgdWludDMyX3QgdDsgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCB2eFdvcmtzIHRhc2sgSUQgKi8KK30gYmNtb3Nfc3lzX3Rhc2s7CisKKworLyoqIFN5c3RlbSB0aW1lciAqLworc3RydWN0IGJjbW9zX3N5c190aW1lcgoreworICAgIHVpbnQzMl90IHQ7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVnhXIHRpbWVyICovCisgICAgYmNtb3Nfc3lzX3RpbWVyX2hhbmRsZXIgaGFuZGxlcjsgICAgLyoqPCBUaW1lciBoYW5kbGVyICovCisgICAgdm9pZCAqZGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBQYXJhbWV0ZXIgdG8gYmUgcGFzc2VkIHRvIHRoZSBoYW5kbGVyICovCit9OworCisvKiogQnl0ZSBtZW1vcnkgcG9vbCBjb250cm9sIGJsb2NrICovCitzdHJ1Y3QgYmNtb3NfYnl0ZV9wb29sCit7CisgICAgYmNtb3NfYnl0ZV9wb29sX3Bhcm0gcGFybTsgIC8qKjwgUG9vbCBwYXJhbWV0ZXJzICovCisgICAgdWludDMyX3QgYWxsb2NhdGVkOyAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGJ5dGVzIGFsbG9jYXRlZCAqLworI2lmZGVmIEJDTU9TX01FTV9ERUJVRworICAgIHVpbnQzMl90IG1hZ2ljOyAgICAgICAgICAgICAvKio8IG1hZ2ljIG51bWJlciAqLworI2RlZmluZSBCQ01PU19CWVRFX1BPT0xfVkFMSUQgICAgICAgICAgICgoJ2InPDwyNCkgfCAoJ3knIDw8IDE2KSB8ICgncCcgPDwgOCkgfCAnbycpCisjZGVmaW5lIEJDTU9TX0JZVEVfUE9PTF9ERUxFVEVEICAgICAgICAgKCgnYic8PDI0KSB8ICgneScgPDwgMTYpIHwgKCdwJyA8PCA4KSB8ICd+JykKKyNlbmRpZgorfTsKKworI2RlZmluZSBiY21vc19zeXNfdnByaW50ZihmbXQsIGFyZ3MpICAgICAgICB2cHJpbnRmKGZtdCwgYXJncykKKworI2RlZmluZSBFWFBPUlRfU1lNQk9MKF9zeW0pCisKKy8qIDJuZCBwYXJ0IG9mIE9TLWluZGVwZW5kZW50IGRlY2xhcmF0aW9ucyAqLworI2luY2x1ZGUgImJjbW9zX2NvbW1vbjIuaCIKKwordm9pZCBiY21fcGNpX3dyaXRlMzIodm9sYXRpbGUgdWludDMyX3QgKmFkZHJlc3MsIHVpbnQzMl90IHZhbHVlKTsKK3VpbnQzMl90IGJjbV9wY2lfcmVhZDMyKGNvbnN0IHZvbGF0aWxlIHVpbnQzMl90ICphZGRyZXNzKTsKKworCisvKnRvZG8gbXVzdCBjaGVjayB2YWxpZGl0eSB0aGF0IHRoZSBzdHJpbmcgaXMgbnVtZXJpYywgc3NjYW5mIGNhbm5vdCBkZXRlY3QgZXJyb3JzLAorICogaWYgbm90IHZhbGlkLCBwdXQgKCp0YWlscHRyKSBpbiB0aGUgZmlyc3Qgbm9uIHZhbGlkIGNoYXIgaW4gc3RyaW5nLAorIGlmIHZhbGlkLCBwb2ludCB0YWlscHRyIGluIHRoZSBsYXN0IGNoYXIgaW4gc3RyaW5nICgqdGFpbHB0cj1zdHJpbmcrc3RybGVuKHN0cmluZykpKi8KKyNkZWZpbmUgc3RydG91bGwoc3RyaW5nLHRhaWxwdHIsYmFzZSkgICAoe1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIGludCBfX2E7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHRhaWxwdHIpPShjaGFyKikoKHN0cmluZykrc3RybGVuKHN0cmluZykpO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NjYW5mKHN0cmluZywgYmFzZSA9PSAxMCA/ICIlbGx1IiA6ICIlbGx4IiwgJl9fYSApO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19hO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQorI2RlZmluZSBzdHJ0b2xsKHN0cmluZyx0YWlscHRyLGJhc2UpICAgICh7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGxvbmcgaW50IF9fYTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoodGFpbHB0cik9KGNoYXIqKSgoc3RyaW5nKStzdHJsZW4oc3RyaW5nKSk7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2NhbmYoc3RyaW5nLCIlbGxkIiwgJl9fYSApO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19hO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQorCisjZGVmaW5lIHNucHJpbnRmKHMxLG4sczIsYXJncy4uLikgICAgICBzcHJpbnRmKHMxLCBzMiwjIyBhcmdzKQorI2RlZmluZSB2c25wcmludGYoczEsbixzMixhcmdzLi4uKSAgICAgdnNwcmludGYoczEsIHMyLCMjIGFyZ3MpCisKKworaW50IGZmc0xzYiAoVUlOVDMyIGkpOworaW50IGZmc2xsKGxvbmcgbG9uZyBpbnQgaSk7CisKKworI2VuZGlmIC8qIEJDTU9TX1NZU1RFTV9IXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9wY2llL01ha2VmaWxlIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9wY2llL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMzOGQzY2MKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3BjaWUvTWFrZWZpbGUKQEAgLTAsMCArMSwyNCBAQAorIyBQQ0lFIGRyaXZlcgorIyBob3N0IHNwZWNpZmljCisjCitNT0RfTkFNRSA9IHBjaWVfbW9kCitNT0RfREVQUyA9IHBjaWUgCisKK01PRF9TVVBQUkVTU19PU19ERVAgPSB5CisKK2lmZXEgKCIkKE9TX0tFUk5FTCkiLCAibGludXgiKQorICAgIE1PRF9UWVBFID0gbGludXhfbGliCisgICAgc3JjcyA9IGJjbW9sdF90cl9wY2llX3NwZWNpZmljLmMKK2Vsc2UKKyAgICBNT0RfVFlQRSA9IGxpYgorZW5kaWYKKworIyBJZiBjYWxsZWQgYnkgbGludXgga2VybmVsIGJ1aWxkZXIgLSBhZGQgaW5jbHVkZSBwYXRocyBtYW51YWxseS4KKyMgSXQgaXMgbm90IGVsZWdhbnQsIGJ1dCB3ZSdsbCBub3QgaGF2ZSBtYW55IGxpbnV4IG1vZHVsZXMKK2lmbmVxICgiJChLQlVJTERfU1JDKSIsICIiKQorCS1pbmNsdWRlICQoT1VUX0RJUl9CQVNFKS9NYWtlZmlsZS5jb25maWcuJChNT0RfTkFNRSkKK2VuZGlmCisKK1VTRV9MSU5UID0geWVzCisKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9wY2llL2JjbW9sdF90cl9wY2llX3NwZWNpZmljLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3BjaWUvYmNtb2x0X3RyX3BjaWVfc3BlY2lmaWMuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NDEwMmJjCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC9wY2llL2JjbW9sdF90cl9wY2llX3NwZWNpZmljLmMKQEAgLTAsMCArMSwxMDYgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpbmNsdWRlICJiY21vc19zeXN0ZW0uaCIKKyNpbmNsdWRlICJiY210cl9wY2llLmgiCisjaW5jbHVkZSAiYmNtb2x0X3RyX3BjaWVfc3BlY2lmaWMuaCIKKworZXh0ZXJuIGZfYmNtdHJfaW50IGJjbXRyX3BjaWVfcnhfaXJxX2hhbmRsZXI7CitleHRlcm4gZl9iY210cl9pbnQgYmNtdHJfcGNpZV90eF9pcnFfaGFuZGxlcjsKK3N0YXRpYyBiY21vc19mYXN0bG9jayBpc3JfbG9jazsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIG5lZWQgdG8gcGFzcyB0aHJ1IGFsbCB0aGUgZGV2aWNlcyAtIGNoZWNrIGlmIGlycSBpcyBTSEFSRUQgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGJjbXRyX3J4X2lzcihpbnQgaXJxLCB2b2lkICppc3JfaW5mbykKK3sKKyAgICB1aW50MzJfdCBpc3JfcmVnOworICAgIHVpbnQzMl90IG1hc2tfcmVnOworICAgIGxvbmcgZmxhZ3M7CisgICAgaW50IGhhbmRsZWQgPSAwOworICAgIGJjbV9wY2llZF9pc3JfZGF0YSAqaXNyX2RhdGEgPSAoYmNtX3BjaWVkX2lzcl9kYXRhICopaXNyX2luZm87CisKKyAgICBmbGFncyA9IGJjbW9zX2Zhc3Rsb2NrX2xvY2soJmlzcl9sb2NrKTsKKworICAgIGlzcl9yZWcgPSBiY21fcGNpX3JlYWQzMigodWludDMyX3QqKShpc3JfZGF0YS0+cGNpZV9yZWdfYmFzZSArIERNQV9JTlRSX1NUQVRVUykpOworICAgIG1hc2tfcmVnID0gfmJjbV9wY2lfcmVhZDMyKCh1aW50MzJfdCopKGlzcl9kYXRhLT5wY2llX3JlZ19iYXNlICsgRE1BX0lOVFJfTUFTS19TVEFUVVMpKTsKKworICAgIGlmICgoaXNyX3JlZyAmIG1hc2tfcmVnKSYgRE1BX1RYX0RPTkVfTUFTSykKKyAgICB7CisgICAgICAgIC8qIGhhbmRsZSBUWCBET05FIGludGVycnVwdCAqLworICAgICAgICBpc3JfZGF0YS0+dHhfZG9uZV9udW0rKzsKKworICAgICAgICBpZiAoYmNtdHJfcGNpZV90eF9pcnFfaGFuZGxlcikKKyAgICAgICAgICAgIGJjbXRyX3BjaWVfdHhfaXJxX2hhbmRsZXIoaXNyX2RhdGEtPmRldmljZSk7CisKKyAgICAgICAgaGFuZGxlZCA9IDE7CisgICAgfQorCisgICAgaWYgKChpc3JfcmVnICYgbWFza19yZWcgKSAmIERNQV9SWF9ET05FX01BU0spCisgICAgeworICAgICAgICAvKiBoYW5kbGUgUlggRE9ORSBpbnRlcnJ1cHQgKi8KKyAgICAgICAgaXNyX2RhdGEtPnJ4X2RvbmVfbnVtKys7CisKKyAgICAgICAgaWYgKGJjbXRyX3BjaWVfcnhfaXJxX2hhbmRsZXIpCisgICAgICAgICAgICBiY210cl9wY2llX3J4X2lycV9oYW5kbGVyKGlzcl9kYXRhLT5kZXZpY2UpOworCisgICAgICAgIGhhbmRsZWQgPSAxOworICAgIH0KKworICAgIGlmIChpc3JfcmVnICYgKERNQV9SWF9FUlJPUl9NQVNLIHwgRE1BX1RYX0VSUk9SX01BU0spKQorICAgIHsKKyAgICAgICAgaWYgKGlzcl9yZWcgJiBETUFfUlhfRVJST1JfTUFTSykKKyAgICAgICAgICAgIGlzcl9kYXRhLT5yeF9lcnJfbnVtKys7CisgICAgICAgIGlmIChpc3JfcmVnICYgRE1BX1RYX0VSUk9SX01BU0spCisgICAgICAgICAgICBpc3JfZGF0YS0+dHhfZXJyX251bSsrOworICAgICAgICAvKiBjbGVhciBpbnRlcnJ1cHQgZXJyb3IgaW50ZXJydXB0ICovCisgICAgICAgIGJjbV9wY2lfd3JpdGUzMigodWludDMyX3QqKShpc3JfZGF0YS0+cGNpZV9yZWdfYmFzZSArIERNQV9JTlRSX0NMRUFSKSwgRE1BX1JYX0VSUk9SX01BU0sgfCBETUFfVFhfRVJST1JfTUFTSyk7CisgICAgICAgIGhhbmRsZWQgPSAxOworICAgIH0KKworICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmaXNyX2xvY2ssIGZsYWdzKTsKKworICAgIHJldHVybiBoYW5kbGVkOworfQorCit2b2lkIGJjbXRyX2Nvbm5lY3RfaXNyKHZvaWQgKmlzcl9pbmZvKQoreworICAgIHVpbnQzMl90ICAgIGZsYWdzID0gMDsKKworICAgIGJjbV9wY2llZF9pc3JfZGF0YSAqaXNyX2RhdGEgPSAoYmNtX3BjaWVkX2lzcl9kYXRhICopaXNyX2luZm87CisgICAgYmNtb3NfZmFzdGxvY2tfaW5pdCgmaXNyX2xvY2ssIGZsYWdzKTsKKyAgICAvKiBjb25uZWN0IGludGVycnVwdCB0byBzeXN0ZW0gY3B1IC0gMCAqLworICAgIGJjbW9zX2ludF9jb25uZWN0KChpbnQpaXNyX2RhdGEtPnJ4X2lycSwgMCwgQkNNT1NfSVJRX1NIQVJFRCwgYmNtdHJfcnhfaXNyLCAiZG1haXNyIiwgaXNyX2RhdGEpOworfQorCisjaWZkZWYgX19LRVJORUxfXworRVhQT1JUX1NZTUJPTChiY210cl9jb25uZWN0X2lzcik7CisjZW5kaWYKKworCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3BjaWUvYmNtb2x0X3RyX3BjaWVfc3BlY2lmaWMuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvcGNpZS9iY21vbHRfdHJfcGNpZV9zcGVjaWZpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YzhhYzEKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3BjaWUvYmNtb2x0X3RyX3BjaWVfc3BlY2lmaWMuaApAQCAtMCwwICsxLDExMyBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBCQ01PTFRfVFJfUENJRV9TUEVDSUZJQ19IXworI2RlZmluZSBCQ01PTFRfVFJfUENJRV9TUEVDSUZJQ19IXworCisjaW5jbHVkZSAiYmNtb3Nfc3lzdGVtLmgiCisjaW5jbHVkZSAiYmNtdHJfcGNpZS5oIgorCisjZGVmaW5lIERFU0NSSVBUT1JfQ09OVFJPTCAgICAgIDB4MDAwNjQ0MTAgLyogVHggU29mdHdhcmUgRGVzY3JpcHRvciBMaXN0IENvbnRyb2wgYW5kIFN0YXR1cyAqLworI2RlZmluZSBXQUtFVVBfRE1BICAgICAgICAgICAgICAweDAwMDY0NDE0IC8qIFR4IFdha2UgQ29udHJvbCAqLworI2RlZmluZSBFUlJPUl9TVEFUVVMgICAgICAgICAgICAweDAwMDY0NDE4IC8qIFR4IEVuZ2luZSBFcnJvciBTdGF0dXMgKi8KKworI2RlZmluZSBJTlRSMl9QQ0lfU1RBVFVTICAgICAgICAweDAwMDY0MzE4IC8qIFBDSSBpbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgRE1BX1RYX1NXX0RFU0NfTElTVF9DVFJMX1NUU19UWF9ETUFfUlVOX1NUT1BfTUFTSyAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgRE1BX1RYX1dBS0VfQ1RSTF9XQUtFX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKworI2RlZmluZSBETUFfSU5UUl9TVEFUVVMJICAgICAgICAweDAwMDY0MzE4IC8qIFBDSSBpbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIERNQV9JTlRSX0NMRUFSICAgICAgICAgIDB4MDAwNjQzMjAgLyogUENJIGludGVycnVwdCBDbGVhciBSZWdpc3RlciAqLworI2RlZmluZSBETUFfSU5UUl9NQVNLX1NFVCAgICAgICAweDAwMDY0MzI4IC8qIFBDSSBpbnRlcnJ1cHQgTWFzayBTZXQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRE1BX0lOVFJfTUFTS19DTEVBUiAgICAgMHgwMDA2NDMyYyAvKiBQQ0kgaW50ZXJydXB0IE1hc2sgQ2xlYXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRE1BX0lOVFJfTUFTS19TVEFUVVMgICAgMHgwMDA2NDMyNCAvKiBQQ0kgaW50ZXJydXB0IE1hc2sgJiBTdGF0dXMgUmVnaXN0ZXIgKi8KKworI2RlZmluZSBETUFfUlhfRVJST1JfTUFTSyAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIERNQV9SWF9ET05FX01BU0sgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgRE1BX1RYX0RPTkVfTUFTSyAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBETUFfVFhfRVJST1JfTUFTSyAgICAgICAweDAwMDAwMDAyCisKKyNkZWZpbmUgUENJRV9MMl9JTlRSX01BU0sgICAgICAgMHgwMDAwMDAyMCAvKiBMMiBpbnRlcnJ1cHQgYml0IGluIEwxIGludGVycnVwdCBzdGF0dXMgKi8KKworI2RlZmluZSBETUFfSU5UUjFfU1RBVFVTICAgICAgICAweDAwMDY5MzAwIC8qIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRE1BX0lOVFIxX01BU0tfQ0xFQVIgICAgMHgwMDA2OTMwYyAvKiBJbnRlcnJ1cHQgTWFzayBDbGVhciBSZWdpc3RlciAqLworI2RlZmluZSBETUFfSU5UUjFfTUFTS19TRVQgICAgICAweDAwMDY5MzA4IC8qIEludGVycnVwdCBNYXNrIFNldCBSZWdpc3RlciAqLworI2RlZmluZSBETUFfSU5UQV9NQVNLICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIERNQV9JTlRBX1NISUZUICAgICAgICAgIDEKKyNkZWZpbmUgUENJRV9TVEFUVVNfT0ZGU0VUICAgICAgMHgwMDA2NDA2OCAvKiBQQ0lFX1BDSUVfUENJRV8wX1BDSUVfUENJRV8wX01JU0NfUENJRV9TVEFUVVMgKi8KKwordm9pZCBiY210cl9jb25uZWN0X2lzcih2b2lkICppc3JfaW5mbyk7CisKKy8qIGZpcnN0IHBhcmFtZXRlciBpcyB0aGUgZGVzdCBQRCwgdGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgdGhlIHNvdXJjZSBmaWVsZCAqLworc3RhdGljIGlubGluZSB2b2lkIGJjbXRyX3NldF9kZXN0X2J1ZmZlcl9hZGRyZXNzKHVpbnQzMl90ICpwZCwgdm9pZCAqdmFsdWUpCit7CisgICAgdWludDY0X3QgdG1wID0gYmNtb3NfdmlydF90b19waHlzKHZhbHVlKTsKKworICAgIGJjbV9wY2lfd3JpdGUzMigmcGRbUENJX1BBQ0tFVF9MT1dfSU5ERVhdLCAgKHVpbnQzMl90KSggdG1wICYgMHhmZmZmZmZmZlVMKSk7CisgICAgYmNtX3BjaV93cml0ZTMyKCZwZFtQQ0lfUEFDS0VUX0hJR0hfSU5ERVhdLCAodWludDMyX3QpKCh0bXAgPj4gMzIpICYgMHhmZmZmZmZmZlVMKSk7Cit9CisKKy8qIGZpcnN0IHBhcmFtZXRlciBpcyB0aGUgZGVzdCBQRCwgdGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgdGhlIHNvdXJjZSBmaWVsZCAqLworc3RhdGljIGlubGluZSB2b2lkIGJjbXRyX3NldF9zb3VyY2VfYnVmZmVyX2FkZHJlc3ModWludDMyX3QgKnBkLCB2b2lkICp2YWx1ZSkKK3sKKyAgICB1aW50NjRfdCB0bXAgPSBiY21vc192aXJ0X3RvX3BoeXModmFsdWUpOworCisgICAgYmNtX3BjaV93cml0ZTMyKCZwZFtQQ0lfUEFDS0VUX0xPV19JTkRFWF0sICAodWludDMyX3QpKCB0bXAgJiAweGZmZmZmZmZmVUwpKTsKKyAgICBiY21fcGNpX3dyaXRlMzIoJnBkW1BDSV9QQUNLRVRfSElHSF9JTkRFWF0sICh1aW50MzJfdCkoKHRtcCA+PiAzMikgJiAweGZmZmZmZmZmVUwpKTsKK30KKworc3RhdGljIGlubGluZSBiY21vc19lcnJubyBiY210cl9jcmVhdGVfdHVfcmluZ3ModWludDMyX3QgdHhsZW5ndGgsIHVpbnQzMl90IHJ4bGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKnR4cHRyLCB2b2lkICoqcnhwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqdHhwdHJfb3JpZywgdm9pZCAqKnJ4cHRyX29yaWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHBjaWVfcmVnX2Jhc2UpCit7CisgICAgKnR4cHRyICAgICAgPSBOVUxMOworICAgICpyeHB0cl9vcmlnID0gTlVMTDsKKyAgICAqdHhwdHIgICAgICA9IE5VTEw7CisgICAgKnJ4cHRyX29yaWcgPSBOVUxMOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgYmNtdHJfcGNpZV9zcGVjaWZpY19pbml0KHVuc2lnbmVkIGxvbmcgcGNpZV9yZWdfYmFzZSkge30KK3N0YXRpYyBpbmxpbmUgdm9pZCBiY210cl9wY2llX2ZyZWVfcmluZ3ModWludDMyX3QgZGV2aWNlLCB1aW50MzJfdCAqdHhfcHRyLCB1aW50MzJfdCAqIHJ4X3B0cil7fQorc3RhdGljIGlubGluZSB2b2lkIGJjbXRyX3BjaWVfZnJlZV9pcnEodWludDMyX3QgaXJxLCB2b2lkICpwcml2KQoreworI2lmbmRlZiBTSU1VTEFUSU9OX0JVSUxECisgICAgYmNtb3NfaW50X2Rpc2Nvbm5lY3QoKGludClpcnEsIHByaXYpOworI2VuZGlmCit9CisKKyNkZWZpbmUgVFhfTE9DS0RFRiAgICAgICAgIGJjbW9zX211dGV4ICB0eF9sb2NrOworI2RlZmluZSBDUkVBVEVfVFhMT0NLKGkpICAgYmNtb3NfbXV0ZXhfY3JlYXRlKCZiY210cl9wY2llX2RhdGFbaV0udHhfbG9jaywgMCwgTlVMTCkKKyNkZWZpbmUgREVTVFJPWV9UWExPQ0soaSkgIGJjbW9zX211dGV4X2Rlc3Ryb3koJmJjbXRyX3BjaWVfZGF0YVtpXS50eF9sb2NrKQorI2RlZmluZSBMT0NLX1RYKCkgICAgICAgICAgYmNtb3NfbXV0ZXhfbG9jaygmY3VycmVudF9kZXZpY2UtPnR4X2xvY2spCisjZGVmaW5lIFVOTE9DS19UWCgpICAgICAgICBiY21vc19tdXRleF91bmxvY2soJmN1cnJlbnRfZGV2aWNlLT50eF9sb2NrKQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvbmxfc29ja2V0L01ha2VmaWxlIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvbmxfc29ja2V0L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlODVlYjAKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3RyYW5zcG9ydC9ubF9zb2NrZXQvTWFrZWZpbGUKQEAgLTAsMCArMSwyMiBAQAorIyBOTCB0cmFuc3BvcnQgZHJpdmVyCisjCitpZmVxICgiJChPU19LRVJORUwpIiwgImxpbnV4IikKK2lmZXEgKCIkKENPTkZJR19UUkFOU1BPUlRfUkFXKSIsICJ5IikKKworCitNT0RfTkFNRSA9IG5sdHIKK01PRF9UWVBFID0gbGludXhfbGliCitNT0RfREVQUyA9IHRybXV4IHRyX3BsdWdpbl9yYXcKKworc3JjcyA9IGJjbW9sdF90cl9ubF9kcml2ZXIuYworCisjIElmIGNhbGxlZCBieSBsaW51eCBrZXJuZWwgYnVpbGRlciAtIGFkZCBpbmNsdWRlIHBhdGhzIG1hbnVhbGx5LgorIyBJdCBpcyBub3QgZWxlZ2FudCwgYnV0IHdlJ2xsIG5vdCBoYXZlIG1hbnkgbGludXggbW9kdWxlcworaWZuZXEgKCIkKEtCVUlMRF9TUkMpIiwgIiIpCisJLWluY2x1ZGUgJChPVVRfRElSX0JBU0UpL01ha2VmaWxlLmNvbmZpZy4kKE1PRF9OQU1FKQorZW5kaWYKKworVVNFX0xJTlQgPSB5ZXMKKworZW5kaWYKK2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3RyYW5zcG9ydC9ubF9zb2NrZXQvYmNtb2x0X3RyX25sX2RyaXZlci5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvbmxfc29ja2V0L2JjbW9sdF90cl9ubF9kcml2ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjNmY2EyCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvbmxfc29ja2V0L2JjbW9sdF90cl9ubF9kcml2ZXIuYwpAQCAtMCwwICsxLDIzMiBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworLyoKKyAqIG5sX3RyYW5zcG9ydC5jCisgKgorICogTkwtc29ja2V0IGJhc2VkIHRyYW5zcG9ydC4gS2VybmVsIHNwYWNlIG1vZHVsZQorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPiAgICAgICAvKiBOZWVkZWQgYnkgYWxsIG1vZHVsZXMgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4gICAgICAgLyogTmVlZGVkIGZvciBLRVJOX0lORk8gKi8KKyNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorCisjaW5jbHVkZSA8YmNtb2x0X3RyX211eC5oPgorI2luY2x1ZGUgPGJjbW9sdF90cl9ubF9kcml2ZXIuaD4KKyNpbmNsdWRlICJiY21vbHRfdHJfbmwuaCIKKworI2RlZmluZSBCQ01UUl9NRU1fUEFDS0VUUyAgICAgICAxMDAwMAorI2RlZmluZSBCQ01UUl9NRU1fT1ZFUkhFQUQgICAgICBTS0JfVFJVRVNJWkUoMTAyNCkKKyNkZWZpbmUgQkNNVFJfTUlOX1JDVkJVRl9TSVpFICAgKEJDTVRSX01FTV9QQUNLRVRTICogQkNNVFJfTUVNX09WRVJIRUFEKQorCitzdHJ1Y3Qgc29jayAqYmNtdHJfbmxfc29jayA9IE5VTEw7CisKKy8qIE5ldGxpbmsgb3BlcmF0aW9ucy4gVGhpcyBkcml2ZXIgb3ZlcnJpZGVzIGEgY291cGxlICovCitzdGF0aWMgc3RydWN0IHByb3RvX29wcyBiY210cl9ubF9vcHM7CitzdGF0aWMgaW50ICgqbmV0bGlua19yZWxlYXNlX29yZykoc3RydWN0IHNvY2tldCAqc29jayk7CisKK3N0cnVjdCBiY210cl9ubAoreworICAgIGJjbXRybXV4X2NoYW5uZWwgY2hhbm5lbFtCQ01UUl9NQVhfT0xUU107CisgICAgaW50IHBpZDsKKyAgICBzdHJ1Y3Qgc29jayAqc2s7Cit9OworCitzdGF0aWMgaW50IGJjbXRyX25ldGxpbmtfcmVsZWFzZShzdHJ1Y3Qgc29ja2V0ICpzb2NrKQoreworICAgIHN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworICAgIHN0cnVjdCBiY210cl9ubCAqbmxiID0gc2stPnNrX3VzZXJfZGF0YTsKKyAgICBpZiAobmxiKQorICAgIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBCQ01UUl9NQVhfT0xUUzsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobmxiLT5jaGFubmVsW2ldKQorICAgICAgICAgICAgICAgIGJjbXRybXV4X2NoYW5uZWxfdW5yZWdpc3RlcihpLCBubGItPmNoYW5uZWxbaV0pOworICAgICAgICB9CisgICAgICAgIGtmcmVlKG5sYik7CisgICAgICAgIHNrLT5za191c2VyX2RhdGEgPSBOVUxMOworICAgIH0KKyAgICByZXR1cm4gbmV0bGlua19yZWxlYXNlX29yZyhzb2NrKTsKK30KKworLyoqIFJlY2VpdmUgbWVzc2FnZSBoYW5kbGVyICovCitzdGF0aWMgIHZvaWQgX2JjbXRyX25sX3JlY3YoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb3NfYnVmICpidWYsIGJjbXRybXV4X2NoYW5uZWwgY2hhbm5lbCwgdm9pZCAqZGF0YSkKK3sKKyAgICB1aW50MzJfdCBkYXRhX2xlbmd0aCA9IGJjbW9zX2J1Zl9sZW5ndGgoYnVmKTsKKyAgICB1aW50MzJfdCBkZXZpY2VfdTMyID0gKHVpbnQzMl90KWRldmljZTsKKyAgICBzdHJ1Y3QgYmNtdHJfbmwgKm5sYiA9IChzdHJ1Y3QgYmNtdHJfbmwgKilkYXRhOworICAgIHVpbnQ4X3QgKnBfZGV2aWNlOworICAgIGludCByOworCisgICAgTkVUTElOS19DQigmKGJ1Zi0+c2tiKSkuZHN0X2dyb3VwID0gMDsgLyogbm90IGluIG1jYXN0IGdyb3VwICovCisKKyAgICAvKiBOb3cgYSB0cmlja3kgcGFydC4gbmxtc2dfcHV0KCkgYXNzdW1lcyB0aGF0IHNrYiBpcyBlbXB0eSBhbmQgZXh0ZW5kcyBpdAorICAgICAqIGJ5IHRvdGFsIG1zZyBzaXplLiBXZSBkb24ndCB3YW50IGl0LiBSZXNlcnZlIHJvb20gZm9yIG5sbXNnIGhlYWRlciBhbmQgdGhlbgorICAgICAqIHNldCBzaXplIHRvIDAgYW5kIGxldCBubG1zZ19wdXQoKSByZXN0b3JlIGl0CisgICAgICovCisgICAgaWYgKHVubGlrZWx5KHNrYl9oZWFkcm9vbSgmYnVmLT5za2IpIDwgTkxNU0dfSERSTEVOICsgc2l6ZW9mKHVpbnQzMl90KSkpCisgICAgeworICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogY2FuJ3QgcHJlcGVuZCBOTCBoZWFkZXJcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGJjbW9zX2ZyZWUoYnVmKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBfX3NrYl9wdXNoKCZidWYtPnNrYiwgTkxNU0dfSERSTEVOICsgc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgLyogU3RvcmUgZGV2aWNlIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBOTCBoZWFkZXIgKi8KKyAgICBwX2RldmljZSA9IGJ1Zi0+c2tiLmRhdGEgKyBOTE1TR19IRFJMRU47CisgICAgbWVtY3B5KHBfZGV2aWNlLCAmZGV2aWNlX3UzMiwgc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgX19za2JfdHJpbSgmYnVmLT5za2IsIDApOworICAgIG5sbXNnX3B1dCgmYnVmLT5za2IsIDAsIDAsIE5MTVNHX0RPTkUsIGRhdGFfbGVuZ3RoICsgc2l6ZW9mKHVpbnQzMl90KSwgMCk7CisKKyAgICByID0gbmxtc2dfdW5pY2FzdChubGItPnNrLCAmYnVmLT5za2IsIG5sYi0+cGlkKTsKKyAgICBpZiAocikKKyAgICB7CisgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBubG1zZ191bmljYXN0KCkgLS0+ICVkIGxlbj0ldSBybV9hbGxvYz0lZCByZWN2YnVmPSVkXG4iLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCByLCBkYXRhX2xlbmd0aCwgYXRvbWljX3JlYWQoJm5sYi0+c2stPnNrX3JtZW1fYWxsb2MpLCBubGItPnNrLT5za19yY3ZidWYpOworICAgIH0KK30KKwordm9pZCBiY210cl9ubF9pbnB1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworICAgIHN0cnVjdCBubG1zZ2hkciAqbmxoOworICAgIHN0cnVjdCBiY210cl9ubCAqbmxiOworICAgIHVpbnQzMl90IGRldmljZTsKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIG5saCA9IG5sbXNnX2hkcihza2IpOworCisgICAgaWYoTkxNU0dfT0sobmxoLCBza2ItPmxlbikpCisgICAgeworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigzLDEwLDApCisgICAgICAgIHN0cnVjdCBzb2NrICpzayA9IE5FVExJTktfQ0Ioc2tiKS5zazsKKyNlbHNlCisgICAgICAgIHN0cnVjdCBzb2NrICpzayA9IE5FVExJTktfQ0Ioc2tiKS5zc2s7CisjZW5kaWYKKworICAgICAgICAvKiBjaGFubmVsIGlzIHN0b3JlZCBpbiB1c2VyX2RhdGEuIElmIGl0IGlzIDAgLSB0aGF0IG1lYW5zIHRoYXQgY2hhbm5lbAorICAgICAgICAgKiBpcyBub3QgYWxsb2NhdGVkIHlldC4gRG8gaXQgaGVyZQorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCFzay0+c2tfdXNlcl9kYXRhKQorICAgICAgICB7CisgICAgICAgICAgICBubGIgPSBrbWFsbG9jKHNpemVvZigqbmxiKSwgR0ZQX0tFUk5FTCk7CisgICAgICAgICAgICBpZiAoIW5sYikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogY2FuJ3QgYWxsb2NhdGUgTkxCXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbXNldChubGIsIDAsIHNpemVvZigqbmxiKSk7CisgICAgICAgICAgICBubGItPnBpZCA9IG5saC0+bmxtc2dfcGlkOworICAgICAgICAgICAgbmxiLT5zayA9IHNrOworICAgICAgICAgICAgc2stPnNrX3VzZXJfZGF0YSA9IG5sYjsKKworICAgICAgICAgICAgLyogT3ZlcnJpZGUgcmVsZWFzZSBjYWxsYmFjayBpbiBvcmRlciB0byBjbGVhbnVwICovCisgICAgICAgICAgICBiY210cl9ubF9vcHMgPSAqc2stPnNrX3NvY2tldC0+b3BzOworICAgICAgICAgICAgbmV0bGlua19yZWxlYXNlX29yZyA9IGJjbXRyX25sX29wcy5yZWxlYXNlOworICAgICAgICAgICAgYmNtdHJfbmxfb3BzLnJlbGVhc2UgPSBiY210cl9uZXRsaW5rX3JlbGVhc2U7CisgICAgICAgICAgICBzay0+c2tfc29ja2V0LT5vcHMgPSAmYmNtdHJfbmxfb3BzOworCisgICAgICAgICAgICAvKiBPdmVycmlkZSBza19yY3ZidWYgc2l6ZS4gU2V0IG1pbiAqLworICAgICAgICAgICAgaWYgKHNrLT5za19yY3ZidWYgPCBCQ01UUl9NSU5fUkNWQlVGX1NJWkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2stPnNrX3JjdmJ1ZiA9IEJDTVRSX01JTl9SQ1ZCVUZfU0laRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG5sYiA9IChzdHJ1Y3QgYmNtdHJfbmwgKilzay0+c2tfdXNlcl9kYXRhOworICAgICAgICB9CisKKyAgICAgICAgLyogRGV2aWNlIGlkIGZvbGxvd3MgTkxNU0cgaGVhZGVyICovCisgICAgICAgIGRldmljZSA9IHNrYi0+ZGF0YVtOTE1TR19IRFJMRU5dOworICAgICAgICBpZiAoZGV2aWNlID49IEJDTVRSX01BWF9PTFRTKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogZGV2aWNlICV1IGlzIGluc2FuZVxuIiwgX19GVU5DVElPTl9fLCBkZXZpY2UpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFubGItPmNoYW5uZWxbZGV2aWNlXSkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtdHJtdXhfY2hhbm5lbCBjaGFubmVsID0gQkNNVFJNVVhfQ0hBTk5FTF9BVVRPX0FTU0lHTjsKKworICAgICAgICAgICAgcmMgPSBiY210cm11eF9jaGFubmVsX3JlZ2lzdGVyKGRldmljZSwgJmNoYW5uZWwsIF9iY210cl9ubF9yZWN2LCBubGIpOworICAgICAgICAgICAgaWYgKHJjKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBjYW4ndCByZWdpc3RlciBjaGFubmVsIGZvciBkZXZpY2UgJXUuIHJjPSVkXG4iLCBfX0ZVTkNUSU9OX18sIGRldmljZSwgKGludClyYyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmxiLT5jaGFubmVsW2RldmljZV0gPSBjaGFubmVsOworICAgICAgICB9CisKKworICAgICAgICAvKiBDdXQgTkwgaGVhZGVyICsgZGV2aWNlICovCisgICAgICAgIHNrYl9wdWxsKHNrYiwgTkxNU0dfSERSTEVOICsgc2l6ZW9mKHVpbnQzMl90KSk7CisKKyAgICAgICAgLyogQ2xvbmUgc2tiIGJlY2F1c2UgY2FsbGVyIHdpbGwgcmVsZWFzZSB0aGUgb3JpZ2luYWwgb25lICovCisgICAgICAgIHNrYiA9IHNrYl9jbG9uZShza2IsIDApOworICAgICAgICBpZiAoIXNrYikKKyAgICAgICAgeworCisgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBhbGxvY2F0ZSBuZXcgc2tiXG4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEZvcndhcmQgdG8gdGhlIG11eCAqLworICAgICAgICBiY210cm11eF9yeF9mcm9tX2hvc3QoZGV2aWNlLCBubGItPmNoYW5uZWxbZGV2aWNlXSwgKGJjbW9zX2J1ZiAqKXNrYik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBpbnZhbGlkIG1lc3NhZ2UgcmVjZWl2ZWQgZnJwbSBwaWQgJWRcbiIsIF9fRlVOQ1RJT05fXywgbmxoLT5ubG1zZ19waWQpOworICAgIH0KK30KKworc3RhdGljIHN0cnVjdCBuZXRsaW5rX2tlcm5lbF9jZmcgYmNtdHJfbmxfY2ZnID0geworICAgIC5pbnB1dCA9IGJjbXRyX25sX2lucHV0LAorfTsKKworYmNtb3NfZXJybm8gYmNtdHJfbmxfaW5pdCh2b2lkKQoreworICAgIHByaW50ayhLRVJOX0lORk8gIk1hcGxlIG5ldGxpbmstYmFzZWQgcmF3IGRyaXZlciB0cmFuc3BvcnQgZHJpdmVyXG4iKTsKKyAgICBiY210cl9ubF9zb2NrID0gbmV0bGlua19rZXJuZWxfY3JlYXRlKCZpbml0X25ldCwgQkNNVFJfTkxfRkFNSUxZLCAmYmNtdHJfbmxfY2ZnKTsKKyAgICBpZighYmNtdHJfbmxfc29jaykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3ZvaWQgYmNtdHJfbmxfZXhpdCh2b2lkKQoreworICAgIHByaW50aygiTWFwbGUgbmV0bGluay1iYXNlZCByYXcgZHJpdmVyIHRlcm1pbmF0ZWRcbiIpOworICAgIGlmIChiY210cl9ubF9zb2NrKQorICAgIHsKKyAgICAgICAgbmV0bGlua19rZXJuZWxfcmVsZWFzZShiY210cl9ubF9zb2NrKTsKKyAgICAgICAgYmNtdHJfbmxfc29jayA9IE5VTEw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvbmxfc29ja2V0L2JjbW9sdF90cl9ubF9kcml2ZXIuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdHJhbnNwb3J0L25sX3NvY2tldC9iY21vbHRfdHJfbmxfZHJpdmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc5Yzk5MAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdHJhbnNwb3J0L25sX3NvY2tldC9iY21vbHRfdHJfbmxfZHJpdmVyLmgKQEAgLTAsMCArMSw0MiBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworLyoKKyAqIGJjbXRyX25sX2RyaXZlci5oIC0gaG9zdCBuZXRsaW5rLXNvY2tldCB0cmFuc3BvcnQgZHJpdmVyCisgKi8KKworI2lmbmRlZiBCQ01PTFRfVFJfTkxfRFJJVkVSX0hfCisjZGVmaW5lIEJDTU9MVF9UUl9OTF9EUklWRVJfSF8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorCitiY21vc19lcnJubyBiY210cl9ubF9pbml0KHZvaWQpOwordm9pZCBiY210cl9ubF9leGl0KHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdHJhbnNwb3J0L3BsdWdpbi9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdHJhbnNwb3J0L3BsdWdpbi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGYwMTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvcGx1Z2luL01ha2VmaWxlCkBAIC0wLDAgKzEsMTEgQEAKKyMgVHJhbnNwb3J0OiBQbHVnaW4gaW50ZXJmYWNlCisjCitNT0RfTkFNRSA9IHRyX3BsdWdpbgorTU9EX1RZUEUgPSBsaWIKK01PRF9ERVBTID0gdXRpbHMgY29tbW9uX2FwaSBtb2RlbAorCitpZmVxICgiJChSRUxFQVNFX0JVSUxEKSIsICJ5IikKK01PRF9JTkNfRElSUyA9ICQoU1JDX0RJUikgJChUT1BfRElSKS9ob3N0X2RyaXZlci90cmFuc3BvcnQKK2Vsc2UKK01PRF9JTkNfRElSUyA9ICQoU1JDX0RJUikgJChTUkNfRElSKS8uLgorZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdHJhbnNwb3J0L3BsdWdpbi9iY210cl9wbHVnaW4uaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdHJhbnNwb3J0L3BsdWdpbi9iY210cl9wbHVnaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmQzZGQyCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvcGx1Z2luL2JjbXRyX3BsdWdpbi5oCkBAIC0wLDAgKzEsMTEzIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaWZuZGVmIEJDTVRSX1BMVUdJTl9IXworI2RlZmluZSBCQ01UUl9QTFVHSU5fSF8KKworI2luY2x1ZGUgPGJjbW9sdF9idWYuaD4KKyNpbmNsdWRlIDxiY21vbHRfbXNnLmg+CisKKyNpbmNsdWRlIDxiY210cl9pbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxiY210cl9oZWFkZXIuaD4KKworLyoqIE1lc3NhZ2UgdHJhbnNwb3J0IHR5cGUgKi8KK3R5cGVkZWYgZW51bQoreworICAgQkNNVFJfVFlQRV9VRFAsICAgICAgICAvKio8IFVEUCB0cmFuc3BvcnQgKi8KKyAgIEJDTVRSX1RZUEVfUkFXICAgICAgICAgLyoqPCBSYXcgdHJhbnNwb3J0ICovCit9IGJjbXRyX3RyYW5zcG9ydF90eXBlOworCisvKiogVURQIGNvbmZpZ3VyYXRpb24gKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDMyX3QgbXlfaXA7ICAgICAgICAgICAgIC8qKjwgTG9jYWwgSVAgYWRkcmVzcyBpbiBob3N0IGZvcm1hdCAqLworICAgIHVpbnQzMl90IHJlbW90ZV9pcDsgICAgICAgICAvKio8IFJlbW90ZSBJUCBhZGRyZXNzIGluIGhvc3QgZm9ybWF0ICovCisgICAgdWludDE2X3QgbXlfcG9ydDsgICAgICAgICAgIC8qKjwgTG9jYWwgVURQIHBvcnQgaW4gaG9zdCBmb3JtYXQuIElOQUREUl9BTlkgaXMgYWNjZXB0YWJsZSAqLworICAgIHVpbnQxNl90IHJlbW90ZV9wb3J0OyAgICAgICAvKio8IFJlbW90ZSBVRFAgcG9ydCBpbiBob3N0IGZvcm1hdCAqLworfSBiY210cl91ZHBfY2ZnOworCisvKiogVHJhbnNwb3J0IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY210cl90cmFuc3BvcnRfdHlwZSB0eXBlOyAgICAgLyoqPCBUcmFuc3BvcnQgdHlwZSAqLworCisgICAgLyoqIFR5cGUtc3BlY2lmaWMgY29uZmlndXJhdGlvbiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICAvKiogVURQIFBsdWdpbiBwYXJhbWV0ZXJzICovCisgICAgICAgIGJjbXRyX3VkcF9jZmcgdWRwOworCisgICAgICAgIC8qIFJhdyB0YXNrIGZvcndhcmRlciBwbHVnaW4gcGFyYW1ldGVycyAqLworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtdHJfdWRwX2NmZyB1ZHA7ICAgICAgICAgIC8qKjwgVURQIGNvbmZpZ3VyYXRpb24gLSBmb3IgVURQLWJhc2VkIHJhdyBkcml2ZXIgKi8KKyAgICAgICAgICAgIHVpbnQzMl90IG1heF90eHFfc2l6ZTsgICAgICAvKio8IE1heCB0cmFuc21pdCBxdWV1ZS9wb29sIHNpemUgKi8KKyAgICAgICAgICAgIGJjbW9zX3Rhc2tfcHJpb3JpdHkgdHhfcHJpOyAvKio8IFR4IHRhc2sgcHJpb3JpdHkgKi8KKyAgICAgICAgfSBmb3J3YXJkZXI7CisgICAgfSB4OworCisgICAgdWludDMyX3QgaGVhZHJvb207ICAgICAgICAgICAgICAgICAgLyoqPCBBZGRpdGlvbmFsIGhlYWRyb29tIGxlbmd0aCB0aGF0IHNob3VsZCBiZSByZXNlcnZlZCBmb3IgcGx1Z2luIHVzZSAqLworCit9IGJjbXRyX3BsdWdpbl9jZmc7CisKKy8qKiBQbHVnaW4gY2hhbm5lbCAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGJjbXRyX3BsdWdpbl9jaGFubmVsOworCisvKiogVHJhbnNwb3J0IGRyaXZlciAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIC8qKiBPcGVuIGNvbW11bmljYXRpb24gY2hhbm5lbCwgZXN0YWJsaXNoIGNvbW11bmljYXRpb24gKi8KKyAgICBiY21vc19lcnJubyAoKm9wZW4pKGludCBkZXZpY2UsIGJjbXRyX3BsdWdpbl9jZmcgKmNmZywgYmNtdHJfcGx1Z2luX2NoYW5uZWwgKmNoKTsKKyAgICAvKiogQ2xvc2UgY29tbXVuaWNhdGlvbiBjaGFubmVsICovCisgICAgYmNtb3NfZXJybm8gKCpjbG9zZSkoYmNtdHJfcGx1Z2luX2NoYW5uZWwgY2gpOworICAgIC8qKiBTZW5kIGRhdGEuIEl0IGRvZXNuJ3QgaGF2ZSB0byByZWxlYXNlIHRoZSB0eCBidWZmZXIsIGJ1dCBpZiBpdCBkb2VzIC0gaXQgbXVzdAorICAgICAqIGNsZWFyIGJ1Zi0+c3RhcnQgdG8gcHJldmVudCBkb3VibGUgcmVsZWFzZSAqLworICAgIGJjbW9zX2Vycm5vICgqc2VuZCkoYmNtdHJfcGx1Z2luX2NoYW5uZWwgY2gsIGJjbW9sdF9zdWJjaGFubmVsIHN1YmNoLCBiY21vbHRfYnVmICpidWYsIGJjbXRyX3NlbmRfZmxhZ3MgZmxhZ3MpOworICAgIC8qKiBSZWNlaXZlIGRhdGEuIEl0IGlzIHJlc3BvbnNpYmxlIGZvciByZWNlaXZlIGJ1ZmZlciBhbGxvY2F0aW9uICovCisgICAgYmNtb3NfZXJybm8gKCpyZWN2KShiY210cl9wbHVnaW5fY2hhbm5lbCBjaCwgYmNtb2x0X3N1YmNoYW5uZWwgKnN1YmNoLCBiY21vbHRfYnVmICpidWYpOworfSBiY210cl9kcml2ZXI7CisKKy8qKiBJbml0aWFsaXplIHBsdWdpbiBjYWxsYmFja3MKKyAqIFxwYXJhbVtpbl0gICAgICAgICAgIGNmZyAgICAgUGx1Z2luIGNvbmZpZ3VyYXRpb24KKyAqIFxwYXJhbVtpbixvdXRdICAgICAgIGRyaXZlciAgVHJhbnNwb3J0IHBsdWdpbiBkcml2ZXIgc3RydWN0dXJlCisgKiBccmV0dXJuIGVycm9yIGNvZGUKKyAqLworYmNtb3NfZXJybm8gYmNtdHJfcGx1Z2luX2luaXQoYmNtdHJfcGx1Z2luX2NmZyAqY2ZnLCBiY210cl9kcml2ZXIgKmRyaXZlcik7CisKKy8qIFVEUCBjb21tIHBhcmFtZXRlcnMgKi8KKyNpZmRlZiBCQ01UUl9VRFBfU1VQUE9SVAorZXh0ZXJuIHVpbnQzMl90IGJjbXRyX2hvc3RfaXA7CitleHRlcm4gdWludDE2X3QgYmNtdHJfaG9zdF91ZHBfcG9ydDsKK2V4dGVybiB1aW50MzJfdCBiY210cl9vbHRfaXBbQkNNVFJfTUFYX09MVFNdOworZXh0ZXJuIHVpbnQxNl90IGJjbXRyX29sdF91ZHBfcG9ydFtCQ01UUl9NQVhfT0xUU107CisjZW5kaWYKKwordm9pZCB1c2luZ19pbmJhbmRfc2V0KGJjbW9zX2Jvb2wgdXNpbmdfaW5iYW5kKTsKK2JjbW9zX2Jvb2wgdXNpbmdfaW5iYW5kX2dldCh2b2lkKTsKKworI2VuZGlmIC8qIEJDTVRSX1BMVUdJTl9IXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvcGx1Z2luL2RpcmVjdC9iY210cl9wbHVnaW5fZGlyZWN0LmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3RyYW5zcG9ydC9wbHVnaW4vZGlyZWN0L2JjbXRyX3BsdWdpbl9kaXJlY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDBjOWJhCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvcGx1Z2luL2RpcmVjdC9iY210cl9wbHVnaW5fZGlyZWN0LmMKQEAgLTAsMCArMSwyOTAgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6cHJvcHJpZXRhcnk6c3RhbmRhcmQKKyAKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAKK1RoaXMgcHJvZ3JhbSBpcyB0aGUgcHJvcHJpZXRhcnkgc29mdHdhcmUgb2YgQnJvYWRjb20gQ29ycG9yYXRpb24gYW5kL29yIGl0cworbGljZW5zb3JzLCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgZHVwbGljYXRlZCwgbW9kaWZpZWQgb3IgZGlzdHJpYnV0ZWQgcHVyc3VhbnQKK3RvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiBhIHNlcGFyYXRlLCB3cml0dGVuIGxpY2Vuc2UgYWdyZWVtZW50IGV4ZWN1dGVkCitiZXR3ZWVuIHlvdSBhbmQgQnJvYWRjb20gKGFuICJBdXRob3JpemVkIExpY2Vuc2UiKS4gIEV4Y2VwdCBhcyBzZXQgZm9ydGggaW4KK2FuIEF1dGhvcml6ZWQgTGljZW5zZSwgQnJvYWRjb20gZ3JhbnRzIG5vIGxpY2Vuc2UgKGV4cHJlc3Mgb3IgaW1wbGllZCksIHJpZ2h0Cit0byB1c2UsIG9yIHdhaXZlciBvZiBhbnkga2luZCB3aXRoIHJlc3BlY3QgdG8gdGhlIFNvZnR3YXJlLCBhbmQgQnJvYWRjb20KK2V4cHJlc3NseSByZXNlcnZlcyBhbGwgcmlnaHRzIGluIGFuZCB0byB0aGUgU29mdHdhcmUgYW5kIGFsbCBpbnRlbGxlY3R1YWwKK3Byb3BlcnR5IHJpZ2h0cyB0aGVyZWluLiAgSUYgWU9VIEhBVkUgTk8gQVVUSE9SSVpFRCBMSUNFTlNFLCBUSEVOIFlPVSBIQVZFCitOTyBSSUdIVCBUTyBVU0UgVEhJUyBTT0ZUV0FSRSBJTiBBTlkgV0FZLCBBTkQgU0hPVUxEIElNTUVESUFURUxZIE5PVElGWQorQlJPQURDT00gQU5EIERJU0NPTlRJTlVFIEFMTCBVU0UgT0YgVEhFIFNPRlRXQVJFLgorIAorRXhjZXB0IGFzIGV4cHJlc3NseSBzZXQgZm9ydGggaW4gdGhlIEF1dGhvcml6ZWQgTGljZW5zZSwKKyAKKzEuIFRoaXMgcHJvZ3JhbSwgaW5jbHVkaW5nIGl0cyBzdHJ1Y3R1cmUsIHNlcXVlbmNlIGFuZCBvcmdhbml6YXRpb24sCisgICAgY29uc3RpdHV0ZXMgdGhlIHZhbHVhYmxlIHRyYWRlIHNlY3JldHMgb2YgQnJvYWRjb20sIGFuZCB5b3Ugc2hhbGwgdXNlCisgICAgYWxsIHJlYXNvbmFibGUgZWZmb3J0cyB0byBwcm90ZWN0IHRoZSBjb25maWRlbnRpYWxpdHkgdGhlcmVvZiwgYW5kIHRvCisgICAgdXNlIHRoaXMgaW5mb3JtYXRpb24gb25seSBpbiBjb25uZWN0aW9uIHdpdGggeW91ciB1c2Ugb2YgQnJvYWRjb20KKyAgICBpbnRlZ3JhdGVkIGNpcmN1aXQgcHJvZHVjdHMuCisgCisyLiBUTyBUSEUgTUFYSU1VTSBFWFRFTlQgUEVSTUlUVEVEIEJZIExBVywgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIKKyAgICBBTkQgV0lUSCBBTEwgRkFVTFRTIEFORCBCUk9BRENPTSBNQUtFUyBOTyBQUk9NSVNFUywgUkVQUkVTRU5UQVRJT05TIE9SCisgICAgV0FSUkFOVElFUywgRUlUSEVSIEVYUFJFU1MsIElNUExJRUQsIFNUQVRVVE9SWSwgT1IgT1RIRVJXSVNFLCBXSVRICisgICAgUkVTUEVDVCBUTyBUSEUgU09GVFdBUkUuICBCUk9BRENPTSBTUEVDSUZJQ0FMTFkgRElTQ0xBSU1TIEFOWSBBTkQKKyAgICBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIFRJVExFLCBNRVJDSEFOVEFCSUxJVFksIE5PTklORlJJTkdFTUVOVCwKKyAgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgTEFDSyBPRiBWSVJVU0VTLCBBQ0NVUkFDWSBPUgorICAgIENPTVBMRVRFTkVTUywgUVVJRVQgRU5KT1lNRU5ULCBRVUlFVCBQT1NTRVNTSU9OIE9SIENPUlJFU1BPTkRFTkNFCisgICAgVE8gREVTQ1JJUFRJT04uIFlPVSBBU1NVTUUgVEhFIEVOVElSRSBSSVNLIEFSSVNJTkcgT1VUIE9GIFVTRSBPUgorICAgIFBFUkZPUk1BTkNFIE9GIFRIRSBTT0ZUV0FSRS4KKyAKKzMuIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBJTiBOTyBFVkVOVCBTSEFMTCBCUk9BRENPTSBPUgorICAgIElUUyBMSUNFTlNPUlMgQkUgTElBQkxFIEZPUiAoaSkgQ09OU0VRVUVOVElBTCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAgICBJTkRJUkVDVCwgT1IgRVhFTVBMQVJZIERBTUFHRVMgV0hBVFNPRVZFUiBBUklTSU5HIE9VVCBPRiBPUiBJTiBBTlkKKyAgICBXQVkgUkVMQVRJTkcgVE8gWU9VUiBVU0UgT0YgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgU09GVFdBUkUgRVZFTgorICAgIElGIEJST0FEQ09NIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUzsKKyAgICBPUiAoaWkpIEFOWSBBTU9VTlQgSU4gRVhDRVNTIE9GIFRIRSBBTU9VTlQgQUNUVUFMTFkgUEFJRCBGT1IgVEhFCisgICAgU09GVFdBUkUgSVRTRUxGIE9SIFUuUy4gJDEsIFdISUNIRVZFUiBJUyBHUkVBVEVSLiBUSEVTRSBMSU1JVEFUSU9OUworICAgIFNIQUxMIEFQUExZIE5PVFdJVEhTVEFORElORyBBTlkgRkFJTFVSRSBPRiBFU1NFTlRJQUwgUFVSUE9TRSBPRiBBTlkKKyAgICBMSU1JVEVEIFJFTUVEWS4KKzo+CisqLworLyoKKyAqIGJjbXRyX3BsdWdpbl9kaXJlY3QuYworICoKKyAqIFRoaXMgcGx1Z2luCisgKiAtIFRYOiBmb3J3YXJkcyBtZXNzYWdlcyB0byB0cm11eAorICogLSBSWDogd2FpdHMgb24gcnggdGFzaydzIG1lc3NhZ2UgcXVldWUKKyAqLworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisKKyNpbmNsdWRlIDxiY210cl9wbHVnaW4uaD4KKyNpbmNsdWRlIDxiY21fY29uZmlnLmg+CisjaW5jbHVkZSA8YmNtb2x0X3RyX211eC5oPgorCisvKiBSZWNlaXZlIE9TIG1lc3NhZ2UgcG9vbCBhbmQgcXVldWUgKi8KK3N0YXRpYyBiY21vc19tc2dfcG9vbCBiY210cl9yeF9tc2dfcG9vbFtCQ01UUl9NQVhfT0xUU107CitzdGF0aWMgYmNtb3NfbXNnX3F1ZXVlIGJjbXRyX3J4cVtCQ01UUl9NQVhfT0xUU107CisKKy8qIEZsYWdzIGluZGljYXRpbmcgaW5pdCBwcm9ncmVzcyAqLworc3RhdGljIGJjbW9zX2Jvb2wgcnhfcG9vbF9jcmVhdGVkW0JDTVRSX01BWF9PTFRTXTsKK3N0YXRpYyBiY21vc19ib29sIHJ4cV9jcmVhdGVkW0JDTVRSX01BWF9PTFRTXTsKK3N0YXRpYyB2b2lkIF9iY210cl9kaXJlY3RfcnhfZnJvbV90cm11eChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vc19idWYgKmJ1ZiwgYmNtdHJtdXhfY2hhbm5lbCBjaGFubmVsLCB2b2lkICpkYXRhKTsKKworLyogVG8gcmVzb2x2ZSBzeW1ib2xzIGluIHVzZXJfYXBwbCBpbiBiYW5kIG5vdCBhcHBsaWNhYmxlIGZvciBWWFdvcmtzKi8KK3ZvaWQgdXNpbmdfaW5iYW5kX3NldChiY21vc19ib29sIHVzaW5nX2luYmFuZCl7fQorYmNtb3NfYm9vbCB1c2luZ19pbmJhbmRfZ2V0KHZvaWQpCit7CisgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworfQorCisKKy8qIFRyYW5zcG9ydCBJUEMgbWVzc2FnZSBkYXRhICovCit0eXBlZGVmIHN0cnVjdCBiY210cl9pcGNfZGF0YQoreworICAgIGJjbW9sdF9idWYgYnVmOyAgICAgICAgICAgICAvKiBSeCBidWZmZXIgKi8KKyAgICBiY21vbHRfc3ViY2hhbm5lbCBzdWJjaDsgICAgLyogcnggY2hhbm5lbCAqLworfSBiY210cl9pcGNfZGF0YTsKKworCisvKiBTeXN0ZW0gLS0+IE9MVCBidWZmZXIgdHJhbnNsYXRpb24uCisgKiBzeXN0ZW0gYnVmZmVyIGlzIHJlbGVhc2VkIGluIGNhc2Ugb2Ygc3VjY2VzcworICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtdHJfc3lzYnVmX3RvX29sdGJ1ZihiY21vc19idWYgKnN5c2IsIGJjbW9sdF9idWYgKm9sdGIpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgZXJyID0gYmNtb2x0X2J1Zl9hbGxvYyhvbHRiLCBiY21vc19idWZfbGVuZ3RoKHN5c2IpLCBCQ01UUl9CVUZfRU5ESUFOKTsKKyAgICBpZiAoZXJyKQorICAgICAgICByZXR1cm4gZXJyOworICAgIGJjbW9sdF9idWZfd3JpdGUob2x0YiwgYmNtb3NfYnVmX2RhdGEoc3lzYiksIGJjbW9zX2J1Zl9sZW5ndGgoc3lzYikpOworICAgIGJjbW9zX2J1Zl9mcmVlKHN5c2IpOworICAgIG9sdGItPmN1cnIgPSBvbHRiLT5zdGFydDsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogT0xUIGJ1ZmZlciAtLT4gc3lzdGVtIGJ1ZmZlciB0cmFuc2xhdGlvbi4KKyAqIE9MVCBidWZmZXIgbXVzdCBoYXZlIGhlYWRyb29tIGZvciBiY21vc19idWYgaGVhZGVyCisgKi8KK3N0YXRpYyBiY21vc19idWYgKmJjbXRyX29sdGJ1Zl90b19zeXNidWYoYmNtb2x0X2J1ZiAqb2x0YikKK3sKKyAgICBiY21vc19idWYgKnN5c2I7CisgICAgdWludDMyX3QgbGVuID0gYmNtb2x0X2J1Zl9nZXRfdXNlZChvbHRiKTsKKworICAgIHN5c2IgPSBiY21vc19idWZfYWxsb2MobGVuKTsKKyAgICBpZiAoc3lzYiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtZW1jcHkoYmNtb3NfYnVmX2RhdGEoc3lzYiksIG9sdGItPnN0YXJ0LCBsZW4pOworICAgIGJjbW9zX2J1Zl9sZW5ndGhfc2V0KHN5c2IsIGxlbik7CisgICAgLyogV2UgZG9uJ3QgcmVsZWFzZSB0aGUgb3JpZ2luYWwgb2x0YiBiZWNhdXNlIGl0IGlzIG5lZWRlZCBmb3IgcmV0cmFuc21pc3Npb24uCisgICAgICogSXQgd2lsbCBiZSByZWxlYXNlZCBieSB0aGUgdHJhbnNwb3J0IGxheWVyCisgICAgICovCisgICAgcmV0dXJuIHN5c2I7Cit9CisKKy8qIFJlbGVhc2UgbWVzc2FnZSBkYXRhICovCitzdGF0aWMgdm9pZCBiY210cl9tc2dfZGF0YV9yZWxlYXNlKGJjbW9zX21zZyAqbXNnKQoreworICAgIGJjbXRyX2lwY19kYXRhICpkYXRhID0gbXNnLT5kYXRhOworICAgIGJjbW9sdF9idWZfZnJlZSgmZGF0YS0+YnVmKTsKK30KKworLyoqIENsb3NlIGNvbW11bmljYXRpb24gY2hhbm5lbCAqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbXRyX2RpcmVjdF9jbG9zZShiY210cl9wbHVnaW5fY2hhbm5lbCBjaCkKK3sKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlID0gKGJjbW9sdF9kZXZpZCkoY2ggPj4gOCk7CisgICAgYmNtdHJtdXhfY2hhbm5lbCBtdXhjaCA9IChiY210cm11eF9jaGFubmVsKShjaCAmIDB4ZmYpOworCisgICAgLyogVW5yZWdpc3RlciBmcm9tIFRSTVVYICovCisgICAgYmNtdHJtdXhfY2hhbm5lbF91bnJlZ2lzdGVyKGRldmljZSwgbXV4Y2gpOworCisgICAgLyogRGVzdHJveSByeCBtZXNzYWdlIHBvb2wgKi8KKyAgICBpZiAocnhfcG9vbF9jcmVhdGVkW2RldmljZV0pCisgICAgeworICAgICAgICBiY21vc19tc2dfcG9vbF9kZXN0cm95KCZiY210cl9yeF9tc2dfcG9vbFtkZXZpY2VdKTsKKyAgICAgICAgcnhfcG9vbF9jcmVhdGVkW2RldmljZV0gPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAvKiBEZXN0cm95IFJYIG1lc3NhZ2UgcXVldWUgKi8KKyAgICBpZiAocnhxX2NyZWF0ZWRbZGV2aWNlXSkKKyAgICB7CisgICAgICAgIGJjbW9zX21zZ19xdWV1ZV9kZXN0cm95KCZiY210cl9yeHFbZGV2aWNlXSk7CisgICAgICAgIHJ4cV9jcmVhdGVkW2RldmljZV0gPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqIE9wZW4gY29tbXVuaWNhdGlvbiBjaGFubmVsICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtdHJfZGlyZWN0X29wZW4oaW50IGRldmljZSwgYmNtdHJfcGx1Z2luX2NmZyAqY2ZnLCBiY210cl9wbHVnaW5fY2hhbm5lbCAqY2gpCit7CisgICAgLyogVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgYXJlIGRlY2xhcmVkIHN0YXRpYyBpbiBvcmRlciB0byBwcm90ZWN0IG5hbWUgc3RyaW5nICovCisgICAgc3RhdGljIGJjbW9zX21zZ19xdWV1ZV9wYXJtIG1zZ3FfcGFybSA9IHsgLm5hbWUgPSAidHJfcnhxIn07CisgICAgYmNtb3NfbXNnX3Bvb2xfcGFybSBtc2dfcG9vbF9wYXJtID0ge307CisgICAgYmNtdHJtdXhfY2hhbm5lbCBtdXhfY2hhbm5lbCA9IEJDTVRSTVVYX0NIQU5ORUxfQVVUT19BU1NJR047CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgLyogRGlyZWN0IHBsdWdpbiBzdXBwb3J0cyBvbmx5IDEgYXBwbGljYXRpb24gaW5zdGFuY2UgKi8KKyAgICBpZiAoZGV2aWNlID49IEJDTVRSX01BWF9PTFRTKQorICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9QQVJNLCAiRGV2aWNlICV1IGlzIG91dCBvZiByYW5nZVxuIiwgZGV2aWNlKTsKKyAgICBpZiAocnhfcG9vbF9jcmVhdGVkW2RldmljZV0pCisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX0FMUkVBRFksICJUcmFuc3BvcnQgaXMgYWxyZWFkeSBpbml0aWFsaXplZCBmb3IgZGV2aWNlICV1XG4iLCBkZXZpY2UpOworCisgICAgLyogQ3JlYXRlIFJYIG1zZyBwb29sICovCisgICAgbXNnX3Bvb2xfcGFybS5zaXplID0gQkNNVFJfTUFYX1JYUV9TSVpFOyAgICAgICAgICAgIC8qIDwtLSBEZWZpbmUgcGFyYW1ldGVyIGluIGJjbXRyX2NvbmZpZyAqLworICAgIG1zZ19wb29sX3Bhcm0uZGF0YV9zaXplID0gc2l6ZW9mKGJjbXRyX2lwY19kYXRhKTsKKyAgICBtc2dfcG9vbF9wYXJtLmRhdGFfcmVsZWFzZSA9IGJjbXRyX21zZ19kYXRhX3JlbGVhc2U7CisgICAgZXJyID0gYmNtb3NfbXNnX3Bvb2xfY3JlYXRlKCZiY210cl9yeF9tc2dfcG9vbFtkZXZpY2VdLCAmbXNnX3Bvb2xfcGFybSk7CisgICAgaWYgKGVycikKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKGVyciwgIkNhbid0IGNyZWF0ZSByeCBwb29sXG4iKTsKKworICAgIC8qIENyZWF0ZSBSWCBxdWV1ZSBzZXQgKi8KKyAgICBlcnIgPSBiY21vc19tc2dfcXVldWVfY3JlYXRlKCZiY210cl9yeHFbZGV2aWNlXSwgJm1zZ3FfcGFybSk7CisgICAgaWYgKGVycikKKyAgICB7CisgICAgICAgIGJjbW9zX21zZ19wb29sX2Rlc3Ryb3koJmJjbXRyX3J4X21zZ19wb29sW2RldmljZV0pOworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oZXJyLCAiQ2FuJ3QgY3JlYXRlIHJ4cVxuIik7CisgICAgfQorCisgICAgLyogUmVnaXN0ZXIgd2l0aCB0cm11eCAqLworICAgIGVyciA9IGJjbXRybXV4X2NoYW5uZWxfcmVnaXN0ZXIoZGV2aWNlLCAmbXV4X2NoYW5uZWwsIF9iY210cl9kaXJlY3RfcnhfZnJvbV90cm11eCwgKHZvaWQgKilOVUxMICk7CisgICAgaWYgKGVycikKKyAgICB7CisgICAgICAgIGJjbW9zX21zZ19wb29sX2Rlc3Ryb3koJmJjbXRyX3J4X21zZ19wb29sW2RldmljZV0pOworICAgICAgICBiY21vc19tc2dfcXVldWVfZGVzdHJveSgmYmNtdHJfcnhxW2RldmljZV0pOworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oZXJyLCAiQ2FuJ3QgcmVnaXN0ZXIgd2l0aCB0cm11eFxuIik7CisgICAgfQorCisgICAgcnhfcG9vbF9jcmVhdGVkW2RldmljZV0gPSBCQ01PU19UUlVFOworICAgIHJ4cV9jcmVhdGVkW2RldmljZV0gPSBCQ01PU19UUlVFOworICAgICpjaCA9IChiY210cl9wbHVnaW5fY2hhbm5lbCkoKGRldmljZSA8PCA4KSB8IG11eF9jaGFubmVsKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiogU2VuZCBkYXRhICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtdHJfZGlyZWN0X3NlbmQoYmNtdHJfcGx1Z2luX2NoYW5uZWwgY2gsIGJjbW9sdF9zdWJjaGFubmVsIHN1YmNoLCBiY21vbHRfYnVmICpidWYsCisgICAgYmNtdHJfc2VuZF9mbGFncyBmbGFncykKK3sKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlID0gKGJjbW9sdF9kZXZpZCkoY2ggPj4gOCk7CisgICAgYmNtdHJtdXhfY2hhbm5lbCBtdXhjaCA9IChiY210cm11eF9jaGFubmVsKShjaCAmIDB4ZmYpOworICAgIGJjbW9zX2J1ZiAqc3lzYjsKKworICAgIC8qIERvIHplcm8tY29weSBjb252ZXJzaW9uIGZyb20gYmNtb2x0X2J1ZiAtLT4gYmNtb3NfYnVmLiBJdCBpcyBwb3NzaWJsZSBiZWNhdXNlIHJvb20KKyAgICAgKiBmb3IgYmNtb3NfYnVmIGhlYWRlciBpcyByZXNlcnZlZCBpbiB0aGUgYmVnaW5uaW5nIG9mIGJjbW9sdF9idWYKKyAgICAgKi8KKyAgICBzeXNiID0gYmNtdHJfb2x0YnVmX3RvX3N5c2J1ZihidWYpOworICAgIGlmICghc3lzYikKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgYmNtdHJtdXhfcnhfZnJvbV9ob3N0KGRldmljZSwgbXV4Y2gsIHN5c2IpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIFJlY2VpdmUgZnJvbSB0cm11eC4gQ2FsbGVkIGluIHRybXV4IGNvbnRleHQgKi8KK3N0YXRpYyB2b2lkIF9iY210cl9kaXJlY3RfcnhfZnJvbV90cm11eChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vc19idWYgKnN5c2IsIGJjbXRybXV4X2NoYW5uZWwgY2hhbm5lbCwgdm9pZCAqZGF0YSkKK3sKKyAgICBiY21vc19tc2cgKm1zZzsKKyAgICBiY210cl9pcGNfZGF0YSAqaXBjX2RhdGE7CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgbXNnID0gYmNtb3NfbXNnX3Bvb2xfYWxsb2MoJmJjbXRyX3J4X21zZ19wb29sW2RldmljZV0pOworICAgIGlmICghbXNnKQorICAgIHsKKyAgICAgICAgIC8qIDwtLSBhZGQgc29tZSBzdGF0aXN0aWMgaGVyZSAqLworICAgICAgICBiY21vc19idWZfZnJlZShzeXNiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpcGNfZGF0YSA9IG1zZy0+ZGF0YTsKKyAgICBlcnIgPSBiY210cl9zeXNidWZfdG9fb2x0YnVmKHN5c2IsICZpcGNfZGF0YS0+YnVmKTsKKyAgICBpZiAoZXJyKQorICAgIHsKKyAgICAgICAgLyogPC0tIGFkZCBzb21lIHN0YXRpc3RpYyBoZXJlICovCisgICAgICAgIGJjbW9zX2J1Zl9mcmVlKHN5c2IpOworICAgICAgICBiY21vc19tc2dfZnJlZShtc2cpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlwY19kYXRhLT5zdWJjaCA9IGNoYW5uZWw7CisgICAgZXJyID0gYmNtb3NfbXNnX3NlbmQoJmJjbXRyX3J4cVtkZXZpY2VdLCBtc2csIEJDTU9TX01TR19TRU5EX0FVVE9fRlJFRSk7CisgICAgaWYgKGVycikKKyAgICB7CisgICAgICAgIC8qIDwtLSBhZGQgc29tZSBzdGF0aXN0aWMgaGVyZSAqLworICAgIH0KK30KKworLyoqIFJlY2VpdmUgZGF0YSAqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbXRyX2RpcmVjdF9yZWN2KGJjbXRyX3BsdWdpbl9jaGFubmVsIGNoLCBiY21vbHRfc3ViY2hhbm5lbCAqc3ViY2gsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlID0gKGJjbW9sdF9kZXZpZCkoY2ggPj4gOCk7CisgICAgYmNtb3NfbXNnICptc2c7CisgICAgYmNtdHJfaXBjX2RhdGEgKmRhdGE7CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgZXJyID0gYmNtb3NfbXNnX3JlY3YoJmJjbXRyX3J4cVtkZXZpY2VdLCBCQ01UUl9NU0dfVElNRU9VVCwgJm1zZyk7CisgICAgaWYgKGVycikKKyAgICB7CisgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9USU1FT1VUKQorICAgICAgICAgICAgZXJyID0gQkNNX0VSUl9DT01NX0ZBSUw7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgZGF0YSA9IG1zZy0+ZGF0YTsKKyAgICAqYnVmID0gZGF0YS0+YnVmOworICAgICpzdWJjaCA9IGRhdGEtPnN1YmNoOworICAgIC8qIFByZXZlbnQgYnVmZmVyIHJlbGVhc2Ugd2hlbiByZWxlYXNpbmcgT1MgbWVzc2FnZSAqLworICAgIGRhdGEtPmJ1Zi5zdGFydCA9IGRhdGEtPmJ1Zi5jdXJyID0gTlVMTDsKKyAgICBiY21vc19tc2dfZnJlZShtc2cpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qKiBJbml0aWFsaXplIHBsdWdpbiBjYWxsYmFja3MKKyAqIFxwYXJhbVtpbixvdXRdICAgICAgIGRyaXZlciBUcmFuc3BvcnQgcGx1Z2luIGRyaXZlciBzdHJ1Y3R1cmUKKyAqIFxyZXR1cm4gZXJyb3IgY29kZQorICovCitiY21vc19lcnJubyBiY210cl9wbHVnaW5faW5pdChiY210cl9wbHVnaW5fY2ZnICpjZmcsIGJjbXRyX2RyaXZlciAqZHJpdmVyKQoreworICAgIGRyaXZlci0+b3BlbiA9IGJjbXRyX2RpcmVjdF9vcGVuOworICAgIGRyaXZlci0+Y2xvc2UgPSBiY210cl9kaXJlY3RfY2xvc2U7CisgICAgZHJpdmVyLT5yZWN2ID0gYmNtdHJfZGlyZWN0X3JlY3Y7CisgICAgZHJpdmVyLT5zZW5kID0gYmNtdHJfZGlyZWN0X3NlbmQ7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvcGx1Z2luL211eC9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdHJhbnNwb3J0L3BsdWdpbi9tdXgvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWNmNzM2YQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdHJhbnNwb3J0L3BsdWdpbi9tdXgvTWFrZWZpbGUKQEAgLTAsMCArMSwxNiBAQAorIworIyAgdHJhbnNwb3J0IHBsdWdpbgorIworaWZlcSAoIiQoT1NfS0VSTkVMKSIsICJsaW51eCIpCisKK2lmZXEgKCIkKENPTkZJR19UUkFOU1BPUlRfUkFXKSIsICJ5IikKK01PRF9OQU1FID0gdHJfcGx1Z2luX211eAorTU9EX1RZUEUgPSBsaWIKK01PRF9ERVBTID0gIHRyX3BsdWdpbl9yYXcgdHJfcGx1Z2luX3Jhd191ZCAgCisKK01PRF9ERUZTID0gLURCQ01UUl9QTFVHSU5fUkFXCisKK3NyY3MgPSBiY210cl9ubF91ZF9tdXguYworCitlbmRpZgorZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdHJhbnNwb3J0L3BsdWdpbi9tdXgvYmNtdHJfbmxfdWRfbXV4LmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3RyYW5zcG9ydC9wbHVnaW4vbXV4L2JjbXRyX25sX3VkX211eC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNhYmFmNDcKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3RyYW5zcG9ydC9wbHVnaW4vbXV4L2JjbXRyX25sX3VkX211eC5jCkBAIC0wLDAgKzEsNDAgQEAKKw0KKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4NCisjaW5jbHVkZSA8YmNtdHJfcGx1Z2luLmg+DQorI2luY2x1ZGUgImJjbW9sdF90cl91ZC5oIg0KKyNpbmNsdWRlICJiY21vbHRfdHJfbmwuaCINCisjaW5jbHVkZSAiYmNtdHJfaW50ZXJuYWwuaCINCisNCitzdGF0aWMgYmNtb3NfYm9vbCB1c2VfaW5iYW5kID0gQkNNT1NfRkFMU0U7DQordm9pZCB1c2luZ19pbmJhbmRfc2V0KGJjbW9zX2Jvb2wgdXNpbmdfaW5iYW5kKQ0KK3sNCisgICAgdXNlX2luYmFuZCA9IHVzaW5nX2luYmFuZDsNCit9DQorYmNtb3NfYm9vbCB1c2luZ19pbmJhbmRfZ2V0KHZvaWQpDQorew0KKyAgICByZXR1cm4gdXNlX2luYmFuZDsNCit9DQorDQorDQorLyoqIEluaXRpYWxpemUgcGx1Z2luIGNhbGxiYWNrcw0KKyAqIFxwYXJhbVtpbixvdXRdICAgICAgIGRyaXZlciBUcmFuc3BvcnQgcGx1Z2luIGRyaXZlciBzdHJ1Y3R1cmUNCisgKiBccmV0dXJuIGVycm9yIGNvZGUNCisgKi8NCitiY21vc19lcnJubyBiY210cl9wbHVnaW5faW5pdChiY210cl9wbHVnaW5fY2ZnICpwbHVnaW5fY2ZnLCBiY210cl9kcml2ZXIgKmRyaXZlcikNCit7DQorICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOw0KKw0KKyNpZmRlZiBTSU1VTEFUSU9OX0JVSUxEDQorICAgIHJjID0gYmNtdHJfcGx1Z2luX2luaXQocGx1Z2luX2NmZywgZHJpdmVyKTsNCisjZWxzZQ0KKyAgICBpZiAodXNpbmdfaW5iYW5kX2dldCgpKQ0KKyAgICB7DQorICAgICAgICByYyA9IGJjbXRyX3VkX3BsdWdpbl9pbml0KHBsdWdpbl9jZmcsIGRyaXZlcik7DQorICAgIH0gZWxzZQ0KKyAgICB7DQorICAgICAgICByYyA9IGJjbXRyX25sX3BsdWdpbl9pbml0KHBsdWdpbl9jZmcsIGRyaXZlcik7DQorICAgIH0NCisjZW5kaWYNCisNCisgICAgcmV0dXJuIHJjOw0KK30NCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3RyYW5zcG9ydC9wbHVnaW4vcmF3X25sL01ha2VmaWxlIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvcGx1Z2luL3Jhd19ubC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTQ3NzIyCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvcGx1Z2luL3Jhd19ubC9NYWtlZmlsZQpAQCAtMCwwICsxLDE1IEBACisjCisjIE5MIHRyYW5zcG9ydCBwbHVnaW4KKyMKK2lmZXEgKCIkKE9TX0tFUk5FTCkiLCAibGludXgiKQoraWZlcSAoIiQoQ09ORklHX1RSQU5TUE9SVF9SQVcpIiwgInkiKQorCitNT0RfTkFNRSA9IHRyX3BsdWdpbl9yYXcKK01PRF9UWVBFID0gbGliCitNT0RfREVQUyA9IHRyX3BsdWdpbgorTU9EX0RFRlMgPSAtREJDTVRSX1BMVUdJTl9SQVcKKworc3JjcyA9IGJjbW9sdF90cl9wbHVnaW5fbmxfc29ja2V0LmMKKworZW5kaWYKK2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3RyYW5zcG9ydC9wbHVnaW4vcmF3X25sL2JjbW9sdF90cl9ubC5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvcGx1Z2luL3Jhd19ubC9iY21vbHRfdHJfbmwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzA3YzNjCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvcGx1Z2luL3Jhd19ubC9iY21vbHRfdHJfbmwuaApAQCAtMCwwICsxLDQwIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaWZuZGVmIEJDTU9MVF9UUl9OTF9IXworI2RlZmluZSBCQ01PTFRfVFJfTkxfSF8KKworI2luY2x1ZGUgImJjbXRyX2ludGVybmFsLmgiCisKKy8qIE5MIGZhbWlseS4gTXVzdCBiZSBzb21lIHVudXNlZCBudW1iZXIgKi8KKyNkZWZpbmUgQkNNVFJfTkxfRkFNSUxZICAgICAgICAgMjgKKworYmNtb3NfZXJybm8gYmNtdHJfbmxfcGx1Z2luX2luaXQoYmNtdHJfcGx1Z2luX2NmZyAqY2ZnLCBiY210cl9kcml2ZXIgKmRyaXZlcik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvcGx1Z2luL3Jhd19ubC9iY21vbHRfdHJfcGx1Z2luX25sX3NvY2tldC5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvcGx1Z2luL3Jhd19ubC9iY21vbHRfdHJfcGx1Z2luX25sX3NvY2tldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNDUyMzQKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3RyYW5zcG9ydC9wbHVnaW4vcmF3X25sL2JjbW9sdF90cl9wbHVnaW5fbmxfc29ja2V0LmMKQEAgLTAsMCArMSwzMzkgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8cG9sbC5oPgorCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtdHJfcGx1Z2luLmg+CisjaW5jbHVkZSA8YmNtX2NvbmZpZy5oPgorI2luY2x1ZGUgPGJjbW9sdF90cl9ubC5oPgorCisjZGVmaW5lIEJDTU5MX1RYUFJFRklYX0xFTiAgICAgIChOTE1TR19IRFJMRU4gKyBzaXplb2YodWludDMyX3QpKQorCisKKy8qIEJ1ZmZlciBsaXN0IGhlYWRlciAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtdHJfbmxfYnVmIGJjbXRyX25sX2J1ZjsKK3N0cnVjdCBiY210cl9ubF9idWYKK3sKKyAgICBTVEFJTFFfRU5UUlkoYmNtdHJfbmxfYnVmKSBsaXN0OworICAgIHVpbnQzMl90IGxlbjsgLyoqPCBUb3RhbCBMZW5ndGggb2YgYnVmZmVyICovCit9OworCisvKiBQbHVnaW4gY2hhbm5lbCBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IGJjbXRyX25sX2NoYW5uZWwKK3sKKyAgICBpbnQgZGV2aWNlOyAgICAgICAgIC8qIERldmljZSAqLworICAgIFNUQUlMUV9IRUFEKG5sX2J1Zl9saXN0LCBiY210cl9ubF9idWYpIGJ1Zl9saXN0OworICAgIGJjbW9zX3NlbSBzZW07ICAgICAgLyogU2VtYXBob3JlIHRoYXQgaW5kaWNhdGVzIHRoYXQgbmV3IGJ1ZmZlciBpcyBhdmFpbGFibGUgKi8KKyAgICBiY21vc19tdXRleCBsb2NrOyAgIC8qIGxvY2sgdGhhdCBwcm90ZWN0cyB0aGlzIHN0cnVjdHVyZSAqLworfSBiY210cl9ubF9jaGFubmVsOworCisvKiBBIHNpbmdsZSBOTCBzb2NrZXQgaXMgc2hhcmVkIGJ5IG11bHRpcGxlIGRldmljZXMuCisgKiBUaGUgZm9sbG93aW5nIGNvbnRyb2wgYmxvY2sgaXMgdXNlZCBmb3Igc29ja2V0IG11bHRpcGxleGluZworICovCitzdGF0aWMgc3RydWN0Cit7CisgICAgaW50IHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOZXRsaW5rIHNvY2tldCAqLworICAgIGludCB1c2VyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHVzZXJzICovCisgICAgYmNtb3NfbXV0ZXggbG9jazsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsb2NrIHRoYXQgcHJvdGVjdHMgdGhpcyBzdHJ1Y3R1cmUgKi8KKyAgICBiY21vc190YXNrIG5sX3J4X3Rhc2s7ICAgICAgICAgICAgICAgICAgICAgIC8qIFRhc2sgdGhhdCByZWFkcyBmcm9tIHRoZSBzaGFyZWQgTkwgc29ja2V0ICovCisgICAgYmNtdHJfbmxfY2hhbm5lbCAqbmxjaFtCQ01UUl9NQVhfT0xUU107ICAgICAvKiBDaGFubmVscyAqLworfSBiY210cl9ubF9jb21tb247CisKKy8qIE5MIHNvY2tldCBSWCB0YXNrIGhhbmRsZXIgKi8KK3N0YXRpYyBpbnQgYmNtdHJfbmxfcnhfdGFza19oYW5kbGVyKGxvbmcgZGF0YSk7CisKKy8qKiBPcGVuIGZpcnN0IGNvbW11bmljYXRpb24gY2hhbm5lbCAqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbXRyX25sX29wZW5fZmlyc3Qodm9pZCkKK3sKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfbmwgc2EgPSB7fTsKKyAgICBiY21vc190YXNrX3Bhcm0gdHAgPSB7CisgICAgICAgIC5uYW1lID0gIm5sX3R4IiwKKyAgICAgICAgLmhhbmRsZXIgPSBiY210cl9ubF9yeF90YXNrX2hhbmRsZXIsCisgICAgICAgIC5wcmlvcml0eSA9IFRBU0tfUFJJT1JJVFlfVFJBTlNQT1JUX1JYCisgICAgfTsKKyAgICBpbnQgczsKKyAgICBiY21vc19lcnJubyBlcnI7CisKKyAgICBzID0gc29ja2V0KEFGX05FVExJTkssIFNPQ0tfUkFXLCBCQ01UUl9OTF9GQU1JTFkpOworICAgIGlmIChzIDwgMCkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX0NPTU1fRkFJTCwgIkNhbid0IGNyZWF0ZSBOTCBzb2NrZXRcbiIpOworICAgIH0KKworICAgIC8qIENvbm5lY3QgdG8gcmVtb3RlICovCisgICAgc2EubmxfcGlkID0gMDsKKyAgICBpZiAoY29ubmVjdChzLCAoc3RydWN0IHNvY2thZGRyKikmc2EsIHNpemVvZihzYSkpID09IC0xKQorICAgIHsKKyAgICAgICAgY2xvc2Uocyk7CisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX0NPTU1fRkFJTCwgIkNhbid0IGNvbm5lY3QgTkwgc29ja2V0LiBlcnJvciAlZCAoJXMpXG4iLAorICAgICAgICAgICAgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CisgICAgfQorCisgICAgLyogQmluZCBsb2NhbCAqLworICAgIHNhLm5sX2ZhbWlseSA9IEFGX05FVExJTks7CisgICAgc2EubmxfcGlkID0gZ2V0cGlkKCk7CisgICAgaWYgKGJpbmQocywgKHN0cnVjdCBzb2NrYWRkciopJnNhLCBzaXplb2Yoc2EpICkgPT0gLTEpCisgICAgeworICAgICAgICBjbG9zZShzKTsKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfQ09NTV9GQUlMLCAiQ2FuJ3QgYmluZCBOTCBzb2NrZXQuIGVycm9yICVkICglcylcbiIsCisgICAgICAgICAgICBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKKyAgICB9CisKKyAgICBiY210cl9ubF9jb21tb24ucyA9IHM7CisKKyAgICAvKiBDcmVhdGUgUlggdGhyZWFkICovCisgICAgZXJyID0gYmNtb3NfdGFza19jcmVhdGUoJmJjbXRyX25sX2NvbW1vbi5ubF9yeF90YXNrLCAmdHApOworICAgIGlmIChlcnIpCisgICAgeworICAgICAgICBjbG9zZShzKTsKKyAgICAgICAgYmNtdHJfbmxfY29tbW9uLnMgPSAwOworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9DT01NX0ZBSUwsICJDYW4ndCBjcmVhdGUgTkwgUlggdGhyZWFkLiBlcnJvciAlZCAoJXMpXG4iLAorICAgICAgICAgICAgZXJyLCBiY21vc19zdHJlcnJvcihlcnIpKTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqIENsb3NlIGxhc3QgY29tbXVuaWNhdGlvbiBjaGFubmVsICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtdHJfbmxfY2xvc2VfbGFzdCh2b2lkKQoreworICAgIGNsb3NlKGJjbXRyX25sX2NvbW1vbi5zKTsKKyAgICByZXR1cm4gYmNtb3NfdGFza19kZXN0cm95KCZiY210cl9ubF9jb21tb24ubmxfcnhfdGFzayk7Cit9CisKKy8qKiBPcGVuIGNvbW11bmljYXRpb24gY2hhbm5lbCAqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbXRyX25sX29wZW4oaW50IGRldmljZSwgYmNtdHJfcGx1Z2luX2NmZyAqY2ZnLCBiY210cl9wbHVnaW5fY2hhbm5lbCAqY2gpCit7CisgICAgYmNtdHJfbmxfY2hhbm5lbCAqbmxjaDsKKyAgICBiY21vc19lcnJubyBlcnIgPSBCQ01fRVJSX09LOworCisgICAgaWYgKCh1bnNpZ25lZClkZXZpY2UgPj0gQkNNVFJfTUFYX09MVFMpCisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX1BBUk0sICJEZXZpY2UgJWQgaXMgaW52YWxpZFxuIik7CisKKyAgICBpZiAoYmNtdHJfbmxfY29tbW9uLm5sY2hbZGV2aWNlXSkKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfQUxSRUFEWSwgIkNoYW5uZWwgZm9yIGRldmljZSAlZCBpcyBhbHJlYWR5IG9wZW5lZFxuIik7CisKKyAgICBubGNoID0gYmNtb3NfY2FsbG9jKHNpemVvZigqbmxjaCkpOworICAgIGlmICghbmxjaCkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX05PTUVNLCAiTm8gbWVtb3J5XG4iKTsKKyAgICB9CisgICAgbmxjaC0+ZGV2aWNlID0gZGV2aWNlOworICAgIFNUQUlMUV9JTklUKCZubGNoLT5idWZfbGlzdCk7CisgICAgZXJyID0gYmNtb3NfbXV0ZXhfY3JlYXRlKCZubGNoLT5sb2NrLCAwLCAidHJfbmxjaCIpOworICAgIGVyciA9IGVyciA/IGVyciA6IGJjbW9zX3NlbV9jcmVhdGUoJm5sY2gtPnNlbSwgMCwgMCwgInRyX25sY2giKTsKKworICAgIC8qIFRpZSBpbiB3aXRoIHRoZSBjb250cm9sIGJsb2NrIHNoYXJlZCBieSBhbGwgZGV2aWNlcyAqLworICAgIGJjbW9zX211dGV4X2xvY2soJmJjbXRyX25sX2NvbW1vbi5sb2NrKTsKKyAgICBpZiAoIWJjbXRyX25sX2NvbW1vbi51c2VycykKKyAgICAgICAgZXJyID0gZXJyID8gZXJyIDogYmNtdHJfbmxfb3Blbl9maXJzdCgpOworICAgIGlmIChlcnIpCisgICAgeworICAgICAgICBiY21vc19tdXRleF91bmxvY2soJmJjbXRyX25sX2NvbW1vbi5sb2NrKTsKKyAgICAgICAgYmNtb3NfZnJlZShubGNoKTsKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKGVyciwgIkZhaWxlZCB0byBvcGVuIG9yIGJpbmQgTkwgc29ja2V0XG4iKTsKKyAgICB9CisgICAgKytiY210cl9ubF9jb21tb24udXNlcnM7CisgICAgYmNtdHJfbmxfY29tbW9uLm5sY2hbZGV2aWNlXSA9IG5sY2g7CisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZiY210cl9ubF9jb21tb24ubG9jayk7CisKKyAgICAqY2ggPSAoYmNtdHJfcGx1Z2luX2NoYW5uZWwpbmxjaDsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiogQ2xvc2UgY29tbXVuaWNhdGlvbiBjaGFubmVsICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtdHJfbmxfY2xvc2UoYmNtdHJfcGx1Z2luX2NoYW5uZWwgY2gpCit7CisgICAgYmNtdHJfbmxfY2hhbm5lbCAqbmxjaCA9IChiY210cl9ubF9jaGFubmVsICopY2g7CisgICAgYmNtdHJfbmxfYnVmICpubF9idWYsICpubF9idWZfdG1wOworICAgIGJjbW9sdF9idWYgYnVmOworICAgIGJjbW9zX2Vycm5vIGVyciA9IEJDTV9FUlJfT0s7CisKKyAgICBiY21vc19tdXRleF9sb2NrKCZiY210cl9ubF9jb21tb24ubG9jayk7CisgICAgaWYgKGJjbXRyX25sX2NvbW1vbi5ubGNoW25sY2gtPmRldmljZV0gPT0gbmxjaCkKKyAgICB7CisgICAgICAgIGJjbXRyX25sX2NvbW1vbi5ubGNoW25sY2gtPmRldmljZV0gPSBOVUxMOworICAgICAgICAtLWJjbXRyX25sX2NvbW1vbi51c2VyczsKKyAgICAgICAgaWYgKGJjbXRyX25sX2NvbW1vbi51c2VycykKKyAgICAgICAgICAgIGVyciA9IGJjbXRyX25sX2Nsb3NlX2xhc3QoKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJVbmV4cGVjdGVkIE5MIGNoYW5uZWxcbiIpOworICAgICAgICBlcnIgPSBCQ01fRVJSX0lOVEVSTkFMOworICAgIH0KKyAgICBiY21vc19tdXRleF91bmxvY2soJmJjbXRyX25sX2NvbW1vbi5sb2NrKTsKKyAgICBiY21vc19tdXRleF9kZXN0cm95KCZubGNoLT5sb2NrKTsKKyAgICBiY21vc19zZW1fZGVzdHJveSgmbmxjaC0+c2VtKTsKKyAgICBTVEFJTFFfRk9SRUFDSF9TQUZFKG5sX2J1ZiwgJm5sY2gtPmJ1Zl9saXN0LCBsaXN0LCBubF9idWZfdG1wKQorICAgIHsKKyAgICAgICAgU1RBSUxRX1JFTU9WRV9IRUFEKCZubGNoLT5idWZfbGlzdCwgbGlzdCk7CisgICAgICAgIGJjbW9sdF9idWZfaW5pdCgmYnVmLCBubF9idWYtPmxlbiwgKHVpbnQ4X3QgKilubF9idWYsIEJDTVRSX0JVRl9FTkRJQU4pOworICAgICAgICBiY21vbHRfYnVmX2ZyZWUoJmJ1Zik7CisgICAgfQorICAgIGJjbW9zX2ZyZWUobmxjaCk7CisKKyAgICByZXR1cm4gZXJyOworfQorCisvKiogU2VuZCBkYXRhICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtdHJfbmxfc2VuZChiY210cl9wbHVnaW5fY2hhbm5lbCBjaCwgYmNtb2x0X3N1YmNoYW5uZWwgc3ViY2gsIGJjbW9sdF9idWYgKmJ1ZiwKKyAgICBiY210cl9zZW5kX2ZsYWdzIGZsYWdzKQoreworICAgIGJjbXRyX25sX2NoYW5uZWwgKm5sY2ggPSAoYmNtdHJfbmxfY2hhbm5lbCAqKWNoOworICAgIGludCB0b3RhbF9sZW4gPSBiY21vbHRfYnVmX2dldF91c2VkKGJ1Zik7CisgICAgc3RydWN0IG5sbXNnaGRyICpubG1zZ19oZHIgPSAoc3RydWN0IG5sbXNnaGRyICopKGxvbmcpYnVmLT5zdGFydDsKKyAgICBzdHJ1Y3QgaW92ZWMgaW92ID0geyBidWYtPnN0YXJ0LCAuaW92X2xlbj10b3RhbF9sZW4gfTsKKyAgICBzdHJ1Y3QgbXNnaGRyIG1zZyA9IHsgLm1zZ19pb3YgPSAmaW92LCAubXNnX2lvdmxlbiA9IDEgfTsKKyAgICBpbnQgcmM7CisKKyAgICBubG1zZ19oZHItPm5sbXNnX2xlbiA9IHRvdGFsX2xlbjsKKyAgICBubG1zZ19oZHItPm5sbXNnX3BpZCA9IGdldHBpZCgpOworICAgIGJ1Zi0+c3RhcnRbTkxNU0dfSERSTEVOXSA9IG5sY2gtPmRldmljZTsKKworICAgIHJjID0gc2VuZG1zZyhiY210cl9ubF9jb21tb24ucywgJm1zZywgMCk7CisKKyAgICByZXR1cm4gKHJjID09IHRvdGFsX2xlbikgPyBCQ01fRVJSX09LIDogQkNNX0VSUl9DT01NX0ZBSUw7Cit9CisKKy8qIE5MIHNvY2tldCBSWCB0YXNrIGhhbmRsZXIgKi8KK3N0YXRpYyBpbnQgYmNtdHJfbmxfcnhfdGFza19oYW5kbGVyKGxvbmcgZGF0YSkKK3sKKyAgICBiY21vc190YXNrICpteV90YXNrID0gYmNtb3NfdGFza19jdXJyZW50KCk7CisgICAgc3RydWN0IGlvdmVjIGlvdjsKKyAgICBzdHJ1Y3QgbXNnaGRyIG1zZyA9IHsgLm1zZ19pb3YgPSAmaW92LCAubXNnX2lvdmxlbiA9IDEgfTsKKyAgICB1aW50MzJfdCBkZXZpY2U7CisgICAgYmNtb2x0X2J1ZiBidWYgPSB7fTsKKyAgICBiY210cl9ubF9idWYgKm5sX2J1ZjsKKyAgICBiY210cl9ubF9jaGFubmVsICpubGNoOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBpbnQgcmM7CisKKyAgICB3aGlsZSAoIW15X3Rhc2stPmRlc3Ryb3lfcmVxdWVzdCkKKyAgICB7CisgICAgICAgIGVyciA9IGJjbW9sdF9idWZfYWxsb2MoJmJ1ZiwgQkNNVFJfTUFYX01UVV9TSVpFICsgQkNNTkxfVFhQUkVGSVhfTEVOLCBCQ01UUl9CVUZfRU5ESUFOKTsKKyAgICAgICAgaWYgKGVycikKKyAgICAgICAgeworICAgICAgICAgICAgLyogV2UgYXJlIG91dCBvZiBtZW1vcnksIGhvcGVmdWxseSB0ZW1wb3JhcnkuIFdhaXQgYW5kIGNvbnRpbnVlICovCisgICAgICAgICAgICBiY21vc191c2xlZXAoMTAwMCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpb3YuaW92X2Jhc2UgPSBidWYuc3RhcnQ7CisgICAgICAgIGlvdi5pb3ZfbGVuID0gYnVmLmxlbjsKKworICAgICAgICAvKiBXYWl0IGZvciBtZXNzYWdlICovCisgICAgICAgIHJjID0gcmVjdm1zZyhiY210cl9ubF9jb21tb24ucywgJm1zZywgMCk7CisgICAgICAgIGlmIChyYyA8IE5MTVNHX0hEUkxFTikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJGYXRhbCBlcnJvci4gcmVjdm1zZygpIGZhaWxlZCB3aXRoIGVycm9yICVkICglcylcbiIsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBEZXZpY2UgZm9sbG93cyBOTCBoZWFkZXIgKi8KKyAgICAgICAgbWVtY3B5KCZkZXZpY2UsIGJ1Zi5zdGFydCArIE5MTVNHX0hEUkxFTiwgc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgICAgIGlmIChkZXZpY2UgPj0gQkNNVFJfTUFYX09MVFMgfHwgIShubGNoID0gYmNtdHJfbmxfY29tbW9uLm5sY2hbZGV2aWNlXSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiR290IG1lc3NhZ2UgZnJvbSB1bmV4cGVjdGVkIGRldmljZSAldS4gSWdub3JlZFxuIiwgZGV2aWNlKTsKKyAgICAgICAgICAgIGJjbW9sdF9idWZfZnJlZSgmYnVmKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLyogUHV0IG1lc3NhZ2Ugb24gdGhlIGNoYW5uZWwncyBxdWV1ZSAqLworICAgICAgICBubF9idWYgPSAoYmNtdHJfbmxfYnVmICopKGxvbmcpYnVmLnN0YXJ0OworICAgICAgICBubF9idWYtPmxlbiA9IHJjOworICAgICAgICBiY21vc19tdXRleF9sb2NrKCZubGNoLT5sb2NrKTsKKyAgICAgICAgU1RBSUxRX0lOU0VSVF9UQUlMKCZubGNoLT5idWZfbGlzdCwgbmxfYnVmLCBsaXN0KTsKKyAgICAgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZubGNoLT5sb2NrKTsKKyAgICAgICAgYmNtb3Nfc2VtX3Bvc3QoJm5sY2gtPnNlbSk7CisKKyAgICAgICAgLyogQnVmZmVyIGlzIGluIHVzZSBlbHNld2hlcmUgKi8KKyAgICAgICAgYnVmLnN0YXJ0ID0gYnVmLmN1cnIgPSBOVUxMOworICAgIH0KKworICAgIGJjbW9sdF9idWZfZnJlZSgmYnVmKTsKKyAgICBteV90YXNrLT5kZXN0cm95ZWQgPSBCQ01PU19UUlVFOworICAgIHJldHVybiAwOworfQorCisvKiogUmVjZWl2ZSBkYXRhICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtdHJfbmxfcmVjdihiY210cl9wbHVnaW5fY2hhbm5lbCBjaCwgYmNtb2x0X3N1YmNoYW5uZWwgKnN1YmNoLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgYmNtdHJfbmxfY2hhbm5lbCAqbmxjaCA9IChiY210cl9ubF9jaGFubmVsICopY2g7CisgICAgYmNtdHJfbmxfYnVmICpubF9idWY7CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgZXJyID0gYmNtb3Nfc2VtX3dhaXQoJm5sY2gtPnNlbSwgQkNNVFJfTVNHX1RJTUVPVVQgKiAxMDAwKTsKKyAgICBpZiAoZXJyKQorICAgICAgICByZXR1cm4gZXJyOworICAgIGJjbW9zX211dGV4X2xvY2soJm5sY2gtPmxvY2spOworICAgIG5sX2J1ZiA9IFNUQUlMUV9GSVJTVCgmbmxjaC0+YnVmX2xpc3QpOworICAgIGlmICghbmxfYnVmKQorICAgIHsKKyAgICAgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZubGNoLT5sb2NrKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfQ09NTV9GQUlMOworICAgIH0KKyAgICBTVEFJTFFfUkVNT1ZFX0hFQUQoJm5sY2gtPmJ1Zl9saXN0LCBsaXN0KTsKKyAgICBiY21vc19tdXRleF91bmxvY2soJm5sY2gtPmxvY2spOworCisgICAgLyogR290IGJ1ZmZlciAqLworICAgIGJjbW9sdF9idWZfaW5pdChidWYsIG5sX2J1Zi0+bGVuLCAodWludDhfdCAqKW5sX2J1ZiwgQkNNVFJfQlVGX0VORElBTik7CisgICAgYnVmLT5jdXJyID0gYnVmLT5zdGFydCArIEJDTU5MX1RYUFJFRklYX0xFTjsKKworICAgICpzdWJjaCA9IDA7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqIEluaXRpYWxpemUgcGx1Z2luIGNhbGxiYWNrcworICogXHBhcmFtW2luLG91dF0gICAgICAgZHJpdmVyIFRyYW5zcG9ydCBwbHVnaW4gZHJpdmVyIHN0cnVjdHVyZQorICogXHJldHVybiBlcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX25sX3BsdWdpbl9pbml0KGJjbXRyX3BsdWdpbl9jZmcgKmNmZywgYmNtdHJfZHJpdmVyICpkcml2ZXIpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgYmNtb3NfcHJpbnRmKCJMYXVuY2hpbmcgd2l0aCBhIG5ldGxpbmsgY29ubmVjdGlvblxuIik7CisKKyAgICBkcml2ZXItPm9wZW4gPSBiY210cl9ubF9vcGVuOworICAgIGRyaXZlci0+Y2xvc2UgPSBiY210cl9ubF9jbG9zZTsKKyAgICBkcml2ZXItPnJlY3YgPSBiY210cl9ubF9yZWN2OworICAgIGRyaXZlci0+c2VuZCA9IGJjbXRyX25sX3NlbmQ7CisgICAgY2ZnLT5oZWFkcm9vbSA9IEJDTU5MX1RYUFJFRklYX0xFTjsKKworICAgIGVyciA9IGJjbW9zX211dGV4X2NyZWF0ZSgmYmNtdHJfbmxfY29tbW9uLmxvY2ssIDAsICJ0cl9ubCIpOworCisgICAgcmV0dXJuIGVycjsKK30KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvcGx1Z2luL3Jhd191ZC9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdHJhbnNwb3J0L3BsdWdpbi9yYXdfdWQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDEyNmVmMwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdHJhbnNwb3J0L3BsdWdpbi9yYXdfdWQvTWFrZWZpbGUKQEAgLTAsMCArMSwxNCBAQAorIworIyBVbml4IERvbWFpbiB0cmFuc3BvcnQgcGx1Z2luCisjCitpZmVxICgiJChPU19LRVJORUwpIiwgImxpbnV4IikKK2lmZXEgKCIkKENPTkZJR19UUkFOU1BPUlRfUkFXKSIsICJ5IikKKworTU9EX05BTUUgPSB0cl9wbHVnaW5fcmF3X3VkCitNT0RfVFlQRSA9IGxpYgorTU9EX0RFUFMgPSB0cl9wbHVnaW4KKworc3JjcyA9IGJjbW9sdF90cl9wbHVnaW5fdWRfc29ja2V0LmMKKworZW5kaWYKK2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3RyYW5zcG9ydC9wbHVnaW4vcmF3X3VkL2JjbW9sdF90cl9wbHVnaW5fdWRfc29ja2V0LmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3RyYW5zcG9ydC9wbHVnaW4vcmF3X3VkL2JjbW9sdF90cl9wbHVnaW5fdWRfc29ja2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTRkOTAwMwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdHJhbnNwb3J0L3BsdWdpbi9yYXdfdWQvYmNtb2x0X3RyX3BsdWdpbl91ZF9zb2NrZXQuYwpAQCAtMCwwICsxLDE4MiBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy91bi5oPgorCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtdHJfcGx1Z2luLmg+CisjaW5jbHVkZSA8YmNtX2NvbmZpZy5oPgorI2luY2x1ZGUgPGJjbW9sdF90cl91ZC5oPgorCitjaGFyIHNvY2tldF9wYXRoW10gPSBTT0NLRVRfUEFUSDsKKy8qIFBsdWdpbiBjaGFubmVsIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtdHJfdWRfY2hhbm5lbAoreworICAgIGludCBkZXZpY2U7ICAgICAgICAgLyogRGV2aWNlICovCisgICAgaW50IHNvY2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVRCBzb2NrZXQgKi8KK30gYmNtdHJfdWRfY2hhbm5lbDsKKworCisvKiBUaGlzIHBsdWdpbiBzdG9yZXMgYm90aCBkZXZpY2UgaWQgYW5kIHBlci1kZXZpY2Ugc29ja2V0IGhhbmRsZSBpbgorICogdHJhbnNwb3J0J3MgY2hhbm5lbF9pZCBoYW5kbGUgYXMKKyAqIChkZXZpY2VfaWQgPDwgMjQpIHwgc29ja2V0X2hhbmRsZS4KKyAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHJlY292ZXIgc29ja2V0X2hhbmRsZSBhbmQgZGV2aWNlX2lkIGZyb20gdGhlIGNoYW5uZWxfaWQgaGFuZGxlCisgKi8KKworCisvKiogT3BlbiBjb21tdW5pY2F0aW9uIGNoYW5uZWwgKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY210cl91ZF9vcGVuKGludCBkZXZpY2UsIGJjbXRyX3BsdWdpbl9jZmcgKmNmZywgYmNtdHJfcGx1Z2luX2NoYW5uZWwgKmNoKQoreworICAgIHN0cnVjdCBzb2NrYWRkcl91biBhZGRyOworICAgIGJjbXRyX3VkX2NoYW5uZWwgKnVkY2g7CisKKyAgICB1ZGNoID0gYmNtb3NfY2FsbG9jKHNpemVvZigqdWRjaCkpOworICAgIGlmICghdWRjaCkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX05PTUVNLCAiTm8gbWVtb3J5XG4iKTsKKyAgICB9CisKKyAgICBpZiAoICh1ZGNoLT5zb2NrID0gc29ja2V0KEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKSkgPT0gLTEpIHsKKyAgICAgICAgICAgIHBlcnJvcigic29ja2V0IGVycm9yIik7CisgICAgICAgICAgICBleGl0KC0xKTsKKyAgICAgICAgfQorCisgICAgICAgIG1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKKyAgICAgICAgYWRkci5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKKyAgICAgICAgQlVHX09OKHNpemVvZihzb2NrZXRfcGF0aCk+PXNpemVvZihhZGRyLnN1bl9wYXRoKSk7CisgICAgICAgIG1lbWNweShhZGRyLnN1bl9wYXRoLCBzb2NrZXRfcGF0aCwgc2l6ZW9mKHNvY2tldF9wYXRoKSk7CisKKyAgICAgICAgaWYgKGNvbm5lY3QodWRjaC0+c29jaywgKHN0cnVjdCBzb2NrYWRkciopJmFkZHIsIHNpemVvZihhZGRyKSkgPT0gLTEpIHsKKyAgICAgICAgICAgIHBlcnJvcigiY29ubmVjdCBlcnJvciIpOworICAgICAgICAgICAgZXhpdCgtMSk7CisgICAgICAgIH0KKworICAgIGJjbW9zX3ByaW50ZigiT3BlbmVkICVkXG4iLCB1ZGNoLT5zb2NrKTsKKworICAgIHVkY2gtPmRldmljZSA9IGRldmljZTsKKworICAgICpjaCA9IChiY210cl9wbHVnaW5fY2hhbm5lbCl1ZGNoOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qKiBDbG9zZSBjb21tdW5pY2F0aW9uIGNoYW5uZWwgKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY210cl91ZF9jbG9zZShiY210cl9wbHVnaW5fY2hhbm5lbCBjaCkKK3sKKyAgICBiY210cl91ZF9jaGFubmVsICp1ZGNoID0gKGJjbXRyX3VkX2NoYW5uZWwgKiljaDsKKworICAgIGJjbW9zX3ByaW50ZigiQ2xvc2VkICVkXG4iLCB1ZGNoLT5zb2NrKTsKKyAgICAgICAgY2xvc2UodWRjaC0+c29jayk7CisgICAgYmNtb3NfZnJlZSh1ZGNoKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiogU2VuZCBkYXRhICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtdHJfdWRfc2VuZChiY210cl9wbHVnaW5fY2hhbm5lbCBjaCwgYmNtb2x0X3N1YmNoYW5uZWwgc3ViY2gsIGJjbW9sdF9idWYgKmJ1ZiwKKyAgICBiY210cl9zZW5kX2ZsYWdzIGZsYWdzKQoreworICAgIGJjbXRyX3VkX2NoYW5uZWwgKnVkY2ggPSAoYmNtdHJfdWRfY2hhbm5lbCAqKWNoOworICAgIGludCBidWZsZW4gPSBiY21vbHRfYnVmX2dldF91c2VkKGJ1Zik7CisgICAgaW50IGxlbjsKKyAgICBsZW4gPSBzZW5kKHVkY2gtPnNvY2ssIGJ1Zi0+c3RhcnQsIGJ1ZmxlbiwgMCk7CisgCisgICAgaWYgKGxlbiA8IGJ1ZmxlbikKKyAgICB7CisgICAgICAgIGJjbW9zX3ByaW50ZigiJXM6IHNvY2tfc2VuZG1zZygldSkgLS0+ICVkLiBlcnJubz0lZFxuIiwgX19GVU5DVElPTl9fLCBidWZsZW4sIGxlbiwgZXJybm8pOworICAgICAgICByZXR1cm4gQkNNX0VSUl9DT01NX0ZBSUw7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qKiBSZWNlaXZlIGRhdGEgKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY210cl91ZF9yZWN2KGJjbXRyX3BsdWdpbl9jaGFubmVsIGNoLCBiY21vbHRfc3ViY2hhbm5lbCAqc3ViY2gsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBiY210cl91ZF9jaGFubmVsICp1ZGNoID0gKGJjbXRyX3VkX2NoYW5uZWwgKiljaDsKKyAgICBpbnQgbGVuOworICAgIGZkX3NldCByZWFkX2ZkczsKKyAgICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgaW50IHJjOworCisgICAgRkRfWkVSTygmcmVhZF9mZHMpOworICAgIEZEX1NFVCh1ZGNoLT5zb2NrLCAmcmVhZF9mZHMpOworICAgIHR2LnR2X3NlYyA9IDA7CisgICAgdHYudHZfdXNlYyA9IEJDTVRSX01TR19USU1FT1VUICogMTAwMDsKKworICAgIHJjID0gc2VsZWN0KHVkY2gtPnNvY2sgKyAxLCAmcmVhZF9mZHMsIE5VTEwsIE5VTEwsICZ0dik7CisgICAgaWYgKHJjIDwgMCkKKyAgICB7CisgICAgICAgIHBlcnJvcigic2VsZWN0Iik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX0NPTU1fRkFJTDsKKyAgICB9CisgICAgaWYgKCFyYyB8fCAhRkRfSVNTRVQodWRjaC0+c29jaywgJnJlYWRfZmRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1RJTUVPVVQ7CisgICAgfQorCisgICAgZXJyID0gYmNtb2x0X2J1Zl9hbGxvYyhidWYsIEJDTVRSX01BWF9NVFVfU0laRSwgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpOworICAgIGlmIChlcnIpCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworCisgICAgbGVuID0gcmVjdih1ZGNoLT5zb2NrLCBidWYtPnN0YXJ0LCBCQ01UUl9NQVhfTVRVX1NJWkUsIDApOworICAgIGlmIChsZW4gPD0gMCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9idWZfZnJlZShidWYpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9DT01NX0ZBSUw7CisgICAgfQorCisgICAgYmNtb3NfcHJpbnRmKCJSZWNlaXZlZCAlZCBieXRlcyBmcm9tIGRldl9jb250cm9sXG4iLCBsZW4pOworCisgICAgYnVmLT5sZW4gPSBsZW47CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qKiBJbml0aWFsaXplIHBsdWdpbiBjYWxsYmFja3MKKyAqIFxwYXJhbVtpbixvdXRdICAgICAgIGRyaXZlciBUcmFuc3BvcnQgcGx1Z2luIGRyaXZlciBzdHJ1Y3R1cmUKKyAqIFxyZXR1cm4gZXJyb3IgY29kZQorICovCitiY21vc19lcnJubyBiY210cl91ZF9wbHVnaW5faW5pdChiY210cl9wbHVnaW5fY2ZnICpjZmcsIGJjbXRyX2RyaXZlciAqZHJpdmVyKQoreworICAgIGJjbW9zX2Vycm5vIGVyciA9IEJDTV9FUlJfT0s7CisKKyAgICBiY21vc19wcmludGYoIkxhdW5jaGluZyB3aXRoIGEgdW5peCBkb21haW4gY29ubmVjdGlvblxuIik7CisKKyAgICBkcml2ZXItPm9wZW4gPSBiY210cl91ZF9vcGVuOworICAgIGRyaXZlci0+Y2xvc2UgPSBiY210cl91ZF9jbG9zZTsKKyAgICBkcml2ZXItPnJlY3YgPSBiY210cl91ZF9yZWN2OworICAgIGRyaXZlci0+c2VuZCA9IGJjbXRyX3VkX3NlbmQ7CisgICAgY2ZnLT5oZWFkcm9vbSA9IEJDTVVEX1RYUFJFRklYX0xFTjsKKworICAgIHJldHVybiBlcnI7Cit9CisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdHJhbnNwb3J0L3BsdWdpbi9yYXdfdWQvYmNtb2x0X3RyX3VkLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3RyYW5zcG9ydC9wbHVnaW4vcmF3X3VkL2JjbW9sdF90cl91ZC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJjYTMyZDQKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3RyYW5zcG9ydC9wbHVnaW4vcmF3X3VkL2JjbW9sdF90cl91ZC5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgQkNNT0xUX1RSX1VEX0hfCisjZGVmaW5lIEJDTU9MVF9UUl9VRF9IXworCisjaW5jbHVkZSAiYmNtdHJfaW50ZXJuYWwuaCIKKworI2RlZmluZSBCQ01VRF9UWFBSRUZJWF9MRU4gKHNpemVvZih1aW50MzJfdCkpCisKKyNkZWZpbmUgU09DS0VUX1BBVEggIlwwYmNtNjg2MjAiCisKK2JjbW9zX2Vycm5vIGJjbXRyX3VkX3BsdWdpbl9pbml0KGJjbXRyX3BsdWdpbl9jZmcgKmNmZywgYmNtdHJfZHJpdmVyICpkcml2ZXIpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdHJhbnNwb3J0L3BsdWdpbi91ZHAvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3RyYW5zcG9ydC9wbHVnaW4vdWRwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMDZlZGMKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3RyYW5zcG9ydC9wbHVnaW4vdWRwL01ha2VmaWxlCkBAIC0wLDAgKzEsMTcgQEAKKyMgVHJhbnNwb3J0OiBVRFAgUGx1Z2luCisjCisKK0NPTkZJR19UUkFOU1BPUlRfUkFXID89IG4KK0NPTkZJR19UUkFOU1BPUlRfVURQID89IHkKK2lmZXEgKCIkKENPTkZJR19UUkFOU1BPUlRfUkFXKSIsICJ5IikKKwlDT05GSUdfVFJBTlNQT1JUX1VEUCA9IG4KK2VuZGlmCisKK2lmZXEgKCIkKENPTkZJR19UUkFOU1BPUlRfVURQKSIsICJ5IikKK01PRF9OQU1FID0gdHJfcGx1Z2luX3VkcAorTU9EX1RZUEUgPSBsaWIKK01PRF9ERVBTID0gdHJfcGx1Z2luCitNT0RfREVGUyA9IC1EQkNNVFJfVURQX1NVUFBPUlQKKworc3JjcyA9IGJjbXRyX3BsdWdpbl91ZHBfc29ja2V0LmMKK2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3RyYW5zcG9ydC9wbHVnaW4vdWRwL2JjbXRyX3BsdWdpbl91ZHBfc29ja2V0LmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3RyYW5zcG9ydC9wbHVnaW4vdWRwL2JjbXRyX3BsdWdpbl91ZHBfc29ja2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFiNDQ0NAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdHJhbnNwb3J0L3BsdWdpbi91ZHAvYmNtdHJfcGx1Z2luX3VkcF9zb2NrZXQuYwpAQCAtMCwwICsxLDIyMCBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2luY2x1ZGUgPGJjbXRyX3BsdWdpbi5oPgorI2luY2x1ZGUgPGJjbV9jb25maWcuaD4KKworLyogTGFzdCBzZWVuIGhvc3QgSVAgYW5kIHBvcnQgKi8KK3N0YXRpYyBzdHJ1Y3Qgc29ja2FkZHJfaW4gcGVlcl9zYVtCQ01UUl9NQVhfT0xUU107CisKKy8qIFRoaXMgcGx1Z2luIHN0b3JlcyBib3RoIGRldmljZSBpZCBhbmQgcGVyLWRldmljZSBzb2NrZXQgaGFuZGxlIGluCisgKiB0cmFuc3BvcnQncyBjaGFubmVsX2lkIGhhbmRsZSBhcworICogKGRldmljZV9pZCA8PCAyNCkgfCBzb2NrZXRfaGFuZGxlLgorICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgcmVjb3ZlciBzb2NrZXRfaGFuZGxlIGFuZCBkZXZpY2VfaWQgZnJvbSB0aGUgY2hhbm5lbF9pZCBoYW5kbGUKKyAqLworCitzdGF0aWMgaW5saW5lIGludCBfYmNtdHJfY2hhbm5lbF90b19zb2NrZXQoYmNtdHJfcGx1Z2luX2NoYW5uZWwgY2gpCit7CisgICAgcmV0dXJuIChpbnQpKGNoICYgMHhmZmZmZmYpOworfQorCitzdGF0aWMgaW5saW5lIGludCBfYmNtdHJfY2hhbm5lbF90b19kZXZpY2UoYmNtdHJfcGx1Z2luX2NoYW5uZWwgY2gpCit7CisgICAgcmV0dXJuIChpbnQpKChjaCA+PiAyNCkgJiAweGZmKTsKK30KKworLyoqIE9wZW4gY29tbXVuaWNhdGlvbiBjaGFubmVsICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtdHJfdWRwX29wZW4oaW50IGRldmljZSwgYmNtdHJfcGx1Z2luX2NmZyAqY2ZnLCBiY210cl9wbHVnaW5fY2hhbm5lbCAqY2gpCit7CisgICAgc3RydWN0IHNvY2thZGRyX2luIHNhID0ge307CisgICAgc3RydWN0IHRpbWV2YWwgdGltZW91dCA9IHsgLnR2X3NlYyA9IDAsIC50dl91c2VjID0gQkNNVFJfTVNHX1RJTUVPVVQgKiAxMDAwIH07ICAKKyAgICBpbnQgczsKKworICAgIHMgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisgICAgaWYgKHMgPCAwKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfQ09NTV9GQUlMLCAiQ2FuJ3QgY3JlYXRlIFVEUCBzb2NrZXRcbiIpOworICAgIH0KKworICAgIC8qIEJpbmQgbG9jYWwgKi8KKyAgICBzYS5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICBzYS5zaW5fcG9ydCA9IGh0b25zKGNmZy0+eC51ZHAubXlfcG9ydCk7CisgICAgc2Euc2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsKKyAgICBpZiAoYmluZChzLCAoc3RydWN0IHNvY2thZGRyKikmc2EsIHNpemVvZihzYSkgKSA9PSAtMSkKKyAgICB7CisgICAgICAgIGNsb3NlKHMpOworICAgICAgICBwZXJyb3IoImJpbmQiKTsKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfQ09NTV9GQUlMLCAiQ2FuJ3QgYmluZCBVRFAgc29ja2V0IHRvICVkLiVkLiVkLiVkOiVkXG4iLAorICAgICAgICAgICAgKGludCkoY2ZnLT54LnVkcC5teV9pcCA+PiAyNCksIChpbnQpKChjZmctPngudWRwLm15X2lwID4+IDE2KSAmIDB4ZmYpLAorICAgICAgICAgICAgKGludCkoKGNmZy0+eC51ZHAubXlfaXAgPj4gOCkgJiAweGZmKSwgKGludCkoY2ZnLT54LnVkcC5teV9pcCAmIDB4ZmYpLAorICAgICAgICAgICAgKGludCljZmctPngudWRwLm15X3BvcnQpOworICAgIH0KKyAgICBiY21vc19wcmludGYoIiVzOiBzb2NrZXQgYm91bmQgdG8gcG9ydCAlZFxuIiwgX19GVU5DVElPTl9fLCAoaW50KWNmZy0+eC51ZHAubXlfcG9ydCk7CisKKyAgICBpZiAoc2V0c29ja29wdChzLCBTT0xfU09DS0VULCBTT19TTkRUSU1FTywgKGNoYXIgKikmdGltZW91dCwgc2l6ZW9mKHRpbWVvdXQpKSA8IDApCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9DT01NX0ZBSUwsICJDYW4ndCBzZXQgc29ja2V0IG9wdGlvbiBmb3Igc2VuZCB0aW1lb3V0XG4iKTsKKyAgICB9CisKKyAgICAvKiBDb25uZWN0IHRvIHJlbW90ZSAqLworICAgIGlmIChjZmctPngudWRwLnJlbW90ZV9wb3J0KQorICAgIHsKKyAgICAgICAgcGVlcl9zYVtkZXZpY2VdLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgICAgICBwZWVyX3NhW2RldmljZV0uc2luX3BvcnQgPSBodG9ucyhjZmctPngudWRwLnJlbW90ZV9wb3J0KTsKKyAgICAgICAgcGVlcl9zYVtkZXZpY2VdLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKGNmZy0+eC51ZHAucmVtb3RlX2lwKTsKKyAgICB9CisgICAgKmNoID0gKGRldmljZSA8PCAyNCkgfCBzOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIHByaW50IGVycm9yIG1lc3NhZ2Ugd2l0aCB0aHJvdHRsaW5nOiBub3Qgb2Z0ZW5lciB0aGFuIG9uZXMgcGVyIHNlY29uZCAqLworc3RhdGljIHZvaWQgX2JjbXRyX3VkcF9wcmludF9lcnIoYmNtb3NfZXJybm8gZXJyLCBjb25zdCBjaGFyICplcnJfbXNnKQoreworICAgIHN0YXRpYyBpbnQgbmVycm9yczsKKyAgICBzdGF0aWMgdWludDMyX3QgbGFzdF90aW1lc3RhbXA7CisKKyAgICArK25lcnJvcnM7CisKKyAgICBpZiAoIWxhc3RfdGltZXN0YW1wIHx8IGJjbW9zX3RpbWVzdGFtcCgpIC0gbGFzdF90aW1lc3RhbXAgPiAxMDAwMDAwKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJFcnJvciBpbiBsb3ctbGV2ZWwgVURQIHRyYW5zcG9ydC4gJXMtJXMuIEVycm9ycyBzaW5jZSBsYXN0IHJlcG9ydDogJWRcbiIsCisgICAgICAgICAgICBlcnJfbXNnLCBiY21vc19zdHJlcnJvcihlcnIpLCBuZXJyb3JzKTsKKyAgICAgICAgbGFzdF90aW1lc3RhbXAgPSBiY21vc190aW1lc3RhbXAoKTsKKyAgICAgICAgbmVycm9ycyA9IDA7CisgICAgfQorfQorCisvKiogQ2xvc2UgY29tbXVuaWNhdGlvbiBjaGFubmVsICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtdHJfdWRwX2Nsb3NlKGJjbXRyX3BsdWdpbl9jaGFubmVsIGNoKQoreworICAgIGNsb3NlKF9iY210cl9jaGFubmVsX3RvX3NvY2tldChjaCkpOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiogU2VuZCBkYXRhICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtdHJfdWRwX3NlbmQoYmNtdHJfcGx1Z2luX2NoYW5uZWwgY2gsIGJjbW9sdF9zdWJjaGFubmVsIHN1YmNoLCBiY21vbHRfYnVmICpidWYsCisgICAgYmNtdHJfc2VuZF9mbGFncyBmbGFncykKK3sKKyAgICBpbnQgc29jayA9IF9iY210cl9jaGFubmVsX3RvX3NvY2tldChjaCk7CisgICAgaW50IGRldmljZSA9IF9iY210cl9jaGFubmVsX3RvX2RldmljZShjaCk7CisgICAgaW50IGJ1ZmxlbiA9IGJjbW9sdF9idWZfZ2V0X3VzZWQoYnVmKTsKKyAgICBzdHJ1Y3QgaW92ZWMgaW92ID0geyAuaW92X2Jhc2UgPSBidWYtPnN0YXJ0LCAuaW92X2xlbiA9IGJ1ZmxlbiB9OworICAgIHN0cnVjdCBtc2doZHIgbXNnID0geworICAgICAgICAubXNnX2lvdiA9ICZpb3YsIC5tc2dfaW92bGVuID0gMSwgLm1zZ19mbGFncyA9IDAsCisgICAgICAgIC5tc2dfbmFtZSA9ICh2b2lkICopJnBlZXJfc2FbZGV2aWNlXSwgLm1zZ19uYW1lbGVuID0gc2l6ZW9mKHBlZXJfc2FbMF0pCisgICAgfTsKKyAgICBpbnQgbGVuOworCisgICAgbGVuID0gc2VuZG1zZyhzb2NrLCAmbXNnLCAwKTsKKyAgICBpZiAobGVuIDwgYnVmbGVuKQorICAgIHsKKyAgICAgICAgYmNtb3NfcHJpbnRmKCIlczogc29ja19zZW5kbXNnKCV1KSAtLT4gJWQuIGVycm5vPSVkXG4iLCBfX0ZVTkNUSU9OX18sIGJ1ZmxlbiwgbGVuLCBlcnJubyk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX0NPTU1fRkFJTDsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqIFJlY2VpdmUgZGF0YSAqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbXRyX3VkcF9yZWN2KGJjbXRyX3BsdWdpbl9jaGFubmVsIGNoLCBiY21vbHRfc3ViY2hhbm5lbCAqc3ViY2gsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpbnQgc29jayA9IF9iY210cl9jaGFubmVsX3RvX3NvY2tldChjaCk7CisgICAgaW50IGRldmljZSA9IF9iY210cl9jaGFubmVsX3RvX2RldmljZShjaCk7CisgICAgc3RydWN0IGlvdmVjIGlvdjsKKyAgICBzdHJ1Y3QgbXNnaGRyIG1zZyA9IHsKKyAgICAgICAgLm1zZ19pb3YgPSAmaW92LCAubXNnX2lvdmxlbiA9IDEsCisgICAgICAgIC5tc2dfbmFtZSA9ICh2b2lkICopJnBlZXJfc2FbZGV2aWNlXSwgLm1zZ19uYW1lbGVuID0gc2l6ZW9mKHBlZXJfc2FbMF0pCisgICAgfTsKKyAgICBpbnQgbGVuOworICAgIGZkX3NldCByZWFkX2ZkczsKKyAgICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgaW50IHJjOworCisgICAgRkRfWkVSTygmcmVhZF9mZHMpOworICAgIEZEX1NFVChzb2NrLCAmcmVhZF9mZHMpOworICAgIHR2LnR2X3NlYyA9IDA7CisgICAgdHYudHZfdXNlYyA9IEJDTVRSX01TR19USU1FT1VUICogMTAwMDsKKworICAgIHJjID0gc2VsZWN0KHNvY2sgKyAxLCAmcmVhZF9mZHMsIE5VTEwsIE5VTEwsICZ0dik7CisgICAgaWYgKHJjIDwgMCkKKyAgICB7CisgICAgICAgIHBlcnJvcigic2VsZWN0Iik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX0NPTU1fRkFJTDsKKyAgICB9CisgICAgaWYgKCFyYyB8fCAhRkRfSVNTRVQoc29jaywgJnJlYWRfZmRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1RJTUVPVVQ7CisgICAgfQorCisgICAgZXJyID0gYmNtb2x0X2J1Zl9hbGxvYyhidWYsIEJDTVRSX01BWF9NVFVfU0laRSwgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpOworICAgIGlmIChlcnIpCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworCisgICAgaW92Lmlvdl9iYXNlID0gYnVmLT5zdGFydDsKKyAgICBpb3YuaW92X2xlbiA9IEJDTVRSX01BWF9NVFVfU0laRTsKKyAgICBsZW4gPSByZWN2bXNnKHNvY2ssICZtc2csIDApOworICAgIGlmIChsZW4gPD0gMCkKKyAgICB7CisgICAgICAgIF9iY210cl91ZHBfcHJpbnRfZXJyKEJDTV9FUlJfQ09NTV9GQUlMLCAicmVjdm1zZygpIGZhaWxlZFxuIik7CisgICAgICAgIGJjbW9sdF9idWZfZnJlZShidWYpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9DT01NX0ZBSUw7CisgICAgfQorICAgIGJ1Zi0+bGVuID0gbGVuOworICAgICpzdWJjaCA9IG50b2hzKHBlZXJfc2FbZGV2aWNlXS5zaW5fcG9ydCk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqIEluaXRpYWxpemUgcGx1Z2luIGNhbGxiYWNrcworICogXHBhcmFtW2luLG91dF0gICAgICAgZHJpdmVyIFRyYW5zcG9ydCBwbHVnaW4gZHJpdmVyIHN0cnVjdHVyZQorICogXHJldHVybiBlcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX3BsdWdpbl9pbml0KGJjbXRyX3BsdWdpbl9jZmcgKmNmZywgYmNtdHJfZHJpdmVyICpkcml2ZXIpCit7CisgICAgaWYgKGNmZy0+dHlwZSAhPSBCQ01UUl9UWVBFX1VEUCkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX1BBUk0sICJJbnZhbGlkIHBsdWdpbiB0eXBlLiBFeHBlY3RlZCBVRFBcbiIpOworICAgIH0KKworICAgIGRyaXZlci0+b3BlbiA9IGJjbXRyX3VkcF9vcGVuOworICAgIGRyaXZlci0+Y2xvc2UgPSBiY210cl91ZHBfY2xvc2U7CisgICAgZHJpdmVyLT5yZWN2ID0gYmNtdHJfdWRwX3JlY3Y7CisgICAgZHJpdmVyLT5zZW5kID0gYmNtdHJfdWRwX3NlbmQ7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvdW5peF9zb2NrZXQvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3RyYW5zcG9ydC91bml4X3NvY2tldC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTFlM2NjCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvdW5peF9zb2NrZXQvTWFrZWZpbGUKQEAgLTAsMCArMSwxMCBAQAorIyBVRCB0cmFuc3BvcnQgZHJpdmVyCisjCitpZm5lcSAoIiQoU0lNVUxBVElPTl9CVUlMRCkiLCAieSIpCitNT0RfTkFNRSA9IHVkdHIKK01PRF9UWVBFID0gbGliCitNT0RfREVQUyA9IHRybXV4IHRyX3BsdWdpbl9yYXdfdWQKKworc3JjcyA9IGJjbW9sdF90cl91ZF9kcml2ZXIuYworCitlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvdW5peF9zb2NrZXQvYmNtb2x0X3RyX3VkX2RyaXZlci5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvdW5peF9zb2NrZXQvYmNtb2x0X3RyX3VkX2RyaXZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMwMTQzZGEKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3RyYW5zcG9ydC91bml4X3NvY2tldC9iY21vbHRfdHJfdWRfZHJpdmVyLmMKQEAgLTAsMCArMSwyMzEgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKy8qCisgKiBiY21vbHRfdHJfdWRfZHJpdmVyLmMKKyAqCisgKiBVbml4IERvbWFpbiBzb2NrZXQgYmFzZWQgdHJhbnNwb3J0LgorICoKKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy91bi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8YmNtb2x0X3RyX211eC5oPgorI2luY2x1ZGUgPGJjbW9sdF90cl91ZF9kcml2ZXIuaD4KKyNpbmNsdWRlIDxiY21vbHRfdHJfdWQuaD4KKworI2RlZmluZSBCQ01UUl9NRU1fUEFDS0VUUyAgICAgICAxMDAwMAorI2RlZmluZSBCQ01UUl9NRU1fT1ZFUkhFQUQgICAgICAxMDI0CisjZGVmaW5lIEJDTVRSX01JTl9SQ1ZCVUZfU0laRSAgIChCQ01UUl9NRU1fUEFDS0VUUyAqIEJDTVRSX01FTV9PVkVSSEVBRCkKKworY2hhciBzb2NrZXRfcGF0aFtdID0gU09DS0VUX1BBVEg7CisKK3R5cGVkZWYgc3RydWN0IHVkX2Nvbm5faW5mbyB7CisgICAgYmNtdHJtdXhfY2hhbm5lbCBjaGFubmVsW0JDTVRSX01BWF9PTFRTXTsKKyAgICBpbnQgc29jazsKK30gdWRfY29ubl9pbmZvOworCitzdGF0aWMgYmNtb3NfdGFzayByeF90aHJlYWQ7CitzdGF0aWMgaW50IGZkOworc3RhdGljIHVkX2Nvbm5faW5mbyAqY29ubl9pbmZvW0JDTVRSTVVYX01BWF9DSEFOTkVMU107CitzdGF0aWMgaW50IGlpOworCitzdGF0aWMgdm9pZCBfYmNtdHJfdWRfcmVjdihiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vc19idWYgKmJ1ZiwgYmNtdHJtdXhfY2hhbm5lbCBjaGFubmVsLCB2b2lkICpkYXRhKQoreworICAgIHVpbnQzMl90IGRhdGFfbGVuZ3RoID0gYmNtb3NfYnVmX2xlbmd0aChidWYpOyAKKyAgICBpbnQga2s7CisKKyAgICAvKiBGaW5kIHRoZSBzb2NrZXQgdG8gcmVzcG9uZCBvbi4uLiAqLworICAgIGZvciAoa2s9MDsga2s8c2l6ZW9mKGNvbm5faW5mbykvc2l6ZW9mKGNvbm5faW5mb1swXSk7IGtrKyspCisgICAgeworICAgICAgICBpZiAoY29ubl9pbmZvW2trXS0+Y2hhbm5lbFtkZXZpY2VdID09IGNoYW5uZWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBsZW4gPSAwOworICAgICAgICAgICAgYmNtb3NfcHJpbnRmKCJTZW5kaW5nIHRvIHVzZXIgYXBwbGljYXRpb24gZm9yIGluZGV4ICVkLi4uIiwga2spOworICAgICAgICAgICAgbGVuID0gc2VuZChjb25uX2luZm9ba2tdLT5zb2NrLCBiY21vc19idWZfZGF0YShidWYpLCBkYXRhX2xlbmd0aCwgMCk7CisgICAgICAgICAgICBpZiAobGVuIDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vc19wcmludGYoIkZhaWxlZCB0byBzZW5kIHJlc3Bvc2UgdG8gdXNlciBhcHBsaWNhdGlvbiAtIHdoYXQgbm93P1xuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBiY21vc19wcmludGYoIlNlbnQgJWQgYnl0ZXNcbiIsIGxlbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGludCBiY210cl91ZF9yeF9oYW5kbGVyKGxvbmcgYXJnKQoreworICAgIGludCByYywgamo7CisgICAgYmNtb3NfYnVmICpidWY7CisgICAgc3RydWN0IHRpbWV2YWwgdHY7CisgICAgZmRfc2V0IHJlYWRfc2V0OworCisgICAgd2hpbGUgKDEpCisgICAgeworICAgICAgICBpbnQgY291bnQ7CisgICAgICAgIEZEX1pFUk8oJnJlYWRfc2V0KTsKKyAgICAgICAgZm9yIChqaj0wOyBqajxzaXplb2YoY29ubl9pbmZvKS9zaXplb2YoY29ubl9pbmZvWzBdKTsgamorKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNvbm5faW5mb1tqal0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRkRfU0VUKGNvbm5faW5mb1tqal0tPnNvY2ssICZyZWFkX3NldCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB0di50dl9zZWMgPSAwOyB0di50dl91c2VjID0gMTAwMDAwOworCisgICAgICAgIGNvdW50ID0gc2VsZWN0IChGRF9TRVRTSVpFLCAmcmVhZF9zZXQsIE5VTEwsIE5VTEwsICZ0dik7CisgICAgICAgIGlmIChjb3VudCA8IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCisgICAgICAgIGZvciAoamogPSAwOyBqaiA8IHNpemVvZihjb25uX2luZm8pL3NpemVvZihjb25uX2luZm9bMF0pIDsgamorKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNvbm5faW5mb1tqal0gJiYgRkRfSVNTRVQoY29ubl9pbmZvW2pqXS0+c29jaywgJnJlYWRfc2V0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBidWYgPSBiY21vc19idWZfYWxsb2MoQkNNVFJfTUFYX01UVV9TSVpFKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJ1ZikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtZW1zZXQoYnVmLCAwICwgc2l6ZW9mKGJ1ZikpOworICAgICAgICAgICAgICAgIHJjPXJlYWQoY29ubl9pbmZvW2pqXS0+c29jaywgYmNtb3NfYnVmX2RhdGEoYnVmKSwgYnVmLT5zaXplKTsKKyAgICAgICAgICAgICAgICBidWYtPmxlbiA9IHJjOworICAgICAgICAgICAgICAgIGJ1Zi0+ZGF0YSs9QkNNVURfVFhQUkVGSVhfTEVOOworICAgICAgICAgICAgICAgIGlmIChyYyA8IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIHBlcnJvcigicmVhZCIpOworICAgICAgICAgICAgICAgICAgICBleGl0KC0xKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocmMgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBjbG9zZShjb25uX2luZm9bampdLT5zb2NrKTsgIAorICAgICAgICAgICAgICAgICAgICBiY21vc19mcmVlKGNvbm5faW5mb1tqal0pOworICAgICAgICAgICAgICAgICAgICBjb25uX2luZm9bampdPTA7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3ByaW50ZigiQ2xvc2luZyAlZFxuIiwgamopOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2RldmlkIGRldmljZSA9IDA7ICAvKiAgSG93IGRvIHdlIGdldCB0aGlzPyAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5lZWQgdG8gc3R1ZmYgaXQgYXQgdGhlIGJlZ2luaW5nIG9mIHRoZSBtZXNzYWdlLiAqLworICAgICAgICAgICAgICAgICAgICBiY210cm11eF9yeF9mcm9tX2hvc3QoZGV2aWNlLCBjb25uX2luZm9bampdLT5jaGFubmVsW2RldmljZV0sIGJ1Zik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgaW50IG5leHRfY29ubl9pbmZvKGJjbW9sdF9kZXZpZCBkZXZpY2UpCit7CisgIGludCBqaj0wOworICB3aGlsZSAoamo8c2l6ZW9mKGNvbm5faW5mbykvc2l6ZW9mKGNvbm5faW5mb1swXSkpCisgICAgeworICAgICAgamorKzsgaWkrKzsKKyAgICAgIGlmIChpaT5zaXplb2YoY29ubl9pbmZvKS9zaXplb2YoY29ubl9pbmZvWzBdKSkgaWk9MDsKKyAgICAgIGlmICghY29ubl9pbmZvW2lpXSkgcmV0dXJuIDA7CisgICAgfQorICByZXR1cm4gLTE7Cit9CisKK2JjbW9zX2Vycm5vIGJjbXRyX3VkX2luaXQodm9pZCkKK3sKKyAgICBiY21vc19lcnJubyBlcnIgPSBCQ01fRVJSX09LOworICAgIHN0cnVjdCBzb2NrYWRkcl91biBhZGRyOworICAgIGJjbW9zX3Rhc2tfcGFybSBwYXJtID0geworICAgICAgICAucHJpb3JpdHkgPSBUQVNLX1BSSU9SSVRZX1RSQU5TUE9SVF9SWCwKKyAgICAgICAgLnN0YWNrX3NpemUgPSBCQ01UUl9SWF9USFJFQURfU1RBQ0ssCisgICAgICAgIC5oYW5kbGVyID0gYmNtdHJfdWRfcnhfaGFuZGxlciwKKyAgICAgICAgLm5hbWUgPSAidWQgaGFuZGxlciIKKyAgICB9OworCisgICAgaWk9MDsKKyAgICAKKyAgICBpZiAoIChmZCA9IHNvY2tldChBRl9VTklYLCBTT0NLX1NUUkVBTSwgMCkpID09IC0xKSB7CisgICAgICAgIHBlcnJvcigic29ja2V0IGVycm9yIik7CisgICAgICAgIGV4aXQoLTEpOworICAgIH0KKworICAgIG1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKKyAgICBhZGRyLnN1bl9mYW1pbHkgPSBBRl9VTklYOworICAgIEJVR19PTihzaXplb2Yoc29ja2V0X3BhdGgpPj1zaXplb2YoYWRkci5zdW5fcGF0aCkpOworICAgIG1lbWNweShhZGRyLnN1bl9wYXRoLCBzb2NrZXRfcGF0aCwgc2l6ZW9mKHNvY2tldF9wYXRoKSk7CisKKyAgICBpZiAoYmluZChmZCwgKHN0cnVjdCBzb2NrYWRkciopJmFkZHIsIHNpemVvZihhZGRyKSkgPT0gLTEpIHsKKyAgICAgICAgcGVycm9yKCJiaW5kIGVycm9yIik7CisgICAgICAgIGV4aXQoLTEpOworICAgIH0KKworICAgIGlmIChsaXN0ZW4oZmQsIDUpID09IC0xKSB7CisgICAgICAgIHBlcnJvcigibGlzdGVuIGVycm9yIik7CisgICAgICAgIGV4aXQoLTEpOworICAgIH0KKworICAgIGVyciA9IGJjbW9zX3Rhc2tfY3JlYXRlKCZyeF90aHJlYWQsICZwYXJtKTsKKyAKKyAgICBpZiAoZXJyKSByZXR1cm4gZXJyOworCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgYmNtb2x0X2RldmlkIGRldmljZSA9IDA7ICAvKiAgSG93IGRvIHdlIGdldCB0aGlzPyAgTmVlZCB0byBzdHVmZiBpdCBhdCB0aGUgYmVnaW5pbmcgb2YgdGhlIG1lc3NhZ2UuICovCisgICAgICAgIGludCBzOworICAgICAgICB1ZF9jb25uX2luZm8gKmNpOworICAgICAgICBiY21vc19lcnJubyByYzsKKyAgICAgICAgYmNtdHJtdXhfY2hhbm5lbCBjaGFubmVsID0gQkNNVFJNVVhfQ0hBTk5FTF9BVVRPX0FTU0lHTjsKKworICAgICAgICBpZiAoIChzID0gYWNjZXB0KGZkLCBOVUxMLCBOVUxMKSkgPT0gLTEpIHsKKyAgICAgICAgICAgIHBlcnJvcigiYWNjZXB0IGVycm9yIik7CisgICAgICAgICAgICBzbGVlcCgxKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgY2kgPSBiY21vc19jYWxsb2Moc2l6ZW9mKCpjaSkpOyAKKyAgICAgICAgaWYgKCFjaSkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfTk9NRU0sICJObyBtZW1vcnlcbiIpOworICAgICAgICB9CisgICAgICAgIHJjID0gYmNtdHJtdXhfY2hhbm5lbF9yZWdpc3RlcihkZXZpY2UsICZjaGFubmVsLCBfYmNtdHJfdWRfcmVjdiwgY29ubl9pbmZvKTsKKyAgICAgICAgaWYgKHJjKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19wcmludGYoIiVzOiBjYW4ndCByZWdpc3RlciBjaGFubmVsIGZvciBkZXZpY2UgJXUuIHJjPSVkXG4iLCBfX0ZVTkNUSU9OX18sIGRldmljZSwgKGludClyYyk7CisgICAgICAgICAgICByZXR1cm4gcmM7OworICAgICAgICB9CisgICAgICAgIGNpLT5zb2NrID0gczsKKyAgICAgICAgY2ktPmNoYW5uZWxbZGV2aWNlXT1jaGFubmVsOworICAgICAgICBjb25uX2luZm9baWldID0gY2k7CisKKyAgICAgICAgYmNtb3NfcHJpbnRmKCJBY2NlcHRpbmcgJWQtJWRcbiIsIGlpLCBjb25uX2luZm9baWldLT5zb2NrKTsKKworICAgICAgICBpZiAobmV4dF9jb25uX2luZm8oZGV2aWNlKSA8IDApIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3ZvaWQgYmNtdHJfdWRfZXhpdCh2b2lkKQoreworCit9CmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3RyYW5zcG9ydC91bml4X3NvY2tldC9iY21vbHRfdHJfdWRfZHJpdmVyLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3RyYW5zcG9ydC91bml4X3NvY2tldC9iY21vbHRfdHJfdWRfZHJpdmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTcyNmM5YwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdHJhbnNwb3J0L3VuaXhfc29ja2V0L2JjbW9sdF90cl91ZF9kcml2ZXIuaApAQCAtMCwwICsxLDQyIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisvKgorICogYmNtdHJfdWRfZHJpdmVyLmggLSBob3N0IHVuaXggZG9tYWluIHNvY2tldCB0cmFuc3BvcnQgZHJpdmVyCisgKi8KKworI2lmbmRlZiBCQ01PTFRfVFJfVURfRFJJVkVSX0hfCisjZGVmaW5lIEJDTU9MVF9UUl9VRF9EUklWRVJfSF8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorCitiY21vc19lcnJubyBiY210cl91ZF9pbml0KHZvaWQpOwordm9pZCBiY210cl91ZF9leGl0KHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdXNlcl9jb25maWcvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3VzZXJfY29uZmlnL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYjU5ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3VzZXJfY29uZmlnL01ha2VmaWxlCkBAIC0wLDAgKzEsMTYgQEAKKyMKKyMgdXNlcl9jb25maWcKKyMKK01PRF9OQU1FID0gdXNlcl9jb25maWcKK01PRF9ERVBTID0gY29tbW9uX2FwaSBmbGQgbGxfcGNpZQorCitpZmVxICgiJChPU19LRVJORUwpIiwgImxpbnV4IikKKyAgICBNT0RfVFlQRSA9IGxpbnV4X2xpYgorZWxzZQorICAgIE1PRF9UWVBFID0gbGliCitlbmRpZgorCitpZm5lcSAoIiQoQk9BUkQpIiwgIiIpCisgICAgc3JjcyA9IGJvYXJkLyQoQk9BUkQpL2JjbW9sdF91c2VyX3V0aWxzLmMKKyAgICBNT0RfREVQUyArPSBpMmNfZGV2cyBib2FyZF9zZWxlY3RvcgorZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdXNlcl9jb25maWcvYmNtb2x0X3VzZXJfdXRpbHMuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdXNlcl9jb25maWcvYmNtb2x0X3VzZXJfdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjMyZTM2Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC91c2VyX2NvbmZpZy9iY21vbHRfdXNlcl91dGlscy5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgX0JDTU9MVF9VU0VSX1VUSUxTX0hfCisjZGVmaW5lIF9CQ01PTFRfVVNFUl9VVElMU19IXworCisjaW5jbHVkZSA8YmNtb2x0X21vZGVsX3R5cGVzLmg+CisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtb2x0X21zZy5oPgorI2luY2x1ZGUgPGJjbW9sdF9mbGQuaD4KKworLyogVmFsaWRhdGUgdGhhdCB0aGUgZ2l2ZW4gc3lzdGVtIG1vZGUgaXMgc3VwcG9ydGVkIGZvciB0aGUgZ2l2ZW4gZGV2aWNlLgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIEJDTV9FUlJfT0sgaWYgdGhlIHN5c3RlbSBtb2RlIGlzIHZhbGlkIG9yIGEgZGlmZmVyZW50IGVycm9yIGNvZGUgb3RoZXJ3aXNlLiAqLworYmNtb3NfZXJybm8gYmNtdXNlcl9zeXN0ZW1fbW9kZV92YWxpZGF0ZShiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfc3lzdGVtX21vZGUgc3lzdGVtX21vZGUpOworCisvKiBSZWFkIGZpbGUgZnJvbSBhIGZpbGUgc3lzdGVtIGludG8gYSBidWZmZXIuICovCitpbnQgYmNtdXNlcl9pbWFnZV9yZWFkKAorICAgIGJjbW9sdF9kZXZpZCBkZXZpY2UsCisgICAgYmNtb2x0X2RldmljZV9pbWFnZV90eXBlIGltYWdlX3R5cGUsCisgICAgdWludDMyX3Qgb2Zmc2V0LAorICAgIHVpbnQ4X3QgKmJ1ZiwKKyAgICB1aW50MzJfdCBidWZfc2l6ZSk7CisKKy8qIFR1cm4gb2ZmIHRoZSBwcm9jZXNzb3Igb2YgdGhlIGVtYmVkZGVkIGRldmljZS4gKi8KK2JjbW9zX2Vycm5vIGJjbXVzZXJfZGV2aWNlX29mZihiY21vbHRfZGV2aWQgZGV2aWNlKTsKKworLyogVHVybiBvbiB0aGUgcHJvY2Vzc29yIG9mIHRoZSBlbWJlZGRlZCBkZXZpY2UuICovCitiY21vc19lcnJubyBiY211c2VyX2RldmljZV9vbihiY21vbHRfZGV2aWQgZGV2aWNlKTsKKworLyogQ2hlY2sgd2hldGhlciBvciBub3QgdGhlIGVtYmVkZGVkIGRldmljZSBwcm9jZXNzb3IgaXMgcnVubmluZy4gKi8KK2JjbW9zX2Vycm5vIGJjbXVzZXJfZGV2aWNlX2lzX3J1bm5pbmcoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb3NfYm9vbCAqaXNfY3B1X29uKTsKKworLyogUHJlcGFyZSB0aGUgUENJZSBidXMgZm9yIGNvbW11bmljYXRpb24gd2l0aCB0aGUgZW1iZWRkZWQgZGV2aWNlcyAqLworYmNtb3NfZXJybm8gYmNtdXNlcl9wY2llX3ByZXBhcmUodm9pZCk7CisKKy8qIFByZXBhcmUgdGhlIFBDSWUgY2hhbm5lbCBmb3IgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBlbWJlZGRlZCBkZXZpY2UuCisgKiBGb3IgZXhhbXBsZSwgdGhpcyBmdW5jdGlvbiBtYXkgcmUtZW51bWVyYXRlIHRoZSBQQ0ktRSBidXMuICovCitiY21vc19lcnJubyBiY211c2VyX3BjaWVfY2hhbm5lbF9wcmVwYXJlKGJjbW9sdF9kZXZpZCBkZXZpY2UpOworCitiY21vc19lcnJubyBiY211c2VyX3BjaWVfY2hhbm5lbF9wcmVwYXJlX2Zvcl9rdDIoYmNtb2x0X2RldmlkIGRldmljZSk7CisKKy8qIFJlbW92ZSB0aGUgUENJZSBjaGFubmVsIGZvciBjb21tdW5pY2F0aW9uIHdpdGggdGhlIGVtYmVkZGVkIGRldmljZS4KKyAqIEZvciBleGFtcGxlLCB0aGlzIGZ1bmN0aW9uIG1heSByZS1lbnVtZXJhdGUgdGhlIFBDSS1FIGJ1cy4gKi8KK2JjbW9zX2Vycm5vIGJjbXVzZXJfcGNpZV9jaGFubmVsX3JlbW92ZShiY21vbHRfZGV2aWQgZGV2aWNlKTsKKworLyogUmVzZXQgdGhlIGhvc3QgcHJvY2Vzc29yLiAqLworYmNtb3NfZXJybm8gYmNtdXNlcl9ob3N0X3Jlc2V0KHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdXNlcl9jb25maWcvYm9hcmQvd3J4L2JjbW9sdF91c2VyX3V0aWxzLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3VzZXJfY29uZmlnL2JvYXJkL3dyeC9iY21vbHRfdXNlcl91dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZjU4YTkKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3VzZXJfY29uZmlnL2JvYXJkL3dyeC9iY21vbHRfdXNlcl91dGlscy5jCkBAIC0wLDAgKzEsNTMzIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21fY29uZmlnLmg+CisjaW5jbHVkZSA8YmNtb2x0X21zZy5oPgorI2luY2x1ZGUgPGJjbW9sdF9mbGQuaD4KKyNpbmNsdWRlIDxiY21vbHRfbGxwY2llLmg+CisjaW5jbHVkZSA8YmNtb2x0X2NvbnYuaD4KKyNpbmNsdWRlIDxiY21vbHRfaTJjX2RldnMuaD4KKyNpbmNsdWRlIDxiY21vbHRfYm9hcmRfc2VsZWN0b3IuaD4KKyNpbmNsdWRlICJiY21vbHRfdXNlcl91dGlscy5oIgorCisjZGVmaW5lIEJDTV9JMkNfREVWX0FERFJfU1RBUlQgdHlwZWRlZiBlbnVtIHsKKyNkZWZpbmUgQkNNX0kyQ19ERVZfQUREUihuYW1lLCBkZXNjLCB2YWwpIG5hbWUgPSB2YWwsCisjZGVmaW5lIEJDTV9JMkNfREVWX0FERFJfRU5EIH0gYmNtX2kyY19kZXZfYWRkcjsKKyNpbmNsdWRlIDxiY21vbHRfaTJjX2RldnNfYWRkci5oPgorCisjZGVmaW5lIEJPT1RfRklMRSAgICAgICAgICAgICAgICAgICAgICAgIi9vcHQvYmNtNjg2MjAvYmNtNjg2MjBfYm9vdC5iaW4iCisjZGVmaW5lIEFQUExfRklMRSAgICAgICAgICAgICAgICAgICAgICAgIi9vcHQvYmNtNjg2MjAvYmNtNjg2MjBfYXBwbC5iaW4iCisjZGVmaW5lIE9OVV9GV19GSUxFICAgICAgICAgICAgICAgICAgICAgIi9vcHQvYmNtNjg2MjAvZHVtbXlfb251X2Zpcm13YXJlLmJpbiIKKworI2RlZmluZSBGUEdBX1JFR19GUEdBX1ZFUlNJT04gMHgwCisjZGVmaW5lIEZQR0FfUkVHX0JPQVJEX0NPTkYgMHgxCisjZGVmaW5lIEZQR0FfUkVHX1JFU0VUUyAweDIKKworI2RlZmluZSBGUEdBX1JTVF9CSVRfREVWSUNFIDB4MAorI2RlZmluZSBGUEdBX0RFVklDRV9TV0lUQ0ggIDQKKworI2RlZmluZSBGUEdBX0VOQUJMRV9BTExfREVWSUNFUyAweDFmCisjZGVmaW5lIEZQR0FfRU5BQkxFX1NXSVRDSCAgICAgICAgICAgICAgKDEgPDwgRlBHQV9ERVZJQ0VfU1dJVENIKQorLyogRm9yIG5vdyBzd2FwIGRldmljZXMgZm9yIGNvbnNpc3RlbmN5IHdpdGggUENJIGVudW1lcmF0aW9uICovCisjZGVmaW5lIEZQR0FfREVWSUNFX1JFU0VUX0JJVChkZXYpICAgICAgKDEgPDwgKEZQR0FfUlNUX0JJVF9ERVZJQ0UgKyBkZXYpKQorCisvKiBNaW5pbXVtIHJlcXVpcmVkIEZQR0EgdmVyc2lvbiBmb3IgcmVhZGluZyBkZWZhdWx0IHN5c3RlbSBtb2RlIHZpYSBCT0FSRF9DT05GIHJlZ2lzdGVyLiAqLworI2RlZmluZSBGUEdBX1ZFUl9GT1JfU1ZLX0NPTkZJRyA2CisKKy8qIExvY2sgdGhhdCBwcm90ZWN0cyBjcml0aWNhbCBzZWN0aW9ucyAqLworc3RhdGljIGJjbW9zX211dGV4IHVzZXJfbG9jazsKK3N0YXRpYyBiY21vc19ib29sIHVzZXJfbG9ja19pbml0aWFsaXplZDsKKwordHlwZWRlZiBlbnVtCit7CisgICAgU1ZLX0JPQVJEX0lEXzEgICAgPSAweDcsIC8qIFNWSyAjMSAtIEJDTTk2ODYyMFM6IGFsbCBQT04gZmxhdm9ycyBzdXBwb3J0ZWQsIFNGUCsgKi8KKyAgICBTVktfQk9BUkRfSURfMl9YRyA9IDB4NiwgLyogU1ZLICMyIC0gQkNNOTY4NjIwWEc6IFhHUE9OICovCisgICAgU1ZLX0JPQVJEX0lEXzJfWEUgPSAweDUsIC8qIFNWSyAjMiAtIEJDTTk2ODYyMFhFOiAxMEcgRVBPTiAqLworICAgIFNWS19CT0FSRF9JRF8zICAgID0gMHg0LCAvKiBTVksgIzMgLSBCQ005Njg2MjBLOiBhbGwgUE9OIGZsYXZvcnMgc3VwcG9ydGVkLCBYRlAgKi8KKyAgICBEVlRfQk9BUkRfSUQgICAgICA9IDB4MywgLyogRFZUIGJvYXJkICovCit9IHN2a19ib2FyZF9pZDsKKwordHlwZWRlZiBlbnVtCit7CisgICAgU1ZLX01PREVfR1BPTl8xNlggICAgID0gMHhGLCAvKiBTVksgIzEvMzogMTZ4IEdQT04gbW9kZSwgU1ZLICMyOiBvbmx5IHZhbGlkIG1vZGUgKi8KKyAgICBTVktfTU9ERV9FUE9OXzFHXzE2WCAgPSAweEUsIC8qIFNWSyAjMS8zOiAxNnggMUcgRVBPTiBtb2RlICovCisgICAgU1ZLX01PREVfWEdQT04gICAgICAgID0gMHhELCAvKiBTVksgIzEvMzogOHggWEdQT04gbW9kZSAqLworICAgIFNWS19NT0RFX0VQT05fMTBHXzhYICA9IDB4QywgLyogU1ZLICMxLzM6IDh4IDEwRyBFUE9OIG1vZGUgKi8KKyAgICBTVktfTU9ERV9FUE9OX0dQT05fOFggPSAweEIsIC8qIFNWSyAjMS8zOiA4eCAxMEcgRVBPTiArIDh4IEdQT04gY29leGlzdGVuY2UgbW9kZSAqLworfSBzdmtfbW9kZTsKKworCisjZGVmaW5lIENIRUNLX1JFVFVSTl9FUlJPUihjb25kLHJjKSBcCisJCWRvIHsgXAorCQkJaWYgKGNvbmQpIHtcCisJCQkJYmNtb3NfcHJpbnRmKCIlcyMlZDogZmFpbGVkIHdpdGggcmM9JWRcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIHJjKTtcCisJCQkJcmV0dXJuIHJjO1wKKwkJCX1cCisJCX0gd2hpbGUgKDApCisKKworc3RhdGljIHZvaWQgdXNlcmxvY2tfbG9jayh2b2lkKQoreworICAgIGlmICghdXNlcl9sb2NrX2luaXRpYWxpemVkKQorICAgIHsKKyAgICAgICAgYmNtb3NfbXV0ZXhfY3JlYXRlKCZ1c2VyX2xvY2ssIDAsICJyZXNldF9sb2NrIik7CisgICAgICAgIHVzZXJfbG9ja19pbml0aWFsaXplZCA9IEJDTU9TX1RSVUU7CisgICAgfQorICAgIGJjbW9zX211dGV4X2xvY2soJnVzZXJfbG9jayk7Cit9CisKKworc3RhdGljIHZvaWQgdXNlcmxvY2tfdW5sb2NrKHZvaWQpCit7CisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZ1c2VyX2xvY2spOworfQorCitzdGF0aWMgc3RydWN0IGZpbGUgKmZpbGVfb3Blbihjb25zdCBjaGFyICpwYXRoLCBpbnQgZmxhZ3MpCit7CisgICAgc3RydWN0IGZpbGUgKmZkID0gTlVMTDsKKyAgICBtb2RlX3QgbW9kZSA9IFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JUkdSUCB8IFNfSVJPVEg7CisKKyAgICBmZCA9IGZpbHBfb3BlbihwYXRoLCBmbGFncywgbW9kZSk7CisgICAgaWYoSVNfRVJSKGZkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIGZkOworfQorCitzdGF0aWMgdm9pZCBmaWxlX2Nsb3NlKHN0cnVjdCBmaWxlICpmaWxlKQoreworICAgIGZpbHBfY2xvc2UoZmlsZSwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgZmlsZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCB1aW50MzJfdCBvZmZzZXQsIHVpbnQ4X3QgKmRhdGEsIHVuc2lnbmVkIGludCBzaXplKQoreworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBvID0gb2Zmc2V0OworICAgIG1tX3NlZ21lbnRfdCBvbGRmczsKKyAgICBpbnQgYnl0ZXNfcmVhZDsKKworICAgIG9sZGZzID0gZ2V0X2ZzKCk7CisgICAgc2V0X2ZzKGdldF9kcygpKTsKKyAgICBieXRlc19yZWFkID0gdmZzX3JlYWQoZmlsZSwgZGF0YSwgc2l6ZSwgJm8pOworICAgIHNldF9mcyhvbGRmcyk7CisgICAgaWYgKGJ5dGVzX3JlYWQgPCAwKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJ2ZnNfcmVhZCByZXR1cm5lZCBlcnJvciAlZFxuIiwgYnl0ZXNfcmVhZCk7CisgICAgICAgIHJldHVybiAoaW50KUJDTV9FUlJfSU87CisgICAgfQorICAgIHJldHVybiBieXRlc19yZWFkOworfQorCitzdGF0aWMgaW50IGZpbGVfd3JpdGUoc3RydWN0IGZpbGUqIGZpbGUsIHVuc2lnbmVkIGxvbmcgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGNoYXIqIGRhdGEsIHVuc2lnbmVkIGludCBzaXplKQoreworICAgIG1tX3NlZ21lbnRfdCBvbGRmczsKKyAgICBpbnQgcmV0OworCisgICAgb2xkZnMgPSBnZXRfZnMoKTsKKyAgICBzZXRfZnMoZ2V0X2RzKCkpOworCisgICAgcmV0ID0gdmZzX3dyaXRlKGZpbGUsIGRhdGEsIHNpemUsICZvZmZzZXQpOworCisgICAgc2V0X2ZzKG9sZGZzKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gZmlsZV93cml0ZV8xKGNvbnN0IGNoYXIgKnBhdGgpCit7CisgICAgc3RydWN0IGZpbGUgKmZkOworICAgIGNoYXIgdG9fd3JpdGVbXSA9IHsgJzEnIH07CisgICAgbG9mZl90IHBvcyA9IDA7CisgICAgc3NpemVfdCBieXRlc193cml0dGVuOworCisgICAgZmQgPSBmaWxlX29wZW4ocGF0aCwgT19XUk9OTFkpOworICAgIGlmICgoZmQgPT0gTlVMTCkgfHwgKGZkID09ICh2b2lkICopLUVOT0VOVCkpIC8qIC1FTk9FTlQ7IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkgKi8KKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiQ2FuJ3Qgb3BlbiBmaWxlICVzIGZvciB3cml0aW5nLiBFcnJvciAlc1xuIiwKKyAgICAgICAgICAgIHBhdGgsIGJjbW9zX3N0cmVycm9yKGZkID09IE5VTEwgPyBCQ01fRVJSX05VTEwgOiBCQ01fRVJSX05PRU5UKSk7CisgICAgICAgIHJldHVybiAoZmQgPT0gTlVMTCA/IEJDTV9FUlJfTlVMTCA6IEJDTV9FUlJfTk9FTlQpOworICAgIH0KKworICAgIGJ5dGVzX3dyaXR0ZW4gPSBmaWxlX3dyaXRlKGZkLCBwb3MsIHRvX3dyaXRlLCBzaXplb2YodG9fd3JpdGUpKTsKKyAgICBpZiAoYnl0ZXNfd3JpdHRlbiAhPSBzaXplb2YodG9fd3JpdGUpKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJ2ZnNfd3JpdGUgcmV0dXJuZWQgaW5jb3JyZWN0IG51bWJlciBvZiBjaGFyYWN0ZXJzIHdyaXR0ZW46ICVkXG4iLCBieXRlc193cml0dGVuKTsKKyAgICB9CisKKyAgICBmaWxlX2Nsb3NlKGZkKTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGkyY19mcGdhX3JlYWQodWludDMyX3QgcmVnLCB1aW50MzJfdCAqdmFsKQoreworICAgIHJldHVybiBtYXBsZV9pMmNfcmVhZF9mcGdhKG1hcGxlX2kyY19nZXRfY2xpZW50KEZQR0FfSTJDX0FERFIpLCByZWcsIHZhbCk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBpMmNfZnBnYV93cml0ZSh1aW50MzJfdCByZWcsIHVpbnQzMl90IHZhbCkKK3sKKyAgICByZXR1cm4gbWFwbGVfaTJjX3dyaXRlX2ZwZ2EobWFwbGVfaTJjX2dldF9jbGllbnQoRlBHQV9JMkNfQUREUiksIHJlZywgdmFsKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGkyY19jb25maWdfc3dpdGNoKHZvaWQpCit7CisgICAgdWludDhfdCB0b193cml0ZSA9IDE7CisgICAgaW50IHJldDsKKworICAgIHJldCA9IG1hcGxlX2kyY193cml0ZShtYXBsZV9pMmNfZ2V0X2NsaWVudChJMkNfU1cwX0kyQ19BRERSKSwgJnRvX3dyaXRlLCAxKTsKKyAgICBpZiAocmV0ICE9IDApCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9FUlIoIkZhaWxlZCB0byB3cml0ZSBzd2l0Y2g6ICVkXG4iLCByZXQpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGkyY19mcGdhX3ZlcnNpb25fZ2V0KHVpbnQzMl90ICp2ZXJzaW9uKQoreworICAgIHJldHVybiBpMmNfZnBnYV9yZWFkKEZQR0FfUkVHX0ZQR0FfVkVSU0lPTiwgdmVyc2lvbik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBpMmNfc3ZrX2NvbmZpZ19nZXQoc3ZrX2JvYXJkX2lkICpib2FyZF9pZCwgc3ZrX21vZGUgKm1vZGUpCit7CisgICAgdWludDMyX3QgdmFsOworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgcmMgPSBpMmNfZnBnYV9yZWFkKEZQR0FfUkVHX0JPQVJEX0NPTkYsICZ2YWwpOworICAgIGlmIChyYyA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgKmJvYXJkX2lkID0gKHN2a19ib2FyZF9pZCkodmFsICYgMHg3KTsKKyAgICAgICAgKm1vZGUgPSAoc3ZrX21vZGUpKCh2YWwgPj4gNCkgJiAweEYpOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGkyY19kZXZpY2VfY3B1X3N0YXRlX3NldChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vc19ib29sIGlzX29uKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIHVpbnQzMl90IHJlc2V0X3ZhbHVlczsKKworICAgIC8qIFByZXZlbnQgcmFjZSBjb25kaXRpb24gd2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgMiBkZXZpY2VzIHNpbXVsdGFuZW91c2x5ICovCisgICAgdXNlcmxvY2tfbG9jaygpOworCisgICAgZG8KKyAgICB7CisgICAgICAgIHJjID0gaTJjX2NvbmZpZ19zd2l0Y2goKTsKKyAgICAgICAgaWYgKHJjKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogUmVhZC1tb2RpZnktd3JpdGUgc28gd2UgY2FuIHNldCBvbmx5IHRoZSByZWxldmFudCBiaXQgKi8KKyAgICAgICAgcmMgPSBpMmNfZnBnYV9yZWFkKEZQR0FfUkVHX1JFU0VUUywgJnJlc2V0X3ZhbHVlcyk7CisgICAgICAgIGlmIChyYykKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmIChpc19vbikKKyAgICAgICAgICAgIHJlc2V0X3ZhbHVlcyB8PSBGUEdBX0RFVklDRV9SRVNFVF9CSVQoZGV2aWNlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVzZXRfdmFsdWVzICY9IH5GUEdBX0RFVklDRV9SRVNFVF9CSVQoZGV2aWNlKTsKKworICAgICAgICByYyA9IGkyY19mcGdhX3dyaXRlKEZQR0FfUkVHX1JFU0VUUywgcmVzZXRfdmFsdWVzKTsKKworICAgIH0gd2hpbGUgKDApOworCisgICAgdXNlcmxvY2tfdW5sb2NrKCk7CisKKyAgICBDSEVDS19SRVRVUk5fRVJST1IocmMgIT0gQkNNX0VSUl9PSywgcmMpOworCisgICAgYmNtb3NfdXNsZWVwKDEwMDApOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19ib29sIGJjbXVzZXJfc3lzdGVtX21vZGVfaXNfdmFsaWQoYmNtb2x0X3N5c3RlbV9tb2RlIHN5c3RlbV9tb2RlLCBzdmtfYm9hcmRfaWQgYm9hcmRfaWQsIHN2a19tb2RlIHN2a19tb2RlKQoreworICAgIHN3aXRjaCAoYm9hcmRfaWQpCisgICAgeworICAgIGNhc2UgU1ZLX0JPQVJEX0lEXzE6CisgICAgY2FzZSBTVktfQk9BUkRfSURfMzoKKyAgICAgICAgc3dpdGNoIChzdmtfbW9kZSkKKyAgICAgICAgeworICAgICAgICBjYXNlIFNWS19NT0RFX0dQT05fMTZYOgorICAgICAgICAgICAgcmV0dXJuIChzeXN0ZW1fbW9kZSA9PSBCQ01PTFRfU1lTVEVNX01PREVfR1BPTl9fNF9YIHx8CisgICAgICAgICAgICAgICAgICAgIHN5c3RlbV9tb2RlID09IEJDTU9MVF9TWVNURU1fTU9ERV9HUE9OX184X1ggfHwKKyAgICAgICAgICAgICAgICAgICAgc3lzdGVtX21vZGUgPT0gQkNNT0xUX1NZU1RFTV9NT0RFX0dQT05fXzE2X1ggfHwKKyAgICAgICAgICAgICAgICAgICAgc3lzdGVtX21vZGUgPT0gQkNNT0xUX1NZU1RFTV9NT0RFX0dQT05fOF9YR1BPTl80X1hfQ09FWElTVEVOQ0UgfHwKKyAgICAgICAgICAgICAgICAgICAgc3lzdGVtX21vZGUgPT0gQkNNT0xUX1NZU1RFTV9NT0RFX1hHUE9OXzFfXzhfWCB8fAorICAgICAgICAgICAgICAgICAgICBzeXN0ZW1fbW9kZSA9PSBCQ01PTFRfU1lTVEVNX01PREVfWEdQT05fMV9fNF9YIHx8CisgICAgICAgICAgICAgICAgICAgIHN5c3RlbV9tb2RlID09IEJDTU9MVF9TWVNURU1fTU9ERV9OR1BPTjJfXzhfWF8yX1BfNV9HKTsKKyAgICAgICAgY2FzZSBTVktfTU9ERV9FUE9OXzFHXzE2WDoKKyAgICAgICAgICAgIHJldHVybiAoc3lzdGVtX21vZGUgPT0gQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzRfWCB8fAorICAgICAgICAgICAgICAgICAgICBzeXN0ZW1fbW9kZSA9PSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fOF9YIHx8CisgICAgICAgICAgICAgICAgICAgIHN5c3RlbV9tb2RlID09IEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX18xNl9YIHx8CisgICAgICAgICAgICAgICAgICAgIHN5c3RlbV9tb2RlID09IEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX18yX1hfMTBfRyB8fAorICAgICAgICAgICAgICAgICAgICBzeXN0ZW1fbW9kZSA9PSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fNF9YXzEwX0cgfHwKKyAgICAgICAgICAgICAgICAgICAgc3lzdGVtX21vZGUgPT0gQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzhfWF8xMF9HKTsKKyAgICAgICAgY2FzZSBTVktfTU9ERV9YR1BPTjoKKyAgICAgICAgICAgIHJldHVybiAoc3lzdGVtX21vZGUgPT0gQkNNT0xUX1NZU1RFTV9NT0RFX1hHUE9OXzFfXzhfWCB8fAorICAgICAgICAgICAgICAgICAgICBzeXN0ZW1fbW9kZSA9PSBCQ01PTFRfU1lTVEVNX01PREVfWEdQT05fMV9fNF9YIHx8CisgICAgICAgICAgICAgICAgICAgIHN5c3RlbV9tb2RlID09IEJDTU9MVF9TWVNURU1fTU9ERV9OR1BPTjJfXzhfWF8yX1BfNV9HKTsKKyAgICAgICAgY2FzZSBTVktfTU9ERV9FUE9OXzEwR184WDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIChzeXN0ZW1fbW9kZSA9PSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fNF9YX0NPRVhJU1RFTkNFX1RETUEpIHx8CisgICAgICAgICAgICAgICAgKHN5c3RlbV9tb2RlID09IEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX184X1hfQ09FWElTVEVOQ0VfVERNQSkgfHwKKyAgICAgICAgICAgICAgICAoc3lzdGVtX21vZGUgPT0gQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzJfWF8xMF9HKSB8fAorICAgICAgICAgICAgICAgIChzeXN0ZW1fbW9kZSA9PSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fNF9YXzEwX0cpIHx8CisgICAgICAgICAgICAgICAgKHN5c3RlbV9tb2RlID09IEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX184X1hfMTBfRyk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICBjYXNlIFNWS19CT0FSRF9JRF8yX1hHOgorICAgICAgICByZXR1cm4gKHN5c3RlbV9tb2RlID09IEJDTU9MVF9TWVNURU1fTU9ERV9YR1BPTl8xX184X1ggfHwKKyAgICAgICAgICAgICAgICBzeXN0ZW1fbW9kZSA9PSBCQ01PTFRfU1lTVEVNX01PREVfWEdQT05fMV9fNF9YIHx8CisgICAgICAgICAgICAgICAgc3lzdGVtX21vZGUgPT0gQkNNT0xUX1NZU1RFTV9NT0RFX05HUE9OMl9fOF9YXzJfUF81X0cgfHwKKyAgICAgICAgICAgICAgICBzeXN0ZW1fbW9kZSA9PSBCQ01PTFRfU1lTVEVNX01PREVfWEdTX18yX1hfMTBfRyB8fAorICAgICAgICAgICAgICAgIHN5c3RlbV9tb2RlID09IEJDTU9MVF9TWVNURU1fTU9ERV9OR1BPTjJfXzJfWF8xMF9HKTsKKyAgICBjYXNlIFNWS19CT0FSRF9JRF8yX1hFOgorICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIChzeXN0ZW1fbW9kZSA9PSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fNF9YX0NPRVhJU1RFTkNFX1RETUEpIHx8CisgICAgICAgICAgICAoc3lzdGVtX21vZGUgPT0gQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzhfWF9DT0VYSVNURU5DRV9URE1BKSB8fAorICAgICAgICAgICAgKHN5c3RlbV9tb2RlID09IEJDTU9MVF9TWVNURU1fTU9ERV9BRV84X1gpIHx8CisgICAgICAgICAgICAoc3lzdGVtX21vZGUgPT0gQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzJfWF8xMF9HKSB8fAorICAgICAgICAgICAgKHN5c3RlbV9tb2RlID09IEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX180X1hfMTBfRykgfHwKKyAgICAgICAgICAgIChzeXN0ZW1fbW9kZSA9PSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fOF9YXzEwX0cpOworICAgIGNhc2UgRFZUX0JPQVJEX0lEOgorICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorfQorCitiY21vc19lcnJubyBiY211c2VyX3N5c3RlbV9tb2RlX3ZhbGlkYXRlKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9zeXN0ZW1fbW9kZSBzeXN0ZW1fbW9kZSkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICB1aW50MzJfdCB2ZXJzaW9uOworICAgIHN2a19ib2FyZF9pZCBib2FyZF9pZDsKKyAgICBzdmtfbW9kZSBzdmtfbW9kZTsKKworICAgIHJjID0gaTJjX2NvbmZpZ19zd2l0Y2goKTsKKyAgICBDSEVDS19SRVRVUk5fRVJST1IocmMgIT0gQkNNX0VSUl9PSywgcmMpOworCisgICAgcmMgPSBpMmNfZnBnYV92ZXJzaW9uX2dldCgmdmVyc2lvbik7CisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9JTkZPKCJGYWlsZWQgdG8gcmVhZCBGUEdBIHZlcnNpb25cbiIpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgaWYgKHZlcnNpb24gPCBGUEdBX1ZFUl9GT1JfU1ZLX0NPTkZJRykKKyAgICB7CisgICAgICAgIC8qIHRoaXMgRlBHQSB2ZXJzaW9uIGRvbid0IHN1cHBvcnQgcmVhZGluZyB0aGUgU1ZLIHZlcnNpb24sIHNvIHdlIG11c3QgYXNzdW1lIGl0J3MgT0sgKi8KKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgcmMgPSBpMmNfc3ZrX2NvbmZpZ19nZXQoJmJvYXJkX2lkLCAmc3ZrX21vZGUpOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfSU5GTygiRmFpbGVkIHRvIHJlYWQgU1ZLIGNvbmZpZ1xuIik7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBpZiAoYmNtdXNlcl9zeXN0ZW1fbW9kZV9pc192YWxpZChzeXN0ZW1fbW9kZSwgYm9hcmRfaWQsIHN2a19tb2RlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9JTkZPKAorICAgICAgICAgICAgIlN5c3RlbSBtb2RlICVzIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGJvYXJkIElEICVkLCBTVksgbW9kZSAlZFxuIiwKKyAgICAgICAgICAgIGJjbW9sdF9zeXN0ZW1fbW9kZV9uYW1lKHN5c3RlbV9tb2RlKSwKKyAgICAgICAgICAgIGJvYXJkX2lkLAorICAgICAgICAgICAgc3ZrX21vZGUpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworICAgIH0KK30KKworaW50IGJjbXVzZXJfaW1hZ2VfcmVhZChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgaW1hZ2VfdHlwZSwKKyAgICB1aW50MzJfdCBvZmZzZXQsIHVpbnQ4X3QgKmJ1ZiwgdWludDMyX3QgYnVmX3NpemUpCit7CisgICAgc3RydWN0IGZpbGUgKmZkOworICAgIGludCBieXRlc19yZWFkOworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIHN0YXRpYyBpbnQyc3RyX3QgaW1hZ2VfdHlwZTJzdHJbXSA9CisgICAgeworICAgICAgICB7QkNNT0xUX0RFVklDRV9JTUFHRV9UWVBFX0JPT1RMT0FERVIsIEJPT1RfRklMRX0sCisgICAgICAgIHtCQ01PTFRfREVWSUNFX0lNQUdFX1RZUEVfQVBQTElDQVRJT04sIEFQUExfRklMRX0sCisgICAgICAgIHtCQ01PTFRfREVWSUNFX0lNQUdFX1RZUEVfSVRVX1BPTl9PTlVfRklSTVdBUkUsIE9OVV9GV19GSUxFfSwKKyAgICAgICAgey0xfQorICAgIH07CisgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisKKyAgICBmaWxlbmFtZSA9IGludDJzdHIoaW1hZ2VfdHlwZTJzdHIsIGltYWdlX3R5cGUpOworICAgIGZkID0gZmlsZV9vcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7CisgICAgaWYgKChmZCA9PSBOVUxMKSB8fCAoZmQgPT0gKHZvaWQgKiktRU5PRU5UKSkgLyogLUVOT0VOVDsgTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSAqLworICAgIHsKKyAgICAgICAgcmMgPSAoZmQgPT0gTlVMTCA/IEJDTV9FUlJfTlVMTCA6IEJDTV9FUlJfTk9FTlQpOworICAgICAgICBCQ01PU19UUkFDRV9FUlIoImZpbHBfb3BlbiByZXR1cm5lZCBlcnJvciAlcyAoJWQpXG4iLCBiY21vc19zdHJlcnJvcihyYyksIHJjKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKyAgICBieXRlc19yZWFkID0gZmlsZV9yZWFkKGZkLCBvZmZzZXQsIGJ1ZiwgYnVmX3NpemUpOworICAgIGZpbGVfY2xvc2UoZmQpOworICAgIGlmIChieXRlc19yZWFkIDwgMCkKKyAgICB7CisgICAgICAgIHJldHVybiAoaW50KUJDTV9FUlJfSU87CisgICAgfQorICAgIHJldHVybiBieXRlc19yZWFkOworfQorCitiY21vc19lcnJubyBiY211c2VyX2RldmljZV9vZmYoYmNtb2x0X2RldmlkIGRldmljZSkKK3sKKyAgICAvKiBJZ25vcmUgcmVxdWVzdCBmb3Igbm9uLWV4aXN0aW5nIGRldmljZSAqLworICAgIGlmIChkZXZpY2UgPj0gYmNtb2x0X2JvYXJkX251bV9tYXBsZV9kZXZpY2VzKCkpCisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIEJDTU9TX1RSQUNFX0lORk8oImRldmljZT0ldVxuIiwgZGV2aWNlKTsKKyAgICByZXR1cm4gaTJjX2RldmljZV9jcHVfc3RhdGVfc2V0KGRldmljZSwgQkNNT1NfRkFMU0UpOworfQorCitiY21vc19lcnJubyBiY211c2VyX2RldmljZV9vbihiY21vbHRfZGV2aWQgZGV2aWNlKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgQkNNT1NfVFJBQ0VfSU5GTygiZGV2aWNlPSV1XG4iLCBkZXZpY2UpOworICAgIGlmIChkZXZpY2UgPj0gYmNtb2x0X2JvYXJkX251bV9tYXBsZV9kZXZpY2VzKCkpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworCisgICAgcmMgPSBpMmNfZGV2aWNlX2NwdV9zdGF0ZV9zZXQoZGV2aWNlLCBCQ01PU19UUlVFKTsKKyAgICAvKiBXYWl0IGEgbW9tZW50IHRvIG1ha2Ugc3VyZSB0aGUgZGV2aWNlIGlzIGRpc2NvdmVyYWJsZSBpbiBjYXNlIGl0IGp1c3QgYm9vdGVkLiAqLworICAgIGJjbW9zX3VzbGVlcCg1MCAqIDEwMDApOworCisgICAgcmV0dXJuIHJjOworfQorCitiY21vc19lcnJubyBiY211c2VyX2RldmljZV9pc19ydW5uaW5nKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9zX2Jvb2wgKmlzX3J1bm5pbmcpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgdWludDMyX3QgcmVzZXRfdmFsdWVzOworICAgIHVpbnQzMl90IHZlcnNpb247CisKKyAgICByYyA9IGkyY19jb25maWdfc3dpdGNoKCk7CisgICAgQ0hFQ0tfUkVUVVJOX0VSUk9SKHJjICE9IEJDTV9FUlJfT0ssIHJjKTsKKworICAgIHJjID0gaTJjX2ZwZ2FfdmVyc2lvbl9nZXQoJnZlcnNpb24pOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfSU5GTygiRmFpbGVkIHRvIHJlYWQgRlBHQSB2ZXJzaW9uXG4iKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKyAgICBpZiAoIWJjbW9sdF9ib2FyZF9zdXBwb3J0c19zdGFuZGFsb25lKHZlcnNpb24pKQorICAgIHsKKyAgICAgICAgLyogRm9yIG9sZGVyIEZQR0FzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBzdGFuZGFsb25lIG1vZGUsIHRoZSBkZXZpY2UgaXMgdGFrZW4gb3V0IG9mIHJlc2V0IGF0IGJvb3QuICBXZSBuZWVkIHRvIGxpZQorICAgICAgICAgICBhbmQgdGVsbCBkZXZpY2UgY29udHJvbCB0aGF0IGl0J3Mgbm90IHJ1bm5pbmcsIHNvIGl0IHdpbGwgYmUgcHJvZ3JhbW1lZCBmcm9tIHNjcmF0Y2guICovCisgICAgICAgIEJDTU9TX1RSQUNFX0lORk8oIkZQR0EgdmVyc2lvbiAlZCBkb2Vzbid0IHN1cHBvcnQgc3RhbmRhbG9uZSBtb2RlXG4iLCB2ZXJzaW9uKTsKKyAgICAgICAgKmlzX3J1bm5pbmcgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgcmMgPSBpMmNfZnBnYV9yZWFkKEZQR0FfUkVHX1JFU0VUUywgJnJlc2V0X3ZhbHVlcyk7CisgICAgQ0hFQ0tfUkVUVVJOX0VSUk9SKHJjICE9IEJDTV9FUlJfT0ssIHJjKTsKKworICAgICppc19ydW5uaW5nID0gKChyZXNldF92YWx1ZXMgJiBGUEdBX0RFVklDRV9SRVNFVF9CSVQoZGV2aWNlKSkgIT0gMCk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtdXNlcl9ob3N0X3Jlc2V0KHZvaWQpCit7CisgICAgYmNtX2xsX3BjaWVfY2xlYW51cCgpOworICAgIGtlcm5lbF9yZXN0YXJ0KE5VTEwpOworICAgIHJldHVybiBCQ01fRVJSX09LOyAvKiB3aWxsIG5ldmVyIGJlIHJlYWNoZWQgKi8KK30KKworYmNtb3NfZXJybm8gYmNtdXNlcl9wY2llX3ByZXBhcmUodm9pZCkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICB1aW50MzJfdCByZXNldF92YWx1ZXM7CisgICAgY29uc3QgY2hhciAqcGNpZV9yZXNjYW5fZmlsZSA9IGJjbW9sdF9ib2FyZF9wY2lfcmVzY2FuX3N0cmluZ19nZXQoKTsKKyAgICBpbnQgaTsKKworICAgIC8qIC0gVGFrZSBhbGwgZGV2aWNlcyBvdXQgb2YgcmVzZXQKKyAgICAgKiAtIHJlc2NhbiBidXMKKyAgICAgKiAtIHJlc3RvcmUgcmVzZXQgdmFsdWUKKyAgICAgKi8KKworICAgIHJjID0gaTJjX2NvbmZpZ19zd2l0Y2goKTsKKyAgICBDSEVDS19SRVRVUk5fRVJST1IocmMgIT0gQkNNX0VSUl9PSywgcmMpOworCisgICAgLyogUmVhZC1tb2RpZnktd3JpdGUgc28gd2UgY2FuIHNldCBvbmx5IHRoZSByZWxldmFudCBiaXQgKi8KKyAgICByYyA9IGkyY19mcGdhX3JlYWQoRlBHQV9SRUdfUkVTRVRTLCAmcmVzZXRfdmFsdWVzKTsKKyAgICBDSEVDS19SRVRVUk5fRVJST1IocmMgIT0gQkNNX0VSUl9PSywgcmMpOworCisgICAgcmMgPSBpMmNfZnBnYV93cml0ZShGUEdBX1JFR19SRVNFVFMsIEZQR0FfRU5BQkxFX0FMTF9ERVZJQ0VTKTsKKyAgICBDSEVDS19SRVRVUk5fRVJST1IocmMgIT0gQkNNX0VSUl9PSywgcmMpOworCisgICAgYmNtb3NfdXNsZWVwKDUwMDAwKTsKKworICAgIC8qIE5vdyByZWNhbiBQQ0kgYnVzICovCisgICAgLyogTm93IHJlLWVudW1lcmF0ZSB0aGUgUENJIGJ1cyBieSB3cml0aW5nIGEgMSB0byB0aGUgJ3Jlc2NhbicgZmlsZS4gKi8KKyAgICByYyA9IGZpbGVfd3JpdGVfMShwY2llX3Jlc2Nhbl9maWxlKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJmaWxlIHdyaXRlIHJldHVybmVkIGVycm9yICVzICglZClcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSwgcmMpOworICAgIGJjbW9zX3VzbGVlcCgxMDAgKiAxMDAwKTsKKworICAgIC8qIE5vdyBpbml0aWFsaXplIGxsX3BjaWUgZHJpdmVyIGFuZCBtYXAgbWFwbGUgZGV2aWNlcyAqLworICAgIHJjID0gYmNtX2xsX3BjaWVfaW5pdCgpOworICAgIENIRUNLX1JFVFVSTl9FUlJPUihyYyAhPSBCQ01fRVJSX09LLCByYyk7CisKKyAgICAvKiBOb3cgcmVzdG9yZSByZXN0IHZhbHVlcy4gS2VlcCBzd2l0Y2ggb3V0IG9mIHJlc2V0ICovCisgICAgZm9yIChpID0gMDsgaSA8IGJjbW9sdF9ib2FyZF9udW1fbWFwbGVfZGV2aWNlcygpOyBpKyspCisgICAgeworICAgICAgICBpZiAoKEZQR0FfREVWSUNFX1JFU0VUX0JJVChpKSAmIHJlc2V0X3ZhbHVlcykgPT0gMCkKKyAgICAgICAgICAgIGJjbXVzZXJfcGNpZV9jaGFubmVsX3JlbW92ZShpKTsKKyAgICB9CisgICAgcmMgPSBpMmNfZnBnYV93cml0ZShGUEdBX1JFR19SRVNFVFMsIHJlc2V0X3ZhbHVlcyB8IEZQR0FfRU5BQkxFX1NXSVRDSCk7CisgICAgQ0hFQ0tfUkVUVVJOX0VSUk9SKHJjICE9IEJDTV9FUlJfT0ssIHJjKTsKKworICAgIHJldHVybiAwOworfQorCitiY21vc19lcnJubyBiY211c2VyX3BjaWVfY2hhbm5lbF9wcmVwYXJlKGJjbW9sdF9kZXZpZCBkZXZpY2UpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICByYyA9IGJjbV9sbF9wY2llX2Rldl9lbmFibGUoZGV2aWNlKTsKKyAgICBpZiAocmMpCisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiQ291bGRuJ3QgcHJlcGFyZSBkZXZpY2UgJWQuIEVycm9yICVzXG4iLCBkZXZpY2UsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKK2JjbW9zX2Vycm5vIGJjbXVzZXJfcGNpZV9jaGFubmVsX3JlbW92ZShiY21vbHRfZGV2aWQgZGV2aWNlKQoreworICAgIGJjbV9sbF9wY2llX2Rldl9kaXNhYmxlKGRldmljZSk7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3VzZXJfY29uZmlnL2JvYXJkX3NlbGVjdG9yL01ha2VmaWxlIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC91c2VyX2NvbmZpZy9ib2FyZF9zZWxlY3Rvci9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmJmZTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC91c2VyX2NvbmZpZy9ib2FyZF9zZWxlY3Rvci9NYWtlZmlsZQpAQCAtMCwwICsxLDE1IEBACisjCisjIGJvYXJkX3NlbGVjdG9yCisjCitNT0RfTkFNRSA9IGJvYXJkX3NlbGVjdG9yCitNT0RfU1VQUFJFU1NfT1NfREVQID0geQorCitpZmVxICgiJChPU19LRVJORUwpIiwgImxpbnV4IikKKyAgICBNT0RfVFlQRSA9IGxpbnV4X2xpYgorZWxzZQorICAgIE1PRF9UWVBFID0gbGliCitlbmRpZgorCitpZm5lcSAoIiQoQk9BUkQpIiwgIiIpCisgICAgc3JjcyA9ICQoQk9BUkQpL2JjbW9sdF9ib2FyZF9zZWxlY3Rvci5jCitlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC91c2VyX2NvbmZpZy9ib2FyZF9zZWxlY3Rvci9iY21vbHRfYm9hcmRfc2VsZWN0b3IuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdXNlcl9jb25maWcvYm9hcmRfc2VsZWN0b3IvYmNtb2x0X2JvYXJkX3NlbGVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRhODEwMwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdXNlcl9jb25maWcvYm9hcmRfc2VsZWN0b3IvYmNtb2x0X2JvYXJkX3NlbGVjdG9yLmgKQEAgLTAsMCArMSw2MSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworLyoKKyAqIGJjbW9sdF9ib2FyZF9zZWxlY3Rvci5oCisgKi8KKworI2lmbmRlZiBfQkNNT0xUX0JPQVJEX1NFTEVDVE9SX0hfCisjZGVmaW5lIF9CQ01PTFRfQk9BUkRfU0VMRUNUT1JfSF8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorCisvKiBidXMsIGRldmZuIC0tPiBkZXZpY2UgbWFwcGluZyB0YWJsZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBpbnQgYnVzOworICAgIGludCBkZXZmbjsKKyAgICBpbnQgZGV2aWNlOworfSBidXNfZGV2Zm5fZGV2aWQ7CisKKy8qIEdldCBQQ0kgcmVzY2FuIHN0cmluZy4gSXQgaXMgdXNlZCBpbiBsaW51eCB0byByZXNjYW4gUENJZSBidXMgKi8KK2NvbnN0IGNoYXIgKmJjbW9sdF9ib2FyZF9wY2lfcmVzY2FuX3N0cmluZ19nZXQodm9pZCk7CisKKy8qIEdldCBidXMsIGRldmZuIC0tPiBkZXZfaWQgbWFwcGluZyB0YWJsZS4KKyAqIFRoZSB0YWJsZSBpcyB0ZXJtaW5hdGVkIGJ5IHJvdyB3aXRoIGJ1cz0tMSxkZXZmbj0tMQorICovCitjb25zdCBidXNfZGV2Zm5fZGV2aWQgKmJjbW9sdF9ib2FyZF9wY2lfbWFwX3RhYmxlX2dldCh2b2lkKTsKKworLyogUmV0dXJuIFRSVUUgaWYgYm9hcmQgc3VwcG9ydHMgTWFwbGUtc3RhbmRhbG9uZSBtb2RlICovCitiY21vc19ib29sIGJjbW9sdF9ib2FyZF9zdXBwb3J0c19zdGFuZGFsb25lKHVpbnQzMl90IHZlcnNpb24pOworCisvKiBSZXR1cm5zIG51bWJlciBvZiBtYXBsZSBkZXZpY2VzIG9uIHRoZSBib2FyZCAqLwordWludDhfdCBiY21vbHRfYm9hcmRfbnVtX21hcGxlX2RldmljZXModm9pZCk7CisKKyNlbmRpZiAvKiBfQkNNT0xUX0JPQVJEX1NFTEVDVE9SX0hfICovCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3VzZXJfY29uZmlnL2JvYXJkX3NlbGVjdG9yL3dyeC9iY21vbHRfYm9hcmRfc2VsZWN0b3IuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdXNlcl9jb25maWcvYm9hcmRfc2VsZWN0b3Ivd3J4L2JjbW9sdF9ib2FyZF9zZWxlY3Rvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5OTdhMTIKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3VzZXJfY29uZmlnL2JvYXJkX3NlbGVjdG9yL3dyeC9iY21vbHRfYm9hcmRfc2VsZWN0b3IuYwpAQCAtMCwwICsxLDExMyBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworLyoKKyAqIGJjbW9sdF9ib2FyZF9zZWxlY3Rvci5jCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSAiYmNtb2x0X2JvYXJkX3NlbGVjdG9yLmgiCisKK3N0YXRpYyBidXNfZGV2Zm5fZGV2aWQgYnVzX2RldmZuX2RldmlkX3RhYmxlX3N2azRbXSA9IHsKKyAgICB7IDUsIDAsIDB9LAorICAgIHsgMywgMCwgMX0sCisgICAgey0xLC0xLC0xfSwKK307CisKK3N0YXRpYyBidXNfZGV2Zm5fZGV2aWQgYnVzX2RldmZuX2RldmlkX3RhYmxlX3N2azFfM1tdID0geworICAgIHsgMywgMCwgMH0sCisgICAgey0xLC0xLC0xfSwKK307CisKKyNkZWZpbmUgU1ZLNF9JREVOVF9GSUxFICAgICAgICAgICAgICAgICAiL2V0Yy9zdms0IgorCisjZGVmaW5lIFBDSUVfREVWSUNFX1JFU0NBTl9GSUxFX1NWSzQgICAgIi9zeXMvYnVzL3BjaS9kZXZpY2VzLzAwMDA6MDI6MDAuMC9yZXNjYW4iCisjZGVmaW5lIFBDSUVfREVWSUNFX1JFU0NBTl9GSUxFX1NWSzFfMyAgIi9zeXMvYnVzL3BjaS9kZXZpY2VzLzAwMDA6MDI6MDEuMC9yZXNjYW4iCisKKy8qIE1pbmltdW0gcmVxdWlyZWQgRlBHQSB2ZXJzaW9uIGZvciBzdGFuZGFsb25lIG1vZGUgKGhvc3QgLyBlbWJlZGRlZCBwcm9jZXNzb3JzIHJ1bm5pbmcgZGlzY29ubmVjdGVkKS4gKi8KKyNkZWZpbmUgRlBHQV9WRVJfRk9SX1NUQU5EQUxPTkUgNworCitzdGF0aWMgc3RydWN0IGZpbGUgKmZpbGVfb3Blbihjb25zdCBjaGFyICpwYXRoLCBpbnQgZmxhZ3MpCit7CisgICAgc3RydWN0IGZpbGUgKmZkID0gTlVMTDsKKyAgICBtb2RlX3QgbW9kZSA9IFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JUkdSUCB8IFNfSVJPVEg7CisKKyAgICBmZCA9IGZpbHBfb3BlbihwYXRoLCBmbGFncywgbW9kZSk7CisgICAgaWYoSVNfRVJSKGZkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIGZkOworfQorCitzdGF0aWMgdm9pZCBmaWxlX2Nsb3NlKHN0cnVjdCBmaWxlICpmaWxlKQoreworICAgIGZpbHBfY2xvc2UoZmlsZSwgTlVMTCk7Cit9CisKK3N0YXRpYyBiY21vc19ib29sIGNhbl9yZWFkX2ZpbGUoY29uc3QgY2hhciAqcGF0aCkKK3sKKyAgICBzdHJ1Y3QgZmlsZSAqZmQgPSBmaWxlX29wZW4ocGF0aCwgT19SRE9OTFkpOworICAgIGlmICgoZmQgPT0gTlVMTCkgfHwgKGZkID09ICh2b2lkICopLUVOT0VOVCkpIC8qIC1FTk9FTlQ7IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkgKi8KKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmaWxlX2Nsb3NlKGZkKTsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworc3RhdGljIGJjbW9zX2Jvb2wgYm9hcmRfaXNfc3ZrNCh2b2lkKQoreworICAgIHJldHVybiBjYW5fcmVhZF9maWxlKFNWSzRfSURFTlRfRklMRSk7Cit9CisKKy8qIEdldCBQQ0kgcmVzY2FuIHN0cmluZy4gSXQgaXMgdXNlZCBpbiBsaW51eCB0byByZXNjYW4gUENJZSBidXMgKi8KK2NvbnN0IGNoYXIgKmJjbW9sdF9ib2FyZF9wY2lfcmVzY2FuX3N0cmluZ19nZXQodm9pZCkKK3sKKyAgICByZXR1cm4gYm9hcmRfaXNfc3ZrNCgpID8gUENJRV9ERVZJQ0VfUkVTQ0FOX0ZJTEVfU1ZLNCA6IFBDSUVfREVWSUNFX1JFU0NBTl9GSUxFX1NWSzFfMzsKK30KKworLyogR2V0IGJ1cywgZGV2Zm4gLS0+IGRldl9pZCBtYXBwaW5nIHRhYmxlLgorICogVGhlIHRhYmxlIGlzIHRlcm1pbmF0ZWQgYnkgcm93IHdpdGggYnVzPS0xLGRldmZuPS0xCisgKi8KK2NvbnN0IGJ1c19kZXZmbl9kZXZpZCAqYmNtb2x0X2JvYXJkX3BjaV9tYXBfdGFibGVfZ2V0KHZvaWQpCit7CisgICAgcmV0dXJuIGJvYXJkX2lzX3N2azQoKSA/IGJ1c19kZXZmbl9kZXZpZF90YWJsZV9zdms0IDogYnVzX2RldmZuX2RldmlkX3RhYmxlX3N2azFfMzsKK30KKworLyogUmV0dXJuIFRSVUUgaWYgYm9hcmQgc3VwcG9ydHMgTWFwbGUtc3RhbmRhbG9uZSBtb2RlICovCitiY21vc19ib29sIGJjbW9sdF9ib2FyZF9zdXBwb3J0c19zdGFuZGFsb25lKHVpbnQzMl90IHZlcnNpb24pCit7CisgICAgcmV0dXJuIGJvYXJkX2lzX3N2azQoKSB8fCB2ZXJzaW9uID49IEZQR0FfVkVSX0ZPUl9TVEFOREFMT05FOworfQorCisvKiBSZXR1cm5zIG51bWJlciBvZiBtYXBsZSBkZXZpY2VzIG9uIHRoZSBib2FyZCAqLwordWludDhfdCBiY21vbHRfYm9hcmRfbnVtX21hcGxlX2RldmljZXModm9pZCkKK3sKKyAgICByZXR1cm4gYm9hcmRfaXNfc3ZrNCgpID8gMiA6IDE7Cit9CmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3V0aWxzX2xpbnV4L01ha2VmaWxlIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC91dGlsc19saW51eC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODg2N2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfY3VzdG9taXplZC91dGlsc19saW51eC9NYWtlZmlsZQpAQCAtMCwwICsxLDE1IEBACisjIE1ha2VmaWxlIGZvciBidWlsZGluZyB1dGlsaXRpZXMgYXMgbGludXggbW9kdWxlCisjCitpZmVxICgiJChPU19LRVJORUwpIiwgImxpbnV4IikKKworTU9EX05BTUUgPSB1dGlsc19saW51eAorTU9EX1RZUEUgPSBsaW51eF9saWIKK3NyY3MgPSBiY21vbHRfYnVmLmMKKworIyBJZiBjYWxsZWQgYnkgbGludXgga2VybmVsIGJ1aWxkZXIgLSBhZGQgaW5jbHVkZSBwYXRocyBtYW51YWxseS4KKyMgSXQgaXMgbm90IGVsZWdhbnQsIGJ1dCB3ZSdsbCBub3QgaGF2ZSBtYW55IGxpbnV4IG1vZHVsZXMKK2lmbmVxICgiJChLQlVJTERfU1JDKSIsICIiKQorCS1pbmNsdWRlICQoT1VUX0RJUl9CQVNFKS9NYWtlZmlsZS5jb25maWcuJChNT0RfTkFNRSkKK2VuZGlmCisKK2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3V0aWxzX2xpbnV4L2JjbW9sdF9idWYuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdXRpbHNfbGludXgvYmNtb2x0X2J1Zi5jCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmY3YjgzMjAKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3V0aWxzX2xpbnV4L2JjbW9sdF9idWYuYwpAQCAtMCwwICsxIEBACisuLi8uLi9ob3N0X2RyaXZlci91dGlscy9iY21vbHRfYnVmLmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3V0aWxzX2xpbnV4L2JjbW9sdF9idWYuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdXRpbHNfbGludXgvYmNtb2x0X2J1Zi5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjRmNzczZmUKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3V0aWxzX2xpbnV4L2JjbW9sdF9idWYuaApAQCAtMCwwICsxIEBACisuLi8uLi9ob3N0X2RyaXZlci91dGlscy9iY21vbHRfYnVmLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3V0aWxzX2xpbnV4L2JjbW9sdF9jb252LmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9jdXN0b21pemVkL3V0aWxzX2xpbnV4L2JjbW9sdF9jb252LmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNmZiOGM5NwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2N1c3RvbWl6ZWQvdXRpbHNfbGludXgvYmNtb2x0X2NvbnYuaApAQCAtMCwwICsxIEBACisuLi8uLi9ob3N0X2RyaXZlci91dGlscy9iY21vbHRfY29udi5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2FwaS9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9hcGkvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMwMzVkMQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9hcGkvTWFrZWZpbGUKQEAgLTAsMCArMSwxMyBAQAorIyBDb21tb24gQVBJCisjCitNT0RfTkFNRSA9IGNvbW1vbl9hcGkKK01PRF9UWVBFID0gbGliCitNT0RfREVQUyA9IHV0aWxzIGRldl9sb2cKKworc3JjcyA9IGJjbW9sdF9tc2cuYworCitNT0RfSU5DX0RJUlMgPSAkKFNSQ19ESVIpICQoTU9ERUxfT1VUX0RJUikKK2lmZXEgKCIkKFJFTEVBU0VfQlVJTEQpIiwgInkiKQorICAgIE1PRF9JTkNfRElSUyArPSAkKFNSQ19ESVIpLy4uL3RyYW5zcG9ydAorICAgIHNyY3MgKz0gYmNtb2x0X2FwaS5jCitlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2FwaS9iY21vbHRfYXBpLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvYXBpL2JjbW9sdF9hcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTVmN2U1Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2FwaS9iY21vbHRfYXBpLmMKQEAgLTAsMCArMSwyOTEgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpbmNsdWRlIDxiY210cl9pbnRlcmZhY2UuaD4KKyNpbmNsdWRlICJiY21vbHRfYXBpLmgiCisjaW5jbHVkZSAiYmNtb2x0X21zZ19wYWNrLmgiCisKK3N5c3RlbV9tb2RlX2NoYW5nZV9jYiBzbV9jaGFuZ2VfY2I7CisKKy8qKiBTZXQgY29uZmlndXJhdGlvbgorICoKKyAqIFxwYXJhbVtpbl0gICBkZXYgICAgIERldmljZSBpZAorICogXHBhcmFtW2luXSAgIGNmZyAgICAgQ29uZmlndXJhdGlvbgorICogXHJldHVybnMgZXJyb3IgY29kZQorICovCitiY21vc19lcnJubyBiY21vbHRfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2LCBiY21vbHRfY2ZnICpjZmcpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9wcmVzZW5jZV9tYXNrIHJvX21hc2s7CisKKyAgICBjZmctPmhkci50eXBlID0gQkNNT0xUX01TR19UWVBFX1NFVDsKKyAgICAvKiBNYWtlIHN1cmUgdGhhdCBubyBhdHRlbXAgaXMgbWFkZSB0byBzZXQgcmVhZC1vbmx5IHByb3BlcnR5ICovCisgICAgZXJyID0gYmNtb2x0X2dldF9wcm9wX3JlYWRvbmx5X21hc2soY2ZnLT5oZHIub2JqX3R5cGUsICZyb19tYXNrKTsKKyAgICBpZiAoZXJyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgaWYgKChyb19tYXNrICYgY2ZnLT5oZHIucHJlc2VuY2VfbWFzaykpCisgICAgeworICAgICAgICBjZmctPmhkci5kaXIgPSBCQ01PTFRfTVNHX0RJUl9SRVNQT05TRTsKKyAgICAgICAgY2ZnLT5oZHIuZXJyID0gQkNNX0VSUl9SRUFEX09OTFk7CisgICAgICAgIHN0cm5jcHkoY2ZnLT5oZHIuZXJyX3RleHQsICJSZWFkLW9ubHkgZmllbGRzIGNhbm5vdCBiZSBzZXQiLCBCQ01PTFRfTUFYX0VSUl9URVhUX0xFTkdUSCk7CisgICAgICAgIHJldHVybiBjZmctPmhkci5lcnI7CisgICAgfQorICAgIGVyciA9IGJjbXRyX2NhbGwoZGV2LCAmY2ZnLT5oZHIpOworICAgIGlmICgoY2ZnLT5oZHIuZXJyID09IEJDTV9FUlJfT0spICYmCisgICAgICAgIChjZmctPmhkci5vYmpfdHlwZSA9PSBCQ01PTFRfT0JKX0lEX0RFVklDRSkgJiYKKyAgICAgICAgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoKGJjbW9sdF9kZXZpY2VfY2ZnKiljZmcsIGRldmljZSwgc3lzdGVtX21vZGUpKSkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zeXN0ZW1fbW9kZV9zZXQoZGV2LCAoKGJjbW9sdF9kZXZpY2VfY2ZnKiljZmcpLT5kYXRhLnN5c3RlbV9tb2RlKTsKKyAgICAgICAgaWYgKE5VTEwgIT0gc21fY2hhbmdlX2NiKQorICAgICAgICB7CisgICAgICAgICAgICBzbV9jaGFuZ2VfY2IoZGV2KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCisvKiogR2V0IGNvbmZpZ3VyYXRpb24KKyAqCisgKiBccGFyYW1baW5dICAgZGV2ICAgICBEZXZpY2UgaWQKKyAqIFxwYXJhbVtpbl0gICBjZmcgICAgIENvbmZpZ3VyYXRpb24KKyAqIFxyZXR1cm5zIGVycm9yIGNvZGUKKyAqIFRoZSBlcnJvciBjb2RlIGNhbiBpbmRpY2F0ZSBsb2NhbCBvciByZW1vdGUgZmFpbHVyZQorICovCitiY21vc19lcnJubyBiY21vbHRfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2LCBiY21vbHRfY2ZnICpjZmcpCit7CisgICAgY2ZnLT5oZHIudHlwZSA9IEJDTU9MVF9NU0dfVFlQRV9HRVQ7CisgICAgcmV0dXJuIGJjbXRyX2NhbGwoZGV2LCAmY2ZnLT5oZHIpOworfQorCisvKiogQ2xlYXIgY29uZmlndXJhdGlvbgorICoKKyAqIFxwYXJhbVtpbl0gICBkZXYgICAgIERldmljZSBpZAorICogXHBhcmFtW2luXSAgIGNmZyAgICAgQ29uZmlndXJhdGlvbgorICogXHJldHVybnMgZXJyb3IgY29kZQorICogVGhlIGVycm9yIGNvZGUgY2FuIGluZGljYXRlIGxvY2FsIG9yIHJlbW90ZSBmYWlsdXJlCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9jZmdfY2xlYXIoYmNtb2x0X2RldmlkIGRldiwgYmNtb2x0X2NmZyAqY2ZnKQoreworICAgIGNmZy0+aGRyLnByZXNlbmNlX21hc2sgPSBCQ01PTFRfUFJFU0VOQ0VfTUFTS19BTEw7IC8qIGNsZWFyIGlzIGFsd2F5cyBvYmplY3Qtd2lkZSAqLworICAgIGNmZy0+aGRyLnR5cGUgPSBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI7CisgICAgcmV0dXJuIGJjbXRyX2NhbGwoZGV2LCAmY2ZnLT5oZHIpOworfQorCisvKiogR2V0IHN0YXRpc3RpY3MKKyAqCisgKiBccGFyYW1baW5dICAgZGV2ICAgICBEZXZpY2UgaWQKKyAqIFxwYXJhbVtpbl0gICBzdGF0ICAgIENvbmZpZ3VyYXRpb24KKyAqIFxwYXJhbVtpbl0gICBmbGFncyAgIEZsYWdzCisgKiBccmV0dXJucyBlcnJvciBjb2RlCisgKiBUaGUgZXJyb3IgY29kZSBjYW4gaW5kaWNhdGUgbG9jYWwgb3IgcmVtb3RlIGZhaWx1cmUKKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X3N0YXRfZ2V0KGJjbW9sdF9kZXZpZCBkZXYsIGJjbW9sdF9zdGF0ICpzdGF0LCBiY21vbHRfc3RhdF9mbGFncyBmbGFncykKK3sKKyAgICBzdGF0LT5oZHIudHlwZSA9IEJDTU9MVF9NU0dfVFlQRV9HRVQ7CisgICAgaWYgKChmbGFncyAmIEJDTU9MVF9TVEFUX0ZMQUdTX0NMRUFSX09OX1JFQUQpKQorICAgIHsKKyAgICAgICAgc3RhdC0+aGRyLnR5cGUgfD0gQkNNT0xUX01TR19UWVBFX0NMRUFSOworICAgIH0KKyAgICByZXR1cm4gYmNtdHJfY2FsbChkZXYsICZzdGF0LT5oZHIpOworfQorCisvKiogR2V0IHN0YXRpc3RpY3MgY29uZmlndXJhdGlvbgorICoKKyAqIFxwYXJhbVtpbl0gICBkZXYgICAgIERldmljZSBpZAorICogXHBhcmFtW2luXSAgIGNmZyAgICAgQ29uZmlndXJhdGlvbgorICogXHJldHVybnMgZXJyb3IgY29kZQorICogVGhlIGVycm9yIGNvZGUgY2FuIGluZGljYXRlIGxvY2FsIG9yIHJlbW90ZSBmYWlsdXJlCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9zdGF0X2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldiwgYmNtb2x0X3N0YXRfY2ZnICpjZmcpCit7CisgICAgY2ZnLT5oZHIudHlwZSA9IEJDTU9MVF9NU0dfVFlQRV9HRVQ7CisgICAgY2ZnLT5oZHIucHJlc2VuY2VfbWFzayA9IEJDTU9MVF9QUkVTRU5DRV9NQVNLX0FMTDsKKyAgICByZXR1cm4gYmNtdHJfY2FsbChkZXYsICZjZmctPmhkcik7Cit9CisKKy8qKiBTZXQgc3RhdGlzdGljcyBjb25maWd1cmF0aW9uCisgKgorICogXHBhcmFtW2luXSAgIGRldiAgICAgRGV2aWNlIGlkCisgKiBccGFyYW1baW5dICAgY2ZnICAgICBDb25maWd1cmF0aW9uCisgKiBccmV0dXJucyBlcnJvciBjb2RlCisgKiBUaGUgZXJyb3IgY29kZSBjYW4gaW5kaWNhdGUgbG9jYWwgb3IgcmVtb3RlIGZhaWx1cmUKKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X3N0YXRfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2LCBiY21vbHRfc3RhdF9jZmcgKmNmZykKK3sKKyAgICBjZmctPmhkci50eXBlID0gQkNNT0xUX01TR19UWVBFX1NFVDsKKyAgICBjZmctPmhkci5wcmVzZW5jZV9tYXNrID0gQkNNT0xUX1BSRVNFTkNFX01BU0tfQUxMOworICAgIHJldHVybiBiY210cl9jYWxsKGRldiwgJmNmZy0+aGRyKTsKK30KKworLyoqIEdldCBpbmRpY2F0aW9uIGNvbmZpZ3VyYXRpb24KKyAqCisgKiBccGFyYW1baW5dICAgZGV2ICAgICBEZXZpY2UgaWQKKyAqIFxwYXJhbVtpbl0gICBjZmcgICAgIENvbmZpZ3VyYXRpb24KKyAqIFxyZXR1cm5zIGVycm9yIGNvZGUKKyAqIFRoZSBlcnJvciBjb2RlIGNhbiBpbmRpY2F0ZSBsb2NhbCBvciByZW1vdGUgZmFpbHVyZQorICovCitiY21vc19lcnJubyBiY21vbHRfYXV0b19jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXYsIGJjbW9sdF9hdXRvX2NmZyAqY2ZnKQoreworICAgIGNmZy0+aGRyLnR5cGUgPSBCQ01PTFRfTVNHX1RZUEVfR0VUOworICAgIGlmIChjZmctPmhkci5wcmVzZW5jZV9tYXNrID09IDApCisgICAgeworICAgICAgICBjZmctPmhkci5wcmVzZW5jZV9tYXNrID0gQkNNT0xUX1BSRVNFTkNFX01BU0tfQUxMOworICAgIH0KKyAgICByZXR1cm4gYmNtdHJfY2FsbChkZXYsICZjZmctPmhkcik7Cit9CisKKy8qKiBTZXQgaW5kaWNhdGlvbiBjb25maWd1cmF0aW9uCisgKgorICogXHBhcmFtW2luXSAgIGRldiAgICAgRGV2aWNlIGlkCisgKiBccGFyYW1baW5dICAgY2ZnICAgICBDb25maWd1cmF0aW9uCisgKiBccmV0dXJucyBlcnJvciBjb2RlCisgKiBUaGUgZXJyb3IgY29kZSBjYW4gaW5kaWNhdGUgbG9jYWwgb3IgcmVtb3RlIGZhaWx1cmUKKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X2F1dG9fY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2LCBiY21vbHRfYXV0b19jZmcgKmNmZykKK3sKKyAgICBjZmctPmhkci50eXBlID0gQkNNT0xUX01TR19UWVBFX1NFVDsKKyAgICByZXR1cm4gYmNtdHJfY2FsbChkZXYsICZjZmctPmhkcik7Cit9CisKKy8qKiBJbnZva2Ugb3BlcmF0aW9uCisgKgorICogXHBhcmFtW2luXSAgIGRldiAgICAgRGV2aWNlIGlkCisgKiBccGFyYW1baW5dICAgb3BlciAgICBPcGVyYXRpb24KKyAqIFxyZXR1cm5zIGVycm9yIGNvZGUKKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X29wZXJfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXYsIGJjbW9sdF9vcGVyICpvcGVyKQoreworICAgIG9wZXItPmhkci50eXBlID0gQkNNT0xUX01TR19UWVBFX1NFVDsKKyAgICByZXR1cm4gYmNtdHJfY2FsbChkZXYsICZvcGVyLT5oZHIpOworfQorCisvKiogU2VuZCBtZXNzYWdlIHRvIE9OVQorICoKKyAqIFxwYXJhbVtpbl0gICBkZXYgICAgIERldmljZSBpZAorICogXHBhcmFtW2luXSAgIG1zZyAgICAgTWVzc2FnZSB0byBiZSBzZW50CisgKiBccmV0dXJucyBlcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9wcm94eV9zZW5kKGJjbW9sdF9kZXZpZCBkZXYsIGJjbW9sdF9wcm94eSAqbXNnKQoreworICAgIG1zZy0+aGRyLnR5cGUgPSBCQ01PTFRfTVNHX1RZUEVfU0VUOworICAgIHJldHVybiBiY210cl9jYWxsKGRldiwgJm1zZy0+aGRyKTsKK30KKworCisvKiAoVW4pUmVnaXN0ZXIgYXV0by9wcm94eSBtZXNzYWdlICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X3J4X2NiX3NldChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfbWd0X2dyb3VwIGdyb3VwLCBiY21vbHRfcnhfY2ZnICpyeF9jZmcpCit7CisgICAgYmNtdHJfaGFuZGxlcl9wYXJtIHRwYXJtID0geworICAgICAgICAuZ3JvdXAgPSBncm91cCwKKyAgICAgICAgLnN1Ymdyb3VwID0gQkNNT0xUX1NVQkdST1VQX0FOWSwKKyAgICB9OworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKyAgICBpbnQgaTsKKworICAgIGlmICghcnhfY2ZnKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworCisgICAgdHBhcm0ub2JqZWN0ID0gcnhfY2ZnLT5vYmpfdHlwZTsKKyAgICB0cGFybS5hcHBfY2IgPSByeF9jZmctPnJ4X2NiOworICAgIHRwYXJtLmZsYWdzID0gcnhfY2ZnLT5mbGFnczsKKyAgICBpZiAocnhfY2ZnLT5mbGFncyA9PSBCQ01PTFRfQVVUT19GTEFHU19ESVNQQVRDSCkKKyAgICAgICAgdHBhcm0ubW9kdWxlID0gcnhfY2ZnLT5tb2R1bGU7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgQkNNVFJfTUFYX0lOU1RBTkNFUyAmJiAhcmM7IGkrKykKKyAgICB7CisgICAgICAgIC8qIFNraXAgaW50ZXJmYWNlcyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgZGVmYXVsdCBtYXNrICovCisgICAgICAgIGlmIChyeF9jZmctPnBvbl9uaV9tYXNrICYmIDAgPT0gKHJ4X2NmZy0+cG9uX25pX21hc2sgJiAoMSA8PCBpKSkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICB0cGFybS5pbnN0YW5jZSA9IGk7CisgICAgICAgIGlmIChyeF9jZmctPnJ4X2NiKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBJZiByZWdpc3RyYXRpb24gb2Ygc3BlY2lmaWMgb2JqZWN0IC0gdW5yZWdpc3RlciB0aGUgb2xkIGhhbmRsZXIgZmlyc3QgKi8KKyAgICAgICAgICAgIGlmIChyeF9jZmctPm9ial90eXBlICE9IEJDTU9MVF9PQkpFQ1RfQU5ZKQorICAgICAgICAgICAgICAgIGJjbXRyX21zZ19oYW5kbGVyX3VucmVnaXN0ZXIoZGV2aWNlLCAmdHBhcm0pOworICAgICAgICAgICAgcmMgPSBiY210cl9tc2dfaGFuZGxlcl9yZWdpc3RlcihkZXZpY2UsICZ0cGFybSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByYyA9IGJjbXRyX21zZ19oYW5kbGVyX3VucmVnaXN0ZXIoZGV2aWNlLCAmdHBhcm0pOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyogKFVuKVJlZ2lzdGVyIGF1dG9ub21vdXMgaW5kaWNhdGlvbiBtZXNzYWdlIGhhbmRsZXIKKyAqCisgKiBccGFyYW1baW5dICAgZGV2ICAgICAgICAgICAgIERldmljZSBpZAorICogXHBhcmFtW2luXSAgIHJ4X2NmZyAgICAgICAgICBSZWNlaXZlIGhhbmRsZXIgY29uZmlndXJhdGlvbgorICogXHJldHVybnMgZXJyb3IgY29kZQorICovCitiY21vc19lcnJubyBiY21vbHRfYXV0b19yeF9jYl9zZXQoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X3J4X2NmZyAqcnhfY2ZnKQoreworICAgIHJldHVybiBiY21vbHRfcnhfY2Jfc2V0KGRldmljZSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCByeF9jZmcpOworfQorCisvKiAoVW4pUmVnaXN0ZXIgcHJveHkgbWVzc2FnZSBoYW5kbGVyCisgKgorICogXHBhcmFtW2luXSAgIGRldiAgICAgICAgICAgICBEZXZpY2UgaWQKKyAqIFxwYXJhbVtpbl0gICByeF9jZmcgICAgICAgICAgUmVjZWl2ZSBoYW5kbGVyIGNvbmZpZ3VyYXRpb24KKyAqIFxyZXR1cm5zIGVycm9yIGNvZGUKKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X3Byb3h5X3J4X2NiX3NldChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfcnhfY2ZnICpyeF9jZmcpCit7CisgICAgcmV0dXJuIGJjbW9sdF9yeF9jYl9zZXQoZGV2aWNlLCBCQ01PTFRfTUdUX0dST1VQX1BST1hZX1JYLCByeF9jZmcpOworfQorCisvKiBHZXQgY29uZmlndXJhdGlvbiBvZiBtdWx0aXBsZSBvYmplY3RzICovCitiY21vc19lcnJubyBiY21vbHRfY2ZnX2dldF9tdWx0aShiY21vbHRfZGV2aWQgZGV2LCBiY21vbHRfY2ZnICpmaWx0ZXIsCisgICAgYmNtb2x0X2ZpbHRlcl9mbGFncyBmaWx0ZXJfZmxhZ3MsIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0KQoreworICAgIGludCBpOworCisgICAgLyogSWYgbWVzc2FnZSBzZXQgYWxyZWFkeSBpbmNsdWRlcyBtZXNzYWdlcyByZWNlaXZlZCBvbiBwcmV2aW91cyBpdGVyYXRpb24gLSByZWxlYXNlIHRoZW0gKi8KKyAgICBmb3IgKGk9MDsgaSA8IG1zZ19zZXQtPm51bV9pbnN0YW5jZXM7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChtc2dfc2V0LT5tc2dbaV0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9tc2dfZnJlZShtc2dfc2V0LT5tc2dbaV0pOworICAgICAgICAgICAgbXNnX3NldC0+bXNnW2ldID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1zZ19zZXQtPmZpbHRlcl9mbGFncyA9IGZpbHRlcl9mbGFnczsKKyAgICBtc2dfc2V0LT5udW1faW5zdGFuY2VzID0gMDsKKyAgICBtc2dfc2V0LT5tb3JlID0gQkNNT1NfRkFMU0U7CisKKyAgICAvKiBTZXQgbXNnX3NldCBpbiBmaWx0ZXIgbWVzc2FnZSBhbmQgc3VibWl0IHJlcXVlc3QqLworICAgIGZpbHRlci0+aGRyLm1zZ19zZXQgPSBtc2dfc2V0OworICAgIGZpbHRlci0+aGRyLnR5cGUgPSBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJOworCisgICAgcmV0dXJuIGJjbXRyX2NhbGwoZGV2LCAmZmlsdGVyLT5oZHIpOworfQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2FwaS9iY21vbHRfYXBpLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvYXBpL2JjbW9sdF9hcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMThiYWM5Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2FwaS9iY21vbHRfYXBpLmgKQEAgLTAsMCArMSw1MjEgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgQkNNT0xUX0FQSV9IXworI2RlZmluZSBCQ01PTFRfQVBJX0hfCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21vbHRfbXNnLmg+CisKKy8qKiBcZGVmZ3JvdXAgYXBpIEJDTTY4NjJ4IEhvc3QgQVBJCisgKgorICogRGF0YSBUeXBlcywgZnVuY3Rpb25zIGFuZCBtYWNyb3MgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgQkNNNjg2MnggZGV2aWNlIG1hbmFnZW1lbnQuCisgKiBAeworICovCisKKy8qKiBcZGVmZ3JvdXAgYXBpX21hY3JvcyBNZXNzYWdlIEFjY2VzcyBNYWNyb3MKKyAqIEB7CisgKi8KKworLyoKKyAqIE1lc3NhZ2UgSW5pdGlhbGl6YXRpb24gTWFjcm9zCisgKi8KKworLyogSW5pdGlhbGl6ZSByZXF1ZXN0LiBJbnRlcm5hbCBtYWNybworICogXHBhcmFtW2luXSAgIF9oICAgICAgTWVzc2FnZSBoZWFkZXIKKyAqIFxwYXJhbVtpbl0gICBfb2JqICAgIE9iamVjdCB0eXBlCisgKiBccGFyYW1baW5dICAgX2dycCAgICBtZXNzYWdlIHR5cGUKKyAqIFxwYXJhbVtpbl0gICBfc3ViZ3JwIG1lc3NhZ2Ugc3ViZ3JvdXAKKyAqLworI2RlZmluZSBfQkNNT0xUX1JFUV9JTklUKF9oLCBfb2JqLCBfZ3JwLCBfc3ViZ3JwKSBcCisgICAgKF9oKS0+aGRyLmRpciA9IEJDTU9MVF9NU0dfRElSX1JFUVVFU1Q7XAorICAgIChfaCktPmhkci5lcnIgPSBCQ01fRVJSX09LO1wKKyAgICAoX2gpLT5oZHIucHJlc2VuY2VfbWFzayA9IDA7XAorICAgIChfaCktPmhkci5vYmpfdHlwZSA9IGJjbW9sdF9vYmpfaWRfICMjIF9vYmo7XAorICAgIChfaCktPmhkci5ncm91cCA9IF9ncnA7XAorICAgIChfaCktPmhkci5zdWJncm91cCA9ICh1aW50MTZfdClfc3ViZ3JwO1wKKyAgICAoX2gpLT5oZHIuY29ycl90YWcgPSAwCisKKy8qKiBJbml0aWFsaXplIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisgKiBccGFyYW1baW5dICAgX3MgICAgICBDb25maWd1cmF0aW9uIHN0cnVjdHVyZQorICogXHBhcmFtW2luXSAgIF9vYmogICAgT2JqZWN0IHR5cGUKKyAqIFxwYXJhbVtpbl0gICBfa2V5ICAgIE9iamVjdCBrZXkKKyAqLworI2RlZmluZSBCQ01PTFRfQ0ZHX0lOSVQoX3MsIF9vYmosIF9rZXkpIFwKKyAgICBkbyB7XAorICAgICAgICBiY21vbHRfICMjIF9vYmogIyMgX2NmZyAqX3hfID0gX3M7XAorICAgICAgICBtZW1zZXQoX3hfLCAwLCBzaXplb2YoKl94XykpO1wKKyAgICAgICAgX0JDTU9MVF9SRVFfSU5JVCgmKChfeF8pLT5oZHIpLCBfb2JqLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCk7XAorICAgICAgICAoX3hfKS0+a2V5ID0gX2tleTtcCisgICAgfSB3aGlsZSAoMCkKKworLyoqIEluaXRpYWxpemUgc3RhdGlzdGljcyBzdHJ1Y3R1cmUKKyAqIFxwYXJhbVtpbl0gICBfcyAgICAgIFN0YXRpc3RpY3Mgc3RydWN0dXJlCisgKiBccGFyYW1baW5dICAgX29iaiAgICBPYmplY3QgdHlwZQorICogXHBhcmFtW2luXSAgIF9rZXkgICAgT2JqZWN0IGtleQorICovCisjZGVmaW5lIEJDTU9MVF9TVEFUX0lOSVQoX3MsIF9vYmosIF9rZXkpIFwKKyAgICBkbyB7XAorICAgICAgICBiY21vbHRfICMjIF9vYmogIyMgX3N0YXQgKl94XyA9IF9zO1wKKyAgICAgICAgbWVtc2V0KF94XywgMCwgc2l6ZW9mKCpfeF8pKTtcCisgICAgICAgIF9CQ01PTFRfUkVRX0lOSVQoJigoX3hfKS0+aGRyKSwgX29iaiwgQkNNT0xUX01HVF9HUk9VUF9TVEFULCAwKTtcCisgICAgICAgIChfeF8pLT5rZXkgPSBfa2V5O1wKKyAgICB9IHdoaWxlICgwKQorCisvKiogSW5pdGlhbGl6ZSBzdGF0aXN0aWMgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyAqIFxwYXJhbVtpbl0gICBfcyAgICAgIFN0YXRpc3RpY3MgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyAqIFxwYXJhbVtpbl0gICBfb2JqICAgIE9iamVjdCB0eXBlCisgKiBccGFyYW1baW5dICAgX3N0YXQgICBTdGF0aXN0aWMgY291bnRlciBuYW1lCisgKiBccGFyYW1baW5dICAgX2tleSAgICBPYmplY3Qga2V5CisgKi8KKyNkZWZpbmUgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoX3MsIF9vYmosIF9zdGF0LCBfa2V5KSBcCisgICAgZG8ge1wKKyAgICAgICAgYmNtb2x0XyAjIyBfb2JqICMjIF9zdGF0X2NmZyAqX3hfID0gX3M7XAorICAgICAgICBtZW1zZXQoX3hfLCAwLCBzaXplb2YoKl94XykpO1wKKyAgICAgICAgX0JDTU9MVF9SRVFfSU5JVCgmKChfeF8pLT5oZHIpLCBfb2JqLCBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHLCBiY21vbHRfICMjIF9vYmogIyMgX3N0YXRfaWRfICMjIF9zdGF0KTtcCisgICAgICAgIChfeF8pLT5rZXkgPSBfa2V5O1wKKyAgICB9IHdoaWxlICgwKQorCisvKiogSW5pdGlhbGl6ZSBpbmRpY2F0aW9uIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisgKiBccGFyYW1baW5dICAgX3MgICAgICBJbmRpY2F0aW9uIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisgKiBccGFyYW1baW5dICAgX29iaiAgICBPYmplY3QgdHlwZQorICogXHBhcmFtW2luXSAgIF9rZXkgICAgT2JqZWN0IGtleQorICovCisjZGVmaW5lIEJDTU9MVF9BVVRPX0NGR19JTklUKF9zLCBfb2JqLCBfa2V5KSBcCisgICAgZG8ge1wKKyAgICAgICAgYmNtb2x0XyAjIyBfb2JqICMjIF9hdXRvX2NmZyAqX3hfID0gX3M7XAorICAgICAgICBtZW1zZXQoX3hfLCAwLCBzaXplb2YoKl94XykpO1wKKyAgICAgICAgX0JDTU9MVF9SRVFfSU5JVCgmKChfeF8pLT5oZHIpLCBfb2JqLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwKTtcCisgICAgICAgIChfeF8pLT5rZXkgPSBfa2V5O1wKKyAgICB9IHdoaWxlICgwKQorCisvKiogSW5pdGlhbGl6ZSBvcGVyYXRpb24gc3RydWN0dXJlCisgKiBccGFyYW1baW5dICAgX3MgICAgICBPcGVyYXRpb24gc3RydWN0dXJlCisgKiBccGFyYW1baW5dICAgX29iaiAgICBPYmplY3QgdHlwZQorICogXHBhcmFtW2luXSAgIF9vcCAgICAgT3BlcmF0aW9uIHR5cGUKKyAqIFxwYXJhbVtpbl0gICBfa2V5ICAgIE9iamVjdCBrZXkKKyAqLworI2RlZmluZSBCQ01PTFRfT1BFUl9JTklUKF9zLCBfb2JqLCBfb3AsIF9rZXkpIFwKKyAgICBkbyB7XAorICAgICAgICBiY21vbHRfICMjIF9vYmogIyMgXyAjIyBfb3AgKl94XyA9IF9zO1wKKyAgICAgICAgbWVtc2V0KF94XywgMCwgc2l6ZW9mKCpfeF8pKTtcCisgICAgICAgIF9CQ01PTFRfUkVRX0lOSVQoJigoX3hfKS0+aGRyKSwgX29iaiwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBiY21vbHRfICMjIF9vYmogIyMgX29wZXJfaWRfICMjIF9vcCk7XAorICAgICAgICAoX3hfKS0+a2V5ID0gX2tleTtcCisgICAgfSB3aGlsZSAoMCkKKworLyoqIEluaXRpYWxpemUgcHJveHkgbWVzc2FnZSBzdHJ1Y3R1cmUKKyAqIFxwYXJhbVtpbl0gICBfcyAgICAgIE9wZXJhdGlvbiBzdHJ1Y3R1cmUKKyAqIFxwYXJhbVtpbl0gICBfb2JqICAgIE9iamVjdCB0eXBlCisgKiBccGFyYW1baW5dICAgX20gICAgICBQcm94eSBtZXNzYWdlIHR5cGUKKyAqIFxwYXJhbVtpbl0gICBfa2V5ICAgIE9iamVjdCBrZXkKKyAqLworI2RlZmluZSBCQ01PTFRfUFJPWFlfSU5JVChfcywgX29iaiwgX20sIF9rZXkpIFwKKyAgICBkbyB7XAorICAgICAgICBiY21vbHRfICMjIF9vYmogIyMgXyAjIyBfbSAqX3hfID0gX3M7XAorICAgICAgICBtZW1zZXQoX3hfLCAwLCBzaXplb2YoKl94XykpO1wKKyAgICAgICAgX0JDTU9MVF9SRVFfSU5JVCgmKChfeF8pLT5oZHIpLCBfb2JqLCBCQ01PTFRfTUdUX0dST1VQX1BST1hZLCBiY21vbHRfICMjIF9vYmogIyMgX3Byb3h5X2lkXyAjIyBfbSk7XAorICAgICAgICAoX3hfKS0+a2V5ID0gX2tleTtcCisgICAgfSB3aGlsZSAoMCkKKworLyoqIEluaXRpYWxpemUgYXV0b25vbW91cyBpbmRpY2F0aW9uIHN0cnVjdHVyZQorICogXHBhcmFtW2luXSAgIF9zICAgICAgQXV0b25vbW91cyBpbmRpY2F0aW9uIHN0cnVjdHVyZQorICogXHBhcmFtW2luXSAgIF9vYmogICAgT2JqZWN0IHR5cGUKKyAqIFxwYXJhbVtpbl0gICBfYXUgICAgIEF1dG9ub21vdXMgaW5kaWNhdGlvbiB0eXBlCisgKi8KKyNkZWZpbmUgQkNNT0xUX0FVVE9fSU5JVChfcywgX29iaiwgX2F1KSBcCisgICAgZG8ge1wKKyAgICAgICAgYmNtb2x0XyAjIyBfb2JqICMjIF8gIyMgX2F1ICpfeF8gPSBfcztcCisgICAgICAgIF9CQ01PTFRfUkVRX0lOSVQoJigoX3hfKS0+aGRyKSwgX29iaiwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCBiY21vbHRfICMjIF9vYmogIyMgX2F1dG9faWRfICMjIF9hdSk7XAorICAgICAgICBfeF8tPmhkci5oZHIuc3ViY2ggPSAwO1wKKyAgICAgICAgX3hfLT5oZHIuaGRyLnByZXNlbmNlX21hc2sgPSAoMVVMTCA8PCAodWludDY0X3QpYmNtb2x0XyAjIyBfb2JqICMjIF8gIyMgX2F1ICMjIF9pZF9hbGxfcHJvcGVydGllcykgLSAxO1wKKyAgICB9IHdoaWxlICgwKQorCisvKiogSW5pdGlhbGl6ZSBwcm94eV9yeCBzdHJ1Y3R1cmUKKyAqIFxwYXJhbVtpbl0gICBfcyAgICAgIFByb3h5IHJ4IG1lc3NhZ2Ugc3RydWN0dXJlCisgKiBccGFyYW1baW5dICAgX29iaiAgICBPYmplY3QgdHlwZQorICogXHBhcmFtW2luXSAgIF9wciAgICAgUHJveHkgbWVzc2FnZSB0eXBlCisgKi8KKyNkZWZpbmUgQkNNT0xUX1BST1hZX1JYX0lOSVQoX3MsIF9vYmosIF9wcikgXAorICAgIGRvIHtcCisgICAgICAgIGJjbW9sdF8gIyMgX29iaiAjIyBfICMjIF9wciAqX3hfID0gX3M7XAorICAgICAgICBfQkNNT0xUX1JFUV9JTklUKCYoKF94XyktPmhkciksIF9vYmosIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFlfUlgsIGJjbW9sdF8gIyMgX29iaiAjIyBfcHJveHlfcnhfaWRfICMjIF9wcik7XAorICAgICAgICBfeF8tPmhkci5oZHIuc3ViY2ggPSAwO1wKKyAgICAgICAgX3hfLT5oZHIuaGRyLnByZXNlbmNlX21hc2sgPSAoMVVMTCA8PCAodWludDY0X3QpYmNtb2x0XyAjIyBfb2JqICMjIF8gIyMgX3ByICMjIF9pZF9hbGxfcHJvcGVydGllcykgLSAxO1wKKyAgICB9IHdoaWxlICgwKQorCisvKiogU2V0IHRoZSBtZW1vcnkgYnVmZmVyIHRvIHVzZSBmb3IgdmFyaWFibGUtc2l6ZWQgbGlzdHMgd2l0aGluIGEgY2ZnIGdldAorKiBccGFyYW1baW5dICAgX3MgICAgICBDb25maWd1cmF0aW9uIHN0cnVjdHVyZQorKiBccGFyYW1baW5dICAgX29iaiAgICBPYmplY3QgdHlwZQorKiBccGFyYW1baW5dICAgX2J1ZiAgICBQb2ludGVyIHRvIGEgbG9jYXRpb24gaW4gbWVtb3J5IGluIHdoaWNoIHRvIHN0b3JlIHRoZSBsaXN0cworKiBccGFyYW1baW5dICAgX2xlbiAgICBMZW5ndGggb2YgdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IF9idWYKKyovCisjZGVmaW5lIEJDTU9MVF9DRkdfTElTVF9CVUZfU0VUKF9zLCBfb2JqLCBfYnVmLCBfbGVuKSBcCisgICAgZG8ge1wKKyAgICAgICAgYmNtb2x0XyAjIyBfb2JqICMjIF9jZmcgKl94XyA9IF9zO1wKKyAgICAgICAgX3hfLT5oZHIuaGRyLmxpc3RfYnVmID0gX2J1ZjtcCisgICAgICAgIF94Xy0+aGRyLmhkci5saXN0X2J1Zl9zaXplID0gX2xlbjtcCisgICAgfSB3aGlsZSAoMCkKKworLyogSW50ZXJuYWwgbWFjcm86IEdldCBhIGJpdG1hc2sgZ2l2ZW4gYSBwcm9wZXJ0eSBJRCBlbnVtICovCisjZGVmaW5lIEJDTU9MVF9QUk9QX01BU0tfR0VUKF9vYmosIF9ncnAsIF9wKSBcCisgICAgKGJjbW9sdF8gIyMgX29iaiAjIyBfZ3JwICMjIF9pZF8gIyMgX3AgPT0gYmNtb2x0XyAjIyBfb2JqICMjIF9ncnAgIyMgX2lkX2FsbF9wcm9wZXJ0aWVzID8gXAorICAgICAgICAoKDFVTEwgPDwgKHVpbnQ2NF90KWJjbW9sdF8gIyMgX29iaiAjIyBfZ3JwICMjIF9pZF8gIyMgX3ApIC0gMSkgOiBcCisgICAgICAgICgxVUxMIDw8ICh1aW50NjRfdCliY21vbHRfICMjIF9vYmogIyMgX2dycCAjIyBfaWRfICMjIF9wKSkKKworLyogSW50ZXJuYWwgbWFjcm86IEluZGljYXRlIHRoYXQgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyBwcmVzZW50ICovCisjZGVmaW5lIF9CQ01PTFRfUFJPUF9TRVRfUFJFU0VOVChfbSwgX29iaiwgX2dycCwgX3ApIFwKKyAgICBkbyB7IFwKKyAgICAgICAgKF9tKS0+aGRyLmhkci5wcmVzZW5jZV9tYXNrIHw9IEJDTU9MVF9QUk9QX01BU0tfR0VUKF9vYmosIF9ncnAsIF9wKTtcCisgICAgfSB3aGlsZSAoMCkKKworLyogSW50ZXJuYWwgbWFjcm86IGNoZWNrIGlmIHByb3BlcnR5IGlzIHByZXNlbnQgKi8KKyNkZWZpbmUgX0JDTU9MVF9QUk9QX0lTX1BSRVNFTlQoX20sIF9vYmosIF9ncnAsIF9wKSBcCisgICAgKCgoX20pLT5oZHIuaGRyLnByZXNlbmNlX21hc2sgJiBCQ01PTFRfUFJPUF9NQVNLX0dFVChfb2JqLCBfZ3JwLCBfcCkpID8gXAorICAgICAgICBCQ01PU19UUlVFIDogQkNNT1NfRkFMU0UpCisKKy8qKiBTZXQgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpbiBtZXNzYWdlIHN0cnVjdHVyZQorICogXHBhcmFtW2luXSAgIF9tICAgICAgQ29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyAqIFxwYXJhbVtpbl0gICBfb2JqICAgIE9iamVjdCB0eXBlCisgKiBccGFyYW1baW5dICAgX3AgICAgICBQcm9wZXJ0eSBuYW1lCisgKiBccGFyYW1baW5dICAgX3YgICAgICBQcm9wZXJ0eSB2YWx1ZQorICovCisjZGVmaW5lIEJDTU9MVF9DRkdfUFJPUF9TRVQoX20sIF9vYmosIF9wLCBfdikgXAorICAgIGRvIHsgXAorICAgICAgICBfQkNNT0xUX1BST1BfU0VUX1BSRVNFTlQoX20sIF9vYmosIF9jZmcsIF9wKTtcCisgICAgICAgIChfbSktPmRhdGEuX3AgPSAoX3YpO1wKKyAgICB9IHdoaWxlICgwKQorCisvKiogSW5kaWNhdGUgdGhhdCBjb25maWd1cmF0aW9uIHByb3BlcnR5IHNob3VsZCBiZSByZWFkCisgKiBccGFyYW1baW5dICAgX20gICAgICBDb25maWd1cmF0aW9uIHN0cnVjdHVyZQorICogXHBhcmFtW2luXSAgIF9vYmogICAgT2JqZWN0IHR5cGUKKyAqIFxwYXJhbVtpbl0gICBfcCAgICAgIFByb3BlcnR5IG5hbWUKKyAqLworI2RlZmluZSBCQ01PTFRfQ0ZHX1BST1BfR0VUKF9tLCBfb2JqLCBfcCkgX0JDTU9MVF9QUk9QX1NFVF9QUkVTRU5UKF9tLCBfb2JqLCBfY2ZnLCBfcCkKKworLyoqIENoZWNrIGlmIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaXMgc2V0IGluIG1lc3NhZ2Ugc3RydWN0dXJlCisgKiBccGFyYW1baW5dICAgX20gICAgICBDb25maWd1cmF0aW9uIHN0cnVjdHVyZQorICogXHBhcmFtW2luXSAgIF9vYmogICAgT2JqZWN0IHR5cGUKKyAqIFxwYXJhbVtpbl0gICBfcCAgICAgIFByb3BlcnR5IG5hbWUKKyAqLworI2RlZmluZSBCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKF9tLCBfb2JqLCBfcCkgICAgX0JDTU9MVF9QUk9QX0lTX1BSRVNFTlQoX20sIF9vYmosIF9jZmcsIF9wKQorCisvKiogSW5kaWNhdGUgdGhhdCBzdGF0aXN0aWMgcHJvcGVydHkgc2hvdWxkIGJlIHJlYWQKKyAqIFxwYXJhbVtpbl0gICBfbSAgICAgIENvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisgKiBccGFyYW1baW5dICAgX29iaiAgICBPYmplY3QgdHlwZQorICogXHBhcmFtW2luXSAgIF9wICAgICAgUHJvcGVydHkgbmFtZQorICovCisjZGVmaW5lIEJDTU9MVF9TVEFUX1BST1BfR0VUKF9tLCBfb2JqLCBfcCkgX0JDTU9MVF9QUk9QX1NFVF9QUkVTRU5UKF9tLCBfb2JqLCBfc3RhdCwgX3ApCisKKy8qKiBDaGVjayBpZiBzdGF0aXN0aWMgcHJvcGVydHkgaXMgc2V0IGluIG1lc3NhZ2Ugc3RydWN0dXJlCisgKiBccGFyYW1baW5dICAgX20gICAgICBTdGF0aXN0aWMgc3RydWN0dXJlCisgKiBccGFyYW1baW5dICAgX29iaiAgICBPYmplY3QgdHlwZQorICogXHBhcmFtW2luXSAgIF9wICAgICAgUHJvcGVydHkgbmFtZQorICovCisjZGVmaW5lIEJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKF9tLCBfb2JqLCBfcCkgICAgX0JDTU9MVF9QUk9QX0lTX1BSRVNFTlQoX20sIF9vYmosIF9zdGF0LCBfcCkKKworLyoqIFNldCBvcGVyYXRpb24gcHJvcGVydHkgaW4gbWVzc2FnZSBzdHJ1Y3R1cmUKKyAqIFxwYXJhbVtpbl0gICBfbSAgICAgIE9wZXJhdGlvbiBzdHJ1Y3R1cmUKKyAqIFxwYXJhbVtpbl0gICBfb2JqICAgIE9iamVjdCB0eXBlCisgKiBccGFyYW1baW5dICAgX29wICAgICBPcGVyYXRpb24KKyAqIFxwYXJhbVtpbl0gICBfcCAgICAgIFByb3BlcnR5IG5hbWUKKyAqIFxwYXJhbVtpbl0gICBfdiAgICAgIFByb3BlcnR5IHZhbHVlCisgKi8KKyNkZWZpbmUgQkNNT0xUX09QRVJfUFJPUF9TRVQoX20sIF9vYmosIF9vcCwgX3AsIF92KSBcCisgICAgZG8geyBcCisgICAgICAgIF9CQ01PTFRfUFJPUF9TRVRfUFJFU0VOVChfbSwgX29iaiwgXyAjIyBfb3AsIF9wKTtcCisgICAgICAgIChfbSktPmRhdGEuX3AgPSAoX3YpO1wKKyAgICB9IHdoaWxlICgwKQorCisvKiogQ2hlY2sgaWYgb3BlcmF0aW9uIHByb3BlcnR5IGlzIHNldCBpbiBtZXNzYWdlIHN0cnVjdHVyZQorKiBccGFyYW1baW5dICAgX20gICAgICBPcGVyYXRpb24gc3RydWN0dXJlCisqIFxwYXJhbVtpbl0gICBfb2JqICAgIE9iamVjdCB0eXBlCisqIFxwYXJhbVtpbl0gICBfb3AgICAgIE9wZXJhdGlvbgorKiBccGFyYW1baW5dICAgX3AgICAgICBQcm9wZXJ0eSBuYW1lCisqLworI2RlZmluZSBCQ01PTFRfT1BFUl9QUk9QX0lTX1NFVChfbSwgX29iaiwgX29wLCBfcCkgICAgX0JDTU9MVF9QUk9QX0lTX1BSRVNFTlQoX20sIF9vYmosIF9vcCwgX3ApCisKKy8qKiBJbmRpY2F0ZSB0aGF0IGF1dG9ub21vdXMgbWVzc2FnZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IHNob3VsZCBiZSByZWFkCisgKiBccGFyYW1baW5dICAgX20gICAgICBDb25maWd1cmF0aW9uIHN0cnVjdHVyZQorICogXHBhcmFtW2luXSAgIF9vYmogICAgT2JqZWN0IHR5cGUKKyAqIFxwYXJhbVtpbl0gICBfcCAgICAgIFByb3BlcnR5IG5hbWUKKyAqLworI2RlZmluZSBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoX20sIF9vYmosIF9wKSBfQkNNT0xUX1BST1BfU0VUX1BSRVNFTlQoX20sIF9vYmosIF9hdXRvX2NmZywgX3ApCisKKy8qKiBTZXQgYXV0b25vbW91cyBtZXNzYWdlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaW4gbWVzc2FnZSBzdHJ1Y3R1cmUKKyAqIFxwYXJhbVtpbl0gICBfbSAgICAgIE9wZXJhdGlvbiBzdHJ1Y3R1cmUKKyAqIFxwYXJhbVtpbl0gICBfb2JqICAgIE9iamVjdCB0eXBlCisgKiBccGFyYW1baW5dICAgX3AgICAgICBQcm9wZXJ0eSBuYW1lCisgKiBccGFyYW1baW5dICAgX3YgICAgICBQcm9wZXJ0eSB2YWx1ZQorICovCisjZGVmaW5lIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVChfbSwgX29iaiwgX3AsIF92KSBcCisgICAgZG8geyBcCisgICAgICAgIF9CQ01PTFRfUFJPUF9TRVRfUFJFU0VOVChfbSwgX29iaiwgX2F1dG9fY2ZnLCBfcCk7XAorICAgICAgICAoX20pLT5kYXRhLl9wID0gKF92KTtcCisgICAgfSB3aGlsZSAoMCkKKworLyoqIENoZWNrIGlmIGF1dG9ub21vdXMgbWVzc2FnZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIHNldCBpbiBtZXNzYWdlIHN0cnVjdHVyZQorKiBccGFyYW1baW5dICAgX20gICAgICBDb25maWd1cmF0aW9uIHN0cnVjdHVyZQorKiBccGFyYW1baW5dICAgX29iaiAgICBPYmplY3QgdHlwZQorKiBccGFyYW1baW5dICAgX3AgICAgICBQcm9wZXJ0eSBuYW1lCisqLworI2RlZmluZSBCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoX20sIF9vYmosIF9wKSBfQkNNT0xUX1BST1BfSVNfUFJFU0VOVChfbSwgX29iaiwgX2F1dG9fY2ZnLCBfcCkKKworLyoqIFNldCBzdGF0aXN0aWMgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpbiBtZXNzYWdlIHN0cnVjdHVyZQorKiBccGFyYW1baW5dICAgX20gICAgICBDb25maWd1cmF0aW9uIHN0cnVjdHVyZQorKiBccGFyYW1baW5dICAgX29iaiAgICBPYmplY3QgdHlwZQorKiBccGFyYW1baW5dICAgX3AgICAgICBQcm9wZXJ0eSBuYW1lCisqIFxwYXJhbVtpbl0gICBfdiAgICAgIFByb3BlcnR5IHZhbHVlCisqLworI2RlZmluZSBCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoX20sIF9vYmosIF9wLCBfdikgXAorICAgIGRvIHsgXAorICAgICAgICBfQkNNT0xUX1BST1BfU0VUX1BSRVNFTlQoX20sIF9vYmosIF9zdGF0X2NmZywgX3ApO1wKKyAgICAgICAgKF9tKS0+ZGF0YS5fcCA9IChfdik7XAorICAgIH0gd2hpbGUgKDApCisKKy8qKiBDaGVjayBpZiBzdGF0aXN0aWMgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyBzZXQgaW4gbWVzc2FnZSBzdHJ1Y3R1cmUKKyogXHBhcmFtW2luXSAgIF9tICAgICAgQ29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyogXHBhcmFtW2luXSAgIF9vYmogICAgT2JqZWN0IHR5cGUKKyogXHBhcmFtW2luXSAgIF9wICAgICAgUHJvcGVydHkgbmFtZQorKi8KKyNkZWZpbmUgQkNNT0xUX1NUQVRfQ0ZHX1BST1BfSVNfU0VUKF9tLCBfb2JqLCBfcCkgX0JDTU9MVF9QUk9QX0lTX1BSRVNFTlQoX20sIF9vYmosIF9zdGF0X2NmZywgX3ApCisKKy8qKiBTZXQgcHJveHkgbWVzc2FnZSBwcm9wZXJ0eSBpbiBtZXNzYWdlIHN0cnVjdHVyZQorICogXHBhcmFtW2luXSAgIF9tICAgICAgQ29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyAqIFxwYXJhbVtpbl0gICBfb2JqICAgIE9iamVjdCB0eXBlCisgKiBccGFyYW1baW5dICAgX2dycCAgICBQcm94eSBtZXNzYWdlIHR5cGUKKyAqIFxwYXJhbVtpbl0gICBfcCAgICAgIFByb3BlcnR5IG5hbWUKKyAqIFxwYXJhbVtpbl0gICBfdiAgICAgIFByb3BlcnR5IHZhbHVlCisgKi8KKyNkZWZpbmUgQkNNT0xUX1BST1hZX1BST1BfU0VUKF9tLCBfb2JqLCBfZ3JwLCBfcCwgX3YpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgX0JDTU9MVF9QUk9QX1NFVF9QUkVTRU5UKF9tLCBfb2JqLCBfICMjIF9ncnAsIF9wKTtcCisgICAgICAgIChfbSktPmRhdGEuX3AgPSAoX3YpO1wKKyAgICB9IHdoaWxlICgwKQorCisvKiogXGRlZmdyb3VwIG11bHRpX2FwaV9mdW5jIE11bHRpLW9iamVjdCBwcm9wZXJ0eSBhY2Nlc3MgbWFjcm9zCisgKiBAeworICovCisKKy8qCisgKiBNYWNyb3MgZm9yIG11bHRpLW9iamVjdCBjb25maWd1cmF0aW9uIGFuZCBzdGF0aXN0aWNzIHJldHJpZXZhbAorICovCisKKy8qIEludGVybmFsIG1hY3JvOiBJbmRpY2F0ZSB0aGF0IGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaXMgcHJlc2VudCAqLworI2RlZmluZSBfQkNNT0xUX01TR1NFVF9QUk9QX1NFVF9QUkVTRU5UKF9zZXQsIF9vYmosIF9ncnAsIF9wKSBcCisgICAgZG8geyBcCisgICAgICAgIChfc2V0KS0+cHJlc2VuY2VfbWFzayB8PSBCQ01PTFRfUFJPUF9NQVNLX0dFVChfb2JqLCBfZ3JwLCBfcCk7XAorICAgIH0gd2hpbGUgKDApCisKKy8qIEludGVybmFsIG1hY3JvOiBjaGVjayBpZiBwcm9wZXJ0eSBpcyBwcmVzZW50ICovCisjZGVmaW5lIF9CQ01PTFRfTVNHU0VUX1BST1BfSVNfUFJFU0VOVChfc2V0LCBfb2JqLCBfZ3JwLCBfcCkgXAorICAgICgoKF9zZXQpLT5wcmVzZW5jZV9tYXNrICYgQkNNT0xUX1BST1BfTUFTS19HRVQoX29iaiwgX2dycCwgX3ApKSA/IFwKKyAgICAgICAgQkNNT1NfVFJVRSA6IEJDTU9TX0ZBTFNFKQorCisvKiogSW5kaWNhdGUgdGhhdCBjb25maWd1cmF0aW9uIHByb3BlcnR5IHNob3VsZCBiZSByZWFkCisgKiBccGFyYW1baW5dICAgX3NldCAgICBNZXNzYWdlIHNldAorICogXHBhcmFtW2luXSAgIF9vYmogICAgT2JqZWN0IHR5cGUKKyAqIFxwYXJhbVtpbl0gICBfcCAgICAgIFByb3BlcnR5IG5hbWUKKyAqLworI2RlZmluZSBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChfc2V0LCBfb2JqLCBfcCkgIF9CQ01PTFRfTVNHU0VUX1BST1BfU0VUX1BSRVNFTlQoX3NldCwgX29iaiwgX2NmZywgX3ApCisKKy8qKiBDaGVjayBpZiBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIHNldCBpbiBtZXNzYWdlIHNldAorICogXHBhcmFtW2luXSAgIF9zZXQgICAgTWVzc2FnZSBzZXQKKyAqIFxwYXJhbVtpbl0gICBfb2JqICAgIE9iamVjdCB0eXBlCisgKiBccGFyYW1baW5dICAgX3AgICAgICBQcm9wZXJ0eSBuYW1lCisgKi8KKyNkZWZpbmUgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQoX3NldCwgX29iaiwgX3ApIF9CQ01PTFRfTVNHU0VUX1BST1BfSVNfUFJFU0VOVChfc2V0LCBfb2JqLCBfY2ZnLCBfcCkKKworLyoqIEluZGljYXRlIHRoYXQgc3RhdGlzdGljIHNob3VsZCBiZSByZWFkCisgKiBccGFyYW1baW5dICAgX3NldCAgICBNZXNzYWdlIHNldAorICogXHBhcmFtW2luXSAgIF9vYmogICAgT2JqZWN0IHR5cGUKKyAqIFxwYXJhbVtpbl0gICBfcCAgICAgIFByb3BlcnR5IG5hbWUKKyAqLworI2RlZmluZSBCQ01PTFRfTVNHU0VUX1NUQVRfUFJPUF9HRVQoX3NldCwgX29iaiwgX3ApICBfQkNNT0xUX01TR1NFVF9QUk9QX1NFVF9QUkVTRU5UKF9zZXQsIF9vYmosIF9zdGF0LCBfcCkKKworLyoqIENoZWNrIGlmIHN0YXRpc3RpYyBwcm9wZXJ0eSBpcyBzZXQgaW4gbWVzc2FnZSBzZXQKKyAqIFxwYXJhbVtpbl0gICBfc2V0ICAgIE1lc3NhZ2Ugc2V0CisgKiBccGFyYW1baW5dICAgX29iaiAgICBPYmplY3QgdHlwZQorICogXHBhcmFtW2luXSAgIF9wICAgICAgUHJvcGVydHkgbmFtZQorICovCisjZGVmaW5lIEJDTU9MVF9NU0dTRVRfU1RBVF9QUk9QX0lTX1NFVChfc2V0LCBfb2JqLCBfcCkgX0JDTU9MVF9NU0dTRVRfUFJPUF9JU19QUkVTRU5UKF9tLCBfb2JqLCBfc3RhdCwgX3ApCisKKy8qKiBAfSAqLworCisvKiogQH0gKi8KKworLyoqIFxkZWZncm91cCBhcGlfZnVuYyBBUEkgRnVuY3Rpb25zCisgKiBAeworICovCisKKy8qCisgKiBBUEkKKyAqLworCit0eXBlZGVmIHZvaWQgKCpzeXN0ZW1fbW9kZV9jaGFuZ2VfY2IpKGJjbW9sdF9kZXZpZCBkZXYpOworCitleHRlcm4gc3lzdGVtX21vZGVfY2hhbmdlX2NiIHNtX2NoYW5nZV9jYjsKKworLyoqIFNldCBDb25maWd1cmF0aW9uCisgKgorICogXHBhcmFtW2luXSAgIGRldiAgICAgRGV2aWNlIGlkCisgKiBccGFyYW1baW5dICAgY2ZnICAgICBDb25maWd1cmF0aW9uCisgKiBccmV0dXJucyBlcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXYsIGJjbW9sdF9jZmcgKmNmZyk7CisKKy8qKiBHZXQgQ29uZmlndXJhdGlvbgorICoKKyAqIFxwYXJhbVtpbl0gICBkZXYgICAgIERldmljZSBpZAorICogXHBhcmFtW2luXSAgIGNmZyAgICAgQ29uZmlndXJhdGlvbgorICogXHJldHVybnMgZXJyb3IgY29kZQorICogVGhlIGVycm9yIGNvZGUgY2FuIGluZGljYXRlIGxvY2FsIG9yIHJlbW90ZSBmYWlsdXJlCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXYsIGJjbW9sdF9jZmcgKmNmZyk7CisKKy8qKiBDbGVhciBDb25maWd1cmF0aW9uCisgKgorICogXHBhcmFtW2luXSAgIGRldiAgICAgRGV2aWNlIGlkCisgKiBccGFyYW1baW5dICAgY2ZnICAgICBDb25maWd1cmF0aW9uCisgKiBccmV0dXJucyBlcnJvciBjb2RlCisgKiBUaGUgZXJyb3IgY29kZSBjYW4gaW5kaWNhdGUgbG9jYWwgb3IgcmVtb3RlIGZhaWx1cmUKKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X2NmZ19jbGVhcihiY21vbHRfZGV2aWQgZGV2LCBiY21vbHRfY2ZnICpjZmcpOworCisvKiogR2V0IFN0YXRpc3RpY3MKKyAqCisgKiBccGFyYW1baW5dICAgZGV2ICAgICBEZXZpY2UgaWQKKyAqIFxwYXJhbVtpbl0gICBzdGF0ICAgIENvbmZpZ3VyYXRpb24KKyAqIFxwYXJhbVtpbl0gICBmbGFncyAgIEZsYWdzCisgKiBccmV0dXJucyBlcnJvciBjb2RlCisgKiBUaGUgZXJyb3IgY29kZSBjYW4gaW5kaWNhdGUgbG9jYWwgb3IgcmVtb3RlIGZhaWx1cmUKKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X3N0YXRfZ2V0KGJjbW9sdF9kZXZpZCBkZXYsIGJjbW9sdF9zdGF0ICpzdGF0LCBiY21vbHRfc3RhdF9mbGFncyBmbGFncyk7CisKKy8qKiBHZXQgU3RhdGlzdGljcyBDb25maWd1cmF0aW9uCisgKgorICogXHBhcmFtW2luXSAgIGRldiAgICAgRGV2aWNlIGlkCisgKiBccGFyYW1baW5dICAgY2ZnICAgICBDb25maWd1cmF0aW9uCisgKiBccmV0dXJucyBlcnJvciBjb2RlCisgKiBUaGUgZXJyb3IgY29kZSBjYW4gaW5kaWNhdGUgbG9jYWwgb3IgcmVtb3RlIGZhaWx1cmUKKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X3N0YXRfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2LCBiY21vbHRfc3RhdF9jZmcgKmNmZyk7CisKKy8qKiBTZXQgU3RhdGlzdGljcyBDb25maWd1cmF0aW9uCisgKgorICogXHBhcmFtW2luXSAgIGRldiAgICAgRGV2aWNlIGlkCisgKiBccGFyYW1baW5dICAgY2ZnICAgICBDb25maWd1cmF0aW9uCisgKiBccmV0dXJucyBlcnJvciBjb2RlCisgKiBUaGUgZXJyb3IgY29kZSBjYW4gaW5kaWNhdGUgbG9jYWwgb3IgcmVtb3RlIGZhaWx1cmUKKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X3N0YXRfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2LCBiY21vbHRfc3RhdF9jZmcgKmNmZyk7CisKKy8qKiBHZXQgSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uCisgKgorICogXHBhcmFtW2luXSAgIGRldiAgICAgRGV2aWNlIGlkCisgKiBccGFyYW1baW5dICAgY2ZnICAgICBDb25maWd1cmF0aW9uCisgKiBccmV0dXJucyBlcnJvciBjb2RlCisgKiBUaGUgZXJyb3IgY29kZSBjYW4gaW5kaWNhdGUgbG9jYWwgb3IgcmVtb3RlIGZhaWx1cmUKKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X2F1dG9fY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2LCBiY21vbHRfYXV0b19jZmcgKmNmZyk7CisKKy8qKiBTZXQgSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uCisgKgorICogXHBhcmFtW2luXSAgIGRldiAgICAgRGV2aWNlIGlkCisgKiBccGFyYW1baW5dICAgY2ZnICAgICBDb25maWd1cmF0aW9uCisgKiBccmV0dXJucyBlcnJvciBjb2RlCisgKiBUaGUgZXJyb3IgY29kZSBjYW4gaW5kaWNhdGUgbG9jYWwgb3IgcmVtb3RlIGZhaWx1cmUKKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X2F1dG9fY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2LCBiY21vbHRfYXV0b19jZmcgKmNmZyk7CisKKy8qKiBTdWJtaXQgT3BlcmF0aW9uCisgKgorICogXHBhcmFtW2luXSAgIGRldiAgICAgRGV2aWNlIGlkCisgKiBccGFyYW1baW5dICAgb3BlciAgICBPcGVyYXRpb24KKyAqIFxyZXR1cm5zIGVycm9yIGNvZGUKKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X29wZXJfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXYsIGJjbW9sdF9vcGVyICpvcGVyKTsKKworLyoqIFNlbmQgTWVzc2FnZSB0byBPTlUKKyAqCisgKiBccGFyYW1baW5dICAgZGV2ICAgICBEZXZpY2UgaWQKKyAqIFxwYXJhbVtpbl0gICBtc2cgICAgIE1lc3NhZ2UgdG8gYmUgc2VudAorICogXHJldHVybnMgZXJyb3IgY29kZQorICovCitiY21vc19lcnJubyBiY21vbHRfcHJveHlfc2VuZChiY21vbHRfZGV2aWQgZGV2LCBiY21vbHRfcHJveHkgKm1zZyk7CisKKy8qKiBSZWNlaXZlIGNhbGxiYWNrIHJlZ2lzdHJhdGlvbiBwYXJhbWV0ZXJzICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfcnhfY2ZnCit7CisgICAgYmNtb2x0X29ial9pZCBvYmpfdHlwZTsgICAgIC8qKjwgT2JqZWN0IHR5cGUuIENhbiBiZSBccmVmIEJDTU9MVF9PQkpFQ1RfQU5ZICovCisgICAgZl9iY21vbHRfbXNnX2hhbmRsZXIgcnhfY2I7IC8qKjwgUmVjZWl2ZSBjYWxsYmFjay4gTlVMTD11bnJlZ2lzdGVyICovCisgICAgYmNtb2x0X2F1dG9fZmxhZ3MgZmxhZ3M7ICAgIC8qKjwgRGlzcGF0Y2ggZmxhZ3MuIFJlY2VpdmUgY2FsbGJhY2sgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBjb250ZXh0IG9mIHJ4IHRhc2sgb3IgYXBwbGljYXRpb24gdGFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRpbmcgb24gdGhlIGZsYWdzICovCisgICAgYmNtb3NfbW9kdWxlX2lkIG1vZHVsZTsgICAgIC8qKjwgVGFyZ2V0IG1vZHVsZSBpZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWxldmFudCBvbmx5IGlmIGZsYWdzID09IEJDTU9MVF9BVVRPX0ZMQUdTX0RJU1BBVENIICovCisgICAgdWludDMyX3QgcG9uX25pX21hc2s7ICAgICAgIC8qKjwgQml0bWFzayBvZiBwb25fbmkgaW50ZXJmYWNlcyB0aGUgcmVnaXN0cmF0aW9uIGFwcGxpZXMgdG8uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMD1hbGwgaW50ZXJmYWNlcy4gRWFjaCBpbnRlcmZhY2UgaXMgaWRlbnRpZmllZCBieSAoMSA8PCBwb25fbmkpIGJpdCAqLworfSBiY21vbHRfcnhfY2ZnOworCisvKiAoVW4pUmVnaXN0ZXIgQXV0b25vbW91cyBJbmRpY2F0aW9uIE1lc3NhZ2UgSGFuZGxlcgorICoKKyAqIFxwYXJhbVtpbl0gICBkZXYgICAgICAgICAgICAgRGV2aWNlIGlkCisgKiBccGFyYW1baW5dICAgcnhfY2ZnICAgICAgICAgIFJlY2VpdmUgaGFuZGxlciBjb25maWd1cmF0aW9uCisgKiBccmV0dXJucyBlcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9hdXRvX3J4X2NiX3NldChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfcnhfY2ZnICpyeF9jZmcpOworCisvKiAoVW4pUmVnaXN0ZXIgUHJveHkgTWVzc2FnZSBIYW5kbGVyCisgKgorICogXHBhcmFtW2luXSAgIGRldiAgICAgICAgICAgICBEZXZpY2UgaWQKKyAqIFxwYXJhbVtpbl0gICByeF9jZmcgICAgICAgICAgUmVjZWl2ZSBoYW5kbGVyIGNvbmZpZ3VyYXRpb24KKyAqIFxyZXR1cm5zIGVycm9yIGNvZGUKKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X3Byb3h5X3J4X2NiX3NldChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfcnhfY2ZnICpyeF9jZmcpOworCisvKiogXGRlZmdyb3VwIG11bHRpX2FwaV9mdW5jIE11bHRpLW9iamVjdCBBUEkgRnVuY3Rpb25zCisgKiBAeworICovCisKKy8qIEdldCBjb25maWd1cmF0aW9uIG9mIG11bHRpcGxlIG9iamVjdHMKKyAqIFxwYXJhbVtpbl0gICAgICAgICAgIG9sdCAgICAgICAgICAgICBEZXZpY2UgaWQKKyAqIFxwYXJhbVtpbl0gICAgICAgICAgIGZpbHRlciAgICAgICAgICBPYmplY3QgZmlsdGVyLiBIZWFkZXIgb2YgZ2VuZXJhdGVkIGJjbW9sdF94eF9jZmcgc3RydWN0dXJlCisgKiBccGFyYW1baW5dICAgICAgICAgICBmaWx0ZXJfZmxhZ3MgICAgT3B0aW9uYWwgZmlsdGVyaW5nIGZsYWdzCisgKiBccGFyYW1baW4sb3V0XSAgICAgICBtc2dfc2V0ICAgICAgICAgTWVzc2FnZSBzZXQKKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X2NmZ19nZXRfbXVsdGkoYmNtb2x0X2RldmlkIG9sdCwgYmNtb2x0X2NmZyAqZmlsdGVyLAorICAgIGJjbW9sdF9maWx0ZXJfZmxhZ3MgZmlsdGVyX2ZsYWdzLCBiY21vbHRfbXNnX3NldCAqbXNnX3NldCk7CisKKy8qKiBAfSAqLworCisvKiogQH0gKi8KKworLyoqIEB9ICovCisKKyNlbmRpZiAvKiBCQ01PTFRfQVBJX0hfICovCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvYXBpL2JjbW9sdF9tc2cuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9hcGkvYmNtb2x0X21zZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZTM5NjEKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvYXBpL2JjbW9sdF9tc2cuYwpAQCAtMCwwICsxLDU1IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbV9kZXZfbG9nLmg+CisjaW5jbHVkZSAiYmNtb2x0X21zZy5oIgorCitiY21vc19lcnJubyBiY21vbHRfbXNnX2VycihiY21vbHRfbXNnICptc2csIGRldl9sb2dfaWQgbG9nX2lkLCBiY21vc19lcnJubyBlcnIsIHVpbnQxNl90IGVycl9maWVsZF9pZHgsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICAgIG1zZy0+ZXJyID0gZXJyOworICAgIG1zZy0+ZXJyX2ZpZWxkX2lkeCA9IGVycl9maWVsZF9pZHg7CisgICAgaWYgKGZtdCkKKyAgICB7CisgICAgICAgIHZhX2xpc3QgYXJnczsKKworICAgICAgICB2YV9zdGFydChhcmdzLCBmbXQpOworICAgICAgICB2c25wcmludGYobXNnLT5lcnJfdGV4dCwgc2l6ZW9mKG1zZy0+ZXJyX3RleHQpIC0gMSwgZm10LCBhcmdzKTsKKyAgICAgICAgdmFfZW5kKGFyZ3MpOworICAgICAgICBzdHJuY2F0KG1zZy0+ZXJyX3RleHQsICJcbiIsIDEpOworI2lmZGVmIEVOQUJMRV9MT0cKKyAgICAgICAgaWYgKGxvZ19pZCAmJiBsb2dfaWQgIT0gREVWX0xPR19JTlZBTElEX0lEKQorICAgICAgICAgICAgYmNtX2Rldl9sb2dfbG9nKGxvZ19pZCwgREVWX0xPR19MRVZFTF9FUlJPUiwgQkNNX0xPR19GTEFHX0NBTExFUl9GTVQsICIlcyIsIG1zZy0+ZXJyX3RleHQpOworI2VuZGlmCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG1zZy0+ZXJyX3RleHRbMF0gPSAwOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2FwaS9iY21vbHRfbXNnLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvYXBpL2JjbW9sdF9tc2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjI0YjI2Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2FwaS9iY21vbHRfbXNnLmgKQEAgLTAsMCArMSwzODUgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgQkNNT0xUX01TR19IXworI2RlZmluZSBCQ01PTFRfTVNHX0hfCisKKyNpbmNsdWRlICJiY21vc19zeXN0ZW0uaCIKKyNpbmNsdWRlICJiY21vbHRfYnVmLmgiCisjaW5jbHVkZSAiYmNtb2x0X21vZGVsX2lkcy5oIgorI2luY2x1ZGUgImJjbV9kZXZfbG9nX3Rhc2suaCIKKworLyoqIFxkZWZncm91cCBcYXBpX2RhdGFfdHlwZXMgRGF0YSBUeXBlcworICogXGluZ3JvdXAgYXBpCisgKiBAeworICovCisKKy8qKiBEZXZpY2UgSUQgKi8KK3R5cGVkZWYgdWludDhfdCBiY21vbHRfZGV2aWQ7CisKKy8qKiBCaXRtYXNrIG9mIGZpZWxkcyB0aGF0IGFyZSBwcmVzZW50IGluIGEgbWVzc2FnZSAqLwordHlwZWRlZiB1aW50NjRfdCBiY21vbHRfcHJlc2VuY2VfbWFzazsKKworLyoqIFByZXNlbmNlIG1hc2sgaW5kaWNhdGluZyBhbGwgZmllbGRzIHByZXNlbnQgKi8KKyNkZWZpbmUgQkNNT0xUX1BSRVNFTkNFX01BU0tfQUxMICgoYmNtb2x0X3ByZXNlbmNlX21hc2spMHhGRkZGRkZGRkZGRkZGRkZGKQorCisvKiogTWVzc2FnZSBkaXJlY3Rpb24gLSByZXF1ZXN0IG9yIHJlc3BvbnNlICovCit0eXBlZGVmIGVudW0gYmNtb2x0X21zZ19kaXIKK3sKKyAgICBCQ01PTFRfTVNHX0RJUl9SRVFVRVNULAorICAgIEJDTU9MVF9NU0dfRElSX1JFU1BPTlNFCit9IGJjbW9sdF9tc2dfZGlyOworCisvKiogTWVzc2FnZSB0eXBlLiBDYW4gYmUgYSBjb21iaW5hdGlvbiBvZiBmbGFncyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9tc2dfdHlwZQoreworICAgIEJDTU9MVF9NU0dfVFlQRV9HRVQgID0gMHgwMSwgICAgICAgIC8qKjwgR2V0OiBjb25maWd1cmF0aW9uIG9yIHN0YXRpc3RpY3MgKi8KKyAgICBCQ01PTFRfTVNHX1RZUEVfU0VUICA9IDB4MDIsICAgICAgICAvKio8IFNldDogQ29uZmlndXJhdGlvbiwgU3RhdGlzdGljcywgQXV0bywgUHJveHkgKi8KKyAgICBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI9IDB4MDQsICAgICAgICAvKio8IENsZWFyOiBjb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX01TR19UWVBFX01VTFRJPSAweDA4LCAgICAgICAgLyoqPCBNdWx0aS1vYmplY3Q6IGNvbmZpZ3VyYXRpb24sIHN0YXRpc3RpY3MgKi8KKworICAgIEJDTU9MVF9NU0dfVFlQRV9HRVRfTVVMVEkgPSBCQ01PTFRfTVNHX1RZUEVfR0VUIHwgQkNNT0xUX01TR19UWVBFX01VTFRJLAorfSBiY21vbHRfbXNnX3R5cGU7CisKKy8qKiBNYW5hZ2VtZW50IGdyb3VwIC0ga2V5LCBjb25maWcsIG9wZXJhdGlvbiwgZXRjICovCit0eXBlZGVmIGVudW0gYmNtb2x0X21ndF9ncm91cAoreworICAgIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAgICAgICAgICAgICAgIC8qKjwga2V5IHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyBvYmplY3QgaW5zdGFuY2UgKi8KKyAgICBCQ01PTFRfTUdUX0dST1VQX0NGRywgICAgICAgICAgICAgICAvKio8IENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfTUdUX0dST1VQX1NUQVQsICAgICAgICAgICAgICAvKio8IFN0YXRpc3RpY3MgKi8KKyAgICBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHLCAgICAgICAgICAvKio8IFN0YXRpc3RpY3MgdGhyZXNob2xkIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfTUdUX0dST1VQX0FVVE8sICAgICAgICAgICAgICAvKio8IEF1dG9ub21vdXMgaW5kaWNhdGlvbnMgKi8KKyAgICBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAgICAgICAgICAvKio8IEF1dG9ub21vdXMgaW5kaWNhdGlvbiBjb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCAgICAgICAgICAgICAgLyoqPCBPcGVyYXRpb25zICovCisgICAgQkNNT0xUX01HVF9HUk9VUF9QUk9YWSwgICAgICAgICAgICAgLyoqPCBNZXNzYWdlcyB0byBPTlUgKi8KKyAgICBCQ01PTFRfTUdUX0dST1VQX1BST1hZX1JYLCAgICAgICAgICAvKio8IE1lc3NhZ2VzIGZyb20gT05VICovCisgICAgQkNNT0xUX01HVF9HUk9VUF9fTlVNX09GCit9IGJjbW9sdF9tZ3RfZ3JvdXA7CisKKy8qKiBBbnkgb2JqZWN0ICovCisjZGVmaW5lIEJDTU9MVF9PQkpFQ1RfQU5ZICAgICAgIChiY21vbHRfb2JqX2lkKTB4ZmZmZgorCisvKiogQW55IGdyb3VwICovCisjZGVmaW5lIEJDTU9MVF9NR1RfR1JPVVBfQU5ZICAgIChiY21vbHRfbWd0X2dyb3VwKTB4ZmZmZgorCisvKiogQW55IHN1Ymdyb3VwICovCisjZGVmaW5lIEJDTU9MVF9TVUJHUk9VUF9BTlkgICAgIDB4ZmZmZgorCisvKiogSW5kaWNhdG9yIHRoYXQgbm8gZmllbGRzIGNvbnRhaW5lZCBlcnJvcnMgKi8KKyNkZWZpbmUgQkNNT0xUX0VSUl9GSUVMRF9OT05FICAgMHhmZmZmCisKKy8qKiBNYXggZXJyb3IgdGV4dCBsZW5ndGggKi8KKyNkZWZpbmUgQkNNT0xUX01BWF9FUlJfVEVYVF9MRU5HVEggICAgICAyNTYKKworLyogVHJhbnNwb3J0IHN1Yi1jaGFubmVsIGhhbmRsZSAqLwordHlwZWRlZiB1aW50MTZfdCBiY21vbHRfc3ViY2hhbm5lbDsKKworLyoqIE1lc3NhZ2Ugc2V0IC0gZm9yIG11bHRpLWluc3RhbmNlIEFQSXMgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9tc2dfc2V0IGJjbW9sdF9tc2dfc2V0OworCisvKiogQ29tbW9uIG1lc3NhZ2UgaGVhZGVyICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbXNnCit7CisgICAgYmNtb2x0X29ial9pZCAgICAgICAgb2JqX3R5cGU7ICAgICAgLyoqPCBPYmplY3QgdHlwZSAqLworICAgIGJjbW9sdF9tZ3RfZ3JvdXAgICAgIGdyb3VwOyAgICAgICAgIC8qKjwgTWFuYWdlbWVudCBncm91cCAqLworICAgIHVpbnQxNl90ICAgICAgICAgICAgIHN1Ymdyb3VwOyAgICAgIC8qKjwgU3ViZ3JvdXA6IGZvciBvcGVyYXRpb25zLCBhdXRvbm9tb3VzIG1lc3NhZ2VzLCBwcm94eSAqLworICAgIGJjbW9sdF9tc2dfdHlwZSAgICAgIHR5cGU7ICAgICAgICAgIC8qKjwgU2V0LCBHZXQsIENsZWFyICovCisgICAgYmNtb2x0X21zZ19kaXIgICAgICAgZGlyOyAgICAgICAgICAgLyoqPCBSZXF1ZXN0L2F1dG9ub21vdXMgb3IgUmVzcG9uc2UgKi8KKyAgICBiY21vc19lcnJubyAgICAgICAgICBlcnI7ICAgICAgICAgICAvKio8IFJlbW90ZSBlcnJvciBjb2RlICovCisgICAgdWludDE2X3QgICAgICAgICAgICAgZXJyX2ZpZWxkX2lkeDsgLyoqPCBJZiBub3QgQkNNT0xUX0VSUl9GSUVMRF9OT05FLCBpbmRleCBvZiBlcnJvbmVvdXMgZmllbGQgd2l0aGluIHN0cnVjdCAqLworICAgIHVpbnQxNl90ICAgICAgICAgICAgIGNvcnJfdGFnOyAgICAgIC8qKjwgQ29ycmVsYXRpb24gdGFnICovCisgICAgYmNtb2x0X3ByZXNlbmNlX21hc2sgcHJlc2VuY2VfbWFzazsgLyoqPCBJbmRpY2F0ZXMgd2hpY2ggcGFyYW1ldGVycyBhcmUgcHJlc2VudCAqLworICAgIGNoYXIgICAgICAgICAgICAgICAgIGVycl90ZXh0W0JDTU9MVF9NQVhfRVJSX1RFWFRfTEVOR1RIXTsgIC8qKjwgRXJyb3IgdGV4dCAtIGlmIGVyciAhPSAwICovCisgICAgLyogVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIGludGVybmFsLiBUaGV5IGFyZSBub3Qgc2VudCBvbiB0aGUgbGluZSAqLworICAgIGJjbW9sdF9zdWJjaGFubmVsICAgIHN1YmNoOyAgICAgICAgIC8qICAgVHJhbnNwb3J0IHN1Yi1jaGFubmVsIHZpYSB3aGljaCB0aGUgbWVzc2FnZSBhcnJpdmVkICovCisgICAgYmNtb3NfbXNnICAgICAgICAgICAgb3NfbXNnOyAgICAgICAgLyogICBJbnRlcm5hbCBPUyBtZXNzYWdlIGZvciBlYXN5IHRhc2sgcm91dGluZyAqLworICAgIHZvaWQgICAgICAgICAgICAgICAgKmxpc3RfYnVmOyAgICAgIC8qICAgTWVtb3J5IGJ1ZmZlciBpbiB3aGljaCB0byBzdG9yZSB2YXJpYWJsZS1zaXplZCBsaXN0cyB3aGVuIHVucGFja2luZyAqLworICAgIHVpbnQzMl90ICAgICAgICAgICAgIGxpc3RfYnVmX3NpemU7IC8qICAgTnVtYmVyIG9mIGJ5dGVzIGluIHRoZSB2YXJpYWJsZS1zaXplZCBsaXN0IGJ1ZmZlciAqLworICAgIGJjbW9sdF9tc2dfc2V0ICAgICAgKm1zZ19zZXQ7ICAgICAgIC8qIE1lc3NhZ2Ugc2V0IHRoZSBtZXNzYWdlIGJlbG9uZ3MgdG8gKi8KK30gYmNtb2x0X21zZzsKKworLyoqIENvbmZpZ3VyYXRpb24gZ3JvdXAgbWVzc2FnZSBoZWFkZXIgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9jZmcKK3sKKyAgICBiY21vbHRfbXNnIGhkcjsgICAgICAgICAgICAgLyoqIENvbW1vbiBoZWFkZXIgKi8KK30gYmNtb2x0X2NmZzsKKworLyoqIFN0YXRpc3RpYyBmbGFncyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNT0xUX1NUQVRfRkxBR1NfTk9ORSAgICAgICAgICA9IDB4MDAwMCwgLyoqPCBObyBzdGF0aXN0aWNzIG9wdGlvbnMgc2V0IChubyBjbGVhciBvbiByZWFkLCBldGMpICovCisgICAgQkNNT0xUX1NUQVRfRkxBR1NfQ0xFQVJfT05fUkVBRCA9IDB4MDAwMSwgLyoqPCBDbGVhciB0aGUgcmVxdWVzdGVkIHN0YXRpc3RpY3MgYXMgcGFydCBvZiB0aGUgcmVhZCBvcGVyYXRpb24gKi8KK30gYmNtb2x0X3N0YXRfZmxhZ3M7CisKKy8qKiBTdGF0aXN0aWNzIGdyb3VwIG1lc3NhZ2UgaGVhZGVyICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfc3RhdAoreworICAgIGJjbW9sdF9tc2cgaGRyOyAgICAgICAgICAgICAvKiogQ29tbW9uIGhlYWRlciAqLworfSBiY21vbHRfc3RhdDsKKworLyoqIFN0YXRpc3RpY3MgY29uZmlndXJhdGlvbiBtZXNzYWdlIGhlYWRlciAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3N0YXRfY2ZnCit7CisgICAgYmNtb2x0X21zZyBoZHI7ICAgICAgICAgICAgIC8qKiBDb21tb24gaGVhZGVyICovCit9IGJjbW9sdF9zdGF0X2NmZzsKKworLyoqIE9wZXJhdGlvbiBncm91cCBtZXNzYWdlIGhlYWRlciAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X29wZXIKK3sKKyAgICBiY21vbHRfbXNnIGhkcjsgICAgICAgICAgICAgLyoqIENvbW1vbiBoZWFkZXIgKi8KK30gYmNtb2x0X29wZXI7CisKKy8qKiBBdXRvbm9tb3VzIG1lc3NhZ2UgaGVhZGVyICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfYXV0bworeworICAgIGJjbW9sdF9tc2cgaGRyOyAgICAgICAgICAgICAvKiogQ29tbW9uIGhlYWRlciAqLworfSBiY21vbHRfYXV0bzsKKworLyoqIEF1dG9ub21vdXMgbWVzc2FnZSBjb25maWd1cmF0aW9uIGhlYWRlciAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2F1dG9fY2ZnCit7CisgICAgYmNtb2x0X21zZyBoZHI7ICAgICAgICAgICAgIC8qKiBDb21tb24gaGVhZGVyICovCit9IGJjbW9sdF9hdXRvX2NmZzsKKworLyoqIE1lc3NhZ2UgaGFuZGxlciAqLwordHlwZWRlZiB2b2lkICgqZl9iY21vbHRfbXNnX2hhbmRsZXIpKGJjbW9sdF9kZXZpZCBvbHQsIGJjbW9sdF9tc2cgKm1zZyk7CisKKy8qKiBBdXRvbm9tb3VzIG1lc3NhZ2UgZmxhZ3MgKi8KK3R5cGVkZWYgZW51bQoreworICAgIEJDTU9MVF9BVVRPX0ZMQUdTX05PTkUgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBJbnZva2UgY2FsbGJhY2sgaW4gY29udGV4dCBvZiBSWCB0YXNrICovCisgICAgQkNNT0xUX0FVVE9fRkxBR1NfRElTUEFUQ0ggID0gMHgwMDAxLCAgICAgICAvKio8IERpc3BhdGNoIG1lc3NhZ2UgdG8gYXBwbGljYXRpb24gbW9kdWxlICovCit9IGJjbW9sdF9hdXRvX2ZsYWdzOworCisvKiogUHJveHkgbWVzc2FnZSBoZWFkZXIgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9wcm94eQoreworICAgIGJjbW9sdF9tc2cgaGRyOyAgICAgICAgICAgICAvKiogQ29tbW9uIGhlYWRlciAqLworfSBiY21vbHRfcHJveHk7CisKKy8qKiBQcm94eSBSWCBtZXNzYWdlIGhlYWRlciAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3Byb3h5X3J4Cit7CisgICAgYmNtb2x0X21zZyBoZHI7ICAgICAgICAgICAgIC8qKiBDb21tb24gaGVhZGVyICovCit9IGJjbW9sdF9wcm94eV9yeDsKKworLyoqIEZpbHRlciBmbGFncyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FID0gMCwKKyAgICBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gPSAweDAwMDAwMDAxICAgIC8qKiBSZXR1cm4gb2JqZWN0cyBOT1Qgc2VsZWN0ZWQgYnkgZmlsdGVyICovCit9IGJjbW9sdF9maWx0ZXJfZmxhZ3M7CisKKy8qIE1lc3NhZ2Ugc2V0ICovCitzdHJ1Y3QgYmNtb2x0X21zZ19zZXQKK3sKKyAgICB1aW50MTZfdCBtYXhfaW5zdGFuY2VzOyAgICAgLyoqPCBNYXggbnVtYmVyIG9mIGluc3RhbmNlcyBpbiB0aGUgc2V0LiBTZXQgd2hlbiBzZXQgaXMgY3JlYXRlZCBhbmQgZG9lc24ndCBjaGFuZ2UgKi8KKyAgICBiY21vbHRfbWd0X2dyb3VwIGdyb3VwOyAgICAgLyoqPCBNYW5hZ2VtZW50IGdyb3VwICovCisgICAgYmNtb2x0X3ByZXNlbmNlX21hc2sgcHJlc2VuY2VfbWFzazsgLyoqPCBJbmRpY2F0ZXMgd2hpY2ggcGFyYW1ldGVycyBzaG91bGQgYmUgZmV0Y2hlZCAqLworICAgIGJjbW9sdF9maWx0ZXJfZmxhZ3MgZmlsdGVyX2ZsYWdzOyAgIC8qKjwgRmlsdGVyIGZsYWdzICovCisKKyAgICAvKiBNdWx0aS1tc2cgQVBJIG91dHB1dCAqLworICAgIHVpbnQxNl90IG51bV9pbnN0YW5jZXM7ICAgICAvKio8IE51bWJlciBvZiBpbnN0YW5jZXMgaW4gdGhlIHNldC4gKi8KKyAgICBiY21vc19ib29sIG1vcmU7ICAgICAgICAgICAgLyoqPCBCQ01PU19UUlVFIGlmIG5vdCBhbGwgaW5zdGFuY2VzIGhhdmUgYmVlbiByZXRyaWV2ZWQgYnkgdGhlIGxhc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZ2V0X211bHRpKCkgY2FsbC4gKi8KKyAgICB2b2lkICpuZXh0X2tleTsgICAgICAgICAgICAgLyoqPCBLZXkgb2YgdGhlIG5leHQgb2JqZWN0IGluc3RhbmNlIGFmdGVyIHRob3NlIHRoYXQgd2VyZSByZXR1cm5lZC4gIE9ubHkgdmFsaWQgaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9yZScgaXMgQkNNT1NfRkFMU0UuICBUcmVhdCB0aGlzIGFzIGEgcG9pbnRlciB0byB0aGUgb2JqZWN0J3Mga2V5IHN0cnVjdC4gIFRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgdXNlZCBmb3Igc3Vic2VxdWVudCBpbnZvY2F0aW9ucyBvZiBiY21vbHRfY2ZnX2dldF9tdWx0aXBsZSgpIGJ5IGNvcHlpbmcgdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludG8gdGhlIGZpbHRlcidzIGtleSBmaWVsZC4gKi8KKyNpZiBkZWZpbmVkKF9fU1REQ19WRVJTSU9OX18pICYmIChfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwpIC8qKjwgQ2hlY2sgd2hldGhlciBDOTkgaXMgc3VwcG9ydGVkICovCisgICAgYmNtb2x0X21zZyAqbXNnW107ICAgICAgICAgIC8qKjwgU2V0IG9mIEFQSSBvYmplY3RzIHJldHVybmVkIGJ5IGJjbW9sdF9jZmdfZ2V0X211bHRpcGxlKCkuICovCisjZWxzZQorICAgIGJjbW9sdF9tc2cgKm1zZ1swXTsgICAgICAgICAgLyoqPCBTZXQgb2YgQVBJIG9iamVjdHMgcmV0dXJuZWQgYnkgYmNtb2x0X2NmZ19nZXRfbXVsdGlwbGUoKS4gKi8KKyNlbmRpZgorfTsKKworLyoqIEB9ICovCisKKworLypsaW50IC1lY2FsbCg2MzMsIGJjbW9sdF9tc2dfZXJyKSAtIDR0aCBhcmd1bWVudCB3aWxsIGJlIGEgc3BlY2lmaWMgZW51bSB0eXBlLCBidXQgbXVzdCBiZSB0cmVhdGVkIGFzIGEgdWludDE2LiAqLworLyoqIFNldCBtZXNzYWdlIGVycm9yLiBDYW5ub3QgYmUgc3RhdGljIGlubGluZSwgYXMgaXQgdXNlcyB2YXJpYWJsZSBhcmd1bWVudCBsaXN0LiAqLworYmNtb3NfZXJybm8gYmNtb2x0X21zZ19lcnIoYmNtb2x0X21zZyAqbXNnLCBkZXZfbG9nX2lkIGxvZ19pZCwgYmNtb3NfZXJybm8gZXJyLCB1aW50MTZfdCBlcnJfZmllbGRfaWR4LCBjb25zdCBjaGFyICpmbXQsIC4uLilfX2F0dHJpYnV0ZV9fKChmb3JtYXQoX19wcmludGZfXywgNSwgNikpKTsKKworLyoqIFdoZXRoZXIgd2UgcGFjayB0aGUgZW50aXJlIHN0cnVjdHVyZSBvZiBhIG1lc3NhZ2UgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfYm9vbCBiY21vbHRfbXNnX3Nob3VsZF9wYWNrX2RhdGEoY29uc3QgYmNtb2x0X21zZyAqbXNnKQoreworICAgIHN3aXRjaCAobXNnLT5ncm91cCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgIGlmICgobXNnLT50eXBlICYgQkNNT0xUX01TR19UWVBFX0dFVCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb3NfYm9vbCBzaG91bGRfcGFjayA9IChtc2ctPmRpciA9PSBCQ01PTFRfTVNHX0RJUl9SRVNQT05TRSk7CisgICAgICAgICAgICAgICAgLyogRm9yIG11bHRpLW1lc3NhZ2UgZ2V0IHJlcXVlc3Qgc2hvdWxkX3BhY2sgbXVzdCBiZSBpbnZlcnRlZCBiZWNhdXNlIHRoZSAxc3QgcGFydAorICAgICAgICAgICAgICAgICAqIG9mIG11bHRpLW9iamVjdCByZXF1ZXN0IGlzIGZpbHRlcgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHJldHVybiAobXNnLT50eXBlICYgQkNNT0xUX01TR19UWVBFX01VTFRJKSA/ICFzaG91bGRfcGFjayA6IHNob3VsZF9wYWNrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoKG1zZy0+dHlwZSAmIEJDTU9MVF9NU0dfVFlQRV9TRVQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAobXNnLT5kaXIgPT0gQkNNT0xUX01TR19ESVJfUkVRVUVTVCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFk6CisgICAgICAgICAgICByZXR1cm4gKG1zZy0+ZGlyID09IEJDTU9MVF9NU0dfRElSX1JFUVVFU1QpOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9Cit9CisKKy8qKiBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgaGVhZGVyIHBvcnRpb24gb2YgYSBtZXNzYWdlICovCitzdGF0aWMgaW5saW5lIGludDMyX3QgYmNtb2x0X21zZ19oZHJfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X21zZyAqbXNnKQoreworICAgIHJldHVybiAxOCArIChtc2ctPmVyciA/IHN0cmxlbihtc2ctPmVycl90ZXh0KSArIDIgOiAwKTsKK30KKworLyoqIFBhY2sgYSBtZXNzYWdlIGhlYWRlciB0byBhIGJ5dGUgc3RyZWFtICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Vycm5vIGJjbW9sdF9tc2dfaGRyX3BhY2soY29uc3QgYmNtb2x0X21zZyAqbXNnLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgYmNtb3NfYm9vbCByZXQ7CisKKyAgICByZXQgPSAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KW1zZy0+b2JqX3R5cGUpOworICAgIHJldCA9IHJldCAmJiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpbXNnLT5ncm91cCk7CisgICAgcmV0ID0gcmV0ICYmIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgbXNnLT5zdWJncm91cCk7CisgICAgcmV0ID0gcmV0ICYmIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCltc2ctPnR5cGUpOworICAgIHJldCA9IHJldCAmJiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpbXNnLT5kaXIpOworICAgIHJldCA9IHJldCAmJiBiY21vbHRfYnVmX3dyaXRlX3MxNihidWYsIChpbnQxNl90KW1zZy0+ZXJyKTsKKyAgICByZXQgPSByZXQgJiYgYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCAodWludDY0X3QpbXNnLT5wcmVzZW5jZV9tYXNrKTsKKyAgICByZXQgPSByZXQgJiYgYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCBtc2ctPmVycl9maWVsZF9pZHgpOworICAgIGlmIChtc2ctPmVycikKKyAgICB7CisgICAgICAgIHVpbnQxNl90IGxlbiA9IHN0cmxlbihtc2ctPmVycl90ZXh0KTsKKyAgICAgICAgcmV0ID0gcmV0ICYmIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgbGVuKTsKKyAgICAgICAgcmV0ID0gcmV0ICYmIGJjbW9sdF9idWZfd3JpdGUoYnVmLCBtc2ctPmVycl90ZXh0LCBsZW4pOworICAgIH0KKworICAgIHJldHVybiByZXQgPyBCQ01fRVJSX09LIDogQkNNX0VSUl9PVkVSRkxPVzsKK30KKworLyoqIFVucGFjayBhIG1lc3NhZ2UgaGVhZGVyIGZyb20gYSBieXRlIHN0cmVhbSAqLworc3RhdGljIGlubGluZSBiY21vc19lcnJubyBiY21vbHRfbXNnX2hkcl91bnBhY2soYmNtb2x0X21zZyAqbXNnLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCAgICBvYmpfdHlwZTsKKyAgICB1aW50OF90ICAgIGdyb3VwOworICAgIHVpbnQxNl90ICAgc3ViZ3JvdXA7CisgICAgdWludDhfdCAgICB0eXBlOworICAgIHVpbnQ4X3QgICAgZGlyOworICAgIGludDE2X3QgICAgZXJyID0gMDsKKyAgICB1aW50NjRfdCAgIHByZXNlbmNlX21hc2s7CisgICAgdWludDE2X3QgICBlcnJfZmllbGRfaWR4OworICAgIGJjbW9zX2Jvb2wgcmV0OworCisgICAgcmV0ID0gICAgICAgIGJjbW9sdF9idWZfcmVhZF91OChidWYsICZvYmpfdHlwZSk7CisgICAgcmV0ID0gcmV0ICYmIGJjbW9sdF9idWZfcmVhZF91OChidWYsICZncm91cCk7CisgICAgcmV0ID0gcmV0ICYmIGJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmc3ViZ3JvdXApOworICAgIHJldCA9IHJldCAmJiBiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdHlwZSk7CisgICAgcmV0ID0gcmV0ICYmIGJjbW9sdF9idWZfcmVhZF91OChidWYsICZkaXIpOworICAgIHJldCA9IHJldCAmJiBiY21vbHRfYnVmX3JlYWRfczE2KGJ1ZiwgJmVycik7CisgICAgcmV0ID0gcmV0ICYmIGJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmcHJlc2VuY2VfbWFzayk7CisgICAgcmV0ID0gcmV0ICYmIGJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmZXJyX2ZpZWxkX2lkeCk7CisgICAgaWYgKGVycikKKyAgICB7CisgICAgICAgIHVpbnQxNl90IGxlbiA9IDA7CisgICAgICAgIHJldCA9IHJldCAmJiBiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJmxlbik7CisgICAgICAgIGlmIChsZW4gPj0gc2l6ZW9mKG1zZy0+ZXJyX3RleHQpKQorICAgICAgICAgICAgbGVuID0gc2l6ZW9mKG1zZy0+ZXJyX3RleHQpIC0gMTsKKyAgICAgICAgcmV0ID0gcmV0ICYmIGJjbW9sdF9idWZfcmVhZChidWYsIG1zZy0+ZXJyX3RleHQsIGxlbik7CisgICAgICAgIG1zZy0+ZXJyX3RleHRbbGVuXSA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG1zZy0+ZXJyX3RleHRbMF0gPSAwOworICAgIH0KKworICAgIGlmIChyZXQpCisgICAgeworICAgICAgICBtc2ctPm9ial90eXBlID0gKGJjbW9sdF9vYmpfaWQpb2JqX3R5cGU7CisgICAgICAgIG1zZy0+Z3JvdXAgPSAoYmNtb2x0X21ndF9ncm91cClncm91cDsKKyAgICAgICAgbXNnLT5zdWJncm91cCA9IHN1Ymdyb3VwOworICAgICAgICBtc2ctPnR5cGUgPSAoYmNtb2x0X21zZ190eXBlKXR5cGU7CisgICAgICAgIG1zZy0+ZGlyID0gKGJjbW9sdF9tc2dfZGlyKWRpcjsKKyAgICAgICAgbXNnLT5lcnIgPSAoYmNtb3NfZXJybm8pZXJyOworICAgICAgICBtc2ctPnByZXNlbmNlX21hc2sgPSAoYmNtb2x0X3ByZXNlbmNlX21hc2spcHJlc2VuY2VfbWFzazsKKyAgICAgICAgbXNnLT5lcnJfZmllbGRfaWR4ID0gZXJyX2ZpZWxkX2lkeDsKKyAgICAgICAgbXNnLT5tc2dfc2V0ID0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0ID8gQkNNX0VSUl9PSyA6IEJDTV9FUlJfT1ZFUkZMT1c7Cit9CisKKy8qIENyZWF0ZSBtZXNzYWdlIHNldAorICoKKyAqIFxwYXJhbVtpbl0gICBvYmogICAgICAgICAgICAgT2JqZWN0IGlkCisgKiBccGFyYW1baW5dICAgZ3JvdXAgICAgICAgICAgIE1hbmFnZW1lbnQgZ3JvdXAKKyAqIFxwYXJhbVtpbl0gICBtYXhfaW5zdGFuY2VzICAgTWF4IG51bWJlciBvZiBvYmplY3RzIHJldHVybmVkIGJ5IGEgc2luZ2xlIEFQSSBjYWxsCisgKiBccGFyYW1bb3V0XSAgbXNnX3NldCAgICAgICAgIE1lc3NhZ2Ugc2V0CisgKiBccmV0dXJucyBlcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9tc2dfc2V0X2FsbG9jKGJjbW9sdF9vYmpfaWQgb2JqLCBiY21vbHRfbWd0X2dyb3VwIGdyb3VwLAorICAgIHVpbnQzMl90IG1heF9pbnN0YW5jZXMsIGJjbW9sdF9tc2dfc2V0ICoqbXNnX3NldCk7CisKKy8qIFJlbGVhc2UgbWVzc2FnZSBzZXQKKyAqIFxwYXJhbVtpbl0gICBtc2dfc2V0CisgKi8KK3ZvaWQgYmNtb2x0X21zZ19zZXRfZnJlZShiY21vbHRfbXNnX3NldCAqbXNnX3NldCk7CisKKy8qIFJlbGVhc2UgZHluYW1pY2FsbHkgYWxsb2NhdGVkIG1lc3NhZ2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBiY21vbHRfbXNnX2ZyZWUoYmNtb2x0X21zZyAqbXNnKQoreworICAgIGlmIChtc2ctPm1zZ19zZXQpCisgICAgeworICAgICAgICBiY21vbHRfbXNnX3NldF9mcmVlKG1zZy0+bXNnX3NldCk7CisgICAgfQorICAgIGJjbW9zX2ZyZWUobXNnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJjbW9sdF9vc19tc2dfcmVsZWFzZV9jYihiY21vc19tc2cgKm9zX21zZykKK3sKKyAgICBiY21vbHRfbXNnICptc2cgPSBvc19tc2ctPmRhdGE7CisKKyAgICAvKiBXZSBjYW4gYmUgaGVyZSBpZiB0YXJnZXQgbW9kdWxlIG9yIHRyYW5zcG9ydCBxdWV1ZSBvdmVyZmxvd3MuCisgICAgICAgUmVsZWFzZSB0aGUgbWVzc2FnZQorICAgICovCisgICAgYmNtb2x0X21zZ19mcmVlKG1zZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYmNtb3NfbW9kdWxlX2lkIGJjbW9zX21vZHVsZV9pZF9mb3JfZGV2aWNlKGJjbW9zX21vZHVsZV9pZCBtb2R1bGUsIGJjbW9sdF9kZXZpZCBkZXZpZCkKK3sKKyAgICByZXR1cm4gbW9kdWxlICsgKGJjbW9zX21vZHVsZV9pZClkZXZpZDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2NvbW1vbl9ncG9uL01ha2VmaWxlIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2NvbW1vbl9ncG9uL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNGU1YTAKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvY29tbW9uX2dwb24vTWFrZWZpbGUKQEAgLTAsMCArMSwxMSBAQAorIyBHUE9OIEdlbmVyYWwKKworTU9EX05BTUUgPSBjb21tb25fZ3BvbgorTU9EX1RZUEUgPSBsaWIKK01PRF9ERVBTID0gbW9kZWwgY2xpCisKK0VYVFJBX0NGTEFHUyArPSAtSSQoVE9QX0RJUikvY29tbW9uL21vZGVsL21hcGxlIFwKKy1JJChUT1BfRElSKS9jb21tb24vdHJhbnNwb3J0L2RyaXZlci9tYXBsZS9wY2llX3N3X3F1ZXVlIFwKKy1JJChUT1BfRElSKS9jb21tb24vZHJpdmVycy9tYXBsZS9wY2llCisKK3NyY3MgPSBiY21fY29tbW9uX2dwb24uYwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2NvbW1vbl9ncG9uL2JjbV9jb21tb25fZ3Bvbi5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2NvbW1vbl9ncG9uL2JjbV9jb21tb25fZ3Bvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZTNhMWIKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvY29tbW9uX2dwb24vYmNtX2NvbW1vbl9ncG9uLmMKQEAgLTAsMCArMSwyNjIgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTQ6cHJvcHJpZXRhcnk6c3RhbmRhcmQKKworICAgQ29weXJpZ2h0IChjKSAyMDE0IEJyb2FkY29tIENvcnBvcmF0aW9uCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1RoaXMgcHJvZ3JhbSBpcyB0aGUgcHJvcHJpZXRhcnkgc29mdHdhcmUgb2YgQnJvYWRjb20gQ29ycG9yYXRpb24gYW5kL29yIGl0cworbGljZW5zb3JzLCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgZHVwbGljYXRlZCwgbW9kaWZpZWQgb3IgZGlzdHJpYnV0ZWQgcHVyc3VhbnQKK3RvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiBhIHNlcGFyYXRlLCB3cml0dGVuIGxpY2Vuc2UgYWdyZWVtZW50IGV4ZWN1dGVkCitiZXR3ZWVuIHlvdSBhbmQgQnJvYWRjb20gKGFuICJBdXRob3JpemVkIExpY2Vuc2UiKS4gIEV4Y2VwdCBhcyBzZXQgZm9ydGggaW4KK2FuIEF1dGhvcml6ZWQgTGljZW5zZSwgQnJvYWRjb20gZ3JhbnRzIG5vIGxpY2Vuc2UgKGV4cHJlc3Mgb3IgaW1wbGllZCksIHJpZ2h0Cit0byB1c2UsIG9yIHdhaXZlciBvZiBhbnkga2luZCB3aXRoIHJlc3BlY3QgdG8gdGhlIFNvZnR3YXJlLCBhbmQgQnJvYWRjb20KK2V4cHJlc3NseSByZXNlcnZlcyBhbGwgcmlnaHRzIGluIGFuZCB0byB0aGUgU29mdHdhcmUgYW5kIGFsbCBpbnRlbGxlY3R1YWwKK3Byb3BlcnR5IHJpZ2h0cyB0aGVyZWluLiAgSUYgWU9VIEhBVkUgTk8gQVVUSE9SSVpFRCBMSUNFTlNFLCBUSEVOIFlPVSBIQVZFCitOTyBSSUdIVCBUTyBVU0UgVEhJUyBTT0ZUV0FSRSBJTiBBTlkgV0FZLCBBTkQgU0hPVUxEIElNTUVESUFURUxZIE5PVElGWQorQlJPQURDT00gQU5EIERJU0NPTlRJTlVFIEFMTCBVU0UgT0YgVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgZXhwcmVzc2x5IHNldCBmb3J0aCBpbiB0aGUgQXV0aG9yaXplZCBMaWNlbnNlLAorCisxLiBUaGlzIHByb2dyYW0sIGluY2x1ZGluZyBpdHMgc3RydWN0dXJlLCBzZXF1ZW5jZSBhbmQgb3JnYW5pemF0aW9uLAorICAgIGNvbnN0aXR1dGVzIHRoZSB2YWx1YWJsZSB0cmFkZSBzZWNyZXRzIG9mIEJyb2FkY29tLCBhbmQgeW91IHNoYWxsIHVzZQorICAgIGFsbCByZWFzb25hYmxlIGVmZm9ydHMgdG8gcHJvdGVjdCB0aGUgY29uZmlkZW50aWFsaXR5IHRoZXJlb2YsIGFuZCB0bworICAgIHVzZSB0aGlzIGluZm9ybWF0aW9uIG9ubHkgaW4gY29ubmVjdGlvbiB3aXRoIHlvdXIgdXNlIG9mIEJyb2FkY29tCisgICAgaW50ZWdyYXRlZCBjaXJjdWl0IHByb2R1Y3RzLgorCisyLiBUTyBUSEUgTUFYSU1VTSBFWFRFTlQgUEVSTUlUVEVEIEJZIExBVywgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIKKyAgICBBTkQgV0lUSCBBTEwgRkFVTFRTIEFORCBCUk9BRENPTSBNQUtFUyBOTyBQUk9NSVNFUywgUkVQUkVTRU5UQVRJT05TIE9SCisgICAgV0FSUkFOVElFUywgRUlUSEVSIEVYUFJFU1MsIElNUExJRUQsIFNUQVRVVE9SWSwgT1IgT1RIRVJXSVNFLCBXSVRICisgICAgUkVTUEVDVCBUTyBUSEUgU09GVFdBUkUuICBCUk9BRENPTSBTUEVDSUZJQ0FMTFkgRElTQ0xBSU1TIEFOWSBBTkQKKyAgICBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIFRJVExFLCBNRVJDSEFOVEFCSUxJVFksIE5PTklORlJJTkdFTUVOVCwKKyAgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgTEFDSyBPRiBWSVJVU0VTLCBBQ0NVUkFDWSBPUgorICAgIENPTVBMRVRFTkVTUywgUVVJRVQgRU5KT1lNRU5ULCBRVUlFVCBQT1NTRVNTSU9OIE9SIENPUlJFU1BPTkRFTkNFCisgICAgVE8gREVTQ1JJUFRJT04uIFlPVSBBU1NVTUUgVEhFIEVOVElSRSBSSVNLIEFSSVNJTkcgT1VUIE9GIFVTRSBPUgorICAgIFBFUkZPUk1BTkNFIE9GIFRIRSBTT0ZUV0FSRS4KKworMy4gVE8gVEhFIE1BWElNVU0gRVhURU5UIFBFUk1JVFRFRCBCWSBMQVcsIElOIE5PIEVWRU5UIFNIQUxMIEJST0FEQ09NIE9SCisgICAgSVRTIExJQ0VOU09SUyBCRSBMSUFCTEUgRk9SIChpKSBDT05TRVFVRU5USUFMLCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICAgIElORElSRUNULCBPUiBFWEVNUExBUlkgREFNQUdFUyBXSEFUU09FVkVSIEFSSVNJTkcgT1VUIE9GIE9SIElOIEFOWQorICAgIFdBWSBSRUxBVElORyBUTyBZT1VSIFVTRSBPRiBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBTT0ZUV0FSRSBFVkVOCisgICAgSUYgQlJPQURDT00gSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTOworICAgIE9SIChpaSkgQU5ZIEFNT1VOVCBJTiBFWENFU1MgT0YgVEhFIEFNT1VOVCBBQ1RVQUxMWSBQQUlEIEZPUiBUSEUKKyAgICBTT0ZUV0FSRSBJVFNFTEYgT1IgVS5TLiAkMSwgV0hJQ0hFVkVSIElTIEdSRUFURVIuIFRIRVNFIExJTUlUQVRJT05TCisgICAgU0hBTEwgQVBQTFkgTk9UV0lUSFNUQU5ESU5HIEFOWSBGQUlMVVJFIE9GIEVTU0VOVElBTCBQVVJQT1NFIE9GIEFOWQorICAgIExJTUlURUQgUkVNRURZLgorOj4KKyovCisjaW5jbHVkZSAiYmNtX2NvbW1vbl9ncG9uLmgiCisKK3N0YXRpYyBwb25fbW9kZV9kYiBkYl9ncG9uID0KK3sKKyAgICAucG9uX21vZGUgPSBCQ01PTFRfUE9OX01PREVfR1BPTiwKKyAgICAuYXBpX3R5cGUgPSBCQ01PTFRfUE9OX0FQSV9UWVBFX0dQT04sCisgICAgLm51bV9vZl9vbnVzID0gR1BPTl9OVU1fT0ZfT05VUywKKyAgICAubnVtX29mX2FsbG9jX2lkcyA9IEdQT05fTlVNX09GX0FMTE9DX0lEUywKKyAgICAubnVtX29mX2R5bmFtaWNfYWxsb2NfaW5kaWNlcyA9IEdQT05fTlVNX09GX0RZTkFNSUNfQUxMT0NfSU5ESUNFUywKKyAgICAubnVtX29mX2dlbV9wb3J0cyA9IEdQT05fTlVNX09GX0dFTV9QT1JUX0lEU19QRVJfUE9OLAorICAgIC5udW1fb2ZfYWxsb2NfaWRzX3Blcl9vbnUgPSBHUE9OX05VTV9PRl9BTExPQ19JRFNfUEVSX09OVSwKKyAgICAub251X2lkX2Jyb2FkY2FzdCA9IEdQT05fT05VX0lEX0JST0FEQ0FTVCwKKyAgICAub251X2lkX3VuYXNzaWduZWQgPSBHUE9OX09OVV9JRF9VTkFTU0lHTkVELAorICAgIC5hbGxvY19pZF9icm9hZGNhc3QgPSBHUE9OX0FMTE9DX0lEX0JST0FEQ0FTVCwKKyAgICAuYWxsb2NfaWRfaW52YWxpZCA9IEJDTU9MVF9HUE9OX0FMTE9DX0lEX0lOVkFMSUQsCisgICAgLmFsbG9jX2lkX3VuYXNzaWduZWQgPSBHUE9OX0FMTE9DX0lEX1VOQVNTSUdORUQsCisgICAgLnVzX3JhdGUgPSBCQ01PTFRfUE9OX1VTX1JBVEVfMUcsCit9OworCitzdGF0aWMgcG9uX21vZGVfZGIgZGJfeGdwb24gPQoreworICAgIC5wb25fbW9kZSA9IEJDTU9MVF9QT05fTU9ERV9YR1BPTiwKKyAgICAuYXBpX3R5cGUgPSBCQ01PTFRfUE9OX0FQSV9UWVBFX1hHUE9OLAorICAgIC5udW1fb2Zfb251cyA9IFhHUE9OX05VTV9PRl9PTlVTLAorICAgIC5udW1fb2ZfYWxsb2NfaWRzID0gWEdQT05fTlVNX09GX0FMTE9DX0lEUywKKyAgICAubnVtX29mX2R5bmFtaWNfYWxsb2NfaW5kaWNlcyA9IFhHUE9OX05VTV9PRl9EWU5BTUlDX0FMTE9DX0lORElDRVMsCisgICAgLm51bV9vZl9nZW1fcG9ydHMgPSBYR1BPTl9OVU1fT0ZfR0VNX1BPUlRfSURTX1BFUl9QT04sCisgICAgLm51bV9vZl9hbGxvY19pZHNfcGVyX29udSA9IFhHUE9OX05VTV9PRl9BTExPQ19JRFNfUEVSX09OVSwKKyAgICAub251X2lkX2Jyb2FkY2FzdCA9IFhHUE9OX09OVV9JRF9CUk9BRENBU1QsCisgICAgLm9udV9pZF91bmFzc2lnbmVkID0gWEdQT05fT05VX0lEX1VOQVNTSUdORUQsCisgICAgLmFsbG9jX2lkX2Jyb2FkY2FzdCA9IFhHUE9OX0FMTE9DX0lEX0JST0FEQ0FTVCwKKyAgICAuYWxsb2NfaWRfaW52YWxpZCA9IEJDTU9MVF9YR1BPTl9BTExPQ19JRF9JTlZBTElELAorICAgIC5hbGxvY19pZF91bmFzc2lnbmVkID0gWEdQT05fQUxMT0NfSURfVU5BU1NJR05FRCwKKyAgICAudXNfcmF0ZSA9IEJDTU9MVF9QT05fVVNfUkFURV8yUDVHLAorfTsKKworc3RhdGljIHBvbl9tb2RlX2RiIGRiX3hncyA9Cit7CisgICAgLnBvbl9tb2RlID0gQkNNT0xUX1BPTl9NT0RFX1hHUywKKyAgICAuYXBpX3R5cGUgPSBCQ01PTFRfUE9OX0FQSV9UWVBFX1hHUE9OLAorICAgIC5udW1fb2Zfb251cyA9IFhHUE9OX05VTV9PRl9PTlVTLAorICAgIC5udW1fb2ZfYWxsb2NfaWRzID0gWEdQT05fTlVNX09GX0FMTE9DX0lEUywKKyAgICAubnVtX29mX2R5bmFtaWNfYWxsb2NfaW5kaWNlcyA9IFhHUE9OX05VTV9PRl9EWU5BTUlDX0FMTE9DX0lORElDRVMsCisgICAgLm51bV9vZl9nZW1fcG9ydHMgPSBYR1BPTl9OVU1fT0ZfR0VNX1BPUlRfSURTX1BFUl9QT04sCisgICAgLm51bV9vZl9hbGxvY19pZHNfcGVyX29udSA9IFhHUE9OX05VTV9PRl9BTExPQ19JRFNfUEVSX09OVSwKKyAgICAub251X2lkX2Jyb2FkY2FzdCA9IFhHUE9OX09OVV9JRF9CUk9BRENBU1QsCisgICAgLm9udV9pZF91bmFzc2lnbmVkID0gWEdQT05fT05VX0lEX1VOQVNTSUdORUQsCisgICAgLmFsbG9jX2lkX2Jyb2FkY2FzdCA9IFRFTl9HSUdfQUxMT0NfSURfQlJPQURDQVNULAorICAgIC5hbGxvY19pZF9pbnZhbGlkID0gQkNNT0xUX1hHUE9OX0FMTE9DX0lEX0lOVkFMSUQsCisgICAgLmFsbG9jX2lkX3VuYXNzaWduZWQgPSBYR1BPTl9BTExPQ19JRF9VTkFTU0lHTkVELAorICAgIC51c19yYXRlID0gQkNNT0xUX1BPTl9VU19SQVRFXzEwRywKK307CisKK3N0YXRpYyBwb25fbW9kZV9kYiBkYl9uZ3BvbjIgPQoreworICAgIC5wb25fbW9kZSA9IEJDTU9MVF9QT05fTU9ERV9OR1BPTjIsCisgICAgLmFwaV90eXBlID0gQkNNT0xUX1BPTl9BUElfVFlQRV9YR1BPTiwKKyAgICAubnVtX29mX29udXMgPSBYR1BPTl9OVU1fT0ZfT05VUywKKyAgICAubnVtX29mX2FsbG9jX2lkcyA9IFhHUE9OX05VTV9PRl9BTExPQ19JRFMsCisgICAgLm51bV9vZl9keW5hbWljX2FsbG9jX2luZGljZXMgPSBYR1BPTl9OVU1fT0ZfRFlOQU1JQ19BTExPQ19JTkRJQ0VTLAorICAgIC5udW1fb2ZfZ2VtX3BvcnRzID0gWEdQT05fTlVNX09GX0dFTV9QT1JUX0lEU19QRVJfUE9OLAorICAgIC5udW1fb2ZfYWxsb2NfaWRzX3Blcl9vbnUgPSBYR1BPTl9OVU1fT0ZfQUxMT0NfSURTX1BFUl9PTlUsCisgICAgLm9udV9pZF9icm9hZGNhc3QgPSBYR1BPTl9PTlVfSURfQlJPQURDQVNULAorICAgIC5vbnVfaWRfdW5hc3NpZ25lZCA9IFhHUE9OX09OVV9JRF9VTkFTU0lHTkVELAorICAgIC5hbGxvY19pZF9icm9hZGNhc3QgPSBURU5fR0lHX0FMTE9DX0lEX0JST0FEQ0FTVCwKKyAgICAuYWxsb2NfaWRfaW52YWxpZCA9IEJDTU9MVF9YR1BPTl9BTExPQ19JRF9JTlZBTElELAorICAgIC5hbGxvY19pZF91bmFzc2lnbmVkID0gWEdQT05fQUxMT0NfSURfVU5BU1NJR05FRCwKKyAgICAudXNfcmF0ZSA9IEJDTU9MVF9QT05fVVNfUkFURV8xMEcsCit9OworCitzdGF0aWMgcG9uX21vZGVfZGIgZGJfbmdwb24yXzJfNV9nID0KK3sKKyAgICAucG9uX21vZGUgPSBCQ01PTFRfUE9OX01PREVfTkdQT04yLAorICAgIC5hcGlfdHlwZSA9IEJDTU9MVF9QT05fQVBJX1RZUEVfWEdQT04sCisgICAgLm51bV9vZl9vbnVzID0gWEdQT05fTlVNX09GX09OVVMsCisgICAgLm51bV9vZl9hbGxvY19pZHMgPSBYR1BPTl9OVU1fT0ZfQUxMT0NfSURTLAorICAgIC5udW1fb2ZfZHluYW1pY19hbGxvY19pbmRpY2VzID0gWEdQT05fTlVNX09GX0RZTkFNSUNfQUxMT0NfSU5ESUNFUywKKyAgICAubnVtX29mX2dlbV9wb3J0cyA9IFhHUE9OX05VTV9PRl9HRU1fUE9SVF9JRFNfUEVSX1BPTiwKKyAgICAubnVtX29mX2FsbG9jX2lkc19wZXJfb251ID0gWEdQT05fTlVNX09GX0FMTE9DX0lEU19QRVJfT05VLAorICAgIC5vbnVfaWRfYnJvYWRjYXN0ID0gWEdQT05fT05VX0lEX0JST0FEQ0FTVCwKKyAgICAub251X2lkX3VuYXNzaWduZWQgPSBYR1BPTl9PTlVfSURfVU5BU1NJR05FRCwKKyAgICAuYWxsb2NfaWRfYnJvYWRjYXN0ID0gWEdQT05fQUxMT0NfSURfQlJPQURDQVNULAorICAgIC5hbGxvY19pZF9pbnZhbGlkID0gQkNNT0xUX1hHUE9OX0FMTE9DX0lEX0lOVkFMSUQsCisgICAgLmFsbG9jX2lkX3VuYXNzaWduZWQgPSBYR1BPTl9BTExPQ19JRF9VTkFTU0lHTkVELAorICAgIC51c19yYXRlID0gQkNNT0xUX1BPTl9VU19SQVRFXzJQNUcsCit9OworCitzdGF0aWMgc3lzX21vZGVfZGIgZGJfc3lzID0ge307CitzeXNfbW9kZV9kYiAqc21kYmcgPSAmZGJfc3lzOworCit2b2lkIGJjbV9jb21tb25fZ3Bvbl9pbml0KGJjbW9sdF9zeXN0ZW1fbW9kZSBzeXN0ZW1fbW9kZSkKK3sKKyAgICB1aW50OF90IGk7CisgICAgYmNtb2x0X3hncG9uX251bV9vZl9vbnVzIHhncG9uX251bV9vZl9vbnVzOworICAgIC8qIG5lZWQgdG8gY2hlY2sgZm9yIFhHUE9OIFhHUyBOR1BPTjIgbW9kZXMsIHRoZSBzdXBwb3J0ZWQgbnVtYmVyIG9mIG9udXMgKi8KKyAgICBiY21vbHRfeGdwb25fbnVtX29mX29udXNfZ2V0KDAsICZ4Z3Bvbl9udW1fb2Zfb251cyk7CisKKyAgICBzd2l0Y2ggKHN5c3RlbV9tb2RlKQorICAgIHsKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9HUE9OX18xNl9YOgorICAgICAgICBzbWRiZy0+bnVtX29mX3BvbnMgPSBHUE9OX01BWF9OVU1fT0ZfUE9OUzsKKyAgICAgICAgZm9yIChpPTA7IGk8c21kYmctPm51bV9vZl9wb25zOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtZGJnLT5wb25zW2ldID0gZGJfZ3BvbjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9HUE9OX184X1g6CisgICAgICAgIHNtZGJnLT5udW1fb2ZfcG9ucyA9IEdQT05fTUFYX05VTV9PRl9QT05TIC8gMjsKKyAgICAgICAgZm9yIChpPTA7IGk8c21kYmctPm51bV9vZl9wb25zOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtZGJnLT5wb25zW2ldID0gZGJfZ3BvbjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9HUE9OX180X1g6CisgICAgICAgIHNtZGJnLT5udW1fb2ZfcG9ucyA9IEdQT05fTUFYX05VTV9PRl9QT05TIC8gNDsKKyAgICAgICAgZm9yIChpPTA7IGk8c21kYmctPm51bV9vZl9wb25zOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtZGJnLT5wb25zW2ldID0gZGJfZ3BvbjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9YR1BPTl8xX184X1g6CisgICAgICAgIHNtZGJnLT5udW1fb2ZfcG9ucyA9IFhHUE9OX01BWF9OVU1fT0ZfUE9OUzsKKyAgICAgICAgZm9yIChpPTA7IGk8c21kYmctPm51bV9vZl9wb25zOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgCXNtZGJnLT5wb25zW2ldID0gZGJfeGdwb247CisgICAgICAgIAlpZiAoeGdwb25fbnVtX29mX29udXMgPT0gQkNNT0xUX1hHUE9OX05VTV9PRl9PTlVTX1hHUE9OX1NVUFBPUlRfNTEwX09OVVMpCisgICAgICAgIAl7CisgICAgICAgIAkJc21kYmctPnBvbnNbaV0ubnVtX29mX29udXMgPSBYR1BPTl9NQVhfTlVNX09GX09OVVM7CisgICAgICAgIAl9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfWEdQT05fMV9fNF9YOgorICAgICAgICBzbWRiZy0+bnVtX29mX3BvbnMgPSBYR1BPTl9NQVhfTlVNX09GX1BPTlMgLyAyOworICAgICAgICBmb3IgKGk9MDsgaTxzbWRiZy0+bnVtX29mX3BvbnM7IGkrKykKKyAgICAgICAgeworICAgICAgICAJc21kYmctPnBvbnNbaV0gPSBkYl94Z3BvbjsKKyAgICAgICAgCWlmICh4Z3Bvbl9udW1fb2Zfb251cyA9PSBCQ01PTFRfWEdQT05fTlVNX09GX09OVVNfWEdQT05fU1VQUE9SVF81MTBfT05VUykKKyAgICAgICAgCXsKKyAgICAgICAgCQlzbWRiZy0+cG9uc1tpXS5udW1fb2Zfb251cyA9IFhHUE9OX01BWF9OVU1fT0ZfT05VUzsKKyAgICAgICAgCX0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9HUE9OXzhfWEdQT05fNF9YX0NPRVhJU1RFTkNFOgorICAgICAgICBzbWRiZy0+bnVtX29mX3BvbnMgPSBHUE9OX01BWF9OVU1fT0ZfUE9OUzsKKyAgICAgICAgLyogSW5pdGlhbGl6ZSBmaXJzdCBoYWxmIGNoaXAgYXMgWEdQT04gKi8KKyAgICAgICAgZm9yIChpPTA7IGk8WEdQT05fTUFYX05VTV9PRl9QT05TOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgCXNtZGJnLT5wb25zW2ldID0gZGJfeGdwb247CisgICAgICAgIAlpZiAoeGdwb25fbnVtX29mX29udXMgPT0gQkNNT0xUX1hHUE9OX05VTV9PRl9PTlVTX1hHUE9OX1NVUFBPUlRfNTEwX09OVVMpCisgICAgICAgIAl7CisgICAgICAgIAkJc21kYmctPnBvbnNbaV0ubnVtX29mX29udXMgPSBYR1BPTl9NQVhfTlVNX09GX09OVVM7CisgICAgICAgIAl9CisgICAgICAgIH0KKyAgICAgICAgLyogSW5pdGlhbGl6ZSBzZWNvbmQgaGFsZiBjaGlwIGFzIEdQT04gKi8KKyAgICAgICAgZm9yICg7IGk8c21kYmctPm51bV9vZl9wb25zOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHNtZGJnLT5wb25zW2ldID0gZGJfZ3BvbjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9YR1NfXzJfWF8xMF9HOgorICAgICAgICBzbWRiZy0+bnVtX29mX3BvbnMgPSBYR1NfMlhfTlVNX09GX1BPTlM7CisgICAgICAgIGZvciAoaT0wOyBpPHNtZGJnLT5udW1fb2ZfcG9uczsgaSsrKQorICAgICAgICB7CisgICAgICAgIAlzbWRiZy0+cG9uc1tpXSA9IGRiX3hnczsKKyAgICAgICAgCWlmICh4Z3Bvbl9udW1fb2Zfb251cyA9PSBCQ01PTFRfWEdQT05fTlVNX09GX09OVVNfWEdQT05fU1VQUE9SVF81MTBfT05VUykKKyAgICAgICAgCXsKKyAgICAgICAgCQlzbWRiZy0+cG9uc1tpXS5udW1fb2Zfb251cyA9IFhHUE9OX01BWF9OVU1fT0ZfT05VUzsKKyAgICAgICAgCX0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9OR1BPTjJfXzJfWF8xMF9HOgorICAgICAgICBzbWRiZy0+bnVtX29mX3BvbnMgPSBOR1BPTjJfMlhfTlVNX09GX1BPTlM7CisgICAgICAgIGZvciAoaT0wOyBpPHNtZGJnLT5udW1fb2ZfcG9uczsgaSsrKQorICAgICAgICB7CisgICAgICAgIAlzbWRiZy0+cG9uc1tpXSA9IGRiX25ncG9uMjsKKyAgICAgICAgCWlmICh4Z3Bvbl9udW1fb2Zfb251cyA9PSBCQ01PTFRfWEdQT05fTlVNX09GX09OVVNfWEdQT05fU1VQUE9SVF81MTBfT05VUykKKyAgICAgICAgCXsKKyAgICAgICAgCQlzbWRiZy0+cG9uc1tpXS5udW1fb2Zfb251cyA9IFhHUE9OX01BWF9OVU1fT0ZfT05VUzsKKyAgICAgICAgCX0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9OR1BPTjJfXzhfWF8yX1BfNV9HOgorICAgICAgICAgICBzbWRiZy0+bnVtX29mX3BvbnMgPSBOR1BPTjJfOFhfTlVNX09GX1BPTlM7CisgICAgICAgICAgIGZvciAoaT0wOyBpPHNtZGJnLT5udW1fb2ZfcG9uczsgaSsrKQorICAgICAgICAgICB7CisgICAgICAgIAkgICBzbWRiZy0+cG9uc1tpXSA9IGRiX25ncG9uMl8yXzVfZzsKKyAgICAgICAgCSAgIGlmICh4Z3Bvbl9udW1fb2Zfb251cyA9PSBCQ01PTFRfWEdQT05fTlVNX09GX09OVVNfWEdQT05fU1VQUE9SVF81MTBfT05VUykKKyAgICAgICAgCSAgIHsKKyAgICAgICAgCQkgICBzbWRiZy0+cG9uc1tpXS5udW1fb2Zfb251cyA9IFhHUE9OX01BWF9OVU1fT0ZfT05VUzsKKyAgICAgICAgCSAgIH0KKyAgICAgICAgICAgfQorICAgICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBzbWRiZy0+bnVtX29mX3BvbnMgPSAwOworICAgICAgICBicmVhazsKKyAgICB9CisKK30KKworYmNtb2x0X3N5c3RlbV9tb2RlIGJjbV9jb21tb25fZ3Bvbl9nZXRfc3lzdGVtX21vZGUodm9pZCkKK3sKKyAgICBiY21vbHRfc3lzdGVtX21vZGUgc3lzdGVtX21vZGU7CisKKyAgICAvKiBUb0RvOiBYWFg6IGl0IHJlcXVpcmVzIHdvcmsuIEpJUkEgU1dNQVBMRS0zNzI0ICovCisgICAgYmNtb2x0X3N5c3RlbV9tb2RlX2dldCgwLCAmc3lzdGVtX21vZGUpOworICAgIHJldHVybiBzeXN0ZW1fbW9kZTsKK30KKworYmNtb2x0X3Bvbl9tb2RlMnN0cl90IGJjbW9sdF9wb25fbW9kZTJzdHJbXSA9Cit7CisgICAge0JDTU9MVF9QT05fTU9ERV9HUE9OLCAiZ3BvbiJ9LAorICAgIHtCQ01PTFRfUE9OX01PREVfWEdQT04sICJ4Z3BvbiJ9LAorICAgIHtCQ01PTFRfUE9OX01PREVfWEdTLCAieGdzIn0sCisgICAge0JDTU9MVF9QT05fTU9ERV9OR1BPTjIsICJuZ3BvbjIifSwKKyAgICB7LTF9Cit9OwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2NvbW1vbl9ncG9uL2JjbV9jb21tb25fZ3Bvbi5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2NvbW1vbl9ncG9uL2JjbV9jb21tb25fZ3Bvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NGQ2NjEKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvY29tbW9uX2dwb24vYmNtX2NvbW1vbl9ncG9uLmgKQEAgLTAsMCArMSwxNDQgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6cHJvcHJpZXRhcnk6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitUaGlzIHByb2dyYW0gaXMgdGhlIHByb3ByaWV0YXJ5IHNvZnR3YXJlIG9mIEJyb2FkY29tIENvcnBvcmF0aW9uIGFuZC9vciBpdHMKK2xpY2Vuc29ycywgYW5kIG1heSBvbmx5IGJlIHVzZWQsIGR1cGxpY2F0ZWQsIG1vZGlmaWVkIG9yIGRpc3RyaWJ1dGVkIHB1cnN1YW50Cit0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgYSBzZXBhcmF0ZSwgd3JpdHRlbiBsaWNlbnNlIGFncmVlbWVudCBleGVjdXRlZAorYmV0d2VlbiB5b3UgYW5kIEJyb2FkY29tIChhbiAiQXV0aG9yaXplZCBMaWNlbnNlIikuICBFeGNlcHQgYXMgc2V0IGZvcnRoIGluCithbiBBdXRob3JpemVkIExpY2Vuc2UsIEJyb2FkY29tIGdyYW50cyBubyBsaWNlbnNlIChleHByZXNzIG9yIGltcGxpZWQpLCByaWdodAordG8gdXNlLCBvciB3YWl2ZXIgb2YgYW55IGtpbmQgd2l0aCByZXNwZWN0IHRvIHRoZSBTb2Z0d2FyZSwgYW5kIEJyb2FkY29tCitleHByZXNzbHkgcmVzZXJ2ZXMgYWxsIHJpZ2h0cyBpbiBhbmQgdG8gdGhlIFNvZnR3YXJlIGFuZCBhbGwgaW50ZWxsZWN0dWFsCitwcm9wZXJ0eSByaWdodHMgdGhlcmVpbi4gIElGIFlPVSBIQVZFIE5PIEFVVEhPUklaRUQgTElDRU5TRSwgVEhFTiBZT1UgSEFWRQorTk8gUklHSFQgVE8gVVNFIFRISVMgU09GVFdBUkUgSU4gQU5ZIFdBWSwgQU5EIFNIT1VMRCBJTU1FRElBVEVMWSBOT1RJRlkKK0JST0FEQ09NIEFORCBESVNDT05USU5VRSBBTEwgVVNFIE9GIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGV4cHJlc3NseSBzZXQgZm9ydGggaW4gdGhlIEF1dGhvcml6ZWQgTGljZW5zZSwKKworMS4gVGhpcyBwcm9ncmFtLCBpbmNsdWRpbmcgaXRzIHN0cnVjdHVyZSwgc2VxdWVuY2UgYW5kIG9yZ2FuaXphdGlvbiwKKyAgICBjb25zdGl0dXRlcyB0aGUgdmFsdWFibGUgdHJhZGUgc2VjcmV0cyBvZiBCcm9hZGNvbSwgYW5kIHlvdSBzaGFsbCB1c2UKKyAgICBhbGwgcmVhc29uYWJsZSBlZmZvcnRzIHRvIHByb3RlY3QgdGhlIGNvbmZpZGVudGlhbGl0eSB0aGVyZW9mLCBhbmQgdG8KKyAgICB1c2UgdGhpcyBpbmZvcm1hdGlvbiBvbmx5IGluIGNvbm5lY3Rpb24gd2l0aCB5b3VyIHVzZSBvZiBCcm9hZGNvbQorICAgIGludGVncmF0ZWQgY2lyY3VpdCBwcm9kdWN0cy4KKworMi4gVE8gVEhFIE1BWElNVU0gRVhURU5UIFBFUk1JVFRFRCBCWSBMQVcsIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiCisgICAgQU5EIFdJVEggQUxMIEZBVUxUUyBBTkQgQlJPQURDT00gTUFLRVMgTk8gUFJPTUlTRVMsIFJFUFJFU0VOVEFUSU9OUyBPUgorICAgIFdBUlJBTlRJRVMsIEVJVEhFUiBFWFBSRVNTLCBJTVBMSUVELCBTVEFUVVRPUlksIE9SIE9USEVSV0lTRSwgV0lUSAorICAgIFJFU1BFQ1QgVE8gVEhFIFNPRlRXQVJFLiAgQlJPQURDT00gU1BFQ0lGSUNBTExZIERJU0NMQUlNUyBBTlkgQU5ECisgICAgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBUSVRMRSwgTUVSQ0hBTlRBQklMSVRZLCBOT05JTkZSSU5HRU1FTlQsCisgICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIExBQ0sgT0YgVklSVVNFUywgQUNDVVJBQ1kgT1IKKyAgICBDT01QTEVURU5FU1MsIFFVSUVUIEVOSk9ZTUVOVCwgUVVJRVQgUE9TU0VTU0lPTiBPUiBDT1JSRVNQT05ERU5DRQorICAgIFRPIERFU0NSSVBUSU9OLiBZT1UgQVNTVU1FIFRIRSBFTlRJUkUgUklTSyBBUklTSU5HIE9VVCBPRiBVU0UgT1IKKyAgICBQRVJGT1JNQU5DRSBPRiBUSEUgU09GVFdBUkUuCisKKzMuIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBJTiBOTyBFVkVOVCBTSEFMTCBCUk9BRENPTSBPUgorICAgIElUUyBMSUNFTlNPUlMgQkUgTElBQkxFIEZPUiAoaSkgQ09OU0VRVUVOVElBTCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAgICBJTkRJUkVDVCwgT1IgRVhFTVBMQVJZIERBTUFHRVMgV0hBVFNPRVZFUiBBUklTSU5HIE9VVCBPRiBPUiBJTiBBTlkKKyAgICBXQVkgUkVMQVRJTkcgVE8gWU9VUiBVU0UgT0YgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgU09GVFdBUkUgRVZFTgorICAgIElGIEJST0FEQ09NIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUzsKKyAgICBPUiAoaWkpIEFOWSBBTU9VTlQgSU4gRVhDRVNTIE9GIFRIRSBBTU9VTlQgQUNUVUFMTFkgUEFJRCBGT1IgVEhFCisgICAgU09GVFdBUkUgSVRTRUxGIE9SIFUuUy4gJDEsIFdISUNIRVZFUiBJUyBHUkVBVEVSLiBUSEVTRSBMSU1JVEFUSU9OUworICAgIFNIQUxMIEFQUExZIE5PVFdJVEhTVEFORElORyBBTlkgRkFJTFVSRSBPRiBFU1NFTlRJQUwgUFVSUE9TRSBPRiBBTlkKKyAgICBMSU1JVEVEIFJFTUVEWS4KKzo+CisqLworI2lmbmRlZiBfQkNNX0NPTU1PTl9HUE9OX0hfCisjZGVmaW5lIF9CQ01fQ09NTU9OX0dQT05fSF8KKworI2luY2x1ZGUgImJjbV9kZXZfbG9nLmgiCisjaW5jbHVkZSAiYmNtY2xpLmgiCisjaW5jbHVkZSAiYmNtb2x0X21vZGVsX3R5cGVzLmgiCisjaW5jbHVkZSAiYmNtb2x0X21hdGguaCIKKyNpbmNsdWRlICJiY21vbHRfY29udi5oIgorI2luY2x1ZGUgImJjbV9jb21tb25fZ3Bvbl9jb25zdGFudHMuaCIKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21vbHRfcG9uX21vZGUgcG9uX21vZGU7CisgICAgYmNtb2x0X3Bvbl9hcGlfdHlwZSBhcGlfdHlwZTsKKyAgICB1aW50MTZfdCBudW1fb2Zfb251czsKKyAgICB1aW50MTZfdCBudW1fb2ZfYWxsb2NfaWRzOworICAgIHVpbnQxNl90IG51bV9vZl9keW5hbWljX2FsbG9jX2luZGljZXM7CisgICAgdWludDE2X3QgbnVtX29mX2dlbV9wb3J0czsKKyAgICB1aW50MTZfdCBudW1fb2ZfYWxsb2NfaWRzX3Blcl9vbnU7CisgICAgYmNtb2x0X3Bvbl9vbnVfaWQgb251X2lkX2Jyb2FkY2FzdDsKKyAgICBiY21vbHRfcG9uX29udV9pZCBvbnVfaWRfdW5hc3NpZ25lZDsKKyAgICBiY21vbHRfcG9uX2FsbG9jX2lkIGFsbG9jX2lkX2Jyb2FkY2FzdDsKKyAgICBiY21vbHRfcG9uX2FsbG9jX2lkIGFsbG9jX2lkX2ludmFsaWQ7CisgICAgYmNtb2x0X3Bvbl9hbGxvY19pZCBhbGxvY19pZF91bmFzc2lnbmVkOworICAgIGJjbW9sdF9wb25fdXNfcmF0ZSB1c19yYXRlOworfSBwb25fbW9kZV9kYjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50OF90IG51bV9vZl9wb25zOworICAgIHBvbl9tb2RlX2RiIHBvbnNbTUFYX05VTV9PRl9QT05TXTsKK30gc3lzX21vZGVfZGI7CisKKy8qIFN5c3RlbSBtb2RlIGRhdGFiYXNlLCBpbml0aWFsaXplZCBhdCBzeXN0ZW0gc3RhcnQuCisgKiBVc2VkIGZvciBjb25zdGFudHMgdGhhdCBjaGFuZ2UgYmFzZWQgb24gUE9OIG1vZGUsIGNoaXAgdHlwZSwgZXRjLiAqLworZXh0ZXJuIHN5c19tb2RlX2RiICpzbWRiZzsKKworLyogR2V0IHRoZSBQT04gbW9kZSBkYXRhYmFzZSBoYW5kbGUgZm9yIGEgZ2l2ZW4gUE9OIGluZGV4IChzaG9ydGN1dCBmb3Igc21kYmctPnBvbnNbcG9uX2lkXSkuICovCisjZGVmaW5lIFBNREIocG9uX2lkKSAoKGNvbnN0IHBvbl9tb2RlX2RiICopJnNtZGJnLT5wb25zW3Bvbl9pZF0pCisKKy8qIEdldCB0aGUgUE9OIG1vZGUgZm9yIGEgZ2l2ZW4gUE9OIGluZGV4IChzaG9ydGN1dCBmb3IgUE1EQihwb25faWQpLT5wb25fbW9kZSkuICovCisjZGVmaW5lIFBPTl9NT0RFKHBvbl9pZCkgKFBNREIocG9uX2lkKS0+cG9uX21vZGUpCitCQ01PTFRfVFlQRTJTVFIoYmNtb2x0X3Bvbl9tb2RlLCBleHRlcm4pCisKKy8qIEdlbmVyaWMgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCB0byByYWlzZSBhIHNvZnR3YXJlIGVycm9yIGZvciB1bnN1cHBvcnRlZCBQT04gbW9kZXMuICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Vycm5vIGVycm9yX3Bvbl9tb2RlX25vdF9zdXBwb3J0ZWQoYmNtb2x0X3Bvbl9uaSBwb25fbmkpCit7CisgICAgYmNtb2x0X3Bvbl9tb2RlIG1vZGUgPSBQT05fTU9ERShwb25fbmkpOworICAgIEJDTU9TX1RSQUNFX0VSUigiUE9OIG1vZGUgbm90IHN1cHBvcnRlZCBmb3IgUE9OIE5JLSVkOiAlcyAoJXUpXG4iLCBwb25fbmksIGJjbW9sdF9wb25fbW9kZTJzdHJfY29udihtb2RlKSwgbW9kZSk7CisgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7Cit9CisKKy8qIEdldCBhIG1vZHVsZSBJRCB3aXRoIGEgYmFzZSBtb2R1bGUgKyBpbnN0YW5jZSAoUE9OLCBjbHVzdGVyLCBldGMuKSBvZmZzZXQgaW4gYSB0eXBlLXNhZmUgd2F5ICovCisjZGVmaW5lIE1PRFVMRV9JTlNUQU5DRShiYXNlX21vZHVsZV9pZCwgaW5zdGFuY2UpIChiY21vc19tb2R1bGVfaWQpKCh1aW50MzJfdCkoYmFzZV9tb2R1bGVfaWQpICsgKHVpbnQzMl90KShpbnN0YW5jZSkpCisKKy8qIFNhbWUgYXMgTU9EVUxFX0lOU1RBTkNFLCBidXQgZm9yIGV2ZW50cy4gKi8KKyNkZWZpbmUgRVZFTlRfSU5TVEFOQ0UoYmFzZV9ldmVudF9pZCwgaW5zdGFuY2UpIChiY21vc19ldmVudF9pZCkoKHVpbnQzMl90KShiYXNlX2V2ZW50X2lkKSArICh1aW50MzJfdCkoaW5zdGFuY2UpKQorCisjZGVmaW5lIEZPUl9FQUNIX09OVShwb25faWQsIG9udV9pZCkgXAorICAgIGZvciAob251X2lkID0gKGJjbW9sdF9wb25fb251X2lkKTA7IG9udV9pZCA8IChiY21vbHRfcG9uX29udV9pZClQTURCKHBvbl9pZCktPm51bV9vZl9vbnVzOyBvbnVfaWQrKykKKworI2RlZmluZSBGT1JfRUFDSF9BTExPQ19JTkRFWChwb25faWQsIGFsbG9jX2luZGV4KSBcCisgICAgZm9yIChhbGxvY19pbmRleCA9IChiY21vbHRfcG9uX2FsbG9jX2luZGV4KTA7IGFsbG9jX2luZGV4IDwgKGJjbW9sdF9wb25fYWxsb2NfaW5kZXgpUE1EQihwb25faWQpLT5udW1fb2ZfYWxsb2NfaWRzOyBhbGxvY19pbmRleCsrKQorCisjZGVmaW5lIEZPUl9FQUNIX0dFTV9JTkRFWChwb25faWQsIGdlbV9wb3J0X2luZGV4KSBcCisgICAgZm9yIChnZW1fcG9ydF9pbmRleCA9IDA7IChiY21vbHRfcG9uX2dlbV9wb3J0X2luZGV4KWdlbV9wb3J0X2luZGV4IDwgKGJjbW9sdF9wb25fZ2VtX3BvcnRfaW5kZXgpUE1EQihwb25faWQpLT5udW1fb2ZfZ2VtX3BvcnRzOyBnZW1fcG9ydF9pbmRleCsrKQorCisjZGVmaW5lIEFMTE9DX0lOREVYX0lTX1ZBTElEKHBvbl9pZCwgYWxsb2NfaW5kZXgpICgoYWxsb2NfaW5kZXgpIDwgKGJjbW9sdF9wb25fYWxsb2NfaW5kZXgpUE1EQihwb25faWQpLT5udW1fb2ZfYWxsb2NfaWRzKQorI2RlZmluZSBHRU1fUE9SVF9JTkRFWF9JU19WQUxJRChwb25faWQsIGdlbV9wb3J0X2luZGV4KSBcCisgICAgKChnZW1fcG9ydF9pbmRleCkgPCAoYmNtb2x0X3Bvbl9nZW1fcG9ydF9pbmRleClQTURCKHBvbl9pZCktPm51bV9vZl9nZW1fcG9ydHMpCisKKyNkZWZpbmUgQUxMT0NfSURfTEFTVF9ERUZBVUxUKHBvbl9pZCkgKChiY21vbHRfcG9uX2FsbG9jX2lkKShQTURCKHBvbl9pZCktPm51bV9vZl9vbnVzIC0gMSkpCisjZGVmaW5lIEFMTE9DX0lEX0xBU1RfREFUQShwb25faWQsIGZpcnN0X2RhdGFfYWxsb2NfaWQpIFwKKyAgICAoKGZpcnN0X2RhdGFfYWxsb2NfaWQpICsgKGJjbW9sdF9wb25fYWxsb2NfaWQpKFBNREIocG9uX2lkKS0+bnVtX29mX2FsbG9jX2lkcyAtIFBNREIocG9uX2lkKS0+bnVtX29mX29udXMgLSAxKSkKKyNkZWZpbmUgQUxMT0NfSURfSVNfVkFMSURfREFUQShwb25faWQsIGFsbG9jX2lkLCBmaXJzdF9kYXRhX2FsbG9jX2lkKSAoIFwKKyAgICAoKGFsbG9jX2lkKSA+PSAoZmlyc3RfZGF0YV9hbGxvY19pZCkgJiYgKGFsbG9jX2lkKSA8PSBBTExPQ19JRF9MQVNUX0RBVEEocG9uX2lkLCBmaXJzdF9kYXRhX2FsbG9jX2lkKSkpCisjZGVmaW5lIEFMTE9DX0lEX0lTX1ZBTElEKHBvbl9pZCwgYWxsb2NfaWQsIGZpcnN0X2RhdGFfYWxsb2NfaWQpICggXAorICAgICgoYWxsb2NfaWQpIDw9IEFMTE9DX0lEX0xBU1RfREVGQVVMVChwb25faWQpKSB8fCBcCisgICAgQUxMT0NfSURfSVNfVkFMSURfREFUQShwb25faWQsIGFsbG9jX2lkLCBmaXJzdF9kYXRhX2FsbG9jX2lkKSkKKworI2RlZmluZSBHRU1fUE9SVF9JRF9MQVNUX0RFRkFVTFQocG9uX2lkKSAoKGJjbW9sdF9wb25fZ2VtX3BvcnRfaWQpKFBNREIocG9uX2lkKS0+bnVtX29mX29udXMgLSAxKSkKKyNkZWZpbmUgR0VNX1BPUlRfSURfTEFTVF9EQVRBKHBvbl9pZCwgZmlyc3RfZGF0YV9wb3J0X2lkKSBcCisgICAgKChmaXJzdF9kYXRhX3BvcnRfaWQpICsgKGJjbW9sdF9wb25fZ2VtX3BvcnRfaWQpKFBNREIocG9uX2lkKS0+bnVtX29mX2dlbV9wb3J0cyAtIFBNREIocG9uX2lkKS0+bnVtX29mX29udXMgLSAxKSkKKyNkZWZpbmUgR0VNX1BPUlRfSURfSVNfVkFMSURfREFUQShwb25faWQsIGdlbV9wb3J0X2lkLCBmaXJzdF9kYXRhX3BvcnRfaWQpICggXAorICAgICgoZ2VtX3BvcnRfaWQpID49IChmaXJzdF9kYXRhX3BvcnRfaWQpICYmIChnZW1fcG9ydF9pZCkgPD0gR0VNX1BPUlRfSURfTEFTVF9EQVRBKHBvbl9pZCwgZmlyc3RfZGF0YV9wb3J0X2lkKSkpCisjZGVmaW5lIEdFTV9QT1JUX0lEX0lTX1ZBTElEKHBvbl9pZCwgZ2VtX3BvcnRfaWQsIGZpcnN0X2RhdGFfcG9ydF9pZCkgKCBcCisgICAgKChnZW1fcG9ydF9pZCkgPD0gR0VNX1BPUlRfSURfTEFTVF9ERUZBVUxUKHBvbl9pZCkpIHx8IFwKKyAgICBHRU1fUE9SVF9JRF9JU19WQUxJRF9EQVRBKHBvbl9pZCwgZ2VtX3BvcnRfaWQsIGZpcnN0X2RhdGFfcG9ydF9pZCkpCisKKyNkZWZpbmUgUE9OX0lEX0lTX1ZBTElEKHN5c3RlbV9tb2RlLCBwb25faWQpICggXAorICAgICgodWludDhfdClwb25faWQgPCBzbWRiZy0+bnVtX29mX3BvbnMpICYmIFwKKyAgICAoc3lzdGVtX21vZGUgIT0gQkNNT0xUX1NZU1RFTV9NT0RFX0dQT05fOF9YR1BPTl80X1hfQ09FWElTVEVOQ0UgfHwgcG9uX2lkIDwgWEdQT05fSEFMRl9DSElQX01BWF9OVU1fT0ZfUE9OUyB8fCBwb25faWQgPj0gWEdQT05fTUFYX05VTV9PRl9QT05TKSkKKwordm9pZCBiY21fY29tbW9uX2dwb25faW5pdChiY21vbHRfc3lzdGVtX21vZGUgc3lzdGVtX21vZGUpOworYmNtb2x0X3N5c3RlbV9tb2RlIGJjbV9jb21tb25fZ3Bvbl9nZXRfc3lzdGVtX21vZGUodm9pZCk7CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvY29tbW9uX2dwb24vYmNtX2NvbW1vbl9ncG9uX2NvbnN0YW50cy5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2NvbW1vbl9ncG9uL2JjbV9jb21tb25fZ3Bvbl9jb25zdGFudHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDMwOGU0Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2NvbW1vbl9ncG9uL2JjbV9jb21tb25fZ3Bvbl9jb25zdGFudHMuaApAQCAtMCwwICsxLDEzOCBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpwcm9wcmlldGFyeTpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1RoaXMgcHJvZ3JhbSBpcyB0aGUgcHJvcHJpZXRhcnkgc29mdHdhcmUgb2YgQnJvYWRjb20gQ29ycG9yYXRpb24gYW5kL29yIGl0cworbGljZW5zb3JzLCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgZHVwbGljYXRlZCwgbW9kaWZpZWQgb3IgZGlzdHJpYnV0ZWQgcHVyc3VhbnQKK3RvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiBhIHNlcGFyYXRlLCB3cml0dGVuIGxpY2Vuc2UgYWdyZWVtZW50IGV4ZWN1dGVkCitiZXR3ZWVuIHlvdSBhbmQgQnJvYWRjb20gKGFuICJBdXRob3JpemVkIExpY2Vuc2UiKS4gIEV4Y2VwdCBhcyBzZXQgZm9ydGggaW4KK2FuIEF1dGhvcml6ZWQgTGljZW5zZSwgQnJvYWRjb20gZ3JhbnRzIG5vIGxpY2Vuc2UgKGV4cHJlc3Mgb3IgaW1wbGllZCksIHJpZ2h0Cit0byB1c2UsIG9yIHdhaXZlciBvZiBhbnkga2luZCB3aXRoIHJlc3BlY3QgdG8gdGhlIFNvZnR3YXJlLCBhbmQgQnJvYWRjb20KK2V4cHJlc3NseSByZXNlcnZlcyBhbGwgcmlnaHRzIGluIGFuZCB0byB0aGUgU29mdHdhcmUgYW5kIGFsbCBpbnRlbGxlY3R1YWwKK3Byb3BlcnR5IHJpZ2h0cyB0aGVyZWluLiAgSUYgWU9VIEhBVkUgTk8gQVVUSE9SSVpFRCBMSUNFTlNFLCBUSEVOIFlPVSBIQVZFCitOTyBSSUdIVCBUTyBVU0UgVEhJUyBTT0ZUV0FSRSBJTiBBTlkgV0FZLCBBTkQgU0hPVUxEIElNTUVESUFURUxZIE5PVElGWQorQlJPQURDT00gQU5EIERJU0NPTlRJTlVFIEFMTCBVU0UgT0YgVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgZXhwcmVzc2x5IHNldCBmb3J0aCBpbiB0aGUgQXV0aG9yaXplZCBMaWNlbnNlLAorCisxLiBUaGlzIHByb2dyYW0sIGluY2x1ZGluZyBpdHMgc3RydWN0dXJlLCBzZXF1ZW5jZSBhbmQgb3JnYW5pemF0aW9uLAorICAgIGNvbnN0aXR1dGVzIHRoZSB2YWx1YWJsZSB0cmFkZSBzZWNyZXRzIG9mIEJyb2FkY29tLCBhbmQgeW91IHNoYWxsIHVzZQorICAgIGFsbCByZWFzb25hYmxlIGVmZm9ydHMgdG8gcHJvdGVjdCB0aGUgY29uZmlkZW50aWFsaXR5IHRoZXJlb2YsIGFuZCB0bworICAgIHVzZSB0aGlzIGluZm9ybWF0aW9uIG9ubHkgaW4gY29ubmVjdGlvbiB3aXRoIHlvdXIgdXNlIG9mIEJyb2FkY29tCisgICAgaW50ZWdyYXRlZCBjaXJjdWl0IHByb2R1Y3RzLgorCisyLiBUTyBUSEUgTUFYSU1VTSBFWFRFTlQgUEVSTUlUVEVEIEJZIExBVywgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIKKyAgICBBTkQgV0lUSCBBTEwgRkFVTFRTIEFORCBCUk9BRENPTSBNQUtFUyBOTyBQUk9NSVNFUywgUkVQUkVTRU5UQVRJT05TIE9SCisgICAgV0FSUkFOVElFUywgRUlUSEVSIEVYUFJFU1MsIElNUExJRUQsIFNUQVRVVE9SWSwgT1IgT1RIRVJXSVNFLCBXSVRICisgICAgUkVTUEVDVCBUTyBUSEUgU09GVFdBUkUuICBCUk9BRENPTSBTUEVDSUZJQ0FMTFkgRElTQ0xBSU1TIEFOWSBBTkQKKyAgICBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIFRJVExFLCBNRVJDSEFOVEFCSUxJVFksIE5PTklORlJJTkdFTUVOVCwKKyAgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgTEFDSyBPRiBWSVJVU0VTLCBBQ0NVUkFDWSBPUgorICAgIENPTVBMRVRFTkVTUywgUVVJRVQgRU5KT1lNRU5ULCBRVUlFVCBQT1NTRVNTSU9OIE9SIENPUlJFU1BPTkRFTkNFCisgICAgVE8gREVTQ1JJUFRJT04uIFlPVSBBU1NVTUUgVEhFIEVOVElSRSBSSVNLIEFSSVNJTkcgT1VUIE9GIFVTRSBPUgorICAgIFBFUkZPUk1BTkNFIE9GIFRIRSBTT0ZUV0FSRS4KKworMy4gVE8gVEhFIE1BWElNVU0gRVhURU5UIFBFUk1JVFRFRCBCWSBMQVcsIElOIE5PIEVWRU5UIFNIQUxMIEJST0FEQ09NIE9SCisgICAgSVRTIExJQ0VOU09SUyBCRSBMSUFCTEUgRk9SIChpKSBDT05TRVFVRU5USUFMLCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICAgIElORElSRUNULCBPUiBFWEVNUExBUlkgREFNQUdFUyBXSEFUU09FVkVSIEFSSVNJTkcgT1VUIE9GIE9SIElOIEFOWQorICAgIFdBWSBSRUxBVElORyBUTyBZT1VSIFVTRSBPRiBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBTT0ZUV0FSRSBFVkVOCisgICAgSUYgQlJPQURDT00gSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTOworICAgIE9SIChpaSkgQU5ZIEFNT1VOVCBJTiBFWENFU1MgT0YgVEhFIEFNT1VOVCBBQ1RVQUxMWSBQQUlEIEZPUiBUSEUKKyAgICBTT0ZUV0FSRSBJVFNFTEYgT1IgVS5TLiAkMSwgV0hJQ0hFVkVSIElTIEdSRUFURVIuIFRIRVNFIExJTUlUQVRJT05TCisgICAgU0hBTEwgQVBQTFkgTk9UV0lUSFNUQU5ESU5HIEFOWSBGQUlMVVJFIE9GIEVTU0VOVElBTCBQVVJQT1NFIE9GIEFOWQorICAgIExJTUlURUQgUkVNRURZLgorOj4KKyovCisjaWZuZGVmIF9CQ01fQ09NTU9OX0dQT05fQ09OU1RBTlRTX0hfCisjZGVmaW5lIF9CQ01fQ09NTU9OX0dQT05fQ09OU1RBTlRTX0hfCisKKyNpbmNsdWRlICJiY21vbHRfbW9kZWxfZGF0YS5oIgorCisvKiBtYXhpbXVtIG51bWJlciBvZiBQT05zIGZvciBhbnkgc3VwcG9ydGVkIFBPTiBtb2RlICovCisjZGVmaW5lIE1BWF9OVU1fT0ZfUE9OUyAxNgorCisvKiogR2VuZXJpYyAiUE9OIG1vZGUiIHVzZWQgdG8gc2ltcGxpZnkgbG9naWMgd2hlbiBzcGVjaWZpYyAic3lzdGVtIG1vZGUiIGlzIHRvbyBjb21wbGV4LiAqLwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNT0xUX1BPTl9NT0RFX0dQT04sCisgICAgQkNNT0xUX1BPTl9NT0RFX1hHUE9OLAorICAgIEJDTU9MVF9QT05fTU9ERV9YR1MsCisgICAgQkNNT0xUX1BPTl9NT0RFX05HUE9OMiwKK30gYmNtb2x0X3Bvbl9tb2RlOworCisvKiogT2JqZWN0IHR5cGUgdXNlZCBieSB0aGUgQVBJIGxheWVyIGZvciBwcm92aXNpb25pbmcgZWFjaCBQT04gbW9kZS4gKi8KK3R5cGVkZWYgZW51bQoreworICAgIEJDTU9MVF9QT05fQVBJX1RZUEVfR1BPTiwKKyAgICBCQ01PTFRfUE9OX0FQSV9UWVBFX1hHUE9OLAorfSBiY21vbHRfcG9uX2FwaV90eXBlOworCit0eXBlZGVmIGVudW0KK3sKKyAgICBCQ01PTFRfUE9OX1VTX1JBVEVfMUcsCisgICAgQkNNT0xUX1BPTl9VU19SQVRFXzJQNUcsCisgICAgQkNNT0xUX1BPTl9VU19SQVRFXzEwRywKK30gYmNtb2x0X3Bvbl91c19yYXRlOworCisvKiBOdW1iZXIgb2YgUE9OIE5JcyBwZXIgUE9OIG1vZGUgKi8KKyNkZWZpbmUgR1BPTl9NQVhfTlVNX09GX1BPTlMgMTYKKyNkZWZpbmUgWEdQT05fTUFYX05VTV9PRl9QT05TIDgKKyNkZWZpbmUgWEdQT05fSEFMRl9DSElQX01BWF9OVU1fT0ZfUE9OUyA0CisjZGVmaW5lIFhHU18yWF9OVU1fT0ZfUE9OUyAyCisjZGVmaW5lIE5HUE9OMl8yWF9OVU1fT0ZfUE9OUyAyCisjZGVmaW5lIE5HUE9OMl84WF9OVU1fT0ZfUE9OUyA4CisKKy8qIE9OVSdzIHBlciBQT04gKi8KKyNkZWZpbmUgR1BPTl9OVU1fT0ZfT05VUyAxMjgKKyNkZWZpbmUgWEdQT05fTlVNX09GX09OVVMgMjU2CisjZGVmaW5lIFhHUE9OX01BWF9OVU1fT0ZfT05VUyA1MTAKKworLyogQWxsb2MgSUQncyBwZXIgUE9OICovCisjZGVmaW5lIEdQT05fTlVNX09GX0RZTkFNSUNfQUxMT0NfSU5ESUNFUyA2NDAKKyNkZWZpbmUgR1BPTl9OVU1fT0ZfQUxMT0NfSURTIDEwMjQKKyNkZWZpbmUgWEdQT05fTlVNX09GX0RZTkFNSUNfQUxMT0NfSU5ESUNFUyAxMjgwCisjZGVmaW5lIFhHUE9OX05VTV9PRl9BTExPQ19JRFMgMjA0OAorCisvKiBBbGxvYyBJRCdzIHBlciBPTlUgKi8KKyNkZWZpbmUgR1BPTl9OVU1fT0ZfQUxMT0NfSURTX1BFUl9PTlUgMzIKKyNkZWZpbmUgWEdQT05fTlVNX09GX0FMTE9DX0lEU19QRVJfT05VIDMyCisjZGVmaW5lIE5VTV9PRl9BTExPQ19JRFNfUEVSX09OVSAoTUFYKEdQT05fTlVNX09GX0FMTE9DX0lEU19QRVJfT05VLCBYR1BPTl9OVU1fT0ZfQUxMT0NfSURTX1BFUl9PTlUpKQorCisjZGVmaW5lIEdQT05fT05VX0lEX0JST0FEQ0FTVCAoKGJjbW9sdF9wb25fb251X2lkKTB4RkYpCisjZGVmaW5lIFhHUE9OX09OVV9JRF9CUk9BRENBU1QgKChiY21vbHRfcG9uX29udV9pZCkweDNGRikKKyNkZWZpbmUgR1BPTl9PTlVfSURfVU5BU1NJR05FRCBHUE9OX09OVV9JRF9CUk9BRENBU1QKKyNkZWZpbmUgWEdQT05fT05VX0lEX1VOQVNTSUdORUQgWEdQT05fT05VX0lEX0JST0FEQ0FTVAorI2RlZmluZSBYR1BPTl9EVU1NWV9PTlVfSUQgKChiY21vbHRfcG9uX29udV9pZCk1MTEpCisKKyNkZWZpbmUgR1BPTl9BTExPQ19JRF9CUk9BRENBU1QgKChiY21vbHRfcG9uX2FsbG9jX2lkKTB4RkUpCisjZGVmaW5lIFhHUE9OX0FMTE9DX0lEX0JST0FEQ0FTVCAoKGJjbW9sdF9wb25fYWxsb2NfaWQpMHgzRkYpIC8qIFVzZWQgZm9yIDIuNUcgdXBzdHJlYW0gaW4gWEdQT04vWEdTL05HUE9OMiAqLworI2RlZmluZSBURU5fR0lHX0FMTE9DX0lEX0JST0FEQ0FTVCAoKGJjbW9sdF9wb25fYWxsb2NfaWQpMHgzRkUpIC8qIFVzZWQgZm9yIDEwRyB1cHN0cmVhbSBpbiBYR1MvTkdQT04yICovCisjZGVmaW5lIFRFTl9PUl8yUDVfR0lHX0FMTE9DX0lEX0JST0FEQ0FTVCAoKGJjbW9sdF9wb25fYWxsb2NfaWQpMHgzRkQpIC8qIFVzZWQgZm9yIGVpdGhlciAyLjVHLzEwRyB1cHN0cmVhbSBpbiBYR1MvTkdQT04yICovCisjZGVmaW5lIEdQT05fQUxMT0NfSURfVU5BU1NJR05FRCAoKGJjbW9sdF9wb25fYWxsb2NfaWQpMHhGRikKKyNkZWZpbmUgWEdQT05fQUxMT0NfSURfVU5BU1NJR05FRCAoKGJjbW9sdF9wb25fYWxsb2NfaWQpNTEyKSAvKiBJbiBYR1BPTiB3ZSBoYXZlIHVwIHRvIDUxMiBPTlUncywgYW5kIGFsbG9jIElEIGlzIHVudXNlZCBmb3Igc3VyZS4gKi8KKyNkZWZpbmUgWEdQT05fRFVNTVlfQUxMT0NfSUQgKChiY21vbHRfcG9uX2FsbG9jX2lkKTUxMSkKKworLyogR0VNIFBPUlQgSUQncyBwZXIgUE9OICovCisjZGVmaW5lIEdQT05fTlVNX09GX0dFTV9QT1JUX0lEU19QRVJfUE9OIDQwOTYKKyNkZWZpbmUgWEdQT05fTlVNX09GX0dFTV9QT1JUX0lEU19QRVJfUE9OIDgxOTIKKy8qIEdFTSBQT1JUIElEJ3MgcGVyIE9OVSAqLworI2RlZmluZSBNQVhfTlVNX09GX0dFTV9QT1JUX0lEU19QRVJfT05VIDI1NgorCisvKiBPTUNJL0NQVSBwYWNrZXRzICovCisjZGVmaW5lIE9NQ0lfQ1JDX0xFTiA0CisKKy8qIFBhY2tldCBzaXplcyAtIGFsbCB2YWx1ZXMgaW4gYnl0ZXMgcmVzb2x1dGlvbiAqLworI2RlZmluZSBPTUNJX01JTl9QS1RfU0laRV9XSVRIX0NSQyAxNAorI2RlZmluZSBPTUNJX01JTl9QS1RfU0laRV9XT19DUkMgMTAKKyNkZWZpbmUgT01DSV9NQVhfUEtUX1NJWkVfV0lUSF9DUkMgMTk4MAorI2RlZmluZSBPTUNJX01BWF9QS1RfU0laRV9XT19DUkMgMTk3NgorI2RlZmluZSBPTUNJX0JBU0VMSU5FX1BLVF9TSVpFX1dPX0NSQyA0NAorI2RlZmluZSBPTUNJX0VYVEVOREVEX1BLVF9TSVpFX1dPX0NSQyBPTUNJX01BWF9QS1RfU0laRV9XT19DUkMKKyNkZWZpbmUgQ1BVX01JTl9QS1RfU0laRV9XSVRIX0NSQyA2NAorI2RlZmluZSBDUFVfTUlOX1BLVF9TSVpFX1dPX0NSQyA2MAorI2RlZmluZSBDUFVfTUFYX1BLVF9TSVpFX1dJVEhfQ1JDIDIwNDgKKyNkZWZpbmUgQ1BVX01BWF9QS1RfU0laRV9XT19DUkMgMjA0NAorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2NvbW1vbl9ncG9uL2JjbV9jb21tb25fZ3Bvbl9mYXN0LmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvY29tbW9uX2dwb24vYmNtX2NvbW1vbl9ncG9uX2Zhc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGFjNWM1Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2NvbW1vbl9ncG9uL2JjbV9jb21tb25fZ3Bvbl9mYXN0LmgKQEAgLTAsMCArMSwxMjkgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6cHJvcHJpZXRhcnk6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitUaGlzIHByb2dyYW0gaXMgdGhlIHByb3ByaWV0YXJ5IHNvZnR3YXJlIG9mIEJyb2FkY29tIENvcnBvcmF0aW9uIGFuZC9vciBpdHMKK2xpY2Vuc29ycywgYW5kIG1heSBvbmx5IGJlIHVzZWQsIGR1cGxpY2F0ZWQsIG1vZGlmaWVkIG9yIGRpc3RyaWJ1dGVkIHB1cnN1YW50Cit0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgYSBzZXBhcmF0ZSwgd3JpdHRlbiBsaWNlbnNlIGFncmVlbWVudCBleGVjdXRlZAorYmV0d2VlbiB5b3UgYW5kIEJyb2FkY29tIChhbiAiQXV0aG9yaXplZCBMaWNlbnNlIikuICBFeGNlcHQgYXMgc2V0IGZvcnRoIGluCithbiBBdXRob3JpemVkIExpY2Vuc2UsIEJyb2FkY29tIGdyYW50cyBubyBsaWNlbnNlIChleHByZXNzIG9yIGltcGxpZWQpLCByaWdodAordG8gdXNlLCBvciB3YWl2ZXIgb2YgYW55IGtpbmQgd2l0aCByZXNwZWN0IHRvIHRoZSBTb2Z0d2FyZSwgYW5kIEJyb2FkY29tCitleHByZXNzbHkgcmVzZXJ2ZXMgYWxsIHJpZ2h0cyBpbiBhbmQgdG8gdGhlIFNvZnR3YXJlIGFuZCBhbGwgaW50ZWxsZWN0dWFsCitwcm9wZXJ0eSByaWdodHMgdGhlcmVpbi4gIElGIFlPVSBIQVZFIE5PIEFVVEhPUklaRUQgTElDRU5TRSwgVEhFTiBZT1UgSEFWRQorTk8gUklHSFQgVE8gVVNFIFRISVMgU09GVFdBUkUgSU4gQU5ZIFdBWSwgQU5EIFNIT1VMRCBJTU1FRElBVEVMWSBOT1RJRlkKK0JST0FEQ09NIEFORCBESVNDT05USU5VRSBBTEwgVVNFIE9GIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGV4cHJlc3NseSBzZXQgZm9ydGggaW4gdGhlIEF1dGhvcml6ZWQgTGljZW5zZSwKKworMS4gVGhpcyBwcm9ncmFtLCBpbmNsdWRpbmcgaXRzIHN0cnVjdHVyZSwgc2VxdWVuY2UgYW5kIG9yZ2FuaXphdGlvbiwKKyAgICBjb25zdGl0dXRlcyB0aGUgdmFsdWFibGUgdHJhZGUgc2VjcmV0cyBvZiBCcm9hZGNvbSwgYW5kIHlvdSBzaGFsbCB1c2UKKyAgICBhbGwgcmVhc29uYWJsZSBlZmZvcnRzIHRvIHByb3RlY3QgdGhlIGNvbmZpZGVudGlhbGl0eSB0aGVyZW9mLCBhbmQgdG8KKyAgICB1c2UgdGhpcyBpbmZvcm1hdGlvbiBvbmx5IGluIGNvbm5lY3Rpb24gd2l0aCB5b3VyIHVzZSBvZiBCcm9hZGNvbQorICAgIGludGVncmF0ZWQgY2lyY3VpdCBwcm9kdWN0cy4KKworMi4gVE8gVEhFIE1BWElNVU0gRVhURU5UIFBFUk1JVFRFRCBCWSBMQVcsIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiCisgICAgQU5EIFdJVEggQUxMIEZBVUxUUyBBTkQgQlJPQURDT00gTUFLRVMgTk8gUFJPTUlTRVMsIFJFUFJFU0VOVEFUSU9OUyBPUgorICAgIFdBUlJBTlRJRVMsIEVJVEhFUiBFWFBSRVNTLCBJTVBMSUVELCBTVEFUVVRPUlksIE9SIE9USEVSV0lTRSwgV0lUSAorICAgIFJFU1BFQ1QgVE8gVEhFIFNPRlRXQVJFLiAgQlJPQURDT00gU1BFQ0lGSUNBTExZIERJU0NMQUlNUyBBTlkgQU5ECisgICAgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBUSVRMRSwgTUVSQ0hBTlRBQklMSVRZLCBOT05JTkZSSU5HRU1FTlQsCisgICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIExBQ0sgT0YgVklSVVNFUywgQUNDVVJBQ1kgT1IKKyAgICBDT01QTEVURU5FU1MsIFFVSUVUIEVOSk9ZTUVOVCwgUVVJRVQgUE9TU0VTU0lPTiBPUiBDT1JSRVNQT05ERU5DRQorICAgIFRPIERFU0NSSVBUSU9OLiBZT1UgQVNTVU1FIFRIRSBFTlRJUkUgUklTSyBBUklTSU5HIE9VVCBPRiBVU0UgT1IKKyAgICBQRVJGT1JNQU5DRSBPRiBUSEUgU09GVFdBUkUuCisKKzMuIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBJTiBOTyBFVkVOVCBTSEFMTCBCUk9BRENPTSBPUgorICAgIElUUyBMSUNFTlNPUlMgQkUgTElBQkxFIEZPUiAoaSkgQ09OU0VRVUVOVElBTCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAgICBJTkRJUkVDVCwgT1IgRVhFTVBMQVJZIERBTUFHRVMgV0hBVFNPRVZFUiBBUklTSU5HIE9VVCBPRiBPUiBJTiBBTlkKKyAgICBXQVkgUkVMQVRJTkcgVE8gWU9VUiBVU0UgT0YgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgU09GVFdBUkUgRVZFTgorICAgIElGIEJST0FEQ09NIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUzsKKyAgICBPUiAoaWkpIEFOWSBBTU9VTlQgSU4gRVhDRVNTIE9GIFRIRSBBTU9VTlQgQUNUVUFMTFkgUEFJRCBGT1IgVEhFCisgICAgU09GVFdBUkUgSVRTRUxGIE9SIFUuUy4gJDEsIFdISUNIRVZFUiBJUyBHUkVBVEVSLiBUSEVTRSBMSU1JVEFUSU9OUworICAgIFNIQUxMIEFQUExZIE5PVFdJVEhTVEFORElORyBBTlkgRkFJTFVSRSBPRiBFU1NFTlRJQUwgUFVSUE9TRSBPRiBBTlkKKyAgICBMSU1JVEVEIFJFTUVEWS4KKzo+CisqLworI2lmbmRlZiBfQkNNX0NPTU1PTl9HUE9OX0ZBU1RfSF8KKyNkZWZpbmUgX0JDTV9DT01NT05fR1BPTl9GQVNUX0hfCisKKyNpZm5kZWYgU0lNVUxBVElPTl9CVUlMRAorI2luY2x1ZGUgPGJjbXRyX3BjaWVfc3dfcXVldWUuaD4KKyNlbmRpZgorCisjZGVmaW5lIEJDTV9DT01NT05fR1BPTl9GQVNUX0FQSV9MSVNUX1NJWkUgMTI4MAorI2RlZmluZSBCQ01fQ09NTU9OX0dQT05fRkFTVF9BUElfQUNDRVNTX0xJU1RfU0laRSAyMDQ4CisjZGVmaW5lIFVSR0VOVF9DSEFOTkVMIEJDTVRSX1NXUV9GSVJTVF9VUkdFTlRfQ0hBTk5FTAorCit0eXBlZGVmIGVudW0KK3sKKwlCQ01fQ09NTU9OX0ZBU1RfTVNHX1RZUEVfR0VUX0FMTE9DX1NUQVRTLAorCUJDTV9DT01NT05fRkFTVF9NU0dfVFlQRV9TRVRfQUxMT0NTLAorCUJDTV9DT01NT05fRkFTVF9NU0dfVFlQRV9TRVRfQldfQUxMT0NTCit9IGJjbV9jb21tb25fZmFzdF9tc2dfdHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgX19QQUNLRURfQVRUUl9TVEFSVF9fCit7CisJdWludDE2X3QgYWxsb2NfaWQ7CisJdWludDMyX3QgYWxsb2NhdGVkOworCXVpbnQzMl90IHVzZWQ7CisJdWludDMyX3Qgc3RhdHVzX3JlcG9ydDsKK30gX19QQUNLRURfQVRUUl9FTkRfXyBiY21fY29tbW9uX2Zhc3RfZ2V0X2FsbG9jX3N0YXRzOworCit0eXBlZGVmIHN0cnVjdCBfX1BBQ0tFRF9BVFRSX1NUQVJUX18KK3sKKwl1aW50OF90IHBvbl9uaTsKKwl1aW50MzJfdCBjeWNsZV9udW07CisJdWludDMyX3QgYXZhaWxhYmxlX2J3OworCXVpbnQzMl90IG51bV9vZl9hbGxvY3M7Cit9IF9fUEFDS0VEX0FUVFJfRU5EX18gYmNtX2NvbW1vbl9mYXN0X2dldF9zdGF0c19pbmRfaGRyOworCit0eXBlZGVmIHN0cnVjdCBfX1BBQ0tFRF9BVFRSX1NUQVJUX18KK3sKKwliY21fY29tbW9uX2Zhc3RfZ2V0X3N0YXRzX2luZF9oZHIgaGRyOworCWJjbV9jb21tb25fZmFzdF9nZXRfYWxsb2Nfc3RhdHMgYWxsb2Nfc3RhdHNfbGlzdFtCQ01fQ09NTU9OX0dQT05fRkFTVF9BUElfTElTVF9TSVpFXTsKK30gX19QQUNLRURfQVRUUl9FTkRfXyBiY21fY29tbW9uX2Zhc3RfZ2V0X3N0YXRzX2luZDsKKwordHlwZWRlZiBzdHJ1Y3QgX19QQUNLRURfQVRUUl9TVEFSVF9fCit7CisJdWludDE2X3QgYWxsb2NfaWQ7CisJdWludDMyX3QgYWxsb2NhdGlvbl9ibG9ja3M7CisJLyogdWludDhfdCBhY2Nlc3NfbnVtOyAgLSBXaWxsIGJlIGFkZGVkIGluIHRoZSAybmQgcGhhc2UgKi8KK30gX19QQUNLRURfQVRUUl9FTkRfXyBiY21fY29tbW9uX2Zhc3Rfc2V0X2FsbG9jOworCit0eXBlZGVmIHN0cnVjdCBfX1BBQ0tFRF9BVFRSX1NUQVJUX18KK3sKKwl1aW50MzJfdCBjeWNsZV9udW07CisJdWludDMyX3QgbnVtX29mX2FsbG9jczsKK30gX19QQUNLRURfQVRUUl9FTkRfXyBiY21fY29tbW9uX2Zhc3RfbXNnX2hkcjsKKwordHlwZWRlZiBzdHJ1Y3QgX19QQUNLRURfQVRUUl9TVEFSVF9fCit7CisJYmNtX2NvbW1vbl9mYXN0X21zZ19oZHIgaGRyOworCWJjbV9jb21tb25fZmFzdF9zZXRfYWxsb2Mgc2V0X2FsbG9jX2xpc3RbQkNNX0NPTU1PTl9HUE9OX0ZBU1RfQVBJX0xJU1RfU0laRV07Cit9IF9fUEFDS0VEX0FUVFJfRU5EX18gYmNtX2NvbW1vbl9mYXN0X3NldF9hbGxvY3NfbXNnOworCit0eXBlZGVmIHN0cnVjdCBfX1BBQ0tFRF9BVFRSX1NUQVJUX18KK3sKKwl1aW50MTZfdCBhbGxvY19pZDsKKwl1aW50MTZfdCBhbGxvY2F0aW9uX3NpemU7CisJdWludDE2X3Qgc3RhcnRfdGltZTsKKwl1aW50OF90IGJ1cnN0X3Byb2ZpbGU7CisgICAgc3RydWN0IF9fUEFDS0VEX0FUVFJfU1RBUlRfXworICAgIHsKKwkJYmNtb3NfYm9vbCBwbG9hbV9mbGFnCQkJOjE7CisJCWJjbW9zX2Jvb2wgZGJydV9mbGFnCQkJOjE7CisJCWJjbW9zX2Jvb2wgZW5kX29mX2ZyYW1lCQkJOjE7CisJCWJjbW9zX2Jvb2wgZW5kX29mX21hcAkJCToxOworCQliY21vc19ib29sIGZ3aQkJCQkJOjE7CisgICAgICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICAgCTozOworICAgIH0gX19QQUNLRURfQVRUUl9FTkRfXyBhbGxvY19mbGFnczsKK30gX19QQUNLRURfQVRUUl9FTkRfXyBiY21fY29tbW9uX2Zhc3Rfc2V0X2FjY2VzczsKKwordHlwZWRlZiBzdHJ1Y3QgX19QQUNLRURfQVRUUl9TVEFSVF9fCit7CisJYmNtX2NvbW1vbl9mYXN0X21zZ19oZHIgaGRyOworCWJjbV9jb21tb25fZmFzdF9zZXRfYWNjZXNzIHNldF9hY2Nlc3NfbGlzdFtCQ01fQ09NTU9OX0dQT05fRkFTVF9BUElfQUNDRVNTX0xJU1RfU0laRV07Cit9IF9fUEFDS0VEX0FUVFJfRU5EX18gYmNtX2NvbW1vbl9mYXN0X3NldF9hY2Nlc3Nlc19tc2c7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2NvbmZpZy9iY21fY29uZmlnLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvY29uZmlnL2JjbV9jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDAyZmUzCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2NvbmZpZy9iY21fY29uZmlnLmgKQEAgLTAsMCArMSw3NSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBCQ01PTFRfQ09ORklHX0hfCisjZGVmaW5lIEJDTU9MVF9DT05GSUdfSF8KKworLyoqIFxkZWZncm91cCBjb25maWcgQ29uZmlndXJhdGlvbiBDb25zdGFudHMKKyAqIENvbmZpZ3VyYXRpb24gY29uc3RhbnRzIHRoYXQgbXVzdCBiZSByZXZpc2VkIGJ5IGN1c3RvbWVyCisgKiBAeworICovCisKKy8qKiBDUFUgRW5kaWFubmVzcy4gTXVzdCBiZSBzZXQgdG8gQkNNT1NfRU5ESUFOX0JJRyBvciBCQ01PU19FTkRJQU5fTElUVExFLiAqLworI2lmbmRlZiBCQ01fQ1BVX0VORElBTgorCisjZXJyb3IgQkNNX0NQVV9FTkRJQU4gbXVzdCBiZSBzZXQgQkNNT1NfRU5ESUFOX0JJRyBvciBCQ01PU19FTkRJQU5fTElUVExFCisKKyNlbmRpZiAvKiAjaWZuZGVmIEJDTV9DUFVfRU5ESUFOICovCisKKy8qKiBUcmFuc3BvcnQgbGF5ZXIgY29uZmlndXJhdGlvbiBkZWZhdWx0cyAqLworI2RlZmluZSBCQ01UUl9UUl9UWVBFICAgICAgICAgICAgICBCQ01UUl9UWVBFX1VEUCAgICAgICAvKio8IFRyYW5zcG9ydCB0eXBlOiByYXcvdWRwICovCisjZGVmaW5lIEJDTVRSX1RSX1VEUF9IT1NUX0lQICAgICAgIDB4N2YwMDAwMDEKKyNkZWZpbmUgQkNNVFJfVFJfVURQX09MVF9JUCAgICAgICAgMHg3ZjAwMDAwMQorI2RlZmluZSBCQ01UUl9UUl9VRFBfSE9TVF9QT1JUICAgICAweDQwMDAKKyNkZWZpbmUgQkNNVFJfVFJfVURQX09MVF9QT1JUICAgICAgMHg0MDEwCisKKyNkZWZpbmUgQkNNVFJfTUFYX09MVFMgICAgICAgICAgICAgMiAgICAgIC8qKjwgTWF4IG51bWJlciBvZiBPTFRzICovCisjZGVmaW5lIEJDTVRSX01BWF9JTlNUQU5DRVMgICAgICAgIDE2ICAgICAvKio8IE1heCBudW1iZXIgb2YgbWVzc2FnZSBoYW5kbGVyIGluc3RhbmNlcyAtIHR5cGljYWxseSBhIG51bWJlciBvZiBQT04ncyAqLworI2RlZmluZSBCQ01UUl9NQVhfUkVUUklFUyAgICAgICAgICAwICAgICAgLyoqPCBNYXggbnVtYmVyIG9mIHJlcXVlc3QgcmV0cmFuc21pc3Npb25zICovCisjZGVmaW5lIEJDTVRSX01TR19USU1FT1VUICAgICAgICAgIDUwMCAgICAvKio8IE1heCB0aW1lIHRvIHdhaXQgZm9yIHJlc3BvbnNlIG9yIG5leHQgbWVzc2FnZSBwYXJ0IChtcykgKi8KKyNkZWZpbmUgQkNNVFJfTUFYX1JFUVVFU1RTICAgICAgICAgNjQgICAgIC8qKjwgTWF4IG51bWJlciBvZiBvdXRzdGFuZGluZyByZXF1ZXN0cyBwZXIgYXBwbGljYXRpb24gcGVyIE9MVCAqLworI2RlZmluZSBCQ01UUl9NQVhfQVVUT1MgICAgICAgICAgICAyNTYgICAgLyoqPCBNYXhpbXVtIG51bWJlciBvZiBzaW11bHRhbmVvdXMgbXVsdGktcGFydCBhdXRvbm9tb3VzIG1lc3NhZ2VzICovCisjZGVmaW5lIEJDTVRSX01BWF9GUkFHTUVOVFMgICAgICAgIDUwMCAgICAvKio8IE1heGltdW0gbnVtYmVyIG9mIGZyYWdtZW50cyBwZXIgbWVzc2FnZSAqLworI2RlZmluZSBCQ01UUl9NU0dfV0FJVF9NUyAgICAgICAgICA1ICAgICAgLyoqPCBsZW5ndGggb2YgdGltZSB0byB3YWl0IG9uIGNvbm4gcmVhZCAqLworI2RlZmluZSBCQ01UUl9NU0dfUkVBRFlfTVMgICAgICAgICA1MCAgICAgLyoqPCBUaW1lIHRvIHdhaXQgZm9yIGFwcGxpY2F0aW9uIHRvIHBlYWsgdXAgcmVzcG9uc2UgKi8KKyNkZWZpbmUgQkNNVFJfTUFYX01UVV9TSVpFICAgICAgICAgNDA5NiAgIC8qKjwgbWF4IE1UVSBzaXplICovCisjZGVmaW5lIEJDTVRSX1JYX1RIUkVBRF9TVEFDSyAgICAgIDAgICAgICAvKio8IFJ4IHRocmVhZCBzdGFjayBzaXplICovCisKKy8qKiBEZWJ1ZyBvdXRwdXQgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBCQ01fREJHX01BWF9NU0dfU0laRSAgICAgICAxMjggICAgLyoqPCBNYXggbnVtYmVyIG9mIG1lc3NhZ2UgYnl0ZXMgdG8gaW5jbHVkZSBpbiBtZXNzYWdlIGR1bXAgKi8KKworI2RlZmluZSBCQ01UUl9CVUZfRVhUUkFfSEVBRFJPT00gICAwICAgICAgLyoqPCBFeHRyYSBoZWFkcm9vbSB0byByZXNlcnZlIGlzIHN5c3RlbSBidWZmZXIgKi8KKworI2RlZmluZSBCQ01UUl9QQ0lFX1NUQVJUX1RJTUVPVVQgICAxNTAwMCAgLyoqPCBBcHBsaWNhdGlvbiBzdGFydCB0aW1lb3V0IChtcykgKi8KKyNkZWZpbmUgQkNNVFJfUENJRV9DT05ORUNUX1RJTUVPVVQgMTUwMDAgIC8qKjwgQ29ubmVjdCB0aW1lb3V0IChtcykgKi8KKy8qKiBAfSAqLworCisjZGVmaW5lIEJDTVRSX01BWF9SWFFfU0laRSAgICAgICAgIDI1NgorCisjZW5kaWYgLyogQkNNT0xUX0NPTkZJR19IXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2Nvb3BfZGJhL01ha2VmaWxlIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2Nvb3BfZGJhL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMjBhMjUKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvY29vcF9kYmEvTWFrZWZpbGUKQEAgLTAsMCArMSwzOCBAQAorIyBDb29wIERCQQorTU9EX05BTUUgPSBjb29wX2RiYQorCitpZmVxICgiJChPU19LRVJORUwpIiwgImxpbnV4IikKK01PRF9UWVBFID0gbGludXhfbGliCitlbHNlCitNT0RfVFlQRSA9IGxpYgorZW5kaWYKKworaWZlcSAoIiQoUkVMRUFTRV9CVUlMRCkiLCAieSIpCisJRVhUUkFfQ0ZMQUdTICs9IC1JJChUT1BfRElSKS9ob3N0X2RyaXZlci9hcGkgXAorLUkkKFRPUF9ESVIpL2hvc3RfZHJpdmVyL3V0aWxzIFwKKy1JJChUT1BfRElSKS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nIFwKKy1JJChUT1BfRElSKS9ob3N0X2RyaXZlci9jb21tb25fZ3BvbiBcCistSSQoVE9QX0RJUikvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L211eCBcCistSSQoVE9QX0RJUikvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L3BjaWVfc3dfcXVldWUgXAorLUkkKFRPUF9ESVIpL2hvc3RfZHJpdmVyL3BjaWUgXAorLUkkKFRPUF9ESVIpL2hvc3RfZHJpdmVyL3RyYW5zcG9ydAorZWxzZQorCUVYVFJBX0NGTEFHUyArPSAtSSQoVE9QX0RJUikvY29tbW9uL2dwb24gXAorLUkkKFRPUF9ESVIpL2NvbW1vbi9tb2RlbC9tYXBsZSBcCistSSQoVE9QX0RJUikvY29tbW9uL3RyYW5zcG9ydC9kcml2ZXIvbWFwbGUvcGNpZV9zd19xdWV1ZSBcCistSSQoVE9QX0RJUikvY29tbW9uL2RyaXZlcnMvbWFwbGUvcGNpZSBcCistSSQoVE9QX0RJUikvY29tbW9uL2FwaSBcCistSSQoVE9QX0RJUikvY29tbW9uL3V0aWxzIFwKKy1JJChUT1BfRElSKS9jb21tb24vZGV2X2xvZyBcCistSSQoVE9QX0RJUikvaG9zdC90cmFuc3BvcnQvZHJpdmVyL21hcGxlL211eAorZW5kaWYKKwkJCQkKK3NyY3MgPSBiY21vbHRfY29vcF9kYmEuYworCitNT0RfSU5DX0RJUlMgPSAkKFNSQ19ESVIpICQoTU9ERUxfT1VUX0RJUikKKworIyBJZiBjYWxsZWQgYnkgbGludXgga2VybmVsIGJ1aWxkZXIgLSBhZGQgaW5jbHVkZSBwYXRocyBtYW51YWxseS4KKyMgSXQgaXMgbm90IGVsZWdhbnQsIGJ1dCB3ZSdsbCBub3QgaGF2ZSBtYW55IGxpbnV4IG1vZHVsZXMKK2lmbmVxICgiJChLQlVJTERfU1JDKSIsICIiKQorCS1pbmNsdWRlICQoT1VUX0RJUl9CQVNFKS9NYWtlZmlsZS5jb25maWcuJChNT0RfTkFNRSkKK2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvY29vcF9kYmEvYmNtb2x0X2Nvb3BfZGJhLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvY29vcF9kYmEvYmNtb2x0X2Nvb3BfZGJhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRkN2FlNQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9jb29wX2RiYS9iY21vbHRfY29vcF9kYmEuYwpAQCAtMCwwICsxLDIyMyBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2luY2x1ZGUgImJjbW9sdF9jb29wX2RiYS5oIgorCisvKiB0aGlzIGlzIHRoZSBob3N0IGFwcGxpY2F0aW9uIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBjYWxsZWQgdG8gaGFuZGxlIHRoZSBpbmRpY2F0aW9ucyBzZW50IGZyb20KKyAqIHRoZSBlbWJlZGRlZCBzaWRlIHRvIHRoZSBob3N0IGR1cmluZyBEQkEgY3ljbGUKKyAqLworc3RhdGljIGJjbW9sdF9jb29wX2RiYV9ob3N0X2hhbmRsZXJfY2IgaG9zdF9oYW5kbGVyX2FycmF5W0JDTVRSX01BWF9PTFRTXTsKKworLyogQW4gQVBJIHRvIGltcGxlbWVudCBQYXJ0aWFsLUV4dGVybmFsIERCQSB0eXBlICovCitiY21vc19lcnJubyBiY21vbHRfZmFzdF9vcGVyX3NldF9hbGxvY3MoYmNtb2x0X2RldmlkIGRldmljZSwgdWludDhfdCBwb25fbmksIGJjbV9jb21tb25fZmFzdF9zZXRfYWxsb2NzX21zZyAqbXNnKQoreworCWJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKwliY21vc19idWYgKmJ1ZjsKKwl1bnNpZ25lZCBjaGFyICpidWZfZGF0YTsKKwliY21fY29tbW9uX2Zhc3Rfc2V0X2FsbG9jc19tc2cgKm1zZ19wOworCXVpbnQzMl90IGxlbiA9IHNpemVvZihiY21fY29tbW9uX2Zhc3RfbXNnX3R5cGUpICsgc2l6ZW9mKHBvbl9uaSkgKworCQlzaXplb2YobXNnLT5oZHIpICsgc2l6ZW9mKGJjbV9jb21tb25fZmFzdF9zZXRfYWxsb2MpICogbXNnLT5oZHIubnVtX29mX2FsbG9jczsKKwl1aW50MzJfdCBpOworCisgICAgYnVmID0gYmNtb3NfYnVmX2FsbG9jKGxlbik7CisKKyAgICBpZiAoIWJ1ZikKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiQ2FuJ3QgYWxsb2NhdGUgcGFja2V0IGJ1ZmZlclxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKyAgICBiY21vc19idWZfbGVuZ3RoX3NldChidWYsIGxlbik7CisgICAgYnVmX2RhdGEgPSBiY21vc19idWZfZGF0YShidWYpOworCisJLyogY2hhbmdlIGVuZGlhbm5lc3MgZnJvbSBob3N0IHRvIGVtYmVkZGVkICovCisKKyAgICAvKiBmaXhpbmcgaGVhZGVyIGVuZGlhbm5lc3MgYW5kIHBhY2tpbmcgKi8KKyAgICAqYnVmX2RhdGErKyA9ICh1aW50OF90KUJDTV9DT01NT05fRkFTVF9NU0dfVFlQRV9TRVRfQUxMT0NTOyAvKiBtc2cgdHlwZSAqLworICAgICpidWZfZGF0YSsrID0gcG9uX25pOyAvKiBwb25fbmkgaXMgVTggKi8KKworICAgIG1zZ19wID0gKGJjbV9jb21tb25fZmFzdF9zZXRfYWxsb2NzX21zZyAqKWJ1Zl9kYXRhOworCisgICAgbXNnX3AtPmhkci5jeWNsZV9udW0gPSBCQ01PTFRfQlVGX0VORElBTl9DUFVfVE9fQlVGKFUzMiwgbXNnLT5oZHIuY3ljbGVfbnVtKTsKKworICAgIG1zZ19wLT5oZHIubnVtX29mX2FsbG9jcyA9IEJDTU9MVF9CVUZfRU5ESUFOX0NQVV9UT19CVUYoVTMyLCBtc2ctPmhkci5udW1fb2ZfYWxsb2NzKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YobXNnLT5oZHIubnVtX29mX2FsbG9jcyk7IGkrKykKKyAgICB7CisgICAgCS8qIGdvaW5nIG92ZXIgdGhlIGxpc3QgcGFydHMgYW5kIGZpeGluZyB0aGVpciBlbmRpYW5pdHkgYW5kIHBhY2tpbmcgaW50byBidWYgKi8KKyAgICAJbXNnX3AtPnNldF9hbGxvY19saXN0W2ldLmFsbG9jX2lkID0gQkNNT0xUX0JVRl9FTkRJQU5fQ1BVX1RPX0JVRihVMTYsIG1zZy0+c2V0X2FsbG9jX2xpc3RbaV0uYWxsb2NfaWQpOworICAgIAltc2dfcC0+c2V0X2FsbG9jX2xpc3RbaV0uYWxsb2NhdGlvbl9ibG9ja3MgPSBCQ01PTFRfQlVGX0VORElBTl9DUFVfVE9fQlVGKFUzMiwgbXNnLT5zZXRfYWxsb2NfbGlzdFtpXS5hbGxvY2F0aW9uX2Jsb2Nrcyk7CisgICAgfQorCisJLyogc2VuZCBkaXJlY3RseSB0byBQQ0llIGRyaXZlciBvbiB0aGUgZGVkaWNhdGVkIGNoYW5uZWwgZm9yIGZhc3QgQVBJICovCisgICAgcmMgPSBiY210cl9zd3Ffc2VuZChkZXZpY2UsIFVSR0VOVF9DSEFOTkVMLCBidWYpOworCisgICAgaWYgKHJjKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJiY210cl9wY2llX3NlbmQgZmFpbGVkLiBFcnJvciAlcyAoJWQpXG4iLCBiY21vc19zdHJlcnJvcihyYyksIHJjKTsKKyAgICAgICAgYmNtb3NfYnVmX2ZyZWUoYnVmKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgLyogYnVmZmVyIHdpbGwgYmUgZnJlZWQgYXV0b21hdGljYWxseSBvbmNlIGl0IGlzIHRyYW5zbWl0dGVkICovCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIGJjbW9sdF9mYXN0X29wZXJfc2V0X2FjY2Vzc2VzKGJjbW9sdF9kZXZpZCBkZXZpY2UsIHVpbnQ4X3QgcG9uX25pLCBiY21fY29tbW9uX2Zhc3Rfc2V0X2FjY2Vzc2VzX21zZyAqbXNnKQoreworCWJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKwliY21vc19idWYqIGJ1ZjsKKwliY21fY29tbW9uX2Zhc3Rfc2V0X2FjY2Vzc2VzX21zZyAqbXNnX3A7CisJdW5zaWduZWQgY2hhciogYnVmX2RhdGE7CisJdWludDMyX3QgbGVuID0gc2l6ZW9mKGJjbV9jb21tb25fZmFzdF9tc2dfdHlwZSkgKyBzaXplb2YocG9uX25pKSArCisJCXNpemVvZiAobXNnLT5oZHIpICsgc2l6ZW9mKGJjbV9jb21tb25fZmFzdF9zZXRfYWNjZXNzKSAqIG1zZy0+aGRyLm51bV9vZl9hbGxvY3M7CisJdWludDMyX3QgaTsKKworICAgIGJ1ZiA9IGJjbW9zX2J1Zl9hbGxvYyhsZW4pOworCisgICAgaWYgKCFidWYpCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9FUlIoIkNhbid0IGFsbG9jYXRlIHBhY2tldCBidWZmZXJcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICB9CisgICAgYmNtb3NfYnVmX2xlbmd0aF9zZXQoYnVmLCBsZW4pOworICAgIGJ1Zl9kYXRhID0gYmNtb3NfYnVmX2RhdGEoYnVmKTsKKworCS8qIGNoYW5nZSBlbmRpYW5lc3MgZnJvbSBob3N0IHRvIGVtYmVkZGVkICovCisgICAgLyogZml4aW5nIGhlYWRlciBlbmRpYW5uZXNzIGFuZCBwYWNraW5nICovCisgICAgKmJ1Zl9kYXRhKysgPSAodWludDhfdClCQ01fQ09NTU9OX0ZBU1RfTVNHX1RZUEVfU0VUX0JXX0FMTE9DUzsKKyAgICAqYnVmX2RhdGErKyA9IHBvbl9uaTsgLyogcG9uX25pIGlzIFU4ICovCisKKyAgICBtc2dfcCA9IChiY21fY29tbW9uX2Zhc3Rfc2V0X2FjY2Vzc2VzX21zZyAqKWJ1Zl9kYXRhOworCisgICAgbXNnX3AtPmhkci5jeWNsZV9udW0gPSBCQ01PTFRfQlVGX0VORElBTl9DUFVfVE9fQlVGKFUzMiwgbXNnLT5oZHIuY3ljbGVfbnVtKTsKKyAgICBtc2dfcC0+aGRyLm51bV9vZl9hbGxvY3MgPSBCQ01PTFRfQlVGX0VORElBTl9DUFVfVE9fQlVGKFUzMiwgbXNnLT5oZHIubnVtX29mX2FsbG9jcyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKG1zZy0+aGRyLm51bV9vZl9hbGxvY3MpOyBpKyspCisgICAgeworICAgIAkvKiBnb2luZyBvdmVyIHRoZSBsaXN0IHBhcnRzIGFuZCBmaXhpbmcgdGhlaXIgZW5kaWFuaXR5IGFuZCBwYWNraW5nIGludG8gYnVmICovCisgICAgCW1zZ19wLT5zZXRfYWNjZXNzX2xpc3RbaV0uYWxsb2NfaWQgPSBCQ01PTFRfQlVGX0VORElBTl9DUFVfVE9fQlVGKFUxNiwgbXNnLT5zZXRfYWNjZXNzX2xpc3RbaV0uYWxsb2NfaWQpOworICAgIAltc2dfcC0+c2V0X2FjY2Vzc19saXN0W2ldLmFsbG9jYXRpb25fc2l6ZSA9IEJDTU9MVF9CVUZfRU5ESUFOX0NQVV9UT19CVUYoVTE2LCBtc2ctPnNldF9hY2Nlc3NfbGlzdFtpXS5hbGxvY2F0aW9uX3NpemUpOworICAgIAltc2dfcC0+c2V0X2FjY2Vzc19saXN0W2ldLnN0YXJ0X3RpbWUgPSBCQ01PTFRfQlVGX0VORElBTl9DUFVfVE9fQlVGKFUxNiwgbXNnLT5zZXRfYWNjZXNzX2xpc3RbaV0uc3RhcnRfdGltZSk7CisgICAgCW1zZ19wLT5zZXRfYWNjZXNzX2xpc3RbaV0uYnVyc3RfcHJvZmlsZSA9IG1zZy0+c2V0X2FjY2Vzc19saXN0W2ldLmJ1cnN0X3Byb2ZpbGU7IC8qIGJ1cnN0IHByb2ZpbGUgaXMgVTggKi8KKyAgICAJbXNnX3AtPnNldF9hY2Nlc3NfbGlzdFtpXS5hbGxvY19mbGFncyA9IG1zZy0+c2V0X2FjY2Vzc19saXN0W2ldLmFsbG9jX2ZsYWdzOyAvKiBwbG9hbV9mbGFnLCBkYnJ1X2ZsYWcsIGVuZF9vZl9mcmFtZSwgZW5kX29mX21hcCBhbmQgZndpIGFyZSBib29sZWFuIGFuZCBhcmUgcmVwcmVzZW50ZWQgYXMgYSBiaXRtYXAgKFU4KSAqLworICAgIH0KKworCS8qIHNlbmQgZGlyZWN0bHkgdG8gUENJZSBkcml2ZXIgb24gdGhlIGRlZGljYXRlZCBjaGFubmVsIGZvciBmYXN0IEFQSSAqLworCXJjID0gYmNtdHJfc3dxX3NlbmQoZGV2aWNlLCBVUkdFTlRfQ0hBTk5FTCwgYnVmKTsKKworICAgIGlmIChyYykKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiYmNtdHJfcGNpZV9zZW5kIGZhaWxlZC4gRXJyb3IgJXMgKCVkKVxuIiwgYmNtb3Nfc3RyZXJyb3IocmMpLCByYyk7CisgICAgICAgIGJjbW9zX2J1Zl9mcmVlKGJ1Zik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorICAgIC8qIGJ1ZmZlciB3aWxsIGJlIGZyZWVkIGF1dG9tYXRpY2FsbHkgb25jZSBpdCBpcyB0cmFuc21pdHRlZCAqLworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBSWCBjYWxsYmFjayB0byBoYW5kbGUgbWVzc2FnZXMgZnJvbSBlbWJlZGRlZCAtPiBob3N0ICovCit2b2lkIGJjbW9sdF9jb29wX2RiYV9yeChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vc19idWYgKnN5c2IsIGJjbXRybXV4X2NoYW5uZWwgY2hhbm5lbCwgdm9pZCAqZGF0YSkKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtX2NvbW1vbl9mYXN0X2dldF9zdGF0c19pbmQgKm1zZ19wOworCisgICAgdW5zaWduZWQgY2hhciAqYnVmX2RhdGEgPSBiY21vc19idWZfZGF0YShzeXNiKTsKKyAgICB1aW50MzJfdCBpOworCisgICAgLyogY2FsbGluZyBob3N0IGFwcGxpY2F0aW9uIGNhbGxiYWNrIHRvIGhhbmRsZSB0aGUgc3RhdGlzdGljcyBtZXNzYWdlIGZyb20gdGhlIGVtYmVkZGVkICovCisKKyAgICAvKiB0aGUgaG9zdCBpcyBleHBlY3RpbmcgYSBtZXNzYWdlIG9mIHR5cGU6CisgICAgICogdHlwZWRlZiBzdHJ1Y3QKKwkJeworCQkJYmNtb2x0X3hncG9uX25pX2Zhc3RfZ2V0X3N0YXRzX2luZF9oZHIgaGRyOworCQkJYndzX2RiYV9nZXRfYWxsb2Nfc3RhdCBhbGxvY19zdGF0c19saXN0W0JDTV9DT01NT05fR1BPTl9GQVNUX0FQSV9MSVNUX1NJWkVdOworCQl9YmNtb2x0X3hncG9uX25pX2Zhc3RfZ2V0X3N0YXRzX2luZDsKKyAgICAgKi8KKworICAgIG1zZ19wID0gKGJjbV9jb21tb25fZmFzdF9nZXRfc3RhdHNfaW5kICopYnVmX2RhdGE7CisgICAgLyogRml4aW5nIGVuZGlhbm5lc3MgYW5kICBjcmVhdGluZyBhIG1lc3NhZ2UuICovCisgICAgLyogcG9uX25pIHVzIHVpbnQ4IG5vIG5lZWQgdG8gZml4IGVuZGlhbm5lc3MgKi8KKyAgICBtc2dfcC0+aGRyLmN5Y2xlX251bSA9IEJDTU9MVF9CVUZfRU5ESUFOX0JVRl9UT19DUFUoVTMyLCBtc2dfcC0+aGRyLmN5Y2xlX251bSk7CisgICAgbXNnX3AtPmhkci5hdmFpbGFibGVfYncgPSBCQ01PTFRfQlVGX0VORElBTl9CVUZfVE9fQ1BVKFUzMiwgbXNnX3AtPmhkci5hdmFpbGFibGVfYncpOworICAgIG1zZ19wLT5oZHIubnVtX29mX2FsbG9jcyA9IEJDTU9MVF9CVUZfRU5ESUFOX0JVRl9UT19DUFUoVTMyLCBtc2dfcC0+aGRyLm51bV9vZl9hbGxvY3MpOworICAgIGZvciAoaSA9IDA7IGkgPCBtc2dfcC0+aGRyLm51bV9vZl9hbGxvY3M7IGkrKykKKyAgICB7CisgICAgCW1zZ19wLT5hbGxvY19zdGF0c19saXN0W2ldLmFsbG9jX2lkID0gQkNNT0xUX0JVRl9FTkRJQU5fQlVGX1RPX0NQVShVMTYsIG1zZ19wLT5hbGxvY19zdGF0c19saXN0W2ldLmFsbG9jX2lkKTsKKyAgICAJbXNnX3AtPmFsbG9jX3N0YXRzX2xpc3RbaV0uYWxsb2NhdGVkID0gQkNNT0xUX0JVRl9FTkRJQU5fQlVGX1RPX0NQVShVMzIsIG1zZ19wLT5hbGxvY19zdGF0c19saXN0W2ldLmFsbG9jYXRlZCk7CisgICAgCW1zZ19wLT5hbGxvY19zdGF0c19saXN0W2ldLnVzZWQgPSBCQ01PTFRfQlVGX0VORElBTl9CVUZfVE9fQ1BVKFUzMiwgbXNnX3AtPmFsbG9jX3N0YXRzX2xpc3RbaV0udXNlZCk7CisgICAgCW1zZ19wLT5hbGxvY19zdGF0c19saXN0W2ldLnN0YXR1c19yZXBvcnQgPSBCQ01PTFRfQlVGX0VORElBTl9CVUZfVE9fQ1BVKFUzMiwgbXNnX3AtPmFsbG9jX3N0YXRzX2xpc3RbaV0uc3RhdHVzX3JlcG9ydCk7CisgICAgfQorICAgIGlmIChob3N0X2hhbmRsZXJfYXJyYXlbZGV2aWNlXSkKKyAgICB7CisgICAgCWVyciA9IGhvc3RfaGFuZGxlcl9hcnJheVtkZXZpY2VdKGRldmljZSwgbXNnX3ApOworICAgIAlCVUdfT04oZXJyKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAJYmNtb3NfZnJlZShzeXNiKTsKKyAgICB9Cit9CisKK2JjbW9zX2Vycm5vIGJjbW9sdF9jb29wX2RiYV9pbml0KGJjbW9sdF9kZXZpZCBkZXZpZCwgYmNtdHJtdXhfY2hhbm5lbCAqY2hhbm5lbCwgZl9iY210cl9yeF9oYW5kbGVyIHJ4X2hhbmRsZXIsIHZvaWQgKmRhdGEpCit7CisJYmNtb3NfZXJybm8gcmM7CisKKwlyYyA9IGJjbXRybXV4X2NoYW5uZWxfcmVnaXN0ZXIoZGV2aWQsIGNoYW5uZWwsIHJ4X2hhbmRsZXIsIGRhdGEpOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgYmNtb3NfcHJpbnRmKCIlczogY2FuJ3QgcmVnaXN0ZXIgY2hhbm5lbCAlZCBmb3IgZGV2aWNlICV1LiByYz0lZFxuIiwgX19GVU5DVElPTl9fLCAqY2hhbm5lbCwgZGV2aWQsIChpbnQpcmMpOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCXJjID0gYmNtdHJfc3dxX3R4X3F1ZXVlX2NmZyhkZXZpZCwgQkNNVFJfUENJRV9QUlRZX05PUk1BTCwgQkNNT0xUX0NPT1BfREJBX0hBUkRRX1NJWkUsIEJDTU9MVF9DT09QX0RCQV9TT0ZUUV9TSVpFKTsKKwlpZiAocmMgIT0gQkNNX0VSUl9PSykKKwl7CisJCWJjbW9zX3ByaW50ZigiJXM6IGNhbid0IGNvbmZpZ3VyZSB0eCBxdWV1ZSBjaGFubmVsICVkIGZvciBkZXZpY2UgJXUuIHJjPSVkXG4iLCBfX0ZVTkNUSU9OX18sIGRldmlkLCAoaW50KXJjKTsKKwkJZ290byBleGl0OworCisJfQorCXJldHVybiByYzsKKworZXhpdDoKKwliY21vbHRfY29vcF9kYmFfZXhpdChkZXZpZCwgKmNoYW5uZWwpOworCXJldHVybiByYzsKK30KKwordm9pZCBiY21vbHRfY29vcF9kYmFfZXhpdChiY21vbHRfZGV2aWQgZGV2aWQsIGJjbXRybXV4X2NoYW5uZWwgY2hhbm5lbCkKK3sKKwliY210cm11eF9jaGFubmVsX3VucmVnaXN0ZXIoZGV2aWQsIGNoYW5uZWwpOworfQorCit2b2lkIGJjbW9sdF9jb29wX2RiYV9ob3N0X2hhbmRsZXJfcmVnaXN0ZXIoYmNtb2x0X2RldmlkIGRldmlkLCBiY21vbHRfY29vcF9kYmFfaG9zdF9oYW5kbGVyX2NiIGhvc3RfaGFuZGxlcikKK3sKKwlob3N0X2hhbmRsZXJfYXJyYXlbZGV2aWRdID0gaG9zdF9oYW5kbGVyOworfQorCit2b2lkIGJjbW9sdF9jb29wX2RiYV9ob3N0X2hhbmRsZXJfdW5yZWdpc3RlcihiY21vbHRfZGV2aWQgZGV2aWQpCit7CisJaG9zdF9oYW5kbGVyX2FycmF5W2RldmlkXSA9IE5VTEw7Cit9CmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvY29vcF9kYmEvYmNtb2x0X2Nvb3BfZGJhLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvY29vcF9kYmEvYmNtb2x0X2Nvb3BfZGJhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNjYTRlYwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9jb29wX2RiYS9iY21vbHRfY29vcF9kYmEuaApAQCAtMCwwICsxLDQ5IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaWZuZGVmIF9CQ01PTFRfQ09PUF9EQkFfSF8KKyNkZWZpbmUgX0JDTU9MVF9DT09QX0RCQV9IXworCisjaW5jbHVkZSA8YmNtb2x0X21zZy5oPgorI2luY2x1ZGUgPGJjbV9jb21tb25fZ3Bvbl9mYXN0Lmg+CisjaW5jbHVkZSA8YmNtb2x0X3RyX211eC5oPgorCisjZGVmaW5lIEJDTU9MVF9DT09QX0RCQV9IQVJEUV9TSVpFIDQKKyNkZWZpbmUgQkNNT0xUX0NPT1BfREJBX1NPRlRRX1NJWkUgMAorCit0eXBlZGVmIGJjbW9zX2Vycm5vICgqYmNtb2x0X2Nvb3BfZGJhX2hvc3RfaGFuZGxlcl9jYikoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtX2NvbW1vbl9mYXN0X2dldF9zdGF0c19pbmQgKmRhdGEpOworCitiY21vc19lcnJubyBiY21vbHRfZmFzdF9vcGVyX3NldF9hbGxvY3MoYmNtb2x0X2RldmlkIGRldmljZSwgdWludDhfdCBwb25fbmksIGJjbV9jb21tb25fZmFzdF9zZXRfYWxsb2NzX21zZyAqbXNnKTsKK2JjbW9zX2Vycm5vIGJjbW9sdF9mYXN0X29wZXJfc2V0X2FjY2Vzc2VzKGJjbW9sdF9kZXZpZCBkZXZpY2UsIHVpbnQ4X3QgcG9uX25pLCBiY21fY29tbW9uX2Zhc3Rfc2V0X2FjY2Vzc2VzX21zZyAqbXNnKTsKK3ZvaWQgYmNtb2x0X2Nvb3BfZGJhX2V4aXQoYmNtb2x0X2RldmlkIGRldmlkLCBiY210cm11eF9jaGFubmVsIGNoYW5uZWwpOworYmNtb3NfZXJybm8gYmNtb2x0X2Nvb3BfZGJhX2luaXQoYmNtb2x0X2RldmlkIGRldmlkLCBiY210cm11eF9jaGFubmVsICpjaGFubmVsLCBmX2JjbXRyX3J4X2hhbmRsZXIgcnhfaGFuZGxlciwgdm9pZCAqZGF0YSk7Cit2b2lkIGJjbW9sdF9jb29wX2RiYV9ob3N0X2hhbmRsZXJfcmVnaXN0ZXIoYmNtb2x0X2RldmlkIGRldmlkLCBiY21vbHRfY29vcF9kYmFfaG9zdF9oYW5kbGVyX2NiIGhvc3RfaGFuZGxlcik7Cit2b2lkIGJjbW9sdF9jb29wX2RiYV9ob3N0X2hhbmRsZXJfdW5yZWdpc3RlcihiY21vbHRfZGV2aWQgZGV2aWQpOwordm9pZCBiY21vbHRfY29vcF9kYmFfcngoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb3NfYnVmICpzeXNiLCBiY210cm11eF9jaGFubmVsIGNoYW5uZWwsIHZvaWQgKmRhdGEpOworI2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZGVidWcvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZGVidWcvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU2ZTNlNgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9kZWJ1Zy9NYWtlZmlsZQpAQCAtMCwwICsxLDEwIEBACisjIENvbW1vbiBkZWJ1ZyBBUEkKKyMKK01PRF9OQU1FID0gZGVidWdfY29tbW9uCitNT0RfREVQUyA9IG9zIGRldl9sb2cgdXRpbHMgbW9kZWwgdHJhbnNwb3J0IGNvbW1vbl9hcGkKK01PRF9UWVBFID0gbGliCisKK3NyY3MgPSBiY21vbHRfZGVidWdfYXBpX2NvbW1vbi5jCisKK1VTRV9MSU5UPXllcworCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZGVidWcvYmNtb2x0X2RlYnVnX2FwaV9jb21tb24uYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9kZWJ1Zy9iY21vbHRfZGVidWdfYXBpX2NvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYjZiY2YKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZGVidWcvYmNtb2x0X2RlYnVnX2FwaV9jb21tb24uYwpAQCAtMCwwICsxLDMyNyBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2luY2x1ZGUgImJjbW9zX3N5c3RlbS5oIgorI2luY2x1ZGUgImJjbW9sdF9tYXRoLmgiCisjaW5jbHVkZSAiYmNtdHJfZGVidWcuaCIKKyNpbmNsdWRlICJiY21vbHRfbXNnLmgiCisjaW5jbHVkZSAiYmNtb2x0X2RlYnVnX2FwaV9jb21tb24uaCIKKworI2RlZmluZSBBUElfQ0ZHX1BST1BfRVhJU1RTKG1hc2ssIHByb3ApICAoKChtYXNrKSAmICgxVUxMIDw8IChwcm9wKSkpICE9IDApCisKK3N0YXRpYyB2b2lkIGJjbW9sdF9kZWJ1Z19hcGlfY29tbW9uX2NhcHR1cmVfc3RhdHNfdXBkYXRlKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9kZWJ1Z19hcGlfZGIgKmRiKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY210cl9jYXB0dXJlX2luZm8gaW5mbzsKKworICAgIGVyciA9IGJjbXRyX2NhcHR1cmVfaW5mb19nZXQoZGV2aWNlLCAmaW5mbyk7CisgICAgQlVHX09OKEJDTV9FUlJfT0sgIT0gZXJyKTsKKworICAgIGRiLT5jZmcuYXBpX2NhcHR1cmVfc3RhdHMuYnVmZmVyX3VzZWRfYnl0ZXMgPSBpbmZvLnVzZWQ7CisgICAgZGItPmNmZy5hcGlfY2FwdHVyZV9zdGF0cy5ldmVudHNfcmVjb3JkZWQgPSBpbmZvLm1zZ3M7CisgICAgZGItPmNmZy5hcGlfY2FwdHVyZV9zdGF0cy5ldmVudHNfZHJvcHBlZCA9IGluZm8ubG9zdDsKKyAgICBkYi0+Y2ZnLmFwaV9jYXB0dXJlX3N0YXRzLmJ1ZmZlcl93cmFwX2NvdW50ID0gaW5mby53YTsKKworICAgIGVyciA9IGJjbXRyX2NhcHR1cmVfc2l6ZV9nZXQoZGV2aWNlLCAmZGItPmNmZy5hcGlfY2FwdHVyZV9zdGF0cy5yZWFkYWJsZV9ieXRlcyk7CisgICAgQlVHX09OKEJDTV9FUlJfT0sgIT0gZXJyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9kZWJ1Z19hcGlfY29tbW9uX2NhcHR1cmVfaW5pdChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfZGVidWdfYXBpX2RiICpkYikKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtdHJfY2FwdHVyZV9wYXJtIGNhcF9wYXJtID0ge307CisKKyAgICBjYXBfcGFybS5zaXplID0gZGItPmNmZy5hcGlfY2FwdHVyZV9jZmcuYnVmZmVyX3NpemVfYnl0ZXM7CisgICAgY2FwX3Bhcm0ucHRyID0gZGItPmNhcHR1cmVfYnVmZmVyOworICAgIGNhcF9wYXJtLnN0b3Bfb25fZnVsbCA9IGRiLT5jZmcuYXBpX2NhcHR1cmVfY2ZnLmJ1ZmZlcl9tb2RlID09IEJDTU9MVF9BUElfQ0FQVFVSRV9CVUZGRVJfTU9ERV9PVkVSRkxPVzsKKyAgICBjYXBfcGFybS5hY3RpdmF0ZSA9IEJDTU9TX0ZBTFNFOworCisgICAgZXJyID0gYmNtdHJfY2FwdHVyZV9pbml0KGRldmljZSwgJmNhcF9wYXJtKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoQkNNX0VSUl9PSyAhPSBlcnIsIGVycik7CisKKyAgICBiY21vbHRfZGVidWdfYXBpX2NvbW1vbl9jYXB0dXJlX3N0YXRzX3VwZGF0ZShkZXZpY2UsIGRiKTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtb2x0X2RlYnVnX2FwaV9jb21tb25fZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9tc2cgKm1zZywgYmNtb2x0X2RlYnVnX2FwaV9kYiAqZGIpCit7CisgICAgaWYgKEFQSV9DRkdfUFJPUF9FWElTVFMobXNnLT5wcmVzZW5jZV9tYXNrLCBCQ01PTFRfREVCVUdfQ0ZHX0lEX0FQSV9DQVBUVVJFX0JVRkZFUikpCisgICAgeworICAgICAgICB1aW50MzJfdCB0b19yZWFkID0gMDsKKworICAgICAgICBpZiAoYmNtdHJfY2FwdHVyZV9pc19hY3RpdmUoZGV2aWNlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9tc2dfZXJyKAorICAgICAgICAgICAgICAgIG1zZywKKyAgICAgICAgICAgICAgICBERVZfTE9HX0lOVkFMSURfSUQsCisgICAgICAgICAgICAgICAgQkNNX0VSUl9TVEFURSwKKyAgICAgICAgICAgICAgICBCQ01PTFRfREVCVUdfQ0ZHX0lEX0FQSV9DQVBUVVJFX0JVRkZFUiwKKyAgICAgICAgICAgICAgICAiQ2Fubm90IHJlYWQgY2FwdHVyZSBidWZmZXIgd2hpbGUgY2FwdHVyZSBpcyBpbiBwcm9ncmVzcyIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRiLT5jZmcuYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQub2Zmc2V0IDwgZGItPmNmZy5hcGlfY2FwdHVyZV9zdGF0cy5yZWFkYWJsZV9ieXRlcykKKyAgICAgICAgeworICAgICAgICAgICAgdG9fcmVhZCA9IE1JTigKKyAgICAgICAgICAgICAgICBkYi0+Y2ZnLmFwaV9jYXB0dXJlX2J1ZmZlci5sZW4sCisgICAgICAgICAgICAgICAgZGItPmNmZy5hcGlfY2FwdHVyZV9zdGF0cy5yZWFkYWJsZV9ieXRlcyAtIGRiLT5jZmcuYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQub2Zmc2V0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGRiLT5jZmcuYXBpX2NhcHR1cmVfYnVmZmVyLnZhbCAhPSBOVUxMKSAmJiAoZGItPmNmZy5hcGlfY2FwdHVyZV9idWZmZXIubGVuID4gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbXRyX2NhcHR1cmVfcmVhZCgKKyAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgICAgICAgICAgICAgZGItPmNmZy5hcGlfY2FwdHVyZV9idWZmZXIudmFsLAorICAgICAgICAgICAgICAgIGRiLT5jZmcuYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQub2Zmc2V0LAorICAgICAgICAgICAgICAgICZ0b19yZWFkKTsKKyAgICAgICAgICAgIG1lbXNldChkYi0+Y2ZnLmFwaV9jYXB0dXJlX2J1ZmZlci52YWwgKyAoZGItPmNmZy5hcGlfY2FwdHVyZV9idWZmZXIubGVuIC0gdG9fcmVhZCksIDAsIHRvX3JlYWQpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2RlYnVnX3RyYW5zX2hhbmRsZSAqYmNtb2x0X2RlYnVnX2FwaV9jb21tb25fY2ZnX3RyYW5zX3N0YXJ0KGJjbW9sdF9kZWJ1Z19hcGlfZGIgKmRiKQoreworICAgIGRlYnVnX3RyYW5zX2hhbmRsZSAqaGFuZGxlID0gYmNtb3NfY2FsbG9jKHNpemVvZigqaGFuZGxlKSk7CisgICAgaGFuZGxlLT5vbGRfZGIgPSAqZGI7CisgICAgaGFuZGxlLT5uZXdfZGIgPSBkYjsKKyAgICByZXR1cm4gaGFuZGxlOworfQorCit2b2lkIGJjbW9sdF9kZWJ1Z19hcGlfY29tbW9uX2NmZ190cmFuc19mYWlsKGJjbW9sdF9kZWJ1Z19hcGlfZGIgKmRiLCBkZWJ1Z190cmFuc19oYW5kbGUgKmhhbmRsZSkKK3sKKyAgICBpZiAoaGFuZGxlLT5vbGRfZGIuY2FwdHVyZV9idWZmZXIgIT0gaGFuZGxlLT5uZXdfZGItPmNhcHR1cmVfYnVmZmVyKQorICAgIHsKKyAgICAgICAgYmNtb3NfZnJlZShoYW5kbGUtPm5ld19kYi0+Y2FwdHVyZV9idWZmZXIpOworICAgIH0KKyAgICBpZiAoaGFuZGxlLT5vbGRfZGIuY2ZnLmFwaV9jYXB0dXJlX2J1ZmZlci52YWwgIT0gaGFuZGxlLT5uZXdfZGItPmNmZy5hcGlfY2FwdHVyZV9idWZmZXIudmFsKQorICAgIHsKKyAgICAgICAgYmNtb3NfZnJlZShoYW5kbGUtPm5ld19kYi0+Y2ZnLmFwaV9jYXB0dXJlX2J1ZmZlci52YWwpOworICAgIH0KKyAgICAqZGIgPSBoYW5kbGUtPm9sZF9kYjsKKyAgICBiY21vc19mcmVlKGhhbmRsZSk7Cit9CisKK3ZvaWQgYmNtb2x0X2RlYnVnX2FwaV9jb21tb25fY2ZnX3RyYW5zX3N1Y2NlZWQoYmNtb2x0X2RldmlkIGRldmljZSwgZGVidWdfdHJhbnNfaGFuZGxlICpoYW5kbGUpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgaWYgKGhhbmRsZS0+b2xkX2RiLmNhcHR1cmVfYnVmZmVyICE9IGhhbmRsZS0+bmV3X2RiLT5jYXB0dXJlX2J1ZmZlcikKKyAgICB7CisgICAgICAgIGJjbW9zX2ZyZWUoaGFuZGxlLT5vbGRfZGIuY2FwdHVyZV9idWZmZXIpOworICAgICAgICBiY210cl9jYXB0dXJlX2Rlc3Ryb3koZGV2aWNlKTsKKyAgICAgICAgZXJyID0gYmNtb2x0X2RlYnVnX2FwaV9jb21tb25fY2FwdHVyZV9pbml0KGRldmljZSwgaGFuZGxlLT5uZXdfZGIpOworICAgICAgICBpZiAoQkNNX0VSUl9PSyAhPSBlcnIpIC8qIGNmZ19zZXQgc2hvdWxkIGhhdmUgdmFsaWRhdGVkIHRoYXQgdGhpcyB3b24ndCBmYWlsICovCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiQ2FwdHVyZSBpbml0IGZhaWxlZCAoJXMpIVxuIiwgYmNtb3Nfc3RyZXJyb3IoZXJyKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGhhbmRsZS0+b2xkX2RiLmNmZy5hcGlfY2FwdHVyZV9idWZmZXIudmFsICE9IGhhbmRsZS0+bmV3X2RiLT5jZmcuYXBpX2NhcHR1cmVfYnVmZmVyLnZhbCkKKyAgICB7CisgICAgICAgIGJjbW9zX2ZyZWUoaGFuZGxlLT5vbGRfZGIuY2ZnLmFwaV9jYXB0dXJlX2J1ZmZlci52YWwpOworICAgIH0KKyAgICBiY21vc19mcmVlKGhhbmRsZSk7Cit9CisKK2JjbW9zX2Vycm5vIGJjbW9sdF9kZWJ1Z19hcGlfY29tbW9uX3NldCgKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlLAorICAgIGJjbW9sdF9tc2cgKm1zZywKKyAgICBjb25zdCBiY21vbHRfZGVidWdfY2ZnX2RhdGEgKmRhdGEsCisgICAgZGVidWdfdHJhbnNfaGFuZGxlICpoYW5kbGUsCisgICAgYmNtb2x0X2FwaV9jYXB0dXJlX2xvY2F0aW9uIGxvY2FsKQoreworICAgIGlmIChBUElfQ0ZHX1BST1BfRVhJU1RTKG1zZy0+cHJlc2VuY2VfbWFzaywgQkNNT0xUX0RFQlVHX0NGR19JRF9BUElfQ0FQVFVSRV9DRkcpKQorICAgIHsKKyAgICAgICAgaWYgKGJjbXRyX2NhcHR1cmVfaXNfYWN0aXZlKGRldmljZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBiY21vbHRfbXNnX2VycigKKyAgICAgICAgICAgICAgICBtc2csCisgICAgICAgICAgICAgICAgREVWX0xPR19JTlZBTElEX0lELAorICAgICAgICAgICAgICAgIEJDTV9FUlJfU1RBVEUsCisgICAgICAgICAgICAgICAgQkNNT0xUX0RFQlVHX0NGR19JRF9BUElfQ0FQVFVSRV9DRkcsCisgICAgICAgICAgICAgICAgIkNhbm5vdCBjaGFuZ2UgY2FwdHVyZSBjb25maWd1cmF0aW9uIHdoaWxlIGNhcHR1cmUgaXMgaW4gcHJvZ3Jlc3MiKTsKKyAgICAgICAgfQorICAgICAgICBoYW5kbGUtPm5ld19kYi0+Y2ZnLmFwaV9jYXB0dXJlX2NmZyA9IGRhdGEtPmFwaV9jYXB0dXJlX2NmZzsKKyAgICB9CisKKyAgICBpZiAoQVBJX0NGR19QUk9QX0VYSVNUUyhtc2ctPnByZXNlbmNlX21hc2ssIEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfQlVGRkVSX1JFQUQpKQorICAgIHsKKyAgICAgICAgaGFuZGxlLT5uZXdfZGItPmNmZy5hcGlfY2FwdHVyZV9idWZmZXJfcmVhZCA9IGRhdGEtPmFwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkOworICAgIH0KKworICAgIC8qIE9uY2UgYWxsIHRoZSBwcm9wZXJ0aWVzIGFyZSBoYW5kbGVkLCB3ZSBuZWVkIHRvIHRha2UgY2FyZSBvZiBhIGZldyB0aGluZ3MgdGhhdCBjb3VsZCBkZXBlbmQgb24gbXVsdGlwbGUKKyAgICAgICBwcm9wZXJ0aWVzICovCisgICAgaWYgKChoYW5kbGUtPm5ld19kYi0+Y2ZnLmFwaV9jYXB0dXJlX2NmZy5sb2NhdGlvbiA9PSBsb2NhbCkgJiYKKyAgICAgICAgLyogSWYgd2UganVzdCBzd2l0Y2hlZCB0byB0aGUgZGV2aWNlIC4uLiAqLworICAgICAgICAoKGhhbmRsZS0+bmV3X2RiLT5jZmcuYXBpX2NhcHR1cmVfY2ZnLmxvY2F0aW9uICE9IGhhbmRsZS0+b2xkX2RiLmNmZy5hcGlfY2FwdHVyZV9jZmcubG9jYXRpb24pIHx8CisgICAgICAgICAvKiAuLi4gb3IgZWl0aGVyIHRoZSBidWZmZXIgc2l6ZSAuLi4gKi8KKyAgICAgICAgKGhhbmRsZS0+bmV3X2RiLT5jZmcuYXBpX2NhcHR1cmVfY2ZnLmJ1ZmZlcl9zaXplX2J5dGVzICE9CisgICAgICAgICBoYW5kbGUtPm9sZF9kYi5jZmcuYXBpX2NhcHR1cmVfY2ZnLmJ1ZmZlcl9zaXplX2J5dGVzKSB8fAorICAgICAgICAgLyogLi4uIG9yIHRoZSBidWZmZXIgbW9kZSBoYXZlIGNoYW5nZWQgKi8KKyAgICAgICAgKGhhbmRsZS0+bmV3X2RiLT5jZmcuYXBpX2NhcHR1cmVfY2ZnLmJ1ZmZlcl9tb2RlICE9IGhhbmRsZS0+b2xkX2RiLmNmZy5hcGlfY2FwdHVyZV9jZmcuYnVmZmVyX21vZGUpKSkKKyAgICB7CisgICAgICAgIGhhbmRsZS0+bmV3X2RiLT5jYXB0dXJlX2J1ZmZlciA9IGJjbW9zX2FsbG9jKGhhbmRsZS0+bmV3X2RiLT5jZmcuYXBpX2NhcHR1cmVfY2ZnLmJ1ZmZlcl9zaXplX2J5dGVzKTsKKyAgICAgICAgaWYgKGhhbmRsZS0+bmV3X2RiLT5jYXB0dXJlX2J1ZmZlciA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYmNtb2x0X21zZ19lcnIoCisgICAgICAgICAgICAgICAgbXNnLAorICAgICAgICAgICAgICAgIERFVl9MT0dfSU5WQUxJRF9JRCwKKyAgICAgICAgICAgICAgICBCQ01fRVJSX05PTUVNLAorICAgICAgICAgICAgICAgIEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfQlVGRkVSX1JFQUQsCisgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBuZXcgY2FwdHVyZSBidWZmZXIiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoaGFuZGxlLT5uZXdfZGItPmNmZy5hcGlfY2FwdHVyZV9jZmcubG9jYXRpb24gPT0gbG9jYWwpICYmCisgICAgICAgIC8qIElmIHdlIGp1c3Qgc3dpdGNoZWQgdG8gdGhlIGRldmljZSAuLi4gKi8KKyAgICAgICAgKChoYW5kbGUtPm5ld19kYi0+Y2ZnLmFwaV9jYXB0dXJlX2NmZy5sb2NhdGlvbiAhPSBoYW5kbGUtPm9sZF9kYi5jZmcuYXBpX2NhcHR1cmVfY2ZnLmxvY2F0aW9uKSB8fAorICAgICAgICAgLyogLi4uIG9yIHRoZSByZWFkIHNpemUgaGFzIGNoYW5nZWQgKi8KKyAgICAgICAgKGhhbmRsZS0+b2xkX2RiLmNmZy5hcGlfY2FwdHVyZV9idWZmZXJfcmVhZC5zaXplICE9IGhhbmRsZS0+bmV3X2RiLT5jZmcuYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQuc2l6ZSkpKQorICAgIHsKKyAgICAgICAgaGFuZGxlLT5uZXdfZGItPmNmZy5hcGlfY2FwdHVyZV9idWZmZXIubGVuID0gaGFuZGxlLT5uZXdfZGItPmNmZy5hcGlfY2FwdHVyZV9idWZmZXJfcmVhZC5zaXplOworICAgICAgICBpZiAoaGFuZGxlLT5uZXdfZGItPmNmZy5hcGlfY2FwdHVyZV9idWZmZXIubGVuICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGhhbmRsZS0+bmV3X2RiLT5jZmcuYXBpX2NhcHR1cmVfYnVmZmVyLnZhbCA9IGJjbW9zX2FsbG9jKGhhbmRsZS0+bmV3X2RiLT5jZmcuYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQuc2l6ZSk7CisgICAgICAgICAgICBpZiAoaGFuZGxlLT5uZXdfZGItPmNmZy5hcGlfY2FwdHVyZV9idWZmZXIudmFsID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9tc2dfZXJyKAorICAgICAgICAgICAgICAgICAgICBtc2csCisgICAgICAgICAgICAgICAgICAgIERFVl9MT0dfSU5WQUxJRF9JRCwKKyAgICAgICAgICAgICAgICAgICAgQkNNX0VSUl9OT01FTSwKKyAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFQlVHX0NGR19JRF9BUElfQ0FQVFVSRV9CVUZGRVJfUkVBRCwKKyAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBuZXcgcmVhZCBidWZmZXIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGhhbmRsZS0+bmV3X2RiLT5jZmcuYXBpX2NhcHR1cmVfYnVmZmVyLnZhbCA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtb2x0X2RlYnVnX2FwaV9jb21tb25fb3Blcl9zdGFydF9hcGlfY2FwdHVyZShiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfbXNnICptc2cpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbXRyX2NsZF9maWx0ZXIgZmlsdGVyOworCisgICAgaWYgKGJjbXRyX2NhcHR1cmVfaXNfYWN0aXZlKGRldmljZSkpCisgICAgeworICAgICAgICByZXR1cm4gYmNtb2x0X21zZ19lcnIoCisgICAgICAgICAgICBtc2csCisgICAgICAgICAgICBERVZfTE9HX0lOVkFMSURfSUQsCisgICAgICAgICAgICBCQ01fRVJSX0FMUkVBRFksCisgICAgICAgICAgICBCQ01PTFRfRVJSX0ZJRUxEX05PTkUsCisgICAgICAgICAgICAiQ2FwdHVyZSBhbHJlYWR5IGluIHByb2dyZXNzIik7CisgICAgfQorCisgICAgLyogY2FwdHVyZSBldmVyeXRoaW5nICovCisgICAgZmlsdGVyLm9iamVjdCA9IEJDTU9MVF9PQkpFQ1RfQU5ZOworICAgIGZpbHRlci5ncm91cCA9IEJDTU9MVF9NR1RfR1JPVVBfQU5ZOworICAgIGZpbHRlci5zdWJncm91cCA9IEJDTU9MVF9TVUJHUk9VUF9BTlk7CisgICAgZXJyID0gYmNtdHJfY2xkX2xldmVsX3NldChkZXZpY2UsICZmaWx0ZXIsIEJDTVRSX0NMRF9DQVBUVVJFKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoQkNNX0VSUl9PSyAhPSBlcnIsIGVycik7CisgICAgLyogZm9yIG5vdyBmaWx0ZXIgb3V0IHN0YXJ0L3N0b3Agb3BlcmF0aW9ucyBhbmQga2VlcC1hbGl2ZXMgKi8KKyAgICBmaWx0ZXIub2JqZWN0ID0gQkNNT0xUX09CSl9JRF9ERUJVRzsKKyAgICBmaWx0ZXIuZ3JvdXAgPSBCQ01PTFRfTUdUX0dST1VQX09QRVI7CisgICAgZmlsdGVyLnN1Ymdyb3VwID0gQkNNT0xUX0RFQlVHX09QRVJfSURfU1RBUlRfQVBJX0NBUFRVUkU7IC8qbGludCAhZTYzMyAqLworICAgIGVyciA9IGJjbXRyX2NsZF9sZXZlbF9zZXQoZGV2aWNlLCAmZmlsdGVyLCBCQ01UUl9DTERfTk9ORSk7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKEJDTV9FUlJfT0sgIT0gZXJyLCBlcnIpOworICAgIGZpbHRlci5zdWJncm91cCA9IEJDTU9MVF9ERUJVR19PUEVSX0lEX1NUT1BfQVBJX0NBUFRVUkU7ICAvKmxpbnQgIWU2MzMgKi8KKyAgICBlcnIgPSBiY210cl9jbGRfbGV2ZWxfc2V0KGRldmljZSwgJmZpbHRlciwgQkNNVFJfQ0xEX05PTkUpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihCQ01fRVJSX09LICE9IGVyciwgZXJyKTsKKyAgICBmaWx0ZXIub2JqZWN0ID0gQkNNT0xUX09CSl9JRF9ERVZJQ0U7CisgICAgZmlsdGVyLmdyb3VwID0gQkNNT0xUX01HVF9HUk9VUF9PUEVSOworICAgIGZpbHRlci5zdWJncm91cCA9IEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9IT1NUX0tFRVBfQUxJVkU7ICAvKmxpbnQgIWU2MzMgKi8KKyAgICBlcnIgPSBiY210cl9jbGRfbGV2ZWxfc2V0KGRldmljZSwgJmZpbHRlciwgQkNNVFJfQ0xEX05PTkUpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihCQ01fRVJSX09LICE9IGVyciwgZXJyKTsKKyAgICBmaWx0ZXIuZ3JvdXAgPSBCQ01PTFRfTUdUX0dST1VQX0FVVE87CisgICAgZmlsdGVyLnN1Ymdyb3VwID0gQkNNT0xUX0RFVklDRV9BVVRPX0lEX0RFVklDRV9LRUVQX0FMSVZFOyAgLypsaW50ICFlNjMzICovCisgICAgZXJyID0gYmNtdHJfY2xkX2xldmVsX3NldChkZXZpY2UsICZmaWx0ZXIsIEJDTVRSX0NMRF9OT05FKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoQkNNX0VSUl9PSyAhPSBlcnIsIGVycik7CisKKyAgICByZXR1cm4gYmNtdHJfY2FwdHVyZV9zdGFydF9zdG9wKGRldmljZSwgQkNNT1NfVFJVRSk7Cit9CisKK2JjbW9zX2Vycm5vIGJjbW9sdF9kZWJ1Z19hcGlfY29tbW9uX29wZXJfc3RvcF9hcGlfY2FwdHVyZShiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfbXNnICptc2csIGJjbW9sdF9kZWJ1Z19hcGlfZGIgKmRiKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKworICAgIGlmICghYmNtdHJfY2FwdHVyZV9pc19hY3RpdmUoZGV2aWNlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBiY21vbHRfbXNnX2VycigKKyAgICAgICAgICAgIG1zZywKKyAgICAgICAgICAgIERFVl9MT0dfSU5WQUxJRF9JRCwKKyAgICAgICAgICAgIEJDTV9FUlJfQUxSRUFEWSwKKyAgICAgICAgICAgIEJDTU9MVF9FUlJfRklFTERfTk9ORSwKKyAgICAgICAgICAgICJObyBjYXB0dXJlIGluIHByb2dyZXNzIik7CisgICAgfQorCisgICAgZXJyID0gYmNtdHJfY2FwdHVyZV9zdGFydF9zdG9wKGRldmljZSwgQkNNT1NfRkFMU0UpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihCQ01fRVJSX09LICE9IGVyciwgZXJyKTsKKworICAgIGJjbW9sdF9kZWJ1Z19hcGlfY29tbW9uX2NhcHR1cmVfc3RhdHNfdXBkYXRlKGRldmljZSwgZGIpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIGJjbW9sdF9kZWJ1Z19hcGlfY29tbW9uX29wZXJfcmVzZXRfYXBpX2NhcHR1cmUoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnLCBiY21vbHRfZGVidWdfYXBpX2RiICpkYikKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisKKyAgICBpZiAoYmNtdHJfY2FwdHVyZV9pc19hY3RpdmUoZGV2aWNlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBiY21vbHRfbXNnX2VycigKKyAgICAgICAgICAgIG1zZywKKyAgICAgICAgICAgIERFVl9MT0dfSU5WQUxJRF9JRCwKKyAgICAgICAgICAgIEJDTV9FUlJfU1RBVEUsCisgICAgICAgICAgICBCQ01PTFRfRVJSX0ZJRUxEX05PTkUsCisgICAgICAgICAgICAiQ2Fubm90IHJlc2V0IGNhcHR1cmUgd2hpbGUgY2FwdHVyZSBpcyBydW5uaW5nIik7CisgICAgfQorCisgICAgYmNtdHJfY2FwdHVyZV9kZXN0cm95KGRldmljZSk7CisgICAgZXJyID0gYmNtb2x0X2RlYnVnX2FwaV9jb21tb25fY2FwdHVyZV9pbml0KGRldmljZSwgZGIpOworCisgICAgcmV0dXJuIGVycjsKK30KKwordm9pZCBiY21vbHRfZGVidWdfYXBpX2NvbW1vbl9pbml0KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9kZWJ1Z19hcGlfZGIgKmRiKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKworI2lmIEVOQUJMRV9MT0cKKyAgICBkYi0+bG9nX2lkID0gYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIoIm1oX2RlYnVnIiwgREVWX0xPR19MRVZFTF9JTkZPLCBERVZfTE9HX0lEX1RZUEVfQk9USCk7CisjZW5kaWYKKworICAgIGJjbW9sdF9kZWJ1Z19jZmdfZGF0YV9zZXRfZGVmYXVsdCgmZGItPmNmZywgQkNNT0xUX1BSRVNFTkNFX01BU0tfQUxMKTsKKyAgICBkYi0+Y2FwdHVyZV9idWZmZXIgPSBiY21vc19hbGxvYyhkYi0+Y2ZnLmFwaV9jYXB0dXJlX2NmZy5idWZmZXJfc2l6ZV9ieXRlcyk7CisgICAgZXJyID0gYmNtb2x0X2RlYnVnX2FwaV9jb21tb25fY2FwdHVyZV9pbml0KGRldmljZSwgZGIpOworICAgIEJVR19PTihCQ01fRVJSX09LICE9IGVycik7Cit9CisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9kZWJ1Zy9iY21vbHRfZGVidWdfYXBpX2NvbW1vbi5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2RlYnVnL2JjbW9sdF9kZWJ1Z19hcGlfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFmMjhhYgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9kZWJ1Zy9iY21vbHRfZGVidWdfYXBpX2NvbW1vbi5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgQkNNT0xUX0RFQlVHX0FQSV9DT01NT05fSF8KKyNkZWZpbmUgQkNNT0xUX0RFQlVHX0FQSV9DT01NT05fSF8KKworI2luY2x1ZGUgImJjbW9sdF9tb2RlbF90eXBlcy5oIgorI2luY2x1ZGUgImJjbV9kZXZfbG9nLmgiCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgYmNtb2x0X2RlYnVnX2NmZ19kYXRhIGNmZzsKKyAgICB1aW50OF90ICpjYXB0dXJlX2J1ZmZlcjsKKyAgICBkZXZfbG9nX2lkIGxvZ19pZDsKK30gYmNtb2x0X2RlYnVnX2FwaV9kYjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21vbHRfZGVidWdfYXBpX2RiIG9sZF9kYjsKKyAgICBiY21vbHRfZGVidWdfYXBpX2RiICpuZXdfZGI7Cit9IGRlYnVnX3RyYW5zX2hhbmRsZTsKKworYmNtb3NfZXJybm8gYmNtb2x0X2RlYnVnX2FwaV9jb21tb25fZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9tc2cgKm1zZywgYmNtb2x0X2RlYnVnX2FwaV9kYiAqZGIpOworCitkZWJ1Z190cmFuc19oYW5kbGUgKmJjbW9sdF9kZWJ1Z19hcGlfY29tbW9uX2NmZ190cmFuc19zdGFydChiY21vbHRfZGVidWdfYXBpX2RiICpkYik7CisKK3ZvaWQgYmNtb2x0X2RlYnVnX2FwaV9jb21tb25fY2ZnX3RyYW5zX2ZhaWwoYmNtb2x0X2RlYnVnX2FwaV9kYiAqZGIsIGRlYnVnX3RyYW5zX2hhbmRsZSAqaGFuZGxlKTsKKwordm9pZCBiY21vbHRfZGVidWdfYXBpX2NvbW1vbl9jZmdfdHJhbnNfc3VjY2VlZChiY21vbHRfZGV2aWQgZGV2aWNlLCBkZWJ1Z190cmFuc19oYW5kbGUgKmhhbmRsZSk7CisKK2JjbW9zX2Vycm5vIGJjbW9sdF9kZWJ1Z19hcGlfY29tbW9uX3NldCgKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlLAorICAgIGJjbW9sdF9tc2cgKm1zZywKKyAgICBjb25zdCBiY21vbHRfZGVidWdfY2ZnX2RhdGEgKmRhdGEsCisgICAgZGVidWdfdHJhbnNfaGFuZGxlICpoYW5kbGUsCisgICAgYmNtb2x0X2FwaV9jYXB0dXJlX2xvY2F0aW9uIGxvY2FsKTsKKworYmNtb3NfZXJybm8gYmNtb2x0X2RlYnVnX2FwaV9jb21tb25fb3Blcl9zdGFydF9hcGlfY2FwdHVyZShiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfbXNnICptc2cpOworCitiY21vc19lcnJubyBiY21vbHRfZGVidWdfYXBpX2NvbW1vbl9vcGVyX3N0b3BfYXBpX2NhcHR1cmUoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnLCBiY21vbHRfZGVidWdfYXBpX2RiICpkYik7CisKK2JjbW9zX2Vycm5vIGJjbW9sdF9kZWJ1Z19hcGlfY29tbW9uX29wZXJfcmVzZXRfYXBpX2NhcHR1cmUoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnLCBiY21vbHRfZGVidWdfYXBpX2RiICpkYik7CisKK3ZvaWQgYmNtb2x0X2RlYnVnX2FwaV9jb21tb25faW5pdChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfZGVidWdfYXBpX2RiICpkYik7CisKKyNlbmRpZiAvKiBCQ01PTFRfREVCVUdfQVBJX0NPTU1PTl9IXyAqLworCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZGV2X2N0cmwvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZGV2X2N0cmwvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRmMTQ5YgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9kZXZfY3RybC9NYWtlZmlsZQpAQCAtMCwwICsxLDI0IEBACisjIERldmljZSBjb250cm9sIGRyaXZlcgorTU9EX05BTUUgPSBkZXZfY3RybAorTU9EX0RFUFMgPSB0cm11eCBrZWVwX2FsaXZlIGZsZCBsbF9wY2llIGRlYnVnX2NvbW1vbgorTU9EX0lOQ19ESVJTID0gJChTUkNfRElSKQorCitpZmVxICgiJChSRUxFQVNFX0JVSUxEKSIsICJ5IikKKyAgICBNT0RfSU5DX0RJUlMgKz0gaG9zdF9kcml2ZXIvc3dfdmVyc2lvbiBob3N0X2RyaXZlci9zd19lcnJvciBob3N0X2RyaXZlci9taF91dGlscworZWxzZQorICAgIE1PRF9JTkNfRElSUyArPSBob3N0L3N3X3ZlcnNpb24gJChUT1BfRElSKS9jb21tb24vc3dfZXJyb3IgJChUT1BfRElSKS9jb21tb24vbWhfdXRpbHMKK2VuZGlmCisKK2lmZXEgKCIkKE9TX0tFUk5FTCkiLCAibGludXgiKQorTU9EX1RZUEUgPSBsaW51eF9saWIKK2Vsc2UKK01PRF9UWVBFID0gbGliCitlbmRpZgorCitzcmNzID0gYmNtb2x0X2Rldl9jdHJsLmMgYmNtb2x0X2RlYnVnX2N0cmwuYworCisjIElmIGNhbGxlZCBieSBsaW51eCBrZXJuZWwgYnVpbGRlciAtIGFkZCBpbmNsdWRlIHBhdGhzIG1hbnVhbGx5LgorIyBJdCBpcyBub3QgZWxlZ2FudCwgYnV0IHdlJ2xsIG5vdCBoYXZlIG1hbnkgbGludXggbW9kdWxlcworaWZuZXEgKCIkKEtCVUlMRF9TUkMpIiwgIiIpCisJLWluY2x1ZGUgJChPVVRfRElSX0JBU0UpL01ha2VmaWxlLmNvbmZpZy4kKE1PRF9OQU1FKQorZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9kZXZfY3RybC9iY21vbHRfZGVidWdfY3RybC5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2Rldl9jdHJsL2JjbW9sdF9kZWJ1Z19jdHJsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU3NjRjYgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9kZXZfY3RybC9iY21vbHRfZGVidWdfY3RybC5jCkBAIC0wLDAgKzEsNDY5IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjZGVmaW5lIEhPU1RfQVBJX0NBUFRVUkUgMAorCisjaW5jbHVkZSAiYmNtb3Nfc3lzdGVtLmgiCisjaW5jbHVkZSAiYmNtb2x0X2FwaS5oIgorI2luY2x1ZGUgImJjbW9sdF9tc2cuaCIKKyNpbmNsdWRlICJiY21vbHRfdHJfbXV4LmgiCisjaWYgSE9TVF9BUElfQ0FQVFVSRQorI2luY2x1ZGUgImJjbW9sdF9kZWJ1Z19hcGlfY29tbW9uLmgiCisjZW5kaWYKKyNpbmNsdWRlICJiY21vbHRfZGV2X2N0cmwuaCIKKyNpbmNsdWRlICJiY21vbHRfZGVidWdfY3RybC5oIgorCisjZGVmaW5lIEFQSV9DQVBUVVJFX1BST1BfTUFTS1wKKyAgICAoKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0NGR19JRF9BUElfQ0FQVFVSRV9DRkcpIHxcCisgICAgICgxVUxMIDw8IEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfU1RBVFMpIHxcCisgICAgICgxVUxMIDw8IEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfQlVGRkVSX1JFQUQpIHxcCisgICAgICgxVUxMIDw8IEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfQlVGRkVSKSkKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21vc19ib29sIHdhaXRpbmdfZm9yX2FjazsKKyAgICBiY21vbHRfbXNnICpsYXN0X21lc3NhZ2U7CisgICAgYmNtb3NfdGltZXIgYWNrX3RpbWVvdXQ7CisjaWYgSE9TVF9BUElfQ0FQVFVSRQorICAgIGJjbW9sdF9kZWJ1Z19hcGlfZGIgZGI7CisgICAgZGVidWdfdHJhbnNfaGFuZGxlICpoYW5kbGU7CisjZW5kaWYKK30gZGVidWdfY3RybF9jdHh0OworCitzdGF0aWMgZGVidWdfY3RybF9jdHh0IGRlYnVnX2N0cmxbQkNNVFJfTUFYX09MVFNdOworCitzdGF0aWMgdm9pZCBzZW5kX3RvX2hvc3QoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnKQoreworICAgIG1zZy0+ZGlyID0gQkNNT0xUX01TR19ESVJfUkVTUE9OU0U7CisgICAgYmNtdHJtdXhfY29udHJvbF90b19ob3N0KGRldmljZSwgbXNnKTsKKyAgICBiY21vbHRfbXNnX2ZyZWUobXNnKTsKK30KKworc3RhdGljIHZvaWQgc2VuZF90b19kZXZpY2UoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGRlYnVnX2N0cmxbZGV2aWNlXS53YWl0aW5nX2Zvcl9hY2sgPSBCQ01PU19UUlVFOworICAgIGRlYnVnX2N0cmxbZGV2aWNlXS5sYXN0X21lc3NhZ2UgPSBtc2c7CisgICAgYmNtdHJtdXhfY29udHJvbF90b19saW5lKGRldmljZSwgbXNnKTsKKyAgICBiY21vc190aW1lcl9zdGFydCgmZGVidWdfY3RybFtkZXZpY2VdLmFja190aW1lb3V0LCBERVZJQ0VfUkVTUE9OU0VfVElNRU9VVF9MRU5HVEgpOworfQorCitzdGF0aWMgYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfY3RybF9jZmdfcmVxdWlyZXNfY29ubmVjdGlvbihiY21vbHRfbXNnICptc2csIGNvbnN0IGJjbW9sdF9kZWJ1Z19jZmdfZGF0YSAqY2ZnKQoreworICAgIHJldHVybiAoKChtc2ctPnByZXNlbmNlX21hc2sgJiB+QVBJX0NBUFRVUkVfUFJPUF9NQVNLKSAhPSAwKSB8fCAvKiBpbmNsdWRlcyBub24tQVBJIGNhcHR1cmUgZWxlbWVudHMsIG9yIC4uLiAqLworICAgICAgICAgICAgKCgobXNnLT5wcmVzZW5jZV9tYXNrICYgQVBJX0NBUFRVUkVfUFJPUF9NQVNLKSAhPSAwKSAmJiAvKiBpbmNsdWRlcyBBUEkgY2FwdHVlIGVsZW1lbnRzIGFuZCAuLi4gKi8KKyAgICAgICAgICAgICAoY2ZnLT5hcGlfY2FwdHVyZV9jZmcubG9jYXRpb24gPT0gQkNNT0xUX0FQSV9DQVBUVVJFX0xPQ0FUSU9OX0RFVklDRSkpKTsgLyogY2FwdHVyZSBsb2NhdGlvbiBpcyBkZXZpY2UgKi8KK30KKworc3RhdGljIHZvaWQgYmNtb2x0X2RlYnVnX2N0cmxfc2VuZF9jZmdfZ2V0X3Jlc3BvbnNlKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9tc2cgKm1zZykKK3sKKyNpZiBIT1NUX0FQSV9DQVBUVVJFCisgICAgaWYgKGRlYnVnX2N0cmxbZGV2aWNlXS5kYi5jZmcuYXBpX2NhcHR1cmVfY2ZnLmxvY2F0aW9uID09IEJDTU9MVF9BUElfQ0FQVFVSRV9MT0NBVElPTl9IT1NUKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2RlYnVnX2FwaV9jb21tb25fZ2V0KGRldmljZSwgbXNnLCAmZGVidWdfY3RybFtkZXZpY2VdLmRiKTsKKyAgICB9CisjZW5kaWYKKyAgICBzZW5kX3RvX2hvc3QoZGV2aWNlLCBtc2cpOworfQorCitzdGF0aWMgdm9pZCBiY21vbHRfZGVidWdfY3RybF9oYW5kbGVfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfbXNnICptc2csIGJjbW9zX2Jvb2wgY29ubmVjdGVkKQoreworI2lmIEhPU1RfQVBJX0NBUFRVUkUKKyAgICBpZiAoYmNtb2x0X2RlYnVnX2N0cmxfY2ZnX3JlcXVpcmVzX2Nvbm5lY3Rpb24obXNnLCAmZGVidWdfY3RybFtkZXZpY2VdLmRiLmNmZykpCisjZW5kaWYKKyAgICB7CisgICAgICAgIGlmIChjb25uZWN0ZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNlbmRfdG9fZGV2aWNlKGRldmljZSwgbXNnKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGJjbW9sdF9tc2dfZXJyKAorICAgICAgICAgICAgbXNnLAorICAgICAgICAgICAgREVWX0xPR19JTlZBTElEX0lELAorICAgICAgICAgICAgQkNNX0VSUl9OT1RfQ09OTkVDVEVELAorICAgICAgICAgICAgQkNNT0xUX0VSUl9GSUVMRF9OT05FLAorICAgICAgICAgICAgIkNhbm5vdCBhY2Nlc3MgZW1iZWRkZWQgcGFyYW1ldGVycyB3aGlsZSBkaXNjb25uZWN0ZWQiKTsKKyAgICB9CisKKyAgICBiY21vbHRfZGVidWdfY3RybF9zZW5kX2NmZ19nZXRfcmVzcG9uc2UoZGV2aWNlLCBtc2cpOworfQorCitzdGF0aWMgdm9pZCBiY21vbHRfZGVidWdfY3RybF9zZW5kX2NmZ19zZXRfcmVzcG9uc2UoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnKQoreworI2lmIEhPU1RfQVBJX0NBUFRVUkUKKyAgICBpZiAobXNnLT5lcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIGJjbW9sdF9kZWJ1Z19hcGlfY29tbW9uX2NmZ190cmFuc19zdWNjZWVkKGRldmljZSwgZGVidWdfY3RybFtkZXZpY2VdLmhhbmRsZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbW9sdF9kZWJ1Z19hcGlfY29tbW9uX2NmZ190cmFuc19mYWlsKCZkZWJ1Z19jdHJsW2RldmljZV0uZGIsIGRlYnVnX2N0cmxbZGV2aWNlXS5oYW5kbGUpOworICAgIH0KKyNlbmRpZgorCisgICAgc2VuZF90b19ob3N0KGRldmljZSwgbXNnKTsKK30KKworc3RhdGljIHZvaWQgYmNtb2x0X2RlYnVnX2N0cmxfaGFuZGxlX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnLCBiY21vc19ib29sIGNvbm5lY3RlZCkKK3sKKyAgICBiY21vbHRfZGVidWdfY2ZnICpjZmcgPSAoYmNtb2x0X2RlYnVnX2NmZyopbXNnOworICAgIGJjbW9sdF9kZWJ1Z19jZmdfaWQgcHJvcF9pZDsKKyAgICBiY21vc19lcnJubyBlcnI7CisKKyAgICBpZiAoIWJjbW9sdF9kZWJ1Z19jZmdfZGF0YV9ib3VuZHNfY2hlY2soJmNmZy0+ZGF0YSwgbXNnLT5wcmVzZW5jZV9tYXNrLCAmcHJvcF9pZCkpCisgICAgeworICAgICAgICBlcnIgPSBCQ01fRVJSX1JBTkdFOworICAgICAgICBtc2ctPmVycl9maWVsZF9pZHggPSAodWludDE2X3QpcHJvcF9pZDsKKyAgICAgICAgc2VuZF90b19ob3N0KGRldmljZSwgbXNnKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworI2lmIEhPU1RfQVBJX0NBUFRVUkUKKyAgICBkZWJ1Z19jdHJsW2RldmljZV0uaGFuZGxlID0gYmNtb2x0X2RlYnVnX2FwaV9jb21tb25fY2ZnX3RyYW5zX3N0YXJ0KCZkZWJ1Z19jdHJsW2RldmljZV0uZGIpOworICAgIGVyciA9IGJjbW9sdF9kZWJ1Z19hcGlfY29tbW9uX3NldChkZXZpY2UsIG1zZywgJmNmZy0+ZGF0YSwgZGVidWdfY3RybFtkZXZpY2VdLmhhbmRsZSwgQkNNT0xUX0FQSV9DQVBUVVJFX0xPQ0FUSU9OX0hPU1QpOworI2Vsc2UKKyAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChjZmcsIGRlYnVnLCBhcGlfY2FwdHVyZV9jZmcpICYmCisgICAgICAgIChjZmctPmRhdGEuYXBpX2NhcHR1cmVfY2ZnLmxvY2F0aW9uID09IEJDTU9MVF9BUElfQ0FQVFVSRV9MT0NBVElPTl9IT1NUKSkKKyAgICB7CisgICAgICAgIGVyciA9IGJjbW9sdF9tc2dfZXJyKAorICAgICAgICAgICAgbXNnLAorICAgICAgICAgICAgREVWX0xPR19JTlZBTElEX0lELAorICAgICAgICAgICAgQkNNX0VSUl9OT1RfU1VQUE9SVEVELAorICAgICAgICAgICAgQkNNT0xUX0VSUl9GSUVMRF9OT05FLAorICAgICAgICAgICAgIkhvc3QgQVBJIGNhcHR1cmUgbm90IHN1cHBvcnRlZCB5ZXQiKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZXJyID0gQkNNX0VSUl9PSzsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBpZiAoYmNtb2x0X2RlYnVnX2N0cmxfY2ZnX3JlcXVpcmVzX2Nvbm5lY3Rpb24obXNnLCAmY2ZnLT5kYXRhKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNvbm5lY3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZW5kX3RvX2RldmljZShkZXZpY2UsIG1zZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBiY21vbHRfbXNnX2VycigKKyAgICAgICAgICAgICAgICBtc2csCisgICAgICAgICAgICAgICAgREVWX0xPR19JTlZBTElEX0lELAorICAgICAgICAgICAgICAgIEJDTV9FUlJfTk9UX0NPTk5FQ1RFRCwKKyAgICAgICAgICAgICAgICBCQ01PTFRfRVJSX0ZJRUxEX05PTkUsCisgICAgICAgICAgICAgICAgIkNhbm5vdCBhY2Nlc3MgZW1iZWRkZWQgcGFyYW1ldGVycyB3aGlsZSBkaXNjb25uZWN0ZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJjbW9sdF9kZWJ1Z19jdHJsX3NlbmRfY2ZnX3NldF9yZXNwb25zZShkZXZpY2UsIG1zZyk7Cit9CisKK3N0YXRpYyB2b2lkIGJjbW9sdF9kZWJ1Z19jdHJsX2hhbmRsZV9jZmdfY2xlYXIoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnLCBiY21vc19ib29sIGNvbm5lY3RlZCkKK3sKKyNpZiBIT1NUX0FQSV9DQVBUVVJFCisgICAgYmNtb2x0X2RlYnVnX2NmZyAqY2ZnID0gKGJjbW9sdF9kZWJ1Z19jZmcqKW1zZzsKKyNlbmRpZgorICAgIGJjbW9zX2Vycm5vIGVycjsKKworICAgIGlmICghY29ubmVjdGVkKQorICAgIHsKKyAgICAgICAgYmNtb2x0X21zZ19lcnIoCisgICAgICAgICAgICBtc2csCisgICAgICAgICAgICBERVZfTE9HX0lOVkFMSURfSUQsCisgICAgICAgICAgICBCQ01fRVJSX05PVF9DT05ORUNURUQsCisgICAgICAgICAgICBCQ01PTFRfRVJSX0ZJRUxEX05PTkUsCisgICAgICAgICAgICAiQ2Fubm90IGFjY2VzcyBlbWJlZGRlZCBwYXJhbWV0ZXJzIHdoaWxlIGRpc2Nvbm5lY3RlZCIpOworICAgICAgICBzZW5kX3RvX2hvc3QoZGV2aWNlLCBtc2cpOworICAgICAgICByZXR1cm47CisgICAgfQorCisjaWYgSE9TVF9BUElfQ0FQVFVSRQorICAgIGRlYnVnX2N0cmxbZGV2aWNlXS5oYW5kbGUgPSBiY21vbHRfZGVidWdfYXBpX2NvbW1vbl9jZmdfdHJhbnNfc3RhcnQoJmRlYnVnX2N0cmxbZGV2aWNlXS5kYik7CisgICAgYmNtb2x0X2RlYnVnX2NmZ19kYXRhX3NldF9kZWZhdWx0KCZkZWJ1Z19jdHJsW2RldmljZV0uZGIuY2ZnLCBCQ01PTFRfUFJFU0VOQ0VfTUFTS19BTEwpOworICAgIG1zZy0+cHJlc2VuY2VfbWFzayA9IEJDTU9MVF9QUkVTRU5DRV9NQVNLX0FMTDsKKyAgICBlcnIgPSBiY21vbHRfZGVidWdfYXBpX2NvbW1vbl9zZXQoZGV2aWNlLCBtc2csICZjZmctPmRhdGEsIGRlYnVnX2N0cmxbZGV2aWNlXS5oYW5kbGUsIEJDTU9MVF9BUElfQ0FQVFVSRV9MT0NBVElPTl9IT1NUKTsKKyNlbHNlCisgICAgZXJyID0gQkNNX0VSUl9PSzsKKyNlbmRpZgorICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHNlbmRfdG9fZGV2aWNlKGRldmljZSwgbXNnKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYmNtb2x0X2RlYnVnX2N0cmxfc2VuZF9jZmdfc2V0X3Jlc3BvbnNlKGRldmljZSwgbXNnKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGJjbW9sdF9kZWJ1Z19jdHJsX2hhbmRsZV9jZmcoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnLCBiY21vc19ib29sIGNvbm5lY3RlZCkKK3sKKyAgICBzd2l0Y2ggKG1zZy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgIGJjbW9sdF9kZWJ1Z19jdHJsX2hhbmRsZV9jZmdfZ2V0KGRldmljZSwgbXNnLCBjb25uZWN0ZWQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgIGJjbW9sdF9kZWJ1Z19jdHJsX2hhbmRsZV9jZmdfc2V0KGRldmljZSwgbXNnLCBjb25uZWN0ZWQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0NMRUFSOgorICAgICAgICAgICAgYmNtb2x0X2RlYnVnX2N0cmxfaGFuZGxlX2NmZ19jbGVhcihkZXZpY2UsIG1zZywgY29ubmVjdGVkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYmNtb2x0X21zZ19lcnIoCisgICAgICAgICAgICAgICAgbXNnLAorICAgICAgICAgICAgICAgIERFVl9MT0dfSU5WQUxJRF9JRCwKKyAgICAgICAgICAgICAgICBCQ01fRVJSX05PVF9TVVBQT1JURUQsCisgICAgICAgICAgICAgICAgQkNNT0xUX0VSUl9GSUVMRF9OT05FLAorICAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBtZXNzYWdlIHR5cGUgKCV1KSIsCisgICAgICAgICAgICAgICAgbXNnLT50eXBlKTsKKyAgICAgICAgICAgIHNlbmRfdG9faG9zdChkZXZpY2UsIG1zZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGJjbW9sdF9kZWJ1Z19jdHJsX2hhbmRsZV9vcGVyKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9tc2cgKm1zZywgYmNtb3NfYm9vbCBjb25uZWN0ZWQpCit7CisjaWYgSE9TVF9BUElfQ0FQVFVSRQorICAgIGJjbW9zX2Jvb2wgaG9zdF9hcGlfY2FwdHVyZSA9CisgICAgICAgIChkZWJ1Z19jdHJsW2RldmljZV0uZGIuY2ZnLmFwaV9jYXB0dXJlX2NmZy5sb2NhdGlvbiA9PSBCQ01PTFRfQVBJX0NBUFRVUkVfTE9DQVRJT05fSE9TVCk7CisKKyAgICBzd2l0Y2ggKG1zZy0+c3ViZ3JvdXApCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9ERUJVR19PUEVSX0lEX1NUQVJUX0FQSV9DQVBUVVJFOgorICAgICAgICAgICAgaWYgKGhvc3RfYXBpX2NhcHR1cmUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbXNnLT5lcnIgPSBiY21vbHRfZGVidWdfYXBpX2NvbW1vbl9vcGVyX3N0YXJ0X2FwaV9jYXB0dXJlKGRldmljZSwgbXNnKTsKKyAgICAgICAgICAgICAgICBzZW5kX3RvX2hvc3QoZGV2aWNlLCBtc2cpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9ERUJVR19PUEVSX0lEX1NUT1BfQVBJX0NBUFRVUkU6CisgICAgICAgICAgICBpZiAoaG9zdF9hcGlfY2FwdHVyZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtc2ctPmVyciA9IGJjbW9sdF9kZWJ1Z19hcGlfY29tbW9uX29wZXJfc3RvcF9hcGlfY2FwdHVyZShkZXZpY2UsIG1zZywgJmRlYnVnX2N0cmxbZGV2aWNlXS5kYik7CisgICAgICAgICAgICAgICAgc2VuZF90b19ob3N0KGRldmljZSwgbXNnKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfREVCVUdfT1BFUl9JRF9SRVNFVF9BUElfQ0FQVFVSRToKKyAgICAgICAgICAgIGlmIChob3N0X2FwaV9jYXB0dXJlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1zZy0+ZXJyID0gYmNtb2x0X2RlYnVnX2FwaV9jb21tb25fb3Blcl9yZXNldF9hcGlfY2FwdHVyZShkZXZpY2UsIG1zZywgJmRlYnVnX2N0cmxbZGV2aWNlXS5kYik7CisgICAgICAgICAgICAgICAgc2VuZF90b19ob3N0KGRldmljZSwgbXNnKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKCFjb25uZWN0ZWQpCisgICAgeworICAgICAgICBiY21vbHRfbXNnX2VycigKKyAgICAgICAgICAgIG1zZywKKyAgICAgICAgICAgIERFVl9MT0dfSU5WQUxJRF9JRCwKKyAgICAgICAgICAgIEJDTV9FUlJfTk9UX0NPTk5FQ1RFRCwKKyAgICAgICAgICAgIEJDTU9MVF9FUlJfRklFTERfTk9ORSwKKyAgICAgICAgICAgICJDYW5ub3QgcGVyZm9ybSBlbWJlZGRlZCBvcGVyYXRpb25zIHdoaWxlIGRpc2Nvbm5lY3RlZCIpOworICAgICAgICBzZW5kX3RvX2hvc3QoZGV2aWNlLCBtc2cpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2VuZF90b19kZXZpY2UoZGV2aWNlLCBtc2cpOworfQorCitzdGF0aWMgdm9pZCBiY21vbHRfZGVidWdfY3RybF9oYW5kbGVfYXV0b19jZmcoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnLCBiY21vc19ib29sIGNvbm5lY3RlZCkKK3sKKyAgICBpZiAoIWNvbm5lY3RlZCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9tc2dfZXJyKAorICAgICAgICAgICAgbXNnLAorICAgICAgICAgICAgREVWX0xPR19JTlZBTElEX0lELAorICAgICAgICAgICAgQkNNX0VSUl9OT1RfQ09OTkVDVEVELAorICAgICAgICAgICAgQkNNT0xUX0VSUl9GSUVMRF9OT05FLAorICAgICAgICAgICAgIkNhbm5vdCBhY2Nlc3MgZW1iZWRkZWQgcGFyYW1ldGVycyB3aGlsZSBkaXNjb25uZWN0ZWQiKTsKKyAgICAgICAgc2VuZF90b19ob3N0KGRldmljZSwgbXNnKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNlbmRfdG9fZGV2aWNlKGRldmljZSwgbXNnKTsKK30KKworc3RhdGljIHZvaWQgYmNtb2x0X2RlYnVnX2N0cmxfaGFuZGxlX3JlcXVlc3QoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnLCBiY21vc19ib29sIGNvbm5lY3RlZCkKK3sKKyAgICBpZiAoZGVidWdfY3RybFtkZXZpY2VdLndhaXRpbmdfZm9yX2FjaykKKyAgICB7CisgICAgICAgIGJjbW9sdF9tc2dfZXJyKAorICAgICAgICAgICAgbXNnLAorICAgICAgICAgICAgREVWX0xPR19JTlZBTElEX0lELAorICAgICAgICAgICAgQkNNX0VSUl9UT09fTUFOWV9SRVFTLAorICAgICAgICAgICAgQkNNT0xUX0VSUl9GSUVMRF9OT05FLAorICAgICAgICAgICAgIlRyYW5zYWN0aW9uIGluIHByb2dyZXNzIG9uIGRlYnVnIG9iamVjdCIpOworICAgICAgICBzZW5kX3RvX2hvc3QoZGV2aWNlLCBtc2cpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3dpdGNoIChtc2ctPmdyb3VwKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgIGJjbW9sdF9kZWJ1Z19jdHJsX2hhbmRsZV9jZmcoZGV2aWNlLCBtc2csIGNvbm5lY3RlZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICBiY21vbHRfZGVidWdfY3RybF9oYW5kbGVfb3BlcihkZXZpY2UsIG1zZywgY29ubmVjdGVkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICBiY21vbHRfZGVidWdfY3RybF9oYW5kbGVfYXV0b19jZmcoZGV2aWNlLCBtc2csIGNvbm5lY3RlZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJjbW9sdF9tc2dfZXJyKAorICAgICAgICAgICAgICAgIG1zZywKKyAgICAgICAgICAgICAgICBERVZfTE9HX0lOVkFMSURfSUQsCisgICAgICAgICAgICAgICAgQkNNX0VSUl9OT1RfU1VQUE9SVEVELAorICAgICAgICAgICAgICAgIEJDTU9MVF9FUlJfRklFTERfTk9ORSwKKyAgICAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgZ3JvdXAgKCV1KSIsCisgICAgICAgICAgICAgICAgbXNnLT5ncm91cCk7CisgICAgICAgICAgICBzZW5kX3RvX2hvc3QoZGV2aWNlLCBtc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBiY21vbHRfZGVidWdfY3RybF9oYW5kbGVfcmVzcG9uc2UoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGlmICghZGVidWdfY3RybFtkZXZpY2VdLndhaXRpbmdfZm9yX2FjayB8fCAobXNnLT5jb3JyX3RhZyAhPSBkZWJ1Z19jdHJsW2RldmljZV0ubGFzdF9tZXNzYWdlLT5jb3JyX3RhZykpCisgICAgeworICAgICAgICBtc2ctPnN1YmNoID0gQkNNVFJNVVhfQ0hBTk5FTF9BVVRPX1BST1hZOworICAgICAgICBzZW5kX3RvX2hvc3QoZGV2aWNlLCBtc2cpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbXNnLT5zdWJjaCA9IGRlYnVnX2N0cmxbZGV2aWNlXS5sYXN0X21lc3NhZ2UtPnN1YmNoOworICAgIGJjbW9zX3RpbWVyX3N0b3AoJmRlYnVnX2N0cmxbZGV2aWNlXS5hY2tfdGltZW91dCk7CisgICAgZGVidWdfY3RybFtkZXZpY2VdLndhaXRpbmdfZm9yX2FjayA9IEJDTU9TX0ZBTFNFOworICAgIGJjbW9sdF9tc2dfZnJlZShkZWJ1Z19jdHJsW2RldmljZV0ubGFzdF9tZXNzYWdlKTsKKworICAgIGlmIChtc2ctPmVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgc2VuZF90b19ob3N0KGRldmljZSwgbXNnKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN3aXRjaCAobXNnLT5ncm91cCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy0+dHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9kZWJ1Z19jdHJsX3NlbmRfY2ZnX2dldF9yZXNwb25zZShkZXZpY2UsIG1zZyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2RlYnVnX2N0cmxfc2VuZF9jZmdfc2V0X3Jlc3BvbnNlKGRldmljZSwgbXNnKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9kZWJ1Z19jdHJsX3NlbmRfY2ZnX3NldF9yZXNwb25zZShkZXZpY2UsIG1zZyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiR290IHVuZXhwZWN0ZWQgcmVzcG9uc2UgdHlwZSAoJXUpIGZyb20gZW1iZWRkZWRcbiIsIG1zZy0+Z3JvdXApOworICAgICAgICAgICAgICAgICAgICBzZW5kX3RvX2hvc3QoZGV2aWNlLCBtc2cpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgc2VuZF90b19ob3N0KGRldmljZSwgbXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJHb3QgdW5leHBlY3RlZCByZXNwb25zZSBncm91cCAoJXUpIGZyb20gZW1iZWRkZWRcbiIsIG1zZy0+Z3JvdXApOworICAgICAgICAgICAgc2VuZF90b19ob3N0KGRldmljZSwgbXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIGJjbW9zX3RpbWVyX3JjIGJjbW9sdF9kZWJ1Z19jdHJsX2hhbmRsZV9hY2tfdGltZW91dChiY21vc190aW1lciAqdGltZXIsIGxvbmcgZGF0YSkKK3sKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlID0gKGJjbW9sdF9kZXZpZClkYXRhOworCisgICAgaWYgKGRlYnVnX2N0cmxbZGV2aWNlXS5sYXN0X21lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiV2FpdGluZyB3aXRoIG5vIG1lc3NhZ2UhXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RJTUVSX09LOworICAgIH0KKworICAgIGJjbW9sdF9tc2dfZXJyKAorICAgICAgICBkZWJ1Z19jdHJsW2RldmljZV0ubGFzdF9tZXNzYWdlLAorICAgICAgICBERVZfTE9HX0lOVkFMSURfSUQsCisgICAgICAgIEJDTV9FUlJfSU5URVJOQUwsCisgICAgICAgIEJDTU9MVF9FUlJfRklFTERfTk9ORSwKKyAgICAgICAgIkRpZCBub3QgcmVjZWl2ZSByZXNwb25zZSBmcm9tIGVtYmVkZGVkIik7CisgICAgc2VuZF90b19ob3N0KGRldmljZSwgZGVidWdfY3RybCBbZGV2aWNlXS5sYXN0X21lc3NhZ2UpOworCisgICAgcmV0dXJuIEJDTU9TX1RJTUVSX09LOworfQorCit2b2lkIGJjbW9sdF9kZWJ1Z19jdHJsX3Byb2Nlc3NfbXNnKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9tc2cgKm1zZywgYmNtb3NfYm9vbCBjb25uZWN0ZWQpCit7CisgICAgc3dpdGNoIChtc2ctPmRpcikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX01TR19ESVJfUkVRVUVTVDoKKyAgICAgICAgICAgIGJjbW9sdF9kZWJ1Z19jdHJsX2hhbmRsZV9yZXF1ZXN0KGRldmljZSwgbXNnLCBjb25uZWN0ZWQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX01TR19ESVJfUkVTUE9OU0U6CisgICAgICAgICAgICBiY21vbHRfZGVidWdfY3RybF9oYW5kbGVfcmVzcG9uc2UoZGV2aWNlLCBtc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBCQ01PU19UUkFDRV9FUlIoIlVuc3VwcG9ydGVkIGRpcmVjdGlvbjogJXVcbiIsIG1zZy0+ZGlyKTsKKyAgICAgICAgICAgIGJjbW9sdF9tc2dfZnJlZShtc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIGJjbW9sdF9kZWJ1Z19jdHJsX2luaXQodm9pZCkKK3sKKyAgICBiY21vbHRfZGV2aWQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBCQ01UUl9NQVhfT0xUUzsgaSsrKQorICAgIHsKKyAgICAgICAgYmNtb3NfdGltZXJfcGFybSB0cCA9CisgICAgICAgIHsKKyAgICAgICAgICAgIC5uYW1lID0gImRlYnVnX2N0cmxfYWNrX3RpbWVvdXQiLAorICAgICAgICAgICAgLm93bmVyID0gQkNNT1NfTU9EVUxFX0lEX0RFVl9DVFJMX0RFVjAgKyBpLAorICAgICAgICAgICAgLnBlcmlvZGljID0gQkNNT1NfRkFMU0UsCisgICAgICAgICAgICAuaGFuZGxlciA9IGJjbW9sdF9kZWJ1Z19jdHJsX2hhbmRsZV9hY2tfdGltZW91dCwKKyAgICAgICAgICAgIC5kYXRhID0gKGxvbmcpaSwKKyAgICAgICAgICAgIC5mbGFncyA9IEJDTU9TX1RJTUVSX1BBUk1fRkxBR1NfVVJHRU5ULAorICAgICAgICB9OworCisgICAgICAgIGRlYnVnX2N0cmxbaV0ud2FpdGluZ19mb3JfYWNrID0gQkNNT1NfRkFMU0U7CisgICAgICAgIGJjbW9zX3RpbWVyX2NyZWF0ZSgmZGVidWdfY3RybFtpXS5hY2tfdGltZW91dCwgJnRwKTsKKyNpZiBIT1NUX0FQSV9DQVBUVVJFCisgICAgICAgIGJjbW9sdF9kZWJ1Z19hcGlfY29tbW9uX2luaXQoaSwgJmRlYnVnX2N0cmxbaV0uZGIpOworI2VuZGlmCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2Rldl9jdHJsL2JjbW9sdF9kZWJ1Z19jdHJsLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZGV2X2N0cmwvYmNtb2x0X2RlYnVnX2N0cmwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mzk5MWU5Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2Rldl9jdHJsL2JjbW9sdF9kZWJ1Z19jdHJsLmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBfQkNNT0xUX0RFQlVHX0NUUkxfSF8KKyNkZWZpbmUgX0JDTU9MVF9ERUJVR19DVFJMX0hfCisKKyNpbmNsdWRlICJiY21vc19zeXN0ZW0uaCIKKyNpbmNsdWRlICJiY21vbHRfbXNnLmgiCisKK3ZvaWQgYmNtb2x0X2RlYnVnX2N0cmxfcHJvY2Vzc19tc2coYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnLCBiY21vc19ib29sIGNvbm5lY3RlZCk7CisKK3ZvaWQgYmNtb2x0X2RlYnVnX2N0cmxfaW5pdCh2b2lkKTsKKworI2VuZGlmIC8qIF9CQ01PTFRfREVCVUdfQ1RSTF9IXyAqLworCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZGV2X2N0cmwvYmNtb2x0X2Rldl9jdHJsLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZGV2X2N0cmwvYmNtb2x0X2Rldl9jdHJsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRkZmE4ZAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9kZXZfY3RybC9iY21vbHRfZGV2X2N0cmwuYwpAQCAtMCwwICsxLDMxNTggQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21fY29uZmlnLmg+CisjaW5jbHVkZSA8YmNtb2x0X21zZy5oPgorI2luY2x1ZGUgPGJjbW9sdF90cl9tdXguaD4KKyNpbmNsdWRlIDxiY21vbHRfYXBpLmg+CisjaW5jbHVkZSA8YmNtb2x0X21vZGVsX3R5cGVzLmg+CisjaW5jbHVkZSA8YmNtb2x0X21vZGVsX2lkcy5oPgorI2luY2x1ZGUgPGJjbW9sdF9ob3N0X3N3X3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxiY21vbHRfbW9kZWxfcmV2aXNpb24uaD4KKyNpbmNsdWRlICJiY21vbHRfZGV2X2N0cmwuaCIKKyNpbmNsdWRlICJiY210cl9wY2llLmgiCisjaW5jbHVkZSAiYmNtb2x0X2xscGNpZS5oIgorI2luY2x1ZGUgImJjbV9kZXZfbG9nLmgiCisjaW5jbHVkZSAiYmNtb2x0X3V0aWxzLmgiCisjaW5jbHVkZSAiYmNtb2x0X2Zpcm13YXJlX2VudmVsb3BlLmgiCisjaW5jbHVkZSAiYmNtb2x0X21zZ19wYWNrLmgiCisjaW5jbHVkZSAiYmNtb2x0X21oX3V0aWxzLmgiCisjaW5jbHVkZSAiYmNtb2x0X2RlYnVnX2N0cmwuaCIKKworc3RhdGljIGJjbW9sdF9kZXZfY3RybF9wYXJhbXMgZGV2X2N0cmxfcGFyYW1zOworc3RhdGljIGRldl9jdHJsX2RhdGFiYXNlIGRldl9jdHJsX2RiW0JDTVRSX01BWF9PTFRTXTsKK3N0YXRpYyB1aW50OF90ICppbWFnZV9idWZbQkNNVFJfTUFYX09MVFNdOworc3RhdGljIHVpbnQ4X3QgKnJkX2ltYWdlX2J1ZltCQ01UUl9NQVhfT0xUU107CisKKyNkZWZpbmUgQkNNX0RFVl9DVFJMX1JFVFVSTl9PTl9FUlJPUihkZXZpY2UsIHJjLCBmbXQsIGFyZ3MuLi4pXAorICAgIGRvXAorICAgIHtcCisgICAgICAgIGlmIChCQ01fRVJSX09LICE9IHJjKVwKKyAgICAgICAge1wKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGRldl9jdHJsX2RiW2RldmljZV0ubG9nX2lkLCAiJXM6ICJmbXQsIGJjbW9zX3N0cmVycm9yKHJjKSwgIyMgYXJncyk7XAorICAgICAgICAgICAgcmV0dXJuIHJjO1wKKyAgICAgICAgfVwKKyAgICB9IHdoaWxlICgwKQorCisjaWZuZGVmIElOX0JBTkQKK3N0YXRpYyBiY21vc190aW1lcl9yYyBkZXZfY3RybF9ib290X3NlcV90aW1lcl9oYW5kbGVyKGJjbW9zX3RpbWVyICp0aW1lciwgbG9uZyBkYXRhKTsKK3N0YXRpYyBiY21vc190aW1lcl9yYyBkZXZfY3RybF9kZHJfdGVzdF90aW1lcl9oYW5kbGVyKGJjbW9zX3RpbWVyICp0aW1lciwgbG9uZyBkYXRhKTsKKyNlbmRpZgorCitjb25zdCBjaGFyICpiY21fc3RyX2RldmljZV9zdGF0ZShiY21vbHRfZGV2aWNlX3N0YXRlIGRldmljZV9zdGF0ZSkKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqc3RyaW5nc1tdID0KKyAgICB7CisgICAgICAgIFtCQ01PTFRfREVWSUNFX1NUQVRFX0RJU0NPTk5FQ1RFRF0gPSAiRElTQ09OTkVDVEVEIiwKKyAgICAgICAgW0JDTU9MVF9ERVZJQ0VfU1RBVEVfQ09OTkVDVElOR10gPSAiQ09OTkVDVElORyIsCisgICAgICAgIFtCQ01PTFRfREVWSUNFX1NUQVRFX1JFQURZXSA9ICJSRUFEWSIsCisgICAgICAgIFtCQ01PTFRfREVWSUNFX1NUQVRFX1dBSVRJTkdfRk9SX0RFVklDRV0gPSAiV0FJVElOR19GT1JfREVWSUNFIiwKKyAgICAgICAgW0JDTU9MVF9ERVZJQ0VfU1RBVEVfX05VTV9PRl0gPSAiVU5LTk9XTiIKKyAgICB9OworICAgIHJldHVybiBzdHJpbmdzW2RldmljZV9zdGF0ZSA+IEJDTU9MVF9ERVZJQ0VfU1RBVEVfX05VTV9PRiA/IEJDTU9MVF9ERVZJQ0VfU1RBVEVfX05VTV9PRiA6IGRldmljZV9zdGF0ZV07Cit9CisKK2NvbnN0IGNoYXIgKmJjbV9zdHJfZGV2aWNlX2V2ZW50KGRldl9jdHJsX2V2ZW50IGRldmljZV9ldmVudCkKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqc3RyaW5nc1tdID0KKyAgICB7CisgICAgICAgIFtERVZJQ0VfQ09OVFJPTF9FVkVOVF9ERVZJQ0VfQ0xFQVJdID0gIkRFVklDRV9DTEVBUiIsCisgICAgICAgIFtERVZJQ0VfQ09OVFJPTF9FVkVOVF9ERVZJQ0VfQ09ORklHX1NFVF0gPSAiREVWSUNFX0NPTkZJR19TRVQiLAorICAgICAgICBbREVWSUNFX0NPTlRST0xfRVZFTlRfREVWSUNFX0NPTkZJR19HRVRdID0gIkRFVklDRV9DT05GSUdfR0VUIiwKKyAgICAgICAgW0RFVklDRV9DT05UUk9MX0VWRU5UX0RFVklDRV9ESVNDT05ORUNUXSA9ICJERVZJQ0VfRElTQ09OTkVDVCIsCisgICAgICAgIFtERVZJQ0VfQ09OVFJPTF9FVkVOVF9ERVZJQ0VfVElNRVJfVElNRU9VVF0gPSAiVElNRVJfVElNRU9VVCIsCisgICAgICAgIFtERVZJQ0VfQ09OVFJPTF9FVkVOVF9ERVZJQ0VfUkVDRUlWRURfQUNLXSA9ICJSRUNFSVZFRF9BQ0siLAorICAgICAgICBbREVWSUNFX0NPTlRST0xfRVZFTlRfREVWSUNFX0NPTk5FQ1RdID0gIkRFVklDRV9DT05ORUNUIiwKKyAgICAgICAgW0RFVklDRV9DT05UUk9MX0VWRU5UX0RFVklDRV9SRVNFVF0gPSAiREVWSUNFX1JFU0VUIiwKKyAgICAgICAgW0RFVklDRV9DT05UUk9MX0VWRU5UX0NPTk5FQ1RJT05fRkFJTFVSRV0gPSAiQ09OTkVDVElPTl9GQUlMVVJFIiwKKyAgICAgICAgW0RFVklDRV9DT05UUk9MX0VWRU5UX0NPTk5FQ1RJT05fRVNUQUJMSVNIRURdID0gIkNPTk5FQ1RJT05fRVNUQUJMSVNIRUQiLAorICAgICAgICBbREVWSUNFX0NPTlRST0xfRVZFTlRfREVWSUNFX1JFQURZXSA9ICJERVZJQ0VfUkVBRFkiLAorICAgICAgICBbREVWSUNFX0NPTlRST0xfRVZFTlRfUlVOX0REUl9URVNUXSA9ICJSVU5fRERSX1RFU1QiLAorICAgICAgICBbREVWSUNFX0NPTlRST0xfRVZFTlRfRERSX1RFU1RfQ09NUExFVEVEXSA9ICJERFJfVEVTVF9DT01QTEVURUQiLAorICAgICAgICBbREVWSUNFX0NPTlRST0xfRVZFTlRfRERSX1RFU1RfVElNRU9VVF0gPSAiRERSX1RFU1RfVElNRU9VVCIsCisgICAgICAgIFtERVZJQ0VfQ09OVFJPTF9FVkVOVF9fTlVNX09GXSA9ICJVTktOT1dOIgorICAgIH07CisgICAgcmV0dXJuIHN0cmluZ3NbZGV2aWNlX2V2ZW50ID4gREVWSUNFX0NPTlRST0xfRVZFTlRfX05VTV9PRiA/IERFVklDRV9DT05UUk9MX0VWRU5UX19OVU1fT0YgOiBkZXZpY2VfZXZlbnRdOworfQorCisjaWZkZWYgRU5BQkxFX0xPRworc3RhdGljIGNvbnN0IGNoYXIgKmJjbV9zdHJfYXV0b19pZChiY21vbHRfZGV2aWNlX2F1dG9faWQgYXV0b19pZCkKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqc3RyaW5nc1tdID0KKyAgICB7CisgICAgICAgIFtCQ01PTFRfREVWSUNFX0FVVE9fSURfREVWSUNFX1JFQURZXSA9ICJERVZJQ0VfUkVBRFkiLAorICAgICAgICBbQkNNT0xUX0RFVklDRV9BVVRPX0lEX0NPTk5FQ1RJT05fRVNUQUJMSVNIRURdID0gIkNPTk5FQ1RJT05fRVNUQUJMSVNIRUQiLAorICAgICAgICBbQkNNT0xUX0RFVklDRV9BVVRPX0lEX0RFVklDRV9LRUVQX0FMSVZFXSA9ICJERVZJQ0VfS0VFUF9BTElWRSIsCisgICAgICAgIFtCQ01PTFRfREVWSUNFX0FVVE9fSURfQ09OTkVDVElPTl9GQUlMVVJFXSA9ICJDT05ORUNUSU9OX0ZBSUxVUkUiLAorICAgICAgICBbQkNNT0xUX0RFVklDRV9BVVRPX0lEX0NPTk5FQ1RJT05fQ09NUExFVEVdID0gIkNPTk5FQ1RJT05fQ09NUExFVEUiLAorICAgICAgICBbQkNNT0xUX0RFVklDRV9BVVRPX0lEX0RJU0NPTk5FQ1RJT05fQ09NUExFVEVdID0gIkRJU0NPTk5FQ1RJT05fQ09NUExFVEUiLAorICAgICAgICBbQkNNT0xUX0RFVklDRV9BVVRPX0lEX1NXX0VSUk9SXSA9ICJTV19FUlJPUiIsCisgICAgICAgIFtCQ01PTFRfREVWSUNFX0FVVE9fSURfX05VTV9PRl0gPSAiVU5LTk9XTiIKKyAgICB9OworICAgIHJldHVybiBzdHJpbmdzW2F1dG9faWQgPiBCQ01PTFRfREVWSUNFX0FVVE9fSURfX05VTV9PRiA/IEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9fTlVNX09GIDogYXV0b19pZF07Cit9CisjZW5kaWYKKworY29uc3QgY2hhciAqYmNtX3N0cl9ob3N0X2Nvbm5lY3Rpb25fZmFpbF9yZWFzb24oYmNtb2x0X2hvc3RfY29ubmVjdGlvbl9mYWlsX3JlYXNvbiByZWFzb24pCit7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKnN0cmluZ3NbXSA9CisgICAgeworICAgICAgICBbQkNNT0xUX0hPU1RfQ09OTkVDVElPTl9GQUlMX1JFQVNPTl9USU1FT1VUXSA9ICJUSU1FT1VUIiwKKyAgICAgICAgW0JDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fS0VFUEFMSVZFXSA9ICJLRUVQQUxJVkUiLAorICAgICAgICBbQkNNT0xUX0hPU1RfQ09OTkVDVElPTl9GQUlMX1JFQVNPTl9VU0VSX0NBTExCQUNLX0VSUk9SXSA9ICJVU0VSX0NBTExCQUNLX0VSUk9SIiwKKyAgICAgICAgW0JDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fU09GVFdBUkVfVkVSU0lPTl9NSVNNQVRDSF0gPSAiU09GVFdBUkVfVkVSU0lPTl9NSVNNQVRDSCIsCisgICAgICAgIFtCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX1NZU1RFTV9NT0RFX01JU01BVENIXSA9ICJTWVNURU1fTU9ERV9NSVNNQVRDSCIsCisgICAgICAgIFtCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX05OSV9TUEVFRF9NSVNNQVRDSF0gPSAiTk5JX1NQRUVEX01JU01BVENIIiwKKyAgICAgICAgW0JDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fUkVDT05ORUNUX1RJTUVPVVRdID0gIlJFQ09OTkVDVF9USU1FT1VUIiwKKyAgICAgICAgW0JDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fSU5URVJOQUxfRVJST1JdID0gIklOVEVSTkFMX0VSUk9SIiwKKyAgICAgICAgW0JDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fU1lTVEVNX01PREVfTk9UX1NVUFBPUlRFRF0gPSAiU1lTVEVNX01PREVfTk9UX1NVUFBPUlRFRCIsCisgICAgICAgIFtCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX1BBUkFNRVRFUl0gPSAiUEFSQU1FVEVSIiwKKyAgICAgICAgW0JDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fX05VTV9PRl0gPSAiVU5LTk9XTiIKKyAgICB9OworICAgIHJldHVybiBzdHJpbmdzWworICAgICAgICByZWFzb24gPiBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX19OVU1fT0YgPyBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX19OVU1fT0YgOiByZWFzb25dOworfQorCitjb25zdCBjaGFyICpiY21fc3RyX2hvc3RfY29ubmVjdGluZ19zdGF0ZShkZXZfY3RybF9jb25uZWN0aW5nX3N0YXRlIHN0YXRlKQoreworICAgIHN0YXRpYyBjb25zdCBjaGFyICpzdHJpbmdzW10gPQorICAgIHsKKyAgICAgICAgW0RFVl9DVFJMX0NPTk5FQ1RJTkdfU1RBVEVfRVNUQUJMSVNISU5HXSA9ICJFU1RBQkxJU0hJTkciLAorICAgICAgICBbREVWX0NUUkxfQ09OTkVDVElOR19TVEFURV9DT05GSUdVUklOR10gPSAiQ09ORklHVVJJTkciLAorICAgICAgICBbREVWX0NUUkxfQ09OTkVDVElOR19TVEFURV9TVEFOREFMT05FXSA9ICJTVEFOREFMT05FIgorICAgIH07CisgICAgcmV0dXJuIChzdGF0ZSA+IERFVl9DVFJMX0NPTk5FQ1RJTkdfU1RBVEVfU1RBTkRBTE9ORSkgPyAiVU5LTk9XTiIgOiBzdHJpbmdzW3N0YXRlXTsKK30KKworc3RhdGljIGlubGluZSBiY21vc19ib29sIGRldl9jdHJsX2lzX2Nvbm5lY3RlZChiY21vbHRfZGV2aWNlX3N0YXRlIHN0YXRlKQoreworICAgIHJldHVybiAoc3RhdGUgPT0gQkNNT0xUX0RFVklDRV9TVEFURV9SRUFEWSB8fCBzdGF0ZSA9PSBCQ01PTFRfREVWSUNFX1NUQVRFX1dBSVRJTkdfRk9SX0RFVklDRSk7Cit9CisKK3ZvaWQgZGV2X2N0cmxfcmVhZF9kYihiY21vbHRfZGV2aWQgZGV2aWNlLCBkZXZfY3RybF9kYXRhYmFzZSAqZGIpCit7CisgICAgKmRiID0gZGV2X2N0cmxfZGJbZGV2aWNlXTsKK30KKworI2lmbmRlZiBJTl9CQU5ECisjaWZkZWYgRU5BQkxFX0xPRworc3RhdGljIGJjbW9zX2Vycm5vIGRldl9jdHJsX2dldF9kZXZfbG9nKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9sb2dnZXJfY2ZnICptc2cpCit7CisgICAgY2hhciAqbG9nX2J1ZjsKKyAgICBjaGFyICpsb2dfYnVmX2NvcHk7CisgICAgaW50IGxvZ19sZW47CisgICAgaW50IG1zZ19sZW47CisgICAgaW50IGk7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgYmNtX2Rldl9sb2dfZmlsZSBsb2dfZmlsZTsKKyAgICB1aW50MzJfdCBtc2dfYnVmX29mZnNldDsKKworICAgIGlmIChtc2ctPmtleS5maWxlX2lkICE9IEJDTU9MVF9MT0dfRklMRV9JRF9TUkFNKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGJjbW9sdF9tc2dfZXJyKAorICAgICAgICAgICAgJm1zZy0+aGRyLmhkciwKKyAgICAgICAgICAgIERFVl9MT0dfSU5WQUxJRF9JRCwKKyAgICAgICAgICAgIEJDTV9FUlJfS0VZX1JBTkdFLAorICAgICAgICAgICAgQkNNT0xUX0xPR0dFUl9LRVlfSURfRklMRV9JRCwKKyAgICAgICAgICAgICJXaGlsZSBkaXNjb25uZWN0ZWQsIG9ubHkgdGhlIFNSQU0gbG9nZ2VyIG1heSBiZSByZWFkIik7CisgICAgfQorCisgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQobXNnLCBsb2dnZXIsIHdyYXBfYXJvdW5kKSkKKyAgICB7CisgICAgICAgIHJldHVybiBiY21vbHRfbXNnX2VycigKKyAgICAgICAgICAgICZtc2ctPmhkci5oZHIsCisgICAgICAgICAgICBERVZfTE9HX0lOVkFMSURfSUQsCisgICAgICAgICAgICBCQ01fRVJSX1JBTkdFLAorICAgICAgICAgICAgQkNNT0xUX0xPR0dFUl9DRkdfSURfV1JBUF9BUk9VTkQsCisgICAgICAgICAgICAid3JhcF9hcm91bmQgY2Fubm90IGJlIHJldHJpZXZlZCB3aGlsZSBkaXNjb25uZWN0ZWQiKTsKKyAgICB9CisKKyAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChtc2csIGxvZ2dlciwgZW5hYmxlX2xvZykpCisgICAgeworICAgICAgICByZXR1cm4gYmNtb2x0X21zZ19lcnIoCisgICAgICAgICAgICAmbXNnLT5oZHIuaGRyLAorICAgICAgICAgICAgREVWX0xPR19JTlZBTElEX0lELAorICAgICAgICAgICAgQkNNX0VSUl9SQU5HRSwKKyAgICAgICAgICAgIEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX0VOQUJMRV9MT0csCisgICAgICAgICAgICAiZW5hYmxlX2xvZyBjYW5ub3QgYmUgcmV0cmlldmVkIHdoaWxlIGRpc2Nvbm5lY3RlZCIpOworICAgIH0KKworICAgIGlmIChCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKG1zZywgbG9nZ2VyLCBsb2dfbmFtZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGJjbW9sdF9tc2dfZXJyKAorICAgICAgICAgICAgJm1zZy0+aGRyLmhkciwKKyAgICAgICAgICAgIERFVl9MT0dfSU5WQUxJRF9JRCwKKyAgICAgICAgICAgIEJDTV9FUlJfUkFOR0UsCisgICAgICAgICAgICBCQ01PTFRfTE9HR0VSX0NGR19JRF9MT0dfTkFNRVMsCisgICAgICAgICAgICAibG9nX25hbWVzIGNhbm5vdCBiZSByZXRyaWV2ZWQgd2hpbGUgZGlzY29ubmVjdGVkIik7CisgICAgfQorCisgICAgaWYgKCFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKG1zZywgbG9nZ2VyLCBidWZmZXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7IC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICB9CisKKyAgICBpZiAoZGV2X2N0cmxfZGJbZGV2aWNlXS5mbGRfaW5mby5zb2Nfc3JhbV9iYXNlID09IDApCisgICAgeworICAgICAgICByZXR1cm4gYmNtb2x0X21zZ19lcnIoCisgICAgICAgICAgICAmbXNnLT5oZHIuaGRyLAorICAgICAgICAgICAgREVWX0xPR19JTlZBTElEX0lELAorICAgICAgICAgICAgQkNNX0VSUl9TVEFURSwKKyAgICAgICAgICAgIEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX0JVRkZFUiwKKyAgICAgICAgICAgICJsb2cgYnVmZmVyIGNhbiBvbmx5IGJlIHJldHJlaXZlZCBhZnRlciBpbml0aWFsIGRldmljZSBjb25uZWN0aW9uIik7CisgICAgfQorCisgICAgcmMgPSBiY21fZmxkX2dldF9sb2dzKGRldmljZSwgJmxvZ19idWYsICZsb2dfbGVuKTsKKyAgICBCQ01fREVWX0NUUkxfUkVUVVJOX09OX0VSUk9SKGRldmljZSwgcmMsICJiY21fZmxkX2dldF9sb2dzXG4iKTsKKworICAgIGlmICghbG9nX2xlbikKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisKKyAgICAvKiBNYWtlIGEgY29weSB0byBhdm9pZCB3b3JraW5nIG92ZXIgUENJZS4gT3RoZXJ3aXNlLCB0aGUgYmVoYXZpb3IgY2FuIGJlIHVucHJlZGljdGFibGUKKyAgICAgKiBiYXNlZCBvbiBQQ0llIHRyYW5zYWN0aW9uIHNpemUgYW5kIGNvbnRyb2xsZXIgY29uZmlndXJhdGlvbiAqLworICAgIGxvZ19idWZfY29weSA9IGJjbW9zX2FsbG9jKGxvZ19sZW4pOworICAgIGlmICghbG9nX2J1Zl9jb3B5KQorICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKworICAgIC8qIENvcHkgYnl0ZSBieSBieXRlLiBTbG93IGJ1dCB3b3JrcyBmb3IgYW55IFBDSWUgY29uZmlndXJhdGlvbiAqLworICAgIGZvciAoaSA9IDA7IGkgPCBsb2dfbGVuOyBpKyspCisgICAgICAgIGxvZ19idWZfY29weVtpXSA9IGxvZ19idWZbaV07CisKKyAgICBtc2ctPmhkci5oZHIucHJlc2VuY2VfbWFzayB8PSAoMSA8PCBCQ01PTFRfTE9HR0VSX0NGR19JRF9CVUZGRVIpOworCisgICAgLyogQXR0YWNoIGxvZyBmaWxlIHRvIHRoZSBidWZmZXIgYW5kIHJlYWQgZnJvbSB0aGUgZmlsZSAqLworICAgIHJjID0gYmNtX2Rldl9sb2dfZmlsZV9hdHRhY2gobG9nX2J1Zl9jb3B5LCBsb2dfbGVuLCAmbG9nX2ZpbGUpOworCisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0sgfHwgYmNtX2Rldl9sb2dfZ2V0X251bV9vZl9tZXNzYWdlcygmbG9nX2ZpbGUpID09IDApCisgICAgeworICAgICAgICBiY21vc19mcmVlKGxvZ19idWZfY29weSk7CisgICAgICAgIEJDTV9MT0coSU5GTywgZGV2X2N0cmxfZGJbZGV2aWNlXS5sb2dfaWQsICJTUkFNIGxvZyBidWZmZXIgaXMgZW1wdHlcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisKKyAgICAvKiBjb3B5IGFsbCBtZXNzYWdlcyBmcm9tIFNSQU0gdG8gdGhlIEFQSSBtZXNzYWdlIGJ1ZmZlciAoc3RvcHBpbmcgd2hlbiBidWZmZXIgaXMgZnVsbCkgKi8KKyAgICBtc2dfYnVmX29mZnNldCA9IDA7CisgICAgZG8KKyAgICB7CisgICAgICAgIG1zZ19sZW4gPSBiY21fZGV2X2xvZ19maWxlX3JlYWQoJmxvZ19maWxlLCAmZGV2X2N0cmxfZGJbZGV2aWNlXS5zcmFtX2xvZ19vZmZzZXQsCisgICAgICAgICAgICAmbXNnLT5kYXRhLmJ1ZmZlci5idWZmW21zZ19idWZfb2Zmc2V0XSwgc2l6ZW9mKG1zZy0+ZGF0YS5idWZmZXIuYnVmZiktIG1zZ19idWZfb2Zmc2V0IC0gMSk7CisgICAgICAgIGlmIChtc2dfbGVuIDw9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgKytkZXZfY3RybF9kYltkZXZpY2VdLm1zZ3NfcmVhZDsKKyAgICAgICAgLyogVGhlIGxhc3QgY2hhcmFjdGVyIGlzIDAtdGVybWluYXRvci4gVGFrZSBpdCBvdXQgKi8KKyAgICAgICAgbXNnX2J1Zl9vZmZzZXQgKz0gbXNnX2xlbiAtIDE7CisgICAgfSB3aGlsZSAobXNnX2J1Zl9vZmZzZXQgPCBzaXplb2YobXNnLT5kYXRhLmJ1ZmZlci5idWZmKSAtIDEpOworCisgICAgLyogdGVybWluYXRlIHRoZSBzdHJpbmcgd2l0aCBhIG51bGwgY2hhcmFjdGVyICovCisgICAgbXNnLT5kYXRhLmJ1ZmZlci5idWZmW21zZ19idWZfb2Zmc2V0XSA9ICdcMCc7CisgICAgaWYgKG1zZ19sZW4gPT0gQkNNX0VSUl9PVkVSRkxPVykKKyAgICB7CisgICAgICAgIC8qIE1vcmUgcmVjb3JkcyB0byByZWFkICovCisgICAgICAgIG1zZy0+ZGF0YS5idWZmZXIubXNnX3RvX3JlYWQgPSBiY21fZGV2X2xvZ19nZXRfbnVtX29mX21lc3NhZ2VzKCZsb2dfZmlsZSkgLSBkZXZfY3RybF9kYltkZXZpY2VdLm1zZ3NfcmVhZDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogYWxsIGRvbmUgKi8KKyAgICAgICAgbXNnLT5kYXRhLmJ1ZmZlci5tc2dfdG9fcmVhZCA9IDA7CisgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0uc3JhbV9sb2dfb2Zmc2V0ID0gMDsKKyAgICAgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5tc2dzX3JlYWQgPSAwOworICAgIH0KKworICAgIC8qIERldGFjaCBmaWxlIGZyb20gYnVmZmVyICovCisgICAgYmNtX2Rldl9sb2dfZmlsZV9kZXRhY2goJmxvZ19maWxlKTsKKworICAgIGJjbW9zX2ZyZWUobG9nX2J1Zl9jb3B5KTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorI2VuZGlmCisKK3N0YXRpYyBiY21vc19lcnJubyBkZXZfY3RybF9nZXRfc3dfZXJyb3JfdGFibGUoYmNtb2x0X2RldmlkIGRldmljZSkKK3sKKyAgICBiY21vc19zd19lcnJvcl90YWJsZSAqc3dfZXJyb3JfdGFibGU7CisgICAgdWludDhfdCAqc3JhbTsKKyAgICB1aW50OF90ICpsb2NhbDsKKyAgICB1aW50MzJfdCBzaXplOworICAgIHVpbnQzMl90IGk7CisKKyAgICBzcmFtID0gYmNtX2ZsZF9nZXRfc3dfZXJyb3JfdGFibGUoZGV2aWNlLCAmc2l6ZSk7CisgICAgbG9jYWwgPSBiY21vc19hbGxvYyhzaXplKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgIHsKKyAgICAgICAgbG9jYWxbaV0gPSBzcmFtW2ldOworICAgIH0KKworICAgIHN3X2Vycm9yX3RhYmxlID0gKGJjbW9zX3N3X2Vycm9yX3RhYmxlKilsb2NhbDsKKyAgICBkZXZfY3RybF9kYltkZXZpY2VdLnN3X2Vycm9yX2NvdW50ID0gQkNNT1NfRU5ESUFOX0xJVFRMRV9UT19DUFVfVTMyKHN3X2Vycm9yX3RhYmxlLT5jb3VudCk7CisgICAgaWYgKGRldl9jdHJsX2RiW2RldmljZV0uc3dfZXJyb3JfY291bnQgPiBOVU1fRUxFTShkZXZfY3RybF9kYltkZXZpY2VdLnN3X2Vycm9ycykpCisgICAgeworICAgICAgICBiY21vc19mcmVlKGxvY2FsKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT1ZFUkZMT1c7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGRldl9jdHJsX2RiW2RldmljZV0uc3dfZXJyb3JfY291bnQ7IGkrKykKKyAgICB7CisgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0uc3dfZXJyb3JzW2ldLmZpcnN0X2Vycm9yX3RpbWVfdXMgPQorICAgICAgICAgICAgQkNNT1NfRU5ESUFOX0xJVFRMRV9UT19DUFVfVTY0KHN3X2Vycm9yX3RhYmxlLT5lcnJvcltpXS5maXJzdF9lcnJvcl90aW1lKTsKKyAgICAgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5zd19lcnJvcnNbaV0ubGFzdF9lcnJvcl90aW1lX3VzID0KKyAgICAgICAgICAgIEJDTU9TX0VORElBTl9MSVRUTEVfVE9fQ1BVX1U2NChzd19lcnJvcl90YWJsZS0+ZXJyb3JbaV0ubGFzdF9lcnJvcl90aW1lKTsKKyAgICAgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5zd19lcnJvcnNbaV0ubGluZV9udW1iZXIgPQorICAgICAgICAgICAgQkNNT1NfRU5ESUFOX0xJVFRMRV9UT19DUFVfVTMyKHN3X2Vycm9yX3RhYmxlLT5lcnJvcltpXS5saW5lX251bWJlcik7CisgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0uc3dfZXJyb3JzW2ldLmVycm9yX2NvdW50ZXIgPQorICAgICAgICAgICAgQkNNT1NfRU5ESUFOX0xJVFRMRV9UT19DUFVfVTMyKHN3X2Vycm9yX3RhYmxlLT5lcnJvcltpXS5lcnJvcl9jb3VudGVyKTsKKyAgICAgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5zd19lcnJvcnNbaV0uaW5zdGFuY2UgPQorICAgICAgICAgICAgQkNNT1NfRU5ESUFOX0xJVFRMRV9UT19DUFVfVTMyKHN3X2Vycm9yX3RhYmxlLT5lcnJvcltpXS5pbnN0YW5jZSk7CisgICAgICAgIHN0cm5jcHkoCisgICAgICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLnN3X2Vycm9yc1tpXS5maWxlbmFtZSwKKyAgICAgICAgICAgIHN3X2Vycm9yX3RhYmxlLT5lcnJvcltpXS5maWxlX25hbWUsCisgICAgICAgICAgICBCQ01PTFRfU1dfRVJST1JfTUFYX0ZJTEVfTkFNRV9MRU4pOworICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLnN3X2Vycm9yc1tpXS5maWxlbmFtZVtCQ01PTFRfU1dfRVJST1JfTUFYX0ZJTEVfTkFNRV9MRU4tMV0gPSAwOworICAgICAgICBzdHJuY3B5KAorICAgICAgICAgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5zd19lcnJvcnNbaV0udGFza19uYW1lLAorICAgICAgICAgICAgc3dfZXJyb3JfdGFibGUtPmVycm9yW2ldLnRhc2tfbmFtZSwKKyAgICAgICAgICAgIEJDTU9MVF9TV19FUlJPUl9NQVhfVEFTS19OQU1FX0xFTik7CisgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0uc3dfZXJyb3JzW2ldLnRhc2tfbmFtZVtCQ01PTFRfU1dfRVJST1JfTUFYX1RBU0tfTkFNRV9MRU4tMV0gPSAwOworICAgIH0KKworICAgIGJjbW9zX2ZyZWUobG9jYWwpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19ib29sIHN3X2Vycm9yX2tleV92YWxpZChjb25zdCBiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5ICprZXkpCit7CisgICAgYmNtb2x0X2RldmlkIGRldmljZSA9IChiY21vbHRfZGV2aWQpYmNtb3NfdGFza19jdXJyZW50KCktPnBhcm0uZGF0YTsKKyAgICByZXR1cm4ga2V5LT5pZHggPCBkZXZfY3RybF9kYltkZXZpY2VdLnN3X2Vycm9yX2NvdW50OworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gbWhfc29mdHdhcmVfZXJyb3Jfa2V5X3ZhbGlkYXRlKGJjbW9sdF9tc2cgKm1zZywgY29uc3QgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleSAqa2V5KQoreworICAgIHJldHVybiBzd19lcnJvcl9rZXlfdmFsaWQoa2V5KSA/IEJDTV9FUlJfT0sgOiBCQ01fRVJSX05PRU5UOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gbWhfc29mdHdhcmVfZXJyb3JfY2ZnX2dldCgKKyAgICBiY21vbHRfbXNnICptc2csCisgICAgY29uc3QgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleSAqa2V5LAorICAgIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfZGF0YSAqZGF0YSkKK3sKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlID0gKGJjbW9sdF9kZXZpZCliY21vc190YXNrX2N1cnJlbnQoKS0+cGFybS5kYXRhOworICAgIGJjbW9sdF9wcmVzZW5jZV9tYXNrIHByb3BzID0gbXNnLT5wcmVzZW5jZV9tYXNrOworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIGlmIChwcm9wcyA9PSBCQ01PTFRfUFJFU0VOQ0VfTUFTS19BTEwpCisgICAgeyAKKyAgICAgICAgLyogQ29udmVydCBmcm9tIHNlbnRpbmVsICJhbGwiIHByZXNlbmNlIGJpdHMgdG8gc2V0IG9mIGFsbCB2YWxpZCBiaXRzKi8KKyAgICAgICAgcHJvcHMgPSAoMVUgPDwgQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0NGR19JRF9fTlVNX09GKSAtIDE7CisgICAgfQorCisgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoKGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmcqKW1zZywgc29mdHdhcmVfZXJyb3IsIGVudHJ5KSkKKyAgICB7CisgICAgICAgIGlmIChkZXZfY3RybF9kYltkZXZpY2VdLmZsZF9pbmZvLnNvY19zcmFtX2Jhc2UgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9tc2dfZXJyKAorICAgICAgICAgICAgICAgIG1zZywKKyAgICAgICAgICAgICAgICBERVZfTE9HX0lOVkFMSURfSUQsCisgICAgICAgICAgICAgICAgQkNNX0VSUl9TVEFURSwKKyAgICAgICAgICAgICAgICBCQ01PTFRfU09GVFdBUkVfRVJST1JfQ0ZHX0lEX0VOVFJZLAorICAgICAgICAgICAgICAgICJTb2Z0d2FyZSBlcnJvcnMgY2FuIG9ubHkgYmUgcmV0cmVpdmVkIGFmdGVyIGluaXRpYWwgZGV2aWNlIGNvbm5lY3Rpb24iKTsKKyAgICAgICAgfQorCisgICAgICAgIGRhdGEtPmVudHJ5ID0gZGV2X2N0cmxfZGJbZGV2aWNlXS5zd19lcnJvcnNba2V5LT5pZHhdOworICAgICAgICBwcm9wcyAmPSB+QkNNT0xUX1BST1BfTUFTS19HRVQoc29mdHdhcmVfZXJyb3IsIF9jZmcsIGVudHJ5KTsKKyAgICB9CisKKyAgICBpZiAocHJvcHMgIT0gMCkKKyAgICB7CisgICAgICAgIHJjID0gYmNtb2x0X21zZ19lcnIobXNnLAorICAgICAgICAgICAgREVWX0xPR19JTlZBTElEX0lELAorICAgICAgICAgICAgQkNNX0VSUl9OT1RfU1VQUE9SVEVELAorICAgICAgICAgICAgQkNNT0xUX0VSUl9GSUVMRF9OT05FLAorICAgICAgICAgICAgIlVuc3VwcG9ydGVkIHByb3BlcnRpZXM6IDB4JWxseCIsICh1bnNpZ25lZCBsb25nIGxvbmcpcHJvcHMpOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIG1oX3NvZnR3YXJlX2Vycm9yX2tleV9pdGVyYXRlKGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXkgKmtleSkKK3sKKyAgICBrZXktPmlkeCsrOworICAgIHJldHVybiBzd19lcnJvcl9rZXlfdmFsaWQoa2V5KSA/IEJDTV9FUlJfT0sgOiBCQ01fRVJSX05PX01PUkU7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBtaF9zb2Z0d2FyZV9lcnJvcl9rZXlfcmVzb2x2ZV93aWxkY2FyZHMoYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleSAqa2V5KQoreworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitNSF9ERUNMQVJFX0NGR19HRVRfTVVMVEkoc29mdHdhcmVfZXJyb3IpCisKK3N0YXRpYyBiY21vc19lcnJubyBkZXZfY3RybF9zd19lcnJvcl9nZXQoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmcgKmNmZyA9IChiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnKiltc2c7CisgICAgYmNtb3NfZXJybm8gZXJyID0gZGV2X2N0cmxfZ2V0X3N3X2Vycm9yX3RhYmxlKGRldmljZSk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7CisgICAgfQorCisgICAgaWYgKG1zZy0+dHlwZSA9PSBCQ01PTFRfTVNHX1RZUEVfR0VUKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleV9pZCBrZXlfcHJvcF9pZDsKKyAgICAgICAgaWYgKCFiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5X2JvdW5kc19jaGVjaygmY2ZnLT5rZXksIEJDTU9MVF9QUkVTRU5DRV9NQVNLX0FMTCwgJmtleV9wcm9wX2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgbXNnLT5lcnJfZmllbGRfaWR4ID0gKHVpbnQxNl90KSBrZXlfcHJvcF9pZDsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX0tFWV9SQU5HRTsKKyAgICAgICAgfQorCisgICAgICAgIGVyciA9IG1oX3NvZnR3YXJlX2Vycm9yX2tleV92YWxpZGF0ZShtc2csICZjZmctPmtleSk7CisgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtaF9zb2Z0d2FyZV9lcnJvcl9jZmdfZ2V0KG1zZywgJmNmZy0+a2V5LCAmY2ZnLT5kYXRhKTsKKyAgICB9CisgICAgZWxzZSBpZiAobXNnLT50eXBlID09IEJDTU9MVF9NU0dfVFlQRV9HRVRfTVVMVEkpCisgICAgeworICAgICAgICByZXR1cm4gbWhfc29mdHdhcmVfZXJyb3JfY2ZnX2dldF9tdWx0aShjZmcsIG1zZy0+bXNnX3NldC0+ZmlsdGVyX2ZsYWdzLCBtc2ctPm1zZ19zZXQpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBkZXZfY3RybF9kYltkZXZpY2VdLmxvZ19pZCwgIlVuZXhwZWN0ZWQgdHlwZSAweCV4XG4iLCBtc2ctPnR5cGUpOworICAgIH0KKyAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBkZXZfY3RybF9zZW5kX2luZGljYXRpb24oYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnKQoreworICAgIG1zZy0+c3ViY2ggPSBCQ01UUk1VWF9DSEFOTkVMX0FVVE9fUFJPWFk7CisgICAgbXNnLT50eXBlID0gQkNNT0xUX01TR19UWVBFX1NFVDsKKyAgICBiY210cm11eF9jb250cm9sX3RvX2hvc3QoZGV2aWNlLCBtc2cpOworfQorCitzdGF0aWMgdm9pZCBkZXZfY3RybF9zZW5kX2luZF9jb25uZWN0aW9uX2NvbXBsZXRlKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9zX2Jvb2wgc3RhbmRhbG9uZSkKK3sKKyAgICBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGUgaW5kID0ge307CisgICAgQkNNX0xPRyhJTkZPLCBkZXZfY3RybF9kYltkZXZpY2VdLmxvZ19pZCwgIkNvbm5lY3Rpb24gY29tcGxldGU6IHN0YW5kYWxvbmU9JXNcbiIsIHN0YW5kYWxvbmUgPyAieWVzIiA6ICJubyIpOworICAgIEJDTU9MVF9BVVRPX0lOSVQoJmluZCwgZGV2aWNlLCBjb25uZWN0aW9uX2NvbXBsZXRlKTsKKyAgICBpbmQuZGF0YS5zdGFuZGFsb25lID0gc3RhbmRhbG9uZTsKKyAgICBkZXZfY3RybF9zZW5kX2luZGljYXRpb24oZGV2aWNlLCAmaW5kLmhkci5oZHIpOworfQorCitzdGF0aWMgdm9pZCBkZXZfY3RybF9zZW5kX2luZF9kaXNjb25uZWN0aW9uX2NvbXBsZXRlKGJjbW9sdF9kZXZpZCBkZXZpY2UpCit7CisgICAgYmNtb2x0X2RldmljZV9kaXNjb25uZWN0aW9uX2NvbXBsZXRlIGluZCA9IHt9OworICAgIEJDTV9MT0coSU5GTywgZGV2X2N0cmxfZGJbZGV2aWNlXS5sb2dfaWQsICJEaXNjb25uZWN0aW9uIGNvbXBsZXRlXG4iKTsKKyAgICBCQ01PTFRfQVVUT19JTklUKCZpbmQsIGRldmljZSwgZGlzY29ubmVjdGlvbl9jb21wbGV0ZSk7CisgICAgZGV2X2N0cmxfc2VuZF9pbmRpY2F0aW9uKGRldmljZSwgJmluZC5oZHIuaGRyKTsKK30KKworc3RhdGljIHZvaWQgZGV2X2N0cmxfc2VuZF9pbmRfY29ubmVjdGlvbl9mYWlsdXJlKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9ob3N0X2Nvbm5lY3Rpb25fZmFpbF9yZWFzb24gcmVhc29uKQoreworICAgIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlIGluZCA9IHt9OworICAgIEJDTV9MT0coSU5GTywgZGV2X2N0cmxfZGJbZGV2aWNlXS5sb2dfaWQsICJDb25uZWN0aW9uIGZhaWx1cmU6ICVzXG4iLCBiY21fc3RyX2hvc3RfY29ubmVjdGlvbl9mYWlsX3JlYXNvbihyZWFzb24pKTsKKyAgICBCQ01PTFRfQVVUT19JTklUKCZpbmQsIGRldmljZSwgY29ubmVjdGlvbl9mYWlsdXJlKTsKKyAgICBpbmQuZGF0YS5yZWFzb24gPSByZWFzb247CisgICAgZGV2X2N0cmxfc2VuZF9pbmRpY2F0aW9uKGRldmljZSwgJmluZC5oZHIuaGRyKTsKKyAgICBkZXZfY3RybF9kYltkZXZpY2VdLmNvbm5fZmFpbF9yZWFzb24gPSByZWFzb247IC8qIGxvZyB0aGUgZmFpbHVyZSByZWFzb24gdG8gdGhlIGRiLiAqLworfQorCitzdGF0aWMgdm9pZCBkZXZfY3RybF9zZW5kX2luZF9jb25uZWN0aW9uX2ZhaWx1cmVfZnJvbV9tc2coYmNtb2x0X2RldmlkIGRldmljZSwgY29uc3QgYmNtb2x0X21zZyAqbXNnKQoreworICAgIEJVR19PTihtc2ctPnN1Ymdyb3VwICE9IEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9DT05ORUNUSU9OX0ZBSUxVUkUpOworICAgIGRldl9jdHJsX3NlbmRfaW5kX2Nvbm5lY3Rpb25fZmFpbHVyZShkZXZpY2UsICgoY29uc3QgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmUgKiltc2cpLT5kYXRhLnJlYXNvbik7Cit9CisKKyNpZm5kZWYgSU5fQkFORAorc3RhdGljIHZvaWQgZGV2X2N0cmxfc2VuZF9pbmRfZXhjZXB0aW9uX2xvZyhiY21vbHRfZGV2aWQgZGV2aWNlLCB1aW50MzJfdCBjcHVpZCwgY29uc3QgY2hhciAqZXhjZXB0aW9uX2J1ZikKK3sKKyAgICAvKiBCZWNhdXNlIGluZGljYXRpb24gc2l6ZSBpcyBsaW1pdGVkIChidXQgSU5EX01TR19NQVhfU0laRSA+IHNpemVvZihiY21vbHRfc3RyXzIwMDAuc3RyKSwgd2UgbWF5IG5lZWQgdG8gc3BsaXQgaW50byBtdWx0aXBsZSBpbmRpY2F0aW9ucy4KKyAgICAgKiBXZSB1c2UgYSBzdGF0aWMgdmFyaWFibGUgYmVjYXVzZSBvdXIgc3RhY2sgc2l6ZSBpcyBsaW1pdGVkLiAqLworICAgIHN0YXRpYyBiY21vbHRfc3RyXzIwMDAgYXBpX2V4Y2VwdGlvbl9zdHI7CisgICAgY29uc3QgY2hhciAqcG9zID0gZXhjZXB0aW9uX2J1ZjsKKyAgICB1aW50MzJfdCByZW1haW5pbmdfbGVuID0gc3RybGVuKHBvcyk7CisKKyAgICB3aGlsZSAocmVtYWluaW5nX2xlbikKKyAgICB7CisgICAgICAgIGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uIGluZCA9IHt9OworICAgICAgICB1aW50MzJfdCBieXRlc19jb3BpZWQ7CisKKyAgICAgICAgc3RybmNweShhcGlfZXhjZXB0aW9uX3N0ci5zdHIsIHBvcywgc2l6ZW9mKGFwaV9leGNlcHRpb25fc3RyLnN0cikgLSAxKTsKKyAgICAgICAgYXBpX2V4Y2VwdGlvbl9zdHIuc3RyW3NpemVvZihhcGlfZXhjZXB0aW9uX3N0ci5zdHIpIC0gMV0gPSAnXDAnOworCisgICAgICAgIEJDTU9MVF9BVVRPX0lOSVQoJmluZCwgZGV2aWNlLCBzd19leGNlcHRpb24pOworICAgICAgICBpbmQuZGF0YS5jcHVfaWQgPSBjcHVpZDsKKyAgICAgICAgaW5kLmRhdGEudGV4dCA9IGFwaV9leGNlcHRpb25fc3RyOworICAgICAgICBkZXZfY3RybF9zZW5kX2luZGljYXRpb24oZGV2aWNlLCAmaW5kLmhkci5oZHIpOworCisgICAgICAgIGlmIChzaXplb2YoYXBpX2V4Y2VwdGlvbl9zdHIuc3RyKSAtIDEgPCByZW1haW5pbmdfbGVuKQorICAgICAgICB7CisgICAgICAgICAgICBieXRlc19jb3BpZWQgPSBzaXplb2YoYXBpX2V4Y2VwdGlvbl9zdHIuc3RyKSAtIDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBieXRlc19jb3BpZWQgPSByZW1haW5pbmdfbGVuOworICAgICAgICB9CisgICAgICAgIHJlbWFpbmluZ19sZW4gLT0gYnl0ZXNfY29waWVkOworICAgICAgICBwb3MgKz0gYnl0ZXNfY29waWVkOworICAgIH0KK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBkZXZfY3RybF9zZW5kX2NvbmZpZ19zZXRfbXNnKAorICAgIGJjbW9sdF9kZXZpZCBkZXZpY2UsCisgICAgYmNtb2x0X3ByZXNlbmNlX21hc2sgbWFzaywKKyAgICB1aW50MTZfdCBjb3JyX3RhZywKKyAgICBjb25zdCBiY21vbHRfZGV2aWNlX2NmZ19kYXRhICpkYXRhKQoreworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGtleSA9IHt9OworICAgIGJjbW9sdF9kZXZpY2VfY2ZnIGNmZzsKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBkZXZpY2UsIGtleSk7CisgICAgY2ZnLmRhdGEgPSAqZGF0YTsKKyAgICBjZmcuaGRyLmhkci5wcmVzZW5jZV9tYXNrID0gbWFzazsKKworICAgIGNmZy5oZHIuaGRyLmNvcnJfdGFnID0gY29ycl90YWc7CisgICAgY2ZnLmhkci5oZHIudHlwZSA9IEJDTU9MVF9NU0dfVFlQRV9TRVQ7CisKKyAgICByYyA9IGJjbXRybXV4X2NvbnRyb2xfdG9fbGluZShkZXZpY2UsICZjZmcuaGRyLmhkcik7CisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBkZXZfY3RybF9kYltkZXZpY2VdLmxvZ19pZCwKKyAgICAgICAgICAgICJiY210cm11eF9jb250cm9sX3RvX2xpbmUgb2YgZGV2aWNlIGNvbmZpZyBtc2cgcmV0dXJuZWQgZXJyb3IgJXMgKCVkKVxuIiwKKyAgICAgICAgICAgIGJjbW9zX3N0cmVycm9yKHJjKSwKKyAgICAgICAgICAgIHJjKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRldl9jdHJsX3NlbmRfY29uZmlnX2dldF9tc2coYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgbWFzaywgdWludDE2X3QgY29ycl90YWcpCit7CisgICAgYmNtb2x0X2RldmljZV9rZXkga2V5ID0ge307CisgICAgYmNtb2x0X2RldmljZV9jZmcgY2ZnOworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGRldmljZSwga2V5KTsKKyAgICBjZmcuaGRyLmhkci5wcmVzZW5jZV9tYXNrID0gbWFzazsKKworICAgIGNmZy5oZHIuaGRyLmNvcnJfdGFnID0gY29ycl90YWc7CisgICAgY2ZnLmhkci5oZHIudHlwZSA9IEJDTU9MVF9NU0dfVFlQRV9HRVQ7CisKKyAgICByYyA9IGJjbXRybXV4X2NvbnRyb2xfdG9fbGluZShkZXZpY2UsICZjZmcuaGRyLmhkcik7CisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBkZXZfY3RybF9kYltkZXZpY2VdLmxvZ19pZCwKKyAgICAgICAgICAgICJiY210cm11eF9jb250cm9sX3RvX2xpbmUgb2YgZGV2aWNlIGNvbmZpZyBtc2cgcmV0dXJuZWQgZXJyb3IgJXMgKCVkKVxuIiwKKyAgICAgICAgICAgIGJjbW9zX3N0cmVycm9yKHJjKSwKKyAgICAgICAgICAgIHJjKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRldl9jdHJsX3NlbmRfZGV2aWNlX2Rpc2Nvbm5lY3RfbXNnKGJjbW9sdF9kZXZpZCBkZXZpY2UsIHVpbnQxNl90IGNvcnJfdGFnKQoreworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGtleSA9IHt9OworICAgIGJjbW9sdF9kZXZpY2VfZGlzY29ubmVjdCBvcGVyOworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZGV2aWNlLCBkaXNjb25uZWN0LCBrZXkpOworCisgICAgb3Blci5oZHIuaGRyLmNvcnJfdGFnID0gY29ycl90YWc7CisgICAgb3Blci5oZHIuaGRyLnR5cGUgPSBCQ01PTFRfTVNHX1RZUEVfU0VUOworICAgIHJjID0gYmNtdHJtdXhfY29udHJvbF90b19saW5lKGRldmljZSwgJm9wZXIuaGRyLmhkcik7CisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBkZXZfY3RybF9kYltkZXZpY2VdLmxvZ19pZCwKKyAgICAgICAgICAgICJiY210cm11eF9jb250cm9sX3RvX2xpbmUgb2YgZGV2aWNlIGRpc2Nvbm5lY3Qgb3BlcmF0aW9uIHJldHVybmVkIGVycm9yICVzICglZClcbiIsCisgICAgICAgICAgICBiY21vc19zdHJlcnJvcihyYyksCisgICAgICAgICAgICByYyk7CisgICAgfQorfQorCisvKiBTZXQgYWxsIGRldmljZSBvYmplY3QgcHJvcGVydGllcyB0byBkZWZhdWx0IHZhbHVlcy4gKi8KK3N0YXRpYyB2b2lkIGRldl9jdHJsX2NsZWFyX2RldmljZV9jZmcoYmNtb2x0X2RldmlkIGRldmljZSkKK3sKKyAgICBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXNfcHJlc2VudCA9IDA7CisKKyAgICAvKiBQYXkgYXR0ZW50aW9uOiBXZSB1c2UgdGhlIGludGVydmFsIGFuZCB0b2xlcmFuY2UgZnJvbSBkZXZfY3RybF9kYltkZXZpY2VdLmthX2luZm8gYW5kIG5vdCBmcm9tCisgICAgICogZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zLiBUaGVzZSBwYXJhbWV0ZXJzIGV4aXN0IGluIGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtcyBvbmx5IGJlY2F1c2UgaXQgaXMKKyAgICAgKiB0aGUgZGF0YSBtb2RlbCByZXByZXNlbnRhdGlvbi4gKi8KKyAgICBiY21vbHRfZGV2aWNlX2NmZ19kYXRhX3NldF9kZWZhdWx0KCZkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMsIEJDTU9MVF9QUkVTRU5DRV9NQVNLX0FMTCk7CisgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5rYV9pbmZvLmthX2ludGVydmFsID0KKyAgICAgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zLmtlZXBhbGl2ZV9pbnRlcnZhbCAqIEJDTU9TX01JQ1JPU0VDT05EU19JTl9TRUNPTkRTOworICAgIGRldl9jdHJsX2RiW2RldmljZV0ua2FfaW5mby5rYV90b2xlcmFuY2UgPSBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMua2VlcGFsaXZlX3RvbGVyYW5jZTsKK30KKworc3RhdGljIHZvaWQgZGV2X2N0cmxfaW5pdF9jb25uZWN0aW9uX3N0YXRlKGJjbW9sdF9kZXZpZCBkZXZpY2UpCit7CisgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5jb25uZWN0aW9uX2luZm8uY29uZmlnX3NlbmRfY291bnRlciA9IENPTkZJR19TRU5EX01BWF9OVU1CRVI7CisgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5jb25uZWN0aW9uX2luZm8uY29uZmlnX2ludGVydmFsID0gREVWSUNFX0NPTlRST0xfQ09ORklHX1RJTUVfVVM7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBkZXZfY3RybF92YWxpZGF0ZV9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9tc2cgKm1zZykKK3sKKyNpZm5kZWYgSU5fQkFORAorICAgIGJjbW9zX2Vycm5vIHJjOworI2VuZGlmCisgICAgYmNtb2x0X2RldmljZV9jZmcgKmNmZyA9IChiY21vbHRfZGV2aWNlX2NmZyAqKW1zZzsKKyAgICBiY21vbHRfZGV2aWNlX3N0YXRlIHN0YXRlID0gZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zLnN0YXRlOworICAgIGJjbW9sdF9kZXZpY2VfY2ZnX2lkIGZhaWxlZF9wcm9wID0gQkNNT0xUX0VSUl9GSUVMRF9OT05FOworCisgICAgaWYgKCFiY21vbHRfZGV2aWNlX2NmZ19kYXRhX2JvdW5kc19jaGVjaygmY2ZnLT5kYXRhLCBtc2ctPnByZXNlbmNlX21hc2ssICZmYWlsZWRfcHJvcCkpCisgICAgeworICAgICAgICBtc2ctPmVycl9maWVsZF9pZHggPSAodWludDE2X3QpZmFpbGVkX3Byb3A7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworI2lmbmRlZiBJTl9CQU5ECisgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoY2ZnLCBkZXZpY2UsIHN5c3RlbV9tb2RlKSkKKyAgICB7CisgICAgICAgIGlmIChzdGF0ZSAhPSBCQ01PTFRfREVWSUNFX1NUQVRFX0RJU0NPTk5FQ1RFRCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9tc2dfZXJyKAorICAgICAgICAgICAgICAgIG1zZywKKyAgICAgICAgICAgICAgICBERVZfTE9HX0lOVkFMSURfSUQsCisgICAgICAgICAgICAgICAgQkNNX0VSUl9TVEFURSwKKyAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9TWVNURU1fTU9ERSwKKyAgICAgICAgICAgICAgICAiU3lzdGVtIG1vZGUgY2FuIG9ubHkgYmUgY2hhbmdlZCB3aGlsZSBkaXNjb25uZWN0ZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHJjID0gZGV2X2N0cmxfcGFyYW1zLnN5c3RlbV9tb2RlX3ZhbGlkYXRlX2NiKGRldmljZSwgY2ZnLT5kYXRhLnN5c3RlbV9tb2RlKTsKKyAgICAgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBiY21vbHRfbXNnX2VycigKKyAgICAgICAgICAgICAgICBtc2csCisgICAgICAgICAgICAgICAgREVWX0xPR19JTlZBTElEX0lELAorICAgICAgICAgICAgICAgIHJjLAorICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1NZU1RFTV9NT0RFLAorICAgICAgICAgICAgICAgICJHaXZlbiBzeXN0ZW0gbW9kZSBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGJvYXJkIik7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGlmIChCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKGNmZywgZGV2aWNlLCBubmlfc3BlZWQpICYmIHN0YXRlICE9IEJDTU9MVF9ERVZJQ0VfU1RBVEVfRElTQ09OTkVDVEVEKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGJjbW9sdF9tc2dfZXJyKAorICAgICAgICAgICAgbXNnLAorICAgICAgICAgICAgREVWX0xPR19JTlZBTElEX0lELAorICAgICAgICAgICAgQkNNX0VSUl9TVEFURSwKKyAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX05OSV9TUEVFRCwKKyAgICAgICAgICAgICJOTkkgc3BlZWQgY2FuIG9ubHkgYmUgY2hhbmdlZCB3aGlsZSBkaXNjb25uZWN0ZWQiKTsKKyAgICB9CisKKyAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChjZmcsIGRldmljZSwgZGVidWcpICYmIHN0YXRlICE9IEJDTU9MVF9ERVZJQ0VfU1RBVEVfRElTQ09OTkVDVEVEKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGJjbW9sdF9tc2dfZXJyKAorICAgICAgICAgICAgbXNnLAorICAgICAgICAgICAgREVWX0xPR19JTlZBTElEX0lELAorICAgICAgICAgICAgQkNNX0VSUl9TVEFURSwKKyAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0RFQlVHLAorICAgICAgICAgICAgIkRlYnVnIHBhcmFtZXRlcnMgY2FuIG9ubHkgYmUgY2hhbmdlZCB3aGlsZSBkaXNjb25uZWN0ZWQiKTsKKyAgICB9CisKKyAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChjZmcsIGRldmljZSwgZmlybXdhcmVfc3dfdmVyc2lvbikgfHwKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX0lTX1NFVChjZmcsIGRldmljZSwgaG9zdF9zd192ZXJzaW9uKSB8fAorICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKGNmZywgZGV2aWNlLCBjaGlwX3JldmlzaW9uKXx8CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoY2ZnLCBkZXZpY2UsIHN0YXRlKXx8CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoY2ZnLCBkZXZpY2UsIGNoaXBfdGVtcGVyYXR1cmUpfHwKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX0lTX1NFVChjZmcsIGRldmljZSwgY2hpcF92b2x0YWdlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBiY21vbHRfbXNnX2VycigKKyAgICAgICAgICAgIG1zZywKKyAgICAgICAgICAgIERFVl9MT0dfSU5WQUxJRF9JRCwKKyAgICAgICAgICAgIEJDTV9FUlJfU1RBVEUsCisgICAgICAgICAgICBCQ01PTFRfRVJSX0ZJRUxEX05PTkUsCisgICAgICAgICAgICAiQ2Fubm90IHNldCByZWFkIG9ubHkgZmllbGRzIik7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBkZXZfY3RybF92YWxpZGF0ZV9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9tc2cgKm1zZykKK3sKKyAgICBiY21vbHRfZGV2aWNlX3N0YXRlIHN0YXRlID0gZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zLnN0YXRlOworICAgIGJjbW9sdF9kZXZpY2VfY2ZnICpjZmcgPSAoYmNtb2x0X2RldmljZV9jZmcgKiltc2c7CisKKyAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChjZmcsIGRldmljZSwgZmlybXdhcmVfc3dfdmVyc2lvbikgfHwKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX0lTX1NFVChjZmcsIGRldmljZSwgY2hpcF9yZXZpc2lvbikgfHwKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX0lTX1NFVChjZmcsIGRldmljZSwgY2hpcF90ZW1wZXJhdHVyZSl8fAorICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKGNmZywgZGV2aWNlLCBjaGlwX3ZvbHRhZ2UpIHx8CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoY2ZnLCBkZXZpY2UsIGVwb25fdG9kX3N0cmluZykpCisgICAgeworICAgICAgICBpZiAoIWRldl9jdHJsX2lzX2Nvbm5lY3RlZChzdGF0ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBiY21vbHRfbXNnX2VycigKKyAgICAgICAgICAgICAgICBtc2csCisgICAgICAgICAgICAgICAgREVWX0xPR19JTlZBTElEX0lELAorCQkJCUJDTV9FUlJfU1RBVEUsCisgICAgICAgICAgICAgICAgQkNNT0xUX0VSUl9GSUVMRF9OT05FLAorICAgICAgICAgICAgICAgICJDYW5ub3QgcmV0cmlldmUgcGFyYW1ldGVyIHdoaWxlIGRpc2Nvbm5lY3RlZC4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChjZmcsIGRldmljZSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZXh0X2lycSkpCisgICAgeworICAgICAgICBpZiAoIWRldl9jdHJsX2lzX2Nvbm5lY3RlZChzdGF0ZSkgJiYKKyAgICAgICAgICAgIChkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXNfcHJlc2VudCAmCisgICAgICAgICAgICBCQ01PTFRfUFJPUF9NQVNLX0dFVChkZXZpY2UsIF9jZmcsIHByb3RlY3Rpb25fc3dpdGNoaW5nX2V4dF9pcnEpKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYmNtb2x0X21zZ19lcnIoCisgICAgICAgICAgICAgICAgbXNnLAorICAgICAgICAgICAgICAgIERFVl9MT0dfSU5WQUxJRF9JRCwKKwkJCQlCQ01fRVJSX1NUQVRFLAorICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX0VYVF9JUlEsCisgICAgICAgICAgICAgICAgIkNhbm5vdCByZXRyaWV2ZSBwcm90ZWN0aW9uX3N3aXRjaGluZ19leHRfaXJxIHdoaWxlIGRpc2Nvbm5lY3RlZCBhbmQgbm90IGhhdmluZyBhIGNhY2hlLiIpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKGNmZywgZGV2aWNlLCBlcG9uX2Nsb2NrX3RyYW5zcG9ydF9zYW1wbGVfZGVsYXkpKQorICAgIHsKKyAgICAgICAgaWYgKCFkZXZfY3RybF9pc19jb25uZWN0ZWQoc3RhdGUpICYmCisgICAgICAgICAgICAoZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zX3ByZXNlbnQgJgorICAgICAgICAgICAgQkNNT0xUX1BST1BfTUFTS19HRVQoZGV2aWNlLCBfY2ZnLCBlcG9uX2Nsb2NrX3RyYW5zcG9ydF9zYW1wbGVfZGVsYXkpKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYmNtb2x0X21zZ19lcnIoCisgICAgICAgICAgICAgICAgbXNnLAorICAgICAgICAgICAgICAgIERFVl9MT0dfSU5WQUxJRF9JRCwKKwkJCQlCQ01fRVJSX1NUQVRFLAorICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VQT05fQ0xPQ0tfVFJBTlNQT1JUX1NBTVBMRV9ERUxBWSwKKyAgICAgICAgICAgICAgICAiQ2Fubm90IHJldHJpZXZlIGVwb25fY2xvY2tfdHJhbnNwb3J0X3NhbXBsZV9kZWxheSB3aGlsZSBkaXNjb25uZWN0ZWQgYW5kIG5vdCBoYXZpbmcgYSBjYWNoZS4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChjZmcsIGRldmljZSwgaW5kaWNhdGlvbl9zaGFwaW5nKSkKKyAgICB7CisgICAgICAgIGlmICghZGV2X2N0cmxfaXNfY29ubmVjdGVkKHN0YXRlKSAmJgorICAgICAgICAgICAgKGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtc19wcmVzZW50ICYgQkNNT0xUX1BST1BfTUFTS19HRVQoZGV2aWNlLCBfY2ZnLCBpbmRpY2F0aW9uX3NoYXBpbmcpKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYmNtb2x0X21zZ19lcnIoCisgICAgICAgICAgICAgICAgbXNnLAorICAgICAgICAgICAgICAgIERFVl9MT0dfSU5WQUxJRF9JRCwKKwkJCQlCQ01fRVJSX1NUQVRFLAorICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0lORElDQVRJT05fU0hBUElORywKKyAgICAgICAgICAgICAgICAiQ2Fubm90IHJldHJpZXZlIGluZGljYXRpb25fc2hhcGluZyB3aGlsZSBkaXNjb25uZWN0ZWQgYW5kIG5vdCBoYXZpbmcgYSBjYWNoZS4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChjZmcsIGRldmljZSwgZ3Bvbl94Z3Bvbl90b2RfZW5hYmxlKSkKKyAgICB7CisgICAgICAgIGlmICghZGV2X2N0cmxfaXNfY29ubmVjdGVkKHN0YXRlKSAmJgorICAgICAgICAgICAgKGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtc19wcmVzZW50ICYKKyAgICAgICAgICAgIEJDTU9MVF9QUk9QX01BU0tfR0VUKGRldmljZSwgX2NmZywgZ3Bvbl94Z3Bvbl90b2RfZW5hYmxlKSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9tc2dfZXJyKAorICAgICAgICAgICAgICAgIG1zZywKKyAgICAgICAgICAgICAgICBERVZfTE9HX0lOVkFMSURfSUQsCisJCQkJQkNNX0VSUl9TVEFURSwKKyAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9HUE9OX1hHUE9OX1RPRF9FTkFCTEUsCisgICAgICAgICAgICAgICAgIkNhbm5vdCByZXRyaWV2ZSBncG9uX3hncG9uX3RvZF9lbmFibGUgd2hpbGUgZGlzY29ubmVjdGVkIGFuZCBub3QgaGF2aW5nIGEgY2FjaGUuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoY2ZnLCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2dwaW9fcGluKSkKKyAgICB7CisgICAgICAgIGlmICghZGV2X2N0cmxfaXNfY29ubmVjdGVkKHN0YXRlKSAmJgorICAgICAgICAgICAgKGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtc19wcmVzZW50ICYKKyAgICAgICAgICAgIEJDTU9MVF9QUk9QX01BU0tfR0VUKGRldmljZSwgX2NmZywgZ3Bvbl94Z3Bvbl90b2RfZ3Bpb19waW4pKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYmNtb2x0X21zZ19lcnIoCisgICAgICAgICAgICAgICAgbXNnLAorICAgICAgICAgICAgICAgIERFVl9MT0dfSU5WQUxJRF9JRCwKKyAgICAgICAgICAgICAgICBCQ01fRVJSX1NUQVRFLAorICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX0dQSU9fUElOLAorICAgICAgICAgICAgICAgICJDYW5ub3QgcmV0cmlldmUgZ3Bvbl94Z3Bvbl90b2RfZ3Bpb19waW4gd2hpbGUgZGlzY29ubmVjdGVkIGFuZCBub3QgaGF2aW5nIGEgY2FjaGUuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoY2ZnLCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2Nvbm5lY3RlZF9pbnRlcm5hbGx5KSkKKyAgICB7CisgICAgICAgIGlmICghZGV2X2N0cmxfaXNfY29ubmVjdGVkKHN0YXRlKSAmJgorICAgICAgICAgICAgKGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtc19wcmVzZW50ICYKKyAgICAgICAgICAgIEJDTU9MVF9QUk9QX01BU0tfR0VUKGRldmljZSwgX2NmZywgZ3Bvbl94Z3Bvbl90b2RfY29ubmVjdGVkX2ludGVybmFsbHkpKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYmNtb2x0X21zZ19lcnIoCisgICAgICAgICAgICAgICAgbXNnLAorICAgICAgICAgICAgICAgIERFVl9MT0dfSU5WQUxJRF9JRCwKKwkJCQlCQ01fRVJSX1NUQVRFLAorICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX0NPTk5FQ1RFRF9JTlRFUk5BTExZLAorICAgICAgICAgICAgICAgICJDYW5ub3QgcmV0cmlldmUgZ3Bvbl94Z3Bvbl90b2RfY29ubmVjdGVkX2ludGVybmFsbHkgd2hpbGUgZGlzY29ubmVjdGVkIGFuZCBub3QgaGF2aW5nIGEgY2FjaGUuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoY2ZnLCBkZXZpY2UsIGVwb25fODAyMV9hc190b2RfZm9ybWF0KSkKKyAgICB7CisgICAgICAgIGlmICghZGV2X2N0cmxfaXNfY29ubmVjdGVkKHN0YXRlKSAmJgorICAgICAgICAgICAgKGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtc19wcmVzZW50ICYKKyAgICAgICAgICAgIEJDTU9MVF9QUk9QX01BU0tfR0VUKGRldmljZSwgX2NmZywgZXBvbl84MDIxX2FzX3RvZF9mb3JtYXQpKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYmNtb2x0X21zZ19lcnIoCisgICAgICAgICAgICAgICAgbXNnLAorICAgICAgICAgICAgICAgIERFVl9MT0dfSU5WQUxJRF9JRCwKKwkJCQlCQ01fRVJSX1NUQVRFLAorICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VQT05fODAyMV9BU19UT0RfRk9STUFULAorICAgICAgICAgICAgICAgICJDYW5ub3QgcmV0cmlldmUgZXBvbl84MDIxX2FzX3RvZF9mb3JtYXQgd2hpbGUgZGlzY29ubmVjdGVkIGFuZCBub3QgaGF2aW5nIGEgY2FjaGUuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoY2ZnLCBkZXZpY2UsIGVwb25fc2hhcGVyX21vZGUpKQorICAgIHsKKyAgICAgICAgaWYgKCFkZXZfY3RybF9pc19jb25uZWN0ZWQoc3RhdGUpICYmCisgICAgICAgICAgICAoZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zX3ByZXNlbnQgJgorICAgICAgICAgICAgQkNNT0xUX1BST1BfTUFTS19HRVQoZGV2aWNlLCBfY2ZnLCBlcG9uX3NoYXBlcl9tb2RlKSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9tc2dfZXJyKAorICAgICAgICAgICAgICAgIG1zZywKKyAgICAgICAgICAgICAgICBERVZfTE9HX0lOVkFMSURfSUQsCisJCQkJQkNNX0VSUl9TVEFURSwKKyAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9FUE9OX1NIQVBFUl9NT0RFLAorICAgICAgICAgICAgICAgICJDYW5ub3QgcmV0cmlldmUgZXBvbl9zaGFwZXJfbW9kZSB3aGlsZSBkaXNjb25uZWN0ZWQgYW5kIG5vdCBoYXZpbmcgYSBjYWNoZS4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChjZmcsIGRldmljZSwgZW1iZWRkZWRfaW1hZ2VfbGlzdCkpCisgICAgeworICAgICAgICBpZiAoIWRldl9jdHJsX2lzX2Nvbm5lY3RlZChzdGF0ZSkgJiYKKyAgICAgICAgICAgIChkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXNfcHJlc2VudCAmCisgICAgICAgICAgICBCQ01PTFRfUFJPUF9NQVNLX0dFVChkZXZpY2UsIF9jZmcsIGVtYmVkZGVkX2ltYWdlX2xpc3QpKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYmNtb2x0X21zZ19lcnIoCisgICAgICAgICAgICAgICAgbXNnLAorICAgICAgICAgICAgICAgIERFVl9MT0dfSU5WQUxJRF9JRCwKKwkJCQlCQ01fRVJSX1NUQVRFLAorICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VNQkVEREVEX0lNQUdFX0xJU1QsCisgICAgICAgICAgICAgICAgIkNhbm5vdCByZXRyaWV2ZSBlbWJlZGRlZF9pbWFnZV9saXN0IHdoaWxlIGRpc2Nvbm5lY3RlZCBhbmQgbm90IGhhdmluZyBhIGNhY2hlLiIpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKGNmZywgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9zdHJpbmdfbGVuZ3RoKSkKKyAgICB7CisgICAgCWlmICghZGV2X2N0cmxfaXNfY29ubmVjdGVkKHN0YXRlKSAmJgorCQkJKGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtc19wcmVzZW50ICYKKwkJCUJDTU9MVF9QUk9QX01BU0tfR0VUKGRldmljZSwgX2NmZywgZ3Bvbl94Z3Bvbl90b2Rfc3RyaW5nX2xlbmd0aCkpID09IDApCisgICAgCXsKKyAgICAJCXJldHVybiBiY21vbHRfbXNnX2VycigKKyAgICAJCQltc2csCisJCQkJREVWX0xPR19JTlZBTElEX0lELAorCQkJCUJDTV9FUlJfU1RBVEUsCisJCQkJQkNNT0xUX0RFVklDRV9DRkdfSURfR1BPTl9YR1BPTl9UT0RfU1RSSU5HX0xFTkdUSCwKKwkJCQkiQ2Fubm90IHJldHJpZXZlIGdwb25feGdwb25fdG9kX3N0cmluZ19sZW5ndGggd2hpbGUgZGlzY29ubmVjdGVkIGFuZCBub3QgaGF2aW5nIGEgY2FjaGUuIik7CisgICAgCX0KKyAgICB9CisgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoY2ZnLCBkZXZpY2UsIHRvZF91YXJ0X2JhdWRyYXRlKSkKKyAgICB7CisgICAgCWlmICghZGV2X2N0cmxfaXNfY29ubmVjdGVkKHN0YXRlKSAmJgorICAgIAkJKGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtc19wcmVzZW50ICYKKyAgICAJCUJDTU9MVF9QUk9QX01BU0tfR0VUKGRldmljZSwgX2NmZywgdG9kX3VhcnRfYmF1ZHJhdGUpKSA9PSAwKQorICAgIAl7CisgICAgCQlyZXR1cm4gYmNtb2x0X21zZ19lcnIoCisgICAgCQkJbXNnLAorCQkJCURFVl9MT0dfSU5WQUxJRF9JRCwKKwkJCQlCQ01fRVJSX1NUQVRFLAorCQkJCUJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1RPRF9VQVJUX0JBVURSQVRFLAorCQkJCSJDYW5ub3QgcmV0cmlldmUgdG9kX3VhcnRfYmF1ZHJhdGUgd2hpbGUgZGlzY29ubmVjdGVkIGFuZCBub3QgaGF2aW5nIGEgY2FjaGUuIik7CisgICAgCX0KKyAgICB9CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBkZXZfY3RybF92YWxpZGF0ZV9jZmdfY2xlYXIoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGlmIChkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuc3RhdGUgIT0gQkNNT0xUX0RFVklDRV9TVEFURV9ESVNDT05ORUNURUQpCisgICAgeworICAgICAgICByZXR1cm4gYmNtb2x0X21zZ19lcnIoCisgICAgICAgICAgICBtc2csCisgICAgICAgICAgICBERVZfTE9HX0lOVkFMSURfSUQsCisgICAgICAgICAgICBCQ01fRVJSX1NUQVRFLAorICAgICAgICAgICAgQkNNT0xUX0VSUl9GSUVMRF9OT05FLAorICAgICAgICAgICAgIkRldmljZSBjZmdfY2xlYXIgaXMgb25seSBhbGxvd2VkIHdoaWxlIGRpc2Nvbm5lY3RlZCIpOworICAgIH0KKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbV9kZXZfY3RybF92YWxpZGF0ZV9vcGVyX2Nvbm5lY3QoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGJjbW9sdF9kZXZpY2Vfc3RhdGUgc3RhdGUgPSBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuc3RhdGU7CisKKyAgICBpZiAoZGV2X2N0cmxfaXNfY29ubmVjdGVkKHN0YXRlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBiY21vbHRfbXNnX2Vycihtc2csIERFVl9MT0dfSU5WQUxJRF9JRCwgQkNNX0VSUl9BTFJFQURZLCBCQ01PTFRfRVJSX0ZJRUxEX05PTkUsICJhbHJlYWR5IGNvbm5lY3RlZCIpOworICAgIH0KKworICAgIC8qIElmIG5vdCBhbGwgbWFuZGF0b3J5IHByb3BlcnRpZXMgYXJlIHZhbGlkIHJldHVybiAibWFuZGF0b3J5IHBhcmFtZXRlciBpcyBtaXNzaW5nIiAqLworICAgIGlmIChkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuc3lzdGVtX21vZGUgPj0gQkNNT0xUX1NZU1RFTV9NT0RFX19OVU1fT0YpCisgICAgeworICAgICAgICBCQ01fTE9HKElORk8sIGRldl9jdHJsX2RiW2RldmljZV0ubG9nX2lkLCAiQ2Fubm90IGNvbm5lY3Q6IHN5c3RlbSBtb2RlIG5vdCBpbmNsdWRlZFxuIik7CisgICAgICAgIHJldHVybiBiY21vbHRfbXNnX2VycigKKyAgICAgICAgICAgIG1zZywKKyAgICAgICAgICAgIERFVl9MT0dfSU5WQUxJRF9JRCwKKyAgICAgICAgICAgIEJDTV9FUlJfTUFOREFUT1JZX1BBUk1fSVNfTUlTU0lORywKKyAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1NZU1RFTV9NT0RFLAorICAgICAgICAgICAgIlN5c3RlbSBtb2RlIG11c3QgYmUgc2V0IGJlZm9yZSBjb25uZWN0aW5nIik7CisgICAgfQorI2lmZGVmIElOX0JBTkQKKyAgICAvKiBGb3IgSW4gQmFuZCBNYW5hZ2VtZW50IElQIEFkZHJlc3MgYW5kIFVEUCBwb3J0IG11c3QgYmUgc2V0IHByaW9yIHRvIGNvbm5lY3RpbmcqLworICAgIC8qIElmIG5vdCBhbGwgbWFuZGF0b3J5IHByb3BlcnRpZXMgYXJlIHZhbGlkIHJldHVybiAibWFuZGF0b3J5IHBhcmFtZXRlciBpcyBtaXNzaW5nIiAqLworICAgIGlmIChkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuZGV2aWNlX2lwX2FkZHJlc3MudTMyID09IDApCisgICAgeworICAgICAgICBCQ01fTE9HKElORk8sIGRldl9jdHJsX2RiW2RldmljZV0ubG9nX2lkLCAiQ2Fubm90IGNvbm5lY3Q6IG11c3Qgc2V0IElQIEFkZHJlc3MgcG9ydFxuIik7CisgICAgICAgIHJldHVybiBiY21vbHRfbXNnX2VycigKKyAgICAgICAgICAgIG1zZywKKyAgICAgICAgICAgIERFVl9MT0dfSU5WQUxJRF9JRCwKKyAgICAgICAgICAgIEJDTV9FUlJfTUFOREFUT1JZX1BBUk1fSVNfTUlTU0lORywKKyAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0RFVklDRV9JUF9BRERSRVNTLAorICAgICAgICAgICAgIkRldmljZSBJUCBBZGRyZXNzIG11c3QgYmUgc2V0IGJlZm9yZSBjb25uZWN0aW5nIik7CisgICAgfQorICAgIGlmIChkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuZGV2aWNlX3VkcF9wb3J0ID09IDApCisgICAgeworICAgICAgICBCQ01fTE9HKElORk8sIGRldl9jdHJsX2RiW2RldmljZV0ubG9nX2lkLCAiQ2Fubm90IGNvbm5lY3Q6IG11c3Qgc2V0IElQIEFkZHJlc3MgVURQIHBvcnRcbiIpOworICAgICAgICByZXR1cm4gYmNtb2x0X21zZ19lcnIoCisgICAgICAgICAgICBtc2csCisgICAgICAgICAgICBERVZfTE9HX0lOVkFMSURfSUQsCisgICAgICAgICAgICBCQ01fRVJSX01BTkRBVE9SWV9QQVJNX0lTX01JU1NJTkcsCisgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9ERVZJQ0VfVURQX1BPUlQsCisgICAgICAgICAgICAiVURQIHBvcnQgbXVzdCBiZSBzZXQgYmVmb3JlIGNvbm5lY3RpbmciKTsKKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtX2Rldl9jdHJsX3ZhbGlkYXRlX29wZXJfZGlzY29ubmVjdChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfbXNnICptc2cpCit7CisgICAgYmNtb2x0X2RldmljZV9zdGF0ZSBzdGF0ZSA9IGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtcy5zdGF0ZTsKKyAgICBpZiAoc3RhdGUgPT0gQkNNT0xUX0RFVklDRV9TVEFURV9ESVNDT05ORUNURUQpCisgICAgeworICAgICAgICByZXR1cm4gYmNtb2x0X21zZ19lcnIobXNnLCBERVZfTE9HX0lOVkFMSURfSUQsIEJDTV9FUlJfQUxSRUFEWSwgQkNNT0xUX0VSUl9GSUVMRF9OT05FLCAiYWxyZWFkeSBkaXNjb25uZWN0ZWQiKTsKKyAgICB9CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21fZGV2X2N0cmxfdmFsaWRhdGVfb3Blcl9ydW5fZGRyX3Rlc3QoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0ICpkZHJfdGVzdCA9IChiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdCopbXNnOworICAgIGJjbW9zX2Jvb2wgaXNfc3RhbmRhbG9uZTsKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIGlmIChCQ01PTFRfREVWSUNFX1NUQVRFX0RJU0NPTk5FQ1RFRCAhPSBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuc3RhdGUpCisgICAgeworICAgICAgICByZXR1cm4gYmNtb2x0X21zZ19lcnIoCisgICAgICAgICAgICBtc2csCisgICAgICAgICAgICBERVZfTE9HX0lOVkFMSURfSUQsCisgICAgICAgICAgICBCQ01fRVJSX1NUQVRFLAorICAgICAgICAgICAgQkNNT0xUX0VSUl9GSUVMRF9OT05FLAorICAgICAgICAgICAgIkREUiB0ZXN0IGNhbiBvbmx5IGJlIHJ1biB3aGVuIGRpc2Nvbm5lY3RlZCIpOworICAgIH0KKworICAgIGlmIChkZXZfY3RybF9kYltkZXZpY2VdLmlzX2hvc3RfcmVzZXRfcGVuZGluZykKKyAgICB7CisgICAgICAgIHJldHVybiBiY21vbHRfbXNnX2VycigKKyAgICAgICAgICAgIG1zZywKKyAgICAgICAgICAgIERFVl9MT0dfSU5WQUxJRF9JRCwKKyAgICAgICAgICAgIEJDTV9FUlJfU1RBVEUsCisgICAgICAgICAgICBCQ01PTFRfRVJSX0ZJRUxEX05PTkUsCisgICAgICAgICAgICAiQ2Fubm90IHJ1biBERFIgdGVzdCB3aGlsZSBob3N0IHJlc2V0IGlzIHBlbmRpbmciKTsKKyAgICB9CisKKyAgICAvKiBDaGVjayBpZiB0aGUgY2hpcCBpcyBydW5uaW5nIGluIHN0YW5kYWxvbmUgbW9kZSAqLworICAgIHJjID0gZGV2X2N0cmxfcGFyYW1zLmRldmljZV9pc19ydW5uaW5nX2NiKGRldmljZSwgJmlzX3N0YW5kYWxvbmUpOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgZGV2X2N0cmxfZGJbZGV2aWNlXS5sb2dfaWQsICJkZXZpY2VfaXNfcnVubmluZ19jYiByZXR1cm5lZCBlcnJvcjogJXMgKCVkKVxuIiwgYmNtb3Nfc3RyZXJyb3IocmMpLCByYyk7CisgICAgICAgIHJldHVybiBiY21vbHRfbXNnX2VycigKKyAgICAgICAgICAgIG1zZywKKyAgICAgICAgICAgIERFVl9MT0dfSU5WQUxJRF9JRCwKKyAgICAgICAgICAgIHJjLAorICAgICAgICAgICAgQkNNT0xUX0VSUl9GSUVMRF9OT05FLAorICAgICAgICAgICAgIkZhaWxlZCB0byByZXRyaWV2ZSBkZXZpY2Ugc3RhdHVzIik7CisgICAgfQorICAgIGlmIChpc19zdGFuZGFsb25lKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGJjbW9sdF9tc2dfZXJyKAorICAgICAgICAgICAgbXNnLAorICAgICAgICAgICAgREVWX0xPR19JTlZBTElEX0lELAorICAgICAgICAgICAgQkNNX0VSUl9TVEFURSwKKyAgICAgICAgICAgIEJDTU9MVF9FUlJfRklFTERfTk9ORSwKKyAgICAgICAgICAgICJDYW5ub3QgcnVuIEREUiB0ZXN0IHdoaWxlIGRldmljZSBpcyBydW5uaW5nIik7CisgICAgfQorCisgICAgaWYgKCFkZHJfdGVzdC0+ZGF0YS5jcHUgJiYgIWRkcl90ZXN0LT5kYXRhLnJhc18wICYmICFkZHJfdGVzdC0+ZGF0YS5yYXNfMSkKKyAgICB7CisgICAgICAgIHJldHVybiBiY21vbHRfbXNnX2VycigKKyAgICAgICAgICAgIG1zZywKKyAgICAgICAgICAgIERFVl9MT0dfSU5WQUxJRF9JRCwKKyAgICAgICAgICAgIEJDTV9FUlJfU1RBVEUsCisgICAgICAgICAgICBCQ01PTFRfRVJSX0ZJRUxEX05PTkUsCisgICAgICAgICAgICAiTXVzdCByZXF1ZXN0IGF0IGxlYXN0IG9uZSBERFIgVGVzdCIpOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gZGV2X2N0cmxfdmFsaWRhdGVfb3BlcmF0aW9uKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9tc2cgKm1zZykKK3sKKyAgICBiY21vbHRfZGV2aWNlX3N0YXRlIHN0YXRlID0gZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zLnN0YXRlOworICAgIGlmIChzdGF0ZSA9PSBCQ01PTFRfREVWSUNFX1NUQVRFX0NPTk5FQ1RJTkcpCisgICAgeworICAgICAgICByZXR1cm4gYmNtb2x0X21zZ19lcnIoCisgICAgICAgICAgICBtc2csCisgICAgICAgICAgICBERVZfTE9HX0lOVkFMSURfSUQsCisgICAgICAgICAgICBCQ01fRVJSX1NUQVRFLAorICAgICAgICAgICAgQkNNT0xUX0VSUl9GSUVMRF9OT05FLAorICAgICAgICAgICAgIkRldmljZSBvcGVyYXRpb25zIGFyZSBub3QgYWxsb3dlZCB3aGlsZSBjb25uZWN0aW5nIik7CisgICAgfQorICAgIGlmIChzdGF0ZSA9PSBCQ01PTFRfREVWSUNFX1NUQVRFX1RFU1RJTkdfRERSKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGJjbW9sdF9tc2dfZXJyKAorICAgICAgICAgICAgbXNnLAorICAgICAgICAgICAgREVWX0xPR19JTlZBTElEX0lELAorICAgICAgICAgICAgQkNNX0VSUl9TVEFURSwKKyAgICAgICAgICAgIEJDTU9MVF9FUlJfRklFTERfTk9ORSwKKyAgICAgICAgICAgICJEZXZpY2Ugb3BlcmF0aW9ucyBhcmUgbm90IGFsbG93ZWQgd2hpbGUgRERSIHRlc3QgaXMgaW4gcHJvZ3Jlc3MiKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1zZy0+c3ViZ3JvdXApCisgICAgeworICAgIGNhc2UgQkNNT0xUX0RFVklDRV9PUEVSX0lEX0NPTk5FQ1Q6CisgICAgICAgIHJldHVybiBiY21fZGV2X2N0cmxfdmFsaWRhdGVfb3Blcl9jb25uZWN0KGRldmljZSwgbXNnKTsKKyAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9ESVNDT05ORUNUOgorICAgICAgICByZXR1cm4gYmNtX2Rldl9jdHJsX3ZhbGlkYXRlX29wZXJfZGlzY29ubmVjdChkZXZpY2UsIG1zZyk7CisgICAgY2FzZSBCQ01PTFRfREVWSUNFX09QRVJfSURfUlVOX0REUl9URVNUOgorICAgICAgICByZXR1cm4gYmNtX2Rldl9jdHJsX3ZhbGlkYXRlX29wZXJfcnVuX2Rkcl90ZXN0KGRldmljZSwgbXNnKTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBkZXZfY3RybF92YWxpZGF0ZV9tc2coYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGlmIChkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuc3RhdGUgPT0gQkNNT0xUX0RFVklDRV9TVEFURV9XQUlUSU5HX0ZPUl9ERVZJQ0UpCisgICAgeworICAgICAgICByZXR1cm4gYmNtb2x0X21zZ19lcnIoCisgICAgICAgICAgICBtc2csCisgICAgICAgICAgICBERVZfTE9HX0lOVkFMSURfSUQsCisgICAgICAgICAgICBCQ01fRVJSX1NUQVRFLAorICAgICAgICAgICAgQkNNT0xUX0VSUl9GSUVMRF9OT05FLAorICAgICAgICAgICAgIlRoZSBkZXZpY2Ugb2JqZWN0IGlzIGJ1c3kgcHJvY2Vzc2luZyBhbm90aGVyIEFQSSByZXF1ZXN0Iik7CisgICAgfQorCisgICAgaWYgKG1zZy0+Z3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9DRkcpCisgICAgeworICAgICAgICBzd2l0Y2ggKG1zZy0+dHlwZSkKKyAgICAgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgIHJldHVybiBkZXZfY3RybF92YWxpZGF0ZV9jZmdfY2xlYXIoZGV2aWNlLCBtc2cpOworICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICByZXR1cm4gZGV2X2N0cmxfdmFsaWRhdGVfY2ZnX3NldChkZXZpY2UsIG1zZyk7CisgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgIHJldHVybiBkZXZfY3RybF92YWxpZGF0ZV9jZmdfZ2V0KGRldmljZSwgbXNnKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1zZy0+Z3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9PUEVSICYmIG1zZy0+dHlwZSA9PSBCQ01PTFRfTVNHX1RZUEVfU0VUKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRldl9jdHJsX3ZhbGlkYXRlX29wZXJhdGlvbihkZXZpY2UsIG1zZyk7CisgICAgfQorCisgICAgcmV0dXJuIGJjbW9sdF9tc2dfZXJyKAorICAgICAgICBtc2csCisgICAgICAgIERFVl9MT0dfSU5WQUxJRF9JRCwKKyAgICAgICAgQkNNX0VSUl9JTlRFUk5BTCwKKyAgICAgICAgQkNNT0xUX0VSUl9GSUVMRF9OT05FLAorICAgICAgICAiSW52YWxpZCBtZXNzYWdlIGZvciBkZXZpY2UgY29udHJvbCIpOworfQorCitzdGF0aWMgYmNtb2x0X3ByZXNlbmNlX21hc2sgZGV2X2N0cmxfZmlsbF9mcm9tX2xvY2FsKGJjbW9sdF9kZXZpZCBkZXZpY2UpCit7CisgICAgYmNtb2x0X2RldmljZV9jZmcgKmNmZyA9IChiY21vbHRfZGV2aWNlX2NmZyAqKWRldl9jdHJsX2RiW2RldmljZV0ubGFzdF9tZXNzYWdlOworICAgIGJjbW9sdF9wcmVzZW5jZV9tYXNrIG1hc2sgPSBkZXZfY3RybF9kYltkZXZpY2VdLmxhc3RfbWVzc2FnZS0+cHJlc2VuY2VfbWFzazsKKworICAgIGlmIChCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKGNmZywgZGV2aWNlLCBzeXN0ZW1fbW9kZSkpCisgICAgeworICAgICAgICBjZmctPmRhdGEuc3lzdGVtX21vZGUgPSBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuc3lzdGVtX21vZGU7CisgICAgICAgIG1hc2sgJj0gfkJDTU9MVF9QUk9QX01BU0tfR0VUKGRldmljZSwgX2NmZywgc3lzdGVtX21vZGUpOworICAgIH0KKworICAgIGlmIChCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKGNmZywgZGV2aWNlLCBrZWVwYWxpdmVfaW50ZXJ2YWwpKQorICAgIHsKKyAgICAgICAgY2ZnLT5kYXRhLmtlZXBhbGl2ZV9pbnRlcnZhbCA9IGRldl9jdHJsX2RiW2RldmljZV0ua2FfaW5mby5rYV9pbnRlcnZhbCAvIEJDTU9TX01JQ1JPU0VDT05EU19JTl9TRUNPTkRTOworICAgICAgICBtYXNrICY9IH5CQ01PTFRfUFJPUF9NQVNLX0dFVChkZXZpY2UsIF9jZmcsIGtlZXBhbGl2ZV9pbnRlcnZhbCk7CisgICAgfQorCisgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoY2ZnLCBkZXZpY2UsIGtlZXBhbGl2ZV90b2xlcmFuY2UpKQorICAgIHsKKyAgICAgICAgY2ZnLT5kYXRhLmtlZXBhbGl2ZV90b2xlcmFuY2UgPSBkZXZfY3RybF9kYltkZXZpY2VdLmthX2luZm8ua2FfdG9sZXJhbmNlOworICAgICAgICBtYXNrICY9IH5CQ01PTFRfUFJPUF9NQVNLX0dFVChkZXZpY2UsIF9jZmcsIGtlZXBhbGl2ZV90b2xlcmFuY2UpOworICAgIH0KKworICAgIGlmIChCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKGNmZywgZGV2aWNlLCBob3N0X3N3X3ZlcnNpb24pKQorICAgIHsKKyAgICAgICAgY2ZnLT5kYXRhLmhvc3Rfc3dfdmVyc2lvbi5tYWpvciA9IEJDTU9MVF9IT1NUX01BSk9SX1ZFUjsKKyAgICAgICAgY2ZnLT5kYXRhLmhvc3Rfc3dfdmVyc2lvbi5taW5vciA9IEJDTU9MVF9IT1NUX01JTk9SX1ZFUjsKKyAgICAgICAgY2ZnLT5kYXRhLmhvc3Rfc3dfdmVyc2lvbi5yZXZpc2lvbiA9IEJDTU9MVF9IT1NUX1JFVklTSU9OX1ZFUjsKKyAgICAgICAgY2ZnLT5kYXRhLmhvc3Rfc3dfdmVyc2lvbi5tb2RlbCA9IEJDTU9MVF9NT0RFTF9SRVZJU0lPTjsKKyAgICAgICAgc25wcmludGYoCisgICAgICAgICAgICBjZmctPmRhdGEuaG9zdF9zd192ZXJzaW9uLmJ1aWxkX3RpbWUsCisgICAgICAgICAgICBzaXplb2YoY2ZnLT5kYXRhLmhvc3Rfc3dfdmVyc2lvbi5idWlsZF90aW1lKSwKKyAgICAgICAgICAgICIlcyAlcyIsCisgICAgICAgICAgICBfX0RBVEVfXywKKyAgICAgICAgICAgIF9fVElNRV9fKTsKKyAgICAgICAgbWFzayAmPSB+QkNNT0xUX1BST1BfTUFTS19HRVQoZGV2aWNlLCBfY2ZnLCBob3N0X3N3X3ZlcnNpb24pOworICAgIH0KKworICAgIGlmIChCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKGNmZywgZGV2aWNlLCBzdGF0ZSkpCisgICAgeworICAgICAgICBjZmctPmRhdGEuc3RhdGUgPSBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuc3RhdGU7CisgICAgICAgIG1hc2sgJj0gfkJDTU9MVF9QUk9QX01BU0tfR0VUKGRldmljZSwgX2NmZywgc3RhdGUpOworICAgIH0KKworICAgIGlmIChCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKGNmZywgZGV2aWNlLCBkZWJ1ZykpCisgICAgeworICAgICAgICBjZmctPmRhdGEuZGVidWcgPSBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuZGVidWc7CisgICAgICAgIG1hc2sgJj0gfkJDTU9MVF9QUk9QX01BU0tfR0VUKGRldmljZSwgX2NmZywgZGVidWcpOworICAgIH0KKworICAgIGlmIChCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKGNmZywgZGV2aWNlLCBubmlfc3BlZWQpKQorICAgIHsKKyAgICAgICAgY2ZnLT5kYXRhLm5uaV9zcGVlZCA9IGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtcy5ubmlfc3BlZWQ7CisgICAgICAgIG1hc2sgJj0gfkJDTU9MVF9QUk9QX01BU0tfR0VUKGRldmljZSwgX2NmZywgbm5pX3NwZWVkKTsKKyAgICB9CisKKyAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChjZmcsIGRldmljZSwgeGdwb25fbnVtX29mX29udXMpKQorICAgIHsKKyAgICAJY2ZnLT5kYXRhLnhncG9uX251bV9vZl9vbnVzID0gZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zLnhncG9uX251bV9vZl9vbnVzOworICAgIAltYXNrICY9IH5CQ01PTFRfUFJPUF9NQVNLX0dFVChkZXZpY2UsIF9jZmcsIHhncG9uX251bV9vZl9vbnVzKTsKKyAgICB9CisKKyAgICByZXR1cm4gbWFzazsKK30KKworc3RhdGljIHZvaWQgZGV2X2N0cmxfdXBkYXRlX2xvY2FsX2NvbmZpZ3VyYXRpb24oYmNtb2x0X2RldmlkIGRldmljZSwgY29uc3QgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGNvbnN0IGJjbW9sdF9kZXZpY2VfY2ZnICpjZmcgPSAoY29uc3QgYmNtb2x0X2RldmljZV9jZmcgKiltc2c7CisKKyAgICBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXNfcHJlc2VudCB8PSBtc2ctPnByZXNlbmNlX21hc2s7CisKKyAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChjZmcsIGRldmljZSwgc3lzdGVtX21vZGUpKQorICAgIHsKKyAgICAgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zLnN5c3RlbV9tb2RlID0gY2ZnLT5kYXRhLnN5c3RlbV9tb2RlOworICAgIH0KKyAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChjZmcsIGRldmljZSwgZGVidWcpKQorICAgIHsKKyAgICAgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zLmRlYnVnID0gY2ZnLT5kYXRhLmRlYnVnOworICAgIH0KKyAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChjZmcsIGRldmljZSwgbm5pX3NwZWVkKSkKKyAgICB7CisgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtcy5ubmlfc3BlZWQgPSBjZmctPmRhdGEubm5pX3NwZWVkOworICAgIH0KKyAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChjZmcsIGRldmljZSwga2VlcGFsaXZlX2ludGVydmFsKSkKKyAgICB7CisgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0ua2FfaW5mby5rYV9pbnRlcnZhbCA9IChjZmctPmRhdGEua2VlcGFsaXZlX2ludGVydmFsICogQkNNT1NfTUlDUk9TRUNPTkRTX0lOX1NFQ09ORFMpOworICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMua2VlcGFsaXZlX2ludGVydmFsID0gY2ZnLT5kYXRhLmtlZXBhbGl2ZV9pbnRlcnZhbDsKKyAgICB9CisgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoY2ZnLCBkZXZpY2UsIGtlZXBhbGl2ZV90b2xlcmFuY2UpKQorICAgIHsKKyAgICAgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5rYV9pbmZvLmthX3RvbGVyYW5jZSA9IGNmZy0+ZGF0YS5rZWVwYWxpdmVfdG9sZXJhbmNlOworICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMua2VlcGFsaXZlX3RvbGVyYW5jZSA9IGNmZy0+ZGF0YS5rZWVwYWxpdmVfdG9sZXJhbmNlOworICAgIH0KKyAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChjZmcsIGRldmljZSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZXh0X2lycSkpCisgICAgeworICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMucHJvdGVjdGlvbl9zd2l0Y2hpbmdfZXh0X2lycSA9IGNmZy0+ZGF0YS5wcm90ZWN0aW9uX3N3aXRjaGluZ19leHRfaXJxOworICAgIH0KKyAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChjZmcsIGRldmljZSwgZXBvbl9jbG9ja190cmFuc3BvcnRfc2FtcGxlX2RlbGF5KSkKKyAgICB7CisgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtcy5lcG9uX2Nsb2NrX3RyYW5zcG9ydF9zYW1wbGVfZGVsYXkgPQorICAgICAgICAgICAgY2ZnLT5kYXRhLmVwb25fY2xvY2tfdHJhbnNwb3J0X3NhbXBsZV9kZWxheTsKKyAgICB9CisgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoY2ZnLCBkZXZpY2UsIGluZGljYXRpb25fc2hhcGluZykpCisgICAgeworICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuaW5kaWNhdGlvbl9zaGFwaW5nID0gY2ZnLT5kYXRhLmluZGljYXRpb25fc2hhcGluZzsKKyAgICB9CisgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoY2ZnLCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2VuYWJsZSkpCisgICAgeworICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuZ3Bvbl94Z3Bvbl90b2RfZW5hYmxlID0gY2ZnLT5kYXRhLmdwb25feGdwb25fdG9kX2VuYWJsZTsKKyAgICB9CisgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoY2ZnLCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2dwaW9fcGluKSkKKyAgICB7CisgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtcy5ncG9uX3hncG9uX3RvZF9ncGlvX3BpbiA9IGNmZy0+ZGF0YS5ncG9uX3hncG9uX3RvZF9ncGlvX3BpbjsKKyAgICB9CisgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoY2ZnLCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2Nvbm5lY3RlZF9pbnRlcm5hbGx5KSkKKyAgICB7CisgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtcy5ncG9uX3hncG9uX3RvZF9jb25uZWN0ZWRfaW50ZXJuYWxseSA9IGNmZy0+ZGF0YS5ncG9uX3hncG9uX3RvZF9jb25uZWN0ZWRfaW50ZXJuYWxseTsKKyAgICB9CisgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoY2ZnLCBkZXZpY2UsIGVwb25fc2hhcGVyX21vZGUpKQorICAgIHsKKyAgICAgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zLmVwb25fc2hhcGVyX21vZGUgPSBjZmctPmRhdGEuZXBvbl9zaGFwZXJfbW9kZTsKKyAgICB9CisgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoY2ZnLCBkZXZpY2UsIGVtYmVkZGVkX2ltYWdlX2xpc3QpKQorICAgIHsKKyAgICAgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zLmVtYmVkZGVkX2ltYWdlX2xpc3QgPSBjZmctPmRhdGEuZW1iZWRkZWRfaW1hZ2VfbGlzdDsKKyAgICB9CisgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoY2ZnLCBkZXZpY2UsIHhncG9uX251bV9vZl9vbnVzKSkKKyAgICB7CisgICAgCWRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtcy54Z3Bvbl9udW1fb2Zfb251cyA9IGNmZy0+ZGF0YS54Z3Bvbl9udW1fb2Zfb251czsKKyAgICB9CisgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoY2ZnLCBkZXZpY2UsIGRldmljZV9pcF9hZGRyZXNzKSkKKyAgICB7CisgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtcy5kZXZpY2VfaXBfYWRkcmVzcyA9IGNmZy0+ZGF0YS5kZXZpY2VfaXBfYWRkcmVzczsKKyAgICB9CisgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoY2ZnLCBkZXZpY2UsIGRldmljZV91ZHBfcG9ydCkpCisgICAgeworICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuZGV2aWNlX3VkcF9wb3J0ID0gY2ZnLT5kYXRhLmRldmljZV91ZHBfcG9ydDsKKyAgICB9CisgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoY2ZnLCBkZXZpY2UsIGdwb25feGdwb25fdG9kX3N0cmluZ19sZW5ndGgpKQorICAgIHsKKyAgICAJZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zLmdwb25feGdwb25fdG9kX3N0cmluZ19sZW5ndGggPSBjZmctPmRhdGEuZ3Bvbl94Z3Bvbl90b2Rfc3RyaW5nX2xlbmd0aDsKKyAgICB9CisgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoY2ZnLCBkZXZpY2UsIHRvZF91YXJ0X2JhdWRyYXRlKSkKKyAgICB7CisgICAgCWRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtcy50b2RfdWFydF9iYXVkcmF0ZSA9IGNmZy0+ZGF0YS50b2RfdWFydF9iYXVkcmF0ZTsKKyAgICB9Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBkZXZfY3RybF92YWxpZGF0ZV9md192ZXJzaW9uKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGNvbnN0IGJjbW9sdF9maXJtd2FyZV9zd192ZXJzaW9uICp2ZXJzaW9uKQoreworICAgIEJDTV9MT0coSU5GTywgZGV2X2N0cmxfZGJbZGV2aWNlXS5sb2dfaWQsCisgICAgICAgICJGaXJtd2FyZSBTVyB2ZXJzaW9uICV1LiV1LiV1IChPYmplY3QgbW9kZWwgcmV2aXNpb24gJXUsIEJ1aWxkIHRpbWU6ICVzKVxuIiwKKyAgICAgICAgdmVyc2lvbi0+bWFqb3IsCisgICAgICAgIHZlcnNpb24tPm1pbm9yLAorICAgICAgICB2ZXJzaW9uLT5yZXZpc2lvbiwKKyAgICAgICAgdmVyc2lvbi0+bW9kZWwsCisgICAgICAgIHZlcnNpb24tPmJ1aWxkX3RpbWUpOworCisgICAgQkNNX0xPRyhJTkZPLCBkZXZfY3RybF9kYltkZXZpY2VdLmxvZ19pZCwKKyAgICAgICAgIkhvc3QgU1cgdmVyc2lvbiAldS4ldS4ldSAoT2JqZWN0IG1vZGVsIHJldmlzaW9uICV1LCBCdWlsZCB0aW1lOiAlcyAlcylcbiIsCisgICAgICAgIEJDTU9MVF9IT1NUX01BSk9SX1ZFUiwKKyAgICAgICAgQkNNT0xUX0hPU1RfTUlOT1JfVkVSLAorICAgICAgICBCQ01PTFRfSE9TVF9SRVZJU0lPTl9WRVIsCisgICAgICAgIEJDTU9MVF9NT0RFTF9SRVZJU0lPTiwKKyAgICAgICAgX19EQVRFX18sCisgICAgICAgIF9fVElNRV9fKTsKKworICAgIC8qIFZlcnNpb24gbWlzbWF0Y2ggLSBub3RlIHRoYXQgb25seSB0aGUgSG9zdC9GaXJtd2FyZSByZXZpc2lvbnMgY2FuIGJlIGRpZmZlcmVudCBiZXR3ZWVuIHRoZSBob3N0IGFuZCB0aGUgZmlybXdhcmUgKi8KKyAgICBpZiAodmVyc2lvbi0+bWFqb3IgIT0gQkNNT0xUX0hPU1RfTUFKT1JfVkVSIHx8CisgICAgICAgIHZlcnNpb24tPm1pbm9yICE9IEJDTU9MVF9IT1NUX01JTk9SX1ZFUiB8fAorICAgICAgICB2ZXJzaW9uLT5tb2RlbCAhPSBCQ01PTFRfTU9ERUxfUkVWSVNJT04pCisgICAgeworICAgICAgICBCQ01fTE9HKElORk8sIGRldl9jdHJsX2RiW2RldmljZV0ubG9nX2lkLAorICAgICAgICAgICAgIlNXIFZlcnNpb25zIE1pc21hdGNoOiBIb3N0IFNXIHZlcnNpb24gaXMgJXUuJXUuJXUgd2l0aCBvYmplY3QgbW9kZWwgcmV2aXNpb24gJWQsIHdoaWxlIEZpcm13YXJlIFNXIHZlcnNpb24gaXMgJXUuJXUuJXUgd2l0aCBvYmplY3QgbW9kZWwgcmV2aXNpb24gJXVcbiIsCisgICAgICAgICAgICBCQ01PTFRfSE9TVF9NQUpPUl9WRVIsCisgICAgICAgICAgICBCQ01PTFRfSE9TVF9NSU5PUl9WRVIsCisgICAgICAgICAgICBCQ01PTFRfSE9TVF9SRVZJU0lPTl9WRVIsCisgICAgICAgICAgICBCQ01PTFRfTU9ERUxfUkVWSVNJT04sCisgICAgICAgICAgICB2ZXJzaW9uLT5tYWpvciwKKyAgICAgICAgICAgIHZlcnNpb24tPm1pbm9yLAorICAgICAgICAgICAgdmVyc2lvbi0+cmV2aXNpb24sCisgICAgICAgICAgICB2ZXJzaW9uLT5tb2RlbCk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1NUQVRFOworICAgIH0KKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworI2lmbmRlZiBJTl9CQU5ECitzdGF0aWMgYmNtb3NfZXJybm8gZGV2X2N0cmxfcmVnaXN0ZXJfZmxkKGJjbW9sdF9kZXZpZCBkZXZpY2UpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgYmNtX2xsX2Rldl9pbmZvIGxsX2luZm87CisKKyAgICBpZiAoZGV2X2N0cmxfZGJbZGV2aWNlXS5mbGRfaW5mby5zb2Nfc3JhbV9iYXNlID4gMCkKKyAgICB7CisgICAgICAgIC8qIHdlIGhhdmUgYWxyZWFkeSBxdWVyaWVkIHRoZSBQQ0llIC8gcmVnaXN0ZXJlZCB3aXRoIHRoZSBGTEQgKi8KKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgcmMgPSBiY21fbGxfcGNpZV9xdWVyeShkZXZpY2UsICZsbF9pbmZvKTsKKyAgICBCQ01fREVWX0NUUkxfUkVUVVJOX09OX0VSUk9SKGRldmljZSwgcmMsICJiY21fbGxfcGNpZV9xdWVyeVxuIik7CisgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5mbGRfaW5mby5zb2NfZGRyX2xlbmd0aCA9IGxsX2luZm8uc29jX2Rkcl9sZW5ndGg7CisgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5mbGRfaW5mby5zb2Nfc3JhbV9iYXNlID0gbGxfaW5mby5zb2Nfc3JhbV9iYXNlOworICAgIGRldl9jdHJsX2RiW2RldmljZV0uZmxkX2luZm8uc29jX2Rkcl9iYXNlID0gbGxfaW5mby5zb2NfZGRyX2Jhc2U7CisgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5mbGRfaW5mby5zb2NfcmVnc19iYXNlID0gbGxfaW5mby5zb2NfcmVnc19iYXNlOworCisgICAgQkNNX0xPRyhJTkZPLCBkZXZfY3RybF9kYltkZXZpY2VdLmxvZ19pZCwKKyAgICAgICAgIkZMRF9JTkZPOiBkZHJfbGVuZ3RoPTB4JXggc3JhbV9iYXNlPSVwIHNvY19kZHJfYmFzZT0lcCBzb2NfcmVnc19iYXNlPSVwXG4iLAorICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmZsZF9pbmZvLnNvY19kZHJfbGVuZ3RoLAorICAgICAgICAodm9pZCAqKWRldl9jdHJsX2RiW2RldmljZV0uZmxkX2luZm8uc29jX3NyYW1fYmFzZSwKKyAgICAgICAgKHZvaWQgKilkZXZfY3RybF9kYltkZXZpY2VdLmZsZF9pbmZvLnNvY19kZHJfYmFzZSwKKyAgICAgICAgKHZvaWQgKilkZXZfY3RybF9kYltkZXZpY2VdLmZsZF9pbmZvLnNvY19yZWdzX2Jhc2UpOworCisgICAgcmMgPSBiY21fZmxkX3JlZ2lzdGVyKGRldmljZSwgJmRldl9jdHJsX2RiW2RldmljZV0uZmxkX2luZm8pOworICAgIEJDTV9ERVZfQ1RSTF9SRVRVUk5fT05fRVJST1IoZGV2aWNlLCByYywgImJjbV9mbGRfcmVnaXN0ZXJcbiIpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBkZXZfY3RybF9oYW5kbGVfZmlsZShiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgaW1hZ2VfdHlwZSkKK3sKKyAgICBpbnQzMl90IHJlYWRfbGVuOworICAgIEJDTV9GTERfSE9TVF9ERUJVR19WQUxVRVMgaG9zdF9kZWJ1Z192YWx1ZTsKKyAgICBiY21vc19lcnJubyByYzsKKyAgICB1aW50MzJfdCBvZmZzZXRfciA9IDAsIG9mZnNldF93ID0gMDsKKyAgICB2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHdyaXRlX2NvbXBsZXRlWzJdOworICAgIGNvbnN0IGNoYXIgKmltYWdlX25hbWU7CisKKyAgICBCVUdfT04oKGltYWdlX3R5cGUgIT0gQkNNT0xUX0RFVklDRV9JTUFHRV9UWVBFX0JPT1RMT0FERVIpICYmIChpbWFnZV90eXBlICE9IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFlQRV9BUFBMSUNBVElPTikpOworCisgICAgaW1hZ2VfbmFtZSA9IGltYWdlX3R5cGUgPT0gQkNNT0xUX0RFVklDRV9JTUFHRV9UWVBFX0FQUExJQ0FUSU9OID8gImFwcGxpY2F0aW9uIiA6ICJib290IGxvYWRlciI7CisKKyAgICBCQ01fTE9HKElORk8sIGRldl9jdHJsX2RiW2RldmljZV0ubG9nX2lkLCAiTG9hZGluZyAlc1xuIiwgaW1hZ2VfbmFtZSk7CisKKyAgICBob3N0X2RlYnVnX3ZhbHVlID0gaW1hZ2VfdHlwZSA9PSBCQ01PTFRfREVWSUNFX0lNQUdFX1RZUEVfQVBQTElDQVRJT04gPyBCQ01fRkxEX0hPU1RfV1JJVEVfRERSIDogQkNNX0ZMRF9IT1NUX1dSSVRFX1NSQU07CisgICAgcmMgPSBiY21fZmxkX3NldF9ob3N0X2RlYnVnX3N0YXR1cyhkZXZpY2UsIGhvc3RfZGVidWdfdmFsdWUpOworICAgIEJDTV9ERVZfQ1RSTF9SRVRVUk5fT05fRVJST1IoZGV2aWNlLCByYywgImJjbV9mbGRfc2V0X2hvc3RfZGVidWdfc3RhdHVzXG4iKTsKKworICAgIC8qIElmIHRoaXMgaXMgdGhlIGFwcGxpY2F0aW9uIGltYWdlLCBza2lwIHRoZSBlbnZlbG9wZSAoanVtcCB0byB0aGUgZGF0YSBpdHNlbGYpLiAqLworICAgIGlmIChpbWFnZV90eXBlID09IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFlQRV9BUFBMSUNBVElPTikKKyAgICB7CisgICAgICAgIGJjbW9sdF9maXJtd2FyZV9lbnZlbG9wZSBlbnZlbG9wZTsKKworICAgICAgICByZWFkX2xlbiA9IGRldl9jdHJsX3BhcmFtcy5pbWFnZV9yZWFkX2NiKGRldmljZSwgaW1hZ2VfdHlwZSwgb2Zmc2V0X3IsICh1aW50OF90ICopJmVudmVsb3BlLCBzaXplb2YoZW52ZWxvcGUpKTsKKyAgICAgICAgaWYgKHJlYWRfbGVuIDwgc2l6ZW9mKGVudmVsb3BlKSkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgZGV2X2N0cmxfZGJbZGV2aWNlXS5sb2dfaWQsICJpbWFnZV9yZWFkX2NiIHJldHVybmVkIGVycm9yICVzICglZClcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSwgcmMpOworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisgICAgICAgIEJDTV9MT0coSU5GTywgZGV2X2N0cmxfZGJbZGV2aWNlXS5sb2dfaWQsICJVcGxvYWQgZmlybXdhcmUgdmVyc2lvbj0ldS4ldS4ldS4ldVxuIiwKKyAgICAgICAgICAgIGVudmVsb3BlLnJldmlzaW9uLnJlbGVhc2VfbWFqb3JfaWQsIGVudmVsb3BlLnJldmlzaW9uLnJlbGVhc2VfbWlub3JfaWQsIGVudmVsb3BlLnJldmlzaW9uLnJlbGVhc2VfcmV2aXNpb25faWQsIGVudmVsb3BlLnJldmlzaW9uLm1vZGVsX2lkKTsKKyAgICAgICAgb2Zmc2V0X3IgKz0gcmVhZF9sZW47CisgICAgfQorCisgICAgZG8KKyAgICB7CisgICAgICAgIHJlYWRfbGVuID0gZGV2X2N0cmxfcGFyYW1zLmltYWdlX3JlYWRfY2IoZGV2aWNlLCBpbWFnZV90eXBlLCBvZmZzZXRfciwgaW1hZ2VfYnVmW2RldmljZV0sIElNQUdFX0JVRl9TSVpFKTsKKyAgICAgICAgaWYgKHJlYWRfbGVuIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgZGV2X2N0cmxfZGJbZGV2aWNlXS5sb2dfaWQsICJpbWFnZV9yZWFkX2NiIHJldHVybmVkIGVycm9yICVzICglZClcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSwgcmMpOworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFyZWFkX2xlbikKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIEJDTV9MT0coSU5GTywgZGV2X2N0cmxfZGJbZGV2aWNlXS5sb2dfaWQsICJXcml0aW5nICVzICglZClcbiIsIGltYWdlX25hbWUsIHJlYWRfbGVuKTsKKyAgICAgICAgcmMgPSBiY21fZmxkX3dyaXRlKGRldmljZSwgKGNoYXIgKilpbWFnZV9idWZbZGV2aWNlXSwgcmVhZF9sZW4sIG9mZnNldF93LCBpbWFnZV90eXBlKTsKKyAgICAgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGRldl9jdHJsX2RiW2RldmljZV0ubG9nX2lkLCAiYmNtX2ZsZF93cml0ZSByZXR1cm5lZCBlcnJvciAlcyAoJWQpXG4iLCBiY21vc19zdHJlcnJvcihyYyksIHJjKTsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorCisgICAgICAgIEJDTV9MT0coSU5GTywgZGV2X2N0cmxfZGJbZGV2aWNlXS5sb2dfaWQsICJSZWFkaW5nICVzIGZvciBjaGVja2luZyAoJWQpXG4iLCBpbWFnZV9uYW1lLCByZWFkX2xlbik7CisgICAgICAgIHJjID0gYmNtX2ZsZF9yZWFkKGRldmljZSwgKGNoYXIgKilyZF9pbWFnZV9idWZbZGV2aWNlXSwgKHVpbnQzMl90ICopJnJlYWRfbGVuLCBvZmZzZXRfdywgaW1hZ2VfdHlwZSk7CisgICAgICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBkZXZfY3RybF9kYltkZXZpY2VdLmxvZ19pZCwgImJjbV9mbGRfcmVhZCByZXR1cm5lZCBlcnJvciAlcyAoJWQpXG4iLCBiY21vc19zdHJlcnJvcihyYyksIHJjKTsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorCisgICAgICAgIG9mZnNldF9yICs9IHJlYWRfbGVuOworICAgICAgICBvZmZzZXRfdyArPSByZWFkX2xlbjsKKworICAgICAgICBCQ01fTE9HKElORk8sIGRldl9jdHJsX2RiW2RldmljZV0ubG9nX2lkLCAiQ29tcGFyaW5nICVzICglZCkvKCV1KVxuIiwgaW1hZ2VfbmFtZSwgcmVhZF9sZW4sIG9mZnNldF93KTsKKyAgICAgICAgaWYgKG1lbWNtcChyZF9pbWFnZV9idWZbZGV2aWNlXSwgaW1hZ2VfYnVmW2RldmljZV0sIHJlYWRfbGVuKSkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgZGV2X2N0cmxfZGJbZGV2aWNlXS5sb2dfaWQsICJFcnJvciBkdXJpbmcgaW1hZ2UgdXBsb2FkaW5nICAleFxuIiwgb2Zmc2V0X3cpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChyZWFkX2xlbik7CisKKyAgICBpZiAoIW9mZnNldF93KQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgZGV2X2N0cmxfZGJbZGV2aWNlXS5sb2dfaWQsICIlcyBpbWFnZSBmaWxlIGVtcHR5IG9yIGNvcnJ1cHRlZCEhIVxuIiwgaW1hZ2VfbmFtZSk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOworICAgIH0KKworICAgIGlmIChpbWFnZV90eXBlID09IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFlQRV9BUFBMSUNBVElPTikKKyAgICB7CisgICAgICAgIHJlYWRfbGVuID0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworICAgICAgICAvKiBmaXJzdCByZWFkIHdvcmQgZnJvbSBzdGFyIG9mIHRoZSBpbWFnZSAqLworICAgICAgICBiY21fZmxkX3JlYWQoZGV2aWNlLCAoY2hhciAqKShsb25nKSZ3cml0ZV9jb21wbGV0ZVswXSwgKHVpbnQzMl90ICopJnJlYWRfbGVuLCAwLCBpbWFnZV90eXBlKTsKKyAgICAgICAgLyogc3luYyBiZWZvcmUgcmVhZCB0YWlsIG9mIGltYWdlICovCisgICAgICAgIGJjbW9zX2JhcnJpZXIoKTsKKyAgICAgICAgLyogcmVhZCBmcm9tIHRhaWwgb2YgdGhlIGltYWdlICovCisgICAgICAgIGJjbV9mbGRfcmVhZCgKKyAgICAgICAgICAgIGRldmljZSwKKyAgICAgICAgICAgIChjaGFyICopKGxvbmcpJndyaXRlX2NvbXBsZXRlWzFdLAorICAgICAgICAgICAgKHVpbnQzMl90ICopJnJlYWRfbGVuLAorICAgICAgICAgICAgb2Zmc2V0X3cgLSBzaXplb2YodW5zaWduZWQgbG9uZyksCisgICAgICAgICAgICBpbWFnZV90eXBlKTsKKyAgICAgICAgLyogbm93IHdlIGNhbiBiZSBzdXJlIHRoYXQgZnVsbCBpbWFnZSBpbiB0aGUgZW1iZWRkZWQgbWVtb3J5ICovCisgICAgfQorCisgICAgQkNNX0xPRyhJTkZPLCBkZXZfY3RybF9kYltkZXZpY2VdLmxvZ19pZCwgIlRyYW5zZmVycmVkICV1IGJ5dGVzXG4iLCBvZmZzZXRfdyk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGRldl9jdHJsX2hhbmRsZV9hcHBsaWNhdGlvbl9pbWFnZShiY21vbHRfZGV2aWQgZGV2aWNlKQoreworICAgIGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEgKmRldl9wYXJhbXMgPSAmZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zOworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIHJjID0gZGV2X2N0cmxfaGFuZGxlX2ZpbGUoZGV2aWNlLCBCQ01PTFRfREVWSUNFX0lNQUdFX1RZUEVfQVBQTElDQVRJT04pOworICAgIEJDTV9ERVZfQ1RSTF9SRVRVUk5fT05fRVJST1IoZGV2aWNlLCByYywgImRldl9jdHJsX2hhbmRsZV9maWxlKClcbiIpOworICAgIHJjID0gYmNtX2ZsZF9ob3N0X2ZpbmlzaF93cml0ZV9kZHIoZGV2aWNlLCAwKTsKKyAgICBCQ01fREVWX0NUUkxfUkVUVVJOX09OX0VSUk9SKGRldmljZSwgcmMsICJiY21fZmxkX2hvc3RfZmluaXNoX3dyaXRlX2RkcigpXG4iKTsKKyAgICByYyA9IGJjbXRybXV4X2Nvbm5lY3QoZGV2aWNlLCBkZXZfcGFyYW1zLT5kZWJ1Zy5ob3N0X2RtYV90eF9xdWV1ZV9zaXplLCBkZXZfcGFyYW1zLT5kZWJ1Zy5ob3N0X2RtYV9yeF9xdWV1ZV9zaXplKTsKKyAgICBCQ01fREVWX0NUUkxfUkVUVVJOX09OX0VSUk9SKGRldmljZSwgcmMsICJiY210cm11eF9jb25uZWN0KClcbiIpOworICAgIC8qIFdlIHdhbnQgdGhhdCBpbiBjYXNlIE9OTFkgdGhlIGhvc3QgaXMgcmVzZXQsIE1hcGxlIGVudGVycyBzdGFuZGFsb25lIG1vZGUgLSB0aGlzIG1lYW5zIHdlIG5lZWQgdG8gdHVybiBvZmYgImhvdCByZXNldCIgb24gdGhlIFBDSWUgY2hhbm5lbC4gKi8KKyAgICByYyA9IGJjbV9sbF9wY2llX2hvc3RfcmVzZXRfZW5hYmxlKGRldmljZSxCQ01PU19GQUxTRSk7CisgICAgQkNNX0RFVl9DVFJMX1JFVFVSTl9PTl9FUlJPUihkZXZpY2UsIHJjLCAiYmNtX2xsX3BjaWVfaG9zdF9yZXNldF9lbmFibGUoKVxuIik7CisKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBkZXZfY3RybF9oYW5kbGVfYm9vdGxvYWRlcl9pbWFnZShiY21vbHRfZGV2aWQgZGV2aWNlLCB1aW50MzJfdCB0ZXN0X2RkcikKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisKKyAgICByYyA9IGRldl9jdHJsX2hhbmRsZV9maWxlKGRldmljZSwgQkNNT0xUX0RFVklDRV9JTUFHRV9UWVBFX0JPT1RMT0FERVIpOworICAgIEJDTV9ERVZfQ1RSTF9SRVRVUk5fT05fRVJST1IoZGV2aWNlLCByYywgImRldl9jdHJsX2hhbmRsZV9maWxlKClcbiIpOworICAgIHJjID0gYmNtX2ZsZF9zdGFydF9ib290bG9hZGVyKGRldmljZSwgdGVzdF9kZHIpOworICAgIEJDTV9ERVZfQ1RSTF9SRVRVUk5fT05fRVJST1IoZGV2aWNlLCByYywgImJjbV9mbGRfc3RhcnRfYm9vdGxvYWRlcigpXG4iKTsKKyAgICBiY21vc190aW1lcl9zdGFydCgKKyAgICAgICAgJmRldl9jdHJsX2RiW2RldmljZV0uYm9vdF9zZXFfaW5mby50aW1lci50aW1lciwKKyAgICAgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5ib290X3NlcV9pbmZvLnBvbGxpbmdfaW50ZXJ2YWwpOworCisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gZGV2X2N0cmxfc3RhcnRfZmxkKGJjbW9sdF9kZXZpZCBkZXZpY2UsIHVpbnQzMl90IHRlc3RfZGRyKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIGJjbV9mbGRfY2xlYXJfY29tbV9hcmVhKGRldmljZSk7CisKKyAgICByYyA9IGRldl9jdHJsX2hhbmRsZV9ib290bG9hZGVyX2ltYWdlKGRldmljZSwgdGVzdF9kZHIpOworICAgIEJDTV9ERVZfQ1RSTF9SRVRVUk5fT05fRVJST1IoZGV2aWNlLCByYywgImRldl9jdHJsX2hhbmRsZV9ib290bG9hZGVyX2ltYWdlXG4iKTsKKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGRldl9jdHJsX2dldF9leGNlcHRpb25fbG9nX2J5X2NwdShiY21vbHRfZGV2aWQgZGV2aWNlLCB1aW50MzJfdCBjcHVpZCkKK3sKKyAgICBjaGFyICpleGNlcHRpb25fYnVmOworICAgIGludCBleGNlcHRpb25fYnVmX2xlbjsKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIGV4Y2VwdGlvbl9idWYgPSBiY21vc19hbGxvYyhCQ01fRkxEX0NQVV9QT1NUTU9SVEVNX0JVRl9TSVpFKTsKKyAgICByYyA9IGJjbV9mbGRfY29weV9leGNlcHRpb25fbG9nKGRldmljZSwgY3B1aWQsIGV4Y2VwdGlvbl9idWYsICZleGNlcHRpb25fYnVmX2xlbik7CisgICAgaWYgKHJjKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgZGV2X2N0cmxfZGJbZGV2aWNlXS5sb2dfaWQsICJiY21fZmxkX2NvcHlfZXhjZXB0aW9uX2xvZyBmYWlsZWQsIHJjPSV1ICglcylcbiIsIHJjLCBiY21vc19zdHJlcnJvcihyYykpOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorICAgIGJjbV9mbGRfY2xlYXJfZXhjZXB0aW9uX3N0YXRlKGRldmljZSwgY3B1aWQpOworCisgICAgZGV2X2N0cmxfc2VuZF9pbmRfZXhjZXB0aW9uX2xvZyhkZXZpY2UsIGNwdWlkLCBleGNlcHRpb25fYnVmKTsKKyAgICByYyA9IEJDTV9FUlJfT0s7CisKK2V4aXQ6CisgICAgYmNtb3NfZnJlZShleGNlcHRpb25fYnVmKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKiBEdW1wIGV4Y2VwdGlvbiBsb2cgaWYgdGhlcmUgaXMgb25lLCByZXR1cm4gQkNNX0VSUl9OT0VOVCBpZiBub3QuICovCitzdGF0aWMgYmNtb3NfZXJybm8gZGV2X2N0cmxfZ2V0X2V4Y2VwdGlvbl9sb2dfaWZfcHJlc2VudChiY21vbHRfZGV2aWQgZGV2X2lkKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIHVpbnQzMl90IHN0YXRlMCwgc3RhdGUxOworCisgICAgLyogRHVtcCBleGNlcHRpb24gbG9nLCBpZiBhbnkuCisgICAgICogVGhpcyBzaG91bGQgYmUgZG9uZSBwcmlvciB0byB3cml0aW5nIGJvb3Rsb2FkZXIsIGFzIGl0IHdpbGwgb3ZlcndyaXRlIHRoZSBzYW1lIHBsYWNlIGluIFNSQU0uICovCisgICAgcmMgPSBiY21fZmxkX2dldF9leGNlcHRpb25fc3RhdGUoZGV2X2lkLCAmc3RhdGUwLCAmc3RhdGUxKTsKKyAgICBCQ01fREVWX0NUUkxfUkVUVVJOX09OX0VSUk9SKGRldl9pZCwgcmMsICJiY21fZmxkX2dldF9leGNlcHRpb25fc3RhdGVcbiIpOworICAgIGlmIChzdGF0ZTApCisgICAgICAgIGRldl9jdHJsX2dldF9leGNlcHRpb25fbG9nX2J5X2NwdShkZXZfaWQsIDApOworICAgIGlmIChzdGF0ZTEpCisgICAgICAgIGRldl9jdHJsX2dldF9leGNlcHRpb25fbG9nX2J5X2NwdShkZXZfaWQsIDEpOworICAgIGlmICghc3RhdGUwICYmICFzdGF0ZTEpCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PRU5UOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qKiBEdW1wIGV4Y2VwdGlvbiBsb2cgaWYgdGhlcmUgaXMgb25lLCBwcmludCBhIG1lc3NhZ2UgYW5kIHJldHVybiBCQ01fRVJSX09LIGlmIG5vdC4gKi8KK3N0YXRpYyBiY21vc19lcnJubyBkZXZfY3RybF9nZXRfZXhjZXB0aW9uX2xvZyhiY21vbHRfZGV2aWQgZGV2X2lkKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gZGV2X2N0cmxfZ2V0X2V4Y2VwdGlvbl9sb2dfaWZfcHJlc2VudChkZXZfaWQpOworICAgIGlmIChyYyA9PSBCQ01fRVJSX05PRU5UKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhERUJVRywgZGV2X2N0cmxfZGJbZGV2X2lkXS5sb2dfaWQsICJFeGNlcHRpb24gbG9nIGZvciBkZXZpY2UgJWQgaXMgZW1wdHlcbiIsIGRldl9pZCk7CisgICAgICAgIHJjID0gQkNNX0VSUl9PSzsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBkZXZfY3RybF9zd19lcnJvcl90YWJsZV9kdW1wKGJjbW9sdF9kZXZpZCBkZXZfaWQpCit7CisgICAgYmNtb3NfZXJybm8gZXJyID0gZGV2X2N0cmxfZ2V0X3N3X2Vycm9yX3RhYmxlKGRldl9pZCk7CisgICAgdWludDhfdCBpOworCisgICAgaWYgKEJDTV9FUlJfT0sgIT0gZXJyKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhJTkZPLCBkZXZfY3RybF9kYltkZXZfaWRdLmxvZ19pZCwgIkZhaWxlZCB0byByZXRyaWV2ZSBFbWJlZGRlZCBTb2Z0d2FyZSBFcnJvcihzKTogJWRcbiIsIGVycik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEJDTV9MT0coSU5GTywgZGV2X2N0cmxfZGJbZGV2X2lkXS5sb2dfaWQsICJGb3VuZCAldSBFbWJlZGRlZCBTb2Z0d2FyZSBFcnJvcihzKTpcbiIsIGRldl9jdHJsX2RiW2Rldl9pZF0uc3dfZXJyb3JfY291bnQpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZGV2X2N0cmxfZGJbZGV2X2lkXS5zd19lcnJvcl9jb3VudDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKElORk8sIGRldl9jdHJsX2RiW2Rldl9pZF0ubG9nX2lkLAorICAgICAgICAgICAgICAgICJcdFslc10gJXM6JXUgaW5zdDoldSBjb3VudDoldSBmaXJzdDolbGx1IGxhc3Q6JWxsdVxuIiwKKyAgICAgICAgICAgICAgICBkZXZfY3RybF9kYltkZXZfaWRdLnN3X2Vycm9yc1tpXS50YXNrX25hbWUsCisgICAgICAgICAgICAgICAgZGV2X2N0cmxfZGJbZGV2X2lkXS5zd19lcnJvcnNbaV0uZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgZGV2X2N0cmxfZGJbZGV2X2lkXS5zd19lcnJvcnNbaV0ubGluZV9udW1iZXIsCisgICAgICAgICAgICAgICAgZGV2X2N0cmxfZGJbZGV2X2lkXS5zd19lcnJvcnNbaV0uaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgZGV2X2N0cmxfZGJbZGV2X2lkXS5zd19lcnJvcnNbaV0uZXJyb3JfY291bnRlciwKKyAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWRldl9jdHJsX2RiW2Rldl9pZF0uc3dfZXJyb3JzW2ldLmZpcnN0X2Vycm9yX3RpbWVfdXMsCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylkZXZfY3RybF9kYltkZXZfaWRdLnN3X2Vycm9yc1tpXS5sYXN0X2Vycm9yX3RpbWVfdXMpOworICAgICAgICB9CisgICAgfQorfQorI2VuZGlmCisKK3N0YXRpYyBiY21vbHRfaG9zdF9jb25uZWN0aW9uX2ZhaWxfcmVhc29uIGRldl9jdHJsX2Nvbm5lY3RfZnJvbV9yZXNldChiY21vbHRfZGV2aWQgZGV2aWNlLCB1aW50MzJfdCB0ZXN0X2RkcikKK3sKKyNpZm5kZWYgSU5fQkFORAorICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgcmMgPSBkZXZfY3RybF9wYXJhbXMuZGV2aWNlX29uX2NiKGRldmljZSk7CisgICAgQkNNT1NfVFJBQ0VfQ0hFQ0tfUkVUVVJOKAorICAgICAgICByYyAhPSBCQ01fRVJSX09LLAorICAgICAgICBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX1VTRVJfQ0FMTEJBQ0tfRVJST1IsCisgICAgICAgICJkZXZpY2Vfb25fY2JcbiIpOworCisgICAgcmMgPSBkZXZfY3RybF9wYXJhbXMucGNpZV9jaGFubmVsX3ByZXBhcmVfY2IoZGV2aWNlKTsKKyAgICBCQ01PU19UUkFDRV9DSEVDS19SRVRVUk4oCisgICAgICAgIHJjICE9IEJDTV9FUlJfT0ssCisgICAgICAgIEJDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fVVNFUl9DQUxMQkFDS19FUlJPUiwKKyAgICAgICAgInBjaWVfY2hhbm5lbF9wcmVwYXJlX2NiXG4iKTsKKworCisgICAgcmMgPSBkZXZfY3RybF9yZWdpc3Rlcl9mbGQoZGV2aWNlKTsKKyAgICBCQ01PU19UUkFDRV9DSEVDS19SRVRVUk4oCisgICAgICAgIHJjICE9IEJDTV9FUlJfT0ssCisgICAgICAgIEJDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fSU5URVJOQUxfRVJST1IsCisgICAgICAgICJkZXZfY3RybF9yZWdpc3Rlcl9mbGRcbiIpOworCisgICAgZGV2X2N0cmxfZ2V0X2V4Y2VwdGlvbl9sb2coZGV2aWNlKTsKKyAgICBkZXZfY3RybF9zd19lcnJvcl90YWJsZV9kdW1wKGRldmljZSk7CisKKyNpZm5kZWYgU0lNVUxBVElPTl9CVUlMRAorICAgIGJjbV9mbGRfc2V0X2hvc3RfZXZlbnQoZGV2aWNlLCBkZXZfY3RybF9kYltkZXZpY2VdLnRyeF9kaXNhYmxlX21hc2spOworI2VuZGlmCisgICAgcmMgPSBkZXZfY3RybF9zdGFydF9mbGQoZGV2aWNlLCB0ZXN0X2Rkcik7CisgICAgQkNNT1NfVFJBQ0VfQ0hFQ0tfUkVUVVJOKAorICAgICAgICByYyAhPSBCQ01fRVJSX09LLAorICAgICAgICBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX0lOVEVSTkFMX0VSUk9SLAorICAgICAgICAiZGV2X2N0cmxfc3RhcnRfZmxkXG4iKTsKKyNlbmRpZgorICAgIHJldHVybiBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX05PTkU7Cit9CisKK3N0YXRpYyBiY21vbHRfaG9zdF9jb25uZWN0aW9uX2ZhaWxfcmVhc29uIGRldl9jdHJsX2Nvbm5lY3RfdG9fc3RhbmRhbG9uZShiY21vbHRfZGV2aWQgZGV2aWNlKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgLyogaWYgTWFwbGUgcnVucyBpbiBzdGFuZGFsb25lIG1vZGUsIGFuZCBob3N0IGRpZCByZXNldCwgd2UgbmVlZCB0byByZWdpc3RlciBtYXBsZSB0byBmbGQgYW5kIGFuZAorICAgICAgIHJlY29ubmVjdCB0aGUgdHJhbnNwb3J0IGxheWVyIC0gbm8gbmVlZCB0byByZXNjYW4sIGl0IHdhcyBkb25lIGF1dG9tYXRpY2FsbHkgYnkgaG9zdCB3aGVuCisgICAgICAgbGxfcGNpZSByZWdpc3RlcmVkIG1hcGxlCisgICAgICAgcmUtc2NhbiB3aXRob3V0IHBhc3NpbmcgdGhydSByZW1vdmUgYW5kIG1hcGxlIG9mZiwgbGV0cyBtYXBsZSBvdXQgb2YgcmVzZXQsIHJlbWFwcGVkLCBidXQgc3R1Y2tlZAorICAgICAgIG5vdCwgcmVhbGx5LCB3b3JraW5nIGluIHN0YW5kYWxvYW5lIG1vZGUKKyAgICAgICAqLworCisgICAgLyogVGhlIGNoaXAgaXMgcnVubmluZyBhbmQgdGhlIFBDSWUgY2hhbm5lbCBoYXJkd2FyZSBpcyBpbml0aWFsaXplZCwgd2UgY2FuIG5vdyBzYWZlbHk6CisgICAgICogLSBSZWdpc3RlciB3aXRoIHRoZSBGTEQgZHJpdmVyLgorICAgICAqIC0gUmVzdGFydCB0aGUgUENJZSBjb25uZWN0aW9uIHByb2Nlc3MuICBBcyBwYXJ0IG9mIHRoaXMgcHJvY2VzcywgdGhlIGhvc3Qgd2lsbCBzZXQgdGhlICdob3N0IHF1ZXVlcyB2YWxpZCcgZmxhZy4KKyAgICAgKiAgIElmIHRoZSBkZXZpY2UgaXMgcnVubmluZyBhbmQgc2VlcyB0aGlzIGZsYWcgaXMgc2V0LCBpdCB3aWxsIHN0YXJ0IHRoZSByZWNvbm5lY3Rpb24gcHJvY2VzcyBhcyB3ZWxsLCBpbiBzeW5jCisgICAgICogICB3aXRoIHRoZSBob3N0LiAgSWYgdGhlIGRldmljZSBmYWlscyB0byBjb25uZWN0LCBpdCBtZWFucyB0aGF0IHRoZSBkZXZpY2UgaXMgdW5yZXNwb25zaXZlLCBzbyB0aGUgYmVzdCB3ZSBjYW4gZG8KKyAgICAgKiAgIGlzIHJlc2V0IHRoZSBkZXZpY2UgYW5kIHJlcHJvZ3JhbSBpdCBmcm9tIHNjcmF0Y2guICovCisjaWZuZGVmIElOX0JBTkQKKyAgICByYyA9IGRldl9jdHJsX3JlZ2lzdGVyX2ZsZChkZXZpY2UpOworICAgIEJDTU9TX1RSQUNFX0NIRUNLX1JFVFVSTigKKyAgICAgICAgcmMgIT0gQkNNX0VSUl9PSywKKyAgICAgICAgQkNNT0xUX0hPU1RfQ09OTkVDVElPTl9GQUlMX1JFQVNPTl9JTlRFUk5BTF9FUlJPUiwKKyAgICAgICAgImRldl9jdHJsX3JlZ2lzdGVyX2ZsZFxuIik7CisKKyAgICBkZXZfY3RybF9nZXRfZXhjZXB0aW9uX2xvZyhkZXZpY2UpOworCisjaWZuZGVmIFNJTVVMQVRJT05fQlVJTEQKKyAgICBiY21fZmxkX3NldF9ob3N0X2V2ZW50KGRldmljZSwgZGV2X2N0cmxfZGJbZGV2aWNlXS50cnhfZGlzYWJsZV9tYXNrKTsKKyNlbmRpZgorI2VuZGlmCisKKyAgICBCQ01fTE9HKElORk8sIGRldl9jdHJsX2RiW2RldmljZV0ubG9nX2lkLCAiUmVxdWVzdGluZyByZS1jb25uZWN0IHRvIHJ1bm5pbmcgZGV2aWNlLi4uXG4iKTsKKyNpZm5kZWYgSU5fQkFORAorICAgIHJjID0gYmNtdHJtdXhfY29ubmVjdCgKKyAgICAgICAgZGV2aWNlLAorICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuZGVidWcuaG9zdF9kbWFfdHhfcXVldWVfc2l6ZSwKKyAgICAgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zLmRlYnVnLmhvc3RfZG1hX3J4X3F1ZXVlX3NpemUpOyAKKyNlbHNlCisgICAgIC8qTmVlZCB0byBwYXNzIGluIElQIEFkZHJlc3MgYW5kIFVEUCBwb3J0IHdoZW4gcnVubmluZyBpbiBsaW51eCB1c2VyIHNwYWNlKi8KKyAgICByYyA9IGJjbXRybXV4X2Nvbm5lY3QoZGV2aWNlLAorICAgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtcy5kZXZpY2VfaXBfYWRkcmVzcywKKyAgICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuZGV2aWNlX3VkcF9wb3J0KTsKKworI2VuZGlmCisKKyAgICBpZiAocmMgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0uY29ubmVjdGlvbl9pbmZvLnN0YXRlID0gREVWX0NUUkxfQ09OTkVDVElOR19TVEFURV9TVEFOREFMT05FOworICAgICAgICByZXR1cm4gQkNNT0xUX0hPU1RfQ09OTkVDVElPTl9GQUlMX1JFQVNPTl9OT05FOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBCQ01fTE9HKElORk8sIGRldl9jdHJsX2RiW2RldmljZV0ubG9nX2lkLCAiQ29ubmVjdGlvbiBmYWlsZWQgLSBydW5uaW5nIGRldmljZSBkaWRuJ3QgcmVzcG9uZCB0byBjb25uZWN0aW9uIHJlcXVlc3RcbiIpOworICAgICAgICByZXR1cm4gQkNNT0xUX0hPU1RfQ09OTkVDVElPTl9GQUlMX1JFQVNPTl9SRUNPTk5FQ1RfVElNRU9VVDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRldl9jdHJsX2Rpc2Nvbm5lY3QoYmNtb2x0X2RldmlkIGRldmljZSkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtcy5zdGF0ZSA9IEJDTU9MVF9ERVZJQ0VfU1RBVEVfRElTQ09OTkVDVEVEOworI2lmZGVmIEVOQUJMRV9MT0cKKyAgICBkZXZfY3RybF9kYltkZXZpY2VdLnNyYW1fbG9nX29mZnNldCA9IDA7CisgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5tc2dzX3JlYWQgPSAwOworI2VuZGlmCisgICAgc3RvcF9rZWVwX2FsaXZlX3Byb2Nlc3MoJmRldl9jdHJsX2RiW2RldmljZV0ua2FfaW5mbyk7CisgICAgYmNtb3NfdGltZXJfc3RvcCgmZGV2X2N0cmxfZGJbZGV2aWNlXS5leGNlcHRpb25fbW9uaXRvcl90aW1lci50aW1lcik7CisgICAgZGV2X2N0cmxfaW5pdF9jb25uZWN0aW9uX3N0YXRlKGRldmljZSk7CisgICAgcmMgPSBiY210cm11eF9kaXNjb25uZWN0KGRldmljZSk7CisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0sgJiYgcmMgIT0gQkNNX0VSUl9BTFJFQURZKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgZGV2X2N0cmxfZGJbZGV2aWNlXS5sb2dfaWQsICJiY210cm11eF9kaXNjb25uZWN0IHJldHVybmVkIGVycm9yOiAlcyAoJWQpXG4iLCBiY21vc19zdHJlcnJvcihyYyksIHJjKTsKKyAgICB9Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBkZXZfY3RybF9wZXJmb3JtX3Jlc2V0X2RldmljZShiY21vbHRfZGV2aWQgZGV2aWNlKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIGRldl9jdHJsX2Rpc2Nvbm5lY3QoZGV2aWNlKTsKKworI2lmbmRlZiBJTl9CQU5ECisgICAgcmMgPSBkZXZfY3RybF9wYXJhbXMucGNpZV9jaGFubmVsX3JlbW92ZV9jYihkZXZpY2UpOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgZGV2X2N0cmxfZGJbZGV2aWNlXS5sb2dfaWQsICJEZXZpY2UgcmVtb3ZlIGNhbGxiYWNrIGZhaWxlZDogJXMgKCVkKVxuIiwgYmNtb3Nfc3RyZXJyb3IocmMpLCByYyk7CisgICAgfQorICAgIHJjID0gZGV2X2N0cmxfcGFyYW1zLmRldmljZV9vZmZfY2IoZGV2aWNlKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGRldl9jdHJsX2RiW2RldmljZV0ubG9nX2lkLCAiRGV2aWNlIG9mZiBjYWxsYmFjayBmYWlsZWQ6ICVzICglZClcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSwgcmMpOworICAgIH0KKworICAgIC8qIHRoZSBkZXZpY2UgaGFzIGJlZW4gcmVzZXQgc28gb3VyIEZMRCBpbmZvIGlzIG5vdyBpbnZhbGlkICovCisgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5mbGRfaW5mby5zb2Nfc3JhbV9iYXNlID0gMDsKKyAgICBiY21fZmxkX3VucmVnaXN0ZXIoZGV2aWNlKTsKKyNlbmRpZgorICAgIHJldHVybiByYzsKK30KK3N0YXRpYyBiY21vc19lcnJubyBkZXZfY3RybF9wZXJmb3JtX3Jlc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGNvbnN0IGJjbW9sdF9tc2cgKm1zZykKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgYmNtb2x0X2RldmljZV9yZXNldF9tb2RlIG1vZGUgPSAoKGNvbnN0IGJjbW9sdF9kZXZpY2VfcmVzZXQgKiltc2cpLT5kYXRhLm1vZGU7CisgICAgYmNtb2x0X2RldmlkIGk7CisKKyAgICBzd2l0Y2ggKG1vZGUpCisgICAgeworICAgIGNhc2UgQkNNT0xUX0RFVklDRV9SRVNFVF9NT0RFX0RFVklDRToKKyAgICAgICAgcmV0dXJuIGRldl9jdHJsX3BlcmZvcm1fcmVzZXRfZGV2aWNlKGRldmljZSk7CisKKyAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfUkVTRVRfTU9ERV9IT1NUOgorICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuc3RhdGUgPSBCQ01PTFRfREVWSUNFX1NUQVRFX0RJU0NPTk5FQ1RFRDsKKyAgICAgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5pc19ob3N0X3Jlc2V0X3BlbmRpbmcgPSBCQ01PU19UUlVFOworICAgICAgICBkZXZfY3RybF9zZW5kX2RldmljZV9kaXNjb25uZWN0X21zZyhkZXZpY2UsIDApOworICAgICAgICAvKiBpbnN0ZWFkIG9mIHJlc2V0dGluZyB0aGUgaG9zdCByaWdodCBhd2F5LCB3YWl0IGEgZmV3IG1zIHNvIHRoZSBob3N0IGNhbiByZWNlaXZlIHRoZSBhY2sgLyBpbmRpY2F0aW9uICovCisgICAgICAgIGJjbW9zX3RpbWVyX3N0YXJ0KCZkZXZfY3RybF9kYltkZXZpY2VdLnJlc2V0X2RlbGF5X3RpbWVyLnRpbWVyLCBIT1NUX1JFU0VUX0RFTEFZX1VTKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfUkVTRVRfTU9ERV9BTEw6CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBCQ01UUl9NQVhfT0xUUzsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBkZXZfY3RybF9kYltpXS5kZXZpY2VfcGFyYW1zLnN0YXRlID0gQkNNT0xUX0RFVklDRV9TVEFURV9ESVNDT05ORUNURUQ7CisgICAgICAgICAgICBkZXZfY3RybF9kYltpXS5pc19ob3N0X3Jlc2V0X3BlbmRpbmcgPSBCQ01PU19UUlVFOworICAgICAgICAgICAgcmMgPSBkZXZfY3RybF9wYXJhbXMuZGV2aWNlX29mZl9jYihpKTsKKyAgICAgICAgICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGRldl9jdHJsX2RiW2ldLmxvZ19pZCwgIkRldmljZSBvZmYgY2FsbGJhY2sgZmFpbGVkOiAlcyAoJWQpXG4iLCBiY21vc19zdHJlcnJvcihyYyksIHJjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBpbnN0ZWFkIG9mIHJlc2V0dGluZyB0aGUgaG9zdCByaWdodCBhd2F5LCB3YWl0IGEgZmV3IG1zIHNvIHRoZSBob3N0IGNhbiByZWNlaXZlIHRoZSBhY2sgLyBpbmRpY2F0aW9uICovCisgICAgICAgIGJjbW9zX3RpbWVyX3N0YXJ0KCZkZXZfY3RybF9kYltkZXZpY2VdLnJlc2V0X2RlbGF5X3RpbWVyLnRpbWVyLCBIT1NUX1JFU0VUX0RFTEFZX1VTKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBCQ01fTE9HKEVSUk9SLCBkZXZfY3RybF9kYltkZXZpY2VdLmxvZ19pZCwgIlVucmVjb2duaXplZCByZXNldCBtb2RlOiAlZFxuIiwgbW9kZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgZGV2X2N0cmxfZGlzY29ubmVjdGVkX3N0YXRlX2RldmljZV9jbGVhcl9ldmVudChiY21vbHRfZGV2aWQgZGV2aWNlLCBjb25zdCBiY21vbHRfbXNnICptc2cpCit7CisgICAgZGV2X2N0cmxfY2xlYXJfZGV2aWNlX2NmZyhkZXZpY2UpOworfQorCitzdGF0aWMgdm9pZCBkZXZfY3RybF9kaXNjb25uZWN0ZWRfc3RhdGVfZGV2aWNlX2NvbmZpZ19zZXRfZXZlbnQoYmNtb2x0X2RldmlkIGRldmljZSwgY29uc3QgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGlmIChkZXZfY3RybF9kYltkZXZpY2VdLmxhc3RfbWVzc2FnZSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgZGV2X2N0cmxfZGJbZGV2aWNlXS5sb2dfaWQsICJPdXIgc2F2ZWQgbWVzc2FnZSB3YXMgaW52YWxpZFxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBkZXZfY3RybF91cGRhdGVfbG9jYWxfY29uZmlndXJhdGlvbihkZXZpY2UsIG1zZyk7CisgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5sYXN0X21lc3NhZ2UtPmRpciA9IEJDTU9MVF9NU0dfRElSX1JFU1BPTlNFOworICAgIGJjbXRybXV4X2NvbnRyb2xfdG9faG9zdChkZXZpY2UsIGRldl9jdHJsX2RiW2RldmljZV0ubGFzdF9tZXNzYWdlKTsKKyAgICBiY21vbHRfbXNnX2ZyZWUoZGV2X2N0cmxfZGJbZGV2aWNlXS5sYXN0X21lc3NhZ2UpOworICAgIGRldl9jdHJsX2RiW2RldmljZV0ubGFzdF9tZXNzYWdlID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgZGV2X2N0cmxfZGlzY29ubmVjdGVkX3N0YXRlX2RldmljZV9jb25maWdfZ2V0X2V2ZW50KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGNvbnN0IGJjbW9sdF9tc2cgKm1zZykKK3sKKyAgICBiY21vbHRfcHJlc2VuY2VfbWFzayBtYXNrOworICAgIGJjbW9sdF9kZXZpY2VfY2ZnICpjZmc7CisKKyAgICBpZiAoZGV2X2N0cmxfZGJbZGV2aWNlXS5sYXN0X21lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGRldl9jdHJsX2RiW2RldmljZV0ubG9nX2lkLCAiT3VyIHNhdmVkIG1lc3NhZ2Ugd2FzIGludmFsaWQgLS0tIGFib3J0aW5nXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNmZyA9IChiY21vbHRfZGV2aWNlX2NmZyAqKWRldl9jdHJsX2RiW2RldmljZV0ubGFzdF9tZXNzYWdlOworICAgIGNmZy0+ZGF0YSA9IGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtczsKKyAgICBtYXNrID0gZGV2X2N0cmxfZmlsbF9mcm9tX2xvY2FsKGRldmljZSk7CisKKyAgICBpZiAoKG1hc2sgJiB+ZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zX3ByZXNlbnQpICE9IDApCisgICAgeworICAgICAgICBiY21vbHRfbXNnX2VycigKKyAgICAgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0ubGFzdF9tZXNzYWdlLAorICAgICAgICAgICAgREVWX0xPR19JTlZBTElEX0lELAorICAgICAgICAgICAgQkNNX0VSUl9JTlZBTElEX09QLAorICAgICAgICAgICAgQkNNT0xUX0VSUl9GSUVMRF9OT05FLAorICAgICAgICAgICAgIlVuYWJsZSB0byBnZXQgcGFyYW1ldGVycyB0aGF0IGhhdmUgbmV2ZXIgYmVlbiBzZXQiKTsKKyAgICB9CisKKyAgICBkZXZfY3RybF9kYltkZXZpY2VdLmxhc3RfbWVzc2FnZS0+ZGlyID0gQkNNT0xUX01TR19ESVJfUkVTUE9OU0U7CisgICAgYmNtdHJtdXhfY29udHJvbF90b19ob3N0KGRldmljZSwgZGV2X2N0cmxfZGJbZGV2aWNlXS5sYXN0X21lc3NhZ2UpOworICAgIGJjbW9sdF9tc2dfZnJlZShkZXZfY3RybF9kYltkZXZpY2VdLmxhc3RfbWVzc2FnZSk7CisgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5sYXN0X21lc3NhZ2UgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBkZXZfY3RybF9kaXNjb25uZWN0ZWRfc3RhdGVfZGV2aWNlX2Nvbm5lY3RfZXZlbnQoYmNtb2x0X2RldmlkIGRldmljZSwgY29uc3QgYmNtb2x0X21zZyAqbXNnKQoreworI2lmZGVmIElOX0JBTkQKKyAgICBiY21vbHRfZGV2aWNlX2Nvbm5lY3Qgb3BlcjsKKyAgICBiY21vbHRfZGV2aWNlX2tleSBrZXkgPSB7fTsgICAKKyNlbHNlCisgICAgYmNtb3NfZXJybm8gcmM7CisjZW5kaWYKKyAgICBiY21vbHRfaG9zdF9jb25uZWN0aW9uX2ZhaWxfcmVhc29uIGZhaWxfcmVhc29uOworICAgIGJjbW9zX2Jvb2wgaXNfc3RhbmRhbG9uZTsKKworICAgIGlmIChkZXZfY3RybF9kYltkZXZpY2VdLmlzX2hvc3RfcmVzZXRfcGVuZGluZykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGRldl9jdHJsX2RiW2RldmljZV0ubG9nX2lkLCAiQ2Fubm90IGNvbm5lY3Qgd2hpbGUgaG9zdCByZXNldCBpcyBwZW5kaW5nXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworI2lmbmRlZiBJTl9CQU5ECisgICAgLyogQ2hlY2sgaWYgdGhlIGNoaXAgaXMgcnVubmluZyBpbiBzdGFuZGFsb25lIG1vZGUgKi8KKworICAgIHJjID0gZGV2X2N0cmxfcGFyYW1zLmRldmljZV9pc19ydW5uaW5nX2NiKGRldmljZSwgJmlzX3N0YW5kYWxvbmUpOworCisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBkZXZfY3RybF9kYltkZXZpY2VdLmxvZ19pZCwgImRldmljZV9zdGF0dXNfZ2V0X2NiIHJldHVybmVkIGVycm9yOiAlcyAoJWQpXG4iLCBiY21vc19zdHJlcnJvcihyYyksIHJjKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBCQ01fTE9HKElORk8sIGRldl9jdHJsX2RiW2RldmljZV0ubG9nX2lkLCAiZGV2aWNlX3N0YXR1c19nZXRfY2IgcmV0dXJuZWQgc3VjY2VzczogaXNfc3RhbmRhbG9uZT0lc1xuIiwgaXNfc3RhbmRhbG9uZSA/ICJ5ZXMiIDogIm5vIik7CisKKyAgICAvKiBJZiB0aGUgY2hpcCBpcyBydW5uaW5nIGluIHN0YW5kYWxvbmUgbW9kZSwgY29ubmVjdCB0byBpdDoKKyAgICAgKiAtIENoZWNrIHRoZSBzdGF0dXMgb2YgdGhlIFBDSWUgY2hhbm5lbCBhbmQgcHJlcGFyZSBpdCBpZiBuZWNlc3NhcnksIHVzaW5nIGhvc3QgY2FsbGJhY2tzCisgICAgICogLSBSZWdpc3RlciB0aGUgZGV2aWNlIGluIHRoZSBGTEQgZHJpdmVyCisgICAgICogLSBVc2UgRkxEIHRvIGFzayB0aGUgZGV2aWNlIHRvIHJlLWluaXRpYWxpemUgaXRzIFBDSWUgdHJhbnNwb3J0IGxheWVyCisgICAgICogLSBJbml0aWFsaXplIHRoZSBob3N0IFBDSWUgdHJhbnNwb3J0IGxheWVyCisgICAgICogT3RoZXJ3aXNlLCB3ZSBtdXN0IHN0YXJ0IHRoZSBib290IHNlcXVlbmNlOgorICAgICAqIC0gUG93ZXIgb24gdGhlIGRldmljZQorICAgICAqIC0gUHJlcGFyZSB0aGUgUENJZSBjaGFubmVsIHZpYSBob3N0IGNhbGxiYWNrCisgICAgICogLSBSZWdpc3RlciB0aGUgZGV2aWNlIGluIHRoZSBGTEQgZHJpdmVyCisgICAgICogLSBDaGVjayBpZiB0aGVyZSBpcyBhbiBleGNlcHRpb24gbG9nIGZyb20gdGhlIGxhc3QgdGltZSB0aGUgYXBwbGljYXRpb24gd2FzIHJ1biAoYW5kIHByaW50IGl0IGlmIHNvKQorICAgICAqIC0gU3RhcnQgdGhlIEZMRCB0aW1lciB0byBsb2FkIHRoZSBib290Y29kZQorICAgICAqIEluIGVpdGhlciBjYXNlLCB0aGUgcmVzdWx0aW5nIHN0YXRlIGlzICdjb25uZWN0aW5nJy4KKyAgICAgKi8KKyAgICBkZXZfY3RybF9kYltkZXZpY2VdLmJvb3Rfc2VxX2luZm8ucG9sbGluZ19jb3VudGVyID0gQk9PVF9TRVFfUE9MTElOR19NQVhfTlVNQkVSOworICAgIGJjbW9zX3RpbWVyX2hhbmRsZXJfc2V0KCZkZXZfY3RybF9kYltkZXZpY2VdLmJvb3Rfc2VxX2luZm8udGltZXIudGltZXIsIGRldl9jdHJsX2Jvb3Rfc2VxX3RpbWVyX2hhbmRsZXIsIGRldmljZSk7CisjZWxzZQorICAgIGlzX3N0YW5kYWxvbmU9IEJDTU9TX1RSVUU7CisjZW5kaWYKKyAgICBpZiAoaXNfc3RhbmRhbG9uZSkKKyAgICB7CisgICAgICAgIGZhaWxfcmVhc29uID0gZGV2X2N0cmxfY29ubmVjdF90b19zdGFuZGFsb25lKGRldmljZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZhaWxfcmVhc29uID0gZGV2X2N0cmxfY29ubmVjdF9mcm9tX3Jlc2V0KGRldmljZSwgMCk7CisgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0uY29ubmVjdGlvbl9pbmZvLnN0YXRlID0gREVWX0NUUkxfQ09OTkVDVElOR19TVEFURV9FU1RBQkxJU0hJTkc7CisgICAgfQorCisgICAgaWYgKGZhaWxfcmVhc29uID09IEJDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fTk9ORSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RpbWVyX3N0YXJ0KCZkZXZfY3RybF9kYltkZXZpY2VdLmNvbm5lY3Rpb25faW5mby50aW1lci50aW1lciwgREVWSUNFX0NPTlRST0xfQ09OTkVDVF9USU1FX1VTKTsKKyAgICAgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zLnN0YXRlID0gQkNNT0xUX0RFVklDRV9TVEFURV9DT05ORUNUSU5HOworICAgICAgICBCQ01fTE9HKERFQlVHLCBkZXZfY3RybF9kYltkZXZpY2VdLmxvZ19pZCwgImJlZ2FuIGNvbm5lY3RpbmcgdG8gJXNcbiIsIGlzX3N0YW5kYWxvbmUgPyAic3RhbmRieSBkZXZpY2UiIDogImRldmljZSBmcm9tIHJlc2V0Iik7CisKKyNpZm5kZWYgSU5fQkFORAorICAgIC8qRG8gbm90aGluZyovCisjZWxzZQorICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGRldmljZSwgY29ubmVjdCwga2V5KTsKKyAgICBvcGVyLmhkci5oZHIudHlwZSA9IEJDTU9MVF9NU0dfVFlQRV9TRVQ7CisgICAgKHZvaWQpYmNtdHJtdXhfY29udHJvbF90b19saW5lKGRldmljZSwgJm9wZXIuaGRyLmhkcik7CisgICAgYmNtb3NfcHJpbnRmKCJTZW50IGNvbm5lY3QgdG8gZW1iZWRkZWQuLi5cbiIpOworI2VuZGlmCisKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgZGV2X2N0cmxfZGJbZGV2aWNlXS5sb2dfaWQsCisgICAgICAgICAgICAiZmFpbGVkIHRvIGJlZ2luIGNvbm5lY3Rpb24gcHJvY2VzczogJXMgKCVkKVxuIiwKKyAgICAgICAgICAgIGJjbV9zdHJfaG9zdF9jb25uZWN0aW9uX2ZhaWxfcmVhc29uKGZhaWxfcmVhc29uKSwKKyAgICAgICAgICAgIGZhaWxfcmVhc29uKTsKKyAgICAgICAgZGV2X2N0cmxfc2VuZF9pbmRfY29ubmVjdGlvbl9mYWlsdXJlKGRldmljZSwgZmFpbF9yZWFzb24pOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZGV2X2N0cmxfZGlzY29ubmVjdGVkX3N0YXRlX2RldmljZV9yZXNldF9ldmVudChiY21vbHRfZGV2aWQgZGV2aWNlLCBjb25zdCBiY21vbHRfbXNnICptc2cpCit7CisgICAgZGV2X2N0cmxfcGVyZm9ybV9yZXNldChkZXZpY2UsIG1zZyk7Cit9CisKKyNpZm5kZWYgSU5fQkFORAorc3RhdGljIHZvaWQgZGV2X2N0cmxfZGlzY29ubmVjdGVkX3N0YXRlX2RldmljZV9ydW5fZGRyX3Rlc3RfZXZlbnQoYmNtb2x0X2RldmlkIGRldmljZSwgY29uc3QgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGJjbW9sdF9ob3N0X2Nvbm5lY3Rpb25fZmFpbF9yZWFzb24gZmFpbF9yZWFzb247CisgICAgdWludDMyX3QgdGVzdF9kZHIgPSAwOworCisgICAgY29uc3QgYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfZGF0YSAqcGFyYW1zID0gJigoY29uc3QgYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3QgKiltc2cpLT5kYXRhOworICAgIGlmIChwYXJhbXMtPmNwdSkKKyAgICB7CisgICAgICAgIHRlc3RfZGRyIHw9IEJDTV9GTERfSE9TVF9SVU5fQ1BVX0REUl9URVNUX01BU0s7CisgICAgfQorICAgIGlmIChwYXJhbXMtPnJhc18wKQorICAgIHsKKyAgICAgICAgdGVzdF9kZHIgfD0gQkNNX0ZMRF9IT1NUX1JVTl9SQVNfMF9URVNUX01BU0s7CisgICAgfQorICAgIGlmIChwYXJhbXMtPnJhc18xKQorICAgIHsKKyAgICAgICAgdGVzdF9kZHIgfD0gQkNNX0ZMRF9IT1NUX1JVTl9SQVNfMV9URVNUX01BU0s7CisgICAgfQorCisgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5ib290X3NlcV9pbmZvLnBvbGxpbmdfY291bnRlciA9IEREUl9URVNUX1BPTExJTkdfTUFYX05VTUJFUjsKKyAgICBiY21vc190aW1lcl9oYW5kbGVyX3NldCgmZGV2X2N0cmxfZGJbZGV2aWNlXS5ib290X3NlcV9pbmZvLnRpbWVyLnRpbWVyLCBkZXZfY3RybF9kZHJfdGVzdF90aW1lcl9oYW5kbGVyLCBkZXZpY2UpOworICAgIGZhaWxfcmVhc29uID0gZGV2X2N0cmxfY29ubmVjdF9mcm9tX3Jlc2V0KGRldmljZSwgdGVzdF9kZHIpOworICAgIGlmIChmYWlsX3JlYXNvbiA9PSBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX05PTkUpCisgICAgeworICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuc3RhdGUgPSBCQ01PTFRfREVWSUNFX1NUQVRFX1RFU1RJTkdfRERSOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlIGluZCA9IHt9OworICAgICAgICBCQ01PTFRfQVVUT19JTklUKCZpbmQsIGRldmljZSwgZGRyX3Rlc3RfY29tcGxldGUpOworICAgICAgICBpbmQuZGF0YS5kZHJfdGVzdC5zdGF0dXMgPSBCQ01PTFRfRERSX1RFU1RfU1RBVFVTX0NPTk5FQ1RJT05fRkFJTEVEOworICAgICAgICBpbmQuZGF0YS5kZHJfdGVzdC51LmNvbm5lY3Rpb25fZmFpbGVkLnJlYXNvbiA9IGZhaWxfcmVhc29uOworICAgICAgICBkZXZfY3RybF9zZW5kX2luZGljYXRpb24oZGV2aWNlLCAmaW5kLmhkci5oZHIpOworICAgIH0KKworfQorCitzdGF0aWMgdm9pZCBkZXZfY3RybF90ZXN0aW5nX2Rkcl9zdGF0ZV9kZHJfdGVzdF9jb21wbGV0ZWRfZXZlbnQoYmNtb2x0X2RldmlkIGRldmljZSwgY29uc3QgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGUgaW5kID0ge307CisKKyAgICBCQ01PTFRfQVVUT19JTklUKCZpbmQsIGRldmljZSwgZGRyX3Rlc3RfY29tcGxldGUpOworCisgICAgaW5kLmRhdGEuZGRyX3Rlc3Quc3RhdHVzID0gQkNNT0xUX0REUl9URVNUX1NUQVRVU19DT01QTEVURUQ7CisgICAgaW5kLmRhdGEuZGRyX3Rlc3QudS5jb21wbGV0ZWQuY3B1X3Jlc3VsdCA9IGJjbV9mbGRfZGRyX3Rlc3RfcmVzdWx0X2dldChkZXZpY2UsIDApOworICAgIGluZC5kYXRhLmRkcl90ZXN0LnUuY29tcGxldGVkLnJhc18wX3Jlc3VsdCA9IGJjbV9mbGRfZGRyX3Rlc3RfcmVzdWx0X2dldChkZXZpY2UsIDEpOworICAgIGluZC5kYXRhLmRkcl90ZXN0LnUuY29tcGxldGVkLnJhc18xX3Jlc3VsdCA9IGJjbV9mbGRfZGRyX3Rlc3RfcmVzdWx0X2dldChkZXZpY2UsIDIpOworCisgICAgZGV2X2N0cmxfcGVyZm9ybV9yZXNldF9kZXZpY2UoZGV2aWNlKTsKKyAgICBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuc3RhdGUgPSBCQ01PTFRfREVWSUNFX1NUQVRFX0RJU0NPTk5FQ1RFRDsKKworICAgIGRldl9jdHJsX3NlbmRfaW5kaWNhdGlvbihkZXZpY2UsICZpbmQuaGRyLmhkcik7Cit9CisKK3N0YXRpYyB2b2lkIGRldl9jdHJsX3Rlc3RpbmdfZGRyX3N0YXRlX2Rkcl90ZXN0X3RpbWVvdXRfZXZlbnQoYmNtb2x0X2RldmlkIGRldmljZSwgY29uc3QgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGUgaW5kID0ge307CisKKyAgICBkZXZfY3RybF9wZXJmb3JtX3Jlc2V0X2RldmljZShkZXZpY2UpOworICAgIGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtcy5zdGF0ZSA9IEJDTU9MVF9ERVZJQ0VfU1RBVEVfRElTQ09OTkVDVEVEOworCisgICAgQkNNT0xUX0FVVE9fSU5JVCgmaW5kLCBkZXZpY2UsIGRkcl90ZXN0X2NvbXBsZXRlKTsKKyAgICBpbmQuZGF0YS5kZHJfdGVzdC5zdGF0dXMgPSBCQ01PTFRfRERSX1RFU1RfU1RBVFVTX1RJTUVPVVQ7CisgICAgZGV2X2N0cmxfc2VuZF9pbmRpY2F0aW9uKGRldmljZSwgJmluZC5oZHIuaGRyKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBkZXZfY3RybF9jb25uZWN0aW5nX3N0YXRlX2Nvbm5lY3Rpb25fZmFpbHVyZV9ldmVudChiY21vbHRfZGV2aWQgZGV2aWNlLCBjb25zdCBiY21vbHRfbXNnICptc2cpCit7CisgICAgZGV2X2N0cmxfZGlzY29ubmVjdChkZXZpY2UpOworICAgIGRldl9jdHJsX3NlbmRfaW5kX2Nvbm5lY3Rpb25fZmFpbHVyZV9mcm9tX21zZyhkZXZpY2UsIG1zZyk7Cit9CisKK3N0YXRpYyB2b2lkIGRldl9jdHJsX2Nvbm5lY3Rpbmdfc3RhdGVfY29ubmVjdGlvbl9lc3RhYmxpc2hlZF9ldmVudChiY21vbHRfZGV2aWQgZGV2aWNlLCBjb25zdCBiY21vbHRfbXNnICptc2cpCit7CisgICAgaWYgKGRldl9jdHJsX2RiW2RldmljZV0uY29ubmVjdGlvbl9pbmZvLnN0YXRlID09IERFVl9DVFJMX0NPTk5FQ1RJTkdfU1RBVEVfRVNUQUJMSVNISU5HKQorICAgIHsKKyAgICAgICAgLyogSW5pdGlhbCBjb25uZWN0aW9uIGlzIGNvbXBsZXRlLCBub3cgd2FpdCBmb3IgdGhlIGZpcm13YXJlIHRvIGJlIGluaXRpYWxpemVkLiAqLworICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmNvbm5lY3Rpb25faW5mby5zdGF0ZSA9IERFVl9DVFJMX0NPTk5FQ1RJTkdfU1RBVEVfQ09ORklHVVJJTkc7CisgICAgICAgIGRldl9jdHJsX3NlbmRfY29uZmlnX3NldF9tc2coCisgICAgICAgICAgICBkZXZpY2UsCisgICAgICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXNfcHJlc2VudCwKKyAgICAgICAgICAgIDAsCisgICAgICAgICAgICAmZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zKTsKKyAgICAgICAgaWYgKGRldl9jdHJsX2RiW2RldmljZV0uY29ubmVjdGlvbl9pbmZvLmNvbmZpZ19zZW5kX2NvdW50ZXIgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmNvbm5lY3Rpb25faW5mby5jb25maWdfc2VuZF9jb3VudGVyLS07CisgICAgICAgIH0KKyAgICAgICAgYmNtb3NfdGltZXJfc3RhcnQoCisgICAgICAgICAgICAmZGV2X2N0cmxfZGJbZGV2aWNlXS5jb25uZWN0aW9uX2luZm8udGltZXIudGltZXIsCisgICAgICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmNvbm5lY3Rpb25faW5mby5jb25maWdfaW50ZXJ2YWwpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBJbml0aWFsIGNvbm5lY3Rpb24gd2FzIGFscmVhZHkgZG9uZSAtIHNvbWV0aGluZyBtdXN0IGhhdmUgZ29uZSB3cm9uZy4gIFRyeSBhZ2Fpbi4gKi8KKyAgICAgICAgaWYgKGRldl9jdHJsX2RiW2RldmljZV0uY29ubmVjdGlvbl9pbmZvLmNvbmZpZ19zZW5kX2NvdW50ZXIgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBkZXZfY3RybF9zZW5kX2NvbmZpZ19zZXRfbXNnKAorICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICAgICAgICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXNfcHJlc2VudCwKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICZkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMpOworICAgICAgICAgICAgYmNtb3NfdGltZXJfc3RhcnQoCisgICAgICAgICAgICAgICAgJmRldl9jdHJsX2RiW2RldmljZV0uY29ubmVjdGlvbl9pbmZvLnRpbWVyLnRpbWVyLAorICAgICAgICAgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0uY29ubmVjdGlvbl9pbmZvLmNvbmZpZ19pbnRlcnZhbCk7CisgICAgICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmNvbm5lY3Rpb25faW5mby5jb25maWdfc2VuZF9jb3VudGVyLS07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBkZXZfY3RybF9kaXNjb25uZWN0KGRldmljZSk7CisgICAgICAgICAgICBkZXZfY3RybF9zZW5kX2luZF9jb25uZWN0aW9uX2ZhaWx1cmUoZGV2aWNlLCBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX1RJTUVPVVQpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgZGV2X2N0cmxfbm5pX3NwZWVkX2VxdWFsKGNvbnN0IGJjbW9sdF9kZXZpY2Vfbm5pX3NwZWVkICphLCBjb25zdCBiY21vbHRfZGV2aWNlX25uaV9zcGVlZCAqYikKK3sKKyAgICByZXR1cm4gKGEtPmZpcnN0X2hhbGYgPT0gYi0+Zmlyc3RfaGFsZiAmJiBhLT5zZWNvbmRfaGFsZiA9PSBiLT5zZWNvbmRfaGFsZik7Cit9CisKK3N0YXRpYyB2b2lkIGRldl9jdHJsX2Nvbm5lY3Rpbmdfc3RhdGVfZGV2aWNlX3JlYWR5X2V2ZW50KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGNvbnN0IGJjbW9sdF9tc2cgKm1zZykKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBjb25zdCBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeSAqcmVhZHlfbXNnID0gKGNvbnN0IGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5ICopbXNnOworICAgIGJjbW9sdF9ob3N0X2Nvbm5lY3Rpb25fZmFpbF9yZWFzb24gZmFpbF9yZWFzb24gPSBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX19OVU1fT0Y7CisKKyAgICBpZiAoZGV2X2N0cmxfZGJbZGV2aWNlXS5jb25uZWN0aW9uX2luZm8uc3RhdGUgPT0gREVWX0NUUkxfQ09OTkVDVElOR19TVEFURV9FU1RBQkxJU0hJTkcpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBkZXZfY3RybF9kYltkZXZpY2VdLmxvZ19pZCwgIlVuZXhwZWN0ZWQgJ2RldmljZSByZWFkeScgaW5kaWNhdGlvbiBiZWZvcmUgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZFxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAocmVhZHlfbXNnLT5kYXRhLnN5c3RlbV9tb2RlICE9IGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtcy5zeXN0ZW1fbW9kZSkKKyAgICB7CisgICAgICAgIGZhaWxfcmVhc29uID0gQkNNT0xUX0hPU1RfQ09OTkVDVElPTl9GQUlMX1JFQVNPTl9TWVNURU1fTU9ERV9NSVNNQVRDSDsKKyAgICB9CisgICAgZWxzZSBpZiAoKGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtc19wcmVzZW50ICYgQkNNT0xUX1BST1BfTUFTS19HRVQoZGV2aWNlLCBfY2ZnLCBubmlfc3BlZWQpKSAhPSAwICYmCisgICAgICAgICFkZXZfY3RybF9ubmlfc3BlZWRfZXF1YWwoJnJlYWR5X21zZy0+ZGF0YS5ubmlfc3BlZWQsICZkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMubm5pX3NwZWVkKSkKKyAgICB7CisgICAgICAgIGZhaWxfcmVhc29uID0gQkNNT0xUX0hPU1RfQ09OTkVDVElPTl9GQUlMX1JFQVNPTl9OTklfU1BFRURfTUlTTUFUQ0g7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJjID0gZGV2X2N0cmxfdmFsaWRhdGVfZndfdmVyc2lvbihkZXZpY2UsICZyZWFkeV9tc2ctPmRhdGEuZmlybXdhcmVfc3dfdmVyc2lvbik7CisgICAgICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICBmYWlsX3JlYXNvbiA9IEJDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fU09GVFdBUkVfVkVSU0lPTl9NSVNNQVRDSDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChmYWlsX3JlYXNvbiA9PSBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX19OVU1fT0YpCisgICAgeworICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuZmlybXdhcmVfc3dfdmVyc2lvbiA9IHJlYWR5X21zZy0+ZGF0YS5maXJtd2FyZV9zd192ZXJzaW9uOworICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuY2hpcF9yZXZpc2lvbiA9IHJlYWR5X21zZy0+ZGF0YS5jaGlwX3JldmlzaW9uOworICAgICAgICBpZiAoKGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtc19wcmVzZW50ICYgQkNNT0xUX1BST1BfTUFTS19HRVQoZGV2aWNlLCBfY2ZnLCBubmlfc3BlZWQpKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMubm5pX3NwZWVkID0gcmVhZHlfbXNnLT5kYXRhLm5uaV9zcGVlZDsKKyAgICAgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtc19wcmVzZW50IHw9IEJDTU9MVF9QUk9QX01BU0tfR0VUKGRldmljZSwgX2NmZywgbm5pX3NwZWVkKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZXZfY3RybF9kYltkZXZpY2VdLmthX2luZm8ua2FfaW50ZXJ2YWwgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBzdGFydF9rZWVwX2FsaXZlX3Byb2Nlc3MoJmRldl9jdHJsX2RiW2RldmljZV0ua2FfaW5mbyk7CisgICAgICAgIH0KKworI2lmbmRlZiBJTl9CQU5ECisgICAgICAgIGJjbW9zX3RpbWVyX3N0YXJ0KCZkZXZfY3RybF9kYltkZXZpY2VdLmV4Y2VwdGlvbl9tb25pdG9yX3RpbWVyLnRpbWVyLCBFWENFUFRJT05fTE9HX01PTklUT1JfSU5URVJWQUwpOworI2VuZGlmCisgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtcy5zdGF0ZSA9IEJDTU9MVF9ERVZJQ0VfU1RBVEVfUkVBRFk7CisgICAgICAgIGRldl9jdHJsX3NlbmRfaW5kX2Nvbm5lY3Rpb25fY29tcGxldGUoCisgICAgICAgICAgICBkZXZpY2UsCisgICAgICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmNvbm5lY3Rpb25faW5mby5zdGF0ZSA9PSBERVZfQ1RSTF9DT05ORUNUSU5HX1NUQVRFX1NUQU5EQUxPTkUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBkZXZfY3RybF9zZW5kX2RldmljZV9kaXNjb25uZWN0X21zZyhkZXZpY2UsIDApOworICAgICAgICBkZXZfY3RybF9kaXNjb25uZWN0KGRldmljZSk7CisgICAgICAgIGRldl9jdHJsX3NlbmRfaW5kX2Nvbm5lY3Rpb25fZmFpbHVyZShkZXZpY2UsIGZhaWxfcmVhc29uKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRldl9jdHJsX2Nvbm5lY3Rpbmdfc3RhdGVfcmVjZWl2ZWRfYWNrKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGNvbnN0IGJjbW9sdF9tc2cgKm1zZykKK3sKKyAgICAvKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHdlIHJlY2VpdmUgdGhlIEFDSyByZXNwb25zZSBhZ2FpbnN0IHRoZSBjb25maWd1cmFpdG9uIHNldCBtZXNzYWdlIHdoaWNoIHdhcyBzZW50IHdoaWxlIHRoZQorICAgICAqIHN0YXRlLW1hY2hpbmUgYXMgcGFydCBvZiB0aGUgaW5pdGlhbCBjb25uZWN0aW9uIHByb2Nlc3MuICBJZiB0aGUgcmVzdWx0IGlzIE9LLCB3ZSBzaG91bGQganVzdCBtb3ZlIG9uIGFuZCBrZWVwCisgICAgICogd2FpdGluZyBmb3IgdGhlICJyZWFkeSIgaW5kaWNhdGlvbi4gIElmIHRoZSByZXN1bHQgaXMgbm90IE9LLCB0aGUgZGV2aWNlIHJlamVjdGVkIHRoZSBjb25maWd1cmF0aW9uIHNvIHdlCisgICAgICogc2hvdWxkIGRpc2Nvbm5lY3QgdGhlIGRldmljZSBhbmQgc2VuZCBhIGZhaWx1cmUgaW5kaWNhdGlvbi4gKi8KKyAgICBpZiAobXNnLT5lcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIGJjbW9sdF9ob3N0X2Nvbm5lY3Rpb25fZmFpbF9yZWFzb24gZmFpbF9yZWFzb247CisKKyAgICAgICAgZGV2X2N0cmxfZGlzY29ubmVjdChkZXZpY2UpOworCisgICAgICAgIC8qIEZpZ3VyZSBvdXQgd2hpY2ggZmFpbHVyZSByZWFzb24gYmFzZWQgb24gdGhlIG1lc3NhZ2UgZXJyb3IgY29kZS4gKi8KKyAgICAgICAgc3dpdGNoIChtc2ctPmVycikKKyAgICAgICAgeworICAgICAgICBjYXNlIEJDTV9FUlJfTk9UX1NVUFBPUlRFRDoKKyAgICAgICAgICAgIGZhaWxfcmVhc29uID0gQkNNT0xUX0hPU1RfQ09OTkVDVElPTl9GQUlMX1JFQVNPTl9TWVNURU1fTU9ERV9OT1RfU1VQUE9SVEVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNX0VSUl9QQVJNOgorICAgICAgICAgICAgZmFpbF9yZWFzb24gPSBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX1BBUkFNRVRFUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZmFpbF9yZWFzb24gPSBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX0lOVEVSTkFMX0VSUk9SOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZXZfY3RybF9zZW5kX2luZF9jb25uZWN0aW9uX2ZhaWx1cmUoZGV2aWNlLCBmYWlsX3JlYXNvbik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkZXZfY3RybF9yZWFkeV9zdGF0ZV9kZXZpY2VfY29uZmlnX3NldF9ldmVudChiY21vbHRfZGV2aWQgZGV2aWNlLCBjb25zdCBiY21vbHRfbXNnICptc2cpCit7CisgICAgY29uc3QgYmNtb2x0X2RldmljZV9jZmcgKmNmZyA9IChjb25zdCBiY21vbHRfZGV2aWNlX2NmZyAqKW1zZzsKKworICAgIGRldl9jdHJsX3NlbmRfY29uZmlnX3NldF9tc2coZGV2aWNlLCBtc2ctPnByZXNlbmNlX21hc2ssIGRldl9jdHJsX2RiW2RldmljZV0ubGFzdF9tZXNzYWdlLT5jb3JyX3RhZywgJmNmZy0+ZGF0YSk7CisKKyAgICBiY21vc190aW1lcl9zdGFydCgmZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcmVzcG9uc2VfdGltZXIudGltZXIsIERFVklDRV9SRVNQT05TRV9USU1FT1VUX0xFTkdUSCk7CisgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zLnN0YXRlID0gQkNNT0xUX0RFVklDRV9TVEFURV9XQUlUSU5HX0ZPUl9ERVZJQ0U7Cit9CisKK3N0YXRpYyB2b2lkIGRldl9jdHJsX3JlYWR5X3N0YXRlX2RldmljZV9jb25maWdfZ2V0X2V2ZW50KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGNvbnN0IGJjbW9sdF9tc2cgKm1zZykKK3sKKyAgICBiY21vbHRfcHJlc2VuY2VfbWFzayBtYXNrOworCisgICAgaWYgKGRldl9jdHJsX2RiW2RldmljZV0ubGFzdF9tZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBkZXZfY3RybF9kYltkZXZpY2VdLmxvZ19pZCwgIk91ciBzYXZlZCBtZXNzYWdlIHdhcyBpbnZhbGlkIC0tLSBhYm9ydGluZ1xuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtYXNrID0gZGV2X2N0cmxfZmlsbF9mcm9tX2xvY2FsKGRldmljZSk7CisgICAgaWYgKG1hc2sgPT0gMCkKKyAgICB7CisgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0ubGFzdF9tZXNzYWdlLT5kaXIgPSBCQ01PTFRfTVNHX0RJUl9SRVNQT05TRTsKKyAgICAgICAgYmNtdHJtdXhfY29udHJvbF90b19ob3N0KGRldmljZSwgZGV2X2N0cmxfZGJbZGV2aWNlXS5sYXN0X21lc3NhZ2UpOworICAgICAgICBiY21vbHRfbXNnX2ZyZWUoZGV2X2N0cmxfZGJbZGV2aWNlXS5sYXN0X21lc3NhZ2UpOworICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmxhc3RfbWVzc2FnZSA9IE5VTEw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbW9zX3RpbWVyX3N0YXJ0KCZkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9yZXNwb25zZV90aW1lci50aW1lciwgREVWSUNFX1JFU1BPTlNFX1RJTUVPVVRfTEVOR1RIKTsKKyAgICAgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zLnN0YXRlID0gQkNNT0xUX0RFVklDRV9TVEFURV9XQUlUSU5HX0ZPUl9ERVZJQ0U7CisgICAgICAgIGRldl9jdHJsX3NlbmRfY29uZmlnX2dldF9tc2coZGV2aWNlLCBtYXNrLCBkZXZfY3RybF9kYltkZXZpY2VdLmxhc3RfbWVzc2FnZS0+Y29ycl90YWcpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZGV2X2N0cmxfcmVhZHlfc3RhdGVfZGV2aWNlX2Rpc2Nvbm5lY3RfZXZlbnQoYmNtb2x0X2RldmlkIGRldmljZSwgY29uc3QgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGRldl9jdHJsX3NlbmRfZGV2aWNlX2Rpc2Nvbm5lY3RfbXNnKGRldmljZSwgMCk7CisgICAgZGV2X2N0cmxfZGlzY29ubmVjdChkZXZpY2UpOworICAgIGRldl9jdHJsX3NlbmRfaW5kX2Rpc2Nvbm5lY3Rpb25fY29tcGxldGUoZGV2aWNlKTsKK30KKworc3RhdGljIHZvaWQgZGV2X2N0cmxfcmVhZHlfc3RhdGVfZGV2aWNlX3Jlc2V0X2V2ZW50KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGNvbnN0IGJjbW9sdF9tc2cgKm1zZykKK3sKKyAgICBkZXZfY3RybF9wZXJmb3JtX3Jlc2V0KGRldmljZSwgbXNnKTsKKyAgICBkZXZfY3RybF9zZW5kX2luZF9kaXNjb25uZWN0aW9uX2NvbXBsZXRlKGRldmljZSk7Cit9CisKK3N0YXRpYyB2b2lkIGRldl9jdHJsX3JlYWR5X3N0YXRlX2Nvbm5lY3Rpb25fZmFpbHVyZV9ldmVudChiY21vbHRfZGV2aWQgZGV2aWNlLCBjb25zdCBiY21vbHRfbXNnICptc2cpCit7CisgICAgZGV2X2N0cmxfZGlzY29ubmVjdChkZXZpY2UpOworICAgIGRldl9jdHJsX3NlbmRfaW5kX2Nvbm5lY3Rpb25fZmFpbHVyZV9mcm9tX21zZyhkZXZpY2UsIG1zZyk7Cit9CisKK3N0YXRpYyB2b2lkIGRldl9jdHJsX3dhaXRpbmdfZm9yX2RldmljZV9zdGF0ZV90aW1lcl90aW1lb3V0KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGNvbnN0IGJjbW9sdF9tc2cgKm1zZykKK3sKKyAgICBpZiAoZGV2X2N0cmxfZGJbZGV2aWNlXS5sYXN0X21lc3NhZ2UgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGRldl9jdHJsX2RiW2RldmljZV0ubG9nX2lkLCAiT3VyIHNhdmVkIG1lc3NhZ2Ugd2FzIGludmFsaWQgLS0tIGFib3J0aW5nXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJjbW9sdF9tc2dfZXJyKAorICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmxhc3RfbWVzc2FnZSwKKyAgICAgICAgREVWX0xPR19JTlZBTElEX0lELAorICAgICAgICBCQ01fRVJSX0lOVEVSTkFMLAorICAgICAgICBCQ01PTFRfRVJSX0ZJRUxEX05PTkUsCisgICAgICAgICJObyByZXNwb25zZSB0byBjb25maWd1cmF0aW9uIG1lc3NhZ2UgZnJvbSBlbWJlZGRlZCIpOworICAgIGRldl9jdHJsX2RiW2RldmljZV0ubGFzdF9tZXNzYWdlLT5kaXIgPSBCQ01PTFRfTVNHX0RJUl9SRVNQT05TRTsKKyAgICBiY210cm11eF9jb250cm9sX3RvX2hvc3QoZGV2aWNlLCBkZXZfY3RybF9kYltkZXZpY2VdLmxhc3RfbWVzc2FnZSk7CisgICAgYmNtb2x0X21zZ19mcmVlKGRldl9jdHJsX2RiW2RldmljZV0ubGFzdF9tZXNzYWdlKTsKKyAgICBkZXZfY3RybF9kYltkZXZpY2VdLmxhc3RfbWVzc2FnZSA9IE5VTEw7CisgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zLnN0YXRlID0gQkNNT0xUX0RFVklDRV9TVEFURV9SRUFEWTsKK30KKworc3RhdGljIHZvaWQgZGV2X2N0cmxfd2FpdGluZ19mb3JfZGV2aWNlX3N0YXRlX3JlY2VpdmVkX2FjayhiY21vbHRfZGV2aWQgZGV2aWNlLCBjb25zdCBiY21vbHRfbXNnICptc2cpCit7CisgICAgYmNtb3NfdGltZXJfc3RvcCgmZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcmVzcG9uc2VfdGltZXIudGltZXIpOworCisgICAgaWYgKGRldl9jdHJsX2RiW2RldmljZV0ubGFzdF9tZXNzYWdlID09IE5VTEwpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBkZXZfY3RybF9kYltkZXZpY2VdLmxvZ19pZCwgIk91ciBzYXZlZCBtZXNzYWdlIHdhcyBpbnZhbGlkIC0tLSBhYm9ydGluZ1xuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobXNnLT5jb3JyX3RhZyAhPSBkZXZfY3RybF9kYltkZXZpY2VdLmxhc3RfbWVzc2FnZS0+Y29ycl90YWcpCisgICAgeworICAgICAgICAvKiBpZ25vcmUgdGhpcyByZXNwb25zZSBhcyBpdCB3YXMgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gb3VyIHJlcXVlc3QgKi8KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtc2ctPmVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5sYXN0X21lc3NhZ2UtPmVyciA9IG1zZy0+ZXJyOworICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmxhc3RfbWVzc2FnZS0+ZXJyX2ZpZWxkX2lkeCA9IG1zZy0+ZXJyX2ZpZWxkX2lkeDsKKyAgICAgICAgbWVtY3B5KGRldl9jdHJsX2RiW2RldmljZV0ubGFzdF9tZXNzYWdlLT5lcnJfdGV4dCwgbXNnLT5lcnJfdGV4dCwgc2l6ZW9mKG1zZy0+ZXJyX3RleHQpKTsKKyAgICAgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5sYXN0X21lc3NhZ2UtPmRpciA9IEJDTU9MVF9NU0dfRElSX1JFU1BPTlNFOworICAgICAgICBiY210cm11eF9jb250cm9sX3RvX2hvc3QoZGV2aWNlLCBkZXZfY3RybF9kYltkZXZpY2VdLmxhc3RfbWVzc2FnZSk7CisgICAgICAgIGJjbW9sdF9tc2dfZnJlZShkZXZfY3RybF9kYltkZXZpY2VdLmxhc3RfbWVzc2FnZSk7CisgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0ubGFzdF9tZXNzYWdlID0gTlVMTDsKKyAgICAgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zLnN0YXRlID0gQkNNT0xUX0RFVklDRV9TVEFURV9SRUFEWTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtc2ctPnR5cGUgPT0gQkNNT0xUX01TR19UWVBFX0dFVCkKKyAgICB7CisgICAgICAgIGNvbnN0IGJjbW9sdF9kZXZpY2VfY2ZnICpzb3VyY2UgPSAoY29uc3QgYmNtb2x0X2RldmljZV9jZmcgKiltc2c7CisgICAgICAgIGJjbW9sdF9kZXZpY2VfY2ZnICpkZXN0ID0gKGJjbW9sdF9kZXZpY2VfY2ZnICopZGV2X2N0cmxfZGJbZGV2aWNlXS5sYXN0X21lc3NhZ2U7CisgICAgICAgIGlmIChCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKHNvdXJjZSwgZGV2aWNlLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19leHRfaXJxKSkKKyAgICAgICAgeworICAgICAgICAgICAgZGVzdC0+ZGF0YS5wcm90ZWN0aW9uX3N3aXRjaGluZ19leHRfaXJxID0gc291cmNlLT5kYXRhLnByb3RlY3Rpb25fc3dpdGNoaW5nX2V4dF9pcnE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoc291cmNlLCBkZXZpY2UsIGVwb25fY2xvY2tfdHJhbnNwb3J0X3NhbXBsZV9kZWxheSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlc3QtPmRhdGEuZXBvbl9jbG9ja190cmFuc3BvcnRfc2FtcGxlX2RlbGF5ID0gc291cmNlLT5kYXRhLmVwb25fY2xvY2tfdHJhbnNwb3J0X3NhbXBsZV9kZWxheTsKKyAgICAgICAgfQorICAgICAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChzb3VyY2UsIGRldmljZSwgaW5kaWNhdGlvbl9zaGFwaW5nKSkKKyAgICAgICAgeworICAgICAgICAgICAgZGVzdC0+ZGF0YS5pbmRpY2F0aW9uX3NoYXBpbmcgPSBzb3VyY2UtPmRhdGEuaW5kaWNhdGlvbl9zaGFwaW5nOworICAgICAgICB9CisgICAgICAgIGlmIChCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKHNvdXJjZSwgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9lbmFibGUpKQorICAgICAgICB7CisgICAgICAgICAgICBkZXN0LT5kYXRhLmdwb25feGdwb25fdG9kX2VuYWJsZSA9IHNvdXJjZS0+ZGF0YS5ncG9uX3hncG9uX3RvZF9lbmFibGU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoc291cmNlLCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2dwaW9fcGluKSkKKyAgICAgICAgeworICAgICAgICAgICAgZGVzdC0+ZGF0YS5ncG9uX3hncG9uX3RvZF9ncGlvX3BpbiA9IHNvdXJjZS0+ZGF0YS5ncG9uX3hncG9uX3RvZF9ncGlvX3BpbjsKKyAgICAgICAgfQorICAgICAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChzb3VyY2UsIGRldmljZSwgZ3Bvbl94Z3Bvbl90b2RfY29ubmVjdGVkX2ludGVybmFsbHkpKQorICAgICAgICB7CisgICAgICAgICAgICBkZXN0LT5kYXRhLmdwb25feGdwb25fdG9kX2Nvbm5lY3RlZF9pbnRlcm5hbGx5ID0gc291cmNlLT5kYXRhLmdwb25feGdwb25fdG9kX2Nvbm5lY3RlZF9pbnRlcm5hbGx5OworICAgICAgICB9CisgICAgICAgIGlmIChCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKHNvdXJjZSwgZGV2aWNlLCBlcG9uXzgwMjFfYXNfdG9kX2Zvcm1hdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlc3QtPmRhdGEuZXBvbl84MDIxX2FzX3RvZF9mb3JtYXQgPSBzb3VyY2UtPmRhdGEuZXBvbl84MDIxX2FzX3RvZF9mb3JtYXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoc291cmNlLCBkZXZpY2UsIGZpcm13YXJlX3N3X3ZlcnNpb24pKQorICAgICAgICB7CisgICAgICAgICAgICBkZXN0LT5kYXRhLmZpcm13YXJlX3N3X3ZlcnNpb24gPSBzb3VyY2UtPmRhdGEuZmlybXdhcmVfc3dfdmVyc2lvbjsKKyAgICAgICAgfQorICAgICAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChzb3VyY2UsIGRldmljZSwgY2hpcF9yZXZpc2lvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlc3QtPmRhdGEuY2hpcF9yZXZpc2lvbiA9IHNvdXJjZS0+ZGF0YS5jaGlwX3JldmlzaW9uOworICAgICAgICB9CisgICAgICAgIGlmIChCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKHNvdXJjZSwgZGV2aWNlLCBjaGlwX3RlbXBlcmF0dXJlKSkKKyAgICAgICAgeworICAgICAgICAgICAgZGVzdC0+ZGF0YS5jaGlwX3RlbXBlcmF0dXJlID0gc291cmNlLT5kYXRhLmNoaXBfdGVtcGVyYXR1cmU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoc291cmNlLCBkZXZpY2UsIGVwb25fc2hhcGVyX21vZGUpKQorICAgICAgICB7CisgICAgICAgICAgICBkZXN0LT5kYXRhLmVwb25fc2hhcGVyX21vZGUgPSBzb3VyY2UtPmRhdGEuZXBvbl9zaGFwZXJfbW9kZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChzb3VyY2UsIGRldmljZSwgZW1iZWRkZWRfaW1hZ2VfbGlzdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlc3QtPmRhdGEuZW1iZWRkZWRfaW1hZ2VfbGlzdCA9IHNvdXJjZS0+ZGF0YS5lbWJlZGRlZF9pbWFnZV9saXN0OworICAgICAgICB9CisgICAgICAgIGlmIChCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKHNvdXJjZSwgZGV2aWNlLCBjaGlwX3ZvbHRhZ2UpKQorICAgICAgICB7CisgICAgICAgICAgICBkZXN0LT5kYXRhLmNoaXBfdm9sdGFnZSA9IHNvdXJjZS0+ZGF0YS5jaGlwX3ZvbHRhZ2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoc291cmNlLCBkZXZpY2UsIGVwb25fdG9kX3N0cmluZykpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlc3QtPmRhdGEuZXBvbl90b2Rfc3RyaW5nID0gc291cmNlLT5kYXRhLmVwb25fdG9kX3N0cmluZzsKKyAgICAgICAgfQorICAgICAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChzb3VyY2UsIGRldmljZSwgeGdwb25fbnVtX29mX29udXMpKQorICAgICAgICB7CisgICAgICAgIAlkZXN0LT5kYXRhLnhncG9uX251bV9vZl9vbnVzID0gc291cmNlLT5kYXRhLnhncG9uX251bV9vZl9vbnVzOworICAgICAgICB9CisgICAgICAgIGlmIChCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKHNvdXJjZSwgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9zdHJpbmdfbGVuZ3RoKSkKKyAgICAgICAgeworICAgICAgICAJZGVzdC0+ZGF0YS5ncG9uX3hncG9uX3RvZF9zdHJpbmdfbGVuZ3RoID0gc291cmNlLT5kYXRhLmdwb25feGdwb25fdG9kX3N0cmluZ19sZW5ndGg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEJDTU9MVF9DRkdfUFJPUF9JU19TRVQoc291cmNlLCBkZXZpY2UsIHRvZF91YXJ0X2JhdWRyYXRlKSkKKyAgICAgICAgeworICAgICAgICAJZGVzdC0+ZGF0YS50b2RfdWFydF9iYXVkcmF0ZSA9IHNvdXJjZS0+ZGF0YS50b2RfdWFydF9iYXVkcmF0ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtc2ctPnR5cGUgPT0gQkNNT0xUX01TR19UWVBFX1NFVCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9kZXZpY2VfY2ZnICpzb3VyY2UgPSAoYmNtb2x0X2RldmljZV9jZmcgKilkZXZfY3RybF9kYltkZXZpY2VdLmxhc3RfbWVzc2FnZTsKKyAgICAgICAgYmNtb2x0X2RldmljZV9jZmdfZGF0YSAqZGVzdCA9ICZkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXM7CisgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtc19wcmVzZW50IHw9IHNvdXJjZS0+aGRyLmhkci5wcmVzZW5jZV9tYXNrOworICAgICAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChzb3VyY2UsIGRldmljZSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZXh0X2lycSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlc3QtPnByb3RlY3Rpb25fc3dpdGNoaW5nX2V4dF9pcnEgPSBzb3VyY2UtPmRhdGEucHJvdGVjdGlvbl9zd2l0Y2hpbmdfZXh0X2lycTsKKyAgICAgICAgfQorICAgICAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChzb3VyY2UsIGRldmljZSwgZXBvbl9jbG9ja190cmFuc3BvcnRfc2FtcGxlX2RlbGF5KSkKKyAgICAgICAgeworICAgICAgICAgICAgZGVzdC0+ZXBvbl9jbG9ja190cmFuc3BvcnRfc2FtcGxlX2RlbGF5ID0gc291cmNlLT5kYXRhLmVwb25fY2xvY2tfdHJhbnNwb3J0X3NhbXBsZV9kZWxheTsKKyAgICAgICAgfQorICAgICAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChzb3VyY2UsIGRldmljZSwgaW5kaWNhdGlvbl9zaGFwaW5nKSkKKyAgICAgICAgeworICAgICAgICAgICAgZGVzdC0+aW5kaWNhdGlvbl9zaGFwaW5nID0gc291cmNlLT5kYXRhLmluZGljYXRpb25fc2hhcGluZzsKKyAgICAgICAgfQorICAgICAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChzb3VyY2UsIGRldmljZSwgZ3Bvbl94Z3Bvbl90b2RfZW5hYmxlKSkKKyAgICAgICAgeworICAgICAgICAgICAgZGVzdC0+Z3Bvbl94Z3Bvbl90b2RfZW5hYmxlID0gc291cmNlLT5kYXRhLmdwb25feGdwb25fdG9kX2VuYWJsZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChzb3VyY2UsIGRldmljZSwgZ3Bvbl94Z3Bvbl90b2RfZ3Bpb19waW4pKQorICAgICAgICB7CisgICAgICAgICAgICBkZXN0LT5ncG9uX3hncG9uX3RvZF9ncGlvX3BpbiA9IHNvdXJjZS0+ZGF0YS5ncG9uX3hncG9uX3RvZF9ncGlvX3BpbjsKKyAgICAgICAgfQorICAgICAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChzb3VyY2UsIGRldmljZSwgZ3Bvbl94Z3Bvbl90b2RfY29ubmVjdGVkX2ludGVybmFsbHkpKQorICAgICAgICB7CisgICAgICAgICAgICBkZXN0LT5ncG9uX3hncG9uX3RvZF9jb25uZWN0ZWRfaW50ZXJuYWxseSA9IHNvdXJjZS0+ZGF0YS5ncG9uX3hncG9uX3RvZF9jb25uZWN0ZWRfaW50ZXJuYWxseTsKKyAgICAgICAgfQorICAgICAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChzb3VyY2UsIGRldmljZSwgZXBvbl84MDIxX2FzX3RvZF9mb3JtYXQpKQorICAgICAgICB7CisgICAgICAgICAgICBkZXN0LT5lcG9uXzgwMjFfYXNfdG9kX2Zvcm1hdCA9IHNvdXJjZS0+ZGF0YS5lcG9uXzgwMjFfYXNfdG9kX2Zvcm1hdDsKKyAgICAgICAgfQorICAgICAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChzb3VyY2UsIGRldmljZSwgZXBvbl90b2Rfc3RyaW5nKSkKKyAgICAgICAgeworICAgICAgICAgICAgZGVzdC0+ZXBvbl90b2Rfc3RyaW5nID0gc291cmNlLT5kYXRhLmVwb25fdG9kX3N0cmluZzsKKyAgICAgICAgfQorICAgICAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChzb3VyY2UsIGRldmljZSwgZXBvbl9zaGFwZXJfbW9kZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlc3QtPmVwb25fc2hhcGVyX21vZGUgPSBzb3VyY2UtPmRhdGEuZXBvbl9zaGFwZXJfbW9kZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChzb3VyY2UsIGRldmljZSwga2VlcGFsaXZlX3RvbGVyYW5jZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0ua2FfaW5mby5rYV90b2xlcmFuY2UgPSBzb3VyY2UtPmRhdGEua2VlcGFsaXZlX3RvbGVyYW5jZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoQkNNT0xUX0NGR19QUk9QX0lTX1NFVChzb3VyY2UsIGRldmljZSwga2VlcGFsaXZlX2ludGVydmFsKSkKKyAgICAgICAgeworICAgICAgICAgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5rYV9pbmZvLmthX2ludGVydmFsID0gc291cmNlLT5kYXRhLmtlZXBhbGl2ZV9pbnRlcnZhbCAqIEJDTU9TX01JQ1JPU0VDT05EU19JTl9TRUNPTkRTOworICAgICAgICAgICAgaWYgKGRldl9jdHJsX2RiW2RldmljZV0ua2FfaW5mby5rYV9pbnRlcnZhbCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhcnRfa2VlcF9hbGl2ZV9wcm9jZXNzKCZkZXZfY3RybF9kYltkZXZpY2VdLmthX2luZm8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0b3Bfa2VlcF9hbGl2ZV9wcm9jZXNzKCZkZXZfY3RybF9kYltkZXZpY2VdLmthX2luZm8pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKHNvdXJjZSwgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9zdHJpbmdfbGVuZ3RoKSkKKyAgICAgICAgeworICAgICAgICAJZGVzdC0+Z3Bvbl94Z3Bvbl90b2Rfc3RyaW5nX2xlbmd0aCA9IHNvdXJjZS0+ZGF0YS5ncG9uX3hncG9uX3RvZF9zdHJpbmdfbGVuZ3RoOworICAgICAgICB9CisgICAgICAgIGlmIChCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKHNvdXJjZSwgZGV2aWNlLCB0b2RfdWFydF9iYXVkcmF0ZSkpCisgICAgICAgIHsKKyAgICAgICAgCWRlc3QtPnRvZF91YXJ0X2JhdWRyYXRlID0gc291cmNlLT5kYXRhLnRvZF91YXJ0X2JhdWRyYXRlOworICAgICAgICB9CisgICAgfQorCisgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5sYXN0X21lc3NhZ2UtPmRpciA9IEJDTU9MVF9NU0dfRElSX1JFU1BPTlNFOworICAgIGJjbXRybXV4X2NvbnRyb2xfdG9faG9zdChkZXZpY2UsIGRldl9jdHJsX2RiW2RldmljZV0ubGFzdF9tZXNzYWdlKTsKKyAgICBkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuc3RhdGUgPSBCQ01PTFRfREVWSUNFX1NUQVRFX1JFQURZOworICAgIGJjbW9sdF9tc2dfZnJlZShkZXZfY3RybF9kYltkZXZpY2VdLmxhc3RfbWVzc2FnZSk7CisgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5sYXN0X21lc3NhZ2UgPSBOVUxMOworfQorCitzdGF0aWMgZGV2X2N0cmxfc21fY2IgZGV2X2N0cmxfc21bQkNNT0xUX0RFVklDRV9TVEFURV9fTlVNX09GXVtERVZJQ0VfQ09OVFJPTF9FVkVOVF9fTlVNX09GXSA9Cit7CisgICAgW0JDTU9MVF9ERVZJQ0VfU1RBVEVfRElTQ09OTkVDVEVEXSA9CisgICAgeworICAgICAgICBbREVWSUNFX0NPTlRST0xfRVZFTlRfREVWSUNFX0NMRUFSXSA9IGRldl9jdHJsX2Rpc2Nvbm5lY3RlZF9zdGF0ZV9kZXZpY2VfY2xlYXJfZXZlbnQsCisgICAgICAgIFtERVZJQ0VfQ09OVFJPTF9FVkVOVF9ERVZJQ0VfQ09ORklHX1NFVF0gPSBkZXZfY3RybF9kaXNjb25uZWN0ZWRfc3RhdGVfZGV2aWNlX2NvbmZpZ19zZXRfZXZlbnQsCisgICAgICAgIFtERVZJQ0VfQ09OVFJPTF9FVkVOVF9ERVZJQ0VfQ09ORklHX0dFVF0gPSBkZXZfY3RybF9kaXNjb25uZWN0ZWRfc3RhdGVfZGV2aWNlX2NvbmZpZ19nZXRfZXZlbnQsCisgICAgICAgIFtERVZJQ0VfQ09OVFJPTF9FVkVOVF9ERVZJQ0VfQ09OTkVDVF0gPSBkZXZfY3RybF9kaXNjb25uZWN0ZWRfc3RhdGVfZGV2aWNlX2Nvbm5lY3RfZXZlbnQsCisgICAgICAgIFtERVZJQ0VfQ09OVFJPTF9FVkVOVF9ERVZJQ0VfUkVTRVRdID0gZGV2X2N0cmxfZGlzY29ubmVjdGVkX3N0YXRlX2RldmljZV9yZXNldF9ldmVudCwKKyNpZm5kZWYgSU5fQkFORAorICAgICAgICBbREVWSUNFX0NPTlRST0xfRVZFTlRfUlVOX0REUl9URVNUXSA9IGRldl9jdHJsX2Rpc2Nvbm5lY3RlZF9zdGF0ZV9kZXZpY2VfcnVuX2Rkcl90ZXN0X2V2ZW50LAorI2VuZGlmCisgICAgfSwKKworICAgIFtCQ01PTFRfREVWSUNFX1NUQVRFX0NPTk5FQ1RJTkddID0KKyAgICB7CisgICAgICAgIFtERVZJQ0VfQ09OVFJPTF9FVkVOVF9DT05ORUNUSU9OX0ZBSUxVUkVdID0gZGV2X2N0cmxfY29ubmVjdGluZ19zdGF0ZV9jb25uZWN0aW9uX2ZhaWx1cmVfZXZlbnQsCisgICAgICAgIFtERVZJQ0VfQ09OVFJPTF9FVkVOVF9DT05ORUNUSU9OX0VTVEFCTElTSEVEXSA9IGRldl9jdHJsX2Nvbm5lY3Rpbmdfc3RhdGVfY29ubmVjdGlvbl9lc3RhYmxpc2hlZF9ldmVudCwKKyAgICAgICAgW0RFVklDRV9DT05UUk9MX0VWRU5UX0RFVklDRV9SRUFEWV0gPSBkZXZfY3RybF9jb25uZWN0aW5nX3N0YXRlX2RldmljZV9yZWFkeV9ldmVudCwKKyAgICAgICAgW0RFVklDRV9DT05UUk9MX0VWRU5UX0RFVklDRV9SRUNFSVZFRF9BQ0tdID0gZGV2X2N0cmxfY29ubmVjdGluZ19zdGF0ZV9yZWNlaXZlZF9hY2ssCisgICAgfSwKKworICAgIFtCQ01PTFRfREVWSUNFX1NUQVRFX1JFQURZXSA9CisgICAgeworICAgICAgICBbREVWSUNFX0NPTlRST0xfRVZFTlRfREVWSUNFX0NPTkZJR19TRVRdID0gZGV2X2N0cmxfcmVhZHlfc3RhdGVfZGV2aWNlX2NvbmZpZ19zZXRfZXZlbnQsCisgICAgICAgIFtERVZJQ0VfQ09OVFJPTF9FVkVOVF9ERVZJQ0VfQ09ORklHX0dFVF0gPSBkZXZfY3RybF9yZWFkeV9zdGF0ZV9kZXZpY2VfY29uZmlnX2dldF9ldmVudCwKKyAgICAgICAgW0RFVklDRV9DT05UUk9MX0VWRU5UX0RFVklDRV9ESVNDT05ORUNUXSA9IGRldl9jdHJsX3JlYWR5X3N0YXRlX2RldmljZV9kaXNjb25uZWN0X2V2ZW50LAorICAgICAgICBbREVWSUNFX0NPTlRST0xfRVZFTlRfREVWSUNFX1JFU0VUXSA9IGRldl9jdHJsX3JlYWR5X3N0YXRlX2RldmljZV9yZXNldF9ldmVudCwKKyAgICAgICAgW0RFVklDRV9DT05UUk9MX0VWRU5UX0NPTk5FQ1RJT05fRkFJTFVSRV0gPSBkZXZfY3RybF9yZWFkeV9zdGF0ZV9jb25uZWN0aW9uX2ZhaWx1cmVfZXZlbnQsCisgICAgfSwKKworICAgIFtCQ01PTFRfREVWSUNFX1NUQVRFX1dBSVRJTkdfRk9SX0RFVklDRV0gPQorICAgIHsKKyAgICAgICAgW0RFVklDRV9DT05UUk9MX0VWRU5UX0RFVklDRV9USU1FUl9USU1FT1VUXSA9IGRldl9jdHJsX3dhaXRpbmdfZm9yX2RldmljZV9zdGF0ZV90aW1lcl90aW1lb3V0LAorICAgICAgICBbREVWSUNFX0NPTlRST0xfRVZFTlRfREVWSUNFX1JFQ0VJVkVEX0FDS10gPSBkZXZfY3RybF93YWl0aW5nX2Zvcl9kZXZpY2Vfc3RhdGVfcmVjZWl2ZWRfYWNrCisgICAgfSwKKworI2lmbmRlZiBJTl9CQU5ECisgICAgW0JDTU9MVF9ERVZJQ0VfU1RBVEVfVEVTVElOR19ERFJdID0KKyAgICB7CisgICAgICAgIFtERVZJQ0VfQ09OVFJPTF9FVkVOVF9ERFJfVEVTVF9DT01QTEVURURdID0gZGV2X2N0cmxfdGVzdGluZ19kZHJfc3RhdGVfZGRyX3Rlc3RfY29tcGxldGVkX2V2ZW50LAorICAgICAgICBbREVWSUNFX0NPTlRST0xfRVZFTlRfRERSX1RFU1RfVElNRU9VVF0gPSBkZXZfY3RybF90ZXN0aW5nX2Rkcl9zdGF0ZV9kZHJfdGVzdF90aW1lb3V0X2V2ZW50CisgICAgfQorI2VuZGlmCit9OworCitzdGF0aWMgdm9pZCBkZXZfY3RybF9zbV9lcnJfY2IoYmNtb2x0X2RldmlkIGRldmljZSwgZGV2X2N0cmxfZXZlbnQgZXZlbnQpCit7CisgICAgQkNNX0xPRyhFUlJPUiwgZGV2X2N0cmxfZGJbZGV2aWNlXS5sb2dfaWQsCisgICAgICAgICJVbmV4cGVjdGVkIGV2ZW50OiBkZXZpY2U9JWQsIHN0YXRlPSVzLCBldmVudD0lc1xuIiwKKyAgICAgICAgZGV2aWNlLAorICAgICAgICBiY21fc3RyX2RldmljZV9zdGF0ZShkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuc3RhdGUpLAorICAgICAgICBiY21fc3RyX2RldmljZV9ldmVudChldmVudCkpOworfQorCitzdGF0aWMgdm9pZCBkZXZfY3RybF9zbV9jYWxsX3N0YXRlX2NiKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGRldl9jdHJsX2V2ZW50IGV2ZW50LCBjb25zdCBiY21vbHRfbXNnICptc2cpCit7CisgICAgZGV2X2N0cmxfc21fY2IgY2I7CisgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5sYXN0X2V2ZW50ID0gZXZlbnQ7CisgICAgY2IgPSBkZXZfY3RybF9zbVtkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuc3RhdGVdW2V2ZW50XTsKKyAgICBpZiAoY2IgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGRldl9jdHJsX3NtX2Vycl9jYihkZXZpY2UsIGV2ZW50KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY2IoZGV2aWNlLCBtc2cpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZGV2X2N0cmxfa2FfcnhfaGFuZGxlcihiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlICptc2cpCit7CisgICAga2VlcF9hbGl2ZV9yeF9oYW5kbGVyKChjb25zdCBiY21vc19rZWVwX2FsaXZlX2RhdGFfbXNnICopJm1zZy0+ZGF0YSwgJmRldl9jdHJsX2RiW2RldmljZV0ua2FfaW5mbyk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBkZXZfY3RybF9rYV90eF9oYW5kbGVyKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9tc2cgKm1zZykKK3sKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIGlmICghZGV2X2N0cmxfaXNfY29ubmVjdGVkKGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtcy5zdGF0ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsgLyogaW4gY2FzZSB0aGlzIGhhcHBlbnMgZHVyaW5nIGEgZGlzY29ubmVjdC9yZXNldCBvcGVyYXRpb24gKi8KKyAgICB9CisKKyAgICBtc2ctPmNvcnJfdGFnID0gKytkZXZfY3RybF9kYltkZXZpY2VdLmNvcnJfdGFnOworICAgIHJjID0gYmNtdHJtdXhfY29udHJvbF90b19saW5lKGRldmljZSwgbXNnKTsKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBkZXZfY3RybF9rYV9kaXNjb25uZWN0X2hhbmRsZXIoYmNtb2x0X2RldmlkIGRldmljZSkKK3sKKyAgICBkZXZfY3RybF9kaXNjb25uZWN0KGRldmljZSk7CisgICAgZGV2X2N0cmxfc2VuZF9pbmRfY29ubmVjdGlvbl9mYWlsdXJlKGRldmljZSwgQkNNT0xUX0hPU1RfQ09OTkVDVElPTl9GQUlMX1JFQVNPTl9LRUVQQUxJVkUpOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfb3Blcl9zZXRfbXNnKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9tc2cgKm1zZykKK3sKKyAgICBkZXZfY3RybF9ldmVudCBldmVudDsKKworICAgIHN3aXRjaCAobXNnLT5zdWJncm91cCkKKyAgICB7CisgICAgY2FzZSBCQ01PTFRfREVWSUNFX09QRVJfSURfUkVTRVQ6CisgICAgICAgIGV2ZW50ID0gREVWSUNFX0NPTlRST0xfRVZFTlRfREVWSUNFX1JFU0VUOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9DT05ORUNUOgorICAgICAgICBldmVudCA9IERFVklDRV9DT05UUk9MX0VWRU5UX0RFVklDRV9DT05ORUNUOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9ESVNDT05ORUNUOgorICAgICAgICBldmVudCA9IERFVklDRV9DT05UUk9MX0VWRU5UX0RFVklDRV9ESVNDT05ORUNUOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9SVU5fRERSX1RFU1Q6CisgICAgICAgIGV2ZW50ID0gREVWSUNFX0NPTlRST0xfRVZFTlRfUlVOX0REUl9URVNUOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0IDoKKyAgICAgICAgZXZlbnQgPSBERVZJQ0VfQ09OVFJPTF9FVkVOVF9OT19FVkVOVDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogU2VuZCByZXNwb25zZSB0byB0aGUgd2FpdGluZyBhcHBsaWNhdGlvbiAqLworICAgIG1zZy0+ZGlyID0gQkNNT0xUX01TR19ESVJfUkVTUE9OU0U7CisgICAgYmNtdHJtdXhfY29udHJvbF90b19ob3N0KGRldmljZSwgbXNnKTsKKworICAgIC8qIEhhbmRsZSBldmVudCAqLworICAgIGlmIChldmVudCAhPSBERVZJQ0VfQ09OVFJPTF9FVkVOVF9OT19FVkVOVCkKKyAgICB7CisgICAgICAgIGRldl9jdHJsX3NtX2NhbGxfc3RhdGVfY2IoZGV2aWNlLCBldmVudCwgbXNnKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRldl9jdHJsX3Byb2Nlc3NfbXNnKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9tc2cgKm1zZykKK3sKKyAgICBpZiAobXNnLT5kaXIgPT0gQkNNT0xUX01TR19ESVJfUkVTUE9OU0UpCisgICAgeworICAgICAgICBkZXZfY3RybF9zbV9jYWxsX3N0YXRlX2NiKGRldmljZSwgREVWSUNFX0NPTlRST0xfRVZFTlRfREVWSUNFX1JFQ0VJVkVEX0FDSywgbXNnKTsKKyAgICB9CisKKyAgICBpZiAobXNnLT5ncm91cCA9PSBCQ01PTFRfTUdUX0dST1VQX0FVVE8pCisgICAgeworICAgICAgICBpZiAobXNnLT5zdWJncm91cCAhPSBCQ01PTFRfREVWSUNFX0FVVE9fSURfREVWSUNFX0tFRVBfQUxJVkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coREVCVUcsIGRldl9jdHJsX2RiW2RldmljZV0ubG9nX2lkLCAiSW5kaWNhdGlvbiA9ICVzICglZClcbiIsIGJjbV9zdHJfYXV0b19pZChtc2ctPnN1Ymdyb3VwKSwgbXNnLT5zdWJncm91cCk7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKG1zZy0+c3ViZ3JvdXApCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0FVVE9fSURfREVWSUNFX0tFRVBfQUxJVkU6CisgICAgICAgICAgICBkZXZfY3RybF9rYV9yeF9oYW5kbGVyKGRldmljZSwgKGJjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmUgKiltc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9BVVRPX0lEX0NPTk5FQ1RJT05fRkFJTFVSRToKKyAgICAgICAgICAgIC8qIG5vdGU6IHRoaXMgaW5kaWNhdGlvbiBpcyBub3QgZ2VuZXJhdGVkIGJ5IHRoZSBkZXZpY2UgLSBpdCdzIGdlbmVyYXRlZCBieSBkZXZpY2UgY29udHJvbCBpdHNlbGYgKi8KKyAgICAgICAgICAgIGRldl9jdHJsX3NtX2NhbGxfc3RhdGVfY2IoZGV2aWNlLCBERVZJQ0VfQ09OVFJPTF9FVkVOVF9DT05ORUNUSU9OX0ZBSUxVUkUsIG1zZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0FVVE9fSURfQ09OTkVDVElPTl9FU1RBQkxJU0hFRDoKKyAgICAgICAgICAgIGRldl9jdHJsX3NtX2NhbGxfc3RhdGVfY2IoZGV2aWNlLCBERVZJQ0VfQ09OVFJPTF9FVkVOVF9DT05ORUNUSU9OX0VTVEFCTElTSEVELCBtc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9BVVRPX0lEX0RFVklDRV9SRUFEWToKKyAgICAgICAgICAgIGRldl9jdHJsX3NtX2NhbGxfc3RhdGVfY2IoZGV2aWNlLCBERVZJQ0VfQ09OVFJPTF9FVkVOVF9ERVZJQ0VfUkVBRFksIG1zZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGRldl9jdHJsX2RiW2RldmljZV0ubG9nX2lkLCAiVW5leHBlY3RlZCBpbmRpY2F0aW9uXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1zZy0+Z3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9PUEVSICYmIG1zZy0+dHlwZSA9PSBCQ01PTFRfTVNHX1RZUEVfU0VUICYmIG1zZy0+ZGlyICE9IEJDTU9MVF9NU0dfRElSX1JFU1BPTlNFKQorICAgIHsKKyAgICAgICAgLyogQWxsIG9wZXJhdGlvbnMgaGFwcGVuIGVudGlyZWx5IG9uIHRoZSBob3N0IHNpZGUgKi8KKyAgICAgICAgaGFuZGxlX29wZXJfc2V0X21zZyhkZXZpY2UsIG1zZyk7CisgICAgfQorCisgICAgaWYgKG1zZy0+Z3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9DRkcgJiYgbXNnLT5kaXIgIT0gQkNNT0xUX01TR19ESVJfUkVTUE9OU0UpCisgICAgeworICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmxhc3RfbWVzc2FnZSA9IG1zZzsKKyAgICAgICAgc3dpdGNoIChtc2ctPnR5cGUpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgZGV2X2N0cmxfc21fY2FsbF9zdGF0ZV9jYihkZXZpY2UsIERFVklDRV9DT05UUk9MX0VWRU5UX0RFVklDRV9DT05GSUdfR0VULCBtc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0NMRUFSOgorICAgICAgICAgICAgZGV2X2N0cmxfc21fY2FsbF9zdGF0ZV9jYihkZXZpY2UsIERFVklDRV9DT05UUk9MX0VWRU5UX0RFVklDRV9DTEVBUiwgbXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICBkZXZfY3RybF9zbV9jYWxsX3N0YXRlX2NiKGRldmljZSwgREVWSUNFX0NPTlRST0xfRVZFTlRfREVWSUNFX0NPTkZJR19TRVQsIG1zZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIG1zZyA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKG1zZyAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X21zZ19mcmVlKG1zZyk7CisgICAgfQorfQorCitzdGF0aWMgYmNtb3NfdGltZXJfcmMgZGV2X2N0cmxfY29ubmVjdGlvbl90aW1lcl9oYW5kbGVyKGJjbW9zX3RpbWVyICp0aW1lciwgbG9uZyBkYXRhKQoreworICAgIGJjbW9sdF9kZXZpZCBkZXZpY2UgPSBERVZJQ0VfSURfRlJPTV9NT0RVTEVfSUQodGltZXItPnBhcm0ub3duZXIpOworCisgICAgaWYgKGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtcy5zdGF0ZSAhPSBCQ01PTFRfREVWSUNFX1NUQVRFX0NPTk5FQ1RJTkcpCisgICAgeworICAgICAgICAvKiBUaGUgdGltZXIgaXMgaXJyZWxldmFudCBpbiB0aGlzIHN0YXRlIC0gZGlzY2FyZCBpdCBhbmQgcmV0dXJuLiAqLworICAgIH0KKyAgICBlbHNlIGlmIChkZXZfY3RybF9kYltkZXZpY2VdLmNvbm5lY3Rpb25faW5mby5zdGF0ZSA9PSBERVZfQ1RSTF9DT05ORUNUSU5HX1NUQVRFX0NPTkZJR1VSSU5HKQorICAgIHsKKyAgICAgICAgLyogQWZ0ZXIgd2UgaGF2ZSBzZW50IHRoZSBmaXJzdCAiZGV2aWNlIGNvbmZpZ3VyYXRpb24gc2V0IiBtZXNzYWdlIHRvIHRoZSBkZXZpY2UsIHRoZSBjb25uZWN0aW9uIHRpbWVyIGlzIHVzZWQKKyAgICAgICAgICogZm9yIHJldHJhbnNtaXR0aW5nIHRoaXMgbWVzc2FnZSBpbiBjYXNlIHRoZSBkZXZpY2UgbWlzc2VkIGl0LiAqLworICAgICAgICBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZXN0YWJsaXNoZWQgaW5kID0ge307CisgICAgICAgIEJDTU9MVF9BVVRPX0lOSVQoJmluZCwgZGV2aWNlLCBjb25uZWN0aW9uX2VzdGFibGlzaGVkKTsKKyAgICAgICAgZGV2X2N0cmxfc21fY2FsbF9zdGF0ZV9jYihkZXZpY2UsIERFVklDRV9DT05UUk9MX0VWRU5UX0NPTk5FQ1RJT05fRVNUQUJMSVNIRUQsICZpbmQuaGRyLmhkcik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIENvbm5lY3Rpb24gZmFpbHVyZSBkdWUgdG8gdGltZW91dC4gKi8KKyAgICAgICAgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmUgaW5kID0ge307CisgICAgICAgIEJDTU9MVF9BVVRPX0lOSVQoJmluZCwgZGV2aWNlLCBjb25uZWN0aW9uX2ZhaWx1cmUpOworICAgICAgICBpbmQuZGF0YS5yZWFzb24gPSBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX1RJTUVPVVQ7CisgICAgICAgIGRldl9jdHJsX3NtX2NhbGxfc3RhdGVfY2IoZGV2aWNlLCBERVZJQ0VfQ09OVFJPTF9FVkVOVF9DT05ORUNUSU9OX0ZBSUxVUkUsICZpbmQuaGRyLmhkcik7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RJTUVSX1NUT1A7Cit9CisKKyNpZm5kZWYgSU5fQkFORAorc3RhdGljIHZvaWQgZGV2X2N0cmxfZ2V0X3Jhc19tb2RlcyhiY21vbHRfc3lzdGVtX21vZGUgc3lzdGVtX21vZGUsIHVpbnQzMl90ICpyYXNfMF9tb2RlLCB1aW50MzJfdCAqcmFzXzFfbW9kZSkKK3sKKyAgICBzd2l0Y2ggKHN5c3RlbV9tb2RlKQorICAgIHsKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9HUE9OX180X1g6CisgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfR1BPTl9fOF9YOgorICAgICAgICAqcmFzXzBfbW9kZSA9IEJDTV9GTERfUkFTX01PREVfR1BPTjsKKyAgICAgICAgKnJhc18xX21vZGUgPSBCQ01fRkxEX1JBU19NT0RFX05PVF9DT05GSUdVUkVEOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9HUE9OX18xNl9YOgorICAgICAgICAqcmFzXzBfbW9kZSA9IEJDTV9GTERfUkFTX01PREVfR1BPTjsKKyAgICAgICAgKnJhc18xX21vZGUgPSBCQ01fRkxEX1JBU19NT0RFX0dQT047CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX1hHUE9OXzFfXzRfWDoKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9YR1BPTl8xX184X1g6CisgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfTkdQT04yX184X1hfMl9QXzVfRzoKKyAgICAgICAgKnJhc18wX21vZGUgPSBCQ01fRkxEX1JBU19NT0RFX1hHUE9OOworICAgICAgICAqcmFzXzFfbW9kZSA9IEJDTV9GTERfUkFTX01PREVfWEdQT047CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0dQT05fOF9YR1BPTl80X1hfQ09FWElTVEVOQ0U6CisgICAgICAgICpyYXNfMF9tb2RlID0gQkNNX0ZMRF9SQVNfTU9ERV9YR1BPTjsKKyAgICAgICAgKnJhc18xX21vZGUgPSBCQ01fRkxEX1JBU19NT0RFX0dQT047CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX1hHU19fMl9YXzEwX0c6CisgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfTkdQT04yX18yX1hfMTBfRzoKKyAgICAgICAgKnJhc18wX21vZGUgPSBCQ01fRkxEX1JBU19NT0RFX1hHU19OR1BPTjI7CisgICAgICAgICpyYXNfMV9tb2RlID0gQkNNX0ZMRF9SQVNfTU9ERV9YR1NfTkdQT04yOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICAqcmFzXzBfbW9kZSA9IEJDTV9GTERfUkFTX01PREVfTk9UX0NPTkZJR1VSRUQ7CisgICAgICAgICpyYXNfMV9tb2RlID0gQkNNX0ZMRF9SQVNfTU9ERV9OT1RfQ09ORklHVVJFRDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgYmNtb3NfdGltZXJfcmMgZGV2X2N0cmxfYm9vdF9zZXFfdGltZXJfaGFuZGxlcihiY21vc190aW1lciAqdGltZXIsIGxvbmcgZGF0YSkKK3sKKyAgICBiY21vc19ib29sIGlzX2Jvb3Rsb2FkZXJfZG9uZTsKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlOworICAgIHVpbnQzMl90IHJhc18wX21vZGU7CisgICAgdWludDMyX3QgcmFzXzFfbW9kZTsKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgYmNtb3NfdGltZXJfcmMgdGltZXJfcmMgPSBCQ01PU19USU1FUl9TVE9QOworCisgICAgZGV2aWNlID0gKGJjbW9sdF9kZXZpZClkYXRhOworCisgICAgaWYgKGRldl9jdHJsX2RiW2RldmljZV0uYm9vdF9zZXFfaW5mby5wb2xsaW5nX2NvdW50ZXIgPiAwKQorICAgIHsKKyAgICAgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5ib290X3NlcV9pbmZvLnBvbGxpbmdfY291bnRlci0tOworICAgICAgICBpc19ib290bG9hZGVyX2RvbmUgPSBiY21fZmxkX2lzX2Jvb3Rsb2FkZXJfZG9uZShkZXZpY2UpOworICAgICAgICBpZiAoaXNfYm9vdGxvYWRlcl9kb25lKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBTdG9wIHRoZSBib290IHRpbWVyICovCisgICAgICAgICAgICB0aW1lcl9yYyA9IEJDTU9TX1RJTUVSX1NUT1A7CisgICAgICAgICAgICBCQ01fTE9HKElORk8sIGRldl9jdHJsX2RiW2RldmljZV0ubG9nX2lkLCAiQm9vdCBsb2FkZXIgcGhhc2UgZG9uZS5cbiIpOworCisgICAgICAgICAgICBpZiAoZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zLmRlYnVnLmF2c19jb250cm9sKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gYmNtX2ZsZF9zZXRfYXZzX2NvbnQoZGV2aWNlLCBCQ01fRkxEX0FWU19DT05UKTsgLyogZG9uJ3Qgc3RvcCB0aGUgY3B1IHdoZW4gYXZzIGZhaWxzLiAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gYmNtX2ZsZF9zZXRfYXZzX2NvbnQoZGV2aWNlLCBCQ01fRkxEX0FWU19TVE9QKTsgLyogc3RvcCB0aGUgY3B1IHdoZW4gYXZzIGZhaWxzLiAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgQkNNX0RFVl9DVFJMX1JFVFVSTl9PTl9FUlJPUihkZXZpY2UsIHJjLCAiYmNtX2ZsZF9zZXRfYXZzX2NvbnRcbiIpOworCisgICAgICAgICAgICBkZXZfY3RybF9nZXRfcmFzX21vZGVzKGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtcy5zeXN0ZW1fbW9kZSwgJnJhc18wX21vZGUsICZyYXNfMV9tb2RlKTsKKyAgICAgICAgICAgIHJjID0gYmNtX2ZsZF9zZXRfcmFzX21vZGVfc2V0KGRldmljZSwgMCwgcmFzXzBfbW9kZSk7CisgICAgICAgICAgICBCQ01fREVWX0NUUkxfUkVUVVJOX09OX0VSUk9SKGRldmljZSwgcmMsICJiY21fZmxkX3NldF9yYXNfMF9tb2RlX3NldFxuIik7CisgICAgICAgICAgICByYyA9IGJjbV9mbGRfc2V0X3Jhc19tb2RlX3NldChkZXZpY2UsIDEsIHJhc18xX21vZGUpOworICAgICAgICAgICAgQkNNX0RFVl9DVFJMX1JFVFVSTl9PTl9FUlJPUihkZXZpY2UsIHJjLCAiYmNtX2ZsZF9zZXRfcmFzXzFfbW9kZV9zZXRcbiIpOworICAgICAgICAgICAgcmMgPSBkZXZfY3RybF9oYW5kbGVfYXBwbGljYXRpb25faW1hZ2UoZGV2aWNlKTsKKyAgICAgICAgICAgIEJDTV9ERVZfQ1RSTF9SRVRVUk5fT05fRVJST1IoZGV2aWNlLCByYywgImRldl9jdHJsX2hhbmRsZV9hcHBsaWNhdGlvbl9pbWFnZSgpXG4iKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFJlc3RhcnQgdGhlIGJvb3QgdGltZXIgKi8KKyAgICAgICAgICAgIHRpbWVyX3JjID0gQkNNT1NfVElNRVJfT0s7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdGltZXJfcmMgPSBCQ01PU19USU1FUl9TVE9QOworICAgICAgICBCQ01fTE9HKEVSUk9SLCBkZXZfY3RybF9kYltkZXZpY2VdLmxvZ19pZCwgImRldl9jdHJsX2Jvb3Rfc2VxIHRpbWVyIGV4cGlyZWQgd2hpbGUgdHJ5aW5nIHRvIGJ1cm4gQk9PVExPQURFUlxuIik7CisgICAgfQorCisgICAgcmV0dXJuIHRpbWVyX3JjOworfQorCitzdGF0aWMgYmNtb3NfdGltZXJfcmMgZGV2X2N0cmxfZGRyX3Rlc3RfdGltZXJfaGFuZGxlcihiY21vc190aW1lciAqdGltZXIsIGxvbmcgZGF0YSkKK3sKKyAgICBiY21vc19ib29sIGlzX2Rkcl90ZXN0X2RvbmU7CisgICAgYmNtb2x0X2RldmlkIGRldmljZTsKKyAgICBiY21vc190aW1lcl9yYyB0aW1lcl9yYyA9IEJDTU9TX1RJTUVSX1NUT1A7CisKKyAgICBkZXZpY2UgPSAoYmNtb2x0X2RldmlkKWRhdGE7CisKKyAgICBpZiAoZGV2X2N0cmxfZGJbZGV2aWNlXS5ib290X3NlcV9pbmZvLnBvbGxpbmdfY291bnRlciA+IDApCisgICAgeworICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmJvb3Rfc2VxX2luZm8ucG9sbGluZ19jb3VudGVyLS07CisgICAgICAgIGlzX2Rkcl90ZXN0X2RvbmUgPSBiY21fZmxkX2lzX2Rkcl90ZXN0X2RvbmUoZGV2aWNlKTsKKyAgICAgICAgaWYgKGlzX2Rkcl90ZXN0X2RvbmUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFN0b3AgdGhlIGJvb3QgdGltZXIgKi8KKyAgICAgICAgICAgIHRpbWVyX3JjID0gQkNNT1NfVElNRVJfU1RPUDsKKyAgICAgICAgICAgIGRldl9jdHJsX3NtX2NhbGxfc3RhdGVfY2IoZGV2aWNlLCBERVZJQ0VfQ09OVFJPTF9FVkVOVF9ERFJfVEVTVF9DT01QTEVURUQsIE5VTEwpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhJTkZPLCBkZXZfY3RybF9kYltkZXZpY2VdLmxvZ19pZCwgIldhaXRpbmcgZm9yIEREUiBUZXN0ICV1XG4iLCBkZXZfY3RybF9kYltkZXZpY2VdLmJvb3Rfc2VxX2luZm8ucG9sbGluZ19jb3VudGVyKTsKKyAgICAgICAgICAgIC8qIFJlc3RhcnQgdGhlIGJvb3QgdGltZXIgKi8KKyAgICAgICAgICAgIHRpbWVyX3JjID0gQkNNT1NfVElNRVJfT0s7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdGltZXJfcmMgPSBCQ01PU19USU1FUl9TVE9QOworICAgICAgICBkZXZfY3RybF9zbV9jYWxsX3N0YXRlX2NiKGRldmljZSwgREVWSUNFX0NPTlRST0xfRVZFTlRfRERSX1RFU1RfVElNRU9VVCwgTlVMTCk7CisgICAgfQorCisgICAgcmV0dXJuIHRpbWVyX3JjOworfQorI2VuZGlmCisKK3N0YXRpYyBiY21vc19lcnJubyBkZXZfY3RybF9pbml0X21vZHVsZXMoYmNtb2x0X2RldmlkIGRldmljZSkKK3sKKyAgICBiY21vc19tb2R1bGVfcGFybSBtb2R1bGVfcGFyYW1zID0ge307CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworICAgIGRldl9jdHJsX2RiW2RldmljZV0ubW9kdWxlX2luZm8ubW9kdWxlX2lkID0gTU9EVUxFX0lEX0ZST01fREVWSUNFX0lEKGRldmljZSk7CisgICAgc25wcmludGYoCisgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0ubW9kdWxlX2luZm8ubmFtZSwKKyAgICAgICAgc2l6ZW9mKGRldl9jdHJsX2RiW2RldmljZV0ubW9kdWxlX2luZm8ubmFtZSksCisgICAgICAgICJkZXZfY3RybCV1X21vZHVsZSIsCisgICAgICAgIGRldmljZSk7CisgICAgbW9kdWxlX3BhcmFtcy5xcGFybS5uYW1lID0gZGV2X2N0cmxfZGJbZGV2aWNlXS5tb2R1bGVfaW5mby5uYW1lOworICAgIG1vZHVsZV9wYXJhbXMucXBhcm0uc2l6ZSA9IERFVklDRV9DT05UUk9MX01TR19RVUVVRV9TSVpFOworICAgIG1vZHVsZV9wYXJhbXMuaW5pdCA9IE5VTEw7CisgICAgcmMgPSBiY21vc19tb2R1bGVfY3JlYXRlKAorICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLm1vZHVsZV9pbmZvLm1vZHVsZV9pZCwKKyAgICAgICAgJmRldl9jdHJsX2RiW2RldmljZV0udGFza19pbmZvLnRhc2ssCisgICAgICAgICZtb2R1bGVfcGFyYW1zKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGRldl9jdHJsX2RiW2RldmljZV0ubG9nX2lkLAorICAgICAgICAgICAgImJjbW9zX21vZHVsZV9jcmVhdGUgcmV0dXJuZWQgZXJyb3IgJXMgKCVkKSwgbW9kdWxlIGlkICVkXG4iLAorICAgICAgICAgICAgYmNtb3Nfc3RyZXJyb3IocmMpLAorICAgICAgICAgICAgcmMsCisgICAgICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLm1vZHVsZV9pbmZvLm1vZHVsZV9pZCk7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGRldl9jdHJsX2luaXRfdGFza3MoYmNtb2x0X2RldmlkIGRldmljZSkKK3sKKyAgICBiY21vc190YXNrX3Bhcm0gdGFza19wYXJhbXMgPSB7fTsKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgc25wcmludGYoZGV2X2N0cmxfZGJbZGV2aWNlXS50YXNrX2luZm8ubmFtZSwgc2l6ZW9mKGRldl9jdHJsX2RiW2RldmljZV0udGFza19pbmZvLm5hbWUpLCAiZGV2X2N0cmwldSIsIGRldmljZSk7CisgICAgdGFza19wYXJhbXMubmFtZSA9IGRldl9jdHJsX2RiW2RldmljZV0udGFza19pbmZvLm5hbWU7CisgICAgdGFza19wYXJhbXMucHJpb3JpdHkgPSBUQVNLX1BSSU9SSVRZX0RFVklDRV9DT05UUk9MOworICAgIHRhc2tfcGFyYW1zLmNvcmUgPSBCQ01PU19DUFVfQ09SRV9BTlk7IC8qIE5vIENQVSBhZmZpbml0eSAqLworICAgIHRhc2tfcGFyYW1zLmluaXRfaGFuZGxlciA9IE5VTEw7CisgICAgdGFza19wYXJhbXMuZGF0YSA9IChsb25nKWRldmljZTsKKyAgICByYyA9IGJjbW9zX3Rhc2tfY3JlYXRlKCZkZXZfY3RybF9kYltkZXZpY2VdLnRhc2tfaW5mby50YXNrLCAmdGFza19wYXJhbXMpOworICAgIEJDTV9ERVZfQ1RSTF9SRVRVUk5fT05fRVJST1IoZGV2aWNlLCByYywgImJjbW9zX3Rhc2tfY3JlYXRlKClcbiIpOworCisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBkZXZfY3RybF9tb2RfbXNnX2hhbmRsZXIoYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZCwgYmNtb3NfbXNnICpvc19tc2cpCit7CisgICAgYmNtb2x0X21zZyAqbXNnOworICAgIGJjbW9sdF9kZXZpZCBkZXZpY2U7CisKKyAgICBkZXZpY2UgPSBERVZJQ0VfSURfRlJPTV9NT0RVTEVfSUQobW9kdWxlX2lkKTsKKyAgICBtc2cgPSBvc19tc2ctPmRhdGE7CisKKyNpZm5kZWYgSU5fQkFORAorI2lmZGVmIEVOQUJMRV9MT0cKKyAgICBpZiAobXNnLT5vYmpfdHlwZSA9PSBCQ01PTFRfT0JKX0lEX0xPR0dFUiAmJgorICAgICAgICBtc2ctPmdyb3VwID09IEJDTU9MVF9NR1RfR1JPVVBfQ0ZHICYmCisgICAgICAgIG1zZy0+dHlwZSA9PSBCQ01PTFRfTVNHX1RZUEVfR0VUICYmCisgICAgICAgICFkZXZfY3RybF9pc19jb25uZWN0ZWQoZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zLnN0YXRlKSkKKyAgICB7CisgICAgICAgIC8qIFRoZSBkZXZpY2UgaXMgbm90IHJlYWR5LCBidXQgc3RpbGwgd2UgY2FuIGZldGNoIHRoZSBsb2dnZXIgZmlsZSBmcm9tIFNSQU0uICovCisgICAgICAgIG1zZy0+ZXJyID0gZGV2X2N0cmxfZ2V0X2Rldl9sb2coZGV2aWNlLCAoYmNtb2x0X2xvZ2dlcl9jZmcgKiltc2cpOworICAgICAgICBtc2ctPmRpciA9IEJDTU9MVF9NU0dfRElSX1JFU1BPTlNFOworICAgICAgICBiY210cm11eF9jb250cm9sX3RvX2hvc3QoZGV2aWNlLCBtc2cpOworICAgICAgICBiY21vbHRfbXNnX2ZyZWUobXNnKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKG1zZy0+b2JqX3R5cGUgPT0gQkNNT0xUX09CSl9JRF9TT0ZUV0FSRV9FUlJPUiAmJgorICAgICAgICBtc2ctPmdyb3VwID09IEJDTU9MVF9NR1RfR1JPVVBfQ0ZHICYmCisgICAgICAgIChtc2ctPnR5cGUgPT0gQkNNT0xUX01TR19UWVBFX0dFVCB8fCBtc2ctPnR5cGUgPT0gQkNNT0xUX01TR19UWVBFX0dFVF9NVUxUSSkgJiYKKyAgICAgICAgIWRldl9jdHJsX2lzX2Nvbm5lY3RlZChkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuc3RhdGUpKQorICAgIHsKKyAgICAgICAgLyogZ2V0IHN3IGVycm9yIHRhYmxlIGZyb20gU1JBTSAqLworICAgICAgICBtc2ctPmVyciA9IGRldl9jdHJsX3N3X2Vycm9yX2dldChkZXZpY2UsIG1zZyk7CisgICAgICAgIG1zZy0+ZGlyID0gQkNNT0xUX01TR19ESVJfUkVTUE9OU0U7CisgICAgICAgIGJjbXRybXV4X2NvbnRyb2xfdG9faG9zdChkZXZpY2UsIG1zZyk7CisgICAgICAgIGJjbW9sdF9tc2dfZnJlZShtc2cpOworICAgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAobXNnLT5vYmpfdHlwZSA9PSBCQ01PTFRfT0JKX0lEX0RFQlVHKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2RlYnVnX2N0cmxfcHJvY2Vzc19tc2coZGV2aWNlLCBtc2csIGRldl9jdHJsX2lzX2Nvbm5lY3RlZChkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuc3RhdGUpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtc2ctPm9ial90eXBlICE9IEJDTU9MVF9PQkpfSURfREVWSUNFKQorICAgIHsKKyAgICAgICAgYmNtb2x0X21zZ19lcnIoCisgICAgICAgICAgICBtc2csCisgICAgICAgICAgICBERVZfTE9HX0lOVkFMSURfSUQsCisgICAgICAgICAgICBCQ01fRVJSX0lOVEVSTkFMLAorICAgICAgICAgICAgQkNNT0xUX0VSUl9GSUVMRF9OT05FLAorICAgICAgICAgICAgIkNhbid0IGFjY2VzcyB0YXJnZXQgd2hlbiBkaXNjb25uZWN0ZWQiKTsKKyAgICAgICAgbXNnLT5kaXIgPSBCQ01PTFRfTVNHX0RJUl9SRVNQT05TRTsKKyAgICAgICAgYmNtdHJtdXhfY29udHJvbF90b19ob3N0KGRldmljZSwgbXNnKTsKKyAgICAgICAgYmNtb2x0X21zZ19mcmVlKG1zZyk7CisgICAgfQorICAgIGVsc2UgaWYgKG1zZy0+Z3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9BVVRPKQorICAgIHsKKyAgICAgICAgZGV2X2N0cmxfcHJvY2Vzc19tc2coZGV2aWNlLCBtc2cpOworICAgIH0KKyAgICBlbHNlIGlmIChtc2ctPmRpciA9PSBCQ01PTFRfTVNHX0RJUl9SRVNQT05TRSkKKyAgICB7CisgICAgICAgIGlmIChtc2ctPmdyb3VwID09IEJDTU9MVF9NR1RfR1JPVVBfT1BFUiAmJiBtc2ctPnN1Ymdyb3VwID09IEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9IT1NUX0tFRVBfQUxJVkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEp1c3QgZnJlZSBpdCwgb3RoZXJ3aXNlIGlnbm9yZSBrZWVwYWxpdmUgb3BlciByZXNwb25zZXMgKi8KKyAgICAgICAgICAgIGJjbW9sdF9tc2dfZnJlZShtc2cpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuc3RhdGUgPT0gQkNNT0xUX0RFVklDRV9TVEFURV9XQUlUSU5HX0ZPUl9ERVZJQ0UpIHx8IChkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuc3RhdGUgPT0gQkNNT0xUX0RFVklDRV9TVEFURV9DT05ORUNUSU5HKSkKKyAgICAgICAgeworICAgICAgICAgICAgZGV2X2N0cmxfcHJvY2Vzc19tc2coZGV2aWNlLCBtc2cpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhJTkZPLCBkZXZfY3RybF9kYltkZXZpY2VdLmxvZ19pZCwgInJlY2VpdmVkIHVuZXhwZWN0ZWQgcmVzcG9uc2U6IGdyb3VwPSV1IHN1Ymdyb3VwPSV1XG4iLCBtc2ctPmdyb3VwLCBtc2ctPnN1Ymdyb3VwKTsKKyAgICAgICAgICAgIGJjbW9sdF9tc2dfZnJlZShtc2cpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKGRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3BhcmFtcy5zdGF0ZSAhPSBCQ01PTFRfREVWSUNFX1NUQVRFX0NPTk5FQ1RJTkcpCisgICAgeworICAgICAgICBtc2ctPmVyciA9IGRldl9jdHJsX3ZhbGlkYXRlX21zZyhkZXZpY2UsIG1zZyk7CisgICAgICAgIGlmIChtc2ctPmVyciA9PSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICBkZXZfY3RybF9wcm9jZXNzX21zZyhkZXZpY2UsIG1zZyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBtc2ctPmRpciA9IEJDTU9MVF9NU0dfRElSX1JFU1BPTlNFOworICAgICAgICAgICAgYmNtdHJtdXhfY29udHJvbF90b19ob3N0KGRldmljZSwgbXNnKTsKKyAgICAgICAgICAgIGJjbW9sdF9tc2dfZnJlZShtc2cpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbW9sdF9tc2dfZXJyKG1zZywgREVWX0xPR19JTlZBTElEX0lELCBCQ01fRVJSX1NUQVRFLCBCQ01PTFRfRVJSX0ZJRUxEX05PTkUsICJEZXZpY2UgaXMgYnVzeSIpOworICAgICAgICBtc2ctPmRpciA9IEJDTU9MVF9NU0dfRElSX1JFU1BPTlNFOworICAgICAgICBiY210cm11eF9jb250cm9sX3RvX2hvc3QoZGV2aWNlLCBtc2cpOworICAgICAgICBiY21vbHRfbXNnX2ZyZWUobXNnKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRldl9jdHJsX21vZF9tc2dfcmVsZWFzZShiY21vc19tc2cgKm9zX21zZykKK3sKKyAgICBiY21vbHRfbXNnX2ZyZWUoY29udGFpbmVyX29mKG9zX21zZywgYmNtb2x0X21zZywgb3NfbXNnKSk7Cit9CisKK3N0YXRpYyBiY21vc19tc2cgZGV2X2N0cmxfaXBjX21zZyA9IHsgLmhhbmRsZXIgPSBkZXZfY3RybF9tb2RfbXNnX2hhbmRsZXIsIC5yZWxlYXNlID0gZGV2X2N0cmxfbW9kX21zZ19yZWxlYXNlIH07CisKK3N0YXRpYyB2b2lkIGJjbWRldl9yeF9oYW5kbGVyKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9tc2cgKm1zZywgdm9pZCAqZGF0YSkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIG1zZy0+b3NfbXNnID0gZGV2X2N0cmxfaXBjX21zZzsKKyAgICBtc2ctPm9zX21zZy5kYXRhID0gbXNnOworICAgIHJjID0gYmNtb3NfbXNnX3NlbmRfdG9fbW9kdWxlKGRldl9jdHJsX2RiW2RldmljZV0ubW9kdWxlX2luZm8ubW9kdWxlX2lkLCAmbXNnLT5vc19tc2csIEJDTU9TX01TR19TRU5EX0FVVE9fRlJFRSk7CisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBkZXZfY3RybF9kYltkZXZpY2VdLmxvZ19pZCwKKyAgICAgICAgICAgICJiY21vc19tc2dfc2VuZF90b19tb2R1bGUgcmV0dXJuZWQgZXJyb3IgJXMgKCVkKSwgbW9kdWxlIGlkICVkXG4iLAorICAgICAgICAgICAgYmNtb3Nfc3RyZXJyb3IocmMpLAorICAgICAgICAgICAgcmMsCisgICAgICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLm1vZHVsZV9pbmZvLm1vZHVsZV9pZCk7CisgICAgfQorfQorCisjaWZuZGVmIElOX0JBTkQKK3N0YXRpYyBiY21vc190aW1lcl9yYyBleGNlcHRpb25fbW9uaXRvcl90aW1lcl9oYW5kbGVyKGJjbW9zX3RpbWVyICp0aW1lciwgbG9uZyBkYXRhKQoreworICAgIGJjbW9sdF9kZXZpZCBkZXZpY2UgPSAoYmNtb2x0X2RldmlkKWRhdGE7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICBpZiAoIWRldl9jdHJsX2lzX2Nvbm5lY3RlZChkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9wYXJhbXMuc3RhdGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7IC8qIGluIGNhc2UgdGhpcyBoYXBwZW5zIGR1cmluZyBhIGRpc2Nvbm5lY3QvcmVzZXQgb3BlcmF0aW9uICovCisgICAgfQorCisgICAgcmMgPSBkZXZfY3RybF9nZXRfZXhjZXB0aW9uX2xvZ19pZl9wcmVzZW50KGRldmljZSk7CisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0sgJiYgcmMgIT0gQkNNX0VSUl9OT0VOVCkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGRldl9jdHJsX2RiW2RldmljZV0ubG9nX2lkLCAiY2FudCByZWFkIEV4Y2VwdGlvbiBsb2cgZm9yIGRldmljZSAlZCBlcnJvciAlcyAoJWQpXG4iLCBkZXZpY2UsIGJjbW9zX3N0cmVycm9yKHJjKSwgcmMpOworICAgIH0KKyAgICByZXR1cm4gQkNNT1NfVElNRVJfT0s7Cit9CisjZW5kaWYKKworc3RhdGljIGJjbW9zX3RpbWVyX3JjIGRldmljZV9yZXNwb25zZV90aW1lcl9oYW5kbGVyKGJjbW9zX3RpbWVyICp0aW1lciwgbG9uZyBkYXRhKQoreworICAgIGJjbW9sdF9kZXZpZCBkZXZpY2UgPSAoYmNtb2x0X2RldmlkKWRhdGE7CisgICAgZGV2X2N0cmxfc21fY2FsbF9zdGF0ZV9jYihkZXZpY2UsIERFVklDRV9DT05UUk9MX0VWRU5UX0RFVklDRV9USU1FUl9USU1FT1VULCBOVUxMKTsKKyAgICByZXR1cm4gQkNNT1NfVElNRVJfT0s7Cit9CisKK3N0YXRpYyBiY21vc190aW1lcl9yYyByZXNldF9kZWxheV90aW1lcl9oYW5kbGVyKGJjbW9zX3RpbWVyICp0aW1lciwgbG9uZyBkYXRhKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gZGV2X2N0cmxfcGFyYW1zLmhvc3RfcmVzZXRfY2IoKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGRldl9jdHJsX2RiWyhiY21vbHRfZGV2aWQpZGF0YV0ubG9nX2lkLCAiSG9zdCByZXNldCBjYWxsYmFjayBmYWlsZWQ6ICVzICglZClcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSwgcmMpOworICAgIH0KKyAgICByZXR1cm4gQkNNT1NfVElNRVJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBkZXZfY3RybF90aW1lcl9jcmVhdGUoCisgICAgYmNtb2x0X2RldmlkIGRldmljZSwKKyAgICBiY21vc19tb2R1bGVfaWQgbW9kdWxlX2lkLAorICAgIGRldl9jdHJsX3RpbWVyICp0aW1lciwKKyAgICBjb25zdCBjaGFyICpuYW1lLAorICAgIGJjbW9zX2Jvb2wgcGVyaW9kaWMsCisgICAgRl9iY21vc190aW1lcl9oYW5kbGVyIGhhbmRsZXIpCit7CisgICAgYmNtb3NfdGltZXJfcGFybSB0aW1lcl9wYXJhbXMgPSB7fTsKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisKKyAgICBzbnByaW50Zih0aW1lci0+bmFtZSwgc2l6ZW9mKHRpbWVyLT5uYW1lKSwgImRldl9jdHJsXyVzX3RpbWVyJXUiLCBuYW1lLCBkZXZpY2UpOworICAgIHRpbWVyX3BhcmFtcy5uYW1lID0gdGltZXItPm5hbWU7CisgICAgdGltZXJfcGFyYW1zLm93bmVyID0gbW9kdWxlX2lkOworICAgIHRpbWVyX3BhcmFtcy5wZXJpb2RpYyA9IHBlcmlvZGljOworICAgIHRpbWVyX3BhcmFtcy5oYW5kbGVyID0gaGFuZGxlcjsKKyAgICB0aW1lcl9wYXJhbXMuZGF0YSA9IGRldmljZTsKKyAgICByYyA9IGJjbW9zX3RpbWVyX2NyZWF0ZSgmdGltZXItPnRpbWVyLCAmdGltZXJfcGFyYW1zKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGRldl9jdHJsX2RiW2RldmljZV0ubG9nX2lkLAorICAgICAgICAgICAgIiclcycgdGltZXIgY3JlYXRpb24gZmFpbGVkLCBiY21vc190aW1lcl9jcmVhdGUgcmV0dXJuZWQgZXJyb3IgJXMgKCVkKVxuIiwKKyAgICAgICAgICAgIHRpbWVyLT5uYW1lLAorICAgICAgICAgICAgYmNtb3Nfc3RyZXJyb3IocmMpLAorICAgICAgICAgICAgcmMpOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworI2lmbmRlZiBJTl9CQU5ECitzdGF0aWMgdm9pZCBkZXZfY3RybF9saW5rX3VwX2Rvd25fY2IodWludDhfdCBkZXZfaWQsIGJjbV9sbF9wY2llX2xpbmtfc3RhdHVzIHN0YXR1cykKK3sKKyAgICBCQ01fTE9HKElORk8sIGRldl9jdHJsX2RiW2Rldl9pZF0ubG9nX2lkLCAiRGV2aWNlICV1OiBQQ0llIGxpbmsgJXNcbiIsIGRldl9pZCwgc3RhdHVzID09IEJDTV9MTF9QQ0lFX0xJTktfRE9XTiA/ICJkb3duIiA6ICJ1cCIpOworfQorI2VuZGlmCisKK3N0YXRpYyBiY210cm11eF9tc2dfZGVzdCBkZXZfY3RybF9tc2dfZmlsdGVyX2NiKAorICAgIGJjbW9sdF9kZXZpZCBkZXZpY2UsCisgICAgYmNtb2x0X29ial9pZCBvYmosCisgICAgYmNtb2x0X21ndF9ncm91cCBncm91cCwKKyAgICB1aW50MTZfdCBzdWJncm91cCkKK3sKKyAgICAvKiBEZXZpY2UgY29udHJvbCBzaG91bGQgaW50ZXJjZXB0IHRoZSBtZXNzYWdlIGlmIG9uZSBvZiB0aGUgdHdvIGhhcHBlbnM6CisgICAgICogMS4gVGhlIG1lc3NhZ2Ugb2JqZWN0IGlzICJkZXZpY2UiLgorICAgICAqIDIuIFRoZSBtZXNzYWdlIG9iamVjdCBpcyBub3QgImRldmljZSIsIGJ1dCB0aGUgZGV2aWNlIGlzIG5vdCByZWFkeSwgc28gYW4gYXBwcm9wcmlhdGUgZXJyb3Igc2hvdWxkIGJlIHJldHVybmVkIHRvCisgICAgICogICAgdGhlIGhvc3QgYXBwbGljYXRpb24uICovCisgICAgYmNtdHJtdXhfbXNnX2Rlc3QgZGVzdCA9IEJDTVRSTVVYX0RFU1RfUkVNT1RFOworCisgICAgaWYgKCFkZXZfY3RybF9pc19jb25uZWN0ZWQoZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zLnN0YXRlKSkKKyAgICB7CisgICAgICAgIGRlc3QgPSBCQ01UUk1VWF9ERVNUX0xPQ0FMOworICAgIH0KKyAgICBlbHNlIGlmIChvYmogPT0gQkNNT0xUX09CSl9JRF9ERUJVRykKKyAgICB7CisgICAgICAgIGRlc3QgPSBCQ01UUk1VWF9ERVNUX0xPQ0FMOworICAgIH0KKyAgICBlbHNlIGlmIChvYmogPT0gQkNNT0xUX09CSl9JRF9ERVZJQ0UpCisgICAgeworICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9PUEVSX0lEX0lNQUdFX1RSQU5TRkVSX1NUQVJUOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX09QRVJfSURfSU1BR0VfVFJBTlNGRVJfREFUQToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9PUEVSX0lEX1NXX1VQR1JBREVfQUNUSVZBVEU6CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTVRSTVVYX0RFU1RfUkVNT1RFOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNVFJNVVhfREVTVF9MT0NBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTVRSTVVYX0RFU1RfTE9DQUw7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRlc3Q7Cit9CisKK3N0YXRpYyB2b2lkIGRldl9jdHJsX2luaXRfZGV2aWNlX29iamVjdHMoYmNtb2x0X2RldmlkIGRldmljZSkKK3sKKyAgICBkZXZfY3RybF9jbGVhcl9kZXZpY2VfY2ZnKGRldmljZSk7CisgICAgZGV2X2N0cmxfaW5pdF9jb25uZWN0aW9uX3N0YXRlKGRldmljZSk7CisgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zLnN0YXRlID0gQkNNT0xUX0RFVklDRV9TVEFURV9ESVNDT05ORUNURUQ7CisgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zLnN5c3RlbV9tb2RlID0gQkNNT0xUX1NZU1RFTV9NT0RFX19OVU1fT0Y7CisgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5ib290X3NlcV9pbmZvLnBvbGxpbmdfY291bnRlciA9IEJPT1RfU0VRX1BPTExJTkdfTUFYX05VTUJFUjsKKyAgICBkZXZfY3RybF9kYltkZXZpY2VdLmJvb3Rfc2VxX2luZm8ucG9sbGluZ19pbnRlcnZhbCA9IEJPT1RfU0VRX1BPTExfSU5URVJWQUxfU0VDICogQkNNT1NfTUlDUk9TRUNPTkRTX0lOX1NFQ09ORFM7CisgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5jb3JyX3RhZyA9IDA7CisjaWZkZWYgRU5BQkxFX0xPRworICAgIGRldl9jdHJsX2RiW2RldmljZV0uc3JhbV9sb2dfb2Zmc2V0ID0gMDsKKyAgICBkZXZfY3RybF9kYltkZXZpY2VdLm1zZ3NfcmVhZCA9IDA7CisjZW5kaWYKKworI2lmbmRlZiBTSU1VTEFUSU9OX0JVSUxECisgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS50cnhfZGlzYWJsZV9tYXNrID0gMHhGRkZGOyAvKiBNYXJrIGFsbCBQT05zIHdpdGggVFJYIGRpc2FibGVkLiAqLworI2VuZGlmCisKKyAgICBkZXZfY3RybF9kYltkZXZpY2VdLmNvbm5fZmFpbF9yZWFzb24gPSBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX05PTkU7CisgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5sYXN0X2V2ZW50ID0gREVWSUNFX0NPTlRST0xfRVZFTlRfTk9fRVZFTlQ7Cit9CisKK2JjbW9zX2Vycm5vIGJjbW9sdF9kZXZfY3RybF9ob3N0X2V2ZW50X3dyaXRlKHVpbnQzMl90IGRldmljZSwgdWludDMyX3QgZXZlbnQpCit7CisjaWZuZGVmIElOX0JBTkQKKyAgICBiY21vbHRfZGV2aWNlX3N0YXRlIHN0YXRlID0gZGV2X2N0cmxfZGJbZGV2aWNlXS5kZXZpY2VfcGFyYW1zLnN0YXRlOworI2VuZGlmCisjaWZuZGVmIFNJTVVMQVRJT05fQlVJTEQKKyAgICAvKiBVcGRhdGUgbG9jYWwgZGF0YWJhc2UsIHNvIHRoYXQgYWZ0ZXIgcmVzZXQgd2Ugd2lsbCBiZSBhYmxlIHRvIHN5bmMgdGhpcyB2YWx1ZSB3aXRoIHRoZSBkZXZpY2UuICovCisgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS50cnhfZGlzYWJsZV9tYXNrID0gZXZlbnQ7CisjZW5kaWYKKyNpZm5kZWYgSU5fQkFORAorICAgIC8qIE5vdGlmeSBkZXZpY2UgdXNpbmcgU1JBTSwgYnV0IG9ubHkgaWYgd2UgYXJlIGFscmVhZHkgY29ubmVjdGVkIChvdGhlcndpc2UgRkxEIG1pZ2h0IGJlIG5vdCByZWFkeSkuICovCisgICAgaWYgKGRldl9jdHJsX2lzX2Nvbm5lY3RlZChzdGF0ZSkpCisgICAgICAgIGJjbV9mbGRfc2V0X2hvc3RfZXZlbnQoZGV2aWNlLCBldmVudCk7CisjZW5kaWYKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKy8qVXNlIGRpZmZlcmVudCBmdW5jdGlvbiBzaWduYXR1cmVzIGxpbnV4IGtlcm5lbCBkZXZpY2UgY29udHJvbCBhbmQgb3RoZXIqLworI2lmICFkZWZpbmVkKExJTlVYX1VTRVJfU1BBQ0UpCitiY21vc19lcnJubyBiY21vbHRfZGV2X2N0cmxfaW5pdChiY21vbHRfZGV2X2N0cmxfcGFyYW1zICpwYXJhbXMpCisjZWxzZQorYmNtb3NfZXJybm8gYmNtb2x0X2Rldl9jdHJsX2luaXQoKQorI2VuZGlmCit7CisgICAgYmNtb2x0X2RldmlkIGRldmljZTsKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisKKyNpZiAhZGVmaW5lZChMSU5VWF9VU0VSX1NQQUNFKQorICAgIGlmICghcGFyYW1zLT5zeXN0ZW1fbW9kZV92YWxpZGF0ZV9jYiB8fAorICAgICAgICAhcGFyYW1zLT5pbWFnZV9yZWFkX2NiIHx8CisgICAgICAgICFwYXJhbXMtPmRldmljZV9vZmZfY2IgfHwKKyAgICAgICAgIXBhcmFtcy0+ZGV2aWNlX29uX2NiIHx8CisgICAgICAgICFwYXJhbXMtPmRldmljZV9pc19ydW5uaW5nX2NiIHx8CisgICAgICAgICFwYXJhbXMtPmhvc3RfcmVzZXRfY2IgfHwKKyAgICAgICAgIXBhcmFtcy0+cGNpZV9jaGFubmVsX3ByZXBhcmVfY2IgfHwKKyAgICAgICAgIXBhcmFtcy0+cGNpZV9jaGFubmVsX3JlbW92ZV9jYikKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiTWlzc2luZyByZXF1aXJlZCBjYWxsYmFja3NcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGRldl9jdHJsX3BhcmFtcyA9ICpwYXJhbXM7CisjZW5kaWYKKyAgICByYyA9IGJjbXRybXV4X2luaXQoZGV2X2N0cmxfbXNnX2ZpbHRlcl9jYik7CisgICAgQkNNT1NfVFJBQ0VfQ0hFQ0tfUkVUVVJOKHJjLCByYywgImJjbXRybXV4X2luaXQoKVxuIik7CisKKyNpZm5kZWYgSU5fQkFORAorICAgIHJjID0gYmNtX2ZsZF9pbml0KEJDTVRSX01BWF9PTFRTKTsKKyAgICBCQ01PU19UUkFDRV9DSEVDS19SRVRVUk4ocmMsIHJjLCAiYmNtX2ZsZF9pbml0KClcbiIpOworI2VuZGlmCisKKyAgICBmb3IgKGRldmljZSA9IDA7IGRldmljZSA8IEJDTVRSX01BWF9PTFRTOyBkZXZpY2UrKykKKyAgICB7CisjaWZkZWYgRU5BQkxFX0xPRworICAgICAgICBjaGFyIGxvZ19uYW1lW01BWF9ERVZfTE9HX0lEX05BTUVdOworICAgICAgICBzbnByaW50Zihsb2dfbmFtZSwgc2l6ZW9mKGxvZ19uYW1lKSAtIDEsICJkZXZfY3RybF8ldSIsIGRldmljZSk7CisgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0ubG9nX2lkID0gYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIobG9nX25hbWUsIERFVl9MT0dfTEVWRUxfSU5GTywgREVWX0xPR19JRF9UWVBFX0JPVEgpOworI2VuZGlmCisgICAgICAgIGRldl9jdHJsX2luaXRfZGV2aWNlX29iamVjdHMoZGV2aWNlKTsKKyAgICAgICAgaW1hZ2VfYnVmW2RldmljZV0gPSBiY21vc19hbGxvYyhJTUFHRV9CVUZfU0laRSk7CisgICAgICAgIGlmICghaW1hZ2VfYnVmW2RldmljZV0pCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGRldl9jdHJsX2RiW2RldmljZV0ubG9nX2lkLCAiQ2FuJ3QgYWxsb2NhdGUgcGFja2V0IGJ1ZmZlclxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgfQorICAgICAgICByZF9pbWFnZV9idWZbZGV2aWNlXSA9IGJjbW9zX2FsbG9jKElNQUdFX0JVRl9TSVpFKTsKKyAgICAgICAgaWYgKCFyZF9pbWFnZV9idWZbZGV2aWNlXSkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgZGV2X2N0cmxfZGJbZGV2aWNlXS5sb2dfaWQsICJDYW4ndCBhbGxvY2F0ZSBuaF9wYWNrZXQgYnVmZmVyXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICB9CisgICAgICAgIHJjID0gZGV2X2N0cmxfaW5pdF90YXNrcyhkZXZpY2UpOworICAgICAgICBCQ01fREVWX0NUUkxfUkVUVVJOX09OX0VSUk9SKGRldmljZSwgcmMsICJkZXZfY3RybF9pbml0X3Rhc2tzKClcbiIpOworCisgICAgICAgIHJjID0gZGV2X2N0cmxfaW5pdF9tb2R1bGVzKGRldmljZSk7CisgICAgICAgIEJDTV9ERVZfQ1RSTF9SRVRVUk5fT05fRVJST1IoZGV2aWNlLCByYywgImRldl9jdHJsX2luaXRfbW9kdWxlcygpXG4iKTsKKworICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmthX2luZm8ub3JpZyA9IEJDTV9LRUVQX0FMSVZFX01TR19PUklHX0hPU1Q7CisgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0ua2FfaW5mby5zZW5kX2hhbmRsZXIgPSBkZXZfY3RybF9rYV90eF9oYW5kbGVyOworICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmthX2luZm8uZGlzY29ubmVjdF9oYW5kbGVyID0gZGV2X2N0cmxfa2FfZGlzY29ubmVjdF9oYW5kbGVyOworICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLmthX2luZm8uZGV2aWNlID0gZGV2aWNlOworICAgICAgICByYyA9IGNyZWF0ZV9rZWVwX2FsaXZlX3RpbWVyKCZkZXZfY3RybF9kYltkZXZpY2VdLmthX2luZm8sIGRldl9jdHJsX2RiW2RldmljZV0ubW9kdWxlX2luZm8ubW9kdWxlX2lkKTsKKyAgICAgICAgQkNNX0RFVl9DVFJMX1JFVFVSTl9PTl9FUlJPUihkZXZpY2UsIHJjLCAiY3JlYXRlX2tlZXBfYWxpdmVfdGltZXIoKVxuIik7CisKKyAgICAgICAgcmMgPSBkZXZfY3RybF90aW1lcl9jcmVhdGUoCisgICAgICAgICAgICBkZXZpY2UsCisgICAgICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLm1vZHVsZV9pbmZvLm1vZHVsZV9pZCwKKyAgICAgICAgICAgICZkZXZfY3RybF9kYltkZXZpY2VdLmNvbm5lY3Rpb25faW5mby50aW1lciwKKyAgICAgICAgICAgICJjb25uZWN0aW9uIiwKKyAgICAgICAgICAgIEJDTU9TX0ZBTFNFLCAvKiBub24tcGVyaW9kaWMgKi8KKyAgICAgICAgICAgIGRldl9jdHJsX2Nvbm5lY3Rpb25fdGltZXJfaGFuZGxlcik7CisgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihyYywgcmMpOworCisjaWZuZGVmIElOX0JBTkQKKyAgICAgICAgcmMgPSBkZXZfY3RybF90aW1lcl9jcmVhdGUoCisgICAgICAgICAgICBkZXZpY2UsCisgICAgICAgICAgICBkZXZfY3RybF9kYltkZXZpY2VdLm1vZHVsZV9pbmZvLm1vZHVsZV9pZCwKKyAgICAgICAgICAgICZkZXZfY3RybF9kYltkZXZpY2VdLmJvb3Rfc2VxX2luZm8udGltZXIsCisgICAgICAgICAgICAiYm9vdF9zZXEiLAorICAgICAgICAgICAgQkNNT1NfVFJVRSwgLyogcGVyaW9kaWMgKi8KKyAgICAgICAgICAgIGRldl9jdHJsX2Jvb3Rfc2VxX3RpbWVyX2hhbmRsZXIpOworICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IocmMsIHJjKTsKKworICAgICAgICByYyA9IGRldl9jdHJsX3RpbWVyX2NyZWF0ZSgKKyAgICAgICAgICAgIGRldmljZSwKKyAgICAgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0ubW9kdWxlX2luZm8ubW9kdWxlX2lkLAorICAgICAgICAgICAgJmRldl9jdHJsX2RiW2RldmljZV0uZXhjZXB0aW9uX21vbml0b3JfdGltZXIsCisgICAgICAgICAgICAiZXhjZXB0aW9uX21vbml0b3IiLAorICAgICAgICAgICAgQkNNT1NfVFJVRSwgLyogcGVyaW9kaWMgKi8KKyAgICAgICAgICAgIGV4Y2VwdGlvbl9tb25pdG9yX3RpbWVyX2hhbmRsZXIpOworICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IocmMsIHJjKTsKKyNlbmRpZgorICAgICAgICByYyA9IGRldl9jdHJsX3RpbWVyX2NyZWF0ZSgKKyAgICAgICAgICAgIGRldmljZSwKKyAgICAgICAgICAgIGRldl9jdHJsX2RiW2RldmljZV0ubW9kdWxlX2luZm8ubW9kdWxlX2lkLAorICAgICAgICAgICAgJmRldl9jdHJsX2RiW2RldmljZV0uZGV2aWNlX3Jlc3BvbnNlX3RpbWVyLAorICAgICAgICAgICAgImRldmljZV9yZXNwb25zZSIsCisgICAgICAgICAgICBCQ01PU19GQUxTRSwgLyogbm9uLXBlcmlvZGljICovCisgICAgICAgICAgICBkZXZpY2VfcmVzcG9uc2VfdGltZXJfaGFuZGxlcik7CisgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihyYywgcmMpOworCisgICAgICAgIHJjID0gZGV2X2N0cmxfdGltZXJfY3JlYXRlKAorICAgICAgICAgICAgZGV2aWNlLAorICAgICAgICAgICAgZGV2X2N0cmxfZGJbZGV2aWNlXS5tb2R1bGVfaW5mby5tb2R1bGVfaWQsCisgICAgICAgICAgICAmZGV2X2N0cmxfZGJbZGV2aWNlXS5yZXNldF9kZWxheV90aW1lciwKKyAgICAgICAgICAgICJyZXNldF9kZWxheSIsCisgICAgICAgICAgICBCQ01PU19GQUxTRSwgLyogbm9uLXBlcmlvZGljICovCisgICAgICAgICAgICByZXNldF9kZWxheV90aW1lcl9oYW5kbGVyKTsKKyAgICAgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKHJjLCByYyk7CisKKyAgICAgICAgLyogUmVnaXN0ZXIgY2FsbGJhY2sgdG8gTVVYICovCisgICAgICAgIHJjID0gYmNtdHJtdXhfbG9jYWxfaGFuZGxlcl9yZWdpc3RlcihkZXZpY2UsIGJjbWRldl9yeF9oYW5kbGVyLCAodm9pZCAqKShsb25nKWRldmljZSk7CisgICAgICAgIEJDTV9ERVZfQ1RSTF9SRVRVUk5fT05fRVJST1IoZGV2aWNlLCByYywgImJjbXRybXV4X2xvY2FsX2hhbmRsZXJfcmVnaXN0ZXIoKVxuIik7CisKKyAgICAgICAgLyogSW50ZXJjZXB0IENPTk5FQ1RJT05fRVNUQUJMSVNIRUQsIERFVklDRV9SRUFEWSwgS0VFUF9BTElWRSBtZXNzYWdlcyAqLworICAgICAgICByYyA9IGJjbXRybXV4X2NvbnRyb2xfYXV0b19pbnRlcmNlcHRfZmlsdGVyKAorICAgICAgICAgICAgZGV2aWNlLAorICAgICAgICAgICAgQkNNT0xUX09CSl9JRF9ERVZJQ0UsCisgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0FVVE9fSURfQ09OTkVDVElPTl9FU1RBQkxJU0hFRCk7CisgICAgICAgIHJjID0gcmMgPyByYyA6IGJjbXRybXV4X2NvbnRyb2xfYXV0b19pbnRlcmNlcHRfZmlsdGVyKAorICAgICAgICAgICAgZGV2aWNlLAorICAgICAgICAgICAgQkNNT0xUX09CSl9JRF9ERVZJQ0UsCisgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0FVVE9fSURfREVWSUNFX1JFQURZKTsKKyAgICAgICAgcmMgPSByYyA/IHJjIDogYmNtdHJtdXhfY29udHJvbF9hdXRvX2ludGVyY2VwdF9maWx0ZXIoCisgICAgICAgICAgICBkZXZpY2UsCisgICAgICAgICAgICBCQ01PTFRfT0JKX0lEX0RFVklDRSwKKyAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9ERVZJQ0VfS0VFUF9BTElWRSk7CisgICAgICAgIEJDTV9ERVZfQ1RSTF9SRVRVUk5fT05fRVJST1IoZGV2aWNlLCByYywgImJjbXRybXV4X2NvbnRyb2xfYXV0b19pbnRlcmNlcHRfZmlsdGVyKClcbiIpOworICAgIH0KKyNpZm5kZWYgSU5fQkFORAorICAgIC8qIFJlZ2lzdGVyIGZvciBsaW5rX3VwIC8gbGlua19kb3duIGludGVycnVwdCAqLworICAgIGJjbV9sbF9wY2llX3N0YXR1c19jaGFuZ2VfcmVnaXN0ZXIoZGV2X2N0cmxfbGlua191cF9kb3duX2NiKTsKKyNlbmRpZgorCisgICAgYmNtb2x0X2RlYnVnX2N0cmxfaW5pdCgpOworCisgICAgcmV0dXJuIHJjOworfQorCit2b2lkIGJjbW9sdF9kZXZfY3RybF9leGl0KHZvaWQpCit7CisjaWZuZGVmIElOX0JBTkQKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlOworCisgICAgZm9yIChkZXZpY2UgPSAwOyBkZXZpY2UgPCBCQ01UUl9NQVhfT0xUUzsgZGV2aWNlKyspCisgICAgeworICAgICAgICBiY210cm11eF9sb2NhbF9oYW5kbGVyX3VucmVnaXN0ZXIoZGV2aWNlKTsKKyAgICAgICAgYmNtb3NfZnJlZShpbWFnZV9idWZbZGV2aWNlXSk7CisgICAgICAgIGJjbW9zX2ZyZWUocmRfaW1hZ2VfYnVmW2RldmljZV0pOworICAgICAgICBiY21vc190aW1lcl9kZXN0cm95KCZkZXZfY3RybF9kYltkZXZpY2VdLmNvbm5lY3Rpb25faW5mby50aW1lci50aW1lcik7CisgICAgICAgIGJjbW9zX3RpbWVyX2Rlc3Ryb3koJmRldl9jdHJsX2RiW2RldmljZV0ua2FfaW5mby5rYV90aW1lci50aW1lcik7CisgICAgICAgIGJjbW9zX3RpbWVyX2Rlc3Ryb3koJmRldl9jdHJsX2RiW2RldmljZV0uYm9vdF9zZXFfaW5mby50aW1lci50aW1lcik7CisgICAgICAgIGJjbW9zX3RpbWVyX2Rlc3Ryb3koJmRldl9jdHJsX2RiW2RldmljZV0uZXhjZXB0aW9uX21vbml0b3JfdGltZXIudGltZXIpOworICAgICAgICBiY21vc190aW1lcl9kZXN0cm95KCZkZXZfY3RybF9kYltkZXZpY2VdLmRldmljZV9yZXNwb25zZV90aW1lci50aW1lcik7CisgICAgICAgIGJjbW9zX3RpbWVyX2Rlc3Ryb3koJmRldl9jdHJsX2RiW2RldmljZV0ucmVzZXRfZGVsYXlfdGltZXIudGltZXIpOworICAgICAgICBiY21vc19tb2R1bGVfZGVzdHJveShkZXZfY3RybF9kYltkZXZpY2VdLm1vZHVsZV9pbmZvLm1vZHVsZV9pZCk7CisgICAgICAgIGJjbW9zX3Rhc2tfZGVzdHJveSgmZGV2X2N0cmxfZGJbZGV2aWNlXS50YXNrX2luZm8udGFzayk7CisgICAgfQorI2VuZGlmCisjaWZuZGVmIElOX0JBTkQKKyAgICBiY21fZmxkX2V4aXQoKTsKKyNlbmRpZgorICAgIGJjbXRybXV4X2V4aXQoKTsKKyNpZm5kZWYgSU5fQkFORAorICAgIGJjbV9sbF9wY2llX3N0YXR1c19jaGFuZ2VfdW5yZWdpc3RlcigpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZGV2X2N0cmwvYmNtb2x0X2Rldl9jdHJsLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZGV2X2N0cmwvYmNtb2x0X2Rldl9jdHJsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE4N2JhMwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9kZXZfY3RybC9iY21vbHRfZGV2X2N0cmwuaApAQCAtMCwwICsxLDIwNSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBfQkNNT0xUX0RFVl9DVFJMX0hfCisjZGVmaW5lIF9CQ01PTFRfREVWX0NUUkxfSF8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbW9sdF9tc2cuaD4KKyNpbmNsdWRlIDxiY21vbHRfbW9kZWxfdHlwZXMuaD4KKyNpbmNsdWRlICJiY21fa2VlcF9hbGl2ZS5oIgorI2luY2x1ZGUgImJjbW9sdF9mbGQuaCIKKyNpbmNsdWRlICJiY21vbHRfc3dfZXJyb3IuaCIKKwordHlwZWRlZiBpbnQgKCpiY21vbHRfZGV2X2N0cmxfY2JfaW1hZ2VfcmVhZCkoCisgICAgYmNtb2x0X2RldmlkIGRldmljZSwKKyAgICBiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgaW1hZ2VfdHlwZSwKKyAgICB1aW50MzJfdCBvZmZzZXQsCisgICAgdWludDhfdCAqYnVmLAorICAgIHVpbnQzMl90IGJ1Zl9zaXplKTsKK3R5cGVkZWYgYmNtb3NfZXJybm8gKCpiY21vbHRfZGV2X2N0cmxfY2Jfc3lzdGVtX21vZGVfdmFsaWRhdGUpKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9zeXN0ZW1fbW9kZSBzeXN0ZW1fbW9kZSk7Cit0eXBlZGVmIGJjbW9zX2Vycm5vICgqYmNtb2x0X2Rldl9jdHJsX2NiX2RldmljZV9vZmYpKGJjbW9sdF9kZXZpZCBkZXZpY2UpOwordHlwZWRlZiBiY21vc19lcnJubyAoKmJjbW9sdF9kZXZfY3RybF9jYl9kZXZpY2Vfb24pKGJjbW9sdF9kZXZpZCBkZXZpY2UpOwordHlwZWRlZiBiY21vc19lcnJubyAoKmJjbW9sdF9kZXZfY3RybF9jYl9kZXZpY2VfaXNfcnVubmluZykoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb3NfYm9vbCAqaXNfcnVubmluZyk7Cit0eXBlZGVmIGJjbW9zX2Vycm5vICgqYmNtb2x0X2Rldl9jdHJsX2NiX2hvc3RfcmVzZXQpKHZvaWQpOwordHlwZWRlZiBiY21vc19lcnJubyAoKmJjbW9sdF9kZXZfY3RybF9jYl9wY2llX2NoYW5uZWxfcHJlcGFyZSkoYmNtb2x0X2RldmlkIGRldmljZSk7Cit0eXBlZGVmIGJjbW9zX2Vycm5vICgqYmNtb2x0X2Rldl9jdHJsX2NiX3BjaWVfY2hhbm5lbF9yZW1vdmUpKGJjbW9sdF9kZXZpZCBkZXZpY2UpOwordHlwZWRlZiBiY21vc19lcnJubyAoKmJjbW9sdF9kZXZfY3RybF9jYl9wY2llX3N0YXR1c19nZXQpKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9zX2Jvb2wgKmlzX3ByZXBhcmVkKTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21vbHRfZGV2X2N0cmxfY2Jfc3lzdGVtX21vZGVfdmFsaWRhdGUgICAgc3lzdGVtX21vZGVfdmFsaWRhdGVfY2I7CisgICAgYmNtb2x0X2Rldl9jdHJsX2NiX2ltYWdlX3JlYWQgICAgICAgICAgICAgIGltYWdlX3JlYWRfY2I7CisgICAgYmNtb2x0X2Rldl9jdHJsX2NiX2RldmljZV9vZmYgICAgICAgICAgICAgIGRldmljZV9vZmZfY2I7CisgICAgYmNtb2x0X2Rldl9jdHJsX2NiX2RldmljZV9vbiAgICAgICAgICAgICAgIGRldmljZV9vbl9jYjsKKyAgICBiY21vbHRfZGV2X2N0cmxfY2JfZGV2aWNlX2lzX3J1bm5pbmcgICAgICAgZGV2aWNlX2lzX3J1bm5pbmdfY2I7CisgICAgYmNtb2x0X2Rldl9jdHJsX2NiX2hvc3RfcmVzZXQgICAgICAgICAgICAgIGhvc3RfcmVzZXRfY2I7CisgICAgYmNtb2x0X2Rldl9jdHJsX2NiX3BjaWVfY2hhbm5lbF9wcmVwYXJlICAgIHBjaWVfY2hhbm5lbF9wcmVwYXJlX2NiOworICAgIGJjbW9sdF9kZXZfY3RybF9jYl9wY2llX2NoYW5uZWxfcmVtb3ZlICAgICBwY2llX2NoYW5uZWxfcmVtb3ZlX2NiOworfSBiY21vbHRfZGV2X2N0cmxfcGFyYW1zOworCisjZGVmaW5lIERFVklDRV9DT05UUk9MX01TR19RVUVVRV9TSVpFICBCQ01PU19NU0dfUE9PTF9ERUZBVUxUX1NJWkUKKyNkZWZpbmUgSU1BR0VfQlVGX1NJWkUgICAgICAgICAgICAgICAgICgxICogMTAyNCAqIDEwMjQpIC8qIDFNQiAqLworI2RlZmluZSBCT09UX1NFUV9QT0xMX0lOVEVSVkFMX1NFQyAgICAgMQorI2RlZmluZSBCT09UX1NFUV9QT0xMSU5HX01BWF9OVU1CRVIgICAgNQorI2RlZmluZSBERFJfVEVTVF9QT0xMSU5HX01BWF9OVU1CRVIgICAgMjAKKyNkZWZpbmUgREVWSUNFX0NPTlRST0xfQ09ORklHX1RJTUVfVVMgICgxNSAqIDEwMDAwMDApIC8qIDE1IHNlY29uZHMgKi8KKyNkZWZpbmUgREVWSUNFX0NPTlRST0xfQ09OTkVDVF9USU1FX1VTICg0MCAqIDEwMDAwMDApIC8qIDQwIHNlY29uZHMgKi8KKyNkZWZpbmUgQ09ORklHX1NFTkRfTUFYX05VTUJFUiAgICAgICAgIDIKKyNkZWZpbmUgRklMRV9QQVRIX0xFTiAgICAgICAgICAgICAgICAgIDEyOAorI2RlZmluZSBIT1NUX0RNQV9SWF9ERUZBVUxUX1FVRVVFX1NJWkUgMTI4CisjZGVmaW5lIEhPU1RfRE1BX1RYX0RFRkFVTFRfUVVFVUVfU0laRSAxMjgKKyNkZWZpbmUgRVhDRVBUSU9OX0xPR19NT05JVE9SX0lOVEVSVkFMICg1ICogMTAwMDAwMCkgLyogNSBzZWNvbmQgKi8KKyNkZWZpbmUgREVWSUNFX1JFU1BPTlNFX1RJTUVPVVRfTEVOR1RIICgyICogMTAwMDAwKSAgLyogMjAwIG1pbGxpc2Vjb25kcyAqLworI2RlZmluZSBIT1NUX1JFU0VUX0RFTEFZX1VTICAgICAgICAgICAgMTAwMDAwIC8qIGhvdyBsb25nIHRvIHdhaXQgYmVmb3JlIHJlc2V0dGluZyB0aGUgaG9zdCB2aWEgY2FsbGJhY2sgKDEwMG1zKSAqLworCisvKiBpbmRpY2F0ZXMgc3VjY2Vzc2Z1bCBjb25uZWN0aW9uIC0gdXNlZCBpbnRlcm5hbGx5LCBubyBuZWVkIHRvIGV4cG9zZSB0aGlzIGluIHRoZSBob3N0LWZhY2luZyBlbnVtICovCisjZGVmaW5lIEJDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fTk9ORSAoKGJjbW9sdF9ob3N0X2Nvbm5lY3Rpb25fZmFpbF9yZWFzb24pMHhGRikKKwordHlwZWRlZiBlbnVtCit7CisgICAgREVWSUNFX0NPTlRST0xfRVZFTlRfREVWSUNFX0NMRUFSLAorICAgIERFVklDRV9DT05UUk9MX0VWRU5UX0RFVklDRV9DT05GSUdfU0VULAorICAgIERFVklDRV9DT05UUk9MX0VWRU5UX0RFVklDRV9DT05GSUdfR0VULAorICAgIERFVklDRV9DT05UUk9MX0VWRU5UX0RFVklDRV9USU1FUl9USU1FT1VULAorICAgIERFVklDRV9DT05UUk9MX0VWRU5UX0RFVklDRV9SRUNFSVZFRF9BQ0ssCisgICAgREVWSUNFX0NPTlRST0xfRVZFTlRfREVWSUNFX0RJU0NPTk5FQ1QsCisgICAgREVWSUNFX0NPTlRST0xfRVZFTlRfREVWSUNFX0NPTk5FQ1QsCisgICAgREVWSUNFX0NPTlRST0xfRVZFTlRfREVWSUNFX1JFU0VULAorICAgIERFVklDRV9DT05UUk9MX0VWRU5UX0NPTk5FQ1RJT05fRkFJTFVSRSwKKyAgICBERVZJQ0VfQ09OVFJPTF9FVkVOVF9DT05ORUNUSU9OX0VTVEFCTElTSEVELAorICAgIERFVklDRV9DT05UUk9MX0VWRU5UX0RFVklDRV9SRUFEWSwKKyAgICBERVZJQ0VfQ09OVFJPTF9FVkVOVF9SVU5fRERSX1RFU1QsCisgICAgREVWSUNFX0NPTlRST0xfRVZFTlRfRERSX1RFU1RfQ09NUExFVEVELAorICAgIERFVklDRV9DT05UUk9MX0VWRU5UX0REUl9URVNUX1RJTUVPVVQsCisKKyAgICBERVZJQ0VfQ09OVFJPTF9FVkVOVF9fTlVNX09GLAorICAgIERFVklDRV9DT05UUk9MX0VWRU5UX05PX0VWRU5UID0gREVWSUNFX0NPTlRST0xfRVZFTlRfX05VTV9PRgorfSBkZXZfY3RybF9ldmVudDsKKwordHlwZWRlZiBlbnVtCit7CisgICAgREVWX0NUUkxfQ09OTkVDVElOR19TVEFURV9FU1RBQkxJU0hJTkcsIC8qIHdyaXRpbmcgc29mdHdhcmUgdmlhIEZMRCwgd2FpdGluZyBmb3IgImNvbm5lY3Rpb24gZXN0YWJsaXNoZWQiICovCisgICAgREVWX0NUUkxfQ09OTkVDVElOR19TVEFURV9DT05GSUdVUklORywgIC8qIGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQsIGNmZyBzZW50LCB3YWl0aW5nIGZvciAiZGV2aWNlIHJlYWR5IiAqLworICAgIERFVl9DVFJMX0NPTk5FQ1RJTkdfU1RBVEVfU1RBTkRBTE9ORSwgICAvKiBjb25uZWN0aW5nIHRvIGEgc3RhbmRhbG9uZSBkZXZpY2UsIHdhaXRpbmcgZm9yICJkZXZpY2UgcmVhZHkiICovCit9IGRldl9jdHJsX2Nvbm5lY3Rpbmdfc3RhdGU7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgY2hhciBuYW1lW01BWF9UQVNLX05BTUVfU0laRV07CisgICAgYmNtb3NfdGFzayB0YXNrOworfSBkZXZfY3RybF90YXNrOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGNoYXIgbmFtZVtNQVhfTU9EVUxFX05BTUVfU0laRV07CisgICAgYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZDsKK30gZGV2X2N0cmxfbW9kdWxlOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGNoYXIgbmFtZVtNQVhfVElNRVJfTkFNRV9TSVpFXTsKKyAgICBiY21vc190aW1lciB0aW1lcjsKK30gZGV2X2N0cmxfdGltZXI7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDMyX3QgcGNpZV9hZGRyOworfSBkZXZfY3RybF9wY2llOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGRldl9jdHJsX2Nvbm5lY3Rpbmdfc3RhdGUgc3RhdGU7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICBjb25maWdfc2VuZF9jb3VudGVyOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgY29uZmlnX2ludGVydmFsOworICAgIGRldl9jdHJsX3RpbWVyICAgICAgICAgICAgdGltZXI7Cit9IGRldl9jdHJsX2Nvbm5lY3Rpb247CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDMyX3QgICAgICAgICAgICAgcG9sbGluZ19jb3VudGVyOworICAgIHVpbnQzMl90ICAgICAgICAgICAgIHBvbGxpbmdfaW50ZXJ2YWw7CisgICAgZGV2X2N0cmxfdGltZXIgICAgICAgdGltZXI7Cit9IGRldl9jdHJsX2Jvb3Rfc2VxOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGRldl9jdHJsX3Rhc2sgICAgICAgICAgIHRhc2tfaW5mbzsKKyAgICBkZXZfY3RybF9tb2R1bGUgICAgICAgICBtb2R1bGVfaW5mbzsKKyAgICBkZXZfY3RybF9jb25uZWN0aW9uICAgICBjb25uZWN0aW9uX2luZm87CisgICAgZGV2X2N0cmxfcGNpZSAgICAgICAgICAgcGNpZV9pbmZvOworICAgIGJjbW9zX2tlZXBfYWxpdmVfaW5mbyAgIGthX2luZm87CisgICAgZGV2X2N0cmxfYm9vdF9zZXEgICAgICAgYm9vdF9zZXFfaW5mbzsKKyAgICBiY21fZmxkX2RldmljZV9pbmZvICAgICBmbGRfaW5mbzsKKyAgICBiY21vbHRfZGV2aWNlX2NmZ19kYXRhICBkZXZpY2VfcGFyYW1zOworICAgIGJjbW9sdF9wcmVzZW5jZV9tYXNrICAgIGRldmljZV9wYXJhbXNfcHJlc2VudDsKKyAgICBkZXZfY3RybF90aW1lciAgICAgICAgICBleGNlcHRpb25fbW9uaXRvcl90aW1lcjsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICBjb3JyX3RhZzsKKyAgICBiY21vbHRfbXNnICogICAgICAgICAgICBsYXN0X21lc3NhZ2U7CisgICAgZGV2X2N0cmxfdGltZXIgICAgICAgICAgZGV2aWNlX3Jlc3BvbnNlX3RpbWVyOworICAgIGRldl9jdHJsX3RpbWVyICAgICAgICAgIHJlc2V0X2RlbGF5X3RpbWVyOworICAgIGJjbW9zX2Jvb2wgICAgICAgICAgICAgIGlzX2hvc3RfcmVzZXRfcGVuZGluZzsKKyNpZmRlZiBFTkFCTEVfTE9HCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgc3JhbV9sb2dfb2Zmc2V0OworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1zZ3NfcmVhZDsKKyNlbmRpZgorICAgIGJjbW9sdF9jb250cm9sX3N0YXRlICAgIGVuYWJsZV90b2Q7CisjaWZuZGVmIFNJTVVMQVRJT05fQlVJTEQKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICB0cnhfZGlzYWJsZV9tYXNrOworI2VuZGlmCisgICAgZGV2X2N0cmxfZXZlbnQgbGFzdF9ldmVudDsKKyAgICBiY21vbHRfaG9zdF9jb25uZWN0aW9uX2ZhaWxfcmVhc29uIGNvbm5fZmFpbF9yZWFzb247CisgICAgdWludDMyX3Qgc3dfZXJyb3JfY291bnQ7CisgICAgYmNtb2x0X3N3X2Vycm9yIHN3X2Vycm9yc1szMF07CisgICAgZGV2X2xvZ19pZCBsb2dfaWQ7Cit9IGRldl9jdHJsX2RhdGFiYXNlOworCit0eXBlZGVmIHZvaWQgKCpkZXZfY3RybF9zbV9jYikoYmNtb2x0X2RldmlkIGRldmljZSwgY29uc3QgYmNtb2x0X21zZyAqbXNnKTsKKworI2RlZmluZSBERVZJQ0VfSURfRlJPTV9NT0RVTEVfSUQobW9kdWxlX2lkKSAoKGJjbW9sdF9kZXZpZCkobW9kdWxlX2lkIC0gQkNNT1NfTU9EVUxFX0lEX0RFVl9DVFJMX0RFVjApKQorI2RlZmluZSBNT0RVTEVfSURfRlJPTV9ERVZJQ0VfSUQoZGV2aWNlKSAoKGJjbW9zX21vZHVsZV9pZCkoZGV2aWNlICsgQkNNT1NfTU9EVUxFX0lEX0RFVl9DVFJMX0RFVjApKQorCitjb25zdCBjaGFyICpiY21fc3RyX2RldmljZV9zdGF0ZShiY21vbHRfZGV2aWNlX3N0YXRlIGRldmljZV9zdGF0ZSk7Citjb25zdCBjaGFyICpiY21fc3RyX2RldmljZV9ldmVudChkZXZfY3RybF9ldmVudCBkZXZpY2VfZXZlbnQpOworY29uc3QgY2hhciAqYmNtX3N0cl9ob3N0X2Nvbm5lY3Rpb25fZmFpbF9yZWFzb24oYmNtb2x0X2hvc3RfY29ubmVjdGlvbl9mYWlsX3JlYXNvbiByZWFzb24pOworY29uc3QgY2hhciAqYmNtX3N0cl9ob3N0X2Nvbm5lY3Rpbmdfc3RhdGUoZGV2X2N0cmxfY29ubmVjdGluZ19zdGF0ZSBzdGF0ZSk7Cit2b2lkIGRldl9jdHJsX3JlYWRfZGIoYmNtb2x0X2RldmlkIGRldmljZSwgZGV2X2N0cmxfZGF0YWJhc2UgKmRiKTsKKworYmNtb3NfZXJybm8gYmNtb2x0X2Rldl9jdHJsX2hvc3RfZXZlbnRfd3JpdGUodWludDMyX3QgZGV2aWNlLCB1aW50MzJfdCBldmVudCk7CisKKy8qVXNlIGRpZmZlcmVudCBmdW5jdGlvbiBzaWduYXR1cmVzIGxpbnV4IGtlcm5lbCBkZXZpY2UgY29udHJvbCBhbmQgb3RoZXIqLworI2lmICFkZWZpbmVkKExJTlVYX1VTRVJfU1BBQ0UpCitiY21vc19lcnJubyBiY21vbHRfZGV2X2N0cmxfaW5pdChiY21vbHRfZGV2X2N0cmxfcGFyYW1zICpwYXJhbXMpOworI2Vsc2UKK2JjbW9zX2Vycm5vIGJjbW9sdF9kZXZfY3RybF9pbml0KHZvaWQpOworI2VuZGlmCisKK3ZvaWQgYmNtb2x0X2Rldl9jdHJsX2V4aXQodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2Rldl9jdHJsX2RhZW1vbi9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9kZXZfY3RybF9kYWVtb24vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM3OWE1OQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9kZXZfY3RybF9kYWVtb24vTWFrZWZpbGUKQEAgLTAsMCArMSwyMiBAQAorIyBEZXZpY2UgY29udHJvbCBkcml2ZXIKK01PRF9OQU1FID0gZGV2X2N0cmxfZGFlbW9uCitNT0RfREVQUyA9IHRybXV4ICBkZWJ1Z19jb21tb24ga2VlcF9hbGl2ZSAKKworaWZuZXEgKCIkKFNJTVVMQVRJT05fQlVJTEQpIiwgInkiKQorCU1PRF9ERVBTICs9IHRybXV4X2RhZW1vbiBrZWVwX2FsaXZlX2RhZW1vbgorZW5kaWYKKworTU9EX0lOQ19ESVJTID0gJChTUkNfRElSKQorCitpZmVxICgiJChSRUxFQVNFX0JVSUxEKSIsICJ5IikKKyAgICBNT0RfSU5DX0RJUlMgKz0gaG9zdF9kcml2ZXIvc3dfdmVyc2lvbiBob3N0X2RyaXZlci9zd19lcnJvciBob3N0X2RyaXZlci9taF91dGlscworZWxzZQorICAgIE1PRF9JTkNfRElSUyArPSBob3N0L3N3X3ZlcnNpb24gJChUT1BfRElSKS9jb21tb24vc3dfZXJyb3IgJChUT1BfRElSKS9jb21tb24vbWhfdXRpbHMKK2VuZGlmCisKK01PRF9UWVBFID0gbGliCisKK01PRF9ERUZTICs9IC1ESU5fQkFORAorCitzcmNzID0gYmNtb2x0X2Rldl9jdHJsX2liLmMgYmNtb2x0X2RlYnVnX2N0cmxfaWIuYworCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZGV2X2N0cmxfZGFlbW9uL2JjbW9sdF9kZWJ1Z19jdHJsLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZGV2X2N0cmxfZGFlbW9uL2JjbW9sdF9kZWJ1Z19jdHJsLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMGEyNTI1MwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9kZXZfY3RybF9kYWVtb24vYmNtb2x0X2RlYnVnX2N0cmwuaApAQCAtMCwwICsxIEBACisuLi9kZXZfY3RybC9iY21vbHRfZGVidWdfY3RybC5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2Rldl9jdHJsX2RhZW1vbi9iY21vbHRfZGVidWdfY3RybF9pYi5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2Rldl9jdHJsX2RhZW1vbi9iY21vbHRfZGVidWdfY3RybF9pYi5jCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjM2Mzc4MjkKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZGV2X2N0cmxfZGFlbW9uL2JjbW9sdF9kZWJ1Z19jdHJsX2liLmMKQEAgLTAsMCArMSBAQAorLi4vZGV2X2N0cmwvYmNtb2x0X2RlYnVnX2N0cmwuYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9kZXZfY3RybF9kYWVtb24vYmNtb2x0X2Rldl9jdHJsLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZGV2X2N0cmxfZGFlbW9uL2JjbW9sdF9kZXZfY3RybC5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjNiMDUwOWMKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZGV2X2N0cmxfZGFlbW9uL2JjbW9sdF9kZXZfY3RybC5oCkBAIC0wLDAgKzEgQEAKKy4uL2Rldl9jdHJsL2JjbW9sdF9kZXZfY3RybC5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2Rldl9jdHJsX2RhZW1vbi9iY21vbHRfZGV2X2N0cmxfaWIuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9kZXZfY3RybF9kYWVtb24vYmNtb2x0X2Rldl9jdHJsX2liLmMKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNjIzYmQ5NwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9kZXZfY3RybF9kYWVtb24vYmNtb2x0X2Rldl9jdHJsX2liLmMKQEAgLTAsMCArMSBAQAorLi4vZGV2X2N0cmwvYmNtb2x0X2Rldl9jdHJsLmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZGV2X2N0cmxfZGFlbW9uL3VzZXIvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZGV2X2N0cmxfZGFlbW9uL3VzZXIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFkMDFjYQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9kZXZfY3RybF9kYWVtb24vdXNlci9NYWtlZmlsZQpAQCAtMCwwICsxLDE0IEBACitpZm5lcSAoIiQoU0lNVUxBVElPTl9CVUlMRCkiLCAieSIpCisKK01PRF9OQU1FID0gYmNtX2Rldl9jdHJsX3VzZXIKK01PRF9UWVBFID0gYXBwCitNT0RfREVQUyA9IHVkdHIgb3NfY2xpIHVzZXJfY29uZmlnIGhvc3RfYXBpIGRldl9jdHJsX2RhZW1vbiB0cm11eF9kYWVtb24ga2VlcF9hbGl2ZV9kYWVtb24KKworaWZlcSAoIiQoRU5BQkxFX0NMSSkiLCAieSIpCisJTU9EX0RFUFMgKz0gYXBpX2NsaSBlbWJlZGRlZF9jbGkKK2VuZGlmCisKK3NyY3MgPSBiY21vbHRfZGV2X2N0cmxfdXNlci5jCisKK2VuZGlmCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9kZXZfY3RybF9kYWVtb24vdXNlci9iY21vbHRfZGV2X2N0cmxfdXNlci5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2Rldl9jdHJsX2RhZW1vbi91c2VyL2JjbW9sdF9kZXZfY3RybF91c2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmFhNzIyOQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9kZXZfY3RybF9kYWVtb24vdXNlci9iY21vbHRfZGV2X2N0cmxfdXNlci5jCkBAIC0wLDAgKzEsNzIgQEAKKyNpbmNsdWRlIDxiY21vbHRfdHJfdWRfZHJpdmVyLmg+CisjaW5jbHVkZSA8YmNtX2Rldl9sb2cuaD4KKyNpbmNsdWRlIDxiY21vbHRfZGV2X2N0cmwuaD4KKyNpbmNsdWRlIDxiY21vbHRfdHJfbXV4Lmg+CisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtb2x0X3VzZXJfdXRpbHMuaD4KKyNpbmNsdWRlIDxiY21vbHRfaG9zdF9hcGkuaD4KKyNpbmNsdWRlIDxiY21vbHRfZmxkLmg+CisjaW5jbHVkZSA8YmNtdHJfcGNpZS5oPgorCitleHRlcm4gc3RydWN0IHByb2NfZGlyX2VudHJ5ICpiY21vbHRfZGlyOworCitiY21vc19lcnJubyBiY210cl9pbml0KHZvaWQpCit7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKyNpZmRlZiBFTkFCTEVfTE9HCisjZGVmaW5lIERFVl9MT0dfU0laRTEgMTw8MTEKKyNkZWZpbmUgREVWX0xPR19TSVpFMiAxPDwxMworI2RlZmluZSBERVZfTE9HX1FVRVVFX1NJWkUgMTAwMAorCitzdGF0aWMgYmNtb3NfZXJybm8gZGV2X2N0cmxfbG9nZ2VyX2luaXRfY2Iodm9pZCkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBzdGF0aWMgdWludDhfdCBsb2dnZXJfYnVmMVtERVZfTE9HX1NJWkUxXTsKKyAgICBzdGF0aWMgdWludDhfdCBsb2dnZXJfYnVmMltERVZfTE9HX1NJWkUyXTsKKyAgICB2b2lkICphZGRyZXNzZXNbREVWX0xPR19NQVhfRklMRVNdID0ge2xvZ2dlcl9idWYxLCBsb2dnZXJfYnVmMn07CisgICAgdWludDMyX3Qgc2l6ZXNbREVWX0xPR19NQVhfRklMRVNdID0ge3NpemVvZihsb2dnZXJfYnVmMSksIHNpemVvZihsb2dnZXJfYnVmMil9OworICAgIHVpbnQzMl90IGZsYWdzW0RFVl9MT0dfTUFYX0ZJTEVTXSA9IHtCQ01fREVWX0xPR19GSUxFX0ZMQUdfU1RPUF9XSEVOX0ZVTEwsIEJDTV9ERVZfTE9HX0ZJTEVfRkxBR19XUkFQX0FST1VORH07CisKKyAgICByYyA9IGJjbV9kZXZfbG9nX2luaXRfZGVmYXVsdF9sb2dnZXIoYWRkcmVzc2VzLCBzaXplcywgZmxhZ3MsIEJDTV9TSVpFT0ZBUlJBWShhZGRyZXNzZXMpLCAweDQwMDAsIFRBU0tfUFJJT1JJVFlfREVWX0xPRywgREVWX0xPR19RVUVVRV9TSVpFKTsKKyAgICBCQ01PU19UUkFDRV9DSEVDS19SRVRVUk4ocmMsIHJjLCAiYmNtX2Rldl9sb2dfaW5pdGlhbGl6ZV9kZXZfbG9nZ2VyX2RlZmF1bHQoKVxuIik7CisKKyAgICAvKiBGb3Igbm93IGp1c3QgbWFwIEJDTU9TX1RSQUNFX1hYIHRvIGRldl9sb2cuIExhdGVyIG9uIGRldl9jb250cm9sCisgICAgICogY2FuIGRlZmluZSBpdHMgb3duIGxvZyBpZHMKKyAgICAgKi8KKyAgICAvL3JjID0gYmNtX2Rldl9sb2dfb3NfdHJhY2VfaW5pdCgpOworICAgIC8vQlVHX09OKHJjKTsKKworICAgIHJldHVybiByYzsKK30KKyNlbmRpZgorCisKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBiY21vbHRfaG9zdF9pbml0X3BhcmFtcyBwYXJhbXMgPQorICAgIHsKKyNpZmRlZiBFTkFCTEVfTE9HCisgICAgICAgIC5sb2dnZXJfaW5pdF9jYiA9IGRldl9jdHJsX2xvZ2dlcl9pbml0X2NiLAorI2VuZGlmCisgICAgICAgIC5ydW5fZGV2X2N0cmwgPSBCQ01PU19UUlVFCisgICAgfTsKKworICAgIHJjID0gYmNtb2x0X2hvc3RfaW5pdCgmcGFyYW1zKTsKKyAgICBCVUdfT04ocmMpOworCisgICAgYmNtb3NfdHJhY2VfbGV2ZWxfc2V0KEJDTU9TX1RSQUNFX0xFVkVMX0RFQlVHKTsKKworICAgIHJjID0gYmNtdHJfdWRfaW5pdCgpOyAgLyogIE5ldmVyIHJldHVybnMgLSBydW5zIGFjY2VwdCBsb29wICovCisgICAgQlVHX09OKHJjKTsKKworICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgIHsKKyAgICAgICAgYmNtb3NfdXNsZWVwKDUqMTAwMCoxMDAwKTsKKyAgICAgICAgYmNtb3NfcHJpbnRmKCJXYWl0aW5nXG4iKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9mbGQvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZmxkL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NTcxY2EKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZmxkL01ha2VmaWxlCkBAIC0wLDAgKzEsMzggQEAKKyMgRkxEIGRyaXZlcgorIyAtIGxvdy1sZXZlbCBGTEQgZHJpdmVyIChsb2FkIGZ1bmN0aW9ucykKKyMKK01PRF9OQU1FID0gZmxkCitNT0RfREVQUyA9IG1vZGVsCisKK2lmbmVxICgiJChSRUxFQVNFX0JVSUxEKSIsICJ5IikKKyAgICBNT0RfSU5DX0RJUlMgPSAkKFNSQ19ESVIpIGNvbW1vbi9kcml2ZXJzLyQoUExBVEZPUk0pL2ZsZAorZW5kaWYKKworaWZlcSAoIiQoRU5BQkxFX1RSQUNFKSIsICJ5IikKKwlNT0RfREVGUyArPSAtRFRYX0VOQUJMRV9FVkVOVF9UUkFDRQorICAgIGlmZXEgKCIkKERFQlVHX1RSQUNFX0lOSVQpIiwgInkiKQorICAgICAgIE1PRF9ERUZTICs9IC1EREVCVUdfVFJBQ0VfSU5JVAorICAgIGVuZGlmCitlbmRpZgorCitpZmVxICgiJChPU19LRVJORUwpIiwgImxpbnV4IikKK01PRF9UWVBFID0gbGludXhfbGliCitlbHNlCitNT0RfVFlQRSA9IGxpYgorZW5kaWYKKworIyBJZiBjYWxsZWQgYnkgbGludXgga2VybmVsIGJ1aWxkZXIgLSBhZGQgaW5jbHVkZSBwYXRocyBtYW51YWxseS4KKyMgSXQgaXMgbm90IGVsZWdhbnQsIGJ1dCB3ZSdsbCBub3QgaGF2ZSBtYW55IGxpbnV4IG1vZHVsZXMKK2lmbmVxICgiJChLQlVJTERfU1JDKSIsICIiKQorCS1pbmNsdWRlICQoT1VUX0RJUl9CQVNFKS9NYWtlZmlsZS5jb25maWcuJChNT0RfTkFNRSkKK2VuZGlmCisKKyMgRGlzYWJsZSAiY2FzdCBpbmNyZWFzZXMgcmVxdWlyZWQgYWxpZ25tZW50IG9mIHRhcmdldCB0eXBlIiB3YXJuaW5nLiAKKyMgVGhlcmUgYXJlIHBsYWNlcyBpbiB0aGUgY29kZSB3aXRoIGNhc3RpbmcgZnJvbSAodWludDhfdCAqKSB0byAodWludDMyX3QgKiksIGJ1dCBpbiBmYWN0CisjIHRoZSBidWZmZXIgaXMgd2VsbC1hbGlnbmVkLiAKK0VYVFJBX0NGTEFHUyArPSAtV25vLWVycm9yPWNhc3QtYWxpZ24KKworc3JjcyA9IGJjbW9sdF9mbGQuYworCitVU0VfTElOVCA9IHllcworCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZmxkL2JjbV9mbGRfY29tbW9uLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZmxkL2JjbV9mbGRfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM2YzMyZAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9mbGQvYmNtX2ZsZF9jb21tb24uaApAQCAtMCwwICsxLDI0NSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBCQ01fRkxEX0NPTU1PTl9ICisjZGVmaW5lIEJDTV9GTERfQ09NTU9OX0gKKworI2RlZmluZSBCQ01fRkxEX1NSQU1fU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAgLyogNjQgS0IgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZMRCBjb21tdW5pY2F0aW9uIGFyZWEgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIENPTU1fV09SRF9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCAgICAgICAgICAgICAgICAgICAvKiAzMiBiaXQsIDQgYnl0ZSAqLworI2RlZmluZSBCQ01fRkxEX0NPTU1VTklDQVRJT05fQVJFQV9UT1AgICAgICAgICAgICAgIEJDTV9GTERfU1JBTV9TSVpFCisKKy8qIFBsZWFzZSBkbyBub3QgY2hhbmdlIFBDSUVfT1BBUVVFX0RBVEFfU0laRSBkZWZpbmUsIE1VU1QgYmUgc2FtZSBhcyB1c2VkIGJ5IHBjaWUgZG1hIGRyaXZlciAqLworI2RlZmluZSBQQ0lFX09QQVFVRV9EQVRBX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICgyKjQpICAgICAgICAgICAgICAgLyogdHdvIHBvaW50ZXJzIChCRCBhbmQgU0JEKSAqLworCisjZGVmaW5lIEJPT1RSRUNPUkRfUkVTRVJWRUQgICAgICAgICAgICAgICAgICAgICAgICAgKDIqQ09NTV9XT1JEX1NJWkUpICAvKiA0IHdvcmRzIHJlc2VydmVkIGZvciBmdXR1cmUgbmVlZHMgKi8KKyNkZWZpbmUgQkNNX0ZMRF9DUFVfUE9TVE1PUlRFTV9CVUZfU0laRSAgICAgICAgICAgICAweDAwMDAxMDAwCisKKyNkZWZpbmUgQkNNX0ZMRF9DUFVfU1RBVEVfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAoQkNNX0ZMRF9DT01NVU5JQ0FUSU9OX0FSRUFfVE9QICAgICAgIC0gQ09NTV9XT1JEX1NJWkUpICAgICAvKiAweGZmZmMgKi8KKyNkZWZpbmUgQkNNX0ZMRF9IT1NUX1NUQVRFX09GRlNFVCAgICAgICAgICAgICAgICAgICAoQkNNX0ZMRF9DUFVfU1RBVEVfT0ZGU0VUICAgICAgICAgICAgIC0gQ09NTV9XT1JEX1NJWkUpCisjZGVmaW5lIEJDTV9GTERfQ1BVX0RFQlVHX1NUQVRFX09GRlNFVCAgICAgICAgICAgICAgKEJDTV9GTERfSE9TVF9TVEFURV9PRkZTRVQgICAgICAgICAgICAtIENPTU1fV09SRF9TSVpFKQorI2RlZmluZSBCQ01fRkxEX0hPU1RfREVCVUdfU1RBVEVfT0ZGU0VUICAgICAgICAgICAgIChCQ01fRkxEX0NQVV9ERUJVR19TVEFURV9PRkZTRVQgICAgICAgLSBDT01NX1dPUkRfU0laRSkKKyNkZWZpbmUgQkNNX0ZMRF9DUFVfQk9PVFJFQ19TVEFURV9PRkZTRVQgICAgICAgICAgICAoQkNNX0ZMRF9IT1NUX0RFQlVHX1NUQVRFX09GRlNFVCAgICAgIC0gQ09NTV9XT1JEX1NJWkUpCisjZGVmaW5lIEJDTV9GTERfSE9TVF9CT09UUkVDX1NUQVRFX09GRlNFVCAgICAgICAgICAgKEJDTV9GTERfQ1BVX0JPT1RSRUNfU1RBVEVfT0ZGU0VUICAgICAtIENPTU1fV09SRF9TSVpFKQorCisjZGVmaW5lIEJDTV9GTERfQ1BVX1JFU0VUX1JFQVNPTl9PRkZTRVQgICAgICAgICAgICAgKEJDTV9GTERfSE9TVF9CT09UUkVDX1NUQVRFX09GRlNFVCAgICAtIENPTU1fV09SRF9TSVpFKQorI2RlZmluZSBCQ01fRkxEX0NQVV9FWENFUF9SRUFTT05fT0ZGU0VUICAgICAgICAgICAgIChCQ01fRkxEX0NQVV9SRVNFVF9SRUFTT05fT0ZGU0VUICAgICAgLSBDT01NX1dPUkRfU0laRSkKKyNkZWZpbmUgQkNNX0ZMRF9DUFVfRERSX01FTUNfU1RBVEVfT0ZGU0VUICAgICAgICAgICAoQkNNX0ZMRF9DUFVfRVhDRVBfUkVBU09OX09GRlNFVCAgICAgIC0gQ09NTV9XT1JEX1NJWkUpCisjZGVmaW5lIEJDTV9GTERfUkFTXzBfRERSX01FTUNfU1RBVEVfT0ZGU0VUICAgICAgICAgKEJDTV9GTERfQ1BVX0REUl9NRU1DX1NUQVRFX09GRlNFVCAgICAtIENPTU1fV09SRF9TSVpFKQorI2RlZmluZSBCQ01fRkxEX1JBU18xX0REUl9NRU1DX1NUQVRFX09GRlNFVCAgICAgICAgIChCQ01fRkxEX1JBU18wX0REUl9NRU1DX1NUQVRFX09GRlNFVCAgLSBDT01NX1dPUkRfU0laRSkKKworI2RlZmluZSBCQ01fRkxEX0NQVV9ERFJfUEhZX1NUQVRFX09GRlNFVCAgICAgICAgICAgIChCQ01fRkxEX1JBU18xX0REUl9NRU1DX1NUQVRFX09GRlNFVCAgLSBDT01NX1dPUkRfU0laRSkKKyNkZWZpbmUgQkNNX0ZMRF9SQVNfMF9ERFJfUEhZX1NUQVRFX09GRlNFVCAgICAgICAgICAoQkNNX0ZMRF9DUFVfRERSX1BIWV9TVEFURV9PRkZTRVQgICAgIC0gNipDT01NX1dPUkRfU0laRSkKKyNkZWZpbmUgQkNNX0ZMRF9SQVNfMV9ERFJfUEhZX1NUQVRFX09GRlNFVCAgICAgICAgICAoQkNNX0ZMRF9SQVNfMF9ERFJfUEhZX1NUQVRFX09GRlNFVCAgIC0gNipDT01NX1dPUkRfU0laRSkKKyNkZWZpbmUgQkNNX0ZMRF9CT09UX1BST1RPQ09MX1ZFUlNJT05fT0ZGU0VUICAgICAgICAoQkNNX0ZMRF9SQVNfMV9ERFJfUEhZX1NUQVRFX09GRlNFVCAgIC0gNipDT01NX1dPUkRfU0laRSkKKyNkZWZpbmUgQkNNX0ZMRF9PU19FTlRSWV9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAoQkNNX0ZMRF9CT09UX1BST1RPQ09MX1ZFUlNJT05fT0ZGU0VUIC0gQ09NTV9XT1JEX1NJWkUpCisjZGVmaW5lIEJDTV9GTERfQ1BVX1NFVF9RVUVVRVNfU0laRSAgICAgICAgICAgICAgICAgKEJDTV9GTERfT1NfRU5UUllfT0ZGU0VUIC0gQ09NTV9XT1JEX1NJWkUpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBCb290LXJlY29yZCAgYXJlYSAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGhvc3Qgd3JpdGUgZm9yIFNvQyBpdHMgcnggcXVldWUgc2l6ZSAqLworI2RlZmluZSBCQ01fRkxEX0hPU1RfUlhfUVVFVUVfU0laRV9PRkZTRVQgICAgICAgICAgIChCQ01fRkxEX0NQVV9TRVRfUVVFVUVTX1NJWkUgLSBDT01NX1dPUkRfU0laRSkKKyNkZWZpbmUgQkNNX0ZMRF9DUFVfUlhfUVVFVUVfU0laRV9PRkZTRVQgICAgICAgICAgICAoQkNNX0ZMRF9IT1NUX1JYX1FVRVVFX1NJWkVfT0ZGU0VUIC0gQ09NTV9XT1JEX1NJWkUpCisKKyNkZWZpbmUgQkNNX0ZMRF9DUFVfQk9PVFJFQ09SRF9PRkZTRVQgICAgICAgICAgICAgICAoQkNNX0ZMRF9DUFVfUlhfUVVFVUVfU0laRV9PRkZTRVQgLSBCT09UUkVDT1JEX1JFU0VSVkVEKQorCisjZGVmaW5lIEJDTV9GTERfSE9TVF9CT09UUkVDT1JEX09GRlNFVCAgICAgICAgICAgICAgKEJDTV9GTERfQ1BVX0JPT1RSRUNPUkRfT0ZGU0VUIC0gUENJRV9PUEFRVUVfREFUQV9TSVpFIC0gQk9PVFJFQ09SRF9SRVNFUlZFRCApCisKKyNkZWZpbmUgQkNNX0ZMRF9DUFUxX1BPU1RNT1JURU1fU1RBVEUgICAgICAgICAgICAgICAoQkNNX0ZMRF9IT1NUX0JPT1RSRUNPUkRfT0ZGU0VUIC0gQ09NTV9XT1JEX1NJWkUpCisjZGVmaW5lIEJDTV9GTERfQ1BVMF9QT1NUTU9SVEVNX1NUQVRFICAgICAgICAgICAgICAgKEJDTV9GTERfQ1BVMV9QT1NUTU9SVEVNX1NUQVRFIC0gQ09NTV9XT1JEX1NJWkUpCisKKyNkZWZpbmUgQkNNX0ZMRF9SQVNfMF9TRVRUSU5HUyAgICAgICAgICAgICAgICAgICAgICAoQkNNX0ZMRF9DUFUwX1BPU1RNT1JURU1fU1RBVEUgLSBDT01NX1dPUkRfU0laRSkKKyNkZWZpbmUgQkNNX0ZMRF9SQVNfMV9TRVRUSU5HUyAgICAgICAgICAgICAgICAgICAgICAoQkNNX0ZMRF9SQVNfMF9TRVRUSU5HUyAtIENPTU1fV09SRF9TSVpFKQorCisjZGVmaW5lIEJDTV9SQVNfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSBCQ01fUkFTX01PREVfR1BPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgQkNNX1JBU19NT0RFX1hHUE9OICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyCisKKyNkZWZpbmUgQkNNX0ZMRF9BVlNfU0VUVElOR1MgICAgICAgICAgICAgICAgICAgICAgICAgKEJDTV9GTERfUkFTXzFfU0VUVElOR1MgLSBDT01NX1dPUkRfU0laRSkKKyNkZWZpbmUgQkNNX0ZMRF9BVlNfU1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lIEJDTV9GTERfQVZTX0NPTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorCisjaWZkZWYgVFhfRU5BQkxFX0VWRU5UX1RSQUNFCisjZGVmaW5lIEJDTV9GTERfRVZFTlRfVFJBQ0VfT0ZGU0VUICAgICAgICAgICAgICAgICAgIChCQ01fRkxEX0FWU19TRVRUSU5HUyAtIENPTU1fV09SRF9TSVpFKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgUEFZIEFUVEVOVElPTiAhISEgQkNNX0ZMRF9DT01NVU5JQ0FUSU9OX0FSRUFfQkFTRSBtdXN0IGJlIGVxdWFsIGZpcnN0IGJ5dGUgaW4gdGhlIEZMRAorICAgICAgICAgICAgY29tbXVuaWNhdGlvbiBhcmVhIHRoZXJlZm9yZSAgaXQgc2hvdWxkIGJlIGVxdWFsIHRvIHRoZSBsYXN0IGRlZmluZSBhYm92ZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEJDTV9GTERfQ09NTVVOSUNBVElPTl9BUkVBX0JBU0UgICAgICAgICAgICAgQkNNX0ZMRF9FVkVOVF9UUkFDRV9PRkZTRVQKKyNlbHNlCisjZGVmaW5lIEJDTV9GTERfQ09NTVVOSUNBVElPTl9BUkVBX0JBU0UgICAgICAgICAgICAgQkNNX0ZMRF9SQVNfMV9TRVRUSU5HUworI2VuZGlmCisjZGVmaW5lIEJDTV9GTERfQ09NTVVOSUNBVElPTl9BUkVBX1NJWkUgICAgICAgICAgICAgQkNNX0ZMRF9DT01NVU5JQ0FUSU9OX0FSRUFfVE9QIC0gQkNNX0ZMRF9DT01NVU5JQ0FUSU9OX0FSRUFfQkFTRQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgUEFZIEFUVEVOVElPTiAhISEgUE9TVE1PUlRFTV9CVUZfT0ZGU0VUIG11c3QgYmUgb3V0c2lkZSB0aGUgY29tbXVuaWNhdGlvbiBhcmVhCisgICAgICAgICAgICAgdGhlcmVmb3JlICBpdCBzaG91bGQgYmUgZGVmaW5lZCBmcm9tIEJDTV9GTERfQ09NTVVOSUNBVElPTl9BUkVBX0JBU0UKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBCQ01fRkxEX0NQVTFfUE9TVE1PUlRFTV9CVUZfT0ZGU0VUICAgICAgICAgIChCQ01fRkxEX0NPTU1VTklDQVRJT05fQVJFQV9CQVNFIC0gQkNNX0ZMRF9DUFVfUE9TVE1PUlRFTV9CVUZfU0laRSkKKyNkZWZpbmUgQkNNX0ZMRF9DUFUwX1BPU1RNT1JURU1fQlVGX09GRlNFVCAgICAgICAgICAoQkNNX0ZMRF9DUFUxX1BPU1RNT1JURU1fQlVGX09GRlNFVCAtIEJDTV9GTERfQ1BVX1BPU1RNT1JURU1fQlVGX1NJWkUpCisjZGVmaW5lIEJDTV9GTERfSE9TVF9FVkVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgKEJDTV9GTERfQ1BVMF9QT1NUTU9SVEVNX0JVRl9PRkZTRVQgLSBDT01NX1dPUkRfU0laRSkKKworI2RlZmluZSBCQ01fRkxEX0REUl9URVNUX1JFU1VMVFNfU0laRSAgICAgICAgICAgICAgICgzICogQ09NTV9XT1JEX1NJWkUpIC8qIENQVSArIFJBUyAwICsgUkFTIDEgKi8KKyNkZWZpbmUgQkNNX0ZMRF9ERFJfVEVTVF9SRVNVTFRTICAgICAgICAgICAgICAgICAgICAoQkNNX0ZMRF9IT1NUX0VWRU5UIC0gQkNNX0ZMRF9ERFJfVEVTVF9SRVNVTFRTX1NJWkUpCisKKy8qIFNXIEVycm9yIHRhYmxlICovCisjZGVmaW5lIEJDTV9GTERfU1dfRVJST1JfVEFCTEVfU0laRSAgICAgICAgICAgICAgICAgKDExNzEgKiBDT01NX1dPUkRfU0laRSkKKyNkZWZpbmUgQkNNX0ZMRF9TV19FUlJPUl9UQUJMRSAgICAgICAgICAgICAgICAgICAgICAoQkNNX0ZMRF9ERFJfVEVTVF9SRVNVTFRTIC0gQkNNX0ZMRF9TV19FUlJPUl9UQUJMRV9TSVpFKQorCisvKiBsb2dnZXIgd2lsbCBOT1Qgb3ZlcndyaXRlIG90aGVyIGZpZWxkcyAqLworI2RlZmluZSBCQ01fRkxEX0xPR0dFUl9UT1AgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTV9GTERfU1dfRVJST1JfVEFCTEUKKyNkZWZpbmUgQkNNX0ZMRF9MT0dHRVJfQkFTRSAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIGxvZ2dlciB3aWxsIG92ZXJ3cml0ZSB0aGUgYm9vdGxvYWRlciAqLworCisvKiBCQ002ODYyMCAoTWFwbGUpIGZ1bmN0aW9uYWwgc3RhdGVzICovCisjZGVmaW5lIEJDTV9GTERfQ1BVX0ZJTklTSF9CT09UTE9BREVSX1NISUZUICAgICAgICAgMAorI2RlZmluZSBCQ01fRkxEX0NQVV9GSU5JU0hfQk9PVExPQURFUl9NQVNLICAgICAgICAgICgweDEgPDwgQkNNX0ZMRF9DUFVfRklOSVNIX0JPT1RMT0FERVJfU0hJRlQpCisKKyNkZWZpbmUgQkNNX0ZMRF9DUFVfUkVBRFlfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEJDTV9GTERfQ1BVX1JFQURZX01BU0sgICAgICAgICAgICAgICAgICAgICAgKDB4MSA8PCBCQ01fRkxEX0NQVV9SRUFEWV9TSElGVCkKKworI2RlZmluZSBCQ01fRkxEX0REUl9URVNUX0RPTkVfU0hJRlQgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQkNNX0ZMRF9ERFJfVEVTVF9ET05FX01BU0sgICAgICAgICAgICAgICAgICAoMHgxIDw8IEJDTV9GTERfRERSX1RFU1RfRE9ORV9TSElGVCkKKworLyogQkNNNjg2MjAgKEhvc3QpIGZ1bmN0aW9uYWwgc3RhdGVzICovCisjZGVmaW5lIEJDTV9GTERfSE9TVF9GSU5JU0hfV1JJVEVfRERSX1NISUZUICAgICAgICAgMAorI2RlZmluZSBCQ01fRkxEX0hPU1RfRklOSVNIX1dSSVRFX0REUl9NQVNLICAgICAgICAgICgweDEgPDwgQkNNX0ZMRF9IT1NUX0ZJTklTSF9XUklURV9ERFJfU0hJRlQpCisKKyNkZWZpbmUgQkNNX0ZMRF9IT1NUX1JVTl9DUFVfRERSX1RFU1RfU0hJRlQgICAgICAgICAxCisjZGVmaW5lIEJDTV9GTERfSE9TVF9SVU5fQ1BVX0REUl9URVNUX01BU0sgICAgICAgICAgKDB4MSA8PCBCQ01fRkxEX0hPU1RfUlVOX0NQVV9ERFJfVEVTVF9TSElGVCkKKworI2RlZmluZSBCQ01fRkxEX0hPU1RfUlVOX1JBU18wX1RFU1RfU0hJRlQgICAgICAgICAgIDIKKyNkZWZpbmUgQkNNX0ZMRF9IT1NUX1JVTl9SQVNfMF9URVNUX01BU0sgICAgICAgICAgICAoMHgxIDw8IEJDTV9GTERfSE9TVF9SVU5fUkFTXzBfVEVTVF9TSElGVCkKKworI2RlZmluZSBCQ01fRkxEX0hPU1RfUlVOX1JBU18xX1RFU1RfU0hJRlQgICAgICAgICAgIDMKKyNkZWZpbmUgQkNNX0ZMRF9IT1NUX1JVTl9SQVNfMV9URVNUX01BU0sgICAgICAgICAgICAoMHgxIDw8IEJDTV9GTERfSE9TVF9SVU5fUkFTXzFfVEVTVF9TSElGVCkKKworLyogaG9zdCBib290cmVjb3JkIHN0YXRlcyAqLworI2RlZmluZSBCQ01fRkxEX0hPU1RfUFJNX1ZBTElEX1NISUZUICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQkNNX0ZMRF9IT1NUX1BSTV9WQUxJRF9NQVNLICAgICAgICAgICAgICAgICAoMHgxIDw8IEJDTV9GTERfSE9TVF9QUk1fVkFMSURfU0hJRlQpCisKKy8qIGRldmljZSBib290cmVjb3JkIHN0YXRlcyAqLworI2RlZmluZSBCQ01fRkxEX0NQVV9QUk1fVkFMSURfU0hJRlQgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQkNNX0ZMRF9DUFVfUFJNX1ZBTElEX01BU0sgICAgICAgICAgICAgICAgICAoMHgxIDw8IEJDTV9GTERfQ1BVX1BSTV9WQUxJRF9TSElGVCkKKworLyogcXVldWUgdmFsaWRpdHkgZmxhZyAqLworI2RlZmluZSBCQ01fRkxEX0NQVV9RVUVVRV9WQUxJRF9TSElGVCAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQkNNX0ZMRF9DUFVfUVVFVUVfVkFMSURfTUFTSyAgICAgICAgICAgICAgICAoMHgxIDw8IEJDTV9GTERfQ1BVX1FVRVVFX1ZBTElEX1NISUZUKQorCisvKiBDUFUgZGVidWcgc3RhdGVzICovCisjZGVmaW5lIENQVV9ERUJVR19CT09UX0ZMQVNIICAgICAgICAoMTw8MCkKKyNkZWZpbmUgQ1BVX0RFQlVHX1JVTl9fRlJPTV9TUkFNICAgICgxPDwxKQorI2RlZmluZSBDUFVfREVCVUdfTFVUX0RPTkUgICAgICAgICAgKDE8PDIpCisjZGVmaW5lIENQVV9ERUJVR19CMTVfQ0ZHX0RPTkUgICAgICAoMTw8MykKKyNkZWZpbmUgQ1BVX0RFQlVHX1VBUlRfSU5JVF9ET05FICAgICgxPDw0KQorI2RlZmluZSBDUFVfREVCVUdfQ0xFQVJfQlNTX0RPTkUgICAgKDE8PDUpCisjZGVmaW5lIENQVV9ERUJVR19SVU5fQyAgICAgICAgICAgICAoMTw8NikKKyNkZWZpbmUgQ1BVX0RFQlVHX0ZMQVNIX1JFQURfRkFJTEVEICgxPDw3KQorI2RlZmluZSBDUFVfREVCVUdfT1NfRkFJTEVEICAgICAgICAgKDE8PDgpCisKKy8qIENQVSBleGNlcHRpb24gcmVhc29uICovCisjZGVmaW5lIENQVV9FWENFUF9VTkRFRl9JTlNUUiAgICAgICAoMTw8MCkKKyNkZWZpbmUgQ1BVX0VYQ0VQX1NXX0lOVFIgICAgICAgICAgICgxPDwxKQorI2RlZmluZSBDUFVfRVhDRVBfUFJFRkVUQ0hfQUJPUlQgICAgKDE8PDIpCisjZGVmaW5lIENQVV9FWENFUF9EQVRBX0FCT1JUICAgICAgICAoMTw8MykKKyNkZWZpbmUgQ1BVX0VYQ0VQX0lSUSAgICAgICAgICAgICAgICgxPDw0KQorI2RlZmluZSBDUFVfRVhDRVBfRklRICAgICAgICAgICAgICAgKDE8PDUpCisKKyNpZm5kZWYgX19BU1NFTUJMRVJfXworLyogU29DIHN0YXRlcyB2YWx1ZXMgKi8KK3R5cGVkZWYgZW51bQoreworICAgIEJDTV9GTERfQ1BVX1NUQVRFX1VOS05PV04sCisgICAgQkNNX0ZMRF9TUkFNX0JPT1RfRE9ORSwKKyAgICBCQ01fRkxEX0JPT1RfRlJPTV9ERFIsCisgICAgQkNNX0ZMRF9SVU5fRlJPTV9ERFIsCisgICAgQkNNX0ZMRF9DUFVfUkVBRFksCisgICAgQkNNX0ZMRF9IT1NUX1JFQURZLAorICAgIEJDTV9GTERfQ1BVX0ZJTklTSF9CT09UTE9BREVSCit9IEJDTV9GTERfQ1BVX1NUQVRFOworCisvKiBTb0MgcmVzZXQgdmFsdWVzICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBCQ01fRkxEX0NQVV9SRVNFVF9VTktOT1dOCit9IEJDTV9GTERfQ1BVX1JFU0VUX1JFQVNPTjsKKwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNX0ZMRF9SQVNfTU9ERV9OT1RfQ09ORklHVVJFRCwKKyAgICBCQ01fRkxEX1JBU19NT0RFX0dQT04sCisgICAgQkNNX0ZMRF9SQVNfTU9ERV9YR1BPTiwKKyAgICBCQ01fRkxEX1JBU19NT0RFX1hHU19OR1BPTjIsCit9IEJDTV9GTERfUlNNX01PREU7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdW5zaWduZWQgaW50IG1hZ2ljOworICAgIHVuc2lnbmVkIGludCBtc2dfbGVuOworICAgIGNoYXIgbXNnWzFdOworfSBCQ01fRkxEX1BPU1RNT1JURU1fTE9HOworI2VuZGlmCisKKyNkZWZpbmUgQkNNX0ZMRF9QT1NUTU9SVEVNX0xPR19NQUdJQyAgICAgIDB4RkVFREJBQ0MKKworLyogZGV2aWNlX2RlYnVnX3N0YXRlcyAqLworI2RlZmluZSBCQ01fRkxEX0NQVV9CT09UX0ZST01fU1JBTV9TVEFURVNfU0hJRlQgICAgIDAKKyNkZWZpbmUgQkNNX0ZMRF9DUFVfQk9PVF9GUk9NX1NSQU1fU1RBVEVTX01BU0sgICAgICAweDAwMDAwMGZmVQorI2RlZmluZSBCQ01fRkxEX0NQVV9CT09UX0ZST01fU1JBTV9FUlJPUlNfU0hJRlQgICAgIDgKKyNkZWZpbmUgQkNNX0ZMRF9DUFVfQk9PVF9GUk9NX1NSQU1fRVJST1JTX01BU0sgICAgICAweDAwMDBmZjAwVQorI2RlZmluZSBCQ01fRkxEX0NQVV9CT09UX0ZST01fU1JBTV9FWENFUFRJT05fU0hJRlQgIDE2CisjZGVmaW5lIEJDTV9GTERfQ1BVX0JPT1RfRlJPTV9TUkFNX0VYQ0VQVElPTl9NQVNLICAgMHgwMGZmMDAwMFUKKyNkZWZpbmUgQkNNX0ZMRF9DUFVfUlVOX0ZST01fRERSX1NUQVRFU19TSElGVCAgICAgICAyNAorI2RlZmluZSBCQ01fRkxEX0NQVV9SVU5fRlJPTV9ERFJfU1RBVEVTX01BU0sgICAgICAgIDB4ZmYwMDAwMDBVCisvKiBob3N0X2RlYnVnX3N0YXRlcyAqLworI2RlZmluZSBCQ01fRkxEX0hPU1RfV1JJVEVfU1JBTV9TSElGVCAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQkNNX0ZMRF9IT1NUX1dSSVRFX1NSQU1fTUFTSyAgICAgICAgICAgICAgICAweDAwMDAwMDAxVQorI2RlZmluZSBCQ01fRkxEX0hPU1RfU1RBUlRfQ1BVX1NISUZUICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQkNNX0ZMRF9IT1NUX1NUQVJUX0NQVV9NQVNLICAgICAgICAgICAgICAgICAweDAwMDAwMDAyVQorI2RlZmluZSBCQ01fRkxEX0hPU1RfV1JJVEVfRERSX1NISUZUICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQkNNX0ZMRF9IT1NUX1dSSVRFX0REUl9NQVNLICAgICAgICAgICAgICAgICAweDAwMDAwMDA0VQorCisjZGVmaW5lIENQVV8yX1BDSUVfTUVNX1dJTjBfQkFTRSAgICAweDkwMDAwMDAwCisjZGVmaW5lIENQVV8yX1BDSUVfTUVNX1dJTjBfU0laRSAgICAweDAwMTAwMDAwCisjZGVmaW5lIE1BWF9QTUNfU0laRSAgICAgICAgICAgICAgICAweDgwMDAKKworI2lmZGVmIFRYX0VOQUJMRV9FVkVOVF9UUkFDRQorI2RlZmluZSBFVkVOVF9CVUZGRVJfU0laRSAgICAgICAgICAgMHgwMDYwMDAwMCAvKiA2IE1ieXRlICovCisvKiBsZWF2ZSAxIE1ieXRlIGdhcCBiZXR3ZWVuIHdpbmRvd3MgKi8KKyNkZWZpbmUgQ1BVXzJfUENJRV9NRU1fV0lOMV9CQVNFICAgIENQVV8yX1BDSUVfTUVNX1dJTjBfQkFTRSArIENQVV8yX1BDSUVfTUVNX1dJTjBfU0laRSArIDB4MTAwMDAwCisjZGVmaW5lIENQVV8yX1BDSUVfTUVNX1dJTjFfU0laRSAgICBFVkVOVF9CVUZGRVJfU0laRQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2ZsZC9iY21vbHRfZmxkLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZmxkL2JjbW9sdF9mbGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGU5MmIyCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2ZsZC9iY21vbHRfZmxkLmMKQEAgLTAsMCArMSw4NTAgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpbmNsdWRlICJiY21vbHRfZmxkLmgiCisjaWZkZWYgVFhfRU5BQkxFX0VWRU5UX1RSQUNFCisjaW5jbHVkZSAiYmNtb2x0X2xscGNpZS5oIgorI2VuZGlmCisKKy8qIGludGVybmFsIGRhdGEgYmFzZSAqLworc3RhdGljIHVpbnQzMl90IG1heF9iY202ODYyMF9kZXZpY2UgPSAwOworc3RhdGljIGJjbV9mbGRfZGV2aWNlX2luZm8gKmJjbTY4NjIwX2luZm8gPSBOVUxMOworCisjZGVmaW5lIFNSQU1fQUREUkVTUyhkZXZpY2Usb2Zmc2V0KSAodWludDMyX3QgKikoYmNtNjg2MjBfaW5mb1tkZXZpY2VdLnNvY19zcmFtX2Jhc2UgKyBvZmZzZXQpCisKK2JjbW9zX2Vycm5vIGJjbV9mbGRfaW5pdCh1aW50MzJfdCBtYXhfZGV2aWNlcykKK3sKKyAgICBtYXhfYmNtNjg2MjBfZGV2aWNlID0gbWF4X2RldmljZXM7CisgICAgYmNtNjg2MjBfaW5mbyA9IChiY21fZmxkX2RldmljZV9pbmZvICopYmNtb3NfYWxsb2MobWF4X2RldmljZXMgKiBzaXplb2YoYmNtX2ZsZF9kZXZpY2VfaW5mbykpOworICAgIGlmICghYmNtNjg2MjBfaW5mbykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgbWVtc2V0KGJjbTY4NjIwX2luZm8sIDAsIG1heF9kZXZpY2VzICogc2l6ZW9mKGJjbV9mbGRfZGV2aWNlX2luZm8pKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCit2b2lkIGJjbV9mbGRfY2xlYXJfY29tbV9hcmVhKHVpbnQzMl90IGRldmljZSkKK3sKKyAgICBtZW1zZXQoKGNoYXIgKilTUkFNX0FERFJFU1MoZGV2aWNlLEJDTV9GTERfQ09NTVVOSUNBVElPTl9BUkVBX0JBU0UpLCAwICxCQ01fRkxEX0NPTU1VTklDQVRJT05fQVJFQV9TSVpFKTsKKyNpZiBkZWZpbmVkKFRYX0VOQUJMRV9FVkVOVF9UUkFDRSkgJiYgZGVmaW5lZChERUJVR19UUkFDRV9JTklUKQorICAgIGJjbV9sbF9wY2llX3NldHJhY2UoZGV2aWNlKTsKKyNlbmRpZgorfQorCitiY21vc19lcnJubyBiY21fZmxkX2V4aXQodm9pZCkKK3sKKyAgICBpZiAoYmNtNjg2MjBfaW5mbykKKyAgICAgICAgYmNtb3NfZnJlZShiY202ODYyMF9pbmZvKTsKKworICAgIGJjbTY4NjIwX2luZm8gPSBOVUxMOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIHJlZ2lzdGVyIGEgZGV2aWNlIHRvIGRyaXZlcgorICAgcmV0dXJucyB0aGUgZHJpdmVyIGluZGV4LCBpbnN0ZWFkIHRoZSB1c2VyJ3MKKyAgIHN0b3JlIHRoZSB1c2VyLHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRldmljZSAqLworYmNtb3NfZXJybm8gYmNtX2ZsZF9yZWdpc3Rlcih1aW50MzJfdCBkZXZpY2UsIGJjbV9mbGRfZGV2aWNlX2luZm8gKmluZm8pCit7CisgICAgaWYgKCFpbmZvKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworCisgICAgaWYgKCFiY202ODYyMF9pbmZvKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9OT1JFUzsKKworICAgIGlmIChkZXZpY2UgPj0gbWF4X2JjbTY4NjIwX2RldmljZSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisKKyAgICBpZiAoYmNtNjg2MjBfaW5mb1tkZXZpY2VdLnNvY19zcmFtX2Jhc2UpCisgICAgICAgIHJldHVybiBCQ01fRVJSX0FMUkVBRFk7CisKKyAgICAvKiBjb3B5IHRoZSBpbmZvcm1hdGlvbiByZWNlaXZlZCBmcm9tIHRoZSB1c2VyIHRvIHVpbnQzMl90ZXJuYWwgZGF0YSBiYXNlICovCisgICAgYmNtNjg2MjBfaW5mb1tkZXZpY2VdLnNvY19zcmFtX2Jhc2UgPSBpbmZvLT5zb2Nfc3JhbV9iYXNlOworICAgIGJjbTY4NjIwX2luZm9bZGV2aWNlXS5zb2NfZGRyX2Jhc2UgPSBpbmZvLT5zb2NfZGRyX2Jhc2U7CisgICAgYmNtNjg2MjBfaW5mb1tkZXZpY2VdLnNvY19yZWdzX2Jhc2UgPSBpbmZvLT5zb2NfcmVnc19iYXNlOworICAgIGJjbTY4NjIwX2luZm9bZGV2aWNlXS5zb2NfZGRyX2xlbmd0aCA9IGluZm8tPnNvY19kZHJfbGVuZ3RoOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIHJlbW92ZSBhIGRldmljZSBmcm9tIHVpbnQzMl90ZXJuYWwgZGF0YSBiYXNlICovCitiY21vc19lcnJubyBiY21fZmxkX3VucmVnaXN0ZXIodWludDMyX3QgZGV2aWNlKQoreworICAgIGlmICghYmNtNjg2MjBfaW5mbykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9SRVM7CisKKyAgICBpZiAoZGV2aWNlID49IG1heF9iY202ODYyMF9kZXZpY2UpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworCisgICAgLyogY2xlYXIgdGhlIHVpbnQzMl90ZXJuYWwgZGF0YSBiYXNlIGZvciB0aGUgZ2l2ZW4gZGV2aWNlICovCisgICAgYmNtNjg2MjBfaW5mb1tkZXZpY2VdLnNvY19zcmFtX2Jhc2UgPSAwOworICAgIGJjbTY4NjIwX2luZm9bZGV2aWNlXS5zb2NfZGRyX2Jhc2UgPSAwOworICAgIGJjbTY4NjIwX2luZm9bZGV2aWNlXS5zb2NfZGRyX2xlbmd0aCA9IDA7CisgICAgYmNtNjg2MjBfaW5mb1tkZXZpY2VdLnNvY19jcnRfbGVuZ3RoID0gMDsKKyAgICBiY202ODYyMF9pbmZvW2RldmljZV0uc29jX3JlZ3NfYmFzZSA9IDA7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogcmVhZCBmcm9tIGNvbW11bmljYXRpb24gYXJlYSBhbmQgcmV0dXJuIHRoZSBzb2Mgc3RhdGUKKyAgIHJlc2V0IHJlYXNvbiBhbmQgcHJvdG9jb2wgdmVyc2lvbiAqLworYmNtb3NfZXJybm8gYmNtX2ZsZF9nZXRfZGV2aWNlX3N0YXR1cyh1aW50MzJfdCBkZXZpY2UsIGJjbV9mbGRfZGV2aWNlX3N0YXQgKmRlYnVnX3N0YXRlKQoreworICAgIGlmICghZGVidWdfc3RhdGUpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisKKyAgICBpZiAoIWJjbTY4NjIwX2luZm8pCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PUkVTOworCisgICAgaWYgKGRldmljZSA+PSBtYXhfYmNtNjg2MjBfZGV2aWNlKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKworICAgIC8qIHJlYWQgZnJvbSBTUkFNIG9zIGVudHJ5IG9mZnNldCwgQ1BVIHN0YXR1cywgcmVhc29uIGFuZCBwcm90b2NvbCB2ZXJzaW9uICovCisgICAgZGVidWdfc3RhdGUtPnByb3RvY29sX3ZlcnNpb24gICA9IGJjbV9wY2lfcmVhZDMyKFNSQU1fQUREUkVTUyhkZXZpY2UsQkNNX0ZMRF9CT09UX1BST1RPQ09MX1ZFUlNJT05fT0ZGU0VUKSk7CisgICAgZGVidWdfc3RhdGUtPnN0YXRlICAgICAgICAgICAgICA9IGJjbV9wY2lfcmVhZDMyKFNSQU1fQUREUkVTUyhkZXZpY2UsQkNNX0ZMRF9DUFVfU1RBVEVfT0ZGU0VUKSk7CisgICAgZGVidWdfc3RhdGUtPnJlYXNvbiAgICAgICAgICAgICA9IGJjbV9wY2lfcmVhZDMyKFNSQU1fQUREUkVTUyhkZXZpY2UsQkNNX0ZMRF9DUFVfUkVTRVRfUkVBU09OX09GRlNFVCkpOworICAgIGRlYnVnX3N0YXRlLT5vc19lbnRyeV9vZmZzZXQgICAgPSBiY21fcGNpX3JlYWQzMihTUkFNX0FERFJFU1MoZGV2aWNlLEJDTV9GTERfT1NfRU5UUllfT0ZGU0VUKSk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogcmV0dXJucyB0aGUgbGFzdCBzb2Mgc3RhdGUgKi8KK2JjbW9zX2Vycm5vIGJjbV9mbGRfZ2V0X2RldmljZV9sb2FkaW5nX3N0YXRlKHVpbnQzMl90IGRldmljZSwgQkNNX0ZMRF9DUFVfU1RBVEUgKmNwdV9zdGF0ZSkKK3sKKyAgICB1aW50MzJfdCB0ZW1wOworICAgIHZvbGF0aWxlIHVpbnQzMl90IHZhbHVlOworCisgICAgaWYgKCFjcHVfc3RhdGUpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisKKyAgICBpZiAoIWJjbTY4NjIwX2luZm8pCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PUkVTOworCisgICAgaWYgKGRldmljZSA+PSBtYXhfYmNtNjg2MjBfZGV2aWNlKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKworICAgIHZhbHVlID0gYmNtX3BjaV9yZWFkMzIoU1JBTV9BRERSRVNTKGRldmljZSxCQ01fRkxEX0NQVV9TVEFURV9PRkZTRVQpKTsKKyAgICB0ZW1wID0gdmFsdWUgJiBCQ01fRkxEX0NQVV9SRUFEWV9NQVNLOworICAgIGlmICh0ZW1wKQorICAgICAgICAqY3B1X3N0YXRlID0gQkNNX0ZMRF9DUFVfUkVBRFk7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdGVtcCA9IHZhbHVlICYgQkNNX0ZMRF9DUFVfRklOSVNIX0JPT1RMT0FERVJfTUFTSzsKKyAgICAgICAgaWYgKHRlbXApCisgICAgICAgICAgICAqY3B1X3N0YXRlID0gQkNNX0ZMRF9DUFVfRklOSVNIX0JPT1RMT0FERVI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpjcHVfc3RhdGUgPSBCQ01fRkxEX0NQVV9TVEFURV9VTktOT1dOOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiB3cml0ZSBpbiBjb21tdW5pY2F0aW9uIGFyZWEgdGhlIGN1cnJlbnQgaG9zdCBzdGF0dXMgZHVyaW5nIGxvYWRpbmcgcHJvY2VzcyAqLworYmNtb3NfZXJybm8gYmNtX2ZsZF9ob3N0X2ZpbmlzaF93cml0ZV9kZHIodWludDMyX3QgZGV2aWNlLCB1aW50MzJfdCBvc19lbnRyeV9hZGRyZXNzKQoreworICAgIGlmICghYmNtNjg2MjBfaW5mbykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9SRVM7CisKKyAgICBpZiAoZGV2aWNlID49IG1heF9iY202ODYyMF9kZXZpY2UpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworCisgICAgLyogd3JpdGUgb3NfZW50cnkgYWRkcmVzcyBvZiB0aGUgY29kZSBmcm9tIEREUiAqLworICAgIGJjbV9wY2lfd3JpdGUzMihTUkFNX0FERFJFU1MoZGV2aWNlLEJDTV9GTERfT1NfRU5UUllfT0ZGU0VUKSwgb3NfZW50cnlfYWRkcmVzcyk7CisgICAgLyogcnVuIGNvZGUgZnJvbSBERFIgKi8KKyAgICBiY21fcGNpX3dyaXRlMzIoU1JBTV9BRERSRVNTKGRldmljZSxCQ01fRkxEX0hPU1RfU1RBVEVfT0ZGU0VUKSwgQkNNX0ZMRF9IT1NUX0ZJTklTSF9XUklURV9ERFJfTUFTSyk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogcmV0dXJuIHRoZSBsb2dzIGFyZWEgKi8KK2JjbW9zX2Vycm5vIGJjbV9mbGRfZ2V0X2xvZ3ModWludDMyX3QgZGV2aWNlLCBjaGFyICoqbG9nX2FyZWEsIGludCAqbGVuZ3RoKQoreworICAgIGlmICghbG9nX2FyZWEgfHwgIWxlbmd0aCkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKworICAgIGlmICghYmNtNjg2MjBfaW5mbykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9SRVM7CisKKyAgICBpZiAoZGV2aWNlID49IG1heF9iY202ODYyMF9kZXZpY2UpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworCisgICAgKmxvZ19hcmVhID0gKGNoYXIgKilTUkFNX0FERFJFU1MoZGV2aWNlLCBCQ01fRkxEX0xPR0dFUl9CQVNFKTsKKyAgICAqbGVuZ3RoID0gQkNNX0ZMRF9MT0dHRVJfVE9QOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIHdyaXRlIHRoZSByZWNlaXZlZCBidWZmZXIgdG8gbWVtb3J5IGFjY29yZGluZyB0byBvZmZzZXQgYW5kIHR5cGUgKi8KK2JjbW9zX2Vycm5vIGJjbV9mbGRfd3JpdGUodWludDMyX3QgZGV2aWNlLCBjaGFyICpidWZmLCB1aW50MzJfdCBidWZmX3NpemUsIHVpbnQzMl90IG9mZnNldF9pbl9pbWFnZSwgYmNtb2x0X2RldmljZV9pbWFnZV90eXBlIGltYWdlX3R5cGUpCit7CisgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzID0gMDsKKyAgICBpbnQgaTsKKyNpZm5kZWYgUENJRV9CWVRFX0NPUFkKKyAgICB1aW50MzJfdCBzaXplLCByZXN0OworICAgIHVpbnQzMl90KiBidWZmXzMyOworICAgIHVpbnQzMl90KiBhZGRyXzMyOworI2VuZGlmCisKKyAgICBpZiAoIWJ1ZmYpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisKKyAgICBpZiAoIWJjbTY4NjIwX2luZm8pCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PUkVTOworCisgICAgaWYgKGRldmljZSA+PSBtYXhfYmNtNjg2MjBfZGV2aWNlKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKworICAgIGlmIChpbWFnZV90eXBlID09IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFlQRV9CT09UTE9BREVSKQorICAgIHsKKyAgICAgICAgYWRkcmVzcyA9IGJjbTY4NjIwX2luZm9bZGV2aWNlXS5zb2Nfc3JhbV9iYXNlICsgb2Zmc2V0X2luX2ltYWdlOworICAgICAgICBpZiAoKG9mZnNldF9pbl9pbWFnZSArIGJ1ZmZfc2l6ZSkgPiBCQ01fRkxEX0NPTU1VTklDQVRJT05fQVJFQV9CQVNFKQorICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT1ZFUkZMT1c7CisgICAgfQorICAgIGVsc2UgaWYgKGltYWdlX3R5cGUgPT0gQkNNT0xUX0RFVklDRV9JTUFHRV9UWVBFX0FQUExJQ0FUSU9OKQorICAgIHsKKyAgICAgICAgYWRkcmVzcyA9IGJjbTY4NjIwX2luZm9bZGV2aWNlXS5zb2NfZGRyX2Jhc2UgKyBvZmZzZXRfaW5faW1hZ2U7CisgICAgICAgIGlmICgob2Zmc2V0X2luX2ltYWdlICsgYnVmZl9zaXplKSA+IGJjbTY4NjIwX2luZm9bZGV2aWNlXS5zb2NfZGRyX2xlbmd0aCkKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09WRVJGTE9XOworICAgICAgICBiY202ODYyMF9pbmZvW2RldmljZV0uc29jX2NydF9sZW5ndGggKz0gYnVmZl9zaXplOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworI2lmbmRlZiBQQ0lFX0JZVEVfQ09QWQorICAgIHNpemUgPSBidWZmX3NpemUgLyBzaXplb2YoKmJ1ZmZfMzIpOworICAgIHJlc3QgPSBidWZmX3NpemUgJiAoc2l6ZW9mKCpidWZmXzMyKSAtMSk7CisKKyAgICBidWZmXzMyID0gKHVpbnQzMl90KilidWZmOworICAgIGFkZHJfMzIgPSAodWludDMyX3QqKWFkZHJlc3M7CisKKyAgICBpZiAocmVzdCkKKyAgICAgICAgc2l6ZSsrOworICAgIGZvcihpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICAgICAgYmNtX3BjaV93cml0ZTMyKChhZGRyXzMyICsgaSksQkNNT1NfRU5ESUFOX0NQVV9UT19MSVRUTEVfVTMyKCooYnVmZl8zMiAraSkpKTsKKyNlbHNlCisgICAgZm9yIChpID0gMDsgaSA8IGJ1ZmZfc2l6ZTsgaSsrKQorICAgICAgICAqKHVpbnQ4X3QgKikoYWRkcmVzcyArIGkpID0gYnVmZltpXTsKKyNlbmRpZgorCisgICAgYmNtb3NfYmFycmllcigpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIHJlYWQgdG8gdGhlIHJlY2VpdmVkIGJ1ZmZlciBmcm9tIG1lbW9yeSBhY2NvcmRpbmcgdG8gb2Zmc2V0IGFuZCB0eXBlICovCitiY21vc19lcnJubyBiY21fZmxkX3JlYWQodWludDMyX3QgZGV2aWNlLCBjaGFyICpidWZmLCB1aW50MzJfdCAqYnVmZl9zaXplLCB1aW50MzJfdCBvZmZzZXRfaW5faW1hZ2UsIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHlwZSBpbWFnZV90eXBlKQoreworICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyA9IDA7CisgICAgdWludDMyX3QgaTsKKyNpZm5kZWYgUENJRV9CWVRFX0NPUFkKKyAgICB1aW50MzJfdCBzaXplLCByZXN0OworICAgIHVpbnQzMl90KiBidWZmXzMyOworICAgIHVpbnQzMl90KiBhZGRyXzMyOworI2VuZGlmCisKKyAgICBpZiAoIWJ1ZmYgfHwgIWJ1ZmZfc2l6ZSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKworICAgIGlmICghYmNtNjg2MjBfaW5mbykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9SRVM7CisKKyAgICBpZiAoZGV2aWNlID49IG1heF9iY202ODYyMF9kZXZpY2UpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworCisgICAgaWYoaW1hZ2VfdHlwZSA9PSBCQ01PTFRfREVWSUNFX0lNQUdFX1RZUEVfQk9PVExPQURFUikKKyAgICAgICAgYWRkcmVzcyA9IGJjbTY4NjIwX2luZm9bZGV2aWNlXS5zb2Nfc3JhbV9iYXNlICsgb2Zmc2V0X2luX2ltYWdlOworICAgIGVsc2UgaWYgKGltYWdlX3R5cGUgPT0gQkNNT0xUX0RFVklDRV9JTUFHRV9UWVBFX0FQUExJQ0FUSU9OKQorICAgICAgICBhZGRyZXNzID0gYmNtNjg2MjBfaW5mb1tkZXZpY2VdLnNvY19kZHJfYmFzZSArIG9mZnNldF9pbl9pbWFnZTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisKKyAgICAvKiB0ZW1wb3JhcnkgZm9yIHRlc3QgLCBjb25zaWRlciB0byBpbnRlZ3JhdGUgaW4gZnV0dXJlICovCisjaWZuZGVmIFBDSUVfQllURV9DT1BZCisgICAgc2l6ZSA9ICpidWZmX3NpemUgL3NpemVvZigqYnVmZl8zMik7CisgICAgcmVzdCA9ICpidWZmX3NpemUgJiAoc2l6ZW9mKCpidWZmXzMyKSAtMSk7CisgICAgYnVmZl8zMiA9ICh1aW50MzJfdCopYnVmZjsKKyAgICBhZGRyXzMyID0gKHVpbnQzMl90KilhZGRyZXNzOworCisgICAgaWYgKHJlc3QpCisgICAgICAgIHNpemUrKzsKKyAgICBmb3IoaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgICAgICooYnVmZl8zMiAraSk9IEJDTU9TX0VORElBTl9DUFVfVE9fTElUVExFX1UzMihiY21fcGNpX3JlYWQzMigodWludDMyX3QgKikoYWRkcl8zMiArIGkpKSk7CisjZWxzZQorICAgIGZvciAoaSA9IDA7IGkgPCAqYnVmZl9zaXplOyBpKyspCisgICAgICAgIGJ1ZmZbaV0gPSAqKHVpbnQ4X3QgKikoYWRkcmVzcyArIGkpOworCisjZW5kaWYKKworICAgIGJjbW9zX2JhcnJpZXIoKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisKKy8qKioqKioqKioqKiBQTUMgZGVmaW5pdGlvbnMgKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgUE1DX1FVRVVFXzBfREFUQV9VTlJFU0VUMCAgIDB4NDAxYzAwVQorI2RlZmluZSBQTUNfUVVFVUVfMF9EQVRBX1VOUkVTRVQxICAgMHg0MDFjMDRVCisjZGVmaW5lIFBNQ19RVUVVRV8wX0RBVEFfVU5SRVNFVDIgICAweDQwMWMwOFUKKyNkZWZpbmUgUE1DX1FVRVVFXzBfREFUQV9VTlJFU0VUMyAgIDB4NDAxYzBjVQorCisjZGVmaW5lIFBNQ19RVUVVRV8xX0RBVEFfVU5SRVNFVDAgICAweDQwMWMxMFUKKyNkZWZpbmUgUE1DX1FVRVVFXzFfREFUQV9VTlJFU0VUMSAgIDB4NDAxYzE0VQorI2RlZmluZSBQTUNfUVVFVUVfMV9EQVRBX1VOUkVTRVQyICAgMHg0MDFjMThVCisjZGVmaW5lIFBNQ19RVUVVRV8xX0RBVEFfVU5SRVNFVDMgICAweDQwMWMxY1UKKworI2RlZmluZSBQTUNfQ05UUkxfSE9TVF9NQk9YX0lOICAgICAgMHg0MDEwMjhVCisjZGVmaW5lIFBNQ19IT1NUX01CT1hfTUFTSyAgICAgICAgICAweDIKKyNkZWZpbmUgUE1DX1BNQl9DTlRSTCAgICAgICAgICAgICAgIDB4NDgwMGMwVQorLyogVGhlIGJlbG93IHZhbHVlIGlzIHRoZSBzd2FwIG9mICgoMSA8PCAzMSkgfCAoMTw8MjApIHwgKDQgPDwgMTIpIHwgKDB4MEMpKSAqLworI2RlZmluZSBQTUNfUE1CX0NNRCAgICAgICAgICAgICAgICAgMHgwQzQwMTA4MAorI2RlZmluZSBQTUNfUE1CX1dSSVRFICAgICAgICAgICAgICAgMHg0ODAwYzRVCisvKiBUaGUgYmVsb3cgdmFsdWUgaXMgdGhlIHN3YXAgb2YgMHgxKi8KKyNkZWZpbmUgUE1DX1BNQl9BRERSRVNTICAgICAgICAgICAgIDB4MTAwMDAwMAorCisvKiBQTUMgY29tbWFuZCB0byB0YWtlIEFSTSBvdXQgb2YgcmVzZXQgKi8KKyNkZWZpbmUgQVJNX09VVF9PRl9SRVNFVCAgICAgICAgICAgIDM1CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2JjbW9zX2Vycm5vIGJjbV9mbGRfc3RhcnRfYm9vdGxvYWRlcih1aW50MzJfdCBkZXZpY2UsIHVpbnQzMl90IHRlc3RfZGRyKQoreworLyogdGVtcG9yYXJ5IGRpc2FibGVkOiBqdXN0IGZvciBBMCwgc2hvdWxkIGJlIGVuYWJsZWQgaW4gQjAKKyNpZmRlZiBCQ01fUE1DX0VYSVNUCisgICAgdm9sYXRpbGUgdWludDMyX3QgcmVhZHZhbDsKKyNlbmRpZgorKi8KKyAgICBpZiAoIWJjbTY4NjIwX2luZm8pCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PUkVTOworCisgICAgaWYgKGRldmljZSA+PSBtYXhfYmNtNjg2MjBfZGV2aWNlKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKworICAgIGJjbV9wY2lfd3JpdGUzMihTUkFNX0FERFJFU1MoZGV2aWNlLCBCQ01fRkxEX0hPU1RfU1RBVEVfT0ZGU0VUKSwgdGVzdF9kZHIpOworICAgIC8qIHN0YXJ0IHByb2Nlc3NvciAqLworICAgIGJjbV9mbGRfc2V0X2hvc3RfZGVidWdfc3RhdHVzKGRldmljZSwgQkNNX0ZMRF9IT1NUX1NUQVJUX0NQVSk7CisvKiBUZW1wb3JhcnkgZGlzYWJsZWQgLSBzaG91bGQgYmUgZW5hYmxlZCBpbiBCMAorI2lmbmRlZiBCQ01fUE1DX0VYSVNUICovCisgICAgYmNtX3BjaV9yZWFkMzIoKHVpbnQzMl90ICopKGJjbTY4NjIwX2luZm9bZGV2aWNlXS5zb2NfcmVnc19iYXNlICsgUE1DX1BNQl9DTlRSTCkpOworICAgIGJjbV9wY2lfd3JpdGUzMigodWludDMyX3QgKikoYmNtNjg2MjBfaW5mb1tkZXZpY2VdLnNvY19yZWdzX2Jhc2UgKyBQTUNfUE1CX1dSSVRFKSwgUE1DX1BNQl9BRERSRVNTKTsKKyAgICBiY21fcGNpX3JlYWQzMigodWludDMyX3QgKikoYmNtNjg2MjBfaW5mb1tkZXZpY2VdLnNvY19yZWdzX2Jhc2UgKyBQTUNfUE1CX1dSSVRFKSk7CisgICAgYmNtX3BjaV93cml0ZTMyKCh1aW50MzJfdCAqKShiY202ODYyMF9pbmZvW2RldmljZV0uc29jX3JlZ3NfYmFzZSArIFBNQ19QTUJfQ05UUkwpLCBQTUNfUE1CX0NNRCk7CisgICAgYmNtX3BjaV9yZWFkMzIoKHVpbnQzMl90ICopKGJjbTY4NjIwX2luZm9bZGV2aWNlXS5zb2NfcmVnc19iYXNlICsgUE1DX1BNQl9DTlRSTCkpOworLyoKKyNlbHNlCisgICAgcmVhZHZhbCA9IGJjbV9wY2lfcmVhZDMyKCh1aW50MzJfdCAqKShiY202ODYyMF9pbmZvW2RldmljZV0uc29jX3JlZ3NfYmFzZSArIFBNQ19DTlRSTF9IT1NUX01CT1hfSU4pKTsKKyAgICBpZiAoIShyZWFkdmFsICYgUE1DX0hPU1RfTUJPWF9NQVNLKSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9UX0NPTk5FQ1RFRDsKKworICAgIGJjbV9wY2lfd3JpdGUzMigoYmNtNjg2MjBfaW5mb1tkZXZpY2VdLnNvY19yZWdzX2Jhc2UgKyBQTUNfUVVFVUVfMF9EQVRBX1VOUkVTRVQwKSwgQkNNT1NfRU5ESUFOX0NQVV9UT19MSVRUTEVfVTMyKEFSTV9PVVRfT0ZfUkVTRVQpKTsKKyAgICBiY21fcGNpX3dyaXRlMzIoKGJjbTY4NjIwX2luZm9bZGV2aWNlXS5zb2NfcmVnc19iYXNlICsgUE1DX1FVRVVFXzBfREFUQV9VTlJFU0VUMSksIEJDTU9TX0VORElBTl9DUFVfVE9fTElUVExFX1UzMigwKSk7CisgICAgYmNtX3BjaV93cml0ZTMyKChiY202ODYyMF9pbmZvW2RldmljZV0uc29jX3JlZ3NfYmFzZSArIFBNQ19RVUVVRV8wX0RBVEFfVU5SRVNFVDIpLCBCQ01PU19FTkRJQU5fQ1BVX1RPX0xJVFRMRV9VMzIoMCkpOworICAgIGJjbV9wY2lfd3JpdGUzMigoYmNtNjg2MjBfaW5mb1tkZXZpY2VdLnNvY19yZWdzX2Jhc2UgKyBQTUNfUVVFVUVfMF9EQVRBX1VOUkVTRVQzKSwgQkNNT1NfRU5ESUFOX0NQVV9UT19MSVRUTEVfVTMyKDApKTsKKyAgICBiY21vc191c2xlZXAoMTAwMDApOyAvLyAxMCBtc2VjCisgICAgLy8gcmVhZCBQTUMgcmVzcG9uc2UsIHRvIGNsZWFuIHRoZSBxdWV1ZQorICAgIGJjbV9wY2lfcmVhZDMyKCh1aW50MzJfdCAqKShiY202ODYyMF9pbmZvW2RldmljZV0uc29jX3JlZ3NfYmFzZSArIFBNQ19RVUVVRV8xX0RBVEFfVU5SRVNFVDApKTsKKyAgICBiY21fcGNpX3JlYWQzMigodWludDMyX3QgKikoYmNtNjg2MjBfaW5mb1tkZXZpY2VdLnNvY19yZWdzX2Jhc2UgKyBQTUNfUVVFVUVfMV9EQVRBX1VOUkVTRVQxKSk7CisgICAgYmNtX3BjaV9yZWFkMzIoKHVpbnQzMl90ICopKGJjbTY4NjIwX2luZm9bZGV2aWNlXS5zb2NfcmVnc19iYXNlICsgUE1DX1FVRVVFXzFfREFUQV9VTlJFU0VUMikpOworICAgIGJjbV9wY2lfcmVhZDMyKCh1aW50MzJfdCAqKShiY202ODYyMF9pbmZvW2RldmljZV0uc29jX3JlZ3NfYmFzZSArIFBNQ19RVUVVRV8xX0RBVEFfVU5SRVNFVDMpKTsKKyNlbmRpZgorKi8KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19ib29sIGJjbV9mbGRfaXNfYm9vdGxvYWRlcl9kb25lKHVpbnQzMl90IGRldmljZSkKK3sKKyAgICB2b2xhdGlsZSB1aW50MzJfdCB2YWx1ZTsKKworICAgIGlmICghYmNtNjg2MjBfaW5mbykKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworCisgICAgaWYgKGRldmljZSA+PSBtYXhfYmNtNjg2MjBfZGV2aWNlKQorICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisKKyAgICB2YWx1ZSA9IGJjbV9wY2lfcmVhZDMyKFNSQU1fQUREUkVTUyhkZXZpY2UsQkNNX0ZMRF9DUFVfU1RBVEVfT0ZGU0VUKSk7CisgICAgaWYgKHZhbHVlICYgQkNNX0ZMRF9DUFVfRklOSVNIX0JPT1RMT0FERVJfTUFTSykKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisKKyAgICByZXR1cm4gQkNNT1NfRkFMU0U7Cit9CisKK2JjbW9zX2Jvb2wgYmNtX2ZsZF9pc19kZHJfdGVzdF9kb25lKHVpbnQzMl90IGRldmljZSkKK3sKKyAgICB1aW50MzJfdCB2YWx1ZSA9IGJjbV9wY2lfcmVhZDMyKFNSQU1fQUREUkVTUyhkZXZpY2UsIEJDTV9GTERfQ1BVX1NUQVRFX09GRlNFVCkpOworICAgIHJldHVybiAwICE9ICh2YWx1ZSAmIEJDTV9GTERfRERSX1RFU1RfRE9ORV9NQVNLKTsKK30KKworYmNtb3NfYm9vbCBiY21fZmxkX3Rlc3RfZGV2aWNlX2Jvb3RyZWNvcmRfZmxhZyh1aW50MzJfdCBkZXZpY2UpCit7CisgICAgdm9sYXRpbGUgdWludDMyX3QgdmFsdWU7CisKKyAgICBpZiAoIWJjbTY4NjIwX2luZm8pCisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKworICAgIGlmIChkZXZpY2UgPj0gbWF4X2JjbTY4NjIwX2RldmljZSkKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworCisgICAgdmFsdWUgPSBiY21fcGNpX3JlYWQzMihTUkFNX0FERFJFU1MoZGV2aWNlLEJDTV9GTERfQ1BVX0JPT1RSRUNfU1RBVEVfT0ZGU0VUKSk7CisgICAgaWYgKHZhbHVlICYgQkNNX0ZMRF9DUFVfUFJNX1ZBTElEX01BU0spCisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworCisgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworfQorCitiY21vc19lcnJubyBiY21fZmxkX2dldF9kZXZpY2VfYm9vdHJlY29yZCh1aW50MzJfdCBkZXZpY2UsIHVpbnQzMl90ICpvcGFxdWVfZGF0YSkKK3sKKyAgICB1aW50MzJfdCAqYWRkciwgKnRlbXA7CisgICAgaW50MzJfdCBpOworCisgICAgaWYgKCFvcGFxdWVfZGF0YSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKworICAgIGlmICghYmNtNjg2MjBfaW5mbykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9SRVM7CisKKyAgICBpZiAoZGV2aWNlID49IG1heF9iY202ODYyMF9kZXZpY2UpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworCisgICAgdGVtcCA9IG9wYXF1ZV9kYXRhOworICAgIGFkZHIgPSBTUkFNX0FERFJFU1MoZGV2aWNlLEJDTV9GTERfQ1BVX0JPT1RSRUNPUkRfT0ZGU0VUKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgUENJRV9PUEFRVUVfREFUQV9TSVpFIC8gNDsgaSsrKQorICAgIHsKKyAgICAgICAgKnRlbXArKyA9IGJjbV9wY2lfcmVhZDMyKGFkZHIrKyk7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIGJjbV9mbGRfY2xlYXJfZGV2aWNlX2Jvb3RyZWNvcmRfZmxhZyh1aW50MzJfdCBkZXZpY2UpCit7CisgICAgdm9sYXRpbGUgdWludDMyX3QgdmFsdWU7CisKKyAgICBpZiAoIWJjbTY4NjIwX2luZm8pCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PUkVTOworCisgICAgaWYgKGRldmljZSA+PSBtYXhfYmNtNjg2MjBfZGV2aWNlKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKworICAgIC8qIGNsZWFyIFNvQyBwcm0gdmFsaWQgYml0ICovCisgICAgdmFsdWUgPSBiY21fcGNpX3JlYWQzMihTUkFNX0FERFJFU1MoZGV2aWNlLEJDTV9GTERfQ1BVX0JPT1RSRUNfU1RBVEVfT0ZGU0VUKSk7CisgICAgdmFsdWUgJj0gfkJDTV9GTERfQ1BVX1BSTV9WQUxJRF9NQVNLOworICAgIGJjbV9wY2lfd3JpdGUzMihTUkFNX0FERFJFU1MoZGV2aWNlLEJDTV9GTERfQ1BVX0JPT1RSRUNfU1RBVEVfT0ZGU0VUKSwgdmFsdWUpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIGJjbV9mbGRfc2V0X2hvc3RfYm9vdHJlY29yZF9mbGFnKHVpbnQzMl90IGRldmljZSkKK3sKKyAgICB2b2xhdGlsZSB1aW50MzJfdCB2YWx1ZTsKKworICAgIGlmICghYmNtNjg2MjBfaW5mbykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9SRVM7CisKKyAgICBpZiAoZGV2aWNlID49IG1heF9iY202ODYyMF9kZXZpY2UpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworCisgICAgLyogc2V0IGhvc3QgcHJtIHZhbGlkIGJpdCAqLworICAgIHZhbHVlID0gYmNtX3BjaV9yZWFkMzIoU1JBTV9BRERSRVNTKGRldmljZSxCQ01fRkxEX0hPU1RfQk9PVFJFQ19TVEFURV9PRkZTRVQpKTsKKyAgICB2YWx1ZSB8PSAoKDEgPDwgQkNNX0ZMRF9IT1NUX1BSTV9WQUxJRF9TSElGVCkgJiBCQ01fRkxEX0hPU1RfUFJNX1ZBTElEX01BU0spOworICAgIGJjbV9wY2lfd3JpdGUzMihTUkFNX0FERFJFU1MoZGV2aWNlLEJDTV9GTERfSE9TVF9CT09UUkVDX1NUQVRFX09GRlNFVCksIHZhbHVlKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19ib29sIGJjbV9mbGRfdGVzdF9ob3N0X2Jvb3RyZWNvcmRfZmxhZyh1aW50MzJfdCBkZXZpY2UpCit7CisgICAgdm9sYXRpbGUgdWludDMyX3QgdmFsdWU7CisKKyAgICBpZiAoIWJjbTY4NjIwX2luZm8pCisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKworICAgIGlmIChkZXZpY2UgPj0gbWF4X2JjbTY4NjIwX2RldmljZSkKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworCisgICAgdmFsdWUgPSBiY21fcGNpX3JlYWQzMihTUkFNX0FERFJFU1MoZGV2aWNlLEJDTV9GTERfSE9TVF9CT09UUkVDX1NUQVRFX09GRlNFVCkpOworICAgIGlmICh2YWx1ZSAmIEJDTV9GTERfSE9TVF9QUk1fVkFMSURfTUFTSykKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisKKyAgICByZXR1cm4gQkNNT1NfRkFMU0U7Cit9CisKK2JjbW9zX2Vycm5vIGJjbV9mbGRfc2V0X3JpbmdzX3NpemUodWludDMyX3QgZGV2aWNlLCB1aW50MzJfdCBob3N0X3R4X3NpemUsIHVpbnQzMl90IGhvc3Rfcnhfc2l6ZSkKK3sKKyAgICB2b2xhdGlsZSB1aW50MzJfdCB2YWx1ZTsKKworICAgIGlmICghYmNtNjg2MjBfaW5mbykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9SRVM7CisKKyAgICBpZiAoZGV2aWNlID49IG1heF9iY202ODYyMF9kZXZpY2UpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworCisgICAgLyogd3JpdGUgaG9zdF9wZF9yaW5nX3NpemUgdG8gY29tbXVuaWNhdGlvbiBhcmVhIC0gU29DIHdpbGwgdXNlIGl0IGluIGZpcnN0IHN0YWdlcyBvZiBhcHBsaWNhdGlvbiAqLworICAgIC8qIGRldmljZSB0eCByaW5nIHNpemUgaXMgdGhlIHNhbWUgYXMgaG9zdCByeCBxdWV1ZSAqLworICAgIGJjbV9wY2lfd3JpdGUzMihTUkFNX0FERFJFU1MoZGV2aWNlLEJDTV9GTERfSE9TVF9SWF9RVUVVRV9TSVpFX09GRlNFVCksIGhvc3Rfcnhfc2l6ZSk7CisgICAgLyogZGV2aWNlIHJ4IHJpbmcgc2l6ZSBpcyB0aGUgc2FtZSBhcyBob3N0IHR4IHF1ZXVlICovCisgICAgYmNtX3BjaV93cml0ZTMyKFNSQU1fQUREUkVTUyhkZXZpY2UsQkNNX0ZMRF9DUFVfUlhfUVVFVUVfU0laRV9PRkZTRVQpLCBob3N0X3R4X3NpemUpOworICAgIC8qIHNldCBob3N0IHF1ZXVlIHZhbGlkIGJpdCAqLworICAgIHZhbHVlID0gYmNtX3BjaV9yZWFkMzIoU1JBTV9BRERSRVNTKGRldmljZSxCQ01fRkxEX0NQVV9TRVRfUVVFVUVTX1NJWkUpKTsKKyAgICB2YWx1ZSB8PSAoKDEgPDwgQkNNX0ZMRF9DUFVfUVVFVUVfVkFMSURfU0hJRlQpICYgQkNNX0ZMRF9DUFVfUVVFVUVfVkFMSURfTUFTSyk7CisgICAgYmNtX3BjaV93cml0ZTMyKFNSQU1fQUREUkVTUyhkZXZpY2UsQkNNX0ZMRF9DUFVfU0VUX1FVRVVFU19TSVpFKSwgdmFsdWUpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIGJjbV9mbGRfZ2V0X2V4Y2VwdGlvbl9zdGF0ZSh1aW50MzJfdCBkZXZpY2UsIHVpbnQzMl90ICpzdGF0ZTAsIHVpbnQzMl90ICpzdGF0ZTEpCit7CisgICAgaWYgKCFiY202ODYyMF9pbmZvKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9OT1JFUzsKKworICAgIGlmIChkZXZpY2UgPj0gbWF4X2JjbTY4NjIwX2RldmljZSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisKKyAgICBpZiAoIXN0YXRlMCB8fCAhc3RhdGUxKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworCisgICAgKnN0YXRlMCA9IGJjbV9wY2lfcmVhZDMyKFNSQU1fQUREUkVTUyhkZXZpY2UsIEJDTV9GTERfQ1BVMF9QT1NUTU9SVEVNX1NUQVRFKSk7CisgICAgKnN0YXRlMSA9IGJjbV9wY2lfcmVhZDMyKFNSQU1fQUREUkVTUyhkZXZpY2UsIEJDTV9GTERfQ1BVMV9QT1NUTU9SVEVNX1NUQVRFKSk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtX2ZsZF9jbGVhcl9leGNlcHRpb25fc3RhdGUodWludDMyX3QgZGV2aWNlLCB1aW50MzJfdCBjcHVpZCkKK3sKKworICAgIHVpbnQzMl90IG9mZnNldCA9ICBjcHVpZCA/IEJDTV9GTERfQ1BVMV9QT1NUTU9SVEVNX1NUQVRFIDogQkNNX0ZMRF9DUFUwX1BPU1RNT1JURU1fU1RBVEU7CisKKyAgICBpZiAoIWJjbTY4NjIwX2luZm8pCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PUkVTOworCisgICAgaWYgKChkZXZpY2UgPj0gbWF4X2JjbTY4NjIwX2RldmljZSkgfHwgKGNwdWlkID4gMSkpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworCisgICAgYmNtX3BjaV93cml0ZTMyKFNSQU1fQUREUkVTUyhkZXZpY2UsIG9mZnNldCksIDApOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIGJjbV9mbGRfY29weV9leGNlcHRpb25fbG9nKHVpbnQzMl90IGRldmljZSwgdWludDMyX3QgY3B1aWQsIGNoYXIgKmJ1ZmZlciwgaW50ICpsZW5ndGgpCit7CisgICAgQkNNX0ZMRF9QT1NUTU9SVEVNX0xPRyAqZXhsb2c7CisgICAgdWludDMyX3Qgb2Zmc2V0ID0gIGNwdWlkID8gQkNNX0ZMRF9DUFUxX1BPU1RNT1JURU1fQlVGX09GRlNFVCA6IEJDTV9GTERfQ1BVMF9QT1NUTU9SVEVNX0JVRl9PRkZTRVQ7CisKKyAgICBpZiAoIWJjbTY4NjIwX2luZm8pCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PUkVTOworCisgICAgaWYgKChkZXZpY2UgPj0gbWF4X2JjbTY4NjIwX2RldmljZSkgfHwgKGNwdWlkID4gMSkpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworCisgICAgaWYgKCFidWZmZXIgfHwgIWxlbmd0aCkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKworICAgIGV4bG9nID0gKEJDTV9GTERfUE9TVE1PUlRFTV9MT0cgKilTUkFNX0FERFJFU1MoZGV2aWNlLCBvZmZzZXQpOworICAgIGlmIChleGxvZy0+bWFnaWMgIT0gQkNNX0ZMRF9QT1NUTU9SVEVNX0xPR19NQUdJQykKKyAgICAgICAgKmxlbmd0aCA9IDA7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgICpsZW5ndGggPSBleGxvZy0+bXNnX2xlbjsKKyAgICAgICAgLyogaWYgaG9zdCBpcyA2NCBiaXQgYW5kIGJpZ2VuZGlhbiBtZW1jcHkgZG9lcyBub3Qgd29yayBjb3JyZWN0bHkgKi8KKyAgICAgICAgZm9yIChpPTA7IGkgPCBleGxvZy0+bXNnX2xlbjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBidWZmZXJbaV0gPSBleGxvZy0+bXNnW2ldOworICAgICAgICB9CisgICAgfQorICAgIGJ1ZmZlclsqbGVuZ3RoXSA9ICdcMCc7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqCisqIFxEZWJ1ZyBzdGF0ZXMgYW5kIGZ1bmN0aW9ucworKi8KK2JjbW9zX2Vycm5vIGJjbV9mbGRfZ2V0X2RldmljZV9kZWJ1Z19zdGF0dXModWludDMyX3QgZGV2aWNlLCBiY21fZmxkX2RldmljZV9kZWJ1Z19zdGF0ZSAqaW5mbykKK3sKKyAgICB2b2xhdGlsZSB1aW50MzJfdCB2YWx1ZTsKKworICAgIGlmICghaW5mbykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKworICAgIGlmICghYmNtNjg2MjBfaW5mbykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9SRVM7CisKKyAgICBpZiAoZGV2aWNlID49IG1heF9iY202ODYyMF9kZXZpY2UpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworCisgICAgdmFsdWUgPSBiY21fcGNpX3JlYWQzMihTUkFNX0FERFJFU1MoZGV2aWNlLEJDTV9GTERfQ1BVX0RFQlVHX1NUQVRFX09GRlNFVCkpOworICAgIGluZm8tPmJvb3RfZnJvbV9zcmFtX3N0YXRlcyA9ICh2YWx1ZSAmIEJDTV9GTERfQ1BVX0JPT1RfRlJPTV9TUkFNX1NUQVRFU19NQVNLKSA+PiBCQ01fRkxEX0NQVV9CT09UX0ZST01fU1JBTV9TVEFURVNfU0hJRlQ7CisgICAgaW5mby0+Ym9vdF9mcm9tX3NyYW1fZXJyb3JzID0gKHZhbHVlICYgQkNNX0ZMRF9DUFVfQk9PVF9GUk9NX1NSQU1fRVJST1JTX01BU0spID4+IEJDTV9GTERfQ1BVX0JPT1RfRlJPTV9TUkFNX0VSUk9SU19TSElGVDsKKyAgICBpbmZvLT5ib290X2Zyb21fc3JhbV9leGNlcHRpb24gPSAodmFsdWUgJiBCQ01fRkxEX0NQVV9CT09UX0ZST01fU1JBTV9FWENFUFRJT05fTUFTSykgPj4gQkNNX0ZMRF9DUFVfQk9PVF9GUk9NX1NSQU1fRVhDRVBUSU9OX1NISUZUOworICAgIGluZm8tPnJ1bl9mcm9tX2Rkcl9zdGF0ZSA9ICh2YWx1ZSAmIEJDTV9GTERfQ1BVX1JVTl9GUk9NX0REUl9TVEFURVNfTUFTSykgPj4gQkNNX0ZMRF9DUFVfUlVOX0ZST01fRERSX1NUQVRFU19TSElGVDsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19lcnJubyBiY21fZmxkX2dldF9ob3N0X2RlYnVnX3N0YXR1cyh1aW50MzJfdCBkZXZpY2UsIGJjbV9mbGRfaG9zdF9kZWJ1Z19zdGF0ZSAqaW5mbykKK3sKKyAgICB2b2xhdGlsZSB1aW50MzJfdCB2YWx1ZTsKKworICAgIGlmICghaW5mbykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKworICAgIGlmICghYmNtNjg2MjBfaW5mbykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9SRVM7CisKKyAgICBpZiAoZGV2aWNlID49IG1heF9iY202ODYyMF9kZXZpY2UpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworCisgICAgdmFsdWUgPSBiY21fcGNpX3JlYWQzMihTUkFNX0FERFJFU1MoZGV2aWNlLEJDTV9GTERfSE9TVF9ERUJVR19TVEFURV9PRkZTRVQpKTsKKyAgICBpbmZvLT53cml0ZV9zcmFtID0gKHZhbHVlICYgQkNNX0ZMRF9IT1NUX1dSSVRFX1NSQU1fTUFTSykgPj4gQkNNX0ZMRF9IT1NUX1dSSVRFX1NSQU1fU0hJRlQ7CisgICAgaW5mby0+c3RhcnRfZGV2aWNlID0gKHZhbHVlICYgQkNNX0ZMRF9IT1NUX1NUQVJUX0NQVV9NQVNLKSA+PiBCQ01fRkxEX0hPU1RfU1RBUlRfQ1BVX1NISUZUOworICAgIGluZm8tPndyaXRlX2RkciA9ICh2YWx1ZSAmIEJDTV9GTERfSE9TVF9XUklURV9ERFJfTUFTSykgPj4gQkNNX0ZMRF9IT1NUX1dSSVRFX0REUl9TSElGVDsKKyAgICB2YWx1ZSA9IGJjbV9wY2lfcmVhZDMyKFNSQU1fQUREUkVTUyhkZXZpY2UsQkNNX0ZMRF9IT1NUX1NUQVRFX09GRlNFVCkpOworICAgIGluZm8tPmZpbmlzaF9kZHIgPSAodmFsdWUgJiBCQ01fRkxEX0hPU1RfRklOSVNIX1dSSVRFX0REUl9NQVNLKSA+PiBCQ01fRkxEX0hPU1RfRklOSVNIX1dSSVRFX0REUl9TSElGVDsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19lcnJubyBiY21fZmxkX3NldF9ob3N0X2RlYnVnX3N0YXR1cyh1aW50MzJfdCBkZXZpY2UsIEJDTV9GTERfSE9TVF9ERUJVR19WQUxVRVMgc3RhdCkKK3sKKyAgICB2b2xhdGlsZSB1aW50MzJfdCB2YWx1ZSA9IDA7CisKKyAgICBpZiAoIWJjbTY4NjIwX2luZm8pCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PUkVTOworCisgICAgaWYgKGRldmljZSA+PSBtYXhfYmNtNjg2MjBfZGV2aWNlKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKworICAgIGlmIChzdGF0ID09IEJDTV9GTERfSE9TVF9XUklURV9TUkFNKQorICAgICAgICB2YWx1ZSA9ICgoMSA8PCBCQ01fRkxEX0hPU1RfV1JJVEVfU1JBTV9TSElGVCkgJiBCQ01fRkxEX0hPU1RfV1JJVEVfU1JBTV9NQVNLKTsKKyAgICBlbHNlCisgICAgeworICAgICAgICB2YWx1ZSA9IGJjbV9wY2lfcmVhZDMyKFNSQU1fQUREUkVTUyhkZXZpY2UsQkNNX0ZMRF9IT1NUX0RFQlVHX1NUQVRFX09GRlNFVCkpOworICAgICAgICBpZiAoc3RhdCA9PSBCQ01fRkxEX0hPU1RfU1RBUlRfQ1BVKQorICAgICAgICAgICAgdmFsdWUgfD0gKCgxIDw8IEJDTV9GTERfSE9TVF9TVEFSVF9DUFVfU0hJRlQpICYgQkNNX0ZMRF9IT1NUX1NUQVJUX0NQVV9NQVNLKTsKKyAgICAgICAgZWxzZSBpZiAoc3RhdCA9PSBCQ01fRkxEX0hPU1RfV1JJVEVfRERSKQorICAgICAgICAgICAgdmFsdWUgfD0gKCgxIDw8IEJDTV9GTERfSE9TVF9XUklURV9ERFJfU0hJRlQpICYgQkNNX0ZMRF9IT1NUX1dSSVRFX0REUl9NQVNLKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgYmNtX3BjaV93cml0ZTMyKFNSQU1fQUREUkVTUyhkZXZpY2UsQkNNX0ZMRF9IT1NUX0RFQlVHX1NUQVRFX09GRlNFVCksIHZhbHVlKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19lcnJubyBiY21fZmxkX3NldF9yYXNfbW9kZV9zZXQodWludDMyX3QgZGV2aWNlLCB1aW50MzJfdCByYXMsIHVpbnQzMl90IG1vZGUpCit7CisgICAgdWludDMyX3Qgb2Zmc2V0ID0gIHJhcyA/IEJDTV9GTERfUkFTXzFfU0VUVElOR1MgOkJDTV9GTERfUkFTXzBfU0VUVElOR1M7CisKKyAgICBiY21fcGNpX3dyaXRlMzIoU1JBTV9BRERSRVNTKGRldmljZSwgb2Zmc2V0KSwgbW9kZSk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtX2ZsZF9zZXRfaG9zdF9ldmVudCh1aW50MzJfdCBkZXZpY2UsIHVpbnQzMl90IGV2ZW50KQoreworICAgIGlmICghYmNtNjg2MjBfaW5mbykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9SRVM7CisKKyAgICBpZiAoZGV2aWNlID49IG1heF9iY202ODYyMF9kZXZpY2UpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworCisgICAgYmNtX3BjaV93cml0ZTMyKFNSQU1fQUREUkVTUyhkZXZpY2UsIEJDTV9GTERfSE9TVF9FVkVOVCksIGV2ZW50KTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19ib29sIGJjbV9mbGRfdGVzdF9xdWV1ZXNfZmxhZyh1aW50MzJfdCBkZXZpY2UpCit7CisgICAgdm9sYXRpbGUgdWludDMyX3QgdmFsdWU7CisKKyAgICBpZiAoIWJjbTY4NjIwX2luZm8pCisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKworICAgIGlmIChkZXZpY2UgPj0gbWF4X2JjbTY4NjIwX2RldmljZSkKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworCisgICAgdmFsdWUgPSBiY21fcGNpX3JlYWQzMihTUkFNX0FERFJFU1MoZGV2aWNlLEJDTV9GTERfQ1BVX1NFVF9RVUVVRVNfU0laRSkpOworICAgIGlmICh2YWx1ZSAmIEJDTV9GTERfQ1BVX1FVRVVFX1ZBTElEX01BU0spCisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworCisgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworfQorCitiY21vc19ib29sIGJjbV9mbGRfcmVnc19zd2FwX25lZWRlZCh1aW50MzJfdCBkZXZpY2UpCit7CisgICAgdWludDMyX3QgdmFsdWU7CisKKyAgICB2YWx1ZSA9ICoodm9sYXRpbGUgdWludDMyX3QgKikoYmNtNjg2MjBfaW5mb1tkZXZpY2VdLnNvY19yZWdzX2Jhc2UgKyBQQ0lFX1JFVklTSU9OX1JFR0lTVEVSX09GRlNFVCk7CisgICAgaWYgKCh2YWx1ZSAmIDB4ZmZmZikgIT0gMHgwMzAyKQorICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKworICAgIHJldHVybiBCQ01PU19GQUxTRTsKK30KKworYmNtb3NfYm9vbCBiY21fZmxkX3NyYW1fc3dhcF9uZWVkZWQodWludDMyX3QgZGV2aWNlKQoreworICAgIHVpbnQzMl90IHZhbHVlOworICAgIHVpbnQ4X3QgY2hhcnZhbHVlOworCisgICAgdmFsdWUgPSAweGFhYmJjY2RkOworICAgICoodm9sYXRpbGUgdWludDMyX3QgKiliY202ODYyMF9pbmZvW2RldmljZV0uc29jX3NyYW1fYmFzZSA9IHZhbHVlOworICAgIGNoYXJ2YWx1ZSA9ICoodm9sYXRpbGUgdWludDhfdCAqKWJjbTY4NjIwX2luZm9bZGV2aWNlXS5zb2Nfc3JhbV9iYXNlOworICAgIGlmIChjaGFydmFsdWUgIT0gKih1aW50OF90ICopJnZhbHVlKQorICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKworICAgIHJldHVybiBCQ01PU19GQUxTRTsKK30KKworYmNtb3NfYm9vbCBiY21fZmxkX2Rkcl9zd2FwX25lZWRlZCh1aW50MzJfdCBkZXZpY2UpCit7CisgICAgdWludDMyX3QgdmFsdWU7CisgICAgdm9sYXRpbGUgdWludDMyX3QgKmFkZHJlc3M7CisgICAgdWludDhfdCBjaGFydmFsdWU7CisKKyAgICB2YWx1ZSA9IDB4YWFiYmNjZGQ7CisgICAgYWRkcmVzcyA9ICh1aW50MzJfdCAqKShiY202ODYyMF9pbmZvW2RldmljZV0uc29jX2Rkcl9iYXNlICsgYmNtNjg2MjBfaW5mb1tkZXZpY2VdLnNvY19jcnRfbGVuZ3RoKTsKKyAgICAqYWRkcmVzcyA9IHZhbHVlOworICAgIGNoYXJ2YWx1ZSA9ICphZGRyZXNzOworICAgIGlmIChjaGFydmFsdWUgIT0gKiZ2YWx1ZSkKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisKKyAgICByZXR1cm4gQkNNT1NfRkFMU0U7Cit9CisKKyNpZmRlZiBUWF9FTkFCTEVfRVZFTlRfVFJBQ0UKK2JjbW9zX2Vycm5vIGJjbV9mbGRfc2V0X2V2ZW50X3RyYWNlKHVpbnQzMl90IGRldmljZSkKK3sKKyAgICBpZiAoIWJjbTY4NjIwX2luZm8pCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PUkVTOworCisgICAgaWYgKGRldmljZSA+PSBtYXhfYmNtNjg2MjBfZGV2aWNlKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKworICAgIGJjbV9wY2lfd3JpdGUzMihTUkFNX0FERFJFU1MoZGV2aWNlLEJDTV9GTERfRVZFTlRfVFJBQ0VfT0ZGU0VUKSwgMHgxKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorYmNtb3NfZXJybm8gYmNtX2ZsZF9jbGVhcl9ldmVudF90cmFjZSh1aW50MzJfdCBkZXZpY2UpCit7CisgICAgaWYgKCFiY202ODYyMF9pbmZvKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9OT1JFUzsKKworICAgIGlmIChkZXZpY2UgPj0gbWF4X2JjbTY4NjIwX2RldmljZSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisKKyAgICBiY21fcGNpX3dyaXRlMzIoU1JBTV9BRERSRVNTKGRldmljZSxCQ01fRkxEX0VWRU5UX1RSQUNFX09GRlNFVCksIDB4MCk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKyNlbmRpZgorI2lmZGVmIERNQV9TVFVCCitiY21vc19lcnJubyBiY21fZmxkX3NldF9kZXZpY2VfYm9vdHJlY29yZF9mbGFnKHVpbnQzMl90IGRldmljZSkKK3sKKyAgICB2b2xhdGlsZSB1aW50MzJfdCB2YWx1ZTsKKworICAgIHZhbHVlID0gQkNNX0ZMRF9DUFVfUFJNX1ZBTElEX01BU0s7CisgICAgYmNtX3BjaV93cml0ZTMyKFNSQU1fQUREUkVTUyhkZXZpY2UsQkNNX0ZMRF9DUFVfQk9PVFJFQ19TVEFURV9PRkZTRVQpLCB2YWx1ZSk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtX2ZsZF9zZXRfZGV2aWNlX2Jvb3RyZWNvcmQodWludDMyX3QgZGV2aWNlLCB1aW50MzJfdCAqb3BhcXVlX2RhdGEpCit7CisgICAgdWludDMyX3QgKmFkZHIsICp0ZW1wOworICAgIGludDMyX3QgaTsKKworICAgIHRlbXAgPSBvcGFxdWVfZGF0YTsKKyAgICBhZGRyID0gU1JBTV9BRERSRVNTKGRldmljZSxCQ01fRkxEX0NQVV9CT09UUkVDT1JEX09GRlNFVCk7CisgICAgZm9yIChpID0gMDsgaSA8IFBDSUVfT1BBUVVFX0RBVEFfU0laRSAvIDQ7IGkrKykKKyAgICB7CisgICAgICAgIGJjbV9wY2lfd3JpdGUzMihhZGRyKyssKnRlbXArKyk7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisjZW5kaWYKKworYmNtb3NfZXJybm8gYmNtX2ZsZF9zZXRfYXZzX2NvbnQodWludDMyX3QgZGV2aWNlLCB1aW50MzJfdCB2YWx1ZSkKK3sKKyAgICBiY21fcGNpX3dyaXRlMzIoU1JBTV9BRERSRVNTKGRldmljZSwgQkNNX0ZMRF9BVlNfU0VUVElOR1MpLCB2YWx1ZSk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKwordm9pZCAqYmNtX2ZsZF9nZXRfc3dfZXJyb3JfdGFibGUodWludDMyX3QgZGV2aWNlLCB1aW50MzJfdCAqc2l6ZSkKK3sKKyAgICAqc2l6ZSA9IEJDTV9GTERfU1dfRVJST1JfVEFCTEVfU0laRTsKKyAgICByZXR1cm4gU1JBTV9BRERSRVNTKGRldmljZSwgQkNNX0ZMRF9TV19FUlJPUl9UQUJMRSk7Cit9CisKK3VpbnQzMl90IGJjbV9mbGRfZGRyX3Rlc3RfcmVzdWx0X2dldCh1aW50MzJfdCBkZXZpY2UsIHVpbnQzMl90IHdvcmQpCit7CisgICAgcmV0dXJuIGJjbV9wY2lfcmVhZDMyKFNSQU1fQUREUkVTUyhkZXZpY2UsIEJDTV9GTERfRERSX1RFU1RfUkVTVUxUUyArICh3b3JkICogQ09NTV9XT1JEX1NJWkUpKSk7Cit9CisKKyNpZmRlZiBfX0tFUk5FTF9fCitFWFBPUlRfU1lNQk9MKGJjbV9mbGRfaW5pdCk7CitFWFBPUlRfU1lNQk9MKGJjbV9mbGRfY2xlYXJfY29tbV9hcmVhKTsKK0VYUE9SVF9TWU1CT0woYmNtX2ZsZF9leGl0KTsKK0VYUE9SVF9TWU1CT0woYmNtX2ZsZF9yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKGJjbV9mbGRfdW5yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKGJjbV9mbGRfZ2V0X2RldmljZV9zdGF0dXMpOworRVhQT1JUX1NZTUJPTChiY21fZmxkX2dldF9kZXZpY2VfbG9hZGluZ19zdGF0ZSk7CitFWFBPUlRfU1lNQk9MKGJjbV9mbGRfaG9zdF9maW5pc2hfd3JpdGVfZGRyKTsKK0VYUE9SVF9TWU1CT0woYmNtX2ZsZF9nZXRfbG9ncyk7CitFWFBPUlRfU1lNQk9MKGJjbV9mbGRfd3JpdGUpOworRVhQT1JUX1NZTUJPTChiY21fZmxkX3JlYWQpOworRVhQT1JUX1NZTUJPTChiY21fZmxkX3N0YXJ0X2Jvb3Rsb2FkZXIpOworRVhQT1JUX1NZTUJPTChiY21fZmxkX2lzX2Jvb3Rsb2FkZXJfZG9uZSk7CitFWFBPUlRfU1lNQk9MKGJjbV9mbGRfc2V0X3JpbmdzX3NpemUpOworRVhQT1JUX1NZTUJPTChiY21fZmxkX2dldF9kZXZpY2VfYm9vdHJlY29yZCk7CitFWFBPUlRfU1lNQk9MKGJjbV9mbGRfdGVzdF9kZXZpY2VfYm9vdHJlY29yZF9mbGFnKTsKK0VYUE9SVF9TWU1CT0woYmNtX2ZsZF9jbGVhcl9kZXZpY2VfYm9vdHJlY29yZF9mbGFnKTsKK0VYUE9SVF9TWU1CT0woYmNtX2ZsZF9zZXRfaG9zdF9ib290cmVjb3JkX2ZsYWcpOworRVhQT1JUX1NZTUJPTChiY21fZmxkX3Rlc3RfaG9zdF9ib290cmVjb3JkX2ZsYWcpOworRVhQT1JUX1NZTUJPTChiY21fZmxkX3Rlc3RfcXVldWVzX2ZsYWcpOworRVhQT1JUX1NZTUJPTChiY21fZmxkX2dldF9kZXZpY2VfZGVidWdfc3RhdHVzKTsKK0VYUE9SVF9TWU1CT0woYmNtX2ZsZF9nZXRfaG9zdF9kZWJ1Z19zdGF0dXMpOworRVhQT1JUX1NZTUJPTChiY21fZmxkX3NldF9ob3N0X2RlYnVnX3N0YXR1cyk7CitFWFBPUlRfU1lNQk9MKGJjbV9mbGRfc2V0X3Jhc19tb2RlX3NldCk7CitFWFBPUlRfU1lNQk9MKGJjbV9mbGRfc2V0X2hvc3RfZXZlbnQpOworRVhQT1JUX1NZTUJPTChiY21fZmxkX2dldF9leGNlcHRpb25fc3RhdGUpOworRVhQT1JUX1NZTUJPTChiY21fZmxkX2NsZWFyX2V4Y2VwdGlvbl9zdGF0ZSk7CitFWFBPUlRfU1lNQk9MKGJjbV9mbGRfY29weV9leGNlcHRpb25fbG9nKTsKK0VYUE9SVF9TWU1CT0woYmNtX2ZsZF9yZWdzX3N3YXBfbmVlZGVkKTsKK0VYUE9SVF9TWU1CT0woYmNtX2ZsZF9zcmFtX3N3YXBfbmVlZGVkKTsKK0VYUE9SVF9TWU1CT0woYmNtX2ZsZF9kZHJfc3dhcF9uZWVkZWQpOworI2lmZGVmIFRYX0VOQUJMRV9FVkVOVF9UUkFDRQorRVhQT1JUX1NZTUJPTChiY21fZmxkX3NldF9ldmVudF90cmFjZSk7CitFWFBPUlRfU1lNQk9MKGJjbV9mbGRfY2xlYXJfZXZlbnRfdHJhY2UpOworI2VuZGlmCitFWFBPUlRfU1lNQk9MKGJjbV9mbGRfc2V0X2F2c19jb250KTsKK0VYUE9SVF9TWU1CT0woYmNtX2ZsZF9nZXRfc3dfZXJyb3JfdGFibGUpOworI2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZmxkL2JjbW9sdF9mbGQuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9mbGQvYmNtb2x0X2ZsZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMjk3YjIKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvZmxkL2JjbW9sdF9mbGQuaApAQCAtMCwwICsxLDQ1NiBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBCQ01PTFRfRkxEX0gKKyNkZWZpbmUgQkNNT0xUX0ZMRF9ICisKKyNpbmNsdWRlICJiY21vc19zeXN0ZW0uaCIKKyNpbmNsdWRlICJiY21vbHRfbW9kZWxfdHlwZXMuaCIKKyNpbmNsdWRlICJiY21vbHRfbW9kZWxfaWRzLmgiCisjaW5jbHVkZSAiYmNtX2ZsZF9jb21tb24uaCIKKworLyoqIFxkZWZncm91cCBcZmxkX2RhdGFfdHlwZXMgRGF0YSBUeXBlcworICogXGluZ3JvdXAgZmxkCisgKiBAeworICovCisKKyNkZWZpbmUgUENJRV9SRVZJU0lPTl9SRUdJU1RFUl9PRkZTRVQgICAgICAgMHg2NDA2Q1UgLyogUENJRV9QQ0lFX1BDSUVfMF9QQ0lFX1BDSUVfMF9NSVNDX1JFVklTSU9OICAgICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdW5zaWduZWQgbG9uZyAgIHNvY19yZWdzX2Jhc2U7CisgICAgdW5zaWduZWQgbG9uZyAgIHNvY19zcmFtX2Jhc2U7CisgICAgdW5zaWduZWQgbG9uZyAgIHNvY19kZHJfYmFzZTsKKyAgICB1aW50MzJfdCAgICAgICAgc29jX2Rkcl9sZW5ndGg7ICAgICAvKiBkZHIgd2luZG93IGxlbmd0aCAqLworICAgIHVpbnQzMl90ICAgICAgICBzb2NfY3J0X2xlbmd0aDsgICAgIC8qIGRkciB1c2VkIGZvciBsb2FkIGxlbmd0aCAqLworfSBiY21fZmxkX2RldmljZV9pbmZvOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVpbnQzMl90ICAgIG9zX2VudHJ5X29mZnNldDsKKyAgICB1aW50MzJfdCAgICBwcm90b2NvbF92ZXJzaW9uOworICAgIHVpbnQzMl90ICAgIHN0YXRlOworICAgIHVpbnQzMl90ICAgIHJlYXNvbjsKK30gYmNtX2ZsZF9kZXZpY2Vfc3RhdDsKKworLyoqCisqIFxicmllZiBJbml0aWFsaXplIGludGVybmFsIGRhdGEgYmFzZQorKgorKiAgYWxsb2NhdGUgdGhlIGFycmF5IG9mIHBvaW50ZXJzIHRvIGluZm8gcGVyIGRldmljZSBhbGxvY2F0ZQorKiAgYW5kIGNsZWFyIHRoZSBpbmZvIHN0cnVjdHVyZSBmb3IgZXZlcnkgcG9zc2libGUgZGV2aWNlCisqCisqIFxwYXJhbVtpbl0gbWF4X2RldmljZXMgSG93IG1hbnkgZGV2aWNlcyBtaWdodCBiZSBkZWZpbmVkCisqCisqIFxyZXR1cm4KKyogMCBpZiBzdWNjZXNzZnVsLCA8MCBpZiBmYWlsZWQKKyovCitiY21vc19lcnJubyBiY21fZmxkX2luaXQodWludDMyX3QgbWF4X2RldmljZXMpOworCisvKioKKyogXGJyaWVmIEluaXRpYWxpemUgY29tbXVuaWNhdGlvbiBhcmVhCisqCisqICBjbGVhciB0aGUgY29tbXVuaWNhdGlvbiBhcmVhCisqCisqIFxwYXJhbVtpbl0gZGV2aWNlIElkZW50aWZpZXMgdGhlIGRldmljZQorKgorKi8KK3ZvaWQgYmNtX2ZsZF9jbGVhcl9jb21tX2FyZWEodWludDMyX3QgZGV2aWNlKTsKKworLyoqCisqIFxicmllZiBSZWxlYXNlIGludGVybmFsIGRhdGEgYmFzZQorKgorKiBccmV0dXJuCisqIDAgaWYgc3VjY2Vzc2Z1bCwgPDAgaWYgZmFpbGVkCisqLworYmNtb3NfZXJybm8gYmNtX2ZsZF9leGl0KHZvaWQpOworCisvKioKKyogXGJyaWVmIFJlZ2lzdGVyIGEgZGV2aWNlIHRvIGRyaXZlcgorKgorKiAgc3RvcmUgdXNlcidzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkZXZpY2UKKyoKKyogXHBhcmFtW2luXSBkZXZpY2UgSWRlbnRpZmllcyB0aGUgZGV2aWNlCisqIFxwYXJhbVtpbl0gaW5mbyBJbmZvcm1hdGlvbgorKiAgIC0gcmVncyBiYXNlIGFkZHJlc3MKKyogICAtIHNyYW0gYmFzZSBhZGRyZXNzCisqICAgLSBkZHIgYmFzZSBhZGRyZXNzCisqICAgLSBkZHIgd2luZG93IHNpemUKKyoKKyogXHJldHVybgorKiAwIGlmIHN1Y2Nlc3NmdWwsIDwwIGlmIGZhaWxlZAorKi8KK2JjbW9zX2Vycm5vIGJjbV9mbGRfcmVnaXN0ZXIodWludDMyX3QgZGV2aWNlLCBiY21fZmxkX2RldmljZV9pbmZvICppbmZvKTsKKworLyoqCisqIFxicmllZiBVbnJlZ2lzdGVyIGEgZGV2aWNlIGZyb20gZHJpdmVyCisqCisqICByZW1vdmUgdGhlIGRldmljZSBmcm9tIHRoZSBpbnRlcm5hbCBkYgorKgorKiBccGFyYW1baW5dIGRldmljZSBJZGVudGlmaWVzIHRoZSBkZXZpY2UKKyoKKyogXHJldHVybgorKiAwIGlmIHN1Y2Nlc3NmdWwsIDwwIGlmIGZhaWxlZAorKi8KK2JjbW9zX2Vycm5vIGJjbV9mbGRfdW5yZWdpc3Rlcih1aW50MzJfdCBkZXZpY2UpOworCisvKioKKyogXGJyaWVmIFJlYWQgZnJvbSBjb21tdW5pY2F0aW9uIFNvQyBkZWJ1ZyBpbmZvcm1hdGlvbgorKgorKiBccGFyYW1baW5dIGRldmljZSBJZGVudGlmaWVzIHRoZSBkZXZpY2UKKyogXHBhcmFtW2luXSBkZWJ1Z19zdGF0ZSBJbmZvcm1hdGlvbiB0byBiZSBmaWxsZWQgcG9pbnRlcgorKgorKiBccmV0dXJuCisqIDAgaWYgc3VjY2Vzc2Z1bCwgPDAgaWYgZmFpbGVkCisqLworYmNtb3NfZXJybm8gYmNtX2ZsZF9nZXRfZGV2aWNlX3N0YXR1cyh1aW50MzJfdCBkZXZpY2UsIGJjbV9mbGRfZGV2aWNlX3N0YXQgKmRlYnVnX3N0YXRlKTsKKworLyoqCisqIFxicmllZiBSZWFkIGZyb20gY29tbXVuaWNhdGlvbiBTb0Mgc3RhdHVzCisqCisqIFxwYXJhbVtpbl0gZGV2aWNlIElkZW50aWZpZXMgdGhlIGRldmljZQorKiBccGFyYW1baW5dIGNwdV9zdGF0ZSBJbmZvcm1hdGlvbiB0byBiZSBmaWxsZWQgcG9pbnRlcgorKgorKiBccmV0dXJuCisqIDAgaWYgc3VjY2Vzc2Z1bCwgPDAgaWYgZmFpbGVkCisqLworYmNtb3NfZXJybm8gYmNtX2ZsZF9nZXRfZGV2aWNlX2xvYWRpbmdfc3RhdGUodWludDMyX3QgZGV2aWNlLCBCQ01fRkxEX0NQVV9TVEFURSAqY3B1X3N0YXRlKTsKKworLyoqCisqIFxicmllZiBXcml0ZSBpbiBjb21tdW5pY2F0aW9uIGFyZWEgdGhlIGZpbmlzaCB3cml0aW5nIEREUgorKiAgICAgICAgaW5kaWNhdG9yCisqCisqIFxwYXJhbVtpbl0gZGV2aWNlIElkZW50aWZpZXMgdGhlIGRldmljZQorKiBccGFyYW1baW5dIG9zX2VudHJ5X2FkZHJlc3MgRW50cnkgcG9pbnQgZm9yIGVtYmVkZGVkCisqICAgICAgIGFwcGxpY2F0aW9uCisqCisqIFxyZXR1cm4KKyogMCBpZiBzdWNjZXNzZnVsLCA8MCBpZiBmYWlsZWQKKyovCitiY21vc19lcnJubyBiY21fZmxkX2hvc3RfZmluaXNoX3dyaXRlX2Rkcih1aW50MzJfdCBkZXZpY2UsIHVpbnQzMl90IG9zX2VudHJ5X2FkZHJlc3MpOworCisvKioKKyogXGJyaWVmIFJlYWQgZnJvbSBjb21tdW5pY2F0aW9uIHRoZSBsb2dzIGFyZWEKKyoKKyogXHBhcmFtW2luXSBkZXZpY2UgSWRlbnRpZmllcyB0aGUgZGV2aWNlCisqIFxwYXJhbVtvdXRdIGxvZ19hcmVhIFBvaW50ZXIgbG9nZ2VyIGFyZWEKKyogXHBhcmFtW291dF0gbGVuZ3RoIExlbmd0aCBsb2dnZXIgYXJlYQorKgorKiBccmV0dXJuCisqIDAgaWYgc3VjY2Vzc2Z1bCwgPDAgaWYgZmFpbGVkCisqLworYmNtb3NfZXJybm8gYmNtX2ZsZF9nZXRfbG9ncyh1aW50MzJfdCBkZXZpY2UsIGNoYXIgKipsb2dfYXJlYSwgaW50ICpsZW5ndGgpOworCisvKioKKyogXGJyaWVmIFdyaXRlIHRoZSByZWNlaXZlZCBidWZmZXIgdG8gbWVtb3J5IGFjY29yZGluZyB0byBvZmZzZXQKKyogICAgICAgIGFuZCB0eXBlCisqCisqIFxwYXJhbVtpbl0gZGV2aWNlIElkZW50aWZpZXMgdGhlIGRldmljZQorKiBccGFyYW1baW5dIGJ1ZmYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIGJlIHdyaXR0ZW4KKyogXHBhcmFtW2luXSBidWZmX3NpemUgQnVmZmVyIHNpemUKKyogXHBhcmFtW2luXSBvZmZzZXRfaW5faW1hZ2Ugb2Zmc2V0IHRvIHdyaXRlIHRoZSBidWZmZXIKKyogXHBhcmFtW2luXSBpbWFnZV90eXBlIExvYWRpbmcgdHlwZSwgYWNjb3JkaW5nIHRvIGRlc3RpbmF0aW9uIDoKKyogICAgICAgU1JBTSBvciBERFIKKyoKKyogXHJldHVybgorKiAwIGlmIHN1Y2Nlc3NmdWwsIDwwIGlmIGZhaWxlZAorKi8KK2JjbW9zX2Vycm5vIGJjbV9mbGRfd3JpdGUodWludDMyX3QgZGV2aWNlLCBjaGFyICpidWZmLCB1aW50MzJfdCBidWZmX3NpemUsIHVpbnQzMl90IG9mZnNldF9pbl9pbWFnZSwgYmNtb2x0X2RldmljZV9pbWFnZV90eXBlIGltYWdlX3R5cGUpOworCisvKioKKyogXGJyaWVmIFJlYWQgaW50byByZWNlaXZlZCBidWZmZXIgZnJvbSBtZW1vcnkgYWNjb3JkaW5nIHRvCisqICAgICAgICBvZmZzZXQgYW5kIHR5cGUKKyoKKyogXHBhcmFtW2luXSBkZXZpY2UgSWRlbnRpZmllcyB0aGUgZGV2aWNlCisqIFxwYXJhbVtpbl0gYnVmZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVjZWl2ZSB0aGUgY29udGVudAorKiBccGFyYW1baW5dIGJ1ZmZfc2l6ZSBCdWZmZXIgc2l6ZQorKiBccGFyYW1baW5dIG9mZnNldF9pbl9pbWFnZSBvZmZzZXQgdG8gcmVhZCBpbnRvIHRoZSBidWZmZXIKKyogXHBhcmFtW2luXSBpbWFnZV90eXBlIExvYWRpbmcgdHlwZSwgYWNjb3JkaW5nIHRvIGRlc3RpbmF0aW9uIDoKKyogICAgICAgU1JBTSBvciBERFIKKyoKKyogXHJldHVybgorKiAwIGlmIHN1Y2Nlc3NmdWwsIDwwIGlmIGZhaWxlZAorKi8KK2JjbW9zX2Vycm5vIGJjbV9mbGRfcmVhZCh1aW50MzJfdCBkZXZpY2UsIGNoYXIgKmJ1ZmYsIHVpbnQzMl90ICpidWZmX3NpemUsIHVpbnQzMl90IG9mZnNldF9pbl9pbWFnZSwgYmNtb2x0X2RldmljZV9pbWFnZV90eXBlIGltYWdlX3R5cGUpOworCisvKioKKyogXGJyaWVmIFRha2Ugc29jIGNwdSBvdXQgb2YgcmVzZXQKKyoKKyogXHBhcmFtW2luXSBkZXZpY2UgSWRlbnRpZmllcyB0aGUgZGV2aWNlCisqCisqIFxyZXR1cm4KKyogMCBpZiBzdWNjZXNzZnVsLCA8MCBpZiBmYWlsZWQKKyovCitiY21vc19lcnJubyBiY21fZmxkX3N0YXJ0X2Jvb3Rsb2FkZXIodWludDMyX3QgZGV2aWNlLCB1aW50MzJfdCB0ZXN0X2Rkcik7CisKKy8qKgorKiBcYnJpZWYgQ2hlY2sgaWYgYm9vdGxvYWRlciBmaW5pc2hlZCB0byBydW4KKyoKKyogXHBhcmFtW2luXSBkZXZpY2UgSWRlbnRpZmllcyB0aGUgZGV2aWNlCisqCisqIFxyZXR1cm4KKyogQkNNT1NfVFJVRSBpZiBzdWNjZXNzZnVsLCBCQ01PU19GQUxTRSBpZiBmYWlsZWQKKyovCitiY21vc19ib29sIGJjbV9mbGRfaXNfYm9vdGxvYWRlcl9kb25lKHVpbnQzMl90IGRldmljZSk7CisKK2JjbW9zX2Jvb2wgYmNtX2ZsZF9pc19kZHJfdGVzdF9kb25lKHVpbnQzMl90IGRldmljZSk7CisKKy8qKgorKiBcYnJpZWYgQ2hlY2sgaWYgU29DIGZpbmlzaGVkIHN5bmNocm9uaXphdGlvbiBwcm9jZXNzCisqCisqIFxwYXJhbVtpbl0gZGV2aWNlIElkZW50aWZpZXMgdGhlIGRldmljZQorKgorKiBccmV0dXJuCisqLworYmNtb3NfYm9vbCBiY21fZmxkX3Rlc3RfZGV2aWNlX2Jvb3RyZWNvcmQodWludDMyX3QgZGV2aWNlKTsKKworLyoqCisqIFxicmllZiBSZXR1cm5zIHRoZSBib290cmVjb3JkIG9mIHRoZSBTb0MKKyoKKyogXHBhcmFtW2luXSBkZXZpY2UgSWRlbnRpZmllcyB0aGUgZGV2aWNlCisqIFxwYXJhbVtpbl0gb3BhcXVlX2RhdGEgUG9pbnRlciB0byBpbmZvcm1hdGlvbgorKiAgIC0gcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgYnVmZmVyIGRlc2NyaXB0b3JzIHJpbmcKKyogICAtIHBoeXNpY2FsIGFkZHJlc3Mgb2Ygc2hhZG93IGJ1ZmZlciBkZXNjcmlwdG9ycyByaW5nCisqICAgaW5mb19sZW5ndGggTVVTVCBiZSBtb2R1bG8gNAorKgorKiBccmV0dXJuCisqIDAgaWYgc3VjY2Vzc2Z1bCwgPDAgaWYgZmFpbGVkCisqLworYmNtb3NfZXJybm8gYmNtX2ZsZF9nZXRfZGV2aWNlX2Jvb3RyZWNvcmQodWludDMyX3QgZGV2aWNlLCB1aW50MzJfdCAqb3BhcXVlX2RhdGEpOworCisvKioKKyogXGJyaWVmIFNldCBib290cmVjb3JkIHZhbGlkIGJpdCB0byBiZSBjaGVja2VkIGJ5IHRoZSBkZXZpY2UKKyoKKyogXHBhcmFtW2luXSBkZXZpY2UgSWRlbnRpZmllcyB0aGUgZGV2aWNlCisqIFxyZXR1cm4KKyogMCBpZiBzdWNjZXNzZnVsLCA8MCBpZiBmYWlsZWQKKyovCitiY21vc19lcnJubyBiY21fZmxkX3NldF9ob3N0X2Jvb3RyZWNvcmRfZmxhZyh1aW50MzJfdCBkZXZpY2UpOworCisvKioKKyogXGJyaWVmIENoZWNrIGJvb3RyZWNvcmQgdmFsaWQgYml0IHNldCBwcmV2aW91c2x5IGJ5IHRoZSBkZXZpY2UKKyoKKyogXHBhcmFtW2luXSBkZXZpY2UgSWRlbnRpZmllcyB0aGUgZGV2aWNlCisqIFxyZXR1cm4KKyogMCBpZiBzdWNjZXNzZnVsLCA8MCBpZiBmYWlsZWQKKyovCitiY21vc19ib29sIGJjbV9mbGRfdGVzdF9ob3N0X2Jvb3RyZWNvcmRfZmxhZyh1aW50MzJfdCBkZXZpY2UpOworCisvKioKKyogXGJyaWVmIENsZWFyIGJvb3RyZWNvcmQgdmFsaWQgYml0IHRvIGJlIGNoZWNrZWQgYnkgdGhlIGRldmljZQorKgorKiBccGFyYW1baW5dIGRldmljZSBJZGVudGlmaWVzIHRoZSBkZXZpY2UKKyogXHJldHVybgorKiAwIGlmIHN1Y2Nlc3NmdWwsIDwwIGlmIGZhaWxlZAorKi8KK2JjbW9zX2Vycm5vIGJjbV9mbGRfY2xlYXJfZGV2aWNlX2Jvb3RyZWNvcmRfZmxhZyh1aW50MzJfdCBkZXZpY2UpOworCisvKioKKyogXGJyaWVmIENoZWNrIGJvb3RyZWNvcmQgdmFsaWQgYml0IHNldCBwcmV2aW91c2x5IGJ5IHRoZSBkZXZpY2UKKyoKKyogXHBhcmFtW2luXSBkZXZpY2UgSWRlbnRpZmllcyB0aGUgZGV2aWNlCisqIFxyZXR1cm4KKyogMCBpZiBzdWNjZXNzZnVsLCA8MCBpZiBmYWlsZWQKKyovCitiY21vc19ib29sIGJjbV9mbGRfdGVzdF9kZXZpY2VfYm9vdHJlY29yZF9mbGFnKHVpbnQzMl90IGRldmljZSk7CisKKy8qKgorKiBcYnJpZWYgV3JpdGUgdGhlIHR4IGFuZCByeCBxdWV1ZSBzaXplcyB0byBjb21tdW5pY2F0aW9uIGFyZWEKKyogICBzZXQgcXVldWUgdmFsaWRpdHkgYml0IGZvciB0aGUgZGV2aWNlCisqCisqIFxwYXJhbVtpbl0gZGV2aWNlIElkZW50aWZpZXMgdGhlIGRldmljZQorKiBccGFyYW1baW5dIGhvc3RfdHhfc2l6ZSBRdWV1ZSBzaXplIDogaXMgYWxzbyB0aGUgZGV2aWNlIHJ4CisqICAgICAgIHF1ZXVlIHNpemUKKyogXHBhcmFtW2luXSBob3N0X3J4X3NpemUgUXVldWUgc2l6ZSA6IGlzIGFsc28gdGhlIGRldmljZSB0eAorKiAgICAgICBxdWV1ZSBzaXplCisqIFxyZXR1cm4KKyogMCBpZiBzdWNjZXNzZnVsLCA8MCBpZiBmYWlsZWQKKyovCitiY21vc19lcnJubyBiY21fZmxkX3NldF9yaW5nc19zaXplKHVpbnQzMl90IGRldmljZSwgdWludDMyX3QgaG9zdF90eF9zaXplLCB1aW50MzJfdCBob3N0X3J4X3NpemUpOworCisvKioKKyogXGJyaWVmIHNldCBERFIgUkFTY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzCisqCisqIFxwYXJhbVtpbl0gZGV2aWNlIElkZW50aWZpZXMgdGhlIGRldmljZQorKgorKiBccGFyYW1baW5dIHJhcyAgSWRlbnRpZmllcyB0aGUgcmFzIG51bWJlciAsIGNhbiBiZSAwIG9yIDEKKyoKKyogXHBhcmFtW2luXSBtb2RlIElkZW50aWZpZXMgbW9kZSAtIGRpc2FibGUgMCwgZ3BvbiAxLCB4Z3BvbiAyLAorKgorKiBccmV0dXJuCisqIDAgaWYgc3VjY2Vzc2Z1bCwgPDAgaWYgZmFpbGVkCisqLworYmNtb3NfZXJybm8gYmNtX2ZsZF9zZXRfcmFzX21vZGVfc2V0KHVpbnQzMl90IGRldmljZSwgdWludDMyX3QgcmFzLCB1aW50MzJfdCBtb2RlKTsKKworLyoqCisqIFxicmllZiBOb3RpZnkgZGV2aWNlIGFib3V0IGFuIGV2ZW50IHRoYXQgb2NjdXJyZWQgb24gdGhlIGhvc3Qgc2lkZQorKgorKiBccGFyYW1baW5dIGRldmljZSBJZGVudGlmaWVzIHRoZSBkZXZpY2UKKyoKKyogXHBhcmFtW2luXSBldmVudCAgVXNlciBkZWZpbmVkIGV2ZW50CisqCisqIFxyZXR1cm4KKyogMCBpZiBzdWNjZXNzZnVsLCA8MCBpZiBmYWlsZWQKKyovCitiY21vc19lcnJubyBiY21fZmxkX3NldF9ob3N0X2V2ZW50KHVpbnQzMl90IGRldmljZSwgdWludDMyX3QgZXZlbnQpOworCisvKioKKyogXGJyaWVmIENoZWNrIHF1ZXVlcyB2YWxpZCBiaXQgc2V0IHByZXZpb3VzbHkgYnkgSG9zdAorKgorKiBccGFyYW1baW5dIGRldmljZSBJZGVudGlmaWVzIHRoZSBkZXZpY2UKKyoKKyogXHJldHVybgorKiBGQUxTRSBpZiBQUk1fVkFMSUQgYml0IGlzIG5vdCBzZXQsIFRSVUUgaWYgUFJNX1ZBTElEIGJpdCBpcworKiBzZXQKKyovCitiY21vc19ib29sIGJjbV9mbGRfdGVzdF9xdWV1ZXNfZmxhZyh1aW50MzJfdCBkZXZpY2UpOworCisvKioKKyogXGJyaWVmIEdldCB0aGUgZXhjZXB0aW9uIGFyZWEgc3RhdGUsIHNldCBieSB0aGUgZGV2aWNlIGV4Y2VwdGlvbgorKiAgICAgICAgaGFuZGxlcgorKgorKiBccGFyYW1baW5dIGRldmljZSBJZGVudGlmaWVzIHRoZSBkZXZpY2UKKyogXHBhcmFtW291dF0gc3RhdGUgUG9pbnRlciB0byBleGNlcHRpb24gc3RhdGUgb24gY3B1MCB2YWx1ZQorKiBccGFyYW1bb3V0XSBzdGF0ZSBQb2ludGVyIHRvIGV4Y2VwdGlvbiBzdGF0ZSBvbiBjcHUxIHZhbHVlCisqCisqIFxyZXR1cm4KKyogMCBpZiBzdWNjZXNzZnVsLCA8MCBpZiBmYWlsZWQKKyovCisKK2JjbW9zX2Vycm5vIGJjbV9mbGRfZ2V0X2V4Y2VwdGlvbl9zdGF0ZSh1aW50MzJfdCBkZXZpY2UsIHVpbnQzMl90ICpzdGF0ZTAsIHVpbnQzMl90ICpzdGF0ZTEpOworCisvKioKKyogXGJyaWVmIENsZWFyIHRoZSBleGNlcHRpb24gYXJlYSBzdGF0ZQorKgorKiBccGFyYW1baW5dIGRldmljZSBJZGVudGlmaWVzIHRoZSBkZXZpY2UKKyogXHBhcmFtW2luXSBjcHVpZCBJZGVudGlmaWVzIHRoZSB0aGUgZGV2aWNlIGNwdQorKgorKiBccmV0dXJuCisqIDAgaWYgc3VjY2Vzc2Z1bCwgPDAgaWYgZmFpbGVkCisqLworYmNtb3NfZXJybm8gYmNtX2ZsZF9jbGVhcl9leGNlcHRpb25fc3RhdGUodWludDMyX3QgZGV2aWNlLCB1aW50MzJfdCBjcHVpZCk7CisKKy8qKgorKiBcYnJpZWYgRmlsbCBidWZmZXIgd2l0aCB0aGUgZXhjZXB0aW9uIGFyZWEgY29udGVudCwgc2V0IGJ5CisqICAgICAgICB0aGUgZGV2aWNlIGV4Y2VwdGlvbiBoYW5kbGVyCisqCisqIFxwYXJhbVtpbl0gZGV2aWNlIElkZW50aWZpZXMgdGhlIGRldmljZQorKiBccGFyYW1baW5dIGNwdWlkIElkZW50aWZpZXMgdGhlIHRoZSBkZXZpY2UgY3B1CisqIFxwYXJhbVtvdXRdIGJ1ZmZlciBQb2ludGVyIHRvIGJlIGZpbGxlZCB3aXRoIHRoZSBleGNlcHRpb24KKyogICAgICAgYXJlYSBjb250ZW50CisqIFxwYXJhbVtvdXRdIGxlbmd0aCBMZW5ndGggb2YgdGhlIGJ1ZmZlcgorKgorKiBccmV0dXJuCisqIDAgaWYgc3VjY2Vzc2Z1bCwgPDAgaWYgZmFpbGVkCisqLworYmNtb3NfZXJybm8gYmNtX2ZsZF9jb3B5X2V4Y2VwdGlvbl9sb2codWludDMyX3QgZGV2aWNlLCB1aW50MzJfdCBjcHVpZCwgY2hhciAqYnVmZmVyLCBpbnQgKmxlbmd0aCk7CisKKyNpZmRlZiBUWF9FTkFCTEVfRVZFTlRfVFJBQ0UKKy8qKgorKiBcYnJpZWYgU2V0IGV2ZW50IHRyYWNlIGZsYWcgdG8gYmUgcmVhZCBieSBlbWJlZGRlZCBhbmQgc3RhcnQKKyogICAgICAgIHRyYWNlaW5nCisqCisqIFxwYXJhbVtpbl0gZGV2aWNlIElkZW50aWZpZXMgdGhlIGRldmljZQorKgorKiBccmV0dXJuCisqIDAgaWYgc3VjY2Vzc2Z1bCwgPDAgaWYgZmFpbGVkCisqLworYmNtb3NfZXJybm8gYmNtX2ZsZF9zZXRfZXZlbnRfdHJhY2UodWludDMyX3QgZGV2aWNlKTsKKworLyoqCisqIFxicmllZiBDbGVhciBldmVudCB0cmFjZSBmbGFnIHRvIGJlIHJlYWQgYnkgZW1iZWRkZWQgYW5kIHN0b3AKKyogICAgICAgIHRyYWNlaW5nCisqCisqIFxwYXJhbVtpbl0gZGV2aWNlIElkZW50aWZpZXMgdGhlIGRldmljZQorKgorKiBccmV0dXJuCisqIDAgaWYgc3VjY2Vzc2Z1bCwgPDAgaWYgZmFpbGVkCisqLworYmNtb3NfZXJybm8gYmNtX2ZsZF9jbGVhcl9ldmVudF90cmFjZSh1aW50MzJfdCBkZXZpY2UpOworI2VuZGlmCisKKy8qKgorKiBcRGVidWcgc3RhdGVzIGFuZCBmdW5jdGlvbnMKKyovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVpbnQzMl90ICAgIHdyaXRlX3NyYW07CisgICAgdWludDMyX3QgICAgc3RhcnRfZGV2aWNlOworICAgIHVpbnQzMl90ICAgIHdyaXRlX2RkcjsKKyAgICB1aW50MzJfdCAgICBmaW5pc2hfZGRyOworfSBiY21fZmxkX2hvc3RfZGVidWdfc3RhdGU7CisKK3R5cGVkZWYgZW51bQoreworICAgIEJDTV9GTERfSE9TVF9OT05FLAorICAgIEJDTV9GTERfSE9TVF9XUklURV9TUkFNLCAgICAvKiBzZXQgYmVmb3JlIGxvYWQgIGltYWdlIHRvIFNSQU0gKi8KKyAgICBCQ01fRkxEX0hPU1RfU1RBUlRfQ1BVLCAgICAgLyogc2V0IGJlZm9yZSByZXN1bWUgQVJNICovCisgICAgQkNNX0ZMRF9IT1NUX1dSSVRFX0REUiAgICAgIC8qIHNldCBiZWZvcmUgbG9hZCAgaW1hZ2UgdG8gRERSICovCit9IEJDTV9GTERfSE9TVF9ERUJVR19WQUxVRVM7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDMyX3QgYm9vdF9mcm9tX3NyYW1fc3RhdGVzOworICAgIHVpbnQzMl90IGJvb3RfZnJvbV9zcmFtX2Vycm9yczsKKyAgICB1aW50MzJfdCBib290X2Zyb21fc3JhbV9leGNlcHRpb247CisgICAgdWludDMyX3QgcnVuX2Zyb21fZGRyX3N0YXRlOworfSBiY21fZmxkX2RldmljZV9kZWJ1Z19zdGF0ZTsKKworLyoqCisqIFxicmllZiBTZXQgYW5kIGdldCBkZWJ1Z2dpbmcgdHJhY2VpbmcgZnJvbSBjb21tdW5pY2F0aW9uIGFyZWEKKyoKKyogXHBhcmFtW2luXSBkZXZpY2UgSWRlbnRpZmllcyB0aGUgZGV2aWNlCisqIFxwYXJhbVtpbl0gaW5mbyBQb2ludGVyIHRvIGluZm9ybWF0aW9uCisqCisqIFxyZXR1cm4KKyogMCBpZiBzdWNjZXNzZnVsLCA8MCBpZiBmYWlsZWQKKyovCisvKiByZXR1cm5zIHNvYyBkZWJ1ZyBzdGF0ZXMgKi8KK2JjbW9zX2Vycm5vIGJjbV9mbGRfZ2V0X2RldmljZV9kZWJ1Z19zdGF0dXModWludDMyX3QgZGV2aWNlLCBiY21fZmxkX2RldmljZV9kZWJ1Z19zdGF0ZSAqaW5mbyk7CisvKiBkZWFsIHdpdGggaG9zdCBzdGF0ZXMgLSBmdW5jdGlvbmFsIGFuZCBkZWJ1ZyAqLworYmNtb3NfZXJybm8gYmNtX2ZsZF9nZXRfaG9zdF9kZWJ1Z19zdGF0dXModWludDMyX3QgZGV2aWNlLCBiY21fZmxkX2hvc3RfZGVidWdfc3RhdGUgKmluZm8pOworYmNtb3NfZXJybm8gYmNtX2ZsZF9zZXRfaG9zdF9kZWJ1Z19zdGF0dXModWludDMyX3QgZGV2aWNlLCBCQ01fRkxEX0hPU1RfREVCVUdfVkFMVUVTIHN0YXQpOworLyoqCisqIFxicmllZiBDaGVjayBpZiBzd2FwIG5lZWRlZCBmb3IgdGhlIHJlc3BlY3RpdmUgbWVtb3J5CisqCisqIFxwYXJhbVtpbl0gZGV2aWNlIElkZW50aWZpZXMgdGhlIGRldmljZQorKgorKiBccmV0dXJuCisqIHRydWUgaWYgc3dhcCBuZWVkZWQsIGZhbHNlIGlmIHN3YXAgbm90IG5lZWRlZAorKi8KK2JjbW9zX2Jvb2wgYmNtX2ZsZF9yZWdzX3N3YXBfbmVlZGVkKHVpbnQzMl90IGRldmljZSk7CitiY21vc19ib29sIGJjbV9mbGRfc3JhbV9zd2FwX25lZWRlZCh1aW50MzJfdCBkZXZpY2UpOworYmNtb3NfYm9vbCBiY21fZmxkX2Rkcl9zd2FwX25lZWRlZCh1aW50MzJfdCBkZXZpY2UpOworCitiY21vc19lcnJubyBiY21fZmxkX3NldF9hdnNfY29udCh1aW50MzJfdCBkZXZpY2UsIHVpbnQzMl90IHZhbHVlKTsKKwordm9pZCAqYmNtX2ZsZF9nZXRfc3dfZXJyb3JfdGFibGUodWludDMyX3QgZGV2aWNlLCB1aW50MzJfdCAqc2l6ZSk7Cit1aW50MzJfdCBiY21fZmxkX2Rkcl90ZXN0X3Jlc3VsdF9nZXQodWludDMyX3QgZGV2aWNlLCB1aW50MzJfdCB3b3JkKTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9ob3N0X2FwaS9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9ob3N0X2FwaS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODllYzU2Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2hvc3RfYXBpL01ha2VmaWxlCkBAIC0wLDAgKzEsMTYgQEAKK01PRF9OQU1FID0gaG9zdF9hcGkKK01PRF9UWVBFID0gbGliCitNT0RfREVQUyA9IGRldl9sb2cgY29tbW9uX2dwb24gZGV2X2N0cmxfZGFlbW9uCisKK2lmZXEgKCIkKFJFTEVBU0VfQlVJTEQpIiwgInkiKQorICAgIE1PRF9ERVBTICs9IGNvbW1vbl9hcGkKK2Vsc2UKKyAgICBNT0RfREVQUyArPSBhcGkKK2VuZGlmCisKK2lmZXEgKCIkKEVOQUJMRV9DTEkpIiwgInkiKQorICAgIE1PRF9ERVBTICs9IGFwaV9jbGkgb3NfY2xpIGVtYmVkZGVkX2NsaQorZW5kaWYKKworc3JjcyA9IGJjbW9sdF9ob3N0X2FwaS5jCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9ob3N0X2FwaS9iY21vbHRfaG9zdF9hcGkuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9ob3N0X2FwaS9iY21vbHRfaG9zdF9hcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODhkM2MxCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2hvc3RfYXBpL2JjbW9sdF9ob3N0X2FwaS5jCkBAIC0wLDAgKzEsNzYgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisgCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaWYgIWRlZmluZWQoTElOVVhfVVNFUl9TUEFDRSkKKyNpbmNsdWRlIDxiY21vbHRfZGV2X2N0cmwuaD4KKyNlbHNlCitiY21vc19lcnJubyBiY21vbHRfZGV2X2N0cmxfaW5pdCh2b2lkKTsKKyNlbmRpZgorI2luY2x1ZGUgPGJjbV9kZXZfbG9nLmg+CisjaW5jbHVkZSAiYmNtb2x0X2hvc3RfYXBpLmgiCisKK2JjbW9zX2Vycm5vIGJjbW9sdF9ob3N0X2luaXQoYmNtb2x0X2hvc3RfaW5pdF9wYXJhbXMgKnBhcmFtcykKK3sKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIHJjID0gYmNtb3NfaW5pdCgpOworICAgIEJVR19PTihyYyk7CisKKyNpZmRlZiBFTkFCTEVfTE9HCisgICAgaWYgKHBhcmFtcy0+bG9nZ2VyX2luaXRfY2IpCisgICAgeworICAgICAgICByYyA9IHBhcmFtcy0+bG9nZ2VyX2luaXRfY2IoKTsKKyAgICAgICAgQlVHX09OKHJjKTsKKyAgICB9CisjZW5kaWYKKworICAgIGJjbW9zX3RyYWNlX2xldmVsX3NldChCQ01PU19UUkFDRV9MRVZFTF9FUlJPUik7CisKKyAgICAvKiBJbiB1c2VybW9kZSBMaW51eCwgd2UgZG9uJ3QgaW52b2tlIGJjbW9sdF9kZXZfY3RybF9pbml0KCkgZnJvbSB0aGUgYXBwbGljYXRpb24sIGJ1dCBmcm9tIGEga2VybmVsIG1vZHVsZSAoYmNtX2Rldl9jdHJsX2xpbnV4LmtvKS4gKi8KKyNpZiAhZGVmaW5lZChMSU5VWF9VU0VSX1NQQUNFKQorICAgIHJjID0gYmNtb2x0X2Rldl9jdHJsX2luaXQoJnBhcmFtcy0+ZGV2X2N0cmxfcGFyYW1zKTsKKyAgICBCVUdfT04ocmMpOworI2Vsc2UKKyAgICBpZiAocGFyYW1zLT5ydW5fZGV2X2N0cmwpCisgICAgeworICAgICAgICByYyA9IGJjbW9sdF9kZXZfY3RybF9pbml0KCk7CisgICAgICAgIEJVR19PTihyYyk7CisgICAgfQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfX0tFUk5FTF9fKQorICAgIC8qIEluaXRpYWxpemUgdHJhbnNwb3J0IGxheWVyLiAqLworICAgIHJjID0gYmNtdHJfaW5pdCgpOworICAgIEJVR19PTihyYyk7CisjZW5kaWYKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvaG9zdF9hcGkvYmNtb2x0X2hvc3RfYXBpLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvaG9zdF9hcGkvYmNtb2x0X2hvc3RfYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdhY2Q2MQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9ob3N0X2FwaS9iY21vbHRfaG9zdF9hcGkuaApAQCAtMCwwICsxLDc1IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaWZuZGVmIF9CQ01PTFRfSE9TVF9BUElfSF8KKyNkZWZpbmUgX0JDTU9MVF9IT1NUX0FQSV9IXworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtb2x0X21vZGVsX3R5cGVzLmg+CisKKyNpZiAhZGVmaW5lZChfX0tFUk5FTF9fKQorI2luY2x1ZGUgPGJjbXRyX2RlYnVnLmg+CisjaW5jbHVkZSA8YmNtdHJfaW50ZXJmYWNlLmg+CisjaW5jbHVkZSAiYmNtb2x0X2FwaS5oIgorI2luY2x1ZGUgPGJjbV9jb21tb25fZ3Bvbi5oPgorI2luY2x1ZGUgPGJjbW9sdF9ob3N0X2FwaV9ncG9uX3V0aWxzLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQoRU5BQkxFX0NMSSkgJiYgIWRlZmluZWQoX19LRVJORUxfXykKKyNpbmNsdWRlIDxiY21fYXBpX2NsaS5oPgorI2luY2x1ZGUgPGJjbW9zX2NsaS5oPgorI2luY2x1ZGUgPGJjbW9sdF9lbWJlZGRlZF9jbGkuaD4KKyNpbmNsdWRlIDxiY210cl90cmFuc3BvcnRfY2xpLmg+CisjaW5jbHVkZSA8YmNtX2FwaV9jbGlfaGVscGVycy5oPgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChMSU5VWF9VU0VSX1NQQUNFKQorI2luY2x1ZGUgPGJjbW9sdF9kZXZfY3RybC5oPgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChMSU5VWF9VU0VSX1NQQUNFKQordHlwZWRlZiBiY21vbHRfZGV2X2N0cmxfY2JfaW1hZ2VfcmVhZCBiY21vbHRfaG9zdF9pbWFnZV9yZWFkX2NiOworI2VuZGlmCit0eXBlZGVmIGJjbW9zX2Vycm5vICgqYmNtb2x0X2hvc3RfbG9nZ2VyX2luaXRfY2IpKHZvaWQpOworCit0eXBlZGVmIHN0cnVjdAoreworI2lmICFkZWZpbmVkKExJTlVYX1VTRVJfU1BBQ0UpCisgICAgYmNtb2x0X2Rldl9jdHJsX3BhcmFtcyBkZXZfY3RybF9wYXJhbXM7CisjZW5kaWYKKyAgICAvKiBUaGlzIGNhbGxiYWNrIGluaXRpYWxpemVzIHRoZSBsb2dnZXIgbW9kdWxlLiBJZiB1c2luZyBjb21tb24vZGV2X2xvZyBtb2R1bGUsIGl0IHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgT1MgYWJzdHJhY3Rpb24gbGF5ZXIgaXMgaW5pdGlhbGl6ZWQsIGFuZCB0aGF0J3Mgd2h5CisgICAgICogaXQgaXMgYSBjYWxsYmFjayBhbmQgbm90IGRpcmVjdGx5IGluaXRpYWxpemVkIGJ5IHRoZSBjYWxsZXIuICovCisgICAgYmNtb2x0X2hvc3RfbG9nZ2VyX2luaXRfY2IgbG9nZ2VyX2luaXRfY2I7CisgICAgYmNtb3NfYm9vbCBydW5fZGV2X2N0cmw7Cit9IGJjbW9sdF9ob3N0X2luaXRfcGFyYW1zOworCitiY21vc19lcnJubyBiY21vbHRfaG9zdF9pbml0KGJjbW9sdF9ob3N0X2luaXRfcGFyYW1zICpwYXJhbXMpOworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2hvc3RfYXBpL2JjbW9sdF9ob3N0X2FwaV9ncG9uX3V0aWxzLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvaG9zdF9hcGkvYmNtb2x0X2hvc3RfYXBpX2dwb25fdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Njc2NDAwCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2hvc3RfYXBpL2JjbW9sdF9ob3N0X2FwaV9ncG9uX3V0aWxzLmgKQEAgLTAsMCArMSw0MiBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBfQkNNT0xUX0hPU1RfQVBJX0dQT05fVVRJTFNfSF8KKyNkZWZpbmUgX0JDTU9MVF9IT1NUX0FQSV9HUE9OX1VUSUxTX0hfCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21fY29tbW9uX2dwb24uaD4KKworLyogTm90ZSB0aGF0IFBPTnMgNC03IGFyZSBub3QgdXNlZCBpbiBHUE9OL1hHUE9OIGNvZXhpc3RlbmNlIG1vZGUuICovCisjZGVmaW5lIEZPUl9FQUNIX1BPTihwb25fbmkpXAorICAgIGZvciAocG9uX25pID0gKGJjbW9sdF9wb25fbmkpMDtcCisgICAgICAgICBwb25fbmkgPCAoYmNtb2x0X3Bvbl9uaSlzbWRiZy0+bnVtX29mX3BvbnM7XAorICAgICAgICAgKChiY21fY29tbW9uX2dwb25fZ2V0X3N5c3RlbV9tb2RlKCkgPT0gQkNNT0xUX1NZU1RFTV9NT0RFX0dQT05fOF9YR1BPTl80X1hfQ09FWElTVEVOQ0UgJiYgcG9uX25pID09IFhHUE9OX0hBTEZfQ0hJUF9NQVhfTlVNX09GX1BPTlMtMSkgPyBwb25fbmkgPSBYR1BPTl9NQVhfTlVNX09GX1BPTlMgOiBwb25fbmkrKykpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2hvc3RfYXBpL3VzZXIvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvaG9zdF9hcGkvdXNlci9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41YjViYWViCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2hvc3RfYXBpL3VzZXIvTWFrZWZpbGUKQEAgLTAsMCArMSwxOSBAQAorCitNT0RfTkFNRSA9IGhvc3RfYXBpX3VzZXIKK01PRF9UWVBFID0gbGliCitNT0RfREVQUyA9IGRldl9sb2cgY29tbW9uX2dwb24gZGV2X2N0cmxfZGFlbW9uIGhvc3RfYXBpCisKK2lmZXEgKCIkKFJFTEVBU0VfQlVJTEQpIiwgInkiKQorICAgIE1PRF9ERVBTICs9IGNvbW1vbl9hcGkKK2Vsc2UKKyAgICBNT0RfREVQUyArPSBhcGkKK2VuZGlmCisKK2lmZXEgKCIkKEVOQUJMRV9DTEkpIiwgInkiKQorICAgIE1PRF9ERVBTICs9IGFwaV9jbGkgb3NfY2xpIGVtYmVkZGVkX2NsaQorZW5kaWYKKworTU9EX0RFRlMgKz0gLURJTl9CQU5ECisKK3NyY3MgPSAuLi9iY21vbHRfaG9zdF9hcGkuYworCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIva2VlcF9hbGl2ZS9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9rZWVwX2FsaXZlL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMDJmMWEKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIva2VlcF9hbGl2ZS9NYWtlZmlsZQpAQCAtMCwwICsxLDIwIEBACisjIENvbW1vbiBrZWVwX2FsaXZlCisjCitNT0RfTkFNRSA9IGtlZXBfYWxpdmUKKworaWZlcSAoIiQoT1NfS0VSTkVMKSIsICJsaW51eCIpCitNT0RfVFlQRSA9IGxpbnV4X2xpYgorZWxzZQorTU9EX1RZUEUgPSBsaWIKK2VuZGlmCisKK01PRF9ERVBTID0gbW9kZWwgICAKKworc3JjcyA9IGJjbV9rZWVwX2FsaXZlLmMKKwkgCisjIElmIGNhbGxlZCBieSBsaW51eCBrZXJuZWwgYnVpbGRlciAtIGFkZCBpbmNsdWRlIHBhdGhzIG1hbnVhbGx5LgorIyBJdCBpcyBub3QgZWxlZ2FudCwgYnV0IHdlJ2xsIG5vdCBoYXZlIG1hbnkgbGludXggbW9kdWxlcworaWZuZXEgKCIkKEtCVUlMRF9TUkMpIiwgIiIpCisJLWluY2x1ZGUgJChPVVRfRElSX0JBU0UpL01ha2VmaWxlLmNvbmZpZy4kKE1PRF9OQU1FKQorZW5kaWYKK1VTRV9MSU5UID0geWVzCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIva2VlcF9hbGl2ZS9iY21fa2VlcF9hbGl2ZS5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2tlZXBfYWxpdmUvYmNtX2tlZXBfYWxpdmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODBmNjBlCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2tlZXBfYWxpdmUvYmNtX2tlZXBfYWxpdmUuYwpAQCAtMCwwICsxLDI0NSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbW9sdF9tc2cuaD4KKyNpbmNsdWRlIDxiY21vbHRfYXBpLmg+CisjaW5jbHVkZSA8YmNtb2x0X21vZGVsX3R5cGVzLmg+CisjaW5jbHVkZSA8YmNtb2x0X21vZGVsX2lkcy5oPgorI2luY2x1ZGUgImJjbV9rZWVwX2FsaXZlLmgiCisKK2tlZXBfYWxpdmVfbXNnX29yaWcyc3RyX3Qga2VlcF9hbGl2ZV9tc2dfb3JpZzJzdHJbXSA9Cit7CisgICAge0JDTV9LRUVQX0FMSVZFX01TR19PUklHX0RFVklDRSwgImRldmljZSJ9LAorICAgIHtCQ01fS0VFUF9BTElWRV9NU0dfT1JJR19IT1NULCAiaG9zdCJ9LAorICAgIHstMX0KK307CisKK3N0YXRpYyB2b2lkIGtlZXBfYWxpdmVfdHhfaGFuZGxlcihiY21vc19rZWVwX2FsaXZlX2luZm8gKmthX2luZm8pOworCitzdGF0aWMgYmNtb3NfdGltZXJfcmMga2VlcF9hbGl2ZV90aW1lcl9oYW5kbGVyKGJjbW9zX3RpbWVyICp0aW1lciwgbG9uZyBkYXRhKQoreworICAgIGJjbW9zX2tlZXBfYWxpdmVfaW5mbyAqa2FfaW5mbzsKKyAgICB1aW50MzJfdCAgbGFzdF9yZWN2X2thX3RzOworICAgIHVpbnQzMl90ICBrYV9pbnRlcnZhbDsKKyAgICB1aW50MzJfdCAga2FfdG9sZXJhbmNlOworICAgIHVpbnQzMl90ICB0aW1lX2RpZmZfZnJvbV9wcmV2X2thOworICAgIHVpbnQzMl90ICBrYV9wcm9jZXNzX3N0YXJ0X3RzOworICAgIHVpbnQzMl90ICBwcmV2X2thX3RzOworICAgIGthX2luZm8gPSAoYmNtb3Nfa2VlcF9hbGl2ZV9pbmZvICopZGF0YTsKKyAgICBsYXN0X3JlY3Zfa2FfdHMgPSBrYV9pbmZvLT5sYXN0X3JlY3Zfa2FfdGltZXN0YW1wOworICAgIGthX2ludGVydmFsID0ga2FfaW5mby0+a2FfaW50ZXJ2YWw7CisgICAga2FfdG9sZXJhbmNlID0ga2FfaW5mby0+a2FfdG9sZXJhbmNlOworICAgIGthX3Byb2Nlc3Nfc3RhcnRfdHMgPSBrYV9pbmZvLT5rYV9wcm9jZXNzX3N0YXJ0X3RzOworCisgICAgLyogVGhlIGZpcnN0IGtlZXAgYWxpdmUgbWVzc2FnZSB0aGF0IGFycml2ZXMgY2hhbmdlcyBsYXN0X3JlY3Zfa2FfdHMgdG8gYSB2YWx1ZSBkaWZmZXJlbnQgdGhhbiB6ZXJvLgorICAgICAqIElmIG5vIGtlZXAgYWxpdmUgbWVzc2FnZSBoYXMgYXJyaXZlZCB5ZXQgdGhlbiB0aGUgcHJldmlvdXMga2VlcCBhbGl2ZSB0aW1lIHN0YW1wIGlzIHRoZSB0aW1lIHRoZSBwcm9jZXNzIGhhcworICAgICAqIHN0YXJ0ZWQuICovCisgICAgcHJldl9rYV90cyA9IChsYXN0X3JlY3Zfa2FfdHMgPyBsYXN0X3JlY3Zfa2FfdHMgOiBrYV9wcm9jZXNzX3N0YXJ0X3RzKTsKKworICAgIC8qIFRpbWUgZGlmZmVyZW5jZSBiZXR3ZWVuIGN1cnJlbnQgdGltZSBhbmQgdGhlIHByZXZpb3VzIGtlZXAgYWxpdmUgbWVzc2FnZSAqLworICAgIHRpbWVfZGlmZl9mcm9tX3ByZXZfa2EgPSBiY21vc190aW1lc3RhbXAoKSAtIHByZXZfa2FfdHM7CisKKyAgICAvKiBDaGVjayBpZiBrZWVwIGFsaXZlIG1lc3NhZ2UgaGFzIGJlZW4gcmVjZWl2ZWQgaW4gdGhlIHBhc3Qga2VlcCBhbGl2ZSBpbnRlcnZhbCwgYm90aCBwYXJ0IG9mIHRoZSBlcXVhdGlvbiBjYW4ndCBvdmVyZmxvdzoKKyAgICAgKiBUaGUgbGVmdCBwYXJ0IGlzIHN1YnRyYWN0aW9uIG9mIHR3byB1bnNpZ25lZCBpbnRlZ2VycyBhbmQgdGhlIHJpZ2h0IHBhcnQgaXMgcmVzdHJpY3RlZCBieSBrYV9pbnRlcnZhbCBtYXggdmFsdWUgYW5kIGthX3RvbGVyYW5jZSBtYXggdmFsdWUgLQorICAgICAqIHRoZWlyIG11bHRpcGxpY2F0aW9uIGNhbid0IGV4Y2VlZCBtYXggdW5zaWduZWQgaW50ZWdlciAqLworICAgIGlmICh0aW1lX2RpZmZfZnJvbV9wcmV2X2thID4ga2FfaW50ZXJ2YWwgKiAoa2FfdG9sZXJhbmNlICsgMSkpCisgICAgeworICAgICAgICBpZiAobGFzdF9yZWN2X2thX3RzKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PU19UUkFDRV9JTkZPKAorICAgICAgICAgICAgICAgICJEaWRuJ3QgcmVjZWl2ZSBrZWVwIGFsaXZlIG1lc3NhZ2UgZm9yICV1IHNlY29uZHMgLSBhYm91dCB0byBkaXNjb25uZWN0XG4iLAorICAgICAgICAgICAgICAgIChiY21vc190aW1lc3RhbXAoKSAtIGxhc3RfcmVjdl9rYV90cykgLyBCQ01PU19NSUNST1NFQ09ORFNfSU5fU0VDT05EUyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PU19UUkFDRV9JTkZPKAorICAgICAgICAgICAgICAgICJEaWRuJ3QgcmVjZWl2ZSBrZWVwIGFsaXZlIG1lc3NhZ2Ugc2luY2Uga2VlcCBhbGl2ZSBwcm9jZXNzIHN0YXJ0ZWQgJXUgc2Vjb25kcyBhZ28gLSAiCisgICAgICAgICAgICAgICAgICAgICJhYm91dCB0byBkaXNjb25uZWN0XG4iLAorICAgICAgICAgICAgICAgIChiY21vc190aW1lc3RhbXAoKSAtIGthX3Byb2Nlc3Nfc3RhcnRfdHMpIC8gQkNNT1NfTUlDUk9TRUNPTkRTX0lOX1NFQ09ORFMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGthX2luZm8tPmRpc2Nvbm5lY3RfaGFuZGxlcihrYV9pbmZvLT5kZXZpY2UpICE9IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChrYV9pbmZvLT5vcmlnID09IEJDTV9LRUVQX0FMSVZFX01TR19PUklHX0hPU1QpCisgICAgICAgICAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJFcnJvciB3aGlsZSB0cnlpbmcgdG8gc2VuZCBkaXNjb25uZWN0IG1lc3NhZ2UgKGRldmljZT0lZClcbiIsIGthX2luZm8tPmRldmljZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJFcnJvciB3aGlsZSB0cnlpbmcgdG8gaW52b2tlIGRpc2Nvbm5lY3QgZnJvbSB0aGUgaG9zdCBwcm9jZWR1cmVcbiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBCQ01PU19USU1FUl9TVE9QOworICAgIH0KKworICAgIC8qIFNlbmQgS2VlcCBhbGl2ZSBtZXNzYWdlIHRvIHRoZSByZW1vdGUgc2lkZSAqLworICAgIGtlZXBfYWxpdmVfdHhfaGFuZGxlcihrYV9pbmZvKTsKKworICAgIHJldHVybiBCQ01PU19USU1FUl9PSzsKK30KKworc3RhdGljIHZvaWQga2VlcF9hbGl2ZV90eF9oYW5kbGVyKGJjbW9zX2tlZXBfYWxpdmVfaW5mbyAqa2FfaW5mbykKK3sKKyAgICBiY21vc19rZWVwX2FsaXZlX21zZyBrYV9tc2cgPSB7fTsKKyAgICBiY21vbHRfZGV2aWNlX2tleSBrZXkgPSB7fTsKKyAgICBpZiAoa2FfaW5mby0+b3JpZyA9PSBCQ01fS0VFUF9BTElWRV9NU0dfT1JJR19IT1NUKQorICAgIHsKKyAgICAgICAgQkNNT0xUX09QRVJfSU5JVCgma2FfbXNnLmhvc3QsIGRldmljZSwgaG9zdF9rZWVwX2FsaXZlLCBrZXkpOworICAgICAgICBrYV9tc2cuaG9zdC5oZHIuaGRyLnR5cGUgPSBCQ01PTFRfTVNHX1RZUEVfU0VUOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgma2FfbXNnLmhvc3QsIGRldmljZSwgaG9zdF9rZWVwX2FsaXZlLCBzZXF1ZW5jZV9udW1iZXIsIGthX2luZm8tPmxhc3Rfc2VudF9rYV9zZXErKyk7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZrYV9tc2cuaG9zdCwgZGV2aWNlLCBob3N0X2tlZXBfYWxpdmUsIHRpbWVfc3RhbXAsIGJjbW9zX3RpbWVzdGFtcCgpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQkNNT0xUX0FVVE9fSU5JVCgma2FfbXNnLmRldmljZSwgZGV2aWNlLCBkZXZpY2Vfa2VlcF9hbGl2ZSk7CisgICAgICAgIGthX21zZy5kZXZpY2UuaGRyLmhkci50eXBlID0gQkNNT0xUX01TR19UWVBFX1NFVDsKKyAgICAgICAga2FfbXNnLmRldmljZS5kYXRhLnNlcXVlbmNlX251bWJlciA9IGthX2luZm8tPmxhc3Rfc2VudF9rYV9zZXErKzsKKyAgICAgICAga2FfbXNnLmRldmljZS5kYXRhLnRpbWVfc3RhbXAgPSBiY21vc190aW1lc3RhbXAoKTsKKyAgICB9CisKKyAgICBpZiAoa2FfaW5mby0+c2VuZF9oYW5kbGVyKGthX2luZm8tPmRldmljZSwgKGJjbW9sdF9tc2cgKikma2FfbXNnKSAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfSU5GTygiRXJyb3Igd2hpbGUgdHJ5aW5nIHRvIHNlbmQga2VlcCBhbGl2ZSBzZXF1ZW5jZSBudW1iZXIgJXVcbiIsIGthX2luZm8tPmxhc3Rfc2VudF9rYV9zZXEpOworICAgIH0KK30KKwordm9pZCBrZWVwX2FsaXZlX3J4X2hhbmRsZXIoY29uc3QgYmNtb3Nfa2VlcF9hbGl2ZV9kYXRhX21zZyAqa2FfZGF0YV9tc2csIGJjbW9zX2tlZXBfYWxpdmVfaW5mbyAqa2FfaW5mbykKK3sKKyAgICB1aW50MzJfdCBzZXFfZGlmZjsKKyAgICB1aW50MzJfdCByeF9tc2dfc2VxOworICAgIHVpbnQzMl90IHJ4X21zZ190czsKKworICAgIC8qIFRyaWNreSBwYXJ0IC0gcnhfbXNnX3NlcSBpcyBOT1QgZnJvbSB0aGUgb3JpZ2luYXRvciBidXQgZnJvbSB0aGUgb3RoZXIgc2lkZSAqLworICAgIGlmIChrYV9pbmZvLT5vcmlnID09IEJDTV9LRUVQX0FMSVZFX01TR19PUklHX0hPU1QpCisgICAgeworICAgICAgICByeF9tc2dfc2VxID0ga2FfZGF0YV9tc2ctPmRldmljZS5zZXF1ZW5jZV9udW1iZXI7CisgICAgICAgIHJ4X21zZ190cyA9IGthX2RhdGFfbXNnLT5kZXZpY2UudGltZV9zdGFtcDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcnhfbXNnX3NlcSA9IGthX2RhdGFfbXNnLT5ob3N0LnNlcXVlbmNlX251bWJlcjsKKyAgICAgICAgcnhfbXNnX3RzID0ga2FfZGF0YV9tc2ctPmhvc3QudGltZV9zdGFtcDsKKyAgICB9CisKKyAgICAvKiBJZiBsYXN0X3JlY3Zfa2Ffc2VxIGFuZCBsYXN0X3JlY3Zfa2FfdGltZXN0YW1wIGFyZSBib3RoIHplcm9zIHRoZW4gaXQncyB0aGUgZmlyc3QgbWVzc2FnZSAqLworICAgIGlmIChrYV9pbmZvLT5sYXN0X3JlY3Zfa2Ffc2VxIHx8IGthX2luZm8tPmxhc3RfcmVjdl9rYV90aW1lc3RhbXApCisgICAgeworICAgICAgICAvKiBBbGwgcGFydCBvZiB0aGUgZXF1YXRpb24gYXJlIHVuc2lnbmVkIGludGVnZXJzIHNvIHdhcnAgYXJvdW5kIGlzIGFscmVhZHkgdGFrZW4gY2FyZSBvZiAqLworICAgICAgICBzZXFfZGlmZiA9IHJ4X21zZ19zZXEgLSBrYV9pbmZvLT5sYXN0X3JlY3Zfa2Ffc2VxOworCisgICAgICAgIC8qIEluIHRoZSBub3JtYWwgY2FzZSBzZXFfZGlmZiBzaG91bGQgYmUgb25lICovCisgICAgICAgIGlmIChzZXFfZGlmZiA+IDFVTCkKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT1NfVFJBQ0VfSU5GTygKKyAgICAgICAgICAgICAgICAiQ3VycmVudCBrZWVwIGFsaXZlIHNlcXVlbmNlIG51bWJlciBpcyAldSB3aGlsZSBwcmV2aW91cyBrZWVwIGFsaXZlIHNlcXVlbmNlIG51bWJlciB3YXMgJXVcbiIsCisgICAgICAgICAgICAgICAgcnhfbXNnX3NlcSwKKyAgICAgICAgICAgICAgICBrYV9pbmZvLT5sYXN0X3JlY3Zfa2Ffc2VxKTsKKyAgICAgICAgICAgIEJDTU9TX1RSQUNFX0lORk8oCisgICAgICAgICAgICAgICAgIkN1cnJlbnQgdGltZSBzdGFtcCBpcyAldSB3aGlsZSBwcmV2aW91cyB0aW1lIHN0YW1wIHdhcyAldSwgcmVjZWl2ZSB0aW1lc3RhbXAgaXMgJXVcbiIsCisgICAgICAgICAgICAgICAgYmNtb3NfdGltZXN0YW1wKCksCisgICAgICAgICAgICAgICAga2FfaW5mby0+bGFzdF9yZWN2X2thX3RpbWVzdGFtcCxyeF9tc2dfdHMpOworICAgICAgICAgICAgaWYgKHNlcV9kaWZmIDw9IGthX2luZm8tPmthX3RvbGVyYW5jZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01PU19UUkFDRV9JTkZPKAorICAgICAgICAgICAgICAgICAgICAiTWlzc2VkICV1IGtlZXAgYWxpdmUgbWVzc2FnZXMgKGtlZXAgYWxpdmUgdG9sZXJhbmNlIGlzIHRvIGxvc2UgJWQgbWVzc2FnZXMpXG4iLAorICAgICAgICAgICAgICAgICAgICBzZXFfZGlmZiwKKyAgICAgICAgICAgICAgICAgICAga2FfaW5mby0+a2FfdG9sZXJhbmNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01PU19UUkFDRV9FUlIoCisgICAgICAgICAgICAgICAgICAgICJNaXNzZWQgJXUga2VlcCBhbGl2ZSBtZXNzYWdlcyAoa2VlcCBhbGl2ZSB0b2xlcmFuY2UgaXMgdG8gbG9zZSAlZCBtZXNzYWdlcyAtICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJhYm91dCB0byBkaXNjb25uZWN0KVxuIiwKKyAgICAgICAgICAgICAgICAgICAgc2VxX2RpZmYsCisgICAgICAgICAgICAgICAgICAgIGthX2luZm8tPmthX3RvbGVyYW5jZSk7CisgICAgICAgICAgICAgICAgc3RvcF9rZWVwX2FsaXZlX3Byb2Nlc3Moa2FfaW5mbyk7CisgICAgICAgICAgICAgICAgaWYgKGthX2luZm8tPmRpc2Nvbm5lY3RfaGFuZGxlcihrYV9pbmZvLT5kZXZpY2UpICE9IEJDTV9FUlJfT0spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoa2FfaW5mby0+b3JpZyA9PSBCQ01fS0VFUF9BTElWRV9NU0dfT1JJR19IT1NUKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBCQ01PU19UUkFDRV9FUlIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHdoaWxlIHRyeWluZyB0byBzZW5kIGRpc2Nvbm5lY3QgbWVzc2FnZSAoZGV2aWNlPSVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrYV9pbmZvLT5kZXZpY2UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJFcnJvciB3aGlsZSB0cnlpbmcgdG8gc2VuZCBkaXNjb25uZWN0IGZyb20gdGhlIGhvc3QgbWVzc2FnZVxuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisJLyogU3Ryb2UgYXQgdGhlIHJlY2lldmluZyBzaWRlJ3MgZGF0YWJhc2UsIHRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIGxhc3QgbWVzc2FnZSB0aGF0IGNhbWUgICovCisgICAga2FfaW5mby0+bGFzdF9yZWN2X2thX3NlcSA9IHJ4X21zZ19zZXE7CisKKyAgICAvKiBUaGUgdGltZSBzdGFtcCBpcyB0YWtlbiBmcm9tIHRoZSBjbG9jayBhdCB0aGUgcmVjZWl2aW5nIHNpZGUgLCBub3Qgd2hhdCBjYW1lIGluIHRoZSBtZXNzYWdlICovCisgICAga2FfaW5mby0+bGFzdF9yZWN2X2thX3RpbWVzdGFtcCA9IGJjbW9zX3RpbWVzdGFtcCgpOworfQorCitiY21vc19lcnJubyBjcmVhdGVfa2VlcF9hbGl2ZV90aW1lcihiY21vc19rZWVwX2FsaXZlX2luZm8gKmthX2luZm8sIGJjbW9zX21vZHVsZV9pZCBtb2R1bGVfaWQpCit7CisgICAgYmNtb3NfdGltZXJfcGFybSB0aW1lcl9wYXJhbXMgPSB7fTsKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAga2FfaW5mby0+bGFzdF9yZWN2X2thX3RpbWVzdGFtcCA9IDA7CisgICAga2FfaW5mby0+bGFzdF9yZWN2X2thX3NlcSA9IDA7CisKKyAgICBzbnByaW50ZihrYV9pbmZvLT5rYV90aW1lci5uYW1lLCBzaXplb2Yoa2FfaW5mby0+a2FfdGltZXIubmFtZSksICJrZWVwX2FsaXZlX3QldSIsIGthX2luZm8tPmRldmljZSk7CisgICAgdGltZXJfcGFyYW1zLm5hbWUgPSBrYV9pbmZvLT5rYV90aW1lci5uYW1lOworICAgIHRpbWVyX3BhcmFtcy5vd25lciA9IG1vZHVsZV9pZDsKKyAgICB0aW1lcl9wYXJhbXMucGVyaW9kaWMgPSBCQ01PU19UUlVFOworICAgIHRpbWVyX3BhcmFtcy5oYW5kbGVyID0ga2VlcF9hbGl2ZV90aW1lcl9oYW5kbGVyOworICAgIHRpbWVyX3BhcmFtcy5kYXRhID0gKGxvbmcpa2FfaW5mbzsKKyAgICByYyA9IGJjbW9zX3RpbWVyX2NyZWF0ZSgma2FfaW5mby0+a2FfdGltZXIudGltZXIsICZ0aW1lcl9wYXJhbXMpOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKAorICAgICAgICAgICAgImtlZXAgYWxpdmUgdGltZXIgY3JlYXRpb24gZmFpbGVkLCBiY21vc190aW1lcl9jcmVhdGUgcmV0dXJuZWQgZXJyb3IgJXMgKCVkKVxuIiwKKyAgICAgICAgICAgIGJjbW9zX3N0cmVycm9yKHJjKSwKKyAgICAgICAgICAgIHJjKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCit2b2lkIHN0YXJ0X2tlZXBfYWxpdmVfcHJvY2VzcyhiY21vc19rZWVwX2FsaXZlX2luZm8gKmthX2luZm8pCit7CisgICAga2FfaW5mby0+bGFzdF9yZWN2X2thX3RpbWVzdGFtcCA9IDA7CisgICAga2FfaW5mby0+bGFzdF9yZWN2X2thX3NlcSA9IDA7CisgICAga2FfaW5mby0+a2FfcHJvY2Vzc19zdGFydF90cyA9IGJjbW9zX3RpbWVzdGFtcCgpOworICAgIGJjbW9zX3RpbWVyX3N0YXJ0KCZrYV9pbmZvLT5rYV90aW1lci50aW1lciwga2FfaW5mby0+a2FfaW50ZXJ2YWwpOworfQorCit2b2lkIHN0b3Bfa2VlcF9hbGl2ZV9wcm9jZXNzKGJjbW9zX2tlZXBfYWxpdmVfaW5mbyAqa2FfaW5mbykKK3sKKyAgICBiY21vc190aW1lcl9zdG9wKCZrYV9pbmZvLT5rYV90aW1lci50aW1lcik7Cit9CisKKyNpZmRlZiBfX0tFUk5FTF9fCitFWFBPUlRfU1lNQk9MKGNyZWF0ZV9rZWVwX2FsaXZlX3RpbWVyKTsKK0VYUE9SVF9TWU1CT0woa2VlcF9hbGl2ZV9yeF9oYW5kbGVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJCQ00gZGV2aWNlIGtlZXAtYWxpdmUgc3VwcG9ydCIpOworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworI2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIva2VlcF9hbGl2ZS9iY21fa2VlcF9hbGl2ZS5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2tlZXBfYWxpdmUvYmNtX2tlZXBfYWxpdmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzc5ZGRkCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2tlZXBfYWxpdmUvYmNtX2tlZXBfYWxpdmUuaApAQCAtMCwwICsxLDg2IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaWZuZGVmIEJDTV9LRUVQX0FMSVZFX0hfCisjZGVmaW5lIEJDTV9LRUVQX0FMSVZFX0hfCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21vbHRfY29udi5oPgorCisvKiBNZXNzYWdlIG9yaWdpbmF0b3IgOiBkZXZpY2UgIG9yIGhvc3QgKi8KK3R5cGVkZWYgZW51bQoreworICAgIEJDTV9LRUVQX0FMSVZFX01TR19PUklHX0RFVklDRSwKKyAgICBCQ01fS0VFUF9BTElWRV9NU0dfT1JJR19IT1NULAorfSBrZWVwX2FsaXZlX21zZ19vcmlnOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGNoYXIgbmFtZVtNQVhfVElNRVJfTkFNRV9TSVpFXTsKKyAgICBiY21vc190aW1lciB0aW1lcjsKK30ga2VlcF9hbGl2ZV90aW1lcjsKKwordHlwZWRlZiBiY21vc19lcnJubyAoKkZfYmNtb3Nfa2VlcF9hbGl2ZV9zZW5kX2hhbmRsZXIpKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9tc2cgKm1zZyk7Cit0eXBlZGVmIGJjbW9zX2Vycm5vICgqRl9iY21vc19rZWVwX2FsaXZlX2Rpc2Nvbm5lY3RfaGFuZGxlcikoYmNtb2x0X2RldmlkIGRldmljZSk7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDMyX3QgbGFzdF9zZW50X2thX3NlcTsKKyAgICB1aW50MzJfdCBsYXN0X3JlY3Zfa2Ffc2VxOworICAgIHVpbnQzMl90IGxhc3RfcmVjdl9rYV90aW1lc3RhbXA7CisgICAgdWludDMyX3Qga2FfcHJvY2Vzc19zdGFydF90czsKKyAgICB1aW50MzJfdCBrYV9pbnRlcnZhbDsKKyAgICB1aW50MzJfdCBrYV90b2xlcmFuY2U7CisgICAga2VlcF9hbGl2ZV9tc2dfb3JpZyBvcmlnOworICAgIGJjbW9sdF9kZXZpZCBkZXZpY2U7CisgICAga2VlcF9hbGl2ZV90aW1lciBrYV90aW1lcjsKKyAgICBGX2JjbW9zX2tlZXBfYWxpdmVfZGlzY29ubmVjdF9oYW5kbGVyIGRpc2Nvbm5lY3RfaGFuZGxlcjsKKyAgICBGX2JjbW9zX2tlZXBfYWxpdmVfc2VuZF9oYW5kbGVyIHNlbmRfaGFuZGxlcjsKK30gYmNtb3Nfa2VlcF9hbGl2ZV9pbmZvOworCit0eXBlZGVmIHVuaW9uCit7CisgICAgYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZSBkZXZpY2U7ICAvKio8IEtlZXAgYWxpdmUgbWVzc2FnZSBvcmlnaW5hdGVkIGF0IHRoZSBEZXZpY2UgKi8KKyAgICBiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZSBob3N0OyAgICAgIC8qKjwgS2VlcCBhbGl2ZSBtZXNzYWdlIG9yaWdpbmF0ZWQgYXQgdGhlIEhvc3QgKi8KK30gYmNtb3Nfa2VlcF9hbGl2ZV9tc2c7CisKK3R5cGVkZWYgdW5pb24KK3sKKyAgICBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGEgZGV2aWNlOyAgLyoqPCBLZWVwIGFsaXZlIG1lc3NhZ2Ugb3JpZ2luYXRlZCBhdCB0aGUgRGV2aWNlICovCisgICAgYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfZGF0YSBob3N0OyAgICAgIC8qKjwgS2VlcCBhbGl2ZSBtZXNzYWdlIG9yaWdpbmF0ZWQgYXQgdGhlIEhvc3QgKi8KK30gYmNtb3Nfa2VlcF9hbGl2ZV9kYXRhX21zZzsKKworQkNNT0xUX1RZUEUyU1RSKGtlZXBfYWxpdmVfbXNnX29yaWcsIGV4dGVybikKKwordm9pZCBrZWVwX2FsaXZlX3J4X2hhbmRsZXIoY29uc3QgYmNtb3Nfa2VlcF9hbGl2ZV9kYXRhX21zZyAqa2FfZGF0YV9tc2csIGJjbW9zX2tlZXBfYWxpdmVfaW5mbyAqa2FfaW5mbyk7CitiY21vc19lcnJubyBjcmVhdGVfa2VlcF9hbGl2ZV90aW1lcihiY21vc19rZWVwX2FsaXZlX2luZm8gKmthX2luZm8sYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZCk7Cit2b2lkIHN0YXJ0X2tlZXBfYWxpdmVfcHJvY2VzcyhiY21vc19rZWVwX2FsaXZlX2luZm8gKmthX2luZm8pOwordm9pZCBzdG9wX2tlZXBfYWxpdmVfcHJvY2VzcyhiY21vc19rZWVwX2FsaXZlX2luZm8gKmthX2luZm8pOworCisjZW5kaWYgLyogQkNNX0tFRVBfQUxJVkVfSF8gKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9rZWVwX2FsaXZlL2RhZW1vbi9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9rZWVwX2FsaXZlL2RhZW1vbi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41ZWI3ZjZjCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL2tlZXBfYWxpdmUvZGFlbW9uL01ha2VmaWxlCkBAIC0wLDAgKzEsMTEgQEAKKyMgQ29tbW9uIGtlZXBfYWxpdmUKKyMKK01PRF9OQU1FID0ga2VlcF9hbGl2ZV9kYWVtb24KKworTU9EX1RZUEUgPSBsaWIKKworTU9EX0RFUFMgPSBtb2RlbCAgIAorCitzcmNzID0gLi4vYmNtX2tlZXBfYWxpdmUuYworCSAKK1VTRV9MSU5UID0geWVzCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvbWhfdXRpbHMvYmNtb2x0X21oX3V0aWxzLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvbWhfdXRpbHMvYmNtb2x0X21oX3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI1MmE0NQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9taF91dGlscy9iY21vbHRfbWhfdXRpbHMuaApAQCAtMCwwICsxLDE0OSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBfQkNNT0xUX01IX1VUSUxTX0hfCisjZGVmaW5lIF9CQ01PTFRfTUhfVVRJTFNfSF8KKworI2RlZmluZSBNSF9FWElUX0lGKGNvbmQsIGVycm9yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoY29uZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICgoZXJyb3IpICE9IEJDTV9FUlJfT0sgJiYgKGVycm9yKSAhPSBCQ01fRVJSX05PX01PUkUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQkNNT1NfVFJBQ0VfSU5GTygjY29uZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZXJyID0gKGVycm9yKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBnb3RvIGNsZWFudXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKEJDTU9TX0ZBTFNFKQorCisvKiBNYWNybyBmb3IgZGVjbGFyaW5nIGNmZ19nZXRfbXVsdGkgaGFuZGxlcnMsIHNpbmNlIHRoZSBmb3JtYXQgaXMgcGVyZmVjdGx5IHJlZ3VsYXIgKi8KKyNkZWZpbmUgTUhfREVDTEFSRV9DRkdfR0VUX01VTFRJKG9iaikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGJjbW9zX2Vycm5vIG1oXyMjb2JqIyNfY2ZnX2dldF9tdWx0aSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgYmNtb2x0XyMjb2JqIyNfY2ZnICpmaWx0ZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBiY21vbHRfZmlsdGVyX2ZsYWdzIGZsYWdzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBiY21vbHRfIyNvYmojI19jZmcgY2ZnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQ4X3QgKmZpbHRlcl9wYWNrZWQgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCAqbXNnX3BhY2tlZCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBiY21vc19lcnJubyBlcnI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJjbW9zX2Jvb2wgc3VjY2VzczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDMyX3QgbGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBiY21vbHRfYnVmIGJ1ZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJjbW9zX2Jvb2wgaXNfbWF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYmNtb2x0X21zZyBkdW1teV9oZHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBiY21vbHRfIyNvYmojI19rZXlfaWQgZHVtbXlfcHJvcF9pZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogYXNzdW1lIHdlIGRpZG4ndCBmaW5pc2ggYWxsIG9iamVjdHMgdW5sZXNzIHRvbGQgb3RoZXJ3aXNlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtc2dfc2V0LT5tb3JlID0gQkNNT1NfVFJVRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogc3RhcnQgd2l0aCB0aGUga2V5IGluY2x1ZGVkIGluIHRoZSBmaWx0ZXIgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAqKChiY21vbHRfIyNvYmojI19rZXkgKiltc2dfc2V0LT5uZXh0X2tleSkgPSBmaWx0ZXItPmtleTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogaWYgdGhlIGZpbHRlcidzIGtleSBjb250YWlucyBhbnkgd2lsZGNhcmRzLCBnZXQgdGhlIGZpcnN0IHJlYWwga2V5ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlcnIgPSBtaF8jI29iaiMjX2tleV9yZXNvbHZlX3dpbGRjYXJkcyhtc2dfc2V0LT5uZXh0X2tleSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE1IX0VYSVRfSUYoZXJyICE9IEJDTV9FUlJfT0ssIGVycik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBpZiB0aGUgaW5pdGlhbCBrZXkgaXMgaW52YWxpZCwgZXhpdCBlYXJseSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE1IX0VYSVRfSUYoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICFiY21vbHRfIyNvYmojI19rZXlfYm91bmRzX2NoZWNrKG1zZ19zZXQtPm5leHRfa2V5LCBCQ01PTFRfUFJFU0VOQ0VfTUFTS19BTEwsICZkdW1teV9wcm9wX2lkKSwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQkNNX0VSUl9LRVlfUkFOR0UpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVyciA9IG1oXyMjb2JqIyNfa2V5X3ZhbGlkYXRlKCZkdW1teV9oZHIsIG1zZ19zZXQtPm5leHRfa2V5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTUhfRVhJVF9JRihlcnIgIT0gQkNNX0VSUl9PSywgZXJyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIHBhY2sgZmlsdGVyIGRhdGEgKGluY2x1ZGluZyBwcmVzZW5jZSBtYXNrKSBmb3IgY29tcGFyaXNvbnMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbGVuID0gYmNtb2x0XyMjb2JqIyNfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoJmZpbHRlci0+ZGF0YSwgZmlsdGVyLT5oZHIuaGRyLnByZXNlbmNlX21hc2spOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmaWx0ZXJfcGFja2VkID0gYmNtb3NfY2FsbG9jKGxlbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE1IX0VYSVRfSUYobGVuID4gMCAmJiBmaWx0ZXJfcGFja2VkID09IE5VTEwsIEJDTV9FUlJfTk9NRU0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYmNtb2x0X2J1Zl9pbml0KCZidWYsIGxlbiwgZmlsdGVyX3BhY2tlZCwgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdWNjZXNzID0gYmNtb2x0XyMjb2JqIyNfY2ZnX2RhdGFfcGFjaygmZmlsdGVyLT5kYXRhLCAmYnVmLCBmaWx0ZXItPmhkci5oZHIucHJlc2VuY2VfbWFzayk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd2hpbGUgKG1zZ19zZXQtPm51bV9pbnN0YW5jZXMgPCBtc2dfc2V0LT5tYXhfaW5zdGFuY2VzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAvKiBpbml0aWFsaXplIHRoZSBjZmcgc3RydWN0dXJlIHdpdGggdGhlIGtleSBhbmQgcGFzcyBpdCB0byB0aGUgTUggY2ZnX2dldCBoYW5kbGVyICovICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBvYmosICooKGJjbW9sdF8jI29iaiMjX2tleSAqKW1zZ19zZXQtPm5leHRfa2V5KSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgLyogKGdldCBhbGwgcHJvcGVydGllcyB0aGF0IHdlcmUgcmVxdWVzdGVkIG9yIGFyZSBiZWluZyBmaWx0ZXJlZCBvbikgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjZmcuaGRyLmhkci5wcmVzZW5jZV9tYXNrID0gbXNnX3NldC0+cHJlc2VuY2VfbWFzayB8IGZpbHRlci0+aGRyLmhkci5wcmVzZW5jZV9tYXNrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNmZy5oZHIuaGRyLnR5cGUgPSBCQ01PTFRfTVNHX1RZUEVfR0VUOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2ZnLmhkci5oZHIuZGlyID0gQkNNT0xUX01TR19ESVJfUkVTUE9OU0U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjZmcuaGRyLmhkci5lcnIgPSBtaF8jI29iaiMjX2NmZ19nZXQoJmNmZy5oZHIuaGRyLCAmY2ZnLmtleSwgJmNmZy5kYXRhKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1IX0VYSVRfSUYoY2ZnLmhkci5oZHIuZXJyICE9IEJDTV9FUlJfT0ssIGNmZy5oZHIuaGRyLmVycik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAvKiBwYWNrIHRoZSByZXN1bHRpbmcgbWVzc2FnZSBkYXRhICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGxlbiA9IGJjbW9sdF8jI29iaiMjX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKCZjZmcuZGF0YSwgZmlsdGVyLT5oZHIuaGRyLnByZXNlbmNlX21hc2spOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbXNnX3BhY2tlZCA9IGJjbW9zX2NhbGxvYyhsZW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNSF9FWElUX0lGKGxlbiA+IDAgJiYgbXNnX3BhY2tlZCA9PSBOVUxMLCBCQ01fRVJSX05PTUVNKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJjbW9sdF9idWZfaW5pdCgmYnVmLCBsZW4sIG1zZ19wYWNrZWQsIEJDTU9MVF9CVUZfRU5ESUFOX0ZJWEVEKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3VjY2VzcyA9IGJjbW9sdF8jI29iaiMjX2NmZ19kYXRhX3BhY2soJmNmZy5kYXRhLCAmYnVmLCBmaWx0ZXItPmhkci5oZHIucHJlc2VuY2VfbWFzayk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNSF9FWElUX0lGKCFzdWNjZXNzLCBCQ01fRVJSX0lOVEVSTkFMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgLyogY2hlY2sgdGhlIHBhY2tlZCBtZXNzYWdlIGFnYWluc3QgdGhlIGZpbHRlciAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpc19tYXRjaCA9IChtZW1jbXAoZmlsdGVyX3BhY2tlZCwgbXNnX3BhY2tlZCwgbGVuKSA9PSAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoZmxhZ3MgJiBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04pICE9IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaXNfbWF0Y2ggPSAhaXNfbWF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYmNtb3NfZnJlZShtc2dfcGFja2VkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBtc2dfcGFja2VkID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGlzX21hdGNoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAvKiBpZiB0aGVyZSBpcyBhIG1hdGNoLCBpbmNsdWRlIHRoaXMgbWVzc2FnZSBpbiB0aGUgbWVzc2FnZSBzZXQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG1zZ19zZXQtPm1zZ1ttc2dfc2V0LT5udW1faW5zdGFuY2VzXSA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZXJyID0gYmNtb2x0X21zZ19jbG9uZSgmbXNnX3NldC0+bXNnW21zZ19zZXQtPm51bV9pbnN0YW5jZXNdLCAmY2ZnLmhkci5oZHIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBNSF9FWElUX0lGKGVyciAhPSBCQ01fRVJSX09LLCBlcnIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG1zZ19zZXQtPm51bV9pbnN0YW5jZXMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgLyogZ2V0IG5leHQga2V5LCBicmVhayBpZiBubyBtb3JlIGtleXMgYXJlIGZvdW5kICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlcnIgPSBtaF8jI29iaiMjX2tleV9pdGVyYXRlKG1zZ19zZXQtPm5leHRfa2V5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1IX0VYSVRfSUYoZXJyICE9IEJDTV9FUlJfT0ssIGVycik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitjbGVhbnVwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZmlsdGVyX3BhY2tlZCAhPSBOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJjbW9zX2ZyZWUoZmlsdGVyX3BhY2tlZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChtc2dfcGFja2VkICE9IE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYmNtb3NfZnJlZShtc2dfcGFja2VkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGVyciA9PSBCQ01fRVJSX05PX01PUkUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlcnIgPSBCQ01fRVJSX09LOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG1zZ19zZXQtPm1vcmUgPSBCQ01PU19GQUxTRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBlcnI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNlbmRpZiAvKiBfQkNNT0xUX01IX1VUSUxTX0hfICovCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9tb2RlbC9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9tb2RlbC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDE2MzE2Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL21vZGVsL01ha2VmaWxlCkBAIC0wLDAgKzEsMjEgQEAKKyMgTWFwbGUgb2JqZWN0IG1vZGVsCisjCitNT0RfTkFNRSA9IG1vZGVsCitNT0RfVFlQRSA9IGxpYgorTU9EX0RFUFMgPSB1dGlscyBjb21tb25fYXBpCitNT0RfSU5DX0RJUlMgPSAkKE1PREVMX09VVF9ESVIpCitnZW5fc3JjcyA9IGJjbW9sdF9tb2RlbF90eXBlcy5jIGJjbW9sdF9tc2dfcGFjay5jCisKK2lmZXEgKCIkKE9TX0tFUk5FTCkiLCAibGludXgiKQorICAgIE1PRF9ERVBTICs9IHN5c21vZGVsCitlbmRpZgorCitFWFRSQV9UWVBFUyArPSBwb25fb251X2lkIHBvbl9hbGxvY19pZCBwb25fZ2VtX3BvcnRfaWQgcG9uX2FsbG9jX2luZGV4IHBvbl9nZW1fcG9ydF9pbmRleAorCitpZmVxICgiJChFTkFCTEVfRVBPTikiLCAieSIpCisgICAgRVhUUkFfVFlQRVMgKz0gZW5pIHBvbl9yYXRlIGllZWVfODAyMWFzX3RpbWVfc3luYyAKK2VuZGlmCisKK2lmZXEgKCIkKEVOQUJMRV9HUE9OKSIsICJ5IikKKyAgICBFWFRSQV9UWVBFUyArPSBidXJzdF9wcm9maWxlIG1hY190YWJsZV9pZHhfbWFpbiBtYWNfdGFibGVfaWR4X2NhbSBtYWNfdGFibGVfaWR4X2NvbWJpbmVkCitlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL21vZGVsL2JjbW9sdF9tb2RlbF9kYXRhLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvbW9kZWwvYmNtb2x0X21vZGVsX2RhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODNkNGU3Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL21vZGVsL2JjbW9sdF9tb2RlbF9kYXRhLmgKQEAgLTAsMCArMSwzODkzIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OnByb3ByaWV0YXJ5OnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVGhpcyBwcm9ncmFtIGlzIHRoZSBwcm9wcmlldGFyeSBzb2Z0d2FyZSBvZiBCcm9hZGNvbSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzCitsaWNlbnNvcnMsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBkdXBsaWNhdGVkLCBtb2RpZmllZCBvciBkaXN0cmlidXRlZCBwdXJzdWFudAordG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIGEgc2VwYXJhdGUsIHdyaXR0ZW4gbGljZW5zZSBhZ3JlZW1lbnQgZXhlY3V0ZWQKK2JldHdlZW4geW91IGFuZCBCcm9hZGNvbSAoYW4gIkF1dGhvcml6ZWQgTGljZW5zZSIpLiAgRXhjZXB0IGFzIHNldCBmb3J0aCBpbgorYW4gQXV0aG9yaXplZCBMaWNlbnNlLCBCcm9hZGNvbSBncmFudHMgbm8gbGljZW5zZSAoZXhwcmVzcyBvciBpbXBsaWVkKSwgcmlnaHQKK3RvIHVzZSwgb3Igd2FpdmVyIG9mIGFueSBraW5kIHdpdGggcmVzcGVjdCB0byB0aGUgU29mdHdhcmUsIGFuZCBCcm9hZGNvbQorZXhwcmVzc2x5IHJlc2VydmVzIGFsbCByaWdodHMgaW4gYW5kIHRvIHRoZSBTb2Z0d2FyZSBhbmQgYWxsIGludGVsbGVjdHVhbAorcHJvcGVydHkgcmlnaHRzIHRoZXJlaW4uICBJRiBZT1UgSEFWRSBOTyBBVVRIT1JJWkVEIExJQ0VOU0UsIFRIRU4gWU9VIEhBVkUKK05PIFJJR0hUIFRPIFVTRSBUSElTIFNPRlRXQVJFIElOIEFOWSBXQVksIEFORCBTSE9VTEQgSU1NRURJQVRFTFkgTk9USUZZCitCUk9BRENPTSBBTkQgRElTQ09OVElOVUUgQUxMIFVTRSBPRiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBleHByZXNzbHkgc2V0IGZvcnRoIGluIHRoZSBBdXRob3JpemVkIExpY2Vuc2UsCisKKzEuIFRoaXMgcHJvZ3JhbSwgaW5jbHVkaW5nIGl0cyBzdHJ1Y3R1cmUsIHNlcXVlbmNlIGFuZCBvcmdhbml6YXRpb24sCisgICAgY29uc3RpdHV0ZXMgdGhlIHZhbHVhYmxlIHRyYWRlIHNlY3JldHMgb2YgQnJvYWRjb20sIGFuZCB5b3Ugc2hhbGwgdXNlCisgICAgYWxsIHJlYXNvbmFibGUgZWZmb3J0cyB0byBwcm90ZWN0IHRoZSBjb25maWRlbnRpYWxpdHkgdGhlcmVvZiwgYW5kIHRvCisgICAgdXNlIHRoaXMgaW5mb3JtYXRpb24gb25seSBpbiBjb25uZWN0aW9uIHdpdGggeW91ciB1c2Ugb2YgQnJvYWRjb20KKyAgICBpbnRlZ3JhdGVkIGNpcmN1aXQgcHJvZHVjdHMuCisKKzIuIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIgorICAgIEFORCBXSVRIIEFMTCBGQVVMVFMgQU5EIEJST0FEQ09NIE1BS0VTIE5PIFBST01JU0VTLCBSRVBSRVNFTlRBVElPTlMgT1IKKyAgICBXQVJSQU5USUVTLCBFSVRIRVIgRVhQUkVTUywgSU1QTElFRCwgU1RBVFVUT1JZLCBPUiBPVEhFUldJU0UsIFdJVEgKKyAgICBSRVNQRUNUIFRPIFRIRSBTT0ZUV0FSRS4gIEJST0FEQ09NIFNQRUNJRklDQUxMWSBESVNDTEFJTVMgQU5ZIEFORAorICAgIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgVElUTEUsIE1FUkNIQU5UQUJJTElUWSwgTk9OSU5GUklOR0VNRU5ULAorICAgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBMQUNLIE9GIFZJUlVTRVMsIEFDQ1VSQUNZIE9SCisgICAgQ09NUExFVEVORVNTLCBRVUlFVCBFTkpPWU1FTlQsIFFVSUVUIFBPU1NFU1NJT04gT1IgQ09SUkVTUE9OREVOQ0UKKyAgICBUTyBERVNDUklQVElPTi4gWU9VIEFTU1VNRSBUSEUgRU5USVJFIFJJU0sgQVJJU0lORyBPVVQgT0YgVVNFIE9SCisgICAgUEVSRk9STUFOQ0UgT0YgVEhFIFNPRlRXQVJFLgorCiszLiBUTyBUSEUgTUFYSU1VTSBFWFRFTlQgUEVSTUlUVEVEIEJZIExBVywgSU4gTk8gRVZFTlQgU0hBTEwgQlJPQURDT00gT1IKKyAgICBJVFMgTElDRU5TT1JTIEJFIExJQUJMRSBGT1IgKGkpIENPTlNFUVVFTlRJQUwsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgICAgSU5ESVJFQ1QsIE9SIEVYRU1QTEFSWSBEQU1BR0VTIFdIQVRTT0VWRVIgQVJJU0lORyBPVVQgT0YgT1IgSU4gQU5ZCisgICAgV0FZIFJFTEFUSU5HIFRPIFlPVVIgVVNFIE9GIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFNPRlRXQVJFIEVWRU4KKyAgICBJRiBCUk9BRENPTSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVM7CisgICAgT1IgKGlpKSBBTlkgQU1PVU5UIElOIEVYQ0VTUyBPRiBUSEUgQU1PVU5UIEFDVFVBTExZIFBBSUQgRk9SIFRIRQorICAgIFNPRlRXQVJFIElUU0VMRiBPUiBVLlMuICQxLCBXSElDSEVWRVIgSVMgR1JFQVRFUi4gVEhFU0UgTElNSVRBVElPTlMKKyAgICBTSEFMTCBBUFBMWSBOT1RXSVRIU1RBTkRJTkcgQU5ZIEZBSUxVUkUgT0YgRVNTRU5USUFMIFBVUlBPU0UgT0YgQU5ZCisgICAgTElNSVRFRCBSRU1FRFkuCis6PgorKi8KKyNpZm5kZWYgQkNNT0xUX01PREVMX0RBVEFfSF8KKyNkZWZpbmUgQkNNT0xUX01PREVMX0RBVEFfSF8KKworI2luY2x1ZGUgImJjbW9zX3N5c3RlbS5oIgorCisvKiogXGFkZHRvZ3JvdXAgb2JqZWN0X21vZGVsCisgKiBAeworICovCit0eXBlZGVmIHVpbnQzMl90IGJjbW9sdF90aW1lX3F1YW50YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgYmNtb2x0X3RpbWVfcXVhbnRhOiB0eXBlZCBhbGlhcyBmb3IgYSAzMi1iaXQgdW5zaWduZWQgaW50ZWdlci4gKi8KK3R5cGVkZWYgdWludDE2X3QgYmNtb2x0X2FlX25pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBiY21vbHRfYWVfbmk6IHR5cGVkIGFsaWFzIGZvciBhIDE2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyLiAqLworI2RlZmluZSBCQ01PTFRfQUVfTklfQUVfTklfSU5WQUxJRCAgKChiY21vbHRfYWVfbmkpIDY1NTM1VSkKK3R5cGVkZWYgdWludDhfdCBiY21vbHRfYWdncmVnYXRpb25fZG9tYWluOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBiY21vbHRfYWdncmVnYXRpb25fZG9tYWluOiB0eXBlZCBhbGlhcyBmb3IgYSA4LWJpdCB1bnNpZ25lZCBpbnRlZ2VyLiAqLwordHlwZWRlZiB1aW50MzJfdCBiY21vbHRfYmFuZHdpZHRoX0ticHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IGJjbW9sdF9iYW5kd2lkdGhfS2JwczogdHlwZWQgYWxpYXMgZm9yIGEgMzItYml0IHVuc2lnbmVkIGludGVnZXIuICovCit0eXBlZGVmIHVpbnQzMl90IGJjbW9sdF9iZXJfaW50ZXJ2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgYmNtb2x0X2Jlcl9pbnRlcnZhbDogdHlwZWQgYWxpYXMgZm9yIGEgMzItYml0IHVuc2lnbmVkIGludGVnZXIuICovCisjZGVmaW5lIEJDTU9MVF9CRVJfSU5URVJWQUxfQkVSX0lOVEVSVkFMX05PVF9DT05GSUdVUkVEICgoYmNtb2x0X2Jlcl9pbnRlcnZhbCkgMCkKK3R5cGVkZWYgdWludDhfdCBiY21vbHRfYnVyc3RfcHJvZmlsZV9pbmRleDsgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBiY21vbHRfYnVyc3RfcHJvZmlsZV9pbmRleDogdHlwZWQgYWxpYXMgZm9yIGEgOC1iaXQgdW5zaWduZWQgaW50ZWdlci4gKi8KK3R5cGVkZWYgdWludDhfdCBiY21vbHRfZGJhX3BvcnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBiY21vbHRfZGJhX3BvcnQ6IHR5cGVkIGFsaWFzIGZvciBhIDgtYml0IHVuc2lnbmVkIGludGVnZXIuICovCisjZGVmaW5lIEJDTU9MVF9EQkFfUE9SVF9DT1VOVCAgICgoYmNtb2x0X2RiYV9wb3J0KSA4KQordHlwZWRlZiB1aW50OF90IGJjbW9sdF9lcG9uX3RvcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IGJjbW9sdF9lcG9uX3RvcDogdHlwZWQgYWxpYXMgZm9yIGEgOC1iaXQgdW5zaWduZWQgaW50ZWdlci4gKi8KKyNkZWZpbmUgQkNNT0xUX0VQT05fVE9QX0NPVU5UICAgKChiY21vbHRfZXBvbl90b3ApIDgpCit0eXBlZGVmIHVpbnQ4X3QgYmNtb2x0X2VwbV9saW1fZ2xvYmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgYmNtb2x0X2VwbV9saW1fZ2xvYmFsOiB0eXBlZCBhbGlhcyBmb3IgYSA4LWJpdCB1bnNpZ25lZCBpbnRlZ2VyLiAqLworI2RlZmluZSBCQ01PTFRfRVBNX0xJTV9HTE9CQUxfQ09VTlQgKChiY21vbHRfZXBtX2xpbV9nbG9iYWwpIDE2KQordHlwZWRlZiB1aW50OF90IGJjbW9sdF94ZzJnX2lkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IGJjbW9sdF94ZzJnX2lkOiB0eXBlZCBhbGlhcyBmb3IgYSA4LWJpdCB1bnNpZ25lZCBpbnRlZ2VyLiAqLwordHlwZWRlZiB1aW50MTZfdCBiY21vbHRfZXBvbl9sbGlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IGJjbW9sdF9lcG9uX2xsaWQ6IHR5cGVkIGFsaWFzIGZvciBhIDE2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyLiAqLworI2RlZmluZSBCQ01PTFRfRVBPTl9MTElEX0JST0FEQ0FTVF9MTElEXzEwRyAoKGJjbW9sdF9lcG9uX2xsaWQpIDMyNzY2KQorI2RlZmluZSBCQ01PTFRfRVBPTl9MTElEX0JST0FEQ0FTVF9MTElEXzFHICAoKGJjbW9sdF9lcG9uX2xsaWQpIDMyNzY3KQordHlwZWRlZiB1aW50MzJfdCBiY21vbHRfZXBvbl90dW5uZWxfaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IGJjbW9sdF9lcG9uX3R1bm5lbF9pZDogdHlwZWQgYWxpYXMgZm9yIGEgMzItYml0IHVuc2lnbmVkIGludGVnZXIuICovCit0eXBlZGVmIHVpbnQxNl90IGJjbW9sdF9lcG9uX25pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgYmNtb2x0X2Vwb25fbmk6IHR5cGVkIGFsaWFzIGZvciBhIDE2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyLiAqLworI2RlZmluZSBCQ01PTFRfRVBPTl9OSV9JTlZBTElEICAoKGJjbW9sdF9lcG9uX25pKSA2NTUzNVUpCit0eXBlZGVmIHVpbnQ4X3QgYmNtb2x0X2Vwb25fb251X2lkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgYmNtb2x0X2Vwb25fb251X2lkOiB0eXBlZCBhbGlhcyBmb3IgYSA4LWJpdCB1bnNpZ25lZCBpbnRlZ2VyLiAqLworI2RlZmluZSBCQ01PTFRfRVBPTl9PTlVfSURfVU5LTk9XTl9PTlUgICgoYmNtb2x0X2Vwb25fb251X2lkKSAyNTUpCit0eXBlZGVmIHVpbnQxNl90IGJjbW9sdF9mbG93X2lkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgYmNtb2x0X2Zsb3dfaWQ6IHR5cGVkIGFsaWFzIGZvciBhIDE2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyLiAqLwordHlwZWRlZiB1aW50MTZfdCBiY21vbHRfZ3Bvbl9hbGxvY19pZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IGJjbW9sdF9ncG9uX2FsbG9jX2lkOiB0eXBlZCBhbGlhcyBmb3IgYSAxNi1iaXQgdW5zaWduZWQgaW50ZWdlci4gKi8KKyNkZWZpbmUgQkNNT0xUX0dQT05fQUxMT0NfSURfQU5ZICAgICAgICAoKGJjbW9sdF9ncG9uX2FsbG9jX2lkKSA2NTUzNFUpCisjZGVmaW5lIEJDTU9MVF9HUE9OX0FMTE9DX0lEX0lOVkFMSUQgICAgKChiY21vbHRfZ3Bvbl9hbGxvY19pZCkgNjU1MzVVKQordHlwZWRlZiB1aW50MTZfdCBiY21vbHRfdmxhbl9pZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IGJjbW9sdF92bGFuX2lkOiB0eXBlZCBhbGlhcyBmb3IgYSAxNi1iaXQgdW5zaWduZWQgaW50ZWdlci4gKi8KKyNkZWZpbmUgQkNNT0xUX1ZMQU5fSURfTUFYICAoKGJjbW9sdF92bGFuX2lkKSA0MDk1KQorI2RlZmluZSBCQ01PTFRfVkxBTl9JRF9BTlkgICgoYmNtb2x0X3ZsYW5faWQpIDY1NTM1VSkKK3R5cGVkZWYgdWludDE2X3QgYmNtb2x0X2dwb25fZ2VtX2lkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBiY21vbHRfZ3Bvbl9nZW1faWQ6IHR5cGVkIGFsaWFzIGZvciBhIDE2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyLiAqLworI2RlZmluZSBCQ01PTFRfR1BPTl9HRU1fSURfQU5ZICAgICAgKChiY21vbHRfZ3Bvbl9nZW1faWQpIDY1NTM0VSkKKyNkZWZpbmUgQkNNT0xUX0dQT05fR0VNX0lEX0lOVkFMSUQgICgoYmNtb2x0X2dwb25fZ2VtX2lkKSA2NTUzNVUpCit0eXBlZGVmIHVpbnQxNl90IGJjbW9sdF9ncG9uX29udV9pZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgYmNtb2x0X2dwb25fb251X2lkOiB0eXBlZCBhbGlhcyBmb3IgYSAxNi1iaXQgdW5zaWduZWQgaW50ZWdlci4gKi8KKyNkZWZpbmUgQkNNT0xUX0dQT05fT05VX0lEX0FOWSAgICAgICgoYmNtb2x0X2dwb25fb251X2lkKSA2NTUzNFUpCisjZGVmaW5lIEJDTU9MVF9HUE9OX09OVV9JRF9JTlZBTElEICAoKGJjbW9sdF9ncG9uX29udV9pZCkgNjU1MzVVKQordHlwZWRlZiB1aW50OF90IGJjbW9sdF9ncG9uX25pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IGJjbW9sdF9ncG9uX25pOiB0eXBlZCBhbGlhcyBmb3IgYSA4LWJpdCB1bnNpZ25lZCBpbnRlZ2VyLiAqLworI2RlZmluZSBCQ01PTFRfR1BPTl9OSV9JTlZBTElEICAoKGJjbW9sdF9ncG9uX25pKSAyNTUpCit0eXBlZGVmIHVpbnQxNl90IGJjbW9sdF9wb25fb251X2lkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgYmNtb2x0X3Bvbl9vbnVfaWQ6IHR5cGVkIGFsaWFzIGZvciBhIDE2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyLiAqLworI2RlZmluZSBCQ01PTFRfUE9OX09OVV9JRF9JTlZBTElEICAgKChiY21vbHRfcG9uX29udV9pZCkgNjU1MzVVKQordHlwZWRlZiB1aW50OF90IGJjbW9sdF9tYWNfdGFibGVfaWR4X2NhbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IGJjbW9sdF9tYWNfdGFibGVfaWR4X2NhbTogdHlwZWQgYWxpYXMgZm9yIGEgOC1iaXQgdW5zaWduZWQgaW50ZWdlci4gKi8KKyNkZWZpbmUgQkNNT0xUX01BQ19UQUJMRV9JRFhfQ0FNX05PTkUgICAoKGJjbW9sdF9tYWNfdGFibGVfaWR4X2NhbSkgMjU1KQordHlwZWRlZiB1aW50MTZfdCBiY21vbHRfbWFjX3RhYmxlX2lkeF9jb21iaW5lZDsgICAgICAgICAgICAgICAgICAgICAvKio8IGJjbW9sdF9tYWNfdGFibGVfaWR4X2NvbWJpbmVkOiB0eXBlZCBhbGlhcyBmb3IgYSAxNi1iaXQgdW5zaWduZWQgaW50ZWdlci4gKi8KKyNkZWZpbmUgQkNNT0xUX01BQ19UQUJMRV9JRFhfQ09NQklORURfTk9ORSAgKChiY21vbHRfbWFjX3RhYmxlX2lkeF9jb21iaW5lZCkgNjU1MzVVKQordHlwZWRlZiB1aW50MTZfdCBiY21vbHRfbWFjX3RhYmxlX2lkeF9tYWluOyAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IGJjbW9sdF9tYWNfdGFibGVfaWR4X21haW46IHR5cGVkIGFsaWFzIGZvciBhIDE2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyLiAqLworI2RlZmluZSBCQ01PTFRfTUFDX1RBQkxFX0lEWF9NQUlOX05PTkUgICgoYmNtb2x0X21hY190YWJsZV9pZHhfbWFpbikgNjU1MzVVKQordHlwZWRlZiB1aW50MzJfdCBiY21vbHRfbWV0ZXJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IGJjbW9sdF9tZXRlcnM6IHR5cGVkIGFsaWFzIGZvciBhIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyLiAqLwordHlwZWRlZiB1aW50MTZfdCBiY21vbHRfcG9uX2FsbG9jX2lkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IGJjbW9sdF9wb25fYWxsb2NfaWQ6IHR5cGVkIGFsaWFzIGZvciBhIDE2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyLiAqLworI2RlZmluZSBCQ01PTFRfUE9OX0FMTE9DX0lEX0lOVkFMSUQgKChiY21vbHRfcG9uX2FsbG9jX2lkKSA2NTUzNVUpCit0eXBlZGVmIHVpbnQxNl90IGJjbW9sdF9wb25fYWxsb2NfaW5kZXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgYmNtb2x0X3Bvbl9hbGxvY19pbmRleDogdHlwZWQgYWxpYXMgZm9yIGEgMTYtYml0IHVuc2lnbmVkIGludGVnZXIuICovCisjZGVmaW5lIEJDTU9MVF9QT05fQUxMT0NfSU5ERVhfSU5WQUxJRCAgKChiY21vbHRfcG9uX2FsbG9jX2luZGV4KSA2NTUzNVUpCit0eXBlZGVmIHVpbnQxNl90IGJjbW9sdF9wb25fZ2VtX3BvcnRfaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgYmNtb2x0X3Bvbl9nZW1fcG9ydF9pZDogdHlwZWQgYWxpYXMgZm9yIGEgMTYtYml0IHVuc2lnbmVkIGludGVnZXIuICovCisjZGVmaW5lIEJDTU9MVF9QT05fR0VNX1BPUlRfSURfSU5WQUxJRCAgKChiY21vbHRfcG9uX2dlbV9wb3J0X2lkKSA2NTUzNVUpCit0eXBlZGVmIHVpbnQxNl90IGJjbW9sdF9wb25fZ2VtX3BvcnRfaW5kZXg7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgYmNtb2x0X3Bvbl9nZW1fcG9ydF9pbmRleDogdHlwZWQgYWxpYXMgZm9yIGEgMTYtYml0IHVuc2lnbmVkIGludGVnZXIuICovCisjZGVmaW5lIEJDTU9MVF9QT05fR0VNX1BPUlRfSU5ERVhfSU5WQUxJRCAgICgoYmNtb2x0X3Bvbl9nZW1fcG9ydF9pbmRleCkgNjU1MzVVKQordHlwZWRlZiB1aW50OF90IGJjbW9sdF9wb25fbmk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IGJjbW9sdF9wb25fbmk6IHR5cGVkIGFsaWFzIGZvciBhIDgtYml0IHVuc2lnbmVkIGludGVnZXIuICovCisjZGVmaW5lIEJDTU9MVF9QT05fTklfSU5WQUxJRCAgICgoYmNtb2x0X3Bvbl9uaSkgMjU1KQordHlwZWRlZiB1aW50MTZfdCBiY21vbHRfeGdwb25fYWxsb2NfaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IGJjbW9sdF94Z3Bvbl9hbGxvY19pZDogdHlwZWQgYWxpYXMgZm9yIGEgMTYtYml0IHVuc2lnbmVkIGludGVnZXIuICovCisjZGVmaW5lIEJDTU9MVF9YR1BPTl9BTExPQ19JRF9BTlkgICAgICAgKChiY21vbHRfeGdwb25fYWxsb2NfaWQpIDY1NTM0VSkKKyNkZWZpbmUgQkNNT0xUX1hHUE9OX0FMTE9DX0lEX0lOVkFMSUQgICAoKGJjbW9sdF94Z3Bvbl9hbGxvY19pZCkgNjU1MzVVKQordHlwZWRlZiB1aW50MTZfdCBiY21vbHRfeGdwb25fZ2VtX2lkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IGJjbW9sdF94Z3Bvbl9nZW1faWQ6IHR5cGVkIGFsaWFzIGZvciBhIDE2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyLiAqLworI2RlZmluZSBCQ01PTFRfWEdQT05fR0VNX0lEX0FOWSAgICAgKChiY21vbHRfeGdwb25fZ2VtX2lkKSA2NTUzNFUpCisjZGVmaW5lIEJDTU9MVF9YR1BPTl9HRU1fSURfSU5WQUxJRCAoKGJjbW9sdF94Z3Bvbl9nZW1faWQpIDY1NTM1VSkKK3R5cGVkZWYgdWludDhfdCBiY21vbHRfeGdwb25fbmk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBiY21vbHRfeGdwb25fbmk6IHR5cGVkIGFsaWFzIGZvciBhIDgtYml0IHVuc2lnbmVkIGludGVnZXIuICovCisjZGVmaW5lIEJDTU9MVF9YR1BPTl9OSV9JTlZBTElEICgoYmNtb2x0X3hncG9uX25pKSAyNTUpCit0eXBlZGVmIHVpbnQxNl90IGJjbW9sdF94Z3Bvbl9vbnVfaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgYmNtb2x0X3hncG9uX29udV9pZDogdHlwZWQgYWxpYXMgZm9yIGEgMTYtYml0IHVuc2lnbmVkIGludGVnZXIuICovCisjZGVmaW5lIEJDTU9MVF9YR1BPTl9PTlVfSURfQU5ZICAgICAoKGJjbW9sdF94Z3Bvbl9vbnVfaWQpIDY1NTM0VSkKKyNkZWZpbmUgQkNNT0xUX1hHUE9OX09OVV9JRF9JTlZBTElEICgoYmNtb2x0X3hncG9uX29udV9pZCkgNjU1MzVVKQorCisvKiogYWN0aXZhdGlvbiBmYWlsIHJlYXNvbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfYWN0aXZhdGlvbl9mYWlsX3JlYXNvbgoreworICAgIEJDTU9MVF9BQ1RJVkFUSU9OX0ZBSUxfUkVBU09OX19CRUdJTiAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9BQ1RJVkFUSU9OX0ZBSUxfUkVBU09OX05PTkUgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IE5vbmUuICovCisgICAgQkNNT0xUX0FDVElWQVRJT05fRkFJTF9SRUFTT05fUkFOR0lORyAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgUmFuZ2luZy4gKi8KKyAgICBCQ01PTFRfQUNUSVZBVElPTl9GQUlMX1JFQVNPTl9QQVNTV09SRF9BVVRIRU5USUNBVElPTiAgID0gMiwgICAgLyoqPCBQYXNzd29yZCBhdXRoZW50aWNhdGlvbi4gKi8KKyAgICBCQ01PTFRfQUNUSVZBVElPTl9GQUlMX1JFQVNPTl9MT1MgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBMT1MuICovCisgICAgQkNNT0xUX0FDVElWQVRJT05fRkFJTF9SRUFTT05fT05VX0FMQVJNICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgT05VIEFsYXJtLiAqLworICAgIEJDTU9MVF9BQ1RJVkFUSU9OX0ZBSUxfUkVBU09OX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9hY3RpdmF0aW9uX2ZhaWxfcmVhc29uOworCisvKiogQWRkaXRpb25hbCBCVyBlbGlnaWJpbGl0eS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfYWRkaXRpb25hbF9id19lbGlnaWJpbGl0eQoreworICAgIEJDTU9MVF9BRERJVElPTkFMX0JXX0VMSUdJQklMSVRZX19CRUdJTiAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9BRERJVElPTkFMX0JXX0VMSUdJQklMSVRZX05PTkUgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IE5vbmUuICovCisgICAgQkNNT0xUX0FERElUSU9OQUxfQldfRUxJR0lCSUxJVFlfTk9OX0FTU1VSRUQgICAgICAgICAgICA9IDEsICAgIC8qKjwgTm9uIEFzc3VyZWQuICovCisgICAgQkNNT0xUX0FERElUSU9OQUxfQldfRUxJR0lCSUxJVFlfQkVTVF9FRkZPUlQgICAgICAgICAgICA9IDIsICAgIC8qKjwgQmVzdCBFZmZvcnQuICovCisgICAgQkNNT0xUX0FERElUSU9OQUxfQldfRUxJR0lCSUxJVFlfX05VTV9PRiAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2FkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHk7CisKKy8qKiBFbmFibGUgc3RhdGUgb2YgdGhlIEFFIE5JLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9hZV9uaV9lbl9zdGF0ZQoreworICAgIEJDTU9MVF9BRV9OSV9FTl9TVEFURV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9BRV9OSV9FTl9TVEFURV9ESVNBQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEFFIE5JIGlzIGZ1bGx5IGRpc2FibGVkLiAqLworICAgIEJDTU9MVF9BRV9OSV9FTl9TVEFURV9FTkFCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEFFIE5JIGlzIGZ1bGx5IGVuYWJsZWQuICovCisgICAgQkNNT0xUX0FFX05JX0VOX1NUQVRFX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9hZV9uaV9lbl9zdGF0ZTsKKworLyoqIEFsbG9jIG9wZXJhdGlvbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfYWxsb2Nfb3BlcmF0aW9uCit7CisgICAgQkNNT0xUX0FMTE9DX09QRVJBVElPTl9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0FMTE9DX09QRVJBVElPTl9BQ1RJVkFURSAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQWN0aXZhdGUuICovCisgICAgQkNNT0xUX0FMTE9DX09QRVJBVElPTl9ERUFDVElWQVRFICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgRGVhY3RpdmF0ZS4gKi8KKyAgICBCQ01PTFRfQUxMT0NfT1BFUkFUSU9OX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2FsbG9jX29wZXJhdGlvbjsKKworLyoqIEFsbG9jIFN0YXRlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9hbGxvY19zdGF0ZQoreworICAgIEJDTU9MVF9BTExPQ19TVEFURV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9BTExPQ19TVEFURV9OT1RfQ09ORklHVVJFRCAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IE5vdCBjb25maWd1cmVkLiAqLworICAgIEJDTU9MVF9BTExPQ19TVEFURV9JTkFDVElWRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEluYWN0aXZlLiAqLworICAgIEJDTU9MVF9BTExPQ19TVEFURV9QUk9DRVNTSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IFByb2Nlc3NpbmcuICovCisgICAgQkNNT0xUX0FMTE9DX1NUQVRFX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgQWN0aXZlLiAqLworICAgIEJDTU9MVF9BTExPQ19TVEFURV9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9hbGxvY19zdGF0ZTsKKworLyoqIEFsbG9jIFR5cGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2FsbG9jX3R5cGUKK3sKKyAgICBCQ01PTFRfQUxMT0NfVFlQRV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfQUxMT0NfVFlQRV9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBOb25lLiAqLworICAgIEJDTU9MVF9BTExPQ19UWVBFX05TUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IE5vbiBTdGF0dXMgUmVwb3J0LiAqLworICAgIEJDTU9MVF9BTExPQ19UWVBFX1NSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IFN0YXR1cyBSZXBvcnQuICovCisgICAgQkNNT0xUX0FMTE9DX1RZUEVfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2FsbG9jX3R5cGU7CisKKy8qKiBBbGxvYyBUeXBlIHRvIHNjYW4gZHVyaW5nIHRoZSByb2d1ZSBvbnUgZGV0ZWN0aW9uIHByb2Nlc3MuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2FsbG9jX3R5cGVfdG9fc2NhbgoreworICAgIEJDTU9MVF9BTExPQ19UWVBFX1RPX1NDQU5fX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9BTExPQ19UWVBFX1RPX1NDQU5fVU5VU0VEICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFNjYW4gb25seSB0aGUgQWxsb2MtSURzIHRoYXQgaGF2ZSBub3QgYmVlbiB1c2VkLiAqLworICAgIEJDTU9MVF9BTExPQ19UWVBFX1RPX1NDQU5fUFJFVklPVVNMWV9VU0VEICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFNjYW4gb25seSB0aGUgQWxsb2MtSURzIHRoYXQgaGFzIGJlZW4gdXNlZCBidXQgY3VycmVudGx5IG5vdCBiZWluZyB1c2VkLiAgVGhpcyBpcyBmb3IgZGV0ZWN0aW5nIHRoZSBjYXNlIHdoZW4gdGhlIE9MVCBoYXMgcmVsZWFzZWQgdGhlIEFsbG9jLCBidXQgdGhlIE9OVSBpcyBzdGlsbCBob2xkaW5nIGl0IGR1ZSB0byBhbiBlcnJvci4gKi8KKyAgICBCQ01PTFRfQUxMT0NfVFlQRV9UT19TQ0FOX0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBTY2FuIGJvdGggdXNlZCBhbmQgdW51c2VkIEFsbG9jLUlEcy4gKi8KKyAgICBCQ01PTFRfQUxMT0NfVFlQRV9UT19TQ0FOX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9hbGxvY190eXBlX3RvX3NjYW47CisKKy8qKiBXaGF0IHRvIGRvIHdoZW4gdGhlIGNhcHR1cmUgYnVmZmVyIGlzIGZ1bGwuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9tb2RlCit7CisgICAgQkNNT0xUX0FQSV9DQVBUVVJFX0JVRkZFUl9NT0RFX19CRUdJTiAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0FQSV9DQVBUVVJFX0JVRkZFUl9NT0RFX09WRVJGTE9XICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgRHJvcCBtZXNzYWdlcyB3aGVuIHRoZSBidWZmZXIgaXMgZnVsbC4gKi8KKyAgICBCQ01PTFRfQVBJX0NBUFRVUkVfQlVGRkVSX01PREVfV1JBUCAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBXcmFwIGJhY2sgdG8gdGhlIGJlZ2lubmluZyB3aGVuIHRoZSBidWZmZXIgaXMgZnVsbC4gKi8KKyAgICBCQ01PTFRfQVBJX0NBUFRVUkVfQlVGRkVSX01PREVfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfYXBpX2NhcHR1cmVfYnVmZmVyX21vZGU7CisKKy8qKiBXaGVyZSB0byBwZXJmb3JtIHRoZSBBUEkgY2FwdHVyZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfYXBpX2NhcHR1cmVfbG9jYXRpb24KK3sKKyAgICBCQ01PTFRfQVBJX0NBUFRVUkVfTE9DQVRJT05fX0JFR0lOICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfQVBJX0NBUFRVUkVfTE9DQVRJT05fREVWSUNFICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBPbiB0aGUgZGV2aWNlLiAqLworICAgIEJDTU9MVF9BUElfQ0FQVFVSRV9MT0NBVElPTl9IT1NUICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IE9uIHRoZSBob3N0LiAqLworICAgIEJDTU9MVF9BUElfQ0FQVFVSRV9MT0NBVElPTl9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2FwaV9jYXB0dXJlX2xvY2F0aW9uOworCisvKiogQ2FsaWJyYXRpb24gUmVjb3JkLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9jYWxpYnJhdGlvbl9yZWNvcmQKK3sKKyAgICBCQ01PTFRfQ0FMSUJSQVRJT05fUkVDT1JEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfQ0FMSUJSQVRJT05fUkVDT1JEX1VOU1BFQ0lGSUVEICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBVbnNwZWNpZmllZC4gKi8KKyAgICBCQ01PTFRfQ0FMSUJSQVRJT05fUkVDT1JEX1VOQ0FMSUJSQVRFRCAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBVbmNhbGlicmF0ZWQuICovCisgICAgQkNNT0xUX0NBTElCUkFUSU9OX1JFQ09SRF9MT09TRSAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgTG9vc2UuICovCisgICAgQkNNT0xUX0NBTElCUkFUSU9OX1JFQ09SRF9TVUZGSUNJRU5UICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgU3VmZmljaWVudC4gKi8KKyAgICBCQ01PTFRfQ0FMSUJSQVRJT05fUkVDT1JEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9jYWxpYnJhdGlvbl9yZWNvcmQ7CisKKy8qKiBzaWduLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9zaWduCit7CisgICAgQkNNT0xUX1NJR05fX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1NJR05fUE9TSVRJVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgUG9zaXRpdmUuICovCisgICAgQkNNT0xUX1NJR05fTkVHQVRJVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgTmVnYXRpdmUuICovCisgICAgQkNNT0xUX1NJR05fX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9zaWduOworCisvKiogWEdQT04gbmkgdXBzdHJlYW0gbGluZSByYXRlIGNhcGFiaWxpdGllcyAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF91cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzCit7CisgICAgQkNNT0xUX1VQU1RSRUFNX0xJTkVfUkFURV9DQVBBQklMSVRJRVNfX0JFR0lOICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1VQU1RSRUFNX0xJTkVfUkFURV9DQVBBQklMSVRJRVNfUkFURV8yX1BfNV9HICAgICA9IDAsICAgIC8qKjwgMi41RyBVcHN0cmVhbSBsaW5lIHJhdGUgY2FwYWJpbGl0eSAqLworICAgIEJDTU9MVF9VUFNUUkVBTV9MSU5FX1JBVEVfQ0FQQUJJTElUSUVTX1JBVEVfMTBfRyAgICAgICAgPSAxLCAgICAvKio8IDEwRyBVcHN0cmVhbSBsaW5lIHJhdGUgY2FwYWJpbGl0eSAqLworICAgIEJDTU9MVF9VUFNUUkVBTV9MSU5FX1JBVEVfQ0FQQUJJTElUSUVTX19OVU1fT0YgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF91cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzOworCisvKiogTGluayB0eXBlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9saW5rX3R5cGUKK3sKKyAgICBCQ01PTFRfTElOS19UWVBFX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfTElOS19UWVBFX1VOU1BFQ0lGSUVEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBMaW5rIHR5cGUgdW5zcGVjaWZpZWQgKi8KKyAgICBCQ01PTFRfTElOS19UWVBFX0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBMaW5rIHR5cGUgQSBpcyBub3Qgc3VwcG9ydGVkLCBsaW5rIHR5cGUgQiBpcyBzdXBwb3J0ZWQgKi8KKyAgICBCQ01PTFRfTElOS19UWVBFX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBMaW5rIHR5cGUgQSBpcyBzdXBwb3J0ZWQsIGxpbmsgdHlwZSBCIGlzIG5vdCBzdXBwb3J0ZWQgKi8KKyAgICBCQ01PTFRfTElOS19UWVBFX0FfQU5EX0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBCb3RoIGxpbmsgdHlwZXMgQSBhbmQgQiBhcmUgc3VwcG9ydGVkICovCisgICAgQkNNT0xUX0xJTktfVFlQRV9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2xpbmtfdHlwZTsKKworLyoqIGNhcHR1cmUgc3Ryb2JlIHNpZ25hbC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfY2FwdHVyZV9zdHJvYmVfc2lnbmFsCit7CisgICAgQkNNT0xUX0NBUFRVUkVfU1RST0JFX1NJR05BTF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0NBUFRVUkVfU1RST0JFX1NJR05BTF9HUE9OX0JDRFJfUkVTRVQgICAgICAgICAgICA9IDAsICAgIC8qKjwgZ3BvbiBiY2RyIHJlc2V0LiAqLworICAgIEJDTU9MVF9DQVBUVVJFX1NUUk9CRV9TSUdOQUxfR1BPTl9UUlhfRUQgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IGdwb24gdHJ4IGVkLiAqLworICAgIEJDTU9MVF9DQVBUVVJFX1NUUk9CRV9TSUdOQUxfR1BPTl9SU1NJICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IGdwb24gcnNzaS4gKi8KKyAgICBCQ01PTFRfQ0FQVFVSRV9TVFJPQkVfU0lHTkFMX0dQT05fRU9CICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBncG9uIGVvYi4gKi8KKyAgICBCQ01PTFRfQ0FQVFVSRV9TVFJPQkVfU0lHTkFMX1NFUkRFU19CVVJTVF9FTiAgICAgICAgICAgID0gNCwgICAgLyoqPCBzZXJkZXMgYnVyc3QgZW4uICovCisgICAgQkNNT0xUX0NBUFRVUkVfU1RST0JFX1NJR05BTF9TRVJERVNfUlhfTE9DSyAgICAgICAgICAgICA9IDUsICAgIC8qKjwgc2VyZGVzIHJ4IGxvY2suICovCisgICAgQkNNT0xUX0NBUFRVUkVfU1RST0JFX1NJR05BTF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2NhcHR1cmVfc3Ryb2JlX3NpZ25hbDsKKworLyoqIENvbnNvbGUgUmVkaXJlY3Rpb24gVHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfY29uc29sZV9yZWRpcmVjdGlvbgoreworICAgIEJDTU9MVF9DT05TT0xFX1JFRElSRUNUSU9OX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9DT05TT0xFX1JFRElSRUNUSU9OX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IE5vIHJlZGlyZWN0aW9uICovCisgICAgQkNNT0xUX0NPTlNPTEVfUkVESVJFQ1RJT05fUkVESVJFQ1QgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgRW1iZWRkZWQgY29uc29sZSBvdXRwdXQgaXMgcmVkaXJlY3RlZCB0byB0aGUgaG9zdCAqLworICAgIEJDTU9MVF9DT05TT0xFX1JFRElSRUNUSU9OX0NMT05FICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IEVtYmVkZGVkIGNvbnNvbGUgb3V0cHV0IGlzIGNsb25lZCB0byB0aGUgaG9zdCAqLworICAgIEJDTU9MVF9DT05TT0xFX1JFRElSRUNUSU9OX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2NvbnNvbGVfcmVkaXJlY3Rpb247CisKKy8qKiBjb250cm9sIHN0YXRlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9jb250cm9sX3N0YXRlCit7CisgICAgQkNNT0xUX0NPTlRST0xfU1RBVEVfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgRGlzYWJsZWQuICovCisgICAgQkNNT0xUX0NPTlRST0xfU1RBVEVfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgRW5hYmxlZC4gKi8KKyAgICBCQ01PTFRfQ09OVFJPTF9TVEFURV9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2NvbnRyb2xfc3RhdGU7CisKKy8qKiBkYmEgbW9kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZGJhX21vZGUKK3sKKyAgICBCQ01PTFRfREJBX01PREVfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfREJBX01PREVfTk9STUFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBub3JtYWwuICovCisgICAgQkNNT0xUX0RCQV9NT0RFX0VYVEVOREVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgZXh0ZW5kZWQuICovCisgICAgQkNNT0xUX0RCQV9NT0RFX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZGJhX21vZGU7CisKKy8qKiBEQkEgUkFNLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9kYmFfcmFtCit7CisgICAgQkNNT0xUX0RCQV9SQU1fX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0RCQV9SQU1fR1JBTlRfRklGT19SQU1fMCAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgR3JhbnQgRklGTyBSQU0gMC4gKi8KKyAgICBCQ01PTFRfREJBX1JBTV9HUkFOVF9GSUZPX1JBTV8xICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBHcmFudCBGSUZPIFJBTSAxLiAqLworICAgIEJDTU9MVF9EQkFfUkFNX0dSQU5UX0ZJRk9fUkFNXzIgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IEdyYW50IEZJRk8gUkFNIDIuICovCisgICAgQkNNT0xUX0RCQV9SQU1fR1JBTlRfRklGT19SQU1fMyAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgR3JhbnQgRklGTyBSQU0gMy4gKi8KKyAgICBCQ01PTFRfREJBX1JBTV9HUkFOVF9GSUZPX1JBTV80ICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgLyoqPCBHcmFudCBGSUZPIFJBTSA0LiAqLworICAgIEJDTU9MVF9EQkFfUkFNX0dSQU5UX0ZJRk9fUkFNXzUgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IEdyYW50IEZJRk8gUkFNIDUuICovCisgICAgQkNNT0xUX0RCQV9SQU1fR1JBTlRfRklGT19SQU1fNiAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgIC8qKjwgR3JhbnQgRklGTyBSQU0gNi4gKi8KKyAgICBCQ01PTFRfREJBX1JBTV9HUkFOVF9GSUZPX1JBTV83ICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgLyoqPCBHcmFudCBGSUZPIFJBTSA3LiAqLworICAgIEJDTU9MVF9EQkFfUkFNX0dSQU5UU19PVVRfUkFNICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAvKio8IEdyYW50cyBPdXQgUkFNLiAqLworICAgIEJDTU9MVF9EQkFfUkFNX0dSQU5UU19JTl9SQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5LCAgICAvKio8IEdyYW50cyBJbiBSQU0uICovCisgICAgQkNNT0xUX0RCQV9SQU1fR1JBTlRTX1JFVElSRURfUkFNICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgIC8qKjwgR3JhbnRzIFJldGlyZWQgUkFNLiAqLworICAgIEJDTU9MVF9EQkFfUkFNX1JFUE9SVF9SQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAvKio8IFJlcG9ydCBSQU0uICovCisgICAgQkNNT0xUX0RCQV9SQU1fR1JBTlRfQ0ZHX1JBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyLCAgIC8qKjwgR3JhbnQgQ2ZnIFJBTS4gKi8KKyAgICBCQ01PTFRfREJBX1JBTV9ERUZBVUxUX1RPS0VOU19SQU0gICAgICAgICAgICAgICAgICAgICAgID0gMTMsICAgLyoqPCBEZWZhdWx0IFRva2VucyBSQU0uICovCisgICAgQkNNT0xUX0RCQV9SQU1fUE9MTF9SRUNPUkRTX1JBTSAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0LCAgIC8qKjwgUG9sbCBSZWNvcmRzIFJBTS4gKi8KKyAgICBCQ01PTFRfREJBX1JBTV9IRUlSX1BPTExfUkFNICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUsICAgLyoqPCBIZWlyIFBvbGwgUkFNLiAqLworICAgIEJDTU9MVF9EQkFfUkFNX0xBU1RfUE9MTF9USU1FX1JBTSAgICAgICAgICAgICAgICAgICAgICAgPSAxNiwgICAvKio8IExhc3QgUG9sbCBUaW1lIFJBTS4gKi8KKyAgICBCQ01PTFRfREJBX1JBTV9QT0xMX09SREVSX1JBTSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTcsICAgLyoqPCBQb2xsIE9yZGVyIFJBTS4gKi8KKyAgICBCQ01PTFRfREJBX1JBTV9URE1fUkFNXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgsICAgLyoqPCBURE0gUkFNIDAuICovCisgICAgQkNNT0xUX0RCQV9SQU1fVERNX1JBTV8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5LCAgIC8qKjwgVERNIFJBTSAxLiAqLworICAgIEJDTU9MVF9EQkFfUkFNX1RETV9SQU1fMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMCwgICAvKio8IFRETSBSQU0gMi4gKi8KKyAgICBCQ01PTFRfREJBX1JBTV9URE1fUkFNXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjEsICAgLyoqPCBURE0gUkFNIDMuICovCisgICAgQkNNT0xUX0RCQV9SQU1fVERNX1JBTV80ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIyLCAgIC8qKjwgVERNIFJBTSA0LiAqLworICAgIEJDTU9MVF9EQkFfUkFNX1RETV9SQU1fNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMywgICAvKio8IFRETSBSQU0gNS4gKi8KKyAgICBCQ01PTFRfREJBX1JBTV9URE1fUkFNXzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjQsICAgLyoqPCBURE0gUkFNIDYuICovCisgICAgQkNNT0xUX0RCQV9SQU1fVERNX1JBTV83ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1LCAgIC8qKjwgVERNIFJBTSA3LiAqLworICAgIEJDTU9MVF9EQkFfUkFNX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2RiYV9yYW07CisKKy8qKiBEQkEgdHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZGJhX3R5cGUKK3sKKyAgICBCQ01PTFRfREJBX1RZUEVfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfREJBX1RZUEVfSU5URVJOQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBEQkEgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gKi8KKyAgICBCQ01PTFRfREJBX1RZUEVfUEFSVElBTF9FWFRFUk5BTCAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBEQkEgcGFydGlhbCBleHRlcm5hbCBpbXBsZW1lbnRhdGlvbiAoREUsIEJBIGFyZSBpbXBsZW1lbnRlZCBleHRlcm5hbGx5KSAqLworICAgIEJDTU9MVF9EQkFfVFlQRV9FWFRFUk5BTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IERCQSBleHRlcm5hbCBpbXBsZW1lbnRhdGlvbiAgKi8KKyAgICBCQ01PTFRfREJBX1RZUEVfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9kYmFfdHlwZTsKKworLyoqIEREUiBUZXN0IFN0YXR1cy4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZGRyX3Rlc3Rfc3RhdHVzCit7CisgICAgQkNNT0xUX0REUl9URVNUX1NUQVRVU19fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0REUl9URVNUX1NUQVRVU19DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgVGhlIEREUiB0ZXN0IHJhbiB0byBjb21wbGV0aW9uICovCisgICAgQkNNT0xUX0REUl9URVNUX1NUQVRVU19DT05ORUNUSU9OX0ZBSUxFRCAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgVGhlIEREUiB0ZXN0IGZhaWxlZCBkdWUgdG8gYW4gaXNzdWUgbG9hZGluZyB0aGUgYm9vdGxvYWRlciAqLworICAgIEJDTU9MVF9ERFJfVEVTVF9TVEFUVVNfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IFRoZSBERFIgdGVzdCBmYWlsZWQgdG8gY29tcGxldGUgd2l0aGluIHRoZSBleHBlY3RlZCB0aW1lICovCisgICAgQkNNT0xUX0REUl9URVNUX1NUQVRVU19fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9kZHJfdGVzdF9zdGF0dXM7CisKKy8qKiBERFIgVGVzdCBSZXN1bHQuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Rkcl90ZXN0X3Jlc3VsdAoreworICAgIEJDTU9MVF9ERFJfVEVTVF9SRVNVTFRfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgLyoqPCBTdWNjZXNzLiAqLworICAgIEJDTU9MVF9ERFJfVEVTVF9SRVNVTFRfUEhZX0lOSVRfRVJST1IgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgLyoqPCBQSFkgSW5pdCBFcnJvci4gKi8KKyAgICBCQ01PTFRfRERSX1RFU1RfUkVTVUxUX0RSQU1fSU5JVF9FUlJPUiAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgIC8qKjwgRFJBTSBJbml0IEVycm9yLiAqLworICAgIEJDTU9MVF9ERFJfVEVTVF9SRVNVTFRfU0hNT09fRVJST1IgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgLyoqPCBTSE1PTyBFcnJvci4gKi8KKyAgICBCQ01PTFRfRERSX1RFU1RfUkVTVUxUX0VESVNfVEVTVF9FUlJPUiAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgIC8qKjwgRURJUyBUZXN0IEVycm9yLiAqLworICAgIEJDTU9MVF9ERFJfVEVTVF9SRVNVTFRfTUVNX1RFU1RfRVJST1IgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgLyoqPCBNZW0gVGVzdCBFcnJvci4gKi8KKyAgICBCQ01PTFRfRERSX1RFU1RfUkVTVUxUX05PVF9URVNURUQgICAgICAgICAgICAgICAgICAgICAgID0gMTI3ICAgICAgIC8qKjwgTm90IFRlc3RlZC4gKi8KK30gYmNtb2x0X2Rkcl90ZXN0X3Jlc3VsdDsKKworLyoqIFJlYXNvbnMgd2h5IHRoZSBjb25uZWN0aW9uIGJldHdlZW4gdGhlIGhvc3QgYW5kIHRoZSBkZXZpY2UgZmFpbGVkIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2hvc3RfY29ubmVjdGlvbl9mYWlsX3JlYXNvbgoreworICAgIEJDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fX0JFR0lOICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX1RJTUVPVVQgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgVGhlIGNvbm5lY3Rpb24gcHJvY2VzcyBoYXMgdGltZWQgb3V0LiAqLworICAgIEJDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fS0VFUEFMSVZFICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBUb28gbXVjaCB0aW1lIGhhcyBwYXNzZWQgYmV0d2VlbiBrZWVwYWxpdmUgbWVzc2FnZXMgZnJvbSB0aGUgZGV2aWNlLiAqLworICAgIEJDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fVVNFUl9DQUxMQkFDS19FUlJPUiAgICAgID0gMiwgICAgLyoqPCBBIHVzZXIgY2FsbGJhY2sgcmV0dXJuZWQgYSBub256ZXJvIGVycm9yIGNvZGUuICBDaGVjayBsb2cgb3V0cHV0IHRvIGRldGVybWluZSB3aGljaCBjYWxsYmFjayBmYWlsZWQuICovCisgICAgQkNNT0xUX0hPU1RfQ09OTkVDVElPTl9GQUlMX1JFQVNPTl9TT0ZUV0FSRV9WRVJTSU9OX01JU01BVENIPSAzLCAgICAvKio8IFRoZSBzb2Z0d2FyZSB2ZXJzaW9uIG9uIHRoZSBydW5uaW5nIGRldmljZSBkb2Vzbid0IG1hdGNoIHRoZSB2ZXJzaW9uIGluIHRoZSBob3N0IHNvZnR3YXJlLiAgT25seSB0aGUgcmV2aXNpb24gbnVtYmVyIGlzIGFsbG93ZWQgdG8gZGlmZmVyIC0gbWFqb3IvbWlub3IvbW9kZWwgbXVzdCBtYXRjaC4gKi8KKyAgICBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX1NZU1RFTV9NT0RFX01JU01BVENIICAgICA9IDQsICAgIC8qKjwgVGhlIHN5c3RlbSBtb2RlIG9uIHRoZSBydW5uaW5nIGRldmljZSBkb2Vzbid0IG1hdGNoIHRoZSB2ZXJzaW9uIGluIHRoZSBob3N0IHNvZnR3YXJlLiAqLworICAgIEJDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fTk5JX1NQRUVEX01JU01BVENIICAgICAgID0gNSwgICAgLyoqPCBUaGUgTk5JIHNwZWVkIG9uIHRoZSBydW5uaW5nIGRldmljZSBkb2Vzbid0IG1hdGNoIHRoZSB2ZXJzaW9uIGluIHRoZSBob3N0IHNvZnR3YXJlLiAqLworICAgIEJDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fUkVDT05ORUNUX1RJTUVPVVQgICAgICAgID0gNiwgICAgLyoqPCBBIHJ1bm5pbmcgZGV2aWNlIGRpZG4ndCByZXNwb25kIHRvIHRoZSByZXF1ZXN0IHRvIHJlY29ubmVjdC4gKi8KKyAgICBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX0lOVEVSTkFMX0VSUk9SICAgICAgICAgICA9IDcsICAgIC8qKjwgQW4gdW5zcGVjaWZpZWQgaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQgLSBjaGVjayB0aGUgbG9nIG91dHB1dCBmb3IgZGV0YWlscy4gKi8KKyAgICBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX1NZU1RFTV9NT0RFX05PVF9TVVBQT1JURUQ9IDgsICAgIC8qKjwgVGhlIGdpdmVuIHN5c3RlbSBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBkZXZpY2UuICovCisgICAgQkNNT0xUX0hPU1RfQ09OTkVDVElPTl9GQUlMX1JFQVNPTl9QQVJBTUVURVIgICAgICAgICAgICAgICAgPSA5LCAgICAvKio8IE9uZSBvZiB0aGUgaW5pdGlhbCBjb25uZWN0aW9uIHBhcmFtZXRlcnMgd2FzIGluY29ycmVjdC4gKi8KKyAgICBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2hvc3RfY29ubmVjdGlvbl9mYWlsX3JlYXNvbjsKKworLyoqIGRlYWN0aXZhdGlvbiByZWFzb24uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2RlYWN0aXZhdGlvbl9yZWFzb24KK3sKKyAgICBCQ01PTFRfREVBQ1RJVkFUSU9OX1JFQVNPTl9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0RFQUNUSVZBVElPTl9SRUFTT05fTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IG5vbmUuICovCisgICAgQkNNT0xUX0RFQUNUSVZBVElPTl9SRUFTT05fREVBQ1RJVkFUSU9OICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IGRlYWN0aXZhdGlvbi4gKi8KKyAgICBCQ01PTFRfREVBQ1RJVkFUSU9OX1JFQVNPTl9BQ0tfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgYWNrIHRpbWVvdXQuICovCisgICAgQkNNT0xUX0RFQUNUSVZBVElPTl9SRUFTT05fU0ZJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IHNmaSBhbGFybS4gKi8KKyAgICBCQ01PTFRfREVBQ1RJVkFUSU9OX1JFQVNPTl9USVdJICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgdGl3aS4gKi8KKyAgICBCQ01PTFRfREVBQ1RJVkFUSU9OX1JFQVNPTl9QQVNTV09SRF9BVVRIRU5USUNBVElPTiAgICAgICAgICA9IDUsICAgIC8qKjwgcGFzc3dvcmQgYXV0aGVudGljYXRpb24uICovCisgICAgQkNNT0xUX0RFQUNUSVZBVElPTl9SRUFTT05fT05VX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAvKio8IG9udSBhbGFybS4gKi8KKyAgICBCQ01PTFRfREVBQ1RJVkFUSU9OX1JFQVNPTl9MT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgIC8qKjwgbG9zLiAqLworICAgIEJDTU9MVF9ERUFDVElWQVRJT05fUkVBU09OX0xPS0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgLyoqPCBsb2tpLiAqLworICAgIEJDTU9MVF9ERUFDVElWQVRJT05fUkVBU09OX1JFUkFOR0VfRkFJTFVSRSAgICAgICAgICAgICAgICAgID0gOSwgICAgLyoqPCByZS1yYW5nZSBmYWlsdXJlLiAqLworICAgIEJDTU9MVF9ERUFDVElWQVRJT05fUkVBU09OX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2RlYWN0aXZhdGlvbl9yZWFzb247CisKKy8qKiBSZXZpc2lvbiBvZiB0aGUgQkNNNjg2MjAgZGV2aWNlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9kZXZpY2VfY2hpcF9yZXZpc2lvbgoreworICAgIEJDTU9MVF9ERVZJQ0VfQ0hJUF9SRVZJU0lPTl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYwLCAgLyoqPCBBMC4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0NISVBfUkVWSVNJT05fQjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3NiAgIC8qKjwgQjAuICovCit9IGJjbW9sdF9kZXZpY2VfY2hpcF9yZXZpc2lvbjsKKworLyoqIERldmljZSBJbWFnZSBUeXBlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHlwZQoreworICAgIEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFlQRV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfREVWSUNFX0lNQUdFX1RZUEVfQk9PVExPQURFUiAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQm9vdGxvYWRlci4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0lNQUdFX1RZUEVfQVBQTElDQVRJT04gICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgQXBwbGljYXRpb24uICovCisgICAgQkNNT0xUX0RFVklDRV9JTUFHRV9UWVBFX0lUVV9QT05fT05VX0ZJUk1XQVJFICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IElUVSBQT04gT05VIGZpcm13YXJlLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFlQRV9FUE9OX09OVV9GSVJNV0FSRSAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBFUE9OIE9OVSBmaXJtd2FyZS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0lNQUdFX1RZUEVfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHlwZTsKKworLyoqIE5ldHdvcmsgaW50ZXJmYWNlIHNwZWVkIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X25uaV9zcGVlZAoreworICAgIEJDTU9MVF9OTklfU1BFRURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfTk5JX1NQRUVEX0dCUFNfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgMUdicHMgKi8KKyAgICBCQ01PTFRfTk5JX1NQRUVEX0dCUFNfMlA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgMi41R2JwcyAqLworICAgIEJDTU9MVF9OTklfU1BFRURfR0JQU18xMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCAxMEdicHMgKi8KKyAgICBCQ01PTFRfTk5JX1NQRUVEX0dCUFNfMTJQNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgMTIuNUdicHMgKi8KKyAgICBCQ01PTFRfTk5JX1NQRUVEX0dCUFNfMTBfR19NVVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgMTBHYnBzIE11eCAqLworICAgIEJDTU9MVF9OTklfU1BFRURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ubmlfc3BlZWQ7CisKKy8qKiBPcHRpb25zIGZvciB0aGUgcmVzZXQgb3BlcmF0aW9uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9kZXZpY2VfcmVzZXRfbW9kZQoreworICAgIEJDTU9MVF9ERVZJQ0VfUkVTRVRfTU9ERV9ERVZJQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBUdXJuIG9mZiB0aGUgZW1iZWRkZWQgZGV2aWNlJ3MgcHJvY2Vzc29yLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfUkVTRVRfTU9ERV9IT1NUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBSZXNldCB0aGUgaG9zdCBwcm9jZXNzb3IuICovCisgICAgQkNNT0xUX0RFVklDRV9SRVNFVF9NT0RFX0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzICAgICAvKio8IFR1cm4gb2ZmIHRoZSBlbWJlZGRlZCBkZXZpY2UncyBwcm9jZXNzb3IgYW5kIHJlc2V0IHRoZSBob3N0IHByb2Nlc3Nvci4gKi8KK30gYmNtb2x0X2RldmljZV9yZXNldF9tb2RlOworCisvKiogVGhlIG92ZXJhbGwgc3RhdGUgb2YgdGhlIGhvc3QncyBjb25uZWN0aW9uIHRvIHRoZSBkZXZpY2UuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2RldmljZV9zdGF0ZQoreworICAgIEJDTU9MVF9ERVZJQ0VfU1RBVEVfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfREVWSUNFX1NUQVRFX0RJU0NPTk5FQ1RFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgVGhlIGhvc3QgaXMgbm90IGNvbm5lY3RlZCB0byB0aGUgZGV2aWNlLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfU1RBVEVfQ09OTkVDVElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBUaGUgaG9zdCBpcyBpbiB0aGUgcHJvY2VzcyBvZiBjb25uZWN0aW5nIHRvIHRoZSBkZXZpY2UuICovCisgICAgQkNNT0xUX0RFVklDRV9TVEFURV9SRUFEWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IFRoZSBkZXZpY2UgaXMgY29ubmVjdGVkIHRvIHRoZSBob3N0IGFuZCBpcyByZWFkeSB0byBhY2NlcHQgYW55IGNvbW1hbmQgZnJvbSB0aGUgaG9zdC4gKi8KKyAgICBCQ01PTFRfREVWSUNFX1NUQVRFX1dBSVRJTkdfRk9SX0RFVklDRSAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgV2FpdGluZyBmb3IgdGhlIGVtYmVkZGVkIHNpZGUgdG8gcmVzcG9uZCB0byBhIGNvbmZpZ3VyYXRpb24gbWVzc2FnZS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX1NUQVRFX1RFU1RJTkdfRERSICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgQSBERFIgdGVzdCBpcyBjdXJyZW50bHkgaW4gcHJvZ3Jlc3MgKi8KKyAgICBCQ01PTFRfREVWSUNFX1NUQVRFX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZGV2aWNlX3N0YXRlOworCisvKiogRGlzYWJsZSBTZXJpYWwgTnVtYmVyIENvbnRyb2wuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Rpc2FibGVfc2VyaWFsX251bWJlcl9jb250cm9sCit7CisgICAgQkNNT0xUX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9DT05UUk9MX19CRUdJTiAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9ESVNBQkxFX1NFUklBTF9OVU1CRVJfQ09OVFJPTF9VTklDQVNUX0RJU0FCTEUgICAgICAgID0gMCwgICAgLyoqPCBVbmljYXN0IERpc2FibGUuICovCisgICAgQkNNT0xUX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9DT05UUk9MX1VOSUNBU1RfRU5BQkxFICAgICAgICAgPSAxLCAgICAvKio8IFVuaWNhc3QgRW5hYmxlLiAqLworICAgIEJDTU9MVF9ESVNBQkxFX1NFUklBTF9OVU1CRVJfQ09OVFJPTF9CUk9BRENBU1RfRU5BQkxFICAgICAgID0gMiwgICAgLyoqPCBCcm9hZGNhc3QgRW5hYmxlLiAqLworICAgIEJDTU9MVF9ESVNBQkxFX1NFUklBTF9OVU1CRVJfQ09OVFJPTF9CUk9BRENBU1RfRElTQUJMRSAgICAgID0gMywgICAgLyoqPCBCcm9hZGNhc3QgRGlzYWJsZS4gKi8KKyAgICBCQ01PTFRfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0NPTlRST0xfRElTQUJMRV9ESVNDT1ZFUlkgICAgICA9IDQsICAgIC8qKjwgRGlzYWJsZSBEaXNjb3ZlcnkuICovCisgICAgQkNNT0xUX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9DT05UUk9MX19OVU1fT0YgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9kaXNhYmxlX3NlcmlhbF9udW1iZXJfY29udHJvbDsKKworLyoqIGRydl9pY2ZfaWQuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Rydl9pY2ZfaWQKK3sKKyAgICBCQ01PTFRfRFJWX0lDRl9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0RSVl9JQ0ZfSURfSURYMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IElEWDAuICovCisgICAgQkNNT0xUX0RSVl9JQ0ZfSURfSURYMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IElEWDEuICovCisgICAgQkNNT0xUX0RSVl9JQ0ZfSURfSURYMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IElEWDIuICovCisgICAgQkNNT0xUX0RSVl9JQ0ZfSURfSURYMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IElEWDMuICovCisgICAgQkNNT0xUX0RSVl9JQ0ZfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Rydl9pY2ZfaWQ7CisKKy8qKiBkcnZfc2diX2lkLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9kcnZfc2diX2lkCit7CisgICAgQkNNT0xUX0RSVl9TR0JfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9EUlZfU0dCX0lEX0lEWDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBJRFgwLiAqLworICAgIEJDTU9MVF9EUlZfU0dCX0lEX0lEWDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBJRFgxLiAqLworICAgIEJDTU9MVF9EUlZfU0dCX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9kcnZfc2diX2lkOworCisvKiogRFMgVkxBTiBhY3Rpb24uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2RzX3ZsYW5fYWN0aW9uCit7CisgICAgQkNNT0xUX0RTX1ZMQU5fQUNUSU9OX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9EU19WTEFOX0FDVElPTl9SRU1PVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBSZW1vdmUuICovCisgICAgQkNNT0xUX0RTX1ZMQU5fQUNUSU9OX1RSQU5TUEFSRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFRyYW5zcGFyZW50LiAqLworICAgIEJDTU9MVF9EU19WTEFOX0FDVElPTl9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZHNfdmxhbl9hY3Rpb247CisKKy8qKiBURkIgVHJhcCBCZWhhdmlvci4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfdGZiX3RyYXBfYmVoYXZpb3IKK3sKKyAgICBCQ01PTFRfVEZCX1RSQVBfQkVIQVZJT1JfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1RGQl9UUkFQX0JFSEFWSU9SX0RST1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IERyb3AuICovCisgICAgQkNNT0xUX1RGQl9UUkFQX0JFSEFWSU9SX0ZPUldBUkRfTk5JICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEZvcndhcmQgTk5JLiAqLworICAgIEJDTU9MVF9URkJfVFJBUF9CRUhBVklPUl9GT1JXQVJEX0NQVSAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBGb3J3YXJkIENQVS4gKi8KKyAgICBCQ01PTFRfVEZCX1RSQVBfQkVIQVZJT1JfU05PT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgU25vb3AuICovCisgICAgQkNNT0xUX1RGQl9UUkFQX0JFSEFWSU9SX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfdGZiX3RyYXBfYmVoYXZpb3I7CisKKy8qKiBURkIgTW9kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfdGZiX21vZGUKK3sKKyAgICBCQ01PTFRfVEZCX01PREVfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1RGQl9NT0RFX0dQT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEdQT04uICovCisgICAgQkNNT0xUX1RGQl9NT0RFX1hHUE9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFhHUE9OLiAqLworICAgIEJDTU9MVF9URkJfTU9ERV9FUE9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBFUE9OLiAqLworICAgIEJDTU9MVF9URkJfTU9ERV9YRVBPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBYRVBPTi4gKi8KKyAgICBCQ01PTFRfVEZCX01PREVfQ09FWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgQ09FWC4gKi8KKyAgICBCQ01PTFRfVEZCX01PREVfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF90ZmJfbW9kZTsKKworLyoqIExJTSBTRUMgTW9kZSBVcC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfbGltX3NlY19tb2RlX3VwCit7CisgICAgQkNNT0xUX0xJTV9TRUNfTU9ERV9VUF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9MSU1fU0VDX01PREVfVVBfVEVLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBUZWtub3Z1cyBlbmNyeXB0aW9uIG1vZGUgKi8KKyAgICBCQ01PTFRfTElNX1NFQ19NT0RFX1VQX1BFUl9MTElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgRW5jcnlwdGlvbiBwZXIgTExJRCwgODAyLjFhZS96ZXJvLW92ZXJoZWFkICovCisgICAgQkNNT0xUX0xJTV9TRUNfTU9ERV9VUF9OVFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IEVQT04gKE5UVCkgZW5jcnlwdGlvbiBtb2RlICovCisgICAgQkNNT0xUX0xJTV9TRUNfTU9ERV9VUF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9saW1fc2VjX21vZGVfdXA7CisKKy8qKiBMSU0gU0VDIE1vZGUgRG4uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2xpbV9zZWNfbW9kZV9kbgoreworICAgIEJDTU9MVF9MSU1fU0VDX01PREVfRE5fX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfTElNX1NFQ19NT0RFX0ROX1RFSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgVGVrbm92dXMgZW5jcnlwdGlvbiBtb2RlICovCisgICAgQkNNT0xUX0xJTV9TRUNfTU9ERV9ETl9QRVJfTExJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEVuY3J5cHRpb24gcGVyIExMSUQsIDgwMi4xYWUvemVyby1vdmVyaGVhZCAqLworICAgIEJDTU9MVF9MSU1fU0VDX01PREVfRE5fTlRUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBFUE9OIChOVFQpIGVuY3J5cHRpb24gbW9kZSAqLworICAgIEJDTU9MVF9MSU1fU0VDX01PREVfRE5fQ0VQT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBDRVBPTiAoM0NodXJuKSBlbmNyeXB0aW9uIG1vZGUgKi8KKyAgICBCQ01PTFRfTElNX1NFQ19NT0RFX0ROX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2xpbV9zZWNfbW9kZV9kbjsKKworLyoqIFhJTSBTRUMgTW9kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGltX3NlY19tb2RlCit7CisgICAgQkNNT0xUX1hJTV9TRUNfTU9ERV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YSU1fU0VDX01PREVfUkVTRVJWRURfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBSZXNlcnZlZCAwLiAqLworICAgIEJDTU9MVF9YSU1fU0VDX01PREVfUEVSX0xMSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBQZXIgTExJRC4gKi8KKyAgICBCQ01PTFRfWElNX1NFQ19NT0RFX1JFU0VSVkVEXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgUmVzZXJ2ZWQgMi4gKi8KKyAgICBCQ01PTFRfWElNX1NFQ19NT0RFX0NFUE9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgQ0VQT04uICovCisgICAgQkNNT0xUX1hJTV9TRUNfTU9ERV9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hpbV9zZWNfbW9kZTsKKworLyoqIEhTQyBSQU0uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2hzY19yYW0KK3sKKyAgICBCQ01PTFRfSFNDX1JBTV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0hTQ19SQU1fTExDX1QxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IExMQyBUMS4gKi8KKyAgICBCQ01PTFRfSFNDX1JBTV9MTENfVDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgTExDIFQyLiAqLworICAgIEJDTU9MVF9IU0NfUkFNX0xMQ19UMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBMTEMgVDMuICovCisgICAgQkNNT0xUX0hTQ19SQU1fR1JQX1QyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IEdycCBUMi4gKi8KKyAgICBCQ01PTFRfSFNDX1JBTV9HUlBfVDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgR3JwIFQzLiAqLworICAgIEJDTU9MVF9IU0NfUkFNX1NIUF9UMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgLyoqPCBTaHAgVDEuICovCisgICAgQkNNT0xUX0hTQ19SQU1fU0hQX1QyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAvKio8IFNocCBUMi4gKi8KKyAgICBCQ01PTFRfSFNDX1JBTV9TSFBfVDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgIC8qKjwgU2hwIFQzLiAqLworICAgIEJDTU9MVF9IU0NfUkFNX1BSRl9UMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgLyoqPCBQcmYgVDEuICovCisgICAgQkNNT0xUX0hTQ19SQU1fUFJGX1QyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5LCAgICAvKio8IFByZiBUMi4gKi8KKyAgICBCQ01PTFRfSFNDX1JBTV9QUkZfVDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgIC8qKjwgUHJmIFQzLiAqLworICAgIEJDTU9MVF9IU0NfUkFNX0NSRV9UMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEsICAgLyoqPCBDcmUgVDEuICovCisgICAgQkNNT0xUX0hTQ19SQU1fQ1JFX1QyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMiwgICAvKio8IENyZSBUMi4gKi8KKyAgICBCQ01PTFRfSFNDX1JBTV9DUkVfVDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgIC8qKjwgQ3JlIFQzLiAqLworICAgIEJDTU9MVF9IU0NfUkFNX0VMVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQsICAgLyoqPCBFTFUuICovCisgICAgQkNNT0xUX0hTQ19SQU1fUFRSX1QxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNSwgICAvKio8IFB0ciBUMS4gKi8KKyAgICBCQ01PTFRfSFNDX1JBTV9QVFJfVDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2LCAgIC8qKjwgUHRyIFQyLiAqLworICAgIEJDTU9MVF9IU0NfUkFNX0FHUl9TSFBfVDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTcsICAgLyoqPCBBZ3IgU2hwIFQxLiAqLworICAgIEJDTU9MVF9IU0NfUkFNX0FFTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgsICAgLyoqPCBBRU0uICovCisgICAgQkNNT0xUX0hTQ19SQU1fQUxMX0xMQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOSwgICAvKio8IEFsbCBMTEMuICovCisgICAgQkNNT0xUX0hTQ19SQU1fX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfaHNjX3JhbTsKKworLyoqIExJTSBSQU0uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2xpbV9yYW0KK3sKKyAgICBCQ01PTFRfTElNX1JBTV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0xJTV9SQU1fTExJRF9VUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IExMSUQgVXAuICovCisgICAgQkNNT0xUX0xJTV9SQU1fUEVSX09OVV9TVEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFBlciBPTlUgU3RhdC4gKi8KKyAgICBCQ01PTFRfTElNX1JBTV9GRUNfVVBfRlVMTF9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgRkVDIFVwIEZ1bGwgUy4gKi8KKyAgICBCQ01PTFRfTElNX1JBTV9GRUNfVVBfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgRkVDIFVwIERhdGEuICovCisgICAgQkNNT0xUX0xJTV9SQU1fX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfbGltX3JhbTsKKworLyoqIExLWSBSQU0uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2xreV9yYW0KK3sKKyAgICBCQ01PTFRfTEtZX1JBTV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0xLWV9SQU1fVFhfS0VZX1JBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFR4IEtleSBSQU0uICovCisgICAgQkNNT0xUX0xLWV9SQU1fVFhfS0VZX0JVRkZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFR4IEtleSBCdWZmZXIuICovCisgICAgQkNNT0xUX0xLWV9SQU1fUlhfS0VZX1JBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IFJ4IEtleSBSQU0uICovCisgICAgQkNNT0xUX0xLWV9SQU1fUlhfS0VZX0JVRkZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IFJ4IEtleSBCdWZmZXIuICovCisgICAgQkNNT0xUX0xLWV9SQU1fX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfbGt5X3JhbTsKKworLyoqIE1JQyBSQU0uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X21pY19yYW0KK3sKKyAgICBCQ01PTFRfTUlDX1JBTV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX01JQ19SQU1fUkFOR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFJhbmdlLiAqLworICAgIEJDTU9MVF9NSUNfUkFNX0xMSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBMTElELiAqLworICAgIEJDTU9MVF9NSUNfUkFNX0lEWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBJbmRleC4gKi8KKyAgICBCQ01PTFRfTUlDX1JBTV9HUkFOVF9NSVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgR3JhbnQgTWlzcy4gKi8KKyAgICBCQ01PTFRfTUlDX1JBTV9HUkFOVF9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgR3JhbnQgSUQuICovCisgICAgQkNNT0xUX01JQ19SQU1fVFhfSVYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IFR4IElWLiAqLworICAgIEJDTU9MVF9NSUNfUkFNX1JYX0lWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBSeCBJVi4gKi8KKyAgICBCQ01PTFRfTUlDX1JBTV9UWF9QT1JUX1NUQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgIC8qKjwgVHggUG9ydCBTdGF0LiAqLworICAgIEJDTU9MVF9NSUNfUkFNX1JYX1BPUlRfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgLyoqPCBSeCBQb3J0IFN0YXQuICovCisgICAgQkNNT0xUX01JQ19SQU1fX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfbWljX3JhbTsKKworLyoqIFhQQ1NSTSBSQU0uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hwY3NybV9yYW0KK3sKKyAgICBCQ01PTFRfWFBDU1JNX1JBTV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hQQ1NSTV9SQU1fQ0FQVFVSRV9GSUZPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IENhcHR1cmUgRklGTy4gKi8KKyAgICBCQ01PTFRfWFBDU1JNX1JBTV9GRUNfREVDT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgRkVDIERlY29kZS4gKi8KKyAgICBCQ01PTFRfWFBDU1JNX1JBTV9GRUNfU1RBVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgRkVDIFN0YXRzLiAqLworICAgIEJDTU9MVF9YUENTUk1fUkFNX0ZFQ19FTlFVRVVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBGRUMgRW5xdWV1ZS4gKi8KKyAgICBCQ01PTFRfWFBDU1JNX1JBTV9JRExFX0lOU0VSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgSWRsZSBJbnNlcnQuICovCisgICAgQkNNT0xUX1hQQ1NSTV9SQU1fX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hwY3NybV9yYW07CisKKy8qKiBlbWJlZGRlZCBpbWFnZSB0cmFuc2ZlciBzdGF0dXMuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2VtYmVkZGVkX2ltYWdlX3RyYW5zZmVyX3N0YXR1cworeworICAgIEJDTU9MVF9FTUJFRERFRF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfX0JFR0lOICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRU1CRURERURfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX05PTkUgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgTm8gZmlsZS4gIFRyYW5zZmVyIGhhcyBuZXZlciBzdGFydGVkIGZvciB0aGlzIGVudHJ5LiAqLworICAgIEJDTU9MVF9FTUJFRERFRF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfSU5fUFJPR1JFU1MgICAgICAgICAgID0gMSwgICAgLyoqPCBUcmFuc2ZlciBoYXMgc3RhcnRlZCBhbmQgbm90IGZpbmlzaGVkLiAqLworICAgIEJDTU9MVF9FTUJFRERFRF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfU1VDQ0VTUyAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBUcmFuc2ZlciBoYXMgZmluaXNoZWQgc3VjY2Vzc2Z1bGx5LiAqLworICAgIEJDTU9MVF9FTUJFRERFRF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfRkFJTFVSRSAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBUcmFuc2ZlciBmYWlsZWQuICBUeXBpY2FsbHkgZHVlIHRvIENSQyBlcnJvci4gKi8KKyAgICBCQ01PTFRfRU1CRURERURfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX19OVU1fT0YgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2VtYmVkZGVkX2ltYWdlX3RyYW5zZmVyX3N0YXR1czsKKworLyoqIEVQT04gRW5jcnlwdGlvbiBpbmZvcm1hdGlvbiBmb3JtYXQuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9mb3JtYXQKK3sKKyAgICBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX0lORk9STUFUSU9OX0ZPUk1BVF9fQkVHSU4gICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fRU5DUllQVElPTl9JTkZPUk1BVElPTl9GT1JNQVRfQ0ZCICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IENGQi4gKi8KKyAgICBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX0lORk9STUFUSU9OX0ZPUk1BVF9DVFIgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgQ1RSLiAqLworICAgIEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fSU5GT1JNQVRJT05fRk9STUFUX19OVU1fT0YgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2Zvcm1hdDsKKworLyoqIGVuZXJneSBkZXRlY3Qgc291cmNlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lbmVyZ3lfZGV0ZWN0X3NvdXJjZQoreworICAgIEJDTU9MVF9FTkVSR1lfREVURUNUX1NPVVJDRV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRU5FUkdZX0RFVEVDVF9TT1VSQ0VfSU5URVJOQUwgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgaW50ZXJuYWwuICovCisgICAgQkNNT0xUX0VORVJHWV9ERVRFQ1RfU09VUkNFX1RSWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFRSWC4gKi8KKyAgICBCQ01PTFRfRU5FUkdZX0RFVEVDVF9TT1VSQ0VfQkNEUiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgQkNEUi4gKi8KKyAgICBCQ01PTFRfRU5FUkdZX0RFVEVDVF9TT1VSQ0VfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lbmVyZ3lfZGV0ZWN0X3NvdXJjZTsKKworLyoqIEVQT04gdHVyYm8gbW9kZS4gIEVuYWJsZXMgZG91YmxlIGRvd25zdHJlYW0gc3BlZWQgKDJHKSBvbiAxRyBFUE9OIE5JcyAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uXzFnX3R1cmJvX21vZGUKK3sKKyAgICBCQ01PTFRfRVBPTl8xR19UVVJCT19NT0RFX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fMUdfVFVSQk9fTU9ERV9ESVNBQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFR1cmJvIG1vZGUgaXMgZGlzYWJsZWQgLSBFUE9OIE5JIGhhcyBhIGRvd3N0cmVhbSBkYXRhIHJhdGUgb2YgMUcuICovCisgICAgQkNNT0xUX0VQT05fMUdfVFVSQk9fTU9ERV9FTkFCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFR1cmJvIG1vZGUgaXMgZW5hYmxlZCAtIEVQT04gTkkgaGFzIGEgZG93c3RyZWFtIGRhdGEgcmF0ZSBvZiAyRy4gKi8KKyAgICBCQ01PTFRfRVBPTl8xR19UVVJCT19NT0RFX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uXzFnX3R1cmJvX21vZGU7CisKKy8qKiBFUE9OIENsb2NrIFRyYW5zcG9ydCBNb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9tb2RlCit7CisgICAgQkNNT0xUX0VQT05fQ0xPQ0tfVFJBTlNQT1JUX01PREVfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX0NMT0NLX1RSQU5TUE9SVF9NT0RFX0hPU1RfRFJJVkVOICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBBdCBlYWNoIHB1bHNlLCB0aGUgTWFwbGUgd2lsbCBpc3N1ZSBhbiBpbmRpY2F0aW9uIHRvIHRoZSBob3N0IGNvbnRhaW5pbmcgdGhlIGVxdWl2YWxlbnQgTVBDUCB0aW1lIGZvciB0aGlzIFBPTi4gKi8KKyAgICBCQ01PTFRfRVBPTl9DTE9DS19UUkFOU1BPUlRfTU9ERV9FTUJFRERFRF9EUklWRU4gICAgICAgICAgICA9IDEsICAgIC8qKjwgQXQgZWFjaCBwdWxzZSwgdGhlIE1hcGxlIHdpbGwgcGFyc2UgdGhlIFRvRCBmcm9tIHRoZSBzZWNvbmQgVUFSVCAoaWYgYXZhaWxhYmxlKSBhbmQgdGhlbiBmb3JtYXQgYW5kIHNlbmQgZG93biBhbiBJRUVFIDgwMi4xYXMgY2xvY2sgdHJhbnNwb3J0IHRpbWUgc3luYyBtZXNzYWdlIHRvIGVhY2ggdXNlciBsaW5rLiAqLworICAgIEJDTU9MVF9FUE9OX0NMT0NLX1RSQU5TUE9SVF9NT0RFX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfbW9kZTsKKworLyoqIENvbnRyb2wgZm9yIGhvdyB0aGUgREJBIGhhbmRsZXMgcmVjZWl2ZWQgTVBDUCByZXBvcnQgZnJhbWVzLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2RiYV9yZXBvcnRpbmdfbW9kZQoreworICAgIEJDTU9MVF9FUE9OX0RCQV9SRVBPUlRJTkdfTU9ERV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9EQkFfUkVQT1JUSU5HX01PREVfU0lFUE9OX0EgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgSGFuZGxlIHJlcG9ydHMgYXMgc3BlY2lmaWVkIGJ5IFNJRVBPTiBwYWNrYWdlIEEuICovCisgICAgQkNNT0xUX0VQT05fREJBX1JFUE9SVElOR19NT0RFX1NJRVBPTl9CICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEhhbmRsZSByZXBvcnRzIGFzIHNwZWNpZmllZCBieSBTSUVQT04gcGFja2FnZSBCLiAqLworICAgIEJDTU9MVF9FUE9OX0RCQV9SRVBPUlRJTkdfTU9ERV9TSUVQT05fQyAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBIYW5kbGUgcmVwb3J0cyBhcyBzcGVjaWZpZWQgYnkgU0lFUE9OIHBhY2thZ2UgQyAqLworICAgIEJDTU9MVF9FUE9OX0RCQV9SRVBPUlRJTkdfTU9ERV9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX2RiYV9yZXBvcnRpbmdfbW9kZTsKKworLyoqIEVQT04gbGluayByYXRlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2xpbmtfcmF0ZQoreworICAgIEJDTU9MVF9FUE9OX0xJTktfUkFURV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfVEVOX1RFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgVGVuX1Rlbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfVEVOX09ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgVGVuX09uZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfT05FX09ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgT25lX09uZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19yYXRlOworCisvKiogU3RhdHVzLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9zdGF0dXMKK3sKKyAgICBCQ01PTFRfU1RBVFVTX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1NUQVRVU19PRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFN0YXR1cyBpcyBvZmYuICovCisgICAgQkNNT0xUX1NUQVRVU19PTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFN0YXR1cyBpcyBvbi4gKi8KKyAgICBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgU3RhdHVzIHNob3VsZCBub3QgYmUgY2hhbmdlZCAodmFsaWQgZm9yIFNFVCBBUEkgY2FsbHMgb25seSkuICovCisgICAgQkNNT0xUX1NUQVRVU19fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfc3RhdHVzOworCisvKiogRVBPTiBlbmNyeXB0aW9uIG1vZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9tb2RlCit7CisgICAgQkNNT0xUX0VQT05fRU5DUllQVElPTl9NT0RFX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fTU9ERV9OT19FTkNSWVBUSU9OICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBObyBlbmNyeXB0aW9uIG9mIGFueSBraW5kLiAqLworICAgIEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fTU9ERV9FUE9OX1RSSVBMRV9DSFVSTklORyAgICAgICAgICAgID0gMSwgICAgLyoqPCBFUE9OIHRyaXBsZS1jaHVybmluZyBtb2RlIHBlciBDVEMgc3BlY2lmaWNhdGlvbi4gICovCisgICAgQkNNT0xUX0VQT05fRU5DUllQVElPTl9NT0RFX0VQT05fWkVST19PVkVSSEVBRF9BRVMgICAgICAgICAgPSAyLCAgICAvKio8IEVQT04gemVyby1vdmVyaGVhZCBBRVMgbW9kZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX01PREVfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fbW9kZTsKKworLyoqIEVwb24gS2V5IENob2ljZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9rZXlfY2hvaWNlCit7CisgICAgQkNNT0xUX0VQT05fS0VZX0NIT0lDRV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX0tFWV9DSE9JQ0VfS0VZXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBLZXkgMC4gKi8KKyAgICBCQ01PTFRfRVBPTl9LRVlfQ0hPSUNFX0tFWV8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgS2V5IDEuICovCisgICAgQkNNT0xUX0VQT05fS0VZX0NIT0lDRV9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX2tleV9jaG9pY2U7CisKKy8qKiBFUE9OIEVuY3J5cHRpb24gRGlyZWN0aW9uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fZGlyZWN0aW9uCit7CisgICAgQkNNT0xUX0VQT05fRU5DUllQVElPTl9ESVJFQ1RJT05fX0JFR0lOICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fRElSRUNUSU9OX0RPV05TVFJFQU1fT05MWSAgICAgICAgICAgID0gMCwgICAgLyoqPCBFbmNyeXB0IGRvd25zdHJlYW0gdHJhZmZpYyBvbmx5LiAqLworICAgIEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fRElSRUNUSU9OX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2RpcmVjdGlvbjsKKworLyoqIEVQT04gRkVDIGVuYWJsZSBzdGF0ZS4gIFNlZSBmbGFnIGRlc2NyaXB0aW9ucyBmb3IgcmVzdHJpY3Rpb25zLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2ZlY19lbl9zdGF0ZQoreworICAgIEJDTU9MVF9FUE9OX0ZFQ19FTl9TVEFURV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9GRUNfRU5fU1RBVEVfRElTQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgRkVDIGlzIGRpc2FibGVkLiAqLworICAgIEJDTU9MVF9FUE9OX0ZFQ19FTl9TVEFURV9FTkFCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBGRUMgaXMgZW5hYmxlZC4gICBOb3RlOiBGRUMgY2FuIG9ubHkgYmUgZW5hYmxlZCBhbmQgZGlzYWJsZWQgUE9OLXdpZGUgZm9yIDEwRyBwYXRocywgYnV0IGNhbiBiZSBlbmFibGVkIGFuZCBkaXNhYmxlZCB3aXRoIGxvZ2ljYWwgbGluayBncmFudWxhcml0eSBmb3IgMUcgcGF0aHMuICovCisgICAgQkNNT0xUX0VQT05fRkVDX0VOX1NUQVRFX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGU7CisKKy8qKiBUaGUgdHlwZXMgb2YgT0FNIHRvIGNob29zZSBmcm9tLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV90eXBlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1RZUEVfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX09BTV9UWVBFX0JST0FEQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBCcm9hZGNvbSBPQU0gKGZvcm1lcmx5IFRFSykuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RZUEVfQ1RDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IENUQyBPQU0uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RZUEVfRFBPRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IERQb0UgT0FNICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RZUEVfU0lFUE9OQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IFNpRVBPTiBPQU0uIChNb3N0bHkgc2ltaWxhciB0byBEUG9FKS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVFlQRV9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3R5cGU7CisKKy8qKiBlcG9uIGxpbmsgZmVjIHN0YXRlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2xpbmtfZmVjX3N0YXRlCit7CisgICAgQkNNT0xUX0VQT05fTElOS19GRUNfU1RBVEVfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX0xJTktfRkVDX1NUQVRFX0RJU0FCTEVEICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBEaXNhYmxlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX0ZFQ19TVEFURV9FTkFCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgRW5hYmxlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX0ZFQ19TVEFURV9VU0VfREVGQVVMVCAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgVXNlIGRlZmF1bHRzLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfRkVDX1NUQVRFX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19mZWNfc3RhdGU7CisKKy8qKiBUaGUgY3VycmVudCByZWdpc3RyYXRpb24gc3RhdHVzIG9mIGEgbGluay4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9saW5rX3N0YXR1cworeworICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVFVTX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRVU19ESVNDT1ZFUkVEICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMSwgICAvKio8IExpbmsgaGFzIGNvbXBsZXRlZCBNUENQIHJlZ2lzdHJhdGlvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRVU19SRUdJU1RSQVRJT05fUFJFVkVOVEVEICAgICAgICAgICAgICA9IDB4MDAwOCAgICAvKio8IExpbmsgaXMgYmVpbmcgcHJldmVudGVkIGZyb20gcmVnaXN0ZXJpbmcuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfc3RhdHVzOworCisvKiogTVBDUCBkaXNjb3ZlcnkgaW5mby4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfbXBjcF9kaXNjb3ZlcnlfaW5mbworeworICAgIEJDTU9MVF9NUENQX0RJU0NPVkVSWV9JTkZPX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfTVBDUF9ESVNDT1ZFUllfSU5GT19PTkVfR19DQVBBQkxFICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMSwgICAvKio8IDFHIENhcGFibGUuICovCisgICAgQkNNT0xUX01QQ1BfRElTQ09WRVJZX0lORk9fVEVOX0dfQ0FQQUJMRSAgICAgICAgICAgICAgICAgICAgPSAweDAwMDIsICAgLyoqPCAxMEcgQ2FwYWJsZS4gKi8KKyAgICBCQ01PTFRfTVBDUF9ESVNDT1ZFUllfSU5GT19PTkVfR19XSU5ET1cgICAgICAgICAgICAgICAgICAgICA9IDB4MDAxMCwgICAvKio8IDFHIHdpbmRvdy4gKi8KKyAgICBCQ01PTFRfTVBDUF9ESVNDT1ZFUllfSU5GT19URU5fR19XSU5ET1cgICAgICAgICAgICAgICAgICAgICA9IDB4MDAyMCAgICAvKio8IDEwRyB3aW5kb3cuICovCit9IGJjbW9sdF9tcGNwX2Rpc2NvdmVyeV9pbmZvOworCisvKiogRVBPTiBsaW5rIHN0YXRlIGZsYWdzIHJlZmxlY3QgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBsaW5rLiAgCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9saW5rX3N0YXRlX2ZsYWdzCit7CisgICAgQkNNT0xUX0VQT05fTElOS19TVEFURV9GTEFHU19OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVEVfRkxBR1NfTVBDUF9SRUdJU1RSQVRJT05fQ09NUExFVEUgICAgID0gMHgwMDAxICAgIC8qKjwgTGluayBoYXMgY29tcGxldGVkIE1QQ1AgcmVnaXN0cmF0aW9uLiAqLworfSBiY21vbHRfZXBvbl9saW5rX3N0YXRlX2ZsYWdzOworCisvKiogRVBPTiBMaW5rIFR5cGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fbGlua190eXBlCit7CisgICAgQkNNT0xUX0VQT05fTElOS19UWVBFX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX0xJTktfVFlQRV9TWVNURU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgIC8qKjwgQSBMaW5rIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBmb3Igc3lzdGVtIHVzYWdlLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfVFlQRV9ET1dOU1RSRUFNX09OTFkgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgIC8qKjwgQSBMaW5rIHRoYXQgZG9lcyBub3QgY29uc3VtZSB1cHN0cmVhbSBiYW5kd2lkdGguICovCisgICAgQkNNT0xUX0VQT05fTElOS19UWVBFX0JJRElSRUNUSU9OQUwgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgLyoqPCBBIExpbmsgdGhhdCB1bmRlcmdvZXMgdGhlIE1QQ1AgcmVnaXN0cmF0aW9uIHByb2Nlc3MuICovCisgICAgQkNNT0xUX0VQT05fTElOS19UWVBFX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfdHlwZTsKKworLyoqIE1QQ1AgZ2F0ZSBtb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9tcGNwX2dhdGVfbW9kZQoreworICAgIEJDTU9MVF9NUENQX0dBVEVfTU9ERV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfTVBDUF9HQVRFX01PREVfVEVLTk9WVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgVGVrbm92dXMgTVBDUCByZWdpc3RyYXRpb24gbW9kZS4gKi8KKyAgICBCQ01PTFRfTVBDUF9HQVRFX01PREVfQ1VTVE9NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgTm9uLVRla25vdnVzIE1QQ1AgcmVnaXN0cmF0aW9uIG1vZGUuICovCisgICAgQkNNT0xUX01QQ1BfR0FURV9NT0RFX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9tcGNwX2dhdGVfbW9kZTsKKworLyoqIE1QQ1AgcmVnaXN0cmF0aW9uIGdhdGUgZmxhZ3MuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X21wY3BfcmVnaXN0cmF0aW9uX2dhdGVfZmxhZ3MKK3sKKyAgICBCQ01PTFRfTVBDUF9SRUdJU1RSQVRJT05fR0FURV9GTEFHU19OT05FICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX01QQ1BfUkVHSVNUUkFUSU9OX0dBVEVfRkxBR1NfRk9SQ0VfUkVQT1JUICAgICAgICAgICAgPSAweDAwMDEgICAgLyoqPCBGb3JjZSByZXBvcnQgYml0LiAqLworfSBiY21vbHRfbXBjcF9yZWdpc3RyYXRpb25fZ2F0ZV9mbGFnczsKKworLyoqIEVuYWJsZSBzdGF0ZSBvZiB0aGUgRVBPTiBOSS4gIEluaXRpYWxseSB0aGUgb25seSBlbmFibGUgc3RhdGVzIGRlZmluZWQgYXJlIAorICogYGRpc2FibGVkJyBhbmQgYGVuYWJsZWQnLCBidXQgdGhpcyBtYXkgbGF0ZXIgYmUgZXh0ZW5kZWQgdG8gaW5jbHVkZSAKKyAqIGRpZmZlcmVudCBkZWdyZWVzIG9mIGVuYWJsZW1lbnQuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fbmlfZW5fc3RhdGUKK3sKKyAgICBCQ01PTFRfRVBPTl9OSV9FTl9TVEFURV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fTklfRU5fU1RBVEVfRElTQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgLyoqPCBFUE9OIE5JIGlzIGZ1bGx5IGRpc2FibGVkLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0VOX1NUQVRFX0VOQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgIC8qKjwgRVBPTiBOSSBpcyBmdWxseSBlbmFibGVkLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0VOX1NUQVRFX1BST1RFQ1RFRF9XT1JLSU5HICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgIC8qKjwgRVBPTiBOSSBpcyBmdWxseSBlbmFibGVkLiByZWR1bmRhbnQgYW5kIGFjdGl2aWx5IGNhcnJ5aW5nIHRyYWZmaWMuICovCisgICAgQkNNT0xUX0VQT05fTklfRU5fU1RBVEVfUFJPVEVDVEVEX1NUQU5EQlkgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgLyoqPCBFUE9OIE5JIGlzIGZ1bGx5IGVuYWJsZWQuIHJlZHVuZGFudCBhbmQgcHJvdGVjdGluZyBhbm90aGVyIFBPTi4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9FTl9TVEFURV9QUk9DRVNTSU5HICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAvKio8IEVQT04gTkkgaXMgY3VycmVudGx5IHRyYW5zaXRpb25pbmcgYmV0d2VlbiBzdGF0ZXMgKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9FTl9TVEFURV9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fbmlfZW5fc3RhdGU7CisKKy8qKiBFUE9OIE9BTSBFeHRlbnNpb24gVHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZXh0ZW5zaW9uX3R5cGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fT0FNX0VYVEVOU0lPTl9UWVBFX1JFU0VSVkVEICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFJlc2VydmVkICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VYVEVOU0lPTl9UWVBFX0JST0FEQ09NICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEJyb2FkY29tICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VYVEVOU0lPTl9UWVBFX0NUQyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IENoaW5hIFRlbGVjb20gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfREFTQU4gICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgRGFzYW4gTmV0d29ya3MgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfS1QgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgS29yZWEgVGVsZWNvbSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FWFRFTlNJT05fVFlQRV9EUE9FICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgLyoqPCBEUG9FICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VYVEVOU0lPTl9UWVBFX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2V4dGVuc2lvbl90eXBlOworCisvKiogMSB0byAxMSBtYXRjaGUgdGhlIERQb0UgcmVzcG9uc2UgY29kZS4gIFJlZmVyIHRvIERQb0UtU1AtT0FNdjEuMC1JMDgtMTQwODA3LCAKKyAqIENsLiAxMi4xLjMuIDIxIHRvIDI4IGFyZSB1c2VkIGZvciBDVEMuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfb251X3Jlc3BvbnNlX2NvZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9PSyAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IE5vIGVycm9ycy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9VTkRFRklORUQgICAgICAgICAgICAgPSAxLCAgICAvKio8IFVua25vd24gZXJyb3IsIG9yIG9uZSBub3QgY292ZXJlZCBlbHNld2hlcmUuICovCisgICAgQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfTk9UX0ZPVU5EICAgICAgICAgICAgID0gMiwgICAgLyoqPCBSZWFkIHJlcXVlc3RlZCBmaWxlIHRoYXQgaXMgbm90IGF2YWlsYWJsZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9OT19BQ0NFU1MgICAgICAgICAgICAgPSAzLCAgICAvKio8IEFjY2VzcyBwZXJtaXNzaW9ucyBkbyBub3QgYWxsb3cgdGhlIHJlcXVlc3RlZCByZWFkL3dyaXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX0ZVTEwgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgU3RvcmFnZSBpcyBmdWxsLCBhbmQgY2Fubm90IGhvbGQgdGhlIHdyaXR0ZW4gZmlsZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9JTExFR0FMX09QRVJBVElPTiAgICAgPSA1LCAgICAvKio8IENhbm5vdCBwZXJmb3JtIHJlcXVlc3RlZCBvcGVyYXRpb24gaW4gY3VycmVudCBzdGF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9VTktOT1dOX0lEICAgICAgICAgICAgPSA2LCAgICAvKio8IFJlcXVlc3RlZCBmaWxlIElEIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBkZXZpY2UuICovCisgICAgQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfQkFEX0JMT0NLICAgICAgICAgICAgID0gNywgICAgLyoqPCBCbG9jayByZWNlaXZlZCBpbiBlcnJvci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9USU1FT1VUICAgICAgICAgICAgICAgPSA4LCAgICAvKio8IE5vIGJsb2NrIHJlY2VpdmVkIGJlZm9yZSB0aW1lciBleHBpcmF0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX0JVU1kgICAgICAgICAgICAgICAgICA9IDksICAgIC8qKjwgQ2Fubm90IHBlcmZvcm0gcmVxdWVzdGVkIGFjdGlvbiBkdWUgdG8gb3RoZXIgYWN0aXZpdHkuICovCisgICAgQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfSU5DT01QQVRJQkxFX0ZJTEUgICAgID0gMTAsICAgLyoqPCBSZWNlaXZlZCBmaWxlIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoaXMgZGV2aWNlLiBGaWxlIGluY29tcGF0aWJpbGl0eSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBkZXZpY2UgdmVuZG9yLiAqLworICAgIEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX0NPUlJVUFRFRF9GSUxFICAgICAgICA9IDExLCAgIC8qKjwgRmlsZSB3YXMgcmVjZWl2ZWQgY29ycnVwdGVkIGFuZCBpcyB1bnVzYWJsZSBieSB0aGlzIGRldmljZS4gRmlsZSBpbnRlZ3JpdHkgaXMgZGV0ZXJtaW5lZCBieSB0aGUgZGV2aWNlIHZlbmRvci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9FUlJPUl9OT1RfREVGSU5FRCAgICAgPSAyMSwgICAvKio8IE9OVSByZXR1cm5lZCBFUlJPUiBQRFU6IFVuZGVmaW5lZCBlcnJvciBjb2RlLiAqLworICAgIEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX0VSUk9SX0FMTE9DX0VYQ0VFREVEICA9IDIyLCAgIC8qKjwgT05VIHJldHVybmVkIEVSUk9SIFBEVTogRGlzayBmdWxsIG9yIGFsbG9jYXRpb24gZXhjZWVkZWQuICovCisgICAgQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfRVJST1JfSUxMRUdBTF9PUCAgICAgID0gMjMsICAgLyoqPCBPTlUgcmV0dXJuZWQgRVJST1IgUERVOiBJbGxlZ2FsIFRGVFAgb3BlcmF0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX0VSUk9SX0ZJTEVfRVhJU1RTICAgICA9IDI0LCAgIC8qKjwgT05VIHJldHVybmVkIEVSUk9SIFBEVTogTWlycm9yIGZpbGUgYWxyZWFkeSBleGlzdHMuICovCisgICAgQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfRU5EX1dSSVRJTkdfTlZTICAgICAgID0gMjUsICAgLyoqPCBPTlUgcmV0dXJuZWQgRU5EIFJFU1BPTlNFIFBEVSB3aXRoIGVycm9yOiBXcml0aW5nIGZpbGUgdG8gTlZTICovCisgICAgQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfRU5EX0NSQ19FUlJPUiAgICAgICAgID0gMjYsICAgLyoqPCBPTlUgcmV0dXJuZWQgRU5EIFJFU1BPTlNFIFBEVSB3aXRoIGVycm9yOiBDUkMzMiBlcnJvciAqLworICAgIEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX0VORF9QQVJBTV9FUlJPUiAgICAgICA9IDI3LCAgIC8qKjwgT05VIHJldHVybmVkIEVORCBSRVNQT05TRSBQRFUgd2l0aCBlcnJvcjogUGFyYW1ldGVyIGVycm9yICovCisgICAgQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfRU5EX0NNRF9VTlNVUFBPUlRFRCAgID0gMjgsICAgLyoqPCBPTlUgcmV0dXJuZWQgRU5EIFJFU1BPTlNFIFBEVSB3aXRoIGVycm9yOiBDb21tYW5kIG5vdCBzdXBwb3J0ZWQgKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9MQVNUICAgICAgICAgICAgICAgICAgPSAyOSAgICAvKio8IExhc3QuICovCit9IGJjbW9sdF9lcG9uX29udV91cGdyYWRlX29udV9yZXNwb25zZV9jb2RlOworCisvKiogRVBPTiBPTlUgVXBncmFkZSBSZXR1cm4gQ29kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9yZXR1cm5fY29kZQoreworICAgIEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX1JFVFVSTl9DT0RFX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fT05VX1VQR1JBREVfUkVUVVJOX0NPREVfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBDb21tYW5kIHN1Y2NlZWRlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9SRVRVUk5fQ09ERV9PTlVfUkVTUE9OU0VfVElNRU9VVCAgICAgICAgPSAxLCAgICAvKio8IE9OVSBkaWQgbm90IHJlc3BvbmQgdG8gYSBtZXNzYWdlIHdpdGhpbiB0aGUgdGltZSBzcGVjaWZpZWQgYnkgdGhlICJXcml0ZSByZXF1ZXN0IHRpbWVvdXQiLiAqLworICAgIEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX1JFVFVSTl9DT0RFX09OVV9FUlJPUl9SRVNQT05TRSAgICAgICAgICA9IDIsICAgIC8qKjwgRXJyb3IgZm91bmQgaW4gdGhlIE9OVSByZXNwb25zZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9SRVRVUk5fQ09ERV9TWU5DX0VSUk9SICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IEJsb2NrIG51bWJlciBzeW5jIGVycm9yLiAqLworICAgIEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX1JFVFVSTl9DT0RFX0NPTU1JVF9GQUlMRUQgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgQ29tbWl0IHNvZnR3YXJlIGNvbW1hbmQgZmFpbGVkLiAqLworICAgIEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX1JFVFVSTl9DT0RFX0lOVEVSTkFMICAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgSW50ZXJuYWwgZXJyb3IuICovCisgICAgQkNNT0xUX0VQT05fT05VX1VQR1JBREVfUkVUVVJOX0NPREVfUEFSU0VfRVJST1IgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBVbmFibGUgdG8gcGFyc2UgdGhlIE9OVSByZXNwb25zZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9SRVRVUk5fQ09ERV9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcmV0dXJuX2NvZGU7CisKKy8qKiBJbmRpY2F0ZXMgd2hldGhlciBsaW5rcyBhcmUgdW5wcm90ZWN0ZWQsIHByb3RlY3RlZCBzdGFuZGJ5LCBvciBwcm90ZWN0ZWQgCisgKiB3b3JraW5nLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3RhdGUKK3sKKyAgICBCQ01PTFRfRVBPTl9QUk9URUNUSU9OX1NUQVRFX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX1BST1RFQ1RJT05fU1RBVEVfVU5QUk9URUNURUQgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgVGhlIGxpbmsgaXMgbm90IGEgbWVtYmVyIG9mIGEgcHJvdGVjdGlvbiBwYWlyLiAqLworICAgIEJDTU9MVF9FUE9OX1BST1RFQ1RJT05fU1RBVEVfUFJPVEVDVEVEX1NUQU5EQlkgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgVGhlIGxpbmsgaXMgYSBtZW1iZXIgb2YgYSBwcm90ZWN0aW9uIHBhaXIgaW4gdGhlIHN0YW5kYnkgcm9sZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9QUk9URUNUSU9OX1NUQVRFX1BST1RFQ1RFRF9XT1JLSU5HICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IFRoZSBsaW5rIGlzIGEgbWVtYmVyIG9mIGEgcHJvdGVjdGlvbiBwYWlyIGluIHRoZSB3b3JraW5nIHJvbGUuICovCisgICAgQkNNT0xUX0VQT05fUFJPVEVDVElPTl9TVEFURV9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zdGF0ZTsKKworLyoqIEVQT04gUHJvdGVjdGlvbiBTd2l0Y2hpbmcgVHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlCit7CisgICAgQkNNT0xUX0VQT05fUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFlQRV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFlQRV9OT19QUk9URUNUSU9OX1NXVElDSElORyAgICAgICA9IDAsICAgIC8qKjwgTm8gcHJvdGVjdGlvbiBzd3RpY2hpbmcuICovCisgICAgQkNNT0xUX0VQT05fUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFlQRV9MSU5FX0NBUkRfUFJPVEVDVElPTl9TV0lUQ0hJTkc9IDEsICAgIC8qKjwgTGluZSBjYXJkIHByb3RlY3Rpb24gc3dpdGNoaW5nLiAqLworICAgIEJDTU9MVF9FUE9OX1BST1RFQ1RJT05fU1dJVENISU5HX1RZUEVfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZTsKKworLyoqIFByb3RlY3Rpb24gU3dpdGNoaW5nIERldGVjdGlvbiBPcHRpb25zLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZXRlY3Rpb25fb3B0aW9ucworeworICAgIEJDTU9MVF9QUk9URUNUSU9OX1NXSVRDSElOR19ERVRFQ1RJT05fT1BUSU9OU19OT05FICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9QUk9URUNUSU9OX1NXSVRDSElOR19ERVRFQ1RJT05fT1BUSU9OU19TVEFOREJZX0xPU19ERVRFQ1RJT04gPSAweDAwMDEgICAgICAgICAgICAvKio8IFN0YW5kYnkgTE9TIGRldGVjdGlvbi4gKi8KK30gYmNtb2x0X3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RldGVjdGlvbl9vcHRpb25zOworCisvKiogQ3JpdGVyaWEgZm9yIGxvZ2ljYWwgbGluayBzZWxlY3Rpb24gZHVyaW5nIHJlLXJhbmdpbmcgcHJvY2VzcyAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3JlcmFuZ2luZ19vcHRpb25zCit7CisgICAgQkNNT0xUX0VQT05fUFJPVEVDVElPTl9TV0lUQ0hJTkdfUkVSQU5HSU5HX09QVElPTlNfUkVSQU5HRV9OT05FICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgTm8gcmUtcmFuZ2luZyBhdCBhbGwgKi8KKyAgICBCQ01PTFRfRVBPTl9QUk9URUNUSU9OX1NXSVRDSElOR19SRVJBTkdJTkdfT1BUSU9OU19SRVJBTkdFX1NJTkdMRV9MT0dJQ0FMX0xJTksgID0gMiwgICAgLyoqPCBQaWNrIG1pbmltdW0gbG9naWNhbCBsaW5rcyB0byByZS1yYW5nZSAqLworICAgIEJDTU9MVF9FUE9OX1BST1RFQ1RJT05fU1dJVENISU5HX1JFUkFOR0lOR19PUFRJT05TX1JFUkFOR0VfQUxMX0xPR0lDQUxfTElOS1MgICAgPSA0ICAgICAvKio8IEluZGl2aWR1YWxseSByZS1yYW5nZSBhbGwgbG9naWNhbCBsaW5rcyAqLworfSBiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19yZXJhbmdpbmdfb3B0aW9uczsKKworLyoqIEdQSU8gcGluIG51bWJlci4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bpb19waW4KK3sKKyAgICBCQ01PTFRfR1BJT19QSU5fUElOMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBHUElPIHBpbiAwLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEdQSU8gcGluIDEuICovCisgICAgQkNNT0xUX0dQSU9fUElOX1BJTjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgR1BJTyBwaW4gMi4gKi8KKyAgICBCQ01PTFRfR1BJT19QSU5fUElOMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBHUElPIHBpbiAzLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU40ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IEdQSU8gcGluIDQuICovCisgICAgQkNNT0xUX0dQSU9fUElOX1BJTjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgR1BJTyBwaW4gNS4gKi8KKyAgICBCQ01PTFRfR1BJT19QSU5fUElONiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBHUElPIHBpbiA2LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU43ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAvKio8IEdQSU8gcGluIDcuICovCisgICAgQkNNT0xUX0dQSU9fUElOX1BJTjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgIC8qKjwgR1BJTyBwaW4gOC4gKi8KKyAgICBCQ01PTFRfR1BJT19QSU5fUElOOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgLyoqPCBHUElPIHBpbiA5LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4xMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwgICAvKio8IEdQSU8gcGluIDEwLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4xMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAvKio8IEdQSU8gcGluIDExLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4xMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMiwgICAvKio8IEdQSU8gcGluIDEyLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4xMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMywgICAvKio8IEdQSU8gcGluIDEzLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4xNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNCwgICAvKio8IEdQSU8gcGluIDE0LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4xNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNSwgICAvKio8IEdQSU8gcGluIDE1LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4xNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNiwgICAvKio8IEdQSU8gcGluIDE2LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4xNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNywgICAvKio8IEdQSU8gcGluIDE3LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4xOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOCwgICAvKio8IEdQSU8gcGluIDE4LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4xOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOSwgICAvKio8IEdQSU8gcGluIDE5LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4yMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMCwgICAvKio8IEdQSU8gcGluIDIwLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4yMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMSwgICAvKio8IEdQSU8gcGluIDIxLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4yMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMiwgICAvKio8IEdQSU8gcGluIDIyLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4yMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMywgICAvKio8IEdQSU8gcGluIDIzLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4yNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNCwgICAvKio8IEdQSU8gcGluIDI0LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4yNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNSwgICAvKio8IEdQSU8gcGluIDI1LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4yNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNiwgICAvKio8IEdQSU8gcGluIDI2LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4yNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNywgICAvKio8IEdQSU8gcGluIDI3LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4yOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOCwgICAvKio8IEdQSU8gcGluIDI4LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4yOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOSwgICAvKio8IEdQSU8gcGluIDI5LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4zMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMCwgICAvKio8IEdQSU8gcGluIDMwLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4zMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMSwgICAvKio8IEdQSU8gcGluIDMxLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4zMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMiwgICAvKio8IEdQSU8gcGluIDMyLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4zMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMywgICAvKio8IEdQSU8gcGluIDMzLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4zNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNCwgICAvKio8IEdQSU8gcGluIDM0LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4zNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNSwgICAvKio8IEdQSU8gcGluIDM1LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4zNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNiwgICAvKio8IEdQSU8gcGluIDM2LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4zNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNywgICAvKio8IEdQSU8gcGluIDM3LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4zOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzOCwgICAvKio8IEdQSU8gcGluIDM4LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4zOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzOSwgICAvKio8IEdQSU8gcGluIDM5LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU40MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MCwgICAvKio8IEdQSU8gcGluIDQwLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU40MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MSwgICAvKio8IEdQSU8gcGluIDQxLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU40MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MiwgICAvKio8IEdQSU8gcGluIDQyLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU40MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MywgICAvKio8IEdQSU8gcGluIDQzLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU40NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NCwgICAvKio8IEdQSU8gcGluIDQ0LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU40NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NSwgICAvKio8IEdQSU8gcGluIDQ1LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU40NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NiwgICAvKio8IEdQSU8gcGluIDQ2LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU40NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NywgICAvKio8IEdQSU8gcGluIDQ3LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU40OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0OCwgICAvKio8IEdQSU8gcGluIDQ4LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU40OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0OSwgICAvKio8IEdQSU8gcGluIDQ5LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU41MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MCwgICAvKio8IEdQSU8gcGluIDUwLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU41MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MSwgICAvKio8IEdQSU8gcGluIDUxLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU41MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MiwgICAvKio8IEdQSU8gcGluIDUyLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU41MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MywgICAvKio8IEdQSU8gcGluIDUzLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU41NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NCwgICAvKio8IEdQSU8gcGluIDU0LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU41NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NSwgICAvKio8IEdQSU8gcGluIDU1LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU41NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NiwgICAvKio8IEdQSU8gcGluIDU2LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU41NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NywgICAvKio8IEdQSU8gcGluIDU3LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU41OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1OCwgICAvKio8IEdQSU8gcGluIDU4LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU41OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1OSwgICAvKio8IEdQSU8gcGluIDU5LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU42MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MCwgICAvKio8IEdQSU8gcGluIDYwLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU42MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MSwgICAvKio8IEdQSU8gcGluIDYxLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU42MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MiwgICAvKio8IEdQSU8gcGluIDYyLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU42MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MywgICAvKio8IEdQSU8gcGluIDYzLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU42NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NCwgICAvKio8IEdQSU8gcGluIDY0LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU42NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NSwgICAvKio8IEdQSU8gcGluIDY1LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU42NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NiwgICAvKio8IEdQSU8gcGluIDY2LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU42NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NywgICAvKio8IEdQSU8gcGluIDY3LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU42OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2OCwgICAvKio8IEdQSU8gcGluIDY4LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU42OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2OSwgICAvKio8IEdQSU8gcGluIDY5LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU43MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3MCwgICAvKio8IEdQSU8gcGluIDcwLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU43MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3MSwgICAvKio8IEdQSU8gcGluIDcxLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU43MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3MiwgICAvKio8IEdQSU8gcGluIDcyLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU43MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3MywgICAvKio8IEdQSU8gcGluIDczLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU43NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3NCwgICAvKio8IEdQSU8gcGluIDc0LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU43NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3NSwgICAvKio8IEdQSU8gcGluIDc1LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU43NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3NiwgICAvKio8IEdQSU8gcGluIDc2LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU43NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3NywgICAvKio8IEdQSU8gcGluIDc3LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU43OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3OCwgICAvKio8IEdQSU8gcGluIDc4LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU43OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3OSwgICAvKio8IEdQSU8gcGluIDc5LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU44MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4MCwgICAvKio8IEdQSU8gcGluIDgwLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU44MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4MSwgICAvKio8IEdQSU8gcGluIDgxLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU44MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4MiwgICAvKio8IEdQSU8gcGluIDgyLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU44MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4MywgICAvKio8IEdQSU8gcGluIDgzLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU44NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4NCwgICAvKio8IEdQSU8gcGluIDg0LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU44NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4NSwgICAvKio8IEdQSU8gcGluIDg1LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU44NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4NiwgICAvKio8IEdQSU8gcGluIDg2LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU44NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4NywgICAvKio8IEdQSU8gcGluIDg3LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU44OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4OCwgICAvKio8IEdQSU8gcGluIDg4LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU44OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4OSwgICAvKio8IEdQSU8gcGluIDg5LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU45MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5MCwgICAvKio8IEdQSU8gcGluIDkwLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU45MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5MSwgICAvKio8IEdQSU8gcGluIDkxLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU45MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5MiwgICAvKio8IEdQSU8gcGluIDkyLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU45MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5MywgICAvKio8IEdQSU8gcGluIDkzLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU45NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5NCwgICAvKio8IEdQSU8gcGluIDk0LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU45NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5NSwgICAvKio8IEdQSU8gcGluIDk1LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU45NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5NiwgICAvKio8IEdQSU8gcGluIDk2LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU45NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5NywgICAvKio8IEdQSU8gcGluIDk3LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU45OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5OCwgICAvKio8IEdQSU8gcGluIDk4LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU45OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5OSwgICAvKio8IEdQSU8gcGluIDk5LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4xMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDAsICAvKio8IEdQSU8gcGluIDEwMC4gKi8KKyAgICBCQ01PTFRfR1BJT19QSU5fUElOMTAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAxLCAgLyoqPCBHUElPIHBpbiAxMDEuICovCisgICAgQkNNT0xUX0dQSU9fUElOX1BJTjEwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwMiwgIC8qKjwgR1BJTyBwaW4gMTAyLiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4xMDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDMsICAvKio8IEdQSU8gcGluIDEwMy4gKi8KKyAgICBCQ01PTFRfR1BJT19QSU5fUElOMTA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTA0LCAgLyoqPCBHUElPIHBpbiAxMDQuICovCisgICAgQkNNT0xUX0dQSU9fUElOX1BJTjEwNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwNSwgIC8qKjwgR1BJTyBwaW4gMTA1LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9QSU4xMDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDYsICAvKio8IEdQSU8gcGluIDEwNi4gKi8KKyAgICBCQ01PTFRfR1BJT19QSU5fVU5DT05GSUdVUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjU1ICAgLyoqPCBVbmNvbmZpZ3VyZWQgR1BJTyBwaW4uICovCit9IGJjbW9sdF9ncGlvX3BpbjsKKworLyoqIEdQSU8gUG9sYXJpdHkuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwaW9fcG9sYXJpdHkKK3sKKyAgICBCQ01PTFRfR1BJT19QT0xBUklUWV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BJT19QT0xBUklUWV9BQ1RJVkVfTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBBY3RpdmUgTG93LiAqLworICAgIEJDTU9MVF9HUElPX1BPTEFSSVRZX0FDVElWRV9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEFjdGl2ZSBIaWdoLiAqLworICAgIEJDTU9MVF9HUElPX1BPTEFSSVRZX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bpb19wb2xhcml0eTsKKworLyoqIEV4dGVybmFsIElSUS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXh0X2lycQoreworICAgIEJDTU9MVF9FWFRfSVJRX0VYVF9JUlEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEV4dGVybmFsIElSUSAwLiAqLworICAgIEJDTU9MVF9FWFRfSVJRX0VYVF9JUlExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEV4dGVybmFsIElSUSAxLiAqLworICAgIEJDTU9MVF9FWFRfSVJRX0VYVF9JUlEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IEV4dGVybmFsIElSUSAyLiAqLworICAgIEJDTU9MVF9FWFRfSVJRX0VYVF9JUlEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IEV4dGVybmFsIElSUSAzLiAqLworICAgIEJDTU9MVF9FWFRfSVJRX0VYVF9JUlE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IEV4dGVybmFsIElSUSA0LiAqLworICAgIEJDTU9MVF9FWFRfSVJRX0VYVF9JUlE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IEV4dGVybmFsIElSUSA1LiAqLworICAgIEJDTU9MVF9FWFRfSVJRX1VOQ09ORklHVVJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTUgICAvKio8IFVuY29uZmlndXJlZCBleHRlcm5hbCBJUlEuICovCit9IGJjbW9sdF9leHRfaXJxOworCisvKiogRmx1c2ggTUFDIHRhYmxlIG9wdGlvbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZmx1c2hfbWFjX3RhYmxlX29wdGlvbgoreworICAgIEJDTU9MVF9GTFVTSF9NQUNfVEFCTEVfT1BUSU9OX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9GTFVTSF9NQUNfVEFCTEVfT1BUSU9OX0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEFsbC4gKi8KKyAgICBCQ01PTFRfRkxVU0hfTUFDX1RBQkxFX09QVElPTl9QRVJfVklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBQRVIgVklELiAqLworICAgIEJDTU9MVF9GTFVTSF9NQUNfVEFCTEVfT1BUSU9OX1BFUl9GTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IFBFUiBmbG93LiAqLworICAgIEJDTU9MVF9GTFVTSF9NQUNfVEFCTEVfT1BUSU9OX1ZJRF9QTFVTX0ZMT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IFZJRCtmbG93LiAqLworICAgIEJDTU9MVF9GTFVTSF9NQUNfVEFCTEVfT1BUSU9OX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9mbHVzaF9tYWNfdGFibGVfb3B0aW9uOworCisvKiogRnJlcXVlbmN5IGFkanVzdG1lbnQgZGlyZWN0aW9uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2ZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbgoreworICAgIEJDTU9MVF9GUkVRVUVOQ1lfQURKVVNUTUVOVF9ESVJFQ1RJT05fX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9GUkVRVUVOQ1lfQURKVVNUTUVOVF9ESVJFQ1RJT05fTE9XRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IExvd2VyICovCisgICAgQkNNT0xUX0ZSRVFVRU5DWV9BREpVU1RNRU5UX0RJUkVDVElPTl9ISUdIRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgSGlnaGVyICovCisgICAgQkNNT0xUX0ZSRVFVRU5DWV9BREpVU1RNRU5UX0RJUkVDVElPTl9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZnJlcXVlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uOworCisvKiogR0VNIHBvcnQgSUQgZGlyZWN0aW9uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9nZW1fcG9ydF9kaXJlY3Rpb24KK3sKKyAgICBCQ01PTFRfR0VNX1BPUlRfRElSRUNUSU9OX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR0VNX1BPUlRfRElSRUNUSU9OX0RPV05TVFJFQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBkb3duc3RyZWFtIHBvcnQgSUQuICovCisgICAgQkNNT0xUX0dFTV9QT1JUX0RJUkVDVElPTl9VUFNUUkVBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgdXBzdHJlYW0gcG9ydCBJRC4gKi8KKyAgICBCQ01PTFRfR0VNX1BPUlRfRElSRUNUSU9OX0JJRElSRUNUSU9OQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBiaWRpcmVjdGlvbmFsIHBvcnQgIElELiAqLworICAgIEJDTU9MVF9HRU1fUE9SVF9ESVJFQ1RJT05fX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dlbV9wb3J0X2RpcmVjdGlvbjsKKworLyoqIEdFTSBwb3J0IHR5cGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dlbV9wb3J0X3R5cGUKK3sKKyAgICBCQ01PTFRfR0VNX1BPUlRfVFlQRV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR0VNX1BPUlRfVFlQRV9VTklDQVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCB1bmljYXN0IHBvcnQgSUQuICovCisgICAgQkNNT0xUX0dFTV9QT1JUX1RZUEVfTVVMVElDQVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgbXVsdGljYXN0IHBvcnQgSUQuICovCisgICAgQkNNT0xUX0dFTV9QT1JUX1RZUEVfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9nZW1fcG9ydF90eXBlOworCisvKiogR0VNIHBvcnQgb3BlcmF0aW9uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9nZW1fcG9ydF9vcGVyYXRpb24KK3sKKyAgICBCQ01PTFRfR0VNX1BPUlRfT1BFUkFUSU9OX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR0VNX1BPUlRfT1BFUkFUSU9OX0FDVElWQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBBY3RpdmF0ZS4gKi8KKyAgICBCQ01PTFRfR0VNX1BPUlRfT1BFUkFUSU9OX0RFQUNUSVZBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBEZWFjdGl2YXRlLiAqLworICAgIEJDTU9MVF9HRU1fUE9SVF9PUEVSQVRJT05fX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dlbV9wb3J0X29wZXJhdGlvbjsKKworLyoqIEdQSU8gUElOIERpcmVjdGlvbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bpb19waW5fZGlyCit7CisgICAgQkNNT0xUX0dQSU9fUElOX0RJUl9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQSU9fUElOX0RJUl9JTlBVVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgSW5wdXQuICovCisgICAgQkNNT0xUX0dQSU9fUElOX0RJUl9PVVRQVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgT3V0cHV0LiAqLworICAgIEJDTU9MVF9HUElPX1BJTl9ESVJfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncGlvX3Bpbl9kaXI7CisKKy8qKiBHUElPIFZhbHVlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncGlvX3ZhbHVlCit7CisgICAgQkNNT0xUX0dQSU9fVkFMVUVfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQSU9fVkFMVUVfQ0xFQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQ2xlYXIuICovCisgICAgQkNNT0xUX0dQSU9fVkFMVUVfU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgU2V0LiAqLworICAgIEJDTU9MVF9HUElPX1ZBTFVFX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncGlvX3ZhbHVlOworCisvKiogR1BPTiBHRU0gUG9ydCBTdGF0ZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0ZQoreworICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRFX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRFX05PVF9DT05GSUdVUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IG5vdCBjb25maWd1cmVkLiAqLworICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRFX0lOQUNUSVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IGluYWN0aXZlLiAqLworICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRFX1BST0NFU1NJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IHByb2Nlc3NpbmcuICovCisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVEVfQUNUSVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgYWN0aXZlLiAqLworICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRFX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdGU7CisKKy8qKiBLZXkgZXhjaGFuZ2UgbW9kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfa2V5X2V4Y2hhbmdlX21vZGUKK3sKKyAgICBCQ01PTFRfS0VZX0VYQ0hBTkdFX01PREVfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfS0VZX0VYQ0hBTkdFX01PREVfTk9STUFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBOb3JtYWwuICovCisgICAgQkNNT0xUX0tFWV9FWENIQU5HRV9NT0RFX0VOSEFOQ0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgRW5oYW5jZWQuICovCisgICAgQkNNT0xUX0tFWV9FWENIQU5HRV9NT0RFX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfa2V5X2V4Y2hhbmdlX21vZGU7CisKKy8qKiBPTUNJIERldmljZSBJRC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfb21jaV9kZXZpY2VfaWQKK3sKKyAgICBCQ01PTFRfT01DSV9ERVZJQ0VfSURfQkFTRUxJTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgLyoqPCBCYXNlbGluZS4gKi8KKyAgICBCQ01PTFRfT01DSV9ERVZJQ0VfSURfRVhURU5ERUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEgICAgLyoqPCBFeHRlbmRlZC4gKi8KK30gYmNtb2x0X29tY2lfZGV2aWNlX2lkOworCisvKiogR1BPTiBPTlUgVXBncmFkZSBSZXR1cm4gQ29kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9yZXR1cm5fY29kZQoreworICAgIEJDTU9MVF9HUE9OX09OVV9VUEdSQURFX1JFVFVSTl9DT0RFX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX09OVV9VUEdSQURFX1JFVFVSTl9DT0RFX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IENvbW1hbmQgc3VjY2VlZGVkLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9VUEdSQURFX1JFVFVSTl9DT0RFX09OVV9SRVNQT05TRV9USU1FT1VUICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IE9OVSBkaWQgbm90IHJlc3BvbmQgdG8gYSBtZXNzYWdlIHdpdGhpbiB0aGUgdGltZSBzcGVjaWZpZWQgYnkgdGhlICJXcml0ZSByZXF1ZXN0IHRpbWVvdXQiLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9VUEdSQURFX1JFVFVSTl9DT0RFX09OVV9FUlJPUl9SRVNQT05TRSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IEVycm9yIGZvdW5kIGluIHRoZSBPTlUgcmVzcG9uc2UuICovCisgICAgQkNNT0xUX0dQT05fT05VX1VQR1JBREVfUkVUVVJOX0NPREVfVENJX01JU01BVENIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgVHJhbnNhY3Rpb24gSUQgbWlzbWF0Y2guICovCisgICAgQkNNT0xUX0dQT05fT05VX1VQR1JBREVfUkVUVVJOX0NPREVfR0VUX0lNQUdFX0ZBSUxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgR2V0IEltYWdlIEluZm8gY29tbWFuZCBmYWlsZWQuICovCisgICAgQkNNT0xUX0dQT05fT05VX1VQR1JBREVfUkVUVVJOX0NPREVfQUNUSVZBVElPTl9GQUlMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgQWN0aXZhdGlvbiBzb2Z0d2FyZSBjb21tYW5kIGZhaWxlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfVVBHUkFERV9SRVRVUk5fQ09ERV9JTlRFUk5BTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBJbnRlcm5hbCBlcnJvci4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfVVBHUkFERV9SRVRVUk5fQ09ERV9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcmV0dXJuX2NvZGU7CisKKy8qKiBHLjk4OCBPTUNJIFJlc3VsdCBDb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9vbWNpX3Jlc3VsdF9jb2RlCit7CisgICAgQkNNT0xUX09NQ0lfUkVTVUxUX0NPREVfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX09NQ0lfUkVTVUxUX0NPREVfTk9fRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQ29tbWFuZCBwcm9jZXNzZWQgc3VjY2Vzc2Z1bGx5LiAqLworICAgIEJDTU9MVF9PTUNJX1JFU1VMVF9DT0RFX1BST0NFU1NJTkdfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IENvbW1hbmQgcHJvY2Vzc2luZyBlcnJvci4gKi8KKyAgICBCQ01PTFRfT01DSV9SRVNVTFRfQ09ERV9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBDb21tYW5kIG5vdCBzdXBwb3J0ZWQsIG9yIG5vdCBhcHBsaWNhYmxlIGZvciBFbmQgc29mdHdhcmUgZG93bmxvYWQgbWVzc2FnZS4gKi8KKyAgICBCQ01PTFRfT01DSV9SRVNVTFRfQ09ERV9QQVJBTUVURVJfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBQYXJhbWV0ZXIgZXJyb3IsIG9yIG5vdCBhcHBsaWNhYmxlIGZvciBFbmQgc29mdHdhcmUgZG93bmxvYWQgbWVzc2FnZS4gKi8KKyAgICBCQ01PTFRfT01DSV9SRVNVTFRfQ09ERV9VTktOT1dOX0VOVElUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgLyoqPCBVbmtub3duIG1hbmFnZWQgZW50aXR5LiAqLworICAgIEJDTU9MVF9PTUNJX1JFU1VMVF9DT0RFX1VOS05PV05fSU5TVEFOQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IFVua25vd24gbWFuYWdlZCBlbnRpdHkgaW5zdGFuY2UuICovCisgICAgQkNNT0xUX09NQ0lfUkVTVUxUX0NPREVfREVWSUNFX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgIC8qKjwgRGV2aWNlIGJ1c3kuICovCisgICAgQkNNT0xUX09NQ0lfUkVTVUxUX0NPREVfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9vbWNpX3Jlc3VsdF9jb2RlOworCisvKiogT05VIHN0YXRlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9vbnVfc3RhdGUKK3sKKyAgICBCQ01PTFRfT05VX1NUQVRFX05PVF9DT05GSUdVUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBub3RfY29uZmlndXJlZC4gKi8KKyAgICBCQ01PTFRfT05VX1NUQVRFX0lOQUNUSVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBpbmFjdGl2ZS4gKi8KKyAgICBCQ01PTFRfT05VX1NUQVRFX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBhY3RpdmUuICovCisgICAgQkNNT0xUX09OVV9TVEFURV9BQ1RJVkVfU1RBTkRCWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgYWN0aXZlIHN0YW5kYnkuICovCisgICAgQkNNT0xUX09OVV9TVEFURV9ESVNBQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgZGlzYWJsZWQuICovCisgICAgQkNNT0xUX09OVV9TVEFURV9BV0FLRV9GUkVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgT05VIGlzIGFjdGl2ZSwgYnV0IHBvd2VyIG1hbmFnZW1lbnQgaXMgZW5hYmxlZC4gT05VIGlzIGFsbG93ZWQgdG8gZW50ZXIgbG93IHBvd2VyIHN0YXRlcyBhdCBpdHMgb3duIGRpc2NyZXRpb24uICovCisgICAgQkNNT0xUX09OVV9TVEFURV9QUk9DRVNTSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgIC8qKjwgcHJvY2Vzc2luZy4gKi8KKyAgICBCQ01PTFRfT05VX1NUQVRFX0xPV19QT1dFUl9ET1pFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgLyoqPCBPTlUgaGFzIGVudGVyZWQgdGhlIERvemUgbG93IHBvd2VyIHN0YXRlLiAqLworICAgIEJDTU9MVF9PTlVfU1RBVEVfTE9XX1BPV0VSX1NMRUVQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5LCAgICAvKio8IE9OVSBoYXMgZW50ZXJlZCB0aGUgU2xlZXAgbG93IHBvd2VyIHN0YXRlLiAqLworICAgIEJDTU9MVF9PTlVfU1RBVEVfTE9XX1BPV0VSX1dBVENIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwgICAvKio8IE9OVSBoYXMgZW50ZXJlZCB0aGUgV2F0Y2hmdWwgU2xlZXAgbG93IHBvd2VyIHN0YXRlLiAqLworICAgIEJDTU9MVF9PTlVfU1RBVEVfVU5BV0FSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSAgICAvKio8IE9OVSBpcyBhZGRlZCB0byBkYXRhIGJhc2UgYnV0IG5vIGJ3cyBpcyBzYXZlZCAgKi8KK30gYmNtb2x0X29udV9zdGF0ZTsKKworLyoqIHJzc2kgbG9jYXRpb24gc2lnbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfcnNzaV9sb2NhdGlvbl9zaWduCit7CisgICAgQkNNT0xUX1JTU0lfTE9DQVRJT05fU0lHTl9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1JTU0lfTE9DQVRJT05fU0lHTl9CRUZPUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgYmVmb3JlLiAqLworICAgIEJDTU9MVF9SU1NJX0xPQ0FUSU9OX1NJR05fQUZURVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IGFmdGVyLiAqLworICAgIEJDTU9MVF9SU1NJX0xPQ0FUSU9OX1NJR05fX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3Jzc2lfbG9jYXRpb25fc2lnbjsKKworLyoqIE9OVSBwb3N0IGRpc2NvdmVyeSBtb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9vbnVfcG9zdF9kaXNjb3ZlcnlfbW9kZQoreworICAgIEJDTU9MVF9PTlVfUE9TVF9ESVNDT1ZFUllfTU9ERV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9PTlVfUE9TVF9ESVNDT1ZFUllfTU9ERV9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IG5vbmUuICovCisgICAgQkNNT0xUX09OVV9QT1NUX0RJU0NPVkVSWV9NT0RFX0FDVElWQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgYWN0aXZhdGUuICovCisgICAgQkNNT0xUX09OVV9QT1NUX0RJU0NPVkVSWV9NT0RFX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgZGlzYWJsZS4gKi8KKyAgICBCQ01PTFRfT05VX1BPU1RfRElTQ09WRVJZX01PREVfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfb251X3Bvc3RfZGlzY292ZXJ5X21vZGU7CisKKy8qKiBJbWFnZSB0cmFuc2ZlciBzdGF0dXMuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2ltYWdlX3RyYW5zZmVyX3N0YXR1cworeworICAgIEJDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFN1Y2Nlc3MuICovCisgICAgQkNNT0xUX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19NRU1PUllfQUxMT0NBVElPTl9GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZS4gKi8KKyAgICBCQ01PTFRfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX1VOU1VQUE9SVEVEX0ZJTEVfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBVbnN1cHBvcnRlZCBmaWxlIHR5cGUuICovCisgICAgQkNNT0xUX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19DUkNfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgQ1JDIGNoZWNrc3VtIGVycm9yLiAqLworICAgIEJDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfQkxPQ0tfT1VUX09GX1NZTkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IEJsb2NrIG91dCBvZiBzeW5jLiAqLworICAgIEJDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfSU5URVJOQUxfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IEludGVybmFsIGVycm9yLiAqLworICAgIEJDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfSU5WQUxJRF9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAvKio8IEludmFsaWQgc3RhdGUuICovCisgICAgQkNNT0xUX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19QUkVNQVRVUkVfVEVSTUlOQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgIC8qKjwgUHJlbWF0dXJlIHRlcm1pbmF0aW9uLiAqLworICAgIEJDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfQUNLX1RJTUVPVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAvKio8IEFDSyB0aW1lb3V0LiAqLworICAgIEJDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9pbWFnZV90cmFuc2Zlcl9zdGF0dXM7CisKKy8qKiBpd2YgbW9kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfaXdmX21vZGUKK3sKKyAgICBCQ01PTFRfSVdGX01PREVfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfSVdGX01PREVfRElSRUNUX01BUFBJTkdfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBESVJFQ1QgTUFQUElORyBNT0RFLiAqLworICAgIEJDTU9MVF9JV0ZfTU9ERV9QRVJfRkxPV19NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFBFUiBGTE9XIE1PREUuICovCisgICAgQkNNT0xUX0lXRl9NT0RFX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfaXdmX21vZGU7CisKKy8qKiBsb2cgZmlsZSBpZC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfbG9nX2ZpbGVfaWQKK3sKKyAgICBCQ01PTFRfTE9HX0ZJTEVfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfTE9HX0ZJTEVfSURfU1JBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTUkFNLiAqLworICAgIEJDTU9MVF9MT0dfRklMRV9JRF9ERFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEREUi4gKi8KKyAgICBCQ01PTFRfTE9HX0ZJTEVfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfbG9nX2ZpbGVfaWQ7CisKKy8qKiBsb2cgbGV2ZWwuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2xvZ19sZXZlbAoreworICAgIEJDTU9MVF9MT0dfTEVWRUxfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9MT0dfTEVWRUxfTk9fTE9HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IG5vIGxvZy4gKi8KKyAgICBCQ01PTFRfTE9HX0xFVkVMX0ZBVEFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBmYXRhbC4gKi8KKyAgICBCQ01PTFRfTE9HX0xFVkVMX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBlcnJvci4gKi8KKyAgICBCQ01PTFRfTE9HX0xFVkVMX1dBUk5JTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCB3YXJuaW5nLiAqLworICAgIEJDTU9MVF9MT0dfTEVWRUxfSU5GTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IGluZm8uICovCisgICAgQkNNT0xUX0xPR19MRVZFTF9ERUJVRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgZGVidWcuICovCisgICAgQkNNT0xUX0xPR19MRVZFTF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2xvZ19sZXZlbDsKKworLyoqIGxvZyBzdHlsZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfbG9nX3N0eWxlCit7CisgICAgQkNNT0xUX0xPR19TVFlMRV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0xPR19TVFlMRV9OT1JNQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgbm9ybWFsLiAqLworICAgIEJDTU9MVF9MT0dfU1RZTEVfQk9MRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IGJvbGQuICovCisgICAgQkNNT0xUX0xPR19TVFlMRV9VTkRFUkxJTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgdW5kZXJsaW5lLiAqLworICAgIEJDTU9MVF9MT0dfU1RZTEVfQkxJTksgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IGJsaW5rLiAqLworICAgIEJDTU9MVF9MT0dfU1RZTEVfUkVWRVJTRV9WSURFTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IHJldmVyc2UgdmlkZW8uICovCisgICAgQkNNT0xUX0xPR19TVFlMRV9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2xvZ19zdHlsZTsKKworLyoqIGxvZyB0eXBlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9sb2dfdHlwZQoreworICAgIEJDTU9MVF9MT0dfVFlQRV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9MT0dfVFlQRV9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IGRvbnQgc2hvdyBsb2cgICovCisgICAgQkNNT0xUX0xPR19UWVBFX1BSSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgcHJpbnQuICovCisgICAgQkNNT0xUX0xPR19UWVBFX1NBVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgc2F2ZS4gKi8KKyAgICBCQ01PTFRfTE9HX1RZUEVfQk9USCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBib3RoLiAqLworICAgIEJDTU9MVF9MT0dfVFlQRV9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2xvZ190eXBlOworCisvKiogTUFDIHRhYmxlIG1pc3MgZmFsbGJhY2suIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X21hY190YWJsZV9taXNzX2ZhbGxiYWNrCit7CisgICAgQkNNT0xUX01BQ19UQUJMRV9NSVNTX0ZBTExCQUNLX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX01BQ19UQUJMRV9NSVNTX0ZBTExCQUNLX0RST1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgVGhlIHBhY2tldCBpcyBkcm9wcGVkLiAqLworICAgIEJDTU9MVF9NQUNfVEFCTEVfTUlTU19GQUxMQkFDS19ERUZBVUxUX0ZMT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFRoZSBwYWNrZXQgaXMgZm9yd2FyZGVkIHdpdGggdGhlIHByb3Zpc2lvbmVkIGRlZmF1bHQgZmxvdyBJRC4gKi8KKyAgICBCQ01PTFRfTUFDX1RBQkxFX01JU1NfRkFMTEJBQ0tfVklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBUaGUgcGFja2V0IGlzIGZvcndhcmRlZCB3aXRoIGEgZmxvdyBJRCBlcXVhbCB0byBpdHMgVklELiAqLworICAgIEJDTU9MVF9NQUNfVEFCTEVfTUlTU19GQUxMQkFDS19fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9tYWNfdGFibGVfbWlzc19mYWxsYmFjazsKKworLyoqIE1BQyB0YWJsZSBMZWFybmluZyBtb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9tYWNfdGFibGVfbGVhcm5pbmdfbW9kZQoreworICAgIEJDTU9MVF9NQUNfVEFCTEVfTEVBUk5JTkdfTU9ERV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9NQUNfVEFCTEVfTEVBUk5JTkdfTU9ERV9OT1JNQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IE5vcm1hbCBtb2RlOiB1cHN0cmVhbSB0cmFmZmljIHRoYXQgbWF0Y2hlcyBvbiBNQUMvVklEIGJ1dCBkb2Vzbid0IG1hdGNoIG9uIGZsb3cgSUQgaXMgc3RpbGwgYWxsb3dlZCB0byBwYXNzLiAqLworICAgIEJDTU9MVF9NQUNfVEFCTEVfTEVBUk5JTkdfTU9ERV9NT1ZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IE5vcm1hbCBtb2RlOiB1cHN0cmVhbSB0cmFmZmljIHRoYXQgbWF0Y2hlcyBvbiBNQUMvVklEIGJ1dCBkb2Vzbid0IG1hdGNoIG9uIGZsb3cgSUQgaXMgY29uc2lkZXJlZCB0byBiZSBhIE1BQyBtb3ZlIGNvbmRpdGlvbi4gKi8KKyAgICBCQ01PTFRfTUFDX1RBQkxFX0xFQVJOSU5HX01PREVfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfbWFjX3RhYmxlX2xlYXJuaW5nX21vZGU7CisKKy8qKiBNYXBwaW5nIHRhZyBtZXRob2QuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X21hcHBpbmdfdGFnX21ldGhvZAoreworICAgIEJDTU9MVF9NQVBQSU5HX1RBR19NRVRIT0RfT1VURVJfVklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IE91dGVyIFZJRC4gKi8KKyAgICBCQ01PTFRfTUFQUElOR19UQUdfTUVUSE9EX0lOTkVSX1ZJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCAgICAgLyoqPCBJbm5lciBWSUQuICovCit9IGJjbW9sdF9tYXBwaW5nX3RhZ19tZXRob2Q7CisKKy8qKiBOTkkgQ29ubmVjdGlvbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfbm5pX2Nvbm5lY3Rpb24KK3sKKyAgICBCQ01PTFRfTk5JX0NPTk5FQ1RJT05fX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfTk5JX0NPTk5FQ1RJT05fUFJJTUFSWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBQcmltYXJ5LiAqLworICAgIEJDTU9MVF9OTklfQ09OTkVDVElPTl9CQUNLVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEJhY2t1cC4gKi8KKyAgICBCQ01PTFRfTk5JX0NPTk5FQ1RJT05fX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X25uaV9jb25uZWN0aW9uOworCisvKiogVHJpdmFsZW50LiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF90cml2YWxlbnQKK3sKKyAgICBCQ01PTFRfVFJJVkFMRU5UX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfVFJJVkFMRU5UX0ZBTFNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBGYWxzZS4gKi8KKyAgICBCQ01PTFRfVFJJVkFMRU5UX1RSVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBUcnVlLiAqLworICAgIEJDTU9MVF9UUklWQUxFTlRfTk9UX0FQUExJQ0FCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IE5vdCBBcHBsaWNhYmxlLiAqLworICAgIEJDTU9MVF9UUklWQUxFTlRfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF90cml2YWxlbnQ7CisKKy8qKiBPRE4gQ2xhc3MuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X29kbl9jbGFzcworeworICAgIEJDTU9MVF9PRE5fQ0xBU1NfTjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IE4xLiAqLworICAgIEJDTU9MVF9PRE5fQ0xBU1NfTjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IE4yLiAqLworICAgIEJDTU9MVF9PRE5fQ0xBU1NfRTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IEUxLiAqLworICAgIEJDTU9MVF9PRE5fQ0xBU1NfRTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0ICAgICAvKio8IEUyLiAqLworfSBiY21vbHRfb2RuX2NsYXNzOworCisvKiogT01DSSBQb3J0IElEIG9wZXJhdGlvbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfb21jaV9wb3J0X2lkX29wZXJhdGlvbgoreworICAgIEJDTU9MVF9PTUNJX1BPUlRfSURfT1BFUkFUSU9OX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9PTUNJX1BPUlRfSURfT1BFUkFUSU9OX0NPTkZJR1VSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IGNvbmZpZ3VyZS4gKi8KKyAgICBCQ01PTFRfT01DSV9QT1JUX0lEX09QRVJBVElPTl9SRU1PVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCByZW1vdmUuICovCisgICAgQkNNT0xUX09NQ0lfUE9SVF9JRF9PUEVSQVRJT05fX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X29tY2lfcG9ydF9pZF9vcGVyYXRpb247CisKKy8qKiBPTlUgb3BlcmF0aW9uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9vbnVfb3BlcmF0aW9uCit7CisgICAgQkNNT0xUX09OVV9PUEVSQVRJT05fX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX09OVV9PUEVSQVRJT05fSU5BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgSW5hY3RpdmUuICovCisgICAgQkNNT0xUX09OVV9PUEVSQVRJT05fQUNUSVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgQWN0aXZlLiAqLworICAgIEJDTU9MVF9PTlVfT1BFUkFUSU9OX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IERpc2FibGUuICovCisgICAgQkNNT0xUX09OVV9PUEVSQVRJT05fRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgRW5hYmxlLiAqLworICAgIEJDTU9MVF9PTlVfT1BFUkFUSU9OX0FDVElWRV9TVEFOREJZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IEFjdGl2ZSBTdGFuZGJ5LiAqLworICAgIEJDTU9MVF9PTlVfT1BFUkFUSU9OX0FXQUtFX0ZSRUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IFRyYW5zaXRpb25zIHRoZSBPTlUgdG8gYW4gYWN0aXZlIHN0YXRlIHdpdGggcG93ZXIgbWFuYWdlbWVudCBlbmFibGVkLiBBbGxvd2VkIGluIGluYWN0aXZlLCBkaXNhYmxlZCwgYW5kIGFjdGl2ZSBzdGF0ZXMuICovCisgICAgQkNNT0xUX09OVV9PUEVSQVRJT05fX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9vbnVfb3BlcmF0aW9uOworCisvKiogT05VIFBvd2VyIGxldmVsLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9vbnVfcG93ZXJfbGV2ZWwKK3sKKyAgICBCQ01PTFRfT05VX1BPV0VSX0xFVkVMX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfT05VX1BPV0VSX0xFVkVMX0lOQ1JFQVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBpbmNyZWFzZS4gKi8KKyAgICBCQ01PTFRfT05VX1BPV0VSX0xFVkVMX0RFQ1JFQVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBkZWNyZWFzZS4gKi8KKyAgICBCQ01PTFRfT05VX1BPV0VSX0xFVkVMX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X29udV9wb3dlcl9sZXZlbDsKKworLyoqIFRDIGxheWVyIHByb3RvY29sLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF90Y19wcm90b2NvbAoreworICAgIEJDTU9MVF9UQ19QUk9UT0NPTF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9UQ19QUk9UT0NPTF9UQ19MQVlFUl9QUk9UT0NPTF9HXzk4N19QXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFRDIGxheWVyIHByb3RvY29sIEcuOTg3LjMgKi8KKyAgICBCQ01PTFRfVENfUFJPVE9DT0xfVENfTEFZRVJfUFJPVE9DT0xfR185ODlfUF8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBUQyBsYXllciBwcm90b2NvbCBHLjk4OS4zICovCisgICAgQkNNT0xUX1RDX1BST1RPQ09MX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3RjX3Byb3RvY29sOworCisvKiogUGFja2V0IEluamVjdGlvbiBFcnJvci4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfcGFja2V0X2luamVjdGlvbl9lcnJvcgoreworICAgIEJDTU9MVF9QQUNLRVRfSU5KRUNUSU9OX0VSUk9SX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9QQUNLRVRfSU5KRUNUSU9OX0VSUk9SX0dFTV9QT1JUX05PVF9BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEdFTSBQb3J0IE5vdCBBY3RpdmUuICovCisgICAgQkNNT0xUX1BBQ0tFVF9JTkpFQ1RJT05fRVJST1JfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3BhY2tldF9pbmplY3Rpb25fZXJyb3I7CisKKy8qKiBwYWNrZXQgdHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfcGFja2V0X3R5cGUKK3sKKyAgICBCQ01PTFRfUEFDS0VUX1RZUEVfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfUEFDS0VUX1RZUEVfQ1BVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBDUFUuICovCisgICAgQkNNT0xUX1BBQ0tFVF9UWVBFX09NQ0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgT01DSS4gKi8KKyAgICBCQ01PTFRfUEFDS0VUX1RZUEVfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfcGFja2V0X3R5cGU7CisKKy8qKiBQYXNzd29yZCBhdXRoZW50aWNhdGlvbiBmYWlsIHJlYXNvbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fZmFpbF9yZWFzb24KK3sKKyAgICBCQ01PTFRfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fRkFJTF9SRUFTT05fX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fRkFJTF9SRUFTT05fTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBub25lLiAqLworICAgIEJDTU9MVF9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9GQUlMX1JFQVNPTl9QQVNTV09SRF9JTkNPTlNJU1RFTkNZICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFBhc3N3b3JkIGluY29uc2lzdGVuY3kuICovCisgICAgQkNNT0xUX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0ZBSUxfUkVBU09OX1BBU1NXT1JEX01JU01BVENIICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgUGFzc3dvcmQgbWlzbWF0Y2guICovCisgICAgQkNNT0xUX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0ZBSUxfUkVBU09OX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX1RJTUVPVVQgICAgICA9IDMsICAgIC8qKjwgUGFzc3dvcmQgYXV0aGVudGljYXRpb24gdGltZW91dC4gKi8KKyAgICBCQ01PTFRfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fRkFJTF9SRUFTT05fT05VX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgLyoqPCBvbnUgYWxhcm0uICovCisgICAgQkNNT0xUX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0ZBSUxfUkVBU09OX0xPU19FVkVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgbG9zIGV2ZW50LiAqLworICAgIEJDTU9MVF9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9GQUlMX1JFQVNPTl9ESVNBQkxFX0VWRU5UICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAvKio8IGRpc2FibGUgZXZlbnQuICovCisgICAgQkNNT0xUX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0ZBSUxfUkVBU09OX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2ZhaWxfcmVhc29uOworCisvKiogUG9sYXJpdHkuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3BvbGFyaXR5Cit7CisgICAgQkNNT0xUX1BPTEFSSVRZX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1BPTEFSSVRZX0xPVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgTG93LiAqLworICAgIEJDTU9MVF9QT0xBUklUWV9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEhpZ2guICovCisgICAgQkNNT0xUX1BPTEFSSVRZX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfcG9sYXJpdHk7CisKKy8qKiBQb2xsaW5nIEludGVydmFsLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9wb2xsaW5nX2ludGVydmFsCit7CisgICAgQkNNT0xUX1BPTExJTkdfSU5URVJWQUxfUE9MTElOR19ESVNBQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBObyBwb2xsaW5nIGdhdGVzIHdpbGwgYmUgc2VudCB0byB0aGlzIExMSUQuICovCisgICAgQkNNT0xUX1BPTExJTkdfSU5URVJWQUxfVVNfNTAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUwMCwgICAgICAgICAgLyoqPCA1MDAgdXMuICovCisgICAgQkNNT0xUX1BPTExJTkdfSU5URVJWQUxfTVNfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwMDAsICAgICAgICAgLyoqPCAxIG1zLiAqLworICAgIEJDTU9MVF9QT0xMSU5HX0lOVEVSVkFMX01TXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMDAwLCAgICAgICAgIC8qKjwgMiBtcy4gKi8KKyAgICBCQ01PTFRfUE9MTElOR19JTlRFUlZBTF9NU180ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDAwMCwgICAgICAgICAvKio8IDQgbXMuICovCisgICAgQkNNT0xUX1BPTExJTkdfSU5URVJWQUxfTVNfOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgwMDAsICAgICAgICAgLyoqPCA4IG1zLiAqLworICAgIEJDTU9MVF9QT0xMSU5HX0lOVEVSVkFMX01TXzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNjAwMCwgICAgICAgIC8qKjwgMTYgbXMuICovCisgICAgQkNNT0xUX1BPTExJTkdfSU5URVJWQUxfQVVUT01BVElDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxNDc0ODM2NDdMICAgLyoqPCBGaXJtd2FyZSB3aWxsIGNob29zZSBhbiBhcHByb3ByaWF0ZSB2YWx1ZS4gKi8KK30gYmNtb2x0X3BvbGxpbmdfaW50ZXJ2YWw7CisKKy8qKiBQT04gT3BlcmF0aW9uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9wb25fb3BlcmF0aW9uCit7CisgICAgQkNNT0xUX1BPTl9PUEVSQVRJT05fX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1BPTl9PUEVSQVRJT05fSU5BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBJbmFjdGl2ZS4gKi8KKyAgICBCQ01PTFRfUE9OX09QRVJBVElPTl9BQ1RJVkVfV09SS0lORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IEFjdGl2ZSBXb3JraW5nLiAqLworICAgIEJDTU9MVF9QT05fT1BFUkFUSU9OX0FDVElWRV9TVEFOREJZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgQWN0aXZlIFN0YW5kYnkuICovCisgICAgQkNNT0xUX1BPTl9PUEVSQVRJT05fX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9wb25fb3BlcmF0aW9uOworCisvKiogUE9OIFByb3RlY3Rpb24gU3dpdGNoaW5nIE9wdGlvbnMuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19vcHRpb25zCit7CisgICAgQkNNT0xUX1BPTl9QUk9URUNUSU9OX1NXSVRDSElOR19PUFRJT05TX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1BPTl9QUk9URUNUSU9OX1NXSVRDSElOR19PUFRJT05TX1NXSUZUX1BPUFVQICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMSwgICAvKio8IElmIHNldCwgc3dpdGNob3ZlcnMgd2lsbCB1dGlsaXplIHRoZSBTd2lmdF9QT1BVUCBhbmQgUmFuZ2luZ19BZGp1c3RtZW50IFBMT0FNcyBhZGRlZCBpbiBHLjk4NCBhbm5leCBELiAqLworICAgIEJDTU9MVF9QT05fUFJPVEVDVElPTl9TV0lUQ0hJTkdfT1BUSU9OU19ERUJVR19GQVNUX1JBTkdJTkcgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDIgICAgLyoqPCBJZiBzZXQsIE9OVSBFUURzIHdpbGwgbm90IGJlIGNhbGN1bGF0ZWQgYXMgcGFydCBvZiBhIHN3aXRjaG92ZXIuICBJbnN0ZWFkLCBlYWNoIE9OVSdzIG5ldyBFUUQgd2lsbCBiZSBlcXVhbCB0byBpdHMgbGFzdCBFUUQgd2hlbiB0aGUgUE9OIE5JIHdhcyBpbiBhY3RpdmUtd29ya2luZyBzdGF0ZS4gIFRoaXMgcHJvdmlkZXMgYSBmYXN0IHN3aXRjaG92ZXIsIGJ1dCBjYW4gb25seSBiZSB1c2VkIGlmIHRoZSB0cnVuayBkaXN0YW5jZSBuZXZlciBjaGFuZ2VzLiAqLworfSBiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29wdGlvbnM7CisKKy8qKiBQT04gc3RhdGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3Bvbl9zdGF0ZQoreworICAgIEJDTU9MVF9QT05fU1RBVEVfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9QT05fU1RBVEVfSU5BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgLyoqPCBJbmFjdGl2ZS4gKi8KKyAgICBCQ01PTFRfUE9OX1NUQVRFX1BST0NFU1NJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgIC8qKjwgUHJvY2Vzc2luZy4gKi8KKyAgICBCQ01PTFRfUE9OX1NUQVRFX0FDVElWRV9XT1JLSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgIC8qKjwgQWN0aXZlIFdvcmtpbmcuICovCisgICAgQkNNT0xUX1BPTl9TVEFURV9BQ1RJVkVfU1RBTkRCWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAvKio8IEFjdGl2ZSBTdGFuZGJ5LiAqLworICAgIEJDTU9MVF9QT05fU1RBVEVfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9wb25fc3RhdGU7CisKKy8qKiBwb3dlciBsZXZlbGxpbmcgY29udHJvbC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfcG93ZXJfbGV2ZWxsaW5nX2NvbnRyb2wKK3sKKyAgICBCQ01PTFRfUE9XRVJfTEVWRUxMSU5HX0NPTlRST0xfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfUE9XRVJfTEVWRUxMSU5HX0NPTlRST0xfRElSRUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBEaXJlY3QuICovCisgICAgQkNNT0xUX1BPV0VSX0xFVkVMTElOR19DT05UUk9MX0RFQ1JFQVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgRGVjcmVhc2UuICovCisgICAgQkNNT0xUX1BPV0VSX0xFVkVMTElOR19DT05UUk9MX0lOQ1JFQVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgSW5jcmVhc2UuICovCisgICAgQkNNT0xUX1BPV0VSX0xFVkVMTElOR19DT05UUk9MX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3Bvd2VyX2xldmVsbGluZ19jb250cm9sOworCisvKiogVGhlIHJlYXNvbiB0aGF0IGEgcG93ZXIgbWFuYWdlbWVudCBzdGF0ZSBjaGFuZ2Ugb2NjdXJyZWQuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3Bvd2VyX21hbmFnZW1lbnRfdHJhbnNpdGlvbl9yZWFzb24KK3sKKyAgICBCQ01PTFRfUE9XRVJfTUFOQUdFTUVOVF9UUkFOU0lUSU9OX1JFQVNPTl9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfUE9XRVJfTUFOQUdFTUVOVF9UUkFOU0lUSU9OX1JFQVNPTl9QT1dFUl9NQU5BR0VNRU5UX0VOQUJMRUQgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBIb3N0IHJlcXVlc3RlZCBwb3dlciBtYW5hZ2VtZW50IGVuYWJsZS4gKi8KKyAgICBCQ01PTFRfUE9XRVJfTUFOQUdFTUVOVF9UUkFOU0lUSU9OX1JFQVNPTl9QT1dFUl9NQU5BR0VNRU5UX0RJU0FCTEVEICAgICAgICAgICAgID0gMSwgICAgLyoqPCBIb3N0IHJlcXVlc3RlZCBwb3dlciBtYW5hZ2VtZW50IGRpc2FibGUuICovCisgICAgQkNNT0xUX1BPV0VSX01BTkFHRU1FTlRfVFJBTlNJVElPTl9SRUFTT05fU0xFRVBfUkVRVUVTVF9BV0FLRSAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgUmVjZWl2ZWQgc2xlZXAgcmVxdWVzdCBQTE9BTSBmcm9tIE9OVS4gKi8KKyAgICBCQ01PTFRfUE9XRVJfTUFOQUdFTUVOVF9UUkFOU0lUSU9OX1JFQVNPTl9TTEVFUF9SRVFVRVNUX0RPWkUgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBSZWNlaXZlZCBzbGVlcCByZXF1ZXN0IFBMT0FNIGZyb20gT05VLiAqLworICAgIEJDTU9MVF9QT1dFUl9NQU5BR0VNRU5UX1RSQU5TSVRJT05fUkVBU09OX1NMRUVQX1JFUVVFU1RfU0xFRVAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IFJlY2VpdmVkIHNsZWVwIHJlcXVlc3QgUExPQU0gZnJvbSBPTlUuICovCisgICAgQkNNT0xUX1BPV0VSX01BTkFHRU1FTlRfVFJBTlNJVElPTl9SRUFTT05fU0xFRVBfUkVRVUVTVF9XQVRDSCAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgUmVjZWl2ZWQgc2xlZXAgcmVxdWVzdCBQTE9BTSBmcm9tIE9OVS4gKi8KKyAgICBCQ01PTFRfUE9XRVJfTUFOQUdFTUVOVF9UUkFOU0lUSU9OX1JFQVNPTl9URVJJX0VYUElSRUQgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBUZXJpIHRpbWVyIGV4cGlyZWQuIEl0IGhhcyBiZWVuIHRvbyBsb25nIHNpbmNlIHdlIGhhdmUgcmVjZWl2ZWQgYW4gdXBzdHJlYW0gYnVyc3QgZnJvbSBhbiBPTlUgaW4gYSBsb3cgcG93ZXIgc3RhdGUuICovCisgICAgQkNNT0xUX1BPV0VSX01BTkFHRU1FTlRfVFJBTlNJVElPTl9SRUFTT05fVEFMRVJURURfRVhQSVJFRCAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgIC8qKjwgVGFsZXJ0ZWQgdGltZXIgZXhwaXJlZC4gSXQgaGFzIGJlZW4gdG9vIGxvbmcgc2luY2UgdGhlIE9OVSB3YXMgcmVxdWVzdGVkIHRvIHdha2UgdXAgd2l0aCBubyBpZGljYXRpb24gdGhhdCBpdCBoYXMgY29tcGxpZWQuICovCisgICAgQkNNT0xUX1BPV0VSX01BTkFHRU1FTlRfVFJBTlNJVElPTl9SRUFTT05fQUxBUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgIC8qKjwgQSBMT1NpL0xPRmkvTE9CaSBhbGFybSBoYXMgYmVuIHJhaXNlZCBhZ2FpbnN0IHRoZSBPTlUuICovCisgICAgQkNNT0xUX1BPV0VSX01BTkFHRU1FTlRfVFJBTlNJVElPTl9SRUFTT05fX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3Bvd2VyX21hbmFnZW1lbnRfdHJhbnNpdGlvbl9yZWFzb247CisKKy8qKiBQUkJTIFBvbHlub21pYWwuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3ByYnNfcG9seW5vbWlhbAoreworICAgIEJDTU9MVF9QUkJTX1BPTFlOT01JQUxfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9QUkJTX1BPTFlOT01JQUxfUFJCU183ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFBSQlNfNy4gKi8KKyAgICBCQ01PTFRfUFJCU19QT0xZTk9NSUFMX1BSQlNfOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBQUkJTXzkuICovCisgICAgQkNNT0xUX1BSQlNfUE9MWU5PTUlBTF9QUkJTXzExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgUFJCU18xMS4gKi8KKyAgICBCQ01PTFRfUFJCU19QT0xZTk9NSUFMX1BSQlNfMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBQUkJTXzE1LiAqLworICAgIEJDTU9MVF9QUkJTX1BPTFlOT01JQUxfUFJCU18yMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IFBSQlNfMjMuICovCisgICAgQkNNT0xUX1BSQlNfUE9MWU5PTUlBTF9QUkJTXzMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgUFJCU18zMS4gKi8KKyAgICBCQ01PTFRfUFJCU19QT0xZTk9NSUFMX1BSQlNfNTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBQUkJTXzU4LiAqLworICAgIEJDTU9MVF9QUkJTX1BPTFlOT01JQUxfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfcHJic19wb2x5bm9taWFsOworCisvKiogUFJCUyBjaGVja2VyIG1vZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3ByYnNfY2hlY2tlcl9tb2RlCit7CisgICAgQkNNT0xUX1BSQlNfQ0hFQ0tFUl9NT0RFX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1BSQlNfQ0hFQ0tFUl9NT0RFX1NFTEZfU1lOQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU2VsZi1zeW5jIG1vZGUgdy8gaHlzdGVyZXNpcy4gUFJCUyBzZWVkIHJlZ2lzdGVyIGlzIGNvbnRpbnVvdXNseSBzZWVkZWQgd2l0aCBwcmV2aW91cyByZWNlaXZlZCBiaXRzLiAgVGhpcyBtb2RlIHJlc3VsdHMgaW4gZmFzdGVyIGxvY2tpbmcsIGJ1dCBiaXQgZXJyb3JzIGFyZSBjb3VudGVkIG11bHRpcGxlIHRpbWVzIChvZnRlbiBieSAzeCkuICAqLworICAgIEJDTU9MVF9QUkJTX0NIRUNLRVJfTU9ERV9JTklUSUFMX1NFRURfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEluaXRpYWwgc2VlZCBtb2RlIHcvIGh5c3RlcmVzaXMuIFBSQlMgc2VlZCByZWdpc3RlcnMgaXMgc2VlZGVkIHdpdGggcHJldmlvdXMgcmVjZWl2ZWQgYml0cyBvbmx5IHRpbGwgUFJCUyBsb2NrIGlzICBhY3F1aXJlZCBhbmQgdGhlbiB0aGV5IHJ1biBsb2NhbGx5IGluZGVwZW5kZW50bHkgZnJvbSB0aGUgcmVjZWl2ZWQgZGF0YSB1bnRpbCB0aGUgY2hlY2tlciBnb2VzIG91dCBvZiBQUkJTIGxvY2suICAqLworICAgIEJDTU9MVF9QUkJTX0NIRUNLRVJfTU9ERV9JTklUSUFMX1NFRURfTU9ERV8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IEluaXRpYWwgc2VlZCBtb2RlIHcvbyBoeXN0ZXJlc2lzLiBTaW1pbGFyIHRvIG1vZGUgMSBhYm92ZSBleGNlcHQgb25jZSBsb2NrZWQgaXQgc3RheXMgbG9ja2VkIHVudGlsIFBSQlMgaXMgZGlzYWJsZWQuICAgICovCisgICAgQkNNT0xUX1BSQlNfQ0hFQ0tFUl9NT0RFX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfcHJic19jaGVja2VyX21vZGU7CisKKy8qKiBQUkJTIExvY2sgU3RhdGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3ByYnNfbG9ja19zdGF0ZQoreworICAgIEJDTU9MVF9QUkJTX0xPQ0tfU1RBVEVfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9QUkJTX0xPQ0tfU1RBVEVfVU5MT0NLRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFBSQlMgQ2hlY2tlciBpcyBvdXQgb2YgTE9DSyBzdGF0ZSBhbmQgc3RhdGUgbWFjaGluZSBpcyBzZWFyY2hpbmcgZm9yIGEgTE9DSyAqLworICAgIEJDTU9MVF9QUkJTX0xPQ0tfU1RBVEVfTE9DS0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFBSQlMgQ2hlY2tlciBpcyBpbiBMT0NLRUQgc3RhdGUgKi8KKyAgICBCQ01PTFRfUFJCU19MT0NLX1NUQVRFX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3ByYnNfbG9ja19zdGF0ZTsKKworLyoqIFBvc3NpYmxlIFJhbWFuIE1pdGlnYXRpb24gc2V0dGluZ3MuICBSYW1hbiBtaXRpZ2F0aW9uIGluamVjdHMgcHNldWRvLW5vaXNlIAorICogaW50byB0aGUgMUcgZG93bnN0cmVhbSBkYXRhIHBhdGggdG8gcmVkdWNlIGludGVyZmVyZW5jZSB3aXRoIGFuYWxvZyB2aWRlbyAKKyAqIHNpZ25hbHMgb24gb3RoZXIgd2F2ZWxlbmd0aHMuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3JhbWFuX21pdGlnYXRpb25fbW9kZQoreworICAgIEJDTU9MVF9SQU1BTl9NSVRJR0FUSU9OX01PREVfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9SQU1BTl9NSVRJR0FUSU9OX01PREVfRElTQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IE5vIHBhY2tldHMgYXJlIGdlbmVyYXRlZC4gKi8KKyAgICBCQ01PTFRfUkFNQU5fTUlUSUdBVElPTl9NT0RFX1JBTkRPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBQc2V1ZG8tcmFuZG9tIHBhY2tldHMgYXJlIGdlbmVyYXRlZC4gKi8KKyAgICBCQ01PTFRfUkFNQU5fTUlUSUdBVElPTl9NT0RFX0ZJWEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBGaXhlZCBiYWNrZ3JvdW5kIHBhY2tldHMgYXJlIGdlbmVyYXRlZC4gKi8KKyAgICBCQ01PTFRfUkFNQU5fTUlUSUdBVElPTl9NT0RFX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfcmFtYW5fbWl0aWdhdGlvbl9tb2RlOworCisvKiogUmFuZ2luZyBmYWlsIHJlYXNvbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfcmFuZ2luZ19mYWlsX3JlYXNvbgoreworICAgIEJDTU9MVF9SQU5HSU5HX0ZBSUxfUkVBU09OX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9SQU5HSU5HX0ZBSUxfUkVBU09OX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IG5vbmUuICovCisgICAgQkNNT0xUX1JBTkdJTkdfRkFJTF9SRUFTT05fUkFOR0lOR19BQ0tfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgcmFuZ2luZyBhY2sgdGltZW91dC4gKi8KKyAgICBCQ01PTFRfUkFOR0lOR19GQUlMX1JFQVNPTl9QTE9BTV9EQVRBX01JU01BVENIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBwbG9hbSBkYXRhIG1pc21hdGNoLiAqLworICAgIEJDTU9MVF9SQU5HSU5HX0ZBSUxfUkVBU09OX1BMT0FNX1RZUEVfTUlTTUFUQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IHBsb2FtIHR5cGUgbWlzbWF0Y2guICovCisgICAgQkNNT0xUX1JBTkdJTkdfRkFJTF9SRUFTT05fUExPQU1fT05VX0lEX01JU01BVENIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgcGxvYW0gb251IGlkIG1pc21hdGNoLiAqLworICAgIEJDTU9MVF9SQU5HSU5HX0ZBSUxfUkVBU09OX0RSSUZUX0VYQ0VFREVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IGRyaWZ0IGV4Y2VlZGVkLiAqLworICAgIEJDTU9MVF9SQU5HSU5HX0ZBSUxfUkVBU09OX05PX1BMT0FNX1JFQ0VJVkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAvKio8IG5vIHBsb2FtIHJlY2VpdmVkLiAqLworICAgIEJDTU9MVF9SQU5HSU5HX0ZBSUxfUkVBU09OX0xPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAvKio8IGxvcy4gKi8KKyAgICBCQ01PTFRfUkFOR0lOR19GQUlMX1JFQVNPTl9BTEFSTVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgLyoqPCBhbGFybXMuICovCisgICAgQkNNT0xUX1JBTkdJTkdfRkFJTF9SRUFTT05fX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfcmFuZ2luZ19mYWlsX3JlYXNvbjsKKworLyoqIFJlZ2lzdHJhdGlvbiBCZWhhdmlvci4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfcmVnaXN0cmF0aW9uX2JlaGF2aW9yCit7CisgICAgQkNNT0xUX1JFR0lTVFJBVElPTl9CRUhBVklPUl9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1JFR0lTVFJBVElPTl9CRUhBVklPUl9BVVRPTUFUSUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQWxsIGxpbmtzIHdpbGwgYmUgYWxsb3dlZCB0byByZWdpc3Rlci4gKi8KKyAgICBCQ01PTFRfUkVHSVNUUkFUSU9OX0JFSEFWSU9SX05PVElGWV9VTktOT1dOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBMaW5rcyB0aGF0IGFyZSBub3QgcHJlLXByb3Zpc2lvbmVkIHdpbGwgbm90IGJlIGFsbG93ZWQgdG8gcmVnaXN0ZXIuICBBIG1hc2thYmxlIGluZGljYXRpb24gd2lsbCBiZSBzZW50IHRvIHRoZSBob3N0IHdoaWNoIGNhbiB0aGVuIGRlY2lkZSBpZiB0aGUgbGluayBzaG91bGQgYmUgcHJvdmlzaW9uZWQuICovCisgICAgQkNNT0xUX1JFR0lTVFJBVElPTl9CRUhBVklPUl9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3JlZ2lzdHJhdGlvbl9iZWhhdmlvcjsKKworLyoqIHJlcXVlc3QgcmVnaXN0cmF0aW9uIGZhaWwgcmVhc29uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9mYWlsX3JlYXNvbgoreworICAgIEJDTU9MVF9SRVFVRVNUX1JFR0lTVFJBVElPTl9GQUlMX1JFQVNPTl9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9SRVFVRVNUX1JFR0lTVFJBVElPTl9GQUlMX1JFQVNPTl9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IE5vbmUuICovCisgICAgQkNNT0xUX1JFUVVFU1RfUkVHSVNUUkFUSU9OX0ZBSUxfUkVBU09OX1JFR0lTVFJBVElPTl9QTE9BTV9USU1FT1VUICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgcmVnaXN0cmF0aW9uIHBsb2FtIHRpbWVvdXQuICovCisgICAgQkNNT0xUX1JFUVVFU1RfUkVHSVNUUkFUSU9OX0ZBSUxfUkVBU09OX09OVV9BTEFSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgb251IGFsYXJtLiAqLworICAgIEJDTU9MVF9SRVFVRVNUX1JFR0lTVFJBVElPTl9GQUlMX1JFQVNPTl9ERUFDVElWQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IGRlYWN0aXZhdGlvbi4gKi8KKyAgICBCQ01PTFRfUkVRVUVTVF9SRUdJU1RSQVRJT05fRkFJTF9SRUFTT05fRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgLyoqPCBkaXNhYmxlLiAqLworICAgIEJDTU9MVF9SRVFVRVNUX1JFR0lTVFJBVElPTl9GQUlMX1JFQVNPTl9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2ZhaWxfcmVhc29uOworCisvKiogUmVzdWx0LiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9yZXN1bHQKK3sKKyAgICBCQ01PTFRfUkVTVUxUX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfUkVTVUxUX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdWNjZXNzLiAqLworICAgIEJDTU9MVF9SRVNVTFRfRkFJTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEZhaWwuICovCisgICAgQkNNT0xUX1JFU1VMVF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfcmVzdWx0OworCisvKiogVHlwZSBvZiB0aGUgcm9ndWUgZGV0ZWN0aW9uIGFsZ29yaXRobS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV90eXBlCit7CisgICAgQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9BTEdPUklUSE1fVFlQRV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9BTEdPUklUSE1fVFlQRV9FQVJMWV9ST0dVRV9ERVRFQ1RJT04gICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgRmlybXdhcmUtZHJpdmVuIHBlcmlvZGljIHByb2Nlc3Mgd2hpY2ggcnVucyBpbiB0aGUgYmFja2dyb3VuZCB0byBkZXRlY3QgdGhlIHBvdGVudGlhbCByb2d1ZSBPTlUuICovCisgICAgQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9BTEdPUklUSE1fVFlQRV9TUEVDSUFMX01BUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgVXNlIHRoZSB1c2VyLXByb3Zpc2lvbmVkIHNwZWNpYWwgYmFuZHdpZHRoIG1hcCB1bnRpbCBpdCBpcyB0b2xkIHRvIHN0b3AuICovCisgICAgQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9BTEdPUklUSE1fVFlQRV9FWFRFTkRFRF9HVUFSRF9USU1FICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgRGVzdHJ1Y3RpdmUgdG9vbCB0aGF0IGV4dGVuZHMgdGhlIGd1YXJkIHRpbWUgb24gYWxsIGJ1cnN0cy4gKi8KKyAgICBCQ01PTFRfUk9HVUVfREVURUNUSU9OX0FMR09SSVRITV9UWVBFX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3R5cGU7CisKKy8qKiBSb2d1ZSBPTlUgZGV0ZWN0aW9uIG1lYXN1cmVtZW50IHR5cGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl93aW5kb3cKK3sKKyAgICBCQ01PTFRfUk9HVUVfREVURUNUSU9OX1dJTkRPV19fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfUk9HVUVfREVURUNUSU9OX1dJTkRPV19TSUxFTlRfV0lORE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTaWxlbnQgd2luZG93IG1lYXN1cmVtZW50LiAqLworICAgIEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0NVVF9PRkZfV0lORE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEN1dC1vZmYgd2luZG93IG1lYXN1cmVtZW50LiAqLworICAgIEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93OworCisvKiogU3RhdHVzIG9mIHRoZSByb2d1ZSBPTlUgZGV0ZWN0aW9uIHJlc3VsdC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfcm9ndWVfbWVhc3VyZW1lbnRfcmVzdWx0Cit7CisgICAgQkNNT0xUX1JPR1VFX01FQVNVUkVNRU5UX1JFU1VMVF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1JPR1VFX01FQVNVUkVNRU5UX1JFU1VMVF9SU1NJX0NPTVBMRVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgUm9ndWUgT05VIFJTU0kgZGV0ZWN0aW9uIGFjdGl2aXR5IGNvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfUk9HVUVfTUVBU1VSRU1FTlRfUkVTVUxUX05PVF9QRVJGT1JNRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBSb2d1ZSBPTlUgZGV0ZWN0aW9uIG5vdCBwZXJmb3JtZWQuICovCisgICAgQkNNT0xUX1JPR1VFX01FQVNVUkVNRU5UX1JFU1VMVF9ST0dVRV9DWUNMRV9TVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgUm9ndWUgT05VIGN5Y2xlIGRldGVjdGlvbiBzdG9wcGVkLiAqLworICAgIEJDTU9MVF9ST0dVRV9NRUFTVVJFTUVOVF9SRVNVTFRfUlNTSV9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IFRoZXJlIHdhcyBhbiBlcnJvciBpbiB0aGUgUlNTSSBtZWFzdXJlbWVudC4gKi8KKyAgICBCQ01PTFRfUk9HVUVfTUVBU1VSRU1FTlRfUkVTVUxUX1JTU0lfTk9UX0NPTVBMRVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgLyoqPCBUaGUgUlNTSSBtZXNhdXJlbWVudCB3YXMgbm90IGNvbXBsZXRlLiAqLworICAgIEJDTU9MVF9ST0dVRV9NRUFTVVJFTUVOVF9SRVNVTFRfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9yb2d1ZV9tZWFzdXJlbWVudF9yZXN1bHQ7CisKKy8qKiBSb2d1ZSBTY2FuIEluZGljYXRpb24gU3RhdHVzIC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfcm9ndWVfc2Nhbl9zdGF0dXMKK3sKKyAgICBCQ01PTFRfUk9HVUVfU0NBTl9TVEFUVVNfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfUk9HVUVfU0NBTl9TVEFUVVNfQ09NUExFVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBSb2d1ZSBTY2FuIHdhcyBjb21wbGV0ZWQuICovCisgICAgQkNNT0xUX1JPR1VFX1NDQU5fU1RBVFVTX0xMSURfU1RBVEVfSVNfQkFEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgbGxpZCBpbiB0YXJnZXRlZCBzY2FuIHdhcyBhbiBhY3RpdmUgbGluay4gKi8KKyAgICBCQ01PTFRfUk9HVUVfU0NBTl9TVEFUVVNfTExJRF9JU19PT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBsbGlkIGluIHRhcmdldGVkIHNjYW4gaXMgb3V0IG9mIHJhbmdlIGZvciBwb24uICovCisgICAgQkNNT0xUX1JPR1VFX1NDQU5fU1RBVFVTX1NDQU5fRVJSX05PUkVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgVGhlcmUgd2VyZSBubyBhdmFpbGFibGUgTElNIGluZGV4ZXMgZm9yIHRoZSBzY2FuLi4gKi8KKyAgICBCQ01PTFRfUk9HVUVfU0NBTl9TVEFUVVNfU0NBTl9FUlJfSU5URVJOQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgLyoqPCBBbiBpbnRlcm5hbCBzb2Z0d2FyZSB3YXMgZW5jb3VudGVyZWQuLiAqLworICAgIEJDTU9MVF9ST0dVRV9TQ0FOX1NUQVRVU19fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3JvZ3VlX3NjYW5fc3RhdHVzOworCisvKiogUlNTSSBtZWFzdXJlbWVudCBmYWlsIHJlYXNvbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfcnNzaV9tZWFzdXJlbWVudF9mYWlsX3JlYXNvbgoreworICAgIEJDTU9MVF9SU1NJX01FQVNVUkVNRU5UX0ZBSUxfUkVBU09OX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9SU1NJX01FQVNVUkVNRU5UX0ZBSUxfUkVBU09OX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IE5vbmUuICovCisgICAgQkNNT0xUX1JTU0lfTUVBU1VSRU1FTlRfRkFJTF9SRUFTT05fTk9fREVMSU1JVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgTm8gZGVsaW1pdGVyLiAqLworICAgIEJDTU9MVF9SU1NJX01FQVNVUkVNRU5UX0ZBSUxfUkVBU09OX05PX0FDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IE5vIGFjY2Vzcy4gKi8KKyAgICBCQ01PTFRfUlNTSV9NRUFTVVJFTUVOVF9GQUlMX1JFQVNPTl9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3Jzc2lfbWVhc3VyZW1lbnRfZmFpbF9yZWFzb247CisKKy8qKiBzZWN1cmUgbXV0dWFsIGF1dGhlbnRpY2F0aW9uIGZhaWwgcmVhc29uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWxfcmVhc29uCit7CisgICAgQkNNT0xUX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTF9SRUFTT05fX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTF9SRUFTT05fVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgc2VjdXJlIG11dHVhbCBhdXRoZW50aWNhdGlvbiB0aW1lb3V0LiAqLworICAgIEJDTU9MVF9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0ZBSUxfUkVBU09OX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsX3JlYXNvbjsKKworLyoqIHNlcmRlcyByYW5naW5nIG1vZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3NlcmRlc19yYW5naW5nX21vZGUKK3sKKyAgICBCQ01PTFRfU0VSREVTX1JBTkdJTkdfTU9ERV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfU0VSREVTX1JBTkdJTkdfTU9ERV9FRF9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBlZCBtb2RlLiAqLworICAgIEJDTU9MVF9TRVJERVNfUkFOR0lOR19NT0RFX0JDRFJfUkVTRVRfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEJDRFIgcmVzZXQgbW9kZS4gKi8KKyAgICBCQ01PTFRfU0VSREVTX1JBTkdJTkdfTU9ERV9GQVNUX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBmYXN0IG1vZGUuICovCisgICAgQkNNT0xUX1NFUkRFU19SQU5HSU5HX01PREVfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfc2VyZGVzX3JhbmdpbmdfbW9kZTsKKworLyoqIFNlckRlcyBJbnN0YW5jZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfc2VyZGVzX2luc3RhbmNlCit7CisgICAgQkNNT0xUX1NFUkRFU19JTlNUQU5DRV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1NFUkRFU19JTlNUQU5DRV9JTlNUQU5DRV8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgUHJpbWFyeSBTZXJkZXMsIG9yIDEwRyBTZXJEZXMgZm9yIEVQT04gcG9uX2lkcy4gKi8KKyAgICBCQ01PTFRfU0VSREVTX0lOU1RBTkNFX0lOU1RBTkNFXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBTZWNvbmRhcnkgU2VyZGVzLCBvciAxRy8yRyBTZXJEZXMgZm9yIEVQT04gcG9uX2lkcy4gKi8KKyAgICBCQ01PTFRfU0VSREVTX0lOU1RBTkNFX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3NlcmRlc19pbnN0YW5jZTsKKworLyoqIFNoYXBlciBNb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9zaGFwZXJfbW9kZQoreworICAgIEJDTU9MVF9TSEFQRVJfTU9ERV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9TSEFQRVJfTU9ERV9MQVlFUl8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFNoYXBlcnMgd2lsbCBjb3VudCBJUEcsIHByZWFtYmxlLCBmcmFtZSwgYW5kIEZDUyAqLworICAgIEJDTU9MVF9TSEFQRVJfTU9ERV9MQVlFUl8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFNoYXBlcnMgd2lsbCBjb3VudCBmcmFtZSBhbmQgRkNTLiAqLworICAgIEJDTU9MVF9TSEFQRVJfTU9ERV9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9zaGFwZXJfbW9kZTsKKworLyoqIEFsbCBwb3NzaWJsZSBzdGF0aXN0aWMgYWxhcm0gdHJpZ2dlciBjb25kaXRpb25zLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9zdGF0X2NvbmRpdGlvbl90eXBlCit7CisgICAgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgVGhlIGFsYXJtIGlzIGRpc2FibGVkLiAqLworICAgIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfVEhSRVNIT0xEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFRoZSBhbGFybSBpcyB0cmlnZ2VyZWQgaWYgdGhlIHN0YXRzIGRlbHRhIHZhbHVlIGJldHdlZW4gc2FtcGxlcyBjcm9zc2VzIHRoZSBjb25maWd1cmVkIHRocmVzaG9sZCBib3VuZGFyeS4gKi8KKyAgICBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1JBTkdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBUaGUgYWxhcm0gaXMgdHJpZ2dlcmVkIGlmIHRoZSBzdGF0cyBkZWx0YSB2YWx1ZSBiZXR3ZWVuIHNhbXBsZXMgZGV2aWF0ZXMgZnJvbSB0aGUgY29uZmlndXJlZCByYW5nZS4gKi8KKyAgICBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9WQUxVRV9USFJFU0hPTEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBUaGUgYWxhcm0gaXMgcmFpc2VkIGlmIHRoZSBzdGF0cyBzYW1wbGUgdmFsdWUgYmVjb21lcyBncmVhdGVyIHRoYW4gdGhpcyBsZXZlbC4gIFRoZSBhbGFybSBpcyBjbGVhcmVkIHdoZW4gdGhlIGhvc3QgcmVhZCB0aGUgc3RhdHMuICovCisgICAgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfc3RhdF9jb25kaXRpb25fdHlwZTsKKworLyoqIFN3aXRjaCBvdmVyIHR5cGUgYyBvbnUgc3RhdGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3N3aXRjaF9vdmVyX3R5cGVfY19vbnVfc3RhdGUKK3sKKyAgICBCQ01PTFRfU1dJVENIX09WRVJfVFlQRV9DX09OVV9TVEFURV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfU1dJVENIX09WRVJfVFlQRV9DX09OVV9TVEFURV9BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBBY3RpdmUuICovCisgICAgQkNNT0xUX1NXSVRDSF9PVkVSX1RZUEVfQ19PTlVfU1RBVEVfQUNUSVZFX1NUQU5EQlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgQWN0aXZlIHN0YW5kYnkuICovCisgICAgQkNNT0xUX1NXSVRDSF9PVkVSX1RZUEVfQ19PTlVfU1RBVEVfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9zd2l0Y2hfb3Zlcl90eXBlX2Nfb251X3N0YXRlOworCisvKiogU3lzdGVtIHdvcmtpbmcgbW9kZSAoR1BPTi9FUE9OIGV0Yy4pIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3N5c3RlbV9tb2RlCit7CisgICAgQkNNT0xUX1NZU1RFTV9NT0RFX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1NZU1RFTV9NT0RFX0dQT05fXzE2X1ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgMTZ4IEdQT04gKi8KKyAgICBCQ01PTFRfU1lTVEVNX01PREVfR1BPTl9fOF9YICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCA4eCBHUE9OICovCisgICAgQkNNT0xUX1NZU1RFTV9NT0RFX0dQT05fXzRfWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgNHggR1BPTiAqLworICAgIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX18xNl9YICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IDE2eCBFUE9OICovCisgICAgQkNNT0xUX1NZU1RFTV9NT0RFX1hHUE9OXzFfXzhfWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgOHggWEdQT04xICovCisgICAgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzhfWF9DT0VYSVNURU5DRV9URE1BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgOHggRVBPTiBjb2V4aXN0ZW5jZSBURE1BICovCisgICAgQkNNT0xUX1NZU1RFTV9NT0RFX0FFXzhfWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgIC8qKjwgOHggMTBHIEFjdGl2ZSBFdGhlcm5ldCAqLworICAgIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX184X1hfMTBfRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAvKio8IDh4IEVQT04gKDEwLzEwIG9ubHkpICovCisgICAgQkNNT0xUX1NZU1RFTV9NT0RFX0dQT05fOF9YR1BPTl80X1hfQ09FWElTVEVOQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgIC8qKjwgOHggR1BPTiA0eCBYR1BPTiBjb2V4aXN0ZW5jZSAqLworICAgIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX184X1ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5LCAgICAvKio8IDh4IEVQT04gKDEvMSBvbmx5KSAqLworICAgIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX180X1ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwgICAvKio8IDR4IEVQT04gKDEvMSBvbmx5KSAqLworICAgIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX180X1hfQ09FWElTVEVOQ0VfVERNQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAvKio8IDR4IEVQT04gY29leGlzdGVuY2UgVERNQSAqLworICAgIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX180X1hfMTBfRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMiwgICAvKio8IDR4IEVQT04gKDEwLzEwIG9ubHkpICovCisgICAgQkNNT0xUX1NZU1RFTV9NT0RFX1hHU19fMl9YXzEwX0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgIC8qKjwgMnggWEdTLVBPTiAoMTAvMTApICovCisgICAgQkNNT0xUX1NZU1RFTV9NT0RFX05HUE9OMl9fMl9YXzEwX0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0LCAgIC8qKjwgMnggTkdQT04yICgxMC8xMCkgKi8KKyAgICBCQ01PTFRfU1lTVEVNX01PREVfTkdQT04yX184X1hfMl9QXzVfRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUsICAgLyoqPCA4eCBOR1BPTjIgKDEwLzIuNSkgKi8KKyAgICBCQ01PTFRfU1lTVEVNX01PREVfWEdQT05fMV9fNF9YICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYsICAgLyoqPCA0eCBYR1BPTjEgKi8KKyAgICBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fMl9YXzEwX0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTcsICAgLyoqPCAyeCBFUE9OICgxMC8xMCBvbmx5KSAqLworICAgIEJDTU9MVF9TWVNURU1fTU9ERV9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9zeXN0ZW1fbW9kZTsKKworLyoqIFVTIG9wZXJhdGluZyB3YXZlbGVuZ3RoIGJhbmRzLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF91c19vcGVyYXRpbmdfd2F2ZWxlbmd0aF9iYW5kcworeworICAgIEJDTU9MVF9VU19PUEVSQVRJTkdfV0FWRUxFTkdUSF9CQU5EU19FWFBBTkRFRF9TUEVDVFJVTV9XSURFX0JBTkQgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEV4cGFuZGVkIHNwZWN0cnVtIHdpZGUgYmFuZCBvcHRpb24gKi8KKyAgICBCQ01PTFRfVVNfT1BFUkFUSU5HX1dBVkVMRU5HVEhfQkFORFNfRVhQQU5ERURfU1BFQ1RSVU1fUkVEVUNFRF9CQU5EICAgICAgICAgICAgID0gMSwgICAgLyoqPCBFeHBhbmRlZCBzcGVjdHJ1bSByZWR1Y2VkIGJhbmQgb3B0aW9uICovCisgICAgQkNNT0xUX1VTX09QRVJBVElOR19XQVZFTEVOR1RIX0JBTkRTX0VYUEFOREVEX1NQRUNUUlVNX05BUlJPV19CQU5EICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgRXhwYW5kZWQgc3BlY3RydW0gcmVkdWNlZCBiYW5kIG9wdGlvbiAqLworICAgIEJDTU9MVF9VU19PUEVSQVRJTkdfV0FWRUxFTkdUSF9CQU5EU19TSEFSRURfU1BFQ1RSVU1fV0lERV9CQU5EICAgICAgICAgICAgICAgICAgPSAxNiwgICAvKio8IFNoYXJlZCBzcGVjdHJ1bSB3aWRlIGJhbmQgb3B0aW9uICovCisgICAgQkNNT0xUX1VTX09QRVJBVElOR19XQVZFTEVOR1RIX0JBTkRTX1NIQVJFRF9TUEVDVFJVTV9SRURVQ0VEX0JBTkQgICAgICAgICAgICAgICA9IDE3LCAgIC8qKjwgU2hhcmVkIHNwZWN0cnVtIHJlZHVjZWQgYmFuZCBvcHRpb24gKi8KKyAgICBCQ01PTFRfVVNfT1BFUkFUSU5HX1dBVkVMRU5HVEhfQkFORFNfU0hBUkVEX1NQRUNUUlVNX05BUlJPV19CQU5EICAgICAgICAgICAgICAgID0gMTggICAgLyoqPCBTaGFyZWQgc3BlY3RydW0gd2lkZSBuYXJyb3cgb3B0aW9uICovCit9IGJjbW9sdF91c19vcGVyYXRpbmdfd2F2ZWxlbmd0aF9iYW5kczsKKworLyoqIFRyYWZmaWMgcmVzdW1lIHJlc3VsdC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfdHJhZmZpY19yZXN1bWVfcmVzdWx0Cit7CisgICAgQkNNT0xUX1RSQUZGSUNfUkVTVU1FX1JFU1VMVF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1RSQUZGSUNfUkVTVU1FX1JFU1VMVF9TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3VjY2Vzcy4gKi8KKyAgICBCQ01PTFRfVFJBRkZJQ19SRVNVTUVfUkVTVUxUX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBGYWlsdXJlLiAqLworICAgIEJDTU9MVF9UUkFGRklDX1JFU1VNRV9SRVNVTFRfU1VTUEVDVEVEX0xPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IHN1c3BlY3RlZF9sb3MuICovCisgICAgQkNNT0xUX1RSQUZGSUNfUkVTVU1FX1JFU1VMVF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3RyYWZmaWNfcmVzdW1lX3Jlc3VsdDsKKworLyoqIHRyeCBjYWxpYnJhdGlvbiB0cmlnZ2VyLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fdHJpZ2dlcgoreworICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fVFJJR0dFUl9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fVFJJR0dFUl9FUE9OX1NUQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IGVwb24gc3RhdC4gKi8KKyAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1RSSUdHRVJfR1BPTl9CQ0RSX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBncG9uIGJjZHIgcmVzZXQuICovCisgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9UUklHR0VSX0dQT05fVFJYX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgZ3BvbiB0cnggcmVzZXQuICovCisgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9UUklHR0VSX0dQT05fVFJYX0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgZ3BvbiB0cnggZWQuICovCisgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9UUklHR0VSX0dQT05fUlNTSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgZ3BvbiByc3NpLiAqLworICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fVFJJR0dFUl9HUE9OX0VPQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IGdwb24gZW9iLiAqLworICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fVFJJR0dFUl9HUE9OX1JBTkdJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAvKio8IGdwb24gcmFuZ2luZy4gKi8KKyAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1RSSUdHRVJfU0VSREVTX0JVUlNUX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgLyoqPCBzZXJkZXMgYnVyc3QgZW4uICovCisgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9UUklHR0VSX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyOworCisvKiogdHJ4IGNhbGlicmF0aW9uIHRyaWdnZXIgcG9zaXRpb24uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyX3Bvc2l0aW9uCit7CisgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9UUklHR0VSX1BPU0lUSU9OX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9UUklHR0VSX1BPU0lUSU9OX1JJU0lORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgcmlzaW5nIGVkZ2UuICovCisgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9UUklHR0VSX1BPU0lUSU9OX0ZBTExJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgZmFsbGluZyBlZGdlLiAqLworICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fVFJJR0dFUl9QT1NJVElPTl9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyX3Bvc2l0aW9uOworCisvKiogdHJ4IGNhbGlicmF0aW9uIHdpbmRvdyBtb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fd2luZG93X21vZGUKK3sKKyAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1dJTkRPV19NT0RFX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1dJTkRPV19NT0RFX1JBTkdJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCByYW5naW5nLiAqLworICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fV0lORE9XX01PREVfTk9OX1JBTkdJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IG5vbiByYW5naW5nLiAqLworICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fV0lORE9XX01PREVfQk9USCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IHJhbmdpbmcgYW5kIG5vbiByYW5naW5nLiAqLworICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fV0lORE9XX01PREVfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3dpbmRvd19tb2RlOworCisvKiogVFJYIHR5cGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3RyeF90eXBlCit7CisgICAgQkNNT0xUX1RSWF9UWVBFX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1RSWF9UWVBFX1NQU180M180OF9IX0hQX0NERV9TRF8yMDEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU291cmNlUGhvdG9uaWNzIC0gU1BTLTQzLTQ4SC1IUC1DREUtU0QgUmVzZXQgaXMgcmVxdWlyZWQgQkVGT1JFLCBUUlggaXMgU3F1ZWxjaGVkLiB0aWxsIDIwMTMgcmV2LiAgKi8KKyAgICBCQ01PTFRfVFJYX1RZUEVfU09HXzQzMjFfUFNHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBTdXBlcnhvbiBCKyB0eXBlICovCisgICAgQkNNT0xUX1RSWF9UWVBFX0xURV8zNjgwX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgTElHRU5UIExURTM2ODBNLiAqLworICAgIEJDTU9MVF9UUlhfVFlQRV9TT1VSQ0VfUEhPVE9OSUNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IFNvdXJjZSBQaG90b25pY3MuICovCisgICAgQkNNT0xUX1RSWF9UWVBFX0xURV8zNjgwX1BfVFlQRV9DX1BMVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgTElHRU5UIExURTM2ODBQX1RZUEVfQ19QTFVTLiAqLworICAgIEJDTU9MVF9UUlhfVFlQRV9BTlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IEFueS4gKi8KKyAgICBCQ01PTFRfVFJYX1RZUEVfQU5ZX1JFU0VUX0dVQVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBBbnkgcmVzZXQgZ3VhcmQuICovCisgICAgQkNNT0xUX1RSWF9UWVBFX0FOWV9SRVNFVF9QUkVBTUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgIC8qKjwgQW55IHJlc2V0IHByZWFtYmxlLiAqLworICAgIEJDTU9MVF9UUlhfVFlQRV9XVERfUlRYTV8xNjdfNTI2X0NQTFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAvKio8IFdURCBSVFhNMTY3IDUyNiBDKy4gKi8KKyAgICBCQ01PTFRfVFJYX1RZUEVfV1REX1JUWE1fMTY3XzUyMl9CUExVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgLyoqPCBXVEQgUlRYTTE2NyA1MjIgQisuICovCisgICAgQkNNT0xUX1RSWF9UWVBFX0xURV8zNjgwX1BfQkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgIC8qKjwgTElHRU5UIEhpU2Vuc2UgTFRFMzY4MFAtQkMuICovCisgICAgQkNNT0xUX1RSWF9UWVBFX1NPR1FfNDMyMV9QU0dCX0NfUExVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExLCAgIC8qKjwgU3VwZXJ4b24gQysgdHlwZSAqLworICAgIEJDTU9MVF9UUlhfVFlQRV9XVERfUlRYTTE2N181MjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMiwgICAvKio8IFdURCBSVFhNMTY3XzUyMS4gKi8KKyAgICBCQ01PTFRfVFJYX1RZUEVfTFRFMzY3OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMsICAgLyoqPCBMVEUzNjc4LiAqLworICAgIEJDTU9MVF9UUlhfVFlQRV9TT0dQXzQzMjFfUFNHQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNCwgICAvKio8IFN1cGVyeG9uIFNPR1A0MzIxLVBTR0EuICovCisgICAgQkNNT0xUX1RSWF9UWVBFX0dQT05fR0VORVJBTF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1LCAgIC8qKjwgZ3BvbiBnZW5lcmFsIDEuICovCisgICAgQkNNT0xUX1RSWF9UWVBFX0dQT05fR0VORVJBTF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2LCAgIC8qKjwgZ3BvbiBnZW5lcmFsIDIuICovCisgICAgQkNNT0xUX1RSWF9UWVBFX0dQT05fR0VORVJBTF8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3LCAgIC8qKjwgZ3BvbiBnZW5lcmFsIDMuICovCisgICAgQkNNT0xUX1RSWF9UWVBFX0dQT05fR0VORVJBTF80ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4LCAgIC8qKjwgZ3BvbiBnZW5lcmFsIDQuICovCisgICAgQkNNT0xUX1RSWF9UWVBFX0dQT05fR0VORVJBTF81ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5LCAgIC8qKjwgZ3BvbiBnZW5lcmFsIDUuICovCisgICAgQkNNT0xUX1RSWF9UWVBFX0dQT05fR0VORVJBTF82ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwLCAgIC8qKjwgZ3BvbiBnZW5lcmFsIDYuICovCisgICAgQkNNT0xUX1RSWF9UWVBFX0dQT05fR0VORVJBTF83ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxLCAgIC8qKjwgZ3BvbiBnZW5lcmFsIDcuICovCisgICAgQkNNT0xUX1RSWF9UWVBFX0dQT05fR0VORVJBTF84ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIyLCAgIC8qKjwgZ3BvbiBnZW5lcmFsIDguICovCisgICAgQkNNT0xUX1RSWF9UWVBFX0dQT05fR0VORVJBTF85ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzLCAgIC8qKjwgZ3BvbiBnZW5lcmFsIDkuICovCisgICAgQkNNT0xUX1RSWF9UWVBFX0dQT05fR0VORVJBTF8xMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0LCAgIC8qKjwgZ3BvbiBnZW5lcmFsIDEwLiAqLworICAgIEJDTU9MVF9UUlhfVFlQRV9HUE9OX0dFTkVSQUxfMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNSwgICAvKio8IGdwb24gZ2VuZXJhbCAxMS4gKi8KKyAgICBCQ01PTFRfVFJYX1RZUEVfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF90cnhfdHlwZTsKKworLyoqIFR1bmUgaW4gZmFpbCByZWFzb24uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3R1bmVfaW5fZmFpbF9yZWFzb24KK3sKKyAgICBCQ01PTFRfVFVORV9JTl9GQUlMX1JFQVNPTl9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfVFVORV9JTl9GQUlMX1JFQVNPTl9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBub25lLiAqLworICAgIEJDTU9MVF9UVU5FX0lOX0ZBSUxfUkVBU09OX05PX1RVTklOR19SRVNQT05TRV9QTE9BTV9SRUNFSVZFRCAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IE5vIHR1bmluZyByZXNwb25zZSBwbG9hbSByZWNlaXZlZC4gKi8KKyAgICBCQ01PTFRfVFVORV9JTl9GQUlMX1JFQVNPTl9PTlVfQUNUSVZBVElPTl9GQUlMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBvbnUgYWN0aXZhdGlvbiBmYWlsZWQuICovCisgICAgQkNNT0xUX1RVTkVfSU5fRkFJTF9SRUFTT05fX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfdHVuZV9pbl9mYWlsX3JlYXNvbjsKKworLyoqIFR1bmUgb3V0IGZhaWwgcmVhc29uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF90dW5lX291dF9mYWlsX3JlYXNvbgoreworICAgIEJDTU9MVF9UVU5FX09VVF9GQUlMX1JFQVNPTl9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9UVU5FX09VVF9GQUlMX1JFQVNPTl9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IG5vbmUuICovCisgICAgQkNNT0xUX1RVTkVfT1VUX0ZBSUxfUkVBU09OX05BQ0tfUExPQU1fUkVDRUlWRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgTkFDSyBwbG9hbSByZWNlaXZlZC4gKi8KKyAgICBCQ01PTFRfVFVORV9PVVRfRkFJTF9SRUFTT05fTk9fVFVOSU5HX1JFU1BPTlNFX1BMT0FNX1JFQ0VJVkVEICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBubyB0dW5pbmcgcmVzcG9uc2UgcGxvYW0gcmVjZWl2ZWQuICovCisgICAgQkNNT0xUX1RVTkVfT1VUX0ZBSUxfUkVBU09OX1RTT1VSQ0VfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgdHNvdXJjZSB0aW1lb3V0LiAqLworICAgIEJDTU9MVF9UVU5FX09VVF9GQUlMX1JFQVNPTl9ST0xMQkFDS19SRVFVRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IHJvbGxiYWNrIHJlcXVlc3QuICovCisgICAgQkNNT0xUX1RVTkVfT1VUX0ZBSUxfUkVBU09OX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfdHVuZV9vdXRfZmFpbF9yZWFzb247CisKKy8qKiBVQVJUIGJhdWQgcmF0ZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfdWFydF9iYXVkcmF0ZQoreworICAgIEJDTU9MVF9VQVJUX0JBVURSQVRFX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9VQVJUX0JBVURSQVRFX1VBUlRfUkFURV80ODAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFVBUlQgcmF0ZSA0ODAwLiAqLworICAgIEJDTU9MVF9VQVJUX0JBVURSQVRFX1VBUlRfUkFURV85NjAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFVBUlQgcmF0ZSA5NjAwLiAqLworICAgIEJDTU9MVF9VQVJUX0JBVURSQVRFX1VBUlRfUkFURV8xNDQwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IFVBUlQgcmF0ZSAxNDQwMC4gKi8KKyAgICBCQ01PTFRfVUFSVF9CQVVEUkFURV9VQVJUX1JBVEVfMTkyMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBVQVJUIHJhdGUgMTkyMDAuICovCisgICAgQkNNT0xUX1VBUlRfQkFVRFJBVEVfVUFSVF9SQVRFXzM4NDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgVUFSVCByYXRlIDM4NDAwLiAqLworICAgIEJDTU9MVF9VQVJUX0JBVURSQVRFX1VBUlRfUkFURV81NzYwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IFVBUlQgcmF0ZSA1NzYwMC4gKi8KKyAgICBCQ01PTFRfVUFSVF9CQVVEUkFURV9VQVJUX1JBVEVfMTE1MjAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBVQVJUIHJhdGUgMTE1MjAwLiAqLworICAgIEJDTU9MVF9VQVJUX0JBVURSQVRFX1VBUlRfUkFURV8yMzA0MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAvKio8IFVBUlQgcmF0ZSAyMzA0MDAuICovCisgICAgQkNNT0xUX1VBUlRfQkFVRFJBVEVfVUFSVF9SQVRFXzM4MDQwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgIC8qKjwgVUFSVCByYXRlIDM4MDQwMC4gKi8KKyAgICBCQ01PTFRfVUFSVF9CQVVEUkFURV9VQVJUX1JBVEVfNDYwODAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgLyoqPCBVQVJUIHJhdGUgNDYwODAwLiAqLworICAgIEJDTU9MVF9VQVJUX0JBVURSQVRFX1VBUlRfUkFURV85MjE2MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwgICAvKio8IFVBUlQgcmF0ZSA5MjE2MDAuICovCisgICAgQkNNT0xUX1VBUlRfQkFVRFJBVEVfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF91YXJ0X2JhdWRyYXRlOworCisvKiogdXNfZ2VtX3BvcnRfZGVzdGluYXRpb24uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3VzX2dlbV9wb3J0X2Rlc3RpbmF0aW9uCit7CisgICAgQkNNT0xUX1VTX0dFTV9QT1JUX0RFU1RJTkFUSU9OX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1VTX0dFTV9QT1JUX0RFU1RJTkFUSU9OX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgZGF0YS4gKi8KKyAgICBCQ01PTFRfVVNfR0VNX1BPUlRfREVTVElOQVRJT05fQ1BVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBjcHUuICovCisgICAgQkNNT0xUX1VTX0dFTV9QT1JUX0RFU1RJTkFUSU9OX09NQ0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgb21jaS4gKi8KKyAgICBCQ01PTFRfVVNfR0VNX1BPUlRfREVTVElOQVRJT05fX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfdXNfZ2VtX3BvcnRfZGVzdGluYXRpb247CisKKy8qKiBVUyBWTEFOIGFjdGlvbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfdXNfdmxhbl9hY3Rpb24KK3sKKyAgICBCQ01PTFRfVVNfVkxBTl9BQ1RJT05fQUREICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBBZGQuICovCisgICAgQkNNT0xUX1VTX1ZMQU5fQUNUSU9OX1RSQU5TUEFSRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAgICAgIC8qKjwgVHJhbnNwYXJlbnQuICovCit9IGJjbW9sdF91c192bGFuX2FjdGlvbjsKKworLyoqIFZMQU4gdG8gZmxvdyBtYXBwaW5nIG1ldGhvZC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfdmxhbl90b19mbG93X21hcHBpbmdfbWV0aG9kCit7CisgICAgQkNNT0xUX1ZMQU5fVE9fRkxPV19NQVBQSU5HX01FVEhPRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1ZMQU5fVE9fRkxPV19NQVBQSU5HX01FVEhPRF9WSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgVklELiAqLworICAgIEJDTU9MVF9WTEFOX1RPX0ZMT1dfTUFQUElOR19NRVRIT0RfTUFDUExVU1ZJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IE1BQytWSUQuICovCisgICAgQkNNT0xUX1ZMQU5fVE9fRkxPV19NQVBQSU5HX01FVEhPRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF92bGFuX3RvX2Zsb3dfbWFwcGluZ19tZXRob2Q7CisKKy8qKiBYR1BPTiBHRU0gUG9ydCBTdGF0ZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdGUKK3sKKyAgICBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVEVfTk9UX0NPTkZJR1VSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBub3QgY29uZmlndXJlZC4gKi8KKyAgICBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVEVfSU5BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBpbmFjdGl2ZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVEVfQUNUSVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgLyoqPCBhY3RpdmUuICovCit9IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0ZTsKKworLyoqIHhncG9uIG51bSBvZiBvbnVzLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9udW1fb2Zfb251cworeworICAgIEJDTU9MVF9YR1BPTl9OVU1fT0ZfT05VU19fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9OVU1fT0ZfT05VU19YR1BPTl9TVVBQT1JUXzI1Nl9PTlVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IHhncG9uIHN1cHBvcnQgMjU2IG9udXMuICovCisgICAgQkNNT0xUX1hHUE9OX05VTV9PRl9PTlVTX1hHUE9OX1NVUFBPUlRfNTEwX09OVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgeGdwb24gc3VwcG9ydCA1MTAgb251cy4gKi8KKyAgICBCQ01PTFRfWEdQT05fTlVNX09GX09OVVNfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9udW1fb2Zfb251czsKKworLyoqIHhncG9uIHNlcmRlcyByYW5naW5nIG1vZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX3NlcmRlc19yYW5naW5nX21vZGUKK3sKKyAgICBCQ01PTFRfWEdQT05fU0VSREVTX1JBTkdJTkdfTU9ERV9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fU0VSREVTX1JBTkdJTkdfTU9ERV9FRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBlZC4gKi8KKyAgICBCQ01PTFRfWEdQT05fU0VSREVTX1JBTkdJTkdfTU9ERV9CQ0RSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBiY2RyLiAqLworICAgIEJDTU9MVF9YR1BPTl9TRVJERVNfUkFOR0lOR19NT0RFX0ZBU1RfUkFOR0lORzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IGZhc3QgcmFuZ2luZzEuICovCisgICAgQkNNT0xUX1hHUE9OX1NFUkRFU19SQU5HSU5HX01PREVfRkFTVF9SQU5HSU5HMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgZmFzdCByYW5naW5nMi4gKi8KKyAgICBCQ01PTFRfWEdQT05fU0VSREVTX1JBTkdJTkdfTU9ERV9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX3NlcmRlc19yYW5naW5nX21vZGU7CisKKy8qKiBYR1BPTiBUUlggdHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fdHJ4X3R5cGUKK3sKKyAgICBCQ01PTFRfWEdQT05fVFJYX1RZUEVfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fVFJYX1RZUEVfTFRIXzcyMjJfUEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBMaWdlbnQgTFRIIDcyMjItUEMuICovCisgICAgQkNNT0xUX1hHUE9OX1RSWF9UWVBFX1VTRVJfREVGSU5FRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgVXNlciBEZWZpbmVkLiAqLworICAgIEJDTU9MVF9YR1BPTl9UUlhfVFlQRV9XVERfUlRYTTI2Nl83MDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IFdURF9SVFhNMjY2XzcwMi4gKi8KKyAgICBCQ01PTFRfWEdQT05fVFJYX1RZUEVfTFRIXzcyMjJfQkNfUExVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBTRlArICovCisgICAgQkNNT0xUX1hHUE9OX1RSWF9UWVBFX0xUSF83MjI2X1BDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgWEdTICovCisgICAgQkNNT0xUX1hHUE9OX1RSWF9UWVBFX0xUSF81MzAyX1BDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgMTBHIEVQT04gZm9yIFhHUyBtb2RlICovCisgICAgQkNNT0xUX1hHUE9OX1RSWF9UWVBFX1hHUE9OX0dFTkVSQUxfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgIC8qKjwgeGdwb24gZ2VuZXJhbCAxLiAqLworICAgIEJDTU9MVF9YR1BPTl9UUlhfVFlQRV9YR1BPTl9HRU5FUkFMXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAvKio8IHhncG9uIGdlbmVyYWwgMi4gKi8KKyAgICBCQ01PTFRfWEdQT05fVFJYX1RZUEVfTFRXXzYyN19YX1BDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgLyoqPCBTdXBwb3J0cyBOR1BPTjIgVFJ4IGZvciB2YXJpb3VzIGNoYW5uZWxzICovCisgICAgQkNNT0xUX1hHUE9OX1RSWF9UWVBFX1hQUF9YRV9SXzNfQ0RGQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgIC8qKjwgMTBHIEVQT04gZm9yIFhHUyBtb2RlICovCisgICAgQkNNT0xUX1hHUE9OX1RSWF9UWVBFX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl90cnhfdHlwZTsKKworLyoqIEFjdHVhbCBTY2hlZHVsZXIvU2hhcGVyLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2FjdHVhbF9zY2hlZHVsZXJzaGFwZXIKK3sKKyAgICBiY21vbHRfdGltZV9xdWFudGEgYWN0dWFsX21ic190cTsgICAgICAgLyoqPCBBY3R1YWwgTUJTIChUUSkuICovCisgICAgYmNtb2x0X3RpbWVfcXVhbnRhIGFjdHVhbF93ZWlnaHRfdHE7ICAgIC8qKjwgQWN0dWFsIFdlaWdodCAoVFEpLiAqLworfSBiY21vbHRfYWN0dWFsX3NjaGVkdWxlcnNoYXBlcjsKKworLyoqIDEyOC1iaXQgQUVTIGtleSB1c2VkIGZvciBPTlUgYXV0aGVudGljYXRpb24uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfYWVzX2tleQoreworICAgIHVpbnQ4X3QgYnl0ZXNbMTZdOyAgLyoqPCBCeXRlcyB0aGF0IGNvbXByaXNlIHRoZSBrZXkuICovCit9IGJjbW9sdF9hZXNfa2V5OworCisvKiogV2hhdCBwb3J0aW9uIG9mIHRoZSBjYXB0dXJlIGJ1ZmZlciB0byByZWFkLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXIKK3sKKyAgICB1aW50MzJfdCBvZmZzZXQ7ICAgIC8qKjwgVGhlIGJ5dGVzIG9mZnNldCB0byByZWFkIGZyb20uICovCisgICAgdWludDMyX3Qgc2l6ZTsgICAgICAvKio8IFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4gKi8KK30gYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXI7CisKKy8qKiBDb25maWd1cmF0aW9uIGZvciBBUEkgY2FwdHVyZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9hcGlfY2FwdHVyZV9jb25maWcKK3sKKyAgICBiY21vbHRfYXBpX2NhcHR1cmVfbG9jYXRpb24gbG9jYXRpb247ICAgLyoqPCBXaGVyZSB0byBwZXJmb3JtIHRoZSBBUEkgY2FwdHVyZS4gKi8KKyAgICB1aW50MzJfdCBidWZmZXJfc2l6ZV9ieXRlczsgICAgICAgICAgICAgLyoqPCBNYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBjYXB0dXJlLiAqLworICAgIGJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfbW9kZSBidWZmZXJfbW9kZTsgLyoqPCBXaGF0IHRvIGRvIHdoZW4gdGhlIGNhcHR1cmUgYnVmZmVyIGlzIGZ1bGwuICovCit9IGJjbW9sdF9hcGlfY2FwdHVyZV9jb25maWc7CisKKy8qKiBTdGF0aXN0aWNzIG9uIHRoZSBtb3N0IHJlY2VudCBBUEkgY2FwdHVyZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9hcGlfY2FwdHVyZV9zdGF0cworeworICAgIHVpbnQzMl90IGJ1ZmZlcl91c2VkX2J5dGVzOyAvKio8IFVzZWQgc3BhY2UgaW4gdGhlIGNhcHR1cmUgYnVmZmVyIChpbiBieXRlcykuICovCisgICAgdWludDMyX3QgYnVmZmVyX3dyYXBfY291bnQ7IC8qKjwgTnVtYmVyIG9mIHRpbWVzIHRoZSBjYXB0dXJlIGJ1ZmZlciBoYXMgd3JhcHBlZC4gKi8KKyAgICB1aW50MzJfdCBldmVudHNfcmVjb3JkZWQ7ICAgLyoqPCBOdW1iZXIgb2YgZXZlbnRzIHJlY29yZGVkIGluIHRoZSBjYXB0dXJlIGJ1ZmZlci4gKi8KKyAgICB1aW50MzJfdCBldmVudHNfZHJvcHBlZDsgICAgLyoqPCBOdW1iZXIgb2YgZXZlbnRzIGRyb3BwZWQgZHVlIHRvIG92ZXJmbG93LiAqLworICAgIHVpbnQzMl90IHJlYWRhYmxlX2J5dGVzOyAgICAvKio8IE51bWJlciBvZiBieXRlcyBuZWVkZWQgdG8gcmV0cmlldmUgY2FwdHVyZSBidWZmZXIuICovCit9IGJjbW9sdF9hcGlfY2FwdHVyZV9zdGF0czsKKworLyoqIEJvdW5kcy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ib3VuZHMKK3sKKyAgICB1aW50MzJfdCBiZXN0X2Nhc2U7ICAgICAvKio8IEJlc3QgQ2FzZS4gKi8KKyAgICB1aW50MzJfdCB3b3JzdF9jYXNlOyAgICAvKio8IFdvcnN0IENhc2UuICovCit9IGJjbW9sdF9ib3VuZHM7CisKKy8qKiBGaXhlZC1MZW5ndGggbGlzdDogOHggYm91bmRzLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Fycl9ib3VuZHNfOAoreworICAgIGJjbW9sdF9ib3VuZHMgYXJyWzhdOyAgIC8qKjwgQXJyYXkuICovCit9IGJjbW9sdF9hcnJfYm91bmRzXzg7CisKKy8qKiBGaXhlZC1MZW5ndGggbGlzdDogOHggY2FsaWJyYXRpb25fcmVjb3JkLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Fycl9jYWxpYnJhdGlvbl9yZWNvcmRfOAoreworICAgIGJjbW9sdF9jYWxpYnJhdGlvbl9yZWNvcmQgYXJyWzhdOyAgIC8qKjwgQXJyYXkuICovCit9IGJjbW9sdF9hcnJfY2FsaWJyYXRpb25fcmVjb3JkXzg7CisKKy8qKiBEUyBmcmVxdWVuY3kgb2Zmc2V0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2RzX2ZyZXF1ZW5jeV9vZmZzZXQKK3sKKyAgICBiY21vbHRfc2lnbiBzaWduOyAgIC8qKjwgc2lnbi4gKi8KKyAgICB1aW50OF90IHZhbHVlOyAgICAgIC8qKjwgdmFsdWUuICovCit9IGJjbW9sdF9kc19mcmVxdWVuY3lfb2Zmc2V0OworCisvKiogQ2hhbm5lbCBQcm9maWxlIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfY2hhbm5lbF9wcm9maWxlCit7CisgICAgdWludDhfdCB2ZXJzaW9uOyAgICAgICAgLyoqPCBDaGFubmVsIHByb2ZpbGUgdmVyc2lvbiAqLworICAgIHVpbnQ4X3QgY2hhbm5lbF9pbmRleDsgIC8qKjwgQ2hhbm5lbCBwcm9maWxlIGluZGV4ICovCisgICAgYmNtb2x0X2RzX2ZyZXF1ZW5jeV9vZmZzZXQgZHNfZnJlcXVlbmN5X29mZnNldDsgLyoqPCBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBhY3R1YWwgT0xUIENUIFR4IGZyZXF1ZW5jeSBhbmQgdGhlIG5vbWluYWwgY2VudHJhbCBmcmVxdWVuY3kgZm9yIHRoZSBnaXZlbiBEV0xDSCBJRCwgZXhwcmVzc2VkIGluIHVuaXRzIG9mIDAuMUdIeiAqLworICAgIHVpbnQ4X3QgY2hhbm5lbF9wYXJ0aXRpb247ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQ2hhbm5lbCBwYXJ0aXRpb24gKi8KKyAgICB1aW50OF90IHV3bGNoX2lkOyAgICAgICAvKio8IFRoZSBhc3NpZ25lZCB1cHN0cmVhbSB3YXZlbGVuZ3RoIGNoYW5uZWwgSUQgKi8KKyAgICB1aW50MzJfdCB1c19mcmVxdWVuY3k7ICAvKio8IFRoZSBub21pbmFsIGNlbnRyYWwgZnJlcXVlbmN5IG9mIHRoZSB1cHN0cmVhbSB3YXZlbGVuZ3RoIGNoYW5uZWwgb3IgYSByb290IGZyZXF1ZW5jeSBvZiB0aGUgY3ljbGljIHNldCBvZiBjZW50cmFsIGZyZXF1ZW5jaWVzIGZvcm1pbmcgYW4gdXBzdHJlYW0gd2F2ZWxlbmd0aCBjaGFubmVsLCBpbmRpY2F0ZXMgdGhlIHZhbHVlIGluIHVuaXRzIG9mIDAuMSBHSHouICovCisgICAgYmNtb2x0X3Vwc3RyZWFtX2xpbmVfcmF0ZV9jYXBhYmlsaXRpZXMgdXNfcmF0ZTsgLyoqPCBVUyByYXRlLiAqLworICAgIHVpbnQ4X3QgZGVmYXVsdF9vbnVfYXR0ZW51YXRpb247ICAgICAgICAgICAgICAgIC8qKjwgVGhlIGRlZmF1bHQgT05VIGF0dGVudWF0aW9uIGxldmVsIGluIHN0ZXBzIG9mIDNkQiAqLworICAgIHVpbnQ4X3QgcmVzcG9uc2VfdGhyZXNob2xkOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVGhyZXNob2xkIHJlcHJlc2VudCB0aGUgbWF4aW11bSBudW1iZXIgb2YgUGxvYW1zIHRoZSBPTlUgY2FuIHRyYW5zbWl0IGF0IG5vbi16ZXJvIGF0dGVudWF0aW9uIGxldmVsIHdoaWxlIGF0dGVtcHRpbmcgdG8gZXN0YWJsaXNoIGNvbW11bmljYXRpb24gd2l0aCBPTFQgQ1QgKi8KKyAgICBiY21vbHRfbGlua190eXBlIHVzX2xpbmtfdHlwZTsgICAgICAgICAgICAgICAgICAvKio8IFVTIGxpbmsgdHlwZS4gKi8KKyAgICBiY21vc19ib29sIGlzX3ZhbGlkOyAgICAvKio8IGlzIHZhbGlkLiAqLworfSBiY21vbHRfY2hhbm5lbF9wcm9maWxlOworCisvKiogRml4ZWQtTGVuZ3RoIGxpc3Q6IDh4IGNoYW5uZWxfcHJvZmlsZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9hcnJfY2hhbm5lbF9wcm9maWxlXzgKK3sKKyAgICBiY21vbHRfY2hhbm5lbF9wcm9maWxlIGFycls4XTsgIC8qKjwgQXJyYXkuICovCit9IGJjbW9sdF9hcnJfY2hhbm5lbF9wcm9maWxlXzg7CisKKy8qKiBQb3dlciBjb25zdW1wdGlvbiByZXBvcnQgcGVyIGNoYW5uZWwgCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydAoreworICAgIHVpbnQ4X3QgZHNfd2F2ZWxlbmd0aF9jaGFubmVsX2lkOyAgIC8qKjwgRG93bnN0cmVhbSB3YXZlbGVuZ3RoIGNoYW5uZWwgSUQgKi8KKyAgICB1aW50OF90IHVzX3dhdmVsZW5ndGhfY2hhbm5lbF9pZDsgICAvKio8IFVwc3RyZWFtIHdhdmVsZW5ndGggY2hhbm5lbCBJRCAqLworICAgIHVpbnQxNl90IHBvd2VyX2NvbnN1bXB0aW9uOyAgICAgICAgIC8qKjwgUG93ZXIgY29uc3VtcHRpb24gKi8KK30gYmNtb2x0X3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0OworCisvKiogRml4ZWQtTGVuZ3RoIGxpc3Q6IDh4IHBvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Fycl9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF84Cit7CisgICAgYmNtb2x0X3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0IGFycls4XTsgLyoqPCBBcnJheS4gKi8KK30gYmNtb2x0X2Fycl9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF84OworCisvKiogRml4ZWQtTGVuZ3RoIGxpc3Q6IDJ4IFUxNi4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9hcnJfdTE2XzIKK3sKKyAgICB1aW50MTZfdCBhcnJbMl07ICAgIC8qKjwgQXJyYXkuICovCit9IGJjbW9sdF9hcnJfdTE2XzI7CisKKy8qKiBGaXhlZC1MZW5ndGggbGlzdDogMnggVTE2LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Fycl91MTZfMl9oZXgKK3sKKyAgICB1aW50MTZfdCBhcnJbMl07ICAgIC8qKjwgQXJyYXkuICovCit9IGJjbW9sdF9hcnJfdTE2XzJfaGV4OworCisvKiogRml4ZWQtTGVuZ3RoIGxpc3Q6IDV4IFUxNi4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9hcnJfdTE2XzVfaGV4Cit7CisgICAgdWludDE2X3QgYXJyWzVdOyAgICAvKio8IEFycmF5LiAqLworfSBiY21vbHRfYXJyX3UxNl81X2hleDsKKworLyoqIEZpeGVkLUxlbmd0aCBsaXN0OiA3eCBVMTYuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfYXJyX3UxNl83Cit7CisgICAgdWludDE2X3QgYXJyWzddOyAgICAvKio8IEFycmF5LiAqLworfSBiY21vbHRfYXJyX3UxNl83OworCisvKiogRml4ZWQtTGVuZ3RoIGxpc3Q6IDZ4IFUzMi4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9hcnJfdTMyXzYKK3sKKyAgICB1aW50MzJfdCBhcnJbNl07ICAgIC8qKjwgQXJyYXkuICovCit9IGJjbW9sdF9hcnJfdTMyXzY7CisKKy8qKiBGaXhlZC1MZW5ndGggbGlzdDogMTB4IFU4LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Fycl91OF8xMAoreworICAgIHVpbnQ4X3QgYXJyWzEwXTsgICAgLyoqPCBBcnJheS4gKi8KK30gYmNtb2x0X2Fycl91OF8xMDsKKworLyoqIEZpeGVkLUxlbmd0aCBsaXN0OiAxMnggVTguIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfYXJyX3U4XzEyCit7CisgICAgdWludDhfdCBhcnJbMTJdOyAgICAvKio8IEFycmF5LiAqLworfSBiY21vbHRfYXJyX3U4XzEyOworCisvKiogRml4ZWQtTGVuZ3RoIGxpc3Q6IDEzeCBVOC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9hcnJfdThfMTMKK3sKKyAgICB1aW50OF90IGFyclsxM107ICAgIC8qKjwgQXJyYXkuICovCit9IGJjbW9sdF9hcnJfdThfMTM7CisKKy8qKiBGaXhlZC1MZW5ndGggbGlzdDogMzZ4IFU4LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Fycl91OF8zNgoreworICAgIHVpbnQ4X3QgYXJyWzM2XTsgICAgLyoqPCBBcnJheS4gKi8KK30gYmNtb2x0X2Fycl91OF8zNjsKKworLyoqIEZpeGVkLUxlbmd0aCBsaXN0OiA0eCBVOC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9hcnJfdThfNAoreworICAgIHVpbnQ4X3QgYXJyWzRdOyAvKio8IEFycmF5LiAqLworfSBiY21vbHRfYXJyX3U4XzQ7CisKKy8qKiBGaXhlZC1MZW5ndGggbGlzdDogNDB4IFU4LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Fycl91OF80MAoreworICAgIHVpbnQ4X3QgYXJyWzQwXTsgICAgLyoqPCBBcnJheS4gKi8KK30gYmNtb2x0X2Fycl91OF80MDsKKworLyoqIFhHUE9OIGJ1cnN0IHByb2ZpbGUuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fYnVyc3RfcHJvZmlsZQoreworICAgIHVpbnQ4X3QgcHJvZmlsZV92ZXJzaW9uOyAgICAgICAgICAgIC8qKjwgcHJvZmlsZSB2ZXJzaW9uLiAqLworICAgIGJjbW9zX2Jvb2wgaXNfZmVjX29uOyAgICAgICAgICAgICAgIC8qKjwgaXMgZmVjIG9uLiAqLworICAgIHVpbnQ4X3QgZGVsaW1pdGVyX3NpemVfaW5fYnl0ZXM7ICAgIC8qKjwgZGVsaW1pdGVyIHNpemUgaW4gYnl0ZXMuICovCisgICAgdWludDMyX3QgZGVsaW1pdGVyX3BhdHRlcm5faGlnaDsgICAgLyoqPCBkZWxpbWl0ZXIgcGF0dGVybiBoaWdoLiAqLworICAgIHVpbnQzMl90IGRlbGltaXRlcl9wYXR0ZXJuX2xvdzsgICAgIC8qKjwgZGVsaW1pdGVyIHBhdHRlcm4gbG93LiAqLworICAgIHVpbnQ4X3QgcHJlYW1ibGVfbGVuZ3RoX2luX2J5dGVzOyAgIC8qKjwgcHJlYW1ibGUgbGVuZ3RoIGluIGJ5dGVzLiAqLworICAgIHVpbnQ4X3QgcHJlYW1ibGVfcmVwZWF0c19jb3VudDsgICAgIC8qKjwgcHJlYW1ibGUgcmVwZWF0cyBjb3VudC4gKi8KKyAgICB1aW50MzJfdCBwcmVhbWJsZV9wYXR0ZXJuX2hpZ2g7ICAgICAvKio8IHByZWFtYmxlIHBhdHRlcm4gaGlnaC4gKi8KKyAgICB1aW50MzJfdCBwcmVhbWJsZV9wYXR0ZXJuX2xvdzsgICAgICAvKio8IHByZWFtYmxlIHBhdHRlcm4gbG93LiAqLworICAgIHVpbnQ2NF90IHBvbl90YWc7ICAgICAgICAgICAgICAgICAgIC8qKjwgUE9OIHRhZy4gKi8KKyAgICB1aW50MzJfdCBudW1fb2ZfZ3VhcmRfYnl0ZXM7ICAgICAgICAvKio8IG51bWJlciBvZiBndWFyZCBieXRlcy4gKi8KKyAgICBiY21vc19ib29sIGlzX3Byb2ZpbGVfdmFsaWQ7ICAgICAgICAvKio8IGlzIHByb2ZpbGUgdmFsaWQuICovCisgICAgdWludDMyX3QgYnVyc3Rfb3ZlcmhlYWRfc2l6ZV9pbl93b3JkczsgIC8qKjwgQnVyc3Qgb3ZlcmhlYWQgc2l6ZSBpbiA0LWJ5dGUgd29yZHMgKHdvcmQgc2l6ZSBpcyA0IGJ5dGVzIHJlZ2FyZGxlc3Mgb2YgdXBzdHJlYW0gZGF0YSByYXRlKS4gKi8KK30gYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGU7CisKKy8qKiBGaXhlZC1MZW5ndGggbGlzdDogNHggeGdwb25fYnVyc3RfcHJvZmlsZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9hcnJfeGdwb25fYnVyc3RfcHJvZmlsZV80Cit7CisgICAgYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGUgYXJyWzRdOyAgLyoqPCBBcnJheS4gKi8KK30gYmNtb2x0X2Fycl94Z3Bvbl9idXJzdF9wcm9maWxlXzQ7CisKKy8qKiBYR1BPTiBUUlggY29uZmlndXJhdGlvbi4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl90cnhfY29uZmlndXJhdGlvbgoreworICAgIHVpbnQzMl90IHRyeF9yZXNldF9wYXR0ZXJuX2ZpcnN0OyAgICAgICAgICAgLyoqPCB0cnggcmVzZXQgcGF0dGVybiBmaXJzdC4gKi8KKyAgICB1aW50MzJfdCB0cnhfcmVzZXRfcGF0dGVybl9taWRkbGU7ICAgICAgICAgIC8qKjwgdHJ4IHJlc2V0IHBhdHRlcm4gbWlkZGxlLiAqLworICAgIHVpbnQzMl90IHRyeF9yZXNldF9wYXR0ZXJuX2xhc3Q7ICAgICAgICAgICAgLyoqPCB0cnggcmVzZXQgcGF0dGVybiBsYXN0LiAqLworICAgIHVpbnQ4X3QgdHJ4X3Jlc2V0X21pZGRsZV9yZXBlYXRzX2NvdW50OyAgICAgLyoqPCB0cnggcmVzZXQgbWlkZGxlIHJlcGVhdHMgY291bnQuICovCisgICAgdWludDE2X3QgdHJ4X3Jlc2V0X2xvY2F0aW9uOyAgICAgICAgICAgICAgICAvKio8IHRyeCByZXNldCBsb2NhdGlvbi4gKi8KKyAgICBiY21vc19ib29sIHRyeF9yZXNldF9wb2xhcml0eTsgICAgICAgICAgICAgIC8qKjwgdHJ4IHJlc2V0IHBvbGFyaXR5LiAqLworICAgIHVpbnQzMl90IGJjZHJfcmVzZXRfcGF0dGVybl9maXJzdDsgICAgICAgICAgLyoqPCBiY2RyIHJlc2V0IHBhdHRlcm4gZmlyc3QuICovCisgICAgdWludDMyX3QgYmNkcl9yZXNldF9wYXR0ZXJuX21pZGRsZTsgICAgICAgICAvKio8IGJjZHIgcmVzZXQgcGF0dGVybiBtaWRkbGUuICovCisgICAgdWludDMyX3QgYmNkcl9yZXNldF9wYXR0ZXJuX2xhc3Q7ICAgICAgICAgICAvKio8IGJjZHIgcmVzZXQgcGF0dGVybiBsYXN0LiAqLworICAgIHVpbnQ4X3QgYmNkcl9yZXNldF9taWRkbGVfcmVwZWF0c19jb3VudDsgICAgLyoqPCBiY2RyIHJlc2V0IG1pZGRsZSByZXBlYXRzIGNvdW50LiAqLworICAgIHVpbnQ4X3QgYmNkcl9yZXNldF9sb2NhdGlvbjsgICAgICAgICAgICAgICAgLyoqPCBiY2RyIHJlc2V0IGxvY2F0aW9uLiAqLworICAgIGJjbW9zX2Jvb2wgYmNkcl9yZXNldF9wb2xhcml0eTsgICAgICAgICAgICAgLyoqPCBiY2RyIHJlc2V0IHBvbGFyaXR5LiAqLworfSBiY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb247CisKKy8qKiBGaXhlZC1MZW5ndGggbGlzdDogNHggeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb24uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfYXJyX3hncG9uX3RyeF9jb25maWd1cmF0aW9uXzQKK3sKKyAgICBiY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb24gYXJyWzRdOyAgLyoqPCBBcnJheS4gKi8KK30gYmNtb2x0X2Fycl94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl80OworCisvKiogQXV0b21hdGljIE9OVSBkZWFjdGl2YXRpb24uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24KK3sKKyAgICBiY21vc19ib29sIGxvczsgICAgICAgICAvKio8IEF1dG8gZGVhY3RpdmF0ZSBPTlUgZHVlIHRvIExPUyAqLworICAgIGJjbW9zX2Jvb2wgb251X2FsYXJtczsgIC8qKjwgQXV0byBkZWFjdGl2YXRlIE9OVSBkdWUgdG8gT05VIGFsYXJtcyAqLworICAgIGJjbW9zX2Jvb2wgdGl3aTsgICAgICAgIC8qKjwgQXV0byBkZWFjdGl2YXRlIE9OVSBkdWUgdG8gVElXaSBhbGFybSAqLworICAgIGJjbW9zX2Jvb2wgYWNrX3RpbWVvdXQ7IC8qKjwgQXV0byBkZWFjdGl2YXRlIE9OVSBkdWUgdG8gQWNrIHRpbWVvdXQgKi8KKyAgICBiY21vc19ib29sIHNmaTsgICAgICAgICAvKio8IEF1dG8gZGVhY3RpdmF0ZSBPTlUgZHVlIHRvIFNGaSBhbGFybSAqLworICAgIGJjbW9zX2Jvb2wgbG9raTsgICAgICAgIC8qKjwgQXV0byBkZWFjdGl2YXRlIE9OVSBkdWUgdG8gTG9raSBhbGFybSAqLworfSBiY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb247CisKKy8qKiBUUlggUmVzeW5jIHBhdHRlcm4gY29udHJvbC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9yZXN5bmNfY29udHJvbAoreworICAgIHVpbnQ4X3Qgc3RhcnRfcGF0dGVybjsgICAgICAvKio8IHN0YXJ0IHBhdHRlcm4uICovCisgICAgdWludDhfdCBtaWRkbGVfcGF0dGVybjsgICAgIC8qKjwgbWlkZGxlIHBhdHRlcm4uICovCisgICAgdWludDhfdCBsYXN0X3BhdHRlcm47ICAgICAgIC8qKjwgbGFzdCBwYXR0ZXJuLiAqLworICAgIHVpbnQ4X3QgbWlkZGxlX3JlcGV0aXRpb247ICAvKio8IG1pZGRsZSByZXBldGl0aW9uLiAqLworICAgIHVpbnQ4X3QgbG9jYXRpb247ICAgICAgICAgICAvKio8IGxvY2F0aW9uLiAqLworfSBiY21vbHRfcmVzeW5jX2NvbnRyb2w7CisKKy8qKiBCQ0RSIHJlc3luYyBwYXR0ZXJuIGNvbmZpZ3VyYXRpb24uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfYmNkcl9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uCit7CisgICAgYmNtb2x0X3Jlc3luY19jb250cm9sIHJlc3luY19jb250cm9sOyAgICAgICAgICAgLyoqPCByZXN5bmMgY29udHJvbC4gKi8KKyAgICBiY21vbHRfcmVzeW5jX2NvbnRyb2wgcmFuZ2luZ19yZXN5bmNfY29udHJvbDsgICAvKio8IHJhbmdpbmcgcmVzeW5jIGNvbnRyb2wuICovCit9IGJjbW9sdF9iY2RyX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb247CisKKy8qKiBCRVIgbW9uaXRvcmluZyBwYXJhbWV0ZXJzLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Jlcl9tb25pdG9yX3BhcmFtcworeworICAgIHVpbnQzMl90IHVzX2Jlcl9pbnRlcnZhbDsgICAvKio8IEludGVydmFsIGluIG1pbGxpc2Vjb25kcyBmb3IgdXBzdHJlYW0gQkVSIG1vbml0b3JpbmcgKDAgPSBkaXNhYmxlZCkuICovCisgICAgdWludDhfdCBzZl90aHJlc2hvbGQ7ICAgICAgIC8qKjwgU2lnbmFsIGZhaWwgYWxhcm0gaXMgcmFpc2VkIHdoZW4gQkVSIHJhaXNlcyB0byAxMF4teCwgd2hlcmUgeCBpcyB0aGlzIG51bWJlci4gKi8KKyAgICB1aW50OF90IHNkX3RocmVzaG9sZDsgICAgICAgLyoqPCBTaWduYWwgZGVncmFkZSBhbGFybSBpcyByYWlzZWQgd2hlbiBCRVIgcmFpc2VzIHRvIDEwXi14LCB3aGVyZSB4IGlzIHRoaXMgbnVtYmVyLiAqLworfSBiY21vbHRfYmVyX21vbml0b3JfcGFyYW1zOworCisvKiogQ0JSIFJUIEFsbG9jYXRpb24gcHJvZmlsZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlCit7CisgICAgdWludDE2X3QgbWFfNzsgIC8qKjwgQ0JBIG1heGltdW0gYWxsb2NhdGlvbiBzaXplIGZvciBmcmFtZSBnYXAgNyAqLworICAgIHVpbnQxNl90IG1hXzM7ICAvKio8IENCQSBtYXhpbXVtIGFsbG9jYXRpb24gc2l6ZSBmb3IgZnJhbWUgZ2FwIDMgKi8KKyAgICB1aW50MTZfdCBtYV8xOyAgLyoqPCBDQkEgbWF4aW11bSBhbGxvY2F0aW9uIHNpemUgZm9yIGZyYW1lIGdhcCAxICovCit9IGJjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlOworCisvKiogUmVzdWx0cyBvZiB0aGUgRERSIHRlc3QgCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWQKK3sKKyAgICBiY21vbHRfZGRyX3Rlc3Rfc3RhdHVzIHN0YXR1czsgIC8qKjwgT3V0Y29tZSBvZiB0aGUgRERSIHRlc3QgKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9kZHJfdGVzdF9yZXN1bHQgY3B1X3Jlc3VsdDsgICAgICAgICAgLyoqPCBDUFUgUmVzdWx0LiAqLworICAgICAgICAgICAgYmNtb2x0X2Rkcl90ZXN0X3Jlc3VsdCByYXNfMF9yZXN1bHQ7ICAgICAgICAvKio8IFJBUyAwIFJlc3VsdC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9kZHJfdGVzdF9yZXN1bHQgcmFzXzFfcmVzdWx0OyAgICAgICAgLyoqPCBSQVMgMSBSZXN1bHQuICovCisgICAgICAgIH0gY29tcGxldGVkOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfaG9zdF9jb25uZWN0aW9uX2ZhaWxfcmVhc29uIHJlYXNvbjsgIC8qKjwgQ29ubmVjdGlvbiBmYWlsIHJlYXNvbi4gKi8KKyAgICAgICAgfSBjb25uZWN0aW9uX2ZhaWxlZDsKKyAgICB9IHU7Cit9IGJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWQ7CisKKy8qKiBEZWJ1ZyBwYXJhbWV0ZXJzIGZvciBkZXZpY2UgY29uZmlndXJhdGlvbiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2RlYnVnX2RldmljZV9jZmcKK3sKKyAgICB1aW50MTZfdCBob3N0X2RtYV9yeF9xdWV1ZV9zaXplOyAgICAgICAgICAgIC8qKjwgUlggUXVldWUgc2l6ZSBvZiB0aGUgaG9zdCBETUEgICAgICovCisgICAgdWludDE2X3QgaG9zdF9kbWFfdHhfcXVldWVfc2l6ZTsgICAgICAgICAgICAvKio8IFRYIFF1ZXVlIHNpemUgb2YgdGhlIGhvc3QgRE1BICAgICAqLworICAgIGJjbW9zX2Jvb2wgYXZzX2NvbnRyb2w7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBBVlMgY29udHJvbC4gKi8KKyAgICBiY21vc19ib29sIHVzZV9wcmV2X3Bvbl9zZXJkZXNfZmlybXdhcmU7ICAgIC8qKjwgVGhpcyBpcyBhIGZhbGxiYWNrIG9wdGlvbiBpZiB0aGVyZSBhcmUgaXNzdWVzIHdpdGggdGhlIG5ldyBmaXJtd2FyZSAqLworICAgIGJjbW9zX2Jvb2wgdXNlX3ByZXZfbm5pX3NlcmRlc19maXJtd2FyZTsgICAgLyoqPCBUaGlzIGlzIGEgZmFsbGJhY2sgb3B0aW9uIGlmIHRoZXJlIGFyZSBpc3N1ZXMgd2l0aCB0aGUgbmV3IGZpcm13YXJlICovCit9IGJjbW9sdF9kZWJ1Z19kZXZpY2VfY2ZnOworCisvKiogRGV2aWNlIE5OSSBTcGVlZC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9kZXZpY2Vfbm5pX3NwZWVkCit7CisgICAgYmNtb2x0X25uaV9zcGVlZCBmaXJzdF9oYWxmOyAgICAvKio8IEludGVyZmFjZSBzcGVlZCBmb3IgdGhlIGZpcnN0IGhhbGYgb2YgdGhlIE5OSSBwb3J0cyBvbiB0aGUgc3lzdGVtLiAqLworICAgIGJjbW9sdF9ubmlfc3BlZWQgc2Vjb25kX2hhbGY7ICAgLyoqPCBJbnRlcmZhY2Ugc3BlZWQgZm9yIHRoZSBzZWNvbmQgaGFsZiBvZiB0aGUgTk5JIHBvcnRzIG9uIHRoZSBzeXN0ZW0uICovCit9IGJjbW9sdF9kZXZpY2Vfbm5pX3NwZWVkOworCisvKiBcY29uZCBVTkRPQ1VNRU5URURfU1lNQk9MUyAqLworCisvKiogRHVtbXkgU3RydWN0IEZvciBFbWJlZGRlZCBUeXBlcy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9kdW1teV9zdHJ1Y3RfZm9yX2VtYmVkZGVkX3R5cGVzCit7CisgICAgYmNtb2x0X2FnZ3JlZ2F0aW9uX2RvbWFpbiBhZDsgICAgICAgICAgICAgICAvKio8IGFkLiAqLworICAgIGJjbW9sdF9lcG9uX3RvcCBldDsgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBldC4gKi8KKyAgICBiY21vbHRfZXBtX2xpbV9nbG9iYWwgZWxnOyAgICAgICAgICAgICAgICAgIC8qKjwgZWxnLiAqLworICAgIGJjbW9sdF9kYmFfcG9ydCBkYmFfcG9ydDsgICAgICAgICAgICAgICAgICAgLyoqPCBkYmEgcG9ydC4gKi8KKyAgICBiY21vbHRfZHJ2X3NnYl9pZCBzZ2I7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgc2diLiAqLworICAgIGJjbW9sdF9kcnZfaWNmX2lkIGljZjsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBpY2YuICovCisgICAgYmNtb2x0X3RmYl90cmFwX2JlaGF2aW9yIHRmYl90cmFwX2JlaGF2aW9yOyAvKio8IHRmYiB0cmFwIGJlaGF2aW9yLiAqLworICAgIGJjbW9sdF90ZmJfbW9kZSB0ZmJfbW9kZTsgICAgICAgICAgICAgICAgICAgLyoqPCB0ZmIgbW9kZS4gKi8KKyAgICBiY21vbHRfbGltX3NlY19tb2RlX3VwIGxpbV9zZWNfbW9kZV91cDsgICAgIC8qKjwgbGltIHNlYyBtb2RlIHVwLiAqLworICAgIGJjbW9sdF9saW1fc2VjX21vZGVfZG4gbGltX3NlY19tb2RlX2RuOyAgICAgLyoqPCBsaW0gc2VjIG1vZGUgZG4uICovCisgICAgYmNtb2x0X3hpbV9zZWNfbW9kZSB4aW1fc2VjX21vZGU7ICAgICAgICAgICAvKio8IHhpbSBzZWMgbW9kZS4gKi8KKyAgICBiY21vbHRfZGJhX3JhbSBkYmFfcmFtOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgZGJhIHJhbS4gKi8KKyAgICBiY21vbHRfaHNjX3JhbSBoc2NfcmFtOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgaHNjIHJhbS4gKi8KKyAgICBiY21vbHRfbGltX3JhbSBsaW1fcmFtOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgbGltIHJhbS4gKi8KKyAgICBiY21vbHRfbGt5X3JhbSBsa3lfcmFtOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgbGt5IHJhbS4gKi8KKyAgICBiY21vbHRfbWljX3JhbSBtaWNfcmFtOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgbWljIHJhbS4gKi8KKyAgICBiY21vbHRfeHBjc3JtX3JhbSB4cGNzX3JhbTsgICAgICAgICAgICAgICAgIC8qKjwgeHBjcyByYW0uICovCisgICAgYmNtb2x0X3hnMmdfaWQgeGcyZ19pZDsgICAgICAgICAgICAgICAgICAgICAvKio8IHhnMmcgaWQuICovCit9IGJjbW9sdF9kdW1teV9zdHJ1Y3RfZm9yX2VtYmVkZGVkX3R5cGVzOworCisvKiBcZW5kY29uZCAqLworCisvKiogRW1iZWRkZWQgaW1hZ2UgZW50cnkuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnkKK3sKKyAgICBiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgaW1hZ2VfdHlwZTsgICAgLyoqPCBUeXBlIG9mIHRoZSBlbWJlZGRlZCBmaWxlIGltYWdlLiAqLworICAgIHVpbnQzMl90IGltYWdlX3NpemU7ICAgICAgICAgICAgICAgICAgICAvKio8IFNpemUgb2YgdGhlIGVtYmVkZGVkIGZpbGUgaW1hZ2UuICBVbml0IGlzIGJ5dGVzLiAqLworICAgIHVpbnQzMl90IGNyYzMyOyAvKio8IENSQyAzMiBjaGVja3N1bSBvZiBlbnRpcmUgZmlsZSBpbWFnZSBkYXRhLiAqLworICAgIGJjbW9sdF9lbWJlZGRlZF9pbWFnZV90cmFuc2Zlcl9zdGF0dXMgc3RhdHVzOyAgIC8qKjwgSW1hZ2UgdHJhbnNmZXIgc3RhdHVzLiAqLworICAgIGNoYXIgaW1hZ2VfbmFtZVs2NF07ICAgIC8qKjwgTmFtZSBvZiB0aGUgZmlsZSBpbWFnZS4gIE51bGwtdGVybWluYXRlZCBzdHJpbmcuICBUaGlzIGlzIHJlcXVpcmVkIGZvciB0aGUgRFBvRSBPTlUgb25seS4gIERQb0UgcmVxdWlyZXMgdGhlIHdyaXRlIHJlcXVlc3QgT0FNIGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBmaWxlLiAqLworfSBiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnk7CisKKy8qKiBWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiBlbWJlZGRlZF9pbWFnZV9lbnRyeS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9saXN0X3U4Cit7CisgICAgdWludDhfdCBsZW47ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMaXN0IGxlbmd0aC4gKi8KKyAgICBiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnkgKnZhbDsgICAvKio8IExpc3QgY29udGVudHMuICovCit9IGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9saXN0X3U4OworCisvKiogRW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXIuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXIKK3sKKyAgICBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2Zvcm1hdCBmb3JtYXQ7ICAgLyoqPCBGb3JtYXQuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGtleVsxNl07ICAgIC8qKjwgS2V5LiAqLworICAgICAgICB9IGNmYjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBrZXlbMTZdOyAgICAvKio8IEtleS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3Qgc2NpWzhdOyAgICAgLyoqPCBTQ0kuICovCisgICAgICAgIH0gY3RyOworICAgIH0gdTsKK30gYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyOworCisvKiogRVBPTiBjbG9jayB0cmFuc3BvcnQgY29uZmlndXJhdGlvbiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X2NvbmZpZ3VyYXRpb24KK3sKKyAgICBiY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfbW9kZSBlcG9uX2Nsb2NrX3RyYW5zcG9ydF9tb2RlOyAvKio8IENsb2NrIFRyYW5zcG9ydCBtb2RlIG9uIHRoaXMgT0xUIFBPTiBQb3J0LiAqLworfSBiY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfY29uZmlndXJhdGlvbjsKKworLyoqIERhdGEgb2YgdW5rbm93biBsaW5rLCBpbmNsdWRpbmcgcmF0ZSBhbmQgYWxhcm0gc3RhdHVzIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfdW5rbm93bl9saW5rX3N0YXR1cworeworICAgIGJjbW9sdF9lcG9uX2xpbmtfcmF0ZSBsaW5rX3JhdGU7ICAgIC8qKjwgVGhlIHJhdGUgb2YgdGhlIHVua25vd24gbGluayAqLworICAgIGJjbW9sdF9zdGF0dXMgYWxhcm1fc3RhdHVzOyAgICAgICAgIC8qKjwgV2hldGhlciB0aGUgdW5rbm93biBsaW5rIGFsYXJtIGlzIHJhaXNlZCBvciBjbGVhcmVkLiAqLworfSBiY21vbHRfdW5rbm93bl9saW5rX3N0YXR1czsKKworLyoqIERhdGEgb2YgbGFzZXIgb24vb2ZmIHZpb2xhdGluZyBsaW5rLCBpbmNsdWRpbmcgYXR0ZW1wdGVkIGxhc2VyIG9uIHRpbWUsIAorICogYXR0ZW1wdGVkIGxhc2VyIG9mZiB0aW1lLCBhbmQgYWxhcm0gc3RhdHVzLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2xhc2VyX29uX29mZl9zdGF0dXMKK3sKKyAgICBiY21vbHRfdGltZV9xdWFudGEgbGFzZXJfb25fdGltZTsgICAvKio8IFRoZSBsYXNlciBvbiB0aW1lIG9mIHRoZSBPTlUgdGhhdCBpcyB2aW9sYXRpbmcuICovCisgICAgYmNtb2x0X3RpbWVfcXVhbnRhIGxhc2VyX29mZl90aW1lOyAgLyoqPCBUaGUgbGFzZXIgb2ZmIHRpbWUgb2YgdGhlIE9OVSB0aGF0IGlzIHZpb2xhdGluZy4gKi8KKyAgICBiY21vbHRfc3RhdHVzIGFsYXJtX3N0YXR1czsgICAgICAgICAvKio8IFdoZXRoZXIgdGhlIGxhc2VyIG9uL29mZiB2aW9sYXRpb24gYWxhcm0gaXMgcmFpc2VkIG9yIGNsZWFyZWQuICovCit9IGJjbW9sdF9sYXNlcl9vbl9vZmZfc3RhdHVzOworCisvKiogRGF0YSBvZiByYW5nZSB2aW9sYXRpbmcgbGluaywgaW5jbHVkaW5nIHRoZSByYW5nZSBpdCBhdHRlbXB0ZWQgdG8gdXNlLCBhbmQgCisgKiBhbGFybSBzdGF0dXMuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfcmFuZ2Vfc3RhdHVzCit7CisgICAgYmNtb2x0X3RpbWVfcXVhbnRhIHJhbmdlOyAgIC8qKjwgVGhlIHJhbmdlIHRoYXQgdGhlIHZpb2xhdGluZyBsaW5rIGF0dGVtcHRlZCB0byByZWdpc3RlciBhdC4gKi8KKyAgICBiY21vbHRfc3RhdHVzIGFsYXJtX3N0YXR1czsgLyoqPCBXaGV0aGVyIHRoZSByYW5nZSB2aW9sYXRpb24gYWxhcm0gaXMgcmFpc2VkIG9yIGNsZWFyZWQuICovCit9IGJjbW9sdF9yYW5nZV9zdGF0dXM7CisKKy8qKiBEZXRhaWxzIG9mIFN1c3BlY3RlZCBSb2d1ZSBPTlUgcHJvdmlkZWQgaW4gRGVuaWVkIExpbmsgQWxhcm0gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9yb2d1ZV9zdGF0dXMKK3sKKyAgICBiY21vbHRfZXBvbl9sbGlkIGRlbmllZF9sbGlkOyAgICAgICAvKio8IExMSUQuICovCisgICAgYmNtb2x0X3RpbWVfcXVhbnRhIGRlbmllZF9yYW5nZTsgICAgLyoqPCBPTlUgUmFuZ2UuICovCisgICAgYmNtb2x0X3N0YXR1cyBhbGFybV9zdGF0dXM7ICAgICAgICAgLyoqPCBBbGFybSBTdGF0ZS4gKi8KK30gYmNtb2x0X3JvZ3VlX3N0YXR1czsKKworLyoqIFRoZSBzdGF0ZSBvZiBhbGwgYWxhcm1zIG9uIGFuIEVQT04gRGVuaWVkIExpbmsuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hbGFybV9zdGF0ZQoreworICAgIGJjbW9sdF91bmtub3duX2xpbmtfc3RhdHVzIHVua25vd25fbGlua192aW9sYXRpb247ICAvKio8IFVua25vd24gTGluayBWaW9sYXRpb24uICovCisgICAgYmNtb2x0X3N0YXR1cyBvdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbjsgICAgICAgICAgIC8qKjwgT3ZlcmhlYWQgUHJvZmlsZSBWaW9sYXRpb24uICovCisgICAgYmNtb2x0X3N0YXR1cyBtYXhfbGlua192aW9sYXRpb247ICAgICAgICAgICAgICAgICAgIC8qKjwgTWF4IExpbmsgVmlvbGF0aW9uLiAqLworICAgIGJjbW9sdF9zdGF0dXMgbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbjsgICAgICAgICAgICAvKio8IExMSUQgUG9vbCBFbXB0eSBWaW9sYXRpb24uICovCisgICAgYmNtb2x0X2xhc2VyX29uX29mZl9zdGF0dXMgbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbjsgIC8qKjwgTGFzZXIgT24vT2ZmIFZpb2xhdGlvbi4gKi8KKyAgICBiY21vbHRfc3RhdHVzIHN5c3RlbV9yZXNvdXJjZV92aW9sYXRpb247ICAgICAgICAgICAgLyoqPCBTeXN0ZW0gUmVzb3VyY2UgVmlvbGF0aW9uLiAqLworICAgIGJjbW9sdF9yYW5nZV9zdGF0dXMgcmFuZ2VfdmlvbGF0aW9uOyAgICAgICAgICAgICAgICAvKio8IFJhbmdlIFZpb2xhdGlvbi4gKi8KKyAgICBiY21vbHRfc3RhdHVzIHRkbV9jaGFubmVsc19leGhhdXN0ZWQ7ICAgICAgICAgICAgICAgLyoqPCBURE0gQ2hhbm5lbHMgRXhoYXVzdGVkLiAqLworICAgIGJjbW9sdF9yb2d1ZV9zdGF0dXMgcm9ndWVfdmlvbGF0aW9uOyAgICAgICAgICAgICAgICAvKio8IFJvZ3VlIE9OVSBWaW9sYXRpb24uICovCisgICAgYmNtb2x0X3N0YXR1cyB1cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uOyAgICAgICAgIC8qKjwgVXBzdHJlYW0gQmFuZHdpZHRoIFZpb2xhdGlvbi4gKi8KK30gYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYWxhcm1fc3RhdGU7CisKKy8qKiBLZXlzIGFuZCBtb2RlIGZvciBlbmNyeXB0aW5nIHRoZSBFUE9OIGxvZ2ljYWwgbGluay4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fY29uZmlnCit7CisgICAgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9tb2RlIGRvd25zdHJlYW1fbW9kZTsgICAgLyoqPCBEb3duc3RyZWFtIE1vZGUuICovCisgICAgYmNtb2x0X2Vwb25fa2V5X2Nob2ljZSBkb3duc3RyZWFtX2tleV9jaG9pY2U7ICAgLyoqPCBEb3duc3RyZWFtIEtleSBDaG9pY2UuICovCisgICAgYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyIGRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbjsgIC8qKjwgRG93bnN0cmVhbSBFbmNyeXB0aW9uIEluZm9ybWF0aW9uLiAqLworICAgIGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fbW9kZSB1cHN0cmVhbV9tb2RlOyAgLyoqPCBVcHN0cmVhbSBNb2RlLiAqLworICAgIGJjbW9sdF9lcG9uX2tleV9jaG9pY2UgdXBzdHJlYW1fa2V5X2Nob2ljZTsgLyoqPCBVcHN0cmVhbSBLZXkgQ2hvaWNlLiAqLworICAgIGJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lciB1cHN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uOyAgICAvKio8IFVwc3RyZWFtIEVuY3J5cHRpb24gSW5mb3JtYXRpb24uICovCit9IGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fY29uZmlnOworCisvKiogS2V5IGV4Y2hhbmdlIGNvbmZpZ3VyYXRpb24gdGhhdCBhcHBsaWVzIHRvIHRoZSBFUE9OIGxpbmsuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9rZXlfZXhjaGFuZ2VfY29uZmlnCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3R5cGUgb2FtX3R5cGU7ICAgICAgICAgICAgICAvKio8IFRoZSB0eXBlIG9mIE9BTSB0aGF0IGlzIHNlbnQgdG8gc3RhcnQgdGhlIGtleSBleGNoYW5nZS4gKi8KKyAgICB1aW50MTZfdCBwZXJpb2Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgS2V5IGV4Y2hhbmdlIHBlcmlvZCBpbiBzZWNvbmRzLiAgMCBtZWFucyBkaXNhYmxlIGVuY3J5cHRpb24uICovCisgICAgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9kaXJlY3Rpb24gZGlyZWN0aW9uOyAvKio8IEVuY3J5cHRpb24gZGlyZWN0aW9uOiBEb3duc3RyZWFtIG9ubHkgb3IgQmktZGlyZWN0aW9uYWwuICovCit9IGJjbW9sdF9lcG9uX2tleV9leGNoYW5nZV9jb25maWc7CisKKy8qKiBFUE9OIGxhc2VyIG92ZXJoZWFkIHBhcmFtZXRlcnMuIChMYXNlciBPbiBhbmQgTGFzZXIgT2ZmIHRpbWVzKSAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVycworeworICAgIGJjbW9sdF90aW1lX3F1YW50YSBsYXNlcl9vbl90aW1lOyAgIC8qKjwgTnVtYmVyIG9mIHRpbWUgcXVhbnRhIHRvIGFsbG93IGZvciBPTlVzJyBsYXNlci1vbiB0cmFuc2l0aW9uLiAqLworICAgIGJjbW9sdF90aW1lX3F1YW50YSBsYXNlcl9vZmZfdGltZTsgIC8qKjwgTnVtYmVyIG9mIHRpbWUgcXVhbnRhIHRvIGFsbG93IGZvciBPTlVzJyBsYXNlci1vZmYgdHJhbnNpdGlvbi4gKi8KK30gYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVyczsKKworLyoqIFRoZSBzdGF0ZSBvZiBhbGwgYWxhcm1zIG9uIGFuIEVQT04gTGluay4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfYWxhcm1fc3RhdGUKK3sKKyAgICBiY21vbHRfc3RhdHVzIGtleV9leGNoYW5nZV9mYWlsdXJlOyAgICAgICAgIC8qKjwgS2V5IEV4Y2hhbmdlIEZhaWx1cmUuICovCisgICAgYmNtb2x0X3N0YXR1cyBpbnZhbGlkX21wY3BfcmVwb3J0X3JlY2VpdmVkOyAvKio8IEludmFsaWQgTVBDUCBSZXBvcnQgUmVjZWl2ZWQuICovCisgICAgYmNtb2x0X3N0YXR1cyBtcGNwX3JlcG9ydF90aW1lb3V0OyAgICAgICAgICAvKio8IE1QQ1AgUmVwb3J0IFRpbWVvdXQuICovCisgICAgYmNtb2x0X3N0YXR1cyBvYW1fa2VlcGFsaXZlX3RpbWVvdXQ7ICAgICAgICAvKio8IE9BTSBLZWVwYWxpdmUgVGltZW91dC4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19hbGFybV9zdGF0ZTsKKworLyoqIERvd25zdHJlYW0gYW5kIHVwc3RyZWFtIEZFQyBlbmFibGUgc3RhdGUgZm9yIGFuIEVQT04gbGluay4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfZmVjX2VuCit7CisgICAgYmNtb2x0X2Vwb25fbGlua19mZWNfc3RhdGUgdXBzdHJlYW07ICAgIC8qKjwgRkVDIGVuYWJsZSBzdGF0ZSBmb3IgdXBzdHJlYW0gcGF0aC4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2ZlY19zdGF0ZSBkb3duc3RyZWFtOyAgLyoqPCBGRUMgZW5hYmxlIHN0YXRlIGZvciBkb3duc3RyZWFtIHBhdGguICovCit9IGJjbW9sdF9lcG9uX2xpbmtfZmVjX2VuOworCisvKiogRVBPTiBsb2dpY2FsIGxpbmsuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9saW5rX2luZm8KK3sKKyAgICBiY21vbHRfZXBvbl9saW5rX3N0YXR1cyBsaW5rX3N0YXR1czsgICAgICAgICAgICAvKio8IExpbmsgc3RhdHVzIGZsYWdzLiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfcmF0ZSByYXRlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVGhlIHJhdGUgYXQgd2hpY2ggdGhlIGxpbmsgb3BlcmF0ZXMuICovCisgICAgYmNtb2x0X2Vwb25fbGxpZCBsbGlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgTExJRCBvZiB0aGUgbGluay4gKi8KKyAgICBiY21vbHRfbXBjcF9kaXNjb3ZlcnlfaW5mbyBtcGNwX2Rpc2NvdmVyeV9pbmZvOyAvKio8IEZsYWdzIGZyb20gTVBDUCBkaXNjb3ZlcnkuICovCisgICAgYmNtb2x0X3RpbWVfcXVhbnRhIG9udV9sYXNlcl9vbl90aW1lX3RxOyAgICAgICAgLyoqPCBMYXNlciBvbiB0aW1lIHJlcG9ydGVkIGJ5IE9OVS4gIFRoaXMgaXMgc2V0IHRvIDAgZm9yIDFHLzFHIGxpbmtzIGFzIDFHIE1QQ1AgZG9lcyBub3QgaW5jbHVkZSB0aGlzIGZpZWxkLiAqLworICAgIGJjbW9sdF90aW1lX3F1YW50YSBvbnVfbGFzZXJfb2ZmX3RpbWVfdHE7ICAgICAgIC8qKjwgTGFzZXIgb2ZmIHRpbWUgcmVwb3J0ZWQgYnkgT05VLiAqLworICAgIHVpbnQ4X3QgcGVuZGluZ19ncmFudHM7ICAgICAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBwZW5kaW5nIGdyYW50cy4gKi8KKyAgICBiY21vbHRfdGltZV9xdWFudGEgcmFuZ2VfdmFsdWVfdHE7ICAvKio8IFRoZSBsaW5rJ3MgcmFuZ2UgdmFsdWUgaW4gVFEuICovCisgICAgYmNtb2x0X2Vwb25fdHVubmVsX2lkIHR1bm5lbF9pZDsgICAgLyoqPCBUaGUgdHVubmVsIElEIHRvIHVzZSB3aGVuIHNlbmRpbmcgdHJhZmZpYyB0byB0aGUgbGluay4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19pbmZvOworCisvKiogR2F0ZSBwYXJhbWV0ZXJzLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dhdGVfcGFyYW1ldGVycworeworICAgIGJjbW9sdF9tcGNwX3JlZ2lzdHJhdGlvbl9nYXRlX2ZsYWdzIGZsYWdzOyAgLyoqPCBGbGFncyB0byBzZXQgZm9yIHRoaXMgZ2F0ZS4gKi8KKyAgICB1aW50MzJfdCBkZWxheV9iZWZvcmVfbXM7ICAgICAgICAgICAgICAgICAgIC8qKjwgRGVsYXkgYmVmb3JlIHNlbmRpbmcgdGhpcyBnYXRlIGluIG1pbGxpc2Vjb25kcy4gKi8KKyAgICBiY21vbHRfdGltZV9xdWFudGEgZ2F0ZV9zaXplX3RxOyAgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGlzIGdhdGUgaW4gdGltZSBxdWFudGEuICovCit9IGJjbW9sdF9nYXRlX3BhcmFtZXRlcnM7CisKKy8qKiBWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiBnYXRlX3BhcmFtZXRlcnMuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX2xpc3RfdTMyCit7CisgICAgdWludDMyX3QgbGVuOyAgICAgICAgICAgICAgICAgICAvKio8IExpc3QgbGVuZ3RoLiAqLworICAgIGJjbW9sdF9nYXRlX3BhcmFtZXRlcnMgKnZhbDsgICAgLyoqPCBMaXN0IGNvbnRlbnRzLiAqLworfSBiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX2xpc3RfdTMyOworCisvKiogU3BlY2lmaWNhdGlvbiBvZiB0aGUgRVBPTiBnYXRlIG1vZGUgYW5kIGFzc29jaWF0ZWQgcGFyYW1ldGVycy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX3JlZ2lzdHJhdGlvbl9nYXRlX21vZGUKK3sKKyAgICBiY21vbHRfbXBjcF9nYXRlX21vZGUgcmVnaXN0cmF0aW9uX2dhdGVfbW9kZTsgICAvKio8IE1QQ1AgcmVnaXN0cmF0aW9uIGdhdGUgbW9kZS4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IHJlZ19hY2tfdGltZW91dF9tczsgICAgICAgICAgICAvKio8IEFtb3VudCBvZiB0aW1lIHRvIHdhaXQgZm9yIGEgbGluayB0byByZXNwb25kIHdpdGggYSByZWdpc3RlciBhY2sgYWZ0ZXIgYSByZWdpc3RlciBpcyBzZW50LiAqLworICAgICAgICB9IHRla25vdnVzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX2xpc3RfdTMyIGdhdGVzOyAgLyoqPCBHYXRlcyB0byBzZW5kIGZvciBSRUcgQUNLLiAqLworICAgICAgICB9IGN1c3RvbTsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX3JlZ2lzdHJhdGlvbl9nYXRlX21vZGU7CisKKy8qKiBDb25maWd1cmF0aW9uIHJlbGF0ZWQgdG8gRVBPTiBsb2dpY2FsIGxpbmsgcmVnaXN0cmF0aW9uIGFuZCByZXBvcnRpbmcuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucworeworICAgIGJjbW9sdF9lcG9uX3JlZ2lzdHJhdGlvbl9nYXRlX21vZGUgcmVnaXN0cmF0aW9uX2dhdGVfbW9kZTsgIC8qKjwgRVBPTiByZWdpc3RyYXRpb24gZ2F0ZSBtb2RlLiAqLworICAgIGJjbW9sdF9lcG9uX2RiYV9yZXBvcnRpbmdfbW9kZSByZXBvcnRpbmdfbW9kZTsgICAgICAgICAgICAgIC8qKjwgQ29udHJvbCBmb3IgaG93IHRoZSBEQkEgaGFuZGxlcyByZWNlaXZlZCBNUENQIHJlcG9ydCBmcmFtZXMuICovCisgICAgdWludDE2X3QgbWF4X2xpbmtzOyAvKio8IE1heGltdW0gbnVtYmVyIG9mIGxpbmtzIHRvIHJlZ2lzdGVyIG9uIHRoZSBFUE9OIE5JLiAgQSB2YWx1ZSBvZiB6ZXJvIGluZGljYXRlcyBubyBmaXhlZCBsaW1pdC4gVGhpcyBpcyBhbiBhZ2dyZWdhdGUgbGltaXQgb24gdGhlIG51bWJlciBvZiBub24tc3lzdGVtIGxpbmtzIG9uIGEgUE9OLiBUaGlzIGxpbWl0IGFwcGxpZXMgdG8gYm90aCByZWdpc3RlcmVkIGFuZCBub24tcmVnaXN0ZXJlZCBsaW5rcy4gVGhpcyB2YWx1ZSBjYW5ub3QgYmUgcmVkdWNlZCBiZWxvdyB0aGUgY291bnQgb2YgbGlua3MgY3VycmVudGx5IGFsbG9jYXRlZCwgbm9yIGlzIGl0IHZhbGlkIHRvIGluY3JlYXNlIGl0IGFib3ZlIHRoZSBzdW0gb2YgdGhlIHBlciBSUCBtYWNfbGlua3MgbGltaXRzLiAqLworfSBiY21vbHRfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9uczsKKworLyoqIFRoZSBsaXN0IG9mIGFsYXJtcyBkZWZpbmVkIGZvciBhbiBFUE9OIE5JIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9uaV9hbGFybV9zdGF0ZQoreworICAgIGJjbW9sdF9zdGF0dXMgbm9fcmVwb3J0czsgICAvKio8IE5vIFJlcG9ydHMuICovCit9IGJjbW9sdF9lcG9uX25pX2FsYXJtX3N0YXRlOworCisvKiogRW5jcnlwdGlvbiBjb25maWd1cmF0aW9uIHRoYXQgYXBwbGllcyB0byB0aGUgRVBPTiBOSSBhcyBhIHdob2xlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbmlfZW5jcnlwdGlvbl9jZmcKK3sKKyAgICBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX21vZGUgZG93bnN0cmVhbV9lbmNyeXB0aW9uX21vZGU7IC8qKjwgRG93bnN0cmVhbSBlbmNyeXB0aW9uIG1vZGUuICovCisgICAgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9tb2RlIHVwc3RyZWFtX2VuY3J5cHRpb25fbW9kZTsgICAvKio8IFVwc3RyZWFtIGVuY3J5cHRpb24gbW9kZS4gKi8KK30gYmNtb2x0X2Vwb25fbmlfZW5jcnlwdGlvbl9jZmc7CisKKy8qKiBFUE9OIE9OVSBVcGdyYWRlIFBhcmFtZXRlcnMuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXMKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZXh0ZW5zaW9uX3R5cGUgb2FtX2V4dGVuc2lvbl90eXBlOyAgLyoqPCBPQU0gRXh0ZW5zaW9uIFR5cGUuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCByZXNwb25zZV90aW1lb3V0X21zOyAgICAgICAgICAgICAgIC8qKjwgVGhlIGxlbmd0aCBvZiB0aW1lIHRoYXQgdGhlIE9MVCB3aWxsIHdhaXQgZm9yIHRoZSBPTlUgdG8gcmVzcG9uZC4gKi8KKyAgICAgICAgfSBicm9hZGNvbTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgcmVzcG9uc2VfdGltZW91dF9tczsgICAgICAgICAgICAgICAvKio8IFRoZSBsZW5ndGggb2YgdGltZSB0aGF0IHRoZSBPTFQgd2lsbCB3YWl0IGZvciB0aGUgT05VIHRvIHJlc3BvbmQuICovCisgICAgICAgIH0gY3RjOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCByZXNwb25zZV90aW1lb3V0X21zOyAgICAgICAgICAgICAgIC8qKjwgVGhlIGxlbmd0aCBvZiB0aW1lIHRoYXQgdGhlIE9MVCB3aWxsIHdhaXQgZm9yIHRoZSBPTlUgdG8gcmVzcG9uZC4gKi8KKyAgICAgICAgfSBkYXNhbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgcmVzcG9uc2VfdGltZW91dF9tczsgICAgICAgICAgICAgICAvKio8IFRoZSBsZW5ndGggb2YgdGltZSB0aGF0IHRoZSBPTFQgd2lsbCB3YWl0IGZvciB0aGUgT05VIHRvIHJlc3BvbmQuICovCisgICAgICAgIH0ga3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHJlc3BvbnNlX3RpbWVvdXRfbXM7ICAgICAgICAgICAgICAgLyoqPCBUaGUgbGVuZ3RoIG9mIHRpbWUgdGhhdCB0aGUgT0xUIHdpbGwgd2FpdCBmb3IgdGhlIE9OVSB0byByZXNwb25kLiAqLworICAgICAgICAgICAgdWludDE2X3QgYmxvY2tfc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBieXRlIHBlciBkYXRhIGJsb2NrLiAqLworICAgICAgICAgICAgdWludDMyX3QgZmluYWxfYWNrX3Jlc3BvbnNlX3RpbWVvdXQ7ICAgICAgICAvKio8IFRpbWVvdXQgZm9yIHRoZSBmaW5hbCBBQ0sgcmVzcG9uc2UuICBUaGUgRFBvRSBzdGFuZGFyZCAxLjAgc3BlY2lmaWVzIHRoaXMgc2hvdWxkIGJlIGF0IGxlYXN0IDE1IHNlY29uZHMuICBVbml0IGlzIHNlY29uZHMuICovCisgICAgICAgIH0gZHBvZTsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtczsKKworLyoqIEVQT04gT05VIFVwZ3JhZGUgU3RhdHVzLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzCit7CisgICAgYmNtb3NfbWFjX2FkZHJlc3Mgb251X2lkOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBPTlUgSUQuICovCisgICAgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcmV0dXJuX2NvZGUgZXJyb3JfY29kZTsgLyoqPCBVcGdyYWRlIHN0YXR1cy4gKi8KKyAgICBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9vbnVfcmVzcG9uc2VfY29kZSBvbnVfcmV0dXJuX2NvZGU7ICAvKio8IFJlc3BvbnNlIGNvZGUgZnJvbSB0aGUgT05VLiAqLworfSBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXM7CisKKy8qKiBWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiBlcG9uX29udV91cGdyYWRlX3N0YXR1cy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMgoreworICAgIHVpbnQzMl90IGxlbjsgICAvKio8IExpc3QgbGVuZ3RoLiAqLworICAgIGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1cyAqdmFsOyAgICAvKio8IExpc3QgY29udGVudHMuICovCit9IGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMjsKKworLyoqIEVQT04gcHJvdGVjdGlvbiBzd2l0Y2hpbmcgY29uZmlndXJhdGlvbiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY29uZmlndXJhdGlvbgoreworICAgIGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGUgcHJvdGVjdGlvbl90eXBlOyAgLyoqPCBQcm90ZWN0aW9uIHNjaGVtZS4gKi8KKyAgICBiY21vbHRfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGV0ZWN0aW9uX29wdGlvbnMgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb3B0aW9uczsgLyoqPCBQcm90ZWN0aW9uIHN3aXRjaGluZyBvcHRpb25zLiAqLworICAgIGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3JlcmFuZ2luZ19vcHRpb25zIHJlcmFuZ2Vfb3B0aW9uczsgICAgICAgICAvKio8IFJlLXJhbmdpbmcgYWxnb3JpdGhtIHNlbGVjdGlvbiAqLworICAgIHVpbnQ4X3QgcmVyYW5nZV9hdHRlbXB0czsgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgdGltZXMgdG8gcmUgcmFuZ2UgZHVyaW5nIGEgc3dpdGNoICovCisgICAgdWludDE2X3QgcmVyYW5nZV9pbnRlcnZhbDsgICAgICAgICAgICAgICAgICAvKio8IEludGVydmFsIGJldHdlZW4gcmUtcmFuZ2UgYXR0ZW1wdHMuICovCisgICAgdWludDE2X3Qgc3luY19nYXRlX2R1cmF0aW9uOyAgICAgICAgICAgICAgICAvKio8IER1cmF0aW9uIG9mIHN5bmMgZ2F0ZS4gKi8KKyAgICBiY21vbHRfZ3Bpb19waW4gZ3Bpb19pbnB1dDsgICAgICAgICAgICAgICAgIC8qKjwgQ29uZmlndXJlcyBzdGF0ZSBvbiBQT04gKHdvcmtpbmcvc3RhbmRieSkgKi8KKyAgICBiY21vbHRfZ3Bpb19wb2xhcml0eSBncGlvX2lucHV0X3BvbGFyaXR5OyAgIC8qKjwgR1BJTyBJbnB1dCBQb2xhcml0eS4gKi8KKyAgICBiY21vbHRfZ3Bpb19waW4gZ3Bpb19vdXRwdXQ7ICAgICAgICAgICAgICAgIC8qKjwgSW5kaWNhdGVzIHN0YXRlIG9uIFBPTiAod29ya2luZy9zdGFuZGJ5KSAqLworICAgIGJjbW9sdF9ncGlvX3BvbGFyaXR5IGdwaW9fb3V0cHV0X3BvbGFyaXR5OyAgLyoqPCBHUElPIE91dHB1dCBQb2xhcml0eS4gKi8KK30gYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY29uZmlndXJhdGlvbjsKKworLyoqIFZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIFU4LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3U4X2xpc3RfdTE2Cit7CisgICAgdWludDE2X3QgbGVuOyAgIC8qKjwgTGlzdCBsZW5ndGguICovCisgICAgdWludDhfdCAqdmFsOyAgIC8qKjwgTGlzdCBjb250ZW50cy4gKi8KK30gYmNtb2x0X3U4X2xpc3RfdTE2OworCisvKiogQSB0ZW1wbGF0ZSBmb3IgYW4gRXRoZXJuZXQgZnJhbWUgb2Ygc29tZSBmaXhlZCBsZW5ndGgsIGFjY29tcGFuaWVkIGJ5IGEgbWFzayAKKyAqIHZlY3RvciBvZiBlcXVhbCBzaXplLiAgV2hlbiB1c2VkIGluIHRoZSBjb250ZXh0IG9mIGZyYW1lIHRyYW5zbWlzc2lvbiwgdGhlIAorICogbWFzayB2ZWN0b3IgZGlzdGluZ3Vpc2hlcyBiaXQgcmVnaW9ucyBvZiB0aGUgdGVtcGxhdGUgdGhhdCBzaG91bGQgYmUgCisgKiB0cmFuc21pdHRlZCB2ZXJiYXRpbSAoZS5nLiB0aGUgY29udGVudCBvZiBhbiBPQU0gbWVzc2FnZSkgZnJvbSBiaXQgcmVnaW9ucyAKKyAqIHRoYXQgc2hvdWxkIGJlIGZpbGxlZCBpbiBmYXJ0aGVyIGFsb25nIHRoZSBkYXRhIHBhdGggKGUuZy4gRXRoZXJuZXQgc291cmNlIAorICogb3IgZGVzdGluYXRpb24gYWRkcmVzc2VzKS4gIFdoZW4gdXNlZCBpbiB0aGUgY29udGV4dCBvZiBmcmFtZSByZWNlcHRpb24sIHRoZSAKKyAqIG1hc2sgdmVjdG9yIGRpc3Rpbmd1aXNoZXMgYml0IHJlZ2lvbnMgb2YgdGhlIHRlbXBsYXRlIHRoYXQgYXJlIHRvIGJlIAorICogY29tcGFyZWQgd2l0aCByZWNlaXZlZCBmcmFtZXMgKGUuZy4gZmxhZ3Mgd2l0aGluIE9BTSBoZWFydGJlYXQgbWVzc2FnZXMgCisgKiByZWNlaXZlZCBmcm9tIE9OVXMpIGZyb20gImRvbid0IGNhcmUiIGJpdCByZWdpb25zIChlLmcuIEV0aGVybmV0IHNvdXJjZSAKKyAqIGFkZHJlc3NlcyBmcm9tIHRob3NlIHNhbWUgbWVzc2FnZXMpLiAgCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ldGhlcm5ldF9mcmFtZV9tYXNrZWQKK3sKKyAgICBiY21vbHRfdThfbGlzdF91MTYgZnJhbWVfb2N0ZXRzOyAgICAvKio8IEEgY29tcGxldGUgRXRoZXJuZXQgZnJhbWUuICBGb3IgZXZlcnkgemVybyBiaXQgaW4gdGhlIG1hc2tfb2N0ZXRzICovCisgICAgYmNtb2x0X3U4X2xpc3RfdTE2IG1hc2tfb2N0ZXRzOyAgICAgLyoqPCBBIGJpdCB2ZWN0b3Igb2YgdGhlIHNhbWUgbGVuZ3RoIGFzIGZyYW1lX29jdGV0cy4gKi8KK30gYmNtb2x0X2V0aGVybmV0X2ZyYW1lX21hc2tlZDsKKworLyoqIEEgY29tcGxldGUgRXRoZXJuZXQgZnJhbWUsIGJlZ2lubmluZyB3aXRoIHRoZSBEQSAobGF5ZXIgMiBkZXN0aW5hdGlvbiAKKyAqIGFkZHJlc3MpIGFuZCBlbmRpbmcganVzdCBiZWZvcmUgdGhlIEZDUyAoZnJhbWUgY2hlY2sgc2VxdWVuY2UpLiAgSW4gY29udHJhc3QgCisgKiB0byBgbWFza2VkIEV0aGVybmV0IGZyYW1lcywnIHdoaWNoIHNlZSwgdW5tYXNrZWQgRXRoZXJuZXQgZnJhbWVzIGFyZSAKKyAqIHRyYW5zbWl0dGVkIG9yIGludGVycHJldGVkL3JlbGF5ZWQgdmVyYmF0aW0uICAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2V0aGVybmV0X2ZyYW1lX3VubWFza2VkCit7CisgICAgYmNtb2x0X3U4X2xpc3RfdTE2IGZyYW1lX29jdGV0czsgICAgLyoqPCBDb21wbGV0ZSBjb250ZW50IG9mIHRoZSBFdGhlcm5ldCBmcmFtZSwgYmVnaW5uaW5nIHdpdGggdGhlIERBIChsYXllciAyIGRlc3RpbmF0aW9uICovCit9IGJjbW9sdF9ldGhlcm5ldF9mcmFtZV91bm1hc2tlZDsKKworLyoqIEV4dGVuZGVkIEd1YXJkIFRpbWUuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZQoreworICAgIHVpbnQzMl90IGFkZGl0aW9uYWxfcHJlYnVyc3RfZ3VhcmRfdGltZTsgICAgLyoqPCBBZGRpdGlvbmFsIGd1YXJkIHRpbWUgKGluIGJ5dGVzKSBiZWZvcmUgYWxsIGJ1cnN0cyBmb3IgdGhpcyBPTlUuICovCisgICAgdWludDMyX3QgYWRkaXRpb25hbF9wb3N0YnVyc3RfZ3VhcmRfdGltZTsgICAvKio8IEFkZGl0aW9uYWwgZ3VhcmQgdGltZSAoaW4gYnl0ZXMpIGFmdGVyIGFsbCBidXJzdHMgZm9yIHRoaXMgT05VLiAqLworfSBiY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZTsKKworLyoqIEZpcm13YXJlIFNXIFZlcnNpb24gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9maXJtd2FyZV9zd192ZXJzaW9uCit7CisgICAgdWludDhfdCBtYWpvcjsgICAgICAgICAgLyoqPCBNYWpvciAuICovCisgICAgdWludDhfdCBtaW5vcjsgICAgICAgICAgLyoqPCBNaW5vci4gKi8KKyAgICB1aW50OF90IHJldmlzaW9uOyAgICAgICAvKio8IFJldmlzaW9uLiAqLworICAgIHVpbnQzMl90IG1vZGVsOyAgICAgICAgIC8qKjwgTW9kZWwuICovCisgICAgY2hhciBidWlsZF90aW1lWzMyXTsgICAgLyoqPCBGaXJtd2FyZSBTVyBidWlsZCB0aW1lICovCit9IGJjbW9sdF9maXJtd2FyZV9zd192ZXJzaW9uOworCisvKiogR0VNIHBvcnQgY29uZmlndXJhdGlvbi4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9nZW1fcG9ydF9jb25maWd1cmF0aW9uCit7CisgICAgYmNtb2x0X2dlbV9wb3J0X2RpcmVjdGlvbiBkaXJlY3Rpb247ICAgIC8qKjwgR0VNIHBvcnQgZGlyZWN0aW9uICovCisgICAgYmNtb2x0X2dlbV9wb3J0X3R5cGUgdHlwZTsgICAgICAgICAgICAgIC8qKjwgR0VNIHBvcnQgdHlwZSAqLworfSBiY21vbHRfZ2VtX3BvcnRfY29uZmlndXJhdGlvbjsKKworLyoqIEdQT04gQWxsb2MgV2l0aCBTdGF0ZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGUKK3sKKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19pZCBhbGxvY19pZDsgIC8qKjwgQWxsb2MgSUQuICovCisgICAgYmNtb2x0X2FsbG9jX3N0YXRlIHN0YXRlOyAgICAgICAvKio8IFN0YXRlLiAqLworfSBiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlOworCisvKiogVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgZ3Bvbl9hbGxvY193aXRoX3N0YXRlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzIKK3sKKyAgICB1aW50MTZfdCBsZW47ICAgICAgICAgICAgICAgICAgICAgICAvKio8IExpc3QgbGVuZ3RoLiAqLworICAgIGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGUgKnZhbDsgIC8qKjwgTGlzdCBjb250ZW50cy4gKi8KK30gYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzI7CisKKy8qKiBHUE9OIERlYnVnIEZsb3cgQ29uZmlnLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fZGVidWdfZmxvd19jb25maWcKK3sKKyAgICBiY21vbHRfY29udHJvbF9zdGF0ZSB1bnRhZ2dlZF9mbG93OyAvKio8IElmIGVuYWJsZWQsIHRoaXMgR0VNIHBvcnQgd2lsbCBleHBlY3QgdXBzdHJlYW0gdHJhZmZpYyB0byBiZSB1bnRhZ2dlZCBhbmQgZG93bnN0cmVhbSB0cmFmZmljIHRvIHVzZSBhIGN1c3RvbSBWTEFOIHRhZy4gKi8KKyAgICBiY21vbHRfdmxhbl9pZCB1bnRhZ2dlZF92aWQ7ICAgICAgICAvKio8IFRoZSBWTEFOIElEIHRvIHVzZSB3aGVuIGFkZGluZyBNQUMgdGFibGUgZW50cmllcyBmb3IgdW50YWdnZWQgdHJhZmZpYy4gKi8KK30gYmNtb2x0X2dwb25fZGVidWdfZmxvd19jb25maWc7CisKKy8qKiBWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiBncG9uX2dlbV9pZC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNgoreworICAgIHVpbnQ4X3QgbGVuOyAgICAgICAgICAgICAgICAvKio8IExpc3QgbGVuZ3RoLiAqLworICAgIGJjbW9sdF9ncG9uX2dlbV9pZCAqdmFsOyAgICAvKio8IExpc3QgY29udGVudHMuICovCit9IGJjbW9sdF9ncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNjsKKworLyoqIEdQT04gR0VNIFBvcnQgV2l0aCBTdGF0ZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGUKK3sKKyAgICBiY21vbHRfZ3Bvbl9nZW1faWQgZ2VtX2lkOyAgICAgICAgICAvKio8IEdFTSBJRC4gKi8KKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0ZSBzdGF0ZTsgICAvKio8IFN0YXRlLiAqLworfSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlOworCisvKiogVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4Cit7CisgICAgdWludDE2X3QgbGVuOyAgIC8qKjwgTGlzdCBsZW5ndGguICovCisgICAgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSAqdmFsOyAgIC8qKjwgTGlzdCBjb250ZW50cy4gKi8KK30gYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4OworCisvKiogVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2Cit7CisgICAgdWludDE2X3QgbGVuOyAgIC8qKjwgTGlzdCBsZW5ndGguICovCisgICAgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSAqdmFsOyAgIC8qKjwgTGlzdCBjb250ZW50cy4gKi8KK30gYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2OworCisvKiogT3B0aW9ucyBmb3IgY29uZmlndXJpbmcgdGhlICJ1bnRhZ2dlZCBmbG93IiBmZWF0dXJlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25faXdmX2RlYnVnX2Zsb3dfY29uZmlnCit7CisgICAgYmNtb3NfYm9vbCBsZWFybl91bnRhZ2dlZF9mbG93X3ZpZHM7ICAgICAgICAvKio8IFdoZW4gYSBNQUMvVklEIGlzIGxlYXJuZWQgb24gYW4gdW50YWdnZWQgZmxvdywgbGVhcm4gdGhlIHJlY2VpdmVkIE1BQyBhZGRyZXNzIHdpdGggYm90aCB0aGUgdW50YWdnZWQgVklEIGFuZCB0aGUgcmVjZWl2ZWQgVklEIChldmVuIHRob3VnaCBpdCB3aWxsIGJlIGludmFsaWQpLiAqLworICAgIHVpbnQxNl90IHVudGFnZ2VkX2Zsb3dfc2hhcGluZ19tc19wZXJfc2VjOyAgLyoqPCBJZiB0aGlzIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiAwLCBsZWFybmluZyBldmVudHMgb24gdW50YWdnZWQgZmxvd3Mgd2lsbCBvbmx5IGJlIGVuYWJsZWQgZm9yIE4gbWlsbGlzZWNvbmRzIGV2ZXJ5IHNlY29uZC4gIEZvciBleGFtcGxlLCBhIHZhbHVlIG9mIDEwIHdvdWxkIG1lYW4gbGVhcm5pbmcgaXMgb25seSBlbmFibGVkIGZvciAxJSBvZiB0aGUgdG90YWwgdGltZS4gKi8KK30gYmNtb2x0X2dwb25faXdmX2RlYnVnX2Zsb3dfY29uZmlnOworCisvKiogR1BPTiBLZXkgRXhjaGFuZ2UgLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fa2V5X2V4Y2hhbmdlCit7CisgICAgdWludDMyX3QgaW50ZXJ2YWw7ICAgICAgICAgICAgICAvKio8IEtleSBFeGNoYW5nZSBwcm9jZXNzIGludGVydmFsIGluIG1pbGxpc2Vjb25kcyAqLworICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIGNvbnRyb2w7ICAgLyoqPCBFbmFibGVcZGlzYWJsZSBwZXJpb2RpYyBwcm9jZXNzIG9mIEtleSBFeGNoYW5nZSBmb3IgYWN0aXZlIE9OVXMgKi8KKyAgICBiY21vbHRfa2V5X2V4Y2hhbmdlX21vZGUgbW9kZTsgIC8qKjwgS2V5IGV4Y2hhbmdlIG1vZGUgKi8KKyAgICBiY21vbHRfY29udHJvbF9zdGF0ZSBlbmNyeXB0ZWRfcG9ydHNfb25seTsgIC8qKjwgUGVyZm9ybSBrZXkgZXhjaGFuZ2Ugb25seSB0byBPTlVzIHdpdGggR0VNIHBvcnRzIHRoYXQgaGF2ZSBkb3duc3RyZWFtIGVuY3J5cHRpb24gZW5hYmxlZCAqLworfSBiY21vbHRfZ3Bvbl9rZXlfZXhjaGFuZ2U7CisKKy8qKiBHUE9OIE1BQyB0YWJsZSBzY2FuIHJlc3VsdCBmb3IgYSBzaW5nbGUgTUFDIHRhYmxlIGVudHJ5LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0Cit7CisgICAgYmNtb2x0X3ZsYW5faWQgdmxhbjsgICAgICAgICAgICAvKio8IFRoZSBWTEFOIElEIG9mIHRoZSBlbnRyeS4gKi8KKyAgICBiY21vbHRfZmxvd19pZCBmbG93X2lkOyAgICAgICAgIC8qKjwgVGhlIGZsb3cgSUQgYXNzaWduZWQgdG8gdHJhZmZpYyB0aGF0IG1hdGNoZXMgdGhpcyBNQUMgdGFibGUgZW50cnkuICovCisgICAgYmNtb3NfYm9vbCBzdGF0OyAgICAgICAgICAgICAgICAvKio8IFdoZXRoZXIgb3Igbm90IHRoZSBNQUMgZW50cnkgaXMgc3RhdGljLiAgU3RhdGljIGVudHJpZXMgZG9uJ3QgYWdlLiAqLworICAgIGJjbW9sdF9ncG9uX2dlbV9pZCBnZW1fcG9ydF9pZDsgLyoqPCBUaGUgR0VNIHBvcnQgSUQgb2YgdGhlIHRyYWZmaWMgdGhhdCBjcmVhdGVkIHRoaXMgdGFibGUgZW50cnkuICBUaGlzIG9ubHkgYXBwbGllcyB0byBhdXRvbWF0aWNhbGx5LWxlYXJuZWQgZW50cmllcy4gIE1hbnVhbGx5LWFkZGVkIGVudHJpZXMgd2lsbCBoYXZlIHRoZSB2YWx1ZSBCQ01PTFRfUE9OX0dFTV9QT1JUX0lEX0lOVkFMSUQuICovCisgICAgYmNtb2x0X2dwb25fb251X2lkIG9udV9pZDsgICAgICAvKio8IFRoZSBPTlUgSUQgZm9yIHRoZSB0cmFmZmljIHRoYXQgY3JlYXRlZCB0aGlzIHRhYmxlIGVudHJ5LiAgVGhpcyBvbmx5IHZhbGlkIGlmIGdlbV9wb3J0X2lkIGlzIHZhbGlkLiAgT3RoZXJ3aXNlIHRoaXMgd2lsbCBiZSBzZXQgdG8gQkNNT0xUX0dQT05fT05VX0lEX0lOVkFMSUQuICovCit9IGJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdDsKKworLyoqIFZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIGdwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0X2xpc3RfdTE2Cit7CisgICAgdWludDE2X3QgbGVuOyAgIC8qKjwgTGlzdCBsZW5ndGguICovCisgICAgYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0ICp2YWw7IC8qKjwgTGlzdCBjb250ZW50cy4gKi8KK30gYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0X2xpc3RfdTE2OworCisvKiogR1BPTiBOSSBEZWJ1ZyBwYXJhbWV0ZXJzIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9uaV9kZWJ1ZworeworICAgIHVpbnQxNl90IG51bWJlcl9vZl9nZW1fcG9ydHNfcGVyX29udTsgICAvKio8IE51bWJlciBvZiBHZW0gcG9ydHMgcGVyIE9OVSAqLworfSBiY21vbHRfZ3Bvbl9uaV9kZWJ1ZzsKKworLyoqIEdQT04gT05VIGFjdGl2YXRpb24uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfYWN0aXZhdGlvbgoreworICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIGtleV9leGNoYW5nZTsgICAgICAgICAgICAgIC8qKjwgUGVyZm9ybSBzaW5nbGUga2V5IGV4Y2hhbmdlIGR1cmluZyBhY3RpdmF0aW9uLiAqLworICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIHBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uOyAgIC8qKjwgUGVyZm9ybSBwYXNzd29yZCBhdXRoZW50aWNhdGlvbiBkdXJpbmcgYWN0aXZhdGlvbiAqLworICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIGZhaWxfZHVlX3RvX3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmU7ICAgLyoqPCBEZWFjdGl2YXRlIE9OVSBkdWUgdG8gcGFzc3dvcmQgYXV0aGVudGljYXRpb24gZmFpbHVyZSAqLworfSBiY21vbHRfZ3Bvbl9vbnVfYWN0aXZhdGlvbjsKKworLyoqIEdQT04gT05VIGFsYXJtIHN0YXR1cy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZQoreworICAgIGJjbW9sdF9zdGF0dXMgbG9zaTsgICAgIC8qKjwgTG9zcyBvZiBzaWduYWwuICovCisgICAgYmNtb2x0X3N0YXR1cyBsb2ZpOyAgICAgLyoqPCBMb3NzIG9mIGZyYW1lLiAqLworICAgIGJjbW9sdF9zdGF0dXMgbG9hbWk7ICAgIC8qKjwgTG9zcyBvZiBQTE9BTS4gKi8KKyAgICBiY21vbHRfc3RhdHVzIGRnaTsgICAgICAvKio8IER5aW5nIEdhc3AuICovCisgICAgYmNtb2x0X3N0YXR1cyB0aXdpOyAgICAgLyoqPCBUcmFuc21pc3Npb24gaW50ZXJmZXJlbmNlIEFsYXJtLiAqLworICAgIGJjbW9sdF9zdGF0dXMgZG93aTsgICAgIC8qKjwgRHJpZnQgb2YgV2luZG93LiAqLworICAgIGJjbW9sdF9zdGF0dXMgc3VmaTsgICAgIC8qKjwgU3RhcnQgVVAgRmFpbHVyZS4gKi8KKyAgICBiY21vbHRfc3RhdHVzIHNmaTsgICAgICAvKio8IFNpZ25hbCBGYWlsLiAqLworICAgIGJjbW9sdF9zdGF0dXMgc2RpOyAgICAgIC8qKjwgU2lnbmFsIERlZ3JhZGVkLiAqLworICAgIGJjbW9sdF9zdGF0dXMgZGZpOyAgICAgIC8qKjwgRGVhY3RpdmF0aW9uIEZhaWx1cmUuICovCisgICAgYmNtb2x0X3N0YXR1cyBsb2FpOyAgICAgLyoqPCBMb3NzIG9mIGFjay4gKi8KKyAgICBiY21vbHRfc3RhdHVzIGxva2k7ICAgICAvKio8IGxvc3Mgb2Yga2V5LiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGU7CisKKy8qKiBHUE9OIE9OVSBhbGFybXMuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zCit7CisgICAgYmNtb2x0X3N0YXR1cyBsb3NpOyAgICAgLyoqPCBMT1NpLiAqLworICAgIGJjbW9sdF9zdGF0dXMgbG9maTsgICAgIC8qKjwgTE9GaS4gKi8KKyAgICBiY21vbHRfc3RhdHVzIGxvYW1pOyAgICAvKio8IExPQU1pLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zOworCisvKiogR1BPTiBPTlUgYWxhcm1zIHRocmVzaG9sZHMuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMKK3sKKyAgICB1aW50OF90IGxvc2k7ICAgLyoqPCBUaHJlc2hvbGQgZm9yIGFzc2VydGluZyBMT1NpIGFsYXJtICovCisgICAgdWludDhfdCBsb2ZpOyAgIC8qKjwgVGhyZXNob2xkIGZvciBhc3NlcnRpbmcgTE9GaSBhbGFybSAqLworICAgIHVpbnQ4X3QgbG9hbWk7ICAvKio8IFRocmVzaG9sZCBmb3IgYXNzZXJ0aW5nIExPQU1pIGFsYXJtICovCit9IGJjbW9sdF9ncG9uX29udV9hbGFybXNfdGhyZXNob2xkczsKKworLyoqIEdQT04gT05VIEVRRC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9lcWQKK3sKKyAgICBiY21vbHRfZ3Bvbl9vbnVfaWQgb251X2lkOyAgLyoqPCBPTlUgSUQuICovCisgICAgdWludDMyX3QgZXFkOyAgICAgICAgICAgICAgIC8qKjwgRVFELiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfZXFkOworCisvKiogVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgZ3Bvbl9vbnVfZXFkLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X2VxZF9saXN0X3UzMgoreworICAgIHVpbnQzMl90IGxlbjsgICAgICAgICAgICAgICAvKio8IExpc3QgbGVuZ3RoLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9lcWQgKnZhbDsgICAvKio8IExpc3QgY29udGVudHMuICovCit9IGJjbW9sdF9ncG9uX29udV9lcWRfbGlzdF91MzI7CisKKy8qKiBWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiBncG9uX29udV9pZC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9pZF9saXN0X3UzMl9tYXhfMjU2Cit7CisgICAgdWludDMyX3QgbGVuOyAgICAgICAgICAgICAgIC8qKjwgTGlzdCBsZW5ndGguICovCisgICAgYmNtb2x0X2dwb25fb251X2lkICp2YWw7ICAgIC8qKjwgTGlzdCBjb250ZW50cy4gKi8KK30gYmNtb2x0X2dwb25fb251X2lkX2xpc3RfdTMyX21heF8yNTY7CisKKy8qKiBHUE9OIE9OVSB1cGdyYWRlIHBhcmFtcy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtcworeworICAgIHVpbnQzMl90IHJlc3BvbnNlX3RpbWVvdXRfbXM7ICAgICAgIC8qKjwgVGhlIGxlbmd0aCBvZiB0aW1lIHRoYXQgdGhlIE9MVCB3aWxsIHdhaXQgZm9yIHRoZSBPTlUgdG8gcmVzcG9uZC4gKi8KKyAgICB1aW50OF90IG1heF9yZXRyeV9jb3VudDsgICAgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgcmV0cmllcy4gKi8KKyAgICBiY21vbHRfb21jaV9kZXZpY2VfaWQgb21jaV9mb3JtYXQ7ICAvKio8IEJhc2VsaW5lICgweDBBKSBvciBFeHRlbmRlZCAoMHgwQikuICovCisgICAgdWludDE2X3Qgd2luZG93X3NpemU7ICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2Ygc2VjdGlvbnMgcGVyIHdpbmRvdy4gKi8KKyAgICBiY21vc19ib29sIGFjdGl2YXRlX2NvbW1pdDsgICAgICAgICAvKio8IEF1dG9tYXRpY2FsbHkgYWN0aXZhdGUgdGhlIG5ldyBpbWFnZSBhbmQgY29tbWl0LiAqLworICAgIHVpbnQzMl90IGRlbGF5X2Zvcl9jb21taXRfbXM7ICAgICAgIC8qKjwgRGVsYXkgdGltZSBiZWZvcmUgQ09NTUlUIGNvbW1hbmQuICBVbml0IGlzIG1pbGxpc2Vjb25kcy4gKi8KKyAgICB1aW50OF90IG1heF9hY3RpdmF0aW9uX2F0dGVtcHRzOyAgICAvKio8IE1heGltdW0gbnVtYmVyIG9mIHJlLWF0dGVtcHRzIHRvIGFjdGl2YXRlIHRoZSBPTlUuICovCit9IGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtczsKKworLyoqIEdQT04gT05VIFVwZ3JhZGUgU3RhdHVzLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzCit7CisgICAgYmNtb2x0X3Bvbl9vbnVfaWQgb251X2lkOyAgIC8qKjwgT05VIElELiAqLworICAgIGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3JldHVybl9jb2RlIGVycm9yX2NvZGU7IC8qKjwgRXJyb3IgQ29kZS4gKi8KKyAgICBiY21vbHRfb21jaV9yZXN1bHRfY29kZSBmYWlsX3JlYXNvbjsgICAgICAgICAgICAvKio8IEZhaWx1cmUgcmVhc29uIHNwZWNpZmljIHRvIHRoZSBFcnJvciBDb2RlIGFib3ZlLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXM7CisKKy8qKiBWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiBncG9uX29udV91cGdyYWRlX3N0YXR1cy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMgoreworICAgIHVpbnQzMl90IGxlbjsgICAvKio8IExpc3QgbGVuZ3RoLiAqLworICAgIGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1cyAqdmFsOyAgICAvKio8IExpc3QgY29udGVudHMuICovCit9IGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMjsKKworLyoqIEdQT04gT05VIFdpdGggU3RhdGUuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZQoreworICAgIGJjbW9sdF9ncG9uX29udV9pZCBvbnVfaWQ7ICAvKio8IE9OVSBJRC4gKi8KKyAgICBiY21vbHRfb251X3N0YXRlIHN0YXRlOyAgICAgLyoqPCBTdGF0ZS4gKi8KK30gYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGU7CisKKy8qKiBWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiBncG9uX29udV93aXRoX3N0YXRlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOAoreworICAgIHVpbnQxNl90IGxlbjsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTGlzdCBsZW5ndGguICovCisgICAgYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGUgKnZhbDsgICAgLyoqPCBMaXN0IGNvbnRlbnRzLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4OworCisvKiogZ3BvbiBSU1NJIGdlbmVyYWwgY29uZmlndXJhdGlvbi4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX3Jzc2lfZ2VuZXJhbF9jb25maWd1cmF0aW9uCit7CisgICAgdWludDhfdCBsb2NhdGlvbjsgICAvKio8IHRoZSBwYXR0ZXJuIGFjdGl2YXRpb24gbG9jYXRpb24gaW4gY2xvY2sgY3ljbGVzIHJlbGF0aXZlIChiZWZvcmUpIHRvIHN0YXJ0IG9mIGJ1cnN0LiAqLworICAgIGJjbW9sdF9yc3NpX2xvY2F0aW9uX3NpZ24gbG9jYXRpb25fc2lnbjsgICAgLyoqPCB0aGlzIGJpdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGxvY2F0aW9uIG9mIHRoZSBSU1NJIGluIGRhdGEgbW9kZSAoY29uZmlndXJlZCBhcyBSU1NJIHBhdHRlcm4gMSkgd2lsbCBiZSBiZWZvcmUgb3IgYWZ0ZXIgdGhlIGJ1cnN0IHN0YXJ0LiAqLworICAgIHVpbnQ4X3Qgc3RhcnRfcGF0dGVybjsgICAgICAgICAgICAgICAgICAgICAgLyoqPCB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGN5Y2xlIG9mIHRoZSBwYXR0ZXJuICh3aWxsIGJlIHRyYW5zbWl0dGVkIG9uY2UpLiAqLworICAgIHVpbnQ4X3QgbWlkZGxlX3BhdHRlcm47ICAgICAgICAgICAgICAgICAgICAgLyoqPCB0aGUgdmFsdWUgb2YgdGhlIHBhdHRlcm4gdGhhdCB3aWxsIGJlIHRyYW5zbWl0dGVkIG1pZGRsZV9yZXBldGl0aW9uIHRpbWVzIGJldHdlZW4gdGhlIHN0YXJ0IGFuZCB0aGUgZW5kIG9mIHRoZSBwYXR0ZXJuLiAqLworICAgIHVpbnQ4X3QgbGFzdF9wYXR0ZXJuOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCB0aGUgdmFsdWUgb2YgdGhlIGxhc3QgY3ljbGUgb2YgdGhlIHBhdHRlcm4uIHdpbGwgYmUgdHJhbnNtaXR0ZWQgb25jZS4gKi8KKyAgICB1aW50OF90IG1pZGRsZV9yZXBlcnRpdGlvbjsgICAgICAgICAgICAgICAgIC8qKjwgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgbWlkZGxlIHBhdHRlcm4gd2lsbCBiZSByZXBlYXRlZC4gKi8KKyAgICB1aW50MTZfdCBtaW5pbXVtX2J1cnN0OyAgICAgICAgICAgICAgICAgICAgIC8qKjwgdGhlIG1pbmltdW0gYnVyc3Qgc2l6ZSBuZWVkZWQgbWVhc3VyZW1lbnQgKi8KK30gYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb247CisKKy8qKiBHUE9OIFNOIEFjcXVpc2l0aW9uLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb24KK3sKKyAgICB1aW50MzJfdCBpbnRlcnZhbDsgICAgICAgICAgICAgIC8qKjwgU04gcHJvY2VzcyBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgKi8KKyAgICBiY21vbHRfY29udHJvbF9zdGF0ZSBjb250cm9sOyAgIC8qKjwgU04gcHJvY2VzcyBjb250cm9sICovCisgICAgYmNtb2x0X29udV9wb3N0X2Rpc2NvdmVyeV9tb2RlIG9udV9wb3N0X2Rpc2NvdmVyeV9tb2RlOyAvKio8IEF1dG9tYXRpYyBvcGVyYXRpb24gZm9sbG93aW5nIE9OVSBkaXNjb3ZlcnkgKi8KK30gYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb247CisKKy8qKiBIb3N0IFNXIFZlcnNpb24gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ob3N0X3N3X3ZlcnNpb24KK3sKKyAgICB1aW50OF90IG1ham9yOyAgICAgICAgICAvKio8IE1ham9yIC4gKi8KKyAgICB1aW50OF90IG1pbm9yOyAgICAgICAgICAvKio8IE1pbm9yLiAqLworICAgIHVpbnQ4X3QgcmV2aXNpb247ICAgICAgIC8qKjwgUmV2aXNpb24uICovCisgICAgdWludDMyX3QgbW9kZWw7ICAgICAgICAgLyoqPCBNb2RlbC4gKi8KKyAgICBjaGFyIGJ1aWxkX3RpbWVbMzJdOyAgICAvKio8IEZpcm13YXJlIFNXIGJ1aWxkIHRpbWUgKi8KK30gYmNtb2x0X2hvc3Rfc3dfdmVyc2lvbjsKKworLyoqIEhXIFBPTiBJRC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9od19wb25faWQKK3sKKyAgICB1aW50MzJfdCBwb25faWRfMTsgIC8qKjwgTFNCIDMyIGJpdHMgb2YgUE9OIElELiAqLworICAgIHVpbnQzMl90IHBvbl9pZF8yOyAgLyoqPCBNU0IgMTkgYml0cyBvZiBQT04gSUQuICovCit9IGJjbW9sdF9od19wb25faWQ7CisKKy8qKiBQb3J0IElkZW50aXR5IHVzZWQgaW4gSUVFRSA4MDIuMWFzIENsb2NrIFRyYW5wb3J0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2llZWVfODAyMWFzX3BvcnRfaWRlbnRpdHkKK3sKKyAgICB1aW50OF90IGNsb2NrX2lkZW50aXR5WzhdOyAgLyoqPCBDbG9jayBpZGVudGl0eSBpcyBhIHVuaXF1ZSBpZGVudGlmaWVyIHVzZWQgaW4gSUVFRSA4MDIuMWFzIGNsb2NrIHRyYW5zcG9ydC4gKi8KKyAgICB1aW50MTZfdCBwb3J0X251bWJlcjsgICAgICAgLyoqPCBQb3J0IE51bWJlci4gKi8KK30gYmNtb2x0X2llZWVfODAyMWFzX3BvcnRfaWRlbnRpdHk7CisKKy8qKiBUaW1lc3RhbXAgdXNlZCBpbiBJRUVFIDgwMi4xYXMgY2xvY2sgdHJhbnNwb3J0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2llZWVfODAyMWFzX3RpbWVzdGFtcAoreworICAgIHVpbnQxNl90IHNlY29uZHNfaGlnaDsgIC8qKjwgVGhlIGhpZ2ggMTYgYml0cyBvZiB0aGUgNDggYml0IHNlY29uZHMgZmllbGQgYXMgcmVxdWlyZWQgYnkgSUVFRS4gKi8KKyAgICB1aW50MzJfdCBzZWNvbmRzX2xvdzsgICAvKio8IFRoZSBsb3cgMzIgYnRzIG9mIHRoZSA0OCBiaXQgc2Vjb25kcyBmaWVsZCBhcyByZXF1aXJlZCBieSBJRUVFLiAqLworICAgIHVpbnQzMl90IG5hbm9zZWNvbmRzOyAgIC8qKjwgVGhlIE5hbm9zZWNvbmRzIHBhcnQgb2YgdGhlIHRpbWVzdGFtcC4gKi8KK30gYmNtb2x0X2llZWVfODAyMWFzX3RpbWVzdGFtcDsKKworLyoqIEZ1bGwgZnJhbWUgb2YgdGhlIElFRUUgODAyLjFhcyB0aW1lIHN5bmMgbWVzc2FnZSB1c2VkIGluIGNsb2NrIHRyYW5zcG9ydC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9pZWVlXzgwMjFhc190aW1lX3N5bmMKK3sKKyAgICBiY21vc19tYWNfYWRkcmVzcyBkZXN0aW5hdGlvbl9tYWM7ICAvKio8IERlc3RpbmF0aW9uIE1BQyBBZGRyZXNzLiAqLworICAgIGJjbW9zX21hY19hZGRyZXNzIHNvdXJjZV9tYWM7ICAgICAgIC8qKjwgU291cmNlIE1BQyBBZGRyZXNzLiAqLworICAgIHVpbnQxNl90IGV0aF90eXBlX2xlbjsgICAgICAgICAgICAgIC8qKjwgVHlwZSBvZiBFdGhlcm5ldCBQRFUuICovCisgICAgdWludDhfdCBldGhfc3VidHlwZTsgICAgICAgICAgICAgICAgLyoqPCBTbG93IHByb3RvY29sIFN1YnR5cGUuICovCisgICAgdWludDhfdCBpZWVlX291aVszXTsgICAgICAgICAgICAgICAgLyoqPCBJRUVFIE9VSS4gKi8KKyAgICB1aW50MTZfdCBtc2dfaWQ7ICAgICAgICAgICAgICAgICAgICAvKio8IE1lc3NhZ2UgSUQuICovCisgICAgdWludDMyX3QgeDsgLyoqPCBSZWZlcmVuY2UgVGltZS4gKi8KKyAgICBiY21vbHRfaWVlZV84MDIxYXNfdGltZXN0YW1wIHRvZDsgICAgICAgICAgICAgICAvKio8IFRpbWUgb2YgZGF5IHRpbWVzdGFtcC4gKi8KKyAgICBiY21vbHRfaWVlZV84MDIxYXNfcG9ydF9pZGVudGl0eSBwb3J0X2lkZW50aXR5OyAvKio8IFNvdXJjZSBwb3J0IGlkZW50aXR5LiAqLworICAgIGludDhfdCBsb2dfbXNnX2ludGVydmFsOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTG9nIG1lc3NhZ2UgaW50ZXJ2YWwgKGN1cnJlbnRseSB1bnVzZWQgYnV0IHJlcXVpcmVkIGJ5IHNwZWMpLiAqLworICAgIGRvdWJsZSByYXRlX3JhdGlvOyAgICAgICAgICAgICAgICAgIC8qKjwgUmF0aW8gb2YgbG9jYWwgc2Vjb25kIHRvIGdyYW5kbWFzdGVyIHNlY29uZC4gKi8KKyAgICB1aW50MTZfdCBnbV90aW1lX2Jhc2VfaW5kaWNhdG9yOyAgICAvKio8IEdyYW5kbWFzdGVyIHRpbWUgYmFzZSBpbmRpY2F0b3IgKGN1cnJlbnRseSB1bnVzZWQgYnV0IHJlcXVpcmVkIGJ5IHNwZWMpLiAqLworICAgIHVpbnQ4X3QgbGFzdF9nbV9waGFzZV9jaGFuZ2VbMTJdOyAgIC8qKjwgVGltZSBvZiB0aGUgY3VycmVudCBncmFuZG1hc3RlciBtaW51cyB0aGUgdGltZSBvZiB0aGUgcHJldmlvdXMgZ3JhbmRtYXN0ZXIsIGluIHVuaXRzIG9mIDJeLTE2IG5zIChjdXJyZW50bHkgdW51c2VkIGJ1dCByZXF1aXJlZCBieSBzcGVjKS4gKi8KKyAgICBpbnQzMl90IGxhc3RfZnJlcXVlbmN5X2NoYW5nZTsgICAgICAvKio8IEZyYWN0aW9uYWwgZnJlcXVlbmN5IG9mZnNldCBvZiB0aGUgY3VycmVudCBncmFuZG1hc3RlciByZWxhdGl2ZSB0byB0aGUgcHJldmlvdXMgZ3JhbmRtYXN0ZXIgKE5vdCBjdXJyZW50bHkgdXNlZCBidXQgcmVxdWlyZWQgYnkgc3BlYykuICovCit9IGJjbW9sdF9pZWVlXzgwMjFhc190aW1lX3N5bmM7CisKKy8qKiBSYXRlIGxpbWl0aW5nIC8gc2hhcGluZyBmb3IgdGhlIGluZGljYXRpb24gY2hhbm5lbC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9pbmRpY2F0aW9uX3NoYXBpbmcKK3sKKyAgICBiY21vc19ib29sIGVuYWJsZWQ7IC8qKjwgV2hldGhlciBvciBub3QgdGhlIGRldmljZSB3aWxsIGxpbWl0IHRoZSByYXRlIG9mIGluZGljYXRpb25zIHNlbnQgdG8gdGhlIGhvc3QuICovCisgICAgdWludDMyX3QgbWF4X3JhdGU7ICAvKio8IE1heGltdW0gbnVtYmVyIG9mIGluZGljYXRpb25zIHBlciBzZWNvbmQgdG8gYmUgZ2VuZXJhdGVkIGJ5IHRoZSBkZXZpY2UuICovCisgICAgdWludDMyX3QgbWF4X2J1cnN0OyAvKio8IE1heGltdW0gbnVtYmVyIG9mIGluZGljYXRpb25zIHRoYXQgYXJlIGFsbG93ZWQgdG8gYmUgc2VudCBiYWNrLXRvLWJhY2suICovCit9IGJjbW9sdF9pbmRpY2F0aW9uX3NoYXBpbmc7CisKKy8qKiBMQSByZXN5bmMgcGF0dGVybiBjb25maWd1cmF0aW9uLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2xhX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb24KK3sKKyAgICBiY21vbHRfcmVzeW5jX2NvbnRyb2wgcmVzeW5jX2NvbnRyb2w7ICAgLyoqPCB1c2VkIGluIG5vcm1hbCBtb2RlICovCisgICAgYmNtb2x0X3Jlc3luY19jb250cm9sIHJhbmdpbmdfcmVzeW5jX2NvbnRyb2w7ICAgLyoqPCB1c2VkIGluIHJhbmdpbmcgbW9kZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggcmFuZ2luZyBjeWNsZSAqLworfSBiY21vbHRfbGFfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbjsKKworLyoqIGxvZyBidWZmZXIuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbG9nX2J1ZmZlcgoreworICAgIGNoYXIgYnVmZlsyMDQ4XTsgICAgICAgIC8qKjwgYnVmZi4gKi8KKyAgICB1aW50MzJfdCBtc2dfdG9fcmVhZDsgICAvKio8IG1zZ190b19yZWFkLiAqLworfSBiY21vbHRfbG9nX2J1ZmZlcjsKKworLyoqIE1BQyB0YWJsZSBjb25maWd1cmF0aW9uLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X21hY190YWJsZV9jb25maWd1cmF0aW9uCit7CisgICAgYmNtb2x0X21hY190YWJsZV9taXNzX2ZhbGxiYWNrIG1pc3NfZmFsbGJhY2s7ICAgLyoqPCBCZWhhdmlvciBmb3IgZG93bnN0cmVhbSB0cmFmZmljIHdoZW4gTUFDIHRhYmxlIGxvb2t1cCBmYWlscy4gKi8KKyAgICBiY21vbHRfZmxvd19pZCBkZWZhdWx0X2Zsb3dfaWQ7ICAgICAgICAgICAgICAgICAvKio8IEZsb3cgSUQgYXNzaWduZWQgdG8gdXBzdHJlYW0gdHJhZmZpYyBvbiBhIE1BQyB0YWJsZSBtaXNzIGlmIG1pc3NfZmFsbGJhY2sgaXMgc2V0IHRvIGRlZmF1bHRfZmxvdy4gKi8KKyAgICB1aW50MzJfdCBhZ2luZ190aW1lOyAgICAvKio8IEFnaW5nIHRpbWUgaW4gc2Vjb25kcy4gIElmIG5vIHRyYWZmaWMgaXMgc2VlbiBmb3IgYSBnaXZlbiBNQUMgYWRkcmVzcyAvIFZJRCBmb3IgdGhpcyBsZW5ndGggb2YgdGltZSwgdGhlIGVudHJ5IHdpbGwgYWdlIGFuZCB0aGUgaG9zdCB3aWxsIGJlIG5vdGlmaWVkIHZpYSBpbmRpY2F0aW9uLiAqLworICAgIGJjbW9sdF9tYWNfdGFibGVfbGVhcm5pbmdfbW9kZSBsZWFybmluZ19tb2RlOyAgIC8qKjwgTGVhcm5pbmcgdGFibGUgbW9kZS4gKi8KKyAgICBiY21vbHRfY29udHJvbF9zdGF0ZSBhdXRvbWF0aWNfbWFjX2xlYXJuaW5nOyAgICAvKio8IElmIGVuYWJsZWQsIG5ldyBNQUMgdGFibGUgZW50cmllcyBhcmUgYWRkZWQgYXV0b21hdGljYWxseSB0aGUgZmlyc3QgdGltZSBhIG5ldyBNQUMgYWRkcmVzcy9WSUQgY29tYmluYXRpb24gaXMgc2Vlbi4gIElmIGRpc2FibGVkLCBubyBhY3Rpb25zIGFyZSB0YWtlbiBhdXRvbWF0aWNhbGx5IGV4Y2VwdCBub3RpZnlpbmcgdGhlIGhvc3QgdmlhIGluZGljYXRpb24uICovCisgICAgYmNtb2x0X2NvbnRyb2xfc3RhdGUgYXV0b21hdGljX21hY19hZ2luZzsgICAgICAgLyoqPCBJZiBlbmFibGVkLCBNQUMgdGFibGUgZW50cmllcyBhcmUgZGVsZXRlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhleSBhZ2UuICBJZiBkaXNhYmxlZCwgbm8gYWN0aW9ucyBhcmUgdGFrZW4gYXV0b21hdGljYWxseSBleGNlcHQgbm90aWZ5aW5nIHRoZSBob3N0IHZpYSBpbmRpY2F0aW9uLiAqLworICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIGF1dG9tYXRpY19tYWNfbW92ZTsgICAgICAgIC8qKjwgT25seSBhcHBsaWNhYmxlIGlmIGxlYXJuaW5nX21vZGUgaXMgbW92ZS4gIElmIGVuYWJsZWQsIE1BQyB0YWJsZSBlbnRyaWVzIGFyZSBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgd2hlbiBhIE1BQyBtb3ZlIGNvbmRpdGlvbiBpcyBlbmNvdW50ZXJlZC4gIElmIGRpc2FibGVkLCBubyBhY3Rpb25zIGFyZSB0YWtlbiBhdXRvbWF0aWNhbGx5IGV4Y2VwdCBub3RpZnlpbmcgdGhlIGhvc3QgdmlhIGluZGljYXRpb24uICovCisgICAgYmNtb3NfYm9vbCBhdXRvbWF0aWNfc3RhdGljX21vZGU7ICAgICAgICAgICAgICAgLyoqPCBJZiBlbmFibGVkLCBhbGwgTUFDIGVudHJpZXMgdGhhdCBhcmUgYWRkZWQgYXV0b21hdGljYWxseSB2aWEgYXV0b21hdGljX21hY19sZWFybmluZyBhbmQgYXV0b21hdGljX21hY19tb3ZlIHdpbGwgYmUgdHJlYXRlZCBhcyBzdGF0aWMgKG5vdCBhZ2luZykuICovCit9IGJjbW9sdF9tYWNfdGFibGVfY29uZmlndXJhdGlvbjsKKworLyoqIFZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIE1hY0FkZHJlc3MuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMgoreworICAgIHVpbnQzMl90IGxlbjsgICAgICAgICAgIC8qKjwgTGlzdCBsZW5ndGguICovCisgICAgYmNtb3NfbWFjX2FkZHJlc3MgKnZhbDsgLyoqPCBMaXN0IGNvbnRlbnRzLiAqLworfSBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMjsKKworLyoqIFZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIE1hY0FkZHJlc3MuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9tYXhfMjA0OAoreworICAgIHVpbnQzMl90IGxlbjsgICAgICAgICAgIC8qKjwgTGlzdCBsZW5ndGguICovCisgICAgYmNtb3NfbWFjX2FkZHJlc3MgKnZhbDsgLyoqPCBMaXN0IGNvbnRlbnRzLiAqLworfSBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9tYXhfMjA0ODsKKworLyoqIE5OSSBMaW5rIFN0YXR1cy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ubmlfbGlua19zdGF0dXMKK3sKKyAgICBiY21vbHRfdHJpdmFsZW50IGxpbmtfc3RhdHVzOyAgICAgICAvKio8IFRoZSBsb2NhbCBhbmQgcmVtb3RlIHBhcnRuZXJzIGFyZSBhYmxlZCBhbmQgcmVhZHkgdG8gdHJhbnNtaXQvcmVjZWl2ZSB0cmFmZmljLiAqLworICAgIGJjbW9sdF90cml2YWxlbnQgc2lnbmFsX2RldGVjdGVkOyAgIC8qKjwgU2VyZGVzIGNvbnRyb2xsZXIgaGFzIGRldGVjdGVkIGVuZXJneSBvbiB0aGUgbGluZS4gIGRlYnVnZ2luZyBwdXJwb3NlLiAqLworICAgIGJjbW9sdF90cml2YWxlbnQgcG1kX2xvY2tlZDsgICAgICAgIC8qKjwgSW5kaWNhdGVzIFBNRCBsb2NrZWQuICBkZWJ1Z2dpbmcgcHVycG9zZS4gIElmIHRoaXMgaXMgdHJ1ZSwgYnV0IHRoZSBsaW5rcyBzdGF0dXMgaXMgbm90LCB0aGF0IG1lYW5zIHRoZSB0cmFuc2NlaXZlciBpcyBub3QgZW5hYmxlZC4gKi8KK30gYmNtb2x0X25uaV9saW5rX3N0YXR1czsKKworLyoqIE9BTSBoZWFydGJlYXQgY29uZmlndXJhdGlvbiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X29hbV9oZWFydGJlYXRfY29uZmlnCit7CisgICAgdWludDE2X3Qgc2VuZF9wZXJpb2Q7ICAgICAgICAgICAgICAgLyoqPCBUaGUgcGVyaW9kIGF0IHdoaWNoIHRvIHNlbmQgT0FNIGluZm8gZnJhbWVzLCBhbmQgZXhwZWN0IGluZm8gcmVzcG9uc2VzIG9uIHRoaXMgbGluayAoaW4gc2Vjb25kcykuICovCisgICAgYmNtb2x0X3U4X2xpc3RfdTE2IHRyYW5zbWl0X2ZyYW1lOyAgLyoqPCBUaGUgT0FNIFBEVSBwYXlsb2FkIGZyb20gdGhlIEZsYWdzIGZpZWxkIChvZmZzZXQgMTUpIHRvIHRoZSBlbmQgb2YgdGhlIFBEVSAoYmVmb3JlIHRoZSBGQ1MpLiAqLworICAgIGJjbW9sdF9ldGhlcm5ldF9mcmFtZV9tYXNrZWQgaWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlOyAgICAvKio8IE9BTSBwYWNrZXRzIG1hdGNoaW5nIHRoaXMgbWFza2VkIHBheWxvYWQgd2lsbCBiZSBkcm9wcGVkIHJhdGhlciB0aGFuIGZvcndhcmRlZCB0byB0aGUgaG9zdC4gKi8KKyAgICB1aW50MTZfdCByZWNlaXZlX3RpbWVvdXQ7ICAgICAgIC8qKjwgVGhlIHRpbWUgKGluIHNlY29uZHMpIHRvIHJlcG9ydCBPQU0gdGltZW91dCBhZnRlciB0aGUgbGFzdCByZWNlaXZlZCBPQU0gZnJhbWUuICovCisgICAgdWludDE2X3QgbWF4aW11bV9yZWNlaXZlX3NpemU7ICAvKio8IE1heGltdW0gc2l6ZSBvZiByZWNlaXZlZCBmcmFtZXMuICBTZXR0aW5nIHRoaXMgdmFsdWUgdG8gemVybyB3aWxsIGNhdXNlIGFsbCBPQU0gZnJhbWVzIHRvIGJlIGRyb3BwZWQuICovCit9IGJjbW9sdF9vYW1faGVhcnRiZWF0X2NvbmZpZzsKKworLyoqIENvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBmb3IgdGhlIE9OVSBwb3dlciBtYW5hZ2VtZW50IGZlYXR1cmUuIFRoZXNlIHNob3VsZCAKKyAqIG1hdGNoIHRoZSBwYXJhbWV0ZXJzIHNlbnQgdG8gdGhlIE9OVSB2aWEgT01DSS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uCit7CisgICAgdWludDMyX3QgaWxvd3Bvd2VyOyAgICAgICAgIC8qKjwgVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgYW55IE9OVSBvbiB0aGlzIE5JIG1heSBzcGVuZCBpbiBhIGxvdyBwb3dlciBzdGF0ZSBpbiB1bml0cyBvZiAxMjV1cy4gKi8KKyAgICB1aW50MzJfdCBpYXdhcmU7ICAgICAgICAgICAgLyoqPCBUaGUgbWluaW11bSBhbW91bnQgb2YgdGltZSBldmVyeSBPTlUgb24gaGlzIE5JIG11c3Qgc3BlbmQgaW4gYW4gYXdhcmUgc3RhdGUgaW4gdW5pdHMgb2YgMTI1dXMuICovCisgICAgdWludDE2X3QgaXRyYW5zaW5pdDsgICAgICAgIC8qKjwgVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgcmVxdWlyZWQgYnkgYW55IE9OVSBvbiB0aGlzIE5JIHRvIHBvd2VyIHVwIGl0cyB0cmFuc21pdHRlciBvbmx5IGZyb20gYSBsb3cgcG93ZXIgc3RhdGUgaW4gdW5pdHMgb2YgMTI1dXMuICovCisgICAgdWludDE2X3QgaXR4aW5pdDsgICAgICAgICAgIC8qKjwgVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgcmVxdWlyZWQgYnkgYW55IE9OVSBvbiB0aGlzIE5JIHRvIHBvd2VyIHVwIGl0cyB0cmFuc2NlaXZlciAodHJhbnNtaXR0ZXIgKyByZWNlaXZlcikgZnJvbSBhIGxvdyBwb3dlciBzdGF0ZSBpbiB1bml0cyBvZiAxMjV1cy4gKi8KKyAgICB1aW50MzJfdCBpcnhvZmY7ICAgICAgICAgICAgLyoqPCBUaGUgbWF4aW11bSBhbW91bnQgb2YgdGltZSBhbnkgT05VIG9uIHRoaXMgTkkgbWF5IHNwZW5kIHdpdGggaXRzIHJlY2VpdmVyIGRpc2FibGVkIGluIHVuaXRzIG9mIDEyNXVzLiAqLworICAgIHVpbnQxNl90IGxvd19wb3dlcl9jbG9iaTsgICAvKio8IFRoZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgbm9uLWNvbnRpZ3VvdXMgbWlzc2luZyBhbGxvY2F0aW9ucyB0byBhbGxvdyBiZWZvcmUgcmFpc2luZyB0aGUgTE9TaS9MT0ZpL0xPQmkgYWxhcm1zIG9uIGFueSBPTlUgb24gdGhpcyBOSS4gKi8KK30gYmNtb2x0X29udV9wb3dlcl9tYW5hZ2VtZW50X2NvbmZpZ3VyYXRpb247CisKKy8qKiBvbnUgdHVuaW5nIGNvbmZpZ3VyYXRpb24uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfb251X3R1bmluZ19jb25maWd1cmF0aW9uCit7CisgICAgdWludDMyX3QgdHNvdXJjZTsgICAvKio8IFRzb3VyY2UgdGltZXIgaW4gbXNlYyAqLworICAgIHVpbnQzMl90IHR0YXJnZXQ7ICAgLyoqPCBUdGFyZ2V0IHRpbWVyIGluIG1zZWMgKi8KKyAgICBiY21vc19ib29sIHJlcXVlc3RfcmVnaXN0cmF0aW9uX3JlcXVpcmVkOyAgIC8qKjwgaXMgcmVxdWVzdCByZWdpc3RyYXRpb24gcGFydCBvZiB0aGUgdHVuaW5nIGluIHByb2Nlc3MgKi8KK30gYmNtb2x0X29udV90dW5pbmdfY29uZmlndXJhdGlvbjsKKworLyoqIElkZW50aWZpZXMgdGhlIFRXRE0gY2hhbm5lbCB0ZXJtaW5hdGlvbiB3aXRoaW4gYSBjZXJ0YWluIGRvbWFpbiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3Bvbl9pZAoreworICAgIHVpbnQzMl90IGFkbWluaXN0cmF0aXZlX2xhYmVsOyAgLyoqPCBNU0IgMjggYml0IG9mIHRoZSBQT04gSUQgKi8KKyAgICB1aW50OF90IGR3bGNoX2lkOyAgICAgICAgICAgICAgIC8qKjwgTFNCIDQgYml0cyBvZiB0aGUgUE9OIElEICovCit9IGJjbW9sdF9wb25faWQ7CisKKy8qKiBPcGVyYXRpb24gQ29udHJvbCAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X29wZXJhdGlvbl9jb250cm9sCit7CisgICAgdWludDhfdCByZTsgICAgICAgICAgICAgICAgIC8qKjwgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIFRyYW5zbWl0IE9wdGljYWwgTGV2ZWwgKFRPTCkgY29udGFpbnMgdGhlIGxhdW5jaCBwb3dlciBvZiB0aGUgT1RMIChSRT0wKSBvciBvZiBhIHJlYWNoIGV4dGVuZGVyIChSRT0xKSAqLworICAgIGJjbW9sdF9vZG5fY2xhc3Mgb2RuX2NsYXNzOyAvKio8IElkZW50aWZpZXMgdGhlIG5vbWluYWwgb3B0aWNhbCBwYXJhbWV0ZXJzIG9mIHRoZSB0cmFuc2NlaXZlciBhY2NvcmRpbmcgdG8gdGhlIE9ETiBPcHRpY2FsIFBhdGggTG9zcyAoT1BMKSAqLworICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIGRzX2ZlY19tb2RlOyAgIC8qKjwgRW5hYmxlL0Rpc2FibGUgdGhlIGRvd25zdHJlYW0gRkVDLiBEZWZhdWx0IGlzIEVuYWJsZS4gQXR0cmlidXRlIGNhbiBiZSBzZXQgb25seSB3aGVuIFBPTiBOSSBzdGF0ZSBpcyBJbmFjdGl2ZS4gKi8KKyAgICBiY21vbHRfdGNfcHJvdG9jb2wgcHJvdG9jb2w7ICAgICAgICAvKio8IFdoZW4gc3lzdGVtIG1vZGUgaXMgTkdQT04yLCB0aGlzIHBhcmFtZXRlciBJbmRpY2F0ZSB0aGUgVEMgbGF5ZXIgcHJvdG9jb2w6IElUVS1UIEcuOTg5LjMgb3IgSVRVLVQgRy45ODcuMyAqLworICAgIGJjbW9sdF9saW5rX3R5cGUgZHNfbGlua190eXBlOyAgICAgIC8qKjwgT3B0aWNhbCBsaW5rIHR5cGUgKFVuc3BlY2lmaWVkLCBBLCBCLCBCb3RoKSAqLworICAgIGJjbW9sdF9wb25faWQgcG9uX2lkOyAgICAgICAgICAgICAgIC8qKjwgSWRlbnRpZmllcyB0aGUgVFdETSBjaGFubmVsIHRlcm1pbmF0aW9uIHdpdGhpbiBhIGNlcnRhaW4gZG9tYWluICovCisgICAgdWludDhfdCBjOyAgLyoqPCBUcmFuc21pdCBvcHRpY2FsIGxldmVsIChUT0wpIHJlZmVyZW5jZSBwb2ludCBpbmRpY2F0b3I6IFMvUi1DRyBvciBTL1ItQ1AgKi8KK30gYmNtb2x0X29wZXJhdGlvbl9jb250cm9sOworCisvKiogUGVyaW9kaWMgU3RhbmRieSBQT04gbW9uaXRvcmluZy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nCit7CisgICAgdWludDMyX3QgaW50ZXJ2YWw7ICAgICAgICAgICAgICAvKio8IGludGVydmFsIGluIG1zLiAqLworICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIGNvbnRyb2w7ICAgLyoqPCBjb250cm9sLiAqLworfSBiY21vbHRfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZzsKKworLyoqIFBvcnQgTGV2ZWwgU2hhcGVyIENvbmZpZ3VyYXRpb246LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3Bvbl9hZ2dyZWdhdGVfc2hhcGVyCit7CisgICAgdWludDMyX3QgYmFuZHdpZHRoX2ticHM7ICAgIC8qKjwgUmF0ZSBpbiBrYnBzLCAwIGlzIGRpc2FibGVkLCBJZiByYXRlIGlzID4xRyB0aGVuIHVzZSAyNTZrYnBzIGluY3JlbWVudHMsIGlmIHJhdGUgaXMgPCAxRyB0aGVuIHVzZSA2NGticHMgaW5jcmVtZW50cy4gICovCisgICAgdWludDMyX3QgbWJzX2tCOyAgICAgICAgICAgIC8qKjwgTWF4aW11bSBCdXJzdCBTaXplIGluIEtCIDogcmFuZ2UgaXMgMktCIHRvIDRNQiBpbiAxS0IgaW5jcmVtZW50cy4gICovCit9IGJjbW9sdF9wb25fYWdncmVnYXRlX3NoYXBlcjsKKworLyoqIFBPTiBBbGxvYyBTTEEuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfcG9uX2FsbG9jX3NsYQoreworICAgIHVpbnQzMl90IGNicl9ydF9idzsgICAgIC8qKjwgQ0JSIFJlYWwgVGltZSBCYW5kd2lkdGggd2hpY2ggcmVxdWlyZSBzaGFwaW5nIG9mIHRoZSBiYW5kd2lkdGggYWxsb2NhdGlvbnMgaW4gYSBmaW5lIGdyYW51bGFyaXR5LiAgKi8KKyAgICB1aW50MzJfdCBjYnJfbnJ0X2J3OyAgICAvKio8IEZpeGVkIEJhbmR3aWR0aCB3aXRoIG5vIGNyaXRpY2FsIHJlcXVpcmVtZW50IG9mIHNoYXBpbmcgKi8KKyAgICB1aW50MzJfdCBndWFyYW50ZWVkX2J3OyAvKio8IER5bmFtaWMgYmFuZHdpZHRoIHdoaWNoIHRoZSBPTFQgaXMgY29tbWl0dGVkIHRvIGFsbG9jYXRlIHVwb24gZGVtYW5kICovCisgICAgdWludDMyX3QgbWF4aW11bV9idzsgICAgLyoqPCBNYXhpbXVtIGFsbG9jYXRlZCBiYW5kd2lkdGggYWxsb3dlZCBmb3IgdGhpcyBhbGxvYyBJRCAqLworICAgIGJjbW9sdF9hZGRpdGlvbmFsX2J3X2VsaWdpYmlsaXR5IGFkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHk7IC8qKjwgQWxsb2MgSUQgYWRkaXRpb25hbCBCVyBlbGlnaWJpbGl0eSAqLworICAgIGJjbW9zX2Jvb2wgY2JyX3J0X2NvbXBlbnNhdGlvbjsgLyoqPCBTZXQgdG8gVHJ1ZSBmb3IgQWxsb2NJRCB3aXRoIENCUiBSVCBCYW5kd2lkdGggdGhhdCByZXF1aXJlcyBjb21wZW5zYXRpb24gZm9yIHNraXBwZWQgYWxsb2NhdGlvbnMgZHVyaW5nIHF1aWV0IHdpbmRvdyAqLworICAgIHVpbnQ4X3QgY2JyX3J0X2FwX2luZGV4OyAgICAgICAgLyoqPCBBbGxvY2F0aW9uIFByb2ZpbGUgaW5kZXggZm9yIENCUiBSVCBCYW5kd2lkdGggKi8KKyAgICB1aW50OF90IGNicl9ucnRfYXBfaW5kZXg7ICAgICAgIC8qKjwgQWxsb2NhdGlvbiBQcm9maWxlIGluZGV4IGZvciBDQlIgbm9uLVJUIEJhbmR3aWR0aCAqLworICAgIGJjbW9sdF9hbGxvY190eXBlIGFsbG9jX3R5cGU7ICAgLyoqPCBUeXBlIG9mIHRoZSBhbGxvYyBJRCAgKi8KKyAgICB1aW50OF90IHdlaWdodDsgICAgICAgICAgICAgICAgIC8qKjwgQWxsb2MgSUQgV2VpZ2h0IHVzZWQgaW4gY2FzZSBvZiBFeHRlbmRlZCBEQkEgbW9kZSAqLworICAgIHVpbnQ4X3QgcHJpb3JpdHk7ICAgICAgICAgICAgICAgLyoqPCBBbGxvYyBJRCBQcmlvcml0eSB1c2VkIGluIGNhc2Ugb2YgRXh0ZW5kZWQgREJBIG1vZGUgKi8KK30gYmNtb2x0X3Bvbl9hbGxvY19zbGE7CisKKy8qKiBQT04gYXZhaWxhYmxlIGJhbmR3aWR0aC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9wb25fYXZhaWxhYmxlX2JhbmR3aWR0aAoreworICAgIHVpbnQzMl90IGNicl9idzsgICAgICAgICAgICAvKio8IFRvdGFsIEJXIGF2YWlsYWJsZSBmb3IgQ0JSIHJlYWwtdGltZSB0cmFmZmljIChieXRlcy9zZWMpLiAqLworICAgIHVpbnQzMl90IHRvdGFsX2J3OyAgICAgICAgICAvKio8IFRvdGFsIEJXIGF2YWlsYWJsZSBmb3IgZ3VhcmFudGVlZCB0cmFmZmljIChieXRlcy9zZWMpICovCisgICAgdWludDMyX3QgbmV4dF9vbnVfdG90YWxfYnc7IC8qKjwgVG90YWwgQlcgYXZhaWxhYmxlIGZvciBndWFyYW50ZWVkIHRyYWZmaWMgYWZ0ZXIgbmV3IE9OVSBpcyBhZGRlZCAoYnl0ZXMvc2VjKS4gKi8KK30gYmNtb2x0X3Bvbl9hdmFpbGFibGVfYmFuZHdpZHRoOworCisvKiogUE9OIERCQS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9wb25fZGJhCit7CisgICAgdWludDhfdCBzcl9yZXBvcnRpbmdfYmxvY2tfc2l6ZTsgICAgLyoqPCBPTlUgc3RhdHVzIHJlcG9ydCBibG9jayBzaXplIGluIGJ5dGVzICovCisgICAgYmNtb2x0X2RiYV9tb2RlIGRiYV9tb2RlOyAgICAgICAgICAgLyoqPCBEQkEgbW9kZSAqLworfSBiY21vbHRfcG9uX2RiYTsKKworLyoqIFBPTiBEaXN0YW5jZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9wb25fZGlzdGFuY2UKK3sKKyAgICB1aW50MzJfdCBtYXhfbG9nX2Rpc3RhbmNlOyAgLyoqPCBNYXggbG9naWNhbCBkaXN0YW5jZSBvZiBhbiBPTlUgb24gdGhlIFBPTiAqLworICAgIHVpbnQzMl90IG1heF9kaWZmX3JlYWNoOyAgICAvKio8IE1heCBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBjbG9zZXN0IGFuZCBmYXJ0aGVzdCBPTlUgKi8KK30gYmNtb2x0X3Bvbl9kaXN0YW5jZTsKKworLyoqIFBPTiBEcmlmdCBDb250cm9sLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sCit7CisgICAgdWludDMyX3QgZHJpZnRfaW50ZXJ2YWw7ICAgICAgICAgICAgLyoqPCBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgZm9yIE9OVSB0cmFuc21pc3Npb24gZHJpZnQgbW9uaXRvcmluZyAoMCA9IGRpc2FibGVkKS4gKi8KKyAgICB1aW50OF90IGRyaWZ0X2xpbWl0OyAgICAgICAgICAgICAgICAvKio8IERPV2kgdGhyZXNob2xkIGluIGJpdHMgKi8KKyAgICB1aW50OF90IHRyYW5zbWlzc2lvbl9jb250cm9sX2xpbWl0OyAvKio8IFRJV2kgdGhyZXNob2xkIGluIGJpdHMgKi8KK30gYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sOworCisvKiogVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgcG9uX29udV9pZC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9wb25fb251X2lkX2xpc3RfdTMyCit7CisgICAgdWludDMyX3QgbGVuOyAgICAgICAgICAgLyoqPCBMaXN0IGxlbmd0aC4gKi8KKyAgICBiY21vbHRfcG9uX29udV9pZCAqdmFsOyAvKio8IExpc3QgY29udGVudHMuICovCit9IGJjbW9sdF9wb25fb251X2lkX2xpc3RfdTMyOworCisvKiogUE9OIFBvd2VyIExldmVsLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3Bvbl9wb3dlcl9sZXZlbAoreworICAgIHVpbnQzMl90IHBsc19tYXhpbXVtX2FsbG9jYXRpb25fc2l6ZTsgICAvKio8IE1heCBhbGxvY2F0aW9uIHNpemUgZm9yIFBMUyB0cmFuc21pc3Npb24gKi8KKyAgICB1aW50OF90IG1vZGU7ICAgLyoqPCBPTlUgZGVmYXVsdCBwb3dlciBsZXZlbCBtb2RlICovCit9IGJjbW9sdF9wb25fcG93ZXJfbGV2ZWw7CisKKy8qKiBHUE9OIHByb3RlY3Rpb24gc3dpdGNoaW5nIGNvbmZpZ3VyYXRpb24uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nCit7CisgICAgdWludDE2X3QgdGltZW91dDsgICAgICAgICAgIC8qKjwgTE9TIHN3aXRjaCBvdmVyIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzICovCisgICAgYmNtb2x0X2dwaW9fcGluIGdwaW9fcGluOyAgIC8qKjwgR1BJTyBwaW4gZm9yIGlucHV0L291dHB1dCBzaWduYWwgKi8KKyAgICBiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29wdGlvbnMgb3B0aW9uczsgICAgLyoqPCBPcHRpb25zIHRvIGNvbnRyb2wgdGhlIHByb3RlY3Rpb24gc3dpdGNoaW5nIHByb2Nlc3MgKi8KK30gYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZzsKKworLyoqIFBPTiBTdGF0dXMuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfcG9uX3N0YXR1cworeworICAgIGJjbW9sdF9wb25fc3RhdGUgc3RhdGU7ICAgICAvKio8IHN0YXRlLiAqLworICAgIGJjbW9sdF9zdGF0dXMgbG9zX3N0YXR1czsgICAvKio8IExPUyBzdGF0dXMuICovCit9IGJjbW9sdF9wb25fc3RhdHVzOworCisvKiogUFJCUyBjaGVja2VyIGNvbmZpZy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnCit7CisgICAgYmNtb2x0X3ByYnNfcG9seW5vbWlhbCBwb2x5bm9tOyAvKio8IFBSQlMgcG9seW5vbSB0eXBlICovCisgICAgYmNtb2x0X3ByYnNfY2hlY2tlcl9tb2RlIG1vZGU7ICAvKio8IFBSQlMgTE9DSyBzdGF0ZSBtYWNoaW5lLiAqLworICAgIGJjbW9zX2Jvb2wgZGF0YV9pbnZlcnQ7ICAgICAgICAgLyoqPCBJbnZlcnQgb3Igbm8gaW52ZXJ0IGZvciByZWNlaXZlZCBQUkJTIGRhdGEgKi8KKyAgICBiY21vbHRfY29udHJvbF9zdGF0ZSBjb250cm9sOyAgIC8qKjwgRW5hYmxlXERpc2FibGUgdGhlIFVTIFBSQlMgY2hlY2tlciAqLworfSBiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZzsKKworLyoqIFBSQlMgR2VuZXJhdG9yIGNvbmZpZy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWcKK3sKKyAgICBiY21vbHRfcHJic19wb2x5bm9taWFsIHBvbHlub207IC8qKjwgUFJCUyBwb2x5bm9tIHR5cGUgKi8KKyAgICBiY21vc19ib29sIGVycm9yX2luc2VydDsgICAgICAgIC8qKjwgMCB0byAxIHRyYW5zaXRpb24gb24gdGhpcyBzaWduYWwgd2lsbCBpbnNlcnQgc2luZ2xlIGJpdCBlcnJvciBpbiB0aGUgTVNCIGJpdCBvZiB0aGUgZGF0YSBidXMuICovCisgICAgYmNtb3NfYm9vbCBpbnZlcnQ7ICAgICAgICAgICAgICAvKio8IEludmVydCBvciBubyBpbnZlcnQgZm9yIHRyYW5zbWl0dGVkIFBSQlMgZGF0YSAqLworICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIGNvbnRyb2w7ICAgLyoqPCBFbmFibGVcRGlzYWJsZSB0aGUgRFMgUFJCUyBnZW5lcmF0b3IgKi8KK30gYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZzsKKworLyoqIFRoYXQgc3RhdGUgb2YgdGhlIFBSQlMgdGVzdCwgbG9jayBzdGF0ZSwgYW5kIGVycm9yIGNvdW50ZXJzLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3ByYnNfc3RhdHVzCit7CisgICAgYmNtb2x0X3ByYnNfbG9ja19zdGF0ZSBsb2NrX3N0YXRlOyAgLyoqPCBUaGUgc3RhdGUgb2YgdGhlIFBSQlMgbG9jayAqLworICAgIHVpbnQzMl90IGVycm9yX2NvdW50czsgICAgICAgICAgICAgIC8qKjwgVGhlIGJpdCBlcnJvcnMgb2JzZXJ2ZWQgZHVyaW5nIHRoZSBQUkJTIHRlc3QuICBUaGlzIGZpZWxkIGlzIGNsZWFyIG9uIHJlYWQuICovCit9IGJjbW9sdF9wcmJzX3N0YXR1czsKKworLyoqIHJhbmdpbmcgY29udHJvbCBjb25maWd1cmF0aW9uLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3JhbmdpbmdfY29udHJvbF9jb25maWd1cmF0aW9uCit7CisgICAgdWludDhfdCB3YWl0X3N0YXRlXzFfd2luZG93X3NpemU7ICAgLyoqPCB3YWl0IHN0YXRlIDEgd2luZG93IHNpemUuICovCisgICAgdWludDhfdCB3YWl0X3N0YXRlXzJfd2luZG93X3NpemU7ICAgLyoqPCB3YWl0IHN0YXRlIDIgd2luZG93IHNpemUuICovCisgICAgYmNtb3NfYm9vbCB3YWl0X2FmdGVyX3Jlc3luY180OyAgICAgLyoqPCB3YWl0IGFmdGVyIHJlc3luYyA0LiAqLworfSBiY21vbHRfcmFuZ2luZ19jb250cm9sX2NvbmZpZ3VyYXRpb247CisKKy8qKiByYW5naW5nIHJlc3luYyBjb25kaXRpb25zLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMKK3sKKyAgICBiY21vc19ib29sIGFmdGVyX2luaXQ7ICAgICAgICAgICAgICAvKio8IGFmdGVyIGluaXQuICovCisgICAgYmNtb3NfYm9vbCBhZnRlcl9ub19lZDsgICAgICAgICAgICAgLyoqPCBhZnRlciBubyBlZC4gKi8KKyAgICBiY21vc19ib29sIGFmdGVyX2VkOyAgICAgICAgICAgICAgICAvKio8IGFmdGVyIGVkLiAqLworICAgIGJjbW9zX2Jvb2wgYWZ0ZXJfbm9fZGVsOyAgICAgICAgICAgIC8qKjwgYWZ0ZXIgbm8gZGVsLiAqLworICAgIGJjbW9zX2Jvb2wgYWZ0ZXJfcmFuZ2luZ19hY2Nlc3M7ICAgIC8qKjwgYWZ0ZXIgcmFuZ2luZyBhY2Nlc3MuICovCisgICAgdWludDE2X3QgbWVkX3ZhbDsgICAgICAgICAgICAgICAgICAgLyoqPCBtZWQgdmFsLiAqLworfSBiY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9uczsKKworLyoqIHJhbmdpbmcgcnNzaSBjb250cm9sLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3JhbmdpbmdfcnNzaV9jb250cm9sCit7CisgICAgYmNtb3NfYm9vbCBhZnRlcl9ub19lZDsgICAgIC8qKjwgYWZ0ZXIgbm8gZWQuICovCisgICAgYmNtb3NfYm9vbCBhZnRlcl9lZDsgICAgICAgIC8qKjwgYWZ0ZXIgZWQuICovCisgICAgYmNtb3NfYm9vbCBhZnRlcl9yZXNldF8zOyAgIC8qKjwgYWZ0ZXIgcmVzZXQgMy4gKi8KK30gYmNtb2x0X3JhbmdpbmdfcnNzaV9jb250cm9sOworCisvKiogcmVxdWVzdCByZWdpc3RyYXRpb24gc3RhdHVzLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cworeworICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIHJlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXRlOyAgICAvKio8IHJlcXVlc3QgcmVnaXN0cmF0aW9uIHN0YXRlLiAqLworICAgIGJjbW9zX2Jvb2wgc21hX2ZsYWc7ICAgIC8qKjwgaXMgcmVxdWVzdCByZWdpc3RyYXRpb24gaXMgcGFydCBvZiBzbWEgcHJvY2VzcyAqLworfSBiY21vbHRfcmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzOworCisvKiogUm9ndWUgRGV0ZWN0aW9uIFNwZWNpYWwgTWFwLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcAoreworICAgIHVpbnQzMl90IHBsb19zaXplOyAgICAgICAgICAgICAgLyoqPCBQTE8gc2l6ZS4gKi8KKyAgICBiY21vbHRfcG9uX2FsbG9jX2lkIGFsbG9jX2lkOyAgIC8qKjwgQWxsb2MgSUQuICovCisgICAgYmNtb2x0X3Bvbl9vbnVfaWQgb251X2lkOyAgICAgICAvKio8IE9OVSBJRC4gKi8KKyAgICB1aW50OF90IGFjY2Vzc19zaXplOyAgICAgICAgICAgIC8qKjwgQWNjZXNzIHNpemUuICovCit9IGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXA7CisKKy8qKiBWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiByb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXAuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwX2xpc3RfdTMyX21heF84Cit7CisgICAgdWludDMyX3QgbGVuOyAgIC8qKjwgTGlzdCBsZW5ndGguICovCisgICAgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcCAqdmFsOyAgICAvKio8IExpc3QgY29udGVudHMuICovCit9IGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXBfbGlzdF91MzJfbWF4Xzg7CisKKy8qKiBUeXBlIGFuZCBhdHRyaWJ1dGVzIG9mIHRoZSByb2d1ZSBkZXRlY3Rpb24gYWxnb3JpdGhtLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG0KK3sKKyAgICBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV90eXBlIGFsZ29yaXRobV90eXBlOyAgIC8qKjwgVHlwZSBvZiB0aGUgcm9ndWUgZGV0ZWN0aW9uIGFsZ29yaXRobS4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93IG1lYXN1cmVtZW50X3R5cGU7IC8qKjwgU2lsZW50IFdpbmRvdyBvciBDdXQgb2ZmIFdpbmRvdyAqLworICAgICAgICAgICAgdWludDMyX3QgaW50ZXJ2YWw7ICAgICAgICAgICAgICAgICAgLyoqPCBQZXJpb2RpYyBwcm9jZXNzIHRpbWVyIGludGVydmFsIGluIG1pbGxpc2Vjb25kcyAqLworICAgICAgICAgICAgYmNtb3NfYm9vbCBzZWNvbmRfcmFuZ2luZ193aW5kb3c7ICAgLyoqPCBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHNlY29uZCByYW5naW5nIHdpbmRvdyBzaG91bGQgYmUgaW52b2tlZCBvciBub3QuICovCisgICAgICAgICAgICBiY21vbHRfYWxsb2NfdHlwZV90b19zY2FuIGFsbG9jX3R5cGVfdG9fc2NhbjsgICAgICAgICAgICAgICAvKio8IEFsbG9jIHR5cGUgdG8gc2NhbiBkdXJpbmcgcm9ndWUgZGV0ZWN0aW9uLiAgVW51c2VkLCBwcmV2aW91c2x5IHVzZWQsIG9yIGFsbCBBbGxvYy1JRHMuICovCisgICAgICAgIH0gZWFybHlfcm9ndWVfZGV0ZWN0aW9uOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwX2xpc3RfdTMyX21heF84IGFjY2Vzc2VzOyAvKio8IEFjY2Vzc2VzLiAqLworICAgICAgICB9IHNwZWNpYWxfbWFwOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBhZGRpdGlvbmFsX2d1YXJkX3RpbWU7IC8qKjwgQWRkaXRpb25hbCBndWFyZCB0aW1lIChpbiBieXRlcykgZm9yIGFsbCBPTlVzIG9uIHRoaXMgUE9OLiAqLworICAgICAgICB9IGV4dGVuZGVkX2d1YXJkX3RpbWU7CisgICAgfSB1OworfSBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobTsKKworLyoqIENvbmZpZ3VyZXMgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIHJvZ3VlIE9OVSBkZXRlY3Rpb24gcGVyaW9kaWMgcHJvY2Vzcy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MKK3sKKyAgICBiY21vbHRfY29udHJvbF9zdGF0ZSBjb250cm9sOyAgIC8qKjwgRW5hYmxlL0Rpc2FibGUgdGhlIHJvZ3VlIE9OVSBkZXRlY3Rpb24gcHJvY2Vzcy4gKi8KKyAgICBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobSBkZXRlY3Rpb25fYWxnb3JpdGhtOyAgIC8qKjwgVHlwZSBhbmQgYXR0cmlidXRlcyBvZiB0aGUgcm9ndWUgZGV0ZWN0aW9uIGFsZ29yaXRobS4gKi8KK30gYmNtb2x0X3JvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzczsKKworLyoqIHNlcmRlcyBjb25maWd1cmF0aW9uLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uCit7CisgICAgYmNtb2x0X3NlcmRlc19yYW5naW5nX21vZGUgcmFuZ2luZ19tb2RlOyAgICAvKio8IFNlbGVjdCByYW5naW5nIG1vZGUgZm9yIEdQT04vWEdQT04gKi8KKyAgICBiY21vc19ib29sIG11bHRpX2VkX21vZGU7ICAgICAgICAgICAgICAgICAgIC8qKjwgQWxsb3cgZm9yIG11bHRpcGxlIEVEIGZvciBFRCBtb2RlIGZvciBHUE9OL1hHUE9OICovCisgICAgdWludDE2X3QgYnVyc3RfZW5hYmxlX3N0YXJ0X29mZnNldDsgICAgICAgICAvKio8IFN0YXJ0IG9mZnNldCBmb3Igc3RhdCBjYXB0dXJlIG9uIFNFUkRFUyBjaGFubmVsICovCisgICAgdWludDE2X3QgYnVyc3RfZW5hYmxlX2VuZF9vZmZzZXQ7ICAgICAgICAgICAvKio8IEVuZCBvZmZzZXQgZm9yIHN0YXQgY2FwdHVyZSBvbiBTRVJERVMgY2hhbm5lbCAgKi8KKyAgICBiY21vc19ib29sIGVkX2ludmVydGlvbjsgICAgICAgICAgICAgICAgICAgIC8qKjwgZWQgaW52ZXJ0aW9uLiAqLworfSBiY21vbHRfc2VyZGVzX2NvbmZpZ3VyYXRpb247CisKKy8qKiBzZXJpYWwgbnVtYmVyLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3NlcmlhbF9udW1iZXIKK3sKKyAgICB1aW50OF90IHZlbmRvcl9pZFs0XTsgICAgICAgLyoqPCB2ZW5kb3IgaWQuICovCisgICAgdWludDhfdCB2ZW5kb3Jfc3BlY2lmaWNbNF07IC8qKjwgdmVuZG9yIHNwZWNpZmljLiAqLworfSBiY21vbHRfc2VyaWFsX251bWJlcjsKKworLyoqIFNvbGljaXRlZCBTY2hlZHVsZXIuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfc29saWNpdGVkX3NjaGVkdWxlcgoreworICAgIGJjbW9sdF9iYW5kd2lkdGhfS2JwcyBiYW5kd2lkdGhfS2JwczsgICAvKio8IFRoZSBtYXhpbXVtIGxheWVyIDEgdGhyb3VnaHB1dCBwcm92aWRlZCBieSB0aGlzIHNjaGVkdWxlciAoaW4gS2JwcykuICovCisgICAgYmNtb2x0X3RpbWVfcXVhbnRhIG1heF9idXJzdF9zaXplX3RxOyAgIC8qKjwgVGhlIG1heGltdW0gYnVyc3Qgc2l6ZSAoaW4gVFEpLiAqLworICAgIHVpbnQ4X3QgcHJpb3JpdHk7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRoZSBwcmlvcml0eSBhdCB3aGljaCB0aGlzIHNjaGVkdWxlciBydW5zLiAgVGhpcyBmaWVsZCBpcyByZWFkLW9ubHkgYW5kIGZpeGVkIGF0IDAgZm9yIHRoZSBNSU4gU2hhcGVyL1NjaGVkdWxlciAgZWxlbWVudC4gKi8KKyAgICBiY21vbHRfdGltZV9xdWFudGEgd2VpZ2h0X3RxOyAgICAgICAgICAgLyoqPCBUaGUgd2VpZ2h0IG9mIHRoaXMgc2NoZWR1bGVyIChpbiBUUSByb3VuZGVkIHVwIHRvIG5lYXJlc3QgMTI4KS4gTXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gR3JhbnQgVGhyZXNob2xkLiAqLworfSBiY21vbHRfc29saWNpdGVkX3NjaGVkdWxlcjsKKworLyoqIFN0YXRpc3RpYyBhbGFybSB0cmlnZ2VyIGNvbmZpZ3VyYXRpb24uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZworeworICAgIGJjbW9sdF9zdGF0X2NvbmRpdGlvbl90eXBlIHR5cGU7ICAgIC8qKjwgVHlwZSBvZiBjb25kaXRpb24gdG8gdHJpZ2dlciB0aGUgYWxhcm0uICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCByaXNpbmc7ICAgICAgICAgICAgLyoqPCBUaGUgYWxhcm0gaXMgcmFpc2VkIGlmIHRoZSBzdGF0cyBkZWx0YSB2YWx1ZSBwZXIgc2Vjb25kIGJlY29tZXMgZ3JlYXRlciB0aGFuIHRoaXMgdGhyZXNob2xkIGxldmVsLiAqLworICAgICAgICAgICAgdWludDY0X3QgZmFsbGluZzsgICAgICAgICAgIC8qKjwgVGhlIGFsYXJtIGlzIGNsZWFyZWQgaWYgdGhlIHN0YXRzIGRlbHRhIHZhbHVlIHBlciBzZWNvbmQgYmVjb21lcyBsZXNzIHRoYW4gdGhpcyB0aHJlc2hvbGQgbGV2ZWwuICovCisgICAgICAgIH0gcmF0ZV90aHJlc2hvbGQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHVwcGVyOyAgICAgICAgICAgICAvKio8IFRoZSBhbGFybSBpcyByYWlzZWQgaWYgdGhlIHN0YXRzIGRlbHRhIHZhbHVlIHBlciBzZWNvbmQgYmVjb21lcyBncmVhdGVyIHRoYW4gdGhpcyB1cHBlciBsZXZlbC4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IGxvd2VyOyAgICAgICAgICAgICAvKio8IFRoZSBhbGFybSBpcyByYWlzZWQgaWYgdGhlIHN0YXRzIGRlbHRhIHZhbHVlIHBlciBzZWNvbmQgYmVjb21lcyBsZXNzIHRoYW4gdGhpcyBsb3dlciBsZXZlbC4gKi8KKyAgICAgICAgfSByYXRlX3JhbmdlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCBsaW1pdDsgICAgICAgICAgICAgLyoqPCBUaGUgYWxhcm0gaXMgcmFpc2VkIGlmIHRoZSBzdGF0cyBzYW1wbGUgdmFsdWUgYmVjb21lcyBncmVhdGVyIHRoYW4gdGhpcyBsZXZlbC4gIFRoZSBhbGFybSBpcyBjbGVhcmVkIHdoZW4gdGhlIGhvc3QgY2xlYXJzIHRoZSBzdGF0cy4gKi8KKyAgICAgICAgfSB2YWx1ZV90aHJlc2hvbGQ7CisgICAgfSB1OworfSBiY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZzsKKworLyoqIFN0YXRpc3RpY3MgYWxhcm0gc29ha2luZyBjb25maWd1cmF0aW9uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfc3RhdF9hbGFybV9zb2FrX2NvbmZpZworeworICAgIHVpbnQzMl90IGFjdGl2ZV9zb2FrX3RpbWU7ICAvKio8IElmIHRoZSBhbGFybSBjb25kaXRpb24gaXMgcmFpc2VkIGFuZCBzdGF5cyBpbiB0aGUgcmFpc2VkIHN0YXRlIGZvciBhdCBsZWFzdCB0aGlzIGFtb3VudCBvZiB0aW1lICh1bml0PXNlY29uZHMpLCB0aGUgYWxhcm0gaW5kaWNhdGlvbiBpcyBzZW50IHRvIHRoZSBob3N0LiAqLworICAgIHVpbnQzMl90IGNsZWFyX3NvYWtfdGltZTsgICAvKio8IEFmdGVyIHRoZSBhbGFybSBpcyByYWlzZWQsIGlmIGl0IGlzIGNsZWFyZWQgYW5kIHN0YXlzIGluIHRoZSBjbGVhcmVkIHN0YXRlIGZvciBhdCBsZWFzdCB0aGlzIGFtb3VudCBvZiB0aW1lICh1bml0PXNlY29uZHMpLCB0aGUgYWxhcm0gaW5kaWNhdGlvbiBpcyBzZW50IHRvIHRoZSBob3N0LiAqLworfSBiY21vbHRfc3RhdF9hbGFybV9zb2FrX2NvbmZpZzsKKworLyoqIFN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnCit7CisgICAgYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWcgdHJpZ2dlcjsgICAvKio8IFN0YXRpc3RpY3MgYWxhcm0gdHJpZ2dlciBjb25maWd1cmF0aW9uLiAqLworICAgIGJjbW9sdF9zdGF0X2FsYXJtX3NvYWtfY29uZmlnIHNvYWs7ICAgICAgICAgLyoqPCBTdGF0aXN0aWNzIGFsYXJtIHNvYWtpbmcgY29uZmlndXJhdGlvbiAqLworfSBiY21vbHRfc3RhdF9hbGFybV9jb25maWc7CisKKy8qKiBBU0NJSSBzdHJpbmcgd2l0aCBtYXggbGVuZ3RoIDEwMC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9zdHJfMTAwCit7CisgICAgY2hhciBzdHJbMTAwXTsgIC8qKjwgU3RyaW5nLiAqLworfSBiY21vbHRfc3RyXzEwMDsKKworLyoqIEFTQ0lJIHN0cmluZyB3aXRoIG1heCBsZW5ndGggMTAwMC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9zdHJfMTAwMAoreworICAgIGNoYXIgc3RyWzEwMDBdOyAvKio8IFN0cmluZy4gKi8KK30gYmNtb2x0X3N0cl8xMDAwOworCisvKiogQVNDSUkgc3RyaW5nIHdpdGggbWF4IGxlbmd0aCAyMDAwLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3N0cl8yMDAwCit7CisgICAgY2hhciBzdHJbMjAwMF07IC8qKjwgU3RyaW5nLiAqLworfSBiY21vbHRfc3RyXzIwMDA7CisKKy8qKiBBU0NJSSBzdHJpbmcgd2l0aCBtYXggbGVuZ3RoIDI1Ni4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9zdHJfMjU2Cit7CisgICAgY2hhciBzdHJbMjU2XTsgIC8qKjwgU3RyaW5nLiAqLworfSBiY21vbHRfc3RyXzI1NjsKKworLyoqIEFTQ0lJIHN0cmluZyB3aXRoIG1heCBsZW5ndGggNjQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfc3RyXzY0Cit7CisgICAgY2hhciBzdHJbNjRdOyAgIC8qKjwgU3RyaW5nLiAqLworfSBiY21vbHRfc3RyXzY0OworCisvKiogU1cgRXJyb3IuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfc3dfZXJyb3IKK3sKKyAgICB1aW50NjRfdCBmaXJzdF9lcnJvcl90aW1lX3VzOyAgIC8qKjwgVGltZXN0YW1wIChpbiB1cykgd2hlbiBoaXMgZXJyb3IgZmlyc3Qgb2NjdXJyZWQgKi8KKyAgICB1aW50NjRfdCBsYXN0X2Vycm9yX3RpbWVfdXM7ICAgIC8qKjwgVGltZXN0YW1wIChpbiB1cykgd2hlbiBoaXMgZXJyb3IgbGFzdCBvY2N1cnJlZCAqLworICAgIHVpbnQzMl90IGxpbmVfbnVtYmVyOyAgICAgICAgICAgLyoqPCBMaW5lIE51bWJlci4gKi8KKyAgICB1aW50MzJfdCBlcnJvcl9jb3VudGVyOyAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiB0aW1lcyB0aGlzIGVycm9yIGhhcyBvY2N1cnJlZCAqLworICAgIHVpbnQzMl90IGluc3RhbmNlOyAgICAgICAgICAgICAgLyoqPCBJbnN0YW5jZS4gKi8KKyAgICBjaGFyIGZpbGVuYW1lWzY0XTsgICAgICAgICAgICAgIC8qKjwgRmlsZW5hbWUuICovCisgICAgY2hhciB0YXNrX25hbWVbNjRdOyAgICAgICAgICAgICAvKio8IFRhc2sgTmFtZS4gKi8KK30gYmNtb2x0X3N3X2Vycm9yOworCisvKiogU3lzdGVtIHByb2ZpbGUgCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9zeXN0ZW1fcHJvZmlsZQoreworICAgIHVpbnQzMl90IG5nXzJfc3lzX2lkOyAgICAgICAvKio8IDIwLWJpdCBpZGVudGlmaWVyIG9mIHRoZSBOR1BPTjIgc3lzdGVtICovCisgICAgdWludDhfdCB2ZXJzaW9uOyAgICAgICAgICAgIC8qKjwgU3lzdGVtIHByb2ZpbGUgdmVyc2lvbi4gKi8KKyAgICB1aW50OF90IGNoYW5uZWxfc3BhY2luZzsgICAgLyoqPCBBbiBpbnRlZ2VyIGluZGljYXRpbmcgdGhlIGNoYW5uZWwgc3BhY2luZyBpbiB1bml0cyBvZiAxR0h6ICovCisgICAgYmNtb2x0X3VzX29wZXJhdGluZ193YXZlbGVuZ3RoX2JhbmRzIHVzX29wZXJhdGluZ193YXZlbGVuZ3RoX2JhbmRzOyAvKio8IFVwc3RyZWFtIG9wZXJhdGluZyB3YXZlbGVuZ3RoIGJhbmRzICovCisgICAgdWludDhfdCB1c19tc2U7IC8qKjwgVXBzdHJlYW0gTWF4aW11bSBTcGVjdHJhbCBFeGN1cnNpb24gKE1TRSkgcmVwcmVzZW50ZWQgYXMgYW4gdW5zaWduZWQgaW50ZWdlciBpbmRpY2F0aW5nIHRoZSB2YWx1ZSBpbiB1bml0cyBvZiAxR0h6ICovCisgICAgYmNtb2x0X2NhbGlicmF0aW9uX3JlY29yZCBsb29zZV9jYWxpYnJhdGlvbl9ib3VuZDsgIC8qKjwgU3BlY3RyYWwgZXhjdXJzaW9uIGJvdW5kIGJlbG93IHdoaWNoIGEgVFdETSBPTlUgY2FuIGJlIGNvbnNpZGVyZWQgYXMgbG9vc2VseSBjYWxpYnJhdGVkICovCisgICAgdWludDE2X3QgZnNyOyAgICAgICAgICAgICAgIC8qKjwgSWYgYSBjeWNsaWMgV00gaXMgdXNlZCBpbiB0aGUgdXBzdHJlYW0sIEZyZWUgU3BlY3RyYWwgUmFuZ2UgaW5kaWNhdGVzIHRoZSB2YWx1ZSBpbiB1bml0cyBvZiAwLjEgR0h6ICovCisgICAgdWludDhfdCB0d2RtX2NoYW5uZWxfY291bnQ7IC8qKjwgVGhlIG51bWJlciBvZiBDaGFubmVsX1Byb2ZpbGUgUExPQU0gbWVzc2FnZXMgd2l0aCBkaXN0aW5jdCBDaGFubmVsIFByb2ZpbGUgaW5kaWNlcyB0aGF0IGFuIE9OVSBjYW4gZXhwZWN0IHRvIHJlY2VpdmUgd2hpbGUgbGlzdGVuaW5nIHRvIHRoaXMgZG93bnN0cmVhbSB3YXZlbGVuZ3RoIGNoYW5uZWwgKi8KK30gYmNtb2x0X3N5c3RlbV9wcm9maWxlOworCisvKiogVFJYIERlbGltaXRlci4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF90cnhfZGVsaW1pdGVyCit7CisgICAgdWludDhfdCBwYXR0ZXJuWzNdOyAgICAgLyoqPCBwYXR0ZXJuLiAqLworICAgIHVpbnQ4X3Qgc2l6ZTsgICAgICAgICAgIC8qKjwgU2l6ZSBpbiBieXRlcy4gKi8KKyAgICB1aW50OF90IHdpbmRvd19zaXplOyAgICAvKio8IFdpbmRvdyBzaXplLiAqLworfSBiY21vbHRfdHJ4X2RlbGltaXRlcjsKKworLyoqIFRSWCBFbmVyZ3kgZGV0ZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0Cit7CisgICAgYmNtb2x0X2VuZXJneV9kZXRlY3Rfc291cmNlIHJhbmdpbmdfZWRfc291cmNlOyAgICAgIC8qKjwgUmFuZ2luZyBFRCBzb3VyY2UuICovCisgICAgYmNtb2x0X2VuZXJneV9kZXRlY3Rfc291cmNlIGRlbGltaXRlcl9lZF9zb3VyY2U7ICAgIC8qKjwgRGVsaW1pdGVyIEVEIHNvdXJjZS4gKi8KKyAgICB1aW50OF90IG1pbmltdW1fdGhyZXNob2xkOyAgLyoqPCBNaW5pbXVtIHRocmVzaG9sZC4gKi8KKyAgICB1aW50OF90IG1heGltdW1fdGhyZXNob2xkOyAgLyoqPCBNYXhpbXVtIHRocmVzaG9sZC4gKi8KKyAgICB1aW50OF90IGVkX3BhdHRlcm47ICAgICAgICAgLyoqPCBFRCBwYXR0ZXJuLiAqLworICAgIHVpbnQ4X3QgZWRfcGF0dGVybl9zaXplOyAgICAvKio8IEVEIHBhdHRlcm4gc2l6ZS4gKi8KKyAgICB1aW50OF90IHdpbmRvd19zaXplOyAgICAgICAgLyoqPCBXaW5kb3cgc2l6ZS4gKi8KKyAgICBiY21vc19ib29sIGludmVyc2lvbjsgICAgICAgLyoqPCBJbnZlcnNpb24uICovCisgICAgdWludDhfdCBub19lZF90aHJlc2hvbGQ7ICAgIC8qKjwgbm8gZWQgdGhyZXNob2xkLiAqLworfSBiY21vbHRfdHJ4X2VuZXJneV9kZXRlY3Q7CisKKy8qKiBUUlggUHJlYW1ibGUuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfdHJ4X3ByZWFtYmxlCit7CisgICAgdWludDhfdCB0eXBlXzFfc2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBUeXBlIDEgc2l6ZS4gKi8KKyAgICB1aW50OF90IHR5cGVfMl9zaXplOyAgICAgICAgICAgICAgICAvKio8IFR5cGUgMiBzaXplLiAqLworICAgIHVpbnQ4X3QgdHlwZV8zX3ByZV9yYW5naW5nX3NpemU7ICAgIC8qKjwgVHlwZSAzIHByZSByYW5naW5nIHNpemUuICovCisgICAgdWludDhfdCB0eXBlXzNfcG9zdF9yYW5naW5nX3NpemU7ICAgLyoqPCBUeXBlIDMgcG9zdCByYW5naW5nIHNpemUuICovCisgICAgdWludDhfdCB0eXBlXzNfcGF0dGVybjsgICAgICAgICAgICAgLyoqPCBUeXBlIDMgcGF0dGVybi4gKi8KK30gYmNtb2x0X3RyeF9wcmVhbWJsZTsKKworLyoqIFRSWCBSWCBjb25maWd1cmF0aW9uLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3RyeF9yeF9jb25maWd1cmF0aW9uCit7CisgICAgdWludDhfdCB3YWl0X3dpbmRvd19zaXplOyAgICAgICAgICAgLyoqPCBXYWl0IFdpbmRvdyBzaXplLiAqLworICAgIHVpbnQ4X3QgcmFuZ2luZ19hY2Nlc3Nfd2luZG93X3NpemU7IC8qKjwgUmFuZ2luZyBhY2Nlc3Mgd2luZG93IHNpemUuICovCit9IGJjbW9sdF90cnhfcnhfY29uZmlndXJhdGlvbjsKKworLyoqIFZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIFUzMi4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF91MzJfbGlzdF91MzJfbWF4XzUwMF9oZXgKK3sKKyAgICB1aW50MzJfdCBsZW47ICAgLyoqPCBMaXN0IGxlbmd0aC4gKi8KKyAgICB1aW50MzJfdCAqdmFsOyAgLyoqPCBMaXN0IGNvbnRlbnRzLiAqLworfSBiY21vbHRfdTMyX2xpc3RfdTMyX21heF81MDBfaGV4OworCisvKiogVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgVTguIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfdThfbGlzdF91MTZfaGV4Cit7CisgICAgdWludDE2X3QgbGVuOyAgIC8qKjwgTGlzdCBsZW5ndGguICovCisgICAgdWludDhfdCAqdmFsOyAgIC8qKjwgTGlzdCBjb250ZW50cy4gKi8KK30gYmNtb2x0X3U4X2xpc3RfdTE2X2hleDsKKworLyoqIFZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIFU4LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3U4X2xpc3RfdTMyCit7CisgICAgdWludDMyX3QgbGVuOyAgIC8qKjwgTGlzdCBsZW5ndGguICovCisgICAgdWludDhfdCAqdmFsOyAgIC8qKjwgTGlzdCBjb250ZW50cy4gKi8KK30gYmNtb2x0X3U4X2xpc3RfdTMyOworCisvKiogVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgVTguIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDgKK3sKKyAgICB1aW50MzJfdCBsZW47ICAgLyoqPCBMaXN0IGxlbmd0aC4gKi8KKyAgICB1aW50OF90ICp2YWw7ICAgLyoqPCBMaXN0IGNvbnRlbnRzLiAqLworfSBiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDg7CisKKy8qKiBVQkQgSW5mby4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF91YmRfaW5mbworeworICAgIHVpbnQxNl90IGFjdHVhbF9wb2xsaW5nX2ludGVydmFsOyAgIC8qKjwgVW5pdHM6IDY1LjUzNnVzICovCisgICAgYmNtb2x0X3RpbWVfcXVhbnRhIGFjdHVhbF9ncmFudF90aHJlc2hvbGRfdHE7ICAgICAgICAgICAgICAgLyoqPCBBY3R1YWwgR3JhbnQgVGhyZXNob2xkIChUUSkuICovCisgICAgYmNtb2x0X2FjdHVhbF9zY2hlZHVsZXJzaGFwZXIgYWN0dWFsX21pbl9zY2hlZHVsZXJzaGFwZXI7ICAgLyoqPCBBY3R1YWwgTWluIFNjaGVkdWxlci9TaGFwZXIuICovCisgICAgYmNtb2x0X2FjdHVhbF9zY2hlZHVsZXJzaGFwZXIgYWN0dWFsX21heF9zY2hlZHVsZXJzaGFwZXI7ICAgLyoqPCBBY3R1YWwgTWF4IFNjaGVkdWxlci9TaGFwZXIuICovCit9IGJjbW9sdF91YmRfaW5mbzsKKworLyoqIFRoZSB1cHN0cmVhbSBiYW5kd2lkdGggZGlzdHJpYnV0aW9uIGZvciB0aGlzIExMSUQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfdXBzdHJlYW1fYmFuZHdpZHRoX2Rpc3RyaWJ1dGlvbgoreworICAgIGJjbW9sdF9wb2xsaW5nX2ludGVydmFsIHBvbGxpbmdfaW50ZXJ2YWxfdXM7ICAgIC8qKjwgVGhlIGFtb3VudCBvZiB0aW1lIGJldHdlZW4gd2hlbiB0aGlzIExMSUQgbGFzdCByZXBvcnRlZCB1cHN0cmVhbSBkYXRhIGFuZCB3aGVuIGl0IHdpbGwgbmV4dCBiZSBwb2xsZWQgKGFwcHJveGltYXRlOiByb3VuZGVkIGRvd24gdG8gdGhlIG5lYXJlc3QgNjUuNTM2IHVzKS4gKi8KKyAgICBiY21vbHRfdGltZV9xdWFudGEgZ3JhbnRfdGhyZXNob2xkX3RxOyAgICAgICAgICAvKio8IFVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBtYXhpbXVtIGdyYW50IHNpemUgdGhhdCB3aWxsIGJlIGlzc3VlZCB0byB0aGlzIExMSUQgKGluIFRROyByb3VuZGVkIHVwIHRvIHRoZSBuZWFyZXN0IDEyOFRROyAxVFEgPSAxNm5zID0gMkJ5dGVzQDFHIG9yIDIwQnl0ZXNAMTBHKS4gKi8KKyAgICBiY21vbHRfc29saWNpdGVkX3NjaGVkdWxlciBtaW5fc2NoZWR1bGVyc2hhcGVyOyAvKio8IE1pbiBTY2hlZHVsZXIvU2hhcGVyLiAqLworICAgIGJjbW9sdF9zb2xpY2l0ZWRfc2NoZWR1bGVyIG1heF9zY2hlZHVsZXJzaGFwZXI7IC8qKjwgTWF4IFNjaGVkdWxlci9TaGFwZXIuICovCisgICAgYmNtb2x0X3RpbWVfcXVhbnRhIHRkbV9ncmFudF9zaXplX3RxOyAgICAgICAgICAgLyoqPCBTaXplIG9mIFRETSBncmFudHMgKGluIFRRKS4gKi8KKyAgICB1aW50MzJfdCB0ZG1fZ3JhbnRfaW50ZXJ2YWxfdXM7ICAgICAgICAgICAgICAgICAvKio8IEludGVydmFsIGJldHdlZW4gVERNIGdyYW50cyAoaW4gdXMpLiAqLworfSBiY21vbHRfdXBzdHJlYW1fYmFuZHdpZHRoX2Rpc3RyaWJ1dGlvbjsKKworLyoqIFZMQU4gdGFnLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3ZsYW5fdGFnCit7CisgICAgYmNtb2x0X3ZsYW5faWQgdmxhbl9pZDsgLyoqPCBWTEFOIElELiAqLworICAgIHVpbnQ4X3QgcGJpdDsgICAgICAgICAgIC8qKjwgUGJpdC4gKi8KK30gYmNtb2x0X3ZsYW5fdGFnOworCisvKiogWEdQT04gQWxsb2MgV2l0aCBTdGF0ZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlCit7CisgICAgYmNtb2x0X3hncG9uX2FsbG9jX2lkIGFsbG9jX2lkOyAvKio8IEFsbG9jIElELiAqLworICAgIGJjbW9sdF9hbGxvY19zdGF0ZSBzdGF0ZTsgICAgICAgLyoqPCBTdGF0ZS4gKi8KK30gYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGU7CisKKy8qKiBWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiB4Z3Bvbl9hbGxvY193aXRoX3N0YXRlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyCit7CisgICAgdWludDE2X3QgbGVuOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMaXN0IGxlbmd0aC4gKi8KKyAgICBiY21vbHRfeGdwb25fYWxsb2Nfd2l0aF9zdGF0ZSAqdmFsOyAvKio8IExpc3QgY29udGVudHMuICovCit9IGJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMjsKKworLyoqIHhncG9uIGVkIHN0YXRlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX2VkX3N0YXRlCit7CisgICAgYmNtb3NfYm9vbCByZXNldF9vbl9lZF9mYWlsOyAgICAvKio8IHJlc2V0IG9uIEVEIGZhaWwuICovCisgICAgYmNtb3NfYm9vbCByZXNldF9vbl9lZF9zdWNjZXNzOyAvKio8IHJlc2V0IG9uIEVEIHN1Y2Nlc3MuICovCit9IGJjbW9sdF94Z3Bvbl9lZF9zdGF0ZTsKKworLyoqIFZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIHhncG9uX2dlbV9pZC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTYKK3sKKyAgICB1aW50OF90IGxlbjsgICAgICAgICAgICAgICAgLyoqPCBMaXN0IGxlbmd0aC4gKi8KKyAgICBiY21vbHRfeGdwb25fZ2VtX2lkICp2YWw7ICAgLyoqPCBMaXN0IGNvbnRlbnRzLiAqLworfSBiY21vbHRfeGdwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2OworCisvKiogWEdQT04gR0VNIFBvcnQgV2l0aCBTdGF0ZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlCit7CisgICAgYmNtb2x0X3hncG9uX2dlbV9pZCBnZW1faWQ7ICAgICAgICAgLyoqPCBHRU0gSUQuICovCisgICAgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRlIHN0YXRlOyAgLyoqPCBTdGF0ZS4gKi8KK30gYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGU7CisKKy8qKiBWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiB4Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOAoreworICAgIHVpbnQxNl90IGxlbjsgICAvKio8IExpc3QgbGVuZ3RoLiAqLworICAgIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlICp2YWw7ICAvKio8IExpc3QgY29udGVudHMuICovCit9IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjg7CisKKy8qKiBWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiB4Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1NgoreworICAgIHVpbnQxNl90IGxlbjsgICAvKio8IExpc3QgbGVuZ3RoLiAqLworICAgIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlICp2YWw7ICAvKio8IExpc3QgY29udGVudHMuICovCit9IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTY7CisKKy8qKiBYR1BPTiBLZXkgRXhjaGFuZ2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fa2V5X2V4Y2hhbmdlCit7CisgICAgdWludDMyX3QgaW50ZXJ2YWw7ICAgICAgICAgICAgICAvKio8IEtleSBFeGNoYW5nZSBwcm9jZXNzIGludGVydmFsIGluIG1pbGxpc2Vjb25kcyAqLworICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIGNvbnRyb2w7ICAgLyoqPCBFbmFibGVcZGlzYWJsZSBwZXJpb2RpYyBwcm9jZXNzIG9mIEtleSBFeGNoYW5nZSBmb3IgYWN0aXZlIE9OVXMgKi8KKyAgICBiY21vbHRfY29udHJvbF9zdGF0ZSBlbmNyeXB0ZWRfcG9ydHNfb25seTsgIC8qKjwgUGVyZm9ybSBrZXkgZXhjaGFuZ2Ugb25seSB0byBPTlVzIHdpdGggR0VNIHBvcnRzIHRoYXQgaGF2ZSBkb3duc3RyZWFtIGVuY3J5cHRpb24gZW5hYmxlZCAqLworfSBiY21vbHRfeGdwb25fa2V5X2V4Y2hhbmdlOworCisvKiogWEdQT04gTXVsdGljYXN0IGtleS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9tdWx0aWNhc3Rfa2V5Cit7CisgICAgYmNtb2x0X2Flc19rZXkga2V5OyAgICAgLyoqPCBBRVMgZW5jcnlwdGlvbiBrZXkgZm9yIG11bHRpY3NhdCBYR0VNIHBvcnQgSURzICovCisgICAgYmNtb3NfYm9vbCBrZXlfY29udHJvbDsgLyoqPCBFbmFibGVcRGlzYWJsZSBlbmNyeXB0aW9uIG9uIG11bHRpY2FzdCBYR0VNIHBvcnRzICovCit9IGJjbW9sdF94Z3Bvbl9tdWx0aWNhc3Rfa2V5OworCisvKiogWEdQT04gTkkgRGVidWcgcGFyYW1ldGVycyAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX25pX2RlYnVnCit7CisgICAgYmNtb3NfYm9vbCBpbmNyZWFzZV9hdmFpbGFibGVfY2JyX2J3OyAgIC8qKjwgVXNlIGluY3JlYXNlIGF2YWlsYWJsZSBDQlIgYmFuZHdpZHRoIGZvciBiZXR0ZXIgQlcgdXRpbGl6YXRpb24gKi8KKyAgICB1aW50MTZfdCBpbnRlcl9idXJzdF9nYXBfaW5fYnl0ZXM7ICAgICAgLyoqPCBHYXAgYmV0d2VlbiB0d28gY29uc2VjdXRpdmUgYnVyc3RzIGZvciB0aGUgc2FtZSBPTlUgKi8KKyAgICB1aW50MTZfdCBudW1iZXJfb2ZfZ2VtX3BvcnRzX3Blcl9vbnU7ICAgLyoqPCBOdW1iZXIgb2YgZ2VtIHBvcnRzIHBlciBvbnUgKi8KK30gYmNtb2x0X3hncG9uX25pX2RlYnVnOworCisvKiogWEdQT04gT05VIEFjdGl2YXRpb24uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X2FjdGl2YXRpb24KK3sKKyAgICBiY21vbHRfY29udHJvbF9zdGF0ZSBrZXlfZXhjaGFuZ2U7ICAvKio8IFBlcmZvcm0gc2luZ2xlIGtleSBleGNoYW5nZSBkdXJpbmcgYWN0aXZhdGlvbi4gKi8KKyAgICBiY21vbHRfY29udHJvbF9zdGF0ZSBmYWlsX2R1ZV90b19yZWdpc19hdXRvX2ZhaWw7ICAgLyoqPCBEZWFjdGl2YXRlIE9OVSBkdWUgdG8gcmVnaXN0cmF0aW9uIGF1dGhlbnRpY2F0aW9uIGZhaWx1cmUgKi8KK30gYmNtb2x0X3hncG9uX29udV9hY3RpdmF0aW9uOworCisvKiogWEdQT04gT05VIEFFUyBLRVkuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X2Flc19rZXkKK3sKKyAgICBiY21vbHRfYWVzX2tleSBlbmNyeXB0aW9uX2tleTsgIC8qKjwgZW5jcnlwdGlvbiBrZXkuICovCisgICAgdWludDhfdCBrZXlfaW5kZXg7ICAgICAgICAgICAgICAvKio8IGtleSBpbmRleC4gKi8KK30gYmNtb2x0X3hncG9uX29udV9hZXNfa2V5OworCisvKiogWEdQT04gT05VIGFsYXJtIHN0YXR1cy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGUKK3sKKyAgICBiY21vbHRfc3RhdHVzIGxvc2k7ICAgICAgICAgICAgIC8qKjwgTG9zcyBvZiBzaWduYWwuICovCisgICAgYmNtb2x0X3N0YXR1cyBsb2JpOyAgICAgICAgICAgICAvKio8IExvc3Mgb2YgYnVyc3QuICovCisgICAgYmNtb2x0X3N0YXR1cyBsb3BjaTsgICAgICAgICAgICAvKio8IExvc3Mgb2YgUExPQU0gY2hhbm5lbC4gKi8KKyAgICBiY21vbHRfc3RhdHVzIGxvcGNpX21pY19lcnJvcjsgIC8qKjwgTWljIGVycm9yIG9uIHBsb2FtIGNoYW5uZWwuICovCisgICAgYmNtb2x0X3N0YXR1cyBsb29jaTsgICAgICAgICAgICAvKio8IExvc3Mgb2YgT01DSSBjaGFubmVsLiAqLworICAgIGJjbW9sdF9zdGF0dXMgdGl3aTsgICAgICAgICAgICAgLyoqPCBUcmFuc21pc3Npb24gaW50ZXJmZXJlbmNlIEFsYXJtLiAqLworICAgIGJjbW9sdF9zdGF0dXMgZG93aTsgICAgICAgICAgICAgLyoqPCBEcmlmdCBvZiBXaW5kb3cuICovCisgICAgYmNtb2x0X3N0YXR1cyBzdWZpOyAgICAgICAgICAgICAvKio8IFN0YXJ0IFVQIEZhaWx1cmUuICovCisgICAgYmNtb2x0X3N0YXR1cyBzZmk7ICAgICAgICAgICAgICAvKio8IFNpZ25hbCBGYWlsLiAqLworICAgIGJjbW9sdF9zdGF0dXMgc2RpOyAgICAgICAgICAgICAgLyoqPCBTaWduYWwgRGVncmFkZWQuICovCisgICAgYmNtb2x0X3N0YXR1cyBkZmk7ICAgICAgICAgICAgICAvKio8IERlYWN0aXZhdGlvbiBGYWlsdXJlLiAqLworICAgIGJjbW9sdF9zdGF0dXMgZGdpOyAgICAgICAgICAgICAgLyoqPCBEeWluZyBnYXNwLiAqLworICAgIGJjbW9sdF9zdGF0dXMgcHFzaTsgICAgICAgICAgICAgLyoqPCBQbG9hbSBxdWV1ZSBzdGF0dXMuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGU7CisKKy8qKiBYR1BPTiBPTlUgYWxhcm1zLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9hbGFybXMKK3sKKyAgICBiY21vbHRfc3RhdHVzIGxvc2k7ICAgICAgICAgICAgIC8qKjwgTE9TaS4gKi8KKyAgICBiY21vbHRfc3RhdHVzIGxvYmk7ICAgICAgICAgICAgIC8qKjwgTE9CaS4gKi8KKyAgICBiY21vbHRfc3RhdHVzIGxvcGNpX21pc3M7ICAgICAgIC8qKjwgTE9QQ2kgbWlzcy4gKi8KKyAgICBiY21vbHRfc3RhdHVzIGxvcGNpX21pY19lcnJvcjsgIC8qKjwgTE9QQ2kgbWljIGVycm9yLiAqLworfSBiY21vbHRfeGdwb25fb251X2FsYXJtczsKKworLyoqIFhHUE9OIE9OVSBhbGFybXMgdGhyZXNob2xkcy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMKK3sKKyAgICB1aW50OF90IGxvc2k7ICAgLyoqPCBUaHJlc2hvbGQgZm9yIGFzc2VydGluZyBMT1NpIGFsYXJtLiAqLworICAgIHVpbnQ4X3QgbG9iaTsgICAvKio8IFRocmVzaG9sZCBmb3IgYXNzZXJ0aW5nIExPQmkgYWxhcm0uICovCisgICAgdWludDhfdCBsb29jaTsgIC8qKjwgVGhyZXNob2xkIGZvciBhc3NlcnRpbmcgTE9PQ2kgYWxhcm0uICovCisgICAgdWludDhfdCBsb3BjaTsgIC8qKjwgVGhyZXNob2xkIGZvciBhc3NlcnRpbmcgTE9QQ2kgYWxhcm0uICAqLworfSBiY21vbHRfeGdwb25fb251X2FsYXJtc190aHJlc2hvbGRzOworCisvKiogWEdQT04gT05VIEVRRC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfZXFkCit7CisgICAgYmNtb2x0X3hncG9uX29udV9pZCBvbnVfaWQ7IC8qKjwgT05VIElELiAqLworICAgIHVpbnQzMl90IGVxZDsgICAgICAgICAgICAgICAvKio8IEVRRC4gKi8KK30gYmNtb2x0X3hncG9uX29udV9lcWQ7CisKKy8qKiBWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiB4Z3Bvbl9vbnVfZXFkLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9lcWRfbGlzdF91MzIKK3sKKyAgICB1aW50MzJfdCBsZW47ICAgICAgICAgICAgICAgLyoqPCBMaXN0IGxlbmd0aC4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2VxZCAqdmFsOyAgLyoqPCBMaXN0IGNvbnRlbnRzLiAqLworfSBiY21vbHRfeGdwb25fb251X2VxZF9saXN0X3UzMjsKKworLyoqIFhHUE9OIE9OVSByZWdpc3RyYXRpb24ga2V5cy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXMKK3sKKyAgICBiY21vbHRfYWVzX2tleSBwbG9hbV9pazsgICAgLyoqPCBwbG9hbSBpay4gKi8KKyAgICBiY21vbHRfYWVzX2tleSBvbWNpX2lrOyAgICAgLyoqPCBvbWNpIGlrLiAqLworICAgIGJjbW9sdF9hZXNfa2V5IG9tY2lfazE7ICAgICAvKio8IG9tY2kgazEuICovCisgICAgYmNtb2x0X2Flc19rZXkgb21jaV9rMjsgICAgIC8qKjwgb21jaSBrMi4gKi8KKyAgICBiY21vbHRfYWVzX2tleSBrZWs7ICAgICAgICAgLyoqPCBrZWsuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXM7CisKKy8qKiBYR1BPTiBPTlUgV2l0aCBTdGF0ZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZQoreworICAgIGJjbW9sdF94Z3Bvbl9vbnVfaWQgb251X2lkOyAvKio8IE9OVSBJRC4gKi8KKyAgICBiY21vbHRfb251X3N0YXRlIHN0YXRlOyAgICAgLyoqPCBTdGF0ZS4gKi8KK30gYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlOworCisvKiogVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgeGdwb25fb251X3dpdGhfc3RhdGUuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzUxMAoreworICAgIHVpbnQxNl90IGxlbjsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTGlzdCBsZW5ndGguICovCisgICAgYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlICp2YWw7ICAgLyoqPCBMaXN0IGNvbnRlbnRzLiAqLworfSBiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzUxMDsKKworLyoqIFhHUE9OIFBMT0FNIGhhbmRsaW5nLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nCit7CisgICAgdWludDMyX3QgYWNrX3RpbWVvdXQ7ICAgICAgICAgICAgICAgLyoqPCBUaW1lb3V0IGZvciByZWNlaXZpbmcgQUNLIHBsb2FtICovCisgICAgdWludDhfdCByZXRyYW5zX3JhbmdpbmdfdGltZTsgICAgICAgLyoqPCBOdW1iZXIgb2YgUmFuZ2luZyBUaW1lIHBsb2FtIHJldHJhbnNtaXNzaW9ucyBpbiBjYXNlIG9mIEFDSyB0aW1lb3V0ICovCisgICAgdWludDhfdCByZXRyYW5zX2Fzc2lnbl9hbGxvY19pZDsgICAgLyoqPCBOdW1iZXIgb2YgQXNzaWduIEFsbG9jIElEIHBsb2FtIHJldHJhbnNtaXNzaW9ucyBpbiBjYXNlIG9mIEFDSyB0aW1lb3V0ICovCisgICAgdWludDhfdCByZXRyYW5zX2tleV9jb250cm9sOyAgICAgICAgLyoqPCBOdW1iZXIgb2YgS2V5IENvbnRyb2wgcGxvYW0gcmV0cmFuc21pc3Npb25zIGluIGNhc2Ugb2YgQUNLIHRpbWVvdXQgKi8KKyAgICB1aW50OF90IHJldHJhbnNfcmVxdWVzdF9yZWdpc3RyYXRpb247ICAgLyoqPCBOdW1iZXIgb2YgUmVxdWVzdCBSZWdpc3RyYXRpb24gcGxvYW0gcmV0cmFuc21pc3Npb25zIGluIGNhc2Ugb2YgQUNLIHRpbWVvdXQgKi8KK30gYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nOworCisvKiogWEdQT04gcHJvdGVjdGlvbiBzd2l0Y2hpbmcgY29uZmlndXJhdGlvbi4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZworeworICAgIHVpbnQxNl90IHRpbWVvdXQ7ICAgICAgICAgICAvKio8IExPUyBzd2l0Y2ggb3ZlciB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyAqLworICAgIGJjbW9sdF9ncGlvX3BpbiBncGlvX3BpbjsgICAvKio8IEdQSU8gcGluIGZvciBpbnB1dC9vdXRwdXQgc2lnbmFsICovCisgICAgYmNtb3NfYm9vbCBmYXN0X3Jhbmdpbmc7ICAgIC8qKjwgZmFzdCByYW5naW5nICAqLworfSBiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmc7CisKKy8qKiB4Z3BvbiBwcm90ZWN0aW9uIHN3aXRjaGluZyBkZWJ1Zy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1ZworeworICAgIHVpbnQxNl90IGRhdGFfbWFwX2RlbGF5X21zOyAgICAgICAgICAgICAvKio8IGRlbGF5IHRvIHdhaXQgYWZ0ZXIgc2VuZGluZyByYW5naW5nIHRpbWUgZGVsdGEgYmVmb3JlIHJ1bm5pbmcgdGhlIGRhdGEgbWFwICAgKi8KKyAgICBiY21vc19ib29sIHJlcmFuZ2Vfc2VuZF9yYW5naW5nX3RpbWU7ICAgLyoqPCBTaG91bGQgdGhlIFNNIHNlbmQgdGhlIGN1cnJlbnQgcmFuZ2luZyB0aW1lIGJlZm9yZSBkb2luZyB0aGUgcmUtcmFuZ2luZyAgKi8KKyAgICB1aW50MTZfdCByZXJhbmdlX3NlbmRfcmFuZ2luZ190aW1lX2RlbGF5OyAgIC8qKjwgdGhlIGRlbGF5IGJldHdlZW4gc2VuZGluZyB0aGUgcmFuZ2luZyB0aW1lIGFuZCBzdGFydGluZyB0aGUgcmVyYW5nZSAgKi8KK30gYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnOworCisvKiogWEdQT04gUlNTSSBub3JtYWwgY29uZmlndXJhdGlvbi4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWcKK3sKKyAgICBiY21vbHRfcG9sYXJpdHkgcG9sYXJpdHk7ICAgLyoqPCBSU1NJIHNpZ25hbCBwb2xhcml0eSAqLworICAgIHVpbnQ4X3QgbG9jYXRpb247ICAgICAgICAgICAvKio8IFJTU0kgc2lnbmFsIGxvY2F0aW9uIGluIHdvcmRzICovCisgICAgYmNtb2x0X3NpZ24gbG9jYXRpb25fc2lnbjsgIC8qKjwgUlNTSSBzaWduYWwgbG9jYXRpb24gc2lnbiAqLworICAgIHVpbnQxNl90IHB1bHNlX3dpZHRoOyAgICAgICAvKio8IFJTU0kgcHVsc2Ugd2lkdGggaW4gd29yZHMgKi8KKyAgICB1aW50MTZfdCBtaW5pbXVtX2J1cnN0OyAgICAgLyoqPCBEYXRhIG1pbmltdW0gYnVyc3Qgc2l6ZSBpbiB3b3JkcyAqLworfSBiY21vbHRfeGdwb25fcnNzaV9ub3JtYWxfY29uZmlnOworCisvKiogeGdwb24gcnNzaSByYW5naW5nIGNvbmZpZy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9yc3NpX3JhbmdpbmdfY29uZmlnCit7CisgICAgYmNtb3NfYm9vbCBzdGFydF9vbl9lZDsgICAgICAgICAvKio8IHN0YXJ0IG9uIEVELiAqLworICAgIHVpbnQ4X3QgZnJhbWVfZGVsYXk7ICAgICAgICAgICAgLyoqPCBmcmFtZSBkZWxheSBmcm9tIEVEICovCisgICAgdWludDE2X3Qgd29yZF9kZWxheTsgICAgICAgICAgICAvKio8IHdvcmQgZGVsYXkgZnJvbSBFRCAqLworICAgIHVpbnQ4X3QgZnJhbWVfZGVsYXlfYWZ0ZXJfZWQ7ICAgLyoqPCBmcmFtZSBkZWxheSBmcm9tIHN0YXJ0ICBvZiByYW5naW5nIHdpbmRvdyAqLworICAgIHVpbnQxNl90IHdvcmRfZGVsYXlfYWZ0ZXJfZWQ7ICAgLyoqPCB3b3JkIGRlbGF5IGZyb20gc3RhcnQgIG9mIHJhbmdpbmcgd2luZG93ICovCit9IGJjbW9sdF94Z3Bvbl9yc3NpX3JhbmdpbmdfY29uZmlnOworCisvKiogeGdwb24gcnggcmFuZ2luZyBTTSBwYXR0ZXJucy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4KK3sKKyAgICB1aW50MzJfdCB0cnhfcmVzZXRfcGF0dGVybl9maXJzdDsgICAvKio8IHRyeCByZXNldCBwYXR0ZXJuIGZpcnN0LiAqLworICAgIHVpbnQzMl90IHRyeF9yZXNldF9wYXR0ZXJuX21pZGRsZTsgIC8qKjwgdHJ4IHJlc2V0IHBhdHRlcm4gbWlkZGxlLiAqLworICAgIHVpbnQzMl90IHRyeF9yZXNldF9wYXR0ZXJuX2xhc3Q7ICAgIC8qKjwgdHJ4IHJlc2V0IHBhdHRlcm4gbGFzdC4gKi8KKyAgICB1aW50OF90IHRyeF9yZXNldF9taWRkbGVfcmVwZWF0czsgICAvKio8IHRyeCByZXNldCBtaWRkbGUgcmVwZWF0cy4gKi8KKyAgICB1aW50OF90IHRyeF9yZXNldF9sb2NhdGlvbjsgICAgICAgICAvKio8IHRyeCByZXNldCBsb2NhdGlvbi4gKi8KKyAgICB1aW50MzJfdCBiY2RyX3Jlc2V0X3BhdHRlcm5fZmlyc3Q7ICAvKio8IGJjZHIgcmVzZXQgcGF0dGVybiBmaXJzdC4gKi8KKyAgICB1aW50MzJfdCBiY2RyX3Jlc2V0X3BhdHRlcm5fbWlkZGxlOyAvKio8IGJjZHIgcmVzZXQgcGF0dGVybiBtaWRkbGUuICovCisgICAgdWludDMyX3QgYmNkcl9yZXNldF9wYXR0ZXJuX2xhc3Q7ICAgLyoqPCBiY2RyIHJlc2V0IHBhdHRlcm4gbGFzdC4gKi8KKyAgICB1aW50OF90IGJjZHJfcmVzZXRfbWlkZGxlX3JlcGVhdHM7ICAvKio8IGJjZHIgcmVzZXQgbWlkZGxlIHJlcGVhdHMuICovCisgICAgdWludDhfdCBiY2RyX3Jlc2V0X2xvY2F0aW9uOyAgICAgICAgLyoqPCBiY2RyIHJlc2V0IGxvY2F0aW9uLiAqLworICAgIGJjbW9zX2Jvb2wgYmNkcl9yZXNldF9wb2xhcml0eTsgICAgIC8qKjwgYmNkciByZXNldCBwb2xhcml0eS4gKi8KK30gYmNtb2x0X3hncG9uX3J4X3Jhbmdpbmdfc21fcGF0dGVybjsKKworLyoqIHhncG9uIHNlcmRlcyBjb25maWd1cmF0aW9uLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX3NlcmRlc19jb25maWd1cmF0aW9uCit7CisgICAgYmNtb3NfYm9vbCBtdWx0aV9lZF9tb2RlOyAgIC8qKjwgbXVsdGkgZWQgbW9kZS4gKi8KKyAgICBiY21vbHRfeGdwb25fc2VyZGVzX3JhbmdpbmdfbW9kZSByYW5naW5nX21vZGU7ICAvKio8IHJhbmdpbmcgbW9kZS4gKi8KK30gYmNtb2x0X3hncG9uX3NlcmRlc19jb25maWd1cmF0aW9uOworCisvKiogWEdQT04gU04gQWNxdWlzaXRpb24uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fc25fYWNxdWlzaXRpb24KK3sKKyAgICB1aW50MzJfdCBpbnRlcnZhbDsgICAgICAgICAgICAgIC8qKjwgU04gcHJvY2VzcyBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgKi8KKyAgICBiY21vbHRfY29udHJvbF9zdGF0ZSBjb250cm9sOyAgIC8qKjwgU04gcHJvY2VzcyBjb250cm9sICovCisgICAgYmNtb2x0X29udV9wb3N0X2Rpc2NvdmVyeV9tb2RlIG9udV9wb3N0X2Rpc2NvdmVyeV9tb2RlOyAvKio8IEF1dG9tYXRpYyBvcGVyYXRpb24gZm9sbG93aW5nIE9OVSBkaXNjb3ZlcnkgKi8KKyAgICBiY21vbHRfYnVyc3RfcHJvZmlsZV9pbmRleCBidXJzdF9wcm9maWxlOyAgICAgICAgICAgICAgIC8qKjwgQnVyc3QgcHJvZmlsZSBpbmRleCB0byB1c2UgZHVyaW5nIFNOIGFjcXVpc2l0aW9uIHdpbmRvdyAqLworfSBiY21vbHRfeGdwb25fc25fYWNxdWlzaXRpb247CisKKy8qKiB4Z3Bvbl90cnhfZGVidWcuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fdHJ4X2RlYnVnCit7CisgICAgYmNtb2x0X2NvbnRyb2xfc3RhdGUgcnhfcmV2ZXJzZWRfcG9sYXJpdHk7ICAvKio8IHRyYW5zY2VpdmVyIHJldmVyc2VkIHBvbGFyaXR5ICovCisgICAgYmNtb2x0X2NvbnRyb2xfc3RhdGUgbmVnX291dF9iaXQ7ICAgICAgICAgICAvKio8IHR1cm4gYWxsIDEgdG8gMCBhbmQgYWxsIDAgdG8gMSBhdCB0aGUgb3V0cHV0LiBkZWZhdWx0IGlzIG5vdCB0byBtYWtlIG5lZ2F0aXZlIGJpdHMgKi8KK30gYmNtb2x0X3hncG9uX3RyeF9kZWJ1ZzsKKworLyoqIEB9ICovCisjZW5kaWYgLyogQkNNT0xUX01PREVMX0RBVEFfSF8gKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9tb2RlbC9iY21vbHRfbW9kZWxfaWRzLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvbW9kZWwvYmNtb2x0X21vZGVsX2lkcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMTk2N2MKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvbW9kZWwvYmNtb2x0X21vZGVsX2lkcy5oCkBAIC0wLDAgKzEsOTYyNCBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpwcm9wcmlldGFyeTpzdGFuZGFyZAorIAorICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorIAorVGhpcyBwcm9ncmFtIGlzIHRoZSBwcm9wcmlldGFyeSBzb2Z0d2FyZSBvZiBCcm9hZGNvbSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzCitsaWNlbnNvcnMsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBkdXBsaWNhdGVkLCBtb2RpZmllZCBvciBkaXN0cmlidXRlZCBwdXJzdWFudAordG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIGEgc2VwYXJhdGUsIHdyaXR0ZW4gbGljZW5zZSBhZ3JlZW1lbnQgZXhlY3V0ZWQKK2JldHdlZW4geW91IGFuZCBCcm9hZGNvbSAoYW4gIkF1dGhvcml6ZWQgTGljZW5zZSIpLiAgRXhjZXB0IGFzIHNldCBmb3J0aCBpbgorYW4gQXV0aG9yaXplZCBMaWNlbnNlLCBCcm9hZGNvbSBncmFudHMgbm8gbGljZW5zZSAoZXhwcmVzcyBvciBpbXBsaWVkKSwgcmlnaHQKK3RvIHVzZSwgb3Igd2FpdmVyIG9mIGFueSBraW5kIHdpdGggcmVzcGVjdCB0byB0aGUgU29mdHdhcmUsIGFuZCBCcm9hZGNvbQorZXhwcmVzc2x5IHJlc2VydmVzIGFsbCByaWdodHMgaW4gYW5kIHRvIHRoZSBTb2Z0d2FyZSBhbmQgYWxsIGludGVsbGVjdHVhbAorcHJvcGVydHkgcmlnaHRzIHRoZXJlaW4uICBJRiBZT1UgSEFWRSBOTyBBVVRIT1JJWkVEIExJQ0VOU0UsIFRIRU4gWU9VIEhBVkUKK05PIFJJR0hUIFRPIFVTRSBUSElTIFNPRlRXQVJFIElOIEFOWSBXQVksIEFORCBTSE9VTEQgSU1NRURJQVRFTFkgTk9USUZZCitCUk9BRENPTSBBTkQgRElTQ09OVElOVUUgQUxMIFVTRSBPRiBUSEUgU09GVFdBUkUuCisgCitFeGNlcHQgYXMgZXhwcmVzc2x5IHNldCBmb3J0aCBpbiB0aGUgQXV0aG9yaXplZCBMaWNlbnNlLAorIAorMS4gVGhpcyBwcm9ncmFtLCBpbmNsdWRpbmcgaXRzIHN0cnVjdHVyZSwgc2VxdWVuY2UgYW5kIG9yZ2FuaXphdGlvbiwKKyAgICBjb25zdGl0dXRlcyB0aGUgdmFsdWFibGUgdHJhZGUgc2VjcmV0cyBvZiBCcm9hZGNvbSwgYW5kIHlvdSBzaGFsbCB1c2UKKyAgICBhbGwgcmVhc29uYWJsZSBlZmZvcnRzIHRvIHByb3RlY3QgdGhlIGNvbmZpZGVudGlhbGl0eSB0aGVyZW9mLCBhbmQgdG8KKyAgICB1c2UgdGhpcyBpbmZvcm1hdGlvbiBvbmx5IGluIGNvbm5lY3Rpb24gd2l0aCB5b3VyIHVzZSBvZiBCcm9hZGNvbQorICAgIGludGVncmF0ZWQgY2lyY3VpdCBwcm9kdWN0cy4KKyAKKzIuIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIgorICAgIEFORCBXSVRIIEFMTCBGQVVMVFMgQU5EIEJST0FEQ09NIE1BS0VTIE5PIFBST01JU0VTLCBSRVBSRVNFTlRBVElPTlMgT1IKKyAgICBXQVJSQU5USUVTLCBFSVRIRVIgRVhQUkVTUywgSU1QTElFRCwgU1RBVFVUT1JZLCBPUiBPVEhFUldJU0UsIFdJVEgKKyAgICBSRVNQRUNUIFRPIFRIRSBTT0ZUV0FSRS4gIEJST0FEQ09NIFNQRUNJRklDQUxMWSBESVNDTEFJTVMgQU5ZIEFORAorICAgIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgVElUTEUsIE1FUkNIQU5UQUJJTElUWSwgTk9OSU5GUklOR0VNRU5ULAorICAgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBMQUNLIE9GIFZJUlVTRVMsIEFDQ1VSQUNZIE9SCisgICAgQ09NUExFVEVORVNTLCBRVUlFVCBFTkpPWU1FTlQsIFFVSUVUIFBPU1NFU1NJT04gT1IgQ09SUkVTUE9OREVOQ0UKKyAgICBUTyBERVNDUklQVElPTi4gWU9VIEFTU1VNRSBUSEUgRU5USVJFIFJJU0sgQVJJU0lORyBPVVQgT0YgVVNFIE9SCisgICAgUEVSRk9STUFOQ0UgT0YgVEhFIFNPRlRXQVJFLgorIAorMy4gVE8gVEhFIE1BWElNVU0gRVhURU5UIFBFUk1JVFRFRCBCWSBMQVcsIElOIE5PIEVWRU5UIFNIQUxMIEJST0FEQ09NIE9SCisgICAgSVRTIExJQ0VOU09SUyBCRSBMSUFCTEUgRk9SIChpKSBDT05TRVFVRU5USUFMLCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICAgIElORElSRUNULCBPUiBFWEVNUExBUlkgREFNQUdFUyBXSEFUU09FVkVSIEFSSVNJTkcgT1VUIE9GIE9SIElOIEFOWQorICAgIFdBWSBSRUxBVElORyBUTyBZT1VSIFVTRSBPRiBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBTT0ZUV0FSRSBFVkVOCisgICAgSUYgQlJPQURDT00gSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTOworICAgIE9SIChpaSkgQU5ZIEFNT1VOVCBJTiBFWENFU1MgT0YgVEhFIEFNT1VOVCBBQ1RVQUxMWSBQQUlEIEZPUiBUSEUKKyAgICBTT0ZUV0FSRSBJVFNFTEYgT1IgVS5TLiAkMSwgV0hJQ0hFVkVSIElTIEdSRUFURVIuIFRIRVNFIExJTUlUQVRJT05TCisgICAgU0hBTEwgQVBQTFkgTk9UV0lUSFNUQU5ESU5HIEFOWSBGQUlMVVJFIE9GIEVTU0VOVElBTCBQVVJQT1NFIE9GIEFOWQorICAgIExJTUlURUQgUkVNRURZLgorOj4KKyovCisjaWZuZGVmIEJDTU9MVF9NT0RFTF9JRFNfSF8KKyNkZWZpbmUgQkNNT0xUX01PREVMX0lEU19IXworCisvKiogXGFkZHRvZ3JvdXAgYXBpX2RhdGFfdHlwZXMgCisgKiBAeyAKKyAqLworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgYWVfbmlfY2ZnIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9hZV9uaV9jZmdfaWQKK3sKKyAgICBCQ01PTFRfQUVfTklfQ0ZHX0lEX19CRUdJTiAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0FFX05JX0NGR19JRF9NQUNfQUREUkVTUyAgICAgPSAwLCAgICAgICAgICAgICAgICAvKio8IE1BQyBBZGRyZXNzLiAqLworICAgIEJDTU9MVF9BRV9OSV9DRkdfSURfQUVfTklfRU4gICAgICAgID0gMSwgICAgICAgICAgICAgICAgLyoqPCBBRSBOSSBlbmFibGUgc3RhdGUuICovCisgICAgQkNNT0xUX0FFX05JX0NGR19JRF9NVFVfMTBHICAgICAgICAgPSAyLCAgICAgICAgICAgICAgICAvKio8IE1UVS4gKi8KKyAgICBCQ01PTFRfQUVfTklfQ0ZHX0lEX1BSQlNfR0VORVJBVE9SICA9IDMsICAgICAgICAgICAgICAgIC8qKjwgUFJCUyBHZW5lcmF0b3IuICovCisgICAgQkNNT0xUX0FFX05JX0NGR19JRF9QUkJTX0NIRUNLRVIgICAgPSA0LCAgICAgICAgICAgICAgICAvKio8IFBSQlMgQ2hlY2tlci4gKi8KKyAgICBCQ01PTFRfQUVfTklfQ0ZHX0lEX1BSQlNfU1RBVFVTICAgICA9IDUsICAgICAgICAgICAgICAgIC8qKjwgUFJCUyBzdGF0dXMuICovCisgICAgQkNNT0xUX0FFX05JX0NGR19JRF9fTlVNX09GICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9hZV9uaV9jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBhZV9uaV9rZXkgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2FlX25pX2tleV9pZAoreworICAgIEJDTU9MVF9BRV9OSV9LRVlfSURfX0JFR0lOICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfQUVfTklfS0VZX0lEX0FFX05JICAgICAgICAgICA9IDAsICAgICAgICAgICAgICAgIC8qKjwgQUUgTkkgbnVtYmVyLiAqLworICAgIEJDTU9MVF9BRV9OSV9LRVlfSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfYWVfbmlfa2V5X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9pZAoreworICAgIEJDTU9MVF9BRV9OSV9TRVRfQUVfTklfRU5fU1RBVEVfSURfX0JFR0lOICAgPSAwLAorICAgIEJDTU9MVF9BRV9OSV9TRVRfQUVfTklfRU5fU1RBVEVfSURfTkVXX1NUQVRFPSAwLCAgICAgICAgLyoqPCBOZXcgQUUgTkkgZW5hYmxlIHN0YXRlLiAqLworICAgIEJDTU9MVF9BRV9OSV9TRVRfQUVfTklfRU5fU1RBVEVfSURfX05VTV9PRiAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgYWVfcGF0aF9kc19hdXRvX2NmZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19pZAoreworICAgIEJDTU9MVF9BRV9QQVRIX0RTX0FVVE9fQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfQUVfUEFUSF9EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ9IDAsICAgIC8qKjwgU3RhdCBBbGFybSBDbGVhcmVkLiAqLworICAgIEJDTU9MVF9BRV9QQVRIX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEID0gMSwgICAgLyoqPCBTdGF0IEFsYXJtIFJhaXNlZC4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9EU19BVVRPX0NGR19JRF9fTlVNX09GICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBhZV9wYXRoX2RzX2tleSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfYWVfcGF0aF9kc19rZXlfaWQKK3sKKyAgICBCQ01PTFRfQUVfUEFUSF9EU19LRVlfSURfX0JFR0lOICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0FFX1BBVEhfRFNfS0VZX0lEX0FFX05JICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEFFIE5JIChBY3RpdmUgRXRoZXJuZXQgTmV0d29yayBJbnRlcmZhY2UpIG51bWJlci4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9EU19LRVlfSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2FlX3BhdGhfZHNfa2V5X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBhZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWQKK3sKKyAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0FMQVJNX0NMRUFSRURfSURfX0JFR0lOICA9IDAsCisgICAgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQgICAgPSAwLCAgICAvKio8IFN0YXRpc3RpYyBJRC4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRiAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZCAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkCit7CisgICAgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9BTEFSTV9SQUlTRURfSURfX0JFR0lOICAgPSAwLAorICAgIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQgICAgID0gMCwgICAgLyoqPCBTdGF0aXN0aWMgSUQuICovCisgICAgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9BTEFSTV9SQUlTRURfSURfX05VTV9PRiAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgYWVfcGF0aF9kc19zdGF0X2NmZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZ19pZAoreworICAgIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0NGR19JRF9DRkcgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQ29uZmlndXJhdGlvbi4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0NGR19JRF9fTlVNX09GICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBhZV9wYXRoX2RzX3N0YXQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9pZAoreworICAgIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfX0JFR0lOICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0JZVEVTICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQnl0ZXMuICovCisgICAgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVMgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU182NCAgICAgICAgICAgICA9IDIsICAgIC8qKjwgNjQgQnl0ZSBGcmFtZXMuICovCisgICAgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3ICAgICAgICAgPSAzLCAgICAvKio8IDY1LTEyNyBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1ICAgICAgICA9IDQsICAgIC8qKjwgMTI4LTI1NSBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExICAgICAgICA9IDUsICAgIC8qKjwgMjU2LTUxMSBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMyAgICAgICA9IDYsICAgIC8qKjwgNTEyLTEwMjMgQnl0ZSBGcmFtZXMuICovCisgICAgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4ICAgICAgPSA3LCAgICAvKio8IDEwMjQtMTUxOCBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDcgICAgICA9IDgsICAgIC8qKjwgMTUxOS0yMDQ3IEJ5dGUgRnJhbWVzLiAqLworICAgIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NSAgICAgID0gOSwgICAgLyoqPCAyMDQ4XzQwOTUgQnl0ZSBGcmFtZXMuICovCisgICAgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2ICAgICAgPSAxMCwgICAvKio8IDQwOTYtOTIxNiBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzICAgICA9IDExLCAgIC8qKjwgOTIxNy0xNjM4MyBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVMgICAgICA9IDEyLCAgIC8qKjwgQnJvYWRjYXN0IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0RBVEFfQllURVMgICAgICAgICAgICA9IDEzLCAgIC8qKjwgRGF0YSBCeXRlcy4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVMgICAgICA9IDE0LCAgIC8qKjwgTXVsaXRjYXN0IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTICAgICAgICA9IDE1LCAgIC8qKjwgVW5pY2FzdCBGcmFtZXMuICovCisgICAgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9BQk9SVF9GUkFNRVMgICAgICAgICAgPSAxNiwgICAvKio8IEFib3J0IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX19OVU1fT0YgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGFlX3BhdGhfdXNfYXV0b19jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfaWQKK3sKKyAgICBCQ01PTFRfQUVfUEFUSF9VU19BVVRPX0NGR19JRF9fQkVHSU4gICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0FFX1BBVEhfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEPSAwLCAgICAvKio8IFN0YXQgQWxhcm0gQ2xlYXJlZC4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCA9IDEsICAgIC8qKjwgU3RhdCBBbGFybSBSYWlzZWQuICovCisgICAgQkNNT0xUX0FFX1BBVEhfVVNfQVVUT19DRkdfSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgYWVfcGF0aF91c19rZXkgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2FlX3BhdGhfdXNfa2V5X2lkCit7CisgICAgQkNNT0xUX0FFX1BBVEhfVVNfS0VZX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9BRV9QQVRIX1VTX0tFWV9JRF9BRV9OSSAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBBRSBOSS4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9VU19LRVlfSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2FlX3BhdGhfdXNfa2V5X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBhZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQKK3sKKyAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfX0JFR0lOICA9IDAsCisgICAgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQgICAgPSAwLCAgICAvKio8IFN0YXRpc3RpYyBJRC4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRiAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZCAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkCit7CisgICAgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9BTEFSTV9SQUlTRURfSURfX0JFR0lOICAgPSAwLAorICAgIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQgICAgID0gMCwgICAgLyoqPCBTdGF0aXN0aWMgSUQuICovCisgICAgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9BTEFSTV9SQUlTRURfSURfX05VTV9PRiAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgYWVfcGF0aF91c19zdGF0X2NmZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZ19pZAoreworICAgIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0NGR19JRF9DRkcgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQ29uZmlndXJhdGlvbi4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0NGR19JRF9fTlVNX09GICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBhZV9wYXRoX3VzX3N0YXQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9pZAoreworICAgIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfX0JFR0lOICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0JZVEVTICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQnl0ZXMuICovCisgICAgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVMgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU182NCAgICAgICAgICAgICA9IDIsICAgIC8qKjwgNjQgQnl0ZSBGcmFtZXMuICovCisgICAgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3ICAgICAgICAgPSAzLCAgICAvKio8IDY1LTEyNyBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1ICAgICAgICA9IDQsICAgIC8qKjwgMTI4LTI1NSBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExICAgICAgICA9IDUsICAgIC8qKjwgMjU2LTUxMSBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMyAgICAgICA9IDYsICAgIC8qKjwgNTEyLTEwMjMgQnl0ZSBGcmFtZXMuICovCisgICAgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4ICAgICAgPSA3LCAgICAvKio8IDEwMjQtMTUxOCBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDcgICAgICA9IDgsICAgIC8qKjwgMTUxOS0yMDQ3IEJ5dGUgRnJhbWVzLiAqLworICAgIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NSAgICAgID0gOSwgICAgLyoqPCAyMDQ4XzQwOTUgQnl0ZSBGcmFtZXMuICovCisgICAgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2ICAgICAgPSAxMCwgICAvKio8IDQwOTYtOTIxNiBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzICAgICA9IDExLCAgIC8qKjwgOTIxNy0xNjM4MyBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVMgICAgICA9IDEyLCAgIC8qKjwgQnJvYWRjYXN0IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0RBVEFfQllURVMgICAgICAgICAgICA9IDEzLCAgIC8qKjwgRGF0YSBCeXRlcy4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVMgICAgICA9IDE0LCAgIC8qKjwgTXVsaXRjYXN0IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTICAgICAgICA9IDE1LCAgIC8qKjwgVW5pY2FzdCBGcmFtZXMuICovCisgICAgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9BQk9SVF9GUkFNRVMgICAgICAgICAgPSAxNiwgICAvKio8IEFib3J0IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZDU19FUlJPUiAgICAgICAgICAgICA9IDE3LCAgIC8qKjwgRkNTIEVycm9yLiAqLworICAgIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfT1ZFUlNJWkVfRVJST1IgICAgICAgID0gMTgsICAgLyoqPCBPdmVyc2l6ZSBFcnJvci4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX1JVTlRfRVJST1IgICAgICAgICAgICA9IDE5LCAgIC8qKjwgUnVudCBFcnJvci4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX19OVU1fT0YgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGNoYW5uZWxfY2ZnIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9jaGFubmVsX2NmZ19pZAoreworICAgIEJDTU9MVF9DSEFOTkVMX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfQ0hBTk5FTF9DRkdfSURfT1BFUkFUSU9OX0NPTlRST0wgICAgICAgICA9IDAsICAgIC8qKjwgT3BlcmF0aW9uIGNvbnRyb2wuICovCisgICAgQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX1RPTCAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFRPTC4gKi8KKyAgICBCQ01PTFRfQ0hBTk5FTF9DRkdfSURfU1lTVEVNX1BST0ZJTEUgICAgICAgICAgICA9IDIsICAgIC8qKjwgU3lzdGVtIHByb2ZpbGUuICovCisgICAgQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX0NIQU5ORUxfUFJPRklMRSAgICAgICAgICAgPSAzLCAgICAvKio8IENoYW5uZWwgcHJvZmlsZS4gKi8KKyAgICBCQ01PTFRfQ0hBTk5FTF9DRkdfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2NoYW5uZWxfY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgY2hhbm5lbF9rZXkgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2NoYW5uZWxfa2V5X2lkCit7CisgICAgQkNNT0xUX0NIQU5ORUxfS0VZX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9DSEFOTkVMX0tFWV9JRF9QT05fTkkgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBQT04gbmV0d29yayBpbnRlcmZhY2UuICovCisgICAgQkNNT0xUX0NIQU5ORUxfS0VZX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9jaGFubmVsX2tleV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRlYnVnX2F1dG9fY2ZnIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19pZAoreworICAgIEJDTU9MVF9ERUJVR19BVVRPX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfREVCVUdfQVVUT19DRkdfSURfQ0xJX09VVFBVVCAgICAgICAgICAgICA9IDAsICAgIC8qKjwgY2xpX291dHB1dC4gKi8KKyAgICBCQ01PTFRfREVCVUdfQVVUT19DRkdfSURfRklMRV9BTE1PU1RfRlVMTCAgICAgICA9IDEsICAgIC8qKjwgZmlsZV9hbG1vc3RfZnVsbC4gKi8KKyAgICBCQ01PTFRfREVCVUdfQVVUT19DRkdfSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGVidWdfY2ZnIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9kZWJ1Z19jZmdfaWQKK3sKKyAgICBCQ01PTFRfREVCVUdfQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0RFQlVHX0NGR19JRF9DT05TT0xFX1JFRElSRUNUSU9OICAgICAgICAgPSAwLCAgICAvKio8IENvbnNvbGVfcmVkaXJlY3Rpb24uICovCisgICAgQkNNT0xUX0RFQlVHX0NGR19JRF9JTkRJQ0FUSU9OU19EUk9QUEVEICAgICAgICAgPSAxLCAgICAvKio8IEluZGljYXRpb25zIERyb3BwZWQuICovCisgICAgQkNNT0xUX0RFQlVHX0NGR19JRF9GSUxFX1VTRURfUEVSQ0VOVCAgICAgICAgICAgPSAyLCAgICAvKio8IEZpbGUgdXNlZCBwZXJjZW50LiAqLworICAgIEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfQ0ZHICAgICAgICAgICAgID0gMywgICAgLyoqPCBBUEkgQ2FwdHVyZSBDZmcuICovCisgICAgQkNNT0xUX0RFQlVHX0NGR19JRF9BUElfQ0FQVFVSRV9TVEFUUyAgICAgICAgICAgPSA0LCAgICAvKio8IEFQSSBDYXB0dXJlIFN0YXRzLiAqLworICAgIEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfQlVGRkVSX1JFQUQgICAgID0gNSwgICAgLyoqPCBBUEkgQ2FwdHVyZSBCdWZmZXIgUmVhZC4gKi8KKyAgICBCQ01PTFRfREVCVUdfQ0ZHX0lEX0FQSV9DQVBUVVJFX0JVRkZFUiAgICAgICAgICA9IDYsICAgIC8qKjwgQVBJIENhcHR1cmUgQnVmZmVyLiAqLworICAgIEJDTU9MVF9ERUJVR19DRkdfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9kZWJ1Z19jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBkZWJ1Z19jbGlfaW5wdXQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9pZAoreworICAgIEJDTU9MVF9ERUJVR19DTElfSU5QVVRfSURfX0JFR0lOICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfREVCVUdfQ0xJX0lOUFVUX0lEX0RBVEEgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgZGF0YS4gKi8KKyAgICBCQ01PTFRfREVCVUdfQ0xJX0lOUFVUX0lEX19OVU1fT0YgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRlYnVnX2NsaV9vdXRwdXQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfaWQKK3sKKyAgICBCQ01PTFRfREVCVUdfQ0xJX09VVFBVVF9JRF9fQkVHSU4gICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0RFQlVHX0NMSV9PVVRQVVRfSURfREFUQSAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IGRhdGEuICovCisgICAgQkNNT0xUX0RFQlVHX0NMSV9PVVRQVVRfSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGVidWdfZmlsZV9hbG1vc3RfZnVsbCAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9kZWJ1Z19maWxlX2FsbW9zdF9mdWxsX2lkCit7CisgICAgQkNNT0xUX0RFQlVHX0ZJTEVfQUxNT1NUX0ZVTExfSURfX05VTV9PRiAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9kZWJ1Z19maWxlX2FsbW9zdF9mdWxsX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGVidWdfa2V5IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9kZWJ1Z19rZXlfaWQKK3sKKyAgICBCQ01PTFRfREVCVUdfS0VZX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0RFQlVHX0tFWV9JRF9SRVNFUlZFRCAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFJlc2VydmVkLiAqLworICAgIEJDTU9MVF9ERUJVR19LRVlfSURfX05VTV9PRiAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZGVidWdfa2V5X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGVidWdfcmVzZXRfYXBpX2NhcHR1cmUgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZGVidWdfcmVzZXRfYXBpX2NhcHR1cmVfaWQKK3sKKyAgICBCQ01PTFRfREVCVUdfUkVTRVRfQVBJX0NBUFRVUkVfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2RlYnVnX3Jlc2V0X2FwaV9jYXB0dXJlX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGVidWdfc3RhcnRfYXBpX2NhcHR1cmUgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZGVidWdfc3RhcnRfYXBpX2NhcHR1cmVfaWQKK3sKKyAgICBCQ01PTFRfREVCVUdfU1RBUlRfQVBJX0NBUFRVUkVfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2RlYnVnX3N0YXJ0X2FwaV9jYXB0dXJlX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGVidWdfc3RvcF9hcGlfY2FwdHVyZSAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9kZWJ1Z19zdG9wX2FwaV9jYXB0dXJlX2lkCit7CisgICAgQkNNT0xUX0RFQlVHX1NUT1BfQVBJX0NBUFRVUkVfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9kZWJ1Z19zdG9wX2FwaV9jYXB0dXJlX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGV2aWNlX2F1dG9fY2ZnIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfaWQKK3sKKyAgICBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfQ09OTkVDVElPTl9DT01QTEVURSAgICAgICA9IDAsICAgIC8qKjwgQ29ubmVjdGlvbiBDb21wbGV0ZS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0NPTk5FQ1RJT05fRVNUQUJMSVNIRUQgICAgPSAxLCAgICAvKio8IENvbm5lY3Rpb24gRXN0YWJsaXNoZWQgKEludGVybmFsKS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0NPTk5FQ1RJT05fRkFJTFVSRSAgICAgICAgPSAyLCAgICAvKio8IENvbm5lY3Rpb24gRmFpbHVyZS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0REUl9URVNUX0NPTVBMRVRFICAgICAgICAgPSAzLCAgICAvKio8IEREUiBUZXN0IENvbXBsZXRlLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfREVWSUNFX0tFRVBfQUxJVkUgICAgICAgICA9IDQsICAgIC8qKjwgRGV2aWNlIEtlZXAgQWxpdmUgKEludGVybmFsKS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0RFVklDRV9SRUFEWSAgICAgICAgICAgICAgPSA1LCAgICAvKio8IERldmljZSBSZWFkeSAoSW50ZXJuYWwpLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfRElTQ09OTkVDVElPTl9DT01QTEVURSAgICA9IDYsICAgIC8qKjwgRGlzY29ubmVjdGlvbiBDb21wbGV0ZS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0lNQUdFX1RSQU5TRkVSX0NPTVBMRVRFICAgPSA3LCAgICAvKio8IEltYWdlIFRyYW5zZmVyIENvbXBsZXRlLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfSU5ESUNBVElPTlNfRFJPUFBFRCAgICAgICA9IDgsICAgIC8qKjwgSW5kaWNhdGlvbnMgRHJvcHBlZC4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX1NXX0VSUk9SICAgICAgICAgICAgICAgICAgPSA5LCAgICAvKio8IHN3IGVycm9yLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfU1dfRVhDRVBUSU9OICAgICAgICAgICAgICA9IDEwLCAgIC8qKjwgc3cgZXhjZXB0aW9uLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2RldmljZV9hdXRvX2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRldmljZV9jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2RldmljZV9jZmdfaWQKK3sKKyAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9TWVNURU1fTU9ERSAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBzeXN0ZW1fbW9kZS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9LRUVQQUxJVkVfSU5URVJWQUwgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBEZXZpY2UgS2VlcGFsaXZlIEludGVydmFsLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0tFRVBBTElWRV9UT0xFUkFOQ0UgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IERldmljZSBLZWVwYWxpdmUgdG9sZXJhbmNlIC4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9GSVJNV0FSRV9TV19WRVJTSU9OICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBGaXJtd2FyZSBTVyBWZXJzaW9uLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0hPU1RfU1dfVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IEhvc3QgU1cgVmVyc2lvbi4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9DSElQX1JFVklTSU9OICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgLyoqPCBDaGlwIFJldmlzaW9uLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAvKio8IERldmljZSBzdGF0ZS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9ERUJVRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgLyoqPCBkZWJ1ZyBwYXJhbWV0ZXJzLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX05OSV9TUEVFRCAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAvKio8IE5OSSBTcGVlZC4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19FWFRfSVJRICAgICAgID0gOSwgICAgLyoqPCBQcm90ZWN0aW9uIFN3aXRjaGluZyBFeHRlcm5hbCBJUlEuICovCisgICAgQkNNT0xUX0RFVklDRV9DRkdfSURfRVBPTl9DTE9DS19UUkFOU1BPUlRfU0FNUExFX0RFTEFZICA9IDEwLCAgIC8qKjwgRVBPTiBDbG9jayBUcmFuc3BvcnQgU2FtcGxlIERlbGF5LiAqLworICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0lORElDQVRJT05fU0hBUElORyAgICAgICAgICAgICAgICAgPSAxMSwgICAvKio8IEluZGljYXRpb24gU2hhcGluZy4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9DSElQX1RFTVBFUkFUVVJFICAgICAgICAgICAgICAgICAgID0gMTIsICAgLyoqPCBjaGlwIHRlbXBlcmF0dXJlIC4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9HUE9OX1hHUE9OX1RPRF9FTkFCTEUgICAgICAgICAgICAgID0gMTMsICAgLyoqPCBHUE9OL1hHUE9OIFRvRCBlbmFibGUuICovCisgICAgQkNNT0xUX0RFVklDRV9DRkdfSURfR1BPTl9YR1BPTl9UT0RfR1BJT19QSU4gICAgICAgICAgICA9IDE0LCAgIC8qKjwgR1BPTi9YR1BPTiBUb0QgR1BJTyBwaW4uICovCisgICAgQkNNT0xUX0RFVklDRV9DRkdfSURfR1BPTl9YR1BPTl9UT0RfQ09OTkVDVEVEX0lOVEVSTkFMTFk9IDE1LCAgIC8qKjwgR1BPTi9YR1BPTiBpcyBUb0QgaW50ZXJuYWxseS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9FUE9OXzgwMjFfQVNfVE9EX0ZPUk1BVCAgICAgICAgICAgID0gMTYsICAgLyoqPCBFUE9OIDgwMi4xQVMgVG9EIEZvcm1hdC4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9FUE9OX1NIQVBFUl9NT0RFICAgICAgICAgICAgICAgICAgID0gMTcsICAgLyoqPCBFUE9OIFNoYXBlciBNb2RlLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VNQkVEREVEX0lNQUdFX0xJU1QgICAgICAgICAgICAgICAgPSAxOCwgICAvKio8IEVtYmVkZGVkIGltYWdlIGxpc3QuICovCisgICAgQkNNT0xUX0RFVklDRV9DRkdfSURfQ0hJUF9WT0xUQUdFICAgICAgICAgICAgICAgICAgICAgICA9IDE5LCAgIC8qKjwgY2hpcCB2b2x0YWdlLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VQT05fVE9EX1NUUklORyAgICAgICAgICAgICAgICAgICAgPSAyMCwgICAvKio8IEVQT04gVG9EIFN0cmluZy4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9YR1BPTl9OVU1fT0ZfT05VUyAgICAgICAgICAgICAgICAgID0gMjEsICAgLyoqPCB4Z3BvbiBudW0gb2Ygb251cy4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9ERVZJQ0VfSVBfQUREUkVTUyAgICAgICAgICAgICAgICAgID0gMjIsICAgLyoqPCBEZXZpY2UgSVAgQWRkcmVzcy4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9ERVZJQ0VfVURQX1BPUlQgICAgICAgICAgICAgICAgICAgID0gMjMsICAgLyoqPCBEZXZpY2UgVURQIHBvcnQuICovCisgICAgQkNNT0xUX0RFVklDRV9DRkdfSURfVE9EX1VBUlRfQkFVRFJBVEUgICAgICAgICAgICAgICAgICA9IDI0LCAgIC8qKjwgVUFSVCBiYXVkcmF0ZS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9HUE9OX1hHUE9OX1RPRF9TVFJJTkdfTEVOR1RIICAgICAgID0gMjUsICAgLyoqPCBHUE9OL1hHUE9OIFRvRCBzdHJpbmcgbGVuZ3RoLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX19OVU1fT0YgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2RldmljZV9jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBkZXZpY2VfY29ubmVjdCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZGV2aWNlX2Nvbm5lY3RfaWQKK3sKKyAgICBCQ01PTFRfREVWSUNFX0NPTk5FQ1RfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9kZXZpY2VfY29ubmVjdF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2lkCit7CisgICAgQkNNT0xUX0RFVklDRV9DT05ORUNUSU9OX0NPTVBMRVRFX0lEX19CRUdJTiAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0RFVklDRV9DT05ORUNUSU9OX0NPTVBMRVRFX0lEX1NUQU5EQUxPTkUgICAgICAgICA9IDAsICAgIC8qKjwgU3RhbmRhbG9uZS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0NPTk5FQ1RJT05fQ09NUExFVEVfSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGRldmljZV9jb25uZWN0aW9uX2VzdGFibGlzaGVkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9lc3RhYmxpc2hlZF9pZAoreworICAgIEJDTU9MVF9ERVZJQ0VfQ09OTkVDVElPTl9FU1RBQkxJU0hFRF9JRF9fTlVNX09GICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9lc3RhYmxpc2hlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRldmljZV9jb25uZWN0aW9uX2ZhaWx1cmUgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9pZAoreworICAgIEJDTU9MVF9ERVZJQ0VfQ09OTkVDVElPTl9GQUlMVVJFX0lEX19CRUdJTiAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9ERVZJQ0VfQ09OTkVDVElPTl9GQUlMVVJFX0lEX1JFQVNPTiAgICAgICAgICAgICAgPSAwLCAgICAvKio8IENvbm5lY3Rpb24gZmFpbCByZWFzb24uICovCisgICAgQkNNT0xUX0RFVklDRV9DT05ORUNUSU9OX0ZBSUxVUkVfSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBkZXZpY2VfZGRyX3Rlc3RfY29tcGxldGUgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2lkCit7CisgICAgQkNNT0xUX0RFVklDRV9ERFJfVEVTVF9DT01QTEVURV9JRF9fQkVHSU4gICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0RFVklDRV9ERFJfVEVTVF9DT01QTEVURV9JRF9ERFJfVEVTVCAgICAgICAgICAgICA9IDAsICAgIC8qKjwgRERSIFRlc3QuICovCisgICAgQkNNT0xUX0RFVklDRV9ERFJfVEVTVF9DT01QTEVURV9JRF9fTlVNX09GICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZSAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfaWQKK3sKKyAgICBCQ01PTFRfREVWSUNFX0RFVklDRV9LRUVQX0FMSVZFX0lEX19CRUdJTiAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfREVWSUNFX0RFVklDRV9LRUVQX0FMSVZFX0lEX1NFUVVFTkNFX05VTUJFUiAgICAgID0gMCwgICAgLyoqPCBzZXF1ZW5jZSBudW1iZXIuICovCisgICAgQkNNT0xUX0RFVklDRV9ERVZJQ0VfS0VFUF9BTElWRV9JRF9USU1FX1NUQU1QICAgICAgICAgICA9IDEsICAgIC8qKjwgdGltZSBzdGFtcC4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0RFVklDRV9LRUVQX0FMSVZFX0lEX19OVU1fT0YgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGV2aWNlX2RldmljZV9yZWFkeSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9pZAoreworICAgIEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX0ZJUk1XQVJFX1NXX1ZFUlNJT04gICAgICAgPSAwLCAgICAvKio8IFNvZnR3YXJlIFZlcnNpb24uICovCisgICAgQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfU1lTVEVNX01PREUgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgU3lzdGVtIE1vZGUuICovCisgICAgQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfTk5JX1NQRUVEICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgTk5JIFNwZWVkLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX0NISVBfUkVWSVNJT04gICAgICAgICAgICAgPSAzLCAgICAvKio8IENoaXAgUmV2aXNpb24uICovCisgICAgQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfVE9EX0VOQUJMRSAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgVG9EIGNvbnRyb2wuICovCisgICAgQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfVE9EX0dQSU9fUElOICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgR1BJTyBwaW4gaXMgdXNlZCB3aGVuIFRvRCBVQVJUIGlzIG5vdCBjb25uZWN0ZWQgdG8gdGhlIGVtYmVkZGVkLCBhbmQgVE9EIHZhbHVlIGlzIG9idGFpbmVkIGJ5IHRoZSBob3N0LiAqLworICAgIEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX19OVU1fT0YgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBkZXZpY2VfZGlzY29ubmVjdCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZGV2aWNlX2Rpc2Nvbm5lY3RfaWQKK3sKKyAgICBCQ01PTFRfREVWSUNFX0RJU0NPTk5FQ1RfSURfX05VTV9PRiAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9kZXZpY2VfZGlzY29ubmVjdF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZGV2aWNlX2Rpc2Nvbm5lY3Rpb25fY29tcGxldGUgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2RldmljZV9kaXNjb25uZWN0aW9uX2NvbXBsZXRlX2lkCit7CisgICAgQkNNT0xUX0RFVklDRV9ESVNDT05ORUNUSU9OX0NPTVBMRVRFX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZGV2aWNlX2Rpc2Nvbm5lY3Rpb25fY29tcGxldGVfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBkZXZpY2VfaG9zdF9rZWVwX2FsaXZlIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfaWQKK3sKKyAgICBCQ01PTFRfREVWSUNFX0hPU1RfS0VFUF9BTElWRV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfREVWSUNFX0hPU1RfS0VFUF9BTElWRV9JRF9TRVFVRU5DRV9OVU1CRVIgICAgICAgID0gMCwgICAgLyoqPCBzZXF1ZW5jZSBudW1iZXIuICovCisgICAgQkNNT0xUX0RFVklDRV9IT1NUX0tFRVBfQUxJVkVfSURfVElNRV9TVEFNUCAgICAgICAgICAgICA9IDEsICAgIC8qKjwgdGltZSBzdGFtcC4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0hPU1RfS0VFUF9BTElWRV9JRF9fTlVNX09GICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfaWQKK3sKKyAgICBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX0NPTVBMRVRFX0lEX19CRUdJTiAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX0NPTVBMRVRFX0lEX0lNQUdFX1RZUEUgICAgID0gMCwgICAgLyoqPCBJbWFnZSB0eXBlLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfQ09NUExFVEVfSURfQkxPQ0tfTlVNQkVSICAgPSAxLCAgICAvKio8IEJsb2NrIG51bWJlci4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX0NPTVBMRVRFX0lEX1NUQVRVUyAgICAgICAgID0gMiwgICAgLyoqPCBTdGF0dXMuICovCisgICAgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9DT01QTEVURV9JRF9fTlVNX09GICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2lkCit7CisgICAgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9EQVRBX0lEX19CRUdJTiAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9EQVRBX0lEX0JMT0NLX05VTUJFUiAgICAgICA9IDAsICAgIC8qKjwgQmxvY2sgbnVtYmVyLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfREFUQV9JRF9NT1JFX0RBVEEgICAgICAgICAgPSAxLCAgICAvKio8IE1vcmUgRGF0YS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX0RBVEFfSURfREFUQSAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBEYXRhLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfREFUQV9JRF9fTlVNX09GICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydCAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfaWQKK3sKKyAgICBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX1NUQVJUX0lEX19CRUdJTiAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX1NUQVJUX0lEX0lNQUdFX1RZUEUgICAgICAgID0gMCwgICAgLyoqPCBJbWFnZSB0eXBlLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfU1RBUlRfSURfSU1BR0VfU0laRSAgICAgICAgPSAxLCAgICAvKio8IEltYWdlIFNpemUuICovCisgICAgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9TVEFSVF9JRF9DUkMzMiAgICAgICAgICAgICA9IDIsICAgIC8qKjwgQ1JDMzIuICovCisgICAgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9TVEFSVF9JRF9JTUFHRV9OQU1FICAgICAgICA9IDMsICAgIC8qKjwgSW1hZ2UgbmFtZS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX1NUQVJUX0lEX19OVU1fT0YgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWQgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWRfaWQKK3sKKyAgICBCQ01PTFRfREVWSUNFX0lORElDQVRJT05TX0RST1BQRURfSURfX0JFR0lOICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfREVWSUNFX0lORElDQVRJT05TX0RST1BQRURfSURfVE9UQUxfQ09VTlQgICAgICAgID0gMCwgICAgLyoqPCBUb3RhbCBDb3VudC4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0lORElDQVRJT05TX0RST1BQRURfSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBkZXZpY2Vfa2V5IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9kZXZpY2Vfa2V5X2lkCit7CisgICAgQkNNT0xUX0RFVklDRV9LRVlfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0RFVklDRV9LRVlfSURfUkVTRVJWRUQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgUmVzZXJ2ZWQuICovCisgICAgQkNNT0xUX0RFVklDRV9LRVlfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9kZXZpY2Vfa2V5X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGV2aWNlX3Jlc2V0IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9kZXZpY2VfcmVzZXRfaWQKK3sKKyAgICBCQ01PTFRfREVWSUNFX1JFU0VUX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfREVWSUNFX1JFU0VUX0lEX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBNb2RlLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfUkVTRVRfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZGV2aWNlX3Jlc2V0X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGV2aWNlX3J1bl9kZHJfdGVzdCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9pZAoreworICAgIEJDTU9MVF9ERVZJQ0VfUlVOX0REUl9URVNUX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9ERVZJQ0VfUlVOX0REUl9URVNUX0lEX0NQVSAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IENQVS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX1JVTl9ERFJfVEVTVF9JRF9SQVNfMCAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBSQVMgMC4gKi8KKyAgICBCQ01PTFRfREVWSUNFX1JVTl9ERFJfVEVTVF9JRF9SQVNfMSAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBSQVMgMS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX1JVTl9ERFJfVEVTVF9JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRldmljZV9zd19lcnJvciBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2lkCit7CisgICAgQkNNT0xUX0RFVklDRV9TV19FUlJPUl9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0RFVklDRV9TV19FUlJPUl9JRF9UQVNLX05BTUUgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgdGFzayBuYW1lLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfU1dfRVJST1JfSURfRklMRV9OQU1FICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IGZpbGUgbmFtZS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX1NXX0VSUk9SX0lEX0xJTkVfTlVNQkVSICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBsaW5lIG51bWJlci4gKi8KKyAgICBCQ01PTFRfREVWSUNFX1NXX0VSUk9SX0lEX1BPTl9OSSAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBwb25fbmkuICovCisgICAgQkNNT0xUX0RFVklDRV9TV19FUlJPUl9JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGV2aWNlX3N3X2V4Y2VwdGlvbiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9pZAoreworICAgIEJDTU9MVF9ERVZJQ0VfU1dfRVhDRVBUSU9OX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9ERVZJQ0VfU1dfRVhDRVBUSU9OX0lEX0NQVV9JRCAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IENQVSBJRC4gKi8KKyAgICBCQ01PTFRfREVWSUNFX1NXX0VYQ0VQVElPTl9JRF9URVhUICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCB0ZXh0LiAqLworICAgIEJDTU9MVF9ERVZJQ0VfU1dfRVhDRVBUSU9OX0lEX19OVU1fT0YgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25faWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBkZXZpY2Vfc3dfdXBncmFkZV9hY3RpdmF0ZSAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9kZXZpY2Vfc3dfdXBncmFkZV9hY3RpdmF0ZV9pZAoreworICAgIEJDTU9MVF9ERVZJQ0VfU1dfVVBHUkFERV9BQ1RJVkFURV9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2RldmljZV9zd191cGdyYWRlX2FjdGl2YXRlX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZyAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2lkCit7CisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9MQVNFUl9PTl9PRkZfVklPTEFUSU9OICAgICAgPSAwLCAgICAvKio8IExhc2VyIE9uL09mZiBWaW9sYXRpb24uICovCisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfTExJRF9QT09MX0VNUFRZX1ZJT0xBVElPTiAgID0gMSwgICAgLyoqPCBMTElEIFBvb2wgRW1wdHkgVmlvbGF0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX01BWF9MSU5LX1ZJT0xBVElPTiAgICAgICAgICA9IDIsICAgIC8qKjwgTWF4IExpbmsgVmlvbGF0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX09WRVJIRUFEX1BST0ZJTEVfVklPTEFUSU9OICA9IDMsICAgIC8qKjwgT3ZlcmhlYWQgUHJvZmlsZSBWaW9sYXRpb24uICovCisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfUkFOR0VfVklPTEFUSU9OICAgICAgICAgICAgID0gNCwgICAgLyoqPCBSYW5nZSBWaW9sYXRpb24uICovCisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfUk9HVUVfVklPTEFUSU9OICAgICAgICAgICAgID0gNSwgICAgLyoqPCBSb2d1ZSBPTlUgRGV0ZWN0ZWQuICovCisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfU1lTVEVNX1JFU09VUkNFX1ZJT0xBVElPTiAgID0gNiwgICAgLyoqPCBTeXN0ZW0gUmVzb3VyY2UgVmlvbGF0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX1RETV9DSEFOTkVMU19FWEhBVVNURUQgICAgICA9IDcsICAgIC8qKjwgVERNIENoYW5uZWxzIEV4aGF1c3RlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9VTktOT1dOX0xJTktfVklPTEFUSU9OICAgICAgPSA4LCAgICAvKio8IFVua25vd24gTGluayBWaW9sYXRpb24uICovCisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfVVBTVFJFQU1fQkFORFdJRFRIX1ZJT0xBVElPTj0gOSwgICAgLyoqPCBVcHN0cmVhbSBCYW5kd2lkdGggVmlvbGF0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fZGVuaWVkX2xpbmtfY2ZnIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19pZAoreworICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQ0ZHX0lEX0FMQVJNX1NUQVRFICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBBbGFybSBTdGF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19DRkdfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2RlbmllZF9saW5rX2tleSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXlfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19LRVlfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0tFWV9JRF9FUE9OX05JICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgRVBPTiBOSSBJZGVudGlmaWVyLiAqLworICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0tFWV9JRF9NQUNfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgTUFDIEFkZHJlc3MuICovCisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfS0VZX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBlcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb24gZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9pZAoreworICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0xBU0VSX09OX09GRl9WSU9MQVRJT05fSURfX0JFR0lOICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfTEFTRVJfT05fT0ZGX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMgID0gMCwgICAgICAgIC8qKjwgQWxhcm0gU3RhdHVzLiAqLworICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0xBU0VSX09OX09GRl9WSU9MQVRJT05fSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25faWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGVwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2lkCit7CisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfTExJRF9QT09MX0VNUFRZX1ZJT0xBVElPTl9JRF9fQkVHSU4gICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfTExJRF9QT09MX0VNUFRZX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMgICA9IDAsICAgIC8qKjwgQWxhcm0gU3RhdHVzLiAqLworICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0xMSURfUE9PTF9FTVBUWV9WSU9MQVRJT05fSURfX05VTV9PRiAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb25faWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGVwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9pZAoreworICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX01BWF9MSU5LX1ZJT0xBVElPTl9JRF9fQkVHSU4gICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX01BWF9MSU5LX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMgICAgICAgICAgPSAwLCAgICAvKio8IEFsYXJtIFN0YXR1cy4gKi8KKyAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19NQVhfTElOS19WSU9MQVRJT05fSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25faWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGVwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb24gZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25faWQKK3sKKyAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19PVkVSSEVBRF9QUk9GSUxFX1ZJT0xBVElPTl9JRF9fQkVHSU4gICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19PVkVSSEVBRF9QUk9GSUxFX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMgID0gMCwgICAgLyoqPCBBbGFybSBzdGF0dXMuICovCisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfT1ZFUkhFQURfUFJPRklMRV9WSU9MQVRJT05fSURfX05VTV9PRiAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25faWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGVwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9pZAoreworICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1JBTkdFX1ZJT0xBVElPTl9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1JBTkdFX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMgICAgICAgICAgICAgPSAwLCAgICAvKio8IEFsYXJtIFN0YXR1cy4gKi8KKyAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19SQU5HRV9WSU9MQVRJT05fSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25faWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGVwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9pZAoreworICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1JPR1VFX1ZJT0xBVElPTl9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1JPR1VFX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMgICAgICAgICAgICAgPSAwLCAgICAvKio8IEFsYXJtIFN0YXR1cy4gKi8KKyAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19ST0dVRV9WSU9MQVRJT05fSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25faWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGVwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2lkCit7CisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfU1lTVEVNX1JFU09VUkNFX1ZJT0xBVElPTl9JRF9fQkVHSU4gICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfU1lTVEVNX1JFU09VUkNFX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMgICA9IDAsICAgIC8qKjwgQWxhcm0gU3RhdHVzLiAqLworICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1NZU1RFTV9SRVNPVVJDRV9WSU9MQVRJT05fSURfX05VTV9PRiAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25faWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGVwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX2lkCit7CisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfVERNX0NIQU5ORUxTX0VYSEFVU1RFRF9JRF9fQkVHSU4gICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfVERNX0NIQU5ORUxTX0VYSEFVU1RFRF9JRF9BTEFSTV9TVEFUVVMgICAgICA9IDAsICAgIC8qKjwgQWxhcm0gU3RhdHVzLiAqLworICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1RETV9DSEFOTkVMU19FWEhBVVNURURfSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGVwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2lkCit7CisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfVU5LTk9XTl9MSU5LX1ZJT0xBVElPTl9JRF9fQkVHSU4gICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfVU5LTk9XTl9MSU5LX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMgICAgICA9IDAsICAgIC8qKjwgQWxhcm0gU3RhdHVzLiAqLworICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1VOS05PV05fTElOS19WSU9MQVRJT05fSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb25faWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGVwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2lkCit7CisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfVVBTVFJFQU1fQkFORFdJRFRIX1ZJT0xBVElPTl9JRF9fQkVHSU4gICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfVVBTVFJFQU1fQkFORFdJRFRIX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVM9IDAsICAgIC8qKjwgQWxhcm0gU3RhdHVzLiAqLworICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1VQU1RSRUFNX0JBTkRXSURUSF9WSU9MQVRJT05fSURfX05VTV9PRiAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25faWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfYXV0b19jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19pZAoreworICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfRFVQTElDQVRFX01QQ1BfUkVHSVNUUkFUSU9OX1JFUVVFU1QgICAgPSAwLCAgICAvKio8IER1cGxpY2F0ZSBNUENQIFJlZ2lzdHJhdGlvbiBSZXF1ZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfRU5DUllQVElPTl9FTkFCTEVEICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEVuY3J5cHRpb24gRW5hYmxlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9GQUlMVVJFICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBLZXkgRXhjaGFuZ2UgRmFpbHVyZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9TVEFSVEVEICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBrZXlfZXhjaGFuZ2Vfc3RhcnRlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9TVE9QUEVEICAgICAgICAgICAgICAgICAgID0gNCwgICAgLyoqPCBrZXlfZXhjaGFuZ2Vfc3RvcHBlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0xJTktfREVMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgLyoqPCBMaW5rIERlbGV0ZWQuICovCisgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9MSU5LX1NQRUVEX01JU01BVENIICAgICAgICAgICAgICAgICAgICA9IDYsICAgIC8qKjwgTGluayBhdHRlbXB0ZWQgdG8gcmVnaXN0ZXIgYXQgYSBkaWZmZXJlbnQgc3BlZWQuICovCisgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9NUENQX0RFUkVHSVNURVJFRCAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgIC8qKjwgTVBDUCBEZXJlZ2lzdGVyZWQuICovCisgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9NUENQX0RJU0NPVkVSRUQgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgIC8qKjwgTVBDUCBEaXNjb3ZlcmVkLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTVBDUF9SRUdfQUNLX1RJTUVPVVQgICAgICAgICAgICAgICAgICAgPSA5LCAgICAvKio8IE1QQ1AgUmVnIEFjayBUaW1lb3V0LiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTVBDUF9SRVBPUlRfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgPSAxMCwgICAvKio8IE1QQ1AgUmVwb3J0IFRpbWVvdXQuICovCisgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9PQU1fS0VFUEFMSVZFX1RJTUVPVVQgICAgICAgICAgICAgICAgICA9IDExLCAgIC8qKjwgT0FNIEtlZXBhbGl2ZSBUaW1lb3V0LiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfT0FNX0tFRVBBTElWRV9USU1FUl9TVEFSVEVEICAgICAgICAgICAgPSAxMiwgICAvKio8IE9BTSBrZWVwYWxpdmUgdGltZXIgc3RhcnRlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX09BTV9LRUVQQUxJVkVfVElNRVJfU1RPUFBFRCAgICAgICAgICAgID0gMTMsICAgLyoqPCBPQU0ga2VlcGFsaXZlIHRpbWVyIHN0b3BwZWQuICovCisgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9QUkVQUk9WSVNJT05FRF9MSU5LX0NSRUFURUQgICAgICAgICAgICA9IDE0LCAgIC8qKjwgUHJlcHJvdmlzaW9uZWQgTGluayBDcmVhdGVkLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hfT0NDVVJSRUQgICAgICAgICAgICAgPSAxNSwgICAvKio8IFByb3RlY3Rpb24gU3dpdGNoIE9jY3VycmVkLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfUkFOR0VfVkFMVUVfQ0hBTkdFRCAgICAgICAgICAgICAgICAgICAgPSAxNiwgICAvKio8IFJhbmdlIFZhbHVlIENoYW5nZWQuICovCisgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9SRVJBTkdFX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgICAgICA9IDE3LCAgIC8qKjwgUmUtcmFuZ2UgZmFpbHVyZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCAgICAgICAgICAgICAgICAgICAgID0gMTgsICAgLyoqPCBTdGF0IEFsYXJtIENsZWFyZWQuICovCisgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCAgICAgICAgICAgICAgICAgICAgICA9IDE5LCAgIC8qKjwgU3RhdCBBbGFybSBSYWlzZWQuICovCisgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9TVEFUSUNfUkVHSVNUUkFUSU9OX0RPTkUgICAgICAgICAgICAgICA9IDIwLCAgIC8qKjwgU3RhdGljIHJlZ2lzdHJhdGlvbiBkb25lLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfY2ZnIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2lkCit7CisgICAgQkNNT0xUX0VQT05fTElOS19DRkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fTElOS19DRkdfSURfTElOS19SQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgRVBPTiBsaW5rIHJhdGUuICovCisgICAgQkNNT0xUX0VQT05fTElOS19DRkdfSURfU1RBVEVfRkxBR1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgRVBPTiBsaW5rIHN0YXRlIGZsYWdzLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xMSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IEVQT04gbG9naWNhbCBsaW5rIGlkZW50aWZpZXIuICovCisgICAgQkNNT0xUX0VQT05fTElOS19DRkdfSURfTEFTRVJfT05fVElNRV9UUSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgTGFzZXItb24gdGltZSAoVFEpLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xBU0VSX09GRl9USU1FX1RRICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IExhc2VyLW9mZiB0aW1lIChUUSkuICovCisgICAgQkNNT0xUX0VQT05fTElOS19DRkdfSURfUkFOR0VfVkFMVUVfVFEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgUmFuZ2UgdmFsdWUgKFRRKS4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9ESVNUQU5DRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBEaXN0YW5jZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9BTEFSTV9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgLyoqPCBBbGFybSBTdGF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9UVU5ORUxfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgLyoqPCBUdW5uZWwgSUQuICovCisgICAgQkNNT0xUX0VQT05fTElOS19DRkdfSURfT05VX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgIC8qKjwgQXNzb2NpYXRlZCBPTlUuICovCisgICAgQkNNT0xUX0VQT05fTElOS19DRkdfSURfTUlOX0xBU0VSX09WRVJIRUFEICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgIC8qKjwgTWluIExhc2VyIE92ZXJoZWFkLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0tFWV9FWENIQU5HRV9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAvKio8IEtleSBleGNoYW5nZSBjb25maWd1cmF0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0VQT05fRU5DUllQVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMiwgICAvKio8IEVQT04gRW5jcnlwdGlvbiAuICovCisgICAgQkNNT0xUX0VQT05fTElOS19DRkdfSURfRkVDX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgIC8qKjwgRkVDIGVuYWJsZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9PQU1fSEVBUlRCRUFUX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgICAgID0gMTQsICAgLyoqPCBPQU0gaGVhcnRiZWF0IGNvbmZpZ3VyYXRpb24uICovCisgICAgQkNNT0xUX0VQT05fTElOS19DRkdfSURfVVBTVFJFQU1fQkFORFdJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1LCAgIC8qKjwgVXBzdHJlYW0gQmFuZHdpZHRoLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1VCRF9JTkZPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNiwgICAvKio8IFVCRCBJbmZvLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0NMT0NLX1RSQU5TUE9SVF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgPSAxNywgICAvKio8IENsb2NrIFRyYW5zcG9ydCBFbmFibGUuICovCisgICAgQkNNT0xUX0VQT05fTElOS19DRkdfSURfUEVORElOR19HUkFOVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4LCAgIC8qKjwgUGVuZGluZyBncmFudHMuICovCisgICAgQkNNT0xUX0VQT05fTElOS19DRkdfSURfTElOS19UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5LCAgIC8qKjwgTGluayBUeXBlLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX19OVU1fT0YgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9saW5rX2RlbGV0ZV9saW5rIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2xpbmtfZGVsZXRlX2xpbmtfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9MSU5LX0RFTEVURV9MSU5LX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9saW5rX2RlbGV0ZV9saW5rX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBlcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3QgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9pZAoreworICAgIEJDTU9MVF9FUE9OX0xJTktfRFVQTElDQVRFX01QQ1BfUkVHSVNUUkFUSU9OX1JFUVVFU1RfSURfX0JFR0lOICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9MSU5LX0RVUExJQ0FURV9NUENQX1JFR0lTVFJBVElPTl9SRVFVRVNUX0lEX0lOSVRJQUxfUkFOR0VfVFE9IDAsICAgIC8qKjwgSW5pdGlhbCByYW5nZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX0RVUExJQ0FURV9NUENQX1JFR0lTVFJBVElPTl9SRVFVRVNUX0lEX0NVUlJFTlRfUkFOR0VfVFE9IDEsICAgIC8qKjwgQ3VycmVudCByYW5nZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX0RVUExJQ0FURV9NUENQX1JFR0lTVFJBVElPTl9SRVFVRVNUX0lEX19OVU1fT0YgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbGlua19lbmNyeXB0aW9uX2VuYWJsZWQgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9saW5rX2VuY3J5cHRpb25fZW5hYmxlZF9pZAoreworICAgIEJDTU9MVF9FUE9OX0xJTktfRU5DUllQVElPTl9FTkFCTEVEX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19lbmNyeXB0aW9uX2VuYWJsZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfZm9yY2VfcmVkaXNjb3ZlcnkgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9saW5rX2ZvcmNlX3JlZGlzY292ZXJ5X2lkCit7CisgICAgQkNNT0xUX0VQT05fTElOS19GT1JDRV9SRURJU0NPVkVSWV9JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9saW5rX2ZvcmNlX3JlZGlzY292ZXJ5X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9pZAoreworICAgIEJDTU9MVF9FUE9OX0xJTktfRlJBTUVfQ0FQVFVSRURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9MSU5LX0ZSQU1FX0NBUFRVUkVEX0lEX0ZSQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgUmVjZWl2ZWQgZnJhbWUuICovCisgICAgQkNNT0xUX0VQT05fTElOS19GUkFNRV9DQVBUVVJFRF9JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfaW5qZWN0X2ZyYW1lIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9MSU5LX0lOSkVDVF9GUkFNRV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fTElOS19JTkpFQ1RfRlJBTUVfSURfRlJBTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEZyYW1lIHRvIHRyYW5zbWl0LiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfSU5KRUNUX0ZSQU1FX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9MSU5LX0tFWV9FWENIQU5HRV9GQUlMVVJFX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fTElOS19LRVlfRVhDSEFOR0VfRkFJTFVSRV9JRF9BTEFSTV9TVEFUVVMgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IGFsYXJtIHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX0tFWV9FWENIQU5HRV9GQUlMVVJFX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydCAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2lkCit7CisgICAgQkNNT0xUX0VQT05fTElOS19LRVlfRVhDSEFOR0VfU1RBUlRfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX0xJTktfS0VZX0VYQ0hBTkdFX1NUQVJUX0lEX1BFUklPRCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBwZXJpb2QuICovCisgICAgQkNNT0xUX0VQT05fTElOS19LRVlfRVhDSEFOR0VfU1RBUlRfSURfX05VTV9PRiAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGVwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydGVkX2lkCit7CisgICAgQkNNT0xUX0VQT05fTElOS19LRVlfRVhDSEFOR0VfU1RBUlRFRF9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcCAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9MSU5LX0tFWV9FWENIQU5HRV9TVE9QX0lEX19OVU1fT0YgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdG9wX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBlcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BwZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcHBlZF9pZAoreworICAgIEJDTU9MVF9FUE9OX0xJTktfS0VZX0VYQ0hBTkdFX1NUT1BQRURfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BwZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfa2V5IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2lkCit7CisgICAgQkNNT0xUX0VQT05fTElOS19LRVlfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX0VQT05fTkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBFUE9OIE5JIGlkZW50aWZpZXIuICovCisgICAgQkNNT0xUX0VQT05fTElOS19LRVlfSURfTUFDX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IE1BQyBhZGRyZXNzLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX19OVU1fT0YgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9saW5rX2tleV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbGlua19saW5rX2RlbGV0ZWQgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9saW5rX2xpbmtfZGVsZXRlZF9pZAoreworICAgIEJDTU9MVF9FUE9OX0xJTktfTElOS19ERUxFVEVEX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9saW5rX2xpbmtfZGVsZXRlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2ggZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2lkCit7CisgICAgQkNNT0xUX0VQT05fTElOS19MSU5LX1NQRUVEX01JU01BVENIX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX0xJTktfTElOS19TUEVFRF9NSVNNQVRDSF9JRF9QUkVWSU9VU19SQVRFICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBQcmV2aW91cyByYXRlLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfTElOS19TUEVFRF9NSVNNQVRDSF9JRF9DVVJSRU5UX1JBVEUgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBDdXJyZW50IHJhdGUuICovCisgICAgQkNNT0xUX0VQT05fTElOS19MSU5LX1NQRUVEX01JU01BVENIX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfbXBjcF9kZXJlZ2lzdGVyZWQgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9saW5rX21wY3BfZGVyZWdpc3RlcmVkX2lkCit7CisgICAgQkNNT0xUX0VQT05fTElOS19NUENQX0RFUkVHSVNURVJFRF9JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9saW5rX21wY3BfZGVyZWdpc3RlcmVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZCAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2lkCit7CisgICAgQkNNT0xUX0VQT05fTElOS19NUENQX0RJU0NPVkVSRURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX0xJTktfTVBDUF9ESVNDT1ZFUkVEX0lEX0xJTktfSU5GTyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBMaW5rIGluZm9ybWF0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfTVBDUF9ESVNDT1ZFUkVEX0lEX19OVU1fT0YgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBlcG9uX2xpbmtfbXBjcF9yZWdfYWNrX3RpbWVvdXQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlZ19hY2tfdGltZW91dF9pZAoreworICAgIEJDTU9MVF9FUE9OX0xJTktfTVBDUF9SRUdfQUNLX1RJTUVPVVRfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZWdfYWNrX3RpbWVvdXRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGVwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9pZAoreworICAgIEJDTU9MVF9FUE9OX0xJTktfTVBDUF9SRVBPUlRfVElNRU9VVF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9MSU5LX01QQ1BfUkVQT1JUX1RJTUVPVVRfSURfQUxBUk1fU1RBVFVTICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQWxhcm0gU3RhdHVzLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfTVBDUF9SRVBPUlRfVElNRU9VVF9JRF9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBlcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2lkCit7CisgICAgQkNNT0xUX0VQT05fTElOS19PQU1fS0VFUEFMSVZFX1RJTUVPVVRfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX0xJTktfT0FNX0tFRVBBTElWRV9USU1FT1VUX0lEX0FMQVJNX1NUQVRVUyAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBBbGFybSBTdGF0dXMuICovCisgICAgQkNNT0xUX0VQT05fTElOS19PQU1fS0VFUEFMSVZFX1RJTUVPVVRfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGVwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9pZAoreworICAgIEJDTU9MVF9FUE9OX0xJTktfT0FNX0tFRVBBTElWRV9USU1FUl9TVEFSVF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9MSU5LX09BTV9LRUVQQUxJVkVfVElNRVJfU1RBUlRfSURfU0VORF9QRVJJT0QgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU2VuZCBwZXJpb2QuICovCisgICAgQkNNT0xUX0VQT05fTElOS19PQU1fS0VFUEFMSVZFX1RJTUVSX1NUQVJUX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZF9pZAoreworICAgIEJDTU9MVF9FUE9OX0xJTktfT0FNX0tFRVBBTElWRV9USU1FUl9TVEFSVEVEX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcF9pZAoreworICAgIEJDTU9MVF9FUE9OX0xJTktfT0FNX0tFRVBBTElWRV9USU1FUl9TVE9QX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZF9pZAoreworICAgIEJDTU9MVF9FUE9OX0xJTktfT0FNX0tFRVBBTElWRV9USU1FUl9TVE9QUEVEX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9pZAoreworICAgIEJDTU9MVF9FUE9OX0xJTktfUFJFUFJPVklTSU9ORURfTElOS19DUkVBVEVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9MSU5LX1BSRVBST1ZJU0lPTkVEX0xJTktfQ1JFQVRFRF9JRF9MSU5LX0lORk8gICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgTGluayBpbmZvcm1hdGlvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1BSRVBST1ZJU0lPTkVEX0xJTktfQ1JFQVRFRF9JRF9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGVwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkX2lkCit7CisgICAgQkNNT0xUX0VQT05fTElOS19QUk9URUNUSU9OX1NXSVRDSF9PQ0NVUlJFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX0xJTktfUFJPVEVDVElPTl9TV0lUQ0hfT0NDVVJSRURfSURfUFJPVEVDVElPTl9TVEFUVVMgICAgICAgID0gMCwgICAgLyoqPCBQcm90ZWN0aW9uIHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1BST1RFQ1RJT05fU1dJVENIX09DQ1VSUkVEX0lEX1JBTkdFX1ZBTFVFX1RRICAgICAgICAgICA9IDEsICAgIC8qKjwgUmFuZ2UgdmFsdWUgaW4gdGltZSBxdWFudGEuICovCisgICAgQkNNT0xUX0VQT05fTElOS19QUk9URUNUSU9OX1NXSVRDSF9PQ0NVUlJFRF9JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGVwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZF9pZAoreworICAgIEJDTU9MVF9FUE9OX0xJTktfUkFOR0VfVkFMVUVfQ0hBTkdFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9MSU5LX1JBTkdFX1ZBTFVFX0NIQU5HRURfSURfUkFOR0VfVkFMVUVfVFEgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgUmFuZ2UgdmFsdWUgaW4gdGltZSBxdWFudGEuICovCisgICAgQkNNT0xUX0VQT05fTElOS19SQU5HRV9WQUxVRV9DSEFOR0VEX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfcmVyYW5nZV9mYWlsdXJlIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fbGlua19yZXJhbmdlX2ZhaWx1cmVfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9MSU5LX1JFUkFOR0VfRkFJTFVSRV9JRF9fTlVNX09GICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfcmVyYW5nZV9mYWlsdXJlX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZCAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX2lkCit7CisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0FMQVJNX0NMRUFSRURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdGF0aXN0aWMgSUQuICovCisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZCAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWRfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFN0YXRpc3RpYyBJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfc3RhdF9jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19pZAoreworICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9DRkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfQ0ZHX0lEX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQ29uZmlndXJhdGlvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfQ0ZHX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9saW5rX3N0YXQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkCit7CisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9EQVRBX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBEYXRhIEJ5dGVzIFJYLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9EQVRBX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBEYXRhIEZyYW1lcyBSWC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgNjQgQnl0ZSBGcmFtZXMgUlguICovCisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU182NV8xMjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IDY1LTEyNyBCeXRlIEZyYW1lcyBSWC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzEyOF8yNTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgMTI4LTI1NSBCeXRlIEZyYW1lcyBSWC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzI1Nl81MTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgMjU2LTUxMSBCeXRlIEZyYW1lcyBSWC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzUxMl8xMDIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgIC8qKjwgNTEyLTEwMjMgQnl0ZSBGcmFtZXMgUlguICovCisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18xMDI0XzE1MTggICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAvKio8IDEwMjQtMTUxOCBCeXRlIEZyYW1lcyBSWC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzE1MTlfMjA0NyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgIC8qKjwgMTUxOS0yMDQ3IEJ5dGUgRnJhbWVzIFJYLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfMjA0OF80MDk1ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgLyoqPCAyMDQ4LTQwOTUgQnl0ZSBGcmFtZXMgUlguICovCisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU180MDk2XzkyMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwgICAvKio8IDQwOTYtOTIxNiBCeXRlIEZyYW1lcyBSWC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzkyMTdfMTYzODMgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExLCAgIC8qKjwgOTIxNy0xNjM4MyBCeXRlIEZyYW1lcyBSWC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfT0FNX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyLCAgIC8qKjwgT0FNIEJ5dGVzIFJYLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9PQU1fRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMsICAgLyoqPCBPQU0gRnJhbWVzIFJYLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9NUENQX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQsICAgLyoqPCBNUENQIEZyYW1lcyBSWC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfQlJPQURDQVNUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1LCAgIC8qKjwgQnJvYWRjYXN0IEZyYW1lcyBSWC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfVU5JQ0FTVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2LCAgIC8qKjwgVW5pY2FzdCBGcmFtZXMgUlguICovCisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX01VTFRJQ0FTVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNywgICAvKio8IE11bHRpY2FzdCBGcmFtZXMgUlguICovCisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX1JFUE9SVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOCwgICAvKio8IFJlcG9ydCBGcmFtZXMgUlguICovCisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZDU19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOSwgICAvKio8IEZDUyBFcnJvciBSWC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfT1ZFUlNJWkVfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwLCAgIC8qKjwgT3ZlcnNpemUgRXJyb3IgUlguICovCisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX1JVTlRfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMSwgICAvKio8IFJ1bnQgRXJyb3IgUlguICovCisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0xJTkVfQ09ERV9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMiwgICAvKio8IExpbmUgQ29kZSBFcnJvciBSWC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfTElORV9DT0RFX0VSUk9SX01BWCAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzLCAgIC8qKjwgTGluZSBDb2RlIEVycm9yIE1heCBSWC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfREFUQV9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0LCAgIC8qKjwgRGF0YSBCeXRlcyBUWC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfREFUQV9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1LCAgIC8qKjwgRGF0YSBGcmFtZXMgVFguICovCisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU182NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNiwgICAvKio8IDY0IEJ5dGUgRnJhbWVzIFRYLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfNjVfMTI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjcsICAgLyoqPCA2NS0xMjcgQnl0ZSBGcmFtZXMgVFguICovCisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18xMjhfMjU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOCwgICAvKio8IDEyOC0yNTUgQnl0ZSBGcmFtZXMgVFguICovCisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18yNTZfNTExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOSwgICAvKio8IDI1Ni01MTEgQnl0ZSBGcmFtZXMgVFguICovCisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU181MTJfMTAyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMCwgICAvKio8IDUxMi0xMDIzIEJ5dGUgRnJhbWVzIFRYLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMTAyNF8xNTE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzEsICAgLyoqPCAxMDI0LTE1MTggQnl0ZSBGcmFtZXMgVFguICovCisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18xNTE5XzIwNDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMiwgICAvKio8IDE1MTktMjA0NyBCeXRlIEZyYW1lcyBUWC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzIwNDhfNDA5NSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMzLCAgIC8qKjwgMjA0OC00MDk1IEJ5dGUgRnJhbWVzIFRYLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfNDA5Nl85MjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzQsICAgLyoqPCA0MDk2LTkyMTYgQnl0ZSBGcmFtZXMgVFguICovCisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU185MjE3XzE2MzgzICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNSwgICAvKio8IDkyMTctMTYzODMgQnl0ZSBGcmFtZXMgVFguICovCisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX09BTV9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNiwgICAvKio8IE9BTSBCeXRlcyBUWC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfT0FNX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM3LCAgIC8qKjwgT0FNIEZyYW1lcyBUWC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfTVBDUF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM4LCAgIC8qKjwgTVBDUCBGcmFtZXMgVFguICovCisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0JST0FEQ0FTVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzOSwgICAvKio8IEJyb2FkY2FzdCBGcmFtZXMgVFguICovCisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX1VOSUNBU1RfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MCwgICAvKio8IFVuaWNhc3QgRnJhbWVzIFRYLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9NVUxUSUNBU1RfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDEsICAgLyoqPCBNdWx0aWNhc3QgRnJhbWVzIFRYLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9HQVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDIsICAgLyoqPCBHYXRlcyBUWC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBlcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lX2lkCit7CisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUSUNfUkVHSVNUUkFUSU9OX0RPTkVfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBlcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25faWQKK3sKKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRJQ19SRUdJU1RSQVRJT05fSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUSUNfUkVHSVNUUkFUSU9OX0lEX0xBU0VST05fVElNRV9UUSAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IExhc2VyLW9uIHRpbWUgKFRRKS4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRJQ19SRUdJU1RSQVRJT05fSURfTEFTRVJPRkZfVElNRV9UUSAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgTGFzZXItb2ZmIHRpbWUgKFRRKS4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRJQ19SRUdJU1RSQVRJT05fSURfUkFOR0VfVkFMVUVfVFEgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgUmFuZ2UgdmFsdWUgKFRRKS4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRJQ19SRUdJU1RSQVRJT05fSURfUEVORElOR19HUkFOVFMgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgUGVuZGluZyBHcmFudHMuICovCisgICAgQkNNT0xUX0VQT05fTElOS19TVEFUSUNfUkVHSVNUUkFUSU9OX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25faWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX25pX2FkZF9saW5rIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX25pX2FkZF9saW5rX2lkCit7CisgICAgQkNNT0xUX0VQT05fTklfQUREX0xJTktfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX05JX0FERF9MSU5LX0lEX01BQ19BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBNQUMgYWRkcmVzcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9BRERfTElOS19JRF9SQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgUmF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9BRERfTElOS19JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX25pX2FkZF9saW5rX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmsgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9OSV9BRERfTVVMVElDQVNUX0xJTktfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fTklfQUREX01VTFRJQ0FTVF9MSU5LX0lEX01BQ19BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IE1BQyBhZGRyZXNzLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0FERF9NVUxUSUNBU1RfTElOS19JRF9SQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBSYXRlLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0FERF9NVUxUSUNBU1RfTElOS19JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBlcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2lkCit7CisgICAgQkNNT0xUX0VQT05fTklfQUREX1BST1RFQ1RFRF9TVEFOREJZX0xJTktfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX05JX0FERF9QUk9URUNURURfU1RBTkRCWV9MSU5LX0lEX01BQ19BRERSRVNTICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBNQUMgYWRkcmVzcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9BRERfUFJPVEVDVEVEX1NUQU5EQllfTElOS19JRF9XT1JLSU5HX0xJTktfSU5GTyAgICAgICAgICA9IDEsICAgIC8qKjwgV29ya2luZyBsaW5rIGluZm8uICovCisgICAgQkNNT0xUX0VQT05fTklfQUREX1BST1RFQ1RFRF9TVEFOREJZX0xJTktfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9uaV9hdXRvX2NmZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19pZAoreworICAgIEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9BVVRPX1JPR1VFX1NDQU5fMTBHX0ZBSUxVUkUgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgMTBHIEVwb24gQXV0b25vbW91cyBSb2d1ZSBTY2FuIGZhaWx1cmUgZGV0ZWN0ZWQuICovCisgICAgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfQVVUT19ST0dVRV9TQ0FOXzFHX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IDFHIEVwb24gQXV0b25vbW91cyBSb2d1ZSBTY2FuIGZhaWx1cmUgZGV0ZWN0ZWQuICovCisgICAgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfTExJRF9RVUFSQU5USU5FRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IExMSUQgUXVhcmFudGluZWQuICovCisgICAgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfTVBDUF9USU1FU1RBTVBfQ0hBTkdFRCAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IE1QQ1AgVGltZXN0YW1wIENoYW5nZWQuICovCisgICAgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfTk9fUkVQT1JUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IE5vIFJlcG9ydHMuICovCisgICAgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfT05VX1VQR1JBREVfQ09NUExFVEUgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IE9OVSBVcGdyYWRlIENvbXBsZXRlLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX1JFUkFOR0VfRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBSZS1yYW5nZSBmYWlsdXJlLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX1JPR1VFX1NDQU5fQ09NUExFVEUgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgLyoqPCBSb2d1ZSBTY2FuIGlzIENvbXBsZXRlLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEICAgICAgICAgICAgICAgICAgID0gOCwgICAgLyoqPCBSU1NJIE1lYXN1cmVtZW50IENvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9TVEFURV9DSEFOR0VfQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgIC8qKjwgU3RhdGUgQ2hhbmdlIENvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9fTlVNX09GICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGVwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX25pX2F1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZV9pZAoreworICAgIEJDTU9MVF9FUE9OX05JX0FVVE9fUk9HVUVfU0NBTl8xMEdfRkFJTFVSRV9JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmVfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGVwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmUgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmVfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9OSV9BVVRPX1JPR1VFX1NDQU5fMUdfRkFJTFVSRV9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmVfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX25pX2NmZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9uaV9jZmdfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9OSV9DRkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01BQ19BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IE1BQyBBZGRyZXNzLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0NGR19JRF9FUE9OX05JX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBFUE9OIE5JIGVuYWJsZSBzdGF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9DRkdfSURfUkVHSVNUUkFUSU9OX0JFSEFWSU9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgUmVnaXN0cmF0aW9uIEJlaGF2aW9yLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0NGR19JRF9NVFVfMUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCAxRyBNVFUuICovCisgICAgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01UVV8xMEcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IDEwRyBNVFUuICovCisgICAgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01JTklNVU1fRklCRVJfTEVOR1RIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IE1pbmltdW0gRmliZXIgTGVuZ3RoLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0NGR19JRF9NQVhJTVVNX0ZJQkVSX0xFTkdUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBNYXhpbXVtIEZpYmVyIExlbmd0aC4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9DRkdfSURfR1JBTlRfU1BBQ0lOR19UUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgIC8qKjwgR3JhbnQgU3BhY2luZyAoVFEpLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0NGR19JRF9FUE9OX0xPR0lDQUxfTElOS19PUFRJT05TICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgLyoqPCBFUE9OIGxvZ2ljYWwgbGluayBvcHRpb25zLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0NGR19JRF9NUENQX0RJU0NPVkVSWV9QRVJJT0RfTVMgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgLyoqPCBNUENQIGRpc2NvdmVyeSBwZXJpb2QgaW4gbWlsbGlzZWNvbmRzLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0NGR19JRF9BTEFSTV9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgLyoqPCBBbGFybSBTdGF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQUxMX0xJTktTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExLCAgIC8qKjwgQWxsIGxpbmtzLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0NGR19JRF9FTkNSWVBUSU9OX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIsICAgLyoqPCBFUE9OIE5JIGVuY3J5cHRpb24gY29uZmlndXJhdGlvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgIC8qKjwgUHJvdGVjdGlvbiBzd2l0Y2hpbmcgY29uZmlndXJhdGlvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQ0xPQ0tfVFJBTlNQT1JUX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0LCAgIC8qKjwgQ2xvY2sgdHJhbnNwb3J0IGNvbmZpZ3VyYXRpb24uICovCisgICAgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0RST1BET1dOX1dFSUdIVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNSwgICAvKio8IERyb3AtZG93biBXZWlnaHRzLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0NGR19JRF9BUFBST1hJTUFURV9TT0xJQ0lURURfVVNBR0UgICAgICAgICAgICAgICAgICAgICAgID0gMTYsICAgLyoqPCBBcHByb3hpbWF0ZSBTb2xpY2l0ZWQgVXNhZ2UuICovCisgICAgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FQUFJPWElNQVRFX1RETV9VU0FHRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNywgICAvKio8IEFwcHJveGltYXRlIFRETSBVc2FnZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTk9fUkVQT1JUU19TT0FLX1RJTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4LCAgIC8qKjwgTm8gUmVwb3J0cyBzb2FrIHRpbWUuICovCisgICAgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX1BPTl9BR0dSRUdBVEVfU0hBUEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOSwgICAvKio8IFBPTiBBZ2dyZWdhdGUgU2hhcGVyLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0NGR19JRF9FU1RJTUFURURfUE9OX0xBVEVOQ1lfVFEgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjAsICAgLyoqPCBFc3RpbWF0ZWQgUE9OIExhdGVuY3kgKFRRKS4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9DRkdfSURfT05VX1VQR1JBREVfUEFSQU1TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxLCAgIC8qKjwgT05VIHVwZ3JhZGUgcGFyYW1zLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0NGR19JRF9BVVRPX1JPR1VFX0RFVEVDVF8xMEdfRU4gICAgICAgICAgICAgICAgICAgICAgICAgID0gMjIsICAgLyoqPCAxMEcgRXBvbiBBdXRvbm9tb3VzIFJvZ3VlIERldGVjdGlvbiBFbmFibGUuICovCisgICAgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FVVE9fUk9HVUVfREVURUNUXzFHX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMywgICAvKio8IDFHIEVwb24gQXV0b25vbW91cyBSb2d1ZSBEZXRlY3QgRW5hYmxlLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0NGR19JRF9BVVRPX1JPR1VFX0RFVEVDVF8xMEdfVEhSRVNIT0xEICAgICAgICAgICAgICAgICAgID0gMjQsICAgLyoqPCAxMEcgRXBvbiBBdXRvIFJvZ3VlIERldGVjdCBUaHJlc2hvbGQuICovCisgICAgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX25pX2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbmlfaXNzdWVfcnNzaV9ncmFudCAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fTklfSVNTVUVfUlNTSV9HUkFOVF9JRF9HUkFOVEVEX0xJTksgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEdyYW50ZWQgTGluay4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX1RSSUdHRVJfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgUnNzaSBUcmlnZ2VyIFdpZHRoIGluIG5zLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0lTU1VFX1JTU0lfR1JBTlRfSURfVFJJR0dFUl9ERUxBWSAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBSc3NpIFRyaWdnZXIgRGVsYXkgaW4gbnMuICovCisgICAgQkNNT0xUX0VQT05fTklfSVNTVUVfUlNTSV9HUkFOVF9JRF9TQU1QTEVfUEVSSU9EICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IFJzc2kgU2FtcGUgUGVyaW9kIGluIHVzLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0lTU1VFX1JTU0lfR1JBTlRfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9uaV9rZXkgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fbmlfa2V5X2lkCit7CisgICAgQkNNT0xUX0VQT05fTklfS0VZX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX05JX0tFWV9JRF9FUE9OX05JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBFUE9OIE5JIG51bWJlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9LRVlfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fbmlfa2V5X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9pZAoreworICAgIEJDTU9MVF9FUE9OX05JX0xMSURfUVVBUkFOVElORURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9OSV9MTElEX1FVQVJBTlRJTkVEX0lEX0xMSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgTExJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9MTElEX1FVQVJBTlRJTkVEX0lEX0xJTktfUkFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgTGluayBSYXRlLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0xMSURfUVVBUkFOVElORURfSURfTElOS19NQUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBMaW5rIE1BQy4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9MTElEX1FVQVJBTlRJTkVEX0lEX1JBTkdFX1ZBTFVFX1RRICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgUmFuZ2UgdmFsdWUgaW4gdGltZSBxdWFudGEuICovCisgICAgQkNNT0xUX0VQT05fTklfTExJRF9RVUFSQU5USU5FRF9JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGVwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2lkCit7CisgICAgQkNNT0xUX0VQT05fTklfTVBDUF9USU1FU1RBTVBfQ0hBTkdFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX05JX01QQ1BfVElNRVNUQU1QX0NIQU5HRURfSURfTVBDUF9USU1FU1RBTVAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBNUENQIFRpbWVzdGFtcC4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9NUENQX1RJTUVTVEFNUF9DSEFOR0VEX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9uaV9ub19yZXBvcnRzIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9OSV9OT19SRVBPUlRTX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fTklfTk9fUkVQT1JUU19JRF9BTEFSTV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEFsYXJtIFN0YXR1cy4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9OT19SRVBPUlRTX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZSAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkCit7CisgICAgQkNNT0xUX0VQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdGF0dXMuICovCisgICAgQkNNT0xUX0VQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfTElTVF9PRl9GQUlMRURfRU5USVRJRVMgICAgICAgICAgPSAxLCAgICAvKio8IExpc3Qgb2YgZmFpbGVkIGVudGl0aWVzLiAqLworICAgIEJDTU9MVF9FUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGVwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2lkCit7CisgICAgQkNNT0xUX0VQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfQVBQTFlfUkVSQU5HRV9ERUxUQV9JRF9fQkVHSU4gICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX0FQUExZX1JFUkFOR0VfREVMVEFfSURfUkVSQU5HRV9ERUxUQT0gMCwgICAgLyoqPCBSZS1yYW5nZSBkZWx0YS4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19BUFBMWV9SRVJBTkdFX0RFTFRBX0lEX19OVU1fT0YgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbmlfcmVyYW5nZV9mYWlsdXJlIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fbmlfcmVyYW5nZV9mYWlsdXJlX2lkCit7CisgICAgQkNNT0xUX0VQT05fTklfUkVSQU5HRV9GQUlMVVJFX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX25pX3JlcmFuZ2VfZmFpbHVyZV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbmlfcm9ndWVfbGxpZF9zY2FuIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2lkCit7CisgICAgQkNNT0xUX0VQT05fTklfUk9HVUVfTExJRF9TQ0FOX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX05JX1JPR1VFX0xMSURfU0NBTl9JRF9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTY2FuIEFsbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9ST0dVRV9MTElEX1NDQU5fSURfTExJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgTExJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9ST0dVRV9MTElEX1NDQU5fSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9pZAoreworICAgIEJDTU9MVF9FUE9OX05JX1JPR1VFX1NDQU5fQ09NUExFVEVfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9OSV9ST0dVRV9TQ0FOX0NPTVBMRVRFX0lEX1JFVFVSTl9JTkRfU1RBVFVTICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdHVzIG9mIGNvbXBsZXRlZCBzY2FuLiAqLworICAgIEJDTU9MVF9FUE9OX05JX1JPR1VFX1NDQU5fQ09NUExFVEVfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZAoreworICAgIEJDTU9MVF9FUE9OX05JX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9OSV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgc3RhdHVzLiAqLworICAgIEJDTU9MVF9FUE9OX05JX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX0xMSUQgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBMTElELiAqLworICAgIEJDTU9MVF9FUE9OX05JX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX0xJTktfTUFDICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBMaW5rIE1BQyAuICovCisgICAgQkNNT0xUX0VQT05fTklfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZSAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2lkCit7CisgICAgQkNNT0xUX0VQT05fTklfU0VUX0VQT05fTklfRU5fU1RBVEVfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX05JX1NFVF9FUE9OX05JX0VOX1NUQVRFX0lEX05FV19TVEFURSAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBOZXcgRVBPTiBOSSBlbmFibGUgc3RhdGUuICovCisgICAgQkNNT0xUX0VQT05fTklfU0VUX0VQT05fTklfRU5fU1RBVEVfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbmlfc3RhcnRfb251X3VwZ3JhZGUgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZAoreworICAgIEJDTU9MVF9FUE9OX05JX1NUQVJUX09OVV9VUEdSQURFX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9OSV9TVEFSVF9PTlVfVVBHUkFERV9JRF9MSVNUX09GX09OVV9JRFMgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgTGlzdCBvZiBPTlUgSURzLiAqLworICAgIEJDTU9MVF9FUE9OX05JX1NUQVJUX09OVV9VUEdSQURFX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9ORVdfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IE5ldyBFUE9OIE5JIGVuYWJsZSBzdGF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19pZAoreworICAgIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfQVVUT19DRkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdCBBbGFybSBDbGVhcmVkLiAqLworICAgIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBTdGF0IEFsYXJtIFJhaXNlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0FVVE9fQ0ZHX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fb251XzEwZ191c19jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fT05VXzEwR19VU19DRkdfSURfQUxMX0xJTktTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEFsbCBMaW5rcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0NGR19JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fb251XzEwZ191c19rZXkgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXlfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0tFWV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fT05VXzEwR19VU19LRVlfSURfRVBPTl9OSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEVQT04gTkkuICovCisgICAgQkNNT0xUX0VQT05fT05VXzEwR19VU19LRVlfSURfT05VX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IE9OVSBJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0tFWV9JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZAoreworICAgIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdGlzdGljIElELiAqLworICAgIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFN0YXRpc3RpYyBJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19pZAoreworICAgIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9DRkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfQ0ZHX0lEX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQ29uZmlndXJhdGlvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfQ0ZHX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fb251XzEwZ191c19zdGF0IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9pZAoreworICAgIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfRkVDX0NPREVfV09SRFNfVE9UQUwgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgRkVDIENvZGUgV29yZHMgVG90YWwuICovCisgICAgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19DT0RFX1dPUkRTX0RFQ09ERV9GQUlMUyAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEZFQyBDb2RlIFdvcmRzIERlY29kZSBGYWlscy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfRkVDX1pFUk9FU19DT1JSRUNURUQgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgRkVDIFplcm9lcyBDb3JyZWN0ZWQuICovCisgICAgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19PTkVTX0NPUlJFQ1RFRCAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IEZFQyBPbmVzIENvcnJlY3RlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX29udV8xZ191c19hdXRvX2NmZyAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19pZAoreworICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19BVVRPX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdCBBbGFybSBDbGVhcmVkLiAqLworICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBTdGF0IEFsYXJtIFJhaXNlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQVVUT19DRkdfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9vbnVfMWdfdXNfY2ZnIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29udV8xZ191c19jZmdfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fT05VXzFHX1VTX0NGR19JRF9BTExfTElOS1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEFsbCBMaW5rcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQ0ZHX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9vbnVfMWdfdXNfa2V5IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29udV8xZ191c19rZXlfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfS0VZX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fT05VXzFHX1VTX0tFWV9JRF9FUE9OX05JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEVQT04gTkkuICovCisgICAgQkNNT0xUX0VQT05fT05VXzFHX1VTX0tFWV9JRF9PTlVfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IE9OVSBJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfS0VZX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBlcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZAoreworICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdGlzdGljIElELiAqLworICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGVwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZAoreworICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdGlzdGljIElELiAqLworICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fb251XzFnX3VzX3N0YXRfY2ZnIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2lkCit7CisgICAgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0NGR19JRF9DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBDb25maWd1cmF0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0NGR19JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX29udV8xZ191c19zdGF0IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2lkCit7CisgICAgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0dPT0RfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBHb29kIGZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9HT09EX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgR29vZCBieXRlcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9PVkVSU1pfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgT3ZlcnNpemVkIGZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9OT05fRkVDX0dPT0RfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgTm9uLUZFQyBHb29kIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9OT05fRkVDX0dPT0RfQllURVMgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgTm9uLUZFQyBHb29kIEJ5dGVzLiAqLworICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19HT09EX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgLyoqPCBGRUMgR29vZCBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0dPT0RfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAvKio8IEZFQyBHb29kIEJ5dGVzLiAqLworICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19GUkFNRVNfRVhDX0VSUlMgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgLyoqPCBGRUMgRnJhbWVzIHdoaWNoIGV4Y2VlZGVkIDggc3ltYm9sIGVycm9ycy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQkxLU19OT19FUlJTICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgIC8qKjwgRkVDIEJsb2NrcyB3aXRoIG5vIGVycm9ycy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQkxLU19DT1JSX0VSUlMgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgIC8qKjwgRkVDIEJsb2NrcyB3aXRoIGNvcnJlY3RhYmxlIGVycm9ycy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQkxLU19VTkNPUlJfRVJSUyAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgIC8qKjwgRkVDIEJsb2NrcyB3aXRoIHVuY29ycmVjdGFibGUgZXJyb3JzLiAqLworICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19DT1JSX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEsICAgLyoqPCBGRUMgQ29ycmVjdGVkIEJ5dGVzLiAqLworICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19DT1JSX1pFUk9FUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIsICAgLyoqPCBGRUMgQ29ycmVjdGVkIFplcm9lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQ09SUl9PTkVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgIC8qKjwgRkVDIENvcnJlY3RlZCBPbmVzLiAqLworICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX1VOREVSU1pfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQsICAgLyoqPCBVbmRlcnNpemUgZnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0VSUk9SU1pfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUsICAgLyoqPCBFcnJvcmVkIGZyYW1lIC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fcGF0aF8xMGdfZHNfYXV0b19jZmcgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19pZAoreworICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0FVVE9fQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdCBBbGFybSBDbGVhcmVkLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBTdGF0IEFsYXJtIFJhaXNlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19BVVRPX0NGR19JRF9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3BhdGhfMTBnX2RzX2NmZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19DRkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfQ0ZHX0lEX0ZFQ19TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFBhdGggRkVDIHN0YXRlLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0NGR19JRF9QUkJTX0dFTkVSQVRPUiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBQUkJTIEdlbmVyYXRvci4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19DRkdfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3BhdGhfMTBnX2RzX2tleSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXlfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19LRVlfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfS0VZX0lEX0VQT05fTkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEVQT04gTkkgKEVQT04gTmV0d29yayBJbnRlcmZhY2UpIG51bWJlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19LRVlfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXlfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGVwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZAoreworICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdGlzdGljIElELiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGVwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFN0YXRpc3RpYyBJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9DRkdfSURfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IENvbmZpZ3VyYXRpb24uICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9DRkdfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9wYXRoXzEwZ19kc19zdGF0IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEJ5dGVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IDY0IEJ5dGUgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzY1XzEyNyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCA2NS0xMjcgQnl0ZSBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NSAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IDEyOC0yNTUgQnl0ZSBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMSAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IDI1Ni01MTEgQnl0ZSBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjMgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAvKio8IDUxMi0xMDIzIEJ5dGUgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxOCAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgLyoqPCAxMDI0LTE1MTggQnl0ZSBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3ICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAvKio8IDE1MTktMjA0NyBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTUgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgIC8qKjwgMjA0OF80MDk1IEJ5dGUgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNiAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgLyoqPCA0MDk2LTkyMTYgQnl0ZSBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MyAgICAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAvKio8IDkyMTctMTYzODMgQnl0ZSBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgPSAxMiwgICAvKio8IEJyb2FkY2FzdCBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9EQVRBX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMywgICAvKio8IERhdGEgQnl0ZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgPSAxNCwgICAvKio8IE11bGl0Y2FzdCBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNSwgICAvKio8IFVuaWNhc3QgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfT0FNX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYsICAgLyoqPCBPQU0gQnl0ZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9PQU1fRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNywgICAvKio8IE9BTSBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9HQVRFX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOCwgICAvKio8IEdhdGUgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfTVBDUF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTksICAgLyoqPCBNUENQIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0FCT1JUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwLCAgIC8qKjwgQWJvcnQgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19BVVRPX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFN0YXQgQWxhcm0gQ2xlYXJlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgU3RhdCBBbGFybSBSYWlzZWQuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQVVUT19DRkdfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9wYXRoXzEwZ191c19jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2lkCit7CisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0NGR19JRF9GRUNfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBQYXRoIEZFQyBzdGF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfU1lOQ19USU1FX1RRICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgU3luYyBUaW1lIChUUSkuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IFBSQlMgQ2hlY2tlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfUFJCU19TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgUFJCUyBzdGF0dXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9wYXRoXzEwZ191c19rZXkgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5X2lkCit7CisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfS0VZX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0tFWV9JRF9FUE9OX05JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBFUE9OIE5JLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0tFWV9JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkCit7CisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdGF0aXN0aWMgSUQuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZAoreworICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdGlzdGljIElELiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmcgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19pZAoreworICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0NGR19JRF9DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQ29uZmlndXJhdGlvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0NGR19JRF9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3BhdGhfMTBnX3VzX3N0YXQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZAoreworICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQnl0ZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU182NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgNjQgQnl0ZSBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IDY1LTEyNyBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1ICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgMTI4LTI1NSBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgMjU2LTUxMSBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMyAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgIC8qKjwgNTEyLTEwMjMgQnl0ZSBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4ICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAvKio8IDEwMjQtMTUxOCBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDcgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgIC8qKjwgMTUxOS0yMDQ3IEJ5dGUgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NSAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgLyoqPCAyMDQ4XzQwOTUgQnl0ZSBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2ICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwgICAvKio8IDQwOTYtOTIxNiBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzICAgICAgICAgICAgICAgICAgICAgICA9IDExLCAgIC8qKjwgOTIxNy0xNjM4MyBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICA9IDEyLCAgIC8qKjwgQnJvYWRjYXN0IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0RBVEFfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgIC8qKjwgRGF0YSBCeXRlcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICA9IDE0LCAgIC8qKjwgTXVsaXRjYXN0IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1LCAgIC8qKjwgVW5pY2FzdCBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9NUENQX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNiwgICAvKio8IE1QQ1AgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfT0FNX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTcsICAgLyoqPCBPQU0gQnl0ZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9PQU1fRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOCwgICAvKio8IE9BTSBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9SRVBPUlRfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOSwgICAvKio8IFJlcG9ydCBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9BQk9SVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMCwgICAvKio8IEFib3J0IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZDU19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxLCAgIC8qKjwgRkNTIEVycm9yLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfQ1JDXzhfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjIsICAgLyoqPCBDUkM4IEVycm9yLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfT1VUX09GX1NMT1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjMsICAgLyoqPCBPdXQgb2YgU2xvdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX09WRVJTSVpFX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0LCAgIC8qKjwgT3ZlcnNpemUgRXJyb3IuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9SVU5UX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNSwgICAvKio8IFJ1bnQgRXJyb3IuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fcGF0aF8xZ19kc19hdXRvX2NmZyAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0FVVE9fQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFN0YXQgQWxhcm0gQ2xlYXJlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgU3RhdCBBbGFybSBSYWlzZWQuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19BVVRPX0NGR19JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3BhdGhfMWdfZHNfY2ZnIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2lkCit7CisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19DRkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQ0ZHX0lEX0RFRkFVTFRfRkVDX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBEZWZhdWx0IEZFQyBzdGF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9SQU1BTl9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgUmFtYW4gbW9kZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9UVVJCT18yR19NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgVHVyYm8gMkcgbW9kZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9QUkJTX0dFTkVSQVRPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgUFJCUyBHZW5lcmF0b3IuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19DRkdfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3BhdGhfMWdfZHNfa2V5IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5X2lkCit7CisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19LRVlfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfS0VZX0lEX0VQT05fTkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBFUE9OIE5JLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfS0VZX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBlcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkCit7CisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0FMQVJNX0NMRUFSRURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdGF0aXN0aWMgSUQuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBlcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9pZAoreworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9BTEFSTV9SQUlTRURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdGlzdGljIElELiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9BTEFSTV9SQUlTRURfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmcgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2lkCit7CisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfSURfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBDb25maWd1cmF0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9wYXRoXzFnX2RzX3N0YXQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2lkCit7CisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBCeXRlcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCA2NCBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzY1XzEyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgNjUtMTI3IEJ5dGUgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgLyoqPCAxMjgtMjU1IEJ5dGUgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgLyoqPCAyNTYtNTExIEJ5dGUgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjMgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCA1MTItMTAyMyBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxOCAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgIC8qKjwgMTAyNC0xNTE4IEJ5dGUgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3ICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgLyoqPCAxNTE5LTIwNDcgQnl0ZSBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTUgICAgICAgICAgICAgICAgICAgICAgICAgPSA5LCAgICAvKio8IDIwNDhfNDA5NSBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNiAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgIC8qKjwgNDA5Ni05MjE2IEJ5dGUgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MyAgICAgICAgICAgICAgICAgICAgICAgID0gMTEsICAgLyoqPCA5MjE3LTE2MzgzIEJ5dGUgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIsICAgLyoqPCBCcm9hZGNhc3QgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9EQVRBX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMsICAgLyoqPCBEYXRhIEJ5dGVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQsICAgLyoqPCBNdWxpdGNhc3QgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUsICAgLyoqPCBVbmljYXN0IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfT0FNX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2LCAgIC8qKjwgT0FNIEJ5dGVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9PQU1fRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTcsICAgLyoqPCBPQU0gRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9HQVRFX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgsICAgLyoqPCBHYXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfTVBDUF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5LCAgIC8qKjwgTVBDUCBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0FCT1JUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMCwgICAvKio8IEFib3J0IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3BhdGhfMWdfdXNfYXV0b19jZmcgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2lkCit7CisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19BVVRPX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdGF0IEFsYXJtIENsZWFyZWQuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFN0YXQgQWxhcm0gUmFpc2VkLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQVVUT19DRkdfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9wYXRoXzFnX3VzX2NmZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19pZAoreworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0NGR19JRF9ERUZBVUxUX0ZFQ19TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgRGVmYXVsdCBGRUMgc3RhdGUuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19DRkdfSURfU1lOQ19USU1FX1RRICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFN5bmMgVGltZSAoVFEpLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBQUkJTIENoZWNrZXIuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19DRkdfSURfUFJCU19TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IFBSQlMgc3RhdHVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQ0ZHX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9wYXRoXzFnX3VzX2tleSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleV9pZAoreworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfS0VZX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0tFWV9JRF9FUE9OX05JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgRVBPTiBOSS4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0tFWV9JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZAoreworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdGlzdGljIElELiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFN0YXRpc3RpYyBJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19pZAoreworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9DRkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQ0ZHX0lEX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQ29uZmlndXJhdGlvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQ0ZHX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fcGF0aF8xZ191c19zdGF0IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9pZAoreworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQnl0ZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgNjQgQnl0ZSBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU182NV8xMjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IDY1LTEyNyBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTUgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgMTI4LTI1NSBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTEgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgMjU2LTUxMSBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgIC8qKjwgNTEyLTEwMjMgQnl0ZSBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTggICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAvKio8IDEwMjQtMTUxOCBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NyAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgIC8qKjwgMTUxOS0yMDQ3IEJ5dGUgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1ICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgLyoqPCAyMDQ4XzQwOTUgQnl0ZSBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTYgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwgICAvKio8IDQwOTYtOTIxNiBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODMgICAgICAgICAgICAgICAgICAgICAgICA9IDExLCAgIC8qKjwgOTIxNy0xNjM4MyBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyLCAgIC8qKjwgQnJvYWRjYXN0IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfREFUQV9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgIC8qKjwgRGF0YSBCeXRlcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0LCAgIC8qKjwgTXVsaXRjYXN0IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1LCAgIC8qKjwgVW5pY2FzdCBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX01QQ1BfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNiwgICAvKio8IE1QQ1AgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9PQU1fQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTcsICAgLyoqPCBPQU0gQnl0ZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX09BTV9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOCwgICAvKio8IE9BTSBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX1JFUE9SVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOSwgICAvKio8IFJlcG9ydCBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0FCT1JUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMCwgICAvKio8IEFib3J0IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRkNTX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxLCAgIC8qKjwgRkNTIEVycm9yLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9DUkNfOF9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjIsICAgLyoqPCBDUkM4IEVycm9yLiAqLworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9PVVRfT0ZfU0xPVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjMsICAgLyoqPCBPdXQgb2YgU2xvdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfT1ZFUlNJWkVfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0LCAgIC8qKjwgT3ZlcnNpemUgRXJyb3IuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX1JVTlRfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNSwgICAvKio8IFJ1bnQgRXJyb3IuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9ycF9jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fcnBfY2ZnX2lkCit7CisgICAgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX1JQX0NGR19JRF9CQVNFX0xMSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBCYXNlIGxvZ2ljYWwgbGluayBpZGVudGlmaWVyLiAqLworICAgIEJDTU9MVF9FUE9OX1JQX0NGR19JRF9NUENQX0RJU0NfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBNUENQIGRpc2NvdmVyeSBlbmFibGUuICovCisgICAgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01QQ1BfRElTQ19HTlRfTEVOX1RRICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IE1QQ1AgZGlzY292ZXJ5IGdyYW50IGxlbmd0aCBUUS4gKi8KKyAgICBCQ01PTFRfRVBPTl9SUF9DRkdfSURfTVBDUF9SRVBPUlRfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgTVBDUCByZXBvcnQgdGltZW91dCBtUy4gKi8KKyAgICBCQ01PTFRfRVBPTl9SUF9DRkdfSURfTUFYX01QQ1BfUkVHX1BFUl9ESVNDX1dJTkRPVyAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgTWF4aW11bSBNUENQIHJlZ2lzdHJhdGlvbnMgcGVyIGRpc2NvdmVyeSB3aW5kb3cuICovCisgICAgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01BWF9MSU5LUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IE1heGltdW0gbnVtYmVyIG9mIGxpbmtzLiAqLworICAgIEJDTU9MVF9FUE9OX1JQX0NGR19JRF9ERUZBVUxUX1VQU1RSRUFNX0JBTkRXSURUSCAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBEZWZhdWx0IFVwc3RyZWFtIEJhbmR3aWR0aC4gKi8KKyAgICBCQ01PTFRfRVBPTl9SUF9DRkdfSURfUkFURV9PRl9SRUZSQUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgIC8qKjwgUmF0ZSBvZiBSZWZyYWN0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX1JQX0NGR19JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9ycF9jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3JwX2tleSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9ycF9rZXlfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9SUF9LRVlfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fUlBfS0VZX0lEX0VQT05fTkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEVQT04gTkkgbnVtYmVyLiAqLworICAgIEJDTU9MVF9FUE9OX1JQX0tFWV9JRF9MSU5LX1JBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBMaW5rIHJhdGUuICovCisgICAgQkNNT0xUX0VQT05fUlBfS0VZX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX3JwX2tleV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwaW9fY2ZnIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncGlvX2NmZ19pZAoreworICAgIEJDTU9MVF9HUElPX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BJT19DRkdfSURfRElSRUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgRGlyZWN0aW9uLiAqLworICAgIEJDTU9MVF9HUElPX0NGR19JRF9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICBCQ01PTFRfR1BJT19DRkdfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bpb19jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncGlvX2tleSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bpb19rZXlfaWQKK3sKKyAgICBCQ01PTFRfR1BJT19LRVlfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQSU9fS0VZX0lEX1JFU0VSVkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFJlc2VydmVkLiAqLworICAgIEJDTU9MVF9HUElPX0tFWV9JRF9HUElPX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBHUElPIElELiAqLworICAgIEJDTU9MVF9HUElPX0tFWV9JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncGlvX2tleV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fYWxsb2NfYXV0b19jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19DRkdfSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IENvbmZpZ3VyYXRpb24gQ29tcGxldGVkLiAqLworICAgIEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX0dFVF9BTExPQ19TVEFUU19DT01QTEVURUQgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBHZXQgYWxsb2MgSUQgc3RhdGlzdGljcyBjb21wbGV0ZWQuICovCisgICAgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IFN0YXQgQWxhcm0gQ2xlYXJlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgU3RhdCBBbGFybSBSYWlzZWQuICovCisgICAgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19DRkdfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2FsbG9jX2NmZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9hbGxvY19jZmdfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9BTExPQ19DRkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fQUxMT0NfQ0ZHX0lEX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEFsbG9jIElEIHN0YXRlLiAqLworICAgIEJDTU9MVF9HUE9OX0FMTE9DX0NGR19JRF9TTEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBBbGxvYyBJRCBTTEEuICovCisgICAgQkNNT0xUX0dQT05fQUxMT0NfQ0ZHX0lEX09OVV9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IG9udV9pZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9BTExPQ19DRkdfSURfQ09MTEVDVF9TVEFUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgRW5hYmxlIHN0YXRpc3RpY3MgY29sbGVjdGlvbiBvbiB0aGUgYWxsb2MgaWQuICovCisgICAgQkNNT0xUX0dQT05fQUxMT0NfQ0ZHX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9hbGxvY19jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9BTExPQ19DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFN0YXR1cy4gKi8KKyAgICBCQ01PTFRfR1BPTl9BTExPQ19DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9ORVdfU1RBVEUgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgbmV3IHN0YXRlLiAqLworICAgIEJDTU9MVF9HUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9TVEFUVVMgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX0FWRVJBR0VfTlNSX1VTRUQgICAgICAgICA9IDEsICAgIC8qKjwgQXZlcmFnZSBOU1IgdXNlZCBieXRlcy4gKi8KKyAgICBCQ01PTFRfR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX0FWRVJBR0VfTlNSX0FMTE9DQVRFRCAgICA9IDIsICAgIC8qKjwgQXZlcmFnZSBOU1IgYWxsb2NhdGVkIGJ5dGVzLiAqLworICAgIEJDTU9MVF9HUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfQVZFUkFHRV9TUl9SRVBPUlQgICAgICAgID0gMywgICAgLyoqPCBBdmVyYWdlIFNSIHJlcG9ydC4gKi8KKyAgICBCQ01PTFRfR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fYWxsb2NfZ2V0X3N0YXRzIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0c19pZAoreworICAgIEJDTU9MVF9HUE9OX0FMTE9DX0dFVF9TVEFUU19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9BTExPQ19HRVRfU1RBVFNfSURfTlVNX09GX0NZQ0xFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgTnVtYmVyIG9mIGN5Y2xlcy4gKi8KKyAgICBCQ01PTFRfR1BPTl9BTExPQ19HRVRfU1RBVFNfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2FsbG9jX2tleSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9hbGxvY19rZXlfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9BTExPQ19LRVlfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fQUxMT0NfS0VZX0lEX1BPTl9OSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFBPTiBuZXR3b3JrIGludGVyZmFjZS4gKi8KKyAgICBCQ01PTFRfR1BPTl9BTExPQ19LRVlfSURfQUxMT0NfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgQWxsb2MgSUQuICovCisgICAgQkNNT0xUX0dQT05fQUxMT0NfS0VZX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9hbGxvY19rZXlfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2FsbG9jX3NldF9zdGF0ZSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9BTExPQ19TRVRfU1RBVEVfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fQUxMT0NfU0VUX1NUQVRFX0lEX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFN0YXRlLiAqLworICAgIEJDTU9MVF9HUE9OX0FMTE9DX1NFVF9TVEFURV9JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2lkCit7CisgICAgQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX0FMTE9DX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdGF0aXN0aWMgSUQuICovCisgICAgQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0FMQVJNX1JBSVNFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFN0YXRpc3RpYyBJRC4gKi8KKyAgICBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0FMQVJNX1JBSVNFRF9JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9hbGxvY19zdGF0X2NmZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19pZAoreworICAgIEJDTU9MVF9HUE9OX0FMTE9DX1NUQVRfQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0NGR19JRF9DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQ29uZmlndXJhdGlvbi4gKi8KKyAgICBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0NGR19JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fYWxsb2Nfc3RhdCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2lkCit7CisgICAgQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX0FMTE9DX1NUQVRfSURfUlhfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBSZWNlaXZlZCBCeXRlcy4gKi8KKyAgICBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2dlbV9wb3J0X2F1dG9fY2ZnIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9BVVRPX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IENvbmZpZ3VyYXRpb24gQ29tcGxldGVkLiAqLworICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBTdGF0IEFsYXJtIENsZWFyZWQuICovCisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IFN0YXQgQWxhcm0gUmFpc2VkLiAqLworICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0FVVE9fQ0ZHX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fZ2VtX3BvcnRfY2ZnIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19pZAoreworICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfQ09ORklHVVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQ29uZmlndXJhdGlvbi4gKi8KKyAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfT05VX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgT05VIElELiAqLworICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9HRU1fUE9SVF9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBnZW0gcG9ydCBzdGF0ZS4gKi8KKyAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfRE9XTlNUUkVBTV9FTkNSWVBUSU9OX01PREUgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgRG93bnN0cmVhbSBlbmNyeXB0aW9uIG1vZGUuICovCisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX1VQU1RSRUFNX0RFU1RJTkFUSU9OX1FVRVVFICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IFVwc3RyZWFtIGRlc3RpbmF0aW9uIHF1ZXVlLiAqLworICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgLyoqPCBjb250cm9sLiAqLworICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9ERUJVR19GTE9XX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBEZWJ1ZyBmbG93IGNvbmZpZy4gKi8KKyAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfTUFDX1RBQkxFX0VOVFJZX0xJTUlUICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgIC8qKjwgTUFDIHRhYmxlIGVudHJ5IGxpbWl0LiAqLworICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkCit7CisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUyAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBzdGF0dXMuICovCisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfTkVXX1NUQVRFICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IG5ldyBzdGF0ZS4gKi8KKyAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2dlbV9wb3J0X2tleSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXlfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9LRVlfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfS0VZX0lEX1BPTl9OSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFBPTiBuZXR3b3JrIGludGVyZmFjZS4gKi8KKyAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9LRVlfSURfR0VNX1BPUlRfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgR0VNIFBvcnQgSUQuICovCisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfS0VZX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXlfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2dlbV9wb3J0X3NldF9zdGF0ZSAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9pZAoreworICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NFVF9TVEFURV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TRVRfU1RBVEVfSURfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdGUuICovCisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfU0VUX1NUQVRFX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkCit7CisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdGF0aXN0aWMgSUQuICovCisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2lkCit7CisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9SQUlTRURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdGF0aXN0aWMgSUQuICovCisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9SQUlTRURfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2dlbV9wb3J0X3N0YXRfY2ZnIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9DRkdfSURfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IENvbmZpZ3VyYXRpb24uICovCisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9DRkdfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9nZW1fcG9ydF9zdGF0IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9QQUNLRVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFJlY2VpdmVkIEdFTSBmcmFtZXMuICovCisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFJlY2VpdmVkIGJ5dGVzLiAqLworICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfSURfVFhfUEFDS0VUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBUcmFuc21pdHRlZCBHRU0gZnJhbWVzLiAqLworICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfSURfVFhfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBUcmFuc21pdHRlZCBieXRlcy4gKi8KKyAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2ZfYXV0b19jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2lkCit7CisgICAgQkNNT0xUX0dQT05fSVdGX0FVVE9fQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX0lXRl9BVVRPX0NGR19JRF9GTFVTSF9NQUNfVEFCTEVfQ09NUExFVEVEICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBGbHVzaCBNQUMgVGFibGUgQ29tcGxldGVkLiAqLworICAgIEJDTU9MVF9HUE9OX0lXRl9BVVRPX0NGR19JRF9TQ0FOX01BQ19UQUJMRV9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBTY2FuIE1BQyBUYWJsZSBDb21wbGV0ZWQuICovCisgICAgQkNNT0xUX0dQT05fSVdGX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IFN0YXQgQWxhcm0gQ2xlYXJlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9JV0ZfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgU3RhdCBBbGFybSBSYWlzZWQuICovCisgICAgQkNNT0xUX0dQT05fSVdGX0FVVE9fQ0ZHX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2l3Zl9jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25faXdmX2NmZ19pZAoreworICAgIEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX0lXRl9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgSVdGIG1vZGUuICovCisgICAgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9VU19UUElEX1BFUl9GTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFVTIHRwaWQgcGVyIGZsb3cuICovCisgICAgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9VU19PVEFHX0RJUkVDVF9UUElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IFVTIG90YWcgZGlyZWN0IHRwaWQuICovCisgICAgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9VU19PVEFHX0RJUkVDVF9QQklUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IFVTIG90YWcgZGlyZWN0IHBiaXQuICovCisgICAgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9EU19UUElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IERTIHRwaWQuICovCisgICAgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9NQUNfVEFCTEVfQ09ORklHVVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IE1BQyB0YWJsZSBjb25maWd1cmF0aW9uLiAqLworICAgIEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfREVCVUdfRkxPV19DT05GSUdVUkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBEZWJ1ZyBmbG93IGNvbmZpZ3VyYXRpb24uICovCisgICAgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9NQUNfVEFCTEVfQ09VTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAvKio8IE1BQyB0YWJsZSBlbnRyeSBjb3VudC4gKi8KKyAgICBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX0ZPUkJJRERFTl9WTEFOX0ZMT1dfR0VNX1JBTkdFX1NUQVJUICAgICAgICAgICAgICA9IDgsICAgIC8qKjwgVmxhbiwgZmxvdywgR2VtIGZvcmJpZGRlbiByYW5nZSBzdGFydCB2YWx1ZS4gKi8KKyAgICBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25faXdmX2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25faXdmX2RzX2VncmVzc19mbG93X2NmZyAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1dfQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0NGR19JRF9HRU1fUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEdFTSBwb3J0LiAqLworICAgIEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19DRkdfSURfUEJJVF9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBQYml0IGNvbnRyb2wuICovCisgICAgQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0NGR19JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5IAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleV9pZAoreworICAgIEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19LRVlfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1dfS0VZX0lEX1BPTl9OSSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgUE9OIG5ldHdvcmsgaW50ZXJmYWNlLiAqLworICAgIEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19LRVlfSURfRkxPV19JRCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBGbG93IElELiAqLworICAgIEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19LRVlfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmcgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19pZAoreworICAgIEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0NGR19JRF9NQVBQSU5HX01FVEhPRCAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgTWFwcGluZyBtZXRob2QuICovCisgICAgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19DRkdfSURfTUFQUElOR19UQUcgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IE1hcHBpbmcgdGFnLiAqLworICAgIEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfQ0ZHX0lEX1ZMQU5fQUNUSU9OICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBWTEFOIGFjdGlvbi4gKi8KKyAgICBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0NGR19JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleSAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X2lkCit7CisgICAgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19LRVlfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfS0VZX0lEX1BPTl9OSSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBQT04gbmV0d29yayBpbnRlcmZhY2UuICovCisgICAgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19LRVlfSURfVkxBTl9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IHZsYW4gSUQuICovCisgICAgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19LRVlfSURfX05VTV9PRiAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfY29tcGxldGVkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfY29tcGxldGVkX2lkCit7CisgICAgQkNNT0xUX0dQT05fSVdGX0ZMVVNIX01BQ19UQUJMRV9DT01QTEVURURfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfY29tcGxldGVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9pZAoreworICAgIEJDTU9MVF9HUE9OX0lXRl9GTFVTSF9NQUNfVEFCTEVfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9JV0ZfRkxVU0hfTUFDX1RBQkxFX0lEX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgY29udHJvbC4gKi8KKyAgICBCQ01PTFRfR1BPTl9JV0ZfRkxVU0hfTUFDX1RBQkxFX0lEX1ZJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgVklELiAqLworICAgIEJDTU9MVF9HUE9OX0lXRl9GTFVTSF9NQUNfVEFCTEVfSURfRkxPV19JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBGTE9XIElELiAqLworICAgIEJDTU9MVF9HUE9OX0lXRl9GTFVTSF9NQUNfVEFCTEVfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2Zfa2V5IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX2l3Zl9rZXlfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9JV0ZfS0VZX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fSVdGX0tFWV9JRF9QT05fTkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFBPTiBuZXR3b3JrIGludGVyZmFjZS4gKi8KKyAgICBCQ01PTFRfR1BPTl9JV0ZfS0VZX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25faXdmX2tleV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25faXdmX21hY190YWJsZV9hdXRvX2NmZyAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGR19JRF9NQUNfQUdFRCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IE1BQyBBZ2VkLiAqLworICAgIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19DRkdfSURfTUFDX0RST1BQRUQgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBNQUMgRHJvcHBlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fQ0ZHX0lEX01BQ19NT1ZFICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgTUFDIE1vdmUuICovCisgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGR19JRF9ORVdfTUFDICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IE5ldyBNQUMuICovCisgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGR19JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZyAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2lkCit7CisgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9DRkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQ0ZHX0lEX0ZMT1dfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBGbG93IElELiAqLworICAgIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQ0ZHX0lEX1NUQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBzdGF0aWMuICovCisgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9DRkdfSURfR0VNX1BPUlRfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IEdFTSBQb3J0IElELiAqLworICAgIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQ0ZHX0lEX09OVV9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBPTlUgSUQuICovCisgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9DRkdfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X2lkCit7CisgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9LRVlfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfS0VZX0lEX1BPTl9OSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBQT04gbmV0d29yayBpbnRlcmZhY2UuICovCisgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9LRVlfSURfTUFDX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IE1BQyBhZGRyZXNzLiAqLworICAgIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfS0VZX0lEX1ZMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBWTEFOLiAqLworICAgIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfS0VZX0lEX19OVU1fT0YgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXlfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2FnZWQgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19hZ2VkX2lkCit7CisgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9NQUNfQUdFRF9JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19hZ2VkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9pZAoreworICAgIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfTUFDX0RST1BQRURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX01BQ19EUk9QUEVEX0lEX0ZMT1dfSUQgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgZmxvdyBJRC4gKi8KKyAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX01BQ19EUk9QUEVEX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9pZAoreworICAgIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfTUFDX01PVkVfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX01BQ19NT1ZFX0lEX09MRF9GTE9XX0lEICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgb2xkIGZsb3cgSUQuICovCisgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9NQUNfTU9WRV9JRF9ORVdfRkxPV19JRCAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IG5ldyBmbG93IGlkLiAqLworICAgIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfTUFDX01PVkVfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25faXdmX21hY190YWJsZV9uZXdfbWFjIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2lkCit7CisgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9ORVdfTUFDX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfTkVXX01BQ19JRF9GTE9XX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBmbG93IElELiAqLworICAgIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfTkVXX01BQ19JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9pZAoreworICAgIEJDTU9MVF9HUE9OX0lXRl9TQ0FOX01BQ19UQUJMRV9DT01QTEVURURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9JV0ZfU0NBTl9NQUNfVEFCTEVfQ09NUExFVEVEX0lEX01BQ19BRERSRVNTICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgTUFDIEFkZHJlc3MuICovCisgICAgQkNNT0xUX0dQT05fSVdGX1NDQU5fTUFDX1RBQkxFX0NPTVBMRVRFRF9JRF9FTlRSSUVTICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEVudHJpZXMuICovCisgICAgQkNNT0xUX0dQT05fSVdGX1NDQU5fTUFDX1RBQkxFX0NPTVBMRVRFRF9JRF9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25faXdmX3NjYW5fbWFjX3RhYmxlIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2lkCit7CisgICAgQkNNT0xUX0dQT05fSVdGX1NDQU5fTUFDX1RBQkxFX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX0lXRl9TQ0FOX01BQ19UQUJMRV9JRF9NQUNfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBNQUMgQWRkcmVzcy4gKi8KKyAgICBCQ01PTFRfR1BPTl9JV0ZfU0NBTl9NQUNfVEFCTEVfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9pZAoreworICAgIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0FMQVJNX0NMRUFSRURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdGlzdGljIElELiAqLworICAgIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2lkCit7CisgICAgQkNNT0xUX0dQT05fSVdGX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdGF0aXN0aWMgSUQuICovCisgICAgQkNNT0xUX0dQT05fSVdGX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2l3Zl9zdGF0X2NmZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9DRkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fSVdGX1NUQVRfQ0ZHX0lEX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IENvbmZpZ3VyYXRpb24uICovCisgICAgQkNNT0xUX0dQT05fSVdGX1NUQVRfQ0ZHX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2l3Zl9zdGF0IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2lkCit7CisgICAgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX0RTX0hJVF9FVkVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBEUyBoaXQgZXZlbnQuICovCisgICAgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfTUlTU19FVkVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IERTIG1pc3MgZXZlbnQuICovCisgICAgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfRFJPUF9EVUVfVE9fTUlTU19FVkVOVCAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IERTIGRyb3AgZHVlIHRvIG1pc3MgZXZlbnQuICovCisgICAgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfRFJPUF9EVUVfVE9fSElUX0VWRU5UICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IERTIGRyb3AgZHVlIHRvIGhpdCBldmVudC4gKi8KKyAgICBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9EU19EUk9QX1RPX0RJU0FCTEVEX0dFTSAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgRFMgZHJvcCB0byBkaXNhYmxlZCBHRU0uICovCisgICAgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfTkVXX01BQ19ESVNDT1ZFUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IE5ldyBNQUMgZGlzY292ZXJlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9NT1ZFX0VWRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgIC8qKjwgTW92ZSBldmVudC4gKi8KKyAgICBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9ORVdfTUFDX0RST1BfRFVFX1RPX0ZJRk9fRlVMTCAgICAgICAgICAgICAgICAgICA9IDcsICAgIC8qKjwgTmV3IE1BQyBkcm9wIGR1ZSB0byBmaWZvIGZ1bGwuICovCisgICAgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2ZfdXNfZmxvd19jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2lkCit7CisgICAgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9GTE9XX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBGbG93IElELiAqLworICAgIEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9NQUNfTEVBUk5JTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBNQUMgbGVhcm5pbmcuICovCisgICAgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX1ZMQU5fQUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IFZMQU4gYWN0aW9uLiAqLworICAgIEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9WTEFOX1RBRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBWbGFuIHRhZy4gKi8KKyAgICBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19DRkdfSURfVFBJRF9JTkRFWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgVFBJRCBpbmRleC4gKi8KKyAgICBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19DRkdfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2l3Zl91c19mbG93X2tleSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXlfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19LRVlfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfS0VZX0lEX1BPTl9OSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFBPTiBuZXR3b3JrIGludGVyZmFjZS4gKi8KKyAgICBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19LRVlfSURfR0VNX1BPUlRfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgR0VNIFBvcnQgIElELiAqLworICAgIEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0tFWV9JRF9fTlVNX09GICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXlfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGdwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZAoreworICAgIEJDTU9MVF9HUE9OX05JX0FDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRF9JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX25pX2F1dG9fY2ZnIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2lkCit7CisgICAgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0FDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBhY3RpdmF0ZSBhbGwgb251cyBjb21wbGV0ZWQuICovCisgICAgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfQ1BVX1BBQ0tFVFNfRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IENQVSBQYWNrZXRzIEZhaWx1cmUuICovCisgICAgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfREVBQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IGRlYWN0aXZhdGUgYWxsIG9udXMgY29tcGxldGVkLiAqLworICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0RJU0FCTEVfQUxMX09OVVNfQ09NUExFVEVEICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBkaXNhYmxlIGFsbCBvbnVzIGNvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9FTkFCTEVfQUxMX09OVVNfQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgZW5hYmxlIGFsbCBvbnVzIGNvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9MT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgTE9TLiAqLworICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX09OVV9ESVNDT1ZFUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBPTlUgRGlzY292ZXJlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9PTlVfVVBHUkFERV9DT01QTEVURSAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgIC8qKjwgT05VIFVwZ3JhZGUgQ29tcGxldGUuICovCisgICAgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRUQgICAgICAgICAgICAgPSA4LCAgICAvKio8IFByb3RlY3Rpb24gU3dpdGNoaW5nIE9OVXMgUmFuZ2VkLiAqLworICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVEICAgID0gOSwgICAgLyoqPCBQcm90ZWN0aW9uIFN3aXRjaGluZyBTd2l0Y2hvdmVyIENvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRSAgICAgICAgICA9IDEwLCAgIC8qKjwgUHJvdGVjdGlvbiBTd2l0Y2hpbmcgVHJhZmZpYyBSZXN1bWUuICovCisgICAgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAvKio8IFJvZ3VlIGRldGVjdGlvbiBjb21wbGV0ZWQuICovCisgICAgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfUk9HVUVfT05VX1NQRUNJQUxfTUFQX0NZQ0xFX1NUQVJUICAgICAgICAgICAgPSAxMiwgICAvKio8IFJvZ3VlIE9OVSBzcGVjaWFsIG1hcCBjeWNsZSBzdGFydC4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9TRVJJQUxfTlVNQkVSX0FDUVVJU0lUSU9OX0NZQ0xFX1NUQVJUICAgICAgICA9IDEzLCAgIC8qKjwgU2VyaWFsIE51bWJlciBBY3F1aXNpdGlvbiBDeWNsZSBTdGFydC4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRCAgICAgICA9IDE0LCAgIC8qKjwgU3RhbmRieSBQT04gTW9uaXRvcmluZyBDeWNsZSBDb21wbGV0ZWQuICovCisgICAgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNSwgICAvKio8IFN0YXQgQWxhcm0gQ2xlYXJlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2LCAgIC8qKjwgU3RhdCBBbGFybSBSYWlzZWQuICovCisgICAgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgPSAxNywgICAvKio8IFN0YXRlIENoYW5nZSBDb21wbGV0ZWQuICovCisgICAgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfVE9EX1JFUVVFU1RfQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICAgPSAxOCwgICAvKio8IFRPRCByZXF1ZXN0IGNvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9pZAoreworICAgIEJDTU9MVF9HUE9OX05JX0JST0FEQ0FTVF9QTE9BTV9QQUNLRVRfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9OSV9CUk9BRENBU1RfUExPQU1fUEFDS0VUX0lEX1BMT0FNICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgcGxvYW0uICovCisgICAgQkNNT0xUX0dQT05fTklfQlJPQURDQVNUX1BMT0FNX1BBQ0tFVF9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fbmlfY2ZnIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX25pX2NmZ19pZAoreworICAgIEJDTU9MVF9HUE9OX05JX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUE9OX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgUE9OIHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQVZBSUxBQkxFX0JBTkRXSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgQXZhaWxhYmxlIEJhbmR3aWR0aC4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfTlVNQkVSX09GX0FDVElWRV9PTlVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgbnVtYmVyIG9mIGFjdGl2ZSBvbnVzLiAqLworICAgIEJDTU9MVF9HUE9OX05JX0NGR19JRF9OVU1CRVJfT0ZfQUNUSVZFX1NUQU5EQllfT05VUyAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBudW1iZXIgb2YgYWN0aXZlIHN0YW5kYnkgb251cy4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUFJCU19TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgUFJCUyBzdGF0dXMuICovCisgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPTl9ESVNUQU5DRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IFBvbiBkaXN0YW5jZS4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUkFOR0lOR19XSU5ET1dfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgIC8qKjwgUmFuZ2luZyB3aW5kb3cgc2l6ZS4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUFJFQVNTSUdORURfRVFVQUxJWkFUSU9OX0RFTEFZICAgICAgICAgICAgICAgICAgICA9IDcsICAgIC8qKjwgUHJlLWFzc2lnbmVkIEVxdWFsaXphdGlvbiBEZWxheSBbYml0c10uICovCisgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0VRRF9DWUNMRVNfTlVNQkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAvKio8IEVxRCBtZWFzdXJlbWVudCBjeWNsZXMgbnVtYmVyLiAqLworICAgIEJDTU9MVF9HUE9OX05JX0NGR19JRF9QT1dFUl9MRVZFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgLyoqPCBQb3dlciBsZXZlbC4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfRFNfRkVDX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgIC8qKjwgRFMgRkVDIG1vZGUuICovCisgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RSSUZUX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAvKio8IERyaWZ0IGNvbnRyb2wuICovCisgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RTX0JFUl9SRVBPUlRJTkdfSU5URVJWQUwgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMiwgICAvKio8IERTIEJFUiByZXBvcnRpbmcgaW50ZXJ2YWwgaW4gbXMuICovCisgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0xPU19BTEFSTV9USFJFU0hPTEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMywgICAvKio8IExPUyBhbGFybSB0aHJlc2hvbGQuICovCisgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0xPU19JTklUSUFMX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNCwgICAvKio8IExPUyBpbml0aWFsIHZhbHVlLiAqLworICAgIEJDTU9MVF9HUE9OX05JX0NGR19JRF9PTlVfQUxBUk1TX1RIUkVTSE9MRFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUsICAgLyoqPCBPTlUgYWxhcm1zIHRocmVzaG9sZHMuICovCisgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0JFUl9NT05JVE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNiwgICAvKio8IEJFUiBtb25pdG9yaW5nIHBhcmFtcy4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUExPQU1fQUNLX1RJTUVPVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3LCAgIC8qKjwgUGxvYW0gQUNLIHRpbWVvdXQuICovCisgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX09OVV9BQ1RJVkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOCwgICAvKio8IE9OVSBhY3RpdmF0aW9uLiAqLworICAgIEJDTU9MVF9HUE9OX05JX0NGR19JRF9TTl9BQ1FVSVNJVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTksICAgLyoqPCBTTiBBY3F1aXNpdGlvbiAuICovCisgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0tFWV9FWENIQU5HRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMCwgICAvKio8IEtleSBleGNoYW5nZS4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxLCAgIC8qKjwgUHJvdGVjdGlvbiBzd2l0Y2hpbmcuICovCisgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0NCUl9SVF9BTExPQ0FUSU9OX1BST0ZJTEUgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMiwgICAvKio8IENCUiBSVCBBbGxvY2F0aW9uIHByb2ZpbGUuICovCisgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0NCUl9OUlRfQUxMT0NBVElPTl9QUk9GSUxFICAgICAgICAgICAgICAgICAgICAgICAgPSAyMywgICAvKio8IENCUiBOUlQgQWxsb2NhdGlvbiBQcm9maWxlLiAqLworICAgIEJDTU9MVF9HUE9OX05JX0NGR19JRF9EQkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjQsICAgLyoqPCBEQkEuICovCisgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPV0VSX01BTkFHRU1FTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNSwgICAvKio8IFBvd2VyIE1hbmFnZW1lbnQuICovCisgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1JPR1VFX09OVV9ERVRFQ1RJT05fUFJPQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgPSAyNiwgICAvKio8IFJvZ3VlIE9OVSBkZXRlY3Rpb24gcHJvY2Vzcy4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUEVSSU9ESUNfU1RBTkRCWV9QT05fTU9OSVRPUklORyAgICAgICAgICAgICAgICAgICA9IDI3LCAgIC8qKjwgUGVyaW9kaWMgU3RhbmRieSBQT04gbW9uaXRvcmluZy4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUFJCU19DSEVDS0VSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI4LCAgIC8qKjwgUFJCUyBDaGVja2VyLiAqLworICAgIEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkJTX0dFTkVSQVRPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjksICAgLyoqPCBQUkJTIEdlbmVyYXRvci4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfTUlOX0RBVEFfQUxMT0NfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMwLCAgIC8qKjwgTWluaW11bSBEYXRhIEFsbG9jIElELiAqLworICAgIEJDTU9MVF9HUE9OX05JX0NGR19JRF9BVVRPTUFUSUNfT05VX0RFQUNUSVZBVElPTiAgICAgICAgICAgICAgICAgICAgICAgID0gMzEsICAgLyoqPCBBdXRvbWF0aWMgT05VIGRlYWN0aXZhdGlvbi4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfVVNfQkFORFdJRFRIX0xJTUlUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyLCAgIC8qKjwgVVMgYmFuZHdpZHRoIExpbWl0LiAqLworICAgIEJDTU9MVF9HUE9OX05JX0NGR19JRF9BTExfT05VUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzMsICAgLyoqPCBhbGwgT05Vcy4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQUxMX01DQVNUX0dFTV9QT1JUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM0LCAgIC8qKjwgYWxsIG11bHRpY2FzdCBHRU0gcG9ydHMuICovCisgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RFQlVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNSwgICAvKio8IFBPTiBOSSBkZWJ1ZyBwYXJhbWV0ZXJzLiAqLworICAgIEJDTU9MVF9HUE9OX05JX0NGR19JRF9PTlVfVVBHUkFERV9QQVJBTVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzYsICAgLyoqPCBPTlUgdXBncmFkZSBwYXJhbXMuICovCisgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BTX0NfV0FJVF9CRUZPUkVfREVBQ1RJVkFUSU9OX1RJTUVPVVQgICAgICAgICAgICAgPSAzNywgICAvKio8IHByb3RlY3Rpb24gc3dpdGNoaW5nIHR5cGUgYyB3YWl0IGJlZm9yZSBkZWFjdGl2YXRpb24gdGltZW91dC4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQklQMzJfSU5ESUNBVElPTl9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM4LCAgIC8qKjwgYmlwMzIgaW5kaWNhdGlvbiBjb250cm9sLiAqLworICAgIEJDTU9MVF9HUE9OX05JX0NGR19JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmUgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2lkCit7CisgICAgQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfRkFJTFVSRV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0ZBSUxVUkVfSURfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBFcnJvci4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19GQUlMVVJFX0lEX0dFTV9QT1JUX0lEICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgR0VNIFBvcnQgSUQuICovCisgICAgQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfRkFJTFVSRV9JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9jcHVfcGFja2V0cyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19pZAoreworICAgIEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgcGFja2V0IHR5cGUuICovCisgICAgQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfSURfQ0FMQ19DUkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IGNhbGMgY3JjLiAqLworICAgIEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0lEX0dFTV9QT1JUX0xJU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBnZW0gcG9ydCBsaXN0LiAqLworICAgIEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0lEX0JVRkZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBidWZmZXIuICovCisgICAgQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkCit7CisgICAgQkNNT0xUX0dQT05fTklfREVBQ1RJVkFURV9BTExfT05VU19DT01QTEVURURfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkX2lkCit7CisgICAgQkNNT0xUX0dQT05fTklfRElTQUJMRV9BTExfT05VU19DT01QTEVURURfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlciBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9OSV9ESVNBQkxFX1NFUklBTF9OVU1CRVJfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IGNvbnRyb2wuICovCisgICAgQkNNT0xUX0dQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX1NFUklBTF9OVU1CRVIgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IHNlcmlhbCBudW1iZXIuICovCisgICAgQkNNT0xUX0dQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX19OVU1fT0YgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBncG9uX25pX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZAoreworICAgIEJDTU9MVF9HUE9OX05JX0VOQUJMRV9BTExfT05VU19DT01QTEVURURfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX25pX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX25pX2tleSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9uaV9rZXlfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9OSV9LRVlfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fTklfS0VZX0lEX1BPTl9OSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFBPTiBuZXR3b3JrIGludGVyZmFjZS4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9LRVlfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fbmlfa2V5X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9sb3MgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fbmlfbG9zX2lkCit7CisgICAgQkNNT0xUX0dQT05fTklfTE9TX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX05JX0xPU19JRF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBzdGF0dXMuICovCisgICAgQkNNT0xUX0dQT05fTklfTE9TX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX25pX2xvc19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fbmlfb251X2Rpc2NvdmVyZWQgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9pZAoreworICAgIEJDTU9MVF9HUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9TRVJJQUxfTlVNQkVSICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgc2VyaWFsIG51bWJlci4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9SQU5HSU5HX1RJTUUgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgcmFuZ2luZyB0aW1lLiAqLworICAgIEJDTU9MVF9HUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX09OVV9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBvbnVfaWQuICovCisgICAgQkNNT0xUX0dQT05fTklfT05VX0RJU0NPVkVSRURfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZSAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkCit7CisgICAgQkNNT0xUX0dQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdGF0dXMuICovCisgICAgQkNNT0xUX0dQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfTElTVF9PRl9GQUlMRURfRU5USVRJRVMgICAgICAgICAgPSAxLCAgICAvKio8IExpc3Qgb2YgZmFpbGVkIGVudGl0aWVzLiAqLworICAgIEJDTU9MVF9HUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19PTlVTX1JBTkdFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRURfSURfT05VUyAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgT05Vcy4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19PTlVTX1JBTkdFRF9JRF9fTlVNX09GICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9pZAoreworICAgIEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVEX0lEX19CRUdJTiAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRF9JRF9SRVNVTFQgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBSZXN1bHQuICovCisgICAgQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfU1dJVENIT1ZFUl9DT01QTEVURURfSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRV9JRF9fQkVHSU4gICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUVfSURfUkVTVUxUICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgUmVzdWx0LiAqLworICAgIEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FX0lEX19OVU1fT0YgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2lkCit7CisgICAgQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFlQRV9DX1NFVF9NVUxUSVBMRV9PTlVfU1RBVEVfSURfX0JFR0lOICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFlQRV9DX1NFVF9NVUxUSVBMRV9PTlVfU1RBVEVfSURfT05VX1NUQVRFICA9IDAsICAgIC8qKjwgb251IHN0YXRlLiAqLworICAgIEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1RZUEVfQ19TRVRfTVVMVElQTEVfT05VX1NUQVRFX0lEX09OVV9MSVNUICAgPSAxLCAgICAvKio8IG9udSBsaXN0LiAqLworICAgIEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1RZUEVfQ19TRVRfTVVMVElQTEVfT05VX1NUQVRFX0lEX19OVU1fT0YgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9yZXNldCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9uaV9yZXNldF9pZAoreworICAgIEJDTU9MVF9HUE9OX05JX1JFU0VUX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9yZXNldF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1dJTkRPV19UWVBFICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBXaW5kb3cgdHlwZS4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX01FQVNVUkVNRU5UX1NUQVRVUyAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBNZWFzdXJlbWVudCBzdGF0dXMuICovCisgICAgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9BTExPQ19JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgQWxsb2MgSUQuICovCisgICAgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9PTlVfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgT05VIElELiAqLworICAgIEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfSVNfREVMSU5FQVRJT04gICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IElzIGRlbGluZWF0aW9uLiAqLworICAgIEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfSVNfRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IElzIEVELiAqLworICAgIEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUlhfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAvKio8IFJlY2VpdmVkIGRhdGEuICovCisgICAgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9QTE9BTV9SRUNFSVZFRF9PTlVfSUQgICAgICAgICAgICAgICA9IDcsICAgIC8qKjwgcGxvYW1fcmVjZWl2ZWRfb251X2lkLiAqLworICAgIEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUExPQU1fUkVDRUlWRURfQ1JDX0VSUk9SICAgICAgICAgICAgPSA4LCAgICAvKio8IHBsb2FtX3JlY2VpdmVkX2NyY19lcnJvci4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3cgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19pZAoreworICAgIEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfV0lORE9XX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFdpbmRvdyB0eXBlLiAqLworICAgIEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfQUxMT0NfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEFsbG9jIElELiAqLworICAgIEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfT05VX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IE9OVSBJRC4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX1NFQ09ORF9SQU5HSU5HX1dJTkRPVyAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBTZWNvbmQgcmFuZ2luZyB3aW5kb3cuICovCisgICAgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9fTlVNX09GICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZ3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X2lkCit7CisgICAgQkNNT0xUX0dQT05fTklfUk9HVUVfT05VX1NQRUNJQUxfTUFQX0NZQ0xFX1NUQVJUX0lEX19OVU1fT0YgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBncG9uX25pX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fbmlfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydF9pZAoreworICAgIEJDTU9MVF9HUE9OX05JX1NFUklBTF9OVU1CRVJfQUNRVUlTSVRJT05fQ1lDTEVfU1RBUlRfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX25pX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX25pX3NldF9vbnVfc3RhdGUgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZV9pZAoreworICAgIEJDTU9MVF9HUE9OX05JX1NFVF9PTlVfU1RBVEVfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX05JX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IE9OVSBzdGF0ZS4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9TRVRfT05VX1NUQVRFX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9OSV9TRVRfUE9OX1NUQVRFX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9OSV9TRVRfUE9OX1NUQVRFX0lEX1BPTl9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBQT04gc3RhdGUuICovCisgICAgQkNNT0xUX0dQT05fTklfU0VUX1BPTl9TVEFURV9JRF9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZ3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9OSV9TSU5HTEVfUkVRVUVTVF9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2lkCit7CisgICAgQkNNT0xUX0dQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9OSV9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRF9JRF9OVU1CRVJfT0ZfREVURUNURURfREVMSU1JVEVSICAgPSAwLCAgICAvKio8IG51bWJlciBvZiBkZXRlY3RlZCBkZWxpbWl0ZXIuICovCisgICAgQkNNT0xUX0dQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURURfSURfRU5FUkdZX0RFVEVDVF9TSUdOQUwgICAgICAgICAgID0gMSwgICAgLyoqPCBlbmVyZ3kgZGV0ZWN0IHNpZ25hbC4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRF9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX25pX3N0YXJ0X29udV91cGdyYWRlIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9OSV9TVEFSVF9PTlVfVVBHUkFERV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX05JX1NUQVJUX09OVV9VUEdSQURFX0lEX0xJU1RfT0ZfT05VX0lEUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgTGlzdCBvZiBPTlUgSURzLiAqLworICAgIEJDTU9MVF9HUE9OX05JX1NUQVJUX09OVV9VUEdSQURFX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkCit7CisgICAgQkNNT0xUX0dQT05fTklfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFN0YXRpc3RpYyBJRC4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWQgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZAoreworICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fTklfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdGF0aXN0aWMgSUQuICovCisgICAgQkNNT0xUX0dQT05fTklfU1RBVF9BTEFSTV9SQUlTRURfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9zdGF0X2NmZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZ19pZAoreworICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fTklfU1RBVF9DRkdfSURfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBDb25maWd1cmF0aW9uLiAqLworICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfQ0ZHX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX25pX3N0YXQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fbmlfc3RhdF9pZAoreworICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9GRUNfQ09ERVdPUkRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBSZWNlaXZlZCBGRUMgY29kZXdvcmRzLiAqLworICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfRkVDX0NPREVXT1JEU19VTkNPUlJFQ1RFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgUmVjZWl2ZWQgdW5jb3JyZWN0ZWQgRkVDIGNvZGV3b3Jkcy4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX0JJUDhfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IFJlY2VpdmVkIGJ5dGVzIHByb3RlY3RlZCBieSBiaXA4LiAqLworICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfQklQOF9FUlJPUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgUmVjZWl2ZWQgYmlwOCBlcnJvcnMuICovCisgICAgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9HRU1fUEFDS0VUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgLyoqPCBSZWNlaXZlZCBHRU0gZnJhbWVzLiAqLworICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0RST1BQRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgUmVjZWl2ZWQgZHJvcHBlZCBHRU0gSUQgcGFja2V0cy4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9JRExFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAvKio8IFJlY2VpdmVkIGlkbGUgR0VNIGZyYW1lcy4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9DT1JSRUNURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAvKio8IFJlY2VpdmVkIGNvcnJlY3RlZCBHRU0gZnJhbWVzLiAqLworICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0lMTEVHQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgIC8qKjwgUmVjZWl2ZWQgaWxsZWdhbCBHRU0gZnJhbWVzLiAqLworICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfVkFMSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgIC8qKjwgUmVjZWl2ZWQgdmFsaWQgYWxsb2NhdGlvbnMuICovCisgICAgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19JTlZBTElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgLyoqPCBSZWNlaXZlZCBpbnZhbGlkIGFsbG9jYXRpb25zLiAqLworICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfRElTQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExLCAgIC8qKjwgUmVjZWl2ZWQgZGlzYWJsZWQgYWxsb2NhdGlvbnMuICovCisgICAgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9QTE9BTVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIsICAgLyoqPCBSZWNlaXZlZCBQbG9hbXMuICovCisgICAgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfTk9OX0lETEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMsICAgLyoqPCBSZWNlaXZlZCBub24gaWRsZSBQbG9hbXMuICovCisgICAgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQsICAgLyoqPCBSZWNlaXZlZCBlcnJvciBQbG9hbXMuICovCisgICAgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfRFJPUFBFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUsICAgLyoqPCBSZWNlaXZlZCBkcm9wcGVkIFBsb2Ftcy4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0NQVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNiwgICAvKio8IFJlY2VpdmVkIENQVSBwYWNrZXRzLiAqLworICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfT01DSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3LCAgIC8qKjwgUmVjZWl2ZWQgT01DSSBwYWNrZXRzLiAqLworICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4LCAgIC8qKjwgUmVjZWl2ZWQgT01DSSBwYWNrZXRzIHdpdGggQ1JDIGVycm9ycy4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0RST1BQRURfVE9PX1NIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOSwgICAvKio8IFJlY2VpdmVkIHBhY2tldHMgZHJvcHBlZCBkdWUgdG8gbGVuZ3RoIHRvbyBzaG9ydC4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0RST1BQRURfVE9PX0xPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMCwgICAvKio8IFJlY2VpdmVkIHBhY2tldCBkcm9wcGVkIGR1ZSB0byBsZW5ndGggdG9vIGxvbmcuICovCisgICAgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9DUkNfRVJST1JTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjEsICAgLyoqPCBSZWNlaXZlZCBwYWNrZXQgZHJvcHBlZCBkdWUgdG8gY3JjIGVycm9yLiAqLworICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfS0VZX0VSUk9SUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIyLCAgIC8qKjwgUmVjZWl2ZWQgcGFja2V0IGRyb3BwZWQgZHVlIHRvIGtleSBlcnJvci4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0ZSQUdNRU5UU19FUlJPUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMywgICAvKio8IFJlY2VpdmVkIHBhY2tldCBkcm9wcGVkIGR1ZSB0byBmcmFnbWVudGF0aW9uIGVycm9yLiAqLworICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUEFDS0VUU19EUk9QUEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0LCAgIC8qKjwgR2xvYmFsIGRyb3BwZWQgcGFja2V0cy4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0dFTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNSwgICAvKio8IFRyYW5zbWl0dGVkIEdFTSBmcmFtZXMuICovCisgICAgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9QTE9BTVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjYsICAgLyoqPCBUcmFuc21pdHRlZCBQbG9hbXMuICovCisgICAgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9HRU1fRlJBR01FTlRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjcsICAgLyoqPCBUcmFuc21pdHRlZCBHRU0gZnJhZ21lbnRzLiAqLworICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfQ1BVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI4LCAgIC8qKjwgVHJhbnNtaXR0ZWQgQ1BVIHBhY2tldHMuICovCisgICAgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9PTUNJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjksICAgLyoqPCBUcmFuc21pdHRlZCBPTUNJIHBhY2tldHMuICovCisgICAgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9DUFVfT01DSV9QQUNLRVRTX0RST1BQRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzAsICAgLyoqPCBUcmFuc21pdCBwYWNrZXRzIGRyb3BwZWQgZHVlIHRvIGlsbGVnYWwgbGVuZ3RoLiAqLworICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9JTExFR0FMX0xFTkdUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMxLCAgIC8qKjwgVHJhbnNtaXR0ZWQgcGFja2V0IGRyb3BwZWQgZHVlIHRvIGlsbGVnYWwgbGVuZ3RoLiAqLworICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9UUElEX01JU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyLCAgIC8qKjwgRHJvcHBlZCBiZWNhdXNlIG9mIFRQSUQgbWlzcy4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfVklEX01JU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMywgICAvKio8IERyb3BwZWQgYmVjYXVzZSBvZiBWSUQgbWlzcy4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fbmlfc3RhdF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfUkVTVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgUmVzdWx0LiAqLworICAgIEJDTU9MVF9HUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfUFJFVklPVVNfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgUHJldmlvdXMgc3RhdGUuICovCisgICAgQkNNT0xUX0dQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9ORVdfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBOZXcgc3RhdGUuICovCisgICAgQkNNT0xUX0dQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkCit7CisgICAgQkNNT0xUX0dQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfVE9EX1NUUklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IHRvZF9zdHJpbmcuICovCisgICAgQkNNT0xUX0dQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1NGQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBzZmMuICovCisgICAgQkNNT0xUX0dQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1JUQ19PRkZTRVRfU0VDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBydGNfb2Zmc2V0X3NlYy4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfUlRDX09GRlNFVF9OU0VDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IHJ0Y19vZmZzZXRfbnNlYy4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fbmlfdG9kX3JlcXVlc3QgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9OSV9UT0RfUkVRVUVTVF9JRF9fTlVNX09GICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfYXV0b19jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2lkCit7CisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfQkVSX0lOVEVSVkFMX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEJFUiBJbnRlcnZhbCBDb25maWd1cmF0aW9uIENvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfREZJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFJlY2VpdmUgRHlpbmctR2FzcCBvZiBPTlVpLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9ER0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgUmVjZWl2ZSBEeWluZy1HYXNwIG9mIE9OVWkuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0RPV0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBEcmlmdCBvZiBXaW5kb3cgb2YgT05VaS4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IEVSUi4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfSU5WQUxJRF9EQlJVX1JFUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IEludmFsaWQgREJSdSBSZXBvcnQuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBLZXkgRXhjaGFuZ2UgQ29tcGxldGVkLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfQ1lDTEVfU0tJUFBFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgIC8qKjwgS2V5IEV4Y2hhbmdlIEN5Y2xlIFNraXBwZWQuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9ERUNSWVBUX1JFUVVJUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgLyoqPCBLZXkgRXhjaGFuZ2UgRGVjcnlwdCBSZXF1aXJlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5LCAgICAvKio8IEtleSBFeGNoYW5nZSBLZXkgTWlzbWF0Y2guICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9LRVlfUkVRVUVTVF9USU1FT1VUICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgLyoqPCBLZXkgRXhjaGFuZ2UgS2V5IFJlcXVlc3QgVGltZW91dC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX1VOQ09OU0VDVVRJVkVfSU5ERVggICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAvKio8IEtleSBFeGNoYW5nZSBVbmNvbnNlY3V0aXZlIEluZGV4LiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9MT0FJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyLCAgIC8qKjwgTE9BaS4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfTE9LSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMywgICAvKio8IExPa2kuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX01FTUkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQsICAgLyoqPCBNRU1pLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTUNJX1BPUlRfSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICA9IDE1LCAgIC8qKjwgT01DSSBQT1JUIElEIENvbmZpZ3VyYXRpb24gQ29tcGxldGVkLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfQUNUSVZBVElPTl9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2LCAgIC8qKjwgT05VIEFjdGl2YXRpb24gQ29tcGxldGVkLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfQUNUSVZBVElPTl9TVEFOREJZX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3LCAgIC8qKjwgb251IGFjdGl2YXRpb24gc3RhbmRieSBjb21wbGV0ZWQuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9BTEFSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgsICAgLyoqPCBPTlUgQWxhcm0uICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTksICAgLyoqPCBPTlUgRGVhY3RpdmF0aW9uIENvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0RJU0FCTEVfQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMCwgICAvKio8IE9OVSBEaXNhYmxlIENvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0VOQUJMRV9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMSwgICAvKio8IE9OVSBFbmFibGUgQ29tcGxldGVkLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PUFRJQ0FMX1JFRkxFQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIyLCAgIC8qKjwgT3B0aWNhbCBSZWZsZWN0aW9uLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzLCAgIC8qKjwgUGFzc3dvcmQgQXV0aGVudGljYXRpb24gQ29tcGxldGVkLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9QRUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0LCAgIC8qKjwgUEVFLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9QT1NTSUJMRV9EUklGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1LCAgIC8qKjwgUG9zc2libGUgRHJpZnQuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjYsICAgLyoqPCBQb3dlciBNYW5hZ2VtZW50IFN0YXRlIENoYW5nZS4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUFNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNywgICAvKio8IFBTVC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUkFOR0lOR19DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOCwgICAvKio8IFJhbmdpbmcgQ29tcGxldGVkLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9SRUkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI5LCAgIC8qKjwgUkVJLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMwLCAgIC8qKjwgUlNTSSBNZWFzdXJlbWVudCBDb21wbGV0ZWQuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1NESSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzEsICAgLyoqPCBTaWduYWwgRGVncmFkZWQgb2YgT05VaS4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU0ZJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMiwgICAvKio8IFNpZ25hbCBGYWlsIG9mIE9OVWkuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzMsICAgLyoqPCBTdGF0IEFsYXJtIENsZWFyZWQuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzQsICAgLyoqPCBTdGF0IEFsYXJtIFJhaXNlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU1VGSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNSwgICAvKio8IFNVRmkuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1RJV0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzYsICAgLyoqPCBUcmFuc21pc3Npb24gSW50ZXJmZXJlbmNlIFdhcm5pbmcuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGdwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkCit7CisgICAgQkNNT0xUX0dQT05fT05VX0JFUl9JTlRFUlZBTF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9PTlVfQkVSX0lOVEVSVkFMX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX0JFUl9JTlRFUlZBTCAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEJFUiBpbnRlcnZhbCBpbiBtcy4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQkVSX0lOVEVSVkFMX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX1JFU1VMVCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFJlc3VsdC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQkVSX0lOVEVSVkFMX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfY2ZnIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX29udV9jZmdfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX09OVV9DRkdfSURfT05VX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgb251IHN0YXRlLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9DRkdfSURfU0VSSUFMX05VTUJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgU2VyaWFsIG51bWJlci4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX1BBU1NXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IHBhc3N3b3JkLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQVVUT19QQVNTV09SRF9MRUFSTklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgYXV0byBwYXNzd29yZCBsZWFybmluZy4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX1VTX0ZFQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IFVTIEZFQy4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX09NQ0lfUE9SVF9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IE9NQ0kgcG9ydCBJRC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0RTX0JFUl9SRVBPUlRJTkdfSU5URVJWQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAvKio8IERTIEJFUiByZXBvcnRpbmcgaW50ZXJ2YWwgaW4gbXMuICovCisgICAgQkNNT0xUX0dQT05fT05VX0NGR19JRF9BRVNfRU5DUllQVElPTl9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgLyoqPCBBRVMgZW5jcnlwdGlvbiBrZXkuICovCisgICAgQkNNT0xUX0dQT05fT05VX0NGR19JRF9BTEFSTV9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgLyoqPCBhbGFybSBzdGF0ZS4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX1JBTkdJTkdfVElNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5LCAgICAvKio8IHJhbmdpbmcgdGltZS4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0RJU0FCTEVEX0FGVEVSX0RJU0NPVkVSWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwgICAvKio8IERpc2FibGVkIGFmdGVyIERpc2NvdmVyeS4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0RFQUNUSVZBVElPTl9SRUFTT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAvKio8IGRlYWN0aXZhdGlvbiByZWFzb24uICovCisgICAgQkNNT0xUX0dQT05fT05VX0NGR19JRF9BTExfR0VNX1BPUlRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIsICAgLyoqPCBhbGwgR0VNIHBvcnRzLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQUxMX0FMTE9DUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgIC8qKjwgYWxsIGFsbG9jcy4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX09OVV9QU19UWVBFX0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNCwgICAvKio8IG9udSBwcm90ZWN0aW9uIHN3aXRjaGluZyB0eXBlIGMuICovCisgICAgQkNNT0xUX0dQT05fT05VX0NGR19JRF9FWFRFTkRFRF9HVUFSRF9USU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUsICAgLyoqPCBFeHRlbmRlZCBHdWFyZCBUaW1lLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9DRkdfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9pZAoreworICAgIEJDTU9MVF9HUE9OX09OVV9DSEFOR0VfUE9XRVJfTEVWRUxfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fT05VX0NIQU5HRV9QT1dFUl9MRVZFTF9JRF9QT1dFUl9MRVZFTF9BQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBwb3dlciBsZXZlbCBhY3Rpb24uICovCisgICAgQkNNT0xUX0dQT05fT05VX0NIQU5HRV9QT1dFUl9MRVZFTF9JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfY3B1X3BhY2tldCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9pZAoreworICAgIEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRfSURfUE9SVF9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBwb3J0X2lkLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUX0lEX0NSQ19PSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgY3JjX29rLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUX0lEX1BBQ0tFVF9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgcGFja2V0X3NpemUuICovCisgICAgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRfSURfQlVGRkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBidWZmZXIuICovCisgICAgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9jcHVfcGFja2V0cyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgcGFja2V0IHR5cGUuICovCisgICAgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRTX0lEX0NBTENfQ1JDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBjYWxjIGNyYy4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfTlVNQkVSX09GX1BBQ0tFVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IG51bWJlciBvZiBwYWNrZXRzLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgU2luZ2xlIHBhY2tldCBzaXplLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9CVUZGRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgYnVmZmVyLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X2RmaSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9vbnVfZGZpX2lkCit7CisgICAgQkNNT0xUX0dQT05fT05VX0RGSV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9PTlVfREZJX0lEX0FMQVJNX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IGFsYXJtIHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfREZJX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fb251X2RmaV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X2RnaSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9vbnVfZGdpX2lkCit7CisgICAgQkNNT0xUX0dQT05fT05VX0RHSV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9PTlVfREdJX0lEX0FMQVJNX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IGFsYXJtIHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfREdJX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fb251X2RnaV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X2Rvd2kgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fb251X2Rvd2lfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9PTlVfRE9XSV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX09OVV9ET1dJX0lEX0FMQVJNX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQWxhcm0gc3RhdHVzLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9ET1dJX0lEX0RSSUZUX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgRHJpZnQgdmFsdWUuICovCisgICAgQkNNT0xUX0dQT05fT05VX0RPV0lfSURfTkVXX0VRRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBOZXcgRVFELiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9ET1dJX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfZG93aV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X2VyciBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9vbnVfZXJyX2lkCit7CisgICAgQkNNT0xUX0dQT05fT05VX0VSUl9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9PTlVfRVJSX0lEX0JJUDhfRVJST1JTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEJJUDggZXJyb3JzLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9FUlJfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfZXJyX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydCAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2lkCit7CisgICAgQkNNT0xUX0dQT05fT05VX0lOVkFMSURfREJSVV9SRVBPUlRfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9PTlVfSU5WQUxJRF9EQlJVX1JFUE9SVF9JRF9BTExPQ19JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEFsbG9jLUlELiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9JTlZBTElEX0RCUlVfUkVQT1JUX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0NPTVBMRVRFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfQ09NUExFVEVEX0lEX05FV19LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgbmV3IGtleS4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0NPTVBMRVRFRF9JRF9fTlVNX09GICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGdwb25fb251X2tleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZF9pZAoreworICAgIEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfQ1lDTEVfU0tJUFBFRF9JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGdwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9pZAoreworICAgIEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfREVDUllQVF9SRVFVSVJFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9ERUNSWVBUX1JFUVVJUkVEX0lEX05FV19LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBuZXcga2V5LiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfREVDUllQVF9SRVFVSVJFRF9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkCit7CisgICAgQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0hfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSF9JRF9FWFBFQ1RFRF9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IGV4cGVjdGVkIGtleS4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSF9JRF9SRUNFSVZFRF9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IHJlY2VpdmVkIGtleS4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSF9JRF9fTlVNX09GICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9SRVFVRVNUX1RJTUVPVVRfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXggZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2lkCit7CisgICAgQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9VTkNPTlNFQ1VUSVZFX0lOREVYX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX1VOQ09OU0VDVVRJVkVfSU5ERVhfSURfRVhQRUNURURfSU5ERVggICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IGV4cGVjdGVkIGluZGV4LiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfVU5DT05TRUNVVElWRV9JTkRFWF9JRF9BQ1RVQUxfSU5ERVggICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgYWN0dWFsIGluZGV4LiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfVU5DT05TRUNVVElWRV9JTkRFWF9JRF9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfa2V5IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX29udV9rZXlfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9PTlVfS0VZX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX09OVV9LRVlfSURfUE9OX05JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgUE9OIG5ldHdvcmsgaW50ZXJmYWNlLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9LRVlfSURfT05VX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgT05VIElELiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9LRVlfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfbG9haSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9vbnVfbG9haV9pZAoreworICAgIEJDTU9MVF9HUE9OX09OVV9MT0FJX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fT05VX0xPQUlfSURfQUxBUk1fU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBhbGFybSBzdGF0dXMuICovCisgICAgQkNNT0xUX0dQT05fT05VX0xPQUlfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX29udV9sb2FpX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfbG9raSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9vbnVfbG9raV9pZAoreworICAgIEJDTU9MVF9HUE9OX09OVV9MT0tJX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fT05VX0xPS0lfSURfQUxBUk1fU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBhbGFybSBzdGF0dXMuICovCisgICAgQkNNT0xUX0dQT05fT05VX0xPS0lfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX29udV9sb2tpX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfbWVtaSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9vbnVfbWVtaV9pZAoreworICAgIEJDTU9MVF9HUE9OX09OVV9NRU1JX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fT05VX01FTUlfSURfUExPQU1fQlVGRkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBQTE9BTSBidWZmZXIuICovCisgICAgQkNNT0xUX0dQT05fT05VX01FTUlfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX29udV9tZW1pX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfb21jaV9wYWNrZXQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2lkCit7CisgICAgQkNNT0xUX0dQT05fT05VX09NQ0lfUEFDS0VUX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfUE9SVF9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IHBvcnRfaWQuICovCisgICAgQkNNT0xUX0dQT05fT05VX09NQ0lfUEFDS0VUX0lEX0NSQ19PSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBjcmNfb2suICovCisgICAgQkNNT0xUX0dQT05fT05VX09NQ0lfUEFDS0VUX0lEX1BBQ0tFVF9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBwYWNrZXRfc2l6ZS4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfQlVGRkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IGJ1ZmZlci4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGdwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkCit7CisgICAgQkNNT0xUX0dQT05fT05VX09NQ0lfUE9SVF9JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9PTlVfT01DSV9QT1JUX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX0dFTV9QT1JUICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEdFTSBQb3J0IElELiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9PTUNJX1BPUlRfSURfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgc3RhdHVzLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9PTUNJX1BPUlRfSURfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfT1BFUkFUSU9OICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgT3BlcmF0aW9uLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9PTUNJX1BPUlRfSURfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2lkCit7CisgICAgQkNNT0xUX0dQT05fT05VX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IGZhaWwgcmVhc29uLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGdwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9pZAoreworICAgIEJDTU9MVF9HUE9OX09OVV9PTlVfQUNUSVZBVElPTl9TVEFOREJZX0NPTVBMRVRFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fT05VX09OVV9BQ1RJVkFUSU9OX1NUQU5EQllfQ09NUExFVEVEX0lEX1JFU1VMVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCByZXN1bHQuICovCisgICAgQkNNT0xUX0dQT05fT05VX09OVV9BQ1RJVkFUSU9OX1NUQU5EQllfQ09NUExFVEVEX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9vbnVfYWxhcm0gZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fb251X29udV9hbGFybV9pZAoreworICAgIEJDTU9MVF9HUE9OX09OVV9PTlVfQUxBUk1fSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fT05VX09OVV9BTEFSTV9JRF9PTlVfQUxBUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBvbnUgYWxhcm0uICovCisgICAgQkNNT0xUX0dQT05fT05VX09OVV9BTEFSTV9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fb251X29udV9hbGFybV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2lkCit7CisgICAgQkNNT0xUX0dQT05fT05VX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9PTlVfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURURfSURfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURURfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9pZAoreworICAgIEJDTU9MVF9HUE9OX09OVV9PTlVfRElTQUJMRV9DT01QTEVURURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fT05VX09OVV9ESVNBQkxFX0NPTVBMRVRFRF9JRF9TRVJJQUxfTlVNQkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBzZXJpYWwgbnVtYmVyLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9PTlVfRElTQUJMRV9DT01QTEVURURfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9pZAoreworICAgIEJDTU9MVF9HUE9OX09OVV9PTlVfRU5BQkxFX0NPTVBMRVRFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fT05VX09OVV9FTkFCTEVfQ09NUExFVEVEX0lEX1NFUklBTF9OVU1CRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBzZXJpYWwgbnVtYmVyLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9PTlVfRU5BQkxFX0NPTVBMRVRFRF9JRF9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fb251X29wdGljYWxfcmVmbGVjdGlvbl9pZAoreworICAgIEJDTU9MVF9HUE9OX09OVV9PUFRJQ0FMX1JFRkxFQ1RJT05fSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fb251X29wdGljYWxfcmVmbGVjdGlvbl9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9PTlVfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fQ09NUExFVEVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX09OVV9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9DT01QTEVURURfSURfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgc3RhdHVzLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9DT01QTEVURURfSURfRkFJTF9SRUFTT04gICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgZmFpbCByZWFzb24uICovCisgICAgQkNNT0xUX0dQT05fT05VX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFRF9JRF9QQVNTV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBwYXNzd29yZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fQ09NUExFVEVEX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfcGVlIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX29udV9wZWVfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9PTlVfUEVFX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX09OVV9QRUVfSURfQUxBUk1fU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgYWxhcm0gc3RhdHVzLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9QRUVfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfcGVlX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfcGxvYW1fcGFja2V0IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9PTlVfUExPQU1fUEFDS0VUX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX09OVV9QTE9BTV9QQUNLRVRfSURfUExPQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgcGxvYW0uICovCisgICAgQkNNT0xUX0dQT05fT05VX1BMT0FNX1BBQ0tFVF9JRF9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0IAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2lkCit7CisgICAgQkNNT0xUX0dQT05fT05VX1BPU1NJQkxFX0RSSUZUX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9PTlVfUE9TU0lCTEVfRFJJRlRfSURfQUxBUk1fU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEFsYXJtIFN0YXR1cy4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfUE9TU0lCTEVfRFJJRlRfSURfRVNUSU1BVEVEX0RSSUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEVzdGltYXRlZCBEcmlmdC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfUE9TU0lCTEVfRFJJRlRfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiBncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9PTlVfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0VfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9PTERfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgT2xkIFN0YXRlLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9ORVdfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgTmV3IFN0YXRlLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9SRUFTT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgUmVhc29uLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfcHN0IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX29udV9wc3RfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9PTlVfUFNUX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX09OVV9QU1RfSURfTElOS19OVU1CRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgbGluayBudW1iZXIuICovCisgICAgQkNNT0xUX0dQT05fT05VX1BTVF9JRF9LMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBLMS4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfUFNUX0lEX0syICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IEsyLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9QU1RfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfcHN0X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWQgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgc3RhdHVzLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgZmFpbCByZWFzb24uICovCisgICAgQkNNT0xUX0dQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX05VTUJFUl9PRl9QTE9BTVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBudW1iZXIgb2YgUExPQU1zLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9FUUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgRVFELiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9QT1dFUl9MRVZFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgUG93ZXIgTGV2ZWwuICovCisgICAgQkNNT0xUX0dQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9yZWkgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fb251X3JlaV9pZAoreworICAgIEJDTU9MVF9HUE9OX09OVV9SRUlfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fT05VX1JFSV9JRF9CSVA4X0VSUk9SUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBCSVA4IGVycm9ycy4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfUkVJX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fb251X3JlaV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkCit7CisgICAgQkNNT0xUX0dQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9PTlVfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfRkFJTF9SRUFTT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IGZhaWwgcmVhc29uLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9yc3NpX21lYXN1cmVtZW50IAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9PTlVfUlNTSV9NRUFTVVJFTUVOVF9JRF9fTlVNX09GICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9zZGkgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fb251X3NkaV9pZAoreworICAgIEJDTU9MVF9HUE9OX09OVV9TRElfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fT05VX1NESV9JRF9BTEFSTV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBhbGFybSBzdGF0dXMuICovCisgICAgQkNNT0xUX0dQT05fT05VX1NESV9JRF9CRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBCRVIuICovCisgICAgQkNNT0xUX0dQT05fT05VX1NESV9JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX29udV9zZGlfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9zZXRfb251X3N0YXRlIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9PTlVfU0VUX09OVV9TVEFURV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX09OVV9TRVRfT05VX1NUQVRFX0lEX09OVV9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgT05VIHN0YXRlLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9TRVRfT05VX1NUQVRFX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X3NmaSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9vbnVfc2ZpX2lkCit7CisgICAgQkNNT0xUX0dQT05fT05VX1NGSV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9PTlVfU0ZJX0lEX0FMQVJNX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IGFsYXJtIHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfU0ZJX0lEX0JFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEJFUi4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfU0ZJX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fb251X3NmaV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZCAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX09OVV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdGlzdGljIElELiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2lkCit7CisgICAgQkNNT0xUX0dQT05fT05VX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFN0YXRpc3RpYyBJRC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9BTEFSTV9SQUlTRURfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X3N0YXRfY2ZnIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19pZAoreworICAgIEJDTU9MVF9HUE9OX09OVV9TVEFUX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fT05VX1NUQVRfQ0ZHX0lEX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBDb25maWd1cmF0aW9uLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9TVEFUX0NGR19JRF9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfc3RhdCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9pZAoreworICAgIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBUb3RhbCByZWNlaXZlZCBGRUMgY29kZXdvcmRzLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0ZFQ19CWVRFU19DT1JSRUNURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgRkVDIGNvZGV3b3JkcyBjb3JyZWN0ZWQgYnl0ZXMuICovCisgICAgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEU19DT1JSRUNURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBGRUMgY29ycmVjdGVkIGNvZGV3b3JkcyBlcnJvciAuICovCisgICAgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEU19VTkNPUlJFQ1RFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBGRUMgbm90IGNvcnJlY3RlZCBjb2Rld29yZHMgZXJyb3IuICovCisgICAgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfQklQOF9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgLyoqPCBSZWNlaXZlZCBieXRlcyBmb3IgQklQOC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9CSVA4X0VSUk9SUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IEJpdCBlcnJvciBhY2NvcmRpbmcgdG8gQklQOC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfQ1JDX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAvKio8IFJlY2VpdmVkIFBMT0FNcyB3aXRoIENSQyBlcnJvci4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfTk9OX0lETEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAvKio8IFJlY2VpdmVkIG5vbiBpZGxlIFBMT0FNcy4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9QT1NJVElWRV9EUklGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAvKio8IFBvc2l0aXZlIGRyaWZ0LiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX05FR0FUSVZFX0RSSUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgIC8qKjwgTmVnYXRpdmUgZHJpZnQuICovCisgICAgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfT01DSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgLyoqPCBSZWNlaXZlZCBPTUNJIHBhY2tldHMuICovCisgICAgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEsICAgLyoqPCBSZWNlaXZlZCBPTUNJIHBhY2tldHMgd2l0aCBDUkMgZXJyb3JzLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0JFUl9SRVBPUlRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyLCAgIC8qKjwgQkVSIHJlcG9ydGVkLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1VOUkVDRUlWRURfQlVSU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgIC8qKjwgVW5yZWNlaXZlZCBidXJzdC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9MQ0RHX0VSUk9SUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNCwgICAvKio8IExDREcgZXJyb3JzLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JESV9FUlJPUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1LCAgIC8qKjwgUkRJIGVycm9ycy4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNiwgICAvKio8IHJ4IGJ5dGVzLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX1BBQ0tFVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3LCAgIC8qKjwgcnggcGFja2V0cy4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9UWF9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOCwgICAvKio8IHR4IGJ5dGVzLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1RYX1BBQ0tFVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5LCAgIC8qKjwgdHggcGFja2V0cy4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fb251X3N0YXRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9zdWZpIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX29udV9zdWZpX2lkCit7CisgICAgQkNNT0xUX0dQT05fT05VX1NVRklfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9PTlVfU1VGSV9JRF9BTEFSTV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IGFsYXJtIHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfU1VGSV9JRF9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fb251X3N1ZmlfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV90aXdpIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX29udV90aXdpX2lkCit7CisgICAgQkNNT0xUX0dQT05fT05VX1RJV0lfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9PTlVfVElXSV9JRF9BTEFSTV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEFsYXJtIHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfVElXSV9JRF9EUklGVF9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IERyaWZ0IHZhbHVlLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9USVdJX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfdGl3aV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fdHJ4X2NmZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl90cnhfY2ZnX2lkCit7CisgICAgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1RSQU5TQ0VJVkVSX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IHRyYW5zY2VpdmVyIHR5cGUuICovCisgICAgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9DT05GSUdVUkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBMQSBjb25maWd1cmF0aW9uLiAqLworICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgQkNEUi4gKi8KKyAgICBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX1JBTkdJTkdfQUZURVJfTk9fRURfUkVTWU5DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IExBIHJhbmdpbmcgYWZ0ZXIgbm8gZWQgcmVzeW5jIC4gKi8KKyAgICBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0JDRFJfUkFOR0lOR19BRlRFUl9OT19FRF9SRVNZTkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IEJDRFIgcmFuZ2luZyBhZnRlciBubyBlZCByZXN5bmMgY29uZmlndXJhdGlvbi4gKi8KKyAgICBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX1JBTkdJTkdfQUZURVJfRURfUkVTWU5DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IExBIHJhbmdpbmcgYWZ0ZXIgZWQgcmVzeW5jIC4gKi8KKyAgICBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0JDRFJfUkFOR0lOR19BRlRFUl9FRF9SRVNZTkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAvKio8IEJDRFIgcmFuZ2luZyBhZnRlciBlZCByZXN5bmMuICovCisgICAgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9SRVNZTkNfUE9MQVJJVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgLyoqPCBsYSByZXN5bmMgcG9sYXJpdHkuICovCisgICAgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9CQ0RSX1JFU1lOQ19QT0xBUklUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgLyoqPCBCQ0RSIHJlc3luYyBwb2xhcml0eS4gKi8KKyAgICBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0JDRFJfUkFOR0lOR19SRVNZTkNfQ09ORElUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5LCAgICAvKio8IGJjZHIgcmFuZ2luZyByZXN5bmMgY29uZGl0aW9ucy4gKi8KKyAgICBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX1JBTkdJTkdfUkVTWU5DX0NPTkRJVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwgICAvKio8IGxhIHJhbmdpbmcgcmVzeW5jIGNvbmRpdGlvbnMuICovCisgICAgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9SWF9DT05GSUdVUkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEsICAgLyoqPCBSWCBjb25maWd1cmF0aW9uLiAqLworICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUkFOR0lOR19DT05UUk9MX1NUQUdFU19DT05GSUdVUkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyLCAgIC8qKjwgcmFuZ2luZyBjb250cm9sIHN0YWdlcyBjb25maWd1cmF0aW9uLiAqLworICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfRU5FUkdZX0RFVEVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgIC8qKjwgRW5lcmd5IERldGVjdC4gKi8KKyAgICBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0VORF9PRl9CVVJTVF9EQVRBX1BBVFRFUk4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNCwgICAvKio8IGVuZCBvZiBidXJzdCBkYXRhIHBhdHRlcm4gLiAqLworICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfRU5EX09GX0JVUlNUX1JBTkdJTkdfUEFUVEVSTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1LCAgIC8qKjwgZW5kIG9mIGJ1cnN0IHJhbmdpbmcgcGF0dGVybi4gKi8KKyAgICBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1BSRUFNQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNiwgICAvKio8IFByZWFtYmxlLiAqLworICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfREVMSU1JVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3LCAgIC8qKjwgRGVsaW1pdGVyLiAqLworICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfR1VBUkRfQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4LCAgIC8qKjwgR3VhcmQgYml0cy4gKi8KKyAgICBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1NFUkRFU19DT05GSUdVUkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOSwgICAvKio8IHNlcmRlcyBjb25maWd1cmF0aW9uLiAqLworICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUExPX1JBTkdJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwLCAgIC8qKjwgUExPIGZvciByYW5naW5nLiAqLworICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUExPX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxLCAgIC8qKjwgUExPIGZvciBkYXRhLiAqLworICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUlNTSV9OT1JNQUxfQ09ORklHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIyLCAgIC8qKjwgcnNzaSBub3JtYWwgY29uZmlnLiAqLworICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUkFOR0lOR19SU1NJX1JFU1lOQ19DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzLCAgIC8qKjwgcmFuZ2luZyByc3NpIHJlc3luYyBjb250cm9sLiAqLworICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl90cnhfY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl90cnhfa2V5IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX3RyeF9rZXlfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9UUlhfS0VZX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9HUE9OX1RSWF9LRVlfSURfUE9OX05JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgUE9OIG5ldHdvcmsgaW50ZXJmYWNlLiAqLworICAgIEJDTU9MVF9HUE9OX1RSWF9LRVlfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl90cnhfa2V5X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgbG9nX2VudHJ5X2F1dG9fY2ZnIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfaWQKK3sKKyAgICBCQ01PTFRfTE9HX0VOVFJZX0FVVE9fQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9MT0dfRU5UUllfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdCBBbGFybSBDbGVhcmVkLiAqLworICAgIEJDTU9MVF9MT0dfRU5UUllfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgU3RhdCBBbGFybSBSYWlzZWQuICovCisgICAgQkNNT0xUX0xPR19FTlRSWV9BVVRPX0NGR19JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGxvZ19lbnRyeV9jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2xvZ19lbnRyeV9jZmdfaWQKK3sKKyAgICBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0RFRkFVTFRfTE9HX0xFVkVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgZGVmYXVsdCBsb2cgbGV2ZWwuICovCisgICAgQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfREVGQVVMVF9MT0dfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBkZWZhdWx0IGxvZyB0eXBlLiAqLworICAgIEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19MRVZFTF9QUklOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgbG9nIGxldmVsIHByaW50LiAqLworICAgIEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19MRVZFTF9TQVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgbG9nIGxldmVsIHNhdmUuICovCisgICAgQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfTE9HX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgLyoqPCBsb2cgdHlwZS4gKi8KKyAgICBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfU1RZTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IGxvZ19zdHlsZS4gKi8KKyAgICBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAvKio8IGxvZyBuYW1lLiAqLworICAgIEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfbG9nX2VudHJ5X2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGxvZ19lbnRyeV9rZXkgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2xvZ19lbnRyeV9rZXlfaWQKK3sKKyAgICBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9MT0dfRU5UUllfS0VZX0lEX0xPR19JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgbG9nIGlkLiAqLworICAgIEJDTU9MVF9MT0dfRU5UUllfS0VZX0lEX1JFU0VSVkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgcmVzZXJ2ZWQuICovCisgICAgQkNNT0xUX0xPR19FTlRSWV9LRVlfSURfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBuYW1lLiAqLworICAgIEJDTU9MVF9MT0dfRU5UUllfS0VZX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfbG9nX2VudHJ5X2tleV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGxvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWQgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9pZAoreworICAgIEJDTU9MVF9MT0dfRU5UUllfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdGF0aXN0aWMgSUQuICovCisgICAgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGxvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZCAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfaWQKK3sKKyAgICBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9MT0dfRU5UUllfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdGlzdGljIElELiAqLworICAgIEJDTU9MVF9MT0dfRU5UUllfU1RBVF9BTEFSTV9SQUlTRURfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGxvZ19lbnRyeV9zdGF0X2NmZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnX2lkCit7CisgICAgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfQ0ZHX0lEX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IENvbmZpZ3VyYXRpb24uICovCisgICAgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0NGR19JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGxvZ19lbnRyeV9zdGF0IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9pZAoreworICAgIEJDTU9MVF9MT0dfRU5UUllfU1RBVF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0lEX01TR19DT1VOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBtc2cgY291bnQuICovCisgICAgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0lEX0xPU1RfTVNHX0NPVU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBsb3N0IG1zZyBjb3VudC4gKi8KKyAgICBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9sb2dfZW50cnlfc3RhdF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGxvZ2dlcl9hdXRvX2NmZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2lkCit7CisgICAgQkNNT0xUX0xPR0dFUl9BVVRPX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfTE9HR0VSX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFN0YXQgQWxhcm0gQ2xlYXJlZC4gKi8KKyAgICBCQ01PTFRfTE9HR0VSX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFN0YXQgQWxhcm0gUmFpc2VkLiAqLworICAgIEJDTU9MVF9MT0dHRVJfQVVUT19DRkdfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGxvZ2dlcl9jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2xvZ2dlcl9jZmdfaWQKK3sKKyAgICBCQ01PTFRfTE9HR0VSX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX0JVRkZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgYnVmZmVyLiAqLworICAgIEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX1dSQVBfQVJPVU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgd3JhcCBhcm91bmQuICovCisgICAgQkNNT0xUX0xPR0dFUl9DRkdfSURfQ0xFQVJfQUZURVJfUkVBRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBjbGVhcl9hZnRlcl9yZWFkLiAqLworICAgIEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX0VOQUJMRV9MT0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgZW5hYmxlIGxvZy4gKi8KKyAgICBCQ01PTFRfTE9HR0VSX0NGR19JRF9MT0dfTkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IGxvZ19uYW1lcy4gKi8KKyAgICBCQ01PTFRfTE9HR0VSX0NGR19JRF9fTlVNX09GICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9sb2dnZXJfY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgbG9nZ2VyX2NsZWFyX2xvZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfbG9nZ2VyX2NsZWFyX2xvZ19pZAoreworICAgIEJDTU9MVF9MT0dHRVJfQ0xFQVJfTE9HX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2xvZ2dlcl9jbGVhcl9sb2dfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBsb2dnZXJfa2V5IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9sb2dnZXJfa2V5X2lkCit7CisgICAgQkNNT0xUX0xPR0dFUl9LRVlfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfTE9HR0VSX0tFWV9JRF9SRVNFUlZFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IHJlc2VydmVkLiAqLworICAgIEJDTU9MVF9MT0dHRVJfS0VZX0lEX0ZJTEVfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgZmlsZSBpZC4gKi8KKyAgICBCQ01PTFRfTE9HR0VSX0tFWV9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2xvZ2dlcl9rZXlfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBsb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfaWQKK3sKKyAgICBCQ01PTFRfTE9HR0VSX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9MT0dHRVJfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdGlzdGljIElELiAqLworICAgIEJDTU9MVF9MT0dHRVJfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGxvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZCAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfaWQKK3sKKyAgICBCQ01PTFRfTE9HR0VSX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9MT0dHRVJfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdGlzdGljIElELiAqLworICAgIEJDTU9MVF9MT0dHRVJfU1RBVF9BTEFSTV9SQUlTRURfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgbG9nZ2VyX3N0YXRfY2ZnIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9sb2dnZXJfc3RhdF9jZmdfaWQKK3sKKyAgICBCQ01PTFRfTE9HR0VSX1NUQVRfQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9MT0dHRVJfU1RBVF9DRkdfSURfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQ29uZmlndXJhdGlvbi4gKi8KKyAgICBCQ01PTFRfTE9HR0VSX1NUQVRfQ0ZHX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9sb2dnZXJfc3RhdF9jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBsb2dnZXJfc3RhdCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfbG9nZ2VyX3N0YXRfaWQKK3sKKyAgICBCQ01PTFRfTE9HR0VSX1NUQVRfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9MT0dHRVJfU1RBVF9JRF9MSU5FU19JTl9MT0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgbGluZXMgaW4gbG9nLiAqLworICAgIEJDTU9MVF9MT0dHRVJfU1RBVF9JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfbG9nZ2VyX3N0YXRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBubmlfYXV0b19jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X25uaV9hdXRvX2NmZ19pZAoreworICAgIEJDTU9MVF9OTklfQVVUT19DRkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX05OSV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdGF0IEFsYXJtIENsZWFyZWQuICovCisgICAgQkNNT0xUX05OSV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBTdGF0IEFsYXJtIFJhaXNlZC4gKi8KKyAgICBCQ01PTFRfTk5JX0FVVE9fQ0ZHX0lEX1NUQVRVU19DSEFOR0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IFN0YXR1cyBjaGFuZ2VkLiAqLworICAgIEJDTU9MVF9OTklfQVVUT19DRkdfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfbm5pX2F1dG9fY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgbm5pX2NmZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfbm5pX2NmZ19pZAoreworICAgIEJDTU9MVF9OTklfQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX05OSV9DRkdfSURfUkVNT1RFX0xPT1BCQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBSZW1vdGUgbG9vcGJhY2suICovCisgICAgQkNNT0xUX05OSV9DRkdfSURfTElORV9MT09QQkFDSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBMaW5lIGxvb3BiYWNrLiAqLworICAgIEJDTU9MVF9OTklfQ0ZHX0lEX01BQ19BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgTWFjIEFkZHJlc3MuICovCisgICAgQkNNT0xUX05OSV9DRkdfSURfTk5JX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBOTkkgU3RhdHVzLiAqLworICAgIEJDTU9MVF9OTklfQ0ZHX0lEX05OSV9CQUNLVVBfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgTk5JIEJhY2t1cCBTdGF0dXMuICovCisgICAgQkNNT0xUX05OSV9DRkdfSURfQUNUSVZFX05OSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgLyoqPCBBY3RpdmUgTk5JLiAqLworICAgIEJDTU9MVF9OTklfQ0ZHX0lEX05OSV9TVEFUVVNfUE9MTElOR19JTlRFUlZBTF9NUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgIC8qKjwgTk5JIFN0YXR1cyBQb2xsaW5nIEludGVydmFsIChtcykuICovCisgICAgQkNNT0xUX05OSV9DRkdfSURfQVVUT1NXSVRDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgLyoqPCBBdXRvLVN3aXRjaC4gKi8KKyAgICBCQ01PTFRfTk5JX0NGR19JRF9GTE9XX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAvKio8IEZsb3cgQ29udHJvbC4gKi8KKyAgICBCQ01PTFRfTk5JX0NGR19JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfbm5pX2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIG5uaV9rZXkgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X25uaV9rZXlfaWQKK3sKKyAgICBCQ01PTFRfTk5JX0tFWV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9OTklfS0VZX0lEX1BPTl9OSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgUE9OIE5JLiAqLworICAgIEJDTU9MVF9OTklfS0VZX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ubmlfa2V5X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgbm5pX3NlcmRlc19jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2lkCit7CisgICAgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfVkdBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFJ4IFZnYS4gKi8KKyAgICBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfUEYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFJ4IFBGLiAqLworICAgIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9MRlBGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgUnggTEZQRi4gKi8KKyAgICBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IFJ4IERGRTEuICovCisgICAgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgLyoqPCBSeCBERkUyLiAqLworICAgIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9ERkUzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgUnggREZFMy4gKi8KKyAgICBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAvKio8IFJ4IERGRTQuICovCisgICAgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgLyoqPCBSeCBERkU1LiAqLworICAgIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgIC8qKjwgVHggUHJlLiAqLworICAgIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9NQUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgIC8qKjwgVHggTWFpbi4gKi8KKyAgICBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfUE9TVDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwgICAvKio8IFR4IFBvc3QxLiAqLworICAgIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QT1NUMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExLCAgIC8qKjwgVHggUG9zdDIuICovCisgICAgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIsICAgLyoqPCBUeCBQb3N0My4gKi8KKyAgICBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfQU1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMywgICAvKio8IFR4IEFtcC4gKi8KKyAgICBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIG5uaV9zZXJkZXNfa2V5IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ubmlfc2VyZGVzX2tleV9pZAoreworICAgIEJDTU9MVF9OTklfU0VSREVTX0tFWV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX05OSV9TRVJERVNfS0VZX0lEX1BPTl9OSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBQT04gTkkuICovCisgICAgQkNNT0xUX05OSV9TRVJERVNfS0VZX0lEX0lOU1RBTkNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBJbnN0YW5jZS4gKi8KKyAgICBCQ01PTFRfTk5JX1NFUkRFU19LRVlfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ubmlfc2VyZGVzX2tleV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIG5uaV9zdGF0X2FsYXJtX2NsZWFyZWQgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZAoreworICAgIEJDTU9MVF9OTklfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX05OSV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdGF0aXN0aWMgSUQuICovCisgICAgQkNNT0xUX05OSV9TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgbm5pX3N0YXRfYWxhcm1fcmFpc2VkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfaWQKK3sKKyAgICBCQ01PTFRfTk5JX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9OTklfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdGlzdGljIElELiAqLworICAgIEJDTU9MVF9OTklfU1RBVF9BTEFSTV9SQUlTRURfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBubmlfc3RhdF9jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X25uaV9zdGF0X2NmZ19pZAoreworICAgIEJDTU9MVF9OTklfU1RBVF9DRkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX05OSV9TVEFUX0NGR19JRF9DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBDb25maWd1cmF0aW9uLiAqLworICAgIEJDTU9MVF9OTklfU1RBVF9DRkdfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfbm5pX3N0YXRfY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgbm5pX3N0YXQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X25uaV9zdGF0X2lkCit7CisgICAgQkNNT0xUX05OSV9TVEFUX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFJYIDY0IEJ5dGUgRnJhbWVzLiAqLworICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfNjVfMTI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgUlggNjUtMTI3IEJ5dGUgRnJhbWVzLiAqLworICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfMTI4XzI1NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgUlggMTI4LTI1NSBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzI1Nl81MTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IFJYIDI1Ni01MTEgQnl0ZSBGcmFtZXMuICovCisgICAgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU181MTJfMTAyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgLyoqPCBSWCA1MTItMTAyMyBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzEwMjRfMTUxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IFJYIDEwMjQtMTUxOCBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzE1MTlfMjA0NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAvKio8IFJYIDE1MTktMjA0NyBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzIwNDhfNDA5NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAvKio8IFJYIDIwNDgtNDA5NSBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzQwOTZfOTIxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAvKio8IFJYIDQwOTYtOTIxNiBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzkyMTdfMTYzODMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5LCAgICAvKio8IFJYIDkyMTctMTYzODMgQnl0ZSBGcmFtZXMuICovCisgICAgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgLyoqPCBSWCBGcmFtZXMuICovCisgICAgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEsICAgLyoqPCBSWCBCeXRlcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfR09PRF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMiwgICAvKio8IFJYIEdvb2QgRnJhbWVzLiAqLworICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTklDQVNUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgIC8qKjwgUlggVW5pY2FzdCBGcmFtZXMuICovCisgICAgQkNNT0xUX05OSV9TVEFUX0lEX1JYX01VTFRJQ0FTVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQsICAgLyoqPCBSWCBNdWx0aWNhc3QgRnJhbWVzLiAqLworICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9CUk9BRENBU1RfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1LCAgIC8qKjwgUlggQnJvYWRjYXN0IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRkNTX0VSUk9SUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNiwgICAvKio8IFJYIEZDUyBFcnJvcnMuICovCisgICAgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0NPTlRST0xfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTcsICAgLyoqPCBSWCBDb250cm9sIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfUEFVU0VfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOCwgICAvKio8IFJYIFBhdXNlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfUEZDX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOSwgICAvKio8IFJYIFBGQyBGcmFtZXMuICovCisgICAgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1VOU1VQUE9SVEVEX09QQ09ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjAsICAgLyoqPCBSWCBVbnN1cHBvcnRlZCBPcGNvZGUgRnJhbWVzLiAqLworICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTlNVUFBPUlRFRF9EQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxLCAgIC8qKjwgUlggVW5zdXBwb3J0ZWQgREEgRnJhbWVzLiAqLworICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9BTElHTk1FTlRfRVJST1JTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIyLCAgIC8qKjwgUlggQWxpZ25tZW50IEVycm9ycy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfTEVOR1RIX09VVF9PRl9SQU5HRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMywgICAvKio8IFJYIExlbmd0aCBPdXQgb2YgUmFuZ2UuICovCisgICAgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0NPREVfRVJST1JTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjQsICAgLyoqPCBSWCBDb2RlIEVycm9ycy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfT1ZFUlNJWkVEX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNSwgICAvKio8IFJYIE92ZXJzaXplZCBGcmFtZXMuICovCisgICAgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0pBQkJFUl9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjYsICAgLyoqPCBSWCBKYWJiZXIgRnJhbWVzLiAqLworICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9NVFVfQ0hFQ0tfRVJST1JTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI3LCAgIC8qKjwgUlggTVRVIENoZWNrIEVycm9ycy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfUFJPTUlTQ1VPVVNfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOCwgICAvKio8IFJYIFByb21pc2N1b3VzIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVkxBTl9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOSwgICAvKio8IFJYIFZMQU4gRnJhbWVzLiAqLworICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9ET1VCTEVfVkxBTl9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMwLCAgIC8qKjwgUlggRG91YmxlIFZMQU4gRnJhbWVzLiAqLworICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9UUlVOQ0FURURfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMxLCAgIC8qKjwgUlggVHJ1bmNhdGVkIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVU5ERVJTSVpFX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMiwgICAvKio8IFJYIFVuZGVyc2l6ZWQgRnJhbWVzLiAqLworICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFHTUVOVEVEX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMzLCAgIC8qKjwgUlggRnJhZ21lbnRlZCBGcmFtZXMuICovCisgICAgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1JVTlRfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzQsICAgLyoqPCBSWCBSdW50IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNSwgICAvKio8IFRYIDY0IEJ5dGUgRnJhbWVzLiAqLworICAgIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfNjVfMTI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM2LCAgIC8qKjwgVFggNjUtMTI3IEJ5dGUgRnJhbWVzLiAqLworICAgIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMTI4XzI1NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM3LCAgIC8qKjwgVFggMTI4LTI1NSBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzI1Nl81MTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzOCwgICAvKio8IFRYIDI1Ni01MTEgQnl0ZSBGcmFtZXMuICovCisgICAgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU181MTJfMTAyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzksICAgLyoqPCBUWCA1MTItMTAyMyBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzEwMjRfMTUxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MCwgICAvKio8IFRYIDEwMjQtMTUxOCBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzE1MTlfMjA0NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MSwgICAvKio8IFRYIDE1MTktMjA0NyBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzIwNDhfNDA5NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MiwgICAvKio8IFRYIDIwNDgtNDA5NSBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzQwOTZfOTIxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MywgICAvKio8IFRYIDQwOTYtOTIxNiBCeXRlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzkyMTdfMTYzODMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NCwgICAvKio8IFRYIDkyMTctMTYzODMgQnl0ZSBGcmFtZXMuICovCisgICAgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDUsICAgLyoqPCBUWCBGcmFtZXMuICovCisgICAgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDYsICAgLyoqPCBUWCBCeXRlcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfVFhfR09PRF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NywgICAvKio8IFRYIEdvb2QgRnJhbWVzLiAqLworICAgIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9VTklDQVNUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ4LCAgIC8qKjwgVFggVW5pY2FzdCBGcmFtZXMuICovCisgICAgQkNNT0xUX05OSV9TVEFUX0lEX1RYX01VTFRJQ0FTVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDksICAgLyoqPCBUWCBNdWx0aWNhc3QgRnJhbWVzLiAqLworICAgIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9CUk9BRENBU1RfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUwLCAgIC8qKjwgVFggQnJvYWRjYXN0IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfVFhfUEFVU0VfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MSwgICAvKio8IFRYIFBhdXNlIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfVFhfUEZDX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MiwgICAvKio8IFRYIFBGQyBGcmFtZXMuICovCisgICAgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0pBQkJFUl9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTMsICAgLyoqPCBUWCBKYWJiZXIgRnJhbWVzLiAqLworICAgIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GQ1NfRVJST1JTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU0LCAgIC8qKjwgVFggRkNTIEVycm9ycy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfVFhfQ09OVFJPTF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NSwgICAvKio8IFRYIENvbnRyb2wgRnJhbWVzLiAqLworICAgIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9PVkVSU0laRV9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU2LCAgIC8qKjwgVFggT3ZlcnNpemUgRnJhbWVzLiAqLworICAgIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFHTUVOVEVEX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU3LCAgIC8qKjwgVFggRnJhZ21lbnRlZCBGcmFtZXMuICovCisgICAgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0VSUk9SX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTgsICAgLyoqPCBUWCBFcnJvciBGcmFtZXMuICovCisgICAgQkNNT0xUX05OSV9TVEFUX0lEX1RYX1ZMQU5fRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTksICAgLyoqPCBUWCBWTEFOIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRE9VQkxFX1ZMQU5fRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MCwgICAvKio8IFRYIERvdWJsZSBWTEFOIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRfSURfVFhfUlVOVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MSwgICAvKio8IFRYIFJ1bnQgRnJhbWVzLiAqLworICAgIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9VTkRFUlJVTl9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYyLCAgIC8qKjwgVFggVW5kZXJydW4gRnJhbWVzLiAqLworICAgIEJDTU9MVF9OTklfU1RBVF9JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ubmlfc3RhdF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIG5uaV9zdGF0dXNfY2hhbmdlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2lkCit7CisgICAgQkNNT0xUX05OSV9TVEFUVVNfQ0hBTkdFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfTk5JX1NUQVRVU19DSEFOR0VEX0lEX05FV19TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IE5ldyBOTkkgTGluayBTdGF0dXMuICovCisgICAgQkNNT0xUX05OSV9TVEFUVVNfQ0hBTkdFRF9JRF9MSU5LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBMaW5rLiAqLworICAgIEJDTU9MVF9OTklfU1RBVFVTX0NIQU5HRURfSURfUFJFVklPVVNfQUNUSVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgUHJldmlvdXMgQWN0aXZlLiAqLworICAgIEJDTU9MVF9OTklfU1RBVFVTX0NIQU5HRURfSURfTkVXX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgTmV3IEFjdGl2ZS4gKi8KKyAgICBCQ01PTFRfTk5JX1NUQVRVU19DSEFOR0VEX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgc29mdHdhcmVfZXJyb3JfY2ZnIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfaWQKK3sKKyAgICBCQ01PTFRfU09GVFdBUkVfRVJST1JfQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9TT0ZUV0FSRV9FUlJPUl9DRkdfSURfRU5UUlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgRW50cnkuICovCisgICAgQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0NGR19JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHNvZnR3YXJlX2Vycm9yX2tleSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5X2lkCit7CisgICAgQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0tFWV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfU09GVFdBUkVfRVJST1JfS0VZX0lEX1JFU0VSVkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFJlc2VydmVkLiAqLworICAgIEJDTU9MVF9TT0ZUV0FSRV9FUlJPUl9LRVlfSURfSURYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgSW5kZXguICovCisgICAgQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0tFWV9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHRyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZyAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfaWQKK3sKKyAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0FVVE9fQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQVVUT19DRkdfSURfQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURUQgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQ2FwdHVyZSB3aW5kb3cgYW5kIHN0YXRpc3RpYyBjb21wbGV0ZWQuICovCisgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9BVVRPX0NGR19JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIHRyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2lkCit7CisgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0RBVEFfV0lORE9XICAgICAgICAgICAgPSAwLCAgICAvKio8IGRhdGEgd2luZG93LiAqLworICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfU1RST0JFX1dJTkRPVyAgICAgICAgICA9IDEsICAgIC8qKjwgc3Ryb2JlIHdpbmRvdy4gKi8KKyAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfUklTRV9NSU5fTUlOICAgICAgPSAyLCAgICAvKio8IGVkZ2UgcmlzZSBtaW4gbWluLiAqLworICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9SSVNFX01JTl9NQVggICAgICA9IDMsICAgIC8qKjwgZWRnZSByaXNlIG1pbiBtYXguICovCisgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9FREdFX1JJU0VfTUFYX01JTiAgICAgID0gNCwgICAgLyoqPCBlZGdlIHJpc2UgbWF4IG1pbi4gKi8KKyAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfUklTRV9NQVhfTUFYICAgICAgPSA1LCAgICAvKio8IGVkZ2UgcmlzZSBtYXggbWF4LiAqLworICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9GQUxMX01JTl9NSU4gICAgICA9IDYsICAgIC8qKjwgZWRnZSBmYWxsIG1pbiBtaW4gLiAqLworICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9GQUxMX01JTl9NQVggICAgICA9IDcsICAgIC8qKjwgZWRnZSBmYWxsIG1pbiBtYXguICovCisgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9FREdFX0ZBTExfTUFYX01JTiAgICAgID0gOCwgICAgLyoqPCBlZGdlIGZhbGwgbWF4IG1pbi4gKi8KKyAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfRkFMTF9NQVhfTUFYICAgICAgPSA5LCAgICAvKio8IGVkZ2UgZmFsbCBtYXggbWF4LiAqLworICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfUkVTVUxUICAgICAgICAgICAgICAgICA9IDEwLCAgIC8qKjwgcmVzdWx0LiAqLworICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHRyeF9jYWxpYnJhdGlvbl9rZXkgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXlfaWQKK3sKKyAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0tFWV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fS0VZX0lEX1JFU0VSVkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgUmVzZXJ2ZWQuICovCisgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9LRVlfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXlfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIHRyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvdyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2lkCit7CisgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1BPTl9OSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IHBvbl9uaS4gKi8KKyAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1RSSUdHRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IHRyaWdnZXIuICovCisgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9TVFJPQkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBzdHJvYmUuICovCisgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9XSU5ET1dfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCB3aW5kb3cgbW9kZS4gKi8KKyAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX09OVV9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IG9udSBpZC4gKi8KKyAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1RSSUdHRVJfUE9TSVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IHRyaWdnZXIgcG9zaXRpb24uICovCisgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9TVE9QX0RVRV9UT19DT1JSVVBUX1NUUk9CRSAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBzdG9wIGR1ZSB0byBjb3JydXB0IHN0cm9iZS4gKi8KKyAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1NUQVJUX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAvKio8IHN0YXJ0IG9mZnNldC4gKi8KKyAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX0VORF9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAvKio8IGVuZCBvZmZzZXQuICovCisgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9OVU1CRVJfT0ZfQ1lDTEVTICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgLyoqPCBudW1iZXIgb2YgY3ljbGVzLiAqLworICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiB0cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvdyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfaWQKK3sKKyAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUT1BfQ0FQVFVSRV9XSU5ET1dfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RPUF9DQVBUVVJFX1dJTkRPV19JRF9QT05fTkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgcG9uX25pLiAqLworICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RPUF9DQVBUVVJFX1dJTkRPV19JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9hbGxvY19hdXRvX2NmZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19DRkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9BTExPQ19BVVRPX0NGR19JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQ29uZmlndXJhdGlvbiBDb21wbGV0ZWQuICovCisgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX0dFVF9BTExPQ19TVEFUU19DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBHZXQgYWxsb2MgSUQgc3RhdGlzdGljcyBjb21wbGV0ZWQuICovCisgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBTdGF0IEFsYXJtIENsZWFyZWQuICovCisgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBTdGF0IEFsYXJtIFJhaXNlZC4gKi8KKyAgICBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19DRkdfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9hbGxvY19jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19pZAoreworICAgIEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0NGR19JRF9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBzdGF0ZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fQUxMT0NfQ0ZHX0lEX1NMQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IHNsYS4gKi8KKyAgICBCQ01PTFRfWEdQT05fQUxMT0NfQ0ZHX0lEX09OVV9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IG9udV9pZC4gKi8KKyAgICBCQ01PTFRfWEdQT05fQUxMT0NfQ0ZHX0lEX0NPTExFQ1RfU1RBVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IEVuYWJsZSBzdGF0aXN0aWNzIGNvbGxlY3Rpb24gb24gdGhlIGFsbG9jIGlkLiAqLworICAgIEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfWEdQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfTkVXX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IG5ldyBzdGF0ZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiB4Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX05TUl9VU0VEICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEF2ZXJhZ2UgTlNSIHVzZWQgd29yZHMuICovCisgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfQVZFUkFHRV9OU1JfQUxMT0NBVEVEICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBBdmVyYWdlIE5TUiBhbGxvY2F0ZWQgd29yZHMuICovCisgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfQVZFUkFHRV9TUl9SRVBPUlQgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBBdmVyYWdlIFNSIHJlcG9ydC4gKi8KKyAgICBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9hbGxvY19nZXRfc3RhdHMgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0c19pZAoreworICAgIEJDTU9MVF9YR1BPTl9BTExPQ19HRVRfU1RBVFNfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0dFVF9TVEFUU19JRF9OVU1fT0ZfQ1lDTEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBOdW1iZXIgb2YgY3ljbGVzLiAqLworICAgIEJDTU9MVF9YR1BPTl9BTExPQ19HRVRfU1RBVFNfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9hbGxvY19rZXkgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX2FsbG9jX2tleV9pZAoreworICAgIEJDTU9MVF9YR1BPTl9BTExPQ19LRVlfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0tFWV9JRF9QT05fTkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBQT04gbmV0d29yayBpbnRlcmZhY2UuICovCisgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0tFWV9JRF9BTExPQ19JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBBbGxvYyBJRC4gKi8KKyAgICBCQ01PTFRfWEdQT05fQUxMT0NfS0VZX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9hbGxvY19rZXlfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9hbGxvY19zZXRfc3RhdGUgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZV9pZAoreworICAgIEJDTU9MVF9YR1BPTl9BTExPQ19TRVRfU1RBVEVfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX0FMTE9DX1NFVF9TVEFURV9JRF9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdGF0ZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fQUxMT0NfU0VUX1NUQVRFX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiB4Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9pZAoreworICAgIEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0FMQVJNX0NMRUFSRURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX0FMTE9DX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdGF0aXN0aWMgSUQuICovCisgICAgQkNNT0xUX1hHUE9OX0FMTE9DX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX0FMTE9DX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFN0YXRpc3RpYyBJRC4gKi8KKyAgICBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9BTEFSTV9SQUlTRURfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX2FsbG9jX3N0YXRfY2ZnIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19pZAoreworICAgIEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX0FMTE9DX1NUQVRfQ0ZHX0lEX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBDb25maWd1cmF0aW9uLiAqLworICAgIEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0NGR19JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX2FsbG9jX3N0YXQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0lEX1JYX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgUmVjZWl2ZWQgQnl0ZXMuICovCisgICAgQkNNT0xUX1hHUE9OX0FMTE9DX1NUQVRfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX2dlbV9wb3J0X2F1dG9fY2ZnIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0FVVE9fQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFN0YXQgQWxhcm0gQ2xlYXJlZC4gKi8KKyAgICBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFN0YXQgQWxhcm0gUmFpc2VkLiAqLworICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9BVVRPX0NGR19JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9nZW1fcG9ydF9jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19pZAoreworICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9DT05GSUdVUkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBDb25maWd1cmF0aW9uLiAqLworICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfT05VX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgT05VIElELiAqLworICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfR0VNX1BPUlRfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgZ2VtIHBvcnQgc3RhdGUuICovCisgICAgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9FTkNSWVBUSU9OX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBFbmNyeXB0aW9uIG1vZGUuICovCisgICAgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9VUFNUUkVBTV9ERVNUSU5BVElPTl9RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgLyoqPCBVcHN0cmVhbSBkZXN0aW5hdGlvbiBxdWV1ZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IGNvbnRyb2wuICovCisgICAgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX2dlbV9wb3J0X2tleSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5X2lkCit7CisgICAgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0tFWV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fR0VNX1BPUlRfS0VZX0lEX1BPTl9OSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFBPTiBuZXR3b3JrIGludGVyZmFjZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fR0VNX1BPUlRfS0VZX0lEX0dFTV9QT1JUX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEdFTSBQT1JUIElELiAqLworICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9LRVlfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXlfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIHhncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFN0YXRpc3RpYyBJRC4gKi8KKyAgICBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiB4Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9SQUlTRURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdGlzdGljIElELiAqLworICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0FMQVJNX1JBSVNFRF9JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX2dlbV9wb3J0X3N0YXRfY2ZnIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9DRkdfSURfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IENvbmZpZ3VyYXRpb24uICovCisgICAgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfQ0ZHX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX2dlbV9wb3J0X3N0YXQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1RYX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgVFggYnl0ZXMuICovCisgICAgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfSURfVFhfUEFDS0VUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBUWCBwYWNrZXRzLiAqLworICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1JYX1BBQ0tFVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgUlggcGFja2V0cy4gKi8KKyAgICBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IFJYIGJ5dGVzLiAqLworICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25faXdmX2NmZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25faXdmX2NmZ19pZAoreworICAgIEJDTU9MVF9YR1BPTl9JV0ZfQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX0lXRl9DRkdfSURfVVNfT1RBR19ESVJFQ1RfVFBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBVUyBvdGFnIGRpcmVjdCB0cGlkLiAqLworICAgIEJDTU9MVF9YR1BPTl9JV0ZfQ0ZHX0lEX0RTX1RQSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgRFMgdHBpZC4gKi8KKyAgICBCQ01PTFRfWEdQT05fSVdGX0NGR19JRF9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX2l3Zl9jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9pd2Zfa2V5IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9pd2Zfa2V5X2lkCit7CisgICAgQkNNT0xUX1hHUE9OX0lXRl9LRVlfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fSVdGX0tFWV9JRF9QT05fTkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFBPTiBuZXR3b3JrIGludGVyZmFjZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fSVdGX0tFWV9JRF9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX2l3Zl9rZXlfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIHhncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX05JX0FDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRF9JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIHhncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9pZAoreworICAgIEJDTU9MVF9YR1BPTl9OSV9BREpVU1RfVFhfV0FWRUxFTkdUSF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX05JX0FESlVTVF9UWF9XQVZFTEVOR1RIX0lEX1NFUklBTF9OVU1CRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTZXJpbCBudW1iZXIuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0FESlVTVF9UWF9XQVZFTEVOR1RIX0lEX0ZSRVFFTkNZX0FESlVTVE1FTlRfRElSRUNUSU9OICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBGcmVxdW5jeSBhZGp1c3RtZW50IGRpcmVjdGlvbi4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfRlJFUVVFTkNZX0FESlVTVE1FTlRfU0laRSAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IEZyZXF1ZW5jeSBhZGp1c3RtZW50IHNpemUuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0FESlVTVF9UWF9XQVZFTEVOR1RIX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9hdXRvX2NmZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9BQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgYWN0aXZhdGUgYWxsIG9udXMgY29tcGxldGVkLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9DUFVfUEFDS0VUU19GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgQ1BVIFBhY2tldHMgRmFpbHVyZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfREVBQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IGRlYWN0aXZhdGUgYWxsIG9udXMgY29tcGxldGVkLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9ESVNBQkxFX0FMTF9PTlVTX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgZGlzYWJsZSBhbGwgb251cyBjb21wbGV0ZWQuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX0VOQUJMRV9BTExfT05VU19DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgLyoqPCBlbmFibGUgYWxsIG9udXMgY29tcGxldGVkLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9MT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgTE9TLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9PTlVfRElTQ09WRVJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgIC8qKjwgT05VIERpc2NvdmVyZWQuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX09OVV9VUEdSQURFX0NPTVBMRVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgLyoqPCBPTlUgVXBncmFkZSBDb21wbGV0ZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAvKio8IFByb3RlY3Rpb24gU3dpdGNoaW5nIE9OVXMgUmFuZ2VkLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICA9IDksICAgIC8qKjwgUHJvdGVjdGlvbiBTd2l0Y2hpbmcgU3dpdGNob3ZlciBDb21wbGV0ZWQuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgLyoqPCBQcm90ZWN0aW9uIFN3aXRjaGluZyBUcmFmZmljIFJlc3VtZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAvKio8IFJvZ3VlIGRldGVjdGlvbiBjb21wbGV0ZWQuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1JPR1VFX09OVV9TUEVDSUFMX01BUF9DWUNMRV9TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIsICAgLyoqPCBSb2d1ZSBPTlUgc3BlY2lhbCBtYXAgY3ljbGUgc3RhcnQuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1NFUklBTF9OVU1CRVJfQUNRVUlTSVRJT05fQ1lDTEVfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgID0gMTMsICAgLyoqPCBTZXJpYWwgTnVtYmVyIEFjcXVpc2l0aW9uIEN5Y2xlIFN0YXJ0LiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICA9IDE0LCAgIC8qKjwgU3RhbmRieSBQT04gTW9uaXRvcmluZyBDeWNsZSBDb21wbGV0ZWQuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUsICAgLyoqPCBTdGF0IEFsYXJtIENsZWFyZWQuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYsICAgLyoqPCBTdGF0IEFsYXJtIFJhaXNlZC4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNywgICAvKio8IFN0YXRlIENoYW5nZSBDb21wbGV0ZWQuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1RPRF9SRVFVRVNUX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgsICAgLyoqPCBUT0QgcmVxdWVzdCBjb21wbGV0ZWQuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIHhncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fTklfQlJPQURDQVNUX1BMT0FNX1BBQ0tFVF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9OSV9CUk9BRENBU1RfUExPQU1fUEFDS0VUX0lEX1BMT0FNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgcGxvYW0uICovCisgICAgQkNNT0xUX1hHUE9OX05JX0JST0FEQ0FTVF9QTE9BTV9QQUNLRVRfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX25pX2NmZ19pZAoreworICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9IV19QT05fSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBIVyBwb24gaWQuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9BVkFJTEFCTEVfQkFORFdJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBBdmFpbGFibGUgQmFuZHdpZHRoLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTlVNQkVSX09GX0FDVElWRV9PTlVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgbnVtYmVyIG9mIGFjdGl2ZSBvbnVzLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUE9OX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgUE9OIHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BPTl9ESVNUQU5DRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IFBPTiBkaXN0YW5jZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1JBTkdJTkdfV0lORE9XX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IFJhbmdpbmcgd2luZG93IHNpemUuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9FUURfQ1lDTEVTX05VTUJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBFcUQgbWVhc3VyZW1lbnQgY3ljbGVzIG51bWJlci4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RSSUZUX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAvKio8IGRyaWZ0IGNvbnRyb2wuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9MT1NfQUxBUk1fVEhSRVNIT0xEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgLyoqPCBsb3MgYWxhcm0gdGhyZXNob2xkLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTE9TX0lOSVRJQUxfVkFMVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgIC8qKjwgbG9zIGluaXRpYWxpemF0aW9uIHZhbHVlLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX0FMQVJNU19USFJFU0hPTERTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgIC8qKjwgT05VIGFsYXJtcyB0aHJlc2hvbGRzLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQkVSX01PTklUT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExLCAgIC8qKjwgQkVSIG1vbml0b3JpbmcgcGFyYW1zLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX0FDVElWQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyLCAgIC8qKjwgT05VIEFjdGl2YXRpb24uICovCisgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9TTl9BQ1FVSVNJVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMsICAgLyoqPCBzbiBhY3F1aXNpdGlvbi4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0tFWV9FWENIQU5HRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNCwgICAvKio8IGtleSBleGNoYW5nZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNSwgICAvKio8IFByb3RlY3Rpb24gc3dpdGNoaW5nLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfREVCVUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2LCAgIC8qKjwgcHJvdGVjdGlvbiBzd2l0Y2hpbmcgZGVidWcgLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQ0JSX1JUX0FMTE9DQVRJT05fUFJPRklMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3LCAgIC8qKjwgQ0JSIFJUIEFsbG9jYXRpb24gcHJvZmlsZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0NCUl9OUlRfQUxMT0NBVElPTl9QUk9GSUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOCwgICAvKio8IENCUiBOUlQgQWxsb2NhdGlvbiBQcm9maWxlLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUE9XRVJfTUFOQUdFTUVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5LCAgIC8qKjwgUG93ZXIgTWFuYWdlbWVudC4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1JPR1VFX09OVV9ERVRFQ1RJT05fUFJPQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMCwgICAvKio8IFJvZ3VlIE9OVSBkZXRlY3Rpb24gcHJvY2Vzcy4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BFUklPRElDX1NUQU5EQllfUE9OX01PTklUT1JJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMSwgICAvKio8IFBlcmlvZGljIHN0YW5kYnkgUE9OIG1vbml0b3JpbmcuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EQkFfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjIsICAgLyoqPCBEQkEgbW9kZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BMT0FNX0hBTkRMSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMywgICAvKio8IFBsb2FtIGhhbmRsaW5nLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTUlOX0RBVEFfQUxMT0NfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0LCAgIC8qKjwgTWluaW11bSBkYXRhIGFsbG9jIGlkLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTUlOX0RBVEFfR0VNX1BPUlRfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1LCAgIC8qKjwgTWluaW11bSBkYXRhIHBvcnQgaWQuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9NVUxUSUNBU1RfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjYsICAgLyoqPCBtdWx0aWNhc3Qga2V5LiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJCU19DSEVDS0VSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI3LCAgIC8qKjwgUFJCUyBDaGVja2VyLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJCU19HRU5FUkFUT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI4LCAgIC8qKjwgUFJCUyBHZW5lcmF0b3IuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QUkJTX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjksICAgLyoqPCBQUkJTIHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0FVVE9NQVRJQ19PTlVfREVBQ1RJVkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMCwgICAvKio8IEF1dG9tYXRpYyBPTlUgZGVhY3RpdmF0aW9uLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfVVNfQkFORFdJRFRIX0xJTUlUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMxLCAgIC8qKjwgVVMgYmFuZHdpZHRoIExpbWl0LiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQUxMX09OVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyLCAgIC8qKjwgYWxsIE9OVXMuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9BTExfTUNBU1RfR0VNX1BPUlRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzMsICAgLyoqPCBhbGwgbXVsdGljYXN0IEdFTSBwb3J0cy4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RFQlVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNCwgICAvKio8IFBPTiBOSSBkZWJ1ZyBwYXJhbWV0ZXJzLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX1VQR1JBREVfUEFSQU1TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM1LCAgIC8qKjwgT05VIHVwZ3JhZGUgcGFyYW1zLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfRFNfRkVDX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM2LCAgIC8qKjwgRFMgRkVDIG1vZGUuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EQkFfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzcsICAgLyoqPCBEQkEgdHlwZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX09OVV9UVU5JTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzOCwgICAvKio8IG9udSB0dW5pbmcuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfRkFJTFVSRV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19GQUlMVVJFX0lEX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgRXJyb3IuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0ZBSUxVUkVfSURfR0VNX1BPUlRfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBHRU0gUG9ydCBJRC4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfRkFJTFVSRV9JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfY3B1X3BhY2tldHMgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfSURfUEFDS0VUX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IHBhY2tldCB0eXBlLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9DQUxDX0NSQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgY2FsYyBjcmMuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0lEX0dFTV9QT1JUX0xJU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBnZW0gcG9ydCBsaXN0LiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9CVUZGRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgYnVmZmVyLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9fTlVNX09GICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiB4Z3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fbmlfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fTklfREVBQ1RJVkFURV9BTExfT05VU19DT01QTEVURURfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogeGdwb25fbmlfZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX05JX0RJU0FCTEVfQUxMX09OVVNfQ09NUExFVEVEX0lEX19OVU1fT0YgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIHhncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlciBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX05JX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IGNvbnRyb2wuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9JRF9TRVJJQUxfTlVNQkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBzZXJpYWwgbnVtYmVyLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9ESVNBQkxFX1NFUklBTF9OVU1CRVJfSURfX05VTV9PRiAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiB4Z3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX05JX0VOQUJMRV9BTExfT05VU19DT01QTEVURURfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfa2V5IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9uaV9rZXlfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fTklfS0VZX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9OSV9LRVlfSURfUE9OX05JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgUE9OIG5ldHdvcmsgaW50ZXJmYWNlLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9LRVlfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fbmlfa2V5X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfbG9zIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9uaV9sb3NfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fTklfTE9TX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9OSV9MT1NfSURfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgc3RhdHVzLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9MT1NfSURfX05VTV9PRiAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fbmlfbG9zX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfb251X2Rpc2NvdmVyZWQgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9TRVJJQUxfTlVNQkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgc2VyaWFsIG51bWJlci4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfUkFOR0lOR19USU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IHJhbmdpbmcgdGltZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfT05VX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IG9udV9pZC4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfVVBTVFJFQU1fTElORV9SQVRFX0NBUEFCSUxJVElFUyAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IHVwc3RyZWFtIGxpbmUgcmF0ZSBjYXBhYmlsaXRpZXMuICovCisgICAgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX0NVUlJFTlRfRE9XTlNUUkVBTV9QT05fSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgLyoqPCBjdXJyZW50IGRvd25zdHJlYW0gcG9uIGlkLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9DVVJSRU5UX1VQU1RSRUFNX1BPTl9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgY3VycmVudCB1cHN0cmVhbSBwb24gaWQuICovCisgICAgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX0NBTElCUkFUSU9OX1JFQ09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBjYWxpYnJhdGlvbiByZWNvcmQuICovCisgICAgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1RVTklOR19HUkFOVUxBUklUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgLyoqPCB0dW5pbmcgZ3JhbnVsYXJpdHkuICovCisgICAgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1NURVBfVFVOSU5HX1RJTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgLyoqPCBzdGVwIHR1bmluZyB0aW1lLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9BVFRFTlVBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgIC8qKjwgYXR0ZW51ZXRpb24uICovCisgICAgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1BPV0VSX0xFVkVMTElOR19DQVBBQklMSVRJRVMgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgLyoqPCBwb3dlciBsZXZlbGxpbmcgY2FwYWJpbGl0aWVzLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIHhncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZAoreworICAgIEJDTU9MVF9YR1BPTl9OSV9PTlVfVVBHUkFERV9DT01QTEVURV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdGF0dXMuICovCisgICAgQkNNT0xUX1hHUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX0xJU1RfT0ZfRkFJTEVEX0VOVElUSUVTICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBMaXN0IG9mIGZhaWxlZCBlbnRpdGllcy4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRURfSURfT05VUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IE9OVXMuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VEX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIHhncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9pZAoreworICAgIEJDTU9MVF9YR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVEX0lEX1JFU1VMVCAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBSZXN1bHQuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVEX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIHhncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9pZAoreworICAgIEJDTU9MVF9YR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FX0lEX1JFU1VMVCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBSZXN1bHQuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfcmVzZXQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX25pX3Jlc2V0X2lkCit7CisgICAgQkNNT0xUX1hHUE9OX05JX1JFU0VUX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fbmlfcmVzZXRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIHhncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1dJTkRPV19UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgV2luZG93IHR5cGUuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfTUVBU1VSRU1FTlRfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBNZWFzdXJlbWVudCBzdGF0dXMuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfQUxMT0NfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBBbGxvYyBJRC4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9PTlVfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IE9OVSBJRC4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9JU19ERUxJTkVBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IElzIGRlbGluZWF0aW9uLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX0lTX0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgSXMgRUQuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUlhfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBSZWNlaXZlZCBkYXRhLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1BMT0FNX1JFQ0VJVkVEX09OVV9JRCAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgIC8qKjwgcGxvYW1fcmVjZWl2ZWRfb251X2lkLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1BMT0FNX1JFQ0VJVkVEX01JQ19FUlJPUiAgICAgICAgICAgICAgICAgICA9IDgsICAgIC8qKjwgcGxvYW1fcmVjZWl2ZWRfbWljX2Vycm9yLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19pZAoreworICAgIEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfV0lORE9XX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBXaW5kb3cgdHlwZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9BTExPQ19JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEFsbG9jIElELiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX09OVV9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgT05VIElELiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX1NFQ09ORF9SQU5HSU5HX1dJTkRPVyAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgU2Vjb25kIHJhbmdpbmcgd2luZG93LiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX19OVU1fT0YgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiB4Z3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX25pX3JvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydF9pZAoreworICAgIEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9PTlVfU1BFQ0lBTF9NQVBfQ1lDTEVfU1RBUlRfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXAgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX05JX1JVTl9TUEVDSUFMX0JXX01BUF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fTklfUlVOX1NQRUNJQUxfQldfTUFQX0lEX05VTUJFUl9PRl9DWUNMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IG51bWJlciBvZiBjeWNsZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfUlVOX1NQRUNJQUxfQldfTUFQX0lEX0FMTE9DQVRJT05fTlVNQkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IGFsbG9jYXRpb24gbnVtYmVyLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9SVU5fU1BFQ0lBTF9CV19NQVBfSURfQldfTUFQX0FSUkFZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgYncgbWFwIGFycmF5LiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9SVU5fU1BFQ0lBTF9CV19NQVBfSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiB4Z3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0X2lkCit7CisgICAgQkNNT0xUX1hHUE9OX05JX1NFUklBTF9OVU1CRVJfQUNRVUlTSVRJT05fQ1lDTEVfU1RBUlRfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfc2V0X29udV9zdGF0ZSAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX05JX1NFVF9PTlVfU1RBVEVfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fTklfU0VUX09OVV9TVEFURV9JRF9PTlVfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IE9OVSBzdGF0ZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfU0VUX09OVV9TVEFURV9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fTklfU0VUX1BPTl9TVEFURV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9OSV9TRVRfUE9OX1NUQVRFX0lEX1BPTl9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgUE9OIHN0YXRlLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9TRVRfUE9OX1NUQVRFX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogeGdwb25fbmlfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fbmlfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZ19pZAoreworICAgIEJDTU9MVF9YR1BPTl9OSV9TSU5HTEVfUkVRVUVTVF9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fbmlfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX05JX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURURfSURfTlVNQkVSX09GX0RFVEVDVEVEX0RFTElNSVRFUiAgPSAwLCAgICAvKio8IG51bWJlciBvZiBkZXRlY3RlZCBkZWxpbWl0ZXIuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVEX0lEX0VORVJHWV9ERVRFQ1RfU0lHTkFMICAgICAgICAgID0gMSwgICAgLyoqPCBlbmVyZ3kgZGV0ZWN0IHNpZ25hbC4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURURfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGUgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fTklfU1RBUlRfT05VX1VQR1JBREVfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFSVF9PTlVfVVBHUkFERV9JRF9MSVNUX09GX09OVV9JRFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgTGlzdCBvZiBPTlUgSURzLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFSVF9PTlVfVVBHUkFERV9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZAoreworICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0FMQVJNX0NMRUFSRURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdGF0aXN0aWMgSUQuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWQgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9BTEFSTV9SQUlTRURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdGlzdGljIElELiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfc3RhdF9jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9DRkdfSURfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IENvbmZpZ3VyYXRpb24uICovCisgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfQ0ZHX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fbmlfc3RhdF9jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9zdGF0IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkCit7CisgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9GRUNfQ09ERVdPUkRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFJlY2VpdmUgRkVDIGNvZGV3b3Jkcy4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9CSVAzMl9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFJlY2VpdmVkIGJ5dGVzIHByb3RlY3RlZCBieSBiaXAzMi4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9CSVAzMl9FUlJPUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IFJlY2VpdmVkIGJpcDMyIGVycm9ycy4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR1RDX0hFQURFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IFJlY2VpdmVkIHZhbGlkIFhHVEMgaGVhZGVycy4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR1RDX0NPUlJFQ1RFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IFJlY2VpdmVkIGNvcnJlY3RlZCBYR1RDIGhlYWRlcnMuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdUQ19VTkNPUlJFQ1RFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgLyoqPCBSZWNlaXZlZCB1bmNvcnJlY3RlZCBYR1RDIGhlYWRlcnMuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdFTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBSZWNlaXZlZCB2YWxpZCBYR0VNIGZyYW1lcy4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR0VNX0RST1BQRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAvKio8IFJlY2VpdmVkIGRyb3BwZWQgWEdFTSBJRCBmcmFtZXMuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdFTV9JRExFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgLyoqPCBSZWNlaXZlZCBpZGxlIFhHRU0gZnJhbWVzLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHRU1fQ09SUkVDVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgIC8qKjwgUmVjZWl2ZWQgY29ycmVjdGVkIFhHRU0gZnJhbWVzLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0NSQ19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgIC8qKjwgUmVjZWl2ZWQgcGFja2V0cyB3aXRoIENSQyBlcnJvci4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9GUkFHTUVOVF9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAvKio8IFJlY2VpdmVkIGZyYWdtZW50IGVycm9ycy4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QQUNLRVRTX0RST1BQRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMiwgICAvKio8IEdsb2JhbCBkcm9wcGVkIHBhY2tldHMuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMsICAgLyoqPCBSZWNlaXZlZCBwYWNrZXRzIGRyb3BwZWQgZHVlIHRvIGxlbmd0aCB0b28gc2hvcnQuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQsICAgLyoqPCBSZWNlaXZlZCBwYWNrZXQgZHJvcHBlZCBkdWUgdG8gbGVuZ3RoIHRvbyBsb25nLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0tFWV9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1LCAgIC8qKjwgUmVjZWl2ZWQga2V5IGVycm9ycy4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9QTE9BTVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNiwgICAvKio8IFRyYW5zbWl0dGVkIFBsb2Ftcy4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfRFJPUFBFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNywgICAvKio8IFJlY2VpdmVkIGRyb3BwZWQgUGxvYW1zLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX1ZBTElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4LCAgIC8qKjwgUmVjZWl2ZWQgdmFsaWQgYWxsb2NhdGlvbnMuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfSU5WQUxJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTksICAgLyoqPCBSZWNlaXZlZCBpbnZhbGlkIGFsbG9jYXRpb25zLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0RJU0FCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwLCAgIC8qKjwgUmVjZWl2ZWQgZGlzYWJsZWQgYWxsb2NhdGlvbnMuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUExPQU1TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjEsICAgLyoqPCBSZWNlaXZlZCBQbG9hbXMuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX05PTl9JRExFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjIsICAgLyoqPCBSZWNlaXZlZCBub24gaWRsZSBQbG9hbXMuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjMsICAgLyoqPCBSZWNlaXZlZCBlcnJvciBQbG9hbXMuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQ1BVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjQsICAgLyoqPCBSZWNlaXZlZCBDUFUgcGFja2V0cy4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9PTUNJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNSwgICAvKio8IFJlY2VpdmVkIE9NQ0kgcGFja2V0cy4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9PTUNJX1BBQ0tFVFNfQ1JDX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNiwgICAvKio8IFJlY2VpdmVkIE9NQ0kgcGFja2V0cyB3aXRoIENSQyBlcnJvcnMuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfUEFDS0VUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjcsICAgLyoqPCBUcmFuc21pdHRlZCBwYWNrZXRzLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX1hHRU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI4LCAgIC8qKjwgVHJhbnNtaXR0ZWQgWEdFTSBmcmFnbWVudHMuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfQ1BVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjksICAgLyoqPCBUcmFuc21pdHRlZCBDUFUgcGFja2V0cy4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9PTUNJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMCwgICAvKio8IFRyYW5zbWl0dGVkIE9NQ0kgcGFja2V0cy4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9DUFVfT01DSV9QQUNLRVRTX0RST1BQRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMSwgICAvKio8IFRyYW5zbWl0IHBhY2tldHMgZHJvcHBlZCBkdWUgdG8gaWxsZWdhbCBsZW5ndGguICovCisgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9JTExFR0FMX0xFTkdUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzIsICAgLyoqPCBUcmFuc21pdCBwYWNrZXRzIGRyb3BwZWQgZHVlIHRvIGlsbGVnYWwgbGVuZ3RoLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfVFBJRF9NSVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMzLCAgIC8qKjwgVHJhbnNtaXQgcGFja2V0cyBkcm9wcGVkIGR1ZSB0byBUUElEIG1pc3MuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9WSURfTUlTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzQsICAgLyoqPCBUcmFuc21pdCBwYWNrZXRzIGRyb3BlZCBkdWUgdG8gVklEIG1pc3MuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiB4Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9SRVNVTFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFJlc3VsdC4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9QUkVWSU9VU19TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFByZXZpb3VzIHN0YXRlLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX05FV19TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgbmV3IHN0YXRlLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiB4Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9pZAoreworICAgIEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9UT0RfU1RSSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCB0b2Rfc3RyaW5nLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfU0ZDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgc2ZjLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfUlRDX09GRlNFVF9TRUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgcnRjX29mZnNldF9zZWMuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9SVENfT0ZGU0VUX05TRUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBydGNfb2Zmc2V0X25zZWMuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgLyoqPCBzdGF0dXMuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX25pX3RvZF9yZXF1ZXN0IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9pZAoreworICAgIEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9JRF9fTlVNX09GICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fT05VX0FESlVTVF9UWF9XQVZFTEVOR1RIX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9PTlVfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfRlJFUVVFTkNZX0FESlVTVE1FTlRfRElSRUNUSU9OICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgRnJlcXVlbmN5IGFkanVzdG1lbnQgZGlyZWN0aW9uLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfRlJFUVVFTkNZX0FESlVTVE1FTlRfU0laRSAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgRnJlcXVlbmN5IGFkanVzdG1lbnQgc2l6ZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0FESlVTVF9UWF9XQVZFTEVOR1RIX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X2F1dG9fY2ZnIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfREZJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgUmVjZWl2ZSBEeWluZy1HYXNwIG9mIE9OVWkuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9ER0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBSZWNlaXZlIER5aW5nLUdhc3Agb2YgT05VaS4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0RPV0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IERyaWZ0IG9mIFdpbmRvdyBvZiBPTlVpLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfSU5WQUxJRF9EQlJVX1JFUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgSW52YWxpZCBEQlJ1IFJlcG9ydC4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IEtleSBFeGNoYW5nZSBDb21wbGV0ZWQuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfQ1lDTEVfU0tJUFBFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgLyoqPCBLZXkgRXhjaGFuZ2UgQ3ljbGUgU2tpcHBlZC4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAvKio8IEtleSBFeGNoYW5nZSBLZXkgTWlzbWF0Y2guICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfS0VZX1JFUVVFU1RfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgLyoqPCBLZXkgRXhjaGFuZ2UgS2V5IFJlcXVlc3QgVGltZW91dC4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0xPT0NJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAvKio8IExPT0NpLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0FDVElWQVRJT05fQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgIC8qKjwgT05VIEFjdGl2YXRpb24gQ29tcGxldGVkLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgIC8qKjwgT05VIEFsYXJtLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExLCAgIC8qKjwgT05VIERlYWN0aXZhdGlvbiBDb21wbGV0ZWQuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfRElTQUJMRV9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIsICAgLyoqPCBPTlUgRGlzYWJsZSBDb21wbGV0ZWQuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfRU5BQkxFX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMsICAgLyoqPCBPTlUgRW5hYmxlIENvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9UVU5JTkdfSU5fQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNCwgICAvKio8IE9OVSBUdW5pbmcgaW4gY29tcGxldGVkLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX1RVTklOR19PVVRfQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1LCAgIC8qKjwgT05VIFR1bmluZyBvdXQgY29tcGxldGVkLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT1BUSUNBTF9SRUZMRUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2LCAgIC8qKjwgT3B0aWNhbCBSZWZsZWN0aW9uLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUE9TU0lCTEVfRFJJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3LCAgIC8qKjwgUG9zc2libGUgRHJpZnQuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9QT1dFUl9DT05TVU1QVElPTl9SRVBPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgsICAgLyoqPCBQb3dlciBjb25zdW1wdGlvbiByZXBvcnQuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9QT1dFUl9MRVZFTF9SRVBPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTksICAgLyoqPCBQb3dlciBsZXZlbCByZXBvcnQuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjAsICAgLyoqPCBQb3dlciBNYW5hZ2VtZW50IFN0YXRlIENoYW5nZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1BRU0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMSwgICAvKio8IHBsb2FtIHF1ZXVlIHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1JBTkdJTkdfQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMiwgICAvKio8IFJhbmdpbmcgQ29tcGxldGVkLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUkVHSVNUUkFUSU9OX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzLCAgIC8qKjwgUmVnaXN0cmF0aW9uIElELiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0LCAgIC8qKjwgUlNTSSBNZWFzdXJlbWVudCBDb21wbGV0ZWQuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9TREkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjUsICAgLyoqPCBTaWduYWwgRGVncmFkZWQgb2YgT05VaS4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAgPSAyNiwgICAvKio8IHNlY3VyZSBtdXR1YWwgYXV0aGVudGljYXRpb24gZmFpbHVyZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1NGSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNywgICAvKio8IFNpZ25hbCBGYWlsIG9mIE9OVWkuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjgsICAgLyoqPCBTdGF0IEFsYXJtIENsZWFyZWQuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjksICAgLyoqPCBTdGF0IEFsYXJtIFJhaXNlZC4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1NVRkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMCwgICAvKio8IFNVRmkuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9USVdJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzEsICAgLyoqPCBUcmFuc21pc3Npb24gSW50ZXJmZXJlbmNlIFdhcm5pbmcuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9UVU5JTkdfUkVTUE9OU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzIsICAgLyoqPCBUdW5pbmcgcmVzcG9uc2UuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX29udV9jZmdfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX09OVV9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgb251IHN0YXRlLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX09OVV9PTERfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgb251IG9sZCBzdGF0ZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9BTEFSTV9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IGFsYXJtIHN0YXRlLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JFR0lTVFJBVElPTl9FTkNSWVBUSU9OX0tFWVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgcmVnaXN0cmF0aW9uIGVuY3J5cHRpb24ga2V5cy4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9DVVJSRU5UX0VOQ1JZUFRJT05fS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IGN1cnJlbnQgZW5jcnlwdGlvbiBrZXkuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfU0VSSUFMX05VTUJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgLyoqPCBzZXJpYWwgbnVtYmVyLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JFR0lTVFJBVElPTl9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgIC8qKjwgcmVnaXN0cmF0aW9uIGlkLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JFR0lTVFJBVElPTl9JRF9BVVRPX0xFQVJOSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgIC8qKjwgUmVnaXN0cmF0aW9uIElEIGF1dG8gbGVhcm5pbmcuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkFOR0lOR19CVVJTVF9QUk9GSUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgLyoqPCByYW5naW5nIGJ1cnN0IHByb2ZpbGUuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfREFUQV9CVVJTVF9QUk9GSUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgLyoqPCBkYXRhIGJ1cnN0IHByb2ZpbGUuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkFOR0lOR19USU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgLyoqPCByYW5naW5nIHRpbWUuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfRElTQUJMRURfQUZURVJfRElTQ09WRVJZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEsICAgLyoqPCBEaXNhYmxlZCBhZnRlciBEaXNjb3ZlcnkuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfREVBQ1RJVkFUSU9OX1JFQVNPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIsICAgLyoqPCBkZWFjdGl2YXRpb24gcmVhc29uLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0FMTF9HRU1fUE9SVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgIC8qKjwgYWxsIEdFTSBwb3J0cy4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9BTExfQUxMT0NTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNCwgICAvKio8IGFsbCBhbGxvY3MuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfRVhURU5ERURfR1VBUkRfVElNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUsICAgLyoqPCBFeHRlbmRlZCBHdWFyZCBUaW1lLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1VTX0xJTkVfUkFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2LCAgIC8qKjwgVVMgbGluZSByYXRlLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0NBTElCUkFUSU9OX1JFQ09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3LCAgIC8qKjwgQ2FsaWJyYXRpb24gcmVjb3JkLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1RVTklOR19HUkFOVUxBUklUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4LCAgIC8qKjwgVHVuaW5nIGdyYW51bGFyaXR5LiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1NURVBfVFVOSU5HX1RJTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5LCAgIC8qKjwgU3RlcCB0dW5pbmcgdGltZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9QT1dFUl9MRVZFTExJTkdfQ0FQQUJJTElUSUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMCwgICAvKio8IFBvd2VyIGxldmVsbGluZyBjYXBhYmlsaXRpZXMuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkVRVUVTVF9SRUdJU1RSQVRJT05fU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjEsICAgLyoqPCBSZXF1ZXN0IHJlZ2lzdHJhdGlvbiBzdGF0dXMuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiB4Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fT05VX0NIQU5HRV9QT1dFUl9MRVZFTExJTkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0hBTkdFX1BPV0VSX0xFVkVMTElOR19JRF9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgY29udHJvbC4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0NIQU5HRV9QT1dFUl9MRVZFTExJTkdfSURfQVRURU5VQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEF0dGVudWF0aW9uLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0hBTkdFX1BPV0VSX0xFVkVMTElOR19JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9jcHVfcGFja2V0IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9pZAoreworICAgIEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUX0lEX1BPUlRfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBwb3J0IGlkLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9DUkNfT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgY3JjIG9rLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9QQUNLRVRfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgcGFja2V0IHNpemUuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUX0lEX0JVRkZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBidWZmZXIuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X2NwdV9wYWNrZXRzIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRTX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfUEFDS0VUX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgcGFja2V0IHR5cGUuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9DQUxDX0NSQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBjYWxjIGNyYy4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRTX0lEX05VTUJFUl9PRl9QQUNLRVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IG51bWJlciBvZiBwYWNrZXRzLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfUEFDS0VUX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgIC8qKjwgU2luZ2xlIHBhY2tldCBzaXplLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgIC8qKjwgYnVmZmVyLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfZGZpIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9vbnVfZGZpX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX09OVV9ERklfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fT05VX0RGSV9JRF9BTEFSTV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IGFsYXJtIHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0RGSV9JRF9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX29udV9kZmlfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfZGdpIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9vbnVfZGdpX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX09OVV9ER0lfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fT05VX0RHSV9JRF9BTEFSTV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IGFsYXJtIHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0RHSV9JRF9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX29udV9kZ2lfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfZG93aSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fb251X2Rvd2lfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fT05VX0RPV0lfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9PTlVfRE9XSV9JRF9BTEFSTV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQWxhcm0gc3RhdHVzLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfRE9XSV9JRF9EUklGVF9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgRHJpZnQgdmFsdWUuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9ET1dJX0lEX05FV19FUUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBOZXcgRVFELiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfRE9XSV9JRF9fTlVNX09GICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogeGdwb25fb251X2dldF9wb3dlcl9jb25zdW1wdGlvbiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fb251X2dldF9wb3dlcl9jb25zdW1wdGlvbl9pZAoreworICAgIEJDTU9MVF9YR1BPTl9PTlVfR0VUX1BPV0VSX0NPTlNVTVBUSU9OX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2NvbnN1bXB0aW9uX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X2dldF9wb3dlcl9sZXZlbCAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2xldmVsX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX09OVV9HRVRfUE9XRVJfTEVWRUxfSURfX05VTV9PRiAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX29udV9nZXRfcG93ZXJfbGV2ZWxfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIHhncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0IGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9pZAoreworICAgIEJDTU9MVF9YR1BPTl9PTlVfSU5WQUxJRF9EQlJVX1JFUE9SVF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX09OVV9JTlZBTElEX0RCUlVfUkVQT1JUX0lEX0FMTE9DX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBBbGxvYy1JRC4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0lOVkFMSURfREJSVV9SRVBPUlRfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX09OVV9LRVlfRVhDSEFOR0VfQ09NUExFVEVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fT05VX0tFWV9FWENIQU5HRV9DT01QTEVURURfSURfTkVXX0tFWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IG5ldyBrZXkuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9LRVlfRVhDSEFOR0VfQ09NUExFVEVEX0lEX19OVU1fT0YgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogeGdwb25fb251X2tleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWRfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fT05VX0tFWV9FWENIQU5HRV9DWUNMRV9TS0lQUEVEX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2ggZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX09OVV9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENIX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0hfSURfRVhQRUNURURfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IGV4cGVjdGVkIGtleS4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0hfSURfUkVDRUlWRURfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IHJlY2VpdmVkIGtleS4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0hfSURfX05VTV9PRiAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIHhncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0X2lkCit7CisgICAgQkNNT0xUX1hHUE9OX09OVV9LRVlfRVhDSEFOR0VfS0VZX1JFUVVFU1RfVElNRU9VVF9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9rZXkgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX29udV9rZXlfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgUE9OIG5ldHdvcmsgaW50ZXJmYWNlLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX09OVV9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgb251IGlkLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fb251X2tleV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9sb29jaSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fb251X2xvb2NpX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX09OVV9MT09DSV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fT05VX0xPT0NJX0lEX0FMQVJNX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IGFsYXJtIHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0xPT0NJX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfb21jaV9wYWNrZXQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9pZAoreworICAgIEJDTU9MVF9YR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9QT1JUX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBwb3J0IGlkLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfQ1JDX09LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgY3JjIG9rLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfUEFDS0VUX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgcGFja2V0IHNpemUuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9CVUZGRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBidWZmZXIuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9pZAoreworICAgIEJDTU9MVF9YR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBzdGF0dXMuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfRkFJTF9SRUFTT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBmYWlsIHJlYXNvbi4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9SRUdJU1RSQVRJT05fSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IHJlZ2lzdHJhdGlvbiBpZC4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9SRUdJU1RSQVRJT05fRU5DUllQVElPTl9LRVlTICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IHJlZ2lzdHJhdGlvbiBlbmNyeXB0aW9uIGtleXMuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X29udV9hbGFybSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fb251X29udV9hbGFybV9pZAoreworICAgIEJDTU9MVF9YR1BPTl9PTlVfT05VX0FMQVJNX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfQUxBUk1fSURfT05VX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBvbnUgYWxhcm0uICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfQUxBUk1fSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1faWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIHhncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfREVBQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fT05VX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFN0YXR1cy4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVEX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9pZAoreworICAgIEJDTU9MVF9YR1BPTl9PTlVfT05VX0RJU0FCTEVfQ09NUExFVEVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfRElTQUJMRV9DT01QTEVURURfSURfU0VSSUFMX05VTUJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBzZXJpYWwgbnVtYmVyLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfT05VX0RJU0FCTEVfQ09NUExFVEVEX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiB4Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9pZAoreworICAgIEJDTU9MVF9YR1BPTl9PTlVfT05VX0VOQUJMRV9DT01QTEVURURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfRU5BQkxFX0NPTVBMRVRFRF9JRF9TRVJJQUxfTlVNQkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBzZXJpYWwgbnVtYmVyLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfT05VX0VOQUJMRV9DT01QTEVURURfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIHhncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX0lOX0NPTVBMRVRFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfSU5fQ09NUExFVEVEX0lEX1JFU1VMVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IHJlc3VsdC4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfSU5fQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IGZhaWwgcmVhc29uLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19JTl9DT01QTEVURURfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfb251X3R1bmluZ19pbiAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9pZAoreworICAgIEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19JTl9JRF9fTlVNX09GICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9pZAoreworICAgIEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfQ09NUExFVEVEX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9DT01QTEVURURfSURfUkVTVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCByZXN1bHQuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9DT01QTEVURURfSURfRkFJTF9SRUFTT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBmYWlsIHJlYXNvbi4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0NPTVBMRVRFRF9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfb251X3R1bmluZ19vdXQgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2lkCit7CisgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1RBUkdFVF9EU19QT05fSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IHRhcmdldCBkcyBwb24gaWQuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9JRF9UQVJHRVRfVVNfUE9OX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCB0YXJnZXQgdXMgcG9uIGlkLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfSURfVElNRV9UT19TV0lUQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgdGltZSB0byBzd2l0Y2guICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9JRF9ST0xMQkFDSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCByb2xsYmFjay4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX19OVU1fT0YgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb25faWQKK3sKKyAgICBCQ01PTFRfWEdQT05fT05VX09QVElDQUxfUkVGTEVDVElPTl9JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X3Bsb2FtX3BhY2tldCAKKyAqIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2lkCit7CisgICAgQkNNT0xUX1hHUE9OX09OVV9QTE9BTV9QQUNLRVRfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fT05VX1BMT0FNX1BBQ0tFVF9JRF9ERUZBVUxUX0tFWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IGRlZmF1bHQga2V5LiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfUExPQU1fUEFDS0VUX0lEX1BMT0FNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgcGxvYW0uICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9QTE9BTV9QQUNLRVRfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0IAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9pZAoreworICAgIEJDTU9MVF9YR1BPTl9PTlVfUE9TU0lCTEVfRFJJRlRfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX09OVV9QT1NTSUJMRV9EUklGVF9JRF9BTEFSTV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBBbGFybSBTdGF0dXMuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9QT1NTSUJMRV9EUklGVF9JRF9FU1RJTUFURURfRFJJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBFc3RpbWF0ZWQgRHJpZnQuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9QT1NTSUJMRV9EUklGVF9JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIHhncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fT05VX1BPV0VSX0NPTlNVTVBUSU9OX1JFUE9SVF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfQ09OU1VNUFRJT05fUkVQT1JUX0lEX1BPV0VSX0NPTlNVTVBUSU9OX1JFUE9SVCAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgcG93ZXIgY29uc3VtcHRpb24gcmVwb3J0LiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfQ09OU1VNUFRJT05fUkVQT1JUX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnQgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9pZAoreworICAgIEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfTEVWRUxfUkVQT1JUX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9MRVZFTF9SRVBPUlRfSURfQVRURU5VQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBBdHRlbnVhdGlvbi4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX1BPV0VSX0xFVkVMX1JFUE9SVF9JRF9QT1dFUl9MRVZFTExJTkdfQ0FQQUJJTElUWSAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFBvd2VyIGxldmVsbGluZyBjYXBhYmlsaXR5LiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfTEVWRUxfUkVQT1JUX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSAKKyAqIHhncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX09MRF9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IE9sZCBTdGF0ZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX05FV19TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IE5ldyBTdGF0ZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX1JFQVNPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IFJlYXNvbi4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfcHFzaSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fb251X3Bxc2lfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fT05VX1BRU0lfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9PTlVfUFFTSV9JRF9BTEFSTV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgYWxhcm0gc3RhdHVzLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfUFFTSV9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX29udV9wcXNpX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9pZAoreworICAgIEJDTU9MVF9YR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBzdGF0dXMuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBmYWlsIHJlYXNvbi4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX0VRRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IEVRRC4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX05VTUJFUl9PRl9QTE9BTVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IG51bWJlciBvZiBwbG9hbXMuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9QT1dFUl9MRVZFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgLyoqPCBwb3dlciBsZXZlbC4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fT05VX1JFR0lTVFJBVElPTl9JRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9PTlVfUkVHSVNUUkFUSU9OX0lEX0lEX1JFR0lTVFJBVElPTl9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgUmVnaXN0cmF0aW9uIElELiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfUkVHSVNUUkFUSU9OX0lEX0lEX1JFUVVFU1RfUkVHSVNUUkFUSU9OX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgcmVxdWVzdCByZWdpc3RyYXRpb24gc3RhdHVzLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfUkVHSVNUUkFUSU9OX0lEX0lEX1JFUVVFU1RfUkVHSVNUUkFUSU9OX0ZBSUxfUkVBU09OICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgcmVxdWVzdCByZWdpc3RyYXRpb24gZmFpbCByZWFzb24uICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9SRUdJU1RSQVRJT05fSURfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiB4Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb24gZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9pZAoreworICAgIEJDTU9MVF9YR1BPTl9PTlVfUkVRVUVTVF9SRUdJU1RSQVRJT05fSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX09OVV9SRVFVRVNUX1JFR0lTVFJBVElPTl9JRF9TTUFfRkxBRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTTUEgZmxhZy4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX1JFUVVFU1RfUkVHSVNUUkFUSU9OX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiB4Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZAoreworICAgIEJDTU9MVF9YR1BPTl9PTlVfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX09OVV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBzdGF0dXMuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBmYWlsIHJlYXNvbi4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9yc3NpX21lYXN1cmVtZW50IAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2lkCit7CisgICAgQkNNT0xUX1hHUE9OX09OVV9SU1NJX01FQVNVUkVNRU5UX0lEX19OVU1fT0YgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9zZGkgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX29udV9zZGlfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fT05VX1NESV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9PTlVfU0RJX0lEX0FMQVJNX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgYWxhcm0gc3RhdHVzLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfU0RJX0lEX0JFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgQkVSLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfU0RJX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fb251X3NkaV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZSBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9pZAoreworICAgIEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9GQUlMVVJFX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX09OVV9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0ZBSUxVUkVfSURfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBzdGF0dXMuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0ZBSUxVUkVfSURfRkFJTF9SRUFTT04gICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBzZWN1cmUgbXV0dWFsIGF1dGhlbnRpY2F0aW9uIGZhaWwgcmVhc29uLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9GQUlMVVJFX0lEX19OVU1fT0YgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIAorICogeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb24gZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX09OVV9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fSURfTUFTVEVSX0tFWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IG1hc3RlciBrZXkuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0lEX0JVRkZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBPTUNJIGRhdGEgYnVmZmVyLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9JRF9NSUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgbWljLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X3NldF9vbnVfc3RhdGUgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGVfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fT05VX1NFVF9PTlVfU1RBVEVfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9PTlVfU0VUX09OVV9TVEFURV9JRF9PTlVfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgT05VIHN0YXRlLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfU0VUX09OVV9TVEFURV9JRF9fTlVNX09GICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGVfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfc2ZpIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX09OVV9TRklfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fT05VX1NGSV9JRF9BTEFSTV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IGFsYXJtIHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX1NGSV9JRF9CRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IEJFUi4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX1NGSV9JRF9fTlVNX09GIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX29udV9zZmlfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkIAorICogZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fT05VX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdGlzdGljIElELiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWQgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fT05VX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFN0YXRpc3RpYyBJRC4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfc3RhdF9jZmcgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19pZAoreworICAgIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9DRkdfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0NGR19JRF9DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBDb25maWd1cmF0aW9uLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9DRkdfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfc3RhdCBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fb251X3N0YXRfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9QT1NJVElWRV9EUklGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgcG9zaXRpdmUgZHJpZnQuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX05FR0FUSVZFX0RSSUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBuZWdhdGl2ZSBkcmlmdC4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfREVMSU1JVEVSX01JU1NfREVURUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAvKio8IGRlbGltaXRlciBtaXNzIGRldGVjdGlvbi4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfQklQMzJfRVJST1JTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IGJpcDMyIGVycm9ycy4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfV09SRFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IHJlY2VpdmVkIHdvcmRzLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09SUkVDVEVEX1NZTUJPTFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgZmVjIGNvcnJlY3RlZCBzeW1ib2xzLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09SUkVDVEVEX0NPREVXT1JEUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgIC8qKjwgZmVjIGNvcnJlY3RlZCBjb2Rld29yZHMuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0ZFQ19VTkNPUlJFQ1RBQkxFX0NPREVXT1JEUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgLyoqPCBmZWMgdW5jb3JyZWN0YWJsZSBjb2Rld29yZHMuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0ZFQ19DT0RFV09SRFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgLyoqPCBmZWMgdG90YWwgY29kZXdvcmRzLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09SUkVDVEVEX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgIC8qKjwgZmVjIGNvcnJlY3RlZCBiaXRzLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9YR0VNX0tFWV9FUlJPUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgIC8qKjwgeGdlbSBrZXkgZXJyb3IuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1hHRU1fTE9TUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEsICAgLyoqPCB4Z2VtIGxvc3MgLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfTUlDX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyLCAgIC8qKjwgbWljIGVycm9yIHBsb2FtLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfTk9OX0lETEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgIC8qKjwgbm9uIGlkbGUgcGxvYW0uICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX09NQ0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQsICAgLyoqPCBSZWNlaXZlZCBPTUNJIHBhY2tldHMuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUsICAgLyoqPCBSZWNlaXZlZCBPTUNJIHBhY2tldHMgd2l0aCBDUkMgZXJyb3JzLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2LCAgIC8qKjwgcnggYnl0ZXMuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX1BBQ0tFVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTcsICAgLyoqPCByeCBwYWNrZXRzLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9UWF9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4LCAgIC8qKjwgdHggYnl0ZXMuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1RYX1BBQ0tFVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTksICAgLyoqPCB0eCBwYWNrZXRzLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX29udV9zdGF0X2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X3N1ZmkgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX29udV9zdWZpX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX09OVV9TVUZJX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWEdQT05fT05VX1NVRklfSURfQUxBUk1fU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IGFsYXJtIHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX1NVRklfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfc3VmaV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV90aXdpIGdyb3VwLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9pZAoreworICAgIEJDTU9MVF9YR1BPTl9PTlVfVElXSV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX09OVV9USVdJX0lEX0FMQVJNX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBBbGFybSBzdGF0dXMuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9USVdJX0lEX0RSSUZUX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBEcmlmdCB2YWx1ZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX1RJV0lfSURfX05VTV9PRiAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV90dW5pbmdfcmVzcG9uc2UgCisgKiBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9pZAoreworICAgIEJDTU9MVF9YR1BPTl9PTlVfVFVOSU5HX1JFU1BPTlNFX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX09OVV9UVU5JTkdfUkVTUE9OU0VfSURfQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBhY2suICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9UVU5JTkdfUkVTUE9OU0VfSURfUkVTVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCByZXN1bHQuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9UVU5JTkdfUkVTUE9OU0VfSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2lkOworCisvKiogSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fdHJ4X2NmZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fdHJ4X2NmZ19pZAoreworICAgIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX19CRUdJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfQlVSU1RfUFJPRklMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBidXJzdCBwcm9maWxlLiAqLworICAgIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1RSQU5TQ0VJVkVSX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgdHJhbnNjZWl2ZXIgY29uZmlnLiAqLworICAgIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1RSQU5TQ0VJVkVSX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgdHJ4IHR5cGUuICovCisgICAgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfREVCVUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBkZWJ1Zy4gKi8KKyAgICBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SU1NJX05PUk1BTF9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IHJzc2kgbm9ybWFsIGNvbmZpZy4gKi8KKyAgICBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SU1NJX1JBTkdJTkdfQ09ORklHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IHJzc2kgcmFuZ2luZyBjb25maWcuICovCisgICAgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfU0VSREVTX0NPTkZJR1VSQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBzZXJkZXMgY29uZmlndXJhdGlvbi4gKi8KKyAgICBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9CVVJTVF9QUk9GSUxFX0RFTElNSVRFUl9NQVhfRVJST1JTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAvKio8IGJ1cnN0IHByb2ZpbGUgZGVsaW1pdGVyIG1heCBlcnJvcnMuICovCisgICAgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUkFOR0lOR19TTV9QQVRURVJOU19BVF9JTklUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgLyoqPCByYW5naW5nIHNtIHBhdHRlcm5zIGF0IGluaXQuICovCisgICAgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUkFOR0lOR19TTV9QQVRURVJOU19FRF9GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgLyoqPCByYW5naW5nIHNtIHBhdHRlcm5zIEVEIGZhaWx1cmUuICovCisgICAgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUkVTRVRfT05fREVMX01JU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgLyoqPCByZXNldCBvbiBkZWwgbWlzcy4gKi8KKyAgICBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9FRF9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAvKio8IGVkIHN0YXRlLiAqLworICAgIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0lOVkVSVF9FRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyLCAgIC8qKjwgaW52ZXJ0IEVELiAqLworICAgIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0VORF9PRl9CVVJTVF9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgIC8qKjwgZW5kIG9mIGJ1cnN0IHJlc2V0LiAqLworICAgIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1RSWF9SU1RfUE9MQVJJVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0LCAgIC8qKjwgVFJYIHJlc2V0IHBvbGFyaXR5LiAqLworICAgIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fdHJ4X2NmZ19pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX3RyeF9rZXkgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX3RyeF9rZXlfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fVFJYX0tFWV9JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9YR1BPTl9UUlhfS0VZX0lEX1BPTl9OSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgUE9OIG5ldHdvcmsgaW50ZXJmYWNlLiAqLworICAgIEJDTU9MVF9YR1BPTl9UUlhfS0VZX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fdHJ4X2tleV9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhwb25fc2VyZGVzX2NmZyBncm91cC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2lkCit7CisgICAgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9fQkVHSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX1ZHQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFJ4IFZnYS4gKi8KKyAgICBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX1BGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAvKio8IFJ4IFBGLiAqLworICAgIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfTEZQRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgUnggTEZQRi4gKi8KKyAgICBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAvKio8IFJ4IERGRTEuICovCisgICAgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkUyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgLyoqPCBSeCBERkUyLiAqLworICAgIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgUnggREZFMy4gKi8KKyAgICBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAvKio8IFJ4IERGRTQuICovCisgICAgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgLyoqPCBSeCBERkU1LiAqLworICAgIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfUFJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgIC8qKjwgVHggUHJlLiAqLworICAgIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfTUFJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgIC8qKjwgVHggTWFpbi4gKi8KKyAgICBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwgICAvKio8IFR4IFBvc3QxLiAqLworICAgIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfUE9TVDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExLCAgIC8qKjwgVHggUG9zdDIuICovCisgICAgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9QT1NUMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIsICAgLyoqPCBUeCBQb3N0My4gKi8KKyAgICBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX0FNUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMywgICAvKio8IFR4IEFtcC4gKi8KKyAgICBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94cG9uX3NlcmRlc19jZmdfaWQ7CisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4cG9uX3NlcmRlc19rZXkgZ3JvdXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hwb25fc2VyZGVzX2tleV9pZAoreworICAgIEJDTU9MVF9YUE9OX1NFUkRFU19LRVlfSURfX0JFR0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX1hQT05fU0VSREVTX0tFWV9JRF9QT05fTkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBQT04gTkkuICovCisgICAgQkNNT0xUX1hQT05fU0VSREVTX0tFWV9JRF9JTlNUQU5DRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBJbnN0YW5jZS4gKi8KKyAgICBCQ01PTFRfWFBPTl9TRVJERVNfS0VZX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94cG9uX3NlcmRlc19rZXlfaWQ7CisKKy8qKiBBbGwgb2JqZWN0IHRhZ3MgZm9yIGFsbCBvYmplY3RzIGluIHRoZSBzeXN0ZW0uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X29ial90YWcKK3sKKyAgICBCQ01PTFRfT0JKX1RBR19fQkVHSU4sCisgICAgQkNNT0xUX09CSl9UQUdfRVBPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfT0JKX1RBR19BRSwKKyAgICBCQ01PTFRfT0JKX1RBR19HUE9OLAorICAgIEJDTU9MVF9PQkpfVEFHX1hHUE9OLAorICAgIEJDTU9MVF9PQkpfVEFHX19OVU1fT0YgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X29ial90YWc7CisKKy8qIFRoZSBmb2xsb3dpbmcgY29uZmlnIG1vZGVzIGFyZSBlbmFibGVkIGZvciB0aGlzIGJ1aWxkICovCisjZGVmaW5lIEJDTU9MVF9DT05GSUdfTU9ERV9FUE9OIDEKKworLyogVGhlIGZvbGxvd2luZyBjb25maWcgbW9kZXMgYXJlIGVuYWJsZWQgZm9yIHRoaXMgYnVpbGQgKi8KKyNkZWZpbmUgQkNNT0xUX0NPTkZJR19NT0RFX0FFICAgMQorCisvKiBUaGUgZm9sbG93aW5nIGNvbmZpZyBtb2RlcyBhcmUgZW5hYmxlZCBmb3IgdGhpcyBidWlsZCAqLworI2RlZmluZSBCQ01PTFRfQ09ORklHX01PREVfR1BPTiAxCisKKy8qIFRoZSBmb2xsb3dpbmcgY29uZmlnIG1vZGVzIGFyZSBlbmFibGVkIGZvciB0aGlzIGJ1aWxkICovCisjZGVmaW5lIEJDTU9MVF9DT05GSUdfTU9ERV9YR1BPTiAgICAxCisKKy8qKiBJZGVudGlmaWVycyBmb3IgYWxsIG9iamVjdHMgaW4gdGhlIHN5c3RlbS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfb2JqX2lkCit7CisgICAgQkNNT0xUX09CSl9JRF9fQkVHSU4sCisgICAgQkNNT0xUX09CSl9JRF9BRV9OSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBBRSBOSSAoQWN0aXZlIEV0aGVybmV0IE5ldHdvcmsgSW50ZXJmYWNlKSAqLworICAgIEJDTU9MVF9PQkpfSURfQUVfUEFUSF9EUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgIC8qKjwgQUUgcGF0aCBkb3duc3RyZWFtICovCisgICAgQkNNT0xUX09CSl9JRF9BRV9QQVRIX1VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgLyoqPCBBRSBwYXRoIHVwc3RyZWFtICovCisgICAgQkNNT0xUX09CSl9JRF9DSEFOTkVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBDaGFubmVsICovCisgICAgQkNNT0xUX09CSl9JRF9ERUJVRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgLyoqPCBEZWJ1ZyAqLworICAgIEJDTU9MVF9PQkpfSURfREVWSUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgIC8qKjwgRGV2aWNlICovCisgICAgQkNNT0xUX09CSl9JRF9FUE9OX0RFTklFRF9MSU5LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBFUE9OIERlbmllZCBMaW5rICovCisgICAgQkNNT0xUX09CSl9JRF9FUE9OX0xJTksgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgLyoqPCBFUE9OIGxpbmsgKi8KKyAgICBCQ01PTFRfT0JKX0lEX0VQT05fTkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAvKio8IEVQT04gTkkgKEVQT04gTmV0d29yayBJbnRlcmZhY2UpICovCisgICAgQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xMEdfVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgLyoqPCBFUE9OIE9OVSAxMEcgVVMgKi8KKyAgICBCQ01PTFRfT0JKX0lEX0VQT05fT05VXzFHX1VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwgICAvKio8IEVQT04gT05VIDFHIFVTICovCisgICAgQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX0RTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEsICAgLyoqPCBFUE9OIHBhdGggMTBHIGRvd25zdHJlYW0gKi8KKyAgICBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMiwgICAvKio8IEVQT04gcGF0aCAxMEcgdXBzdHJlYW0gKi8KKyAgICBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19EUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMywgICAvKio8IEVQT04gcGF0aCAxRyBkb3duc3RyZWFtICovCisgICAgQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQsICAgLyoqPCBFUE9OIHBhdGggMUcgdXBzdHJlYW0gKi8KKyAgICBCQ01PTFRfT0JKX0lEX0VQT05fUlAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNSwgICAvKio8IEVQT04gUmVjb25jaWxpYXRpb24gUGF0aCAqLworICAgIEJDTU9MVF9PQkpfSURfR1BJTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2LCAgIC8qKjwgR1BJTyAqLworICAgIEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3LCAgIC8qKjwgR1BPTiBBbGxvYyAqLworICAgIEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4LCAgIC8qKjwgR1BPTiBHRU0gUG9ydCAqLworICAgIEJDTU9MVF9PQkpfSURfR1BPTl9JV0YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5LCAgIC8qKjwgR1BPTiBJV0YgKi8KKyAgICBCQ01PTFRfT0JKX0lEX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMCwgICAvKio8IEdQT04gSVdGIERTIGVncmVzcyBmbG93ICovCisgICAgQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjEsICAgLyoqPCBHUE9OIElXRiBEUyBpbmdyZXNzIGZsb3cgKi8KKyAgICBCQ01PTFRfT0JKX0lEX0dQT05fSVdGX01BQ19UQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMiwgICAvKio8IEdQT04gSVdGIE1BQyB0YWJsZSAqLworICAgIEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfVVNfRkxPVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzLCAgIC8qKjwgR1BPTiBJV0YgVVMgZmxvdyAqLworICAgIEJDTU9MVF9PQkpfSURfR1BPTl9OSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0LCAgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAqLworICAgIEJDTU9MVF9PQkpfSURfR1BPTl9PTlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1LCAgIC8qKjwgR1BPTiBPTlUgKi8KKyAgICBCQ01PTFRfT0JKX0lEX0dQT05fVFJYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNiwgICAvKio8IEdQT04gVFJYICovCisgICAgQkNNT0xUX09CSl9JRF9MT0dfRU5UUlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjcsICAgLyoqPCBsb2cgZW50cnkgKi8KKyAgICBCQ01PTFRfT0JKX0lEX0xPR0dFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOCwgICAvKio8IGxvZ2dlciAqLworICAgIEJDTU9MVF9PQkpfSURfTk5JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI5LCAgIC8qKjwgTk5JICovCisgICAgQkNNT0xUX09CSl9JRF9OTklfU0VSREVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzAsICAgLyoqPCBubmlfc2VyZGVzICovCisgICAgQkNNT0xUX09CSl9JRF9TT0ZUV0FSRV9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzEsICAgLyoqPCBTb2Z0d2FyZSBFcnJvciAqLworICAgIEJDTU9MVF9PQkpfSURfVFJYX0NBTElCUkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyLCAgIC8qKjwgVFJYIENhbGlicmF0aW9uICovCisgICAgQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzMsICAgLyoqPCBYR1BPTiBBbGxvYyAqLworICAgIEJDTU9MVF9PQkpfSURfWEdQT05fR0VNX1BPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM0LCAgIC8qKjwgWEdQT04gR0VNIHBvcnQgKi8KKyAgICBCQ01PTFRfT0JKX0lEX1hHUE9OX0lXRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNSwgICAvKio8IFhHUE9OIElXRiAqLworICAgIEJDTU9MVF9PQkpfSURfWEdQT05fTkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM2LCAgIC8qKjwgWEdQT04gbmV0d29yayBpbnRlcmZhY2UgKi8KKyAgICBCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNywgICAvKio8IFhHUE9OIE9OVSAqLworICAgIEJDTU9MVF9PQkpfSURfWEdQT05fVFJYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM4LCAgIC8qKjwgWEdQT04gVFJYICovCisgICAgQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzksICAgLyoqPCB4cG9uX3NlcmRlcyAqLworICAgIEJDTU9MVF9PQkpfSURfX05VTV9PRiAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X29ial9pZDsKKworLyoqIElkZW50aWZpZXJzIGZvciBhbGwgcG9zc2libGUgZ3JvdXBzIHVuZGVyIGFsbCBvYmplY3RzIGluIHRoZSBzeXN0ZW0uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dyb3VwX2lkCit7CisgICAgQkNNT0xUX0dST1VQX0lEX19CRUdJTiwKKyAgICBCQ01PTFRfR1JPVVBfSURfQUVfTklfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEFFIE5JIChBY3RpdmUgRXRoZXJuZXQgTmV0d29yayBJbnRlcmZhY2UpIC0ga2V5ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0FFX05JX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgLyoqPCBBRSBOSSAoQWN0aXZlIEV0aGVybmV0IE5ldHdvcmsgSW50ZXJmYWNlKSAtIGNmZyAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9BRV9OSV9TRVRfQUVfTklfRU5fU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgIC8qKjwgQUUgTkkgKEFjdGl2ZSBFdGhlcm5ldCBOZXR3b3JrIEludGVyZmFjZSkgLSBTZXQgQUUgTkkgRW5hYmxlIFN0YXRlICovCisgICAgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfRFNfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgLyoqPCBBRSBwYXRoIGRvd25zdHJlYW0gLSBrZXkgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9EU19TVEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAvKio8IEFFIHBhdGggZG93bnN0cmVhbSAtIHN0YXQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9EU19TVEFUX0NGR19CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAvKio8IEFFIHBhdGggZG93bnN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfRFNfU1RBVF9DRkdfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgLyoqPCBBRSBwYXRoIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX0RTX1NUQVRfQ0ZHX0ZSQU1FU182NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgIC8qKjwgQUUgcGF0aCBkb3duc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9EU19TVEFUX0NGR19GUkFNRVNfNjVfMTI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAvKio8IEFFIHBhdGggZG93bnN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfRFNfU1RBVF9DRkdfRlJBTUVTXzEyOF8yNTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgLyoqPCBBRSBwYXRoIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX0RTX1NUQVRfQ0ZHX0ZSQU1FU18yNTZfNTExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgIC8qKjwgQUUgcGF0aCBkb3duc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9EU19TVEFUX0NGR19GUkFNRVNfNTEyXzEwMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAvKio8IEFFIHBhdGggZG93bnN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfRFNfU1RBVF9DRkdfRlJBTUVTXzEwMjRfMTUxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIsICAgLyoqPCBBRSBwYXRoIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX0RTX1NUQVRfQ0ZHX0ZSQU1FU18xNTE5XzIwNDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgIC8qKjwgQUUgcGF0aCBkb3duc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9EU19TVEFUX0NGR19GUkFNRVNfMjA0OF80MDk1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNCwgICAvKio8IEFFIHBhdGggZG93bnN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfRFNfU1RBVF9DRkdfRlJBTUVTXzQwOTZfOTIxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUsICAgLyoqPCBBRSBwYXRoIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX0RTX1NUQVRfQ0ZHX0ZSQU1FU185MjE3XzE2MzgzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2LCAgIC8qKjwgQUUgcGF0aCBkb3duc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9EU19TVEFUX0NGR19CUk9BRENBU1RfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNywgICAvKio8IEFFIHBhdGggZG93bnN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfRFNfU1RBVF9DRkdfREFUQV9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgsICAgLyoqPCBBRSBwYXRoIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX0RTX1NUQVRfQ0ZHX01VTFRJQ0FTVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5LCAgIC8qKjwgQUUgcGF0aCBkb3duc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9EU19TVEFUX0NGR19VTklDQVNUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMCwgICAvKio8IEFFIHBhdGggZG93bnN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfRFNfU1RBVF9DRkdfQUJPUlRfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjEsICAgLyoqPCBBRSBwYXRoIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX0RTX1NUQVRfQUxBUk1fQ0xFQVJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIyLCAgIC8qKjwgQUUgcGF0aCBkb3duc3RyZWFtIC0gU3RhdCBBbGFybSBDbGVhcmVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfRFNfU1RBVF9BTEFSTV9SQUlTRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjMsICAgLyoqPCBBRSBwYXRoIGRvd25zdHJlYW0gLSBTdGF0IEFsYXJtIFJhaXNlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX0RTX0FVVE9fQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0LCAgIC8qKjwgQUUgcGF0aCBkb3duc3RyZWFtIC0gSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfVVNfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjUsICAgLyoqPCBBRSBwYXRoIHVwc3RyZWFtIC0ga2V5ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfVVNfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjYsICAgLyoqPCBBRSBwYXRoIHVwc3RyZWFtIC0gc3RhdCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX1VTX1NUQVRfQ0ZHX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI3LCAgIC8qKjwgQUUgcGF0aCB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfVVNfU1RBVF9DRkdfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjgsICAgLyoqPCBBRSBwYXRoIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9VU19TVEFUX0NGR19GUkFNRVNfNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOSwgICAvKio8IEFFIHBhdGggdXBzdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX1VTX1NUQVRfQ0ZHX0ZSQU1FU182NV8xMjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMwLCAgIC8qKjwgQUUgcGF0aCB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfVVNfU1RBVF9DRkdfRlJBTUVTXzEyOF8yNTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzEsICAgLyoqPCBBRSBwYXRoIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9VU19TVEFUX0NGR19GUkFNRVNfMjU2XzUxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMiwgICAvKio8IEFFIHBhdGggdXBzdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX1VTX1NUQVRfQ0ZHX0ZSQU1FU181MTJfMTAyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMzLCAgIC8qKjwgQUUgcGF0aCB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfVVNfU1RBVF9DRkdfRlJBTUVTXzEwMjRfMTUxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzQsICAgLyoqPCBBRSBwYXRoIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9VU19TVEFUX0NGR19GUkFNRVNfMTUxOV8yMDQ3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNSwgICAvKio8IEFFIHBhdGggdXBzdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX1VTX1NUQVRfQ0ZHX0ZSQU1FU18yMDQ4XzQwOTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM2LCAgIC8qKjwgQUUgcGF0aCB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfVVNfU1RBVF9DRkdfRlJBTUVTXzQwOTZfOTIxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzcsICAgLyoqPCBBRSBwYXRoIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9VU19TVEFUX0NGR19GUkFNRVNfOTIxN18xNjM4MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzOCwgICAvKio8IEFFIHBhdGggdXBzdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX1VTX1NUQVRfQ0ZHX0JST0FEQ0FTVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM5LCAgIC8qKjwgQUUgcGF0aCB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfVVNfU1RBVF9DRkdfREFUQV9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDAsICAgLyoqPCBBRSBwYXRoIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9VU19TVEFUX0NGR19NVUxUSUNBU1RfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MSwgICAvKio8IEFFIHBhdGggdXBzdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX1VTX1NUQVRfQ0ZHX1VOSUNBU1RfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQyLCAgIC8qKjwgQUUgcGF0aCB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfVVNfU1RBVF9DRkdfQUJPUlRfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDMsICAgLyoqPCBBRSBwYXRoIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9VU19TVEFUX0NGR19GQ1NfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NCwgICAvKio8IEFFIHBhdGggdXBzdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX1VTX1NUQVRfQ0ZHX09WRVJTSVpFX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ1LCAgIC8qKjwgQUUgcGF0aCB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfVVNfU1RBVF9DRkdfUlVOVF9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDYsICAgLyoqPCBBRSBwYXRoIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9VU19TVEFUX0FMQVJNX0NMRUFSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NywgICAvKio8IEFFIHBhdGggdXBzdHJlYW0gLSBTdGF0IEFsYXJtIENsZWFyZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9VU19TVEFUX0FMQVJNX1JBSVNFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0OCwgICAvKio8IEFFIHBhdGggdXBzdHJlYW0gLSBTdGF0IEFsYXJtIFJhaXNlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX1VTX0FVVE9fQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ5LCAgIC8qKjwgQUUgcGF0aCB1cHN0cmVhbSAtIEluZGljYXRpb24gQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9DSEFOTkVMX0tFWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUwLCAgIC8qKjwgQ2hhbm5lbCAtIGtleSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9DSEFOTkVMX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUxLCAgIC8qKjwgQ2hhbm5lbCAtIGNmZyAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9ERUJVR19LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUyLCAgIC8qKjwgRGVidWcgLSBrZXkgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfREVCVUdfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MywgICAvKio8IERlYnVnIC0gY2ZnICovCisgICAgQkNNT0xUX0dST1VQX0lEX0RFQlVHX0NMSV9PVVRQVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTQsICAgLyoqPCBEZWJ1ZyAtIGNsaV9vdXRwdXQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfREVCVUdfRklMRV9BTE1PU1RfRlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NSwgICAvKio8IERlYnVnIC0gZmlsZV9hbG1vc3RfZnVsbCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9ERUJVR19BVVRPX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU2LCAgIC8qKjwgRGVidWcgLSBJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfREVCVUdfQ0xJX0lOUFVUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NywgICAvKio8IERlYnVnIC0gQ0xJX2lucHV0ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0RFQlVHX1JFU0VUX0FQSV9DQVBUVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTgsICAgLyoqPCBEZWJ1ZyAtIFJlc2V0IEFQSSBDYXB0dXJlICovCisgICAgQkNNT0xUX0dST1VQX0lEX0RFQlVHX1NUQVJUX0FQSV9DQVBUVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTksICAgLyoqPCBEZWJ1ZyAtIFN0YXJ0IEFQSSBDYXB0dXJlICovCisgICAgQkNNT0xUX0dST1VQX0lEX0RFQlVHX1NUT1BfQVBJX0NBUFRVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjAsICAgLyoqPCBEZWJ1ZyAtIFN0b3AgQVBJIENhcHR1cmUgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfREVWSUNFX0tFWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MSwgICAvKio8IERldmljZSAtIGtleSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9ERVZJQ0VfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYyLCAgIC8qKjwgRGV2aWNlIC0gY2ZnICovCisgICAgQkNNT0xUX0dST1VQX0lEX0RFVklDRV9DT05ORUNUSU9OX0NPTVBMRVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjMsICAgLyoqPCBEZXZpY2UgLSBDb25uZWN0aW9uIENvbXBsZXRlICovCisgICAgQkNNT0xUX0dST1VQX0lEX0RFVklDRV9DT05ORUNUSU9OX0VTVEFCTElTSEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjQsICAgLyoqPCBEZXZpY2UgLSBDb25uZWN0aW9uIEVzdGFibGlzaGVkIChJbnRlcm5hbCkgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfREVWSUNFX0NPTk5FQ1RJT05fRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NSwgICAvKio8IERldmljZSAtIENvbm5lY3Rpb24gRmFpbHVyZSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9ERVZJQ0VfRERSX1RFU1RfQ09NUExFVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDY2LCAgIC8qKjwgRGV2aWNlIC0gRERSIFRlc3QgQ29tcGxldGUgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfREVWSUNFX0RFVklDRV9LRUVQX0FMSVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NywgICAvKio8IERldmljZSAtIERldmljZSBLZWVwIEFsaXZlIChJbnRlcm5hbCkgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfREVWSUNFX0RFVklDRV9SRUFEWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2OCwgICAvKio8IERldmljZSAtIERldmljZSBSZWFkeSAoSW50ZXJuYWwpICovCisgICAgQkNNT0xUX0dST1VQX0lEX0RFVklDRV9ESVNDT05ORUNUSU9OX0NPTVBMRVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjksICAgLyoqPCBEZXZpY2UgLSBEaXNjb25uZWN0aW9uIENvbXBsZXRlICovCisgICAgQkNNT0xUX0dST1VQX0lEX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9DT01QTEVURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzAsICAgLyoqPCBEZXZpY2UgLSBJbWFnZSBUcmFuc2ZlciBDb21wbGV0ZSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9ERVZJQ0VfSU5ESUNBVElPTlNfRFJPUFBFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcxLCAgIC8qKjwgRGV2aWNlIC0gSW5kaWNhdGlvbnMgRHJvcHBlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9ERVZJQ0VfU1dfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcyLCAgIC8qKjwgRGV2aWNlIC0gc3cgZXJyb3IgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfREVWSUNFX1NXX0VYQ0VQVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3MywgICAvKio8IERldmljZSAtIHN3IGV4Y2VwdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9ERVZJQ0VfQVVUT19DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc0LCAgIC8qKjwgRGV2aWNlIC0gSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0RFVklDRV9DT05ORUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzUsICAgLyoqPCBEZXZpY2UgLSBDb25uZWN0ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0RFVklDRV9ESVNDT05ORUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzYsICAgLyoqPCBEZXZpY2UgLSBEZXZpY2UgRGlzY29ubmVjdCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9ERVZJQ0VfSE9TVF9LRUVQX0FMSVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc3LCAgIC8qKjwgRGV2aWNlIC0gSG9zdCBLZWVwIEFsaXZlIChJbnRlcm5hbCkgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfREVWSUNFX0lNQUdFX1RSQU5TRkVSX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3OCwgICAvKio8IERldmljZSAtIEltYWdlIERhdGEgVHJhbnNmZXIgT3BlcmF0aW9uIChJbnRlcm5hbCkgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfREVWSUNFX0lNQUdFX1RSQU5TRkVSX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3OSwgICAvKio8IERldmljZSAtIFN0YXJ0IEltYWdlIFRyYW5zZmVyIE9wZXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9ERVZJQ0VfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgwLCAgIC8qKjwgRGV2aWNlIC0gRGV2aWNlIFJlc2V0ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0RFVklDRV9SVU5fRERSX1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gODEsICAgLyoqPCBEZXZpY2UgLSBSdW4gRERSIFRlc3QgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfREVWSUNFX1NXX1VQR1JBREVfQUNUSVZBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4MiwgICAvKio8IERldmljZSAtIFNXIHVwZ3JhZGUgYWN0aXZhdGUgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9ERU5JRURfTElOS19LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4MywgICAvKio8IEVQT04gRGVuaWVkIExpbmsgLSBrZXkgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9ERU5JRURfTElOS19DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4NCwgICAvKio8IEVQT04gRGVuaWVkIExpbmsgLSBjZmcgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9ERU5JRURfTElOS19MQVNFUl9PTl9PRkZfVklPTEFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4NSwgICAvKio8IEVQT04gRGVuaWVkIExpbmsgLSBMYXNlciBPbi9PZmYgVmlvbGF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fREVOSUVEX0xJTktfTExJRF9QT09MX0VNUFRZX1ZJT0xBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gODYsICAgLyoqPCBFUE9OIERlbmllZCBMaW5rIC0gTExJRCBQb29sIEVtcHR5IFZpb2xhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0RFTklFRF9MSU5LX01BWF9MSU5LX1ZJT0xBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDg3LCAgIC8qKjwgRVBPTiBEZW5pZWQgTGluayAtIE1heCBMaW5rIFZpb2xhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0RFTklFRF9MSU5LX09WRVJIRUFEX1BST0ZJTEVfVklPTEFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDg4LCAgIC8qKjwgRVBPTiBEZW5pZWQgTGluayAtIE92ZXJoZWFkIFByb2ZpbGUgVmlvbGF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fREVOSUVEX0xJTktfUkFOR0VfVklPTEFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gODksICAgLyoqPCBFUE9OIERlbmllZCBMaW5rIC0gUmFuZ2UgVmlvbGF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fREVOSUVEX0xJTktfUk9HVUVfVklPTEFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOTAsICAgLyoqPCBFUE9OIERlbmllZCBMaW5rIC0gUm9ndWUgT05VIERldGVjdGVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fREVOSUVEX0xJTktfU1lTVEVNX1JFU09VUkNFX1ZJT0xBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOTEsICAgLyoqPCBFUE9OIERlbmllZCBMaW5rIC0gU3lzdGVtIFJlc291cmNlIFZpb2xhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0RFTklFRF9MSU5LX1RETV9DSEFOTkVMU19FWEhBVVNURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDkyLCAgIC8qKjwgRVBPTiBEZW5pZWQgTGluayAtIFRETSBDaGFubmVscyBFeGhhdXN0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9ERU5JRURfTElOS19VTktOT1dOX0xJTktfVklPTEFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5MywgICAvKio8IEVQT04gRGVuaWVkIExpbmsgLSBVbmtub3duIExpbmsgVmlvbGF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fREVOSUVEX0xJTktfVVBTVFJFQU1fQkFORFdJRFRIX1ZJT0xBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOTQsICAgLyoqPCBFUE9OIERlbmllZCBMaW5rIC0gVXBzdHJlYW0gQmFuZHdpZHRoIFZpb2xhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDk1LCAgIC8qKjwgRVBPTiBEZW5pZWQgTGluayAtIEluZGljYXRpb24gQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDk2LCAgIC8qKjwgRVBPTiBsaW5rIC0ga2V5ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOTcsICAgLyoqPCBFUE9OIGxpbmsgLSBjZmcgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5OCwgICAvKio8IEVQT04gbGluayAtIHN0YXQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1JYX0RBVEFfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5OSwgICAvKio8IEVQT04gbGluayAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19SWF9EQVRBX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAwLCAgLyoqPCBFUE9OIGxpbmsgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfUlhfRlJBTUVTXzY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwMSwgIC8qKjwgRVBPTiBsaW5rIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1JYX0ZSQU1FU182NV8xMjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDIsICAvKio8IEVQT04gbGluayAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19SWF9GUkFNRVNfMTI4XzI1NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAzLCAgLyoqPCBFUE9OIGxpbmsgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfUlhfRlJBTUVTXzI1Nl81MTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwNCwgIC8qKjwgRVBPTiBsaW5rIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1JYX0ZSQU1FU181MTJfMTAyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDUsICAvKio8IEVQT04gbGluayAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19SWF9GUkFNRVNfMTAyNF8xNTE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTA2LCAgLyoqPCBFUE9OIGxpbmsgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfUlhfRlJBTUVTXzE1MTlfMjA0NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwNywgIC8qKjwgRVBPTiBsaW5rIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1JYX0ZSQU1FU18yMDQ4XzQwOTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDgsICAvKio8IEVQT04gbGluayAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19SWF9GUkFNRVNfNDA5Nl85MjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTA5LCAgLyoqPCBFUE9OIGxpbmsgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfUlhfRlJBTUVTXzkyMTdfMTYzODMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExMCwgIC8qKjwgRVBPTiBsaW5rIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1JYX09BTV9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMTEsICAvKio8IEVQT04gbGluayAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19SWF9PQU1fRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEyLCAgLyoqPCBFUE9OIGxpbmsgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfUlhfTVBDUF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExMywgIC8qKjwgRVBPTiBsaW5rIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1JYX0JST0FEQ0FTVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMTQsICAvKio8IEVQT04gbGluayAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19SWF9VTklDQVNUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTE1LCAgLyoqPCBFUE9OIGxpbmsgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfUlhfTVVMVElDQVNUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExNiwgIC8qKjwgRVBPTiBsaW5rIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1JYX1JFUE9SVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMTcsICAvKio8IEVQT04gbGluayAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19SWF9GQ1NfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTE4LCAgLyoqPCBFUE9OIGxpbmsgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfUlhfT1ZFUlNJWkVfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExOSwgIC8qKjwgRVBPTiBsaW5rIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1JYX1JVTlRfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjAsICAvKio8IEVQT04gbGluayAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19SWF9MSU5FX0NPREVfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIxLCAgLyoqPCBFUE9OIGxpbmsgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfUlhfTElORV9DT0RFX0VSUk9SX01BWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyMiwgIC8qKjwgRVBPTiBsaW5rIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1RYX0RBVEFfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjMsICAvKio8IEVQT04gbGluayAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19UWF9EQVRBX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTI0LCAgLyoqPCBFUE9OIGxpbmsgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfVFhfRlJBTUVTXzY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyNSwgIC8qKjwgRVBPTiBsaW5rIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1RYX0ZSQU1FU182NV8xMjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjYsICAvKio8IEVQT04gbGluayAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19UWF9GUkFNRVNfMTI4XzI1NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTI3LCAgLyoqPCBFUE9OIGxpbmsgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfVFhfRlJBTUVTXzI1Nl81MTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyOCwgIC8qKjwgRVBPTiBsaW5rIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1RYX0ZSQU1FU181MTJfMTAyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjksICAvKio8IEVQT04gbGluayAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19UWF9GUkFNRVNfMTAyNF8xNTE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMwLCAgLyoqPCBFUE9OIGxpbmsgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfVFhfRlJBTUVTXzE1MTlfMjA0NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzMSwgIC8qKjwgRVBPTiBsaW5rIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1RYX0ZSQU1FU18yMDQ4XzQwOTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzIsICAvKio8IEVQT04gbGluayAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19UWF9GUkFNRVNfNDA5Nl85MjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMzLCAgLyoqPCBFUE9OIGxpbmsgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfVFhfRlJBTUVTXzkyMTdfMTYzODMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzNCwgIC8qKjwgRVBPTiBsaW5rIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1RYX09BTV9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzUsICAvKio8IEVQT04gbGluayAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19UWF9PQU1fRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTM2LCAgLyoqPCBFUE9OIGxpbmsgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfVFhfTVBDUF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzNywgIC8qKjwgRVBPTiBsaW5rIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1RYX0JST0FEQ0FTVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzgsICAvKio8IEVQT04gbGluayAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19UWF9VTklDQVNUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTM5LCAgLyoqPCBFUE9OIGxpbmsgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfVFhfTVVMVElDQVNUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0MCwgIC8qKjwgRVBPTiBsaW5rIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1RYX0dBVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNDEsICAvKio8IEVQT04gbGluayAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19EVVBMSUNBVEVfTVBDUF9SRUdJU1RSQVRJT05fUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQyLCAgLyoqPCBFUE9OIGxpbmsgLSBEdXBsaWNhdGUgTVBDUCBSZWdpc3RyYXRpb24gUmVxdWVzdCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfRU5DUllQVElPTl9FTkFCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0MywgIC8qKjwgRVBPTiBsaW5rIC0gRW5jcnlwdGlvbiBFbmFibGVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19LRVlfRVhDSEFOR0VfRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQ0LCAgLyoqPCBFUE9OIGxpbmsgLSBLZXkgRXhjaGFuZ2UgRmFpbHVyZSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfS0VZX0VYQ0hBTkdFX1NUQVJURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0NSwgIC8qKjwgRVBPTiBsaW5rIC0ga2V5X2V4Y2hhbmdlX3N0YXJ0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX0tFWV9FWENIQU5HRV9TVE9QUEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNDYsICAvKio8IEVQT04gbGluayAtIGtleV9leGNoYW5nZV9zdG9wcGVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19MSU5LX0RFTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQ3LCAgLyoqPCBFUE9OIGxpbmsgLSBMaW5rIERlbGV0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX0xJTktfU1BFRURfTUlTTUFUQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNDgsICAvKio8IEVQT04gbGluayAtIExpbmsgYXR0ZW1wdGVkIHRvIHJlZ2lzdGVyIGF0IGEgZGlmZmVyZW50IHNwZWVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19NUENQX0RFUkVHSVNURVJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQ5LCAgLyoqPCBFUE9OIGxpbmsgLSBNUENQIERlcmVnaXN0ZXJlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfTVBDUF9ESVNDT1ZFUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1MCwgIC8qKjwgRVBPTiBsaW5rIC0gTVBDUCBEaXNjb3ZlcmVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19NUENQX1JFR19BQ0tfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUxLCAgLyoqPCBFUE9OIGxpbmsgLSBNUENQIFJlZyBBY2sgVGltZW91dCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfTVBDUF9SRVBPUlRfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1MiwgIC8qKjwgRVBPTiBsaW5rIC0gTVBDUCBSZXBvcnQgVGltZW91dCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfT0FNX0tFRVBBTElWRV9USU1FT1VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1MywgIC8qKjwgRVBPTiBsaW5rIC0gT0FNIEtlZXBhbGl2ZSBUaW1lb3V0ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19PQU1fS0VFUEFMSVZFX1RJTUVSX1NUQVJURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTU0LCAgLyoqPCBFUE9OIGxpbmsgLSBPQU0ga2VlcGFsaXZlIHRpbWVyIHN0YXJ0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX09BTV9LRUVQQUxJVkVfVElNRVJfU1RPUFBFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNTUsICAvKio8IEVQT04gbGluayAtIE9BTSBrZWVwYWxpdmUgdGltZXIgc3RvcHBlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfUFJFUFJPVklTSU9ORURfTElOS19DUkVBVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1NiwgIC8qKjwgRVBPTiBsaW5rIC0gUHJlcHJvdmlzaW9uZWQgTGluayBDcmVhdGVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19QUk9URUNUSU9OX1NXSVRDSF9PQ0NVUlJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTU3LCAgLyoqPCBFUE9OIGxpbmsgLSBQcm90ZWN0aW9uIFN3aXRjaCBPY2N1cnJlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfUkFOR0VfVkFMVUVfQ0hBTkdFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1OCwgIC8qKjwgRVBPTiBsaW5rIC0gUmFuZ2UgVmFsdWUgQ2hhbmdlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfUkVSQU5HRV9GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1OSwgIC8qKjwgRVBPTiBsaW5rIC0gUmUtcmFuZ2UgZmFpbHVyZSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9BTEFSTV9DTEVBUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2MCwgIC8qKjwgRVBPTiBsaW5rIC0gU3RhdCBBbGFybSBDbGVhcmVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0FMQVJNX1JBSVNFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYxLCAgLyoqPCBFUE9OIGxpbmsgLSBTdGF0IEFsYXJtIFJhaXNlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVElDX1JFR0lTVFJBVElPTl9ET05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2MiwgIC8qKjwgRVBPTiBsaW5rIC0gU3RhdGljIHJlZ2lzdHJhdGlvbiBkb25lICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19BVVRPX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYzLCAgLyoqPCBFUE9OIGxpbmsgLSBJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX0RFTEVURV9MSU5LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNjQsICAvKio8IEVQT04gbGluayAtIERlbGV0ZSBMaW5rICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19GT1JDRV9SRURJU0NPVkVSWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTY1LCAgLyoqPCBFUE9OIGxpbmsgLSBGb3JjZSBMaW5rIFJlZGlzY292ZXJ5ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19LRVlfRVhDSEFOR0VfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTY2LCAgLyoqPCBFUE9OIGxpbmsgLSBLZXkgZXhjaGFuZ2Ugc3RhcnQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX0tFWV9FWENIQU5HRV9TVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNjcsICAvKio8IEVQT04gbGluayAtIEtleSBleGNoYW5nZSBzdG9wICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19PQU1fS0VFUEFMSVZFX1RJTUVSX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTY4LCAgLyoqPCBFUE9OIGxpbmsgLSBPQU0gS2VlcGFsaXZlIFRpbWVyIFN0YXJ0ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19PQU1fS0VFUEFMSVZFX1RJTUVSX1NUT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTY5LCAgLyoqPCBFUE9OIGxpbmsgLSBPQU0gS2VlcGFsaXZlIFRpbWVyIFN0b3AgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRJQ19SRUdJU1RSQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNzAsICAvKio8IEVQT04gbGluayAtIHN0YXRpY19yZWdpc3RyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX0lOSkVDVF9GUkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNzEsICAvKio8IEVQT04gbGluayAtIEluamVjdCBGcmFtZSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfRlJBTUVfQ0FQVFVSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3MiwgIC8qKjwgRVBPTiBsaW5rIC0gRnJhbWUgQ2FwdHVyZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9OSV9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNzMsICAvKio8IEVQT04gTkkgKEVQT04gTmV0d29yayBJbnRlcmZhY2UpIC0ga2V5ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTklfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTc0LCAgLyoqPCBFUE9OIE5JIChFUE9OIE5ldHdvcmsgSW50ZXJmYWNlKSAtIGNmZyAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX05JX0FVVE9fUk9HVUVfU0NBTl8xMEdfRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3NSwgIC8qKjwgRVBPTiBOSSAoRVBPTiBOZXR3b3JrIEludGVyZmFjZSkgLSAxMEcgRXBvbiBBdXRvbm9tb3VzIFJvZ3VlIFNjYW4gZmFpbHVyZSBkZXRlY3RlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX05JX0FVVE9fUk9HVUVfU0NBTl8xR19GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3NiwgIC8qKjwgRVBPTiBOSSAoRVBPTiBOZXR3b3JrIEludGVyZmFjZSkgLSAxRyBFcG9uIEF1dG9ub21vdXMgUm9ndWUgU2NhbiBmYWlsdXJlIGRldGVjdGVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTklfTExJRF9RVUFSQU5USU5FRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTc3LCAgLyoqPCBFUE9OIE5JIChFUE9OIE5ldHdvcmsgSW50ZXJmYWNlKSAtIExMSUQgUXVhcmFudGluZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9OSV9NUENQX1RJTUVTVEFNUF9DSEFOR0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNzgsICAvKio8IEVQT04gTkkgKEVQT04gTmV0d29yayBJbnRlcmZhY2UpIC0gTVBDUCBUaW1lc3RhbXAgQ2hhbmdlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX05JX05PX1JFUE9SVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3OSwgIC8qKjwgRVBPTiBOSSAoRVBPTiBOZXR3b3JrIEludGVyZmFjZSkgLSBObyBSZXBvcnRzICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgwLCAgLyoqPCBFUE9OIE5JIChFUE9OIE5ldHdvcmsgSW50ZXJmYWNlKSAtIE9OVSBVcGdyYWRlIENvbXBsZXRlICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTklfUkVSQU5HRV9GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgxLCAgLyoqPCBFUE9OIE5JIChFUE9OIE5ldHdvcmsgSW50ZXJmYWNlKSAtIFJlLXJhbmdlIGZhaWx1cmUgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9OSV9ST0dVRV9TQ0FOX0NPTVBMRVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxODIsICAvKio8IEVQT04gTkkgKEVQT04gTmV0d29yayBJbnRlcmZhY2UpIC0gUm9ndWUgU2NhbiBpcyBDb21wbGV0ZSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX05JX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4MywgIC8qKjwgRVBPTiBOSSAoRVBPTiBOZXR3b3JrIEludGVyZmFjZSkgLSBSU1NJIE1lYXN1cmVtZW50IENvbXBsZXRlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4NCwgIC8qKjwgRVBPTiBOSSAoRVBPTiBOZXR3b3JrIEludGVyZmFjZSkgLSBTdGF0ZSBDaGFuZ2UgQ29tcGxldGVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTklfQVVUT19DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTg1LCAgLyoqPCBFUE9OIE5JIChFUE9OIE5ldHdvcmsgSW50ZXJmYWNlKSAtIEluZGljYXRpb24gQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX05JX0FERF9MSU5LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4NiwgIC8qKjwgRVBPTiBOSSAoRVBPTiBOZXR3b3JrIEludGVyZmFjZSkgLSBBZGQgbGluayAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX05JX0FERF9NVUxUSUNBU1RfTElOSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4NywgIC8qKjwgRVBPTiBOSSAoRVBPTiBOZXR3b3JrIEludGVyZmFjZSkgLSBBZGQgTXV0bHRpY2FzdGxpbmsgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9OSV9BRERfUFJPVEVDVEVEX1NUQU5EQllfTElOSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxODgsICAvKio8IEVQT04gTkkgKEVQT04gTmV0d29yayBJbnRlcmZhY2UpIC0gQWRkIFByb3RlY3RlZCBTdGFuZGJ5IExpbmsgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxODksICAvKio8IEVQT04gTkkgKEVQT04gTmV0d29yayBJbnRlcmZhY2UpIC0gSXNzdWUgYW4gUnggUG93ZXIgTWVhc3VyZW1lbnQgUmVxdWVzdCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX0FQUExZX1JFUkFOR0VfREVMVEEgICAgICAgICAgICAgICAgICAgICAgICA9IDE5MCwgIC8qKjwgRVBPTiBOSSAoRVBPTiBOZXR3b3JrIEludGVyZmFjZSkgLSBQcm90ZWN0aW9uIHN3aXRjaGluZyBhcHBseSByZS1yYW5nZSBkZWx0YSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX05JX1JPR1VFX0xMSURfU0NBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5MSwgIC8qKjwgRVBPTiBOSSAoRVBPTiBOZXR3b3JrIEludGVyZmFjZSkgLSBSdW4gUm9ndWUgTExJRCBTY2FuICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fTklfU0VUX0VQT05fTklfRU5fU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTkyLCAgLyoqPCBFUE9OIE5JIChFUE9OIE5ldHdvcmsgSW50ZXJmYWNlKSAtIFNldCBFUE9OIE5JIEVuYWJsZSBTdGF0ZSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX05JX1NUQVJUX09OVV9VUEdSQURFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5MywgIC8qKjwgRVBPTiBOSSAoRVBPTiBOZXR3b3JrIEludGVyZmFjZSkgLSBTdGFydCBPTlUgRmlybXdhcmUgVXBncmFkZSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX09OVV8xMEdfVVNfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5NCwgIC8qKjwgRVBPTiBPTlUgMTBHIFVTIC0ga2V5ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzEwR19VU19DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTk1LCAgLyoqPCBFUE9OIE9OVSAxMEcgVVMgLSBjZmcgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9PTlVfMTBHX1VTX1NUQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOTYsICAvKio8IEVQT04gT05VIDEwRyBVUyAtIHN0YXQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9PTlVfMTBHX1VTX1NUQVRfQ0ZHX0ZFQ19DT0RFX1dPUkRTX1RPVEFMICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOTcsICAvKio8IEVQT04gT05VIDEwRyBVUyAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzEwR19VU19TVEFUX0NGR19GRUNfQ09ERV9XT1JEU19ERUNPREVfRkFJTFMgICAgICAgICAgICAgICAgICAgID0gMTk4LCAgLyoqPCBFUE9OIE9OVSAxMEcgVVMgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX09OVV8xMEdfVVNfU1RBVF9DRkdfRkVDX1pFUk9FU19DT1JSRUNURUQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5OSwgIC8qKjwgRVBPTiBPTlUgMTBHIFVTIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9PTlVfMTBHX1VTX1NUQVRfQ0ZHX0ZFQ19PTkVTX0NPUlJFQ1RFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMDAsICAvKio8IEVQT04gT05VIDEwRyBVUyAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzEwR19VU19TVEFUX0FMQVJNX0NMRUFSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjAxLCAgLyoqPCBFUE9OIE9OVSAxMEcgVVMgLSBTdGF0IEFsYXJtIENsZWFyZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9PTlVfMTBHX1VTX1NUQVRfQUxBUk1fUkFJU0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMDIsICAvKio8IEVQT04gT05VIDEwRyBVUyAtIFN0YXQgQWxhcm0gUmFpc2VkICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzEwR19VU19BVVRPX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjAzLCAgLyoqPCBFUE9OIE9OVSAxMEcgVVMgLSBJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9PTlVfMUdfVVNfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMDQsICAvKio8IEVQT04gT05VIDFHIFVTIC0ga2V5ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA1LCAgLyoqPCBFUE9OIE9OVSAxRyBVUyAtIGNmZyAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX09OVV8xR19VU19TVEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwNiwgIC8qKjwgRVBPTiBPTlUgMUcgVVMgLSBzdGF0ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX0dPT0RfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA3LCAgLyoqPCBFUE9OIE9OVSAxRyBVUyAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX0dPT0RfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA4LCAgLyoqPCBFUE9OIE9OVSAxRyBVUyAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX09WRVJTWl9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA5LCAgLyoqPCBFUE9OIE9OVSAxRyBVUyAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX05PTl9GRUNfR09PRF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjEwLCAgLyoqPCBFUE9OIE9OVSAxRyBVUyAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX05PTl9GRUNfR09PRF9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjExLCAgLyoqPCBFUE9OIE9OVSAxRyBVUyAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX0ZFQ19HT09EX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjEyLCAgLyoqPCBFUE9OIE9OVSAxRyBVUyAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX0ZFQ19HT09EX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjEzLCAgLyoqPCBFUE9OIE9OVSAxRyBVUyAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX0ZFQ19GUkFNRVNfRVhDX0VSUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjE0LCAgLyoqPCBFUE9OIE9OVSAxRyBVUyAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX0ZFQ19CTEtTX05PX0VSUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjE1LCAgLyoqPCBFUE9OIE9OVSAxRyBVUyAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX0ZFQ19CTEtTX0NPUlJfRVJSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjE2LCAgLyoqPCBFUE9OIE9OVSAxRyBVUyAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX0ZFQ19CTEtTX1VOQ09SUl9FUlJTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjE3LCAgLyoqPCBFUE9OIE9OVSAxRyBVUyAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX0ZFQ19DT1JSX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjE4LCAgLyoqPCBFUE9OIE9OVSAxRyBVUyAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX0ZFQ19DT1JSX1pFUk9FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjE5LCAgLyoqPCBFUE9OIE9OVSAxRyBVUyAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX0ZFQ19DT1JSX09ORVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjIwLCAgLyoqPCBFUE9OIE9OVSAxRyBVUyAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX1VOREVSU1pfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjIxLCAgLyoqPCBFUE9OIE9OVSAxRyBVUyAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX0VSUk9SU1pfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjIyLCAgLyoqPCBFUE9OIE9OVSAxRyBVUyAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjIzLCAgLyoqPCBFUE9OIE9OVSAxRyBVUyAtIFN0YXQgQWxhcm0gQ2xlYXJlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX09OVV8xR19VU19TVEFUX0FMQVJNX1JBSVNFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIyNCwgIC8qKjwgRVBPTiBPTlUgMUcgVVMgLSBTdGF0IEFsYXJtIFJhaXNlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX09OVV8xR19VU19BVVRPX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIyNSwgIC8qKjwgRVBPTiBPTlUgMUcgVVMgLSBJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19EU19LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMjYsICAvKio8IEVQT04gcGF0aCAxMEcgZG93bnN0cmVhbSAtIGtleSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX0RTX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIyNywgIC8qKjwgRVBPTiBwYXRoIDEwRyBkb3duc3RyZWFtIC0gY2ZnICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfRFNfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjI4LCAgLyoqPCBFUE9OIHBhdGggMTBHIGRvd25zdHJlYW0gLSBzdGF0ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9DRkdfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjI5LCAgLyoqPCBFUE9OIHBhdGggMTBHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQ0ZHX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzMCwgIC8qKjwgRVBPTiBwYXRoIDEwRyBkb3duc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19EU19TVEFUX0NGR19GUkFNRVNfNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMzEsICAvKio8IEVQT04gcGF0aCAxMEcgZG93bnN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9DRkdfRlJBTUVTXzY1XzEyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjMyLCAgLyoqPCBFUE9OIHBhdGggMTBHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQ0ZHX0ZSQU1FU18xMjhfMjU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzMywgIC8qKjwgRVBPTiBwYXRoIDEwRyBkb3duc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19EU19TVEFUX0NGR19GUkFNRVNfMjU2XzUxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMzQsICAvKio8IEVQT04gcGF0aCAxMEcgZG93bnN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9DRkdfRlJBTUVTXzUxMl8xMDIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjM1LCAgLyoqPCBFUE9OIHBhdGggMTBHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQ0ZHX0ZSQU1FU18xMDI0XzE1MTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzNiwgIC8qKjwgRVBPTiBwYXRoIDEwRyBkb3duc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19EU19TVEFUX0NGR19GUkFNRVNfMTUxOV8yMDQ3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMzcsICAvKio8IEVQT04gcGF0aCAxMEcgZG93bnN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9DRkdfRlJBTUVTXzIwNDhfNDA5NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjM4LCAgLyoqPCBFUE9OIHBhdGggMTBHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQ0ZHX0ZSQU1FU180MDk2XzkyMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzOSwgIC8qKjwgRVBPTiBwYXRoIDEwRyBkb3duc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19EU19TVEFUX0NGR19GUkFNRVNfOTIxN18xNjM4MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNDAsICAvKio8IEVQT04gcGF0aCAxMEcgZG93bnN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9DRkdfQlJPQURDQVNUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjQxLCAgLyoqPCBFUE9OIHBhdGggMTBHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQ0ZHX0RBVEFfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0MiwgIC8qKjwgRVBPTiBwYXRoIDEwRyBkb3duc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19EU19TVEFUX0NGR19NVUxUSUNBU1RfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNDMsICAvKio8IEVQT04gcGF0aCAxMEcgZG93bnN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9DRkdfVU5JQ0FTVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjQ0LCAgLyoqPCBFUE9OIHBhdGggMTBHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQ0ZHX09BTV9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0NSwgIC8qKjwgRVBPTiBwYXRoIDEwRyBkb3duc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19EU19TVEFUX0NGR19PQU1fRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNDYsICAvKio8IEVQT04gcGF0aCAxMEcgZG93bnN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9DRkdfR0FURV9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjQ3LCAgLyoqPCBFUE9OIHBhdGggMTBHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQ0ZHX01QQ1BfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0OCwgIC8qKjwgRVBPTiBwYXRoIDEwRyBkb3duc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19EU19TVEFUX0NGR19BQk9SVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNDksICAvKio8IEVQT04gcGF0aCAxMEcgZG93bnN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9BTEFSTV9DTEVBUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjUwLCAgLyoqPCBFUE9OIHBhdGggMTBHIGRvd25zdHJlYW0gLSBTdGF0IEFsYXJtIENsZWFyZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19EU19TVEFUX0FMQVJNX1JBSVNFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTEsICAvKio8IEVQT04gcGF0aCAxMEcgZG93bnN0cmVhbSAtIFN0YXQgQWxhcm0gUmFpc2VkICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfRFNfQVVUT19DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjUyLCAgLyoqPCBFUE9OIHBhdGggMTBHIGRvd25zdHJlYW0gLSBJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19VU19LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTMsICAvKio8IEVQT04gcGF0aCAxMEcgdXBzdHJlYW0gLSBrZXkgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19VU19DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTQsICAvKio8IEVQT04gcGF0aCAxMEcgdXBzdHJlYW0gLSBjZmcgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19VU19TVEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTUsICAvKio8IEVQT04gcGF0aCAxMEcgdXBzdHJlYW0gLSBzdGF0ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjU2LCAgLyoqPCBFUE9OIHBhdGggMTBHIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19VU19TVEFUX0NGR19GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTcsICAvKio8IEVQT04gcGF0aCAxMEcgdXBzdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQ0ZHX0ZSQU1FU182NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1OCwgIC8qKjwgRVBPTiBwYXRoIDEwRyB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfRlJBTUVTXzY1XzEyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjU5LCAgLyoqPCBFUE9OIHBhdGggMTBHIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19VU19TVEFUX0NGR19GUkFNRVNfMTI4XzI1NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNjAsICAvKio8IEVQT04gcGF0aCAxMEcgdXBzdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQ0ZHX0ZSQU1FU18yNTZfNTExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2MSwgIC8qKjwgRVBPTiBwYXRoIDEwRyB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfRlJBTUVTXzUxMl8xMDIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjYyLCAgLyoqPCBFUE9OIHBhdGggMTBHIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19VU19TVEFUX0NGR19GUkFNRVNfMTAyNF8xNTE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNjMsICAvKio8IEVQT04gcGF0aCAxMEcgdXBzdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQ0ZHX0ZSQU1FU18xNTE5XzIwNDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2NCwgIC8qKjwgRVBPTiBwYXRoIDEwRyB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfRlJBTUVTXzIwNDhfNDA5NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjY1LCAgLyoqPCBFUE9OIHBhdGggMTBHIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19VU19TVEFUX0NGR19GUkFNRVNfNDA5Nl85MjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNjYsICAvKio8IEVQT04gcGF0aCAxMEcgdXBzdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQ0ZHX0ZSQU1FU185MjE3XzE2MzgzICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2NywgIC8qKjwgRVBPTiBwYXRoIDEwRyB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfQlJPQURDQVNUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjY4LCAgLyoqPCBFUE9OIHBhdGggMTBHIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19VU19TVEFUX0NGR19EQVRBX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNjksICAvKio8IEVQT04gcGF0aCAxMEcgdXBzdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQ0ZHX01VTFRJQ0FTVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI3MCwgIC8qKjwgRVBPTiBwYXRoIDEwRyB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfVU5JQ0FTVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjcxLCAgLyoqPCBFUE9OIHBhdGggMTBHIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19VU19TVEFUX0NGR19NUENQX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNzIsICAvKio8IEVQT04gcGF0aCAxMEcgdXBzdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQ0ZHX09BTV9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI3MywgIC8qKjwgRVBPTiBwYXRoIDEwRyB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfT0FNX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjc0LCAgLyoqPCBFUE9OIHBhdGggMTBHIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19VU19TVEFUX0NGR19SRVBPUlRfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNzUsICAvKio8IEVQT04gcGF0aCAxMEcgdXBzdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQ0ZHX0FCT1JUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI3NiwgIC8qKjwgRVBPTiBwYXRoIDEwRyB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfRkNTX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjc3LCAgLyoqPCBFUE9OIHBhdGggMTBHIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19VU19TVEFUX0NGR19DUkNfOF9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNzgsICAvKio8IEVQT04gcGF0aCAxMEcgdXBzdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQ0ZHX09VVF9PRl9TTE9UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI3OSwgIC8qKjwgRVBPTiBwYXRoIDEwRyB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfT1ZFUlNJWkVfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjgwLCAgLyoqPCBFUE9OIHBhdGggMTBHIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19VU19TVEFUX0NGR19SVU5UX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyODEsICAvKio8IEVQT04gcGF0aCAxMEcgdXBzdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI4MiwgIC8qKjwgRVBPTiBwYXRoIDEwRyB1cHN0cmVhbSAtIFN0YXQgQWxhcm0gQ2xlYXJlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQUxBUk1fUkFJU0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI4MywgIC8qKjwgRVBPTiBwYXRoIDEwRyB1cHN0cmVhbSAtIFN0YXQgQWxhcm0gUmFpc2VkICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfVVNfQVVUT19DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjg0LCAgLyoqPCBFUE9OIHBhdGggMTBHIHVwc3RyZWFtIC0gSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19EU19LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjg1LCAgLyoqPCBFUE9OIHBhdGggMUcgZG93bnN0cmVhbSAtIGtleSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI4NiwgIC8qKjwgRVBPTiBwYXRoIDFHIGRvd25zdHJlYW0gLSBjZmcgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX0RTX1NUQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyODcsICAvKio8IEVQT04gcGF0aCAxRyBkb3duc3RyZWFtIC0gc3RhdCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI4OCwgIC8qKjwgRVBPTiBwYXRoIDFHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI4OSwgIC8qKjwgRVBPTiBwYXRoIDFHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfRlJBTUVTXzY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI5MCwgIC8qKjwgRVBPTiBwYXRoIDFHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfRlJBTUVTXzY1XzEyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI5MSwgIC8qKjwgRVBPTiBwYXRoIDFHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfRlJBTUVTXzEyOF8yNTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI5MiwgIC8qKjwgRVBPTiBwYXRoIDFHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfRlJBTUVTXzI1Nl81MTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI5MywgIC8qKjwgRVBPTiBwYXRoIDFHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfRlJBTUVTXzUxMl8xMDIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI5NCwgIC8qKjwgRVBPTiBwYXRoIDFHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfRlJBTUVTXzEwMjRfMTUxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI5NSwgIC8qKjwgRVBPTiBwYXRoIDFHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfRlJBTUVTXzE1MTlfMjA0NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI5NiwgIC8qKjwgRVBPTiBwYXRoIDFHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfRlJBTUVTXzIwNDhfNDA5NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI5NywgIC8qKjwgRVBPTiBwYXRoIDFHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfRlJBTUVTXzQwOTZfOTIxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI5OCwgIC8qKjwgRVBPTiBwYXRoIDFHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfRlJBTUVTXzkyMTdfMTYzODMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI5OSwgIC8qKjwgRVBPTiBwYXRoIDFHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfQlJPQURDQVNUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMwMCwgIC8qKjwgRVBPTiBwYXRoIDFHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfREFUQV9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMwMSwgIC8qKjwgRVBPTiBwYXRoIDFHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfTVVMVElDQVNUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMwMiwgIC8qKjwgRVBPTiBwYXRoIDFHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfVU5JQ0FTVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMwMywgIC8qKjwgRVBPTiBwYXRoIDFHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfT0FNX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMwNCwgIC8qKjwgRVBPTiBwYXRoIDFHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfT0FNX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMwNSwgIC8qKjwgRVBPTiBwYXRoIDFHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfR0FURV9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMwNiwgIC8qKjwgRVBPTiBwYXRoIDFHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfTVBDUF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMwNywgIC8qKjwgRVBPTiBwYXRoIDFHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfQUJPUlRfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMwOCwgIC8qKjwgRVBPTiBwYXRoIDFHIGRvd25zdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9BTEFSTV9DTEVBUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMwOSwgIC8qKjwgRVBPTiBwYXRoIDFHIGRvd25zdHJlYW0gLSBTdGF0IEFsYXJtIENsZWFyZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQUxBUk1fUkFJU0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMTAsICAvKio8IEVQT04gcGF0aCAxRyBkb3duc3RyZWFtIC0gU3RhdCBBbGFybSBSYWlzZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX0RTX0FVVE9fQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMTEsICAvKio8IEVQT04gcGF0aCAxRyBkb3duc3RyZWFtIC0gSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzEyLCAgLyoqPCBFUE9OIHBhdGggMUcgdXBzdHJlYW0gLSBrZXkgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX1VTX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMTMsICAvKio8IEVQT04gcGF0aCAxRyB1cHN0cmVhbSAtIGNmZyAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfVVNfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMxNCwgIC8qKjwgRVBPTiBwYXRoIDFHIHVwc3RyZWFtIC0gc3RhdCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9DRkdfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMxNSwgIC8qKjwgRVBPTiBwYXRoIDFHIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQ0ZHX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMTYsICAvKio8IEVQT04gcGF0aCAxRyB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19GUkFNRVNfNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzE3LCAgLyoqPCBFUE9OIHBhdGggMUcgdXBzdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9DRkdfRlJBTUVTXzY1XzEyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMxOCwgIC8qKjwgRVBPTiBwYXRoIDFHIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQ0ZHX0ZSQU1FU18xMjhfMjU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMTksICAvKio8IEVQT04gcGF0aCAxRyB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19GUkFNRVNfMjU2XzUxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzIwLCAgLyoqPCBFUE9OIHBhdGggMUcgdXBzdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9DRkdfRlJBTUVTXzUxMl8xMDIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyMSwgIC8qKjwgRVBPTiBwYXRoIDFHIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQ0ZHX0ZSQU1FU18xMDI0XzE1MTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMjIsICAvKio8IEVQT04gcGF0aCAxRyB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19GUkFNRVNfMTUxOV8yMDQ3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzIzLCAgLyoqPCBFUE9OIHBhdGggMUcgdXBzdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9DRkdfRlJBTUVTXzIwNDhfNDA5NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyNCwgIC8qKjwgRVBPTiBwYXRoIDFHIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQ0ZHX0ZSQU1FU180MDk2XzkyMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMjUsICAvKio8IEVQT04gcGF0aCAxRyB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19GUkFNRVNfOTIxN18xNjM4MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzI2LCAgLyoqPCBFUE9OIHBhdGggMUcgdXBzdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9DRkdfQlJPQURDQVNUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyNywgIC8qKjwgRVBPTiBwYXRoIDFHIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQ0ZHX0RBVEFfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMjgsICAvKio8IEVQT04gcGF0aCAxRyB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19NVUxUSUNBU1RfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzI5LCAgLyoqPCBFUE9OIHBhdGggMUcgdXBzdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9DRkdfVU5JQ0FTVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMzMCwgIC8qKjwgRVBPTiBwYXRoIDFHIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQ0ZHX01QQ1BfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMzEsICAvKio8IEVQT04gcGF0aCAxRyB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19PQU1fQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzMyLCAgLyoqPCBFUE9OIHBhdGggMUcgdXBzdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9DRkdfT0FNX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMzMywgIC8qKjwgRVBPTiBwYXRoIDFHIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQ0ZHX1JFUE9SVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMzQsICAvKio8IEVQT04gcGF0aCAxRyB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19BQk9SVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzM1LCAgLyoqPCBFUE9OIHBhdGggMUcgdXBzdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9DRkdfRkNTX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMzNiwgIC8qKjwgRVBPTiBwYXRoIDFHIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQ0ZHX0NSQ184X0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMzcsICAvKio8IEVQT04gcGF0aCAxRyB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19PVVRfT0ZfU0xPVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzM4LCAgLyoqPCBFUE9OIHBhdGggMUcgdXBzdHJlYW0gLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9DRkdfT1ZFUlNJWkVfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMzOSwgIC8qKjwgRVBPTiBwYXRoIDFHIHVwc3RyZWFtIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQ0ZHX1JVTlRfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNDAsICAvKio8IEVQT04gcGF0aCAxRyB1cHN0cmVhbSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19TVEFUX0FMQVJNX0NMRUFSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzQxLCAgLyoqPCBFUE9OIHBhdGggMUcgdXBzdHJlYW0gLSBTdGF0IEFsYXJtIENsZWFyZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQUxBUk1fUkFJU0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNDIsICAvKio8IEVQT04gcGF0aCAxRyB1cHN0cmVhbSAtIFN0YXQgQWxhcm0gUmFpc2VkICovCisgICAgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19BVVRPX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzQzLCAgLyoqPCBFUE9OIHBhdGggMUcgdXBzdHJlYW0gLSBJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfRVBPTl9SUF9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNDQsICAvKio8IEVQT04gUmVjb25jaWxpYXRpb24gUGF0aCAtIGtleSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1JQX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM0NSwgIC8qKjwgRVBPTiBSZWNvbmNpbGlhdGlvbiBQYXRoIC0gY2ZnICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQSU9fS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzQ2LCAgLyoqPCBHUElPIC0ga2V5ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQSU9fQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzQ3LCAgLyoqPCBHUElPIC0gY2ZnICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fQUxMT0NfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzQ4LCAgLyoqPCBHUE9OIEFsbG9jIC0ga2V5ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fQUxMT0NfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzQ5LCAgLyoqPCBHUE9OIEFsbG9jIC0gY2ZnICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fQUxMT0NfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzUwLCAgLyoqPCBHUE9OIEFsbG9jIC0gc3RhdCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX0FMTE9DX1NUQVRfQ0ZHX1JYX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM1MSwgIC8qKjwgR1BPTiBBbGxvYyAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzUyLCAgLyoqPCBHUE9OIEFsbG9jIC0gQ29uZmlndXJhdGlvbiBDb21wbGV0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNTMsICAvKio8IEdQT04gQWxsb2MgLSBHZXQgYWxsb2MgSUQgc3RhdGlzdGljcyBjb21wbGV0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9BTExPQ19TVEFUX0FMQVJNX0NMRUFSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNTQsICAvKio8IEdQT04gQWxsb2MgLSBTdGF0IEFsYXJtIENsZWFyZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9BTExPQ19TVEFUX0FMQVJNX1JBSVNFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNTUsICAvKio8IEdQT04gQWxsb2MgLSBTdGF0IEFsYXJtIFJhaXNlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX0FMTE9DX0FVVE9fQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM1NiwgIC8qKjwgR1BPTiBBbGxvYyAtIEluZGljYXRpb24gQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX0FMTE9DX0dFVF9TVEFUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM1NywgIC8qKjwgR1BPTiBBbGxvYyAtIEdldCBzdGF0aXN0aWNzICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fQUxMT0NfU0VUX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzU4LCAgLyoqPCBHUE9OIEFsbG9jIC0gU2V0IHN0YXRlICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fR0VNX1BPUlRfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzU5LCAgLyoqPCBHUE9OIEdFTSBQb3J0IC0ga2V5ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fR0VNX1BPUlRfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzYwLCAgLyoqPCBHUE9OIEdFTSBQb3J0IC0gY2ZnICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fR0VNX1BPUlRfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzYxLCAgLyoqPCBHUE9OIEdFTSBQb3J0IC0gc3RhdCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX0dFTV9QT1JUX1NUQVRfQ0ZHX1JYX1BBQ0tFVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM2MiwgIC8qKjwgR1BPTiBHRU0gUG9ydCAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fR0VNX1BPUlRfU1RBVF9DRkdfUlhfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzYzLCAgLyoqPCBHUE9OIEdFTSBQb3J0IC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9HRU1fUE9SVF9TVEFUX0NGR19UWF9QQUNLRVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNjQsICAvKio8IEdQT04gR0VNIFBvcnQgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX0dFTV9QT1JUX1NUQVRfQ0ZHX1RYX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM2NSwgIC8qKjwgR1BPTiBHRU0gUG9ydCAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fR0VNX1BPUlRfQ09ORklHVVJBVElPTl9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzY2LCAgLyoqPCBHUE9OIEdFTSBQb3J0IC0gQ29uZmlndXJhdGlvbiBDb21wbGV0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9HRU1fUE9SVF9TVEFUX0FMQVJNX0NMRUFSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNjcsICAvKio8IEdQT04gR0VNIFBvcnQgLSBTdGF0IEFsYXJtIENsZWFyZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9HRU1fUE9SVF9TVEFUX0FMQVJNX1JBSVNFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNjgsICAvKio8IEdQT04gR0VNIFBvcnQgLSBTdGF0IEFsYXJtIFJhaXNlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX0dFTV9QT1JUX0FVVE9fQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM2OSwgIC8qKjwgR1BPTiBHRU0gUG9ydCAtIEluZGljYXRpb24gQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX0dFTV9QT1JUX1NFVF9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM3MCwgIC8qKjwgR1BPTiBHRU0gUG9ydCAtIFNldCBzdGF0ZSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX0lXRl9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM3MSwgIC8qKjwgR1BPTiBJV0YgLSBrZXkgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9JV0ZfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNzIsICAvKio8IEdQT04gSVdGIC0gY2ZnICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fSVdGX1NUQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzczLCAgLyoqPCBHUE9OIElXRiAtIHN0YXQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9JV0ZfU1RBVF9DRkdfRFNfSElUX0VWRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNzQsICAvKio8IEdQT04gSVdGIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9JV0ZfU1RBVF9DRkdfRFNfTUlTU19FVkVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNzUsICAvKio8IEdQT04gSVdGIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9JV0ZfU1RBVF9DRkdfRFNfRFJPUF9EVUVfVE9fTUlTU19FVkVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNzYsICAvKio8IEdQT04gSVdGIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9JV0ZfU1RBVF9DRkdfRFNfRFJPUF9EVUVfVE9fSElUX0VWRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNzcsICAvKio8IEdQT04gSVdGIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9JV0ZfU1RBVF9DRkdfRFNfRFJPUF9UT19ESVNBQkxFRF9HRU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNzgsICAvKio8IEdQT04gSVdGIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9JV0ZfU1RBVF9DRkdfTkVXX01BQ19ESVNDT1ZFUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNzksICAvKio8IEdQT04gSVdGIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9JV0ZfU1RBVF9DRkdfTU9WRV9FVkVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzODAsICAvKio8IEdQT04gSVdGIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9JV0ZfU1RBVF9DRkdfTkVXX01BQ19EUk9QX0RVRV9UT19GSUZPX0ZVTEwgICAgICAgICAgICAgICAgICAgICAgICAgPSAzODEsICAvKio8IEdQT04gSVdGIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9JV0ZfRkxVU0hfTUFDX1RBQkxFX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzODIsICAvKio8IEdQT04gSVdGIC0gRmx1c2ggTUFDIFRhYmxlIENvbXBsZXRlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX0lXRl9TQ0FOX01BQ19UQUJMRV9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM4MywgIC8qKjwgR1BPTiBJV0YgLSBTY2FuIE1BQyBUYWJsZSBDb21wbGV0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9JV0ZfU1RBVF9BTEFSTV9DTEVBUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzODQsICAvKio8IEdQT04gSVdGIC0gU3RhdCBBbGFybSBDbGVhcmVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fSVdGX1NUQVRfQUxBUk1fUkFJU0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzg1LCAgLyoqPCBHUE9OIElXRiAtIFN0YXQgQWxhcm0gUmFpc2VkICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fSVdGX0FVVE9fQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzg2LCAgLyoqPCBHUE9OIElXRiAtIEluZGljYXRpb24gQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX0lXRl9GTFVTSF9NQUNfVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM4NywgIC8qKjwgR1BPTiBJV0YgLSBGbHVzaCBNQUMgVGFibGUgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9JV0ZfU0NBTl9NQUNfVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzODgsICAvKio8IEdQT04gSVdGIC0gU2NhbiBNQUMgVGFibGUgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1dfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzODksICAvKio8IEdQT04gSVdGIERTIGVncmVzcyBmbG93IC0ga2V5ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzkwLCAgLyoqPCBHUE9OIElXRiBEUyBlZ3Jlc3MgZmxvdyAtIGNmZyAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM5MSwgIC8qKjwgR1BPTiBJV0YgRFMgaW5ncmVzcyBmbG93IC0ga2V5ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzkyLCAgLyoqPCBHUE9OIElXRiBEUyBpbmdyZXNzIGZsb3cgLSBjZmcgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9JV0ZfTUFDX1RBQkxFX0tFWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzOTMsICAvKio8IEdQT04gSVdGIE1BQyB0YWJsZSAtIGtleSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX0lXRl9NQUNfVEFCTEVfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM5NCwgIC8qKjwgR1BPTiBJV0YgTUFDIHRhYmxlIC0gY2ZnICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fSVdGX01BQ19UQUJMRV9NQUNfQUdFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzk1LCAgLyoqPCBHUE9OIElXRiBNQUMgdGFibGUgLSBNQUMgQWdlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX0lXRl9NQUNfVEFCTEVfTUFDX0RST1BQRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM5NiwgIC8qKjwgR1BPTiBJV0YgTUFDIHRhYmxlIC0gTUFDIERyb3BwZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9JV0ZfTUFDX1RBQkxFX01BQ19NT1ZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzOTcsICAvKio8IEdQT04gSVdGIE1BQyB0YWJsZSAtIE1BQyBNb3ZlICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fSVdGX01BQ19UQUJMRV9ORVdfTUFDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzk4LCAgLyoqPCBHUE9OIElXRiBNQUMgdGFibGUgLSBOZXcgTUFDICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzk5LCAgLyoqPCBHUE9OIElXRiBNQUMgdGFibGUgLSBJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9JV0ZfVVNfRkxPV19LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MDAsICAvKio8IEdQT04gSVdGIFVTIGZsb3cgLSBrZXkgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9JV0ZfVVNfRkxPV19DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MDEsICAvKio8IEdQT04gSVdGIFVTIGZsb3cgLSBjZmcgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MDIsICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBrZXkgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MDMsICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBjZmcgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MDQsICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBzdGF0ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9DRkdfRkVDX0NPREVXT1JEUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDA1LCAgLyoqPCBHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFUX0NGR19GRUNfQ09ERVdPUkRTX1VOQ09SUkVDVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MDYsICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQ0ZHX0JJUDhfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQwNywgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9DRkdfQklQOF9FUlJPUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDA4LCAgLyoqPCBHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFUX0NGR19SWF9HRU1fUEFDS0VUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MDksICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQ0ZHX1JYX0dFTV9EUk9QUEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQxMCwgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9DRkdfUlhfR0VNX0lETEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDExLCAgLyoqPCBHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFUX0NGR19SWF9HRU1fQ09SUkVDVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MTIsICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQ0ZHX1JYX0dFTV9JTExFR0FMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQxMywgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9DRkdfUlhfQUxMT0NBVElPTlNfVkFMSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDE0LCAgLyoqPCBHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFUX0NGR19SWF9BTExPQ0FUSU9OU19JTlZBTElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MTUsICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQ0ZHX1JYX0FMTE9DQVRJT05TX0RJU0FCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQxNiwgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9DRkdfUlhfUExPQU1TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDE3LCAgLyoqPCBHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFUX0NGR19SWF9QTE9BTVNfTk9OX0lETEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MTgsICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQ0ZHX1JYX1BMT0FNU19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQxOSwgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9DRkdfUlhfUExPQU1TX0RST1BQRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDIwLCAgLyoqPCBHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFUX0NGR19SWF9DUFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MjEsICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQ0ZHX1JYX09NQ0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQyMiwgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9DRkdfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDIzLCAgLyoqPCBHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFUX0NGR19SWF9EUk9QUEVEX1RPT19TSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MjQsICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQ0ZHX1JYX0RST1BQRURfVE9PX0xPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQyNSwgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9DRkdfUlhfQ1JDX0VSUk9SUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDI2LCAgLyoqPCBHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFUX0NGR19SWF9LRVlfRVJST1JTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MjcsICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQ0ZHX1JYX0ZSQUdNRU5UU19FUlJPUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQyOCwgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9DRkdfUlhfUEFDS0VUU19EUk9QUEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDI5LCAgLyoqPCBHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFUX0NGR19UWF9HRU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MzAsICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQ0ZHX1RYX1BMT0FNUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQzMSwgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9DRkdfVFhfR0VNX0ZSQUdNRU5UUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDMyLCAgLyoqPCBHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFUX0NGR19UWF9DUFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MzMsICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQ0ZHX1RYX09NQ0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQzNCwgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9DRkdfVFhfQ1BVX09NQ0lfUEFDS0VUU19EUk9QUEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDM1LCAgLyoqPCBHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFUX0NGR19UWF9EUk9QUEVEX0lMTEVHQUxfTEVOR1RIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MzYsICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQ0ZHX1RYX0RST1BQRURfVFBJRF9NSVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQzNywgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9DRkdfVFhfRFJPUFBFRF9WSURfTUlTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDM4LCAgLyoqPCBHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9BQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MzksICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBhY3RpdmF0ZSBhbGwgb251cyBjb21wbGV0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9DUFVfUEFDS0VUU19GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NDAsICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBDUFUgUGFja2V0cyBGYWlsdXJlICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfREVBQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDQxLCAgLyoqPCBHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gZGVhY3RpdmF0ZSBhbGwgb251cyBjb21wbGV0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9ESVNBQkxFX0FMTF9PTlVTX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NDIsICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBkaXNhYmxlIGFsbCBvbnVzIGNvbXBsZXRlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX0VOQUJMRV9BTExfT05VU19DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ0MywgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIGVuYWJsZSBhbGwgb251cyBjb21wbGV0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9MT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NDQsICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBMT1MgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9PTlVfRElTQ09WRVJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NDUsICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBPTlUgRGlzY292ZXJlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ0NiwgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIE9OVSBVcGdyYWRlIENvbXBsZXRlICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDQ3LCAgLyoqPCBHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gUHJvdGVjdGlvbiBTd2l0Y2hpbmcgT05VcyBSYW5nZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgPSA0NDgsICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBQcm90ZWN0aW9uIFN3aXRjaGluZyBTd2l0Y2hvdmVyIENvbXBsZXRlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ0OSwgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFByb3RlY3Rpb24gU3dpdGNoaW5nIFRyYWZmaWMgUmVzdW1lICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDUwLCAgLyoqPCBHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gUm9ndWUgZGV0ZWN0aW9uIGNvbXBsZXRlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1JPR1VFX09OVV9TUEVDSUFMX01BUF9DWUNMRV9TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ1MSwgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFJvZ3VlIE9OVSBzcGVjaWFsIG1hcCBjeWNsZSBzdGFydCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NFUklBTF9OVU1CRVJfQUNRVUlTSVRJT05fQ1lDTEVfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ1MiwgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFNlcmlhbCBOdW1iZXIgQWNxdWlzaXRpb24gQ3ljbGUgU3RhcnQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NTMsICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBTdGFuZGJ5IFBPTiBNb25pdG9yaW5nIEN5Y2xlIENvbXBsZXRlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQUxBUk1fQ0xFQVJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ1NCwgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXQgQWxhcm0gQ2xlYXJlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQUxBUk1fUkFJU0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ1NSwgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXQgQWxhcm0gUmFpc2VkICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDU2LCAgLyoqPCBHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gU3RhdGUgQ2hhbmdlIENvbXBsZXRlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ1NywgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFRPRCByZXF1ZXN0IGNvbXBsZXRlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX0FVVE9fQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ1OCwgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIEluZGljYXRpb24gQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX0RJU0FCTEVfU0VSSUFMX05VTUJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ1OSwgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIERpc2FibGUgU2VyaWFsIE51bWJlciAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1RZUEVfQ19TRVRfTVVMVElQTEVfT05VX1NUQVRFICAgICAgICAgICAgICA9IDQ2MCwgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIHByb3RlY3Rpb24gc3dpdGNoaW5nIHR5cGUgYyBzZXQgbXVsdGlwbGUgb251IHN0YXRlICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDYxLCAgLyoqPCBHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gUmVzZXQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NjIsICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBSb2d1ZSBEZXRlY3Rpb24gV2luZG93ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU0VUX09OVV9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDYzLCAgLyoqPCBHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gU2V0IE9OVSBTdGF0ZSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NFVF9QT05fU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ2NCwgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFNldCBQT04gU3RhdGUgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TSU5HTEVfUkVRVUVTVF9TVEFOREJZX1BPTl9NT05JVE9SSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NjUsICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBTaW5nbGUgcmVxdWVzdCBmb3Igc3RhbmRieSBQT04gbW9uaXRvcmluZyAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVJUX09OVV9VUEdSQURFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ2NiwgIC8qKjwgR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXJ0IE9OVSBGaXJtd2FyZSBVcGdyYWRlICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfVE9EX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDY3LCAgLyoqPCBHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gVE9EIHJlcXVlc3QgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9CUk9BRENBU1RfUExPQU1fUEFDS0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NjgsICAvKio8IEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBCcm9hZGNhc3QgUExPQU0gUGFja2V0ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfQ1BVX1BBQ0tFVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDY5LCAgLyoqPCBHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gR1BPTiBDUFUgUGFja2V0cyAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ3MCwgIC8qKjwgR1BPTiBPTlUgLSBrZXkgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NzEsICAvKio8IEdQT04gT05VIC0gY2ZnICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX1NUQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDcyLCAgLyoqPCBHUE9OIE9OVSAtIHN0YXQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfRkVDX0NPREVXT1JEUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NzMsICAvKio8IEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfRkVDX0JZVEVTX0NPUlJFQ1RFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NzQsICAvKio8IEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfRkVDX0NPREVXT1JEU19DT1JSRUNURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NzUsICAvKio8IEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfRkVDX0NPREVXT1JEU19VTkNPUlJFQ1RFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NzYsICAvKio8IEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfQklQOF9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NzcsICAvKio8IEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfQklQOF9FUlJPUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NzgsICAvKio8IEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfUlhfUExPQU1TX0NSQ19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NzksICAvKio8IEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfUlhfUExPQU1TX05PTl9JRExFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0ODAsICAvKio8IEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfUE9TSVRJVkVfRFJJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0ODEsICAvKio8IEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfTkVHQVRJVkVfRFJJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0ODIsICAvKio8IEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfUlhfT01DSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0ODMsICAvKio8IEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0ODQsICAvKio8IEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfQkVSX1JFUE9SVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0ODUsICAvKio8IEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfVU5SRUNFSVZFRF9CVVJTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0ODYsICAvKio8IEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfTENER19FUlJPUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0ODcsICAvKio8IEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfUkRJX0VSUk9SUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0ODgsICAvKio8IEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfUlhfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0ODksICAvKio8IEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfUlhfUEFDS0VUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0OTAsICAvKio8IEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfVFhfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0OTEsICAvKio8IEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfVFhfUEFDS0VUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0OTIsICAvKio8IEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfQkVSX0lOVEVSVkFMX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0OTMsICAvKio8IEdQT04gT05VIC0gQkVSIEludGVydmFsIENvbmZpZ3VyYXRpb24gQ29tcGxldGVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX0RGSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDk0LCAgLyoqPCBHUE9OIE9OVSAtIFJlY2VpdmUgRHlpbmctR2FzcCBvZiBPTlVpICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX0RHSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDk1LCAgLyoqPCBHUE9OIE9OVSAtIFJlY2VpdmUgRHlpbmctR2FzcCBvZiBPTlVpICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX0RPV0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDk2LCAgLyoqPCBHUE9OIE9OVSAtIERyaWZ0IG9mIFdpbmRvdyBvZiBPTlVpICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDk3LCAgLyoqPCBHUE9OIE9OVSAtIEVSUiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9JTlZBTElEX0RCUlVfUkVQT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ5OCwgIC8qKjwgR1BPTiBPTlUgLSBJbnZhbGlkIERCUnUgUmVwb3J0ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX0tFWV9FWENIQU5HRV9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDk5LCAgLyoqPCBHUE9OIE9OVSAtIEtleSBFeGNoYW5nZSBDb21wbGV0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0NZQ0xFX1NLSVBQRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MDAsICAvKio8IEdQT04gT05VIC0gS2V5IEV4Y2hhbmdlIEN5Y2xlIFNraXBwZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0RFQ1JZUFRfUkVRVUlSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MDEsICAvKio8IEdQT04gT05VIC0gS2V5IEV4Y2hhbmdlIERlY3J5cHQgUmVxdWlyZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MDIsICAvKio8IEdQT04gT05VIC0gS2V5IEV4Y2hhbmdlIEtleSBNaXNtYXRjaCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfS0VZX1JFUVVFU1RfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUwMywgIC8qKjwgR1BPTiBPTlUgLSBLZXkgRXhjaGFuZ2UgS2V5IFJlcXVlc3QgVGltZW91dCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfVU5DT05TRUNVVElWRV9JTkRFWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUwNCwgIC8qKjwgR1BPTiBPTlUgLSBLZXkgRXhjaGFuZ2UgVW5jb25zZWN1dGl2ZSBJbmRleCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9MT0FJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUwNSwgIC8qKjwgR1BPTiBPTlUgLSBMT0FpICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX0xPS0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTA2LCAgLyoqPCBHUE9OIE9OVSAtIExPa2kgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfTUVNSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MDcsICAvKio8IEdQT04gT05VIC0gTUVNaSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9PTUNJX1BPUlRfSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUwOCwgIC8qKjwgR1BPTiBPTlUgLSBPTUNJIFBPUlQgSUQgQ29uZmlndXJhdGlvbiBDb21wbGV0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MDksICAvKio8IEdQT04gT05VIC0gT05VIEFjdGl2YXRpb24gQ29tcGxldGVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX09OVV9BQ1RJVkFUSU9OX1NUQU5EQllfQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTEwLCAgLyoqPCBHUE9OIE9OVSAtIG9udSBhY3RpdmF0aW9uIHN0YW5kYnkgY29tcGxldGVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX09OVV9BTEFSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTExLCAgLyoqPCBHUE9OIE9OVSAtIE9OVSBBbGFybSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9PTlVfREVBQ1RJVkFUSU9OX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUxMiwgIC8qKjwgR1BPTiBPTlUgLSBPTlUgRGVhY3RpdmF0aW9uIENvbXBsZXRlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9PTlVfRElTQUJMRV9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUxMywgIC8qKjwgR1BPTiBPTlUgLSBPTlUgRGlzYWJsZSBDb21wbGV0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfT05VX0VOQUJMRV9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MTQsICAvKio8IEdQT04gT05VIC0gT05VIEVuYWJsZSBDb21wbGV0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfT1BUSUNBTF9SRUZMRUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MTUsICAvKio8IEdQT04gT05VIC0gT3B0aWNhbCBSZWZsZWN0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTE2LCAgLyoqPCBHUE9OIE9OVSAtIFBhc3N3b3JkIEF1dGhlbnRpY2F0aW9uIENvbXBsZXRlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9QRUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUxNywgIC8qKjwgR1BPTiBPTlUgLSBQRUUgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfUE9TU0lCTEVfRFJJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MTgsICAvKio8IEdQT04gT05VIC0gUG9zc2libGUgRHJpZnQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MTksICAvKio8IEdQT04gT05VIC0gUG93ZXIgTWFuYWdlbWVudCBTdGF0ZSBDaGFuZ2UgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfUFNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MjAsICAvKio8IEdQT04gT05VIC0gUFNUICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTIxLCAgLyoqPCBHUE9OIE9OVSAtIFJhbmdpbmcgQ29tcGxldGVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX1JFSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTIyLCAgLyoqPCBHUE9OIE9OVSAtIFJFSSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUyMywgIC8qKjwgR1BPTiBPTlUgLSBSU1NJIE1lYXN1cmVtZW50IENvbXBsZXRlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9TREkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUyNCwgIC8qKjwgR1BPTiBPTlUgLSBTaWduYWwgRGVncmFkZWQgb2YgT05VaSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9TRkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUyNSwgIC8qKjwgR1BPTiBPTlUgLSBTaWduYWwgRmFpbCBvZiBPTlVpICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX1NUQVRfQUxBUk1fQ0xFQVJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTI2LCAgLyoqPCBHUE9OIE9OVSAtIFN0YXQgQWxhcm0gQ2xlYXJlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9TVEFUX0FMQVJNX1JBSVNFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUyNywgIC8qKjwgR1BPTiBPTlUgLSBTdGF0IEFsYXJtIFJhaXNlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9TVUZJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUyOCwgIC8qKjwgR1BPTiBPTlUgLSBTVUZpICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX1RJV0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTI5LCAgLyoqPCBHUE9OIE9OVSAtIFRyYW5zbWlzc2lvbiBJbnRlcmZlcmVuY2UgV2FybmluZyAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9BVVRPX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUzMCwgIC8qKjwgR1BPTiBPTlUgLSBJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfQ0hBTkdFX1BPV0VSX0xFVkVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MzEsICAvKio8IEdQT04gT05VIC0gQ2hhbmdlIFBvd2VyIExldmVsICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX1JTU0lfTUVBU1VSRU1FTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTMyLCAgLyoqPCBHUE9OIE9OVSAtIFJTU0kgTWVhc3VyZW1lbnQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU0VUX09OVV9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MzMsICAvKio8IEdQT04gT05VIC0gU2V0IE9OVSBTdGF0ZSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9DUFVfUEFDS0VUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUzNCwgIC8qKjwgR1BPTiBPTlUgLSBHUE9OIENQVSBQYWNrZXRzICovCisgICAgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX1BMT0FNX1BBQ0tFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTM1LCAgLyoqPCBHUE9OIE9OVSAtIFBMT0FNIFBhY2tldCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9DUFVfUEFDS0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUzNiwgIC8qKjwgR1BPTiBPTlUgLSBHUE9OIENQVSBwYWNrZXQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfT01DSV9QQUNLRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MzcsICAvKio8IEdQT04gT05VIC0gR1BPTiBPTUNJIHBhY2tldCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9HUE9OX1RSWF9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUzOCwgIC8qKjwgR1BPTiBUUlggLSBrZXkgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfR1BPTl9UUlhfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MzksICAvKio8IEdQT04gVFJYIC0gY2ZnICovCisgICAgQkNNT0xUX0dST1VQX0lEX0xPR19FTlRSWV9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTQwLCAgLyoqPCBsb2cgZW50cnkgLSBrZXkgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTE9HX0VOVFJZX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NDEsICAvKio8IGxvZyBlbnRyeSAtIGNmZyAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9MT0dfRU5UUllfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU0MiwgIC8qKjwgbG9nIGVudHJ5IC0gc3RhdCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9MT0dfRU5UUllfU1RBVF9DRkdfTVNHX0NPVU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU0MywgIC8qKjwgbG9nIGVudHJ5IC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTE9HX0VOVFJZX1NUQVRfQ0ZHX0xPU1RfTVNHX0NPVU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NDQsICAvKio8IGxvZyBlbnRyeSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0xPR19FTlRSWV9TVEFUX0FMQVJNX0NMRUFSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTQ1LCAgLyoqPCBsb2cgZW50cnkgLSBTdGF0IEFsYXJtIENsZWFyZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTE9HX0VOVFJZX1NUQVRfQUxBUk1fUkFJU0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NDYsICAvKio8IGxvZyBlbnRyeSAtIFN0YXQgQWxhcm0gUmFpc2VkICovCisgICAgQkNNT0xUX0dST1VQX0lEX0xPR19FTlRSWV9BVVRPX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTQ3LCAgLyoqPCBsb2cgZW50cnkgLSBJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTE9HR0VSX0tFWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NDgsICAvKio8IGxvZ2dlciAtIGtleSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9MT0dHRVJfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU0OSwgIC8qKjwgbG9nZ2VyIC0gY2ZnICovCisgICAgQkNNT0xUX0dST1VQX0lEX0xPR0dFUl9TVEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTUwLCAgLyoqPCBsb2dnZXIgLSBzdGF0ICovCisgICAgQkNNT0xUX0dST1VQX0lEX0xPR0dFUl9TVEFUX0NGR19MSU5FU19JTl9MT0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTUxLCAgLyoqPCBsb2dnZXIgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9MT0dHRVJfU1RBVF9BTEFSTV9DTEVBUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU1MiwgIC8qKjwgbG9nZ2VyIC0gU3RhdCBBbGFybSBDbGVhcmVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX0xPR0dFUl9TVEFUX0FMQVJNX1JBSVNFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTUzLCAgLyoqPCBsb2dnZXIgLSBTdGF0IEFsYXJtIFJhaXNlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9MT0dHRVJfQVVUT19DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU1NCwgIC8qKjwgbG9nZ2VyIC0gSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX0xPR0dFUl9DTEVBUl9MT0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTU1LCAgLyoqPCBsb2dnZXIgLSBjbGVhciBsb2cgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTk5JX0tFWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NTYsICAvKio8IE5OSSAtIGtleSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9OTklfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU1NywgIC8qKjwgTk5JIC0gY2ZnICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTU4LCAgLyoqPCBOTkkgLSBzdGF0ICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9GUkFNRVNfNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTU5LCAgLyoqPCBOTkkgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfUlhfRlJBTUVTXzY1XzEyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU2MCwgIC8qKjwgTk5JIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX0ZSQU1FU18xMjhfMjU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NjEsICAvKio8IE5OSSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9GUkFNRVNfMjU2XzUxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTYyLCAgLyoqPCBOTkkgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfUlhfRlJBTUVTXzUxMl8xMDIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU2MywgIC8qKjwgTk5JIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX0ZSQU1FU18xMDI0XzE1MTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NjQsICAvKio8IE5OSSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9GUkFNRVNfMTUxOV8yMDQ3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTY1LCAgLyoqPCBOTkkgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfUlhfRlJBTUVTXzIwNDhfNDA5NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU2NiwgIC8qKjwgTk5JIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX0ZSQU1FU180MDk2XzkyMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NjcsICAvKio8IE5OSSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9GUkFNRVNfOTIxN18xNjM4MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTY4LCAgLyoqPCBOTkkgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfUlhfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU2OSwgIC8qKjwgTk5JIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NzAsICAvKio8IE5OSSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9HT09EX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTcxLCAgLyoqPCBOTkkgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfUlhfVU5JQ0FTVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU3MiwgIC8qKjwgTk5JIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX01VTFRJQ0FTVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NzMsICAvKio8IE5OSSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9CUk9BRENBU1RfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTc0LCAgLyoqPCBOTkkgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfUlhfRkNTX0VSUk9SUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU3NSwgIC8qKjwgTk5JIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX0NPTlRST0xfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NzYsICAvKio8IE5OSSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9QQVVTRV9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTc3LCAgLyoqPCBOTkkgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfUlhfUEZDX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU3OCwgIC8qKjwgTk5JIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX1VOU1VQUE9SVEVEX09QQ09ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NzksICAvKio8IE5OSSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9VTlNVUFBPUlRFRF9EQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTgwLCAgLyoqPCBOTkkgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfUlhfQUxJR05NRU5UX0VSUk9SUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU4MSwgIC8qKjwgTk5JIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX0xFTkdUSF9PVVRfT0ZfUkFOR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1ODIsICAvKio8IE5OSSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9DT0RFX0VSUk9SUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTgzLCAgLyoqPCBOTkkgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfUlhfT1ZFUlNJWkVEX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU4NCwgIC8qKjwgTk5JIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX0pBQkJFUl9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1ODUsICAvKio8IE5OSSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9NVFVfQ0hFQ0tfRVJST1JTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTg2LCAgLyoqPCBOTkkgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfUlhfUFJPTUlTQ1VPVVNfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU4NywgIC8qKjwgTk5JIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX1ZMQU5fRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1ODgsICAvKio8IE5OSSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9ET1VCTEVfVkxBTl9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTg5LCAgLyoqPCBOTkkgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfUlhfVFJVTkNBVEVEX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU5MCwgIC8qKjwgTk5JIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX1VOREVSU0laRV9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1OTEsICAvKio8IE5OSSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9GUkFHTUVOVEVEX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTkyLCAgLyoqPCBOTkkgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfUlhfUlVOVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU5MywgIC8qKjwgTk5JIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1RYX0ZSQU1FU182NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1OTQsICAvKio8IE5OSSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19UWF9GUkFNRVNfNjVfMTI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTk1LCAgLyoqPCBOTkkgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfVFhfRlJBTUVTXzEyOF8yNTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU5NiwgIC8qKjwgTk5JIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1RYX0ZSQU1FU18yNTZfNTExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1OTcsICAvKio8IE5OSSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19UWF9GUkFNRVNfNTEyXzEwMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTk4LCAgLyoqPCBOTkkgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfVFhfRlJBTUVTXzEwMjRfMTUxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU5OSwgIC8qKjwgTk5JIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1RYX0ZSQU1FU18xNTE5XzIwNDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MDAsICAvKio8IE5OSSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19UWF9GUkFNRVNfMjA0OF80MDk1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjAxLCAgLyoqPCBOTkkgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfVFhfRlJBTUVTXzQwOTZfOTIxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYwMiwgIC8qKjwgTk5JIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1RYX0ZSQU1FU185MjE3XzE2MzgzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MDMsICAvKio8IE5OSSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19UWF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjA0LCAgLyoqPCBOTkkgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfVFhfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYwNSwgIC8qKjwgTk5JIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1RYX0dPT0RfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MDYsICAvKio8IE5OSSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19UWF9VTklDQVNUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjA3LCAgLyoqPCBOTkkgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfVFhfTVVMVElDQVNUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYwOCwgIC8qKjwgTk5JIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1RYX0JST0FEQ0FTVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MDksICAvKio8IE5OSSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19UWF9QQVVTRV9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjEwLCAgLyoqPCBOTkkgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfVFhfUEZDX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYxMSwgIC8qKjwgTk5JIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1RYX0pBQkJFUl9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MTIsICAvKio8IE5OSSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19UWF9GQ1NfRVJST1JTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjEzLCAgLyoqPCBOTkkgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfVFhfQ09OVFJPTF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYxNCwgIC8qKjwgTk5JIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1RYX09WRVJTSVpFX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MTUsICAvKio8IE5OSSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19UWF9GUkFHTUVOVEVEX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjE2LCAgLyoqPCBOTkkgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfVFhfRVJST1JfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYxNywgIC8qKjwgTk5JIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1RYX1ZMQU5fRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MTgsICAvKio8IE5OSSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19UWF9ET1VCTEVfVkxBTl9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjE5LCAgLyoqPCBOTkkgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfVFhfUlVOVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYyMCwgIC8qKjwgTk5JIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1RYX1VOREVSUlVOX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MjEsICAvKio8IE5OSSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0FMQVJNX0NMRUFSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjIyLCAgLyoqPCBOTkkgLSBTdGF0IEFsYXJtIENsZWFyZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQUxBUk1fUkFJU0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MjMsICAvKio8IE5OSSAtIFN0YXQgQWxhcm0gUmFpc2VkICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUVVNfQ0hBTkdFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjI0LCAgLyoqPCBOTkkgLSBTdGF0dXMgY2hhbmdlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9OTklfQVVUT19DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYyNSwgIC8qKjwgTk5JIC0gSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TRVJERVNfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjI2LCAgLyoqPCBubmlfc2VyZGVzIC0ga2V5ICovCisgICAgQkNNT0xUX0dST1VQX0lEX05OSV9TRVJERVNfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjI3LCAgLyoqPCBubmlfc2VyZGVzIC0gY2ZnICovCisgICAgQkNNT0xUX0dST1VQX0lEX1NPRlRXQVJFX0VSUk9SX0tFWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjI4LCAgLyoqPCBTb2Z0d2FyZSBFcnJvciAtIGtleSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9TT0ZUV0FSRV9FUlJPUl9DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYyOSwgIC8qKjwgU29mdHdhcmUgRXJyb3IgLSBjZmcgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfVFJYX0NBTElCUkFUSU9OX0tFWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MzAsICAvKio8IFRSWCBDYWxpYnJhdGlvbiAtIGtleSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURUQgICAgICAgICAgICAgICAgICA9IDYzMSwgIC8qKjwgVFJYIENhbGlicmF0aW9uIC0gQ2FwdHVyZSB3aW5kb3cgYW5kIHN0YXRpc3RpYyBjb21wbGV0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfVFJYX0NBTElCUkFUSU9OX0FVVE9fQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MzIsICAvKio8IFRSWCBDYWxpYnJhdGlvbiAtIEluZGljYXRpb24gQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYzMywgIC8qKjwgVFJYIENhbGlicmF0aW9uIC0gc3RhcnQgY2FwdHVyZSB3aW5kb3cgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfVFJYX0NBTElCUkFUSU9OX1NUT1BfQ0FQVFVSRV9XSU5ET1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MzQsICAvKio8IFRSWCBDYWxpYnJhdGlvbiAtIHN0b3AgY2FwdHVyZSB3aW5kb3cgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fQUxMT0NfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MzUsICAvKio8IFhHUE9OIEFsbG9jIC0ga2V5ICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX0FMTE9DX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjM2LCAgLyoqPCBYR1BPTiBBbGxvYyAtIGNmZyAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9BTExPQ19TVEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYzNywgIC8qKjwgWEdQT04gQWxsb2MgLSBzdGF0ICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX0FMTE9DX1NUQVRfQ0ZHX1JYX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjM4LCAgLyoqPCBYR1BPTiBBbGxvYyAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjM5LCAgLyoqPCBYR1BPTiBBbGxvYyAtIENvbmZpZ3VyYXRpb24gQ29tcGxldGVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjQwLCAgLyoqPCBYR1BPTiBBbGxvYyAtIEdldCBhbGxvYyBJRCBzdGF0aXN0aWNzIGNvbXBsZXRlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9BTExPQ19TVEFUX0FMQVJNX0NMRUFSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDY0MSwgIC8qKjwgWEdQT04gQWxsb2MgLSBTdGF0IEFsYXJtIENsZWFyZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fQUxMT0NfU1RBVF9BTEFSTV9SQUlTRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NDIsICAvKio8IFhHUE9OIEFsbG9jIC0gU3RhdCBBbGFybSBSYWlzZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fQUxMT0NfQVVUT19DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NDMsICAvKio8IFhHUE9OIEFsbG9jIC0gSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX0FMTE9DX0dFVF9TVEFUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjQ0LCAgLyoqPCBYR1BPTiBBbGxvYyAtIEdldCBzdGF0aXN0aWNzICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX0FMTE9DX1NFVF9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjQ1LCAgLyoqPCBYR1BPTiBBbGxvYyAtIFNldCBzdGF0ZSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9HRU1fUE9SVF9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDY0NiwgIC8qKjwgWEdQT04gR0VNIHBvcnQgLSBrZXkgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fR0VNX1BPUlRfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NDcsICAvKio8IFhHUE9OIEdFTSBwb3J0IC0gY2ZnICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX0dFTV9QT1JUX1NUQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjQ4LCAgLyoqPCBYR1BPTiBHRU0gcG9ydCAtIHN0YXQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fR0VNX1BPUlRfU1RBVF9DRkdfVFhfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NDksICAvKio8IFhHUE9OIEdFTSBwb3J0IC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fR0VNX1BPUlRfU1RBVF9DRkdfVFhfUEFDS0VUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NTAsICAvKio8IFhHUE9OIEdFTSBwb3J0IC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fR0VNX1BPUlRfU1RBVF9DRkdfUlhfUEFDS0VUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NTEsICAvKio8IFhHUE9OIEdFTSBwb3J0IC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fR0VNX1BPUlRfU1RBVF9DRkdfUlhfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NTIsICAvKio8IFhHUE9OIEdFTSBwb3J0IC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9DTEVBUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NTMsICAvKio8IFhHUE9OIEdFTSBwb3J0IC0gU3RhdCBBbGFybSBDbGVhcmVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX0dFTV9QT1JUX1NUQVRfQUxBUk1fUkFJU0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjU0LCAgLyoqPCBYR1BPTiBHRU0gcG9ydCAtIFN0YXQgQWxhcm0gUmFpc2VkICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX0dFTV9QT1JUX0FVVE9fQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjU1LCAgLyoqPCBYR1BPTiBHRU0gcG9ydCAtIEluZGljYXRpb24gQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9JV0ZfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDY1NiwgIC8qKjwgWEdQT04gSVdGIC0ga2V5ICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX0lXRl9DRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjU3LCAgLyoqPCBYR1BPTiBJV0YgLSBjZmcgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NTgsICAvKio8IFhHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0ga2V5ICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjU5LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIGNmZyAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9TVEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDY2MCwgIC8qKjwgWEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBzdGF0ICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX0ZFQ19DT0RFV09SRFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjYxLCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX0JJUDMyX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjYyLCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX0JJUDMyX0VSUk9SUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjYzLCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX1hHVENfSEVBREVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjY0LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX1hHVENfQ09SUkVDVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjY1LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX1hHVENfVU5DT1JSRUNURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjY2LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX1hHRU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjY3LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX1hHRU1fRFJPUFBFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjY4LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX1hHRU1fSURMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjY5LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX1hHRU1fQ09SUkVDVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjcwLCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX0NSQ19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjcxLCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX0ZSQUdNRU5UX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjcyLCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX1BBQ0tFVFNfRFJPUFBFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjczLCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX0RST1BQRURfVE9PX1NIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjc0LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX0RST1BQRURfVE9PX0xPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjc1LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX0tFWV9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjc2LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1RYX1BMT0FNUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjc3LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX1BMT0FNU19EUk9QUEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjc4LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX0FMTE9DQVRJT05TX1ZBTElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjc5LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX0FMTE9DQVRJT05TX0lOVkFMSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjgwLCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX0FMTE9DQVRJT05TX0RJU0FCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjgxLCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX1BMT0FNUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjgyLCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX1BMT0FNU19OT05fSURMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjgzLCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX1BMT0FNU19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjg0LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX0NQVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjg1LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX09NQ0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjg2LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjg3LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1RYX1BBQ0tFVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjg4LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1RYX1hHRU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjg5LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1RYX0NQVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjkwLCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1RYX09NQ0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjkxLCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1RYX0NQVV9PTUNJX1BBQ0tFVFNfRFJPUFBFRCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjkyLCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1RYX0RST1BQRURfSUxMRUdBTF9MRU5HVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjkzLCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1RYX0RST1BQRURfVFBJRF9NSVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjk0LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1RYX0RST1BQRURfVklEX01JU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjk1LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX0FDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjk2LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIGFjdGl2YXRlIGFsbCBvbnVzIGNvbXBsZXRlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9DUFVfUEFDS0VUU19GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDY5NywgIC8qKjwgWEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBDUFUgUGFja2V0cyBGYWlsdXJlICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX0RFQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjk4LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIGRlYWN0aXZhdGUgYWxsIG9udXMgY29tcGxldGVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX0RJU0FCTEVfQUxMX09OVVNfQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjk5LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIGRpc2FibGUgYWxsIG9udXMgY29tcGxldGVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX0VOQUJMRV9BTExfT05VU19DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzAwLCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIGVuYWJsZSBhbGwgb251cyBjb21wbGV0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfTE9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3MDEsICAvKio8IFhHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gTE9TICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzAyLCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIE9OVSBEaXNjb3ZlcmVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzAzLCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIE9OVSBVcGdyYWRlIENvbXBsZXRlICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzA0LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFByb3RlY3Rpb24gU3dpdGNoaW5nIE9OVXMgUmFuZ2VkICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgID0gNzA1LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFByb3RlY3Rpb24gU3dpdGNoaW5nIFN3aXRjaG92ZXIgQ29tcGxldGVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzA2LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFByb3RlY3Rpb24gU3dpdGNoaW5nIFRyYWZmaWMgUmVzdW1lICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzA3LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFJvZ3VlIGRldGVjdGlvbiBjb21wbGV0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfUk9HVUVfT05VX1NQRUNJQUxfTUFQX0NZQ0xFX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3MDgsICAvKio8IFhHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gUm9ndWUgT05VIHNwZWNpYWwgbWFwIGN5Y2xlIHN0YXJ0ICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NFUklBTF9OVU1CRVJfQUNRVUlTSVRJT05fQ1lDTEVfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzA5LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFNlcmlhbCBOdW1iZXIgQWNxdWlzaXRpb24gQ3ljbGUgU3RhcnQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgPSA3MTAsICAvKio8IFhHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gU3RhbmRieSBQT04gTW9uaXRvcmluZyBDeWNsZSBDb21wbGV0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfU1RBVF9BTEFSTV9DTEVBUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3MTEsICAvKio8IFhHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gU3RhdCBBbGFybSBDbGVhcmVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQUxBUk1fUkFJU0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzEyLCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXQgQWxhcm0gUmFpc2VkICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzEzLCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFN0YXRlIENoYW5nZSBDb21wbGV0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3MTQsICAvKio8IFhHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gVE9EIHJlcXVlc3QgY29tcGxldGVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX0FVVE9fQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzE1LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIEluZGljYXRpb24gQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9BREpVU1RfVFhfV0FWRUxFTkdUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcxNiwgIC8qKjwgWEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBBZGp1c3QgVHggV2F2ZWxlbmdoICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX0RJU0FCTEVfU0VSSUFMX05VTUJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzE3LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIERpc2FibGUgU2VyaWFsIE51bWJlciAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcxOCwgIC8qKjwgWEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBSZXNldCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcxOSwgIC8qKjwgWEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBSb2d1ZSBEZXRlY3Rpb24gV2luZG93ICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1JVTl9TUEVDSUFMX0JXX01BUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzIwLCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFJ1biBTcGVjaWFsIEJXIE1hcCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9TRVRfT05VX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcyMSwgIC8qKjwgWEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBTZXQgT05VIFN0YXRlICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NFVF9QT05fU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzIyLCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFNldCBQT04gU3RhdGUgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfU0lOR0xFX1JFUVVFU1RfU1RBTkRCWV9QT05fTU9OSVRPUklORyAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3MjMsICAvKio8IFhHUE9OIG5ldHdvcmsgaW50ZXJmYWNlIC0gU2luZ2xlIHJlcXVlc3Qgc3RhbmRieSBQT04gTW9uaXRvcmluZyAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9TVEFSVF9PTlVfVVBHUkFERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcyNCwgIC8qKjwgWEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBTdGFydCBPTlUgRmlybXdhcmUgVXBncmFkZSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9UT0RfUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcyNSwgIC8qKjwgWEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBUT0QgcmVxdWVzdCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9CUk9BRENBU1RfUExPQU1fUEFDS0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcyNiwgIC8qKjwgWEdQT04gbmV0d29yayBpbnRlcmZhY2UgLSBCcm9hZGNhc3QgUExPQU0gUGFja2V0ICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX0NQVV9QQUNLRVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzI3LCAgLyoqPCBYR1BPTiBuZXR3b3JrIGludGVyZmFjZSAtIFhHUE9OIENQVSBwYWNrZXRzICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzI4LCAgLyoqPCBYR1BPTiBPTlUgLSBrZXkgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3MjksICAvKio8IFhHUE9OIE9OVSAtIGNmZyAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfU1RBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDczMCwgIC8qKjwgWEdQT04gT05VIC0gc3RhdCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfU1RBVF9DRkdfUE9TSVRJVkVfRFJJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDczMSwgIC8qKjwgWEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1NUQVRfQ0ZHX05FR0FUSVZFX0RSSUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3MzIsICAvKio8IFhHUE9OIE9OVSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9TVEFUX0NGR19ERUxJTUlURVJfTUlTU19ERVRFQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzMzLCAgLyoqPCBYR1BPTiBPTlUgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfU1RBVF9DRkdfQklQMzJfRVJST1JTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDczNCwgIC8qKjwgWEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1NUQVRfQ0ZHX1JYX1dPUkRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3MzUsICAvKio8IFhHUE9OIE9OVSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9TVEFUX0NGR19GRUNfQ09SUkVDVEVEX1NZTUJPTFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzM2LCAgLyoqPCBYR1BPTiBPTlUgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfU1RBVF9DRkdfRkVDX0NPUlJFQ1RFRF9DT0RFV09SRFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDczNywgIC8qKjwgWEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1NUQVRfQ0ZHX0ZFQ19VTkNPUlJFQ1RBQkxFX0NPREVXT1JEUyAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3MzgsICAvKio8IFhHUE9OIE9OVSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9TVEFUX0NGR19GRUNfQ09ERVdPUkRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzM5LCAgLyoqPCBYR1BPTiBPTlUgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfU1RBVF9DRkdfRkVDX0NPUlJFQ1RFRF9CSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc0MCwgIC8qKjwgWEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1NUQVRfQ0ZHX1hHRU1fS0VZX0VSUk9SUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3NDEsICAvKio8IFhHUE9OIE9OVSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9TVEFUX0NGR19YR0VNX0xPU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzQyLCAgLyoqPCBYR1BPTiBPTlUgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfU1RBVF9DRkdfUlhfUExPQU1TX01JQ19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc0MywgIC8qKjwgWEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1NUQVRfQ0ZHX1JYX1BMT0FNU19OT05fSURMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3NDQsICAvKio8IFhHUE9OIE9OVSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9TVEFUX0NGR19SWF9PTUNJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzQ1LCAgLyoqPCBYR1BPTiBPTlUgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfU1RBVF9DRkdfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc0NiwgIC8qKjwgWEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1NUQVRfQ0ZHX1JYX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3NDcsICAvKio8IFhHUE9OIE9OVSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9TVEFUX0NGR19SWF9QQUNLRVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzQ4LCAgLyoqPCBYR1BPTiBPTlUgLSBTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfU1RBVF9DRkdfVFhfQllURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc0OSwgIC8qKjwgWEdQT04gT05VIC0gU3RhdGlzdGljIENvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1NUQVRfQ0ZHX1RYX1BBQ0tFVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3NTAsICAvKio8IFhHUE9OIE9OVSAtIFN0YXRpc3RpYyBDb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9ERkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzUxLCAgLyoqPCBYR1BPTiBPTlUgLSBSZWNlaXZlIER5aW5nLUdhc3Agb2YgT05VaSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfREdJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc1MiwgIC8qKjwgWEdQT04gT05VIC0gUmVjZWl2ZSBEeWluZy1HYXNwIG9mIE9OVWkgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX0RPV0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3NTMsICAvKio8IFhHUE9OIE9OVSAtIERyaWZ0IG9mIFdpbmRvdyBvZiBPTlVpICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9JTlZBTElEX0RCUlVfUkVQT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzU0LCAgLyoqPCBYR1BPTiBPTlUgLSBJbnZhbGlkIERCUnUgUmVwb3J0ICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9LRVlfRVhDSEFOR0VfQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzU1LCAgLyoqPCBYR1BPTiBPTlUgLSBLZXkgRXhjaGFuZ2UgQ29tcGxldGVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9LRVlfRVhDSEFOR0VfQ1lDTEVfU0tJUFBFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzU2LCAgLyoqPCBYR1BPTiBPTlUgLSBLZXkgRXhjaGFuZ2UgQ3ljbGUgU2tpcHBlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc1NywgIC8qKjwgWEdQT04gT05VIC0gS2V5IEV4Y2hhbmdlIEtleSBNaXNtYXRjaCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9SRVFVRVNUX1RJTUVPVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc1OCwgIC8qKjwgWEdQT04gT05VIC0gS2V5IEV4Y2hhbmdlIEtleSBSZXF1ZXN0IFRpbWVvdXQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX0xPT0NJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3NTksICAvKio8IFhHUE9OIE9OVSAtIExPT0NpICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzYwLCAgLyoqPCBYR1BPTiBPTlUgLSBPTlUgQWN0aXZhdGlvbiBDb21wbGV0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX09OVV9BTEFSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3NjEsICAvKio8IFhHUE9OIE9OVSAtIE9OVSBBbGFybSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc2MiwgIC8qKjwgWEdQT04gT05VIC0gT05VIERlYWN0aXZhdGlvbiBDb21wbGV0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX09OVV9ESVNBQkxFX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3NjMsICAvKio8IFhHUE9OIE9OVSAtIE9OVSBEaXNhYmxlIENvbXBsZXRlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfT05VX0VOQUJMRV9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc2NCwgIC8qKjwgWEdQT04gT05VIC0gT05VIEVuYWJsZSBDb21wbGV0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX09OVV9UVU5JTkdfSU5fQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3NjUsICAvKio8IFhHUE9OIE9OVSAtIE9OVSBUdW5pbmcgaW4gY29tcGxldGVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzY2LCAgLyoqPCBYR1BPTiBPTlUgLSBPTlUgVHVuaW5nIG91dCBjb21wbGV0ZWQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX09QVElDQUxfUkVGTEVDVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3NjcsICAvKio8IFhHUE9OIE9OVSAtIE9wdGljYWwgUmVmbGVjdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfUE9TU0lCTEVfRFJJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc2OCwgIC8qKjwgWEdQT04gT05VIC0gUG9zc2libGUgRHJpZnQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1BPV0VSX0NPTlNVTVBUSU9OX1JFUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3NjksICAvKio8IFhHUE9OIE9OVSAtIFBvd2VyIGNvbnN1bXB0aW9uIHJlcG9ydCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfUE9XRVJfTEVWRUxfUkVQT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc3MCwgIC8qKjwgWEdQT04gT05VIC0gUG93ZXIgbGV2ZWwgcmVwb3J0ICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzcxLCAgLyoqPCBYR1BPTiBPTlUgLSBQb3dlciBNYW5hZ2VtZW50IFN0YXRlIENoYW5nZSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfUFFTSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc3MiwgIC8qKjwgWEdQT04gT05VIC0gcGxvYW0gcXVldWUgc3RhdHVzICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzczLCAgLyoqPCBYR1BPTiBPTlUgLSBSYW5naW5nIENvbXBsZXRlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfUkVHSVNUUkFUSU9OX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc3NCwgIC8qKjwgWEdQT04gT05VIC0gUmVnaXN0cmF0aW9uIElEICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzc1LCAgLyoqPCBYR1BPTiBPTlUgLSBSU1NJIE1lYXN1cmVtZW50IENvbXBsZXRlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfU0RJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc3NiwgIC8qKjwgWEdQT04gT05VIC0gU2lnbmFsIERlZ3JhZGVkIG9mIE9OVWkgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3NzcsICAvKio8IFhHUE9OIE9OVSAtIHNlY3VyZSBtdXR1YWwgYXV0aGVudGljYXRpb24gZmFpbHVyZSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfU0ZJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc3OCwgIC8qKjwgWEdQT04gT05VIC0gU2lnbmFsIEZhaWwgb2YgT05VaSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfU1RBVF9BTEFSTV9DTEVBUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc3OSwgIC8qKjwgWEdQT04gT05VIC0gU3RhdCBBbGFybSBDbGVhcmVkICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9TVEFUX0FMQVJNX1JBSVNFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzgwLCAgLyoqPCBYR1BPTiBPTlUgLSBTdGF0IEFsYXJtIFJhaXNlZCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfU1VGSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc4MSwgIC8qKjwgWEdQT04gT05VIC0gU1VGaSAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfVElXSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc4MiwgIC8qKjwgWEdQT04gT05VIC0gVHJhbnNtaXNzaW9uIEludGVyZmVyZW5jZSBXYXJuaW5nICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9UVU5JTkdfUkVTUE9OU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzgzLCAgLyoqPCBYR1BPTiBPTlUgLSBUdW5pbmcgcmVzcG9uc2UgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX0FVVE9fQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3ODQsICAvKio8IFhHUE9OIE9OVSAtIEluZGljYXRpb24gQ29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfQURKVVNUX1RYX1dBVkVMRU5HVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc4NSwgIC8qKjwgWEdQT04gT05VIC0gQWRqdXN0IFR4IHdhdmVsZW5ndGggKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX0NIQU5HRV9QT1dFUl9MRVZFTExJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3ODYsICAvKio8IFhHUE9OIE9OVSAtIENoYW5nZSBwb3dlciBsZXZlbGxpbmcgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX0dFVF9QT1dFUl9DT05TVU1QVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3ODcsICAvKio8IFhHUE9OIE9OVSAtIEdldCBwb3dlciBjb25zdW1wdGlvbiAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfR0VUX1BPV0VSX0xFVkVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc4OCwgIC8qKjwgWEdQT04gT05VIC0gR2V0IHBvd2VyIGxldmVsICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9PTlVfVFVOSU5HX0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzg5LCAgLyoqPCBYR1BPTiBPTlUgLSBPTlUgVHVuaW5nIGluICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzkwLCAgLyoqPCBYR1BPTiBPTlUgLSBPTlUgVHVuaW5nIG91dCAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfUkVRVUVTVF9SRUdJU1RSQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc5MSwgIC8qKjwgWEdQT04gT05VIC0gUmVxdWVzdCByZWdpc3RyYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1JTU0lfTUVBU1VSRU1FTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3OTIsICAvKio8IFhHUE9OIE9OVSAtIFJTU0kgTWVhc3VyZW1lbnQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3OTMsICAvKio8IFhHUE9OIE9OVSAtIFNlY3VyZSBtdXR1YWwgYXV0aGVudGljYXRpb24gKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1NFVF9PTlVfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3OTQsICAvKio8IFhHUE9OIE9OVSAtIFNldCBPTlUgU3RhdGUgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX0NQVV9QQUNLRVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3OTUsICAvKio8IFhHUE9OIE9OVSAtIFhHUE9OIENQVSBwYWNrZXRzICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9QTE9BTV9QQUNLRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzk2LCAgLyoqPCBYR1BPTiBPTlUgLSBQTE9BTSBQYWNrZXQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX0NQVV9QQUNLRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3OTcsICAvKio8IFhHUE9OIE9OVSAtIFhHUE9OIENQVSBwYWNrZXQgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX09NQ0lfUEFDS0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3OTgsICAvKio8IFhHUE9OIE9OVSAtIFhHUE9OIE9NQ0kgcGFja2V0ICovCisgICAgQkNNT0xUX0dST1VQX0lEX1hHUE9OX1RSWF9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzk5LCAgLyoqPCBYR1BPTiBUUlggLSBrZXkgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWEdQT05fVFJYX0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4MDAsICAvKio8IFhHUE9OIFRSWCAtIGNmZyAqLworICAgIEJDTU9MVF9HUk9VUF9JRF9YUE9OX1NFUkRFU19LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgwMSwgIC8qKjwgeHBvbl9zZXJkZXMgLSBrZXkgKi8KKyAgICBCQ01PTFRfR1JPVVBfSURfWFBPTl9TRVJERVNfQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4MDIsICAvKio8IHhwb25fc2VyZGVzIC0gY2ZnICovCisgICAgQkNNT0xUX0dST1VQX0lEX19OVU1fT0YgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3JvdXBfaWQ7CisKKy8qKiBMaXN0IG9mIGFsbCBhZV9uaSBncm91cHMgb2YgdHlwZSBvcGVyLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9hZV9uaV9vcGVyX2lkCit7CisgICAgQkNNT0xUX0FFX05JX09QRVJfSURfX0JFR0lOLAorICAgIEJDTU9MVF9BRV9OSV9PUEVSX0lEX1NFVF9BRV9OSV9FTl9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU2V0IEFFIE5JIEVuYWJsZSBTdGF0ZS4gKi8KKyAgICBCQ01PTFRfQUVfTklfT1BFUl9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2FlX25pX29wZXJfaWQ7CisKKy8qKiBMaXN0IG9mIGFsbCBhZV9wYXRoX2RzIGdyb3VwcyBvZiB0eXBlIGF1dG8uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19pZAoreworICAgIEJDTU9MVF9BRV9QQVRIX0RTX0FVVE9fSURfX0JFR0lOLAorICAgIEJDTU9MVF9BRV9QQVRIX0RTX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdCBBbGFybSBDbGVhcmVkLiAqLworICAgIEJDTU9MVF9BRV9QQVRIX0RTX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQsICAgIC8qKjwgU3RhdCBBbGFybSBSYWlzZWQuICovCisgICAgQkNNT0xUX0FFX1BBVEhfRFNfQVVUT19JRF9fTlVNX09GICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfYWVfcGF0aF9kc19hdXRvX2lkOworCisvKiogTGlzdCBvZiBhbGwgYWVfcGF0aF91cyBncm91cHMgb2YgdHlwZSBhdXRvLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9faWQKK3sKKyAgICBCQ01PTFRfQUVfUEFUSF9VU19BVVRPX0lEX19CRUdJTiwKKyAgICBCQ01PTFRfQUVfUEFUSF9VU19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFN0YXQgQWxhcm0gQ2xlYXJlZC4gKi8KKyAgICBCQ01PTFRfQUVfUEFUSF9VU19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAgICAvKio8IFN0YXQgQWxhcm0gUmFpc2VkLiAqLworICAgIEJDTU9MVF9BRV9QQVRIX1VTX0FVVE9fSURfX05VTV9PRiAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19pZDsKKworLyoqIExpc3Qgb2YgYWxsIGRlYnVnIGdyb3VwcyBvZiB0eXBlIGF1dG8uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2RlYnVnX2F1dG9faWQKK3sKKyAgICBCQ01PTFRfREVCVUdfQVVUT19JRF9fQkVHSU4sCisgICAgQkNNT0xUX0RFQlVHX0FVVE9fSURfQ0xJX09VVFBVVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBjbGlfb3V0cHV0LiAqLworICAgIEJDTU9MVF9ERUJVR19BVVRPX0lEX0ZJTEVfQUxNT1NUX0ZVTEwsICAvKio8IGZpbGVfYWxtb3N0X2Z1bGwuICovCisgICAgQkNNT0xUX0RFQlVHX0FVVE9fSURfX05VTV9PRiAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2RlYnVnX2F1dG9faWQ7CisKKy8qKiBMaXN0IG9mIGFsbCBkZWJ1ZyBncm91cHMgb2YgdHlwZSBvcGVyLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9kZWJ1Z19vcGVyX2lkCit7CisgICAgQkNNT0xUX0RFQlVHX09QRVJfSURfX0JFR0lOLAorICAgIEJDTU9MVF9ERUJVR19PUEVSX0lEX0NMSV9JTlBVVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQ0xJX2lucHV0LiAqLworICAgIEJDTU9MVF9ERUJVR19PUEVSX0lEX1JFU0VUX0FQSV9DQVBUVVJFLCAvKio8IFJlc2V0IEFQSSBDYXB0dXJlLiAqLworICAgIEJDTU9MVF9ERUJVR19PUEVSX0lEX1NUQVJUX0FQSV9DQVBUVVJFLCAvKio8IFN0YXJ0IEFQSSBDYXB0dXJlLiAqLworICAgIEJDTU9MVF9ERUJVR19PUEVSX0lEX1NUT1BfQVBJX0NBUFRVUkUsICAvKio8IFN0b3AgQVBJIENhcHR1cmUuICovCisgICAgQkNNT0xUX0RFQlVHX09QRVJfSURfX05VTV9PRiAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2RlYnVnX29wZXJfaWQ7CisKKy8qKiBMaXN0IG9mIGFsbCBkZXZpY2UgZ3JvdXBzIG9mIHR5cGUgYXV0by4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZGV2aWNlX2F1dG9faWQKK3sKKyAgICBCQ01PTFRfREVWSUNFX0FVVE9fSURfX0JFR0lOLAorICAgIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9DT05ORUNUSU9OX0NPTVBMRVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQ29ubmVjdGlvbiBDb21wbGV0ZS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0FVVE9fSURfQ09OTkVDVElPTl9FU1RBQkxJU0hFRCwgICAvKio8IENvbm5lY3Rpb24gRXN0YWJsaXNoZWQgKEludGVybmFsKS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0FVVE9fSURfQ09OTkVDVElPTl9GQUlMVVJFLCAgICAgICAvKio8IENvbm5lY3Rpb24gRmFpbHVyZS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0FVVE9fSURfRERSX1RFU1RfQ09NUExFVEUsICAgICAgICAvKio8IEREUiBUZXN0IENvbXBsZXRlLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9ERVZJQ0VfS0VFUF9BTElWRSwgICAgICAgIC8qKjwgRGV2aWNlIEtlZXAgQWxpdmUgKEludGVybmFsKS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0FVVE9fSURfREVWSUNFX1JFQURZLCAgICAgICAgICAgICAvKio8IERldmljZSBSZWFkeSAoSW50ZXJuYWwpLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9ESVNDT05ORUNUSU9OX0NPTVBMRVRFLCAgIC8qKjwgRGlzY29ubmVjdGlvbiBDb21wbGV0ZS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0FVVE9fSURfSU1BR0VfVFJBTlNGRVJfQ09NUExFVEUsICAvKio8IEltYWdlIFRyYW5zZmVyIENvbXBsZXRlLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9JTkRJQ0FUSU9OU19EUk9QUEVELCAgICAgIC8qKjwgSW5kaWNhdGlvbnMgRHJvcHBlZC4gKi8KKyAgICBCQ01PTFRfREVWSUNFX0FVVE9fSURfU1dfRVJST1IsICAgICAgICAgICAgICAgICAvKio8IHN3IGVycm9yLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9TV19FWENFUFRJT04sICAgICAgICAgICAgIC8qKjwgc3cgZXhjZXB0aW9uLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9fTlVNX09GICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2RldmljZV9hdXRvX2lkOworCisvKiogTGlzdCBvZiBhbGwgZGV2aWNlIGdyb3VwcyBvZiB0eXBlIG9wZXIuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2RldmljZV9vcGVyX2lkCit7CisgICAgQkNNT0xUX0RFVklDRV9PUEVSX0lEX19CRUdJTiwKKyAgICBCQ01PTFRfREVWSUNFX09QRVJfSURfQ09OTkVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IENvbm5lY3QuICovCisgICAgQkNNT0xUX0RFVklDRV9PUEVSX0lEX0RJU0NPTk5FQ1QsICAgICAgICAgICAvKio8IERldmljZSBEaXNjb25uZWN0LiAqLworICAgIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9IT1NUX0tFRVBfQUxJVkUsICAgICAgLyoqPCBIb3N0IEtlZXAgQWxpdmUgKEludGVybmFsKS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX09QRVJfSURfSU1BR0VfVFJBTlNGRVJfREFUQSwgIC8qKjwgSW1hZ2UgRGF0YSBUcmFuc2ZlciBPcGVyYXRpb24gKEludGVybmFsKS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX09QRVJfSURfSU1BR0VfVFJBTlNGRVJfU1RBUlQsIC8qKjwgU3RhcnQgSW1hZ2UgVHJhbnNmZXIgT3BlcmF0aW9uLiAqLworICAgIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9SRVNFVCwgICAgICAgICAgICAgICAgLyoqPCBEZXZpY2UgUmVzZXQuICovCisgICAgQkNNT0xUX0RFVklDRV9PUEVSX0lEX1JVTl9ERFJfVEVTVCwgICAgICAgICAvKio8IFJ1biBERFIgVGVzdC4gKi8KKyAgICBCQ01PTFRfREVWSUNFX09QRVJfSURfU1dfVVBHUkFERV9BQ1RJVkFURSwgIC8qKjwgU1cgdXBncmFkZSBhY3RpdmF0ZS4gKi8KKyAgICBCQ01PTFRfREVWSUNFX09QRVJfSURfX05VTV9PRiAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2RldmljZV9vcGVyX2lkOworCisvKiogTGlzdCBvZiBhbGwgZXBvbl9kZW5pZWRfbGluayBncm91cHMgb2YgdHlwZSBhdXRvLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9faWQKK3sKKyAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX19CRUdJTiwKKyAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX0xBU0VSX09OX09GRl9WSU9MQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IExhc2VyIE9uL09mZiBWaW9sYXRpb24uICovCisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19JRF9MTElEX1BPT0xfRU1QVFlfVklPTEFUSU9OLCAgICAgIC8qKjwgTExJRCBQb29sIEVtcHR5IFZpb2xhdGlvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX01BWF9MSU5LX1ZJT0xBVElPTiwgICAgICAgICAgICAgLyoqPCBNYXggTGluayBWaW9sYXRpb24uICovCisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19JRF9PVkVSSEVBRF9QUk9GSUxFX1ZJT0xBVElPTiwgICAgIC8qKjwgT3ZlcmhlYWQgUHJvZmlsZSBWaW9sYXRpb24uICovCisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19JRF9SQU5HRV9WSU9MQVRJT04sICAgICAgICAgICAgICAgIC8qKjwgUmFuZ2UgVmlvbGF0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fSURfUk9HVUVfVklPTEFUSU9OLCAgICAgICAgICAgICAgICAvKio8IFJvZ3VlIE9OVSBEZXRlY3RlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX1NZU1RFTV9SRVNPVVJDRV9WSU9MQVRJT04sICAgICAgLyoqPCBTeXN0ZW0gUmVzb3VyY2UgVmlvbGF0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fSURfVERNX0NIQU5ORUxTX0VYSEFVU1RFRCwgICAgICAgICAvKio8IFRETSBDaGFubmVscyBFeGhhdXN0ZWQuICovCisgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19JRF9VTktOT1dOX0xJTktfVklPTEFUSU9OLCAgICAgICAgIC8qKjwgVW5rbm93biBMaW5rIFZpb2xhdGlvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX1VQU1RSRUFNX0JBTkRXSURUSF9WSU9MQVRJT04sICAgLyoqPCBVcHN0cmVhbSBCYW5kd2lkdGggVmlvbGF0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fSURfX05VTV9PRiAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9faWQ7CisKKy8qKiBMaXN0IG9mIGFsbCBlcG9uX2xpbmsgZ3JvdXBzIG9mIHR5cGUgYXV0by4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9saW5rX2F1dG9faWQKK3sKKyAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfX0JFR0lOLAorICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9EVVBMSUNBVEVfTVBDUF9SRUdJU1RSQVRJT05fUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgRHVwbGljYXRlIE1QQ1AgUmVnaXN0cmF0aW9uIFJlcXVlc3QuICovCisgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX0VOQ1JZUFRJT05fRU5BQkxFRCwgICAgICAgICAgICAvKio8IEVuY3J5cHRpb24gRW5hYmxlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfS0VZX0VYQ0hBTkdFX0ZBSUxVUkUsICAgICAgICAgIC8qKjwgS2V5IEV4Y2hhbmdlIEZhaWx1cmUuICovCisgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX0tFWV9FWENIQU5HRV9TVEFSVEVELCAgICAgICAgICAvKio8IGtleV9leGNoYW5nZV9zdGFydGVkLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9LRVlfRVhDSEFOR0VfU1RPUFBFRCwgICAgICAgICAgLyoqPCBrZXlfZXhjaGFuZ2Vfc3RvcHBlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfTElOS19ERUxFVEVELCAgICAgICAgICAgICAgICAgIC8qKjwgTGluayBEZWxldGVkLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9MSU5LX1NQRUVEX01JU01BVENILCAgICAgICAgICAgLyoqPCBMaW5rIGF0dGVtcHRlZCB0byByZWdpc3RlciBhdCBhIGRpZmZlcmVudCBzcGVlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfTVBDUF9ERVJFR0lTVEVSRUQsICAgICAgICAgICAgIC8qKjwgTVBDUCBEZXJlZ2lzdGVyZWQuICovCisgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX01QQ1BfRElTQ09WRVJFRCwgICAgICAgICAgICAgICAvKio8IE1QQ1AgRGlzY292ZXJlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfTVBDUF9SRUdfQUNLX1RJTUVPVVQsICAgICAgICAgIC8qKjwgTVBDUCBSZWcgQWNrIFRpbWVvdXQuICovCisgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX01QQ1BfUkVQT1JUX1RJTUVPVVQsICAgICAgICAgICAvKio8IE1QQ1AgUmVwb3J0IFRpbWVvdXQuICovCisgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX09BTV9LRUVQQUxJVkVfVElNRU9VVCwgICAgICAgICAvKio8IE9BTSBLZWVwYWxpdmUgVGltZW91dC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfT0FNX0tFRVBBTElWRV9USU1FUl9TVEFSVEVELCAgIC8qKjwgT0FNIGtlZXBhbGl2ZSB0aW1lciBzdGFydGVkLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9PQU1fS0VFUEFMSVZFX1RJTUVSX1NUT1BQRUQsICAgLyoqPCBPQU0ga2VlcGFsaXZlIHRpbWVyIHN0b3BwZWQuICovCisgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX1BSRVBST1ZJU0lPTkVEX0xJTktfQ1JFQVRFRCwgICAvKio8IFByZXByb3Zpc2lvbmVkIExpbmsgQ3JlYXRlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfUFJPVEVDVElPTl9TV0lUQ0hfT0NDVVJSRUQsICAgIC8qKjwgUHJvdGVjdGlvbiBTd2l0Y2ggT2NjdXJyZWQuICovCisgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX1JBTkdFX1ZBTFVFX0NIQU5HRUQsICAgICAgICAgICAvKio8IFJhbmdlIFZhbHVlIENoYW5nZWQuICovCisgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX1JFUkFOR0VfRkFJTFVSRSwgICAgICAgICAgICAgICAvKio8IFJlLXJhbmdlIGZhaWx1cmUuICovCisgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgICAgICAgICAgICAvKio8IFN0YXQgQWxhcm0gQ2xlYXJlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQsICAgICAgICAgICAgIC8qKjwgU3RhdCBBbGFybSBSYWlzZWQuICovCisgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX1NUQVRJQ19SRUdJU1RSQVRJT05fRE9ORSwgICAgICAvKio8IFN0YXRpYyByZWdpc3RyYXRpb24gZG9uZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19hdXRvX2lkOworCisvKiogTGlzdCBvZiBhbGwgZXBvbl9saW5rIGdyb3VwcyBvZiB0eXBlIG9wZXIuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fbGlua19vcGVyX2lkCit7CisgICAgQkNNT0xUX0VQT05fTElOS19PUEVSX0lEX19CRUdJTiwKKyAgICBCQ01PTFRfRVBPTl9MSU5LX09QRVJfSURfREVMRVRFX0xJTksgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IERlbGV0ZSBMaW5rLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9GT1JDRV9SRURJU0NPVkVSWSwgICAgICAgICAvKio8IEZvcmNlIExpbmsgUmVkaXNjb3ZlcnkuICovCisgICAgQkNNT0xUX0VQT05fTElOS19PUEVSX0lEX0tFWV9FWENIQU5HRV9TVEFSVCwgICAgICAgIC8qKjwgS2V5IGV4Y2hhbmdlIHN0YXJ0LiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9LRVlfRVhDSEFOR0VfU1RPUCwgICAgICAgICAvKio8IEtleSBleGNoYW5nZSBzdG9wLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9PQU1fS0VFUEFMSVZFX1RJTUVSX1NUQVJULCAvKio8IE9BTSBLZWVwYWxpdmUgVGltZXIgU3RhcnQuICovCisgICAgQkNNT0xUX0VQT05fTElOS19PUEVSX0lEX09BTV9LRUVQQUxJVkVfVElNRVJfU1RPUCwgIC8qKjwgT0FNIEtlZXBhbGl2ZSBUaW1lciBTdG9wLiAqLworICAgIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9TVEFUSUNfUkVHSVNUUkFUSU9OLCAgICAgICAvKio8IHN0YXRpY19yZWdpc3RyYXRpb24uICovCisgICAgQkNNT0xUX0VQT05fTElOS19PUEVSX0lEX19OVU1fT0YgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19vcGVyX2lkOworCisvKiogTGlzdCBvZiBhbGwgZXBvbl9saW5rIGdyb3VwcyBvZiB0eXBlIHByb3h5LiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX2xpbmtfcHJveHlfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9MSU5LX1BST1hZX0lEX19CRUdJTiwKKyAgICBCQ01PTFRfRVBPTl9MSU5LX1BST1hZX0lEX0lOSkVDVF9GUkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEluamVjdCBGcmFtZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9MSU5LX1BST1hZX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfcHJveHlfaWQ7CisKKy8qKiBMaXN0IG9mIGFsbCBlcG9uX2xpbmsgZ3JvdXBzIG9mIHR5cGUgcHJveHlfcnguIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fbGlua19wcm94eV9yeF9pZAoreworICAgIEJDTU9MVF9FUE9OX0xJTktfUFJPWFlfUlhfSURfX0JFR0lOLAorICAgIEJDTU9MVF9FUE9OX0xJTktfUFJPWFlfUlhfSURfRlJBTUVfQ0FQVFVSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgRnJhbWUgQ2FwdHVyZWQuICovCisgICAgQkNNT0xUX0VQT05fTElOS19QUk9YWV9SWF9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19wcm94eV9yeF9pZDsKKworLyoqIExpc3Qgb2YgYWxsIGVwb25fbmkgZ3JvdXBzIG9mIHR5cGUgYXV0by4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9uaV9hdXRvX2lkCit7CisgICAgQkNNT0xUX0VQT05fTklfQVVUT19JRF9fQkVHSU4sCisgICAgQkNNT0xUX0VQT05fTklfQVVUT19JRF9BVVRPX1JPR1VFX1NDQU5fMTBHX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCAxMEcgRXBvbiBBdXRvbm9tb3VzIFJvZ3VlIFNjYW4gZmFpbHVyZSBkZXRlY3RlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9BVVRPX0lEX0FVVE9fUk9HVUVfU0NBTl8xR19GQUlMVVJFLCAgLyoqPCAxRyBFcG9uIEF1dG9ub21vdXMgUm9ndWUgU2NhbiBmYWlsdXJlIGRldGVjdGVkLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfTExJRF9RVUFSQU5USU5FRCwgICAgICAgICAgICAvKio8IExMSUQgUXVhcmFudGluZWQuICovCisgICAgQkNNT0xUX0VQT05fTklfQVVUT19JRF9NUENQX1RJTUVTVEFNUF9DSEFOR0VELCAgICAgIC8qKjwgTVBDUCBUaW1lc3RhbXAgQ2hhbmdlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9BVVRPX0lEX05PX1JFUE9SVFMsICAgICAgICAgICAgICAgICAgLyoqPCBObyBSZXBvcnRzLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfT05VX1VQR1JBREVfQ09NUExFVEUsICAgICAgICAvKio8IE9OVSBVcGdyYWRlIENvbXBsZXRlLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfUkVSQU5HRV9GQUlMVVJFLCAgICAgICAgICAgICAvKio8IFJlLXJhbmdlIGZhaWx1cmUuICovCisgICAgQkNNT0xUX0VQT05fTklfQVVUT19JRF9ST0dVRV9TQ0FOX0NPTVBMRVRFLCAgICAgICAgIC8qKjwgUm9ndWUgU2NhbiBpcyBDb21wbGV0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9BVVRPX0lEX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVELCAgLyoqPCBSU1NJIE1lYXN1cmVtZW50IENvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9BVVRPX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQsICAgICAgLyoqPCBTdGF0ZSBDaGFuZ2UgQ29tcGxldGVkLiAqLworICAgIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9lcG9uX25pX2F1dG9faWQ7CisKKy8qKiBMaXN0IG9mIGFsbCBlcG9uX25pIGdyb3VwcyBvZiB0eXBlIG9wZXIuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fbmlfb3Blcl9pZAoreworICAgIEJDTU9MVF9FUE9OX05JX09QRVJfSURfX0JFR0lOLAorICAgIEJDTU9MVF9FUE9OX05JX09QRVJfSURfQUREX0xJTksgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQWRkIGxpbmsuICovCisgICAgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9BRERfTVVMVElDQVNUX0xJTkssICAgICAgICAgIC8qKjwgQWRkIE11dGx0aWNhc3RsaW5rLiAqLworICAgIEJDTU9MVF9FUE9OX05JX09QRVJfSURfQUREX1BST1RFQ1RFRF9TVEFOREJZX0xJTkssICAvKio8IEFkZCBQcm90ZWN0ZWQgU3RhbmRieSBMaW5rLiAqLworICAgIEJDTU9MVF9FUE9OX05JX09QRVJfSURfSVNTVUVfUlNTSV9HUkFOVCwgICAgICAgICAgICAvKio8IElzc3VlIGFuIFJ4IFBvd2VyIE1lYXN1cmVtZW50IFJlcXVlc3QuICovCisgICAgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9QUk9URUNUSU9OX1NXSVRDSElOR19BUFBMWV9SRVJBTkdFX0RFTFRBLCAgICAvKio8IFByb3RlY3Rpb24gc3dpdGNoaW5nIGFwcGx5IHJlLXJhbmdlIGRlbHRhLiAqLworICAgIEJDTU9MVF9FUE9OX05JX09QRVJfSURfUk9HVUVfTExJRF9TQ0FOLCAgICAgICAgIC8qKjwgUnVuIFJvZ3VlIExMSUQgU2Nhbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX1NFVF9FUE9OX05JX0VOX1NUQVRFLCAgICAvKio8IFNldCBFUE9OIE5JIEVuYWJsZSBTdGF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX1NUQVJUX09OVV9VUEdSQURFLCAgICAgICAvKio8IFN0YXJ0IE9OVSBGaXJtd2FyZSBVcGdyYWRlLiAqLworICAgIEJDTU9MVF9FUE9OX05JX09QRVJfSURfX05VTV9PRiAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fbmlfb3Blcl9pZDsKKworLyoqIExpc3Qgb2YgYWxsIGVwb25fb251XzEwZ191cyBncm91cHMgb2YgdHlwZSBhdXRvLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19pZAoreworICAgIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfQVVUT19JRF9fQkVHSU4sCisgICAgQkNNT0xUX0VQT05fT05VXzEwR19VU19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdGF0IEFsYXJtIENsZWFyZWQuICovCisgICAgQkNNT0xUX0VQT05fT05VXzEwR19VU19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAgIC8qKjwgU3RhdCBBbGFybSBSYWlzZWQuICovCisgICAgQkNNT0xUX0VQT05fT05VXzEwR19VU19BVVRPX0lEX19OVU1fT0YgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2lkOworCisvKiogTGlzdCBvZiBhbGwgZXBvbl9vbnVfMWdfdXMgZ3JvdXBzIG9mIHR5cGUgYXV0by4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19pZAoreworICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19BVVRPX0lEX19CRUdJTiwKKyAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFN0YXQgQWxhcm0gQ2xlYXJlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgICAgLyoqPCBTdGF0IEFsYXJtIFJhaXNlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQVVUT19JRF9fTlVNX09GICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19pZDsKKworLyoqIExpc3Qgb2YgYWxsIGVwb25fcGF0aF8xMGdfZHMgZ3JvdXBzIG9mIHR5cGUgYXV0by4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2lkCit7CisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfQVVUT19JRF9fQkVHSU4sCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdGF0IEFsYXJtIENsZWFyZWQuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgIC8qKjwgU3RhdCBBbGFybSBSYWlzZWQuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfQVVUT19JRF9fTlVNX09GICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19pZDsKKworLyoqIExpc3Qgb2YgYWxsIGVwb25fcGF0aF8xMGdfdXMgZ3JvdXBzIG9mIHR5cGUgYXV0by4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2lkCit7CisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQVVUT19JRF9fQkVHSU4sCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdGF0IEFsYXJtIENsZWFyZWQuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgIC8qKjwgU3RhdCBBbGFybSBSYWlzZWQuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQVVUT19JRF9fTlVNX09GICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19pZDsKKworLyoqIExpc3Qgb2YgYWxsIGVwb25fcGF0aF8xZ19kcyBncm91cHMgb2YgdHlwZSBhdXRvLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19pZAoreworICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQVVUT19JRF9fQkVHSU4sCisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdGF0IEFsYXJtIENsZWFyZWQuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAgIC8qKjwgU3RhdCBBbGFybSBSYWlzZWQuICovCisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19BVVRPX0lEX19OVU1fT0YgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2lkOworCisvKiogTGlzdCBvZiBhbGwgZXBvbl9wYXRoXzFnX3VzIGdyb3VwcyBvZiB0eXBlIGF1dG8uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2lkCit7CisgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19BVVRPX0lEX19CRUdJTiwKKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFN0YXQgQWxhcm0gQ2xlYXJlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQsICAgLyoqPCBTdGF0IEFsYXJtIFJhaXNlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0FVVE9fSURfX05VTV9PRiAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9faWQ7CisKKy8qKiBMaXN0IG9mIGFsbCBncG9uX2FsbG9jIGdyb3VwcyBvZiB0eXBlIGF1dG8uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fYWxsb2NfYXV0b19pZAoreworICAgIEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fSURfX0JFR0lOLAorICAgIEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQ29uZmlndXJhdGlvbiBDb21wbGV0ZWQuICovCisgICAgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19JRF9HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVELCAgICAvKio8IEdldCBhbGxvYyBJRCBzdGF0aXN0aWNzIGNvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgICAgICAgICAgIC8qKjwgU3RhdCBBbGFybSBDbGVhcmVkLiAqLworICAgIEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQsICAgICAgICAgICAgLyoqPCBTdGF0IEFsYXJtIFJhaXNlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0lEX19OVU1fT0YgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fYWxsb2NfYXV0b19pZDsKKworLyoqIExpc3Qgb2YgYWxsIGdwb25fYWxsb2MgZ3JvdXBzIG9mIHR5cGUgb3Blci4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9hbGxvY19vcGVyX2lkCit7CisgICAgQkNNT0xUX0dQT05fQUxMT0NfT1BFUl9JRF9fQkVHSU4sCisgICAgQkNNT0xUX0dQT05fQUxMT0NfT1BFUl9JRF9HRVRfU1RBVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBHZXQgc3RhdGlzdGljcy4gKi8KKyAgICBCQ01PTFRfR1BPTl9BTExPQ19PUEVSX0lEX1NFVF9TVEFURSwgICAgLyoqPCBTZXQgc3RhdGUuICovCisgICAgQkNNT0xUX0dQT05fQUxMT0NfT1BFUl9JRF9fTlVNX09GICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fYWxsb2Nfb3Blcl9pZDsKKworLyoqIExpc3Qgb2YgYWxsIGdwb25fZ2VtX3BvcnQgZ3JvdXBzIG9mIHR5cGUgYXV0by4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2lkCit7CisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19JRF9fQkVHSU4sCisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBDb25maWd1cmF0aW9uIENvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgICAgLyoqPCBTdGF0IEFsYXJtIENsZWFyZWQuICovCisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgICAgIC8qKjwgU3RhdCBBbGFybSBSYWlzZWQuICovCisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19JRF9fTlVNX09GICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19pZDsKKworLyoqIExpc3Qgb2YgYWxsIGdwb25fZ2VtX3BvcnQgZ3JvdXBzIG9mIHR5cGUgb3Blci4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9vcGVyX2lkCit7CisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfT1BFUl9JRF9fQkVHSU4sCisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfT1BFUl9JRF9TRVRfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTZXQgc3RhdGUuICovCisgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfT1BFUl9JRF9fTlVNX09GICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fZ2VtX3BvcnRfb3Blcl9pZDsKKworLyoqIExpc3Qgb2YgYWxsIGdwb25faXdmIGdyb3VwcyBvZiB0eXBlIGF1dG8uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25faXdmX2F1dG9faWQKK3sKKyAgICBCQ01PTFRfR1BPTl9JV0ZfQVVUT19JRF9fQkVHSU4sCisgICAgQkNNT0xUX0dQT05fSVdGX0FVVE9fSURfRkxVU0hfTUFDX1RBQkxFX0NPTVBMRVRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBGbHVzaCBNQUMgVGFibGUgQ29tcGxldGVkLiAqLworICAgIEJDTU9MVF9HUE9OX0lXRl9BVVRPX0lEX1NDQU5fTUFDX1RBQkxFX0NPTVBMRVRFRCwgICAvKio8IFNjYW4gTUFDIFRhYmxlIENvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9JV0ZfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsICAgICAgICAgLyoqPCBTdGF0IEFsYXJtIENsZWFyZWQuICovCisgICAgQkNNT0xUX0dQT05fSVdGX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQsICAgICAgICAgIC8qKjwgU3RhdCBBbGFybSBSYWlzZWQuICovCisgICAgQkNNT0xUX0dQT05fSVdGX0FVVE9fSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25faXdmX2F1dG9faWQ7CisKKy8qKiBMaXN0IG9mIGFsbCBncG9uX2l3ZiBncm91cHMgb2YgdHlwZSBvcGVyLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX2l3Zl9vcGVyX2lkCit7CisgICAgQkNNT0xUX0dQT05fSVdGX09QRVJfSURfX0JFR0lOLAorICAgIEJDTU9MVF9HUE9OX0lXRl9PUEVSX0lEX0ZMVVNIX01BQ19UQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgRmx1c2ggTUFDIFRhYmxlLiAqLworICAgIEJDTU9MVF9HUE9OX0lXRl9PUEVSX0lEX1NDQU5fTUFDX1RBQkxFLCAvKio8IFNjYW4gTUFDIFRhYmxlLiAqLworICAgIEJDTU9MVF9HUE9OX0lXRl9PUEVSX0lEX19OVU1fT0YgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9ncG9uX2l3Zl9vcGVyX2lkOworCisvKiogTGlzdCBvZiBhbGwgZ3Bvbl9pd2ZfbWFjX3RhYmxlIGdyb3VwcyBvZiB0eXBlIGF1dG8uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2lkCit7CisgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0lEX19CRUdJTiwKKyAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fSURfTUFDX0FHRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IE1BQyBBZ2VkLiAqLworICAgIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19JRF9NQUNfRFJPUFBFRCwgIC8qKjwgTUFDIERyb3BwZWQuICovCisgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0lEX01BQ19NT1ZFLCAgICAgLyoqPCBNQUMgTW92ZS4gKi8KKyAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fSURfTkVXX01BQywgICAgICAvKio8IE5ldyBNQUMuICovCisgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0lEX19OVU1fT0YgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9faWQ7CisKKy8qKiBMaXN0IG9mIGFsbCBncG9uX25pIGdyb3VwcyBvZiB0eXBlIGF1dG8uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fbmlfYXV0b19pZAoreworICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfX0JFR0lOLAorICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgYWN0aXZhdGUgYWxsIG9udXMgY29tcGxldGVkLiAqLworICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfQ1BVX1BBQ0tFVFNfRkFJTFVSRSwgICAgICAgICAgICAgLyoqPCBDUFUgUGFja2V0cyBGYWlsdXJlLiAqLworICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfREVBQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQsICAgLyoqPCBkZWFjdGl2YXRlIGFsbCBvbnVzIGNvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX0RJU0FCTEVfQUxMX09OVVNfQ09NUExFVEVELCAgICAgIC8qKjwgZGlzYWJsZSBhbGwgb251cyBjb21wbGV0ZWQuICovCisgICAgQkNNT0xUX0dQT05fTklfQVVUT19JRF9FTkFCTEVfQUxMX09OVVNfQ09NUExFVEVELCAgICAgICAvKio8IGVuYWJsZSBhbGwgb251cyBjb21wbGV0ZWQuICovCisgICAgQkNNT0xUX0dQT05fTklfQVVUT19JRF9MT1MsICAgICAgICAgICAgICAgICAgICAgLyoqPCBMT1MuICovCisgICAgQkNNT0xUX0dQT05fTklfQVVUT19JRF9PTlVfRElTQ09WRVJFRCwgICAgICAgICAgLyoqPCBPTlUgRGlzY292ZXJlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX09OVV9VUEdSQURFX0NPTVBMRVRFLCAgICAvKio8IE9OVSBVcGdyYWRlIENvbXBsZXRlLiAqLworICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRUQsICAgICAgICAgICAgLyoqPCBQcm90ZWN0aW9uIFN3aXRjaGluZyBPTlVzIFJhbmdlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVELCAgIC8qKjwgUHJvdGVjdGlvbiBTd2l0Y2hpbmcgU3dpdGNob3ZlciBDb21wbGV0ZWQuICovCisgICAgQkNNT0xUX0dQT05fTklfQVVUT19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRSwgICAgICAgICAvKio8IFByb3RlY3Rpb24gU3dpdGNoaW5nIFRyYWZmaWMgUmVzdW1lLiAqLworICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRCwgICAgICAgICAgICAgICAgICAgLyoqPCBSb2d1ZSBkZXRlY3Rpb24gY29tcGxldGVkLiAqLworICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfUk9HVUVfT05VX1NQRUNJQUxfTUFQX0NZQ0xFX1NUQVJULCAgICAgICAgICAgLyoqPCBSb2d1ZSBPTlUgc3BlY2lhbCBtYXAgY3ljbGUgc3RhcnQuICovCisgICAgQkNNT0xUX0dQT05fTklfQVVUT19JRF9TRVJJQUxfTlVNQkVSX0FDUVVJU0lUSU9OX0NZQ0xFX1NUQVJULCAgICAgICAvKio8IFNlcmlhbCBOdW1iZXIgQWNxdWlzaXRpb24gQ3ljbGUgU3RhcnQuICovCisgICAgQkNNT0xUX0dQT05fTklfQVVUT19JRF9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRCwgICAgICAvKio8IFN0YW5kYnkgUE9OIE1vbml0b3JpbmcgQ3ljbGUgQ29tcGxldGVkLiAqLworICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVELCAgICAgIC8qKjwgU3RhdCBBbGFybSBDbGVhcmVkLiAqLworICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQsICAgICAgIC8qKjwgU3RhdCBBbGFybSBSYWlzZWQuICovCisgICAgQkNNT0xUX0dQT05fTklfQVVUT19JRF9TVEFURV9DSEFOR0VfQ09NUExFVEVELCAgLyoqPCBTdGF0ZSBDaGFuZ2UgQ29tcGxldGVkLiAqLworICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfVE9EX1JFUVVFU1RfQ09NUExFVEVELCAgIC8qKjwgVE9EIHJlcXVlc3QgY29tcGxldGVkLiAqLworICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfX05VTV9PRiAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fbmlfYXV0b19pZDsKKworLyoqIExpc3Qgb2YgYWxsIGdwb25fbmkgZ3JvdXBzIG9mIHR5cGUgb3Blci4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9uaV9vcGVyX2lkCit7CisgICAgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9fQkVHSU4sCisgICAgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9ESVNBQkxFX1NFUklBTF9OVU1CRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBEaXNhYmxlIFNlcmlhbCBOdW1iZXIuICovCisgICAgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9QUk9URUNUSU9OX1NXSVRDSElOR19UWVBFX0NfU0VUX01VTFRJUExFX09OVV9TVEFURSwgICAgICAgICAgICAgICAgICAgICAgLyoqPCBwcm90ZWN0aW9uIHN3aXRjaGluZyB0eXBlIGMgc2V0IG11bHRpcGxlIG9udSBzdGF0ZS4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1JFU0VULCAgICAgICAgICAgICAgICAgICAvKio8IFJlc2V0LiAqLworICAgIEJDTU9MVF9HUE9OX05JX09QRVJfSURfUk9HVUVfREVURUNUSU9OX1dJTkRPVywgIC8qKjwgUm9ndWUgRGV0ZWN0aW9uIFdpbmRvdy4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1NFVF9PTlVfU1RBVEUsICAgICAgICAgICAvKio8IFNldCBPTlUgU3RhdGUuICovCisgICAgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9TRVRfUE9OX1NUQVRFLCAgICAgICAgICAgLyoqPCBTZXQgUE9OIFN0YXRlLiAqLworICAgIEJDTU9MVF9HUE9OX05JX09QRVJfSURfU0lOR0xFX1JFUVVFU1RfU1RBTkRCWV9QT05fTU9OSVRPUklORywgICAvKio8IFNpbmdsZSByZXF1ZXN0IGZvciBzdGFuZGJ5IFBPTiBtb25pdG9yaW5nLiAqLworICAgIEJDTU9MVF9HUE9OX05JX09QRVJfSURfU1RBUlRfT05VX1VQR1JBREUsICAgICAgICAgICAgICAgICAgICAgICAvKio8IFN0YXJ0IE9OVSBGaXJtd2FyZSBVcGdyYWRlLiAqLworICAgIEJDTU9MVF9HUE9OX05JX09QRVJfSURfVE9EX1JFUVVFU1QsIC8qKjwgVE9EIHJlcXVlc3QuICovCisgICAgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9fTlVNX09GICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9vcGVyX2lkOworCisvKiogTGlzdCBvZiBhbGwgZ3Bvbl9uaSBncm91cHMgb2YgdHlwZSBwcm94eS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9uaV9wcm94eV9pZAoreworICAgIEJDTU9MVF9HUE9OX05JX1BST1hZX0lEX19CRUdJTiwKKyAgICBCQ01PTFRfR1BPTl9OSV9QUk9YWV9JRF9CUk9BRENBU1RfUExPQU1fUEFDS0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEJyb2FkY2FzdCBQTE9BTSBQYWNrZXQuICovCisgICAgQkNNT0xUX0dQT05fTklfUFJPWFlfSURfQ1BVX1BBQ0tFVFMsICAgIC8qKjwgR1BPTiBDUFUgUGFja2V0cy4gKi8KKyAgICBCQ01PTFRfR1BPTl9OSV9QUk9YWV9JRF9fTlVNX09GICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9wcm94eV9pZDsKKworLyoqIExpc3Qgb2YgYWxsIGdwb25fb251IGdyb3VwcyBvZiB0eXBlIGF1dG8uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2dwb25fb251X2F1dG9faWQKK3sKKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9fQkVHSU4sCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfQkVSX0lOVEVSVkFMX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBCRVIgSW50ZXJ2YWwgQ29uZmlndXJhdGlvbiBDb21wbGV0ZWQuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfREZJLCAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUmVjZWl2ZSBEeWluZy1HYXNwIG9mIE9OVWkuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfREdJLCAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUmVjZWl2ZSBEeWluZy1HYXNwIG9mIE9OVWkuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfRE9XSSwgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRHJpZnQgb2YgV2luZG93IG9mIE9OVWkuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfRVJSLCAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRVJSLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0lOVkFMSURfREJSVV9SRVBPUlQsICAgICAgICAvKio8IEludmFsaWQgREJSdSBSZXBvcnQuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfS0VZX0VYQ0hBTkdFX0NPTVBMRVRFRCwgICAgIC8qKjwgS2V5IEV4Y2hhbmdlIENvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfQ1lDTEVfU0tJUFBFRCwgLyoqPCBLZXkgRXhjaGFuZ2UgQ3ljbGUgU2tpcHBlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfREVDUllQVF9SRVFVSVJFRCwgICAgICAvKio8IEtleSBFeGNoYW5nZSBEZWNyeXB0IFJlcXVpcmVkLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0gsICAgICAgICAgIC8qKjwgS2V5IEV4Y2hhbmdlIEtleSBNaXNtYXRjaC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfS0VZX1JFUVVFU1RfVElNRU9VVCwgICAvKio8IEtleSBFeGNoYW5nZSBLZXkgUmVxdWVzdCBUaW1lb3V0LiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0tFWV9FWENIQU5HRV9VTkNPTlNFQ1VUSVZFX0lOREVYLCAgIC8qKjwgS2V5IEV4Y2hhbmdlIFVuY29uc2VjdXRpdmUgSW5kZXguICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfTE9BSSwgICAvKio8IExPQWkuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfTE9LSSwgICAvKio8IExPa2kuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfTUVNSSwgICAvKio8IE1FTWkuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT01DSV9QT1JUX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVELCAgIC8qKjwgT01DSSBQT1JUIElEIENvbmZpZ3VyYXRpb24gQ29tcGxldGVkLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRCwgICAgICAgICAgICAgICAvKio8IE9OVSBBY3RpdmF0aW9uIENvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9PTlVfQUNUSVZBVElPTl9TVEFOREJZX0NPTVBMRVRFRCwgICAgICAgLyoqPCBvbnUgYWN0aXZhdGlvbiBzdGFuZGJ5IGNvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9PTlVfQUxBUk0sICAgICAgICAgICAgICAgICAgLyoqPCBPTlUgQWxhcm0uICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURUQsIC8qKjwgT05VIERlYWN0aXZhdGlvbiBDb21wbGV0ZWQuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT05VX0RJU0FCTEVfQ09NUExFVEVELCAgICAgIC8qKjwgT05VIERpc2FibGUgQ29tcGxldGVkLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX09OVV9FTkFCTEVfQ09NUExFVEVELCAgICAgICAvKio8IE9OVSBFbmFibGUgQ29tcGxldGVkLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX09QVElDQUxfUkVGTEVDVElPTiwgICAgICAgICAvKio8IE9wdGljYWwgUmVmbGVjdGlvbi4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9DT01QTEVURUQsICAvKio8IFBhc3N3b3JkIEF1dGhlbnRpY2F0aW9uIENvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9QRUUsICAgICAgICAgICAgLyoqPCBQRUUuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfUE9TU0lCTEVfRFJJRlQsIC8qKjwgUG9zc2libGUgRHJpZnQuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0UsICAvKio8IFBvd2VyIE1hbmFnZW1lbnQgU3RhdGUgQ2hhbmdlLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1BTVCwgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFBTVC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9SQU5HSU5HX0NPTVBMRVRFRCwgICAgICAgICAgLyoqPCBSYW5naW5nIENvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9SRUksICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBSRUkuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURUQsIC8qKjwgUlNTSSBNZWFzdXJlbWVudCBDb21wbGV0ZWQuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfU0RJLCAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgU2lnbmFsIERlZ3JhZGVkIG9mIE9OVWkuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfU0ZJLCAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgU2lnbmFsIEZhaWwgb2YgT05VaS4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsICAgICAgICAgLyoqPCBTdGF0IEFsYXJtIENsZWFyZWQuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQsICAgICAgICAgIC8qKjwgU3RhdCBBbGFybSBSYWlzZWQuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfU1VGSSwgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgU1VGaS4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9USVdJLCAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc21pc3Npb24gSW50ZXJmZXJlbmNlIFdhcm5pbmcuICovCisgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfX05VTV9PRiAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2dwb25fb251X2F1dG9faWQ7CisKKy8qKiBMaXN0IG9mIGFsbCBncG9uX29udSBncm91cHMgb2YgdHlwZSBvcGVyLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX29udV9vcGVyX2lkCit7CisgICAgQkNNT0xUX0dQT05fT05VX09QRVJfSURfX0JFR0lOLAorICAgIEJDTU9MVF9HUE9OX09OVV9PUEVSX0lEX0NIQU5HRV9QT1dFUl9MRVZFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQ2hhbmdlIFBvd2VyIExldmVsLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9PUEVSX0lEX1JTU0lfTUVBU1VSRU1FTlQsICAgLyoqPCBSU1NJIE1lYXN1cmVtZW50LiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9PUEVSX0lEX1NFVF9PTlVfU1RBVEUsICAgICAgLyoqPCBTZXQgT05VIFN0YXRlLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9PUEVSX0lEX19OVU1fT0YgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfb3Blcl9pZDsKKworLyoqIExpc3Qgb2YgYWxsIGdwb25fb251IGdyb3VwcyBvZiB0eXBlIHByb3h5LiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ncG9uX29udV9wcm94eV9pZAoreworICAgIEJDTU9MVF9HUE9OX09OVV9QUk9YWV9JRF9fQkVHSU4sCisgICAgQkNNT0xUX0dQT05fT05VX1BST1hZX0lEX0NQVV9QQUNLRVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBHUE9OIENQVSBQYWNrZXRzLiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9QUk9YWV9JRF9QTE9BTV9QQUNLRVQsICAvKio8IFBMT0FNIFBhY2tldC4gKi8KKyAgICBCQ01PTFRfR1BPTl9PTlVfUFJPWFlfSURfX05VTV9PRiAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfcHJveHlfaWQ7CisKKy8qKiBMaXN0IG9mIGFsbCBncG9uX29udSBncm91cHMgb2YgdHlwZSBwcm94eV9yeC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZ3Bvbl9vbnVfcHJveHlfcnhfaWQKK3sKKyAgICBCQ01PTFRfR1BPTl9PTlVfUFJPWFlfUlhfSURfX0JFR0lOLAorICAgIEJDTU9MVF9HUE9OX09OVV9QUk9YWV9SWF9JRF9DUFVfUEFDS0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgR1BPTiBDUFUgcGFja2V0LiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9QUk9YWV9SWF9JRF9PTUNJX1BBQ0tFVCwgICAgLyoqPCBHUE9OIE9NQ0kgcGFja2V0LiAqLworICAgIEJDTU9MVF9HUE9OX09OVV9QUk9YWV9SWF9JRF9fTlVNX09GICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfcHJveHlfcnhfaWQ7CisKKy8qKiBMaXN0IG9mIGFsbCBsb2dfZW50cnkgZ3JvdXBzIG9mIHR5cGUgYXV0by4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfbG9nX2VudHJ5X2F1dG9faWQKK3sKKyAgICBCQ01PTFRfTE9HX0VOVFJZX0FVVE9fSURfX0JFR0lOLAorICAgIEJDTU9MVF9MT0dfRU5UUllfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdCBBbGFybSBDbGVhcmVkLiAqLworICAgIEJDTU9MVF9MT0dfRU5UUllfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgLyoqPCBTdGF0IEFsYXJtIFJhaXNlZC4gKi8KKyAgICBCQ01PTFRfTE9HX0VOVFJZX0FVVE9fSURfX05VTV9PRiAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2lkOworCisvKiogTGlzdCBvZiBhbGwgbG9nZ2VyIGdyb3VwcyBvZiB0eXBlIGF1dG8uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2xvZ2dlcl9hdXRvX2lkCit7CisgICAgQkNNT0xUX0xPR0dFUl9BVVRPX0lEX19CRUdJTiwKKyAgICBCQ01PTFRfTE9HR0VSX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFN0YXQgQWxhcm0gQ2xlYXJlZC4gKi8KKyAgICBCQ01PTFRfTE9HR0VSX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQsICAgIC8qKjwgU3RhdCBBbGFybSBSYWlzZWQuICovCisgICAgQkNNT0xUX0xPR0dFUl9BVVRPX0lEX19OVU1fT0YgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9sb2dnZXJfYXV0b19pZDsKKworLyoqIExpc3Qgb2YgYWxsIGxvZ2dlciBncm91cHMgb2YgdHlwZSBvcGVyLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9sb2dnZXJfb3Blcl9pZAoreworICAgIEJDTU9MVF9MT0dHRVJfT1BFUl9JRF9fQkVHSU4sCisgICAgQkNNT0xUX0xPR0dFUl9PUEVSX0lEX0NMRUFSX0xPRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBjbGVhciBsb2cuICovCisgICAgQkNNT0xUX0xPR0dFUl9PUEVSX0lEX19OVU1fT0YgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF9sb2dnZXJfb3Blcl9pZDsKKworLyoqIExpc3Qgb2YgYWxsIG5uaSBncm91cHMgb2YgdHlwZSBhdXRvLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9ubmlfYXV0b19pZAoreworICAgIEJDTU9MVF9OTklfQVVUT19JRF9fQkVHSU4sCisgICAgQkNNT0xUX05OSV9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBTdGF0IEFsYXJtIENsZWFyZWQuICovCisgICAgQkNNT0xUX05OSV9BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAgIC8qKjwgU3RhdCBBbGFybSBSYWlzZWQuICovCisgICAgQkNNT0xUX05OSV9BVVRPX0lEX1NUQVRVU19DSEFOR0VELCAgICAgIC8qKjwgU3RhdHVzIGNoYW5nZWQuICovCisgICAgQkNNT0xUX05OSV9BVVRPX0lEX19OVU1fT0YgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X25uaV9hdXRvX2lkOworCisvKiogTGlzdCBvZiBhbGwgdHJ4X2NhbGlicmF0aW9uIGdyb3VwcyBvZiB0eXBlIGF1dG8uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2lkCit7CisgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9BVVRPX0lEX19CRUdJTiwKKyAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0FVVE9fSURfQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURUQgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IENhcHR1cmUgd2luZG93IGFuZCBzdGF0aXN0aWMgY29tcGxldGVkLiAqLworICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQVVUT19JRF9fTlVNX09GICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19pZDsKKworLyoqIExpc3Qgb2YgYWxsIHRyeF9jYWxpYnJhdGlvbiBncm91cHMgb2YgdHlwZSBvcGVyLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fb3Blcl9pZAoreworICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fT1BFUl9JRF9fQkVHSU4sCisgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9PUEVSX0lEX1NUQVJUX0NBUFRVUkVfV0lORE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBzdGFydCBjYXB0dXJlIHdpbmRvdy4gKi8KKyAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX09QRVJfSURfU1RPUF9DQVBUVVJFX1dJTkRPVywgLyoqPCBzdG9wIGNhcHR1cmUgd2luZG93LiAqLworICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fT1BFUl9JRF9fTlVNX09GICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fb3Blcl9pZDsKKworLyoqIExpc3Qgb2YgYWxsIHhncG9uX2FsbG9jIGdyb3VwcyBvZiB0eXBlIGF1dG8uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9faWQKK3sKKyAgICBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19JRF9fQkVHSU4sCisgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBDb25maWd1cmF0aW9uIENvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19JRF9HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVELCAgIC8qKjwgR2V0IGFsbG9jIElEIHN0YXRpc3RpY3MgY29tcGxldGVkLiAqLworICAgIEJDTU9MVF9YR1BPTl9BTExPQ19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgICAgICAgICAgLyoqPCBTdGF0IEFsYXJtIENsZWFyZWQuICovCisgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQsICAgICAgICAgICAvKio8IFN0YXQgQWxhcm0gUmFpc2VkLiAqLworICAgIEJDTU9MVF9YR1BPTl9BTExPQ19BVVRPX0lEX19OVU1fT0YgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19pZDsKKworLyoqIExpc3Qgb2YgYWxsIHhncG9uX2FsbG9jIGdyb3VwcyBvZiB0eXBlIG9wZXIuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX2FsbG9jX29wZXJfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fQUxMT0NfT1BFUl9JRF9fQkVHSU4sCisgICAgQkNNT0xUX1hHUE9OX0FMTE9DX09QRVJfSURfR0VUX1NUQVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBHZXQgc3RhdGlzdGljcy4gKi8KKyAgICBCQ01PTFRfWEdQT05fQUxMT0NfT1BFUl9JRF9TRVRfU1RBVEUsICAgLyoqPCBTZXQgc3RhdGUuICovCisgICAgQkNNT0xUX1hHUE9OX0FMTE9DX09QRVJfSURfX05VTV9PRiAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX2FsbG9jX29wZXJfaWQ7CisKKy8qKiBMaXN0IG9mIGFsbCB4Z3Bvbl9nZW1fcG9ydCBncm91cHMgb2YgdHlwZSBhdXRvLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0FVVE9fSURfX0JFR0lOLAorICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgU3RhdCBBbGFybSBDbGVhcmVkLiAqLworICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAgICAvKio8IFN0YXQgQWxhcm0gUmFpc2VkLiAqLworICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9BVVRPX0lEX19OVU1fT0YgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2lkOworCisvKiogTGlzdCBvZiBhbGwgeGdwb25fbmkgZ3JvdXBzIG9mIHR5cGUgYXV0by4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fbmlfYXV0b19pZAoreworICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX19CRUdJTiwKKyAgICBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9BQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IGFjdGl2YXRlIGFsbCBvbnVzIGNvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9DUFVfUEFDS0VUU19GQUlMVVJFLCAgICAgICAgICAgIC8qKjwgQ1BVIFBhY2tldHMgRmFpbHVyZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9ERUFDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRCwgIC8qKjwgZGVhY3RpdmF0ZSBhbGwgb251cyBjb21wbGV0ZWQuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfRElTQUJMRV9BTExfT05VU19DT01QTEVURUQsICAgICAvKio8IGRpc2FibGUgYWxsIG9udXMgY29tcGxldGVkLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX0VOQUJMRV9BTExfT05VU19DT01QTEVURUQsICAgICAgLyoqPCBlbmFibGUgYWxsIG9udXMgY29tcGxldGVkLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX0xPUywgICAgICAgICAgICAgICAgICAgIC8qKjwgTE9TLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX09OVV9ESVNDT1ZFUkVELCAgICAgICAgIC8qKjwgT05VIERpc2NvdmVyZWQuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfT05VX1VQR1JBREVfQ09NUExFVEUsICAgLyoqPCBPTlUgVXBncmFkZSBDb21wbGV0ZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19PTlVTX1JBTkdFRCwgICAgICAgICAgIC8qKjwgUHJvdGVjdGlvbiBTd2l0Y2hpbmcgT05VcyBSYW5nZWQuICovCisgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfU1dJVENIT1ZFUl9DT01QTEVURUQsICAvKio8IFByb3RlY3Rpb24gU3dpdGNoaW5nIFN3aXRjaG92ZXIgQ29tcGxldGVkLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FLCAgICAgICAgLyoqPCBQcm90ZWN0aW9uIFN3aXRjaGluZyBUcmFmZmljIFJlc3VtZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVELCAgICAgICAgICAgICAgICAgIC8qKjwgUm9ndWUgZGV0ZWN0aW9uIGNvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9ST0dVRV9PTlVfU1BFQ0lBTF9NQVBfQ1lDTEVfU1RBUlQsICAgICAgICAgIC8qKjwgUm9ndWUgT05VIHNwZWNpYWwgbWFwIGN5Y2xlIHN0YXJ0LiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1NFUklBTF9OVU1CRVJfQUNRVUlTSVRJT05fQ1lDTEVfU1RBUlQsICAgICAgLyoqPCBTZXJpYWwgTnVtYmVyIEFjcXVpc2l0aW9uIEN5Y2xlIFN0YXJ0LiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVELCAgICAgLyoqPCBTdGFuZGJ5IFBPTiBNb25pdG9yaW5nIEN5Y2xlIENvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsICAgICAvKio8IFN0YXQgQWxhcm0gQ2xlYXJlZC4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgICAgICAvKio8IFN0YXQgQWxhcm0gUmFpc2VkLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQsIC8qKjwgU3RhdGUgQ2hhbmdlIENvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9UT0RfUkVRVUVTVF9DT01QTEVURUQsICAvKio8IFRPRCByZXF1ZXN0IGNvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9fTlVNX09GICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2lkOworCisvKiogTGlzdCBvZiBhbGwgeGdwb25fbmkgZ3JvdXBzIG9mIHR5cGUgb3Blci4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fbmlfb3Blcl9pZAoreworICAgIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX19CRUdJTiwKKyAgICBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9BREpVU1RfVFhfV0FWRUxFTkdUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEFkanVzdCBUeCBXYXZlbGVuZ2guICovCisgICAgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfRElTQUJMRV9TRVJJQUxfTlVNQkVSLCAgICAgICAgICAgICAgICAgIC8qKjwgRGlzYWJsZSBTZXJpYWwgTnVtYmVyLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1JFU0VULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFJlc2V0LiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1JPR1VFX0RFVEVDVElPTl9XSU5ET1csICAgICAgICAgICAgICAgICAvKio8IFJvZ3VlIERldGVjdGlvbiBXaW5kb3cuICovCisgICAgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfUlVOX1NQRUNJQUxfQldfTUFQLCAgICAgICAgICAgICAgICAgICAgIC8qKjwgUnVuIFNwZWNpYWwgQlcgTWFwLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1NFVF9PTlVfU1RBVEUsICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFNldCBPTlUgU3RhdGUuICovCisgICAgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfU0VUX1BPTl9TVEFURSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgU2V0IFBPTiBTdGF0ZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9TSU5HTEVfUkVRVUVTVF9TVEFOREJZX1BPTl9NT05JVE9SSU5HLCAgLyoqPCBTaW5nbGUgcmVxdWVzdCBzdGFuZGJ5IFBPTiBNb25pdG9yaW5nLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1NUQVJUX09OVV9VUEdSQURFLCAgICAgICAgICAgICAgICAgICAgICAvKio8IFN0YXJ0IE9OVSBGaXJtd2FyZSBVcGdyYWRlLiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1RPRF9SRVFVRVNULCAgICAvKio8IFRPRCByZXF1ZXN0LiAqLworICAgIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX19OVU1fT0YgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9vcGVyX2lkOworCisvKiogTGlzdCBvZiBhbGwgeGdwb25fbmkgZ3JvdXBzIG9mIHR5cGUgcHJveHkuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX25pX3Byb3h5X2lkCit7CisgICAgQkNNT0xUX1hHUE9OX05JX1BST1hZX0lEX19CRUdJTiwKKyAgICBCQ01PTFRfWEdQT05fTklfUFJPWFlfSURfQlJPQURDQVNUX1BMT0FNX1BBQ0tFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IEJyb2FkY2FzdCBQTE9BTSBQYWNrZXQuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1BST1hZX0lEX0NQVV9QQUNLRVRTLCAgIC8qKjwgWEdQT04gQ1BVIHBhY2tldHMuICovCisgICAgQkNNT0xUX1hHUE9OX05JX1BST1hZX0lEX19OVU1fT0YgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX25pX3Byb3h5X2lkOworCisvKiogTGlzdCBvZiBhbGwgeGdwb25fb251IGdyb3VwcyBvZiB0eXBlIGF1dG8uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X3hncG9uX29udV9hdXRvX2lkCit7CisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX19CRUdJTiwKKyAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfREZJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAvKio8IFJlY2VpdmUgRHlpbmctR2FzcCBvZiBPTlVpLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9ER0ksICAgICAgICAgICAgICAgICAgICAgICAvKio8IFJlY2VpdmUgRHlpbmctR2FzcCBvZiBPTlVpLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9ET1dJLCAgICAgICAgICAgICAgICAgICAgICAvKio8IERyaWZ0IG9mIFdpbmRvdyBvZiBPTlVpLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9JTlZBTElEX0RCUlVfUkVQT1JULCAgICAgICAvKio8IEludmFsaWQgREJSdSBSZXBvcnQuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX0tFWV9FWENIQU5HRV9DT01QTEVURUQsICAgIC8qKjwgS2V5IEV4Y2hhbmdlIENvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfS0VZX0VYQ0hBTkdFX0NZQ0xFX1NLSVBQRUQsICAgICAgICAvKio8IEtleSBFeGNoYW5nZSBDeWNsZSBTa2lwcGVkLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENILCAgICAgICAgIC8qKjwgS2V5IEV4Y2hhbmdlIEtleSBNaXNtYXRjaC4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfS0VZX0VYQ0hBTkdFX0tFWV9SRVFVRVNUX1RJTUVPVVQsICAvKio8IEtleSBFeGNoYW5nZSBLZXkgUmVxdWVzdCBUaW1lb3V0LiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9MT09DSSwgICAgICAgICAgICAgICAgICAgICAvKio8IExPT0NpLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9PTlVfQUNUSVZBVElPTl9DT01QTEVURUQsICAvKio8IE9OVSBBY3RpdmF0aW9uIENvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT05VX0FMQVJNLCAgICAgICAgICAgICAgICAgLyoqPCBPTlUgQWxhcm0uICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVELCAgICAvKio8IE9OVSBEZWFjdGl2YXRpb24gQ29tcGxldGVkLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9PTlVfRElTQUJMRV9DT01QTEVURUQsICAgICAgICAgLyoqPCBPTlUgRGlzYWJsZSBDb21wbGV0ZWQuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09OVV9FTkFCTEVfQ09NUExFVEVELCAgICAgICAgICAvKio8IE9OVSBFbmFibGUgQ29tcGxldGVkLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9PTlVfVFVOSU5HX0lOX0NPTVBMRVRFRCwgICAgICAgLyoqPCBPTlUgVHVuaW5nIGluIGNvbXBsZXRlZC4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT05VX1RVTklOR19PVVRfQ09NUExFVEVELCAgICAgIC8qKjwgT05VIFR1bmluZyBvdXQgY29tcGxldGVkLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9PUFRJQ0FMX1JFRkxFQ1RJT04sICAgICAgICAgICAgLyoqPCBPcHRpY2FsIFJlZmxlY3Rpb24uICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1BPU1NJQkxFX0RSSUZULCAgICAgICAgICAgICAgICAvKio8IFBvc3NpYmxlIERyaWZ0LiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9QT1dFUl9DT05TVU1QVElPTl9SRVBPUlQsICAgICAgLyoqPCBQb3dlciBjb25zdW1wdGlvbiByZXBvcnQuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1BPV0VSX0xFVkVMX1JFUE9SVCwgICAgICAgICAgICAvKio8IFBvd2VyIGxldmVsIHJlcG9ydC4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0UsIC8qKjwgUG93ZXIgTWFuYWdlbWVudCBTdGF0ZSBDaGFuZ2UuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1BRU0ksICAgICAgICAgICAgICAvKio8IHBsb2FtIHF1ZXVlIHN0YXR1cy4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfUkFOR0lOR19DT01QTEVURUQsIC8qKjwgUmFuZ2luZyBDb21wbGV0ZWQuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1JFR0lTVFJBVElPTl9JRCwgICAvKio8IFJlZ2lzdHJhdGlvbiBJRC4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURUQsICAgIC8qKjwgUlNTSSBNZWFzdXJlbWVudCBDb21wbGV0ZWQuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1NESSwgICAvKio8IFNpZ25hbCBEZWdyYWRlZCBvZiBPTlVpLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0ZBSUxVUkUsICAvKio8IHNlY3VyZSBtdXR1YWwgYXV0aGVudGljYXRpb24gZmFpbHVyZS4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfU0ZJLCAgICAgICAgICAgICAgICAgICAvKio8IFNpZ25hbCBGYWlsIG9mIE9OVWkuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgICAgLyoqPCBTdGF0IEFsYXJtIENsZWFyZWQuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAgICAgLyoqPCBTdGF0IEFsYXJtIFJhaXNlZC4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfU1VGSSwgICAgICAgICAgICAgICAgICAvKio8IFNVRmkuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1RJV0ksICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc21pc3Npb24gSW50ZXJmZXJlbmNlIFdhcm5pbmcuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1RVTklOR19SRVNQT05TRSwgICAgICAgLyoqPCBUdW5pbmcgcmVzcG9uc2UuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX19OVU1fT0YgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZW51bSBlbnRyaWVzLCBub3QgYW4gZW50cnkgaXRzZWxmLiAqLworfSBiY21vbHRfeGdwb25fb251X2F1dG9faWQ7CisKKy8qKiBMaXN0IG9mIGFsbCB4Z3Bvbl9vbnUgZ3JvdXBzIG9mIHR5cGUgb3Blci4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fb251X29wZXJfaWQKK3sKKyAgICBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfX0JFR0lOLAorICAgIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9BREpVU1RfVFhfV0FWRUxFTkdUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgIC8qKjwgQWRqdXN0IFR4IHdhdmVsZW5ndGguICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX0NIQU5HRV9QT1dFUl9MRVZFTExJTkcsICAgICAgICAvKio8IENoYW5nZSBwb3dlciBsZXZlbGxpbmcuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX0dFVF9QT1dFUl9DT05TVU1QVElPTiwgICAgICAgICAvKio8IEdldCBwb3dlciBjb25zdW1wdGlvbi4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfR0VUX1BPV0VSX0xFVkVMLCAgICAgICAgICAgICAgIC8qKjwgR2V0IHBvd2VyIGxldmVsLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9PTlVfVFVOSU5HX0lOLCAgICAgICAgICAgICAgICAgLyoqPCBPTlUgVHVuaW5nIGluLiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9PTlVfVFVOSU5HX09VVCwgICAgICAgICAgICAgICAgLyoqPCBPTlUgVHVuaW5nIG91dC4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfUkVRVUVTVF9SRUdJU1RSQVRJT04sICAgICAgICAgIC8qKjwgUmVxdWVzdCByZWdpc3RyYXRpb24uICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX1JTU0lfTUVBU1VSRU1FTlQsICAgICAgICAgICAgICAvKio8IFJTU0kgTWVhc3VyZW1lbnQuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT04sICAvKio8IFNlY3VyZSBtdXR1YWwgYXV0aGVudGljYXRpb24uICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX1NFVF9PTlVfU1RBVEUsICAgICAgICAgICAgICAgICAvKio8IFNldCBPTlUgU3RhdGUuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX19OVU1fT0YgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbnVtIGVudHJpZXMsIG5vdCBhbiBlbnRyeSBpdHNlbGYuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfb3Blcl9pZDsKKworLyoqIExpc3Qgb2YgYWxsIHhncG9uX29udSBncm91cHMgb2YgdHlwZSBwcm94eS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fb251X3Byb3h5X2lkCit7CisgICAgQkNNT0xUX1hHUE9OX09OVV9QUk9YWV9JRF9fQkVHSU4sCisgICAgQkNNT0xUX1hHUE9OX09OVV9QUk9YWV9JRF9DUFVfUEFDS0VUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBYR1BPTiBDUFUgcGFja2V0cy4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX1BST1hZX0lEX1BMT0FNX1BBQ0tFVCwgLyoqPCBQTE9BTSBQYWNrZXQuICovCisgICAgQkNNT0xUX1hHUE9OX09OVV9QUk9YWV9JRF9fTlVNX09GICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX29udV9wcm94eV9pZDsKKworLyoqIExpc3Qgb2YgYWxsIHhncG9uX29udSBncm91cHMgb2YgdHlwZSBwcm94eV9yeC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfeGdwb25fb251X3Byb3h5X3J4X2lkCit7CisgICAgQkNNT0xUX1hHUE9OX09OVV9QUk9YWV9SWF9JRF9fQkVHSU4sCisgICAgQkNNT0xUX1hHUE9OX09OVV9QUk9YWV9SWF9JRF9DUFVfUEFDS0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgLyoqPCBYR1BPTiBDUFUgcGFja2V0LiAqLworICAgIEJDTU9MVF9YR1BPTl9PTlVfUFJPWFlfUlhfSURfT01DSV9QQUNLRVQsICAgLyoqPCBYR1BPTiBPTUNJIHBhY2tldC4gKi8KKyAgICBCQ01PTFRfWEdQT05fT05VX1BST1hZX1JYX0lEX19OVU1fT0YgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVudW0gZW50cmllcywgbm90IGFuIGVudHJ5IGl0c2VsZi4gKi8KK30gYmNtb2x0X3hncG9uX29udV9wcm94eV9yeF9pZDsKKworI2RlZmluZSBiY21vbHRfYWVfbmlfa2V5X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfTklfS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2FlX25pX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX05JX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9OSV9TRVRfQUVfTklfRU5fU1RBVEVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfYWVfcGF0aF9kc19rZXlfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9EU19LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX0RTX0FVVE9fQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfdXNfa2V5X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfVVNfS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9BTEFSTV9SQUlTRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9VU19BVVRPX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9jaGFubmVsX2tleV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9DSEFOTkVMX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9jaGFubmVsX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9DSEFOTkVMX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZWJ1Z19rZXlfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERUJVR19LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGVidWdfY2xpX2lucHV0X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVCVUdfQ0xJX0lOUFVUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFQlVHX0NMSV9PVVRQVVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGVidWdfY2ZnX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVCVUdfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2RlYnVnX2ZpbGVfYWxtb3N0X2Z1bGxfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFQlVHX0ZJTEVfQUxNT1NUX0ZVTExfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGVidWdfc3RhcnRfYXBpX2NhcHR1cmVfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVCVUdfU1RBUlRfQVBJX0NBUFRVUkVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGVidWdfc3RvcF9hcGlfY2FwdHVyZV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVCVUdfU1RPUF9BUElfQ0FQVFVSRV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZWJ1Z19yZXNldF9hcGlfY2FwdHVyZV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERUJVR19SRVNFVF9BUElfQ0FQVFVSRV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERUJVR19BVVRPX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfY2ZnX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9rZXlfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGV2aWNlX2Nvbm5lY3RfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0NPTk5FQ1RfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGV2aWNlX2Rpc2Nvbm5lY3RfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0RJU0NPTk5FQ1RfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGV2aWNlX3Jlc2V0X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX1JFU0VUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9IT1NUX0tFRVBfQUxJVkVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGV2aWNlX3N3X3VwZ3JhZGVfYWN0aXZhdGVfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX1NXX1VQR1JBREVfQUNUSVZBVEVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0RFVklDRV9SRUFEWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9lc3RhYmxpc2hlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQ09OTkVDVElPTl9FU1RBQkxJU0hFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfREVWSUNFX0tFRVBfQUxJVkVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0NPTk5FQ1RJT05fRkFJTFVSRV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQ09OTkVDVElPTl9DT01QTEVURV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfZGlzY29ubmVjdGlvbl9jb21wbGV0ZV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfRElTQ09OTkVDVElPTl9DT01QTEVURV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfU1dfRVJST1JfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX1NXX0VYQ0VQVElPTl9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfSU5ESUNBVElPTlNfRFJPUFBFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfU1RBUlRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX0RBVEFfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX0NPTVBMRVRFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9SVU5fRERSX1RFU1RfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0REUl9URVNUX0NPTVBMRVRFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9hdXRvX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb25faWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1VOS05PV05fTElOS19WSU9MQVRJT05fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19PVkVSSEVBRF9QUk9GSUxFX1ZJT0xBVElPTl9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25faWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0xBU0VSX09OX09GRl9WSU9MQVRJT05fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25faWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19NQVhfTElOS19WSU9MQVRJT05fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19MTElEX1BPT0xfRU1QVFlfVklPTEFUSU9OX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfU1lTVEVNX1JFU09VUkNFX1ZJT0xBVElPTl9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1JBTkdFX1ZJT0xBVElPTl9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1RETV9DSEFOTkVMU19FWEhBVVNURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25faWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19ST0dVRV9WSU9MQVRJT05fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19VUFNUUkVBTV9CQU5EV0lEVEhfVklPTEFUSU9OX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2tleV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19mb3JjZV9yZWRpc2NvdmVyeV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19GT1JDRV9SRURJU0NPVkVSWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfZGVsZXRlX2xpbmtfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfREVMRVRFX0xJTktfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0tFWV9FWENIQU5HRV9GQUlMVVJFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19lbmNyeXB0aW9uX2VuYWJsZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19FTkNSWVBUSU9OX0VOQUJMRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX21wY3BfcmVnX2Fja190aW1lb3V0X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX01QQ1BfUkVHX0FDS19USU1FT1VUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19SQU5HRV9WQUxVRV9DSEFOR0VEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19QUk9URUNUSU9OX1NXSVRDSF9PQ0NVUlJFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfRFVQTElDQVRFX01QQ1BfUkVHSVNUUkFUSU9OX1JFUVVFU1RfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0xJTktfU1BFRURfTUlTTUFUQ0hfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX01QQ1BfUkVQT1JUX1RJTUVPVVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX09BTV9LRUVQQUxJVkVfVElNRU9VVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfTVBDUF9ESVNDT1ZFUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19tcGNwX2RlcmVnaXN0ZXJlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19NUENQX0RFUkVHSVNURVJFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfUFJFUFJPVklTSU9ORURfTElOS19DUkVBVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19PQU1fS0VFUEFMSVZFX1RJTUVSX1NUQVJUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19PQU1fS0VFUEFMSVZFX1RJTUVSX1NUT1BfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0tFWV9FWENIQU5HRV9TVEFSVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfS0VZX0VYQ0hBTkdFX1NUT1BfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX09BTV9LRUVQQUxJVkVfVElNRVJfU1RBUlRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfT0FNX0tFRVBBTElWRV9USU1FUl9TVE9QUEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19LRVlfRVhDSEFOR0VfU1RBUlRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BwZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfS0VZX0VYQ0hBTkdFX1NUT1BQRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25faWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRJQ19SRUdJU1RSQVRJT05fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZG9uZV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRJQ19SRUdJU1RSQVRJT05fRE9ORV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfcmVyYW5nZV9mYWlsdXJlX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfUkVSQU5HRV9GQUlMVVJFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19JTkpFQ1RfRlJBTUVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0ZSQU1FX0NBUFRVUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19saW5rX2RlbGV0ZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19MSU5LX0RFTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0FMQVJNX1JBSVNFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2tleV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX1NFVF9FUE9OX05JX0VOX1NUQVRFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfSVNTVUVfUlNTSV9HUkFOVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2FkZF9saW5rX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0FERF9MSU5LX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfQUREX01VTFRJQ0FTVF9MSU5LX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfQUREX1BST1RFQ1RFRF9TVEFOREJZX0xJTktfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9OT19SRVBPUlRTX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfTExJRF9RVUFSQU5USU5FRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19BUFBMWV9SRVJBTkdFX0RFTFRBX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfcmVyYW5nZV9mYWlsdXJlX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfUkVSQU5HRV9GQUlMVVJFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW5faWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9ST0dVRV9MTElEX1NDQU5fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9TVEFSVF9PTlVfVVBHUkFERV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfUk9HVUVfU0NBTl9DT01QTEVURV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX21wY3BfdGltZXN0YW1wX2NoYW5nZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX01QQ1BfVElNRVNUQU1QX0NIQU5HRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9BVVRPX1JPR1VFX1NDQU5fMUdfRkFJTFVSRV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2F1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0FVVE9fUk9HVUVfU0NBTl8xMEdfRkFJTFVSRV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXlfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzEwR19VU19LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0FVVE9fQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzFHX1VTX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzFHX1VTX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQVVUT19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXlfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0FVVE9fQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9BTEFSTV9SQUlTRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19BVVRPX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19BVVRPX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19BVVRPX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX3JwX2tleV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1JQX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX3JwX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1JQX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncGlvX2tleV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUElPX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncGlvX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUElPX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2FsbG9jX2tleV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0FMTE9DX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0FMTE9DX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0FMTE9DX1NUQVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9BTExPQ19DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0FMTE9DX1NFVF9TVEFURV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0c19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0FMTE9DX0dFVF9TVEFUU19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0FMTE9DX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXlfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGVfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TRVRfU1RBVEVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2Zfa2V5X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX0ZMVVNIX01BQ19UQUJMRV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9TQ0FOX01BQ19UQUJMRV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfY29tcGxldGVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9GTFVTSF9NQUNfVEFCTEVfQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX1NDQU5fTUFDX1RBQkxFX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0FMQVJNX1JBSVNFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfQVVUT19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1dfS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9ORVdfTUFDX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfYWdlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9NQUNfQUdFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfTUFDX01PVkVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX01BQ19EUk9QUEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2tleV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3N0YXRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9TRVRfUE9OX1NUQVRFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfcmVzZXRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfUkVTRVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9ESVNBQkxFX1NFUklBTF9OVU1CRVJfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9TSU5HTEVfUkVRVUVTVF9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfU0VUX09OVV9TVEFURV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9sb3NfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9MT1NfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9TRVJJQUxfTlVNQkVSX0FDUVVJU0lUSU9OX0NZQ0xFX1NUQVJUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19PTlVTX1JBTkdFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0ZBSUxVUkVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0JST0FEQ0FTVF9QTE9BTV9QQUNLRVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0RFQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfRElTQUJMRV9BTExfT05VU19DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9BQ1RJVkFURV9BTExfT05VU19DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9FTkFCTEVfQUxMX09OVVNfQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfVE9EX1JFUVVFU1RfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9pZF9hbGxfcHJvcGVydGllcyBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UWVBFX0NfU0VUX01VTFRJUExFX09OVV9TVEFURV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NUQVJUX09OVV9VUEdSQURFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9ST0dVRV9PTlVfU1BFQ0lBTF9NQVBfQ1lDTEVfU1RBUlRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9zdGF0X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1NFVF9PTlVfU1RBVEVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfUlNTSV9NRUFTVVJFTUVOVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9DSEFOR0VfUE9XRVJfTEVWRUxfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfT05VX0FMQVJNX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2Rvd2lfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0RPV0lfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfc2ZpX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfU0ZJX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X3NkaV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1NESV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9kZmlfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9ERklfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfc3VmaV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfU1VGSV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9sb2FpX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9MT0FJX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2RnaV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0RHSV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9wZWVfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9QRUVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfcHN0X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfUFNUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X3Rpd2lfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1RJV0lfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfbG9raV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfTE9LSV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9tZW1pX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9NRU1JX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX09NQ0lfUE9SVF9JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9CRVJfSU5URVJWQUxfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfZXJyX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfRVJSX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X3JlaV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1JFSV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX09OVV9FTkFCTEVfQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX09OVV9ESVNBQkxFX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9JTlZBTElEX0RCUlVfUkVQT1JUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9SRVFVRVNUX1RJTUVPVVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0NZQ0xFX1NLSVBQRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfVU5DT05TRUNVVElWRV9JTkRFWF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfREVDUllQVF9SRVFVSVJFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb25faWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9PUFRJQ0FMX1JFRkxFQ1RJT05fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfUExPQU1fUEFDS0VUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfT05VX0FDVElWQVRJT05fU1RBTkRCWV9DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0VfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfUE9TU0lCTEVfRFJJRlRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9BTEFSTV9SQUlTRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fdHJ4X2tleV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fVFJYX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX3RyeF9jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfbG9nX2VudHJ5X2tleV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9sb2dfZW50cnlfY2ZnX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9MT0dfRU5UUllfU1RBVF9BTEFSTV9SQUlTRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9MT0dfRU5UUllfQVVUT19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfbG9nZ2VyX2tleV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTE9HR0VSX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9sb2dnZXJfY2ZnX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2xvZ2dlcl9zdGF0X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR0dFUl9TVEFUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2xvZ2dlcl9jbGVhcl9sb2dfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR0dFUl9DTEVBUl9MT0dfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTE9HR0VSX1NUQVRfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR0dFUl9TVEFUX0FMQVJNX1JBSVNFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9MT0dHRVJfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR0dFUl9BVVRPX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ubmlfa2V5X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X25uaV9jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRVU19DSEFOR0VEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9BTEFSTV9SQUlTRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ubmlfYXV0b19jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfQVVUT19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfbm5pX3NlcmRlc19rZXlfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NFUkRFU19LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfbm5pX3NlcmRlc19jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfU09GVFdBUkVfRVJST1JfS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUT1BfQ0FQVFVSRV9XSU5ET1dfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0FVVE9fQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2FsbG9jX2tleV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9hbGxvY19jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX1NUQVRTX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fQUxMT0NfU0VUX1NUQVRFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0FMTE9DX1NUQVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9BTEFSTV9SQUlTRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0FMQVJNX1JBSVNFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25faXdmX2tleV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fSVdGX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9JV0ZfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2tleV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfc3RhdF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TRVRfUE9OX1NUQVRFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3Jlc2V0X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1JFU0VUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TSU5HTEVfUkVRVUVTVF9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1NFVF9PTlVfU1RBVEVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfUlVOX1NQRUNJQUxfQldfTUFQX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9sb3NfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9MT1NfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfU0VSSUFMX05VTUJFUl9BQ1FVSVNJVElPTl9DWUNMRV9TVEFSVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19PTlVTX1JBTkdFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19GQUlMVVJFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0JST0FEQ0FTVF9QTE9BTV9QQUNLRVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9ERUFDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9ESVNBQkxFX0FMTF9PTlVTX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9BQ1RJVkFURV9BTExfT05VU19DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfRU5BQkxFX0FMTF9PTlVTX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfVE9EX1JFUVVFU1RfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfU1RBUlRfT05VX1VQR1JBREVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfUk9HVUVfT05VX1NQRUNJQUxfTUFQX0NZQ0xFX1NUQVJUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0FESlVTVF9UWF9XQVZFTEVOR1RIX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3N0YXRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGVfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1NFVF9PTlVfU1RBVEVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X29udV9hbGFybV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX09OVV9BTEFSTV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfRE9XSV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfU0ZJX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9zZGlfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9TRElfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2RmaV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0RGSV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfUFFTSV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfc3VmaV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfU1VGSV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfVElXSV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfTE9PQ0lfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfRU5BQkxFX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfT05VX0RJU0FCTEVfQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfSU5WQUxJRF9EQlJVX1JFUE9SVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9SRVFVRVNUX1RJTUVPVVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0tFWV9FWENIQU5HRV9DWUNMRV9TS0lQUEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENIX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb25faWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9PUFRJQ0FMX1JFRkxFQ1RJT05fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1BMT0FNX1BBQ0tFVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX09NQ0lfUEFDS0VUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9kZ2lfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9ER0lfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9QT1NTSUJMRV9EUklGVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25faWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfUkVRVUVTVF9SRUdJU1RSQVRJT05fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0NIQU5HRV9QT1dFUl9MRVZFTExJTkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2dldF9wb3dlcl9sZXZlbF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0dFVF9QT1dFUl9MRVZFTF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2NvbnN1bXB0aW9uX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfR0VUX1BPV0VSX0NPTlNVTVBUSU9OX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9BREpVU1RfVFhfV0FWRUxFTkdUSF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfUkVHSVNUUkFUSU9OX0lEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9MRVZFTF9SRVBPUlRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1BPV0VSX0NPTlNVTVBUSU9OX1JFUE9SVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9GQUlMVVJFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX0lOX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX0lOX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfVFVOSU5HX1JFU1BPTlNFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9BTEFSTV9SQUlTRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fdHJ4X2tleV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fVFJYX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2lkX2FsbF9wcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hwb25fc2VyZGVzX2tleV9pZF9hbGxfcHJvcGVydGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hQT05fU0VSREVTX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94cG9uX3NlcmRlc19jZmdfaWRfYWxsX3Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfX05VTV9PRgorCisvKiBUaGUgZm9sbG93aW5nIGFyZSByZXF1aXJlZCBmb3IgdGhlIEFQSSBJbml0L1NldC9ldGMgbWFjcm9zICovCisjZGVmaW5lIGJjbW9sdF9vYmpfaWRfX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfT0JKX0lEX19CRUdJTgorI2RlZmluZSBiY21vbHRfb2JqX2lkX2FlX25pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX09CSl9JRF9BRV9OSQorI2RlZmluZSBiY21vbHRfb2JqX2lkX2FlX3BhdGhfZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX09CSl9JRF9BRV9QQVRIX0RTCisjZGVmaW5lIGJjbW9sdF9vYmpfaWRfYWVfcGF0aF91cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfT0JKX0lEX0FFX1BBVEhfVVMKKyNkZWZpbmUgYmNtb2x0X29ial9pZF9jaGFubmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9PQkpfSURfQ0hBTk5FTAorI2RlZmluZSBiY21vbHRfb2JqX2lkX2RlYnVnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX09CSl9JRF9ERUJVRworI2RlZmluZSBiY21vbHRfb2JqX2lkX2RldmljZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX09CSl9JRF9ERVZJQ0UKKyNkZWZpbmUgYmNtb2x0X29ial9pZF9lcG9uX2RlbmllZF9saW5rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9PQkpfSURfRVBPTl9ERU5JRURfTElOSworI2RlZmluZSBiY21vbHRfb2JqX2lkX2Vwb25fbGluayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX09CSl9JRF9FUE9OX0xJTksKKyNkZWZpbmUgYmNtb2x0X29ial9pZF9lcG9uX25pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9PQkpfSURfRVBPTl9OSQorI2RlZmluZSBiY21vbHRfb2JqX2lkX2Vwb25fb251XzEwZ191cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xMEdfVVMKKyNkZWZpbmUgYmNtb2x0X29ial9pZF9lcG9uX29udV8xZ191cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMUdfVVMKKyNkZWZpbmUgYmNtb2x0X29ial9pZF9lcG9uX3BhdGhfMTBnX2RzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19EUworI2RlZmluZSBiY21vbHRfb2JqX2lkX2Vwb25fcGF0aF8xMGdfdXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX1VTCisjZGVmaW5lIGJjbW9sdF9vYmpfaWRfZXBvbl9wYXRoXzFnX2RzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19EUworI2RlZmluZSBiY21vbHRfb2JqX2lkX2Vwb25fcGF0aF8xZ191cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfVVMKKyNkZWZpbmUgYmNtb2x0X29ial9pZF9lcG9uX3JwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9PQkpfSURfRVBPTl9SUAorI2RlZmluZSBiY21vbHRfb2JqX2lkX2dwaW8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX09CSl9JRF9HUElPCisjZGVmaW5lIGJjbW9sdF9vYmpfaWRfZ3Bvbl9hbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0MKKyNkZWZpbmUgYmNtb2x0X29ial9pZF9ncG9uX2dlbV9wb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVAorI2RlZmluZSBiY21vbHRfb2JqX2lkX2dwb25faXdmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX09CSl9JRF9HUE9OX0lXRgorI2RlZmluZSBiY21vbHRfb2JqX2lkX2dwb25faXdmX2RzX2VncmVzc19mbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPVworI2RlZmluZSBiY21vbHRfb2JqX2lkX2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1cKKyNkZWZpbmUgYmNtb2x0X29ial9pZF9ncG9uX2l3Zl9tYWNfdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfTUFDX1RBQkxFCisjZGVmaW5lIGJjbW9sdF9vYmpfaWRfZ3Bvbl9pd2ZfdXNfZmxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfT0JKX0lEX0dQT05fSVdGX1VTX0ZMT1cKKyNkZWZpbmUgYmNtb2x0X29ial9pZF9ncG9uX25pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9PQkpfSURfR1BPTl9OSQorI2RlZmluZSBiY21vbHRfb2JqX2lkX2dwb25fb251ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX09CSl9JRF9HUE9OX09OVQorI2RlZmluZSBiY21vbHRfb2JqX2lkX2dwb25fdHJ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX09CSl9JRF9HUE9OX1RSWAorI2RlZmluZSBiY21vbHRfb2JqX2lkX2xvZ19lbnRyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX09CSl9JRF9MT0dfRU5UUlkKKyNkZWZpbmUgYmNtb2x0X29ial9pZF9sb2dnZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9PQkpfSURfTE9HR0VSCisjZGVmaW5lIGJjbW9sdF9vYmpfaWRfbm5pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfT0JKX0lEX05OSQorI2RlZmluZSBiY21vbHRfb2JqX2lkX25uaV9zZXJkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX09CSl9JRF9OTklfU0VSREVTCisjZGVmaW5lIGJjbW9sdF9vYmpfaWRfc29mdHdhcmVfZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfT0JKX0lEX1NPRlRXQVJFX0VSUk9SCisjZGVmaW5lIGJjbW9sdF9vYmpfaWRfdHJ4X2NhbGlicmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfT0JKX0lEX1RSWF9DQUxJQlJBVElPTgorI2RlZmluZSBiY21vbHRfb2JqX2lkX3hncG9uX2FsbG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQworI2RlZmluZSBiY21vbHRfb2JqX2lkX3hncG9uX2dlbV9wb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX09CSl9JRF9YR1BPTl9HRU1fUE9SVAorI2RlZmluZSBiY21vbHRfb2JqX2lkX3hncG9uX2l3ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX09CSl9JRF9YR1BPTl9JV0YKKyNkZWZpbmUgYmNtb2x0X29ial9pZF94Z3Bvbl9uaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9PQkpfSURfWEdQT05fTkkKKyNkZWZpbmUgYmNtb2x0X29ial9pZF94Z3Bvbl9vbnUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9PQkpfSURfWEdQT05fT05VCisjZGVmaW5lIGJjbW9sdF9vYmpfaWRfeGdwb25fdHJ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWAorI2RlZmluZSBiY21vbHRfb2JqX2lkX3hwb25fc2VyZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUworI2RlZmluZSBiY21vbHRfb2JqX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX09CSl9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9hZV9uaV9vcGVyX2lkX19iZWdpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfTklfT1BFUl9JRF9fQkVHSU4KKyNkZWZpbmUgYmNtb2x0X2FlX25pX29wZXJfaWRfc2V0X2FlX25pX2VuX3N0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9OSV9PUEVSX0lEX1NFVF9BRV9OSV9FTl9TVEFURQorI2RlZmluZSBiY21vbHRfYWVfbmlfb3Blcl9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX05JX09QRVJfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfYWVfcGF0aF9kc19hdXRvX2lkX19iZWdpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfRFNfQVVUT19JRF9fQkVHSU4KKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19pZF9zdGF0X2FsYXJtX2NsZWFyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX0RTX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVECisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9faWRfc3RhdF9hbGFybV9yYWlzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9EU19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VECisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9faWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9EU19BVVRPX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19pZF9fYmVnaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX1VTX0FVVE9fSURfX0JFR0lOCisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9faWRfc3RhdF9hbGFybV9jbGVhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9VU19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRAorI2RlZmluZSBiY21vbHRfYWVfcGF0aF91c19hdXRvX2lkX3N0YXRfYWxhcm1fcmFpc2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfVVNfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRAorI2RlZmluZSBiY21vbHRfYWVfcGF0aF91c19hdXRvX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfVVNfQVVUT19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZWJ1Z19hdXRvX2lkX19iZWdpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVCVUdfQVVUT19JRF9fQkVHSU4KKyNkZWZpbmUgYmNtb2x0X2RlYnVnX2F1dG9faWRfY2xpX291dHB1dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERUJVR19BVVRPX0lEX0NMSV9PVVRQVVQKKyNkZWZpbmUgYmNtb2x0X2RlYnVnX2F1dG9faWRfZmlsZV9hbG1vc3RfZnVsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERUJVR19BVVRPX0lEX0ZJTEVfQUxNT1NUX0ZVTEwKKyNkZWZpbmUgYmNtb2x0X2RlYnVnX2F1dG9faWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERUJVR19BVVRPX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2RlYnVnX29wZXJfaWRfX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERUJVR19PUEVSX0lEX19CRUdJTgorI2RlZmluZSBiY21vbHRfZGVidWdfb3Blcl9pZF9jbGlfaW5wdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFQlVHX09QRVJfSURfQ0xJX0lOUFVUCisjZGVmaW5lIGJjbW9sdF9kZWJ1Z19vcGVyX2lkX3Jlc2V0X2FwaV9jYXB0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVCVUdfT1BFUl9JRF9SRVNFVF9BUElfQ0FQVFVSRQorI2RlZmluZSBiY21vbHRfZGVidWdfb3Blcl9pZF9zdGFydF9hcGlfY2FwdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFQlVHX09QRVJfSURfU1RBUlRfQVBJX0NBUFRVUkUKKyNkZWZpbmUgYmNtb2x0X2RlYnVnX29wZXJfaWRfc3RvcF9hcGlfY2FwdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERUJVR19PUEVSX0lEX1NUT1BfQVBJX0NBUFRVUkUKKyNkZWZpbmUgYmNtb2x0X2RlYnVnX29wZXJfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERUJVR19PUEVSX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9hdXRvX2lkX19iZWdpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9fQkVHSU4KKyNkZWZpbmUgYmNtb2x0X2RldmljZV9hdXRvX2lkX2Nvbm5lY3Rpb25fY29tcGxldGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9DT05ORUNUSU9OX0NPTVBMRVRFCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfYXV0b19pZF9jb25uZWN0aW9uX2VzdGFibGlzaGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0FVVE9fSURfQ09OTkVDVElPTl9FU1RBQkxJU0hFRAorI2RlZmluZSBiY21vbHRfZGV2aWNlX2F1dG9faWRfY29ubmVjdGlvbl9mYWlsdXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9BVVRPX0lEX0NPTk5FQ1RJT05fRkFJTFVSRQorI2RlZmluZSBiY21vbHRfZGV2aWNlX2F1dG9faWRfZGRyX3Rlc3RfY29tcGxldGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9BVVRPX0lEX0REUl9URVNUX0NPTVBMRVRFCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfYXV0b19pZF9kZXZpY2Vfa2VlcF9hbGl2ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0FVVE9fSURfREVWSUNFX0tFRVBfQUxJVkUKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9hdXRvX2lkX2RldmljZV9yZWFkeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9ERVZJQ0VfUkVBRFkKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9hdXRvX2lkX2Rpc2Nvbm5lY3Rpb25fY29tcGxldGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9ESVNDT05ORUNUSU9OX0NPTVBMRVRFCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfYXV0b19pZF9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0FVVE9fSURfSU1BR0VfVFJBTlNGRVJfQ09NUExFVEUKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9hdXRvX2lkX2luZGljYXRpb25zX2Ryb3BwZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9JTkRJQ0FUSU9OU19EUk9QUEVECisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfYXV0b19pZF9zd19lcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0FVVE9fSURfU1dfRVJST1IKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9hdXRvX2lkX3N3X2V4Y2VwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9TV19FWENFUFRJT04KKyNkZWZpbmUgYmNtb2x0X2RldmljZV9hdXRvX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZXZpY2Vfb3Blcl9pZF9fYmVnaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX09QRVJfSURfX0JFR0lOCisjZGVmaW5lIGJjbW9sdF9kZXZpY2Vfb3Blcl9pZF9jb25uZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX09QRVJfSURfQ09OTkVDVAorI2RlZmluZSBiY21vbHRfZGV2aWNlX29wZXJfaWRfZGlzY29ubmVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9PUEVSX0lEX0RJU0NPTk5FQ1QKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9vcGVyX2lkX2hvc3Rfa2VlcF9hbGl2ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9IT1NUX0tFRVBfQUxJVkUKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9vcGVyX2lkX2ltYWdlX3RyYW5zZmVyX2RhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9JTUFHRV9UUkFOU0ZFUl9EQVRBCisjZGVmaW5lIGJjbW9sdF9kZXZpY2Vfb3Blcl9pZF9pbWFnZV90cmFuc2Zlcl9zdGFydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX09QRVJfSURfSU1BR0VfVFJBTlNGRVJfU1RBUlQKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9vcGVyX2lkX3Jlc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9SRVNFVAorI2RlZmluZSBiY21vbHRfZGV2aWNlX29wZXJfaWRfcnVuX2Rkcl90ZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9PUEVSX0lEX1JVTl9ERFJfVEVTVAorI2RlZmluZSBiY21vbHRfZGV2aWNlX29wZXJfaWRfc3dfdXBncmFkZV9hY3RpdmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9PUEVSX0lEX1NXX1VQR1JBREVfQUNUSVZBVEUKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9vcGVyX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9faWRfX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX19CRUdJTgorI2RlZmluZSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2lkX2xhc2VyX29uX29mZl92aW9sYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19JRF9MQVNFUl9PTl9PRkZfVklPTEFUSU9OCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9faWRfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX0xMSURfUE9PTF9FTVBUWV9WSU9MQVRJT04KKyNkZWZpbmUgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19pZF9tYXhfbGlua192aW9sYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fSURfTUFYX0xJTktfVklPTEFUSU9OCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9faWRfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX09WRVJIRUFEX1BST0ZJTEVfVklPTEFUSU9OCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9faWRfcmFuZ2VfdmlvbGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX1JBTkdFX1ZJT0xBVElPTgorI2RlZmluZSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2lkX3JvZ3VlX3Zpb2xhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19JRF9ST0dVRV9WSU9MQVRJT04KKyNkZWZpbmUgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19pZF9zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fSURfU1lTVEVNX1JFU09VUkNFX1ZJT0xBVElPTgorI2RlZmluZSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2lkX3RkbV9jaGFubmVsc19leGhhdXN0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19JRF9URE1fQ0hBTk5FTFNfRVhIQVVTVEVECisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9faWRfdW5rbm93bl9saW5rX3Zpb2xhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX1VOS05PV05fTElOS19WSU9MQVRJT04KKyNkZWZpbmUgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19pZF91cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fSURfVVBTVFJFQU1fQkFORFdJRFRIX1ZJT0xBVElPTgorI2RlZmluZSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfYXV0b19pZF9fYmVnaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfX0JFR0lOCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfYXV0b19pZF9kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfRFVQTElDQVRFX01QQ1BfUkVHSVNUUkFUSU9OX1JFUVVFU1QKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19hdXRvX2lkX2VuY3J5cHRpb25fZW5hYmxlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9FTkNSWVBUSU9OX0VOQUJMRUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19hdXRvX2lkX2tleV9leGNoYW5nZV9mYWlsdXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9LRVlfRVhDSEFOR0VfRkFJTFVSRQorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2F1dG9faWRfa2V5X2V4Y2hhbmdlX3N0YXJ0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX0tFWV9FWENIQU5HRV9TVEFSVEVECisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfYXV0b19pZF9rZXlfZXhjaGFuZ2Vfc3RvcHBlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfS0VZX0VYQ0hBTkdFX1NUT1BQRUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19hdXRvX2lkX2xpbmtfZGVsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9MSU5LX0RFTEVURUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19hdXRvX2lkX2xpbmtfc3BlZWRfbWlzbWF0Y2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9MSU5LX1NQRUVEX01JU01BVENICisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfYXV0b19pZF9tcGNwX2RlcmVnaXN0ZXJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfTVBDUF9ERVJFR0lTVEVSRUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19hdXRvX2lkX21wY3BfZGlzY292ZXJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9NUENQX0RJU0NPVkVSRUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19hdXRvX2lkX21wY3BfcmVnX2Fja190aW1lb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9NUENQX1JFR19BQ0tfVElNRU9VVAorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2F1dG9faWRfbXBjcF9yZXBvcnRfdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX01QQ1BfUkVQT1JUX1RJTUVPVVQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19hdXRvX2lkX29hbV9rZWVwYWxpdmVfdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9PQU1fS0VFUEFMSVZFX1RJTUVPVVQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19hdXRvX2lkX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9PQU1fS0VFUEFMSVZFX1RJTUVSX1NUQVJURUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19hdXRvX2lkX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9PQU1fS0VFUEFMSVZFX1RJTUVSX1NUT1BQRUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19hdXRvX2lkX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9QUkVQUk9WSVNJT05FRF9MSU5LX0NSRUFURUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19hdXRvX2lkX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9QUk9URUNUSU9OX1NXSVRDSF9PQ0NVUlJFRAorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2F1dG9faWRfcmFuZ2VfdmFsdWVfY2hhbmdlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX1JBTkdFX1ZBTFVFX0NIQU5HRUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19hdXRvX2lkX3JlcmFuZ2VfZmFpbHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9SRVJBTkdFX0ZBSUxVUkUKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19hdXRvX2lkX3N0YXRfYWxhcm1fY2xlYXJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19hdXRvX2lkX3N0YXRfYWxhcm1fcmFpc2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRAorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2F1dG9faWRfc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX1NUQVRJQ19SRUdJU1RSQVRJT05fRE9ORQorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2F1dG9faWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19vcGVyX2lkX19iZWdpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9fQkVHSU4KKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19vcGVyX2lkX2RlbGV0ZV9saW5rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9ERUxFVEVfTElOSworI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX29wZXJfaWRfZm9yY2VfcmVkaXNjb3ZlcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19PUEVSX0lEX0ZPUkNFX1JFRElTQ09WRVJZCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfb3Blcl9pZF9rZXlfZXhjaGFuZ2Vfc3RhcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX09QRVJfSURfS0VZX0VYQ0hBTkdFX1NUQVJUCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfb3Blcl9pZF9rZXlfZXhjaGFuZ2Vfc3RvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX09QRVJfSURfS0VZX0VYQ0hBTkdFX1NUT1AKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19vcGVyX2lkX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9PQU1fS0VFUEFMSVZFX1RJTUVSX1NUQVJUCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfb3Blcl9pZF9vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX09QRVJfSURfT0FNX0tFRVBBTElWRV9USU1FUl9TVE9QCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfb3Blcl9pZF9zdGF0aWNfcmVnaXN0cmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX09QRVJfSURfU1RBVElDX1JFR0lTVFJBVElPTgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX29wZXJfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19PUEVSX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19wcm94eV9pZF9fYmVnaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfUFJPWFlfSURfX0JFR0lOCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfcHJveHlfaWRfaW5qZWN0X2ZyYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1BST1hZX0lEX0lOSkVDVF9GUkFNRQorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3Byb3h5X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19QUk9YWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfcHJveHlfcnhfaWRfX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1BST1hZX1JYX0lEX19CRUdJTgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3Byb3h5X3J4X2lkX2ZyYW1lX2NhcHR1cmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19QUk9YWV9SWF9JRF9GUkFNRV9DQVBUVVJFRAorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3Byb3h5X3J4X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19QUk9YWV9SWF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2F1dG9faWRfX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9BVVRPX0lEX19CRUdJTgorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9hdXRvX2lkX2F1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfQVVUT19JRF9BVVRPX1JPR1VFX1NDQU5fMTBHX0ZBSUxVUkUKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfYXV0b19pZF9hdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfQVVUT19ST0dVRV9TQ0FOXzFHX0ZBSUxVUkUKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfYXV0b19pZF9sbGlkX3F1YXJhbnRpbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfTExJRF9RVUFSQU5USU5FRAorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9hdXRvX2lkX21wY3BfdGltZXN0YW1wX2NoYW5nZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfQVVUT19JRF9NUENQX1RJTUVTVEFNUF9DSEFOR0VECisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2F1dG9faWRfbm9fcmVwb3J0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9BVVRPX0lEX05PX1JFUE9SVFMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfYXV0b19pZF9vbnVfdXBncmFkZV9jb21wbGV0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfT05VX1VQR1JBREVfQ09NUExFVEUKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfYXV0b19pZF9yZXJhbmdlX2ZhaWx1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfUkVSQU5HRV9GQUlMVVJFCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2F1dG9faWRfcm9ndWVfc2Nhbl9jb21wbGV0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9BVVRPX0lEX1JPR1VFX1NDQU5fQ09NUExFVEUKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfYXV0b19pZF9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfYXV0b19pZF9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9hdXRvX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfQVVUT19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX29wZXJfaWRfX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX19CRUdJTgorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9vcGVyX2lkX2FkZF9saW5rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9BRERfTElOSworI2RlZmluZSBiY21vbHRfZXBvbl9uaV9vcGVyX2lkX2FkZF9tdWx0aWNhc3RfbGluayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9BRERfTVVMVElDQVNUX0xJTksKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfb3Blcl9pZF9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGluayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX09QRVJfSURfQUREX1BST1RFQ1RFRF9TVEFOREJZX0xJTksKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfb3Blcl9pZF9pc3N1ZV9yc3NpX2dyYW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX09QRVJfSURfSVNTVUVfUlNTSV9HUkFOVAorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9vcGVyX2lkX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGEgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9QUk9URUNUSU9OX1NXSVRDSElOR19BUFBMWV9SRVJBTkdFX0RFTFRBCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX29wZXJfaWRfcm9ndWVfbGxpZF9zY2FuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX1JPR1VFX0xMSURfU0NBTgorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9vcGVyX2lkX3NldF9lcG9uX25pX2VuX3N0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9TRVRfRVBPTl9OSV9FTl9TVEFURQorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9vcGVyX2lkX3N0YXJ0X29udV91cGdyYWRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9TVEFSVF9PTlVfVVBHUkFERQorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9vcGVyX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19pZF9fYmVnaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0FVVE9fSURfX0JFR0lOCisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19pZF9zdGF0X2FsYXJtX2NsZWFyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVECisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19pZF9zdGF0X2FsYXJtX3JhaXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfQVVUT19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2lkX19iZWdpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQVVUT19JRF9fQkVHSU4KKyNkZWZpbmUgYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9faWRfc3RhdF9hbGFybV9jbGVhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRAorI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19pZF9zdGF0X2FsYXJtX3JhaXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzFHX1VTX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9faWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19BVVRPX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19pZF9fYmVnaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0FVVE9fSURfX0JFR0lOCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9faWRfc3RhdF9hbGFybV9jbGVhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRAorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2lkX3N0YXRfYWxhcm1fcmFpc2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRAorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfQVVUT19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9faWRfX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19BVVRPX0lEX19CRUdJTgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2lkX3N0YXRfYWxhcm1fY2xlYXJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19pZF9zdGF0X2FsYXJtX3JhaXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0FVVE9fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9faWRfX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19BVVRPX0lEX19CRUdJTgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9faWRfc3RhdF9hbGFybV9jbGVhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRAorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9faWRfc3RhdF9hbGFybV9yYWlzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VECisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0FVVE9fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9faWRfX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19BVVRPX0lEX19CRUdJTgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9faWRfc3RhdF9hbGFybV9jbGVhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRAorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9faWRfc3RhdF9hbGFybV9yYWlzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VECisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0FVVE9fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2lkX19iZWdpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19JRF9fQkVHSU4KKyNkZWZpbmUgYmNtb2x0X2dwb25fYWxsb2NfYXV0b19pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fYWxsb2NfYXV0b19pZF9nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fSURfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2lkX3N0YXRfYWxhcm1fY2xlYXJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fYWxsb2NfYXV0b19pZF9zdGF0X2FsYXJtX3JhaXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fYWxsb2NfYXV0b19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9hbGxvY19vcGVyX2lkX19iZWdpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fQUxMT0NfT1BFUl9JRF9fQkVHSU4KKyNkZWZpbmUgYmNtb2x0X2dwb25fYWxsb2Nfb3Blcl9pZF9nZXRfc3RhdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0FMTE9DX09QRVJfSURfR0VUX1NUQVRTCisjZGVmaW5lIGJjbW9sdF9ncG9uX2FsbG9jX29wZXJfaWRfc2V0X3N0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9BTExPQ19PUEVSX0lEX1NFVF9TVEFURQorI2RlZmluZSBiY21vbHRfZ3Bvbl9hbGxvY19vcGVyX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fQUxMT0NfT1BFUl9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9faWRfX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9BVVRPX0lEX19CRUdJTgorI2RlZmluZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2lkX3N0YXRfYWxhcm1fY2xlYXJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19pZF9zdGF0X2FsYXJtX3JhaXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0FVVE9fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9vcGVyX2lkX19iZWdpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfT1BFUl9JRF9fQkVHSU4KKyNkZWZpbmUgYmNtb2x0X2dwb25fZ2VtX3BvcnRfb3Blcl9pZF9zZXRfc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX09QRVJfSURfU0VUX1NUQVRFCisjZGVmaW5lIGJjbW9sdF9ncG9uX2dlbV9wb3J0X29wZXJfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9PUEVSX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX2F1dG9faWRfX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9BVVRPX0lEX19CRUdJTgorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19pZF9mbHVzaF9tYWNfdGFibGVfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX0FVVE9fSURfRkxVU0hfTUFDX1RBQkxFX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19pZF9zY2FuX21hY190YWJsZV9jb21wbGV0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX0FVVE9fSURfU0NBTl9NQUNfVEFCTEVfQ09NUExFVEVECisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2lkX3N0YXRfYWxhcm1fY2xlYXJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX2F1dG9faWRfc3RhdF9hbGFybV9yYWlzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VECisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfQVVUT19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9vcGVyX2lkX19iZWdpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfT1BFUl9JRF9fQkVHSU4KKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX29wZXJfaWRfZmx1c2hfbWFjX3RhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9PUEVSX0lEX0ZMVVNIX01BQ19UQUJMRQorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2Zfb3Blcl9pZF9zY2FuX21hY190YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX09QRVJfSURfU0NBTl9NQUNfVEFCTEUKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX29wZXJfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9PUEVSX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2lkX19iZWdpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19JRF9fQkVHSU4KKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2lkX21hY19hZ2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19JRF9NQUNfQUdFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9faWRfbWFjX2Ryb3BwZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0lEX01BQ19EUk9QUEVECisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19pZF9tYWNfbW92ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fSURfTUFDX01PVkUKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2lkX25ld19tYWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19JRF9ORVdfTUFDCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9hdXRvX2lkX19iZWdpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQVVUT19JRF9fQkVHSU4KKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfYXV0b19pZF9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVECisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2F1dG9faWRfY3B1X3BhY2tldHNfZmFpbHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX0NQVV9QQUNLRVRTX0ZBSUxVUkUKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfYXV0b19pZF9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfREVBQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfYXV0b19pZF9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfRElTQUJMRV9BTExfT05VU19DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfYXV0b19pZF9lbmFibGVfYWxsX29udXNfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfRU5BQkxFX0FMTF9PTlVTX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9hdXRvX2lkX2xvcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQVVUT19JRF9MT1MKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfYXV0b19pZF9vbnVfZGlzY292ZXJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfT05VX0RJU0NPVkVSRUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfYXV0b19pZF9vbnVfdXBncmFkZV9jb21wbGV0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfT05VX1VQR1JBREVfQ09NUExFVEUKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfYXV0b19pZF9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfYXV0b19pZF9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfU1dJVENIT1ZFUl9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfYXV0b19pZF9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUUKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfYXV0b19pZF9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9hdXRvX2lkX3JvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQVVUT19JRF9ST0dVRV9PTlVfU1BFQ0lBTF9NQVBfQ1lDTEVfU1RBUlQKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfYXV0b19pZF9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfU0VSSUFMX05VTUJFUl9BQ1FVSVNJVElPTl9DWUNMRV9TVEFSVAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9hdXRvX2lkX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQVVUT19JRF9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9hdXRvX2lkX3N0YXRfYWxhcm1fY2xlYXJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfYXV0b19pZF9zdGF0X2FsYXJtX3JhaXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfYXV0b19pZF9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9hdXRvX2lkX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQVVUT19JRF9UT0RfUkVRVUVTVF9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfYXV0b19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9vcGVyX2lkX19iZWdpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9fQkVHSU4KKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfb3Blcl9pZF9kaXNhYmxlX3NlcmlhbF9udW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX09QRVJfSURfRElTQUJMRV9TRVJJQUxfTlVNQkVSCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX29wZXJfaWRfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGUgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1RZUEVfQ19TRVRfTVVMVElQTEVfT05VX1NUQVRFCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX29wZXJfaWRfcmVzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1JFU0VUCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX29wZXJfaWRfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1JPR1VFX0RFVEVDVElPTl9XSU5ET1cKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfb3Blcl9pZF9zZXRfb251X3N0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX09QRVJfSURfU0VUX09OVV9TVEFURQorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9vcGVyX2lkX3NldF9wb25fc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9TRVRfUE9OX1NUQVRFCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX29wZXJfaWRfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1NJTkdMRV9SRVFVRVNUX1NUQU5EQllfUE9OX01PTklUT1JJTkcKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfb3Blcl9pZF9zdGFydF9vbnVfdXBncmFkZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX09QRVJfSURfU1RBUlRfT05VX1VQR1JBREUKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfb3Blcl9pZF90b2RfcmVxdWVzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX09QRVJfSURfVE9EX1JFUVVFU1QKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfb3Blcl9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX09QRVJfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9wcm94eV9pZF9fYmVnaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfUFJPWFlfSURfX0JFR0lOCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3Byb3h5X2lkX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9QUk9YWV9JRF9CUk9BRENBU1RfUExPQU1fUEFDS0VUCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3Byb3h5X2lkX2NwdV9wYWNrZXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9QUk9YWV9JRF9DUFVfUEFDS0VUUworI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9wcm94eV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfUFJPWFlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19pZF9fYmVnaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfX0JFR0lOCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2lkX2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9CRVJfSU5URVJWQUxfQ09ORklHVVJBVElPTl9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9faWRfZGZpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0RGSQorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19pZF9kZ2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfREdJCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2lkX2Rvd2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9ET1dJCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2lkX2VyciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9FUlIKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9faWRfaW52YWxpZF9kYnJ1X3JlcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0lOVkFMSURfREJSVV9SRVBPUlQKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9faWRfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0tFWV9FWENIQU5HRV9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9faWRfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0tFWV9FWENIQU5HRV9DWUNMRV9TS0lQUEVECisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2lkX2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfREVDUllQVF9SRVFVSVJFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19pZF9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19pZF9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfS0VZX0VYQ0hBTkdFX0tFWV9SRVFVRVNUX1RJTUVPVVQKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9faWRfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0tFWV9FWENIQU5HRV9VTkNPTlNFQ1VUSVZFX0lOREVYCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2lkX2xvYWkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9MT0FJCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2lkX2xva2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9MT0tJCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2lkX21lbWkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9NRU1JCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2lkX29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9PTUNJX1BPUlRfSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9faWRfb251X2FjdGl2YXRpb25fY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19pZF9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT05VX0FDVElWQVRJT05fU1RBTkRCWV9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9faWRfb251X2FsYXJtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX09OVV9BTEFSTQorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19pZF9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9faWRfb251X2Rpc2FibGVfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX09OVV9ESVNBQkxFX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19pZF9vbnVfZW5hYmxlX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT05VX0VOQUJMRV9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9faWRfb3B0aWNhbF9yZWZsZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX09QVElDQUxfUkVGTEVDVElPTgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19pZF9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fQ09NUExFVEVECisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2lkX3BlZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9QRUUKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9faWRfcG9zc2libGVfZHJpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1BPU1NJQkxFX0RSSUZUCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2lkX3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRQorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19pZF9wc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfUFNUCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2lkX3JhbmdpbmdfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9SQU5HSU5HX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19pZF9yZWkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfUkVJCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2lkX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19pZF9zZGkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfU0RJCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2lkX3NmaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9TRkkKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9faWRfc3RhdF9hbGFybV9jbGVhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19pZF9zdGF0X2FsYXJtX3JhaXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9faWRfc3VmaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1NVRkkKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9faWRfdGl3aSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1RJV0kKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9faWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X29wZXJfaWRfX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9PUEVSX0lEX19CRUdJTgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfb3Blcl9pZF9jaGFuZ2VfcG93ZXJfbGV2ZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX09QRVJfSURfQ0hBTkdFX1BPV0VSX0xFVkVMCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9vcGVyX2lkX3Jzc2lfbWVhc3VyZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfT1BFUl9JRF9SU1NJX01FQVNVUkVNRU5UCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9vcGVyX2lkX3NldF9vbnVfc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfT1BFUl9JRF9TRVRfT05VX1NUQVRFCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9vcGVyX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfT1BFUl9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9wcm94eV9pZF9fYmVnaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfUFJPWFlfSURfX0JFR0lOCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9wcm94eV9pZF9jcHVfcGFja2V0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfUFJPWFlfSURfQ1BVX1BBQ0tFVFMKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X3Byb3h5X2lkX3Bsb2FtX3BhY2tldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9QUk9YWV9JRF9QTE9BTV9QQUNLRVQKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X3Byb3h5X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9QUk9YWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9wcm94eV9yeF9pZF9fYmVnaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfUFJPWFlfUlhfSURfX0JFR0lOCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9wcm94eV9yeF9pZF9jcHVfcGFja2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfUFJPWFlfUlhfSURfQ1BVX1BBQ0tFVAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfcHJveHlfcnhfaWRfb21jaV9wYWNrZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1BST1hZX1JYX0lEX09NQ0lfUEFDS0VUCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9wcm94eV9yeF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfUFJPWFlfUlhfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfbG9nX2VudHJ5X2F1dG9faWRfX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR19FTlRSWV9BVVRPX0lEX19CRUdJTgorI2RlZmluZSBiY21vbHRfbG9nX2VudHJ5X2F1dG9faWRfc3RhdF9hbGFybV9jbGVhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR19FTlRSWV9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRAorI2RlZmluZSBiY21vbHRfbG9nX2VudHJ5X2F1dG9faWRfc3RhdF9hbGFybV9yYWlzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR19FTlRSWV9BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VECisjZGVmaW5lIGJjbW9sdF9sb2dfZW50cnlfYXV0b19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTE9HX0VOVFJZX0FVVE9fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfbG9nZ2VyX2F1dG9faWRfX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR0dFUl9BVVRPX0lEX19CRUdJTgorI2RlZmluZSBiY21vbHRfbG9nZ2VyX2F1dG9faWRfc3RhdF9hbGFybV9jbGVhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR0dFUl9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRAorI2RlZmluZSBiY21vbHRfbG9nZ2VyX2F1dG9faWRfc3RhdF9hbGFybV9yYWlzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR0dFUl9BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VECisjZGVmaW5lIGJjbW9sdF9sb2dnZXJfYXV0b19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTE9HR0VSX0FVVE9fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfbG9nZ2VyX29wZXJfaWRfX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR0dFUl9PUEVSX0lEX19CRUdJTgorI2RlZmluZSBiY21vbHRfbG9nZ2VyX29wZXJfaWRfY2xlYXJfbG9nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR0dFUl9PUEVSX0lEX0NMRUFSX0xPRworI2RlZmluZSBiY21vbHRfbG9nZ2VyX29wZXJfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR0dFUl9PUEVSX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X25uaV9hdXRvX2lkX19iZWdpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfQVVUT19JRF9fQkVHSU4KKyNkZWZpbmUgYmNtb2x0X25uaV9hdXRvX2lkX3N0YXRfYWxhcm1fY2xlYXJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQKKyNkZWZpbmUgYmNtb2x0X25uaV9hdXRvX2lkX3N0YXRfYWxhcm1fcmFpc2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRAorI2RlZmluZSBiY21vbHRfbm5pX2F1dG9faWRfc3RhdHVzX2NoYW5nZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9BVVRPX0lEX1NUQVRVU19DSEFOR0VECisjZGVmaW5lIGJjbW9sdF9ubmlfYXV0b19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX0FVVE9fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9faWRfX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9BVVRPX0lEX19CRUdJTgorI2RlZmluZSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9faWRfY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWQgICAgICAgICAgICAgICAgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9BVVRPX0lEX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVECisjZGVmaW5lIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0FVVE9fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX29wZXJfaWRfX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9PUEVSX0lEX19CRUdJTgorI2RlZmluZSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX29wZXJfaWRfc3RhcnRfY2FwdHVyZV93aW5kb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9PUEVSX0lEX1NUQVJUX0NBUFRVUkVfV0lORE9XCisjZGVmaW5lIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fb3Blcl9pZF9zdG9wX2NhcHR1cmVfd2luZG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX09QRVJfSURfU1RPUF9DQVBUVVJFX1dJTkRPVworI2RlZmluZSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX29wZXJfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9PUEVSX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9faWRfX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9BTExPQ19BVVRPX0lEX19CRUdJTgorI2RlZmluZSBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9faWRfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9BTExPQ19BVVRPX0lEX0dFVF9BTExPQ19TVEFUU19DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9faWRfc3RhdF9hbGFybV9jbGVhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9BTExPQ19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRAorI2RlZmluZSBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19pZF9zdGF0X2FsYXJtX3JhaXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9faWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9BTExPQ19BVVRPX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2FsbG9jX29wZXJfaWRfX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9BTExPQ19PUEVSX0lEX19CRUdJTgorI2RlZmluZSBiY21vbHRfeGdwb25fYWxsb2Nfb3Blcl9pZF9nZXRfc3RhdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0FMTE9DX09QRVJfSURfR0VUX1NUQVRTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9hbGxvY19vcGVyX2lkX3NldF9zdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fQUxMT0NfT1BFUl9JRF9TRVRfU1RBVEUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2FsbG9jX29wZXJfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9BTExPQ19PUEVSX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9faWRfX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9BVVRPX0lEX19CRUdJTgorI2RlZmluZSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19pZF9zdGF0X2FsYXJtX2NsZWFyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2lkX3N0YXRfYWxhcm1fcmFpc2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRAorI2RlZmluZSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0FVVE9fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfYXV0b19pZF9fYmVnaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfX0JFR0lOCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2lkX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9BQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2F1dG9faWRfY3B1X3BhY2tldHNfZmFpbHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX0NQVV9QQUNLRVRTX0ZBSUxVUkUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2F1dG9faWRfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX0RFQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2lkX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9ESVNBQkxFX0FMTF9PTlVTX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfYXV0b19pZF9lbmFibGVfYWxsX29udXNfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfRU5BQkxFX0FMTF9PTlVTX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfYXV0b19pZF9sb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfTE9TCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2lkX29udV9kaXNjb3ZlcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9PTlVfRElTQ09WRVJFRAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfYXV0b19pZF9vbnVfdXBncmFkZV9jb21wbGV0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfT05VX1VQR1JBREVfQ09NUExFVEUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2F1dG9faWRfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2lkX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfYXV0b19pZF9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2F1dG9faWRfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2F1dG9faWRfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1JPR1VFX09OVV9TUEVDSUFMX01BUF9DWUNMRV9TVEFSVAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfYXV0b19pZF9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfU0VSSUFMX05VTUJFUl9BQ1FVSVNJVElPTl9DWUNMRV9TVEFSVAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfYXV0b19pZF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2F1dG9faWRfc3RhdF9hbGFybV9jbGVhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfYXV0b19pZF9zdGF0X2FsYXJtX3JhaXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2F1dG9faWRfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2F1dG9faWRfdG9kX3JlcXVlc3RfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1RPRF9SRVFVRVNUX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfYXV0b19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfb3Blcl9pZF9fYmVnaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfX0JFR0lOCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9vcGVyX2lkX2FkanVzdF90eF93YXZlbGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9BREpVU1RfVFhfV0FWRUxFTkdUSAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfb3Blcl9pZF9kaXNhYmxlX3NlcmlhbF9udW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfRElTQUJMRV9TRVJJQUxfTlVNQkVSCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9vcGVyX2lkX3Jlc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9SRVNFVAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfb3Blcl9pZF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfUk9HVUVfREVURUNUSU9OX1dJTkRPVworI2RlZmluZSBiY21vbHRfeGdwb25fbmlfb3Blcl9pZF9ydW5fc3BlY2lhbF9id19tYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfUlVOX1NQRUNJQUxfQldfTUFQCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9vcGVyX2lkX3NldF9vbnVfc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9TRVRfT05VX1NUQVRFCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9vcGVyX2lkX3NldF9wb25fc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9TRVRfUE9OX1NUQVRFCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9vcGVyX2lkX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9TSU5HTEVfUkVRVUVTVF9TVEFOREJZX1BPTl9NT05JVE9SSU5HCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9vcGVyX2lkX3N0YXJ0X29udV91cGdyYWRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9TVEFSVF9PTlVfVVBHUkFERQorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfb3Blcl9pZF90b2RfcmVxdWVzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfVE9EX1JFUVVFU1QKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX29wZXJfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3Byb3h5X2lkX19iZWdpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9QUk9YWV9JRF9fQkVHSU4KKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3Byb3h5X2lkX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9QUk9YWV9JRF9CUk9BRENBU1RfUExPQU1fUEFDS0VUCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9wcm94eV9pZF9jcHVfcGFja2V0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfUFJPWFlfSURfQ1BVX1BBQ0tFVFMKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3Byb3h5X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9QUk9YWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19pZF9fYmVnaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfX0JFR0lOCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19pZF9kZmkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfREZJCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19pZF9kZ2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfREdJCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19pZF9kb3dpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfRE9XSQorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2F1dG9faWRfaW52YWxpZF9kYnJ1X3JlcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX0lOVkFMSURfREJSVV9SRVBPUlQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hdXRvX2lkX2tleV9leGNoYW5nZV9jb21wbGV0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfQ09NUExFVEVECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19pZF9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfS0VZX0VYQ0hBTkdFX0NZQ0xFX1NLSVBQRUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hdXRvX2lkX2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENICisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19pZF9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfS0VZX0VYQ0hBTkdFX0tFWV9SRVFVRVNUX1RJTUVPVVQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hdXRvX2lkX2xvb2NpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9MT09DSQorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2F1dG9faWRfb251X2FjdGl2YXRpb25fY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2F1dG9faWRfb251X2FsYXJtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09OVV9BTEFSTQorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2F1dG9faWRfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19pZF9vbnVfZGlzYWJsZV9jb21wbGV0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT05VX0RJU0FCTEVfQ09NUExFVEVECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19pZF9vbnVfZW5hYmxlX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT05VX0VOQUJMRV9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hdXRvX2lkX29udV90dW5pbmdfaW5fY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9PTlVfVFVOSU5HX0lOX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2F1dG9faWRfb251X3R1bmluZ19vdXRfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09OVV9UVU5JTkdfT1VUX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2F1dG9faWRfb3B0aWNhbF9yZWZsZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09QVElDQUxfUkVGTEVDVElPTgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2F1dG9faWRfcG9zc2libGVfZHJpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1BPU1NJQkxFX0RSSUZUCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19pZF9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfUE9XRVJfQ09OU1VNUFRJT05fUkVQT1JUCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19pZF9wb3dlcl9sZXZlbF9yZXBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfUE9XRVJfTEVWRUxfUkVQT1JUCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19pZF9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0UKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hdXRvX2lkX3Bxc2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9QUVNJCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19pZF9yYW5naW5nX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfUkFOR0lOR19DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hdXRvX2lkX3JlZ2lzdHJhdGlvbl9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9SRUdJU1RSQVRJT05fSUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hdXRvX2lkX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2F1dG9faWRfc2RpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1NESQorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2F1dG9faWRfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTFVSRQorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2F1dG9faWRfc2ZpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1NGSQorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2F1dG9faWRfc3RhdF9hbGFybV9jbGVhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRAorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2F1dG9faWRfc3RhdF9hbGFybV9yYWlzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19pZF9zdWZpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfU1VGSQorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2F1dG9faWRfdGl3aSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1RJV0kKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hdXRvX2lkX3R1bmluZ19yZXNwb25zZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9UVU5JTkdfUkVTUE9OU0UKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hdXRvX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfb3Blcl9pZF9fYmVnaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfX0JFR0lOCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfb3Blcl9pZF9hZGp1c3RfdHhfd2F2ZWxlbmd0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfQURKVVNUX1RYX1dBVkVMRU5HVEgKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9vcGVyX2lkX2NoYW5nZV9wb3dlcl9sZXZlbGxpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9DSEFOR0VfUE9XRVJfTEVWRUxMSU5HCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfb3Blcl9pZF9nZXRfcG93ZXJfY29uc3VtcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfR0VUX1BPV0VSX0NPTlNVTVBUSU9OCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfb3Blcl9pZF9nZXRfcG93ZXJfbGV2ZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfR0VUX1BPV0VSX0xFVkVMCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfb3Blcl9pZF9vbnVfdHVuaW5nX2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfT05VX1RVTklOR19JTgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X29wZXJfaWRfb251X3R1bmluZ19vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX09OVV9UVU5JTkdfT1VUCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfb3Blcl9pZF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfUkVRVUVTVF9SRUdJU1RSQVRJT04KKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9vcGVyX2lkX3Jzc2lfbWVhc3VyZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9SU1NJX01FQVNVUkVNRU5UCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfb3Blcl9pZF9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X29wZXJfaWRfc2V0X29udV9zdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX1NFVF9PTlVfU1RBVEUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9vcGVyX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfcHJveHlfaWRfX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1BST1hZX0lEX19CRUdJTgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3Byb3h5X2lkX2NwdV9wYWNrZXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9QUk9YWV9JRF9DUFVfUEFDS0VUUworI2RlZmluZSBiY21vbHRfeGdwb25fb251X3Byb3h5X2lkX3Bsb2FtX3BhY2tldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9QUk9YWV9JRF9QTE9BTV9QQUNLRVQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9wcm94eV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfUFJPWFlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3Byb3h5X3J4X2lkX19iZWdpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9QUk9YWV9SWF9JRF9fQkVHSU4KKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9wcm94eV9yeF9pZF9jcHVfcGFja2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfUFJPWFlfUlhfSURfQ1BVX1BBQ0tFVAorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3Byb3h5X3J4X2lkX29tY2lfcGFja2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9QUk9YWV9SWF9JRF9PTUNJX1BBQ0tFVAorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3Byb3h5X3J4X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9QUk9YWV9SWF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9hZV9uaV9rZXlfaWRfYWVfbmkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfTklfS0VZX0lEX0FFX05JCisjZGVmaW5lIGJjbW9sdF9hZV9uaV9rZXlfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfTklfS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2FlX25pX2NmZ19pZF9tYWNfYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9OSV9DRkdfSURfTUFDX0FERFJFU1MKKyNkZWZpbmUgYmNtb2x0X2FlX25pX2NmZ19pZF9hZV9uaV9lbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9OSV9DRkdfSURfQUVfTklfRU4KKyNkZWZpbmUgYmNtb2x0X2FlX25pX2NmZ19pZF9tdHVfMTBnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9OSV9DRkdfSURfTVRVXzEwRworI2RlZmluZSBiY21vbHRfYWVfbmlfY2ZnX2lkX3ByYnNfZ2VuZXJhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX05JX0NGR19JRF9QUkJTX0dFTkVSQVRPUgorI2RlZmluZSBiY21vbHRfYWVfbmlfY2ZnX2lkX3ByYnNfY2hlY2tlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX05JX0NGR19JRF9QUkJTX0NIRUNLRVIKKyNkZWZpbmUgYmNtb2x0X2FlX25pX2NmZ19pZF9wcmJzX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9OSV9DRkdfSURfUFJCU19TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X2FlX25pX2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9OSV9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2lkX25ld19zdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX05JX1NFVF9BRV9OSV9FTl9TVEFURV9JRF9ORVdfU1RBVEUKKyNkZWZpbmUgYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9OSV9TRVRfQUVfTklfRU5fU1RBVEVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfYWVfcGF0aF9kc19rZXlfaWRfYWVfbmkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfRFNfS0VZX0lEX0FFX05JCisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX2RzX2tleV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9EU19LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2lkX2J5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9CWVRFUworI2RlZmluZSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2lkX2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9pZF9mcmFtZXNfNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzY0CisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfaWRfZnJhbWVzXzY1XzEyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU182NV8xMjcKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9pZF9mcmFtZXNfMTI4XzI1NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTUKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9pZF9mcmFtZXNfMjU2XzUxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTEKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9pZF9mcmFtZXNfNTEyXzEwMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzCisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfaWRfZnJhbWVzXzEwMjRfMTUxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTgKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9pZF9mcmFtZXNfMTUxOV8yMDQ3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NworI2RlZmluZSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2lkX2ZyYW1lc18yMDQ4XzQwOTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1CisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfaWRfZnJhbWVzXzQwOTZfOTIxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTYKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9pZF9mcmFtZXNfOTIxN18xNjM4MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODMKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9pZF9icm9hZGNhc3RfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUworI2RlZmluZSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2lkX2RhdGFfYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9EQVRBX0JZVEVTCisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfaWRfbXVsdGljYXN0X2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9pZF91bmljYXN0X2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9pZF9hYm9ydF9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfQUJPUlRfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfaWRfY2ZnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfQ0ZHX0lEX0NGRworI2RlZmluZSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0YXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUCisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2lkX3N0YXRfYWxhcm1fY2xlYXJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmdfaWRfc3RhdF9hbGFybV9yYWlzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VECisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9EU19BVVRPX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX3VzX2tleV9pZF9hZV9uaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9VU19LRVlfSURfQUVfTkkKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfdXNfa2V5X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX1VTX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfaWRfYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0JZVEVTCisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfaWRfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FUworI2RlZmluZSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2lkX2ZyYW1lc182NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfNjQKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9pZF9mcmFtZXNfNjVfMTI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzY1XzEyNworI2RlZmluZSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2lkX2ZyYW1lc18xMjhfMjU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NQorI2RlZmluZSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2lkX2ZyYW1lc18yNTZfNTExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMQorI2RlZmluZSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2lkX2ZyYW1lc181MTJfMTAyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjMKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9pZF9mcmFtZXNfMTAyNF8xNTE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxOAorI2RlZmluZSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2lkX2ZyYW1lc18xNTE5XzIwNDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3CisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfaWRfZnJhbWVzXzIwNDhfNDA5NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTUKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9pZF9mcmFtZXNfNDA5Nl85MjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNgorI2RlZmluZSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2lkX2ZyYW1lc185MjE3XzE2MzgzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MworI2RlZmluZSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2lkX2Jyb2FkY2FzdF9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfaWRfZGF0YV9ieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0RBVEFfQllURVMKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9pZF9tdWx0aWNhc3RfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUworI2RlZmluZSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2lkX3VuaWNhc3RfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUworI2RlZmluZSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2lkX2Fib3J0X2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9BQk9SVF9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9pZF9mY3NfZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRkNTX0VSUk9SCisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfaWRfb3ZlcnNpemVfZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX09WRVJTSVpFX0VSUk9SCisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfaWRfcnVudF9lcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX1JVTlRfRVJST1IKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZ19pZF9jZmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9DRkdfSURfQ0ZHCisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVAorI2RlZmluZSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfaWRfc3RhdF9hbGFybV9jbGVhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRAorI2RlZmluZSBiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19pZF9zdGF0X2FsYXJtX3JhaXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0FFX1BBVEhfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQKKyNkZWZpbmUgYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9BRV9QQVRIX1VTX0FVVE9fQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2NoYW5uZWxfa2V5X2lkX3Bvbl9uaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9DSEFOTkVMX0tFWV9JRF9QT05fTkkKKyNkZWZpbmUgYmNtb2x0X2NoYW5uZWxfa2V5X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9DSEFOTkVMX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9jaGFubmVsX2NmZ19pZF9vcGVyYXRpb25fY29udHJvbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfQ0hBTk5FTF9DRkdfSURfT1BFUkFUSU9OX0NPTlRST0wKKyNkZWZpbmUgYmNtb2x0X2NoYW5uZWxfY2ZnX2lkX3RvbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9DSEFOTkVMX0NGR19JRF9UT0wKKyNkZWZpbmUgYmNtb2x0X2NoYW5uZWxfY2ZnX2lkX3N5c3RlbV9wcm9maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9DSEFOTkVMX0NGR19JRF9TWVNURU1fUFJPRklMRQorI2RlZmluZSBiY21vbHRfY2hhbm5lbF9jZmdfaWRfY2hhbm5lbF9wcm9maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX0NIQU5ORUxfUFJPRklMRQorI2RlZmluZSBiY21vbHRfY2hhbm5lbF9jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2RlYnVnX2tleV9pZF9yZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERUJVR19LRVlfSURfUkVTRVJWRUQKKyNkZWZpbmUgYmNtb2x0X2RlYnVnX2tleV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERUJVR19LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGVidWdfY2ZnX2lkX2NvbnNvbGVfcmVkaXJlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFQlVHX0NGR19JRF9DT05TT0xFX1JFRElSRUNUSU9OCisjZGVmaW5lIGJjbW9sdF9kZWJ1Z19jZmdfaWRfaW5kaWNhdGlvbnNfZHJvcHBlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVCVUdfQ0ZHX0lEX0lORElDQVRJT05TX0RST1BQRUQKKyNkZWZpbmUgYmNtb2x0X2RlYnVnX2NmZ19pZF9maWxlX3VzZWRfcGVyY2VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERUJVR19DRkdfSURfRklMRV9VU0VEX1BFUkNFTlQKKyNkZWZpbmUgYmNtb2x0X2RlYnVnX2NmZ19pZF9hcGlfY2FwdHVyZV9jZmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfQ0ZHCisjZGVmaW5lIGJjbW9sdF9kZWJ1Z19jZmdfaWRfYXBpX2NhcHR1cmVfc3RhdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVCVUdfQ0ZHX0lEX0FQSV9DQVBUVVJFX1NUQVRTCisjZGVmaW5lIGJjbW9sdF9kZWJ1Z19jZmdfaWRfYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVCVUdfQ0ZHX0lEX0FQSV9DQVBUVVJFX0JVRkZFUl9SRUFECisjZGVmaW5lIGJjbW9sdF9kZWJ1Z19jZmdfaWRfYXBpX2NhcHR1cmVfYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVCVUdfQ0ZHX0lEX0FQSV9DQVBUVVJFX0JVRkZFUgorI2RlZmluZSBiY21vbHRfZGVidWdfY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFQlVHX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2lkX2RhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVCVUdfQ0xJX09VVFBVVF9JRF9EQVRBCisjZGVmaW5lIGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVCVUdfQ0xJX09VVFBVVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZWJ1Z19maWxlX2FsbW9zdF9mdWxsX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVCVUdfRklMRV9BTE1PU1RfRlVMTF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19pZF9jbGlfb3V0cHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVCVUdfQVVUT19DRkdfSURfQ0xJX09VVFBVVAorI2RlZmluZSBiY21vbHRfZGVidWdfYXV0b19jZmdfaWRfZmlsZV9hbG1vc3RfZnVsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFQlVHX0FVVE9fQ0ZHX0lEX0ZJTEVfQUxNT1NUX0ZVTEwKKyNkZWZpbmUgYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERUJVR19BVVRPX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfaWRfZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVCVUdfQ0xJX0lOUFVUX0lEX0RBVEEKKyNkZWZpbmUgYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERUJVR19DTElfSU5QVVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGVidWdfcmVzZXRfYXBpX2NhcHR1cmVfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFQlVHX1JFU0VUX0FQSV9DQVBUVVJFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2RlYnVnX3N0YXJ0X2FwaV9jYXB0dXJlX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERUJVR19TVEFSVF9BUElfQ0FQVFVSRV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZWJ1Z19zdG9wX2FwaV9jYXB0dXJlX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVCVUdfU1RPUF9BUElfQ0FQVFVSRV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZXZpY2Vfa2V5X2lkX3Jlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0tFWV9JRF9SRVNFUlZFRAorI2RlZmluZSBiY21vbHRfZGV2aWNlX2tleV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGV2aWNlX2NmZ19pZF9zeXN0ZW1fbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9DRkdfSURfU1lTVEVNX01PREUKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9jZmdfaWRfa2VlcGFsaXZlX2ludGVydmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0tFRVBBTElWRV9JTlRFUlZBTAorI2RlZmluZSBiY21vbHRfZGV2aWNlX2NmZ19pZF9rZWVwYWxpdmVfdG9sZXJhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9DRkdfSURfS0VFUEFMSVZFX1RPTEVSQU5DRQorI2RlZmluZSBiY21vbHRfZGV2aWNlX2NmZ19pZF9maXJtd2FyZV9zd192ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9DRkdfSURfRklSTVdBUkVfU1dfVkVSU0lPTgorI2RlZmluZSBiY21vbHRfZGV2aWNlX2NmZ19pZF9ob3N0X3N3X3ZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9DRkdfSURfSE9TVF9TV19WRVJTSU9OCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfY2ZnX2lkX2NoaXBfcmV2aXNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9DSElQX1JFVklTSU9OCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfY2ZnX2lkX3N0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9TVEFURQorI2RlZmluZSBiY21vbHRfZGV2aWNlX2NmZ19pZF9kZWJ1ZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9DRkdfSURfREVCVUcKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9jZmdfaWRfbm5pX3NwZWVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX05OSV9TUEVFRAorI2RlZmluZSBiY21vbHRfZGV2aWNlX2NmZ19pZF9wcm90ZWN0aW9uX3N3aXRjaGluZ19leHRfaXJxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfRVhUX0lSUQorI2RlZmluZSBiY21vbHRfZGV2aWNlX2NmZ19pZF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9zYW1wbGVfZGVsYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9DRkdfSURfRVBPTl9DTE9DS19UUkFOU1BPUlRfU0FNUExFX0RFTEFZCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfY2ZnX2lkX2luZGljYXRpb25fc2hhcGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9JTkRJQ0FUSU9OX1NIQVBJTkcKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9jZmdfaWRfY2hpcF90ZW1wZXJhdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0NISVBfVEVNUEVSQVRVUkUKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9jZmdfaWRfZ3Bvbl94Z3Bvbl90b2RfZW5hYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX0VOQUJMRQorI2RlZmluZSBiY21vbHRfZGV2aWNlX2NmZ19pZF9ncG9uX3hncG9uX3RvZF9ncGlvX3BpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9DRkdfSURfR1BPTl9YR1BPTl9UT0RfR1BJT19QSU4KKyNkZWZpbmUgYmNtb2x0X2RldmljZV9jZmdfaWRfZ3Bvbl94Z3Bvbl90b2RfY29ubmVjdGVkX2ludGVybmFsbHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX0NPTk5FQ1RFRF9JTlRFUk5BTExZCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfY2ZnX2lkX2Vwb25fODAyMV9hc190b2RfZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9FUE9OXzgwMjFfQVNfVE9EX0ZPUk1BVAorI2RlZmluZSBiY21vbHRfZGV2aWNlX2NmZ19pZF9lcG9uX3NoYXBlcl9tb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9DRkdfSURfRVBPTl9TSEFQRVJfTU9ERQorI2RlZmluZSBiY21vbHRfZGV2aWNlX2NmZ19pZF9lbWJlZGRlZF9pbWFnZV9saXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9DRkdfSURfRU1CRURERURfSU1BR0VfTElTVAorI2RlZmluZSBiY21vbHRfZGV2aWNlX2NmZ19pZF9jaGlwX3ZvbHRhZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9DRkdfSURfQ0hJUF9WT0xUQUdFCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfY2ZnX2lkX2Vwb25fdG9kX3N0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9FUE9OX1RPRF9TVFJJTkcKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9jZmdfaWRfeGdwb25fbnVtX29mX29udXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1hHUE9OX05VTV9PRl9PTlVTCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfY2ZnX2lkX2RldmljZV9pcF9hZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9ERVZJQ0VfSVBfQUREUkVTUworI2RlZmluZSBiY21vbHRfZGV2aWNlX2NmZ19pZF9kZXZpY2VfdWRwX3BvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9DRkdfSURfREVWSUNFX1VEUF9QT1JUCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfY2ZnX2lkX3RvZF91YXJ0X2JhdWRyYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0NGR19JRF9UT0RfVUFSVF9CQVVEUkFURQorI2RlZmluZSBiY21vbHRfZGV2aWNlX2NmZ19pZF9ncG9uX3hncG9uX3RvZF9zdHJpbmdfbGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9DRkdfSURfR1BPTl9YR1BPTl9UT0RfU1RSSU5HX0xFTkdUSAorI2RlZmluZSBiY21vbHRfZGV2aWNlX2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfaWRfc3RhbmRhbG9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9DT05ORUNUSU9OX0NPTVBMRVRFX0lEX1NUQU5EQUxPTkUKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQ09OTkVDVElPTl9DT01QTEVURV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9lc3RhYmxpc2hlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0NPTk5FQ1RJT05fRVNUQUJMSVNIRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9pZF9yZWFzb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9DT05ORUNUSU9OX0ZBSUxVUkVfSURfUkVBU09OCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0NPTk5FQ1RJT05fRkFJTFVSRV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfaWRfZGRyX3Rlc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0REUl9URVNUX0NPTVBMRVRFX0lEX0REUl9URVNUCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0REUl9URVNUX0NPTVBMRVRFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9pZF9zZXF1ZW5jZV9udW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfREVWSUNFX0tFRVBfQUxJVkVfSURfU0VRVUVOQ0VfTlVNQkVSCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfaWRfdGltZV9zdGFtcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0RFVklDRV9LRUVQX0FMSVZFX0lEX1RJTUVfU1RBTVAKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfREVWSUNFX0tFRVBfQUxJVkVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9pZF9maXJtd2FyZV9zd192ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfRklSTVdBUkVfU1dfVkVSU0lPTgorI2RlZmluZSBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9pZF9zeXN0ZW1fbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfU1lTVEVNX01PREUKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfaWRfbm5pX3NwZWVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX05OSV9TUEVFRAorI2RlZmluZSBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9pZF9jaGlwX3JldmlzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfQ0hJUF9SRVZJU0lPTgorI2RlZmluZSBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9pZF90b2RfZW5hYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfVE9EX0VOQUJMRQorI2RlZmluZSBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9pZF90b2RfZ3Bpb19waW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfVE9EX0dQSU9fUElOCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0RFVklDRV9SRUFEWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfZGlzY29ubmVjdGlvbl9jb21wbGV0ZV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0RJU0NPTk5FQ1RJT05fQ09NUExFVEVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2lkX2ltYWdlX3R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9DT01QTEVURV9JRF9JTUFHRV9UWVBFCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfaWRfYmxvY2tfbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX0NPTVBMRVRFX0lEX0JMT0NLX05VTUJFUgorI2RlZmluZSBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2lkX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9DT01QTEVURV9JRF9TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfQ09NUExFVEVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWRfaWRfdG90YWxfY291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9JTkRJQ0FUSU9OU19EUk9QUEVEX0lEX1RPVEFMX0NPVU5UCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0lORElDQVRJT05TX0RST1BQRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2lkX3Rhc2tfbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9TV19FUlJPUl9JRF9UQVNLX05BTUUKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9zd19lcnJvcl9pZF9maWxlX25hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfU1dfRVJST1JfSURfRklMRV9OQU1FCisjZGVmaW5lIGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfaWRfbGluZV9udW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX1NXX0VSUk9SX0lEX0xJTkVfTlVNQkVSCisjZGVmaW5lIGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfaWRfcG9uX25pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX1NXX0VSUk9SX0lEX1BPTl9OSQorI2RlZmluZSBiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9TV19FUlJPUl9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2lkX2NwdV9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX1NXX0VYQ0VQVElPTl9JRF9DUFVfSUQKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25faWRfdGV4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfU1dfRVhDRVBUSU9OX0lEX1RFWFQKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25faWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfU1dfRVhDRVBUSU9OX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9hdXRvX2NmZ19pZF9jb25uZWN0aW9uX2NvbXBsZXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfQ09OTkVDVElPTl9DT01QTEVURQorI2RlZmluZSBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2lkX2Nvbm5lY3Rpb25fZXN0YWJsaXNoZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9DT05ORUNUSU9OX0VTVEFCTElTSEVECisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfaWRfY29ubmVjdGlvbl9mYWlsdXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0NPTk5FQ1RJT05fRkFJTFVSRQorI2RlZmluZSBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2lkX2Rkcl90ZXN0X2NvbXBsZXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9ERFJfVEVTVF9DT01QTEVURQorI2RlZmluZSBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2lkX2RldmljZV9rZWVwX2FsaXZlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9ERVZJQ0VfS0VFUF9BTElWRQorI2RlZmluZSBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2lkX2RldmljZV9yZWFkeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9ERVZJQ0VfUkVBRFkKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9hdXRvX2NmZ19pZF9kaXNjb25uZWN0aW9uX2NvbXBsZXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfRElTQ09OTkVDVElPTl9DT01QTEVURQorI2RlZmluZSBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2lkX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9JTUFHRV9UUkFOU0ZFUl9DT01QTEVURQorI2RlZmluZSBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2lkX2luZGljYXRpb25zX2Ryb3BwZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9JTkRJQ0FUSU9OU19EUk9QUEVECisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfaWRfc3dfZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX1NXX0VSUk9SCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfaWRfc3dfZXhjZXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX1NXX0VYQ0VQVElPTgorI2RlZmluZSBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfY29ubmVjdF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0NPTk5FQ1RfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGV2aWNlX2Rpc2Nvbm5lY3RfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9ESVNDT05ORUNUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfaWRfc2VxdWVuY2VfbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfSE9TVF9LRUVQX0FMSVZFX0lEX1NFUVVFTkNFX05VTUJFUgorI2RlZmluZSBiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9pZF90aW1lX3N0YW1wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9IT1NUX0tFRVBfQUxJVkVfSURfVElNRV9TVEFNUAorI2RlZmluZSBiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9IT1NUX0tFRVBfQUxJVkVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfaWRfYmxvY2tfbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9EQVRBX0lEX0JMT0NLX05VTUJFUgorI2RlZmluZSBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfaWRfbW9yZV9kYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9EQVRBX0lEX01PUkVfREFUQQorI2RlZmluZSBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfaWRfZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9EQVRBX0lEX0RBVEEKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfREFUQV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfaWRfaW1hZ2VfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX1NUQVJUX0lEX0lNQUdFX1RZUEUKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9pZF9pbWFnZV9zaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfU1RBUlRfSURfSU1BR0VfU0laRQorI2RlZmluZSBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2lkX2NyYzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9TVEFSVF9JRF9DUkMzMgorI2RlZmluZSBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2lkX2ltYWdlX25hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9TVEFSVF9JRF9JTUFHRV9OQU1FCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX1NUQVJUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9yZXNldF9pZF9tb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfUkVTRVRfSURfTU9ERQorI2RlZmluZSBiY21vbHRfZGV2aWNlX3Jlc2V0X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9SRVNFVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2lkX2NwdSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX1JVTl9ERFJfVEVTVF9JRF9DUFUKKyNkZWZpbmUgYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfaWRfcmFzXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9ERVZJQ0VfUlVOX0REUl9URVNUX0lEX1JBU18wCisjZGVmaW5lIGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2lkX3Jhc18xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfREVWSUNFX1JVTl9ERFJfVEVTVF9JRF9SQVNfMQorI2RlZmluZSBiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9SVU5fRERSX1RFU1RfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZGV2aWNlX3N3X3VwZ3JhZGVfYWN0aXZhdGVfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0RFVklDRV9TV19VUEdSQURFX0FDVElWQVRFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5X2lkX2Vwb25fbmkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0tFWV9JRF9FUE9OX05JCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleV9pZF9tYWNfYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19LRVlfSURfTUFDX0FERFJFU1MKKyNkZWZpbmUgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19pZF9hbGFybV9zdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19DRkdfSURfQUxBUk1fU1RBVEUKKyNkZWZpbmUgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25faWRfYWxhcm1fc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19MQVNFUl9PTl9PRkZfVklPTEFUSU9OX0lEX0FMQVJNX1NUQVRVUworI2RlZmluZSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfTEFTRVJfT05fT0ZGX1ZJT0xBVElPTl9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb25faWRfYWxhcm1fc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19MTElEX1BPT0xfRU1QVFlfVklPTEFUSU9OX0lEX0FMQVJNX1NUQVRVUworI2RlZmluZSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfTExJRF9QT09MX0VNUFRZX1ZJT0xBVElPTl9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9pZF9hbGFybV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19NQVhfTElOS19WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19NQVhfTElOS19WSU9MQVRJT05fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9pZF9hbGFybV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfT1ZFUkhFQURfUFJPRklMRV9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19PVkVSSEVBRF9QUk9GSUxFX1ZJT0xBVElPTl9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9pZF9hbGFybV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19SQU5HRV9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19SQU5HRV9WSU9MQVRJT05fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25faWRfYWxhcm1fc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfUk9HVUVfVklPTEFUSU9OX0lEX0FMQVJNX1NUQVRVUworI2RlZmluZSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25faWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfUk9HVUVfVklPTEFUSU9OX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9pZF9hbGFybV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1NZU1RFTV9SRVNPVVJDRV9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25faWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19TWVNURU1fUkVTT1VSQ0VfVklPTEFUSU9OX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9pZF9hbGFybV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1RETV9DSEFOTkVMU19FWEhBVVNURURfSURfQUxBUk1fU1RBVFVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19URE1fQ0hBTk5FTFNfRVhIQVVTVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9pZF9hbGFybV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1VOS05PV05fTElOS19WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb25faWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19VTktOT1dOX0xJTktfVklPTEFUSU9OX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbl9pZF9hbGFybV9zdGF0dXMgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1VQU1RSRUFNX0JBTkRXSURUSF9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25faWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19VUFNUUkVBTV9CQU5EV0lEVEhfVklPTEFUSU9OX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfaWRfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX0xBU0VSX09OX09GRl9WSU9MQVRJT04KKyNkZWZpbmUgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfaWRfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX0xMSURfUE9PTF9FTVBUWV9WSU9MQVRJT04KKyNkZWZpbmUgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfaWRfbWF4X2xpbmtfdmlvbGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX01BWF9MSU5LX1ZJT0xBVElPTgorI2RlZmluZSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19pZF9vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfT1ZFUkhFQURfUFJPRklMRV9WSU9MQVRJT04KKyNkZWZpbmUgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfaWRfcmFuZ2VfdmlvbGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX1JBTkdFX1ZJT0xBVElPTgorI2RlZmluZSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19pZF9yb2d1ZV92aW9sYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfUk9HVUVfVklPTEFUSU9OCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2lkX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9TWVNURU1fUkVTT1VSQ0VfVklPTEFUSU9OCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2lkX3RkbV9jaGFubmVsc19leGhhdXN0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9URE1fQ0hBTk5FTFNfRVhIQVVTVEVECisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2lkX3Vua25vd25fbGlua192aW9sYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9VTktOT1dOX0xJTktfVklPTEFUSU9OCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2lkX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb24gICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9VUFNUUkVBTV9CQU5EV0lEVEhfVklPTEFUSU9OCisjZGVmaW5lIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2lkX2Vwb25fbmkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9FUE9OX05JCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2lkX21hY19hZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9NQUNfQUREUkVTUworI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2tleV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2NmZ19pZF9saW5rX3JhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19DRkdfSURfTElOS19SQVRFCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2lkX3N0YXRlX2ZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9TVEFURV9GTEFHUworI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2NmZ19pZF9sbGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19DRkdfSURfTExJRAorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2NmZ19pZF9sYXNlcl9vbl90aW1lX3RxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19DRkdfSURfTEFTRVJfT05fVElNRV9UUQorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2NmZ19pZF9sYXNlcl9vZmZfdGltZV90cSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19DRkdfSURfTEFTRVJfT0ZGX1RJTUVfVFEKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19jZmdfaWRfcmFuZ2VfdmFsdWVfdHEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1JBTkdFX1ZBTFVFX1RRCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2lkX2Rpc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9ESVNUQU5DRQorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2NmZ19pZF9hbGFybV9zdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19DRkdfSURfQUxBUk1fU1RBVEUKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19jZmdfaWRfdHVubmVsX2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1RVTk5FTF9JRAorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2NmZ19pZF9vbnVfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19DRkdfSURfT05VX0lECisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2lkX21pbl9sYXNlcl9vdmVyaGVhZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9NSU5fTEFTRVJfT1ZFUkhFQUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19jZmdfaWRfa2V5X2V4Y2hhbmdlX2NvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0tFWV9FWENIQU5HRV9DT05GSUcKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19jZmdfaWRfZXBvbl9lbmNyeXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0VQT05fRU5DUllQVElPTgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2NmZ19pZF9mZWNfZW5hYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19DRkdfSURfRkVDX0VOQUJMRQorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2NmZ19pZF9vYW1faGVhcnRiZWF0X2NvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19DRkdfSURfT0FNX0hFQVJUQkVBVF9DT05GSUcKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19jZmdfaWRfdXBzdHJlYW1fYmFuZHdpZHRoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1VQU1RSRUFNX0JBTkRXSURUSAorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2NmZ19pZF91YmRfaW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19DRkdfSURfVUJEX0lORk8KKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19jZmdfaWRfY2xvY2tfdHJhbnNwb3J0X2VuYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0NMT0NLX1RSQU5TUE9SVF9FTkFCTEUKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19jZmdfaWRfcGVuZGluZ19ncmFudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1BFTkRJTkdfR1JBTlRTCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2lkX2xpbmtfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9MSU5LX1RZUEUKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkX3J4X2RhdGFfYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9EQVRBX0JZVEVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZF9yeF9kYXRhX2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfREFUQV9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkX3J4X2ZyYW1lc182NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfNjQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkX3J4X2ZyYW1lc182NV8xMjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfNjVfMTI3CisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZF9yeF9mcmFtZXNfMTI4XzI1NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzEyOF8yNTUKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkX3J4X2ZyYW1lc18yNTZfNTExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfMjU2XzUxMQorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3N0YXRfaWRfcnhfZnJhbWVzXzUxMl8xMDIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU181MTJfMTAyMworI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3N0YXRfaWRfcnhfZnJhbWVzXzEwMjRfMTUxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18xMDI0XzE1MTgKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkX3J4X2ZyYW1lc18xNTE5XzIwNDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfMTUxOV8yMDQ3CisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZF9yeF9mcmFtZXNfMjA0OF80MDk1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzIwNDhfNDA5NQorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3N0YXRfaWRfcnhfZnJhbWVzXzQwOTZfOTIxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU180MDk2XzkyMTYKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkX3J4X2ZyYW1lc185MjE3XzE2MzgzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfOTIxN18xNjM4MworI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3N0YXRfaWRfcnhfb2FtX2J5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX09BTV9CWVRFUworI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3N0YXRfaWRfcnhfb2FtX2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX09BTV9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkX3J4X21wY3BfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9NUENQX0ZSQU1FUworI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3N0YXRfaWRfcnhfYnJvYWRjYXN0X2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0JST0FEQ0FTVF9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkX3J4X3VuaWNhc3RfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9VTklDQVNUX0ZSQU1FUworI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3N0YXRfaWRfcnhfbXVsdGljYXN0X2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX01VTFRJQ0FTVF9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkX3J4X3JlcG9ydF9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9SRVBPUlRfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZF9yeF9mY3NfZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRkNTX0VSUk9SCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZF9yeF9vdmVyc2l6ZV9lcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfT1ZFUlNJWkVfRVJST1IKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkX3J4X3J1bnRfZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9SVU5UX0VSUk9SCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZF9yeF9saW5lX2NvZGVfZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfTElORV9DT0RFX0VSUk9SCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZF9yeF9saW5lX2NvZGVfZXJyb3JfbWF4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfTElORV9DT0RFX0VSUk9SX01BWAorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3N0YXRfaWRfdHhfZGF0YV9ieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0RBVEFfQllURVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkX3R4X2RhdGFfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9EQVRBX0ZSQU1FUworI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3N0YXRfaWRfdHhfZnJhbWVzXzY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU182NAorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3N0YXRfaWRfdHhfZnJhbWVzXzY1XzEyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU182NV8xMjcKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkX3R4X2ZyYW1lc18xMjhfMjU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMTI4XzI1NQorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3N0YXRfaWRfdHhfZnJhbWVzXzI1Nl81MTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18yNTZfNTExCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZF90eF9mcmFtZXNfNTEyXzEwMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzUxMl8xMDIzCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZF90eF9mcmFtZXNfMTAyNF8xNTE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzEwMjRfMTUxOAorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3N0YXRfaWRfdHhfZnJhbWVzXzE1MTlfMjA0NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18xNTE5XzIwNDcKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkX3R4X2ZyYW1lc18yMDQ4XzQwOTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMjA0OF80MDk1CisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZF90eF9mcmFtZXNfNDA5Nl85MjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzQwOTZfOTIxNgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3N0YXRfaWRfdHhfZnJhbWVzXzkyMTdfMTYzODMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU185MjE3XzE2MzgzCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZF90eF9vYW1fYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfT0FNX0JZVEVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZF90eF9vYW1fZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfT0FNX0ZSQU1FUworI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3N0YXRfaWRfdHhfbXBjcF9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX01QQ1BfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZF90eF9icm9hZGNhc3RfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfQlJPQURDQVNUX0ZSQU1FUworI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3N0YXRfaWRfdHhfdW5pY2FzdF9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX1VOSUNBU1RfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZF90eF9tdWx0aWNhc3RfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfTVVMVElDQVNUX0ZSQU1FUworI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3N0YXRfaWRfdHhfZ2F0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0dBVEVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnX2lkX2NmZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0NGR19JRF9DRkcKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2lkX2luaXRpYWxfcmFuZ2VfdHEgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19EVVBMSUNBVEVfTVBDUF9SRUdJU1RSQVRJT05fUkVRVUVTVF9JRF9JTklUSUFMX1JBTkdFX1RRCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfaWRfY3VycmVudF9yYW5nZV90cSAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0RVUExJQ0FURV9NUENQX1JFR0lTVFJBVElPTl9SRVFVRVNUX0lEX0NVUlJFTlRfUkFOR0VfVFEKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfRFVQTElDQVRFX01QQ1BfUkVHSVNUUkFUSU9OX1JFUVVFU1RfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2VuY3J5cHRpb25fZW5hYmxlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19FTkNSWVBUSU9OX0VOQUJMRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2lkX2FsYXJtX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19LRVlfRVhDSEFOR0VfRkFJTFVSRV9JRF9BTEFSTV9TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfS0VZX0VYQ0hBTkdFX0ZBSUxVUkVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19LRVlfRVhDSEFOR0VfU1RBUlRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BwZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0tFWV9FWENIQU5HRV9TVE9QUEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19saW5rX2RlbGV0ZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfTElOS19ERUxFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2lkX3ByZXZpb3VzX3JhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfTElOS19TUEVFRF9NSVNNQVRDSF9JRF9QUkVWSU9VU19SQVRFCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9pZF9jdXJyZW50X3JhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0xJTktfU1BFRURfTUlTTUFUQ0hfSURfQ1VSUkVOVF9SQVRFCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0xJTktfU1BFRURfTUlTTUFUQ0hfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX21wY3BfZGVyZWdpc3RlcmVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19NUENQX0RFUkVHSVNURVJFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2lkX2xpbmtfaW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX01QQ1BfRElTQ09WRVJFRF9JRF9MSU5LX0lORk8KKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfTVBDUF9ESVNDT1ZFUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlZ19hY2tfdGltZW91dF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfTVBDUF9SRUdfQUNLX1RJTUVPVVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfaWRfYWxhcm1fc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19NUENQX1JFUE9SVF9USU1FT1VUX0lEX0FMQVJNX1NUQVRVUworI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19NUENQX1JFUE9SVF9USU1FT1VUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfaWRfYWxhcm1fc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfT0FNX0tFRVBBTElWRV9USU1FT1VUX0lEX0FMQVJNX1NUQVRVUworI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19PQU1fS0VFUEFMSVZFX1RJTUVPVVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19PQU1fS0VFUEFMSVZFX1RJTUVSX1NUQVJURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19PQU1fS0VFUEFMSVZFX1RJTUVSX1NUT1BQRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9pZF9saW5rX2luZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19QUkVQUk9WSVNJT05FRF9MSU5LX0NSRUFURURfSURfTElOS19JTkZPCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1BSRVBST1ZJU0lPTkVEX0xJTktfQ1JFQVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfaWRfcHJvdGVjdGlvbl9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1BST1RFQ1RJT05fU1dJVENIX09DQ1VSUkVEX0lEX1BST1RFQ1RJT05fU1RBVFVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfaWRfcmFuZ2VfdmFsdWVfdHEgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1BST1RFQ1RJT05fU1dJVENIX09DQ1VSUkVEX0lEX1JBTkdFX1ZBTFVFX1RRCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1BST1RFQ1RJT05fU1dJVENIX09DQ1VSUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2lkX3JhbmdlX3ZhbHVlX3RxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfUkFOR0VfVkFMVUVfQ0hBTkdFRF9JRF9SQU5HRV9WQUxVRV9UUQorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19SQU5HRV9WQUxVRV9DSEFOR0VEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19yZXJhbmdlX2ZhaWx1cmVfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfUkVSQU5HRV9GQUlMVVJFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVAorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19TVEFUX0FMQVJNX1JBSVNFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRJQ19SRUdJU1RSQVRJT05fRE9ORV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfaWRfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3QgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0RVUExJQ0FURV9NUENQX1JFR0lTVFJBVElPTl9SRVFVRVNUCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfaWRfZW5jcnlwdGlvbl9lbmFibGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0VOQ1JZUFRJT05fRU5BQkxFRAorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2lkX2tleV9leGNoYW5nZV9mYWlsdXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfRkFJTFVSRQorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2lkX2tleV9leGNoYW5nZV9zdGFydGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfU1RBUlRFRAorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2lkX2tleV9leGNoYW5nZV9zdG9wcGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfU1RPUFBFRAorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2lkX2xpbmtfZGVsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9MSU5LX0RFTEVURUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19pZF9saW5rX3NwZWVkX21pc21hdGNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTElOS19TUEVFRF9NSVNNQVRDSAorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2lkX21wY3BfZGVyZWdpc3RlcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9NUENQX0RFUkVHSVNURVJFRAorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2lkX21wY3BfZGlzY292ZXJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9NUENQX0RJU0NPVkVSRUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19pZF9tcGNwX3JlZ19hY2tfdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTVBDUF9SRUdfQUNLX1RJTUVPVVQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19pZF9tcGNwX3JlcG9ydF90aW1lb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTVBDUF9SRVBPUlRfVElNRU9VVAorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2lkX29hbV9rZWVwYWxpdmVfdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9PQU1fS0VFUEFMSVZFX1RJTUVPVVQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19pZF9vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfT0FNX0tFRVBBTElWRV9USU1FUl9TVEFSVEVECisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfaWRfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX09BTV9LRUVQQUxJVkVfVElNRVJfU1RPUFBFRAorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2lkX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9QUkVQUk9WSVNJT05FRF9MSU5LX0NSRUFURUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19pZF9wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hfT0NDVVJSRUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19pZF9yYW5nZV92YWx1ZV9jaGFuZ2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfUkFOR0VfVkFMVUVfQ0hBTkdFRAorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2lkX3JlcmFuZ2VfZmFpbHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9SRVJBTkdFX0ZBSUxVUkUKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19pZF9zdGF0X2FsYXJtX2NsZWFyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVECisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfaWRfc3RhdF9hbGFybV9yYWlzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VECisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfaWRfc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX1NUQVRJQ19SRUdJU1RSQVRJT05fRE9ORQorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfZGVsZXRlX2xpbmtfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0RFTEVURV9MSU5LX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19mb3JjZV9yZWRpc2NvdmVyeV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfRk9SQ0VfUkVESVNDT1ZFUllfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9pZF9wZXJpb2QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19LRVlfRVhDSEFOR0VfU1RBUlRfSURfUEVSSU9ECisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0tFWV9FWENIQU5HRV9TVEFSVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0tFWV9FWENIQU5HRV9TVE9QX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2lkX3NlbmRfcGVyaW9kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfT0FNX0tFRVBBTElWRV9USU1FUl9TVEFSVF9JRF9TRU5EX1BFUklPRAorI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19PQU1fS0VFUEFMSVZFX1RJTUVSX1NUQVJUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfT0FNX0tFRVBBTElWRV9USU1FUl9TVE9QX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2lkX2xhc2Vyb25fdGltZV90cSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVElDX1JFR0lTVFJBVElPTl9JRF9MQVNFUk9OX1RJTUVfVFEKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2lkX2xhc2Vyb2ZmX3RpbWVfdHEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVElDX1JFR0lTVFJBVElPTl9JRF9MQVNFUk9GRl9USU1FX1RRCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9pZF9yYW5nZV92YWx1ZV90cSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX1NUQVRJQ19SRUdJU1RSQVRJT05fSURfUkFOR0VfVkFMVUVfVFEKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2lkX3BlbmRpbmdfZ3JhbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfU1RBVElDX1JFR0lTVFJBVElPTl9JRF9QRU5ESU5HX0dSQU5UUworI2RlZmluZSBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25faWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTElOS19TVEFUSUNfUkVHSVNUUkFUSU9OX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfaWRfZnJhbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX0xJTktfSU5KRUNUX0ZSQU1FX0lEX0ZSQU1FCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0lOSkVDVF9GUkFNRV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfaWRfZnJhbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0ZSQU1FX0NBUFRVUkVEX0lEX0ZSQU1FCisjZGVmaW5lIGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9MSU5LX0ZSQU1FX0NBUFRVUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfa2V5X2lkX2Vwb25fbmkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0tFWV9JRF9FUE9OX05JCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2tleV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9jZmdfaWRfbWFjX2FkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01BQ19BRERSRVNTCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2NmZ19pZF9lcG9uX25pX2VuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRVBPTl9OSV9FTgorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9jZmdfaWRfcmVnaXN0cmF0aW9uX2JlaGF2aW9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX1JFR0lTVFJBVElPTl9CRUhBVklPUgorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9jZmdfaWRfbXR1XzFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01UVV8xRworI2RlZmluZSBiY21vbHRfZXBvbl9uaV9jZmdfaWRfbXR1XzEwZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01UVV8xMEcKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfY2ZnX2lkX21pbmltdW1fZmliZXJfbGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0NGR19JRF9NSU5JTVVNX0ZJQkVSX0xFTkdUSAorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9jZmdfaWRfbWF4aW11bV9maWJlcl9sZW5ndGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01BWElNVU1fRklCRVJfTEVOR1RICisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2NmZ19pZF9ncmFudF9zcGFjaW5nX3RxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9DRkdfSURfR1JBTlRfU1BBQ0lOR19UUQorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9jZmdfaWRfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0VQT05fTE9HSUNBTF9MSU5LX09QVElPTlMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfY2ZnX2lkX21wY3BfZGlzY292ZXJ5X3BlcmlvZF9tcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0NGR19JRF9NUENQX0RJU0NPVkVSWV9QRVJJT0RfTVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfY2ZnX2lkX2FsYXJtX3N0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0NGR19JRF9BTEFSTV9TVEFURQorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9jZmdfaWRfYWxsX2xpbmtzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FMTF9MSU5LUworI2RlZmluZSBiY21vbHRfZXBvbl9uaV9jZmdfaWRfZW5jcnlwdGlvbl9jZmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0VOQ1JZUFRJT05fQ0ZHCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2NmZ19pZF9wcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfQ0ZHCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2NmZ19pZF9jbG9ja190cmFuc3BvcnRfY2ZnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQ0xPQ0tfVFJBTlNQT1JUX0NGRworI2RlZmluZSBiY21vbHRfZXBvbl9uaV9jZmdfaWRfZHJvcGRvd25fd2VpZ2h0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0RST1BET1dOX1dFSUdIVFMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfY2ZnX2lkX2FwcHJveGltYXRlX3NvbGljaXRlZF91c2FnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0NGR19JRF9BUFBST1hJTUFURV9TT0xJQ0lURURfVVNBR0UKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfY2ZnX2lkX2FwcHJveGltYXRlX3RkbV91c2FnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0NGR19JRF9BUFBST1hJTUFURV9URE1fVVNBR0UKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfY2ZnX2lkX25vX3JlcG9ydHNfc29ha190aW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0NGR19JRF9OT19SRVBPUlRTX1NPQUtfVElNRQorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9jZmdfaWRfcG9uX2FnZ3JlZ2F0ZV9zaGFwZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX1BPTl9BR0dSRUdBVEVfU0hBUEVSCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2NmZ19pZF9lc3RpbWF0ZWRfcG9uX2xhdGVuY3lfdHEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRVNUSU1BVEVEX1BPTl9MQVRFTkNZX1RRCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2NmZ19pZF9vbnVfdXBncmFkZV9wYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9DRkdfSURfT05VX1VQR1JBREVfUEFSQU1TCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2NmZ19pZF9hdXRvX3JvZ3VlX2RldGVjdF8xMGdfZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQVVUT19ST0dVRV9ERVRFQ1RfMTBHX0VOCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2NmZ19pZF9hdXRvX3JvZ3VlX2RldGVjdF8xZ19lbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQVVUT19ST0dVRV9ERVRFQ1RfMUdfRU4KKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfY2ZnX2lkX2F1dG9fcm9ndWVfZGV0ZWN0XzEwZ190aHJlc2hvbGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0NGR19JRF9BVVRPX1JPR1VFX0RFVEVDVF8xMEdfVEhSRVNIT0xECisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmVfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfQVVUT19ST0dVRV9TQ0FOXzEwR19GQUlMVVJFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmVfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0FVVE9fUk9HVUVfU0NBTl8xR19GQUlMVVJFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9pZF9sbGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0xMSURfUVVBUkFOVElORURfSURfTExJRAorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2lkX2xpbmtfcmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfTExJRF9RVUFSQU5USU5FRF9JRF9MSU5LX1JBVEUKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9pZF9saW5rX21hYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0xMSURfUVVBUkFOVElORURfSURfTElOS19NQUMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9pZF9yYW5nZV92YWx1ZV90cSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0xMSURfUVVBUkFOVElORURfSURfUkFOR0VfVkFMVUVfVFEKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0xMSURfUVVBUkFOVElORURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2lkX21wY3BfdGltZXN0YW1wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfTVBDUF9USU1FU1RBTVBfQ0hBTkdFRF9JRF9NUENQX1RJTUVTVEFNUAorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfTVBDUF9USU1FU1RBTVBfQ0hBTkdFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfaWRfYWxhcm1fc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9OT19SRVBPUlRTX0lEX0FMQVJNX1NUQVRVUworI2RlZmluZSBiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfTk9fUkVQT1JUU19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9PTlVfVVBHUkFERV9DT01QTEVURV9JRF9TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWRfbGlzdF9vZl9mYWlsZWRfZW50aXRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX0xJU1RfT0ZfRkFJTEVEX0VOVElUSUVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9PTlVfVVBHUkFERV9DT01QTEVURV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX3JlcmFuZ2VfZmFpbHVyZV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9SRVJBTkdFX0ZBSUxVUkVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2lkX3JldHVybl9pbmRfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfUk9HVUVfU0NBTl9DT01QTEVURV9JRF9SRVRVUk5fSU5EX1NUQVRVUworI2RlZmluZSBiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfUk9HVUVfU0NBTl9DT01QTEVURV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWRfbGxpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX0xMSUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWRfbGlua19tYWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX0xJTktfTUFDCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWRfbmV3X3N0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX05FV19TVEFURQorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2lkX2F1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9BVVRPX1JPR1VFX1NDQU5fMTBHX0ZBSUxVUkUKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfaWRfYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX0FVVE9fUk9HVUVfU0NBTl8xR19GQUlMVVJFCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2lkX2xsaWRfcXVhcmFudGluZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9MTElEX1FVQVJBTlRJTkVECisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2lkX21wY3BfdGltZXN0YW1wX2NoYW5nZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9NUENQX1RJTUVTVEFNUF9DSEFOR0VECisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2lkX25vX3JlcG9ydHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9OT19SRVBPUlRTCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2lkX29udV91cGdyYWRlX2NvbXBsZXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9PTlVfVVBHUkFERV9DT01QTEVURQorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19pZF9yZXJhbmdlX2ZhaWx1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfUkVSQU5HRV9GQUlMVVJFCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2lkX3JvZ3VlX3NjYW5fY29tcGxldGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9ST0dVRV9TQ0FOX0NPTVBMRVRFCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2lkX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19pZF9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9hZGRfbGlua19pZF9tYWNfYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfQUREX0xJTktfSURfTUFDX0FERFJFU1MKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfaWRfcmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0FERF9MSU5LX0lEX1JBVEUKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0FERF9MSU5LX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2lkX21hY19hZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0FERF9NVUxUSUNBU1RfTElOS19JRF9NQUNfQUREUkVTUworI2RlZmluZSBiY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfaWRfcmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfQUREX01VTFRJQ0FTVF9MSU5LX0lEX1JBVEUKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0FERF9NVUxUSUNBU1RfTElOS19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2lkX21hY19hZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9BRERfUFJPVEVDVEVEX1NUQU5EQllfTElOS19JRF9NQUNfQUREUkVTUworI2RlZmluZSBiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19pZF93b3JraW5nX2xpbmtfaW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfQUREX1BST1RFQ1RFRF9TVEFOREJZX0xJTktfSURfV09SS0lOR19MSU5LX0lORk8KKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0FERF9QUk9URUNURURfU1RBTkRCWV9MSU5LX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9pZF9ncmFudGVkX2xpbmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0lTU1VFX1JTU0lfR1JBTlRfSURfR1JBTlRFRF9MSU5LCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfaWRfdHJpZ2dlcl93aWR0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX1RSSUdHRVJfV0lEVEgKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9pZF90cmlnZ2VyX2RlbGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX0lTU1VFX1JTU0lfR1JBTlRfSURfVFJJR0dFUl9ERUxBWQorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2lkX3NhbXBsZV9wZXJpb2QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfSVNTVUVfUlNTSV9HUkFOVF9JRF9TQU1QTEVfUEVSSU9ECisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YV9pZF9yZXJhbmdlX2RlbHRhICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX0FQUExZX1JFUkFOR0VfREVMVEFfSURfUkVSQU5HRV9ERUxUQQorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfQVBQTFlfUkVSQU5HRV9ERUxUQV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9pZF9tb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9ST0dVRV9MTElEX1NDQU5fSURfTU9ERQorI2RlZmluZSBiY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW5faWRfbGxpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfUk9HVUVfTExJRF9TQ0FOX0lEX0xMSUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX1JPR1VFX0xMSURfU0NBTl9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2lkX25ld19zdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9OSV9TRVRfRVBPTl9OSV9FTl9TVEFURV9JRF9ORVdfU1RBVEUKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX1NFVF9FUE9OX05JX0VOX1NUQVRFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWRfbGlzdF9vZl9vbnVfaWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX05JX1NUQVJUX09OVV9VUEdSQURFX0lEX0xJU1RfT0ZfT05VX0lEUworI2RlZmluZSBiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fTklfU1RBUlRfT05VX1VQR1JBREVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleV9pZF9lcG9uX25pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzEwR19VU19LRVlfSURfRVBPTl9OSQorI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleV9pZF9vbnVfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzEwR19VU19LRVlfSURfT05VX0lECisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2lkX2FsbF9saW5rcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0NGR19JRF9BTExfTElOS1MKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2lkX2ZlY19jb2RlX3dvcmRzX3RvdGFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9JRF9GRUNfQ09ERV9XT1JEU19UT1RBTAorI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfaWRfZmVjX2NvZGVfd29yZHNfZGVjb2RlX2ZhaWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19DT0RFX1dPUkRTX0RFQ09ERV9GQUlMUworI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfaWRfZmVjX3plcm9lc19jb3JyZWN0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19aRVJPRVNfQ09SUkVDVEVECisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9pZF9mZWNfb25lc19jb3JyZWN0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfRkVDX09ORVNfQ09SUkVDVEVECisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2lkX2NmZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0NGR19JRF9DRkcKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVAorI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0YXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUCisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19pZF9zdGF0X2FsYXJtX2NsZWFyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVECisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfaWRfc3RhdF9hbGFybV9yYWlzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VECisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0FVVE9fQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleV9pZF9lcG9uX25pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19LRVlfSURfRVBPTl9OSQorI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5X2lkX29udV9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzFHX1VTX0tFWV9JRF9PTlVfSUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2lkX2FsbF9saW5rcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzFHX1VTX0NGR19JRF9BTExfTElOS1MKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9pZF9nb29kX2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfR09PRF9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfaWRfZ29vZF9ieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0dPT0RfQllURVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfaWRfb3ZlcnN6X2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX09WRVJTWl9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfaWRfbm9uX2ZlY19nb29kX2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX05PTl9GRUNfR09PRF9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfaWRfbm9uX2ZlY19nb29kX2J5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX05PTl9GRUNfR09PRF9CWVRFUworI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9pZF9mZWNfZ29vZF9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0dPT0RfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2lkX2ZlY19nb29kX2J5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfR09PRF9CWVRFUworI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9pZF9mZWNfZnJhbWVzX2V4Y19lcnJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0ZSQU1FU19FWENfRVJSUworI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9pZF9mZWNfYmxrc19ub19lcnJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0JMS1NfTk9fRVJSUworI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9pZF9mZWNfYmxrc19jb3JyX2VycnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0JMS1NfQ09SUl9FUlJTCisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2lkX2ZlY19ibGtzX3VuY29ycl9lcnJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQkxLU19VTkNPUlJfRVJSUworI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9pZF9mZWNfY29ycl9ieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0NPUlJfQllURVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfaWRfZmVjX2NvcnJfemVyb2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19DT1JSX1pFUk9FUworI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9pZF9mZWNfY29ycl9vbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0NPUlJfT05FUworI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9pZF91bmRlcnN6X2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfVU5ERVJTWl9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfaWRfZXJyb3Jzel9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0VSUk9SU1pfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19pZF9jZmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9DRkdfSURfQ0ZHCisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0YXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUCisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0YXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUCisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9BTEFSTV9SQUlTRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfaWRfc3RhdF9hbGFybV9jbGVhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzFHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRAorI2RlZmluZSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfaWRfc3RhdF9hbGFybV9yYWlzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT05VXzFHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VECisjZGVmaW5lIGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQVVUT19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXlfaWRfZXBvbl9uaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfS0VZX0lEX0VQT05fTkkKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19pZF9mZWNfc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19DRkdfSURfRkVDX1NUQVRFCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19pZF9wcmJzX2dlbmVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19DRkdfSURfUFJCU19HRU5FUkFUT1IKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfaWRfYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0JZVEVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfaWRfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FUworI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2lkX2ZyYW1lc182NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNjQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9pZF9mcmFtZXNfNjVfMTI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzY1XzEyNworI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2lkX2ZyYW1lc18xMjhfMjU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NQorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2lkX2ZyYW1lc18yNTZfNTExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMQorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2lkX2ZyYW1lc181MTJfMTAyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9pZF9mcmFtZXNfMTAyNF8xNTE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxOAorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2lkX2ZyYW1lc18xNTE5XzIwNDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3CisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfaWRfZnJhbWVzXzIwNDhfNDA5NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTUKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9pZF9mcmFtZXNfNDA5Nl85MjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2lkX2ZyYW1lc185MjE3XzE2MzgzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MworI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2lkX2Jyb2FkY2FzdF9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfaWRfZGF0YV9ieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0RBVEFfQllURVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9pZF9tdWx0aWNhc3RfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUworI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2lkX3VuaWNhc3RfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUworI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2lkX29hbV9ieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9PQU1fQllURVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9pZF9vYW1fZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfT0FNX0ZSQU1FUworI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2lkX2dhdGVfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9HQVRFX0ZSQU1FUworI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2lkX21wY3BfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9NUENQX0ZSQU1FUworI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2lkX2Fib3J0X2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9BQk9SVF9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19pZF9jZmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9DRkdfSURfQ0ZHCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVAorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfaWRfc3RhdF9hbGFybV9jbGVhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRAorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19pZF9zdGF0X2FsYXJtX3JhaXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0FVVE9fQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5X2lkX2Vwb25fbmkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0tFWV9JRF9FUE9OX05JCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfaWRfZmVjX3N0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX0ZFQ19TVEFURQorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfaWRfc3luY190aW1lX3RxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX1NZTkNfVElNRV9UUQorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfaWRfcHJic19jaGVja2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfaWRfcHJic19zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX1BSQlNfU1RBVFVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2lkX2J5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9CWVRFUworI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2lkX2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZF9mcmFtZXNfNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzY0CisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfaWRfZnJhbWVzXzY1XzEyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU182NV8xMjcKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZF9mcmFtZXNfMTI4XzI1NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTUKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZF9mcmFtZXNfMjU2XzUxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTEKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZF9mcmFtZXNfNTEyXzEwMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfaWRfZnJhbWVzXzEwMjRfMTUxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTgKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZF9mcmFtZXNfMTUxOV8yMDQ3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NworI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2lkX2ZyYW1lc18yMDQ4XzQwOTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1CisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfaWRfZnJhbWVzXzQwOTZfOTIxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTYKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZF9mcmFtZXNfOTIxN18xNjM4MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZF9icm9hZGNhc3RfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUworI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2lkX2RhdGFfYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9EQVRBX0JZVEVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfaWRfbXVsdGljYXN0X2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZF91bmljYXN0X2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZF9tcGNwX2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfTVBDUF9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZF9vYW1fYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfT0FNX0JZVEVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfaWRfb2FtX2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX09BTV9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZF9yZXBvcnRfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfUkVQT1JUX0ZSQU1FUworI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2lkX2Fib3J0X2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9BQk9SVF9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZF9mY3NfZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRkNTX0VSUk9SCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfaWRfY3JjXzhfZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0NSQ184X0VSUk9SCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfaWRfb3V0X29mX3Nsb3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX09VVF9PRl9TTE9UCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfaWRfb3ZlcnNpemVfZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX09WRVJTSVpFX0VSUk9SCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfaWRfcnVudF9lcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX1JVTlRfRVJST1IKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19pZF9jZmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfSURfQ0ZHCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVAorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfaWRfc3RhdF9hbGFybV9jbGVhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRAorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19pZF9zdGF0X2FsYXJtX3JhaXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0FVVE9fQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXlfaWRfZXBvbl9uaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfS0VZX0lEX0VQT05fTkkKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXlfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfaWRfZGVmYXVsdF9mZWNfc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQ0ZHX0lEX0RFRkFVTFRfRkVDX1NUQVRFCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2lkX3JhbWFuX21vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9SQU1BTl9NT0RFCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2lkX3R1cmJvXzJnX21vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9UVVJCT18yR19NT0RFCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2lkX3ByYnNfZ2VuZXJhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9QUkJTX0dFTkVSQVRPUgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfaWRfYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0JZVEVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9pZF9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9pZF9mcmFtZXNfNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzY0CisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9pZF9mcmFtZXNfNjVfMTI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzY1XzEyNworI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfaWRfZnJhbWVzXzEyOF8yNTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1CisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9pZF9mcmFtZXNfMjU2XzUxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTEKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2lkX2ZyYW1lc181MTJfMTAyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2lkX2ZyYW1lc18xMDI0XzE1MTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4CisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9pZF9mcmFtZXNfMTUxOV8yMDQ3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NworI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfaWRfZnJhbWVzXzIwNDhfNDA5NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTUKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2lkX2ZyYW1lc180MDk2XzkyMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2CisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9pZF9mcmFtZXNfOTIxN18xNjM4MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2lkX2Jyb2FkY2FzdF9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9pZF9kYXRhX2J5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfREFUQV9CWVRFUworI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfaWRfbXVsdGljYXN0X2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2lkX3VuaWNhc3RfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUworI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfaWRfb2FtX2J5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX09BTV9CWVRFUworI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfaWRfb2FtX2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX09BTV9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2lkX2dhdGVfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9HQVRFX0ZSQU1FUworI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfaWRfbXBjcF9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX01QQ1BfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9pZF9hYm9ydF9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfQUJPUlRfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2lkX2NmZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0NGR19JRF9DRkcKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVAorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0YXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19pZF9zdGF0X2FsYXJtX2NsZWFyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVECisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfaWRfc3RhdF9hbGFybV9yYWlzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VECisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0FVVE9fQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXlfaWRfZXBvbl9uaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfS0VZX0lEX0VQT05fTkkKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXlfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfaWRfZGVmYXVsdF9mZWNfc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQ0ZHX0lEX0RFRkFVTFRfRkVDX1NUQVRFCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2lkX3N5bmNfdGltZV90cSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0NGR19JRF9TWU5DX1RJTUVfVFEKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfaWRfcHJic19jaGVja2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19pZF9wcmJzX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19DRkdfSURfUFJCU19TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2lkX2J5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9CWVRFUworI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWRfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FUworI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWRfZnJhbWVzXzY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU182NAorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWRfZnJhbWVzXzY1XzEyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU182NV8xMjcKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2lkX2ZyYW1lc18xMjhfMjU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NQorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWRfZnJhbWVzXzI1Nl81MTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9pZF9mcmFtZXNfNTEyXzEwMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9pZF9mcmFtZXNfMTAyNF8xNTE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxOAorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWRfZnJhbWVzXzE1MTlfMjA0NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDcKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2lkX2ZyYW1lc18yMDQ4XzQwOTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1CisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9pZF9mcmFtZXNfNDA5Nl85MjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWRfZnJhbWVzXzkyMTdfMTYzODMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9pZF9icm9hZGNhc3RfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUworI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWRfZGF0YV9ieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0RBVEFfQllURVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2lkX211bHRpY2FzdF9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9pZF91bmljYXN0X2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2lkX21wY3BfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9NUENQX0ZSQU1FUworI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWRfb2FtX2J5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX09BTV9CWVRFUworI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWRfb2FtX2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX09BTV9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2lkX3JlcG9ydF9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9SRVBPUlRfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9pZF9hYm9ydF9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfQUJPUlRfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9pZF9mY3NfZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRkNTX0VSUk9SCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9pZF9jcmNfOF9lcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfQ1JDXzhfRVJST1IKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2lkX291dF9vZl9zbG90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9PVVRfT0ZfU0xPVAorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWRfb3ZlcnNpemVfZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX09WRVJTSVpFX0VSUk9SCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9pZF9ydW50X2Vycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfUlVOVF9FUlJPUgorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19pZF9jZmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9DRkdfSURfQ0ZHCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVAorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfaWRfc3RhdF9hbGFybV9jbGVhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRAorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2lkX3N0YXRfYWxhcm1fcmFpc2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRAorI2RlZmluZSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUEFUSF8xR19VU19BVVRPX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9lcG9uX3JwX2tleV9pZF9lcG9uX25pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9SUF9LRVlfSURfRVBPTl9OSQorI2RlZmluZSBiY21vbHRfZXBvbl9ycF9rZXlfaWRfbGlua19yYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUlBfS0VZX0lEX0xJTktfUkFURQorI2RlZmluZSBiY21vbHRfZXBvbl9ycF9rZXlfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUlBfS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcnBfY2ZnX2lkX2Jhc2VfbGxpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1JQX0NGR19JRF9CQVNFX0xMSUQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcnBfY2ZnX2lkX21wY3BfZGlzY19lbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1JQX0NGR19JRF9NUENQX0RJU0NfRU4KKyNkZWZpbmUgYmNtb2x0X2Vwb25fcnBfY2ZnX2lkX21wY3BfZGlzY19nbnRfbGVuX3RxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1JQX0NGR19JRF9NUENQX0RJU0NfR05UX0xFTl9UUQorI2RlZmluZSBiY21vbHRfZXBvbl9ycF9jZmdfaWRfbXBjcF9yZXBvcnRfdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01QQ1BfUkVQT1JUX1RJTUVPVVQKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcnBfY2ZnX2lkX21heF9tcGNwX3JlZ19wZXJfZGlzY193aW5kb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1JQX0NGR19JRF9NQVhfTVBDUF9SRUdfUEVSX0RJU0NfV0lORE9XCisjZGVmaW5lIGJjbW9sdF9lcG9uX3JwX2NmZ19pZF9tYXhfbGlua3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9SUF9DRkdfSURfTUFYX0xJTktTCisjZGVmaW5lIGJjbW9sdF9lcG9uX3JwX2NmZ19pZF9kZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9SUF9DRkdfSURfREVGQVVMVF9VUFNUUkVBTV9CQU5EV0lEVEgKKyNkZWZpbmUgYmNtb2x0X2Vwb25fcnBfY2ZnX2lkX3JhdGVfb2ZfcmVmcmFjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1JQX0NGR19JRF9SQVRFX09GX1JFRlJBQ1RJT04KKyNkZWZpbmUgYmNtb2x0X2Vwb25fcnBfY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX1JQX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncGlvX2tleV9pZF9yZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BJT19LRVlfSURfUkVTRVJWRUQKKyNkZWZpbmUgYmNtb2x0X2dwaW9fa2V5X2lkX2dwaW9faWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUElPX0tFWV9JRF9HUElPX0lECisjZGVmaW5lIGJjbW9sdF9ncGlvX2tleV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BJT19LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bpb19jZmdfaWRfZGlyZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQSU9fQ0ZHX0lEX0RJUkVDVElPTgorI2RlZmluZSBiY21vbHRfZ3Bpb19jZmdfaWRfdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQSU9fQ0ZHX0lEX1ZBTFVFCisjZGVmaW5lIGJjbW9sdF9ncGlvX2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BJT19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9hbGxvY19rZXlfaWRfcG9uX25pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fQUxMT0NfS0VZX0lEX1BPTl9OSQorI2RlZmluZSBiY21vbHRfZ3Bvbl9hbGxvY19rZXlfaWRfYWxsb2NfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fQUxMT0NfS0VZX0lEX0FMTE9DX0lECisjZGVmaW5lIGJjbW9sdF9ncG9uX2FsbG9jX2tleV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9BTExPQ19LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9hbGxvY19jZmdfaWRfc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fQUxMT0NfQ0ZHX0lEX1NUQVRFCisjZGVmaW5lIGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19pZF9zbGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9BTExPQ19DRkdfSURfU0xBCisjZGVmaW5lIGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19pZF9vbnVfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9BTExPQ19DRkdfSURfT05VX0lECisjZGVmaW5lIGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19pZF9jb2xsZWN0X3N0YXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9BTExPQ19DRkdfSURfQ09MTEVDVF9TVEFUUworI2RlZmluZSBiY21vbHRfZ3Bvbl9hbGxvY19jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fQUxMT0NfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9pZF9yeF9ieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0FMTE9DX1NUQVRfSURfUlhfQllURVMKKyNkZWZpbmUgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0FMTE9DX1NUQVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19pZF9jZmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9DRkdfSURfQ0ZHCisjZGVmaW5lIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9BTExPQ19DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWRfbmV3X3N0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX05FV19TVEFURQorI2RlZmluZSBiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2lkX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9pZF9hdmVyYWdlX25zcl91c2VkICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfQVZFUkFHRV9OU1JfVVNFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2lkX2F2ZXJhZ2VfbnNyX2FsbG9jYXRlZCAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX05TUl9BTExPQ0FURUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9pZF9hdmVyYWdlX3NyX3JlcG9ydCAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfQVZFUkFHRV9TUl9SRVBPUlQKKyNkZWZpbmUgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQKKyNkZWZpbmUgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0FMTE9DX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0YXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUCisjZGVmaW5lIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0FMQVJNX1JBSVNFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0NGR19JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19pZF9nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19DRkdfSURfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19pZF9zdGF0X2FsYXJtX2NsZWFyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVECisjZGVmaW5lIGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2lkX3N0YXRfYWxhcm1fcmFpc2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfaWRfbnVtX29mX2N5Y2xlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fQUxMT0NfR0VUX1NUQVRTX0lEX05VTV9PRl9DWUNMRVMKKyNkZWZpbmUgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0FMTE9DX0dFVF9TVEFUU19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9pZF9zdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9BTExPQ19TRVRfU1RBVEVfSURfU1RBVEUKKyNkZWZpbmUgYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0FMTE9DX1NFVF9TVEFURV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleV9pZF9wb25fbmkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9LRVlfSURfUE9OX05JCisjZGVmaW5lIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleV9pZF9nZW1fcG9ydF9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9LRVlfSURfR0VNX1BPUlRfSUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19pZF9jb25maWd1cmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfQ09ORklHVVJBVElPTgorI2RlZmluZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfaWRfb251X2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX09OVV9JRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfaWRfZ2VtX3BvcnRfc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX0dFTV9QT1JUX1NUQVRFCisjZGVmaW5lIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19pZF9kb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfRE9XTlNUUkVBTV9FTkNSWVBUSU9OX01PREUKKyNkZWZpbmUgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2lkX3Vwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9VUFNUUkVBTV9ERVNUSU5BVElPTl9RVUVVRQorI2RlZmluZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfaWRfY29udHJvbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX0NPTlRST0wKKyNkZWZpbmUgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2lkX2RlYnVnX2Zsb3dfY29uZmlnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9ERUJVR19GTE9XX0NPTkZJRworI2RlZmluZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfaWRfbWFjX3RhYmxlX2VudHJ5X2xpbWl0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX01BQ19UQUJMRV9FTlRSWV9MSU1JVAorI2RlZmluZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9pZF9yeF9wYWNrZXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfSURfUlhfUEFDS0VUUworI2RlZmluZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2lkX3J4X2J5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9CWVRFUworI2RlZmluZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2lkX3R4X3BhY2tldHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9UWF9QQUNLRVRTCisjZGVmaW5lIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfaWRfdHhfYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1RYX0JZVEVTCisjZGVmaW5lIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfaWRfY2ZnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfQ0ZHX0lEX0NGRworI2RlZmluZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZF9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfU1RBVFVTCisjZGVmaW5lIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkX25ld19zdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9ORVdfU1RBVEUKKyNkZWZpbmUgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0YXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUCisjZGVmaW5lIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVAorI2RlZmluZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9SQUlTRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfaWRfc3RhdF9hbGFybV9jbGVhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19pZF9zdGF0X2FsYXJtX3JhaXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0FVVE9fQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2lkX3N0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NFVF9TVEFURV9JRF9TVEFURQorI2RlZmluZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGVfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fR0VNX1BPUlRfU0VUX1NUQVRFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX2tleV9pZF9wb25fbmkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9LRVlfSURfUE9OX05JCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9rZXlfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX2NmZ19pZF9pd2ZfbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfSVdGX01PREUKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX2NmZ19pZF91c190cGlkX3Blcl9mbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfVVNfVFBJRF9QRVJfRkxPVworI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2lkX3VzX290YWdfZGlyZWN0X3RwaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9VU19PVEFHX0RJUkVDVF9UUElECisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9jZmdfaWRfdXNfb3RhZ19kaXJlY3RfcGJpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX1VTX09UQUdfRElSRUNUX1BCSVQKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX2NmZ19pZF9kc190cGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfRFNfVFBJRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2lkX21hY190YWJsZV9jb25maWd1cmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9NQUNfVEFCTEVfQ09ORklHVVJBVElPTgorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2lkX2RlYnVnX2Zsb3dfY29uZmlndXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9ERUJVR19GTE9XX0NPTkZJR1VSQVRJT04KKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX2NmZ19pZF9tYWNfdGFibGVfY291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfTUFDX1RBQkxFX0NPVU5UCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9jZmdfaWRfZm9yYmlkZGVuX3ZsYW5fZmxvd19nZW1fcmFuZ2Vfc3RhcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX0ZPUkJJRERFTl9WTEFOX0ZMT1dfR0VNX1JBTkdFX1NUQVJUCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX3N0YXRfaWRfZHNfaGl0X2V2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX0RTX0hJVF9FVkVOVAorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9pZF9kc19taXNzX2V2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfTUlTU19FVkVOVAorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9pZF9kc19kcm9wX2R1ZV90b19taXNzX2V2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfRFJPUF9EVUVfVE9fTUlTU19FVkVOVAorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9pZF9kc19kcm9wX2R1ZV90b19oaXRfZXZlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfRFJPUF9EVUVfVE9fSElUX0VWRU5UCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2lkX2RzX2Ryb3BfdG9fZGlzYWJsZWRfZ2VtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9EU19EUk9QX1RPX0RJU0FCTEVEX0dFTQorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9pZF9uZXdfbWFjX2Rpc2NvdmVyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfTkVXX01BQ19ESVNDT1ZFUkVECisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2lkX21vdmVfZXZlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9NT1ZFX0VWRU5UCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2lkX25ld19tYWNfZHJvcF9kdWVfdG9fZmlmb19mdWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9ORVdfTUFDX0RST1BfRFVFX1RPX0ZJRk9fRlVMTAorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfaWRfY2ZnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX1NUQVRfQ0ZHX0lEX0NGRworI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX1NUQVRfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9jb21wbGV0ZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9GTFVTSF9NQUNfVEFCTEVfQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9pZF9tYWNfYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9TQ0FOX01BQ19UQUJMRV9DT01QTEVURURfSURfTUFDX0FERFJFU1MKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9pZF9lbnRyaWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9TQ0FOX01BQ19UQUJMRV9DT01QTEVURURfSURfRU5UUklFUworI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX1NDQU5fTUFDX1RBQkxFX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0FMQVJNX1JBSVNFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19pZF9mbHVzaF9tYWNfdGFibGVfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfQVVUT19DRkdfSURfRkxVU0hfTUFDX1RBQkxFX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfaWRfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX0FVVE9fQ0ZHX0lEX1NDQU5fTUFDX1RBQkxFX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfaWRfc3RhdF9hbGFybV9jbGVhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfaWRfc3RhdF9hbGFybV9yYWlzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VECisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfQVVUT19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2lkX2NvbnRyb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX0ZMVVNIX01BQ19UQUJMRV9JRF9DT05UUk9MCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfaWRfdmlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfRkxVU0hfTUFDX1RBQkxFX0lEX1ZJRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2lkX2Zsb3dfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX0ZMVVNIX01BQ19UQUJMRV9JRF9GTE9XX0lECisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfRkxVU0hfTUFDX1RBQkxFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2lkX21hY19hZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9TQ0FOX01BQ19UQUJMRV9JRF9NQUNfQUREUkVTUworI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX1NDQU5fTUFDX1RBQkxFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleV9pZF9wb25fbmkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19LRVlfSURfUE9OX05JCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXlfaWRfZmxvd19pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1dfS0VZX0lEX0ZMT1dfSUQKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2lkX2dlbV9wb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0NGR19JRF9HRU1fUE9SVAorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2lkX3BiaXRfY29udHJvbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0NGR19JRF9QQklUX0NPTlRST0wKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleV9pZF9wb25fbmkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19LRVlfSURfUE9OX05JCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X2lkX3ZsYW5faWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0tFWV9JRF9WTEFOX0lECisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2lkX21hcHBpbmdfbWV0aG9kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0NGR19JRF9NQVBQSU5HX01FVEhPRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19pZF9tYXBwaW5nX3RhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19DRkdfSURfTUFQUElOR19UQUcKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfaWRfdmxhbl9hY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfQ0ZHX0lEX1ZMQU5fQUNUSU9OCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X2lkX3Bvbl9uaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0tFWV9JRF9QT05fTkkKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXlfaWRfbWFjX2FkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfS0VZX0lEX01BQ19BRERSRVNTCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X2lkX3ZsYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0tFWV9JRF9WTEFOCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2lkX2Zsb3dfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0NGR19JRF9GTE9XX0lECisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2lkX3N0YXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0NGR19JRF9TVEFUCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2lkX2dlbV9wb3J0X2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0NGR19JRF9HRU1fUE9SVF9JRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19pZF9vbnVfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9DRkdfSURfT05VX0lECisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2FnZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX01BQ19BR0VEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9pZF9mbG93X2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfTUFDX0RST1BQRURfSURfRkxPV19JRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9NQUNfRFJPUFBFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfaWRfb2xkX2Zsb3dfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX01BQ19NT1ZFX0lEX09MRF9GTE9XX0lECisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfaWRfbmV3X2Zsb3dfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX01BQ19NT1ZFX0lEX05FV19GTE9XX0lECisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX01BQ19NT1ZFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2lkX2Zsb3dfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfTkVXX01BQ19JRF9GTE9XX0lECisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX05FV19NQUNfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2lkX21hY19hZ2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGR19JRF9NQUNfQUdFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2lkX21hY19kcm9wcGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGR19JRF9NQUNfRFJPUFBFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2lkX21hY19tb3ZlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGR19JRF9NQUNfTU9WRQorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2lkX25ld19tYWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGR19JRF9ORVdfTUFDCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5X2lkX3Bvbl9uaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0tFWV9JRF9QT05fTkkKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5X2lkX2dlbV9wb3J0X2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0tFWV9JRF9HRU1fUE9SVF9JRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXlfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2lkX2Zsb3dfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9GTE9XX0lECisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19pZF9tYWNfbGVhcm5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19DRkdfSURfTUFDX0xFQVJOSU5HCisjZGVmaW5lIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19pZF92bGFuX2FjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19DRkdfSURfVkxBTl9BQ1RJT04KKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2lkX3ZsYW5fdGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9WTEFOX1RBRworI2RlZmluZSBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfaWRfdHBpZF9pbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX1RQSURfSU5ERVgKKyNkZWZpbmUgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2tleV9pZF9wb25fbmkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9LRVlfSURfUE9OX05JCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2tleV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9jZmdfaWRfcG9uX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPTl9TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfY2ZnX2lkX2F2YWlsYWJsZV9iYW5kd2lkdGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0NGR19JRF9BVkFJTEFCTEVfQkFORFdJRFRICisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2NmZ19pZF9udW1iZXJfb2ZfYWN0aXZlX29udXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfTlVNQkVSX09GX0FDVElWRV9PTlVTCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2NmZ19pZF9udW1iZXJfb2ZfYWN0aXZlX3N0YW5kYnlfb251cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfTlVNQkVSX09GX0FDVElWRV9TVEFOREJZX09OVVMKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfY2ZnX2lkX3ByYnNfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkJTX1NUQVRVUworI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9jZmdfaWRfcG9uX2Rpc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPTl9ESVNUQU5DRQorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9jZmdfaWRfcmFuZ2luZ193aW5kb3dfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1JBTkdJTkdfV0lORE9XX1NJWkUKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfY2ZnX2lkX3ByZWFzc2lnbmVkX2VxdWFsaXphdGlvbl9kZWxheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkVBU1NJR05FRF9FUVVBTElaQVRJT05fREVMQVkKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfY2ZnX2lkX2VxZF9jeWNsZXNfbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0NGR19JRF9FUURfQ1lDTEVTX05VTUJFUgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9jZmdfaWRfcG93ZXJfbGV2ZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPV0VSX0xFVkVMCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2NmZ19pZF9kc19mZWNfbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfRFNfRkVDX01PREUKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfY2ZnX2lkX2RyaWZ0X2NvbnRyb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0NGR19JRF9EUklGVF9DT05UUk9MCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2NmZ19pZF9kc19iZXJfcmVwb3J0aW5nX2ludGVydmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfRFNfQkVSX1JFUE9SVElOR19JTlRFUlZBTAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9jZmdfaWRfbG9zX2FsYXJtX3RocmVzaG9sZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0xPU19BTEFSTV9USFJFU0hPTEQKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfY2ZnX2lkX2xvc19pbml0aWFsX3ZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0NGR19JRF9MT1NfSU5JVElBTF9WQUxVRQorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9jZmdfaWRfb251X2FsYXJtc190aHJlc2hvbGRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX09OVV9BTEFSTVNfVEhSRVNIT0xEUworI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9jZmdfaWRfYmVyX21vbml0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0JFUl9NT05JVE9SCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2NmZ19pZF9wbG9hbV9hY2tfdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUExPQU1fQUNLX1RJTUVPVVQKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfY2ZnX2lkX29udV9hY3RpdmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0NGR19JRF9PTlVfQUNUSVZBVElPTgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9jZmdfaWRfc25fYWNxdWlzaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1NOX0FDUVVJU0lUSU9OCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2NmZ19pZF9rZXlfZXhjaGFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfS0VZX0VYQ0hBTkdFCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2NmZ19pZF9wcm90ZWN0aW9uX3N3aXRjaGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkcKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfY2ZnX2lkX2Nicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0NGR19JRF9DQlJfUlRfQUxMT0NBVElPTl9QUk9GSUxFCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2NmZ19pZF9jYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQ0JSX05SVF9BTExPQ0FUSU9OX1BST0ZJTEUKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfY2ZnX2lkX2RiYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0NGR19JRF9EQkEKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfY2ZnX2lkX3Bvd2VyX21hbmFnZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0NGR19JRF9QT1dFUl9NQU5BR0VNRU5UCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2NmZ19pZF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUk9HVUVfT05VX0RFVEVDVElPTl9QUk9DRVNTCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2NmZ19pZF9wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUEVSSU9ESUNfU1RBTkRCWV9QT05fTU9OSVRPUklORworI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9jZmdfaWRfcHJic19jaGVja2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9jZmdfaWRfcHJic19nZW5lcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BSQlNfR0VORVJBVE9SCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2NmZ19pZF9taW5fZGF0YV9hbGxvY19pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfTUlOX0RBVEFfQUxMT0NfSUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfY2ZnX2lkX2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0NGR19JRF9BVVRPTUFUSUNfT05VX0RFQUNUSVZBVElPTgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9jZmdfaWRfdXNfYmFuZHdpZHRoX2xpbWl0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1VTX0JBTkRXSURUSF9MSU1JVAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9jZmdfaWRfYWxsX29udXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0FMTF9PTlVTCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2NmZ19pZF9hbGxfbWNhc3RfZ2VtX3BvcnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQUxMX01DQVNUX0dFTV9QT1JUUworI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9jZmdfaWRfZGVidWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RFQlVHCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2NmZ19pZF9vbnVfdXBncmFkZV9wYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfT05VX1VQR1JBREVfUEFSQU1TCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2NmZ19pZF9wc19jX3dhaXRfYmVmb3JlX2RlYWN0aXZhdGlvbl90aW1lb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUFNfQ19XQUlUX0JFRk9SRV9ERUFDVElWQVRJT05fVElNRU9VVAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9jZmdfaWRfYmlwMzJfaW5kaWNhdGlvbl9jb250cm9sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0JJUDMyX0lORElDQVRJT05fQ09OVFJPTAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfc3RhdF9pZF9mZWNfY29kZXdvcmRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfRkVDX0NPREVXT1JEUworI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2lkX2ZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9GRUNfQ09ERVdPUkRTX1VOQ09SUkVDVEVECisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3N0YXRfaWRfYmlwOF9ieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX0JJUDhfQllURVMKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfc3RhdF9pZF9iaXA4X2Vycm9ycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfQklQOF9FUlJPUlMKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfc3RhdF9pZF9yeF9nZW1fcGFja2V0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX1BBQ0tFVFMKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfc3RhdF9pZF9yeF9nZW1fZHJvcHBlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0RST1BQRUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfc3RhdF9pZF9yeF9nZW1faWRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0lETEUKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfc3RhdF9pZF9yeF9nZW1fY29ycmVjdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0NPUlJFQ1RFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2lkX3J4X2dlbV9pbGxlZ2FsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9HRU1fSUxMRUdBTAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2lkX3J4X2FsbG9jYXRpb25zX3ZhbGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19WQUxJRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2lkX3J4X2FsbG9jYXRpb25zX2ludmFsaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19JTlZBTElECisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3N0YXRfaWRfcnhfYWxsb2NhdGlvbnNfZGlzYWJsZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0RJU0FCTEVECisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3N0YXRfaWRfcnhfcGxvYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNUworI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2lkX3J4X3Bsb2Ftc19ub25faWRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfTk9OX0lETEUKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfc3RhdF9pZF9yeF9wbG9hbXNfZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX0VSUk9SCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3N0YXRfaWRfcnhfcGxvYW1zX2Ryb3BwZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19EUk9QUEVECisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3N0YXRfaWRfcnhfY3B1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0NQVQorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2lkX3J4X29tY2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9PTUNJCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3N0YXRfaWRfcnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1IKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfc3RhdF9pZF9yeF9kcm9wcGVkX3Rvb19zaG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fU0hPUlQKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfc3RhdF9pZF9yeF9kcm9wcGVkX3Rvb19sb25nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fTE9ORworI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2lkX3J4X2NyY19lcnJvcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9DUkNfRVJST1JTCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3N0YXRfaWRfcnhfa2V5X2Vycm9ycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0tFWV9FUlJPUlMKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfc3RhdF9pZF9yeF9mcmFnbWVudHNfZXJyb3JzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfRlJBR01FTlRTX0VSUk9SUworI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2lkX3J4X3BhY2tldHNfZHJvcHBlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9QQUNLRVRTX0RST1BQRUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfc3RhdF9pZF90eF9nZW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfR0VNCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3N0YXRfaWRfdHhfcGxvYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX1BMT0FNUworI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2lkX3R4X2dlbV9mcmFnbWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9HRU1fRlJBR01FTlRTCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3N0YXRfaWRfdHhfY3B1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0NQVQorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2lkX3R4X29tY2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9PTUNJCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3N0YXRfaWRfdHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0NQVV9PTUNJX1BBQ0tFVFNfRFJPUFBFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2lkX3R4X2Ryb3BwZWRfaWxsZWdhbF9sZW5ndGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX0lMTEVHQUxfTEVOR1RICisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3N0YXRfaWRfdHhfZHJvcHBlZF90cGlkX21pc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfVFBJRF9NSVNTCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3N0YXRfaWRfdHhfZHJvcHBlZF92aWRfbWlzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfVklEX01JU1MKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfc3RhdF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZ19pZF9jZmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfU1RBVF9DRkdfSURfQ0ZHCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9BQ1RJVkFURV9BTExfT05VU19DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2lkX2Vycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfRkFJTFVSRV9JRF9FUlJPUgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2lkX2dlbV9wb3J0X2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfRkFJTFVSRV9JRF9HRU1fUE9SVF9JRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfRkFJTFVSRV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9ERUFDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9ESVNBQkxFX0FMTF9PTlVTX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9FTkFCTEVfQUxMX09OVVNfQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfbG9zX2lkX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0xPU19JRF9TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfbG9zX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0xPU19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2lkX3NlcmlhbF9udW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9TRVJJQUxfTlVNQkVSCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2lkX3JhbmdpbmdfdGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9SQU5HSU5HX1RJTUUKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWRfaWRfb251X2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX09OVV9JRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfT05VX0RJU0NPVkVSRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZF9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfU1RBVFVTCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkX2xpc3Rfb2ZfZmFpbGVkX2VudGl0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9PTlVfVVBHUkFERV9DT01QTEVURV9JRF9MSVNUX09GX0ZBSUxFRF9FTlRJVElFUworI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9pZF9vbnVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRURfSURfT05VUworI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9pZF9yZXN1bHQgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfU1dJVENIT1ZFUl9DT01QTEVURURfSURfUkVTVUxUCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2lkX3Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRV9JRF9SRVNVTFQKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pZF93aW5kb3dfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfV0lORE9XX1RZUEUKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pZF9tZWFzdXJlbWVudF9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfTUVBU1VSRU1FTlRfU1RBVFVTCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaWRfYWxsb2NfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX0FMTE9DX0lECisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaWRfb251X2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX09OVV9JRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkX2lzX2RlbGluZWF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9JU19ERUxJTkVBVElPTgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkX2lzX2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9JU19FRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkX3J4X2RhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9SWF9EQVRBCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaWRfcGxvYW1fcmVjZWl2ZWRfb251X2lkICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1BMT0FNX1JFQ0VJVkVEX09OVV9JRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkX3Bsb2FtX3JlY2VpdmVkX2NyY19lcnJvciAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9QTE9BTV9SRUNFSVZFRF9DUkNfRVJST1IKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfUk9HVUVfT05VX1NQRUNJQUxfTUFQX0NZQ0xFX1NUQVJUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NFUklBTF9OVU1CRVJfQUNRVUlTSVRJT05fQ1lDTEVfU1RBUlRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9pZF9udW1iZXJfb2ZfZGV0ZWN0ZWRfZGVsaW1pdGVyICAgQkNNT0xUX0dQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURURfSURfTlVNQkVSX09GX0RFVEVDVEVEX0RFTElNSVRFUgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9pZF9lbmVyZ3lfZGV0ZWN0X3NpZ25hbCAgICAgICAgICAgQkNNT0xUX0dQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURURfSURfRU5FUkdZX0RFVEVDVF9TSUdOQUwKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0YXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfU1RBVF9BTEFSTV9SQUlTRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkX3Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9SRVNVTFQKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZF9wcmV2aW91c19zdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfUFJFVklPVVNfU1RBVEUKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZF9uZXdfc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfTkVXX1NUQVRFCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkX3RvZF9zdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9UT0RfU1RSSU5HCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9pZF9zZmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfU0ZDCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9pZF9ydGNfb2Zmc2V0X3NlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfUlRDX09GRlNFVF9TRUMKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkX3J0Y19vZmZzZXRfbnNlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9SVENfT0ZGU0VUX05TRUMKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2lkX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9BQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfaWRfY3B1X3BhY2tldHNfZmFpbHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0NQVV9QQUNLRVRTX0ZBSUxVUkUKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfaWRfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0RFQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVECisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2lkX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9ESVNBQkxFX0FMTF9PTlVTX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19pZF9lbmFibGVfYWxsX29udXNfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfRU5BQkxFX0FMTF9PTlVTX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19pZF9sb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfTE9TCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2lkX29udV9kaXNjb3ZlcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9PTlVfRElTQ09WRVJFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19pZF9vbnVfdXBncmFkZV9jb21wbGV0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfT05VX1VQR1JBREVfQ09NUExFVEUKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfaWRfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VECisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2lkX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19pZF9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUUKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfaWRfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfaWRfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1JPR1VFX09OVV9TUEVDSUFMX01BUF9DWUNMRV9TVEFSVAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19pZF9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0ICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfU0VSSUFMX05VTUJFUl9BQ1FVSVNJVElPTl9DWUNMRV9TVEFSVAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19pZF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfaWRfc3RhdF9hbGFybV9jbGVhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19pZF9zdGF0X2FsYXJtX3JhaXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfaWRfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfaWRfdG9kX3JlcXVlc3RfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1RPRF9SRVFVRVNUX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfaWRfY29udHJvbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX0NPTlRST0wKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2lkX3NlcmlhbF9udW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9JRF9TRVJJQUxfTlVNQkVSCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9ESVNBQkxFX1NFUklBTF9OVU1CRVJfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9pZF9vbnVfc3RhdGUgICAgICAgICAgQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFlQRV9DX1NFVF9NVUxUSVBMRV9PTlVfU1RBVEVfSURfT05VX1NUQVRFCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2lkX29udV9saXN0ICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UWVBFX0NfU0VUX01VTFRJUExFX09OVV9TVEFURV9JRF9PTlVfTElTVAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9pZF9fbnVtX29mICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFlQRV9DX1NFVF9NVUxUSVBMRV9PTlVfU1RBVEVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9yZXNldF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfUkVTRVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkX3dpbmRvd190eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9XSU5ET1dfVFlQRQorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkX2FsbG9jX2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9BTExPQ19JRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkX29udV9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9PTlVfSUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19pZF9zZWNvbmRfcmFuZ2luZ193aW5kb3cgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfU0VDT05EX1JBTkdJTkdfV0lORE9XCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZV9pZF9vbnVfc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9TRVRfT05VX1NUQVRFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9pZF9wb25fc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NFVF9QT05fU1RBVEVfSURfUE9OX1NUQVRFCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9TRVRfUE9OX1NUQVRFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX1NJTkdMRV9SRVFVRVNUX1NUQU5EQllfUE9OX01PTklUT1JJTkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZF9saXN0X29mX29udV9pZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfU1RBUlRfT05VX1VQR1JBREVfSURfTElTVF9PRl9PTlVfSURTCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9TVEFSVF9PTlVfVVBHUkFERV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9UT0RfUkVRVUVTVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfaWRfcGxvYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9CUk9BRENBU1RfUExPQU1fUEFDS0VUX0lEX1BMT0FNCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9CUk9BRENBU1RfUExPQU1fUEFDS0VUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfaWRfcGFja2V0X3R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9UWVBFCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2lkX2NhbGNfY3JjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9DQUxDX0NSQworI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19pZF9nZW1fcG9ydF9saXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfSURfR0VNX1BPUlRfTElTVAorI2RlZmluZSBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19pZF9idWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSCisjZGVmaW5lIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9rZXlfaWRfcG9uX25pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfS0VZX0lEX1BPTl9OSQorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2lkX29udV9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0tFWV9JRF9PTlVfSUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2tleV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfY2ZnX2lkX29udV9zdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0NGR19JRF9PTlVfU1RBVEUKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2NmZ19pZF9zZXJpYWxfbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9DRkdfSURfU0VSSUFMX05VTUJFUgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfY2ZnX2lkX3Bhc3N3b3JkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0NGR19JRF9QQVNTV09SRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfY2ZnX2lkX2F1dG9fcGFzc3dvcmRfbGVhcm5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0NGR19JRF9BVVRPX1BBU1NXT1JEX0xFQVJOSU5HCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9jZmdfaWRfdXNfZmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX1VTX0ZFQworI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfY2ZnX2lkX29tY2lfcG9ydF9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0NGR19JRF9PTUNJX1BPUlRfSUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2NmZ19pZF9kc19iZXJfcmVwb3J0aW5nX2ludGVydmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9DRkdfSURfRFNfQkVSX1JFUE9SVElOR19JTlRFUlZBTAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfY2ZnX2lkX2Flc19lbmNyeXB0aW9uX2tleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0NGR19JRF9BRVNfRU5DUllQVElPTl9LRVkKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2NmZ19pZF9hbGFybV9zdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQUxBUk1fU1RBVEUKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2NmZ19pZF9yYW5naW5nX3RpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9DRkdfSURfUkFOR0lOR19USU1FCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9jZmdfaWRfZGlzYWJsZWRfYWZ0ZXJfZGlzY292ZXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0RJU0FCTEVEX0FGVEVSX0RJU0NPVkVSWQorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfY2ZnX2lkX2RlYWN0aXZhdGlvbl9yZWFzb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0NGR19JRF9ERUFDVElWQVRJT05fUkVBU09OCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9jZmdfaWRfYWxsX2dlbV9wb3J0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0FMTF9HRU1fUE9SVFMKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2NmZ19pZF9hbGxfYWxsb2NzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQUxMX0FMTE9DUworI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfY2ZnX2lkX29udV9wc190eXBlX2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0NGR19JRF9PTlVfUFNfVFlQRV9DCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9jZmdfaWRfZXh0ZW5kZWRfZ3VhcmRfdGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0VYVEVOREVEX0dVQVJEX1RJTUUKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9pZF9mZWNfY29kZXdvcmRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEUworI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9pZF9mZWNfYnl0ZXNfY29ycmVjdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfRkVDX0JZVEVTX0NPUlJFQ1RFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9pZF9mZWNfY29kZXdvcmRzX2NvcnJlY3RlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEU19DT1JSRUNURUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X3N0YXRfaWRfZmVjX2NvZGV3b3Jkc191bmNvcnJlY3RlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0ZFQ19DT0RFV09SRFNfVU5DT1JSRUNURUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X3N0YXRfaWRfYmlwOF9ieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0JJUDhfQllURVMKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X3N0YXRfaWRfYmlwOF9lcnJvcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0JJUDhfRVJST1JTCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9zdGF0X2lkX3J4X3Bsb2Ftc19jcmNfZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfQ1JDX0VSUk9SCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9zdGF0X2lkX3J4X3Bsb2Ftc19ub25faWRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfTk9OX0lETEUKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X3N0YXRfaWRfcG9zaXRpdmVfZHJpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1BPU0lUSVZFX0RSSUZUCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9zdGF0X2lkX25lZ2F0aXZlX2RyaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9ORUdBVElWRV9EUklGVAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9pZF9yeF9vbWNpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfT01DSQorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9pZF9yeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9pZF9iZXJfcmVwb3J0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfQkVSX1JFUE9SVEVECisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9zdGF0X2lkX3VucmVjZWl2ZWRfYnVyc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9VTlJFQ0VJVkVEX0JVUlNUCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9zdGF0X2lkX2xjZGdfZXJyb3JzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9MQ0RHX0VSUk9SUworI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9pZF9yZGlfZXJyb3JzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUkRJX0VSUk9SUworI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9pZF9yeF9ieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfQllURVMKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X3N0YXRfaWRfcnhfcGFja2V0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX1BBQ0tFVFMKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X3N0YXRfaWRfdHhfYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1RYX0JZVEVTCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9zdGF0X2lkX3R4X3BhY2tldHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9UWF9QQUNLRVRTCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9zdGF0X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19pZF9jZmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9DRkdfSURfQ0ZHCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkX2Jlcl9pbnRlcnZhbCAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0JFUl9JTlRFUlZBTF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9CRVJfSU5URVJWQUwKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZF9yZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9CRVJfSU5URVJWQUxfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfUkVTVUxUCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQkVSX0lOVEVSVkFMX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2RmaV9pZF9hbGFybV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9ERklfSURfQUxBUk1fU1RBVFVTCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9kZmlfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfREZJX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2RnaV9pZF9hbGFybV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9ER0lfSURfQUxBUk1fU1RBVFVTCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9kZ2lfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfREdJX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2Rvd2lfaWRfYWxhcm1fc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9ET1dJX0lEX0FMQVJNX1NUQVRVUworI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfZG93aV9pZF9kcmlmdF92YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0RPV0lfSURfRFJJRlRfVkFMVUUKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2Rvd2lfaWRfbmV3X2VxZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9ET1dJX0lEX05FV19FUUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2Rvd2lfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9ET1dJX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2Vycl9pZF9iaXA4X2Vycm9ycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9FUlJfSURfQklQOF9FUlJPUlMKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2Vycl9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9FUlJfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9pZF9hbGxvY19pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0lOVkFMSURfREJSVV9SRVBPUlRfSURfQUxMT0NfSUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9JTlZBTElEX0RCUlVfUkVQT1JUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfaWRfbmV3X2tleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfQ09NUExFVEVEX0lEX05FV19LRVkKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfQ1lDTEVfU0tJUFBFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9pZF9uZXdfa2V5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0RFQ1JZUFRfUkVRVUlSRURfSURfTkVXX0tFWQorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9ERUNSWVBUX1JFUVVJUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfaWRfZXhwZWN0ZWRfa2V5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENIX0lEX0VYUEVDVEVEX0tFWQorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9pZF9yZWNlaXZlZF9rZXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0hfSURfUkVDRUlWRURfS0VZCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9SRVFVRVNUX1RJTUVPVVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhfaWRfZXhwZWN0ZWRfaW5kZXggICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9VTkNPTlNFQ1VUSVZFX0lOREVYX0lEX0VYUEVDVEVEX0lOREVYCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9pZF9hY3R1YWxfaW5kZXggICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX1VOQ09OU0VDVVRJVkVfSU5ERVhfSURfQUNUVUFMX0lOREVYCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX1VOQ09OU0VDVVRJVkVfSU5ERVhfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfbG9haV9pZF9hbGFybV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0xPQUlfSURfQUxBUk1fU1RBVFVTCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9sb2FpX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfTE9BSV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9sb2tpX2lkX2FsYXJtX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfTE9LSV9JRF9BTEFSTV9TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2xva2lfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9MT0tJX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X21lbWlfaWRfcGxvYW1fYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9NRU1JX0lEX1BMT0FNX0JVRkZFUgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfbWVtaV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX01FTUlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkX2dlbV9wb3J0ICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX09NQ0lfUE9SVF9JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9HRU1fUE9SVAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX09NQ0lfUE9SVF9JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZF9vcGVyYXRpb24gICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9PTUNJX1BPUlRfSURfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfT1BFUkFUSU9OCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfT01DSV9QT1JUX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9pZF9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfU1RBVFVTCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWRfZmFpbF9yZWFzb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX2lkX3Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9PTlVfQUNUSVZBVElPTl9TVEFOREJZX0NPTVBMRVRFRF9JRF9SRVNVTFQKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9PTlVfQUNUSVZBVElPTl9TVEFOREJZX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1faWRfb251X2FsYXJtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfT05VX0FMQVJNX0lEX09OVV9BTEFSTQorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX09OVV9BTEFSTV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9pZF9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURURfSURfU1RBVFVTCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2lkX3NlcmlhbF9udW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX09OVV9ESVNBQkxFX0NPTVBMRVRFRF9JRF9TRVJJQUxfTlVNQkVSCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfT05VX0RJU0FCTEVfQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2lkX3NlcmlhbF9udW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9PTlVfRU5BQkxFX0NPTVBMRVRFRF9JRF9TRVJJQUxfTlVNQkVSCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfT05VX0VOQUJMRV9DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX09QVElDQUxfUkVGTEVDVElPTl9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfaWRfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUworI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2lkX2ZhaWxfcmVhc29uICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2lkX3Bhc3N3b3JkICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFRF9JRF9QQVNTV09SRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9wZWVfaWRfYWxhcm1fc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfUEVFX0lEX0FMQVJNX1NUQVRVUworI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfcGVlX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1BFRV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9pZF9hbGFybV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfUE9TU0lCTEVfRFJJRlRfSURfQUxBUk1fU1RBVFVTCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9pZF9lc3RpbWF0ZWRfZHJpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfUE9TU0lCTEVfRFJJRlRfSURfRVNUSU1BVEVEX0RSSUZUCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfUE9TU0lCTEVfRFJJRlRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfaWRfb2xkX3N0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX09MRF9TVEFURQorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfaWRfbmV3X3N0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX05FV19TVEFURQorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfaWRfcmVhc29uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX1JFQVNPTgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X3BzdF9pZF9saW5rX251bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9QU1RfSURfTElOS19OVU1CRVIKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X3BzdF9pZF9rMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9QU1RfSURfSzEKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X3BzdF9pZF9rMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9QU1RfSURfSzIKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X3BzdF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9QU1RfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWRfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX1NUQVRVUworI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWRfZmFpbF9yZWFzb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9pZF9udW1iZXJfb2ZfcGxvYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfTlVNQkVSX09GX1BMT0FNUworI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWRfZXFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX0VRRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWRfcG93ZXJfbGV2ZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX1BPV0VSX0xFVkVMCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfcmVpX2lkX2JpcDhfZXJyb3JzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1JFSV9JRF9CSVA4X0VSUk9SUworI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfcmVpX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1JFSV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZF9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfU1RBVFVTCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZF9mYWlsX3JlYXNvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfRkFJTF9SRUFTT04KKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9zZGlfaWRfYWxhcm1fc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfU0RJX0lEX0FMQVJNX1NUQVRVUworI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfc2RpX2lkX2JlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1NESV9JRF9CRVIKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X3NkaV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9TRElfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfc2ZpX2lkX2FsYXJtX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1NGSV9JRF9BTEFSTV9TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X3NmaV9pZF9iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9TRklfSURfQkVSCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9zZmlfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfU0ZJX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X3N1ZmlfaWRfYWxhcm1fc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9TVUZJX0lEX0FMQVJNX1NUQVRVUworI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfc3VmaV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1NVRklfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfdGl3aV9pZF9hbGFybV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1RJV0lfSURfQUxBUk1fU1RBVFVTCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV90aXdpX2lkX2RyaWZ0X3ZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfVElXSV9JRF9EUklGVF9WQUxVRQorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfdGl3aV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1RJV0lfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWRfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0JFUl9JTlRFUlZBTF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWRfZGZpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0RGSQorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWRfZGdpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0RHSQorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWRfZG93aSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0RPV0kKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2lkX2VyciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9FUlIKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2lkX2ludmFsaWRfZGJydV9yZXBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9JTlZBTElEX0RCUlVfUkVQT1JUCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19pZF9rZXlfZXhjaGFuZ2VfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWRfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9DWUNMRV9TS0lQUEVECisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19pZF9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0RFQ1JZUFRfUkVRVUlSRUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2lkX2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENICisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19pZF9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0tFWV9SRVFVRVNUX1RJTUVPVVQKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2lkX2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfVU5DT05TRUNVVElWRV9JTkRFWAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWRfbG9haSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0xPQUkKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2lkX2xva2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9MT0tJCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19pZF9tZW1pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfTUVNSQorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWRfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09NQ0lfUE9SVF9JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWRfb251X2FjdGl2YXRpb25fY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWRfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9BQ1RJVkFUSU9OX1NUQU5EQllfQ09NUExFVEVECisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19pZF9vbnVfYWxhcm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0FMQVJNCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19pZF9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2lkX29udV9kaXNhYmxlX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfRElTQUJMRV9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2lkX29udV9lbmFibGVfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfRU5BQkxFX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWRfb3B0aWNhbF9yZWZsZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09QVElDQUxfUkVGTEVDVElPTgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWRfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWRfcGVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1BFRQorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWRfcG9zc2libGVfZHJpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1BPU1NJQkxFX0RSSUZUCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19pZF9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0UKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2lkX3BzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9QU1QKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2lkX3JhbmdpbmdfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9SQU5HSU5HX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWRfcmVpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1JFSQorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWRfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVECisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19pZF9zZGkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU0RJCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19pZF9zZmkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU0ZJCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19pZF9zdGF0X2FsYXJtX2NsZWFyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVECisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19pZF9zdGF0X2FsYXJtX3JhaXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2lkX3N1ZmkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9TVUZJCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19pZF90aXdpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfVElXSQorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9pZF9wb3dlcl9sZXZlbF9hY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9DSEFOR0VfUE9XRVJfTEVWRUxfSURfUE9XRVJfTEVWRUxfQUNUSU9OCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQ0hBTkdFX1BPV0VSX0xFVkVMX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9SU1NJX01FQVNVUkVNRU5UX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfaWRfb251X3N0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9TRVRfT05VX1NUQVRFX0lEX09OVV9TVEFURQorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1NFVF9PTlVfU1RBVEVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfaWRfcGFja2V0X3R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9UWVBFCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19pZF9jYWxjX2NyYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfQ0FMQ19DUkMKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2lkX251bWJlcl9vZl9wYWNrZXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9OVU1CRVJfT0ZfUEFDS0VUUworI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfaWRfcGFja2V0X3NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9TSVpFCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19pZF9idWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2lkX3Bsb2FtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1BMT0FNX1BBQ0tFVF9JRF9QTE9BTQorI2RlZmluZSBiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fT05VX1BMT0FNX1BBQ0tFVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2lkX3BvcnRfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9QT1JUX0lECisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2lkX2NyY19vayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9DUkNfT0sKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfaWRfcGFja2V0X3NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUX0lEX1BBQ0tFVF9TSVpFCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2lkX2J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9CVUZGRVIKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2lkX3BvcnRfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9QT1JUX0lECisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9pZF9jcmNfb2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfQ1JDX09LCisjZGVmaW5lIGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9pZF9wYWNrZXRfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfUEFDS0VUX1NJWkUKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2lkX2J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9CVUZGRVIKKyNkZWZpbmUgYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX3RyeF9rZXlfaWRfcG9uX25pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9UUlhfS0VZX0lEX1BPTl9OSQorI2RlZmluZSBiY21vbHRfZ3Bvbl90cnhfa2V5X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fVFJYX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ncG9uX3RyeF9jZmdfaWRfdHJhbnNjZWl2ZXJfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1RSQU5TQ0VJVkVSX1RZUEUKKyNkZWZpbmUgYmNtb2x0X2dwb25fdHJ4X2NmZ19pZF9sYV9jb25maWd1cmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfQ09ORklHVVJBVElPTgorI2RlZmluZSBiY21vbHRfZ3Bvbl90cnhfY2ZnX2lkX2JjZHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9CQ0RSCisjZGVmaW5lIGJjbW9sdF9ncG9uX3RyeF9jZmdfaWRfbGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX1JBTkdJTkdfQUZURVJfTk9fRURfUkVTWU5DCisjZGVmaW5lIGJjbW9sdF9ncG9uX3RyeF9jZmdfaWRfYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0JDRFJfUkFOR0lOR19BRlRFUl9OT19FRF9SRVNZTkMKKyNkZWZpbmUgYmNtb2x0X2dwb25fdHJ4X2NmZ19pZF9sYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfUkFOR0lOR19BRlRFUl9FRF9SRVNZTkMKKyNkZWZpbmUgYmNtb2x0X2dwb25fdHJ4X2NmZ19pZF9iY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUl9SQU5HSU5HX0FGVEVSX0VEX1JFU1lOQworI2RlZmluZSBiY21vbHRfZ3Bvbl90cnhfY2ZnX2lkX2xhX3Jlc3luY19wb2xhcml0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9SRVNZTkNfUE9MQVJJVFkKKyNkZWZpbmUgYmNtb2x0X2dwb25fdHJ4X2NmZ19pZF9iY2RyX3Jlc3luY19wb2xhcml0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUl9SRVNZTkNfUE9MQVJJVFkKKyNkZWZpbmUgYmNtb2x0X2dwb25fdHJ4X2NmZ19pZF9iY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUl9SQU5HSU5HX1JFU1lOQ19DT05ESVRJT05TCisjZGVmaW5lIGJjbW9sdF9ncG9uX3RyeF9jZmdfaWRfbGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX1JBTkdJTkdfUkVTWU5DX0NPTkRJVElPTlMKKyNkZWZpbmUgYmNtb2x0X2dwb25fdHJ4X2NmZ19pZF9yeF9jb25maWd1cmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUlhfQ09ORklHVVJBVElPTgorI2RlZmluZSBiY21vbHRfZ3Bvbl90cnhfY2ZnX2lkX3JhbmdpbmdfY29udHJvbF9zdGFnZXNfY29uZmlndXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9SQU5HSU5HX0NPTlRST0xfU1RBR0VTX0NPTkZJR1VSQVRJT04KKyNkZWZpbmUgYmNtb2x0X2dwb25fdHJ4X2NmZ19pZF9lbmVyZ3lfZGV0ZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfRU5FUkdZX0RFVEVDVAorI2RlZmluZSBiY21vbHRfZ3Bvbl90cnhfY2ZnX2lkX2VuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9FTkRfT0ZfQlVSU1RfREFUQV9QQVRURVJOCisjZGVmaW5lIGJjbW9sdF9ncG9uX3RyeF9jZmdfaWRfZW5kX29mX2J1cnN0X3JhbmdpbmdfcGF0dGVybiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0VORF9PRl9CVVJTVF9SQU5HSU5HX1BBVFRFUk4KKyNkZWZpbmUgYmNtb2x0X2dwb25fdHJ4X2NmZ19pZF9wcmVhbWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUFJFQU1CTEUKKyNkZWZpbmUgYmNtb2x0X2dwb25fdHJ4X2NmZ19pZF9kZWxpbWl0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfREVMSU1JVEVSCisjZGVmaW5lIGJjbW9sdF9ncG9uX3RyeF9jZmdfaWRfZ3VhcmRfYml0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0dVQVJEX0JJVFMKKyNkZWZpbmUgYmNtb2x0X2dwb25fdHJ4X2NmZ19pZF9zZXJkZXNfY29uZmlndXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfU0VSREVTX0NPTkZJR1VSQVRJT04KKyNkZWZpbmUgYmNtb2x0X2dwb25fdHJ4X2NmZ19pZF9wbG9fcmFuZ2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUExPX1JBTkdJTkcKKyNkZWZpbmUgYmNtb2x0X2dwb25fdHJ4X2NmZ19pZF9wbG9fZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUExPX0RBVEEKKyNkZWZpbmUgYmNtb2x0X2dwb25fdHJ4X2NmZ19pZF9yc3NpX25vcm1hbF9jb25maWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUlNTSV9OT1JNQUxfQ09ORklHCisjZGVmaW5lIGJjbW9sdF9ncG9uX3RyeF9jZmdfaWRfcmFuZ2luZ19yc3NpX3Jlc3luY19jb250cm9sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1JBTkdJTkdfUlNTSV9SRVNZTkNfQ09OVFJPTAorI2RlZmluZSBiY21vbHRfZ3Bvbl90cnhfY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9sb2dfZW50cnlfa2V5X2lkX2xvZ19pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9MT0dfSUQKKyNkZWZpbmUgYmNtb2x0X2xvZ19lbnRyeV9rZXlfaWRfcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9MT0dfRU5UUllfS0VZX0lEX1JFU0VSVkVECisjZGVmaW5lIGJjbW9sdF9sb2dfZW50cnlfa2V5X2lkX25hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9OQU1FCisjZGVmaW5lIGJjbW9sdF9sb2dfZW50cnlfa2V5X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9sb2dfZW50cnlfY2ZnX2lkX2RlZmF1bHRfbG9nX2xldmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9ERUZBVUxUX0xPR19MRVZFTAorI2RlZmluZSBiY21vbHRfbG9nX2VudHJ5X2NmZ19pZF9kZWZhdWx0X2xvZ190eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfREVGQVVMVF9MT0dfVFlQRQorI2RlZmluZSBiY21vbHRfbG9nX2VudHJ5X2NmZ19pZF9sb2dfbGV2ZWxfcHJpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfTE9HX0xFVkVMX1BSSU5UCisjZGVmaW5lIGJjbW9sdF9sb2dfZW50cnlfY2ZnX2lkX2xvZ19sZXZlbF9zYXZlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfTEVWRUxfU0FWRQorI2RlZmluZSBiY21vbHRfbG9nX2VudHJ5X2NmZ19pZF9sb2dfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfTE9HX1RZUEUKKyNkZWZpbmUgYmNtb2x0X2xvZ19lbnRyeV9jZmdfaWRfbG9nX3N0eWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19TVFlMRQorI2RlZmluZSBiY21vbHRfbG9nX2VudHJ5X2NmZ19pZF9sb2dfbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfTE9HX05BTUUKKyNkZWZpbmUgYmNtb2x0X2xvZ19lbnRyeV9jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2lkX21zZ19jb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9MT0dfRU5UUllfU1RBVF9JRF9NU0dfQ09VTlQKKyNkZWZpbmUgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2lkX2xvc3RfbXNnX2NvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9MT0dfRU5UUllfU1RBVF9JRF9MT1NUX01TR19DT1VOVAorI2RlZmluZSBiY21vbHRfbG9nX2VudHJ5X3N0YXRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19pZF9jZmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9MT0dfRU5UUllfU1RBVF9DRkdfSURfQ0ZHCisjZGVmaW5lIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9MT0dfRU5UUllfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQKKyNkZWZpbmUgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9MT0dfRU5UUllfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9MT0dfRU5UUllfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVAorI2RlZmluZSBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfaWRfc3RhdF9hbGFybV9jbGVhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTE9HX0VOVFJZX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRAorI2RlZmluZSBiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2lkX3N0YXRfYWxhcm1fcmFpc2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR19FTlRSWV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRAorI2RlZmluZSBiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR19FTlRSWV9BVVRPX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9sb2dnZXJfa2V5X2lkX3Jlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTE9HR0VSX0tFWV9JRF9SRVNFUlZFRAorI2RlZmluZSBiY21vbHRfbG9nZ2VyX2tleV9pZF9maWxlX2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR0dFUl9LRVlfSURfRklMRV9JRAorI2RlZmluZSBiY21vbHRfbG9nZ2VyX2tleV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR0dFUl9LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfbG9nZ2VyX2NmZ19pZF9idWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR0dFUl9DRkdfSURfQlVGRkVSCisjZGVmaW5lIGJjbW9sdF9sb2dnZXJfY2ZnX2lkX3dyYXBfYXJvdW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTE9HR0VSX0NGR19JRF9XUkFQX0FST1VORAorI2RlZmluZSBiY21vbHRfbG9nZ2VyX2NmZ19pZF9jbGVhcl9hZnRlcl9yZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR0dFUl9DRkdfSURfQ0xFQVJfQUZURVJfUkVBRAorI2RlZmluZSBiY21vbHRfbG9nZ2VyX2NmZ19pZF9lbmFibGVfbG9nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR0dFUl9DRkdfSURfRU5BQkxFX0xPRworI2RlZmluZSBiY21vbHRfbG9nZ2VyX2NmZ19pZF9sb2dfbmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR0dFUl9DRkdfSURfTE9HX05BTUVTCisjZGVmaW5lIGJjbW9sdF9sb2dnZXJfY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTE9HR0VSX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9sb2dnZXJfc3RhdF9pZF9saW5lc19pbl9sb2cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTE9HR0VSX1NUQVRfSURfTElORVNfSU5fTE9HCisjZGVmaW5lIGJjbW9sdF9sb2dnZXJfc3RhdF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTE9HR0VSX1NUQVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2lkX2NmZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR0dFUl9TVEFUX0NGR19JRF9DRkcKKyNkZWZpbmUgYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9MT0dHRVJfU1RBVF9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR0dFUl9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVAorI2RlZmluZSBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR0dFUl9TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0YXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0xPR0dFUl9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUCisjZGVmaW5lIGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTE9HR0VSX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19pZF9zdGF0X2FsYXJtX2NsZWFyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9MT0dHRVJfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVECisjZGVmaW5lIGJjbW9sdF9sb2dnZXJfYXV0b19jZmdfaWRfc3RhdF9hbGFybV9yYWlzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTE9HR0VSX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VECisjZGVmaW5lIGJjbW9sdF9sb2dnZXJfYXV0b19jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTE9HR0VSX0FVVE9fQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X2xvZ2dlcl9jbGVhcl9sb2dfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9MT0dHRVJfQ0xFQVJfTE9HX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X25uaV9rZXlfaWRfcG9uX25pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfS0VZX0lEX1BPTl9OSQorI2RlZmluZSBiY21vbHRfbm5pX2tleV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfbm5pX2NmZ19pZF9yZW1vdGVfbG9vcGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9DRkdfSURfUkVNT1RFX0xPT1BCQUNLCisjZGVmaW5lIGJjbW9sdF9ubmlfY2ZnX2lkX2xpbmVfbG9vcGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX0NGR19JRF9MSU5FX0xPT1BCQUNLCisjZGVmaW5lIGJjbW9sdF9ubmlfY2ZnX2lkX21hY19hZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX0NGR19JRF9NQUNfQUREUkVTUworI2RlZmluZSBiY21vbHRfbm5pX2NmZ19pZF9ubmlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9DRkdfSURfTk5JX1NUQVRVUworI2RlZmluZSBiY21vbHRfbm5pX2NmZ19pZF9ubmlfYmFja3VwX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9DRkdfSURfTk5JX0JBQ0tVUF9TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X25uaV9jZmdfaWRfYWN0aXZlX25uaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfQ0ZHX0lEX0FDVElWRV9OTkkKKyNkZWZpbmUgYmNtb2x0X25uaV9jZmdfaWRfbm5pX3N0YXR1c19wb2xsaW5nX2ludGVydmFsX21zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfQ0ZHX0lEX05OSV9TVEFUVVNfUE9MTElOR19JTlRFUlZBTF9NUworI2RlZmluZSBiY21vbHRfbm5pX2NmZ19pZF9hdXRvc3dpdGNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9DRkdfSURfQVVUT1NXSVRDSAorI2RlZmluZSBiY21vbHRfbm5pX2NmZ19pZF9mbG93X2NvbnRyb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9DRkdfSURfRkxPV19DT05UUk9MCisjZGVmaW5lIGJjbW9sdF9ubmlfY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ubmlfc3RhdF9pZF9yeF9mcmFtZXNfNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzY0CisjZGVmaW5lIGJjbW9sdF9ubmlfc3RhdF9pZF9yeF9mcmFtZXNfNjVfMTI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzY1XzEyNworI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfaWRfcnhfZnJhbWVzXzEyOF8yNTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU18xMjhfMjU1CisjZGVmaW5lIGJjbW9sdF9ubmlfc3RhdF9pZF9yeF9mcmFtZXNfMjU2XzUxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzI1Nl81MTEKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2lkX3J4X2ZyYW1lc181MTJfMTAyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfNTEyXzEwMjMKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2lkX3J4X2ZyYW1lc18xMDI0XzE1MTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfMTAyNF8xNTE4CisjZGVmaW5lIGJjbW9sdF9ubmlfc3RhdF9pZF9yeF9mcmFtZXNfMTUxOV8yMDQ3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzE1MTlfMjA0NworI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfaWRfcnhfZnJhbWVzXzIwNDhfNDA5NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU18yMDQ4XzQwOTUKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2lkX3J4X2ZyYW1lc180MDk2XzkyMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfNDA5Nl85MjE2CisjZGVmaW5lIGJjbW9sdF9ubmlfc3RhdF9pZF9yeF9mcmFtZXNfOTIxN18xNjM4MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzkyMTdfMTYzODMKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2lkX3J4X2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2lkX3J4X2J5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9CWVRFUworI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfaWRfcnhfZ29vZF9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0dPT0RfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9ubmlfc3RhdF9pZF9yeF91bmljYXN0X2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVU5JQ0FTVF9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2lkX3J4X211bHRpY2FzdF9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9NVUxUSUNBU1RfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9ubmlfc3RhdF9pZF9yeF9icm9hZGNhc3RfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQlJPQURDQVNUX0ZSQU1FUworI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfaWRfcnhfZmNzX2Vycm9ycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZDU19FUlJPUlMKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2lkX3J4X2NvbnRyb2xfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9DT05UUk9MX0ZSQU1FUworI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfaWRfcnhfcGF1c2VfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1BBVVNFX0ZSQU1FUworI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfaWRfcnhfcGZjX2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1BGQ19GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2lkX3J4X3Vuc3VwcG9ydGVkX29wY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTlNVUFBPUlRFRF9PUENPREUKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2lkX3J4X3Vuc3VwcG9ydGVkX2RhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTlNVUFBPUlRFRF9EQQorI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfaWRfcnhfYWxpZ25tZW50X2Vycm9ycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0FMSUdOTUVOVF9FUlJPUlMKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2lkX3J4X2xlbmd0aF9vdXRfb2ZfcmFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9MRU5HVEhfT1VUX09GX1JBTkdFCisjZGVmaW5lIGJjbW9sdF9ubmlfc3RhdF9pZF9yeF9jb2RlX2Vycm9ycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQ09ERV9FUlJPUlMKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2lkX3J4X292ZXJzaXplZF9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9PVkVSU0laRURfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9ubmlfc3RhdF9pZF9yeF9qYWJiZXJfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfSkFCQkVSX0ZSQU1FUworI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfaWRfcnhfbXR1X2NoZWNrX2Vycm9ycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0lEX1JYX01UVV9DSEVDS19FUlJPUlMKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2lkX3J4X3Byb21pc2N1b3VzX2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9QUk9NSVNDVU9VU19GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2lkX3J4X3ZsYW5fZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9WTEFOX0ZSQU1FUworI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfaWRfcnhfZG91YmxlX3ZsYW5fZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0RPVUJMRV9WTEFOX0ZSQU1FUworI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfaWRfcnhfdHJ1bmNhdGVkX2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1RSVU5DQVRFRF9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2lkX3J4X3VuZGVyc2l6ZV9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTkRFUlNJWkVfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9ubmlfc3RhdF9pZF9yeF9mcmFnbWVudGVkX2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBR01FTlRFRF9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2lkX3J4X3J1bnRfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9SVU5UX0ZSQU1FUworI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfaWRfdHhfZnJhbWVzXzY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU182NAorI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfaWRfdHhfZnJhbWVzXzY1XzEyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU182NV8xMjcKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2lkX3R4X2ZyYW1lc18xMjhfMjU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMTI4XzI1NQorI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfaWRfdHhfZnJhbWVzXzI1Nl81MTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18yNTZfNTExCisjZGVmaW5lIGJjbW9sdF9ubmlfc3RhdF9pZF90eF9mcmFtZXNfNTEyXzEwMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzUxMl8xMDIzCisjZGVmaW5lIGJjbW9sdF9ubmlfc3RhdF9pZF90eF9mcmFtZXNfMTAyNF8xNTE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzEwMjRfMTUxOAorI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfaWRfdHhfZnJhbWVzXzE1MTlfMjA0NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18xNTE5XzIwNDcKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2lkX3R4X2ZyYW1lc18yMDQ4XzQwOTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMjA0OF80MDk1CisjZGVmaW5lIGJjbW9sdF9ubmlfc3RhdF9pZF90eF9mcmFtZXNfNDA5Nl85MjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzQwOTZfOTIxNgorI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfaWRfdHhfZnJhbWVzXzkyMTdfMTYzODMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU185MjE3XzE2MzgzCisjZGVmaW5lIGJjbW9sdF9ubmlfc3RhdF9pZF90eF9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9ubmlfc3RhdF9pZF90eF9ieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRfSURfVFhfQllURVMKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2lkX3R4X2dvb2RfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9HT09EX0ZSQU1FUworI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfaWRfdHhfdW5pY2FzdF9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0lEX1RYX1VOSUNBU1RfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9ubmlfc3RhdF9pZF90eF9tdWx0aWNhc3RfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRfSURfVFhfTVVMVElDQVNUX0ZSQU1FUworI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfaWRfdHhfYnJvYWRjYXN0X2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0JST0FEQ0FTVF9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2lkX3R4X3BhdXNlX2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9QQVVTRV9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2lkX3R4X3BmY19mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9QRkNfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9ubmlfc3RhdF9pZF90eF9qYWJiZXJfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRfSURfVFhfSkFCQkVSX0ZSQU1FUworI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfaWRfdHhfZmNzX2Vycm9ycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZDU19FUlJPUlMKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2lkX3R4X2NvbnRyb2xfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9DT05UUk9MX0ZSQU1FUworI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfaWRfdHhfb3ZlcnNpemVfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0lEX1RYX09WRVJTSVpFX0ZSQU1FUworI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfaWRfdHhfZnJhZ21lbnRlZF9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQUdNRU5URURfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9ubmlfc3RhdF9pZF90eF9lcnJvcl9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRVJST1JfRlJBTUVTCisjZGVmaW5lIGJjbW9sdF9ubmlfc3RhdF9pZF90eF92bGFuX2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRfSURfVFhfVkxBTl9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2lkX3R4X2RvdWJsZV92bGFuX2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9ET1VCTEVfVkxBTl9GUkFNRVMKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2lkX3R4X3J1bnRfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9SVU5UX0ZSQU1FUworI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfaWRfdHhfdW5kZXJydW5fZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0lEX1RYX1VOREVSUlVOX0ZSQU1FUworI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2NmZ19pZF9jZmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9DRkdfSURfQ0ZHCisjZGVmaW5lIGJjbW9sdF9ubmlfc3RhdF9jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVAorI2RlZmluZSBiY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfaWRfbmV3X3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NUQVRVU19DSEFOR0VEX0lEX05FV19TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9pZF9saW5rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVFVTX0NIQU5HRURfSURfTElOSworI2RlZmluZSBiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2lkX3ByZXZpb3VzX2FjdGl2ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUVVNfQ0hBTkdFRF9JRF9QUkVWSU9VU19BQ1RJVkUKKyNkZWZpbmUgYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9pZF9uZXdfYWN0aXZlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU1RBVFVTX0NIQU5HRURfSURfTkVXX0FDVElWRQorI2RlZmluZSBiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TVEFUVVNfQ0hBTkdFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ubmlfYXV0b19jZmdfaWRfc3RhdF9hbGFybV9jbGVhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRAorI2RlZmluZSBiY21vbHRfbm5pX2F1dG9fY2ZnX2lkX3N0YXRfYWxhcm1fcmFpc2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRAorI2RlZmluZSBiY21vbHRfbm5pX2F1dG9fY2ZnX2lkX3N0YXR1c19jaGFuZ2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9BVVRPX0NGR19JRF9TVEFUVVNfQ0hBTkdFRAorI2RlZmluZSBiY21vbHRfbm5pX2F1dG9fY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9BVVRPX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ubmlfc2VyZGVzX2tleV9pZF9wb25fbmkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NFUkRFU19LRVlfSURfUE9OX05JCisjZGVmaW5lIGJjbW9sdF9ubmlfc2VyZGVzX2tleV9pZF9pbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NFUkRFU19LRVlfSURfSU5TVEFOQ0UKKyNkZWZpbmUgYmNtb2x0X25uaV9zZXJkZXNfa2V5X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU0VSREVTX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19pZF9yeF92Z2EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfVkdBCisjZGVmaW5lIGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19pZF9yeF9wZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfUEYKKyNkZWZpbmUgYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2lkX3J4X2xmcGYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9MRlBGCisjZGVmaW5lIGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19pZF9yeF9kZmUxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFMQorI2RlZmluZSBiY21vbHRfbm5pX3NlcmRlc19jZmdfaWRfcnhfZGZlMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTIKKyNkZWZpbmUgYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2lkX3J4X2RmZTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9ERkUzCisjZGVmaW5lIGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19pZF9yeF9kZmU0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFNAorI2RlZmluZSBiY21vbHRfbm5pX3NlcmRlc19jZmdfaWRfcnhfZGZlNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTUKKyNkZWZpbmUgYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2lkX3R4X3ByZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QUkUKKyNkZWZpbmUgYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2lkX3R4X21haW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9NQUlOCisjZGVmaW5lIGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19pZF90eF9wb3N0MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfUE9TVDEKKyNkZWZpbmUgYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2lkX3R4X3Bvc3QyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QT1NUMgorI2RlZmluZSBiY21vbHRfbm5pX3NlcmRlc19jZmdfaWRfdHhfcG9zdDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QzCisjZGVmaW5lIGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19pZF90eF9hbXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfQU1QCisjZGVmaW5lIGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5X2lkX3Jlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0tFWV9JRF9SRVNFUlZFRAorI2RlZmluZSBiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5X2lkX2lkeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0tFWV9JRF9JRFgKKyNkZWZpbmUgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9TT0ZUV0FSRV9FUlJPUl9LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnX2lkX2VudHJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0NGR19JRF9FTlRSWQorI2RlZmluZSBiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5X2lkX3Jlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0tFWV9JRF9SRVNFUlZFRAorI2RlZmluZSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2lkX2RhdGFfd2luZG93ICAgICAgICAgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9EQVRBX1dJTkRPVworI2RlZmluZSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2lkX3N0cm9iZV93aW5kb3cgICAgICAgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9TVFJPQkVfV0lORE9XCisjZGVmaW5lIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfaWRfZWRnZV9yaXNlX21pbl9taW4gICAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfUklTRV9NSU5fTUlOCisjZGVmaW5lIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfaWRfZWRnZV9yaXNlX21pbl9tYXggICAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfUklTRV9NSU5fTUFYCisjZGVmaW5lIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfaWRfZWRnZV9yaXNlX21heF9taW4gICAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfUklTRV9NQVhfTUlOCisjZGVmaW5lIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfaWRfZWRnZV9yaXNlX21heF9tYXggICAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfUklTRV9NQVhfTUFYCisjZGVmaW5lIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfaWRfZWRnZV9mYWxsX21pbl9taW4gICAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfRkFMTF9NSU5fTUlOCisjZGVmaW5lIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfaWRfZWRnZV9mYWxsX21pbl9tYXggICAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfRkFMTF9NSU5fTUFYCisjZGVmaW5lIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfaWRfZWRnZV9mYWxsX21heF9taW4gICAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfRkFMTF9NQVhfTUlOCisjZGVmaW5lIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfaWRfZWRnZV9mYWxsX21heF9tYXggICAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfRkFMTF9NQVhfTUFYCisjZGVmaW5lIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfaWRfcmVzdWx0ICAgICAgICAgICAgICAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX1JFU1VMVAorI2RlZmluZSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfaWRfY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWQgICAgICAgICAgICAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0FVVE9fQ0ZHX0lEX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVECisjZGVmaW5lIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0FVVE9fQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19pZF9wb25fbmkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfUE9OX05JCisjZGVmaW5lIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfaWRfdHJpZ2dlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1RSSUdHRVIKKyNkZWZpbmUgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19pZF9zdHJvYmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfU1RST0JFCisjZGVmaW5lIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfaWRfd2luZG93X21vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1dJTkRPV19NT0RFCisjZGVmaW5lIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfaWRfb251X2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX09OVV9JRAorI2RlZmluZSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2lkX3RyaWdnZXJfcG9zaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9UUklHR0VSX1BPU0lUSU9OCisjZGVmaW5lIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfaWRfc3RvcF9kdWVfdG9fY29ycnVwdF9zdHJvYmUgICAgICAgICAgICAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1NUT1BfRFVFX1RPX0NPUlJVUFRfU1RST0JFCisjZGVmaW5lIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfaWRfc3RhcnRfb2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1NUQVJUX09GRlNFVAorI2RlZmluZSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2lkX2VuZF9vZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9FTkRfT0ZGU0VUCisjZGVmaW5lIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfaWRfbnVtYmVyX29mX2N5Y2xlcyAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX05VTUJFUl9PRl9DWUNMRVMKKyNkZWZpbmUgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfaWRfcG9uX25pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVE9QX0NBUFRVUkVfV0lORE9XX0lEX1BPTl9OSQorI2RlZmluZSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVE9QX0NBUFRVUkVfV0lORE9XX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2FsbG9jX2tleV9pZF9wb25fbmkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9BTExPQ19LRVlfSURfUE9OX05JCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9hbGxvY19rZXlfaWRfYWxsb2NfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fQUxMT0NfS0VZX0lEX0FMTE9DX0lECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9hbGxvY19rZXlfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fQUxMT0NfS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19pZF9zdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfU1RBVEUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19pZF9zbGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfU0xBCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9hbGxvY19jZmdfaWRfb251X2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fQUxMT0NfQ0ZHX0lEX09OVV9JRAorI2RlZmluZSBiY21vbHRfeGdwb25fYWxsb2NfY2ZnX2lkX2NvbGxlY3Rfc3RhdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0NGR19JRF9DT0xMRUNUX1NUQVRTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9hbGxvY19jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fQUxMT0NfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfaWRfcnhfYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0lEX1JYX0JZVEVTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19pZF9jZmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9DRkdfSURfQ0ZHCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWRfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUworI2RlZmluZSBiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWRfbmV3X3N0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX05FV19TVEFURQorI2RlZmluZSBiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfaWRfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX1NUQVRVUworI2RlZmluZSBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9pZF9hdmVyYWdlX25zcl91c2VkICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfQVZFUkFHRV9OU1JfVVNFRAorI2RlZmluZSBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9pZF9hdmVyYWdlX25zcl9hbGxvY2F0ZWQgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfQVZFUkFHRV9OU1JfQUxMT0NBVEVECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2lkX2F2ZXJhZ2Vfc3JfcmVwb3J0ICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX1NSX1JFUE9SVAorI2RlZmluZSBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0YXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0FMTE9DX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0YXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9BTEFSTV9SQUlTRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZ19pZF9nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19DRkdfSURfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfaWRfc3RhdF9hbGFybV9jbGVhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRAorI2RlZmluZSBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfaWRfc3RhdF9hbGFybV9yYWlzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2lkX251bV9vZl9jeWNsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0FMTE9DX0dFVF9TVEFUU19JRF9OVU1fT0ZfQ1lDTEVTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX1NUQVRTX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZV9pZF9zdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9BTExPQ19TRVRfU1RBVEVfSURfU1RBVEUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9BTExPQ19TRVRfU1RBVEVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5X2lkX3Bvbl9uaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0tFWV9JRF9QT05fTkkKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleV9pZF9nZW1fcG9ydF9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9LRVlfSURfR0VNX1BPUlRfSUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2lkX2NvbmZpZ3VyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9DT05GSUdVUkFUSU9OCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmdfaWRfb251X2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX09OVV9JRAorI2RlZmluZSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2lkX2dlbV9wb3J0X3N0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9HRU1fUE9SVF9TVEFURQorI2RlZmluZSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2lkX2VuY3J5cHRpb25fbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9FTkNSWVBUSU9OX01PREUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19pZF91cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfVVBTVFJFQU1fREVTVElOQVRJT05fUVVFVUUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19pZF9jb250cm9sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfQ09OVFJPTAorI2RlZmluZSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2lkX3R4X2J5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9JRF9UWF9CWVRFUworI2RlZmluZSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9pZF90eF9wYWNrZXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfSURfVFhfUEFDS0VUUworI2RlZmluZSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9pZF9yeF9wYWNrZXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfSURfUlhfUEFDS0VUUworI2RlZmluZSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9pZF9yeF9ieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfSURfUlhfQllURVMKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2lkX2NmZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0NGR19JRF9DRkcKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0FMQVJNX1JBSVNFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19pZF9zdGF0X2FsYXJtX2NsZWFyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19pZF9zdGF0X2FsYXJtX3JhaXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9BVVRPX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9pd2Zfa2V5X2lkX3Bvbl9uaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fSVdGX0tFWV9JRF9QT05fTkkKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2l3Zl9rZXlfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9JV0ZfS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2l3Zl9jZmdfaWRfdXNfb3RhZ19kaXJlY3RfdHBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9JV0ZfQ0ZHX0lEX1VTX09UQUdfRElSRUNUX1RQSUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2l3Zl9jZmdfaWRfZHNfdHBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9JV0ZfQ0ZHX0lEX0RTX1RQSUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX2l3Zl9jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9JV0ZfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2tleV9pZF9wb25fbmkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9LRVlfSURfUE9OX05JCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9rZXlfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfS0VZX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2NmZ19pZF9od19wb25faWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfSFdfUE9OX0lECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWRfYXZhaWxhYmxlX2JhbmR3aWR0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0FWQUlMQUJMRV9CQU5EV0lEVEgKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2NmZ19pZF9udW1iZXJfb2ZfYWN0aXZlX29udXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTlVNQkVSX09GX0FDVElWRV9PTlVTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWRfcG9uX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BPTl9TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2NmZ19pZF9wb25fZGlzdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUE9OX0RJU1RBTkNFCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWRfcmFuZ2luZ193aW5kb3dfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1JBTkdJTkdfV0lORE9XX1NJWkUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2NmZ19pZF9lcWRfY3ljbGVzX251bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfRVFEX0NZQ0xFU19OVU1CRVIKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2NmZ19pZF9kcmlmdF9jb250cm9sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfRFJJRlRfQ09OVFJPTAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfY2ZnX2lkX2xvc19hbGFybV90aHJlc2hvbGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9MT1NfQUxBUk1fVEhSRVNIT0xECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWRfbG9zX2luaXRpYWxfdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0xPU19JTklUSUFMX1ZBTFVFCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWRfb251X2FsYXJtc190aHJlc2hvbGRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX09OVV9BTEFSTVNfVEhSRVNIT0xEUworI2RlZmluZSBiY21vbHRfeGdwb25fbmlfY2ZnX2lkX2Jlcl9tb25pdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9CRVJfTU9OSVRPUgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfY2ZnX2lkX29udV9hY3RpdmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9PTlVfQUNUSVZBVElPTgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfY2ZnX2lkX3NuX2FjcXVpc2l0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9TTl9BQ1FVSVNJVElPTgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfY2ZnX2lkX2tleV9leGNoYW5nZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9LRVlfRVhDSEFOR0UKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2NmZ19pZF9wcm90ZWN0aW9uX3N3aXRjaGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkcKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2NmZ19pZF9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1ZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfREVCVUcKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2NmZ19pZF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQ0JSX1JUX0FMTE9DQVRJT05fUFJPRklMRQorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfY2ZnX2lkX2Nicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9DQlJfTlJUX0FMTE9DQVRJT05fUFJPRklMRQorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfY2ZnX2lkX3Bvd2VyX21hbmFnZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QT1dFUl9NQU5BR0VNRU5UCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1JPR1VFX09OVV9ERVRFQ1RJT05fUFJPQ0VTUworI2RlZmluZSBiY21vbHRfeGdwb25fbmlfY2ZnX2lkX3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QRVJJT0RJQ19TVEFOREJZX1BPTl9NT05JVE9SSU5HCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWRfZGJhX21vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RCQV9NT0RFCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWRfcGxvYW1faGFuZGxpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BMT0FNX0hBTkRMSU5HCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWRfbWluX2RhdGFfYWxsb2NfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX01JTl9EQVRBX0FMTE9DX0lECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWRfbWluX2RhdGFfZ2VtX3BvcnRfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX01JTl9EQVRBX0dFTV9QT1JUX0lECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWRfbXVsdGljYXN0X2tleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX01VTFRJQ0FTVF9LRVkKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2NmZ19pZF9wcmJzX2NoZWNrZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJCU19DSEVDS0VSCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWRfcHJic19nZW5lcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BSQlNfR0VORVJBVE9SCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWRfcHJic19zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BSQlNfU1RBVFVTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0FVVE9NQVRJQ19PTlVfREVBQ1RJVkFUSU9OCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWRfdXNfYmFuZHdpZHRoX2xpbWl0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1VTX0JBTkRXSURUSF9MSU1JVAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfY2ZnX2lkX2FsbF9vbnVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9BTExfT05VUworI2RlZmluZSBiY21vbHRfeGdwb25fbmlfY2ZnX2lkX2FsbF9tY2FzdF9nZW1fcG9ydHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9BTExfTUNBU1RfR0VNX1BPUlRTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWRfZGVidWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RFQlVHCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWRfb251X3VwZ3JhZGVfcGFyYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX09OVV9VUEdSQURFX1BBUkFNUworI2RlZmluZSBiY21vbHRfeGdwb25fbmlfY2ZnX2lkX2RzX2ZlY19tb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EU19GRUNfTU9ERQorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfY2ZnX2lkX2RiYV90eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EQkFfVFlQRQorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfY2ZnX2lkX29udV90dW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9PTlVfVFVOSU5HCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3N0YXRfaWRfZmVjX2NvZGV3b3JkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX0ZFQ19DT0RFV09SRFMKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3N0YXRfaWRfYmlwMzJfYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX0JJUDMyX0JZVEVTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkX2JpcDMyX2Vycm9ycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9CSVAzMl9FUlJPUlMKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3N0YXRfaWRfcnhfeGd0Y19oZWFkZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHVENfSEVBREVSUworI2RlZmluZSBiY21vbHRfeGdwb25fbmlfc3RhdF9pZF9yeF94Z3RjX2NvcnJlY3RlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdUQ19DT1JSRUNURUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3N0YXRfaWRfcnhfeGd0Y191bmNvcnJlY3RlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHVENfVU5DT1JSRUNURUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3N0YXRfaWRfcnhfeGdlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHRU0KKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3N0YXRfaWRfcnhfeGdlbV9kcm9wcGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHRU1fRFJPUFBFRAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfc3RhdF9pZF9yeF94Z2VtX2lkbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdFTV9JRExFCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkX3J4X3hnZW1fY29ycmVjdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR0VNX0NPUlJFQ1RFRAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfc3RhdF9pZF9yeF9jcmNfZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQ1JDX0VSUk9SCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkX3J4X2ZyYWdtZW50X2Vycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9GUkFHTUVOVF9FUlJPUgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfc3RhdF9pZF9yeF9wYWNrZXRzX2Ryb3BwZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUEFDS0VUU19EUk9QUEVECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkX3J4X2Ryb3BwZWRfdG9vX3Nob3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9EUk9QUEVEX1RPT19TSE9SVAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfc3RhdF9pZF9yeF9kcm9wcGVkX3Rvb19sb25nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fTE9ORworI2RlZmluZSBiY21vbHRfeGdwb25fbmlfc3RhdF9pZF9yeF9rZXlfZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfS0VZX0VSUk9SCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkX3R4X3Bsb2FtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9QTE9BTVMKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3N0YXRfaWRfcnhfcGxvYW1zX2Ryb3BwZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19EUk9QUEVECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkX3J4X2FsbG9jYXRpb25zX3ZhbGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19WQUxJRAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfc3RhdF9pZF9yeF9hbGxvY2F0aW9uc19pbnZhbGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfSU5WQUxJRAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfc3RhdF9pZF9yeF9hbGxvY2F0aW9uc19kaXNhYmxlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfRElTQUJMRUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3N0YXRfaWRfcnhfcGxvYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNUworI2RlZmluZSBiY21vbHRfeGdwb25fbmlfc3RhdF9pZF9yeF9wbG9hbXNfbm9uX2lkbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX05PTl9JRExFCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkX3J4X3Bsb2Ftc19lcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfRVJST1IKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3N0YXRfaWRfcnhfY3B1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0NQVQorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfc3RhdF9pZF9yeF9vbWNpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfT01DSQorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfc3RhdF9pZF9yeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfc3RhdF9pZF90eF9wYWNrZXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfUEFDS0VUUworI2RlZmluZSBiY21vbHRfeGdwb25fbmlfc3RhdF9pZF90eF94Z2VtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfWEdFTQorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfc3RhdF9pZF90eF9jcHUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfQ1BVCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkX3R4X29tY2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9PTUNJCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkX3R4X2NwdV9vbWNpX3BhY2tldHNfZHJvcHBlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9DUFVfT01DSV9QQUNLRVRTX0RST1BQRUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3N0YXRfaWRfdHhfZHJvcHBlZF9pbGxlZ2FsX2xlbmd0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfSUxMRUdBTF9MRU5HVEgKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3N0YXRfaWRfdHhfZHJvcHBlZF90cGlkX21pc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfVFBJRF9NSVNTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkX3R4X2Ryb3BwZWRfdmlkX21pc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX1ZJRF9NSVNTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19pZF9jZmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9DRkdfSURfQ0ZHCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0FDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2lkX2Vycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfRkFJTFVSRV9JRF9FUlJPUgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9pZF9nZW1fcG9ydF9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0ZBSUxVUkVfSURfR0VNX1BPUlRfSUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19GQUlMVVJFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9ERUFDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfRElTQUJMRV9BTExfT05VU19DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0VOQUJMRV9BTExfT05VU19DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfbG9zX2lkX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0xPU19JRF9TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2xvc19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9MT1NfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfaWRfc2VyaWFsX251bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1NFUklBTF9OVU1CRVIKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2lkX3JhbmdpbmdfdGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9SQU5HSU5HX1RJTUUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2lkX29udV9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9PTlVfSUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2lkX3Vwc3RyZWFtX2xpbmVfcmF0ZV9jYXBhYmlsaXRpZXMgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9VUFNUUkVBTV9MSU5FX1JBVEVfQ0FQQUJJTElUSUVTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9pZF9jdXJyZW50X2Rvd25zdHJlYW1fcG9uX2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfQ1VSUkVOVF9ET1dOU1RSRUFNX1BPTl9JRAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfaWRfY3VycmVudF91cHN0cmVhbV9wb25faWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX0NVUlJFTlRfVVBTVFJFQU1fUE9OX0lECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9pZF9jYWxpYnJhdGlvbl9yZWNvcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfQ0FMSUJSQVRJT05fUkVDT1JECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9pZF90dW5pbmdfZ3JhbnVsYXJpdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfVFVOSU5HX0dSQU5VTEFSSVRZCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9pZF9zdGVwX3R1bmluZ190aW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfU1RFUF9UVU5JTkdfVElNRQorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfaWRfYXR0ZW51YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX0FUVEVOVUFUSU9OCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9pZF9wb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfUE9XRVJfTEVWRUxMSU5HX0NBUEFCSUxJVElFUworI2RlZmluZSBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9PTlVfVVBHUkFERV9DT01QTEVURV9JRF9TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkX2xpc3Rfb2ZfZmFpbGVkX2VudGl0aWVzICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9PTlVfVVBHUkFERV9DT01QTEVURV9JRF9MSVNUX09GX0ZBSUxFRF9FTlRJVElFUworI2RlZmluZSBiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2lkX29udXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19PTlVTX1JBTkdFRF9JRF9PTlVTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfaWRfcmVzdWx0ICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVEX0lEX1JFU1VMVAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2lkX3Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRV9JRF9SRVNVTFQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkX3dpbmRvd190eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9XSU5ET1dfVFlQRQorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pZF9tZWFzdXJlbWVudF9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfTUVBU1VSRU1FTlRfU1RBVFVTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkX2FsbG9jX2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9BTExPQ19JRAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pZF9vbnVfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfT05VX0lECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkX2lzX2RlbGluZWF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9JU19ERUxJTkVBVElPTgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pZF9pc19lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfSVNfRUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaWRfcnhfZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1JYX0RBVEEKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaWRfcGxvYW1fcmVjZWl2ZWRfb251X2lkICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1BMT0FNX1JFQ0VJVkVEX09OVV9JRAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pZF9wbG9hbV9yZWNlaXZlZF9taWNfZXJyb3IgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUExPQU1fUkVDRUlWRURfTUlDX0VSUk9SCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfUk9HVUVfT05VX1NQRUNJQUxfTUFQX0NZQ0xFX1NUQVJUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TRVJJQUxfTlVNQkVSX0FDUVVJU0lUSU9OX0NZQ0xFX1NUQVJUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2lkX251bWJlcl9vZl9kZXRlY3RlZF9kZWxpbWl0ZXIgIEJDTU9MVF9YR1BPTl9OSV9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRF9JRF9OVU1CRVJfT0ZfREVURUNURURfREVMSU1JVEVSCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9pZF9lbmVyZ3lfZGV0ZWN0X3NpZ25hbCAgICAgICAgICBCQ01PTFRfWEdQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURURfSURfRU5FUkdZX0RFVEVDVF9TSUdOQUwKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkX3Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9SRVNVTFQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWRfcHJldmlvdXNfc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX1BSRVZJT1VTX1NUQVRFCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkX25ld19zdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9ORVdfU1RBVEUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9pZF90b2Rfc3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfVE9EX1NUUklORworI2RlZmluZSBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkX3NmYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9TRkMKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9pZF9ydGNfb2Zmc2V0X3NlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfUlRDX09GRlNFVF9TRUMKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9pZF9ydGNfb2Zmc2V0X25zZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfUlRDX09GRlNFVF9OU0VDCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfaWRfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1NUQVRVUworI2RlZmluZSBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19pZF9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19pZF9jcHVfcGFja2V0c19mYWlsdXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfQ1BVX1BBQ0tFVFNfRkFJTFVSRQorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfaWRfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX0RFQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19pZF9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfRElTQUJMRV9BTExfT05VU19DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2lkX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9FTkFCTEVfQUxMX09OVVNfQ09NUExFVEVECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19pZF9sb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfTE9TCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19pZF9vbnVfZGlzY292ZXJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfT05VX0RJU0NPVkVSRUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2lkX29udV91cGdyYWRlX2NvbXBsZXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9PTlVfVVBHUkFERV9DT01QTEVURQorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfaWRfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19pZF9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfU1dJVENIT1ZFUl9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2lkX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRQorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfaWRfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2lkX3JvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9ST0dVRV9PTlVfU1BFQ0lBTF9NQVBfQ1lDTEVfU1RBUlQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2lkX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9TRVJJQUxfTlVNQkVSX0FDUVVJU0lUSU9OX0NZQ0xFX1NUQVJUCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19pZF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2lkX3N0YXRfYWxhcm1fY2xlYXJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2lkX3N0YXRfYWxhcm1fcmFpc2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfaWRfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2lkX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9UT0RfUkVRVUVTVF9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9pZF9zZXJpYWxfbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfU0VSSUFMX05VTUJFUgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfaWRfZnJlcWVuY3lfYWRqdXN0bWVudF9kaXJlY3Rpb24gICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0FESlVTVF9UWF9XQVZFTEVOR1RIX0lEX0ZSRVFFTkNZX0FESlVTVE1FTlRfRElSRUNUSU9OCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9pZF9mcmVxdWVuY3lfYWRqdXN0bWVudF9zaXplICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfRlJFUVVFTkNZX0FESlVTVE1FTlRfU0laRQorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0FESlVTVF9UWF9XQVZFTEVOR1RIX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9pZF9jb250cm9sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9ESVNBQkxFX1NFUklBTF9OVU1CRVJfSURfQ09OVFJPTAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2lkX3NlcmlhbF9udW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9JRF9TRVJJQUxfTlVNQkVSCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3Jlc2V0X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9SRVNFVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkX3dpbmRvd190eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9XSU5ET1dfVFlQRQorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19pZF9hbGxvY19pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfQUxMT0NfSUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfaWRfb251X2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX09OVV9JRAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19pZF9zZWNvbmRfcmFuZ2luZ193aW5kb3cgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfU0VDT05EX1JBTkdJTkdfV0lORE9XCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfaWRfbnVtYmVyX29mX2N5Y2xlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfUlVOX1NQRUNJQUxfQldfTUFQX0lEX05VTUJFUl9PRl9DWUNMRQorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2lkX2FsbG9jYXRpb25fbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1JVTl9TUEVDSUFMX0JXX01BUF9JRF9BTExPQ0FUSU9OX05VTUJFUgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2lkX2J3X21hcF9hcnJheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1JVTl9TUEVDSUFMX0JXX01BUF9JRF9CV19NQVBfQVJSQVkKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9SVU5fU1BFQ0lBTF9CV19NQVBfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9pZF9vbnVfc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfU0VUX09OVV9TVEFURV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2lkX3Bvbl9zdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfU0VUX1BPTl9TVEFURV9JRF9QT05fU1RBVEUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TRVRfUE9OX1NUQVRFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TSU5HTEVfUkVRVUVTVF9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkX2xpc3Rfb2Zfb251X2lkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFSVF9PTlVfVVBHUkFERV9JRF9MSVNUX09GX09OVV9JRFMKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9TVEFSVF9PTlVfVVBHUkFERV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfVE9EX1JFUVVFU1RfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9pZF9wbG9hbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0JST0FEQ0FTVF9QTE9BTV9QQUNLRVRfSURfUExPQU0KKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9CUk9BRENBU1RfUExPQU1fUEFDS0VUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2lkX3BhY2tldF90eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfVFlQRQorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfaWRfY2FsY19jcmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0lEX0NBTENfQ1JDCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19pZF9nZW1fcG9ydF9saXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfSURfR0VNX1BPUlRfTElTVAorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfaWRfYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0lEX0JVRkZFUgorI2RlZmluZSBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9rZXlfaWRfcG9uX25pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX1BPTl9OSQorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2tleV9pZF9vbnVfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfT05VX0lECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2lkX29udV9zdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9PTlVfU1RBVEUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9jZmdfaWRfb251X29sZF9zdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX09OVV9PTERfU1RBVEUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9jZmdfaWRfYWxhcm1fc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0FMQVJNX1NUQVRFCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2lkX3JlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SRUdJU1RSQVRJT05fRU5DUllQVElPTl9LRVlTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2lkX2N1cnJlbnRfZW5jcnlwdGlvbl9rZXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9DVVJSRU5UX0VOQ1JZUFRJT05fS0VZCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2lkX3NlcmlhbF9udW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9TRVJJQUxfTlVNQkVSCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2lkX3JlZ2lzdHJhdGlvbl9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SRUdJU1RSQVRJT05fSUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9jZmdfaWRfcmVnaXN0cmF0aW9uX2lkX2F1dG9fbGVhcm5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JFR0lTVFJBVElPTl9JRF9BVVRPX0xFQVJOSU5HCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2lkX3JhbmdpbmdfYnVyc3RfcHJvZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SQU5HSU5HX0JVUlNUX1BST0ZJTEUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9jZmdfaWRfZGF0YV9idXJzdF9wcm9maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0RBVEFfQlVSU1RfUFJPRklMRQorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2NmZ19pZF9yYW5naW5nX3RpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkFOR0lOR19USU1FCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2lkX2Rpc2FibGVkX2FmdGVyX2Rpc2NvdmVyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9ESVNBQkxFRF9BRlRFUl9ESVNDT1ZFUlkKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9jZmdfaWRfZGVhY3RpdmF0aW9uX3JlYXNvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0RFQUNUSVZBVElPTl9SRUFTT04KKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9jZmdfaWRfYWxsX2dlbV9wb3J0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0FMTF9HRU1fUE9SVFMKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9jZmdfaWRfYWxsX2FsbG9jcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0FMTF9BTExPQ1MKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9jZmdfaWRfZXh0ZW5kZWRfZ3VhcmRfdGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0VYVEVOREVEX0dVQVJEX1RJTUUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9jZmdfaWRfdXNfbGluZV9yYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1VTX0xJTkVfUkFURQorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2NmZ19pZF9jYWxpYnJhdGlvbl9yZWNvcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQ0FMSUJSQVRJT05fUkVDT1JECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2lkX3R1bmluZ19ncmFudWxhcml0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9UVU5JTkdfR1JBTlVMQVJJVFkKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9jZmdfaWRfc3RlcF90dW5pbmdfdGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1NURVBfVFVOSU5HX1RJTUUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9jZmdfaWRfcG93ZXJfbGV2ZWxsaW5nX2NhcGFiaWxpdGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1BPV0VSX0xFVkVMTElOR19DQVBBQklMSVRJRVMKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9jZmdfaWRfcmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JFUVVFU1RfUkVHSVNUUkFUSU9OX1NUQVRVUworI2RlZmluZSBiY21vbHRfeGdwb25fb251X2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3N0YXRfaWRfcG9zaXRpdmVfZHJpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1BPU0lUSVZFX0RSSUZUCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9pZF9uZWdhdGl2ZV9kcmlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfTkVHQVRJVkVfRFJJRlQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9zdGF0X2lkX2RlbGltaXRlcl9taXNzX2RldGVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9ERUxJTUlURVJfTUlTU19ERVRFQ1RJT04KKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9zdGF0X2lkX2JpcDMyX2Vycm9ycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9CSVAzMl9FUlJPUlMKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9zdGF0X2lkX3J4X3dvcmRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9XT1JEUworI2RlZmluZSBiY21vbHRfeGdwb25fb251X3N0YXRfaWRfZmVjX2NvcnJlY3RlZF9zeW1ib2xzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0ZFQ19DT1JSRUNURURfU1lNQk9MUworI2RlZmluZSBiY21vbHRfeGdwb25fb251X3N0YXRfaWRfZmVjX2NvcnJlY3RlZF9jb2Rld29yZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0ZFQ19DT1JSRUNURURfQ09ERVdPUkRTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9pZF9mZWNfdW5jb3JyZWN0YWJsZV9jb2Rld29yZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX1VOQ09SUkVDVEFCTEVfQ09ERVdPUkRTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9pZF9mZWNfY29kZXdvcmRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEUworI2RlZmluZSBiY21vbHRfeGdwb25fb251X3N0YXRfaWRfZmVjX2NvcnJlY3RlZF9iaXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0ZFQ19DT1JSRUNURURfQklUUworI2RlZmluZSBiY21vbHRfeGdwb25fb251X3N0YXRfaWRfeGdlbV9rZXlfZXJyb3JzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1hHRU1fS0VZX0VSUk9SUworI2RlZmluZSBiY21vbHRfeGdwb25fb251X3N0YXRfaWRfeGdlbV9sb3NzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1hHRU1fTE9TUworI2RlZmluZSBiY21vbHRfeGdwb25fb251X3N0YXRfaWRfcnhfcGxvYW1zX21pY19lcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX1BMT0FNU19NSUNfRVJST1IKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9zdGF0X2lkX3J4X3Bsb2Ftc19ub25faWRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfTk9OX0lETEUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9zdGF0X2lkX3J4X29tY2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9PTUNJCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9pZF9yeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3N0YXRfaWRfcnhfYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX0JZVEVTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9pZF9yeF9wYWNrZXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfUEFDS0VUUworI2RlZmluZSBiY21vbHRfeGdwb25fb251X3N0YXRfaWRfdHhfYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1RYX0JZVEVTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9pZF90eF9wYWNrZXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfVFhfUEFDS0VUUworI2RlZmluZSBiY21vbHRfeGdwb25fb251X3N0YXRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19pZF9jZmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9DRkdfSURfQ0ZHCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1NUQVRfQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9kZmlfaWRfYWxhcm1fc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfREZJX0lEX0FMQVJNX1NUQVRVUworI2RlZmluZSBiY21vbHRfeGdwb25fb251X2RmaV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9ERklfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2RnaV9pZF9hbGFybV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9ER0lfSURfQUxBUk1fU1RBVFVTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfZGdpX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0RHSV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9pZF9hbGFybV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0RPV0lfSURfQUxBUk1fU1RBVFVTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9pZF9kcmlmdF92YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0RPV0lfSURfRFJJRlRfVkFMVUUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9kb3dpX2lkX25ld19lcWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfRE9XSV9JRF9ORVdfRVFECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0RPV0lfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfaWRfYWxsb2NfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9JTlZBTElEX0RCUlVfUkVQT1JUX0lEX0FMTE9DX0lECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0lOVkFMSURfREJSVV9SRVBPUlRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfaWRfbmV3X2tleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9LRVlfRVhDSEFOR0VfQ09NUExFVEVEX0lEX05FV19LRVkKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0tFWV9FWENIQU5HRV9DWUNMRV9TS0lQUEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkX2V4cGVjdGVkX2tleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSF9JRF9FWFBFQ1RFRF9LRVkKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkX3JlY2VpdmVkX2tleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSF9JRF9SRUNFSVZFRF9LRVkKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfUkVRVUVTVF9USU1FT1VUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9sb29jaV9pZF9hbGFybV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfTE9PQ0lfSURfQUxBUk1fU1RBVFVTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0xPT0NJX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWRfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUworI2RlZmluZSBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9pZF9mYWlsX3JlYXNvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfRkFJTF9SRUFTT04KKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWRfcmVnaXN0cmF0aW9uX2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX1JFR0lTVFJBVElPTl9JRAorI2RlZmluZSBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9pZF9yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfUkVHSVNUUkFUSU9OX0VOQ1JZUFRJT05fS0VZUworI2RlZmluZSBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X29udV9hbGFybV9pZF9vbnVfYWxhcm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfQUxBUk1fSURfT05VX0FMQVJNCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX09OVV9BTEFSTV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWRfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUworI2RlZmluZSBiY21vbHRfeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfREVBQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2lkX3NlcmlhbF9udW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX09OVV9ESVNBQkxFX0NPTVBMRVRFRF9JRF9TRVJJQUxfTlVNQkVSCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX09OVV9ESVNBQkxFX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfaWRfc2VyaWFsX251bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX09OVV9FTkFCTEVfQ09NUExFVEVEX0lEX1NFUklBTF9OVU1CRVIKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfT05VX0VOQUJMRV9DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2lkX3Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX0lOX0NPTVBMRVRFRF9JRF9SRVNVTFQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9pZF9mYWlsX3JlYXNvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19JTl9DT01QTEVURURfSURfRkFJTF9SRUFTT04KKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19JTl9DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9pZF9yZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9DT01QTEVURURfSURfUkVTVUxUCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2lkX2ZhaWxfcmVhc29uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9DT01QTEVURURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X29wdGljYWxfcmVmbGVjdGlvbl9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9PUFRJQ0FMX1JFRkxFQ1RJT05fSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2lkX2FsYXJtX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9QT1NTSUJMRV9EUklGVF9JRF9BTEFSTV9TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9pZF9lc3RpbWF0ZWRfZHJpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfUE9TU0lCTEVfRFJJRlRfSURfRVNUSU1BVEVEX0RSSUZUCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1BPU1NJQkxFX0RSSUZUX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfaWRfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0ICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfQ09OU1VNUFRJT05fUkVQT1JUX0lEX1BPV0VSX0NPTlNVTVBUSU9OX1JFUE9SVAorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9DT05TVU1QVElPTl9SRVBPUlRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9pZF9hdHRlbnVhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9MRVZFTF9SRVBPUlRfSURfQVRURU5VQVRJT04KKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfaWRfcG93ZXJfbGV2ZWxsaW5nX2NhcGFiaWxpdHkgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfTEVWRUxfUkVQT1JUX0lEX1BPV0VSX0xFVkVMTElOR19DQVBBQklMSVRZCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1BPV0VSX0xFVkVMX1JFUE9SVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfaWRfb2xkX3N0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX09MRF9TVEFURQorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2lkX25ld19zdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9ORVdfU1RBVEUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9pZF9yZWFzb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0VfSURfUkVBU09OCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9wcXNpX2lkX2FsYXJtX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfUFFTSV9JRF9BTEFSTV9TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9wcXNpX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfUFFTSV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWRfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX1NUQVRVUworI2RlZmluZSBiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2lkX2ZhaWxfcmVhc29uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2lkX2VxZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9FUUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9pZF9udW1iZXJfb2ZfcGxvYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfTlVNQkVSX09GX1BMT0FNUworI2RlZmluZSBiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2lkX3Bvd2VyX2xldmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9QT1dFUl9MRVZFTAorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2lkX3JlZ2lzdHJhdGlvbl9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1JFR0lTVFJBVElPTl9JRF9JRF9SRUdJU1RSQVRJT05fSUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfaWRfcmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfUkVHSVNUUkFUSU9OX0lEX0lEX1JFUVVFU1RfUkVHSVNUUkFUSU9OX1NUQVRVUworI2RlZmluZSBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9pZF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9mYWlsX3JlYXNvbiAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9SRUdJU1RSQVRJT05fSURfSURfUkVRVUVTVF9SRUdJU1RSQVRJT05fRkFJTF9SRUFTT04KKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfUkVHSVNUUkFUSU9OX0lEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZF9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfU1RBVFVTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWRfZmFpbF9yZWFzb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9zZGlfaWRfYWxhcm1fc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfU0RJX0lEX0FMQVJNX1NUQVRVUworI2RlZmluZSBiY21vbHRfeGdwb25fb251X3NkaV9pZF9iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9TRElfSURfQkVSCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfc2RpX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1NESV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2lkX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTFVSRV9JRF9TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfaWRfZmFpbF9yZWFzb24gICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9GQUlMVVJFX0lEX0ZBSUxfUkVBU09OCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTFVSRV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2lkX2FsYXJtX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1NGSV9JRF9BTEFSTV9TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9zZmlfaWRfYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfU0ZJX0lEX0JFUgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3NmaV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9TRklfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVAorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0FMQVJNX0NMRUFSRURfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0YXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1NUQVRfQUxBUk1fUkFJU0VEX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9zdWZpX2lkX2FsYXJtX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfU1VGSV9JRF9BTEFSTV9TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9zdWZpX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfU1VGSV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9pZF9hbGFybV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1RJV0lfSURfQUxBUk1fU1RBVFVTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9pZF9kcmlmdF92YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1RJV0lfSURfRFJJRlRfVkFMVUUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV90aXdpX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfVElXSV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2lkX2FjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1RVTklOR19SRVNQT05TRV9JRF9BQ0sKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfaWRfcmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfVFVOSU5HX1JFU1BPTlNFX0lEX1JFU1VMVAorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9UVU5JTkdfUkVTUE9OU0VfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2lkX2RmaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9ERkkKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZF9kZ2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfREdJCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfaWRfZG93aSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0RPV0kKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZF9pbnZhbGlkX2RicnVfcmVwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfSU5WQUxJRF9EQlJVX1JFUE9SVAorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2lkX2tleV9leGNoYW5nZV9jb21wbGV0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfQ09NUExFVEVECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfaWRfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9DWUNMRV9TS0lQUEVECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfaWRfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0gKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZF9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0tFWV9SRVFVRVNUX1RJTUVPVVQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZF9sb29jaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfTE9PQ0kKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZF9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0FDVElWQVRJT05fQ09NUExFVEVECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfaWRfb251X2FsYXJtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9BTEFSTQorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2lkX29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfREVBQ1RJVkFUSU9OX0NPTVBMRVRFRAorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2lkX29udV9kaXNhYmxlX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfRElTQUJMRV9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZF9vbnVfZW5hYmxlX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0VOQUJMRV9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZF9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX1RVTklOR19JTl9DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZF9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX1RVTklOR19PVVRfQ09NUExFVEVECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfaWRfb3B0aWNhbF9yZWZsZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09QVElDQUxfUkVGTEVDVElPTgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2lkX3Bvc3NpYmxlX2RyaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9QT1NTSUJMRV9EUklGVAorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2lkX3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9QT1dFUl9DT05TVU1QVElPTl9SRVBPUlQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZF9wb3dlcl9sZXZlbF9yZXBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUE9XRVJfTEVWRUxfUkVQT1JUCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfaWRfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfaWRfcHFzaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1BRU0kKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZF9yYW5naW5nX2NvbXBsZXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUkFOR0lOR19DT01QTEVURUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZF9yZWdpc3RyYXRpb25faWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUkVHSVNUUkFUSU9OX0lECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfaWRfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfaWRfc2RpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1NESQorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2lkX3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZSAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0ZBSUxVUkUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZF9zZmkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU0ZJCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfaWRfc3RhdF9hbGFybV9jbGVhcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRAorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2lkX3N0YXRfYWxhcm1fcmFpc2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRAorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2lkX3N1ZmkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9TVUZJCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfaWRfdGl3aSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1RJV0kKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZF90dW5pbmdfcmVzcG9uc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfVFVOSU5HX1JFU1BPTlNFCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9pZF9mcmVxdWVuY3lfYWRqdXN0bWVudF9kaXJlY3Rpb24gICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfRlJFUVVFTkNZX0FESlVTVE1FTlRfRElSRUNUSU9OCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfaWRfZnJlcXVlbmN5X2FkanVzdG1lbnRfc2l6ZSAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0FESlVTVF9UWF9XQVZFTEVOR1RIX0lEX0ZSRVFVRU5DWV9BREpVU1RNRU5UX1NJWkUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfaWRfY29udHJvbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9DSEFOR0VfUE9XRVJfTEVWRUxMSU5HX0lEX0NPTlRST0wKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2lkX2F0dGVudWF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQ0hBTkdFX1BPV0VSX0xFVkVMTElOR19JRF9BVFRFTlVBVElPTgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9DSEFOR0VfUE9XRVJfTEVWRUxMSU5HX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9nZXRfcG93ZXJfY29uc3VtcHRpb25faWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfR0VUX1BPV0VSX0NPTlNVTVBUSU9OX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9nZXRfcG93ZXJfbGV2ZWxfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfR0VUX1BPV0VSX0xFVkVMX0lEX19OVU1fT0YKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19JTl9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfaWRfdGFyZ2V0X2RzX3Bvbl9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1RBUkdFVF9EU19QT05fSUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9pZF90YXJnZXRfdXNfcG9uX2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfSURfVEFSR0VUX1VTX1BPTl9JRAorI2RlZmluZSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2lkX3RpbWVfdG9fc3dpdGNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9JRF9USU1FX1RPX1NXSVRDSAorI2RlZmluZSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2lkX3JvbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9JRF9ST0xMQkFDSworI2RlZmluZSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2lkX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9JRF9TVEFUVVMKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2lkX3NtYV9mbGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9SRVFVRVNUX1JFR0lTVFJBVElPTl9JRF9TTUFfRkxBRworI2RlZmluZSBiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9SRVFVRVNUX1JFR0lTVFJBVElPTl9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25faWRfbWFzdGVyX2tleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0lEX01BU1RFUl9LRVkKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2lkX2J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9JRF9CVUZGRVIKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2lkX21pYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9JRF9NSUMKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9pZF9vbnVfc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1NFVF9PTlVfU1RBVEVfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2lkX3BhY2tldF90eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfVFlQRQorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2lkX2NhbGNfY3JjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9DQUxDX0NSQworI2RlZmluZSBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2lkX251bWJlcl9vZl9wYWNrZXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9OVU1CRVJfT0ZfUEFDS0VUUworI2RlZmluZSBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2lkX3BhY2tldF9zaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfU0laRQorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2lkX2J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9CVUZGRVIKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9pZF9kZWZhdWx0X2tleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9QTE9BTV9QQUNLRVRfSURfREVGQVVMVF9LRVkKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfaWRfcGxvYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfUExPQU1fUEFDS0VUX0lEX1BMT0FNCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX1BMT0FNX1BBQ0tFVF9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9pZF9wb3J0X2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRfSURfUE9SVF9JRAorI2RlZmluZSBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfaWRfY3JjX29rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUX0lEX0NSQ19PSworI2RlZmluZSBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfaWRfcGFja2V0X3NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUX0lEX1BBQ0tFVF9TSVpFCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9pZF9idWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRfSURfQlVGRkVSCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2lkX3BvcnRfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9QT1JUX0lECisjZGVmaW5lIGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfaWRfY3JjX29rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fT05VX09NQ0lfUEFDS0VUX0lEX0NSQ19PSworI2RlZmluZSBiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2lkX3BhY2tldF9zaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9QQUNLRVRfU0laRQorI2RlZmluZSBiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2lkX2J1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9CVUZGRVIKKyNkZWZpbmUgYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeGdwb25fdHJ4X2tleV9pZF9wb25fbmkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX1RSWF9LRVlfSURfUE9OX05JCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl90cnhfa2V5X2lkX19udW1fb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fVFJYX0tFWV9JRF9fTlVNX09GCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2lkX2J1cnN0X3Byb2ZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9CVVJTVF9QUk9GSUxFCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2lkX3RyYW5zY2VpdmVyX2NvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9UUkFOU0NFSVZFUl9DT05GSUcKKyNkZWZpbmUgYmNtb2x0X3hncG9uX3RyeF9jZmdfaWRfdHJhbnNjZWl2ZXJfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1RSQU5TQ0VJVkVSX1RZUEUKKyNkZWZpbmUgYmNtb2x0X3hncG9uX3RyeF9jZmdfaWRfZGVidWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0RFQlVHCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2lkX3Jzc2lfbm9ybWFsX2NvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SU1NJX05PUk1BTF9DT05GSUcKKyNkZWZpbmUgYmNtb2x0X3hncG9uX3RyeF9jZmdfaWRfcnNzaV9yYW5naW5nX2NvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1JTU0lfUkFOR0lOR19DT05GSUcKKyNkZWZpbmUgYmNtb2x0X3hncG9uX3RyeF9jZmdfaWRfc2VyZGVzX2NvbmZpZ3VyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1NFUkRFU19DT05GSUdVUkFUSU9OCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2lkX2J1cnN0X3Byb2ZpbGVfZGVsaW1pdGVyX21heF9lcnJvcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9CVVJTVF9QUk9GSUxFX0RFTElNSVRFUl9NQVhfRVJST1JTCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2lkX3Jhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SQU5HSU5HX1NNX1BBVFRFUk5TX0FUX0lOSVQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX3RyeF9jZmdfaWRfcmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1JBTkdJTkdfU01fUEFUVEVSTlNfRURfRkFJTFVSRQorI2RlZmluZSBiY21vbHRfeGdwb25fdHJ4X2NmZ19pZF9yZXNldF9vbl9kZWxfbWlzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUkVTRVRfT05fREVMX01JU1MKKyNkZWZpbmUgYmNtb2x0X3hncG9uX3RyeF9jZmdfaWRfZWRfc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0VEX1NUQVRFCisjZGVmaW5lIGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2lkX2ludmVydF9lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9JTlZFUlRfRUQKKyNkZWZpbmUgYmNtb2x0X3hncG9uX3RyeF9jZmdfaWRfZW5kX29mX2J1cnN0X3Jlc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0VORF9PRl9CVVJTVF9SRVNFVAorI2RlZmluZSBiY21vbHRfeGdwb25fdHJ4X2NmZ19pZF90cnhfcnN0X3BvbGFyaXR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfVFJYX1JTVF9QT0xBUklUWQorI2RlZmluZSBiY21vbHRfeGdwb25fdHJ4X2NmZ19pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeHBvbl9zZXJkZXNfa2V5X2lkX3Bvbl9uaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hQT05fU0VSREVTX0tFWV9JRF9QT05fTkkKKyNkZWZpbmUgYmNtb2x0X3hwb25fc2VyZGVzX2tleV9pZF9pbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YUE9OX1NFUkRFU19LRVlfSURfSU5TVEFOQ0UKKyNkZWZpbmUgYmNtb2x0X3hwb25fc2VyZGVzX2tleV9pZF9fbnVtX29mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YUE9OX1NFUkRFU19LRVlfSURfX05VTV9PRgorI2RlZmluZSBiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2lkX3J4X3ZnYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9WR0EKKyNkZWZpbmUgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19pZF9yeF9wZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfUEYKKyNkZWZpbmUgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19pZF9yeF9sZnBmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfTEZQRgorI2RlZmluZSBiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2lkX3J4X2RmZTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkUxCisjZGVmaW5lIGJjbW9sdF94cG9uX3NlcmRlc19jZmdfaWRfcnhfZGZlMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTIKKyNkZWZpbmUgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19pZF9yeF9kZmUzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFMworI2RlZmluZSBiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2lkX3J4X2RmZTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkU0CisjZGVmaW5lIGJjbW9sdF94cG9uX3NlcmRlc19jZmdfaWRfcnhfZGZlNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTUKKyNkZWZpbmUgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19pZF90eF9wcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfUFJFCisjZGVmaW5lIGJjbW9sdF94cG9uX3NlcmRlc19jZmdfaWRfdHhfbWFpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX01BSU4KKyNkZWZpbmUgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19pZF90eF9wb3N0MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfUE9TVDEKKyNkZWZpbmUgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19pZF90eF9wb3N0MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfUE9TVDIKKyNkZWZpbmUgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19pZF90eF9wb3N0MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfUE9TVDMKKyNkZWZpbmUgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19pZF90eF9hbXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfQU1QCisjZGVmaW5lIGJjbW9sdF94cG9uX3NlcmRlc19jZmdfaWRfX251bV9vZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX19OVU1fT0YKKworLyoqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBvYmplY3QgdHlwZSBoYXMgdGhlIGdpdmVuIHRhZy4gCisgKgorICogXHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBvYmplY3QgaGFzIHRoZSBnaXZlbiB0YWcsIGZhbHNlIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfb2JqX2hhc190YWcoYmNtb2x0X29ial9pZCBvYmosIGJjbW9sdF9vYmpfdGFnIHRhZyk7CisKKy8qKiBAfSAqLworI2VuZGlmIC8qIEJDTU9MVF9NT0RFTF9JRFNfSF8gKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9tb2RlbC9iY21vbHRfbW9kZWxfcmV2aXNpb24uaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9tb2RlbC9iY21vbHRfbW9kZWxfcmV2aXNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41ZjkzODgwCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL21vZGVsL2JjbW9sdF9tb2RlbF9yZXZpc2lvbi5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6cHJvcHJpZXRhcnk6c3RhbmRhcmQKKyAKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAKK1RoaXMgcHJvZ3JhbSBpcyB0aGUgcHJvcHJpZXRhcnkgc29mdHdhcmUgb2YgQnJvYWRjb20gQ29ycG9yYXRpb24gYW5kL29yIGl0cworbGljZW5zb3JzLCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgZHVwbGljYXRlZCwgbW9kaWZpZWQgb3IgZGlzdHJpYnV0ZWQgcHVyc3VhbnQKK3RvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiBhIHNlcGFyYXRlLCB3cml0dGVuIGxpY2Vuc2UgYWdyZWVtZW50IGV4ZWN1dGVkCitiZXR3ZWVuIHlvdSBhbmQgQnJvYWRjb20gKGFuICJBdXRob3JpemVkIExpY2Vuc2UiKS4gIEV4Y2VwdCBhcyBzZXQgZm9ydGggaW4KK2FuIEF1dGhvcml6ZWQgTGljZW5zZSwgQnJvYWRjb20gZ3JhbnRzIG5vIGxpY2Vuc2UgKGV4cHJlc3Mgb3IgaW1wbGllZCksIHJpZ2h0Cit0byB1c2UsIG9yIHdhaXZlciBvZiBhbnkga2luZCB3aXRoIHJlc3BlY3QgdG8gdGhlIFNvZnR3YXJlLCBhbmQgQnJvYWRjb20KK2V4cHJlc3NseSByZXNlcnZlcyBhbGwgcmlnaHRzIGluIGFuZCB0byB0aGUgU29mdHdhcmUgYW5kIGFsbCBpbnRlbGxlY3R1YWwKK3Byb3BlcnR5IHJpZ2h0cyB0aGVyZWluLiAgSUYgWU9VIEhBVkUgTk8gQVVUSE9SSVpFRCBMSUNFTlNFLCBUSEVOIFlPVSBIQVZFCitOTyBSSUdIVCBUTyBVU0UgVEhJUyBTT0ZUV0FSRSBJTiBBTlkgV0FZLCBBTkQgU0hPVUxEIElNTUVESUFURUxZIE5PVElGWQorQlJPQURDT00gQU5EIERJU0NPTlRJTlVFIEFMTCBVU0UgT0YgVEhFIFNPRlRXQVJFLgorIAorRXhjZXB0IGFzIGV4cHJlc3NseSBzZXQgZm9ydGggaW4gdGhlIEF1dGhvcml6ZWQgTGljZW5zZSwKKyAKKzEuIFRoaXMgcHJvZ3JhbSwgaW5jbHVkaW5nIGl0cyBzdHJ1Y3R1cmUsIHNlcXVlbmNlIGFuZCBvcmdhbml6YXRpb24sCisgICAgY29uc3RpdHV0ZXMgdGhlIHZhbHVhYmxlIHRyYWRlIHNlY3JldHMgb2YgQnJvYWRjb20sIGFuZCB5b3Ugc2hhbGwgdXNlCisgICAgYWxsIHJlYXNvbmFibGUgZWZmb3J0cyB0byBwcm90ZWN0IHRoZSBjb25maWRlbnRpYWxpdHkgdGhlcmVvZiwgYW5kIHRvCisgICAgdXNlIHRoaXMgaW5mb3JtYXRpb24gb25seSBpbiBjb25uZWN0aW9uIHdpdGggeW91ciB1c2Ugb2YgQnJvYWRjb20KKyAgICBpbnRlZ3JhdGVkIGNpcmN1aXQgcHJvZHVjdHMuCisgCisyLiBUTyBUSEUgTUFYSU1VTSBFWFRFTlQgUEVSTUlUVEVEIEJZIExBVywgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIKKyAgICBBTkQgV0lUSCBBTEwgRkFVTFRTIEFORCBCUk9BRENPTSBNQUtFUyBOTyBQUk9NSVNFUywgUkVQUkVTRU5UQVRJT05TIE9SCisgICAgV0FSUkFOVElFUywgRUlUSEVSIEVYUFJFU1MsIElNUExJRUQsIFNUQVRVVE9SWSwgT1IgT1RIRVJXSVNFLCBXSVRICisgICAgUkVTUEVDVCBUTyBUSEUgU09GVFdBUkUuICBCUk9BRENPTSBTUEVDSUZJQ0FMTFkgRElTQ0xBSU1TIEFOWSBBTkQKKyAgICBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIFRJVExFLCBNRVJDSEFOVEFCSUxJVFksIE5PTklORlJJTkdFTUVOVCwKKyAgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgTEFDSyBPRiBWSVJVU0VTLCBBQ0NVUkFDWSBPUgorICAgIENPTVBMRVRFTkVTUywgUVVJRVQgRU5KT1lNRU5ULCBRVUlFVCBQT1NTRVNTSU9OIE9SIENPUlJFU1BPTkRFTkNFCisgICAgVE8gREVTQ1JJUFRJT04uIFlPVSBBU1NVTUUgVEhFIEVOVElSRSBSSVNLIEFSSVNJTkcgT1VUIE9GIFVTRSBPUgorICAgIFBFUkZPUk1BTkNFIE9GIFRIRSBTT0ZUV0FSRS4KKyAKKzMuIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBJTiBOTyBFVkVOVCBTSEFMTCBCUk9BRENPTSBPUgorICAgIElUUyBMSUNFTlNPUlMgQkUgTElBQkxFIEZPUiAoaSkgQ09OU0VRVUVOVElBTCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAgICBJTkRJUkVDVCwgT1IgRVhFTVBMQVJZIERBTUFHRVMgV0hBVFNPRVZFUiBBUklTSU5HIE9VVCBPRiBPUiBJTiBBTlkKKyAgICBXQVkgUkVMQVRJTkcgVE8gWU9VUiBVU0UgT0YgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgU09GVFdBUkUgRVZFTgorICAgIElGIEJST0FEQ09NIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUzsKKyAgICBPUiAoaWkpIEFOWSBBTU9VTlQgSU4gRVhDRVNTIE9GIFRIRSBBTU9VTlQgQUNUVUFMTFkgUEFJRCBGT1IgVEhFCisgICAgU09GVFdBUkUgSVRTRUxGIE9SIFUuUy4gJDEsIFdISUNIRVZFUiBJUyBHUkVBVEVSLiBUSEVTRSBMSU1JVEFUSU9OUworICAgIFNIQUxMIEFQUExZIE5PVFdJVEhTVEFORElORyBBTlkgRkFJTFVSRSBPRiBFU1NFTlRJQUwgUFVSUE9TRSBPRiBBTlkKKyAgICBMSU1JVEVEIFJFTUVEWS4KKzo+CisqLworI2RlZmluZSBCQ01PTFRfTU9ERUxfUkVWSVNJT04gMQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL21vZGVsL2JjbW9sdF9tb2RlbF90eXBlcy5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL21vZGVsL2JjbW9sdF9tb2RlbF90eXBlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZTNjMzEKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvbW9kZWwvYmNtb2x0X21vZGVsX3R5cGVzLmMKQEAgLTAsMCArMSwxMDU0ODQgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6cHJvcHJpZXRhcnk6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitUaGlzIHByb2dyYW0gaXMgdGhlIHByb3ByaWV0YXJ5IHNvZnR3YXJlIG9mIEJyb2FkY29tIENvcnBvcmF0aW9uIGFuZC9vciBpdHMKK2xpY2Vuc29ycywgYW5kIG1heSBvbmx5IGJlIHVzZWQsIGR1cGxpY2F0ZWQsIG1vZGlmaWVkIG9yIGRpc3RyaWJ1dGVkIHB1cnN1YW50Cit0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgYSBzZXBhcmF0ZSwgd3JpdHRlbiBsaWNlbnNlIGFncmVlbWVudCBleGVjdXRlZAorYmV0d2VlbiB5b3UgYW5kIEJyb2FkY29tIChhbiAiQXV0aG9yaXplZCBMaWNlbnNlIikuICBFeGNlcHQgYXMgc2V0IGZvcnRoIGluCithbiBBdXRob3JpemVkIExpY2Vuc2UsIEJyb2FkY29tIGdyYW50cyBubyBsaWNlbnNlIChleHByZXNzIG9yIGltcGxpZWQpLCByaWdodAordG8gdXNlLCBvciB3YWl2ZXIgb2YgYW55IGtpbmQgd2l0aCByZXNwZWN0IHRvIHRoZSBTb2Z0d2FyZSwgYW5kIEJyb2FkY29tCitleHByZXNzbHkgcmVzZXJ2ZXMgYWxsIHJpZ2h0cyBpbiBhbmQgdG8gdGhlIFNvZnR3YXJlIGFuZCBhbGwgaW50ZWxsZWN0dWFsCitwcm9wZXJ0eSByaWdodHMgdGhlcmVpbi4gIElGIFlPVSBIQVZFIE5PIEFVVEhPUklaRUQgTElDRU5TRSwgVEhFTiBZT1UgSEFWRQorTk8gUklHSFQgVE8gVVNFIFRISVMgU09GVFdBUkUgSU4gQU5ZIFdBWSwgQU5EIFNIT1VMRCBJTU1FRElBVEVMWSBOT1RJRlkKK0JST0FEQ09NIEFORCBESVNDT05USU5VRSBBTEwgVVNFIE9GIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGV4cHJlc3NseSBzZXQgZm9ydGggaW4gdGhlIEF1dGhvcml6ZWQgTGljZW5zZSwKKworMS4gVGhpcyBwcm9ncmFtLCBpbmNsdWRpbmcgaXRzIHN0cnVjdHVyZSwgc2VxdWVuY2UgYW5kIG9yZ2FuaXphdGlvbiwKKyAgICBjb25zdGl0dXRlcyB0aGUgdmFsdWFibGUgdHJhZGUgc2VjcmV0cyBvZiBCcm9hZGNvbSwgYW5kIHlvdSBzaGFsbCB1c2UKKyAgICBhbGwgcmVhc29uYWJsZSBlZmZvcnRzIHRvIHByb3RlY3QgdGhlIGNvbmZpZGVudGlhbGl0eSB0aGVyZW9mLCBhbmQgdG8KKyAgICB1c2UgdGhpcyBpbmZvcm1hdGlvbiBvbmx5IGluIGNvbm5lY3Rpb24gd2l0aCB5b3VyIHVzZSBvZiBCcm9hZGNvbQorICAgIGludGVncmF0ZWQgY2lyY3VpdCBwcm9kdWN0cy4KKworMi4gVE8gVEhFIE1BWElNVU0gRVhURU5UIFBFUk1JVFRFRCBCWSBMQVcsIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiCisgICAgQU5EIFdJVEggQUxMIEZBVUxUUyBBTkQgQlJPQURDT00gTUFLRVMgTk8gUFJPTUlTRVMsIFJFUFJFU0VOVEFUSU9OUyBPUgorICAgIFdBUlJBTlRJRVMsIEVJVEhFUiBFWFBSRVNTLCBJTVBMSUVELCBTVEFUVVRPUlksIE9SIE9USEVSV0lTRSwgV0lUSAorICAgIFJFU1BFQ1QgVE8gVEhFIFNPRlRXQVJFLiAgQlJPQURDT00gU1BFQ0lGSUNBTExZIERJU0NMQUlNUyBBTlkgQU5ECisgICAgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBUSVRMRSwgTUVSQ0hBTlRBQklMSVRZLCBOT05JTkZSSU5HRU1FTlQsCisgICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIExBQ0sgT0YgVklSVVNFUywgQUNDVVJBQ1kgT1IKKyAgICBDT01QTEVURU5FU1MsIFFVSUVUIEVOSk9ZTUVOVCwgUVVJRVQgUE9TU0VTU0lPTiBPUiBDT1JSRVNQT05ERU5DRQorICAgIFRPIERFU0NSSVBUSU9OLiBZT1UgQVNTVU1FIFRIRSBFTlRJUkUgUklTSyBBUklTSU5HIE9VVCBPRiBVU0UgT1IKKyAgICBQRVJGT1JNQU5DRSBPRiBUSEUgU09GVFdBUkUuCisKKzMuIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBJTiBOTyBFVkVOVCBTSEFMTCBCUk9BRENPTSBPUgorICAgIElUUyBMSUNFTlNPUlMgQkUgTElBQkxFIEZPUiAoaSkgQ09OU0VRVUVOVElBTCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAgICBJTkRJUkVDVCwgT1IgRVhFTVBMQVJZIERBTUFHRVMgV0hBVFNPRVZFUiBBUklTSU5HIE9VVCBPRiBPUiBJTiBBTlkKKyAgICBXQVkgUkVMQVRJTkcgVE8gWU9VUiBVU0UgT0YgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgU09GVFdBUkUgRVZFTgorICAgIElGIEJST0FEQ09NIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUzsKKyAgICBPUiAoaWkpIEFOWSBBTU9VTlQgSU4gRVhDRVNTIE9GIFRIRSBBTU9VTlQgQUNUVUFMTFkgUEFJRCBGT1IgVEhFCisgICAgU09GVFdBUkUgSVRTRUxGIE9SIFUuUy4gJDEsIFdISUNIRVZFUiBJUyBHUkVBVEVSLiBUSEVTRSBMSU1JVEFUSU9OUworICAgIFNIQUxMIEFQUExZIE5PVFdJVEhTVEFORElORyBBTlkgRkFJTFVSRSBPRiBFU1NFTlRJQUwgUFVSUE9TRSBPRiBBTlkKKyAgICBMSU1JVEVEIFJFTUVEWS4KKzo+CisqLworI2luY2x1ZGUgImJjbW9sdF9tb2RlbF90eXBlcy5oIgorI2luY2x1ZGUgImJjbW9sdF9tb2RlbF9pZHMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FjdGl2YXRpb25fZmFpbF9yZWFzb25fcGFjayhiY21vbHRfYWN0aXZhdGlvbl9mYWlsX3JlYXNvbiB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hY3RpdmF0aW9uX2ZhaWxfcmVhc29uX3VucGFjayhiY21vbHRfYWN0aXZhdGlvbl9mYWlsX3JlYXNvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZGRpdGlvbmFsX2J3X2VsaWdpYmlsaXR5X3BhY2soYmNtb2x0X2FkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHkgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWRkaXRpb25hbF9id19lbGlnaWJpbGl0eV91bnBhY2soYmNtb2x0X2FkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfbmlfY2ZnX2lkX3BhY2soYmNtb2x0X2FlX25pX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX25pX2NmZ19pZF91bnBhY2soYmNtb2x0X2FlX25pX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX25pX2VuX3N0YXRlX3BhY2soYmNtb2x0X2FlX25pX2VuX3N0YXRlIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX25pX2VuX3N0YXRlX3VucGFjayhiY21vbHRfYWVfbmlfZW5fc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfbmlfa2V5X2lkX3BhY2soYmNtb2x0X2FlX25pX2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX25pX2tleV9pZF91bnBhY2soYmNtb2x0X2FlX25pX2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9pZF9wYWNrKGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfaWRfdW5wYWNrKGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2lkX3BhY2soYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2lkX3VucGFjayhiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfZHNfa2V5X2lkX3BhY2soYmNtb2x0X2FlX3BhdGhfZHNfa2V5X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF9kc19rZXlfaWRfdW5wYWNrKGJjbW9sdF9hZV9wYXRoX2RzX2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3BhY2soYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfdW5wYWNrKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWRfcGFjayhiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWRfdW5wYWNrKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZ19pZF9wYWNrKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZ19pZF91bnBhY2soYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfaWRfcGFjayhiY21vbHRfYWVfcGF0aF9kc19zdGF0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2lkX3VucGFjayhiY21vbHRfYWVfcGF0aF9kc19zdGF0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19pZF9wYWNrKGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19pZF91bnBhY2soYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX2tleV9pZF9wYWNrKGJjbW9sdF9hZV9wYXRoX3VzX2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfa2V5X2lkX3VucGFjayhiY21vbHRfYWVfcGF0aF91c19rZXlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9wYWNrKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3VucGFjayhiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3BhY2soYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3VucGFjayhiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfaWRfcGFjayhiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfaWRfdW5wYWNrKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2lkX3BhY2soYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9pZF91bnBhY2soYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FsbG9jX29wZXJhdGlvbl9wYWNrKGJjbW9sdF9hbGxvY19vcGVyYXRpb24gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWxsb2Nfb3BlcmF0aW9uX3VucGFjayhiY21vbHRfYWxsb2Nfb3BlcmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FsbG9jX3N0YXRlX3BhY2soYmNtb2x0X2FsbG9jX3N0YXRlIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FsbG9jX3N0YXRlX3VucGFjayhiY21vbHRfYWxsb2Nfc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWxsb2NfdHlwZV9wYWNrKGJjbW9sdF9hbGxvY190eXBlIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FsbG9jX3R5cGVfdW5wYWNrKGJjbW9sdF9hbGxvY190eXBlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FsbG9jX3R5cGVfdG9fc2Nhbl9wYWNrKGJjbW9sdF9hbGxvY190eXBlX3RvX3NjYW4gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWxsb2NfdHlwZV90b19zY2FuX3VucGFjayhiY21vbHRfYWxsb2NfdHlwZV90b19zY2FuICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9tb2RlX3BhY2soYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9tb2RlIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9tb2RlX3VucGFjayhiY21vbHRfYXBpX2NhcHR1cmVfYnVmZmVyX21vZGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXBpX2NhcHR1cmVfbG9jYXRpb25fcGFjayhiY21vbHRfYXBpX2NhcHR1cmVfbG9jYXRpb24gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXBpX2NhcHR1cmVfbG9jYXRpb25fdW5wYWNrKGJjbW9sdF9hcGlfY2FwdHVyZV9sb2NhdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9jYWxpYnJhdGlvbl9yZWNvcmRfcGFjayhiY21vbHRfY2FsaWJyYXRpb25fcmVjb3JkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2NhbGlicmF0aW9uX3JlY29yZF91bnBhY2soYmNtb2x0X2NhbGlicmF0aW9uX3JlY29yZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zaWduX3BhY2soYmNtb2x0X3NpZ24gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc2lnbl91bnBhY2soYmNtb2x0X3NpZ24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdXBzdHJlYW1fbGluZV9yYXRlX2NhcGFiaWxpdGllc19wYWNrKGJjbW9sdF91cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Vwc3RyZWFtX2xpbmVfcmF0ZV9jYXBhYmlsaXRpZXNfdW5wYWNrKGJjbW9sdF91cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xpbmtfdHlwZV9wYWNrKGJjbW9sdF9saW5rX3R5cGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbGlua190eXBlX3VucGFjayhiY21vbHRfbGlua190eXBlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2NhcHR1cmVfc3Ryb2JlX3NpZ25hbF9wYWNrKGJjbW9sdF9jYXB0dXJlX3N0cm9iZV9zaWduYWwgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfY2FwdHVyZV9zdHJvYmVfc2lnbmFsX3VucGFjayhiY21vbHRfY2FwdHVyZV9zdHJvYmVfc2lnbmFsICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2NoYW5uZWxfY2ZnX2lkX3BhY2soYmNtb2x0X2NoYW5uZWxfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfY2hhbm5lbF9jZmdfaWRfdW5wYWNrKGJjbW9sdF9jaGFubmVsX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2NoYW5uZWxfa2V5X2lkX3BhY2soYmNtb2x0X2NoYW5uZWxfa2V5X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfY2hhbm5lbF9rZXlfaWRfdW5wYWNrKGJjbW9sdF9jaGFubmVsX2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2NvbnNvbGVfcmVkaXJlY3Rpb25fcGFjayhiY21vbHRfY29uc29sZV9yZWRpcmVjdGlvbiB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9jb25zb2xlX3JlZGlyZWN0aW9uX3VucGFjayhiY21vbHRfY29uc29sZV9yZWRpcmVjdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9jb250cm9sX3N0YXRlX3BhY2soYmNtb2x0X2NvbnRyb2xfc3RhdGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfY29udHJvbF9zdGF0ZV91bnBhY2soYmNtb2x0X2NvbnRyb2xfc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGJhX21vZGVfcGFjayhiY21vbHRfZGJhX21vZGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGJhX21vZGVfdW5wYWNrKGJjbW9sdF9kYmFfbW9kZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kYmFfcmFtX3BhY2soYmNtb2x0X2RiYV9yYW0gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGJhX3JhbV91bnBhY2soYmNtb2x0X2RiYV9yYW0gKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGJhX3R5cGVfcGFjayhiY21vbHRfZGJhX3R5cGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGJhX3R5cGVfdW5wYWNrKGJjbW9sdF9kYmFfdHlwZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZHJfdGVzdF9zdGF0dXNfcGFjayhiY21vbHRfZGRyX3Rlc3Rfc3RhdHVzIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Rkcl90ZXN0X3N0YXR1c191bnBhY2soYmNtb2x0X2Rkcl90ZXN0X3N0YXR1cyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZHJfdGVzdF9yZXN1bHRfcGFjayhiY21vbHRfZGRyX3Rlc3RfcmVzdWx0IHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Rkcl90ZXN0X3Jlc3VsdF91bnBhY2soYmNtb2x0X2Rkcl90ZXN0X3Jlc3VsdCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ob3N0X2Nvbm5lY3Rpb25fZmFpbF9yZWFzb25fcGFjayhiY21vbHRfaG9zdF9jb25uZWN0aW9uX2ZhaWxfcmVhc29uIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2hvc3RfY29ubmVjdGlvbl9mYWlsX3JlYXNvbl91bnBhY2soYmNtb2x0X2hvc3RfY29ubmVjdGlvbl9mYWlsX3JlYXNvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZWFjdGl2YXRpb25fcmVhc29uX3BhY2soYmNtb2x0X2RlYWN0aXZhdGlvbl9yZWFzb24gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGVhY3RpdmF0aW9uX3JlYXNvbl91bnBhY2soYmNtb2x0X2RlYWN0aXZhdGlvbl9yZWFzb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfYXV0b19jZmdfaWRfcGFjayhiY21vbHRfZGVidWdfYXV0b19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19pZF91bnBhY2soYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfY2ZnX2lkX3BhY2soYmNtb2x0X2RlYnVnX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2NmZ19pZF91bnBhY2soYmNtb2x0X2RlYnVnX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9pZF9wYWNrKGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfaWRfdW5wYWNrKGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2lkX3BhY2soYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2lkX3VucGFjayhiY21vbHRfZGVidWdfY2xpX291dHB1dF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2ZpbGVfYWxtb3N0X2Z1bGxfaWRfcGFjayhiY21vbHRfZGVidWdfZmlsZV9hbG1vc3RfZnVsbF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2ZpbGVfYWxtb3N0X2Z1bGxfaWRfdW5wYWNrKGJjbW9sdF9kZWJ1Z19maWxlX2FsbW9zdF9mdWxsX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfa2V5X2lkX3BhY2soYmNtb2x0X2RlYnVnX2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2tleV9pZF91bnBhY2soYmNtb2x0X2RlYnVnX2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX3Jlc2V0X2FwaV9jYXB0dXJlX2lkX3BhY2soYmNtb2x0X2RlYnVnX3Jlc2V0X2FwaV9jYXB0dXJlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfcmVzZXRfYXBpX2NhcHR1cmVfaWRfdW5wYWNrKGJjbW9sdF9kZWJ1Z19yZXNldF9hcGlfY2FwdHVyZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX3N0YXJ0X2FwaV9jYXB0dXJlX2lkX3BhY2soYmNtb2x0X2RlYnVnX3N0YXJ0X2FwaV9jYXB0dXJlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfc3RhcnRfYXBpX2NhcHR1cmVfaWRfdW5wYWNrKGJjbW9sdF9kZWJ1Z19zdGFydF9hcGlfY2FwdHVyZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX3N0b3BfYXBpX2NhcHR1cmVfaWRfcGFjayhiY21vbHRfZGVidWdfc3RvcF9hcGlfY2FwdHVyZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX3N0b3BfYXBpX2NhcHR1cmVfaWRfdW5wYWNrKGJjbW9sdF9kZWJ1Z19zdG9wX2FwaV9jYXB0dXJlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2lkX3BhY2soYmNtb2x0X2RldmljZV9hdXRvX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9hdXRvX2NmZ19pZF91bnBhY2soYmNtb2x0X2RldmljZV9hdXRvX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9jZmdfaWRfcGFjayhiY21vbHRfZGV2aWNlX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9jZmdfaWRfdW5wYWNrKGJjbW9sdF9kZXZpY2VfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2NoaXBfcmV2aXNpb25fcGFjayhiY21vbHRfZGV2aWNlX2NoaXBfcmV2aXNpb24gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2NoaXBfcmV2aXNpb25fdW5wYWNrKGJjbW9sdF9kZXZpY2VfY2hpcF9yZXZpc2lvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfY29ubmVjdF9pZF9wYWNrKGJjbW9sdF9kZXZpY2VfY29ubmVjdF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9jb25uZWN0X2lkX3VucGFjayhiY21vbHRfZGV2aWNlX2Nvbm5lY3RfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9pZF9wYWNrKGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2lkX3VucGFjayhiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9lc3RhYmxpc2hlZF9pZF9wYWNrKGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9lc3RhYmxpc2hlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2VzdGFibGlzaGVkX2lkX3VucGFjayhiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZXN0YWJsaXNoZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2lkX3BhY2soYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2lkX3VucGFjayhiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9pZF9wYWNrKGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfaWRfdW5wYWNrKGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfaWRfcGFjayhiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2lkX3VucGFjayhiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9pZF9wYWNrKGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9pZF91bnBhY2soYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfZGlzY29ubmVjdF9pZF9wYWNrKGJjbW9sdF9kZXZpY2VfZGlzY29ubmVjdF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9kaXNjb25uZWN0X2lkX3VucGFjayhiY21vbHRfZGV2aWNlX2Rpc2Nvbm5lY3RfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfZGlzY29ubmVjdGlvbl9jb21wbGV0ZV9pZF9wYWNrKGJjbW9sdF9kZXZpY2VfZGlzY29ubmVjdGlvbl9jb21wbGV0ZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9kaXNjb25uZWN0aW9uX2NvbXBsZXRlX2lkX3VucGFjayhiY21vbHRfZGV2aWNlX2Rpc2Nvbm5lY3Rpb25fY29tcGxldGVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2lkX3BhY2soYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2lkX3VucGFjayhiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9pZF9wYWNrKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfaWRfdW5wYWNrKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9pZF9wYWNrKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2lkX3VucGFjayhiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfaWRfcGFjayhiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2lkX3VucGFjayhiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGVfcGFjayhiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGVfdW5wYWNrKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHlwZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9pZF9wYWNrKGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2lkX3VucGFjayhiY21vbHRfZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2Vfa2V5X2lkX3BhY2soYmNtb2x0X2RldmljZV9rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2Vfa2V5X2lkX3VucGFjayhiY21vbHRfZGV2aWNlX2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zcGVlZF9wYWNrKGJjbW9sdF9ubmlfc3BlZWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3NwZWVkX3VucGFjayhiY21vbHRfbm5pX3NwZWVkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9yZXNldF9pZF9wYWNrKGJjbW9sdF9kZXZpY2VfcmVzZXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfcmVzZXRfaWRfdW5wYWNrKGJjbW9sdF9kZXZpY2VfcmVzZXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfcmVzZXRfbW9kZV9wYWNrKGJjbW9sdF9kZXZpY2VfcmVzZXRfbW9kZSB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfcmVzZXRfbW9kZV91bnBhY2soYmNtb2x0X2RldmljZV9yZXNldF9tb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfaWRfcGFjayhiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfaWRfdW5wYWNrKGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX3N0YXRlX3BhY2soYmNtb2x0X2RldmljZV9zdGF0ZSB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9zdGF0ZV91bnBhY2soYmNtb2x0X2RldmljZV9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9zd19lcnJvcl9pZF9wYWNrKGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfaWRfdW5wYWNrKGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2lkX3BhY2soYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25faWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2lkX3VucGFjayhiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9zd191cGdyYWRlX2FjdGl2YXRlX2lkX3BhY2soYmNtb2x0X2RldmljZV9zd191cGdyYWRlX2FjdGl2YXRlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX3N3X3VwZ3JhZGVfYWN0aXZhdGVfaWRfdW5wYWNrKGJjbW9sdF9kZXZpY2Vfc3dfdXBncmFkZV9hY3RpdmF0ZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Rpc2FibGVfc2VyaWFsX251bWJlcl9jb250cm9sX3BhY2soYmNtb2x0X2Rpc2FibGVfc2VyaWFsX251bWJlcl9jb250cm9sIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Rpc2FibGVfc2VyaWFsX251bWJlcl9jb250cm9sX3VucGFjayhiY21vbHRfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2NvbnRyb2wgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZHJ2X2ljZl9pZF9wYWNrKGJjbW9sdF9kcnZfaWNmX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Rydl9pY2ZfaWRfdW5wYWNrKGJjbW9sdF9kcnZfaWNmX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Rydl9zZ2JfaWRfcGFjayhiY21vbHRfZHJ2X3NnYl9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kcnZfc2diX2lkX3VucGFjayhiY21vbHRfZHJ2X3NnYl9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kc192bGFuX2FjdGlvbl9wYWNrKGJjbW9sdF9kc192bGFuX2FjdGlvbiB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kc192bGFuX2FjdGlvbl91bnBhY2soYmNtb2x0X2RzX3ZsYW5fYWN0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RmYl90cmFwX2JlaGF2aW9yX3BhY2soYmNtb2x0X3RmYl90cmFwX2JlaGF2aW9yIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RmYl90cmFwX2JlaGF2aW9yX3VucGFjayhiY21vbHRfdGZiX3RyYXBfYmVoYXZpb3IgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdGZiX21vZGVfcGFjayhiY21vbHRfdGZiX21vZGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdGZiX21vZGVfdW5wYWNrKGJjbW9sdF90ZmJfbW9kZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9saW1fc2VjX21vZGVfdXBfcGFjayhiY21vbHRfbGltX3NlY19tb2RlX3VwIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xpbV9zZWNfbW9kZV91cF91bnBhY2soYmNtb2x0X2xpbV9zZWNfbW9kZV91cCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9saW1fc2VjX21vZGVfZG5fcGFjayhiY21vbHRfbGltX3NlY19tb2RlX2RuIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xpbV9zZWNfbW9kZV9kbl91bnBhY2soYmNtb2x0X2xpbV9zZWNfbW9kZV9kbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94aW1fc2VjX21vZGVfcGFjayhiY21vbHRfeGltX3NlY19tb2RlIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hpbV9zZWNfbW9kZV91bnBhY2soYmNtb2x0X3hpbV9zZWNfbW9kZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9oc2NfcmFtX3BhY2soYmNtb2x0X2hzY19yYW0gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfaHNjX3JhbV91bnBhY2soYmNtb2x0X2hzY19yYW0gKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbGltX3JhbV9wYWNrKGJjbW9sdF9saW1fcmFtIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xpbV9yYW1fdW5wYWNrKGJjbW9sdF9saW1fcmFtICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xreV9yYW1fcGFjayhiY21vbHRfbGt5X3JhbSB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sa3lfcmFtX3VucGFjayhiY21vbHRfbGt5X3JhbSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9taWNfcmFtX3BhY2soYmNtb2x0X21pY19yYW0gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbWljX3JhbV91bnBhY2soYmNtb2x0X21pY19yYW0gKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeHBjc3JtX3JhbV9wYWNrKGJjbW9sdF94cGNzcm1fcmFtIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hwY3NybV9yYW1fdW5wYWNrKGJjbW9sdF94cGNzcm1fcmFtICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2VtYmVkZGVkX2ltYWdlX3RyYW5zZmVyX3N0YXR1c19wYWNrKGJjbW9sdF9lbWJlZGRlZF9pbWFnZV90cmFuc2Zlcl9zdGF0dXMgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZW1iZWRkZWRfaW1hZ2VfdHJhbnNmZXJfc3RhdHVzX3VucGFjayhiY21vbHRfZW1iZWRkZWRfaW1hZ2VfdHJhbnNmZXJfc3RhdHVzICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9mb3JtYXRfcGFjayhiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2Zvcm1hdCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2VuY3J5cHRpb25faW5mb3JtYXRpb25fZm9ybWF0X3VucGFjayhiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2Zvcm1hdCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lbmVyZ3lfZGV0ZWN0X3NvdXJjZV9wYWNrKGJjbW9sdF9lbmVyZ3lfZGV0ZWN0X3NvdXJjZSB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lbmVyZ3lfZGV0ZWN0X3NvdXJjZV91bnBhY2soYmNtb2x0X2VuZXJneV9kZXRlY3Rfc291cmNlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fMWdfdHVyYm9fbW9kZV9wYWNrKGJjbW9sdF9lcG9uXzFnX3R1cmJvX21vZGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl8xZ190dXJib19tb2RlX3VucGFjayhiY21vbHRfZXBvbl8xZ190dXJib19tb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X21vZGVfcGFjayhiY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfbW9kZSB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfbW9kZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RiYV9yZXBvcnRpbmdfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX2RiYV9yZXBvcnRpbmdfbW9kZSB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RiYV9yZXBvcnRpbmdfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fZGJhX3JlcG9ydGluZ19tb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19yYXRlX3BhY2soYmNtb2x0X2Vwb25fbGlua19yYXRlIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3JhdGVfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfcmF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0YXR1c19wYWNrKGJjbW9sdF9zdGF0dXMgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc3RhdHVzX3VucGFjayhiY21vbHRfc3RhdHVzICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfaWRfcGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfaWRfcGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19pZF91bnBhY2soYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXlfaWRfcGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleV9pZF91bnBhY2soYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uX2lkX3BhY2soYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9pZF91bnBhY2soYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9pZF9wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb25faWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb25faWRfdW5wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb25faWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9pZF9wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uX2lkX3VucGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25faWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2lkX3BhY2soYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25faWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2lkX3VucGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uX2lkX3BhY2soYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25faWRfdW5wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2lkX3BhY2soYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25faWRfdW5wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9pZF9wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25faWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25faWRfdW5wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25faWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfaWRfcGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX2lkX3VucGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2lkX3BhY2soYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9pZF91bnBhY2soYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbl9pZF9wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25faWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25faWRfdW5wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25faWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fbW9kZV9wYWNrKGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fbW9kZSB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9lbmNyeXB0aW9uX21vZGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2tleV9jaG9pY2VfcGFjayhiY21vbHRfZXBvbl9rZXlfY2hvaWNlIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fa2V5X2Nob2ljZV91bnBhY2soYmNtb2x0X2Vwb25fa2V5X2Nob2ljZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fZGlyZWN0aW9uX3BhY2soYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9kaXJlY3Rpb24gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2RpcmVjdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9kaXJlY3Rpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGVfcGFjayhiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGVfdW5wYWNrKGJjbW9sdF9lcG9uX2ZlY19lbl9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3R5cGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdHlwZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19kZWxldGVfbGlua19pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfZGVsZXRlX2xpbmtfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfZGVsZXRlX2xpbmtfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfZGVsZXRlX2xpbmtfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfaWRfcGFjayhiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2VuY3J5cHRpb25fZW5hYmxlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfZW5jcnlwdGlvbl9lbmFibGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2VuY3J5cHRpb25fZW5hYmxlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fbGlua19lbmNyeXB0aW9uX2VuYWJsZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfZmVjX3N0YXRlX3BhY2soYmNtb2x0X2Vwb25fbGlua19mZWNfc3RhdGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2ZlY19zdGF0ZV91bnBhY2soYmNtb2x0X2Vwb25fbGlua19mZWNfc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2ZvcmNlX3JlZGlzY292ZXJ5X2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19mb3JjZV9yZWRpc2NvdmVyeV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19mb3JjZV9yZWRpc2NvdmVyeV9pZF91bnBhY2soYmNtb2x0X2Vwb25fbGlua19mb3JjZV9yZWRpc2NvdmVyeV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdHVzX3BhY2soYmNtb2x0X2Vwb25fbGlua19zdGF0dXMgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3N0YXR1c191bnBhY2soYmNtb2x0X2Vwb25fbGlua19zdGF0dXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbXBjcF9kaXNjb3ZlcnlfaW5mb19wYWNrKGJjbW9sdF9tcGNwX2Rpc2NvdmVyeV9pbmZvIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbXBjcF9kaXNjb3ZlcnlfaW5mb191bnBhY2soYmNtb2x0X21wY3BfZGlzY292ZXJ5X2luZm8gKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0ZWRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BfaWRfcGFjayhiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdG9wX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdG9wX2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdG9wX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdG9wcGVkX2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcHBlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcHBlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcHBlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19rZXlfaWRfcGFjayhiY21vbHRfZXBvbl9saW5rX2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19rZXlfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2xpbmtfZGVsZXRlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfbGlua19kZWxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2xpbmtfZGVsZXRlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fbGlua19saW5rX2RlbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kZXJlZ2lzdGVyZWRfaWRfcGFjayhiY21vbHRfZXBvbl9saW5rX21wY3BfZGVyZWdpc3RlcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX21wY3BfZGVyZWdpc3RlcmVkX2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX21wY3BfZGVyZWdpc3RlcmVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZWdfYWNrX3RpbWVvdXRfaWRfcGFjayhiY21vbHRfZXBvbl9saW5rX21wY3BfcmVnX2Fja190aW1lb3V0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX21wY3BfcmVnX2Fja190aW1lb3V0X2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX21wY3BfcmVnX2Fja190aW1lb3V0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfaWRfcGFjayhiY21vbHRfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9pZF91bnBhY2soYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9pZF91bnBhY2soYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydGVkX2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydGVkX2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BfaWRfcGFjayhiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BwZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfcmVyYW5nZV9mYWlsdXJlX2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19yZXJhbmdlX2ZhaWx1cmVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfcmVyYW5nZV9mYWlsdXJlX2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX3JlcmFuZ2VfZmFpbHVyZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfcGFjayhiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX3N0YXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGVfZmxhZ3NfcGFjayhiY21vbHRfZXBvbl9saW5rX3N0YXRlX2ZsYWdzIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0ZV9mbGFnc191bnBhY2soYmNtb2x0X2Vwb25fbGlua19zdGF0ZV9mbGFncyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lX2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RvbmVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lX2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZG9uZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25faWRfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua190eXBlX3BhY2soYmNtb2x0X2Vwb25fbGlua190eXBlIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua190eXBlX3VucGFjayhiY21vbHRfZXBvbl9saW5rX3R5cGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbXBjcF9nYXRlX21vZGVfcGFjayhiY21vbHRfbXBjcF9nYXRlX21vZGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbXBjcF9nYXRlX21vZGVfdW5wYWNrKGJjbW9sdF9tcGNwX2dhdGVfbW9kZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9tcGNwX3JlZ2lzdHJhdGlvbl9nYXRlX2ZsYWdzX3BhY2soYmNtb2x0X21wY3BfcmVnaXN0cmF0aW9uX2dhdGVfZmxhZ3MgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9tcGNwX3JlZ2lzdHJhdGlvbl9nYXRlX2ZsYWdzX3VucGFjayhiY21vbHRfbXBjcF9yZWdpc3RyYXRpb25fZ2F0ZV9mbGFncyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfaWRfcGFjayhiY21vbHRfZXBvbl9uaV9hZGRfbGlua19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX25pX2FkZF9saW5rX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfaWRfcGFjayhiY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19pZF91bnBhY2soYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19pZF9wYWNrKGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19pZF91bnBhY2soYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2lkX3BhY2soYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2lkX3VucGFjayhiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlX2lkX3BhY2soYmNtb2x0X2Vwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmVfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX25pX2F1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmVfaWRfcGFjayhiY21vbHRfZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmVfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX25pX2F1dG9fcm9ndWVfc2Nhbl8xZ19mYWlsdXJlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9jZmdfaWRfcGFjayhiY21vbHRfZXBvbl9uaV9jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2NmZ19pZF91bnBhY2soYmNtb2x0X2Vwb25fbmlfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9lbl9zdGF0ZV9wYWNrKGJjbW9sdF9lcG9uX25pX2VuX3N0YXRlIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfZW5fc3RhdGVfdW5wYWNrKGJjbW9sdF9lcG9uX25pX2VuX3N0YXRlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9pZF9wYWNrKGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2tleV9pZF9wYWNrKGJjbW9sdF9lcG9uX25pX2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfa2V5X2lkX3VucGFjayhiY21vbHRfZXBvbl9uaV9rZXlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfaWRfcGFjayhiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2lkX3VucGFjayhiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2lkX3BhY2soYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0c19pZF9wYWNrKGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkX3BhY2soYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkX3VucGFjayhiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YV9pZF9wYWNrKGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3JlcmFuZ2VfZmFpbHVyZV9pZF9wYWNrKGJjbW9sdF9lcG9uX25pX3JlcmFuZ2VfZmFpbHVyZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfcmVyYW5nZV9mYWlsdXJlX2lkX3VucGFjayhiY21vbHRfZXBvbl9uaV9yZXJhbmdlX2ZhaWx1cmVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9pZF9wYWNrKGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2lkX3VucGFjayhiY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW5faWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfaWRfcGFjayhiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2lkX3VucGFjayhiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2lkX3BhY2soYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2lkX3VucGFjayhiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWRfcGFjayhiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2V4dGVuc2lvbl90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2V4dGVuc2lvbl90eXBlIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2V4dGVuc2lvbl90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZXh0ZW5zaW9uX3R5cGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2lkX3BhY2soYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19pZF91bnBhY2soYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfaWRfcGFjayhiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleV9pZF9wYWNrKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleV9pZF91bnBhY2soYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3BhY2soYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3VucGFjayhiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmdfaWRfcGFjayhiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2lkX3VucGFjayhiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfaWRfcGFjayhiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9pZF91bnBhY2soYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfaWRfcGFjayhiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19pZF91bnBhY2soYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2lkX3BhY2soYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19pZF91bnBhY2soYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleV9pZF9wYWNrKGJjbW9sdF9lcG9uX29udV8xZ191c19rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19rZXlfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX29udV8xZ191c19rZXlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfcGFjayhiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3VucGFjayhiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWRfcGFjayhiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfaWRfcGFjayhiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19pZF91bnBhY2soYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9pZF9wYWNrKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9pZF91bnBhY2soYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV91cGdyYWRlX29udV9yZXNwb25zZV9jb2RlX3BhY2soYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfb251X3Jlc3BvbnNlX2NvZGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9vbnVfcmVzcG9uc2VfY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfb251X3Jlc3BvbnNlX2NvZGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9yZXR1cm5fY29kZV9wYWNrKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3JldHVybl9jb2RlIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcmV0dXJuX2NvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3JldHVybl9jb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfaWRfcGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfaWRfcGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19pZF91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXlfaWRfcGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleV9pZF91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfcGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2lkX3BhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2lkX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9pZF9wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2lkX3BhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2lkX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2lkX3BhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5X2lkX3BhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXlfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3BhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWRfcGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19pZF9wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19pZF91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfaWRfcGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2lkX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2lkX3BhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19pZF91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfaWRfcGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleV9pZF9wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleV9pZF91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3BhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfaWRfcGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2lkX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfaWRfcGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9pZF91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2lkX3BhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19pZF91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfaWRfcGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleV9pZF9wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleV9pZF91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3BhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfaWRfcGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2lkX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWRfcGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9pZF91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N0YXRlX3BhY2soYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zdGF0ZSB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3RhdGVfdW5wYWNrKGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX3BhY2soYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZSB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGV0ZWN0aW9uX29wdGlvbnNfcGFjayhiY21vbHRfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGV0ZWN0aW9uX29wdGlvbnMgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGV0ZWN0aW9uX29wdGlvbnNfdW5wYWNrKGJjbW9sdF9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZXRlY3Rpb25fb3B0aW9ucyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3JlcmFuZ2luZ19vcHRpb25zX3BhY2soYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfcmVyYW5naW5nX29wdGlvbnMgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19yZXJhbmdpbmdfb3B0aW9uc191bnBhY2soYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfcmVyYW5naW5nX29wdGlvbnMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bpb19waW5fcGFjayhiY21vbHRfZ3Bpb19waW4gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bpb19waW5fdW5wYWNrKGJjbW9sdF9ncGlvX3BpbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncGlvX3BvbGFyaXR5X3BhY2soYmNtb2x0X2dwaW9fcG9sYXJpdHkgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bpb19wb2xhcml0eV91bnBhY2soYmNtb2x0X2dwaW9fcG9sYXJpdHkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9ycF9jZmdfaWRfcGFjayhiY21vbHRfZXBvbl9ycF9jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3JwX2NmZ19pZF91bnBhY2soYmNtb2x0X2Vwb25fcnBfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9ycF9rZXlfaWRfcGFjayhiY21vbHRfZXBvbl9ycF9rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3JwX2tleV9pZF91bnBhY2soYmNtb2x0X2Vwb25fcnBfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXh0X2lycV9wYWNrKGJjbW9sdF9leHRfaXJxIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2V4dF9pcnFfdW5wYWNrKGJjbW9sdF9leHRfaXJxICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2ZsdXNoX21hY190YWJsZV9vcHRpb25fcGFjayhiY21vbHRfZmx1c2hfbWFjX3RhYmxlX29wdGlvbiB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9mbHVzaF9tYWNfdGFibGVfb3B0aW9uX3VucGFjayhiY21vbHRfZmx1c2hfbWFjX3RhYmxlX29wdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9mcmVxdWVuY3lfYWRqdXN0bWVudF9kaXJlY3Rpb25fcGFjayhiY21vbHRfZnJlcXVlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2ZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbl91bnBhY2soYmNtb2x0X2ZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9nZW1fcG9ydF9kaXJlY3Rpb25fcGFjayhiY21vbHRfZ2VtX3BvcnRfZGlyZWN0aW9uIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dlbV9wb3J0X2RpcmVjdGlvbl91bnBhY2soYmNtb2x0X2dlbV9wb3J0X2RpcmVjdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9nZW1fcG9ydF90eXBlX3BhY2soYmNtb2x0X2dlbV9wb3J0X3R5cGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ2VtX3BvcnRfdHlwZV91bnBhY2soYmNtb2x0X2dlbV9wb3J0X3R5cGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ2VtX3BvcnRfb3BlcmF0aW9uX3BhY2soYmNtb2x0X2dlbV9wb3J0X29wZXJhdGlvbiB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9nZW1fcG9ydF9vcGVyYXRpb25fdW5wYWNrKGJjbW9sdF9nZW1fcG9ydF9vcGVyYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bpb19jZmdfaWRfcGFjayhiY21vbHRfZ3Bpb19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncGlvX2NmZ19pZF91bnBhY2soYmNtb2x0X2dwaW9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bpb19rZXlfaWRfcGFjayhiY21vbHRfZ3Bpb19rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncGlvX2tleV9pZF91bnBhY2soYmNtb2x0X2dwaW9fa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bpb19waW5fZGlyX3BhY2soYmNtb2x0X2dwaW9fcGluX2RpciB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncGlvX3Bpbl9kaXJfdW5wYWNrKGJjbW9sdF9ncGlvX3Bpbl9kaXIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bpb192YWx1ZV9wYWNrKGJjbW9sdF9ncGlvX3ZhbHVlIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwaW9fdmFsdWVfdW5wYWNrKGJjbW9sdF9ncGlvX3ZhbHVlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfaWRfcGFjayhiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19jZmdfaWRfcGFjayhiY21vbHRfZ3Bvbl9hbGxvY19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19pZF91bnBhY2soYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfaWRfcGFjayhiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0c19pZF91bnBhY2soYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19rZXlfaWRfcGFjayhiY21vbHRfZ3Bvbl9hbGxvY19rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX2tleV9pZF91bnBhY2soYmNtb2x0X2dwb25fYWxsb2Nfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfaWRfcGFjayhiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9pZF91bnBhY2soYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2lkX3BhY2soYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9pZF9wYWNrKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2lkX3BhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2lkX3BhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXlfaWRfcGFjayhiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleV9pZF91bnBhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGVfaWRfcGFjayhiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9pZF91bnBhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2lkX3BhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9pZF9wYWNrKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRlX3BhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0ZV91bnBhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfaWRfcGFjayhiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19pZF91bnBhY2soYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2lkX3BhY2soYmNtb2x0X2dwb25faXdmX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2NmZ19pZF91bnBhY2soYmNtb2x0X2dwb25faXdmX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19pZF9wYWNrKGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXlfaWRfcGFjayhiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5X2lkX3VucGFjayhiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19pZF9wYWNrKGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19pZF91bnBhY2soYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X2lkX3BhY2soYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X2lkX3VucGFjayhiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2lkX3BhY2soYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9pZF91bnBhY2soYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2tleV9pZF9wYWNrKGJjbW9sdF9ncG9uX2l3Zl9rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9rZXlfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9rZXlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfaWRfcGFjayhiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19pZF9wYWNrKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19pZF91bnBhY2soYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X2lkX3BhY2soYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X2lkX3VucGFjayhiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfYWdlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2FnZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2FnZWRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2FnZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2lkX3BhY2soYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9pZF91bnBhY2soYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2lkX3BhY2soYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9pZF9wYWNrKGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZF9pZF91bnBhY2soYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfaWRfcGFjayhiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19pZF91bnBhY2soYmNtb2x0X2dwb25faXdmX3N0YXRfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9pZF9wYWNrKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9pZF91bnBhY2soYmNtb2x0X2dwb25faXdmX3N0YXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19pZF9wYWNrKGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleV9pZF9wYWNrKGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5X2lkX3VucGFjayhiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9rZXlfZXhjaGFuZ2VfbW9kZV9wYWNrKGJjbW9sdF9rZXlfZXhjaGFuZ2VfbW9kZSB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9rZXlfZXhjaGFuZ2VfbW9kZV91bnBhY2soYmNtb2x0X2tleV9leGNoYW5nZV9tb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X2dwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2lkX3BhY2soYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9pZF91bnBhY2soYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfY2ZnX2lkX3BhY2soYmNtb2x0X2dwb25fbmlfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9jZmdfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX25pX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9pZF9wYWNrKGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2lkX3BhY2soYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9pZF9wYWNrKGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9rZXlfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV9rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2tleV9pZF91bnBhY2soYmNtb2x0X2dwb25fbmlfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9sb3NfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV9sb3NfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2xvc19pZF91bnBhY2soYmNtb2x0X2dwb25fbmlfbG9zX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkX3BhY2soYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2lkX3BhY2soYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9yZXNldF9pZF9wYWNrKGJjbW9sdF9ncG9uX25pX3Jlc2V0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9yZXNldF9pZF91bnBhY2soYmNtb2x0X2dwb25fbmlfcmVzZXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkX3BhY2soYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19pZF91bnBhY2soYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X2lkX3BhY2soYmNtb2x0X2dwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3JvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydF9pZF9wYWNrKGJjbW9sdF9ncG9uX25pX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2lkX3BhY2soYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9pZF91bnBhY2soYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZ19pZF9wYWNrKGJjbW9sdF9ncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2lkX3BhY2soYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhdF9pZF9wYWNrKGJjbW9sdF9ncG9uX25pX3N0YXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3N0YXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9pZF9wYWNrKGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9pZF91bnBhY2soYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfY2ZnX2lkX3BhY2soYmNtb2x0X2dwb25fb251X2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2NmZ19pZF91bnBhY2soYmNtb2x0X2dwb25fb251X2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2lkX3BhY2soYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2lkX3BhY2soYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2RmaV9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9kZmlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9kZmlfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9kZmlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9kZ2lfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfZGdpX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfZGdpX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfZGdpX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfZG93aV9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9kb3dpX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfZG93aV9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X2Rvd2lfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9lcnJfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfZXJyX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfZXJyX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfZXJyX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkX2lkX3BhY2soYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkX2lkX3BhY2soYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dF9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2lkX3BhY2soYmNtb2x0X2dwb25fb251X2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2xvYWlfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfbG9haV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2xvYWlfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9sb2FpX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfbG9raV9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9sb2tpX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfbG9raV9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X2xva2lfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9tZW1pX2lkX3BhY2soYmNtb2x0X2dwb25fb251X21lbWlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9tZW1pX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfbWVtaV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2lkX3BhY2soYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2lkX3BhY2soYmNtb2x0X2dwb25fb251X29udV9hbGFybV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9hbGFybV9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X29udV9hbGFybV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb25faWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3BlZV9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9wZWVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wZWVfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9wZWVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcHN0X2lkX3BhY2soYmNtb2x0X2dwb25fb251X3BzdF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3BzdF9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X3BzdF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3JlaV9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9yZWlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9yZWlfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9yZWlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2lkX3BhY2soYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3NkaV9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9zZGlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zZGlfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9zZGlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlX2lkX3BhY2soYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3NmaV9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9zZmlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zZmlfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9zZmlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19pZF91bnBhY2soYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9zdGF0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X3N0YXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zdWZpX2lkX3BhY2soYmNtb2x0X2dwb25fb251X3N1ZmlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zdWZpX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfc3VmaV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Rpd2lfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfdGl3aV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Rpd2lfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV90aXdpX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfb21jaV9kZXZpY2VfaWRfcGFjayhiY21vbHRfb21jaV9kZXZpY2VfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfb21jaV9kZXZpY2VfaWRfdW5wYWNrKGJjbW9sdF9vbWNpX2RldmljZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3JldHVybl9jb2RlX3BhY2soYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcmV0dXJuX2NvZGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9yZXR1cm5fY29kZV91bnBhY2soYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcmV0dXJuX2NvZGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfb21jaV9yZXN1bHRfY29kZV9wYWNrKGJjbW9sdF9vbWNpX3Jlc3VsdF9jb2RlIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29tY2lfcmVzdWx0X2NvZGVfdW5wYWNrKGJjbW9sdF9vbWNpX3Jlc3VsdF9jb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29udV9zdGF0ZV9wYWNrKGJjbW9sdF9vbnVfc3RhdGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfb251X3N0YXRlX3VucGFjayhiY21vbHRfb251X3N0YXRlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Jzc2lfbG9jYXRpb25fc2lnbl9wYWNrKGJjbW9sdF9yc3NpX2xvY2F0aW9uX3NpZ24gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcnNzaV9sb2NhdGlvbl9zaWduX3VucGFjayhiY21vbHRfcnNzaV9sb2NhdGlvbl9zaWduICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29udV9wb3N0X2Rpc2NvdmVyeV9tb2RlX3BhY2soYmNtb2x0X29udV9wb3N0X2Rpc2NvdmVyeV9tb2RlIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29udV9wb3N0X2Rpc2NvdmVyeV9tb2RlX3VucGFjayhiY21vbHRfb251X3Bvc3RfZGlzY292ZXJ5X21vZGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl90cnhfY2ZnX2lkX3BhY2soYmNtb2x0X2dwb25fdHJ4X2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fdHJ4X2NmZ19pZF91bnBhY2soYmNtb2x0X2dwb25fdHJ4X2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fdHJ4X2tleV9pZF9wYWNrKGJjbW9sdF9ncG9uX3RyeF9rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX3RyeF9rZXlfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX3RyeF9rZXlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9pbWFnZV90cmFuc2Zlcl9zdGF0dXNfcGFjayhiY21vbHRfaW1hZ2VfdHJhbnNmZXJfc3RhdHVzIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2ltYWdlX3RyYW5zZmVyX3N0YXR1c191bnBhY2soYmNtb2x0X2ltYWdlX3RyYW5zZmVyX3N0YXR1cyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9pd2ZfbW9kZV9wYWNrKGJjbW9sdF9pd2ZfbW9kZSB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9pd2ZfbW9kZV91bnBhY2soYmNtb2x0X2l3Zl9tb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19pZF9wYWNrKGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfaWRfdW5wYWNrKGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfY2ZnX2lkX3BhY2soYmNtb2x0X2xvZ19lbnRyeV9jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfY2ZnX2lkX3VucGFjayhiY21vbHRfbG9nX2VudHJ5X2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9rZXlfaWRfcGFjayhiY21vbHRfbG9nX2VudHJ5X2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9rZXlfaWRfdW5wYWNrKGJjbW9sdF9sb2dfZW50cnlfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9wYWNrKGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9pZF91bnBhY2soYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfaWRfcGFjayhiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkX2lkX3VucGFjayhiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnX2lkX3BhY2soYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19pZF91bnBhY2soYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2lkX3BhY2soYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfaWRfdW5wYWNrKGJjbW9sdF9sb2dfZW50cnlfc3RhdF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19maWxlX2lkX3BhY2soYmNtb2x0X2xvZ19maWxlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19maWxlX2lkX3VucGFjayhiY21vbHRfbG9nX2ZpbGVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2xldmVsX3BhY2soYmNtb2x0X2xvZ19sZXZlbCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dfbGV2ZWxfdW5wYWNrKGJjbW9sdF9sb2dfbGV2ZWwgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX3N0eWxlX3BhY2soYmNtb2x0X2xvZ19zdHlsZSB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dfc3R5bGVfdW5wYWNrKGJjbW9sdF9sb2dfc3R5bGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX3R5cGVfcGFjayhiY21vbHRfbG9nX3R5cGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX3R5cGVfdW5wYWNrKGJjbW9sdF9sb2dfdHlwZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfYXV0b19jZmdfaWRfcGFjayhiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2lkX3VucGFjayhiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX2NmZ19pZF9wYWNrKGJjbW9sdF9sb2dnZXJfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX2NmZ19pZF91bnBhY2soYmNtb2x0X2xvZ2dlcl9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfY2xlYXJfbG9nX2lkX3BhY2soYmNtb2x0X2xvZ2dlcl9jbGVhcl9sb2dfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfY2xlYXJfbG9nX2lkX3VucGFjayhiY21vbHRfbG9nZ2VyX2NsZWFyX2xvZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9rZXlfaWRfcGFjayhiY21vbHRfbG9nZ2VyX2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9rZXlfaWRfdW5wYWNrKGJjbW9sdF9sb2dnZXJfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9wYWNrKGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF91bnBhY2soYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfaWRfcGFjayhiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3VucGFjayhiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2lkX3BhY2soYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19pZF91bnBhY2soYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9zdGF0X2lkX3BhY2soYmNtb2x0X2xvZ2dlcl9zdGF0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX3N0YXRfaWRfdW5wYWNrKGJjbW9sdF9sb2dnZXJfc3RhdF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X21hY190YWJsZV9taXNzX2ZhbGxiYWNrX3BhY2soYmNtb2x0X21hY190YWJsZV9taXNzX2ZhbGxiYWNrIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X21hY190YWJsZV9taXNzX2ZhbGxiYWNrX3VucGFjayhiY21vbHRfbWFjX3RhYmxlX21pc3NfZmFsbGJhY2sgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbWFjX3RhYmxlX2xlYXJuaW5nX21vZGVfcGFjayhiY21vbHRfbWFjX3RhYmxlX2xlYXJuaW5nX21vZGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbWFjX3RhYmxlX2xlYXJuaW5nX21vZGVfdW5wYWNrKGJjbW9sdF9tYWNfdGFibGVfbGVhcm5pbmdfbW9kZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9tYXBwaW5nX3RhZ19tZXRob2RfcGFjayhiY21vbHRfbWFwcGluZ190YWdfbWV0aG9kIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X21hcHBpbmdfdGFnX21ldGhvZF91bnBhY2soYmNtb2x0X21hcHBpbmdfdGFnX21ldGhvZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ubmlfYXV0b19jZmdfaWRfcGFjayhiY21vbHRfbm5pX2F1dG9fY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX2F1dG9fY2ZnX2lkX3VucGFjayhiY21vbHRfbm5pX2F1dG9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX2NmZ19pZF9wYWNrKGJjbW9sdF9ubmlfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX2NmZ19pZF91bnBhY2soYmNtb2x0X25uaV9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ubmlfY29ubmVjdGlvbl9wYWNrKGJjbW9sdF9ubmlfY29ubmVjdGlvbiB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ubmlfY29ubmVjdGlvbl91bnBhY2soYmNtb2x0X25uaV9jb25uZWN0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9rZXlfaWRfcGFjayhiY21vbHRfbm5pX2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9rZXlfaWRfdW5wYWNrKGJjbW9sdF9ubmlfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdHJpdmFsZW50X3BhY2soYmNtb2x0X3RyaXZhbGVudCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF90cml2YWxlbnRfdW5wYWNrKGJjbW9sdF90cml2YWxlbnQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3NlcmRlc19jZmdfaWRfcGFjayhiY21vbHRfbm5pX3NlcmRlc19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19pZF91bnBhY2soYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3NlcmRlc19rZXlfaWRfcGFjayhiY21vbHRfbm5pX3NlcmRlc19rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc2VyZGVzX2tleV9pZF91bnBhY2soYmNtb2x0X25uaV9zZXJkZXNfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9wYWNrKGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF91bnBhY2soYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfaWRfcGFjayhiY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3VucGFjayhiY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3N0YXRfY2ZnX2lkX3BhY2soYmNtb2x0X25uaV9zdGF0X2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zdGF0X2NmZ19pZF91bnBhY2soYmNtb2x0X25uaV9zdGF0X2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zdGF0X2lkX3BhY2soYmNtb2x0X25uaV9zdGF0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3N0YXRfaWRfdW5wYWNrKGJjbW9sdF9ubmlfc3RhdF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9pZF9wYWNrKGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfaWRfdW5wYWNrKGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9vZG5fY2xhc3NfcGFjayhiY21vbHRfb2RuX2NsYXNzIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29kbl9jbGFzc191bnBhY2soYmNtb2x0X29kbl9jbGFzcyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9vbWNpX3BvcnRfaWRfb3BlcmF0aW9uX3BhY2soYmNtb2x0X29tY2lfcG9ydF9pZF9vcGVyYXRpb24gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfb21jaV9wb3J0X2lkX29wZXJhdGlvbl91bnBhY2soYmNtb2x0X29tY2lfcG9ydF9pZF9vcGVyYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfb251X29wZXJhdGlvbl9wYWNrKGJjbW9sdF9vbnVfb3BlcmF0aW9uIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29udV9vcGVyYXRpb25fdW5wYWNrKGJjbW9sdF9vbnVfb3BlcmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29udV9wb3dlcl9sZXZlbF9wYWNrKGJjbW9sdF9vbnVfcG93ZXJfbGV2ZWwgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfb251X3Bvd2VyX2xldmVsX3VucGFjayhiY21vbHRfb251X3Bvd2VyX2xldmVsICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RjX3Byb3RvY29sX3BhY2soYmNtb2x0X3RjX3Byb3RvY29sIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RjX3Byb3RvY29sX3VucGFjayhiY21vbHRfdGNfcHJvdG9jb2wgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcGFja2V0X2luamVjdGlvbl9lcnJvcl9wYWNrKGJjbW9sdF9wYWNrZXRfaW5qZWN0aW9uX2Vycm9yIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3BhY2tldF9pbmplY3Rpb25fZXJyb3JfdW5wYWNrKGJjbW9sdF9wYWNrZXRfaW5qZWN0aW9uX2Vycm9yICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3BhY2tldF90eXBlX3BhY2soYmNtb2x0X3BhY2tldF90eXBlIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3BhY2tldF90eXBlX3VucGFjayhiY21vbHRfcGFja2V0X3R5cGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fZmFpbF9yZWFzb25fcGFjayhiY21vbHRfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fZmFpbF9yZWFzb24gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fZmFpbF9yZWFzb25fdW5wYWNrKGJjbW9sdF9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9mYWlsX3JlYXNvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wb2xhcml0eV9wYWNrKGJjbW9sdF9wb2xhcml0eSB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wb2xhcml0eV91bnBhY2soYmNtb2x0X3BvbGFyaXR5ICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3BvbGxpbmdfaW50ZXJ2YWxfcGFjayhiY21vbHRfcG9sbGluZ19pbnRlcnZhbCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfczMyKGJ1ZiwgKGludDMyX3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcG9sbGluZ19pbnRlcnZhbF91bnBhY2soYmNtb2x0X3BvbGxpbmdfaW50ZXJ2YWwgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpbnQzMl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfczMyKGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9vcGVyYXRpb25fcGFjayhiY21vbHRfcG9uX29wZXJhdGlvbiB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wb25fb3BlcmF0aW9uX3VucGFjayhiY21vbHRfcG9uX29wZXJhdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb3B0aW9uc19wYWNrKGJjbW9sdF9wb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb3B0aW9ucyB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19vcHRpb25zX3VucGFjayhiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29wdGlvbnMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wb25fc3RhdGVfcGFjayhiY21vbHRfcG9uX3N0YXRlIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9zdGF0ZV91bnBhY2soYmNtb2x0X3Bvbl9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wb3dlcl9sZXZlbGxpbmdfY29udHJvbF9wYWNrKGJjbW9sdF9wb3dlcl9sZXZlbGxpbmdfY29udHJvbCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wb3dlcl9sZXZlbGxpbmdfY29udHJvbF91bnBhY2soYmNtb2x0X3Bvd2VyX2xldmVsbGluZ19jb250cm9sICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvd2VyX21hbmFnZW1lbnRfdHJhbnNpdGlvbl9yZWFzb25fcGFjayhiY21vbHRfcG93ZXJfbWFuYWdlbWVudF90cmFuc2l0aW9uX3JlYXNvbiB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wb3dlcl9tYW5hZ2VtZW50X3RyYW5zaXRpb25fcmVhc29uX3VucGFjayhiY21vbHRfcG93ZXJfbWFuYWdlbWVudF90cmFuc2l0aW9uX3JlYXNvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wcmJzX3BvbHlub21pYWxfcGFjayhiY21vbHRfcHJic19wb2x5bm9taWFsIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3ByYnNfcG9seW5vbWlhbF91bnBhY2soYmNtb2x0X3ByYnNfcG9seW5vbWlhbCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wcmJzX2NoZWNrZXJfbW9kZV9wYWNrKGJjbW9sdF9wcmJzX2NoZWNrZXJfbW9kZSB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wcmJzX2NoZWNrZXJfbW9kZV91bnBhY2soYmNtb2x0X3ByYnNfY2hlY2tlcl9tb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3ByYnNfbG9ja19zdGF0ZV9wYWNrKGJjbW9sdF9wcmJzX2xvY2tfc3RhdGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcHJic19sb2NrX3N0YXRlX3VucGFjayhiY21vbHRfcHJic19sb2NrX3N0YXRlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JhbWFuX21pdGlnYXRpb25fbW9kZV9wYWNrKGJjbW9sdF9yYW1hbl9taXRpZ2F0aW9uX21vZGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcmFtYW5fbWl0aWdhdGlvbl9tb2RlX3VucGFjayhiY21vbHRfcmFtYW5fbWl0aWdhdGlvbl9tb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JhbmdpbmdfZmFpbF9yZWFzb25fcGFjayhiY21vbHRfcmFuZ2luZ19mYWlsX3JlYXNvbiB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yYW5naW5nX2ZhaWxfcmVhc29uX3VucGFjayhiY21vbHRfcmFuZ2luZ19mYWlsX3JlYXNvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yZWdpc3RyYXRpb25fYmVoYXZpb3JfcGFjayhiY21vbHRfcmVnaXN0cmF0aW9uX2JlaGF2aW9yIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JlZ2lzdHJhdGlvbl9iZWhhdmlvcl91bnBhY2soYmNtb2x0X3JlZ2lzdHJhdGlvbl9iZWhhdmlvciAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9mYWlsX3JlYXNvbl9wYWNrKGJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9mYWlsX3JlYXNvbiB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9mYWlsX3JlYXNvbl91bnBhY2soYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2ZhaWxfcmVhc29uICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Jlc3VsdF9wYWNrKGJjbW9sdF9yZXN1bHQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcmVzdWx0X3VucGFjayhiY21vbHRfcmVzdWx0ICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG1fdHlwZV9wYWNrKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3R5cGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV90eXBlX3VucGFjayhiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV90eXBlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfcGFjayhiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdyB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X3VucGFjayhiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9tZWFzdXJlbWVudF9yZXN1bHRfcGFjayhiY21vbHRfcm9ndWVfbWVhc3VyZW1lbnRfcmVzdWx0IHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JvZ3VlX21lYXN1cmVtZW50X3Jlc3VsdF91bnBhY2soYmNtb2x0X3JvZ3VlX21lYXN1cmVtZW50X3Jlc3VsdCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9zY2FuX3N0YXR1c19wYWNrKGJjbW9sdF9yb2d1ZV9zY2FuX3N0YXR1cyB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9zY2FuX3N0YXR1c191bnBhY2soYmNtb2x0X3JvZ3VlX3NjYW5fc3RhdHVzICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Jzc2lfbWVhc3VyZW1lbnRfZmFpbF9yZWFzb25fcGFjayhiY21vbHRfcnNzaV9tZWFzdXJlbWVudF9mYWlsX3JlYXNvbiB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yc3NpX21lYXN1cmVtZW50X2ZhaWxfcmVhc29uX3VucGFjayhiY21vbHRfcnNzaV9tZWFzdXJlbWVudF9mYWlsX3JlYXNvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWxfcmVhc29uX3BhY2soYmNtb2x0X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbF9yZWFzb24gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsX3JlYXNvbl91bnBhY2soYmNtb2x0X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbF9yZWFzb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc2VyZGVzX3JhbmdpbmdfbW9kZV9wYWNrKGJjbW9sdF9zZXJkZXNfcmFuZ2luZ19tb2RlIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NlcmRlc19yYW5naW5nX21vZGVfdW5wYWNrKGJjbW9sdF9zZXJkZXNfcmFuZ2luZ19tb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NlcmRlc19pbnN0YW5jZV9wYWNrKGJjbW9sdF9zZXJkZXNfaW5zdGFuY2UgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc2VyZGVzX2luc3RhbmNlX3VucGFjayhiY21vbHRfc2VyZGVzX2luc3RhbmNlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NoYXBlcl9tb2RlX3BhY2soYmNtb2x0X3NoYXBlcl9tb2RlIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NoYXBlcl9tb2RlX3VucGFjayhiY21vbHRfc2hhcGVyX21vZGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnX2lkX3BhY2soYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19pZF91bnBhY2soYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleV9pZF9wYWNrKGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXlfaWRfdW5wYWNrKGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zdGF0X2NvbmRpdGlvbl90eXBlX3BhY2soYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc3RhdF9jb25kaXRpb25fdHlwZV91bnBhY2soYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc3dpdGNoX292ZXJfdHlwZV9jX29udV9zdGF0ZV9wYWNrKGJjbW9sdF9zd2l0Y2hfb3Zlcl90eXBlX2Nfb251X3N0YXRlIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N3aXRjaF9vdmVyX3R5cGVfY19vbnVfc3RhdGVfdW5wYWNrKGJjbW9sdF9zd2l0Y2hfb3Zlcl90eXBlX2Nfb251X3N0YXRlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N5c3RlbV9tb2RlX3BhY2soYmNtb2x0X3N5c3RlbV9tb2RlIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N5c3RlbV9tb2RlX3VucGFjayhiY21vbHRfc3lzdGVtX21vZGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdXNfb3BlcmF0aW5nX3dhdmVsZW5ndGhfYmFuZHNfcGFjayhiY21vbHRfdXNfb3BlcmF0aW5nX3dhdmVsZW5ndGhfYmFuZHMgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdXNfb3BlcmF0aW5nX3dhdmVsZW5ndGhfYmFuZHNfdW5wYWNrKGJjbW9sdF91c19vcGVyYXRpbmdfd2F2ZWxlbmd0aF9iYW5kcyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF90cmFmZmljX3Jlc3VtZV9yZXN1bHRfcGFjayhiY21vbHRfdHJhZmZpY19yZXN1bWVfcmVzdWx0IHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyYWZmaWNfcmVzdW1lX3Jlc3VsdF91bnBhY2soYmNtb2x0X3RyYWZmaWNfcmVzdW1lX3Jlc3VsdCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfaWRfcGFjayhiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2lkX3VucGFjayhiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXlfaWRfcGFjayhiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXlfaWRfdW5wYWNrKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2lkX3BhY2soYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19pZF91bnBhY2soYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2lkX3BhY2soYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfaWRfdW5wYWNrKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvd19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyX3BhY2soYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyX3VucGFjayhiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3RyaWdnZXIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3RyaWdnZXJfcG9zaXRpb25fcGFjayhiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3RyaWdnZXJfcG9zaXRpb24gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3RyaWdnZXJfcG9zaXRpb25fdW5wYWNrKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fdHJpZ2dlcl9wb3NpdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fd2luZG93X21vZGVfcGFjayhiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3dpbmRvd19tb2RlIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl93aW5kb3dfbW9kZV91bnBhY2soYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl93aW5kb3dfbW9kZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF90cnhfdHlwZV9wYWNrKGJjbW9sdF90cnhfdHlwZSB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF90cnhfdHlwZV91bnBhY2soYmNtb2x0X3RyeF90eXBlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3R1bmVfaW5fZmFpbF9yZWFzb25fcGFjayhiY21vbHRfdHVuZV9pbl9mYWlsX3JlYXNvbiB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF90dW5lX2luX2ZhaWxfcmVhc29uX3VucGFjayhiY21vbHRfdHVuZV9pbl9mYWlsX3JlYXNvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF90dW5lX291dF9mYWlsX3JlYXNvbl9wYWNrKGJjbW9sdF90dW5lX291dF9mYWlsX3JlYXNvbiB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF90dW5lX291dF9mYWlsX3JlYXNvbl91bnBhY2soYmNtb2x0X3R1bmVfb3V0X2ZhaWxfcmVhc29uICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3VhcnRfYmF1ZHJhdGVfcGFjayhiY21vbHRfdWFydF9iYXVkcmF0ZSB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF91YXJ0X2JhdWRyYXRlX3VucGFjayhiY21vbHRfdWFydF9iYXVkcmF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF91c19nZW1fcG9ydF9kZXN0aW5hdGlvbl9wYWNrKGJjbW9sdF91c19nZW1fcG9ydF9kZXN0aW5hdGlvbiB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF91c19nZW1fcG9ydF9kZXN0aW5hdGlvbl91bnBhY2soYmNtb2x0X3VzX2dlbV9wb3J0X2Rlc3RpbmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3VzX3ZsYW5fYWN0aW9uX3BhY2soYmNtb2x0X3VzX3ZsYW5fYWN0aW9uIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3VzX3ZsYW5fYWN0aW9uX3VucGFjayhiY21vbHRfdXNfdmxhbl9hY3Rpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdmxhbl90b19mbG93X21hcHBpbmdfbWV0aG9kX3BhY2soYmNtb2x0X3ZsYW5fdG9fZmxvd19tYXBwaW5nX21ldGhvZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF92bGFuX3RvX2Zsb3dfbWFwcGluZ19tZXRob2RfdW5wYWNrKGJjbW9sdF92bGFuX3RvX2Zsb3dfbWFwcGluZ19tZXRob2QgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfaWRfcGFjayhiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZ19pZF91bnBhY2soYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2NfY2ZnX2lkX3BhY2soYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19pZF91bnBhY2soYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2lkX3BhY2soYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0c19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0c19pZF91bnBhY2soYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0c19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2tleV9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY19rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19rZXlfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY19rZXlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfaWRfcGFjayhiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlX2lkX3VucGFjayhiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3BhY2soYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF91bnBhY2soYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3BhY2soYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2lkX3BhY2soYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmdfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfaWRfcGFjayhiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfaWRfcGFjayhiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19pZF91bnBhY2soYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2lkX3BhY2soYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19pZF91bnBhY2soYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleV9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXlfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfcGFjayhiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3VucGFjayhiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfaWRfcGFjayhiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9pZF91bnBhY2soYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfaWRfcGFjayhiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19pZF91bnBhY2soYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9pZF91bnBhY2soYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0ZV9wYWNrKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0ZSB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0ZV91bnBhY2soYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2l3Zl9jZmdfaWRfcGFjayhiY21vbHRfeGdwb25faXdmX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2l3Zl9jZmdfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25faXdmX2tleV9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9pd2Zfa2V5X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25faXdmX2tleV9pZF91bnBhY2soYmNtb2x0X3hncG9uX2l3Zl9rZXlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfeGdwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfY2ZnX2lkX3VucGFjayhiY21vbHRfeGdwb25fbmlfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19pZF9wYWNrKGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2lkX3VucGFjayhiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfeGdwb25fbmlfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2lkX3VucGFjayhiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9rZXlfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfa2V5X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfa2V5X2lkX3VucGFjayhiY21vbHRfeGdwb25fbmlfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfbG9zX2lkX3BhY2soYmNtb2x0X3hncG9uX25pX2xvc19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2xvc19pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX2xvc19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2lkX3BhY2soYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkX3BhY2soYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2lkX3BhY2soYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2lkX3BhY2soYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3Jlc2V0X2lkX3BhY2soYmNtb2x0X3hncG9uX25pX3Jlc2V0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcmVzZXRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9yZXNldF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19pZF9wYWNrKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnRfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X2lkX3VucGFjayhiY21vbHRfeGdwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2lkX3BhY2soYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnRfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2lkX3BhY2soYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2lkX3VucGFjayhiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3BhY2soYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3BhY2soYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2lkX3BhY2soYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhdF9jZmdfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXRfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfc3RhdF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbnVtX29mX29udXNfcGFjayhiY21vbHRfeGdwb25fbnVtX29mX29udXMgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbnVtX29mX29udXNfdW5wYWNrKGJjbW9sdF94Z3Bvbl9udW1fb2Zfb251cyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfaWRfcGFjayhiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9jZmdfaWRfcGFjayhiY21vbHRfeGdwb25fb251X2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9jZmdfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfaWRfcGFjayhiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfaWRfcGFjayhiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9kZmlfaWRfcGFjayhiY21vbHRfeGdwb25fb251X2RmaV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9kZmlfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfZGZpX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2RnaV9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfZGdpX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2RnaV9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9kZ2lfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9kb3dpX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X2Rvd2lfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2NvbnN1bXB0aW9uX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9nZXRfcG93ZXJfY29uc3VtcHRpb25faWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2NvbnN1bXB0aW9uX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X2dldF9wb3dlcl9jb25zdW1wdGlvbl9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9nZXRfcG93ZXJfbGV2ZWxfaWRfcGFjayhiY21vbHRfeGdwb25fb251X2dldF9wb3dlcl9sZXZlbF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9nZXRfcG93ZXJfbGV2ZWxfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2xldmVsX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfaWRfcGFjayhiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZF9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9sb29jaV9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfaWRfcGFjayhiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1faWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X29udV9hbGFybV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5faWRfcGFjayhiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5faWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfaWRfcGFjayhiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29wdGljYWxfcmVmbGVjdGlvbl9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29wdGljYWxfcmVmbGVjdGlvbl9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb25faWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfaWRfcGFjayhiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9wcXNpX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9wcXNpX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Bxc2lfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25faWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25faWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25faWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfaWRfcGFjayhiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3NkaV9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfc2RpX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3NkaV9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9zZGlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25faWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGVfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zZmlfaWRfcGFjayhiY21vbHRfeGdwb25fb251X3NmaV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zZmlfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfaWRfcGFjayhiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3N0YXRfY2ZnX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zdGF0X2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9zdGF0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3N0YXRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zdWZpX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9zdWZpX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3N1ZmlfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfc3VmaV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV90aXdpX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV90aXdpX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Rpd2lfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfaWRfcGFjayhiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fc2VyZGVzX3JhbmdpbmdfbW9kZV9wYWNrKGJjbW9sdF94Z3Bvbl9zZXJkZXNfcmFuZ2luZ19tb2RlIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3NlcmRlc19yYW5naW5nX21vZGVfdW5wYWNrKGJjbW9sdF94Z3Bvbl9zZXJkZXNfcmFuZ2luZ19tb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3RyeF9jZmdfaWRfcGFjayhiY21vbHRfeGdwb25fdHJ4X2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3RyeF9jZmdfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fdHJ4X2tleV9pZF9wYWNrKGJjbW9sdF94Z3Bvbl90cnhfa2V5X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fdHJ4X2tleV9pZF91bnBhY2soYmNtb2x0X3hncG9uX3RyeF9rZXlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl90cnhfdHlwZV9wYWNrKGJjbW9sdF94Z3Bvbl90cnhfdHlwZSB0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl90cnhfdHlwZV91bnBhY2soYmNtb2x0X3hncG9uX3RyeF90eXBlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19pZF9wYWNrKGJjbW9sdF94cG9uX3NlcmRlc19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94cG9uX3NlcmRlc19jZmdfaWRfdW5wYWNrKGJjbW9sdF94cG9uX3NlcmRlc19jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94cG9uX3NlcmRlc19rZXlfaWRfcGFjayhiY21vbHRfeHBvbl9zZXJkZXNfa2V5X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeHBvbl9zZXJkZXNfa2V5X2lkX3VucGFjayhiY21vbHRfeHBvbl9zZXJkZXNfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfYWN0dWFsX3NjaGVkdWxlcnNoYXBlcl9zZXRfZGVmYXVsdChiY21vbHRfYWN0dWFsX3NjaGVkdWxlcnNoYXBlciAqdGhpcykKK3sKKyAgICB0aGlzLT5hY3R1YWxfbWJzX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICB0aGlzLT5hY3R1YWxfd2VpZ2h0X3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FjdHVhbF9zY2hlZHVsZXJzaGFwZXJfcGFjayhjb25zdCBiY21vbHRfYWN0dWFsX3NjaGVkdWxlcnNoYXBlciAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMtPmFjdHVhbF9tYnNfdHEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMtPmFjdHVhbF93ZWlnaHRfdHEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWN0dWFsX3NjaGVkdWxlcnNoYXBlcl91bnBhY2soYmNtb2x0X2FjdHVhbF9zY2hlZHVsZXJzaGFwZXIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPmFjdHVhbF9tYnNfdHEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICh1aW50MzJfdCAqKSAmdGhpcy0+YWN0dWFsX3dlaWdodF90cSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hY3R1YWxfc2NoZWR1bGVyc2hhcGVyX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hY3R1YWxfc2NoZWR1bGVyc2hhcGVyX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYWN0dWFsX3NjaGVkdWxlcnNoYXBlciAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Flc19rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2Flc19rZXkgKnRoaXMpCit7CisgICAgbWVtc2V0KHRoaXMtPmJ5dGVzLCAwLCBzaXplb2YodGhpcy0+Ynl0ZXMpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Flc19rZXlfcGFjayhjb25zdCBiY21vbHRfYWVzX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZShidWYsIHRoaXMtPmJ5dGVzLCAxNikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZXNfa2V5X3VucGFjayhiY21vbHRfYWVzX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+Ynl0ZXMsIDE2KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Flc19rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAxNik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZXNfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYWVzX2tleSAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXJfc2V0X2RlZmF1bHQoYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXIgKnRoaXMpCit7CisgICAgdGhpcy0+b2Zmc2V0ID0gMDsKKyAgICB0aGlzLT5zaXplID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXJfcGFjayhjb25zdCBiY21vbHRfYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWRlciAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5vZmZzZXQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXJfdW5wYWNrKGJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfcmVhZGVyICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPm9mZnNldCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnNpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWRlcl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWRlcl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXIgKnRoaXMpCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9hcGlfY2FwdHVyZV9jb25maWdfc2V0X2RlZmF1bHQoYmNtb2x0X2FwaV9jYXB0dXJlX2NvbmZpZyAqdGhpcykKK3sKKyAgICB0aGlzLT5sb2NhdGlvbiA9IEJDTU9MVF9BUElfQ0FQVFVSRV9MT0NBVElPTl9ERVZJQ0U7CisgICAgdGhpcy0+YnVmZmVyX3NpemVfYnl0ZXMgPSAxNjM4NDsKKyAgICB0aGlzLT5idWZmZXJfbW9kZSA9IEJDTU9MVF9BUElfQ0FQVFVSRV9CVUZGRVJfTU9ERV9XUkFQOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXBpX2NhcHR1cmVfY29uZmlnX3BhY2soY29uc3QgYmNtb2x0X2FwaV9jYXB0dXJlX2NvbmZpZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2FwaV9jYXB0dXJlX2xvY2F0aW9uX3BhY2sodGhpcy0+bG9jYXRpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmJ1ZmZlcl9zaXplX2J5dGVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfbW9kZV9wYWNrKHRoaXMtPmJ1ZmZlcl9tb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXBpX2NhcHR1cmVfY29uZmlnX3VucGFjayhiY21vbHRfYXBpX2NhcHR1cmVfY29uZmlnICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYXBpX2NhcHR1cmVfbG9jYXRpb25fdW5wYWNrKCZ0aGlzLT5sb2NhdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+YnVmZmVyX3NpemVfYnl0ZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9tb2RlX3VucGFjaygmdGhpcy0+YnVmZmVyX21vZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hcGlfY2FwdHVyZV9jb25maWdfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCA2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FwaV9jYXB0dXJlX2NvbmZpZ19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2FwaV9jYXB0dXJlX2NvbmZpZyAqdGhpcykKK3sKKyAgICBzd2l0Y2ggKHRoaXMtPmxvY2F0aW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfQVBJX0NBUFRVUkVfTE9DQVRJT05fREVWSUNFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FQSV9DQVBUVVJFX0xPQ0FUSU9OX0hPU1Q6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+YnVmZmVyX3NpemVfYnl0ZXMgPCAxNjM4NCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmJ1ZmZlcl9tb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfQVBJX0NBUFRVUkVfQlVGRkVSX01PREVfT1ZFUkZMT1c6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQVBJX0NBUFRVUkVfQlVGRkVSX01PREVfV1JBUDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfYXBpX2NhcHR1cmVfc3RhdHNfc2V0X2RlZmF1bHQoYmNtb2x0X2FwaV9jYXB0dXJlX3N0YXRzICp0aGlzKQoreworICAgIHRoaXMtPmJ1ZmZlcl91c2VkX2J5dGVzID0gMDsKKyAgICB0aGlzLT5idWZmZXJfd3JhcF9jb3VudCA9IDA7CisgICAgdGhpcy0+ZXZlbnRzX3JlY29yZGVkID0gMDsKKyAgICB0aGlzLT5ldmVudHNfZHJvcHBlZCA9IDA7CisgICAgdGhpcy0+cmVhZGFibGVfYnl0ZXMgPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXBpX2NhcHR1cmVfc3RhdHNfcGFjayhjb25zdCBiY21vbHRfYXBpX2NhcHR1cmVfc3RhdHMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+YnVmZmVyX3VzZWRfYnl0ZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5idWZmZXJfd3JhcF9jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmV2ZW50c19yZWNvcmRlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmV2ZW50c19kcm9wcGVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+cmVhZGFibGVfYnl0ZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXBpX2NhcHR1cmVfc3RhdHNfdW5wYWNrKGJjbW9sdF9hcGlfY2FwdHVyZV9zdGF0cyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5idWZmZXJfdXNlZF9ieXRlcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmJ1ZmZlcl93cmFwX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+ZXZlbnRzX3JlY29yZGVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+ZXZlbnRzX2Ryb3BwZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5yZWFkYWJsZV9ieXRlcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hcGlfY2FwdHVyZV9zdGF0c19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FwaV9jYXB0dXJlX3N0YXRzX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYXBpX2NhcHR1cmVfc3RhdHMgKnRoaXMpCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ib3VuZHNfc2V0X2RlZmF1bHQoYmNtb2x0X2JvdW5kcyAqdGhpcykKK3sKKyAgICB0aGlzLT5iZXN0X2Nhc2UgPSAwOworICAgIHRoaXMtPndvcnN0X2Nhc2UgPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYm91bmRzX3BhY2soY29uc3QgYmNtb2x0X2JvdW5kcyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5iZXN0X2Nhc2UpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT53b3JzdF9jYXNlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2JvdW5kc191bnBhY2soYmNtb2x0X2JvdW5kcyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5iZXN0X2Nhc2UpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT53b3JzdF9jYXNlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2JvdW5kc19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYm91bmRzX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYm91bmRzICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfYXJyX2JvdW5kc184X3NldF9kZWZhdWx0KGJjbW9sdF9hcnJfYm91bmRzXzggKnRoaXMpCit7CisgICAgbWVtc2V0KHRoaXMtPmFyciwgMCwgc2l6ZW9mKHRoaXMtPmFycikpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX2JvdW5kc184X3BhY2soY29uc3QgYmNtb2x0X2Fycl9ib3VuZHNfOCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGkwOworICAgIGZvciAoaTAgPSAwOyBpMCA8IDg7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ib3VuZHNfcGFjaygmdGhpcy0+YXJyW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hcnJfYm91bmRzXzhfdW5wYWNrKGJjbW9sdF9hcnJfYm91bmRzXzggKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MzJfdCBpMDsKKyAgICBmb3IgKGkwID0gMDsgaTAgPCA4OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYm91bmRzX3VucGFjaygmdGhpcy0+YXJyW2kwXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl9ib3VuZHNfOF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDY0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl9ib3VuZHNfOF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Fycl9ib3VuZHNfOCAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Fycl9jYWxpYnJhdGlvbl9yZWNvcmRfOF9zZXRfZGVmYXVsdChiY21vbHRfYXJyX2NhbGlicmF0aW9uX3JlY29yZF84ICp0aGlzKQoreworICAgIG1lbXNldCh0aGlzLT5hcnIsIDAsIHNpemVvZih0aGlzLT5hcnIpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl9jYWxpYnJhdGlvbl9yZWNvcmRfOF9wYWNrKGNvbnN0IGJjbW9sdF9hcnJfY2FsaWJyYXRpb25fcmVjb3JkXzggKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBpMDsKKyAgICBmb3IgKGkwID0gMDsgaTAgPCA4OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfY2FsaWJyYXRpb25fcmVjb3JkX3BhY2sodGhpcy0+YXJyW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hcnJfY2FsaWJyYXRpb25fcmVjb3JkXzhfdW5wYWNrKGJjbW9sdF9hcnJfY2FsaWJyYXRpb25fcmVjb3JkXzggKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MzJfdCBpMDsKKyAgICBmb3IgKGkwID0gMDsgaTAgPCA4OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfY2FsaWJyYXRpb25fcmVjb3JkX3VucGFjaygmdGhpcy0+YXJyW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hcnJfY2FsaWJyYXRpb25fcmVjb3JkXzhfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl9jYWxpYnJhdGlvbl9yZWNvcmRfOF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Fycl9jYWxpYnJhdGlvbl9yZWNvcmRfOCAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2RzX2ZyZXF1ZW5jeV9vZmZzZXRfc2V0X2RlZmF1bHQoYmNtb2x0X2RzX2ZyZXF1ZW5jeV9vZmZzZXQgKnRoaXMpCit7CisgICAgdGhpcy0+c2lnbiA9IEJDTU9MVF9TSUdOX1BPU0lUSVZFOworICAgIHRoaXMtPnZhbHVlID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RzX2ZyZXF1ZW5jeV9vZmZzZXRfcGFjayhjb25zdCBiY21vbHRfZHNfZnJlcXVlbmN5X29mZnNldCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X3NpZ25fcGFjayh0aGlzLT5zaWduLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnZhbHVlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RzX2ZyZXF1ZW5jeV9vZmZzZXRfdW5wYWNrKGJjbW9sdF9kc19mcmVxdWVuY3lfb2Zmc2V0ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfc2lnbl91bnBhY2soJnRoaXMtPnNpZ24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dmFsdWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZHNfZnJlcXVlbmN5X29mZnNldF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZHNfZnJlcXVlbmN5X29mZnNldF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2RzX2ZyZXF1ZW5jeV9vZmZzZXQgKnRoaXMpCit7CisgICAgc3dpdGNoICh0aGlzLT5zaWduKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfU0lHTl9QT1NJVElWRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TSUdOX05FR0FUSVZFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9jaGFubmVsX3Byb2ZpbGVfc2V0X2RlZmF1bHQoYmNtb2x0X2NoYW5uZWxfcHJvZmlsZSAqdGhpcykKK3sKKyAgICB0aGlzLT52ZXJzaW9uID0gMDsKKyAgICB0aGlzLT5jaGFubmVsX2luZGV4ID0gMDsKKyAgICB0aGlzLT5kc19mcmVxdWVuY3lfb2Zmc2V0LnNpZ24gPSBCQ01PTFRfU0lHTl9QT1NJVElWRTsKKyAgICB0aGlzLT5kc19mcmVxdWVuY3lfb2Zmc2V0LnZhbHVlID0gMDsKKyAgICB0aGlzLT5jaGFubmVsX3BhcnRpdGlvbiA9IDA7CisgICAgdGhpcy0+dXdsY2hfaWQgPSAwOworICAgIHRoaXMtPnVzX2ZyZXF1ZW5jeSA9IDA7CisgICAgdGhpcy0+dXNfcmF0ZSA9IEJDTU9MVF9VUFNUUkVBTV9MSU5FX1JBVEVfQ0FQQUJJTElUSUVTX1JBVEVfMl9QXzVfRzsKKyAgICB0aGlzLT5kZWZhdWx0X29udV9hdHRlbnVhdGlvbiA9IDA7CisgICAgdGhpcy0+cmVzcG9uc2VfdGhyZXNob2xkID0gMDsKKyAgICB0aGlzLT51c19saW5rX3R5cGUgPSBCQ01PTFRfTElOS19UWVBFX1VOU1BFQ0lGSUVEOworICAgIHRoaXMtPmlzX3ZhbGlkID0gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2NoYW5uZWxfcHJvZmlsZV9wYWNrKGNvbnN0IGJjbW9sdF9jaGFubmVsX3Byb2ZpbGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT52ZXJzaW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5jaGFubmVsX2luZGV4KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9kc19mcmVxdWVuY3lfb2Zmc2V0X3BhY2soJnRoaXMtPmRzX2ZyZXF1ZW5jeV9vZmZzZXQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+Y2hhbm5lbF9wYXJ0aXRpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnV3bGNoX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dXNfZnJlcXVlbmN5KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF91cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzX3BhY2sodGhpcy0+dXNfcmF0ZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5kZWZhdWx0X29udV9hdHRlbnVhdGlvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cmVzcG9uc2VfdGhyZXNob2xkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9saW5rX3R5cGVfcGFjayh0aGlzLT51c19saW5rX3R5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5pc192YWxpZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9jaGFubmVsX3Byb2ZpbGVfdW5wYWNrKGJjbW9sdF9jaGFubmVsX3Byb2ZpbGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT52ZXJzaW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5jaGFubmVsX2luZGV4KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9kc19mcmVxdWVuY3lfb2Zmc2V0X3VucGFjaygmdGhpcy0+ZHNfZnJlcXVlbmN5X29mZnNldCwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmNoYW5uZWxfcGFydGl0aW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT51d2xjaF9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnVzX2ZyZXF1ZW5jeSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfdXBzdHJlYW1fbGluZV9yYXRlX2NhcGFiaWxpdGllc191bnBhY2soJnRoaXMtPnVzX3JhdGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+ZGVmYXVsdF9vbnVfYXR0ZW51YXRpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnJlc3BvbnNlX3RocmVzaG9sZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfbGlua190eXBlX3VucGFjaygmdGhpcy0+dXNfbGlua190eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+aXNfdmFsaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfY2hhbm5lbF9wcm9maWxlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfY2hhbm5lbF9wcm9maWxlX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfY2hhbm5lbF9wcm9maWxlICp0aGlzKQoreworICAgIGlmICh0aGlzLT52ZXJzaW9uID4gMTUpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmNoYW5uZWxfaW5kZXggPiAxNSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9kc19mcmVxdWVuY3lfb2Zmc2V0X2JvdW5kc19jaGVjaygmdGhpcy0+ZHNfZnJlcXVlbmN5X29mZnNldCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmNoYW5uZWxfcGFydGl0aW9uID4gMTUpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPnV3bGNoX2lkID4gMTUpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT51c19yYXRlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfVVBTVFJFQU1fTElORV9SQVRFX0NBUEFCSUxJVElFU19SQVRFXzJfUF81X0c6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfVVBTVFJFQU1fTElORV9SQVRFX0NBUEFCSUxJVElFU19SQVRFXzEwX0c6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+ZGVmYXVsdF9vbnVfYXR0ZW51YXRpb24gPiA3KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+dXNfbGlua190eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfTElOS19UWVBFX1VOU1BFQ0lGSUVEOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0xJTktfVFlQRV9COgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0xJTktfVFlQRV9BOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0xJTktfVFlQRV9BX0FORF9COgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9hcnJfY2hhbm5lbF9wcm9maWxlXzhfc2V0X2RlZmF1bHQoYmNtb2x0X2Fycl9jaGFubmVsX3Byb2ZpbGVfOCAqdGhpcykKK3sKKyAgICBtZW1zZXQodGhpcy0+YXJyLCAwLCBzaXplb2YodGhpcy0+YXJyKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hcnJfY2hhbm5lbF9wcm9maWxlXzhfcGFjayhjb25zdCBiY21vbHRfYXJyX2NoYW5uZWxfcHJvZmlsZV84ICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDMyX3QgaTA7CisgICAgZm9yIChpMCA9IDA7IGkwIDwgODsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2NoYW5uZWxfcHJvZmlsZV9wYWNrKCZ0aGlzLT5hcnJbaTBdLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl9jaGFubmVsX3Byb2ZpbGVfOF91bnBhY2soYmNtb2x0X2Fycl9jaGFubmVsX3Byb2ZpbGVfOCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQzMl90IGkwOworICAgIGZvciAoaTAgPSAwOyBpMCA8IDg7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9jaGFubmVsX3Byb2ZpbGVfdW5wYWNrKCZ0aGlzLT5hcnJbaTBdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX2NoYW5uZWxfcHJvZmlsZV84X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTIwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl9jaGFubmVsX3Byb2ZpbGVfOF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Fycl9jaGFubmVsX3Byb2ZpbGVfOCAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0X3NldF9kZWZhdWx0KGJjbW9sdF9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydCAqdGhpcykKK3sKKyAgICB0aGlzLT5kc193YXZlbGVuZ3RoX2NoYW5uZWxfaWQgPSAwOworICAgIHRoaXMtPnVzX3dhdmVsZW5ndGhfY2hhbm5lbF9pZCA9IDA7CisgICAgdGhpcy0+cG93ZXJfY29uc3VtcHRpb24gPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfcGFjayhjb25zdCBiY21vbHRfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5kc193YXZlbGVuZ3RoX2NoYW5uZWxfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnVzX3dhdmVsZW5ndGhfY2hhbm5lbF9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnBvd2VyX2NvbnN1bXB0aW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0X3VucGFjayhiY21vbHRfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5kc193YXZlbGVuZ3RoX2NoYW5uZWxfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnVzX3dhdmVsZW5ndGhfY2hhbm5lbF9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnBvd2VyX2NvbnN1bXB0aW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0ICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfYXJyX3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0Xzhfc2V0X2RlZmF1bHQoYmNtb2x0X2Fycl9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF84ICp0aGlzKQoreworICAgIG1lbXNldCh0aGlzLT5hcnIsIDAsIHNpemVvZih0aGlzLT5hcnIpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF84X3BhY2soY29uc3QgYmNtb2x0X2Fycl9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF84ICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDMyX3QgaTA7CisgICAgZm9yIChpMCA9IDA7IGkwIDwgODsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0X3BhY2soJnRoaXMtPmFycltpMF0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0XzhfdW5wYWNrKGJjbW9sdF9hcnJfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfOCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQzMl90IGkwOworICAgIGZvciAoaTAgPSAwOyBpMCA8IDg7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF91bnBhY2soJnRoaXMtPmFycltpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hcnJfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfOF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDMyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF84X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYXJyX3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0XzggKnRoaXMpCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9hcnJfdTE2XzJfc2V0X2RlZmF1bHQoYmNtb2x0X2Fycl91MTZfMiAqdGhpcykKK3sKKyAgICB0aGlzLT5hcnJbMF0gPSA0MDk2OworICAgIHRoaXMtPmFyclsxXSA9IDgxOTI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdTE2XzJfcGFjayhjb25zdCBiY21vbHRfYXJyX3UxNl8yICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDMyX3QgaTA7CisgICAgZm9yIChpMCA9IDA7IGkwIDwgMjsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5hcnJbaTBdKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdTE2XzJfdW5wYWNrKGJjbW9sdF9hcnJfdTE2XzIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MzJfdCBpMDsKKyAgICBmb3IgKGkwID0gMDsgaTAgPCAyOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmFycltpMF0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91MTZfMl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3UxNl8yX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYXJyX3UxNl8yICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfYXJyX3UxNl8yX2hleF9zZXRfZGVmYXVsdChiY21vbHRfYXJyX3UxNl8yX2hleCAqdGhpcykKK3sKKyAgICB0aGlzLT5hcnJbMF0gPSAzMzAyNFU7CisgICAgdGhpcy0+YXJyWzFdID0gMzMwMjRVOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3UxNl8yX2hleF9wYWNrKGNvbnN0IGJjbW9sdF9hcnJfdTE2XzJfaGV4ICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDMyX3QgaTA7CisgICAgZm9yIChpMCA9IDA7IGkwIDwgMjsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5hcnJbaTBdKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdTE2XzJfaGV4X3VucGFjayhiY21vbHRfYXJyX3UxNl8yX2hleCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQzMl90IGkwOworICAgIGZvciAoaTAgPSAwOyBpMCA8IDI7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+YXJyW2kwXSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3UxNl8yX2hleF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3UxNl8yX2hleF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Fycl91MTZfMl9oZXggKnRoaXMpCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9hcnJfdTE2XzVfaGV4X3NldF9kZWZhdWx0KGJjbW9sdF9hcnJfdTE2XzVfaGV4ICp0aGlzKQoreworICAgIHRoaXMtPmFyclswXSA9IDMzMDI0VTsKKyAgICB0aGlzLT5hcnJbMV0gPSAzNDk4NFU7CisgICAgdGhpcy0+YXJyWzJdID0gMzcxMjBVOworICAgIHRoaXMtPmFyclszXSA9IDM3Mzc2VTsKKyAgICB0aGlzLT5hcnJbNF0gPSAzMzAyNFU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdTE2XzVfaGV4X3BhY2soY29uc3QgYmNtb2x0X2Fycl91MTZfNV9oZXggKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBpMDsKKyAgICBmb3IgKGkwID0gMDsgaTAgPCA1OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmFycltpMF0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91MTZfNV9oZXhfdW5wYWNrKGJjbW9sdF9hcnJfdTE2XzVfaGV4ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDMyX3QgaTA7CisgICAgZm9yIChpMCA9IDA7IGkwIDwgNTsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5hcnJbaTBdKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdTE2XzVfaGV4X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3UxNl81X2hleF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Fycl91MTZfNV9oZXggKnRoaXMpCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9hcnJfdTE2Xzdfc2V0X2RlZmF1bHQoYmNtb2x0X2Fycl91MTZfNyAqdGhpcykKK3sKKyAgICBtZW1zZXQodGhpcy0+YXJyLCAwLCBzaXplb2YodGhpcy0+YXJyKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdTE2XzdfcGFjayhjb25zdCBiY21vbHRfYXJyX3UxNl83ICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDMyX3QgaTA7CisgICAgZm9yIChpMCA9IDA7IGkwIDwgNzsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5hcnJbaTBdKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdTE2XzdfdW5wYWNrKGJjbW9sdF9hcnJfdTE2XzcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MzJfdCBpMDsKKyAgICBmb3IgKGkwID0gMDsgaTAgPCA3OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmFycltpMF0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91MTZfN19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDE0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91MTZfN19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Fycl91MTZfNyAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Fycl91MzJfNl9zZXRfZGVmYXVsdChiY21vbHRfYXJyX3UzMl82ICp0aGlzKQoreworICAgIG1lbXNldCh0aGlzLT5hcnIsIDAsIHNpemVvZih0aGlzLT5hcnIpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91MzJfNl9wYWNrKGNvbnN0IGJjbW9sdF9hcnJfdTMyXzYgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBpMDsKKyAgICBmb3IgKGkwID0gMDsgaTAgPCA2OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmFycltpMF0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91MzJfNl91bnBhY2soYmNtb2x0X2Fycl91MzJfNiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQzMl90IGkwOworICAgIGZvciAoaTAgPSAwOyBpMCA8IDY7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+YXJyW2kwXSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3UzMl82X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMjQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3UzMl82X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYXJyX3UzMl82ICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfYXJyX3U4XzEwX3NldF9kZWZhdWx0KGJjbW9sdF9hcnJfdThfMTAgKnRoaXMpCit7CisgICAgbWVtc2V0KHRoaXMtPmFyciwgMCwgc2l6ZW9mKHRoaXMtPmFycikpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3U4XzEwX3BhY2soY29uc3QgYmNtb2x0X2Fycl91OF8xMCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZShidWYsIHRoaXMtPmFyciwgMTApKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3U4XzEwX3VucGFjayhiY21vbHRfYXJyX3U4XzEwICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWQoYnVmLCB0aGlzLT5hcnIsIDEwKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91OF8xMF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91OF8xMF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Fycl91OF8xMCAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Fycl91OF8xMl9zZXRfZGVmYXVsdChiY21vbHRfYXJyX3U4XzEyICp0aGlzKQoreworICAgIG1lbXNldCh0aGlzLT5hcnIsIDAsIHNpemVvZih0aGlzLT5hcnIpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91OF8xMl9wYWNrKGNvbnN0IGJjbW9sdF9hcnJfdThfMTIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGUoYnVmLCB0aGlzLT5hcnIsIDEyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91OF8xMl91bnBhY2soYmNtb2x0X2Fycl91OF8xMiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+YXJyLCAxMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdThfMTJfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAxMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdThfMTJfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9hcnJfdThfMTIgKnRoaXMpCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9hcnJfdThfMTNfc2V0X2RlZmF1bHQoYmNtb2x0X2Fycl91OF8xMyAqdGhpcykKK3sKKyAgICBtZW1zZXQodGhpcy0+YXJyLCAwLCBzaXplb2YodGhpcy0+YXJyKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdThfMTNfcGFjayhjb25zdCBiY21vbHRfYXJyX3U4XzEzICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+YXJyLCAxMykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdThfMTNfdW5wYWNrKGJjbW9sdF9hcnJfdThfMTMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZChidWYsIHRoaXMtPmFyciwgMTMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3U4XzEzX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3U4XzEzX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYXJyX3U4XzEzICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfYXJyX3U4XzM2X3NldF9kZWZhdWx0KGJjbW9sdF9hcnJfdThfMzYgKnRoaXMpCit7CisgICAgbWVtc2V0KHRoaXMtPmFyciwgMCwgc2l6ZW9mKHRoaXMtPmFycikpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3U4XzM2X3BhY2soY29uc3QgYmNtb2x0X2Fycl91OF8zNiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZShidWYsIHRoaXMtPmFyciwgMzYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3U4XzM2X3VucGFjayhiY21vbHRfYXJyX3U4XzM2ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWQoYnVmLCB0aGlzLT5hcnIsIDM2KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91OF8zNl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDM2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91OF8zNl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Fycl91OF8zNiAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Fycl91OF80X3NldF9kZWZhdWx0KGJjbW9sdF9hcnJfdThfNCAqdGhpcykKK3sKKyAgICB0aGlzLT5hcnJbMF0gPSA3OworICAgIHRoaXMtPmFyclsxXSA9IDc7CisgICAgdGhpcy0+YXJyWzJdID0gNzsKKyAgICB0aGlzLT5hcnJbM10gPSA3OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3U4XzRfcGFjayhjb25zdCBiY21vbHRfYXJyX3U4XzQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGUoYnVmLCB0aGlzLT5hcnIsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3U4XzRfdW5wYWNrKGJjbW9sdF9hcnJfdThfNCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+YXJyLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91OF80X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdThfNF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Fycl91OF80ICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfYXJyX3U4XzQwX3NldF9kZWZhdWx0KGJjbW9sdF9hcnJfdThfNDAgKnRoaXMpCit7CisgICAgbWVtc2V0KHRoaXMtPmFyciwgMCwgc2l6ZW9mKHRoaXMtPmFycikpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3U4XzQwX3BhY2soY29uc3QgYmNtb2x0X2Fycl91OF80MCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZShidWYsIHRoaXMtPmFyciwgNDApKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3U4XzQwX3VucGFjayhiY21vbHRfYXJyX3U4XzQwICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWQoYnVmLCB0aGlzLT5hcnIsIDQwKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91OF80MF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91OF80MF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Fycl91OF80MCAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGVfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGUgKnRoaXMpCit7CisgICAgdGhpcy0+cHJvZmlsZV92ZXJzaW9uID0gMDsKKyAgICB0aGlzLT5pc19mZWNfb24gPSBCQ01PU19GQUxTRTsKKyAgICB0aGlzLT5kZWxpbWl0ZXJfc2l6ZV9pbl9ieXRlcyA9IDA7CisgICAgdGhpcy0+ZGVsaW1pdGVyX3BhdHRlcm5faGlnaCA9IDA7CisgICAgdGhpcy0+ZGVsaW1pdGVyX3BhdHRlcm5fbG93ID0gODsKKyAgICB0aGlzLT5wcmVhbWJsZV9sZW5ndGhfaW5fYnl0ZXMgPSA4OworICAgIHRoaXMtPnByZWFtYmxlX3JlcGVhdHNfY291bnQgPSAwOworICAgIHRoaXMtPnByZWFtYmxlX3BhdHRlcm5faGlnaCA9IDA7CisgICAgdGhpcy0+cHJlYW1ibGVfcGF0dGVybl9sb3cgPSAwOworICAgIHRoaXMtPnBvbl90YWcgPSAwOworICAgIHRoaXMtPm51bV9vZl9ndWFyZF9ieXRlcyA9IDA7CisgICAgdGhpcy0+aXNfcHJvZmlsZV92YWxpZCA9IEJDTU9TX0ZBTFNFOworICAgIHRoaXMtPmJ1cnN0X292ZXJoZWFkX3NpemVfaW5fd29yZHMgPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYnVyc3RfcHJvZmlsZV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cHJvZmlsZV92ZXJzaW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmlzX2ZlY19vbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+ZGVsaW1pdGVyX3NpemVfaW5fYnl0ZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5kZWxpbWl0ZXJfcGF0dGVybl9oaWdoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+ZGVsaW1pdGVyX3BhdHRlcm5fbG93KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5wcmVhbWJsZV9sZW5ndGhfaW5fYnl0ZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnByZWFtYmxlX3JlcGVhdHNfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5wcmVhbWJsZV9wYXR0ZXJuX2hpZ2gpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5wcmVhbWJsZV9wYXR0ZXJuX2xvdykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnBvbl90YWcpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5udW1fb2ZfZ3VhcmRfYnl0ZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+aXNfcHJvZmlsZV92YWxpZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmJ1cnN0X292ZXJoZWFkX3NpemVfaW5fd29yZHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYnVyc3RfcHJvZmlsZV91bnBhY2soYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5wcm9maWxlX3ZlcnNpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+aXNfZmVjX29uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5kZWxpbWl0ZXJfc2l6ZV9pbl9ieXRlcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmRlbGltaXRlcl9wYXR0ZXJuX2hpZ2gpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5kZWxpbWl0ZXJfcGF0dGVybl9sb3cpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnByZWFtYmxlX2xlbmd0aF9pbl9ieXRlcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+cHJlYW1ibGVfcmVwZWF0c19jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnByZWFtYmxlX3BhdHRlcm5faGlnaCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnByZWFtYmxlX3BhdHRlcm5fbG93KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cG9uX3RhZykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPm51bV9vZl9ndWFyZF9ieXRlcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5pc19wcm9maWxlX3ZhbGlkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+YnVyc3Rfb3ZlcmhlYWRfc2l6ZV9pbl93b3JkcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMzgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYnVyc3RfcHJvZmlsZV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGUgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPmRlbGltaXRlcl9zaXplX2luX2J5dGVzID4gOCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+cHJlYW1ibGVfbGVuZ3RoX2luX2J5dGVzIDwgMSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+cHJlYW1ibGVfbGVuZ3RoX2luX2J5dGVzID4gOCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Fycl94Z3Bvbl9idXJzdF9wcm9maWxlXzRfc2V0X2RlZmF1bHQoYmNtb2x0X2Fycl94Z3Bvbl9idXJzdF9wcm9maWxlXzQgKnRoaXMpCit7CisgICAgdGhpcy0+YXJyWzBdLnByb2ZpbGVfdmVyc2lvbiA9IDA7CisgICAgdGhpcy0+YXJyWzBdLmlzX2ZlY19vbiA9IEJDTU9TX0ZBTFNFOworICAgIHRoaXMtPmFyclswXS5kZWxpbWl0ZXJfc2l6ZV9pbl9ieXRlcyA9IDg7CisgICAgdGhpcy0+YXJyWzBdLmRlbGltaXRlcl9wYXR0ZXJuX2hpZ2ggPSAzMDE1NTYyMDAwVUw7CisgICAgdGhpcy0+YXJyWzBdLmRlbGltaXRlcl9wYXR0ZXJuX2xvdyA9IDI5OTkyNTkwNDFVTDsKKyAgICB0aGlzLT5hcnJbMF0ucHJlYW1ibGVfbGVuZ3RoX2luX2J5dGVzID0gODsKKyAgICB0aGlzLT5hcnJbMF0ucHJlYW1ibGVfcmVwZWF0c19jb3VudCA9IDIwOworICAgIHRoaXMtPmFyclswXS5wcmVhbWJsZV9wYXR0ZXJuX2hpZ2ggPSAyODYzMzExNTMwVUw7CisgICAgdGhpcy0+YXJyWzBdLnByZWFtYmxlX3BhdHRlcm5fbG93ID0gMjg2MzMxMTUzMFVMOworICAgIHRoaXMtPmFyclswXS5wb25fdGFnID0gMDsKKyAgICB0aGlzLT5hcnJbMF0ubnVtX29mX2d1YXJkX2J5dGVzID0gMTY7CisgICAgdGhpcy0+YXJyWzBdLmlzX3Byb2ZpbGVfdmFsaWQgPSBCQ01PU19UUlVFOworICAgIHRoaXMtPmFyclswXS5idXJzdF9vdmVyaGVhZF9zaXplX2luX3dvcmRzID0gNzg7CisgICAgdGhpcy0+YXJyWzFdLnByb2ZpbGVfdmVyc2lvbiA9IDA7CisgICAgdGhpcy0+YXJyWzFdLmlzX2ZlY19vbiA9IEJDTU9TX0ZBTFNFOworICAgIHRoaXMtPmFyclsxXS5kZWxpbWl0ZXJfc2l6ZV9pbl9ieXRlcyA9IDg7CisgICAgdGhpcy0+YXJyWzFdLmRlbGltaXRlcl9wYXR0ZXJuX2hpZ2ggPSAzMDE1NTYyMDAwVUw7CisgICAgdGhpcy0+YXJyWzFdLmRlbGltaXRlcl9wYXR0ZXJuX2xvdyA9IDI5OTkyNTkwNDFVTDsKKyAgICB0aGlzLT5hcnJbMV0ucHJlYW1ibGVfbGVuZ3RoX2luX2J5dGVzID0gODsKKyAgICB0aGlzLT5hcnJbMV0ucHJlYW1ibGVfcmVwZWF0c19jb3VudCA9IDk7CisgICAgdGhpcy0+YXJyWzFdLnByZWFtYmxlX3BhdHRlcm5faGlnaCA9IDI4NjMzMTE1MzBVTDsKKyAgICB0aGlzLT5hcnJbMV0ucHJlYW1ibGVfcGF0dGVybl9sb3cgPSAyODYzMzExNTMwVUw7CisgICAgdGhpcy0+YXJyWzFdLnBvbl90YWcgPSAwOworICAgIHRoaXMtPmFyclsxXS5udW1fb2ZfZ3VhcmRfYnl0ZXMgPSAxNjsKKyAgICB0aGlzLT5hcnJbMV0uaXNfcHJvZmlsZV92YWxpZCA9IEJDTU9TX1RSVUU7CisgICAgdGhpcy0+YXJyWzFdLmJ1cnN0X292ZXJoZWFkX3NpemVfaW5fd29yZHMgPSA1NjsKKyAgICB0aGlzLT5hcnJbMl0ucHJvZmlsZV92ZXJzaW9uID0gMDsKKyAgICB0aGlzLT5hcnJbMl0uaXNfZmVjX29uID0gQkNNT1NfVFJVRTsKKyAgICB0aGlzLT5hcnJbMl0uZGVsaW1pdGVyX3NpemVfaW5fYnl0ZXMgPSA4OworICAgIHRoaXMtPmFyclsyXS5kZWxpbWl0ZXJfcGF0dGVybl9oaWdoID0gMzAxNTU2MjAwMFVMOworICAgIHRoaXMtPmFyclsyXS5kZWxpbWl0ZXJfcGF0dGVybl9sb3cgPSAyOTk5MjU5MDQxVUw7CisgICAgdGhpcy0+YXJyWzJdLnByZWFtYmxlX2xlbmd0aF9pbl9ieXRlcyA9IDg7CisgICAgdGhpcy0+YXJyWzJdLnByZWFtYmxlX3JlcGVhdHNfY291bnQgPSAyMDsKKyAgICB0aGlzLT5hcnJbMl0ucHJlYW1ibGVfcGF0dGVybl9oaWdoID0gMjg2MzMxMTUzMFVMOworICAgIHRoaXMtPmFyclsyXS5wcmVhbWJsZV9wYXR0ZXJuX2xvdyA9IDI4NjMzMTE1MzBVTDsKKyAgICB0aGlzLT5hcnJbMl0ucG9uX3RhZyA9IDA7CisgICAgdGhpcy0+YXJyWzJdLm51bV9vZl9ndWFyZF9ieXRlcyA9IDE2OworICAgIHRoaXMtPmFyclsyXS5pc19wcm9maWxlX3ZhbGlkID0gQkNNT1NfVFJVRTsKKyAgICB0aGlzLT5hcnJbMl0uYnVyc3Rfb3ZlcmhlYWRfc2l6ZV9pbl93b3JkcyA9IDc4OworICAgIHRoaXMtPmFyclszXS5wcm9maWxlX3ZlcnNpb24gPSAwOworICAgIHRoaXMtPmFyclszXS5pc19mZWNfb24gPSBCQ01PU19UUlVFOworICAgIHRoaXMtPmFyclszXS5kZWxpbWl0ZXJfc2l6ZV9pbl9ieXRlcyA9IDg7CisgICAgdGhpcy0+YXJyWzNdLmRlbGltaXRlcl9wYXR0ZXJuX2hpZ2ggPSAzMDE1NTYyMDAwVUw7CisgICAgdGhpcy0+YXJyWzNdLmRlbGltaXRlcl9wYXR0ZXJuX2xvdyA9IDI5OTkyNTkwNDFVTDsKKyAgICB0aGlzLT5hcnJbM10ucHJlYW1ibGVfbGVuZ3RoX2luX2J5dGVzID0gODsKKyAgICB0aGlzLT5hcnJbM10ucHJlYW1ibGVfcmVwZWF0c19jb3VudCA9IDk7CisgICAgdGhpcy0+YXJyWzNdLnByZWFtYmxlX3BhdHRlcm5faGlnaCA9IDI4NjMzMTE1MzBVTDsKKyAgICB0aGlzLT5hcnJbM10ucHJlYW1ibGVfcGF0dGVybl9sb3cgPSAyODYzMzExNTMwVUw7CisgICAgdGhpcy0+YXJyWzNdLnBvbl90YWcgPSAwOworICAgIHRoaXMtPmFyclszXS5udW1fb2ZfZ3VhcmRfYnl0ZXMgPSAxNjsKKyAgICB0aGlzLT5hcnJbM10uaXNfcHJvZmlsZV92YWxpZCA9IEJDTU9TX1RSVUU7CisgICAgdGhpcy0+YXJyWzNdLmJ1cnN0X292ZXJoZWFkX3NpemVfaW5fd29yZHMgPSA1NjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl94Z3Bvbl9idXJzdF9wcm9maWxlXzRfcGFjayhjb25zdCBiY21vbHRfYXJyX3hncG9uX2J1cnN0X3Byb2ZpbGVfNCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGkwOworICAgIGZvciAoaTAgPSAwOyBpMCA8IDQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlX3BhY2soJnRoaXMtPmFycltpMF0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3hncG9uX2J1cnN0X3Byb2ZpbGVfNF91bnBhY2soYmNtb2x0X2Fycl94Z3Bvbl9idXJzdF9wcm9maWxlXzQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MzJfdCBpMDsKKyAgICBmb3IgKGkwID0gMDsgaTAgPCA0OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fYnVyc3RfcHJvZmlsZV91bnBhY2soJnRoaXMtPmFycltpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hcnJfeGdwb25fYnVyc3RfcHJvZmlsZV80X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTUyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl94Z3Bvbl9idXJzdF9wcm9maWxlXzRfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9hcnJfeGdwb25fYnVyc3RfcHJvZmlsZV80ICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb25fc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX3RyeF9jb25maWd1cmF0aW9uICp0aGlzKQoreworICAgIHRoaXMtPnRyeF9yZXNldF9wYXR0ZXJuX2ZpcnN0ID0gMDsKKyAgICB0aGlzLT50cnhfcmVzZXRfcGF0dGVybl9taWRkbGUgPSAwOworICAgIHRoaXMtPnRyeF9yZXNldF9wYXR0ZXJuX2xhc3QgPSAwOworICAgIHRoaXMtPnRyeF9yZXNldF9taWRkbGVfcmVwZWF0c19jb3VudCA9IDA7CisgICAgdGhpcy0+dHJ4X3Jlc2V0X2xvY2F0aW9uID0gMDsKKyAgICB0aGlzLT50cnhfcmVzZXRfcG9sYXJpdHkgPSBCQ01PU19GQUxTRTsKKyAgICB0aGlzLT5iY2RyX3Jlc2V0X3BhdHRlcm5fZmlyc3QgPSAwOworICAgIHRoaXMtPmJjZHJfcmVzZXRfcGF0dGVybl9taWRkbGUgPSAwOworICAgIHRoaXMtPmJjZHJfcmVzZXRfcGF0dGVybl9sYXN0ID0gMDsKKyAgICB0aGlzLT5iY2RyX3Jlc2V0X21pZGRsZV9yZXBlYXRzX2NvdW50ID0gMDsKKyAgICB0aGlzLT5iY2RyX3Jlc2V0X2xvY2F0aW9uID0gMDsKKyAgICB0aGlzLT5iY2RyX3Jlc2V0X3BvbGFyaXR5ID0gQkNNT1NfRkFMU0U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl90cnhfY29uZmlndXJhdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT50cnhfcmVzZXRfcGF0dGVybl9maXJzdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnRyeF9yZXNldF9wYXR0ZXJuX21pZGRsZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnRyeF9yZXNldF9wYXR0ZXJuX2xhc3QpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnRyeF9yZXNldF9taWRkbGVfcmVwZWF0c19jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnRyeF9yZXNldF9sb2NhdGlvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT50cnhfcmVzZXRfcG9sYXJpdHkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5iY2RyX3Jlc2V0X3BhdHRlcm5fZmlyc3QpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5iY2RyX3Jlc2V0X3BhdHRlcm5fbWlkZGxlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+YmNkcl9yZXNldF9wYXR0ZXJuX2xhc3QpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmJjZHJfcmVzZXRfbWlkZGxlX3JlcGVhdHNfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmJjZHJfcmVzZXRfbG9jYXRpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+YmNkcl9yZXNldF9wb2xhcml0eSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl91bnBhY2soYmNtb2x0X3hncG9uX3RyeF9jb25maWd1cmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnRyeF9yZXNldF9wYXR0ZXJuX2ZpcnN0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dHJ4X3Jlc2V0X3BhdHRlcm5fbWlkZGxlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dHJ4X3Jlc2V0X3BhdHRlcm5fbGFzdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dHJ4X3Jlc2V0X21pZGRsZV9yZXBlYXRzX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dHJ4X3Jlc2V0X2xvY2F0aW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnRyeF9yZXNldF9wb2xhcml0eSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmJjZHJfcmVzZXRfcGF0dGVybl9maXJzdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmJjZHJfcmVzZXRfcGF0dGVybl9taWRkbGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5iY2RyX3Jlc2V0X3BhdHRlcm5fbGFzdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+YmNkcl9yZXNldF9taWRkbGVfcmVwZWF0c19jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+YmNkcl9yZXNldF9sb2NhdGlvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5iY2RyX3Jlc2V0X3BvbGFyaXR5KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3RyeF9jb25maWd1cmF0aW9uX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMzEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb25fYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl90cnhfY29uZmlndXJhdGlvbiAqdGhpcykKK3sKKyAgICBpZiAodGhpcy0+dHJ4X3Jlc2V0X2xvY2F0aW9uID4gNTExKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfYXJyX3hncG9uX3RyeF9jb25maWd1cmF0aW9uXzRfc2V0X2RlZmF1bHQoYmNtb2x0X2Fycl94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl80ICp0aGlzKQoreworICAgIHRoaXMtPmFyclswXS50cnhfcmVzZXRfcGF0dGVybl9maXJzdCA9IDA7CisgICAgdGhpcy0+YXJyWzBdLnRyeF9yZXNldF9wYXR0ZXJuX21pZGRsZSA9IDQyOTQ5NjcyOTVVTDsKKyAgICB0aGlzLT5hcnJbMF0udHJ4X3Jlc2V0X3BhdHRlcm5fbGFzdCA9IDA7CisgICAgdGhpcy0+YXJyWzBdLnRyeF9yZXNldF9taWRkbGVfcmVwZWF0c19jb3VudCA9IDQ7CisgICAgdGhpcy0+YXJyWzBdLnRyeF9yZXNldF9sb2NhdGlvbiA9IDA7CisgICAgdGhpcy0+YXJyWzBdLnRyeF9yZXNldF9wb2xhcml0eSA9IEJDTU9TX0ZBTFNFOworICAgIHRoaXMtPmFyclswXS5iY2RyX3Jlc2V0X3BhdHRlcm5fZmlyc3QgPSAwOworICAgIHRoaXMtPmFyclswXS5iY2RyX3Jlc2V0X3BhdHRlcm5fbWlkZGxlID0gMjU1OworICAgIHRoaXMtPmFyclswXS5iY2RyX3Jlc2V0X3BhdHRlcm5fbGFzdCA9IDA7CisgICAgdGhpcy0+YXJyWzBdLmJjZHJfcmVzZXRfbWlkZGxlX3JlcGVhdHNfY291bnQgPSAxOworICAgIHRoaXMtPmFyclswXS5iY2RyX3Jlc2V0X2xvY2F0aW9uID0gMjA7CisgICAgdGhpcy0+YXJyWzBdLmJjZHJfcmVzZXRfcG9sYXJpdHkgPSBCQ01PU19GQUxTRTsKKyAgICB0aGlzLT5hcnJbMV0udHJ4X3Jlc2V0X3BhdHRlcm5fZmlyc3QgPSAwOworICAgIHRoaXMtPmFyclsxXS50cnhfcmVzZXRfcGF0dGVybl9taWRkbGUgPSA0Mjk0OTY3Mjk1VUw7CisgICAgdGhpcy0+YXJyWzFdLnRyeF9yZXNldF9wYXR0ZXJuX2xhc3QgPSAwOworICAgIHRoaXMtPmFyclsxXS50cnhfcmVzZXRfbWlkZGxlX3JlcGVhdHNfY291bnQgPSA0OworICAgIHRoaXMtPmFyclsxXS50cnhfcmVzZXRfbG9jYXRpb24gPSAzMzsKKyAgICB0aGlzLT5hcnJbMV0udHJ4X3Jlc2V0X3BvbGFyaXR5ID0gQkNNT1NfRkFMU0U7CisgICAgdGhpcy0+YXJyWzFdLmJjZHJfcmVzZXRfcGF0dGVybl9maXJzdCA9IDA7CisgICAgdGhpcy0+YXJyWzFdLmJjZHJfcmVzZXRfcGF0dGVybl9taWRkbGUgPSAyNTU7CisgICAgdGhpcy0+YXJyWzFdLmJjZHJfcmVzZXRfcGF0dGVybl9sYXN0ID0gMDsKKyAgICB0aGlzLT5hcnJbMV0uYmNkcl9yZXNldF9taWRkbGVfcmVwZWF0c19jb3VudCA9IDE7CisgICAgdGhpcy0+YXJyWzFdLmJjZHJfcmVzZXRfbG9jYXRpb24gPSAyMzsKKyAgICB0aGlzLT5hcnJbMV0uYmNkcl9yZXNldF9wb2xhcml0eSA9IEJDTU9TX0ZBTFNFOworICAgIHRoaXMtPmFyclsyXS50cnhfcmVzZXRfcGF0dGVybl9maXJzdCA9IDA7CisgICAgdGhpcy0+YXJyWzJdLnRyeF9yZXNldF9wYXR0ZXJuX21pZGRsZSA9IDQyOTQ5NjcyOTVVTDsKKyAgICB0aGlzLT5hcnJbMl0udHJ4X3Jlc2V0X3BhdHRlcm5fbGFzdCA9IDA7CisgICAgdGhpcy0+YXJyWzJdLnRyeF9yZXNldF9taWRkbGVfcmVwZWF0c19jb3VudCA9IDQ7CisgICAgdGhpcy0+YXJyWzJdLnRyeF9yZXNldF9sb2NhdGlvbiA9IDA7CisgICAgdGhpcy0+YXJyWzJdLnRyeF9yZXNldF9wb2xhcml0eSA9IEJDTU9TX0ZBTFNFOworICAgIHRoaXMtPmFyclsyXS5iY2RyX3Jlc2V0X3BhdHRlcm5fZmlyc3QgPSAwOworICAgIHRoaXMtPmFyclsyXS5iY2RyX3Jlc2V0X3BhdHRlcm5fbWlkZGxlID0gMjU1OworICAgIHRoaXMtPmFyclsyXS5iY2RyX3Jlc2V0X3BhdHRlcm5fbGFzdCA9IDA7CisgICAgdGhpcy0+YXJyWzJdLmJjZHJfcmVzZXRfbWlkZGxlX3JlcGVhdHNfY291bnQgPSAxOworICAgIHRoaXMtPmFyclsyXS5iY2RyX3Jlc2V0X2xvY2F0aW9uID0gMjA7CisgICAgdGhpcy0+YXJyWzJdLmJjZHJfcmVzZXRfcG9sYXJpdHkgPSBCQ01PU19GQUxTRTsKKyAgICB0aGlzLT5hcnJbM10udHJ4X3Jlc2V0X3BhdHRlcm5fZmlyc3QgPSAwOworICAgIHRoaXMtPmFyclszXS50cnhfcmVzZXRfcGF0dGVybl9taWRkbGUgPSA0Mjk0OTY3Mjk1VUw7CisgICAgdGhpcy0+YXJyWzNdLnRyeF9yZXNldF9wYXR0ZXJuX2xhc3QgPSAwOworICAgIHRoaXMtPmFyclszXS50cnhfcmVzZXRfbWlkZGxlX3JlcGVhdHNfY291bnQgPSA0OworICAgIHRoaXMtPmFyclszXS50cnhfcmVzZXRfbG9jYXRpb24gPSAzMzsKKyAgICB0aGlzLT5hcnJbM10udHJ4X3Jlc2V0X3BvbGFyaXR5ID0gQkNNT1NfRkFMU0U7CisgICAgdGhpcy0+YXJyWzNdLmJjZHJfcmVzZXRfcGF0dGVybl9maXJzdCA9IDA7CisgICAgdGhpcy0+YXJyWzNdLmJjZHJfcmVzZXRfcGF0dGVybl9taWRkbGUgPSAyNTU7CisgICAgdGhpcy0+YXJyWzNdLmJjZHJfcmVzZXRfcGF0dGVybl9sYXN0ID0gMDsKKyAgICB0aGlzLT5hcnJbM10uYmNkcl9yZXNldF9taWRkbGVfcmVwZWF0c19jb3VudCA9IDE7CisgICAgdGhpcy0+YXJyWzNdLmJjZHJfcmVzZXRfbG9jYXRpb24gPSAyMzsKKyAgICB0aGlzLT5hcnJbM10uYmNkcl9yZXNldF9wb2xhcml0eSA9IEJDTU9TX0ZBTFNFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3hncG9uX3RyeF9jb25maWd1cmF0aW9uXzRfcGFjayhjb25zdCBiY21vbHRfYXJyX3hncG9uX3RyeF9jb25maWd1cmF0aW9uXzQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBpMDsKKyAgICBmb3IgKGkwID0gMDsgaTAgPCA0OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb25fcGFjaygmdGhpcy0+YXJyW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hcnJfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb25fNF91bnBhY2soYmNtb2x0X2Fycl94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl80ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDMyX3QgaTA7CisgICAgZm9yIChpMCA9IDA7IGkwIDwgNDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX3RyeF9jb25maWd1cmF0aW9uX3VucGFjaygmdGhpcy0+YXJyW2kwXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl80X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTI0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl80X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYXJyX3hncG9uX3RyeF9jb25maWd1cmF0aW9uXzQgKnRoaXMpCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbl9zZXRfZGVmYXVsdChiY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24gKnRoaXMpCit7CisgICAgdGhpcy0+bG9zID0gQkNNT1NfRkFMU0U7CisgICAgdGhpcy0+b251X2FsYXJtcyA9IEJDTU9TX0ZBTFNFOworICAgIHRoaXMtPnRpd2kgPSBCQ01PU19GQUxTRTsKKyAgICB0aGlzLT5hY2tfdGltZW91dCA9IEJDTU9TX0ZBTFNFOworICAgIHRoaXMtPnNmaSA9IEJDTU9TX0ZBTFNFOworICAgIHRoaXMtPmxva2kgPSBCQ01PU19GQUxTRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uX3BhY2soY29uc3QgYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5sb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+b251X2FsYXJtcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT50aXdpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmFja190aW1lb3V0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnNmaSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5sb2tpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uX3VucGFjayhiY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmxvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5vbnVfYWxhcm1zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnRpd2kpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+YWNrX3RpbWVvdXQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c2ZpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmxva2kpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb25fc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCA2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24gKnRoaXMpCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9yZXN5bmNfY29udHJvbF9zZXRfZGVmYXVsdChiY21vbHRfcmVzeW5jX2NvbnRyb2wgKnRoaXMpCit7CisgICAgdGhpcy0+c3RhcnRfcGF0dGVybiA9IDE1OworICAgIHRoaXMtPm1pZGRsZV9wYXR0ZXJuID0gMDsKKyAgICB0aGlzLT5sYXN0X3BhdHRlcm4gPSAwOworICAgIHRoaXMtPm1pZGRsZV9yZXBldGl0aW9uID0gMDsKKyAgICB0aGlzLT5sb2NhdGlvbiA9IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yZXN5bmNfY29udHJvbF9wYWNrKGNvbnN0IGJjbW9sdF9yZXN5bmNfY29udHJvbCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnN0YXJ0X3BhdHRlcm4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPm1pZGRsZV9wYXR0ZXJuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5sYXN0X3BhdHRlcm4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPm1pZGRsZV9yZXBldGl0aW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5sb2NhdGlvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yZXN5bmNfY29udHJvbF91bnBhY2soYmNtb2x0X3Jlc3luY19jb250cm9sICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+c3RhcnRfcGF0dGVybikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bWlkZGxlX3BhdHRlcm4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmxhc3RfcGF0dGVybikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bWlkZGxlX3JlcGV0aXRpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmxvY2F0aW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Jlc3luY19jb250cm9sX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yZXN5bmNfY29udHJvbF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3Jlc3luY19jb250cm9sICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfYmNkcl9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uX3NldF9kZWZhdWx0KGJjbW9sdF9iY2RyX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb24gKnRoaXMpCit7CisgICAgdGhpcy0+cmVzeW5jX2NvbnRyb2wuc3RhcnRfcGF0dGVybiA9IDE1OworICAgIHRoaXMtPnJlc3luY19jb250cm9sLm1pZGRsZV9wYXR0ZXJuID0gMDsKKyAgICB0aGlzLT5yZXN5bmNfY29udHJvbC5sYXN0X3BhdHRlcm4gPSAwOworICAgIHRoaXMtPnJlc3luY19jb250cm9sLm1pZGRsZV9yZXBldGl0aW9uID0gMDsKKyAgICB0aGlzLT5yZXN5bmNfY29udHJvbC5sb2NhdGlvbiA9IDM0OworICAgIHRoaXMtPnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wuc3RhcnRfcGF0dGVybiA9IDE1OworICAgIHRoaXMtPnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubWlkZGxlX3BhdHRlcm4gPSAwOworICAgIHRoaXMtPnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubGFzdF9wYXR0ZXJuID0gMDsKKyAgICB0aGlzLT5yYW5naW5nX3Jlc3luY19jb250cm9sLm1pZGRsZV9yZXBldGl0aW9uID0gMDsKKyAgICB0aGlzLT5yYW5naW5nX3Jlc3luY19jb250cm9sLmxvY2F0aW9uID0gNzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2JjZHJfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbl9wYWNrKGNvbnN0IGJjbW9sdF9iY2RyX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9yZXN5bmNfY29udHJvbF9wYWNrKCZ0aGlzLT5yZXN5bmNfY29udHJvbCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9yZXN5bmNfY29udHJvbF9wYWNrKCZ0aGlzLT5yYW5naW5nX3Jlc3luY19jb250cm9sLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYmNkcl9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uX3VucGFjayhiY21vbHRfYmNkcl9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfcmVzeW5jX2NvbnRyb2xfdW5wYWNrKCZ0aGlzLT5yZXN5bmNfY29udHJvbCwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3Jlc3luY19jb250cm9sX3VucGFjaygmdGhpcy0+cmFuZ2luZ19yZXN5bmNfY29udHJvbCwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYmNkcl9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYmNkcl9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYmNkcl9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uICp0aGlzKQoreworICAgIGlmICghYmNtb2x0X3Jlc3luY19jb250cm9sX2JvdW5kc19jaGVjaygmdGhpcy0+cmVzeW5jX2NvbnRyb2wpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3Jlc3luY19jb250cm9sX2JvdW5kc19jaGVjaygmdGhpcy0+cmFuZ2luZ19yZXN5bmNfY29udHJvbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9iZXJfbW9uaXRvcl9wYXJhbXNfc2V0X2RlZmF1bHQoYmNtb2x0X2Jlcl9tb25pdG9yX3BhcmFtcyAqdGhpcykKK3sKKyAgICB0aGlzLT51c19iZXJfaW50ZXJ2YWwgPSA1MDAwOworICAgIHRoaXMtPnNmX3RocmVzaG9sZCA9IDM7CisgICAgdGhpcy0+c2RfdGhyZXNob2xkID0gNTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Jlcl9tb25pdG9yX3BhcmFtc19wYWNrKGNvbnN0IGJjbW9sdF9iZXJfbW9uaXRvcl9wYXJhbXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dXNfYmVyX2ludGVydmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5zZl90aHJlc2hvbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnNkX3RocmVzaG9sZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9iZXJfbW9uaXRvcl9wYXJhbXNfdW5wYWNrKGJjbW9sdF9iZXJfbW9uaXRvcl9wYXJhbXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dXNfYmVyX2ludGVydmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5zZl90aHJlc2hvbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnNkX3RocmVzaG9sZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9iZXJfbW9uaXRvcl9wYXJhbXNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCA2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Jlcl9tb25pdG9yX3BhcmFtc19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Jlcl9tb25pdG9yX3BhcmFtcyAqdGhpcykKK3sKKyAgICBpZiAodGhpcy0+dXNfYmVyX2ludGVydmFsID4gNjAwMDBVTCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+c2ZfdGhyZXNob2xkIDwgMykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+c2ZfdGhyZXNob2xkID4gOCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+c2RfdGhyZXNob2xkIDwgNCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+c2RfdGhyZXNob2xkID4gOSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Nicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGVfc2V0X2RlZmF1bHQoYmNtb2x0X2Nicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUgKnRoaXMpCit7CisgICAgdGhpcy0+bWFfNyA9IDY0OworICAgIHRoaXMtPm1hXzMgPSAyNTY7CisgICAgdGhpcy0+bWFfMSA9IDUxMjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Nicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGVfcGFjayhjb25zdCBiY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5tYV83KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bWFfMykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPm1hXzEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZV91bnBhY2soYmNtb2x0X2Nicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bWFfNykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPm1hXzMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5tYV8xKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Nicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGVfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCA2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Nicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGVfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkX3NldF9kZWZhdWx0KGJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWQgKnRoaXMpCit7CisgICAgdGhpcy0+c3RhdHVzID0gKGJjbW9sdF9kZHJfdGVzdF9zdGF0dXMpIDI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWRfcGFjayhjb25zdCBiY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZGRyX3Rlc3Rfc3RhdHVzX3BhY2sodGhpcy0+c3RhdHVzLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+c3RhdHVzKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRERSX1RFU1RfU1RBVFVTX0NPTVBMRVRFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9kZHJfdGVzdF9yZXN1bHRfcGFjayh0aGlzLT51LmNvbXBsZXRlZC5jcHVfcmVzdWx0LCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Rkcl90ZXN0X3Jlc3VsdF9wYWNrKHRoaXMtPnUuY29tcGxldGVkLnJhc18wX3Jlc3VsdCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9kZHJfdGVzdF9yZXN1bHRfcGFjayh0aGlzLT51LmNvbXBsZXRlZC5yYXNfMV9yZXN1bHQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0REUl9URVNUX1NUQVRVU19DT05ORUNUSU9OX0ZBSUxFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9ob3N0X2Nvbm5lY3Rpb25fZmFpbF9yZWFzb25fcGFjayh0aGlzLT51LmNvbm5lY3Rpb25fZmFpbGVkLnJlYXNvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRERSX1RFU1RfU1RBVFVTX1RJTUVPVVQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWRfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZCAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgc3dpdGNoICh0aGlzLT5zdGF0dXMpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9ERFJfVEVTVF9TVEFUVVNfQ09NUExFVEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRERSX1RFU1RfU1RBVFVTX0NPTk5FQ1RJT05fRkFJTEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRERSX1RFU1RfU1RBVFVTX1RJTUVPVVQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWRfdW5wYWNrKGJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9kZHJfdGVzdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5zdGF0dXMsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5zdGF0dXMpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9ERFJfVEVTVF9TVEFUVVNfQ09NUExFVEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Rkcl90ZXN0X3Jlc3VsdF91bnBhY2soJnRoaXMtPnUuY29tcGxldGVkLmNwdV9yZXN1bHQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZGRyX3Rlc3RfcmVzdWx0X3VucGFjaygmdGhpcy0+dS5jb21wbGV0ZWQucmFzXzBfcmVzdWx0LCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Rkcl90ZXN0X3Jlc3VsdF91bnBhY2soJnRoaXMtPnUuY29tcGxldGVkLnJhc18xX3Jlc3VsdCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRERSX1RFU1RfU1RBVFVTX0NPTk5FQ1RJT05fRkFJTEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2hvc3RfY29ubmVjdGlvbl9mYWlsX3JlYXNvbl91bnBhY2soJnRoaXMtPnUuY29ubmVjdGlvbl9mYWlsZWQucmVhc29uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9ERFJfVEVTVF9TVEFUVVNfVElNRU9VVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9kZHJfdGVzdF9zdGF0dXMgc3RhdHVzOworICAgIGlmICghYmNtb2x0X2Rkcl90ZXN0X3N0YXR1c191bnBhY2soJnN0YXR1cywgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHN0YXR1cykKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0REUl9URVNUX1NUQVRVU19DT01QTEVURUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0REUl9URVNUX1NUQVRVU19DT05ORUNUSU9OX0ZBSUxFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9ERFJfVEVTVF9TVEFUVVNfVElNRU9VVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkICp0aGlzKQoreworICAgIHN3aXRjaCAodGhpcy0+c3RhdHVzKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRERSX1RFU1RfU1RBVFVTX0NPTVBMRVRFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMtPnUuY29tcGxldGVkLmNwdV9yZXN1bHQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERFJfVEVTVF9SRVNVTFRfU1VDQ0VTUzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERFJfVEVTVF9SRVNVTFRfUEhZX0lOSVRfRVJST1I6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRERSX1RFU1RfUkVTVUxUX0RSQU1fSU5JVF9FUlJPUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERFJfVEVTVF9SRVNVTFRfU0hNT09fRVJST1I6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRERSX1RFU1RfUkVTVUxUX0VESVNfVEVTVF9FUlJPUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERFJfVEVTVF9SRVNVTFRfTUVNX1RFU1RfRVJST1I6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRERSX1RFU1RfUkVTVUxUX05PVF9URVNURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMtPnUuY29tcGxldGVkLnJhc18wX3Jlc3VsdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0REUl9URVNUX1JFU1VMVF9TVUNDRVNTOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0REUl9URVNUX1JFU1VMVF9QSFlfSU5JVF9FUlJPUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERFJfVEVTVF9SRVNVTFRfRFJBTV9JTklUX0VSUk9SOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0REUl9URVNUX1JFU1VMVF9TSE1PT19FUlJPUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERFJfVEVTVF9SRVNVTFRfRURJU19URVNUX0VSUk9SOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0REUl9URVNUX1JFU1VMVF9NRU1fVEVTVF9FUlJPUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERFJfVEVTVF9SRVNVTFRfTk9UX1RFU1RFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy0+dS5jb21wbGV0ZWQucmFzXzFfcmVzdWx0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRERSX1RFU1RfUkVTVUxUX1NVQ0NFU1M6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRERSX1RFU1RfUkVTVUxUX1BIWV9JTklUX0VSUk9SOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0REUl9URVNUX1JFU1VMVF9EUkFNX0lOSVRfRVJST1I6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRERSX1RFU1RfUkVTVUxUX1NITU9PX0VSUk9SOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0REUl9URVNUX1JFU1VMVF9FRElTX1RFU1RfRVJST1I6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRERSX1RFU1RfUkVTVUxUX01FTV9URVNUX0VSUk9SOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0REUl9URVNUX1JFU1VMVF9OT1RfVEVTVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0REUl9URVNUX1NUQVRVU19DT05ORUNUSU9OX0ZBSUxFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMtPnUuY29ubmVjdGlvbl9mYWlsZWQucmVhc29uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX1RJTUVPVVQ6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX0tFRVBBTElWRToKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fVVNFUl9DQUxMQkFDS19FUlJPUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fU09GVFdBUkVfVkVSU0lPTl9NSVNNQVRDSDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fU1lTVEVNX01PREVfTUlTTUFUQ0g6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX05OSV9TUEVFRF9NSVNNQVRDSDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fUkVDT05ORUNUX1RJTUVPVVQ6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX0lOVEVSTkFMX0VSUk9SOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0hPU1RfQ09OTkVDVElPTl9GQUlMX1JFQVNPTl9TWVNURU1fTU9ERV9OT1RfU1VQUE9SVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0hPU1RfQ09OTkVDVElPTl9GQUlMX1JFQVNPTl9QQVJBTUVURVI6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRERSX1RFU1RfU1RBVFVTX1RJTUVPVVQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZGVidWdfZGV2aWNlX2NmZ19zZXRfZGVmYXVsdChiY21vbHRfZGVidWdfZGV2aWNlX2NmZyAqdGhpcykKK3sKKyAgICB0aGlzLT5ob3N0X2RtYV9yeF9xdWV1ZV9zaXplID0gMTI4OworICAgIHRoaXMtPmhvc3RfZG1hX3R4X3F1ZXVlX3NpemUgPSAxMjg7CisgICAgdGhpcy0+YXZzX2NvbnRyb2wgPSBCQ01PU19GQUxTRTsKKyAgICB0aGlzLT51c2VfcHJldl9wb25fc2VyZGVzX2Zpcm13YXJlID0gQkNNT1NfRkFMU0U7CisgICAgdGhpcy0+dXNlX3ByZXZfbm5pX3NlcmRlc19maXJtd2FyZSA9IEJDTU9TX0ZBTFNFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfZGV2aWNlX2NmZ19wYWNrKGNvbnN0IGJjbW9sdF9kZWJ1Z19kZXZpY2VfY2ZnICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmhvc3RfZG1hX3J4X3F1ZXVlX3NpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5ob3N0X2RtYV90eF9xdWV1ZV9zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmF2c19jb250cm9sKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnVzZV9wcmV2X3Bvbl9zZXJkZXNfZmlybXdhcmUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dXNlX3ByZXZfbm5pX3NlcmRlc19maXJtd2FyZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19kZXZpY2VfY2ZnX3VucGFjayhiY21vbHRfZGVidWdfZGV2aWNlX2NmZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5ob3N0X2RtYV9yeF9xdWV1ZV9zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+aG9zdF9kbWFfdHhfcXVldWVfc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5hdnNfY29udHJvbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT51c2VfcHJldl9wb25fc2VyZGVzX2Zpcm13YXJlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnVzZV9wcmV2X25uaV9zZXJkZXNfZmlybXdhcmUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfZGV2aWNlX2NmZ19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDcpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfZGV2aWNlX2NmZ19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2RlYnVnX2RldmljZV9jZmcgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPmhvc3RfZG1hX3J4X3F1ZXVlX3NpemUgPCAxKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5ob3N0X2RtYV9yeF9xdWV1ZV9zaXplID4gMTAyNCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+aG9zdF9kbWFfdHhfcXVldWVfc2l6ZSA8IDEpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmhvc3RfZG1hX3R4X3F1ZXVlX3NpemUgPiAxMDI0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZGV2aWNlX25uaV9zcGVlZF9zZXRfZGVmYXVsdChiY21vbHRfZGV2aWNlX25uaV9zcGVlZCAqdGhpcykKK3sKKyAgICB0aGlzLT5maXJzdF9oYWxmID0gQkNNT0xUX05OSV9TUEVFRF9HQlBTXzE7CisgICAgdGhpcy0+c2Vjb25kX2hhbGYgPSBCQ01PTFRfTk5JX1NQRUVEX0dCUFNfMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9ubmlfc3BlZWRfcGFjayhjb25zdCBiY21vbHRfZGV2aWNlX25uaV9zcGVlZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X25uaV9zcGVlZF9wYWNrKHRoaXMtPmZpcnN0X2hhbGYsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfbm5pX3NwZWVkX3BhY2sodGhpcy0+c2Vjb25kX2hhbGYsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2Vfbm5pX3NwZWVkX3VucGFjayhiY21vbHRfZGV2aWNlX25uaV9zcGVlZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X25uaV9zcGVlZF91bnBhY2soJnRoaXMtPmZpcnN0X2hhbGYsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfbm5pX3NwZWVkX3VucGFjaygmdGhpcy0+c2Vjb25kX2hhbGYsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2Vfbm5pX3NwZWVkX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2Vfbm5pX3NwZWVkX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZGV2aWNlX25uaV9zcGVlZCAqdGhpcykKK3sKKyAgICBzd2l0Y2ggKHRoaXMtPmZpcnN0X2hhbGYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1BFRURfR0JQU18xOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TUEVFRF9HQlBTXzJQNToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1BFRURfR0JQU18xMDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1BFRURfR0JQU18xMlA1OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TUEVFRF9HQlBTXzEwX0dfTVVYOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5zZWNvbmRfaGFsZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TUEVFRF9HQlBTXzE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NQRUVEX0dCUFNfMlA1OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TUEVFRF9HQlBTXzEwOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TUEVFRF9HQlBTXzEyUDU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NQRUVEX0dCUFNfMTBfR19NVVg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyogXGNvbmQgVU5ET0NVTUVOVEVEX1NZTUJPTFMgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2R1bW15X3N0cnVjdF9mb3JfZW1iZWRkZWRfdHlwZXNfc2V0X2RlZmF1bHQoYmNtb2x0X2R1bW15X3N0cnVjdF9mb3JfZW1iZWRkZWRfdHlwZXMgKnRoaXMpCit7CisgICAgdGhpcy0+YWQgPSAoYmNtb2x0X2FnZ3JlZ2F0aW9uX2RvbWFpbikgMDsKKyAgICB0aGlzLT5ldCA9IChiY21vbHRfZXBvbl90b3ApIDA7CisgICAgdGhpcy0+ZWxnID0gKGJjbW9sdF9lcG1fbGltX2dsb2JhbCkgMDsKKyAgICB0aGlzLT5kYmFfcG9ydCA9IChiY21vbHRfZGJhX3BvcnQpIDA7CisgICAgdGhpcy0+c2diID0gQkNNT0xUX0RSVl9TR0JfSURfSURYMDsKKyAgICB0aGlzLT5pY2YgPSBCQ01PTFRfRFJWX0lDRl9JRF9JRFgwOworICAgIHRoaXMtPnRmYl90cmFwX2JlaGF2aW9yID0gQkNNT0xUX1RGQl9UUkFQX0JFSEFWSU9SX0RST1A7CisgICAgdGhpcy0+dGZiX21vZGUgPSBCQ01PTFRfVEZCX01PREVfR1BPTjsKKyAgICB0aGlzLT5saW1fc2VjX21vZGVfdXAgPSBCQ01PTFRfTElNX1NFQ19NT0RFX1VQX1RFSzsKKyAgICB0aGlzLT5saW1fc2VjX21vZGVfZG4gPSBCQ01PTFRfTElNX1NFQ19NT0RFX0ROX1RFSzsKKyAgICB0aGlzLT54aW1fc2VjX21vZGUgPSBCQ01PTFRfWElNX1NFQ19NT0RFX1JFU0VSVkVEXzA7CisgICAgdGhpcy0+ZGJhX3JhbSA9IEJDTU9MVF9EQkFfUkFNX0dSQU5UX0ZJRk9fUkFNXzA7CisgICAgdGhpcy0+aHNjX3JhbSA9IEJDTU9MVF9IU0NfUkFNX0xMQ19UMTsKKyAgICB0aGlzLT5saW1fcmFtID0gQkNNT0xUX0xJTV9SQU1fTExJRF9VUDsKKyAgICB0aGlzLT5sa3lfcmFtID0gQkNNT0xUX0xLWV9SQU1fVFhfS0VZX1JBTTsKKyAgICB0aGlzLT5taWNfcmFtID0gQkNNT0xUX01JQ19SQU1fUkFOR0U7CisgICAgdGhpcy0+eHBjc19yYW0gPSBCQ01PTFRfWFBDU1JNX1JBTV9DQVBUVVJFX0ZJRk87CisgICAgdGhpcy0+eGcyZ19pZCA9IChiY21vbHRfeGcyZ19pZCkgMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2R1bW15X3N0cnVjdF9mb3JfZW1iZWRkZWRfdHlwZXNfcGFjayhjb25zdCBiY21vbHRfZHVtbXlfc3RydWN0X2Zvcl9lbWJlZGRlZF90eXBlcyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzLT5hZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMtPmV0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcy0+ZWxnKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcy0+ZGJhX3BvcnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Rydl9zZ2JfaWRfcGFjayh0aGlzLT5zZ2IsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZHJ2X2ljZl9pZF9wYWNrKHRoaXMtPmljZiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF90ZmJfdHJhcF9iZWhhdmlvcl9wYWNrKHRoaXMtPnRmYl90cmFwX2JlaGF2aW9yLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3RmYl9tb2RlX3BhY2sodGhpcy0+dGZiX21vZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfbGltX3NlY19tb2RlX3VwX3BhY2sodGhpcy0+bGltX3NlY19tb2RlX3VwLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2xpbV9zZWNfbW9kZV9kbl9wYWNrKHRoaXMtPmxpbV9zZWNfbW9kZV9kbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF94aW1fc2VjX21vZGVfcGFjayh0aGlzLT54aW1fc2VjX21vZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZGJhX3JhbV9wYWNrKHRoaXMtPmRiYV9yYW0sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfaHNjX3JhbV9wYWNrKHRoaXMtPmhzY19yYW0sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfbGltX3JhbV9wYWNrKHRoaXMtPmxpbV9yYW0sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfbGt5X3JhbV9wYWNrKHRoaXMtPmxreV9yYW0sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfbWljX3JhbV9wYWNrKHRoaXMtPm1pY19yYW0sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfeHBjc3JtX3JhbV9wYWNrKHRoaXMtPnhwY3NfcmFtLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzLT54ZzJnX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2R1bW15X3N0cnVjdF9mb3JfZW1iZWRkZWRfdHlwZXNfdW5wYWNrKGJjbW9sdF9kdW1teV9zdHJ1Y3RfZm9yX2VtYmVkZGVkX3R5cGVzICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAodWludDhfdCAqKSAmdGhpcy0+YWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgKHVpbnQ4X3QgKikgJnRoaXMtPmV0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICh1aW50OF90ICopICZ0aGlzLT5lbGcpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgKHVpbnQ4X3QgKikgJnRoaXMtPmRiYV9wb3J0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9kcnZfc2diX2lkX3VucGFjaygmdGhpcy0+c2diLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Rydl9pY2ZfaWRfdW5wYWNrKCZ0aGlzLT5pY2YsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfdGZiX3RyYXBfYmVoYXZpb3JfdW5wYWNrKCZ0aGlzLT50ZmJfdHJhcF9iZWhhdmlvciwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF90ZmJfbW9kZV91bnBhY2soJnRoaXMtPnRmYl9tb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2xpbV9zZWNfbW9kZV91cF91bnBhY2soJnRoaXMtPmxpbV9zZWNfbW9kZV91cCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9saW1fc2VjX21vZGVfZG5fdW5wYWNrKCZ0aGlzLT5saW1fc2VjX21vZGVfZG4sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfeGltX3NlY19tb2RlX3VucGFjaygmdGhpcy0+eGltX3NlY19tb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2RiYV9yYW1fdW5wYWNrKCZ0aGlzLT5kYmFfcmFtLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2hzY19yYW1fdW5wYWNrKCZ0aGlzLT5oc2NfcmFtLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2xpbV9yYW1fdW5wYWNrKCZ0aGlzLT5saW1fcmFtLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2xreV9yYW1fdW5wYWNrKCZ0aGlzLT5sa3lfcmFtLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X21pY19yYW1fdW5wYWNrKCZ0aGlzLT5taWNfcmFtLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3hwY3NybV9yYW1fdW5wYWNrKCZ0aGlzLT54cGNzX3JhbSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICh1aW50OF90ICopICZ0aGlzLT54ZzJnX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2R1bW15X3N0cnVjdF9mb3JfZW1iZWRkZWRfdHlwZXNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAxOCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kdW1teV9zdHJ1Y3RfZm9yX2VtYmVkZGVkX3R5cGVzX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZHVtbXlfc3RydWN0X2Zvcl9lbWJlZGRlZF90eXBlcyAqdGhpcykKK3sKKyAgICBpZiAodGhpcy0+YWQgPiAoYmNtb2x0X2FnZ3JlZ2F0aW9uX2RvbWFpbikgMSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+ZXQgPiAoYmNtb2x0X2Vwb25fdG9wKSA3KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5lbGcgPiAoYmNtb2x0X2VwbV9saW1fZ2xvYmFsKSAxNSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+ZGJhX3BvcnQgPiAoYmNtb2x0X2RiYV9wb3J0KSA3KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+c2diKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRFJWX1NHQl9JRF9JRFgwOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0RSVl9TR0JfSURfSURYMToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+aWNmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRFJWX0lDRl9JRF9JRFgwOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0RSVl9JQ0ZfSURfSURYMToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9EUlZfSUNGX0lEX0lEWDI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRFJWX0lDRl9JRF9JRFgzOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT50ZmJfdHJhcF9iZWhhdmlvcikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1RGQl9UUkFQX0JFSEFWSU9SX0RST1A6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfVEZCX1RSQVBfQkVIQVZJT1JfRk9SV0FSRF9OTkk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfVEZCX1RSQVBfQkVIQVZJT1JfRk9SV0FSRF9DUFU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfVEZCX1RSQVBfQkVIQVZJT1JfU05PT1A6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnRmYl9tb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfVEZCX01PREVfR1BPTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9URkJfTU9ERV9YR1BPTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9URkJfTU9ERV9FUE9OOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1RGQl9NT0RFX1hFUE9OOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1RGQl9NT0RFX0NPRVg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmxpbV9zZWNfbW9kZV91cCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0xJTV9TRUNfTU9ERV9VUF9URUs6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTElNX1NFQ19NT0RFX1VQX1BFUl9MTElEOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0xJTV9TRUNfTU9ERV9VUF9OVFQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmxpbV9zZWNfbW9kZV9kbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0xJTV9TRUNfTU9ERV9ETl9URUs6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTElNX1NFQ19NT0RFX0ROX1BFUl9MTElEOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0xJTV9TRUNfTU9ERV9ETl9OVFQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTElNX1NFQ19NT0RFX0ROX0NFUE9OOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT54aW1fc2VjX21vZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9YSU1fU0VDX01PREVfUkVTRVJWRURfMDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YSU1fU0VDX01PREVfUEVSX0xMSUQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWElNX1NFQ19NT0RFX1JFU0VSVkVEXzI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWElNX1NFQ19NT0RFX0NFUE9OOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5kYmFfcmFtKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfREJBX1JBTV9HUkFOVF9GSUZPX1JBTV8wOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0RCQV9SQU1fR1JBTlRfRklGT19SQU1fMToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9EQkFfUkFNX0dSQU5UX0ZJRk9fUkFNXzI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfREJBX1JBTV9HUkFOVF9GSUZPX1JBTV8zOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0RCQV9SQU1fR1JBTlRfRklGT19SQU1fNDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9EQkFfUkFNX0dSQU5UX0ZJRk9fUkFNXzU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfREJBX1JBTV9HUkFOVF9GSUZPX1JBTV82OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0RCQV9SQU1fR1JBTlRfRklGT19SQU1fNzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9EQkFfUkFNX0dSQU5UU19PVVRfUkFNOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0RCQV9SQU1fR1JBTlRTX0lOX1JBTToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9EQkFfUkFNX0dSQU5UU19SRVRJUkVEX1JBTToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9EQkFfUkFNX1JFUE9SVF9SQU06CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfREJBX1JBTV9HUkFOVF9DRkdfUkFNOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0RCQV9SQU1fREVGQVVMVF9UT0tFTlNfUkFNOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0RCQV9SQU1fUE9MTF9SRUNPUkRTX1JBTToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9EQkFfUkFNX0hFSVJfUE9MTF9SQU06CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfREJBX1JBTV9MQVNUX1BPTExfVElNRV9SQU06CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfREJBX1JBTV9QT0xMX09SREVSX1JBTToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9EQkFfUkFNX1RETV9SQU1fMDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9EQkFfUkFNX1RETV9SQU1fMToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9EQkFfUkFNX1RETV9SQU1fMjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9EQkFfUkFNX1RETV9SQU1fMzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9EQkFfUkFNX1RETV9SQU1fNDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9EQkFfUkFNX1RETV9SQU1fNToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9EQkFfUkFNX1RETV9SQU1fNjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9EQkFfUkFNX1RETV9SQU1fNzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+aHNjX3JhbSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0hTQ19SQU1fTExDX1QxOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0hTQ19SQU1fTExDX1QyOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0hTQ19SQU1fTExDX1QzOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0hTQ19SQU1fR1JQX1QyOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0hTQ19SQU1fR1JQX1QzOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0hTQ19SQU1fU0hQX1QxOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0hTQ19SQU1fU0hQX1QyOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0hTQ19SQU1fU0hQX1QzOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0hTQ19SQU1fUFJGX1QxOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0hTQ19SQU1fUFJGX1QyOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0hTQ19SQU1fUFJGX1QzOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0hTQ19SQU1fQ1JFX1QxOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0hTQ19SQU1fQ1JFX1QyOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0hTQ19SQU1fQ1JFX1QzOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0hTQ19SQU1fRUxVOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0hTQ19SQU1fUFRSX1QxOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0hTQ19SQU1fUFRSX1QyOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0hTQ19SQU1fQUdSX1NIUF9UMToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9IU0NfUkFNX0FFTToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9IU0NfUkFNX0FMTF9MTEM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmxpbV9yYW0pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9MSU1fUkFNX0xMSURfVVA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTElNX1JBTV9QRVJfT05VX1NUQVQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTElNX1JBTV9GRUNfVVBfRlVMTF9TOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0xJTV9SQU1fRkVDX1VQX0RBVEE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmxreV9yYW0pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9MS1lfUkFNX1RYX0tFWV9SQU06CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTEtZX1JBTV9UWF9LRVlfQlVGRkVSOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0xLWV9SQU1fUlhfS0VZX1JBTToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9MS1lfUkFNX1JYX0tFWV9CVUZGRVI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm1pY19yYW0pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9NSUNfUkFNX1JBTkdFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX01JQ19SQU1fTExJRDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9NSUNfUkFNX0lEWDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9NSUNfUkFNX0dSQU5UX01JU1M6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTUlDX1JBTV9HUkFOVF9JRDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9NSUNfUkFNX1RYX0lWOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX01JQ19SQU1fUlhfSVY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTUlDX1JBTV9UWF9QT1JUX1NUQVQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTUlDX1JBTV9SWF9QT1JUX1NUQVQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnhwY3NfcmFtKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfWFBDU1JNX1JBTV9DQVBUVVJFX0ZJRk86CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWFBDU1JNX1JBTV9GRUNfREVDT0RFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hQQ1NSTV9SQU1fRkVDX1NUQVRTOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hQQ1NSTV9SQU1fRkVDX0VOUVVFVUU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWFBDU1JNX1JBTV9JRExFX0lOU0VSVDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT54ZzJnX2lkID4gKGJjbW9sdF94ZzJnX2lkKSA3KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKiBcZW5kY29uZCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnlfc2V0X2RlZmF1bHQoYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5ICp0aGlzKQoreworICAgIHRoaXMtPmltYWdlX3R5cGUgPSBCQ01PTFRfREVWSUNFX0lNQUdFX1RZUEVfQk9PVExPQURFUjsKKyAgICB0aGlzLT5pbWFnZV9zaXplID0gMDsKKyAgICB0aGlzLT5jcmMzMiA9IDA7CisgICAgdGhpcy0+c3RhdHVzID0gQkNNT0xUX0VNQkVEREVEX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19OT05FOworICAgIG1lbXNldCh0aGlzLT5pbWFnZV9uYW1lLCAwLCA2NCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9wYWNrKGNvbnN0IGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2RldmljZV9pbWFnZV90eXBlX3BhY2sodGhpcy0+aW1hZ2VfdHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+aW1hZ2Vfc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmNyYzMyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lbWJlZGRlZF9pbWFnZV90cmFuc2Zlcl9zdGF0dXNfcGFjayh0aGlzLT5zdGF0dXMsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+aW1hZ2VfbmFtZSwgNjQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnlfdW5wYWNrKGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2RldmljZV9pbWFnZV90eXBlX3VucGFjaygmdGhpcy0+aW1hZ2VfdHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+aW1hZ2Vfc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmNyYzMyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lbWJlZGRlZF9pbWFnZV90cmFuc2Zlcl9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5zdGF0dXMsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWQoYnVmLCB0aGlzLT5pbWFnZV9uYW1lLCA2NCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDc0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnkgKnRoaXMpCit7CisgICAgc3dpdGNoICh0aGlzLT5pbWFnZV90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0lNQUdFX1RZUEVfQk9PVExPQURFUjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFlQRV9BUFBMSUNBVElPTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFlQRV9JVFVfUE9OX09OVV9GSVJNV0FSRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFlQRV9FUE9OX09OVV9GSVJNV0FSRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+c3RhdHVzKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRU1CRURERURfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX05PTkU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRU1CRURERURfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX0lOX1BST0dSRVNTOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VNQkVEREVEX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19TVUNDRVNTOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VNQkVEREVEX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19GQUlMVVJFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9saXN0X3U4X3NldF9kZWZhdWx0KGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9saXN0X3U4ICp0aGlzKQoreworICAgIHRoaXMtPmxlbiA9IDA7CisgICAgdGhpcy0+dmFsID0gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5X2xpc3RfdThfcGFjayhjb25zdCBiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnlfbGlzdF91OCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbiA+IDApICYmICh0aGlzLT52YWwgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5X2xpc3RfdThcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bGVuOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnlfcGFjaygmdGhpcy0+dmFsW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnlfbGlzdF91OF9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnlfbGlzdF91OCAqdGhpcykKK3sKKyAgICByZXR1cm4gMSArICg3NCAqIHRoaXMtPmxlbik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9saXN0X3U4X3VucGFjayhiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnlfbGlzdF91OCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbiA+IDApICYmICh0aGlzLT52YWwgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnlfbGlzdF91OFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT52YWwgPSAoYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5sZW4gKiBzaXplb2YoYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5sZW47IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV91bnBhY2soJnRoaXMtPnZhbFtpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9saXN0X3U4X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgbGVuOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnkpICogbGVuKTsKKyAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIGxlbiAqIDc0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5X2xpc3RfdThfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9saXN0X3U4ICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXJfc2V0X2RlZmF1bHQoYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyICp0aGlzKQoreworICAgIHRoaXMtPmZvcm1hdCA9IChiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2Zvcm1hdCkgMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyX3BhY2soY29uc3QgYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2Zvcm1hdF9wYWNrKHRoaXMtPmZvcm1hdCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmZvcm1hdCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fRU5DUllQVElPTl9JTkZPUk1BVElPTl9GT1JNQVRfQ0ZCOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZShidWYsIHRoaXMtPnUuY2ZiLmtleSwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fSU5GT1JNQVRJT05fRk9STUFUX0NUUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmN0ci5rZXksIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmN0ci5zY2ksIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lciAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgc3dpdGNoICh0aGlzLT5mb3JtYXQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fSU5GT1JNQVRJT05fRk9STUFUX0NGQjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fSU5GT1JNQVRJT05fRk9STUFUX0NUUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXJfdW5wYWNrKGJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lciAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9mb3JtYXRfdW5wYWNrKCZ0aGlzLT5mb3JtYXQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5mb3JtYXQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fSU5GT1JNQVRJT05fRk9STUFUX0NGQjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZChidWYsIHRoaXMtPnUuY2ZiLmtleSwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fSU5GT1JNQVRJT05fRk9STUFUX0NUUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZChidWYsIHRoaXMtPnUuY3RyLmtleSwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5jdHIuc2NpLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX2VuY3J5cHRpb25faW5mb3JtYXRpb25fZm9ybWF0IGZvcm1hdDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX2VuY3J5cHRpb25faW5mb3JtYXRpb25fZm9ybWF0X3VucGFjaygmZm9ybWF0LCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAoZm9ybWF0KQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX0lORk9STUFUSU9OX0ZPUk1BVF9DRkI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fRU5DUllQVElPTl9JTkZPUk1BVElPTl9GT1JNQVRfQ1RSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lcl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyICp0aGlzKQoreworICAgIHN3aXRjaCAodGhpcy0+Zm9ybWF0KQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX0lORk9STUFUSU9OX0ZPUk1BVF9DRkI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX0lORk9STUFUSU9OX0ZPUk1BVF9DVFI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X2NvbmZpZ3VyYXRpb25fc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X2NvbmZpZ3VyYXRpb24gKnRoaXMpCit7CisgICAgdGhpcy0+ZXBvbl9jbG9ja190cmFuc3BvcnRfbW9kZSA9IEJDTU9MVF9FUE9OX0NMT0NLX1RSQU5TUE9SVF9NT0RFX0hPU1RfRFJJVkVOOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfY29uZmlndXJhdGlvbl9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9jb25maWd1cmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfbW9kZV9wYWNrKHRoaXMtPmVwb25fY2xvY2tfdHJhbnNwb3J0X21vZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9jb25maWd1cmF0aW9uX3VucGFjayhiY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfY29uZmlndXJhdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X21vZGVfdW5wYWNrKCZ0aGlzLT5lcG9uX2Nsb2NrX3RyYW5zcG9ydF9tb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfY29uZmlndXJhdGlvbl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfY29uZmlndXJhdGlvbl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X2NvbmZpZ3VyYXRpb24gKnRoaXMpCit7CisgICAgc3dpdGNoICh0aGlzLT5lcG9uX2Nsb2NrX3RyYW5zcG9ydF9tb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9DTE9DS19UUkFOU1BPUlRfTU9ERV9IT1NUX0RSSVZFTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0NMT0NLX1RSQU5TUE9SVF9NT0RFX0VNQkVEREVEX0RSSVZFTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfdW5rbm93bl9saW5rX3N0YXR1c19zZXRfZGVmYXVsdChiY21vbHRfdW5rbm93bl9saW5rX3N0YXR1cyAqdGhpcykKK3sKKyAgICB0aGlzLT5saW5rX3JhdGUgPSBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfVEVOX1RFTjsKKyAgICB0aGlzLT5hbGFybV9zdGF0dXMgPSBCQ01PTFRfU1RBVFVTX09GRjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Vua25vd25fbGlua19zdGF0dXNfcGFjayhjb25zdCBiY21vbHRfdW5rbm93bl9saW5rX3N0YXR1cyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fbGlua19yYXRlX3BhY2sodGhpcy0+bGlua19yYXRlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Vua25vd25fbGlua19zdGF0dXNfdW5wYWNrKGJjbW9sdF91bmtub3duX2xpbmtfc3RhdHVzICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9saW5rX3JhdGVfdW5wYWNrKCZ0aGlzLT5saW5rX3JhdGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdW5rbm93bl9saW5rX3N0YXR1c19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdW5rbm93bl9saW5rX3N0YXR1c19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3Vua25vd25fbGlua19zdGF0dXMgKnRoaXMpCit7CisgICAgc3dpdGNoICh0aGlzLT5saW5rX3JhdGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfUkFURV9URU5fVEVOOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19SQVRFX1RFTl9PTkU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfT05FX09ORToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+YWxhcm1fc3RhdHVzKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfbGFzZXJfb25fb2ZmX3N0YXR1c19zZXRfZGVmYXVsdChiY21vbHRfbGFzZXJfb25fb2ZmX3N0YXR1cyAqdGhpcykKK3sKKyAgICB0aGlzLT5sYXNlcl9vbl90aW1lID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICB0aGlzLT5sYXNlcl9vZmZfdGltZSA9IChiY21vbHRfdGltZV9xdWFudGEpIDA7CisgICAgdGhpcy0+YWxhcm1fc3RhdHVzID0gQkNNT0xUX1NUQVRVU19PRkY7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sYXNlcl9vbl9vZmZfc3RhdHVzX3BhY2soY29uc3QgYmNtb2x0X2xhc2VyX29uX29mZl9zdGF0dXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzLT5sYXNlcl9vbl90aW1lKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzLT5sYXNlcl9vZmZfdGltZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbGFzZXJfb25fb2ZmX3N0YXR1c191bnBhY2soYmNtb2x0X2xhc2VyX29uX29mZl9zdGF0dXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPmxhc2VyX29uX3RpbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICh1aW50MzJfdCAqKSAmdGhpcy0+bGFzZXJfb2ZmX3RpbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xhc2VyX29uX29mZl9zdGF0dXNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCA5KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xhc2VyX29uX29mZl9zdGF0dXNfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9sYXNlcl9vbl9vZmZfc3RhdHVzICp0aGlzKQoreworICAgIHN3aXRjaCAodGhpcy0+YWxhcm1fc3RhdHVzKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfcmFuZ2Vfc3RhdHVzX3NldF9kZWZhdWx0KGJjbW9sdF9yYW5nZV9zdGF0dXMgKnRoaXMpCit7CisgICAgdGhpcy0+cmFuZ2UgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSAwOworICAgIHRoaXMtPmFsYXJtX3N0YXR1cyA9IEJDTU9MVF9TVEFUVVNfT0ZGOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcmFuZ2Vfc3RhdHVzX3BhY2soY29uc3QgYmNtb2x0X3JhbmdlX3N0YXR1cyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMtPnJhbmdlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yYW5nZV9zdGF0dXNfdW5wYWNrKGJjbW9sdF9yYW5nZV9zdGF0dXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPnJhbmdlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yYW5nZV9zdGF0dXNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCA1KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JhbmdlX3N0YXR1c19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3JhbmdlX3N0YXR1cyAqdGhpcykKK3sKKyAgICBzd2l0Y2ggKHRoaXMtPmFsYXJtX3N0YXR1cykKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3JvZ3VlX3N0YXR1c19zZXRfZGVmYXVsdChiY21vbHRfcm9ndWVfc3RhdHVzICp0aGlzKQoreworICAgIHRoaXMtPmRlbmllZF9sbGlkID0gKGJjbW9sdF9lcG9uX2xsaWQpIDA7CisgICAgdGhpcy0+ZGVuaWVkX3JhbmdlID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICB0aGlzLT5hbGFybV9zdGF0dXMgPSBCQ01PTFRfU1RBVFVTX09GRjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JvZ3VlX3N0YXR1c19wYWNrKGNvbnN0IGJjbW9sdF9yb2d1ZV9zdGF0dXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5kZW5pZWRfbGxpZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcy0+ZGVuaWVkX3JhbmdlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9zdGF0dXNfdW5wYWNrKGJjbW9sdF9yb2d1ZV9zdGF0dXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPmRlbmllZF9sbGlkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPmRlbmllZF9yYW5nZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcm9ndWVfc3RhdHVzX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9zdGF0dXNfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9yb2d1ZV9zdGF0dXMgKnRoaXMpCit7CisgICAgc3dpdGNoICh0aGlzLT5hbGFybV9zdGF0dXMpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2FsYXJtX3N0YXRlX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2FsYXJtX3N0YXRlICp0aGlzKQoreworICAgIHRoaXMtPnVua25vd25fbGlua192aW9sYXRpb24ubGlua19yYXRlID0gQkNNT0xUX0VQT05fTElOS19SQVRFX1RFTl9URU47CisgICAgdGhpcy0+dW5rbm93bl9saW5rX3Zpb2xhdGlvbi5hbGFybV9zdGF0dXMgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB0aGlzLT5vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbiA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIHRoaXMtPm1heF9saW5rX3Zpb2xhdGlvbiA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIHRoaXMtPmxsaWRfcG9vbF9lbXB0eV92aW9sYXRpb24gPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB0aGlzLT5sYXNlcl9vbl9vZmZfdmlvbGF0aW9uLmxhc2VyX29uX3RpbWUgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSAwOworICAgIHRoaXMtPmxhc2VyX29uX29mZl92aW9sYXRpb24ubGFzZXJfb2ZmX3RpbWUgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSAwOworICAgIHRoaXMtPmxhc2VyX29uX29mZl92aW9sYXRpb24uYWxhcm1fc3RhdHVzID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgdGhpcy0+c3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbiA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIHRoaXMtPnJhbmdlX3Zpb2xhdGlvbi5yYW5nZSA9IChiY21vbHRfdGltZV9xdWFudGEpIDA7CisgICAgdGhpcy0+cmFuZ2VfdmlvbGF0aW9uLmFsYXJtX3N0YXR1cyA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIHRoaXMtPnRkbV9jaGFubmVsc19leGhhdXN0ZWQgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB0aGlzLT5yb2d1ZV92aW9sYXRpb24uZGVuaWVkX2xsaWQgPSAoYmNtb2x0X2Vwb25fbGxpZCkgMDsKKyAgICB0aGlzLT5yb2d1ZV92aW9sYXRpb24uZGVuaWVkX3JhbmdlID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICB0aGlzLT5yb2d1ZV92aW9sYXRpb24uYWxhcm1fc3RhdHVzID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgdGhpcy0+dXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbiA9IEJDTU9MVF9TVEFUVVNfT0ZGOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hbGFybV9zdGF0ZV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2FsYXJtX3N0YXRlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfdW5rbm93bl9saW5rX3N0YXR1c19wYWNrKCZ0aGlzLT51bmtub3duX2xpbmtfdmlvbGF0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPm92ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPm1heF9saW5rX3Zpb2xhdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2xhc2VyX29uX29mZl9zdGF0dXNfcGFjaygmdGhpcy0+bGFzZXJfb25fb2ZmX3Zpb2xhdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3JhbmdlX3N0YXR1c19wYWNrKCZ0aGlzLT5yYW5nZV92aW9sYXRpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+dGRtX2NoYW5uZWxzX2V4aGF1c3RlZCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9yb2d1ZV9zdGF0dXNfcGFjaygmdGhpcy0+cm9ndWVfdmlvbGF0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPnVwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2FsYXJtX3N0YXRlX3VucGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hbGFybV9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X3Vua25vd25fbGlua19zdGF0dXNfdW5wYWNrKCZ0aGlzLT51bmtub3duX2xpbmtfdmlvbGF0aW9uLCBidWYsIGV4dHJhX21lbSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+b3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+bWF4X2xpbmtfdmlvbGF0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPmxsaWRfcG9vbF9lbXB0eV92aW9sYXRpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfbGFzZXJfb25fb2ZmX3N0YXR1c191bnBhY2soJnRoaXMtPmxhc2VyX29uX29mZl92aW9sYXRpb24sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3JhbmdlX3N0YXR1c191bnBhY2soJnRoaXMtPnJhbmdlX3Zpb2xhdGlvbiwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPnRkbV9jaGFubmVsc19leGhhdXN0ZWQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfcm9ndWVfc3RhdHVzX3VucGFjaygmdGhpcy0+cm9ndWVfdmlvbGF0aW9uLCBidWYsIGV4dHJhX21lbSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+dXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYWxhcm1fc3RhdGVfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAzMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2FsYXJtX3N0YXRlX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hbGFybV9zdGF0ZSAqdGhpcykKK3sKKyAgICBpZiAoIWJjbW9sdF91bmtub3duX2xpbmtfc3RhdHVzX2JvdW5kc19jaGVjaygmdGhpcy0+dW5rbm93bl9saW5rX3Zpb2xhdGlvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm1heF9saW5rX3Zpb2xhdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmxsaWRfcG9vbF9lbXB0eV92aW9sYXRpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfbGFzZXJfb25fb2ZmX3N0YXR1c19ib3VuZHNfY2hlY2soJnRoaXMtPmxhc2VyX29uX29mZl92aW9sYXRpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+c3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9yYW5nZV9zdGF0dXNfYm91bmRzX2NoZWNrKCZ0aGlzLT5yYW5nZV92aW9sYXRpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+dGRtX2NoYW5uZWxzX2V4aGF1c3RlZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9yb2d1ZV9zdGF0dXNfYm91bmRzX2NoZWNrKCZ0aGlzLT5yb2d1ZV92aW9sYXRpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+dXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9jb25maWdfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9jb25maWcgKnRoaXMpCit7CisgICAgdGhpcy0+ZG93bnN0cmVhbV9tb2RlID0gQkNNT0xUX0VQT05fRU5DUllQVElPTl9NT0RFX05PX0VOQ1JZUFRJT047CisgICAgdGhpcy0+ZG93bnN0cmVhbV9rZXlfY2hvaWNlID0gQkNNT0xUX0VQT05fS0VZX0NIT0lDRV9LRVlfMDsKKyAgICB0aGlzLT5kb3duc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24uZm9ybWF0ID0gQkNNT0xUX0VQT05fRU5DUllQVElPTl9JTkZPUk1BVElPTl9GT1JNQVRfQ0ZCOworICAgIG1lbXNldCh0aGlzLT5kb3duc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24udS5jZmIua2V5LCAwLCBzaXplb2YodGhpcy0+ZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLnUuY2ZiLmtleSkpOworICAgIHRoaXMtPnVwc3RyZWFtX21vZGUgPSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX01PREVfTk9fRU5DUllQVElPTjsKKyAgICB0aGlzLT51cHN0cmVhbV9rZXlfY2hvaWNlID0gQkNNT0xUX0VQT05fS0VZX0NIT0lDRV9LRVlfMDsKKyAgICB0aGlzLT51cHN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLmZvcm1hdCA9IEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fSU5GT1JNQVRJT05fRk9STUFUX0NGQjsKKyAgICBtZW1zZXQodGhpcy0+dXBzdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi51LmNmYi5rZXksIDAsIHNpemVvZih0aGlzLT51cHN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLnUuY2ZiLmtleSkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2NvbmZpZ19wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fY29uZmlnICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9lbmNyeXB0aW9uX21vZGVfcGFjayh0aGlzLT5kb3duc3RyZWFtX21vZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9rZXlfY2hvaWNlX3BhY2sodGhpcy0+ZG93bnN0cmVhbV9rZXlfY2hvaWNlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyX3BhY2soJnRoaXMtPmRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX2VuY3J5cHRpb25fbW9kZV9wYWNrKHRoaXMtPnVwc3RyZWFtX21vZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9rZXlfY2hvaWNlX3BhY2sodGhpcy0+dXBzdHJlYW1fa2V5X2Nob2ljZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lcl9wYWNrKCZ0aGlzLT51cHN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9jb25maWdfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9jb25maWcgKnRoaXMpCit7CisgICAgcmV0dXJuIDYgKyBiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXJfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbikgKyBiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXJfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2NvbmZpZ191bnBhY2soYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9jb25maWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX2VuY3J5cHRpb25fbW9kZV91bnBhY2soJnRoaXMtPmRvd25zdHJlYW1fbW9kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX2tleV9jaG9pY2VfdW5wYWNrKCZ0aGlzLT5kb3duc3RyZWFtX2tleV9jaG9pY2UsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXJfdW5wYWNrKCZ0aGlzLT5kb3duc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX2VuY3J5cHRpb25fbW9kZV91bnBhY2soJnRoaXMtPnVwc3RyZWFtX21vZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9rZXlfY2hvaWNlX3VucGFjaygmdGhpcy0+dXBzdHJlYW1fa2V5X2Nob2ljZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lcl91bnBhY2soJnRoaXMtPnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9jb25maWdfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lcl9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9jb25maWdfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fY29uZmlnICp0aGlzKQoreworICAgIHN3aXRjaCAodGhpcy0+ZG93bnN0cmVhbV9tb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX01PREVfTk9fRU5DUllQVElPTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fTU9ERV9FUE9OX1RSSVBMRV9DSFVSTklORzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fTU9ERV9FUE9OX1pFUk9fT1ZFUkhFQURfQUVTOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5kb3duc3RyZWFtX2tleV9jaG9pY2UpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0tFWV9DSE9JQ0VfS0VZXzA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9LRVlfQ0hPSUNFX0tFWV8xOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXJfYm91bmRzX2NoZWNrKCZ0aGlzLT5kb3duc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+dXBzdHJlYW1fbW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fRU5DUllQVElPTl9NT0RFX05PX0VOQ1JZUFRJT046CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX01PREVfRVBPTl9UUklQTEVfQ0hVUk5JTkc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX01PREVfRVBPTl9aRVJPX09WRVJIRUFEX0FFUzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+dXBzdHJlYW1fa2V5X2Nob2ljZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fS0VZX0NIT0lDRV9LRVlfMDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0tFWV9DSE9JQ0VfS0VZXzE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lcl9ib3VuZHNfY2hlY2soJnRoaXMtPnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9rZXlfZXhjaGFuZ2VfY29uZmlnX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2tleV9leGNoYW5nZV9jb25maWcgKnRoaXMpCit7CisgICAgdGhpcy0+b2FtX3R5cGUgPSBCQ01PTFRfRVBPTl9PQU1fVFlQRV9CUk9BRENPTTsKKyAgICB0aGlzLT5wZXJpb2QgPSAwOworICAgIHRoaXMtPmRpcmVjdGlvbiA9IEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fRElSRUNUSU9OX0RPV05TVFJFQU1fT05MWTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fa2V5X2V4Y2hhbmdlX2NvbmZpZ19wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2tleV9leGNoYW5nZV9jb25maWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90eXBlX3BhY2sodGhpcy0+b2FtX3R5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnBlcmlvZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2RpcmVjdGlvbl9wYWNrKHRoaXMtPmRpcmVjdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fa2V5X2V4Y2hhbmdlX2NvbmZpZ191bnBhY2soYmNtb2x0X2Vwb25fa2V5X2V4Y2hhbmdlX2NvbmZpZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3R5cGVfdW5wYWNrKCZ0aGlzLT5vYW1fdHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+cGVyaW9kKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX2VuY3J5cHRpb25fZGlyZWN0aW9uX3VucGFjaygmdGhpcy0+ZGlyZWN0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9rZXlfZXhjaGFuZ2VfY29uZmlnX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2tleV9leGNoYW5nZV9jb25maWdfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2tleV9leGNoYW5nZV9jb25maWcgKnRoaXMpCit7CisgICAgc3dpdGNoICh0aGlzLT5vYW1fdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RZUEVfQlJPQURDT006CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVFlQRV9DVEM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVFlQRV9EUE9FOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RZUEVfU0lFUE9OQToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+ZGlyZWN0aW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX0RJUkVDVElPTl9ET1dOU1RSRUFNX09OTFk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVyc19zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9sYXNlcl9vdmVyaGVhZF9wYXJhbWV0ZXJzICp0aGlzKQoreworICAgIHRoaXMtPmxhc2VyX29uX3RpbWUgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSAzMjsKKyAgICB0aGlzLT5sYXNlcl9vZmZfdGltZSA9IChiY21vbHRfdGltZV9xdWFudGEpIDMyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9sYXNlcl9vdmVyaGVhZF9wYXJhbWV0ZXJzX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVycyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMtPmxhc2VyX29uX3RpbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMtPmxhc2VyX29mZl90aW1lKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVyc191bnBhY2soYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVycyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICh1aW50MzJfdCAqKSAmdGhpcy0+bGFzZXJfb25fdGltZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgKHVpbnQzMl90ICopICZ0aGlzLT5sYXNlcl9vZmZfdGltZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xhc2VyX292ZXJoZWFkX3BhcmFtZXRlcnNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVyc19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVycyAqdGhpcykKK3sKKyAgICBpZiAodGhpcy0+bGFzZXJfb25fdGltZSA+IChiY21vbHRfdGltZV9xdWFudGEpIDYyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5sYXNlcl9vZmZfdGltZSA+IChiY21vbHRfdGltZV9xdWFudGEpIDYyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9saW5rX2FsYXJtX3N0YXRlX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2xpbmtfYWxhcm1fc3RhdGUgKnRoaXMpCit7CisgICAgdGhpcy0+a2V5X2V4Y2hhbmdlX2ZhaWx1cmUgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB0aGlzLT5pbnZhbGlkX21wY3BfcmVwb3J0X3JlY2VpdmVkID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgdGhpcy0+bXBjcF9yZXBvcnRfdGltZW91dCA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIHRoaXMtPm9hbV9rZWVwYWxpdmVfdGltZW91dCA9IEJDTU9MVF9TVEFUVVNfT0ZGOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2FsYXJtX3N0YXRlX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19hbGFybV9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPmtleV9leGNoYW5nZV9mYWlsdXJlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPmludmFsaWRfbXBjcF9yZXBvcnRfcmVjZWl2ZWQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+bXBjcF9yZXBvcnRfdGltZW91dCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5vYW1fa2VlcGFsaXZlX3RpbWVvdXQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfYWxhcm1fc3RhdGVfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfYWxhcm1fc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5rZXlfZXhjaGFuZ2VfZmFpbHVyZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5pbnZhbGlkX21wY3BfcmVwb3J0X3JlY2VpdmVkLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPm1wY3BfcmVwb3J0X3RpbWVvdXQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+b2FtX2tlZXBhbGl2ZV90aW1lb3V0LCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2FsYXJtX3N0YXRlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfYWxhcm1fc3RhdGVfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfYWxhcm1fc3RhdGUgKnRoaXMpCit7CisgICAgc3dpdGNoICh0aGlzLT5rZXlfZXhjaGFuZ2VfZmFpbHVyZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmludmFsaWRfbXBjcF9yZXBvcnRfcmVjZWl2ZWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5tcGNwX3JlcG9ydF90aW1lb3V0KQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b2FtX2tlZXBhbGl2ZV90aW1lb3V0KQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9saW5rX2ZlY19lbl9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9saW5rX2ZlY19lbiAqdGhpcykKK3sKKyAgICB0aGlzLT51cHN0cmVhbSA9IEJDTU9MVF9FUE9OX0xJTktfRkVDX1NUQVRFX1VTRV9ERUZBVUxUOworICAgIHRoaXMtPmRvd25zdHJlYW0gPSBCQ01PTFRfRVBPTl9MSU5LX0ZFQ19TVEFURV9VU0VfREVGQVVMVDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19mZWNfZW5fcGFjayhjb25zdCBiY21vbHRfZXBvbl9saW5rX2ZlY19lbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fbGlua19mZWNfc3RhdGVfcGFjayh0aGlzLT51cHN0cmVhbSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX2xpbmtfZmVjX3N0YXRlX3BhY2sodGhpcy0+ZG93bnN0cmVhbSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19mZWNfZW5fdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfZmVjX2VuICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9saW5rX2ZlY19zdGF0ZV91bnBhY2soJnRoaXMtPnVwc3RyZWFtLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fbGlua19mZWNfc3RhdGVfdW5wYWNrKCZ0aGlzLT5kb3duc3RyZWFtLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2ZlY19lbl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2ZlY19lbl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19mZWNfZW4gKnRoaXMpCit7CisgICAgc3dpdGNoICh0aGlzLT51cHN0cmVhbSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19GRUNfU1RBVEVfRElTQUJMRUQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0ZFQ19TVEFURV9FTkFCTEVEOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19GRUNfU1RBVEVfVVNFX0RFRkFVTFQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmRvd25zdHJlYW0pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfRkVDX1NUQVRFX0RJU0FCTEVEOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19GRUNfU1RBVEVfRU5BQkxFRDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfRkVDX1NUQVRFX1VTRV9ERUZBVUxUOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX2xpbmtfaW5mb19zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9saW5rX2luZm8gKnRoaXMpCit7CisgICAgdGhpcy0+bGlua19zdGF0dXMgPSAoYmNtb2x0X2Vwb25fbGlua19zdGF0dXMpIDA7CisgICAgdGhpcy0+cmF0ZSA9IEJDTU9MVF9FUE9OX0xJTktfUkFURV9URU5fVEVOOworICAgIHRoaXMtPmxsaWQgPSAoYmNtb2x0X2Vwb25fbGxpZCkgMDsKKyAgICB0aGlzLT5tcGNwX2Rpc2NvdmVyeV9pbmZvID0gKGJjbW9sdF9tcGNwX2Rpc2NvdmVyeV9pbmZvKSAwOworICAgIHRoaXMtPm9udV9sYXNlcl9vbl90aW1lX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICB0aGlzLT5vbnVfbGFzZXJfb2ZmX3RpbWVfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSAwOworICAgIHRoaXMtPnBlbmRpbmdfZ3JhbnRzID0gMDsKKyAgICB0aGlzLT5yYW5nZV92YWx1ZV90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIDA7CisgICAgdGhpcy0+dHVubmVsX2lkID0gKGJjbW9sdF9lcG9uX3R1bm5lbF9pZCkgMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19pbmZvX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19pbmZvICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9saW5rX3N0YXR1c19wYWNrKHRoaXMtPmxpbmtfc3RhdHVzLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fbGlua19yYXRlX3BhY2sodGhpcy0+cmF0ZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5sbGlkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9tcGNwX2Rpc2NvdmVyeV9pbmZvX3BhY2sodGhpcy0+bXBjcF9kaXNjb3ZlcnlfaW5mbywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzLT5vbnVfbGFzZXJfb25fdGltZV90cSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcy0+b251X2xhc2VyX29mZl90aW1lX3RxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5wZW5kaW5nX2dyYW50cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcy0+cmFuZ2VfdmFsdWVfdHEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMtPnR1bm5lbF9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfaW5mb191bnBhY2soYmNtb2x0X2Vwb25fbGlua19pbmZvICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9saW5rX3N0YXR1c191bnBhY2soJnRoaXMtPmxpbmtfc3RhdHVzLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fbGlua19yYXRlX3VucGFjaygmdGhpcy0+cmF0ZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPmxsaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X21wY3BfZGlzY292ZXJ5X2luZm9fdW5wYWNrKCZ0aGlzLT5tcGNwX2Rpc2NvdmVyeV9pbmZvLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICh1aW50MzJfdCAqKSAmdGhpcy0+b251X2xhc2VyX29uX3RpbWVfdHEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICh1aW50MzJfdCAqKSAmdGhpcy0+b251X2xhc2VyX29mZl90aW1lX3RxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5wZW5kaW5nX2dyYW50cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgKHVpbnQzMl90ICopICZ0aGlzLT5yYW5nZV92YWx1ZV90cSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgKHVpbnQzMl90ICopICZ0aGlzLT50dW5uZWxfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2luZm9fc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAyNCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfaW5mb19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19pbmZvICp0aGlzKQoreworICAgIGlmICgodGhpcy0+bGlua19zdGF0dXMgJiAweDAwRjYpICE9IDApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5yYXRlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfVEVOX1RFTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfUkFURV9URU5fT05FOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19SQVRFX09ORV9PTkU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPm1wY3BfZGlzY292ZXJ5X2luZm8gJiAweEZGQ0NVKSAhPSAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX3NldF9kZWZhdWx0KGJjbW9sdF9nYXRlX3BhcmFtZXRlcnMgKnRoaXMpCit7CisgICAgdGhpcy0+ZmxhZ3MgPSAoYmNtb2x0X21wY3BfcmVnaXN0cmF0aW9uX2dhdGVfZmxhZ3MpIDA7CisgICAgdGhpcy0+ZGVsYXlfYmVmb3JlX21zID0gNTA7CisgICAgdGhpcy0+Z2F0ZV9zaXplX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgNDI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9nYXRlX3BhcmFtZXRlcnNfcGFjayhjb25zdCBiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfbXBjcF9yZWdpc3RyYXRpb25fZ2F0ZV9mbGFnc19wYWNrKHRoaXMtPmZsYWdzLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5kZWxheV9iZWZvcmVfbXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMtPmdhdGVfc2l6ZV90cSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9nYXRlX3BhcmFtZXRlcnNfdW5wYWNrKGJjbW9sdF9nYXRlX3BhcmFtZXRlcnMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9tcGNwX3JlZ2lzdHJhdGlvbl9nYXRlX2ZsYWdzX3VucGFjaygmdGhpcy0+ZmxhZ3MsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmRlbGF5X2JlZm9yZV9tcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgKHVpbnQzMl90ICopICZ0aGlzLT5nYXRlX3NpemVfdHEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzICp0aGlzKQoreworICAgIGlmICgodGhpcy0+ZmxhZ3MgJiAweEZGRkZGRkZFVUwpICE9IDApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmRlbGF5X2JlZm9yZV9tcyA+IDM2MDAwMDBVTCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+Z2F0ZV9zaXplX3RxID4gKGJjbW9sdF90aW1lX3F1YW50YSkgNjU1MzVVTCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dhdGVfcGFyYW1ldGVyc19saXN0X3UzMl9zZXRfZGVmYXVsdChiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX2xpc3RfdTMyICp0aGlzKQoreworICAgIHRoaXMtPmxlbiA9IDA7CisgICAgdGhpcy0+dmFsID0gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dhdGVfcGFyYW1ldGVyc19saXN0X3UzMl9wYWNrKGNvbnN0IGJjbW9sdF9nYXRlX3BhcmFtZXRlcnNfbGlzdF91MzIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+bGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbiA+IDApICYmICh0aGlzLT52YWwgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2dhdGVfcGFyYW1ldGVyc19saXN0X3UzMlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5sZW47IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9nYXRlX3BhcmFtZXRlcnNfcGFjaygmdGhpcy0+dmFsW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX2xpc3RfdTMyX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9nYXRlX3BhcmFtZXRlcnNfbGlzdF91MzIgKnRoaXMpCit7CisgICAgcmV0dXJuIDQgKyAoMTIgKiB0aGlzLT5sZW4pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX2xpc3RfdTMyX3VucGFjayhiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX2xpc3RfdTMyICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDMyX3QgaTA7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2dhdGVfcGFyYW1ldGVyc19saXN0X3UzMlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT52YWwgPSAoYmNtb2x0X2dhdGVfcGFyYW1ldGVycyAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+bGVuICogc2l6ZW9mKGJjbW9sdF9nYXRlX3BhcmFtZXRlcnMpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmxlbjsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dhdGVfcGFyYW1ldGVyc191bnBhY2soJnRoaXMtPnZhbFtpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9nYXRlX3BhcmFtZXRlcnNfbGlzdF91MzJfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDMyX3QgbGVuOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihwYWNrZWQsICZsZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2dhdGVfcGFyYW1ldGVycykgKiBsZW4pOworICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgbGVuICogMTIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX2xpc3RfdTMyX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX2xpc3RfdTMyICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX3JlZ2lzdHJhdGlvbl9nYXRlX21vZGUgKnRoaXMpCit7CisgICAgdGhpcy0+cmVnaXN0cmF0aW9uX2dhdGVfbW9kZSA9IChiY21vbHRfbXBjcF9nYXRlX21vZGUpIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3JlZ2lzdHJhdGlvbl9nYXRlX21vZGVfcGFjayhjb25zdCBiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfbXBjcF9nYXRlX21vZGVfcGFjayh0aGlzLT5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+cmVnaXN0cmF0aW9uX2dhdGVfbW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX01QQ1BfR0FURV9NT0RFX1RFS05PVlVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnRla25vdnVzLnJlZ19hY2tfdGltZW91dF9tcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX01QQ1BfR0FURV9NT0RFX0NVU1RPTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9nYXRlX3BhcmFtZXRlcnNfbGlzdF91MzJfcGFjaygmdGhpcy0+dS5jdXN0b20uZ2F0ZXMsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX3JlZ2lzdHJhdGlvbl9nYXRlX21vZGUgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+cmVnaXN0cmF0aW9uX2dhdGVfbW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX01QQ1BfR0FURV9NT0RFX1RFS05PVlVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTVBDUF9HQVRFX01PREVfQ1VTVE9NOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9nYXRlX3BhcmFtZXRlcnNfbGlzdF91MzJfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuY3VzdG9tLmdhdGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfbXBjcF9nYXRlX21vZGVfdW5wYWNrKCZ0aGlzLT5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+cmVnaXN0cmF0aW9uX2dhdGVfbW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX01QQ1BfR0FURV9NT0RFX1RFS05PVlVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LnRla25vdnVzLnJlZ19hY2tfdGltZW91dF9tcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX01QQ1BfR0FURV9NT0RFX0NVU1RPTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9nYXRlX3BhcmFtZXRlcnNfbGlzdF91MzJfdW5wYWNrKCZ0aGlzLT51LmN1c3RvbS5nYXRlcywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9tcGNwX2dhdGVfbW9kZSByZWdpc3RyYXRpb25fZ2F0ZV9tb2RlOworICAgIGlmICghYmNtb2x0X21wY3BfZ2F0ZV9tb2RlX3VucGFjaygmcmVnaXN0cmF0aW9uX2dhdGVfbW9kZSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHJlZ2lzdHJhdGlvbl9nYXRlX21vZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9NUENQX0dBVEVfTU9ERV9URUtOT1ZVUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9NUENQX0dBVEVfTU9ERV9DVVNUT006CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX2xpc3RfdTMyX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlICp0aGlzKQoreworICAgIHN3aXRjaCAodGhpcy0+cmVnaXN0cmF0aW9uX2dhdGVfbW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX01QQ1BfR0FURV9NT0RFX1RFS05PVlVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnRla25vdnVzLnJlZ19hY2tfdGltZW91dF9tcyA8IDUwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnRla25vdnVzLnJlZ19hY2tfdGltZW91dF9tcyA+IDIwMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTVBDUF9HQVRFX01PREVfQ1VTVE9NOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2dhdGVfcGFyYW1ldGVyc19saXN0X3UzMl9ib3VuZHNfY2hlY2soJnRoaXMtPnUuY3VzdG9tLmdhdGVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbG9naWNhbF9saW5rX29wdGlvbnNfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbG9naWNhbF9saW5rX29wdGlvbnMgKnRoaXMpCit7CisgICAgdGhpcy0+cmVnaXN0cmF0aW9uX2dhdGVfbW9kZS5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlID0gQkNNT0xUX01QQ1BfR0FURV9NT0RFX1RFS05PVlVTOworICAgIHRoaXMtPnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUudS50ZWtub3Z1cy5yZWdfYWNrX3RpbWVvdXRfbXMgPSAxMDA7CisgICAgdGhpcy0+cmVwb3J0aW5nX21vZGUgPSBCQ01PTFRfRVBPTl9EQkFfUkVQT1JUSU5HX01PREVfU0lFUE9OX0E7CisgICAgdGhpcy0+bWF4X2xpbmtzID0gNTEyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9uc19wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlX3BhY2soJnRoaXMtPnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9kYmFfcmVwb3J0aW5nX21vZGVfcGFjayh0aGlzLT5yZXBvcnRpbmdfbW9kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bWF4X2xpbmtzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zICp0aGlzKQoreworICAgIHJldHVybiAzICsgYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+cmVnaXN0cmF0aW9uX2dhdGVfbW9kZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zX3VucGFjayhiY21vbHRfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZV91bnBhY2soJnRoaXMtPnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX2RiYV9yZXBvcnRpbmdfbW9kZV91bnBhY2soJnRoaXMtPnJlcG9ydGluZ19tb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5tYXhfbGlua3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9uc19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX3JlZ2lzdHJhdGlvbl9nYXRlX21vZGVfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9uc19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbG9naWNhbF9saW5rX29wdGlvbnMgKnRoaXMpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlX2JvdW5kc19jaGVjaygmdGhpcy0+cmVnaXN0cmF0aW9uX2dhdGVfbW9kZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5yZXBvcnRpbmdfbW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fREJBX1JFUE9SVElOR19NT0RFX1NJRVBPTl9BOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fREJBX1JFUE9SVElOR19NT0RFX1NJRVBPTl9COgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fREJBX1JFUE9SVElOR19NT0RFX1NJRVBPTl9DOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPm1heF9saW5rcyA+IDIwNDQpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX25pX2FsYXJtX3N0YXRlX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX25pX2FsYXJtX3N0YXRlICp0aGlzKQoreworICAgIHRoaXMtPm5vX3JlcG9ydHMgPSBCQ01PTFRfU1RBVFVTX09GRjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfYWxhcm1fc3RhdGVfcGFjayhjb25zdCBiY21vbHRfZXBvbl9uaV9hbGFybV9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPm5vX3JlcG9ydHMsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2FsYXJtX3N0YXRlX3VucGFjayhiY21vbHRfZXBvbl9uaV9hbGFybV9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPm5vX3JlcG9ydHMsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2FsYXJtX3N0YXRlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2FsYXJtX3N0YXRlX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9uaV9hbGFybV9zdGF0ZSAqdGhpcykKK3sKKyAgICBzd2l0Y2ggKHRoaXMtPm5vX3JlcG9ydHMpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX25pX2VuY3J5cHRpb25fY2ZnX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX25pX2VuY3J5cHRpb25fY2ZnICp0aGlzKQoreworICAgIHRoaXMtPmRvd25zdHJlYW1fZW5jcnlwdGlvbl9tb2RlID0gQkNNT0xUX0VQT05fRU5DUllQVElPTl9NT0RFX05PX0VOQ1JZUFRJT047CisgICAgdGhpcy0+dXBzdHJlYW1fZW5jcnlwdGlvbl9tb2RlID0gQkNNT0xUX0VQT05fRU5DUllQVElPTl9NT0RFX05PX0VOQ1JZUFRJT047Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2VuY3J5cHRpb25fY2ZnX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfZW5jcnlwdGlvbl9jZmcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX2VuY3J5cHRpb25fbW9kZV9wYWNrKHRoaXMtPmRvd25zdHJlYW1fZW5jcnlwdGlvbl9tb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9tb2RlX3BhY2sodGhpcy0+dXBzdHJlYW1fZW5jcnlwdGlvbl9tb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9lbmNyeXB0aW9uX2NmZ191bnBhY2soYmNtb2x0X2Vwb25fbmlfZW5jcnlwdGlvbl9jZmcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX2VuY3J5cHRpb25fbW9kZV91bnBhY2soJnRoaXMtPmRvd25zdHJlYW1fZW5jcnlwdGlvbl9tb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9tb2RlX3VucGFjaygmdGhpcy0+dXBzdHJlYW1fZW5jcnlwdGlvbl9tb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9lbmNyeXB0aW9uX2NmZ19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9lbmNyeXB0aW9uX2NmZ19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfZW5jcnlwdGlvbl9jZmcgKnRoaXMpCit7CisgICAgc3dpdGNoICh0aGlzLT5kb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fRU5DUllQVElPTl9NT0RFX05PX0VOQ1JZUFRJT046CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX01PREVfRVBPTl9UUklQTEVfQ0hVUk5JTkc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX01PREVfRVBPTl9aRVJPX09WRVJIRUFEX0FFUzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+dXBzdHJlYW1fZW5jcnlwdGlvbl9tb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX01PREVfTk9fRU5DUllQVElPTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fTU9ERV9FUE9OX1RSSVBMRV9DSFVSTklORzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fTU9ERV9FUE9OX1pFUk9fT1ZFUkhFQURfQUVTOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtc19zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXMgKnRoaXMpCit7CisgICAgdGhpcy0+b2FtX2V4dGVuc2lvbl90eXBlID0gKGJjbW9sdF9lcG9uX29hbV9leHRlbnNpb25fdHlwZSkgMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZXh0ZW5zaW9uX3R5cGVfcGFjayh0aGlzLT5vYW1fZXh0ZW5zaW9uX3R5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vYW1fZXh0ZW5zaW9uX3R5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FWFRFTlNJT05fVFlQRV9SRVNFUlZFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FWFRFTlNJT05fVFlQRV9CUk9BRENPTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5icm9hZGNvbS5yZXNwb25zZV90aW1lb3V0X21zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfQ1RDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmN0Yy5yZXNwb25zZV90aW1lb3V0X21zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfREFTQU46CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuZGFzYW4ucmVzcG9uc2VfdGltZW91dF9tcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VYVEVOU0lPTl9UWVBFX0tUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51Lmt0LnJlc3BvbnNlX3RpbWVvdXRfbXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FWFRFTlNJT05fVFlQRV9EUE9FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmRwb2UucmVzcG9uc2VfdGltZW91dF9tcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZHBvZS5ibG9ja19zaXplKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5kcG9lLmZpbmFsX2Fja19yZXNwb25zZV90aW1lb3V0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtc19nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXMgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+b2FtX2V4dGVuc2lvbl90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfUkVTRVJWRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfQlJPQURDT006CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FWFRFTlNJT05fVFlQRV9DVEM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FWFRFTlNJT05fVFlQRV9EQVNBTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VYVEVOU0lPTl9UWVBFX0tUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfRFBPRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXNfdW5wYWNrKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtcyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2V4dGVuc2lvbl90eXBlX3VucGFjaygmdGhpcy0+b2FtX2V4dGVuc2lvbl90eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b2FtX2V4dGVuc2lvbl90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfUkVTRVJWRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfQlJPQURDT006CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnUuYnJvYWRjb20ucmVzcG9uc2VfdGltZW91dF9tcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VYVEVOU0lPTl9UWVBFX0NUQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dS5jdGMucmVzcG9uc2VfdGltZW91dF9tcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VYVEVOU0lPTl9UWVBFX0RBU0FOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT51LmRhc2FuLnJlc3BvbnNlX3RpbWVvdXRfbXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FWFRFTlNJT05fVFlQRV9LVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dS5rdC5yZXNwb25zZV90aW1lb3V0X21zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfRFBPRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dS5kcG9lLnJlc3BvbnNlX3RpbWVvdXRfbXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmRwb2UuYmxvY2tfc2l6ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnUuZHBvZS5maW5hbF9hY2tfcmVzcG9uc2VfdGltZW91dCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtc19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZXh0ZW5zaW9uX3R5cGUgb2FtX2V4dGVuc2lvbl90eXBlOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2V4dGVuc2lvbl90eXBlX3VucGFjaygmb2FtX2V4dGVuc2lvbl90eXBlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAob2FtX2V4dGVuc2lvbl90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfUkVTRVJWRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfQlJPQURDT006CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfQ1RDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VYVEVOU0lPTl9UWVBFX0RBU0FOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VYVEVOU0lPTl9UWVBFX0tUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VYVEVOU0lPTl9UWVBFX0RQT0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtc19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zICp0aGlzKQoreworICAgIHN3aXRjaCAodGhpcy0+b2FtX2V4dGVuc2lvbl90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfUkVTRVJWRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfQlJPQURDT006CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuYnJvYWRjb20ucmVzcG9uc2VfdGltZW91dF9tcyA8IDUwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FWFRFTlNJT05fVFlQRV9DVEM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuY3RjLnJlc3BvbnNlX3RpbWVvdXRfbXMgPCAxMDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VYVEVOU0lPTl9UWVBFX0RBU0FOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmRhc2FuLnJlc3BvbnNlX3RpbWVvdXRfbXMgPCA1MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfS1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUua3QucmVzcG9uc2VfdGltZW91dF9tcyA8IDUwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FWFRFTlNJT05fVFlQRV9EUE9FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmRwb2UucmVzcG9uc2VfdGltZW91dF9tcyA8IDEwMDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuZHBvZS5ibG9ja19zaXplIDwgMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5kcG9lLmZpbmFsX2Fja19yZXNwb25zZV90aW1lb3V0IDwgMTUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXMgKnRoaXMpCit7CisgICAgYmNtb3NfbWFjX2FkZHJlc3NfaW5pdCgmdGhpcy0+b251X2lkKTsKKyAgICB0aGlzLT5lcnJvcl9jb2RlID0gQkNNT0xUX0VQT05fT05VX1VQR1JBREVfUkVUVVJOX0NPREVfU1VDQ0VTUzsKKyAgICB0aGlzLT5vbnVfcmV0dXJuX2NvZGUgPSBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+b251X2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29udV91cGdyYWRlX3JldHVybl9jb2RlX3BhY2sodGhpcy0+ZXJyb3JfY29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29udV91cGdyYWRlX29udV9yZXNwb25zZV9jb2RlX3BhY2sodGhpcy0+b251X3JldHVybl9jb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXNfdW5wYWNrKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1cyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX21hY19hZGRyZXNzKGJ1ZiwgJnRoaXMtPm9udV9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9yZXR1cm5fY29kZV91bnBhY2soJnRoaXMtPmVycm9yX2NvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9vbnVfcmVzcG9uc2VfY29kZV91bnBhY2soJnRoaXMtPm9udV9yZXR1cm5fY29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzICp0aGlzKQoreworICAgIHN3aXRjaCAodGhpcy0+ZXJyb3JfY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VX1VQR1JBREVfUkVUVVJOX0NPREVfU1VDQ0VTUzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX1JFVFVSTl9DT0RFX09OVV9SRVNQT05TRV9USU1FT1VUOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VX1VQR1JBREVfUkVUVVJOX0NPREVfT05VX0VSUk9SX1JFU1BPTlNFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VX1VQR1JBREVfUkVUVVJOX0NPREVfU1lOQ19FUlJPUjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX1JFVFVSTl9DT0RFX0NPTU1JVF9GQUlMRUQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9SRVRVUk5fQ09ERV9JTlRFUk5BTDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX1JFVFVSTl9DT0RFX1BBUlNFX0VSUk9SOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vbnVfcmV0dXJuX2NvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX09LOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfVU5ERUZJTkVEOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfTk9UX0ZPVU5EOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfTk9fQUNDRVNTOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfRlVMTDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX0lMTEVHQUxfT1BFUkFUSU9OOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfVU5LTk9XTl9JRDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX0JBRF9CTE9DSzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX1RJTUVPVVQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9CVVNZOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfSU5DT01QQVRJQkxFX0ZJTEU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9DT1JSVVBURURfRklMRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX0VSUk9SX05PVF9ERUZJTkVEOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfRVJST1JfQUxMT0NfRVhDRUVERUQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9FUlJPUl9JTExFR0FMX09QOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfRVJST1JfRklMRV9FWElTVFM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9FTkRfV1JJVElOR19OVlM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9FTkRfQ1JDX0VSUk9SOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfRU5EX1BBUkFNX0VSUk9SOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfRU5EX0NNRF9VTlNVUFBPUlRFRDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX0xBU1Q6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMiAqdGhpcykKK3sKKyAgICB0aGlzLT5sZW4gPSAwOworICAgIHRoaXMtPnZhbCA9IE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMl9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGkwOworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5sZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bGVuID4gMCkgJiYgKHRoaXMtPnZhbCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzJcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bGVuOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXNfcGFjaygmdGhpcy0+dmFsW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzJfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyICp0aGlzKQoreworICAgIHJldHVybiA0ICsgKDggKiB0aGlzLT5sZW4pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzJfdW5wYWNrKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQzMl90IGkwOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5sZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bGVuID4gMCkgJiYgKHRoaXMtPnZhbCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT52YWwgPSAoYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5sZW4gKiBzaXplb2YoYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5sZW47IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c191bnBhY2soJnRoaXMtPnZhbFtpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MzJfdCBsZW47CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKHBhY2tlZCwgJmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXMpICogbGVuKTsKKyAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIGxlbiAqIDgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzJfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMiAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY29uZmlndXJhdGlvbl9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19jb25maWd1cmF0aW9uICp0aGlzKQoreworICAgIHRoaXMtPnByb3RlY3Rpb25fdHlwZSA9IEJDTU9MVF9FUE9OX1BST1RFQ1RJT05fU1dJVENISU5HX1RZUEVfTk9fUFJPVEVDVElPTl9TV1RJQ0hJTkc7CisgICAgdGhpcy0+cHJvdGVjdGlvbl9zd2l0Y2hpbmdfb3B0aW9ucyA9IChiY21vbHRfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGV0ZWN0aW9uX29wdGlvbnMpIDA7CisgICAgdGhpcy0+cmVyYW5nZV9vcHRpb25zID0gQkNNT0xUX0VQT05fUFJPVEVDVElPTl9TV0lUQ0hJTkdfUkVSQU5HSU5HX09QVElPTlNfUkVSQU5HRV9OT05FOworICAgIHRoaXMtPnJlcmFuZ2VfYXR0ZW1wdHMgPSAwOworICAgIHRoaXMtPnJlcmFuZ2VfaW50ZXJ2YWwgPSAwOworICAgIHRoaXMtPnN5bmNfZ2F0ZV9kdXJhdGlvbiA9IDA7CisgICAgdGhpcy0+Z3Bpb19pbnB1dCA9IEJDTU9MVF9HUElPX1BJTl9VTkNPTkZJR1VSRUQ7CisgICAgdGhpcy0+Z3Bpb19pbnB1dF9wb2xhcml0eSA9IEJDTU9MVF9HUElPX1BPTEFSSVRZX0FDVElWRV9ISUdIOworICAgIHRoaXMtPmdwaW9fb3V0cHV0ID0gQkNNT0xUX0dQSU9fUElOX1VOQ09ORklHVVJFRDsKKyAgICB0aGlzLT5ncGlvX291dHB1dF9wb2xhcml0eSA9IEJDTU9MVF9HUElPX1BPTEFSSVRZX0FDVElWRV9ISUdIOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19jb25maWd1cmF0aW9uX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY29uZmlndXJhdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9wYWNrKHRoaXMtPnByb3RlY3Rpb25fdHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZXRlY3Rpb25fb3B0aW9uc19wYWNrKHRoaXMtPnByb3RlY3Rpb25fc3dpdGNoaW5nX29wdGlvbnMsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19yZXJhbmdpbmdfb3B0aW9uc19wYWNrKHRoaXMtPnJlcmFuZ2Vfb3B0aW9ucywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5yZXJhbmdlX2F0dGVtcHRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+cmVyYW5nZV9pbnRlcnZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnN5bmNfZ2F0ZV9kdXJhdGlvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZ3Bpb19waW5fcGFjayh0aGlzLT5ncGlvX2lucHV0LCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2dwaW9fcG9sYXJpdHlfcGFjayh0aGlzLT5ncGlvX2lucHV0X3BvbGFyaXR5LCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2dwaW9fcGluX3BhY2sodGhpcy0+Z3Bpb19vdXRwdXQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZ3Bpb19wb2xhcml0eV9wYWNrKHRoaXMtPmdwaW9fb3V0cHV0X3BvbGFyaXR5LCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19jb25maWd1cmF0aW9uX3VucGFjayhiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19jb25maWd1cmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX3VucGFjaygmdGhpcy0+cHJvdGVjdGlvbl90eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RldGVjdGlvbl9vcHRpb25zX3VucGFjaygmdGhpcy0+cHJvdGVjdGlvbl9zd2l0Y2hpbmdfb3B0aW9ucywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3JlcmFuZ2luZ19vcHRpb25zX3VucGFjaygmdGhpcy0+cmVyYW5nZV9vcHRpb25zLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnJlcmFuZ2VfYXR0ZW1wdHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5yZXJhbmdlX2ludGVydmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+c3luY19nYXRlX2R1cmF0aW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9ncGlvX3Bpbl91bnBhY2soJnRoaXMtPmdwaW9faW5wdXQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZ3Bpb19wb2xhcml0eV91bnBhY2soJnRoaXMtPmdwaW9faW5wdXRfcG9sYXJpdHksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZ3Bpb19waW5fdW5wYWNrKCZ0aGlzLT5ncGlvX291dHB1dCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9ncGlvX3BvbGFyaXR5X3VucGFjaygmdGhpcy0+Z3Bpb19vdXRwdXRfcG9sYXJpdHksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2NvbmZpZ3VyYXRpb25fc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAxMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2NvbmZpZ3VyYXRpb25fYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2NvbmZpZ3VyYXRpb24gKnRoaXMpCit7CisgICAgc3dpdGNoICh0aGlzLT5wcm90ZWN0aW9uX3R5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BST1RFQ1RJT05fU1dJVENISU5HX1RZUEVfTk9fUFJPVEVDVElPTl9TV1RJQ0hJTkc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QUk9URUNUSU9OX1NXSVRDSElOR19UWVBFX0xJTkVfQ0FSRF9QUk9URUNUSU9OX1NXSVRDSElORzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+cHJvdGVjdGlvbl9zd2l0Y2hpbmdfb3B0aW9ucyAmIDB4MDBGRSkgIT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnJlcmFuZ2Vfb3B0aW9ucykKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUFJPVEVDVElPTl9TV0lUQ0hJTkdfUkVSQU5HSU5HX09QVElPTlNfUkVSQU5HRV9OT05FOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUFJPVEVDVElPTl9TV0lUQ0hJTkdfUkVSQU5HSU5HX09QVElPTlNfUkVSQU5HRV9TSU5HTEVfTE9HSUNBTF9MSU5LOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUFJPVEVDVElPTl9TV0lUQ0hJTkdfUkVSQU5HSU5HX09QVElPTlNfUkVSQU5HRV9BTExfTE9HSUNBTF9MSU5LUzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+Z3Bpb19pbnB1dCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4yOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU41OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU44OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTAwOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjEwMToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTAzOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjEwNDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTA2OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1VOQ09ORklHVVJFRDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+Z3Bpb19pbnB1dF9wb2xhcml0eSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUE9MQVJJVFlfQUNUSVZFX0xPVzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BPTEFSSVRZX0FDVElWRV9ISUdIOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5ncGlvX291dHB1dCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4yOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU41OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU44OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTAwOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjEwMToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTAzOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjEwNDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTA2OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1VOQ09ORklHVVJFRDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+Z3Bpb19vdXRwdXRfcG9sYXJpdHkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BPTEFSSVRZX0FDVElWRV9MT1c6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QT0xBUklUWV9BQ1RJVkVfSElHSDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfdThfbGlzdF91MTZfc2V0X2RlZmF1bHQoYmNtb2x0X3U4X2xpc3RfdTE2ICp0aGlzKQoreworICAgIHRoaXMtPmxlbiA9IDA7CisgICAgdGhpcy0+dmFsID0gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3U4X2xpc3RfdTE2X3BhY2soY29uc3QgYmNtb2x0X3U4X2xpc3RfdTE2ICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF91OF9saXN0X3UxNlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGUoYnVmLCB0aGlzLT52YWwsIHRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfdThfbGlzdF91MTZfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3U4X2xpc3RfdTE2ICp0aGlzKQoreworICAgIHJldHVybiAyICsgdGhpcy0+bGVuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdThfbGlzdF91MTZfdW5wYWNrKGJjbW9sdF91OF9saXN0X3UxNiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5sZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bGVuID4gMCkgJiYgKHRoaXMtPnZhbCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF91OF9saXN0X3UxNlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT52YWwgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+bGVuICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dmFsLCB0aGlzLT5sZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdThfbGlzdF91MTZfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgbGVuOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihwYWNrZWQsICZsZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiBsZW4pOworICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgbGVuICogMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF91OF9saXN0X3UxNl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3U4X2xpc3RfdTE2ICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXRoZXJuZXRfZnJhbWVfbWFza2VkX3NldF9kZWZhdWx0KGJjbW9sdF9ldGhlcm5ldF9mcmFtZV9tYXNrZWQgKnRoaXMpCit7CisgICAgdGhpcy0+ZnJhbWVfb2N0ZXRzLmxlbiA9IDA7CisgICAgdGhpcy0+ZnJhbWVfb2N0ZXRzLnZhbCA9IE5VTEw7CisgICAgdGhpcy0+bWFza19vY3RldHMubGVuID0gMDsKKyAgICB0aGlzLT5tYXNrX29jdGV0cy52YWwgPSBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXRoZXJuZXRfZnJhbWVfbWFza2VkX3BhY2soY29uc3QgYmNtb2x0X2V0aGVybmV0X2ZyYW1lX21hc2tlZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTE2X3BhY2soJnRoaXMtPmZyYW1lX29jdGV0cywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF91OF9saXN0X3UxNl9wYWNrKCZ0aGlzLT5tYXNrX29jdGV0cywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ldGhlcm5ldF9mcmFtZV9tYXNrZWRfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2V0aGVybmV0X2ZyYW1lX21hc2tlZCAqdGhpcykKK3sKKyAgICByZXR1cm4gYmNtb2x0X3U4X2xpc3RfdTE2X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5mcmFtZV9vY3RldHMpICsgYmNtb2x0X3U4X2xpc3RfdTE2X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5tYXNrX29jdGV0cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ldGhlcm5ldF9mcmFtZV9tYXNrZWRfdW5wYWNrKGJjbW9sdF9ldGhlcm5ldF9mcmFtZV9tYXNrZWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF91OF9saXN0X3UxNl91bnBhY2soJnRoaXMtPmZyYW1lX29jdGV0cywgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTE2X3VucGFjaygmdGhpcy0+bWFza19vY3RldHMsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2V0aGVybmV0X2ZyYW1lX21hc2tlZF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF91OF9saXN0X3UxNl9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF91OF9saXN0X3UxNl9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2V0aGVybmV0X2ZyYW1lX21hc2tlZF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2V0aGVybmV0X2ZyYW1lX21hc2tlZCAqdGhpcykKK3sKKyAgICBpZiAoIWJjbW9sdF91OF9saXN0X3UxNl9ib3VuZHNfY2hlY2soJnRoaXMtPmZyYW1lX29jdGV0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MTZfYm91bmRzX2NoZWNrKCZ0aGlzLT5tYXNrX29jdGV0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ldGhlcm5ldF9mcmFtZV91bm1hc2tlZF9zZXRfZGVmYXVsdChiY21vbHRfZXRoZXJuZXRfZnJhbWVfdW5tYXNrZWQgKnRoaXMpCit7CisgICAgdGhpcy0+ZnJhbWVfb2N0ZXRzLmxlbiA9IDA7CisgICAgdGhpcy0+ZnJhbWVfb2N0ZXRzLnZhbCA9IE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ldGhlcm5ldF9mcmFtZV91bm1hc2tlZF9wYWNrKGNvbnN0IGJjbW9sdF9ldGhlcm5ldF9mcmFtZV91bm1hc2tlZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTE2X3BhY2soJnRoaXMtPmZyYW1lX29jdGV0cywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ldGhlcm5ldF9mcmFtZV91bm1hc2tlZF9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXRoZXJuZXRfZnJhbWVfdW5tYXNrZWQgKnRoaXMpCit7CisgICAgcmV0dXJuIGJjbW9sdF91OF9saXN0X3UxNl9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+ZnJhbWVfb2N0ZXRzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2V0aGVybmV0X2ZyYW1lX3VubWFza2VkX3VucGFjayhiY21vbHRfZXRoZXJuZXRfZnJhbWVfdW5tYXNrZWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF91OF9saXN0X3UxNl91bnBhY2soJnRoaXMtPmZyYW1lX29jdGV0cywgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXRoZXJuZXRfZnJhbWVfdW5tYXNrZWRfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MTZfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ldGhlcm5ldF9mcmFtZV91bm1hc2tlZF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2V0aGVybmV0X2ZyYW1lX3VubWFza2VkICp0aGlzKQoreworICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTE2X2JvdW5kc19jaGVjaygmdGhpcy0+ZnJhbWVfb2N0ZXRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2V4dGVuZGVkX2d1YXJkX3RpbWVfc2V0X2RlZmF1bHQoYmNtb2x0X2V4dGVuZGVkX2d1YXJkX3RpbWUgKnRoaXMpCit7CisgICAgdGhpcy0+YWRkaXRpb25hbF9wcmVidXJzdF9ndWFyZF90aW1lID0gMDsKKyAgICB0aGlzLT5hZGRpdGlvbmFsX3Bvc3RidXJzdF9ndWFyZF90aW1lID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2V4dGVuZGVkX2d1YXJkX3RpbWVfcGFjayhjb25zdCBiY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5hZGRpdGlvbmFsX3ByZWJ1cnN0X2d1YXJkX3RpbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5hZGRpdGlvbmFsX3Bvc3RidXJzdF9ndWFyZF90aW1lKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2V4dGVuZGVkX2d1YXJkX3RpbWVfdW5wYWNrKGJjbW9sdF9leHRlbmRlZF9ndWFyZF90aW1lICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmFkZGl0aW9uYWxfcHJlYnVyc3RfZ3VhcmRfdGltZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmFkZGl0aW9uYWxfcG9zdGJ1cnN0X2d1YXJkX3RpbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2V4dGVuZGVkX2d1YXJkX3RpbWUgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPmFkZGl0aW9uYWxfcHJlYnVyc3RfZ3VhcmRfdGltZSA+IDUwMCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+YWRkaXRpb25hbF9wb3N0YnVyc3RfZ3VhcmRfdGltZSA+IDUwMCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Zpcm13YXJlX3N3X3ZlcnNpb25fc2V0X2RlZmF1bHQoYmNtb2x0X2Zpcm13YXJlX3N3X3ZlcnNpb24gKnRoaXMpCit7CisgICAgdGhpcy0+bWFqb3IgPSAwOworICAgIHRoaXMtPm1pbm9yID0gMDsKKyAgICB0aGlzLT5yZXZpc2lvbiA9IDA7CisgICAgdGhpcy0+bW9kZWwgPSAwOworICAgIG1lbXNldCh0aGlzLT5idWlsZF90aW1lLCAwLCAzMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9maXJtd2FyZV9zd192ZXJzaW9uX3BhY2soY29uc3QgYmNtb2x0X2Zpcm13YXJlX3N3X3ZlcnNpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5tYWpvcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bWlub3IpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnJldmlzaW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+bW9kZWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZShidWYsIHRoaXMtPmJ1aWxkX3RpbWUsIDMyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Zpcm13YXJlX3N3X3ZlcnNpb25fdW5wYWNrKGJjbW9sdF9maXJtd2FyZV9zd192ZXJzaW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bWFqb3IpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPm1pbm9yKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5yZXZpc2lvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPm1vZGVsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZChidWYsIHRoaXMtPmJ1aWxkX3RpbWUsIDMyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Zpcm13YXJlX3N3X3ZlcnNpb25fc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAzOSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9maXJtd2FyZV9zd192ZXJzaW9uX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbiAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fc2V0X2RlZmF1bHQoYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb24gKnRoaXMpCit7CisgICAgdGhpcy0+ZGlyZWN0aW9uID0gQkNNT0xUX0dFTV9QT1JUX0RJUkVDVElPTl9ET1dOU1RSRUFNOworICAgIHRoaXMtPnR5cGUgPSBCQ01PTFRfR0VNX1BPUlRfVFlQRV9VTklDQVNUOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9wYWNrKGNvbnN0IGJjbW9sdF9nZW1fcG9ydF9jb25maWd1cmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZ2VtX3BvcnRfZGlyZWN0aW9uX3BhY2sodGhpcy0+ZGlyZWN0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2dlbV9wb3J0X3R5cGVfcGFjayh0aGlzLT50eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ2VtX3BvcnRfY29uZmlndXJhdGlvbl91bnBhY2soYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9nZW1fcG9ydF9kaXJlY3Rpb25fdW5wYWNrKCZ0aGlzLT5kaXJlY3Rpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZ2VtX3BvcnRfdHlwZV91bnBhY2soJnRoaXMtPnR5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9nZW1fcG9ydF9jb25maWd1cmF0aW9uX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ2VtX3BvcnRfY29uZmlndXJhdGlvbiAqdGhpcykKK3sKKyAgICBzd2l0Y2ggKHRoaXMtPmRpcmVjdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0dFTV9QT1JUX0RJUkVDVElPTl9ET1dOU1RSRUFNOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dFTV9QT1JUX0RJUkVDVElPTl9VUFNUUkVBTToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HRU1fUE9SVF9ESVJFQ1RJT05fQklESVJFQ1RJT05BTDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0dFTV9QT1JUX1RZUEVfVU5JQ0FTVDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HRU1fUE9SVF9UWVBFX01VTFRJQ0FTVDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGUgKnRoaXMpCit7CisgICAgdGhpcy0+YWxsb2NfaWQgPSAoYmNtb2x0X2dwb25fYWxsb2NfaWQpIDA7CisgICAgdGhpcy0+c3RhdGUgPSBCQ01PTFRfQUxMT0NfU1RBVEVfTk9UX0NPTkZJR1VSRUQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGVfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+YWxsb2NfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2FsbG9jX3N0YXRlX3BhY2sodGhpcy0+c3RhdGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGVfdW5wYWNrKGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPmFsbG9jX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9hbGxvY19zdGF0ZV91bnBhY2soJnRoaXMtPnN0YXRlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGVfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGUgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPmFsbG9jX2lkID4gKGJjbW9sdF9ncG9uX2FsbG9jX2lkKSA0MDk1KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+c3RhdGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9BTExPQ19TVEFURV9OT1RfQ09ORklHVVJFRDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BTExPQ19TVEFURV9JTkFDVElWRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BTExPQ19TVEFURV9QUk9DRVNTSU5HOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FMTE9DX1NUQVRFX0FDVElWRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMl9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMiAqdGhpcykKK3sKKyAgICB0aGlzLT5sZW4gPSAwOworICAgIHRoaXMtPnZhbCA9IE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyX3BhY2soY29uc3QgYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbiA+IDApICYmICh0aGlzLT52YWwgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzJcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmxlbiA+IDMyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmxlbjsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZV9wYWNrKCZ0aGlzLT52YWxbaTBdLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyICp0aGlzKQoreworICAgIHJldHVybiAyICsgKDMgKiB0aGlzLT5sZW4pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMl91bnBhY2soYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MTZfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbiA+IDApICYmICh0aGlzLT52YWwgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT52YWwgPSAoYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+bGVuICogc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0aGlzLT5sZW4gPiAzMikKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5sZW47IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGVfdW5wYWNrKCZ0aGlzLT52YWxbaTBdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MTZfdCBsZW47CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlKSAqIGxlbik7CisgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCBsZW4gKiAzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzJfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyICp0aGlzKQoreworICAgIGlmICh0aGlzLT5sZW4gPiAzMikKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fZGVidWdfZmxvd19jb25maWdfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fZGVidWdfZmxvd19jb25maWcgKnRoaXMpCit7CisgICAgdGhpcy0+dW50YWdnZWRfZmxvdyA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU7CisgICAgdGhpcy0+dW50YWdnZWRfdmlkID0gKGJjbW9sdF92bGFuX2lkKSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9kZWJ1Z19mbG93X2NvbmZpZ19wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2RlYnVnX2Zsb3dfY29uZmlnICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfY29udHJvbF9zdGF0ZV9wYWNrKHRoaXMtPnVudGFnZ2VkX2Zsb3csIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+dW50YWdnZWRfdmlkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZGVidWdfZmxvd19jb25maWdfdW5wYWNrKGJjbW9sdF9ncG9uX2RlYnVnX2Zsb3dfY29uZmlnICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfY29udHJvbF9zdGF0ZV91bnBhY2soJnRoaXMtPnVudGFnZ2VkX2Zsb3csIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT51bnRhZ2dlZF92aWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9kZWJ1Z19mbG93X2NvbmZpZ19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9kZWJ1Z19mbG93X2NvbmZpZ19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fZGVidWdfZmxvd19jb25maWcgKnRoaXMpCit7CisgICAgc3dpdGNoICh0aGlzLT51bnRhZ2dlZF9mbG93KQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRU5BQkxFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPnVudGFnZ2VkX3ZpZCA+IChiY21vbHRfdmxhbl9pZCkgNDA5NSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2X3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNiAqdGhpcykKK3sKKyAgICB0aGlzLT5sZW4gPSAwOworICAgIHRoaXMtPnZhbCA9IE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNl9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbiA+IDApICYmICh0aGlzLT52YWwgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2dwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5sZW4gPiAxNikKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5sZW47IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT52YWxbaTBdKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTZfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2ICp0aGlzKQoreworICAgIHJldHVybiAxICsgKDIgKiB0aGlzLT5sZW4pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTZfdW5wYWNrKGJjbW9sdF9ncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbiA+IDApICYmICh0aGlzLT52YWwgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZ3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTZcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+dmFsID0gKGJjbW9sdF9ncG9uX2dlbV9pZCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+bGVuICogc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9pZCkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHRoaXMtPmxlbiA+IDE2KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmxlbjsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+dmFsW2kwXSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTZfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBsZW47CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9pZCkgKiBsZW4pOworICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgbGVuICogMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2ICp0aGlzKQoreworICAgIGlmICh0aGlzLT5sZW4gPiAxNikKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlICp0aGlzKQoreworICAgIHRoaXMtPmdlbV9pZCA9IChiY21vbHRfZ3Bvbl9nZW1faWQpIDA7CisgICAgdGhpcy0+c3RhdGUgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFURV9OT1RfQ09ORklHVVJFRDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5nZW1faWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdGVfcGFjayh0aGlzLT5zdGF0ZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV91bnBhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+Z2VtX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRlX3VucGFjaygmdGhpcy0+c3RhdGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSAqdGhpcykKK3sKKyAgICBpZiAodGhpcy0+Z2VtX2lkID4gKGJjbW9sdF9ncG9uX2dlbV9pZCkgNDA5NSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnN0YXRlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFURV9OT1RfQ09ORklHVVJFRDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRFX0lOQUNUSVZFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVEVfUFJPQ0VTU0lORzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRFX0FDVElWRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjhfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4ICp0aGlzKQoreworICAgIHRoaXMtPmxlbiA9IDA7CisgICAgdGhpcy0+dmFsID0gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4X3BhY2soY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4ICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgaTA7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+bGVuID4gMTI4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmxlbjsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9wYWNrKCZ0aGlzLT52YWxbaTBdLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOF9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjggKnRoaXMpCit7CisgICAgcmV0dXJuIDIgKyAoMyAqIHRoaXMtPmxlbik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOF91bnBhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgaTA7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnZhbCA9IChiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5sZW4gKiBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHRoaXMtPmxlbiA+IDEyOCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5sZW47IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfdW5wYWNrKCZ0aGlzLT52YWxbaTBdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjhfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgbGVuOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihwYWNrZWQsICZsZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSkgKiBsZW4pOworICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgbGVuICogMykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4ICp0aGlzKQoreworICAgIGlmICh0aGlzLT5sZW4gPiAxMjgpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1Nl9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTYgKnRoaXMpCit7CisgICAgdGhpcy0+bGVuID0gMDsKKyAgICB0aGlzLT52YWwgPSBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTZfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTYgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbiA+IDApICYmICh0aGlzLT52YWwgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5sZW4gPiAyNTYpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bGVuOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX3BhY2soJnRoaXMtPnZhbFtpMF0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1NiAqdGhpcykKK3sKKyAgICByZXR1cm4gMiArICgzICogdGhpcy0+bGVuKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2X3VucGFjayhiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTYgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MTZfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbiA+IDApICYmICh0aGlzLT52YWwgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTZcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+dmFsID0gKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGUgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPmxlbiAqIHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodGhpcy0+bGVuID4gMjU2KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmxlbjsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV91bnBhY2soJnRoaXMtPnZhbFtpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1Nl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MTZfdCBsZW47CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlKSAqIGxlbik7CisgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCBsZW4gKiAzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTYgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPmxlbiA+IDI1NikKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25faXdmX2RlYnVnX2Zsb3dfY29uZmlnX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2l3Zl9kZWJ1Z19mbG93X2NvbmZpZyAqdGhpcykKK3sKKyAgICB0aGlzLT5sZWFybl91bnRhZ2dlZF9mbG93X3ZpZHMgPSBCQ01PU19GQUxTRTsKKyAgICB0aGlzLT51bnRhZ2dlZF9mbG93X3NoYXBpbmdfbXNfcGVyX3NlYyA9IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9kZWJ1Z19mbG93X2NvbmZpZ19wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9kZWJ1Z19mbG93X2NvbmZpZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+bGVhcm5fdW50YWdnZWRfZmxvd192aWRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dW50YWdnZWRfZmxvd19zaGFwaW5nX21zX3Blcl9zZWMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZGVidWdfZmxvd19jb25maWdfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9kZWJ1Z19mbG93X2NvbmZpZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+bGVhcm5fdW50YWdnZWRfZmxvd192aWRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dW50YWdnZWRfZmxvd19zaGFwaW5nX21zX3Blcl9zZWMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZGVidWdfZmxvd19jb25maWdfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2RlYnVnX2Zsb3dfY29uZmlnX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfZGVidWdfZmxvd19jb25maWcgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPnVudGFnZ2VkX2Zsb3dfc2hhcGluZ19tc19wZXJfc2VjID4gMTAwMCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fa2V5X2V4Y2hhbmdlX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2tleV9leGNoYW5nZSAqdGhpcykKK3sKKyAgICB0aGlzLT5pbnRlcnZhbCA9IDEwMDAwOworICAgIHRoaXMtPmNvbnRyb2wgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOworICAgIHRoaXMtPm1vZGUgPSBCQ01PTFRfS0VZX0VYQ0hBTkdFX01PREVfTk9STUFMOworICAgIHRoaXMtPmVuY3J5cHRlZF9wb3J0c19vbmx5ID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRU5BQkxFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9rZXlfZXhjaGFuZ2VfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9rZXlfZXhjaGFuZ2UgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+aW50ZXJ2YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfcGFjayh0aGlzLT5jb250cm9sLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2tleV9leGNoYW5nZV9tb2RlX3BhY2sodGhpcy0+bW9kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9jb250cm9sX3N0YXRlX3BhY2sodGhpcy0+ZW5jcnlwdGVkX3BvcnRzX29ubHksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2tleV9leGNoYW5nZV91bnBhY2soYmNtb2x0X2dwb25fa2V5X2V4Y2hhbmdlICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmludGVydmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9jb250cm9sX3N0YXRlX3VucGFjaygmdGhpcy0+Y29udHJvbCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9rZXlfZXhjaGFuZ2VfbW9kZV91bnBhY2soJnRoaXMtPm1vZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfY29udHJvbF9zdGF0ZV91bnBhY2soJnRoaXMtPmVuY3J5cHRlZF9wb3J0c19vbmx5LCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9rZXlfZXhjaGFuZ2Vfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCA3KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fa2V5X2V4Y2hhbmdlX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9rZXlfZXhjaGFuZ2UgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPmludGVydmFsIDwgMTAwMCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+aW50ZXJ2YWwgPiAzNjAwMDAwVUwpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5jb250cm9sKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRU5BQkxFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5tb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfS0VZX0VYQ0hBTkdFX01PREVfTk9STUFMOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0tFWV9FWENIQU5HRV9NT0RFX0VOSEFOQ0VEOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5lbmNyeXB0ZWRfcG9ydHNfb25seSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9DT05UUk9MX1NUQVRFX0VOQUJMRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHRfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0ICp0aGlzKQoreworICAgIHRoaXMtPnZsYW4gPSAoYmNtb2x0X3ZsYW5faWQpIDA7CisgICAgdGhpcy0+Zmxvd19pZCA9IChiY21vbHRfZmxvd19pZCkgMDsKKyAgICB0aGlzLT5zdGF0ID0gQkNNT1NfRkFMU0U7CisgICAgdGhpcy0+Z2VtX3BvcnRfaWQgPSAoYmNtb2x0X2dwb25fZ2VtX2lkKSAwOworICAgIHRoaXMtPm9udV9pZCA9IChiY21vbHRfZ3Bvbl9vbnVfaWQpIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdF9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPnZsYW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPmZsb3dfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+Z2VtX3BvcnRfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPm9udV9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdF91bnBhY2soYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT52bGFuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPmZsb3dfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c3RhdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5nZW1fcG9ydF9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5vbnVfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHRfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCA5KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHQgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPmZsb3dfaWQgPiAoYmNtb2x0X2Zsb3dfaWQpIDQwOTUpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmdlbV9wb3J0X2lkID4gKGJjbW9sdF9ncG9uX2dlbV9pZCkgNDA5NSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+b251X2lkID4gKGJjbW9sdF9ncG9uX29udV9pZCkgMTI3KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHRfbGlzdF91MTZfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0X2xpc3RfdTE2ICp0aGlzKQoreworICAgIHRoaXMtPmxlbiA9IDA7CisgICAgdGhpcy0+dmFsID0gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0X2xpc3RfdTE2X3BhY2soY29uc3QgYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0X2xpc3RfdTE2ICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgaTA7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdF9saXN0X3UxNlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5sZW47IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdF9wYWNrKCZ0aGlzLT52YWxbaTBdLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdF9saXN0X3UxNl9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHRfbGlzdF91MTYgKnRoaXMpCit7CisgICAgcmV0dXJuIDIgKyAoOSAqIHRoaXMtPmxlbik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdF9saXN0X3UxNl91bnBhY2soYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0X2xpc3RfdTE2ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgaTA7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0X2xpc3RfdTE2XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnZhbCA9IChiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHQgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPmxlbiAqIHNpemVvZihiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmxlbjsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0X3VucGFjaygmdGhpcy0+dmFsW2kwXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0X2xpc3RfdTE2X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IGxlbjsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYocGFja2VkLCAmbGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdCkgKiBsZW4pOworICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgbGVuICogOSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdF9saXN0X3UxNl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0X2xpc3RfdTE2ICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9uaV9kZWJ1Z19zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9uaV9kZWJ1ZyAqdGhpcykKK3sKKyAgICB0aGlzLT5udW1iZXJfb2ZfZ2VtX3BvcnRzX3Blcl9vbnUgPSA2NDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfZGVidWdfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9kZWJ1ZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5udW1iZXJfb2ZfZ2VtX3BvcnRzX3Blcl9vbnUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9kZWJ1Z191bnBhY2soYmNtb2x0X2dwb25fbmlfZGVidWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bnVtYmVyX29mX2dlbV9wb3J0c19wZXJfb251KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfZGVidWdfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfZGVidWdfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX2RlYnVnICp0aGlzKQoreworICAgIGlmICh0aGlzLT5udW1iZXJfb2ZfZ2VtX3BvcnRzX3Blcl9vbnUgPCA4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5udW1iZXJfb2ZfZ2VtX3BvcnRzX3Blcl9vbnUgPiAyNTYpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX29udV9hY3RpdmF0aW9uX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9hY3RpdmF0aW9uICp0aGlzKQoreworICAgIHRoaXMtPmtleV9leGNoYW5nZSA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU7CisgICAgdGhpcy0+cGFzc3dvcmRfYXV0aGVudGljYXRpb24gPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9FTkFCTEU7CisgICAgdGhpcy0+ZmFpbF9kdWVfdG9fcGFzc3dvcmRfYXV0aGVudGljYXRpb25fZmFpbHVyZSA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0VOQUJMRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2FjdGl2YXRpb25fcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfYWN0aXZhdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfcGFjayh0aGlzLT5rZXlfZXhjaGFuZ2UsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfY29udHJvbF9zdGF0ZV9wYWNrKHRoaXMtPnBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfcGFjayh0aGlzLT5mYWlsX2R1ZV90b19wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfYWN0aXZhdGlvbl91bnBhY2soYmNtb2x0X2dwb25fb251X2FjdGl2YXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9jb250cm9sX3N0YXRlX3VucGFjaygmdGhpcy0+a2V5X2V4Y2hhbmdlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfdW5wYWNrKCZ0aGlzLT5wYXNzd29yZF9hdXRoZW50aWNhdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9jb250cm9sX3N0YXRlX3VucGFjaygmdGhpcy0+ZmFpbF9kdWVfdG9fcGFzc3dvcmRfYXV0aGVudGljYXRpb25fZmFpbHVyZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2FjdGl2YXRpb25fc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2FjdGl2YXRpb25fYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9hY3RpdmF0aW9uICp0aGlzKQoreworICAgIHN3aXRjaCAodGhpcy0+a2V5X2V4Y2hhbmdlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRU5BQkxFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5wYXNzd29yZF9hdXRoZW50aWNhdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9DT05UUk9MX1NUQVRFX0VOQUJMRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+ZmFpbF9kdWVfdG9fcGFzc3dvcmRfYXV0aGVudGljYXRpb25fZmFpbHVyZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9DT05UUk9MX1NUQVRFX0VOQUJMRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGVfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlICp0aGlzKQoreworICAgIHRoaXMtPmxvc2kgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB0aGlzLT5sb2ZpID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgdGhpcy0+bG9hbWkgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB0aGlzLT5kZ2kgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB0aGlzLT50aXdpID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgdGhpcy0+ZG93aSA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIHRoaXMtPnN1ZmkgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB0aGlzLT5zZmkgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB0aGlzLT5zZGkgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB0aGlzLT5kZmkgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB0aGlzLT5sb2FpID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgdGhpcy0+bG9raSA9IEJDTU9MVF9TVEFUVVNfT0ZGOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGVfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5sb3NpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPmxvZmksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+bG9hbWksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+ZGdpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPnRpd2ksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+ZG93aSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5zdWZpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPnNmaSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5zZGksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+ZGZpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPmxvYWksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+bG9raSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5sb3NpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPmxvZmksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+bG9hbWksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+ZGdpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPnRpd2ksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+ZG93aSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5zdWZpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPnNmaSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5zZGksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+ZGZpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPmxvYWksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+bG9raSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGVfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZSAqdGhpcykKK3sKKyAgICBzd2l0Y2ggKHRoaXMtPmxvc2kpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5sb2ZpKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+bG9hbWkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5kZ2kpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT50aXdpKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+ZG93aSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnN1ZmkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5zZmkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5zZGkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5kZmkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5sb2FpKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+bG9raSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X2FsYXJtc19zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zICp0aGlzKQoreworICAgIHRoaXMtPmxvc2kgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB0aGlzLT5sb2ZpID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgdGhpcy0+bG9hbWkgPSBCQ01PTFRfU1RBVFVTX09GRjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2FsYXJtc19wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9hbGFybXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5sb3NpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPmxvZmksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+bG9hbWksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9hbGFybXNfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9hbGFybXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5sb3NpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPmxvZmksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+bG9hbWksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9hbGFybXNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2FsYXJtc19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X2FsYXJtcyAqdGhpcykKK3sKKyAgICBzd2l0Y2ggKHRoaXMtPmxvc2kpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5sb2ZpKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+bG9hbWkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX29udV9hbGFybXNfdGhyZXNob2xkc19zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgKnRoaXMpCit7CisgICAgdGhpcy0+bG9zaSA9IDQ7CisgICAgdGhpcy0+bG9maSA9IDQ7CisgICAgdGhpcy0+bG9hbWkgPSAzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHNfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5sb3NpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5sb2ZpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5sb2FtaSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9hbGFybXNfdGhyZXNob2xkc191bnBhY2soYmNtb2x0X2dwb25fb251X2FsYXJtc190aHJlc2hvbGRzICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bG9zaSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bG9maSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bG9hbWkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2FsYXJtc190aHJlc2hvbGRzX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPmxvc2kgPCAxKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5sb3NpID4gMTUpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmxvZmkgPCAxKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5sb2ZpID4gMTUpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmxvYW1pIDwgMSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+bG9hbWkgPiAxNSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X2VxZF9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfZXFkICp0aGlzKQoreworICAgIHRoaXMtPm9udV9pZCA9IChiY21vbHRfZ3Bvbl9vbnVfaWQpIDA7CisgICAgdGhpcy0+ZXFkID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2VxZF9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9lcWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5vbnVfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5lcWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfZXFkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfZXFkICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5vbnVfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5lcWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfZXFkX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9lcWRfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9lcWQgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPm9udV9pZCA+IChiY21vbHRfZ3Bvbl9vbnVfaWQpIDEyNykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X2VxZF9saXN0X3UzMl9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfZXFkX2xpc3RfdTMyICp0aGlzKQoreworICAgIHRoaXMtPmxlbiA9IDA7CisgICAgdGhpcy0+dmFsID0gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2VxZF9saXN0X3UzMl9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9lcWRfbGlzdF91MzIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+bGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbiA+IDApICYmICh0aGlzLT52YWwgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2dwb25fb251X2VxZF9saXN0X3UzMlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5sZW47IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX29udV9lcWRfcGFjaygmdGhpcy0+dmFsW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfZXFkX2xpc3RfdTMyX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9lcWRfbGlzdF91MzIgKnRoaXMpCit7CisgICAgcmV0dXJuIDQgKyAoNiAqIHRoaXMtPmxlbik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9lcWRfbGlzdF91MzJfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9lcWRfbGlzdF91MzIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MzJfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+bGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbiA+IDApICYmICh0aGlzLT52YWwgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZ3Bvbl9vbnVfZXFkX2xpc3RfdTMyXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnZhbCA9IChiY21vbHRfZ3Bvbl9vbnVfZXFkICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5sZW4gKiBzaXplb2YoYmNtb2x0X2dwb25fb251X2VxZCkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bGVuOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9vbnVfZXFkX3VucGFjaygmdGhpcy0+dmFsW2kwXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2VxZF9saXN0X3UzMl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MzJfdCBsZW47CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKHBhY2tlZCwgJmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfZXFkKSAqIGxlbik7CisgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCBsZW4gKiA2KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2VxZF9saXN0X3UzMl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X2VxZF9saXN0X3UzMiAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X2lkX2xpc3RfdTMyX21heF8yNTZfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X2lkX2xpc3RfdTMyX21heF8yNTYgKnRoaXMpCit7CisgICAgdGhpcy0+bGVuID0gMDsKKyAgICB0aGlzLT52YWwgPSBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfaWRfbGlzdF91MzJfbWF4XzI1Nl9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9pZF9saXN0X3UzMl9tYXhfMjU2ICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDMyX3QgaTA7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF9ncG9uX29udV9pZF9saXN0X3UzMl9tYXhfMjU2XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5sZW4gPiAyNTYpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bGVuOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+dmFsW2kwXSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X2lkX2xpc3RfdTMyX21heF8yNTZfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X2lkX2xpc3RfdTMyX21heF8yNTYgKnRoaXMpCit7CisgICAgcmV0dXJuIDQgKyAoMiAqIHRoaXMtPmxlbik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9pZF9saXN0X3UzMl9tYXhfMjU2X3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfaWRfbGlzdF91MzJfbWF4XzI1NiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQzMl90IGkwOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5sZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bGVuID4gMCkgJiYgKHRoaXMtPnZhbCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF9ncG9uX29udV9pZF9saXN0X3UzMl9tYXhfMjU2XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnZhbCA9IChiY21vbHRfZ3Bvbl9vbnVfaWQgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPmxlbiAqIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfaWQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0aGlzLT5sZW4gPiAyNTYpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bGVuOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT52YWxbaTBdKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9pZF9saXN0X3UzMl9tYXhfMjU2X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQzMl90IGxlbjsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIocGFja2VkLCAmbGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9pZCkgKiBsZW4pOworICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgbGVuICogMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9pZF9saXN0X3UzMl9tYXhfMjU2X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfaWRfbGlzdF91MzJfbWF4XzI1NiAqdGhpcykKK3sKKyAgICBpZiAodGhpcy0+bGVuID4gMjU2KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9wYXJhbXNfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zICp0aGlzKQoreworICAgIHRoaXMtPnJlc3BvbnNlX3RpbWVvdXRfbXMgPSAxMDAwOworICAgIHRoaXMtPm1heF9yZXRyeV9jb3VudCA9IDIzOworICAgIHRoaXMtPm9tY2lfZm9ybWF0ID0gQkNNT0xUX09NQ0lfREVWSUNFX0lEX0VYVEVOREVEOworICAgIHRoaXMtPndpbmRvd19zaXplID0gMzI7CisgICAgdGhpcy0+YWN0aXZhdGVfY29tbWl0ID0gQkNNT1NfRkFMU0U7CisgICAgdGhpcy0+ZGVsYXlfZm9yX2NvbW1pdF9tcyA9IDQwMDAwVUw7CisgICAgdGhpcy0+bWF4X2FjdGl2YXRpb25fYXR0ZW1wdHMgPSAyMzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnJlc3BvbnNlX3RpbWVvdXRfbXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPm1heF9yZXRyeV9jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfb21jaV9kZXZpY2VfaWRfcGFjayh0aGlzLT5vbWNpX2Zvcm1hdCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+d2luZG93X3NpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+YWN0aXZhdGVfY29tbWl0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+ZGVsYXlfZm9yX2NvbW1pdF9tcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bWF4X2FjdGl2YXRpb25fYXR0ZW1wdHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9wYXJhbXNfdW5wYWNrKGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtcyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5yZXNwb25zZV90aW1lb3V0X21zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5tYXhfcmV0cnlfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X29tY2lfZGV2aWNlX2lkX3VucGFjaygmdGhpcy0+b21jaV9mb3JtYXQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPndpbmRvd19zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmFjdGl2YXRlX2NvbW1pdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmRlbGF5X2Zvcl9jb21taXRfbXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPm1heF9hY3RpdmF0aW9uX2F0dGVtcHRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9wYXJhbXNfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtcyAqdGhpcykKK3sKKyAgICBpZiAodGhpcy0+cmVzcG9uc2VfdGltZW91dF9tcyA8IDUwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b21jaV9mb3JtYXQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9PTUNJX0RFVklDRV9JRF9CQVNFTElORToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9PTUNJX0RFVklDRV9JRF9FWFRFTkRFRDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT53aW5kb3dfc2l6ZSA8IDEpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPndpbmRvd19zaXplID4gMjU2KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzICp0aGlzKQoreworICAgIHRoaXMtPm9udV9pZCA9IChiY21vbHRfcG9uX29udV9pZCkgMDsKKyAgICB0aGlzLT5lcnJvcl9jb2RlID0gQkNNT0xUX0dQT05fT05VX1VQR1JBREVfUkVUVVJOX0NPREVfU1VDQ0VTUzsKKyAgICB0aGlzLT5mYWlsX3JlYXNvbiA9IEJDTU9MVF9PTUNJX1JFU1VMVF9DT0RFX05PX0VSUk9SOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5vbnVfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcmV0dXJuX2NvZGVfcGFjayh0aGlzLT5lcnJvcl9jb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X29tY2lfcmVzdWx0X2NvZGVfcGFjayh0aGlzLT5mYWlsX3JlYXNvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPm9udV9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9yZXR1cm5fY29kZV91bnBhY2soJnRoaXMtPmVycm9yX2NvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfb21jaV9yZXN1bHRfY29kZV91bnBhY2soJnRoaXMtPmZhaWxfcmVhc29uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXMgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPm9udV9pZCA+IChiY21vbHRfcG9uX29udV9pZCkgNTExKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+ZXJyb3JfY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1VQR1JBREVfUkVUVVJOX0NPREVfU1VDQ0VTUzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9VUEdSQURFX1JFVFVSTl9DT0RFX09OVV9SRVNQT05TRV9USU1FT1VUOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1VQR1JBREVfUkVUVVJOX0NPREVfT05VX0VSUk9SX1JFU1BPTlNFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1VQR1JBREVfUkVUVVJOX0NPREVfVENJX01JU01BVENIOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1VQR1JBREVfUkVUVVJOX0NPREVfR0VUX0lNQUdFX0ZBSUxFRDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9VUEdSQURFX1JFVFVSTl9DT0RFX0FDVElWQVRJT05fRkFJTEVEOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1VQR1JBREVfUkVUVVJOX0NPREVfSU5URVJOQUw6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmZhaWxfcmVhc29uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfT01DSV9SRVNVTFRfQ09ERV9OT19FUlJPUjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9PTUNJX1JFU1VMVF9DT0RFX1BST0NFU1NJTkdfRVJST1I6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfT01DSV9SRVNVTFRfQ09ERV9OT1RfU1VQUE9SVEVEOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX09NQ0lfUkVTVUxUX0NPREVfUEFSQU1FVEVSX0VSUk9SOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX09NQ0lfUkVTVUxUX0NPREVfVU5LTk9XTl9FTlRJVFk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfT01DSV9SRVNVTFRfQ09ERV9VTktOT1dOX0lOU1RBTkNFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX09NQ0lfUkVTVUxUX0NPREVfREVWSUNFX0JVU1k6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMiAqdGhpcykKK3sKKyAgICB0aGlzLT5sZW4gPSAwOworICAgIHRoaXMtPnZhbCA9IE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMl9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGkwOworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5sZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bGVuID4gMCkgJiYgKHRoaXMtPnZhbCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzJcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bGVuOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfcGFjaygmdGhpcy0+dmFsW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzJfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyICp0aGlzKQoreworICAgIHJldHVybiA0ICsgKDQgKiB0aGlzLT5sZW4pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzJfdW5wYWNrKGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQzMl90IGkwOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5sZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bGVuID4gMCkgJiYgKHRoaXMtPnZhbCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT52YWwgPSAoYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5sZW4gKiBzaXplb2YoYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5sZW47IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c191bnBhY2soJnRoaXMtPnZhbFtpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MzJfdCBsZW47CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKHBhY2tlZCwgJmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXMpICogbGVuKTsKKyAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIGxlbiAqIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzJfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMiAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGVfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGUgKnRoaXMpCit7CisgICAgdGhpcy0+b251X2lkID0gKGJjbW9sdF9ncG9uX29udV9pZCkgMDsKKyAgICB0aGlzLT5zdGF0ZSA9IEJDTU9MVF9PTlVfU1RBVEVfTk9UX0NPTkZJR1VSRUQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5vbnVfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X29udV9zdGF0ZV9wYWNrKHRoaXMtPnN0YXRlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV91bnBhY2soYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPm9udV9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfb251X3N0YXRlX3VucGFjaygmdGhpcy0+c3RhdGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZSAqdGhpcykKK3sKKyAgICBpZiAodGhpcy0+b251X2lkID4gKGJjbW9sdF9ncG9uX29udV9pZCkgMTI3KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+c3RhdGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfTk9UX0NPTkZJR1VSRUQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX0lOQUNUSVZFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9BQ1RJVkU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX0FDVElWRV9TVEFOREJZOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9ESVNBQkxFRDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfQVdBS0VfRlJFRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfUFJPQ0VTU0lORzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfTE9XX1BPV0VSX0RPWkU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX0xPV19QT1dFUl9TTEVFUDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfTE9XX1BPV0VSX1dBVENIOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9VTkFXQVJFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjhfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCAqdGhpcykKK3sKKyAgICB0aGlzLT5sZW4gPSAwOworICAgIHRoaXMtPnZhbCA9IE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjhfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4ICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgaTA7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjhcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmxlbiA+IDEyOCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5sZW47IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlX3BhY2soJnRoaXMtPnZhbFtpMF0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOF9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4ICp0aGlzKQoreworICAgIHJldHVybiAyICsgKDMgKiB0aGlzLT5sZW4pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4X3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgaTA7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT52YWwgPSAoYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGUgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPmxlbiAqIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHRoaXMtPmxlbiA+IDEyOCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5sZW47IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlX3VucGFjaygmdGhpcy0+dmFsW2kwXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MTZfdCBsZW47CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZSkgKiBsZW4pOworICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgbGVuICogMykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjhfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjggKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPmxlbiA+IDEyOCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb25fc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb24gKnRoaXMpCit7CisgICAgdGhpcy0+bG9jYXRpb24gPSAyMDsKKyAgICB0aGlzLT5sb2NhdGlvbl9zaWduID0gQkNNT0xUX1JTU0lfTE9DQVRJT05fU0lHTl9CRUZPUkU7CisgICAgdGhpcy0+c3RhcnRfcGF0dGVybiA9IDE1OworICAgIHRoaXMtPm1pZGRsZV9wYXR0ZXJuID0gMTU7CisgICAgdGhpcy0+bGFzdF9wYXR0ZXJuID0gMTU7CisgICAgdGhpcy0+bWlkZGxlX3JlcGVydGl0aW9uID0gNTA7CisgICAgdGhpcy0+bWluaW11bV9idXJzdCA9IDU1OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9yc3NpX2dlbmVyYWxfY29uZmlndXJhdGlvbl9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX3Jzc2lfZ2VuZXJhbF9jb25maWd1cmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bG9jYXRpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3Jzc2lfbG9jYXRpb25fc2lnbl9wYWNrKHRoaXMtPmxvY2F0aW9uX3NpZ24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+c3RhcnRfcGF0dGVybikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bWlkZGxlX3BhdHRlcm4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmxhc3RfcGF0dGVybikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bWlkZGxlX3JlcGVydGl0aW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bWluaW11bV9idXJzdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX3Jzc2lfZ2VuZXJhbF9jb25maWd1cmF0aW9uX3VucGFjayhiY21vbHRfZ3Bvbl9yc3NpX2dlbmVyYWxfY29uZmlndXJhdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmxvY2F0aW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9yc3NpX2xvY2F0aW9uX3NpZ25fdW5wYWNrKCZ0aGlzLT5sb2NhdGlvbl9zaWduLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnN0YXJ0X3BhdHRlcm4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPm1pZGRsZV9wYXR0ZXJuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5sYXN0X3BhdHRlcm4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPm1pZGRsZV9yZXBlcnRpdGlvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPm1pbmltdW1fYnVyc3QpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9yc3NpX2dlbmVyYWxfY29uZmlndXJhdGlvbl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9yc3NpX2dlbmVyYWxfY29uZmlndXJhdGlvbl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb24gKnRoaXMpCit7CisgICAgc3dpdGNoICh0aGlzLT5sb2NhdGlvbl9zaWduKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfUlNTSV9MT0NBVElPTl9TSUdOX0JFRk9SRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9SU1NJX0xPQ0FUSU9OX1NJR05fQUZURVI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb25fc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb24gKnRoaXMpCit7CisgICAgdGhpcy0+aW50ZXJ2YWwgPSAxMDAwOworICAgIHRoaXMtPmNvbnRyb2wgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOworICAgIHRoaXMtPm9udV9wb3N0X2Rpc2NvdmVyeV9tb2RlID0gQkNNT0xUX09OVV9QT1NUX0RJU0NPVkVSWV9NT0RFX0RJU0FCTEU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX3NuX2FjcXVpc2l0aW9uX3BhY2soY29uc3QgYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+aW50ZXJ2YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfcGFjayh0aGlzLT5jb250cm9sLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X29udV9wb3N0X2Rpc2NvdmVyeV9tb2RlX3BhY2sodGhpcy0+b251X3Bvc3RfZGlzY292ZXJ5X21vZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX3NuX2FjcXVpc2l0aW9uX3VucGFjayhiY21vbHRfZ3Bvbl9zbl9hY3F1aXNpdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5pbnRlcnZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfY29udHJvbF9zdGF0ZV91bnBhY2soJnRoaXMtPmNvbnRyb2wsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfb251X3Bvc3RfZGlzY292ZXJ5X21vZGVfdW5wYWNrKCZ0aGlzLT5vbnVfcG9zdF9kaXNjb3ZlcnlfbW9kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb25fc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCA2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb25fYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX3NuX2FjcXVpc2l0aW9uICp0aGlzKQoreworICAgIGlmICh0aGlzLT5pbnRlcnZhbCA8IDEwMDApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmludGVydmFsID4gMjE0NzQ4M1VMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+Y29udHJvbCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9DT05UUk9MX1NUQVRFX0VOQUJMRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b251X3Bvc3RfZGlzY292ZXJ5X21vZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9PTlVfUE9TVF9ESVNDT1ZFUllfTU9ERV9OT05FOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX09OVV9QT1NUX0RJU0NPVkVSWV9NT0RFX0FDVElWQVRFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX09OVV9QT1NUX0RJU0NPVkVSWV9NT0RFX0RJU0FCTEU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2hvc3Rfc3dfdmVyc2lvbl9zZXRfZGVmYXVsdChiY21vbHRfaG9zdF9zd192ZXJzaW9uICp0aGlzKQoreworICAgIHRoaXMtPm1ham9yID0gMDsKKyAgICB0aGlzLT5taW5vciA9IDA7CisgICAgdGhpcy0+cmV2aXNpb24gPSAwOworICAgIHRoaXMtPm1vZGVsID0gMDsKKyAgICBtZW1zZXQodGhpcy0+YnVpbGRfdGltZSwgMCwgMzIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfaG9zdF9zd192ZXJzaW9uX3BhY2soY29uc3QgYmNtb2x0X2hvc3Rfc3dfdmVyc2lvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPm1ham9yKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5taW5vcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cmV2aXNpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5tb2RlbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+YnVpbGRfdGltZSwgMzIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfaG9zdF9zd192ZXJzaW9uX3VucGFjayhiY21vbHRfaG9zdF9zd192ZXJzaW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bWFqb3IpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPm1pbm9yKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5yZXZpc2lvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPm1vZGVsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZChidWYsIHRoaXMtPmJ1aWxkX3RpbWUsIDMyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2hvc3Rfc3dfdmVyc2lvbl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDM5KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2hvc3Rfc3dfdmVyc2lvbl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2hvc3Rfc3dfdmVyc2lvbiAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2h3X3Bvbl9pZF9zZXRfZGVmYXVsdChiY21vbHRfaHdfcG9uX2lkICp0aGlzKQoreworICAgIHRoaXMtPnBvbl9pZF8xID0gMDsKKyAgICB0aGlzLT5wb25faWRfMiA9IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9od19wb25faWRfcGFjayhjb25zdCBiY21vbHRfaHdfcG9uX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnBvbl9pZF8xKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+cG9uX2lkXzIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfaHdfcG9uX2lkX3VucGFjayhiY21vbHRfaHdfcG9uX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnBvbl9pZF8xKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+cG9uX2lkXzIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfaHdfcG9uX2lkX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9od19wb25faWRfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9od19wb25faWQgKnRoaXMpCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9pZWVlXzgwMjFhc19wb3J0X2lkZW50aXR5X3NldF9kZWZhdWx0KGJjbW9sdF9pZWVlXzgwMjFhc19wb3J0X2lkZW50aXR5ICp0aGlzKQoreworICAgIG1lbXNldCh0aGlzLT5jbG9ja19pZGVudGl0eSwgMCwgc2l6ZW9mKHRoaXMtPmNsb2NrX2lkZW50aXR5KSk7CisgICAgdGhpcy0+cG9ydF9udW1iZXIgPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfaWVlZV84MDIxYXNfcG9ydF9pZGVudGl0eV9wYWNrKGNvbnN0IGJjbW9sdF9pZWVlXzgwMjFhc19wb3J0X2lkZW50aXR5ICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+Y2xvY2tfaWRlbnRpdHksIDgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5wb3J0X251bWJlcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9pZWVlXzgwMjFhc19wb3J0X2lkZW50aXR5X3VucGFjayhiY21vbHRfaWVlZV84MDIxYXNfcG9ydF9pZGVudGl0eSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+Y2xvY2tfaWRlbnRpdHksIDgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5wb3J0X251bWJlcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9pZWVlXzgwMjFhc19wb3J0X2lkZW50aXR5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfaWVlZV84MDIxYXNfcG9ydF9pZGVudGl0eV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2llZWVfODAyMWFzX3BvcnRfaWRlbnRpdHkgKnRoaXMpCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9pZWVlXzgwMjFhc190aW1lc3RhbXBfc2V0X2RlZmF1bHQoYmNtb2x0X2llZWVfODAyMWFzX3RpbWVzdGFtcCAqdGhpcykKK3sKKyAgICB0aGlzLT5zZWNvbmRzX2hpZ2ggPSAwOworICAgIHRoaXMtPnNlY29uZHNfbG93ID0gMDsKKyAgICB0aGlzLT5uYW5vc2Vjb25kcyA9IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9pZWVlXzgwMjFhc190aW1lc3RhbXBfcGFjayhjb25zdCBiY21vbHRfaWVlZV84MDIxYXNfdGltZXN0YW1wICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnNlY29uZHNfaGlnaCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnNlY29uZHNfbG93KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+bmFub3NlY29uZHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfaWVlZV84MDIxYXNfdGltZXN0YW1wX3VucGFjayhiY21vbHRfaWVlZV84MDIxYXNfdGltZXN0YW1wICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnNlY29uZHNfaGlnaCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnNlY29uZHNfbG93KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+bmFub3NlY29uZHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfaWVlZV84MDIxYXNfdGltZXN0YW1wX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfaWVlZV84MDIxYXNfdGltZXN0YW1wX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfaWVlZV84MDIxYXNfdGltZXN0YW1wICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfaWVlZV84MDIxYXNfdGltZV9zeW5jX3NldF9kZWZhdWx0KGJjbW9sdF9pZWVlXzgwMjFhc190aW1lX3N5bmMgKnRoaXMpCit7CisgICAgYmNtb3NfbWFjX2FkZHJlc3NfaW5pdCgmdGhpcy0+ZGVzdGluYXRpb25fbWFjKTsKKyAgICBiY21vc19tYWNfYWRkcmVzc19pbml0KCZ0aGlzLT5zb3VyY2VfbWFjKTsKKyAgICB0aGlzLT5ldGhfdHlwZV9sZW4gPSAwOworICAgIHRoaXMtPmV0aF9zdWJ0eXBlID0gMDsKKyAgICBtZW1zZXQodGhpcy0+aWVlZV9vdWksIDAsIHNpemVvZih0aGlzLT5pZWVlX291aSkpOworICAgIHRoaXMtPm1zZ19pZCA9IDA7CisgICAgdGhpcy0+eCA9IDA7CisgICAgdGhpcy0+dG9kLnNlY29uZHNfaGlnaCA9IDA7CisgICAgdGhpcy0+dG9kLnNlY29uZHNfbG93ID0gMDsKKyAgICB0aGlzLT50b2QubmFub3NlY29uZHMgPSAwOworICAgIG1lbXNldCh0aGlzLT5wb3J0X2lkZW50aXR5LmNsb2NrX2lkZW50aXR5LCAwLCBzaXplb2YodGhpcy0+cG9ydF9pZGVudGl0eS5jbG9ja19pZGVudGl0eSkpOworICAgIHRoaXMtPnBvcnRfaWRlbnRpdHkucG9ydF9udW1iZXIgPSAwOworICAgIHRoaXMtPmxvZ19tc2dfaW50ZXJ2YWwgPSAwOworICAgIHRoaXMtPnJhdGVfcmF0aW8gPSAwOworICAgIHRoaXMtPmdtX3RpbWVfYmFzZV9pbmRpY2F0b3IgPSAwOworICAgIG1lbXNldCh0aGlzLT5sYXN0X2dtX3BoYXNlX2NoYW5nZSwgMCwgc2l6ZW9mKHRoaXMtPmxhc3RfZ21fcGhhc2VfY2hhbmdlKSk7CisgICAgdGhpcy0+bGFzdF9mcmVxdWVuY3lfY2hhbmdlID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2llZWVfODAyMWFzX3RpbWVfc3luY19wYWNrKGNvbnN0IGJjbW9sdF9pZWVlXzgwMjFhc190aW1lX3N5bmMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT5kZXN0aW5hdGlvbl9tYWMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPnNvdXJjZV9tYWMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5ldGhfdHlwZV9sZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmV0aF9zdWJ0eXBlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGUoYnVmLCB0aGlzLT5pZWVlX291aSwgMykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPm1zZ19pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPngpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2llZWVfODAyMWFzX3RpbWVzdGFtcF9wYWNrKCZ0aGlzLT50b2QsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfaWVlZV84MDIxYXNfcG9ydF9pZGVudGl0eV9wYWNrKCZ0aGlzLT5wb3J0X2lkZW50aXR5LCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9zOChidWYsIHRoaXMtPmxvZ19tc2dfaW50ZXJ2YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9kb3VibGUoYnVmLCB0aGlzLT5yYXRlX3JhdGlvKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+Z21fdGltZV9iYXNlX2luZGljYXRvcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+bGFzdF9nbV9waGFzZV9jaGFuZ2UsIDEyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfczMyKGJ1ZiwgdGhpcy0+bGFzdF9mcmVxdWVuY3lfY2hhbmdlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2llZWVfODAyMWFzX3RpbWVfc3luY191bnBhY2soYmNtb2x0X2llZWVfODAyMWFzX3RpbWVfc3luYyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX21hY19hZGRyZXNzKGJ1ZiwgJnRoaXMtPmRlc3RpbmF0aW9uX21hYykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+c291cmNlX21hYykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmV0aF90eXBlX2xlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+ZXRoX3N1YnR5cGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+aWVlZV9vdWksIDMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5tc2dfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT54KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9pZWVlXzgwMjFhc190aW1lc3RhbXBfdW5wYWNrKCZ0aGlzLT50b2QsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9pZWVlXzgwMjFhc19wb3J0X2lkZW50aXR5X3VucGFjaygmdGhpcy0+cG9ydF9pZGVudGl0eSwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3M4KGJ1ZiwgJnRoaXMtPmxvZ19tc2dfaW50ZXJ2YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2RvdWJsZShidWYsICZ0aGlzLT5yYXRlX3JhdGlvKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+Z21fdGltZV9iYXNlX2luZGljYXRvcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWQoYnVmLCB0aGlzLT5sYXN0X2dtX3BoYXNlX2NoYW5nZSwgMTIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3MzMihidWYsICZ0aGlzLT5sYXN0X2ZyZXF1ZW5jeV9jaGFuZ2UpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfaWVlZV84MDIxYXNfdGltZV9zeW5jX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNzEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfaWVlZV84MDIxYXNfdGltZV9zeW5jX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfaWVlZV84MDIxYXNfdGltZV9zeW5jICp0aGlzKQoreworICAgIGlmICghYmNtb2x0X2llZWVfODAyMWFzX3RpbWVzdGFtcF9ib3VuZHNfY2hlY2soJnRoaXMtPnRvZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfaWVlZV84MDIxYXNfcG9ydF9pZGVudGl0eV9ib3VuZHNfY2hlY2soJnRoaXMtPnBvcnRfaWRlbnRpdHkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfaW5kaWNhdGlvbl9zaGFwaW5nX3NldF9kZWZhdWx0KGJjbW9sdF9pbmRpY2F0aW9uX3NoYXBpbmcgKnRoaXMpCit7CisgICAgdGhpcy0+ZW5hYmxlZCA9IEJDTU9TX0ZBTFNFOworICAgIHRoaXMtPm1heF9yYXRlID0gMTAwMDsKKyAgICB0aGlzLT5tYXhfYnVyc3QgPSAxMDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9pbmRpY2F0aW9uX3NoYXBpbmdfcGFjayhjb25zdCBiY21vbHRfaW5kaWNhdGlvbl9zaGFwaW5nICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5lbmFibGVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+bWF4X3JhdGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5tYXhfYnVyc3QpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfaW5kaWNhdGlvbl9zaGFwaW5nX3VucGFjayhiY21vbHRfaW5kaWNhdGlvbl9zaGFwaW5nICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5lbmFibGVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+bWF4X3JhdGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5tYXhfYnVyc3QpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfaW5kaWNhdGlvbl9zaGFwaW5nX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9pbmRpY2F0aW9uX3NoYXBpbmdfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9pbmRpY2F0aW9uX3NoYXBpbmcgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPm1heF9yYXRlIDwgMSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+bWF4X3JhdGUgPiAxMDAwMCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+bWF4X2J1cnN0IDwgMSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+bWF4X2J1cnN0ID4gMTAwMDApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9sYV9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uX3NldF9kZWZhdWx0KGJjbW9sdF9sYV9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uICp0aGlzKQoreworICAgIHRoaXMtPnJlc3luY19jb250cm9sLnN0YXJ0X3BhdHRlcm4gPSAxNTsKKyAgICB0aGlzLT5yZXN5bmNfY29udHJvbC5taWRkbGVfcGF0dGVybiA9IDE1OworICAgIHRoaXMtPnJlc3luY19jb250cm9sLmxhc3RfcGF0dGVybiA9IDE1OworICAgIHRoaXMtPnJlc3luY19jb250cm9sLm1pZGRsZV9yZXBldGl0aW9uID0gMDsKKyAgICB0aGlzLT5yZXN5bmNfY29udHJvbC5sb2NhdGlvbiA9IDQwOworICAgIHRoaXMtPnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wuc3RhcnRfcGF0dGVybiA9IDE1OworICAgIHRoaXMtPnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubWlkZGxlX3BhdHRlcm4gPSAxNTsKKyAgICB0aGlzLT5yYW5naW5nX3Jlc3luY19jb250cm9sLmxhc3RfcGF0dGVybiA9IDE1OworICAgIHRoaXMtPnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubWlkZGxlX3JlcGV0aXRpb24gPSAwOworICAgIHRoaXMtPnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubG9jYXRpb24gPSAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbGFfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbl9wYWNrKGNvbnN0IGJjbW9sdF9sYV9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfcmVzeW5jX2NvbnRyb2xfcGFjaygmdGhpcy0+cmVzeW5jX2NvbnRyb2wsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfcmVzeW5jX2NvbnRyb2xfcGFjaygmdGhpcy0+cmFuZ2luZ19yZXN5bmNfY29udHJvbCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xhX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb25fdW5wYWNrKGJjbW9sdF9sYV9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfcmVzeW5jX2NvbnRyb2xfdW5wYWNrKCZ0aGlzLT5yZXN5bmNfY29udHJvbCwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3Jlc3luY19jb250cm9sX3VucGFjaygmdGhpcy0+cmFuZ2luZ19yZXN5bmNfY29udHJvbCwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbGFfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xhX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb25fYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9sYV9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uICp0aGlzKQoreworICAgIGlmICghYmNtb2x0X3Jlc3luY19jb250cm9sX2JvdW5kc19jaGVjaygmdGhpcy0+cmVzeW5jX2NvbnRyb2wpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3Jlc3luY19jb250cm9sX2JvdW5kc19jaGVjaygmdGhpcy0+cmFuZ2luZ19yZXN5bmNfY29udHJvbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9sb2dfYnVmZmVyX3NldF9kZWZhdWx0KGJjbW9sdF9sb2dfYnVmZmVyICp0aGlzKQoreworICAgIG1lbXNldCh0aGlzLT5idWZmLCAwLCAyMDQ4KTsKKyAgICB0aGlzLT5tc2dfdG9fcmVhZCA9IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dfYnVmZmVyX3BhY2soY29uc3QgYmNtb2x0X2xvZ19idWZmZXIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGUoYnVmLCB0aGlzLT5idWZmLCAyMDQ4KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+bXNnX3RvX3JlYWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2J1ZmZlcl91bnBhY2soYmNtb2x0X2xvZ19idWZmZXIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZChidWYsIHRoaXMtPmJ1ZmYsIDIwNDgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5tc2dfdG9fcmVhZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dfYnVmZmVyX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMjA1Mik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dfYnVmZmVyX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfbG9nX2J1ZmZlciAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X21hY190YWJsZV9jb25maWd1cmF0aW9uX3NldF9kZWZhdWx0KGJjbW9sdF9tYWNfdGFibGVfY29uZmlndXJhdGlvbiAqdGhpcykKK3sKKyAgICB0aGlzLT5taXNzX2ZhbGxiYWNrID0gQkNNT0xUX01BQ19UQUJMRV9NSVNTX0ZBTExCQUNLX0RST1A7CisgICAgdGhpcy0+ZGVmYXVsdF9mbG93X2lkID0gKGJjbW9sdF9mbG93X2lkKSAwOworICAgIHRoaXMtPmFnaW5nX3RpbWUgPSAzMDsKKyAgICB0aGlzLT5sZWFybmluZ19tb2RlID0gQkNNT0xUX01BQ19UQUJMRV9MRUFSTklOR19NT0RFX05PUk1BTDsKKyAgICB0aGlzLT5hdXRvbWF0aWNfbWFjX2xlYXJuaW5nID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRTsKKyAgICB0aGlzLT5hdXRvbWF0aWNfbWFjX2FnaW5nID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRTsKKyAgICB0aGlzLT5hdXRvbWF0aWNfbWFjX21vdmUgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOworICAgIHRoaXMtPmF1dG9tYXRpY19zdGF0aWNfbW9kZSA9IEJDTU9TX0ZBTFNFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb25fcGFjayhjb25zdCBiY21vbHRfbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9tYWNfdGFibGVfbWlzc19mYWxsYmFja19wYWNrKHRoaXMtPm1pc3NfZmFsbGJhY2ssIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+ZGVmYXVsdF9mbG93X2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+YWdpbmdfdGltZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfbWFjX3RhYmxlX2xlYXJuaW5nX21vZGVfcGFjayh0aGlzLT5sZWFybmluZ19tb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfcGFjayh0aGlzLT5hdXRvbWF0aWNfbWFjX2xlYXJuaW5nLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfcGFjayh0aGlzLT5hdXRvbWF0aWNfbWFjX2FnaW5nLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfcGFjayh0aGlzLT5hdXRvbWF0aWNfbWFjX21vdmUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5hdXRvbWF0aWNfc3RhdGljX21vZGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb25fdW5wYWNrKGJjbW9sdF9tYWNfdGFibGVfY29uZmlndXJhdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X21hY190YWJsZV9taXNzX2ZhbGxiYWNrX3VucGFjaygmdGhpcy0+bWlzc19mYWxsYmFjaywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPmRlZmF1bHRfZmxvd19pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmFnaW5nX3RpbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X21hY190YWJsZV9sZWFybmluZ19tb2RlX3VucGFjaygmdGhpcy0+bGVhcm5pbmdfbW9kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9jb250cm9sX3N0YXRlX3VucGFjaygmdGhpcy0+YXV0b21hdGljX21hY19sZWFybmluZywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9jb250cm9sX3N0YXRlX3VucGFjaygmdGhpcy0+YXV0b21hdGljX21hY19hZ2luZywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9jb250cm9sX3N0YXRlX3VucGFjaygmdGhpcy0+YXV0b21hdGljX21hY19tb3ZlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+YXV0b21hdGljX3N0YXRpY19tb2RlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X21hY190YWJsZV9jb25maWd1cmF0aW9uX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb25fYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9tYWNfdGFibGVfY29uZmlndXJhdGlvbiAqdGhpcykKK3sKKyAgICBzd2l0Y2ggKHRoaXMtPm1pc3NfZmFsbGJhY2spCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9NQUNfVEFCTEVfTUlTU19GQUxMQkFDS19EUk9QOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX01BQ19UQUJMRV9NSVNTX0ZBTExCQUNLX0RFRkFVTFRfRkxPVzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9NQUNfVEFCTEVfTUlTU19GQUxMQkFDS19WSUQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+ZGVmYXVsdF9mbG93X2lkID4gKGJjbW9sdF9mbG93X2lkKSA0MDk1KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5hZ2luZ190aW1lIDwgMzApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmFnaW5nX3RpbWUgPiA4NjQwMFVMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+bGVhcm5pbmdfbW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX01BQ19UQUJMRV9MRUFSTklOR19NT0RFX05PUk1BTDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9NQUNfVEFCTEVfTEVBUk5JTkdfTU9ERV9NT1ZFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5hdXRvbWF0aWNfbWFjX2xlYXJuaW5nKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRU5BQkxFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5hdXRvbWF0aWNfbWFjX2FnaW5nKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRU5BQkxFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5hdXRvbWF0aWNfbWFjX21vdmUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQ09OVFJPTF9TVEFURV9FTkFCTEU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfc2V0X2RlZmF1bHQoYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzIgKnRoaXMpCit7CisgICAgdGhpcy0+bGVuID0gMDsKKyAgICB0aGlzLT52YWwgPSBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9wYWNrKGNvbnN0IGJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDMyX3QgaTA7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmxlbjsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPnZhbFtpMF0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyICp0aGlzKQoreworICAgIHJldHVybiA0ICsgKDYgKiB0aGlzLT5sZW4pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl91bnBhY2soYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MzJfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+bGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbiA+IDApICYmICh0aGlzLT52YWwgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT52YWwgPSAoYmNtb3NfbWFjX2FkZHJlc3MgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPmxlbiAqIHNpemVvZihiY21vc19tYWNfYWRkcmVzcykpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bGVuOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+dmFsW2kwXSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MzJfdCBsZW47CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKHBhY2tlZCwgJmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vc19tYWNfYWRkcmVzcykgKiBsZW4pOworICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgbGVuICogNikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMiAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfbWF4XzIwNDhfc2V0X2RlZmF1bHQoYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfbWF4XzIwNDggKnRoaXMpCit7CisgICAgdGhpcy0+bGVuID0gMDsKKyAgICB0aGlzLT52YWwgPSBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9tYXhfMjA0OF9wYWNrKGNvbnN0IGJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyX21heF8yMDQ4ICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDMyX3QgaTA7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyX21heF8yMDQ4XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5sZW4gPiAyMDQ4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmxlbjsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPnZhbFtpMF0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyX21heF8yMDQ4X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyX21heF8yMDQ4ICp0aGlzKQoreworICAgIHJldHVybiA0ICsgKDYgKiB0aGlzLT5sZW4pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9tYXhfMjA0OF91bnBhY2soYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfbWF4XzIwNDggKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MzJfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+bGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbiA+IDApICYmICh0aGlzLT52YWwgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9tYXhfMjA0OFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT52YWwgPSAoYmNtb3NfbWFjX2FkZHJlc3MgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPmxlbiAqIHNpemVvZihiY21vc19tYWNfYWRkcmVzcykpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHRoaXMtPmxlbiA+IDIwNDgpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bGVuOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+dmFsW2kwXSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9tYXhfMjA0OF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MzJfdCBsZW47CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKHBhY2tlZCwgJmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vc19tYWNfYWRkcmVzcykgKiBsZW4pOworICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgbGVuICogNikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyX21heF8yMDQ4X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9tYXhfMjA0OCAqdGhpcykKK3sKKyAgICBpZiAodGhpcy0+bGVuID4gMjA0OCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X25uaV9saW5rX3N0YXR1c19zZXRfZGVmYXVsdChiY21vbHRfbm5pX2xpbmtfc3RhdHVzICp0aGlzKQoreworICAgIHRoaXMtPmxpbmtfc3RhdHVzID0gQkNNT0xUX1RSSVZBTEVOVF9GQUxTRTsKKyAgICB0aGlzLT5zaWduYWxfZGV0ZWN0ZWQgPSBCQ01PTFRfVFJJVkFMRU5UX0ZBTFNFOworICAgIHRoaXMtPnBtZF9sb2NrZWQgPSBCQ01PTFRfVFJJVkFMRU5UX0ZBTFNFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX2xpbmtfc3RhdHVzX3BhY2soY29uc3QgYmNtb2x0X25uaV9saW5rX3N0YXR1cyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X3RyaXZhbGVudF9wYWNrKHRoaXMtPmxpbmtfc3RhdHVzLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3RyaXZhbGVudF9wYWNrKHRoaXMtPnNpZ25hbF9kZXRlY3RlZCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF90cml2YWxlbnRfcGFjayh0aGlzLT5wbWRfbG9ja2VkLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX2xpbmtfc3RhdHVzX3VucGFjayhiY21vbHRfbm5pX2xpbmtfc3RhdHVzICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfdHJpdmFsZW50X3VucGFjaygmdGhpcy0+bGlua19zdGF0dXMsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfdHJpdmFsZW50X3VucGFjaygmdGhpcy0+c2lnbmFsX2RldGVjdGVkLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3RyaXZhbGVudF91bnBhY2soJnRoaXMtPnBtZF9sb2NrZWQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ubmlfbGlua19zdGF0dXNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9saW5rX3N0YXR1c19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X25uaV9saW5rX3N0YXR1cyAqdGhpcykKK3sKKyAgICBzd2l0Y2ggKHRoaXMtPmxpbmtfc3RhdHVzKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfVFJJVkFMRU5UX0ZBTFNFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1RSSVZBTEVOVF9UUlVFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1RSSVZBTEVOVF9OT1RfQVBQTElDQUJMRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+c2lnbmFsX2RldGVjdGVkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfVFJJVkFMRU5UX0ZBTFNFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1RSSVZBTEVOVF9UUlVFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1RSSVZBTEVOVF9OT1RfQVBQTElDQUJMRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+cG1kX2xvY2tlZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1RSSVZBTEVOVF9GQUxTRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9UUklWQUxFTlRfVFJVRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9UUklWQUxFTlRfTk9UX0FQUExJQ0FCTEU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X29hbV9oZWFydGJlYXRfY29uZmlnX3NldF9kZWZhdWx0KGJjbW9sdF9vYW1faGVhcnRiZWF0X2NvbmZpZyAqdGhpcykKK3sKKyAgICB0aGlzLT5zZW5kX3BlcmlvZCA9IDA7CisgICAgdGhpcy0+dHJhbnNtaXRfZnJhbWUubGVuID0gMDsKKyAgICB0aGlzLT50cmFuc21pdF9mcmFtZS52YWwgPSBOVUxMOworICAgIHRoaXMtPmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS5mcmFtZV9vY3RldHMubGVuID0gMDsKKyAgICB0aGlzLT5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUuZnJhbWVfb2N0ZXRzLnZhbCA9IE5VTEw7CisgICAgdGhpcy0+aWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlLm1hc2tfb2N0ZXRzLmxlbiA9IDA7CisgICAgdGhpcy0+aWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlLm1hc2tfb2N0ZXRzLnZhbCA9IE5VTEw7CisgICAgdGhpcy0+cmVjZWl2ZV90aW1lb3V0ID0gMTsKKyAgICB0aGlzLT5tYXhpbXVtX3JlY2VpdmVfc2l6ZSA9IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9vYW1faGVhcnRiZWF0X2NvbmZpZ19wYWNrKGNvbnN0IGJjbW9sdF9vYW1faGVhcnRiZWF0X2NvbmZpZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5zZW5kX3BlcmlvZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MTZfcGFjaygmdGhpcy0+dHJhbnNtaXRfZnJhbWUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXRoZXJuZXRfZnJhbWVfbWFza2VkX3BhY2soJnRoaXMtPmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+cmVjZWl2ZV90aW1lb3V0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bWF4aW11bV9yZWNlaXZlX3NpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X29hbV9oZWFydGJlYXRfY29uZmlnX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9vYW1faGVhcnRiZWF0X2NvbmZpZyAqdGhpcykKK3sKKyAgICByZXR1cm4gNiArIGJjbW9sdF91OF9saXN0X3UxNl9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dHJhbnNtaXRfZnJhbWUpICsgYmNtb2x0X2V0aGVybmV0X2ZyYW1lX21hc2tlZF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+aWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29hbV9oZWFydGJlYXRfY29uZmlnX3VucGFjayhiY21vbHRfb2FtX2hlYXJ0YmVhdF9jb25maWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+c2VuZF9wZXJpb2QpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTE2X3VucGFjaygmdGhpcy0+dHJhbnNtaXRfZnJhbWUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9ldGhlcm5ldF9mcmFtZV9tYXNrZWRfdW5wYWNrKCZ0aGlzLT5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+cmVjZWl2ZV90aW1lb3V0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bWF4aW11bV9yZWNlaXZlX3NpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfb2FtX2hlYXJ0YmVhdF9jb25maWdfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF91OF9saXN0X3UxNl9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9ldGhlcm5ldF9mcmFtZV9tYXNrZWRfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfb2FtX2hlYXJ0YmVhdF9jb25maWdfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9vYW1faGVhcnRiZWF0X2NvbmZpZyAqdGhpcykKK3sKKyAgICBpZiAoIWJjbW9sdF91OF9saXN0X3UxNl9ib3VuZHNfY2hlY2soJnRoaXMtPnRyYW5zbWl0X2ZyYW1lKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9ldGhlcm5ldF9mcmFtZV9tYXNrZWRfYm91bmRzX2NoZWNrKCZ0aGlzLT5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5yZWNlaXZlX3RpbWVvdXQgPCAxKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbl9zZXRfZGVmYXVsdChiY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbiAqdGhpcykKK3sKKyAgICB0aGlzLT5pbG93cG93ZXIgPSAxNjAwOworICAgIHRoaXMtPmlhd2FyZSA9IDE2MDsKKyAgICB0aGlzLT5pdHJhbnNpbml0ID0gODA7CisgICAgdGhpcy0+aXR4aW5pdCA9IDQwOworICAgIHRoaXMtPmlyeG9mZiA9IDE2MDA7CisgICAgdGhpcy0+bG93X3Bvd2VyX2Nsb2JpID0gODsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29udV9wb3dlcl9tYW5hZ2VtZW50X2NvbmZpZ3VyYXRpb25fcGFjayhjb25zdCBiY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5pbG93cG93ZXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5pYXdhcmUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5pdHJhbnNpbml0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+aXR4aW5pdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmlyeG9mZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmxvd19wb3dlcl9jbG9iaSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uX3VucGFjayhiY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5pbG93cG93ZXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5pYXdhcmUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5pdHJhbnNpbml0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+aXR4aW5pdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmlyeG9mZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmxvd19wb3dlcl9jbG9iaSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X29udV9wb3dlcl9tYW5hZ2VtZW50X2NvbmZpZ3VyYXRpb24gKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPmlsb3dwb3dlciA8IDgpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmlsb3dwb3dlciA+IDQ4MDAwMFVMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5pYXdhcmUgPCA4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5pYXdhcmUgPiA0ODAwMDBVTCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+aXRyYW5zaW5pdCA+IDgwMDApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPml0eGluaXQgPiA4MDAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5pcnhvZmYgPCA4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5pcnhvZmYgPiA0ODAwMDBVTCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+bG93X3Bvd2VyX2Nsb2JpIDwgMSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+bG93X3Bvd2VyX2Nsb2JpID4gMTAyMykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X29udV90dW5pbmdfY29uZmlndXJhdGlvbl9zZXRfZGVmYXVsdChiY21vbHRfb251X3R1bmluZ19jb25maWd1cmF0aW9uICp0aGlzKQoreworICAgIHRoaXMtPnRzb3VyY2UgPSAxMDAwOworICAgIHRoaXMtPnR0YXJnZXQgPSAxMDAwOworICAgIHRoaXMtPnJlcXVlc3RfcmVnaXN0cmF0aW9uX3JlcXVpcmVkID0gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29udV90dW5pbmdfY29uZmlndXJhdGlvbl9wYWNrKGNvbnN0IGJjbW9sdF9vbnVfdHVuaW5nX2NvbmZpZ3VyYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dHNvdXJjZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnR0YXJnZXQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+cmVxdWVzdF9yZWdpc3RyYXRpb25fcmVxdWlyZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfb251X3R1bmluZ19jb25maWd1cmF0aW9uX3VucGFjayhiY21vbHRfb251X3R1bmluZ19jb25maWd1cmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnRzb3VyY2UpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT50dGFyZ2V0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnJlcXVlc3RfcmVnaXN0cmF0aW9uX3JlcXVpcmVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29udV90dW5pbmdfY29uZmlndXJhdGlvbl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfb251X3R1bmluZ19jb25maWd1cmF0aW9uX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfb251X3R1bmluZ19jb25maWd1cmF0aW9uICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfcG9uX2lkX3NldF9kZWZhdWx0KGJjbW9sdF9wb25faWQgKnRoaXMpCit7CisgICAgdGhpcy0+YWRtaW5pc3RyYXRpdmVfbGFiZWwgPSAwOworICAgIHRoaXMtPmR3bGNoX2lkID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9pZF9wYWNrKGNvbnN0IGJjbW9sdF9wb25faWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+YWRtaW5pc3RyYXRpdmVfbGFiZWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmR3bGNoX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9pZF91bnBhY2soYmNtb2x0X3Bvbl9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5hZG1pbmlzdHJhdGl2ZV9sYWJlbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+ZHdsY2hfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX2lkX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wb25faWRfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9wb25faWQgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPmFkbWluaXN0cmF0aXZlX2xhYmVsID4gNDI5NDk2NzI4MFVMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5kd2xjaF9pZCA+IDcpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9vcGVyYXRpb25fY29udHJvbF9zZXRfZGVmYXVsdChiY21vbHRfb3BlcmF0aW9uX2NvbnRyb2wgKnRoaXMpCit7CisgICAgdGhpcy0+cmUgPSAwOworICAgIHRoaXMtPm9kbl9jbGFzcyA9IEJDTU9MVF9PRE5fQ0xBU1NfTjE7CisgICAgdGhpcy0+ZHNfZmVjX21vZGUgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9FTkFCTEU7CisgICAgdGhpcy0+cHJvdG9jb2wgPSBCQ01PTFRfVENfUFJPVE9DT0xfVENfTEFZRVJfUFJPVE9DT0xfR185ODlfUF8zOworICAgIHRoaXMtPmRzX2xpbmtfdHlwZSA9IEJDTU9MVF9MSU5LX1RZUEVfVU5TUEVDSUZJRUQ7CisgICAgdGhpcy0+cG9uX2lkLmFkbWluaXN0cmF0aXZlX2xhYmVsID0gMDsKKyAgICB0aGlzLT5wb25faWQuZHdsY2hfaWQgPSAwOworICAgIHRoaXMtPmMgPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfb3BlcmF0aW9uX2NvbnRyb2xfcGFjayhjb25zdCBiY21vbHRfb3BlcmF0aW9uX2NvbnRyb2wgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5yZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfb2RuX2NsYXNzX3BhY2sodGhpcy0+b2RuX2NsYXNzLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfcGFjayh0aGlzLT5kc19mZWNfbW9kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF90Y19wcm90b2NvbF9wYWNrKHRoaXMtPnByb3RvY29sLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2xpbmtfdHlwZV9wYWNrKHRoaXMtPmRzX2xpbmtfdHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9wb25faWRfcGFjaygmdGhpcy0+cG9uX2lkLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfb3BlcmF0aW9uX2NvbnRyb2xfdW5wYWNrKGJjbW9sdF9vcGVyYXRpb25fY29udHJvbCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnJlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9vZG5fY2xhc3NfdW5wYWNrKCZ0aGlzLT5vZG5fY2xhc3MsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfY29udHJvbF9zdGF0ZV91bnBhY2soJnRoaXMtPmRzX2ZlY19tb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3RjX3Byb3RvY29sX3VucGFjaygmdGhpcy0+cHJvdG9jb2wsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfbGlua190eXBlX3VucGFjaygmdGhpcy0+ZHNfbGlua190eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3Bvbl9pZF91bnBhY2soJnRoaXMtPnBvbl9pZCwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfb3BlcmF0aW9uX2NvbnRyb2xfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAxMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9vcGVyYXRpb25fY29udHJvbF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X29wZXJhdGlvbl9jb250cm9sICp0aGlzKQoreworICAgIGlmICh0aGlzLT5yZSA+IDEpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vZG5fY2xhc3MpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9PRE5fQ0xBU1NfTjE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfT0ROX0NMQVNTX04yOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX09ETl9DTEFTU19FMToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9PRE5fQ0xBU1NfRTI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmRzX2ZlY19tb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRU5BQkxFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5wcm90b2NvbCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1RDX1BST1RPQ09MX1RDX0xBWUVSX1BST1RPQ09MX0dfOTg3X1BfMzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9UQ19QUk9UT0NPTF9UQ19MQVlFUl9QUk9UT0NPTF9HXzk4OV9QXzM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmRzX2xpbmtfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0xJTktfVFlQRV9VTlNQRUNJRklFRDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9MSU5LX1RZUEVfQjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9MSU5LX1RZUEVfQToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9MSU5LX1RZUEVfQV9BTkRfQjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3Bvbl9pZF9ib3VuZHNfY2hlY2soJnRoaXMtPnBvbl9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmMgPiAxKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZ19zZXRfZGVmYXVsdChiY21vbHRfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyAqdGhpcykKK3sKKyAgICB0aGlzLT5pbnRlcnZhbCA9IDUwMDA7CisgICAgdGhpcy0+Y29udHJvbCA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX3BhY2soY29uc3QgYmNtb2x0X3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+aW50ZXJ2YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfcGFjayh0aGlzLT5jb250cm9sLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZ191bnBhY2soYmNtb2x0X3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+aW50ZXJ2YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfdW5wYWNrKCZ0aGlzLT5jb250cm9sLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZ19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZ19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPmludGVydmFsIDwgMTAwMCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmNvbnRyb2wpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQ09OVFJPTF9TVEFURV9FTkFCTEU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3Bvbl9hZ2dyZWdhdGVfc2hhcGVyX3NldF9kZWZhdWx0KGJjbW9sdF9wb25fYWdncmVnYXRlX3NoYXBlciAqdGhpcykKK3sKKyAgICB0aGlzLT5iYW5kd2lkdGhfa2JwcyA9IDA7CisgICAgdGhpcy0+bWJzX2tCID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9hZ2dyZWdhdGVfc2hhcGVyX3BhY2soY29uc3QgYmNtb2x0X3Bvbl9hZ2dyZWdhdGVfc2hhcGVyICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmJhbmR3aWR0aF9rYnBzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+bWJzX2tCKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9hZ2dyZWdhdGVfc2hhcGVyX3VucGFjayhiY21vbHRfcG9uX2FnZ3JlZ2F0ZV9zaGFwZXIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+YmFuZHdpZHRoX2ticHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5tYnNfa0IpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX2FnZ3JlZ2F0ZV9zaGFwZXJfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9hZ2dyZWdhdGVfc2hhcGVyX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfcG9uX2FnZ3JlZ2F0ZV9zaGFwZXIgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPm1ic19rQiA+IDQwMDApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9wb25fYWxsb2Nfc2xhX3NldF9kZWZhdWx0KGJjbW9sdF9wb25fYWxsb2Nfc2xhICp0aGlzKQoreworICAgIHRoaXMtPmNicl9ydF9idyA9IDA7CisgICAgdGhpcy0+Y2JyX25ydF9idyA9IDA7CisgICAgdGhpcy0+Z3VhcmFudGVlZF9idyA9IDA7CisgICAgdGhpcy0+bWF4aW11bV9idyA9IDA7CisgICAgdGhpcy0+YWRkaXRpb25hbF9id19lbGlnaWJpbGl0eSA9IEJDTU9MVF9BRERJVElPTkFMX0JXX0VMSUdJQklMSVRZX05PTkU7CisgICAgdGhpcy0+Y2JyX3J0X2NvbXBlbnNhdGlvbiA9IEJDTU9TX0ZBTFNFOworICAgIHRoaXMtPmNicl9ydF9hcF9pbmRleCA9IDA7CisgICAgdGhpcy0+Y2JyX25ydF9hcF9pbmRleCA9IDA7CisgICAgdGhpcy0+YWxsb2NfdHlwZSA9IEJDTU9MVF9BTExPQ19UWVBFX05PTkU7CisgICAgdGhpcy0+d2VpZ2h0ID0gMDsKKyAgICB0aGlzLT5wcmlvcml0eSA9IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wb25fYWxsb2Nfc2xhX3BhY2soY29uc3QgYmNtb2x0X3Bvbl9hbGxvY19zbGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+Y2JyX3J0X2J3KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+Y2JyX25ydF9idykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmd1YXJhbnRlZWRfYncpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5tYXhpbXVtX2J3KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9hZGRpdGlvbmFsX2J3X2VsaWdpYmlsaXR5X3BhY2sodGhpcy0+YWRkaXRpb25hbF9id19lbGlnaWJpbGl0eSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmNicl9ydF9jb21wZW5zYXRpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmNicl9ydF9hcF9pbmRleCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+Y2JyX25ydF9hcF9pbmRleCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYWxsb2NfdHlwZV9wYWNrKHRoaXMtPmFsbG9jX3R5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+d2VpZ2h0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5wcmlvcml0eSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wb25fYWxsb2Nfc2xhX3VucGFjayhiY21vbHRfcG9uX2FsbG9jX3NsYSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5jYnJfcnRfYncpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5jYnJfbnJ0X2J3KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+Z3VhcmFudGVlZF9idykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPm1heGltdW1fYncpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2FkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHlfdW5wYWNrKCZ0aGlzLT5hZGRpdGlvbmFsX2J3X2VsaWdpYmlsaXR5LCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+Y2JyX3J0X2NvbXBlbnNhdGlvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+Y2JyX3J0X2FwX2luZGV4KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5jYnJfbnJ0X2FwX2luZGV4KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9hbGxvY190eXBlX3VucGFjaygmdGhpcy0+YWxsb2NfdHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT53ZWlnaHQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnByaW9yaXR5KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9hbGxvY19zbGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAyMyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wb25fYWxsb2Nfc2xhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfcG9uX2FsbG9jX3NsYSAqdGhpcykKK3sKKyAgICBzd2l0Y2ggKHRoaXMtPmFkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9BRERJVElPTkFMX0JXX0VMSUdJQklMSVRZX05PTkU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQURESVRJT05BTF9CV19FTElHSUJJTElUWV9OT05fQVNTVVJFRDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRERJVElPTkFMX0JXX0VMSUdJQklMSVRZX0JFU1RfRUZGT1JUOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmNicl9ydF9hcF9pbmRleCA+IDApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmNicl9ucnRfYXBfaW5kZXggPiAxKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+YWxsb2NfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0FMTE9DX1RZUEVfTk9ORToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BTExPQ19UWVBFX05TUjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BTExPQ19UWVBFX1NSOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPndlaWdodCA+IDEwMCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+cHJpb3JpdHkgPiA3KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGhfc2V0X2RlZmF1bHQoYmNtb2x0X3Bvbl9hdmFpbGFibGVfYmFuZHdpZHRoICp0aGlzKQoreworICAgIHRoaXMtPmNicl9idyA9IDA7CisgICAgdGhpcy0+dG90YWxfYncgPSAwOworICAgIHRoaXMtPm5leHRfb251X3RvdGFsX2J3ID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9hdmFpbGFibGVfYmFuZHdpZHRoX3BhY2soY29uc3QgYmNtb2x0X3Bvbl9hdmFpbGFibGVfYmFuZHdpZHRoICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmNicl9idykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnRvdGFsX2J3KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+bmV4dF9vbnVfdG90YWxfYncpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGhfdW5wYWNrKGJjbW9sdF9wb25fYXZhaWxhYmxlX2JhbmR3aWR0aCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5jYnJfYncpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT50b3RhbF9idykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPm5leHRfb251X3RvdGFsX2J3KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9hdmFpbGFibGVfYmFuZHdpZHRoX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGhfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9wb25fYXZhaWxhYmxlX2JhbmR3aWR0aCAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3Bvbl9kYmFfc2V0X2RlZmF1bHQoYmNtb2x0X3Bvbl9kYmEgKnRoaXMpCit7CisgICAgdGhpcy0+c3JfcmVwb3J0aW5nX2Jsb2NrX3NpemUgPSA0ODsKKyAgICB0aGlzLT5kYmFfbW9kZSA9IEJDTU9MVF9EQkFfTU9ERV9OT1JNQUw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wb25fZGJhX3BhY2soY29uc3QgYmNtb2x0X3Bvbl9kYmEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5zcl9yZXBvcnRpbmdfYmxvY2tfc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZGJhX21vZGVfcGFjayh0aGlzLT5kYmFfbW9kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9kYmFfdW5wYWNrKGJjbW9sdF9wb25fZGJhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+c3JfcmVwb3J0aW5nX2Jsb2NrX3NpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2RiYV9tb2RlX3VucGFjaygmdGhpcy0+ZGJhX21vZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wb25fZGJhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wb25fZGJhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfcG9uX2RiYSAqdGhpcykKK3sKKyAgICBzd2l0Y2ggKHRoaXMtPmRiYV9tb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfREJBX01PREVfTk9STUFMOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0RCQV9NT0RFX0VYVEVOREVEOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9wb25fZGlzdGFuY2Vfc2V0X2RlZmF1bHQoYmNtb2x0X3Bvbl9kaXN0YW5jZSAqdGhpcykKK3sKKyAgICB0aGlzLT5tYXhfbG9nX2Rpc3RhbmNlID0gMjA7CisgICAgdGhpcy0+bWF4X2RpZmZfcmVhY2ggPSAyMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9kaXN0YW5jZV9wYWNrKGNvbnN0IGJjbW9sdF9wb25fZGlzdGFuY2UgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+bWF4X2xvZ19kaXN0YW5jZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPm1heF9kaWZmX3JlYWNoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9kaXN0YW5jZV91bnBhY2soYmNtb2x0X3Bvbl9kaXN0YW5jZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5tYXhfbG9nX2Rpc3RhbmNlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+bWF4X2RpZmZfcmVhY2gpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX2Rpc3RhbmNlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wb25fZGlzdGFuY2VfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9wb25fZGlzdGFuY2UgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPm1heF9sb2dfZGlzdGFuY2UgPCAxKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5tYXhfbG9nX2Rpc3RhbmNlID4gMTAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5tYXhfZGlmZl9yZWFjaCA8IDEpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPm1heF9kaWZmX3JlYWNoID4gNjApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9wb25fZHJpZnRfY29udHJvbF9zZXRfZGVmYXVsdChiY21vbHRfcG9uX2RyaWZ0X2NvbnRyb2wgKnRoaXMpCit7CisgICAgdGhpcy0+ZHJpZnRfaW50ZXJ2YWwgPSAxMDAwOworICAgIHRoaXMtPmRyaWZ0X2xpbWl0ID0gNDsKKyAgICB0aGlzLT50cmFuc21pc3Npb25fY29udHJvbF9saW1pdCA9IDg7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wb25fZHJpZnRfY29udHJvbF9wYWNrKGNvbnN0IGJjbW9sdF9wb25fZHJpZnRfY29udHJvbCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5kcmlmdF9pbnRlcnZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+ZHJpZnRfbGltaXQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnRyYW5zbWlzc2lvbl9jb250cm9sX2xpbWl0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sX3VucGFjayhiY21vbHRfcG9uX2RyaWZ0X2NvbnRyb2wgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+ZHJpZnRfaW50ZXJ2YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmRyaWZ0X2xpbWl0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT50cmFuc21pc3Npb25fY29udHJvbF9saW1pdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wb25fZHJpZnRfY29udHJvbF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX2RyaWZ0X2NvbnRyb2xfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9wb25fZHJpZnRfY29udHJvbCAqdGhpcykKK3sKKyAgICBpZiAodGhpcy0+ZHJpZnRfaW50ZXJ2YWwgPiA2MDAwMFVMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5kcmlmdF9saW1pdCA8IDEpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmRyaWZ0X2xpbWl0ID4gMzIpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPnRyYW5zbWlzc2lvbl9jb250cm9sX2xpbWl0IDwgMSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+dHJhbnNtaXNzaW9uX2NvbnRyb2xfbGltaXQgPiA2NCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3Bvbl9vbnVfaWRfbGlzdF91MzJfc2V0X2RlZmF1bHQoYmNtb2x0X3Bvbl9vbnVfaWRfbGlzdF91MzIgKnRoaXMpCit7CisgICAgdGhpcy0+bGVuID0gMDsKKyAgICB0aGlzLT52YWwgPSBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX29udV9pZF9saXN0X3UzMl9wYWNrKGNvbnN0IGJjbW9sdF9wb25fb251X2lkX2xpc3RfdTMyICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDMyX3QgaTA7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF9wb25fb251X2lkX2xpc3RfdTMyXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmxlbjsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPnZhbFtpMF0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9wb25fb251X2lkX2xpc3RfdTMyX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9wb25fb251X2lkX2xpc3RfdTMyICp0aGlzKQoreworICAgIHJldHVybiA0ICsgKDIgKiB0aGlzLT5sZW4pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX29udV9pZF9saXN0X3UzMl91bnBhY2soYmNtb2x0X3Bvbl9vbnVfaWRfbGlzdF91MzIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MzJfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+bGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbiA+IDApICYmICh0aGlzLT52YWwgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfcG9uX29udV9pZF9saXN0X3UzMlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT52YWwgPSAoYmNtb2x0X3Bvbl9vbnVfaWQgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPmxlbiAqIHNpemVvZihiY21vbHRfcG9uX29udV9pZCkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bGVuOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT52YWxbaTBdKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wb25fb251X2lkX2xpc3RfdTMyX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQzMl90IGxlbjsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIocGFja2VkLCAmbGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9wb25fb251X2lkKSAqIGxlbik7CisgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCBsZW4gKiAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9vbnVfaWRfbGlzdF91MzJfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9wb25fb251X2lkX2xpc3RfdTMyICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfcG9uX3Bvd2VyX2xldmVsX3NldF9kZWZhdWx0KGJjbW9sdF9wb25fcG93ZXJfbGV2ZWwgKnRoaXMpCit7CisgICAgdGhpcy0+cGxzX21heGltdW1fYWxsb2NhdGlvbl9zaXplID0gMTIwOworICAgIHRoaXMtPm1vZGUgPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX3Bvd2VyX2xldmVsX3BhY2soY29uc3QgYmNtb2x0X3Bvbl9wb3dlcl9sZXZlbCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5wbHNfbWF4aW11bV9hbGxvY2F0aW9uX3NpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPm1vZGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX3Bvd2VyX2xldmVsX3VucGFjayhiY21vbHRfcG9uX3Bvd2VyX2xldmVsICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnBsc19tYXhpbXVtX2FsbG9jYXRpb25fc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bW9kZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wb25fcG93ZXJfbGV2ZWxfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCA1KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9wb3dlcl9sZXZlbF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3Bvbl9wb3dlcl9sZXZlbCAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19zZXRfZGVmYXVsdChiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nICp0aGlzKQoreworICAgIHRoaXMtPnRpbWVvdXQgPSAxMDA7CisgICAgdGhpcy0+Z3Bpb19waW4gPSBCQ01PTFRfR1BJT19QSU5fVU5DT05GSUdVUkVEOworICAgIHRoaXMtPm9wdGlvbnMgPSAoYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19vcHRpb25zKSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3BhY2soY29uc3QgYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT50aW1lb3V0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9ncGlvX3Bpbl9wYWNrKHRoaXMtPmdwaW9fcGluLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19vcHRpb25zX3BhY2sodGhpcy0+b3B0aW9ucywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ191bnBhY2soYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT50aW1lb3V0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9ncGlvX3Bpbl91bnBhY2soJnRoaXMtPmdwaW9fcGluLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19vcHRpb25zX3VucGFjaygmdGhpcy0+b3B0aW9ucywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDcpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nICp0aGlzKQoreworICAgIHN3aXRjaCAodGhpcy0+Z3Bpb19waW4pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4wOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4zOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU42OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU45OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjEwOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjExOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjEyOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjEzOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjE0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjE1OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjE2OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjE3OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjE4OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjE5OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjIwOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjIxOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjIyOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjIzOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjI0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjI1OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjI2OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjI3OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjI4OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjI5OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjMwOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjMxOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjMyOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjMzOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjM0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjM1OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjM2OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjM3OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjM4OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjM5OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjQwOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjQxOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjQyOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjQzOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjQ0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjQ1OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjQ2OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjQ3OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjQ4OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjQ5OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjUwOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjUxOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjUyOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjUzOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjU0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjU1OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjU2OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjU3OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjU4OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjU5OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjYwOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjYxOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjYyOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjYzOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjY0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjY1OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjY2OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjY3OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjY4OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjY5OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjcwOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjcxOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjcyOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjczOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjc0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjc1OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjc2OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjc3OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjc4OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjc5OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjgwOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjgxOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjgyOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjgzOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjg0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjg1OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjg2OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjg3OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjg4OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjg5OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjkwOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjkxOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjkyOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjkzOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjk0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjk1OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjk2OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjk3OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjk4OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjk5OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjEwMDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTAyOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjEwMzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTA1OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjEwNjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9VTkNPTkZJR1VSRUQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPm9wdGlvbnMgJiAweEZGRkZGRkZDVUwpICE9IDApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9wb25fc3RhdHVzX3NldF9kZWZhdWx0KGJjbW9sdF9wb25fc3RhdHVzICp0aGlzKQoreworICAgIHRoaXMtPnN0YXRlID0gQkNNT0xUX1BPTl9TVEFURV9JTkFDVElWRTsKKyAgICB0aGlzLT5sb3Nfc3RhdHVzID0gQkNNT0xUX1NUQVRVU19PRkY7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wb25fc3RhdHVzX3BhY2soY29uc3QgYmNtb2x0X3Bvbl9zdGF0dXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9wb25fc3RhdGVfcGFjayh0aGlzLT5zdGF0ZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5sb3Nfc3RhdHVzLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX3N0YXR1c191bnBhY2soYmNtb2x0X3Bvbl9zdGF0dXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9wb25fc3RhdGVfdW5wYWNrKCZ0aGlzLT5zdGF0ZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5sb3Nfc3RhdHVzLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX3N0YXR1c19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX3N0YXR1c19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3Bvbl9zdGF0dXMgKnRoaXMpCit7CisgICAgc3dpdGNoICh0aGlzLT5zdGF0ZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1BPTl9TVEFURV9JTkFDVElWRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9QT05fU1RBVEVfUFJPQ0VTU0lORzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9QT05fU1RBVEVfQUNUSVZFX1dPUktJTkc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfUE9OX1NUQVRFX0FDVElWRV9TVEFOREJZOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5sb3Nfc3RhdHVzKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZ19zZXRfZGVmYXVsdChiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZyAqdGhpcykKK3sKKyAgICB0aGlzLT5wb2x5bm9tID0gQkNNT0xUX1BSQlNfUE9MWU5PTUlBTF9QUkJTXzc7CisgICAgdGhpcy0+bW9kZSA9IEJDTU9MVF9QUkJTX0NIRUNLRVJfTU9ERV9TRUxGX1NZTkM7CisgICAgdGhpcy0+ZGF0YV9pbnZlcnQgPSBCQ01PU19GQUxTRTsKKyAgICB0aGlzLT5jb250cm9sID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWdfcGFjayhjb25zdCBiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X3ByYnNfcG9seW5vbWlhbF9wYWNrKHRoaXMtPnBvbHlub20sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfcHJic19jaGVja2VyX21vZGVfcGFjayh0aGlzLT5tb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+ZGF0YV9pbnZlcnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfcGFjayh0aGlzLT5jb250cm9sLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZ191bnBhY2soYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9wcmJzX3BvbHlub21pYWxfdW5wYWNrKCZ0aGlzLT5wb2x5bm9tLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3ByYnNfY2hlY2tlcl9tb2RlX3VucGFjaygmdGhpcy0+bW9kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmRhdGFfaW52ZXJ0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9jb250cm9sX3N0YXRlX3VucGFjaygmdGhpcy0+Y29udHJvbCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWdfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWdfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnICp0aGlzKQoreworICAgIHN3aXRjaCAodGhpcy0+cG9seW5vbSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1BSQlNfUE9MWU5PTUlBTF9QUkJTXzc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfUFJCU19QT0xZTk9NSUFMX1BSQlNfOToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9QUkJTX1BPTFlOT01JQUxfUFJCU18xMToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9QUkJTX1BPTFlOT01JQUxfUFJCU18xNToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9QUkJTX1BPTFlOT01JQUxfUFJCU18yMzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9QUkJTX1BPTFlOT01JQUxfUFJCU18zMToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9QUkJTX1BPTFlOT01JQUxfUFJCU181ODoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+bW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1BSQlNfQ0hFQ0tFUl9NT0RFX1NFTEZfU1lOQzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9QUkJTX0NIRUNLRVJfTU9ERV9JTklUSUFMX1NFRURfTU9ERToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9QUkJTX0NIRUNLRVJfTU9ERV9JTklUSUFMX1NFRURfTU9ERV8yOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5jb250cm9sKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRU5BQkxFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWdfc2V0X2RlZmF1bHQoYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZyAqdGhpcykKK3sKKyAgICB0aGlzLT5wb2x5bm9tID0gQkNNT0xUX1BSQlNfUE9MWU5PTUlBTF9QUkJTXzc7CisgICAgdGhpcy0+ZXJyb3JfaW5zZXJ0ID0gQkNNT1NfRkFMU0U7CisgICAgdGhpcy0+aW52ZXJ0ID0gQkNNT1NfRkFMU0U7CisgICAgdGhpcy0+Y29udHJvbCA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWdfcGFjayhjb25zdCBiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfcHJic19wb2x5bm9taWFsX3BhY2sodGhpcy0+cG9seW5vbSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmVycm9yX2luc2VydCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5pbnZlcnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfcGFjayh0aGlzLT5jb250cm9sLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnX3VucGFjayhiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfcHJic19wb2x5bm9taWFsX3VucGFjaygmdGhpcy0+cG9seW5vbSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmVycm9yX2luc2VydCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5pbnZlcnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfdW5wYWNrKCZ0aGlzLT5jb250cm9sLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWdfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWcgKnRoaXMpCit7CisgICAgc3dpdGNoICh0aGlzLT5wb2x5bm9tKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfUFJCU19QT0xZTk9NSUFMX1BSQlNfNzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9QUkJTX1BPTFlOT01JQUxfUFJCU185OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1BSQlNfUE9MWU5PTUlBTF9QUkJTXzExOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1BSQlNfUE9MWU5PTUlBTF9QUkJTXzE1OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1BSQlNfUE9MWU5PTUlBTF9QUkJTXzIzOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1BSQlNfUE9MWU5PTUlBTF9QUkJTXzMxOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1BSQlNfUE9MWU5PTUlBTF9QUkJTXzU4OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5jb250cm9sKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRU5BQkxFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9wcmJzX3N0YXR1c19zZXRfZGVmYXVsdChiY21vbHRfcHJic19zdGF0dXMgKnRoaXMpCit7CisgICAgdGhpcy0+bG9ja19zdGF0ZSA9IEJDTU9MVF9QUkJTX0xPQ0tfU1RBVEVfVU5MT0NLRUQ7CisgICAgdGhpcy0+ZXJyb3JfY291bnRzID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3ByYnNfc3RhdHVzX3BhY2soY29uc3QgYmNtb2x0X3ByYnNfc3RhdHVzICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfcHJic19sb2NrX3N0YXRlX3BhY2sodGhpcy0+bG9ja19zdGF0ZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+ZXJyb3JfY291bnRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3ByYnNfc3RhdHVzX3VucGFjayhiY21vbHRfcHJic19zdGF0dXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9wcmJzX2xvY2tfc3RhdGVfdW5wYWNrKCZ0aGlzLT5sb2NrX3N0YXRlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5lcnJvcl9jb3VudHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcHJic19zdGF0dXNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCA1KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3ByYnNfc3RhdHVzX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfcHJic19zdGF0dXMgKnRoaXMpCit7CisgICAgc3dpdGNoICh0aGlzLT5sb2NrX3N0YXRlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfUFJCU19MT0NLX1NUQVRFX1VOTE9DS0VEOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1BSQlNfTE9DS19TVEFURV9MT0NLRUQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3JhbmdpbmdfY29udHJvbF9jb25maWd1cmF0aW9uX3NldF9kZWZhdWx0KGJjbW9sdF9yYW5naW5nX2NvbnRyb2xfY29uZmlndXJhdGlvbiAqdGhpcykKK3sKKyAgICB0aGlzLT53YWl0X3N0YXRlXzFfd2luZG93X3NpemUgPSAwOworICAgIHRoaXMtPndhaXRfc3RhdGVfMl93aW5kb3dfc2l6ZSA9IDA7CisgICAgdGhpcy0+d2FpdF9hZnRlcl9yZXN5bmNfNCA9IEJDTU9TX0ZBTFNFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcmFuZ2luZ19jb250cm9sX2NvbmZpZ3VyYXRpb25fcGFjayhjb25zdCBiY21vbHRfcmFuZ2luZ19jb250cm9sX2NvbmZpZ3VyYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT53YWl0X3N0YXRlXzFfd2luZG93X3NpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPndhaXRfc3RhdGVfMl93aW5kb3dfc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT53YWl0X2FmdGVyX3Jlc3luY180KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JhbmdpbmdfY29udHJvbF9jb25maWd1cmF0aW9uX3VucGFjayhiY21vbHRfcmFuZ2luZ19jb250cm9sX2NvbmZpZ3VyYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT53YWl0X3N0YXRlXzFfd2luZG93X3NpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPndhaXRfc3RhdGVfMl93aW5kb3dfc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT53YWl0X2FmdGVyX3Jlc3luY180KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JhbmdpbmdfY29udHJvbF9jb25maWd1cmF0aW9uX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yYW5naW5nX2NvbnRyb2xfY29uZmlndXJhdGlvbl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3JhbmdpbmdfY29udHJvbF9jb25maWd1cmF0aW9uICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9uc19zZXRfZGVmYXVsdChiY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyAqdGhpcykKK3sKKyAgICB0aGlzLT5hZnRlcl9pbml0ID0gQkNNT1NfRkFMU0U7CisgICAgdGhpcy0+YWZ0ZXJfbm9fZWQgPSBCQ01PU19GQUxTRTsKKyAgICB0aGlzLT5hZnRlcl9lZCA9IEJDTU9TX0ZBTFNFOworICAgIHRoaXMtPmFmdGVyX25vX2RlbCA9IEJDTU9TX0ZBTFNFOworICAgIHRoaXMtPmFmdGVyX3JhbmdpbmdfYWNjZXNzID0gQkNNT1NfRkFMU0U7CisgICAgdGhpcy0+bWVkX3ZhbCA9IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zX3BhY2soY29uc3QgYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmFmdGVyX2luaXQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+YWZ0ZXJfbm9fZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+YWZ0ZXJfZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+YWZ0ZXJfbm9fZGVsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmFmdGVyX3JhbmdpbmdfYWNjZXNzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bWVkX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zX3VucGFjayhiY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+YWZ0ZXJfaW5pdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5hZnRlcl9ub19lZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5hZnRlcl9lZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5hZnRlcl9ub19kZWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+YWZ0ZXJfcmFuZ2luZ19hY2Nlc3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5tZWRfdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCA3KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnNfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfcmFuZ2luZ19yc3NpX2NvbnRyb2xfc2V0X2RlZmF1bHQoYmNtb2x0X3JhbmdpbmdfcnNzaV9jb250cm9sICp0aGlzKQoreworICAgIHRoaXMtPmFmdGVyX25vX2VkID0gQkNNT1NfRkFMU0U7CisgICAgdGhpcy0+YWZ0ZXJfZWQgPSBCQ01PU19GQUxTRTsKKyAgICB0aGlzLT5hZnRlcl9yZXNldF8zID0gQkNNT1NfRkFMU0U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yYW5naW5nX3Jzc2lfY29udHJvbF9wYWNrKGNvbnN0IGJjbW9sdF9yYW5naW5nX3Jzc2lfY29udHJvbCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+YWZ0ZXJfbm9fZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+YWZ0ZXJfZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+YWZ0ZXJfcmVzZXRfMykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yYW5naW5nX3Jzc2lfY29udHJvbF91bnBhY2soYmNtb2x0X3JhbmdpbmdfcnNzaV9jb250cm9sICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5hZnRlcl9ub19lZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5hZnRlcl9lZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5hZnRlcl9yZXNldF8zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JhbmdpbmdfcnNzaV9jb250cm9sX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yYW5naW5nX3Jzc2lfY29udHJvbF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3JhbmdpbmdfcnNzaV9jb250cm9sICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfcmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzX3NldF9kZWZhdWx0KGJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMgKnRoaXMpCit7CisgICAgdGhpcy0+cmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdGUgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOworICAgIHRoaXMtPnNtYV9mbGFnID0gQkNNT1NfRkFMU0U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXNfcGFjayhjb25zdCBiY21vbHRfcmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfY29udHJvbF9zdGF0ZV9wYWNrKHRoaXMtPnJlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXRlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c21hX2ZsYWcpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzX3VucGFjayhiY21vbHRfcmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfY29udHJvbF9zdGF0ZV91bnBhY2soJnRoaXMtPnJlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXRlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c21hX2ZsYWcpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXNfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMgKnRoaXMpCit7CisgICAgc3dpdGNoICh0aGlzLT5yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0ZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9DT05UUk9MX1NUQVRFX0VOQUJMRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwX3NldF9kZWZhdWx0KGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXAgKnRoaXMpCit7CisgICAgdGhpcy0+cGxvX3NpemUgPSAwOworICAgIHRoaXMtPmFsbG9jX2lkID0gKGJjbW9sdF9wb25fYWxsb2NfaWQpIDA7CisgICAgdGhpcy0+b251X2lkID0gKGJjbW9sdF9wb25fb251X2lkKSAwOworICAgIHRoaXMtPmFjY2Vzc19zaXplID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcF9wYWNrKGNvbnN0IGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXAgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+cGxvX3NpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPmFsbG9jX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5vbnVfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmFjY2Vzc19zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcF91bnBhY2soYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5wbG9fc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5hbGxvY19pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5vbnVfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmFjY2Vzc19zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwICp0aGlzKQoreworICAgIGlmICh0aGlzLT5hbGxvY19pZCA+IChiY21vbHRfcG9uX2FsbG9jX2lkKSAxNjM4MykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+b251X2lkID4gKGJjbW9sdF9wb25fb251X2lkKSA1MTEpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXBfbGlzdF91MzJfbWF4Xzhfc2V0X2RlZmF1bHQoYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcF9saXN0X3UzMl9tYXhfOCAqdGhpcykKK3sKKyAgICB0aGlzLT5sZW4gPSAwOworICAgIHRoaXMtPnZhbCA9IE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXBfbGlzdF91MzJfbWF4XzhfcGFjayhjb25zdCBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwX2xpc3RfdTMyX21heF84ICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDMyX3QgaTA7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXBfbGlzdF91MzJfbWF4XzhcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmxlbiA+IDgpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bGVuOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwX3BhY2soJnRoaXMtPnZhbFtpMF0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcF9saXN0X3UzMl9tYXhfOF9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwX2xpc3RfdTMyX21heF84ICp0aGlzKQoreworICAgIHJldHVybiA0ICsgKDkgKiB0aGlzLT5sZW4pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwX2xpc3RfdTMyX21heF84X3VucGFjayhiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwX2xpc3RfdTMyX21heF84ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDMyX3QgaTA7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsXCIgb2Ygc3RydWN0IFwiYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcF9saXN0X3UzMl9tYXhfOFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT52YWwgPSAoYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+bGVuICogc2l6ZW9mKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXApKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0aGlzLT5sZW4gPiA4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmxlbjsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcF91bnBhY2soJnRoaXMtPnZhbFtpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXBfbGlzdF91MzJfbWF4Xzhfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDMyX3QgbGVuOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihwYWNrZWQsICZsZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcCkgKiBsZW4pOworICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgbGVuICogOSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXBfbGlzdF91MzJfbWF4XzhfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXBfbGlzdF91MzJfbWF4XzggKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPmxlbiA+IDgpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3NldF9kZWZhdWx0KGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtICp0aGlzKQoreworICAgIHRoaXMtPmFsZ29yaXRobV90eXBlID0gKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3R5cGUpIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3BhY2soY29uc3QgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG0gKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3R5cGVfcGFjayh0aGlzLT5hbGdvcml0aG1fdHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmFsZ29yaXRobV90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfUk9HVUVfREVURUNUSU9OX0FMR09SSVRITV9UWVBFX0VBUkxZX1JPR1VFX0RFVEVDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X3BhY2sodGhpcy0+dS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24ubWVhc3VyZW1lbnRfdHlwZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24uaW50ZXJ2YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24uc2Vjb25kX3Jhbmdpbmdfd2luZG93KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9hbGxvY190eXBlX3RvX3NjYW5fcGFjayh0aGlzLT51LmVhcmx5X3JvZ3VlX2RldGVjdGlvbi5hbGxvY190eXBlX3RvX3NjYW4sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9BTEdPUklUSE1fVFlQRV9TUEVDSUFMX01BUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXBfbGlzdF91MzJfbWF4XzhfcGFjaygmdGhpcy0+dS5zcGVjaWFsX21hcC5hY2Nlc3NlcywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfUk9HVUVfREVURUNUSU9OX0FMR09SSVRITV9UWVBFX0VYVEVOREVEX0dVQVJEX1RJTUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuZXh0ZW5kZWRfZ3VhcmRfdGltZS5hZGRpdGlvbmFsX2d1YXJkX3RpbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG1fZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG0gKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+YWxnb3JpdGhtX3R5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fQUxHT1JJVEhNX1RZUEVfRUFSTFlfUk9HVUVfREVURUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfUk9HVUVfREVURUNUSU9OX0FMR09SSVRITV9UWVBFX1NQRUNJQUxfTUFQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXBfbGlzdF91MzJfbWF4XzhfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9BTEdPUklUSE1fVFlQRV9FWFRFTkRFRF9HVUFSRF9USU1FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG1fdW5wYWNrKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV90eXBlX3VucGFjaygmdGhpcy0+YWxnb3JpdGhtX3R5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5hbGdvcml0aG1fdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9BTEdPUklUSE1fVFlQRV9FQVJMWV9ST0dVRV9ERVRFQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd191bnBhY2soJnRoaXMtPnUuZWFybHlfcm9ndWVfZGV0ZWN0aW9uLm1lYXN1cmVtZW50X3R5cGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnUuZWFybHlfcm9ndWVfZGV0ZWN0aW9uLmludGVydmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnUuZWFybHlfcm9ndWVfZGV0ZWN0aW9uLnNlY29uZF9yYW5naW5nX3dpbmRvdykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfYWxsb2NfdHlwZV90b19zY2FuX3VucGFjaygmdGhpcy0+dS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24uYWxsb2NfdHlwZV90b19zY2FuLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fQUxHT1JJVEhNX1RZUEVfU1BFQ0lBTF9NQVA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwX2xpc3RfdTMyX21heF84X3VucGFjaygmdGhpcy0+dS5zcGVjaWFsX21hcC5hY2Nlc3NlcywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fQUxHT1JJVEhNX1RZUEVfRVhURU5ERURfR1VBUkRfVElNRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dS5leHRlbmRlZF9ndWFyZF90aW1lLmFkZGl0aW9uYWxfZ3VhcmRfdGltZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3R5cGUgYWxnb3JpdGhtX3R5cGU7CisgICAgaWYgKCFiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV90eXBlX3VucGFjaygmYWxnb3JpdGhtX3R5cGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChhbGdvcml0aG1fdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9BTEdPUklUSE1fVFlQRV9FQVJMWV9ST0dVRV9ERVRFQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfUk9HVUVfREVURUNUSU9OX0FMR09SSVRITV9UWVBFX1NQRUNJQUxfTUFQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcF9saXN0X3UzMl9tYXhfOF9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfUk9HVUVfREVURUNUSU9OX0FMR09SSVRITV9UWVBFX0VYVEVOREVEX0dVQVJEX1RJTUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG1fYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtICp0aGlzKQoreworICAgIHN3aXRjaCAodGhpcy0+YWxnb3JpdGhtX3R5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fQUxHT1JJVEhNX1RZUEVfRUFSTFlfUk9HVUVfREVURUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy0+dS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24ubWVhc3VyZW1lbnRfdHlwZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfU0lMRU5UX1dJTkRPVzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0NVVF9PRkZfV0lORE9XOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuZWFybHlfcm9ndWVfZGV0ZWN0aW9uLmludGVydmFsIDwgMTAwMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24uaW50ZXJ2YWwgPiAxMDAwMDAwMFVMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy0+dS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24uYWxsb2NfdHlwZV90b19zY2FuKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUxMT0NfVFlQRV9UT19TQ0FOX1VOVVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9BTExPQ19UWVBFX1RPX1NDQU5fUFJFVklPVVNMWV9VU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FMTE9DX1RZUEVfVE9fU0NBTl9BTEw6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfUk9HVUVfREVURUNUSU9OX0FMR09SSVRITV9UWVBFX1NQRUNJQUxfTUFQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLmxlbiA+IDgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwX2xpc3RfdTMyX21heF84X2JvdW5kc19jaGVjaygmdGhpcy0+dS5zcGVjaWFsX21hcC5hY2Nlc3NlcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9BTEdPUklUSE1fVFlQRV9FWFRFTkRFRF9HVUFSRF9USU1FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmV4dGVuZGVkX2d1YXJkX3RpbWUuYWRkaXRpb25hbF9ndWFyZF90aW1lID4gNTAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzX3NldF9kZWZhdWx0KGJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MgKnRoaXMpCit7CisgICAgdGhpcy0+Y29udHJvbCA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU7CisgICAgdGhpcy0+ZGV0ZWN0aW9uX2FsZ29yaXRobS5hbGdvcml0aG1fdHlwZSA9IEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fQUxHT1JJVEhNX1RZUEVfRUFSTFlfUk9HVUVfREVURUNUSU9OOworICAgIHRoaXMtPmRldGVjdGlvbl9hbGdvcml0aG0udS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24ubWVhc3VyZW1lbnRfdHlwZSA9IEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX1NJTEVOVF9XSU5ET1c7CisgICAgdGhpcy0+ZGV0ZWN0aW9uX2FsZ29yaXRobS51LmVhcmx5X3JvZ3VlX2RldGVjdGlvbi5pbnRlcnZhbCA9IDEwMDAwOworICAgIHRoaXMtPmRldGVjdGlvbl9hbGdvcml0aG0udS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24uc2Vjb25kX3Jhbmdpbmdfd2luZG93ID0gQkNNT1NfRkFMU0U7CisgICAgdGhpcy0+ZGV0ZWN0aW9uX2FsZ29yaXRobS51LmVhcmx5X3JvZ3VlX2RldGVjdGlvbi5hbGxvY190eXBlX3RvX3NjYW4gPSBCQ01PTFRfQUxMT0NfVFlQRV9UT19TQ0FOX0FMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzc19wYWNrKGNvbnN0IGJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9jb250cm9sX3N0YXRlX3BhY2sodGhpcy0+Y29udHJvbCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3BhY2soJnRoaXMtPmRldGVjdGlvbl9hbGdvcml0aG0sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MgKnRoaXMpCit7CisgICAgcmV0dXJuIDEgKyBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+ZGV0ZWN0aW9uX2FsZ29yaXRobSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3NfdW5wYWNrKGJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9jb250cm9sX3N0YXRlX3VucGFjaygmdGhpcy0+Y29udHJvbCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3VucGFjaygmdGhpcy0+ZGV0ZWN0aW9uX2FsZ29yaXRobSwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzc19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3JvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcyAqdGhpcykKK3sKKyAgICBzd2l0Y2ggKHRoaXMtPmNvbnRyb2wpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQ09OVFJPTF9TVEFURV9FTkFCTEU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX2JvdW5kc19jaGVjaygmdGhpcy0+ZGV0ZWN0aW9uX2FsZ29yaXRobSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9zZXJkZXNfY29uZmlndXJhdGlvbl9zZXRfZGVmYXVsdChiY21vbHRfc2VyZGVzX2NvbmZpZ3VyYXRpb24gKnRoaXMpCit7CisgICAgdGhpcy0+cmFuZ2luZ19tb2RlID0gQkNNT0xUX1NFUkRFU19SQU5HSU5HX01PREVfQkNEUl9SRVNFVF9NT0RFOworICAgIHRoaXMtPm11bHRpX2VkX21vZGUgPSBCQ01PU19GQUxTRTsKKyAgICB0aGlzLT5idXJzdF9lbmFibGVfc3RhcnRfb2Zmc2V0ID0gMDsKKyAgICB0aGlzLT5idXJzdF9lbmFibGVfZW5kX29mZnNldCA9IDA7CisgICAgdGhpcy0+ZWRfaW52ZXJ0aW9uID0gQkNNT1NfRkFMU0U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zZXJkZXNfY29uZmlndXJhdGlvbl9wYWNrKGNvbnN0IGJjbW9sdF9zZXJkZXNfY29uZmlndXJhdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X3NlcmRlc19yYW5naW5nX21vZGVfcGFjayh0aGlzLT5yYW5naW5nX21vZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5tdWx0aV9lZF9tb2RlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+YnVyc3RfZW5hYmxlX3N0YXJ0X29mZnNldCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmJ1cnN0X2VuYWJsZV9lbmRfb2Zmc2V0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmVkX2ludmVydGlvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zZXJkZXNfY29uZmlndXJhdGlvbl91bnBhY2soYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfc2VyZGVzX3JhbmdpbmdfbW9kZV91bnBhY2soJnRoaXMtPnJhbmdpbmdfbW9kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPm11bHRpX2VkX21vZGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5idXJzdF9lbmFibGVfc3RhcnRfb2Zmc2V0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+YnVyc3RfZW5hYmxlX2VuZF9vZmZzZXQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+ZWRfaW52ZXJ0aW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zZXJkZXNfY29uZmlndXJhdGlvbl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uICp0aGlzKQoreworICAgIHN3aXRjaCAodGhpcy0+cmFuZ2luZ19tb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfU0VSREVTX1JBTkdJTkdfTU9ERV9FRF9NT0RFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NFUkRFU19SQU5HSU5HX01PREVfQkNEUl9SRVNFVF9NT0RFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NFUkRFU19SQU5HSU5HX01PREVfRkFTVF9NT0RFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9zZXJpYWxfbnVtYmVyX3NldF9kZWZhdWx0KGJjbW9sdF9zZXJpYWxfbnVtYmVyICp0aGlzKQoreworICAgIG1lbXNldCh0aGlzLT52ZW5kb3JfaWQsIDAsIHNpemVvZih0aGlzLT52ZW5kb3JfaWQpKTsKKyAgICBtZW1zZXQodGhpcy0+dmVuZG9yX3NwZWNpZmljLCAwLCBzaXplb2YodGhpcy0+dmVuZG9yX3NwZWNpZmljKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zZXJpYWxfbnVtYmVyX3BhY2soY29uc3QgYmNtb2x0X3NlcmlhbF9udW1iZXIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGUoYnVmLCB0aGlzLT52ZW5kb3JfaWQsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZShidWYsIHRoaXMtPnZlbmRvcl9zcGVjaWZpYywgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zZXJpYWxfbnVtYmVyX3VucGFjayhiY21vbHRfc2VyaWFsX251bWJlciAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dmVuZG9yX2lkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZChidWYsIHRoaXMtPnZlbmRvcl9zcGVjaWZpYywgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zZXJpYWxfbnVtYmVyX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zZXJpYWxfbnVtYmVyX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfc2VyaWFsX251bWJlciAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3NvbGljaXRlZF9zY2hlZHVsZXJfc2V0X2RlZmF1bHQoYmNtb2x0X3NvbGljaXRlZF9zY2hlZHVsZXIgKnRoaXMpCit7CisgICAgdGhpcy0+YmFuZHdpZHRoX0ticHMgPSAoYmNtb2x0X2JhbmR3aWR0aF9LYnBzKSAwOworICAgIHRoaXMtPm1heF9idXJzdF9zaXplX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICB0aGlzLT5wcmlvcml0eSA9IDA7CisgICAgdGhpcy0+d2VpZ2h0X3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NvbGljaXRlZF9zY2hlZHVsZXJfcGFjayhjb25zdCBiY21vbHRfc29saWNpdGVkX3NjaGVkdWxlciAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMtPmJhbmR3aWR0aF9LYnBzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzLT5tYXhfYnVyc3Rfc2l6ZV90cSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cHJpb3JpdHkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMtPndlaWdodF90cSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zb2xpY2l0ZWRfc2NoZWR1bGVyX3VucGFjayhiY21vbHRfc29saWNpdGVkX3NjaGVkdWxlciAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICh1aW50MzJfdCAqKSAmdGhpcy0+YmFuZHdpZHRoX0ticHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICh1aW50MzJfdCAqKSAmdGhpcy0+bWF4X2J1cnN0X3NpemVfdHEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnByaW9yaXR5KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPndlaWdodF90cSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zb2xpY2l0ZWRfc2NoZWR1bGVyX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc29saWNpdGVkX3NjaGVkdWxlcl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3NvbGljaXRlZF9zY2hlZHVsZXIgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPnByaW9yaXR5ID4gNykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+d2VpZ2h0X3RxID4gKGJjbW9sdF90aW1lX3F1YW50YSkgMjYyMTA2VUwpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnX3NldF9kZWZhdWx0KGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnICp0aGlzKQoreworICAgIHRoaXMtPnR5cGUgPSAoYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGUpIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnX3BhY2soY29uc3QgYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9zdGF0X2NvbmRpdGlvbl90eXBlX3BhY2sodGhpcy0+dHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfVEhSRVNIT0xEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnJhdGVfdGhyZXNob2xkLnJpc2luZykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucmF0ZV90aHJlc2hvbGQuZmFsbGluZykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9SQU5HRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5yYXRlX3JhbmdlLnVwcGVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5yYXRlX3JhbmdlLmxvd2VyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9WQUxVRV9USFJFU0hPTEQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUudmFsdWVfdGhyZXNob2xkLmxpbWl0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZ19nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZyAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgc3dpdGNoICh0aGlzLT50eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfUkFOR0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9WQUxVRV9USFJFU0hPTEQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX05PTkU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWdfdW5wYWNrKGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfc3RhdF9jb25kaXRpb25fdHlwZV91bnBhY2soJnRoaXMtPnR5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT50eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dS5yYXRlX3RocmVzaG9sZC5yaXNpbmcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT51LnJhdGVfdGhyZXNob2xkLmZhbGxpbmcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfUkFOR0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnUucmF0ZV9yYW5nZS51cHBlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnUucmF0ZV9yYW5nZS5sb3dlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfVkFMVUVfVEhSRVNIT0xEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT51LnZhbHVlX3RocmVzaG9sZC5saW1pdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfTk9ORToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZ19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfc3RhdF9jb25kaXRpb25fdHlwZSB0eXBlOworICAgIGlmICghYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGVfdW5wYWNrKCZ0eXBlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9USFJFU0hPTEQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfUkFOR0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1ZBTFVFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX05PTkU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWdfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnICp0aGlzKQoreworICAgIHN3aXRjaCAodGhpcy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9USFJFU0hPTEQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1JBTkdFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfVkFMVUVfVEhSRVNIT0xEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfTk9ORToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfc3RhdF9hbGFybV9zb2FrX2NvbmZpZ19zZXRfZGVmYXVsdChiY21vbHRfc3RhdF9hbGFybV9zb2FrX2NvbmZpZyAqdGhpcykKK3sKKyAgICB0aGlzLT5hY3RpdmVfc29ha190aW1lID0gMDsKKyAgICB0aGlzLT5jbGVhcl9zb2FrX3RpbWUgPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc3RhdF9hbGFybV9zb2FrX2NvbmZpZ19wYWNrKGNvbnN0IGJjbW9sdF9zdGF0X2FsYXJtX3NvYWtfY29uZmlnICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmFjdGl2ZV9zb2FrX3RpbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5jbGVhcl9zb2FrX3RpbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc3RhdF9hbGFybV9zb2FrX2NvbmZpZ191bnBhY2soYmNtb2x0X3N0YXRfYWxhcm1fc29ha19jb25maWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+YWN0aXZlX3NvYWtfdGltZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmNsZWFyX3NvYWtfdGltZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zdGF0X2FsYXJtX3NvYWtfY29uZmlnX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zdGF0X2FsYXJtX3NvYWtfY29uZmlnX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfc3RhdF9hbGFybV9zb2FrX2NvbmZpZyAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3NldF9kZWZhdWx0KGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyAqdGhpcykKK3sKKyAgICB0aGlzLT50cmlnZ2VyLnR5cGUgPSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOworICAgIHRoaXMtPnNvYWsuYWN0aXZlX3NvYWtfdGltZSA9IDA7CisgICAgdGhpcy0+c29hay5jbGVhcl9zb2FrX3RpbWUgPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc3RhdF9hbGFybV9jb25maWdfcGFjayhjb25zdCBiY21vbHRfc3RhdF9hbGFybV9jb25maWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnX3BhY2soJnRoaXMtPnRyaWdnZXIsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9zb2FrX2NvbmZpZ19wYWNrKCZ0aGlzLT5zb2FrLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyAqdGhpcykKK3sKKyAgICByZXR1cm4gOCArIGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT50cmlnZ2VyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3VucGFjayhiY21vbHRfc3RhdF9hbGFybV9jb25maWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnX3VucGFjaygmdGhpcy0+dHJpZ2dlciwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fc29ha19jb25maWdfdW5wYWNrKCZ0aGlzLT5zb2FrLCBidWYsIGV4dHJhX21lbSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnICp0aGlzKQoreworICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWdfYm91bmRzX2NoZWNrKCZ0aGlzLT50cmlnZ2VyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX3NvYWtfY29uZmlnX2JvdW5kc19jaGVjaygmdGhpcy0+c29haykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9zdHJfMTAwX3NldF9kZWZhdWx0KGJjbW9sdF9zdHJfMTAwICp0aGlzKQoreworICAgIG1lbXNldCh0aGlzLT5zdHIsIDAsIDEwMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zdHJfMTAwX3BhY2soY29uc3QgYmNtb2x0X3N0cl8xMDAgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGUoYnVmLCB0aGlzLT5zdHIsIDEwMCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zdHJfMTAwX3VucGFjayhiY21vbHRfc3RyXzEwMCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+c3RyLCAxMDApKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc3RyXzEwMF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEwMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zdHJfMTAwX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfc3RyXzEwMCAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3N0cl8xMDAwX3NldF9kZWZhdWx0KGJjbW9sdF9zdHJfMTAwMCAqdGhpcykKK3sKKyAgICBtZW1zZXQodGhpcy0+c3RyLCAwLCAxMDAwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0cl8xMDAwX3BhY2soY29uc3QgYmNtb2x0X3N0cl8xMDAwICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+c3RyLCAxMDAwKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0cl8xMDAwX3VucGFjayhiY21vbHRfc3RyXzEwMDAgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZChidWYsIHRoaXMtPnN0ciwgMTAwMCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zdHJfMTAwMF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEwMDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc3RyXzEwMDBfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9zdHJfMTAwMCAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3N0cl8yMDAwX3NldF9kZWZhdWx0KGJjbW9sdF9zdHJfMjAwMCAqdGhpcykKK3sKKyAgICBtZW1zZXQodGhpcy0+c3RyLCAwLCAyMDAwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0cl8yMDAwX3BhY2soY29uc3QgYmNtb2x0X3N0cl8yMDAwICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+c3RyLCAyMDAwKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0cl8yMDAwX3VucGFjayhiY21vbHRfc3RyXzIwMDAgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZChidWYsIHRoaXMtPnN0ciwgMjAwMCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zdHJfMjAwMF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIwMDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc3RyXzIwMDBfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9zdHJfMjAwMCAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3N0cl8yNTZfc2V0X2RlZmF1bHQoYmNtb2x0X3N0cl8yNTYgKnRoaXMpCit7CisgICAgbWVtc2V0KHRoaXMtPnN0ciwgMCwgMjU2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0cl8yNTZfcGFjayhjb25zdCBiY21vbHRfc3RyXzI1NiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZShidWYsIHRoaXMtPnN0ciwgMjU2KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0cl8yNTZfdW5wYWNrKGJjbW9sdF9zdHJfMjU2ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWQoYnVmLCB0aGlzLT5zdHIsIDI1NikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zdHJfMjU2X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMjU2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0cl8yNTZfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9zdHJfMjU2ICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfc3RyXzY0X3NldF9kZWZhdWx0KGJjbW9sdF9zdHJfNjQgKnRoaXMpCit7CisgICAgbWVtc2V0KHRoaXMtPnN0ciwgMCwgNjQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc3RyXzY0X3BhY2soY29uc3QgYmNtb2x0X3N0cl82NCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZShidWYsIHRoaXMtPnN0ciwgNjQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc3RyXzY0X3VucGFjayhiY21vbHRfc3RyXzY0ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWQoYnVmLCB0aGlzLT5zdHIsIDY0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0cl82NF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDY0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0cl82NF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3N0cl82NCAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3N3X2Vycm9yX3NldF9kZWZhdWx0KGJjbW9sdF9zd19lcnJvciAqdGhpcykKK3sKKyAgICB0aGlzLT5maXJzdF9lcnJvcl90aW1lX3VzID0gMDsKKyAgICB0aGlzLT5sYXN0X2Vycm9yX3RpbWVfdXMgPSAwOworICAgIHRoaXMtPmxpbmVfbnVtYmVyID0gMDsKKyAgICB0aGlzLT5lcnJvcl9jb3VudGVyID0gMDsKKyAgICB0aGlzLT5pbnN0YW5jZSA9IDA7CisgICAgbWVtc2V0KHRoaXMtPmZpbGVuYW1lLCAwLCA2NCk7CisgICAgbWVtc2V0KHRoaXMtPnRhc2tfbmFtZSwgMCwgNjQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc3dfZXJyb3JfcGFjayhjb25zdCBiY21vbHRfc3dfZXJyb3IgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+Zmlyc3RfZXJyb3JfdGltZV91cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmxhc3RfZXJyb3JfdGltZV91cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmxpbmVfbnVtYmVyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+ZXJyb3JfY291bnRlcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmluc3RhbmNlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGUoYnVmLCB0aGlzLT5maWxlbmFtZSwgNjQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZShidWYsIHRoaXMtPnRhc2tfbmFtZSwgNjQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc3dfZXJyb3JfdW5wYWNrKGJjbW9sdF9zd19lcnJvciAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5maXJzdF9lcnJvcl90aW1lX3VzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+bGFzdF9lcnJvcl90aW1lX3VzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+bGluZV9udW1iZXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5lcnJvcl9jb3VudGVyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+aW5zdGFuY2UpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+ZmlsZW5hbWUsIDY0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZChidWYsIHRoaXMtPnRhc2tfbmFtZSwgNjQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc3dfZXJyb3Jfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAxNTYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc3dfZXJyb3JfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9zd19lcnJvciAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3N5c3RlbV9wcm9maWxlX3NldF9kZWZhdWx0KGJjbW9sdF9zeXN0ZW1fcHJvZmlsZSAqdGhpcykKK3sKKyAgICB0aGlzLT5uZ18yX3N5c19pZCA9IDA7CisgICAgdGhpcy0+dmVyc2lvbiA9IDA7CisgICAgdGhpcy0+Y2hhbm5lbF9zcGFjaW5nID0gMDsKKyAgICB0aGlzLT51c19vcGVyYXRpbmdfd2F2ZWxlbmd0aF9iYW5kcyA9IEJDTU9MVF9VU19PUEVSQVRJTkdfV0FWRUxFTkdUSF9CQU5EU19FWFBBTkRFRF9TUEVDVFJVTV9XSURFX0JBTkQ7CisgICAgdGhpcy0+dXNfbXNlID0gMDsKKyAgICB0aGlzLT5sb29zZV9jYWxpYnJhdGlvbl9ib3VuZCA9IEJDTU9MVF9DQUxJQlJBVElPTl9SRUNPUkRfVU5TUEVDSUZJRUQ7CisgICAgdGhpcy0+ZnNyID0gMDsKKyAgICB0aGlzLT50d2RtX2NoYW5uZWxfY291bnQgPSA4OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc3lzdGVtX3Byb2ZpbGVfcGFjayhjb25zdCBiY21vbHRfc3lzdGVtX3Byb2ZpbGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+bmdfMl9zeXNfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnZlcnNpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmNoYW5uZWxfc3BhY2luZykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfdXNfb3BlcmF0aW5nX3dhdmVsZW5ndGhfYmFuZHNfcGFjayh0aGlzLT51c19vcGVyYXRpbmdfd2F2ZWxlbmd0aF9iYW5kcywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51c19tc2UpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2NhbGlicmF0aW9uX3JlY29yZF9wYWNrKHRoaXMtPmxvb3NlX2NhbGlicmF0aW9uX2JvdW5kLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5mc3IpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnR3ZG1fY2hhbm5lbF9jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zeXN0ZW1fcHJvZmlsZV91bnBhY2soYmNtb2x0X3N5c3RlbV9wcm9maWxlICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPm5nXzJfc3lzX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT52ZXJzaW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5jaGFubmVsX3NwYWNpbmcpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3VzX29wZXJhdGluZ193YXZlbGVuZ3RoX2JhbmRzX3VucGFjaygmdGhpcy0+dXNfb3BlcmF0aW5nX3dhdmVsZW5ndGhfYmFuZHMsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dXNfbXNlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9jYWxpYnJhdGlvbl9yZWNvcmRfdW5wYWNrKCZ0aGlzLT5sb29zZV9jYWxpYnJhdGlvbl9ib3VuZCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+ZnNyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT50d2RtX2NoYW5uZWxfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc3lzdGVtX3Byb2ZpbGVfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAxMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zeXN0ZW1fcHJvZmlsZV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3N5c3RlbV9wcm9maWxlICp0aGlzKQoreworICAgIGlmICh0aGlzLT5uZ18yX3N5c19pZCA+IDEwNDg1NzVVTCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+dmVyc2lvbiA+IDE1KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+dXNfb3BlcmF0aW5nX3dhdmVsZW5ndGhfYmFuZHMpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9VU19PUEVSQVRJTkdfV0FWRUxFTkdUSF9CQU5EU19FWFBBTkRFRF9TUEVDVFJVTV9XSURFX0JBTkQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfVVNfT1BFUkFUSU5HX1dBVkVMRU5HVEhfQkFORFNfRVhQQU5ERURfU1BFQ1RSVU1fUkVEVUNFRF9CQU5EOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1VTX09QRVJBVElOR19XQVZFTEVOR1RIX0JBTkRTX0VYUEFOREVEX1NQRUNUUlVNX05BUlJPV19CQU5EOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1VTX09QRVJBVElOR19XQVZFTEVOR1RIX0JBTkRTX1NIQVJFRF9TUEVDVFJVTV9XSURFX0JBTkQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfVVNfT1BFUkFUSU5HX1dBVkVMRU5HVEhfQkFORFNfU0hBUkVEX1NQRUNUUlVNX1JFRFVDRURfQkFORDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9VU19PUEVSQVRJTkdfV0FWRUxFTkdUSF9CQU5EU19TSEFSRURfU1BFQ1RSVU1fTkFSUk9XX0JBTkQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmxvb3NlX2NhbGlicmF0aW9uX2JvdW5kKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfQ0FMSUJSQVRJT05fUkVDT1JEX1VOU1BFQ0lGSUVEOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0NBTElCUkFUSU9OX1JFQ09SRF9VTkNBTElCUkFURUQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQ0FMSUJSQVRJT05fUkVDT1JEX0xPT1NFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0NBTElCUkFUSU9OX1JFQ09SRF9TVUZGSUNJRU5UOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPnR3ZG1fY2hhbm5lbF9jb3VudCA+IDE1KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfdHJ4X2RlbGltaXRlcl9zZXRfZGVmYXVsdChiY21vbHRfdHJ4X2RlbGltaXRlciAqdGhpcykKK3sKKyAgICB0aGlzLT5wYXR0ZXJuWzBdID0gMTcxOworICAgIHRoaXMtPnBhdHRlcm5bMV0gPSA4OTsKKyAgICB0aGlzLT5wYXR0ZXJuWzJdID0gMTMxOworICAgIHRoaXMtPnNpemUgPSAzOworICAgIHRoaXMtPndpbmRvd19zaXplID0gMTI0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2RlbGltaXRlcl9wYWNrKGNvbnN0IGJjbW9sdF90cnhfZGVsaW1pdGVyICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+cGF0dGVybiwgMykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+c2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+d2luZG93X3NpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2RlbGltaXRlcl91bnBhY2soYmNtb2x0X3RyeF9kZWxpbWl0ZXIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZChidWYsIHRoaXMtPnBhdHRlcm4sIDMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnNpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPndpbmRvd19zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9kZWxpbWl0ZXJfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCA1KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9kZWxpbWl0ZXJfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF90cnhfZGVsaW1pdGVyICp0aGlzKQoreworICAgIGlmICh0aGlzLT53aW5kb3dfc2l6ZSA8IDIpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF90cnhfZW5lcmd5X2RldGVjdF9zZXRfZGVmYXVsdChiY21vbHRfdHJ4X2VuZXJneV9kZXRlY3QgKnRoaXMpCit7CisgICAgdGhpcy0+cmFuZ2luZ19lZF9zb3VyY2UgPSBCQ01PTFRfRU5FUkdZX0RFVEVDVF9TT1VSQ0VfVFJYOworICAgIHRoaXMtPmRlbGltaXRlcl9lZF9zb3VyY2UgPSBCQ01PTFRfRU5FUkdZX0RFVEVDVF9TT1VSQ0VfVFJYOworICAgIHRoaXMtPm1pbmltdW1fdGhyZXNob2xkID0gMDsKKyAgICB0aGlzLT5tYXhpbXVtX3RocmVzaG9sZCA9IDQxOworICAgIHRoaXMtPmVkX3BhdHRlcm4gPSAxNzA7CisgICAgdGhpcy0+ZWRfcGF0dGVybl9zaXplID0gMDsKKyAgICB0aGlzLT53aW5kb3dfc2l6ZSA9IDEyNDsKKyAgICB0aGlzLT5pbnZlcnNpb24gPSBCQ01PU19GQUxTRTsKKyAgICB0aGlzLT5ub19lZF90aHJlc2hvbGQgPSAxMjc7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF90cnhfZW5lcmd5X2RldGVjdF9wYWNrKGNvbnN0IGJjbW9sdF90cnhfZW5lcmd5X2RldGVjdCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2VuZXJneV9kZXRlY3Rfc291cmNlX3BhY2sodGhpcy0+cmFuZ2luZ19lZF9zb3VyY2UsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZW5lcmd5X2RldGVjdF9zb3VyY2VfcGFjayh0aGlzLT5kZWxpbWl0ZXJfZWRfc291cmNlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPm1pbmltdW1fdGhyZXNob2xkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5tYXhpbXVtX3RocmVzaG9sZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+ZWRfcGF0dGVybikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+ZWRfcGF0dGVybl9zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT53aW5kb3dfc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5pbnZlcnNpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPm5vX2VkX3RocmVzaG9sZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF90cnhfZW5lcmd5X2RldGVjdF91bnBhY2soYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZW5lcmd5X2RldGVjdF9zb3VyY2VfdW5wYWNrKCZ0aGlzLT5yYW5naW5nX2VkX3NvdXJjZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lbmVyZ3lfZGV0ZWN0X3NvdXJjZV91bnBhY2soJnRoaXMtPmRlbGltaXRlcl9lZF9zb3VyY2UsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bWluaW11bV90aHJlc2hvbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPm1heGltdW1fdGhyZXNob2xkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5lZF9wYXR0ZXJuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5lZF9wYXR0ZXJuX3NpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPndpbmRvd19zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmludmVyc2lvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bm9fZWRfdGhyZXNob2xkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF90cnhfZW5lcmd5X2RldGVjdF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0ICp0aGlzKQoreworICAgIHN3aXRjaCAodGhpcy0+cmFuZ2luZ19lZF9zb3VyY2UpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FTkVSR1lfREVURUNUX1NPVVJDRV9JTlRFUk5BTDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FTkVSR1lfREVURUNUX1NPVVJDRV9UUlg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRU5FUkdZX0RFVEVDVF9TT1VSQ0VfQkNEUjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+ZGVsaW1pdGVyX2VkX3NvdXJjZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VORVJHWV9ERVRFQ1RfU09VUkNFX0lOVEVSTkFMOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VORVJHWV9ERVRFQ1RfU09VUkNFX1RSWDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FTkVSR1lfREVURUNUX1NPVVJDRV9CQ0RSOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPndpbmRvd19zaXplIDwgMikKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3RyeF9wcmVhbWJsZV9zZXRfZGVmYXVsdChiY21vbHRfdHJ4X3ByZWFtYmxlICp0aGlzKQoreworICAgIHRoaXMtPnR5cGVfMV9zaXplID0gMDsKKyAgICB0aGlzLT50eXBlXzJfc2l6ZSA9IDA7CisgICAgdGhpcy0+dHlwZV8zX3ByZV9yYW5naW5nX3NpemUgPSA1MDsKKyAgICB0aGlzLT50eXBlXzNfcG9zdF9yYW5naW5nX3NpemUgPSAxNTsKKyAgICB0aGlzLT50eXBlXzNfcGF0dGVybiA9IDE3MDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9wcmVhbWJsZV9wYWNrKGNvbnN0IGJjbW9sdF90cnhfcHJlYW1ibGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT50eXBlXzFfc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dHlwZV8yX3NpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnR5cGVfM19wcmVfcmFuZ2luZ19zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT50eXBlXzNfcG9zdF9yYW5naW5nX3NpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnR5cGVfM19wYXR0ZXJuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9wcmVhbWJsZV91bnBhY2soYmNtb2x0X3RyeF9wcmVhbWJsZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnR5cGVfMV9zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT50eXBlXzJfc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dHlwZV8zX3ByZV9yYW5naW5nX3NpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnR5cGVfM19wb3N0X3Jhbmdpbmdfc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dHlwZV8zX3BhdHRlcm4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X3ByZWFtYmxlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF90cnhfcHJlYW1ibGVfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF90cnhfcHJlYW1ibGUgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPnR5cGVfM19wb3N0X3Jhbmdpbmdfc2l6ZSA8IDUpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPnR5cGVfM19wb3N0X3Jhbmdpbmdfc2l6ZSA+IDEyMCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3RyeF9yeF9jb25maWd1cmF0aW9uX3NldF9kZWZhdWx0KGJjbW9sdF90cnhfcnhfY29uZmlndXJhdGlvbiAqdGhpcykKK3sKKyAgICB0aGlzLT53YWl0X3dpbmRvd19zaXplID0gMDsKKyAgICB0aGlzLT5yYW5naW5nX2FjY2Vzc193aW5kb3dfc2l6ZSA9IDE1OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X3J4X2NvbmZpZ3VyYXRpb25fcGFjayhjb25zdCBiY21vbHRfdHJ4X3J4X2NvbmZpZ3VyYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT53YWl0X3dpbmRvd19zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5yYW5naW5nX2FjY2Vzc193aW5kb3dfc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF90cnhfcnhfY29uZmlndXJhdGlvbl91bnBhY2soYmNtb2x0X3RyeF9yeF9jb25maWd1cmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+d2FpdF93aW5kb3dfc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+cmFuZ2luZ19hY2Nlc3Nfd2luZG93X3NpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X3J4X2NvbmZpZ3VyYXRpb25fc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9yeF9jb25maWd1cmF0aW9uX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfdHJ4X3J4X2NvbmZpZ3VyYXRpb24gKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPnJhbmdpbmdfYWNjZXNzX3dpbmRvd19zaXplIDwgNykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3UzMl9saXN0X3UzMl9tYXhfNTAwX2hleF9zZXRfZGVmYXVsdChiY21vbHRfdTMyX2xpc3RfdTMyX21heF81MDBfaGV4ICp0aGlzKQoreworICAgIHRoaXMtPmxlbiA9IDA7CisgICAgdGhpcy0+dmFsID0gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3UzMl9saXN0X3UzMl9tYXhfNTAwX2hleF9wYWNrKGNvbnN0IGJjbW9sdF91MzJfbGlzdF91MzJfbWF4XzUwMF9oZXggKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+bGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbiA+IDApICYmICh0aGlzLT52YWwgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsXCIgb2Ygc3RydWN0IFwiYmNtb2x0X3UzMl9saXN0X3UzMl9tYXhfNTAwX2hleFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+bGVuID4gNTAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmxlbjsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT52YWxbaTBdKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfdTMyX2xpc3RfdTMyX21heF81MDBfaGV4X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF91MzJfbGlzdF91MzJfbWF4XzUwMF9oZXggKnRoaXMpCit7CisgICAgcmV0dXJuIDQgKyAoNCAqIHRoaXMtPmxlbik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF91MzJfbGlzdF91MzJfbWF4XzUwMF9oZXhfdW5wYWNrKGJjbW9sdF91MzJfbGlzdF91MzJfbWF4XzUwMF9oZXggKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MzJfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+bGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbiA+IDApICYmICh0aGlzLT52YWwgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfdTMyX2xpc3RfdTMyX21heF81MDBfaGV4XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnZhbCA9ICh1aW50MzJfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+bGVuICogc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodGhpcy0+bGVuID4gNTAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmxlbjsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT52YWxbaTBdKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF91MzJfbGlzdF91MzJfbWF4XzUwMF9oZXhfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDMyX3QgbGVuOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihwYWNrZWQsICZsZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDMyX3QpICogbGVuKTsKKyAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIGxlbiAqIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdTMyX2xpc3RfdTMyX21heF81MDBfaGV4X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfdTMyX2xpc3RfdTMyX21heF81MDBfaGV4ICp0aGlzKQoreworICAgIGlmICh0aGlzLT5sZW4gPiA1MDApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF91OF9saXN0X3UxNl9oZXhfc2V0X2RlZmF1bHQoYmNtb2x0X3U4X2xpc3RfdTE2X2hleCAqdGhpcykKK3sKKyAgICB0aGlzLT5sZW4gPSAwOworICAgIHRoaXMtPnZhbCA9IE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF91OF9saXN0X3UxNl9oZXhfcGFjayhjb25zdCBiY21vbHRfdThfbGlzdF91MTZfaGV4ICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF91OF9saXN0X3UxNl9oZXhcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dmFsLCB0aGlzLT5sZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3U4X2xpc3RfdTE2X2hleF9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfdThfbGlzdF91MTZfaGV4ICp0aGlzKQoreworICAgIHJldHVybiAyICsgdGhpcy0+bGVuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdThfbGlzdF91MTZfaGV4X3VucGFjayhiY21vbHRfdThfbGlzdF91MTZfaGV4ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsXCIgb2Ygc3RydWN0IFwiYmNtb2x0X3U4X2xpc3RfdTE2X2hleFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT52YWwgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+bGVuICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dmFsLCB0aGlzLT5sZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdThfbGlzdF91MTZfaGV4X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IGxlbjsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYocGFja2VkLCAmbGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogbGVuKTsKKyAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIGxlbiAqIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdThfbGlzdF91MTZfaGV4X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfdThfbGlzdF91MTZfaGV4ICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfdThfbGlzdF91MzJfc2V0X2RlZmF1bHQoYmNtb2x0X3U4X2xpc3RfdTMyICp0aGlzKQoreworICAgIHRoaXMtPmxlbiA9IDA7CisgICAgdGhpcy0+dmFsID0gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3U4X2xpc3RfdTMyX3BhY2soY29uc3QgYmNtb2x0X3U4X2xpc3RfdTMyICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF91OF9saXN0X3UzMlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGUoYnVmLCB0aGlzLT52YWwsIHRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfdThfbGlzdF91MzJfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3U4X2xpc3RfdTMyICp0aGlzKQoreworICAgIHJldHVybiA0ICsgdGhpcy0+bGVuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdThfbGlzdF91MzJfdW5wYWNrKGJjbW9sdF91OF9saXN0X3UzMiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5sZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bGVuID4gMCkgJiYgKHRoaXMtPnZhbCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF91OF9saXN0X3UzMlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT52YWwgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+bGVuICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dmFsLCB0aGlzLT5sZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdThfbGlzdF91MzJfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDMyX3QgbGVuOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihwYWNrZWQsICZsZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiBsZW4pOworICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgbGVuICogMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF91OF9saXN0X3UzMl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3U4X2xpc3RfdTMyICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDhfc2V0X2RlZmF1bHQoYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4ICp0aGlzKQoreworICAgIHRoaXMtPmxlbiA9IDA7CisgICAgdGhpcy0+dmFsID0gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4X3BhY2soY29uc3QgYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4ICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+bGVuID4gMjA0OCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGUoYnVmLCB0aGlzLT52YWwsIHRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDhfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4ICp0aGlzKQoreworICAgIHJldHVybiA0ICsgdGhpcy0+bGVuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDhfdW5wYWNrKGJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5sZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bGVuID4gMCkgJiYgKHRoaXMtPnZhbCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT52YWwgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+bGVuICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0aGlzLT5sZW4gPiAyMDQ4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dmFsLCB0aGlzLT5sZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDhfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDMyX3QgbGVuOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihwYWNrZWQsICZsZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiBsZW4pOworICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgbGVuICogMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4ICp0aGlzKQoreworICAgIGlmICh0aGlzLT5sZW4gPiAyMDQ4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfdWJkX2luZm9fc2V0X2RlZmF1bHQoYmNtb2x0X3ViZF9pbmZvICp0aGlzKQoreworICAgIHRoaXMtPmFjdHVhbF9wb2xsaW5nX2ludGVydmFsID0gMDsKKyAgICB0aGlzLT5hY3R1YWxfZ3JhbnRfdGhyZXNob2xkX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICB0aGlzLT5hY3R1YWxfbWluX3NjaGVkdWxlcnNoYXBlci5hY3R1YWxfbWJzX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICB0aGlzLT5hY3R1YWxfbWluX3NjaGVkdWxlcnNoYXBlci5hY3R1YWxfd2VpZ2h0X3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICB0aGlzLT5hY3R1YWxfbWF4X3NjaGVkdWxlcnNoYXBlci5hY3R1YWxfbWJzX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICB0aGlzLT5hY3R1YWxfbWF4X3NjaGVkdWxlcnNoYXBlci5hY3R1YWxfd2VpZ2h0X3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3ViZF9pbmZvX3BhY2soY29uc3QgYmNtb2x0X3ViZF9pbmZvICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmFjdHVhbF9wb2xsaW5nX2ludGVydmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzLT5hY3R1YWxfZ3JhbnRfdGhyZXNob2xkX3RxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9hY3R1YWxfc2NoZWR1bGVyc2hhcGVyX3BhY2soJnRoaXMtPmFjdHVhbF9taW5fc2NoZWR1bGVyc2hhcGVyLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2FjdHVhbF9zY2hlZHVsZXJzaGFwZXJfcGFjaygmdGhpcy0+YWN0dWFsX21heF9zY2hlZHVsZXJzaGFwZXIsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF91YmRfaW5mb191bnBhY2soYmNtb2x0X3ViZF9pbmZvICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmFjdHVhbF9wb2xsaW5nX2ludGVydmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPmFjdHVhbF9ncmFudF90aHJlc2hvbGRfdHEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2FjdHVhbF9zY2hlZHVsZXJzaGFwZXJfdW5wYWNrKCZ0aGlzLT5hY3R1YWxfbWluX3NjaGVkdWxlcnNoYXBlciwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2FjdHVhbF9zY2hlZHVsZXJzaGFwZXJfdW5wYWNrKCZ0aGlzLT5hY3R1YWxfbWF4X3NjaGVkdWxlcnNoYXBlciwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdWJkX2luZm9fc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAyMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF91YmRfaW5mb19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3ViZF9pbmZvICp0aGlzKQoreworICAgIGlmICghYmNtb2x0X2FjdHVhbF9zY2hlZHVsZXJzaGFwZXJfYm91bmRzX2NoZWNrKCZ0aGlzLT5hY3R1YWxfbWluX3NjaGVkdWxlcnNoYXBlcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYWN0dWFsX3NjaGVkdWxlcnNoYXBlcl9ib3VuZHNfY2hlY2soJnRoaXMtPmFjdHVhbF9tYXhfc2NoZWR1bGVyc2hhcGVyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb25fc2V0X2RlZmF1bHQoYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb24gKnRoaXMpCit7CisgICAgdGhpcy0+cG9sbGluZ19pbnRlcnZhbF91cyA9IEJDTU9MVF9QT0xMSU5HX0lOVEVSVkFMX0FVVE9NQVRJQzsKKyAgICB0aGlzLT5ncmFudF90aHJlc2hvbGRfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSAwOworICAgIHRoaXMtPm1pbl9zY2hlZHVsZXJzaGFwZXIuYmFuZHdpZHRoX0ticHMgPSAoYmNtb2x0X2JhbmR3aWR0aF9LYnBzKSAwOworICAgIHRoaXMtPm1pbl9zY2hlZHVsZXJzaGFwZXIubWF4X2J1cnN0X3NpemVfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSAwOworICAgIHRoaXMtPm1pbl9zY2hlZHVsZXJzaGFwZXIucHJpb3JpdHkgPSAwOworICAgIHRoaXMtPm1pbl9zY2hlZHVsZXJzaGFwZXIud2VpZ2h0X3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICB0aGlzLT5tYXhfc2NoZWR1bGVyc2hhcGVyLmJhbmR3aWR0aF9LYnBzID0gKGJjbW9sdF9iYW5kd2lkdGhfS2JwcykgMDsKKyAgICB0aGlzLT5tYXhfc2NoZWR1bGVyc2hhcGVyLm1heF9idXJzdF9zaXplX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICB0aGlzLT5tYXhfc2NoZWR1bGVyc2hhcGVyLnByaW9yaXR5ID0gMDsKKyAgICB0aGlzLT5tYXhfc2NoZWR1bGVyc2hhcGVyLndlaWdodF90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIDA7CisgICAgdGhpcy0+dGRtX2dyYW50X3NpemVfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSAwOworICAgIHRoaXMtPnRkbV9ncmFudF9pbnRlcnZhbF91cyA9IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF91cHN0cmVhbV9iYW5kd2lkdGhfZGlzdHJpYnV0aW9uX3BhY2soY29uc3QgYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9wb2xsaW5nX2ludGVydmFsX3BhY2sodGhpcy0+cG9sbGluZ19pbnRlcnZhbF91cywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzLT5ncmFudF90aHJlc2hvbGRfdHEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3NvbGljaXRlZF9zY2hlZHVsZXJfcGFjaygmdGhpcy0+bWluX3NjaGVkdWxlcnNoYXBlciwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zb2xpY2l0ZWRfc2NoZWR1bGVyX3BhY2soJnRoaXMtPm1heF9zY2hlZHVsZXJzaGFwZXIsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcy0+dGRtX2dyYW50X3NpemVfdHEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT50ZG1fZ3JhbnRfaW50ZXJ2YWxfdXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdXBzdHJlYW1fYmFuZHdpZHRoX2Rpc3RyaWJ1dGlvbl91bnBhY2soYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9wb2xsaW5nX2ludGVydmFsX3VucGFjaygmdGhpcy0+cG9sbGluZ19pbnRlcnZhbF91cywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPmdyYW50X3RocmVzaG9sZF90cSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc29saWNpdGVkX3NjaGVkdWxlcl91bnBhY2soJnRoaXMtPm1pbl9zY2hlZHVsZXJzaGFwZXIsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zb2xpY2l0ZWRfc2NoZWR1bGVyX3VucGFjaygmdGhpcy0+bWF4X3NjaGVkdWxlcnNoYXBlciwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICh1aW50MzJfdCAqKSAmdGhpcy0+dGRtX2dyYW50X3NpemVfdHEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT50ZG1fZ3JhbnRfaW50ZXJ2YWxfdXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdXBzdHJlYW1fYmFuZHdpZHRoX2Rpc3RyaWJ1dGlvbl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb25fYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF91cHN0cmVhbV9iYW5kd2lkdGhfZGlzdHJpYnV0aW9uICp0aGlzKQoreworICAgIHN3aXRjaCAodGhpcy0+cG9sbGluZ19pbnRlcnZhbF91cykKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1BPTExJTkdfSU5URVJWQUxfUE9MTElOR19ESVNBQkxFRDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9QT0xMSU5HX0lOVEVSVkFMX1VTXzUwMDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9QT0xMSU5HX0lOVEVSVkFMX01TXzE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfUE9MTElOR19JTlRFUlZBTF9NU18yOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1BPTExJTkdfSU5URVJWQUxfTVNfNDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9QT0xMSU5HX0lOVEVSVkFMX01TXzg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfUE9MTElOR19JTlRFUlZBTF9NU18xNjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9QT0xMSU5HX0lOVEVSVkFMX0FVVE9NQVRJQzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5ncmFudF90aHJlc2hvbGRfdHEgPiAoYmNtb2x0X3RpbWVfcXVhbnRhKSA2NTQwOFVMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3NvbGljaXRlZF9zY2hlZHVsZXJfYm91bmRzX2NoZWNrKCZ0aGlzLT5taW5fc2NoZWR1bGVyc2hhcGVyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zb2xpY2l0ZWRfc2NoZWR1bGVyX2JvdW5kc19jaGVjaygmdGhpcy0+bWF4X3NjaGVkdWxlcnNoYXBlcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPnRkbV9ncmFudF9zaXplX3RxID4gKGJjbW9sdF90aW1lX3F1YW50YSkgNjU0MDhVTCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+dGRtX2dyYW50X2ludGVydmFsX3VzID4gNTAwMDBVTCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3ZsYW5fdGFnX3NldF9kZWZhdWx0KGJjbW9sdF92bGFuX3RhZyAqdGhpcykKK3sKKyAgICB0aGlzLT52bGFuX2lkID0gKGJjbW9sdF92bGFuX2lkKSAwOworICAgIHRoaXMtPnBiaXQgPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdmxhbl90YWdfcGFjayhjb25zdCBiY21vbHRfdmxhbl90YWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT52bGFuX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5wYml0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3ZsYW5fdGFnX3VucGFjayhiY21vbHRfdmxhbl90YWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPnZsYW5faWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnBiaXQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdmxhbl90YWdfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3ZsYW5fdGFnX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfdmxhbl90YWcgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPnZsYW5faWQgPiAoYmNtb2x0X3ZsYW5faWQpIDQwOTUpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPnBiaXQgPiA3KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fYWxsb2Nfd2l0aF9zdGF0ZV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fYWxsb2Nfd2l0aF9zdGF0ZSAqdGhpcykKK3sKKyAgICB0aGlzLT5hbGxvY19pZCA9IChiY21vbHRfeGdwb25fYWxsb2NfaWQpIDA7CisgICAgdGhpcy0+c3RhdGUgPSBCQ01PTFRfQUxMT0NfU1RBVEVfTk9UX0NPTkZJR1VSRUQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5hbGxvY19pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYWxsb2Nfc3RhdGVfcGFjayh0aGlzLT5zdGF0ZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfdW5wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5hbGxvY19pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYWxsb2Nfc3RhdGVfdW5wYWNrKCZ0aGlzLT5zdGF0ZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlICp0aGlzKQoreworICAgIGlmICh0aGlzLT5hbGxvY19pZCA+IChiY21vbHRfeGdwb25fYWxsb2NfaWQpIDE2MzgzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+c3RhdGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9BTExPQ19TVEFURV9OT1RfQ09ORklHVVJFRDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BTExPQ19TVEFURV9JTkFDVElWRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BTExPQ19TVEFURV9QUk9DRVNTSU5HOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FMTE9DX1NUQVRFX0FDVElWRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzJfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyICp0aGlzKQoreworICAgIHRoaXMtPmxlbiA9IDA7CisgICAgdGhpcy0+dmFsID0gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgaTA7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+bGVuID4gMzIpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bGVuOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fYWxsb2Nfd2l0aF9zdGF0ZV9wYWNrKCZ0aGlzLT52YWxbaTBdLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMl9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzIgKnRoaXMpCit7CisgICAgcmV0dXJuIDIgKyAoMyAqIHRoaXMtPmxlbik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMl91bnBhY2soYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgaTA7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsXCIgb2Ygc3RydWN0IFwiYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnZhbCA9IChiY21vbHRfeGdwb25fYWxsb2Nfd2l0aF9zdGF0ZSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+bGVuICogc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodGhpcy0+bGVuID4gMzIpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bGVuOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fYWxsb2Nfd2l0aF9zdGF0ZV91bnBhY2soJnRoaXMtPnZhbFtpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MTZfdCBsZW47CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfd2l0aF9zdGF0ZSkgKiBsZW4pOworICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgbGVuICogMykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyICp0aGlzKQoreworICAgIGlmICh0aGlzLT5sZW4gPiAzMikKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2VkX3N0YXRlX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9lZF9zdGF0ZSAqdGhpcykKK3sKKyAgICB0aGlzLT5yZXNldF9vbl9lZF9mYWlsID0gQkNNT1NfRkFMU0U7CisgICAgdGhpcy0+cmVzZXRfb25fZWRfc3VjY2VzcyA9IEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9lZF9zdGF0ZV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9lZF9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+cmVzZXRfb25fZWRfZmFpbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5yZXNldF9vbl9lZF9zdWNjZXNzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2VkX3N0YXRlX3VucGFjayhiY21vbHRfeGdwb25fZWRfc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnJlc2V0X29uX2VkX2ZhaWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+cmVzZXRfb25fZWRfc3VjY2VzcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9lZF9zdGF0ZV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZWRfc3RhdGVfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9lZF9zdGF0ZSAqdGhpcykKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNl9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2ICp0aGlzKQoreworICAgIHRoaXMtPmxlbiA9IDA7CisgICAgdGhpcy0+dmFsID0gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNl9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTYgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF94Z3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTZcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmxlbiA+IDE2KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmxlbjsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPnZhbFtpMF0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTZfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNiAqdGhpcykKK3sKKyAgICByZXR1cm4gMSArICgyICogdGhpcy0+bGVuKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNl91bnBhY2soYmNtb2x0X3hncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbiA+IDApICYmICh0aGlzLT52YWwgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfeGdwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnZhbCA9IChiY21vbHRfeGdwb25fZ2VtX2lkICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5sZW4gKiBzaXplb2YoYmNtb2x0X3hncG9uX2dlbV9pZCkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHRoaXMtPmxlbiA+IDE2KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmxlbjsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+dmFsW2kwXSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgbGVuOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfeGdwb25fZ2VtX2lkKSAqIGxlbik7CisgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCBsZW4gKiAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNiAqdGhpcykKK3sKKyAgICBpZiAodGhpcy0+bGVuID4gMTYpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlICp0aGlzKQoreworICAgIHRoaXMtPmdlbV9pZCA9IChiY21vbHRfeGdwb25fZ2VtX2lkKSAwOworICAgIHRoaXMtPnN0YXRlID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRFX05PVF9DT05GSUdVUkVEOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+Z2VtX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0ZV9wYWNrKHRoaXMtPnN0YXRlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV91bnBhY2soYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPmdlbV9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdGVfdW5wYWNrKCZ0aGlzLT5zdGF0ZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlICp0aGlzKQoreworICAgIGlmICh0aGlzLT5nZW1faWQgPiAoYmNtb2x0X3hncG9uX2dlbV9pZCkgNjU1MzNVKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+c3RhdGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFURV9OT1RfQ09ORklHVVJFRDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFURV9JTkFDVElWRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFURV9BQ1RJVkU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOF9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4ICp0aGlzKQoreworICAgIHRoaXMtPmxlbiA9IDA7CisgICAgdGhpcy0+dmFsID0gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOF9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjggKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbiA+IDApICYmICh0aGlzLT52YWwgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsXCIgb2Ygc3RydWN0IFwiYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+bGVuID4gMTI4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmxlbjsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfcGFjaygmdGhpcy0+dmFsW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjggKnRoaXMpCit7CisgICAgcmV0dXJuIDIgKyAoMyAqIHRoaXMtPmxlbik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjhfdW5wYWNrKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjggKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MTZfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbiA+IDApICYmICh0aGlzLT52YWwgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnZhbCA9IChiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+bGVuICogc2l6ZW9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodGhpcy0+bGVuID4gMTI4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmxlbjsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfdW5wYWNrKCZ0aGlzLT52YWxbaTBdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IGxlbjsKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYocGFja2VkLCAmbGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlKSAqIGxlbik7CisgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCBsZW4gKiAzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCAqdGhpcykKK3sKKyAgICBpZiAodGhpcy0+bGVuID4gMTI4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2X3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTYgKnRoaXMpCit7CisgICAgdGhpcy0+bGVuID0gMDsKKyAgICB0aGlzLT52YWwgPSBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2X3BhY2soY29uc3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1NiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IGkwOworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5sZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bGVuID4gMCkgJiYgKHRoaXMtPnZhbCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5sZW4gPiAyNTYpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bGVuOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9wYWNrKCZ0aGlzLT52YWxbaTBdLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTZfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1NiAqdGhpcykKK3sKKyAgICByZXR1cm4gMiArICgzICogdGhpcy0+bGVuKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1Nl91bnBhY2soYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1NiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IGkwOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5sZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bGVuID4gMCkgJiYgKHRoaXMtPnZhbCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTZcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+dmFsID0gKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5sZW4gKiBzaXplb2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0aGlzLT5sZW4gPiAyNTYpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bGVuOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV91bnBhY2soJnRoaXMtPnZhbFtpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTZfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgbGVuOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihwYWNrZWQsICZsZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGUpICogbGVuKTsKKyAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIGxlbiAqIDMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2ICp0aGlzKQoreworICAgIGlmICh0aGlzLT5sZW4gPiAyNTYpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9rZXlfZXhjaGFuZ2Vfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX2tleV9leGNoYW5nZSAqdGhpcykKK3sKKyAgICB0aGlzLT5pbnRlcnZhbCA9IDEwMDAwOworICAgIHRoaXMtPmNvbnRyb2wgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOworICAgIHRoaXMtPmVuY3J5cHRlZF9wb3J0c19vbmx5ID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2tleV9leGNoYW5nZV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9rZXlfZXhjaGFuZ2UgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+aW50ZXJ2YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfcGFjayh0aGlzLT5jb250cm9sLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfcGFjayh0aGlzLT5lbmNyeXB0ZWRfcG9ydHNfb25seSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2tleV9leGNoYW5nZV91bnBhY2soYmNtb2x0X3hncG9uX2tleV9leGNoYW5nZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5pbnRlcnZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfY29udHJvbF9zdGF0ZV91bnBhY2soJnRoaXMtPmNvbnRyb2wsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfY29udHJvbF9zdGF0ZV91bnBhY2soJnRoaXMtPmVuY3J5cHRlZF9wb3J0c19vbmx5LCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fa2V5X2V4Y2hhbmdlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9rZXlfZXhjaGFuZ2VfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9rZXlfZXhjaGFuZ2UgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPmludGVydmFsIDwgMTAwMDApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmludGVydmFsID4gMzYwMDAwMFVMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+Y29udHJvbCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9DT05UUk9MX1NUQVRFX0VOQUJMRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+ZW5jcnlwdGVkX3BvcnRzX29ubHkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQ09OVFJPTF9TVEFURV9FTkFCTEU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX211bHRpY2FzdF9rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX211bHRpY2FzdF9rZXkgKnRoaXMpCit7CisgICAgbWVtc2V0KHRoaXMtPmtleS5ieXRlcywgMCwgc2l6ZW9mKHRoaXMtPmtleS5ieXRlcykpOworICAgIHRoaXMtPmtleV9jb250cm9sID0gQkNNT1NfRkFMU0U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9tdWx0aWNhc3Rfa2V5X3BhY2soY29uc3QgYmNtb2x0X3hncG9uX211bHRpY2FzdF9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9hZXNfa2V5X3BhY2soJnRoaXMtPmtleSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmtleV9jb250cm9sKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX211bHRpY2FzdF9rZXlfdW5wYWNrKGJjbW9sdF94Z3Bvbl9tdWx0aWNhc3Rfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYWVzX2tleV91bnBhY2soJnRoaXMtPmtleSwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+a2V5X2NvbnRyb2wpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbXVsdGljYXN0X2tleV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDE3KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX211bHRpY2FzdF9rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9tdWx0aWNhc3Rfa2V5ICp0aGlzKQoreworICAgIGlmICghYmNtb2x0X2Flc19rZXlfYm91bmRzX2NoZWNrKCZ0aGlzLT5rZXkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fbmlfZGVidWdfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX25pX2RlYnVnICp0aGlzKQoreworICAgIHRoaXMtPmluY3JlYXNlX2F2YWlsYWJsZV9jYnJfYncgPSBCQ01PU19GQUxTRTsKKyAgICB0aGlzLT5pbnRlcl9idXJzdF9nYXBfaW5fYnl0ZXMgPSA1MTI7CisgICAgdGhpcy0+bnVtYmVyX29mX2dlbV9wb3J0c19wZXJfb251ID0gNjQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9kZWJ1Z19wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9kZWJ1ZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+aW5jcmVhc2VfYXZhaWxhYmxlX2Nicl9idykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmludGVyX2J1cnN0X2dhcF9pbl9ieXRlcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPm51bWJlcl9vZl9nZW1fcG9ydHNfcGVyX29udSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9kZWJ1Z191bnBhY2soYmNtb2x0X3hncG9uX25pX2RlYnVnICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5pbmNyZWFzZV9hdmFpbGFibGVfY2JyX2J3KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+aW50ZXJfYnVyc3RfZ2FwX2luX2J5dGVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bnVtYmVyX29mX2dlbV9wb3J0c19wZXJfb251KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2RlYnVnX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9kZWJ1Z19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX25pX2RlYnVnICp0aGlzKQoreworICAgIGlmICh0aGlzLT5udW1iZXJfb2ZfZ2VtX3BvcnRzX3Blcl9vbnUgPCA4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5udW1iZXJfb2ZfZ2VtX3BvcnRzX3Blcl9vbnUgPiAyNTYpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfYWN0aXZhdGlvbl9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X2FjdGl2YXRpb24gKnRoaXMpCit7CisgICAgdGhpcy0+a2V5X2V4Y2hhbmdlID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRTsKKyAgICB0aGlzLT5mYWlsX2R1ZV90b19yZWdpc19hdXRvX2ZhaWwgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9FTkFCTEU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfYWN0aXZhdGlvbl9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfYWN0aXZhdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfcGFjayh0aGlzLT5rZXlfZXhjaGFuZ2UsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfY29udHJvbF9zdGF0ZV9wYWNrKHRoaXMtPmZhaWxfZHVlX3RvX3JlZ2lzX2F1dG9fZmFpbCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9hY3RpdmF0aW9uX3VucGFjayhiY21vbHRfeGdwb25fb251X2FjdGl2YXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9jb250cm9sX3N0YXRlX3VucGFjaygmdGhpcy0+a2V5X2V4Y2hhbmdlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfdW5wYWNrKCZ0aGlzLT5mYWlsX2R1ZV90b19yZWdpc19hdXRvX2ZhaWwsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfYWN0aXZhdGlvbl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2FjdGl2YXRpb25fYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfYWN0aXZhdGlvbiAqdGhpcykKK3sKKyAgICBzd2l0Y2ggKHRoaXMtPmtleV9leGNoYW5nZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9DT05UUk9MX1NUQVRFX0VOQUJMRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+ZmFpbF9kdWVfdG9fcmVnaXNfYXV0b19mYWlsKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRU5BQkxFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfYWVzX2tleV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X2Flc19rZXkgKnRoaXMpCit7CisgICAgbWVtc2V0KHRoaXMtPmVuY3J5cHRpb25fa2V5LmJ5dGVzLCAwLCBzaXplb2YodGhpcy0+ZW5jcnlwdGlvbl9rZXkuYnl0ZXMpKTsKKyAgICB0aGlzLT5rZXlfaW5kZXggPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2Flc19rZXlfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X2Flc19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9hZXNfa2V5X3BhY2soJnRoaXMtPmVuY3J5cHRpb25fa2V5LCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmtleV9pbmRleCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfYWVzX2tleV91bnBhY2soYmNtb2x0X3hncG9uX29udV9hZXNfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYWVzX2tleV91bnBhY2soJnRoaXMtPmVuY3J5cHRpb25fa2V5LCBidWYsIGV4dHJhX21lbSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+a2V5X2luZGV4KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9hZXNfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTcpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2Flc19rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfYWVzX2tleSAqdGhpcykKK3sKKyAgICBpZiAoIWJjbW9sdF9hZXNfa2V5X2JvdW5kc19jaGVjaygmdGhpcy0+ZW5jcnlwdGlvbl9rZXkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGUgKnRoaXMpCit7CisgICAgdGhpcy0+bG9zaSA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIHRoaXMtPmxvYmkgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB0aGlzLT5sb3BjaSA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIHRoaXMtPmxvcGNpX21pY19lcnJvciA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIHRoaXMtPmxvb2NpID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgdGhpcy0+dGl3aSA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIHRoaXMtPmRvd2kgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB0aGlzLT5zdWZpID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgdGhpcy0+c2ZpID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgdGhpcy0+c2RpID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgdGhpcy0+ZGZpID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgdGhpcy0+ZGdpID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgdGhpcy0+cHFzaSA9IEJDTU9MVF9TVEFUVVNfT0ZGOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPmxvc2ksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+bG9iaSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5sb3BjaSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5sb3BjaV9taWNfZXJyb3IsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+bG9vY2ksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+dGl3aSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5kb3dpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPnN1ZmksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+c2ZpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPnNkaSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5kZmksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+ZGdpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPnBxc2ksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGVfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5sb3NpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPmxvYmksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+bG9wY2ksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+bG9wY2lfbWljX2Vycm9yLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPmxvb2NpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPnRpd2ksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+ZG93aSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5zdWZpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPnNmaSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5zZGksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+ZGZpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPmRnaSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5wcXNpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlICp0aGlzKQoreworICAgIHN3aXRjaCAodGhpcy0+bG9zaSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmxvYmkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5sb3BjaSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmxvcGNpX21pY19lcnJvcikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmxvb2NpKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+dGl3aSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmRvd2kpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5zdWZpKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+c2ZpKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+c2RpKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+ZGZpKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+ZGdpKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+cHFzaSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9hbGFybXNfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9hbGFybXMgKnRoaXMpCit7CisgICAgdGhpcy0+bG9zaSA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIHRoaXMtPmxvYmkgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB0aGlzLT5sb3BjaV9taXNzID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgdGhpcy0+bG9wY2lfbWljX2Vycm9yID0gQkNNT0xUX1NUQVRVU19PRkY7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9hbGFybXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5sb3NpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPmxvYmksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+bG9wY2lfbWlzcywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5sb3BjaV9taWNfZXJyb3IsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zX3VucGFjayhiY21vbHRfeGdwb25fb251X2FsYXJtcyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPmxvc2ksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+bG9iaSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5sb3BjaV9taXNzLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPmxvcGNpX21pY19lcnJvciwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9hbGFybXNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9hbGFybXNfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zICp0aGlzKQoreworICAgIHN3aXRjaCAodGhpcy0+bG9zaSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmxvYmkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5sb3BjaV9taXNzKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+bG9wY2lfbWljX2Vycm9yKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fb251X2FsYXJtc190aHJlc2hvbGRzX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgKnRoaXMpCit7CisgICAgdGhpcy0+bG9zaSA9IDQ7CisgICAgdGhpcy0+bG9iaSA9IDQ7CisgICAgdGhpcy0+bG9vY2kgPSAzOworICAgIHRoaXMtPmxvcGNpID0gMzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9hbGFybXNfdGhyZXNob2xkc19wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5sb3NpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5sb2JpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5sb29jaSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bG9wY2kpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2FsYXJtc190aHJlc2hvbGRzX3VucGFjayhiY21vbHRfeGdwb25fb251X2FsYXJtc190aHJlc2hvbGRzICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bG9zaSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bG9iaSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bG9vY2kpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmxvcGNpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9hbGFybXNfdGhyZXNob2xkc19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2FsYXJtc190aHJlc2hvbGRzX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X2FsYXJtc190aHJlc2hvbGRzICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fb251X2VxZF9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X2VxZCAqdGhpcykKK3sKKyAgICB0aGlzLT5vbnVfaWQgPSAoYmNtb2x0X3hncG9uX29udV9pZCkgMDsKKyAgICB0aGlzLT5lcWQgPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2VxZF9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfZXFkICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+b251X2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+ZXFkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9lcWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfZXFkICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5vbnVfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5lcWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2VxZF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2VxZF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9lcWQgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPm9udV9pZCA+IChiY21vbHRfeGdwb25fb251X2lkKSA1MTEpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfZXFkX2xpc3RfdTMyX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfZXFkX2xpc3RfdTMyICp0aGlzKQoreworICAgIHRoaXMtPmxlbiA9IDA7CisgICAgdGhpcy0+dmFsID0gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9lcWRfbGlzdF91MzJfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X2VxZF9saXN0X3UzMiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGkwOworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5sZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bGVuID4gMCkgJiYgKHRoaXMtPnZhbCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfeGdwb25fb251X2VxZF9saXN0X3UzMlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5sZW47IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9vbnVfZXFkX3BhY2soJnRoaXMtPnZhbFtpMF0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9lcWRfbGlzdF91MzJfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9lcWRfbGlzdF91MzIgKnRoaXMpCit7CisgICAgcmV0dXJuIDQgKyAoNiAqIHRoaXMtPmxlbik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfZXFkX2xpc3RfdTMyX3VucGFjayhiY21vbHRfeGdwb25fb251X2VxZF9saXN0X3UzMiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQzMl90IGkwOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5sZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bGVuID4gMCkgJiYgKHRoaXMtPnZhbCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF94Z3Bvbl9vbnVfZXFkX2xpc3RfdTMyXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnZhbCA9IChiY21vbHRfeGdwb25fb251X2VxZCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+bGVuICogc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfZXFkKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5sZW47IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9vbnVfZXFkX3VucGFjaygmdGhpcy0+dmFsW2kwXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9lcWRfbGlzdF91MzJfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDMyX3QgbGVuOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihwYWNrZWQsICZsZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X3hncG9uX29udV9lcWQpICogbGVuKTsKKyAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIGxlbiAqIDYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2VxZF9saXN0X3UzMl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9lcWRfbGlzdF91MzIgKnRoaXMpCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXNfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25fa2V5cyAqdGhpcykKK3sKKyAgICBtZW1zZXQodGhpcy0+cGxvYW1faWsuYnl0ZXMsIDAsIHNpemVvZih0aGlzLT5wbG9hbV9pay5ieXRlcykpOworICAgIG1lbXNldCh0aGlzLT5vbWNpX2lrLmJ5dGVzLCAwLCBzaXplb2YodGhpcy0+b21jaV9pay5ieXRlcykpOworICAgIG1lbXNldCh0aGlzLT5vbWNpX2sxLmJ5dGVzLCAwLCBzaXplb2YodGhpcy0+b21jaV9rMS5ieXRlcykpOworICAgIG1lbXNldCh0aGlzLT5vbWNpX2syLmJ5dGVzLCAwLCBzaXplb2YodGhpcy0+b21jaV9rMi5ieXRlcykpOworICAgIG1lbXNldCh0aGlzLT5rZWsuYnl0ZXMsIDAsIHNpemVvZih0aGlzLT5rZWsuYnl0ZXMpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25fa2V5c19wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9hZXNfa2V5X3BhY2soJnRoaXMtPnBsb2FtX2lrLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Flc19rZXlfcGFjaygmdGhpcy0+b21jaV9paywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9hZXNfa2V5X3BhY2soJnRoaXMtPm9tY2lfazEsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYWVzX2tleV9wYWNrKCZ0aGlzLT5vbWNpX2syLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Flc19rZXlfcGFjaygmdGhpcy0+a2VrLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9rZXlzX3VucGFjayhiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9rZXlzICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYWVzX2tleV91bnBhY2soJnRoaXMtPnBsb2FtX2lrLCBidWYsIGV4dHJhX21lbSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYWVzX2tleV91bnBhY2soJnRoaXMtPm9tY2lfaWssIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9hZXNfa2V5X3VucGFjaygmdGhpcy0+b21jaV9rMSwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Flc19rZXlfdW5wYWNrKCZ0aGlzLT5vbWNpX2syLCBidWYsIGV4dHJhX21lbSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYWVzX2tleV91bnBhY2soJnRoaXMtPmtlaywgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9rZXlzX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgODApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9rZXlzX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9rZXlzICp0aGlzKQoreworICAgIGlmICghYmNtb2x0X2Flc19rZXlfYm91bmRzX2NoZWNrKCZ0aGlzLT5wbG9hbV9paykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYWVzX2tleV9ib3VuZHNfY2hlY2soJnRoaXMtPm9tY2lfaWspKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Flc19rZXlfYm91bmRzX2NoZWNrKCZ0aGlzLT5vbWNpX2sxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9hZXNfa2V5X2JvdW5kc19jaGVjaygmdGhpcy0+b21jaV9rMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYWVzX2tleV9ib3VuZHNfY2hlY2soJnRoaXMtPmtlaykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGUgKnRoaXMpCit7CisgICAgdGhpcy0+b251X2lkID0gKGJjbW9sdF94Z3Bvbl9vbnVfaWQpIDA7CisgICAgdGhpcy0+c3RhdGUgPSBCQ01PTFRfT05VX1NUQVRFX05PVF9DT05GSUdVUkVEOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGVfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5vbnVfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X29udV9zdGF0ZV9wYWNrKHRoaXMtPnN0YXRlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGVfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+b251X2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9vbnVfc3RhdGVfdW5wYWNrKCZ0aGlzLT5zdGF0ZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlICp0aGlzKQoreworICAgIGlmICh0aGlzLT5vbnVfaWQgPiAoYmNtb2x0X3hncG9uX29udV9pZCkgNTExKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+c3RhdGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfTk9UX0NPTkZJR1VSRUQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX0lOQUNUSVZFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9BQ1RJVkU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX0FDVElWRV9TVEFOREJZOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9ESVNBQkxFRDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfQVdBS0VfRlJFRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfUFJPQ0VTU0lORzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfTE9XX1BPV0VSX0RPWkU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX0xPV19QT1dFUl9TTEVFUDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfTE9XX1BPV0VSX1dBVENIOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9VTkFXQVJFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfNTEwX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfNTEwICp0aGlzKQoreworICAgIHRoaXMtPmxlbiA9IDA7CisgICAgdGhpcy0+dmFsID0gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF81MTBfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzUxMCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IGkwOworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5sZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bGVuID4gMCkgJiYgKHRoaXMtPnZhbCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzUxMFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+bGVuID4gNTEwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmxlbjsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlX3BhY2soJnRoaXMtPnZhbFtpMF0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF81MTBfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF81MTAgKnRoaXMpCit7CisgICAgcmV0dXJuIDIgKyAoMyAqIHRoaXMtPmxlbik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfNTEwX3VucGFjayhiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzUxMCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IGkwOworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5sZW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bGVuID4gMCkgJiYgKHRoaXMtPnZhbCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfNTEwXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnZhbCA9IChiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGUgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPmxlbiAqIHNpemVvZihiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0aGlzLT5sZW4gPiA1MTApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bGVuOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGVfdW5wYWNrKCZ0aGlzLT52YWxbaTBdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzUxMF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MTZfdCBsZW47CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGUpICogbGVuKTsKKyAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIGxlbiAqIDMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzUxMF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF81MTAgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPmxlbiA+IDUxMCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9wbG9hbV9oYW5kbGluZyAqdGhpcykKK3sKKyAgICB0aGlzLT5hY2tfdGltZW91dCA9IDIwMDA7CisgICAgdGhpcy0+cmV0cmFuc19yYW5naW5nX3RpbWUgPSAwOworICAgIHRoaXMtPnJldHJhbnNfYXNzaWduX2FsbG9jX2lkID0gMDsKKyAgICB0aGlzLT5yZXRyYW5zX2tleV9jb250cm9sID0gMDsKKyAgICB0aGlzLT5yZXRyYW5zX3JlcXVlc3RfcmVnaXN0cmF0aW9uID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmFja190aW1lb3V0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5yZXRyYW5zX3JhbmdpbmdfdGltZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cmV0cmFuc19hc3NpZ25fYWxsb2NfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnJldHJhbnNfa2V5X2NvbnRyb2wpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnJldHJhbnNfcmVxdWVzdF9yZWdpc3RyYXRpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fcGxvYW1faGFuZGxpbmdfdW5wYWNrKGJjbW9sdF94Z3Bvbl9wbG9hbV9oYW5kbGluZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5hY2tfdGltZW91dCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+cmV0cmFuc19yYW5naW5nX3RpbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnJldHJhbnNfYXNzaWduX2FsbG9jX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5yZXRyYW5zX2tleV9jb250cm9sKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5yZXRyYW5zX3JlcXVlc3RfcmVnaXN0cmF0aW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9wbG9hbV9oYW5kbGluZ19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nICp0aGlzKQoreworICAgIHRoaXMtPnRpbWVvdXQgPSAxMDA7CisgICAgdGhpcy0+Z3Bpb19waW4gPSBCQ01PTFRfR1BJT19QSU5fVU5DT05GSUdVUkVEOworICAgIHRoaXMtPmZhc3RfcmFuZ2luZyA9IEJDTU9TX0ZBTFNFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfcGFjayhjb25zdCBiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dGltZW91dCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZ3Bpb19waW5fcGFjayh0aGlzLT5ncGlvX3BpbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmZhc3RfcmFuZ2luZykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ191bnBhY2soYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnRpbWVvdXQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2dwaW9fcGluX3VucGFjaygmdGhpcy0+Z3Bpb19waW4sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5mYXN0X3JhbmdpbmcpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmcgKnRoaXMpCit7CisgICAgc3dpdGNoICh0aGlzLT5ncGlvX3BpbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4yOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU41OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU44OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTM6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTAwOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjEwMToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDI6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTAzOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjEwNDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTA2OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1VOQ09ORklHVVJFRDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWdfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnICp0aGlzKQoreworICAgIHRoaXMtPmRhdGFfbWFwX2RlbGF5X21zID0gMDsKKyAgICB0aGlzLT5yZXJhbmdlX3NlbmRfcmFuZ2luZ190aW1lID0gQkNNT1NfRkFMU0U7CisgICAgdGhpcy0+cmVyYW5nZV9zZW5kX3JhbmdpbmdfdGltZV9kZWxheSA9IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1Z19wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1ZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5kYXRhX21hcF9kZWxheV9tcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5yZXJhbmdlX3NlbmRfcmFuZ2luZ190aW1lKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+cmVyYW5nZV9zZW5kX3JhbmdpbmdfdGltZV9kZWxheSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1Z191bnBhY2soYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmRhdGFfbWFwX2RlbGF5X21zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnJlcmFuZ2Vfc2VuZF9yYW5naW5nX3RpbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5yZXJhbmdlX3NlbmRfcmFuZ2luZ190aW1lX2RlbGF5KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1Z19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fcnNzaV9ub3JtYWxfY29uZmlnX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWcgKnRoaXMpCit7CisgICAgdGhpcy0+cG9sYXJpdHkgPSBCQ01PTFRfUE9MQVJJVFlfTE9XOworICAgIHRoaXMtPmxvY2F0aW9uID0gMzU7CisgICAgdGhpcy0+bG9jYXRpb25fc2lnbiA9IEJDTU9MVF9TSUdOX1BPU0lUSVZFOworICAgIHRoaXMtPnB1bHNlX3dpZHRoID0gODA7CisgICAgdGhpcy0+bWluaW11bV9idXJzdCA9IDIwMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3Jzc2lfbm9ybWFsX2NvbmZpZ19wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9wb2xhcml0eV9wYWNrKHRoaXMtPnBvbGFyaXR5LCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmxvY2F0aW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9zaWduX3BhY2sodGhpcy0+bG9jYXRpb25fc2lnbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+cHVsc2Vfd2lkdGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5taW5pbXVtX2J1cnN0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3Jzc2lfbm9ybWFsX2NvbmZpZ191bnBhY2soYmNtb2x0X3hncG9uX3Jzc2lfbm9ybWFsX2NvbmZpZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X3BvbGFyaXR5X3VucGFjaygmdGhpcy0+cG9sYXJpdHksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bG9jYXRpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3NpZ25fdW5wYWNrKCZ0aGlzLT5sb2NhdGlvbl9zaWduLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5wdWxzZV93aWR0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPm1pbmltdW1fYnVyc3QpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fcnNzaV9ub3JtYWxfY29uZmlnX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWdfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWcgKnRoaXMpCit7CisgICAgc3dpdGNoICh0aGlzLT5wb2xhcml0eSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1BPTEFSSVRZX0xPVzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9QT0xBUklUWV9ISUdIOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5sb2NhdGlvbl9zaWduKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfU0lHTl9QT1NJVElWRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9TSUdOX05FR0FUSVZFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9yc3NpX3JhbmdpbmdfY29uZmlnX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9yc3NpX3JhbmdpbmdfY29uZmlnICp0aGlzKQoreworICAgIHRoaXMtPnN0YXJ0X29uX2VkID0gQkNNT1NfVFJVRTsKKyAgICB0aGlzLT5mcmFtZV9kZWxheSA9IDA7CisgICAgdGhpcy0+d29yZF9kZWxheSA9IDIwOworICAgIHRoaXMtPmZyYW1lX2RlbGF5X2FmdGVyX2VkID0gMDsKKyAgICB0aGlzLT53b3JkX2RlbGF5X2FmdGVyX2VkID0gMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3Jzc2lfcmFuZ2luZ19jb25maWdfcGFjayhjb25zdCBiY21vbHRfeGdwb25fcnNzaV9yYW5naW5nX2NvbmZpZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhcnRfb25fZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmZyYW1lX2RlbGF5KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+d29yZF9kZWxheSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+ZnJhbWVfZGVsYXlfYWZ0ZXJfZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT53b3JkX2RlbGF5X2FmdGVyX2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3Jzc2lfcmFuZ2luZ19jb25maWdfdW5wYWNrKGJjbW9sdF94Z3Bvbl9yc3NpX3JhbmdpbmdfY29uZmlnICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zdGFydF9vbl9lZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+ZnJhbWVfZGVsYXkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT53b3JkX2RlbGF5KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5mcmFtZV9kZWxheV9hZnRlcl9lZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPndvcmRfZGVsYXlfYWZ0ZXJfZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fcnNzaV9yYW5naW5nX2NvbmZpZ19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDcpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fcnNzaV9yYW5naW5nX2NvbmZpZ19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX3Jzc2lfcmFuZ2luZ19jb25maWcgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPmZyYW1lX2RlbGF5ID4gMzEpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPndvcmRfZGVsYXkgPiAxNjM4MykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+ZnJhbWVfZGVsYXlfYWZ0ZXJfZWQgPiAzMSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+d29yZF9kZWxheV9hZnRlcl9lZCA+IDE2MzgzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4gKnRoaXMpCit7CisgICAgdGhpcy0+dHJ4X3Jlc2V0X3BhdHRlcm5fZmlyc3QgPSAwOworICAgIHRoaXMtPnRyeF9yZXNldF9wYXR0ZXJuX21pZGRsZSA9IDA7CisgICAgdGhpcy0+dHJ4X3Jlc2V0X3BhdHRlcm5fbGFzdCA9IDA7CisgICAgdGhpcy0+dHJ4X3Jlc2V0X21pZGRsZV9yZXBlYXRzID0gMDsKKyAgICB0aGlzLT50cnhfcmVzZXRfbG9jYXRpb24gPSAwOworICAgIHRoaXMtPmJjZHJfcmVzZXRfcGF0dGVybl9maXJzdCA9IDA7CisgICAgdGhpcy0+YmNkcl9yZXNldF9wYXR0ZXJuX21pZGRsZSA9IDA7CisgICAgdGhpcy0+YmNkcl9yZXNldF9wYXR0ZXJuX2xhc3QgPSAwOworICAgIHRoaXMtPmJjZHJfcmVzZXRfbWlkZGxlX3JlcGVhdHMgPSAwOworICAgIHRoaXMtPmJjZHJfcmVzZXRfbG9jYXRpb24gPSAwOworICAgIHRoaXMtPmJjZHJfcmVzZXRfcG9sYXJpdHkgPSBCQ01PU19GQUxTRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3J4X3Jhbmdpbmdfc21fcGF0dGVybl9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4gKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dHJ4X3Jlc2V0X3BhdHRlcm5fZmlyc3QpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT50cnhfcmVzZXRfcGF0dGVybl9taWRkbGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT50cnhfcmVzZXRfcGF0dGVybl9sYXN0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT50cnhfcmVzZXRfbWlkZGxlX3JlcGVhdHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnRyeF9yZXNldF9sb2NhdGlvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmJjZHJfcmVzZXRfcGF0dGVybl9maXJzdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmJjZHJfcmVzZXRfcGF0dGVybl9taWRkbGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5iY2RyX3Jlc2V0X3BhdHRlcm5fbGFzdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+YmNkcl9yZXNldF9taWRkbGVfcmVwZWF0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+YmNkcl9yZXNldF9sb2NhdGlvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5iY2RyX3Jlc2V0X3BvbGFyaXR5KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3J4X3Jhbmdpbmdfc21fcGF0dGVybl91bnBhY2soYmNtb2x0X3hncG9uX3J4X3Jhbmdpbmdfc21fcGF0dGVybiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT50cnhfcmVzZXRfcGF0dGVybl9maXJzdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnRyeF9yZXNldF9wYXR0ZXJuX21pZGRsZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnRyeF9yZXNldF9wYXR0ZXJuX2xhc3QpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnRyeF9yZXNldF9taWRkbGVfcmVwZWF0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dHJ4X3Jlc2V0X2xvY2F0aW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+YmNkcl9yZXNldF9wYXR0ZXJuX2ZpcnN0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+YmNkcl9yZXNldF9wYXR0ZXJuX21pZGRsZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmJjZHJfcmVzZXRfcGF0dGVybl9sYXN0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5iY2RyX3Jlc2V0X21pZGRsZV9yZXBlYXRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5iY2RyX3Jlc2V0X2xvY2F0aW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmJjZHJfcmVzZXRfcG9sYXJpdHkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMjkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuICp0aGlzKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fc2VyZGVzX2NvbmZpZ3VyYXRpb25fc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX3NlcmRlc19jb25maWd1cmF0aW9uICp0aGlzKQoreworICAgIHRoaXMtPm11bHRpX2VkX21vZGUgPSBCQ01PU19GQUxTRTsKKyAgICB0aGlzLT5yYW5naW5nX21vZGUgPSBCQ01PTFRfWEdQT05fU0VSREVTX1JBTkdJTkdfTU9ERV9CQ0RSOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fc2VyZGVzX2NvbmZpZ3VyYXRpb25fcGFjayhjb25zdCBiY21vbHRfeGdwb25fc2VyZGVzX2NvbmZpZ3VyYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPm11bHRpX2VkX21vZGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X3hncG9uX3NlcmRlc19yYW5naW5nX21vZGVfcGFjayh0aGlzLT5yYW5naW5nX21vZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9zZXJkZXNfY29uZmlndXJhdGlvbl91bnBhY2soYmNtb2x0X3hncG9uX3NlcmRlc19jb25maWd1cmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5tdWx0aV9lZF9tb2RlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF94Z3Bvbl9zZXJkZXNfcmFuZ2luZ19tb2RlX3VucGFjaygmdGhpcy0+cmFuZ2luZ19tb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fc2VyZGVzX2NvbmZpZ3VyYXRpb25fc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3NlcmRlc19jb25maWd1cmF0aW9uX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fc2VyZGVzX2NvbmZpZ3VyYXRpb24gKnRoaXMpCit7CisgICAgc3dpdGNoICh0aGlzLT5yYW5naW5nX21vZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9TRVJERVNfUkFOR0lOR19NT0RFX0VEOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX1NFUkRFU19SQU5HSU5HX01PREVfQkNEUjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9TRVJERVNfUkFOR0lOR19NT0RFX0ZBU1RfUkFOR0lORzE6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fU0VSREVTX1JBTkdJTkdfTU9ERV9GQVNUX1JBTkdJTkcyOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9zbl9hY3F1aXNpdGlvbl9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fc25fYWNxdWlzaXRpb24gKnRoaXMpCit7CisgICAgdGhpcy0+aW50ZXJ2YWwgPSAxMDAwOworICAgIHRoaXMtPmNvbnRyb2wgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOworICAgIHRoaXMtPm9udV9wb3N0X2Rpc2NvdmVyeV9tb2RlID0gQkNNT0xUX09OVV9QT1NUX0RJU0NPVkVSWV9NT0RFX05PTkU7CisgICAgdGhpcy0+YnVyc3RfcHJvZmlsZSA9IChiY21vbHRfYnVyc3RfcHJvZmlsZV9pbmRleCkgMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3NuX2FjcXVpc2l0aW9uX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX3NuX2FjcXVpc2l0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmludGVydmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9jb250cm9sX3N0YXRlX3BhY2sodGhpcy0+Y29udHJvbCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9vbnVfcG9zdF9kaXNjb3ZlcnlfbW9kZV9wYWNrKHRoaXMtPm9udV9wb3N0X2Rpc2NvdmVyeV9tb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzLT5idXJzdF9wcm9maWxlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3NuX2FjcXVpc2l0aW9uX3VucGFjayhiY21vbHRfeGdwb25fc25fYWNxdWlzaXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+aW50ZXJ2YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfdW5wYWNrKCZ0aGlzLT5jb250cm9sLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X29udV9wb3N0X2Rpc2NvdmVyeV9tb2RlX3VucGFjaygmdGhpcy0+b251X3Bvc3RfZGlzY292ZXJ5X21vZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAodWludDhfdCAqKSAmdGhpcy0+YnVyc3RfcHJvZmlsZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9zbl9hY3F1aXNpdGlvbl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDcpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fc25fYWNxdWlzaXRpb25fYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9zbl9hY3F1aXNpdGlvbiAqdGhpcykKK3sKKyAgICBpZiAodGhpcy0+aW50ZXJ2YWwgPCAxMDAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5pbnRlcnZhbCA+IDIxNDc0ODNVTCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmNvbnRyb2wpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQ09OVFJPTF9TVEFURV9FTkFCTEU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm9udV9wb3N0X2Rpc2NvdmVyeV9tb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfT05VX1BPU1RfRElTQ09WRVJZX01PREVfTk9ORToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9PTlVfUE9TVF9ESVNDT1ZFUllfTU9ERV9BQ1RJVkFURToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9PTlVfUE9TVF9ESVNDT1ZFUllfTU9ERV9ESVNBQkxFOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmJ1cnN0X3Byb2ZpbGUgPiAoYmNtb2x0X2J1cnN0X3Byb2ZpbGVfaW5kZXgpIDMpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl90cnhfZGVidWdfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX3RyeF9kZWJ1ZyAqdGhpcykKK3sKKyAgICB0aGlzLT5yeF9yZXZlcnNlZF9wb2xhcml0eSA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU7CisgICAgdGhpcy0+bmVnX291dF9iaXQgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fdHJ4X2RlYnVnX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX3RyeF9kZWJ1ZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfcGFjayh0aGlzLT5yeF9yZXZlcnNlZF9wb2xhcml0eSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9jb250cm9sX3N0YXRlX3BhY2sodGhpcy0+bmVnX291dF9iaXQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl90cnhfZGVidWdfdW5wYWNrKGJjbW9sdF94Z3Bvbl90cnhfZGVidWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9jb250cm9sX3N0YXRlX3VucGFjaygmdGhpcy0+cnhfcmV2ZXJzZWRfcG9sYXJpdHksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfY29udHJvbF9zdGF0ZV91bnBhY2soJnRoaXMtPm5lZ19vdXRfYml0LCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fdHJ4X2RlYnVnX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl90cnhfZGVidWdfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl90cnhfZGVidWcgKnRoaXMpCit7CisgICAgc3dpdGNoICh0aGlzLT5yeF9yZXZlcnNlZF9wb2xhcml0eSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9DT05UUk9MX1NUQVRFX0VOQUJMRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+bmVnX291dF9iaXQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQ09OVFJPTF9TVEFURV9FTkFCTEU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2FlX25pX2tleV9zZXRfZGVmYXVsdChiY21vbHRfYWVfbmlfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX05JX0tFWV9JRF9BRV9OSSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hZV9uaSA9IChiY21vbHRfYWVfbmkpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfbmlfa2V5X3BhY2soY29uc3QgYmNtb2x0X2FlX25pX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX05JX0tFWV9JRF9BRV9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5hZV9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2FlX25pX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfYWVfbmlfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9OSV9LRVlfSURfQUVfTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9uaV9rZXlfdW5wYWNrKGJjbW9sdF9hZV9uaV9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9OSV9LRVlfSURfQUVfTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5hZV9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfbmlfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX05JX0tFWV9JRF9BRV9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX25pX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2FlX25pX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9hZV9uaV9rZXlfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfYWVfbmlfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2FlX25pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX05JX0NGR19JRF9NQUNfQUREUkVTUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5tYWNfYWRkcmVzcy51OFswXSA9IDB4MDAwMDsKKyAgICAgICAgdGhpcy0+bWFjX2FkZHJlc3MudThbMV0gPSAweDAwMEQ7CisgICAgICAgIHRoaXMtPm1hY19hZGRyZXNzLnU4WzJdID0gMHgwMEI2OworICAgICAgICB0aGlzLT5tYWNfYWRkcmVzcy51OFszXSA9IDB4MDAwMDsKKyAgICAgICAgdGhpcy0+bWFjX2FkZHJlc3MudThbNF0gPSAweDAwMDA7CisgICAgICAgIHRoaXMtPm1hY19hZGRyZXNzLnU4WzVdID0gMHgwMDAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfTklfQ0ZHX0lEX0FFX05JX0VOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFlX25pX2VuID0gQkNNT0xUX0FFX05JX0VOX1NUQVRFX0RJU0FCTEVEOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfTklfQ0ZHX0lEX01UVV8xMEcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bXR1XzEwZyA9IDE1MzY7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9OSV9DRkdfSURfUFJCU19HRU5FUkFUT1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cHJic19nZW5lcmF0b3IucG9seW5vbSA9IEJDTU9MVF9QUkJTX1BPTFlOT01JQUxfUFJCU183OworICAgICAgICB0aGlzLT5wcmJzX2dlbmVyYXRvci5lcnJvcl9pbnNlcnQgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgdGhpcy0+cHJic19nZW5lcmF0b3IuaW52ZXJ0ID0gQkNNT1NfRkFMU0U7CisgICAgICAgIHRoaXMtPnByYnNfZ2VuZXJhdG9yLmNvbnRyb2wgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfTklfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wcmJzX2NoZWNrZXIucG9seW5vbSA9IEJDTU9MVF9QUkJTX1BPTFlOT01JQUxfUFJCU183OworICAgICAgICB0aGlzLT5wcmJzX2NoZWNrZXIubW9kZSA9IEJDTU9MVF9QUkJTX0NIRUNLRVJfTU9ERV9TRUxGX1NZTkM7CisgICAgICAgIHRoaXMtPnByYnNfY2hlY2tlci5kYXRhX2ludmVydCA9IEJDTU9TX0ZBTFNFOworICAgICAgICB0aGlzLT5wcmJzX2NoZWNrZXIuY29udHJvbCA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9OSV9DRkdfSURfUFJCU19TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cHJic19zdGF0dXMubG9ja19zdGF0ZSA9IEJDTU9MVF9QUkJTX0xPQ0tfU1RBVEVfVU5MT0NLRUQ7CisgICAgICAgIHRoaXMtPnByYnNfc3RhdHVzLmVycm9yX2NvdW50cyA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfbmlfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfYWVfbmlfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9OSV9DRkdfSURfTUFDX0FERFJFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+bWFjX2FkZHJlc3MpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX05JX0NGR19JRF9BRV9OSV9FTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hZV9uaV9lbl9zdGF0ZV9wYWNrKHRoaXMtPmFlX25pX2VuLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX05JX0NGR19JRF9NVFVfMTBHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5tdHVfMTBnKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9OSV9DRkdfSURfUFJCU19HRU5FUkFUT1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnX3BhY2soJnRoaXMtPnByYnNfZ2VuZXJhdG9yLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX05JX0NGR19JRF9QUkJTX0NIRUNLRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZ19wYWNrKCZ0aGlzLT5wcmJzX2NoZWNrZXIsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfTklfQ0ZHX0lEX1BSQlNfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3ByYnNfc3RhdHVzX3BhY2soJnRoaXMtPnByYnNfc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9hZV9uaV9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfYWVfbmlfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX05JX0NGR19JRF9NQUNfQUREUkVTUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA2OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfTklfQ0ZHX0lEX0FFX05JX0VOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9OSV9DRkdfSURfTVRVXzEwRykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfTklfQ0ZHX0lEX1BSQlNfR0VORVJBVE9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9OSV9DRkdfSURfUFJCU19DSEVDS0VSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9OSV9DRkdfSURfUFJCU19TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9uaV9jZmdfZGF0YV91bnBhY2soYmNtb2x0X2FlX25pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfTklfQ0ZHX0lEX01BQ19BRERSRVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX21hY19hZGRyZXNzKGJ1ZiwgJnRoaXMtPm1hY19hZGRyZXNzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9OSV9DRkdfSURfQUVfTklfRU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYWVfbmlfZW5fc3RhdGVfdW5wYWNrKCZ0aGlzLT5hZV9uaV9lbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9OSV9DRkdfSURfTVRVXzEwRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bXR1XzEwZykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfTklfQ0ZHX0lEX1BSQlNfR0VORVJBVE9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZ191bnBhY2soJnRoaXMtPnByYnNfZ2VuZXJhdG9yLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfTklfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnX3VucGFjaygmdGhpcy0+cHJic19jaGVja2VyLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfTklfQ0ZHX0lEX1BSQlNfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3ByYnNfc3RhdHVzX3VucGFjaygmdGhpcy0+cHJic19zdGF0dXMsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9uaV9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9OSV9DRkdfSURfTUFDX0FERFJFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA2KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9OSV9DRkdfSURfQUVfTklfRU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9OSV9DRkdfSURfTVRVXzEwRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX05JX0NGR19JRF9QUkJTX0dFTkVSQVRPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX05JX0NGR19JRF9QUkJTX0NIRUNLRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9OSV9DRkdfSURfUFJCU19TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9uaV9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2FlX25pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2FlX25pX2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9OSV9DRkdfSURfQUVfTklfRU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5hZV9uaV9lbikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfTklfRU5fU1RBVEVfRElTQUJMRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9OSV9FTl9TVEFURV9FTkFCTEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfQUVfTklfQ0ZHX0lEX0FFX05JX0VOOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfTklfQ0ZHX0lEX01UVV8xMEcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPm10dV8xMGcgPCA2NCkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0FFX05JX0NGR19JRF9NVFVfMTBHOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRoaXMtPm10dV8xMGcgPiAxMDAwMCkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0FFX05JX0NGR19JRF9NVFVfMTBHOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9OSV9DRkdfSURfUFJCU19HRU5FUkFUT1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnX2JvdW5kc19jaGVjaygmdGhpcy0+cHJic19nZW5lcmF0b3IpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfQUVfTklfQ0ZHX0lEX1BSQlNfR0VORVJBVE9SOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9OSV9DRkdfSURfUFJCU19DSEVDS0VSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWdfYm91bmRzX2NoZWNrKCZ0aGlzLT5wcmJzX2NoZWNrZXIpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfQUVfTklfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfTklfQ0ZHX0lEX1BSQlNfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3ByYnNfc3RhdHVzX2JvdW5kc19jaGVjaygmdGhpcy0+cHJic19zdGF0dXMpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfQUVfTklfQ0ZHX0lEX1BSQlNfU1RBVFVTOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfTklfU0VUX0FFX05JX0VOX1NUQVRFX0lEX05FV19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5uZXdfc3RhdGUgPSBCQ01PTFRfQUVfTklfRU5fU1RBVEVfRElTQUJMRUQ7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9OSV9TRVRfQUVfTklfRU5fU1RBVEVfSURfTkVXX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2FlX25pX2VuX3N0YXRlX3BhY2sodGhpcy0+bmV3X3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX05JX1NFVF9BRV9OSV9FTl9TVEFURV9JRF9ORVdfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfZGF0YV91bnBhY2soYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfTklfU0VUX0FFX05JX0VOX1NUQVRFX0lEX05FV19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hZV9uaV9lbl9zdGF0ZV91bnBhY2soJnRoaXMtPm5ld19zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9OSV9TRVRfQUVfTklfRU5fU1RBVEVfSURfTkVXX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfTklfU0VUX0FFX05JX0VOX1NUQVRFX0lEX05FV19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPm5ld19zdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfTklfRU5fU1RBVEVfRElTQUJMRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9OSV9FTl9TVEFURV9FTkFCTEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfQUVfTklfU0VUX0FFX05JX0VOX1NUQVRFX0lEX05FV19TVEFURTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2FlX3BhdGhfZHNfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF9hZV9wYXRoX2RzX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX0tFWV9JRF9BRV9OSSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hZV9uaSA9IChiY21vbHRfYWVfbmkpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF9kc19rZXlfcGFjayhjb25zdCBiY21vbHRfYWVfcGF0aF9kc19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX0tFWV9JRF9BRV9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5hZV9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2FlX3BhdGhfZHNfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9hZV9wYXRoX2RzX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19LRVlfSURfQUVfTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX2tleV91bnBhY2soYmNtb2x0X2FlX3BhdGhfZHNfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19LRVlfSURfQUVfTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5hZV9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF9kc19rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19LRVlfSURfQUVfTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2FlX3BhdGhfZHNfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2FlX3BhdGhfZHNfa2V5X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Ynl0ZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU182NCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmFtZXNfNjQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU182NV8xMjcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZnJhbWVzXzY1XzEyNyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZnJhbWVzXzEyOF8yNTUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lc18yNTZfNTExID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZnJhbWVzXzUxMl8xMDIzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lc18xMDI0XzE1MTggPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZnJhbWVzXzE1MTlfMjA0NyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmFtZXNfMjA0OF80MDk1ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lc180MDk2XzkyMTYgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lc185MjE3XzE2MzgzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmJyb2FkY2FzdF9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0RBVEFfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZGF0YV9ieXRlcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5tdWx0aWNhc3RfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT51bmljYXN0X2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfQUJPUlRfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFib3J0X2ZyYW1lcyA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmJ5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfNjQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZyYW1lc182NCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU182NV8xMjcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZyYW1lc182NV8xMjcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZnJhbWVzXzEyOF8yNTUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZnJhbWVzXzI1Nl81MTEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZyYW1lc181MTJfMTAyMykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZyYW1lc18xMDI0XzE1MTgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXNfMTUxOV8yMDQ3KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZnJhbWVzXzIwNDhfNDA5NSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTYpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZyYW1lc180MDk2XzkyMTYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZnJhbWVzXzkyMTdfMTYzODMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5icm9hZGNhc3RfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfREFUQV9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZGF0YV9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPm11bHRpY2FzdF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dW5pY2FzdF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9BQk9SVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmFib3J0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzY0KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzY1XzEyNykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfREFUQV9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0FCT1JUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhX3VucGFjayhiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmJ5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfNjQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZyYW1lc182NCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU182NV8xMjcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZyYW1lc182NV8xMjcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzEyOF8yNTUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzI1Nl81MTEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZyYW1lc181MTJfMTAyMykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZyYW1lc18xMDI0XzE1MTgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mcmFtZXNfMTUxOV8yMDQ3KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzIwNDhfNDA5NSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTYpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZyYW1lc180MDk2XzkyMTYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzkyMTdfMTYzODMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5icm9hZGNhc3RfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfREFUQV9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZGF0YV9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPm11bHRpY2FzdF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dW5pY2FzdF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9BQk9SVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmFib3J0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfNjQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzY1XzEyNykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxOCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0RBVEFfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9BQk9SVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jZmcudHJpZ2dlci50eXBlID0gQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfTk9ORTsKKyAgICAgICAgdGhpcy0+Y2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSA9IDA7CisgICAgICAgIHRoaXMtPmNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3BhY2soJnRoaXMtPmNmZywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ19nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+Y2ZnKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ191bnBhY2soJnRoaXMtPmNmZywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ19zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ19ib3VuZHNfY2hlY2soJnRoaXMtPmNmZykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfQ0ZHX0lEX0NGRzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXQgPSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0JZVEVTOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYWVfcGF0aF9kc19zdGF0X2lkX3BhY2sodGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfaWRfdW5wYWNrKCZ0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0KQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfQllURVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU182NDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfREFUQV9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0FCT1JUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdCA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfQllURVM7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfaWRfcGFjayh0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3VucGFjayhiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9pZF91bnBhY2soJnRoaXMtPnN0YXQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnN0YXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzY0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU182NV8xMjc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTg6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9EQVRBX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfQUJPUlRfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkID0gQkNNT1NfRkFMU0U7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhdF9hbGFybV9yYWlzZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfRFNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnN0YXRfYWxhcm1fY2xlYXJlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfYWVfcGF0aF91c19rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2FlX3BhdGhfdXNfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfS0VZX0lEX0FFX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFlX25pID0gKGJjbW9sdF9hZV9uaSkgMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX2tleV9wYWNrKGNvbnN0IGJjbW9sdF9hZV9wYXRoX3VzX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfS0VZX0lEX0FFX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPmFlX25pKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfYWVfcGF0aF91c19rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2FlX3BhdGhfdXNfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX0tFWV9JRF9BRV9OSSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfa2V5X3VucGFjayhiY21vbHRfYWVfcGF0aF91c19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX0tFWV9JRF9BRV9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPmFlX25pKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX2tleV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX0tFWV9JRF9BRV9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYWVfcGF0aF91c19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfYWVfcGF0aF91c19rZXlfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5ieXRlcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzY0KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lc182NCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzY1XzEyNykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmFtZXNfNjVfMTI3ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmFtZXNfMTI4XzI1NSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZnJhbWVzXzI1Nl81MTEgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmFtZXNfNTEyXzEwMjMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZnJhbWVzXzEwMjRfMTUxOCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmFtZXNfMTUxOV8yMDQ3ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lc18yMDQ4XzQwOTUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTYpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZnJhbWVzXzQwOTZfOTIxNiA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZnJhbWVzXzkyMTdfMTYzODMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YnJvYWRjYXN0X2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfREFUQV9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5kYXRhX2J5dGVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm11bHRpY2FzdF9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnVuaWNhc3RfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9BQk9SVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWJvcnRfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GQ1NfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZmNzX2Vycm9yID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9PVkVSU0laRV9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vdmVyc2l6ZV9lcnJvciA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfUlVOVF9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5ydW50X2Vycm9yID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+Ynl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU182NCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZnJhbWVzXzY0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzY1XzEyNykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZnJhbWVzXzY1XzEyNykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXNfMTI4XzI1NSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXNfMjU2XzUxMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZnJhbWVzXzUxMl8xMDIzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxOCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZnJhbWVzXzEwMjRfMTUxOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZyYW1lc18xNTE5XzIwNDcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXNfMjA0OF80MDk1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZnJhbWVzXzQwOTZfOTIxNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXNfOTIxN18xNjM4MykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmJyb2FkY2FzdF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9EQVRBX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5kYXRhX2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+bXVsdGljYXN0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51bmljYXN0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0FCT1JUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+YWJvcnRfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRkNTX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mY3NfZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9PVkVSU0laRV9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+b3ZlcnNpemVfZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9SVU5UX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5ydW50X2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfNjQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTYpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9EQVRBX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfQUJPUlRfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRkNTX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfT1ZFUlNJWkVfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9SVU5UX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGFfdW5wYWNrKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+Ynl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU182NCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzY0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzY1XzEyNykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzY1XzEyNykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mcmFtZXNfMTI4XzI1NSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mcmFtZXNfMjU2XzUxMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzUxMl8xMDIzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxOCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzEwMjRfMTUxOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZyYW1lc18xNTE5XzIwNDcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mcmFtZXNfMjA0OF80MDk1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzQwOTZfOTIxNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mcmFtZXNfOTIxN18xNjM4MykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmJyb2FkY2FzdF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9EQVRBX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5kYXRhX2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+bXVsdGljYXN0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT51bmljYXN0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0FCT1JUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+YWJvcnRfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRkNTX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mY3NfZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9PVkVSU0laRV9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+b3ZlcnNpemVfZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9SVU5UX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5ydW50X2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU182NCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfREFUQV9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0FCT1JUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GQ1NfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfT1ZFUlNJWkVfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfUlVOVF9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNmZy50cmlnZ2VyLnR5cGUgPSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOworICAgICAgICB0aGlzLT5jZmcuc29hay5hY3RpdmVfc29ha190aW1lID0gMDsKKyAgICAgICAgdGhpcy0+Y2ZnLnNvYWsuY2xlYXJfc29ha190aW1lID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfcGFjaygmdGhpcy0+Y2ZnLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5jZmcpOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfZGF0YV91bnBhY2soYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3VucGFjaygmdGhpcy0+Y2ZnLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2JvdW5kc19jaGVjaygmdGhpcy0+Y2ZnKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9DRkdfSURfQ0ZHOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdCA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfQllURVM7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfaWRfcGFjayh0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV91bnBhY2soYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9pZF91bnBhY2soJnRoaXMtPnN0YXQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnN0YXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzY0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU182NV8xMjc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTg6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9EQVRBX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfQUJPUlRfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZDU19FUlJPUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9PVkVSU0laRV9FUlJPUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9SVU5UX0VSUk9SOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0ID0gQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9CWVRFUzsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9pZF9wYWNrKHRoaXMtPnN0YXQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfdW5wYWNrKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYWVfcGF0aF91c19zdGF0X2lkX3VucGFjaygmdGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfNjQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzY1XzEyNzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxODoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0RBVEFfQllURVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9BQk9SVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRkNTX0VSUk9SOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX09WRVJTSVpFX0VSUk9SOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX1JVTlRfRVJST1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0X2FsYXJtX2NsZWFyZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdF9hbGFybV9yYWlzZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5zdGF0X2FsYXJtX2NsZWFyZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5zdGF0X2FsYXJtX3JhaXNlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQUVfUEFUSF9VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfZGF0YV91bnBhY2soYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c3RhdF9hbGFybV9yYWlzZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9BRV9QQVRIX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0FFX1BBVEhfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9jaGFubmVsX2tleV9zZXRfZGVmYXVsdChiY21vbHRfY2hhbm5lbF9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQ0hBTk5FTF9LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBvbl9uaSA9IChiY21vbHRfcG9uX25pKSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2NoYW5uZWxfa2V5X3BhY2soY29uc3QgYmNtb2x0X2NoYW5uZWxfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQ0hBTk5FTF9LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzLT5wb25fbmkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9jaGFubmVsX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfY2hhbm5lbF9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0NIQU5ORUxfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2NoYW5uZWxfa2V5X3VucGFjayhiY21vbHRfY2hhbm5lbF9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9DSEFOTkVMX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAodWludDhfdCAqKSAmdGhpcy0+cG9uX25pKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9jaGFubmVsX2tleV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9DSEFOTkVMX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9jaGFubmVsX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2NoYW5uZWxfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2NoYW5uZWxfa2V5X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0NIQU5ORUxfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+cG9uX25pID4gKGJjbW9sdF9wb25fbmkpIDE1KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfQ0hBTk5FTF9LRVlfSURfUE9OX05JOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9jaGFubmVsX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9jaGFubmVsX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX09QRVJBVElPTl9DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9wZXJhdGlvbl9jb250cm9sLnJlID0gMDsKKyAgICAgICAgdGhpcy0+b3BlcmF0aW9uX2NvbnRyb2wub2RuX2NsYXNzID0gQkNNT0xUX09ETl9DTEFTU19OMTsKKyAgICAgICAgdGhpcy0+b3BlcmF0aW9uX2NvbnRyb2wuZHNfZmVjX21vZGUgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9FTkFCTEU7CisgICAgICAgIHRoaXMtPm9wZXJhdGlvbl9jb250cm9sLnByb3RvY29sID0gQkNNT0xUX1RDX1BST1RPQ09MX1RDX0xBWUVSX1BST1RPQ09MX0dfOTg5X1BfMzsKKyAgICAgICAgdGhpcy0+b3BlcmF0aW9uX2NvbnRyb2wuZHNfbGlua190eXBlID0gQkNNT0xUX0xJTktfVFlQRV9VTlNQRUNJRklFRDsKKyAgICAgICAgdGhpcy0+b3BlcmF0aW9uX2NvbnRyb2wucG9uX2lkLmFkbWluaXN0cmF0aXZlX2xhYmVsID0gMDsKKyAgICAgICAgdGhpcy0+b3BlcmF0aW9uX2NvbnRyb2wucG9uX2lkLmR3bGNoX2lkID0gMDsKKyAgICAgICAgdGhpcy0+b3BlcmF0aW9uX2NvbnRyb2wuYyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9DSEFOTkVMX0NGR19JRF9UT0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dG9sID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX1NZU1RFTV9QUk9GSUxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN5c3RlbV9wcm9maWxlLm5nXzJfc3lzX2lkID0gMDsKKyAgICAgICAgdGhpcy0+c3lzdGVtX3Byb2ZpbGUudmVyc2lvbiA9IDA7CisgICAgICAgIHRoaXMtPnN5c3RlbV9wcm9maWxlLmNoYW5uZWxfc3BhY2luZyA9IDA7CisgICAgICAgIHRoaXMtPnN5c3RlbV9wcm9maWxlLnVzX29wZXJhdGluZ193YXZlbGVuZ3RoX2JhbmRzID0gQkNNT0xUX1VTX09QRVJBVElOR19XQVZFTEVOR1RIX0JBTkRTX0VYUEFOREVEX1NQRUNUUlVNX1dJREVfQkFORDsKKyAgICAgICAgdGhpcy0+c3lzdGVtX3Byb2ZpbGUudXNfbXNlID0gMDsKKyAgICAgICAgdGhpcy0+c3lzdGVtX3Byb2ZpbGUubG9vc2VfY2FsaWJyYXRpb25fYm91bmQgPSBCQ01PTFRfQ0FMSUJSQVRJT05fUkVDT1JEX1VOU1BFQ0lGSUVEOworICAgICAgICB0aGlzLT5zeXN0ZW1fcHJvZmlsZS5mc3IgPSAwOworICAgICAgICB0aGlzLT5zeXN0ZW1fcHJvZmlsZS50d2RtX2NoYW5uZWxfY291bnQgPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQ0hBTk5FTF9DRkdfSURfQ0hBTk5FTF9QUk9GSUxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIG1lbXNldCh0aGlzLT5jaGFubmVsX3Byb2ZpbGUuYXJyLCAwLCBzaXplb2YodGhpcy0+Y2hhbm5lbF9wcm9maWxlLmFycikpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2NoYW5uZWxfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfY2hhbm5lbF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX09QRVJBVElPTl9DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X29wZXJhdGlvbl9jb250cm9sX3BhY2soJnRoaXMtPm9wZXJhdGlvbl9jb250cm9sLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX1RPTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dG9sKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9DSEFOTkVMX0NGR19JRF9TWVNURU1fUFJPRklMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zeXN0ZW1fcHJvZmlsZV9wYWNrKCZ0aGlzLT5zeXN0ZW1fcHJvZmlsZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9DSEFOTkVMX0NGR19JRF9DSEFOTkVMX1BST0ZJTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXJyX2NoYW5uZWxfcHJvZmlsZV84X3BhY2soJnRoaXMtPmNoYW5uZWxfcHJvZmlsZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfY2hhbm5lbF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfY2hhbm5lbF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQ0hBTk5FTF9DRkdfSURfT1BFUkFUSU9OX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9DSEFOTkVMX0NGR19JRF9UT0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX1NZU1RFTV9QUk9GSUxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDEyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQ0hBTk5FTF9DRkdfSURfQ0hBTk5FTF9QUk9GSUxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDEyMDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9jaGFubmVsX2NmZ19kYXRhX3VucGFjayhiY21vbHRfY2hhbm5lbF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX09QRVJBVElPTl9DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X29wZXJhdGlvbl9jb250cm9sX3VucGFjaygmdGhpcy0+b3BlcmF0aW9uX2NvbnRyb2wsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9DSEFOTkVMX0NGR19JRF9UT0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnRvbCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQ0hBTk5FTF9DRkdfSURfU1lTVEVNX1BST0ZJTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3lzdGVtX3Byb2ZpbGVfdW5wYWNrKCZ0aGlzLT5zeXN0ZW1fcHJvZmlsZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX0NIQU5ORUxfUFJPRklMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfY2hhbm5lbF9wcm9maWxlXzhfdW5wYWNrKCZ0aGlzLT5jaGFubmVsX3Byb2ZpbGUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9jaGFubmVsX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX09QRVJBVElPTl9DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX1RPTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX1NZU1RFTV9QUk9GSUxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX0NIQU5ORUxfUFJPRklMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEyMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfY2hhbm5lbF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2NoYW5uZWxfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfY2hhbm5lbF9jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQ0hBTk5FTF9DRkdfSURfT1BFUkFUSU9OX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfb3BlcmF0aW9uX2NvbnRyb2xfYm91bmRzX2NoZWNrKCZ0aGlzLT5vcGVyYXRpb25fY29udHJvbCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9DSEFOTkVMX0NGR19JRF9PUEVSQVRJT05fQ09OVFJPTDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfQ0hBTk5FTF9DRkdfSURfVE9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT50b2wgPiA1MTEpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9DSEFOTkVMX0NGR19JRF9UT0w7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX1NZU1RFTV9QUk9GSUxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N5c3RlbV9wcm9maWxlX2JvdW5kc19jaGVjaygmdGhpcy0+c3lzdGVtX3Byb2ZpbGUpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfQ0hBTk5FTF9DRkdfSURfU1lTVEVNX1BST0ZJTEU7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX0NIQU5ORUxfUFJPRklMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfY2hhbm5lbF9wcm9maWxlXzhfYm91bmRzX2NoZWNrKCZ0aGlzLT5jaGFubmVsX3Byb2ZpbGUpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfQ0hBTk5FTF9DRkdfSURfQ0hBTk5FTF9QUk9GSUxFOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9kZWJ1Z19rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2RlYnVnX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19LRVlfSURfUkVTRVJWRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmVzZXJ2ZWQgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2tleV9wYWNrKGNvbnN0IGJjbW9sdF9kZWJ1Z19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19LRVlfSURfUkVTRVJWRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnJlc2VydmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZGVidWdfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9kZWJ1Z19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0tFWV9JRF9SRVNFUlZFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2tleV91bnBhY2soYmNtb2x0X2RlYnVnX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0tFWV9JRF9SRVNFUlZFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+cmVzZXJ2ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2tleV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19LRVlfSURfUkVTRVJWRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9kZWJ1Z19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZGVidWdfa2V5X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2RlYnVnX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9kZWJ1Z19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19DRkdfSURfQ09OU09MRV9SRURJUkVDVElPTikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jb25zb2xlX3JlZGlyZWN0aW9uID0gQkNNT0xUX0NPTlNPTEVfUkVESVJFQ1RJT05fTk9ORTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0NGR19JRF9JTkRJQ0FUSU9OU19EUk9QUEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmluZGljYXRpb25zX2Ryb3BwZWQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVCVUdfQ0ZHX0lEX0ZJTEVfVVNFRF9QRVJDRU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZpbGVfdXNlZF9wZXJjZW50ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0NGR19JRF9BUElfQ0FQVFVSRV9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YXBpX2NhcHR1cmVfY2ZnLmxvY2F0aW9uID0gQkNNT0xUX0FQSV9DQVBUVVJFX0xPQ0FUSU9OX0RFVklDRTsKKyAgICAgICAgdGhpcy0+YXBpX2NhcHR1cmVfY2ZnLmJ1ZmZlcl9zaXplX2J5dGVzID0gMTYzODQ7CisgICAgICAgIHRoaXMtPmFwaV9jYXB0dXJlX2NmZy5idWZmZXJfbW9kZSA9IEJDTU9MVF9BUElfQ0FQVFVSRV9CVUZGRVJfTU9ERV9XUkFQOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVCVUdfQ0ZHX0lEX0FQSV9DQVBUVVJFX1NUQVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFwaV9jYXB0dXJlX3N0YXRzLmJ1ZmZlcl91c2VkX2J5dGVzID0gMDsKKyAgICAgICAgdGhpcy0+YXBpX2NhcHR1cmVfc3RhdHMuYnVmZmVyX3dyYXBfY291bnQgPSAwOworICAgICAgICB0aGlzLT5hcGlfY2FwdHVyZV9zdGF0cy5ldmVudHNfcmVjb3JkZWQgPSAwOworICAgICAgICB0aGlzLT5hcGlfY2FwdHVyZV9zdGF0cy5ldmVudHNfZHJvcHBlZCA9IDA7CisgICAgICAgIHRoaXMtPmFwaV9jYXB0dXJlX3N0YXRzLnJlYWRhYmxlX2J5dGVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0NGR19JRF9BUElfQ0FQVFVSRV9CVUZGRVJfUkVBRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hcGlfY2FwdHVyZV9idWZmZXJfcmVhZC5vZmZzZXQgPSAwOworICAgICAgICB0aGlzLT5hcGlfY2FwdHVyZV9idWZmZXJfcmVhZC5zaXplID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0NGR19JRF9BUElfQ0FQVFVSRV9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YXBpX2NhcHR1cmVfYnVmZmVyLmxlbiA9IDA7CisgICAgICAgIHRoaXMtPmFwaV9jYXB0dXJlX2J1ZmZlci52YWwgPSBOVUxMOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2RlYnVnX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVCVUdfQ0ZHX0lEX0NPTlNPTEVfUkVESVJFQ1RJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfY29uc29sZV9yZWRpcmVjdGlvbl9wYWNrKHRoaXMtPmNvbnNvbGVfcmVkaXJlY3Rpb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVCVUdfQ0ZHX0lEX0lORElDQVRJT05TX0RST1BQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmluZGljYXRpb25zX2Ryb3BwZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0NGR19JRF9GSUxFX1VTRURfUEVSQ0VOVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5maWxlX3VzZWRfcGVyY2VudCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVCVUdfQ0ZHX0lEX0FQSV9DQVBUVVJFX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcGlfY2FwdHVyZV9jb25maWdfcGFjaygmdGhpcy0+YXBpX2NhcHR1cmVfY2ZnLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0NGR19JRF9BUElfQ0FQVFVSRV9TVEFUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcGlfY2FwdHVyZV9zdGF0c19wYWNrKCZ0aGlzLT5hcGlfY2FwdHVyZV9zdGF0cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfQlVGRkVSX1JFQUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWRlcl9wYWNrKCZ0aGlzLT5hcGlfY2FwdHVyZV9idWZmZXJfcmVhZCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTMyX3BhY2soJnRoaXMtPmFwaV9jYXB0dXJlX2J1ZmZlciwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZGVidWdfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2RlYnVnX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19DRkdfSURfQ09OU09MRV9SRURJUkVDVElPTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVCVUdfQ0ZHX0lEX0lORElDQVRJT05TX0RST1BQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0NGR19JRF9GSUxFX1VTRURfUEVSQ0VOVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVCVUdfQ0ZHX0lEX0FQSV9DQVBUVVJFX0NGRykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA2OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVCVUdfQ0ZHX0lEX0FQSV9DQVBUVVJFX1NUQVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDIwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVCVUdfQ0ZHX0lEX0FQSV9DQVBUVVJFX0JVRkZFUl9SRUFEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF91OF9saXN0X3UzMl9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+YXBpX2NhcHR1cmVfYnVmZmVyKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19jZmdfZGF0YV91bnBhY2soYmNtb2x0X2RlYnVnX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVCVUdfQ0ZHX0lEX0NPTlNPTEVfUkVESVJFQ1RJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfY29uc29sZV9yZWRpcmVjdGlvbl91bnBhY2soJnRoaXMtPmNvbnNvbGVfcmVkaXJlY3Rpb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVCVUdfQ0ZHX0lEX0lORElDQVRJT05TX0RST1BQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmluZGljYXRpb25zX2Ryb3BwZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0NGR19JRF9GSUxFX1VTRURfUEVSQ0VOVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5maWxlX3VzZWRfcGVyY2VudCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVCVUdfQ0ZHX0lEX0FQSV9DQVBUVVJFX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcGlfY2FwdHVyZV9jb25maWdfdW5wYWNrKCZ0aGlzLT5hcGlfY2FwdHVyZV9jZmcsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfU1RBVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXBpX2NhcHR1cmVfc3RhdHNfdW5wYWNrKCZ0aGlzLT5hcGlfY2FwdHVyZV9zdGF0cywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0NGR19JRF9BUElfQ0FQVFVSRV9CVUZGRVJfUkVBRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfcmVhZGVyX3VucGFjaygmdGhpcy0+YXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTMyX3VucGFjaygmdGhpcy0+YXBpX2NhcHR1cmVfYnVmZmVyLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVCVUdfQ0ZHX0lEX0NPTlNPTEVfUkVESVJFQ1RJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19DRkdfSURfSU5ESUNBVElPTlNfRFJPUFBFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0NGR19JRF9GSUxFX1VTRURfUEVSQ0VOVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0NGR19JRF9BUElfQ0FQVFVSRV9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA2KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfU1RBVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVCVUdfQ0ZHX0lEX0FQSV9DQVBUVVJFX0JVRkZFUl9SRUFEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVCVUdfQ0ZHX0lEX0FQSV9DQVBUVVJFX0JVRkZFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF91OF9saXN0X3UzMl9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2RlYnVnX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2RlYnVnX2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19DRkdfSURfQ09OU09MRV9SRURJUkVDVElPTikpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmNvbnNvbGVfcmVkaXJlY3Rpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0NPTlNPTEVfUkVESVJFQ1RJT05fTk9ORToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0NPTlNPTEVfUkVESVJFQ1RJT05fUkVESVJFQ1Q6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9DT05TT0xFX1JFRElSRUNUSU9OX0NMT05FOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfREVCVUdfQ0ZHX0lEX0NPTlNPTEVfUkVESVJFQ1RJT047CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2FwaV9jYXB0dXJlX2NvbmZpZ19ib3VuZHNfY2hlY2soJnRoaXMtPmFwaV9jYXB0dXJlX2NmZykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfQ0ZHOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfU1RBVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXBpX2NhcHR1cmVfc3RhdHNfYm91bmRzX2NoZWNrKCZ0aGlzLT5hcGlfY2FwdHVyZV9zdGF0cykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfU1RBVFM7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0NGR19JRF9BUElfQ0FQVFVSRV9CVUZGRVJfUkVBRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfcmVhZGVyX2JvdW5kc19jaGVjaygmdGhpcy0+YXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfREVCVUdfQ0ZHX0lEX0FQSV9DQVBUVVJFX0JVRkZFUl9SRUFEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTMyX2JvdW5kc19jaGVjaygmdGhpcy0+YXBpX2NhcHR1cmVfYnVmZmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0RFQlVHX0NGR19JRF9BUElfQ0FQVFVSRV9CVUZGRVI7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZGVidWdfY2xpX291dHB1dF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0NMSV9PVVRQVVRfSURfREFUQSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5kYXRhLmxlbiA9IDA7CisgICAgICAgIHRoaXMtPmRhdGEudmFsID0gTlVMTDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfZGVidWdfY2xpX291dHB1dF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVCVUdfQ0xJX09VVFBVVF9JRF9EQVRBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTMyX3BhY2soJnRoaXMtPmRhdGEsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZGVidWdfY2xpX291dHB1dF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19DTElfT1VUUFVUX0lEX0RBVEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X3U4X2xpc3RfdTMyX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5kYXRhKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2RhdGFfdW5wYWNrKGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19DTElfT1VUUFVUX0lEX0RBVEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfdW5wYWNrKCZ0aGlzLT5kYXRhLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfY2xpX291dHB1dF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0NMSV9PVVRQVVRfSURfREFUQSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF91OF9saXN0X3UzMl9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZGVidWdfY2xpX291dHB1dF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19DTElfT1VUUFVUX0lEX0RBVEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfYm91bmRzX2NoZWNrKCZ0aGlzLT5kYXRhKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0RFQlVHX0NMSV9PVVRQVVRfSURfREFUQTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZGVidWdfYXV0b19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZGVidWdfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19BVVRPX0NGR19JRF9DTElfT1VUUFVUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNsaV9vdXRwdXQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0FVVE9fQ0ZHX0lEX0ZJTEVfQUxNT1NUX0ZVTEwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZmlsZV9hbG1vc3RfZnVsbCA9IEJDTU9TX0ZBTFNFOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZGVidWdfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0FVVE9fQ0ZHX0lEX0NMSV9PVVRQVVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5jbGlfb3V0cHV0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19BVVRPX0NGR19JRF9GSUxFX0FMTU9TVF9GVUxMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+ZmlsZV9hbG1vc3RfZnVsbCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0FVVE9fQ0ZHX0lEX0NMSV9PVVRQVVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0FVVE9fQ0ZHX0lEX0ZJTEVfQUxNT1NUX0ZVTEwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZGVidWdfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0FVVE9fQ0ZHX0lEX0NMSV9PVVRQVVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5jbGlfb3V0cHV0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19BVVRPX0NGR19JRF9GSUxFX0FMTU9TVF9GVUxMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+ZmlsZV9hbG1vc3RfZnVsbCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfYXV0b19jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19BVVRPX0NGR19JRF9DTElfT1VUUFVUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVCVUdfQVVUT19DRkdfSURfRklMRV9BTE1PU1RfRlVMTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERUJVR19DTElfSU5QVVRfSURfREFUQSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5kYXRhLmxlbiA9IDA7CisgICAgICAgIHRoaXMtPmRhdGEudmFsID0gTlVMTDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0NMSV9JTlBVVF9JRF9EQVRBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTMyX3BhY2soJnRoaXMtPmRhdGEsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVCVUdfQ0xJX0lOUFVUX0lEX0RBVEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X3U4X2xpc3RfdTMyX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5kYXRhKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfZGF0YV91bnBhY2soYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVCVUdfQ0xJX0lOUFVUX0lEX0RBVEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfdW5wYWNrKCZ0aGlzLT5kYXRhLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfY2xpX2lucHV0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVCVUdfQ0xJX0lOUFVUX0lEX0RBVEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfY2xpX2lucHV0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVCVUdfQ0xJX0lOUFVUX0lEX0RBVEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfYm91bmRzX2NoZWNrKCZ0aGlzLT5kYXRhKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0RFQlVHX0NMSV9JTlBVVF9JRF9EQVRBOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9kZXZpY2Vfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF9kZXZpY2Vfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9LRVlfSURfUkVTRVJWRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmVzZXJ2ZWQgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9rZXlfcGFjayhjb25zdCBiY21vbHRfZGV2aWNlX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9LRVlfSURfUkVTRVJWRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnJlc2VydmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZGV2aWNlX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZGV2aWNlX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0tFWV9JRF9SRVNFUlZFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9rZXlfdW5wYWNrKGJjbW9sdF9kZXZpY2Vfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0tFWV9JRF9SRVNFUlZFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+cmVzZXJ2ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0tFWV9JRF9SRVNFUlZFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9kZXZpY2Vfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2RldmljZV9rZXlfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZGV2aWNlX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9TWVNURU1fTU9ERSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zeXN0ZW1fbW9kZSA9IEJDTU9MVF9TWVNURU1fTU9ERV9HUE9OX18xNl9YOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9LRUVQQUxJVkVfSU5URVJWQUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+a2VlcGFsaXZlX2ludGVydmFsID0gNTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfS0VFUEFMSVZFX1RPTEVSQU5DRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5rZWVwYWxpdmVfdG9sZXJhbmNlID0gMzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfRklSTVdBUkVfU1dfVkVSU0lPTikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5maXJtd2FyZV9zd192ZXJzaW9uLm1ham9yID0gMDsKKyAgICAgICAgdGhpcy0+ZmlybXdhcmVfc3dfdmVyc2lvbi5taW5vciA9IDA7CisgICAgICAgIHRoaXMtPmZpcm13YXJlX3N3X3ZlcnNpb24ucmV2aXNpb24gPSAwOworICAgICAgICB0aGlzLT5maXJtd2FyZV9zd192ZXJzaW9uLm1vZGVsID0gMDsKKyAgICAgICAgbWVtc2V0KHRoaXMtPmZpcm13YXJlX3N3X3ZlcnNpb24uYnVpbGRfdGltZSwgMCwgMzIpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9IT1NUX1NXX1ZFUlNJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+aG9zdF9zd192ZXJzaW9uLm1ham9yID0gMDsKKyAgICAgICAgdGhpcy0+aG9zdF9zd192ZXJzaW9uLm1pbm9yID0gMDsKKyAgICAgICAgdGhpcy0+aG9zdF9zd192ZXJzaW9uLnJldmlzaW9uID0gMDsKKyAgICAgICAgdGhpcy0+aG9zdF9zd192ZXJzaW9uLm1vZGVsID0gMDsKKyAgICAgICAgbWVtc2V0KHRoaXMtPmhvc3Rfc3dfdmVyc2lvbi5idWlsZF90aW1lLCAwLCAzMik7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0NISVBfUkVWSVNJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Y2hpcF9yZXZpc2lvbiA9IChiY21vbHRfZGV2aWNlX2NoaXBfcmV2aXNpb24pIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXRlID0gQkNNT0xUX0RFVklDRV9TVEFURV9ESVNDT05ORUNURUQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0RFQlVHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRlYnVnLmhvc3RfZG1hX3J4X3F1ZXVlX3NpemUgPSAxMjg7CisgICAgICAgIHRoaXMtPmRlYnVnLmhvc3RfZG1hX3R4X3F1ZXVlX3NpemUgPSAxMjg7CisgICAgICAgIHRoaXMtPmRlYnVnLmF2c19jb250cm9sID0gQkNNT1NfRkFMU0U7CisgICAgICAgIHRoaXMtPmRlYnVnLnVzZV9wcmV2X3Bvbl9zZXJkZXNfZmlybXdhcmUgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgdGhpcy0+ZGVidWcudXNlX3ByZXZfbm5pX3NlcmRlc19maXJtd2FyZSA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9OTklfU1BFRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bm5pX3NwZWVkLmZpcnN0X2hhbGYgPSBCQ01PTFRfTk5JX1NQRUVEX0dCUFNfMTsKKyAgICAgICAgdGhpcy0+bm5pX3NwZWVkLnNlY29uZF9oYWxmID0gQkNNT0xUX05OSV9TUEVFRF9HQlBTXzE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX0VYVF9JUlEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cHJvdGVjdGlvbl9zd2l0Y2hpbmdfZXh0X2lycSA9IEJDTU9MVF9FWFRfSVJRX1VOQ09ORklHVVJFRDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfRVBPTl9DTE9DS19UUkFOU1BPUlRfU0FNUExFX0RFTEFZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmVwb25fY2xvY2tfdHJhbnNwb3J0X3NhbXBsZV9kZWxheSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0lORElDQVRJT05fU0hBUElORykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5pbmRpY2F0aW9uX3NoYXBpbmcuZW5hYmxlZCA9IEJDTU9TX0ZBTFNFOworICAgICAgICB0aGlzLT5pbmRpY2F0aW9uX3NoYXBpbmcubWF4X3JhdGUgPSAxMDAwOworICAgICAgICB0aGlzLT5pbmRpY2F0aW9uX3NoYXBpbmcubWF4X2J1cnN0ID0gMTAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9DSElQX1RFTVBFUkFUVVJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNoaXBfdGVtcGVyYXR1cmUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9HUE9OX1hHUE9OX1RPRF9FTkFCTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Z3Bvbl94Z3Bvbl90b2RfZW5hYmxlID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfR1BPTl9YR1BPTl9UT0RfR1BJT19QSU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Z3Bvbl94Z3Bvbl90b2RfZ3Bpb19waW4gPSBCQ01PTFRfR1BJT19QSU5fVU5DT05GSUdVUkVEOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9HUE9OX1hHUE9OX1RPRF9DT05ORUNURURfSU5URVJOQUxMWSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5ncG9uX3hncG9uX3RvZF9jb25uZWN0ZWRfaW50ZXJuYWxseSA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9FUE9OXzgwMjFfQVNfVE9EX0ZPUk1BVCkpICE9IDApCisgICAgeworICAgICAgICBtZW1zZXQodGhpcy0+ZXBvbl84MDIxX2FzX3RvZF9mb3JtYXQuc3RyLCAwLCAyNTYpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9FUE9OX1NIQVBFUl9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmVwb25fc2hhcGVyX21vZGUgPSBCQ01PTFRfU0hBUEVSX01PREVfTEFZRVJfMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfRU1CRURERURfSU1BR0VfTElTVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5lbWJlZGRlZF9pbWFnZV9saXN0LmxlbiA9IDA7CisgICAgICAgIHRoaXMtPmVtYmVkZGVkX2ltYWdlX2xpc3QudmFsID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfQ0hJUF9WT0xUQUdFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNoaXBfdm9sdGFnZSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VQT05fVE9EX1NUUklORykpICE9IDApCisgICAgeworICAgICAgICBtZW1zZXQodGhpcy0+ZXBvbl90b2Rfc3RyaW5nLnN0ciwgMCwgMjU2KTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfWEdQT05fTlVNX09GX09OVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+eGdwb25fbnVtX29mX29udXMgPSBCQ01PTFRfWEdQT05fTlVNX09GX09OVVNfWEdQT05fU1VQUE9SVF8yNTZfT05VUzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfREVWSUNFX0lQX0FERFJFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgYmNtb3NfaXB2NF9hZGRyZXNzX2luaXQoJnRoaXMtPmRldmljZV9pcF9hZGRyZXNzKTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfREVWSUNFX1VEUF9QT1JUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRldmljZV91ZHBfcG9ydCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1RPRF9VQVJUX0JBVURSQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnRvZF91YXJ0X2JhdWRyYXRlID0gQkNNT0xUX1VBUlRfQkFVRFJBVEVfVUFSVF9SQVRFXzk2MDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX1NUUklOR19MRU5HVEgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Z3Bvbl94Z3Bvbl90b2Rfc3RyaW5nX2xlbmd0aCA9IDE2OworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1NZU1RFTV9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N5c3RlbV9tb2RlX3BhY2sodGhpcy0+c3lzdGVtX21vZGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9LRUVQQUxJVkVfSU5URVJWQUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmtlZXBhbGl2ZV9pbnRlcnZhbCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9LRUVQQUxJVkVfVE9MRVJBTkNFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5rZWVwYWxpdmVfdG9sZXJhbmNlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0ZJUk1XQVJFX1NXX1ZFUlNJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbl9wYWNrKCZ0aGlzLT5maXJtd2FyZV9zd192ZXJzaW9uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfSE9TVF9TV19WRVJTSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2hvc3Rfc3dfdmVyc2lvbl9wYWNrKCZ0aGlzLT5ob3N0X3N3X3ZlcnNpb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9DSElQX1JFVklTSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2RldmljZV9jaGlwX3JldmlzaW9uX3BhY2sodGhpcy0+Y2hpcF9yZXZpc2lvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2RldmljZV9zdGF0ZV9wYWNrKHRoaXMtPnN0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfREVCVUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZGVidWdfZGV2aWNlX2NmZ19wYWNrKCZ0aGlzLT5kZWJ1ZywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX05OSV9TUEVFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9kZXZpY2Vfbm5pX3NwZWVkX3BhY2soJnRoaXMtPm5uaV9zcGVlZCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX0VYVF9JUlEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXh0X2lycV9wYWNrKHRoaXMtPnByb3RlY3Rpb25fc3dpdGNoaW5nX2V4dF9pcnEsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9FUE9OX0NMT0NLX1RSQU5TUE9SVF9TQU1QTEVfREVMQVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmVwb25fY2xvY2tfdHJhbnNwb3J0X3NhbXBsZV9kZWxheSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9JTkRJQ0FUSU9OX1NIQVBJTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfaW5kaWNhdGlvbl9zaGFwaW5nX3BhY2soJnRoaXMtPmluZGljYXRpb25fc2hhcGluZywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0NISVBfVEVNUEVSQVRVUkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmNoaXBfdGVtcGVyYXR1cmUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfR1BPTl9YR1BPTl9UT0RfRU5BQkxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfcGFjayh0aGlzLT5ncG9uX3hncG9uX3RvZF9lbmFibGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9HUE9OX1hHUE9OX1RPRF9HUElPX1BJTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncGlvX3Bpbl9wYWNrKHRoaXMtPmdwb25feGdwb25fdG9kX2dwaW9fcGluLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfR1BPTl9YR1BPTl9UT0RfQ09OTkVDVEVEX0lOVEVSTkFMTFkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5ncG9uX3hncG9uX3RvZF9jb25uZWN0ZWRfaW50ZXJuYWxseSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9FUE9OXzgwMjFfQVNfVE9EX0ZPUk1BVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdHJfMjU2X3BhY2soJnRoaXMtPmVwb25fODAyMV9hc190b2RfZm9ybWF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfRVBPTl9TSEFQRVJfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zaGFwZXJfbW9kZV9wYWNrKHRoaXMtPmVwb25fc2hhcGVyX21vZGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9FTUJFRERFRF9JTUFHRV9MSVNUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5X2xpc3RfdThfcGFjaygmdGhpcy0+ZW1iZWRkZWRfaW1hZ2VfbGlzdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0NISVBfVk9MVEFHRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+Y2hpcF92b2x0YWdlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VQT05fVE9EX1NUUklORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdHJfMjU2X3BhY2soJnRoaXMtPmVwb25fdG9kX3N0cmluZywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1hHUE9OX05VTV9PRl9PTlVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX251bV9vZl9vbnVzX3BhY2sodGhpcy0+eGdwb25fbnVtX29mX29udXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9ERVZJQ0VfSVBfQUREUkVTUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfaXB2NF9hZGRyZXNzKGJ1ZiwgdGhpcy0+ZGV2aWNlX2lwX2FkZHJlc3MpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfREVWSUNFX1VEUF9QT1JUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5kZXZpY2VfdWRwX3BvcnQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfVE9EX1VBUlRfQkFVRFJBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdWFydF9iYXVkcmF0ZV9wYWNrKHRoaXMtPnRvZF91YXJ0X2JhdWRyYXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfR1BPTl9YR1BPTl9UT0RfU1RSSU5HX0xFTkdUSCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5ncG9uX3hncG9uX3RvZF9zdHJpbmdfbGVuZ3RoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZGV2aWNlX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfU1lTVEVNX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfS0VFUEFMSVZFX0lOVEVSVkFMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0tFRVBBTElWRV9UT0xFUkFOQ0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfRklSTVdBUkVfU1dfVkVSU0lPTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAzOTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfSE9TVF9TV19WRVJTSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDM5OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9DSElQX1JFVklTSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0RFQlVHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDc7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX05OSV9TUEVFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19FWFRfSVJRKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VQT05fQ0xPQ0tfVFJBTlNQT1JUX1NBTVBMRV9ERUxBWSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9JTkRJQ0FUSU9OX1NIQVBJTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gOTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfQ0hJUF9URU1QRVJBVFVSRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9HUE9OX1hHUE9OX1RPRF9FTkFCTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfR1BPTl9YR1BPTl9UT0RfR1BJT19QSU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfR1BPTl9YR1BPTl9UT0RfQ09OTkVDVEVEX0lOVEVSTkFMTFkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfRVBPTl84MDIxX0FTX1RPRF9GT1JNQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjU2OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9FUE9OX1NIQVBFUl9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VNQkVEREVEX0lNQUdFX0xJU1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5X2xpc3RfdThfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmVtYmVkZGVkX2ltYWdlX2xpc3QpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9DSElQX1ZPTFRBR0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfRVBPTl9UT0RfU1RSSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI1NjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfWEdQT05fTlVNX09GX09OVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfREVWSUNFX0lQX0FERFJFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfREVWSUNFX1VEUF9QT1JUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1RPRF9VQVJUX0JBVURSQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX1NUUklOR19MRU5HVEgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1NZU1RFTV9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N5c3RlbV9tb2RlX3VucGFjaygmdGhpcy0+c3lzdGVtX21vZGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9LRUVQQUxJVkVfSU5URVJWQUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmtlZXBhbGl2ZV9pbnRlcnZhbCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9LRUVQQUxJVkVfVE9MRVJBTkNFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5rZWVwYWxpdmVfdG9sZXJhbmNlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0ZJUk1XQVJFX1NXX1ZFUlNJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbl91bnBhY2soJnRoaXMtPmZpcm13YXJlX3N3X3ZlcnNpb24sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0hPU1RfU1dfVkVSU0lPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ob3N0X3N3X3ZlcnNpb25fdW5wYWNrKCZ0aGlzLT5ob3N0X3N3X3ZlcnNpb24sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0NISVBfUkVWSVNJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZGV2aWNlX2NoaXBfcmV2aXNpb25fdW5wYWNrKCZ0aGlzLT5jaGlwX3JldmlzaW9uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZGV2aWNlX3N0YXRlX3VucGFjaygmdGhpcy0+c3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9ERUJVRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9kZWJ1Z19kZXZpY2VfY2ZnX3VucGFjaygmdGhpcy0+ZGVidWcsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX05OSV9TUEVFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9kZXZpY2Vfbm5pX3NwZWVkX3VucGFjaygmdGhpcy0+bm5pX3NwZWVkLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19FWFRfSVJRKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2V4dF9pcnFfdW5wYWNrKCZ0aGlzLT5wcm90ZWN0aW9uX3N3aXRjaGluZ19leHRfaXJxLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfRVBPTl9DTE9DS19UUkFOU1BPUlRfU0FNUExFX0RFTEFZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5lcG9uX2Nsb2NrX3RyYW5zcG9ydF9zYW1wbGVfZGVsYXkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfSU5ESUNBVElPTl9TSEFQSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2luZGljYXRpb25fc2hhcGluZ191bnBhY2soJnRoaXMtPmluZGljYXRpb25fc2hhcGluZywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfQ0hJUF9URU1QRVJBVFVSRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+Y2hpcF90ZW1wZXJhdHVyZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9HUE9OX1hHUE9OX1RPRF9FTkFCTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfY29udHJvbF9zdGF0ZV91bnBhY2soJnRoaXMtPmdwb25feGdwb25fdG9kX2VuYWJsZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX0dQSU9fUElOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwaW9fcGluX3VucGFjaygmdGhpcy0+Z3Bvbl94Z3Bvbl90b2RfZ3Bpb19waW4sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9HUE9OX1hHUE9OX1RPRF9DT05ORUNURURfSU5URVJOQUxMWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmdwb25feGdwb25fdG9kX2Nvbm5lY3RlZF9pbnRlcm5hbGx5KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VQT05fODAyMV9BU19UT0RfRk9STUFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0cl8yNTZfdW5wYWNrKCZ0aGlzLT5lcG9uXzgwMjFfYXNfdG9kX2Zvcm1hdCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfRVBPTl9TSEFQRVJfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zaGFwZXJfbW9kZV91bnBhY2soJnRoaXMtPmVwb25fc2hhcGVyX21vZGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9FTUJFRERFRF9JTUFHRV9MSVNUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5X2xpc3RfdThfdW5wYWNrKCZ0aGlzLT5lbWJlZGRlZF9pbWFnZV9saXN0LCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9DSElQX1ZPTFRBR0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmNoaXBfdm9sdGFnZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9FUE9OX1RPRF9TVFJJTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RyXzI1Nl91bnBhY2soJnRoaXMtPmVwb25fdG9kX3N0cmluZywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfWEdQT05fTlVNX09GX09OVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fbnVtX29mX29udXNfdW5wYWNrKCZ0aGlzLT54Z3Bvbl9udW1fb2Zfb251cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0RFVklDRV9JUF9BRERSRVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2lwdjRfYWRkcmVzcyhidWYsICZ0aGlzLT5kZXZpY2VfaXBfYWRkcmVzcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9ERVZJQ0VfVURQX1BPUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmRldmljZV91ZHBfcG9ydCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9UT0RfVUFSVF9CQVVEUkFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF91YXJ0X2JhdWRyYXRlX3VucGFjaygmdGhpcy0+dG9kX3VhcnRfYmF1ZHJhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9HUE9OX1hHUE9OX1RPRF9TVFJJTkdfTEVOR1RIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmdwb25feGdwb25fdG9kX3N0cmluZ19sZW5ndGgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1NZU1RFTV9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9LRUVQQUxJVkVfSU5URVJWQUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0tFRVBBTElWRV9UT0xFUkFOQ0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0ZJUk1XQVJFX1NXX1ZFUlNJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAzOSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9IT1NUX1NXX1ZFUlNJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAzOSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9DSElQX1JFVklTSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfREVCVUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA3KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX05OSV9TUEVFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfRVhUX0lSUSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfRVBPTl9DTE9DS19UUkFOU1BPUlRfU0FNUExFX0RFTEFZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9JTkRJQ0FUSU9OX1NIQVBJTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA5KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0NISVBfVEVNUEVSQVRVUkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX0VOQUJMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfR1BPTl9YR1BPTl9UT0RfR1BJT19QSU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX0NPTk5FQ1RFRF9JTlRFUk5BTExZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9FUE9OXzgwMjFfQVNfVE9EX0ZPUk1BVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDI1NikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9FUE9OX1NIQVBFUl9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9FTUJFRERFRF9JTUFHRV9MSVNUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5X2xpc3RfdThfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9DSElQX1ZPTFRBR0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VQT05fVE9EX1NUUklORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDI1NikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9YR1BPTl9OVU1fT0ZfT05VUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfREVWSUNFX0lQX0FERFJFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0RFVklDRV9VRFBfUE9SVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfVE9EX1VBUlRfQkFVRFJBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX1NUUklOR19MRU5HVEgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZGV2aWNlX2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1NZU1RFTV9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3lzdGVtX21vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0dQT05fXzE2X1g6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9HUE9OX184X1g6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9HUE9OX180X1g6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX18xNl9YOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfWEdQT05fMV9fOF9YOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fOF9YX0NPRVhJU1RFTkNFX1RETUE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9BRV84X1g6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX184X1hfMTBfRzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0dQT05fOF9YR1BPTl80X1hfQ09FWElTVEVOQ0U6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX184X1g6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX180X1g6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX180X1hfQ09FWElTVEVOQ0VfVERNQToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzRfWF8xMF9HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfWEdTX18yX1hfMTBfRzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX05HUE9OMl9fMl9YXzEwX0c6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9OR1BPTjJfXzhfWF8yX1BfNV9HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfWEdQT05fMV9fNF9YOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fMl9YXzEwX0c6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1NZU1RFTV9NT0RFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9LRUVQQUxJVkVfSU5URVJWQUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmtlZXBhbGl2ZV9pbnRlcnZhbCA+IDE1KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9LRUVQQUxJVkVfSU5URVJWQUw7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfS0VFUEFMSVZFX1RPTEVSQU5DRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+a2VlcGFsaXZlX3RvbGVyYW5jZSA+IDUpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0tFRVBBTElWRV9UT0xFUkFOQ0U7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfRklSTVdBUkVfU1dfVkVSU0lPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9maXJtd2FyZV9zd192ZXJzaW9uX2JvdW5kc19jaGVjaygmdGhpcy0+ZmlybXdhcmVfc3dfdmVyc2lvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0ZJUk1XQVJFX1NXX1ZFUlNJT047CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfSE9TVF9TV19WRVJTSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2hvc3Rfc3dfdmVyc2lvbl9ib3VuZHNfY2hlY2soJnRoaXMtPmhvc3Rfc3dfdmVyc2lvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0hPU1RfU1dfVkVSU0lPTjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9DSElQX1JFVklTSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+Y2hpcF9yZXZpc2lvbikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0NISVBfUkVWSVNJT05fQTA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfQ0hJUF9SRVZJU0lPTl9CMDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0RFVklDRV9DRkdfSURfQ0hJUF9SRVZJU0lPTjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX1NUQVRFX0RJU0NPTk5FQ1RFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9TVEFURV9DT05ORUNUSU5HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX1NUQVRFX1JFQURZOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX1NUQVRFX1dBSVRJTkdfRk9SX0RFVklDRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9TVEFURV9URVNUSU5HX0REUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0RFVklDRV9DRkdfSURfU1RBVEU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0RFQlVHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2RlYnVnX2RldmljZV9jZmdfYm91bmRzX2NoZWNrKCZ0aGlzLT5kZWJ1ZykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0RFQlVHOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX05OSV9TUEVFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9kZXZpY2Vfbm5pX3NwZWVkX2JvdW5kc19jaGVjaygmdGhpcy0+bm5pX3NwZWVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0RFVklDRV9DRkdfSURfTk5JX1NQRUVEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX0VYVF9JUlEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5wcm90ZWN0aW9uX3N3aXRjaGluZ19leHRfaXJxKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FWFRfSVJRX0VYVF9JUlEwOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVhUX0lSUV9FWFRfSVJRMToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VYVF9JUlFfRVhUX0lSUTI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FWFRfSVJRX0VYVF9JUlEzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVhUX0lSUV9FWFRfSVJRNDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VYVF9JUlFfRVhUX0lSUTU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FWFRfSVJRX1VOQ09ORklHVVJFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0RFVklDRV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfRVhUX0lSUTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfSU5ESUNBVElPTl9TSEFQSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2luZGljYXRpb25fc2hhcGluZ19ib3VuZHNfY2hlY2soJnRoaXMtPmluZGljYXRpb25fc2hhcGluZykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0lORElDQVRJT05fU0hBUElORzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9HUE9OX1hHUE9OX1RPRF9FTkFCTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5ncG9uX3hncG9uX3RvZF9lbmFibGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRU5BQkxFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9HUE9OX1hHUE9OX1RPRF9FTkFCTEU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX0dQSU9fUElOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+Z3Bvbl94Z3Bvbl90b2RfZ3Bpb19waW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU40OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU43OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjExOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjE0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xNjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjE3OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTg6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xOToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjIwOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4yMjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjIzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4yNToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjI2OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4yODoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjI5OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4zMToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjMyOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4zNDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjM1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4zNzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjM4OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU40MDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjQxOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU40MzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjQ0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU40NjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjQ3OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDg6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU40OToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjUwOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU41MjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjUzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU41NToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjU2OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU41ODoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjU5OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU42MToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjYyOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU42NDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjY1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU42NzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjY4OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU43MDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjcxOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU43MzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjc0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU43NjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjc3OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzg6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU43OToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjgwOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU44MjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjgzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU44NToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjg2OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU44ODoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjg5OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU45MToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjkyOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU45NDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjk1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU45NzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjk4OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9VTkNPTkZJR1VSRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX0dQSU9fUElOOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9FUE9OXzgwMjFfQVNfVE9EX0ZPUk1BVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdHJfMjU2X2JvdW5kc19jaGVjaygmdGhpcy0+ZXBvbl84MDIxX2FzX3RvZF9mb3JtYXQpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9FUE9OXzgwMjFfQVNfVE9EX0ZPUk1BVDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9FUE9OX1NIQVBFUl9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+ZXBvbl9zaGFwZXJfbW9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU0hBUEVSX01PREVfTEFZRVJfMToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NIQVBFUl9NT0RFX0xBWUVSXzI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VQT05fU0hBUEVSX01PREU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VNQkVEREVEX0lNQUdFX0xJU1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnlfbGlzdF91OF9ib3VuZHNfY2hlY2soJnRoaXMtPmVtYmVkZGVkX2ltYWdlX2xpc3QpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9FTUJFRERFRF9JTUFHRV9MSVNUOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VQT05fVE9EX1NUUklORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdHJfMjU2X2JvdW5kc19jaGVjaygmdGhpcy0+ZXBvbl90b2Rfc3RyaW5nKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0RFVklDRV9DRkdfSURfRVBPTl9UT0RfU1RSSU5HOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1hHUE9OX05VTV9PRl9PTlVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+eGdwb25fbnVtX29mX29udXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05VTV9PRl9PTlVTX1hHUE9OX1NVUFBPUlRfMjU2X09OVVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OVU1fT0ZfT05VU19YR1BPTl9TVVBQT1JUXzUxMF9PTlVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9YR1BPTl9OVU1fT0ZfT05VUzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfVE9EX1VBUlRfQkFVRFJBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT50b2RfdWFydF9iYXVkcmF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfVUFSVF9CQVVEUkFURV9VQVJUX1JBVEVfNDgwMDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1VBUlRfQkFVRFJBVEVfVUFSVF9SQVRFXzk2MDA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9VQVJUX0JBVURSQVRFX1VBUlRfUkFURV8xNDQwMDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1VBUlRfQkFVRFJBVEVfVUFSVF9SQVRFXzE5MjAwOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfVUFSVF9CQVVEUkFURV9VQVJUX1JBVEVfMzg0MDA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9VQVJUX0JBVURSQVRFX1VBUlRfUkFURV81NzYwMDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1VBUlRfQkFVRFJBVEVfVUFSVF9SQVRFXzExNTIwMDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1VBUlRfQkFVRFJBVEVfVUFSVF9SQVRFXzIzMDQwMDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1VBUlRfQkFVRFJBVEVfVUFSVF9SQVRFXzM4MDQwMDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1VBUlRfQkFVRFJBVEVfVUFSVF9SQVRFXzQ2MDgwMDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1VBUlRfQkFVRFJBVEVfVUFSVF9SQVRFXzkyMTYwMDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0RFVklDRV9DRkdfSURfVE9EX1VBUlRfQkFVRFJBVEU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX1NUUklOR19MRU5HVEgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmdwb25feGdwb25fdG9kX3N0cmluZ19sZW5ndGggPiA2NCkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0RFVklDRV9DRkdfSURfR1BPTl9YR1BPTl9UT0RfU1RSSU5HX0xFTkdUSDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ09OTkVDVElPTl9DT01QTEVURV9JRF9TVEFOREFMT05FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YW5kYWxvbmUgPSBCQ01PU19GQUxTRTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ09OTkVDVElPTl9DT01QTEVURV9JRF9TVEFOREFMT05FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhbmRhbG9uZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DT05ORUNUSU9OX0NPTVBMRVRFX0lEX1NUQU5EQUxPTkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9kYXRhX3VucGFjayhiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DT05ORUNUSU9OX0NPTVBMRVRFX0lEX1NUQU5EQUxPTkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zdGFuZGFsb25lKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DT05ORUNUSU9OX0NPTVBMRVRFX0lEX1NUQU5EQUxPTkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ09OTkVDVElPTl9GQUlMVVJFX0lEX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yZWFzb24gPSBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX1RJTUVPVVQ7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DT05ORUNUSU9OX0ZBSUxVUkVfSURfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2hvc3RfY29ubmVjdGlvbl9mYWlsX3JlYXNvbl9wYWNrKHRoaXMtPnJlYXNvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DT05ORUNUSU9OX0ZBSUxVUkVfSURfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9kYXRhX3VucGFjayhiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NPTk5FQ1RJT05fRkFJTFVSRV9JRF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfaG9zdF9jb25uZWN0aW9uX2ZhaWxfcmVhc29uX3VucGFjaygmdGhpcy0+cmVhc29uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ09OTkVDVElPTl9GQUlMVVJFX0lEX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DT05ORUNUSU9OX0ZBSUxVUkVfSURfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+cmVhc29uKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fVElNRU9VVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0hPU1RfQ09OTkVDVElPTl9GQUlMX1JFQVNPTl9LRUVQQUxJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fVVNFUl9DQUxMQkFDS19FUlJPUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0hPU1RfQ09OTkVDVElPTl9GQUlMX1JFQVNPTl9TT0ZUV0FSRV9WRVJTSU9OX01JU01BVENIOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX1NZU1RFTV9NT0RFX01JU01BVENIOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX05OSV9TUEVFRF9NSVNNQVRDSDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0hPU1RfQ09OTkVDVElPTl9GQUlMX1JFQVNPTl9SRUNPTk5FQ1RfVElNRU9VVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0hPU1RfQ09OTkVDVElPTl9GQUlMX1JFQVNPTl9JTlRFUk5BTF9FUlJPUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0hPU1RfQ09OTkVDVElPTl9GQUlMX1JFQVNPTl9TWVNURU1fTU9ERV9OT1RfU1VQUE9SVEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX1BBUkFNRVRFUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0RFVklDRV9DT05ORUNUSU9OX0ZBSUxVUkVfSURfUkVBU09OOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9ERFJfVEVTVF9DT01QTEVURV9JRF9ERFJfVEVTVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5kZHJfdGVzdC5zdGF0dXMgPSBCQ01PTFRfRERSX1RFU1RfU1RBVFVTX0NPTVBMRVRFRDsKKyAgICAgICAgdGhpcy0+ZGRyX3Rlc3QudS5jb21wbGV0ZWQuY3B1X3Jlc3VsdCA9IEJDTU9MVF9ERFJfVEVTVF9SRVNVTFRfU1VDQ0VTUzsKKyAgICAgICAgdGhpcy0+ZGRyX3Rlc3QudS5jb21wbGV0ZWQucmFzXzBfcmVzdWx0ID0gQkNNT0xUX0REUl9URVNUX1JFU1VMVF9TVUNDRVNTOworICAgICAgICB0aGlzLT5kZHJfdGVzdC51LmNvbXBsZXRlZC5yYXNfMV9yZXN1bHQgPSBCQ01PTFRfRERSX1RFU1RfUkVTVUxUX1NVQ0NFU1M7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfRERSX1RFU1RfQ09NUExFVEVfSURfRERSX1RFU1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkX3BhY2soJnRoaXMtPmRkcl90ZXN0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9ERFJfVEVTVF9DT01QTEVURV9JRF9ERFJfVEVTVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSBiY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5kZHJfdGVzdCk7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2RhdGFfdW5wYWNrKGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9ERFJfVEVTVF9DT01QTEVURV9JRF9ERFJfVEVTVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWRfdW5wYWNrKCZ0aGlzLT5kZHJfdGVzdCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9ERFJfVEVTVF9DT01QTEVURV9JRF9ERFJfVEVTVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWRfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0REUl9URVNUX0NPTVBMRVRFX0lEX0REUl9URVNUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZF9ib3VuZHNfY2hlY2soJnRoaXMtPmRkcl90ZXN0KSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0RFVklDRV9ERFJfVEVTVF9DT01QTEVURV9JRF9ERFJfVEVTVDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9ERVZJQ0VfS0VFUF9BTElWRV9JRF9TRVFVRU5DRV9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c2VxdWVuY2VfbnVtYmVyID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9ERVZJQ0VfS0VFUF9BTElWRV9JRF9USU1FX1NUQU1QKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnRpbWVfc3RhbXAgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0RFVklDRV9LRUVQX0FMSVZFX0lEX1NFUVVFTkNFX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+c2VxdWVuY2VfbnVtYmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfREVWSUNFX0tFRVBfQUxJVkVfSURfVElNRV9TVEFNUCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dGltZV9zdGFtcCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0RFVklDRV9LRUVQX0FMSVZFX0lEX1NFUVVFTkNFX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0RFVklDRV9LRUVQX0FMSVZFX0lEX1RJTUVfU1RBTVApKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfZGF0YV91bnBhY2soYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0RFVklDRV9LRUVQX0FMSVZFX0lEX1NFUVVFTkNFX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+c2VxdWVuY2VfbnVtYmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfREVWSUNFX0tFRVBfQUxJVkVfSURfVElNRV9TVEFNUCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dGltZV9zdGFtcCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0RFVklDRV9LRUVQX0FMSVZFX0lEX1NFUVVFTkNFX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9ERVZJQ0VfS0VFUF9BTElWRV9JRF9USU1FX1NUQU1QKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0RFVklDRV9SRUFEWV9JRF9GSVJNV0FSRV9TV19WRVJTSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZpcm13YXJlX3N3X3ZlcnNpb24ubWFqb3IgPSAwOworICAgICAgICB0aGlzLT5maXJtd2FyZV9zd192ZXJzaW9uLm1pbm9yID0gMDsKKyAgICAgICAgdGhpcy0+ZmlybXdhcmVfc3dfdmVyc2lvbi5yZXZpc2lvbiA9IDA7CisgICAgICAgIHRoaXMtPmZpcm13YXJlX3N3X3ZlcnNpb24ubW9kZWwgPSAwOworICAgICAgICBtZW1zZXQodGhpcy0+ZmlybXdhcmVfc3dfdmVyc2lvbi5idWlsZF90aW1lLCAwLCAzMik7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX1NZU1RFTV9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN5c3RlbV9tb2RlID0gQkNNT0xUX1NZU1RFTV9NT0RFX0dQT05fXzE2X1g7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX05OSV9TUEVFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5ubmlfc3BlZWQuZmlyc3RfaGFsZiA9IEJDTU9MVF9OTklfU1BFRURfR0JQU18xOworICAgICAgICB0aGlzLT5ubmlfc3BlZWQuc2Vjb25kX2hhbGYgPSBCQ01PTFRfTk5JX1NQRUVEX0dCUFNfMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfQ0hJUF9SRVZJU0lPTikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jaGlwX3JldmlzaW9uID0gKGJjbW9sdF9kZXZpY2VfY2hpcF9yZXZpc2lvbikgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfVE9EX0VOQUJMRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50b2RfZW5hYmxlID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfVE9EX0dQSU9fUElOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnRvZF9ncGlvX3BpbiA9IEJDTU9MVF9HUElPX1BJTl9QSU4wOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX0ZJUk1XQVJFX1NXX1ZFUlNJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbl9wYWNrKCZ0aGlzLT5maXJtd2FyZV9zd192ZXJzaW9uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfU1lTVEVNX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3lzdGVtX21vZGVfcGFjayh0aGlzLT5zeXN0ZW1fbW9kZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX05OSV9TUEVFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9kZXZpY2Vfbm5pX3NwZWVkX3BhY2soJnRoaXMtPm5uaV9zcGVlZCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX0NISVBfUkVWSVNJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZGV2aWNlX2NoaXBfcmV2aXNpb25fcGFjayh0aGlzLT5jaGlwX3JldmlzaW9uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfVE9EX0VOQUJMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9jb250cm9sX3N0YXRlX3BhY2sodGhpcy0+dG9kX2VuYWJsZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX1RPRF9HUElPX1BJTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncGlvX3Bpbl9wYWNrKHRoaXMtPnRvZF9ncGlvX3BpbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfRklSTVdBUkVfU1dfVkVSU0lPTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAzOTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfU1lTVEVNX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfTk5JX1NQRUVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX0NISVBfUkVWSVNJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfVE9EX0VOQUJMRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0RFVklDRV9SRUFEWV9JRF9UT0RfR1BJT19QSU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGFfdW5wYWNrKGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX0ZJUk1XQVJFX1NXX1ZFUlNJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbl91bnBhY2soJnRoaXMtPmZpcm13YXJlX3N3X3ZlcnNpb24sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX1NZU1RFTV9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N5c3RlbV9tb2RlX3VucGFjaygmdGhpcy0+c3lzdGVtX21vZGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0RFVklDRV9SRUFEWV9JRF9OTklfU1BFRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZGV2aWNlX25uaV9zcGVlZF91bnBhY2soJnRoaXMtPm5uaV9zcGVlZCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfQ0hJUF9SRVZJU0lPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9kZXZpY2VfY2hpcF9yZXZpc2lvbl91bnBhY2soJnRoaXMtPmNoaXBfcmV2aXNpb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0RFVklDRV9SRUFEWV9JRF9UT0RfRU5BQkxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfdW5wYWNrKCZ0aGlzLT50b2RfZW5hYmxlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfVE9EX0dQSU9fUElOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwaW9fcGluX3VucGFjaygmdGhpcy0+dG9kX2dwaW9fcGluLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX0ZJUk1XQVJFX1NXX1ZFUlNJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAzOSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0RFVklDRV9SRUFEWV9JRF9TWVNURU1fTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfTk5JX1NQRUVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0RFVklDRV9SRUFEWV9JRF9DSElQX1JFVklTSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0RFVklDRV9SRUFEWV9JRF9UT0RfRU5BQkxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0RFVklDRV9SRUFEWV9JRF9UT0RfR1BJT19QSU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX0ZJUk1XQVJFX1NXX1ZFUlNJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbl9ib3VuZHNfY2hlY2soJnRoaXMtPmZpcm13YXJlX3N3X3ZlcnNpb24pKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfREVWSUNFX0RFVklDRV9SRUFEWV9JRF9GSVJNV0FSRV9TV19WRVJTSU9OOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX1NZU1RFTV9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3lzdGVtX21vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0dQT05fXzE2X1g6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9HUE9OX184X1g6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9HUE9OX180X1g6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX18xNl9YOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfWEdQT05fMV9fOF9YOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fOF9YX0NPRVhJU1RFTkNFX1RETUE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9BRV84X1g6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX184X1hfMTBfRzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0dQT05fOF9YR1BPTl80X1hfQ09FWElTVEVOQ0U6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX184X1g6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX180X1g6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX180X1hfQ09FWElTVEVOQ0VfVERNQToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzRfWF8xMF9HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfWEdTX18yX1hfMTBfRzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX05HUE9OMl9fMl9YXzEwX0c6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9OR1BPTjJfXzhfWF8yX1BfNV9HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfWEdQT05fMV9fNF9YOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fMl9YXzEwX0c6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX1NZU1RFTV9NT0RFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0RFVklDRV9SRUFEWV9JRF9OTklfU1BFRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZGV2aWNlX25uaV9zcGVlZF9ib3VuZHNfY2hlY2soJnRoaXMtPm5uaV9zcGVlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX05OSV9TUEVFRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0RFVklDRV9SRUFEWV9JRF9DSElQX1JFVklTSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+Y2hpcF9yZXZpc2lvbikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0NISVBfUkVWSVNJT05fQTA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfQ0hJUF9SRVZJU0lPTl9CMDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfQ0hJUF9SRVZJU0lPTjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfVE9EX0VOQUJMRSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnRvZF9lbmFibGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRU5BQkxFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfREVWSUNFX0RFVklDRV9SRUFEWV9JRF9UT0RfRU5BQkxFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0RFVklDRV9SRUFEWV9JRF9UT0RfR1BJT19QSU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT50b2RfZ3Bpb19waW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU40OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU43OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjExOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjE0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xNjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjE3OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTg6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xOToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjIwOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4yMjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjIzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4yNToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjI2OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4yODoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjI5OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4zMToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjMyOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4zNDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjM1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4zNzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjM4OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU40MDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjQxOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU40MzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjQ0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU40NjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjQ3OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDg6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU40OToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjUwOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU41MjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjUzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU41NToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjU2OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU41ODoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjU5OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU42MToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjYyOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU42NDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjY1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU42NzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjY4OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU43MDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjcxOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU43MzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjc0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU43NjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjc3OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzg6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU43OToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjgwOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU44MjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjgzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU44NToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjg2OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU44ODoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjg5OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU45MToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjkyOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU45NDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjk1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU45NzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjk4OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9VTkNPTkZJR1VSRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX1RPRF9HUElPX1BJTjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfQ09NUExFVEVfSURfSU1BR0VfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5pbWFnZV90eXBlID0gQkNNT0xUX0RFVklDRV9JTUFHRV9UWVBFX0JPT1RMT0FERVI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfQ09NUExFVEVfSURfQkxPQ0tfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmJsb2NrX251bWJlciA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfQ09NUExFVEVfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXR1cyA9IEJDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfU1VDQ0VTUzsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9DT01QTEVURV9JRF9JTUFHRV9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2RldmljZV9pbWFnZV90eXBlX3BhY2sodGhpcy0+aW1hZ2VfdHlwZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfQ09NUExFVEVfSURfQkxPQ0tfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5ibG9ja19udW1iZXIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9DT01QTEVURV9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfaW1hZ2VfdHJhbnNmZXJfc3RhdHVzX3BhY2sodGhpcy0+c3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9DT01QTEVURV9JRF9JTUFHRV9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfQ09NUExFVEVfSURfQkxPQ0tfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfQ09NUExFVEVfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2RhdGFfdW5wYWNrKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9DT01QTEVURV9JRF9JTUFHRV9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2RldmljZV9pbWFnZV90eXBlX3VucGFjaygmdGhpcy0+aW1hZ2VfdHlwZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfQ09NUExFVEVfSURfQkxPQ0tfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5ibG9ja19udW1iZXIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9DT01QTEVURV9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfaW1hZ2VfdHJhbnNmZXJfc3RhdHVzX3VucGFjaygmdGhpcy0+c3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9DT01QTEVURV9JRF9JTUFHRV9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX0NPTVBMRVRFX0lEX0JMT0NLX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9DT01QTEVURV9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfQ09NUExFVEVfSURfSU1BR0VfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmltYWdlX3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9JTUFHRV9UWVBFX0JPT1RMT0FERVI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFlQRV9BUFBMSUNBVElPTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9JTUFHRV9UWVBFX0lUVV9QT05fT05VX0ZJUk1XQVJFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0lNQUdFX1RZUEVfRVBPTl9PTlVfRklSTVdBUkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfQ09NUExFVEVfSURfSU1BR0VfVFlQRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9DT01QTEVURV9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19TVUNDRVNTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX01FTU9SWV9BTExPQ0FUSU9OX0ZBSUxVUkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfVU5TVVBQT1JURURfRklMRV9UWVBFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX0NSQ19FUlJPUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19CTE9DS19PVVRfT0ZfU1lOQzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19JTlRFUk5BTF9FUlJPUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19JTlZBTElEX1NUQVRFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX1BSRU1BVFVSRV9URVJNSU5BVElPTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19BQ0tfVElNRU9VVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9DT01QTEVURV9JRF9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9JTkRJQ0FUSU9OU19EUk9QUEVEX0lEX1RPVEFMX0NPVU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnRvdGFsX2NvdW50ID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU5ESUNBVElPTlNfRFJPUFBFRF9JRF9UT1RBTF9DT1VOVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dG90YWxfY291bnQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU5ESUNBVElPTlNfRFJPUFBFRF9JRF9UT1RBTF9DT1VOVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2RhdGFfdW5wYWNrKGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0lORElDQVRJT05TX0RST1BQRURfSURfVE9UQUxfQ09VTlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnRvdGFsX2NvdW50KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9JTkRJQ0FUSU9OU19EUk9QUEVEX0lEX1RPVEFMX0NPVU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2RldmljZV9zd19lcnJvcl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9TV19FUlJPUl9JRF9UQVNLX05BTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgbWVtc2V0KHRoaXMtPnRhc2tfbmFtZS5zdHIsIDAsIDEwMCk7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfU1dfRVJST1JfSURfRklMRV9OQU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIG1lbXNldCh0aGlzLT5maWxlX25hbWUuc3RyLCAwLCAxMDApOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX1NXX0VSUk9SX0lEX0xJTkVfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmxpbmVfbnVtYmVyID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9TV19FUlJPUl9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cG9uX25pID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9TV19FUlJPUl9JRF9UQVNLX05BTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RyXzEwMF9wYWNrKCZ0aGlzLT50YXNrX25hbWUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX1NXX0VSUk9SX0lEX0ZJTEVfTkFNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdHJfMTAwX3BhY2soJnRoaXMtPmZpbGVfbmFtZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfU1dfRVJST1JfSURfTElORV9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmxpbmVfbnVtYmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfU1dfRVJST1JfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2RldmljZV9zd19lcnJvcl9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX1NXX0VSUk9SX0lEX1RBU0tfTkFNRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxMDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfU1dfRVJST1JfSURfRklMRV9OQU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDEwMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9TV19FUlJPUl9JRF9MSU5FX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX1NXX0VSUk9SX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9zd19lcnJvcl9kYXRhX3VucGFjayhiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfU1dfRVJST1JfSURfVEFTS19OQU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0cl8xMDBfdW5wYWNrKCZ0aGlzLT50YXNrX25hbWUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfU1dfRVJST1JfSURfRklMRV9OQU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0cl8xMDBfdW5wYWNrKCZ0aGlzLT5maWxlX25hbWUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfU1dfRVJST1JfSURfTElORV9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmxpbmVfbnVtYmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfU1dfRVJST1JfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX1NXX0VSUk9SX0lEX1RBU0tfTkFNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEwMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX1NXX0VSUk9SX0lEX0ZJTEVfTkFNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEwMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX1NXX0VSUk9SX0lEX0xJTkVfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX1NXX0VSUk9SX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9zd19lcnJvcl9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9TV19FUlJPUl9JRF9UQVNLX05BTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RyXzEwMF9ib3VuZHNfY2hlY2soJnRoaXMtPnRhc2tfbmFtZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9ERVZJQ0VfU1dfRVJST1JfSURfVEFTS19OQU1FOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfU1dfRVJST1JfSURfRklMRV9OQU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0cl8xMDBfYm91bmRzX2NoZWNrKCZ0aGlzLT5maWxlX25hbWUpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfREVWSUNFX1NXX0VSUk9SX0lEX0ZJTEVfTkFNRTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX1NXX0VYQ0VQVElPTl9JRF9DUFVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Y3B1X2lkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9TV19FWENFUFRJT05fSURfVEVYVCkpICE9IDApCisgICAgeworICAgICAgICBtZW1zZXQodGhpcy0+dGV4dC5zdHIsIDAsIDIwMDApOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25fZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfU1dfRVhDRVBUSU9OX0lEX0NQVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5jcHVfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9TV19FWENFUFRJT05fSURfVEVYVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdHJfMjAwMF9wYWNrKCZ0aGlzLT50ZXh0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX1NXX0VYQ0VQVElPTl9JRF9DUFVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9TV19FWENFUFRJT05fSURfVEVYVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyMDAwOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25fZGF0YV91bnBhY2soYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9TV19FWENFUFRJT05fSURfQ1BVX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmNwdV9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX1NXX0VYQ0VQVElPTl9JRF9URVhUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0cl8yMDAwX3VucGFjaygmdGhpcy0+dGV4dCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25fZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfU1dfRVhDRVBUSU9OX0lEX0NQVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9TV19FWENFUFRJT05fSURfVEVYVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIwMDApKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25fZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9TV19FWENFUFRJT05fSURfVEVYVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdHJfMjAwMF9ib3VuZHNfY2hlY2soJnRoaXMtPnRleHQpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfREVWSUNFX1NXX0VYQ0VQVElPTl9JRF9URVhUOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0NPTk5FQ1RJT05fQ09NUExFVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Y29ubmVjdGlvbl9jb21wbGV0ZSA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0NPTk5FQ1RJT05fRVNUQUJMSVNIRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Y29ubmVjdGlvbl9lc3RhYmxpc2hlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0NPTk5FQ1RJT05fRkFJTFVSRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jb25uZWN0aW9uX2ZhaWx1cmUgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9ERFJfVEVTVF9DT01QTEVURSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5kZHJfdGVzdF9jb21wbGV0ZSA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0RFVklDRV9LRUVQX0FMSVZFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRldmljZV9rZWVwX2FsaXZlID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfREVWSUNFX1JFQURZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRldmljZV9yZWFkeSA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0RJU0NPTk5FQ1RJT05fQ09NUExFVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZGlzY29ubmVjdGlvbl9jb21wbGV0ZSA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0lNQUdFX1RSQU5TRkVSX0NPTVBMRVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmltYWdlX3RyYW5zZmVyX2NvbXBsZXRlID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfSU5ESUNBVElPTlNfRFJPUFBFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5pbmRpY2F0aW9uc19kcm9wcGVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfU1dfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3dfZXJyb3IgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9TV19FWENFUFRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3dfZXhjZXB0aW9uID0gQkNNT1NfRkFMU0U7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfQ09OTkVDVElPTl9DT01QTEVURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmNvbm5lY3Rpb25fY29tcGxldGUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9DT05ORUNUSU9OX0VTVEFCTElTSEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+Y29ubmVjdGlvbl9lc3RhYmxpc2hlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0NPTk5FQ1RJT05fRkFJTFVSRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmNvbm5lY3Rpb25fZmFpbHVyZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0REUl9URVNUX0NPTVBMRVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+ZGRyX3Rlc3RfY29tcGxldGUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9ERVZJQ0VfS0VFUF9BTElWRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmRldmljZV9rZWVwX2FsaXZlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfREVWSUNFX1JFQURZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+ZGV2aWNlX3JlYWR5KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfRElTQ09OTkVDVElPTl9DT01QTEVURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmRpc2Nvbm5lY3Rpb25fY29tcGxldGUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9JTUFHRV9UUkFOU0ZFUl9DT01QTEVURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmltYWdlX3RyYW5zZmVyX2NvbXBsZXRlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfSU5ESUNBVElPTlNfRFJPUFBFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmluZGljYXRpb25zX2Ryb3BwZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9TV19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnN3X2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfU1dfRVhDRVBUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3dfZXhjZXB0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2RldmljZV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfQ09OTkVDVElPTl9DT01QTEVURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0NPTk5FQ1RJT05fRVNUQUJMSVNIRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9DT05ORUNUSU9OX0ZBSUxVUkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9ERFJfVEVTVF9DT01QTEVURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0RFVklDRV9LRUVQX0FMSVZFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfREVWSUNFX1JFQURZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfRElTQ09OTkVDVElPTl9DT01QTEVURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0lNQUdFX1RSQU5TRkVSX0NPTVBMRVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfSU5ESUNBVElPTlNfRFJPUFBFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX1NXX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfU1dfRVhDRVBUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9DT05ORUNUSU9OX0NPTVBMRVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+Y29ubmVjdGlvbl9jb21wbGV0ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0NPTk5FQ1RJT05fRVNUQUJMSVNIRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5jb25uZWN0aW9uX2VzdGFibGlzaGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfQ09OTkVDVElPTl9GQUlMVVJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+Y29ubmVjdGlvbl9mYWlsdXJlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfRERSX1RFU1RfQ09NUExFVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5kZHJfdGVzdF9jb21wbGV0ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0RFVklDRV9LRUVQX0FMSVZFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+ZGV2aWNlX2tlZXBfYWxpdmUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9ERVZJQ0VfUkVBRFkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5kZXZpY2VfcmVhZHkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9ESVNDT05ORUNUSU9OX0NPTVBMRVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+ZGlzY29ubmVjdGlvbl9jb21wbGV0ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0lNQUdFX1RSQU5TRkVSX0NPTVBMRVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+aW1hZ2VfdHJhbnNmZXJfY29tcGxldGUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9JTkRJQ0FUSU9OU19EUk9QUEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+aW5kaWNhdGlvbnNfZHJvcHBlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX1NXX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c3dfZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9TV19FWENFUFRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zd19leGNlcHRpb24pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9hdXRvX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9DT05ORUNUSU9OX0NPTVBMRVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0NPTk5FQ1RJT05fRVNUQUJMSVNIRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfQ09OTkVDVElPTl9GQUlMVVJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0REUl9URVNUX0NPTVBMRVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0RFVklDRV9LRUVQX0FMSVZFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0RFVklDRV9SRUFEWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9ESVNDT05ORUNUSU9OX0NPTVBMRVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0lNQUdFX1RSQU5TRkVSX0NPTVBMRVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0lORElDQVRJT05TX0RST1BQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfU1dfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfU1dfRVhDRVBUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0hPU1RfS0VFUF9BTElWRV9JRF9TRVFVRU5DRV9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c2VxdWVuY2VfbnVtYmVyID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9IT1NUX0tFRVBfQUxJVkVfSURfVElNRV9TVEFNUCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50aW1lX3N0YW1wID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0hPU1RfS0VFUF9BTElWRV9JRF9TRVFVRU5DRV9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnNlcXVlbmNlX251bWJlcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0hPU1RfS0VFUF9BTElWRV9JRF9USU1FX1NUQU1QKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT50aW1lX3N0YW1wKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9IT1NUX0tFRVBfQUxJVkVfSURfU0VRVUVOQ0VfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSE9TVF9LRUVQX0FMSVZFX0lEX1RJTUVfU1RBTVApKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2RhdGFfdW5wYWNrKGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSE9TVF9LRUVQX0FMSVZFX0lEX1NFUVVFTkNFX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+c2VxdWVuY2VfbnVtYmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSE9TVF9LRUVQX0FMSVZFX0lEX1RJTUVfU1RBTVApKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnRpbWVfc3RhbXApKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSE9TVF9LRUVQX0FMSVZFX0lEX1NFUVVFTkNFX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9IT1NUX0tFRVBfQUxJVkVfSURfVElNRV9TVEFNUCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX0RBVEFfSURfQkxPQ0tfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmJsb2NrX251bWJlciA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfREFUQV9JRF9NT1JFX0RBVEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bW9yZV9kYXRhID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfREFUQV9JRF9EQVRBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRhdGEubGVuID0gMDsKKyAgICAgICAgdGhpcy0+ZGF0YS52YWwgPSBOVUxMOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9EQVRBX0lEX0JMT0NLX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+YmxvY2tfbnVtYmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfREFUQV9JRF9NT1JFX0RBVEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5tb3JlX2RhdGEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9EQVRBX0lEX0RBVEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MTZfaGV4X3BhY2soJnRoaXMtPmRhdGEsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9EQVRBX0lEX0JMT0NLX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX0RBVEFfSURfTU9SRV9EQVRBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfREFUQV9JRF9EQVRBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF91OF9saXN0X3UxNl9oZXhfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmRhdGEpOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2RhdGFfdW5wYWNrKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX0RBVEFfSURfQkxPQ0tfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5ibG9ja19udW1iZXIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9EQVRBX0lEX01PUkVfREFUQSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPm1vcmVfZGF0YSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX0RBVEFfSURfREFUQSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF91OF9saXN0X3UxNl9oZXhfdW5wYWNrKCZ0aGlzLT5kYXRhLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfREFUQV9JRF9CTE9DS19OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfREFUQV9JRF9NT1JFX0RBVEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfREFUQV9JRF9EQVRBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTE2X2hleF9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfREFUQV9JRF9EQVRBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTE2X2hleF9ib3VuZHNfY2hlY2soJnRoaXMtPmRhdGEpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX0RBVEFfSURfREFUQTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9TVEFSVF9JRF9JTUFHRV9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmltYWdlX3R5cGUgPSBCQ01PTFRfREVWSUNFX0lNQUdFX1RZUEVfQk9PVExPQURFUjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9TVEFSVF9JRF9JTUFHRV9TSVpFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmltYWdlX3NpemUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX1NUQVJUX0lEX0NSQzMyKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNyYzMyID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9TVEFSVF9JRF9JTUFHRV9OQU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIG1lbXNldCh0aGlzLT5pbWFnZV9uYW1lLnN0ciwgMCwgNjQpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX1NUQVJUX0lEX0lNQUdFX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGVfcGFjayh0aGlzLT5pbWFnZV90eXBlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9TVEFSVF9JRF9JTUFHRV9TSVpFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5pbWFnZV9zaXplKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfU1RBUlRfSURfQ1JDMzIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmNyYzMyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfU1RBUlRfSURfSU1BR0VfTkFNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdHJfNjRfcGFjaygmdGhpcy0+aW1hZ2VfbmFtZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfU1RBUlRfSURfSU1BR0VfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX1NUQVJUX0lEX0lNQUdFX1NJWkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9TVEFSVF9JRF9DUkMzMikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX1NUQVJUX0lEX0lNQUdFX05BTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNjQ7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2RhdGFfdW5wYWNrKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9TVEFSVF9JRF9JTUFHRV9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2RldmljZV9pbWFnZV90eXBlX3VucGFjaygmdGhpcy0+aW1hZ2VfdHlwZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfU1RBUlRfSURfSU1BR0VfU0laRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+aW1hZ2Vfc2l6ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX1NUQVJUX0lEX0NSQzMyKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5jcmMzMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX1NUQVJUX0lEX0lNQUdFX05BTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RyXzY0X3VucGFjaygmdGhpcy0+aW1hZ2VfbmFtZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9TVEFSVF9JRF9JTUFHRV9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX1NUQVJUX0lEX0lNQUdFX1NJWkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfU1RBUlRfSURfQ1JDMzIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfU1RBUlRfSURfSU1BR0VfTkFNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDY0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfU1RBUlRfSURfSU1BR0VfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmltYWdlX3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9JTUFHRV9UWVBFX0JPT1RMT0FERVI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFlQRV9BUFBMSUNBVElPTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9JTUFHRV9UWVBFX0lUVV9QT05fT05VX0ZJUk1XQVJFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0lNQUdFX1RZUEVfRVBPTl9PTlVfRklSTVdBUkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfU1RBUlRfSURfSU1BR0VfVFlQRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9TVEFSVF9JRF9JTUFHRV9OQU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0cl82NF9ib3VuZHNfY2hlY2soJnRoaXMtPmltYWdlX25hbWUpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX1NUQVJUX0lEX0lNQUdFX05BTUU7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2RldmljZV9yZXNldF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9kZXZpY2VfcmVzZXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfUkVTRVRfSURfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5tb2RlID0gKGJjbW9sdF9kZXZpY2VfcmVzZXRfbW9kZSkgMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfcmVzZXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9kZXZpY2VfcmVzZXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9SRVNFVF9JRF9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2RldmljZV9yZXNldF9tb2RlX3BhY2sodGhpcy0+bW9kZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZGV2aWNlX3Jlc2V0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2RldmljZV9yZXNldF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfUkVTRVRfSURfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9yZXNldF9kYXRhX3VucGFjayhiY21vbHRfZGV2aWNlX3Jlc2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfUkVTRVRfSURfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9kZXZpY2VfcmVzZXRfbW9kZV91bnBhY2soJnRoaXMtPm1vZGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX3Jlc2V0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX1JFU0VUX0lEX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfcmVzZXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2RldmljZV9yZXNldF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2RldmljZV9yZXNldF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfUkVTRVRfSURfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPm1vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9SRVNFVF9NT0RFX0RFVklDRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9SRVNFVF9NT0RFX0hPU1Q6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfUkVTRVRfTU9ERV9BTEw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9ERVZJQ0VfUkVTRVRfSURfTU9ERTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9SVU5fRERSX1RFU1RfSURfQ1BVKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNwdSA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX1JVTl9ERFJfVEVTVF9JRF9SQVNfMCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yYXNfMCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX1JVTl9ERFJfVEVTVF9JRF9SQVNfMSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yYXNfMSA9IEJDTU9TX0ZBTFNFOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfUlVOX0REUl9URVNUX0lEX0NQVSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmNwdSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX1JVTl9ERFJfVEVTVF9JRF9SQVNfMCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnJhc18wKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfUlVOX0REUl9URVNUX0lEX1JBU18xKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+cmFzXzEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX1JVTl9ERFJfVEVTVF9JRF9DUFUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9SVU5fRERSX1RFU1RfSURfUkFTXzApKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9SVU5fRERSX1RFU1RfSURfUkFTXzEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2RhdGFfdW5wYWNrKGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfUlVOX0REUl9URVNUX0lEX0NQVSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmNwdSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfREVWSUNFX1JVTl9ERFJfVEVTVF9JRF9SQVNfMCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnJhc18wKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfUlVOX0REUl9URVNUX0lEX1JBU18xKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+cmFzXzEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfUlVOX0REUl9URVNUX0lEX0NQVSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9SVU5fRERSX1RFU1RfSURfUkFTXzApKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfUlVOX0REUl9URVNUX0lEX1JBU18xKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfS0VZX0lEX0VQT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfS0VZX0lEX01BQ19BRERSRVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGJjbW9zX21hY19hZGRyZXNzX2luaXQoJnRoaXMtPm1hY19hZGRyZXNzKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfS0VZX0lEX0VQT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+ZXBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19LRVlfSURfTUFDX0FERFJFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+bWFjX2FkZHJlc3MpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfS0VZX0lEX0VQT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfS0VZX0lEX01BQ19BRERSRVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDY7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXlfdW5wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfS0VZX0lEX0VQT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5lcG9uX25pKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0tFWV9JRF9NQUNfQUREUkVTUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9tYWNfYWRkcmVzcyhidWYsICZ0aGlzLT5tYWNfYWRkcmVzcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19LRVlfSURfRVBPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfS0VZX0lEX01BQ19BRERSRVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQ0ZHX0lEX0FMQVJNX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXRlLnVua25vd25fbGlua192aW9sYXRpb24ubGlua19yYXRlID0gQkNNT0xUX0VQT05fTElOS19SQVRFX1RFTl9URU47CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXRlLnVua25vd25fbGlua192aW9sYXRpb24uYWxhcm1fc3RhdHVzID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXRlLm92ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXRlLm1heF9saW5rX3Zpb2xhdGlvbiA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgICAgICB0aGlzLT5hbGFybV9zdGF0ZS5sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXRlLmxhc2VyX29uX29mZl92aW9sYXRpb24ubGFzZXJfb25fdGltZSA9IChiY21vbHRfdGltZV9xdWFudGEpIDA7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXRlLmxhc2VyX29uX29mZl92aW9sYXRpb24ubGFzZXJfb2ZmX3RpbWUgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSAwOworICAgICAgICB0aGlzLT5hbGFybV9zdGF0ZS5sYXNlcl9vbl9vZmZfdmlvbGF0aW9uLmFsYXJtX3N0YXR1cyA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgICAgICB0aGlzLT5hbGFybV9zdGF0ZS5zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXRlLnJhbmdlX3Zpb2xhdGlvbi5yYW5nZSA9IChiY21vbHRfdGltZV9xdWFudGEpIDA7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXRlLnJhbmdlX3Zpb2xhdGlvbi5hbGFybV9zdGF0dXMgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdGUudGRtX2NoYW5uZWxzX2V4aGF1c3RlZCA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgICAgICB0aGlzLT5hbGFybV9zdGF0ZS5yb2d1ZV92aW9sYXRpb24uZGVuaWVkX2xsaWQgPSAoYmNtb2x0X2Vwb25fbGxpZCkgMDsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdGUucm9ndWVfdmlvbGF0aW9uLmRlbmllZF9yYW5nZSA9IChiY21vbHRfdGltZV9xdWFudGEpIDA7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXRlLnJvZ3VlX3Zpb2xhdGlvbi5hbGFybV9zdGF0dXMgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdGUudXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbiA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQ0ZHX0lEX0FMQVJNX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYWxhcm1fc3RhdGVfcGFjaygmdGhpcy0+YWxhcm1fc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQ0ZHX0lEX0FMQVJNX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDMwOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19DRkdfSURfQUxBUk1fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hbGFybV9zdGF0ZV91bnBhY2soJnRoaXMtPmFsYXJtX3N0YXRlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0NGR19JRF9BTEFSTV9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDMwKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0NGR19JRF9BTEFSTV9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2FsYXJtX3N0YXRlX2JvdW5kc19jaGVjaygmdGhpcy0+YWxhcm1fc3RhdGUpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19DRkdfSURfQUxBUk1fU1RBVEU7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0xBU0VSX09OX09GRl9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXR1cy5sYXNlcl9vbl90aW1lID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdHVzLmxhc2VyX29mZl90aW1lID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdHVzLmFsYXJtX3N0YXR1cyA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19MQVNFUl9PTl9PRkZfVklPTEFUSU9OX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9sYXNlcl9vbl9vZmZfc3RhdHVzX3BhY2soJnRoaXMtPmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0xBU0VSX09OX09GRl9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDk7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfTEFTRVJfT05fT0ZGX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfbGFzZXJfb25fb2ZmX3N0YXR1c191bnBhY2soJnRoaXMtPmFsYXJtX3N0YXR1cywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfTEFTRVJfT05fT0ZGX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA5KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0xBU0VSX09OX09GRl9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2xhc2VyX29uX29mZl9zdGF0dXNfYm91bmRzX2NoZWNrKCZ0aGlzLT5hbGFybV9zdGF0dXMpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19MQVNFUl9PTl9PRkZfVklPTEFUSU9OX0lEX0FMQVJNX1NUQVRVUzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfTExJRF9QT09MX0VNUFRZX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdHVzID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0xMSURfUE9PTF9FTVBUWV9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0xMSURfUE9PTF9FTVBUWV9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfTExJRF9QT09MX0VNUFRZX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfTExJRF9QT09MX0VNUFRZX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb25fZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0xMSURfUE9PTF9FTVBUWV9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+YWxhcm1fc3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfTExJRF9QT09MX0VNUFRZX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfTUFYX0xJTktfVklPTEFUSU9OX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hbGFybV9zdGF0dXMgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX01BWF9MSU5LX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX01BWF9MSU5LX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfTUFYX0xJTktfVklPTEFUSU9OX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25fZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX01BWF9MSU5LX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX01BWF9MSU5LX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5hbGFybV9zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19NQVhfTElOS19WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19PVkVSSEVBRF9QUk9GSUxFX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdHVzID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfT1ZFUkhFQURfUFJPRklMRV9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfT1ZFUkhFQURfUFJPRklMRV9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19PVkVSSEVBRF9QUk9GSUxFX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25fZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX09WRVJIRUFEX1BST0ZJTEVfVklPTEFUSU9OX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25fZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfT1ZFUkhFQURfUFJPRklMRV9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+YWxhcm1fc3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfT1ZFUkhFQURfUFJPRklMRV9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25fZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1JBTkdFX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdHVzLnJhbmdlID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdHVzLmFsYXJtX3N0YXR1cyA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfUkFOR0VfVklPTEFUSU9OX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yYW5nZV9zdGF0dXNfcGFjaygmdGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1JBTkdFX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfUkFOR0VfVklPTEFUSU9OX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yYW5nZV9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfUkFOR0VfVklPTEFUSU9OX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfUkFOR0VfVklPTEFUSU9OX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yYW5nZV9zdGF0dXNfYm91bmRzX2NoZWNrKCZ0aGlzLT5hbGFybV9zdGF0dXMpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19SQU5HRV9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfUk9HVUVfVklPTEFUSU9OX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hbGFybV9zdGF0dXMuZGVuaWVkX2xsaWQgPSAoYmNtb2x0X2Vwb25fbGxpZCkgMDsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdHVzLmRlbmllZF9yYW5nZSA9IChiY21vbHRfdGltZV9xdWFudGEpIDA7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXR1cy5hbGFybV9zdGF0dXMgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1JPR1VFX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcm9ndWVfc3RhdHVzX3BhY2soJnRoaXMtPmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25fZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19ST0dVRV9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDc7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25fZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1JPR1VFX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcm9ndWVfc3RhdHVzX3VucGFjaygmdGhpcy0+YWxhcm1fc3RhdHVzLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25fZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1JPR1VFX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA3KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1JPR1VFX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcm9ndWVfc3RhdHVzX2JvdW5kc19jaGVjaygmdGhpcy0+YWxhcm1fc3RhdHVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfUk9HVUVfVklPTEFUSU9OX0lEX0FMQVJNX1NUQVRVUzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfU1lTVEVNX1JFU09VUkNFX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdHVzID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1NZU1RFTV9SRVNPVVJDRV9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1NZU1RFTV9SRVNPVVJDRV9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfU1lTVEVNX1JFU09VUkNFX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfU1lTVEVNX1JFU09VUkNFX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25fZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1NZU1RFTV9SRVNPVVJDRV9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+YWxhcm1fc3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfU1lTVEVNX1JFU09VUkNFX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19URE1fQ0hBTk5FTFNfRVhIQVVTVEVEX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hbGFybV9zdGF0dXMgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfVERNX0NIQU5ORUxTX0VYSEFVU1RFRF9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfVERNX0NIQU5ORUxTX0VYSEFVU1RFRF9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19URE1fQ0hBTk5FTFNfRVhIQVVTVEVEX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19URE1fQ0hBTk5FTFNfRVhIQVVTVEVEX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfVERNX0NIQU5ORUxTX0VYSEFVU1RFRF9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5hbGFybV9zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19URE1fQ0hBTk5FTFNfRVhIQVVTVEVEX0lEX0FMQVJNX1NUQVRVUzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1VOS05PV05fTElOS19WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXR1cy5saW5rX3JhdGUgPSBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfVEVOX1RFTjsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdHVzLmFsYXJtX3N0YXR1cyA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19VTktOT1dOX0xJTktfVklPTEFUSU9OX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF91bmtub3duX2xpbmtfc3RhdHVzX3BhY2soJnRoaXMtPmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1VOS05PV05fTElOS19WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDM7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfVU5LTk9XTl9MSU5LX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdW5rbm93bl9saW5rX3N0YXR1c191bnBhY2soJnRoaXMtPmFsYXJtX3N0YXR1cywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfVU5LTk9XTl9MSU5LX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb25fZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1VOS05PV05fTElOS19WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Vua25vd25fbGlua19zdGF0dXNfYm91bmRzX2NoZWNrKCZ0aGlzLT5hbGFybV9zdGF0dXMpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19VTktOT1dOX0xJTktfVklPTEFUSU9OX0lEX0FMQVJNX1NUQVRVUzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfVVBTVFJFQU1fQkFORFdJRFRIX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdHVzID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1VQU1RSRUFNX0JBTkRXSURUSF9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1VQU1RSRUFNX0JBTkRXSURUSF9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfVVBTVFJFQU1fQkFORFdJRFRIX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbl9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfVVBTVFJFQU1fQkFORFdJRFRIX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25fZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbl9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1VQU1RSRUFNX0JBTkRXSURUSF9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+YWxhcm1fc3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfVVBTVFJFQU1fQkFORFdJRFRIX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX0xBU0VSX09OX09GRl9WSU9MQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bGFzZXJfb25fb2ZmX3Zpb2xhdGlvbiA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9MTElEX1BPT0xfRU1QVFlfVklPTEFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmxsaWRfcG9vbF9lbXB0eV92aW9sYXRpb24gPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfTUFYX0xJTktfVklPTEFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm1heF9saW5rX3Zpb2xhdGlvbiA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9PVkVSSEVBRF9QUk9GSUxFX1ZJT0xBVElPTikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbiA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9SQU5HRV9WSU9MQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmFuZ2VfdmlvbGF0aW9uID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX1JPR1VFX1ZJT0xBVElPTikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yb2d1ZV92aW9sYXRpb24gPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfU1lTVEVNX1JFU09VUkNFX1ZJT0xBVElPTikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX1RETV9DSEFOTkVMU19FWEhBVVNURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dGRtX2NoYW5uZWxzX2V4aGF1c3RlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9VTktOT1dOX0xJTktfVklPTEFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnVua25vd25fbGlua192aW9sYXRpb24gPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfVVBTVFJFQU1fQkFORFdJRFRIX1ZJT0xBVElPTikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT51cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uID0gQkNNT1NfRkFMU0U7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfTEFTRVJfT05fT0ZGX1ZJT0xBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmxhc2VyX29uX29mZl92aW9sYXRpb24pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfTExJRF9QT09MX0VNUFRZX1ZJT0xBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmxsaWRfcG9vbF9lbXB0eV92aW9sYXRpb24pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfTUFYX0xJTktfVklPTEFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+bWF4X2xpbmtfdmlvbGF0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX09WRVJIRUFEX1BST0ZJTEVfVklPTEFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+b3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb24pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfUkFOR0VfVklPTEFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+cmFuZ2VfdmlvbGF0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX1JPR1VFX1ZJT0xBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnJvZ3VlX3Zpb2xhdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9TWVNURU1fUkVTT1VSQ0VfVklPTEFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9URE1fQ0hBTk5FTFNfRVhIQVVTVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dGRtX2NoYW5uZWxzX2V4aGF1c3RlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9VTktOT1dOX0xJTktfVklPTEFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dW5rbm93bl9saW5rX3Zpb2xhdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9VUFNUUkVBTV9CQU5EV0lEVEhfVklPTEFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX0xBU0VSX09OX09GRl9WSU9MQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfTExJRF9QT09MX0VNUFRZX1ZJT0xBVElPTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9NQVhfTElOS19WSU9MQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfT1ZFUkhFQURfUFJPRklMRV9WSU9MQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfUkFOR0VfVklPTEFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX1JPR1VFX1ZJT0xBVElPTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9TWVNURU1fUkVTT1VSQ0VfVklPTEFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX1RETV9DSEFOTkVMU19FWEhBVVNURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfVU5LTk9XTl9MSU5LX1ZJT0xBVElPTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9VUFNUUkVBTV9CQU5EV0lEVEhfVklPTEFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9MQVNFUl9PTl9PRkZfVklPTEFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+bGFzZXJfb25fb2ZmX3Zpb2xhdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9MTElEX1BPT0xfRU1QVFlfVklPTEFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+bGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9NQVhfTElOS19WSU9MQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5tYXhfbGlua192aW9sYXRpb24pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfT1ZFUkhFQURfUFJPRklMRV9WSU9MQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9SQU5HRV9WSU9MQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5yYW5nZV92aW9sYXRpb24pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfUk9HVUVfVklPTEFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+cm9ndWVfdmlvbGF0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX1NZU1RFTV9SRVNPVVJDRV9WSU9MQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX1RETV9DSEFOTkVMU19FWEhBVVNURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT50ZG1fY2hhbm5lbHNfZXhoYXVzdGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX1VOS05PV05fTElOS19WSU9MQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT51bmtub3duX2xpbmtfdmlvbGF0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX1VQU1RSRUFNX0JBTkRXSURUSF9WSU9MQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT51cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9MQVNFUl9PTl9PRkZfVklPTEFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9MTElEX1BPT0xfRU1QVFlfVklPTEFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9NQVhfTElOS19WSU9MQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX09WRVJIRUFEX1BST0ZJTEVfVklPTEFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9SQU5HRV9WSU9MQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX1JPR1VFX1ZJT0xBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfU1lTVEVNX1JFU09VUkNFX1ZJT0xBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfVERNX0NIQU5ORUxTX0VYSEFVU1RFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfVU5LTk9XTl9MSU5LX1ZJT0xBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfVVBTVFJFQU1fQkFORFdJRFRIX1ZJT0xBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbGlua19rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbGlua19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9FUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX01BQ19BRERSRVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGJjbW9zX21hY19hZGRyZXNzX2luaXQoJnRoaXMtPm1hY19hZGRyZXNzKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfa2V5X3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX0VQT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+ZXBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9NQUNfQUREUkVTUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT5tYWNfYWRkcmVzcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbGlua19rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fbGlua19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19LRVlfSURfRVBPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9NQUNfQUREUkVTUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA2OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19rZXlfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9FUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+ZXBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9NQUNfQUREUkVTUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9tYWNfYWRkcmVzcyhidWYsICZ0aGlzLT5tYWNfYWRkcmVzcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2tleV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX0VQT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX01BQ19BRERSRVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9saW5rX2tleV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xJTktfUkFURSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5saW5rX3JhdGUgPSBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfVEVOX1RFTjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfU1RBVEVfRkxBR1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdGVfZmxhZ3MgPSAoYmNtb2x0X2Vwb25fbGlua19zdGF0ZV9mbGFncykgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfTExJRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5sbGlkID0gKGJjbW9sdF9lcG9uX2xsaWQpIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xBU0VSX09OX1RJTUVfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bGFzZXJfb25fdGltZV90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xBU0VSX09GRl9USU1FX1RRKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmxhc2VyX29mZl90aW1lX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfUkFOR0VfVkFMVUVfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmFuZ2VfdmFsdWVfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9ESVNUQU5DRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5kaXN0YW5jZSA9IChiY21vbHRfbWV0ZXJzKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9BTEFSTV9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hbGFybV9zdGF0ZS5rZXlfZXhjaGFuZ2VfZmFpbHVyZSA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgICAgICB0aGlzLT5hbGFybV9zdGF0ZS5pbnZhbGlkX21wY3BfcmVwb3J0X3JlY2VpdmVkID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXRlLm1wY3BfcmVwb3J0X3RpbWVvdXQgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdGUub2FtX2tlZXBhbGl2ZV90aW1lb3V0ID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1RVTk5FTF9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50dW5uZWxfaWQgPSAoYmNtb2x0X2Vwb25fdHVubmVsX2lkKSAyMTY0MjYwODY0VUw7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vbnVfaWQgPSAoYmNtb2x0X2Vwb25fb251X2lkKSAyNTU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX01JTl9MQVNFUl9PVkVSSEVBRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5taW5fbGFzZXJfb3ZlcmhlYWQubGFzZXJfb25fdGltZSA9IChiY21vbHRfdGltZV9xdWFudGEpIDMyOworICAgICAgICB0aGlzLT5taW5fbGFzZXJfb3ZlcmhlYWQubGFzZXJfb2ZmX3RpbWUgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSAzMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfS0VZX0VYQ0hBTkdFX0NPTkZJRykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5rZXlfZXhjaGFuZ2VfY29uZmlnLm9hbV90eXBlID0gQkNNT0xUX0VQT05fT0FNX1RZUEVfQlJPQURDT007CisgICAgICAgIHRoaXMtPmtleV9leGNoYW5nZV9jb25maWcucGVyaW9kID0gMDsKKyAgICAgICAgdGhpcy0+a2V5X2V4Y2hhbmdlX2NvbmZpZy5kaXJlY3Rpb24gPSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX0RJUkVDVElPTl9ET1dOU1RSRUFNX09OTFk7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0VQT05fRU5DUllQVElPTikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5lcG9uX2VuY3J5cHRpb24uZG93bnN0cmVhbV9tb2RlID0gQkNNT0xUX0VQT05fRU5DUllQVElPTl9NT0RFX05PX0VOQ1JZUFRJT047CisgICAgICAgIHRoaXMtPmVwb25fZW5jcnlwdGlvbi5kb3duc3RyZWFtX2tleV9jaG9pY2UgPSBCQ01PTFRfRVBPTl9LRVlfQ0hPSUNFX0tFWV8wOworICAgICAgICB0aGlzLT5lcG9uX2VuY3J5cHRpb24uZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLmZvcm1hdCA9IEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fSU5GT1JNQVRJT05fRk9STUFUX0NGQjsKKyAgICAgICAgbWVtc2V0KHRoaXMtPmVwb25fZW5jcnlwdGlvbi5kb3duc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24udS5jZmIua2V5LCAwLCBzaXplb2YodGhpcy0+ZXBvbl9lbmNyeXB0aW9uLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi51LmNmYi5rZXkpKTsKKyAgICAgICAgdGhpcy0+ZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX21vZGUgPSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX01PREVfTk9fRU5DUllQVElPTjsKKyAgICAgICAgdGhpcy0+ZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX2tleV9jaG9pY2UgPSBCQ01PTFRfRVBPTl9LRVlfQ0hPSUNFX0tFWV8wOworICAgICAgICB0aGlzLT5lcG9uX2VuY3J5cHRpb24udXBzdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5mb3JtYXQgPSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX0lORk9STUFUSU9OX0ZPUk1BVF9DRkI7CisgICAgICAgIG1lbXNldCh0aGlzLT5lcG9uX2VuY3J5cHRpb24udXBzdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi51LmNmYi5rZXksIDAsIHNpemVvZih0aGlzLT5lcG9uX2VuY3J5cHRpb24udXBzdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi51LmNmYi5rZXkpKTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfRkVDX0VOQUJMRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mZWNfZW5hYmxlLnVwc3RyZWFtID0gQkNNT0xUX0VQT05fTElOS19GRUNfU1RBVEVfVVNFX0RFRkFVTFQ7CisgICAgICAgIHRoaXMtPmZlY19lbmFibGUuZG93bnN0cmVhbSA9IEJDTU9MVF9FUE9OX0xJTktfRkVDX1NUQVRFX1VTRV9ERUZBVUxUOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9PQU1fSEVBUlRCRUFUX0NPTkZJRykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vYW1faGVhcnRiZWF0X2NvbmZpZy5zZW5kX3BlcmlvZCA9IDA7CisgICAgICAgIHRoaXMtPm9hbV9oZWFydGJlYXRfY29uZmlnLnRyYW5zbWl0X2ZyYW1lLmxlbiA9IDA7CisgICAgICAgIHRoaXMtPm9hbV9oZWFydGJlYXRfY29uZmlnLnRyYW5zbWl0X2ZyYW1lLnZhbCA9IE5VTEw7CisgICAgICAgIHRoaXMtPm9hbV9oZWFydGJlYXRfY29uZmlnLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS5mcmFtZV9vY3RldHMubGVuID0gMDsKKyAgICAgICAgdGhpcy0+b2FtX2hlYXJ0YmVhdF9jb25maWcuaWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlLmZyYW1lX29jdGV0cy52YWwgPSBOVUxMOworICAgICAgICB0aGlzLT5vYW1faGVhcnRiZWF0X2NvbmZpZy5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUubWFza19vY3RldHMubGVuID0gMDsKKyAgICAgICAgdGhpcy0+b2FtX2hlYXJ0YmVhdF9jb25maWcuaWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlLm1hc2tfb2N0ZXRzLnZhbCA9IE5VTEw7CisgICAgICAgIHRoaXMtPm9hbV9oZWFydGJlYXRfY29uZmlnLnJlY2VpdmVfdGltZW91dCA9IDE7CisgICAgICAgIHRoaXMtPm9hbV9oZWFydGJlYXRfY29uZmlnLm1heGltdW1fcmVjZWl2ZV9zaXplID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfVVBTVFJFQU1fQkFORFdJRFRIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnVwc3RyZWFtX2JhbmR3aWR0aC5wb2xsaW5nX2ludGVydmFsX3VzID0gQkNNT0xUX1BPTExJTkdfSU5URVJWQUxfQVVUT01BVElDOworICAgICAgICB0aGlzLT51cHN0cmVhbV9iYW5kd2lkdGguZ3JhbnRfdGhyZXNob2xkX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICAgICAgdGhpcy0+dXBzdHJlYW1fYmFuZHdpZHRoLm1pbl9zY2hlZHVsZXJzaGFwZXIuYmFuZHdpZHRoX0ticHMgPSAoYmNtb2x0X2JhbmR3aWR0aF9LYnBzKSAwOworICAgICAgICB0aGlzLT51cHN0cmVhbV9iYW5kd2lkdGgubWluX3NjaGVkdWxlcnNoYXBlci5tYXhfYnVyc3Rfc2l6ZV90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIDA7CisgICAgICAgIHRoaXMtPnVwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyLnByaW9yaXR5ID0gMDsKKyAgICAgICAgdGhpcy0+dXBzdHJlYW1fYmFuZHdpZHRoLm1pbl9zY2hlZHVsZXJzaGFwZXIud2VpZ2h0X3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICAgICAgdGhpcy0+dXBzdHJlYW1fYmFuZHdpZHRoLm1heF9zY2hlZHVsZXJzaGFwZXIuYmFuZHdpZHRoX0ticHMgPSAoYmNtb2x0X2JhbmR3aWR0aF9LYnBzKSAwOworICAgICAgICB0aGlzLT51cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci5tYXhfYnVyc3Rfc2l6ZV90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIDA7CisgICAgICAgIHRoaXMtPnVwc3RyZWFtX2JhbmR3aWR0aC5tYXhfc2NoZWR1bGVyc2hhcGVyLnByaW9yaXR5ID0gMDsKKyAgICAgICAgdGhpcy0+dXBzdHJlYW1fYmFuZHdpZHRoLm1heF9zY2hlZHVsZXJzaGFwZXIud2VpZ2h0X3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICAgICAgdGhpcy0+dXBzdHJlYW1fYmFuZHdpZHRoLnRkbV9ncmFudF9zaXplX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICAgICAgdGhpcy0+dXBzdHJlYW1fYmFuZHdpZHRoLnRkbV9ncmFudF9pbnRlcnZhbF91cyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1VCRF9JTkZPKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnViZF9pbmZvLmFjdHVhbF9wb2xsaW5nX2ludGVydmFsID0gMDsKKyAgICAgICAgdGhpcy0+dWJkX2luZm8uYWN0dWFsX2dyYW50X3RocmVzaG9sZF90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIDA7CisgICAgICAgIHRoaXMtPnViZF9pbmZvLmFjdHVhbF9taW5fc2NoZWR1bGVyc2hhcGVyLmFjdHVhbF9tYnNfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSAwOworICAgICAgICB0aGlzLT51YmRfaW5mby5hY3R1YWxfbWluX3NjaGVkdWxlcnNoYXBlci5hY3R1YWxfd2VpZ2h0X3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICAgICAgdGhpcy0+dWJkX2luZm8uYWN0dWFsX21heF9zY2hlZHVsZXJzaGFwZXIuYWN0dWFsX21ic190cSA9IChiY21vbHRfdGltZV9xdWFudGEpIDA7CisgICAgICAgIHRoaXMtPnViZF9pbmZvLmFjdHVhbF9tYXhfc2NoZWR1bGVyc2hhcGVyLmFjdHVhbF93ZWlnaHRfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9DTE9DS19UUkFOU1BPUlRfRU5BQkxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNsb2NrX3RyYW5zcG9ydF9lbmFibGUgPSBCQ01PU19UUlVFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9QRU5ESU5HX0dSQU5UUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wZW5kaW5nX2dyYW50cyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xJTktfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5saW5rX3R5cGUgPSBCQ01PTFRfRVBPTl9MSU5LX1RZUEVfU1lTVEVNOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xJTktfUkFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2xpbmtfcmF0ZV9wYWNrKHRoaXMtPmxpbmtfcmF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1NUQVRFX0ZMQUdTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fbGlua19zdGF0ZV9mbGFnc19wYWNrKHRoaXMtPnN0YXRlX2ZsYWdzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfTExJRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5sbGlkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xBU0VSX09OX1RJTUVfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcy0+bGFzZXJfb25fdGltZV90cSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9MQVNFUl9PRkZfVElNRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzLT5sYXNlcl9vZmZfdGltZV90cSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9SQU5HRV9WQUxVRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzLT5yYW5nZV92YWx1ZV90cSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9ESVNUQU5DRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzLT5kaXN0YW5jZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9BTEFSTV9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2xpbmtfYWxhcm1fc3RhdGVfcGFjaygmdGhpcy0+YWxhcm1fc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9UVU5ORUxfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcy0+dHVubmVsX2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcy0+b251X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX01JTl9MQVNFUl9PVkVSSEVBRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2xhc2VyX292ZXJoZWFkX3BhcmFtZXRlcnNfcGFjaygmdGhpcy0+bWluX2xhc2VyX292ZXJoZWFkLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfS0VZX0VYQ0hBTkdFX0NPTkZJRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2tleV9leGNoYW5nZV9jb25maWdfcGFjaygmdGhpcy0+a2V5X2V4Y2hhbmdlX2NvbmZpZywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0VQT05fRU5DUllQVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2VuY3J5cHRpb25fY29uZmlnX3BhY2soJnRoaXMtPmVwb25fZW5jcnlwdGlvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0ZFQ19FTkFCTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9saW5rX2ZlY19lbl9wYWNrKCZ0aGlzLT5mZWNfZW5hYmxlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfT0FNX0hFQVJUQkVBVF9DT05GSUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfb2FtX2hlYXJ0YmVhdF9jb25maWdfcGFjaygmdGhpcy0+b2FtX2hlYXJ0YmVhdF9jb25maWcsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9VUFNUUkVBTV9CQU5EV0lEVEgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdXBzdHJlYW1fYmFuZHdpZHRoX2Rpc3RyaWJ1dGlvbl9wYWNrKCZ0aGlzLT51cHN0cmVhbV9iYW5kd2lkdGgsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9VQkRfSU5GTykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF91YmRfaW5mb19wYWNrKCZ0aGlzLT51YmRfaW5mbywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0NMT0NLX1RSQU5TUE9SVF9FTkFCTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5jbG9ja190cmFuc3BvcnRfZW5hYmxlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1BFTkRJTkdfR1JBTlRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnBlbmRpbmdfZ3JhbnRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xJTktfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2xpbmtfdHlwZV9wYWNrKHRoaXMtPmxpbmtfdHlwZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfTElOS19SQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1NUQVRFX0ZMQUdTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xMSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfTEFTRVJfT05fVElNRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9MQVNFUl9PRkZfVElNRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9SQU5HRV9WQUxVRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9ESVNUQU5DRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9BTEFSTV9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9UVU5ORUxfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX01JTl9MQVNFUl9PVkVSSEVBRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9LRVlfRVhDSEFOR0VfQ09ORklHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0VQT05fRU5DUllQVElPTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2NvbmZpZ19nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+ZXBvbl9lbmNyeXB0aW9uKTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfRkVDX0VOQUJMRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9PQU1fSEVBUlRCRUFUX0NPTkZJRykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSBiY21vbHRfb2FtX2hlYXJ0YmVhdF9jb25maWdfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPm9hbV9oZWFydGJlYXRfY29uZmlnKTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfVVBTVFJFQU1fQkFORFdJRFRIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9VQkRfSU5GTykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfQ0xPQ0tfVFJBTlNQT1JUX0VOQUJMRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9QRU5ESU5HX0dSQU5UUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9MSU5LX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xJTktfUkFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2xpbmtfcmF0ZV91bnBhY2soJnRoaXMtPmxpbmtfcmF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1NUQVRFX0ZMQUdTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fbGlua19zdGF0ZV9mbGFnc191bnBhY2soJnRoaXMtPnN0YXRlX2ZsYWdzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfTExJRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPmxsaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfTEFTRVJfT05fVElNRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPmxhc2VyX29uX3RpbWVfdHEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfTEFTRVJfT0ZGX1RJTUVfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgKHVpbnQzMl90ICopICZ0aGlzLT5sYXNlcl9vZmZfdGltZV90cSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9SQU5HRV9WQUxVRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPnJhbmdlX3ZhbHVlX3RxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0RJU1RBTkNFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICh1aW50MzJfdCAqKSAmdGhpcy0+ZGlzdGFuY2UpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfQUxBUk1fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9saW5rX2FsYXJtX3N0YXRlX3VucGFjaygmdGhpcy0+YWxhcm1fc3RhdGUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1RVTk5FTF9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPnR1bm5lbF9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAodWludDhfdCAqKSAmdGhpcy0+b251X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX01JTl9MQVNFUl9PVkVSSEVBRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2xhc2VyX292ZXJoZWFkX3BhcmFtZXRlcnNfdW5wYWNrKCZ0aGlzLT5taW5fbGFzZXJfb3ZlcmhlYWQsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0tFWV9FWENIQU5HRV9DT05GSUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9rZXlfZXhjaGFuZ2VfY29uZmlnX3VucGFjaygmdGhpcy0+a2V5X2V4Y2hhbmdlX2NvbmZpZywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfRVBPTl9FTkNSWVBUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9jb25maWdfdW5wYWNrKCZ0aGlzLT5lcG9uX2VuY3J5cHRpb24sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0ZFQ19FTkFCTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9saW5rX2ZlY19lbl91bnBhY2soJnRoaXMtPmZlY19lbmFibGUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX09BTV9IRUFSVEJFQVRfQ09ORklHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X29hbV9oZWFydGJlYXRfY29uZmlnX3VucGFjaygmdGhpcy0+b2FtX2hlYXJ0YmVhdF9jb25maWcsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1VQU1RSRUFNX0JBTkRXSURUSCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF91cHN0cmVhbV9iYW5kd2lkdGhfZGlzdHJpYnV0aW9uX3VucGFjaygmdGhpcy0+dXBzdHJlYW1fYmFuZHdpZHRoLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9VQkRfSU5GTykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF91YmRfaW5mb191bnBhY2soJnRoaXMtPnViZF9pbmZvLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9DTE9DS19UUkFOU1BPUlRfRU5BQkxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+Y2xvY2tfdHJhbnNwb3J0X2VuYWJsZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9QRU5ESU5HX0dSQU5UUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5wZW5kaW5nX2dyYW50cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9MSU5LX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9saW5rX3R5cGVfdW5wYWNrKCZ0aGlzLT5saW5rX3R5cGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfTElOS19SQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9TVEFURV9GTEFHUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfTExJRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfTEFTRVJfT05fVElNRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfTEFTRVJfT0ZGX1RJTUVfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1JBTkdFX1ZBTFVFX1RRKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9ESVNUQU5DRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfQUxBUk1fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1RVTk5FTF9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9NSU5fTEFTRVJfT1ZFUkhFQUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0tFWV9FWENIQU5HRV9DT05GSUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0VQT05fRU5DUllQVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2VuY3J5cHRpb25fY29uZmlnX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfRkVDX0VOQUJMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfT0FNX0hFQVJUQkVBVF9DT05GSUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfb2FtX2hlYXJ0YmVhdF9jb25maWdfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9VUFNUUkVBTV9CQU5EV0lEVEgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0MikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9VQkRfSU5GTykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0NMT0NLX1RSQU5TUE9SVF9FTkFCTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1BFTkRJTkdfR1JBTlRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9MSU5LX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9saW5rX2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xJTktfUkFURSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmxpbmtfcmF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfVEVOX1RFTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19SQVRFX1RFTl9PTkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfUkFURV9PTkVfT05FOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9MSU5LX1JBVEU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1NUQVRFX0ZMQUdTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICgodGhpcy0+c3RhdGVfZmxhZ3MgJiAweDAwRkUpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1NUQVRFX0ZMQUdTOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0FMQVJNX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fbGlua19hbGFybV9zdGF0ZV9ib3VuZHNfY2hlY2soJnRoaXMtPmFsYXJtX3N0YXRlKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfQUxBUk1fU1RBVEU7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfVFVOTkVMX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT50dW5uZWxfaWQgPCAoYmNtb2x0X2Vwb25fdHVubmVsX2lkKSAyMTY0MjYwODY0VUwpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1RVTk5FTF9JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0aGlzLT50dW5uZWxfaWQgPiAoYmNtb2x0X2Vwb25fdHVubmVsX2lkKSAyMTY0MjY0OTU5VUwpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1RVTk5FTF9JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPm9udV9pZCA+IChiY21vbHRfZXBvbl9vbnVfaWQpIDEyNykKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfT05VX0lEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX01JTl9MQVNFUl9PVkVSSEVBRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2xhc2VyX292ZXJoZWFkX3BhcmFtZXRlcnNfYm91bmRzX2NoZWNrKCZ0aGlzLT5taW5fbGFzZXJfb3ZlcmhlYWQpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9NSU5fTEFTRVJfT1ZFUkhFQUQ7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfS0VZX0VYQ0hBTkdFX0NPTkZJRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2tleV9leGNoYW5nZV9jb25maWdfYm91bmRzX2NoZWNrKCZ0aGlzLT5rZXlfZXhjaGFuZ2VfY29uZmlnKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfS0VZX0VYQ0hBTkdFX0NPTkZJRzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9FUE9OX0VOQ1JZUFRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2NvbmZpZ19ib3VuZHNfY2hlY2soJnRoaXMtPmVwb25fZW5jcnlwdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0VQT05fRU5DUllQVElPTjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9GRUNfRU5BQkxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fbGlua19mZWNfZW5fYm91bmRzX2NoZWNrKCZ0aGlzLT5mZWNfZW5hYmxlKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfRkVDX0VOQUJMRTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9PQU1fSEVBUlRCRUFUX0NPTkZJRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9vYW1faGVhcnRiZWF0X2NvbmZpZ19ib3VuZHNfY2hlY2soJnRoaXMtPm9hbV9oZWFydGJlYXRfY29uZmlnKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfT0FNX0hFQVJUQkVBVF9DT05GSUc7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfVVBTVFJFQU1fQkFORFdJRFRIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb25fYm91bmRzX2NoZWNrKCZ0aGlzLT51cHN0cmVhbV9iYW5kd2lkdGgpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9VUFNUUkVBTV9CQU5EV0lEVEg7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfVUJEX0lORk8pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdWJkX2luZm9fYm91bmRzX2NoZWNrKCZ0aGlzLT51YmRfaW5mbykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1VCRF9JTkZPOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xJTktfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmxpbmtfdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1RZUEVfU1lTVEVNOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1RZUEVfRE9XTlNUUkVBTV9PTkxZOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1RZUEVfQklESVJFQ1RJT05BTDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfTElOS19UWVBFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9EQVRBX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2RhdGFfYnl0ZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfREFUQV9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfZGF0YV9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzY0KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2ZyYW1lc182NCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfNjVfMTI3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2ZyYW1lc182NV8xMjcgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzEyOF8yNTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfZnJhbWVzXzEyOF8yNTUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzI1Nl81MTEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfZnJhbWVzXzI1Nl81MTEgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzUxMl8xMDIzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2ZyYW1lc181MTJfMTAyMyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfMTAyNF8xNTE4KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2ZyYW1lc18xMDI0XzE1MTggPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzE1MTlfMjA0NykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9mcmFtZXNfMTUxOV8yMDQ3ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18yMDQ4XzQwOTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfZnJhbWVzXzIwNDhfNDA5NSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfNDA5Nl85MjE2KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2ZyYW1lc180MDk2XzkyMTYgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzkyMTdfMTYzODMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfZnJhbWVzXzkyMTdfMTYzODMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfT0FNX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X29hbV9ieXRlcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9PQU1fRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X29hbV9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfTVBDUF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfbXBjcF9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfQlJPQURDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9icm9hZGNhc3RfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX1VOSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X3VuaWNhc3RfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX01VTFRJQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfbXVsdGljYXN0X2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9SRVBPUlRfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X3JlcG9ydF9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRkNTX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2Zjc19lcnJvciA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9PVkVSU0laRV9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9vdmVyc2l6ZV9lcnJvciA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9SVU5UX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X3J1bnRfZXJyb3IgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfTElORV9DT0RFX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2xpbmVfY29kZV9lcnJvciA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9MSU5FX0NPREVfRVJST1JfTUFYKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2xpbmVfY29kZV9lcnJvcl9tYXggPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfREFUQV9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9kYXRhX2J5dGVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0RBVEFfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X2RhdGFfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU182NCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9mcmFtZXNfNjQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzY1XzEyNykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9mcmFtZXNfNjVfMTI3ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18xMjhfMjU1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X2ZyYW1lc18xMjhfMjU1ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18yNTZfNTExKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X2ZyYW1lc18yNTZfNTExID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU181MTJfMTAyMykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9mcmFtZXNfNTEyXzEwMjMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzEwMjRfMTUxOCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9mcmFtZXNfMTAyNF8xNTE4ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18xNTE5XzIwNDcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfZnJhbWVzXzE1MTlfMjA0NyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMjA0OF80MDk1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X2ZyYW1lc18yMDQ4XzQwOTUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzQwOTZfOTIxNikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9mcmFtZXNfNDA5Nl85MjE2ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU185MjE3XzE2MzgzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X2ZyYW1lc185MjE3XzE2MzgzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX09BTV9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9vYW1fYnl0ZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfT0FNX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9vYW1fZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX01QQ1BfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X21wY3BfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0JST0FEQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfYnJvYWRjYXN0X2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9VTklDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF91bmljYXN0X2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9NVUxUSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X211bHRpY2FzdF9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfR0FURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfZ2F0ZXMgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0RBVEFfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2RhdGFfYnl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0RBVEFfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF9kYXRhX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzY0KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF9mcmFtZXNfNjQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU182NV8xMjcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2ZyYW1lc182NV8xMjcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18xMjhfMjU1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF9mcmFtZXNfMTI4XzI1NSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzI1Nl81MTEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2ZyYW1lc18yNTZfNTExKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfNTEyXzEwMjMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2ZyYW1lc181MTJfMTAyMykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzEwMjRfMTUxOCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfZnJhbWVzXzEwMjRfMTUxOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzE1MTlfMjA0NykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfZnJhbWVzXzE1MTlfMjA0NykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzIwNDhfNDA5NSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfZnJhbWVzXzIwNDhfNDA5NSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzQwOTZfOTIxNikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfZnJhbWVzXzQwOTZfOTIxNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzkyMTdfMTYzODMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2ZyYW1lc185MjE3XzE2MzgzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9PQU1fQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X29hbV9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfT0FNX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfb2FtX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfTVBDUF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X21wY3BfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9CUk9BRENBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF9icm9hZGNhc3RfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9VTklDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfdW5pY2FzdF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX01VTFRJQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X211bHRpY2FzdF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX1JFUE9SVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X3JlcG9ydF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZDU19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfZmNzX2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9PVkVSU0laRV9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfb3ZlcnNpemVfZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX1JVTlRfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X3J1bnRfZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0xJTkVfQ09ERV9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfbGluZV9jb2RlX2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9MSU5FX0NPREVfRVJST1JfTUFYKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF9saW5lX2NvZGVfZXJyb3JfbWF4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9EQVRBX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9kYXRhX2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9EQVRBX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dHhfZGF0YV9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU182NCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dHhfZnJhbWVzXzY0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfNjVfMTI3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9mcmFtZXNfNjVfMTI3KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMTI4XzI1NSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dHhfZnJhbWVzXzEyOF8yNTUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18yNTZfNTExKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9mcmFtZXNfMjU2XzUxMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzUxMl8xMDIzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9mcmFtZXNfNTEyXzEwMjMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18xMDI0XzE1MTgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X2ZyYW1lc18xMDI0XzE1MTgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18xNTE5XzIwNDcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X2ZyYW1lc18xNTE5XzIwNDcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18yMDQ4XzQwOTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X2ZyYW1lc18yMDQ4XzQwOTUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU180MDk2XzkyMTYpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X2ZyYW1lc180MDk2XzkyMTYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU185MjE3XzE2MzgzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9mcmFtZXNfOTIxN18xNjM4MykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfT0FNX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9vYW1fYnl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX09BTV9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X29hbV9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX01QQ1BfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9tcGNwX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfQlJPQURDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dHhfYnJvYWRjYXN0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfVU5JQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X3VuaWNhc3RfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9NVUxUSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9tdWx0aWNhc3RfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9HQVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dHhfZ2F0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9EQVRBX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9EQVRBX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzY0KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfNjVfMTI3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfMTI4XzI1NSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzI1Nl81MTEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU181MTJfMTAyMykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzEwMjRfMTUxOCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzE1MTlfMjA0NykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzIwNDhfNDA5NSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzQwOTZfOTIxNikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzkyMTdfMTYzODMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX09BTV9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfT0FNX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfTVBDUF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0JST0FEQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX1VOSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9NVUxUSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9SRVBPUlRfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GQ1NfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX09WRVJTSVpFX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9SVU5UX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9MSU5FX0NPREVfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0xJTkVfQ09ERV9FUlJPUl9NQVgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0RBVEFfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0RBVEFfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfNjQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU182NV8xMjcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18xMjhfMjU1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMjU2XzUxMSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzUxMl8xMDIzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMTAyNF8xNTE4KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMTUxOV8yMDQ3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMjA0OF80MDk1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfNDA5Nl85MjE2KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfOTIxN18xNjM4MykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfT0FNX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9PQU1fRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9NUENQX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfQlJPQURDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfVU5JQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX01VTFRJQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0dBVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9EQVRBX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9kYXRhX2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9EQVRBX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfZGF0YV9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU182NCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfZnJhbWVzXzY0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfNjVfMTI3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9mcmFtZXNfNjVfMTI3KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfMTI4XzI1NSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfZnJhbWVzXzEyOF8yNTUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18yNTZfNTExKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9mcmFtZXNfMjU2XzUxMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzUxMl8xMDIzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9mcmFtZXNfNTEyXzEwMjMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18xMDI0XzE1MTgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2ZyYW1lc18xMDI0XzE1MTgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18xNTE5XzIwNDcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2ZyYW1lc18xNTE5XzIwNDcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18yMDQ4XzQwOTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2ZyYW1lc18yMDQ4XzQwOTUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU180MDk2XzkyMTYpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2ZyYW1lc180MDk2XzkyMTYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU185MjE3XzE2MzgzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9mcmFtZXNfOTIxN18xNjM4MykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfT0FNX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9vYW1fYnl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX09BTV9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X29hbV9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX01QQ1BfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9tcGNwX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfQlJPQURDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfYnJvYWRjYXN0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfVU5JQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X3VuaWNhc3RfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9NVUxUSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9tdWx0aWNhc3RfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9SRVBPUlRfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9yZXBvcnRfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GQ1NfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2Zjc19lcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfT1ZFUlNJWkVfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X292ZXJzaXplX2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9SVU5UX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9ydW50X2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9MSU5FX0NPREVfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2xpbmVfY29kZV9lcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfTElORV9DT0RFX0VSUk9SX01BWCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfbGluZV9jb2RlX2Vycm9yX21heCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfREFUQV9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfZGF0YV9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfREFUQV9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X2RhdGFfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfNjQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X2ZyYW1lc182NCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzY1XzEyNykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfZnJhbWVzXzY1XzEyNykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzEyOF8yNTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X2ZyYW1lc18xMjhfMjU1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMjU2XzUxMSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfZnJhbWVzXzI1Nl81MTEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU181MTJfMTAyMykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfZnJhbWVzXzUxMl8xMDIzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMTAyNF8xNTE4KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50eF9mcmFtZXNfMTAyNF8xNTE4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMTUxOV8yMDQ3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50eF9mcmFtZXNfMTUxOV8yMDQ3KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMjA0OF80MDk1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50eF9mcmFtZXNfMjA0OF80MDk1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfNDA5Nl85MjE2KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50eF9mcmFtZXNfNDA5Nl85MjE2KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfOTIxN18xNjM4MykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfZnJhbWVzXzkyMTdfMTYzODMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX09BTV9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfb2FtX2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9PQU1fRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50eF9vYW1fZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9NUENQX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfbXBjcF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0JST0FEQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X2Jyb2FkY2FzdF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX1VOSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50eF91bmljYXN0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfTVVMVElDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfbXVsdGljYXN0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfR0FURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X2dhdGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0RBVEFfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9EQVRBX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU182NCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU182NV8xMjcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfMTI4XzI1NSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18yNTZfNTExKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzUxMl8xMDIzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzEwMjRfMTUxOCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18xNTE5XzIwNDcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfMjA0OF80MDk1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzQwOTZfOTIxNikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU185MjE3XzE2MzgzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfT0FNX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfT0FNX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX01QQ1BfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfQlJPQURDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX1VOSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfTVVMVElDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX1JFUE9SVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GQ1NfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9PVkVSU0laRV9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX1JVTlRfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9MSU5FX0NPREVfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9MSU5FX0NPREVfRVJST1JfTUFYKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfREFUQV9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0RBVEFfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzY0KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzY1XzEyNykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18xMjhfMjU1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzI1Nl81MTEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfNTEyXzEwMjMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMTAyNF8xNTE4KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzE1MTlfMjA0NykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18yMDQ4XzQwOTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfNDA5Nl85MjE2KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzkyMTdfMTYzODMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9PQU1fQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9PQU1fRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfTVBDUF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9CUk9BRENBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfVU5JQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9NVUxUSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfR0FURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jZmcudHJpZ2dlci50eXBlID0gQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfTk9ORTsKKyAgICAgICAgdGhpcy0+Y2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSA9IDA7CisgICAgICAgIHRoaXMtPmNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3BhY2soJnRoaXMtPmNmZywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ19nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+Y2ZnKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ191bnBhY2soJnRoaXMtPmNmZywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ19ib3VuZHNfY2hlY2soJnRoaXMtPmNmZykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9DRkdfSURfQ0ZHOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0RVUExJQ0FURV9NUENQX1JFR0lTVFJBVElPTl9SRVFVRVNUX0lEX0lOSVRJQUxfUkFOR0VfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+aW5pdGlhbF9yYW5nZV90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfRFVQTElDQVRFX01QQ1BfUkVHSVNUUkFUSU9OX1JFUVVFU1RfSURfQ1VSUkVOVF9SQU5HRV9UUSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jdXJyZW50X3JhbmdlX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19EVVBMSUNBVEVfTVBDUF9SRUdJU1RSQVRJT05fUkVRVUVTVF9JRF9JTklUSUFMX1JBTkdFX1RRKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMtPmluaXRpYWxfcmFuZ2VfdHEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19EVVBMSUNBVEVfTVBDUF9SRUdJU1RSQVRJT05fUkVRVUVTVF9JRF9DVVJSRU5UX1JBTkdFX1RRKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMtPmN1cnJlbnRfcmFuZ2VfdHEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19EVVBMSUNBVEVfTVBDUF9SRUdJU1RSQVRJT05fUkVRVUVTVF9JRF9JTklUSUFMX1JBTkdFX1RRKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfRFVQTElDQVRFX01QQ1BfUkVHSVNUUkFUSU9OX1JFUVVFU1RfSURfQ1VSUkVOVF9SQU5HRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfRFVQTElDQVRFX01QQ1BfUkVHSVNUUkFUSU9OX1JFUVVFU1RfSURfSU5JVElBTF9SQU5HRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPmluaXRpYWxfcmFuZ2VfdHEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19EVVBMSUNBVEVfTVBDUF9SRUdJU1RSQVRJT05fUkVRVUVTVF9JRF9DVVJSRU5UX1JBTkdFX1RRKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICh1aW50MzJfdCAqKSAmdGhpcy0+Y3VycmVudF9yYW5nZV90cSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0RVUExJQ0FURV9NUENQX1JFR0lTVFJBVElPTl9SRVFVRVNUX0lEX0lOSVRJQUxfUkFOR0VfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfRFVQTElDQVRFX01QQ1BfUkVHSVNUUkFUSU9OX1JFUVVFU1RfSURfQ1VSUkVOVF9SQU5HRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfS0VZX0VYQ0hBTkdFX0ZBSUxVUkVfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXR1cyA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9FWENIQU5HRV9GQUlMVVJFX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9FWENIQU5HRV9GQUlMVVJFX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfS0VZX0VYQ0hBTkdFX0ZBSUxVUkVfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfS0VZX0VYQ0hBTkdFX0ZBSUxVUkVfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9FWENIQU5HRV9GQUlMVVJFX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmFsYXJtX3N0YXR1cykKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX0xJTktfS0VZX0VYQ0hBTkdFX0ZBSUxVUkVfSURfQUxBUk1fU1RBVFVTOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfTElOS19TUEVFRF9NSVNNQVRDSF9JRF9QUkVWSU9VU19SQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnByZXZpb3VzX3JhdGUgPSBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfVEVOX1RFTjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19MSU5LX1NQRUVEX01JU01BVENIX0lEX0NVUlJFTlRfUkFURSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jdXJyZW50X3JhdGUgPSBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfVEVOX1RFTjsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfTElOS19TUEVFRF9NSVNNQVRDSF9JRF9QUkVWSU9VU19SQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fbGlua19yYXRlX3BhY2sodGhpcy0+cHJldmlvdXNfcmF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfTElOS19TUEVFRF9NSVNNQVRDSF9JRF9DVVJSRU5UX1JBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9saW5rX3JhdGVfcGFjayh0aGlzLT5jdXJyZW50X3JhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19MSU5LX1NQRUVEX01JU01BVENIX0lEX1BSRVZJT1VTX1JBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19MSU5LX1NQRUVEX01JU01BVENIX0lEX0NVUlJFTlRfUkFURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0xJTktfU1BFRURfTUlTTUFUQ0hfSURfUFJFVklPVVNfUkFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2xpbmtfcmF0ZV91bnBhY2soJnRoaXMtPnByZXZpb3VzX3JhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0xJTktfU1BFRURfTUlTTUFUQ0hfSURfQ1VSUkVOVF9SQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fbGlua19yYXRlX3VucGFjaygmdGhpcy0+Y3VycmVudF9yYXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0xJTktfU1BFRURfTUlTTUFUQ0hfSURfUFJFVklPVVNfUkFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19MSU5LX1NQRUVEX01JU01BVENIX0lEX0NVUlJFTlRfUkFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19MSU5LX1NQRUVEX01JU01BVENIX0lEX1BSRVZJT1VTX1JBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5wcmV2aW91c19yYXRlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfUkFURV9URU5fVEVOOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfVEVOX09ORToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19SQVRFX09ORV9PTkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX0xJTktfTElOS19TUEVFRF9NSVNNQVRDSF9JRF9QUkVWSU9VU19SQVRFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0xJTktfU1BFRURfTUlTTUFUQ0hfSURfQ1VSUkVOVF9SQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+Y3VycmVudF9yYXRlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfUkFURV9URU5fVEVOOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfVEVOX09ORToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19SQVRFX09ORV9PTkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX0xJTktfTElOS19TUEVFRF9NSVNNQVRDSF9JRF9DVVJSRU5UX1JBVEU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfTVBDUF9ESVNDT1ZFUkVEX0lEX0xJTktfSU5GTykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5saW5rX2luZm8ubGlua19zdGF0dXMgPSAoYmNtb2x0X2Vwb25fbGlua19zdGF0dXMpIDA7CisgICAgICAgIHRoaXMtPmxpbmtfaW5mby5yYXRlID0gQkNNT0xUX0VQT05fTElOS19SQVRFX1RFTl9URU47CisgICAgICAgIHRoaXMtPmxpbmtfaW5mby5sbGlkID0gKGJjbW9sdF9lcG9uX2xsaWQpIDA7CisgICAgICAgIHRoaXMtPmxpbmtfaW5mby5tcGNwX2Rpc2NvdmVyeV9pbmZvID0gKGJjbW9sdF9tcGNwX2Rpc2NvdmVyeV9pbmZvKSAwOworICAgICAgICB0aGlzLT5saW5rX2luZm8ub251X2xhc2VyX29uX3RpbWVfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSAwOworICAgICAgICB0aGlzLT5saW5rX2luZm8ub251X2xhc2VyX29mZl90aW1lX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICAgICAgdGhpcy0+bGlua19pbmZvLnBlbmRpbmdfZ3JhbnRzID0gMDsKKyAgICAgICAgdGhpcy0+bGlua19pbmZvLnJhbmdlX3ZhbHVlX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICAgICAgdGhpcy0+bGlua19pbmZvLnR1bm5lbF9pZCA9IChiY21vbHRfZXBvbl90dW5uZWxfaWQpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19NUENQX0RJU0NPVkVSRURfSURfTElOS19JTkZPKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fbGlua19pbmZvX3BhY2soJnRoaXMtPmxpbmtfaW5mbywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19NUENQX0RJU0NPVkVSRURfSURfTElOS19JTkZPKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI0OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19NUENQX0RJU0NPVkVSRURfSURfTElOS19JTkZPKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fbGlua19pbmZvX3VucGFjaygmdGhpcy0+bGlua19pbmZvLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19NUENQX0RJU0NPVkVSRURfSURfTElOS19JTkZPKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMjQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19NUENQX0RJU0NPVkVSRURfSURfTElOS19JTkZPKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fbGlua19pbmZvX2JvdW5kc19jaGVjaygmdGhpcy0+bGlua19pbmZvKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fTElOS19NUENQX0RJU0NPVkVSRURfSURfTElOS19JTkZPOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19NUENQX1JFUE9SVF9USU1FT1VUX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hbGFybV9zdGF0dXMgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfTVBDUF9SRVBPUlRfVElNRU9VVF9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfTVBDUF9SRVBPUlRfVElNRU9VVF9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19NUENQX1JFUE9SVF9USU1FT1VUX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfTVBDUF9SRVBPUlRfVElNRU9VVF9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfTVBDUF9SRVBPUlRfVElNRU9VVF9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5hbGFybV9zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9MSU5LX01QQ1BfUkVQT1JUX1RJTUVPVVRfSURfQUxBUk1fU1RBVFVTOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX09BTV9LRUVQQUxJVkVfVElNRU9VVF9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdHVzID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19PQU1fS0VFUEFMSVZFX1RJTUVPVVRfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19PQU1fS0VFUEFMSVZFX1RJTUVPVVRfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX09BTV9LRUVQQUxJVkVfVElNRU9VVF9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfT0FNX0tFRVBBTElWRV9USU1FT1VUX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19PQU1fS0VFUEFMSVZFX1RJTUVPVVRfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+YWxhcm1fc3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fTElOS19PQU1fS0VFUEFMSVZFX1RJTUVPVVRfSURfQUxBUk1fU1RBVFVTOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1BSRVBST1ZJU0lPTkVEX0xJTktfQ1JFQVRFRF9JRF9MSU5LX0lORk8pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bGlua19pbmZvLmxpbmtfc3RhdHVzID0gKGJjbW9sdF9lcG9uX2xpbmtfc3RhdHVzKSAwOworICAgICAgICB0aGlzLT5saW5rX2luZm8ucmF0ZSA9IEJDTU9MVF9FUE9OX0xJTktfUkFURV9URU5fVEVOOworICAgICAgICB0aGlzLT5saW5rX2luZm8ubGxpZCA9IChiY21vbHRfZXBvbl9sbGlkKSAwOworICAgICAgICB0aGlzLT5saW5rX2luZm8ubXBjcF9kaXNjb3ZlcnlfaW5mbyA9IChiY21vbHRfbXBjcF9kaXNjb3ZlcnlfaW5mbykgMDsKKyAgICAgICAgdGhpcy0+bGlua19pbmZvLm9udV9sYXNlcl9vbl90aW1lX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICAgICAgdGhpcy0+bGlua19pbmZvLm9udV9sYXNlcl9vZmZfdGltZV90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIDA7CisgICAgICAgIHRoaXMtPmxpbmtfaW5mby5wZW5kaW5nX2dyYW50cyA9IDA7CisgICAgICAgIHRoaXMtPmxpbmtfaW5mby5yYW5nZV92YWx1ZV90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIDA7CisgICAgICAgIHRoaXMtPmxpbmtfaW5mby50dW5uZWxfaWQgPSAoYmNtb2x0X2Vwb25fdHVubmVsX2lkKSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfUFJFUFJPVklTSU9ORURfTElOS19DUkVBVEVEX0lEX0xJTktfSU5GTykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2xpbmtfaW5mb19wYWNrKCZ0aGlzLT5saW5rX2luZm8sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfUFJFUFJPVklTSU9ORURfTElOS19DUkVBVEVEX0lEX0xJTktfSU5GTykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyNDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfUFJFUFJPVklTSU9ORURfTElOS19DUkVBVEVEX0lEX0xJTktfSU5GTykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2xpbmtfaW5mb191bnBhY2soJnRoaXMtPmxpbmtfaW5mbywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfUFJFUFJPVklTSU9ORURfTElOS19DUkVBVEVEX0lEX0xJTktfSU5GTykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDI0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfUFJFUFJPVklTSU9ORURfTElOS19DUkVBVEVEX0lEX0xJTktfSU5GTykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2xpbmtfaW5mb19ib3VuZHNfY2hlY2soJnRoaXMtPmxpbmtfaW5mbykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX0xJTktfUFJFUFJPVklTSU9ORURfTElOS19DUkVBVEVEX0lEX0xJTktfSU5GTzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19QUk9URUNUSU9OX1NXSVRDSF9PQ0NVUlJFRF9JRF9QUk9URUNUSU9OX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wcm90ZWN0aW9uX3N0YXR1cyA9IEJDTU9MVF9FUE9OX1BST1RFQ1RJT05fU1RBVEVfVU5QUk9URUNURUQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfUFJPVEVDVElPTl9TV0lUQ0hfT0NDVVJSRURfSURfUkFOR0VfVkFMVUVfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmFuZ2VfdmFsdWVfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1BST1RFQ1RJT05fU1dJVENIX09DQ1VSUkVEX0lEX1BST1RFQ1RJT05fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zdGF0ZV9wYWNrKHRoaXMtPnByb3RlY3Rpb25fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19QUk9URUNUSU9OX1NXSVRDSF9PQ0NVUlJFRF9JRF9SQU5HRV9WQUxVRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzLT5yYW5nZV92YWx1ZV90cSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1BST1RFQ1RJT05fU1dJVENIX09DQ1VSUkVEX0lEX1BST1RFQ1RJT05fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfUFJPVEVDVElPTl9TV0lUQ0hfT0NDVVJSRURfSURfUkFOR0VfVkFMVUVfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1BST1RFQ1RJT05fU1dJVENIX09DQ1VSUkVEX0lEX1BST1RFQ1RJT05fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zdGF0ZV91bnBhY2soJnRoaXMtPnByb3RlY3Rpb25fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19QUk9URUNUSU9OX1NXSVRDSF9PQ0NVUlJFRF9JRF9SQU5HRV9WQUxVRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPnJhbmdlX3ZhbHVlX3RxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfUFJPVEVDVElPTl9TV0lUQ0hfT0NDVVJSRURfSURfUFJPVEVDVElPTl9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfUFJPVEVDVElPTl9TV0lUQ0hfT0NDVVJSRURfSURfUkFOR0VfVkFMVUVfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfUFJPVEVDVElPTl9TV0lUQ0hfT0NDVVJSRURfSURfUFJPVEVDVElPTl9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5wcm90ZWN0aW9uX3N0YXR1cykKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QUk9URUNUSU9OX1NUQVRFX1VOUFJPVEVDVEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QUk9URUNUSU9OX1NUQVRFX1BST1RFQ1RFRF9TVEFOREJZOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QUk9URUNUSU9OX1NUQVRFX1BST1RFQ1RFRF9XT1JLSU5HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9MSU5LX1BST1RFQ1RJT05fU1dJVENIX09DQ1VSUkVEX0lEX1BST1RFQ1RJT05fU1RBVFVTOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfUkFOR0VfVkFMVUVfQ0hBTkdFRF9JRF9SQU5HRV9WQUxVRV9UUSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yYW5nZV92YWx1ZV90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1JBTkdFX1ZBTFVFX0NIQU5HRURfSURfUkFOR0VfVkFMVUVfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcy0+cmFuZ2VfdmFsdWVfdHEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfUkFOR0VfVkFMVUVfQ0hBTkdFRF9JRF9SQU5HRV9WQUxVRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1JBTkdFX1ZBTFVFX0NIQU5HRURfSURfUkFOR0VfVkFMVUVfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgKHVpbnQzMl90ICopICZ0aGlzLT5yYW5nZV92YWx1ZV90cSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfUkFOR0VfVkFMVUVfQ0hBTkdFRF9JRF9SQU5HRV9WQUxVRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0RBVEFfQllURVM7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZF9wYWNrKHRoaXMtPnN0YXQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9saW5rX3N0YXRfaWRfdW5wYWNrKCZ0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0KQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9EQVRBX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfREFUQV9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfNjQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfNjVfMTI3OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzEyOF8yNTU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfMjU2XzUxMToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU181MTJfMTAyMzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18xMDI0XzE1MTg6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfMTUxOV8yMDQ3OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzIwNDhfNDA5NToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU180MDk2XzkyMTY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfOTIxN18xNjM4MzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX09BTV9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX09BTV9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9NUENQX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0JST0FEQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX01VTFRJQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9SRVBPUlRfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRkNTX0VSUk9SOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfT1ZFUlNJWkVfRVJST1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9SVU5UX0VSUk9SOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfTElORV9DT0RFX0VSUk9SOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfTElORV9DT0RFX0VSUk9SX01BWDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0RBVEFfQllURVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9EQVRBX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU182NDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU182NV8xMjc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMTI4XzI1NToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18yNTZfNTExOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzUxMl8xMDIzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzEwMjRfMTUxODoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18xNTE5XzIwNDc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMjA0OF80MDk1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzQwOTZfOTIxNjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU185MjE3XzE2MzgzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfT0FNX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfT0FNX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX01QQ1BfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfQlJPQURDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfTVVMVElDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0dBVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXQgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfREFUQV9CWVRFUzsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkX3BhY2sodGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZF91bnBhY2soJnRoaXMtPnN0YXQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnN0YXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0RBVEFfQllURVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9EQVRBX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU182NDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU182NV8xMjc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfMTI4XzI1NToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18yNTZfNTExOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzUxMl8xMDIzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzEwMjRfMTUxODoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18xNTE5XzIwNDc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfMjA0OF80MDk1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzQwOTZfOTIxNjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU185MjE3XzE2MzgzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfT0FNX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfT0FNX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX01QQ1BfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfQlJPQURDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfTVVMVElDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX1JFUE9SVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GQ1NfRVJST1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9PVkVSU0laRV9FUlJPUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX1JVTlRfRVJST1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9MSU5FX0NPREVfRVJST1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9MSU5FX0NPREVfRVJST1JfTUFYOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfREFUQV9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0RBVEFfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzY0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzY1XzEyNzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18xMjhfMjU1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzI1Nl81MTE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfNTEyXzEwMjM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMTAyNF8xNTE4OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzE1MTlfMjA0NzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18yMDQ4XzQwOTU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfNDA5Nl85MjE2OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzkyMTdfMTYzODM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9PQU1fQllURVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9PQU1fRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfTVBDUF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9CUk9BRENBU1RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9NVUxUSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfR0FURVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfRFVQTElDQVRFX01QQ1BfUkVHSVNUUkFUSU9OX1JFUVVFU1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3QgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9FTkNSWVBUSU9OX0VOQUJMRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZW5jcnlwdGlvbl9lbmFibGVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0ZBSUxVUkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+a2V5X2V4Y2hhbmdlX2ZhaWx1cmUgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfU1RBUlRFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5rZXlfZXhjaGFuZ2Vfc3RhcnRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9TVE9QUEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmtleV9leGNoYW5nZV9zdG9wcGVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTElOS19ERUxFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmxpbmtfZGVsZXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0xJTktfU1BFRURfTUlTTUFUQ0gpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bGlua19zcGVlZF9taXNtYXRjaCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX01QQ1BfREVSRUdJU1RFUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm1wY3BfZGVyZWdpc3RlcmVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTVBDUF9ESVNDT1ZFUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm1wY3BfZGlzY292ZXJlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX01QQ1BfUkVHX0FDS19USU1FT1VUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm1wY3BfcmVnX2Fja190aW1lb3V0ID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTVBDUF9SRVBPUlRfVElNRU9VVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5tcGNwX3JlcG9ydF90aW1lb3V0ID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfT0FNX0tFRVBBTElWRV9USU1FT1VUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9hbV9rZWVwYWxpdmVfdGltZW91dCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX09BTV9LRUVQQUxJVkVfVElNRVJfU1RBUlRFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0ZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9PQU1fS0VFUEFMSVZFX1RJTUVSX1NUT1BQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfUFJFUFJPVklTSU9ORURfTElOS19DUkVBVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENIX09DQ1VSUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnByb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfUkFOR0VfVkFMVUVfQ0hBTkdFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yYW5nZV92YWx1ZV9jaGFuZ2VkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfUkVSQU5HRV9GQUlMVVJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJlcmFuZ2VfZmFpbHVyZSA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0X2FsYXJtX2NsZWFyZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0X2FsYXJtX3JhaXNlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX1NUQVRJQ19SRUdJU1RSQVRJT05fRE9ORSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0aWNfcmVnaXN0cmF0aW9uX2RvbmUgPSBCQ01PU19GQUxTRTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9EVVBMSUNBVEVfTVBDUF9SRUdJU1RSQVRJT05fUkVRVUVTVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmR1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfRU5DUllQVElPTl9FTkFCTEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+ZW5jcnlwdGlvbl9lbmFibGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0ZBSUxVUkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5rZXlfZXhjaGFuZ2VfZmFpbHVyZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9TVEFSVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+a2V5X2V4Y2hhbmdlX3N0YXJ0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfU1RPUFBFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmtleV9leGNoYW5nZV9zdG9wcGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTElOS19ERUxFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+bGlua19kZWxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTElOS19TUEVFRF9NSVNNQVRDSCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmxpbmtfc3BlZWRfbWlzbWF0Y2gpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9NUENQX0RFUkVHSVNURVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPm1wY3BfZGVyZWdpc3RlcmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTVBDUF9ESVNDT1ZFUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+bXBjcF9kaXNjb3ZlcmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTVBDUF9SRUdfQUNLX1RJTUVPVVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5tcGNwX3JlZ19hY2tfdGltZW91dCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX01QQ1BfUkVQT1JUX1RJTUVPVVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5tcGNwX3JlcG9ydF90aW1lb3V0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfT0FNX0tFRVBBTElWRV9USU1FT1VUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+b2FtX2tlZXBhbGl2ZV90aW1lb3V0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfT0FNX0tFRVBBTElWRV9USU1FUl9TVEFSVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+b2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfT0FNX0tFRVBBTElWRV9USU1FUl9TVE9QUEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+b2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfUFJFUFJPVklTSU9ORURfTElOS19DUkVBVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+cHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hfT0NDVVJSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX1JBTkdFX1ZBTFVFX0NIQU5HRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5yYW5nZV92YWx1ZV9jaGFuZ2VkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfUkVSQU5HRV9GQUlMVVJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+cmVyYW5nZV9mYWlsdXJlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5zdGF0X2FsYXJtX3JhaXNlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX1NUQVRJQ19SRUdJU1RSQVRJT05fRE9ORSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnN0YXRpY19yZWdpc3RyYXRpb25fZG9uZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0RVUExJQ0FURV9NUENQX1JFR0lTVFJBVElPTl9SRVFVRVNUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfRU5DUllQVElPTl9FTkFCTEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0ZBSUxVUkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfU1RBUlRFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9TVE9QUEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTElOS19ERUxFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTElOS19TUEVFRF9NSVNNQVRDSCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX01QQ1BfREVSRUdJU1RFUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTVBDUF9ESVNDT1ZFUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTVBDUF9SRUdfQUNLX1RJTUVPVVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9NUENQX1JFUE9SVF9USU1FT1VUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfT0FNX0tFRVBBTElWRV9USU1FT1VUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfT0FNX0tFRVBBTElWRV9USU1FUl9TVEFSVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfT0FNX0tFRVBBTElWRV9USU1FUl9TVE9QUEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfUFJFUFJPVklTSU9ORURfTElOS19DUkVBVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hfT0NDVVJSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9SQU5HRV9WQUxVRV9DSEFOR0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfUkVSQU5HRV9GQUlMVVJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9TVEFUSUNfUkVHSVNUUkFUSU9OX0RPTkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0RVUExJQ0FURV9NUENQX1JFR0lTVFJBVElPTl9SRVFVRVNUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+ZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3QpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9FTkNSWVBUSU9OX0VOQUJMRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5lbmNyeXB0aW9uX2VuYWJsZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfRkFJTFVSRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmtleV9leGNoYW5nZV9mYWlsdXJlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX1NUQVJURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5rZXlfZXhjaGFuZ2Vfc3RhcnRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9TVE9QUEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+a2V5X2V4Y2hhbmdlX3N0b3BwZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9MSU5LX0RFTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5saW5rX2RlbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9MSU5LX1NQRUVEX01JU01BVENIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+bGlua19zcGVlZF9taXNtYXRjaCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX01QQ1BfREVSRUdJU1RFUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+bXBjcF9kZXJlZ2lzdGVyZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9NUENQX0RJU0NPVkVSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5tcGNwX2Rpc2NvdmVyZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9NUENQX1JFR19BQ0tfVElNRU9VVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPm1wY3BfcmVnX2Fja190aW1lb3V0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTVBDUF9SRVBPUlRfVElNRU9VVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPm1wY3BfcmVwb3J0X3RpbWVvdXQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9PQU1fS0VFUEFMSVZFX1RJTUVPVVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5vYW1fa2VlcGFsaXZlX3RpbWVvdXQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9PQU1fS0VFUEFMSVZFX1RJTUVSX1NUQVJURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9PQU1fS0VFUEFMSVZFX1RJTUVSX1NUT1BQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BwZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9QUkVQUk9WSVNJT05FRF9MSU5LX0NSRUFURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSF9PQ0NVUlJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnByb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfUkFOR0VfVkFMVUVfQ0hBTkdFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnJhbmdlX3ZhbHVlX2NoYW5nZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9SRVJBTkdFX0ZBSUxVUkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5yZXJhbmdlX2ZhaWx1cmUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zdGF0X2FsYXJtX2NsZWFyZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfU1RBVElDX1JFR0lTVFJBVElPTl9ET05FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfRFVQTElDQVRFX01QQ1BfUkVHSVNUUkFUSU9OX1JFUVVFU1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfRU5DUllQVElPTl9FTkFCTEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9GQUlMVVJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9TVEFSVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9TVE9QUEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0xJTktfREVMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9MSU5LX1NQRUVEX01JU01BVENIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX01QQ1BfREVSRUdJU1RFUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX01QQ1BfRElTQ09WRVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9NUENQX1JFR19BQ0tfVElNRU9VVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9NUENQX1JFUE9SVF9USU1FT1VUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX09BTV9LRUVQQUxJVkVfVElNRU9VVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9PQU1fS0VFUEFMSVZFX1RJTUVSX1NUQVJURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfT0FNX0tFRVBBTElWRV9USU1FUl9TVE9QUEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX1BSRVBST1ZJU0lPTkVEX0xJTktfQ1JFQVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSF9PQ0NVUlJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9SQU5HRV9WQUxVRV9DSEFOR0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX1JFUkFOR0VfRkFJTFVSRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfU1RBVElDX1JFR0lTVFJBVElPTl9ET05FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9FWENIQU5HRV9TVEFSVF9JRF9QRVJJT0QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cGVyaW9kID0gMTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9FWENIQU5HRV9TVEFSVF9JRF9QRVJJT0QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnBlcmlvZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfS0VZX0VYQ0hBTkdFX1NUQVJUX0lEX1BFUklPRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19LRVlfRVhDSEFOR0VfU1RBUlRfSURfUEVSSU9EKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5wZXJpb2QpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfS0VZX0VYQ0hBTkdFX1NUQVJUX0lEX1BFUklPRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19LRVlfRVhDSEFOR0VfU1RBUlRfSURfUEVSSU9EKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5wZXJpb2QgPCAxKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9MSU5LX0tFWV9FWENIQU5HRV9TVEFSVF9JRF9QRVJJT0Q7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX09BTV9LRUVQQUxJVkVfVElNRVJfU1RBUlRfSURfU0VORF9QRVJJT0QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c2VuZF9wZXJpb2QgPSAxOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19PQU1fS0VFUEFMSVZFX1RJTUVSX1NUQVJUX0lEX1NFTkRfUEVSSU9EKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5zZW5kX3BlcmlvZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19PQU1fS0VFUEFMSVZFX1RJTUVSX1NUQVJUX0lEX1NFTkRfUEVSSU9EKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfT0FNX0tFRVBBTElWRV9USU1FUl9TVEFSVF9JRF9TRU5EX1BFUklPRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+c2VuZF9wZXJpb2QpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX09BTV9LRUVQQUxJVkVfVElNRVJfU1RBUlRfSURfU0VORF9QRVJJT0QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfT0FNX0tFRVBBTElWRV9USU1FUl9TVEFSVF9JRF9TRU5EX1BFUklPRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+c2VuZF9wZXJpb2QgPCAxKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9MSU5LX09BTV9LRUVQQUxJVkVfVElNRVJfU1RBUlRfSURfU0VORF9QRVJJT0Q7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRJQ19SRUdJU1RSQVRJT05fSURfTEFTRVJPTl9USU1FX1RRKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmxhc2Vyb25fdGltZV90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVElDX1JFR0lTVFJBVElPTl9JRF9MQVNFUk9GRl9USU1FX1RRKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmxhc2Vyb2ZmX3RpbWVfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRJQ19SRUdJU1RSQVRJT05fSURfUkFOR0VfVkFMVUVfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmFuZ2VfdmFsdWVfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRJQ19SRUdJU1RSQVRJT05fSURfUEVORElOR19HUkFOVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cGVuZGluZ19ncmFudHMgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUSUNfUkVHSVNUUkFUSU9OX0lEX0xBU0VST05fVElNRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzLT5sYXNlcm9uX3RpbWVfdHEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUSUNfUkVHSVNUUkFUSU9OX0lEX0xBU0VST0ZGX1RJTUVfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcy0+bGFzZXJvZmZfdGltZV90cSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRJQ19SRUdJU1RSQVRJT05fSURfUkFOR0VfVkFMVUVfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcy0+cmFuZ2VfdmFsdWVfdHEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUSUNfUkVHSVNUUkFUSU9OX0lEX1BFTkRJTkdfR1JBTlRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnBlbmRpbmdfZ3JhbnRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRJQ19SRUdJU1RSQVRJT05fSURfTEFTRVJPTl9USU1FX1RRKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVElDX1JFR0lTVFJBVElPTl9JRF9MQVNFUk9GRl9USU1FX1RRKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVElDX1JFR0lTVFJBVElPTl9JRF9SQU5HRV9WQUxVRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRJQ19SRUdJU1RSQVRJT05fSURfUEVORElOR19HUkFOVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUSUNfUkVHSVNUUkFUSU9OX0lEX0xBU0VST05fVElNRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPmxhc2Vyb25fdGltZV90cSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRJQ19SRUdJU1RSQVRJT05fSURfTEFTRVJPRkZfVElNRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPmxhc2Vyb2ZmX3RpbWVfdHEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUSUNfUkVHSVNUUkFUSU9OX0lEX1JBTkdFX1ZBTFVFX1RRKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICh1aW50MzJfdCAqKSAmdGhpcy0+cmFuZ2VfdmFsdWVfdHEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUSUNfUkVHSVNUUkFUSU9OX0lEX1BFTkRJTkdfR1JBTlRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnBlbmRpbmdfZ3JhbnRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUSUNfUkVHSVNUUkFUSU9OX0lEX0xBU0VST05fVElNRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUSUNfUkVHSVNUUkFUSU9OX0lEX0xBU0VST0ZGX1RJTUVfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfU1RBVElDX1JFR0lTVFJBVElPTl9JRF9SQU5HRV9WQUxVRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19TVEFUSUNfUkVHSVNUUkFUSU9OX0lEX1BFTkRJTkdfR1JBTlRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25faWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0lOSkVDVF9GUkFNRV9JRF9GUkFNRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmFtZS5mcmFtZV9vY3RldHMubGVuID0gMDsKKyAgICAgICAgdGhpcy0+ZnJhbWUuZnJhbWVfb2N0ZXRzLnZhbCA9IE5VTEw7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19JTkpFQ1RfRlJBTUVfSURfRlJBTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXRoZXJuZXRfZnJhbWVfdW5tYXNrZWRfcGFjaygmdGhpcy0+ZnJhbWUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfSU5KRUNUX0ZSQU1FX0lEX0ZSQU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF9ldGhlcm5ldF9mcmFtZV91bm1hc2tlZF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+ZnJhbWUpOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19JTkpFQ1RfRlJBTUVfSURfRlJBTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXRoZXJuZXRfZnJhbWVfdW5tYXNrZWRfdW5wYWNrKCZ0aGlzLT5mcmFtZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfSU5KRUNUX0ZSQU1FX0lEX0ZSQU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2V0aGVybmV0X2ZyYW1lX3VubWFza2VkX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19JTkpFQ1RfRlJBTUVfSURfRlJBTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXRoZXJuZXRfZnJhbWVfdW5tYXNrZWRfYm91bmRzX2NoZWNrKCZ0aGlzLT5mcmFtZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX0xJTktfSU5KRUNUX0ZSQU1FX0lEX0ZSQU1FOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0ZSQU1FX0NBUFRVUkVEX0lEX0ZSQU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lLmxlbiA9IDA7CisgICAgICAgIHRoaXMtPmZyYW1lLnZhbCA9IE5VTEw7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfRlJBTUVfQ0FQVFVSRURfSURfRlJBTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfcGFjaygmdGhpcy0+ZnJhbWUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0ZSQU1FX0NBUFRVUkVEX0lEX0ZSQU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF91OF9saXN0X3UzMl9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+ZnJhbWUpOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfRlJBTUVfQ0FQVFVSRURfSURfRlJBTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfdW5wYWNrKCZ0aGlzLT5mcmFtZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19GUkFNRV9DQVBUVVJFRF9JRF9GUkFNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF91OF9saXN0X3UzMl9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfRlJBTUVfQ0FQVFVSRURfSURfRlJBTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfYm91bmRzX2NoZWNrKCZ0aGlzLT5mcmFtZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX0xJTktfRlJBTUVfQ0FQVFVSRURfSURfRlJBTUU7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbmlfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX25pX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0tFWV9JRF9FUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9rZXlfcGFjayhjb25zdCBiY21vbHRfZXBvbl9uaV9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0tFWV9JRF9FUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPmVwb25fbmkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX25pX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9uaV9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfS0VZX0lEX0VQT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2tleV91bnBhY2soYmNtb2x0X2Vwb25fbmlfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9LRVlfSURfRVBPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPmVwb25fbmkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfS0VZX0lEX0VQT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbmlfa2V5X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTUFDX0FERFJFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bWFjX2FkZHJlc3MudThbMF0gPSAweDAwMDA7CisgICAgICAgIHRoaXMtPm1hY19hZGRyZXNzLnU4WzFdID0gMHgwMDBEOworICAgICAgICB0aGlzLT5tYWNfYWRkcmVzcy51OFsyXSA9IDB4MDBCNjsKKyAgICAgICAgdGhpcy0+bWFjX2FkZHJlc3MudThbM10gPSAweDAwMDA7CisgICAgICAgIHRoaXMtPm1hY19hZGRyZXNzLnU4WzRdID0gMHgwMDAwOworICAgICAgICB0aGlzLT5tYWNfYWRkcmVzcy51OFs1XSA9IDB4MDAwMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0VQT05fTklfRU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZXBvbl9uaV9lbiA9IEJDTU9MVF9FUE9OX05JX0VOX1NUQVRFX0RJU0FCTEVEOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfUkVHSVNUUkFUSU9OX0JFSEFWSU9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJlZ2lzdHJhdGlvbl9iZWhhdmlvciA9IEJDTU9MVF9SRUdJU1RSQVRJT05fQkVIQVZJT1JfQVVUT01BVElDOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTVRVXzFHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm10dV8xZyA9IDE1MzY7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9NVFVfMTBHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm10dV8xMGcgPSAxNTM2OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTUlOSU1VTV9GSUJFUl9MRU5HVEgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bWluaW11bV9maWJlcl9sZW5ndGggPSAoYmNtb2x0X21ldGVycykgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01BWElNVU1fRklCRVJfTEVOR1RIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm1heGltdW1fZmliZXJfbGVuZ3RoID0gKGJjbW9sdF9tZXRlcnMpIDIwMDAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfR1JBTlRfU1BBQ0lOR19UUSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5ncmFudF9zcGFjaW5nX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMzI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9FUE9OX0xPR0lDQUxfTElOS19PUFRJT05TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmVwb25fbG9naWNhbF9saW5rX29wdGlvbnMucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlID0gQkNNT0xUX01QQ1BfR0FURV9NT0RFX1RFS05PVlVTOworICAgICAgICB0aGlzLT5lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUudS50ZWtub3Z1cy5yZWdfYWNrX3RpbWVvdXRfbXMgPSAxMDA7CisgICAgICAgIHRoaXMtPmVwb25fbG9naWNhbF9saW5rX29wdGlvbnMucmVwb3J0aW5nX21vZGUgPSBCQ01PTFRfRVBPTl9EQkFfUkVQT1JUSU5HX01PREVfU0lFUE9OX0E7CisgICAgICAgIHRoaXMtPmVwb25fbG9naWNhbF9saW5rX29wdGlvbnMubWF4X2xpbmtzID0gNTEyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTVBDUF9ESVNDT1ZFUllfUEVSSU9EX01TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm1wY3BfZGlzY292ZXJ5X3BlcmlvZF9tcyA9IDEwMDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BTEFSTV9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hbGFybV9zdGF0ZS5ub19yZXBvcnRzID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BTExfTElOS1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWxsX2xpbmtzLmxlbiA9IDA7CisgICAgICAgIHRoaXMtPmFsbF9saW5rcy52YWwgPSBOVUxMOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRU5DUllQVElPTl9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZW5jcnlwdGlvbl9jZmcuZG93bnN0cmVhbV9lbmNyeXB0aW9uX21vZGUgPSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX01PREVfTk9fRU5DUllQVElPTjsKKyAgICAgICAgdGhpcy0+ZW5jcnlwdGlvbl9jZmcudXBzdHJlYW1fZW5jcnlwdGlvbl9tb2RlID0gQkNNT0xUX0VQT05fRU5DUllQVElPTl9NT0RFX05PX0VOQ1JZUFRJT047CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLnByb3RlY3Rpb25fdHlwZSA9IEJDTU9MVF9FUE9OX1BST1RFQ1RJT05fU1dJVENISU5HX1RZUEVfTk9fUFJPVEVDVElPTl9TV1RJQ0hJTkc7CisgICAgICAgIHRoaXMtPnByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5wcm90ZWN0aW9uX3N3aXRjaGluZ19vcHRpb25zID0gKGJjbW9sdF9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZXRlY3Rpb25fb3B0aW9ucykgMDsKKyAgICAgICAgdGhpcy0+cHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLnJlcmFuZ2Vfb3B0aW9ucyA9IEJDTU9MVF9FUE9OX1BST1RFQ1RJT05fU1dJVENISU5HX1JFUkFOR0lOR19PUFRJT05TX1JFUkFOR0VfTk9ORTsKKyAgICAgICAgdGhpcy0+cHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLnJlcmFuZ2VfYXR0ZW1wdHMgPSAwOworICAgICAgICB0aGlzLT5wcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcucmVyYW5nZV9pbnRlcnZhbCA9IDA7CisgICAgICAgIHRoaXMtPnByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5zeW5jX2dhdGVfZHVyYXRpb24gPSAwOworICAgICAgICB0aGlzLT5wcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcuZ3Bpb19pbnB1dCA9IEJDTU9MVF9HUElPX1BJTl9VTkNPTkZJR1VSRUQ7CisgICAgICAgIHRoaXMtPnByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5ncGlvX2lucHV0X3BvbGFyaXR5ID0gQkNNT0xUX0dQSU9fUE9MQVJJVFlfQUNUSVZFX0hJR0g7CisgICAgICAgIHRoaXMtPnByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5ncGlvX291dHB1dCA9IEJDTU9MVF9HUElPX1BJTl9VTkNPTkZJR1VSRUQ7CisgICAgICAgIHRoaXMtPnByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5ncGlvX291dHB1dF9wb2xhcml0eSA9IEJDTU9MVF9HUElPX1BPTEFSSVRZX0FDVElWRV9ISUdIOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQ0xPQ0tfVFJBTlNQT1JUX0NGRykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jbG9ja190cmFuc3BvcnRfY2ZnLmVwb25fY2xvY2tfdHJhbnNwb3J0X21vZGUgPSBCQ01PTFRfRVBPTl9DTE9DS19UUkFOU1BPUlRfTU9ERV9IT1NUX0RSSVZFTjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0RST1BET1dOX1dFSUdIVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgbWVtc2V0KHRoaXMtPmRyb3Bkb3duX3dlaWdodHMuYXJyLCAwLCBzaXplb2YodGhpcy0+ZHJvcGRvd25fd2VpZ2h0cy5hcnIpKTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FQUFJPWElNQVRFX1NPTElDSVRFRF9VU0FHRSkpICE9IDApCisgICAgeworICAgICAgICBtZW1zZXQodGhpcy0+YXBwcm94aW1hdGVfc29saWNpdGVkX3VzYWdlLmFyciwgMCwgc2l6ZW9mKHRoaXMtPmFwcHJveGltYXRlX3NvbGljaXRlZF91c2FnZS5hcnIpKTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FQUFJPWElNQVRFX1RETV9VU0FHRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hcHByb3hpbWF0ZV90ZG1fdXNhZ2UgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTk9fUkVQT1JUU19TT0FLX1RJTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bm9fcmVwb3J0c19zb2FrX3RpbWUgPSAyNTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX1BPTl9BR0dSRUdBVEVfU0hBUEVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBvbl9hZ2dyZWdhdGVfc2hhcGVyLmJhbmR3aWR0aF9rYnBzID0gMDsKKyAgICAgICAgdGhpcy0+cG9uX2FnZ3JlZ2F0ZV9zaGFwZXIubWJzX2tCID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0VTVElNQVRFRF9QT05fTEFURU5DWV9UUSkpICE9IDApCisgICAgeworICAgICAgICBtZW1zZXQodGhpcy0+ZXN0aW1hdGVkX3Bvbl9sYXRlbmN5X3RxLmFyciwgMCwgc2l6ZW9mKHRoaXMtPmVzdGltYXRlZF9wb25fbGF0ZW5jeV90cS5hcnIpKTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX09OVV9VUEdSQURFX1BBUkFNUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vbnVfdXBncmFkZV9wYXJhbXMub2FtX2V4dGVuc2lvbl90eXBlID0gQkNNT0xUX0VQT05fT0FNX0VYVEVOU0lPTl9UWVBFX0RQT0U7CisgICAgICAgIHRoaXMtPm9udV91cGdyYWRlX3BhcmFtcy51LmRwb2UucmVzcG9uc2VfdGltZW91dF9tcyA9IDEwMDA7CisgICAgICAgIHRoaXMtPm9udV91cGdyYWRlX3BhcmFtcy51LmRwb2UuYmxvY2tfc2l6ZSA9IDYwOworICAgICAgICB0aGlzLT5vbnVfdXBncmFkZV9wYXJhbXMudS5kcG9lLmZpbmFsX2Fja19yZXNwb25zZV90aW1lb3V0ID0gMTU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BVVRPX1JPR1VFX0RFVEVDVF8xMEdfRU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YXV0b19yb2d1ZV9kZXRlY3RfMTBnX2VuID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BVVRPX1JPR1VFX0RFVEVDVF8xR19FTikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hdXRvX3JvZ3VlX2RldGVjdF8xZ19lbiA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQVVUT19ST0dVRV9ERVRFQ1RfMTBHX1RIUkVTSE9MRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hdXRvX3JvZ3VlX2RldGVjdF8xMGdfdGhyZXNob2xkID0gMTI4OworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01BQ19BRERSRVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPm1hY19hZGRyZXNzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9FUE9OX05JX0VOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fbmlfZW5fc3RhdGVfcGFjayh0aGlzLT5lcG9uX25pX2VuLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX1JFR0lTVFJBVElPTl9CRUhBVklPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZWdpc3RyYXRpb25fYmVoYXZpb3JfcGFjayh0aGlzLT5yZWdpc3RyYXRpb25fYmVoYXZpb3IsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTVRVXzFHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5tdHVfMWcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01UVV8xMEcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPm10dV8xMGcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01JTklNVU1fRklCRVJfTEVOR1RIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMtPm1pbmltdW1fZmliZXJfbGVuZ3RoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9NQVhJTVVNX0ZJQkVSX0xFTkdUSCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzLT5tYXhpbXVtX2ZpYmVyX2xlbmd0aCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfR1JBTlRfU1BBQ0lOR19UUSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzLT5ncmFudF9zcGFjaW5nX3RxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9FUE9OX0xPR0lDQUxfTElOS19PUFRJT05TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fbG9naWNhbF9saW5rX29wdGlvbnNfcGFjaygmdGhpcy0+ZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9NUENQX0RJU0NPVkVSWV9QRVJJT0RfTVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPm1wY3BfZGlzY292ZXJ5X3BlcmlvZF9tcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQUxBUk1fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9uaV9hbGFybV9zdGF0ZV9wYWNrKCZ0aGlzLT5hbGFybV9zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BTExfTElOS1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9tYXhfMjA0OF9wYWNrKCZ0aGlzLT5hbGxfbGlua3MsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRU5DUllQVElPTl9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9uaV9lbmNyeXB0aW9uX2NmZ19wYWNrKCZ0aGlzLT5lbmNyeXB0aW9uX2NmZywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19jb25maWd1cmF0aW9uX3BhY2soJnRoaXMtPnByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9DTE9DS19UUkFOU1BPUlRfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X2NvbmZpZ3VyYXRpb25fcGFjaygmdGhpcy0+Y2xvY2tfdHJhbnNwb3J0X2NmZywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9EUk9QRE9XTl9XRUlHSFRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl91MTZfN19wYWNrKCZ0aGlzLT5kcm9wZG93bl93ZWlnaHRzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FQUFJPWElNQVRFX1NPTElDSVRFRF9VU0FHRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfYm91bmRzXzhfcGFjaygmdGhpcy0+YXBwcm94aW1hdGVfc29saWNpdGVkX3VzYWdlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FQUFJPWElNQVRFX1RETV9VU0FHRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+YXBwcm94aW1hdGVfdGRtX3VzYWdlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9OT19SRVBPUlRTX1NPQUtfVElNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bm9fcmVwb3J0c19zb2FrX3RpbWUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX1BPTl9BR0dSRUdBVEVfU0hBUEVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bvbl9hZ2dyZWdhdGVfc2hhcGVyX3BhY2soJnRoaXMtPnBvbl9hZ2dyZWdhdGVfc2hhcGVyLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0VTVElNQVRFRF9QT05fTEFURU5DWV9UUSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfYm91bmRzXzhfcGFjaygmdGhpcy0+ZXN0aW1hdGVkX3Bvbl9sYXRlbmN5X3RxLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX09OVV9VUEdSQURFX1BBUkFNUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtc19wYWNrKCZ0aGlzLT5vbnVfdXBncmFkZV9wYXJhbXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQVVUT19ST0dVRV9ERVRFQ1RfMTBHX0VOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+YXV0b19yb2d1ZV9kZXRlY3RfMTBnX2VuKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BVVRPX1JPR1VFX0RFVEVDVF8xR19FTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmF1dG9fcm9ndWVfZGV0ZWN0XzFnX2VuKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BVVRPX1JPR1VFX0RFVEVDVF8xMEdfVEhSRVNIT0xEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmF1dG9fcm9ndWVfZGV0ZWN0XzEwZ190aHJlc2hvbGQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9NQUNfQUREUkVTUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA2OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRVBPTl9OSV9FTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfUkVHSVNUUkFUSU9OX0JFSEFWSU9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9NVFVfMUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01UVV8xMEcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01JTklNVU1fRklCRVJfTEVOR1RIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9NQVhJTVVNX0ZJQkVSX0xFTkdUSCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfR1JBTlRfU1BBQ0lOR19UUSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRVBPTl9MT0dJQ0FMX0xJTktfT1BUSU9OUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9uc19nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+ZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucyk7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9NUENQX0RJU0NPVkVSWV9QRVJJT0RfTVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FMQVJNX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BTExfTElOS1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfbWF4XzIwNDhfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmFsbF9saW5rcyk7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9FTkNSWVBUSU9OX0NGRykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDEyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQ0xPQ0tfVFJBTlNQT1JUX0NGRykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRFJPUERPV05fV0VJR0hUUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FQUFJPWElNQVRFX1NPTElDSVRFRF9VU0FHRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA2NDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FQUFJPWElNQVRFX1RETV9VU0FHRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTk9fUkVQT1JUU19TT0FLX1RJTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX1BPTl9BR0dSRUdBVEVfU0hBUEVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9FU1RJTUFURURfUE9OX0xBVEVOQ1lfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNjQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9PTlVfVVBHUkFERV9QQVJBTVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5vbnVfdXBncmFkZV9wYXJhbXMpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQVVUT19ST0dVRV9ERVRFQ1RfMTBHX0VOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BVVRPX1JPR1VFX0RFVEVDVF8xR19FTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQVVUT19ST0dVRV9ERVRFQ1RfMTBHX1RIUkVTSE9MRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTUFDX0FERFJFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+bWFjX2FkZHJlc3MpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0VQT05fTklfRU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9uaV9lbl9zdGF0ZV91bnBhY2soJnRoaXMtPmVwb25fbmlfZW4sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfUkVHSVNUUkFUSU9OX0JFSEFWSU9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3JlZ2lzdHJhdGlvbl9iZWhhdmlvcl91bnBhY2soJnRoaXMtPnJlZ2lzdHJhdGlvbl9iZWhhdmlvciwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9NVFVfMUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPm10dV8xZykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTVRVXzEwRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bXR1XzEwZykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTUlOSU1VTV9GSUJFUl9MRU5HVEgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgKHVpbnQzMl90ICopICZ0aGlzLT5taW5pbXVtX2ZpYmVyX2xlbmd0aCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTUFYSU1VTV9GSUJFUl9MRU5HVEgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgKHVpbnQzMl90ICopICZ0aGlzLT5tYXhpbXVtX2ZpYmVyX2xlbmd0aCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfR1JBTlRfU1BBQ0lOR19UUSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPmdyYW50X3NwYWNpbmdfdHEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0VQT05fTE9HSUNBTF9MSU5LX09QVElPTlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9uc191bnBhY2soJnRoaXMtPmVwb25fbG9naWNhbF9saW5rX29wdGlvbnMsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9NUENQX0RJU0NPVkVSWV9QRVJJT0RfTVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPm1wY3BfZGlzY292ZXJ5X3BlcmlvZF9tcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQUxBUk1fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9uaV9hbGFybV9zdGF0ZV91bnBhY2soJnRoaXMtPmFsYXJtX3N0YXRlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQUxMX0xJTktTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfbWF4XzIwNDhfdW5wYWNrKCZ0aGlzLT5hbGxfbGlua3MsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9FTkNSWVBUSU9OX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX25pX2VuY3J5cHRpb25fY2ZnX3VucGFjaygmdGhpcy0+ZW5jcnlwdGlvbl9jZmcsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19jb25maWd1cmF0aW9uX3VucGFjaygmdGhpcy0+cHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQ0xPQ0tfVFJBTlNQT1JUX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9jb25maWd1cmF0aW9uX3VucGFjaygmdGhpcy0+Y2xvY2tfdHJhbnNwb3J0X2NmZywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0RST1BET1dOX1dFSUdIVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXJyX3UxNl83X3VucGFjaygmdGhpcy0+ZHJvcGRvd25fd2VpZ2h0cywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FQUFJPWElNQVRFX1NPTElDSVRFRF9VU0FHRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfYm91bmRzXzhfdW5wYWNrKCZ0aGlzLT5hcHByb3hpbWF0ZV9zb2xpY2l0ZWRfdXNhZ2UsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BUFBST1hJTUFURV9URE1fVVNBR0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmFwcHJveGltYXRlX3RkbV91c2FnZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTk9fUkVQT1JUU19TT0FLX1RJTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPm5vX3JlcG9ydHNfc29ha190aW1lKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9QT05fQUdHUkVHQVRFX1NIQVBFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fYWdncmVnYXRlX3NoYXBlcl91bnBhY2soJnRoaXMtPnBvbl9hZ2dyZWdhdGVfc2hhcGVyLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRVNUSU1BVEVEX1BPTl9MQVRFTkNZX1RRKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl9ib3VuZHNfOF91bnBhY2soJnRoaXMtPmVzdGltYXRlZF9wb25fbGF0ZW5jeV90cSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX09OVV9VUEdSQURFX1BBUkFNUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtc191bnBhY2soJnRoaXMtPm9udV91cGdyYWRlX3BhcmFtcywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FVVE9fUk9HVUVfREVURUNUXzEwR19FTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmF1dG9fcm9ndWVfZGV0ZWN0XzEwZ19lbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQVVUT19ST0dVRV9ERVRFQ1RfMUdfRU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5hdXRvX3JvZ3VlX2RldGVjdF8xZ19lbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQVVUT19ST0dVRV9ERVRFQ1RfMTBHX1RIUkVTSE9MRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5hdXRvX3JvZ3VlX2RldGVjdF8xMGdfdGhyZXNob2xkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01BQ19BRERSRVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRVBPTl9OSV9FTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX1JFR0lTVFJBVElPTl9CRUhBVklPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01UVV8xRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01UVV8xMEcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9NSU5JTVVNX0ZJQkVSX0xFTkdUSCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01BWElNVU1fRklCRVJfTEVOR1RIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfR1JBTlRfU1BBQ0lOR19UUSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0VQT05fTE9HSUNBTF9MSU5LX09QVElPTlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9uc19zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9NUENQX0RJU0NPVkVSWV9QRVJJT0RfTVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BTEFSTV9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FMTF9MSU5LUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyX21heF8yMDQ4X3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0VOQ1JZUFRJT05fQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0NMT0NLX1RSQU5TUE9SVF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9EUk9QRE9XTl9XRUlHSFRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FQUFJPWElNQVRFX1NPTElDSVRFRF9VU0FHRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDY0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BUFBST1hJTUFURV9URE1fVVNBR0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9OT19SRVBPUlRTX1NPQUtfVElNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX1BPTl9BR0dSRUdBVEVfU0hBUEVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRVNUSU1BVEVEX1BPTl9MQVRFTkNZX1RRKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNjQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX09OVV9VUEdSQURFX1BBUkFNUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtc19zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BVVRPX1JPR1VFX0RFVEVDVF8xMEdfRU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BVVRPX1JPR1VFX0RFVEVDVF8xR19FTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FVVE9fUk9HVUVfREVURUNUXzEwR19USFJFU0hPTEQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX25pX2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9FUE9OX05JX0VOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+ZXBvbl9uaV9lbikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9FTl9TVEFURV9ESVNBQkxFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfRU5fU1RBVEVfRU5BQkxFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfRU5fU1RBVEVfUFJPVEVDVEVEX1dPUktJTkc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX0VOX1NUQVRFX1BST1RFQ1RFRF9TVEFOREJZOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9FTl9TVEFURV9QUk9DRVNTSU5HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRVBPTl9OSV9FTjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX1JFR0lTVFJBVElPTl9CRUhBVklPUikpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnJlZ2lzdHJhdGlvbl9iZWhhdmlvcikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVHSVNUUkFUSU9OX0JFSEFWSU9SX0FVVE9NQVRJQzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JFR0lTVFJBVElPTl9CRUhBVklPUl9OT1RJRllfVU5LTk9XTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX1JFR0lTVFJBVElPTl9CRUhBVklPUjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01UVV8xRykpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+bXR1XzFnIDwgNjQpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9NVFVfMUc7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGhpcy0+bXR1XzFnID4gMjAwMCkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01UVV8xRzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTVRVXzEwRykpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+bXR1XzEwZyA8IDY0KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTVRVXzEwRzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0aGlzLT5tdHVfMTBnID4gMTAwMDApCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9NVFVfMTBHOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9HUkFOVF9TUEFDSU5HX1RRKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5ncmFudF9zcGFjaW5nX3RxID4gKGJjbW9sdF90aW1lX3F1YW50YSkgNjU1MzVVTCkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0dSQU5UX1NQQUNJTkdfVFE7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0VQT05fTE9HSUNBTF9MSU5LX09QVElPTlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9uc19ib3VuZHNfY2hlY2soJnRoaXMtPmVwb25fbG9naWNhbF9saW5rX29wdGlvbnMpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRVBPTl9MT0dJQ0FMX0xJTktfT1BUSU9OUzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTVBDUF9ESVNDT1ZFUllfUEVSSU9EX01TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5tcGNwX2Rpc2NvdmVyeV9wZXJpb2RfbXMgPCAxMDApCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9NUENQX0RJU0NPVkVSWV9QRVJJT0RfTVM7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FMQVJNX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fbmlfYWxhcm1fc3RhdGVfYm91bmRzX2NoZWNrKCZ0aGlzLT5hbGFybV9zdGF0ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BTEFSTV9TVEFURTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQUxMX0xJTktTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5hbGxfbGlua3MubGVuID4gMjA0OCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9tYXhfMjA0OF9ib3VuZHNfY2hlY2soJnRoaXMtPmFsbF9saW5rcykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BTExfTElOS1M7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0VOQ1JZUFRJT05fQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fbmlfZW5jcnlwdGlvbl9jZmdfYm91bmRzX2NoZWNrKCZ0aGlzLT5lbmNyeXB0aW9uX2NmZykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9FTkNSWVBUSU9OX0NGRzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY29uZmlndXJhdGlvbl9ib3VuZHNfY2hlY2soJnRoaXMtPnByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19DRkc7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0NMT0NLX1RSQU5TUE9SVF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfY29uZmlndXJhdGlvbl9ib3VuZHNfY2hlY2soJnRoaXMtPmNsb2NrX3RyYW5zcG9ydF9jZmcpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQ0xPQ0tfVFJBTlNQT1JUX0NGRzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRFJPUERPV05fV0VJR0hUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfdTE2XzdfYm91bmRzX2NoZWNrKCZ0aGlzLT5kcm9wZG93bl93ZWlnaHRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0RST1BET1dOX1dFSUdIVFM7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FQUFJPWElNQVRFX1NPTElDSVRFRF9VU0FHRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfYm91bmRzXzhfYm91bmRzX2NoZWNrKCZ0aGlzLT5hcHByb3hpbWF0ZV9zb2xpY2l0ZWRfdXNhZ2UpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQVBQUk9YSU1BVEVfU09MSUNJVEVEX1VTQUdFOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9OT19SRVBPUlRTX1NPQUtfVElNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+bm9fcmVwb3J0c19zb2FrX3RpbWUgPiA2NykKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX05PX1JFUE9SVFNfU09BS19USU1FOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9QT05fQUdHUkVHQVRFX1NIQVBFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fYWdncmVnYXRlX3NoYXBlcl9ib3VuZHNfY2hlY2soJnRoaXMtPnBvbl9hZ2dyZWdhdGVfc2hhcGVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX1BPTl9BR0dSRUdBVEVfU0hBUEVSOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9FU1RJTUFURURfUE9OX0xBVEVOQ1lfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXJyX2JvdW5kc184X2JvdW5kc19jaGVjaygmdGhpcy0+ZXN0aW1hdGVkX3Bvbl9sYXRlbmN5X3RxKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0VTVElNQVRFRF9QT05fTEFURU5DWV9UUTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfT05VX1VQR1JBREVfUEFSQU1TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2JvdW5kc19jaGVjaygmdGhpcy0+b251X3VwZ3JhZGVfcGFyYW1zKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX09OVV9VUEdSQURFX1BBUkFNUzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfTExJRF9RVUFSQU5USU5FRF9JRF9MTElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmxsaWQgPSAoYmNtb2x0X2Vwb25fbGxpZCkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfTExJRF9RVUFSQU5USU5FRF9JRF9MSU5LX1JBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bGlua19yYXRlID0gQkNNT0xUX0VQT05fTElOS19SQVRFX1RFTl9URU47CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0xMSURfUVVBUkFOVElORURfSURfTElOS19NQUMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3NfaW5pdCgmdGhpcy0+bGlua19tYWMpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9MTElEX1FVQVJBTlRJTkVEX0lEX1JBTkdFX1ZBTFVFX1RRKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJhbmdlX3ZhbHVlX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfTExJRF9RVUFSQU5USU5FRF9JRF9MTElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPmxsaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfTExJRF9RVUFSQU5USU5FRF9JRF9MSU5LX1JBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9saW5rX3JhdGVfcGFjayh0aGlzLT5saW5rX3JhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9MTElEX1FVQVJBTlRJTkVEX0lEX0xJTktfTUFDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPmxpbmtfbWFjKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0xMSURfUVVBUkFOVElORURfSURfUkFOR0VfVkFMVUVfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcy0+cmFuZ2VfdmFsdWVfdHEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfTExJRF9RVUFSQU5USU5FRF9JRF9MTElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0xMSURfUVVBUkFOVElORURfSURfTElOS19SQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0xMSURfUVVBUkFOVElORURfSURfTElOS19NQUMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfTExJRF9RVUFSQU5USU5FRF9JRF9SQU5HRV9WQUxVRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0xMSURfUVVBUkFOVElORURfSURfTExJRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPmxsaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfTExJRF9RVUFSQU5USU5FRF9JRF9MSU5LX1JBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9saW5rX3JhdGVfdW5wYWNrKCZ0aGlzLT5saW5rX3JhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9MTElEX1FVQVJBTlRJTkVEX0lEX0xJTktfTUFDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX21hY19hZGRyZXNzKGJ1ZiwgJnRoaXMtPmxpbmtfbWFjKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0xMSURfUVVBUkFOVElORURfSURfUkFOR0VfVkFMVUVfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgKHVpbnQzMl90ICopICZ0aGlzLT5yYW5nZV92YWx1ZV90cSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9MTElEX1FVQVJBTlRJTkVEX0lEX0xMSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0xMSURfUVVBUkFOVElORURfSURfTElOS19SQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9MTElEX1FVQVJBTlRJTkVEX0lEX0xJTktfTUFDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9MTElEX1FVQVJBTlRJTkVEX0lEX1JBTkdFX1ZBTFVFX1RRKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9MTElEX1FVQVJBTlRJTkVEX0lEX0xJTktfUkFURSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmxpbmtfcmF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfVEVOX1RFTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19SQVRFX1RFTl9PTkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfUkFURV9PTkVfT05FOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9OSV9MTElEX1FVQVJBTlRJTkVEX0lEX0xJTktfUkFURTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX25pX21wY3BfdGltZXN0YW1wX2NoYW5nZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX01QQ1BfVElNRVNUQU1QX0NIQU5HRURfSURfTVBDUF9USU1FU1RBTVApKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bXBjcF90aW1lc3RhbXAgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9NUENQX1RJTUVTVEFNUF9DSEFOR0VEX0lEX01QQ1BfVElNRVNUQU1QKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5tcGNwX3RpbWVzdGFtcCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX25pX21wY3BfdGltZXN0YW1wX2NoYW5nZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9NUENQX1RJTUVTVEFNUF9DSEFOR0VEX0lEX01QQ1BfVElNRVNUQU1QKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX25pX21wY3BfdGltZXN0YW1wX2NoYW5nZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfTVBDUF9USU1FU1RBTVBfQ0hBTkdFRF9JRF9NUENQX1RJTUVTVEFNUCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+bXBjcF90aW1lc3RhbXApKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfTVBDUF9USU1FU1RBTVBfQ0hBTkdFRF9JRF9NUENQX1RJTUVTVEFNUCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0c19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX05PX1JFUE9SVFNfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXR1cyA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0c19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0c19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9OT19SRVBPUlRTX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0c19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9OT19SRVBPUlRTX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0c19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX05PX1JFUE9SVFNfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX05PX1JFUE9SVFNfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9OT19SRVBPUlRTX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmFsYXJtX3N0YXR1cykKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX05JX05PX1JFUE9SVFNfSURfQUxBUk1fU1RBVFVTOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9PTlVfVVBHUkFERV9DT01QTEVURV9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdHVzID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX0xJU1RfT0ZfRkFJTEVEX0VOVElUSUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmxpc3Rfb2ZfZmFpbGVkX2VudGl0aWVzLmxlbiA9IDA7CisgICAgICAgIHRoaXMtPmxpc3Rfb2ZfZmFpbGVkX2VudGl0aWVzLnZhbCA9IE5VTEw7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhdHVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX0xJU1RfT0ZfRkFJTEVEX0VOVElUSUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyX3BhY2soJnRoaXMtPmxpc3Rfb2ZfZmFpbGVkX2VudGl0aWVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9PTlVfVVBHUkFERV9DT01QTEVURV9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfTElTVF9PRl9GQUlMRURfRU5USVRJRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5saXN0X29mX2ZhaWxlZF9lbnRpdGllcyk7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9PTlVfVVBHUkFERV9DT01QTEVURV9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zdGF0dXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfTElTVF9PRl9GQUlMRURfRU5USVRJRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzJfdW5wYWNrKCZ0aGlzLT5saXN0X29mX2ZhaWxlZF9lbnRpdGllcywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfTElTVF9PRl9GQUlMRURfRU5USVRJRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzJfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9PTlVfVVBHUkFERV9DT01QTEVURV9JRF9MSVNUX09GX0ZBSUxFRF9FTlRJVElFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMl9ib3VuZHNfY2hlY2soJnRoaXMtPmxpc3Rfb2ZfZmFpbGVkX2VudGl0aWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfTElTVF9PRl9GQUlMRURfRU5USVRJRVM7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX1JPR1VFX1NDQU5fQ09NUExFVEVfSURfUkVUVVJOX0lORF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmV0dXJuX2luZF9zdGF0dXMgPSBCQ01PTFRfUk9HVUVfU0NBTl9TVEFUVVNfQ09NUExFVEU7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX1JPR1VFX1NDQU5fQ09NUExFVEVfSURfUkVUVVJOX0lORF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcm9ndWVfc2Nhbl9zdGF0dXNfcGFjayh0aGlzLT5yZXR1cm5faW5kX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX1JPR1VFX1NDQU5fQ09NUExFVEVfSURfUkVUVVJOX0lORF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9ST0dVRV9TQ0FOX0NPTVBMRVRFX0lEX1JFVFVSTl9JTkRfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3JvZ3VlX3NjYW5fc3RhdHVzX3VucGFjaygmdGhpcy0+cmV0dXJuX2luZF9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9ST0dVRV9TQ0FOX0NPTVBMRVRFX0lEX1JFVFVSTl9JTkRfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9ST0dVRV9TQ0FOX0NPTVBMRVRFX0lEX1JFVFVSTl9JTkRfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+cmV0dXJuX2luZF9zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JPR1VFX1NDQU5fU1RBVFVTX0NPTVBMRVRFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUk9HVUVfU0NBTl9TVEFUVVNfTExJRF9TVEFURV9JU19CQUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9TQ0FOX1NUQVRVU19MTElEX0lTX09PUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JPR1VFX1NDQU5fU1RBVFVTX1NDQU5fRVJSX05PUkVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUk9HVUVfU0NBTl9TVEFUVVNfU0NBTl9FUlJfSU5URVJOQUw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX05JX1JPR1VFX1NDQU5fQ09NUExFVEVfSURfUkVUVVJOX0lORF9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0dXMgPSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1M7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX0xMSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bGxpZCA9IChiY21vbHRfZXBvbl9sbGlkKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9MSU5LX01BQykpICE9IDApCisgICAgeworICAgICAgICBiY21vc19tYWNfYWRkcmVzc19pbml0KCZ0aGlzLT5saW5rX21hYyk7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3VsdF9wYWNrKHRoaXMtPnN0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX0xMSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+bGxpZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9MSU5LX01BQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT5saW5rX21hYykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9MTElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX0xJTktfTUFDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDY7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzdWx0X3VucGFjaygmdGhpcy0+c3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfTExJRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPmxsaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfTElOS19NQUMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+bGlua19tYWMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfTExJRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfTElOS19NQUMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA2KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnN0YXR1cykKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1M6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SRVNVTFRfRkFJTDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fTklfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfU1RBVFVTOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9ORVdfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bmV3X3N0YXRlID0gQkNNT0xUX0VQT05fTklfRU5fU1RBVEVfRElTQUJMRUQ7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfTkVXX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fbmlfZW5fc3RhdGVfcGFjayh0aGlzLT5uZXdfc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX05FV19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfTkVXX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fbmlfZW5fc3RhdGVfdW5wYWNrKCZ0aGlzLT5uZXdfc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX05FV19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9ORVdfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5uZXdfc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfRU5fU1RBVEVfRElTQUJMRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX0VOX1NUQVRFX0VOQUJMRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX0VOX1NUQVRFX1BST1RFQ1RFRF9XT1JLSU5HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9FTl9TVEFURV9QUk9URUNURURfU1RBTkRCWToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfRU5fU1RBVEVfUFJPQ0VTU0lORzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9ORVdfU1RBVEU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX0FVVE9fUk9HVUVfU0NBTl8xMEdfRkFJTFVSRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmUgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfQVVUT19ST0dVRV9TQ0FOXzFHX0ZBSUxVUkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmUgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfTExJRF9RVUFSQU5USU5FRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5sbGlkX3F1YXJhbnRpbmVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX01QQ1BfVElNRVNUQU1QX0NIQU5HRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bXBjcF90aW1lc3RhbXBfY2hhbmdlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9OT19SRVBPUlRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm5vX3JlcG9ydHMgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfT05VX1VQR1JBREVfQ09NUExFVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b251X3VwZ3JhZGVfY29tcGxldGUgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfUkVSQU5HRV9GQUlMVVJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJlcmFuZ2VfZmFpbHVyZSA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9ST0dVRV9TQ0FOX0NPTVBMRVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJvZ3VlX3NjYW5fY29tcGxldGUgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0ZV9jaGFuZ2VfY29tcGxldGVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfQVVUT19ST0dVRV9TQ0FOXzEwR19GQUlMVVJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+YXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX0FVVE9fUk9HVUVfU0NBTl8xR19GQUlMVVJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+YXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfTExJRF9RVUFSQU5USU5FRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmxsaWRfcXVhcmFudGluZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfTVBDUF9USU1FU1RBTVBfQ0hBTkdFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPm1wY3BfdGltZXN0YW1wX2NoYW5nZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfTk9fUkVQT1JUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPm5vX3JlcG9ydHMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfT05VX1VQR1JBREVfQ09NUExFVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5vbnVfdXBncmFkZV9jb21wbGV0ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9SRVJBTkdFX0ZBSUxVUkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5yZXJhbmdlX2ZhaWx1cmUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfUk9HVUVfU0NBTl9DT01QTEVURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnJvZ3VlX3NjYW5fY29tcGxldGUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9TVEFURV9DSEFOR0VfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhdGVfY2hhbmdlX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX0FVVE9fUk9HVUVfU0NBTl8xMEdfRkFJTFVSRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9BVVRPX1JPR1VFX1NDQU5fMUdfRkFJTFVSRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9MTElEX1FVQVJBTlRJTkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX01QQ1BfVElNRVNUQU1QX0NIQU5HRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfTk9fUkVQT1JUUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9PTlVfVVBHUkFERV9DT01QTEVURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9SRVJBTkdFX0ZBSUxVUkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfUk9HVUVfU0NBTl9DT01QTEVURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9TVEFURV9DSEFOR0VfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9BVVRPX1JPR1VFX1NDQU5fMTBHX0ZBSUxVUkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5hdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfQVVUT19ST0dVRV9TQ0FOXzFHX0ZBSUxVUkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5hdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9MTElEX1FVQVJBTlRJTkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+bGxpZF9xdWFyYW50aW5lZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9NUENQX1RJTUVTVEFNUF9DSEFOR0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+bXBjcF90aW1lc3RhbXBfY2hhbmdlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9OT19SRVBPUlRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+bm9fcmVwb3J0cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9PTlVfVVBHUkFERV9DT01QTEVURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPm9udV91cGdyYWRlX2NvbXBsZXRlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX1JFUkFOR0VfRkFJTFVSRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnJlcmFuZ2VfZmFpbHVyZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9ST0dVRV9TQ0FOX0NPTVBMRVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+cm9ndWVfc2Nhbl9jb21wbGV0ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zdGF0ZV9jaGFuZ2VfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9BVVRPX1JPR1VFX1NDQU5fMTBHX0ZBSUxVUkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX0FVVE9fUk9HVUVfU0NBTl8xR19GQUlMVVJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9MTElEX1FVQVJBTlRJTkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9NUENQX1RJTUVTVEFNUF9DSEFOR0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9OT19SRVBPUlRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9PTlVfVVBHUkFERV9DT01QTEVURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfUkVSQU5HRV9GQUlMVVJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9ST0dVRV9TQ0FOX0NPTVBMRVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9uaV9hZGRfbGlua19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQUREX0xJTktfSURfTUFDX0FERFJFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3NfaW5pdCgmdGhpcy0+bWFjX2FkZHJlc3MpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BRERfTElOS19JRF9SQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJhdGUgPSBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfVEVOX1RFTjsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2FkZF9saW5rX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9uaV9hZGRfbGlua19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BRERfTElOS19JRF9NQUNfQUREUkVTUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT5tYWNfYWRkcmVzcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BRERfTElOS19JRF9SQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fbGlua19yYXRlX3BhY2sodGhpcy0+cmF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9uaV9hZGRfbGlua19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX25pX2FkZF9saW5rX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQUREX0xJTktfSURfTUFDX0FERFJFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQUREX0xJTktfSURfUkFURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQUREX0xJTktfSURfTUFDX0FERFJFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+bWFjX2FkZHJlc3MpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQUREX0xJTktfSURfUkFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2xpbmtfcmF0ZV91bnBhY2soJnRoaXMtPnJhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9hZGRfbGlua19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQUREX0xJTktfSURfTUFDX0FERFJFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA2KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0FERF9MSU5LX0lEX1JBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2FkZF9saW5rX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX25pX2FkZF9saW5rX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9uaV9hZGRfbGlua19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0FERF9MSU5LX0lEX1JBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5yYXRlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfUkFURV9URU5fVEVOOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfVEVOX09ORToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19SQVRFX09ORV9PTkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX05JX0FERF9MSU5LX0lEX1JBVEU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQUREX01VTFRJQ0FTVF9MSU5LX0lEX01BQ19BRERSRVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGJjbW9zX21hY19hZGRyZXNzX2luaXQoJnRoaXMtPm1hY19hZGRyZXNzKTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQUREX01VTFRJQ0FTVF9MSU5LX0lEX1JBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmF0ZSA9IEJDTU9MVF9FUE9OX0xJTktfUkFURV9URU5fVEVOOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQUREX01VTFRJQ0FTVF9MSU5LX0lEX01BQ19BRERSRVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPm1hY19hZGRyZXNzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0FERF9NVUxUSUNBU1RfTElOS19JRF9SQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fbGlua19yYXRlX3BhY2sodGhpcy0+cmF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BRERfTVVMVElDQVNUX0xJTktfSURfTUFDX0FERFJFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQUREX01VTFRJQ0FTVF9MSU5LX0lEX1JBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQUREX01VTFRJQ0FTVF9MSU5LX0lEX01BQ19BRERSRVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX21hY19hZGRyZXNzKGJ1ZiwgJnRoaXMtPm1hY19hZGRyZXNzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0FERF9NVUxUSUNBU1RfTElOS19JRF9SQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fbGlua19yYXRlX3VucGFjaygmdGhpcy0+cmF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQUREX01VTFRJQ0FTVF9MSU5LX0lEX01BQ19BRERSRVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BRERfTVVMVElDQVNUX0xJTktfSURfUkFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQUREX01VTFRJQ0FTVF9MSU5LX0lEX1JBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5yYXRlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfUkFURV9URU5fVEVOOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfVEVOX09ORToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19SQVRFX09ORV9PTkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX05JX0FERF9NVUxUSUNBU1RfTElOS19JRF9SQVRFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BRERfUFJPVEVDVEVEX1NUQU5EQllfTElOS19JRF9NQUNfQUREUkVTUykpICE9IDApCisgICAgeworICAgICAgICBiY21vc19tYWNfYWRkcmVzc19pbml0KCZ0aGlzLT5tYWNfYWRkcmVzcyk7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0FERF9QUk9URUNURURfU1RBTkRCWV9MSU5LX0lEX1dPUktJTkdfTElOS19JTkZPKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPndvcmtpbmdfbGlua19pbmZvLmxpbmtfc3RhdHVzID0gKGJjbW9sdF9lcG9uX2xpbmtfc3RhdHVzKSAwOworICAgICAgICB0aGlzLT53b3JraW5nX2xpbmtfaW5mby5yYXRlID0gQkNNT0xUX0VQT05fTElOS19SQVRFX1RFTl9URU47CisgICAgICAgIHRoaXMtPndvcmtpbmdfbGlua19pbmZvLmxsaWQgPSAoYmNtb2x0X2Vwb25fbGxpZCkgMDsKKyAgICAgICAgdGhpcy0+d29ya2luZ19saW5rX2luZm8ubXBjcF9kaXNjb3ZlcnlfaW5mbyA9IChiY21vbHRfbXBjcF9kaXNjb3ZlcnlfaW5mbykgMDsKKyAgICAgICAgdGhpcy0+d29ya2luZ19saW5rX2luZm8ub251X2xhc2VyX29uX3RpbWVfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSAwOworICAgICAgICB0aGlzLT53b3JraW5nX2xpbmtfaW5mby5vbnVfbGFzZXJfb2ZmX3RpbWVfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSAwOworICAgICAgICB0aGlzLT53b3JraW5nX2xpbmtfaW5mby5wZW5kaW5nX2dyYW50cyA9IDA7CisgICAgICAgIHRoaXMtPndvcmtpbmdfbGlua19pbmZvLnJhbmdlX3ZhbHVlX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICAgICAgdGhpcy0+d29ya2luZ19saW5rX2luZm8udHVubmVsX2lkID0gKGJjbW9sdF9lcG9uX3R1bm5lbF9pZCkgMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BRERfUFJPVEVDVEVEX1NUQU5EQllfTElOS19JRF9NQUNfQUREUkVTUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT5tYWNfYWRkcmVzcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BRERfUFJPVEVDVEVEX1NUQU5EQllfTElOS19JRF9XT1JLSU5HX0xJTktfSU5GTykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2xpbmtfaW5mb19wYWNrKCZ0aGlzLT53b3JraW5nX2xpbmtfaW5mbywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQUREX1BST1RFQ1RFRF9TVEFOREJZX0xJTktfSURfTUFDX0FERFJFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQUREX1BST1RFQ1RFRF9TVEFOREJZX0xJTktfSURfV09SS0lOR19MSU5LX0lORk8pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjQ7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BRERfUFJPVEVDVEVEX1NUQU5EQllfTElOS19JRF9NQUNfQUREUkVTUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9tYWNfYWRkcmVzcyhidWYsICZ0aGlzLT5tYWNfYWRkcmVzcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9BRERfUFJPVEVDVEVEX1NUQU5EQllfTElOS19JRF9XT1JLSU5HX0xJTktfSU5GTykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2xpbmtfaW5mb191bnBhY2soJnRoaXMtPndvcmtpbmdfbGlua19pbmZvLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQUREX1BST1RFQ1RFRF9TVEFOREJZX0xJTktfSURfTUFDX0FERFJFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA2KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0FERF9QUk9URUNURURfU1RBTkRCWV9MSU5LX0lEX1dPUktJTkdfTElOS19JTkZPKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMjQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfQUREX1BST1RFQ1RFRF9TVEFOREJZX0xJTktfSURfV09SS0lOR19MSU5LX0lORk8pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9saW5rX2luZm9fYm91bmRzX2NoZWNrKCZ0aGlzLT53b3JraW5nX2xpbmtfaW5mbykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX05JX0FERF9QUk9URUNURURfU1RBTkRCWV9MSU5LX0lEX1dPUktJTkdfTElOS19JTkZPOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX0dSQU5URURfTElOSykpICE9IDApCisgICAgeworICAgICAgICBiY21vc19tYWNfYWRkcmVzc19pbml0KCZ0aGlzLT5ncmFudGVkX2xpbmspOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX1RSSUdHRVJfV0lEVEgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHJpZ2dlcl93aWR0aCA9IDMyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX1RSSUdHRVJfREVMQVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHJpZ2dlcl9kZWxheSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0lTU1VFX1JTU0lfR1JBTlRfSURfU0FNUExFX1BFUklPRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zYW1wbGVfcGVyaW9kID0gNTAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX0dSQU5URURfTElOSykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT5ncmFudGVkX2xpbmspKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfSVNTVUVfUlNTSV9HUkFOVF9JRF9UUklHR0VSX1dJRFRIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT50cmlnZ2VyX3dpZHRoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0lTU1VFX1JTU0lfR1JBTlRfSURfVFJJR0dFUl9ERUxBWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dHJpZ2dlcl9kZWxheSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX1NBTVBMRV9QRVJJT0QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnNhbXBsZV9wZXJpb2QpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfSVNTVUVfUlNTSV9HUkFOVF9JRF9HUkFOVEVEX0xJTkspKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfSVNTVUVfUlNTSV9HUkFOVF9JRF9UUklHR0VSX1dJRFRIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0lTU1VFX1JTU0lfR1JBTlRfSURfVFJJR0dFUl9ERUxBWSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX1NBTVBMRV9QRVJJT0QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX0dSQU5URURfTElOSykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9tYWNfYWRkcmVzcyhidWYsICZ0aGlzLT5ncmFudGVkX2xpbmspKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfSVNTVUVfUlNTSV9HUkFOVF9JRF9UUklHR0VSX1dJRFRIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT50cmlnZ2VyX3dpZHRoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0lTU1VFX1JTU0lfR1JBTlRfSURfVFJJR0dFUl9ERUxBWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dHJpZ2dlcl9kZWxheSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX1NBTVBMRV9QRVJJT0QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnNhbXBsZV9wZXJpb2QpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfSVNTVUVfUlNTSV9HUkFOVF9JRF9HUkFOVEVEX0xJTkspKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA2KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0lTU1VFX1JTU0lfR1JBTlRfSURfVFJJR0dFUl9XSURUSCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfSVNTVUVfUlNTSV9HUkFOVF9JRF9UUklHR0VSX0RFTEFZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX1NBTVBMRV9QRVJJT0QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0lTU1VFX1JTU0lfR1JBTlRfSURfVFJJR0dFUl9XSURUSCkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+dHJpZ2dlcl93aWR0aCA8IDMyKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX1RSSUdHRVJfV0lEVEg7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGhpcy0+dHJpZ2dlcl93aWR0aCA+IDMwMDApCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX05JX0lTU1VFX1JTU0lfR1JBTlRfSURfVFJJR0dFUl9XSURUSDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX1RSSUdHRVJfREVMQVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnRyaWdnZXJfZGVsYXkgPiAxNTAwKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX1RSSUdHRVJfREVMQVk7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfSVNTVUVfUlNTSV9HUkFOVF9JRF9TQU1QTEVfUEVSSU9EKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5zYW1wbGVfcGVyaW9kIDwgMTAwKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX1NBTVBMRV9QRVJJT0Q7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGhpcy0+c2FtcGxlX3BlcmlvZCA+IDkwMCkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fTklfSVNTVUVfUlNTSV9HUkFOVF9JRF9TQU1QTEVfUEVSSU9EOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19BUFBMWV9SRVJBTkdFX0RFTFRBX0lEX1JFUkFOR0VfREVMVEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmVyYW5nZV9kZWx0YSA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX0FQUExZX1JFUkFOR0VfREVMVEFfSURfUkVSQU5HRV9ERUxUQSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+cmVyYW5nZV9kZWx0YSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19BUFBMWV9SRVJBTkdFX0RFTFRBX0lEX1JFUkFOR0VfREVMVEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19BUFBMWV9SRVJBTkdFX0RFTFRBX0lEX1JFUkFOR0VfREVMVEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnJlcmFuZ2VfZGVsdGEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfQVBQTFlfUkVSQU5HRV9ERUxUQV9JRF9SRVJBTkdFX0RFTFRBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW5fZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW5fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX1JPR1VFX0xMSURfU0NBTl9JRF9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm1vZGUgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfUk9HVUVfTExJRF9TQ0FOX0lEX0xMSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bGxpZCA9IChiY21vbHRfZXBvbl9sbGlkKSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW5fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfUk9HVUVfTExJRF9TQ0FOX0lEX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5tb2RlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX1JPR1VFX0xMSURfU0NBTl9JRF9MTElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPmxsaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX1JPR1VFX0xMSURfU0NBTl9JRF9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX1JPR1VFX0xMSURfU0NBTl9JRF9MTElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW5fZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX1JPR1VFX0xMSURfU0NBTl9JRF9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+bW9kZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9ST0dVRV9MTElEX1NDQU5fSURfTExJRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPmxsaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9ST0dVRV9MTElEX1NDQU5fSURfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfUk9HVUVfTExJRF9TQ0FOX0lEX0xMSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW5fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX1NFVF9FUE9OX05JX0VOX1NUQVRFX0lEX05FV19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5uZXdfc3RhdGUgPSBCQ01PTFRfRVBPTl9OSV9FTl9TVEFURV9ESVNBQkxFRDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9TRVRfRVBPTl9OSV9FTl9TVEFURV9JRF9ORVdfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9uaV9lbl9zdGF0ZV9wYWNrKHRoaXMtPm5ld19zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfU0VUX0VQT05fTklfRU5fU1RBVEVfSURfTkVXX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9TRVRfRVBPTl9OSV9FTl9TVEFURV9JRF9ORVdfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9uaV9lbl9zdGF0ZV91bnBhY2soJnRoaXMtPm5ld19zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9TRVRfRVBPTl9OSV9FTl9TVEFURV9JRF9ORVdfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX1NFVF9FUE9OX05JX0VOX1NUQVRFX0lEX05FV19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPm5ld19zdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9FTl9TVEFURV9ESVNBQkxFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfRU5fU1RBVEVfRU5BQkxFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfRU5fU1RBVEVfUFJPVEVDVEVEX1dPUktJTkc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX0VOX1NUQVRFX1BST1RFQ1RFRF9TVEFOREJZOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9FTl9TVEFURV9QUk9DRVNTSU5HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9OSV9TRVRfRVBPTl9OSV9FTl9TVEFURV9JRF9ORVdfU1RBVEU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX1NUQVJUX09OVV9VUEdSQURFX0lEX0xJU1RfT0ZfT05VX0lEUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5saXN0X29mX29udV9pZHMubGVuID0gMDsKKyAgICAgICAgdGhpcy0+bGlzdF9vZl9vbnVfaWRzLnZhbCA9IE5VTEw7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfU1RBUlRfT05VX1VQR1JBREVfSURfTElTVF9PRl9PTlVfSURTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfcGFjaygmdGhpcy0+bGlzdF9vZl9vbnVfaWRzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9TVEFSVF9PTlVfVVBHUkFERV9JRF9MSVNUX09GX09OVV9JRFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmxpc3Rfb2Zfb251X2lkcyk7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9TVEFSVF9PTlVfVVBHUkFERV9JRF9MSVNUX09GX09OVV9JRFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl91bnBhY2soJnRoaXMtPmxpc3Rfb2Zfb251X2lkcywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX1NUQVJUX09OVV9VUEdSQURFX0lEX0xJU1RfT0ZfT05VX0lEUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fTklfU1RBUlRfT05VX1VQR1JBREVfSURfTElTVF9PRl9PTlVfSURTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfYm91bmRzX2NoZWNrKCZ0aGlzLT5saXN0X29mX29udV9pZHMpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9OSV9TVEFSVF9PTlVfVVBHUkFERV9JRF9MSVNUX09GX09OVV9JRFM7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0tFWV9JRF9FUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfS0VZX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vbnVfaWQgPSAoYmNtb2x0X2Vwb25fb251X2lkKSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXlfcGFjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzEwR19VU19LRVlfSURfRVBPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5lcG9uX25pKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfS0VZX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcy0+b251X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0tFWV9JRF9FUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfS0VZX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXlfdW5wYWNrKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0tFWV9JRF9FUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+ZXBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0tFWV9JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAodWludDhfdCAqKSAmdGhpcy0+b251X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzEwR19VU19LRVlfSURfRVBPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzEwR19VU19LRVlfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfS0VZX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+b251X2lkID4gKGJjbW9sdF9lcG9uX29udV9pZCkgMTI3KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0tFWV9JRF9PTlVfSUQ7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzEwR19VU19DRkdfSURfQUxMX0xJTktTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFsbF9saW5rcy5sZW4gPSAwOworICAgICAgICB0aGlzLT5hbGxfbGlua3MudmFsID0gTlVMTDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0NGR19JRF9BTExfTElOS1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9tYXhfMjA0OF9wYWNrKCZ0aGlzLT5hbGxfbGlua3MsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfQ0ZHX0lEX0FMTF9MSU5LUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9tYXhfMjA0OF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+YWxsX2xpbmtzKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfQ0ZHX0lEX0FMTF9MSU5LUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyX21heF8yMDQ4X3VucGFjaygmdGhpcy0+YWxsX2xpbmtzLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzEwR19VU19DRkdfSURfQUxMX0xJTktTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfbWF4XzIwNDhfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0NGR19JRF9BTExfTElOS1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmFsbF9saW5rcy5sZW4gPiAyMDQ4KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyX21heF8yMDQ4X2JvdW5kc19jaGVjaygmdGhpcy0+YWxsX2xpbmtzKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fT05VXzEwR19VU19DRkdfSURfQUxMX0xJTktTOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19DT0RFX1dPUkRTX1RPVEFMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZlY19jb2RlX3dvcmRzX3RvdGFsID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19DT0RFX1dPUkRTX0RFQ09ERV9GQUlMUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mZWNfY29kZV93b3Jkc19kZWNvZGVfZmFpbHMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfRkVDX1pFUk9FU19DT1JSRUNURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZmVjX3plcm9lc19jb3JyZWN0ZWQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfRkVDX09ORVNfQ09SUkVDVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZlY19vbmVzX2NvcnJlY3RlZCA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfRkVDX0NPREVfV09SRFNfVE9UQUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZlY19jb2RlX3dvcmRzX3RvdGFsKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9JRF9GRUNfQ09ERV9XT1JEU19ERUNPREVfRkFJTFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZlY19jb2RlX3dvcmRzX2RlY29kZV9mYWlscykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfRkVDX1pFUk9FU19DT1JSRUNURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZlY196ZXJvZXNfY29ycmVjdGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9JRF9GRUNfT05FU19DT1JSRUNURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZlY19vbmVzX2NvcnJlY3RlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19DT0RFX1dPUkRTX1RPVEFMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9JRF9GRUNfQ09ERV9XT1JEU19ERUNPREVfRkFJTFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19aRVJPRVNfQ09SUkVDVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9JRF9GRUNfT05FU19DT1JSRUNURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19DT0RFX1dPUkRTX1RPVEFMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mZWNfY29kZV93b3Jkc190b3RhbCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfRkVDX0NPREVfV09SRFNfREVDT0RFX0ZBSUxTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mZWNfY29kZV93b3Jkc19kZWNvZGVfZmFpbHMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19aRVJPRVNfQ09SUkVDVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mZWNfemVyb2VzX2NvcnJlY3RlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfRkVDX09ORVNfQ09SUkVDVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mZWNfb25lc19jb3JyZWN0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfRkVDX0NPREVfV09SRFNfVE9UQUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9JRF9GRUNfQ09ERV9XT1JEU19ERUNPREVfRkFJTFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9JRF9GRUNfWkVST0VTX0NPUlJFQ1RFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19PTkVTX0NPUlJFQ1RFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNmZy50cmlnZ2VyLnR5cGUgPSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOworICAgICAgICB0aGlzLT5jZmcuc29hay5hY3RpdmVfc29ha190aW1lID0gMDsKKyAgICAgICAgdGhpcy0+Y2ZnLnNvYWsuY2xlYXJfc29ha190aW1lID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfcGFjaygmdGhpcy0+Y2ZnLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5jZmcpOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3VucGFjaygmdGhpcy0+Y2ZnLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ19zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2JvdW5kc19jaGVjaygmdGhpcy0+Y2ZnKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0NGR19JRF9DRkc7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0ID0gQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19DT0RFX1dPUkRTX1RPVEFMOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfaWRfcGFjayh0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2lkX3VucGFjaygmdGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfRkVDX0NPREVfV09SRFNfVE9UQUw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9JRF9GRUNfQ09ERV9XT1JEU19ERUNPREVfRkFJTFM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9JRF9GRUNfWkVST0VTX0NPUlJFQ1RFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19PTkVTX0NPUlJFQ1RFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0ID0gQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19DT0RFX1dPUkRTX1RPVEFMOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfaWRfcGFjayh0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2lkX3VucGFjaygmdGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfRkVDX0NPREVfV09SRFNfVE9UQUw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9JRF9GRUNfQ09ERV9XT1JEU19ERUNPREVfRkFJTFM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9JRF9GRUNfWkVST0VTX0NPUlJFQ1RFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19PTkVTX0NPUlJFQ1RFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzEwR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdF9hbGFybV9yYWlzZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzEwR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5zdGF0X2FsYXJtX2NsZWFyZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzEwR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnN0YXRfYWxhcm1fY2xlYXJlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c3RhdF9hbGFybV9yYWlzZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzEwR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX29udV8xZ191c19rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19LRVlfSURfRVBPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfS0VZX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vbnVfaWQgPSAoYmNtb2x0X2Vwb25fb251X2lkKSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX29udV8xZ191c19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19LRVlfSURfRVBPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5lcG9uX25pKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19LRVlfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzLT5vbnVfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29udV8xZ191c19rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfS0VZX0lEX0VQT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX0tFWV9JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19rZXlfdW5wYWNrKGJjbW9sdF9lcG9uX29udV8xZ191c19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19LRVlfSURfRVBPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPmVwb25fbmkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX0tFWV9JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAodWludDhfdCAqKSAmdGhpcy0+b251X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfS0VZX0lEX0VQT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19LRVlfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19LRVlfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5vbnVfaWQgPiAoYmNtb2x0X2Vwb25fb251X2lkKSAxMjcpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX09OVV8xR19VU19LRVlfSURfT05VX0lEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX29udV8xZ191c19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQ0ZHX0lEX0FMTF9MSU5LUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hbGxfbGlua3MubGVuID0gMDsKKyAgICAgICAgdGhpcy0+YWxsX2xpbmtzLnZhbCA9IE5VTEw7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19DRkdfSURfQUxMX0xJTktTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfcGFjaygmdGhpcy0+YWxsX2xpbmtzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29udV8xZ191c19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX0NGR19JRF9BTExfTElOS1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmFsbF9saW5rcyk7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX29udV8xZ191c19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX0NGR19JRF9BTExfTElOS1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl91bnBhY2soJnRoaXMtPmFsbF9saW5rcywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX0NGR19JRF9BTExfTElOS1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19DRkdfSURfQUxMX0xJTktTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfYm91bmRzX2NoZWNrKCZ0aGlzLT5hbGxfbGlua3MpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQ0ZHX0lEX0FMTF9MSU5LUzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9HT09EX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5nb29kX2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0dPT0RfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Z29vZF9ieXRlcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX09WRVJTWl9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b3ZlcnN6X2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX05PTl9GRUNfR09PRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bm9uX2ZlY19nb29kX2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX05PTl9GRUNfR09PRF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5ub25fZmVjX2dvb2RfYnl0ZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfR09PRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZmVjX2dvb2RfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0dPT0RfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZmVjX2dvb2RfYnl0ZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfRlJBTUVTX0VYQ19FUlJTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZlY19mcmFtZXNfZXhjX2VycnMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQkxLU19OT19FUlJTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZlY19ibGtzX25vX2VycnMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQkxLU19DT1JSX0VSUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZmVjX2Jsa3NfY29ycl9lcnJzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0JMS1NfVU5DT1JSX0VSUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZmVjX2Jsa3NfdW5jb3JyX2VycnMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQ09SUl9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mZWNfY29ycl9ieXRlcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19DT1JSX1pFUk9FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mZWNfY29ycl96ZXJvZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQ09SUl9PTkVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZlY19jb3JyX29uZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9VTkRFUlNaX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT51bmRlcnN6X2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0VSUk9SU1pfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmVycm9yc3pfZnJhbWVzID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9HT09EX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+Z29vZF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfR09PRF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+Z29vZF9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9PVkVSU1pfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5vdmVyc3pfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX05PTl9GRUNfR09PRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPm5vbl9mZWNfZ29vZF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfTk9OX0ZFQ19HT09EX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5ub25fZmVjX2dvb2RfYnl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0dPT0RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mZWNfZ29vZF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0dPT0RfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZlY19nb29kX2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19GUkFNRVNfRVhDX0VSUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZlY19mcmFtZXNfZXhjX2VycnMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0JMS1NfTk9fRVJSUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZmVjX2Jsa3Nfbm9fZXJycykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQkxLU19DT1JSX0VSUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZlY19ibGtzX2NvcnJfZXJycykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQkxLU19VTkNPUlJfRVJSUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZmVjX2Jsa3NfdW5jb3JyX2VycnMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0NPUlJfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZlY19jb3JyX2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19DT1JSX1pFUk9FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZmVjX2NvcnJfemVyb2VzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19DT1JSX09ORVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZlY19jb3JyX29uZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfVU5ERVJTWl9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnVuZGVyc3pfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0VSUk9SU1pfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5lcnJvcnN6X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0dPT0RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0dPT0RfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfT1ZFUlNaX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9OT05fRkVDX0dPT0RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX05PTl9GRUNfR09PRF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfR09PRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0dPT0RfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0ZSQU1FU19FWENfRVJSUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQkxLU19OT19FUlJTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19CTEtTX0NPUlJfRVJSUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQkxLU19VTkNPUlJfRVJSUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQ09SUl9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQ09SUl9aRVJPRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0NPUlJfT05FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9VTkRFUlNaX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9FUlJPUlNaX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfR09PRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmdvb2RfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0dPT0RfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmdvb2RfYnl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfT1ZFUlNaX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+b3ZlcnN6X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9OT05fRkVDX0dPT0RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5ub25fZmVjX2dvb2RfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX05PTl9GRUNfR09PRF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+bm9uX2ZlY19nb29kX2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19HT09EX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZmVjX2dvb2RfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19HT09EX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mZWNfZ29vZF9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfRlJBTUVTX0VYQ19FUlJTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mZWNfZnJhbWVzX2V4Y19lcnJzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19CTEtTX05PX0VSUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZlY19ibGtzX25vX2VycnMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0JMS1NfQ09SUl9FUlJTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mZWNfYmxrc19jb3JyX2VycnMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0JMS1NfVU5DT1JSX0VSUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZlY19ibGtzX3VuY29ycl9lcnJzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19DT1JSX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mZWNfY29ycl9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQ09SUl9aRVJPRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZlY19jb3JyX3plcm9lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQ09SUl9PTkVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mZWNfY29ycl9vbmVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX1VOREVSU1pfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT51bmRlcnN6X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9FUlJPUlNaX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZXJyb3Jzel9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0dPT0RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9HT09EX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9PVkVSU1pfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9OT05fRkVDX0dPT0RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9OT05fRkVDX0dPT0RfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19HT09EX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0dPT0RfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19GUkFNRVNfRVhDX0VSUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19CTEtTX05PX0VSUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19CTEtTX0NPUlJfRVJSUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0JMS1NfVU5DT1JSX0VSUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19DT1JSX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQ09SUl9aRVJPRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19DT1JSX09ORVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX1VOREVSU1pfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9FUlJPUlNaX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNmZy50cmlnZ2VyLnR5cGUgPSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOworICAgICAgICB0aGlzLT5jZmcuc29hay5hY3RpdmVfc29ha190aW1lID0gMDsKKyAgICAgICAgdGhpcy0+Y2ZnLnNvYWsuY2xlYXJfc29ha190aW1lID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfcGFjaygmdGhpcy0+Y2ZnLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5jZmcpOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3VucGFjaygmdGhpcy0+Y2ZnLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2JvdW5kc19jaGVjaygmdGhpcy0+Y2ZnKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX0lEX0NGRzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXQgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9HT09EX0ZSQU1FUzsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfaWRfcGFjayh0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfaWRfdW5wYWNrKCZ0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0KQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0dPT0RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9HT09EX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9PVkVSU1pfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9OT05fRkVDX0dPT0RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9OT05fRkVDX0dPT0RfQllURVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19HT09EX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0dPT0RfQllURVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19GUkFNRVNfRVhDX0VSUlM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19CTEtTX05PX0VSUlM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19CTEtTX0NPUlJfRVJSUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0JMS1NfVU5DT1JSX0VSUlM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19DT1JSX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQ09SUl9aRVJPRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19DT1JSX09ORVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX1VOREVSU1pfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9FUlJPUlNaX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXQgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9HT09EX0ZSQU1FUzsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfaWRfcGFjayh0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfaWRfdW5wYWNrKCZ0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0KQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0dPT0RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9HT09EX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9PVkVSU1pfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9OT05fRkVDX0dPT0RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9OT05fRkVDX0dPT0RfQllURVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19HT09EX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0dPT0RfQllURVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19GUkFNRVNfRVhDX0VSUlM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19CTEtTX05PX0VSUlM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19CTEtTX0NPUlJfRVJSUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0JMS1NfVU5DT1JSX0VSUlM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19DT1JSX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQ09SUl9aRVJPRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19DT1JSX09ORVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX1VOREVSU1pfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9FUlJPUlNaX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0X2FsYXJtX2NsZWFyZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkID0gQkNNT1NfRkFMU0U7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fT05VXzFHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfS0VZX0lEX0VQT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfS0VZX0lEX0VQT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+ZXBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19LRVlfSURfRVBPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5X3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0tFWV9JRF9FUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+ZXBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19LRVlfSURfRVBPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXlfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0NGR19JRF9GRUNfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZmVjX3N0YXRlID0gQkNNT0xUX0VQT05fRkVDX0VOX1NUQVRFX0VOQUJMRUQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0NGR19JRF9QUkJTX0dFTkVSQVRPUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wcmJzX2dlbmVyYXRvci5wb2x5bm9tID0gQkNNT0xUX1BSQlNfUE9MWU5PTUlBTF9QUkJTXzc7CisgICAgICAgIHRoaXMtPnByYnNfZ2VuZXJhdG9yLmVycm9yX2luc2VydCA9IEJDTU9TX0ZBTFNFOworICAgICAgICB0aGlzLT5wcmJzX2dlbmVyYXRvci5pbnZlcnQgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgdGhpcy0+cHJic19nZW5lcmF0b3IuY29udHJvbCA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19DRkdfSURfRkVDX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fZmVjX2VuX3N0YXRlX3BhY2sodGhpcy0+ZmVjX3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfQ0ZHX0lEX1BSQlNfR0VORVJBVE9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZ19wYWNrKCZ0aGlzLT5wcmJzX2dlbmVyYXRvciwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19DRkdfSURfRkVDX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0NGR19JRF9QUkJTX0dFTkVSQVRPUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19DRkdfSURfRkVDX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fZmVjX2VuX3N0YXRlX3VucGFjaygmdGhpcy0+ZmVjX3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfQ0ZHX0lEX1BSQlNfR0VORVJBVE9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZ191bnBhY2soJnRoaXMtPnByYnNfZ2VuZXJhdG9yLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0NGR19JRF9GRUNfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0NGR19JRF9QUkJTX0dFTkVSQVRPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfQ0ZHX0lEX0ZFQ19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmZlY19zdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9GRUNfRU5fU1RBVEVfRElTQUJMRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0ZFQ19FTl9TVEFURV9FTkFCTEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19DRkdfSURfRkVDX1NUQVRFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19DRkdfSURfUFJCU19HRU5FUkFUT1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnX2JvdW5kc19jaGVjaygmdGhpcy0+cHJic19nZW5lcmF0b3IpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19DRkdfSURfUFJCU19HRU5FUkFUT1I7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Ynl0ZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU182NCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmFtZXNfNjQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU182NV8xMjcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZnJhbWVzXzY1XzEyNyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZnJhbWVzXzEyOF8yNTUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lc18yNTZfNTExID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZnJhbWVzXzUxMl8xMDIzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lc18xMDI0XzE1MTggPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZnJhbWVzXzE1MTlfMjA0NyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmFtZXNfMjA0OF80MDk1ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lc180MDk2XzkyMTYgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lc185MjE3XzE2MzgzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmJyb2FkY2FzdF9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0RBVEFfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZGF0YV9ieXRlcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5tdWx0aWNhc3RfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT51bmljYXN0X2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfT0FNX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9hbV9ieXRlcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfT0FNX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vYW1fZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9HQVRFX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5nYXRlX2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfTVBDUF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bXBjcF9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0FCT1JUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hYm9ydF9mcmFtZXMgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzY0KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXNfNjQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXNfNjVfMTI3KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZyYW1lc18xMjhfMjU1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZyYW1lc18yNTZfNTExKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXNfNTEyXzEwMjMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXNfMTAyNF8xNTE4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZnJhbWVzXzE1MTlfMjA0NykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZyYW1lc18yMDQ4XzQwOTUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXNfNDA5Nl85MjE2KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZyYW1lc185MjE3XzE2MzgzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+YnJvYWRjYXN0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0RBVEFfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmRhdGFfYnl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5tdWx0aWNhc3RfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnVuaWNhc3RfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfT0FNX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5vYW1fYnl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9PQU1fRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5vYW1fZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfR0FURV9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmdhdGVfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfTVBDUF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPm1wY3BfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfQUJPUlRfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5hYm9ydF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU182NCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU182NV8xMjcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxOCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0RBVEFfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9PQU1fQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9PQU1fRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfR0FURV9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9NUENQX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0FCT1JUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmJ5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNjQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZyYW1lc182NCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU182NV8xMjcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZyYW1lc182NV8xMjcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzEyOF8yNTUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzI1Nl81MTEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZyYW1lc181MTJfMTAyMykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZyYW1lc18xMDI0XzE1MTgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mcmFtZXNfMTUxOV8yMDQ3KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzIwNDhfNDA5NSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTYpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZyYW1lc180MDk2XzkyMTYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzkyMTdfMTYzODMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5icm9hZGNhc3RfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfREFUQV9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZGF0YV9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPm11bHRpY2FzdF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dW5pY2FzdF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9PQU1fQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPm9hbV9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX09BTV9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPm9hbV9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9HQVRFX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+Z2F0ZV9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9NUENQX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+bXBjcF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9BQk9SVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmFib3J0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNjQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzY1XzEyNykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxOCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0RBVEFfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9PQU1fQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfT0FNX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9HQVRFX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9NUENQX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9BQk9SVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jZmcudHJpZ2dlci50eXBlID0gQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfTk9ORTsKKyAgICAgICAgdGhpcy0+Y2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSA9IDA7CisgICAgICAgIHRoaXMtPmNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3BhY2soJnRoaXMtPmNmZywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ19nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+Y2ZnKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ191bnBhY2soJnRoaXMtPmNmZywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ19zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ19ib3VuZHNfY2hlY2soJnRoaXMtPmNmZykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQ0ZHX0lEX0NGRzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXQgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0JZVEVTOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2lkX3BhY2sodGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfaWRfdW5wYWNrKCZ0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0KQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfQllURVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU182NDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfREFUQV9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX09BTV9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9PQU1fRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0dBVEVfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX01QQ1BfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0FCT1JUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfQllURVM7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfaWRfcGFjayh0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9pZF91bnBhY2soJnRoaXMtPnN0YXQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnN0YXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzY0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU182NV8xMjc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTg6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9EQVRBX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfT0FNX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX09BTV9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfR0FURV9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfTVBDUF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfQUJPUlRfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkID0gQkNNT1NfRkFMU0U7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhdF9hbGFybV9yYWlzZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnN0YXRfYWxhcm1fY2xlYXJlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfS0VZX0lEX0VQT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfS0VZX0lEX0VQT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+ZXBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19LRVlfSURfRVBPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5X3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0tFWV9JRF9FUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+ZXBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19LRVlfSURfRVBPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXlfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0NGR19JRF9GRUNfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZmVjX3N0YXRlID0gQkNNT0xUX0VQT05fRkVDX0VOX1NUQVRFX0VOQUJMRUQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0NGR19JRF9TWU5DX1RJTUVfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3luY190aW1lX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMzI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0NGR19JRF9QUkJTX0NIRUNLRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cHJic19jaGVja2VyLnBvbHlub20gPSBCQ01PTFRfUFJCU19QT0xZTk9NSUFMX1BSQlNfNzsKKyAgICAgICAgdGhpcy0+cHJic19jaGVja2VyLm1vZGUgPSBCQ01PTFRfUFJCU19DSEVDS0VSX01PREVfU0VMRl9TWU5DOworICAgICAgICB0aGlzLT5wcmJzX2NoZWNrZXIuZGF0YV9pbnZlcnQgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgdGhpcy0+cHJic19jaGVja2VyLmNvbnRyb2wgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfUFJCU19TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cHJic19zdGF0dXMubG9ja19zdGF0ZSA9IEJDTU9MVF9QUkJTX0xPQ0tfU1RBVEVfVU5MT0NLRUQ7CisgICAgICAgIHRoaXMtPnByYnNfc3RhdHVzLmVycm9yX2NvdW50cyA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfRkVDX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fZmVjX2VuX3N0YXRlX3BhY2sodGhpcy0+ZmVjX3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX1NZTkNfVElNRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzLT5zeW5jX3RpbWVfdHEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnX3BhY2soJnRoaXMtPnByYnNfY2hlY2tlciwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0NGR19JRF9QUkJTX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wcmJzX3N0YXR1c19wYWNrKCZ0aGlzLT5wcmJzX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfRkVDX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0NGR19JRF9TWU5DX1RJTUVfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfUFJCU19TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX0ZFQ19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2ZlY19lbl9zdGF0ZV91bnBhY2soJnRoaXMtPmZlY19zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0NGR19JRF9TWU5DX1RJTUVfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgKHVpbnQzMl90ICopICZ0aGlzLT5zeW5jX3RpbWVfdHEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnX3VucGFjaygmdGhpcy0+cHJic19jaGVja2VyLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfUFJCU19TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcHJic19zdGF0dXNfdW5wYWNrKCZ0aGlzLT5wcmJzX3N0YXR1cywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfRkVDX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfU1lOQ19USU1FX1RRKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfUFJCU19DSEVDS0VSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfUFJCU19TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0NGR19JRF9GRUNfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5mZWNfc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fRkVDX0VOX1NUQVRFX0RJU0FCTEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9GRUNfRU5fU1RBVEVfRU5BQkxFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX0ZFQ19TVEFURTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX1NZTkNfVElNRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+c3luY190aW1lX3RxID4gKGJjbW9sdF90aW1lX3F1YW50YSkgNjU1MzVVTCkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX1NZTkNfVElNRV9UUTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfUFJCU19DSEVDS0VSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWdfYm91bmRzX2NoZWNrKCZ0aGlzLT5wcmJzX2NoZWNrZXIpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfUFJCU19DSEVDS0VSOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0NGR19JRF9QUkJTX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wcmJzX3N0YXR1c19ib3VuZHNfY2hlY2soJnRoaXMtPnByYnNfc3RhdHVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX1BSQlNfU1RBVFVTOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmJ5dGVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfNjQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZnJhbWVzXzY0ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lc182NV8xMjcgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lc18xMjhfMjU1ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmFtZXNfMjU2XzUxMSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lc181MTJfMTAyMyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxOCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmFtZXNfMTAyNF8xNTE4ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lc18xNTE5XzIwNDcgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZnJhbWVzXzIwNDhfNDA5NSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmFtZXNfNDA5Nl85MjE2ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmFtZXNfOTIxN18xNjM4MyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5icm9hZGNhc3RfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9EQVRBX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRhdGFfYnl0ZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bXVsdGljYXN0X2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dW5pY2FzdF9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX01QQ1BfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm1wY3BfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9PQU1fQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b2FtX2J5dGVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9PQU1fRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9hbV9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX1JFUE9SVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmVwb3J0X2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfQUJPUlRfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFib3J0X2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRkNTX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZjc19lcnJvciA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfQ1JDXzhfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Y3JjXzhfZXJyb3IgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX09VVF9PRl9TTE9UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm91dF9vZl9zbG90ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9PVkVSU0laRV9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vdmVyc2l6ZV9lcnJvciA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfUlVOVF9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5ydW50X2Vycm9yID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+Ynl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU182NCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZnJhbWVzXzY0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzY1XzEyNykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZnJhbWVzXzY1XzEyNykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXNfMTI4XzI1NSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXNfMjU2XzUxMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZnJhbWVzXzUxMl8xMDIzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxOCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZnJhbWVzXzEwMjRfMTUxOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZyYW1lc18xNTE5XzIwNDcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXNfMjA0OF80MDk1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZnJhbWVzXzQwOTZfOTIxNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXNfOTIxN18xNjM4MykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmJyb2FkY2FzdF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9EQVRBX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5kYXRhX2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+bXVsdGljYXN0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51bmljYXN0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX01QQ1BfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5tcGNwX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX09BTV9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+b2FtX2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfT0FNX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+b2FtX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX1JFUE9SVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJlcG9ydF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9BQk9SVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmFib3J0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZDU19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZmNzX2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfQ1JDXzhfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmNyY184X2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfT1VUX09GX1NMT1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPm91dF9vZl9zbG90KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfT1ZFUlNJWkVfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPm92ZXJzaXplX2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfUlVOVF9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnVudF9lcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzY0KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzY1XzEyNykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfREFUQV9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX01QQ1BfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfT0FNX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfT0FNX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX1JFUE9SVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9BQk9SVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GQ1NfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9DUkNfOF9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX09VVF9PRl9TTE9UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfT1ZFUlNJWkVfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9SVU5UX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+Ynl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU182NCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzY0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzY1XzEyNykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzY1XzEyNykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mcmFtZXNfMTI4XzI1NSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mcmFtZXNfMjU2XzUxMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzUxMl8xMDIzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxOCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzEwMjRfMTUxOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZyYW1lc18xNTE5XzIwNDcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mcmFtZXNfMjA0OF80MDk1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzQwOTZfOTIxNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mcmFtZXNfOTIxN18xNjM4MykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmJyb2FkY2FzdF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9EQVRBX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5kYXRhX2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+bXVsdGljYXN0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT51bmljYXN0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX01QQ1BfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5tcGNwX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX09BTV9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+b2FtX2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfT0FNX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+b2FtX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX1JFUE9SVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJlcG9ydF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9BQk9SVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmFib3J0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZDU19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZmNzX2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfQ1JDXzhfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmNyY184X2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfT1VUX09GX1NMT1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPm91dF9vZl9zbG90KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfT1ZFUlNJWkVfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPm92ZXJzaXplX2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfUlVOVF9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnVudF9lcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfNjQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzY1XzEyNykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxOCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0RBVEFfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9NUENQX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9PQU1fQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfT0FNX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9SRVBPUlRfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0FCT1JUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GQ1NfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfQ1JDXzhfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfT1VUX09GX1NMT1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfT1ZFUlNJWkVfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfUlVOVF9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNmZy50cmlnZ2VyLnR5cGUgPSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOworICAgICAgICB0aGlzLT5jZmcuc29hay5hY3RpdmVfc29ha190aW1lID0gMDsKKyAgICAgICAgdGhpcy0+Y2ZnLnNvYWsuY2xlYXJfc29ha190aW1lID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfcGFjaygmdGhpcy0+Y2ZnLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5jZmcpOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3VucGFjaygmdGhpcy0+Y2ZnLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2JvdW5kc19jaGVjaygmdGhpcy0+Y2ZnKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfSURfQ0ZHOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfQllURVM7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfaWRfcGFjayh0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZF91bnBhY2soJnRoaXMtPnN0YXQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnN0YXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzY0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU182NV8xMjc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTg6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9EQVRBX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfTVBDUF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfT0FNX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX09BTV9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfUkVQT1JUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9BQk9SVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRkNTX0VSUk9SOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0NSQ184X0VSUk9SOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX09VVF9PRl9TTE9UOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX09WRVJTSVpFX0VSUk9SOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX1JVTlRfRVJST1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXQgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0JZVEVTOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2lkX3BhY2sodGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfaWRfdW5wYWNrKCZ0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0KQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfQllURVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU182NDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfREFUQV9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX01QQ1BfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX09BTV9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9PQU1fRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX1JFUE9SVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfQUJPUlRfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZDU19FUlJPUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9DUkNfOF9FUlJPUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9PVVRfT0ZfU0xPVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9PVkVSU0laRV9FUlJPUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9SVU5UX0VSUk9SOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkID0gQkNNT1NfRkFMU0U7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhdF9hbGFybV9yYWlzZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnN0YXRfYWxhcm1fY2xlYXJlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfS0VZX0lEX0VQT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5X3BhY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfS0VZX0lEX0VQT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+ZXBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19LRVlfSURfRVBPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXlfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0tFWV9JRF9FUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+ZXBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfS0VZX0lEX0VQT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19DRkdfSURfREVGQVVMVF9GRUNfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZGVmYXVsdF9mZWNfc3RhdGUgPSBCQ01PTFRfRVBPTl9GRUNfRU5fU1RBVEVfRElTQUJMRUQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQ0ZHX0lEX1JBTUFOX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmFtYW5fbW9kZSA9IEJDTU9MVF9SQU1BTl9NSVRJR0FUSU9OX01PREVfRElTQUJMRUQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQ0ZHX0lEX1RVUkJPXzJHX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHVyYm9fMmdfbW9kZSA9IEJDTU9MVF9FUE9OXzFHX1RVUkJPX01PREVfRElTQUJMRUQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQ0ZHX0lEX1BSQlNfR0VORVJBVE9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnByYnNfZ2VuZXJhdG9yLnBvbHlub20gPSBCQ01PTFRfUFJCU19QT0xZTk9NSUFMX1BSQlNfNzsKKyAgICAgICAgdGhpcy0+cHJic19nZW5lcmF0b3IuZXJyb3JfaW5zZXJ0ID0gQkNNT1NfRkFMU0U7CisgICAgICAgIHRoaXMtPnByYnNfZ2VuZXJhdG9yLmludmVydCA9IEJDTU9TX0ZBTFNFOworICAgICAgICB0aGlzLT5wcmJzX2dlbmVyYXRvci5jb250cm9sID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9ERUZBVUxUX0ZFQ19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2ZlY19lbl9zdGF0ZV9wYWNrKHRoaXMtPmRlZmF1bHRfZmVjX3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19DRkdfSURfUkFNQU5fTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yYW1hbl9taXRpZ2F0aW9uX21vZGVfcGFjayh0aGlzLT5yYW1hbl9tb2RlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19DRkdfSURfVFVSQk9fMkdfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uXzFnX3R1cmJvX21vZGVfcGFjayh0aGlzLT50dXJib18yZ19tb2RlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19DRkdfSURfUFJCU19HRU5FUkFUT1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnX3BhY2soJnRoaXMtPnByYnNfZ2VuZXJhdG9yLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9ERUZBVUxUX0ZFQ19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9SQU1BTl9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQ0ZHX0lEX1RVUkJPXzJHX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19DRkdfSURfUFJCU19HRU5FUkFUT1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQ0ZHX0lEX0RFRkFVTFRfRkVDX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fZmVjX2VuX3N0YXRlX3VucGFjaygmdGhpcy0+ZGVmYXVsdF9mZWNfc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9SQU1BTl9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3JhbWFuX21pdGlnYXRpb25fbW9kZV91bnBhY2soJnRoaXMtPnJhbWFuX21vZGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9UVVJCT18yR19NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fMWdfdHVyYm9fbW9kZV91bnBhY2soJnRoaXMtPnR1cmJvXzJnX21vZGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9QUkJTX0dFTkVSQVRPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWdfdW5wYWNrKCZ0aGlzLT5wcmJzX2dlbmVyYXRvciwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQ0ZHX0lEX0RFRkFVTFRfRkVDX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9SQU1BTl9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9UVVJCT18yR19NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9QUkJTX0dFTkVSQVRPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19DRkdfSURfREVGQVVMVF9GRUNfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5kZWZhdWx0X2ZlY19zdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9GRUNfRU5fU1RBVEVfRElTQUJMRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0ZFQ19FTl9TVEFURV9FTkFCTEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9ERUZBVUxUX0ZFQ19TVEFURTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19DRkdfSURfUkFNQU5fTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnJhbWFuX21vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JBTUFOX01JVElHQVRJT05fTU9ERV9ESVNBQkxFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JBTUFOX01JVElHQVRJT05fTU9ERV9SQU5ET006CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SQU1BTl9NSVRJR0FUSU9OX01PREVfRklYRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQ0ZHX0lEX1JBTUFOX01PREU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQ0ZHX0lEX1RVUkJPXzJHX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT50dXJib18yZ19tb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OXzFHX1RVUkJPX01PREVfRElTQUJMRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OXzFHX1RVUkJPX01PREVfRU5BQkxFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19DRkdfSURfVFVSQk9fMkdfTU9ERTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19DRkdfSURfUFJCU19HRU5FUkFUT1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnX2JvdW5kc19jaGVjaygmdGhpcy0+cHJic19nZW5lcmF0b3IpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9QUkJTX0dFTkVSQVRPUjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5ieXRlcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU182NCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmFtZXNfNjQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzY1XzEyNykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmFtZXNfNjVfMTI3ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lc18xMjhfMjU1ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lc18yNTZfNTExID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmFtZXNfNTEyXzEwMjMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxOCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmFtZXNfMTAyNF8xNTE4ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZnJhbWVzXzE1MTlfMjA0NyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lc18yMDQ4XzQwOTUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmFtZXNfNDA5Nl85MjE2ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lc185MjE3XzE2MzgzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YnJvYWRjYXN0X2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9EQVRBX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRhdGFfYnl0ZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5tdWx0aWNhc3RfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnVuaWNhc3RfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX09BTV9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vYW1fYnl0ZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfT0FNX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vYW1fZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0dBVEVfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmdhdGVfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX01QQ1BfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm1wY3BfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0FCT1JUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hYm9ydF9mcmFtZXMgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU182NCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZnJhbWVzXzY0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXNfNjVfMTI3KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZnJhbWVzXzEyOF8yNTUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXNfMjU2XzUxMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXNfNTEyXzEwMjMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZyYW1lc18xMDI0XzE1MTgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZyYW1lc18xNTE5XzIwNDcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZyYW1lc18yMDQ4XzQwOTUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTYpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZyYW1lc180MDk2XzkyMTYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXNfOTIxN18xNjM4MykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+YnJvYWRjYXN0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfREFUQV9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZGF0YV9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+bXVsdGljYXN0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnVuaWNhc3RfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9PQU1fQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPm9hbV9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfT0FNX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+b2FtX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfR0FURV9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmdhdGVfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9NUENQX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+bXBjcF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0FCT1JUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+YWJvcnRfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzY0KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxOCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0RBVEFfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9PQU1fQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX09BTV9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0dBVEVfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9NUENQX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfQUJPUlRfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+Ynl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfNjQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZyYW1lc182NCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzY1XzEyNykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzY1XzEyNykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZyYW1lc18xMjhfMjU1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzI1Nl81MTEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzUxMl8xMDIzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mcmFtZXNfMTAyNF8xNTE4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mcmFtZXNfMTUxOV8yMDQ3KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mcmFtZXNfMjA0OF80MDk1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mcmFtZXNfNDA5Nl85MjE2KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzkyMTdfMTYzODMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmJyb2FkY2FzdF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0RBVEFfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmRhdGFfYnl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPm11bHRpY2FzdF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT51bmljYXN0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfT0FNX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5vYW1fYnl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX09BTV9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPm9hbV9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0dBVEVfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5nYXRlX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfTVBDUF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPm1wY3BfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9BQk9SVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmFib3J0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU182NCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU182NV8xMjcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxOCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0RBVEFfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9PQU1fQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9PQU1fRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfR0FURV9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9NUENQX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0FCT1JUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNmZy50cmlnZ2VyLnR5cGUgPSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOworICAgICAgICB0aGlzLT5jZmcuc29hay5hY3RpdmVfc29ha190aW1lID0gMDsKKyAgICAgICAgdGhpcy0+Y2ZnLnNvYWsuY2xlYXJfc29ha190aW1lID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfcGFjaygmdGhpcy0+Y2ZnLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5jZmcpOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3VucGFjaygmdGhpcy0+Y2ZnLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ19zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2JvdW5kc19jaGVjaygmdGhpcy0+Y2ZnKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0NGR19JRF9DRkc7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0ID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0JZVEVTOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfaWRfcGFjayh0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2lkX3VucGFjaygmdGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfQllURVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfNjQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTg6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9EQVRBX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfT0FNX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfT0FNX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0dBVEVfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfTVBDUF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9BQk9SVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9CWVRFUzsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2lkX3BhY2sodGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9pZF91bnBhY2soJnRoaXMtPnN0YXQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnN0YXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzY0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzY1XzEyNzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfREFUQV9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX09BTV9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX09BTV9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9HQVRFX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX01QQ1BfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfQUJPUlRfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0X2FsYXJtX2NsZWFyZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0X2FsYXJtX3JhaXNlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnN0YXRfYWxhcm1fY2xlYXJlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhdF9hbGFybV9yYWlzZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zdGF0X2FsYXJtX3JhaXNlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0tFWV9JRF9FUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0tFWV9JRF9FUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPmVwb25fbmkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfS0VZX0lEX0VQT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5X3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19LRVlfSURfRVBPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPmVwb25fbmkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0tFWV9JRF9FUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQ0ZHX0lEX0RFRkFVTFRfRkVDX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRlZmF1bHRfZmVjX3N0YXRlID0gQkNNT0xUX0VQT05fRkVDX0VOX1NUQVRFX0RJU0FCTEVEOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0NGR19JRF9TWU5DX1RJTUVfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3luY190aW1lX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMzI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wcmJzX2NoZWNrZXIucG9seW5vbSA9IEJDTU9MVF9QUkJTX1BPTFlOT01JQUxfUFJCU183OworICAgICAgICB0aGlzLT5wcmJzX2NoZWNrZXIubW9kZSA9IEJDTU9MVF9QUkJTX0NIRUNLRVJfTU9ERV9TRUxGX1NZTkM7CisgICAgICAgIHRoaXMtPnByYnNfY2hlY2tlci5kYXRhX2ludmVydCA9IEJDTU9TX0ZBTFNFOworICAgICAgICB0aGlzLT5wcmJzX2NoZWNrZXIuY29udHJvbCA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQ0ZHX0lEX1BSQlNfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnByYnNfc3RhdHVzLmxvY2tfc3RhdGUgPSBCQ01PTFRfUFJCU19MT0NLX1NUQVRFX1VOTE9DS0VEOworICAgICAgICB0aGlzLT5wcmJzX3N0YXR1cy5lcnJvcl9jb3VudHMgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQ0ZHX0lEX0RFRkFVTFRfRkVDX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fZmVjX2VuX3N0YXRlX3BhY2sodGhpcy0+ZGVmYXVsdF9mZWNfc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0NGR19JRF9TWU5DX1RJTUVfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcy0+c3luY190aW1lX3RxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnX3BhY2soJnRoaXMtPnByYnNfY2hlY2tlciwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQ0ZHX0lEX1BSQlNfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3ByYnNfc3RhdHVzX3BhY2soJnRoaXMtPnByYnNfc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0NGR19JRF9ERUZBVUxUX0ZFQ19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0NGR19JRF9TWU5DX1RJTUVfVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19DRkdfSURfUFJCU19DSEVDS0VSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQ0ZHX0lEX1BSQlNfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDU7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0NGR19JRF9ERUZBVUxUX0ZFQ19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX2ZlY19lbl9zdGF0ZV91bnBhY2soJnRoaXMtPmRlZmF1bHRfZmVjX3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19DRkdfSURfU1lOQ19USU1FX1RRKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICh1aW50MzJfdCAqKSAmdGhpcy0+c3luY190aW1lX3RxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnX3VucGFjaygmdGhpcy0+cHJic19jaGVja2VyLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0NGR19JRF9QUkJTX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wcmJzX3N0YXR1c191bnBhY2soJnRoaXMtPnByYnNfc3RhdHVzLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19DRkdfSURfREVGQVVMVF9GRUNfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQ0ZHX0lEX1NZTkNfVElNRV9UUSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19DRkdfSURfUFJCU19DSEVDS0VSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0NGR19JRF9QUkJTX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19DRkdfSURfREVGQVVMVF9GRUNfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5kZWZhdWx0X2ZlY19zdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9GRUNfRU5fU1RBVEVfRElTQUJMRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0ZFQ19FTl9TVEFURV9FTkFCTEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0NGR19JRF9ERUZBVUxUX0ZFQ19TVEFURTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19DRkdfSURfU1lOQ19USU1FX1RRKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5zeW5jX3RpbWVfdHEgPiAoYmNtb2x0X3RpbWVfcXVhbnRhKSA2NTUzNVVMKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0NGR19JRF9TWU5DX1RJTUVfVFE7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19DRkdfSURfUFJCU19DSEVDS0VSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWdfYm91bmRzX2NoZWNrKCZ0aGlzLT5wcmJzX2NoZWNrZXIpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0NGR19JRF9QUkJTX0NIRUNLRVI7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19DRkdfSURfUFJCU19TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcHJic19zdGF0dXNfYm91bmRzX2NoZWNrKCZ0aGlzLT5wcmJzX3N0YXR1cykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQ0ZHX0lEX1BSQlNfU1RBVFVTOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmJ5dGVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzY0KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lc182NCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lc182NV8xMjcgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZnJhbWVzXzEyOF8yNTUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZnJhbWVzXzI1Nl81MTEgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lc181MTJfMTAyMyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lc18xMDI0XzE1MTggPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmFtZXNfMTUxOV8yMDQ3ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZnJhbWVzXzIwNDhfNDA5NSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZyYW1lc180MDk2XzkyMTYgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZnJhbWVzXzkyMTdfMTYzODMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5icm9hZGNhc3RfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0RBVEFfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZGF0YV9ieXRlcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm11bHRpY2FzdF9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dW5pY2FzdF9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfTVBDUF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bXBjcF9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfT0FNX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9hbV9ieXRlcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9PQU1fRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9hbV9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfUkVQT1JUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yZXBvcnRfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0FCT1JUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hYm9ydF9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRkNTX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZjc19lcnJvciA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9DUkNfOF9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jcmNfOF9lcnJvciA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9PVVRfT0ZfU0xPVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vdXRfb2Zfc2xvdCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9PVkVSU0laRV9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vdmVyc2l6ZV9lcnJvciA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9SVU5UX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ1bnRfZXJyb3IgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU182NCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZnJhbWVzXzY0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXNfNjVfMTI3KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZnJhbWVzXzEyOF8yNTUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXNfMjU2XzUxMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXNfNTEyXzEwMjMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZyYW1lc18xMDI0XzE1MTgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZyYW1lc18xNTE5XzIwNDcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZyYW1lc18yMDQ4XzQwOTUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTYpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZyYW1lc180MDk2XzkyMTYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mcmFtZXNfOTIxN18xNjM4MykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+YnJvYWRjYXN0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfREFUQV9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZGF0YV9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+bXVsdGljYXN0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnVuaWNhc3RfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9NUENQX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+bXBjcF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX09BTV9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+b2FtX2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9PQU1fRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5vYW1fZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9SRVBPUlRfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yZXBvcnRfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9BQk9SVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmFib3J0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRkNTX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mY3NfZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0NSQ184X0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5jcmNfOF9lcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfT1VUX09GX1NMT1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPm91dF9vZl9zbG90KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9PVkVSU0laRV9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+b3ZlcnNpemVfZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX1JVTlRfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ1bnRfZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfNjQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU182NV8xMjcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfREFUQV9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX01QQ1BfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9PQU1fQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX09BTV9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX1JFUE9SVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0FCT1JUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRkNTX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9DUkNfOF9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfT1VUX09GX1NMT1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX09WRVJTSVpFX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9SVU5UX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+Ynl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfNjQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZyYW1lc182NCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzY1XzEyNykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzY1XzEyNykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZyYW1lc18xMjhfMjU1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzI1Nl81MTEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzUxMl8xMDIzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mcmFtZXNfMTAyNF8xNTE4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mcmFtZXNfMTUxOV8yMDQ3KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mcmFtZXNfMjA0OF80MDk1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mcmFtZXNfNDA5Nl85MjE2KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZnJhbWVzXzkyMTdfMTYzODMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmJyb2FkY2FzdF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0RBVEFfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmRhdGFfYnl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPm11bHRpY2FzdF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT51bmljYXN0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfTVBDUF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPm1wY3BfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9PQU1fQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPm9hbV9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfT0FNX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+b2FtX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfUkVQT1JUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cmVwb3J0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfQUJPUlRfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5hYm9ydF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZDU19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZmNzX2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9DUkNfOF9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+Y3JjXzhfZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX09VVF9PRl9TTE9UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5vdXRfb2Zfc2xvdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfT1ZFUlNJWkVfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPm92ZXJzaXplX2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9SVU5UX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5ydW50X2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzY0KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzY1XzEyNykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfREFUQV9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX01QQ1BfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfT0FNX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfT0FNX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX1JFUE9SVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9BQk9SVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GQ1NfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9DUkNfOF9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX09VVF9PRl9TTE9UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfT1ZFUlNJWkVfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9SVU5UX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Y2ZnLnRyaWdnZXIudHlwZSA9IEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX05PTkU7CisgICAgICAgIHRoaXMtPmNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgPSAwOworICAgICAgICB0aGlzLT5jZmcuc29hay5jbGVhcl9zb2FrX3RpbWUgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ19wYWNrKCZ0aGlzLT5jZmcsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSBiY21vbHRfc3RhdF9hbGFybV9jb25maWdfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmNmZyk7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfdW5wYWNrKCZ0aGlzLT5jZmcsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfYm91bmRzX2NoZWNrKCZ0aGlzLT5jZmcpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQ0ZHX0lEX0NGRzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXQgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfQllURVM7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9pZF9wYWNrKHRoaXMtPnN0YXQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWRfdW5wYWNrKCZ0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0KQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU182NDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU182NV8xMjc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxODoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0RBVEFfQllURVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9NUENQX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX09BTV9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX09BTV9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9SRVBPUlRfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfQUJPUlRfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRkNTX0VSUk9SOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfQ1JDXzhfRVJST1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9PVVRfT0ZfU0xPVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX09WRVJTSVpFX0VSUk9SOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfUlVOVF9FUlJPUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0ID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0JZVEVTOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWRfcGFjayh0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2lkX3VucGFjaygmdGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfQllURVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfNjQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTg6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9EQVRBX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfTVBDUF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9PQU1fQllURVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9PQU1fRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfUkVQT1JUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0FCT1JUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZDU19FUlJPUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0NSQ184X0VSUk9SOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfT1VUX09GX1NMT1Q6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9PVkVSU0laRV9FUlJPUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX1JVTlRfRVJST1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXRfYWxhcm1fY2xlYXJlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkID0gQkNNT1NfRkFMU0U7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5zdGF0X2FsYXJtX3JhaXNlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zdGF0X2FsYXJtX2NsZWFyZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9ycF9rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fcnBfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfS0VZX0lEX0VQT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfS0VZX0lEX0xJTktfUkFURSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5saW5rX3JhdGUgPSBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfVEVOX1RFTjsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3JwX2tleV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX3JwX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfS0VZX0lEX0VQT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+ZXBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9SUF9LRVlfSURfTElOS19SQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fbGlua19yYXRlX3BhY2sodGhpcy0+bGlua19yYXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3JwX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9ycF9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfS0VZX0lEX0VQT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfS0VZX0lEX0xJTktfUkFURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcnBfa2V5X3VucGFjayhiY21vbHRfZXBvbl9ycF9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1JQX0tFWV9JRF9FUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+ZXBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9SUF9LRVlfSURfTElOS19SQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fbGlua19yYXRlX3VucGFjaygmdGhpcy0+bGlua19yYXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcnBfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfS0VZX0lEX0VQT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1JQX0tFWV9JRF9MSU5LX1JBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3JwX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fcnBfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fcnBfa2V5X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfS0VZX0lEX0xJTktfUkFURSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmxpbmtfcmF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfVEVOX1RFTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19SQVRFX1RFTl9PTkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfUkFURV9PTkVfT05FOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfRVBPTl9SUF9LRVlfSURfTElOS19SQVRFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZXBvbl9ycF9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9ycF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9CQVNFX0xMSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YmFzZV9sbGlkID0gKGJjbW9sdF9lcG9uX2xsaWQpIDE1MzYwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9SUF9DRkdfSURfTVBDUF9ESVNDX0VOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm1wY3BfZGlzY19lbiA9IEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9NUENQX0RJU0NfR05UX0xFTl9UUSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5tcGNwX2Rpc2NfZ250X2xlbl90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIDgxNjA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9NUENQX1JFUE9SVF9USU1FT1VUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm1wY3BfcmVwb3J0X3RpbWVvdXQgPSA1MDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01BWF9NUENQX1JFR19QRVJfRElTQ19XSU5ET1cpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bWF4X21wY3BfcmVnX3Blcl9kaXNjX3dpbmRvdyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9NQVhfTElOS1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bWF4X2xpbmtzID0gMjU2OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9SUF9DRkdfSURfREVGQVVMVF9VUFNUUkVBTV9CQU5EV0lEVEgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgucG9sbGluZ19pbnRlcnZhbF91cyA9IEJDTU9MVF9QT0xMSU5HX0lOVEVSVkFMX0FVVE9NQVRJQzsKKyAgICAgICAgdGhpcy0+ZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGguZ3JhbnRfdGhyZXNob2xkX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICAgICAgdGhpcy0+ZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgubWluX3NjaGVkdWxlcnNoYXBlci5iYW5kd2lkdGhfS2JwcyA9IChiY21vbHRfYmFuZHdpZHRoX0ticHMpIDA7CisgICAgICAgIHRoaXMtPmRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLm1pbl9zY2hlZHVsZXJzaGFwZXIubWF4X2J1cnN0X3NpemVfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSAwOworICAgICAgICB0aGlzLT5kZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyLnByaW9yaXR5ID0gMDsKKyAgICAgICAgdGhpcy0+ZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgubWluX3NjaGVkdWxlcnNoYXBlci53ZWlnaHRfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSAwOworICAgICAgICB0aGlzLT5kZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5tYXhfc2NoZWR1bGVyc2hhcGVyLmJhbmR3aWR0aF9LYnBzID0gKGJjbW9sdF9iYW5kd2lkdGhfS2JwcykgMDsKKyAgICAgICAgdGhpcy0+ZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci5tYXhfYnVyc3Rfc2l6ZV90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIDA7CisgICAgICAgIHRoaXMtPmRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLm1heF9zY2hlZHVsZXJzaGFwZXIucHJpb3JpdHkgPSAwOworICAgICAgICB0aGlzLT5kZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5tYXhfc2NoZWR1bGVyc2hhcGVyLndlaWdodF90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIDA7CisgICAgICAgIHRoaXMtPmRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLnRkbV9ncmFudF9zaXplX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgMDsKKyAgICAgICAgdGhpcy0+ZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgudGRtX2dyYW50X2ludGVydmFsX3VzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX1JBVEVfT0ZfUkVGUkFDVElPTikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yYXRlX29mX3JlZnJhY3Rpb24gPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcnBfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9ycF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX0JBU0VfTExJRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5iYXNlX2xsaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01QQ1BfRElTQ19FTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPm1wY3BfZGlzY19lbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9SUF9DRkdfSURfTVBDUF9ESVNDX0dOVF9MRU5fVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcy0+bXBjcF9kaXNjX2dudF9sZW5fdHEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01QQ1BfUkVQT1JUX1RJTUVPVVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPm1wY3BfcmVwb3J0X3RpbWVvdXQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01BWF9NUENQX1JFR19QRVJfRElTQ19XSU5ET1cpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPm1heF9tcGNwX3JlZ19wZXJfZGlzY193aW5kb3cpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01BWF9MSU5LUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bWF4X2xpbmtzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9ERUZBVUxUX1VQU1RSRUFNX0JBTkRXSURUSCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF91cHN0cmVhbV9iYW5kd2lkdGhfZGlzdHJpYnV0aW9uX3BhY2soJnRoaXMtPmRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX1JBVEVfT0ZfUkVGUkFDVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfZG91YmxlKGJ1ZiwgdGhpcy0+cmF0ZV9vZl9yZWZyYWN0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9ycF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9ycF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9SUF9DRkdfSURfQkFTRV9MTElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9NUENQX0RJU0NfRU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01QQ1BfRElTQ19HTlRfTEVOX1RRKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9NUENQX1JFUE9SVF9USU1FT1VUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9NQVhfTVBDUF9SRUdfUEVSX0RJU0NfV0lORE9XKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9NQVhfTElOS1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX0RFRkFVTFRfVVBTVFJFQU1fQkFORFdJRFRIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9SUF9DRkdfSURfUkFURV9PRl9SRUZSQUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9ycF9jZmdfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fcnBfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9CQVNFX0xMSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5iYXNlX2xsaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01QQ1BfRElTQ19FTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPm1wY3BfZGlzY19lbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9SUF9DRkdfSURfTVBDUF9ESVNDX0dOVF9MRU5fVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgKHVpbnQzMl90ICopICZ0aGlzLT5tcGNwX2Rpc2NfZ250X2xlbl90cSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9SUF9DRkdfSURfTVBDUF9SRVBPUlRfVElNRU9VVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bXBjcF9yZXBvcnRfdGltZW91dCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9SUF9DRkdfSURfTUFYX01QQ1BfUkVHX1BFUl9ESVNDX1dJTkRPVykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bWF4X21wY3BfcmVnX3Blcl9kaXNjX3dpbmRvdykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9SUF9DRkdfSURfTUFYX0xJTktTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5tYXhfbGlua3MpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX0RFRkFVTFRfVVBTVFJFQU1fQkFORFdJRFRIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb25fdW5wYWNrKCZ0aGlzLT5kZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX1JBVEVfT0ZfUkVGUkFDVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9kb3VibGUoYnVmLCAmdGhpcy0+cmF0ZV9vZl9yZWZyYWN0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3JwX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX0JBU0VfTExJRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01QQ1BfRElTQ19FTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01QQ1BfRElTQ19HTlRfTEVOX1RRKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9SUF9DRkdfSURfTVBDUF9SRVBPUlRfVElNRU9VVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01BWF9NUENQX1JFR19QRVJfRElTQ19XSU5ET1cpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9NQVhfTElOS1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9ERUZBVUxUX1VQU1RSRUFNX0JBTkRXSURUSCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9SQVRFX09GX1JFRlJBQ1RJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3JwX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9ycF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX3JwX2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9CQVNFX0xMSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmJhc2VfbGxpZCA+IChiY21vbHRfZXBvbl9sbGlkKSAzMjUxMSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX0JBU0VfTExJRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfRVBPTl9SUF9DRkdfSURfTVBDUF9ESVNDX0dOVF9MRU5fVFEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPm1wY3BfZGlzY19nbnRfbGVuX3RxIDwgKGJjbW9sdF90aW1lX3F1YW50YSkgNSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01QQ1BfRElTQ19HTlRfTEVOX1RROworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRoaXMtPm1wY3BfZGlzY19nbnRfbGVuX3RxID4gKGJjbW9sdF90aW1lX3F1YW50YSkgNjU1MzVVTCkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01QQ1BfRElTQ19HTlRfTEVOX1RROworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9NQVhfTElOS1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPm1heF9saW5rcyA+IDIwNDYpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9NQVhfTElOS1M7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX0RFRkFVTFRfVVBTVFJFQU1fQkFORFdJRFRIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb25fYm91bmRzX2NoZWNrKCZ0aGlzLT5kZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9ERUZBVUxUX1VQU1RSRUFNX0JBTkRXSURUSDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bpb19rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2dwaW9fa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQSU9fS0VZX0lEX1JFU0VSVkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJlc2VydmVkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQSU9fS0VZX0lEX0dQSU9fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Z3Bpb19pZCA9IEJDTU9MVF9HUElPX1BJTl9QSU4wOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwaW9fa2V5X3BhY2soY29uc3QgYmNtb2x0X2dwaW9fa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BJT19LRVlfSURfUkVTRVJWRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnJlc2VydmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUElPX0tFWV9JRF9HUElPX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwaW9fcGluX3BhY2sodGhpcy0+Z3Bpb19pZCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bpb19rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwaW9fa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUElPX0tFWV9JRF9SRVNFUlZFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BJT19LRVlfSURfR1BJT19JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwaW9fa2V5X3VucGFjayhiY21vbHRfZ3Bpb19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUElPX0tFWV9JRF9SRVNFUlZFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+cmVzZXJ2ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQSU9fS0VZX0lEX0dQSU9fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bpb19waW5fdW5wYWNrKCZ0aGlzLT5ncGlvX2lkLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwaW9fa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQSU9fS0VZX0lEX1JFU0VSVkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BJT19LRVlfSURfR1BJT19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwaW9fa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bpb19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bpb19rZXlfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BJT19LRVlfSURfR1BJT19JRCkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmdwaW9faWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU40OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU43OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjExOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjE0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xNjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjE3OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMTg6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xOToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjIwOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4yMjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjIzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4yNToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjI2OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMjc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4yODoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjI5OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4zMToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjMyOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4zNDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjM1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4zNzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjM4OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOMzk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU40MDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjQxOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU40MzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjQ0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU40NjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjQ3OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONDg6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU40OToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjUwOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU41MjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjUzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU41NToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjU2OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONTc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU41ODoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjU5OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU42MToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjYyOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU42NDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjY1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU42NzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjY4OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONjk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU43MDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjcxOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU43MzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjc0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU43NjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjc3OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElONzg6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU43OToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjgwOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU44MjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjgzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU44NToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjg2OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOODc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU44ODoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjg5OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU45MToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjkyOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU45NDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjk1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU45NzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX1BJTjk4OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19QSU5fUElOOTk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9QSU4xMDY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1BJTl9VTkNPTkZJR1VSRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUElPX0tFWV9JRF9HUElPX0lEOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bpb19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bpb19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUElPX0NGR19JRF9ESVJFQ1RJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZGlyZWN0aW9uID0gQkNNT0xUX0dQSU9fUElOX0RJUl9JTlBVVDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQSU9fQ0ZHX0lEX1ZBTFVFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnZhbHVlID0gQkNNT0xUX0dQSU9fVkFMVUVfQ0xFQVI7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bpb19jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncGlvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BJT19DRkdfSURfRElSRUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwaW9fcGluX2Rpcl9wYWNrKHRoaXMtPmRpcmVjdGlvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUElPX0NGR19JRF9WQUxVRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncGlvX3ZhbHVlX3BhY2sodGhpcy0+dmFsdWUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwaW9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwaW9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQSU9fQ0ZHX0lEX0RJUkVDVElPTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BJT19DRkdfSURfVkFMVUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncGlvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZ3Bpb19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQSU9fQ0ZHX0lEX0RJUkVDVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncGlvX3Bpbl9kaXJfdW5wYWNrKCZ0aGlzLT5kaXJlY3Rpb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BJT19DRkdfSURfVkFMVUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bpb192YWx1ZV91bnBhY2soJnRoaXMtPnZhbHVlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwaW9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BJT19DRkdfSURfRElSRUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BJT19DRkdfSURfVkFMVUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncGlvX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bpb19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncGlvX2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUElPX0NGR19JRF9ESVJFQ1RJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5kaXJlY3Rpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX0RJUl9JTlBVVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQSU9fUElOX0RJUl9PVVRQVVQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUElPX0NGR19JRF9ESVJFQ1RJT047CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUElPX0NGR19JRF9WQUxVRSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUElPX1ZBTFVFX0NMRUFSOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BJT19WQUxVRV9TRVQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUElPX0NGR19JRF9WQUxVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fYWxsb2Nfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2FsbG9jX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19LRVlfSURfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWxsb2NfaWQgPSAoYmNtb2x0X2dwb25fYWxsb2NfaWQpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19rZXlfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMtPnBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19LRVlfSURfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+YWxsb2NfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2FsbG9jX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19LRVlfSURfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX2tleV91bnBhY2soYmNtb2x0X2dwb25fYWxsb2Nfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgKHVpbnQ4X3QgKikgJnRoaXMtPnBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19LRVlfSURfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5hbGxvY19pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19LRVlfSURfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fYWxsb2Nfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fYWxsb2Nfa2V5X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+cG9uX25pID4gKGJjbW9sdF9ncG9uX25pKSAxNSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fQUxMT0NfS0VZX0lEX1BPTl9OSTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19LRVlfSURfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmFsbG9jX2lkID4gKGJjbW9sdF9ncG9uX2FsbG9jX2lkKSA0MDk1KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9BTExPQ19LRVlfSURfQUxMT0NfSUQ7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19DRkdfSURfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdGUgPSBCQ01PTFRfQUxMT0NfU1RBVEVfTk9UX0NPTkZJR1VSRUQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0NGR19JRF9TTEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c2xhLmNicl9ydF9idyA9IDA7CisgICAgICAgIHRoaXMtPnNsYS5jYnJfbnJ0X2J3ID0gMDsKKyAgICAgICAgdGhpcy0+c2xhLmd1YXJhbnRlZWRfYncgPSAwOworICAgICAgICB0aGlzLT5zbGEubWF4aW11bV9idyA9IDA7CisgICAgICAgIHRoaXMtPnNsYS5hZGRpdGlvbmFsX2J3X2VsaWdpYmlsaXR5ID0gQkNNT0xUX0FERElUSU9OQUxfQldfRUxJR0lCSUxJVFlfTk9ORTsKKyAgICAgICAgdGhpcy0+c2xhLmNicl9ydF9jb21wZW5zYXRpb24gPSBCQ01PU19GQUxTRTsKKyAgICAgICAgdGhpcy0+c2xhLmNicl9ydF9hcF9pbmRleCA9IDA7CisgICAgICAgIHRoaXMtPnNsYS5jYnJfbnJ0X2FwX2luZGV4ID0gMDsKKyAgICAgICAgdGhpcy0+c2xhLmFsbG9jX3R5cGUgPSBCQ01PTFRfQUxMT0NfVFlQRV9OT05FOworICAgICAgICB0aGlzLT5zbGEud2VpZ2h0ID0gMDsKKyAgICAgICAgdGhpcy0+c2xhLnByaW9yaXR5ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfQ0ZHX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vbnVfaWQgPSAoYmNtb2x0X2dwb25fb251X2lkKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19DRkdfSURfQ09MTEVDVF9TVEFUUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jb2xsZWN0X3N0YXRzID0gQkNNT1NfRkFMU0U7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19DRkdfSURfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYWxsb2Nfc3RhdGVfcGFjayh0aGlzLT5zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0NGR19JRF9TTEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcG9uX2FsbG9jX3NsYV9wYWNrKCZ0aGlzLT5zbGEsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19DRkdfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPm9udV9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19DRkdfSURfQ09MTEVDVF9TVEFUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmNvbGxlY3Rfc3RhdHMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0NGR19JRF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19DRkdfSURfU0xBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDIzOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19DRkdfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0NGR19JRF9DT0xMRUNUX1NUQVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19jZmdfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0NGR19JRF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hbGxvY19zdGF0ZV91bnBhY2soJnRoaXMtPnN0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfQ0ZHX0lEX1NMQSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fYWxsb2Nfc2xhX3VucGFjaygmdGhpcy0+c2xhLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19DRkdfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+b251X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0NGR19JRF9DT0xMRUNUX1NUQVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+Y29sbGVjdF9zdGF0cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0NGR19JRF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfQ0ZHX0lEX1NMQSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0NGR19JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0NGR19JRF9DT0xMRUNUX1NUQVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9hbGxvY19jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19DRkdfSURfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUxMT0NfU1RBVEVfTk9UX0NPTkZJR1VSRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BTExPQ19TVEFURV9JTkFDVElWRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FMTE9DX1NUQVRFX1BST0NFU1NJTkc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BTExPQ19TVEFURV9BQ1RJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0FMTE9DX0NGR19JRF9TVEFURTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfQ0ZHX0lEX1NMQSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fYWxsb2Nfc2xhX2JvdW5kc19jaGVjaygmdGhpcy0+c2xhKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fQUxMT0NfQ0ZHX0lEX1NMQTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19DRkdfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5vbnVfaWQgPiAoYmNtb2x0X2dwb25fb251X2lkKSAxMjcpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0FMTE9DX0NGR19JRF9PTlVfSUQ7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX1NUQVRfSURfUlhfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfYnl0ZXMgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0lEX1JYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0lEX1JYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9JRF9SWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfYnl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9JRF9SWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNmZy50cmlnZ2VyLnR5cGUgPSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOworICAgICAgICB0aGlzLT5jZmcuc29hay5hY3RpdmVfc29ha190aW1lID0gMDsKKyAgICAgICAgdGhpcy0+Y2ZnLnNvYWsuY2xlYXJfc29ha190aW1lID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfcGFjaygmdGhpcy0+Y2ZnLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5jZmcpOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3VucGFjaygmdGhpcy0+Y2ZnLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2JvdW5kc19jaGVjaygmdGhpcy0+Y2ZnKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9DRkdfSURfQ0ZHOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0dXMgPSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1M7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX05FV19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5uZXdfc3RhdGUgPSBCQ01PTFRfQUxMT0NfU1RBVEVfTk9UX0NPTkZJR1VSRUQ7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3VsdF9wYWNrKHRoaXMtPnN0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX05FV19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hbGxvY19zdGF0ZV9wYWNrKHRoaXMtPm5ld19zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX05FV19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3VsdF91bnBhY2soJnRoaXMtPnN0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX05FV19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hbGxvY19zdGF0ZV91bnBhY2soJnRoaXMtPm5ld19zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX05FV19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SRVNVTFRfU1VDQ0VTUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JFU1VMVF9GQUlMOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9BTExPQ19DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX05FV19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPm5ld19zdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUxMT0NfU1RBVEVfTk9UX0NPTkZJR1VSRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BTExPQ19TVEFURV9JTkFDVElWRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FMTE9DX1NUQVRFX1BST0NFU1NJTkc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BTExPQ19TVEFURV9BQ1RJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX05FV19TVEFURTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXR1cyA9IEJDTU9MVF9SRVNVTFRfU1VDQ0VTUzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX05TUl9VU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmF2ZXJhZ2VfbnNyX3VzZWQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX0FWRVJBR0VfTlNSX0FMTE9DQVRFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hdmVyYWdlX25zcl9hbGxvY2F0ZWQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX0FWRVJBR0VfU1JfUkVQT1JUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmF2ZXJhZ2Vfc3JfcmVwb3J0ID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzdWx0X3BhY2sodGhpcy0+c3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX05TUl9VU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5hdmVyYWdlX25zcl91c2VkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfQVZFUkFHRV9OU1JfQUxMT0NBVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5hdmVyYWdlX25zcl9hbGxvY2F0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX1NSX1JFUE9SVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+YXZlcmFnZV9zcl9yZXBvcnQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX05TUl9VU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfQVZFUkFHRV9OU1JfQUxMT0NBVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfQVZFUkFHRV9TUl9SRVBPUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfdW5wYWNrKCZ0aGlzLT5zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX0FWRVJBR0VfTlNSX1VTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmF2ZXJhZ2VfbnNyX3VzZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX05TUl9BTExPQ0FURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmF2ZXJhZ2VfbnNyX2FsbG9jYXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX0FWRVJBR0VfU1JfUkVQT1JUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5hdmVyYWdlX3NyX3JlcG9ydCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX05TUl9VU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX0FWRVJBR0VfTlNSX0FMTE9DQVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX1NSX1JFUE9SVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JFU1VMVF9TVUNDRVNTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVTVUxUX0ZBSUw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfU1RBVFVTOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXQgPSBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0lEX1JYX0JZVEVTOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2lkX3BhY2sodGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfaWRfdW5wYWNrKCZ0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0KQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0FMTE9DX1NUQVRfSURfUlhfQllURVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0FMTE9DX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXQgPSBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0lEX1JYX0JZVEVTOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2lkX3BhY2sodGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfaWRfdW5wYWNrKCZ0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0KQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0FMTE9DX1NUQVRfSURfUlhfQllURVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0FMTE9DX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNvbmZpZ3VyYXRpb25fY29tcGxldGVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX0dFVF9BTExPQ19TVEFUU19DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Z2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkID0gQkNNT1NfRkFMU0U7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19DRkdfSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5jb25maWd1cmF0aW9uX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0NGR19JRF9HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+Z2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5zdGF0X2FsYXJtX2NsZWFyZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5zdGF0X2FsYXJtX3JhaXNlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX0dFVF9BTExPQ19TVEFUU19DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0NGR19JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmNvbmZpZ3VyYXRpb25fY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX0dFVF9BTExPQ19TVEFUU19DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnN0YXRfYWxhcm1fY2xlYXJlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0NGR19JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19DRkdfSURfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19HRVRfU1RBVFNfSURfTlVNX09GX0NZQ0xFUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5udW1fb2ZfY3ljbGVzID0gMTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0dFVF9TVEFUU19JRF9OVU1fT0ZfQ1lDTEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5udW1fb2ZfY3ljbGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19HRVRfU1RBVFNfSURfTlVNX09GX0NZQ0xFUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19HRVRfU1RBVFNfSURfTlVNX09GX0NZQ0xFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+bnVtX29mX2N5Y2xlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX0dFVF9TVEFUU19JRF9OVU1fT0ZfQ1lDTEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19HRVRfU1RBVFNfSURfTlVNX09GX0NZQ0xFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+bnVtX29mX2N5Y2xlcyA8IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0FMTE9DX0dFVF9TVEFUU19JRF9OVU1fT0ZfQ1lDTEVTOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfU0VUX1NUQVRFX0lEX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXRlID0gQkNNT0xUX0FMTE9DX09QRVJBVElPTl9BQ1RJVkFURTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX1NFVF9TVEFURV9JRF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hbGxvY19vcGVyYXRpb25fcGFjayh0aGlzLT5zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19TRVRfU1RBVEVfSURfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfU0VUX1NUQVRFX0lEX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2FsbG9jX29wZXJhdGlvbl91bnBhY2soJnRoaXMtPnN0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9BTExPQ19TRVRfU1RBVEVfSURfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0FMTE9DX1NFVF9TVEFURV9JRF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnN0YXRlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BTExPQ19PUEVSQVRJT05fQUNUSVZBVEU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BTExPQ19PUEVSQVRJT05fREVBQ1RJVkFURToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fQUxMT0NfU0VUX1NUQVRFX0lEX1NUQVRFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0tFWV9JRF9HRU1fUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5nZW1fcG9ydF9pZCA9IChiY21vbHRfZ3Bvbl9nZW1faWQpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXlfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMtPnBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9LRVlfSURfR0VNX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+Z2VtX3BvcnRfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9LRVlfSURfR0VNX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleV91bnBhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgKHVpbnQ4X3QgKikgJnRoaXMtPnBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9LRVlfSURfR0VNX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5nZW1fcG9ydF9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9LRVlfSURfR0VNX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+cG9uX25pID4gKGJjbW9sdF9ncG9uX25pKSAxNSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfS0VZX0lEX1BPTl9OSTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9LRVlfSURfR0VNX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmdlbV9wb3J0X2lkID4gKGJjbW9sdF9ncG9uX2dlbV9pZCkgNDA5NSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfS0VZX0lEX0dFTV9QT1JUX0lEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX0NPTkZJR1VSQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Y29uZmlndXJhdGlvbi5kaXJlY3Rpb24gPSBCQ01PTFRfR0VNX1BPUlRfRElSRUNUSU9OX0RPV05TVFJFQU07CisgICAgICAgIHRoaXMtPmNvbmZpZ3VyYXRpb24udHlwZSA9IEJDTU9MVF9HRU1fUE9SVF9UWVBFX1VOSUNBU1Q7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b251X2lkID0gKGJjbW9sdF9ncG9uX29udV9pZCkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX0dFTV9QT1JUX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmdlbV9wb3J0X3N0YXRlID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVEVfTk9UX0NPTkZJR1VSRUQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9ET1dOU1RSRUFNX0VOQ1JZUFRJT05fTU9ERSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5kb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9VUFNUUkVBTV9ERVNUSU5BVElPTl9RVUVVRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT51cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSA9IEJDTU9MVF9VU19HRU1fUE9SVF9ERVNUSU5BVElPTl9EQVRBOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jb250cm9sID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX0RFQlVHX0ZMT1dfQ09ORklHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRlYnVnX2Zsb3dfY29uZmlnLnVudGFnZ2VkX2Zsb3cgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOworICAgICAgICB0aGlzLT5kZWJ1Z19mbG93X2NvbmZpZy51bnRhZ2dlZF92aWQgPSAoYmNtb2x0X3ZsYW5faWQpIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9NQUNfVEFCTEVfRU5UUllfTElNSVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bWFjX3RhYmxlX2VudHJ5X2xpbWl0ID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fcGFjaygmdGhpcy0+Y29uZmlndXJhdGlvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+b251X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9HRU1fUE9SVF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRlX3BhY2sodGhpcy0+Z2VtX3BvcnRfc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfRE9XTlNUUkVBTV9FTkNSWVBUSU9OX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfY29udHJvbF9zdGF0ZV9wYWNrKHRoaXMtPmRvd25zdHJlYW1fZW5jcnlwdGlvbl9tb2RlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX1VQU1RSRUFNX0RFU1RJTkFUSU9OX1FVRVVFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3VzX2dlbV9wb3J0X2Rlc3RpbmF0aW9uX3BhY2sodGhpcy0+dXBzdHJlYW1fZGVzdGluYXRpb25fcXVldWUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9jb250cm9sX3N0YXRlX3BhY2sodGhpcy0+Y29udHJvbCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9ERUJVR19GTE9XX0NPTkZJRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX2RlYnVnX2Zsb3dfY29uZmlnX3BhY2soJnRoaXMtPmRlYnVnX2Zsb3dfY29uZmlnLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX01BQ19UQUJMRV9FTlRSWV9MSU1JVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bWFjX3RhYmxlX2VudHJ5X2xpbWl0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfQ09ORklHVVJBVElPTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9HRU1fUE9SVF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfRE9XTlNUUkVBTV9FTkNSWVBUSU9OX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX1VQU1RSRUFNX0RFU1RJTkFUSU9OX1FVRVVFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9ERUJVR19GTE9XX0NPTkZJRykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAzOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfTUFDX1RBQkxFX0VOVFJZX0xJTUlUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fdW5wYWNrKCZ0aGlzLT5jb25maWd1cmF0aW9uLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+b251X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9HRU1fUE9SVF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRlX3VucGFjaygmdGhpcy0+Z2VtX3BvcnRfc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfRE9XTlNUUkVBTV9FTkNSWVBUSU9OX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfY29udHJvbF9zdGF0ZV91bnBhY2soJnRoaXMtPmRvd25zdHJlYW1fZW5jcnlwdGlvbl9tb2RlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX1VQU1RSRUFNX0RFU1RJTkFUSU9OX1FVRVVFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3VzX2dlbV9wb3J0X2Rlc3RpbmF0aW9uX3VucGFjaygmdGhpcy0+dXBzdHJlYW1fZGVzdGluYXRpb25fcXVldWUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9jb250cm9sX3N0YXRlX3VucGFjaygmdGhpcy0+Y29udHJvbCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9ERUJVR19GTE9XX0NPTkZJRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX2RlYnVnX2Zsb3dfY29uZmlnX3VucGFjaygmdGhpcy0+ZGVidWdfZmxvd19jb25maWcsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9NQUNfVEFCTEVfRU5UUllfTElNSVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPm1hY190YWJsZV9lbnRyeV9saW1pdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfR0VNX1BPUlRfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9ET1dOU1RSRUFNX0VOQ1JZUFRJT05fTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX1VQU1RSRUFNX0RFU1RJTkFUSU9OX1FVRVVFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX0RFQlVHX0ZMT1dfQ09ORklHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfTUFDX1RBQkxFX0VOVFJZX0xJTUlUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfQ09ORklHVVJBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2JvdW5kc19jaGVjaygmdGhpcy0+Y29uZmlndXJhdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9DT05GSUdVUkFUSU9OOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPm9udV9pZCA+IChiY21vbHRfZ3Bvbl9vbnVfaWQpIDEyNykKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX09OVV9JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfR0VNX1BPUlRfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5nZW1fcG9ydF9zdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFURV9OT1RfQ09ORklHVVJFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVEVfSU5BQ1RJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRFX1BST0NFU1NJTkc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRFX0FDVElWRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX0dFTV9QT1JUX1NUQVRFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfRE9XTlNUUkVBTV9FTkNSWVBUSU9OX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5kb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQ09OVFJPTF9TVEFURV9FTkFCTEU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9ET1dOU1RSRUFNX0VOQ1JZUFRJT05fTU9ERTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX1VQU1RSRUFNX0RFU1RJTkFUSU9OX1FVRVVFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+dXBzdHJlYW1fZGVzdGluYXRpb25fcXVldWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1VTX0dFTV9QT1JUX0RFU1RJTkFUSU9OX0RBVEE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9VU19HRU1fUE9SVF9ERVNUSU5BVElPTl9DUFU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9VU19HRU1fUE9SVF9ERVNUSU5BVElPTl9PTUNJOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfVVBTVFJFQU1fREVTVElOQVRJT05fUVVFVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+Y29udHJvbCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQ09OVFJPTF9TVEFURV9FTkFCTEU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9DT05UUk9MOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfREVCVUdfRkxPV19DT05GSUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9kZWJ1Z19mbG93X2NvbmZpZ19ib3VuZHNfY2hlY2soJnRoaXMtPmRlYnVnX2Zsb3dfY29uZmlnKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX0RFQlVHX0ZMT1dfQ09ORklHOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9NQUNfVEFCTEVfRU5UUllfTElNSVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPm1hY190YWJsZV9lbnRyeV9saW1pdCA+IDEyOCkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX01BQ19UQUJMRV9FTlRSWV9MSU1JVDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X3BhY2tldHMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1JYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2J5dGVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9UWF9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X3BhY2tldHMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1RYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X2J5dGVzID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF9wYWNrZXRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfSURfUlhfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfSURfVFhfUEFDS0VUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dHhfcGFja2V0cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1RYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1JYX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1RYX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9UWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfSURfUlhfUEFDS0VUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfcGFja2V0cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1JYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1RYX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X3BhY2tldHMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9UWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfYnl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1JYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1RYX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfSURfVFhfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jZmcudHJpZ2dlci50eXBlID0gQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfTk9ORTsKKyAgICAgICAgdGhpcy0+Y2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSA9IDA7CisgICAgICAgIHRoaXMtPmNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3BhY2soJnRoaXMtPmNmZywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ19nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+Y2ZnKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ191bnBhY2soJnRoaXMtPmNmZywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ19zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ19ib3VuZHNfY2hlY2soJnRoaXMtPmNmZykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfQ0ZHX0lEX0NGRzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdHVzID0gQkNNT0xUX1JFU1VMVF9TVUNDRVNTOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9ORVdfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bmV3X3N0YXRlID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVEVfTk9UX0NPTkZJR1VSRUQ7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3VsdF9wYWNrKHRoaXMtPnN0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX05FV19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRlX3BhY2sodGhpcy0+bmV3X3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfTkVXX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzdWx0X3VucGFjaygmdGhpcy0+c3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfTkVXX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdGVfdW5wYWNrKCZ0aGlzLT5uZXdfc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9ORVdfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnN0YXR1cykKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1M6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SRVNVTFRfRkFJTDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfU1RBVFVTOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9ORVdfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5uZXdfc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVEVfTk9UX0NPTkZJR1VSRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRFX0lOQUNUSVZFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFURV9QUk9DRVNTSU5HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFURV9BQ1RJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX05FV19TVEFURTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0ID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9QQUNLRVRTOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2lkX3BhY2sodGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfaWRfdW5wYWNrKCZ0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0KQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfSURfUlhfUEFDS0VUUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9UWF9QQUNLRVRTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1RYX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0ID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9QQUNLRVRTOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2lkX3BhY2sodGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfaWRfdW5wYWNrKCZ0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0KQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfSURfUlhfUEFDS0VUUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9UWF9QQUNLRVRTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1RYX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9BVVRPX0NGR19JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jb25maWd1cmF0aW9uX2NvbXBsZXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkID0gQkNNT1NfRkFMU0U7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5jb25maWd1cmF0aW9uX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5zdGF0X2FsYXJtX2NsZWFyZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5zdGF0X2FsYXJtX3JhaXNlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0FVVE9fQ0ZHX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5jb25maWd1cmF0aW9uX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zdGF0X2FsYXJtX2NsZWFyZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zdGF0X2FsYXJtX3JhaXNlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfU0VUX1NUQVRFX0lEX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXRlID0gQkNNT0xUX0dFTV9QT1JUX09QRVJBVElPTl9BQ1RJVkFURTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NFVF9TVEFURV9JRF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9nZW1fcG9ydF9vcGVyYXRpb25fcGFjayh0aGlzLT5zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TRVRfU1RBVEVfSURfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fR0VNX1BPUlRfU0VUX1NUQVRFX0lEX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dlbV9wb3J0X29wZXJhdGlvbl91bnBhY2soJnRoaXMtPnN0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TRVRfU1RBVEVfSURfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NFVF9TVEFURV9JRF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnN0YXRlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HRU1fUE9SVF9PUEVSQVRJT05fQUNUSVZBVEU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HRU1fUE9SVF9PUEVSQVRJT05fREVBQ1RJVkFURToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfU0VUX1NUQVRFX0lEX1NUQVRFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9pd2Zfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2l3Zl9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfa2V5X3BhY2soY29uc3QgYmNtb2x0X2dwb25faXdmX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMtPnBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25faXdmX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9pd2Zfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfa2V5X3VucGFjayhiY21vbHRfZ3Bvbl9pd2Zfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICh1aW50OF90ICopICZ0aGlzLT5wb25fbmkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2tleV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2Zfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25faXdmX2tleV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5wb25fbmkgPiAoYmNtb2x0X2dwb25fbmkpIDE1KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9JV0ZfS0VZX0lEX1BPTl9OSTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25faXdmX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9JV0ZfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5pd2ZfbW9kZSA9IEJDTU9MVF9JV0ZfTU9ERV9ESVJFQ1RfTUFQUElOR19NT0RFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX1VTX1RQSURfUEVSX0ZMT1cpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dXNfdHBpZF9wZXJfZmxvdy5hcnJbMF0gPSAzMzAyNFU7CisgICAgICAgIHRoaXMtPnVzX3RwaWRfcGVyX2Zsb3cuYXJyWzFdID0gMzMwMjRVOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX1VTX09UQUdfRElSRUNUX1RQSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dXNfb3RhZ19kaXJlY3RfdHBpZCA9IDMzMDI0VTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9VU19PVEFHX0RJUkVDVF9QQklUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnVzX290YWdfZGlyZWN0X3BiaXQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX0RTX1RQSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZHNfdHBpZC5hcnJbMF0gPSAzMzAyNFU7CisgICAgICAgIHRoaXMtPmRzX3RwaWQuYXJyWzFdID0gMzQ5ODRVOworICAgICAgICB0aGlzLT5kc190cGlkLmFyclsyXSA9IDM3MTIwVTsKKyAgICAgICAgdGhpcy0+ZHNfdHBpZC5hcnJbM10gPSAzNzM3NlU7CisgICAgICAgIHRoaXMtPmRzX3RwaWQuYXJyWzRdID0gMzMwMjRVOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX01BQ19UQUJMRV9DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm1hY190YWJsZV9jb25maWd1cmF0aW9uLm1pc3NfZmFsbGJhY2sgPSBCQ01PTFRfTUFDX1RBQkxFX01JU1NfRkFMTEJBQ0tfRFJPUDsKKyAgICAgICAgdGhpcy0+bWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24uZGVmYXVsdF9mbG93X2lkID0gKGJjbW9sdF9mbG93X2lkKSAwOworICAgICAgICB0aGlzLT5tYWNfdGFibGVfY29uZmlndXJhdGlvbi5hZ2luZ190aW1lID0gMzA7CisgICAgICAgIHRoaXMtPm1hY190YWJsZV9jb25maWd1cmF0aW9uLmxlYXJuaW5nX21vZGUgPSBCQ01PTFRfTUFDX1RBQkxFX0xFQVJOSU5HX01PREVfTk9STUFMOworICAgICAgICB0aGlzLT5tYWNfdGFibGVfY29uZmlndXJhdGlvbi5hdXRvbWF0aWNfbWFjX2xlYXJuaW5nID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRTsKKyAgICAgICAgdGhpcy0+bWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24uYXV0b21hdGljX21hY19hZ2luZyA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU7CisgICAgICAgIHRoaXMtPm1hY190YWJsZV9jb25maWd1cmF0aW9uLmF1dG9tYXRpY19tYWNfbW92ZSA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU7CisgICAgICAgIHRoaXMtPm1hY190YWJsZV9jb25maWd1cmF0aW9uLmF1dG9tYXRpY19zdGF0aWNfbW9kZSA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX0RFQlVHX0ZMT1dfQ09ORklHVVJBVElPTikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5kZWJ1Z19mbG93X2NvbmZpZ3VyYXRpb24ubGVhcm5fdW50YWdnZWRfZmxvd192aWRzID0gQkNNT1NfRkFMU0U7CisgICAgICAgIHRoaXMtPmRlYnVnX2Zsb3dfY29uZmlndXJhdGlvbi51bnRhZ2dlZF9mbG93X3NoYXBpbmdfbXNfcGVyX3NlYyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfTUFDX1RBQkxFX0NPVU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm1hY190YWJsZV9jb3VudCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfRk9SQklEREVOX1ZMQU5fRkxPV19HRU1fUkFOR0VfU1RBUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Zm9yYmlkZGVuX3ZsYW5fZmxvd19nZW1fcmFuZ2Vfc3RhcnQgPSAxMjg7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfSVdGX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfaXdmX21vZGVfcGFjayh0aGlzLT5pd2ZfbW9kZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfVVNfVFBJRF9QRVJfRkxPVykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfdTE2XzJfaGV4X3BhY2soJnRoaXMtPnVzX3RwaWRfcGVyX2Zsb3csIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX1VTX09UQUdfRElSRUNUX1RQSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnVzX290YWdfZGlyZWN0X3RwaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9VU19PVEFHX0RJUkVDVF9QQklUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnVzX290YWdfZGlyZWN0X3BiaXQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9EU19UUElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl91MTZfNV9oZXhfcGFjaygmdGhpcy0+ZHNfdHBpZCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfTUFDX1RBQkxFX0NPTkZJR1VSQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb25fcGFjaygmdGhpcy0+bWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX0RFQlVHX0ZMT1dfQ09ORklHVVJBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX2l3Zl9kZWJ1Z19mbG93X2NvbmZpZ19wYWNrKCZ0aGlzLT5kZWJ1Z19mbG93X2NvbmZpZ3VyYXRpb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX01BQ19UQUJMRV9DT1VOVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bWFjX3RhYmxlX2NvdW50KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfRk9SQklEREVOX1ZMQU5fRkxPV19HRU1fUkFOR0VfU1RBUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmZvcmJpZGRlbl92bGFuX2Zsb3dfZ2VtX3JhbmdlX3N0YXJ0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25faXdmX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfSVdGX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9VU19UUElEX1BFUl9GTE9XKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfVVNfT1RBR19ESVJFQ1RfVFBJRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX1VTX09UQUdfRElSRUNUX1BCSVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9EU19UUElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDEwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX01BQ19UQUJMRV9DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDEyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX0RFQlVHX0ZMT1dfQ09ORklHVVJBVElPTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAzOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX01BQ19UQUJMRV9DT1VOVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX0ZPUkJJRERFTl9WTEFOX0ZMT1dfR0VNX1JBTkdFX1NUQVJUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9JV0ZfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9pd2ZfbW9kZV91bnBhY2soJnRoaXMtPml3Zl9tb2RlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9VU19UUElEX1BFUl9GTE9XKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl91MTZfMl9oZXhfdW5wYWNrKCZ0aGlzLT51c190cGlkX3Blcl9mbG93LCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX1VTX09UQUdfRElSRUNUX1RQSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnVzX290YWdfZGlyZWN0X3RwaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9VU19PVEFHX0RJUkVDVF9QQklUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnVzX290YWdfZGlyZWN0X3BiaXQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9EU19UUElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl91MTZfNV9oZXhfdW5wYWNrKCZ0aGlzLT5kc190cGlkLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX01BQ19UQUJMRV9DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X21hY190YWJsZV9jb25maWd1cmF0aW9uX3VucGFjaygmdGhpcy0+bWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfREVCVUdfRkxPV19DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25faXdmX2RlYnVnX2Zsb3dfY29uZmlnX3VucGFjaygmdGhpcy0+ZGVidWdfZmxvd19jb25maWd1cmF0aW9uLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX01BQ19UQUJMRV9DT1VOVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bWFjX3RhYmxlX2NvdW50KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfRk9SQklEREVOX1ZMQU5fRkxPV19HRU1fUkFOR0VfU1RBUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmZvcmJpZGRlbl92bGFuX2Zsb3dfZ2VtX3JhbmdlX3N0YXJ0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfSVdGX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfVVNfVFBJRF9QRVJfRkxPVykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9VU19PVEFHX0RJUkVDVF9UUElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX1VTX09UQUdfRElSRUNUX1BCSVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfRFNfVFBJRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEwKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfTUFDX1RBQkxFX0NPTkZJR1VSQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX0RFQlVHX0ZMT1dfQ09ORklHVVJBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9NQUNfVEFCTEVfQ09VTlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfRk9SQklEREVOX1ZMQU5fRkxPV19HRU1fUkFOR0VfU1RBUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25faXdmX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25faXdmX2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfSVdGX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5pd2ZfbW9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfSVdGX01PREVfRElSRUNUX01BUFBJTkdfTU9ERToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0lXRl9NT0RFX1BFUl9GTE9XX01PREU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfSVdGX01PREU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfVVNfVFBJRF9QRVJfRkxPVykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfdTE2XzJfaGV4X2JvdW5kc19jaGVjaygmdGhpcy0+dXNfdHBpZF9wZXJfZmxvdykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfVVNfVFBJRF9QRVJfRkxPVzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX1VTX09UQUdfRElSRUNUX1BCSVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnVzX290YWdfZGlyZWN0X3BiaXQgPiA3KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX1VTX09UQUdfRElSRUNUX1BCSVQ7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9EU19UUElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl91MTZfNV9oZXhfYm91bmRzX2NoZWNrKCZ0aGlzLT5kc190cGlkKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fSVdGX0NGR19JRF9EU19UUElEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfTUFDX1RBQkxFX0NPTkZJR1VSQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb25fYm91bmRzX2NoZWNrKCZ0aGlzLT5tYWNfdGFibGVfY29uZmlndXJhdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfTUFDX1RBQkxFX0NPTkZJR1VSQVRJT047CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9ERUJVR19GTE9XX0NPTkZJR1VSQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9pd2ZfZGVidWdfZmxvd19jb25maWdfYm91bmRzX2NoZWNrKCZ0aGlzLT5kZWJ1Z19mbG93X2NvbmZpZ3VyYXRpb24pKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX0RFQlVHX0ZMT1dfQ09ORklHVVJBVElPTjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9EU19ISVRfRVZFTlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZHNfaGl0X2V2ZW50ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfTUlTU19FVkVOVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5kc19taXNzX2V2ZW50ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfRFJPUF9EVUVfVE9fTUlTU19FVkVOVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5kc19kcm9wX2R1ZV90b19taXNzX2V2ZW50ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfRFJPUF9EVUVfVE9fSElUX0VWRU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRzX2Ryb3BfZHVlX3RvX2hpdF9ldmVudCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX0RTX0RST1BfVE9fRElTQUJMRURfR0VNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRzX2Ryb3BfdG9fZGlzYWJsZWRfZ2VtID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfTkVXX01BQ19ESVNDT1ZFUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm5ld19tYWNfZGlzY292ZXJlZCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX01PVkVfRVZFTlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bW92ZV9ldmVudCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX05FV19NQUNfRFJPUF9EVUVfVE9fRklGT19GVUxMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm5ld19tYWNfZHJvcF9kdWVfdG9fZmlmb19mdWxsID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9EU19ISVRfRVZFTlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmRzX2hpdF9ldmVudCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9EU19NSVNTX0VWRU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5kc19taXNzX2V2ZW50KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX0RTX0RST1BfRFVFX1RPX01JU1NfRVZFTlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmRzX2Ryb3BfZHVlX3RvX21pc3NfZXZlbnQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfRFJPUF9EVUVfVE9fSElUX0VWRU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5kc19kcm9wX2R1ZV90b19oaXRfZXZlbnQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfRFJPUF9UT19ESVNBQkxFRF9HRU0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmRzX2Ryb3BfdG9fZGlzYWJsZWRfZ2VtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX05FV19NQUNfRElTQ09WRVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+bmV3X21hY19kaXNjb3ZlcmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX01PVkVfRVZFTlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPm1vdmVfZXZlbnQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfTkVXX01BQ19EUk9QX0RVRV9UT19GSUZPX0ZVTEwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPm5ld19tYWNfZHJvcF9kdWVfdG9fZmlmb19mdWxsKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfSElUX0VWRU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX0RTX01JU1NfRVZFTlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfRFJPUF9EVUVfVE9fTUlTU19FVkVOVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9EU19EUk9QX0RVRV9UT19ISVRfRVZFTlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfRFJPUF9UT19ESVNBQkxFRF9HRU0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfTkVXX01BQ19ESVNDT1ZFUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX01PVkVfRVZFTlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfTkVXX01BQ19EUk9QX0RVRV9UT19GSUZPX0ZVTEwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX0RTX0hJVF9FVkVOVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZHNfaGl0X2V2ZW50KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX0RTX01JU1NfRVZFTlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmRzX21pc3NfZXZlbnQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfRFJPUF9EVUVfVE9fTUlTU19FVkVOVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZHNfZHJvcF9kdWVfdG9fbWlzc19ldmVudCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9EU19EUk9QX0RVRV9UT19ISVRfRVZFTlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmRzX2Ryb3BfZHVlX3RvX2hpdF9ldmVudCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9EU19EUk9QX1RPX0RJU0FCTEVEX0dFTSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZHNfZHJvcF90b19kaXNhYmxlZF9nZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfTkVXX01BQ19ESVNDT1ZFUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5uZXdfbWFjX2Rpc2NvdmVyZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfTU9WRV9FVkVOVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+bW92ZV9ldmVudCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9ORVdfTUFDX0RST1BfRFVFX1RPX0ZJRk9fRlVMTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+bmV3X21hY19kcm9wX2R1ZV90b19maWZvX2Z1bGwpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX0RTX0hJVF9FVkVOVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfTUlTU19FVkVOVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfRFJPUF9EVUVfVE9fTUlTU19FVkVOVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfRFJPUF9EVUVfVE9fSElUX0VWRU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9EU19EUk9QX1RPX0RJU0FCTEVEX0dFTSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfTkVXX01BQ19ESVNDT1ZFUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9NT1ZFX0VWRU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9ORVdfTUFDX0RST1BfRFVFX1RPX0ZJRk9fRlVMTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25faXdmX3N0YXRfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25faXdmX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNmZy50cmlnZ2VyLnR5cGUgPSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOworICAgICAgICB0aGlzLT5jZmcuc29hay5hY3RpdmVfc29ha190aW1lID0gMDsKKyAgICAgICAgdGhpcy0+Y2ZnLnNvYWsuY2xlYXJfc29ha190aW1lID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25faXdmX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfcGFjaygmdGhpcy0+Y2ZnLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5jZmcpOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3N0YXRfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3VucGFjaygmdGhpcy0+Y2ZnLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25faXdmX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2JvdW5kc19jaGVjaygmdGhpcy0+Y2ZnKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fSVdGX1NUQVRfQ0ZHX0lEX0NGRzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NDQU5fTUFDX1RBQkxFX0NPTVBMRVRFRF9JRF9NQUNfQUREUkVTUykpICE9IDApCisgICAgeworICAgICAgICBiY21vc19tYWNfYWRkcmVzc19pbml0KCZ0aGlzLT5tYWNfYWRkcmVzcyk7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9TQ0FOX01BQ19UQUJMRV9DT01QTEVURURfSURfRU5UUklFUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5lbnRyaWVzLmxlbiA9IDA7CisgICAgICAgIHRoaXMtPmVudHJpZXMudmFsID0gTlVMTDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NDQU5fTUFDX1RBQkxFX0NPTVBMRVRFRF9JRF9NQUNfQUREUkVTUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT5tYWNfYWRkcmVzcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU0NBTl9NQUNfVEFCTEVfQ09NUExFVEVEX0lEX0VOVFJJRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHRfbGlzdF91MTZfcGFjaygmdGhpcy0+ZW50cmllcywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9TQ0FOX01BQ19UQUJMRV9DT01QTEVURURfSURfTUFDX0FERFJFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NDQU5fTUFDX1RBQkxFX0NPTVBMRVRFRF9JRF9FTlRSSUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdF9saXN0X3UxNl9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+ZW50cmllcyk7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NDQU5fTUFDX1RBQkxFX0NPTVBMRVRFRF9JRF9NQUNfQUREUkVTUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9tYWNfYWRkcmVzcyhidWYsICZ0aGlzLT5tYWNfYWRkcmVzcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU0NBTl9NQUNfVEFCTEVfQ09NUExFVEVEX0lEX0VOVFJJRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHRfbGlzdF91MTZfdW5wYWNrKCZ0aGlzLT5lbnRyaWVzLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU0NBTl9NQUNfVEFCTEVfQ09NUExFVEVEX0lEX01BQ19BRERSRVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU0NBTl9NQUNfVEFCTEVfQ09NUExFVEVEX0lEX0VOVFJJRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHRfbGlzdF91MTZfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU0NBTl9NQUNfVEFCTEVfQ09NUExFVEVEX0lEX0VOVFJJRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHRfbGlzdF91MTZfYm91bmRzX2NoZWNrKCZ0aGlzLT5lbnRyaWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fSVdGX1NDQU5fTUFDX1RBQkxFX0NPTVBMRVRFRF9JRF9FTlRSSUVTOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdCA9IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX0RTX0hJVF9FVkVOVDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25faXdmX3N0YXRfaWRfcGFjayh0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25faXdmX3N0YXRfaWRfdW5wYWNrKCZ0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0KQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX0RTX0hJVF9FVkVOVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfTUlTU19FVkVOVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfRFJPUF9EVUVfVE9fTUlTU19FVkVOVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfRFJPUF9EVUVfVE9fSElUX0VWRU5UOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9EU19EUk9QX1RPX0RJU0FCTEVEX0dFTToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfTkVXX01BQ19ESVNDT1ZFUkVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9NT1ZFX0VWRU5UOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9ORVdfTUFDX0RST1BfRFVFX1RPX0ZJRk9fRlVMTDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fSVdGX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXQgPSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9EU19ISVRfRVZFTlQ7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX2l3Zl9zdGF0X2lkX3BhY2sodGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX2l3Zl9zdGF0X2lkX3VucGFjaygmdGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9EU19ISVRfRVZFTlQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX0RTX01JU1NfRVZFTlQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX0RTX0RST1BfRFVFX1RPX01JU1NfRVZFTlQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX0RTX0RST1BfRFVFX1RPX0hJVF9FVkVOVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfRFJPUF9UT19ESVNBQkxFRF9HRU06CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX05FV19NQUNfRElTQ09WRVJFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfTU9WRV9FVkVOVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfTkVXX01BQ19EUk9QX0RVRV9UT19GSUZPX0ZVTEw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9BVVRPX0NGR19JRF9GTFVTSF9NQUNfVEFCTEVfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZsdXNoX21hY190YWJsZV9jb21wbGV0ZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0FVVE9fQ0ZHX0lEX1NDQU5fTUFDX1RBQkxFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zY2FuX21hY190YWJsZV9jb21wbGV0ZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0X2FsYXJtX2NsZWFyZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkID0gQkNNT1NfRkFMU0U7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQVVUT19DRkdfSURfRkxVU0hfTUFDX1RBQkxFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmZsdXNoX21hY190YWJsZV9jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0FVVE9fQ0ZHX0lEX1NDQU5fTUFDX1RBQkxFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnNjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQVVUT19DRkdfSURfRkxVU0hfTUFDX1RBQkxFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQVVUT19DRkdfSURfU0NBTl9NQUNfVEFCTEVfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YV91bnBhY2soYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9BVVRPX0NGR19JRF9GTFVTSF9NQUNfVEFCTEVfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+Zmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQVVUT19DRkdfSURfU0NBTl9NQUNfVEFCTEVfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c2Nhbl9tYWNfdGFibGVfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zdGF0X2FsYXJtX2NsZWFyZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c3RhdF9hbGFybV9yYWlzZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQVVUT19DRkdfSURfRkxVU0hfTUFDX1RBQkxFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0FVVE9fQ0ZHX0lEX1NDQU5fTUFDX1RBQkxFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0ZMVVNIX01BQ19UQUJMRV9JRF9DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNvbnRyb2wgPSBCQ01PTFRfRkxVU0hfTUFDX1RBQkxFX09QVElPTl9BTEw7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9GTFVTSF9NQUNfVEFCTEVfSURfVklEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnZpZCA9IChiY21vbHRfdmxhbl9pZCkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0ZMVVNIX01BQ19UQUJMRV9JRF9GTE9XX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZsb3dfaWQgPSAoYmNtb2x0X2Zsb3dfaWQpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9GTFVTSF9NQUNfVEFCTEVfSURfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9mbHVzaF9tYWNfdGFibGVfb3B0aW9uX3BhY2sodGhpcy0+Y29udHJvbCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9GTFVTSF9NQUNfVEFCTEVfSURfVklEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPnZpZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfRkxVU0hfTUFDX1RBQkxFX0lEX0ZMT1dfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+Zmxvd19pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfRkxVU0hfTUFDX1RBQkxFX0lEX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0ZMVVNIX01BQ19UQUJMRV9JRF9WSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0ZMVVNIX01BQ19UQUJMRV9JRF9GTE9XX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0ZMVVNIX01BQ19UQUJMRV9JRF9DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2ZsdXNoX21hY190YWJsZV9vcHRpb25fdW5wYWNrKCZ0aGlzLT5jb250cm9sLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0ZMVVNIX01BQ19UQUJMRV9JRF9WSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT52aWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0ZMVVNIX01BQ19UQUJMRV9JRF9GTE9XX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+Zmxvd19pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfRkxVU0hfTUFDX1RBQkxFX0lEX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9GTFVTSF9NQUNfVEFCTEVfSURfVklEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfRkxVU0hfTUFDX1RBQkxFX0lEX0ZMT1dfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9GTFVTSF9NQUNfVEFCTEVfSURfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmNvbnRyb2wpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0ZMVVNIX01BQ19UQUJMRV9PUFRJT05fQUxMOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRkxVU0hfTUFDX1RBQkxFX09QVElPTl9QRVJfVklEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRkxVU0hfTUFDX1RBQkxFX09QVElPTl9QRVJfRkxPVzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0ZMVVNIX01BQ19UQUJMRV9PUFRJT05fVklEX1BMVVNfRkxPVzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fSVdGX0ZMVVNIX01BQ19UQUJMRV9JRF9DT05UUk9MOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfRkxVU0hfTUFDX1RBQkxFX0lEX1ZJRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+dmlkID4gKGJjbW9sdF92bGFuX2lkKSA0MDk1KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9JV0ZfRkxVU0hfTUFDX1RBQkxFX0lEX1ZJRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfRkxVU0hfTUFDX1RBQkxFX0lEX0ZMT1dfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmZsb3dfaWQgPiAoYmNtb2x0X2Zsb3dfaWQpIDQwOTUpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0lXRl9GTFVTSF9NQUNfVEFCTEVfSURfRkxPV19JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9TQ0FOX01BQ19UQUJMRV9JRF9NQUNfQUREUkVTUykpICE9IDApCisgICAgeworICAgICAgICBiY21vc19tYWNfYWRkcmVzc19pbml0KCZ0aGlzLT5tYWNfYWRkcmVzcyk7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU0NBTl9NQUNfVEFCTEVfSURfTUFDX0FERFJFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+bWFjX2FkZHJlc3MpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9TQ0FOX01BQ19UQUJMRV9JRF9NQUNfQUREUkVTUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA2OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU0NBTl9NQUNfVEFCTEVfSURfTUFDX0FERFJFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+bWFjX2FkZHJlc3MpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfU0NBTl9NQUNfVEFCTEVfSURfTUFDX0FERFJFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA2KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0tFWV9JRF9GTE9XX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZsb3dfaWQgPSAoYmNtb2x0X2Zsb3dfaWQpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5X3BhY2soY29uc3QgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMtPnBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1dfS0VZX0lEX0ZMT1dfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+Zmxvd19pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19LRVlfSURfRkxPV19JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleV91bnBhY2soYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAodWludDhfdCAqKSAmdGhpcy0+cG9uX25pKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19LRVlfSURfRkxPV19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPmZsb3dfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1dfS0VZX0lEX0ZMT1dfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnBvbl9uaSA+IChiY21vbHRfZ3Bvbl9uaSkgMTUpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19LRVlfSURfUE9OX05JOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19LRVlfSURfRkxPV19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+Zmxvd19pZCA+IChiY21vbHRfZmxvd19pZCkgNDA5NSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0tFWV9JRF9GTE9XX0lEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1dfQ0ZHX0lEX0dFTV9QT1JUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmdlbV9wb3J0ID0gKGJjbW9sdF9ncG9uX2dlbV9pZCkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0NGR19JRF9QQklUX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cGJpdF9jb250cm9sID0gQkNNT1NfRkFMU0U7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19DRkdfSURfR0VNX1BPUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+Z2VtX3BvcnQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0NGR19JRF9QQklUX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5wYml0X2NvbnRyb2wpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0NGR19JRF9HRU1fUE9SVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1dfQ0ZHX0lEX1BCSVRfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19DRkdfSURfR0VNX1BPUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5nZW1fcG9ydCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1dfQ0ZHX0lEX1BCSVRfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnBiaXRfY29udHJvbCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1dfQ0ZHX0lEX0dFTV9QT1JUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1dfQ0ZHX0lEX1BCSVRfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0NGR19JRF9HRU1fUE9SVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+Z2VtX3BvcnQgPiAoYmNtb2x0X2dwb25fZ2VtX2lkKSA0MDk1KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1dfQ0ZHX0lEX0dFTV9QT1JUOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19LRVlfSURfVkxBTl9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT52bGFuX2lkID0gKGJjbW9sdF92bGFuX2lkKSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXlfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzLT5wb25fbmkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19LRVlfSURfVkxBTl9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT52bGFuX2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19LRVlfSURfVkxBTl9JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXlfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAodWludDhfdCAqKSAmdGhpcy0+cG9uX25pKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfS0VZX0lEX1ZMQU5fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT52bGFuX2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0tFWV9JRF9WTEFOX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+cG9uX25pID4gKGJjbW9sdF9ncG9uX25pKSAxNSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19LRVlfSURfUE9OX05JOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfS0VZX0lEX1ZMQU5fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnZsYW5faWQgPiAoYmNtb2x0X3ZsYW5faWQpIDQwOTUpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfS0VZX0lEX1ZMQU5fSUQ7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19DRkdfSURfTUFQUElOR19NRVRIT0QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bWFwcGluZ19tZXRob2QgPSBCQ01PTFRfVkxBTl9UT19GTE9XX01BUFBJTkdfTUVUSE9EX1ZJRDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19DRkdfSURfTUFQUElOR19UQUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bWFwcGluZ190YWcgPSBCQ01PTFRfTUFQUElOR19UQUdfTUVUSE9EX09VVEVSX1ZJRDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19DRkdfSURfVkxBTl9BQ1RJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dmxhbl9hY3Rpb24gPSBCQ01PTFRfRFNfVkxBTl9BQ1RJT05fUkVNT1ZFOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfQ0ZHX0lEX01BUFBJTkdfTUVUSE9EKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3ZsYW5fdG9fZmxvd19tYXBwaW5nX21ldGhvZF9wYWNrKHRoaXMtPm1hcHBpbmdfbWV0aG9kLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19DRkdfSURfTUFQUElOR19UQUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfbWFwcGluZ190YWdfbWV0aG9kX3BhY2sodGhpcy0+bWFwcGluZ190YWcsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0NGR19JRF9WTEFOX0FDVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9kc192bGFuX2FjdGlvbl9wYWNrKHRoaXMtPnZsYW5fYWN0aW9uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0NGR19JRF9NQVBQSU5HX01FVEhPRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0NGR19JRF9NQVBQSU5HX1RBRykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0NGR19JRF9WTEFOX0FDVElPTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YV91bnBhY2soYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19DRkdfSURfTUFQUElOR19NRVRIT0QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdmxhbl90b19mbG93X21hcHBpbmdfbWV0aG9kX3VucGFjaygmdGhpcy0+bWFwcGluZ19tZXRob2QsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0NGR19JRF9NQVBQSU5HX1RBRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9tYXBwaW5nX3RhZ19tZXRob2RfdW5wYWNrKCZ0aGlzLT5tYXBwaW5nX3RhZywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfQ0ZHX0lEX1ZMQU5fQUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2RzX3ZsYW5fYWN0aW9uX3VucGFjaygmdGhpcy0+dmxhbl9hY3Rpb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19DRkdfSURfTUFQUElOR19NRVRIT0QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfQ0ZHX0lEX01BUFBJTkdfVEFHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0NGR19JRF9WTEFOX0FDVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19DRkdfSURfTUFQUElOR19NRVRIT0QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5tYXBwaW5nX21ldGhvZCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfVkxBTl9UT19GTE9XX01BUFBJTkdfTUVUSE9EX1ZJRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1ZMQU5fVE9fRkxPV19NQVBQSU5HX01FVEhPRF9NQUNQTFVTVklEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0NGR19JRF9NQVBQSU5HX01FVEhPRDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19DRkdfSURfTUFQUElOR19UQUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5tYXBwaW5nX3RhZykKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUFQUElOR19UQUdfTUVUSE9EX09VVEVSX1ZJRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX01BUFBJTkdfVEFHX01FVEhPRF9JTk5FUl9WSUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfQ0ZHX0lEX01BUFBJTkdfVEFHOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0NGR19JRF9WTEFOX0FDVElPTikpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnZsYW5fYWN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9EU19WTEFOX0FDVElPTl9SRU1PVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9EU19WTEFOX0FDVElPTl9UUkFOU1BBUkVOVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19DRkdfSURfVkxBTl9BQ1RJT047CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9LRVlfSURfTUFDX0FERFJFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3NfaW5pdCgmdGhpcy0+bWFjX2FkZHJlc3MpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0tFWV9JRF9WTEFOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnZsYW4gPSAoYmNtb2x0X3ZsYW5faWQpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMtPnBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0tFWV9JRF9NQUNfQUREUkVTUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT5tYWNfYWRkcmVzcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0tFWV9JRF9WTEFOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPnZsYW4pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0tFWV9JRF9NQUNfQUREUkVTUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA2OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0tFWV9JRF9WTEFOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleV91bnBhY2soYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICh1aW50OF90ICopICZ0aGlzLT5wb25fbmkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9LRVlfSURfTUFDX0FERFJFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+bWFjX2FkZHJlc3MpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9LRVlfSURfVkxBTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPnZsYW4pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfS0VZX0lEX01BQ19BRERSRVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0tFWV9JRF9WTEFOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+cG9uX25pID4gKGJjbW9sdF9ncG9uX25pKSAxNSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9LRVlfSURfUE9OX05JOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQ0ZHX0lEX0ZMT1dfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Zmxvd19pZCA9IChiY21vbHRfZmxvd19pZCkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9DRkdfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0ID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQ0ZHX0lEX0dFTV9QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmdlbV9wb3J0X2lkID0gKGJjbW9sdF9ncG9uX2dlbV9pZCkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9DRkdfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9udV9pZCA9IChiY21vbHRfZ3Bvbl9vbnVfaWQpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9DRkdfSURfRkxPV19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5mbG93X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQ0ZHX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5zdGF0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQ0ZHX0lEX0dFTV9QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPmdlbV9wb3J0X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQ0ZHX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5vbnVfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0NGR19JRF9GTE9XX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQ0ZHX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9DRkdfSURfR0VNX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9DRkdfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0NGR19JRF9GTE9XX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+Zmxvd19pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0NGR19JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c3RhdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0NGR19JRF9HRU1fUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPmdlbV9wb3J0X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQ0ZHX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPm9udV9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9DRkdfSURfRkxPV19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9DRkdfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9DRkdfSURfR0VNX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQ0ZHX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9DRkdfSURfRkxPV19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+Zmxvd19pZCA+IChiY21vbHRfZmxvd19pZCkgNDA5NSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9DRkdfSURfRkxPV19JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0NGR19JRF9HRU1fUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+Z2VtX3BvcnRfaWQgPiAoYmNtb2x0X2dwb25fZ2VtX2lkKSA0MDk1KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0NGR19JRF9HRU1fUE9SVF9JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0NGR19JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPm9udV9pZCA+IChiY21vbHRfZ3Bvbl9vbnVfaWQpIDEyNykKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9DRkdfSURfT05VX0lEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX01BQ19EUk9QUEVEX0lEX0ZMT1dfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Zmxvd19pZCA9IChiY21vbHRfZmxvd19pZCkgMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9NQUNfRFJPUFBFRF9JRF9GTE9XX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPmZsb3dfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9NQUNfRFJPUFBFRF9JRF9GTE9XX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9NQUNfRFJPUFBFRF9JRF9GTE9XX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+Zmxvd19pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX01BQ19EUk9QUEVEX0lEX0ZMT1dfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfTUFDX0RST1BQRURfSURfRkxPV19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+Zmxvd19pZCA+IChiY21vbHRfZmxvd19pZCkgNDA5NSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9NQUNfRFJPUFBFRF9JRF9GTE9XX0lEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX01BQ19NT1ZFX0lEX09MRF9GTE9XX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9sZF9mbG93X2lkID0gKGJjbW9sdF9mbG93X2lkKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX01BQ19NT1ZFX0lEX05FV19GTE9XX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm5ld19mbG93X2lkID0gKGJjbW9sdF9mbG93X2lkKSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX01BQ19NT1ZFX0lEX09MRF9GTE9XX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPm9sZF9mbG93X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfTUFDX01PVkVfSURfTkVXX0ZMT1dfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+bmV3X2Zsb3dfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9NQUNfTU9WRV9JRF9PTERfRkxPV19JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX01BQ19NT1ZFX0lEX05FV19GTE9XX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9NQUNfTU9WRV9JRF9PTERfRkxPV19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPm9sZF9mbG93X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfTUFDX01PVkVfSURfTkVXX0ZMT1dfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5uZXdfZmxvd19pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX01BQ19NT1ZFX0lEX09MRF9GTE9XX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX01BQ19NT1ZFX0lEX05FV19GTE9XX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX01BQ19NT1ZFX0lEX09MRF9GTE9XX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5vbGRfZmxvd19pZCA+IChiY21vbHRfZmxvd19pZCkgNDA5NSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9NQUNfTU9WRV9JRF9PTERfRkxPV19JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX01BQ19NT1ZFX0lEX05FV19GTE9XX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5uZXdfZmxvd19pZCA+IChiY21vbHRfZmxvd19pZCkgNDA5NSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9NQUNfTU9WRV9JRF9ORVdfRkxPV19JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfTkVXX01BQ19JRF9GTE9XX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZsb3dfaWQgPSAoYmNtb2x0X2Zsb3dfaWQpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX05FV19NQUNfSURfRkxPV19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5mbG93X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX05FV19NQUNfSURfRkxPV19JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX05FV19NQUNfSURfRkxPV19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPmZsb3dfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX05FV19NQUNfSURfRkxPV19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9ORVdfTUFDX0lEX0ZMT1dfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmZsb3dfaWQgPiAoYmNtb2x0X2Zsb3dfaWQpIDQwOTUpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfTkVXX01BQ19JRF9GTE9XX0lEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fQ0ZHX0lEX01BQ19BR0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm1hY19hZ2VkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19DRkdfSURfTUFDX0RST1BQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bWFjX2Ryb3BwZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGR19JRF9NQUNfTU9WRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5tYWNfbW92ZSA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fQ0ZHX0lEX05FV19NQUMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bmV3X21hYyA9IEJDTU9TX0ZBTFNFOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fQ0ZHX0lEX01BQ19BR0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+bWFjX2FnZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGR19JRF9NQUNfRFJPUFBFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPm1hY19kcm9wcGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19DRkdfSURfTUFDX01PVkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5tYWNfbW92ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fQ0ZHX0lEX05FV19NQUMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5uZXdfbWFjKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19DRkdfSURfTUFDX0FHRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGR19JRF9NQUNfRFJPUFBFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fQ0ZHX0lEX01BQ19NT1ZFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19DRkdfSURfTkVXX01BQykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19DRkdfSURfTUFDX0FHRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5tYWNfYWdlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fQ0ZHX0lEX01BQ19EUk9QUEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+bWFjX2Ryb3BwZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGR19JRF9NQUNfTU9WRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPm1hY19tb3ZlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19DRkdfSURfTkVXX01BQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPm5ld19tYWMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGR19JRF9NQUNfQUdFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGR19JRF9NQUNfRFJPUFBFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGR19JRF9NQUNfTU9WRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGR19JRF9ORVdfTUFDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0tFWV9JRF9HRU1fUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5nZW1fcG9ydF9pZCA9IChiY21vbHRfZ3Bvbl9nZW1faWQpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXlfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMtPnBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19LRVlfSURfR0VNX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+Z2VtX3BvcnRfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19LRVlfSURfR0VNX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleV91bnBhY2soYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgKHVpbnQ4X3QgKikgJnRoaXMtPnBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19LRVlfSURfR0VNX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5nZW1fcG9ydF9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19LRVlfSURfR0VNX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+cG9uX25pID4gKGJjbW9sdF9ncG9uX25pKSAxNSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfS0VZX0lEX1BPTl9OSTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19LRVlfSURfR0VNX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmdlbV9wb3J0X2lkID4gKGJjbW9sdF9ncG9uX2dlbV9pZCkgNDA5NSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfS0VZX0lEX0dFTV9QT1JUX0lEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX0ZMT1dfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Zmxvd19pZCA9IChiY21vbHRfZmxvd19pZCkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX01BQ19MRUFSTklORykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5tYWNfbGVhcm5pbmcgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX1ZMQU5fQUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnZsYW5fYWN0aW9uID0gQkNNT0xUX1VTX1ZMQU5fQUNUSU9OX0FERDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX1ZMQU5fVEFHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnZsYW5fdGFnLnZsYW5faWQgPSAoYmNtb2x0X3ZsYW5faWQpIDA7CisgICAgICAgIHRoaXMtPnZsYW5fdGFnLnBiaXQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19DRkdfSURfVFBJRF9JTkRFWCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50cGlkX2luZGV4ID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9GTE9XX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPmZsb3dfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX01BQ19MRUFSTklORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPm1hY19sZWFybmluZykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19DRkdfSURfVkxBTl9BQ1RJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdXNfdmxhbl9hY3Rpb25fcGFjayh0aGlzLT52bGFuX2FjdGlvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9WTEFOX1RBRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF92bGFuX3RhZ19wYWNrKCZ0aGlzLT52bGFuX3RhZywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9UUElEX0lOREVYKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnRwaWRfaW5kZXgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9GTE9XX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9NQUNfTEVBUk5JTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX1ZMQU5fQUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9WTEFOX1RBRykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAzOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19DRkdfSURfVFBJRF9JTkRFWCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19DRkdfSURfRkxPV19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPmZsb3dfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX01BQ19MRUFSTklORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPm1hY19sZWFybmluZykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19DRkdfSURfVkxBTl9BQ1RJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdXNfdmxhbl9hY3Rpb25fdW5wYWNrKCZ0aGlzLT52bGFuX2FjdGlvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9WTEFOX1RBRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF92bGFuX3RhZ191bnBhY2soJnRoaXMtPnZsYW5fdGFnLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19DRkdfSURfVFBJRF9JTkRFWCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT50cGlkX2luZGV4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX0ZMT1dfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9NQUNfTEVBUk5JTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9WTEFOX0FDVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX1ZMQU5fVEFHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19DRkdfSURfVFBJRF9JTkRFWCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX0ZMT1dfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmZsb3dfaWQgPiAoYmNtb2x0X2Zsb3dfaWQpIDQwOTUpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9GTE9XX0lEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9WTEFOX0FDVElPTikpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnZsYW5fYWN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9VU19WTEFOX0FDVElPTl9BREQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9VU19WTEFOX0FDVElPTl9UUkFOU1BBUkVOVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX1ZMQU5fQUNUSU9OOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19DRkdfSURfVkxBTl9UQUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdmxhbl90YWdfYm91bmRzX2NoZWNrKCZ0aGlzLT52bGFuX3RhZykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9WTEFOX1RBRzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19DRkdfSURfVFBJRF9JTkRFWCkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+dHBpZF9pbmRleCA+IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9UUElEX0lOREVYOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX25pX2tleV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9uaV9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2tleV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcy0+cG9uX25pKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9uaV9rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fbmlfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2tleV91bnBhY2soYmNtb2x0X2dwb25fbmlfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgKHVpbnQ4X3QgKikgJnRoaXMtPnBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX25pX2tleV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnBvbl9uaSA+IChiY21vbHRfZ3Bvbl9uaSkgMTUpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX05JX0tFWV9JRF9QT05fTkk7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUE9OX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wb25fc3RhdHVzLnN0YXRlID0gQkNNT0xUX1BPTl9TVEFURV9JTkFDVElWRTsKKyAgICAgICAgdGhpcy0+cG9uX3N0YXR1cy5sb3Nfc3RhdHVzID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9BVkFJTEFCTEVfQkFORFdJRFRIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmF2YWlsYWJsZV9iYW5kd2lkdGguY2JyX2J3ID0gMDsKKyAgICAgICAgdGhpcy0+YXZhaWxhYmxlX2JhbmR3aWR0aC50b3RhbF9idyA9IDA7CisgICAgICAgIHRoaXMtPmF2YWlsYWJsZV9iYW5kd2lkdGgubmV4dF9vbnVfdG90YWxfYncgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfTlVNQkVSX09GX0FDVElWRV9PTlVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm51bWJlcl9vZl9hY3RpdmVfb251cyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9OVU1CRVJfT0ZfQUNUSVZFX1NUQU5EQllfT05VUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5udW1iZXJfb2ZfYWN0aXZlX3N0YW5kYnlfb251cyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkJTX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wcmJzX3N0YXR1cy5sb2NrX3N0YXRlID0gQkNNT0xUX1BSQlNfTE9DS19TVEFURV9VTkxPQ0tFRDsKKyAgICAgICAgdGhpcy0+cHJic19zdGF0dXMuZXJyb3JfY291bnRzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPTl9ESVNUQU5DRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wb25fZGlzdGFuY2UubWF4X2xvZ19kaXN0YW5jZSA9IDIwOworICAgICAgICB0aGlzLT5wb25fZGlzdGFuY2UubWF4X2RpZmZfcmVhY2ggPSAyMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1JBTkdJTkdfV0lORE9XX1NJWkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmFuZ2luZ193aW5kb3dfc2l6ZSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkVBU1NJR05FRF9FUVVBTElaQVRJT05fREVMQVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cHJlYXNzaWduZWRfZXF1YWxpemF0aW9uX2RlbGF5ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0VRRF9DWUNMRVNfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmVxZF9jeWNsZXNfbnVtYmVyID0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPV0VSX0xFVkVMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBvd2VyX2xldmVsLnBsc19tYXhpbXVtX2FsbG9jYXRpb25fc2l6ZSA9IDEyMDsKKyAgICAgICAgdGhpcy0+cG93ZXJfbGV2ZWwubW9kZSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9EU19GRUNfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5kc19mZWNfbW9kZSA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0VOQUJMRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RSSUZUX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZHJpZnRfY29udHJvbC5kcmlmdF9pbnRlcnZhbCA9IDEwMDA7CisgICAgICAgIHRoaXMtPmRyaWZ0X2NvbnRyb2wuZHJpZnRfbGltaXQgPSA0OworICAgICAgICB0aGlzLT5kcmlmdF9jb250cm9sLnRyYW5zbWlzc2lvbl9jb250cm9sX2xpbWl0ID0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RTX0JFUl9SRVBPUlRJTkdfSU5URVJWQUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbCA9IChiY21vbHRfYmVyX2ludGVydmFsKSA1MDAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfTE9TX0FMQVJNX1RIUkVTSE9MRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5sb3NfYWxhcm1fdGhyZXNob2xkID0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0xPU19JTklUSUFMX1ZBTFVFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmxvc19pbml0aWFsX3ZhbHVlID0gQkNNT0xUX1NUQVRVU19PTjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX09OVV9BTEFSTVNfVEhSRVNIT0xEUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vbnVfYWxhcm1zX3RocmVzaG9sZHMubG9zaSA9IDQ7CisgICAgICAgIHRoaXMtPm9udV9hbGFybXNfdGhyZXNob2xkcy5sb2ZpID0gNDsKKyAgICAgICAgdGhpcy0+b251X2FsYXJtc190aHJlc2hvbGRzLmxvYW1pID0gMzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0JFUl9NT05JVE9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmJlcl9tb25pdG9yLnVzX2Jlcl9pbnRlcnZhbCA9IDUwMDA7CisgICAgICAgIHRoaXMtPmJlcl9tb25pdG9yLnNmX3RocmVzaG9sZCA9IDM7CisgICAgICAgIHRoaXMtPmJlcl9tb25pdG9yLnNkX3RocmVzaG9sZCA9IDU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QTE9BTV9BQ0tfVElNRU9VVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wbG9hbV9hY2tfdGltZW91dCA9IDIwMDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9PTlVfQUNUSVZBVElPTikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vbnVfYWN0aXZhdGlvbi5rZXlfZXhjaGFuZ2UgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOworICAgICAgICB0aGlzLT5vbnVfYWN0aXZhdGlvbi5wYXNzd29yZF9hdXRoZW50aWNhdGlvbiA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0VOQUJMRTsKKyAgICAgICAgdGhpcy0+b251X2FjdGl2YXRpb24uZmFpbF9kdWVfdG9fcGFzc3dvcmRfYXV0aGVudGljYXRpb25fZmFpbHVyZSA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0VOQUJMRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1NOX0FDUVVJU0lUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnNuX2FjcXVpc2l0aW9uLmludGVydmFsID0gMTAwMDsKKyAgICAgICAgdGhpcy0+c25fYWNxdWlzaXRpb24uY29udHJvbCA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU7CisgICAgICAgIHRoaXMtPnNuX2FjcXVpc2l0aW9uLm9udV9wb3N0X2Rpc2NvdmVyeV9tb2RlID0gQkNNT0xUX09OVV9QT1NUX0RJU0NPVkVSWV9NT0RFX0RJU0FCTEU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9LRVlfRVhDSEFOR0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+a2V5X2V4Y2hhbmdlLmludGVydmFsID0gMTAwMDA7CisgICAgICAgIHRoaXMtPmtleV9leGNoYW5nZS5jb250cm9sID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRTsKKyAgICAgICAgdGhpcy0+a2V5X2V4Y2hhbmdlLm1vZGUgPSBCQ01PTFRfS0VZX0VYQ0hBTkdFX01PREVfTk9STUFMOworICAgICAgICB0aGlzLT5rZXlfZXhjaGFuZ2UuZW5jcnlwdGVkX3BvcnRzX29ubHkgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9FTkFCTEU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElORykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wcm90ZWN0aW9uX3N3aXRjaGluZy50aW1lb3V0ID0gMTAwOworICAgICAgICB0aGlzLT5wcm90ZWN0aW9uX3N3aXRjaGluZy5ncGlvX3BpbiA9IEJDTU9MVF9HUElPX1BJTl9VTkNPTkZJR1VSRUQ7CisgICAgICAgIHRoaXMtPnByb3RlY3Rpb25fc3dpdGNoaW5nLm9wdGlvbnMgPSAoYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19vcHRpb25zKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQ0JSX1JUX0FMTE9DQVRJT05fUFJPRklMRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLm1hXzcgPSA2NDsKKyAgICAgICAgdGhpcy0+Y2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZS5tYV8zID0gMjU2OworICAgICAgICB0aGlzLT5jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLm1hXzEgPSA1MTI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9DQlJfTlJUX0FMTE9DQVRJT05fUFJPRklMRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZS5hcnJbMF0gPSA0MDk2OworICAgICAgICB0aGlzLT5jYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZS5hcnJbMV0gPSA4MTkyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfREJBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRiYS5zcl9yZXBvcnRpbmdfYmxvY2tfc2l6ZSA9IDQ4OworICAgICAgICB0aGlzLT5kYmEuZGJhX21vZGUgPSBCQ01PTFRfREJBX01PREVfTk9STUFMOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUE9XRVJfTUFOQUdFTUVOVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wb3dlcl9tYW5hZ2VtZW50Lmlsb3dwb3dlciA9IDE2MDA7CisgICAgICAgIHRoaXMtPnBvd2VyX21hbmFnZW1lbnQuaWF3YXJlID0gMTYwOworICAgICAgICB0aGlzLT5wb3dlcl9tYW5hZ2VtZW50Lml0cmFuc2luaXQgPSA4MDsKKyAgICAgICAgdGhpcy0+cG93ZXJfbWFuYWdlbWVudC5pdHhpbml0ID0gNDA7CisgICAgICAgIHRoaXMtPnBvd2VyX21hbmFnZW1lbnQuaXJ4b2ZmID0gMTYwMDsKKyAgICAgICAgdGhpcy0+cG93ZXJfbWFuYWdlbWVudC5sb3dfcG93ZXJfY2xvYmkgPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUk9HVUVfT05VX0RFVEVDVElPTl9QUk9DRVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5jb250cm9sID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRTsKKyAgICAgICAgdGhpcy0+cm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWxnb3JpdGhtX3R5cGUgPSBCQ01PTFRfUk9HVUVfREVURUNUSU9OX0FMR09SSVRITV9UWVBFX0VBUkxZX1JPR1VFX0RFVEVDVElPTjsKKyAgICAgICAgdGhpcy0+cm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0udS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24ubWVhc3VyZW1lbnRfdHlwZSA9IEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX1NJTEVOVF9XSU5ET1c7CisgICAgICAgIHRoaXMtPnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuZWFybHlfcm9ndWVfZGV0ZWN0aW9uLmludGVydmFsID0gMTAwMDA7CisgICAgICAgIHRoaXMtPnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuZWFybHlfcm9ndWVfZGV0ZWN0aW9uLnNlY29uZF9yYW5naW5nX3dpbmRvdyA9IEJDTU9TX0ZBTFNFOworICAgICAgICB0aGlzLT5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS51LmVhcmx5X3JvZ3VlX2RldGVjdGlvbi5hbGxvY190eXBlX3RvX3NjYW4gPSBCQ01PTFRfQUxMT0NfVFlQRV9UT19TQ0FOX0FMTDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BFUklPRElDX1NUQU5EQllfUE9OX01PTklUT1JJTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZy5pbnRlcnZhbCA9IDUwMDA7CisgICAgICAgIHRoaXMtPnBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcuY29udHJvbCA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkJTX0NIRUNLRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cHJic19jaGVja2VyLnBvbHlub20gPSBCQ01PTFRfUFJCU19QT0xZTk9NSUFMX1BSQlNfNzsKKyAgICAgICAgdGhpcy0+cHJic19jaGVja2VyLm1vZGUgPSBCQ01PTFRfUFJCU19DSEVDS0VSX01PREVfU0VMRl9TWU5DOworICAgICAgICB0aGlzLT5wcmJzX2NoZWNrZXIuZGF0YV9pbnZlcnQgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgdGhpcy0+cHJic19jaGVja2VyLmNvbnRyb2wgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUFJCU19HRU5FUkFUT1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cHJic19nZW5lcmF0b3IucG9seW5vbSA9IEJDTU9MVF9QUkJTX1BPTFlOT01JQUxfUFJCU183OworICAgICAgICB0aGlzLT5wcmJzX2dlbmVyYXRvci5lcnJvcl9pbnNlcnQgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgdGhpcy0+cHJic19nZW5lcmF0b3IuaW52ZXJ0ID0gQkNNT1NfRkFMU0U7CisgICAgICAgIHRoaXMtPnByYnNfZ2VuZXJhdG9yLmNvbnRyb2wgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfTUlOX0RBVEFfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bWluX2RhdGFfYWxsb2NfaWQgPSAoYmNtb2x0X2dwb25fYWxsb2NfaWQpIDI1NjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0FVVE9NQVRJQ19PTlVfREVBQ1RJVkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLmxvcyA9IEJDTU9TX1RSVUU7CisgICAgICAgIHRoaXMtPmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLm9udV9hbGFybXMgPSBCQ01PU19UUlVFOworICAgICAgICB0aGlzLT5hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi50aXdpID0gQkNNT1NfVFJVRTsKKyAgICAgICAgdGhpcy0+YXV0b21hdGljX29udV9kZWFjdGl2YXRpb24uYWNrX3RpbWVvdXQgPSBCQ01PU19UUlVFOworICAgICAgICB0aGlzLT5hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi5zZmkgPSBCQ01PU19UUlVFOworICAgICAgICB0aGlzLT5hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi5sb2tpID0gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1VTX0JBTkRXSURUSF9MSU1JVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT51c19iYW5kd2lkdGhfbGltaXQgPSAxNTU1MjAwMDBVTDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0FMTF9PTlVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFsbF9vbnVzLmxlbiA9IDA7CisgICAgICAgIHRoaXMtPmFsbF9vbnVzLnZhbCA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9BTExfTUNBU1RfR0VNX1BPUlRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFsbF9tY2FzdF9nZW1fcG9ydHMubGVuID0gMDsKKyAgICAgICAgdGhpcy0+YWxsX21jYXN0X2dlbV9wb3J0cy52YWwgPSBOVUxMOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfREVCVUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZGVidWcubnVtYmVyX29mX2dlbV9wb3J0c19wZXJfb251ID0gNjQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9PTlVfVVBHUkFERV9QQVJBTVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b251X3VwZ3JhZGVfcGFyYW1zLnJlc3BvbnNlX3RpbWVvdXRfbXMgPSAxMDAwOworICAgICAgICB0aGlzLT5vbnVfdXBncmFkZV9wYXJhbXMubWF4X3JldHJ5X2NvdW50ID0gMjM7CisgICAgICAgIHRoaXMtPm9udV91cGdyYWRlX3BhcmFtcy5vbWNpX2Zvcm1hdCA9IEJDTU9MVF9PTUNJX0RFVklDRV9JRF9FWFRFTkRFRDsKKyAgICAgICAgdGhpcy0+b251X3VwZ3JhZGVfcGFyYW1zLndpbmRvd19zaXplID0gMzI7CisgICAgICAgIHRoaXMtPm9udV91cGdyYWRlX3BhcmFtcy5hY3RpdmF0ZV9jb21taXQgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgdGhpcy0+b251X3VwZ3JhZGVfcGFyYW1zLmRlbGF5X2Zvcl9jb21taXRfbXMgPSA0MDAwMFVMOworICAgICAgICB0aGlzLT5vbnVfdXBncmFkZV9wYXJhbXMubWF4X2FjdGl2YXRpb25fYXR0ZW1wdHMgPSAyMzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BTX0NfV0FJVF9CRUZPUkVfREVBQ1RJVkFUSU9OX1RJTUVPVVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cHNfY193YWl0X2JlZm9yZV9kZWFjdGl2YXRpb25fdGltZW91dCA9IDEwMDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9CSVAzMl9JTkRJQ0FUSU9OX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YmlwMzJfaW5kaWNhdGlvbl9jb250cm9sID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRU5BQkxFOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPTl9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcG9uX3N0YXR1c19wYWNrKCZ0aGlzLT5wb25fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0FWQUlMQUJMRV9CQU5EV0lEVEgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGhfcGFjaygmdGhpcy0+YXZhaWxhYmxlX2JhbmR3aWR0aCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9OVU1CRVJfT0ZfQUNUSVZFX09OVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPm51bWJlcl9vZl9hY3RpdmVfb251cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfTlVNQkVSX09GX0FDVElWRV9TVEFOREJZX09OVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPm51bWJlcl9vZl9hY3RpdmVfc3RhbmRieV9vbnVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkJTX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wcmJzX3N0YXR1c19wYWNrKCZ0aGlzLT5wcmJzX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QT05fRElTVEFOQ0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcG9uX2Rpc3RhbmNlX3BhY2soJnRoaXMtPnBvbl9kaXN0YW5jZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9SQU5HSU5HX1dJTkRPV19TSVpFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5yYW5naW5nX3dpbmRvd19zaXplKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkVBU1NJR05FRF9FUVVBTElaQVRJT05fREVMQVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnByZWFzc2lnbmVkX2VxdWFsaXphdGlvbl9kZWxheSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfRVFEX0NZQ0xFU19OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmVxZF9jeWNsZXNfbnVtYmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QT1dFUl9MRVZFTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fcG93ZXJfbGV2ZWxfcGFjaygmdGhpcy0+cG93ZXJfbGV2ZWwsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfRFNfRkVDX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfY29udHJvbF9zdGF0ZV9wYWNrKHRoaXMtPmRzX2ZlY19tb2RlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RSSUZUX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcG9uX2RyaWZ0X2NvbnRyb2xfcGFjaygmdGhpcy0+ZHJpZnRfY29udHJvbCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9EU19CRVJfUkVQT1JUSU5HX0lOVEVSVkFMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMtPmRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0xPU19BTEFSTV9USFJFU0hPTEQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bG9zX2FsYXJtX3RocmVzaG9sZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfTE9TX0lOSVRJQUxfVkFMVUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+bG9zX2luaXRpYWxfdmFsdWUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfT05VX0FMQVJNU19USFJFU0hPTERTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fb251X2FsYXJtc190aHJlc2hvbGRzX3BhY2soJnRoaXMtPm9udV9hbGFybXNfdGhyZXNob2xkcywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9CRVJfTU9OSVRPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9iZXJfbW9uaXRvcl9wYXJhbXNfcGFjaygmdGhpcy0+YmVyX21vbml0b3IsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUExPQU1fQUNLX1RJTUVPVVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnBsb2FtX2Fja190aW1lb3V0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9PTlVfQUNUSVZBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX29udV9hY3RpdmF0aW9uX3BhY2soJnRoaXMtPm9udV9hY3RpdmF0aW9uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1NOX0FDUVVJU0lUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb25fcGFjaygmdGhpcy0+c25fYWNxdWlzaXRpb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfS0VZX0VYQ0hBTkdFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fa2V5X2V4Y2hhbmdlX3BhY2soJnRoaXMtPmtleV9leGNoYW5nZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfcGFjaygmdGhpcy0+cHJvdGVjdGlvbl9zd2l0Y2hpbmcsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQ0JSX1JUX0FMTE9DQVRJT05fUFJPRklMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlX3BhY2soJnRoaXMtPmNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQ0JSX05SVF9BTExPQ0FUSU9OX1BST0ZJTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXJyX3UxNl8yX3BhY2soJnRoaXMtPmNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RCQSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fZGJhX3BhY2soJnRoaXMtPmRiYSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QT1dFUl9NQU5BR0VNRU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X29udV9wb3dlcl9tYW5hZ2VtZW50X2NvbmZpZ3VyYXRpb25fcGFjaygmdGhpcy0+cG93ZXJfbWFuYWdlbWVudCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9ST0dVRV9PTlVfREVURUNUSU9OX1BST0NFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzX3BhY2soJnRoaXMtPnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QRVJJT0RJQ19TVEFOREJZX1BPTl9NT05JVE9SSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfcGFjaygmdGhpcy0+cGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkJTX0NIRUNLRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZ19wYWNrKCZ0aGlzLT5wcmJzX2NoZWNrZXIsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUFJCU19HRU5FUkFUT1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnX3BhY2soJnRoaXMtPnByYnNfZ2VuZXJhdG9yLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX01JTl9EQVRBX0FMTE9DX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPm1pbl9kYXRhX2FsbG9jX2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9BVVRPTUFUSUNfT05VX0RFQUNUSVZBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbl9wYWNrKCZ0aGlzLT5hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9VU19CQU5EV0lEVEhfTElNSVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnVzX2JhbmR3aWR0aF9saW1pdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQUxMX09OVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4X3BhY2soJnRoaXMtPmFsbF9vbnVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0FMTF9NQ0FTVF9HRU1fUE9SVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjhfcGFjaygmdGhpcy0+YWxsX21jYXN0X2dlbV9wb3J0cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9ERUJVRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX25pX2RlYnVnX3BhY2soJnRoaXMtPmRlYnVnLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX09OVV9VUEdSQURFX1BBUkFNUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtc19wYWNrKCZ0aGlzLT5vbnVfdXBncmFkZV9wYXJhbXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUFNfQ19XQUlUX0JFRk9SRV9ERUFDVElWQVRJT05fVElNRU9VVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+cHNfY193YWl0X2JlZm9yZV9kZWFjdGl2YXRpb25fdGltZW91dCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQklQMzJfSU5ESUNBVElPTl9DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfcGFjayh0aGlzLT5iaXAzMl9pbmRpY2F0aW9uX2NvbnRyb2wsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPTl9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0FWQUlMQUJMRV9CQU5EV0lEVEgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9OVU1CRVJfT0ZfQUNUSVZFX09OVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX05VTUJFUl9PRl9BQ1RJVkVfU1RBTkRCWV9PTlVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkJTX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA1OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUE9OX0RJU1RBTkNFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9SQU5HSU5HX1dJTkRPV19TSVpFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkVBU1NJR05FRF9FUVVBTElaQVRJT05fREVMQVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0VRRF9DWUNMRVNfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QT1dFUl9MRVZFTCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA1OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfRFNfRkVDX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RSSUZUX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RTX0JFUl9SRVBPUlRJTkdfSU5URVJWQUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0xPU19BTEFSTV9USFJFU0hPTEQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0xPU19JTklUSUFMX1ZBTFVFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9PTlVfQUxBUk1TX1RIUkVTSE9MRFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0JFUl9NT05JVE9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDY7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QTE9BTV9BQ0tfVElNRU9VVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfT05VX0FDVElWQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1NOX0FDUVVJU0lUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDY7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9LRVlfRVhDSEFOR0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDc7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9DQlJfUlRfQUxMT0NBVElPTl9QUk9GSUxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDY7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9DQlJfTlJUX0FMTE9DQVRJT05fUFJPRklMRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfREJBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QT1dFUl9NQU5BR0VNRU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUk9HVUVfT05VX0RFVEVDVElPTl9QUk9DRVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3NfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcyk7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QRVJJT0RJQ19TVEFOREJZX1BPTl9NT05JVE9SSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkJTX0NIRUNLRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BSQlNfR0VORVJBVE9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9NSU5fREFUQV9BTExPQ19JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQVVUT01BVElDX09OVV9ERUFDVElWQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1VTX0JBTkRXSURUSF9MSU1JVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQUxMX09OVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+YWxsX29udXMpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQUxMX01DQVNUX0dFTV9QT1JUUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjhfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmFsbF9tY2FzdF9nZW1fcG9ydHMpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfREVCVUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX09OVV9VUEdSQURFX1BBUkFNUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BTX0NfV0FJVF9CRUZPUkVfREVBQ1RJVkFUSU9OX1RJTUVPVVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0JJUDMyX0lORElDQVRJT05fQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUE9OX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fc3RhdHVzX3VucGFjaygmdGhpcy0+cG9uX3N0YXR1cywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0FWQUlMQUJMRV9CQU5EV0lEVEgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGhfdW5wYWNrKCZ0aGlzLT5hdmFpbGFibGVfYmFuZHdpZHRoLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfTlVNQkVSX09GX0FDVElWRV9PTlVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5udW1iZXJfb2ZfYWN0aXZlX29udXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX05VTUJFUl9PRl9BQ1RJVkVfU1RBTkRCWV9PTlVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5udW1iZXJfb2ZfYWN0aXZlX3N0YW5kYnlfb251cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUFJCU19TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcHJic19zdGF0dXNfdW5wYWNrKCZ0aGlzLT5wcmJzX3N0YXR1cywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPTl9ESVNUQU5DRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fZGlzdGFuY2VfdW5wYWNrKCZ0aGlzLT5wb25fZGlzdGFuY2UsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9SQU5HSU5HX1dJTkRPV19TSVpFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5yYW5naW5nX3dpbmRvd19zaXplKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkVBU1NJR05FRF9FUVVBTElaQVRJT05fREVMQVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnByZWFzc2lnbmVkX2VxdWFsaXphdGlvbl9kZWxheSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfRVFEX0NZQ0xFU19OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmVxZF9jeWNsZXNfbnVtYmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QT1dFUl9MRVZFTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fcG93ZXJfbGV2ZWxfdW5wYWNrKCZ0aGlzLT5wb3dlcl9sZXZlbCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RTX0ZFQ19NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfdW5wYWNrKCZ0aGlzLT5kc19mZWNfbW9kZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9EUklGVF9DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sX3VucGFjaygmdGhpcy0+ZHJpZnRfY29udHJvbCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RTX0JFUl9SRVBPUlRJTkdfSU5URVJWQUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgKHVpbnQzMl90ICopICZ0aGlzLT5kc19iZXJfcmVwb3J0aW5nX2ludGVydmFsKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9MT1NfQUxBUk1fVEhSRVNIT0xEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmxvc19hbGFybV90aHJlc2hvbGQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0xPU19JTklUSUFMX1ZBTFVFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPmxvc19pbml0aWFsX3ZhbHVlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX09OVV9BTEFSTVNfVEhSRVNIT0xEUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX29udV9hbGFybXNfdGhyZXNob2xkc191bnBhY2soJnRoaXMtPm9udV9hbGFybXNfdGhyZXNob2xkcywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0JFUl9NT05JVE9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Jlcl9tb25pdG9yX3BhcmFtc191bnBhY2soJnRoaXMtPmJlcl9tb25pdG9yLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUExPQU1fQUNLX1RJTUVPVVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnBsb2FtX2Fja190aW1lb3V0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9PTlVfQUNUSVZBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX29udV9hY3RpdmF0aW9uX3VucGFjaygmdGhpcy0+b251X2FjdGl2YXRpb24sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9TTl9BQ1FVSVNJVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX3NuX2FjcXVpc2l0aW9uX3VucGFjaygmdGhpcy0+c25fYWNxdWlzaXRpb24sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9LRVlfRVhDSEFOR0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9rZXlfZXhjaGFuZ2VfdW5wYWNrKCZ0aGlzLT5rZXlfZXhjaGFuZ2UsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdW5wYWNrKCZ0aGlzLT5wcm90ZWN0aW9uX3N3aXRjaGluZywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0NCUl9SVF9BTExPQ0FUSU9OX1BST0ZJTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZV91bnBhY2soJnRoaXMtPmNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9DQlJfTlJUX0FMTE9DQVRJT05fUFJPRklMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfdTE2XzJfdW5wYWNrKCZ0aGlzLT5jYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RCQSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fZGJhX3VucGFjaygmdGhpcy0+ZGJhLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUE9XRVJfTUFOQUdFTUVOVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uX3VucGFjaygmdGhpcy0+cG93ZXJfbWFuYWdlbWVudCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1JPR1VFX09OVV9ERVRFQ1RJT05fUFJPQ0VTUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3NfdW5wYWNrKCZ0aGlzLT5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QRVJJT0RJQ19TVEFOREJZX1BPTl9NT05JVE9SSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfdW5wYWNrKCZ0aGlzLT5wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUFJCU19DSEVDS0VSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWdfdW5wYWNrKCZ0aGlzLT5wcmJzX2NoZWNrZXIsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkJTX0dFTkVSQVRPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWdfdW5wYWNrKCZ0aGlzLT5wcmJzX2dlbmVyYXRvciwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX01JTl9EQVRBX0FMTE9DX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+bWluX2RhdGFfYWxsb2NfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0FVVE9NQVRJQ19PTlVfREVBQ1RJVkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uX3VucGFjaygmdGhpcy0+YXV0b21hdGljX29udV9kZWFjdGl2YXRpb24sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9VU19CQU5EV0lEVEhfTElNSVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnVzX2JhbmR3aWR0aF9saW1pdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQUxMX09OVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4X3VucGFjaygmdGhpcy0+YWxsX29udXMsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9BTExfTUNBU1RfR0VNX1BPUlRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4X3VucGFjaygmdGhpcy0+YWxsX21jYXN0X2dlbV9wb3J0cywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RFQlVHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fbmlfZGVidWdfdW5wYWNrKCZ0aGlzLT5kZWJ1ZywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX09OVV9VUEdSQURFX1BBUkFNUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtc191bnBhY2soJnRoaXMtPm9udV91cGdyYWRlX3BhcmFtcywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BTX0NfV0FJVF9CRUZPUkVfREVBQ1RJVkFUSU9OX1RJTUVPVVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnBzX2Nfd2FpdF9iZWZvcmVfZGVhY3RpdmF0aW9uX3RpbWVvdXQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0JJUDMyX0lORElDQVRJT05fQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9jb250cm9sX3N0YXRlX3VucGFjaygmdGhpcy0+YmlwMzJfaW5kaWNhdGlvbl9jb250cm9sLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUE9OX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0FWQUlMQUJMRV9CQU5EV0lEVEgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfTlVNQkVSX09GX0FDVElWRV9PTlVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfTlVNQkVSX09GX0FDVElWRV9TVEFOREJZX09OVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkJTX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPTl9ESVNUQU5DRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1JBTkdJTkdfV0lORE9XX1NJWkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkVBU1NJR05FRF9FUVVBTElaQVRJT05fREVMQVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9FUURfQ1lDTEVTX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPV0VSX0xFVkVMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfRFNfRkVDX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9EUklGVF9DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfRFNfQkVSX1JFUE9SVElOR19JTlRFUlZBTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0xPU19BTEFSTV9USFJFU0hPTEQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9MT1NfSU5JVElBTF9WQUxVRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX09OVV9BTEFSTVNfVEhSRVNIT0xEUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0JFUl9NT05JVE9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUExPQU1fQUNLX1RJTUVPVVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9PTlVfQUNUSVZBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1NOX0FDUVVJU0lUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfS0VZX0VYQ0hBTkdFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA3KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9DQlJfUlRfQUxMT0NBVElPTl9QUk9GSUxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQ0JSX05SVF9BTExPQ0FUSU9OX1BST0ZJTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9EQkEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QT1dFUl9NQU5BR0VNRU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1JPR1VFX09OVV9ERVRFQ1RJT05fUFJPQ0VTUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3Nfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUEVSSU9ESUNfU1RBTkRCWV9QT05fTU9OSVRPUklORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BSQlNfR0VORVJBVE9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfTUlOX0RBVEFfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9BVVRPTUFUSUNfT05VX0RFQUNUSVZBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1VTX0JBTkRXSURUSF9MSU1JVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0FMTF9PTlVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOF9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9BTExfTUNBU1RfR0VNX1BPUlRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4X3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RFQlVHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfT05VX1VQR1JBREVfUEFSQU1TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BTX0NfV0FJVF9CRUZPUkVfREVBQ1RJVkFUSU9OX1RJTUVPVVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9CSVAzMl9JTkRJQ0FUSU9OX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX25pX2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QT05fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bvbl9zdGF0dXNfYm91bmRzX2NoZWNrKCZ0aGlzLT5wb25fc3RhdHVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPTl9TVEFUVVM7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0FWQUlMQUJMRV9CQU5EV0lEVEgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGhfYm91bmRzX2NoZWNrKCZ0aGlzLT5hdmFpbGFibGVfYmFuZHdpZHRoKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0FWQUlMQUJMRV9CQU5EV0lEVEg7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BSQlNfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3ByYnNfc3RhdHVzX2JvdW5kc19jaGVjaygmdGhpcy0+cHJic19zdGF0dXMpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUFJCU19TVEFUVVM7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPTl9ESVNUQU5DRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fZGlzdGFuY2VfYm91bmRzX2NoZWNrKCZ0aGlzLT5wb25fZGlzdGFuY2UpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUE9OX0RJU1RBTkNFOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkVBU1NJR05FRF9FUVVBTElaQVRJT05fREVMQVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnByZWFzc2lnbmVkX2VxdWFsaXphdGlvbl9kZWxheSA+IDE2Nzc2OTYwVUwpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkVBU1NJR05FRF9FUVVBTElaQVRJT05fREVMQVk7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0VRRF9DWUNMRVNfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5lcWRfY3ljbGVzX251bWJlciA+IDI1NSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0VRRF9DWUNMRVNfTlVNQkVSOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QT1dFUl9MRVZFTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fcG93ZXJfbGV2ZWxfYm91bmRzX2NoZWNrKCZ0aGlzLT5wb3dlcl9sZXZlbCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QT1dFUl9MRVZFTDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfRFNfRkVDX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5kc19mZWNfbW9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQ09OVFJPTF9TVEFURV9FTkFCTEU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9EU19GRUNfTU9ERTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RSSUZUX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcG9uX2RyaWZ0X2NvbnRyb2xfYm91bmRzX2NoZWNrKCZ0aGlzLT5kcmlmdF9jb250cm9sKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RSSUZUX0NPTlRST0w7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RTX0JFUl9SRVBPUlRJTkdfSU5URVJWQUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwgPiAoYmNtb2x0X2Jlcl9pbnRlcnZhbCkgNTM2ODcwOTExVUwpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9EU19CRVJfUkVQT1JUSU5HX0lOVEVSVkFMOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9MT1NfSU5JVElBTF9WQUxVRSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmxvc19pbml0aWFsX3ZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0xPU19JTklUSUFMX1ZBTFVFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfT05VX0FMQVJNU19USFJFU0hPTERTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fb251X2FsYXJtc190aHJlc2hvbGRzX2JvdW5kc19jaGVjaygmdGhpcy0+b251X2FsYXJtc190aHJlc2hvbGRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX09OVV9BTEFSTVNfVEhSRVNIT0xEUzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQkVSX01PTklUT1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYmVyX21vbml0b3JfcGFyYW1zX2JvdW5kc19jaGVjaygmdGhpcy0+YmVyX21vbml0b3IpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQkVSX01PTklUT1I7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX09OVV9BQ1RJVkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fb251X2FjdGl2YXRpb25fYm91bmRzX2NoZWNrKCZ0aGlzLT5vbnVfYWN0aXZhdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9PTlVfQUNUSVZBVElPTjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfU05fQUNRVUlTSVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9zbl9hY3F1aXNpdGlvbl9ib3VuZHNfY2hlY2soJnRoaXMtPnNuX2FjcXVpc2l0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1NOX0FDUVVJU0lUSU9OOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9LRVlfRVhDSEFOR0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9rZXlfZXhjaGFuZ2VfYm91bmRzX2NoZWNrKCZ0aGlzLT5rZXlfZXhjaGFuZ2UpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfS0VZX0VYQ0hBTkdFOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYm91bmRzX2NoZWNrKCZ0aGlzLT5wcm90ZWN0aW9uX3N3aXRjaGluZykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElORzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQ0JSX1JUX0FMTE9DQVRJT05fUFJPRklMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlX2JvdW5kc19jaGVjaygmdGhpcy0+Y2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9DQlJfUlRfQUxMT0NBVElPTl9QUk9GSUxFOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9DQlJfTlJUX0FMTE9DQVRJT05fUFJPRklMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfdTE2XzJfYm91bmRzX2NoZWNrKCZ0aGlzLT5jYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9DQlJfTlJUX0FMTE9DQVRJT05fUFJPRklMRTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfREJBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bvbl9kYmFfYm91bmRzX2NoZWNrKCZ0aGlzLT5kYmEpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfREJBOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QT1dFUl9NQU5BR0VNRU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X29udV9wb3dlcl9tYW5hZ2VtZW50X2NvbmZpZ3VyYXRpb25fYm91bmRzX2NoZWNrKCZ0aGlzLT5wb3dlcl9tYW5hZ2VtZW50KSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPV0VSX01BTkFHRU1FTlQ7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1JPR1VFX09OVV9ERVRFQ1RJT05fUFJPQ0VTUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3NfYm91bmRzX2NoZWNrKCZ0aGlzLT5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUk9HVUVfT05VX0RFVEVDVElPTl9QUk9DRVNTOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QRVJJT0RJQ19TVEFOREJZX1BPTl9NT05JVE9SSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfYm91bmRzX2NoZWNrKCZ0aGlzLT5wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BFUklPRElDX1NUQU5EQllfUE9OX01PTklUT1JJTkc7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnX2JvdW5kc19jaGVjaygmdGhpcy0+cHJic19jaGVja2VyKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUFJCU19HRU5FUkFUT1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnX2JvdW5kc19jaGVjaygmdGhpcy0+cHJic19nZW5lcmF0b3IpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUFJCU19HRU5FUkFUT1I7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX01JTl9EQVRBX0FMTE9DX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5taW5fZGF0YV9hbGxvY19pZCA8IChiY21vbHRfZ3Bvbl9hbGxvY19pZCkgMjU2KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfTUlOX0RBVEFfQUxMT0NfSUQ7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGhpcy0+bWluX2RhdGFfYWxsb2NfaWQgPiAoYmNtb2x0X2dwb25fYWxsb2NfaWQpIDMyMDApCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9NSU5fREFUQV9BTExPQ19JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQVVUT01BVElDX09OVV9ERUFDVElWQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb25fYm91bmRzX2NoZWNrKCZ0aGlzLT5hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9BVVRPTUFUSUNfT05VX0RFQUNUSVZBVElPTjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfVVNfQkFORFdJRFRIX0xJTUlUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT51c19iYW5kd2lkdGhfbGltaXQgPCA4MDAwMDBVTCkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1VTX0JBTkRXSURUSF9MSU1JVDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0aGlzLT51c19iYW5kd2lkdGhfbGltaXQgPiAxNTU1MjAwMDBVTCkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1VTX0JBTkRXSURUSF9MSU1JVDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQUxMX09OVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmFsbF9vbnVzLmxlbiA+IDEyOCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4X2JvdW5kc19jaGVjaygmdGhpcy0+YWxsX29udXMpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQUxMX09OVVM7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0FMTF9NQ0FTVF9HRU1fUE9SVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmFsbF9tY2FzdF9nZW1fcG9ydHMubGVuID4gMTI4KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOF9ib3VuZHNfY2hlY2soJnRoaXMtPmFsbF9tY2FzdF9nZW1fcG9ydHMpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQUxMX01DQVNUX0dFTV9QT1JUUzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfREVCVUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9uaV9kZWJ1Z19ib3VuZHNfY2hlY2soJnRoaXMtPmRlYnVnKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RFQlVHOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9PTlVfVVBHUkFERV9QQVJBTVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9wYXJhbXNfYm91bmRzX2NoZWNrKCZ0aGlzLT5vbnVfdXBncmFkZV9wYXJhbXMpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfT05VX1VQR1JBREVfUEFSQU1TOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9CSVAzMl9JTkRJQ0FUSU9OX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5iaXAzMl9pbmRpY2F0aW9uX2NvbnRyb2wpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRU5BQkxFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQklQMzJfSU5ESUNBVElPTl9DT05UUk9MOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9GRUNfQ09ERVdPUkRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZlY19jb2Rld29yZHMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX0ZFQ19DT0RFV09SRFNfVU5DT1JSRUNURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZmVjX2NvZGV3b3Jkc191bmNvcnJlY3RlZCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfQklQOF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5iaXA4X2J5dGVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9CSVA4X0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5iaXA4X2Vycm9ycyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfZ2VtX3BhY2tldHMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9EUk9QUEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2dlbV9kcm9wcGVkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9HRU1fSURMRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9nZW1faWRsZSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0NPUlJFQ1RFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9nZW1fY29ycmVjdGVkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9HRU1fSUxMRUdBTCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9nZW1faWxsZWdhbCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfVkFMSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfYWxsb2NhdGlvbnNfdmFsaWQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0lOVkFMSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfYWxsb2NhdGlvbnNfaW52YWxpZCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfRElTQUJMRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfYWxsb2NhdGlvbnNfZGlzYWJsZWQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9wbG9hbXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19OT05fSURMRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9wbG9hbXNfbm9uX2lkbGUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9wbG9hbXNfZXJyb3IgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19EUk9QUEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X3Bsb2Ftc19kcm9wcGVkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9DUFUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfY3B1ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9PTUNJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X29tY2kgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fU0hPUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfZHJvcHBlZF90b29fc2hvcnQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0RST1BQRURfVE9PX0xPTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfZHJvcHBlZF90b29fbG9uZyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfQ1JDX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9jcmNfZXJyb3JzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9LRVlfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2tleV9lcnJvcnMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0ZSQUdNRU5UU19FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfZnJhZ21lbnRzX2Vycm9ycyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUEFDS0VUU19EUk9QUEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X3BhY2tldHNfZHJvcHBlZCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfR0VNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X2dlbSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfUExPQU1TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X3Bsb2FtcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfR0VNX0ZSQUdNRU5UUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9nZW1fZnJhZ21lbnRzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9DUFUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfY3B1ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9PTUNJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X29tY2kgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0NQVV9PTUNJX1BBQ0tFVFNfRFJPUFBFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9jcHVfb21jaV9wYWNrZXRzX2Ryb3BwZWQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfSUxMRUdBTF9MRU5HVEgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfZHJvcHBlZF9pbGxlZ2FsX2xlbmd0aCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9UUElEX01JU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfZHJvcHBlZF90cGlkX21pc3MgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfVklEX01JU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfZHJvcHBlZF92aWRfbWlzcyA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfRkVDX0NPREVXT1JEUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZmVjX2NvZGV3b3JkcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX0ZFQ19DT0RFV09SRFNfVU5DT1JSRUNURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9CSVA4X0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5iaXA4X2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfQklQOF9FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmJpcDhfZXJyb3JzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2dlbV9wYWNrZXRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0RST1BQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2dlbV9kcm9wcGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0lETEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2dlbV9pZGxlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0NPUlJFQ1RFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfZ2VtX2NvcnJlY3RlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9JTExFR0FMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF9nZW1faWxsZWdhbCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX1ZBTElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF9hbGxvY2F0aW9uc192YWxpZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0lOVkFMSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2FsbG9jYXRpb25zX2ludmFsaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19ESVNBQkxFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfYWxsb2NhdGlvbnNfZGlzYWJsZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9QTE9BTVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X3Bsb2FtcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19OT05fSURMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfcGxvYW1zX25vbl9pZGxlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF9wbG9hbXNfZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfRFJPUFBFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfcGxvYW1zX2Ryb3BwZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9DUFUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2NwdSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX09NQ0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X29tY2kpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9PTUNJX1BBQ0tFVFNfQ1JDX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fU0hPUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2Ryb3BwZWRfdG9vX3Nob3J0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fTE9ORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfZHJvcHBlZF90b29fbG9uZykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0NSQ19FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2NyY19lcnJvcnMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9LRVlfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF9rZXlfZXJyb3JzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfRlJBR01FTlRTX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfZnJhZ21lbnRzX2Vycm9ycykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BBQ0tFVFNfRFJPUFBFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfcGFja2V0c19kcm9wcGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfR0VNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9nZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9QTE9BTVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X3Bsb2FtcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0dFTV9GUkFHTUVOVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X2dlbV9mcmFnbWVudHMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9DUFUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X2NwdSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX09NQ0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X29tY2kpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9DUFVfT01DSV9QQUNLRVRTX0RST1BQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9JTExFR0FMX0xFTkdUSCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dHhfZHJvcHBlZF9pbGxlZ2FsX2xlbmd0aCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfVFBJRF9NSVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9kcm9wcGVkX3RwaWRfbWlzcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfVklEX01JU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X2Ryb3BwZWRfdmlkX21pc3MpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9GRUNfQ09ERVdPUkRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfRkVDX0NPREVXT1JEU19VTkNPUlJFQ1RFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX0JJUDhfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9CSVA4X0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0RST1BQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9HRU1fSURMRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9DT1JSRUNURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9HRU1fSUxMRUdBTCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX1ZBTElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfSU5WQUxJRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0RJU0FCTEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUExPQU1TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX05PTl9JRExFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX0RST1BQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9DUFUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9PTUNJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0RST1BQRURfVE9PX1NIT1JUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fTE9ORykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0NSQ19FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9LRVlfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfRlJBR01FTlRTX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BBQ0tFVFNfRFJPUFBFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0dFTSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX1BMT0FNUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0dFTV9GUkFHTUVOVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9DUFUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9PTUNJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfQ1BVX09NQ0lfUEFDS0VUU19EUk9QUEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9JTExFR0FMX0xFTkdUSCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfVFBJRF9NSVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9WSURfTUlTUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfRkVDX0NPREVXT1JEUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZmVjX2NvZGV3b3JkcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX0ZFQ19DT0RFV09SRFNfVU5DT1JSRUNURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9CSVA4X0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5iaXA4X2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfQklQOF9FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmJpcDhfZXJyb3JzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2dlbV9wYWNrZXRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0RST1BQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2dlbV9kcm9wcGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0lETEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2dlbV9pZGxlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0NPUlJFQ1RFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfZ2VtX2NvcnJlY3RlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9JTExFR0FMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9nZW1faWxsZWdhbCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX1ZBTElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9hbGxvY2F0aW9uc192YWxpZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0lOVkFMSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2FsbG9jYXRpb25zX2ludmFsaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19ESVNBQkxFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfYWxsb2NhdGlvbnNfZGlzYWJsZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9QTE9BTVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X3Bsb2FtcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19OT05fSURMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfcGxvYW1zX25vbl9pZGxlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9wbG9hbXNfZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfRFJPUFBFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfcGxvYW1zX2Ryb3BwZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9DUFUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2NwdSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX09NQ0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X29tY2kpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9PTUNJX1BBQ0tFVFNfQ1JDX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fU0hPUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2Ryb3BwZWRfdG9vX3Nob3J0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fTE9ORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfZHJvcHBlZF90b29fbG9uZykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0NSQ19FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2NyY19lcnJvcnMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9LRVlfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9rZXlfZXJyb3JzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfRlJBR01FTlRTX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfZnJhZ21lbnRzX2Vycm9ycykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BBQ0tFVFNfRFJPUFBFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfcGFja2V0c19kcm9wcGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfR0VNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50eF9nZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9QTE9BTVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X3Bsb2FtcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0dFTV9GUkFHTUVOVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X2dlbV9mcmFnbWVudHMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9DUFUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X2NwdSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX09NQ0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X29tY2kpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9DUFVfT01DSV9QQUNLRVRTX0RST1BQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9JTExFR0FMX0xFTkdUSCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfZHJvcHBlZF9pbGxlZ2FsX2xlbmd0aCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfVFBJRF9NSVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50eF9kcm9wcGVkX3RwaWRfbWlzcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfVklEX01JU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X2Ryb3BwZWRfdmlkX21pc3MpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9GRUNfQ09ERVdPUkRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX0ZFQ19DT0RFV09SRFNfVU5DT1JSRUNURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfQklQOF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9CSVA4X0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9HRU1fUEFDS0VUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9HRU1fRFJPUFBFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9HRU1fSURMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9HRU1fQ09SUkVDVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9JTExFR0FMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX1ZBTElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0lOVkFMSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfRElTQUJMRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUExPQU1TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19OT05fSURMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX0RST1BQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfQ1BVKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX09NQ0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9EUk9QUEVEX1RPT19TSE9SVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9EUk9QUEVEX1RPT19MT05HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0NSQ19FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfS0VZX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9GUkFHTUVOVFNfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BBQ0tFVFNfRFJPUFBFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9HRU0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfUExPQU1TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0dFTV9GUkFHTUVOVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfQ1BVKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX09NQ0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfQ1BVX09NQ0lfUEFDS0VUU19EUk9QUEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfSUxMRUdBTF9MRU5HVEgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9UUElEX01JU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9WSURfTUlTUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNmZy50cmlnZ2VyLnR5cGUgPSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOworICAgICAgICB0aGlzLT5jZmcuc29hay5hY3RpdmVfc29ha190aW1lID0gMDsKKyAgICAgICAgdGhpcy0+Y2ZnLnNvYWsuY2xlYXJfc29ha190aW1lID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfcGFjaygmdGhpcy0+Y2ZnLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5jZmcpOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3VucGFjaygmdGhpcy0+Y2ZnLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2JvdW5kc19jaGVjaygmdGhpcy0+Y2ZnKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfU1RBVF9DRkdfSURfQ0ZHOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19GQUlMVVJFX0lEX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmVycm9yID0gQkNNT0xUX1BBQ0tFVF9JTkpFQ1RJT05fRVJST1JfR0VNX1BPUlRfTk9UX0FDVElWRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfRkFJTFVSRV9JRF9HRU1fUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5nZW1fcG9ydF9pZCA9IChiY21vbHRfZ3Bvbl9nZW1faWQpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0ZBSUxVUkVfSURfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcGFja2V0X2luamVjdGlvbl9lcnJvcl9wYWNrKHRoaXMtPmVycm9yLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfRkFJTFVSRV9JRF9HRU1fUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5nZW1fcG9ydF9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19GQUlMVVJFX0lEX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0ZBSUxVUkVfSURfR0VNX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19GQUlMVVJFX0lEX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3BhY2tldF9pbmplY3Rpb25fZXJyb3JfdW5wYWNrKCZ0aGlzLT5lcnJvciwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0ZBSUxVUkVfSURfR0VNX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5nZW1fcG9ydF9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19GQUlMVVJFX0lEX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19GQUlMVVJFX0lEX0dFTV9QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19GQUlMVVJFX0lEX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+ZXJyb3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BBQ0tFVF9JTkpFQ1RJT05fRVJST1JfR0VNX1BPUlRfTk9UX0FDVElWRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfRkFJTFVSRV9JRF9FUlJPUjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfRkFJTFVSRV9JRF9HRU1fUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+Z2VtX3BvcnRfaWQgPiAoYmNtb2x0X2dwb25fZ2VtX2lkKSA0MDk1KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19GQUlMVVJFX0lEX0dFTV9QT1JUX0lEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX25pX2xvc19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX25pX2xvc19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfTE9TX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0dXMgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2xvc19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fbmlfbG9zX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0xPU19JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+c3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX25pX2xvc19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX25pX2xvc19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0xPU19JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2xvc19kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9sb3NfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfTE9TX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9sb3NfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0xPU19JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2xvc19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9sb3NfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX25pX2xvc19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0xPU19JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9MT1NfSURfU1RBVFVTOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9TRVJJQUxfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIG1lbXNldCh0aGlzLT5zZXJpYWxfbnVtYmVyLnZlbmRvcl9pZCwgMCwgc2l6ZW9mKHRoaXMtPnNlcmlhbF9udW1iZXIudmVuZG9yX2lkKSk7CisgICAgICAgIG1lbXNldCh0aGlzLT5zZXJpYWxfbnVtYmVyLnZlbmRvcl9zcGVjaWZpYywgMCwgc2l6ZW9mKHRoaXMtPnNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljKSk7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1JBTkdJTkdfVElNRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yYW5naW5nX3RpbWUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b251X2lkID0gKGJjbW9sdF9ncG9uX29udV9pZCkgMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9TRVJJQUxfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3NlcmlhbF9udW1iZXJfcGFjaygmdGhpcy0+c2VyaWFsX251bWJlciwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1JBTkdJTkdfVElNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+cmFuZ2luZ190aW1lKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5vbnVfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9TRVJJQUxfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1JBTkdJTkdfVElNRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc2VyaWFsX251bWJlcl91bnBhY2soJnRoaXMtPnNlcmlhbF9udW1iZXIsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1JBTkdJTkdfVElNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+cmFuZ2luZ190aW1lKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPm9udV9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfT05VX0RJU0NPVkVSRURfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfT05VX0RJU0NPVkVSRURfSURfUkFOR0lOR19USU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc2VyaWFsX251bWJlcl9ib3VuZHNfY2hlY2soJnRoaXMtPnNlcmlhbF9udW1iZXIpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9TRVJJQUxfTlVNQkVSOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+b251X2lkID4gKGJjbW9sdF9ncG9uX29udV9pZCkgMTI3KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9PTlVfSUQ7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXR1cyA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9PTlVfVVBHUkFERV9DT01QTEVURV9JRF9MSVNUX09GX0ZBSUxFRF9FTlRJVElFUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5saXN0X29mX2ZhaWxlZF9lbnRpdGllcy5sZW4gPSAwOworICAgICAgICB0aGlzLT5saXN0X29mX2ZhaWxlZF9lbnRpdGllcy52YWwgPSBOVUxMOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnN0YXR1cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9PTlVfVVBHUkFERV9DT01QTEVURV9JRF9MSVNUX09GX0ZBSUxFRF9FTlRJVElFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMl9wYWNrKCZ0aGlzLT5saXN0X29mX2ZhaWxlZF9lbnRpdGllcywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX0xJU1RfT0ZfRkFJTEVEX0VOVElUSUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMl9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+bGlzdF9vZl9mYWlsZWRfZW50aXRpZXMpOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c3RhdHVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX0xJU1RfT0ZfRkFJTEVEX0VOVElUSUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyX3VucGFjaygmdGhpcy0+bGlzdF9vZl9mYWlsZWRfZW50aXRpZXMsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9PTlVfVVBHUkFERV9DT01QTEVURV9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX0xJU1RfT0ZfRkFJTEVEX0VOVElUSUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfTElTVF9PRl9GQUlMRURfRU5USVRJRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzJfYm91bmRzX2NoZWNrKCZ0aGlzLT5saXN0X29mX2ZhaWxlZF9lbnRpdGllcykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX0xJU1RfT0ZfRkFJTEVEX0VOVElUSUVTOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VEX0lEX09OVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b251cy5sZW4gPSAwOworICAgICAgICB0aGlzLT5vbnVzLnZhbCA9IE5VTEw7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRURfSURfT05VUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX29udV9lcWRfbGlzdF91MzJfcGFjaygmdGhpcy0+b251cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRURfSURfT05VUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSBiY21vbHRfZ3Bvbl9vbnVfZXFkX2xpc3RfdTMyX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5vbnVzKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VEX0lEX09OVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9vbnVfZXFkX2xpc3RfdTMyX3VucGFjaygmdGhpcy0+b251cywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VEX0lEX09OVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9vbnVfZXFkX2xpc3RfdTMyX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRURfSURfT05VUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX29udV9lcWRfbGlzdF91MzJfYm91bmRzX2NoZWNrKCZ0aGlzLT5vbnVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRURfSURfT05VUzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRF9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmVzdWx0ID0gQkNNT0xUX1JFU1VMVF9TVUNDRVNTOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVEX0lEX1JFU1VMVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfcGFjayh0aGlzLT5yZXN1bHQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVEX0lEX1JFU1VMVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfU1dJVENIT1ZFUl9DT01QTEVURURfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3VsdF91bnBhY2soJnRoaXMtPnJlc3VsdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRF9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVEX0lEX1JFU1VMVCkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnJlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1M6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SRVNVTFRfRkFJTDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfU1dJVENIT1ZFUl9DT01QTEVURURfSURfUkVTVUxUOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRV9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmVzdWx0ID0gQkNNT0xUX1RSQUZGSUNfUkVTVU1FX1JFU1VMVF9TVUNDRVNTOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FX0lEX1JFU1VMVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF90cmFmZmljX3Jlc3VtZV9yZXN1bHRfcGFjayh0aGlzLT5yZXN1bHQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FX0lEX1JFU1VMVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUVfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3RyYWZmaWNfcmVzdW1lX3Jlc3VsdF91bnBhY2soJnRoaXMtPnJlc3VsdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRV9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FX0lEX1JFU1VMVCkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnJlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfVFJBRkZJQ19SRVNVTUVfUkVTVUxUX1NVQ0NFU1M6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUkFGRklDX1JFU1VNRV9SRVNVTFRfRkFJTFVSRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1RSQUZGSUNfUkVTVU1FX1JFU1VMVF9TVVNQRUNURURfTE9TOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRV9JRF9SRVNVTFQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1dJTkRPV19UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPndpbmRvd190eXBlID0gQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfU0lMRU5UX1dJTkRPVzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9NRUFTVVJFTUVOVF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bWVhc3VyZW1lbnRfc3RhdHVzID0gQkNNT0xUX1JPR1VFX01FQVNVUkVNRU5UX1JFU1VMVF9SU1NJX0NPTVBMRVRFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX0FMTE9DX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFsbG9jX2lkID0gKGJjbW9sdF9ncG9uX2FsbG9jX2lkKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vbnVfaWQgPSAoYmNtb2x0X2dwb25fb251X2lkKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX0lTX0RFTElORUFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmlzX2RlbGluZWF0aW9uID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfSVNfRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+aXNfZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9SWF9EQVRBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2RhdGEubGVuID0gMDsKKyAgICAgICAgdGhpcy0+cnhfZGF0YS52YWwgPSBOVUxMOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1BMT0FNX1JFQ0VJVkVEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wbG9hbV9yZWNlaXZlZF9vbnVfaWQgPSAoYmNtb2x0X2dwb25fb251X2lkKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1BMT0FNX1JFQ0VJVkVEX0NSQ19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wbG9hbV9yZWNlaXZlZF9jcmNfZXJyb3IgPSBCQ01PU19GQUxTRTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9XSU5ET1dfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X3BhY2sodGhpcy0+d2luZG93X3R5cGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX01FQVNVUkVNRU5UX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yb2d1ZV9tZWFzdXJlbWVudF9yZXN1bHRfcGFjayh0aGlzLT5tZWFzdXJlbWVudF9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX0FMTE9DX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPmFsbG9jX2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPm9udV9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX0lTX0RFTElORUFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+aXNfZGVsaW5lYXRpb24pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9JU19FRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmlzX2VkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUlhfREFUQSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF91OF9saXN0X3UzMl9wYWNrKCZ0aGlzLT5yeF9kYXRhLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9QTE9BTV9SRUNFSVZFRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+cGxvYW1fcmVjZWl2ZWRfb251X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUExPQU1fUkVDRUlWRURfQ1JDX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+cGxvYW1fcmVjZWl2ZWRfY3JjX2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfV0lORE9XX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9NRUFTVVJFTUVOVF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9BTExPQ19JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX0lTX0RFTElORUFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfSVNfRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9SWF9EQVRBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF91OF9saXN0X3UzMl9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+cnhfZGF0YSk7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUExPQU1fUkVDRUlWRURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUExPQU1fUkVDRUlWRURfQ1JDX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9XSU5ET1dfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X3VucGFjaygmdGhpcy0+d2luZG93X3R5cGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX01FQVNVUkVNRU5UX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yb2d1ZV9tZWFzdXJlbWVudF9yZXN1bHRfdW5wYWNrKCZ0aGlzLT5tZWFzdXJlbWVudF9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX0FMTE9DX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+YWxsb2NfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5vbnVfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9JU19ERUxJTkVBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmlzX2RlbGluZWF0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfSVNfRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5pc19lZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1JYX0RBVEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfdW5wYWNrKCZ0aGlzLT5yeF9kYXRhLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1BMT0FNX1JFQ0VJVkVEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPnBsb2FtX3JlY2VpdmVkX29udV9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1BMT0FNX1JFQ0VJVkVEX0NSQ19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnBsb2FtX3JlY2VpdmVkX2NyY19lcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1dJTkRPV19UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX01FQVNVUkVNRU5UX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9BTExPQ19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfSVNfREVMSU5FQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfSVNfRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUlhfREFUQSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF91OF9saXN0X3UzMl9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUExPQU1fUkVDRUlWRURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1BMT0FNX1JFQ0VJVkVEX0NSQ19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9XSU5ET1dfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPndpbmRvd190eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX1NJTEVOVF9XSU5ET1c6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0NVVF9PRkZfV0lORE9XOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1dJTkRPV19UWVBFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX01FQVNVUkVNRU5UX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPm1lYXN1cmVtZW50X3N0YXR1cykKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUk9HVUVfTUVBU1VSRU1FTlRfUkVTVUxUX1JTU0lfQ09NUExFVEU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9NRUFTVVJFTUVOVF9SRVNVTFRfTk9UX1BFUkZPUk1FRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JPR1VFX01FQVNVUkVNRU5UX1JFU1VMVF9ST0dVRV9DWUNMRV9TVE9QOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUk9HVUVfTUVBU1VSRU1FTlRfUkVTVUxUX1JTU0lfRVJST1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9NRUFTVVJFTUVOVF9SRVNVTFRfUlNTSV9OT1RfQ09NUExFVEU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfTUVBU1VSRU1FTlRfU1RBVFVTOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX0FMTE9DX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5hbGxvY19pZCA+IChiY21vbHRfZ3Bvbl9hbGxvY19pZCkgNDA5NSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9BTExPQ19JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+b251X2lkID4gKGJjbW9sdF9ncG9uX29udV9pZCkgMTI3KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX09OVV9JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1JYX0RBVEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfYm91bmRzX2NoZWNrKCZ0aGlzLT5yeF9kYXRhKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9SWF9EQVRBOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUExPQU1fUkVDRUlWRURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5wbG9hbV9yZWNlaXZlZF9vbnVfaWQgPiAoYmNtb2x0X2dwb25fb251X2lkKSAxMjcpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUExPQU1fUkVDRUlWRURfT05VX0lEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVEX0lEX05VTUJFUl9PRl9ERVRFQ1RFRF9ERUxJTUlURVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bnVtYmVyX29mX2RldGVjdGVkX2RlbGltaXRlciA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVEX0lEX0VORVJHWV9ERVRFQ1RfU0lHTkFMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmVuZXJneV9kZXRlY3Rfc2lnbmFsID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURURfSURfTlVNQkVSX09GX0RFVEVDVEVEX0RFTElNSVRFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+bnVtYmVyX29mX2RldGVjdGVkX2RlbGltaXRlcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRF9JRF9FTkVSR1lfREVURUNUX1NJR05BTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5lbmVyZ3lfZGV0ZWN0X3NpZ25hbCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURURfSURfTlVNQkVSX09GX0RFVEVDVEVEX0RFTElNSVRFUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRF9JRF9FTkVSR1lfREVURUNUX1NJR05BTCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURURfSURfTlVNQkVSX09GX0RFVEVDVEVEX0RFTElNSVRFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+bnVtYmVyX29mX2RldGVjdGVkX2RlbGltaXRlcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRF9JRF9FTkVSR1lfREVURUNUX1NJR05BTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5lbmVyZ3lfZGV0ZWN0X3NpZ25hbCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRF9JRF9OVU1CRVJfT0ZfREVURUNURURfREVMSU1JVEVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRF9JRF9FTkVSR1lfREVURUNUX1NJR05BTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURURfSURfRU5FUkdZX0RFVEVDVF9TSUdOQUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5lbmVyZ3lfZGV0ZWN0X3NpZ25hbCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX05JX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVEX0lEX0VORVJHWV9ERVRFQ1RfU0lHTkFMOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXQgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX0ZFQ19DT0RFV09SRFM7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX25pX3N0YXRfaWRfcGFjayh0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fbmlfc3RhdF9pZF91bnBhY2soJnRoaXMtPnN0YXQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnN0YXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9GRUNfQ09ERVdPUkRTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX0ZFQ19DT0RFV09SRFNfVU5DT1JSRUNURUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfQklQOF9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9CSVA4X0VSUk9SUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9HRU1fUEFDS0VUUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9HRU1fRFJPUFBFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9HRU1fSURMRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9HRU1fQ09SUkVDVEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9JTExFR0FMOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX1ZBTElEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0lOVkFMSUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfRElTQUJMRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUExPQU1TOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19OT05fSURMRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfRVJST1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX0RST1BQRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfQ1BVOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX09NQ0k6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9EUk9QUEVEX1RPT19TSE9SVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9EUk9QUEVEX1RPT19MT05HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0NSQ19FUlJPUlM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfS0VZX0VSUk9SUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9GUkFHTUVOVFNfRVJST1JTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BBQ0tFVFNfRFJPUFBFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9HRU06CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfUExPQU1TOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0dFTV9GUkFHTUVOVFM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfQ1BVOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX09NQ0k6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfQ1BVX09NQ0lfUEFDS0VUU19EUk9QUEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfSUxMRUdBTF9MRU5HVEg6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9UUElEX01JU1M6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9WSURfTUlTUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdCA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfRkVDX0NPREVXT1JEUzsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fbmlfc3RhdF9pZF9wYWNrKHRoaXMtPnN0YXQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9uaV9zdGF0X2lkX3VucGFjaygmdGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX0ZFQ19DT0RFV09SRFM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfRkVDX0NPREVXT1JEU19VTkNPUlJFQ1RFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9CSVA4X0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX0JJUDhfRVJST1JTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9QQUNLRVRTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9EUk9QUEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9JRExFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9DT1JSRUNURUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0lMTEVHQUw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfVkFMSUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfSU5WQUxJRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19ESVNBQkxFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9QTE9BTVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX05PTl9JRExFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19FUlJPUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfRFJPUFBFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9DUFU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfT01DSToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9PTUNJX1BBQ0tFVFNfQ1JDX0VSUk9SOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0RST1BQRURfVE9PX1NIT1JUOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0RST1BQRURfVE9PX0xPTkc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfQ1JDX0VSUk9SUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9LRVlfRVJST1JTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0ZSQUdNRU5UU19FUlJPUlM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUEFDS0VUU19EUk9QUEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0dFTToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9QTE9BTVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfR0VNX0ZSQUdNRU5UUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9DUFU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfT01DSToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9DUFVfT01DSV9QQUNLRVRTX0RST1BQRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9JTExFR0FMX0xFTkdUSDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX1RQSURfTUlTUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX1ZJRF9NSVNTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmVzdWx0ID0gQkNNT0xUX1JFU1VMVF9TVUNDRVNTOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX1BSRVZJT1VTX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnByZXZpb3VzX3N0YXRlID0gQkNNT0xUX1BPTl9TVEFURV9JTkFDVElWRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9ORVdfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bmV3X3N0YXRlID0gQkNNT0xUX1BPTl9TVEFURV9JTkFDVElWRTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzdWx0X3BhY2sodGhpcy0+cmVzdWx0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9QUkVWSU9VU19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fc3RhdGVfcGFjayh0aGlzLT5wcmV2aW91c19zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfTkVXX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bvbl9zdGF0ZV9wYWNrKHRoaXMtPm5ld19zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfUFJFVklPVVNfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9ORVdfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX1JFU1VMVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfdW5wYWNrKCZ0aGlzLT5yZXN1bHQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX1BSRVZJT1VTX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bvbl9zdGF0ZV91bnBhY2soJnRoaXMtPnByZXZpb3VzX3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9ORVdfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcG9uX3N0YXRlX3VucGFjaygmdGhpcy0+bmV3X3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfUFJFVklPVVNfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfTkVXX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX1JFU1VMVCkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnJlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1M6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SRVNVTFRfRkFJTDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9SRVNVTFQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfUFJFVklPVVNfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5wcmV2aW91c19zdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUE9OX1NUQVRFX0lOQUNUSVZFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUE9OX1NUQVRFX1BST0NFU1NJTkc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9QT05fU1RBVEVfQUNUSVZFX1dPUktJTkc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9QT05fU1RBVEVfQUNUSVZFX1NUQU5EQlk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfUFJFVklPVVNfU1RBVEU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfTkVXX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+bmV3X3N0YXRlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9QT05fU1RBVEVfSU5BQ1RJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9QT05fU1RBVEVfUFJPQ0VTU0lORzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BPTl9TVEFURV9BQ1RJVkVfV09SS0lORzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BPTl9TVEFURV9BQ1RJVkVfU1RBTkRCWToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9ORVdfU1RBVEU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1RPRF9TVFJJTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgbWVtc2V0KHRoaXMtPnRvZF9zdHJpbmcuc3RyLCAwLCA2NCk7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9TRkMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c2ZjID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1JUQ19PRkZTRVRfU0VDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ0Y19vZmZzZXRfc2VjID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1JUQ19PRkZTRVRfTlNFQykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5ydGNfb2Zmc2V0X25zZWMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXR1cyA9IEJDTU9MVF9SRVNVTFRfU1VDQ0VTUzsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9UT0RfU1RSSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0cl82NF9wYWNrKCZ0aGlzLT50b2Rfc3RyaW5nLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1NGQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+c2ZjKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9SVENfT0ZGU0VUX1NFQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnRjX29mZnNldF9zZWMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1JUQ19PRkZTRVRfTlNFQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+cnRjX29mZnNldF9uc2VjKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzdWx0X3BhY2sodGhpcy0+c3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9UT0RfU1RSSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDY0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfU0ZDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9SVENfT0ZGU0VUX1NFQykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfUlRDX09GRlNFVF9OU0VDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1RPRF9TVFJJTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RyXzY0X3VucGFjaygmdGhpcy0+dG9kX3N0cmluZywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1NGQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+c2ZjKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9SVENfT0ZGU0VUX1NFQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnRjX29mZnNldF9zZWMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1JUQ19PRkZTRVRfTlNFQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+cnRjX29mZnNldF9uc2VjKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzdWx0X3VucGFjaygmdGhpcy0+c3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfVE9EX1NUUklORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDY0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9TRkMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9SVENfT0ZGU0VUX1NFQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1JUQ19PRkZTRVRfTlNFQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1RPRF9TVFJJTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RyXzY0X2JvdW5kc19jaGVjaygmdGhpcy0+dG9kX3N0cmluZykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9UT0RfU1RSSU5HOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JFU1VMVF9TVUNDRVNTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVTVUxUX0ZBSUw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0FDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfQ1BVX1BBQ0tFVFNfRkFJTFVSRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jcHVfcGFja2V0c19mYWlsdXJlID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0RFQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0RJU0FCTEVfQUxMX09OVVNfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRpc2FibGVfYWxsX29udXNfY29tcGxldGVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0VOQUJMRV9BTExfT05VU19DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9MT1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bG9zID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX09OVV9ESVNDT1ZFUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9udV9kaXNjb3ZlcmVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX09OVV9VUEdSQURFX0NPTVBMRVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9udV91cGdyYWRlX2NvbXBsZXRlID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnByb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnByb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9ST0dVRV9PTlVfU1BFQ0lBTF9NQVBfQ1lDTEVfU1RBUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0ID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1NFUklBTF9OVU1CRVJfQUNRVUlTSVRJT05fQ1lDTEVfU1RBUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdGVfY2hhbmdlX2NvbXBsZXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9UT0RfUkVRVUVTVF9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dG9kX3JlcXVlc3RfY29tcGxldGVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+YWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0NQVV9QQUNLRVRTX0ZBSUxVUkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5jcHVfcGFja2V0c19mYWlsdXJlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0RFQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+ZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfRElTQUJMRV9BTExfT05VU19DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9FTkFCTEVfQUxMX09OVVNfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+ZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9MT1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5sb3MpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfT05VX0RJU0NPVkVSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5vbnVfZGlzY292ZXJlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9PTlVfVVBHUkFERV9DT01QTEVURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPm9udV91cGdyYWRlX2NvbXBsZXRlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+cHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfU1dJVENIT1ZFUl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnByb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1JPR1VFX09OVV9TUEVDSUFMX01BUF9DWUNMRV9TVEFSVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnJvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9TRVJJQUxfTlVNQkVSX0FDUVVJU0lUSU9OX0NZQ0xFX1NUQVJUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnN0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnN0YXRfYWxhcm1fY2xlYXJlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5zdGF0ZV9jaGFuZ2VfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1RPRF9SRVFVRVNUX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnRvZF9yZXF1ZXN0X2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0FDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9DUFVfUEFDS0VUU19GQUlMVVJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0RFQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0RJU0FCTEVfQUxMX09OVVNfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0VOQUJMRV9BTExfT05VU19DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfTE9TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX09OVV9ESVNDT1ZFUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX09OVV9VUEdSQURFX0NPTVBMRVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfUk9HVUVfT05VX1NQRUNJQUxfTUFQX0NZQ0xFX1NUQVJUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1NFUklBTF9OVU1CRVJfQUNRVUlTSVRJT05fQ1lDTEVfU1RBUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfVE9EX1JFUVVFU1RfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9BQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfQ1BVX1BBQ0tFVFNfRkFJTFVSRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmNwdV9wYWNrZXRzX2ZhaWx1cmUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfREVBQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9ESVNBQkxFX0FMTF9PTlVTX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmRpc2FibGVfYWxsX29udXNfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0VOQUJMRV9BTExfT05VU19DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5lbmFibGVfYWxsX29udXNfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0xPUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmxvcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9PTlVfRElTQ09WRVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPm9udV9kaXNjb3ZlcmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX09OVV9VUEdSQURFX0NPTVBMRVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+b251X3VwZ3JhZGVfY29tcGxldGUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnByb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+cHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnJvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfUk9HVUVfT05VX1NQRUNJQUxfTUFQX0NZQ0xFX1NUQVJUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+cm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1NFUklBTF9OVU1CRVJfQUNRVUlTSVRJT05fQ1lDTEVfU1RBUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c3RhdF9hbGFybV9yYWlzZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnN0YXRlX2NoYW5nZV9jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfVE9EX1JFUVVFU1RfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+dG9kX3JlcXVlc3RfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9BQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0NQVV9QQUNLRVRTX0ZBSUxVUkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0RFQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9ESVNBQkxFX0FMTF9PTlVTX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfRU5BQkxFX0FMTF9PTlVTX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfTE9TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9PTlVfRElTQ09WRVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfT05VX1VQR1JBREVfQ09NUExFVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1JPR1VFX09OVV9TUEVDSUFMX01BUF9DWUNMRV9TVEFSVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfU0VSSUFMX05VTUJFUl9BQ1FVSVNJVElPTl9DWUNMRV9TVEFSVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1RPRF9SRVFVRVNUX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ESVNBQkxFX1NFUklBTF9OVU1CRVJfSURfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jb250cm9sID0gQkNNT0xUX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9DT05UUk9MX1VOSUNBU1RfRElTQUJMRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgbWVtc2V0KHRoaXMtPnNlcmlhbF9udW1iZXIudmVuZG9yX2lkLCAwLCBzaXplb2YodGhpcy0+c2VyaWFsX251bWJlci52ZW5kb3JfaWQpKTsKKyAgICAgICAgbWVtc2V0KHRoaXMtPnNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljLCAwLCBzaXplb2YodGhpcy0+c2VyaWFsX251bWJlci52ZW5kb3Jfc3BlY2lmaWMpKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9JRF9DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Rpc2FibGVfc2VyaWFsX251bWJlcl9jb250cm9sX3BhY2sodGhpcy0+Y29udHJvbCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9JRF9TRVJJQUxfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3NlcmlhbF9udW1iZXJfcGFjaygmdGhpcy0+c2VyaWFsX251bWJlciwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ESVNBQkxFX1NFUklBTF9OVU1CRVJfSURfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ESVNBQkxFX1NFUklBTF9OVU1CRVJfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ESVNBQkxFX1NFUklBTF9OVU1CRVJfSURfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9kaXNhYmxlX3NlcmlhbF9udW1iZXJfY29udHJvbF91bnBhY2soJnRoaXMtPmNvbnRyb2wsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ESVNBQkxFX1NFUklBTF9OVU1CRVJfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zZXJpYWxfbnVtYmVyX3VucGFjaygmdGhpcy0+c2VyaWFsX251bWJlciwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ESVNBQkxFX1NFUklBTF9OVU1CRVJfSURfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9JRF9DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+Y29udHJvbCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0NPTlRST0xfVU5JQ0FTVF9ESVNBQkxFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0NPTlRST0xfVU5JQ0FTVF9FTkFCTEU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ESVNBQkxFX1NFUklBTF9OVU1CRVJfQ09OVFJPTF9CUk9BRENBU1RfRU5BQkxFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0NPTlRST0xfQlJPQURDQVNUX0RJU0FCTEU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ESVNBQkxFX1NFUklBTF9OVU1CRVJfQ09OVFJPTF9ESVNBQkxFX0RJU0NPVkVSWToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX0NPTlRST0w7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9JRF9TRVJJQUxfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3NlcmlhbF9udW1iZXJfYm91bmRzX2NoZWNrKCZ0aGlzLT5zZXJpYWxfbnVtYmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX1NFUklBTF9OVU1CRVI7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFlQRV9DX1NFVF9NVUxUSVBMRV9PTlVfU1RBVEVfSURfT05VX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9udV9zdGF0ZSA9IEJDTU9MVF9TV0lUQ0hfT1ZFUl9UWVBFX0NfT05VX1NUQVRFX0FDVElWRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFlQRV9DX1NFVF9NVUxUSVBMRV9PTlVfU1RBVEVfSURfT05VX0xJU1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b251X2xpc3QubGVuID0gMDsKKyAgICAgICAgdGhpcy0+b251X2xpc3QudmFsID0gTlVMTDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UWVBFX0NfU0VUX01VTFRJUExFX09OVV9TVEFURV9JRF9PTlVfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3dpdGNoX292ZXJfdHlwZV9jX29udV9zdGF0ZV9wYWNrKHRoaXMtPm9udV9zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1RZUEVfQ19TRVRfTVVMVElQTEVfT05VX1NUQVRFX0lEX09OVV9MSVNUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fb251X2lkX2xpc3RfdTMyX21heF8yNTZfcGFjaygmdGhpcy0+b251X2xpc3QsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1RZUEVfQ19TRVRfTVVMVElQTEVfT05VX1NUQVRFX0lEX09OVV9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UWVBFX0NfU0VUX01VTFRJUExFX09OVV9TVEFURV9JRF9PTlVfTElTVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSBiY21vbHRfZ3Bvbl9vbnVfaWRfbGlzdF91MzJfbWF4XzI1Nl9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+b251X2xpc3QpOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFlQRV9DX1NFVF9NVUxUSVBMRV9PTlVfU1RBVEVfSURfT05VX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N3aXRjaF9vdmVyX3R5cGVfY19vbnVfc3RhdGVfdW5wYWNrKCZ0aGlzLT5vbnVfc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UWVBFX0NfU0VUX01VTFRJUExFX09OVV9TVEFURV9JRF9PTlVfTElTVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX29udV9pZF9saXN0X3UzMl9tYXhfMjU2X3VucGFjaygmdGhpcy0+b251X2xpc3QsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UWVBFX0NfU0VUX01VTFRJUExFX09OVV9TVEFURV9JRF9PTlVfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1RZUEVfQ19TRVRfTVVMVElQTEVfT05VX1NUQVRFX0lEX09OVV9MSVNUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fb251X2lkX2xpc3RfdTMyX21heF8yNTZfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UWVBFX0NfU0VUX01VTFRJUExFX09OVV9TVEFURV9JRF9PTlVfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5vbnVfc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NXSVRDSF9PVkVSX1RZUEVfQ19PTlVfU1RBVEVfQUNUSVZFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1dJVENIX09WRVJfVFlQRV9DX09OVV9TVEFURV9BQ1RJVkVfU1RBTkRCWToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFlQRV9DX1NFVF9NVUxUSVBMRV9PTlVfU1RBVEVfSURfT05VX1NUQVRFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UWVBFX0NfU0VUX01VTFRJUExFX09OVV9TVEFURV9JRF9PTlVfTElTVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+b251X2xpc3QubGVuID4gMjU2KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX29udV9pZF9saXN0X3UzMl9tYXhfMjU2X2JvdW5kc19jaGVjaygmdGhpcy0+b251X2xpc3QpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UWVBFX0NfU0VUX01VTFRJUExFX09OVV9TVEFURV9JRF9PTlVfTElTVDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9XSU5ET1dfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT53aW5kb3dfdHlwZSA9IEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX1NJTEVOVF9XSU5ET1c7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWxsb2NfaWQgPSAoYmNtb2x0X2dwb25fYWxsb2NfaWQpIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9udV9pZCA9IChiY21vbHRfZ3Bvbl9vbnVfaWQpIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfU0VDT05EX1JBTkdJTkdfV0lORE9XKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnNlY29uZF9yYW5naW5nX3dpbmRvdyA9IEJDTU9TX0ZBTFNFOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX1dJTkRPV19UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfcGFjayh0aGlzLT53aW5kb3dfdHlwZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+YWxsb2NfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+b251X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfU0VDT05EX1JBTkdJTkdfV0lORE9XKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c2Vjb25kX3Jhbmdpbmdfd2luZG93KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfV0lORE9XX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9BTExPQ19JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX1NFQ09ORF9SQU5HSU5HX1dJTkRPVykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfV0lORE9XX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd191bnBhY2soJnRoaXMtPndpbmRvd190eXBlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9BTExPQ19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPmFsbG9jX2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+b251X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfU0VDT05EX1JBTkdJTkdfV0lORE9XKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c2Vjb25kX3Jhbmdpbmdfd2luZG93KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfV0lORE9XX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX1NFQ09ORF9SQU5HSU5HX1dJTkRPVykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9XSU5ET1dfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPndpbmRvd190eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX1NJTEVOVF9XSU5ET1c6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0NVVF9PRkZfV0lORE9XOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX1dJTkRPV19UWVBFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX0FMTE9DX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5hbGxvY19pZCA+IChiY21vbHRfZ3Bvbl9hbGxvY19pZCkgNDA5NSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9BTExPQ19JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+b251X2lkID4gKGJjbW9sdF9ncG9uX29udV9pZCkgMTI3KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX09OVV9JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU0VUX09OVV9TVEFURV9JRF9PTlVfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b251X3N0YXRlID0gQkNNT0xUX09OVV9PUEVSQVRJT05fSU5BQ1RJVkU7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X29udV9vcGVyYXRpb25fcGFjayh0aGlzLT5vbnVfc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TRVRfT05VX1NUQVRFX0lEX09OVV9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X29udV9vcGVyYXRpb25fdW5wYWNrKCZ0aGlzLT5vbnVfc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TRVRfT05VX1NUQVRFX0lEX09OVV9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU0VUX09OVV9TVEFURV9JRF9PTlVfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5vbnVfc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9PUEVSQVRJT05fSU5BQ1RJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfT1BFUkFUSU9OX0FDVElWRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9PUEVSQVRJT05fRElTQUJMRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9PUEVSQVRJT05fRU5BQkxFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX09QRVJBVElPTl9BQ1RJVkVfU1RBTkRCWToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9PUEVSQVRJT05fQVdBS0VfRlJFRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfU0VUX09OVV9TVEFURV9JRF9PTlVfU1RBVEU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TRVRfUE9OX1NUQVRFX0lEX1BPTl9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wb25fc3RhdGUgPSBCQ01PTFRfUE9OX09QRVJBVElPTl9JTkFDVElWRTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU0VUX1BPTl9TVEFURV9JRF9QT05fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcG9uX29wZXJhdGlvbl9wYWNrKHRoaXMtPnBvbl9zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NFVF9QT05fU1RBVEVfSURfUE9OX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU0VUX1BPTl9TVEFURV9JRF9QT05fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcG9uX29wZXJhdGlvbl91bnBhY2soJnRoaXMtPnBvbl9zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NFVF9QT05fU1RBVEVfSURfUE9OX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TRVRfUE9OX1NUQVRFX0lEX1BPTl9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnBvbl9zdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUE9OX09QRVJBVElPTl9JTkFDVElWRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BPTl9PUEVSQVRJT05fQUNUSVZFX1dPUktJTkc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9QT05fT1BFUkFUSU9OX0FDVElWRV9TVEFOREJZOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9TRVRfUE9OX1NUQVRFX0lEX1BPTl9TVEFURTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBUlRfT05VX1VQR1JBREVfSURfTElTVF9PRl9PTlVfSURTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmxpc3Rfb2Zfb251X2lkcy5sZW4gPSAwOworICAgICAgICB0aGlzLT5saXN0X29mX29udV9pZHMudmFsID0gTlVMTDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFSVF9PTlVfVVBHUkFERV9JRF9MSVNUX09GX09OVV9JRFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcG9uX29udV9pZF9saXN0X3UzMl9wYWNrKCZ0aGlzLT5saXN0X29mX29udV9pZHMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVJUX09OVV9VUEdSQURFX0lEX0xJU1RfT0ZfT05VX0lEUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSBiY21vbHRfcG9uX29udV9pZF9saXN0X3UzMl9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+bGlzdF9vZl9vbnVfaWRzKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX1NUQVJUX09OVV9VUEdSQURFX0lEX0xJU1RfT0ZfT05VX0lEUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fb251X2lkX2xpc3RfdTMyX3VucGFjaygmdGhpcy0+bGlzdF9vZl9vbnVfaWRzLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfU1RBUlRfT05VX1VQR1JBREVfSURfTElTVF9PRl9PTlVfSURTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bvbl9vbnVfaWRfbGlzdF91MzJfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9TVEFSVF9PTlVfVVBHUkFERV9JRF9MSVNUX09GX09OVV9JRFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcG9uX29udV9pZF9saXN0X3UzMl9ib3VuZHNfY2hlY2soJnRoaXMtPmxpc3Rfb2Zfb251X2lkcykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX05JX1NUQVJUX09OVV9VUEdSQURFX0lEX0xJU1RfT0ZfT05VX0lEUzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQlJPQURDQVNUX1BMT0FNX1BBQ0tFVF9JRF9QTE9BTSkpICE9IDApCisgICAgeworICAgICAgICBtZW1zZXQodGhpcy0+cGxvYW0uYXJyLCAwLCBzaXplb2YodGhpcy0+cGxvYW0uYXJyKSk7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0JST0FEQ0FTVF9QTE9BTV9QQUNLRVRfSURfUExPQU0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXJyX3U4XzEyX3BhY2soJnRoaXMtPnBsb2FtLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQlJPQURDQVNUX1BMT0FNX1BBQ0tFVF9JRF9QTE9BTSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxMjsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9CUk9BRENBU1RfUExPQU1fUEFDS0VUX0lEX1BMT0FNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl91OF8xMl91bnBhY2soJnRoaXMtPnBsb2FtLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9CUk9BRENBU1RfUExPQU1fUEFDS0VUX0lEX1BMT0FNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQlJPQURDQVNUX1BMT0FNX1BBQ0tFVF9JRF9QTE9BTSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfdThfMTJfYm91bmRzX2NoZWNrKCZ0aGlzLT5wbG9hbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX05JX0JST0FEQ0FTVF9QTE9BTV9QQUNLRVRfSURfUExPQU07CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfSURfUEFDS0VUX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cGFja2V0X3R5cGUgPSBCQ01PTFRfUEFDS0VUX1RZUEVfQ1BVOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9DQUxDX0NSQykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jYWxjX2NyYyA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9HRU1fUE9SVF9MSVNUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmdlbV9wb3J0X2xpc3QubGVuID0gMDsKKyAgICAgICAgdGhpcy0+Z2VtX3BvcnRfbGlzdC52YWwgPSBOVUxMOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YnVmZmVyLmxlbiA9IDA7CisgICAgICAgIHRoaXMtPmJ1ZmZlci52YWwgPSBOVUxMOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3BhY2tldF90eXBlX3BhY2sodGhpcy0+cGFja2V0X3R5cGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9DQUxDX0NSQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmNhbGNfY3JjKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0lEX0dFTV9QT1JUX0xJU1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTZfcGFjaygmdGhpcy0+Z2VtX3BvcnRfbGlzdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0lEX0JVRkZFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OF9wYWNrKCZ0aGlzLT5idWZmZXIsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0lEX0NBTENfQ1JDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0lEX0dFTV9QT1JUX0xJU1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X2dwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5nZW1fcG9ydF9saXN0KTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+YnVmZmVyKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3BhY2tldF90eXBlX3VucGFjaygmdGhpcy0+cGFja2V0X3R5cGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9DQUxDX0NSQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmNhbGNfY3JjKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0lEX0dFTV9QT1JUX0xJU1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTZfdW5wYWNrKCZ0aGlzLT5nZW1fcG9ydF9saXN0LCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDhfdW5wYWNrKCZ0aGlzLT5idWZmZXIsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfSURfQ0FMQ19DUkMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0lEX0dFTV9QT1JUX0xJU1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTZfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDhfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnBhY2tldF90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9QQUNLRVRfVFlQRV9DUFU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9QQUNLRVRfVFlQRV9PTUNJOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfVFlQRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfSURfR0VNX1BPUlRfTElTVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+Z2VtX3BvcnRfbGlzdC5sZW4gPiAxNikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTZfYm91bmRzX2NoZWNrKCZ0aGlzLT5nZW1fcG9ydF9saXN0KSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfSURfR0VNX1BPUlRfTElTVDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmJ1ZmZlci5sZW4gPiAyMDQ4KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OF9ib3VuZHNfY2hlY2soJnRoaXMtPmJ1ZmZlcikpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0lEX0JVRkZFUjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9LRVlfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9udV9pZCA9IChiY21vbHRfZ3Bvbl9vbnVfaWQpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMtPnBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfS0VZX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5vbnVfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfS0VZX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV91bnBhY2soYmNtb2x0X2dwb25fb251X2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAodWludDhfdCAqKSAmdGhpcy0+cG9uX25pKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9LRVlfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+b251X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0tFWV9JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnBvbl9uaSA+IChiY21vbHRfZ3Bvbl9uaSkgMTUpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX09OVV9LRVlfSURfUE9OX05JOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9LRVlfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5vbnVfaWQgPiAoYmNtb2x0X2dwb25fb251X2lkKSAxMjcpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX09OVV9LRVlfSURfT05VX0lEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX09OVV9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vbnVfc3RhdGUgPSBCQ01PTFRfT05VX1NUQVRFX05PVF9DT05GSUdVUkVEOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgbWVtc2V0KHRoaXMtPnNlcmlhbF9udW1iZXIudmVuZG9yX2lkLCAwLCBzaXplb2YodGhpcy0+c2VyaWFsX251bWJlci52ZW5kb3JfaWQpKTsKKyAgICAgICAgbWVtc2V0KHRoaXMtPnNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljLCAwLCBzaXplb2YodGhpcy0+c2VyaWFsX251bWJlci52ZW5kb3Jfc3BlY2lmaWMpKTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9QQVNTV09SRCkpICE9IDApCisgICAgeworICAgICAgICBtZW1zZXQodGhpcy0+cGFzc3dvcmQuYXJyLCAwLCBzaXplb2YodGhpcy0+cGFzc3dvcmQuYXJyKSk7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQVVUT19QQVNTV09SRF9MRUFSTklORykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hdXRvX3Bhc3N3b3JkX2xlYXJuaW5nID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfVVNfRkVDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnVzX2ZlYyA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX09NQ0lfUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vbWNpX3BvcnRfaWQgPSAoYmNtb2x0X2dwb25fZ2VtX2lkKSA2NTUzNVU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfRFNfQkVSX1JFUE9SVElOR19JTlRFUlZBTCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5kc19iZXJfcmVwb3J0aW5nX2ludGVydmFsID0gKGJjbW9sdF9iZXJfaW50ZXJ2YWwpIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQUVTX0VOQ1JZUFRJT05fS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIG1lbXNldCh0aGlzLT5hZXNfZW5jcnlwdGlvbl9rZXkuYnl0ZXMsIDAsIHNpemVvZih0aGlzLT5hZXNfZW5jcnlwdGlvbl9rZXkuYnl0ZXMpKTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9BTEFSTV9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hbGFybV9zdGF0ZS5sb3NpID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXRlLmxvZmkgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdGUubG9hbWkgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdGUuZGdpID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXRlLnRpd2kgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdGUuZG93aSA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgICAgICB0aGlzLT5hbGFybV9zdGF0ZS5zdWZpID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXRlLnNmaSA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgICAgICB0aGlzLT5hbGFybV9zdGF0ZS5zZGkgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdGUuZGZpID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXRlLmxvYWkgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdGUubG9raSA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX1JBTkdJTkdfVElNRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yYW5naW5nX3RpbWUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0RJU0FCTEVEX0FGVEVSX0RJU0NPVkVSWSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5kaXNhYmxlZF9hZnRlcl9kaXNjb3ZlcnkgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9ERUFDVElWQVRJT05fUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRlYWN0aXZhdGlvbl9yZWFzb24gPSBCQ01PTFRfREVBQ1RJVkFUSU9OX1JFQVNPTl9OT05FOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0FMTF9HRU1fUE9SVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWxsX2dlbV9wb3J0cy5sZW4gPSAwOworICAgICAgICB0aGlzLT5hbGxfZ2VtX3BvcnRzLnZhbCA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQUxMX0FMTE9DUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hbGxfYWxsb2NzLmxlbiA9IDA7CisgICAgICAgIHRoaXMtPmFsbF9hbGxvY3MudmFsID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9PTlVfUFNfVFlQRV9DKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9udV9wc190eXBlX2MgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9FWFRFTkRFRF9HVUFSRF9USU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmV4dGVuZGVkX2d1YXJkX3RpbWUuYWRkaXRpb25hbF9wcmVidXJzdF9ndWFyZF90aW1lID0gMDsKKyAgICAgICAgdGhpcy0+ZXh0ZW5kZWRfZ3VhcmRfdGltZS5hZGRpdGlvbmFsX3Bvc3RidXJzdF9ndWFyZF90aW1lID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9PTlVfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfb251X3N0YXRlX3BhY2sodGhpcy0+b251X3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9TRVJJQUxfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3NlcmlhbF9udW1iZXJfcGFjaygmdGhpcy0+c2VyaWFsX251bWJlciwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfUEFTU1dPUkQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXJyX3U4XzEwX3BhY2soJnRoaXMtPnBhc3N3b3JkLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9BVVRPX1BBU1NXT1JEX0xFQVJOSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+YXV0b19wYXNzd29yZF9sZWFybmluZykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX1VTX0ZFQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnVzX2ZlYykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX09NQ0lfUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5vbWNpX3BvcnRfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9EU19CRVJfUkVQT1JUSU5HX0lOVEVSVkFMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMtPmRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9BRVNfRU5DUllQVElPTl9LRVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYWVzX2tleV9wYWNrKCZ0aGlzLT5hZXNfZW5jcnlwdGlvbl9rZXksIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0FMQVJNX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlX3BhY2soJnRoaXMtPmFsYXJtX3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9SQU5HSU5HX1RJTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnJhbmdpbmdfdGltZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0RJU0FCTEVEX0FGVEVSX0RJU0NPVkVSWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5kaXNhYmxlZF9hZnRlcl9kaXNjb3ZlcnksIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0RFQUNUSVZBVElPTl9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZGVhY3RpdmF0aW9uX3JlYXNvbl9wYWNrKHRoaXMtPmRlYWN0aXZhdGlvbl9yZWFzb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0FMTF9HRU1fUE9SVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTZfcGFjaygmdGhpcy0+YWxsX2dlbV9wb3J0cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQUxMX0FMTE9DUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyX3BhY2soJnRoaXMtPmFsbF9hbGxvY3MsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX09OVV9QU19UWVBFX0MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5vbnVfcHNfdHlwZV9jKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfRVhURU5ERURfR1VBUkRfVElNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9leHRlbmRlZF9ndWFyZF90aW1lX3BhY2soJnRoaXMtPmV4dGVuZGVkX2d1YXJkX3RpbWUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX09OVV9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9QQVNTV09SRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9BVVRPX1BBU1NXT1JEX0xFQVJOSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfVVNfRkVDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfT01DSV9QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfRFNfQkVSX1JFUE9SVElOR19JTlRFUlZBTCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0FFU19FTkNSWVBUSU9OX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxNjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9BTEFSTV9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9SQU5HSU5HX1RJTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9ESVNBQkxFRF9BRlRFUl9ESVNDT1ZFUlkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9ERUFDVElWQVRJT05fUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQUxMX0dFTV9QT1JUUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTZfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmFsbF9nZW1fcG9ydHMpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0FMTF9BTExPQ1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzJfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmFsbF9hbGxvY3MpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX09OVV9QU19UWVBFX0MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9FWFRFTkRFRF9HVUFSRF9USU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9PTlVfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfb251X3N0YXRlX3VucGFjaygmdGhpcy0+b251X3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9TRVJJQUxfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3NlcmlhbF9udW1iZXJfdW5wYWNrKCZ0aGlzLT5zZXJpYWxfbnVtYmVyLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX1BBU1NXT1JEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl91OF8xMF91bnBhY2soJnRoaXMtPnBhc3N3b3JkLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0FVVE9fUEFTU1dPUkRfTEVBUk5JTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5hdXRvX3Bhc3N3b3JkX2xlYXJuaW5nKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfVVNfRkVDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+dXNfZmVjKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfT01DSV9QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+b21jaV9wb3J0X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfRFNfQkVSX1JFUE9SVElOR19JTlRFUlZBTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAodWludDMyX3QgKikgJnRoaXMtPmRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9BRVNfRU5DUllQVElPTl9LRVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYWVzX2tleV91bnBhY2soJnRoaXMtPmFlc19lbmNyeXB0aW9uX2tleSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9BTEFSTV9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZV91bnBhY2soJnRoaXMtPmFsYXJtX3N0YXRlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX1JBTkdJTkdfVElNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+cmFuZ2luZ190aW1lKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfRElTQUJMRURfQUZURVJfRElTQ09WRVJZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPmRpc2FibGVkX2FmdGVyX2Rpc2NvdmVyeSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfREVBQ1RJVkFUSU9OX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9kZWFjdGl2YXRpb25fcmVhc29uX3VucGFjaygmdGhpcy0+ZGVhY3RpdmF0aW9uX3JlYXNvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQUxMX0dFTV9QT1JUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1Nl91bnBhY2soJnRoaXMtPmFsbF9nZW1fcG9ydHMsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQUxMX0FMTE9DUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyX3VucGFjaygmdGhpcy0+YWxsX2FsbG9jcywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9PTlVfUFNfVFlQRV9DKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+b251X3BzX3R5cGVfYykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0VYVEVOREVEX0dVQVJEX1RJTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZV91bnBhY2soJnRoaXMtPmV4dGVuZGVkX2d1YXJkX3RpbWUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfT05VX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfUEFTU1dPUkQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0FVVE9fUEFTU1dPUkRfTEVBUk5JTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfVVNfRkVDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX09NQ0lfUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9EU19CRVJfUkVQT1JUSU5HX0lOVEVSVkFMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0FFU19FTkNSWVBUSU9OX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDE2KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQUxBUk1fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX1JBTkdJTkdfVElNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9ESVNBQkxFRF9BRlRFUl9ESVNDT1ZFUlkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfREVBQ1RJVkFUSU9OX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9BTExfR0VNX1BPUlRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2X3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9BTExfQUxMT0NTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzJfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX09OVV9QU19UWVBFX0MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfRVhURU5ERURfR1VBUkRfVElNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9PTlVfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5vbnVfc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9OT1RfQ09ORklHVVJFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9JTkFDVElWRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9BQ1RJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfQUNUSVZFX1NUQU5EQlk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfRElTQUJMRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfQVdBS0VfRlJFRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9QUk9DRVNTSU5HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX0xPV19QT1dFUl9ET1pFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX0xPV19QT1dFUl9TTEVFUDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9MT1dfUE9XRVJfV0FUQ0g6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfVU5BV0FSRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fT05VX0NGR19JRF9PTlVfU1RBVEU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zZXJpYWxfbnVtYmVyX2JvdW5kc19jaGVjaygmdGhpcy0+c2VyaWFsX251bWJlcikpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfU0VSSUFMX05VTUJFUjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX1BBU1NXT1JEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl91OF8xMF9ib3VuZHNfY2hlY2soJnRoaXMtPnBhc3N3b3JkKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fT05VX0NGR19JRF9QQVNTV09SRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX09NQ0lfUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+b21jaV9wb3J0X2lkID4gKGJjbW9sdF9ncG9uX2dlbV9pZCkgNDA5NSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fT05VX0NGR19JRF9PTUNJX1BPUlRfSUQ7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9EU19CRVJfUkVQT1JUSU5HX0lOVEVSVkFMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5kc19iZXJfcmVwb3J0aW5nX2ludGVydmFsID4gKGJjbW9sdF9iZXJfaW50ZXJ2YWwpIDUzNjg3MDkxMVVMKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0RTX0JFUl9SRVBPUlRJTkdfSU5URVJWQUw7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9BRVNfRU5DUllQVElPTl9LRVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYWVzX2tleV9ib3VuZHNfY2hlY2soJnRoaXMtPmFlc19lbmNyeXB0aW9uX2tleSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQUVTX0VOQ1JZUFRJT05fS0VZOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQUxBUk1fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGVfYm91bmRzX2NoZWNrKCZ0aGlzLT5hbGFybV9zdGF0ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQUxBUk1fU1RBVEU7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9ESVNBQkxFRF9BRlRFUl9ESVNDT1ZFUlkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5kaXNhYmxlZF9hZnRlcl9kaXNjb3ZlcnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0RJU0FCTEVEX0FGVEVSX0RJU0NPVkVSWTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9ERUFDVElWQVRJT05fUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+ZGVhY3RpdmF0aW9uX3JlYXNvbikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVBQ1RJVkFUSU9OX1JFQVNPTl9OT05FOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVBQ1RJVkFUSU9OX1JFQVNPTl9ERUFDVElWQVRJT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERUFDVElWQVRJT05fUkVBU09OX0FDS19USU1FT1VUOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVBQ1RJVkFUSU9OX1JFQVNPTl9TRkk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERUFDVElWQVRJT05fUkVBU09OX1RJV0k6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERUFDVElWQVRJT05fUkVBU09OX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVBQ1RJVkFUSU9OX1JFQVNPTl9PTlVfQUxBUk06CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERUFDVElWQVRJT05fUkVBU09OX0xPUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFQUNUSVZBVElPTl9SRUFTT05fTE9LSToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFQUNUSVZBVElPTl9SRUFTT05fUkVSQU5HRV9GQUlMVVJFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0RFQUNUSVZBVElPTl9SRUFTT047CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQUxMX0dFTV9QT1JUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+YWxsX2dlbV9wb3J0cy5sZW4gPiAyNTYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2X2JvdW5kc19jaGVjaygmdGhpcy0+YWxsX2dlbV9wb3J0cykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQUxMX0dFTV9QT1JUUzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0FMTF9BTExPQ1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmFsbF9hbGxvY3MubGVuID4gMzIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzJfYm91bmRzX2NoZWNrKCZ0aGlzLT5hbGxfYWxsb2NzKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fT05VX0NGR19JRF9BTExfQUxMT0NTOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfRVhURU5ERURfR1VBUkRfVElNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9leHRlbmRlZF9ndWFyZF90aW1lX2JvdW5kc19jaGVjaygmdGhpcy0+ZXh0ZW5kZWRfZ3VhcmRfdGltZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfRVhURU5ERURfR1VBUkRfVElNRTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09ERVdPUkRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZlY19jb2Rld29yZHMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9GRUNfQllURVNfQ09SUkVDVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZlY19ieXRlc19jb3JyZWN0ZWQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09ERVdPUkRTX0NPUlJFQ1RFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mZWNfY29kZXdvcmRzX2NvcnJlY3RlZCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0ZFQ19DT0RFV09SRFNfVU5DT1JSRUNURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZmVjX2NvZGV3b3Jkc191bmNvcnJlY3RlZCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0JJUDhfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YmlwOF9ieXRlcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0JJUDhfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmJpcDhfZXJyb3JzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfUExPQU1TX0NSQ19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9wbG9hbXNfY3JjX2Vycm9yID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfUExPQU1TX05PTl9JRExFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X3Bsb2Ftc19ub25faWRsZSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1BPU0lUSVZFX0RSSUZUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBvc2l0aXZlX2RyaWZ0ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfTkVHQVRJVkVfRFJJRlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bmVnYXRpdmVfZHJpZnQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9PTUNJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X29tY2kgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9PTUNJX1BBQ0tFVFNfQ1JDX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9CRVJfUkVQT1JURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YmVyX3JlcG9ydGVkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfVU5SRUNFSVZFRF9CVVJTVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT51bnJlY2VpdmVkX2J1cnN0ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfTENER19FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bGNkZ19lcnJvcnMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SRElfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJkaV9lcnJvcnMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9ieXRlcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfcGFja2V0cyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1RYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X2J5dGVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfVFhfUEFDS0VUUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9wYWNrZXRzID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09ERVdPUkRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mZWNfY29kZXdvcmRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0ZFQ19CWVRFU19DT1JSRUNURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZlY19ieXRlc19jb3JyZWN0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEU19DT1JSRUNURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZlY19jb2Rld29yZHNfY29ycmVjdGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0ZFQ19DT0RFV09SRFNfVU5DT1JSRUNURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfQklQOF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+YmlwOF9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9CSVA4X0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+YmlwOF9lcnJvcnMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfUExPQU1TX0NSQ19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfcGxvYW1zX2NyY19lcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfTk9OX0lETEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X3Bsb2Ftc19ub25faWRsZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9QT1NJVElWRV9EUklGVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cG9zaXRpdmVfZHJpZnQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfTkVHQVRJVkVfRFJJRlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPm5lZ2F0aXZlX2RyaWZ0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX09NQ0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X29tY2kpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfb21jaV9wYWNrZXRzX2NyY19lcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9CRVJfUkVQT1JURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmJlcl9yZXBvcnRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9VTlJFQ0VJVkVEX0JVUlNUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51bnJlY2VpdmVkX2J1cnN0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0xDREdfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5sY2RnX2Vycm9ycykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SRElfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yZGlfZXJyb3JzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF9wYWNrZXRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1RYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9UWF9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9wYWNrZXRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9GRUNfQllURVNfQ09SUkVDVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0ZFQ19DT0RFV09SRFNfQ09SUkVDVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0ZFQ19DT0RFV09SRFNfVU5DT1JSRUNURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfQklQOF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9CSVA4X0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfQ1JDX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX1BMT0FNU19OT05fSURMRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9QT1NJVElWRV9EUklGVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9ORUdBVElWRV9EUklGVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9PTUNJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfQkVSX1JFUE9SVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1VOUkVDRUlWRURfQlVSU1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfTENER19FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUkRJX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1RYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1RYX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0ZFQ19DT0RFV09SRFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZlY19jb2Rld29yZHMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfRkVDX0JZVEVTX0NPUlJFQ1RFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZmVjX2J5dGVzX2NvcnJlY3RlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09ERVdPUkRTX0NPUlJFQ1RFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZmVjX2NvZGV3b3Jkc19jb3JyZWN0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEU19VTkNPUlJFQ1RFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZmVjX2NvZGV3b3Jkc191bmNvcnJlY3RlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9CSVA4X0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5iaXA4X2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0JJUDhfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5iaXA4X2Vycm9ycykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfQ1JDX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9wbG9hbXNfY3JjX2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX1BMT0FNU19OT05fSURMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfcGxvYW1zX25vbl9pZGxlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1BPU0lUSVZFX0RSSUZUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5wb3NpdGl2ZV9kcmlmdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9ORUdBVElWRV9EUklGVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+bmVnYXRpdmVfZHJpZnQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfT01DSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfb21jaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9PTUNJX1BBQ0tFVFNfQ1JDX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0JFUl9SRVBPUlRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+YmVyX3JlcG9ydGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1VOUkVDRUlWRURfQlVSU1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnVucmVjZWl2ZWRfYnVyc3QpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfTENER19FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmxjZGdfZXJyb3JzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JESV9FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJkaV9lcnJvcnMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X3BhY2tldHMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfVFhfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1RYX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X3BhY2tldHMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0ZFQ19DT0RFV09SRFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0ZFQ19CWVRFU19DT1JSRUNURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0ZFQ19DT0RFV09SRFNfQ09SUkVDVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09ERVdPUkRTX1VOQ09SUkVDVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9CSVA4X0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9CSVA4X0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfUExPQU1TX0NSQ19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfUExPQU1TX05PTl9JRExFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9QT1NJVElWRV9EUklGVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfTkVHQVRJVkVfRFJJRlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX09NQ0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0JFUl9SRVBPUlRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfVU5SRUNFSVZFRF9CVVJTVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfTENER19FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JESV9FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9UWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfVFhfUEFDS0VUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9zdGF0X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNmZy50cmlnZ2VyLnR5cGUgPSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOworICAgICAgICB0aGlzLT5jZmcuc29hay5hY3RpdmVfc29ha190aW1lID0gMDsKKyAgICAgICAgdGhpcy0+Y2ZnLnNvYWsuY2xlYXJfc29ha190aW1lID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfcGFjaygmdGhpcy0+Y2ZnLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5jZmcpOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3VucGFjaygmdGhpcy0+Y2ZnLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2JvdW5kc19jaGVjaygmdGhpcy0+Y2ZnKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fT05VX1NUQVRfQ0ZHX0lEX0NGRzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0JFUl9JTlRFUlZBTF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9CRVJfSU5URVJWQUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YmVyX2ludGVydmFsID0gKGJjbW9sdF9iZXJfaW50ZXJ2YWwpIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9CRVJfSU5URVJWQUxfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJlc3VsdCA9IEJDTU9MVF9SRVNVTFRfU1VDQ0VTUzsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0JFUl9JTlRFUlZBTF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9CRVJfSU5URVJWQUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcy0+YmVyX2ludGVydmFsKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9CRVJfSU5URVJWQUxfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3VsdF9wYWNrKHRoaXMtPnJlc3VsdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9CRVJfSU5URVJWQUxfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfQkVSX0lOVEVSVkFMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9CRVJfSU5URVJWQUxfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0JFUl9JTlRFUlZBTF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9CRVJfSU5URVJWQUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgKHVpbnQzMl90ICopICZ0aGlzLT5iZXJfaW50ZXJ2YWwpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0JFUl9JTlRFUlZBTF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzdWx0X3VucGFjaygmdGhpcy0+cmVzdWx0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0JFUl9JTlRFUlZBTF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9CRVJfSU5URVJWQUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9CRVJfSU5URVJWQUxfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQkVSX0lOVEVSVkFMX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX1JFU1VMVCkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnJlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1M6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SRVNVTFRfRkFJTDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fT05VX0JFUl9JTlRFUlZBTF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9SRVNVTFQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX29udV9kZmlfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfREZJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hbGFybV9zdGF0dXMgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9kZmlfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9kZmlfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0RGSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9kZmlfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0RGSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9kZmlfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X2RmaV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfREZJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfREZJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2RmaV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfZGZpX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0RGSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5hbGFybV9zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9PTlVfREZJX0lEX0FMQVJNX1NUQVRVUzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X2RnaV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9kZ2lfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9ER0lfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXR1cyA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2RnaV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X2RnaV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfREdJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X2RnaV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9kZ2lfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfREdJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2RnaV9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfZGdpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9ER0lfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9kZ2lfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9ER0lfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfZGdpX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9kZ2lfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9kZ2lfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfREdJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmFsYXJtX3N0YXR1cykKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX09OVV9ER0lfSURfQUxBUk1fU1RBVFVTOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfZG93aV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9kb3dpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfRE9XSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdHVzID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9ET1dJX0lEX0RSSUZUX1ZBTFVFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRyaWZ0X3ZhbHVlID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0RPV0lfSURfTkVXX0VRRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5uZXdfZXFkID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9kb3dpX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfZG93aV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfRE9XSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0RPV0lfSURfRFJJRlRfVkFMVUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3MzMihidWYsIHRoaXMtPmRyaWZ0X3ZhbHVlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9ET1dJX0lEX05FV19FUUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPm5ld19lcWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9kb3dpX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X2Rvd2lfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfRE9XSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0RPV0lfSURfRFJJRlRfVkFMVUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0RPV0lfSURfTkVXX0VRRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2Rvd2lfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X2Rvd2lfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0RPV0lfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9ET1dJX0lEX0RSSUZUX1ZBTFVFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3MzMihidWYsICZ0aGlzLT5kcmlmdF92YWx1ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfRE9XSV9JRF9ORVdfRVFEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5uZXdfZXFkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9kb3dpX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfRE9XSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9ET1dJX0lEX0RSSUZUX1ZBTFVFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfRE9XSV9JRF9ORVdfRVFEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfZG93aV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfZG93aV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X2Rvd2lfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfRE9XSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5hbGFybV9zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9PTlVfRE9XSV9JRF9BTEFSTV9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX29udV9lcnJfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfZXJyX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfRVJSX0lEX0JJUDhfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmJpcDhfZXJyb3JzID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9lcnJfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9lcnJfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0VSUl9JRF9CSVA4X0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5iaXA4X2Vycm9ycykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X2Vycl9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9lcnJfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfRVJSX0lEX0JJUDhfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfZXJyX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9lcnJfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0VSUl9JRF9CSVA4X0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5iaXA4X2Vycm9ycykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfZXJyX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfRVJSX0lEX0JJUDhfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfZXJyX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9lcnJfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9lcnJfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfSU5WQUxJRF9EQlJVX1JFUE9SVF9JRF9BTExPQ19JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hbGxvY19pZCA9IChiY21vbHRfZ3Bvbl9hbGxvY19pZCkgMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfSU5WQUxJRF9EQlJVX1JFUE9SVF9JRF9BTExPQ19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5hbGxvY19pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9JTlZBTElEX0RCUlVfUkVQT1JUX0lEX0FMTE9DX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfSU5WQUxJRF9EQlJVX1JFUE9SVF9JRF9BTExPQ19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPmFsbG9jX2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfSU5WQUxJRF9EQlJVX1JFUE9SVF9JRF9BTExPQ19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0lOVkFMSURfREJSVV9SRVBPUlRfSURfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmFsbG9jX2lkID4gKGJjbW9sdF9ncG9uX2FsbG9jX2lkKSA0MDk1KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9PTlVfSU5WQUxJRF9EQlJVX1JFUE9SVF9JRF9BTExPQ19JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0NPTVBMRVRFRF9JRF9ORVdfS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIG1lbXNldCh0aGlzLT5uZXdfa2V5LmJ5dGVzLCAwLCBzaXplb2YodGhpcy0+bmV3X2tleS5ieXRlcykpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfQ09NUExFVEVEX0lEX05FV19LRVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYWVzX2tleV9wYWNrKCZ0aGlzLT5uZXdfa2V5LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0NPTVBMRVRFRF9JRF9ORVdfS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE2OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9DT01QTEVURURfSURfTkVXX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hZXNfa2V5X3VucGFjaygmdGhpcy0+bmV3X2tleSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfQ09NUExFVEVEX0lEX05FV19LRVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0NPTVBMRVRFRF9JRF9ORVdfS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Flc19rZXlfYm91bmRzX2NoZWNrKCZ0aGlzLT5uZXdfa2V5KSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9DT01QTEVURURfSURfTkVXX0tFWTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfREVDUllQVF9SRVFVSVJFRF9JRF9ORVdfS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIG1lbXNldCh0aGlzLT5uZXdfa2V5LmJ5dGVzLCAwLCBzaXplb2YodGhpcy0+bmV3X2tleS5ieXRlcykpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9ERUNSWVBUX1JFUVVJUkVEX0lEX05FV19LRVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYWVzX2tleV9wYWNrKCZ0aGlzLT5uZXdfa2V5LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfREVDUllQVF9SRVFVSVJFRF9JRF9ORVdfS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE2OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0RFQ1JZUFRfUkVRVUlSRURfSURfTkVXX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hZXNfa2V5X3VucGFjaygmdGhpcy0+bmV3X2tleSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0RFQ1JZUFRfUkVRVUlSRURfSURfTkVXX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDE2KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfREVDUllQVF9SRVFVSVJFRF9JRF9ORVdfS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Flc19rZXlfYm91bmRzX2NoZWNrKCZ0aGlzLT5uZXdfa2V5KSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9ERUNSWVBUX1JFUVVJUkVEX0lEX05FV19LRVk7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0hfSURfRVhQRUNURURfS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIG1lbXNldCh0aGlzLT5leHBlY3RlZF9rZXkuYnl0ZXMsIDAsIHNpemVvZih0aGlzLT5leHBlY3RlZF9rZXkuYnl0ZXMpKTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0hfSURfUkVDRUlWRURfS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIG1lbXNldCh0aGlzLT5yZWNlaXZlZF9rZXkuYnl0ZXMsIDAsIHNpemVvZih0aGlzLT5yZWNlaXZlZF9rZXkuYnl0ZXMpKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSF9JRF9FWFBFQ1RFRF9LRVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYWVzX2tleV9wYWNrKCZ0aGlzLT5leHBlY3RlZF9rZXksIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSF9JRF9SRUNFSVZFRF9LRVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYWVzX2tleV9wYWNrKCZ0aGlzLT5yZWNlaXZlZF9rZXksIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENIX0lEX0VYUEVDVEVEX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxNjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0hfSURfUkVDRUlWRURfS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE2OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0hfSURfRVhQRUNURURfS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Flc19rZXlfdW5wYWNrKCZ0aGlzLT5leHBlY3RlZF9rZXksIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENIX0lEX1JFQ0VJVkVEX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hZXNfa2V5X3VucGFjaygmdGhpcy0+cmVjZWl2ZWRfa2V5LCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0hfSURfRVhQRUNURURfS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0hfSURfUkVDRUlWRURfS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0hfSURfRVhQRUNURURfS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Flc19rZXlfYm91bmRzX2NoZWNrKCZ0aGlzLT5leHBlY3RlZF9rZXkpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSF9JRF9FWFBFQ1RFRF9LRVk7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0hfSURfUkVDRUlWRURfS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Flc19rZXlfYm91bmRzX2NoZWNrKCZ0aGlzLT5yZWNlaXZlZF9rZXkpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSF9JRF9SRUNFSVZFRF9LRVk7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX1VOQ09OU0VDVVRJVkVfSU5ERVhfSURfRVhQRUNURURfSU5ERVgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZXhwZWN0ZWRfaW5kZXggPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX1VOQ09OU0VDVVRJVkVfSU5ERVhfSURfQUNUVUFMX0lOREVYKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFjdHVhbF9pbmRleCA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX1VOQ09OU0VDVVRJVkVfSU5ERVhfSURfRVhQRUNURURfSU5ERVgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmV4cGVjdGVkX2luZGV4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfVU5DT05TRUNVVElWRV9JTkRFWF9JRF9BQ1RVQUxfSU5ERVgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmFjdHVhbF9pbmRleCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9VTkNPTlNFQ1VUSVZFX0lOREVYX0lEX0VYUEVDVEVEX0lOREVYKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfVU5DT05TRUNVVElWRV9JTkRFWF9JRF9BQ1RVQUxfSU5ERVgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9VTkNPTlNFQ1VUSVZFX0lOREVYX0lEX0VYUEVDVEVEX0lOREVYKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5leHBlY3RlZF9pbmRleCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX1VOQ09OU0VDVVRJVkVfSU5ERVhfSURfQUNUVUFMX0lOREVYKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5hY3R1YWxfaW5kZXgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX1VOQ09OU0VDVVRJVkVfSU5ERVhfSURfRVhQRUNURURfSU5ERVgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfVU5DT05TRUNVVElWRV9JTkRFWF9JRF9BQ1RVQUxfSU5ERVgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX29udV9sb2FpX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X2xvYWlfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9MT0FJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hbGFybV9zdGF0dXMgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9sb2FpX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfbG9haV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfTE9BSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9sb2FpX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X2xvYWlfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfTE9BSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9sb2FpX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9sb2FpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9MT0FJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfbG9haV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0xPQUlfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfbG9haV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfbG9haV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X2xvYWlfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfTE9BSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5hbGFybV9zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9PTlVfTE9BSV9JRF9BTEFSTV9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX29udV9sb2tpX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X2xva2lfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9MT0tJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hbGFybV9zdGF0dXMgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9sb2tpX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfbG9raV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfTE9LSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9sb2tpX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X2xva2lfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfTE9LSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9sb2tpX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9sb2tpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9MT0tJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfbG9raV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0xPS0lfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfbG9raV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfbG9raV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X2xva2lfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfTE9LSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5hbGFybV9zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9PTlVfTE9LSV9JRF9BTEFSTV9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX29udV9tZW1pX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X21lbWlfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9NRU1JX0lEX1BMT0FNX0JVRkZFUikpICE9IDApCisgICAgeworICAgICAgICBtZW1zZXQodGhpcy0+cGxvYW1fYnVmZmVyLmFyciwgMCwgc2l6ZW9mKHRoaXMtPnBsb2FtX2J1ZmZlci5hcnIpKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9tZW1pX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfbWVtaV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfTUVNSV9JRF9QTE9BTV9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXJyX3U4XzEzX3BhY2soJnRoaXMtPnBsb2FtX2J1ZmZlciwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfbWVtaV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9tZW1pX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX01FTUlfSURfUExPQU1fQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDEzOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X21lbWlfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X21lbWlfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX01FTUlfSURfUExPQU1fQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl91OF8xM191bnBhY2soJnRoaXMtPnBsb2FtX2J1ZmZlciwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X21lbWlfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9NRU1JX0lEX1BMT0FNX0JVRkZFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9tZW1pX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9tZW1pX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfbWVtaV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9NRU1JX0lEX1BMT0FNX0JVRkZFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfdThfMTNfYm91bmRzX2NoZWNrKCZ0aGlzLT5wbG9hbV9idWZmZXIpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9PTlVfTUVNSV9JRF9QTE9BTV9CVUZGRVI7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9PTUNJX1BPUlRfSURfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfR0VNX1BPUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Z2VtX3BvcnQgPSAoYmNtb2x0X2dwb25fZ2VtX2lkKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT01DSV9QT1JUX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0dXMgPSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1M7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9PTUNJX1BPUlRfSURfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfT1BFUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9wZXJhdGlvbiA9IEJDTU9MVF9PTUNJX1BPUlRfSURfT1BFUkFUSU9OX0NPTkZJR1VSRTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX09NQ0lfUE9SVF9JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9HRU1fUE9SVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5nZW1fcG9ydCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT01DSV9QT1JUX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfcGFjayh0aGlzLT5zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT01DSV9QT1JUX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX09QRVJBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9vbWNpX3BvcnRfaWRfb3BlcmF0aW9uX3BhY2sodGhpcy0+b3BlcmF0aW9uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX09NQ0lfUE9SVF9JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9HRU1fUE9SVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT01DSV9QT1JUX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT01DSV9QT1JUX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX09QRVJBVElPTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9PTUNJX1BPUlRfSURfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfR0VNX1BPUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5nZW1fcG9ydCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT01DSV9QT1JUX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfdW5wYWNrKCZ0aGlzLT5zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT01DSV9QT1JUX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX09QRVJBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9vbWNpX3BvcnRfaWRfb3BlcmF0aW9uX3VucGFjaygmdGhpcy0+b3BlcmF0aW9uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX09NQ0lfUE9SVF9JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9HRU1fUE9SVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX09NQ0lfUE9SVF9JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9PTUNJX1BPUlRfSURfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfT1BFUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT01DSV9QT1JUX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX0dFTV9QT1JUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5nZW1fcG9ydCA+IChiY21vbHRfZ3Bvbl9nZW1faWQpIDQwOTUpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX09OVV9PTUNJX1BPUlRfSURfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfR0VNX1BPUlQ7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX09NQ0lfUE9SVF9JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JFU1VMVF9TVUNDRVNTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVTVUxUX0ZBSUw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX09OVV9PTUNJX1BPUlRfSURfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfU1RBVFVTOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT01DSV9QT1JUX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX09QRVJBVElPTikpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPm9wZXJhdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT01DSV9QT1JUX0lEX09QRVJBVElPTl9DT05GSUdVUkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTUNJX1BPUlRfSURfT1BFUkFUSU9OX1JFTU9WRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fT05VX09NQ0lfUE9SVF9JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0dXMgPSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1M7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZmFpbF9yZWFzb24gPSBCQ01PTFRfQUNUSVZBVElPTl9GQUlMX1JFQVNPTl9OT05FOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfcGFjayh0aGlzLT5zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2FjdGl2YXRpb25fZmFpbF9yZWFzb25fcGFjayh0aGlzLT5mYWlsX3JlYXNvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfdW5wYWNrKCZ0aGlzLT5zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2FjdGl2YXRpb25fZmFpbF9yZWFzb25fdW5wYWNrKCZ0aGlzLT5mYWlsX3JlYXNvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnN0YXR1cykKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1M6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SRVNVTFRfRkFJTDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fT05VX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5mYWlsX3JlYXNvbikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUNUSVZBVElPTl9GQUlMX1JFQVNPTl9OT05FOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUNUSVZBVElPTl9GQUlMX1JFQVNPTl9SQU5HSU5HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUNUSVZBVElPTl9GQUlMX1JFQVNPTl9QQVNTV09SRF9BVVRIRU5USUNBVElPTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FDVElWQVRJT05fRkFJTF9SRUFTT05fTE9TOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUNUSVZBVElPTl9GQUlMX1JFQVNPTl9PTlVfQUxBUk06CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfRkFJTF9SRUFTT047CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX09OVV9BQ1RJVkFUSU9OX1NUQU5EQllfQ09NUExFVEVEX0lEX1JFU1VMVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yZXN1bHQgPSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1M7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT05VX0FDVElWQVRJT05fU1RBTkRCWV9DT01QTEVURURfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3VsdF9wYWNrKHRoaXMtPnJlc3VsdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT05VX0FDVElWQVRJT05fU1RBTkRCWV9DT01QTEVURURfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9PTlVfQUNUSVZBVElPTl9TVEFOREJZX0NPTVBMRVRFRF9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzdWx0X3VucGFjaygmdGhpcy0+cmVzdWx0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT05VX0FDVElWQVRJT05fU1RBTkRCWV9DT01QTEVURURfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT05VX0FDVElWQVRJT05fU1RBTkRCWV9DT01QTEVURURfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+cmVzdWx0KQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SRVNVTFRfU1VDQ0VTUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JFU1VMVF9GQUlMOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9PTlVfT05VX0FDVElWQVRJT05fU1RBTkRCWV9DT01QTEVURURfSURfUkVTVUxUOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X29udV9hbGFybV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX09OVV9BTEFSTV9JRF9PTlVfQUxBUk0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b251X2FsYXJtLmxvc2kgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICAgICAgdGhpcy0+b251X2FsYXJtLmxvZmkgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICAgICAgdGhpcy0+b251X2FsYXJtLmxvYW1pID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9PTlVfQUxBUk1fSURfT05VX0FMQVJNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fb251X2FsYXJtc19wYWNrKCZ0aGlzLT5vbnVfYWxhcm0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X29udV9hbGFybV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT05VX0FMQVJNX0lEX09OVV9BTEFSTSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAzOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9hbGFybV9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9PTlVfQUxBUk1fSURfT05VX0FMQVJNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fb251X2FsYXJtc191bnBhY2soJnRoaXMtPm9udV9hbGFybSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9hbGFybV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX09OVV9BTEFSTV9JRF9PTlVfQUxBUk0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1fZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X29udV9hbGFybV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X29udV9hbGFybV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9PTlVfQUxBUk1fSURfT05VX0FMQVJNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fb251X2FsYXJtc19ib3VuZHNfY2hlY2soJnRoaXMtPm9udV9hbGFybSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX09OVV9PTlVfQUxBUk1fSURfT05VX0FMQVJNOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0dXMgPSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1M7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3VsdF9wYWNrKHRoaXMtPnN0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9PTlVfREVBQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzdWx0X3VucGFjaygmdGhpcy0+c3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SRVNVTFRfU1VDQ0VTUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JFU1VMVF9GQUlMOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9PTlVfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURURfSURfU1RBVFVTOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX09OVV9ESVNBQkxFX0NPTVBMRVRFRF9JRF9TRVJJQUxfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIG1lbXNldCh0aGlzLT5zZXJpYWxfbnVtYmVyLnZlbmRvcl9pZCwgMCwgc2l6ZW9mKHRoaXMtPnNlcmlhbF9udW1iZXIudmVuZG9yX2lkKSk7CisgICAgICAgIG1lbXNldCh0aGlzLT5zZXJpYWxfbnVtYmVyLnZlbmRvcl9zcGVjaWZpYywgMCwgc2l6ZW9mKHRoaXMtPnNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljKSk7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9PTlVfRElTQUJMRV9DT01QTEVURURfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zZXJpYWxfbnVtYmVyX3BhY2soJnRoaXMtPnNlcmlhbF9udW1iZXIsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT05VX0RJU0FCTEVfQ09NUExFVEVEX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT05VX0RJU0FCTEVfQ09NUExFVEVEX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc2VyaWFsX251bWJlcl91bnBhY2soJnRoaXMtPnNlcmlhbF9udW1iZXIsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9PTlVfRElTQUJMRV9DT01QTEVURURfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX09OVV9ESVNBQkxFX0NPTVBMRVRFRF9JRF9TRVJJQUxfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3NlcmlhbF9udW1iZXJfYm91bmRzX2NoZWNrKCZ0aGlzLT5zZXJpYWxfbnVtYmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fT05VX09OVV9ESVNBQkxFX0NPTVBMRVRFRF9JRF9TRVJJQUxfTlVNQkVSOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX09OVV9FTkFCTEVfQ09NUExFVEVEX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgbWVtc2V0KHRoaXMtPnNlcmlhbF9udW1iZXIudmVuZG9yX2lkLCAwLCBzaXplb2YodGhpcy0+c2VyaWFsX251bWJlci52ZW5kb3JfaWQpKTsKKyAgICAgICAgbWVtc2V0KHRoaXMtPnNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljLCAwLCBzaXplb2YodGhpcy0+c2VyaWFsX251bWJlci52ZW5kb3Jfc3BlY2lmaWMpKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9PTlVfRU5BQkxFX0NPTVBMRVRFRF9JRF9TRVJJQUxfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3NlcmlhbF9udW1iZXJfcGFjaygmdGhpcy0+c2VyaWFsX251bWJlciwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT05VX0VOQUJMRV9DT01QTEVURURfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT05VX0VOQUJMRV9DT01QTEVURURfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zZXJpYWxfbnVtYmVyX3VucGFjaygmdGhpcy0+c2VyaWFsX251bWJlciwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT05VX0VOQUJMRV9DT01QTEVURURfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX09OVV9FTkFCTEVfQ09NUExFVEVEX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc2VyaWFsX251bWJlcl9ib3VuZHNfY2hlY2soJnRoaXMtPnNlcmlhbF9udW1iZXIpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9PTlVfT05VX0VOQUJMRV9DT01QTEVURURfSURfU0VSSUFMX05VTUJFUjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdHVzID0gQkNNT0xUX1JFU1VMVF9TVUNDRVNTOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZhaWxfcmVhc29uID0gQkNNT0xUX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0ZBSUxfUkVBU09OX05PTkU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9DT01QTEVURURfSURfUEFTU1dPUkQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgbWVtc2V0KHRoaXMtPnBhc3N3b3JkLmFyciwgMCwgc2l6ZW9mKHRoaXMtPnBhc3N3b3JkLmFycikpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfcGFjayh0aGlzLT5zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2ZhaWxfcmVhc29uX3BhY2sodGhpcy0+ZmFpbF9yZWFzb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fQ09NUExFVEVEX0lEX1BBU1NXT1JEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl91OF8xMF9wYWNrKCZ0aGlzLT5wYXNzd29yZCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9DT01QTEVURURfSURfRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFRF9JRF9QQVNTV09SRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxMDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfdW5wYWNrKCZ0aGlzLT5zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2ZhaWxfcmVhc29uX3VucGFjaygmdGhpcy0+ZmFpbF9yZWFzb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fQ09NUExFVEVEX0lEX1BBU1NXT1JEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl91OF8xMF91bnBhY2soJnRoaXMtPnBhc3N3b3JkLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFRF9JRF9QQVNTV09SRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEwKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SRVNVTFRfU1VDQ0VTUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JFU1VMVF9GQUlMOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9PTlVfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmZhaWxfcmVhc29uKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9GQUlMX1JFQVNPTl9OT05FOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fRkFJTF9SRUFTT05fUEFTU1dPUkRfSU5DT05TSVNURU5DWToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0ZBSUxfUkVBU09OX1BBU1NXT1JEX01JU01BVENIOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fRkFJTF9SRUFTT05fUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fVElNRU9VVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0ZBSUxfUkVBU09OX09OVV9BTEFSTToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0ZBSUxfUkVBU09OX0xPU19FVkVOVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0ZBSUxfUkVBU09OX0RJU0FCTEVfRVZFTlQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX09OVV9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9DT01QTEVURURfSURfRkFJTF9SRUFTT047CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9DT01QTEVURURfSURfUEFTU1dPUkQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXJyX3U4XzEwX2JvdW5kc19jaGVjaygmdGhpcy0+cGFzc3dvcmQpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9PTlVfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fQ09NUExFVEVEX0lEX1BBU1NXT1JEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX29udV9wZWVfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfcGVlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUEVFX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hbGFybV9zdGF0dXMgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wZWVfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9wZWVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1BFRV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9wZWVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfcGVlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1BFRV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wZWVfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X3BlZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUEVFX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcGVlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUEVFX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3BlZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfcGVlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfcGVlX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1BFRV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5hbGFybV9zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9PTlVfUEVFX0lEX0FMQVJNX1NUQVRVUzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUE9TU0lCTEVfRFJJRlRfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXR1cyA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUE9TU0lCTEVfRFJJRlRfSURfRVNUSU1BVEVEX0RSSUZUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmVzdGltYXRlZF9kcmlmdCA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUE9TU0lCTEVfRFJJRlRfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9QT1NTSUJMRV9EUklGVF9JRF9FU1RJTUFURURfRFJJRlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3MzMihidWYsIHRoaXMtPmVzdGltYXRlZF9kcmlmdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1BPU1NJQkxFX0RSSUZUX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUE9TU0lCTEVfRFJJRlRfSURfRVNUSU1BVEVEX0RSSUZUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9QT1NTSUJMRV9EUklGVF9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1BPU1NJQkxFX0RSSUZUX0lEX0VTVElNQVRFRF9EUklGVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9zMzIoYnVmLCAmdGhpcy0+ZXN0aW1hdGVkX2RyaWZ0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1BPU1NJQkxFX0RSSUZUX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1BPU1NJQkxFX0RSSUZUX0lEX0VTVElNQVRFRF9EUklGVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1BPU1NJQkxFX0RSSUZUX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmFsYXJtX3N0YXR1cykKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX09OVV9QT1NTSUJMRV9EUklGVF9JRF9BTEFSTV9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX09MRF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vbGRfc3RhdGUgPSBCQ01PTFRfT05VX1NUQVRFX05PVF9DT05GSUdVUkVEOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0VfSURfTkVXX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm5ld19zdGF0ZSA9IEJDTU9MVF9PTlVfU1RBVEVfTk9UX0NPTkZJR1VSRUQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmVhc29uID0gQkNNT0xUX1BPV0VSX01BTkFHRU1FTlRfVFJBTlNJVElPTl9SRUFTT05fUE9XRVJfTUFOQUdFTUVOVF9FTkFCTEVEOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX09MRF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9vbnVfc3RhdGVfcGFjayh0aGlzLT5vbGRfc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0VfSURfTkVXX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X29udV9zdGF0ZV9wYWNrKHRoaXMtPm5ld19zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcG93ZXJfbWFuYWdlbWVudF90cmFuc2l0aW9uX3JlYXNvbl9wYWNrKHRoaXMtPnJlYXNvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0VfSURfT0xEX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9ORVdfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0VfSURfT0xEX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X29udV9zdGF0ZV91bnBhY2soJnRoaXMtPm9sZF9zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9ORVdfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfb251X3N0YXRlX3VucGFjaygmdGhpcy0+bmV3X3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb3dlcl9tYW5hZ2VtZW50X3RyYW5zaXRpb25fcmVhc29uX3VucGFjaygmdGhpcy0+cmVhc29uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0VfSURfT0xEX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0VfSURfTkVXX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0VfSURfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0VfSURfT0xEX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+b2xkX3N0YXRlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfTk9UX0NPTkZJR1VSRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfSU5BQ1RJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfQUNUSVZFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX0FDVElWRV9TVEFOREJZOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX0RJU0FCTEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX0FXQUtFX0ZSRUU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfUFJPQ0VTU0lORzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9MT1dfUE9XRVJfRE9aRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9MT1dfUE9XRVJfU0xFRVA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfTE9XX1BPV0VSX1dBVENIOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX1VOQVdBUkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9PTERfU1RBVEU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9ORVdfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5uZXdfc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9OT1RfQ09ORklHVVJFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9JTkFDVElWRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9BQ1RJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfQUNUSVZFX1NUQU5EQlk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfRElTQUJMRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfQVdBS0VfRlJFRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9QUk9DRVNTSU5HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX0xPV19QT1dFUl9ET1pFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX0xPV19QT1dFUl9TTEVFUDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9MT1dfUE9XRVJfV0FUQ0g6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfVU5BV0FSRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX05FV19TVEFURTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnJlYXNvbikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUE9XRVJfTUFOQUdFTUVOVF9UUkFOU0lUSU9OX1JFQVNPTl9QT1dFUl9NQU5BR0VNRU5UX0VOQUJMRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9QT1dFUl9NQU5BR0VNRU5UX1RSQU5TSVRJT05fUkVBU09OX1BPV0VSX01BTkFHRU1FTlRfRElTQUJMRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9QT1dFUl9NQU5BR0VNRU5UX1RSQU5TSVRJT05fUkVBU09OX1NMRUVQX1JFUVVFU1RfQVdBS0U6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9QT1dFUl9NQU5BR0VNRU5UX1RSQU5TSVRJT05fUkVBU09OX1NMRUVQX1JFUVVFU1RfRE9aRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BPV0VSX01BTkFHRU1FTlRfVFJBTlNJVElPTl9SRUFTT05fU0xFRVBfUkVRVUVTVF9TTEVFUDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BPV0VSX01BTkFHRU1FTlRfVFJBTlNJVElPTl9SRUFTT05fU0xFRVBfUkVRVUVTVF9XQVRDSDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BPV0VSX01BTkFHRU1FTlRfVFJBTlNJVElPTl9SRUFTT05fVEVSSV9FWFBJUkVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUE9XRVJfTUFOQUdFTUVOVF9UUkFOU0lUSU9OX1JFQVNPTl9UQUxFUlRFRF9FWFBJUkVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUE9XRVJfTUFOQUdFTUVOVF9UUkFOU0lUSU9OX1JFQVNPTl9BTEFSTToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX1JFQVNPTjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X3BzdF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9wc3RfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9QU1RfSURfTElOS19OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bGlua19udW1iZXIgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUFNUX0lEX0sxKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmsxID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1BTVF9JRF9LMikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5rMiA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcHN0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfcHN0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9QU1RfSURfTElOS19OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmxpbmtfbnVtYmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9QU1RfSURfSzEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+azEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1BTVF9JRF9LMikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5rMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X3BzdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9wc3RfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUFNUX0lEX0xJTktfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9QU1RfSURfSzEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1BTVF9JRF9LMikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3BzdF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfcHN0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9QU1RfSURfTElOS19OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmxpbmtfbnVtYmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9QU1RfSURfSzEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+azEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1BTVF9JRF9LMikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5rMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcHN0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUFNUX0lEX0xJTktfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUFNUX0lEX0sxKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUFNUX0lEX0syKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcHN0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9wc3RfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9wc3RfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdHVzID0gQkNNT0xUX1JFU1VMVF9TVUNDRVNTOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZmFpbF9yZWFzb24gPSBCQ01PTFRfUkFOR0lOR19GQUlMX1JFQVNPTl9OT05FOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfTlVNQkVSX09GX1BMT0FNUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5udW1iZXJfb2ZfcGxvYW1zID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX0VRRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5lcWQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfUE9XRVJfTEVWRUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cG93ZXJfbGV2ZWwgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfcGFjayh0aGlzLT5zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmFuZ2luZ19mYWlsX3JlYXNvbl9wYWNrKHRoaXMtPmZhaWxfcmVhc29uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX05VTUJFUl9PRl9QTE9BTVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bnVtYmVyX29mX3Bsb2FtcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfRVFEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5lcWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX1BPV0VSX0xFVkVMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnBvd2VyX2xldmVsKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfTlVNQkVSX09GX1BMT0FNUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfRVFEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9QT1dFUl9MRVZFTCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3VsdF91bnBhY2soJnRoaXMtPnN0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yYW5naW5nX2ZhaWxfcmVhc29uX3VucGFjaygmdGhpcy0+ZmFpbF9yZWFzb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfTlVNQkVSX09GX1BMT0FNUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5udW1iZXJfb2ZfcGxvYW1zKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9FUUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmVxZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfUE9XRVJfTEVWRUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+cG93ZXJfbGV2ZWwpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9OVU1CRVJfT0ZfUExPQU1TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfRVFEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfUE9XRVJfTEVWRUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JFU1VMVF9TVUNDRVNTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVTVUxUX0ZBSUw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmZhaWxfcmVhc29uKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SQU5HSU5HX0ZBSUxfUkVBU09OX05PTkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SQU5HSU5HX0ZBSUxfUkVBU09OX1JBTkdJTkdfQUNLX1RJTUVPVVQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SQU5HSU5HX0ZBSUxfUkVBU09OX1BMT0FNX0RBVEFfTUlTTUFUQ0g6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SQU5HSU5HX0ZBSUxfUkVBU09OX1BMT0FNX1RZUEVfTUlTTUFUQ0g6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SQU5HSU5HX0ZBSUxfUkVBU09OX1BMT0FNX09OVV9JRF9NSVNNQVRDSDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JBTkdJTkdfRkFJTF9SRUFTT05fRFJJRlRfRVhDRUVERUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SQU5HSU5HX0ZBSUxfUkVBU09OX05PX1BMT0FNX1JFQ0VJVkVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkFOR0lOR19GQUlMX1JFQVNPTl9MT1M6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SQU5HSU5HX0ZBSUxfUkVBU09OX0FMQVJNUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfcmVpX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X3JlaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1JFSV9JRF9CSVA4X0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5iaXA4X2Vycm9ycyA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcmVpX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfcmVpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9SRUlfSURfQklQOF9FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmJpcDhfZXJyb3JzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfcmVpX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X3JlaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9SRUlfSURfQklQOF9FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9yZWlfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X3JlaV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUkVJX0lEX0JJUDhfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5iaXA4X2Vycm9ycykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcmVpX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUkVJX0lEX0JJUDhfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcmVpX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9yZWlfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9yZWlfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdHVzID0gQkNNT0xUX1JFU1VMVF9TVUNDRVNTOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZmFpbF9yZWFzb24gPSBCQ01PTFRfUlNTSV9NRUFTVVJFTUVOVF9GQUlMX1JFQVNPTl9OT05FOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfcGFjayh0aGlzLT5zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcnNzaV9tZWFzdXJlbWVudF9mYWlsX3JlYXNvbl9wYWNrKHRoaXMtPmZhaWxfcmVhc29uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzdWx0X3VucGFjaygmdGhpcy0+c3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jzc2lfbWVhc3VyZW1lbnRfZmFpbF9yZWFzb25fdW5wYWNrKCZ0aGlzLT5mYWlsX3JlYXNvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SRVNVTFRfU1VDQ0VTUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JFU1VMVF9GQUlMOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9PTlVfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfU1RBVFVTOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5mYWlsX3JlYXNvbikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUlNTSV9NRUFTVVJFTUVOVF9GQUlMX1JFQVNPTl9OT05FOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUlNTSV9NRUFTVVJFTUVOVF9GQUlMX1JFQVNPTl9OT19ERUxJTUlURVI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SU1NJX01FQVNVUkVNRU5UX0ZBSUxfUkVBU09OX05PX0FDQ0VTUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfc2RpX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X3NkaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NESV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdHVzID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TRElfSURfQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmJlciA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc2RpX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfc2RpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TRElfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TRElfSURfQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5iZXIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9zZGlfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfc2RpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NESV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NESV9JRF9CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zZGlfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X3NkaV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU0RJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU0RJX0lEX0JFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+YmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zZGlfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TRElfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU0RJX0lEX0JFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3NkaV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfc2RpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfc2RpX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NESV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5hbGFybV9zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9PTlVfU0RJX0lEX0FMQVJNX1NUQVRVUzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X3NmaV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9zZmlfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TRklfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXR1cyA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU0ZJX0lEX0JFUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5iZXIgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3NmaV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X3NmaV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU0ZJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU0ZJX0lEX0JFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+YmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfc2ZpX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X3NmaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TRklfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TRklfSURfQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc2ZpX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9zZmlfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NGSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NGSV9JRF9CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmJlcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc2ZpX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU0ZJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NGSV9JRF9CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zZmlfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X3NmaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X3NmaV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TRklfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+YWxhcm1fc3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fT05VX1NGSV9JRF9BTEFSTV9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdCA9IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0ZFQ19DT0RFV09SRFM7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX29udV9zdGF0X2lkX3BhY2sodGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX29udV9zdGF0X2lkX3VucGFjaygmdGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09ERVdPUkRTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9GRUNfQllURVNfQ09SUkVDVEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09ERVdPUkRTX0NPUlJFQ1RFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEU19VTkNPUlJFQ1RFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfQklQOF9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfQklQOF9FUlJPUlM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX1BMT0FNU19DUkNfRVJST1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX1BMT0FNU19OT05fSURMRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUE9TSVRJVkVfRFJJRlQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX05FR0FUSVZFX0RSSUZUOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9PTUNJOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9PTUNJX1BBQ0tFVFNfQ1JDX0VSUk9SOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9CRVJfUkVQT1JURUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1VOUkVDRUlWRURfQlVSU1Q6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0xDREdfRVJST1JTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SRElfRVJST1JTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfUEFDS0VUUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfVFhfQllURVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1RYX1BBQ0tFVFM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX09OVV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0ID0gQkNNT0xUX0dQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEUzsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fb251X3N0YXRfaWRfcGFjayh0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fb251X3N0YXRfaWRfdW5wYWNrKCZ0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0KQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0ZFQ19DT0RFV09SRFM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0ZFQ19CWVRFU19DT1JSRUNURUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0ZFQ19DT0RFV09SRFNfQ09SUkVDVEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09ERVdPUkRTX1VOQ09SUkVDVEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9CSVA4X0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9CSVA4X0VSUk9SUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfUExPQU1TX0NSQ19FUlJPUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfUExPQU1TX05PTl9JRExFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9QT1NJVElWRV9EUklGVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfTkVHQVRJVkVfRFJJRlQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX09NQ0k6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0JFUl9SRVBPUlRFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfVU5SRUNFSVZFRF9CVVJTVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfTENER19FUlJPUlM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JESV9FUlJPUlM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9QQUNLRVRTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9UWF9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfVFhfUEFDS0VUUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fT05VX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX29udV9zdWZpX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X3N1ZmlfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVUZJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hbGFybV9zdGF0dXMgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zdWZpX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfc3VmaV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1VGSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9zdWZpX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X3N1ZmlfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1VGSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zdWZpX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9zdWZpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TVUZJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3VmaV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NVRklfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3VmaV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfc3VmaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X3N1ZmlfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU1VGSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5hbGFybV9zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9PTlVfU1VGSV9JRF9BTEFSTV9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX29udV90aXdpX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X3Rpd2lfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9USVdJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hbGFybV9zdGF0dXMgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1RJV0lfSURfRFJJRlRfVkFMVUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZHJpZnRfdmFsdWUgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Rpd2lfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV90aXdpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9USVdJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfVElXSV9JRF9EUklGVF9WQUxVRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfczMyKGJ1ZiwgdGhpcy0+ZHJpZnRfdmFsdWUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV90aXdpX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X3Rpd2lfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfVElXSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1RJV0lfSURfRFJJRlRfVkFMVUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV90aXdpX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV90aXdpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9USVdJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfVElXSV9JRF9EUklGVF9WQUxVRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9zMzIoYnVmLCAmdGhpcy0+ZHJpZnRfdmFsdWUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Rpd2lfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9USVdJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1RJV0lfSURfRFJJRlRfVkFMVUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV90aXdpX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV90aXdpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfdGl3aV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9USVdJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmFsYXJtX3N0YXR1cykKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX09OVV9USVdJX0lEX0FMQVJNX1NUQVRVUzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfQkVSX0lOVEVSVkFMX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmJlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfREZJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRmaSA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfREdJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRnaSA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfRE9XSSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5kb3dpID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9FUlIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZXJyID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9JTlZBTElEX0RCUlVfUkVQT1JUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmludmFsaWRfZGJydV9yZXBvcnQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+a2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0NZQ0xFX1NLSVBQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+a2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9ERUNSWVBUX1JFUVVJUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmtleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmtleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2ggPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9LRVlfUkVRVUVTVF9USU1FT1VUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmtleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0ID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfVU5DT05TRUNVVElWRV9JTkRFWCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfTE9BSSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5sb2FpID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9MT0tJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmxva2kgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX01FTUkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bWVtaSA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT01DSV9QT1JUX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0FDVElWQVRJT05fQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0FDVElWQVRJT05fU1RBTkRCWV9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9BTEFSTSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vbnVfYWxhcm0gPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfRElTQUJMRV9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b251X2Rpc2FibGVfY29tcGxldGVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfRU5BQkxFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vbnVfZW5hYmxlX2NvbXBsZXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT1BUSUNBTF9SRUZMRUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9wdGljYWxfcmVmbGVjdGlvbiA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUEVFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBlZSA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUE9TU0lCTEVfRFJJRlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cG9zc2libGVfZHJpZnQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9QU1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cHN0ID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9SQU5HSU5HX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yYW5naW5nX2NvbXBsZXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUkVJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJlaSA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1NESSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zZGkgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1NGSSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zZmkgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0X2FsYXJtX2NsZWFyZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9TVUZJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN1ZmkgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1RJV0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dGl3aSA9IEJDTU9TX0ZBTFNFOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0JFUl9JTlRFUlZBTF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmJlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfREZJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+ZGZpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9ER0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5kZ2kpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0RPV0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5kb3dpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9FUlIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5lcnIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0lOVkFMSURfREJSVV9SRVBPUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5pbnZhbGlkX2RicnVfcmVwb3J0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+a2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0NZQ0xFX1NLSVBQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0RFQ1JZUFRfUkVRVUlSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmtleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2gpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9LRVlfUkVRVUVTVF9USU1FT1VUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+a2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9VTkNPTlNFQ1VUSVZFX0lOREVYKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+a2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0xPQUkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5sb2FpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9MT0tJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+bG9raSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfTUVNSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPm1lbWkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09NQ0lfUE9SVF9JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPm9tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0FDVElWQVRJT05fQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+b251X2FjdGl2YXRpb25fY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfQUNUSVZBVElPTl9TVEFOREJZX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPm9udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfQUxBUk0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5vbnVfYWxhcm0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+b251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9ESVNBQkxFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPm9udV9kaXNhYmxlX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0VOQUJMRV9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5vbnVfZW5hYmxlX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT1BUSUNBTF9SRUZMRUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+b3B0aWNhbF9yZWZsZWN0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1BFRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnBlZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUE9TU0lCTEVfRFJJRlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5wb3NzaWJsZV9kcmlmdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUFNUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+cHN0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9SQU5HSU5HX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnJhbmdpbmdfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9SRUkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5yZWkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+cnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1NESSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnNkaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU0ZJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c2ZpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5zdGF0X2FsYXJtX2NsZWFyZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhdF9hbGFybV9yYWlzZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1NVRkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5zdWZpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9USVdJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dGl3aSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0JFUl9JTlRFUlZBTF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfREZJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9ER0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0RPV0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0VSUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfSU5WQUxJRF9EQlJVX1JFUE9SVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0NZQ0xFX1NLSVBQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9ERUNSWVBUX1JFUVVJUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfS0VZX1JFUVVFU1RfVElNRU9VVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX1VOQ09OU0VDVVRJVkVfSU5ERVgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0xPQUkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0xPS0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX01FTUkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09NQ0lfUE9SVF9JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0FDVElWQVRJT05fQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfQUNUSVZBVElPTl9TVEFOREJZX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0FMQVJNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfREVBQ1RJVkFUSU9OX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0RJU0FCTEVfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfRU5BQkxFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT1BUSUNBTF9SRUZMRUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1BFRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUE9TU0lCTEVfRFJJRlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9QU1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1JBTkdJTkdfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9SRUkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9TREkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1NGSSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU1VGSSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfVElXSSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfQkVSX0lOVEVSVkFMX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+YmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9ERkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5kZmkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0RHSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmRnaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfRE9XSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmRvd2kpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0VSUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmVycikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfSU5WQUxJRF9EQlJVX1JFUE9SVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmludmFsaWRfZGJydV9yZXBvcnQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5rZXlfZXhjaGFuZ2VfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfQ1lDTEVfU0tJUFBFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmtleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfREVDUllQVF9SRVFVSVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmtleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+a2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0tFWV9SRVFVRVNUX1RJTUVPVVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX1VOQ09OU0VDVVRJVkVfSU5ERVgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfTE9BSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmxvYWkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0xPS0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5sb2tpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9NRU1JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+bWVtaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT01DSV9QT1JUX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+b21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfQUNUSVZBVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9BQ1RJVkFUSU9OX1NUQU5EQllfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+b251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9BTEFSTSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPm9udV9hbGFybSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0RJU0FCTEVfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+b251X2Rpc2FibGVfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfRU5BQkxFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPm9udV9lbmFibGVfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PUFRJQ0FMX1JFRkxFQ1RJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5vcHRpY2FsX3JlZmxlY3Rpb24pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUEVFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+cGVlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9QT1NTSUJMRV9EUklGVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnBvc3NpYmxlX2RyaWZ0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnBvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9QU1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5wc3QpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1JBTkdJTkdfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+cmFuZ2luZ19jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1JFSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnJlaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU0RJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c2RpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9TRkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zZmkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnN0YXRfYWxhcm1fY2xlYXJlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zdGF0X2FsYXJtX3JhaXNlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU1VGSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnN1ZmkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1RJV0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT50aXdpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0JFUl9JTlRFUlZBTF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0RGSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0RHSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0RPV0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9FUlIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9JTlZBTElEX0RCUlVfUkVQT1JUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9DWUNMRV9TS0lQUEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0RFQ1JZUFRfUkVRVUlSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0tFWV9SRVFVRVNUX1RJTUVPVVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfVU5DT05TRUNVVElWRV9JTkRFWCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0xPQUkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9MT0tJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfTUVNSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09NQ0lfUE9SVF9JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9BQ1RJVkFUSU9OX1NUQU5EQllfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0FMQVJNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfRElTQUJMRV9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfRU5BQkxFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09QVElDQUxfUkVGTEVDVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1BFRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1BPU1NJQkxFX0RSSUZUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9QU1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9SQU5HSU5HX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1JFSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU0RJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU0ZJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9TVUZJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfVElXSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DSEFOR0VfUE9XRVJfTEVWRUxfSURfUE9XRVJfTEVWRUxfQUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBvd2VyX2xldmVsX2FjdGlvbiA9IEJDTU9MVF9PTlVfUE9XRVJfTEVWRUxfSU5DUkVBU0U7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DSEFOR0VfUE9XRVJfTEVWRUxfSURfUE9XRVJfTEVWRUxfQUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X29udV9wb3dlcl9sZXZlbF9wYWNrKHRoaXMtPnBvd2VyX2xldmVsX2FjdGlvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DSEFOR0VfUE9XRVJfTEVWRUxfSURfUE9XRVJfTEVWRUxfQUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NIQU5HRV9QT1dFUl9MRVZFTF9JRF9QT1dFUl9MRVZFTF9BQ1RJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfb251X3Bvd2VyX2xldmVsX3VucGFjaygmdGhpcy0+cG93ZXJfbGV2ZWxfYWN0aW9uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NIQU5HRV9QT1dFUl9MRVZFTF9JRF9QT1dFUl9MRVZFTF9BQ1RJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DSEFOR0VfUE9XRVJfTEVWRUxfSURfUE9XRVJfTEVWRUxfQUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+cG93ZXJfbGV2ZWxfYWN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfUE9XRVJfTEVWRUxfSU5DUkVBU0U6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfUE9XRVJfTEVWRUxfREVDUkVBU0U6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX09OVV9DSEFOR0VfUE9XRVJfTEVWRUxfSURfUE9XRVJfTEVWRUxfQUNUSU9OOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU0VUX09OVV9TVEFURV9JRF9PTlVfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b251X3N0YXRlID0gQkNNT0xUX09OVV9PUEVSQVRJT05fSU5BQ1RJVkU7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X29udV9vcGVyYXRpb25fcGFjayh0aGlzLT5vbnVfc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9TRVRfT05VX1NUQVRFX0lEX09OVV9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X29udV9vcGVyYXRpb25fdW5wYWNrKCZ0aGlzLT5vbnVfc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfU0VUX09OVV9TVEFURV9JRF9PTlVfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5vbnVfc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9PUEVSQVRJT05fSU5BQ1RJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfT1BFUkFUSU9OX0FDVElWRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9PUEVSQVRJT05fRElTQUJMRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9PUEVSQVRJT05fRU5BQkxFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX09QRVJBVElPTl9BQ1RJVkVfU1RBTkRCWToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9PUEVSQVRJT05fQVdBS0VfRlJFRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fT05VX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wYWNrZXRfdHlwZSA9IEJDTU9MVF9QQUNLRVRfVFlQRV9DUFU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9DQUxDX0NSQykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jYWxjX2NyYyA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfTlVNQkVSX09GX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bnVtYmVyX29mX3BhY2tldHMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfUEFDS0VUX1NJWkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cGFja2V0X3NpemUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmJ1ZmZlci5sZW4gPSAwOworICAgICAgICB0aGlzLT5idWZmZXIudmFsID0gTlVMTDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wYWNrZXRfdHlwZV9wYWNrKHRoaXMtPnBhY2tldF90eXBlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRTX0lEX0NBTENfQ1JDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+Y2FsY19jcmMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRTX0lEX05VTUJFUl9PRl9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPm51bWJlcl9vZl9wYWNrZXRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfU0laRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+cGFja2V0X3NpemUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRTX0lEX0JVRkZFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OF9wYWNrKCZ0aGlzLT5idWZmZXIsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9DQUxDX0NSQykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfTlVNQkVSX09GX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9TSVpFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5idWZmZXIpOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfUEFDS0VUX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcGFja2V0X3R5cGVfdW5wYWNrKCZ0aGlzLT5wYWNrZXRfdHlwZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9DQUxDX0NSQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmNhbGNfY3JjKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9OVU1CRVJfT0ZfUEFDS0VUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5udW1iZXJfb2ZfcGFja2V0cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfUEFDS0VUX1NJWkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnBhY2tldF9zaXplKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDhfdW5wYWNrKCZ0aGlzLT5idWZmZXIsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfQ0FMQ19DUkMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9OVU1CRVJfT0ZfUEFDS0VUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9TSVpFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4X3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+cGFja2V0X3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BBQ0tFVF9UWVBFX0NQVToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BBQ0tFVF9UWVBFX09NQ0k6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfVFlQRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRTX0lEX05VTUJFUl9PRl9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5udW1iZXJfb2ZfcGFja2V0cyA+IDMyKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfTlVNQkVSX09GX1BBQ0tFVFM7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9TSVpFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5wYWNrZXRfc2l6ZSA+IDIwMDApCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfU0laRTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5idWZmZXIubGVuID4gMjA0OCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDhfYm91bmRzX2NoZWNrKCZ0aGlzLT5idWZmZXIpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUExPQU1fUEFDS0VUX0lEX1BMT0FNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIG1lbXNldCh0aGlzLT5wbG9hbS5hcnIsIDAsIHNpemVvZih0aGlzLT5wbG9hbS5hcnIpKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX1BMT0FNX1BBQ0tFVF9JRF9QTE9BTSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfdThfMTJfcGFjaygmdGhpcy0+cGxvYW0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUExPQU1fUEFDS0VUX0lEX1BMT0FNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDEyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9QTE9BTV9QQUNLRVRfSURfUExPQU0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXJyX3U4XzEyX3VucGFjaygmdGhpcy0+cGxvYW0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9QTE9BTV9QQUNLRVRfSURfUExPQU0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfUExPQU1fUEFDS0VUX0lEX1BMT0FNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl91OF8xMl9ib3VuZHNfY2hlY2soJnRoaXMtPnBsb2FtKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fT05VX1BMT0FNX1BBQ0tFVF9JRF9QTE9BTTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBvcnRfaWQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9DUkNfT0spKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Y3JjX29rID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUX0lEX1BBQ0tFVF9TSVpFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBhY2tldF9zaXplID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRfSURfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmJ1ZmZlci5sZW4gPSAwOworICAgICAgICB0aGlzLT5idWZmZXIudmFsID0gTlVMTDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5wb3J0X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUX0lEX0NSQ19PSykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmNyY19vaykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9QQUNLRVRfU0laRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+cGFja2V0X3NpemUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRfSURfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTMyX3BhY2soJnRoaXMtPmJ1ZmZlciwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRfSURfUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9DUkNfT0spKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRfSURfUEFDS0VUX1NJWkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRfSURfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF91OF9saXN0X3UzMl9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+YnVmZmVyKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUX0lEX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnBvcnRfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRfSURfQ1JDX09LKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+Y3JjX29rKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUX0lEX1BBQ0tFVF9TSVpFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5wYWNrZXRfc2l6ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfdW5wYWNrKCZ0aGlzLT5idWZmZXIsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9DUkNfT0spKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUX0lEX1BBQ0tFVF9TSVpFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfYm91bmRzX2NoZWNrKCZ0aGlzLT5idWZmZXIpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9CVUZGRVI7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wb3J0X2lkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX09NQ0lfUEFDS0VUX0lEX0NSQ19PSykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jcmNfb2sgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX09NQ0lfUEFDS0VUX0lEX1BBQ0tFVF9TSVpFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBhY2tldF9zaXplID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX09NQ0lfUEFDS0VUX0lEX0JVRkZFUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5idWZmZXIubGVuID0gMDsKKyAgICAgICAgdGhpcy0+YnVmZmVyLnZhbCA9IE5VTEw7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+cG9ydF9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfQ1JDX09LKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+Y3JjX29rKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9QQUNLRVRfU0laRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+cGFja2V0X3NpemUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX09NQ0lfUEFDS0VUX0lEX0JVRkZFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF91OF9saXN0X3UzMl9wYWNrKCZ0aGlzLT5idWZmZXIsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX09NQ0lfUEFDS0VUX0lEX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX09NQ0lfUEFDS0VUX0lEX0NSQ19PSykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfUEFDS0VUX1NJWkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX09NQ0lfUEFDS0VUX0lEX0JVRkZFUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSBiY21vbHRfdThfbGlzdF91MzJfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmJ1ZmZlcik7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5wb3J0X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9DUkNfT0spKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5jcmNfb2spKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX09NQ0lfUEFDS0VUX0lEX1BBQ0tFVF9TSVpFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5wYWNrZXRfc2l6ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTMyX3VucGFjaygmdGhpcy0+YnVmZmVyLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfQ1JDX09LKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfUEFDS0VUX1NJWkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTMyX2JvdW5kc19jaGVjaygmdGhpcy0+YnVmZmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fT05VX09NQ0lfUEFDS0VUX0lEX0JVRkZFUjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl90cnhfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX3RyeF9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl90cnhfa2V5X3BhY2soY29uc3QgYmNtb2x0X2dwb25fdHJ4X2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMtPnBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2dwb25fdHJ4X2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl90cnhfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl90cnhfa2V5X3VucGFjayhiY21vbHRfZ3Bvbl90cnhfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICh1aW50OF90ICopICZ0aGlzLT5wb25fbmkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fdHJ4X2tleV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl90cnhfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl90cnhfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fdHJ4X2tleV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5wb25fbmkgPiAoYmNtb2x0X2dwb25fbmkpIDE1KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9UUlhfS0VZX0lEX1BPTl9OSTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9UUkFOU0NFSVZFUl9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnRyYW5zY2VpdmVyX3R5cGUgPSBCQ01PTFRfVFJYX1RZUEVfTFRFXzM2ODBfTTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmxhX2NvbmZpZ3VyYXRpb24ucmVzeW5jX2NvbnRyb2wuc3RhcnRfcGF0dGVybiA9IDE1OworICAgICAgICB0aGlzLT5sYV9jb25maWd1cmF0aW9uLnJlc3luY19jb250cm9sLm1pZGRsZV9wYXR0ZXJuID0gMTU7CisgICAgICAgIHRoaXMtPmxhX2NvbmZpZ3VyYXRpb24ucmVzeW5jX2NvbnRyb2wubGFzdF9wYXR0ZXJuID0gMTU7CisgICAgICAgIHRoaXMtPmxhX2NvbmZpZ3VyYXRpb24ucmVzeW5jX2NvbnRyb2wubWlkZGxlX3JlcGV0aXRpb24gPSAwOworICAgICAgICB0aGlzLT5sYV9jb25maWd1cmF0aW9uLnJlc3luY19jb250cm9sLmxvY2F0aW9uID0gNDA7CisgICAgICAgIHRoaXMtPmxhX2NvbmZpZ3VyYXRpb24ucmFuZ2luZ19yZXN5bmNfY29udHJvbC5zdGFydF9wYXR0ZXJuID0gMTU7CisgICAgICAgIHRoaXMtPmxhX2NvbmZpZ3VyYXRpb24ucmFuZ2luZ19yZXN5bmNfY29udHJvbC5taWRkbGVfcGF0dGVybiA9IDE1OworICAgICAgICB0aGlzLT5sYV9jb25maWd1cmF0aW9uLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubGFzdF9wYXR0ZXJuID0gMTU7CisgICAgICAgIHRoaXMtPmxhX2NvbmZpZ3VyYXRpb24ucmFuZ2luZ19yZXN5bmNfY29udHJvbC5taWRkbGVfcmVwZXRpdGlvbiA9IDA7CisgICAgICAgIHRoaXMtPmxhX2NvbmZpZ3VyYXRpb24ucmFuZ2luZ19yZXN5bmNfY29udHJvbC5sb2NhdGlvbiA9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5iY2RyLnJlc3luY19jb250cm9sLnN0YXJ0X3BhdHRlcm4gPSAxNTsKKyAgICAgICAgdGhpcy0+YmNkci5yZXN5bmNfY29udHJvbC5taWRkbGVfcGF0dGVybiA9IDA7CisgICAgICAgIHRoaXMtPmJjZHIucmVzeW5jX2NvbnRyb2wubGFzdF9wYXR0ZXJuID0gMDsKKyAgICAgICAgdGhpcy0+YmNkci5yZXN5bmNfY29udHJvbC5taWRkbGVfcmVwZXRpdGlvbiA9IDA7CisgICAgICAgIHRoaXMtPmJjZHIucmVzeW5jX2NvbnRyb2wubG9jYXRpb24gPSAzNDsKKyAgICAgICAgdGhpcy0+YmNkci5yYW5naW5nX3Jlc3luY19jb250cm9sLnN0YXJ0X3BhdHRlcm4gPSAxNTsKKyAgICAgICAgdGhpcy0+YmNkci5yYW5naW5nX3Jlc3luY19jb250cm9sLm1pZGRsZV9wYXR0ZXJuID0gMDsKKyAgICAgICAgdGhpcy0+YmNkci5yYW5naW5nX3Jlc3luY19jb250cm9sLmxhc3RfcGF0dGVybiA9IDA7CisgICAgICAgIHRoaXMtPmJjZHIucmFuZ2luZ19yZXN5bmNfY29udHJvbC5taWRkbGVfcmVwZXRpdGlvbiA9IDA7CisgICAgICAgIHRoaXMtPmJjZHIucmFuZ2luZ19yZXN5bmNfY29udHJvbC5sb2NhdGlvbiA9IDc7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfUkFOR0lOR19BRlRFUl9OT19FRF9SRVNZTkMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMuc3RhcnRfcGF0dGVybiA9IDA7CisgICAgICAgIHRoaXMtPmxhX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLm1pZGRsZV9wYXR0ZXJuID0gMDsKKyAgICAgICAgdGhpcy0+bGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMubGFzdF9wYXR0ZXJuID0gMDsKKyAgICAgICAgdGhpcy0+bGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMubWlkZGxlX3JlcGV0aXRpb24gPSAwOworICAgICAgICB0aGlzLT5sYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5sb2NhdGlvbiA9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUl9SQU5HSU5HX0FGVEVSX05PX0VEX1JFU1lOQykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5iY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLnN0YXJ0X3BhdHRlcm4gPSAwOworICAgICAgICB0aGlzLT5iY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLm1pZGRsZV9wYXR0ZXJuID0gMDsKKyAgICAgICAgdGhpcy0+YmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5sYXN0X3BhdHRlcm4gPSAwOworICAgICAgICB0aGlzLT5iY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLm1pZGRsZV9yZXBldGl0aW9uID0gMDsKKyAgICAgICAgdGhpcy0+YmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5sb2NhdGlvbiA9IDc7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfUkFOR0lOR19BRlRFUl9FRF9SRVNZTkMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMuc3RhcnRfcGF0dGVybiA9IDA7CisgICAgICAgIHRoaXMtPmxhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLm1pZGRsZV9wYXR0ZXJuID0gMDsKKyAgICAgICAgdGhpcy0+bGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMubGFzdF9wYXR0ZXJuID0gMDsKKyAgICAgICAgdGhpcy0+bGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMubWlkZGxlX3JlcGV0aXRpb24gPSAwOworICAgICAgICB0aGlzLT5sYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYy5sb2NhdGlvbiA9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUl9SQU5HSU5HX0FGVEVSX0VEX1JFU1lOQykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5iY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLnN0YXJ0X3BhdHRlcm4gPSAxNTsKKyAgICAgICAgdGhpcy0+YmNkcl9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYy5taWRkbGVfcGF0dGVybiA9IDA7CisgICAgICAgIHRoaXMtPmJjZHJfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMubGFzdF9wYXR0ZXJuID0gMDsKKyAgICAgICAgdGhpcy0+YmNkcl9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYy5taWRkbGVfcmVwZXRpdGlvbiA9IDA7CisgICAgICAgIHRoaXMtPmJjZHJfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMubG9jYXRpb24gPSA3OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX1JFU1lOQ19QT0xBUklUWSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5sYV9yZXN5bmNfcG9sYXJpdHkgPSBCQ01PTFRfUE9MQVJJVFlfTE9XOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0JDRFJfUkVTWU5DX1BPTEFSSVRZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmJjZHJfcmVzeW5jX3BvbGFyaXR5ID0gQkNNT0xUX1BPTEFSSVRZX0xPVzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9CQ0RSX1JBTkdJTkdfUkVTWU5DX0NPTkRJVElPTlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YmNkcl9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX2luaXQgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgdGhpcy0+YmNkcl9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX25vX2VkID0gQkNNT1NfRkFMU0U7CisgICAgICAgIHRoaXMtPmJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5hZnRlcl9lZCA9IEJDTU9TX1RSVUU7CisgICAgICAgIHRoaXMtPmJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5hZnRlcl9ub19kZWwgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgdGhpcy0+YmNkcl9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX3JhbmdpbmdfYWNjZXNzID0gQkNNT1NfRkFMU0U7CisgICAgICAgIHRoaXMtPmJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5tZWRfdmFsID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9SQU5HSU5HX1JFU1lOQ19DT05ESVRJT05TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfaW5pdCA9IEJDTU9TX1RSVUU7CisgICAgICAgIHRoaXMtPmxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfbm9fZWQgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgdGhpcy0+bGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5hZnRlcl9lZCA9IEJDTU9TX0ZBTFNFOworICAgICAgICB0aGlzLT5sYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX25vX2RlbCA9IEJDTU9TX0ZBTFNFOworICAgICAgICB0aGlzLT5sYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX3JhbmdpbmdfYWNjZXNzID0gQkNNT1NfVFJVRTsKKyAgICAgICAgdGhpcy0+bGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5tZWRfdmFsID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9SWF9DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2NvbmZpZ3VyYXRpb24ud2FpdF93aW5kb3dfc2l6ZSA9IDA7CisgICAgICAgIHRoaXMtPnJ4X2NvbmZpZ3VyYXRpb24ucmFuZ2luZ19hY2Nlc3Nfd2luZG93X3NpemUgPSAxNTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9SQU5HSU5HX0NPTlRST0xfU1RBR0VTX0NPTkZJR1VSQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmFuZ2luZ19jb250cm9sX3N0YWdlc19jb25maWd1cmF0aW9uLndhaXRfc3RhdGVfMV93aW5kb3dfc2l6ZSA9IDA7CisgICAgICAgIHRoaXMtPnJhbmdpbmdfY29udHJvbF9zdGFnZXNfY29uZmlndXJhdGlvbi53YWl0X3N0YXRlXzJfd2luZG93X3NpemUgPSAwOworICAgICAgICB0aGlzLT5yYW5naW5nX2NvbnRyb2xfc3RhZ2VzX2NvbmZpZ3VyYXRpb24ud2FpdF9hZnRlcl9yZXN5bmNfNCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0VORVJHWV9ERVRFQ1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZW5lcmd5X2RldGVjdC5yYW5naW5nX2VkX3NvdXJjZSA9IEJDTU9MVF9FTkVSR1lfREVURUNUX1NPVVJDRV9UUlg7CisgICAgICAgIHRoaXMtPmVuZXJneV9kZXRlY3QuZGVsaW1pdGVyX2VkX3NvdXJjZSA9IEJDTU9MVF9FTkVSR1lfREVURUNUX1NPVVJDRV9UUlg7CisgICAgICAgIHRoaXMtPmVuZXJneV9kZXRlY3QubWluaW11bV90aHJlc2hvbGQgPSAwOworICAgICAgICB0aGlzLT5lbmVyZ3lfZGV0ZWN0Lm1heGltdW1fdGhyZXNob2xkID0gNDE7CisgICAgICAgIHRoaXMtPmVuZXJneV9kZXRlY3QuZWRfcGF0dGVybiA9IDE3MDsKKyAgICAgICAgdGhpcy0+ZW5lcmd5X2RldGVjdC5lZF9wYXR0ZXJuX3NpemUgPSAwOworICAgICAgICB0aGlzLT5lbmVyZ3lfZGV0ZWN0LndpbmRvd19zaXplID0gMTI0OworICAgICAgICB0aGlzLT5lbmVyZ3lfZGV0ZWN0LmludmVyc2lvbiA9IEJDTU9TX0ZBTFNFOworICAgICAgICB0aGlzLT5lbmVyZ3lfZGV0ZWN0Lm5vX2VkX3RocmVzaG9sZCA9IDEyNzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9FTkRfT0ZfQlVSU1RfREFUQV9QQVRURVJOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmVuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4uc3RhcnRfcGF0dGVybiA9IDE1OworICAgICAgICB0aGlzLT5lbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuLm1pZGRsZV9wYXR0ZXJuID0gMTU7CisgICAgICAgIHRoaXMtPmVuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4ubGFzdF9wYXR0ZXJuID0gMTU7CisgICAgICAgIHRoaXMtPmVuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4ubWlkZGxlX3JlcGV0aXRpb24gPSAwOworICAgICAgICB0aGlzLT5lbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuLmxvY2F0aW9uID0gMTE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfRU5EX09GX0JVUlNUX1JBTkdJTkdfUEFUVEVSTikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5lbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuLnN0YXJ0X3BhdHRlcm4gPSAwOworICAgICAgICB0aGlzLT5lbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuLm1pZGRsZV9wYXR0ZXJuID0gMDsKKyAgICAgICAgdGhpcy0+ZW5kX29mX2J1cnN0X3JhbmdpbmdfcGF0dGVybi5sYXN0X3BhdHRlcm4gPSAwOworICAgICAgICB0aGlzLT5lbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuLm1pZGRsZV9yZXBldGl0aW9uID0gMDsKKyAgICAgICAgdGhpcy0+ZW5kX29mX2J1cnN0X3JhbmdpbmdfcGF0dGVybi5sb2NhdGlvbiA9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUFJFQU1CTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cHJlYW1ibGUudHlwZV8xX3NpemUgPSAwOworICAgICAgICB0aGlzLT5wcmVhbWJsZS50eXBlXzJfc2l6ZSA9IDA7CisgICAgICAgIHRoaXMtPnByZWFtYmxlLnR5cGVfM19wcmVfcmFuZ2luZ19zaXplID0gNTA7CisgICAgICAgIHRoaXMtPnByZWFtYmxlLnR5cGVfM19wb3N0X3Jhbmdpbmdfc2l6ZSA9IDE1OworICAgICAgICB0aGlzLT5wcmVhbWJsZS50eXBlXzNfcGF0dGVybiA9IDE3MDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9ERUxJTUlURVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZGVsaW1pdGVyLnBhdHRlcm5bMF0gPSAxNzE7CisgICAgICAgIHRoaXMtPmRlbGltaXRlci5wYXR0ZXJuWzFdID0gODk7CisgICAgICAgIHRoaXMtPmRlbGltaXRlci5wYXR0ZXJuWzJdID0gMTMxOworICAgICAgICB0aGlzLT5kZWxpbWl0ZXIuc2l6ZSA9IDM7CisgICAgICAgIHRoaXMtPmRlbGltaXRlci53aW5kb3dfc2l6ZSA9IDEyNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9HVUFSRF9CSVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmd1YXJkX2JpdHMgPSA2NDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9TRVJERVNfQ09ORklHVVJBVElPTikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zZXJkZXNfY29uZmlndXJhdGlvbi5yYW5naW5nX21vZGUgPSBCQ01PTFRfU0VSREVTX1JBTkdJTkdfTU9ERV9CQ0RSX1JFU0VUX01PREU7CisgICAgICAgIHRoaXMtPnNlcmRlc19jb25maWd1cmF0aW9uLm11bHRpX2VkX21vZGUgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgdGhpcy0+c2VyZGVzX2NvbmZpZ3VyYXRpb24uYnVyc3RfZW5hYmxlX3N0YXJ0X29mZnNldCA9IDA7CisgICAgICAgIHRoaXMtPnNlcmRlc19jb25maWd1cmF0aW9uLmJ1cnN0X2VuYWJsZV9lbmRfb2Zmc2V0ID0gMDsKKyAgICAgICAgdGhpcy0+c2VyZGVzX2NvbmZpZ3VyYXRpb24uZWRfaW52ZXJ0aW9uID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUExPX1JBTkdJTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cGxvX3JhbmdpbmcgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1BMT19EQVRBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBsb19kYXRhID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9SU1NJX05PUk1BTF9DT05GSUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnNzaV9ub3JtYWxfY29uZmlnLmxvY2F0aW9uID0gMjA7CisgICAgICAgIHRoaXMtPnJzc2lfbm9ybWFsX2NvbmZpZy5sb2NhdGlvbl9zaWduID0gQkNNT0xUX1JTU0lfTE9DQVRJT05fU0lHTl9CRUZPUkU7CisgICAgICAgIHRoaXMtPnJzc2lfbm9ybWFsX2NvbmZpZy5zdGFydF9wYXR0ZXJuID0gMTU7CisgICAgICAgIHRoaXMtPnJzc2lfbm9ybWFsX2NvbmZpZy5taWRkbGVfcGF0dGVybiA9IDE1OworICAgICAgICB0aGlzLT5yc3NpX25vcm1hbF9jb25maWcubGFzdF9wYXR0ZXJuID0gMTU7CisgICAgICAgIHRoaXMtPnJzc2lfbm9ybWFsX2NvbmZpZy5taWRkbGVfcmVwZXJ0aXRpb24gPSA1MDsKKyAgICAgICAgdGhpcy0+cnNzaV9ub3JtYWxfY29uZmlnLm1pbmltdW1fYnVyc3QgPSA1NTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9SQU5HSU5HX1JTU0lfUkVTWU5DX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmFuZ2luZ19yc3NpX3Jlc3luY19jb250cm9sLmFmdGVyX25vX2VkID0gQkNNT1NfRkFMU0U7CisgICAgICAgIHRoaXMtPnJhbmdpbmdfcnNzaV9yZXN5bmNfY29udHJvbC5hZnRlcl9lZCA9IEJDTU9TX0ZBTFNFOworICAgICAgICB0aGlzLT5yYW5naW5nX3Jzc2lfcmVzeW5jX2NvbnRyb2wuYWZ0ZXJfcmVzZXRfMyA9IEJDTU9TX0ZBTFNFOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1RSQU5TQ0VJVkVSX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdHJ4X3R5cGVfcGFjayh0aGlzLT50cmFuc2NlaXZlcl90eXBlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2xhX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb25fcGFjaygmdGhpcy0+bGFfY29uZmlndXJhdGlvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9iY2RyX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb25fcGFjaygmdGhpcy0+YmNkciwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfUkFOR0lOR19BRlRFUl9OT19FRF9SRVNZTkMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzeW5jX2NvbnRyb2xfcGFjaygmdGhpcy0+bGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0JDRFJfUkFOR0lOR19BRlRFUl9OT19FRF9SRVNZTkMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzeW5jX2NvbnRyb2xfcGFjaygmdGhpcy0+YmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfUkFOR0lOR19BRlRFUl9FRF9SRVNZTkMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzeW5jX2NvbnRyb2xfcGFjaygmdGhpcy0+bGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0JDRFJfUkFOR0lOR19BRlRFUl9FRF9SRVNZTkMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzeW5jX2NvbnRyb2xfcGFjaygmdGhpcy0+YmNkcl9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfUkVTWU5DX1BPTEFSSVRZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3BvbGFyaXR5X3BhY2sodGhpcy0+bGFfcmVzeW5jX3BvbGFyaXR5LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9CQ0RSX1JFU1lOQ19QT0xBUklUWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb2xhcml0eV9wYWNrKHRoaXMtPmJjZHJfcmVzeW5jX3BvbGFyaXR5LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9CQ0RSX1JBTkdJTkdfUkVTWU5DX0NPTkRJVElPTlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9uc19wYWNrKCZ0aGlzLT5iY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX1JBTkdJTkdfUkVTWU5DX0NPTkRJVElPTlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9uc19wYWNrKCZ0aGlzLT5sYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9SWF9DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3RyeF9yeF9jb25maWd1cmF0aW9uX3BhY2soJnRoaXMtPnJ4X2NvbmZpZ3VyYXRpb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1JBTkdJTkdfQ09OVFJPTF9TVEFHRVNfQ09ORklHVVJBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yYW5naW5nX2NvbnRyb2xfY29uZmlndXJhdGlvbl9wYWNrKCZ0aGlzLT5yYW5naW5nX2NvbnRyb2xfc3RhZ2VzX2NvbmZpZ3VyYXRpb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0VORVJHWV9ERVRFQ1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdHJ4X2VuZXJneV9kZXRlY3RfcGFjaygmdGhpcy0+ZW5lcmd5X2RldGVjdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfRU5EX09GX0JVUlNUX0RBVEFfUEFUVEVSTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN5bmNfY29udHJvbF9wYWNrKCZ0aGlzLT5lbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9FTkRfT0ZfQlVSU1RfUkFOR0lOR19QQVRURVJOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3luY19jb250cm9sX3BhY2soJnRoaXMtPmVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1BSRUFNQkxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3RyeF9wcmVhbWJsZV9wYWNrKCZ0aGlzLT5wcmVhbWJsZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfREVMSU1JVEVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3RyeF9kZWxpbWl0ZXJfcGFjaygmdGhpcy0+ZGVsaW1pdGVyLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9HVUFSRF9CSVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5ndWFyZF9iaXRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfU0VSREVTX0NPTkZJR1VSQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc2VyZGVzX2NvbmZpZ3VyYXRpb25fcGFjaygmdGhpcy0+c2VyZGVzX2NvbmZpZ3VyYXRpb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1BMT19SQU5HSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5wbG9fcmFuZ2luZykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1BMT19EQVRBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5wbG9fZGF0YSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1JTU0lfTk9STUFMX0NPTkZJRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX3Jzc2lfZ2VuZXJhbF9jb25maWd1cmF0aW9uX3BhY2soJnRoaXMtPnJzc2lfbm9ybWFsX2NvbmZpZywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUkFOR0lOR19SU1NJX1JFU1lOQ19DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3JhbmdpbmdfcnNzaV9jb250cm9sX3BhY2soJnRoaXMtPnJhbmdpbmdfcnNzaV9yZXN5bmNfY29udHJvbCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfVFJBTlNDRUlWRVJfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX0NPTkZJR1VSQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9SQU5HSU5HX0FGVEVSX05PX0VEX1JFU1lOQykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA1OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0JDRFJfUkFOR0lOR19BRlRFUl9OT19FRF9SRVNZTkMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9SQU5HSU5HX0FGVEVSX0VEX1JFU1lOQykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA1OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0JDRFJfUkFOR0lOR19BRlRFUl9FRF9SRVNZTkMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9SRVNZTkNfUE9MQVJJVFkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9CQ0RSX1JFU1lOQ19QT0xBUklUWSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0JDRFJfUkFOR0lOR19SRVNZTkNfQ09ORElUSU9OUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA3OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX1JBTkdJTkdfUkVTWU5DX0NPTkRJVElPTlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9SWF9DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUkFOR0lOR19DT05UUk9MX1NUQUdFU19DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDM7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfRU5FUkdZX0RFVEVDVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA5OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0VORF9PRl9CVVJTVF9EQVRBX1BBVFRFUk4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9FTkRfT0ZfQlVSU1RfUkFOR0lOR19QQVRURVJOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUFJFQU1CTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9ERUxJTUlURVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9HVUFSRF9CSVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfU0VSREVTX0NPTkZJR1VSQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9QTE9fUkFOR0lORykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1BMT19EQVRBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUlNTSV9OT1JNQUxfQ09ORklHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUkFOR0lOR19SU1NJX1JFU1lOQ19DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDM7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9UUkFOU0NFSVZFUl9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3RyeF90eXBlX3VucGFjaygmdGhpcy0+dHJhbnNjZWl2ZXJfdHlwZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfQ09ORklHVVJBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9sYV9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uX3VucGFjaygmdGhpcy0+bGFfY29uZmlndXJhdGlvbiwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9CQ0RSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2JjZHJfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbl91bnBhY2soJnRoaXMtPmJjZHIsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfUkFOR0lOR19BRlRFUl9OT19FRF9SRVNZTkMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzeW5jX2NvbnRyb2xfdW5wYWNrKCZ0aGlzLT5sYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9CQ0RSX1JBTkdJTkdfQUZURVJfTk9fRURfUkVTWU5DKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3luY19jb250cm9sX3VucGFjaygmdGhpcy0+YmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9SQU5HSU5HX0FGVEVSX0VEX1JFU1lOQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN5bmNfY29udHJvbF91bnBhY2soJnRoaXMtPmxhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0JDRFJfUkFOR0lOR19BRlRFUl9FRF9SRVNZTkMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzeW5jX2NvbnRyb2xfdW5wYWNrKCZ0aGlzLT5iY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX1JFU1lOQ19QT0xBUklUWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb2xhcml0eV91bnBhY2soJnRoaXMtPmxhX3Jlc3luY19wb2xhcml0eSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUl9SRVNZTkNfUE9MQVJJVFkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcG9sYXJpdHlfdW5wYWNrKCZ0aGlzLT5iY2RyX3Jlc3luY19wb2xhcml0eSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUl9SQU5HSU5HX1JFU1lOQ19DT05ESVRJT05TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnNfdW5wYWNrKCZ0aGlzLT5iY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfUkFOR0lOR19SRVNZTkNfQ09ORElUSU9OUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zX3VucGFjaygmdGhpcy0+bGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9SWF9DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3RyeF9yeF9jb25maWd1cmF0aW9uX3VucGFjaygmdGhpcy0+cnhfY29uZmlndXJhdGlvbiwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9SQU5HSU5HX0NPTlRST0xfU1RBR0VTX0NPTkZJR1VSQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmFuZ2luZ19jb250cm9sX2NvbmZpZ3VyYXRpb25fdW5wYWNrKCZ0aGlzLT5yYW5naW5nX2NvbnRyb2xfc3RhZ2VzX2NvbmZpZ3VyYXRpb24sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfRU5FUkdZX0RFVEVDVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF90cnhfZW5lcmd5X2RldGVjdF91bnBhY2soJnRoaXMtPmVuZXJneV9kZXRlY3QsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfRU5EX09GX0JVUlNUX0RBVEFfUEFUVEVSTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN5bmNfY29udHJvbF91bnBhY2soJnRoaXMtPmVuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfRU5EX09GX0JVUlNUX1JBTkdJTkdfUEFUVEVSTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN5bmNfY29udHJvbF91bnBhY2soJnRoaXMtPmVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUFJFQU1CTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdHJ4X3ByZWFtYmxlX3VucGFjaygmdGhpcy0+cHJlYW1ibGUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfREVMSU1JVEVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3RyeF9kZWxpbWl0ZXJfdW5wYWNrKCZ0aGlzLT5kZWxpbWl0ZXIsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfR1VBUkRfQklUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+Z3VhcmRfYml0cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1NFUkRFU19DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uX3VucGFjaygmdGhpcy0+c2VyZGVzX2NvbmZpZ3VyYXRpb24sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUExPX1JBTkdJTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnBsb19yYW5naW5nKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUExPX0RBVEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnBsb19kYXRhKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUlNTSV9OT1JNQUxfQ09ORklHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb25fdW5wYWNrKCZ0aGlzLT5yc3NpX25vcm1hbF9jb25maWcsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUkFOR0lOR19SU1NJX1JFU1lOQ19DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3JhbmdpbmdfcnNzaV9jb250cm9sX3VucGFjaygmdGhpcy0+cmFuZ2luZ19yc3NpX3Jlc3luY19jb250cm9sLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1RSQU5TQ0VJVkVSX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfQ09ORklHVVJBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEwKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEwKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfUkFOR0lOR19BRlRFUl9OT19FRF9SRVNZTkMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUl9SQU5HSU5HX0FGVEVSX05PX0VEX1JFU1lOQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9SQU5HSU5HX0FGVEVSX0VEX1JFU1lOQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9CQ0RSX1JBTkdJTkdfQUZURVJfRURfUkVTWU5DKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX1JFU1lOQ19QT0xBUklUWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9CQ0RSX1JFU1lOQ19QT0xBUklUWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9CQ0RSX1JBTkdJTkdfUkVTWU5DX0NPTkRJVElPTlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA3KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfUkFOR0lOR19SRVNZTkNfQ09ORElUSU9OUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9SWF9DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1JBTkdJTkdfQ09OVFJPTF9TVEFHRVNfQ09ORklHVVJBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9FTkVSR1lfREVURUNUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0VORF9PRl9CVVJTVF9EQVRBX1BBVFRFUk4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfRU5EX09GX0JVUlNUX1JBTkdJTkdfUEFUVEVSTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9QUkVBTUJMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9ERUxJTUlURVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfR1VBUkRfQklUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9TRVJERVNfQ09ORklHVVJBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9QTE9fUkFOR0lORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9QTE9fREFUQSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9SU1NJX05PUk1BTF9DT05GSUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUkFOR0lOR19SU1NJX1JFU1lOQ19DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX3RyeF9jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1RSQU5TQ0VJVkVSX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT50cmFuc2NlaXZlcl90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfVFlQRV9TUFNfNDNfNDhfSF9IUF9DREVfU0RfMjAxMzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1RSWF9UWVBFX1NPR180MzIxX1BTR0I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfVFlQRV9MVEVfMzY4MF9NOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfVFJYX1RZUEVfU09VUkNFX1BIT1RPTklDUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1RSWF9UWVBFX0xURV8zNjgwX1BfVFlQRV9DX1BMVVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfVFlQRV9BTlk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfVFlQRV9BTllfUkVTRVRfR1VBUkQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfVFlQRV9BTllfUkVTRVRfUFJFQU1CTEU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfVFlQRV9XVERfUlRYTV8xNjdfNTI2X0NQTFVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfVFJYX1RZUEVfV1REX1JUWE1fMTY3XzUyMl9CUExVUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1RSWF9UWVBFX0xURV8zNjgwX1BfQkM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfVFlQRV9TT0dRXzQzMjFfUFNHQl9DX1BMVVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfVFlQRV9XVERfUlRYTTE2N181MjE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfVFlQRV9MVEUzNjc4OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfVFJYX1RZUEVfU09HUF80MzIxX1BTR0E6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfVFlQRV9HUE9OX0dFTkVSQUxfMToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1RSWF9UWVBFX0dQT05fR0VORVJBTF8yOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfVFJYX1RZUEVfR1BPTl9HRU5FUkFMXzM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfVFlQRV9HUE9OX0dFTkVSQUxfNDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1RSWF9UWVBFX0dQT05fR0VORVJBTF81OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfVFJYX1RZUEVfR1BPTl9HRU5FUkFMXzY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfVFlQRV9HUE9OX0dFTkVSQUxfNzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1RSWF9UWVBFX0dQT05fR0VORVJBTF84OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfVFJYX1RZUEVfR1BPTl9HRU5FUkFMXzk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfVFlQRV9HUE9OX0dFTkVSQUxfMTA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfVFlQRV9HUE9OX0dFTkVSQUxfMTE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfVFJBTlNDRUlWRVJfVFlQRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2xhX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb25fYm91bmRzX2NoZWNrKCZ0aGlzLT5sYV9jb25maWd1cmF0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9DT05GSUdVUkFUSU9OOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9iY2RyX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb25fYm91bmRzX2NoZWNrKCZ0aGlzLT5iY2RyKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9CQ0RSOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfUkFOR0lOR19BRlRFUl9OT19FRF9SRVNZTkMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzeW5jX2NvbnRyb2xfYm91bmRzX2NoZWNrKCZ0aGlzLT5sYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfUkFOR0lOR19BRlRFUl9OT19FRF9SRVNZTkM7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9CQ0RSX1JBTkdJTkdfQUZURVJfTk9fRURfUkVTWU5DKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3luY19jb250cm9sX2JvdW5kc19jaGVjaygmdGhpcy0+YmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUl9SQU5HSU5HX0FGVEVSX05PX0VEX1JFU1lOQzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX1JBTkdJTkdfQUZURVJfRURfUkVTWU5DKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3luY19jb250cm9sX2JvdW5kc19jaGVjaygmdGhpcy0+bGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX1JBTkdJTkdfQUZURVJfRURfUkVTWU5DOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUl9SQU5HSU5HX0FGVEVSX0VEX1JFU1lOQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN5bmNfY29udHJvbF9ib3VuZHNfY2hlY2soJnRoaXMtPmJjZHJfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0JDRFJfUkFOR0lOR19BRlRFUl9FRF9SRVNZTkM7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9SRVNZTkNfUE9MQVJJVFkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5sYV9yZXN5bmNfcG9sYXJpdHkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BPTEFSSVRZX0xPVzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BPTEFSSVRZX0hJR0g6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfUkVTWU5DX1BPTEFSSVRZOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0JDRFJfUkVTWU5DX1BPTEFSSVRZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+YmNkcl9yZXN5bmNfcG9sYXJpdHkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BPTEFSSVRZX0xPVzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BPTEFSSVRZX0hJR0g6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUl9SRVNZTkNfUE9MQVJJVFk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUl9SQU5HSU5HX1JFU1lOQ19DT05ESVRJT05TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnNfYm91bmRzX2NoZWNrKCZ0aGlzLT5iY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0JDRFJfUkFOR0lOR19SRVNZTkNfQ09ORElUSU9OUzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX1JBTkdJTkdfUkVTWU5DX0NPTkRJVElPTlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9uc19ib3VuZHNfY2hlY2soJnRoaXMtPmxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX1JBTkdJTkdfUkVTWU5DX0NPTkRJVElPTlM7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9SWF9DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3RyeF9yeF9jb25maWd1cmF0aW9uX2JvdW5kc19jaGVjaygmdGhpcy0+cnhfY29uZmlndXJhdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUlhfQ09ORklHVVJBVElPTjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1JBTkdJTkdfQ09OVFJPTF9TVEFHRVNfQ09ORklHVVJBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yYW5naW5nX2NvbnRyb2xfY29uZmlndXJhdGlvbl9ib3VuZHNfY2hlY2soJnRoaXMtPnJhbmdpbmdfY29udHJvbF9zdGFnZXNfY29uZmlndXJhdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUkFOR0lOR19DT05UUk9MX1NUQUdFU19DT05GSUdVUkFUSU9OOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfRU5FUkdZX0RFVEVDVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF90cnhfZW5lcmd5X2RldGVjdF9ib3VuZHNfY2hlY2soJnRoaXMtPmVuZXJneV9kZXRlY3QpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0VORVJHWV9ERVRFQ1Q7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9FTkRfT0ZfQlVSU1RfREFUQV9QQVRURVJOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3luY19jb250cm9sX2JvdW5kc19jaGVjaygmdGhpcy0+ZW5kX29mX2J1cnN0X2RhdGFfcGF0dGVybikpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfRU5EX09GX0JVUlNUX0RBVEFfUEFUVEVSTjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0VORF9PRl9CVVJTVF9SQU5HSU5HX1BBVFRFUk4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzeW5jX2NvbnRyb2xfYm91bmRzX2NoZWNrKCZ0aGlzLT5lbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9FTkRfT0ZfQlVSU1RfUkFOR0lOR19QQVRURVJOOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUFJFQU1CTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdHJ4X3ByZWFtYmxlX2JvdW5kc19jaGVjaygmdGhpcy0+cHJlYW1ibGUpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1BSRUFNQkxFOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfREVMSU1JVEVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3RyeF9kZWxpbWl0ZXJfYm91bmRzX2NoZWNrKCZ0aGlzLT5kZWxpbWl0ZXIpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0RFTElNSVRFUjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1NFUkRFU19DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uX2JvdW5kc19jaGVjaygmdGhpcy0+c2VyZGVzX2NvbmZpZ3VyYXRpb24pKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1NFUkRFU19DT05GSUdVUkFUSU9OOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUlNTSV9OT1JNQUxfQ09ORklHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb25fYm91bmRzX2NoZWNrKCZ0aGlzLT5yc3NpX25vcm1hbF9jb25maWcpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1JTU0lfTk9STUFMX0NPTkZJRzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1JBTkdJTkdfUlNTSV9SRVNZTkNfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yYW5naW5nX3Jzc2lfY29udHJvbF9ib3VuZHNfY2hlY2soJnRoaXMtPnJhbmdpbmdfcnNzaV9yZXN5bmNfY29udHJvbCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUkFOR0lOR19SU1NJX1JFU1lOQ19DT05UUk9MOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9sb2dfZW50cnlfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF9sb2dfZW50cnlfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9LRVlfSURfTE9HX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmxvZ19pZCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfS0VZX0lEX1JFU0VSVkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJlc2VydmVkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9LRVlfSURfTkFNRSkpICE9IDApCisgICAgeworICAgICAgICBtZW1zZXQodGhpcy0+bmFtZS5zdHIsIDAsIDEwMCk7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X2tleV9wYWNrKGNvbnN0IGJjbW9sdF9sb2dfZW50cnlfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9MT0dfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmxvZ19pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9SRVNFUlZFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5yZXNlcnZlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9OQU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0cl8xMDBfcGFjaygmdGhpcy0+bmFtZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfbG9nX2VudHJ5X2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfbG9nX2VudHJ5X2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9MT0dfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9LRVlfSURfUkVTRVJWRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9LRVlfSURfTkFNRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxMDA7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X2tleV91bnBhY2soYmNtb2x0X2xvZ19lbnRyeV9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfS0VZX0lEX0xPR19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+bG9nX2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfS0VZX0lEX1JFU0VSVkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnJlc2VydmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfS0VZX0lEX05BTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RyXzEwMF91bnBhY2soJnRoaXMtPm5hbWUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9LRVlfSURfTE9HX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9SRVNFUlZFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9LRVlfSURfTkFNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEwMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2xvZ19lbnRyeV9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfbG9nX2VudHJ5X2tleV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfS0VZX0lEX05BTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RyXzEwMF9ib3VuZHNfY2hlY2soJnRoaXMtPm5hbWUpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9OQU1FOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2xvZ19lbnRyeV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0RFRkFVTFRfTE9HX0xFVkVMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRlZmF1bHRfbG9nX2xldmVsID0gQkNNT0xUX0xPR19MRVZFTF9OT19MT0c7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0RFRkFVTFRfTE9HX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZGVmYXVsdF9sb2dfdHlwZSA9IEJDTU9MVF9MT0dfVFlQRV9OT05FOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfTEVWRUxfUFJJTlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bG9nX2xldmVsX3ByaW50ID0gQkNNT0xUX0xPR19MRVZFTF9OT19MT0c7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19MRVZFTF9TQVZFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmxvZ19sZXZlbF9zYXZlID0gQkNNT0xUX0xPR19MRVZFTF9OT19MT0c7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmxvZ190eXBlID0gQkNNT0xUX0xPR19UWVBFX05PTkU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19TVFlMRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5sb2dfc3R5bGUgPSBCQ01PTFRfTE9HX1NUWUxFX05PUk1BTDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfTE9HX05BTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgbWVtc2V0KHRoaXMtPmxvZ19uYW1lLnN0ciwgMCwgMTAwKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfbG9nX2VudHJ5X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9ERUZBVUxUX0xPR19MRVZFTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9sb2dfbGV2ZWxfcGFjayh0aGlzLT5kZWZhdWx0X2xvZ19sZXZlbCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0RFRkFVTFRfTE9HX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfbG9nX3R5cGVfcGFjayh0aGlzLT5kZWZhdWx0X2xvZ190eXBlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfTE9HX0xFVkVMX1BSSU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2xvZ19sZXZlbF9wYWNrKHRoaXMtPmxvZ19sZXZlbF9wcmludCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19MRVZFTF9TQVZFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2xvZ19sZXZlbF9wYWNrKHRoaXMtPmxvZ19sZXZlbF9zYXZlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfTE9HX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfbG9nX3R5cGVfcGFjayh0aGlzLT5sb2dfdHlwZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19TVFlMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9sb2dfc3R5bGVfcGFjayh0aGlzLT5sb2dfc3R5bGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfTkFNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdHJfMTAwX3BhY2soJnRoaXMtPmxvZ19uYW1lLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2xvZ19lbnRyeV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9ERUZBVUxUX0xPR19MRVZFTCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9ERUZBVUxUX0xPR19UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19MRVZFTF9QUklOVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfTEVWRUxfU0FWRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfU1RZTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfTE9HX05BTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTAwOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9jZmdfZGF0YV91bnBhY2soYmNtb2x0X2xvZ19lbnRyeV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfREVGQVVMVF9MT0dfTEVWRUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfbG9nX2xldmVsX3VucGFjaygmdGhpcy0+ZGVmYXVsdF9sb2dfbGV2ZWwsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9ERUZBVUxUX0xPR19UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2xvZ190eXBlX3VucGFjaygmdGhpcy0+ZGVmYXVsdF9sb2dfdHlwZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19MRVZFTF9QUklOVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9sb2dfbGV2ZWxfdW5wYWNrKCZ0aGlzLT5sb2dfbGV2ZWxfcHJpbnQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfTEVWRUxfU0FWRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9sb2dfbGV2ZWxfdW5wYWNrKCZ0aGlzLT5sb2dfbGV2ZWxfc2F2ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2xvZ190eXBlX3VucGFjaygmdGhpcy0+bG9nX3R5cGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfU1RZTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfbG9nX3N0eWxlX3VucGFjaygmdGhpcy0+bG9nX3N0eWxlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfTE9HX05BTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RyXzEwMF91bnBhY2soJnRoaXMtPmxvZ19uYW1lLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfREVGQVVMVF9MT0dfTEVWRUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0RFRkFVTFRfTE9HX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19MRVZFTF9QUklOVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfTE9HX0xFVkVMX1NBVkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfU1RZTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19OQU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfbG9nX2VudHJ5X2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0RFRkFVTFRfTE9HX0xFVkVMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+ZGVmYXVsdF9sb2dfbGV2ZWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0xPR19MRVZFTF9OT19MT0c6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dfTEVWRUxfRkFUQUw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dfTEVWRUxfRVJST1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dfTEVWRUxfV0FSTklORzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0xPR19MRVZFTF9JTkZPOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTE9HX0xFVkVMX0RFQlVHOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9ERUZBVUxUX0xPR19MRVZFTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfREVGQVVMVF9MT0dfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmRlZmF1bHRfbG9nX3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0xPR19UWVBFX05PTkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dfVFlQRV9QUklOVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0xPR19UWVBFX1NBVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dfVFlQRV9CT1RIOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9ERUZBVUxUX0xPR19UWVBFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfTEVWRUxfUFJJTlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5sb2dfbGV2ZWxfcHJpbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0xPR19MRVZFTF9OT19MT0c6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dfTEVWRUxfRkFUQUw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dfTEVWRUxfRVJST1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dfTEVWRUxfV0FSTklORzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0xPR19MRVZFTF9JTkZPOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTE9HX0xFVkVMX0RFQlVHOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfTEVWRUxfUFJJTlQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19MRVZFTF9TQVZFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+bG9nX2xldmVsX3NhdmUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0xPR19MRVZFTF9OT19MT0c6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dfTEVWRUxfRkFUQUw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dfTEVWRUxfRVJST1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dfTEVWRUxfV0FSTklORzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0xPR19MRVZFTF9JTkZPOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTE9HX0xFVkVMX0RFQlVHOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfTEVWRUxfU0FWRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfTE9HX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5sb2dfdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTE9HX1RZUEVfTk9ORToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0xPR19UWVBFX1BSSU5UOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTE9HX1RZUEVfU0FWRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0xPR19UWVBFX0JPVEg6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19UWVBFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfU1RZTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5sb2dfc3R5bGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0xPR19TVFlMRV9OT1JNQUw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dfU1RZTEVfQk9MRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0xPR19TVFlMRV9VTkRFUkxJTkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dfU1RZTEVfQkxJTks6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dfU1RZTEVfUkVWRVJTRV9WSURFTzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfTE9HX1NUWUxFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfTkFNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdHJfMTAwX2JvdW5kc19jaGVjaygmdGhpcy0+bG9nX25hbWUpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfTkFNRTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfbG9nX2VudHJ5X3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfU1RBVF9JRF9NU0dfQ09VTlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgbWVtc2V0KHRoaXMtPm1zZ19jb3VudC5hcnIsIDAsIHNpemVvZih0aGlzLT5tc2dfY291bnQuYXJyKSk7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfU1RBVF9JRF9MT1NUX01TR19DT1VOVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5sb3N0X21zZ19jb3VudCA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9sb2dfZW50cnlfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfSURfTVNHX0NPVU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl91MzJfNl9wYWNrKCZ0aGlzLT5tc2dfY291bnQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfSURfTE9TVF9NU0dfQ09VTlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmxvc3RfbXNnX2NvdW50KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfSURfTVNHX0NPVU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfSURfTE9TVF9NU0dfQ09VTlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9kYXRhX3VucGFjayhiY21vbHRfbG9nX2VudHJ5X3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0lEX01TR19DT1VOVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfdTMyXzZfdW5wYWNrKCZ0aGlzLT5tc2dfY291bnQsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfU1RBVF9JRF9MT1NUX01TR19DT1VOVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+bG9zdF9tc2dfY291bnQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfSURfTVNHX0NPVU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMjQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0lEX0xPU1RfTVNHX0NPVU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfSURfTVNHX0NPVU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl91MzJfNl9ib3VuZHNfY2hlY2soJnRoaXMtPm1zZ19jb3VudCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9MT0dfRU5UUllfU1RBVF9JRF9NU0dfQ09VTlQ7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNmZy50cmlnZ2VyLnR5cGUgPSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOworICAgICAgICB0aGlzLT5jZmcuc29hay5hY3RpdmVfc29ha190aW1lID0gMDsKKyAgICAgICAgdGhpcy0+Y2ZnLnNvYWsuY2xlYXJfc29ha190aW1lID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfcGFjaygmdGhpcy0+Y2ZnLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5jZmcpOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19kYXRhX3VucGFjayhiY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3VucGFjaygmdGhpcy0+Y2ZnLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ19zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2JvdW5kc19jaGVjaygmdGhpcy0+Y2ZnKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0xPR19FTlRSWV9TVEFUX0NGR19JRF9DRkc7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0ID0gQkNNT0xUX0xPR19FTlRSWV9TVEFUX0lEX01TR19DT1VOVDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2lkX3BhY2sodGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV91bnBhY2soYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9sb2dfZW50cnlfc3RhdF9pZF91bnBhY2soJnRoaXMtPnN0YXQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnN0YXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0lEX01TR19DT1VOVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0lEX0xPU1RfTVNHX0NPVU5UOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXQgPSBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfSURfTVNHX0NPVU5UOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfbG9nX2VudHJ5X3N0YXRfaWRfcGFjayh0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfdW5wYWNrKGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2lkX3VucGFjaygmdGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfSURfTVNHX0NPVU5UOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfSURfTE9TVF9NU0dfQ09VTlQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9MT0dfRU5UUllfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXRfYWxhcm1fY2xlYXJlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkID0gQkNNT1NfRkFMU0U7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5zdGF0X2FsYXJtX3JhaXNlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zdGF0X2FsYXJtX2NsZWFyZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR19FTlRSWV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HX0VOVFJZX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfbG9nZ2VyX2tleV9zZXRfZGVmYXVsdChiY21vbHRfbG9nZ2VyX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dHRVJfS0VZX0lEX1JFU0VSVkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJlc2VydmVkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR0dFUl9LRVlfSURfRklMRV9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5maWxlX2lkID0gQkNNT0xUX0xPR19GSUxFX0lEX1NSQU07CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX2tleV9wYWNrKGNvbnN0IGJjbW9sdF9sb2dnZXJfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX0tFWV9JRF9SRVNFUlZFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+cmVzZXJ2ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR0dFUl9LRVlfSURfRklMRV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9sb2dfZmlsZV9pZF9wYWNrKHRoaXMtPmZpbGVfaWQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2xvZ2dlcl9rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2xvZ2dlcl9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR0dFUl9LRVlfSURfUkVTRVJWRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR0dFUl9LRVlfSURfRklMRV9JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9rZXlfdW5wYWNrKGJjbW9sdF9sb2dnZXJfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX0tFWV9JRF9SRVNFUlZFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+cmVzZXJ2ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR0dFUl9LRVlfSURfRklMRV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9sb2dfZmlsZV9pZF91bnBhY2soJnRoaXMtPmZpbGVfaWQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX2tleV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dHRVJfS0VZX0lEX1JFU0VSVkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX0tFWV9JRF9GSUxFX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2xvZ2dlcl9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfbG9nZ2VyX2tleV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dHRVJfS0VZX0lEX0ZJTEVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5maWxlX2lkKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dfRklMRV9JRF9TUkFNOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTE9HX0ZJTEVfSURfRERSOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTE9HR0VSX0tFWV9JRF9GSUxFX0lEOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfbG9nZ2VyX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9sb2dnZXJfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX0NGR19JRF9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgbWVtc2V0KHRoaXMtPmJ1ZmZlci5idWZmLCAwLCAyMDQ4KTsKKyAgICAgICAgdGhpcy0+YnVmZmVyLm1zZ190b19yZWFkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR0dFUl9DRkdfSURfV1JBUF9BUk9VTkQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+d3JhcF9hcm91bmQgPSBCQ01PU19UUlVFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX0NGR19JRF9DTEVBUl9BRlRFUl9SRUFEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNsZWFyX2FmdGVyX3JlYWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR0dFUl9DRkdfSURfRU5BQkxFX0xPRykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5lbmFibGVfbG9nID0gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR0dFUl9DRkdfSURfTE9HX05BTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIG1lbXNldCh0aGlzLT5sb2dfbmFtZXMuc3RyLCAwLCAxMDAwKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfbG9nZ2VyX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX0NGR19JRF9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfbG9nX2J1ZmZlcl9wYWNrKCZ0aGlzLT5idWZmZXIsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX0NGR19JRF9XUkFQX0FST1VORCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPndyYXBfYXJvdW5kKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX0NMRUFSX0FGVEVSX1JFQUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5jbGVhcl9hZnRlcl9yZWFkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX0VOQUJMRV9MT0cpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5lbmFibGVfbG9nKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX0xPR19OQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdHJfMTAwMF9wYWNrKCZ0aGlzLT5sb2dfbmFtZXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2xvZ2dlcl9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfbG9nZ2VyX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX0JVRkZFUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyMDUyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX0NGR19JRF9XUkFQX0FST1VORCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX0NGR19JRF9DTEVBUl9BRlRFUl9SRUFEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX0VOQUJMRV9MT0cpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR0dFUl9DRkdfSURfTE9HX05BTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDEwMDA7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX2NmZ19kYXRhX3VucGFjayhiY21vbHRfbG9nZ2VyX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX0NGR19JRF9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfbG9nX2J1ZmZlcl91bnBhY2soJnRoaXMtPmJ1ZmZlciwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR0dFUl9DRkdfSURfV1JBUF9BUk9VTkQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT53cmFwX2Fyb3VuZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX0NGR19JRF9DTEVBUl9BRlRFUl9SRUFEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+Y2xlYXJfYWZ0ZXJfcmVhZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX0NGR19JRF9FTkFCTEVfTE9HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+ZW5hYmxlX2xvZykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX0NGR19JRF9MT0dfTkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RyXzEwMDBfdW5wYWNrKCZ0aGlzLT5sb2dfbmFtZXMsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX0NGR19JRF9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyMDUyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX1dSQVBfQVJPVU5EKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX0NGR19JRF9DTEVBUl9BRlRFUl9SRUFEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX0NGR19JRF9FTkFCTEVfTE9HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX0NGR19JRF9MT0dfTkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxMDAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9sb2dnZXJfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfbG9nZ2VyX2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX0JVRkZFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9sb2dfYnVmZmVyX2JvdW5kc19jaGVjaygmdGhpcy0+YnVmZmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX0xPR0dFUl9DRkdfSURfQlVGRkVSOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX0xPR19OQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdHJfMTAwMF9ib3VuZHNfY2hlY2soJnRoaXMtPmxvZ19uYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX0xPR19OQU1FUzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfbG9nZ2VyX3N0YXRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfbG9nZ2VyX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dHRVJfU1RBVF9JRF9MSU5FU19JTl9MT0cpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bGluZXNfaW5fbG9nID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfc3RhdF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2xvZ2dlcl9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dHRVJfU1RBVF9JRF9MSU5FU19JTl9MT0cpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmxpbmVzX2luX2xvZykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2xvZ2dlcl9zdGF0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2xvZ2dlcl9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR0dFUl9TVEFUX0lEX0xJTkVTX0lOX0xPRykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9zdGF0X2RhdGFfdW5wYWNrKGJjbW9sdF9sb2dnZXJfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX1NUQVRfSURfTElORVNfSU5fTE9HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5saW5lc19pbl9sb2cpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9zdGF0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX1NUQVRfSURfTElORVNfSU5fTE9HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX3N0YXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2xvZ2dlcl9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfbG9nZ2VyX3N0YXRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR0dFUl9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Y2ZnLnRyaWdnZXIudHlwZSA9IEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX05PTkU7CisgICAgICAgIHRoaXMtPmNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgPSAwOworICAgICAgICB0aGlzLT5jZmcuc29hay5jbGVhcl9zb2FrX3RpbWUgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ19wYWNrKCZ0aGlzLT5jZmcsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9sb2dnZXJfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSBiY21vbHRfc3RhdF9hbGFybV9jb25maWdfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmNmZyk7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9sb2dnZXJfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR0dFUl9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfdW5wYWNrKCZ0aGlzLT5jZmcsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfc3RhdF9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dHRVJfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR0dFUl9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfYm91bmRzX2NoZWNrKCZ0aGlzLT5jZmcpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTE9HR0VSX1NUQVRfQ0ZHX0lEX0NGRzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXQgPSBCQ01PTFRfTE9HR0VSX1NUQVRfSURfTElORVNfSU5fTE9HOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dHRVJfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfbG9nZ2VyX3N0YXRfaWRfcGFjayh0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3VucGFjayhiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2xvZ2dlcl9zdGF0X2lkX3VucGFjaygmdGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTE9HR0VSX1NUQVRfSURfTElORVNfSU5fTE9HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTE9HR0VSX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR0dFUl9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXQgPSBCQ01PTFRfTE9HR0VSX1NUQVRfSURfTElORVNfSU5fTE9HOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfbG9nZ2VyX3N0YXRfaWRfcGFjayh0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR0dFUl9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfdW5wYWNrKGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR0dFUl9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2xvZ2dlcl9zdGF0X2lkX3VucGFjaygmdGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dHRVJfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR0dFUl9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTE9HR0VSX1NUQVRfSURfTElORVNfSU5fTE9HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTE9HR0VSX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9sb2dnZXJfYXV0b19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0X2FsYXJtX2NsZWFyZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR0dFUl9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0X2FsYXJtX3JhaXNlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnN0YXRfYWxhcm1fY2xlYXJlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhdF9hbGFybV9yYWlzZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9sb2dnZXJfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR0dFUl9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR0dFUl9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dHRVJfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9MT0dHRVJfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zdGF0X2FsYXJtX3JhaXNlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTE9HR0VSX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX0xPR0dFUl9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X25uaV9rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X25uaV9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cG9uX25pID0gKGJjbW9sdF9wb25fbmkpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX2tleV9wYWNrKGNvbnN0IGJjbW9sdF9ubmlfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMtPnBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X25uaV9rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X25uaV9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX2tleV91bnBhY2soYmNtb2x0X25uaV9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICh1aW50OF90ICopICZ0aGlzLT5wb25fbmkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ubmlfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfbm5pX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ubmlfa2V5X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5wb25fbmkgPiAoYmNtb2x0X3Bvbl9uaSkgMTUpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9OTklfS0VZX0lEX1BPTl9OSTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfbm5pX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ubmlfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX0NGR19JRF9SRU1PVEVfTE9PUEJBQ0spKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmVtb3RlX2xvb3BiYWNrID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9DRkdfSURfTElORV9MT09QQkFDSykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5saW5lX2xvb3BiYWNrID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9DRkdfSURfTUFDX0FERFJFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3NfaW5pdCgmdGhpcy0+bWFjX2FkZHJlc3MpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX0NGR19JRF9OTklfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm5uaV9zdGF0dXMubGlua19zdGF0dXMgPSBCQ01PTFRfVFJJVkFMRU5UX0ZBTFNFOworICAgICAgICB0aGlzLT5ubmlfc3RhdHVzLnNpZ25hbF9kZXRlY3RlZCA9IEJDTU9MVF9UUklWQUxFTlRfRkFMU0U7CisgICAgICAgIHRoaXMtPm5uaV9zdGF0dXMucG1kX2xvY2tlZCA9IEJDTU9MVF9UUklWQUxFTlRfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQ0ZHX0lEX05OSV9CQUNLVVBfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm5uaV9iYWNrdXBfc3RhdHVzLmxpbmtfc3RhdHVzID0gQkNNT0xUX1RSSVZBTEVOVF9GQUxTRTsKKyAgICAgICAgdGhpcy0+bm5pX2JhY2t1cF9zdGF0dXMuc2lnbmFsX2RldGVjdGVkID0gQkNNT0xUX1RSSVZBTEVOVF9GQUxTRTsKKyAgICAgICAgdGhpcy0+bm5pX2JhY2t1cF9zdGF0dXMucG1kX2xvY2tlZCA9IEJDTU9MVF9UUklWQUxFTlRfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQ0ZHX0lEX0FDVElWRV9OTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWN0aXZlX25uaSA9IEJDTU9MVF9OTklfQ09OTkVDVElPTl9QUklNQVJZOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX0NGR19JRF9OTklfU1RBVFVTX1BPTExJTkdfSU5URVJWQUxfTVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bm5pX3N0YXR1c19wb2xsaW5nX2ludGVydmFsX21zID0gNTA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQ0ZHX0lEX0FVVE9TV0lUQ0gpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YXV0b3N3aXRjaCA9IEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQ0ZHX0lEX0ZMT1dfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mbG93X2NvbnRyb2wgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9FTkFCTEU7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X25uaV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9DRkdfSURfUkVNT1RFX0xPT1BCQUNLKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfcGFjayh0aGlzLT5yZW1vdGVfbG9vcGJhY2ssIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX0NGR19JRF9MSU5FX0xPT1BCQUNLKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfcGFjayh0aGlzLT5saW5lX2xvb3BiYWNrLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9DRkdfSURfTUFDX0FERFJFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+bWFjX2FkZHJlc3MpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9DRkdfSURfTk5JX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ubmlfbGlua19zdGF0dXNfcGFjaygmdGhpcy0+bm5pX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQ0ZHX0lEX05OSV9CQUNLVVBfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X25uaV9saW5rX3N0YXR1c19wYWNrKCZ0aGlzLT5ubmlfYmFja3VwX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQ0ZHX0lEX0FDVElWRV9OTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfbm5pX2Nvbm5lY3Rpb25fcGFjayh0aGlzLT5hY3RpdmVfbm5pLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9DRkdfSURfTk5JX1NUQVRVU19QT0xMSU5HX0lOVEVSVkFMX01TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5ubmlfc3RhdHVzX3BvbGxpbmdfaW50ZXJ2YWxfbXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9DRkdfSURfQVVUT1NXSVRDSCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmF1dG9zd2l0Y2gpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9DRkdfSURfRkxPV19DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfcGFjayh0aGlzLT5mbG93X2NvbnRyb2wsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X25uaV9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfbm5pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQ0ZHX0lEX1JFTU9URV9MT09QQkFDSykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX0NGR19JRF9MSU5FX0xPT1BCQUNLKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQ0ZHX0lEX01BQ19BRERSRVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDY7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQ0ZHX0lEX05OSV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9DRkdfSURfTk5JX0JBQ0tVUF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9DRkdfSURfQUNUSVZFX05OSSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX0NGR19JRF9OTklfU1RBVFVTX1BPTExJTkdfSU5URVJWQUxfTVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9DRkdfSURfQVVUT1NXSVRDSCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX0NGR19JRF9GTE9XX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ubmlfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9ubmlfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQ0ZHX0lEX1JFTU9URV9MT09QQkFDSykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9jb250cm9sX3N0YXRlX3VucGFjaygmdGhpcy0+cmVtb3RlX2xvb3BiYWNrLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9DRkdfSURfTElORV9MT09QQkFDSykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9jb250cm9sX3N0YXRlX3VucGFjaygmdGhpcy0+bGluZV9sb29wYmFjaywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQ0ZHX0lEX01BQ19BRERSRVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX21hY19hZGRyZXNzKGJ1ZiwgJnRoaXMtPm1hY19hZGRyZXNzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQ0ZHX0lEX05OSV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfbm5pX2xpbmtfc3RhdHVzX3VucGFjaygmdGhpcy0+bm5pX3N0YXR1cywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9DRkdfSURfTk5JX0JBQ0tVUF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfbm5pX2xpbmtfc3RhdHVzX3VucGFjaygmdGhpcy0+bm5pX2JhY2t1cF9zdGF0dXMsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQ0ZHX0lEX0FDVElWRV9OTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfbm5pX2Nvbm5lY3Rpb25fdW5wYWNrKCZ0aGlzLT5hY3RpdmVfbm5pLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9DRkdfSURfTk5JX1NUQVRVU19QT0xMSU5HX0lOVEVSVkFMX01TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5ubmlfc3RhdHVzX3BvbGxpbmdfaW50ZXJ2YWxfbXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9DRkdfSURfQVVUT1NXSVRDSCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmF1dG9zd2l0Y2gpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9DRkdfSURfRkxPV19DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfdW5wYWNrKCZ0aGlzLT5mbG93X2NvbnRyb2wsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9DRkdfSURfUkVNT1RFX0xPT1BCQUNLKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX0NGR19JRF9MSU5FX0xPT1BCQUNLKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX0NGR19JRF9NQUNfQUREUkVTUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9DRkdfSURfTk5JX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9DRkdfSURfTk5JX0JBQ0tVUF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQ0ZHX0lEX0FDVElWRV9OTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQ0ZHX0lEX05OSV9TVEFUVVNfUE9MTElOR19JTlRFUlZBTF9NUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9DRkdfSURfQVVUT1NXSVRDSCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9DRkdfSURfRkxPV19DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfbm5pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X25uaV9jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX0NGR19JRF9SRU1PVEVfTE9PUEJBQ0spKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5yZW1vdGVfbG9vcGJhY2spCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRU5BQkxFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTk5JX0NGR19JRF9SRU1PVEVfTE9PUEJBQ0s7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQ0ZHX0lEX0xJTkVfTE9PUEJBQ0spKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5saW5lX2xvb3BiYWNrKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9DT05UUk9MX1NUQVRFX0VOQUJMRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX05OSV9DRkdfSURfTElORV9MT09QQkFDSzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9DRkdfSURfTk5JX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ubmlfbGlua19zdGF0dXNfYm91bmRzX2NoZWNrKCZ0aGlzLT5ubmlfc3RhdHVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX05OSV9DRkdfSURfTk5JX1NUQVRVUzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX0NGR19JRF9OTklfQkFDS1VQX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ubmlfbGlua19zdGF0dXNfYm91bmRzX2NoZWNrKCZ0aGlzLT5ubmlfYmFja3VwX3N0YXR1cykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9OTklfQ0ZHX0lEX05OSV9CQUNLVVBfU1RBVFVTOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQ0ZHX0lEX0FDVElWRV9OTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5hY3RpdmVfbm5pKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfQ09OTkVDVElPTl9QUklNQVJZOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX0NPTk5FQ1RJT05fQkFDS1VQOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTk5JX0NGR19JRF9BQ1RJVkVfTk5JOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX0NGR19JRF9OTklfU1RBVFVTX1BPTExJTkdfSU5URVJWQUxfTVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPm5uaV9zdGF0dXNfcG9sbGluZ19pbnRlcnZhbF9tcyA+IDM2MDAwMDBVTCkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX05OSV9DRkdfSURfTk5JX1NUQVRVU19QT0xMSU5HX0lOVEVSVkFMX01TOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQ0ZHX0lEX0ZMT1dfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmZsb3dfY29udHJvbCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQ09OVFJPTF9TVEFURV9FTkFCTEU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9OTklfQ0ZHX0lEX0ZMT1dfQ09OVFJPTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X25uaV9zdGF0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X25uaV9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzY0KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2ZyYW1lc182NCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfNjVfMTI3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2ZyYW1lc182NV8xMjcgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzEyOF8yNTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfZnJhbWVzXzEyOF8yNTUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzI1Nl81MTEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfZnJhbWVzXzI1Nl81MTEgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzUxMl8xMDIzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2ZyYW1lc181MTJfMTAyMyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfMTAyNF8xNTE4KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2ZyYW1lc18xMDI0XzE1MTggPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzE1MTlfMjA0NykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9mcmFtZXNfMTUxOV8yMDQ3ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU18yMDQ4XzQwOTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfZnJhbWVzXzIwNDhfNDA5NSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfNDA5Nl85MjE2KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2ZyYW1lc180MDk2XzkyMTYgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzkyMTdfMTYzODMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfZnJhbWVzXzkyMTdfMTYzODMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9ieXRlcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9HT09EX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9nb29kX2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTklDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF91bmljYXN0X2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9NVUxUSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X211bHRpY2FzdF9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQlJPQURDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9icm9hZGNhc3RfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZDU19FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfZmNzX2Vycm9ycyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9DT05UUk9MX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9jb250cm9sX2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9QQVVTRV9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfcGF1c2VfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1BGQ19GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfcGZjX2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTlNVUFBPUlRFRF9PUENPREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfdW5zdXBwb3J0ZWRfb3Bjb2RlID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1VOU1VQUE9SVEVEX0RBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X3Vuc3VwcG9ydGVkX2RhID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0FMSUdOTUVOVF9FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfYWxpZ25tZW50X2Vycm9ycyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9MRU5HVEhfT1VUX09GX1JBTkdFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2xlbmd0aF9vdXRfb2ZfcmFuZ2UgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQ09ERV9FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfY29kZV9lcnJvcnMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfT1ZFUlNJWkVEX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9vdmVyc2l6ZWRfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0pBQkJFUl9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfamFiYmVyX2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9NVFVfQ0hFQ0tfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X210dV9jaGVja19lcnJvcnMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfUFJPTUlTQ1VPVVNfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X3Byb21pc2N1b3VzX2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9WTEFOX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF92bGFuX2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9ET1VCTEVfVkxBTl9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfZG91YmxlX3ZsYW5fZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1RSVU5DQVRFRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfdHJ1bmNhdGVkX2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTkRFUlNJWkVfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X3VuZGVyc2l6ZV9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBR01FTlRFRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfZnJhZ21lbnRlZF9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfUlVOVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfcnVudF9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzY0KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X2ZyYW1lc182NCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfNjVfMTI3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X2ZyYW1lc182NV8xMjcgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzEyOF8yNTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfZnJhbWVzXzEyOF8yNTUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzI1Nl81MTEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfZnJhbWVzXzI1Nl81MTEgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzUxMl8xMDIzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X2ZyYW1lc181MTJfMTAyMyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMTAyNF8xNTE4KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X2ZyYW1lc18xMDI0XzE1MTggPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzE1MTlfMjA0NykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9mcmFtZXNfMTUxOV8yMDQ3ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18yMDQ4XzQwOTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfZnJhbWVzXzIwNDhfNDA5NSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfNDA5Nl85MjE2KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X2ZyYW1lc180MDk2XzkyMTYgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzkyMTdfMTYzODMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfZnJhbWVzXzkyMTdfMTYzODMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9ieXRlcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9HT09EX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9nb29kX2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9VTklDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF91bmljYXN0X2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9NVUxUSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X211bHRpY2FzdF9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfQlJPQURDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9icm9hZGNhc3RfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX1BBVVNFX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9wYXVzZV9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfUEZDX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9wZmNfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0pBQkJFUl9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfamFiYmVyX2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GQ1NfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X2Zjc19lcnJvcnMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfQ09OVFJPTF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfY29udHJvbF9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfT1ZFUlNJWkVfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X292ZXJzaXplX2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFHTUVOVEVEX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9mcmFnbWVudGVkX2ZyYW1lcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9FUlJPUl9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfZXJyb3JfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX1ZMQU5fRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X3ZsYW5fZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0RPVUJMRV9WTEFOX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9kb3VibGVfdmxhbl9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfUlVOVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfcnVudF9mcmFtZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfVU5ERVJSVU5fRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X3VuZGVycnVuX2ZyYW1lcyA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3N0YXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ubmlfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzY0KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF9mcmFtZXNfNjQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU182NV8xMjcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2ZyYW1lc182NV8xMjcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU18xMjhfMjU1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF9mcmFtZXNfMTI4XzI1NSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzI1Nl81MTEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2ZyYW1lc18yNTZfNTExKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfNTEyXzEwMjMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2ZyYW1lc181MTJfMTAyMykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzEwMjRfMTUxOCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfZnJhbWVzXzEwMjRfMTUxOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzE1MTlfMjA0NykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfZnJhbWVzXzE1MTlfMjA0NykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzIwNDhfNDA5NSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfZnJhbWVzXzIwNDhfNDA5NSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzQwOTZfOTIxNikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfZnJhbWVzXzQwOTZfOTIxNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzkyMTdfMTYzODMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2ZyYW1lc185MjE3XzE2MzgzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9HT09EX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfZ29vZF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1VOSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF91bmljYXN0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfTVVMVElDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfbXVsdGljYXN0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQlJPQURDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfYnJvYWRjYXN0X2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRkNTX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfZmNzX2Vycm9ycykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQ09OVFJPTF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2NvbnRyb2xfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9QQVVTRV9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X3BhdXNlX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfUEZDX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfcGZjX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVU5TVVBQT1JURURfT1BDT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF91bnN1cHBvcnRlZF9vcGNvZGUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1VOU1VQUE9SVEVEX0RBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF91bnN1cHBvcnRlZF9kYSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQUxJR05NRU5UX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfYWxpZ25tZW50X2Vycm9ycykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfTEVOR1RIX09VVF9PRl9SQU5HRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfbGVuZ3RoX291dF9vZl9yYW5nZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQ09ERV9FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2NvZGVfZXJyb3JzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9PVkVSU0laRURfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF9vdmVyc2l6ZWRfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9KQUJCRVJfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF9qYWJiZXJfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9NVFVfQ0hFQ0tfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF9tdHVfY2hlY2tfZXJyb3JzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9QUk9NSVNDVU9VU19GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X3Byb21pc2N1b3VzX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVkxBTl9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X3ZsYW5fZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9ET1VCTEVfVkxBTl9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2RvdWJsZV92bGFuX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVFJVTkNBVEVEX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfdHJ1bmNhdGVkX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVU5ERVJTSVpFX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfdW5kZXJzaXplX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBR01FTlRFRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2ZyYWdtZW50ZWRfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9SVU5UX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfcnVudF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU182NCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dHhfZnJhbWVzXzY0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfNjVfMTI3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9mcmFtZXNfNjVfMTI3KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMTI4XzI1NSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dHhfZnJhbWVzXzEyOF8yNTUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18yNTZfNTExKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9mcmFtZXNfMjU2XzUxMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzUxMl8xMDIzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9mcmFtZXNfNTEyXzEwMjMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18xMDI0XzE1MTgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X2ZyYW1lc18xMDI0XzE1MTgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18xNTE5XzIwNDcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X2ZyYW1lc18xNTE5XzIwNDcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18yMDQ4XzQwOTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X2ZyYW1lc18yMDQ4XzQwOTUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU180MDk2XzkyMTYpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X2ZyYW1lc180MDk2XzkyMTYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU185MjE3XzE2MzgzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9mcmFtZXNfOTIxN18xNjM4MykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfR09PRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X2dvb2RfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9VTklDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dHhfdW5pY2FzdF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX01VTFRJQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X211bHRpY2FzdF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0JST0FEQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X2Jyb2FkY2FzdF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX1BBVVNFX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dHhfcGF1c2VfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9QRkNfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9wZmNfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9KQUJCRVJfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9qYWJiZXJfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GQ1NfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9mY3NfZXJyb3JzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9DT05UUk9MX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dHhfY29udHJvbF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX09WRVJTSVpFX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dHhfb3ZlcnNpemVfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFHTUVOVEVEX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dHhfZnJhZ21lbnRlZF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0VSUk9SX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dHhfZXJyb3JfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9WTEFOX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dHhfdmxhbl9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0RPVUJMRV9WTEFOX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dHhfZG91YmxlX3ZsYW5fZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9SVU5UX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dHhfcnVudF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX1VOREVSUlVOX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dHhfdW5kZXJydW5fZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfbm5pX3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfbm5pX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzY0KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfNjVfMTI3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfMTI4XzI1NSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzI1Nl81MTEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU181MTJfMTAyMykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzEwMjRfMTUxOCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzE1MTlfMjA0NykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzIwNDhfNDA5NSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzQwOTZfOTIxNikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzkyMTdfMTYzODMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0dPT0RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTklDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfTVVMVElDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQlJPQURDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRkNTX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQ09OVFJPTF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1BBVVNFX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfUEZDX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVU5TVVBQT1JURURfT1BDT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTlNVUFBPUlRFRF9EQSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQUxJR05NRU5UX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfTEVOR1RIX09VVF9PRl9SQU5HRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQ09ERV9FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX09WRVJTSVpFRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0pBQkJFUl9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX01UVV9DSEVDS19FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1BST01JU0NVT1VTX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVkxBTl9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0RPVUJMRV9WTEFOX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVFJVTkNBVEVEX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVU5ERVJTSVpFX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBR01FTlRFRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1JVTlRfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfNjQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU182NV8xMjcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18xMjhfMjU1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMjU2XzUxMSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzUxMl8xMDIzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMTAyNF8xNTE4KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMTUxOV8yMDQ3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMjA0OF80MDk1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfNDA5Nl85MjE2KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfOTIxN18xNjM4MykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfR09PRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX1VOSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9NVUxUSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9CUk9BRENBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9QQVVTRV9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX1BGQ19GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0pBQkJFUl9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZDU19FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0NPTlRST0xfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9PVkVSU0laRV9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQUdNRU5URURfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9FUlJPUl9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX1ZMQU5fRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9ET1VCTEVfVkxBTl9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX1JVTlRfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9VTkRFUlJVTl9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc3RhdF9kYXRhX3VucGFjayhiY21vbHRfbm5pX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU182NCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfZnJhbWVzXzY0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfNjVfMTI3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9mcmFtZXNfNjVfMTI3KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfMTI4XzI1NSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfZnJhbWVzXzEyOF8yNTUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU18yNTZfNTExKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9mcmFtZXNfMjU2XzUxMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzUxMl8xMDIzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9mcmFtZXNfNTEyXzEwMjMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU18xMDI0XzE1MTgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2ZyYW1lc18xMDI0XzE1MTgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU18xNTE5XzIwNDcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2ZyYW1lc18xNTE5XzIwNDcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU18yMDQ4XzQwOTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2ZyYW1lc18yMDQ4XzQwOTUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU180MDk2XzkyMTYpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2ZyYW1lc180MDk2XzkyMTYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU185MjE3XzE2MzgzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9mcmFtZXNfOTIxN18xNjM4MykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfR09PRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2dvb2RfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTklDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfdW5pY2FzdF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX01VTFRJQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X211bHRpY2FzdF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0JST0FEQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2Jyb2FkY2FzdF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZDU19FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2Zjc19lcnJvcnMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0NPTlRST0xfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9jb250cm9sX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfUEFVU0VfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9wYXVzZV9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1BGQ19GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X3BmY19mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1VOU1VQUE9SVEVEX09QQ09ERSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfdW5zdXBwb3J0ZWRfb3Bjb2RlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTlNVUFBPUlRFRF9EQSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfdW5zdXBwb3J0ZWRfZGEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0FMSUdOTUVOVF9FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2FsaWdubWVudF9lcnJvcnMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0xFTkdUSF9PVVRfT0ZfUkFOR0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2xlbmd0aF9vdXRfb2ZfcmFuZ2UpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0NPREVfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9jb2RlX2Vycm9ycykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfT1ZFUlNJWkVEX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfb3ZlcnNpemVkX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfSkFCQkVSX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfamFiYmVyX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfTVRVX0NIRUNLX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfbXR1X2NoZWNrX2Vycm9ycykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfUFJPTUlTQ1VPVVNfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9wcm9taXNjdW91c19mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1ZMQU5fRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF92bGFuX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRE9VQkxFX1ZMQU5fRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9kb3VibGVfdmxhbl9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1RSVU5DQVRFRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X3RydW5jYXRlZF9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1VOREVSU0laRV9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X3VuZGVyc2l6ZV9mcmFtZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQUdNRU5URURfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9mcmFnbWVudGVkX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfUlVOVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X3J1bnRfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfNjQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X2ZyYW1lc182NCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzY1XzEyNykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfZnJhbWVzXzY1XzEyNykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzEyOF8yNTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X2ZyYW1lc18xMjhfMjU1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMjU2XzUxMSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfZnJhbWVzXzI1Nl81MTEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU181MTJfMTAyMykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfZnJhbWVzXzUxMl8xMDIzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMTAyNF8xNTE4KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50eF9mcmFtZXNfMTAyNF8xNTE4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMTUxOV8yMDQ3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50eF9mcmFtZXNfMTUxOV8yMDQ3KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMjA0OF80MDk1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50eF9mcmFtZXNfMjA0OF80MDk1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfNDA5Nl85MjE2KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50eF9mcmFtZXNfNDA5Nl85MjE2KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfOTIxN18xNjM4MykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfZnJhbWVzXzkyMTdfMTYzODMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfYnl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0dPT0RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50eF9nb29kX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfVU5JQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X3VuaWNhc3RfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9NVUxUSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50eF9tdWx0aWNhc3RfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9CUk9BRENBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50eF9icm9hZGNhc3RfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9QQVVTRV9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X3BhdXNlX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfUEZDX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfcGZjX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfSkFCQkVSX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfamFiYmVyX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRkNTX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfZmNzX2Vycm9ycykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfQ09OVFJPTF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X2NvbnRyb2xfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9PVkVSU0laRV9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X292ZXJzaXplX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBR01FTlRFRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X2ZyYWdtZW50ZWRfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9FUlJPUl9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X2Vycm9yX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfVkxBTl9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X3ZsYW5fZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9ET1VCTEVfVkxBTl9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X2RvdWJsZV92bGFuX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfUlVOVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X3J1bnRfZnJhbWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9VTkRFUlJVTl9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X3VuZGVycnVuX2ZyYW1lcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3N0YXRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfNjQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfNjVfMTI3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzEyOF8yNTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfMjU2XzUxMSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU181MTJfMTAyMykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU18xMDI0XzE1MTgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfMTUxOV8yMDQ3KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzIwNDhfNDA5NSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU180MDk2XzkyMTYpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfOTIxN18xNjM4MykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfR09PRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTklDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX01VTFRJQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9CUk9BRENBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRkNTX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0NPTlRST0xfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfUEFVU0VfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfUEZDX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1VOU1VQUE9SVEVEX09QQ09ERSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1VOU1VQUE9SVEVEX0RBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQUxJR05NRU5UX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0xFTkdUSF9PVVRfT0ZfUkFOR0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9DT0RFX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX09WRVJTSVpFRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9KQUJCRVJfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfTVRVX0NIRUNLX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1BST01JU0NVT1VTX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1ZMQU5fRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRE9VQkxFX1ZMQU5fRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVFJVTkNBVEVEX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1VOREVSU0laRV9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFHTUVOVEVEX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1JVTlRfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzY0KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzY1XzEyNykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18xMjhfMjU1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzI1Nl81MTEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfNTEyXzEwMjMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMTAyNF8xNTE4KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzE1MTlfMjA0NykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18yMDQ4XzQwOTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfNDA5Nl85MjE2KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzkyMTdfMTYzODMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0dPT0RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfVU5JQ0FTVF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9NVUxUSUNBU1RfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfQlJPQURDQVNUX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX1BBVVNFX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX1BGQ19GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9KQUJCRVJfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRkNTX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0NPTlRST0xfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfT1ZFUlNJWkVfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBR01FTlRFRF9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9FUlJPUl9GUkFNRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9WTEFOX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0RPVUJMRV9WTEFOX0ZSQU1FUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0lEX1RYX1JVTlRfRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfSURfVFhfVU5ERVJSVU5fRlJBTUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3N0YXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X25uaV9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfbm5pX3N0YXRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfbm5pX3N0YXRfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X25uaV9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Y2ZnLnRyaWdnZXIudHlwZSA9IEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX05PTkU7CisgICAgICAgIHRoaXMtPmNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgPSAwOworICAgICAgICB0aGlzLT5jZmcuc29hay5jbGVhcl9zb2FrX3RpbWUgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zdGF0X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X25uaV9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ19wYWNrKCZ0aGlzLT5jZmcsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X25uaV9zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ubmlfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSBiY21vbHRfc3RhdF9hbGFybV9jb25maWdfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmNmZyk7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3N0YXRfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9ubmlfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfdW5wYWNrKCZ0aGlzLT5jZmcsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc3RhdF9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zdGF0X2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfbm5pX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfbm5pX3N0YXRfY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfYm91bmRzX2NoZWNrKCZ0aGlzLT5jZmcpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTk5JX1NUQVRfQ0ZHX0lEX0NGRzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXQgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzY0OworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfbm5pX3N0YXRfaWRfcGFjayh0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3VucGFjayhiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X25uaV9zdGF0X2lkX3VucGFjaygmdGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzY0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzY1XzEyNzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU18xMjhfMjU1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzI1Nl81MTE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfNTEyXzEwMjM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfMTAyNF8xNTE4OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzE1MTlfMjA0NzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU18yMDQ4XzQwOTU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfNDA5Nl85MjE2OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzkyMTdfMTYzODM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0dPT0RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9NVUxUSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQlJPQURDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZDU19FUlJPUlM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9DT05UUk9MX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1BBVVNFX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1BGQ19GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTlNVUFBPUlRFRF9PUENPREU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTlNVUFBPUlRFRF9EQToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0FMSUdOTUVOVF9FUlJPUlM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9MRU5HVEhfT1VUX09GX1JBTkdFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQ09ERV9FUlJPUlM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9PVkVSU0laRURfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfSkFCQkVSX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX01UVV9DSEVDS19FUlJPUlM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9QUk9NSVNDVU9VU19GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9WTEFOX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0RPVUJMRV9WTEFOX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1RSVU5DQVRFRF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTkRFUlNJWkVfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBR01FTlRFRF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9SVU5UX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU182NDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU182NV8xMjc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMTI4XzI1NToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18yNTZfNTExOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzUxMl8xMDIzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzEwMjRfMTUxODoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18xNTE5XzIwNDc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMjA0OF80MDk1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzQwOTZfOTIxNjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU185MjE3XzE2MzgzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfQllURVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9HT09EX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfTVVMVElDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0JST0FEQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9QQVVTRV9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9QRkNfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfSkFCQkVSX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZDU19FUlJPUlM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9DT05UUk9MX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX09WRVJTSVpFX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQUdNRU5URURfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRVJST1JfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfVkxBTl9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9ET1VCTEVfVkxBTl9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9SVU5UX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX1VOREVSUlVOX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX05OSV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0ID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU182NDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X25uaV9zdGF0X2lkX3BhY2sodGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3VucGFjayhiY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ubmlfc3RhdF9pZF91bnBhY2soJnRoaXMtPnN0YXQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnN0YXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU182NDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU182NV8xMjc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfMTI4XzI1NToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU18yNTZfNTExOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzUxMl8xMDIzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzEwMjRfMTUxODoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU18xNTE5XzIwNDc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfMjA0OF80MDk1OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzQwOTZfOTIxNjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU185MjE3XzE2MzgzOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQllURVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9HT09EX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfTVVMVElDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0JST0FEQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GQ1NfRVJST1JTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQ09OVFJPTF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9QQVVTRV9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9QRkNfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVU5TVVBQT1JURURfT1BDT0RFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVU5TVVBQT1JURURfREE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9BTElHTk1FTlRfRVJST1JTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfTEVOR1RIX09VVF9PRl9SQU5HRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0NPREVfRVJST1JTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfT1ZFUlNJWkVEX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0pBQkJFUl9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9NVFVfQ0hFQ0tfRVJST1JTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfUFJPTUlTQ1VPVVNfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVkxBTl9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9ET1VCTEVfVkxBTl9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9UUlVOQ0FURURfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVU5ERVJTSVpFX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQUdNRU5URURfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfUlVOVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfNjQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfNjVfMTI3OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzEyOF8yNTU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMjU2XzUxMToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU181MTJfMTAyMzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18xMDI0XzE1MTg6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMTUxOV8yMDQ3OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzIwNDhfNDA5NToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU180MDk2XzkyMTY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfOTIxN18xNjM4MzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfR09PRF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX01VTFRJQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9CUk9BRENBU1RfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfUEFVU0VfRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfUEZDX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0pBQkJFUl9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GQ1NfRVJST1JTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfQ09OVFJPTF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9PVkVSU0laRV9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFHTUVOVEVEX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0VSUk9SX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX1ZMQU5fRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRE9VQkxFX1ZMQU5fRlJBTUVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfUlVOVF9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9VTkRFUlJVTl9GUkFNRVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9OTklfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVFVTX0NIQU5HRURfSURfTkVXX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5uZXdfc3RhdHVzID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVFVTX0NIQU5HRURfSURfTElOSykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5saW5rID0gQkNNT0xUX05OSV9DT05ORUNUSU9OX1BSSU1BUlk7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVFVTX0NIQU5HRURfSURfUFJFVklPVVNfQUNUSVZFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnByZXZpb3VzX2FjdGl2ZSA9IEJDTU9MVF9OTklfQ09OTkVDVElPTl9QUklNQVJZOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRVU19DSEFOR0VEX0lEX05FV19BQ1RJVkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bmV3X2FjdGl2ZSA9IEJDTU9MVF9OTklfQ09OTkVDVElPTl9QUklNQVJZOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRVU19DSEFOR0VEX0lEX05FV19TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+bmV3X3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVFVTX0NIQU5HRURfSURfTElOSykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ubmlfY29ubmVjdGlvbl9wYWNrKHRoaXMtPmxpbmssIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRVU19DSEFOR0VEX0lEX1BSRVZJT1VTX0FDVElWRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ubmlfY29ubmVjdGlvbl9wYWNrKHRoaXMtPnByZXZpb3VzX2FjdGl2ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVFVTX0NIQU5HRURfSURfTkVXX0FDVElWRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ubmlfY29ubmVjdGlvbl9wYWNrKHRoaXMtPm5ld19hY3RpdmUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRVU19DSEFOR0VEX0lEX05FV19TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUVVNfQ0hBTkdFRF9JRF9MSU5LKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVFVTX0NIQU5HRURfSURfUFJFVklPVVNfQUNUSVZFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVFVTX0NIQU5HRURfSURfTkVXX0FDVElWRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9kYXRhX3VucGFjayhiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVFVTX0NIQU5HRURfSURfTkVXX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5uZXdfc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUVVNfQ0hBTkdFRF9JRF9MSU5LKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X25uaV9jb25uZWN0aW9uX3VucGFjaygmdGhpcy0+bGluaywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVFVTX0NIQU5HRURfSURfUFJFVklPVVNfQUNUSVZFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X25uaV9jb25uZWN0aW9uX3VucGFjaygmdGhpcy0+cHJldmlvdXNfYWN0aXZlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUVVNfQ0hBTkdFRF9JRF9ORVdfQUNUSVZFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X25uaV9jb25uZWN0aW9uX3VucGFjaygmdGhpcy0+bmV3X2FjdGl2ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVFVTX0NIQU5HRURfSURfTkVXX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUVVNfQ0hBTkdFRF9JRF9MSU5LKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRVU19DSEFOR0VEX0lEX1BSRVZJT1VTX0FDVElWRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUVVNfQ0hBTkdFRF9JRF9ORVdfQUNUSVZFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRVU19DSEFOR0VEX0lEX05FV19TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5uZXdfc3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX05OSV9TVEFUVVNfQ0hBTkdFRF9JRF9ORVdfU1RBVFVTOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NUQVRVU19DSEFOR0VEX0lEX0xJTkspKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5saW5rKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfQ09OTkVDVElPTl9QUklNQVJZOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX0NPTk5FQ1RJT05fQkFDS1VQOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTk5JX1NUQVRVU19DSEFOR0VEX0lEX0xJTks7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU1RBVFVTX0NIQU5HRURfSURfUFJFVklPVVNfQUNUSVZFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+cHJldmlvdXNfYWN0aXZlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfQ09OTkVDVElPTl9QUklNQVJZOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX0NPTk5FQ1RJT05fQkFDS1VQOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTk5JX1NUQVRVU19DSEFOR0VEX0lEX1BSRVZJT1VTX0FDVElWRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TVEFUVVNfQ0hBTkdFRF9JRF9ORVdfQUNUSVZFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+bmV3X2FjdGl2ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX0NPTk5FQ1RJT05fUFJJTUFSWToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9DT05ORUNUSU9OX0JBQ0tVUDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX05OSV9TVEFUVVNfQ0hBTkdFRF9JRF9ORVdfQUNUSVZFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfbm5pX2F1dG9fY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X25uaV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdF9hbGFybV9yYWlzZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9BVVRPX0NGR19JRF9TVEFUVVNfQ0hBTkdFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0dXNfY2hhbmdlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9hdXRvX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X25uaV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnN0YXRfYWxhcm1fY2xlYXJlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhdF9hbGFybV9yYWlzZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9BVVRPX0NGR19JRF9TVEFUVVNfQ0hBTkdFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnN0YXR1c19jaGFuZ2VkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfbm5pX2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X25uaV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9BVVRPX0NGR19JRF9TVEFUVVNfQ0hBTkdFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfbm5pX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zdGF0X2FsYXJtX3JhaXNlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX0FVVE9fQ0ZHX0lEX1NUQVRVU19DSEFOR0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c3RhdHVzX2NoYW5nZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9hdXRvX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfQVVUT19DRkdfSURfU1RBVFVTX0NIQU5HRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ubmlfYXV0b19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X25uaV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X25uaV9hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF9ubmlfc2VyZGVzX2tleV9zZXRfZGVmYXVsdChiY21vbHRfbm5pX3NlcmRlc19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBvbl9uaSA9IChiY21vbHRfcG9uX25pKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19LRVlfSURfSU5TVEFOQ0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+aW5zdGFuY2UgPSBCQ01PTFRfU0VSREVTX0lOU1RBTkNFX0lOU1RBTkNFXzA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3NlcmRlc19rZXlfcGFjayhjb25zdCBiY21vbHRfbm5pX3NlcmRlc19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMtPnBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19LRVlfSURfSU5TVEFOQ0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc2VyZGVzX2luc3RhbmNlX3BhY2sodGhpcy0+aW5zdGFuY2UsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X25uaV9zZXJkZXNfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ubmlfc2VyZGVzX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0tFWV9JRF9JTlNUQU5DRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zZXJkZXNfa2V5X3VucGFjayhiY21vbHRfbm5pX3NlcmRlc19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAodWludDhfdCAqKSAmdGhpcy0+cG9uX25pKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0tFWV9JRF9JTlNUQU5DRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zZXJkZXNfaW5zdGFuY2VfdW5wYWNrKCZ0aGlzLT5pbnN0YW5jZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc2VyZGVzX2tleV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0tFWV9JRF9JTlNUQU5DRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zZXJkZXNfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfbm5pX3NlcmRlc19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfbm5pX3NlcmRlc19rZXlfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5wb25fbmkgPiAoYmNtb2x0X3Bvbl9uaSkgMTUpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9OTklfU0VSREVTX0tFWV9JRF9QT05fTkk7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfS0VZX0lEX0lOU1RBTkNFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+aW5zdGFuY2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NFUkRFU19JTlNUQU5DRV9JTlNUQU5DRV8wOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU0VSREVTX0lOU1RBTkNFX0lOU1RBTkNFXzE6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9OTklfU0VSREVTX0tFWV9JRF9JTlNUQU5DRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfVkdBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X3ZnYSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9QRikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9wZiA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9MRlBGKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2xmcGYgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFMSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9kZmUxID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfZGZlMiA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9ERkUzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2RmZTMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFNCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9kZmU0ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfZGZlNSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QUkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfcHJlID0gMTI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9NQUlOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X21haW4gPSAxMDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QT1NUMSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9wb3N0MSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QT1NUMikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9wb3N0MiA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QT1NUMykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9wb3N0MyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9BTVApKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfYW1wID0gMTI7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfVkdBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnJ4X3ZnYSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfUEYpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cnhfcGYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0xGUEYpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cnhfbGZwZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFMSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5yeF9kZmUxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9ERkUyKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9zOChidWYsIHRoaXMtPnJ4X2RmZTIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3M4KGJ1ZiwgdGhpcy0+cnhfZGZlMykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFNCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfczgoYnVmLCB0aGlzLT5yeF9kZmU0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9ERkU1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9zOChidWYsIHRoaXMtPnJ4X2RmZTUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX1BSRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT50eF9wcmUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX01BSU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dHhfbWFpbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfUE9TVDEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dHhfcG9zdDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QyKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9zOChidWYsIHRoaXMtPnR4X3Bvc3QyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QT1NUMykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfczgoYnVmLCB0aGlzLT50eF9wb3N0MykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfQU1QKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnR4X2FtcCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX1ZHQSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfUEYpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0xGUEYpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX1BSRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfTUFJTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfUE9TVDEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QyKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QT1NUMykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfQU1QKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YV91bnBhY2soYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9WR0EpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+cnhfdmdhKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9QRikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5yeF9wZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfTEZQRikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5yeF9sZnBmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9ERkUxKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnJ4X2RmZTEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfczgoYnVmLCAmdGhpcy0+cnhfZGZlMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFMykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9zOChidWYsICZ0aGlzLT5yeF9kZmUzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9ERkU0KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3M4KGJ1ZiwgJnRoaXMtPnJ4X2RmZTQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfczgoYnVmLCAmdGhpcy0+cnhfZGZlNSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfUFJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnR4X3ByZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfTUFJTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT50eF9tYWluKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QT1NUMSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT50eF9wb3N0MSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfUE9TVDIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfczgoYnVmLCAmdGhpcy0+dHhfcG9zdDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3M4KGJ1ZiwgJnRoaXMtPnR4X3Bvc3QzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9BTVApKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dHhfYW1wKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX1ZHQSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX1BGKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfTEZQRikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9ERkUyKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFMykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9ERkU1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfUFJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfTUFJTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QxKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfUE9TVDIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QT1NUMykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX0FNUCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX1ZHQSkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+cnhfdmdhID4gNDUpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9WR0E7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX1BGKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5yeF9wZiA+IDE1KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfUEY7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0xGUEYpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnJ4X2xmcGYgPiA3KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfTEZQRjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFMSkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+cnhfZGZlMSA+IDYzKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFMTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFMikpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+cnhfZGZlMiA8IC0zMSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTI7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGhpcy0+cnhfZGZlMiA+IDMxKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFMjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFMykpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+cnhfZGZlMyA8IC0zMSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTM7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGhpcy0+cnhfZGZlMyA+IDMxKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFMzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFNCkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+cnhfZGZlNCA8IC0xNSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTQ7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGhpcy0+cnhfZGZlNCA+IDE1KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFNDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFNSkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+cnhfZGZlNSA8IC0xNSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTU7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGhpcy0+cnhfZGZlNSA+IDE1KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFNTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfUFJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT50eF9wcmUgPiAzMSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX1BSRTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfTUFJTikpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+dHhfbWFpbiA+IDExMikKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX01BSU47CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QxKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT50eF9wb3N0MSA+IDYzKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfUE9TVDE7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QyKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT50eF9wb3N0MiA8IC0xNSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QyOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRoaXMtPnR4X3Bvc3QyID4gMTUpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QT1NUMjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfUE9TVDMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnR4X3Bvc3QzIDwgLTcpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QT1NUMzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0aGlzLT50eF9wb3N0MyA+IDcpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QT1NUMzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfQU1QKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT50eF9hbXAgPiAxNSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX0FNUDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfU09GVFdBUkVfRVJST1JfS0VZX0lEX1JFU0VSVkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJlc2VydmVkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0tFWV9JRF9JRFgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+aWR4ID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXlfcGFjayhjb25zdCBiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfU09GVFdBUkVfRVJST1JfS0VZX0lEX1JFU0VSVkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5yZXNlcnZlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfU09GVFdBUkVfRVJST1JfS0VZX0lEX0lEWCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+aWR4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0tFWV9JRF9SRVNFUlZFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfU09GVFdBUkVfRVJST1JfS0VZX0lEX0lEWCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleV91bnBhY2soYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0tFWV9JRF9SRVNFUlZFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+cmVzZXJ2ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0tFWV9JRF9JRFgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmlkeCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0tFWV9JRF9SRVNFUlZFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0tFWV9JRF9JRFgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9TT0ZUV0FSRV9FUlJPUl9DRkdfSURfRU5UUlkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZW50cnkuZmlyc3RfZXJyb3JfdGltZV91cyA9IDA7CisgICAgICAgIHRoaXMtPmVudHJ5Lmxhc3RfZXJyb3JfdGltZV91cyA9IDA7CisgICAgICAgIHRoaXMtPmVudHJ5LmxpbmVfbnVtYmVyID0gMDsKKyAgICAgICAgdGhpcy0+ZW50cnkuZXJyb3JfY291bnRlciA9IDA7CisgICAgICAgIHRoaXMtPmVudHJ5Lmluc3RhbmNlID0gMDsKKyAgICAgICAgbWVtc2V0KHRoaXMtPmVudHJ5LmZpbGVuYW1lLCAwLCA2NCk7CisgICAgICAgIG1lbXNldCh0aGlzLT5lbnRyeS50YXNrX25hbWUsIDAsIDY0KTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0NGR19JRF9FTlRSWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zd19lcnJvcl9wYWNrKCZ0aGlzLT5lbnRyeSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9TT0ZUV0FSRV9FUlJPUl9DRkdfSURfRU5UUlkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTU2OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhX3VucGFjayhiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9TT0ZUV0FSRV9FUlJPUl9DRkdfSURfRU5UUlkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3dfZXJyb3JfdW5wYWNrKCZ0aGlzLT5lbnRyeSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0NGR19JRF9FTlRSWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDE1NikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfU09GVFdBUkVfRVJST1JfQ0ZHX0lEX0VOVFJZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N3X2Vycm9yX2JvdW5kc19jaGVjaygmdGhpcy0+ZW50cnkpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfU09GVFdBUkVfRVJST1JfQ0ZHX0lEX0VOVFJZOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5X3NldF9kZWZhdWx0KGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9LRVlfSURfUkVTRVJWRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmVzZXJ2ZWQgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXlfcGFjayhjb25zdCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9LRVlfSURfUkVTRVJWRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnJlc2VydmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0tFWV9JRF9SRVNFUlZFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXlfdW5wYWNrKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0tFWV9JRF9SRVNFUlZFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+cmVzZXJ2ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0tFWV9JRF9SRVNFUlZFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXlfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9EQVRBX1dJTkRPVykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5kYXRhX3dpbmRvdy5sZW4gPSAwOworICAgICAgICB0aGlzLT5kYXRhX3dpbmRvdy52YWwgPSBOVUxMOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX1NUUk9CRV9XSU5ET1cpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3Ryb2JlX3dpbmRvdy5sZW4gPSAwOworICAgICAgICB0aGlzLT5zdHJvYmVfd2luZG93LnZhbCA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9SSVNFX01JTl9NSU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZWRnZV9yaXNlX21pbl9taW4gPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfUklTRV9NSU5fTUFYKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmVkZ2VfcmlzZV9taW5fbWF4ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9FREdFX1JJU0VfTUFYX01JTikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5lZGdlX3Jpc2VfbWF4X21pbiA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9SSVNFX01BWF9NQVgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZWRnZV9yaXNlX21heF9tYXggPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfRkFMTF9NSU5fTUlOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmVkZ2VfZmFsbF9taW5fbWluID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9FREdFX0ZBTExfTUlOX01BWCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5lZGdlX2ZhbGxfbWluX21heCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9GQUxMX01BWF9NSU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZWRnZV9mYWxsX21heF9taW4gPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfRkFMTF9NQVhfTUFYKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmVkZ2VfZmFsbF9tYXhfbWF4ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmVzdWx0ID0gQkNNT0xUX1JFU1VMVF9TVUNDRVNTOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0RBVEFfV0lORE9XKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3UzMl9saXN0X3UzMl9tYXhfNTAwX2hleF9wYWNrKCZ0aGlzLT5kYXRhX3dpbmRvdywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfU1RST0JFX1dJTkRPVykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF91MzJfbGlzdF91MzJfbWF4XzUwMF9oZXhfcGFjaygmdGhpcy0+c3Ryb2JlX3dpbmRvdywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9SSVNFX01JTl9NSU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmVkZ2VfcmlzZV9taW5fbWluKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9SSVNFX01JTl9NQVgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmVkZ2VfcmlzZV9taW5fbWF4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9SSVNFX01BWF9NSU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmVkZ2VfcmlzZV9tYXhfbWluKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9SSVNFX01BWF9NQVgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmVkZ2VfcmlzZV9tYXhfbWF4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9GQUxMX01JTl9NSU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmVkZ2VfZmFsbF9taW5fbWluKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9GQUxMX01JTl9NQVgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmVkZ2VfZmFsbF9taW5fbWF4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9GQUxMX01BWF9NSU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmVkZ2VfZmFsbF9tYXhfbWluKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9GQUxMX01BWF9NQVgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmVkZ2VfZmFsbF9tYXhfbWF4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3VsdF9wYWNrKHRoaXMtPnJlc3VsdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfREFUQV9XSU5ET1cpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X3UzMl9saXN0X3UzMl9tYXhfNTAwX2hleF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+ZGF0YV93aW5kb3cpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX1NUUk9CRV9XSU5ET1cpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X3UzMl9saXN0X3UzMl9tYXhfNTAwX2hleF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+c3Ryb2JlX3dpbmRvdyk7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9SSVNFX01JTl9NSU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9FREdFX1JJU0VfTUlOX01BWCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfUklTRV9NQVhfTUlOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9SSVNFX01BWF9NQVgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9FREdFX0ZBTExfTUlOX01JTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfRkFMTF9NSU5fTUFYKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9GQUxMX01BWF9NSU4pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9FREdFX0ZBTExfTUFYX01BWCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX1JFU1VMVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfREFUQV9XSU5ET1cpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdTMyX2xpc3RfdTMyX21heF81MDBfaGV4X3VucGFjaygmdGhpcy0+ZGF0YV93aW5kb3csIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfU1RST0JFX1dJTkRPVykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF91MzJfbGlzdF91MzJfbWF4XzUwMF9oZXhfdW5wYWNrKCZ0aGlzLT5zdHJvYmVfd2luZG93LCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfUklTRV9NSU5fTUlOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5lZGdlX3Jpc2VfbWluX21pbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfUklTRV9NSU5fTUFYKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5lZGdlX3Jpc2VfbWluX21heCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfUklTRV9NQVhfTUlOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5lZGdlX3Jpc2VfbWF4X21pbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfUklTRV9NQVhfTUFYKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5lZGdlX3Jpc2VfbWF4X21heCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfRkFMTF9NSU5fTUlOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5lZGdlX2ZhbGxfbWluX21pbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfRkFMTF9NSU5fTUFYKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5lZGdlX2ZhbGxfbWluX21heCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfRkFMTF9NQVhfTUlOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5lZGdlX2ZhbGxfbWF4X21pbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfRkFMTF9NQVhfTUFYKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5lZGdlX2ZhbGxfbWF4X21heCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX1JFU1VMVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfdW5wYWNrKCZ0aGlzLT5yZXN1bHQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0RBVEFfV0lORE9XKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3UzMl9saXN0X3UzMl9tYXhfNTAwX2hleF9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfU1RST0JFX1dJTkRPVykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF91MzJfbGlzdF91MzJfbWF4XzUwMF9oZXhfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfUklTRV9NSU5fTUlOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfUklTRV9NSU5fTUFYKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfUklTRV9NQVhfTUlOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfUklTRV9NQVhfTUFYKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfRkFMTF9NSU5fTUlOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfRkFMTF9NSU5fTUFYKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfRkFMTF9NQVhfTUlOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfRkFMTF9NQVhfTUFYKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX1JFU1VMVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9EQVRBX1dJTkRPVykpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+ZGF0YV93aW5kb3cubGVuIDwgMikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRoaXMtPmRhdGFfd2luZG93LmxlbiA+IDUwMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFiY21vbHRfdTMyX2xpc3RfdTMyX21heF81MDBfaGV4X2JvdW5kc19jaGVjaygmdGhpcy0+ZGF0YV93aW5kb3cpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0RBVEFfV0lORE9XOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfU1RST0JFX1dJTkRPVykpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+c3Ryb2JlX3dpbmRvdy5sZW4gPCAyKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGhpcy0+c3Ryb2JlX3dpbmRvdy5sZW4gPiA1MDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghYmNtb2x0X3UzMl9saXN0X3UzMl9tYXhfNTAwX2hleF9ib3VuZHNfY2hlY2soJnRoaXMtPnN0cm9iZV93aW5kb3cpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX1NUUk9CRV9XSU5ET1c7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5yZXN1bHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JFU1VMVF9TVUNDRVNTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVTVUxUX0ZBSUw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfUkVTVUxUOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9BVVRPX0NGR19JRF9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0FVVE9fQ0ZHX0lEX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+Y2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9BVVRPX0NGR19JRF9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQVVUT19DRkdfSURfQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0FVVE9fQ0ZHX0lEX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cG9uX25pID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9UUklHR0VSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnRyaWdnZXIgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1RSSUdHRVJfRVBPTl9TVEFUOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1NUUk9CRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdHJvYmUgPSBCQ01PTFRfQ0FQVFVSRV9TVFJPQkVfU0lHTkFMX0dQT05fQkNEUl9SRVNFVDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9XSU5ET1dfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT53aW5kb3dfbW9kZSA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fV0lORE9XX01PREVfUkFOR0lORzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b251X2lkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9UUklHR0VSX1BPU0lUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnRyaWdnZXJfcG9zaXRpb24gPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1RSSUdHRVJfUE9TSVRJT05fUklTSU5HOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1NUT1BfRFVFX1RPX0NPUlJVUFRfU1RST0JFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0b3BfZHVlX3RvX2NvcnJ1cHRfc3Ryb2JlID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfU1RBUlRfT0ZGU0VUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXJ0X29mZnNldCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfRU5EX09GRlNFVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5lbmRfb2Zmc2V0ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9OVU1CRVJfT0ZfQ1lDTEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm51bWJlcl9vZl9jeWNsZXMgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5wb25fbmkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9UUklHR0VSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyX3BhY2sodGhpcy0+dHJpZ2dlciwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfU1RST0JFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2NhcHR1cmVfc3Ryb2JlX3NpZ25hbF9wYWNrKHRoaXMtPnN0cm9iZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfV0lORE9XX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3dpbmRvd19tb2RlX3BhY2sodGhpcy0+d2luZG93X21vZGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+b251X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfVFJJR0dFUl9QT1NJVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF90cnhfY2FsaWJyYXRpb25fdHJpZ2dlcl9wb3NpdGlvbl9wYWNrKHRoaXMtPnRyaWdnZXJfcG9zaXRpb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1NUT1BfRFVFX1RPX0NPUlJVUFRfU1RST0JFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RvcF9kdWVfdG9fY29ycnVwdF9zdHJvYmUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9TVEFSVF9PRkZTRVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnN0YXJ0X29mZnNldCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX0VORF9PRkZTRVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmVuZF9vZmZzZXQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9OVU1CRVJfT0ZfQ1lDTEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPm51bWJlcl9vZl9jeWNsZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9UUklHR0VSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfU1RST0JFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfV0lORE9XX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9UUklHR0VSX1BPU0lUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfU1RPUF9EVUVfVE9fQ09SUlVQVF9TVFJPQkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9TVEFSVF9PRkZTRVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9FTkRfT0ZGU0VUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfTlVNQkVSX09GX0NZQ0xFUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhX3VucGFjayhiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1RSSUdHRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3RyaWdnZXJfdW5wYWNrKCZ0aGlzLT50cmlnZ2VyLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9TVFJPQkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfY2FwdHVyZV9zdHJvYmVfc2lnbmFsX3VucGFjaygmdGhpcy0+c3Ryb2JlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9XSU5ET1dfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF90cnhfY2FsaWJyYXRpb25fd2luZG93X21vZGVfdW5wYWNrKCZ0aGlzLT53aW5kb3dfbW9kZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5vbnVfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9UUklHR0VSX1BPU0lUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyX3Bvc2l0aW9uX3VucGFjaygmdGhpcy0+dHJpZ2dlcl9wb3NpdGlvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfU1RPUF9EVUVfVE9fQ09SUlVQVF9TVFJPQkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zdG9wX2R1ZV90b19jb3JydXB0X3N0cm9iZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1NUQVJUX09GRlNFVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+c3RhcnRfb2Zmc2V0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfRU5EX09GRlNFVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+ZW5kX29mZnNldCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX05VTUJFUl9PRl9DWUNMRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bnVtYmVyX29mX2N5Y2xlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9UUklHR0VSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1NUUk9CRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9XSU5ET1dfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfVFJJR0dFUl9QT1NJVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9TVE9QX0RVRV9UT19DT1JSVVBUX1NUUk9CRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9TVEFSVF9PRkZTRVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfRU5EX09GRlNFVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9OVU1CRVJfT0ZfQ1lDTEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1RSSUdHRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT50cmlnZ2VyKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fVFJJR0dFUl9FUE9OX1NUQVQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fVFJJR0dFUl9HUE9OX0JDRFJfUkVTRVQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fVFJJR0dFUl9HUE9OX1RSWF9SRVNFVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9UUklHR0VSX0dQT05fVFJYX0VEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1RSSUdHRVJfR1BPTl9SU1NJOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1RSSUdHRVJfR1BPTl9FT0I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fVFJJR0dFUl9HUE9OX1JBTkdJTkc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fVFJJR0dFUl9TRVJERVNfQlVSU1RfRU46CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfVFJJR0dFUjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9TVFJPQkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdHJvYmUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0NBUFRVUkVfU1RST0JFX1NJR05BTF9HUE9OX0JDRFJfUkVTRVQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9DQVBUVVJFX1NUUk9CRV9TSUdOQUxfR1BPTl9UUlhfRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9DQVBUVVJFX1NUUk9CRV9TSUdOQUxfR1BPTl9SU1NJOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQ0FQVFVSRV9TVFJPQkVfU0lHTkFMX0dQT05fRU9COgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQ0FQVFVSRV9TVFJPQkVfU0lHTkFMX1NFUkRFU19CVVJTVF9FTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0NBUFRVUkVfU1RST0JFX1NJR05BTF9TRVJERVNfUlhfTE9DSzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9TVFJPQkU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfV0lORE9XX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT53aW5kb3dfbW9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1dJTkRPV19NT0RFX1JBTkdJTkc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fV0lORE9XX01PREVfTk9OX1JBTkdJTkc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fV0lORE9XX01PREVfQk9USDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9XSU5ET1dfTU9ERTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9UUklHR0VSX1BPU0lUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+dHJpZ2dlcl9wb3NpdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1RSSUdHRVJfUE9TSVRJT05fUklTSU5HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1RSSUdHRVJfUE9TSVRJT05fRkFMTElORzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9UUklHR0VSX1BPU0lUSU9OOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RPUF9DQVBUVVJFX1dJTkRPV19JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cG9uX25pID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvd19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RPUF9DQVBUVVJFX1dJTkRPV19JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cG9uX25pKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUT1BfQ0FQVFVSRV9XSU5ET1dfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfZGF0YV91bnBhY2soYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RPUF9DQVBUVVJFX1dJTkRPV19JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+cG9uX25pKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvd19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVE9QX0NBUFRVUkVfV0lORE9XX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvd19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2FsbG9jX2tleV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fYWxsb2Nfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0tFWV9JRF9BTExPQ19JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hbGxvY19pZCA9IChiY21vbHRfeGdwb25fYWxsb2NfaWQpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfa2V5X3BhY2soY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMtPnBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfS0VZX0lEX0FMTE9DX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPmFsbG9jX2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fYWxsb2Nfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0tFWV9JRF9BTExPQ19JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2tleV91bnBhY2soYmNtb2x0X3hncG9uX2FsbG9jX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAodWludDhfdCAqKSAmdGhpcy0+cG9uX25pKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19LRVlfSURfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5hbGxvY19pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19LRVlfSURfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fYWxsb2Nfa2V5X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnBvbl9uaSA+IChiY21vbHRfeGdwb25fbmkpIDcpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9BTExPQ19LRVlfSURfUE9OX05JOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19LRVlfSURfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmFsbG9jX2lkID4gKGJjbW9sdF94Z3Bvbl9hbGxvY19pZCkgMTYzODMpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9BTExPQ19LRVlfSURfQUxMT0NfSUQ7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9hbGxvY19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdGUgPSBCQ01PTFRfQUxMT0NfU1RBVEVfTk9UX0NPTkZJR1VSRUQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfU0xBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnNsYS5jYnJfcnRfYncgPSAwOworICAgICAgICB0aGlzLT5zbGEuY2JyX25ydF9idyA9IDA7CisgICAgICAgIHRoaXMtPnNsYS5ndWFyYW50ZWVkX2J3ID0gMDsKKyAgICAgICAgdGhpcy0+c2xhLm1heGltdW1fYncgPSAwOworICAgICAgICB0aGlzLT5zbGEuYWRkaXRpb25hbF9id19lbGlnaWJpbGl0eSA9IEJDTU9MVF9BRERJVElPTkFMX0JXX0VMSUdJQklMSVRZX05PTkU7CisgICAgICAgIHRoaXMtPnNsYS5jYnJfcnRfY29tcGVuc2F0aW9uID0gQkNNT1NfRkFMU0U7CisgICAgICAgIHRoaXMtPnNsYS5jYnJfcnRfYXBfaW5kZXggPSAwOworICAgICAgICB0aGlzLT5zbGEuY2JyX25ydF9hcF9pbmRleCA9IDA7CisgICAgICAgIHRoaXMtPnNsYS5hbGxvY190eXBlID0gQkNNT0xUX0FMTE9DX1RZUEVfTk9ORTsKKyAgICAgICAgdGhpcy0+c2xhLndlaWdodCA9IDA7CisgICAgICAgIHRoaXMtPnNsYS5wcmlvcml0eSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9udV9pZCA9IChiY21vbHRfeGdwb25fb251X2lkKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfQ0ZHX0lEX0NPTExFQ1RfU1RBVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Y29sbGVjdF9zdGF0cyA9IEJDTU9TX0ZBTFNFOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfQ0ZHX0lEX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2FsbG9jX3N0YXRlX3BhY2sodGhpcy0+c3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfQ0ZHX0lEX1NMQSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fYWxsb2Nfc2xhX3BhY2soJnRoaXMtPnNsYSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPm9udV9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfQ0ZHX0lEX0NPTExFQ1RfU1RBVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5jb2xsZWN0X3N0YXRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fYWxsb2NfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0NGR19JRF9TTEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjM7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfQ09MTEVDVF9TVEFUUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhX3VucGFjayhiY21vbHRfeGdwb25fYWxsb2NfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYWxsb2Nfc3RhdGVfdW5wYWNrKCZ0aGlzLT5zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfU0xBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bvbl9hbGxvY19zbGFfdW5wYWNrKCZ0aGlzLT5zbGEsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+b251X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfQ09MTEVDVF9TVEFUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmNvbGxlY3Rfc3RhdHMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0NGR19JRF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0NGR19JRF9TTEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyMykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfQ0ZHX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0NGR19JRF9DT0xMRUNUX1NUQVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2NfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9hbGxvY19jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfQ0ZHX0lEX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FMTE9DX1NUQVRFX05PVF9DT05GSUdVUkVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUxMT0NfU1RBVEVfSU5BQ1RJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BTExPQ19TVEFURV9QUk9DRVNTSU5HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUxMT0NfU1RBVEVfQUNUSVZFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fQUxMT0NfQ0ZHX0lEX1NUQVRFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfQ0ZHX0lEX1NMQSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fYWxsb2Nfc2xhX2JvdW5kc19jaGVjaygmdGhpcy0+c2xhKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX0FMTE9DX0NGR19JRF9TTEE7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0NGR19JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPm9udV9pZCA+IChiY21vbHRfeGdwb25fb251X2lkKSA1MTEpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfT05VX0lEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0lEX1JYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2J5dGVzID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9JRF9SWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfYnl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9JRF9SWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX1NUQVRfSURfUlhfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9JRF9SWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNmZy50cmlnZ2VyLnR5cGUgPSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOworICAgICAgICB0aGlzLT5jZmcuc29hay5hY3RpdmVfc29ha190aW1lID0gMDsKKyAgICAgICAgdGhpcy0+Y2ZnLnNvYWsuY2xlYXJfc29ha190aW1lID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfcGFjaygmdGhpcy0+Y2ZnLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5jZmcpOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3VucGFjaygmdGhpcy0+Y2ZnLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2JvdW5kc19jaGVjaygmdGhpcy0+Y2ZnKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX0FMTE9DX1NUQVRfQ0ZHX0lEX0NGRzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdHVzID0gQkNNT0xUX1JFU1VMVF9TVUNDRVNTOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfTkVXX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm5ld19zdGF0ZSA9IEJDTU9MVF9BTExPQ19TVEFURV9OT1RfQ09ORklHVVJFRDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzdWx0X3BhY2sodGhpcy0+c3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX05FV19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hbGxvY19zdGF0ZV9wYWNrKHRoaXMtPm5ld19zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9ORVdfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfdW5wYWNrKCZ0aGlzLT5zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfTkVXX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2FsbG9jX3N0YXRlX3VucGFjaygmdGhpcy0+bmV3X3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfTkVXX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SRVNVTFRfU1VDQ0VTUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JFU1VMVF9GQUlMOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfU1RBVFVTOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfTkVXX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+bmV3X3N0YXRlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BTExPQ19TVEFURV9OT1RfQ09ORklHVVJFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FMTE9DX1NUQVRFX0lOQUNUSVZFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUxMT0NfU1RBVEVfUFJPQ0VTU0lORzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FMTE9DX1NUQVRFX0FDVElWRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX05FV19TVEFURTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXR1cyA9IEJDTU9MVF9SRVNVTFRfU1VDQ0VTUzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfQVZFUkFHRV9OU1JfVVNFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hdmVyYWdlX25zcl91c2VkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfQVZFUkFHRV9OU1JfQUxMT0NBVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmF2ZXJhZ2VfbnNyX2FsbG9jYXRlZCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX0FWRVJBR0VfU1JfUkVQT1JUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmF2ZXJhZ2Vfc3JfcmVwb3J0ID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzdWx0X3BhY2sodGhpcy0+c3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfQVZFUkFHRV9OU1JfVVNFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+YXZlcmFnZV9uc3JfdXNlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX05TUl9BTExPQ0FURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmF2ZXJhZ2VfbnNyX2FsbG9jYXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX1NSX1JFUE9SVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+YXZlcmFnZV9zcl9yZXBvcnQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfQVZFUkFHRV9OU1JfVVNFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX05TUl9BTExPQ0FURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfQVZFUkFHRV9TUl9SRVBPUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfdW5wYWNrKCZ0aGlzLT5zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX05TUl9VU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5hdmVyYWdlX25zcl91c2VkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX0FWRVJBR0VfTlNSX0FMTE9DQVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+YXZlcmFnZV9uc3JfYWxsb2NhdGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX0FWRVJBR0VfU1JfUkVQT1JUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5hdmVyYWdlX3NyX3JlcG9ydCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX05TUl9VU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX05TUl9BTExPQ0FURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX0FWRVJBR0VfU1JfUkVQT1JUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JFU1VMVF9TVUNDRVNTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVTVUxUX0ZBSUw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX1NUQVRVUzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0ID0gQkNNT0xUX1hHUE9OX0FMTE9DX1NUQVRfSURfUlhfQllURVM7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2lkX3BhY2sodGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2lkX3VucGFjaygmdGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9JRF9SWF9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX0FMTE9DX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXQgPSBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9JRF9SWF9CWVRFUzsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfaWRfcGFjayh0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfaWRfdW5wYWNrKCZ0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0KQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0lEX1JYX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19DRkdfSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Y29uZmlndXJhdGlvbl9jb21wbGV0ZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX0dFVF9BTExPQ19TVEFUU19DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Z2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXRfYWxhcm1fY2xlYXJlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdF9hbGFybV9yYWlzZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19BVVRPX0NGR19JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmNvbmZpZ3VyYXRpb25fY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19BVVRPX0NGR19JRF9HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+Z2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19DRkdfSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX0dFVF9BTExPQ19TVEFUU19DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+Y29uZmlndXJhdGlvbl9jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX0dFVF9BTExPQ19TVEFUU19DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zdGF0X2FsYXJtX2NsZWFyZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c3RhdF9hbGFybV9yYWlzZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19DRkdfSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19BVVRPX0NGR19JRF9HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX1NUQVRTX0lEX05VTV9PRl9DWUNMRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bnVtX29mX2N5Y2xlcyA9IDE7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19HRVRfU1RBVFNfSURfTlVNX09GX0NZQ0xFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+bnVtX29mX2N5Y2xlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX1NUQVRTX0lEX05VTV9PRl9DWUNMRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX1NUQVRTX0lEX05VTV9PRl9DWUNMRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPm51bV9vZl9jeWNsZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0dFVF9TVEFUU19JRF9OVU1fT0ZfQ1lDTEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX1NUQVRTX0lEX05VTV9PRl9DWUNMRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPm51bV9vZl9jeWNsZXMgPCAxKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX1NUQVRTX0lEX05VTV9PRl9DWUNMRVM7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19TRVRfU1RBVEVfSURfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdGUgPSBCQ01PTFRfQUxMT0NfT1BFUkFUSU9OX0FDVElWQVRFOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfU0VUX1NUQVRFX0lEX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2FsbG9jX29wZXJhdGlvbl9wYWNrKHRoaXMtPnN0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX1NFVF9TVEFURV9JRF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9BTExPQ19TRVRfU1RBVEVfSURfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYWxsb2Nfb3BlcmF0aW9uX3VucGFjaygmdGhpcy0+c3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfU0VUX1NUQVRFX0lEX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fQUxMT0NfU0VUX1NUQVRFX0lEX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FMTE9DX09QRVJBVElPTl9BQ1RJVkFURToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FMTE9DX09QRVJBVElPTl9ERUFDVElWQVRFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fQUxMT0NfU0VUX1NUQVRFX0lEX1NUQVRFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfS0VZX0lEX0dFTV9QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmdlbV9wb3J0X2lkID0gKGJjbW9sdF94Z3Bvbl9nZW1faWQpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5X3BhY2soY29uc3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMtPnBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfS0VZX0lEX0dFTV9QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPmdlbV9wb3J0X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0tFWV9JRF9HRU1fUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleV91bnBhY2soYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAodWludDhfdCAqKSAmdGhpcy0+cG9uX25pKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9LRVlfSURfR0VNX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5nZW1fcG9ydF9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9LRVlfSURfR0VNX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnBvbl9uaSA+IChiY21vbHRfeGdwb25fbmkpIDcpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9LRVlfSURfUE9OX05JOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9LRVlfSURfR0VNX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmdlbV9wb3J0X2lkID4gKGJjbW9sdF94Z3Bvbl9nZW1faWQpIDY1NTMzVSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0tFWV9JRF9HRU1fUE9SVF9JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNvbmZpZ3VyYXRpb24uZGlyZWN0aW9uID0gQkNNT0xUX0dFTV9QT1JUX0RJUkVDVElPTl9ET1dOU1RSRUFNOworICAgICAgICB0aGlzLT5jb25maWd1cmF0aW9uLnR5cGUgPSBCQ01PTFRfR0VNX1BPUlRfVFlQRV9VTklDQVNUOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vbnVfaWQgPSAoYmNtb2x0X3hncG9uX29udV9pZCkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9HRU1fUE9SVF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5nZW1fcG9ydF9zdGF0ZSA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFURV9OT1RfQ09ORklHVVJFRDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9FTkNSWVBUSU9OX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZW5jcnlwdGlvbl9tb2RlID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9VUFNUUkVBTV9ERVNUSU5BVElPTl9RVUVVRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT51cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSA9IEJDTU9MVF9VU19HRU1fUE9SVF9ERVNUSU5BVElPTl9EQVRBOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Y29udHJvbCA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfQ09ORklHVVJBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9nZW1fcG9ydF9jb25maWd1cmF0aW9uX3BhY2soJnRoaXMtPmNvbmZpZ3VyYXRpb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5vbnVfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9HRU1fUE9SVF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0ZV9wYWNrKHRoaXMtPmdlbV9wb3J0X3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9FTkNSWVBUSU9OX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfY29udHJvbF9zdGF0ZV9wYWNrKHRoaXMtPmVuY3J5cHRpb25fbW9kZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfVVBTVFJFQU1fREVTVElOQVRJT05fUVVFVUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdXNfZ2VtX3BvcnRfZGVzdGluYXRpb25fcGFjayh0aGlzLT51cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9jb250cm9sX3N0YXRlX3BhY2sodGhpcy0+Y29udHJvbCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfQ09ORklHVVJBVElPTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX0dFTV9QT1JUX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfRU5DUllQVElPTl9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfVVBTVFJFQU1fREVTVElOQVRJT05fUVVFVUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fdW5wYWNrKCZ0aGlzLT5jb25maWd1cmF0aW9uLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPm9udV9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX0dFTV9QT1JUX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRlX3VucGFjaygmdGhpcy0+Z2VtX3BvcnRfc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX0VOQ1JZUFRJT05fTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9jb250cm9sX3N0YXRlX3VucGFjaygmdGhpcy0+ZW5jcnlwdGlvbl9tb2RlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9VUFNUUkVBTV9ERVNUSU5BVElPTl9RVUVVRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF91c19nZW1fcG9ydF9kZXN0aW5hdGlvbl91bnBhY2soJnRoaXMtPnVwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfdW5wYWNrKCZ0aGlzLT5jb250cm9sLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9HRU1fUE9SVF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9FTkNSWVBUSU9OX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfVVBTVFJFQU1fREVTVElOQVRJT05fUVVFVUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fYm91bmRzX2NoZWNrKCZ0aGlzLT5jb25maWd1cmF0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9DT05GSUdVUkFUSU9OOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5vbnVfaWQgPiAoYmNtb2x0X3hncG9uX29udV9pZCkgNTExKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX09OVV9JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX0dFTV9QT1JUX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+Z2VtX3BvcnRfc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRFX05PVF9DT05GSUdVUkVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVEVfSU5BQ1RJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFURV9BQ1RJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfR0VNX1BPUlRfU1RBVEU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfRU5DUllQVElPTl9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+ZW5jcnlwdGlvbl9tb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9DT05UUk9MX1NUQVRFX0VOQUJMRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9FTkNSWVBUSU9OX01PREU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfVVBTVFJFQU1fREVTVElOQVRJT05fUVVFVUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT51cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfVVNfR0VNX1BPUlRfREVTVElOQVRJT05fREFUQToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1VTX0dFTV9QT1JUX0RFU1RJTkFUSU9OX0NQVToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1VTX0dFTV9QT1JUX0RFU1RJTkFUSU9OX09NQ0k6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfVVBTVFJFQU1fREVTVElOQVRJT05fUVVFVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmNvbnRyb2wpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0NPTlRST0xfU1RBVEVfRU5BQkxFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX0NPTlRST0w7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1RYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X2J5dGVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfSURfVFhfUEFDS0VUUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9wYWNrZXRzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfSURfUlhfUEFDS0VUUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9wYWNrZXRzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfSURfUlhfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfYnl0ZXMgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1RYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9JRF9UWF9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9wYWNrZXRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1JYX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X3BhY2tldHMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfSURfUlhfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfSURfVFhfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfSURfVFhfUEFDS0VUUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1JYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9JRF9UWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfYnl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfSURfVFhfUEFDS0VUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfcGFja2V0cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9wYWNrZXRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1JYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfSURfVFhfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1RYX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1JYX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1JYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Y2ZnLnRyaWdnZXIudHlwZSA9IEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX05PTkU7CisgICAgICAgIHRoaXMtPmNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgPSAwOworICAgICAgICB0aGlzLT5jZmcuc29hay5jbGVhcl9zb2FrX3RpbWUgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ19wYWNrKCZ0aGlzLT5jZmcsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSBiY21vbHRfc3RhdF9hbGFybV9jb25maWdfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmNmZyk7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfdW5wYWNrKCZ0aGlzLT5jZmcsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ19zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfYm91bmRzX2NoZWNrKCZ0aGlzLT5jZmcpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9DRkdfSURfQ0ZHOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdCA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1RYX0JZVEVTOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9pZF9wYWNrKHRoaXMtPnN0YXQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9pZF91bnBhY2soJnRoaXMtPnN0YXQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnN0YXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfSURfVFhfQllURVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1RYX1BBQ0tFVFM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1JYX1BBQ0tFVFM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1JYX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdCA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1RYX0JZVEVTOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9pZF9wYWNrKHRoaXMtPnN0YXQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9pZF91bnBhY2soJnRoaXMtPnN0YXQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnN0YXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfSURfVFhfQllURVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1RYX1BBQ0tFVFM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1JYX1BBQ0tFVFM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1JYX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXRfYWxhcm1fY2xlYXJlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdF9hbGFybV9yYWlzZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5zdGF0X2FsYXJtX2NsZWFyZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhdF9hbGFybV9yYWlzZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zdGF0X2FsYXJtX2NsZWFyZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c3RhdF9hbGFybV9yYWlzZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9pd2Zfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9pd2Zfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0lXRl9LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25faXdmX2tleV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9pd2Zfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fSVdGX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMtPnBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX2l3Zl9rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX2l3Zl9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0lXRl9LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25faXdmX2tleV91bnBhY2soYmNtb2x0X3hncG9uX2l3Zl9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9JV0ZfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICh1aW50OF90ICopICZ0aGlzLT5wb25fbmkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2l3Zl9rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fSVdGX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9pd2Zfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25faXdmX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9pd2Zfa2V5X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0lXRl9LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5wb25fbmkgPiAoYmNtb2x0X3hncG9uX25pKSA3KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fSVdGX0tFWV9JRF9QT05fTkk7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2l3Zl9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25faXdmX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0lXRl9DRkdfSURfVVNfT1RBR19ESVJFQ1RfVFBJRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT51c19vdGFnX2RpcmVjdF90cGlkID0gMzMwMjRVOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fSVdGX0NGR19JRF9EU19UUElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRzX3RwaWQuYXJyWzBdID0gMzMwMjRVOworICAgICAgICB0aGlzLT5kc190cGlkLmFyclsxXSA9IDM0OTg0VTsKKyAgICAgICAgdGhpcy0+ZHNfdHBpZC5hcnJbMl0gPSAzNzEyMFU7CisgICAgICAgIHRoaXMtPmRzX3RwaWQuYXJyWzNdID0gMzczNzZVOworICAgICAgICB0aGlzLT5kc190cGlkLmFycls0XSA9IDMzMDI0VTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25faXdmX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fSVdGX0NGR19JRF9VU19PVEFHX0RJUkVDVF9UUElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51c19vdGFnX2RpcmVjdF90cGlkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9JV0ZfQ0ZHX0lEX0RTX1RQSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXJyX3UxNl81X2hleF9wYWNrKCZ0aGlzLT5kc190cGlkLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX2l3Zl9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fSVdGX0NGR19JRF9VU19PVEFHX0RJUkVDVF9UUElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9JV0ZfQ0ZHX0lEX0RTX1RQSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTA7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25faXdmX2NmZ19kYXRhX3VucGFjayhiY21vbHRfeGdwb25faXdmX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fSVdGX0NGR19JRF9VU19PVEFHX0RJUkVDVF9UUElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51c19vdGFnX2RpcmVjdF90cGlkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9JV0ZfQ0ZHX0lEX0RTX1RQSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXJyX3UxNl81X2hleF91bnBhY2soJnRoaXMtPmRzX3RwaWQsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fSVdGX0NGR19JRF9VU19PVEFHX0RJUkVDVF9UUElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fSVdGX0NGR19JRF9EU19UUElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTApKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2l3Zl9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX2l3Zl9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX0lXRl9DRkdfSURfRFNfVFBJRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfdTE2XzVfaGV4X2JvdW5kc19jaGVjaygmdGhpcy0+ZHNfdHBpZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9JV0ZfQ0ZHX0lEX0RTX1RQSUQ7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX25pX2tleV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9rZXlfcGFjayhjb25zdCBiY21vbHRfeGdwb25fbmlfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcy0+cG9uX25pKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9rZXlfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgKHVpbnQ4X3QgKikgJnRoaXMtPnBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fbmlfa2V5X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnBvbl9uaSA+IChiY21vbHRfeGdwb25fbmkpIDcpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9LRVlfSURfUE9OX05JOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0hXX1BPTl9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5od19wb25faWQucG9uX2lkXzEgPSAwOworICAgICAgICB0aGlzLT5od19wb25faWQucG9uX2lkXzIgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0FWQUlMQUJMRV9CQU5EV0lEVEgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YXZhaWxhYmxlX2JhbmR3aWR0aC5jYnJfYncgPSAwOworICAgICAgICB0aGlzLT5hdmFpbGFibGVfYmFuZHdpZHRoLnRvdGFsX2J3ID0gMDsKKyAgICAgICAgdGhpcy0+YXZhaWxhYmxlX2JhbmR3aWR0aC5uZXh0X29udV90b3RhbF9idyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTlVNQkVSX09GX0FDVElWRV9PTlVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm51bWJlcl9vZl9hY3RpdmVfb251cyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUE9OX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wb25fc3RhdHVzLnN0YXRlID0gQkNNT0xUX1BPTl9TVEFURV9JTkFDVElWRTsKKyAgICAgICAgdGhpcy0+cG9uX3N0YXR1cy5sb3Nfc3RhdHVzID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUE9OX0RJU1RBTkNFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBvbl9kaXN0YW5jZS5tYXhfbG9nX2Rpc3RhbmNlID0gMjA7CisgICAgICAgIHRoaXMtPnBvbl9kaXN0YW5jZS5tYXhfZGlmZl9yZWFjaCA9IDIwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1JBTkdJTkdfV0lORE9XX1NJWkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmFuZ2luZ193aW5kb3dfc2l6ZSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfRVFEX0NZQ0xFU19OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZXFkX2N5Y2xlc19udW1iZXIgPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RSSUZUX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZHJpZnRfY29udHJvbC5kcmlmdF9pbnRlcnZhbCA9IDEwMDA7CisgICAgICAgIHRoaXMtPmRyaWZ0X2NvbnRyb2wuZHJpZnRfbGltaXQgPSA4OworICAgICAgICB0aGlzLT5kcmlmdF9jb250cm9sLnRyYW5zbWlzc2lvbl9jb250cm9sX2xpbWl0ID0gMTY7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTE9TX0FMQVJNX1RIUkVTSE9MRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5sb3NfYWxhcm1fdGhyZXNob2xkID0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9MT1NfSU5JVElBTF9WQUxVRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5sb3NfaW5pdGlhbF92YWx1ZSA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX09OVV9BTEFSTVNfVEhSRVNIT0xEUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vbnVfYWxhcm1zX3RocmVzaG9sZHMubG9zaSA9IDQ7CisgICAgICAgIHRoaXMtPm9udV9hbGFybXNfdGhyZXNob2xkcy5sb2JpID0gNDsKKyAgICAgICAgdGhpcy0+b251X2FsYXJtc190aHJlc2hvbGRzLmxvb2NpID0gMzsKKyAgICAgICAgdGhpcy0+b251X2FsYXJtc190aHJlc2hvbGRzLmxvcGNpID0gMzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9CRVJfTU9OSVRPUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5iZXJfbW9uaXRvci51c19iZXJfaW50ZXJ2YWwgPSA1MDAwOworICAgICAgICB0aGlzLT5iZXJfbW9uaXRvci5zZl90aHJlc2hvbGQgPSAzOworICAgICAgICB0aGlzLT5iZXJfbW9uaXRvci5zZF90aHJlc2hvbGQgPSA1OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX09OVV9BQ1RJVkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9udV9hY3RpdmF0aW9uLmtleV9leGNoYW5nZSA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU7CisgICAgICAgIHRoaXMtPm9udV9hY3RpdmF0aW9uLmZhaWxfZHVlX3RvX3JlZ2lzX2F1dG9fZmFpbCA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0VOQUJMRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9TTl9BQ1FVSVNJVElPTikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zbl9hY3F1aXNpdGlvbi5pbnRlcnZhbCA9IDEwMDA7CisgICAgICAgIHRoaXMtPnNuX2FjcXVpc2l0aW9uLmNvbnRyb2wgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOworICAgICAgICB0aGlzLT5zbl9hY3F1aXNpdGlvbi5vbnVfcG9zdF9kaXNjb3ZlcnlfbW9kZSA9IEJDTU9MVF9PTlVfUE9TVF9ESVNDT1ZFUllfTU9ERV9OT05FOworICAgICAgICB0aGlzLT5zbl9hY3F1aXNpdGlvbi5idXJzdF9wcm9maWxlID0gKGJjbW9sdF9idXJzdF9wcm9maWxlX2luZGV4KSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0tFWV9FWENIQU5HRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5rZXlfZXhjaGFuZ2UuaW50ZXJ2YWwgPSAxMDAwMDsKKyAgICAgICAgdGhpcy0+a2V5X2V4Y2hhbmdlLmNvbnRyb2wgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOworICAgICAgICB0aGlzLT5rZXlfZXhjaGFuZ2UuZW5jcnlwdGVkX3BvcnRzX29ubHkgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnByb3RlY3Rpb25fc3dpdGNoaW5nLnRpbWVvdXQgPSAxMDA7CisgICAgICAgIHRoaXMtPnByb3RlY3Rpb25fc3dpdGNoaW5nLmdwaW9fcGluID0gQkNNT0xUX0dQSU9fUElOX1VOQ09ORklHVVJFRDsKKyAgICAgICAgdGhpcy0+cHJvdGVjdGlvbl9zd2l0Y2hpbmcuZmFzdF9yYW5naW5nID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfREVCVUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWcuZGF0YV9tYXBfZGVsYXlfbXMgPSAwOworICAgICAgICB0aGlzLT5wcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1Zy5yZXJhbmdlX3NlbmRfcmFuZ2luZ190aW1lID0gQkNNT1NfRkFMU0U7CisgICAgICAgIHRoaXMtPnByb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnLnJlcmFuZ2Vfc2VuZF9yYW5naW5nX3RpbWVfZGVsYXkgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0NCUl9SVF9BTExPQ0FUSU9OX1BST0ZJTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Y2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZS5tYV83ID0gNjQ7CisgICAgICAgIHRoaXMtPmNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUubWFfMyA9IDI1NjsKKyAgICAgICAgdGhpcy0+Y2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZS5tYV8xID0gNTEyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0NCUl9OUlRfQUxMT0NBVElPTl9QUk9GSUxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlLmFyclswXSA9IDQwOTY7CisgICAgICAgIHRoaXMtPmNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlLmFyclsxXSA9IDgxOTI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUE9XRVJfTUFOQUdFTUVOVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wb3dlcl9tYW5hZ2VtZW50Lmlsb3dwb3dlciA9IDE2MDA7CisgICAgICAgIHRoaXMtPnBvd2VyX21hbmFnZW1lbnQuaWF3YXJlID0gMTYwOworICAgICAgICB0aGlzLT5wb3dlcl9tYW5hZ2VtZW50Lml0cmFuc2luaXQgPSA4MDsKKyAgICAgICAgdGhpcy0+cG93ZXJfbWFuYWdlbWVudC5pdHhpbml0ID0gNDA7CisgICAgICAgIHRoaXMtPnBvd2VyX21hbmFnZW1lbnQuaXJ4b2ZmID0gMTYwMDsKKyAgICAgICAgdGhpcy0+cG93ZXJfbWFuYWdlbWVudC5sb3dfcG93ZXJfY2xvYmkgPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1JPR1VFX09OVV9ERVRFQ1RJT05fUFJPQ0VTUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuY29udHJvbCA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU7CisgICAgICAgIHRoaXMtPnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFsZ29yaXRobV90eXBlID0gQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9BTEdPUklUSE1fVFlQRV9FQVJMWV9ST0dVRV9ERVRFQ1RJT047CisgICAgICAgIHRoaXMtPnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuZWFybHlfcm9ndWVfZGV0ZWN0aW9uLm1lYXN1cmVtZW50X3R5cGUgPSBCQ01PTFRfUk9HVUVfREVURUNUSU9OX1dJTkRPV19TSUxFTlRfV0lORE9XOworICAgICAgICB0aGlzLT5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS51LmVhcmx5X3JvZ3VlX2RldGVjdGlvbi5pbnRlcnZhbCA9IDEwMDAwOworICAgICAgICB0aGlzLT5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS51LmVhcmx5X3JvZ3VlX2RldGVjdGlvbi5zZWNvbmRfcmFuZ2luZ193aW5kb3cgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgdGhpcy0+cm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0udS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24uYWxsb2NfdHlwZV90b19zY2FuID0gQkNNT0xUX0FMTE9DX1RZUEVfVE9fU0NBTl9BTEw7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUEVSSU9ESUNfU1RBTkRCWV9QT05fTU9OSVRPUklORykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nLmludGVydmFsID0gNTAwMDsKKyAgICAgICAgdGhpcy0+cGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZy5jb250cm9sID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EQkFfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5kYmFfbW9kZSA9IEJDTU9MVF9EQkFfTU9ERV9OT1JNQUw7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUExPQU1fSEFORExJTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cGxvYW1faGFuZGxpbmcuYWNrX3RpbWVvdXQgPSAyMDAwOworICAgICAgICB0aGlzLT5wbG9hbV9oYW5kbGluZy5yZXRyYW5zX3JhbmdpbmdfdGltZSA9IDA7CisgICAgICAgIHRoaXMtPnBsb2FtX2hhbmRsaW5nLnJldHJhbnNfYXNzaWduX2FsbG9jX2lkID0gMDsKKyAgICAgICAgdGhpcy0+cGxvYW1faGFuZGxpbmcucmV0cmFuc19rZXlfY29udHJvbCA9IDA7CisgICAgICAgIHRoaXMtPnBsb2FtX2hhbmRsaW5nLnJldHJhbnNfcmVxdWVzdF9yZWdpc3RyYXRpb24gPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX01JTl9EQVRBX0FMTE9DX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm1pbl9kYXRhX2FsbG9jX2lkID0gKGJjbW9sdF94Z3Bvbl9hbGxvY19pZCkgMTAyNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9NSU5fREFUQV9HRU1fUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5taW5fZGF0YV9nZW1fcG9ydF9pZCA9IChiY21vbHRfeGdwb25fZ2VtX2lkKSAxMDI0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX01VTFRJQ0FTVF9LRVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgbWVtc2V0KHRoaXMtPm11bHRpY2FzdF9rZXkua2V5LmJ5dGVzLCAwLCBzaXplb2YodGhpcy0+bXVsdGljYXN0X2tleS5rZXkuYnl0ZXMpKTsKKyAgICAgICAgdGhpcy0+bXVsdGljYXN0X2tleS5rZXlfY29udHJvbCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wcmJzX2NoZWNrZXIucG9seW5vbSA9IEJDTU9MVF9QUkJTX1BPTFlOT01JQUxfUFJCU183OworICAgICAgICB0aGlzLT5wcmJzX2NoZWNrZXIubW9kZSA9IEJDTU9MVF9QUkJTX0NIRUNLRVJfTU9ERV9TRUxGX1NZTkM7CisgICAgICAgIHRoaXMtPnByYnNfY2hlY2tlci5kYXRhX2ludmVydCA9IEJDTU9TX0ZBTFNFOworICAgICAgICB0aGlzLT5wcmJzX2NoZWNrZXIuY29udHJvbCA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJCU19HRU5FUkFUT1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cHJic19nZW5lcmF0b3IucG9seW5vbSA9IEJDTU9MVF9QUkJTX1BPTFlOT01JQUxfUFJCU183OworICAgICAgICB0aGlzLT5wcmJzX2dlbmVyYXRvci5lcnJvcl9pbnNlcnQgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgdGhpcy0+cHJic19nZW5lcmF0b3IuaW52ZXJ0ID0gQkNNT1NfRkFMU0U7CisgICAgICAgIHRoaXMtPnByYnNfZ2VuZXJhdG9yLmNvbnRyb2wgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BSQlNfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnByYnNfc3RhdHVzLmxvY2tfc3RhdGUgPSBCQ01PTFRfUFJCU19MT0NLX1NUQVRFX1VOTE9DS0VEOworICAgICAgICB0aGlzLT5wcmJzX3N0YXR1cy5lcnJvcl9jb3VudHMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0FVVE9NQVRJQ19PTlVfREVBQ1RJVkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLmxvcyA9IEJDTU9TX0ZBTFNFOworICAgICAgICB0aGlzLT5hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi5vbnVfYWxhcm1zID0gQkNNT1NfRkFMU0U7CisgICAgICAgIHRoaXMtPmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLnRpd2kgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgdGhpcy0+YXV0b21hdGljX29udV9kZWFjdGl2YXRpb24uYWNrX3RpbWVvdXQgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgdGhpcy0+YXV0b21hdGljX29udV9kZWFjdGl2YXRpb24uc2ZpID0gQkNNT1NfRkFMU0U7CisgICAgICAgIHRoaXMtPmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLmxva2kgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9VU19CQU5EV0lEVEhfTElNSVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dXNfYmFuZHdpZHRoX2xpbWl0ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9BTExfT05VUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hbGxfb251cy5sZW4gPSAwOworICAgICAgICB0aGlzLT5hbGxfb251cy52YWwgPSBOVUxMOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0FMTF9NQ0FTVF9HRU1fUE9SVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWxsX21jYXN0X2dlbV9wb3J0cy5sZW4gPSAwOworICAgICAgICB0aGlzLT5hbGxfbWNhc3RfZ2VtX3BvcnRzLnZhbCA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfREVCVUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZGVidWcuaW5jcmVhc2VfYXZhaWxhYmxlX2Nicl9idyA9IEJDTU9TX0ZBTFNFOworICAgICAgICB0aGlzLT5kZWJ1Zy5pbnRlcl9idXJzdF9nYXBfaW5fYnl0ZXMgPSA1MTI7CisgICAgICAgIHRoaXMtPmRlYnVnLm51bWJlcl9vZl9nZW1fcG9ydHNfcGVyX29udSA9IDY0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX09OVV9VUEdSQURFX1BBUkFNUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vbnVfdXBncmFkZV9wYXJhbXMucmVzcG9uc2VfdGltZW91dF9tcyA9IDEwMDA7CisgICAgICAgIHRoaXMtPm9udV91cGdyYWRlX3BhcmFtcy5tYXhfcmV0cnlfY291bnQgPSAyMzsKKyAgICAgICAgdGhpcy0+b251X3VwZ3JhZGVfcGFyYW1zLm9tY2lfZm9ybWF0ID0gQkNNT0xUX09NQ0lfREVWSUNFX0lEX0VYVEVOREVEOworICAgICAgICB0aGlzLT5vbnVfdXBncmFkZV9wYXJhbXMud2luZG93X3NpemUgPSAzMjsKKyAgICAgICAgdGhpcy0+b251X3VwZ3JhZGVfcGFyYW1zLmFjdGl2YXRlX2NvbW1pdCA9IEJDTU9TX0ZBTFNFOworICAgICAgICB0aGlzLT5vbnVfdXBncmFkZV9wYXJhbXMuZGVsYXlfZm9yX2NvbW1pdF9tcyA9IDQwMDAwVUw7CisgICAgICAgIHRoaXMtPm9udV91cGdyYWRlX3BhcmFtcy5tYXhfYWN0aXZhdGlvbl9hdHRlbXB0cyA9IDIzOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RTX0ZFQ19NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRzX2ZlY19tb2RlID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRU5BQkxFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RCQV9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRiYV90eXBlID0gQkNNT0xUX0RCQV9UWVBFX0lOVEVSTkFMOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX09OVV9UVU5JTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b251X3R1bmluZy50c291cmNlID0gMTAwMDsKKyAgICAgICAgdGhpcy0+b251X3R1bmluZy50dGFyZ2V0ID0gMTAwMDsKKyAgICAgICAgdGhpcy0+b251X3R1bmluZy5yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9yZXF1aXJlZCA9IEJDTU9TX1RSVUU7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfSFdfUE9OX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2h3X3Bvbl9pZF9wYWNrKCZ0aGlzLT5od19wb25faWQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0FWQUlMQUJMRV9CQU5EV0lEVEgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGhfcGFjaygmdGhpcy0+YXZhaWxhYmxlX2JhbmR3aWR0aCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTlVNQkVSX09GX0FDVElWRV9PTlVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5udW1iZXJfb2ZfYWN0aXZlX29udXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QT05fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bvbl9zdGF0dXNfcGFjaygmdGhpcy0+cG9uX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUE9OX0RJU1RBTkNFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bvbl9kaXN0YW5jZV9wYWNrKCZ0aGlzLT5wb25fZGlzdGFuY2UsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1JBTkdJTkdfV0lORE9XX1NJWkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnJhbmdpbmdfd2luZG93X3NpemUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9FUURfQ1lDTEVTX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+ZXFkX2N5Y2xlc19udW1iZXIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EUklGVF9DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sX3BhY2soJnRoaXMtPmRyaWZ0X2NvbnRyb2wsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0xPU19BTEFSTV9USFJFU0hPTEQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bG9zX2FsYXJtX3RocmVzaG9sZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0xPU19JTklUSUFMX1ZBTFVFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPmxvc19pbml0aWFsX3ZhbHVlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9PTlVfQUxBUk1TX1RIUkVTSE9MRFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fb251X2FsYXJtc190aHJlc2hvbGRzX3BhY2soJnRoaXMtPm9udV9hbGFybXNfdGhyZXNob2xkcywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQkVSX01PTklUT1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYmVyX21vbml0b3JfcGFyYW1zX3BhY2soJnRoaXMtPmJlcl9tb25pdG9yLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9PTlVfQUNUSVZBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9vbnVfYWN0aXZhdGlvbl9wYWNrKCZ0aGlzLT5vbnVfYWN0aXZhdGlvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfU05fQUNRVUlTSVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fc25fYWNxdWlzaXRpb25fcGFjaygmdGhpcy0+c25fYWNxdWlzaXRpb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0tFWV9FWENIQU5HRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9rZXlfZXhjaGFuZ2VfcGFjaygmdGhpcy0+a2V5X2V4Y2hhbmdlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19wYWNrKCZ0aGlzLT5wcm90ZWN0aW9uX3N3aXRjaGluZywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfREVCVUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWdfcGFjaygmdGhpcy0+cHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWcsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0NCUl9SVF9BTExPQ0FUSU9OX1BST0ZJTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZV9wYWNrKCZ0aGlzLT5jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9DQlJfTlJUX0FMTE9DQVRJT05fUFJPRklMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfdTE2XzJfcGFjaygmdGhpcy0+Y2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BPV0VSX01BTkFHRU1FTlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbl9wYWNrKCZ0aGlzLT5wb3dlcl9tYW5hZ2VtZW50LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9ST0dVRV9PTlVfREVURUNUSU9OX1BST0NFU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzX3BhY2soJnRoaXMtPnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUEVSSU9ESUNfU1RBTkRCWV9QT05fTU9OSVRPUklORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX3BhY2soJnRoaXMtPnBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RCQV9NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2RiYV9tb2RlX3BhY2sodGhpcy0+ZGJhX21vZGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BMT0FNX0hBTkRMSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nX3BhY2soJnRoaXMtPnBsb2FtX2hhbmRsaW5nLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9NSU5fREFUQV9BTExPQ19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5taW5fZGF0YV9hbGxvY19pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX01JTl9EQVRBX0dFTV9QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPm1pbl9kYXRhX2dlbV9wb3J0X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTVVMVElDQVNUX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9tdWx0aWNhc3Rfa2V5X3BhY2soJnRoaXMtPm11bHRpY2FzdF9rZXksIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnX3BhY2soJnRoaXMtPnByYnNfY2hlY2tlciwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJCU19HRU5FUkFUT1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnX3BhY2soJnRoaXMtPnByYnNfZ2VuZXJhdG9yLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QUkJTX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wcmJzX3N0YXR1c19wYWNrKCZ0aGlzLT5wcmJzX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQVVUT01BVElDX09OVV9ERUFDVElWQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb25fcGFjaygmdGhpcy0+YXV0b21hdGljX29udV9kZWFjdGl2YXRpb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1VTX0JBTkRXSURUSF9MSU1JVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dXNfYmFuZHdpZHRoX2xpbWl0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQUxMX09OVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzUxMF9wYWNrKCZ0aGlzLT5hbGxfb251cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQUxMX01DQVNUX0dFTV9QT1JUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjhfcGFjaygmdGhpcy0+YWxsX21jYXN0X2dlbV9wb3J0cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfREVCVUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fbmlfZGVidWdfcGFjaygmdGhpcy0+ZGVidWcsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX09OVV9VUEdSQURFX1BBUkFNUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtc19wYWNrKCZ0aGlzLT5vbnVfdXBncmFkZV9wYXJhbXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RTX0ZFQ19NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfcGFjayh0aGlzLT5kc19mZWNfbW9kZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfREJBX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZGJhX3R5cGVfcGFjayh0aGlzLT5kYmFfdHlwZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX1RVTklORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9vbnVfdHVuaW5nX2NvbmZpZ3VyYXRpb25fcGFjaygmdGhpcy0+b251X3R1bmluZywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfSFdfUE9OX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQVZBSUxBQkxFX0JBTkRXSURUSCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9OVU1CRVJfT0ZfQUNUSVZFX09OVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QT05fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUE9OX0RJU1RBTkNFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUkFOR0lOR19XSU5ET1dfU0laRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0VRRF9DWUNMRVNfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfRFJJRlRfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA2OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0xPU19BTEFSTV9USFJFU0hPTEQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9MT1NfSU5JVElBTF9WQUxVRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX09OVV9BTEFSTVNfVEhSRVNIT0xEUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0JFUl9NT05JVE9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDY7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX0FDVElWQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9TTl9BQ1FVSVNJVElPTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA3OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0tFWV9FWENIQU5HRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA2OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfREVCVUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9DQlJfUlRfQUxMT0NBVElPTl9QUk9GSUxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDY7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQ0JSX05SVF9BTExPQ0FUSU9OX1BST0ZJTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QT1dFUl9NQU5BR0VNRU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1JPR1VFX09OVV9ERVRFQ1RJT05fUFJPQ0VTUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSBiY21vbHRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BFUklPRElDX1NUQU5EQllfUE9OX01PTklUT1JJTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EQkFfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BMT0FNX0hBTkRMSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTUlOX0RBVEFfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9NSU5fREFUQV9HRU1fUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX01VTFRJQ0FTVF9LRVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTc7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJCU19DSEVDS0VSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJCU19HRU5FUkFUT1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QUkJTX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA1OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0FVVE9NQVRJQ19PTlVfREVBQ1RJVkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDY7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfVVNfQkFORFdJRFRIX0xJTUlUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQUxMX09OVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF81MTBfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmFsbF9vbnVzKTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9BTExfTUNBU1RfR0VNX1BPUlRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjhfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmFsbF9tY2FzdF9nZW1fcG9ydHMpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RFQlVHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX1VQR1JBREVfUEFSQU1TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RTX0ZFQ19NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfREJBX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9PTlVfVFVOSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDk7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9IV19QT05fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfaHdfcG9uX2lkX3VucGFjaygmdGhpcy0+aHdfcG9uX2lkLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0FWQUlMQUJMRV9CQU5EV0lEVEgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGhfdW5wYWNrKCZ0aGlzLT5hdmFpbGFibGVfYmFuZHdpZHRoLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX05VTUJFUl9PRl9BQ1RJVkVfT05VUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bnVtYmVyX29mX2FjdGl2ZV9vbnVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUE9OX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fc3RhdHVzX3VucGFjaygmdGhpcy0+cG9uX3N0YXR1cywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QT05fRElTVEFOQ0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcG9uX2Rpc3RhbmNlX3VucGFjaygmdGhpcy0+cG9uX2Rpc3RhbmNlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1JBTkdJTkdfV0lORE9XX1NJWkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnJhbmdpbmdfd2luZG93X3NpemUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9FUURfQ1lDTEVTX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+ZXFkX2N5Y2xlc19udW1iZXIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EUklGVF9DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sX3VucGFjaygmdGhpcy0+ZHJpZnRfY29udHJvbCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9MT1NfQUxBUk1fVEhSRVNIT0xEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmxvc19hbGFybV90aHJlc2hvbGQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9MT1NfSU5JVElBTF9WQUxVRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5sb3NfaW5pdGlhbF92YWx1ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX0FMQVJNU19USFJFU0hPTERTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX29udV9hbGFybXNfdGhyZXNob2xkc191bnBhY2soJnRoaXMtPm9udV9hbGFybXNfdGhyZXNob2xkcywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9CRVJfTU9OSVRPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9iZXJfbW9uaXRvcl9wYXJhbXNfdW5wYWNrKCZ0aGlzLT5iZXJfbW9uaXRvciwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9PTlVfQUNUSVZBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9vbnVfYWN0aXZhdGlvbl91bnBhY2soJnRoaXMtPm9udV9hY3RpdmF0aW9uLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1NOX0FDUVVJU0lUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX3NuX2FjcXVpc2l0aW9uX3VucGFjaygmdGhpcy0+c25fYWNxdWlzaXRpb24sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfS0VZX0VYQ0hBTkdFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX2tleV9leGNoYW5nZV91bnBhY2soJnRoaXMtPmtleV9leGNoYW5nZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ191bnBhY2soJnRoaXMtPnByb3RlY3Rpb25fc3dpdGNoaW5nLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX0RFQlVHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnX3VucGFjaygmdGhpcy0+cHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWcsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQ0JSX1JUX0FMTE9DQVRJT05fUFJPRklMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlX3VucGFjaygmdGhpcy0+Y2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9DQlJfTlJUX0FMTE9DQVRJT05fUFJPRklMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfdTE2XzJfdW5wYWNrKCZ0aGlzLT5jYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QT1dFUl9NQU5BR0VNRU5UKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X29udV9wb3dlcl9tYW5hZ2VtZW50X2NvbmZpZ3VyYXRpb25fdW5wYWNrKCZ0aGlzLT5wb3dlcl9tYW5hZ2VtZW50LCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1JPR1VFX09OVV9ERVRFQ1RJT05fUFJPQ0VTUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3NfdW5wYWNrKCZ0aGlzLT5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUEVSSU9ESUNfU1RBTkRCWV9QT05fTU9OSVRPUklORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX3VucGFjaygmdGhpcy0+cGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EQkFfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9kYmFfbW9kZV91bnBhY2soJnRoaXMtPmRiYV9tb2RlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QTE9BTV9IQU5ETElORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9wbG9hbV9oYW5kbGluZ191bnBhY2soJnRoaXMtPnBsb2FtX2hhbmRsaW5nLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX01JTl9EQVRBX0FMTE9DX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+bWluX2RhdGFfYWxsb2NfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9NSU5fREFUQV9HRU1fUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPm1pbl9kYXRhX2dlbV9wb3J0X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTVVMVElDQVNUX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9tdWx0aWNhc3Rfa2V5X3VucGFjaygmdGhpcy0+bXVsdGljYXN0X2tleSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QUkJTX0NIRUNLRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZ191bnBhY2soJnRoaXMtPnByYnNfY2hlY2tlciwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QUkJTX0dFTkVSQVRPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWdfdW5wYWNrKCZ0aGlzLT5wcmJzX2dlbmVyYXRvciwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QUkJTX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wcmJzX3N0YXR1c191bnBhY2soJnRoaXMtPnByYnNfc3RhdHVzLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0FVVE9NQVRJQ19PTlVfREVBQ1RJVkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uX3VucGFjaygmdGhpcy0+YXV0b21hdGljX29udV9kZWFjdGl2YXRpb24sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfVVNfQkFORFdJRFRIX0xJTUlUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT51c19iYW5kd2lkdGhfbGltaXQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9BTExfT05VUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfNTEwX3VucGFjaygmdGhpcy0+YWxsX29udXMsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQUxMX01DQVNUX0dFTV9QT1JUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjhfdW5wYWNrKCZ0aGlzLT5hbGxfbWNhc3RfZ2VtX3BvcnRzLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RFQlVHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX25pX2RlYnVnX3VucGFjaygmdGhpcy0+ZGVidWcsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX1VQR1JBREVfUEFSQU1TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zX3VucGFjaygmdGhpcy0+b251X3VwZ3JhZGVfcGFyYW1zLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RTX0ZFQ19NT0RFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2NvbnRyb2xfc3RhdGVfdW5wYWNrKCZ0aGlzLT5kc19mZWNfbW9kZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfREJBX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZGJhX3R5cGVfdW5wYWNrKCZ0aGlzLT5kYmFfdHlwZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX1RVTklORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9vbnVfdHVuaW5nX2NvbmZpZ3VyYXRpb25fdW5wYWNrKCZ0aGlzLT5vbnVfdHVuaW5nLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0hXX1BPTl9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9BVkFJTEFCTEVfQkFORFdJRFRIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9OVU1CRVJfT0ZfQUNUSVZFX09OVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUE9OX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QT05fRElTVEFOQ0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUkFOR0lOR19XSU5ET1dfU0laRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9FUURfQ1lDTEVTX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EUklGVF9DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0xPU19BTEFSTV9USFJFU0hPTEQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTE9TX0lOSVRJQUxfVkFMVUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX0FMQVJNU19USFJFU0hPTERTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0JFUl9NT05JVE9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX09OVV9BQ1RJVkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1NOX0FDUVVJU0lUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0tFWV9FWENIQU5HRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19ERUJVRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9DQlJfUlRfQUxMT0NBVElPTl9QUk9GSUxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0NCUl9OUlRfQUxMT0NBVElPTl9QUk9GSUxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BPV0VSX01BTkFHRU1FTlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1JPR1VFX09OVV9ERVRFQ1RJT05fUFJPQ0VTUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3Nfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BFUklPRElDX1NUQU5EQllfUE9OX01PTklUT1JJTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfREJBX01PREUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUExPQU1fSEFORExJTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTUlOX0RBVEFfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTUlOX0RBVEFfR0VNX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTVVMVElDQVNUX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDE3KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJCU19DSEVDS0VSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BSQlNfR0VORVJBVE9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BSQlNfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0FVVE9NQVRJQ19PTlVfREVBQ1RJVkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1VTX0JBTkRXSURUSF9MSU1JVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9BTExfT05VUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfNTEwX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9BTExfTUNBU1RfR0VNX1BPUlRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOF9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfREVCVUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX1VQR1JBREVfUEFSQU1TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EU19GRUNfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EQkFfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9PTlVfVFVOSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0hXX1BPTl9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9od19wb25faWRfYm91bmRzX2NoZWNrKCZ0aGlzLT5od19wb25faWQpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0hXX1BPTl9JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0FWQUlMQUJMRV9CQU5EV0lEVEgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGhfYm91bmRzX2NoZWNrKCZ0aGlzLT5hdmFpbGFibGVfYmFuZHdpZHRoKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9BVkFJTEFCTEVfQkFORFdJRFRIOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUE9OX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fc3RhdHVzX2JvdW5kc19jaGVjaygmdGhpcy0+cG9uX3N0YXR1cykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUE9OX1NUQVRVUzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BPTl9ESVNUQU5DRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fZGlzdGFuY2VfYm91bmRzX2NoZWNrKCZ0aGlzLT5wb25fZGlzdGFuY2UpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BPTl9ESVNUQU5DRTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0VRRF9DWUNMRVNfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5lcWRfY3ljbGVzX251bWJlciA+IDI1NSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9FUURfQ1lDTEVTX05VTUJFUjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RSSUZUX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcG9uX2RyaWZ0X2NvbnRyb2xfYm91bmRzX2NoZWNrKCZ0aGlzLT5kcmlmdF9jb250cm9sKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EUklGVF9DT05UUk9MOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTE9TX0lOSVRJQUxfVkFMVUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5sb3NfaW5pdGlhbF92YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTE9TX0lOSVRJQUxfVkFMVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX0FMQVJNU19USFJFU0hPTERTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX29udV9hbGFybXNfdGhyZXNob2xkc19ib3VuZHNfY2hlY2soJnRoaXMtPm9udV9hbGFybXNfdGhyZXNob2xkcykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX0FMQVJNU19USFJFU0hPTERTOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQkVSX01PTklUT1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYmVyX21vbml0b3JfcGFyYW1zX2JvdW5kc19jaGVjaygmdGhpcy0+YmVyX21vbml0b3IpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0JFUl9NT05JVE9SOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX0FDVElWQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fb251X2FjdGl2YXRpb25fYm91bmRzX2NoZWNrKCZ0aGlzLT5vbnVfYWN0aXZhdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX0FDVElWQVRJT047CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9TTl9BQ1FVSVNJVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9zbl9hY3F1aXNpdGlvbl9ib3VuZHNfY2hlY2soJnRoaXMtPnNuX2FjcXVpc2l0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9TTl9BQ1FVSVNJVElPTjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0tFWV9FWENIQU5HRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9rZXlfZXhjaGFuZ2VfYm91bmRzX2NoZWNrKCZ0aGlzLT5rZXlfZXhjaGFuZ2UpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0tFWV9FWENIQU5HRTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2JvdW5kc19jaGVjaygmdGhpcy0+cHJvdGVjdGlvbl9zd2l0Y2hpbmcpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfREVCVUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWdfYm91bmRzX2NoZWNrKCZ0aGlzLT5wcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1ZykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfREVCVUc7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9DQlJfUlRfQUxMT0NBVElPTl9QUk9GSUxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Nicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGVfYm91bmRzX2NoZWNrKCZ0aGlzLT5jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9DQlJfUlRfQUxMT0NBVElPTl9QUk9GSUxFOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQ0JSX05SVF9BTExPQ0FUSU9OX1BST0ZJTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXJyX3UxNl8yX2JvdW5kc19jaGVjaygmdGhpcy0+Y2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0NCUl9OUlRfQUxMT0NBVElPTl9QUk9GSUxFOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUE9XRVJfTUFOQUdFTUVOVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uX2JvdW5kc19jaGVjaygmdGhpcy0+cG93ZXJfbWFuYWdlbWVudCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUE9XRVJfTUFOQUdFTUVOVDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1JPR1VFX09OVV9ERVRFQ1RJT05fUFJPQ0VTUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3NfYm91bmRzX2NoZWNrKCZ0aGlzLT5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1JPR1VFX09OVV9ERVRFQ1RJT05fUFJPQ0VTUzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BFUklPRElDX1NUQU5EQllfUE9OX01PTklUT1JJTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZ19ib3VuZHNfY2hlY2soJnRoaXMtPnBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BFUklPRElDX1NUQU5EQllfUE9OX01PTklUT1JJTkc7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EQkFfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmRiYV9tb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9EQkFfTU9ERV9OT1JNQUw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9EQkFfTU9ERV9FWFRFTkRFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EQkFfTU9ERTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QTE9BTV9IQU5ETElORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9wbG9hbV9oYW5kbGluZ19ib3VuZHNfY2hlY2soJnRoaXMtPnBsb2FtX2hhbmRsaW5nKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QTE9BTV9IQU5ETElORzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX01JTl9EQVRBX0FMTE9DX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5taW5fZGF0YV9hbGxvY19pZCA8IChiY21vbHRfeGdwb25fYWxsb2NfaWQpIDEwMjQpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTUlOX0RBVEFfQUxMT0NfSUQ7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGhpcy0+bWluX2RhdGFfYWxsb2NfaWQgPiAoYmNtb2x0X3hncG9uX2FsbG9jX2lkKSAxNDU5MSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9NSU5fREFUQV9BTExPQ19JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX01JTl9EQVRBX0dFTV9QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5taW5fZGF0YV9nZW1fcG9ydF9pZCA8IChiY21vbHRfeGdwb25fZ2VtX2lkKSAxMDI0KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX01JTl9EQVRBX0dFTV9QT1JUX0lEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRoaXMtPm1pbl9kYXRhX2dlbV9wb3J0X2lkID4gKGJjbW9sdF94Z3Bvbl9nZW1faWQpIDU3NTk4VSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9NSU5fREFUQV9HRU1fUE9SVF9JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX01VTFRJQ0FTVF9LRVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fbXVsdGljYXN0X2tleV9ib3VuZHNfY2hlY2soJnRoaXMtPm11bHRpY2FzdF9rZXkpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX01VTFRJQ0FTVF9LRVk7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QUkJTX0NIRUNLRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZ19ib3VuZHNfY2hlY2soJnRoaXMtPnByYnNfY2hlY2tlcikpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJCU19DSEVDS0VSOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJCU19HRU5FUkFUT1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnX2JvdW5kc19jaGVjaygmdGhpcy0+cHJic19nZW5lcmF0b3IpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BSQlNfR0VORVJBVE9SOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJCU19TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcHJic19zdGF0dXNfYm91bmRzX2NoZWNrKCZ0aGlzLT5wcmJzX3N0YXR1cykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJCU19TVEFUVVM7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9BVVRPTUFUSUNfT05VX0RFQUNUSVZBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbl9ib3VuZHNfY2hlY2soJnRoaXMtPmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9BVVRPTUFUSUNfT05VX0RFQUNUSVZBVElPTjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0FMTF9PTlVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5hbGxfb251cy5sZW4gPiA1MTApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF81MTBfYm91bmRzX2NoZWNrKCZ0aGlzLT5hbGxfb251cykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQUxMX09OVVM7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9BTExfTUNBU1RfR0VNX1BPUlRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5hbGxfbWNhc3RfZ2VtX3BvcnRzLmxlbiA+IDEyOCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4X2JvdW5kc19jaGVjaygmdGhpcy0+YWxsX21jYXN0X2dlbV9wb3J0cykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQUxMX01DQVNUX0dFTV9QT1JUUzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RFQlVHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX25pX2RlYnVnX2JvdW5kc19jaGVjaygmdGhpcy0+ZGVidWcpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RFQlVHOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX1VQR1JBREVfUEFSQU1TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zX2JvdW5kc19jaGVjaygmdGhpcy0+b251X3VwZ3JhZGVfcGFyYW1zKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9PTlVfVVBHUkFERV9QQVJBTVM7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EU19GRUNfTU9ERSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmRzX2ZlY19tb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9DT05UUk9MX1NUQVRFX0VOQUJMRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EU19GRUNfTU9ERTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EQkFfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmRiYV90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9EQkFfVFlQRV9JTlRFUk5BTDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RCQV9UWVBFX1BBUlRJQUxfRVhURVJOQUw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9EQkFfVFlQRV9FWFRFUk5BTDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EQkFfVFlQRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9PTlVfVFVOSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X29udV90dW5pbmdfY29uZmlndXJhdGlvbl9ib3VuZHNfY2hlY2soJnRoaXMtPm9udV90dW5pbmcpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX09OVV9UVU5JTkc7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfRkVDX0NPREVXT1JEUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mZWNfY29kZXdvcmRzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfQklQMzJfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YmlwMzJfYnl0ZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9CSVAzMl9FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YmlwMzJfZXJyb3JzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdUQ19IRUFERVJTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X3hndGNfaGVhZGVycyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHVENfQ09SUkVDVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X3hndGNfY29ycmVjdGVkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdUQ19VTkNPUlJFQ1RFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF94Z3RjX3VuY29ycmVjdGVkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdFTSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF94Z2VtID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdFTV9EUk9QUEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X3hnZW1fZHJvcHBlZCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHRU1fSURMRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF94Z2VtX2lkbGUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR0VNX0NPUlJFQ1RFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF94Z2VtX2NvcnJlY3RlZCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0NSQ19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9jcmNfZXJyb3IgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9GUkFHTUVOVF9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9mcmFnbWVudF9lcnJvciA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BBQ0tFVFNfRFJPUFBFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9wYWNrZXRzX2Ryb3BwZWQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9EUk9QUEVEX1RPT19TSE9SVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9kcm9wcGVkX3Rvb19zaG9ydCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0RST1BQRURfVE9PX0xPTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfZHJvcHBlZF90b29fbG9uZyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0tFWV9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9rZXlfZXJyb3IgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9QTE9BTVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfcGxvYW1zID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX0RST1BQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfcGxvYW1zX2Ryb3BwZWQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19WQUxJRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9hbGxvY2F0aW9uc192YWxpZCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0lOVkFMSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfYWxsb2NhdGlvbnNfaW52YWxpZCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0RJU0FCTEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2FsbG9jYXRpb25zX2Rpc2FibGVkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUExPQU1TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X3Bsb2FtcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19OT05fSURMRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9wbG9hbXNfbm9uX2lkbGUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfcGxvYW1zX2Vycm9yID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQ1BVKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2NwdSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX09NQ0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfb21jaSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfcGFja2V0cyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX1hHRU0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfeGdlbSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX0NQVSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9jcHUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9PTUNJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X29tY2kgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9DUFVfT01DSV9QQUNLRVRTX0RST1BQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9JTExFR0FMX0xFTkdUSCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9kcm9wcGVkX2lsbGVnYWxfbGVuZ3RoID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9UUElEX01JU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfZHJvcHBlZF90cGlkX21pc3MgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX1ZJRF9NSVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X2Ryb3BwZWRfdmlkX21pc3MgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX0ZFQ19DT0RFV09SRFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZlY19jb2Rld29yZHMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfQklQMzJfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmJpcDMyX2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX0JJUDMyX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+YmlwMzJfZXJyb3JzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHVENfSEVBREVSUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfeGd0Y19oZWFkZXJzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHVENfQ09SUkVDVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF94Z3RjX2NvcnJlY3RlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR1RDX1VOQ09SUkVDVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF94Z3RjX3VuY29ycmVjdGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHRU0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X3hnZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdFTV9EUk9QUEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF94Z2VtX2Ryb3BwZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdFTV9JRExFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF94Z2VtX2lkbGUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdFTV9DT1JSRUNURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X3hnZW1fY29ycmVjdGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0NSQ19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfY3JjX2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0ZSQUdNRU5UX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF9mcmFnbWVudF9lcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QQUNLRVRTX0RST1BQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X3BhY2tldHNfZHJvcHBlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9EUk9QUEVEX1RPT19TSE9SVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfZHJvcHBlZF90b29fc2hvcnQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fTE9ORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfZHJvcHBlZF90b29fbG9uZykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9LRVlfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2tleV9lcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9QTE9BTVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X3Bsb2FtcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfRFJPUFBFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfcGxvYW1zX2Ryb3BwZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfVkFMSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2FsbG9jYXRpb25zX3ZhbGlkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0lOVkFMSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2FsbG9jYXRpb25zX2ludmFsaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfRElTQUJMRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2FsbG9jYXRpb25zX2Rpc2FibGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfcGxvYW1zKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19OT05fSURMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfcGxvYW1zX25vbl9pZGxlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfcGxvYW1zX2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0NQVSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfY3B1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX09NQ0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X29tY2kpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfb21jaV9wYWNrZXRzX2NyY19lcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9wYWNrZXRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX1hHRU0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X3hnZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfQ1BVKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT50eF9jcHUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfT01DSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dHhfb21jaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9DUFVfT01DSV9QQUNLRVRTX0RST1BQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfSUxMRUdBTF9MRU5HVEgpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X2Ryb3BwZWRfaWxsZWdhbF9sZW5ndGgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9UUElEX01JU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X2Ryb3BwZWRfdHBpZF9taXNzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfVklEX01JU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X2Ryb3BwZWRfdmlkX21pc3MpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9GRUNfQ09ERVdPUkRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX0JJUDMyX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX0JJUDMyX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR1RDX0hFQURFUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdUQ19DT1JSRUNURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdUQ19VTkNPUlJFQ1RFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR0VNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHRU1fRFJPUFBFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR0VNX0lETEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdFTV9DT1JSRUNURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQ1JDX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0ZSQUdNRU5UX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BBQ0tFVFNfRFJPUFBFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9EUk9QUEVEX1RPT19TSE9SVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9EUk9QUEVEX1RPT19MT05HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0tFWV9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9QTE9BTVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX0RST1BQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfVkFMSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfSU5WQUxJRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19ESVNBQkxFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QTE9BTVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX05PTl9JRExFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9DUFUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfT01DSSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9PTUNJX1BBQ0tFVFNfQ1JDX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfWEdFTSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9DUFUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfT01DSSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9DUFVfT01DSV9QQUNLRVRTX0RST1BQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9JTExFR0FMX0xFTkdUSCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX1RQSURfTUlTUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX1ZJRF9NSVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9GRUNfQ09ERVdPUkRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mZWNfY29kZXdvcmRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX0JJUDMyX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5iaXAzMl9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9CSVAzMl9FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmJpcDMyX2Vycm9ycykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR1RDX0hFQURFUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X3hndGNfaGVhZGVycykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR1RDX0NPUlJFQ1RFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfeGd0Y19jb3JyZWN0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdUQ19VTkNPUlJFQ1RFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfeGd0Y191bmNvcnJlY3RlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR0VNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF94Z2VtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHRU1fRFJPUFBFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfeGdlbV9kcm9wcGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHRU1fSURMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfeGdlbV9pZGxlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHRU1fQ09SUkVDVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF94Z2VtX2NvcnJlY3RlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9DUkNfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2NyY19lcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9GUkFHTUVOVF9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfZnJhZ21lbnRfZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUEFDS0VUU19EUk9QUEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9wYWNrZXRzX2Ryb3BwZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fU0hPUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2Ryb3BwZWRfdG9vX3Nob3J0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0RST1BQRURfVE9PX0xPTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2Ryb3BwZWRfdG9vX2xvbmcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfS0VZX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9rZXlfZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfUExPQU1TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50eF9wbG9hbXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX0RST1BQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X3Bsb2Ftc19kcm9wcGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX1ZBTElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9hbGxvY2F0aW9uc192YWxpZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19JTlZBTElEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9hbGxvY2F0aW9uc19pbnZhbGlkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0RJU0FCTEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9hbGxvY2F0aW9uc19kaXNhYmxlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QTE9BTVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X3Bsb2FtcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfTk9OX0lETEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X3Bsb2Ftc19ub25faWRsZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X3Bsb2Ftc19lcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9DUFUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X2NwdSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9PTUNJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9vbWNpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfUEFDS0VUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfcGFja2V0cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9YR0VNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50eF94Z2VtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX0NQVSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dHhfY3B1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX09NQ0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X29tY2kpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfQ1BVX09NQ0lfUEFDS0VUU19EUk9QUEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnR4X2NwdV9vbWNpX3BhY2tldHNfZHJvcHBlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX0lMTEVHQUxfTEVOR1RIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50eF9kcm9wcGVkX2lsbGVnYWxfbGVuZ3RoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfVFBJRF9NSVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50eF9kcm9wcGVkX3RwaWRfbWlzcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX1ZJRF9NSVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50eF9kcm9wcGVkX3ZpZF9taXNzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9GRUNfQ09ERVdPUkRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9CSVAzMl9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfQklQMzJfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR1RDX0hFQURFUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHVENfQ09SUkVDVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR1RDX1VOQ09SUkVDVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR0VNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR0VNX0RST1BQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHRU1fSURMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdFTV9DT1JSRUNURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0NSQ19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfRlJBR01FTlRfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BBQ0tFVFNfRFJPUFBFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fU0hPUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0RST1BQRURfVE9PX0xPTkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0tFWV9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfUExPQU1TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfRFJPUFBFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfVkFMSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0lOVkFMSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0RJU0FCTEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QTE9BTVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19OT05fSURMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9DUFUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX09NQ0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX1hHRU0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX0NQVSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfT01DSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfQ1BVX09NQ0lfUEFDS0VUU19EUk9QUEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX0lMTEVHQUxfTEVOR1RIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX1RQSURfTUlTUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9WSURfTUlTUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNmZy50cmlnZ2VyLnR5cGUgPSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOworICAgICAgICB0aGlzLT5jZmcuc29hay5hY3RpdmVfc29ha190aW1lID0gMDsKKyAgICAgICAgdGhpcy0+Y2ZnLnNvYWsuY2xlYXJfc29ha190aW1lID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfcGFjaygmdGhpcy0+Y2ZnLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5jZmcpOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3VucGFjaygmdGhpcy0+Y2ZnLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhdF9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhdF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fbmlfc3RhdF9jZmdfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2JvdW5kc19jaGVjaygmdGhpcy0+Y2ZnKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfQ0ZHX0lEX0NGRzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfRkFJTFVSRV9JRF9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5lcnJvciA9IEJDTU9MVF9QQUNLRVRfSU5KRUNUSU9OX0VSUk9SX0dFTV9QT1JUX05PVF9BQ1RJVkU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19GQUlMVVJFX0lEX0dFTV9QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmdlbV9wb3J0X2lkID0gKGJjbW9sdF94Z3Bvbl9nZW1faWQpIDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0ZBSUxVUkVfSURfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcGFja2V0X2luamVjdGlvbl9lcnJvcl9wYWNrKHRoaXMtPmVycm9yLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0ZBSUxVUkVfSURfR0VNX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+Z2VtX3BvcnRfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfRkFJTFVSRV9JRF9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfRkFJTFVSRV9JRF9HRU1fUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0ZBSUxVUkVfSURfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcGFja2V0X2luamVjdGlvbl9lcnJvcl91bnBhY2soJnRoaXMtPmVycm9yLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0ZBSUxVUkVfSURfR0VNX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5nZW1fcG9ydF9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0ZBSUxVUkVfSURfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19GQUlMVVJFX0lEX0dFTV9QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfRkFJTFVSRV9JRF9FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmVycm9yKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9QQUNLRVRfSU5KRUNUSU9OX0VSUk9SX0dFTV9QT1JUX05PVF9BQ1RJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19GQUlMVVJFX0lEX0VSUk9SOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfRkFJTFVSRV9JRF9HRU1fUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+Z2VtX3BvcnRfaWQgPiAoYmNtb2x0X3hncG9uX2dlbV9pZCkgNjU1MzNVKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfRkFJTFVSRV9JRF9HRU1fUE9SVF9JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fbmlfbG9zX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX25pX2xvc19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0xPU19JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdHVzID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfbG9zX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fbmlfbG9zX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9MT1NfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPnN0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfbG9zX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX25pX2xvc19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9MT1NfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfbG9zX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9sb3NfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0xPU19JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+c3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2xvc19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0xPU19JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9sb3NfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX25pX2xvc19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX25pX2xvc19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9MT1NfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX0xPU19JRF9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgbWVtc2V0KHRoaXMtPnNlcmlhbF9udW1iZXIudmVuZG9yX2lkLCAwLCBzaXplb2YodGhpcy0+c2VyaWFsX251bWJlci52ZW5kb3JfaWQpKTsKKyAgICAgICAgbWVtc2V0KHRoaXMtPnNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljLCAwLCBzaXplb2YodGhpcy0+c2VyaWFsX251bWJlci52ZW5kb3Jfc3BlY2lmaWMpKTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1JBTkdJTkdfVElNRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yYW5naW5nX3RpbWUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9udV9pZCA9IChiY21vbHRfeGdwb25fb251X2lkKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfVVBTVFJFQU1fTElORV9SQVRFX0NBUEFCSUxJVElFUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT51cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzID0gQkNNT0xUX1VQU1RSRUFNX0xJTkVfUkFURV9DQVBBQklMSVRJRVNfUkFURV8yX1BfNV9HOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfQ1VSUkVOVF9ET1dOU1RSRUFNX1BPTl9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jdXJyZW50X2Rvd25zdHJlYW1fcG9uX2lkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX0NVUlJFTlRfVVBTVFJFQU1fUE9OX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmN1cnJlbnRfdXBzdHJlYW1fcG9uX2lkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX0NBTElCUkFUSU9OX1JFQ09SRCkpICE9IDApCisgICAgeworICAgICAgICBtZW1zZXQodGhpcy0+Y2FsaWJyYXRpb25fcmVjb3JkLmFyciwgMCwgc2l6ZW9mKHRoaXMtPmNhbGlicmF0aW9uX3JlY29yZC5hcnIpKTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1RVTklOR19HUkFOVUxBUklUWSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50dW5pbmdfZ3JhbnVsYXJpdHkgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfU1RFUF9UVU5JTkdfVElNRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGVwX3R1bmluZ190aW1lID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX0FUVEVOVUFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmF0dGVudWF0aW9uID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1BPV0VSX0xFVkVMTElOR19DQVBBQklMSVRJRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cG93ZXJfbGV2ZWxsaW5nX2NhcGFiaWxpdGllcyA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zZXJpYWxfbnVtYmVyX3BhY2soJnRoaXMtPnNlcmlhbF9udW1iZXIsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfUkFOR0lOR19USU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5yYW5naW5nX3RpbWUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5vbnVfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1VQU1RSRUFNX0xJTkVfUkFURV9DQVBBQklMSVRJRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdXBzdHJlYW1fbGluZV9yYXRlX2NhcGFiaWxpdGllc19wYWNrKHRoaXMtPnVwc3RyZWFtX2xpbmVfcmF0ZV9jYXBhYmlsaXRpZXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfQ1VSUkVOVF9ET1dOU1RSRUFNX1BPTl9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5jdXJyZW50X2Rvd25zdHJlYW1fcG9uX2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9DVVJSRU5UX1VQU1RSRUFNX1BPTl9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5jdXJyZW50X3Vwc3RyZWFtX3Bvbl9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfQ0FMSUJSQVRJT05fUkVDT1JEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl9jYWxpYnJhdGlvbl9yZWNvcmRfOF9wYWNrKCZ0aGlzLT5jYWxpYnJhdGlvbl9yZWNvcmQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfVFVOSU5HX0dSQU5VTEFSSVRZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnR1bmluZ19ncmFudWxhcml0eSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfU1RFUF9UVU5JTkdfVElNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5zdGVwX3R1bmluZ190aW1lKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9BVFRFTlVBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5hdHRlbnVhdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfUE9XRVJfTEVWRUxMSU5HX0NBUEFCSUxJVElFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5wb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0aWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfUkFOR0lOR19USU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1VQU1RSRUFNX0xJTkVfUkFURV9DQVBBQklMSVRJRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX0NVUlJFTlRfRE9XTlNUUkVBTV9QT05fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX0NVUlJFTlRfVVBTVFJFQU1fUE9OX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9DQUxJQlJBVElPTl9SRUNPUkQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1RVTklOR19HUkFOVUxBUklUWSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfU1RFUF9UVU5JTkdfVElNRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfQVRURU5VQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1BPV0VSX0xFVkVMTElOR19DQVBBQklMSVRJRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc2VyaWFsX251bWJlcl91bnBhY2soJnRoaXMtPnNlcmlhbF9udW1iZXIsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9SQU5HSU5HX1RJTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnJhbmdpbmdfdGltZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKSAmdGhpcy0+b251X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9VUFNUUkVBTV9MSU5FX1JBVEVfQ0FQQUJJTElUSUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Vwc3RyZWFtX2xpbmVfcmF0ZV9jYXBhYmlsaXRpZXNfdW5wYWNrKCZ0aGlzLT51cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX0NVUlJFTlRfRE9XTlNUUkVBTV9QT05fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+Y3VycmVudF9kb3duc3RyZWFtX3Bvbl9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfQ1VSUkVOVF9VUFNUUkVBTV9QT05fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+Y3VycmVudF91cHN0cmVhbV9wb25faWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX0NBTElCUkFUSU9OX1JFQ09SRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfY2FsaWJyYXRpb25fcmVjb3JkXzhfdW5wYWNrKCZ0aGlzLT5jYWxpYnJhdGlvbl9yZWNvcmQsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9UVU5JTkdfR1JBTlVMQVJJVFkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dHVuaW5nX2dyYW51bGFyaXR5KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9TVEVQX1RVTklOR19USU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnN0ZXBfdHVuaW5nX3RpbWUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX0FUVEVOVUFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmF0dGVudWF0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9QT1dFUl9MRVZFTExJTkdfQ0FQQUJJTElUSUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnBvd2VyX2xldmVsbGluZ19jYXBhYmlsaXRpZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1JBTkdJTkdfVElNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1VQU1RSRUFNX0xJTkVfUkFURV9DQVBBQklMSVRJRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9DVVJSRU5UX0RPV05TVFJFQU1fUE9OX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfQ1VSUkVOVF9VUFNUUkVBTV9QT05fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9DQUxJQlJBVElPTl9SRUNPUkQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9UVU5JTkdfR1JBTlVMQVJJVFkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9TVEVQX1RVTklOR19USU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfQVRURU5VQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9QT1dFUl9MRVZFTExJTkdfQ0FQQUJJTElUSUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zZXJpYWxfbnVtYmVyX2JvdW5kc19jaGVjaygmdGhpcy0+c2VyaWFsX251bWJlcikpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9TRVJJQUxfTlVNQkVSOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPm9udV9pZCA+IChiY21vbHRfeGdwb25fb251X2lkKSA1MTEpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9PTlVfSUQ7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1VQU1RSRUFNX0xJTkVfUkFURV9DQVBBQklMSVRJRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT51cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9VUFNUUkVBTV9MSU5FX1JBVEVfQ0FQQUJJTElUSUVTX1JBVEVfMl9QXzVfRzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1VQU1RSRUFNX0xJTkVfUkFURV9DQVBBQklMSVRJRVNfUkFURV8xMF9HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfVVBTVFJFQU1fTElORV9SQVRFX0NBUEFCSUxJVElFUzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX0NBTElCUkFUSU9OX1JFQ09SRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfY2FsaWJyYXRpb25fcmVjb3JkXzhfYm91bmRzX2NoZWNrKCZ0aGlzLT5jYWxpYnJhdGlvbl9yZWNvcmQpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfQ0FMSUJSQVRJT05fUkVDT1JEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9BVFRFTlVBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+YXR0ZW51YXRpb24gPiA3KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfQVRURU5VQVRJT047CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1BPV0VSX0xFVkVMTElOR19DQVBBQklMSVRJRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnBvd2VyX2xldmVsbGluZ19jYXBhYmlsaXRpZXMgPiAxMjcpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9QT1dFUl9MRVZFTExJTkdfQ0FQQUJJTElUSUVTOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0dXMgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX0xJU1RfT0ZfRkFJTEVEX0VOVElUSUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmxpc3Rfb2ZfZmFpbGVkX2VudGl0aWVzLmxlbiA9IDA7CisgICAgICAgIHRoaXMtPmxpc3Rfb2ZfZmFpbGVkX2VudGl0aWVzLnZhbCA9IE5VTEw7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhdHVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9PTlVfVVBHUkFERV9DT01QTEVURV9JRF9MSVNUX09GX0ZBSUxFRF9FTlRJVElFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMl9wYWNrKCZ0aGlzLT5saXN0X29mX2ZhaWxlZF9lbnRpdGllcywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9PTlVfVVBHUkFERV9DT01QTEVURV9JRF9MSVNUX09GX0ZBSUxFRF9FTlRJVElFUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzJfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmxpc3Rfb2ZfZmFpbGVkX2VudGl0aWVzKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnN0YXR1cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfTElTVF9PRl9GQUlMRURfRU5USVRJRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzJfdW5wYWNrKCZ0aGlzLT5saXN0X29mX2ZhaWxlZF9lbnRpdGllcywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfTElTVF9PRl9GQUlMRURfRU5USVRJRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzJfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfTElTVF9PRl9GQUlMRURfRU5USVRJRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzJfYm91bmRzX2NoZWNrKCZ0aGlzLT5saXN0X29mX2ZhaWxlZF9lbnRpdGllcykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9PTlVfVVBHUkFERV9DT01QTEVURV9JRF9MSVNUX09GX0ZBSUxFRF9FTlRJVElFUzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19PTlVTX1JBTkdFRF9JRF9PTlVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9udXMubGVuID0gMDsKKyAgICAgICAgdGhpcy0+b251cy52YWwgPSBOVUxMOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VEX0lEX09OVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fb251X2VxZF9saXN0X3UzMl9wYWNrKCZ0aGlzLT5vbnVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19PTlVTX1JBTkdFRF9JRF9PTlVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF94Z3Bvbl9vbnVfZXFkX2xpc3RfdTMyX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5vbnVzKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VEX0lEX09OVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fb251X2VxZF9saXN0X3UzMl91bnBhY2soJnRoaXMtPm9udXMsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VEX0lEX09OVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fb251X2VxZF9saXN0X3UzMl9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19PTlVTX1JBTkdFRF9JRF9PTlVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX29udV9lcWRfbGlzdF91MzJfYm91bmRzX2NoZWNrKCZ0aGlzLT5vbnVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VEX0lEX09OVVM7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfU1dJVENIT1ZFUl9DT01QTEVURURfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJlc3VsdCA9IEJDTU9MVF9SRVNVTFRfU1VDQ0VTUzsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRF9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzdWx0X3BhY2sodGhpcy0+cmVzdWx0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRF9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVEX0lEX1JFU1VMVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfdW5wYWNrKCZ0aGlzLT5yZXN1bHQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRF9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRF9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5yZXN1bHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JFU1VMVF9TVUNDRVNTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVTVUxUX0ZBSUw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRF9JRF9SRVNVTFQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FX0lEX1JFU1VMVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yZXN1bHQgPSBCQ01PTFRfVFJBRkZJQ19SRVNVTUVfUkVTVUxUX1NVQ0NFU1M7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUVfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3RyYWZmaWNfcmVzdW1lX3Jlc3VsdF9wYWNrKHRoaXMtPnJlc3VsdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUVfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRV9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdHJhZmZpY19yZXN1bWVfcmVzdWx0X3VucGFjaygmdGhpcy0+cmVzdWx0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUVfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUVfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+cmVzdWx0KQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUkFGRklDX1JFU1VNRV9SRVNVTFRfU1VDQ0VTUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1RSQUZGSUNfUkVTVU1FX1JFU1VMVF9GQUlMVVJFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfVFJBRkZJQ19SRVNVTUVfUkVTVUxUX1NVU1BFQ1RFRF9MT1M6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRV9JRF9SRVNVTFQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1dJTkRPV19UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPndpbmRvd190eXBlID0gQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfU0lMRU5UX1dJTkRPVzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfTUVBU1VSRU1FTlRfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm1lYXN1cmVtZW50X3N0YXR1cyA9IEJDTU9MVF9ST0dVRV9NRUFTVVJFTUVOVF9SRVNVTFRfUlNTSV9DT01QTEVURTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWxsb2NfaWQgPSAoYmNtb2x0X3hncG9uX2FsbG9jX2lkKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b251X2lkID0gKGJjbW9sdF94Z3Bvbl9vbnVfaWQpIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX0lTX0RFTElORUFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmlzX2RlbGluZWF0aW9uID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX0lTX0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmlzX2VkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1JYX0RBVEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfZGF0YS5sZW4gPSAwOworICAgICAgICB0aGlzLT5yeF9kYXRhLnZhbCA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1BMT0FNX1JFQ0VJVkVEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wbG9hbV9yZWNlaXZlZF9vbnVfaWQgPSAoYmNtb2x0X3hncG9uX29udV9pZCkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUExPQU1fUkVDRUlWRURfTUlDX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBsb2FtX3JlY2VpdmVkX21pY19lcnJvciA9IEJDTU9TX0ZBTFNFOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1dJTkRPV19UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfcGFjayh0aGlzLT53aW5kb3dfdHlwZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX01FQVNVUkVNRU5UX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yb2d1ZV9tZWFzdXJlbWVudF9yZXN1bHRfcGFjayh0aGlzLT5tZWFzdXJlbWVudF9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9BTExPQ19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5hbGxvY19pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+b251X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX0lTX0RFTElORUFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+aXNfZGVsaW5lYXRpb24pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfSVNfRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5pc19lZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9SWF9EQVRBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTMyX3BhY2soJnRoaXMtPnJ4X2RhdGEsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9QTE9BTV9SRUNFSVZFRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcy0+cGxvYW1fcmVjZWl2ZWRfb251X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1BMT0FNX1JFQ0VJVkVEX01JQ19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnBsb2FtX3JlY2VpdmVkX21pY19lcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1dJTkRPV19UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX01FQVNVUkVNRU5UX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9BTExPQ19JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfSVNfREVMSU5FQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfSVNfRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUlhfREFUQSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSBiY21vbHRfdThfbGlzdF91MzJfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnJ4X2RhdGEpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9QTE9BTV9SRUNFSVZFRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUExPQU1fUkVDRUlWRURfTUlDX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9XSU5ET1dfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X3VucGFjaygmdGhpcy0+d2luZG93X3R5cGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9NRUFTVVJFTUVOVF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcm9ndWVfbWVhc3VyZW1lbnRfcmVzdWx0X3VucGFjaygmdGhpcy0+bWVhc3VyZW1lbnRfc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5hbGxvY19pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5vbnVfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfSVNfREVMSU5FQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5pc19kZWxpbmVhdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9JU19FRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmlzX2VkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1JYX0RBVEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfdW5wYWNrKCZ0aGlzLT5yeF9kYXRhLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9QTE9BTV9SRUNFSVZFRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5wbG9hbV9yZWNlaXZlZF9vbnVfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUExPQU1fUkVDRUlWRURfTUlDX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+cGxvYW1fcmVjZWl2ZWRfbWljX2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9XSU5ET1dfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfTUVBU1VSRU1FTlRfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9BTExPQ19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9JU19ERUxJTkVBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfSVNfRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1JYX0RBVEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9QTE9BTV9SRUNFSVZFRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1BMT0FNX1JFQ0VJVkVEX01JQ19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfV0lORE9XX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT53aW5kb3dfdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUk9HVUVfREVURUNUSU9OX1dJTkRPV19TSUxFTlRfV0lORE9XOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUk9HVUVfREVURUNUSU9OX1dJTkRPV19DVVRfT0ZGX1dJTkRPVzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfV0lORE9XX1RZUEU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX01FQVNVUkVNRU5UX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPm1lYXN1cmVtZW50X3N0YXR1cykKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUk9HVUVfTUVBU1VSRU1FTlRfUkVTVUxUX1JTU0lfQ09NUExFVEU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9NRUFTVVJFTUVOVF9SRVNVTFRfTk9UX1BFUkZPUk1FRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JPR1VFX01FQVNVUkVNRU5UX1JFU1VMVF9ST0dVRV9DWUNMRV9TVE9QOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUk9HVUVfTUVBU1VSRU1FTlRfUkVTVUxUX1JTU0lfRVJST1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9NRUFTVVJFTUVOVF9SRVNVTFRfUlNTSV9OT1RfQ09NUExFVEU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX01FQVNVUkVNRU5UX1NUQVRVUzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmFsbG9jX2lkID4gKGJjbW9sdF94Z3Bvbl9hbGxvY19pZCkgMTYzODMpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX0FMTE9DX0lEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+b251X2lkID4gKGJjbW9sdF94Z3Bvbl9vbnVfaWQpIDUxMSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfT05VX0lEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1JYX0RBVEEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfYm91bmRzX2NoZWNrKCZ0aGlzLT5yeF9kYXRhKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUlhfREFUQTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9QTE9BTV9SRUNFSVZFRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnBsb2FtX3JlY2VpdmVkX29udV9pZCA+IChiY21vbHRfeGdwb25fb251X2lkKSA1MTEpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1BMT0FNX1JFQ0VJVkVEX09OVV9JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRF9JRF9OVU1CRVJfT0ZfREVURUNURURfREVMSU1JVEVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm51bWJlcl9vZl9kZXRlY3RlZF9kZWxpbWl0ZXIgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURURfSURfRU5FUkdZX0RFVEVDVF9TSUdOQUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZW5lcmd5X2RldGVjdF9zaWduYWwgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRF9JRF9OVU1CRVJfT0ZfREVURUNURURfREVMSU1JVEVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5udW1iZXJfb2ZfZGV0ZWN0ZWRfZGVsaW1pdGVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRF9JRF9FTkVSR1lfREVURUNUX1NJR05BTCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5lbmVyZ3lfZGV0ZWN0X3NpZ25hbCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURURfSURfTlVNQkVSX09GX0RFVEVDVEVEX0RFTElNSVRFUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURURfSURfRU5FUkdZX0RFVEVDVF9TSUdOQUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVEX0lEX05VTUJFUl9PRl9ERVRFQ1RFRF9ERUxJTUlURVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPm51bWJlcl9vZl9kZXRlY3RlZF9kZWxpbWl0ZXIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVEX0lEX0VORVJHWV9ERVRFQ1RfU0lHTkFMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPmVuZXJneV9kZXRlY3Rfc2lnbmFsLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURURfSURfTlVNQkVSX09GX0RFVEVDVEVEX0RFTElNSVRFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVEX0lEX0VORVJHWV9ERVRFQ1RfU0lHTkFMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURURfSURfRU5FUkdZX0RFVEVDVF9TSUdOQUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5lbmVyZ3lfZGV0ZWN0X3NpZ25hbCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRF9JRF9FTkVSR1lfREVURUNUX1NJR05BTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0ID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfRkVDX0NPREVXT1JEUzsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX25pX3N0YXRfaWRfcGFjayh0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX25pX3N0YXRfaWRfdW5wYWNrKCZ0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0KQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX0ZFQ19DT0RFV09SRFM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX0JJUDMyX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9CSVAzMl9FUlJPUlM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHVENfSEVBREVSUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdUQ19DT1JSRUNURUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHVENfVU5DT1JSRUNURUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHRU06CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHRU1fRFJPUFBFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdFTV9JRExFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR0VNX0NPUlJFQ1RFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQ1JDX0VSUk9SOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9GUkFHTUVOVF9FUlJPUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUEFDS0VUU19EUk9QUEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9EUk9QUEVEX1RPT19TSE9SVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fTE9ORzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfS0VZX0VSUk9SOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9QTE9BTVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19EUk9QUEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19WQUxJRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfSU5WQUxJRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfRElTQUJMRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX05PTl9JRExFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfRVJST1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0NQVToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfT01DSToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfUEFDS0VUUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfWEdFTToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfQ1BVOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9PTUNJOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9DUFVfT01DSV9QQUNLRVRTX0RST1BQRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfSUxMRUdBTF9MRU5HVEg6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfVFBJRF9NSVNTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX1ZJRF9NSVNTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdCA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX0ZFQ19DT0RFV09SRFM7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkX3BhY2sodGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkX3VucGFjaygmdGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9GRUNfQ09ERVdPUkRTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9CSVAzMl9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfQklQMzJfRVJST1JTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR1RDX0hFQURFUlM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHVENfQ09SUkVDVEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR1RDX1VOQ09SUkVDVEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR0VNOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR0VNX0RST1BQRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHRU1fSURMRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdFTV9DT1JSRUNURUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0NSQ19FUlJPUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfRlJBR01FTlRfRVJST1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BBQ0tFVFNfRFJPUFBFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fU0hPUlQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0RST1BQRURfVE9PX0xPTkc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0tFWV9FUlJPUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfUExPQU1TOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfRFJPUFBFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfVkFMSUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0lOVkFMSUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0RJU0FCTEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QTE9BTVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19OT05fSURMRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX0VSUk9SOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9DUFU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX09NQ0k6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX1BBQ0tFVFM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX1hHRU06CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX0NQVToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfT01DSToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfQ1BVX09NQ0lfUEFDS0VUU19EUk9QUEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX0lMTEVHQUxfTEVOR1RIOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX1RQSURfTUlTUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9WSURfTUlTUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX1JFU1VMVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yZXN1bHQgPSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1M7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX1BSRVZJT1VTX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnByZXZpb3VzX3N0YXRlID0gQkNNT0xUX1BPTl9TVEFURV9JTkFDVElWRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfTkVXX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm5ld19zdGF0ZSA9IEJDTU9MVF9QT05fU1RBVEVfSU5BQ1RJVkU7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3VsdF9wYWNrKHRoaXMtPnJlc3VsdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX1BSRVZJT1VTX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bvbl9zdGF0ZV9wYWNrKHRoaXMtPnByZXZpb3VzX3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfTkVXX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bvbl9zdGF0ZV9wYWNrKHRoaXMtPm5ld19zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX1BSRVZJT1VTX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX05FV19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3VsdF91bnBhY2soJnRoaXMtPnJlc3VsdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX1BSRVZJT1VTX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bvbl9zdGF0ZV91bnBhY2soJnRoaXMtPnByZXZpb3VzX3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfTkVXX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bvbl9zdGF0ZV91bnBhY2soJnRoaXMtPm5ld19zdGF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX1BSRVZJT1VTX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9ORVdfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX1JFU1VMVCkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnJlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1M6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SRVNVTFRfRkFJTDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfUkVTVUxUOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9QUkVWSU9VU19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnByZXZpb3VzX3N0YXRlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9QT05fU1RBVEVfSU5BQ1RJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9QT05fU1RBVEVfUFJPQ0VTU0lORzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BPTl9TVEFURV9BQ1RJVkVfV09SS0lORzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BPTl9TVEFURV9BQ1RJVkVfU1RBTkRCWToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfUFJFVklPVVNfU1RBVEU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX05FV19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPm5ld19zdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUE9OX1NUQVRFX0lOQUNUSVZFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUE9OX1NUQVRFX1BST0NFU1NJTkc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9QT05fU1RBVEVfQUNUSVZFX1dPUktJTkc6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9QT05fU1RBVEVfQUNUSVZFX1NUQU5EQlk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX05FV19TVEFURTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfVE9EX1NUUklORykpICE9IDApCisgICAgeworICAgICAgICBtZW1zZXQodGhpcy0+dG9kX3N0cmluZy5zdHIsIDAsIDY0KTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9TRkMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c2ZjID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9SVENfT0ZGU0VUX1NFQykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5ydGNfb2Zmc2V0X3NlYyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfUlRDX09GRlNFVF9OU0VDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ0Y19vZmZzZXRfbnNlYyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXR1cyA9IEJDTU9MVF9SRVNVTFRfU1VDQ0VTUzsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9UT0RfU1RSSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0cl82NF9wYWNrKCZ0aGlzLT50b2Rfc3RyaW5nLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9TRkMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnNmYykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1JUQ19PRkZTRVRfU0VDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5ydGNfb2Zmc2V0X3NlYykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1JUQ19PRkZTRVRfTlNFQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+cnRjX29mZnNldF9uc2VjKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3VsdF9wYWNrKHRoaXMtPnN0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfVE9EX1NUUklORykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA2NDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9TRkMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9SVENfT0ZGU0VUX1NFQykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1JUQ19PRkZTRVRfTlNFQykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfVE9EX1NUUklORykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdHJfNjRfdW5wYWNrKCZ0aGlzLT50b2Rfc3RyaW5nLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1NGQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+c2ZjKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfUlRDX09GRlNFVF9TRUMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ0Y19vZmZzZXRfc2VjKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfUlRDX09GRlNFVF9OU0VDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5ydGNfb2Zmc2V0X25zZWMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzdWx0X3VucGFjaygmdGhpcy0+c3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9UT0RfU1RSSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNjQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9TRkMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfUlRDX09GRlNFVF9TRUMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfUlRDX09GRlNFVF9OU0VDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9UT0RfU1RSSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0cl82NF9ib3VuZHNfY2hlY2soJnRoaXMtPnRvZF9zdHJpbmcpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1RPRF9TVFJJTkc7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JFU1VMVF9TVUNDRVNTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVTVUxUX0ZBSUw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfU1RBVFVTOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9BQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9DUFVfUEFDS0VUU19GQUlMVVJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNwdV9wYWNrZXRzX2ZhaWx1cmUgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX0RFQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9ESVNBQkxFX0FMTF9PTlVTX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfRU5BQkxFX0FMTF9PTlVTX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5lbmFibGVfYWxsX29udXNfY29tcGxldGVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9MT1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bG9zID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9PTlVfRElTQ09WRVJFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vbnVfZGlzY292ZXJlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfT05VX1VQR1JBREVfQ09NUExFVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b251X3VwZ3JhZGVfY29tcGxldGUgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfUk9HVUVfT05VX1NQRUNJQUxfTUFQX0NZQ0xFX1NUQVJUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfU0VSSUFMX05VTUJFUl9BQ1FVSVNJVElPTl9DWUNMRV9TVEFSVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0ID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXRfYWxhcm1fY2xlYXJlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdF9hbGFybV9yYWlzZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdGVfY2hhbmdlX2NvbXBsZXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfVE9EX1JFUVVFU1RfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnRvZF9yZXF1ZXN0X2NvbXBsZXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX0FDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfQ1BVX1BBQ0tFVFNfRkFJTFVSRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmNwdV9wYWNrZXRzX2ZhaWx1cmUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX0RFQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+ZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX0RJU0FCTEVfQUxMX09OVVNfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+ZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX0VOQUJMRV9BTExfT05VU19DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5lbmFibGVfYWxsX29udXNfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9MT1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5sb3MpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX09OVV9ESVNDT1ZFUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+b251X2Rpc2NvdmVyZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX09OVV9VUEdSQURFX0NPTVBMRVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+b251X3VwZ3JhZGVfY29tcGxldGUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+cHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+cHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+cHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9ST0dVRV9PTlVfU1BFQ0lBTF9NQVBfQ1lDTEVfU1RBUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1NFUklBTF9OVU1CRVJfQUNRVUlTSVRJT05fQ1lDTEVfU1RBUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnN0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5zdGF0X2FsYXJtX2NsZWFyZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhdF9hbGFybV9yYWlzZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5zdGF0ZV9jaGFuZ2VfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9UT0RfUkVRVUVTVF9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT50b2RfcmVxdWVzdF9jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9BQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX0NQVV9QQUNLRVRTX0ZBSUxVUkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX0RFQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9ESVNBQkxFX0FMTF9PTlVTX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfRU5BQkxFX0FMTF9PTlVTX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfTE9TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9PTlVfRElTQ09WRVJFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfT05VX1VQR1JBREVfQ09NUExFVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1JPR1VFX09OVV9TUEVDSUFMX01BUF9DWUNMRV9TVEFSVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfU0VSSUFMX05VTUJFUl9BQ1FVSVNJVElPTl9DWUNMRV9TVEFSVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1RPRF9SRVFVRVNUX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+YWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9DUFVfUEFDS0VUU19GQUlMVVJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+Y3B1X3BhY2tldHNfZmFpbHVyZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfREVBQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfRElTQUJMRV9BTExfT05VU19DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfRU5BQkxFX0FMTF9PTlVTX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmVuYWJsZV9hbGxfb251c19jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX0xPUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmxvcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfT05VX0RJU0NPVkVSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5vbnVfZGlzY292ZXJlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfT05VX1VQR1JBREVfQ09NUExFVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5vbnVfdXBncmFkZV9jb21wbGV0ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfU1dJVENIT1ZFUl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnJvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1JPR1VFX09OVV9TUEVDSUFMX01BUF9DWUNMRV9TVEFSVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnJvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfU0VSSUFMX05VTUJFUl9BQ1FVSVNJVElPTl9DWUNMRV9TVEFSVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnNlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnN0YXRfYWxhcm1fY2xlYXJlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zdGF0X2FsYXJtX3JhaXNlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnN0YXRlX2NoYW5nZV9jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1RPRF9SRVFVRVNUX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnRvZF9yZXF1ZXN0X2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9BQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9DUFVfUEFDS0VUU19GQUlMVVJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfREVBQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9ESVNBQkxFX0FMTF9PTlVTX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX0VOQUJMRV9BTExfT05VU19DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9MT1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9PTlVfRElTQ09WRVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX09OVV9VUEdSQURFX0NPTVBMRVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1JPR1VFX09OVV9TUEVDSUFMX01BUF9DWUNMRV9TVEFSVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1NFUklBTF9OVU1CRVJfQUNRVUlTSVRJT05fQ1lDTEVfU1RBUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1RPRF9SRVFVRVNUX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBtZW1zZXQodGhpcy0+c2VyaWFsX251bWJlci52ZW5kb3JfaWQsIDAsIHNpemVvZih0aGlzLT5zZXJpYWxfbnVtYmVyLnZlbmRvcl9pZCkpOworICAgICAgICBtZW1zZXQodGhpcy0+c2VyaWFsX251bWJlci52ZW5kb3Jfc3BlY2lmaWMsIDAsIHNpemVvZih0aGlzLT5zZXJpYWxfbnVtYmVyLnZlbmRvcl9zcGVjaWZpYykpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfRlJFUUVOQ1lfQURKVVNUTUVOVF9ESVJFQ1RJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZnJlcWVuY3lfYWRqdXN0bWVudF9kaXJlY3Rpb24gPSBCQ01PTFRfRlJFUVVFTkNZX0FESlVTVE1FTlRfRElSRUNUSU9OX0xPV0VSOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfRlJFUVVFTkNZX0FESlVTVE1FTlRfU0laRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmVxdWVuY3lfYWRqdXN0bWVudF9zaXplID0gMTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BREpVU1RfVFhfV0FWRUxFTkdUSF9JRF9TRVJJQUxfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3NlcmlhbF9udW1iZXJfcGFjaygmdGhpcy0+c2VyaWFsX251bWJlciwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BREpVU1RfVFhfV0FWRUxFTkdUSF9JRF9GUkVRRU5DWV9BREpVU1RNRU5UX0RJUkVDVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9mcmVxdWVuY3lfYWRqdXN0bWVudF9kaXJlY3Rpb25fcGFjayh0aGlzLT5mcmVxZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BREpVU1RfVFhfV0FWRUxFTkdUSF9JRF9GUkVRVUVOQ1lfQURKVVNUTUVOVF9TSVpFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmZyZXF1ZW5jeV9hZGp1c3RtZW50X3NpemUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BREpVU1RfVFhfV0FWRUxFTkdUSF9JRF9TRVJJQUxfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BREpVU1RfVFhfV0FWRUxFTkdUSF9JRF9GUkVRRU5DWV9BREpVU1RNRU5UX0RJUkVDVElPTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfRlJFUVVFTkNZX0FESlVTVE1FTlRfU0laRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zZXJpYWxfbnVtYmVyX3VucGFjaygmdGhpcy0+c2VyaWFsX251bWJlciwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FESlVTVF9UWF9XQVZFTEVOR1RIX0lEX0ZSRVFFTkNZX0FESlVTVE1FTlRfRElSRUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2ZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbl91bnBhY2soJnRoaXMtPmZyZXFlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0FESlVTVF9UWF9XQVZFTEVOR1RIX0lEX0ZSRVFVRU5DWV9BREpVU1RNRU5UX1NJWkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+ZnJlcXVlbmN5X2FkanVzdG1lbnRfc2l6ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BREpVU1RfVFhfV0FWRUxFTkdUSF9JRF9TRVJJQUxfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfRlJFUUVOQ1lfQURKVVNUTUVOVF9ESVJFQ1RJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BREpVU1RfVFhfV0FWRUxFTkdUSF9JRF9GUkVRVUVOQ1lfQURKVVNUTUVOVF9TSVpFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zZXJpYWxfbnVtYmVyX2JvdW5kc19jaGVjaygmdGhpcy0+c2VyaWFsX251bWJlcikpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9BREpVU1RfVFhfV0FWRUxFTkdUSF9JRF9TRVJJQUxfTlVNQkVSOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BREpVU1RfVFhfV0FWRUxFTkdUSF9JRF9GUkVRRU5DWV9BREpVU1RNRU5UX0RJUkVDVElPTikpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmZyZXFlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9GUkVRVUVOQ1lfQURKVVNUTUVOVF9ESVJFQ1RJT05fTE9XRVI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9GUkVRVUVOQ1lfQURKVVNUTUVOVF9ESVJFQ1RJT05fSElHSEVSOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfRlJFUUVOQ1lfQURKVVNUTUVOVF9ESVJFQ1RJT047CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9BREpVU1RfVFhfV0FWRUxFTkdUSF9JRF9GUkVRVUVOQ1lfQURKVVNUTUVOVF9TSVpFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5mcmVxdWVuY3lfYWRqdXN0bWVudF9zaXplID4gMTApCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9BREpVU1RfVFhfV0FWRUxFTkdUSF9JRF9GUkVRVUVOQ1lfQURKVVNUTUVOVF9TSVpFOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Y29udHJvbCA9IEJDTU9MVF9ESVNBQkxFX1NFUklBTF9OVU1CRVJfQ09OVFJPTF9VTklDQVNUX0RJU0FCTEU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ESVNBQkxFX1NFUklBTF9OVU1CRVJfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBtZW1zZXQodGhpcy0+c2VyaWFsX251bWJlci52ZW5kb3JfaWQsIDAsIHNpemVvZih0aGlzLT5zZXJpYWxfbnVtYmVyLnZlbmRvcl9pZCkpOworICAgICAgICBtZW1zZXQodGhpcy0+c2VyaWFsX251bWJlci52ZW5kb3Jfc3BlY2lmaWMsIDAsIHNpemVvZih0aGlzLT5zZXJpYWxfbnVtYmVyLnZlbmRvcl9zcGVjaWZpYykpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2NvbnRyb2xfcGFjayh0aGlzLT5jb250cm9sLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9JRF9TRVJJQUxfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3NlcmlhbF9udW1iZXJfcGFjaygmdGhpcy0+c2VyaWFsX251bWJlciwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ESVNBQkxFX1NFUklBTF9OVU1CRVJfSURfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2NvbnRyb2xfdW5wYWNrKCZ0aGlzLT5jb250cm9sLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9JRF9TRVJJQUxfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3NlcmlhbF9udW1iZXJfdW5wYWNrKCZ0aGlzLT5zZXJpYWxfbnVtYmVyLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ESVNBQkxFX1NFUklBTF9OVU1CRVJfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9JRF9DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+Y29udHJvbCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0NPTlRST0xfVU5JQ0FTVF9ESVNBQkxFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0NPTlRST0xfVU5JQ0FTVF9FTkFCTEU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ESVNBQkxFX1NFUklBTF9OVU1CRVJfQ09OVFJPTF9CUk9BRENBU1RfRU5BQkxFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0NPTlRST0xfQlJPQURDQVNUX0RJU0FCTEU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ESVNBQkxFX1NFUklBTF9OVU1CRVJfQ09OVFJPTF9ESVNBQkxFX0RJU0NPVkVSWToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9JRF9DT05UUk9MOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc2VyaWFsX251bWJlcl9ib3VuZHNfY2hlY2soJnRoaXMtPnNlcmlhbF9udW1iZXIpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX1NFUklBTF9OVU1CRVI7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfV0lORE9XX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+d2luZG93X3R5cGUgPSBCQ01PTFRfUk9HVUVfREVURUNUSU9OX1dJTkRPV19TSUxFTlRfV0lORE9XOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9BTExPQ19JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hbGxvY19pZCA9IChiY21vbHRfeGdwb25fYWxsb2NfaWQpIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vbnVfaWQgPSAoYmNtb2x0X3hncG9uX29udV9pZCkgMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfU0VDT05EX1JBTkdJTkdfV0lORE9XKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnNlY29uZF9yYW5naW5nX3dpbmRvdyA9IEJDTU9TX0ZBTFNFOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX1dJTkRPV19UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfcGFjayh0aGlzLT53aW5kb3dfdHlwZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX0FMTE9DX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMtPmFsbG9jX2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5vbnVfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfU0VDT05EX1JBTkdJTkdfV0lORE9XKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c2Vjb25kX3Jhbmdpbmdfd2luZG93KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfV0lORE9XX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfT05VX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX1NFQ09ORF9SQU5HSU5HX1dJTkRPVykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfV0lORE9XX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd191bnBhY2soJnRoaXMtPndpbmRvd190eXBlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5hbGxvY19pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5vbnVfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfU0VDT05EX1JBTkdJTkdfV0lORE9XKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+c2Vjb25kX3Jhbmdpbmdfd2luZG93KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9XSU5ET1dfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfU0VDT05EX1JBTkdJTkdfV0lORE9XKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9XSU5ET1dfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPndpbmRvd190eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX1NJTEVOVF9XSU5ET1c6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0NVVF9PRkZfV0lORE9XOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9XSU5ET1dfVFlQRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmFsbG9jX2lkID4gKGJjbW9sdF94Z3Bvbl9hbGxvY19pZCkgMTYzODMpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX0FMTE9DX0lEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+b251X2lkID4gKGJjbW9sdF94Z3Bvbl9vbnVfaWQpIDUxMSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfT05VX0lEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUlVOX1NQRUNJQUxfQldfTUFQX0lEX05VTUJFUl9PRl9DWUNMRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5udW1iZXJfb2ZfY3ljbGUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUlVOX1NQRUNJQUxfQldfTUFQX0lEX0FMTE9DQVRJT05fTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFsbG9jYXRpb25fbnVtYmVyID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JVTl9TUEVDSUFMX0JXX01BUF9JRF9CV19NQVBfQVJSQVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YndfbWFwX2FycmF5ID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JVTl9TUEVDSUFMX0JXX01BUF9JRF9OVU1CRVJfT0ZfQ1lDTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bnVtYmVyX29mX2N5Y2xlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9SVU5fU1BFQ0lBTF9CV19NQVBfSURfQUxMT0NBVElPTl9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+YWxsb2NhdGlvbl9udW1iZXIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JVTl9TUEVDSUFMX0JXX01BUF9JRF9CV19NQVBfQVJSQVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+YndfbWFwX2FycmF5KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9SVU5fU1BFQ0lBTF9CV19NQVBfSURfTlVNQkVSX09GX0NZQ0xFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9SVU5fU1BFQ0lBTF9CV19NQVBfSURfQUxMT0NBVElPTl9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JVTl9TUEVDSUFMX0JXX01BUF9JRF9CV19NQVBfQVJSQVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUlVOX1NQRUNJQUxfQldfTUFQX0lEX05VTUJFUl9PRl9DWUNMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5udW1iZXJfb2ZfY3ljbGUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JVTl9TUEVDSUFMX0JXX01BUF9JRF9BTExPQ0FUSU9OX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5hbGxvY2F0aW9uX251bWJlcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfUlVOX1NQRUNJQUxfQldfTUFQX0lEX0JXX01BUF9BUlJBWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5id19tYXBfYXJyYXkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1JVTl9TUEVDSUFMX0JXX01BUF9JRF9OVU1CRVJfT0ZfQ1lDTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9SVU5fU1BFQ0lBTF9CV19NQVBfSURfQUxMT0NBVElPTl9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9SVU5fU1BFQ0lBTF9CV19NQVBfSURfQldfTUFQX0FSUkFZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU0VUX09OVV9TVEFURV9JRF9PTlVfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b251X3N0YXRlID0gQkNNT0xUX09OVV9PUEVSQVRJT05fSU5BQ1RJVkU7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X29udV9vcGVyYXRpb25fcGFjayh0aGlzLT5vbnVfc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TRVRfT05VX1NUQVRFX0lEX09OVV9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X29udV9vcGVyYXRpb25fdW5wYWNrKCZ0aGlzLT5vbnVfc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU0VUX09OVV9TVEFURV9JRF9PTlVfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5vbnVfc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9PUEVSQVRJT05fSU5BQ1RJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfT1BFUkFUSU9OX0FDVElWRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9PUEVSQVRJT05fRElTQUJMRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9PUEVSQVRJT05fRU5BQkxFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX09QRVJBVElPTl9BQ1RJVkVfU1RBTkRCWToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9PUEVSQVRJT05fQVdBS0VfRlJFRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU0VUX1BPTl9TVEFURV9JRF9QT05fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cG9uX3N0YXRlID0gQkNNT0xUX1BPTl9PUEVSQVRJT05fSU5BQ1RJVkU7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NFVF9QT05fU1RBVEVfSURfUE9OX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bvbl9vcGVyYXRpb25fcGFjayh0aGlzLT5wb25fc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TRVRfUE9OX1NUQVRFX0lEX1BPTl9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NFVF9QT05fU1RBVEVfSURfUE9OX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bvbl9vcGVyYXRpb25fdW5wYWNrKCZ0aGlzLT5wb25fc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NFVF9QT05fU1RBVEVfSURfUE9OX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU0VUX1BPTl9TVEFURV9JRF9QT05fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5wb25fc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BPTl9PUEVSQVRJT05fSU5BQ1RJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9QT05fT1BFUkFUSU9OX0FDVElWRV9XT1JLSU5HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUE9OX09QRVJBVElPTl9BQ1RJVkVfU1RBTkRCWToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX1NFVF9QT05fU1RBVEVfSURfUE9OX1NUQVRFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9TVEFSVF9PTlVfVVBHUkFERV9JRF9MSVNUX09GX09OVV9JRFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bGlzdF9vZl9vbnVfaWRzLmxlbiA9IDA7CisgICAgICAgIHRoaXMtPmxpc3Rfb2Zfb251X2lkcy52YWwgPSBOVUxMOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVJUX09OVV9VUEdSQURFX0lEX0xJU1RfT0ZfT05VX0lEUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fb251X2lkX2xpc3RfdTMyX3BhY2soJnRoaXMtPmxpc3Rfb2Zfb251X2lkcywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBUlRfT05VX1VQR1JBREVfSURfTElTVF9PRl9PTlVfSURTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF9wb25fb251X2lkX2xpc3RfdTMyX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5saXN0X29mX29udV9pZHMpOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfU1RBUlRfT05VX1VQR1JBREVfSURfTElTVF9PRl9PTlVfSURTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bvbl9vbnVfaWRfbGlzdF91MzJfdW5wYWNrKCZ0aGlzLT5saXN0X29mX29udV9pZHMsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVJUX09OVV9VUEdSQURFX0lEX0xJU1RfT0ZfT05VX0lEUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fb251X2lkX2xpc3RfdTMyX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX1NUQVJUX09OVV9VUEdSQURFX0lEX0xJU1RfT0ZfT05VX0lEUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25fb251X2lkX2xpc3RfdTMyX2JvdW5kc19jaGVjaygmdGhpcy0+bGlzdF9vZl9vbnVfaWRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX05JX1NUQVJUX09OVV9VUEdSQURFX0lEX0xJU1RfT0ZfT05VX0lEUzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQlJPQURDQVNUX1BMT0FNX1BBQ0tFVF9JRF9QTE9BTSkpICE9IDApCisgICAgeworICAgICAgICBtZW1zZXQodGhpcy0+cGxvYW0uYXJyLCAwLCBzaXplb2YodGhpcy0+cGxvYW0uYXJyKSk7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0JST0FEQ0FTVF9QTE9BTV9QQUNLRVRfSURfUExPQU0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXJyX3U4XzQwX3BhY2soJnRoaXMtPnBsb2FtLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQlJPQURDQVNUX1BMT0FNX1BBQ0tFVF9JRF9QTE9BTSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0MDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9CUk9BRENBU1RfUExPQU1fUEFDS0VUX0lEX1BMT0FNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl91OF80MF91bnBhY2soJnRoaXMtPnBsb2FtLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0JST0FEQ0FTVF9QTE9BTV9QQUNLRVRfSURfUExPQU0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0MCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQlJPQURDQVNUX1BMT0FNX1BBQ0tFVF9JRF9QTE9BTSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfdThfNDBfYm91bmRzX2NoZWNrKCZ0aGlzLT5wbG9hbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9CUk9BRENBU1RfUExPQU1fUEFDS0VUX0lEX1BMT0FNOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBhY2tldF90eXBlID0gQkNNT0xUX1BBQ0tFVF9UWVBFX0NQVTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0lEX0NBTENfQ1JDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNhbGNfY3JjID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9HRU1fUE9SVF9MSVNUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmdlbV9wb3J0X2xpc3QubGVuID0gMDsKKyAgICAgICAgdGhpcy0+Z2VtX3BvcnRfbGlzdC52YWwgPSBOVUxMOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmJ1ZmZlci5sZW4gPSAwOworICAgICAgICB0aGlzLT5idWZmZXIudmFsID0gTlVMTDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wYWNrZXRfdHlwZV9wYWNrKHRoaXMtPnBhY2tldF90eXBlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0lEX0NBTENfQ1JDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+Y2FsY19jcmMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0lEX0dFTV9QT1JUX0xJU1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2X3BhY2soJnRoaXMtPmdlbV9wb3J0X2xpc3QsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4X3BhY2soJnRoaXMtPmJ1ZmZlciwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfSURfUEFDS0VUX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0lEX0NBTENfQ1JDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9HRU1fUE9SVF9MSVNUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF94Z3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTZfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmdlbV9wb3J0X2xpc3QpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+YnVmZmVyKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3BhY2tldF90eXBlX3VucGFjaygmdGhpcy0+cGFja2V0X3R5cGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfSURfQ0FMQ19DUkMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5jYWxjX2NyYykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfSURfR0VNX1BPUlRfTElTVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTZfdW5wYWNrKCZ0aGlzLT5nZW1fcG9ydF9saXN0LCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4X3VucGFjaygmdGhpcy0+YnVmZmVyLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0lEX0NBTENfQ1JDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfSURfR0VNX1BPUlRfTElTVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTZfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4X3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+cGFja2V0X3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BBQ0tFVF9UWVBFX0NQVToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BBQ0tFVF9UWVBFX09NQ0k6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfVFlQRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0lEX0dFTV9QT1JUX0xJU1QpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmdlbV9wb3J0X2xpc3QubGVuID4gMTYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNl9ib3VuZHNfY2hlY2soJnRoaXMtPmdlbV9wb3J0X2xpc3QpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfSURfR0VNX1BPUlRfTElTVDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5idWZmZXIubGVuID4gMjA0OCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDhfYm91bmRzX2NoZWNrKCZ0aGlzLT5idWZmZXIpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vbnVfaWQgPSAoYmNtb2x0X3hncG9uX29udV9pZCkgMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcy0+cG9uX25pKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5vbnVfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X3VucGFjayhiY21vbHRfeGdwb25fb251X2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgKHVpbnQ4X3QgKikgJnRoaXMtPnBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopICZ0aGlzLT5vbnVfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX09OVV9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9rZXlfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnBvbl9uaSA+IChiY21vbHRfeGdwb25fbmkpIDcpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX1BPTl9OSTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9PTlVfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPm9udV9pZCA+IChiY21vbHRfeGdwb25fb251X2lkKSA1MTEpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX09OVV9JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fb251X2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9PTlVfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b251X3N0YXRlID0gQkNNT0xUX09OVV9TVEFURV9OT1RfQ09ORklHVVJFRDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfT05VX09MRF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vbnVfb2xkX3N0YXRlID0gQkNNT0xUX09OVV9TVEFURV9OT1RfQ09ORklHVVJFRDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQUxBUk1fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdGUubG9zaSA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgICAgICB0aGlzLT5hbGFybV9zdGF0ZS5sb2JpID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXRlLmxvcGNpID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXRlLmxvcGNpX21pY19lcnJvciA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgICAgICB0aGlzLT5hbGFybV9zdGF0ZS5sb29jaSA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgICAgICB0aGlzLT5hbGFybV9zdGF0ZS50aXdpID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXRlLmRvd2kgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdGUuc3VmaSA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgICAgICB0aGlzLT5hbGFybV9zdGF0ZS5zZmkgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdGUuc2RpID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXRlLmRmaSA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgICAgICB0aGlzLT5hbGFybV9zdGF0ZS5kZ2kgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdGUucHFzaSA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SRUdJU1RSQVRJT05fRU5DUllQVElPTl9LRVlTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIG1lbXNldCh0aGlzLT5yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLnBsb2FtX2lrLmJ5dGVzLCAwLCBzaXplb2YodGhpcy0+cmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5wbG9hbV9pay5ieXRlcykpOworICAgICAgICBtZW1zZXQodGhpcy0+cmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5vbWNpX2lrLmJ5dGVzLCAwLCBzaXplb2YodGhpcy0+cmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5vbWNpX2lrLmJ5dGVzKSk7CisgICAgICAgIG1lbXNldCh0aGlzLT5yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLm9tY2lfazEuYnl0ZXMsIDAsIHNpemVvZih0aGlzLT5yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLm9tY2lfazEuYnl0ZXMpKTsKKyAgICAgICAgbWVtc2V0KHRoaXMtPnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMub21jaV9rMi5ieXRlcywgMCwgc2l6ZW9mKHRoaXMtPnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMub21jaV9rMi5ieXRlcykpOworICAgICAgICBtZW1zZXQodGhpcy0+cmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5rZWsuYnl0ZXMsIDAsIHNpemVvZih0aGlzLT5yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLmtlay5ieXRlcykpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9DVVJSRU5UX0VOQ1JZUFRJT05fS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIG1lbXNldCh0aGlzLT5jdXJyZW50X2VuY3J5cHRpb25fa2V5LmVuY3J5cHRpb25fa2V5LmJ5dGVzLCAwLCBzaXplb2YodGhpcy0+Y3VycmVudF9lbmNyeXB0aW9uX2tleS5lbmNyeXB0aW9uX2tleS5ieXRlcykpOworICAgICAgICB0aGlzLT5jdXJyZW50X2VuY3J5cHRpb25fa2V5LmtleV9pbmRleCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgbWVtc2V0KHRoaXMtPnNlcmlhbF9udW1iZXIudmVuZG9yX2lkLCAwLCBzaXplb2YodGhpcy0+c2VyaWFsX251bWJlci52ZW5kb3JfaWQpKTsKKyAgICAgICAgbWVtc2V0KHRoaXMtPnNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljLCAwLCBzaXplb2YodGhpcy0+c2VyaWFsX251bWJlci52ZW5kb3Jfc3BlY2lmaWMpKTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkVHSVNUUkFUSU9OX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIG1lbXNldCh0aGlzLT5yZWdpc3RyYXRpb25faWQuYXJyLCAwLCBzaXplb2YodGhpcy0+cmVnaXN0cmF0aW9uX2lkLmFycikpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SRUdJU1RSQVRJT05fSURfQVVUT19MRUFSTklORykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yZWdpc3RyYXRpb25faWRfYXV0b19sZWFybmluZyA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SQU5HSU5HX0JVUlNUX1BST0ZJTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmFuZ2luZ19idXJzdF9wcm9maWxlID0gKGJjbW9sdF9idXJzdF9wcm9maWxlX2luZGV4KSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9EQVRBX0JVUlNUX1BST0ZJTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZGF0YV9idXJzdF9wcm9maWxlID0gKGJjbW9sdF9idXJzdF9wcm9maWxlX2luZGV4KSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SQU5HSU5HX1RJTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmFuZ2luZ190aW1lID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfRElTQUJMRURfQUZURVJfRElTQ09WRVJZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRpc2FibGVkX2FmdGVyX2Rpc2NvdmVyeSA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9ERUFDVElWQVRJT05fUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRlYWN0aXZhdGlvbl9yZWFzb24gPSBCQ01PTFRfREVBQ1RJVkFUSU9OX1JFQVNPTl9OT05FOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9BTExfR0VNX1BPUlRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFsbF9nZW1fcG9ydHMubGVuID0gMDsKKyAgICAgICAgdGhpcy0+YWxsX2dlbV9wb3J0cy52YWwgPSBOVUxMOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9BTExfQUxMT0NTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFsbF9hbGxvY3MubGVuID0gMDsKKyAgICAgICAgdGhpcy0+YWxsX2FsbG9jcy52YWwgPSBOVUxMOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9FWFRFTkRFRF9HVUFSRF9USU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmV4dGVuZGVkX2d1YXJkX3RpbWUuYWRkaXRpb25hbF9wcmVidXJzdF9ndWFyZF90aW1lID0gMDsKKyAgICAgICAgdGhpcy0+ZXh0ZW5kZWRfZ3VhcmRfdGltZS5hZGRpdGlvbmFsX3Bvc3RidXJzdF9ndWFyZF90aW1lID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfVVNfTElORV9SQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnVzX2xpbmVfcmF0ZSA9IEJDTU9MVF9VUFNUUkVBTV9MSU5FX1JBVEVfQ0FQQUJJTElUSUVTX1JBVEVfMl9QXzVfRzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQ0FMSUJSQVRJT05fUkVDT1JEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIG1lbXNldCh0aGlzLT5jYWxpYnJhdGlvbl9yZWNvcmQuYXJyLCAwLCBzaXplb2YodGhpcy0+Y2FsaWJyYXRpb25fcmVjb3JkLmFycikpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9UVU5JTkdfR1JBTlVMQVJJVFkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHVuaW5nX2dyYW51bGFyaXR5ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfU1RFUF9UVU5JTkdfVElNRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGVwX3R1bmluZ190aW1lID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUE9XRVJfTEVWRUxMSU5HX0NBUEFCSUxJVElFUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0aWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkVRVUVTVF9SRUdJU1RSQVRJT05fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cy5yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0ZSA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU7CisgICAgICAgIHRoaXMtPnJlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cy5zbWFfZmxhZyA9IEJDTU9TX0ZBTFNFOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX09OVV9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9vbnVfc3RhdGVfcGFjayh0aGlzLT5vbnVfc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9PTlVfT0xEX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X29udV9zdGF0ZV9wYWNrKHRoaXMtPm9udV9vbGRfc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9BTEFSTV9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGVfcGFjaygmdGhpcy0+YWxhcm1fc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SRUdJU1RSQVRJT05fRU5DUllQVElPTl9LRVlTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25fa2V5c19wYWNrKCZ0aGlzLT5yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQ1VSUkVOVF9FTkNSWVBUSU9OX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9vbnVfYWVzX2tleV9wYWNrKCZ0aGlzLT5jdXJyZW50X2VuY3J5cHRpb25fa2V5LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zZXJpYWxfbnVtYmVyX3BhY2soJnRoaXMtPnNlcmlhbF9udW1iZXIsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SRUdJU1RSQVRJT05fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXJyX3U4XzM2X3BhY2soJnRoaXMtPnJlZ2lzdHJhdGlvbl9pZCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JFR0lTVFJBVElPTl9JRF9BVVRPX0xFQVJOSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+cmVnaXN0cmF0aW9uX2lkX2F1dG9fbGVhcm5pbmcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkFOR0lOR19CVVJTVF9QUk9GSUxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzLT5yYW5naW5nX2J1cnN0X3Byb2ZpbGUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfREFUQV9CVVJTVF9QUk9GSUxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzLT5kYXRhX2J1cnN0X3Byb2ZpbGUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkFOR0lOR19USU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5yYW5naW5nX3RpbWUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfRElTQUJMRURfQUZURVJfRElTQ09WRVJZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPmRpc2FibGVkX2FmdGVyX2Rpc2NvdmVyeSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0RFQUNUSVZBVElPTl9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZGVhY3RpdmF0aW9uX3JlYXNvbl9wYWNrKHRoaXMtPmRlYWN0aXZhdGlvbl9yZWFzb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9BTExfR0VNX1BPUlRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1Nl9wYWNrKCZ0aGlzLT5hbGxfZ2VtX3BvcnRzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQUxMX0FMTE9DUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMl9wYWNrKCZ0aGlzLT5hbGxfYWxsb2NzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfRVhURU5ERURfR1VBUkRfVElNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9leHRlbmRlZF9ndWFyZF90aW1lX3BhY2soJnRoaXMtPmV4dGVuZGVkX2d1YXJkX3RpbWUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9VU19MSU5FX1JBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdXBzdHJlYW1fbGluZV9yYXRlX2NhcGFiaWxpdGllc19wYWNrKHRoaXMtPnVzX2xpbmVfcmF0ZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0NBTElCUkFUSU9OX1JFQ09SRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfY2FsaWJyYXRpb25fcmVjb3JkXzhfcGFjaygmdGhpcy0+Y2FsaWJyYXRpb25fcmVjb3JkLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfVFVOSU5HX0dSQU5VTEFSSVRZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnR1bmluZ19ncmFudWxhcml0eSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9TVEVQX1RVTklOR19USU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnN0ZXBfdHVuaW5nX3RpbWUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUE9XRVJfTEVWRUxMSU5HX0NBUEFCSUxJVElFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5wb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0aWVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JFUVVFU1RfUkVHSVNUUkFUSU9OX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXNfcGFjaygmdGhpcy0+cmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9PTlVfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfT05VX09MRF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9BTEFSTV9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxMzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkVHSVNUUkFUSU9OX0VOQ1JZUFRJT05fS0VZUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4MDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQ1VSUkVOVF9FTkNSWVBUSU9OX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxNzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SRUdJU1RSQVRJT05fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMzY7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JFR0lTVFJBVElPTl9JRF9BVVRPX0xFQVJOSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JBTkdJTkdfQlVSU1RfUFJPRklMRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9EQVRBX0JVUlNUX1BST0ZJTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkFOR0lOR19USU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0RJU0FCTEVEX0FGVEVSX0RJU0NPVkVSWSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9ERUFDVElWQVRJT05fUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0FMTF9HRU1fUE9SVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1Nl9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+YWxsX2dlbV9wb3J0cyk7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0FMTF9BTExPQ1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5hbGxfYWxsb2NzKTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfRVhURU5ERURfR1VBUkRfVElNRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9VU19MSU5FX1JBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQ0FMSUJSQVRJT05fUkVDT1JEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1RVTklOR19HUkFOVUxBUklUWSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9TVEVQX1RVTklOR19USU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1BPV0VSX0xFVkVMTElOR19DQVBBQklMSVRJRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkVRVUVTVF9SRUdJU1RSQVRJT05fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2NmZ19kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9PTlVfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfb251X3N0YXRlX3VucGFjaygmdGhpcy0+b251X3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfT05VX09MRF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9vbnVfc3RhdGVfdW5wYWNrKCZ0aGlzLT5vbnVfb2xkX3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQUxBUk1fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlX3VucGFjaygmdGhpcy0+YWxhcm1fc3RhdGUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JFR0lTVFJBVElPTl9FTkNSWVBUSU9OX0tFWVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9rZXlzX3VucGFjaygmdGhpcy0+cmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQ1VSUkVOVF9FTkNSWVBUSU9OX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9vbnVfYWVzX2tleV91bnBhY2soJnRoaXMtPmN1cnJlbnRfZW5jcnlwdGlvbl9rZXksIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc2VyaWFsX251bWJlcl91bnBhY2soJnRoaXMtPnNlcmlhbF9udW1iZXIsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JFR0lTVFJBVElPTl9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfdThfMzZfdW5wYWNrKCZ0aGlzLT5yZWdpc3RyYXRpb25faWQsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JFR0lTVFJBVElPTl9JRF9BVVRPX0xFQVJOSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+cmVnaXN0cmF0aW9uX2lkX2F1dG9fbGVhcm5pbmcpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkFOR0lOR19CVVJTVF9QUk9GSUxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgKHVpbnQ4X3QgKikgJnRoaXMtPnJhbmdpbmdfYnVyc3RfcHJvZmlsZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9EQVRBX0JVUlNUX1BST0ZJTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAodWludDhfdCAqKSAmdGhpcy0+ZGF0YV9idXJzdF9wcm9maWxlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JBTkdJTkdfVElNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+cmFuZ2luZ190aW1lKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0RJU0FCTEVEX0FGVEVSX0RJU0NPVkVSWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5kaXNhYmxlZF9hZnRlcl9kaXNjb3ZlcnksIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9ERUFDVElWQVRJT05fUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2RlYWN0aXZhdGlvbl9yZWFzb25fdW5wYWNrKCZ0aGlzLT5kZWFjdGl2YXRpb25fcmVhc29uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQUxMX0dFTV9QT1JUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTZfdW5wYWNrKCZ0aGlzLT5hbGxfZ2VtX3BvcnRzLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9BTExfQUxMT0NTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyX3VucGFjaygmdGhpcy0+YWxsX2FsbG9jcywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfRVhURU5ERURfR1VBUkRfVElNRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9leHRlbmRlZF9ndWFyZF90aW1lX3VucGFjaygmdGhpcy0+ZXh0ZW5kZWRfZ3VhcmRfdGltZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfVVNfTElORV9SQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Vwc3RyZWFtX2xpbmVfcmF0ZV9jYXBhYmlsaXRpZXNfdW5wYWNrKCZ0aGlzLT51c19saW5lX3JhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9DQUxJQlJBVElPTl9SRUNPUkQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXJyX2NhbGlicmF0aW9uX3JlY29yZF84X3VucGFjaygmdGhpcy0+Y2FsaWJyYXRpb25fcmVjb3JkLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9UVU5JTkdfR1JBTlVMQVJJVFkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dHVuaW5nX2dyYW51bGFyaXR5KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1NURVBfVFVOSU5HX1RJTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+c3RlcF90dW5pbmdfdGltZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9QT1dFUl9MRVZFTExJTkdfQ0FQQUJJTElUSUVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnBvd2VyX2xldmVsbGluZ19jYXBhYmlsaXRpZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkVRVUVTVF9SRUdJU1RSQVRJT05fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1c191bnBhY2soJnRoaXMtPnJlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX09OVV9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfT05VX09MRF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQUxBUk1fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxMykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SRUdJU1RSQVRJT05fRU5DUllQVElPTl9LRVlTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgODApKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQ1VSUkVOVF9FTkNSWVBUSU9OX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDE3KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JFR0lTVFJBVElPTl9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDM2KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JFR0lTVFJBVElPTl9JRF9BVVRPX0xFQVJOSU5HKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SQU5HSU5HX0JVUlNUX1BST0ZJTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0RBVEFfQlVSU1RfUFJPRklMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkFOR0lOR19USU1FKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9ESVNBQkxFRF9BRlRFUl9ESVNDT1ZFUlkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0RFQUNUSVZBVElPTl9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0FMTF9HRU1fUE9SVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2X3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQUxMX0FMTE9DUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMl9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0VYVEVOREVEX0dVQVJEX1RJTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1VTX0xJTkVfUkFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQ0FMSUJSQVRJT05fUkVDT1JEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9UVU5JTkdfR1JBTlVMQVJJVFkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1NURVBfVFVOSU5HX1RJTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1BPV0VSX0xFVkVMTElOR19DQVBBQklMSVRJRVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JFUVVFU1RfUkVHSVNUUkFUSU9OX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfT05VX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+b251X3N0YXRlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfTk9UX0NPTkZJR1VSRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfSU5BQ1RJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfQUNUSVZFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX0FDVElWRV9TVEFOREJZOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX0RJU0FCTEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX0FXQUtFX0ZSRUU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfUFJPQ0VTU0lORzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9MT1dfUE9XRVJfRE9aRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9MT1dfUE9XRVJfU0xFRVA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfTE9XX1BPV0VSX1dBVENIOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX1VOQVdBUkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX09OVV9TVEFURTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfT05VX09MRF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPm9udV9vbGRfc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9OT1RfQ09ORklHVVJFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9JTkFDVElWRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9BQ1RJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfQUNUSVZFX1NUQU5EQlk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfRElTQUJMRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfQVdBS0VfRlJFRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9QUk9DRVNTSU5HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX0xPV19QT1dFUl9ET1pFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX0xPV19QT1dFUl9TTEVFUDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9MT1dfUE9XRVJfV0FUQ0g6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfVU5BV0FSRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfT05VX09MRF9TVEFURTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQUxBUk1fU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlX2JvdW5kc19jaGVjaygmdGhpcy0+YWxhcm1fc3RhdGUpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9BTEFSTV9TVEFURTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SRUdJU1RSQVRJT05fRU5DUllQVElPTl9LRVlTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25fa2V5c19ib3VuZHNfY2hlY2soJnRoaXMtPnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SRUdJU1RSQVRJT05fRU5DUllQVElPTl9LRVlTOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0NVUlJFTlRfRU5DUllQVElPTl9LRVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fb251X2Flc19rZXlfYm91bmRzX2NoZWNrKCZ0aGlzLT5jdXJyZW50X2VuY3J5cHRpb25fa2V5KSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQ1VSUkVOVF9FTkNSWVBUSU9OX0tFWTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9TRVJJQUxfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3NlcmlhbF9udW1iZXJfYm91bmRzX2NoZWNrKCZ0aGlzLT5zZXJpYWxfbnVtYmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfU0VSSUFMX05VTUJFUjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SRUdJU1RSQVRJT05fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXJyX3U4XzM2X2JvdW5kc19jaGVjaygmdGhpcy0+cmVnaXN0cmF0aW9uX2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkVHSVNUUkFUSU9OX0lEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JBTkdJTkdfQlVSU1RfUFJPRklMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+cmFuZ2luZ19idXJzdF9wcm9maWxlID4gKGJjbW9sdF9idXJzdF9wcm9maWxlX2luZGV4KSAzKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SQU5HSU5HX0JVUlNUX1BST0ZJTEU7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfREFUQV9CVVJTVF9QUk9GSUxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5kYXRhX2J1cnN0X3Byb2ZpbGUgPiAoYmNtb2x0X2J1cnN0X3Byb2ZpbGVfaW5kZXgpIDMpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0RBVEFfQlVSU1RfUFJPRklMRTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9ESVNBQkxFRF9BRlRFUl9ESVNDT1ZFUlkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5kaXNhYmxlZF9hZnRlcl9kaXNjb3ZlcnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9ESVNBQkxFRF9BRlRFUl9ESVNDT1ZFUlk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0RFQUNUSVZBVElPTl9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5kZWFjdGl2YXRpb25fcmVhc29uKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERUFDVElWQVRJT05fUkVBU09OX05PTkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERUFDVElWQVRJT05fUkVBU09OX0RFQUNUSVZBVElPTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFQUNUSVZBVElPTl9SRUFTT05fQUNLX1RJTUVPVVQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERUFDVElWQVRJT05fUkVBU09OX1NGSToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFQUNUSVZBVElPTl9SRUFTT05fVElXSToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFQUNUSVZBVElPTl9SRUFTT05fUEFTU1dPUkRfQVVUSEVOVElDQVRJT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERUFDVElWQVRJT05fUkVBU09OX09OVV9BTEFSTToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFQUNUSVZBVElPTl9SRUFTT05fTE9TOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVBQ1RJVkFUSU9OX1JFQVNPTl9MT0tJOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVBQ1RJVkFUSU9OX1JFQVNPTl9SRVJBTkdFX0ZBSUxVUkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0RFQUNUSVZBVElPTl9SRUFTT047CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0FMTF9HRU1fUE9SVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmFsbF9nZW1fcG9ydHMubGVuID4gMjU2KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTZfYm91bmRzX2NoZWNrKCZ0aGlzLT5hbGxfZ2VtX3BvcnRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQUxMX0dFTV9QT1JUUzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9BTExfQUxMT0NTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5hbGxfYWxsb2NzLmxlbiA+IDMyKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMl9ib3VuZHNfY2hlY2soJnRoaXMtPmFsbF9hbGxvY3MpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9BTExfQUxMT0NTOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0VYVEVOREVEX0dVQVJEX1RJTUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZV9ib3VuZHNfY2hlY2soJnRoaXMtPmV4dGVuZGVkX2d1YXJkX3RpbWUpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9FWFRFTkRFRF9HVUFSRF9USU1FOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1VTX0xJTkVfUkFURSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnVzX2xpbmVfcmF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfVVBTVFJFQU1fTElORV9SQVRFX0NBUEFCSUxJVElFU19SQVRFXzJfUF81X0c6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9VUFNUUkVBTV9MSU5FX1JBVEVfQ0FQQUJJTElUSUVTX1JBVEVfMTBfRzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfVVNfTElORV9SQVRFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9DQUxJQlJBVElPTl9SRUNPUkQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXJyX2NhbGlicmF0aW9uX3JlY29yZF84X2JvdW5kc19jaGVjaygmdGhpcy0+Y2FsaWJyYXRpb25fcmVjb3JkKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQ0FMSUJSQVRJT05fUkVDT1JEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JFUVVFU1RfUkVHSVNUUkFUSU9OX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXNfYm91bmRzX2NoZWNrKCZ0aGlzLT5yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SRVFVRVNUX1JFR0lTVFJBVElPTl9TVEFUVVM7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUE9TSVRJVkVfRFJJRlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cG9zaXRpdmVfZHJpZnQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfTkVHQVRJVkVfRFJJRlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bmVnYXRpdmVfZHJpZnQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfREVMSU1JVEVSX01JU1NfREVURUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRlbGltaXRlcl9taXNzX2RldGVjdGlvbiA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9CSVAzMl9FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YmlwMzJfZXJyb3JzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX1dPUkRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X3dvcmRzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0ZFQ19DT1JSRUNURURfU1lNQk9MUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mZWNfY29ycmVjdGVkX3N5bWJvbHMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX0NPUlJFQ1RFRF9DT0RFV09SRFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZmVjX2NvcnJlY3RlZF9jb2Rld29yZHMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX1VOQ09SUkVDVEFCTEVfQ09ERVdPUkRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZlY191bmNvcnJlY3RhYmxlX2NvZGV3b3JkcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09ERVdPUkRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZlY19jb2Rld29yZHMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX0NPUlJFQ1RFRF9CSVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZlY19jb3JyZWN0ZWRfYml0cyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9YR0VNX0tFWV9FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+eGdlbV9rZXlfZXJyb3JzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1hHRU1fTE9TUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT54Z2VtX2xvc3MgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfUExPQU1TX01JQ19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9wbG9hbXNfbWljX2Vycm9yID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX1BMT0FNU19OT05fSURMRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9wbG9hbXNfbm9uX2lkbGUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfT01DSSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9vbWNpID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9ieXRlcyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X3BhY2tldHMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfVFhfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfYnl0ZXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfVFhfUEFDS0VUUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9wYWNrZXRzID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9QT1NJVElWRV9EUklGVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cG9zaXRpdmVfZHJpZnQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX05FR0FUSVZFX0RSSUZUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5uZWdhdGl2ZV9kcmlmdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfREVMSU1JVEVSX01JU1NfREVURUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5kZWxpbWl0ZXJfbWlzc19kZXRlY3Rpb24pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0JJUDMyX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+YmlwMzJfZXJyb3JzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9XT1JEUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfd29yZHMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0ZFQ19DT1JSRUNURURfU1lNQk9MUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZmVjX2NvcnJlY3RlZF9zeW1ib2xzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09SUkVDVEVEX0NPREVXT1JEUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZmVjX2NvcnJlY3RlZF9jb2Rld29yZHMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0ZFQ19VTkNPUlJFQ1RBQkxFX0NPREVXT1JEUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZmVjX3VuY29ycmVjdGFibGVfY29kZXdvcmRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09ERVdPUkRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5mZWNfY29kZXdvcmRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09SUkVDVEVEX0JJVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmZlY19jb3JyZWN0ZWRfYml0cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfWEdFTV9LRVlfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT54Z2VtX2tleV9lcnJvcnMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1hHRU1fTE9TUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+eGdlbV9sb3NzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfTUlDX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF9wbG9hbXNfbWljX2Vycm9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfTk9OX0lETEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X3Bsb2Ftc19ub25faWRsZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfT01DSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfb21jaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+cnhfb21jaV9wYWNrZXRzX2NyY19lcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnJ4X2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5yeF9wYWNrZXRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9UWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dHhfYnl0ZXMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1RYX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnR4X3BhY2tldHMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9QT1NJVElWRV9EUklGVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfTkVHQVRJVkVfRFJJRlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0RFTElNSVRFUl9NSVNTX0RFVEVDVElPTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfQklQMzJfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9XT1JEUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX0NPUlJFQ1RFRF9TWU1CT0xTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09SUkVDVEVEX0NPREVXT1JEUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX1VOQ09SUkVDVEFCTEVfQ09ERVdPUkRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09ERVdPUkRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09SUkVDVEVEX0JJVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1hHRU1fS0VZX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfWEdFTV9MT1NTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfTUlDX0VSUk9SKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfTk9OX0lETEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX09NQ0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDg7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9UWF9CWVRFUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfVFhfUEFDS0VUUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUE9TSVRJVkVfRFJJRlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnBvc2l0aXZlX2RyaWZ0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9ORUdBVElWRV9EUklGVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+bmVnYXRpdmVfZHJpZnQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0RFTElNSVRFUl9NSVNTX0RFVEVDVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZGVsaW1pdGVyX21pc3NfZGV0ZWN0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9CSVAzMl9FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmJpcDMyX2Vycm9ycykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfV09SRFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X3dvcmRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09SUkVDVEVEX1NZTUJPTFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZlY19jb3JyZWN0ZWRfc3ltYm9scykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX0NPUlJFQ1RFRF9DT0RFV09SRFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZlY19jb3JyZWN0ZWRfY29kZXdvcmRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfVU5DT1JSRUNUQUJMRV9DT0RFV09SRFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmZlY191bmNvcnJlY3RhYmxlX2NvZGV3b3JkcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZmVjX2NvZGV3b3JkcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX0NPUlJFQ1RFRF9CSVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5mZWNfY29ycmVjdGVkX2JpdHMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1hHRU1fS0VZX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+eGdlbV9rZXlfZXJyb3JzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9YR0VNX0xPU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnhnZW1fbG9zcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfUExPQU1TX01JQ19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfcGxvYW1zX21pY19lcnJvcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfUExPQU1TX05PTl9JRExFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9wbG9hbXNfbm9uX2lkbGUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX09NQ0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X29tY2kpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5yeF9ieXRlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfUEFDS0VUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+cnhfcGFja2V0cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfVFhfQllURVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnR4X2J5dGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9UWF9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50eF9wYWNrZXRzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1BPU0lUSVZFX0RSSUZUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfTkVHQVRJVkVfRFJJRlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9ERUxJTUlURVJfTUlTU19ERVRFQ1RJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9CSVAzMl9FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9XT1JEUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0ZFQ19DT1JSRUNURURfU1lNQk9MUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0ZFQ19DT1JSRUNURURfQ09ERVdPUkRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX1VOQ09SUkVDVEFCTEVfQ09ERVdPUkRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0ZFQ19DT1JSRUNURURfQklUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1hHRU1fS0VZX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1hHRU1fTE9TUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX1BMT0FNU19NSUNfRVJST1IpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfTk9OX0lETEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9PTUNJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfUEFDS0VUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1RYX0JZVEVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfVFhfUEFDS0VUUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9zdGF0X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmNmZy50cmlnZ2VyLnR5cGUgPSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOworICAgICAgICB0aGlzLT5jZmcuc29hay5hY3RpdmVfc29ha190aW1lID0gMDsKKyAgICAgICAgdGhpcy0+Y2ZnLnNvYWsuY2xlYXJfc29ha190aW1lID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdF9hbGFybV9jb25maWdfcGFjaygmdGhpcy0+Y2ZnLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0NGR19JRF9DRkcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5jZmcpOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX3VucGFjaygmdGhpcy0+Y2ZnLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3N0YXRfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfQ0ZHX0lEX0NGRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ19zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9DRkdfSURfQ0ZHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2JvdW5kc19jaGVjaygmdGhpcy0+Y2ZnKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0NGR19JRF9DRkc7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9kZmlfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X2RmaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9ERklfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXR1cyA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9kZmlfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfZGZpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfREZJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9kZmlfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X2RmaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfREZJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9kZmlfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9kZmlfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9ERklfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfZGZpX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0RGSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfZGZpX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfZGZpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X2RmaV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfREZJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmFsYXJtX3N0YXR1cykKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfREZJX0lEX0FMQVJNX1NUQVRVUzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9kZ2lfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X2RnaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9ER0lfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXR1cyA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9kZ2lfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfZGdpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfREdJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9kZ2lfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X2RnaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfREdJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9kZ2lfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9kZ2lfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9ER0lfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfZGdpX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0RHSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfZGdpX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfZGdpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X2RnaV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfREdJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmFsYXJtX3N0YXR1cykKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfREdJX0lEX0FMQVJNX1NUQVRVUzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9kb3dpX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9kb3dpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0RPV0lfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXR1cyA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0RPV0lfSURfRFJJRlRfVkFMVUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZHJpZnRfdmFsdWUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0RPV0lfSURfTkVXX0VRRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5uZXdfZXFkID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9kb3dpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfRE9XSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9ET1dJX0lEX0RSSUZUX1ZBTFVFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9zMzIoYnVmLCB0aGlzLT5kcmlmdF92YWx1ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0RPV0lfSURfTkVXX0VRRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+bmV3X2VxZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9kb3dpX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9kb3dpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9ET1dJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0RPV0lfSURfRFJJRlRfVkFMVUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9ET1dJX0lEX05FV19FUUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X2Rvd2lfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9ET1dJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0RPV0lfSURfRFJJRlRfVkFMVUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfczMyKGJ1ZiwgJnRoaXMtPmRyaWZ0X3ZhbHVlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfRE9XSV9JRF9ORVdfRVFEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5uZXdfZXFkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9ET1dJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9ET1dJX0lEX0RSSUZUX1ZBTFVFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0RPV0lfSURfTkVXX0VRRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9kb3dpX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9kb3dpX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9ET1dJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmFsYXJtX3N0YXR1cykKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09GRjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19OT19DSEFOR0U6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfRE9XSV9JRF9BTEFSTV9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9JTlZBTElEX0RCUlVfUkVQT1JUX0lEX0FMTE9DX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFsbG9jX2lkID0gKGJjbW9sdF94Z3Bvbl9hbGxvY19pZCkgMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfSU5WQUxJRF9EQlJVX1JFUE9SVF9JRF9BTExPQ19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzLT5hbGxvY19pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9JTlZBTElEX0RCUlVfUkVQT1JUX0lEX0FMTE9DX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfSU5WQUxJRF9EQlJVX1JFUE9SVF9JRF9BTExPQ19JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAodWludDE2X3QgKikgJnRoaXMtPmFsbG9jX2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9JTlZBTElEX0RCUlVfUkVQT1JUX0lEX0FMTE9DX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0lOVkFMSURfREJSVV9SRVBPUlRfSURfQUxMT0NfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmFsbG9jX2lkID4gKGJjbW9sdF94Z3Bvbl9hbGxvY19pZCkgMTYzODMpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfSU5WQUxJRF9EQlJVX1JFUE9SVF9JRF9BTExPQ19JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0NPTVBMRVRFRF9JRF9ORVdfS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIG1lbXNldCh0aGlzLT5uZXdfa2V5LmVuY3J5cHRpb25fa2V5LmJ5dGVzLCAwLCBzaXplb2YodGhpcy0+bmV3X2tleS5lbmNyeXB0aW9uX2tleS5ieXRlcykpOworICAgICAgICB0aGlzLT5uZXdfa2V5LmtleV9pbmRleCA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0tFWV9FWENIQU5HRV9DT01QTEVURURfSURfTkVXX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9vbnVfYWVzX2tleV9wYWNrKCZ0aGlzLT5uZXdfa2V5LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0NPTVBMRVRFRF9JRF9ORVdfS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE3OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0tFWV9FWENIQU5HRV9DT01QTEVURURfSURfTkVXX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9vbnVfYWVzX2tleV91bnBhY2soJnRoaXMtPm5ld19rZXksIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9LRVlfRVhDSEFOR0VfQ09NUExFVEVEX0lEX05FV19LRVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxNykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0tFWV9FWENIQU5HRV9DT01QTEVURURfSURfTkVXX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9vbnVfYWVzX2tleV9ib3VuZHNfY2hlY2soJnRoaXMtPm5ld19rZXkpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX0tFWV9FWENIQU5HRV9DT01QTEVURURfSURfTkVXX0tFWTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSF9JRF9FWFBFQ1RFRF9LRVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgbWVtc2V0KHRoaXMtPmV4cGVjdGVkX2tleS5ieXRlcywgMCwgc2l6ZW9mKHRoaXMtPmV4cGVjdGVkX2tleS5ieXRlcykpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0hfSURfUkVDRUlWRURfS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIG1lbXNldCh0aGlzLT5yZWNlaXZlZF9rZXkuYnl0ZXMsIDAsIHNpemVvZih0aGlzLT5yZWNlaXZlZF9rZXkuYnl0ZXMpKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSF9JRF9FWFBFQ1RFRF9LRVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYWVzX2tleV9wYWNrKCZ0aGlzLT5leHBlY3RlZF9rZXksIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0hfSURfUkVDRUlWRURfS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Flc19rZXlfcGFjaygmdGhpcy0+cmVjZWl2ZWRfa2V5LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSF9JRF9FWFBFQ1RFRF9LRVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTY7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSF9JRF9SRUNFSVZFRF9LRVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTY7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSF9JRF9FWFBFQ1RFRF9LRVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYWVzX2tleV91bnBhY2soJnRoaXMtPmV4cGVjdGVkX2tleSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENIX0lEX1JFQ0VJVkVEX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hZXNfa2V5X3VucGFjaygmdGhpcy0+cmVjZWl2ZWRfa2V5LCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSF9JRF9FWFBFQ1RFRF9LRVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0hfSURfUkVDRUlWRURfS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENIX0lEX0VYUEVDVEVEX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hZXNfa2V5X2JvdW5kc19jaGVjaygmdGhpcy0+ZXhwZWN0ZWRfa2V5KSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENIX0lEX0VYUEVDVEVEX0tFWTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0hfSURfUkVDRUlWRURfS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Flc19rZXlfYm91bmRzX2NoZWNrKCZ0aGlzLT5yZWNlaXZlZF9rZXkpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0hfSURfUkVDRUlWRURfS0VZOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X2xvb2NpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0xPT0NJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hbGFybV9zdGF0dXMgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9MT09DSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X2xvb2NpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9MT09DSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9sb29jaV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0xPT0NJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2xvb2NpX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0xPT0NJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9sb29jaV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X2xvb2NpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X2xvb2NpX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9MT09DSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5hbGFybV9zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX0xPT0NJX0lEX0FMQVJNX1NUQVRVUzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXR1cyA9IEJDTU9MVF9SRVNVTFRfU1VDQ0VTUzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZmFpbF9yZWFzb24gPSBCQ01PTFRfQUNUSVZBVElPTl9GQUlMX1JFQVNPTl9OT05FOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9SRUdJU1RSQVRJT05fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgbWVtc2V0KHRoaXMtPnJlZ2lzdHJhdGlvbl9pZC5hcnIsIDAsIHNpemVvZih0aGlzLT5yZWdpc3RyYXRpb25faWQuYXJyKSk7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX1JFR0lTVFJBVElPTl9FTkNSWVBUSU9OX0tFWVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgbWVtc2V0KHRoaXMtPnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMucGxvYW1faWsuYnl0ZXMsIDAsIHNpemVvZih0aGlzLT5yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLnBsb2FtX2lrLmJ5dGVzKSk7CisgICAgICAgIG1lbXNldCh0aGlzLT5yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLm9tY2lfaWsuYnl0ZXMsIDAsIHNpemVvZih0aGlzLT5yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLm9tY2lfaWsuYnl0ZXMpKTsKKyAgICAgICAgbWVtc2V0KHRoaXMtPnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMub21jaV9rMS5ieXRlcywgMCwgc2l6ZW9mKHRoaXMtPnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMub21jaV9rMS5ieXRlcykpOworICAgICAgICBtZW1zZXQodGhpcy0+cmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5vbWNpX2syLmJ5dGVzLCAwLCBzaXplb2YodGhpcy0+cmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5vbWNpX2syLmJ5dGVzKSk7CisgICAgICAgIG1lbXNldCh0aGlzLT5yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLmtlay5ieXRlcywgMCwgc2l6ZW9mKHRoaXMtPnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMua2VrLmJ5dGVzKSk7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3VsdF9wYWNrKHRoaXMtPnN0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2FjdGl2YXRpb25fZmFpbF9yZWFzb25fcGFjayh0aGlzLT5mYWlsX3JlYXNvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX1JFR0lTVFJBVElPTl9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfdThfMzZfcGFjaygmdGhpcy0+cmVnaXN0cmF0aW9uX2lkLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfUkVHSVNUUkFUSU9OX0VOQ1JZUFRJT05fS0VZUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXNfcGFjaygmdGhpcy0+cmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX1JFR0lTVFJBVElPTl9JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAzNjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfUkVHSVNUUkFUSU9OX0VOQ1JZUFRJT05fS0VZUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4MDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfdW5wYWNrKCZ0aGlzLT5zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hY3RpdmF0aW9uX2ZhaWxfcmVhc29uX3VucGFjaygmdGhpcy0+ZmFpbF9yZWFzb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9SRUdJU1RSQVRJT05fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXJyX3U4XzM2X3VucGFjaygmdGhpcy0+cmVnaXN0cmF0aW9uX2lkLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9SRUdJU1RSQVRJT05fRU5DUllQVElPTl9LRVlTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25fa2V5c191bnBhY2soJnRoaXMtPnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9SRUdJU1RSQVRJT05fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAzNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9SRUdJU1RSQVRJT05fRU5DUllQVElPTl9LRVlTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgODApKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SRVNVTFRfU1VDQ0VTUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JFU1VMVF9GQUlMOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+ZmFpbF9yZWFzb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FDVElWQVRJT05fRkFJTF9SRUFTT05fTk9ORToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FDVElWQVRJT05fRkFJTF9SRUFTT05fUkFOR0lORzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FDVElWQVRJT05fRkFJTF9SRUFTT05fUEFTU1dPUkRfQVVUSEVOVElDQVRJT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9BQ1RJVkFUSU9OX0ZBSUxfUkVBU09OX0xPUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FDVElWQVRJT05fRkFJTF9SRUFTT05fT05VX0FMQVJNOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfUkVHSVNUUkFUSU9OX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl91OF8zNl9ib3VuZHNfY2hlY2soJnRoaXMtPnJlZ2lzdHJhdGlvbl9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX1JFR0lTVFJBVElPTl9JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9SRUdJU1RSQVRJT05fRU5DUllQVElPTl9LRVlTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25fa2V5c19ib3VuZHNfY2hlY2soJnRoaXMtPnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9SRUdJU1RSQVRJT05fRU5DUllQVElPTl9LRVlTOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX0FMQVJNX0lEX09OVV9BTEFSTSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5vbnVfYWxhcm0ubG9zaSA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgICAgICB0aGlzLT5vbnVfYWxhcm0ubG9iaSA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgICAgICB0aGlzLT5vbnVfYWxhcm0ubG9wY2lfbWlzcyA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgICAgICB0aGlzLT5vbnVfYWxhcm0ubG9wY2lfbWljX2Vycm9yID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV9hbGFybV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfQUxBUk1fSURfT05VX0FMQVJNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX29udV9hbGFybXNfcGFjaygmdGhpcy0+b251X2FsYXJtLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9BTEFSTV9JRF9PTlVfQUxBUk0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX0FMQVJNX0lEX09OVV9BTEFSTSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zX3VucGFjaygmdGhpcy0+b251X2FsYXJtLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV9hbGFybV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfQUxBUk1fSURfT05VX0FMQVJNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV9hbGFybV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X29udV9hbGFybV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1faWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9BTEFSTV9JRF9PTlVfQUxBUk0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fb251X2FsYXJtc19ib3VuZHNfY2hlY2soJnRoaXMtPm9udV9hbGFybSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfT05VX0FMQVJNX0lEX09OVV9BTEFSTTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfREVBQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdHVzID0gQkNNT0xUX1JFU1VMVF9TVUNDRVNTOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfcGFjayh0aGlzLT5zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3VsdF91bnBhY2soJnRoaXMtPnN0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnN0YXR1cykKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1M6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SRVNVTFRfRkFJTDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9PTlVfREVBQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX0RJU0FCTEVfQ09NUExFVEVEX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgbWVtc2V0KHRoaXMtPnNlcmlhbF9udW1iZXIudmVuZG9yX2lkLCAwLCBzaXplb2YodGhpcy0+c2VyaWFsX251bWJlci52ZW5kb3JfaWQpKTsKKyAgICAgICAgbWVtc2V0KHRoaXMtPnNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljLCAwLCBzaXplb2YodGhpcy0+c2VyaWFsX251bWJlci52ZW5kb3Jfc3BlY2lmaWMpKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9ESVNBQkxFX0NPTVBMRVRFRF9JRF9TRVJJQUxfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3NlcmlhbF9udW1iZXJfcGFjaygmdGhpcy0+c2VyaWFsX251bWJlciwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfRElTQUJMRV9DT01QTEVURURfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfRElTQUJMRV9DT01QTEVURURfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zZXJpYWxfbnVtYmVyX3VucGFjaygmdGhpcy0+c2VyaWFsX251bWJlciwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX0RJU0FCTEVfQ09NUExFVEVEX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX0RJU0FCTEVfQ09NUExFVEVEX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc2VyaWFsX251bWJlcl9ib3VuZHNfY2hlY2soJnRoaXMtPnNlcmlhbF9udW1iZXIpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX09OVV9ESVNBQkxFX0NPTVBMRVRFRF9JRF9TRVJJQUxfTlVNQkVSOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9FTkFCTEVfQ09NUExFVEVEX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgbWVtc2V0KHRoaXMtPnNlcmlhbF9udW1iZXIudmVuZG9yX2lkLCAwLCBzaXplb2YodGhpcy0+c2VyaWFsX251bWJlci52ZW5kb3JfaWQpKTsKKyAgICAgICAgbWVtc2V0KHRoaXMtPnNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljLCAwLCBzaXplb2YodGhpcy0+c2VyaWFsX251bWJlci52ZW5kb3Jfc3BlY2lmaWMpKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfRU5BQkxFX0NPTVBMRVRFRF9JRF9TRVJJQUxfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3NlcmlhbF9udW1iZXJfcGFjaygmdGhpcy0+c2VyaWFsX251bWJlciwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX0VOQUJMRV9DT01QTEVURURfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA4OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX0VOQUJMRV9DT01QTEVURURfSURfU0VSSUFMX05VTUJFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zZXJpYWxfbnVtYmVyX3VucGFjaygmdGhpcy0+c2VyaWFsX251bWJlciwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfRU5BQkxFX0NPTVBMRVRFRF9JRF9TRVJJQUxfTlVNQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9FTkFCTEVfQ09NUExFVEVEX0lEX1NFUklBTF9OVU1CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc2VyaWFsX251bWJlcl9ib3VuZHNfY2hlY2soJnRoaXMtPnNlcmlhbF9udW1iZXIpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX09OVV9FTkFCTEVfQ09NUExFVEVEX0lEX1NFUklBTF9OVU1CRVI7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19JTl9DT01QTEVURURfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJlc3VsdCA9IEJDTU9MVF9SRVNVTFRfU1VDQ0VTUzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX0lOX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mYWlsX3JlYXNvbiA9IEJDTU9MVF9UVU5FX0lOX0ZBSUxfUkVBU09OX05PTkU7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19JTl9DT01QTEVURURfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3VsdF9wYWNrKHRoaXMtPnJlc3VsdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19JTl9DT01QTEVURURfSURfRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdHVuZV9pbl9mYWlsX3JlYXNvbl9wYWNrKHRoaXMtPmZhaWxfcmVhc29uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX0lOX0NPTVBMRVRFRF9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX0lOX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19JTl9DT01QTEVURURfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3VsdF91bnBhY2soJnRoaXMtPnJlc3VsdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19JTl9DT01QTEVURURfSURfRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdHVuZV9pbl9mYWlsX3JlYXNvbl91bnBhY2soJnRoaXMtPmZhaWxfcmVhc29uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX0lOX0NPTVBMRVRFRF9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19JTl9DT01QTEVURURfSURfRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19JTl9DT01QTEVURURfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+cmVzdWx0KQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SRVNVTFRfU1VDQ0VTUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JFU1VMVF9GQUlMOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfSU5fQ09NUExFVEVEX0lEX1JFU1VMVDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX0lOX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmZhaWxfcmVhc29uKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UVU5FX0lOX0ZBSUxfUkVBU09OX05PTkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UVU5FX0lOX0ZBSUxfUkVBU09OX05PX1RVTklOR19SRVNQT05TRV9QTE9BTV9SRUNFSVZFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1RVTkVfSU5fRkFJTF9SRUFTT05fT05VX0FDVElWQVRJT05fRkFJTEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfSU5fQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0NPTVBMRVRFRF9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmVzdWx0ID0gQkNNT0xUX1JFU1VMVF9TVUNDRVNTOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mYWlsX3JlYXNvbiA9IEJDTU9MVF9UVU5FX09VVF9GQUlMX1JFQVNPTl9OT05FOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfQ09NUExFVEVEX0lEX1JFU1VMVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfcGFjayh0aGlzLT5yZXN1bHQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF90dW5lX291dF9mYWlsX3JlYXNvbl9wYWNrKHRoaXMtPmZhaWxfcmVhc29uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0NPTVBMRVRFRF9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9DT01QTEVURURfSURfRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfQ09NUExFVEVEX0lEX1JFU1VMVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfdW5wYWNrKCZ0aGlzLT5yZXN1bHQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF90dW5lX291dF9mYWlsX3JlYXNvbl91bnBhY2soJnRoaXMtPmZhaWxfcmVhc29uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfQ09NUExFVEVEX0lEX1JFU1VMVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9DT01QTEVURURfSURfRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfQ09NUExFVEVEX0lEX1JFU1VMVCkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnJlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1M6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SRVNVTFRfRkFJTDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9DT01QTEVURURfSURfUkVTVUxUOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmZhaWxfcmVhc29uKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9UVU5FX09VVF9GQUlMX1JFQVNPTl9OT05FOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfVFVORV9PVVRfRkFJTF9SRUFTT05fTkFDS19QTE9BTV9SRUNFSVZFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1RVTkVfT1VUX0ZBSUxfUkVBU09OX05PX1RVTklOR19SRVNQT05TRV9QTE9BTV9SRUNFSVZFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1RVTkVfT1VUX0ZBSUxfUkVBU09OX1RTT1VSQ0VfVElNRU9VVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1RVTkVfT1VUX0ZBSUxfUkVBU09OX1JPTExCQUNLX1JFUVVFU1Q6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9QT1NTSUJMRV9EUklGVF9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdHVzID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUE9TU0lCTEVfRFJJRlRfSURfRVNUSU1BVEVEX0RSSUZUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmVzdGltYXRlZF9kcmlmdCA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUE9TU0lCTEVfRFJJRlRfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUE9TU0lCTEVfRFJJRlRfSURfRVNUSU1BVEVEX0RSSUZUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9zMzIoYnVmLCB0aGlzLT5lc3RpbWF0ZWRfZHJpZnQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9QT1NTSUJMRV9EUklGVF9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9QT1NTSUJMRV9EUklGVF9JRF9FU1RJTUFURURfRFJJRlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1BPU1NJQkxFX0RSSUZUX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1BPU1NJQkxFX0RSSUZUX0lEX0VTVElNQVRFRF9EUklGVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9zMzIoYnVmLCAmdGhpcy0+ZXN0aW1hdGVkX2RyaWZ0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUE9TU0lCTEVfRFJJRlRfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1BPU1NJQkxFX0RSSUZUX0lEX0VTVElNQVRFRF9EUklGVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9QT1NTSUJMRV9EUklGVF9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5hbGFybV9zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX1BPU1NJQkxFX0RSSUZUX0lEX0FMQVJNX1NUQVRVUzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9DT05TVU1QVElPTl9SRVBPUlRfSURfUE9XRVJfQ09OU1VNUFRJT05fUkVQT1JUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIG1lbXNldCh0aGlzLT5wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnQuYXJyLCAwLCBzaXplb2YodGhpcy0+cG93ZXJfY29uc3VtcHRpb25fcmVwb3J0LmFycikpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfQ09OU1VNUFRJT05fUkVQT1JUX0lEX1BPV0VSX0NPTlNVTVBUSU9OX1JFUE9SVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfOF9wYWNrKCZ0aGlzLT5wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfQ09OU1VNUFRJT05fUkVQT1JUX0lEX1BPV0VSX0NPTlNVTVBUSU9OX1JFUE9SVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAzMjsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfQ09OU1VNUFRJT05fUkVQT1JUX0lEX1BPV0VSX0NPTlNVTVBUSU9OX1JFUE9SVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfOF91bnBhY2soJnRoaXMtPnBvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfQ09OU1VNUFRJT05fUkVQT1JUX0lEX1BPV0VSX0NPTlNVTVBUSU9OX1JFUE9SVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDMyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfQ09OU1VNUFRJT05fUkVQT1JUX0lEX1BPV0VSX0NPTlNVTVBUSU9OX1JFUE9SVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfOF9ib3VuZHNfY2hlY2soJnRoaXMtPnBvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfQ09OU1VNUFRJT05fUkVQT1JUX0lEX1BPV0VSX0NPTlNVTVBUSU9OX1JFUE9SVDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1BPV0VSX0xFVkVMX1JFUE9SVF9JRF9BVFRFTlVBVElPTikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hdHRlbnVhdGlvbiA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfTEVWRUxfUkVQT1JUX0lEX1BPV0VSX0xFVkVMTElOR19DQVBBQklMSVRZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBvd2VyX2xldmVsbGluZ19jYXBhYmlsaXR5ID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1BPV0VSX0xFVkVMX1JFUE9SVF9JRF9BVFRFTlVBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5hdHRlbnVhdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1BPV0VSX0xFVkVMX1JFUE9SVF9JRF9QT1dFUl9MRVZFTExJTkdfQ0FQQUJJTElUWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5wb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0eSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfTEVWRUxfUkVQT1JUX0lEX0FUVEVOVUFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfTEVWRUxfUkVQT1JUX0lEX1BPV0VSX0xFVkVMTElOR19DQVBBQklMSVRZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1BPV0VSX0xFVkVMX1JFUE9SVF9JRF9BVFRFTlVBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5hdHRlbnVhdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1BPV0VSX0xFVkVMX1JFUE9SVF9JRF9QT1dFUl9MRVZFTExJTkdfQ0FQQUJJTElUWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5wb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0eSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9MRVZFTF9SRVBPUlRfSURfQVRURU5VQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfTEVWRUxfUkVQT1JUX0lEX1BPV0VSX0xFVkVMTElOR19DQVBBQklMSVRZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9PTERfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b2xkX3N0YXRlID0gQkNNT0xUX09OVV9TVEFURV9OT1RfQ09ORklHVVJFRDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9ORVdfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bmV3X3N0YXRlID0gQkNNT0xUX09OVV9TVEFURV9OT1RfQ09ORklHVVJFRDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmVhc29uID0gQkNNT0xUX1BPV0VSX01BTkFHRU1FTlRfVFJBTlNJVElPTl9SRUFTT05fUE9XRVJfTUFOQUdFTUVOVF9FTkFCTEVEOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX09MRF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9vbnVfc3RhdGVfcGFjayh0aGlzLT5vbGRfc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX05FV19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9vbnVfc3RhdGVfcGFjayh0aGlzLT5uZXdfc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb3dlcl9tYW5hZ2VtZW50X3RyYW5zaXRpb25fcmVhc29uX3BhY2sodGhpcy0+cmVhc29uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9PTERfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9ORVdfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX09MRF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9vbnVfc3RhdGVfdW5wYWNrKCZ0aGlzLT5vbGRfc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX05FV19TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9vbnVfc3RhdGVfdW5wYWNrKCZ0aGlzLT5uZXdfc3RhdGUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb3dlcl9tYW5hZ2VtZW50X3RyYW5zaXRpb25fcmVhc29uX3VucGFjaygmdGhpcy0+cmVhc29uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9PTERfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0VfSURfTkVXX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9PTERfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5vbGRfc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9OT1RfQ09ORklHVVJFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9JTkFDVElWRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9BQ1RJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfQUNUSVZFX1NUQU5EQlk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfRElTQUJMRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfQVdBS0VfRlJFRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9QUk9DRVNTSU5HOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX0xPV19QT1dFUl9ET1pFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX0xPV19QT1dFUl9TTEVFUDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9MT1dfUE9XRVJfV0FUQ0g6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfVU5BV0FSRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9PTERfU1RBVEU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0VfSURfTkVXX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+bmV3X3N0YXRlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfTk9UX0NPTkZJR1VSRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfSU5BQ1RJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfQUNUSVZFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX0FDVElWRV9TVEFOREJZOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX0RJU0FCTEVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX0FXQUtFX0ZSRUU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfUFJPQ0VTU0lORzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9MT1dfUE9XRVJfRE9aRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9TVEFURV9MT1dfUE9XRVJfU0xFRVA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfU1RBVEVfTE9XX1BPV0VSX1dBVENIOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX1NUQVRFX1VOQVdBUkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0VfSURfTkVXX1NUQVRFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnJlYXNvbikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUE9XRVJfTUFOQUdFTUVOVF9UUkFOU0lUSU9OX1JFQVNPTl9QT1dFUl9NQU5BR0VNRU5UX0VOQUJMRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9QT1dFUl9NQU5BR0VNRU5UX1RSQU5TSVRJT05fUkVBU09OX1BPV0VSX01BTkFHRU1FTlRfRElTQUJMRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9QT1dFUl9NQU5BR0VNRU5UX1RSQU5TSVRJT05fUkVBU09OX1NMRUVQX1JFUVVFU1RfQVdBS0U6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9QT1dFUl9NQU5BR0VNRU5UX1RSQU5TSVRJT05fUkVBU09OX1NMRUVQX1JFUVVFU1RfRE9aRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BPV0VSX01BTkFHRU1FTlRfVFJBTlNJVElPTl9SRUFTT05fU0xFRVBfUkVRVUVTVF9TTEVFUDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BPV0VSX01BTkFHRU1FTlRfVFJBTlNJVElPTl9SRUFTT05fU0xFRVBfUkVRVUVTVF9XQVRDSDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1BPV0VSX01BTkFHRU1FTlRfVFJBTlNJVElPTl9SRUFTT05fVEVSSV9FWFBJUkVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUE9XRVJfTUFOQUdFTUVOVF9UUkFOU0lUSU9OX1JFQVNPTl9UQUxFUlRFRF9FWFBJUkVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUE9XRVJfTUFOQUdFTUVOVF9UUkFOU0lUSU9OX1JFQVNPTl9BTEFSTToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9SRUFTT047CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9QUVNJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hbGFybV9zdGF0dXMgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9wcXNpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUFFTSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUFFTSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X3Bxc2lfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9QUVNJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Bxc2lfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUFFTSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X3Bxc2lfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUFFTSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5hbGFybV9zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX1BRU0lfSURfQUxBUk1fU1RBVFVTOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdHVzID0gQkNNT0xUX1JFU1VMVF9TVUNDRVNTOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZhaWxfcmVhc29uID0gQkNNT0xUX1JBTkdJTkdfRkFJTF9SRUFTT05fTk9ORTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9FUUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZXFkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9OVU1CRVJfT0ZfUExPQU1TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm51bWJlcl9vZl9wbG9hbXMgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX1BPV0VSX0xFVkVMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBvd2VyX2xldmVsID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzdWx0X3BhY2sodGhpcy0+c3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yYW5naW5nX2ZhaWxfcmVhc29uX3BhY2sodGhpcy0+ZmFpbF9yZWFzb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX0VRRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+ZXFkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfTlVNQkVSX09GX1BMT0FNUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5udW1iZXJfb2ZfcGxvYW1zKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfUE9XRVJfTEVWRUwpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cG93ZXJfbGV2ZWwpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX0VRRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX05VTUJFUl9PRl9QTE9BTVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9QT1dFUl9MRVZFTCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3VsdF91bnBhY2soJnRoaXMtPnN0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmFuZ2luZ19mYWlsX3JlYXNvbl91bnBhY2soJnRoaXMtPmZhaWxfcmVhc29uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9FUUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmVxZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX05VTUJFUl9PRl9QTE9BTVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bnVtYmVyX29mX3Bsb2FtcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX1BPV0VSX0xFVkVMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnBvd2VyX2xldmVsKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX0VRRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9OVU1CRVJfT0ZfUExPQU1TKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX1BPV0VSX0xFVkVMKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnN0YXR1cykKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1M6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SRVNVTFRfRkFJTDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5mYWlsX3JlYXNvbikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkFOR0lOR19GQUlMX1JFQVNPTl9OT05FOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkFOR0lOR19GQUlMX1JFQVNPTl9SQU5HSU5HX0FDS19USU1FT1VUOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkFOR0lOR19GQUlMX1JFQVNPTl9QTE9BTV9EQVRBX01JU01BVENIOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkFOR0lOR19GQUlMX1JFQVNPTl9QTE9BTV9UWVBFX01JU01BVENIOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkFOR0lOR19GQUlMX1JFQVNPTl9QTE9BTV9PTlVfSURfTUlTTUFUQ0g6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SQU5HSU5HX0ZBSUxfUkVBU09OX0RSSUZUX0VYQ0VFREVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkFOR0lOR19GQUlMX1JFQVNPTl9OT19QTE9BTV9SRUNFSVZFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JBTkdJTkdfRkFJTF9SRUFTT05fTE9TOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkFOR0lOR19GQUlMX1JFQVNPTl9BTEFSTVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfRkFJTF9SRUFTT047CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUkVHSVNUUkFUSU9OX0lEX0lEX1JFR0lTVFJBVElPTl9JRCkpICE9IDApCisgICAgeworICAgICAgICBtZW1zZXQodGhpcy0+cmVnaXN0cmF0aW9uX2lkLmFyciwgMCwgc2l6ZW9mKHRoaXMtPnJlZ2lzdHJhdGlvbl9pZC5hcnIpKTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9SRUdJU1RSQVRJT05fSURfSURfUkVRVUVTVF9SRUdJU1RSQVRJT05fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cyA9IEJDTU9MVF9SRVNVTFRfU1VDQ0VTUzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9SRUdJU1RSQVRJT05fSURfSURfUkVRVUVTVF9SRUdJU1RSQVRJT05fRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmVxdWVzdF9yZWdpc3RyYXRpb25fZmFpbF9yZWFzb24gPSBCQ01PTFRfUkVRVUVTVF9SRUdJU1RSQVRJT05fRkFJTF9SRUFTT05fTk9ORTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JFR0lTVFJBVElPTl9JRF9JRF9SRUdJU1RSQVRJT05fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXJyX3U4XzM2X3BhY2soJnRoaXMtPnJlZ2lzdHJhdGlvbl9pZCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUkVHSVNUUkFUSU9OX0lEX0lEX1JFUVVFU1RfUkVHSVNUUkFUSU9OX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfcGFjayh0aGlzLT5yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JFR0lTVFJBVElPTl9JRF9JRF9SRVFVRVNUX1JFR0lTVFJBVElPTl9GQUlMX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9mYWlsX3JlYXNvbl9wYWNrKHRoaXMtPnJlcXVlc3RfcmVnaXN0cmF0aW9uX2ZhaWxfcmVhc29uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JFR0lTVFJBVElPTl9JRF9JRF9SRUdJU1RSQVRJT05fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMzY7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUkVHSVNUUkFUSU9OX0lEX0lEX1JFUVVFU1RfUkVHSVNUUkFUSU9OX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JFR0lTVFJBVElPTl9JRF9JRF9SRVFVRVNUX1JFR0lTVFJBVElPTl9GQUlMX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9SRUdJU1RSQVRJT05fSURfSURfUkVHSVNUUkFUSU9OX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl91OF8zNl91bnBhY2soJnRoaXMtPnJlZ2lzdHJhdGlvbl9pZCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9SRUdJU1RSQVRJT05fSURfSURfUkVRVUVTVF9SRUdJU1RSQVRJT05fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jlc3VsdF91bnBhY2soJnRoaXMtPnJlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUkVHSVNUUkFUSU9OX0lEX0lEX1JFUVVFU1RfUkVHSVNUUkFUSU9OX0ZBSUxfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2ZhaWxfcmVhc29uX3VucGFjaygmdGhpcy0+cmVxdWVzdF9yZWdpc3RyYXRpb25fZmFpbF9yZWFzb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9SRUdJU1RSQVRJT05fSURfSURfUkVHSVNUUkFUSU9OX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMzYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9SRUdJU1RSQVRJT05fSURfSURfUkVRVUVTVF9SRUdJU1RSQVRJT05fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JFR0lTVFJBVElPTl9JRF9JRF9SRVFVRVNUX1JFR0lTVFJBVElPTl9GQUlMX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9SRUdJU1RSQVRJT05fSURfSURfUkVHSVNUUkFUSU9OX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl91OF8zNl9ib3VuZHNfY2hlY2soJnRoaXMtPnJlZ2lzdHJhdGlvbl9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfUkVHSVNUUkFUSU9OX0lEX0lEX1JFR0lTVFJBVElPTl9JRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JFR0lTVFJBVElPTl9JRF9JRF9SRVFVRVNUX1JFR0lTVFJBVElPTl9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JFU1VMVF9TVUNDRVNTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVTVUxUX0ZBSUw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfUkVHSVNUUkFUSU9OX0lEX0lEX1JFUVVFU1RfUkVHSVNUUkFUSU9OX1NUQVRVUzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9SRUdJU1RSQVRJT05fSURfSURfUkVRVUVTVF9SRUdJU1RSQVRJT05fRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9mYWlsX3JlYXNvbikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVRVUVTVF9SRUdJU1RSQVRJT05fRkFJTF9SRUFTT05fTk9ORToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JFUVVFU1RfUkVHSVNUUkFUSU9OX0ZBSUxfUkVBU09OX1JFR0lTVFJBVElPTl9QTE9BTV9USU1FT1VUOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVRVUVTVF9SRUdJU1RSQVRJT05fRkFJTF9SRUFTT05fT05VX0FMQVJNOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVRVUVTVF9SRUdJU1RSQVRJT05fRkFJTF9SRUFTT05fREVBQ1RJVkFUSU9OOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVRVUVTVF9SRUdJU1RSQVRJT05fRkFJTF9SRUFTT05fRElTQUJMRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9SRUdJU1RSQVRJT05fSURfSURfUkVRVUVTVF9SRUdJU1RSQVRJT05fRkFJTF9SRUFTT047CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0dXMgPSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1M7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZmFpbF9yZWFzb24gPSBCQ01PTFRfUlNTSV9NRUFTVVJFTUVOVF9GQUlMX1JFQVNPTl9OT05FOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfcGFjayh0aGlzLT5zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jzc2lfbWVhc3VyZW1lbnRfZmFpbF9yZWFzb25fcGFjayh0aGlzLT5mYWlsX3JlYXNvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfdW5wYWNrKCZ0aGlzLT5zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Jzc2lfbWVhc3VyZW1lbnRfZmFpbF9yZWFzb25fdW5wYWNrKCZ0aGlzLT5mYWlsX3JlYXNvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnN0YXR1cykKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1M6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SRVNVTFRfRkFJTDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5mYWlsX3JlYXNvbikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUlNTSV9NRUFTVVJFTUVOVF9GQUlMX1JFQVNPTl9OT05FOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUlNTSV9NRUFTVVJFTUVOVF9GQUlMX1JFQVNPTl9OT19ERUxJTUlURVI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SU1NJX01FQVNVUkVNRU5UX0ZBSUxfUkVBU09OX05PX0FDQ0VTUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9zZGlfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X3NkaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TRElfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXR1cyA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NESV9JRF9CRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YmVyID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc2RpX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X3NkaV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NESV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TRElfSURfQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5iZXIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfc2RpX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9zZGlfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NESV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TRElfSURfQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3NkaV9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X3NkaV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NESV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TRElfSURfQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5iZXIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zZGlfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU0RJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TRElfSURfQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3NkaV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X3NkaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9zZGlfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NESV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5hbGFybV9zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX1NESV9JRF9BTEFSTV9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9GQUlMVVJFX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdGF0dXMgPSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1M7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9GQUlMVVJFX0lEX0ZBSUxfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmZhaWxfcmVhc29uID0gQkNNT0xUX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTF9SRUFTT05fVElNRU9VVDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTFVSRV9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzdWx0X3BhY2sodGhpcy0+c3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0ZBSUxVUkVfSURfRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsX3JlYXNvbl9wYWNrKHRoaXMtPmZhaWxfcmVhc29uLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTFVSRV9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0ZBSUxVUkVfSURfRkFJTF9SRUFTT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9GQUlMVVJFX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfdW5wYWNrKCZ0aGlzLT5zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTFVSRV9JRF9GQUlMX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWxfcmVhc29uX3VucGFjaygmdGhpcy0+ZmFpbF9yZWFzb24sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0ZBSUxVUkVfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTFVSRV9JRF9GQUlMX1JFQVNPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0ZBSUxVUkVfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9SRVNVTFRfU1VDQ0VTUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JFU1VMVF9GQUlMOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTFVSRV9JRF9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9GQUlMVVJFX0lEX0ZBSUxfUkVBU09OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+ZmFpbF9yZWFzb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTF9SRUFTT05fVElNRU9VVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0ZBSUxVUkVfSURfRkFJTF9SRUFTT047CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9zZmlfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU0ZJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5hbGFybV9zdGF0dXMgPSBCQ01PTFRfU1RBVFVTX09GRjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TRklfSURfQkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmJlciA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3NmaV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9zZmlfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TRklfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU0ZJX0lEX0JFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+YmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X3NmaV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TRklfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU0ZJX0lEX0JFUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zZmlfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9zZmlfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TRklfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU0ZJX0lEX0JFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+YmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NGSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU0ZJX0lEX0JFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zZmlfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9zZmlfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TRklfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+YWxhcm1fc3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9TRklfSURfQUxBUk1fU1RBVFVTOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXQgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUE9TSVRJVkVfRFJJRlQ7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9pZF9wYWNrKHRoaXMtPnN0YXQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fb251X3N0YXRfaWRfdW5wYWNrKCZ0aGlzLT5zdGF0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5zdGF0KQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9QT1NJVElWRV9EUklGVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX05FR0FUSVZFX0RSSUZUOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfREVMSU1JVEVSX01JU1NfREVURUNUSU9OOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfQklQMzJfRVJST1JTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfV09SRFM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09SUkVDVEVEX1NZTUJPTFM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09SUkVDVEVEX0NPREVXT1JEUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0ZFQ19VTkNPUlJFQ1RBQkxFX0NPREVXT1JEUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0ZFQ19DT0RFV09SRFM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09SUkVDVEVEX0JJVFM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9YR0VNX0tFWV9FUlJPUlM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9YR0VNX0xPU1M6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfTUlDX0VSUk9SOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfUExPQU1TX05PTl9JRExFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfT01DSToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX1BBQ0tFVFM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9UWF9CWVRFUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1RYX1BBQ0tFVFM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c3RhdCA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9QT1NJVElWRV9EUklGVDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX29udV9zdGF0X2lkX3BhY2sodGhpcy0+c3RhdCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9pZF91bnBhY2soJnRoaXMtPnN0YXQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnN0YXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1BPU0lUSVZFX0RSSUZUOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfTkVHQVRJVkVfRFJJRlQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9ERUxJTUlURVJfTUlTU19ERVRFQ1RJT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9CSVAzMl9FUlJPUlM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9XT1JEUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0ZFQ19DT1JSRUNURURfU1lNQk9MUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0ZFQ19DT1JSRUNURURfQ09ERVdPUkRTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX1VOQ09SUkVDVEFCTEVfQ09ERVdPUkRTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0ZFQ19DT1JSRUNURURfQklUUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1hHRU1fS0VZX0VSUk9SUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1hHRU1fTE9TUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX1BMT0FNU19NSUNfRVJST1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfTk9OX0lETEU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9PTUNJOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfUEFDS0VUUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1RYX0JZVEVTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfVFhfUEFDS0VUUzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fb251X3N1ZmlfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X3N1ZmlfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1VGSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWxhcm1fc3RhdHVzID0gQkNNT0xUX1NUQVRVU19PRkY7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3N1ZmlfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc3VmaV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NVRklfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c19wYWNrKHRoaXMtPmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X3N1ZmlfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X3N1ZmlfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NVRklfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3N1ZmlfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9zdWZpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU1VGSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3VucGFjaygmdGhpcy0+YWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zdWZpX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NVRklfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3N1ZmlfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9zdWZpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X3N1ZmlfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NVRklfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+YWxhcm1fc3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9TVUZJX0lEX0FMQVJNX1NUQVRVUzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV90aXdpX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV90aXdpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1RJV0lfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmFsYXJtX3N0YXR1cyA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1RJV0lfSURfRFJJRlRfVkFMVUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZHJpZnRfdmFsdWUgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV90aXdpX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X3Rpd2lfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9USVdJX0lEX0FMQVJNX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfcGFjayh0aGlzLT5hbGFybV9zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1RJV0lfSURfRFJJRlRfVkFMVUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3MzMihidWYsIHRoaXMtPmRyaWZ0X3ZhbHVlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X3Rpd2lfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X3Rpd2lfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1RJV0lfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfVElXSV9JRF9EUklGVF9WQUxVRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV90aXdpX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1RJV0lfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3N0YXR1c191bnBhY2soJnRoaXMtPmFsYXJtX3N0YXR1cywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfVElXSV9JRF9EUklGVF9WQUxVRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9zMzIoYnVmLCAmdGhpcy0+ZHJpZnRfdmFsdWUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV90aXdpX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1RJV0lfSURfQUxBUk1fU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1RJV0lfSURfRFJJRlRfVkFMVUUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X3Rpd2lfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfVElXSV9JRF9BTEFSTV9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5hbGFybV9zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRVU19PRkY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT046CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX1RJV0lfSURfQUxBUk1fU1RBVFVTOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1RVTklOR19SRVNQT05TRV9JRF9BQ0spKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YWNrID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfVFVOSU5HX1JFU1BPTlNFX0lEX1JFU1VMVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yZXN1bHQgPSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1M7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9UVU5JTkdfUkVTUE9OU0VfSURfQUNLKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+YWNrKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfVFVOSU5HX1JFU1BPTlNFX0lEX1JFU1VMVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9yZXN1bHRfcGFjayh0aGlzLT5yZXN1bHQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfVFVOSU5HX1JFU1BPTlNFX0lEX0FDSykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1RVTklOR19SRVNQT05TRV9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfVFVOSU5HX1JFU1BPTlNFX0lEX0FDSykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmFjaykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1RVTklOR19SRVNQT05TRV9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcmVzdWx0X3VucGFjaygmdGhpcy0+cmVzdWx0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfVFVOSU5HX1JFU1BPTlNFX0lEX0FDSykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9UVU5JTkdfUkVTUE9OU0VfSURfUkVTVUxUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1RVTklOR19SRVNQT05TRV9JRF9SRVNVTFQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5yZXN1bHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JFU1VMVF9TVUNDRVNTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVTVUxUX0ZBSUw6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfVFVOSU5HX1JFU1BPTlNFX0lEX1JFU1VMVDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfREZJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRmaSA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0RHSSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5kZ2kgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9ET1dJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmRvd2kgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9JTlZBTElEX0RCUlVfUkVQT1JUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmludmFsaWRfZGJydV9yZXBvcnQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmtleV9leGNoYW5nZV9jb21wbGV0ZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfQ1lDTEVfU0tJUFBFRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0gpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+a2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9LRVlfUkVRVUVTVF9USU1FT1VUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmtleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0ID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfTE9PQ0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+bG9vY2kgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfQUNUSVZBVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b251X2FjdGl2YXRpb25fY29tcGxldGVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0FMQVJNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9udV9hbGFybSA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0RJU0FCTEVfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9udV9kaXNhYmxlX2NvbXBsZXRlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9FTkFCTEVfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9udV9lbmFibGVfY29tcGxldGVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX1RVTklOR19JTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b251X3R1bmluZ19pbl9jb21wbGV0ZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfVFVOSU5HX09VVF9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+b251X3R1bmluZ19vdXRfY29tcGxldGVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT1BUSUNBTF9SRUZMRUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9wdGljYWxfcmVmbGVjdGlvbiA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1BPU1NJQkxFX0RSSUZUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBvc3NpYmxlX2RyaWZ0ID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUE9XRVJfQ09OU1VNUFRJT05fUkVQT1JUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1BPV0VSX0xFVkVMX1JFUE9SVCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wb3dlcl9sZXZlbF9yZXBvcnQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1BRU0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cHFzaSA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1JBTkdJTkdfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJhbmdpbmdfY29tcGxldGVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUkVHSVNUUkFUSU9OX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJlZ2lzdHJhdGlvbl9pZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU0RJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnNkaSA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTFVSRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmUgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9TRkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+c2ZpID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXRfYWxhcm1fY2xlYXJlZCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU1VGSSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zdWZpID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfVElXSSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50aXdpID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfVFVOSU5HX1JFU1BPTlNFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR1bmluZ19yZXNwb25zZSA9IEJDTU9TX0ZBTFNFOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0RGSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmRmaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0RHSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmRnaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0RPV0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5kb3dpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfSU5WQUxJRF9EQlJVX1JFUE9SVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmludmFsaWRfZGJydV9yZXBvcnQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+a2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9DWUNMRV9TS0lQUEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+a2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+a2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9LRVlfUkVRVUVTVF9USU1FT1VUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+a2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9MT09DSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmxvb2NpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0FDVElWQVRJT05fQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+b251X2FjdGl2YXRpb25fY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0FMQVJNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+b251X2FsYXJtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9ESVNBQkxFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPm9udV9kaXNhYmxlX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9FTkFCTEVfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+b251X2VuYWJsZV9jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfVFVOSU5HX0lOX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPm9udV90dW5pbmdfaW5fY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX1RVTklOR19PVVRfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+b251X3R1bmluZ19vdXRfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT1BUSUNBTF9SRUZMRUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+b3B0aWNhbF9yZWZsZWN0aW9uKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUE9TU0lCTEVfRFJJRlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5wb3NzaWJsZV9kcmlmdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1BPV0VSX0NPTlNVTVBUSU9OX1JFUE9SVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnBvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1BPV0VSX0xFVkVMX1JFUE9SVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnBvd2VyX2xldmVsX3JlcG9ydCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+cG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9QUVNJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+cHFzaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1JBTkdJTkdfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+cmFuZ2luZ19jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9SRUdJU1RSQVRJT05fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5yZWdpc3RyYXRpb25faWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU0RJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c2RpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9GQUlMVVJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU0ZJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c2ZpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+c3RhdF9hbGFybV9jbGVhcmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5zdGF0X2FsYXJtX3JhaXNlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1NVRkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5zdWZpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfVElXSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnRpd2kpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9UVU5JTkdfUkVTUE9OU0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT50dW5pbmdfcmVzcG9uc2UpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9ERkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9ER0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9ET1dJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfSU5WQUxJRF9EQlJVX1JFUE9SVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfQ1lDTEVfU0tJUFBFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0gpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfS0VZX1JFUVVFU1RfVElNRU9VVCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0xPT0NJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0FDVElWQVRJT05fQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0FMQVJNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfRElTQUJMRV9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfRU5BQkxFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9UVU5JTkdfSU5fQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX1RVTklOR19PVVRfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT1BUSUNBTF9SRUZMRUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUE9TU0lCTEVfRFJJRlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9QT1dFUl9DT05TVU1QVElPTl9SRVBPUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9QT1dFUl9MRVZFTF9SRVBPUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1BRU0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9SQU5HSU5HX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1JFR0lTVFJBVElPTl9JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU0RJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9GQUlMVVJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU0ZJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9TVUZJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfVElXSSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1RVTklOR19SRVNQT05TRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfREZJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+ZGZpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfREdJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+ZGdpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfRE9XSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmRvd2kpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9JTlZBTElEX0RCUlVfUkVQT1JUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+aW52YWxpZF9kYnJ1X3JlcG9ydCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5rZXlfZXhjaGFuZ2VfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0NZQ0xFX1NLSVBQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0gpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0tFWV9SRVFVRVNUX1RJTUVPVVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0xPT0NJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+bG9vY2kpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfQUNUSVZBVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfQUxBUk0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5vbnVfYWxhcm0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfREVBQ1RJVkFUSU9OX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPm9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0RJU0FCTEVfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+b251X2Rpc2FibGVfY29tcGxldGVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0VOQUJMRV9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5vbnVfZW5hYmxlX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9UVU5JTkdfSU5fQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+b251X3R1bmluZ19pbl9jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfVFVOSU5HX09VVF9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5vbnVfdHVuaW5nX291dF9jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PUFRJQ0FMX1JFRkxFQ1RJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5vcHRpY2FsX3JlZmxlY3Rpb24pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9QT1NTSUJMRV9EUklGVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnBvc3NpYmxlX2RyaWZ0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUE9XRVJfQ09OU1VNUFRJT05fUkVQT1JUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+cG93ZXJfY29uc3VtcHRpb25fcmVwb3J0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUE9XRVJfTEVWRUxfUkVQT1JUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+cG93ZXJfbGV2ZWxfcmVwb3J0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1BRU0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5wcXNpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUkFOR0lOR19DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5yYW5naW5nX2NvbXBsZXRlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1JFR0lTVFJBVElPTl9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnJlZ2lzdHJhdGlvbl9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+cnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9TREkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zZGkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0ZBSUxVUkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9TRkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zZmkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5zdGF0X2FsYXJtX2NsZWFyZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU1VGSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnN1ZmkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9USVdJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+dGl3aSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1RVTklOR19SRVNQT05TRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnR1bmluZ19yZXNwb25zZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0RGSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9ER0kpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfRE9XSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9JTlZBTElEX0RCUlVfUkVQT1JUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0NZQ0xFX1NLSVBQRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfS0VZX1JFUVVFU1RfVElNRU9VVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9MT09DSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfQUNUSVZBVElPTl9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0FMQVJNKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9ESVNBQkxFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfRU5BQkxFX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfVFVOSU5HX0lOX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfVFVOSU5HX09VVF9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT1BUSUNBTF9SRUZMRUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1BPU1NJQkxFX0RSSUZUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1BPV0VSX0NPTlNVTVBUSU9OX1JFUE9SVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9QT1dFUl9MRVZFTF9SRVBPUlQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUFFTSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9SQU5HSU5HX0NPTVBMRVRFRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9SRUdJU1RSQVRJT05fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU0RJKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTFVSRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9TRkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1NVRkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfVElXSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9UVU5JTkdfUkVTUE9OU0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FESlVTVF9UWF9XQVZFTEVOR1RIX0lEX0ZSRVFVRU5DWV9BREpVU1RNRU5UX0RJUkVDVElPTikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5mcmVxdWVuY3lfYWRqdXN0bWVudF9kaXJlY3Rpb24gPSBCQ01PTFRfRlJFUVVFTkNZX0FESlVTVE1FTlRfRElSRUNUSU9OX0xPV0VSOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FESlVTVF9UWF9XQVZFTEVOR1RIX0lEX0ZSRVFVRU5DWV9BREpVU1RNRU5UX1NJWkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZnJlcXVlbmN5X2FkanVzdG1lbnRfc2l6ZSA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfRlJFUVVFTkNZX0FESlVTVE1FTlRfRElSRUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2ZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbl9wYWNrKHRoaXMtPmZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfRlJFUVVFTkNZX0FESlVTVE1FTlRfU0laRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5mcmVxdWVuY3lfYWRqdXN0bWVudF9zaXplKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfRlJFUVVFTkNZX0FESlVTVE1FTlRfRElSRUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfRlJFUVVFTkNZX0FESlVTVE1FTlRfU0laRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfRlJFUVVFTkNZX0FESlVTVE1FTlRfRElSRUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2ZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbl91bnBhY2soJnRoaXMtPmZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfRlJFUVVFTkNZX0FESlVTVE1FTlRfU0laRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5mcmVxdWVuY3lfYWRqdXN0bWVudF9zaXplKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfRlJFUVVFTkNZX0FESlVTVE1FTlRfRElSRUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0FESlVTVF9UWF9XQVZFTEVOR1RIX0lEX0ZSRVFVRU5DWV9BREpVU1RNRU5UX1NJWkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfRlJFUVVFTkNZX0FESlVTVE1FTlRfRElSRUNUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+ZnJlcXVlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9GUkVRVUVOQ1lfQURKVVNUTUVOVF9ESVJFQ1RJT05fTE9XRVI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9GUkVRVUVOQ1lfQURKVVNUTUVOVF9ESVJFQ1RJT05fSElHSEVSOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX0FESlVTVF9UWF9XQVZFTEVOR1RIX0lEX0ZSRVFVRU5DWV9BREpVU1RNRU5UX0RJUkVDVElPTjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NIQU5HRV9QT1dFUl9MRVZFTExJTkdfSURfQ09OVFJPTCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jb250cm9sID0gQkNNT0xUX1BPV0VSX0xFVkVMTElOR19DT05UUk9MX0RJUkVDVDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DSEFOR0VfUE9XRVJfTEVWRUxMSU5HX0lEX0FUVEVOVUFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmF0dGVudWF0aW9uID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0hBTkdFX1BPV0VSX0xFVkVMTElOR19JRF9DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bvd2VyX2xldmVsbGluZ19jb250cm9sX3BhY2sodGhpcy0+Y29udHJvbCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0hBTkdFX1BPV0VSX0xFVkVMTElOR19JRF9BVFRFTlVBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5hdHRlbnVhdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DSEFOR0VfUE9XRVJfTEVWRUxMSU5HX0lEX0NPTlRST0wpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DSEFOR0VfUE9XRVJfTEVWRUxMSU5HX0lEX0FUVEVOVUFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0hBTkdFX1BPV0VSX0xFVkVMTElOR19JRF9DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bvd2VyX2xldmVsbGluZ19jb250cm9sX3VucGFjaygmdGhpcy0+Y29udHJvbCwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0hBTkdFX1BPV0VSX0xFVkVMTElOR19JRF9BVFRFTlVBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT5hdHRlbnVhdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0hBTkdFX1BPV0VSX0xFVkVMTElOR19JRF9DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NIQU5HRV9QT1dFUl9MRVZFTExJTkdfSURfQVRURU5VQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0hBTkdFX1BPV0VSX0xFVkVMTElOR19JRF9DT05UUk9MKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+Y29udHJvbCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUE9XRVJfTEVWRUxMSU5HX0NPTlRST0xfRElSRUNUOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUE9XRVJfTEVWRUxMSU5HX0NPTlRST0xfREVDUkVBU0U6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9QT1dFUl9MRVZFTExJTkdfQ09OVFJPTF9JTkNSRUFTRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9DSEFOR0VfUE9XRVJfTEVWRUxMSU5HX0lEX0NPTlRST0w7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1RBUkdFVF9EU19QT05fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dGFyZ2V0X2RzX3Bvbl9pZC5hZG1pbmlzdHJhdGl2ZV9sYWJlbCA9IDA7CisgICAgICAgIHRoaXMtPnRhcmdldF9kc19wb25faWQuZHdsY2hfaWQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1RBUkdFVF9VU19QT05fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dGFyZ2V0X3VzX3Bvbl9pZC5hZG1pbmlzdHJhdGl2ZV9sYWJlbCA9IDA7CisgICAgICAgIHRoaXMtPnRhcmdldF91c19wb25faWQuZHdsY2hfaWQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1RJTUVfVE9fU1dJVENIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnRpbWVfdG9fc3dpdGNoID0gNTAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1JPTExCQUNLKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJvbGxiYWNrID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnN0YXR1cyA9IEJDTU9MVF9TVEFUVVNfT0ZGOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1RBUkdFVF9EU19QT05fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcG9uX2lkX3BhY2soJnRoaXMtPnRhcmdldF9kc19wb25faWQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1RBUkdFVF9VU19QT05fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcG9uX2lkX3BhY2soJnRoaXMtPnRhcmdldF91c19wb25faWQsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1RJTUVfVE9fU1dJVENIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT50aW1lX3RvX3N3aXRjaCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1JPTExCQUNLKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+cm9sbGJhY2spKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc3RhdHVzX3BhY2sodGhpcy0+c3RhdHVzLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9JRF9UQVJHRVRfRFNfUE9OX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfSURfVEFSR0VUX1VTX1BPTl9JRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA1OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1RJTUVfVE9fU1dJVENIKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfSURfUk9MTEJBQ0spKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1RBUkdFVF9EU19QT05fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfcG9uX2lkX3VucGFjaygmdGhpcy0+dGFyZ2V0X2RzX3Bvbl9pZCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9JRF9UQVJHRVRfVVNfUE9OX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3Bvbl9pZF91bnBhY2soJnRoaXMtPnRhcmdldF91c19wb25faWQsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfSURfVElNRV9UT19TV0lUQ0gpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnRpbWVfdG9fc3dpdGNoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfSURfUk9MTEJBQ0spKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5yb2xsYmFjaykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1NUQVRVUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5zdGF0dXMsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1RBUkdFVF9EU19QT05fSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA1KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfSURfVEFSR0VUX1VTX1BPTl9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9JRF9USU1FX1RPX1NXSVRDSCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9JRF9ST0xMQkFDSykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9JRF9TVEFUVVMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfSURfVEFSR0VUX0RTX1BPTl9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25faWRfYm91bmRzX2NoZWNrKCZ0aGlzLT50YXJnZXRfZHNfcG9uX2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9JRF9UQVJHRVRfRFNfUE9OX0lEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfSURfVEFSR0VUX1VTX1BPTl9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wb25faWRfYm91bmRzX2NoZWNrKCZ0aGlzLT50YXJnZXRfdXNfcG9uX2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9JRF9UQVJHRVRfVVNfUE9OX0lEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfSURfVElNRV9UT19TV0lUQ0gpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnRpbWVfdG9fc3dpdGNoIDwgNTAwKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1RJTUVfVE9fU1dJVENIOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfSURfU1RBVFVTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+c3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUVVNfT0ZGOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX09OOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9JRF9TVEFUVVM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25fZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JFUVVFU1RfUkVHSVNUUkFUSU9OX0lEX1NNQV9GTEFHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnNtYV9mbGFnID0gQkNNT1NfRkFMU0U7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUkVRVUVTVF9SRUdJU1RSQVRJT05fSURfU01BX0ZMQUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5zbWFfZmxhZykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1JFUVVFU1RfUkVHSVNUUkFUSU9OX0lEX1NNQV9GTEFHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9SRVFVRVNUX1JFR0lTVFJBVElPTl9JRF9TTUFfRkxBRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnNtYV9mbGFnKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25fZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUkVRVUVTVF9SRUdJU1RSQVRJT05fSURfU01BX0ZMQUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25fZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0lEX01BU1RFUl9LRVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgbWVtc2V0KHRoaXMtPm1hc3Rlcl9rZXkuYnl0ZXMsIDAsIHNpemVvZih0aGlzLT5tYXN0ZXJfa2V5LmJ5dGVzKSk7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9JRF9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YnVmZmVyLmxlbiA9IDA7CisgICAgICAgIHRoaXMtPmJ1ZmZlci52YWwgPSBOVUxMOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fSURfTUlDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm1pYyA9IDA7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fSURfTUFTVEVSX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hZXNfa2V5X3BhY2soJnRoaXMtPm1hc3Rlcl9rZXksIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fSURfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4X3BhY2soJnRoaXMtPmJ1ZmZlciwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9JRF9NSUMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPm1pYykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0lEX01BU1RFUl9LRVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTY7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9JRF9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5idWZmZXIpOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fSURfTUlDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9JRF9NQVNURVJfS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Flc19rZXlfdW5wYWNrKCZ0aGlzLT5tYXN0ZXJfa2V5LCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fSURfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4X3VucGFjaygmdGhpcy0+YnVmZmVyLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fSURfTUlDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5taWMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fSURfTUFTVEVSX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDE2KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9JRF9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDhfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fSURfTUlDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25faWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fSURfTUFTVEVSX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hZXNfa2V5X2JvdW5kc19jaGVjaygmdGhpcy0+bWFzdGVyX2tleSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9JRF9NQVNURVJfS0VZOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9JRF9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPmJ1ZmZlci5sZW4gPiAyMDQ4KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OF9ib3VuZHNfY2hlY2soJnRoaXMtPmJ1ZmZlcikpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9JRF9CVUZGRVI7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm9udV9zdGF0ZSA9IEJDTU9MVF9PTlVfT1BFUkFUSU9OX0lOQUNUSVZFOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TRVRfT05VX1NUQVRFX0lEX09OVV9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9vbnVfb3BlcmF0aW9uX3BhY2sodGhpcy0+b251X3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfU0VUX09OVV9TVEFURV9JRF9PTlVfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9TRVRfT05VX1NUQVRFX0lEX09OVV9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9vbnVfb3BlcmF0aW9uX3VucGFjaygmdGhpcy0+b251X3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGVfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodGhpcy0+b251X3N0YXRlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfT1BFUkFUSU9OX0lOQUNUSVZFOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfT05VX09QRVJBVElPTl9BQ1RJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfT1BFUkFUSU9OX0RJU0FCTEU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfT1BFUkFUSU9OX0VOQUJMRToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX09OVV9PUEVSQVRJT05fQUNUSVZFX1NUQU5EQlk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9PTlVfT1BFUkFUSU9OX0FXQUtFX0ZSRUU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfU0VUX09OVV9TVEFURV9JRF9PTlVfU1RBVEU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBhY2tldF90eXBlID0gQkNNT0xUX1BBQ0tFVF9UWVBFX0NQVTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9DQUxDX0NSQykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5jYWxjX2NyYyA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRTX0lEX05VTUJFUl9PRl9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPm51bWJlcl9vZl9wYWNrZXRzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfU0laRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wYWNrZXRfc2l6ZSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmJ1ZmZlci5sZW4gPSAwOworICAgICAgICB0aGlzLT5idWZmZXIudmFsID0gTlVMTDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wYWNrZXRfdHlwZV9wYWNrKHRoaXMtPnBhY2tldF90eXBlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9DQUxDX0NSQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmNhbGNfY3JjKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfTlVNQkVSX09GX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bnVtYmVyX29mX3BhY2tldHMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfU0laRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+cGFja2V0X3NpemUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDhfcGFjaygmdGhpcy0+YnVmZmVyLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRTX0lEX0NBTENfQ1JDKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfTlVNQkVSX09GX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfU0laRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRTX0lEX0JVRkZFUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSBiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDhfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmJ1ZmZlcik7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9wYWNrZXRfdHlwZV91bnBhY2soJnRoaXMtPnBhY2tldF90eXBlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9DQUxDX0NSQykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmNhbGNfY3JjKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfTlVNQkVSX09GX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bnVtYmVyX29mX3BhY2tldHMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfU0laRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+cGFja2V0X3NpemUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDhfdW5wYWNrKCZ0aGlzLT5idWZmZXIsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfUEFDS0VUX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfQ0FMQ19DUkMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfTlVNQkVSX09GX1BBQ0tFVFMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfUEFDS0VUX1NJWkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4X3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfVFlQRSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPnBhY2tldF90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9QQUNLRVRfVFlQRV9DUFU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9QQUNLRVRfVFlQRV9PTUNJOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9UWVBFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRTX0lEX05VTUJFUl9PRl9QQUNLRVRTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5udW1iZXJfb2ZfcGFja2V0cyA+IDMyKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRTX0lEX05VTUJFUl9PRl9QQUNLRVRTOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfUEFDS0VUX1NJWkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnBhY2tldF9zaXplID4gMjAwMCkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfU0laRTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRTX0lEX0JVRkZFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+YnVmZmVyLmxlbiA+IDIwNDgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4X2JvdW5kc19jaGVjaygmdGhpcy0+YnVmZmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9CVUZGRVI7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9QTE9BTV9QQUNLRVRfSURfREVGQVVMVF9LRVkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZGVmYXVsdF9rZXkgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9QTE9BTV9QQUNLRVRfSURfUExPQU0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgbWVtc2V0KHRoaXMtPnBsb2FtLmFyciwgMCwgc2l6ZW9mKHRoaXMtPnBsb2FtLmFycikpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUExPQU1fUEFDS0VUX0lEX0RFRkFVTFRfS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+ZGVmYXVsdF9rZXkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9QTE9BTV9QQUNLRVRfSURfUExPQU0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXJyX3U4XzQwX3BhY2soJnRoaXMtPnBsb2FtLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1BMT0FNX1BBQ0tFVF9JRF9ERUZBVUxUX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1BMT0FNX1BBQ0tFVF9JRF9QTE9BTSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0MDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfUExPQU1fUEFDS0VUX0lEX0RFRkFVTFRfS0VZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+ZGVmYXVsdF9rZXkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9QTE9BTV9QQUNLRVRfSURfUExPQU0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXJyX3U4XzQwX3VucGFjaygmdGhpcy0+cGxvYW0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1BMT0FNX1BBQ0tFVF9JRF9ERUZBVUxUX0tFWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9QTE9BTV9QQUNLRVRfSURfUExPQU0pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCA0MCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX1BMT0FNX1BBQ0tFVF9JRF9QTE9BTSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfdThfNDBfYm91bmRzX2NoZWNrKCZ0aGlzLT5wbG9hbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfUExPQU1fUEFDS0VUX0lEX1BMT0FNOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUX0lEX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cG9ydF9pZCA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9DUkNfT0spKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Y3JjX29rID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9QQUNLRVRfU0laRSkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wYWNrZXRfc2l6ZSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YnVmZmVyLmxlbiA9IDA7CisgICAgICAgIHRoaXMtPmJ1ZmZlci52YWwgPSBOVUxMOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUX0lEX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnBvcnRfaWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUX0lEX0NSQ19PSykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmNyY19vaykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRfSURfUEFDS0VUX1NJWkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnBhY2tldF9zaXplKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfdThfbGlzdF91MzJfcGFjaygmdGhpcy0+YnVmZmVyLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9DUkNfT0spKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUX0lEX1BBQ0tFVF9TSVpFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDQ7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9CVUZGRVIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X3U4X2xpc3RfdTMyX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5idWZmZXIpOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRfSURfUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+cG9ydF9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRfSURfQ1JDX09LKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+Y3JjX29rKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9QQUNLRVRfU0laRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+cGFja2V0X3NpemUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUX0lEX0JVRkZFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF91OF9saXN0X3UzMl91bnBhY2soJnRoaXMtPmJ1ZmZlciwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRfSURfUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUX0lEX0NSQ19PSykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUX0lEX1BBQ0tFVF9TSVpFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRfSURfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTMyX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUX0lEX0JVRkZFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF91OF9saXN0X3UzMl9ib3VuZHNfY2hlY2soJnRoaXMtPmJ1ZmZlcikpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9CVUZGRVI7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5wb3J0X2lkID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9DUkNfT0spKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+Y3JjX29rID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfUEFDS0VUX1NJWkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cGFja2V0X3NpemUgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09NQ0lfUEFDS0VUX0lEX0JVRkZFUikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5idWZmZXIubGVuID0gMDsKKyAgICAgICAgdGhpcy0+YnVmZmVyLnZhbCA9IE5VTEw7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfUE9SVF9JRCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+cG9ydF9pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09NQ0lfUEFDS0VUX0lEX0NSQ19PSykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmNyY19vaykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09NQ0lfUEFDS0VUX0lEX1BBQ0tFVF9TSVpFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5wYWNrZXRfc2l6ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09NQ0lfUEFDS0VUX0lEX0JVRkZFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF91OF9saXN0X3UzMl9wYWNrKCZ0aGlzLT5idWZmZXIsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09NQ0lfUEFDS0VUX0lEX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9DUkNfT0spKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9QQUNLRVRfU0laRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09NQ0lfUEFDS0VUX0lEX0JVRkZFUikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSBiY21vbHRfdThfbGlzdF91MzJfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPmJ1ZmZlcik7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9QT1JUX0lEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5wb3J0X2lkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfQ1JDX09LKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+Y3JjX29rKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfUEFDS0VUX1NJWkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnBhY2tldF9zaXplKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTMyX3VucGFjaygmdGhpcy0+YnVmZmVyLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09NQ0lfUEFDS0VUX0lEX1BPUlRfSUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfQ1JDX09LKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09NQ0lfUEFDS0VUX0lEX1BBQ0tFVF9TSVpFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX09NQ0lfUEFDS0VUX0lEX0JVRkZFUikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF91OF9saXN0X3UzMl9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfQlVGRkVSKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3U4X2xpc3RfdTMyX2JvdW5kc19jaGVjaygmdGhpcy0+YnVmZmVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9CVUZGRVI7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgYmNtb2x0X3hncG9uX3RyeF9rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX3RyeF9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl90cnhfa2V5X3BhY2soY29uc3QgYmNtb2x0X3hncG9uX3RyeF9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcy0+cG9uX25pKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeGdwb25fdHJ4X2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fdHJ4X2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl90cnhfa2V5X3VucGFjayhiY21vbHRfeGdwb25fdHJ4X2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgKHVpbnQ4X3QgKikgJnRoaXMtPnBvbl9uaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fdHJ4X2tleV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfS0VZX0lEX1BPTl9OSSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3RyeF9rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl90cnhfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX3RyeF9rZXlfaWQgKmZhaWxlZF9wcm9wKQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnBvbl9uaSA+IChiY21vbHRfeGdwb25fbmkpIDcpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9UUlhfS0VZX0lEX1BPTl9OSTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9CVVJTVF9QUk9GSUxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmJ1cnN0X3Byb2ZpbGUuYXJyWzBdLnByb2ZpbGVfdmVyc2lvbiA9IDA7CisgICAgICAgIHRoaXMtPmJ1cnN0X3Byb2ZpbGUuYXJyWzBdLmlzX2ZlY19vbiA9IEJDTU9TX0ZBTFNFOworICAgICAgICB0aGlzLT5idXJzdF9wcm9maWxlLmFyclswXS5kZWxpbWl0ZXJfc2l6ZV9pbl9ieXRlcyA9IDg7CisgICAgICAgIHRoaXMtPmJ1cnN0X3Byb2ZpbGUuYXJyWzBdLmRlbGltaXRlcl9wYXR0ZXJuX2hpZ2ggPSAzMDE1NTYyMDAwVUw7CisgICAgICAgIHRoaXMtPmJ1cnN0X3Byb2ZpbGUuYXJyWzBdLmRlbGltaXRlcl9wYXR0ZXJuX2xvdyA9IDI5OTkyNTkwNDFVTDsKKyAgICAgICAgdGhpcy0+YnVyc3RfcHJvZmlsZS5hcnJbMF0ucHJlYW1ibGVfbGVuZ3RoX2luX2J5dGVzID0gODsKKyAgICAgICAgdGhpcy0+YnVyc3RfcHJvZmlsZS5hcnJbMF0ucHJlYW1ibGVfcmVwZWF0c19jb3VudCA9IDIwOworICAgICAgICB0aGlzLT5idXJzdF9wcm9maWxlLmFyclswXS5wcmVhbWJsZV9wYXR0ZXJuX2hpZ2ggPSAyODYzMzExNTMwVUw7CisgICAgICAgIHRoaXMtPmJ1cnN0X3Byb2ZpbGUuYXJyWzBdLnByZWFtYmxlX3BhdHRlcm5fbG93ID0gMjg2MzMxMTUzMFVMOworICAgICAgICB0aGlzLT5idXJzdF9wcm9maWxlLmFyclswXS5wb25fdGFnID0gMDsKKyAgICAgICAgdGhpcy0+YnVyc3RfcHJvZmlsZS5hcnJbMF0ubnVtX29mX2d1YXJkX2J5dGVzID0gMTY7CisgICAgICAgIHRoaXMtPmJ1cnN0X3Byb2ZpbGUuYXJyWzBdLmlzX3Byb2ZpbGVfdmFsaWQgPSBCQ01PU19UUlVFOworICAgICAgICB0aGlzLT5idXJzdF9wcm9maWxlLmFyclswXS5idXJzdF9vdmVyaGVhZF9zaXplX2luX3dvcmRzID0gNzg7CisgICAgICAgIHRoaXMtPmJ1cnN0X3Byb2ZpbGUuYXJyWzFdLnByb2ZpbGVfdmVyc2lvbiA9IDA7CisgICAgICAgIHRoaXMtPmJ1cnN0X3Byb2ZpbGUuYXJyWzFdLmlzX2ZlY19vbiA9IEJDTU9TX0ZBTFNFOworICAgICAgICB0aGlzLT5idXJzdF9wcm9maWxlLmFyclsxXS5kZWxpbWl0ZXJfc2l6ZV9pbl9ieXRlcyA9IDg7CisgICAgICAgIHRoaXMtPmJ1cnN0X3Byb2ZpbGUuYXJyWzFdLmRlbGltaXRlcl9wYXR0ZXJuX2hpZ2ggPSAzMDE1NTYyMDAwVUw7CisgICAgICAgIHRoaXMtPmJ1cnN0X3Byb2ZpbGUuYXJyWzFdLmRlbGltaXRlcl9wYXR0ZXJuX2xvdyA9IDI5OTkyNTkwNDFVTDsKKyAgICAgICAgdGhpcy0+YnVyc3RfcHJvZmlsZS5hcnJbMV0ucHJlYW1ibGVfbGVuZ3RoX2luX2J5dGVzID0gODsKKyAgICAgICAgdGhpcy0+YnVyc3RfcHJvZmlsZS5hcnJbMV0ucHJlYW1ibGVfcmVwZWF0c19jb3VudCA9IDk7CisgICAgICAgIHRoaXMtPmJ1cnN0X3Byb2ZpbGUuYXJyWzFdLnByZWFtYmxlX3BhdHRlcm5faGlnaCA9IDI4NjMzMTE1MzBVTDsKKyAgICAgICAgdGhpcy0+YnVyc3RfcHJvZmlsZS5hcnJbMV0ucHJlYW1ibGVfcGF0dGVybl9sb3cgPSAyODYzMzExNTMwVUw7CisgICAgICAgIHRoaXMtPmJ1cnN0X3Byb2ZpbGUuYXJyWzFdLnBvbl90YWcgPSAwOworICAgICAgICB0aGlzLT5idXJzdF9wcm9maWxlLmFyclsxXS5udW1fb2ZfZ3VhcmRfYnl0ZXMgPSAxNjsKKyAgICAgICAgdGhpcy0+YnVyc3RfcHJvZmlsZS5hcnJbMV0uaXNfcHJvZmlsZV92YWxpZCA9IEJDTU9TX1RSVUU7CisgICAgICAgIHRoaXMtPmJ1cnN0X3Byb2ZpbGUuYXJyWzFdLmJ1cnN0X292ZXJoZWFkX3NpemVfaW5fd29yZHMgPSA1NjsKKyAgICAgICAgdGhpcy0+YnVyc3RfcHJvZmlsZS5hcnJbMl0ucHJvZmlsZV92ZXJzaW9uID0gMDsKKyAgICAgICAgdGhpcy0+YnVyc3RfcHJvZmlsZS5hcnJbMl0uaXNfZmVjX29uID0gQkNNT1NfVFJVRTsKKyAgICAgICAgdGhpcy0+YnVyc3RfcHJvZmlsZS5hcnJbMl0uZGVsaW1pdGVyX3NpemVfaW5fYnl0ZXMgPSA4OworICAgICAgICB0aGlzLT5idXJzdF9wcm9maWxlLmFyclsyXS5kZWxpbWl0ZXJfcGF0dGVybl9oaWdoID0gMzAxNTU2MjAwMFVMOworICAgICAgICB0aGlzLT5idXJzdF9wcm9maWxlLmFyclsyXS5kZWxpbWl0ZXJfcGF0dGVybl9sb3cgPSAyOTk5MjU5MDQxVUw7CisgICAgICAgIHRoaXMtPmJ1cnN0X3Byb2ZpbGUuYXJyWzJdLnByZWFtYmxlX2xlbmd0aF9pbl9ieXRlcyA9IDg7CisgICAgICAgIHRoaXMtPmJ1cnN0X3Byb2ZpbGUuYXJyWzJdLnByZWFtYmxlX3JlcGVhdHNfY291bnQgPSAyMDsKKyAgICAgICAgdGhpcy0+YnVyc3RfcHJvZmlsZS5hcnJbMl0ucHJlYW1ibGVfcGF0dGVybl9oaWdoID0gMjg2MzMxMTUzMFVMOworICAgICAgICB0aGlzLT5idXJzdF9wcm9maWxlLmFyclsyXS5wcmVhbWJsZV9wYXR0ZXJuX2xvdyA9IDI4NjMzMTE1MzBVTDsKKyAgICAgICAgdGhpcy0+YnVyc3RfcHJvZmlsZS5hcnJbMl0ucG9uX3RhZyA9IDA7CisgICAgICAgIHRoaXMtPmJ1cnN0X3Byb2ZpbGUuYXJyWzJdLm51bV9vZl9ndWFyZF9ieXRlcyA9IDE2OworICAgICAgICB0aGlzLT5idXJzdF9wcm9maWxlLmFyclsyXS5pc19wcm9maWxlX3ZhbGlkID0gQkNNT1NfVFJVRTsKKyAgICAgICAgdGhpcy0+YnVyc3RfcHJvZmlsZS5hcnJbMl0uYnVyc3Rfb3ZlcmhlYWRfc2l6ZV9pbl93b3JkcyA9IDc4OworICAgICAgICB0aGlzLT5idXJzdF9wcm9maWxlLmFyclszXS5wcm9maWxlX3ZlcnNpb24gPSAwOworICAgICAgICB0aGlzLT5idXJzdF9wcm9maWxlLmFyclszXS5pc19mZWNfb24gPSBCQ01PU19UUlVFOworICAgICAgICB0aGlzLT5idXJzdF9wcm9maWxlLmFyclszXS5kZWxpbWl0ZXJfc2l6ZV9pbl9ieXRlcyA9IDg7CisgICAgICAgIHRoaXMtPmJ1cnN0X3Byb2ZpbGUuYXJyWzNdLmRlbGltaXRlcl9wYXR0ZXJuX2hpZ2ggPSAzMDE1NTYyMDAwVUw7CisgICAgICAgIHRoaXMtPmJ1cnN0X3Byb2ZpbGUuYXJyWzNdLmRlbGltaXRlcl9wYXR0ZXJuX2xvdyA9IDI5OTkyNTkwNDFVTDsKKyAgICAgICAgdGhpcy0+YnVyc3RfcHJvZmlsZS5hcnJbM10ucHJlYW1ibGVfbGVuZ3RoX2luX2J5dGVzID0gODsKKyAgICAgICAgdGhpcy0+YnVyc3RfcHJvZmlsZS5hcnJbM10ucHJlYW1ibGVfcmVwZWF0c19jb3VudCA9IDk7CisgICAgICAgIHRoaXMtPmJ1cnN0X3Byb2ZpbGUuYXJyWzNdLnByZWFtYmxlX3BhdHRlcm5faGlnaCA9IDI4NjMzMTE1MzBVTDsKKyAgICAgICAgdGhpcy0+YnVyc3RfcHJvZmlsZS5hcnJbM10ucHJlYW1ibGVfcGF0dGVybl9sb3cgPSAyODYzMzExNTMwVUw7CisgICAgICAgIHRoaXMtPmJ1cnN0X3Byb2ZpbGUuYXJyWzNdLnBvbl90YWcgPSAwOworICAgICAgICB0aGlzLT5idXJzdF9wcm9maWxlLmFyclszXS5udW1fb2ZfZ3VhcmRfYnl0ZXMgPSAxNjsKKyAgICAgICAgdGhpcy0+YnVyc3RfcHJvZmlsZS5hcnJbM10uaXNfcHJvZmlsZV92YWxpZCA9IEJDTU9TX1RSVUU7CisgICAgICAgIHRoaXMtPmJ1cnN0X3Byb2ZpbGUuYXJyWzNdLmJ1cnN0X292ZXJoZWFkX3NpemVfaW5fd29yZHMgPSA1NjsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfVFJBTlNDRUlWRVJfQ09ORklHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnRyYW5zY2VpdmVyX2NvbmZpZy5hcnJbMF0udHJ4X3Jlc2V0X3BhdHRlcm5fZmlyc3QgPSAwOworICAgICAgICB0aGlzLT50cmFuc2NlaXZlcl9jb25maWcuYXJyWzBdLnRyeF9yZXNldF9wYXR0ZXJuX21pZGRsZSA9IDQyOTQ5NjcyOTVVTDsKKyAgICAgICAgdGhpcy0+dHJhbnNjZWl2ZXJfY29uZmlnLmFyclswXS50cnhfcmVzZXRfcGF0dGVybl9sYXN0ID0gMDsKKyAgICAgICAgdGhpcy0+dHJhbnNjZWl2ZXJfY29uZmlnLmFyclswXS50cnhfcmVzZXRfbWlkZGxlX3JlcGVhdHNfY291bnQgPSA0OworICAgICAgICB0aGlzLT50cmFuc2NlaXZlcl9jb25maWcuYXJyWzBdLnRyeF9yZXNldF9sb2NhdGlvbiA9IDA7CisgICAgICAgIHRoaXMtPnRyYW5zY2VpdmVyX2NvbmZpZy5hcnJbMF0udHJ4X3Jlc2V0X3BvbGFyaXR5ID0gQkNNT1NfRkFMU0U7CisgICAgICAgIHRoaXMtPnRyYW5zY2VpdmVyX2NvbmZpZy5hcnJbMF0uYmNkcl9yZXNldF9wYXR0ZXJuX2ZpcnN0ID0gMDsKKyAgICAgICAgdGhpcy0+dHJhbnNjZWl2ZXJfY29uZmlnLmFyclswXS5iY2RyX3Jlc2V0X3BhdHRlcm5fbWlkZGxlID0gMjU1OworICAgICAgICB0aGlzLT50cmFuc2NlaXZlcl9jb25maWcuYXJyWzBdLmJjZHJfcmVzZXRfcGF0dGVybl9sYXN0ID0gMDsKKyAgICAgICAgdGhpcy0+dHJhbnNjZWl2ZXJfY29uZmlnLmFyclswXS5iY2RyX3Jlc2V0X21pZGRsZV9yZXBlYXRzX2NvdW50ID0gMTsKKyAgICAgICAgdGhpcy0+dHJhbnNjZWl2ZXJfY29uZmlnLmFyclswXS5iY2RyX3Jlc2V0X2xvY2F0aW9uID0gMjA7CisgICAgICAgIHRoaXMtPnRyYW5zY2VpdmVyX2NvbmZpZy5hcnJbMF0uYmNkcl9yZXNldF9wb2xhcml0eSA9IEJDTU9TX0ZBTFNFOworICAgICAgICB0aGlzLT50cmFuc2NlaXZlcl9jb25maWcuYXJyWzFdLnRyeF9yZXNldF9wYXR0ZXJuX2ZpcnN0ID0gMDsKKyAgICAgICAgdGhpcy0+dHJhbnNjZWl2ZXJfY29uZmlnLmFyclsxXS50cnhfcmVzZXRfcGF0dGVybl9taWRkbGUgPSA0Mjk0OTY3Mjk1VUw7CisgICAgICAgIHRoaXMtPnRyYW5zY2VpdmVyX2NvbmZpZy5hcnJbMV0udHJ4X3Jlc2V0X3BhdHRlcm5fbGFzdCA9IDA7CisgICAgICAgIHRoaXMtPnRyYW5zY2VpdmVyX2NvbmZpZy5hcnJbMV0udHJ4X3Jlc2V0X21pZGRsZV9yZXBlYXRzX2NvdW50ID0gNDsKKyAgICAgICAgdGhpcy0+dHJhbnNjZWl2ZXJfY29uZmlnLmFyclsxXS50cnhfcmVzZXRfbG9jYXRpb24gPSAzMzsKKyAgICAgICAgdGhpcy0+dHJhbnNjZWl2ZXJfY29uZmlnLmFyclsxXS50cnhfcmVzZXRfcG9sYXJpdHkgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgdGhpcy0+dHJhbnNjZWl2ZXJfY29uZmlnLmFyclsxXS5iY2RyX3Jlc2V0X3BhdHRlcm5fZmlyc3QgPSAwOworICAgICAgICB0aGlzLT50cmFuc2NlaXZlcl9jb25maWcuYXJyWzFdLmJjZHJfcmVzZXRfcGF0dGVybl9taWRkbGUgPSAyNTU7CisgICAgICAgIHRoaXMtPnRyYW5zY2VpdmVyX2NvbmZpZy5hcnJbMV0uYmNkcl9yZXNldF9wYXR0ZXJuX2xhc3QgPSAwOworICAgICAgICB0aGlzLT50cmFuc2NlaXZlcl9jb25maWcuYXJyWzFdLmJjZHJfcmVzZXRfbWlkZGxlX3JlcGVhdHNfY291bnQgPSAxOworICAgICAgICB0aGlzLT50cmFuc2NlaXZlcl9jb25maWcuYXJyWzFdLmJjZHJfcmVzZXRfbG9jYXRpb24gPSAyMzsKKyAgICAgICAgdGhpcy0+dHJhbnNjZWl2ZXJfY29uZmlnLmFyclsxXS5iY2RyX3Jlc2V0X3BvbGFyaXR5ID0gQkNNT1NfRkFMU0U7CisgICAgICAgIHRoaXMtPnRyYW5zY2VpdmVyX2NvbmZpZy5hcnJbMl0udHJ4X3Jlc2V0X3BhdHRlcm5fZmlyc3QgPSAwOworICAgICAgICB0aGlzLT50cmFuc2NlaXZlcl9jb25maWcuYXJyWzJdLnRyeF9yZXNldF9wYXR0ZXJuX21pZGRsZSA9IDQyOTQ5NjcyOTVVTDsKKyAgICAgICAgdGhpcy0+dHJhbnNjZWl2ZXJfY29uZmlnLmFyclsyXS50cnhfcmVzZXRfcGF0dGVybl9sYXN0ID0gMDsKKyAgICAgICAgdGhpcy0+dHJhbnNjZWl2ZXJfY29uZmlnLmFyclsyXS50cnhfcmVzZXRfbWlkZGxlX3JlcGVhdHNfY291bnQgPSA0OworICAgICAgICB0aGlzLT50cmFuc2NlaXZlcl9jb25maWcuYXJyWzJdLnRyeF9yZXNldF9sb2NhdGlvbiA9IDA7CisgICAgICAgIHRoaXMtPnRyYW5zY2VpdmVyX2NvbmZpZy5hcnJbMl0udHJ4X3Jlc2V0X3BvbGFyaXR5ID0gQkNNT1NfRkFMU0U7CisgICAgICAgIHRoaXMtPnRyYW5zY2VpdmVyX2NvbmZpZy5hcnJbMl0uYmNkcl9yZXNldF9wYXR0ZXJuX2ZpcnN0ID0gMDsKKyAgICAgICAgdGhpcy0+dHJhbnNjZWl2ZXJfY29uZmlnLmFyclsyXS5iY2RyX3Jlc2V0X3BhdHRlcm5fbWlkZGxlID0gMjU1OworICAgICAgICB0aGlzLT50cmFuc2NlaXZlcl9jb25maWcuYXJyWzJdLmJjZHJfcmVzZXRfcGF0dGVybl9sYXN0ID0gMDsKKyAgICAgICAgdGhpcy0+dHJhbnNjZWl2ZXJfY29uZmlnLmFyclsyXS5iY2RyX3Jlc2V0X21pZGRsZV9yZXBlYXRzX2NvdW50ID0gMTsKKyAgICAgICAgdGhpcy0+dHJhbnNjZWl2ZXJfY29uZmlnLmFyclsyXS5iY2RyX3Jlc2V0X2xvY2F0aW9uID0gMjA7CisgICAgICAgIHRoaXMtPnRyYW5zY2VpdmVyX2NvbmZpZy5hcnJbMl0uYmNkcl9yZXNldF9wb2xhcml0eSA9IEJDTU9TX0ZBTFNFOworICAgICAgICB0aGlzLT50cmFuc2NlaXZlcl9jb25maWcuYXJyWzNdLnRyeF9yZXNldF9wYXR0ZXJuX2ZpcnN0ID0gMDsKKyAgICAgICAgdGhpcy0+dHJhbnNjZWl2ZXJfY29uZmlnLmFyclszXS50cnhfcmVzZXRfcGF0dGVybl9taWRkbGUgPSA0Mjk0OTY3Mjk1VUw7CisgICAgICAgIHRoaXMtPnRyYW5zY2VpdmVyX2NvbmZpZy5hcnJbM10udHJ4X3Jlc2V0X3BhdHRlcm5fbGFzdCA9IDA7CisgICAgICAgIHRoaXMtPnRyYW5zY2VpdmVyX2NvbmZpZy5hcnJbM10udHJ4X3Jlc2V0X21pZGRsZV9yZXBlYXRzX2NvdW50ID0gNDsKKyAgICAgICAgdGhpcy0+dHJhbnNjZWl2ZXJfY29uZmlnLmFyclszXS50cnhfcmVzZXRfbG9jYXRpb24gPSAzMzsKKyAgICAgICAgdGhpcy0+dHJhbnNjZWl2ZXJfY29uZmlnLmFyclszXS50cnhfcmVzZXRfcG9sYXJpdHkgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgdGhpcy0+dHJhbnNjZWl2ZXJfY29uZmlnLmFyclszXS5iY2RyX3Jlc2V0X3BhdHRlcm5fZmlyc3QgPSAwOworICAgICAgICB0aGlzLT50cmFuc2NlaXZlcl9jb25maWcuYXJyWzNdLmJjZHJfcmVzZXRfcGF0dGVybl9taWRkbGUgPSAyNTU7CisgICAgICAgIHRoaXMtPnRyYW5zY2VpdmVyX2NvbmZpZy5hcnJbM10uYmNkcl9yZXNldF9wYXR0ZXJuX2xhc3QgPSAwOworICAgICAgICB0aGlzLT50cmFuc2NlaXZlcl9jb25maWcuYXJyWzNdLmJjZHJfcmVzZXRfbWlkZGxlX3JlcGVhdHNfY291bnQgPSAxOworICAgICAgICB0aGlzLT50cmFuc2NlaXZlcl9jb25maWcuYXJyWzNdLmJjZHJfcmVzZXRfbG9jYXRpb24gPSAyMzsKKyAgICAgICAgdGhpcy0+dHJhbnNjZWl2ZXJfY29uZmlnLmFyclszXS5iY2RyX3Jlc2V0X3BvbGFyaXR5ID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1RSQU5TQ0VJVkVSX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHJhbnNjZWl2ZXJfdHlwZSA9IEJDTU9MVF9YR1BPTl9UUlhfVFlQRV9MVEhfNzIyMl9QQzsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfREVCVUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+ZGVidWcucnhfcmV2ZXJzZWRfcG9sYXJpdHkgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOworICAgICAgICB0aGlzLT5kZWJ1Zy5uZWdfb3V0X2JpdCA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1JTU0lfTk9STUFMX0NPTkZJRykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yc3NpX25vcm1hbF9jb25maWcucG9sYXJpdHkgPSBCQ01PTFRfUE9MQVJJVFlfTE9XOworICAgICAgICB0aGlzLT5yc3NpX25vcm1hbF9jb25maWcubG9jYXRpb24gPSAzNTsKKyAgICAgICAgdGhpcy0+cnNzaV9ub3JtYWxfY29uZmlnLmxvY2F0aW9uX3NpZ24gPSBCQ01PTFRfU0lHTl9QT1NJVElWRTsKKyAgICAgICAgdGhpcy0+cnNzaV9ub3JtYWxfY29uZmlnLnB1bHNlX3dpZHRoID0gODA7CisgICAgICAgIHRoaXMtPnJzc2lfbm9ybWFsX2NvbmZpZy5taW5pbXVtX2J1cnN0ID0gMjAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SU1NJX1JBTkdJTkdfQ09ORklHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJzc2lfcmFuZ2luZ19jb25maWcuc3RhcnRfb25fZWQgPSBCQ01PU19UUlVFOworICAgICAgICB0aGlzLT5yc3NpX3JhbmdpbmdfY29uZmlnLmZyYW1lX2RlbGF5ID0gMDsKKyAgICAgICAgdGhpcy0+cnNzaV9yYW5naW5nX2NvbmZpZy53b3JkX2RlbGF5ID0gMjA7CisgICAgICAgIHRoaXMtPnJzc2lfcmFuZ2luZ19jb25maWcuZnJhbWVfZGVsYXlfYWZ0ZXJfZWQgPSAwOworICAgICAgICB0aGlzLT5yc3NpX3JhbmdpbmdfY29uZmlnLndvcmRfZGVsYXlfYWZ0ZXJfZWQgPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9TRVJERVNfQ09ORklHVVJBVElPTikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5zZXJkZXNfY29uZmlndXJhdGlvbi5tdWx0aV9lZF9tb2RlID0gQkNNT1NfRkFMU0U7CisgICAgICAgIHRoaXMtPnNlcmRlc19jb25maWd1cmF0aW9uLnJhbmdpbmdfbW9kZSA9IEJDTU9MVF9YR1BPTl9TRVJERVNfUkFOR0lOR19NT0RFX0JDRFI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0JVUlNUX1BST0ZJTEVfREVMSU1JVEVSX01BWF9FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+YnVyc3RfcHJvZmlsZV9kZWxpbWl0ZXJfbWF4X2Vycm9ycy5hcnJbMF0gPSA3OworICAgICAgICB0aGlzLT5idXJzdF9wcm9maWxlX2RlbGltaXRlcl9tYXhfZXJyb3JzLmFyclsxXSA9IDc7CisgICAgICAgIHRoaXMtPmJ1cnN0X3Byb2ZpbGVfZGVsaW1pdGVyX21heF9lcnJvcnMuYXJyWzJdID0gNzsKKyAgICAgICAgdGhpcy0+YnVyc3RfcHJvZmlsZV9kZWxpbWl0ZXJfbWF4X2Vycm9ycy5hcnJbM10gPSA3OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SQU5HSU5HX1NNX1BBVFRFUk5TX0FUX0lOSVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LnRyeF9yZXNldF9wYXR0ZXJuX2ZpcnN0ID0gNDI5NDk2NzI5NVVMOworICAgICAgICB0aGlzLT5yYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQudHJ4X3Jlc2V0X3BhdHRlcm5fbWlkZGxlID0gNDI5NDk2NzI5NVVMOworICAgICAgICB0aGlzLT5yYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQudHJ4X3Jlc2V0X3BhdHRlcm5fbGFzdCA9IDQyOTQ5NjcyOTVVTDsKKyAgICAgICAgdGhpcy0+cmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LnRyeF9yZXNldF9taWRkbGVfcmVwZWF0cyA9IDg7CisgICAgICAgIHRoaXMtPnJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC50cnhfcmVzZXRfbG9jYXRpb24gPSAyOworICAgICAgICB0aGlzLT5yYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQuYmNkcl9yZXNldF9wYXR0ZXJuX2ZpcnN0ID0gNDI5NDk2NzI5NVVMOworICAgICAgICB0aGlzLT5yYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQuYmNkcl9yZXNldF9wYXR0ZXJuX21pZGRsZSA9IDQyOTQ5NjcyOTVVTDsKKyAgICAgICAgdGhpcy0+cmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LmJjZHJfcmVzZXRfcGF0dGVybl9sYXN0ID0gNDI5NDk2NzI5NVVMOworICAgICAgICB0aGlzLT5yYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQuYmNkcl9yZXNldF9taWRkbGVfcmVwZWF0cyA9IDQ7CisgICAgICAgIHRoaXMtPnJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC5iY2RyX3Jlc2V0X2xvY2F0aW9uID0gMjsKKyAgICAgICAgdGhpcy0+cmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LmJjZHJfcmVzZXRfcG9sYXJpdHkgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUkFOR0lOR19TTV9QQVRURVJOU19FRF9GQUlMVVJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS50cnhfcmVzZXRfcGF0dGVybl9maXJzdCA9IDA7CisgICAgICAgIHRoaXMtPnJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS50cnhfcmVzZXRfcGF0dGVybl9taWRkbGUgPSAwOworICAgICAgICB0aGlzLT5yYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUudHJ4X3Jlc2V0X3BhdHRlcm5fbGFzdCA9IDA7CisgICAgICAgIHRoaXMtPnJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS50cnhfcmVzZXRfbWlkZGxlX3JlcGVhdHMgPSAwOworICAgICAgICB0aGlzLT5yYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUudHJ4X3Jlc2V0X2xvY2F0aW9uID0gMDsKKyAgICAgICAgdGhpcy0+cmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLmJjZHJfcmVzZXRfcGF0dGVybl9maXJzdCA9IDA7CisgICAgICAgIHRoaXMtPnJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS5iY2RyX3Jlc2V0X3BhdHRlcm5fbWlkZGxlID0gMDsKKyAgICAgICAgdGhpcy0+cmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLmJjZHJfcmVzZXRfcGF0dGVybl9sYXN0ID0gMDsKKyAgICAgICAgdGhpcy0+cmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLmJjZHJfcmVzZXRfbWlkZGxlX3JlcGVhdHMgPSAwOworICAgICAgICB0aGlzLT5yYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUuYmNkcl9yZXNldF9sb2NhdGlvbiA9IDA7CisgICAgICAgIHRoaXMtPnJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS5iY2RyX3Jlc2V0X3BvbGFyaXR5ID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1JFU0VUX09OX0RFTF9NSVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJlc2V0X29uX2RlbF9taXNzID0gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0VEX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmVkX3N0YXRlLnJlc2V0X29uX2VkX2ZhaWwgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgdGhpcy0+ZWRfc3RhdGUucmVzZXRfb25fZWRfc3VjY2VzcyA9IEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0lOVkVSVF9FRCkpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5pbnZlcnRfZWQgPSBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfRU5EX09GX0JVUlNUX1JFU0VUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmVuZF9vZl9idXJzdF9yZXNldCA9IEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9UUlhfUlNUX1BPTEFSSVRZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnRyeF9yc3RfcG9sYXJpdHkgPSBCQ01PU19GQUxTRTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9CVVJTVF9QUk9GSUxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl94Z3Bvbl9idXJzdF9wcm9maWxlXzRfcGFjaygmdGhpcy0+YnVyc3RfcHJvZmlsZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1RSQU5TQ0VJVkVSX0NPTkZJRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb25fNF9wYWNrKCZ0aGlzLT50cmFuc2NlaXZlcl9jb25maWcsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9UUkFOU0NFSVZFUl9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX3RyeF90eXBlX3BhY2sodGhpcy0+dHJhbnNjZWl2ZXJfdHlwZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0RFQlVHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX3RyeF9kZWJ1Z19wYWNrKCZ0aGlzLT5kZWJ1ZywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1JTU0lfTk9STUFMX0NPTkZJRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWdfcGFjaygmdGhpcy0+cnNzaV9ub3JtYWxfY29uZmlnLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUlNTSV9SQU5HSU5HX0NPTkZJRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9yc3NpX3JhbmdpbmdfY29uZmlnX3BhY2soJnRoaXMtPnJzc2lfcmFuZ2luZ19jb25maWcsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9TRVJERVNfQ09ORklHVVJBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9zZXJkZXNfY29uZmlndXJhdGlvbl9wYWNrKCZ0aGlzLT5zZXJkZXNfY29uZmlndXJhdGlvbiwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0JVUlNUX1BST0ZJTEVfREVMSU1JVEVSX01BWF9FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXJyX3U4XzRfcGFjaygmdGhpcy0+YnVyc3RfcHJvZmlsZV9kZWxpbWl0ZXJfbWF4X2Vycm9ycywgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1JBTkdJTkdfU01fUEFUVEVSTlNfQVRfSU5JVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm5fcGFjaygmdGhpcy0+cmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUkFOR0lOR19TTV9QQVRURVJOU19FRF9GQUlMVVJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX3J4X3Jhbmdpbmdfc21fcGF0dGVybl9wYWNrKCZ0aGlzLT5yYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SRVNFVF9PTl9ERUxfTUlTUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnJlc2V0X29uX2RlbF9taXNzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0VEX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX2VkX3N0YXRlX3BhY2soJnRoaXMtPmVkX3N0YXRlLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfSU5WRVJUX0VEKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+aW52ZXJ0X2VkKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0VORF9PRl9CVVJTVF9SRVNFVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmVuZF9vZl9idXJzdF9yZXNldCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9UUlhfUlNUX1BPTEFSSVRZKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dHJ4X3JzdF9wb2xhcml0eSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0JVUlNUX1BST0ZJTEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTUyOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9UUkFOU0NFSVZFUl9DT05GSUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTI0OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9UUkFOU0NFSVZFUl9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0RFQlVHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1JTU0lfTk9STUFMX0NPTkZJRykpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSA3OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SU1NJX1JBTkdJTkdfQ09ORklHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDc7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1NFUkRFU19DT05GSUdVUkFUSU9OKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0JVUlNUX1BST0ZJTEVfREVMSU1JVEVSX01BWF9FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUkFOR0lOR19TTV9QQVRURVJOU19BVF9JTklUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI5OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SQU5HSU5HX1NNX1BBVFRFUk5TX0VEX0ZBSUxVUkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMjk7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1JFU0VUX09OX0RFTF9NSVNTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0VEX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDI7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0lOVkVSVF9FRCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9FTkRfT0ZfQlVSU1RfUkVTRVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfVFJYX1JTVF9QT0xBUklUWSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfQlVSU1RfUFJPRklMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfeGdwb25fYnVyc3RfcHJvZmlsZV80X3VucGFjaygmdGhpcy0+YnVyc3RfcHJvZmlsZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfVFJBTlNDRUlWRVJfQ09ORklHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl80X3VucGFjaygmdGhpcy0+dHJhbnNjZWl2ZXJfY29uZmlnLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9UUkFOU0NFSVZFUl9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX3RyeF90eXBlX3VucGFjaygmdGhpcy0+dHJhbnNjZWl2ZXJfdHlwZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0RFQlVHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX3RyeF9kZWJ1Z191bnBhY2soJnRoaXMtPmRlYnVnLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SU1NJX05PUk1BTF9DT05GSUcpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fcnNzaV9ub3JtYWxfY29uZmlnX3VucGFjaygmdGhpcy0+cnNzaV9ub3JtYWxfY29uZmlnLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SU1NJX1JBTkdJTkdfQ09ORklHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX3Jzc2lfcmFuZ2luZ19jb25maWdfdW5wYWNrKCZ0aGlzLT5yc3NpX3JhbmdpbmdfY29uZmlnLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9TRVJERVNfQ09ORklHVVJBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9zZXJkZXNfY29uZmlndXJhdGlvbl91bnBhY2soJnRoaXMtPnNlcmRlc19jb25maWd1cmF0aW9uLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9CVVJTVF9QUk9GSUxFX0RFTElNSVRFUl9NQVhfRVJST1JTKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl91OF80X3VucGFjaygmdGhpcy0+YnVyc3RfcHJvZmlsZV9kZWxpbWl0ZXJfbWF4X2Vycm9ycywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUkFOR0lOR19TTV9QQVRURVJOU19BVF9JTklUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX3J4X3Jhbmdpbmdfc21fcGF0dGVybl91bnBhY2soJnRoaXMtPnJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUkFOR0lOR19TTV9QQVRURVJOU19FRF9GQUlMVVJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X3hncG9uX3J4X3Jhbmdpbmdfc21fcGF0dGVybl91bnBhY2soJnRoaXMtPnJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUkVTRVRfT05fREVMX01JU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5yZXNldF9vbl9kZWxfbWlzcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9FRF9TVEFURSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9lZF9zdGF0ZV91bnBhY2soJnRoaXMtPmVkX3N0YXRlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9JTlZFUlRfRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5pbnZlcnRfZWQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfRU5EX09GX0JVUlNUX1JFU0VUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+ZW5kX29mX2J1cnN0X3Jlc2V0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1RSWF9SU1RfUE9MQVJJVFkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT50cnhfcnN0X3BvbGFyaXR5KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9CVVJTVF9QUk9GSUxFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMTUyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1RSQU5TQ0VJVkVSX0NPTkZJRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEyNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9UUkFOU0NFSVZFUl9UWVBFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9ERUJVRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUlNTSV9OT1JNQUxfQ09ORklHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SU1NJX1JBTkdJTkdfQ09ORklHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgNykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9TRVJERVNfQ09ORklHVVJBVElPTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfQlVSU1RfUFJPRklMRV9ERUxJTUlURVJfTUFYX0VSUk9SUykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUkFOR0lOR19TTV9QQVRURVJOU19BVF9JTklUKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMjkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUkFOR0lOR19TTV9QQVRURVJOU19FRF9GQUlMVVJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMjkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUkVTRVRfT05fREVMX01JU1MpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0VEX1NUQVRFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9JTlZFUlRfRUQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0VORF9PRl9CVVJTVF9SRVNFVCkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfVFJYX1JTVF9QT0xBUklUWSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfQlVSU1RfUFJPRklMRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9hcnJfeGdwb25fYnVyc3RfcHJvZmlsZV80X2JvdW5kc19jaGVjaygmdGhpcy0+YnVyc3RfcHJvZmlsZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0JVUlNUX1BST0ZJTEU7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfVFJBTlNDRUlWRVJfQ09ORklHKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Fycl94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl80X2JvdW5kc19jaGVjaygmdGhpcy0+dHJhbnNjZWl2ZXJfY29uZmlnKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfVFJBTlNDRUlWRVJfQ09ORklHOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1RSQU5TQ0VJVkVSX1RZUEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0aGlzLT50cmFuc2NlaXZlcl90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9UUlhfVFlQRV9MVEhfNzIyMl9QQzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX1RSWF9UWVBFX1VTRVJfREVGSU5FRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX1RSWF9UWVBFX1dURF9SVFhNMjY2XzcwMjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX1RSWF9UWVBFX0xUSF83MjIyX0JDX1BMVVM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9UUlhfVFlQRV9MVEhfNzIyNl9QQzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX1RSWF9UWVBFX0xUSF81MzAyX1BDOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fVFJYX1RZUEVfWEdQT05fR0VORVJBTF8xOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fVFJYX1RZUEVfWEdQT05fR0VORVJBTF8yOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fVFJYX1RZUEVfTFRXXzYyN19YX1BDOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fVFJYX1RZUEVfWFBQX1hFX1JfM19DREZCOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9UUkFOU0NFSVZFUl9UWVBFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9ERUJVRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl90cnhfZGVidWdfYm91bmRzX2NoZWNrKCZ0aGlzLT5kZWJ1ZykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0RFQlVHOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1JTU0lfTk9STUFMX0NPTkZJRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWdfYm91bmRzX2NoZWNrKCZ0aGlzLT5yc3NpX25vcm1hbF9jb25maWcpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SU1NJX05PUk1BTF9DT05GSUc7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUlNTSV9SQU5HSU5HX0NPTkZJRykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9yc3NpX3JhbmdpbmdfY29uZmlnX2JvdW5kc19jaGVjaygmdGhpcy0+cnNzaV9yYW5naW5nX2NvbmZpZykpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1JTU0lfUkFOR0lOR19DT05GSUc7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfU0VSREVTX0NPTkZJR1VSQVRJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fc2VyZGVzX2NvbmZpZ3VyYXRpb25fYm91bmRzX2NoZWNrKCZ0aGlzLT5zZXJkZXNfY29uZmlndXJhdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1NFUkRFU19DT05GSUdVUkFUSU9OOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0JVUlNUX1BST0ZJTEVfREVMSU1JVEVSX01BWF9FUlJPUlMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYXJyX3U4XzRfYm91bmRzX2NoZWNrKCZ0aGlzLT5idXJzdF9wcm9maWxlX2RlbGltaXRlcl9tYXhfZXJyb3JzKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfQlVSU1RfUFJPRklMRV9ERUxJTUlURVJfTUFYX0VSUk9SUzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SQU5HSU5HX1NNX1BBVFRFUk5TX0FUX0lOSVQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuX2JvdW5kc19jaGVjaygmdGhpcy0+cmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0KSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUkFOR0lOR19TTV9QQVRURVJOU19BVF9JTklUOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1JBTkdJTkdfU01fUEFUVEVSTlNfRURfRkFJTFVSRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm5fYm91bmRzX2NoZWNrKCZ0aGlzLT5yYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUpKQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SQU5HSU5HX1NNX1BBVFRFUk5TX0VEX0ZBSUxVUkU7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfRURfU1RBVEUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfeGdwb25fZWRfc3RhdGVfYm91bmRzX2NoZWNrKCZ0aGlzLT5lZF9zdGF0ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0VEX1NUQVRFOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGJjbW9sdF94cG9uX3NlcmRlc19rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X3hwb25fc2VyZGVzX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnBvbl9uaSA9IChiY21vbHRfcG9uX25pKSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfS0VZX0lEX0lOU1RBTkNFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPmluc3RhbmNlID0gQkNNT0xUX1NFUkRFU19JTlNUQU5DRV9JTlNUQU5DRV8wOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hwb25fc2VyZGVzX2tleV9wYWNrKGNvbnN0IGJjbW9sdF94cG9uX3NlcmRlc19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19LRVlfSURfUE9OX05JKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzLT5wb25fbmkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0tFWV9JRF9JTlNUQU5DRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9zZXJkZXNfaW5zdGFuY2VfcGFjayh0aGlzLT5pbnN0YW5jZSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeHBvbl9zZXJkZXNfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94cG9uX3NlcmRlc19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0tFWV9JRF9JTlNUQU5DRSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hwb25fc2VyZGVzX2tleV91bnBhY2soYmNtb2x0X3hwb25fc2VyZGVzX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAodWludDhfdCAqKSAmdGhpcy0+cG9uX25pKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19LRVlfSURfSU5TVEFOQ0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfc2VyZGVzX2luc3RhbmNlX3VucGFjaygmdGhpcy0+aW5zdGFuY2UsIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeHBvbl9zZXJkZXNfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19LRVlfSURfSU5TVEFOQ0UpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94cG9uX3NlcmRlc19rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94cG9uX3NlcmRlc19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeHBvbl9zZXJkZXNfa2V5X2lkICpmYWlsZWRfcHJvcCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0tFWV9JRF9QT05fTkkpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnBvbl9uaSA+IChiY21vbHRfcG9uX25pKSAxNSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hQT05fU0VSREVTX0tFWV9JRF9QT05fTkk7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0tFWV9JRF9JTlNUQU5DRSkpICE9IDApCisgICAgeworICAgICAgICBzd2l0Y2ggKHRoaXMtPmluc3RhbmNlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9TRVJERVNfSU5TVEFOQ0VfSU5TVEFOQ0VfMDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NFUkRFU19JTlNUQU5DRV9JTlNUQU5DRV8xOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWFBPTl9TRVJERVNfS0VZX0lEX0lOU1RBTkNFOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9WR0EpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfdmdhID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9QRikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9wZiA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfTEZQRikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9sZnBmID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkUxKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2RmZTEgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfZGZlMiA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFMykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT5yeF9kZmUzID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkU0KSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnJ4X2RmZTQgPSAwOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+cnhfZGZlNSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfUFJFKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X3ByZSA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfTUFJTikpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9tYWluID0gNDM7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfUE9TVDEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgdGhpcy0+dHhfcG9zdDEgPSA1OworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QyKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X3Bvc3QyID0gMDsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9QT1NUMykpICE9IDApCisgICAgeworICAgICAgICB0aGlzLT50eF9wb3N0MyA9IDA7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfQU1QKSkgIT0gMCkKKyAgICB7CisgICAgICAgIHRoaXMtPnR4X2FtcCA9IDEyOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX1ZHQSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5yeF92Z2EpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9QRikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5yeF9wZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0xGUEYpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cnhfbGZwZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cnhfZGZlMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3M4KGJ1ZiwgdGhpcy0+cnhfZGZlMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3M4KGJ1ZiwgdGhpcy0+cnhfZGZlMykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3M4KGJ1ZiwgdGhpcy0+cnhfZGZlNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3M4KGJ1ZiwgdGhpcy0+cnhfZGZlNSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX1BSRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT50eF9wcmUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9NQUlOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnR4X21haW4pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9QT1NUMSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT50eF9wb3N0MSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QyKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV9zOChidWYsIHRoaXMtPnR4X3Bvc3QyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfUE9TVDMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3M4KGJ1ZiwgdGhpcy0+dHhfcG9zdDMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9BTVApKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dHhfYW1wKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfVkdBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfUEYpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9MRlBGKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFMSkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkUzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFNCkpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9QUkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9NQUlOKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfUE9TVDEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9QT1NUMikpICE9IDApCisgICAgeworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfQU1QKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCkKK3sKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9WR0EpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+cnhfdmdhKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfUEYpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+cnhfcGYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9MRlBGKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnJ4X2xmcGYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkUxKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnJ4X2RmZTEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkUyKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3M4KGJ1ZiwgJnRoaXMtPnJ4X2RmZTIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkUzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3M4KGJ1ZiwgJnRoaXMtPnJ4X2RmZTMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkU0KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3M4KGJ1ZiwgJnRoaXMtPnJ4X2RmZTQpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkU1KSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3M4KGJ1ZiwgJnRoaXMtPnJ4X2RmZTUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9QUkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dHhfcHJlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfTUFJTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0aGlzLT50eF9tYWluKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfUE9TVDEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dHhfcG9zdDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9QT1NUMikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF9zOChidWYsICZ0aGlzLT50eF9wb3N0MikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3M4KGJ1ZiwgJnRoaXMtPnR4X3Bvc3QzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfQU1QKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnR4X2FtcCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KQoreworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX1ZHQSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9QRikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9MRlBGKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFMikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkUzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFNSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9QUkUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfTUFJTikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9QT1NUMSkpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9QT1NUMikpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9QT1NUMykpICE9IDApCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9BTVApKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19pZCAqZmFpbGVkX3Byb3ApCit7CisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfVkdBKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5yeF92Z2EgPiA0NSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9WR0E7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9QRikpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+cnhfcGYgPiAxNSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9QRjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0xGUEYpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnJ4X2xmcGYgPiA3KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0xGUEY7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkUxKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT5yeF9kZmUxID4gNjMpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFMTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTIpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnJ4X2RmZTIgPCAtMzEpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFMjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0aGlzLT5yeF9kZmUyID4gMzEpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFMjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTMpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnJ4X2RmZTMgPCAtMzEpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFMzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0aGlzLT5yeF9kZmUzID4gMzEpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFMzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTQpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnJ4X2RmZTQgPCAtMTUpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFNDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0aGlzLT5yeF9kZmU0ID4gMTUpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFNDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTUpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnJ4X2RmZTUgPCAtMTUpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFNTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0aGlzLT5yeF9kZmU1ID4gMTUpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFNTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX1BSRSkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+dHhfcHJlID4gMzEpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfUFJFOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfTUFJTikpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+dHhfbWFpbiA+IDExMikKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9NQUlOOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChmaWVsZHNfcHJlc2VudCAmICgxVUxMIDw8IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfUE9TVDEpKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMtPnR4X3Bvc3QxID4gNjMpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfUE9TVDE7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGZpZWxkc19wcmVzZW50ICYgKDFVTEwgPDwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9QT1NUMikpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+dHhfcG9zdDIgPCAtMTUpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfUE9TVDI7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGhpcy0+dHhfcG9zdDIgPiAxNSkKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9QT1NUMjsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QzKSkgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLT50eF9wb3N0MyA8IC03KQorICAgICAgICB7CisgICAgICAgICAgICAqZmFpbGVkX3Byb3AgPSBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QzOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRoaXMtPnR4X3Bvc3QzID4gNykKKyAgICAgICAgeworICAgICAgICAgICAgKmZhaWxlZF9wcm9wID0gQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9QT1NUMzsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmllbGRzX3ByZXNlbnQgJiAoMVVMTCA8PCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX0FNUCkpICE9IDApCisgICAgeworICAgICAgICBpZiAodGhpcy0+dHhfYW1wID4gMTUpCisgICAgICAgIHsKKyAgICAgICAgICAgICpmYWlsZWRfcHJvcCA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfQU1QOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKK2JjbW9zX2Jvb2wgYmNtb2x0X29ial9oYXNfdGFnKGJjbW9sdF9vYmpfaWQgb2JqLCBiY21vbHRfb2JqX3RhZyB0YWcpCit7CisgICAgc3dpdGNoIChvYmopCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfQUVfTkk6CisgICAgICAgICAgICByZXR1cm4gKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19BRSk7CisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9BRV9QQVRIX0RTOgorICAgICAgICAgICAgcmV0dXJuICh0YWcgPT0gQkNNT0xUX09CSl9UQUdfQUUpOworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfQUVfUEFUSF9VUzoKKyAgICAgICAgICAgIHJldHVybiAodGFnID09IEJDTU9MVF9PQkpfVEFHX0FFKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0NIQU5ORUw6CisgICAgICAgICAgICByZXR1cm4gKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19YR1BPTik7CisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9ERUJVRzoKKyAgICAgICAgICAgIHJldHVybiAoKCh0YWcgPT0gQkNNT0xUX09CSl9UQUdfRVBPTikgfHwgKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19HUE9OKSkgfHwgKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19YR1BPTikpOworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfREVWSUNFOgorICAgICAgICAgICAgcmV0dXJuICgoKCh0YWcgPT0gQkNNT0xUX09CSl9UQUdfRVBPTikgfHwgKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19HUE9OKSkgfHwgKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19YR1BPTikpIHx8ICh0YWcgPT0gQkNNT0xUX09CSl9UQUdfQUUpKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0VQT05fREVOSUVEX0xJTks6CisgICAgICAgICAgICByZXR1cm4gKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19FUE9OKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0VQT05fTElOSzoKKyAgICAgICAgICAgIHJldHVybiAodGFnID09IEJDTU9MVF9PQkpfVEFHX0VQT04pOworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfRVBPTl9OSToKKyAgICAgICAgICAgIHJldHVybiAodGFnID09IEJDTU9MVF9PQkpfVEFHX0VQT04pOworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMTBHX1VTOgorICAgICAgICAgICAgcmV0dXJuICh0YWcgPT0gQkNNT0xUX09CSl9UQUdfRVBPTik7CisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xR19VUzoKKyAgICAgICAgICAgIHJldHVybiAodGFnID09IEJDTU9MVF9PQkpfVEFHX0VQT04pOworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19EUzoKKyAgICAgICAgICAgIHJldHVybiAodGFnID09IEJDTU9MVF9PQkpfVEFHX0VQT04pOworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19VUzoKKyAgICAgICAgICAgIHJldHVybiAodGFnID09IEJDTU9MVF9PQkpfVEFHX0VQT04pOworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX0RTOgorICAgICAgICAgICAgcmV0dXJuICh0YWcgPT0gQkNNT0xUX09CSl9UQUdfRVBPTik7CisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfVVM6CisgICAgICAgICAgICByZXR1cm4gKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19FUE9OKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0VQT05fUlA6CisgICAgICAgICAgICByZXR1cm4gKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19FUE9OKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQSU86CisgICAgICAgICAgICByZXR1cm4gKCgoKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19FUE9OKSB8fCAodGFnID09IEJDTU9MVF9PQkpfVEFHX0dQT04pKSB8fCAodGFnID09IEJDTU9MVF9PQkpfVEFHX1hHUE9OKSkgfHwgKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19BRSkpOworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQzoKKyAgICAgICAgICAgIHJldHVybiAodGFnID09IEJDTU9MVF9PQkpfVEFHX0dQT04pOworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVDoKKyAgICAgICAgICAgIHJldHVybiAodGFnID09IEJDTU9MVF9PQkpfVEFHX0dQT04pOworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9JV0Y6CisgICAgICAgICAgICByZXR1cm4gKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19HUE9OKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XOgorICAgICAgICAgICAgcmV0dXJuICh0YWcgPT0gQkNNT0xUX09CSl9UQUdfR1BPTik7CisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1c6CisgICAgICAgICAgICByZXR1cm4gKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19HUE9OKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fSVdGX01BQ19UQUJMRToKKyAgICAgICAgICAgIHJldHVybiAodGFnID09IEJDTU9MVF9PQkpfVEFHX0dQT04pOworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfVVNfRkxPVzoKKyAgICAgICAgICAgIHJldHVybiAodGFnID09IEJDTU9MVF9PQkpfVEFHX0dQT04pOworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9OSToKKyAgICAgICAgICAgIHJldHVybiAodGFnID09IEJDTU9MVF9PQkpfVEFHX0dQT04pOworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9PTlU6CisgICAgICAgICAgICByZXR1cm4gKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19HUE9OKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fVFJYOgorICAgICAgICAgICAgcmV0dXJuICh0YWcgPT0gQkNNT0xUX09CSl9UQUdfR1BPTik7CisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9MT0dfRU5UUlk6CisgICAgICAgICAgICByZXR1cm4gKCgodGFnID09IEJDTU9MVF9PQkpfVEFHX1hHUE9OKSB8fCAodGFnID09IEJDTU9MVF9PQkpfVEFHX0dQT04pKSB8fCAodGFnID09IEJDTU9MVF9PQkpfVEFHX0VQT04pKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0xPR0dFUjoKKyAgICAgICAgICAgIHJldHVybiAoKCh0YWcgPT0gQkNNT0xUX09CSl9UQUdfR1BPTikgfHwgKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19YR1BPTikpIHx8ICh0YWcgPT0gQkNNT0xUX09CSl9UQUdfRVBPTikpOworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfTk5JOgorICAgICAgICAgICAgcmV0dXJuICgoKCh0YWcgPT0gQkNNT0xUX09CSl9UQUdfR1BPTikgfHwgKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19YR1BPTikpIHx8ICh0YWcgPT0gQkNNT0xUX09CSl9UQUdfRVBPTikpIHx8ICh0YWcgPT0gQkNNT0xUX09CSl9UQUdfQUUpKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX05OSV9TRVJERVM6CisgICAgICAgICAgICByZXR1cm4gKCgoKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19HUE9OKSB8fCAodGFnID09IEJDTU9MVF9PQkpfVEFHX1hHUE9OKSkgfHwgKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19FUE9OKSkgfHwgKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19BRSkpOworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfU09GVFdBUkVfRVJST1I6CisgICAgICAgICAgICByZXR1cm4gKCgoKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19HUE9OKSB8fCAodGFnID09IEJDTU9MVF9PQkpfVEFHX1hHUE9OKSkgfHwgKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19FUE9OKSkgfHwgKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19BRSkpOworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfVFJYX0NBTElCUkFUSU9OOgorICAgICAgICAgICAgcmV0dXJuICgoKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19HUE9OKSB8fCAodGFnID09IEJDTU9MVF9PQkpfVEFHX1hHUE9OKSkgfHwgKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19FUE9OKSk7CisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQzoKKyAgICAgICAgICAgIHJldHVybiAodGFnID09IEJDTU9MVF9PQkpfVEFHX1hHUE9OKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1hHUE9OX0dFTV9QT1JUOgorICAgICAgICAgICAgcmV0dXJuICh0YWcgPT0gQkNNT0xUX09CSl9UQUdfWEdQT04pOworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfWEdQT05fSVdGOgorICAgICAgICAgICAgcmV0dXJuICh0YWcgPT0gQkNNT0xUX09CSl9UQUdfWEdQT04pOworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfWEdQT05fTkk6CisgICAgICAgICAgICByZXR1cm4gKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19YR1BPTik7CisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlU6CisgICAgICAgICAgICByZXR1cm4gKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19YR1BPTik7CisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9YR1BPTl9UUlg6CisgICAgICAgICAgICByZXR1cm4gKHRhZyA9PSBCQ01PTFRfT0JKX1RBR19YR1BPTik7CisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUzoKKyAgICAgICAgICAgIHJldHVybiAoKCgodGFnID09IEJDTU9MVF9PQkpfVEFHX0dQT04pIHx8ICh0YWcgPT0gQkNNT0xUX09CSl9UQUdfWEdQT04pKSB8fCAodGFnID09IEJDTU9MVF9PQkpfVEFHX0VQT04pKSB8fCAodGFnID09IEJDTU9MVF9PQkpfVEFHX0FFKSk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorfQorCisvKiBNYXBsZSBkZXZpY2Ugc2VsZWN0ZWQgYXMgYSB0YXJnZXQgZm9yIENMSSBjb21tYW5kcyAqLworYmNtb2x0X2RldmlkIGN1cnJlbnRfZGV2aWNlOworCisvKiBTeXN0ZW0gbW9kZSAqLworc3RhdGljIGJjbW9sdF9zeXN0ZW1fbW9kZSBkZXZpY2Vfc3lzdGVtX21vZGVbQkNNVFJfTUFYX09MVFNdOworCisvKiogU2V0IHN5c3RlbSBtb2RlCisgKiBccGFyYW1baW5dICBkZXYgICAgICAgICAgICBEZXZpY2UgaWQKKyAqIFxwYXJhbVtpbl0gIHN5c3RlbV9tb2RlICAgIFN5c3RlbSBtb2RlCisgKiBccmV0dXJucyBCQ01fRVJSX09LLCBCQ01fRVJSX05PVF9TVVBQT1JURUQKKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X3N5c3RlbV9tb2RlX3NldChiY21vbHRfZGV2aWQgZGV2LCBiY21vbHRfc3lzdGVtX21vZGUgc3lzdGVtX21vZGUpCit7CisgICAgaWYgKGRldiA+PSBCQ01UUl9NQVhfT0xUUykgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICBkZXZpY2Vfc3lzdGVtX21vZGVbZGV2XSA9IHN5c3RlbV9tb2RlOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiogR2V0IHN5c3RlbSBtb2RlCisgKiBccGFyYW1baW5dICBkZXYgICAgICAgICAgICBEZXZpY2UgaWQKKyAqIFxwYXJhbVtpbl0gIHN5c3RlbV9tb2RlICAgIFN5c3RlbSBtb2RlCisgKiBccmV0dXJucyBCQ01fRVJSX09LCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9zeXN0ZW1fbW9kZV9nZXQoYmNtb2x0X2RldmlkIGRldiwgYmNtb2x0X3N5c3RlbV9tb2RlICpzeXN0ZW1fbW9kZSkKK3sKKyAgICBpZiAoZGV2ID49IEJDTVRSX01BWF9PTFRTKSByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICpzeXN0ZW1fbW9kZSA9IGRldmljZV9zeXN0ZW1fbW9kZVtkZXZdOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiogTWFwcGluZyBvZiBzeXN0ZW0gbW9kZSB0byBvYmplY3QgdGFnLgorICogVGhpcyBmdW5jdGlvbiBpcyBoYW5kLXdyaXR0ZW4gYW5kIG11c3QgYmUgdXBkYXRlZCB3aGVuZXZlciBhIG5ldyBzeXN0ZW0gbW9kZSBpcyBhZGRlZCBvciBvYmplY3QgdGFncyBjaGFuZ2UuCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29ial90YWdfdmFsaWRfZm9yX3N5c3RlbV9tb2RlKGJjbW9sdF9zeXN0ZW1fbW9kZSBzeXN0ZW1fbW9kZSwgYmNtb2x0X29ial90YWcgdGFnKQoreworICAgIHN3aXRjaCAoc3lzdGVtX21vZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9HUE9OX18xNl9YOiAvKiBGYWxsLXRocm91Z2ggKi8KKyAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfR1BPTl9fOF9YOgorICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9HUE9OX180X1g6CisgICAgICAgICAgICByZXR1cm4gdGFnID09IEJDTU9MVF9PQkpfVEFHX0dQT047CisgICAgICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzE2X1g6CisgICAgICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzhfWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fNF9YOgorICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX184X1hfQ09FWElTVEVOQ0VfVERNQToKKyAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fNF9YX0NPRVhJU1RFTkNFX1RETUE6CisgICAgICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzhfWF8xMF9HOgorICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX180X1hfMTBfRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fMl9YXzEwX0c6CisgICAgICAgICAgICByZXR1cm4gdGFnID09IEJDTU9MVF9PQkpfVEFHX0VQT047CisgICAgICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX1hHUE9OXzFfXzhfWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfWEdQT05fMV9fNF9YOgorICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9YR1NfXzJfWF8xMF9HOgorICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9OR1BPTjJfXzJfWF8xMF9HOgorICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9OR1BPTjJfXzhfWF8yX1BfNV9HOgorICAgICAgICAgICAgcmV0dXJuIHRhZyA9PSBCQ01PTFRfT0JKX1RBR19YR1BPTjsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfR1BPTl84X1hHUE9OXzRfWF9DT0VYSVNURU5DRToKKyAgICAgICAgICAgIHJldHVybiB0YWcgPT0gQkNNT0xUX09CSl9UQUdfR1BPTiB8fCB0YWcgPT0gQkNNT0xUX09CSl9UQUdfWEdQT047CisgICAgICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0FFXzhfWDoKKyAgICAgICAgICAgIHJldHVybiB0YWcgPT0gQkNNT0xUX09CSl9UQUdfQUU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorfQorCitiY21vc19ib29sIGJjbW9sdF9vYmplY3RfaXNfc3VwcG9ydGVkKGJjbW9sdF9zeXN0ZW1fbW9kZSBzeXN0ZW1fbW9kZSwgYmNtb2x0X29ial9pZCBvYmopCit7CisgICAgYmNtb2x0X29ial90YWcgdGFnOworCisgICAgZm9yICh0YWcgPSAwOyB0YWcgPCBCQ01PTFRfT0JKX1RBR19fTlVNX09GOyB0YWcrKykKKyAgICB7CisgICAgICAgIGlmIChiY21vbHRfb2JqX3RhZ192YWxpZF9mb3Jfc3lzdGVtX21vZGUoc3lzdGVtX21vZGUsIHRhZykgJiYgYmNtb2x0X29ial9oYXNfdGFnKG9iaiwgdGFnKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfRkFMU0U7Cit9CisKK2NvbnN0IGNoYXIgKmJjbW9sdF9zeXN0ZW1fbW9kZV9uYW1lKGJjbW9sdF9zeXN0ZW1fbW9kZSBtb2RlKQoreworICAgIHN0YXRpYyBjb25zdCBjaGFyICptb2RlX25hbWVbXSA9IHsgW0JDTU9MVF9TWVNURU1fTU9ERV9HUE9OX18xNl9YXSA9ICJHUE9OXzE2IiwgW0JDTU9MVF9TWVNURU1fTU9ERV9HUE9OX184X1hdID0gIkdQT05fOCIsIFtCQ01PTFRfU1lTVEVNX01PREVfR1BPTl9fNF9YXSA9ICJHUE9OXzQiLCBbQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzE2X1hdID0gIkVQT05fMTYiLCBbQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzhfWF0gPSAiRVBPTl84IiwgW0JDTU9MVF9TWVNURU1fTU9ERV9FUE9OX180X1hdID0gIkVQT05fNCIsIFtCQ01PTFRfU1lTVEVNX01PREVfWEdQT05fMV9fOF9YXSA9ICJYR1BPTjFfOCIsIFtCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fOF9YX0NPRVhJU1RFTkNFX1RETUFdID0gIkVQT05fOF9URE1BIiwgW0JDTU9MVF9TWVNURU1fTU9ERV9FUE9OX180X1hfQ09FWElTVEVOQ0VfVERNQV0gPSAiRVBPTl80X1RETUEiLCBbQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzhfWF8xMF9HXSA9ICJFUE9OXzhfMTBHIiwgW0JDTU9MVF9TWVNURU1fTU9ERV9FUE9OX180X1hfMTBfR10gPSAiRVBPTl80XzEwRyIsIFtCQ01PTFRfU1lTVEVNX01PREVfR1BPTl84X1hHUE9OXzRfWF9DT0VYSVNURU5DRV0gPSAiR1BPTl84X1hHUE9OXzQiLCBbQkNNT0xUX1NZU1RFTV9NT0RFX0FFXzhfWF0gPSAiQUVfOCIsIFtCQ01PTFRfU1lTVEVNX01PREVfWEdTX18yX1hfMTBfR10gPSAiWEdTXzJfMTBHIiwgW0JDTU9MVF9TWVNURU1fTU9ERV9OR1BPTjJfXzJfWF8xMF9HXSA9ICJOR1BPTjJfMl8xMEciLCBbQkNNT0xUX1NZU1RFTV9NT0RFX05HUE9OMl9fOF9YXzJfUF81X0ddID0gIk5HUE9OMl8yXzJfNUciLCBbQkNNT0xUX1NZU1RFTV9NT0RFX1hHUE9OXzFfXzRfWF0gPSAiWEdQT04xXzQiLCBbQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzJfWF8xMF9HXSA9ICJFUE9OXzJfMTBHIiwgfTsKKworICAgIGNvbnN0IGNoYXIgKnVuc2V0ID0gIip1bmNvbmZpZ3VyZWQqIjsKKyAgICBjb25zdCBjaGFyICppbnZhbGlkID0gIippbnZhbGlkKiI7CisKKyAgICBpZiAobW9kZSA+PSBCQ01PTFRfU1lTVEVNX01PREVfX05VTV9PRikKKyAgICB7CisgICAgICAgIHJldHVybiB1bnNldDsKKyAgICB9CisKKyAgICBpZiAobW9kZV9uYW1lW21vZGVdID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gaW52YWxpZDsKKyAgICB9CisKKyAgICByZXR1cm4gbW9kZV9uYW1lW21vZGVdOworfQorCisvKiBYR1BPTiBudW0gb2Ygb251cyAqLworc3RhdGljIGJjbW9sdF94Z3Bvbl9udW1fb2Zfb251cyBkZXZpY2VfeGdwb25fbnVtX29mX29udXNbQkNNVFJfTUFYX09MVFNdOworCisvKiogU2V0IHhncG9uIG51bSBvZiBvbnVzCisgKiBccGFyYW1baW5dICBkZXYgICAgICAgICAgICBEZXZpY2UgaWQKKyAqIFxwYXJhbVtpbl0gIHhncG9uX251bV9vZl9vbnVzICAgIFhHUE9OIG51bSBvZiBvbnVzCisgKiBccmV0dXJucyBCQ01fRVJSX09LLCBCQ01fRVJSX1BBUk0KKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X3hncG9uX251bV9vZl9vbnVzX3NldChiY21vbHRfZGV2aWQgZGV2LCBiY21vbHRfeGdwb25fbnVtX29mX29udXMgeGdwb25fbnVtX29mX29udXMpCit7CisgICAgaWYgKGRldiA+PSBCQ01UUl9NQVhfT0xUUykgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICBkZXZpY2VfeGdwb25fbnVtX29mX29udXNbZGV2XSA9IHhncG9uX251bV9vZl9vbnVzOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiogR2V0IHhncG9uIG51bSBvZiBvbnVzCisgKiBccGFyYW1baW5dICBkZXYgICAgICAgICAgICBEZXZpY2UgaWQKKyAqIFxwYXJhbVtpbl0gIHhncG9uX251bV9vZl9vbnVzICAgIFhHUE9OIG51bSBvZiBvbnVzCisgKiBccmV0dXJucyBCQ01fRVJSX09LLCBCQ01fRVJSX1BBUk0KKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X3hncG9uX251bV9vZl9vbnVzX2dldChiY21vbHRfZGV2aWQgZGV2LCBiY21vbHRfeGdwb25fbnVtX29mX29udXMgKnhncG9uX251bV9vZl9vbnVzKQoreworICAgIGlmIChkZXYgPj0gQkNNVFJfTUFYX09MVFMpIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgKnhncG9uX251bV9vZl9vbnVzID0gZGV2aWNlX3hncG9uX251bV9vZl9vbnVzW2Rldl07CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvbW9kZWwvYmNtb2x0X21vZGVsX3R5cGVzLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvbW9kZWwvYmNtb2x0X21vZGVsX3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc4NWIwMgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9tb2RlbC9iY21vbHRfbW9kZWxfdHlwZXMuaApAQCAtMCwwICsxLDQ2OTg3IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OnByb3ByaWV0YXJ5OnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVGhpcyBwcm9ncmFtIGlzIHRoZSBwcm9wcmlldGFyeSBzb2Z0d2FyZSBvZiBCcm9hZGNvbSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzCitsaWNlbnNvcnMsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBkdXBsaWNhdGVkLCBtb2RpZmllZCBvciBkaXN0cmlidXRlZCBwdXJzdWFudAordG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIGEgc2VwYXJhdGUsIHdyaXR0ZW4gbGljZW5zZSBhZ3JlZW1lbnQgZXhlY3V0ZWQKK2JldHdlZW4geW91IGFuZCBCcm9hZGNvbSAoYW4gIkF1dGhvcml6ZWQgTGljZW5zZSIpLiAgRXhjZXB0IGFzIHNldCBmb3J0aCBpbgorYW4gQXV0aG9yaXplZCBMaWNlbnNlLCBCcm9hZGNvbSBncmFudHMgbm8gbGljZW5zZSAoZXhwcmVzcyBvciBpbXBsaWVkKSwgcmlnaHQKK3RvIHVzZSwgb3Igd2FpdmVyIG9mIGFueSBraW5kIHdpdGggcmVzcGVjdCB0byB0aGUgU29mdHdhcmUsIGFuZCBCcm9hZGNvbQorZXhwcmVzc2x5IHJlc2VydmVzIGFsbCByaWdodHMgaW4gYW5kIHRvIHRoZSBTb2Z0d2FyZSBhbmQgYWxsIGludGVsbGVjdHVhbAorcHJvcGVydHkgcmlnaHRzIHRoZXJlaW4uICBJRiBZT1UgSEFWRSBOTyBBVVRIT1JJWkVEIExJQ0VOU0UsIFRIRU4gWU9VIEhBVkUKK05PIFJJR0hUIFRPIFVTRSBUSElTIFNPRlRXQVJFIElOIEFOWSBXQVksIEFORCBTSE9VTEQgSU1NRURJQVRFTFkgTk9USUZZCitCUk9BRENPTSBBTkQgRElTQ09OVElOVUUgQUxMIFVTRSBPRiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBleHByZXNzbHkgc2V0IGZvcnRoIGluIHRoZSBBdXRob3JpemVkIExpY2Vuc2UsCisKKzEuIFRoaXMgcHJvZ3JhbSwgaW5jbHVkaW5nIGl0cyBzdHJ1Y3R1cmUsIHNlcXVlbmNlIGFuZCBvcmdhbml6YXRpb24sCisgICAgY29uc3RpdHV0ZXMgdGhlIHZhbHVhYmxlIHRyYWRlIHNlY3JldHMgb2YgQnJvYWRjb20sIGFuZCB5b3Ugc2hhbGwgdXNlCisgICAgYWxsIHJlYXNvbmFibGUgZWZmb3J0cyB0byBwcm90ZWN0IHRoZSBjb25maWRlbnRpYWxpdHkgdGhlcmVvZiwgYW5kIHRvCisgICAgdXNlIHRoaXMgaW5mb3JtYXRpb24gb25seSBpbiBjb25uZWN0aW9uIHdpdGggeW91ciB1c2Ugb2YgQnJvYWRjb20KKyAgICBpbnRlZ3JhdGVkIGNpcmN1aXQgcHJvZHVjdHMuCisKKzIuIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIgorICAgIEFORCBXSVRIIEFMTCBGQVVMVFMgQU5EIEJST0FEQ09NIE1BS0VTIE5PIFBST01JU0VTLCBSRVBSRVNFTlRBVElPTlMgT1IKKyAgICBXQVJSQU5USUVTLCBFSVRIRVIgRVhQUkVTUywgSU1QTElFRCwgU1RBVFVUT1JZLCBPUiBPVEhFUldJU0UsIFdJVEgKKyAgICBSRVNQRUNUIFRPIFRIRSBTT0ZUV0FSRS4gIEJST0FEQ09NIFNQRUNJRklDQUxMWSBESVNDTEFJTVMgQU5ZIEFORAorICAgIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgVElUTEUsIE1FUkNIQU5UQUJJTElUWSwgTk9OSU5GUklOR0VNRU5ULAorICAgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBMQUNLIE9GIFZJUlVTRVMsIEFDQ1VSQUNZIE9SCisgICAgQ09NUExFVEVORVNTLCBRVUlFVCBFTkpPWU1FTlQsIFFVSUVUIFBPU1NFU1NJT04gT1IgQ09SUkVTUE9OREVOQ0UKKyAgICBUTyBERVNDUklQVElPTi4gWU9VIEFTU1VNRSBUSEUgRU5USVJFIFJJU0sgQVJJU0lORyBPVVQgT0YgVVNFIE9SCisgICAgUEVSRk9STUFOQ0UgT0YgVEhFIFNPRlRXQVJFLgorCiszLiBUTyBUSEUgTUFYSU1VTSBFWFRFTlQgUEVSTUlUVEVEIEJZIExBVywgSU4gTk8gRVZFTlQgU0hBTEwgQlJPQURDT00gT1IKKyAgICBJVFMgTElDRU5TT1JTIEJFIExJQUJMRSBGT1IgKGkpIENPTlNFUVVFTlRJQUwsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgICAgSU5ESVJFQ1QsIE9SIEVYRU1QTEFSWSBEQU1BR0VTIFdIQVRTT0VWRVIgQVJJU0lORyBPVVQgT0YgT1IgSU4gQU5ZCisgICAgV0FZIFJFTEFUSU5HIFRPIFlPVVIgVVNFIE9GIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFNPRlRXQVJFIEVWRU4KKyAgICBJRiBCUk9BRENPTSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVM7CisgICAgT1IgKGlpKSBBTlkgQU1PVU5UIElOIEVYQ0VTUyBPRiBUSEUgQU1PVU5UIEFDVFVBTExZIFBBSUQgRk9SIFRIRQorICAgIFNPRlRXQVJFIElUU0VMRiBPUiBVLlMuICQxLCBXSElDSEVWRVIgSVMgR1JFQVRFUi4gVEhFU0UgTElNSVRBVElPTlMKKyAgICBTSEFMTCBBUFBMWSBOT1RXSVRIU1RBTkRJTkcgQU5ZIEZBSUxVUkUgT0YgRVNTRU5USUFMIFBVUlBPU0UgT0YgQU5ZCisgICAgTElNSVRFRCBSRU1FRFkuCis6PgorKi8KKyNpZm5kZWYgQkNNT0xUX01PREVMX1RZUEVTX0hfCisjZGVmaW5lIEJDTU9MVF9NT0RFTF9UWVBFU19IXworCisjaW5jbHVkZSAiYmNtb3Nfc3lzdGVtLmgiCisjaW5jbHVkZSAiYmNtb3NfZXJybm8uaCIKKyNpbmNsdWRlICJiY21vbHRfYnVmLmgiCisjaW5jbHVkZSAiYmNtb2x0X21zZy5oIgorI2luY2x1ZGUgImJjbW9sdF9tb2RlbF9kYXRhLmgiCisKKy8qKiBcYWRkdG9ncm91cCBvYmplY3RfbW9kZWwKKyAqIEB7CisgKi8KKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleSIgZ3JvdXAgb2YgdGhlICJhZV9uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2FlX25pX2tleQoreworICAgIGJjbW9sdF9hZV9uaSBhZV9uaTsgLyoqPCBUaGUgaW5kZXggb2YgYSBzcGVjaWZpYyBBRSBOSSBpbnN0YW5jZSBhcyBzZWVuIGJ5IHRoZSBob3N0LiAqLworfSBiY21vbHRfYWVfbmlfa2V5OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiY2ZnIiBncm91cCBvZiB0aGUgImFlX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfYWVfbmlfY2ZnX2RhdGEKK3sKKyAgICBiY21vc19tYWNfYWRkcmVzcyBtYWNfYWRkcmVzczsgIC8qKjwgVGhlIE1BQyBhZGRyZXNzIHVzZWQgZm9yIGFsbCBmcmFtZXMgZ2VuZXJhdGVkIGJ5IHRoZSBPTFQgb24gdGhlIG5ldHdvcmsuICBUaGlzIHZhbHVlIG11c3QgYmUgc2V0IGJlZm9yZSBBRV9OSSBpcyBmaXJzdCBlbmFibGVkLCBhbmQgY2Fubm90IGJlIGNoYW5nZWQgd2hpbGUgdGhlIEFFX05JIGlzIGVuYWJsZWQuICovCisgICAgYmNtb2x0X2FlX25pX2VuX3N0YXRlIGFlX25pX2VuOyAvKio8IEluZGljYXRlcyB0aGUgZW5hYmxlIHN0YXRlIG9mIHRoZSBBRSBOSS4gKi8KKyAgICB1aW50MTZfdCBtdHVfMTBnOyAgICAgICAgICAgICAgIC8qKjwgTWF4aW11bSBmcmFtZSBzaXplIChpbmNsdWRpbmcgRkNTKSBvbiB0aGUgMTBHIHBhdGguIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBjaGFuZ2VkIG9uIGFuIGVuYWJsZWQgQUVfTkkuICovCisgICAgYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZyBwcmJzX2dlbmVyYXRvcjsgICAgLyoqPCBEUyBQUkJTIGdlbmVyYXRvciBjb25maWd1cmF0aW9uICovCisgICAgYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcgcHJic19jaGVja2VyOyAgICAgICAgLyoqPCBVUyBQUkJTIGNoZWNrZXIgY29uZmlndXJhdGlvbiAqLworICAgIGJjbW9sdF9wcmJzX3N0YXR1cyBwcmJzX3N0YXR1czsgICAgICAgICAgICAgICAgIC8qKjwgUmVzdWx0IG9mIFVTIFBSQlMgY2hlY2tlciAqLworfSBiY21vbHRfYWVfbmlfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiY2ZnIiBncm91cCBvZiAiYWVfbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9hZV9uaV9jZmcKK3sKKyAgICBiY21vbHRfY2ZnIGhkcjsgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9hZV9uaV9rZXkga2V5OyAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2FlX25pX2NmZ19kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2FlX25pX2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInNldF9hZV9uaV9lbl9zdGF0ZSIgZ3JvdXAgb2YgdGhlICJhZV9uaSIgCisgKiBvYmplY3QuIAorICoKKyAqIFNldCB0aGUgQUUgTkkgZW5hYmxlIHN0YXRlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9kYXRhCit7CisgICAgYmNtb2x0X2FlX25pX2VuX3N0YXRlIG5ld19zdGF0ZTsgICAgLyoqPCBOZXcgRVBPTiBOSSBlbmFibGUgc3RhdGUuICovCit9IGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzZXRfYWVfbmlfZW5fc3RhdGUiIGdyb3VwIG9mICJhZV9uaSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlCit7CisgICAgYmNtb2x0X29wZXIgaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9hZV9uaV9rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleSIgZ3JvdXAgb2YgdGhlICJhZV9wYXRoX2RzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfYWVfcGF0aF9kc19rZXkKK3sKKyAgICBiY21vbHRfYWVfbmkgYWVfbmk7IC8qKjwgQUUgTkkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgMTBHIGRvd25zdHJlYW0gcGF0aC4gKi8KK30gYmNtb2x0X2FlX3BhdGhfZHNfa2V5OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdCIgZ3JvdXAgb2YgdGhlICJhZV9wYXRoX2RzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGEKK3sKKyAgICB1aW50NjRfdCBieXRlczsgICAgICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBmcmFtZXM7ICAgICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZnJhbWVzXzY0OyAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiA2NCBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZnJhbWVzXzY1XzEyNzsgICAgIC8qKjwgVGhlIG51bWJlciBvZiA2NSB0byAxMjcgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lc18xMjhfMjU1OyAgICAvKio8IFRoZSBudW1iZXIgb2YgMTI4IHRvIDI1NSBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZnJhbWVzXzI1Nl81MTE7ICAgIC8qKjwgVGhlIG51bWJlciBvZiAyNTYgdG8gNTExIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBmcmFtZXNfNTEyXzEwMjM7ICAgLyoqPCBUaGUgbnVtYmVyIG9mIDUxMiB0byAxMDIzIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBmcmFtZXNfMTAyNF8xNTE4OyAgLyoqPCBUaGUgbnVtYmVyIG9mIDEwMjQgdG8gMTUxOCBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZnJhbWVzXzE1MTlfMjA0NzsgIC8qKjwgVGhlIG51bWJlciBvZiAxNTE5IHRvIDIwNDcgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lc18yMDQ4XzQwOTU7ICAvKio8IFRoZSBudW1iZXIgb2YgMjA0OCB0byA0MDk1IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBmcmFtZXNfNDA5Nl85MjE2OyAgLyoqPCBUaGUgbnVtYmVyIG9mIDQwOTYgdG8gOTIxNiBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZnJhbWVzXzkyMTdfMTYzODM7IC8qKjwgVGhlIG51bWJlciBvZiA5MjE3IHRvIDE2MzgzIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBicm9hZGNhc3RfZnJhbWVzOyAgLyoqPCBUaGUgbnVtYmVyIG9mIGJyb2FkY2FzdCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGRhdGFfYnl0ZXM7ICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgbXVsdGljYXN0X2ZyYW1lczsgIC8qKjwgVGhlIG51bWJlciBvZiBtdWx0aWNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCB1bmljYXN0X2ZyYW1lczsgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHVuaWNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBhYm9ydF9mcmFtZXM7ICAgICAgLyoqPCBOdW1iZXIgb2YgYWJvcnQgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4gKi8KK30gYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXQiIGdyb3VwIG9mICJhZV9wYXRoX2RzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfYWVfcGF0aF9kc19zdGF0Cit7CisgICAgYmNtb2x0X3N0YXQgaGRyOyAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9hZV9wYXRoX2RzX2tleSBrZXk7ICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9hZV9wYXRoX2RzX3N0YXQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2NmZyIgZ3JvdXAgb2YgdGhlICJhZV9wYXRoX2RzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZ19kYXRhCit7CisgICAgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIGNmZzsgICAvKio8IFN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiAqLworfSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXRfY2ZnIiBncm91cCBvZiAiYWVfcGF0aF9kcyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmcKK3sKKyAgICBiY21vbHRfc3RhdF9jZmcgaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9hZV9wYXRoX2RzX2tleSBrZXk7ICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2FsYXJtX2NsZWFyZWQiIGdyb3VwIG9mIHRoZSAiYWVfcGF0aF9kcyIgCisgKiBvYmplY3QuIAorICoKKyAqIFNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBpcyBubyBsb25nZXIgbWV0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEKK3sKKyAgICBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2lkIHN0YXQ7IC8qKjwgU3RhdGlzdGljIGlkZW50aWZpZXIuICovCit9IGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXRfYWxhcm1fY2xlYXJlZCIgZ3JvdXAgb2YgImFlX3BhdGhfZHMiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfYWVfcGF0aF9kc19rZXkga2V5OyAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdF9hbGFybV9yYWlzZWQiIGdyb3VwIG9mIHRoZSAiYWVfcGF0aF9kcyIgCisgKiBvYmplY3QuIAorICoKKyAqIFNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhCit7CisgICAgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9pZCBzdGF0OyAvKio8IFN0YXRpc3RpYyBpZGVudGlmaWVyLiAqLworfSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXRfYWxhcm1fcmFpc2VkIiBncm91cCBvZiAiYWVfcGF0aF9kcyIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2FlX3BhdGhfZHNfa2V5IGtleTsgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiYXV0b19jZmciIGdyb3VwIG9mIHRoZSAiYWVfcGF0aF9kcyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmdfZGF0YQoreworICAgIGJjbW9zX2Jvb2wgc3RhdF9hbGFybV9jbGVhcmVkOyAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzdGF0X2FsYXJtX2NsZWFyZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgc3RhdF9hbGFybV9yYWlzZWQ7ICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzdGF0X2FsYXJtX3JhaXNlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCit9IGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiYXV0b19jZmciIGdyb3VwIG9mICJhZV9wYXRoX2RzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZworeworICAgIGJjbW9sdF9hdXRvX2NmZyBoZHI7ICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2FlX3BhdGhfZHNfa2V5IGtleTsgICAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleSIgZ3JvdXAgb2YgdGhlICJhZV9wYXRoX3VzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfYWVfcGF0aF91c19rZXkKK3sKKyAgICBiY21vbHRfYWVfbmkgYWVfbmk7IC8qKjwgQUUgTkkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgMTBHIHVwc3RyZWFtIHBhdGguICovCit9IGJjbW9sdF9hZV9wYXRoX3VzX2tleTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXQiIGdyb3VwIG9mIHRoZSAiYWVfcGF0aF91cyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhCit7CisgICAgdWludDY0X3QgYnl0ZXM7ICAgICAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBieXRlcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lczsgICAgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZnJhbWVzXzY0OyAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiA2NCBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lc182NV8xMjc7ICAgICAvKio8IFRoZSBudW1iZXIgb2YgNjUgdG8gMTI3IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZnJhbWVzXzEyOF8yNTU7ICAgIC8qKjwgVGhlIG51bWJlciBvZiAxMjggdG8gMjU1IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZnJhbWVzXzI1Nl81MTE7ICAgIC8qKjwgVGhlIG51bWJlciBvZiAyNTYgdG8gNTExIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZnJhbWVzXzUxMl8xMDIzOyAgIC8qKjwgVGhlIG51bWJlciBvZiA1MTIgdG8gMTAyMyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lc18xMDI0XzE1MTg7ICAvKio8IFRoZSBudW1iZXIgb2YgMTAyNCB0byAxNTE4IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZnJhbWVzXzE1MTlfMjA0NzsgIC8qKjwgVGhlIG51bWJlciBvZiAxNTE5IHRvIDIwNDcgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBmcmFtZXNfMjA0OF80MDk1OyAgLyoqPCBUaGUgbnVtYmVyIG9mIDIwNDggdG8gNDA5NSBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lc180MDk2XzkyMTY7ICAvKio8IFRoZSBudW1iZXIgb2YgNDA5NiB0byA5MjE2IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZnJhbWVzXzkyMTdfMTYzODM7IC8qKjwgVGhlIG51bWJlciBvZiA5MjE3IHRvIDE2MzgzIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgYnJvYWRjYXN0X2ZyYW1lczsgIC8qKjwgVGhlIG51bWJlciBvZiBicm9hZGNhc3QgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZGF0YV9ieXRlczsgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgbXVsdGljYXN0X2ZyYW1lczsgIC8qKjwgVGhlIG51bWJlciBvZiBtdWx0aWNhc3QgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgdW5pY2FzdF9mcmFtZXM7ICAgIC8qKjwgVGhlIG51bWJlciBvZiB1bmljYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGFib3J0X2ZyYW1lczsgICAgICAvKio8IFRoZSBudW1iZXIgb2YgYWJvcnQgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZmNzX2Vycm9yOyAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBiYWQgRkNTIGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IG92ZXJzaXplX2Vycm9yOyAgICAvKio8IFRoZSBudW1iZXIgb2Ygb3ZlcnNpemUgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgcnVudF9lcnJvcjsgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBydW50IGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiAqLworfSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdCIgZ3JvdXAgb2YgImFlX3BhdGhfdXMiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9hZV9wYXRoX3VzX3N0YXQKK3sKKyAgICBiY21vbHRfc3RhdCBoZHI7ICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2FlX3BhdGhfdXNfa2V5IGtleTsgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2FlX3BhdGhfdXNfc3RhdDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfY2ZnIiBncm91cCBvZiB0aGUgImFlX3BhdGhfdXMiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2RhdGEKK3sKKyAgICBiY21vbHRfc3RhdF9hbGFybV9jb25maWcgY2ZnOyAgIC8qKjwgU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uICovCit9IGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9jZmciIGdyb3VwIG9mICJhZV9wYXRoX3VzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZworeworICAgIGJjbW9sdF9zdGF0X2NmZyBoZHI7ICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2FlX3BhdGhfdXNfa2V5IGtleTsgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZ19kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfYWxhcm1fY2xlYXJlZCIgZ3JvdXAgb2YgdGhlICJhZV9wYXRoX3VzIiAKKyAqIG9iamVjdC4gCisgKgorICogU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YQoreworICAgIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfaWQgc3RhdDsgLyoqPCBTdGF0aXN0aWMgaWRlbnRpZmllci4gKi8KK30gYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9hbGFybV9jbGVhcmVkIiBncm91cCBvZiAiYWVfcGF0aF91cyIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9hZV9wYXRoX3VzX2tleSBrZXk7ICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2FsYXJtX3JhaXNlZCIgZ3JvdXAgb2YgdGhlICJhZV9wYXRoX3VzIiAKKyAqIG9iamVjdC4gCisgKgorICogU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEKK3sKKyAgICBiY21vbHRfYWVfcGF0aF91c19zdGF0X2lkIHN0YXQ7IC8qKjwgU3RhdGlzdGljIGlkZW50aWZpZXIuICovCit9IGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9hbGFybV9yYWlzZWQiIGdyb3VwIG9mICJhZV9wYXRoX3VzIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfYWVfcGF0aF91c19rZXkga2V5OyAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJhdXRvX2NmZyIgZ3JvdXAgb2YgdGhlICJhZV9wYXRoX3VzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19kYXRhCit7CisgICAgYmNtb3NfYm9vbCBzdGF0X2FsYXJtX2NsZWFyZWQ7ICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInN0YXRfYWxhcm1fY2xlYXJlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBzdGF0X2FsYXJtX3JhaXNlZDsgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInN0YXRfYWxhcm1fcmFpc2VkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KK30gYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJhdXRvX2NmZyIgZ3JvdXAgb2YgImFlX3BhdGhfdXMiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnCit7CisgICAgYmNtb2x0X2F1dG9fY2ZnIGhkcjsgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfYWVfcGF0aF91c19rZXkga2V5OyAgICAgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAia2V5IiBncm91cCBvZiB0aGUgImNoYW5uZWwiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9jaGFubmVsX2tleQoreworICAgIGJjbW9sdF9wb25fbmkgcG9uX25pOyAgIC8qKjwgUE9OIG5ldHdvcmsgaW50ZXJmYWNlLiAqLworfSBiY21vbHRfY2hhbm5lbF9rZXk7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJjZmciIGdyb3VwIG9mIHRoZSAiY2hhbm5lbCIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2NoYW5uZWxfY2ZnX2RhdGEKK3sKKyAgICBiY21vbHRfb3BlcmF0aW9uX2NvbnRyb2wgb3BlcmF0aW9uX2NvbnRyb2w7IC8qKjwgT3BlcmF0aW9uIGNvbnRyb2wuICovCisgICAgdWludDE2X3QgdG9sOyAgIC8qKjwgVHJhbnNtaXQgT3B0aWNhbCBMZXZlbC4gQW4gaW5kaWNhdGlvbiBvZiB0aGUgY3VycmVudCBPTFQgQ1QgdHJhbnNjZWl2ZXIgY2hhbm5lbCBsYXVuY2ggcG93ZXIgaW50byB0aGUgT0ROICovCisgICAgYmNtb2x0X3N5c3RlbV9wcm9maWxlIHN5c3RlbV9wcm9maWxlOyAgICAgICAgICAgLyoqPCBTeXN0ZW0gcHJvZmlsZS4gKi8KKyNkZWZpbmUgQkNNT0xUX0NIQU5ORUxfQ0ZHX0RBVEFfQ0hBTk5FTF9QUk9GSUxFX0xFTiA4CisgICAgYmNtb2x0X2Fycl9jaGFubmVsX3Byb2ZpbGVfOCBjaGFubmVsX3Byb2ZpbGU7ICAgLyoqPCBDaGFubmVsIHByb2ZpbGUuICovCit9IGJjbW9sdF9jaGFubmVsX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImNmZyIgZ3JvdXAgb2YgImNoYW5uZWwiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9jaGFubmVsX2NmZworeworICAgIGJjbW9sdF9jZmcgaGRyOyAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9jaGFubmVsX2tleSBrZXk7ICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9jaGFubmVsX2NmZ19kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfY2hhbm5lbF9jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJrZXkiIGdyb3VwIG9mIHRoZSAiZGVidWciIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9kZWJ1Z19rZXkKK3sKKyAgICB1aW50MzJfdCByZXNlcnZlZDsgIC8qKjwgUmVzZXJ2ZWQgKHNldCB0byAwKSAqLworfSBiY21vbHRfZGVidWdfa2V5OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiY2ZnIiBncm91cCBvZiB0aGUgImRlYnVnIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZGVidWdfY2ZnX2RhdGEKK3sKKyAgICBiY21vbHRfY29uc29sZV9yZWRpcmVjdGlvbiBjb25zb2xlX3JlZGlyZWN0aW9uOyAgICAgICAgICAgICAvKio8IExvZyBvdXRwdXQgcmVkaXJlY3Rpb24gKi8KKyAgICB1aW50MzJfdCBpbmRpY2F0aW9uc19kcm9wcGVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBpbmRpY2F0aW9ucyBkcm9wcGVkIGR1ZSB0byBjb25nZXN0aW9uIC8gc2hhcGluZy4gKi8KKyAgICB1aW50OF90IGZpbGVfdXNlZF9wZXJjZW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEREUiBsb2cgZmlsZSB1c2VkIHBlcmNlbnQgKi8KKyAgICBiY21vbHRfYXBpX2NhcHR1cmVfY29uZmlnIGFwaV9jYXB0dXJlX2NmZzsgICAgICAgICAgICAgICAgICAvKio8IENvbmZpZ3VyYXRpb24gZm9yIEFQSSBjYXB0dXJlLiAqLworICAgIGJjbW9sdF9hcGlfY2FwdHVyZV9zdGF0cyBhcGlfY2FwdHVyZV9zdGF0czsgICAgICAgICAgICAgICAgIC8qKjwgU3RhdGlzdGljcyBvbiB0aGUgbW9zdCByZWNlbnQgQVBJIGNhcHR1cmUuICovCisgICAgYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXIgYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQ7ICAgLyoqPCBDb250cm9scyB3aGF0IHBvcnRpb24gb2YgdGhlIGNhcHR1cmUgYnVmZmVyIGlzIHJldHVybmVkIHdoZW4gcGVyZm9ybWluZyBhIGNmZ19nZXQuICovCisgICAgYmNtb2x0X3U4X2xpc3RfdTMyIGFwaV9jYXB0dXJlX2J1ZmZlcjsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgcG9ydGlvbiBvZiB0aGUgY2FwdHVyZSBidWZmZXIgY3VycmVudGx5IHNwZWNpZmllZCBieSBhcGlfY2FwdHVyZV9idWZmZXJfcmVhZC4gKi8KK30gYmNtb2x0X2RlYnVnX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImNmZyIgZ3JvdXAgb2YgImRlYnVnIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZGVidWdfY2ZnCit7CisgICAgYmNtb2x0X2NmZyBoZHI7ICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZGVidWdfa2V5IGtleTsgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9kZWJ1Z19jZmdfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9kZWJ1Z19jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJjbGlfb3V0cHV0IiBncm91cCBvZiB0aGUgImRlYnVnIiBvYmplY3QuIAorICoKKyAqIENMSSBPdXRwdXQgU3RyaW5nIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZGVidWdfY2xpX291dHB1dF9kYXRhCit7CisgICAgYmNtb2x0X3U4X2xpc3RfdTMyIGRhdGE7ICAgIC8qKjwgb3V0cHV0IGRhdGEgKi8KK30gYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJjbGlfb3V0cHV0IiBncm91cCBvZiAiZGVidWciIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0Cit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9kZWJ1Z19rZXkga2V5OyAgICAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZGVidWdfY2xpX291dHB1dF9kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0OworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImZpbGVfYWxtb3N0X2Z1bGwiIGdyb3VwIG9mICJkZWJ1ZyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2RlYnVnX2ZpbGVfYWxtb3N0X2Z1bGwKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2RlYnVnX2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworfSBiY21vbHRfZGVidWdfZmlsZV9hbG1vc3RfZnVsbDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImF1dG9fY2ZnIiBncm91cCBvZiB0aGUgImRlYnVnIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZGVidWdfYXV0b19jZmdfZGF0YQoreworICAgIGJjbW9zX2Jvb2wgY2xpX291dHB1dDsgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJjbGlfb3V0cHV0IiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIGZpbGVfYWxtb3N0X2Z1bGw7ICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAiZmlsZV9hbG1vc3RfZnVsbCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCit9IGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImF1dG9fY2ZnIiBncm91cCBvZiAiZGVidWciIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9kZWJ1Z19hdXRvX2NmZworeworICAgIGJjbW9sdF9hdXRvX2NmZyBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZGVidWdfa2V5IGtleTsgICAgICAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZGVidWdfYXV0b19jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJjbGlfaW5wdXQiIGdyb3VwIG9mIHRoZSAiZGVidWciIG9iamVjdC4gCisgKgorICogQ0xJIElucHV0IFN0cmluZyAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9kYXRhCit7CisgICAgYmNtb2x0X3U4X2xpc3RfdTMyIGRhdGE7ICAgIC8qKjwgSW5wdXQgU3RyaW5nICovCit9IGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJjbGlfaW5wdXQiIGdyb3VwIG9mICJkZWJ1ZyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2RlYnVnX2NsaV9pbnB1dAoreworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZGVidWdfa2V5IGtleTsgICAgICAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZGVidWdfY2xpX2lucHV0OworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInJlc2V0X2FwaV9jYXB0dXJlIiBncm91cCBvZiAiZGVidWciIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2RlYnVnX3Jlc2V0X2FwaV9jYXB0dXJlCit7CisgICAgYmNtb2x0X29wZXIgaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9kZWJ1Z19rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X2RlYnVnX3Jlc2V0X2FwaV9jYXB0dXJlOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXJ0X2FwaV9jYXB0dXJlIiBncm91cCBvZiAiZGVidWciIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2RlYnVnX3N0YXJ0X2FwaV9jYXB0dXJlCit7CisgICAgYmNtb2x0X29wZXIgaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9kZWJ1Z19rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X2RlYnVnX3N0YXJ0X2FwaV9jYXB0dXJlOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0b3BfYXBpX2NhcHR1cmUiIGdyb3VwIG9mICJkZWJ1ZyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2RlYnVnX3N0b3BfYXBpX2NhcHR1cmUKK3sKKyAgICBiY21vbHRfb3BlciBoZHI7ICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2RlYnVnX2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworfSBiY21vbHRfZGVidWdfc3RvcF9hcGlfY2FwdHVyZTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleSIgZ3JvdXAgb2YgdGhlICJkZXZpY2UiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9kZXZpY2Vfa2V5Cit7CisgICAgdWludDMyX3QgcmVzZXJ2ZWQ7ICAvKio8IFJlc2VydmVkIChzZXQgdG8gMCkuICovCit9IGJjbW9sdF9kZXZpY2Vfa2V5OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiY2ZnIiBncm91cCBvZiB0aGUgImRldmljZSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2RldmljZV9jZmdfZGF0YQoreworICAgIGJjbW9sdF9zeXN0ZW1fbW9kZSBzeXN0ZW1fbW9kZTsgLyoqPCBTeXN0ZW0gbW9kZSAtIHRoaXMgbXVzdCBiZSBzZXQgYnkgdGhlIGhvc3Qgd2hlbiBpbml0aWFsbHkgcHJvdmlzaW9uaW5nIHRoZSBzeXN0ZW0uICBTZXR0aW5nIHRoaXMgYWxzbyBzZXRzIHRoZSAibm5pX3NwZWVkIiBwcm9wZXJ0eSwgdW5sZXNzIGl0IGlzIG92ZXJyaWRkZW4uICovCisgICAgdWludDMyX3Qga2VlcGFsaXZlX2ludGVydmFsOyAgICAvKio8IEtlZXBhbGl2ZSBJbnRlcnZhbCBpbiBTZWNvbmRzICAoMCA9IERpc2FibGUpICovCisgICAgdWludDMyX3Qga2VlcGFsaXZlX3RvbGVyYW5jZTsgICAvKio8IEhvdyBtYW55IGtlZXBhbGl2ZSBtZXNzYWdlcyBjYW4gYmUgbG9zdCBiZWZvcmUgdHJpZ2dlcmluZyBhIGRpc2Nvbm5lY3Qgc2VxdWVuY2UgICovCisgICAgYmNtb2x0X2Zpcm13YXJlX3N3X3ZlcnNpb24gZmlybXdhcmVfc3dfdmVyc2lvbjsgICAgICAgICAgICAgLyoqPCBGaXJtd2FyZSBTVyBWZXJzaW9uICovCisgICAgYmNtb2x0X2hvc3Rfc3dfdmVyc2lvbiBob3N0X3N3X3ZlcnNpb247ICAgICAgICAgICAgICAgICAgICAgLyoqPCBIb3N0IFNXIFZlcnNpb24gKi8KKyAgICBiY21vbHRfZGV2aWNlX2NoaXBfcmV2aXNpb24gY2hpcF9yZXZpc2lvbjsgICAgICAgICAgICAgICAgICAvKio8IFJldmlzaW9uIG9mIHRoZSBCQ002ODYyMCBkZXZpY2UuICovCisgICAgYmNtb2x0X2RldmljZV9zdGF0ZSBzdGF0ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBEZXZpY2Ugc3RhdGUgKi8KKyAgICBiY21vbHRfZGVidWdfZGV2aWNlX2NmZyBkZWJ1ZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IERldmljZSBjb25maWd1cmF0aW9uIGRlYnVnIHBhcmFtZXRlcnMgKi8KKyAgICBiY21vbHRfZGV2aWNlX25uaV9zcGVlZCBubmlfc3BlZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFNwZWVkIG9mIHRoZSBOTkkgaW50ZXJmYWNlLiAgVGhpcyBpcyBjYWxjdWxhdGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgInN5c3RlbV9tb2RlIiBwcm9wZXJ0eSBpcyBzZXQsIGJ1dCBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgaG9zdC4gKi8KKyAgICBiY21vbHRfZXh0X2lycSBwcm90ZWN0aW9uX3N3aXRjaGluZ19leHRfaXJxOyAgICAgICAgICAgICAgICAvKio8IFRoZSBzZWxlY3RlZCBleHRlcm5hbCBJUlEgZm9yIHByb3RlY3Rpb24gc3dpdGNoaW5nICovCisgICAgdWludDMyX3QgZXBvbl9jbG9ja190cmFuc3BvcnRfc2FtcGxlX2RlbGF5OyAgICAgICAgICAgICAgICAgLyoqPCBUaGUgdGltZSAoaW4gVFEpIHRoYXQgaXQgdGFrZXMgZnJvbSB3aGVuIGEgcHVsc2UgaXMgZ2VuZXJhdGVkIGF0IHRoZSBleHRlcm5hbCBzb3VyY2UgdG8gd2hlbiB3ZSBzYW1wbGUgaXQuICovCisgICAgYmNtb2x0X2luZGljYXRpb25fc2hhcGluZyBpbmRpY2F0aW9uX3NoYXBpbmc7ICAgICAgICAgICAgICAgLyoqPCBTaGFwaW5nIC8gcmF0ZSBsaW1pdGluZyBmb3IgdGhlIGluZGljYXRpb24gY2hhbm5lbC4gKi8KKyAgICB1aW50MzJfdCBjaGlwX3RlbXBlcmF0dXJlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEN1cnJlbnQgZGllIHRlbXBlcmF0dXJlLiAqLworICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIGdwb25feGdwb25fdG9kX2VuYWJsZTsgICAgICAgICAgICAgICAgIC8qKjwgR1BPTi9YR1BPTiBUb0QgY29udHJvbCBzdGF0ZSAqLworICAgIGJjbW9sdF9ncGlvX3BpbiBncG9uX3hncG9uX3RvZF9ncGlvX3BpbjsgICAgICAgICAgICAgICAgICAgIC8qKjwgR1BPTi9YR1BPTiBUb0QgR0lPIHBpbiAqLworICAgIGJjbW9zX2Jvb2wgZ3Bvbl94Z3Bvbl90b2RfY29ubmVjdGVkX2ludGVybmFsbHk7ICAgICAgICAgICAgIC8qKjwgR1BPTi9YR1BPTiBpcyBUb0QgaW50ZXJuYWxseSAqLworICAgIGJjbW9sdF9zdHJfMjU2IGVwb25fODAyMV9hc190b2RfZm9ybWF0OyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVGhlIGZvcm1hdCBvZiB0aGUgODAyLjFBUyBUb0Qgc3RyaW5nLiAqLworICAgIGJjbW9sdF9zaGFwZXJfbW9kZSBlcG9uX3NoYXBlcl9tb2RlOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQ29udHJvbHMgRVBPTiBzaGFwZXIgYmVoYXZpb3IuICovCisgICAgYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5X2xpc3RfdTggZW1iZWRkZWRfaW1hZ2VfbGlzdDsgICAgLyoqPCBMaXN0IG9mIGFsbCBmaWxlIGltYWdlcyBzdG9yZWQgaW4gdGhlIE9MVC4gKi8KKyAgICB1aW50MzJfdCBjaGlwX3ZvbHRhZ2U7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQ2hpcCB2b2x0YWdlIGluIG1WICovCisgICAgYmNtb2x0X3N0cl8yNTYgZXBvbl90b2Rfc3RyaW5nOyAgICAgICAgICAgICAvKio8IFRoZSBjdXJyZW50IFRvRCBzdHJpbmcgdG8gYmUgdXNlZCBmb3IgY2xvY2sgdHJhbnNwb3J0IChFUE9OIG9ubHkpLiAqLworICAgIGJjbW9sdF94Z3Bvbl9udW1fb2Zfb251cyB4Z3Bvbl9udW1fb2Zfb251czsgLyoqPCB4Z3BvbiBudW0gb2Ygb251cy4gKi8KKyAgICBiY21vc19pcHY0X2FkZHJlc3MgZGV2aWNlX2lwX2FkZHJlc3M7ICAgICAgIC8qKjwgVGhlIElQIEFkZHJlc3Mgb2YgdGhlIGRldmljZSAqLworICAgIHVpbnQxNl90IGRldmljZV91ZHBfcG9ydDsgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgVURQIHBvcnQgb2YgdGhlIERldmljZSAqLworICAgIGJjbW9sdF91YXJ0X2JhdWRyYXRlIHRvZF91YXJ0X2JhdWRyYXRlOyAgICAgLyoqPCBVQVJUIGJhdWQgcmF0ZSAqLworICAgIHVpbnQ4X3QgZ3Bvbl94Z3Bvbl90b2Rfc3RyaW5nX2xlbmd0aDsgICAgICAgLyoqPCBHUE9OL1hHUE9OIFRvRCBzdHJpbmcgbGVuZ3RoICovCit9IGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiY2ZnIiBncm91cCBvZiAiZGV2aWNlIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZGV2aWNlX2NmZworeworICAgIGJjbW9sdF9jZmcgaGRyOyAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGtleTsgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZGV2aWNlX2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNvbm5lY3Rpb25fY29tcGxldGUiIGdyb3VwIG9mIHRoZSAiZGV2aWNlIiAKKyAqIG9iamVjdC4gCisgKgorICogVGhlIGhvc3Qgc3VjY2Vzc2Z1bGx5IGNvbm5lY3RlZCB0byB0aGUgZGV2aWNlLiAgVGhlIGRldmljZSBoYXMgZWl0aGVyIGJlZW4gCisgKiByZXByb2dyYW1tZWQgd2l0aCBuZXcgZmlybXdhcmUsIG9yIGEgY29ubmVjdGlvbiB3YXMgZXN0YWJsaXNoZWQgd2l0aCBhbiAKKyAqIGV4aXN0aW5nIGRldmljZSAoc2VlIHRoZSAic3RhbmRhbG9uZSIgZmllbGQpLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2RhdGEKK3sKKyAgICBiY21vc19ib29sIHN0YW5kYWxvbmU7ICAvKio8IElmIHRydWUsIHRoZSBkZXZpY2Ugd2FzIHByZXZpb3VzbHkgcnVubmluZyBpbiBzdGFuZGFsb25lIG1vZGUgYmVmb3JlIHRoaXMgY29ubmVjdGlvbiB3YXMgZXN0YWJsaXNoZWQuICBJZiBmYWxzZSwgdGhlIGRldmljZSB3YXMgYm9vdGVkIGZyb20gcmVzZXQgd2l0aCBuZXcgZmlybXdhcmUsIGV0Yy4gKi8KK30gYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiY29ubmVjdGlvbl9jb21wbGV0ZSIgZ3JvdXAgb2YgImRldmljZSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGUKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2RldmljZV9rZXkga2V5OyAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9kYXRhIGRhdGE7ICAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImNvbm5lY3Rpb25fZXN0YWJsaXNoZWQiIGdyb3VwIG9mICJkZXZpY2UiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2VzdGFibGlzaGVkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGtleTsgIC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2VzdGFibGlzaGVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiY29ubmVjdGlvbl9mYWlsdXJlIiBncm91cCBvZiB0aGUgImRldmljZSIgCisgKiBvYmplY3QuIAorICoKKyAqIFRoZSBob3N0IGZhaWxlZCB0byBjb25uZWN0IHRvIHRoZSBkZXZpY2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9kYXRhCit7CisgICAgYmNtb2x0X2hvc3RfY29ubmVjdGlvbl9mYWlsX3JlYXNvbiByZWFzb247ICAvKio8IENvbm5lY3Rpb24gZmFpbCByZWFzb24uICovCit9IGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiY29ubmVjdGlvbl9mYWlsdXJlIiBncm91cCBvZiAiZGV2aWNlIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGtleTsgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmU7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJkZHJfdGVzdF9jb21wbGV0ZSIgZ3JvdXAgb2YgdGhlICJkZXZpY2UiIAorICogb2JqZWN0LiAKKyAqCisgKiBUaGUgRERSIFRlc3QgaGFzIGNvbXBsZXRlZCAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9kYXRhCit7CisgICAgYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZCBkZHJfdGVzdDsgLyoqPCBSZXN1bHRzIG9mIHRoZSBERFIgVGVzdCAqLworfSBiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiZGRyX3Rlc3RfY29tcGxldGUiIGdyb3VwIG9mICJkZXZpY2UiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZQoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZGV2aWNlX2tleSBrZXk7ICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGU7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJkZXZpY2Vfa2VlcF9hbGl2ZSIgZ3JvdXAgb2YgdGhlICJkZXZpY2UiIAorICogb2JqZWN0LiAKKyAqCisgKiBLZWVwIGFsaXZlIG1lc3NhZ2UgZnJvbSB0aGUgZGV2aWNlIHRvIHRoZSBob3N0IC0gdXNlZCBieSB0aGUgZGV2aWNlIGNvbnRyb2wgCisgKiBsaWJyYXJ5IChub3Qgc2VudCB0byB0aGUgaG9zdCBhcHBsaWNhdGlvbikuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGEKK3sKKyAgICB1aW50MzJfdCBzZXF1ZW5jZV9udW1iZXI7ICAgLyoqPCBzZXF1ZW5jZSBudW1iZXIgKi8KKyAgICB1aW50MzJfdCB0aW1lX3N0YW1wOyAgICAgICAgLyoqPCB0aW1lIHN0YW1wICovCit9IGJjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJkZXZpY2Vfa2VlcF9hbGl2ZSIgZ3JvdXAgb2YgImRldmljZSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGtleTsgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImRldmljZV9yZWFkeSIgZ3JvdXAgb2YgdGhlICJkZXZpY2UiIG9iamVjdC4gCisgKgorICogRGV2aWNlIHJlYWR5IGluZGljYXRpb24gdXNlZCBieSB0aGUgZGV2aWNlIGNvbnRyb2wgbGlicmFyeSAobm90IHNlbnQgdG8gdGhlIAorICogaG9zdCBhcHBsaWNhdGlvbikuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9kYXRhCit7CisgICAgYmNtb2x0X2Zpcm13YXJlX3N3X3ZlcnNpb24gZmlybXdhcmVfc3dfdmVyc2lvbjsgLyoqPCBTb2Z0d2FyZSBWZXJzaW9uLiAqLworICAgIGJjbW9sdF9zeXN0ZW1fbW9kZSBzeXN0ZW1fbW9kZTsgICAgICAgICAgICAgICAgIC8qKjwgU3lzdGVtIE1vZGUuICovCisgICAgYmNtb2x0X2RldmljZV9ubmlfc3BlZWQgbm5pX3NwZWVkOyAgICAgICAgICAgICAgLyoqPCBOTkkgU3BlZWQuICovCisgICAgYmNtb2x0X2RldmljZV9jaGlwX3JldmlzaW9uIGNoaXBfcmV2aXNpb247ICAgICAgLyoqPCBDaGlwIFJldmlzaW9uLiAqLworICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIHRvZF9lbmFibGU7ICAgICAgICAgICAgICAgIC8qKjwgVG9EIGNvbnRyb2wuICovCisgICAgYmNtb2x0X2dwaW9fcGluIHRvZF9ncGlvX3BpbjsgICAgICAgICAgICAgICAgICAgLyoqPCBHUElPIHBpbiBpcyB1c2VkIHdoZW4gVG9EIFVBUlQgaXMgbm90IGNvbm5lY3RlZCB0byB0aGUgZW1iZWRkZWQsIGFuZCBUT0QgdmFsdWUgaXMgb2J0YWluZWQgYnkgdGhlIGhvc3QuICovCit9IGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiZGV2aWNlX3JlYWR5IiBncm91cCBvZiAiZGV2aWNlIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeQoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2RldmljZV9rZXkga2V5OyAgICAgICAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJkaXNjb25uZWN0aW9uX2NvbXBsZXRlIiBncm91cCBvZiAiZGV2aWNlIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9kZXZpY2VfZGlzY29ubmVjdGlvbl9jb21wbGV0ZQoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZGV2aWNlX2tleSBrZXk7ICAvKio8IE9iamVjdCBrZXkuICovCit9IGJjbW9sdF9kZXZpY2VfZGlzY29ubmVjdGlvbl9jb21wbGV0ZTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImltYWdlX3RyYW5zZmVyX2NvbXBsZXRlIiBncm91cCBvZiB0aGUgImRldmljZSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2RhdGEKK3sKKyAgICBiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgaW1hZ2VfdHlwZTsgICAgLyoqPCBJbWFnZSB0eXBlLiAqLworICAgIHVpbnQzMl90IGJsb2NrX251bWJlcjsgICAgICAgICAgICAgICAgICAvKio8IEJsb2NrIG51bWJlci4gKi8KKyAgICBiY21vbHRfaW1hZ2VfdHJhbnNmZXJfc3RhdHVzIHN0YXR1czsgICAgLyoqPCBJbWFnZSB0cmFuc2ZlciBzdGF0dXMuICovCit9IGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJpbWFnZV90cmFuc2Zlcl9jb21wbGV0ZSIgZ3JvdXAgb2YgImRldmljZSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGtleTsgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiaW5kaWNhdGlvbnNfZHJvcHBlZCIgZ3JvdXAgb2YgdGhlICJkZXZpY2UiIAorICogb2JqZWN0LiAKKyAqCisgKiBTZW50IHdoZW4gaW5kaWNhdGlvbnMgYXJlIGRyb3BwZWQgZHVlIHRvIGNvbmdlc3Rpb24gLyBzaGFwaW5nLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2RhdGEKK3sKKyAgICB1aW50MzJfdCB0b3RhbF9jb3VudDsgICAvKio8IFRvdGFsIG51bWJlciBvZiBpbmRpY2F0aW9ucyBkcm9wcGVkIHNpbmNlIHRoZSBzeXN0ZW0gd2FzIHN0YXJ0ZWQuICovCit9IGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImluZGljYXRpb25zX2Ryb3BwZWQiIGdyb3VwIG9mICJkZXZpY2UiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGtleTsgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWRfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN3X2Vycm9yIiBncm91cCBvZiB0aGUgImRldmljZSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2RldmljZV9zd19lcnJvcl9kYXRhCit7CisgICAgYmNtb2x0X3N0cl8xMDAgdGFza19uYW1lOyAgIC8qKjwgdGFzayBuYW1lLiAqLworICAgIGJjbW9sdF9zdHJfMTAwIGZpbGVfbmFtZTsgICAvKio8IGZpbGUgbmFtZS4gKi8KKyAgICB1aW50MzJfdCBsaW5lX251bWJlcjsgICAgICAgLyoqPCBsaW5lIG51bWJlci4gKi8KKyAgICB1aW50OF90IHBvbl9uaTsgICAgICAgICAgICAgLyoqPCBwb25fbmkuICovCit9IGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzd19lcnJvciIgZ3JvdXAgb2YgImRldmljZSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2RldmljZV9zd19lcnJvcgoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZGV2aWNlX2tleSBrZXk7ICAgICAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2RldmljZV9zd19lcnJvcl9kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZGV2aWNlX3N3X2Vycm9yOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3dfZXhjZXB0aW9uIiBncm91cCBvZiB0aGUgImRldmljZSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25fZGF0YQoreworICAgIHVpbnQ4X3QgY3B1X2lkOyAgICAgICAgIC8qKjwgQ1BVIElELiAqLworICAgIGJjbW9sdF9zdHJfMjAwMCB0ZXh0OyAgIC8qKjwgdGV4dC4gKi8KK30gYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25fZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzd19leGNlcHRpb24iIGdyb3VwIG9mICJkZXZpY2UiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGtleTsgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbjsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImF1dG9fY2ZnIiBncm91cCBvZiB0aGUgImRldmljZSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2RldmljZV9hdXRvX2NmZ19kYXRhCit7CisgICAgYmNtb3NfYm9vbCBjb25uZWN0aW9uX2NvbXBsZXRlOyAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJjb25uZWN0aW9uX2NvbXBsZXRlIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIGNvbm5lY3Rpb25fZXN0YWJsaXNoZWQ7ICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImNvbm5lY3Rpb25fZXN0YWJsaXNoZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgY29ubmVjdGlvbl9mYWlsdXJlOyAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAiY29ubmVjdGlvbl9mYWlsdXJlIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIGRkcl90ZXN0X2NvbXBsZXRlOyAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImRkcl90ZXN0X2NvbXBsZXRlIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIGRldmljZV9rZWVwX2FsaXZlOyAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImRldmljZV9rZWVwX2FsaXZlIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIGRldmljZV9yZWFkeTsgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImRldmljZV9yZWFkeSIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBkaXNjb25uZWN0aW9uX2NvbXBsZXRlOyAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJkaXNjb25uZWN0aW9uX2NvbXBsZXRlIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIGltYWdlX3RyYW5zZmVyX2NvbXBsZXRlOyAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImltYWdlX3RyYW5zZmVyX2NvbXBsZXRlIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIGluZGljYXRpb25zX2Ryb3BwZWQ7ICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImluZGljYXRpb25zX2Ryb3BwZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgc3dfZXJyb3I7ICAgICAgICAgICAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAic3dfZXJyb3IiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgc3dfZXhjZXB0aW9uOyAgICAgICAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAic3dfZXhjZXB0aW9uIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KK30gYmNtb2x0X2RldmljZV9hdXRvX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImF1dG9fY2ZnIiBncm91cCBvZiAiZGV2aWNlIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnCit7CisgICAgYmNtb2x0X2F1dG9fY2ZnIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGtleTsgICAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9kZXZpY2VfYXV0b19jZmc7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiY29ubmVjdCIgZ3JvdXAgb2YgImRldmljZSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2RldmljZV9jb25uZWN0Cit7CisgICAgYmNtb2x0X29wZXIgaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGtleTsgIC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X2RldmljZV9jb25uZWN0OworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImRpc2Nvbm5lY3QiIGdyb3VwIG9mICJkZXZpY2UiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9kZXZpY2VfZGlzY29ubmVjdAoreworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZGV2aWNlX2tleSBrZXk7ICAvKio8IE9iamVjdCBrZXkuICovCit9IGJjbW9sdF9kZXZpY2VfZGlzY29ubmVjdDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImhvc3Rfa2VlcF9hbGl2ZSIgZ3JvdXAgb2YgdGhlICJkZXZpY2UiIG9iamVjdC4gCisgKgorICogS2VlcCBhbGl2ZSBtZXNzYWdlIGZyb20gdGhlIGhvc3QgdG8gdGhlIGRldmljZSAtIHVzZWQgYnkgdGhlIGRldmljZSBjb250cm9sIAorICogbGlicmFyeSAoc2hvdWxkIG5vdCBiZSBzZW50IGJ5IHRoZSBob3N0IGFwcGxpY2F0aW9uKS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2RhdGEKK3sKKyAgICB1aW50MzJfdCBzZXF1ZW5jZV9udW1iZXI7ICAgLyoqPCBzZXF1ZW5jZSBudW1iZXIgKi8KKyAgICB1aW50MzJfdCB0aW1lX3N0YW1wOyAgICAgICAgLyoqPCB0aW1lIHN0YW1wICovCit9IGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiaG9zdF9rZWVwX2FsaXZlIiBncm91cCBvZiAiZGV2aWNlIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZQoreworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZGV2aWNlX2tleSBrZXk7ICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiaW1hZ2VfdHJhbnNmZXJfZGF0YSIgZ3JvdXAgb2YgdGhlICJkZXZpY2UiIAorICogb2JqZWN0LiAKKyAqCisgKiB1c2VkIGZvciB0cmFuc2ZlcnJpbmcgdGhlIGFjdHVhbCBkYXRhIGZyb20vdG8gdGhlIE9MVC4gICBub3QgdG8gYmUgZGlyZWN0bHkgCisgKiBjYWxsZWQgYnkgdGhlIHVzZXIuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfZGF0YQoreworICAgIHVpbnQzMl90IGJsb2NrX251bWJlcjsgICAgICAgICAgLyoqPCBCbG9jayBudW1iZXIuICovCisgICAgYmNtb3NfYm9vbCBtb3JlX2RhdGE7ICAgICAgICAgICAvKio8IFNwZWNpZmllcyB0aGF0IHRoZXJlIGFyZSBtb3JlIGRhdGEgdG8gY29tZS4gKi8KKyAgICBiY21vbHRfdThfbGlzdF91MTZfaGV4IGRhdGE7ICAgIC8qKjwgRGF0YS4gKi8KK30gYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiaW1hZ2VfdHJhbnNmZXJfZGF0YSIgZ3JvdXAgb2YgImRldmljZSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGEKK3sKKyAgICBiY21vbHRfb3BlciBoZHI7ICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2RldmljZV9rZXkga2V5OyAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9kYXRhIGRhdGE7ICAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiaW1hZ2VfdHJhbnNmZXJfc3RhcnQiIGdyb3VwIG9mIHRoZSAiZGV2aWNlIiAKKyAqIG9iamVjdC4gCisgKgorICogVGhpcyBBUEkgbWVzc2FnZSBpbmZvcm1zIHRoZSBPTFQgb2YgdGhlIHN0YXJ0IG9mIGltYWdlIHRyYW5zZmVyLCBhbmQgCisgKiBwcm92aWRlcyB0aGUgaW5mb3JtYXRpb24gb2YgdGhlIGZpbGUgaW1hZ2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2RhdGEKK3sKKyAgICBiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgaW1hZ2VfdHlwZTsgICAgLyoqPCBGaWxlIHR5cGUuICovCisgICAgdWludDMyX3QgaW1hZ2Vfc2l6ZTsgICAgICAgICAgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGUgZmlsZSBpbWFnZS4gIElnbm9yZWQgZm9yIFJSUSBvcGVyYXRpb24uICovCisgICAgdWludDMyX3QgY3JjMzI7ICAgICAgICAgICAgIC8qKjwgQ1JDMzIgY2hlY2tzdW0gb2YgdGhlIGVudGlyZSBmaWxlIGltYWdlLiAqLworICAgIGJjbW9sdF9zdHJfNjQgaW1hZ2VfbmFtZTsgICAvKio8IE5hbWUgb2YgdGhlIGZpbGUgaW1hZ2UuICBOdWxsLXRlcm1pbmF0ZWQgc3RyaW5nLiAgVGhpcyBpcyByZXF1aXJlZCBmb3IgdGhlIERQb0UgT05VIG9ubHkuICBEUG9FIHJlcXVpcmVzIHRoZSB3cml0ZSByZXF1ZXN0IE9BTSBjb250YWlucyB0aGUgbmFtZSBvZiB0aGUgZmlsZS4gKi8KK30gYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImltYWdlX3RyYW5zZmVyX3N0YXJ0IiBncm91cCBvZiAiZGV2aWNlIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnQKK3sKKyAgICBiY21vbHRfb3BlciBoZHI7ICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2RldmljZV9rZXkga2V5OyAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInJlc2V0IiBncm91cCBvZiB0aGUgImRldmljZSIgb2JqZWN0LiAKKyAqCisgKiBSZXNldHMgdGhlIGhvc3QvZGV2aWNlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2RldmljZV9yZXNldF9kYXRhCit7CisgICAgYmNtb2x0X2RldmljZV9yZXNldF9tb2RlIG1vZGU7ICAvKio8IE9wdGlvbnMgdG8gY29udHJvbCB3aGF0IHNob3VsZCBiZSByZXNldC4gKi8KK30gYmNtb2x0X2RldmljZV9yZXNldF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInJlc2V0IiBncm91cCBvZiAiZGV2aWNlIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZGV2aWNlX3Jlc2V0Cit7CisgICAgYmNtb2x0X29wZXIgaGRyOyAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2RldmljZV9rZXkga2V5OyAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2RldmljZV9yZXNldF9kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9kZXZpY2VfcmVzZXQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJydW5fZGRyX3Rlc3QiIGdyb3VwIG9mIHRoZSAiZGV2aWNlIiBvYmplY3QuIAorICoKKyAqIFJ1biBhIHRlc3Qgb24gb25lIG9yIG1vcmUgb2YgdGhlIEREUiBjb21wb25lbnRzLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfZGF0YQoreworICAgIGJjbW9zX2Jvb2wgY3B1OyAgICAgLyoqPCBXaGV0aGVyIG9yIG5vdCB0byB0ZXN0IHRoZSBDUFUgRERSICovCisgICAgYmNtb3NfYm9vbCByYXNfMDsgICAvKio8IFdoZXRoZXIgb3Igbm90IHRvIHRlc3QgUkFTIDAgRERSICovCisgICAgYmNtb3NfYm9vbCByYXNfMTsgICAvKio8IFdoZXRoZXIgb3Igbm90IHRvIHRlc3QgUkFTIDEgRERSICovCit9IGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAicnVuX2Rkcl90ZXN0IiBncm91cCBvZiAiZGV2aWNlIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdAoreworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZGV2aWNlX2tleSBrZXk7ICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3Q7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3dfdXBncmFkZV9hY3RpdmF0ZSIgZ3JvdXAgb2YgImRldmljZSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZGV2aWNlX3N3X3VwZ3JhZGVfYWN0aXZhdGUKK3sKKyAgICBiY21vbHRfb3BlciBoZHI7ICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2RldmljZV9rZXkga2V5OyAgLyoqPCBPYmplY3Qga2V5LiAqLworfSBiY21vbHRfZGV2aWNlX3N3X3VwZ3JhZGVfYWN0aXZhdGU7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJrZXkiIGdyb3VwIG9mIHRoZSAiZXBvbl9kZW5pZWRfbGluayIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5Cit7CisgICAgYmNtb2x0X2Vwb25fbmkgZXBvbl9uaTsgICAgICAgICAvKio8IFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEVQT04gTkkgY29udGFpbmluZyB0aGUgbGluay4gKi8KKyAgICBiY21vc19tYWNfYWRkcmVzcyBtYWNfYWRkcmVzczsgIC8qKjwgVGhlIE1BQyBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgRVBPTiBsaW5rLiAqLworfSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXk7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJjZmciIGdyb3VwIG9mIHRoZSAiZXBvbl9kZW5pZWRfbGluayIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2RhdGEKK3sKKyAgICBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hbGFybV9zdGF0ZSBhbGFybV9zdGF0ZTsgICAgLyoqPCBUaGUgc3RhdGUgb2YgdGhlIGFsYXJtcyBvbiB0aGlzIGxpbmsuICovCit9IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImNmZyIgZ3JvdXAgb2YgImVwb25fZGVuaWVkX2xpbmsiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZworeworICAgIGJjbW9sdF9jZmcgaGRyOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAibGFzZXJfb25fb2ZmX3Zpb2xhdGlvbiIgZ3JvdXAgb2YgdGhlIAorICogImVwb25fZGVuaWVkX2xpbmsiIG9iamVjdC4gCisgKgorICogVGhpcyBpcyB3aGVuIGEgbGluayB0cmllcyB0byByZWlnc3RlciB3aXRoIGFuIGltcG9zc2libGUgbGFzZXIgb24gb3Igb2ZmIAorICogdGltZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fZGF0YQoreworICAgIGJjbW9sdF9sYXNlcl9vbl9vZmZfc3RhdHVzIGFsYXJtX3N0YXR1czsgICAgLyoqPCBBbGFybSBTdGF0dXMuICovCit9IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJsYXNlcl9vbl9vZmZfdmlvbGF0aW9uIiBncm91cCBvZiAKKyAqICJlcG9uX2RlbmllZF9saW5rIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uX2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb247CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJsbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uIiBncm91cCBvZiB0aGUgCisgKiAiZXBvbl9kZW5pZWRfbGluayIgb2JqZWN0LiAKKyAqCisgKiBBIGxpbmsgdHJpZWQgdG8gcmVnaXN0ZXIgYW5kIGl0IHRoZXJlIGFyZSBubyBMTElEcyBhdmFpbGFibGUuIElmIHRoaXMgCisgKiBvY2N1cnMsIGl0IGlzIHBvc3NpYmxlIHRoZXJlIGlzIGFuIGlzc3VlIHdpdGggeW91ciAnbWF4IGxpbmtzJyBhbmQvb3IgJ0Jhc2UgCisgKiBMTElEJyBmaWVsZHMgb24geW91ciBSUC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb25fZGF0YQoreworICAgIGJjbW9sdF9zdGF0dXMgYWxhcm1fc3RhdHVzOyAvKio8IEFsYXJtIFN0YXR1cy4gKi8KK30gYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImxsaWRfcG9vbF9lbXB0eV92aW9sYXRpb24iIGdyb3VwIG9mIAorICogImVwb25fZGVuaWVkX2xpbmsiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb24KK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5IGtleTsgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb25fZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb247CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJtYXhfbGlua192aW9sYXRpb24iIGdyb3VwIG9mIHRoZSAKKyAqICJlcG9uX2RlbmllZF9saW5rIiBvYmplY3QuIAorICoKKyAqIEEgbGluayB0cmllZCB0byByZWdpc3RlciBhbmQgaXQgd291bGQgaGF2ZSBwdXQgdXMgb3ZlciB0aGUgcHJvdmlzaW9uZWQgbWF4IAorICogbGlua3MgZm9yIHRoZSBjb3JyZXNwb25kaW5nIEVQT04gTkkuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25fZGF0YQoreworICAgIGJjbW9sdF9zdGF0dXMgYWxhcm1fc3RhdHVzOyAvKio8IEFsYXJtIFN0YXR1cy4gKi8KK30gYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAibWF4X2xpbmtfdmlvbGF0aW9uIiBncm91cCBvZiAKKyAqICJlcG9uX2RlbmllZF9saW5rIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb24KK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5IGtleTsgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb247CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJvdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbiIgZ3JvdXAgb2YgdGhlIAorICogImVwb25fZGVuaWVkX2xpbmsiIG9iamVjdC4gCisgKgorICogVGhpcyBpcyB3aGVuIGxpbmsgdHJpZXMgdG8gcmVnaXN0ZXIgYW5kIHRoZXJlIGFyZSBhbHJlYWR5IHRvbyBtYW55IGV4aXN0aW5nIAorICogbGFzZXIgb24vb2ZmIGNvbWJpbmF0aW9ucy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2RhdGEKK3sKKyAgICBiY21vbHRfc3RhdHVzIGFsYXJtX3N0YXR1czsgLyoqPCBBbGFybSBzdGF0dXMuICovCit9IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAib3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb24iIGdyb3VwIG9mIAorICogImVwb25fZGVuaWVkX2xpbmsiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbjsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInJhbmdlX3Zpb2xhdGlvbiIgZ3JvdXAgb2YgdGhlIAorICogImVwb25fZGVuaWVkX2xpbmsiIG9iamVjdC4gCisgKgorICogQSBsaW5rIHRyaWVkIHRvIHJlZ2lzdGVyIHdpdGggYSByYW5nZSB2YWx1ZSB0aGF0IHdhcyBvdXRzaWRlIG9mIHRoZSBtaW4vbWF4IAorICogZmliZXIgbGVuZ3RoLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uX2RhdGEKK3sKKyAgICBiY21vbHRfcmFuZ2Vfc3RhdHVzIGFsYXJtX3N0YXR1czsgICAvKio8IEFsYXJtIFN0YXR1cy4gKi8KK30gYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAicmFuZ2VfdmlvbGF0aW9uIiBncm91cCBvZiAKKyAqICJlcG9uX2RlbmllZF9saW5rIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb24KK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5IGtleTsgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbjsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInJvZ3VlX3Zpb2xhdGlvbiIgZ3JvdXAgb2YgdGhlIAorICogImVwb25fZGVuaWVkX2xpbmsiIG9iamVjdC4gCisgKgorICogQSBSb2d1ZSBPTlUgd2FzIGRldGVjdGVkIG9uIHRoaXMgbGluay9MTElELiAgCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9kYXRhCit7CisgICAgYmNtb2x0X3JvZ3VlX3N0YXR1cyBhbGFybV9zdGF0dXM7ICAgLyoqPCBBbGFybSBTdGF0dXMuICovCit9IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInJvZ3VlX3Zpb2xhdGlvbiIgZ3JvdXAgb2YgCisgKiAiZXBvbl9kZW5pZWRfbGluayIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25fZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb247CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uIiBncm91cCBvZiB0aGUgCisgKiAiZXBvbl9kZW5pZWRfbGluayIgb2JqZWN0LiAKKyAqCisgKiBBIGxpbmsgdHJpZWQgdG8gcmVnaXN0ZXIgYW5kIHdlIHdlcmUgdW5hYmxlIHRvIGFsbG9jYXRlIHN5c3RlbSByZXNvdXJjZXMgZm9yIAorICogaXQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2RhdGEKK3sKKyAgICBiY21vbHRfc3RhdHVzIGFsYXJtX3N0YXR1czsgLyoqPCBBbGFybSBTdGF0dXMuICovCit9IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25fZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uIiBncm91cCBvZiAKKyAqICJlcG9uX2RlbmllZF9saW5rIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAidGRtX2NoYW5uZWxzX2V4aGF1c3RlZCIgZ3JvdXAgb2YgdGhlIAorICogImVwb25fZGVuaWVkX2xpbmsiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfZGF0YQoreworICAgIGJjbW9sdF9zdGF0dXMgYWxhcm1fc3RhdHVzOyAvKio8IEFsYXJtIFN0YXR1cy4gKi8KK30gYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInRkbV9jaGFubmVsc19leGhhdXN0ZWQiIGdyb3VwIG9mIAorICogImVwb25fZGVuaWVkX2xpbmsiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5IGtleTsgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInVua25vd25fbGlua192aW9sYXRpb24iIGdyb3VwIG9mIHRoZSAKKyAqICJlcG9uX2RlbmllZF9saW5rIiBvYmplY3QuIAorICoKKyAqIEEgbGluayB0cmllZCB0byByZWdpc3RlciB3aGlsZSB0aGUgUE9OIHdhcyBzZXQgdG8gIm5vdGlmeSB1bmtub3duIiAKKyAqIHJlZ2lzdHJhdGlvbiBiZWhhdmlvciBhbmQgdGhpcyBsaW5rIHdhcyBub3QgcHJlLXByb3Zpc2lvbmVkLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9kYXRhCit7CisgICAgYmNtb2x0X3Vua25vd25fbGlua19zdGF0dXMgYWxhcm1fc3RhdHVzOyAgICAvKio8IEFsYXJtIFN0YXR1cy4gKi8KK30gYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInVua25vd25fbGlua192aW9sYXRpb24iIGdyb3VwIG9mIAorICogImVwb25fZGVuaWVkX2xpbmsiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb24KK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5IGtleTsgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb25fZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbjsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInVwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb24iIGdyb3VwIG9mIHRoZSAKKyAqICJlcG9uX2RlbmllZF9saW5rIiBvYmplY3QuIAorICoKKyAqIFRoaXMgbGluayBmYWlsZWQgdG8gcmVnaXN0ZXIgYmVjYXVzZSB0aGVyZSB3YXMgaW5zdWZmaWNpZW50IHVwc3RyZWFtIAorICogYmFuZHdpZHRoIGF2YWlsYWJsZSB0byBwcm92aWRlIHRoZSBkZWZhdWx0IFVCRC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25fZGF0YQoreworICAgIGJjbW9sdF9zdGF0dXMgYWxhcm1fc3RhdHVzOyAvKio8IEFsYXJtIFN0YXR1cy4gKi8KK30gYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbl9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInVwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb24iIGdyb3VwIG9mIAorICogImVwb25fZGVuaWVkX2xpbmsiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb24KK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5IGtleTsgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25fZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb247CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJhdXRvX2NmZyIgZ3JvdXAgb2YgdGhlICJlcG9uX2RlbmllZF9saW5rIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGEKK3sKKyAgICBiY21vc19ib29sIGxhc2VyX29uX29mZl92aW9sYXRpb247ICAgICAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAibGFzZXJfb25fb2ZmX3Zpb2xhdGlvbiIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBsbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uOyAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImxsaWRfcG9vbF9lbXB0eV92aW9sYXRpb24iIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgbWF4X2xpbmtfdmlvbGF0aW9uOyAgICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJtYXhfbGlua192aW9sYXRpb24iIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb247ICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJvdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbiIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCByYW5nZV92aW9sYXRpb247ICAgICAgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInJhbmdlX3Zpb2xhdGlvbiIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCByb2d1ZV92aW9sYXRpb247ICAgICAgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInJvZ3VlX3Zpb2xhdGlvbiIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBzeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uOyAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInN5c3RlbV9yZXNvdXJjZV92aW9sYXRpb24iIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgdGRtX2NoYW5uZWxzX2V4aGF1c3RlZDsgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJ0ZG1fY2hhbm5lbHNfZXhoYXVzdGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHVua25vd25fbGlua192aW9sYXRpb247ICAgICAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAidW5rbm93bl9saW5rX3Zpb2xhdGlvbiIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCB1cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uOyAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInVwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb24iIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworfSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImF1dG9fY2ZnIiBncm91cCBvZiAiZXBvbl9kZW5pZWRfbGluayIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZworeworICAgIGJjbW9sdF9hdXRvX2NmZyBoZHI7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSBrZXk7ICAgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleSIgZ3JvdXAgb2YgdGhlICJlcG9uX2xpbmsiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfa2V5Cit7CisgICAgYmNtb2x0X2Vwb25fbmkgZXBvbl9uaTsgICAgICAgICAvKio8IFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEVQT04gTkkgY29udGFpbmluZyB0aGUgbGluay4gKi8KKyAgICBiY21vc19tYWNfYWRkcmVzcyBtYWNfYWRkcmVzczsgIC8qKjwgVGhlIE1BQyBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgRVBPTiBsaW5rLiAqLworfSBiY21vbHRfZXBvbl9saW5rX2tleTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNmZyIgZ3JvdXAgb2YgdGhlICJlcG9uX2xpbmsiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEKK3sKKyAgICBiY21vbHRfZXBvbl9saW5rX3JhdGUgbGlua19yYXRlOyAgICAgICAgICAgIC8qKjwgVGhpcyBsaW5rJ3MgZG93bnN0cmVhbSBhbmQgdXBzdHJlYW0gcmF0ZS4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX3N0YXRlX2ZsYWdzIHN0YXRlX2ZsYWdzOyAgIC8qKjwgRVBPTiBsaW5rIHN0YXRlIGZsYWdzIHJlZmxlY3QgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBsaW5rLiAgIFJlZ2lzdGVyZWQgc3RhdGUgZmxhZyBpcyBjb250cm9sZWQgYnkgdGhlIHN0YXRpYyByZWdpc3RyYXRpb24gb3BlcmF0aW9uIGZvciBsaW5rcyBvbiBhIHByb3RlY3RlZC1zdGFuZGJ5IFBPTi4gKi8KKyAgICBiY21vbHRfZXBvbl9sbGlkIGxsaWQ7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTExJRCBhc3NvY2lhdGVkIHdpdGggdGhpcyBsaW5rLiAqLworICAgIGJjbW9sdF90aW1lX3F1YW50YSBsYXNlcl9vbl90aW1lX3RxOyAgICAgICAgLyoqPCBMYXNlci1vbiB0aW1lIGluIHRpbWUgcXVhbnRhLiAqLworICAgIGJjbW9sdF90aW1lX3F1YW50YSBsYXNlcl9vZmZfdGltZV90cTsgICAgICAgLyoqPCBMYXNlci1vZmYgdGltZSBpbiB0aW1lIHF1YW50YS4gKi8KKyAgICBiY21vbHRfdGltZV9xdWFudGEgcmFuZ2VfdmFsdWVfdHE7ICAgICAgICAgIC8qKjwgUmFuZ2UgdmFsdWUgdXNlZCBmb3IgdGhpcyBsaW5rIC0gaW4gdGltZSBxdWFudGEuICovCisgICAgYmNtb2x0X21ldGVycyBkaXN0YW5jZTsgICAgICAgICAgICAgICAgICAgICAvKio8IERpc3RhbmNlIHRvIHRoZSBPTlUgKERpZmZlcnMgZnJvbSByYW5nZSB2YWx1ZSBpbiB0aGF0IHRoaXMgaWdub3JlcyBpbnRlcm5hbCBkZWxheXMpICovCisgICAgYmNtb2x0X2Vwb25fbGlua19hbGFybV9zdGF0ZSBhbGFybV9zdGF0ZTsgICAvKio8IFRoZSBzdGF0ZSBvZiB0aGUgYWxhcm1zIG9uIHRoaXMgbGluay4gKi8KKyAgICBiY21vbHRfZXBvbl90dW5uZWxfaWQgdHVubmVsX2lkOyAgICAgICAgICAgIC8qKjwgVXBzdHJlYW0gYW5kIGRvd25zdHJlYW0gdHVubmVsIElEIGZvciB0aGlzIGxpbmsuICovCisgICAgYmNtb2x0X2Vwb25fb251X2lkIG9udV9pZDsgICAgICAgICAgICAgICAgICAvKio8IE9OVSBhc3NvY2lhdGVkIHdpdGggdGhpcyBFUE9OIGxpbmsuICBBIHZhbHVlIG9mIDB4RkYgaW5kaWNhdGVzIHRoYXQgdGhlIGxpbmsgaGFzIG5vdCBiZWVuIGFzc29jaWF0ZWQgd2l0aCBhbiBPTlUuICovCisgICAgYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVycyBtaW5fbGFzZXJfb3ZlcmhlYWQ7ICAgLyoqPCBGb3IgMUcgT05VcyAsdGhlc2UgdmFsdWVzIHdpbGwgb3ZlcnJpZGUgdGhlIHN0YW5kYXJkIHZhbHVlcyBvZiAzMi4gKi8KKyAgICBiY21vbHRfZXBvbl9rZXlfZXhjaGFuZ2VfY29uZmlnIGtleV9leGNoYW5nZV9jb25maWc7ICAgICAgICAvKio8IEVuY3J5cHRpb24ga2V5IGV4Y2hhbmdlIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgbGluay4gKi8KKyAgICBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2NvbmZpZyBlcG9uX2VuY3J5cHRpb247ICAgICAgICAgICAgICAvKio8IEVuY3J5cHRpb24gY29uZmlndXJhdGlvbiBmb3IgdGhpcyBsaW5rLiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfZmVjX2VuIGZlY19lbmFibGU7ICAgICAgICAgICAgICAgICAvKio8IEZFQyBlbmFibGUgc3RhdGUgZm9yIHRoaXMgbGluay4gKi8KKyAgICBiY21vbHRfb2FtX2hlYXJ0YmVhdF9jb25maWcgb2FtX2hlYXJ0YmVhdF9jb25maWc7ICAgLyoqPCBPQU0gaGVhcnRiZWF0IGNvbmZpZ3VyYXRpb24uICBUaGlzIGluY2x1ZGVzIHRoZSBmcmFtZSB0byB0cmFuc21pdCB0byB0aGUgbGluaywgYW5kIHRoZSBleHBlY3RlZCBmcmFtZS9tYXNrIGZyb20gdGhlIE9OVS4gICAqLworICAgIGJjbW9sdF91cHN0cmVhbV9iYW5kd2lkdGhfZGlzdHJpYnV0aW9uIHVwc3RyZWFtX2JhbmR3aWR0aDsgIC8qKjwgVXBzdHJlYW0gQmFuZHdpZHRoLiAqLworICAgIGJjbW9sdF91YmRfaW5mbyB1YmRfaW5mbzsgICAgICAgICAgIC8qKjwgUmV0dXJucyB0aGUgYWN0dWFsIHZhbHVlcyBmcm9tIHRoZSBVQkQuIFVzZWZ1bCBpZiB5b3Ugd2FudCB0byBzZWUgd2hhdCB2YWx1ZSB0aGUgZmlybXdhcmUgY2hvc2UgZm9yIGEgZmllbGQgc2V0IHRvICdhdXRvbWF0aWMnLiAqLworICAgIGJjbW9zX2Jvb2wgY2xvY2tfdHJhbnNwb3J0X2VuYWJsZTsgIC8qKjwgV2hldGhlciBvciBub3QgdG8gZW5hYmxlIGNsb2NrIHRyYW5zcG9ydCBvbiB0aGlzIGxpbmsuICovCisgICAgdWludDhfdCBwZW5kaW5nX2dyYW50czsgICAgICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHBlbmRpbmcgZ3JhbnRzLiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfdHlwZSBsaW5rX3R5cGU7ICAgIC8qKjwgTGluayBUeXBlLiAqLworfSBiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImNmZyIgZ3JvdXAgb2YgImVwb25fbGluayIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbGlua19jZmcKK3sKKyAgICBiY21vbHRfY2ZnIGhkcjsgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXk7ICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0IiBncm91cCBvZiB0aGUgImVwb25fbGluayIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEKK3sKKyAgICB1aW50NjRfdCByeF9kYXRhX2J5dGVzOyAgICAgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gbGluay4gKi8KKyAgICB1aW50NjRfdCByeF9kYXRhX2ZyYW1lczsgICAgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgZGF0YSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIGxpbmsuICovCisgICAgdWludDY0X3QgcnhfZnJhbWVzXzY0OyAgICAgICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIDY0IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rICovCisgICAgdWludDY0X3QgcnhfZnJhbWVzXzY1XzEyNzsgICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIDY1IHRvIDEyNyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gTGluayAqLworICAgIHVpbnQ2NF90IHJ4X2ZyYW1lc18xMjhfMjU1OyAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiAxMjggdG8gMjU1IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rICovCisgICAgdWludDY0X3QgcnhfZnJhbWVzXzI1Nl81MTE7ICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIDI1NiB0byA1MTEgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsgKi8KKyAgICB1aW50NjRfdCByeF9mcmFtZXNfNTEyXzEwMjM7ICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgNTEyIHRvIDEwMjMgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsgKi8KKyAgICB1aW50NjRfdCByeF9mcmFtZXNfMTAyNF8xNTE4OyAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgMTAyNCB0byAxNTE4IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rICovCisgICAgdWludDY0X3QgcnhfZnJhbWVzXzE1MTlfMjA0NzsgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIDE1MTkgdG8gMjA0NyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gTGluayAqLworICAgIHVpbnQ2NF90IHJ4X2ZyYW1lc18yMDQ4XzQwOTU7ICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiAyMDQ4IHRvIDQwOTUgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsgKi8KKyAgICB1aW50NjRfdCByeF9mcmFtZXNfNDA5Nl85MjE2OyAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgNDA5NiB0byA5MjE2IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rICovCisgICAgdWludDY0X3QgcnhfZnJhbWVzXzkyMTdfMTYzODM7ICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIDkyMTcgdG8gMTYzODMgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsgKi8KKyAgICB1aW50NjRfdCByeF9vYW1fYnl0ZXM7ICAgICAgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgT0FNIGJ5dGVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBsaW5rLiAqLworICAgIHVpbnQ2NF90IHJ4X29hbV9mcmFtZXM7ICAgICAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBPQU0gZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBsaW5rLiAqLworICAgIHVpbnQ2NF90IHJ4X21wY3BfZnJhbWVzOyAgICAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBNUENQIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gbGluay4gKi8KKyAgICB1aW50NjRfdCByeF9icm9hZGNhc3RfZnJhbWVzOyAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgYnJvYWRjYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gbGluay4gKi8KKyAgICB1aW50NjRfdCByeF91bmljYXN0X2ZyYW1lczsgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgdW5pY2FzdCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIGxpbmsuICovCisgICAgdWludDY0X3QgcnhfbXVsdGljYXN0X2ZyYW1lczsgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIG11bHRpY2FzdCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIGxpbmsuICovCisgICAgdWludDY0X3QgcnhfcmVwb3J0X2ZyYW1lczsgICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHJlcG9ydCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIGxpbmsuICovCisgICAgdWludDY0X3QgcnhfZmNzX2Vycm9yOyAgICAgICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIGJhZCBGQ1MgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rICovCisgICAgdWludDY0X3Qgcnhfb3ZlcnNpemVfZXJyb3I7ICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIG92ZXJzaXplIGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIEVQT04gTGluayAqLworICAgIHVpbnQ2NF90IHJ4X3J1bnRfZXJyb3I7ICAgICAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBydW50IGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIEVQT04gTGluayAqLworICAgIHVpbnQ2NF90IHJ4X2xpbmVfY29kZV9lcnJvcjsgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBsaW5lIGNvZGUgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rICovCisgICAgdWludDY0X3QgcnhfbGluZV9jb2RlX2Vycm9yX21heDsgICAgLyoqPCBUaGUgbnVtYmVyIG9mIGxpbmUgY29kZSBlcnJvcnMgbWF4IHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rICovCisgICAgdWludDY0X3QgdHhfZGF0YV9ieXRlczsgICAgICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIGxpbmsuICovCisgICAgdWludDY0X3QgdHhfZGF0YV9mcmFtZXM7ICAgICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIGRhdGEgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBsaW5rLiAqLworICAgIHVpbnQ2NF90IHR4X2ZyYW1lc182NDsgICAgICAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiA2NCBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gTGluayAqLworICAgIHVpbnQ2NF90IHR4X2ZyYW1lc182NV8xMjc7ICAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiA2NSB0byAxMjcgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIExpbmsgKi8KKyAgICB1aW50NjRfdCB0eF9mcmFtZXNfMTI4XzI1NTsgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgMTI4IHRvIDI1NSBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gTGluayAqLworICAgIHVpbnQ2NF90IHR4X2ZyYW1lc18yNTZfNTExOyAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiAyNTYgdG8gNTExIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBMaW5rICovCisgICAgdWludDY0X3QgdHhfZnJhbWVzXzUxMl8xMDIzOyAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIDUxMiB0byAxMDIzIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBMaW5rICovCisgICAgdWludDY0X3QgdHhfZnJhbWVzXzEwMjRfMTUxODsgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIDEwMjQgdG8gMTUxOCBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gTGluayAqLworICAgIHVpbnQ2NF90IHR4X2ZyYW1lc18xNTE5XzIwNDc7ICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiAxNTE5IHRvIDIwNDcgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIExpbmsgKi8KKyAgICB1aW50NjRfdCB0eF9mcmFtZXNfMjA0OF80MDk1OyAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgMjA0OCB0byA0MDk1IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBMaW5rICovCisgICAgdWludDY0X3QgdHhfZnJhbWVzXzQwOTZfOTIxNjsgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIDQwOTYgdG8gOTIxNiBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gTGluayAqLworICAgIHVpbnQ2NF90IHR4X2ZyYW1lc185MjE3XzE2MzgzOyAgICAgIC8qKjwgVGhlIG51bWJlciBvZiA5MjE3IHRvIDE2MzgzIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBMaW5rICovCisgICAgdWludDY0X3QgdHhfb2FtX2J5dGVzOyAgICAgICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIE9BTSBieXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gbGluay4gKi8KKyAgICB1aW50NjRfdCB0eF9vYW1fZnJhbWVzOyAgICAgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgT0FNIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gbGluay4gKi8KKyAgICB1aW50NjRfdCB0eF9tcGNwX2ZyYW1lczsgICAgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgTVBDUCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIGxpbmsuICovCisgICAgdWludDY0X3QgdHhfYnJvYWRjYXN0X2ZyYW1lczsgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIGJyb2FkY2FzdCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIGxpbmsuICovCisgICAgdWludDY0X3QgdHhfdW5pY2FzdF9mcmFtZXM7ICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHVuaWNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBsaW5rLiAqLworICAgIHVpbnQ2NF90IHR4X211bHRpY2FzdF9mcmFtZXM7ICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBtdWx0aWNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBsaW5rLiAqLworICAgIHVpbnQ2NF90IHR4X2dhdGVzOyAgICAgICAgICAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBnYXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gbGluay4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdCIgZ3JvdXAgb2YgImVwb25fbGluayIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbGlua19zdGF0Cit7CisgICAgYmNtb2x0X3N0YXQgaGRyOyAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleTsgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfc3RhdDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfY2ZnIiBncm91cCBvZiB0aGUgImVwb25fbGluayIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19kYXRhCit7CisgICAgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIGNmZzsgICAvKio8IFN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiAqLworfSBiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9jZmciIGdyb3VwIG9mICJlcG9uX2xpbmsiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmcKK3sKKyAgICBiY21vbHRfc3RhdF9jZmcgaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleTsgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19kYXRhIGRhdGE7ICAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImR1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0IiBncm91cCBvZiAKKyAqIHRoZSAiZXBvbl9saW5rIiBvYmplY3QuIAorICoKKyAqIEEgcmVnaXN0ZXIgcmVxdWVzdGVkIHdhcyByZWNlaXZlZCBmb3IgYSBsaW5rIHdpdGggdGhlIHNhbWUgTUFDIGFkZHJlc3MgYXMgYSAKKyAqIGxpbmsgdGhhdCBoYXMgYWxyZWFkeSByZWdpc3RlcmVkLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9kYXRhCit7CisgICAgYmNtb2x0X3RpbWVfcXVhbnRhIGluaXRpYWxfcmFuZ2VfdHE7ICAgIC8qKjwgUmFuZ2UgYXMgY2FsY3VsYXRlZCBmcm9tIHRoZSBmaXJzdCBmcmFtZSByZWNlaXZlZC4gKi8KKyAgICBiY21vbHRfdGltZV9xdWFudGEgY3VycmVudF9yYW5nZV90cTsgICAgLyoqPCBSYW5nZSBhcyBjYWxjdWxhdGVkIGZyb20gdGhlIGN1cnJlbnQgZnJhbWUuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJkdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdCIgZ3JvdXAgCisgKiBvZiAiZXBvbl9saW5rIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0Cit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3Q7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiZW5jcnlwdGlvbl9lbmFibGVkIiBncm91cCBvZiAiZXBvbl9saW5rIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfZW5jcnlwdGlvbl9lbmFibGVkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworfSBiY21vbHRfZXBvbl9saW5rX2VuY3J5cHRpb25fZW5hYmxlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleV9leGNoYW5nZV9mYWlsdXJlIiBncm91cCBvZiB0aGUgImVwb25fbGluayIgCisgKiBvYmplY3QuIAorICoKKyAqIFRoZSBPTFQgZmFpbGVkIHRvIHJlY2VpdmUgYW4gdXBkYXRlZCBlbmNyeXB0aW9uIGtleSB3aXRoaW4gdGhlIGV4cGVjdGVkIHRpbWUgCisgKiBwZXJpb2QgYWZ0ZXIgZW5jcnlwdGlvbiBrZXkgZXhjaGFuZ2UgaGFzIGJlZW4gaW5pdGlhdGVkLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhCit7CisgICAgYmNtb2x0X3N0YXR1cyBhbGFybV9zdGF0dXM7IC8qKjwgYWxhcm0gc3RhdHVzLiAqLworfSBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAia2V5X2V4Y2hhbmdlX2ZhaWx1cmUiIGdyb3VwIG9mICJlcG9uX2xpbmsiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZQoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImtleV9leGNoYW5nZV9zdGFydGVkIiBncm91cCBvZiAiZXBvbl9saW5rIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0ZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleTsgICAvKio8IE9iamVjdCBrZXkuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0ZWQ7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAia2V5X2V4Y2hhbmdlX3N0b3BwZWQiIGdyb3VwIG9mICJlcG9uX2xpbmsiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcHBlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcHBlZDsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJsaW5rX2RlbGV0ZWQiIGdyb3VwIG9mICJlcG9uX2xpbmsiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfbGlua19kZWxldGVkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworfSBiY21vbHRfZXBvbl9saW5rX2xpbmtfZGVsZXRlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImxpbmtfc3BlZWRfbWlzbWF0Y2giIGdyb3VwIG9mIHRoZSAiZXBvbl9saW5rIiAKKyAqIG9iamVjdC4gCisgKgorICogSG9zdCB3aWxsIHJlY2VpdmUgdGhpcyBpbmRpY2F0aW9uIGlmIGEgbGluayByZWdpc3RlcnMgdGhlbiBhdHRlbXB0cyB0byAKKyAqIHJlZ2lzdGVyIGxhdGVyIGF0IGEgZGlmZmVyZW50IHNwZWVkLCBvciBpZiB0aGUgbGluayByZWdpc3RlcnMgYXQgYSBkaWZmZXJlbnQgCisgKiBzcGVlZCB0aGFuIHRoZSBzcGVlZCB3aXRoIHdoaWNoIGl0IHdhcyBwcmUtcHJvdmlzaW9uZWQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfZGF0YQoreworICAgIGJjbW9sdF9lcG9uX2xpbmtfcmF0ZSBwcmV2aW91c19yYXRlOyAgICAvKio8IFBPTiByYXRlIGxpbmsgaW5pdGlhbGx5IHJlZ2lzdGVyZWQgKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX3JhdGUgY3VycmVudF9yYXRlOyAgICAgLyoqPCBQT04gcmF0ZSBsaW5rIGlzIGN1cnJlbnRseSBhdHRlbXB0aW5nIHRvIHJlZ2lzdGVyIGF0ICovCit9IGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImxpbmtfc3BlZWRfbWlzbWF0Y2giIGdyb3VwIG9mICJlcG9uX2xpbmsiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgIm1wY3BfZGVyZWdpc3RlcmVkIiBncm91cCBvZiAiZXBvbl9saW5rIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kZXJlZ2lzdGVyZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleTsgICAvKio8IE9iamVjdCBrZXkuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kZXJlZ2lzdGVyZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJtcGNwX2Rpc2NvdmVyZWQiIGdyb3VwIG9mIHRoZSAiZXBvbl9saW5rIiAKKyAqIG9iamVjdC4gCisgKgorICogQSBsaW5rIGhhcyBjb21wbGV0ZWQgTVBDUCBsaW5rIHJlZ2lzdHJhdGlvbi4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2RhdGEKK3sKKyAgICBiY21vbHRfZXBvbl9saW5rX2luZm8gbGlua19pbmZvOyAgICAvKio8IEluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGlzY292ZXJlZCBsaW5rLiAqLworfSBiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgIm1wY3BfZGlzY292ZXJlZCIgZ3JvdXAgb2YgImVwb25fbGluayIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWQ7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAibXBjcF9yZWdfYWNrX3RpbWVvdXQiIGdyb3VwIG9mICJlcG9uX2xpbmsiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlZ19hY2tfdGltZW91dAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlZ19hY2tfdGltZW91dDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgIm1wY3BfcmVwb3J0X3RpbWVvdXQiIGdyb3VwIG9mIHRoZSAiZXBvbl9saW5rIiAKKyAqIG9iamVjdC4gCisgKgorICogVGhlIHByb3Zpc2lvbmVkIGxpbWl0IGJldHdlZW4gcmVwb3J0cyBmb3IgdGhlIHNwZWNpZmllZCBsaW5rIGhhcyBiZWVuIAorICogZXhjZWVkZWQuICBUaGlzIGxpbmsgd2lsbCBiZSBkZS1yZWdpc3RlcmVkLCBhbmQgdGhlIGFsYXJtX3N0YXR1cyBzZXQgd2hlbiAKKyAqIHRoaXMgb2NjdXJzLiAgVGhlIGFsYXJtX3N0YXR1cyB3aWxsIGJlIGNsZWFyZWQgd2hlbiB0aGUgbGluayBhdHRlbXB0cyB0byAKKyAqIHJlZ2lzdGVyIGFnYWluLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0X2RhdGEKK3sKKyAgICBiY21vbHRfc3RhdHVzIGFsYXJtX3N0YXR1czsgLyoqPCBBbGFybSBTdGF0dXMuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgIm1wY3BfcmVwb3J0X3RpbWVvdXQiIGdyb3VwIG9mICJlcG9uX2xpbmsiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0Cit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAib2FtX2tlZXBhbGl2ZV90aW1lb3V0IiBncm91cCBvZiB0aGUgCisgKiAiZXBvbl9saW5rIiBvYmplY3QuIAorICoKKyAqIFRoZSBwcm92aXNpb25lZCB0aW1lIGxpbWl0IGJldHdlZW4gcmVjZWl2aW5nIHVwc3RyZWFtIGluZm8gZnJhbWVzIGhhcyBiZWVuIAorICogZXhjZWVkZWQuICBOb3JtYWxseSBhbiBPTlUgd2lsbCByZXNldCBpdHMgT0FNIHN0YXRlIG1hY2hpbmUgd2hlbiB0aGlzIAorICogb2NjdXJycyBhbmQgdGhlIGhvc3QgbXVzdCByZS1uZWdvdGlhdGUgT0FNIGFuZCByZXByb3Zpc2lvbiB0aGUgbGluay4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2RhdGEKK3sKKyAgICBiY21vbHRfc3RhdHVzIGFsYXJtX3N0YXR1czsgLyoqPCBBbGFybSBTdGF0dXMuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAib2FtX2tlZXBhbGl2ZV90aW1lb3V0IiBncm91cCBvZiAKKyAqICJlcG9uX2xpbmsiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0Cit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0OworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgIm9hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZCIgZ3JvdXAgb2YgCisgKiAiZXBvbl9saW5rIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0ZWQ7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAib2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkIiBncm91cCBvZiAKKyAqICJlcG9uX2xpbmsiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworfSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZCIgZ3JvdXAgb2YgdGhlIAorICogImVwb25fbGluayIgb2JqZWN0LiAKKyAqCisgKiBSYWlzZWQgYWZ0ZXIgYW4gJ2FkZF9saW5rJyBvcGVyYXRpb24gb24gYW4gRVBPTiBOSSBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5IAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9kYXRhCit7CisgICAgYmNtb2x0X2Vwb25fbGlua19pbmZvIGxpbmtfaW5mbzsgICAgLyoqPCBJbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGxpbmsuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAicHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkIiBncm91cCBvZiAKKyAqICJlcG9uX2xpbmsiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInByb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkIiBncm91cCBvZiB0aGUgCisgKiAiZXBvbl9saW5rIiBvYmplY3QuIAorICoKKyAqIFRoZSBsaW5rIGhhcyB1bmRlcmdvbmUgYSBwcm90ZWN0aW9uIHN3aXRjaCBldmVudC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfZGF0YQoreworICAgIGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3RhdGUgcHJvdGVjdGlvbl9zdGF0dXM7IC8qKjwgVGhlIGxpbmsncyBwb3N0LXN3aXRjaCByb2xlICh3b3JraW5nIG9yIHN0YW5kYnkpLiAqLworICAgIGJjbW9sdF90aW1lX3F1YW50YSByYW5nZV92YWx1ZV90cTsgICAgICAgICAgICAgIC8qKjwgQ3VycmVudCByYW5nZSB2YWx1ZSBpbiB0aW1lIHF1YW50YS4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInByb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkIiBncm91cCBvZiAKKyAqICJlcG9uX2xpbmsiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleTsgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJyYW5nZV92YWx1ZV9jaGFuZ2VkIiBncm91cCBvZiB0aGUgImVwb25fbGluayIgCisgKiBvYmplY3QuIAorICoKKyAqIEluZGljYXRpb24gc2VudCB3aGVuIGEgcmFuZ2UgdmFsdWUgaGFzIGJlZW4gY2hhbmdlZC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZF9kYXRhCit7CisgICAgYmNtb2x0X3RpbWVfcXVhbnRhIHJhbmdlX3ZhbHVlX3RxOyAgLyoqPCBOZXcgcmFuZ2UgdmFsdWUuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInJhbmdlX3ZhbHVlX2NoYW5nZWQiIGdyb3VwIG9mICJlcG9uX2xpbmsiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZF9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInJlcmFuZ2VfZmFpbHVyZSIgZ3JvdXAgb2YgImVwb25fbGluayIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9saW5rX3JlcmFuZ2VfZmFpbHVyZQoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19yZXJhbmdlX2ZhaWx1cmU7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2FsYXJtX2NsZWFyZWQiIGdyb3VwIG9mIHRoZSAiZXBvbl9saW5rIiAKKyAqIG9iamVjdC4gCisgKgorICogU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhCit7CisgICAgYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkIHN0YXQ7ICAvKio8IFN0YXRpc3RpYyBpZGVudGlmaWVyLiAqLworfSBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXRfYWxhcm1fY2xlYXJlZCIgZ3JvdXAgb2YgImVwb25fbGluayIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdF9hbGFybV9yYWlzZWQiIGdyb3VwIG9mIHRoZSAiZXBvbl9saW5rIiAKKyAqIG9iamVjdC4gCisgKgorICogU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWRfZGF0YQoreworICAgIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZCBzdGF0OyAgLyoqPCBTdGF0aXN0aWMgaWRlbnRpZmllci4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXRfYWxhcm1fcmFpc2VkIiBncm91cCBvZiAiZXBvbl9saW5rIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleTsgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXRpY19yZWdpc3RyYXRpb25fZG9uZSIgZ3JvdXAgb2YgCisgKiAiZXBvbl9saW5rIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZG9uZQoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RvbmU7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJhdXRvX2NmZyIgZ3JvdXAgb2YgdGhlICJlcG9uX2xpbmsiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YQoreworICAgIGJjbW9zX2Jvb2wgZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3Q7IC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAiZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3QiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgZW5jcnlwdGlvbl9lbmFibGVkOyAgICAgICAgICAgICAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAiZW5jcnlwdGlvbl9lbmFibGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIGtleV9leGNoYW5nZV9mYWlsdXJlOyAgICAgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImtleV9leGNoYW5nZV9mYWlsdXJlIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIGtleV9leGNoYW5nZV9zdGFydGVkOyAgICAgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImtleV9leGNoYW5nZV9zdGFydGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIGtleV9leGNoYW5nZV9zdG9wcGVkOyAgICAgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImtleV9leGNoYW5nZV9zdG9wcGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIGxpbmtfZGVsZXRlZDsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImxpbmtfZGVsZXRlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBsaW5rX3NwZWVkX21pc21hdGNoOyAgICAgICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJsaW5rX3NwZWVkX21pc21hdGNoIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIG1wY3BfZGVyZWdpc3RlcmVkOyAgICAgICAgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgIm1wY3BfZGVyZWdpc3RlcmVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIG1wY3BfZGlzY292ZXJlZDsgICAgICAgICAgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgIm1wY3BfZGlzY292ZXJlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBtcGNwX3JlZ19hY2tfdGltZW91dDsgICAgICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJtcGNwX3JlZ19hY2tfdGltZW91dCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBtcGNwX3JlcG9ydF90aW1lb3V0OyAgICAgICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJtcGNwX3JlcG9ydF90aW1lb3V0IiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIG9hbV9rZWVwYWxpdmVfdGltZW91dDsgICAgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgIm9hbV9rZWVwYWxpdmVfdGltZW91dCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBvYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0ZWQ7ICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJvYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0ZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkOyAgICAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAib2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZDsgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBwcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZDsgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJwcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCByYW5nZV92YWx1ZV9jaGFuZ2VkOyAgICAgICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJyYW5nZV92YWx1ZV9jaGFuZ2VkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHJlcmFuZ2VfZmFpbHVyZTsgICAgICAgICAgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInJlcmFuZ2VfZmFpbHVyZSIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBzdGF0X2FsYXJtX2NsZWFyZWQ7ICAgICAgICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzdGF0X2FsYXJtX2NsZWFyZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgc3RhdF9hbGFybV9yYWlzZWQ7ICAgICAgICAgICAgICAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAic3RhdF9hbGFybV9yYWlzZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lOyAgICAgICAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAic3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImF1dG9fY2ZnIiBncm91cCBvZiAiZXBvbl9saW5rIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnCit7CisgICAgYmNtb2x0X2F1dG9fY2ZnIGhkcjsgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXk7ICAgICAgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmc7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiZGVsZXRlX2xpbmsiIGdyb3VwIG9mICJlcG9uX2xpbmsiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfZGVsZXRlX2xpbmsKK3sKKyAgICBiY21vbHRfb3BlciBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleTsgICAvKio8IE9iamVjdCBrZXkuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfZGVsZXRlX2xpbms7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiZm9yY2VfcmVkaXNjb3ZlcnkiIGdyb3VwIG9mICJlcG9uX2xpbmsiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbGlua19mb3JjZV9yZWRpc2NvdmVyeQoreworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19mb3JjZV9yZWRpc2NvdmVyeTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleV9leGNoYW5nZV9zdGFydCIgZ3JvdXAgb2YgdGhlICJlcG9uX2xpbmsiIAorICogb2JqZWN0LiAKKyAqCisgKiBBcHBseSB0aGUgY29ycmVzcG9uZGluZyBwcm92aXNpb25pbmcgZm9yICdlcG9uX2xpbmsua2V5X2V4Y2hhbmdlX2NvbmZpZycgCisgKiBhZ2FpbnN0IHRoaXMgbGluayBhbmQgdGhlbiBzdGFydCBrZXkgZXhjaGFuZ2UgdGltZXIgd2l0aCB0aGUgZ2l2ZW4gcGVyaW9kLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfZGF0YQoreworICAgIHVpbnQxNl90IHBlcmlvZDsgICAgLyoqPCBLZXkgZXhjaGFuZ2UgcGVyaW9kIGluIHNlY29uZHMuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAia2V5X2V4Y2hhbmdlX3N0YXJ0IiBncm91cCBvZiAiZXBvbl9saW5rIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0Cit7CisgICAgYmNtb2x0X29wZXIgaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnQ7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAia2V5X2V4Y2hhbmdlX3N0b3AiIGdyb3VwIG9mICJlcG9uX2xpbmsiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcAoreworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgIm9hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnQiIGdyb3VwIG9mIHRoZSAKKyAqICJlcG9uX2xpbmsiIG9iamVjdC4gCisgKgorICogU3RhcnQgdGhlIE9BTSBrZWVwYWxpdmUgdGltZXIgYWdhaW5zdCB0aGlzIGxpbmsuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfZGF0YQoreworICAgIHVpbnQxNl90IHNlbmRfcGVyaW9kOyAgIC8qKjwgVGhlIHBlcmlvZCBhdCB3aGljaCB0byBzZW5kIE9BTSBpbmZvIGZyYW1lcyAoaW4gc2Vjb25kcykuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgIm9hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnQiIGdyb3VwIG9mIAorICogImVwb25fbGluayIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0Cit7CisgICAgYmNtb2x0X29wZXIgaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnQ7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAib2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wIiBncm91cCBvZiAKKyAqICJlcG9uX2xpbmsiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wCit7CisgICAgYmNtb2x0X29wZXIgaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworfSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRpY19yZWdpc3RyYXRpb24iIGdyb3VwIG9mIHRoZSAiZXBvbl9saW5rIiAKKyAqIG9iamVjdC4gCisgKgorICogU3RhdGljYWxseSByZWdpc3RlcnMgdGhlIGxvZ2ljYWwgbGluayAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RhdGEKK3sKKyAgICBiY21vbHRfdGltZV9xdWFudGEgbGFzZXJvbl90aW1lX3RxOyAgICAgLyoqPCBMYXNlci1vbiB0aW1lIGluIHRpbWUgcXVhbnRhLlwgKi8KKyAgICBiY21vbHRfdGltZV9xdWFudGEgbGFzZXJvZmZfdGltZV90cTsgICAgLyoqPCBMYXNlci1vZmYgdGltZSBpbiB0aW1lIHF1YW50YS4gKi8KKyAgICBiY21vbHRfdGltZV9xdWFudGEgcmFuZ2VfdmFsdWVfdHE7ICAgICAgLyoqPCBSYW5nZSB2YWx1ZSB1c2VkIGZvciB0aGlzIGxpbmsgLSBpbiB0aW1lIHF1YW50YS4gKi8KKyAgICB1aW50OF90IHBlbmRpbmdfZ3JhbnRzOyAgICAgICAgICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHBlbmRpbmcgZ3JhbnRzLiAqLworfSBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGF0aWNfcmVnaXN0cmF0aW9uIiBncm91cCBvZiAiZXBvbl9saW5rIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbgoreworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbjsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImluamVjdF9mcmFtZSIgZ3JvdXAgb2YgdGhlICJlcG9uX2xpbmsiIG9iamVjdC4gCisgKgorICogU2VuZCBhbiBhcmJpdHJhcnkgZnJhbWUgYWNyb3NzIHRoZSBzcGVjaWZpZWQgbGluay4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2RhdGEKK3sKKyAgICBiY21vbHRfZXRoZXJuZXRfZnJhbWVfdW5tYXNrZWQgZnJhbWU7ICAgLyoqPCBDb21wbGV0ZSBjb250ZW50cyBvZiB0aGUgZnJhbWUgYmVnaW5uaW5nIHdpdGggdGhlIERBIHVwIHRocm91Z2ggYnV0IG5vdCBpbmNsdWRpbmcgdGhlIENSQy4gKi8KK30gYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJpbmplY3RfZnJhbWUiIGdyb3VwIG9mICJlcG9uX2xpbmsiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lCit7CisgICAgYmNtb2x0X3Byb3h5IGhkcjsgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImZyYW1lX2NhcHR1cmVkIiBncm91cCBvZiB0aGUgImVwb25fbGluayIgCisgKiBvYmplY3QuIAorICoKKyAqIEEgZnJhbWUgbWF0Y2hpbmcgaG9zdC1zcGVjaWZpZWQgY3JpdGVyaWEgd2FzIHJlY2VpdmVkLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9kYXRhCit7CisgICAgYmNtb2x0X3U4X2xpc3RfdTMyIGZyYW1lOyAgIC8qKjwgQ29udGVudHMgb2YgdGhlIGZyYW1lLiAqLworfSBiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiZnJhbWVfY2FwdHVyZWQiIGdyb3VwIG9mICJlcG9uX2xpbmsiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZAoreworICAgIGJjbW9sdF9wcm94eV9yeCBoZHI7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleTsgICAgICAgICAgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAia2V5IiBncm91cCBvZiB0aGUgImVwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX25pX2tleQoreworICAgIGJjbW9sdF9lcG9uX25pIGVwb25fbmk7IC8qKjwgVGhlIGluZGV4IG9mIGEgc3BlY2lmaWMgRVBPTiBOSSBpbnN0YW5jZSBhcyBzZWVuIGJ5IHRoZSBob3N0LiAqLworfSBiY21vbHRfZXBvbl9uaV9rZXk7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJjZmciIGdyb3VwIG9mIHRoZSAiZXBvbl9uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEKK3sKKyAgICBiY21vc19tYWNfYWRkcmVzcyBtYWNfYWRkcmVzczsgICAgICAvKio8IFRoZSBNQUMgYWRkcmVzcyB1c2VkIGZvciBhbGwgZnJhbWVzIGdlbmVyYXRlZCBieSB0aGUgT0xUIG9uIHRoZSBQT04uICBUaGlzIHZhbHVlIG11c3QgYmUgc2V0IGJlZm9yZSBFUE9OX05JIGlzIGZpcnN0IGVuYWJsZWQsIGFuZCBjYW5ub3QgYmUgY2hhbmdlZCB3aGlsZSB0aGUgRVBPTl9OSSBpcyBlbmFibGVkLiAqLworICAgIGJjbW9sdF9lcG9uX25pX2VuX3N0YXRlIGVwb25fbmlfZW47IC8qKjwgSW5kaWNhdGVzIHRoZSBlbmFibGUgc3RhdGUgb2YgdGhlIEVQT04gTkkuICovCisgICAgYmNtb2x0X3JlZ2lzdHJhdGlvbl9iZWhhdmlvciByZWdpc3RyYXRpb25fYmVoYXZpb3I7IC8qKjwgRGV0ZXJtaW5lcyBob3cgcmVnaXN0cmF0aW9uIHJlcXVlc3RzIGZyb20gdW5rbm93biBsaW5rcyBhcmUgaGFuZGxlZC4gIFNldCB0byAnTm90aWZ5IFVua25vd24nIHRvIGZvcmNlIGFsbCBsaW5rcyB0byBiZSBwcmUtcHJvdmlzaW9uZWQuICBJZiBpbiAnTm90aWZ5IFVua25vd24nIG1vZGUsIE1QQ1AgUmVnaXN0cmF0aW9uIG9mIGFuIHVua25vd24gbGluayB3aWxsIGJlIGRlbmllZCwgYW5kIGEgJ1doaXRlIExpc3QgVmlvbGF0aW9uIiB3aWxsIGJlIHNlbnQgdG8gdGhlIGhvc3QuIElmIHNldCB0byAnQXV0b21hdGljJywgdGhlIGxpbmsgcmVnaXN0ZXJzIGZ1bGx5IHdpdGhvdXQgaG9zdCBpbnRlcmFjdGlvbi4gICovCisgICAgdWludDE2X3QgbXR1XzFnOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTWF4aW11bSBmcmFtZSBzaXplIChpbmNsdWRpbmcgRkNTKSBvbiB0aGUgMUcgcGF0aC4gVGhpcyBhdHRyaWJ1dGUgY2Fubm90IGJlIGNoYW5nZWQgb24gYW4gZW5hYmxlZCBFUE9OX05JLiBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgYW4gb2RkIHZhbHVlLiAqLworICAgIHVpbnQxNl90IG10dV8xMGc7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IE1heGltdW0gZnJhbWUgc2l6ZSAoaW5jbHVkaW5nIEZDUykgb24gdGhlIDEwRyBwYXRoLiBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgY2hhbmdlZCBvbiBhbiBlbmFibGVkIEVQT05fTkkuIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBhbiBvZGQgdmFsdWUuICovCisgICAgYmNtb2x0X21ldGVycyBtaW5pbXVtX2ZpYmVyX2xlbmd0aDsgICAgIC8qKjwgVGhlIG1pbmltdW0gZmliZXIgbGVuZ3RoLCBpbiBtZXRlcnMsIGF0IHdoaWNoIHdlIGV4cGVjdCB0byBmaW5kIGFuIE9OVS4gTm90ZXM6IFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG1pbmltdW0gYW5kIG1heGltdW0gZmliZXIgbGVuZ3RoIGNhbm5vdCBleGNlZWQgMTAwIGttLiBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgY2hhbmdlZCBvbiBhbiBlbmFibGVkIEVQT05fTkkuIFNvbWUgT05VcyBjYW4gcmVnaXN0ZXIgYXQgZGlzdGFuY2VzIHRoYXQgYXJlIGxlc3MgdGhhbiB0aGUgcHJvdmlzaW9uZWQgbWluaW11bS4gKi8KKyAgICBiY21vbHRfbWV0ZXJzIG1heGltdW1fZmliZXJfbGVuZ3RoOyAgICAgLyoqPCBUaGUgbWF4aW11bSBmaWJlciBsZW5ndGgsIGluIG1ldGVycywgYXQgd2hpY2ggd2UgZXhwZWN0IHRvIGZpbmQgYW4gT05VLiBOb3RlczogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBmaWJlciBsZW5ndGggY2Fubm90IGV4Y2VlZCAxMDAga20uIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBjaGFuZ2VkIG9uIGFuIGVuYWJsZWQgRVBPTl9OSS4gU29tZSBPTlVzIGNhbiByZWdpc3RlciBhdCBkaXN0YW5jZXMgdGhhdCBhcmUgZ3JlYXRlciB0aGFuIHRoZSBwcm92aXNpb25lZCBtYXhpbXVtLiAqLworICAgIGJjbW9sdF90aW1lX3F1YW50YSBncmFudF9zcGFjaW5nX3RxOyAgICAvKio8IFRoZSBkZWFkIHRpbWUgb24gdGhlIFBPTiBiZXR3ZWVuIHVwc3RyZWFtIGJ1cnN0cy4gIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBjaGFuZ2VkIG9uIGFuIGVuYWJsZWQgRVBPTl9OSS4gKi8KKyAgICBiY21vbHRfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucyBlcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zOyAvKio8IENvbmZpZ3VyYXRpb24gcmVsYXRlZCB0byBFUE9OIGxpbmtzIHJlZ2lzdHJhdGlvbiBhbmQgcmVwb3J0aW5nLiBUaGlzIHZhbHVlIGNhbm5vdCBiZSBjaGFuZ2VkIG9uIGFuIGVuYWJsZWQgRVBPTl9OSS4gKi8KKyAgICB1aW50MzJfdCBtcGNwX2Rpc2NvdmVyeV9wZXJpb2RfbXM7ICAgICAgICAgICAgICAvKio8IFBlcmlvZCBvZiBNUENQIGRpc2NvdmVyeSB3aW5kb3dzLiAgSW4gdGhpcyB0aW1lIHBlcmlvZCwgb25lIGRpc2NvdmVyeSBnYXRlIHdpbGwgYmUgc2VudCBmb3IgZXZlcnkgZW5hYmxlZCBSUC4gIFRoZSBkaXNjb3ZlcnkgZ2F0ZXMgd2lsbCBiZSBzcGFjZWQgZXF1YWxseSBhY3Jvc3MgdGhlIHRpbWUgcGVyaW9kLiAqLworICAgIGJjbW9sdF9lcG9uX25pX2FsYXJtX3N0YXRlIGFsYXJtX3N0YXRlOyAgICAgICAgIC8qKjwgVGhlIHN0YXRlIG9mIHRoZSBhbGFybXMgb24gdGhpcyBFUE9OIE5JLiAqLworICAgIGJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyX21heF8yMDQ4IGFsbF9saW5rczsgIC8qKjwgTGlzdCBvZiBhbGwgbGlua3Mgb24gdGhlIEVQT04gTkkuICovCisgICAgYmNtb2x0X2Vwb25fbmlfZW5jcnlwdGlvbl9jZmcgZW5jcnlwdGlvbl9jZmc7ICAgLyoqPCBFbmNyeXB0aW9uIGNvbmZpZ3VyYXRpb24gdGhhdCBhcHBsaWVzIHRvIHRoZSBFUE9OIE5JIGFzIGEgd2hvbGUuICovCisgICAgYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY29uZmlndXJhdGlvbiBwcm90ZWN0aW9uX3N3aXRjaGluZ19jZmc7ICAgIC8qKjwgUHJvdGVjdGlvbiBzd2l0Y2hpbmcgY29uZmlndXJhdGlvbi4gKi8KKyAgICBiY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfY29uZmlndXJhdGlvbiBjbG9ja190cmFuc3BvcnRfY2ZnOyAgICAgICAgICAgICAgLyoqPCBDbG9jayB0cmFuc3BvcnQgY29uZmlndXJhdGlvbi4gKi8KKyNkZWZpbmUgQkNNT0xUX0VQT05fTklfQ0ZHX0RBVEFfRFJPUERPV05fV0VJR0hUU19MRU4gICAgNworICAgIGJjbW9sdF9hcnJfdTE2XzcgZHJvcGRvd25fd2VpZ2h0czsgICAgICAgICAgICAgICAgICAvKio8IFRoZSBzb2xpY2l0ZWQgc2NoZWR1bGluZyBkcm9wIGRvd24gd2VpZ2h0cyBmb3IgcHJpb3JpdGllcyAwLTYgKHBlcmNlbnRhZ2VzIHJlbGF0aXZlIHRvIHRoYXQgcHJpb3JpdHkpLiBQcmlvcml0eSA3IGhhcyBubyBkcm9wLWRvd24sIGFzIGl0IGlzIHRoZSBsb3dlc3QgcHJpb3JpdHkuIFRoZSBkcm9wLWRvd24gd2VpZ2h0cyBhcmUgaG93IG11Y2ggYmFuZHdpZHRoIHRvIGFsbG9jYXRlIHRvIHNvbGljaXRlZCBzY2hlZHVsZXJzIGF0IHRoZSBuZXh0IGxvd2VyIHByaW9yaXR5IGxldmVsIChldmVuIHdoZW4gZWxlbWVudHMgYXQgdGhpcyBsZXZlbCBhcmUgc3RpbGwgYWN0aXZlKS4gIFRoaXMgaXMgTk9UIHRoZSBwZXJjZW50YWdlIGFsbG9jYXRlZCB0byB0aGUgZHJvcCBkb3duLCBpdCBpcyB0aGUgcmF0aW8gYmV0d2VlbiBhIHByaW9yaXR5IGFuZCBpdHMgZHJvcGRvd24gKi8KKyNkZWZpbmUgQkNNT0xUX0VQT05fTklfQ0ZHX0RBVEFfQVBQUk9YSU1BVEVfU09MSUNJVEVEX1VTQUdFX0xFTiA4CisgICAgYmNtb2x0X2Fycl9ib3VuZHNfOCBhcHByb3hpbWF0ZV9zb2xpY2l0ZWRfdXNhZ2U7ICAgIC8qKjwgVGhlIGFwcHJveGltYXRlIHBlcmNlbnRhZ2Ugb2YgdGhlIFBPTiB0aW1lIG5lY2Vzc2FyeSB0byBzY2hlZHVsZSBhbGwgZWxlbWVudHMgYXQgb3IgYWJvdmUgZWFjaCBwcmlvcml0eS4gKi8KKyAgICB1aW50MzJfdCBhcHByb3hpbWF0ZV90ZG1fdXNhZ2U7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgYXBwcm94aW1hdGUgcGVyY2VudGFnZSBvZiB0aGUgUE9OIHRpbWUgbmVjZXNzYXJ5IHRvIGFjY29tb2RhdGUgYWxsIFRETSBncmFudHMuICovCisgICAgdWludDE2X3Qgbm9fcmVwb3J0c19zb2FrX3RpbWU7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUGVyaW9kIG9mIHRpbWUgYWZ0ZXIgbGFzdCByZXBvcnQgcmVjZWl2ZWQgdG8gc2VuZCBubyByZXBvcnRzIGFsYXJtIChpbiBtcykuICovCisgICAgYmNtb2x0X3Bvbl9hZ2dyZWdhdGVfc2hhcGVyIHBvbl9hZ2dyZWdhdGVfc2hhcGVyOyAgIC8qKjwgUE9OIEFnZ3JlZ2F0ZSBTaGFwZXIuICovCisjZGVmaW5lIEJDTU9MVF9FUE9OX05JX0NGR19EQVRBX0VTVElNQVRFRF9QT05fTEFURU5DWV9UUV9MRU4gICAgOAorICAgIGJjbW9sdF9hcnJfYm91bmRzXzggZXN0aW1hdGVkX3Bvbl9sYXRlbmN5X3RxOyAgICAgICAvKio8IFRoZSBlc3RpbWF0ZWQgdGltZSBiZXR3ZWVuIHdoZW4gdGhlIE9MVCByZWNlaXZlcyBhIG5vbi16ZXJvIHJlcG9ydCBmcm9tIGFuIE9OVSBhbmQgd2hlbiB0aGUgT0xUIHdpbGwgZ2VuZXJhdGUgYSBncmFudCB0byB0aGF0IE9OVSBmb3IgZWFjaCBwcmlvcml0eSBsZXZlbC4gKi8KKyAgICBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXMgb251X3VwZ3JhZGVfcGFyYW1zOyAgLyoqPCBPTlUgdXBncmFkZSBwYXJhbXMuICovCisgICAgYmNtb3NfYm9vbCBhdXRvX3JvZ3VlX2RldGVjdF8xMGdfZW47ICAgICAgICAgICAgICAgIC8qKjwgRW5hYmxlIDEwRyBBdXRvbm9tb3VzIFJvZ3VlIERlY3Rpb24gZHVyaW5nIGRpc2NvdmVyeSB3aW5kb3cgKi8KKyAgICBiY21vc19ib29sIGF1dG9fcm9ndWVfZGV0ZWN0XzFnX2VuOyAgICAgICAgICAgICAgICAgLyoqPCBFbmFibGUgMUcgQXV0b25vbW91cyBSb2d1ZSBEZWN0aW9uIGR1cmluZyBkaXNjb3Zlcnkgd2luZG93ICovCisgICAgdWludDhfdCBhdXRvX3JvZ3VlX2RldGVjdF8xMGdfdGhyZXNob2xkOyAgICAgICAgICAgIC8qKjwgU2V0IHRocmVzaG9sZCBmb3IgbnVtYmVyIG9mIFN5bmNQYXR0ZXJucyByZWNlaXZlZCB3aXRob3V0IGEgQnVyc3QgRGVsaW1pdGVyIHRvIHRyaWdnZXIgdGhlIGZhdWx0LiAqLworfSBiY21vbHRfZXBvbl9uaV9jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJjZmciIGdyb3VwIG9mICJlcG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9uaV9jZmcKK3sKKyAgICBiY21vbHRfY2ZnIGhkcjsgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9uaV9rZXkga2V5OyAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fbmlfY2ZnOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImF1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZSIgZ3JvdXAgb2YgCisgKiAiZXBvbl9uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX25pX2tleSBrZXk7IC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X2Vwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImF1dG9fcm9ndWVfc2Nhbl8xZ19mYWlsdXJlIiBncm91cCBvZiAKKyAqICJlcG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZQoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9uaV9rZXkga2V5OyAvKio8IE9iamVjdCBrZXkuICovCit9IGJjbW9sdF9lcG9uX25pX2F1dG9fcm9ndWVfc2Nhbl8xZ19mYWlsdXJlOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAibGxpZF9xdWFyYW50aW5lZCIgZ3JvdXAgb2YgdGhlICJlcG9uX25pIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfZGF0YQoreworICAgIGJjbW9sdF9lcG9uX2xsaWQgbGxpZDsgICAgICAgICAgICAgIC8qKjwgTExJRC4gKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX3JhdGUgbGlua19yYXRlOyAgICAvKio8IExpbmsgUmF0ZS4gKi8KKyAgICBiY21vc19tYWNfYWRkcmVzcyBsaW5rX21hYzsgICAgICAgICAvKio8IExpbmsgTUFDLiAqLworICAgIGJjbW9sdF90aW1lX3F1YW50YSByYW5nZV92YWx1ZV90cTsgIC8qKjwgUmFuZ2UgdmFsdWUgaW4gdGltZSBxdWFudGEuICovCit9IGJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJsbGlkX3F1YXJhbnRpbmVkIiBncm91cCBvZiAiZXBvbl9uaSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX25pX2tleSBrZXk7IC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgIm1wY3BfdGltZXN0YW1wX2NoYW5nZWQiIGdyb3VwIG9mIHRoZSAiZXBvbl9uaSIgCisgKiBvYmplY3QuIAorICoKKyAqIEEgY2xvY2sgdHJhbnNwb3J0IHB1bHNlIHdhcyByZWNlaXZlZCBhdCB0aGUgZ2l2ZW4gTVBDUCB0aW1lc3RhbXAuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGEKK3sKKyAgICB1aW50MzJfdCBtcGNwX3RpbWVzdGFtcDsgICAgLyoqPCBUaGUgTVBDUCB0aW1lIGF0IHdoaWNoIHRoZSBwdWxzZSB3YXMgcmVjZWl2ZWQuICovCit9IGJjbW9sdF9lcG9uX25pX21wY3BfdGltZXN0YW1wX2NoYW5nZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJtcGNwX3RpbWVzdGFtcF9jaGFuZ2VkIiBncm91cCBvZiAiZXBvbl9uaSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX25pX2tleSBrZXk7IC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAibm9fcmVwb3J0cyIgZ3JvdXAgb2YgdGhlICJlcG9uX25pIiBvYmplY3QuIAorICoKKyAqIExvc3Mgb2YgYWxsIHJlcG9ydHMgb24gYWxsIGxpbmtzIG9uIHRoZSBFUE9OIE5JIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2RhdGEKK3sKKyAgICBiY21vbHRfc3RhdHVzIGFsYXJtX3N0YXR1czsgLyoqPCBBbGFybSBTdGF0dXMuICovCit9IGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJub19yZXBvcnRzIiBncm91cCBvZiAiZXBvbl9uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0cworeworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fbmlfa2V5IGtleTsgICAgICAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAib251X3VwZ3JhZGVfY29tcGxldGUiIGdyb3VwIG9mIHRoZSAiZXBvbl9uaSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhCit7CisgICAgYmNtb3NfYm9vbCBzdGF0dXM7ICAvKio8IFN1Y2Nlc3Mgb3IgZmFpbHVyZS4gIEFnYWluc3QgZW50aXJlIHVwZ3JhZGUgcHJvY2Vzcy4gKi8KKyAgICBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzIgbGlzdF9vZl9mYWlsZWRfZW50aXRpZXM7ICAgIC8qKjwgTGlzdCBvZiBPTlUtSURzIHRoZSB1cGdyYWRlIGZhaWxlZCBmb3IuICovCit9IGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAib251X3VwZ3JhZGVfY29tcGxldGUiIGdyb3VwIG9mICJlcG9uX25pIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX25pX2tleSBrZXk7IC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInJlcmFuZ2VfZmFpbHVyZSIgZ3JvdXAgb2YgImVwb25fbmkiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbmlfcmVyYW5nZV9mYWlsdXJlCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX25pX2tleSBrZXk7IC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X2Vwb25fbmlfcmVyYW5nZV9mYWlsdXJlOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAicm9ndWVfc2Nhbl9jb21wbGV0ZSIgZ3JvdXAgb2YgdGhlICJlcG9uX25pIiAKKyAqIG9iamVjdC4gCisgKgorICogSW5kY2lhdGlvbiB0aGF0IGEgc2NhbiBpcyBjb21wbGV0ZSwgYW55IGVycm9yIGlzIGFsc28gcmV0dXJuZWQuICAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9kYXRhCit7CisgICAgYmNtb2x0X3JvZ3VlX3NjYW5fc3RhdHVzIHJldHVybl9pbmRfc3RhdHVzOyAvKio8IFN0YXR1cyBvZiBjb21wbGV0ZWQgc2Nhbi4gKi8KK30gYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInJvZ3VlX3NjYW5fY29tcGxldGUiIGdyb3VwIG9mICJlcG9uX25pIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGUKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fbmlfa2V5IGtleTsgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkIiBncm91cCBvZiB0aGUgCisgKiAiZXBvbl9uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YQoreworICAgIGJjbW9sdF9yZXN1bHQgc3RhdHVzOyAgICAgICAvKio8IHN0YXR1cy4gKi8KKyAgICBiY21vbHRfZXBvbl9sbGlkIGxsaWQ7ICAgICAgLyoqPCBMTElELiAqLworICAgIGJjbW9zX21hY19hZGRyZXNzIGxpbmtfbWFjOyAvKio8IExpbmsgTUFDIC4gKi8KK30gYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJyc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCIgZ3JvdXAgb2YgCisgKiAiZXBvbl9uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fbmlfa2V5IGtleTsgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRlX2NoYW5nZV9jb21wbGV0ZWQiIGdyb3VwIG9mIHRoZSAiZXBvbl9uaSIgCisgKiBvYmplY3QuIAorICoKKyAqIFNlbnQgYWZ0ZXIgYSAnc2V0X2Vwb25fbmlfZW5fc3RhdGUnIG9wZXJhdGlvbiBoYXMgY29tcGxldGVkLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhCit7CisgICAgYmNtb2x0X2Vwb25fbmlfZW5fc3RhdGUgbmV3X3N0YXRlOyAgLyoqPCBOZXcgRVBPTiBOSSBlbmFibGUgc3RhdGUuICovCit9IGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGF0ZV9jaGFuZ2VfY29tcGxldGVkIiBncm91cCBvZiAiZXBvbl9uaSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX25pX2tleSBrZXk7IC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiYXV0b19jZmciIGdyb3VwIG9mIHRoZSAiZXBvbl9uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YQoreworICAgIGJjbW9zX2Jvb2wgYXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlOyAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImF1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZSIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBhdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZTsgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAiYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmUiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgbGxpZF9xdWFyYW50aW5lZDsgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImxsaWRfcXVhcmFudGluZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgbXBjcF90aW1lc3RhbXBfY2hhbmdlZDsgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgIm1wY3BfdGltZXN0YW1wX2NoYW5nZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgbm9fcmVwb3J0czsgICAgICAgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgIm5vX3JlcG9ydHMiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgb251X3VwZ3JhZGVfY29tcGxldGU7ICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgIm9udV91cGdyYWRlX2NvbXBsZXRlIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHJlcmFuZ2VfZmFpbHVyZTsgICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJyZXJhbmdlX2ZhaWx1cmUiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgcm9ndWVfc2Nhbl9jb21wbGV0ZTsgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInJvZ3VlX3NjYW5fY29tcGxldGUiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQ7ICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHN0YXRlX2NoYW5nZV9jb21wbGV0ZWQ7ICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzdGF0ZV9jaGFuZ2VfY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KK30gYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJhdXRvX2NmZyIgZ3JvdXAgb2YgImVwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnCit7CisgICAgYmNtb2x0X2F1dG9fY2ZnIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX25pX2tleSBrZXk7ICAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiYWRkX2xpbmsiIGdyb3VwIG9mIHRoZSAiZXBvbl9uaSIgb2JqZWN0LiAKKyAqCisgKiBQcmUtcHJvdmlzaW9uIGFuIEVQT04gbGluay4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX25pX2FkZF9saW5rX2RhdGEKK3sKKyAgICBiY21vc19tYWNfYWRkcmVzcyBtYWNfYWRkcmVzczsgIC8qKjwgVGhlIE1BQyBhZGRyZXNzIG9mIHRoZSBFUE9OIGxpbmsuICovCisgICAgYmNtb2x0X2Vwb25fbGlua19yYXRlIHJhdGU7ICAgICAvKio8IFJhdGUgb2YgbGluayB0byBwcmUtcHJvdmlzaW9uLiAqLworfSBiY21vbHRfZXBvbl9uaV9hZGRfbGlua19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImFkZF9saW5rIiBncm91cCBvZiAiZXBvbl9uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmsKK3sKKyAgICBiY21vbHRfb3BlciBoZHI7ICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fbmlfa2V5IGtleTsgICAgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX25pX2FkZF9saW5rX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fbmlfYWRkX2xpbms7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJhZGRfbXVsdGljYXN0X2xpbmsiIGdyb3VwIG9mIHRoZSAiZXBvbl9uaSIgCisgKiBvYmplY3QuIAorICoKKyAqIFByZS1wcm92aXNpb24gYW4gRVBPTiBtdWx0aWNhc3QgbGluay4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19kYXRhCit7CisgICAgYmNtb3NfbWFjX2FkZHJlc3MgbWFjX2FkZHJlc3M7ICAvKio8IFRoZSBNQUMgYWRkcmVzcyBvZiB0aGUgRVBPTiBsaW5rLiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfcmF0ZSByYXRlOyAgICAgLyoqPCBSYXRlIG9mIGxpbmsgdG8gcHJlLXByb3Zpc2lvbi4gKi8KK30gYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiYWRkX211bHRpY2FzdF9saW5rIiBncm91cCBvZiAiZXBvbl9uaSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmsKK3sKKyAgICBiY21vbHRfb3BlciBoZHI7ICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fbmlfa2V5IGtleTsgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19kYXRhIGRhdGE7ICAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmsiIGdyb3VwIG9mIHRoZSAKKyAqICJlcG9uX25pIiBvYmplY3QuIAorICoKKyAqIEFkZHMgYSBwcm90ZWN0ZWQgc3RhbmRieSBsaW5rLiAgT25jZSBpdCBoYXMgYmVlbiBjcmVhdGVkLCB0aGUgbGluayBpcyAKKyAqIGNvbnNpZGVyZWQgInN0YW5kYnkiIGZvciB0aGUgcHVwb3NlcyBvZiBwcm90ZWN0aW9uIHN3aXRjaGluZy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2RhdGEKK3sKKyAgICBiY21vc19tYWNfYWRkcmVzcyBtYWNfYWRkcmVzczsgICAgICAgICAgICAgIC8qKjwgVGhlIE1BQyBhZGRyZXNzIG9mIHRoZSBFUE9OIGxpbmsuICovCisgICAgYmNtb2x0X2Vwb25fbGlua19pbmZvIHdvcmtpbmdfbGlua19pbmZvOyAgICAvKio8IExpbmsgaW5mbyBmb3IgdGhlIGFzc29jaWF0ZWQgd29ya2luZyBsaW5rLiAqLworfSBiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImFkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rIiBncm91cCBvZiAKKyAqICJlcG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGluaworeworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9uaV9rZXkga2V5OyAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiaXNzdWVfcnNzaV9ncmFudCIgZ3JvdXAgb2YgdGhlICJlcG9uX25pIiAKKyAqIG9iamVjdC4gCisgKgorICogSXNzdWVzIGFuIFJTU0kgZ3JhbnQgdG8gcmVhZCBSWCBQb3dlciAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9kYXRhCit7CisgICAgYmNtb3NfbWFjX2FkZHJlc3MgZ3JhbnRlZF9saW5rOyAvKio8IExvZ2ljYWwgbGluayB0byBncmFudCwgd2hpY2ggc2hvdWxkIGVpdGhlciBiZSBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIHVuaWNhc3QgbGluayBvZiBpbnRlcmVzdCBvbiB0aGUgUE9OIG9yLCAwIGZvciBpZGxlIHBvd2VyIG1lYXN1cmVtZW50LiAwIHdpbGwgdXNlIGEgbGluayB0aGF0IHdpbGwgbm90IHJlc3VsdCBpbiB1cHN0cmVhbSB0cmFuc21pc3Npb24gYnkgYW55IGRldmljZSBvbiB0aGUgUE9OLiAqLworICAgIHVpbnQxNl90IHRyaWdnZXJfd2lkdGg7ICAgICAgICAgLyoqPCBSU1NJIFRyaWdnZXIgV2lkdGggKFR3KSBpbiBucywgRGVzaXJlZCB3aWR0aCBvZiBSU1NJIFRyaWdnZXIgYmFzZWQgb24gdGhlIE9wdGljYWwgTW9kdWxlIFNwZWNpZmljYXRpb25zLiAqLworICAgIHVpbnQxNl90IHRyaWdnZXJfZGVsYXk7ICAgICAgICAgLyoqPCBSU1NJIFRyaWdnZXIgRGVsYXkoVGQpLCBpbiBucywgZm9yIHRoaXMgbGluayB0byBtZWV0IHRoZSAoVGQpIGRlbGF5IHRpbWluZyByZXF1aXJlbWVudCBvZiB0aGUgT3B0aWNhbCBNb2R1bGUgU3BlY2lmaWNhdGlvbnMuICovCisgICAgdWludDE2X3Qgc2FtcGxlX3BlcmlvZDsgICAgICAgICAvKio8IFNhbXBsZSBwZXJpb2QgaW4gdXMsIGludGVybmFsIEkyQyBob2xkL3Byb2hpYml0IHRpbWUgd2hlcmUgYWNjZXNzIHRvIGRldmljZSBpcyBub3QgYWxsb3dlZC4gKi8KK30gYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImlzc3VlX3Jzc2lfZ3JhbnQiIGdyb3VwIG9mICJlcG9uX25pIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnQKK3sKKyAgICBiY21vbHRfb3BlciBoZHI7ICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fbmlfa2V5IGtleTsgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YSIgCisgKiBncm91cCBvZiB0aGUgImVwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfZGF0YQoreworICAgIHVpbnQzMl90IHJlcmFuZ2VfZGVsdGE7IC8qKjwgUmUtcmFuZ2UgZGVsdGEuICovCit9IGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJwcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhIiAKKyAqIGdyb3VwIG9mICJlcG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhCit7CisgICAgYmNtb2x0X29wZXIgaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX25pX2tleSBrZXk7IC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInJvZ3VlX2xsaWRfc2NhbiIgZ3JvdXAgb2YgdGhlICJlcG9uX25pIiAKKyAqIG9iamVjdC4gCisgKgorICogSXNzdWUgYSByZXF1ZXN0IHRvIHNjYW4gYWxsIExMSURzIG9yIGEgc3BlY2lmaWMgTExJRCBvbiBhIFBPTiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2RhdGEKK3sKKyAgICBiY21vc19ib29sIG1vZGU7ICAgICAgICAvKio8IFRydWUgPSBTY2FuIGFsbCBMTElEUyBvbiB0aGUgUE9OICovCisgICAgYmNtb2x0X2Vwb25fbGxpZCBsbGlkOyAgLyoqPCBTcGVjaWZpYyBMTElEIHRvIHNjYW4gb3IgMCB0byBzY2FuIGFsbCB3aGVuIG1vZGUgaXMgQUxMICovCit9IGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInJvZ3VlX2xsaWRfc2NhbiIgZ3JvdXAgb2YgImVwb25fbmkiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuCit7CisgICAgYmNtb2x0X29wZXIgaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX25pX2tleSBrZXk7IC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW5fZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic2V0X2Vwb25fbmlfZW5fc3RhdGUiIGdyb3VwIG9mIHRoZSAiZXBvbl9uaSIgCisgKiBvYmplY3QuIAorICoKKyAqIFNldCB0aGUgRVBPTiBOSSBlbmFibGUgc3RhdGUuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9kYXRhCit7CisgICAgYmNtb2x0X2Vwb25fbmlfZW5fc3RhdGUgbmV3X3N0YXRlOyAgLyoqPCBOZXcgRVBPTiBOSSBlbmFibGUgc3RhdGUuICovCit9IGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic2V0X2Vwb25fbmlfZW5fc3RhdGUiIGdyb3VwIG9mICJlcG9uX25pIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlCit7CisgICAgYmNtb2x0X29wZXIgaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX25pX2tleSBrZXk7IC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhcnRfb251X3VwZ3JhZGUiIGdyb3VwIG9mIHRoZSAiZXBvbl9uaSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhCit7CisgICAgYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzIgbGlzdF9vZl9vbnVfaWRzOyAvKio8IExpc3Qgb2YgT05VcyB0byB1cGdyYWRlIHRoZSBmaXJtd2FyZS4gKi8KK30gYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGFydF9vbnVfdXBncmFkZSIgZ3JvdXAgb2YgImVwb25fbmkiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGUKK3sKKyAgICBiY21vbHRfb3BlciBoZHI7ICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fbmlfa2V5IGtleTsgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleSIgZ3JvdXAgb2YgdGhlICJlcG9uX29udV8xMGdfdXMiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5Cit7CisgICAgYmNtb2x0X2Vwb25fbmkgZXBvbl9uaTsgICAgIC8qKjwgRVBPTiBOSSB3aXRoIHdoaWNoIHRoaXMgT05VIGludGVyZmFjZSBpcyBhc3NvY2lhdGVkLiAqLworICAgIGJjbW9sdF9lcG9uX29udV9pZCBvbnVfaWQ7ICAvKio8IFVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBPTlUgaW50ZXJmYWNlIHdpdGhpbiBpdHMgRVBPTiBOSS4gKi8KK30gYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXk7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJjZmciIGdyb3VwIG9mIHRoZSAiZXBvbl9vbnVfMTBnX3VzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19kYXRhCit7CisgICAgYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfbWF4XzIwNDggYWxsX2xpbmtzOyAgLyoqPCBMaXN0IG9mIE1BQyBBZGRyZXNzZXMgZm9yIGFsbCBsaW5rcyBvbiB0aGUgT05VIElkLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImNmZyIgZ3JvdXAgb2YgImVwb25fb251XzEwZ191cyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmcKK3sKKyAgICBiY21vbHRfY2ZnIGhkcjsgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleSBrZXk7IC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXQiIGdyb3VwIG9mIHRoZSAiZXBvbl9vbnVfMTBnX3VzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZGF0YQoreworICAgIHVpbnQ2NF90IGZlY19jb2RlX3dvcmRzX3RvdGFsOyAgICAgICAgICAvKio8IEZFQyBzdGF0cyBjb2RlIHdvcmRzIHRvdGFsICovCisgICAgdWludDY0X3QgZmVjX2NvZGVfd29yZHNfZGVjb2RlX2ZhaWxzOyAgIC8qKjwgRkVDIHN0YXRzIGNvZGUgd29yZHMgZGVjb2RlIGZhaWxzICovCisgICAgdWludDY0X3QgZmVjX3plcm9lc19jb3JyZWN0ZWQ7ICAgICAgICAgIC8qKjwgRkVDIHN0YXRzIHplcm9zIGNvcnJlY3RlZCAqLworICAgIHVpbnQ2NF90IGZlY19vbmVzX2NvcnJlY3RlZDsgICAgICAgICAgICAvKio8IEZFQyBzdGF0cyBvbmVzIGNvcmVjdGVkICovCit9IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXQiIGdyb3VwIG9mICJlcG9uX29udV8xMGdfdXMiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdAoreworICAgIGJjbW9sdF9zdGF0IGhkcjsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkga2V5OyAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2NmZyIgZ3JvdXAgb2YgdGhlICJlcG9uX29udV8xMGdfdXMiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19kYXRhCit7CisgICAgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIGNmZzsgICAvKio8IFN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9jZmciIGdyb3VwIG9mICJlcG9uX29udV8xMGdfdXMiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZworeworICAgIGJjbW9sdF9zdGF0X2NmZyBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5IGtleTsgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmdfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdF9hbGFybV9jbGVhcmVkIiBncm91cCBvZiB0aGUgCisgKiAiZXBvbl9vbnVfMTBnX3VzIiBvYmplY3QuIAorICoKKyAqIFNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBpcyBubyBsb25nZXIgbWV0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YQoreworICAgIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9pZCBzdGF0OyAgICAvKio8IFN0YXRpc3RpYyBpZGVudGlmaWVyLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXRfYWxhcm1fY2xlYXJlZCIgZ3JvdXAgb2YgCisgKiAiZXBvbl9vbnVfMTBnX3VzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5IGtleTsgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfYWxhcm1fcmFpc2VkIiBncm91cCBvZiB0aGUgCisgKiAiZXBvbl9vbnVfMTBnX3VzIiBvYmplY3QuIAorICoKKyAqIFNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEKK3sKKyAgICBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfaWQgc3RhdDsgICAgLyoqPCBTdGF0aXN0aWMgaWRlbnRpZmllci4gKi8KK30gYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXRfYWxhcm1fcmFpc2VkIiBncm91cCBvZiAKKyAqICJlcG9uX29udV8xMGdfdXMiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleSBrZXk7IC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiYXV0b19jZmciIGdyb3VwIG9mIHRoZSAiZXBvbl9vbnVfMTBnX3VzIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfZGF0YQoreworICAgIGJjbW9zX2Jvb2wgc3RhdF9hbGFybV9jbGVhcmVkOyAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzdGF0X2FsYXJtX2NsZWFyZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgc3RhdF9hbGFybV9yYWlzZWQ7ICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzdGF0X2FsYXJtX3JhaXNlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCit9IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJhdXRvX2NmZyIgZ3JvdXAgb2YgImVwb25fb251XzEwZ191cyIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnCit7CisgICAgYmNtb2x0X2F1dG9fY2ZnIGhkcjsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkga2V5OyAgICAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJrZXkiIGdyb3VwIG9mIHRoZSAiZXBvbl9vbnVfMWdfdXMiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29udV8xZ191c19rZXkKK3sKKyAgICBiY21vbHRfZXBvbl9uaSBlcG9uX25pOyAgICAgLyoqPCBFUE9OIE5JIHdpdGggd2hpY2ggdGhpcyBPTlUgaW50ZXJmYWNlIGlzIGFzc29jaWF0ZWQuICovCisgICAgYmNtb2x0X2Vwb25fb251X2lkIG9udV9pZDsgIC8qKjwgVW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIE9OVSBpbnRlcmZhY2Ugd2l0aGluIGl0cyBFUE9OIE5JLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiY2ZnIiBncm91cCBvZiB0aGUgImVwb25fb251XzFnX3VzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2RhdGEKK3sKKyAgICBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMiBhbGxfbGlua3M7ICAgLyoqPCBMaXN0IG9mIE1BQyBBZGRyZXNzZXMgZm9yIGFsbCBsaW5rcyBvbiB0aGUgT05VIElkLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiY2ZnIiBncm91cCBvZiAiZXBvbl9vbnVfMWdfdXMiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29udV8xZ191c19jZmcKK3sKKyAgICBiY21vbHRfY2ZnIGhkcjsgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5IGtleTsgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdCIgZ3JvdXAgb2YgdGhlICJlcG9uX29udV8xZ191cyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YQoreworICAgIHVpbnQ2NF90IGdvb2RfZnJhbWVzOyAgICAgICAgICAgLyoqPCBHb29kIEZyYW1lIENvdW50LCBpbmNsdWRpbmcgbm9uRkVDIGFuZCBGRUMgKi8KKyAgICB1aW50NjRfdCBnb29kX2J5dGVzOyAgICAgICAgICAgIC8qKjwgR29vZCBCeXRlIENvdW50LCBpbmNsdWRpbmcgbm9uRkVDIGFuZCBGRUMgKi8KKyAgICB1aW50NjRfdCBvdmVyc3pfZnJhbWVzOyAgICAgICAgIC8qKjwgT3ZlcnNpemVkIGZyYW1lIGNvdW50IChmcmFtZXMgbGFyZ2VyIHRoYW4gMjAwMCBieXRlcykgKi8KKyAgICB1aW50NjRfdCBub25fZmVjX2dvb2RfZnJhbWVzOyAgIC8qKjwgTm9uIEZFQyBHb29kIEZyYW1lIENvdW50ICovCisgICAgdWludDY0X3Qgbm9uX2ZlY19nb29kX2J5dGVzOyAgICAvKio8IE5vbiBGRUMgR29vZCBCeXRlIENvdW50ICovCisgICAgdWludDY0X3QgZmVjX2dvb2RfZnJhbWVzOyAgICAgICAvKio8IEZFQyBHb29kIEZyYW1lIENvdW50ICovCisgICAgdWludDY0X3QgZmVjX2dvb2RfYnl0ZXM7ICAgICAgICAvKio8IEZFQyBHb29kIEJ5dGUgQ291bnQgKi8KKyAgICB1aW50NjRfdCBmZWNfZnJhbWVzX2V4Y19lcnJzOyAgIC8qKjwgRkVDIEZyYW1lcyB3aGljaCBleGNlZWRlZCA4IHN5bWJvbCBlcnJvcnMgKi8KKyAgICB1aW50NjRfdCBmZWNfYmxrc19ub19lcnJzOyAgICAgIC8qKjwgRkVDIEJsb2NrcyB3aXRoIG5vIGVycm9ycyAqLworICAgIHVpbnQ2NF90IGZlY19ibGtzX2NvcnJfZXJyczsgICAgLyoqPCBGRUMgQmxvY2tzIHdpdGggY29ycmVjdGFibGUgZXJyb3JzICovCisgICAgdWludDY0X3QgZmVjX2Jsa3NfdW5jb3JyX2VycnM7ICAvKio8IEZFQyBCbG9ja3Mgd2l0aCB1bmNvcnJlY3RhYmxlIGVycm9ycyAqLworICAgIHVpbnQ2NF90IGZlY19jb3JyX2J5dGVzOyAgICAgICAgLyoqPCBGRUMgQ29ycmVjdGVkIEJ5dGVzL1N5bWJvbHMgKi8KKyAgICB1aW50NjRfdCBmZWNfY29ycl96ZXJvZXM7ICAgICAgIC8qKjwgRkVDIENvcnJlY3RlZCBaZXJvZXMsIDhiIGRvbWFpbiAqLworICAgIHVpbnQ2NF90IGZlY19jb3JyX29uZXM7ICAgICAgICAgLyoqPCBGRUMgQ29ycmVjdGVkIE9uZXMsIDhiIGRvbWFpbiAqLworICAgIHVpbnQ2NF90IHVuZGVyc3pfZnJhbWVzOyAgICAgICAgLyoqPCBVbmRlcnNpemUgZnJhbWUgY291bnQgKGZyYW1lcyBsZXNzIHRoYW4gNjQgYnl0ZXMpICovCisgICAgdWludDY0X3QgZXJyb3Jzel9mcmFtZXM7ICAgICAgICAvKio8IEVycm9yZWQgZnJhbWUgICovCit9IGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdCIgZ3JvdXAgb2YgImVwb25fb251XzFnX3VzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdAoreworICAgIGJjbW9sdF9zdGF0IGhkcjsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSBrZXk7ICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfY2ZnIiBncm91cCBvZiB0aGUgImVwb25fb251XzFnX3VzIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19kYXRhCit7CisgICAgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIGNmZzsgICAvKio8IFN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGF0X2NmZyIgZ3JvdXAgb2YgImVwb25fb251XzFnX3VzIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZworeworICAgIGJjbW9sdF9zdGF0X2NmZyBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX29udV8xZ191c19rZXkga2V5OyAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2FsYXJtX2NsZWFyZWQiIGdyb3VwIG9mIHRoZSAKKyAqICJlcG9uX29udV8xZ191cyIgb2JqZWN0LiAKKyAqCisgKiBTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaXMgbm8gbG9uZ2VyIG1ldC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YQoreworICAgIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2lkIHN0YXQ7IC8qKjwgU3RhdGlzdGljIGlkZW50aWZpZXIuICovCit9IGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGF0X2FsYXJtX2NsZWFyZWQiIGdyb3VwIG9mIAorICogImVwb25fb251XzFnX3VzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSBrZXk7ICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfYWxhcm1fcmFpc2VkIiBncm91cCBvZiB0aGUgCisgKiAiZXBvbl9vbnVfMWdfdXMiIG9iamVjdC4gCisgKgorICogU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhCit7CisgICAgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfaWQgc3RhdDsgLyoqPCBTdGF0aXN0aWMgaWRlbnRpZmllci4gKi8KK30gYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9hbGFybV9yYWlzZWQiIGdyb3VwIG9mIAorICogImVwb25fb251XzFnX3VzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5IGtleTsgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJhdXRvX2NmZyIgZ3JvdXAgb2YgdGhlICJlcG9uX29udV8xZ191cyIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfZGF0YQoreworICAgIGJjbW9zX2Jvb2wgc3RhdF9hbGFybV9jbGVhcmVkOyAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzdGF0X2FsYXJtX2NsZWFyZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgc3RhdF9hbGFybV9yYWlzZWQ7ICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzdGF0X2FsYXJtX3JhaXNlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCit9IGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImF1dG9fY2ZnIiBncm91cCBvZiAiZXBvbl9vbnVfMWdfdXMiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnCit7CisgICAgYmNtb2x0X2F1dG9fY2ZnIGhkcjsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSBrZXk7ICAgICAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnX2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleSIgZ3JvdXAgb2YgdGhlICJlcG9uX3BhdGhfMTBnX2RzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkKK3sKKyAgICBiY21vbHRfZXBvbl9uaSBlcG9uX25pOyAvKio8IEVQT04gTkkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgMTBHIGRvd25zdHJlYW0gcGF0aC4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiY2ZnIiBncm91cCBvZiB0aGUgImVwb25fcGF0aF8xMGdfZHMiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19kYXRhCit7CisgICAgYmNtb2x0X2Vwb25fZmVjX2VuX3N0YXRlIGZlY19zdGF0ZTsgLyoqPCBGRUMgZW5hYmxlIHN0YXRlIGZvciB0aGUgMTBHIGRvd25zdHJlYW0gcGF0aCBvbiB0aGlzIEVQT04gTkkuICBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgY2hhbmdlZCB3aGlsZSB0aGUgRVBPTl9OSSBpcyBlbmFibGVkLiAqLworICAgIGJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWcgcHJic19nZW5lcmF0b3I7ICAgIC8qKjwgRFMgUFJCUyBnZW5lcmF0b3IgY29uZmlndXJhdGlvbiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJjZmciIGdyb3VwIG9mICJlcG9uX3BhdGhfMTBnX2RzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmcKK3sKKyAgICBiY21vbHRfY2ZnIGhkcjsgICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5IGtleTsgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXQiIGdyb3VwIG9mIHRoZSAiZXBvbl9wYXRoXzEwZ19kcyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhCit7CisgICAgdWludDY0X3QgYnl0ZXM7ICAgICAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBieXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZnJhbWVzOyAgICAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lc182NDsgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgNjQgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lc182NV8xMjc7ICAgICAvKio8IFRoZSBudW1iZXIgb2YgNjUgdG8gMTI3IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBmcmFtZXNfMTI4XzI1NTsgICAgLyoqPCBUaGUgbnVtYmVyIG9mIDEyOCB0byAyNTUgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lc18yNTZfNTExOyAgICAvKio8IFRoZSBudW1iZXIgb2YgMjU2IHRvIDUxMSBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZnJhbWVzXzUxMl8xMDIzOyAgIC8qKjwgVGhlIG51bWJlciBvZiA1MTIgdG8gMTAyMyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZnJhbWVzXzEwMjRfMTUxODsgIC8qKjwgVGhlIG51bWJlciBvZiAxMDI0IHRvIDE1MTggYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lc18xNTE5XzIwNDc7ICAvKio8IFRoZSBudW1iZXIgb2YgMTUxOSB0byAyMDQ3IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBmcmFtZXNfMjA0OF80MDk1OyAgLyoqPCBUaGUgbnVtYmVyIG9mIDIwNDggdG8gNDA5NSBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZnJhbWVzXzQwOTZfOTIxNjsgIC8qKjwgVGhlIG51bWJlciBvZiA0MDk2IHRvIDkyMTYgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lc185MjE3XzE2MzgzOyAvKio8IFRoZSBudW1iZXIgb2YgOTIxNyB0byAxNjM4MyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgYnJvYWRjYXN0X2ZyYW1lczsgIC8qKjwgVGhlIG51bWJlciBvZiBicm9hZGNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBkYXRhX2J5dGVzOyAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IG11bHRpY2FzdF9mcmFtZXM7ICAvKio8IFRoZSBudW1iZXIgb2YgbXVsdGljYXN0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgdW5pY2FzdF9mcmFtZXM7ICAgIC8qKjwgVGhlIG51bWJlciBvZiB1bmljYXN0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3Qgb2FtX2J5dGVzOyAgICAgICAgIC8qKjwgTnVtYmVyIG9mIE9BTSBieXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3Qgb2FtX2ZyYW1lczsgICAgICAgIC8qKjwgTnVtYmVyIG9mIE9BTSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGdhdGVfZnJhbWVzOyAgICAgICAvKio8IE51bWJlciBvZiBnYXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgbXBjcF9mcmFtZXM7ICAgICAgIC8qKjwgTnVtYmVyIG9mIE1QQ1AgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBhYm9ydF9mcmFtZXM7ICAgICAgLyoqPCBOdW1iZXIgb2YgYWJvcnQgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXQiIGdyb3VwIG9mICJlcG9uX3BhdGhfMTBnX2RzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0Cit7CisgICAgYmNtb2x0X3N0YXQgaGRyOyAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdF9jZmciIGdyb3VwIG9mIHRoZSAiZXBvbl9wYXRoXzEwZ19kcyIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19kYXRhCit7CisgICAgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIGNmZzsgICAvKio8IFN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXRfY2ZnIiBncm91cCBvZiAiZXBvbl9wYXRoXzEwZ19kcyIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZworeworICAgIGJjbW9sdF9zdGF0X2NmZyBoZHI7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleSBrZXk7ICAgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfYWxhcm1fY2xlYXJlZCIgZ3JvdXAgb2YgdGhlIAorICogImVwb25fcGF0aF8xMGdfZHMiIG9iamVjdC4gCisgKgorICogU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YQoreworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfaWQgc3RhdDsgICAvKio8IFN0YXRpc3RpYyBpZGVudGlmaWVyLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGF0X2FsYXJtX2NsZWFyZWQiIGdyb3VwIG9mIAorICogImVwb25fcGF0aF8xMGdfZHMiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfYWxhcm1fcmFpc2VkIiBncm91cCBvZiB0aGUgCisgKiAiZXBvbl9wYXRoXzEwZ19kcyIgb2JqZWN0LiAKKyAqCisgKiBTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YQoreworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfaWQgc3RhdDsgICAvKio8IFN0YXRpc3RpYyBpZGVudGlmaWVyLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXRfYWxhcm1fcmFpc2VkIiBncm91cCBvZiAKKyAqICJlcG9uX3BhdGhfMTBnX2RzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiYXV0b19jZmciIGdyb3VwIG9mIHRoZSAiZXBvbl9wYXRoXzEwZ19kcyIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19kYXRhCit7CisgICAgYmNtb3NfYm9vbCBzdGF0X2FsYXJtX2NsZWFyZWQ7ICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInN0YXRfYWxhcm1fY2xlYXJlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBzdGF0X2FsYXJtX3JhaXNlZDsgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInN0YXRfYWxhcm1fcmFpc2VkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJhdXRvX2NmZyIgZ3JvdXAgb2YgImVwb25fcGF0aF8xMGdfZHMiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmcKK3sKKyAgICBiY21vbHRfYXV0b19jZmcgaGRyOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkga2V5OyAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJrZXkiIGdyb3VwIG9mIHRoZSAiZXBvbl9wYXRoXzEwZ191cyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5Cit7CisgICAgYmNtb2x0X2Vwb25fbmkgZXBvbl9uaTsgLyoqPCBFUE9OIE5JIGFzc29jaWF0ZWQgd2l0aCB0aGlzIDEwRyB1cHN0cmVhbSBwYXRoLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXk7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJjZmciIGdyb3VwIG9mIHRoZSAiZXBvbl9wYXRoXzEwZ191cyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2RhdGEKK3sKKyAgICBiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGUgZmVjX3N0YXRlOyAgICAgICAgIC8qKjwgRkVDIGVuYWJsZSBzdGF0ZSBmb3IgdGhlIDEwRyB1cHN0cmVhbSBwYXRoIG9uIHRoaXMgRVBPTiBOSS4gIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBjaGFuZ2VkIHdoaWxlIHRoZSBFUE9OX05JIGlzIGVuYWJsZWQuICovCisgICAgYmNtb2x0X3RpbWVfcXVhbnRhIHN5bmNfdGltZV90cTsgICAgICAgICAgICAvKio8IFRpbWUgcXVhbnRhIG9mIHN5bmMgYXQgc3RhcnQgb2YgVVMgYnVyc3QuICBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgY2hhbmdlZCB3aGlsZSB0aGUgRVBPTl9OSSBpcyBlbmFibGVkLiAqLworICAgIGJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnIHByYnNfY2hlY2tlcjsgICAgLyoqPCBVUyBQUkJTIGNoZWNrZXIgY29uZmlndXJhdGlvbiAqLworICAgIGJjbW9sdF9wcmJzX3N0YXR1cyBwcmJzX3N0YXR1czsgICAgICAgICAgICAgLyoqPCBSZXN1bHQgb2YgVVMgUFJCUyBjaGVja2VyICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImNmZyIgZ3JvdXAgb2YgImVwb25fcGF0aF8xMGdfdXMiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZworeworICAgIGJjbW9sdF9jZmcgaGRyOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdCIgZ3JvdXAgb2YgdGhlICJlcG9uX3BhdGhfMTBnX3VzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEKK3sKKyAgICB1aW50NjRfdCBieXRlczsgICAgICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZnJhbWVzOyAgICAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBmcmFtZXNfNjQ7ICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIDY0IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZnJhbWVzXzY1XzEyNzsgICAgIC8qKjwgVGhlIG51bWJlciBvZiA2NSB0byAxMjcgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBmcmFtZXNfMTI4XzI1NTsgICAgLyoqPCBUaGUgbnVtYmVyIG9mIDEyOCB0byAyNTUgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBmcmFtZXNfMjU2XzUxMTsgICAgLyoqPCBUaGUgbnVtYmVyIG9mIDI1NiB0byA1MTEgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBmcmFtZXNfNTEyXzEwMjM7ICAgLyoqPCBUaGUgbnVtYmVyIG9mIDUxMiB0byAxMDIzIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZnJhbWVzXzEwMjRfMTUxODsgIC8qKjwgVGhlIG51bWJlciBvZiAxMDI0IHRvIDE1MTggYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBmcmFtZXNfMTUxOV8yMDQ3OyAgLyoqPCBUaGUgbnVtYmVyIG9mIDE1MTkgdG8gMjA0NyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lc18yMDQ4XzQwOTU7ICAvKio8IFRoZSBudW1iZXIgb2YgMjA0OCB0byA0MDk1IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZnJhbWVzXzQwOTZfOTIxNjsgIC8qKjwgVGhlIG51bWJlciBvZiA0MDk2IHRvIDkyMTYgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBmcmFtZXNfOTIxN18xNjM4MzsgLyoqPCBUaGUgbnVtYmVyIG9mIDkyMTcgdG8gMTYzODMgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBicm9hZGNhc3RfZnJhbWVzOyAgLyoqPCBUaGUgbnVtYmVyIG9mIGJyb2FkY2FzdCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBkYXRhX2J5dGVzOyAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBtdWx0aWNhc3RfZnJhbWVzOyAgLyoqPCBUaGUgbnVtYmVyIG9mIG11bHRpY2FzdCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCB1bmljYXN0X2ZyYW1lczsgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHVuaWNhc3QgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgbXBjcF9mcmFtZXM7ICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBNUENQIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IG9hbV9ieXRlczsgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgT0FNIGJ5dGVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3Qgb2FtX2ZyYW1lczsgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBPQU0gZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgcmVwb3J0X2ZyYW1lczsgICAgIC8qKjwgVGhlIG51bWJlciBvZiByZXBvcnQgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgYWJvcnRfZnJhbWVzOyAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBhYm9ydCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBmY3NfZXJyb3I7ICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIGJhZCBGQ1MgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgY3JjXzhfZXJyb3I7ICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBDUkM4IGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IG91dF9vZl9zbG90OyAgICAgICAvKio8IFRoZSBudW1iZXIgb2Ygb3V0IG9mIHNsb3QgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3Qgb3ZlcnNpemVfZXJyb3I7ICAgIC8qKjwgVGhlIG51bWJlciBvZiBvdmVyc2l6ZSBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBydW50X2Vycm9yOyAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHJ1bnQgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGF0IiBncm91cCBvZiAiZXBvbl9wYXRoXzEwZ191cyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdAoreworICAgIGJjbW9sdF9zdGF0IGhkcjsgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfY2ZnIiBncm91cCBvZiB0aGUgImVwb25fcGF0aF8xMGdfdXMiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfZGF0YQoreworICAgIGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyBjZmc7ICAgLyoqPCBTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGF0X2NmZyIgZ3JvdXAgb2YgImVwb25fcGF0aF8xMGdfdXMiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmcKK3sKKyAgICBiY21vbHRfc3RhdF9jZmcgaGRyOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkga2V5OyAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2FsYXJtX2NsZWFyZWQiIGdyb3VwIG9mIHRoZSAKKyAqICJlcG9uX3BhdGhfMTBnX3VzIiBvYmplY3QuIAorICoKKyAqIFNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBpcyBubyBsb25nZXIgbWV0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEKK3sKKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2lkIHN0YXQ7ICAgLyoqPCBTdGF0aXN0aWMgaWRlbnRpZmllci4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9hbGFybV9jbGVhcmVkIiBncm91cCBvZiAKKyAqICJlcG9uX3BhdGhfMTBnX3VzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5IGtleTsgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2FsYXJtX3JhaXNlZCIgZ3JvdXAgb2YgdGhlIAorICogImVwb25fcGF0aF8xMGdfdXMiIG9iamVjdC4gCisgKgorICogU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEKK3sKKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2lkIHN0YXQ7ICAgLyoqPCBTdGF0aXN0aWMgaWRlbnRpZmllci4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGF0X2FsYXJtX3JhaXNlZCIgZ3JvdXAgb2YgCisgKiAiZXBvbl9wYXRoXzEwZ191cyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5IGtleTsgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImF1dG9fY2ZnIiBncm91cCBvZiB0aGUgImVwb25fcGF0aF8xMGdfdXMiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfZGF0YQoreworICAgIGJjbW9zX2Jvb2wgc3RhdF9hbGFybV9jbGVhcmVkOyAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzdGF0X2FsYXJtX2NsZWFyZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgc3RhdF9hbGFybV9yYWlzZWQ7ICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzdGF0X2FsYXJtX3JhaXNlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiYXV0b19jZmciIGdyb3VwIG9mICJlcG9uX3BhdGhfMTBnX3VzIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnCit7CisgICAgYmNtb2x0X2F1dG9fY2ZnIGhkcjsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5IGtleTsgICAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAia2V5IiBncm91cCBvZiB0aGUgImVwb25fcGF0aF8xZ19kcyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkKK3sKKyAgICBiY21vbHRfZXBvbl9uaSBlcG9uX25pOyAvKio8IEVQT04gTkkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgMUcgZG93bnN0cmVhbSBwYXRoLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNmZyIgZ3JvdXAgb2YgdGhlICJlcG9uX3BhdGhfMWdfZHMiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGEKK3sKKyAgICBiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGUgZGVmYXVsdF9mZWNfc3RhdGU7IC8qKjwgRGVmYXVsdCBGRUMgZW5hYmxlIHN0YXRlIGZvciB0aGUgMUcgZG93bnN0cmVhbSBwYXRoIG9uIHRoaXMgRVBPTiBOSS4gIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBjaGFuZ2VkIHdoaWxlIHRoZSBFUE9OX05JIGlzIGVuYWJsZWQuICovCisgICAgYmNtb2x0X3JhbWFuX21pdGlnYXRpb25fbW9kZSByYW1hbl9tb2RlOyAgICAvKio8IFJhbWFuIG1pdGlnYXRpb24gbW9kZSBmb3IgdGhlIDFHIGRvd25zdHJlYW0gcGF0aCBvbiB0aGlzIEVQT04gTkkuICBSYW1hbiBtaXRpZ2F0aW9uIGNhbm5vdCBjb2V4aXN0IHdpdGggdHVyYm8gbW9kZS4gIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBjaGFuZ2VkIHdoaWxlIHRoZSBFUE9OX05JIGlzIGVuYWJsZWQuICovCisgICAgYmNtb2x0X2Vwb25fMWdfdHVyYm9fbW9kZSB0dXJib18yZ19tb2RlOyAgICAvKio8IE9wZXJhdGUgdGhlIDFHIGRvd25zdHJlYW0gcGF0aCBhdCB0aGUgdHVyYm8gMkcgZGF0YSByYXRlIG9uIHRoaXMgRVBPTiBOSS4gIFJhbWFuIG1pdGlnYXRpb24gY2Fubm90IGNvZXhpc3Qgd2l0aCB0dXJibyBtb2RlLiAgVGhpcyBhdHRyaWJ1dGUgY2Fubm90IGJlIGNoYW5nZWQgd2hpbGUgdGhlIEVQT05fTkkgaXMgZW5hYmxlZC4gKi8KKyAgICBiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnIHByYnNfZ2VuZXJhdG9yOyAgICAvKio8IERTIFBSQlMgZ2VuZXJhdG9yIGNvbmZpZ3VyYXRpb24gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJjZmciIGdyb3VwIG9mICJlcG9uX3BhdGhfMWdfZHMiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnCit7CisgICAgYmNtb2x0X2NmZyBoZHI7ICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkga2V5OyAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0IiBncm91cCBvZiB0aGUgImVwb25fcGF0aF8xZ19kcyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEKK3sKKyAgICB1aW50NjRfdCBieXRlczsgICAgICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lczsgICAgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lc182NDsgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgNjQgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZnJhbWVzXzY1XzEyNzsgICAgIC8qKjwgVGhlIG51bWJlciBvZiA2NSB0byAxMjcgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZnJhbWVzXzEyOF8yNTU7ICAgIC8qKjwgVGhlIG51bWJlciBvZiAxMjggdG8gMjU1IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lc18yNTZfNTExOyAgICAvKio8IFRoZSBudW1iZXIgb2YgMjU2IHRvIDUxMSBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBmcmFtZXNfNTEyXzEwMjM7ICAgLyoqPCBUaGUgbnVtYmVyIG9mIDUxMiB0byAxMDIzIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lc18xMDI0XzE1MTg7ICAvKio8IFRoZSBudW1iZXIgb2YgMTAyNCB0byAxNTE4IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lc18xNTE5XzIwNDc7ICAvKio8IFRoZSBudW1iZXIgb2YgMTUxOSB0byAyMDQ3IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lc18yMDQ4XzQwOTU7ICAvKio8IFRoZSBudW1iZXIgb2YgMjA0OCB0byA0MDk1IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lc180MDk2XzkyMTY7ICAvKio8IFRoZSBudW1iZXIgb2YgNDA5NiB0byA5MjE2IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lc185MjE3XzE2MzgzOyAvKio8IFRoZSBudW1iZXIgb2YgOTIxNyB0byAxNjM4MyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBicm9hZGNhc3RfZnJhbWVzOyAgLyoqPCBUaGUgbnVtYmVyIG9mIGJyb2FkY2FzdCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZGF0YV9ieXRlczsgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IG11bHRpY2FzdF9mcmFtZXM7ICAvKio8IFRoZSBudW1iZXIgb2YgbXVsdGljYXN0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCB1bmljYXN0X2ZyYW1lczsgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHVuaWNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IG9hbV9ieXRlczsgICAgICAgICAvKio8IE51bWJlciBvZiBPQU0gYnl0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3Qgb2FtX2ZyYW1lczsgICAgICAgIC8qKjwgTnVtYmVyIG9mIE9BTSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZ2F0ZV9mcmFtZXM7ICAgICAgIC8qKjwgTnVtYmVyIG9mIGdhdGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IG1wY3BfZnJhbWVzOyAgICAgICAvKio8IE51bWJlciBvZiBNUENQIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBhYm9ydF9mcmFtZXM7ICAgICAgLyoqPCBOdW1iZXIgb2YgYWJvcnQgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGF0IiBncm91cCBvZiAiZXBvbl9wYXRoXzFnX2RzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXQKK3sKKyAgICBiY21vbHRfc3RhdCBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSBrZXk7IC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2NmZyIgZ3JvdXAgb2YgdGhlICJlcG9uX3BhdGhfMWdfZHMiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZ19kYXRhCit7CisgICAgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIGNmZzsgICAvKio8IFN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9jZmciIGdyb3VwIG9mICJlcG9uX3BhdGhfMWdfZHMiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZworeworICAgIGJjbW9sdF9zdGF0X2NmZyBoZHI7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5IGtleTsgICAgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdF9hbGFybV9jbGVhcmVkIiBncm91cCBvZiB0aGUgCisgKiAiZXBvbl9wYXRoXzFnX2RzIiBvYmplY3QuIAorICoKKyAqIFNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBpcyBubyBsb25nZXIgbWV0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YQoreworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9pZCBzdGF0OyAgICAvKio8IFN0YXRpc3RpYyBpZGVudGlmaWVyLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXRfYWxhcm1fY2xlYXJlZCIgZ3JvdXAgb2YgCisgKiAiZXBvbl9wYXRoXzFnX2RzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5IGtleTsgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfYWxhcm1fcmFpc2VkIiBncm91cCBvZiB0aGUgCisgKiAiZXBvbl9wYXRoXzFnX2RzIiBvYmplY3QuIAorICoKKyAqIFNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEKK3sKKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfaWQgc3RhdDsgICAgLyoqPCBTdGF0aXN0aWMgaWRlbnRpZmllci4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXRfYWxhcm1fcmFpc2VkIiBncm91cCBvZiAKKyAqICJlcG9uX3BhdGhfMWdfZHMiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSBrZXk7IC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiYXV0b19jZmciIGdyb3VwIG9mIHRoZSAiZXBvbl9wYXRoXzFnX2RzIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfZGF0YQoreworICAgIGJjbW9zX2Jvb2wgc3RhdF9hbGFybV9jbGVhcmVkOyAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzdGF0X2FsYXJtX2NsZWFyZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgc3RhdF9hbGFybV9yYWlzZWQ7ICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzdGF0X2FsYXJtX3JhaXNlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJhdXRvX2NmZyIgZ3JvdXAgb2YgImVwb25fcGF0aF8xZ19kcyIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnCit7CisgICAgYmNtb2x0X2F1dG9fY2ZnIGhkcjsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkga2V5OyAgICAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJrZXkiIGdyb3VwIG9mIHRoZSAiZXBvbl9wYXRoXzFnX3VzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleQoreworICAgIGJjbW9sdF9lcG9uX25pIGVwb25fbmk7IC8qKjwgRVBPTiBOSSBhc3NvY2lhdGVkIHdpdGggdGhpcyAxRyB1cHN0cmVhbSBwYXRoLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNmZyIgZ3JvdXAgb2YgdGhlICJlcG9uX3BhdGhfMWdfdXMiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2RhdGEKK3sKKyAgICBiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGUgZGVmYXVsdF9mZWNfc3RhdGU7IC8qKjwgRGVmYXVsdCBGRUMgZW5hYmxlIHN0YXRlIGZvciB0aGUgMUcgdXBzdHJlYW0gcGF0aCBvbiB0aGlzIEVQT04gTkkuICBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgY2hhbmdlZCB3aGlsZSB0aGUgRVBPTl9OSSBpcyBlbmFibGVkLiAqLworICAgIGJjbW9sdF90aW1lX3F1YW50YSBzeW5jX3RpbWVfdHE7ICAgICAgICAgICAgLyoqPCBUaW1lIHF1YW50YSBvZiBzeW5jIGF0IHN0YXJ0IG9mIFVTIGJ1cnN0LiAgVGhpcyBhdHRyaWJ1dGUgY2Fubm90IGJlIGNoYW5nZWQgd2hpbGUgdGhlIEVQT05fTkkgaXMgZW5hYmxlZC4gKi8KKyAgICBiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZyBwcmJzX2NoZWNrZXI7ICAgIC8qKjwgVVMgUFJCUyBjaGVja2VyIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBiY21vbHRfcHJic19zdGF0dXMgcHJic19zdGF0dXM7ICAgICAgICAgICAgIC8qKjwgUmVzdWx0IG9mIFVTIFBSQlMgY2hlY2tlciAqLworfSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImNmZyIgZ3JvdXAgb2YgImVwb25fcGF0aF8xZ191cyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmcKK3sKKyAgICBiY21vbHRfY2ZnIGhkcjsgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleSBrZXk7IC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXQiIGdyb3VwIG9mIHRoZSAiZXBvbl9wYXRoXzFnX3VzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YQoreworICAgIHVpbnQ2NF90IGJ5dGVzOyAgICAgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lczsgICAgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBmcmFtZXNfNjQ7ICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIDY0IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBmcmFtZXNfNjVfMTI3OyAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIDY1IHRvIDEyNyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZnJhbWVzXzEyOF8yNTU7ICAgIC8qKjwgVGhlIG51bWJlciBvZiAxMjggdG8gMjU1IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBmcmFtZXNfMjU2XzUxMTsgICAgLyoqPCBUaGUgbnVtYmVyIG9mIDI1NiB0byA1MTEgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lc181MTJfMTAyMzsgICAvKio8IFRoZSBudW1iZXIgb2YgNTEyIHRvIDEwMjMgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lc18xMDI0XzE1MTg7ICAvKio8IFRoZSBudW1iZXIgb2YgMTAyNCB0byAxNTE4IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBmcmFtZXNfMTUxOV8yMDQ3OyAgLyoqPCBUaGUgbnVtYmVyIG9mIDE1MTkgdG8gMjA0NyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZnJhbWVzXzIwNDhfNDA5NTsgIC8qKjwgVGhlIG51bWJlciBvZiAyMDQ4IHRvIDQwOTUgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZyYW1lc180MDk2XzkyMTY7ICAvKio8IFRoZSBudW1iZXIgb2YgNDA5NiB0byA5MjE2IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBmcmFtZXNfOTIxN18xNjM4MzsgLyoqPCBUaGUgbnVtYmVyIG9mIDkyMTcgdG8gMTYzODMgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGJyb2FkY2FzdF9mcmFtZXM7ICAvKio8IFRoZSBudW1iZXIgb2YgYnJvYWRjYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgZGF0YV9ieXRlczsgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBtdWx0aWNhc3RfZnJhbWVzOyAgLyoqPCBUaGUgbnVtYmVyIG9mIG11bHRpY2FzdCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IHVuaWNhc3RfZnJhbWVzOyAgICAvKio8IFRoZSBudW1iZXIgb2YgdW5pY2FzdCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IG1wY3BfZnJhbWVzOyAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgTVBDUCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IG9hbV9ieXRlczsgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgT0FNIGJ5dGVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBvYW1fZnJhbWVzOyAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIE9BTSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IHJlcG9ydF9mcmFtZXM7ICAgICAvKio8IFRoZSBudW1iZXIgb2YgcmVwb3J0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgYWJvcnRfZnJhbWVzOyAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBhYm9ydCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGZjc19lcnJvcjsgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgYmFkIEZDUyBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IGNyY184X2Vycm9yOyAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgQ1JDOCBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiAqLworICAgIHVpbnQ2NF90IG91dF9vZl9zbG90OyAgICAgICAvKio8IFRoZSBudW1iZXIgb2Ygb3V0IG9mIHNsb3QgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4gKi8KKyAgICB1aW50NjRfdCBvdmVyc2l6ZV9lcnJvcjsgICAgLyoqPCBUaGUgbnVtYmVyIG9mIG92ZXJzaXplIGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguICovCisgICAgdWludDY0X3QgcnVudF9lcnJvcjsgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBydW50IGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXQiIGdyb3VwIG9mICJlcG9uX3BhdGhfMWdfdXMiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdAoreworICAgIGJjbW9sdF9zdGF0IGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5IGtleTsgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfY2ZnIiBncm91cCBvZiB0aGUgImVwb25fcGF0aF8xZ191cyIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2RhdGEKK3sKKyAgICBiY21vbHRfc3RhdF9hbGFybV9jb25maWcgY2ZnOyAgIC8qKjwgU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGF0X2NmZyIgZ3JvdXAgb2YgImVwb25fcGF0aF8xZ191cyIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnCit7CisgICAgYmNtb2x0X3N0YXRfY2ZnIGhkcjsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkga2V5OyAgICAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2FsYXJtX2NsZWFyZWQiIGdyb3VwIG9mIHRoZSAKKyAqICJlcG9uX3BhdGhfMWdfdXMiIG9iamVjdC4gCisgKgorICogU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhCit7CisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2lkIHN0YXQ7ICAgIC8qKjwgU3RhdGlzdGljIGlkZW50aWZpZXIuICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9hbGFybV9jbGVhcmVkIiBncm91cCBvZiAKKyAqICJlcG9uX3BhdGhfMWdfdXMiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkga2V5OyAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdF9hbGFybV9yYWlzZWQiIGdyb3VwIG9mIHRoZSAKKyAqICJlcG9uX3BhdGhfMWdfdXMiIG9iamVjdC4gCisgKgorICogU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YQoreworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9pZCBzdGF0OyAgICAvKio8IFN0YXRpc3RpYyBpZGVudGlmaWVyLiAqLworfSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9hbGFybV9yYWlzZWQiIGdyb3VwIG9mIAorICogImVwb25fcGF0aF8xZ191cyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5IGtleTsgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJhdXRvX2NmZyIgZ3JvdXAgb2YgdGhlICJlcG9uX3BhdGhfMWdfdXMiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19kYXRhCit7CisgICAgYmNtb3NfYm9vbCBzdGF0X2FsYXJtX2NsZWFyZWQ7ICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInN0YXRfYWxhcm1fY2xlYXJlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBzdGF0X2FsYXJtX3JhaXNlZDsgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInN0YXRfYWxhcm1fcmFpc2VkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImF1dG9fY2ZnIiBncm91cCBvZiAiZXBvbl9wYXRoXzFnX3VzIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmcKK3sKKyAgICBiY21vbHRfYXV0b19jZmcgaGRyOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleSBrZXk7ICAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleSIgZ3JvdXAgb2YgdGhlICJlcG9uX3JwIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9ycF9rZXkKK3sKKyAgICBiY21vbHRfZXBvbl9uaSBlcG9uX25pOyAgICAgICAgICAgICAvKio8IEVQT04gTkkgY29udGFpbmluZyB0aGlzIFJQLiAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfcmF0ZSBsaW5rX3JhdGU7ICAgIC8qKjwgTGluayByYXRlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFJQLiAgTXVzdCBiZSBvbmUgb2YgMTAvMTAsIDEwLzEsIG9yIDEvMS4gKi8KK30gYmNtb2x0X2Vwb25fcnBfa2V5OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiY2ZnIiBncm91cCBvZiB0aGUgImVwb25fcnAiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX3JwX2NmZ19kYXRhCit7CisgICAgYmNtb2x0X2Vwb25fbGxpZCBiYXNlX2xsaWQ7ICAgICAgICAgICAgICAgICAvKio8IEJhc2UgKGxvd2VzdCkgbG9naWNhbCBsaW5rIGlkZW50aWZpZXIgZm9yIHRoaXMgUlAuICBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgY2hhbmdlZCB3aGlsZSB0aGUgRVBPTl9OSSBpcyBlbmFibGVkLCBub3Igd2hpbGUgYW55IG5vbi1zeXN0ZW0gbGlua3MgZXhpc3QuICBUaGUgc3VtIG9mIHRoaXMgdmFsdWUgYW5kIG1heF9saW5rcyBmb3IgdGhpcyBSUCBtdXN0IGJlIDB4N2VmZiBvciBzbWFsbGVyLiAqLworICAgIGJjbW9zX2Jvb2wgbXBjcF9kaXNjX2VuOyAgICAgICAgICAgICAgICAgICAgLyoqPCBHb3Zlcm5zIHdoZXRoZXIgZGlzY292ZXJ5IGdhdGVzIGZvciB0aGlzIFJQIGFyZSBpc3N1ZWQgICovCisgICAgYmNtb2x0X3RpbWVfcXVhbnRhIG1wY3BfZGlzY19nbnRfbGVuX3RxOyAgICAvKio8IExlbmd0aCBvZiBkaXNjb3ZlcnkgZ3JhbnRzIGluIHRpbWUgcXVhbnRhIGZvciB0aGlzIFJQLiAqLworICAgIHVpbnQxNl90IG1wY3BfcmVwb3J0X3RpbWVvdXQ7ICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgbXMgYmVmb3JlIGxpbmtzIGFyZSBkZXJlZ2lzdGVyZWQgZHVlIHRvIG5vIHJlcG9ydCByZWNlaXZlZC4gKi8KKyAgICB1aW50MTZfdCBtYXhfbXBjcF9yZWdfcGVyX2Rpc2Nfd2luZG93OyAgICAgIC8qKjwgTWF4aW11bSBudW1iZXIgb2YgTVBDUCByZWdpc3RyYXRpb25zIHBlciBkaXNjb3Zlcnkgd2luZG93IG9uIHRoaXMgUlAgKDAgaW5kaWNhdGVzIHVubGltaXRlZCkuICovCisgICAgdWludDE2X3QgbWF4X2xpbmtzOyAvKio8IE1heGltdW0gbnVtYmVyIG9mIGxpbmtzIHRvIHJlZ2lzdGVyIG9uIHRoaXMgRVBPTl9SUC4gIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBjaGFuZ2VkIHdoaWxlIHRoZSBFUE9OX05JIGlzIGVuYWJsZWQsIG5vciB3aGlsZSBhbnkgbm9uLXN5c3RlbSBsaW5rcyBleGlzdC4gIFRoZSBhY3R1YWwgbGltaXQgaXMgZGVwZW5kZW50IG9uIHRoZSBzeXN0ZW0gbW9kZS4gKi8KKyAgICBiY21vbHRfdXBzdHJlYW1fYmFuZHdpZHRoX2Rpc3RyaWJ1dGlvbiBkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aDsgIC8qKjwgRGVmYXVsdCB1cHN0cmVhbSBiYW5kd2lkdGggZm9yIG5ld2x5IGNyZWF0ZWQgbGlua3MuICovCisgICAgZG91YmxlIHJhdGVfb2ZfcmVmcmFjdGlvbjsgIC8qKjwgVGhlc2UgYXJlIG1hZ2ljIG51bWJlcnMgZGVyaXZlZCB1c2luZyB0aGUgcHJvY2VzcyBkZWZpbmVkIGluIElUVS1UIEcuOTg0LjMgQXBwZW5kaXggVklJIChodHRwOi8vd3d3Lml0dS5pbnQvcmVjL1QtUkVDLUcuOTg0LjMtMjAwOTExLVMhQW1kMi9lbikgYW5kIElUVS1UIEcuOTg3LjMgQXBwZW5kaXggSUkgKGh0dHA6Ly93d3cuaXR1LmludC9yZWMvVC1SRUMtRy45ODcuMy0yMDEwMTAtUy9lbikgKi8KK30gYmNtb2x0X2Vwb25fcnBfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiY2ZnIiBncm91cCBvZiAiZXBvbl9ycCIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fcnBfY2ZnCit7CisgICAgYmNtb2x0X2NmZyBoZHI7ICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2Vwb25fcnBfa2V5IGtleTsgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2Vwb25fcnBfY2ZnX2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9lcG9uX3JwX2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleSIgZ3JvdXAgb2YgdGhlICJncGlvIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bpb19rZXkKK3sKKyAgICB1aW50MzJfdCByZXNlcnZlZDsgICAgICAgICAgLyoqPCBSZXNlcnZlZCAoc2V0IHRvIDApLiAqLworICAgIGJjbW9sdF9ncGlvX3BpbiBncGlvX2lkOyAgICAvKio8IEdQSU8gSUQuICovCit9IGJjbW9sdF9ncGlvX2tleTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNmZyIgZ3JvdXAgb2YgdGhlICJncGlvIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bpb19jZmdfZGF0YQoreworICAgIGJjbW9sdF9ncGlvX3Bpbl9kaXIgZGlyZWN0aW9uOyAgLyoqPCBHUElPIFBJTiBkaXJlY3Rpb24gKGlucHV0IG9yIG91dHB1dCkgKi8KKyAgICBiY21vbHRfZ3Bpb192YWx1ZSB2YWx1ZTsgICAgICAgIC8qKjwgVmFsdWUgdG8gd3JpdGUuICovCit9IGJjbW9sdF9ncGlvX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImNmZyIgZ3JvdXAgb2YgImdwaW8iIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncGlvX2NmZworeworICAgIGJjbW9sdF9jZmcgaGRyOyAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwaW9fa2V5IGtleTsgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bpb19jZmdfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bpb19jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJrZXkiIGdyb3VwIG9mIHRoZSAiZ3Bvbl9hbGxvYyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fYWxsb2Nfa2V5Cit7CisgICAgYmNtb2x0X2dwb25fbmkgcG9uX25pOyAgICAgICAgICAvKio8IFBPTiBuZXR3b3JrIGludGVyZmFjZS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19pZCBhbGxvY19pZDsgIC8qKjwgQWxsb2MgSUQuICovCit9IGJjbW9sdF9ncG9uX2FsbG9jX2tleTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNmZyIgZ3JvdXAgb2YgdGhlICJncG9uX2FsbG9jIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9hbGxvY19jZmdfZGF0YQoreworICAgIGJjbW9sdF9hbGxvY19zdGF0ZSBzdGF0ZTsgICAvKio8IEN1cnJlbnQgQWxsb2MgSUQgc3RhdGUgKi8KKyAgICBiY21vbHRfcG9uX2FsbG9jX3NsYSBzbGE7ICAgLyoqPCBBbGxvYyBJRCBTTEEgKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfaWQgb251X2lkOyAgLyoqPCBPTlUgSUQgdGhlIGFsbG9jIElEIGlzIGFzc2lnbmVkIHRvICovCisgICAgYmNtb3NfYm9vbCBjb2xsZWN0X3N0YXRzOyAgIC8qKjwgRW5hYmxlIHN0YXRpc3RpY3MgY29sbGVjdGlvbiBmb3IgdGhpcyBhbGxvYyBJRCAqLworfSBiY21vbHRfZ3Bvbl9hbGxvY19jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJjZmciIGdyb3VwIG9mICJncG9uX2FsbG9jIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9hbGxvY19jZmcKK3sKKyAgICBiY21vbHRfY2ZnIGhkcjsgICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fYWxsb2Nfa2V5IGtleTsgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19kYXRhIGRhdGE7ICAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fYWxsb2NfY2ZnOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdCIgZ3JvdXAgb2YgdGhlICJncG9uX2FsbG9jIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2RhdGEKK3sKKyAgICB1aW50NjRfdCByeF9ieXRlczsgIC8qKjwgTnVtYmVyIG9mIGFsbG9jIElEIHJlY2VpdmVkIGJ5dGVzLiAqLworfSBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdCIgZ3JvdXAgb2YgImdwb25fYWxsb2MiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX2FsbG9jX3N0YXQKK3sKKyAgICBiY21vbHRfc3RhdCBoZHI7ICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fYWxsb2Nfa2V5IGtleTsgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fYWxsb2Nfc3RhdDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfY2ZnIiBncm91cCBvZiB0aGUgImdwb25fYWxsb2MiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGEKK3sKKyAgICBiY21vbHRfc3RhdF9hbGFybV9jb25maWcgY2ZnOyAgIC8qKjwgU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uICovCit9IGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9jZmciIGdyb3VwIG9mICJncG9uX2FsbG9jIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZworeworICAgIGJjbW9sdF9zdGF0X2NmZyBoZHI7ICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fYWxsb2Nfa2V5IGtleTsgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNvbmZpZ3VyYXRpb25fY29tcGxldGVkIiBncm91cCBvZiB0aGUgCisgKiAiZ3Bvbl9hbGxvYyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YQoreworICAgIGJjbW9sdF9yZXN1bHQgc3RhdHVzOyAgICAgICAgICAgLyoqPCBTdGF0dXMuICovCisgICAgYmNtb2x0X2FsbG9jX3N0YXRlIG5ld19zdGF0ZTsgICAvKio8IG5ldyBzdGF0ZS4gKi8KK30gYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJjb25maWd1cmF0aW9uX2NvbXBsZXRlZCIgZ3JvdXAgb2YgCisgKiAiZ3Bvbl9hbGxvYyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX2FsbG9jX2tleSBrZXk7ICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCIgZ3JvdXAgb2YgdGhlIAorICogImdwb25fYWxsb2MiIG9iamVjdC4gCisgKgorICogQ29sbGVjdGVkIGFsbG9jIElEIHN0YXRpc3RpY3MgZnJvbSBnZXRfc3RhdHMgb3BlcmF0aW9uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEKK3sKKyAgICBiY21vbHRfcmVzdWx0IHN0YXR1czsgICAgICAgICAgIC8qKjwgc3RhdHVzLiAqLworICAgIHVpbnQzMl90IGF2ZXJhZ2VfbnNyX3VzZWQ7ICAgICAgLyoqPCBBdmVyYWdlIE5TUiB1c2VkIGJ5dGVzLiAqLworICAgIHVpbnQzMl90IGF2ZXJhZ2VfbnNyX2FsbG9jYXRlZDsgLyoqPCBBdmVyYWdlIE5TUiBhbGxvY2F0ZWQgYnl0ZXMuICovCisgICAgdWludDMyX3QgYXZlcmFnZV9zcl9yZXBvcnQ7ICAgICAvKio8IEF2ZXJhZ2UgU1IgcmVwb3J0LiAqLworfSBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCIgZ3JvdXAgb2YgCisgKiAiZ3Bvbl9hbGxvYyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fYWxsb2Nfa2V5IGtleTsgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfYWxhcm1fY2xlYXJlZCIgZ3JvdXAgb2YgdGhlICJncG9uX2FsbG9jIiAKKyAqIG9iamVjdC4gCisgKgorICogU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YQoreworICAgIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfaWQgc3RhdDsgLyoqPCBTdGF0aXN0aWMgaWRlbnRpZmllci4gKi8KK30gYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9hbGFybV9jbGVhcmVkIiBncm91cCBvZiAiZ3Bvbl9hbGxvYyIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX2FsbG9jX2tleSBrZXk7ICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2FsYXJtX3JhaXNlZCIgZ3JvdXAgb2YgdGhlICJncG9uX2FsbG9jIiAKKyAqIG9iamVjdC4gCisgKgorICogU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEKK3sKKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2lkIHN0YXQ7IC8qKjwgU3RhdGlzdGljIGlkZW50aWZpZXIuICovCit9IGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9hbGFybV9yYWlzZWQiIGdyb3VwIG9mICJncG9uX2FsbG9jIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19rZXkga2V5OyAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJhdXRvX2NmZyIgZ3JvdXAgb2YgdGhlICJncG9uX2FsbG9jIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhCit7CisgICAgYmNtb3NfYm9vbCBjb25maWd1cmF0aW9uX2NvbXBsZXRlZDsgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAiY29uZmlndXJhdGlvbl9jb21wbGV0ZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZDsgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImdldF9hbGxvY19zdGF0c19jb21wbGV0ZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgc3RhdF9hbGFybV9jbGVhcmVkOyAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInN0YXRfYWxhcm1fY2xlYXJlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBzdGF0X2FsYXJtX3JhaXNlZDsgICAgICAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAic3RhdF9hbGFybV9yYWlzZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworfSBiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImF1dG9fY2ZnIiBncm91cCBvZiAiZ3Bvbl9hbGxvYyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmcKK3sKKyAgICBiY21vbHRfYXV0b19jZmcgaGRyOyAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX2FsbG9jX2tleSBrZXk7ICAgICAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJnZXRfc3RhdHMiIGdyb3VwIG9mIHRoZSAiZ3Bvbl9hbGxvYyIgb2JqZWN0LiAKKyAqCisgKiBSdW4gc3RhdGlzdGljcyBjb2xsZWN0aW9uIGZvciBhIGdpdmVuIHBlcmlvZCBvZiB0aW1lIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YQoreworICAgIHVpbnQzMl90IG51bV9vZl9jeWNsZXM7IC8qKjwgVGhlIG51bWJlciBvZiBjeWNsZXMgdG8gcnVuIHN0YXRpc3RpY3MgY29sbGVjdGlvbiAqLworfSBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJnZXRfc3RhdHMiIGdyb3VwIG9mICJncG9uX2FsbG9jIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHMKK3sKKyAgICBiY21vbHRfb3BlciBoZHI7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX2FsbG9jX2tleSBrZXk7ICAgICAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic2V0X3N0YXRlIiBncm91cCBvZiB0aGUgImdwb25fYWxsb2MiIG9iamVjdC4gCisgKgorICogU2V0cyB0aGUgYWxsb2MncyBhY3RpdmF0aW9uIHN0YXRlLiAgVGhpcyBpcyBvbmx5IHVzZWQgZm9yIHByb3RlY3Rpb24gCisgKiBzd2l0Y2hpbmcgb24gYW4gYWN0aXZlLXN0YW5kYnkgUE9OLiAgSW4gbm9ybWFsIG9wZXJhdGlvbiwgdGhpcyBpc24ndCAKKyAqIG5lY2Vzc2FyeSBzaW5jZSBhbGxvY3MgYXJlIGFjdGl2YXRlZC9kZWFjdGl2YXRlZCBhdXRvbWF0aWNhbGx5IGFsb25nIHdpdGggCisgKiB0aGUgT05VLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGEKK3sKKyAgICBiY21vbHRfYWxsb2Nfb3BlcmF0aW9uIHN0YXRlOyAgIC8qKjwgU3RhdGUuICovCit9IGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInNldF9zdGF0ZSIgZ3JvdXAgb2YgImdwb25fYWxsb2MiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZQoreworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fYWxsb2Nfa2V5IGtleTsgICAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGU7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJrZXkiIGdyb3VwIG9mIHRoZSAiZ3Bvbl9nZW1fcG9ydCIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5Cit7CisgICAgYmNtb2x0X2dwb25fbmkgcG9uX25pOyAgICAgICAgICAvKio8IFBPTiBuZXR3b3JrIGludGVyZmFjZS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9nZW1faWQgZ2VtX3BvcnRfaWQ7IC8qKjwgR0VNIFBvcnQgSUQuICovCit9IGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNmZyIgZ3JvdXAgb2YgdGhlICJncG9uX2dlbV9wb3J0IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YQoreworICAgIGJjbW9sdF9nZW1fcG9ydF9jb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb247ICAgICAgICAgICAgICAgIC8qKjwgR0VNIHBvcnQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzICovCisgICAgYmNtb2x0X2dwb25fb251X2lkIG9udV9pZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBPTlUgSUQgdGhpcyBHRU0gcG9ydCBpcyBhc3NpZ25lZCB0byAqLworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRlIGdlbV9wb3J0X3N0YXRlOyAgICAgICAgICAgICAgICAgIC8qKjwgQ3VycmVudCBHRU0gcG9ydCBzdGF0ZSAqLworICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIGRvd25zdHJlYW1fZW5jcnlwdGlvbl9tb2RlOyAgICAgICAgICAgIC8qKjwgRW5hYmxlL0Rpc2FibGUgdGhlIGRvd25zdHJlYW0gZW5jcnlwdGlvbiBtb2RlIG9mIHRoZSBHRU0gUG9ydCAqLworICAgIGJjbW9sdF91c19nZW1fcG9ydF9kZXN0aW5hdGlvbiB1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZTsgIC8qKjwgVGhlIGRlc3RpbmF0aW9uIHF1ZXVlIG9mIHRoZSBwYWNrZXRzIGFycml2aW5nIG9uIHRoaXMgR0VNIFBvcnQgb24gdGhlIHVwc3RyZWFtIGRpcmVjdGlvbiAqLworICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIGNvbnRyb2w7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IEVuYWJsZS9EaXNhYmxlIHRoZSBHRU0gUG9ydCBJRCBpbiB0aGUgT0xUICovCisgICAgYmNtb2x0X2dwb25fZGVidWdfZmxvd19jb25maWcgZGVidWdfZmxvd19jb25maWc7ICAgIC8qKjwgVHJhZmZpYyBmbG93IGRlYnVnIG9wdGlvbnMgKi8KKyAgICB1aW50MTZfdCBtYWNfdGFibGVfZW50cnlfbGltaXQ7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgbWF4aW11bSBudW1iZXIgb2YgTUFDIHRhYmxlIGVudHJpZXMgYWxsb3dlZCBmb3IgdGhpcyBHRU0gcG9ydCAoMCA9IG5vIGxpbWl0KS4gKi8KK30gYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiY2ZnIiBncm91cCBvZiAiZ3Bvbl9nZW1fcG9ydCIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnCit7CisgICAgYmNtb2x0X2NmZyBoZHI7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSBrZXk7ICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXQiIGdyb3VwIG9mIHRoZSAiZ3Bvbl9nZW1fcG9ydCIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9kYXRhCit7CisgICAgdWludDY0X3QgcnhfcGFja2V0czsgICAgLyoqPCBSZWNlaXZlZCBHRU0gZnJhbWVzLiAqLworICAgIHVpbnQ2NF90IHJ4X2J5dGVzOyAgICAgIC8qKjwgUmVjZWl2ZWQgYnl0ZXMuICovCisgICAgdWludDY0X3QgdHhfcGFja2V0czsgICAgLyoqPCBUcmFuc21pdHRlZCBHRU0gZnJhbWVzLiAqLworICAgIHVpbnQ2NF90IHR4X2J5dGVzOyAgICAgIC8qKjwgVHJhbnNtaXR0ZWQgYnl0ZXMuICovCit9IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGF0IiBncm91cCBvZiAiZ3Bvbl9nZW1fcG9ydCIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdAoreworICAgIGJjbW9sdF9zdGF0IGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2NmZyIgZ3JvdXAgb2YgdGhlICJncG9uX2dlbV9wb3J0IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhCit7CisgICAgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIGNmZzsgICAvKio8IFN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiAqLworfSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXRfY2ZnIiBncm91cCBvZiAiZ3Bvbl9nZW1fcG9ydCIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmcKK3sKKyAgICBiY21vbHRfc3RhdF9jZmcgaGRyOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkga2V5OyAgICAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhIGRhdGE7ICAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJjb25maWd1cmF0aW9uX2NvbXBsZXRlZCIgZ3JvdXAgb2YgdGhlIAorICogImdwb25fZ2VtX3BvcnQiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEKK3sKKyAgICBiY21vbHRfcmVzdWx0IHN0YXR1czsgICAgICAgICAgICAgICAgICAgLyoqPCBzdGF0dXMuICovCisgICAgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdGUgbmV3X3N0YXRlOyAgIC8qKjwgbmV3IHN0YXRlLiAqLworfSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImNvbmZpZ3VyYXRpb25fY29tcGxldGVkIiBncm91cCBvZiAKKyAqICJncG9uX2dlbV9wb3J0IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfYWxhcm1fY2xlYXJlZCIgZ3JvdXAgb2YgdGhlIAorICogImdwb25fZ2VtX3BvcnQiIG9iamVjdC4gCisgKgorICogU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YQoreworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfaWQgc3RhdDsgIC8qKjwgU3RhdGlzdGljIGlkZW50aWZpZXIuICovCit9IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXRfYWxhcm1fY2xlYXJlZCIgZ3JvdXAgb2YgCisgKiAiZ3Bvbl9nZW1fcG9ydCIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5IGtleTsgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdF9hbGFybV9yYWlzZWQiIGdyb3VwIG9mIHRoZSAKKyAqICJncG9uX2dlbV9wb3J0IiBvYmplY3QuIAorICoKKyAqIFNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhCit7CisgICAgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9pZCBzdGF0OyAgLyoqPCBTdGF0aXN0aWMgaWRlbnRpZmllci4gKi8KK30gYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGF0X2FsYXJtX3JhaXNlZCIgZ3JvdXAgb2YgCisgKiAiZ3Bvbl9nZW1fcG9ydCIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImF1dG9fY2ZnIiBncm91cCBvZiB0aGUgImdwb25fZ2VtX3BvcnQiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEKK3sKKyAgICBiY21vc19ib29sIGNvbmZpZ3VyYXRpb25fY29tcGxldGVkOyAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImNvbmZpZ3VyYXRpb25fY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHN0YXRfYWxhcm1fY2xlYXJlZDsgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInN0YXRfYWxhcm1fY2xlYXJlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBzdGF0X2FsYXJtX3JhaXNlZDsgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzdGF0X2FsYXJtX3JhaXNlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCit9IGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiYXV0b19jZmciIGdyb3VwIG9mICJncG9uX2dlbV9wb3J0IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZworeworICAgIGJjbW9sdF9hdXRvX2NmZyBoZHI7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSBrZXk7ICAgICAgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInNldF9zdGF0ZSIgZ3JvdXAgb2YgdGhlICJncG9uX2dlbV9wb3J0IiAKKyAqIG9iamVjdC4gCisgKgorICogU2V0cyB0aGUgR0VNIHBvcnQncyBhY3RpdmF0aW9uIHN0YXRlLiAgVGhpcyBpcyBvbmx5IHVzZWQgZm9yIHByb3RlY3Rpb24gCisgKiBzd2l0Y2hpbmcgb24gYW4gYWN0aXZlLXN0YW5kYnkgUE9OLiAgSW4gbm9ybWFsIG9wZXJhdGlvbiwgdGhpcyBpc24ndCAKKyAqIG5lY2Vzc2FyeSBzaW5jZSBHRU0gcG9ydHMgYXJlIGFjdGl2YXRlZC9kZWFjdGl2YXRlZCBhdXRvbWF0aWNhbGx5IGFsb25nIHdpdGggCisgKiB0aGUgT05VLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2RhdGEKK3sKKyAgICBiY21vbHRfZ2VtX3BvcnRfb3BlcmF0aW9uIHN0YXRlOyAgICAvKio8IFN0YXRlLiAqLworfSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGVfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzZXRfc3RhdGUiIGdyb3VwIG9mICJncG9uX2dlbV9wb3J0IiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZQoreworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGU7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJrZXkiIGdyb3VwIG9mIHRoZSAiZ3Bvbl9pd2YiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX2l3Zl9rZXkKK3sKKyAgICBiY21vbHRfZ3Bvbl9uaSBwb25fbmk7ICAvKio8IFBPTiBuZXR3b3JrIGludGVyZmFjZS4gKi8KK30gYmNtb2x0X2dwb25faXdmX2tleTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNmZyIgZ3JvdXAgb2YgdGhlICJncG9uX2l3ZiIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25faXdmX2NmZ19kYXRhCit7CisgICAgYmNtb2x0X2l3Zl9tb2RlIGl3Zl9tb2RlOyAgICAgICAgICAgICAgIC8qKjwgSVdGIG1hcHBpbmcgbW9kZSAqLworI2RlZmluZSBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0RBVEFfVVNfVFBJRF9QRVJfRkxPV19MRU4gICAyCisgICAgYmNtb2x0X2Fycl91MTZfMl9oZXggdXNfdHBpZF9wZXJfZmxvdzsgIC8qKjwgVFBJRCB2YWx1ZSBvZiB0aGUgVkxBTiB0YWcgYWRkZWQgdG8gdXBzdHJlYW0gcGFja2V0IHdoZW4gSVdGIG1vZGUgaXMgc2V0IHRvIHBlciBmbG93ICovCisgICAgdWludDE2X3QgdXNfb3RhZ19kaXJlY3RfdHBpZDsgICAgICAgICAgIC8qKjwgVFBJRCB2YWx1ZSBvZiB0aGUgVkxBTiB0YWcgYWRkZWQgdG8gdXBzdHJlYW0gcGFja2V0IHdoZW4gSVdGIG1vZGUgaXMgc2V0IHRvIGRpcmVjdCBtb2RlICovCisgICAgdWludDhfdCB1c19vdGFnX2RpcmVjdF9wYml0OyAgICAgICAgICAgIC8qKjwgUC1iaXQgdmFsdWUgb2YgdGhlIFZMQU4gdGFnIGFkZGVkIHRvIHVwc3RyZWFtIHBhY2tldCB3aGVuIElXRiBtb2RlIGlzIHNldCB0byBkaXJlY3QgbW9kZSAqLworI2RlZmluZSBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0RBVEFfRFNfVFBJRF9MRU4gICAgNQorICAgIGJjbW9sdF9hcnJfdTE2XzVfaGV4IGRzX3RwaWQ7ICAgICAgICAgICAvKio8IFBhY2tldHMgbWFya2VkIHdpdGggb25lIG9mIHRoZSBmaXZlIGNvbmZpZ3VyZWQgRFMgVFBJRCBvcHRpb25zIHdpbGwgYmUgZm9yd2FyZGVkLCBhbGwgdGhlIHJlc3Qgd2lsbCBiZSBkcm9wcGVkICovCisgICAgYmNtb2x0X21hY190YWJsZV9jb25maWd1cmF0aW9uIG1hY190YWJsZV9jb25maWd1cmF0aW9uOyAgICAgLyoqPCBNQUMgdGFibGUgY29uZmlndXJhdGlvbiAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9kZWJ1Z19mbG93X2NvbmZpZyBkZWJ1Z19mbG93X2NvbmZpZ3VyYXRpb247IC8qKjwgTUFDIHRhYmxlIGNvbmZpZ3VyYXRpb24gKi8KKyAgICB1aW50MTZfdCBtYWNfdGFibGVfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBNQUMgdGFibGUgZW50cmllcyBjb25maWd1cmVkIGluIHRoZSBNQUMgdGFibGUgKi8KKyAgICB1aW50MTZfdCBmb3JiaWRkZW5fdmxhbl9mbG93X2dlbV9yYW5nZV9zdGFydDsgICAvKio8IEZvcmJpZGRlbiByYW5nZSBmb3IgVmxhbnMsIEZsb3dzIGFuZCBHZW1zIHN0YXJ0IHZhbHVlICovCit9IGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJjZmciIGdyb3VwIG9mICJncG9uX2l3ZiIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25faXdmX2NmZworeworICAgIGJjbW9sdF9jZmcgaGRyOyAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9rZXkga2V5OyAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9pd2ZfY2ZnOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdCIgZ3JvdXAgb2YgdGhlICJncG9uX2l3ZiIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YQoreworICAgIHVpbnQ2NF90IGRzX2hpdF9ldmVudDsgICAgICAgICAgICAgIC8qKjwgRFMgaGl0IGV2ZW50LiAqLworICAgIHVpbnQ2NF90IGRzX21pc3NfZXZlbnQ7ICAgICAgICAgICAgIC8qKjwgRFMgbWlzcyBldmVudC4gKi8KKyAgICB1aW50NjRfdCBkc19kcm9wX2R1ZV90b19taXNzX2V2ZW50OyAvKio8IERTIGRyb3AgZHVlIHRvIG1pc3MgZXZlbnQuICovCisgICAgdWludDY0X3QgZHNfZHJvcF9kdWVfdG9faGl0X2V2ZW50OyAgLyoqPCBEUyBkcm9wIGR1ZSB0byBoaXQgZXZlbnQuICovCisgICAgdWludDY0X3QgZHNfZHJvcF90b19kaXNhYmxlZF9nZW07ICAgLyoqPCBEUyBkcm9wIHRvIGRpc2FibGVkIEdFTS4gKi8KKyAgICB1aW50NjRfdCBuZXdfbWFjX2Rpc2NvdmVyZWQ7ICAgICAgICAvKio8IE5ldyBNQUMgZGlzY292ZXJlZC4gKi8KKyAgICB1aW50NjRfdCBtb3ZlX2V2ZW50OyAgICAgICAgICAgICAgICAvKio8IE1vdmUgZXZlbnQuICovCisgICAgdWludDY0X3QgbmV3X21hY19kcm9wX2R1ZV90b19maWZvX2Z1bGw7IC8qKjwgTmV3IE1BQyBkcm9wIGR1ZSB0byBmaWZvIGZ1bGwuICovCit9IGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdCIgZ3JvdXAgb2YgImdwb25faXdmIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdAoreworICAgIGJjbW9sdF9zdGF0IGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9rZXkga2V5OyAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfY2ZnIiBncm91cCBvZiB0aGUgImdwb25faXdmIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfZGF0YQoreworICAgIGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyBjZmc7ICAgLyoqPCBTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4gKi8KK30gYmNtb2x0X2dwb25faXdmX3N0YXRfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9jZmciIGdyb3VwIG9mICJncG9uX2l3ZiIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25faXdmX3N0YXRfY2ZnCit7CisgICAgYmNtb2x0X3N0YXRfY2ZnIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9rZXkga2V5OyAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZzsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJmbHVzaF9tYWNfdGFibGVfY29tcGxldGVkIiBncm91cCBvZiAKKyAqICJncG9uX2l3ZiIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9jb21wbGV0ZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCit9IGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfY29tcGxldGVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic2Nhbl9tYWNfdGFibGVfY29tcGxldGVkIiBncm91cCBvZiB0aGUgCisgKiAiZ3Bvbl9pd2YiIG9iamVjdC4gCisgKgorICogQSBNQUMgdGFibGUgc2NhbiBpbml0aWF0ZWQgdXNpbmcgdGhlICJzY2FuX21hY190YWJsZSIgb3BlcmF0aW9uIGlzIGNvbXBsZXRlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9kYXRhCit7CisgICAgYmNtb3NfbWFjX2FkZHJlc3MgbWFjX2FkZHJlc3M7ICAvKio8IEVudHJ5IE1BQyBhZGRyZXNzLiAqLworICAgIGJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdF9saXN0X3UxNiBlbnRyaWVzOyAvKio8IFNjYW4gcmVzdWx0cyBmb3IgdGhpcyBlbnRyeS4gIElmIHRoaXMgbGlzdCBpcyBlbXB0eSwgdGhlIE1BQyBhZGRyZXNzIHdhcyBub3QgZm91bmQgaW4gdGhlIHRhYmxlLiAqLworfSBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic2Nhbl9tYWNfdGFibGVfY29tcGxldGVkIiBncm91cCBvZiAKKyAqICJncG9uX2l3ZiIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25faXdmX2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdF9hbGFybV9jbGVhcmVkIiBncm91cCBvZiB0aGUgImdwb25faXdmIiAKKyAqIG9iamVjdC4gCisgKgorICogU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEKK3sKKyAgICBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9pZCBzdGF0OyAgIC8qKjwgU3RhdGlzdGljIGlkZW50aWZpZXIuICovCit9IGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGF0X2FsYXJtX2NsZWFyZWQiIGdyb3VwIG9mICJncG9uX2l3ZiIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2Zfa2V5IGtleTsgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfYWxhcm1fcmFpc2VkIiBncm91cCBvZiB0aGUgImdwb25faXdmIiAKKyAqIG9iamVjdC4gCisgKgorICogU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhCit7CisgICAgYmNtb2x0X2dwb25faXdmX3N0YXRfaWQgc3RhdDsgICAvKio8IFN0YXRpc3RpYyBpZGVudGlmaWVyLiAqLworfSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGF0X2FsYXJtX3JhaXNlZCIgZ3JvdXAgb2YgImdwb25faXdmIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25faXdmX2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImF1dG9fY2ZnIiBncm91cCBvZiB0aGUgImdwb25faXdmIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YQoreworICAgIGJjbW9zX2Jvb2wgZmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZDsgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImZsdXNoX21hY190YWJsZV9jb21wbGV0ZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkOyAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInNjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBzdGF0X2FsYXJtX2NsZWFyZWQ7ICAgICAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAic3RhdF9hbGFybV9jbGVhcmVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHN0YXRfYWxhcm1fcmFpc2VkOyAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzdGF0X2FsYXJtX3JhaXNlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCit9IGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImF1dG9fY2ZnIiBncm91cCBvZiAiZ3Bvbl9pd2YiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZworeworICAgIGJjbW9sdF9hdXRvX2NmZyBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2Zfa2V5IGtleTsgICAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJmbHVzaF9tYWNfdGFibGUiIGdyb3VwIG9mIHRoZSAiZ3Bvbl9pd2YiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9kYXRhCit7CisgICAgYmNtb2x0X2ZsdXNoX21hY190YWJsZV9vcHRpb24gY29udHJvbDsgIC8qKjwgY29udHJvbC4gKi8KKyAgICBiY21vbHRfdmxhbl9pZCB2aWQ7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBWSUQuICovCisgICAgYmNtb2x0X2Zsb3dfaWQgZmxvd19pZDsgICAgICAgICAgICAgICAgIC8qKjwgRkxPVyBJRC4gKi8KK30gYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImZsdXNoX21hY190YWJsZSIgZ3JvdXAgb2YgImdwb25faXdmIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGUKK3sKKyAgICBiY21vbHRfb3BlciBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGU7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzY2FuX21hY190YWJsZSIgZ3JvdXAgb2YgdGhlICJncG9uX2l3ZiIgCisgKiBvYmplY3QuIAorICoKKyAqIFNjYW5zIE1BQyB0YWJsZSBmb3IgYSBnaXZlbiBNQUMgYWRkcmVzcyB0aGVuIHJldHVybnMgdGhlIGFzc29jaWF0ZWQgCisgKiBpbmZvcm1hdGlvbiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2RhdGEKK3sKKyAgICBiY21vc19tYWNfYWRkcmVzcyBtYWNfYWRkcmVzczsgIC8qKjwgRW50cnkgTUFDIGFkZHJlc3MuICovCit9IGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInNjYW5fbWFjX3RhYmxlIiBncm91cCBvZiAiZ3Bvbl9pd2YiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlCit7CisgICAgYmNtb2x0X29wZXIgaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2Zfa2V5IGtleTsgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGU7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJrZXkiIGdyb3VwIG9mIHRoZSAiZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3ciIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleQoreworICAgIGJjbW9sdF9ncG9uX25pIHBvbl9uaTsgIC8qKjwgUE9OIG5ldHdvcmsgaW50ZXJmYWNlLiAqLworICAgIGJjbW9sdF9mbG93X2lkIGZsb3dfaWQ7IC8qKjwgRmxvdyBJRC4gKi8KK30gYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNmZyIgZ3JvdXAgb2YgdGhlICJncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvdyIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2RhdGEKK3sKKyAgICBiY21vbHRfZ3Bvbl9nZW1faWQgZ2VtX3BvcnQ7ICAgIC8qKjwgR0VNIHBvcnQgSUQgKi8KKyAgICBiY21vc19ib29sIHBiaXRfY29udHJvbDsgICAgICAgIC8qKjwgSWYgZW5hYmxlZCwgdGhlIFBiaXRzIHZhbHVlIGlzIHRha2VuIGZyb20gdGhlIG1hcHBpbmcgVkxBTiB0YWcgKElubmVyL091dGVyKSBWTEFOIFBiaXRzIGxvY2F0aW9uIGFuZCBhZGRlZCB0byB0aGUgY29uZmlndXJlZCBHRU0gcG9ydCBJRCB2YWx1ZSB0byBjcmVhdGUgdGhlIEZpbmFsIEdFTSBJRCAqLworfSBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiY2ZnIiBncm91cCBvZiAiZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3ciIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZworeworICAgIGJjbW9sdF9jZmcgaGRyOyAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleSBrZXk7ICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleSIgZ3JvdXAgb2YgdGhlICJncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3ciIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXkKK3sKKyAgICBiY21vbHRfZ3Bvbl9uaSBwb25fbmk7ICAvKio8IFBPTiBuZXR3b3JrIGludGVyZmFjZS4gKi8KKyAgICBiY21vbHRfdmxhbl9pZCB2bGFuX2lkOyAvKio8IHZsYW4gSUQuICovCit9IGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiY2ZnIiBncm91cCBvZiB0aGUgImdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdyIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19kYXRhCit7CisgICAgYmNtb2x0X3ZsYW5fdG9fZmxvd19tYXBwaW5nX21ldGhvZCBtYXBwaW5nX21ldGhvZDsgIC8qKjwgVGhlIE1hcHBpbmcgbWV0aG9kIGRlZmluZXMgaG93IHRoZSBmbG93IElEIHdpbGwgYmUgZGV0ZXJtaW5lZCAqLworICAgIGJjbW9sdF9tYXBwaW5nX3RhZ19tZXRob2QgbWFwcGluZ190YWc7ICAgICAgICAgICAgICAvKio8IERlZmluZSBpZiB0aGUgb3V0ZXIgb3IgdGhlIGlubmVyIFZMQU4gdGFnIG9mIHRoZSBwYWNrZXQgd2lsbCBkZXRlcm1pbmUgdGhlIGZsb3cgSUQgKi8KKyAgICBiY21vbHRfZHNfdmxhbl9hY3Rpb24gdmxhbl9hY3Rpb247ICAgICAgICAgICAgICAgICAgLyoqPCBEZWZpbmUgdGhlIG91dGVyIFZMQU4gdGFnIG1hbmlwdWxhdGlvbiBvbiB0aGUgcGFja2V0OiB0cmFuc3BhcmVudCBvciByZW1vdmUgKi8KK30gYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJjZmciIGdyb3VwIG9mICJncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3ciIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmcKK3sKKyAgICBiY21vbHRfY2ZnIGhkcjsgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5IGtleTsgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAia2V5IiBncm91cCBvZiB0aGUgImdwb25faXdmX21hY190YWJsZSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkKK3sKKyAgICBiY21vbHRfZ3Bvbl9uaSBwb25fbmk7ICAgICAgICAgIC8qKjwgUE9OIG5ldHdvcmsgaW50ZXJmYWNlLiAqLworICAgIGJjbW9zX21hY19hZGRyZXNzIG1hY19hZGRyZXNzOyAgLyoqPCBNQUMgYWRkcmVzcy4gKi8KKyAgICBiY21vbHRfdmxhbl9pZCB2bGFuOyAgICAgICAgICAgIC8qKjwgVkxBTi4gKi8KK30gYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXk7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJjZmciIGdyb3VwIG9mIHRoZSAiZ3Bvbl9pd2ZfbWFjX3RhYmxlIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19kYXRhCit7CisgICAgYmNtb2x0X2Zsb3dfaWQgZmxvd19pZDsgICAgICAgICAvKio8IFRoZSBmbG93IElEIGFzc2lnbmVkIHRvIHRyYWZmaWMgdGhhdCBtYXRjaGVzIHRoaXMgTUFDIHRhYmxlIGVudHJ5LiAqLworICAgIGJjbW9zX2Jvb2wgc3RhdDsgICAgICAgICAgICAgICAgLyoqPCBXaGV0aGVyIG9yIG5vdCB0aGUgTUFDIGVudHJ5IGlzIHN0YXRpYy4gIFN0YXRpYyBlbnRyaWVzIGRvbid0IGFnZS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9nZW1faWQgZ2VtX3BvcnRfaWQ7IC8qKjwgVGhlIEdFTSBwb3J0IElEIG9mIHRoZSB0cmFmZmljIHRoYXQgY3JlYXRlZCB0aGlzIHRhYmxlIGVudHJ5LiAgVGhpcyBvbmx5IGFwcGxpZXMgdG8gYXV0b21hdGljYWxseS1sZWFybmVkIGVudHJpZXMuICBNYW51YWxseS1hZGRlZCBlbnRyaWVzIHdpbGwgaGF2ZSB0aGUgdmFsdWUgQkNNT0xUX1BPTl9HRU1fUE9SVF9JRF9JTlZBTElELiAqLworICAgIGJjbW9sdF9ncG9uX29udV9pZCBvbnVfaWQ7ICAgICAgLyoqPCBUaGUgT05VIElEIGZvciB0aGUgdHJhZmZpYyB0aGF0IGNyZWF0ZWQgdGhpcyB0YWJsZSBlbnRyeS4gIFRoaXMgb25seSB2YWxpZCBpZiBnZW1fcG9ydF9pZCBpcyB2YWxpZC4gIE90aGVyd2lzZSB0aGlzIHdpbGwgYmUgc2V0IHRvIEJDTU9MVF9HUE9OX09OVV9JRF9JTlZBTElELiAqLworfSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImNmZyIgZ3JvdXAgb2YgImdwb25faXdmX21hY190YWJsZSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmcKK3sKKyAgICBiY21vbHRfY2ZnIGhkcjsgICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkga2V5OyAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZzsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJtYWNfYWdlZCIgZ3JvdXAgb2YgImdwb25faXdmX21hY190YWJsZSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19hZ2VkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5IGtleTsgIC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfYWdlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgIm1hY19kcm9wcGVkIiBncm91cCBvZiB0aGUgImdwb25faXdmX21hY190YWJsZSIgCisgKiBvYmplY3QuIAorICoKKyAqIFNlbnQgd2hlbiBhbiBlbnRyeSBjYW5ub3QgYmUgbGVhcm5lZCBzaW5jZSB0aGUgTUFDIHRhYmxlIGlzIGZ1bGwuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2RhdGEKK3sKKyAgICBiY21vbHRfZmxvd19pZCBmbG93X2lkOyAvKio8IFRoZSBmbG93IElEIG9mIHRoZSBlbnRyeSB0aGF0IHdhcyBkcm9wcGVkLiAqLworfSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAibWFjX2Ryb3BwZWQiIGdyb3VwIG9mICJncG9uX2l3Zl9tYWNfdGFibGUiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSBrZXk7ICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9kYXRhIGRhdGE7ICAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgIm1hY19tb3ZlIiBncm91cCBvZiB0aGUgImdwb25faXdmX21hY190YWJsZSIgCisgKiBvYmplY3QuIAorICoKKyAqIFNlbnQgd2hlbiB0aGUgTUFDIHRhYmxlIGlzIGluIG1vdmUgbW9kZSBhbmQgYSBwYWNrZXQgaXMgc2VlbiB0aGF0IG1hdGNoZXMgb24gCisgKiBNQUMgYWRkcmVzcyAvIFZJRCBidXQgZG9lc24ndCBtYXRjaCBvbiBmbG93IElELiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9kYXRhCit7CisgICAgYmNtb2x0X2Zsb3dfaWQgb2xkX2Zsb3dfaWQ7IC8qKjwgVGhlIGZsb3cgSUQgaW4gdGhlIGN1cnJlbnQgTUFDIHRhYmxlIGVudHJ5LiAqLworICAgIGJjbW9sdF9mbG93X2lkIG5ld19mbG93X2lkOyAvKio8IFRoZSBmbG93IElEIHNlZW4gaW4gdGhlIHRyYWZmaWMgc3RyZWFtLiAqLworfSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAibWFjX21vdmUiIGdyb3VwIG9mICJncG9uX2l3Zl9tYWNfdGFibGUiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZQoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSBrZXk7ICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAibmV3X21hYyIgZ3JvdXAgb2YgdGhlICJncG9uX2l3Zl9tYWNfdGFibGUiIAorICogb2JqZWN0LiAKKyAqCisgKiBTZW50IHdoZW4gYSBuZXcgTUFDIGFkZHJlc3MgLyBWSUQgY29tYmluYXRpb24gaXMgc2VlbiBpbiB0aGUgdXBzdHJlYW0gCisgKiB0cmFmZmljIHN0cmVhbS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19kYXRhCit7CisgICAgYmNtb2x0X2Zsb3dfaWQgZmxvd19pZDsgLyoqPCBUaGUgZmxvdyBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIG5ldyBlbnRyeS4gKi8KK30gYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAibmV3X21hYyIgZ3JvdXAgb2YgImdwb25faXdmX21hY190YWJsZSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWMKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkga2V5OyAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19kYXRhIGRhdGE7ICAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiYXV0b19jZmciIGdyb3VwIG9mIHRoZSAiZ3Bvbl9pd2ZfbWFjX3RhYmxlIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfZGF0YQoreworICAgIGJjbW9zX2Jvb2wgbWFjX2FnZWQ7ICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAibWFjX2FnZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgbWFjX2Ryb3BwZWQ7IC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAibWFjX2Ryb3BwZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgbWFjX21vdmU7ICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAibWFjX21vdmUiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgbmV3X21hYzsgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAibmV3X21hYyIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCit9IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJhdXRvX2NmZyIgZ3JvdXAgb2YgImdwb25faXdmX21hY190YWJsZSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnCit7CisgICAgYmNtb2x0X2F1dG9fY2ZnIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5IGtleTsgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJrZXkiIGdyb3VwIG9mIHRoZSAiZ3Bvbl9pd2ZfdXNfZmxvdyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5Cit7CisgICAgYmNtb2x0X2dwb25fbmkgcG9uX25pOyAgICAgICAgICAvKio8IFBPTiBuZXR3b3JrIGludGVyZmFjZS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9nZW1faWQgZ2VtX3BvcnRfaWQ7IC8qKjwgR0VNIFBvcnQgIElELiAqLworfSBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXk7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJjZmciIGdyb3VwIG9mIHRoZSAiZ3Bvbl9pd2ZfdXNfZmxvdyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2RhdGEKK3sKKyAgICBiY21vbHRfZmxvd19pZCBmbG93X2lkOyAgICAgICAgICAgICAvKio8IEZsb3cgSUQuICovCisgICAgYmNtb3NfYm9vbCBtYWNfbGVhcm5pbmc7ICAgICAgICAgICAgLyoqPCBNQUMgbGVhcm5pbmcuICovCisgICAgYmNtb2x0X3VzX3ZsYW5fYWN0aW9uIHZsYW5fYWN0aW9uOyAgLyoqPCBWTEFOIGFjdGlvbi4gKi8KKyAgICBiY21vbHRfdmxhbl90YWcgdmxhbl90YWc7ICAgICAgICAgICAvKio8IFZsYW4gdGFnLiAqLworICAgIHVpbnQ4X3QgdHBpZF9pbmRleDsgICAgICAgICAgICAgICAgIC8qKjwgVFBJRCBpbmRleC4gKi8KK30gYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiY2ZnIiBncm91cCBvZiAiZ3Bvbl9pd2ZfdXNfZmxvdyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnCit7CisgICAgYmNtb2x0X2NmZyBoZHI7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJrZXkiIGdyb3VwIG9mIHRoZSAiZ3Bvbl9uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fbmlfa2V5Cit7CisgICAgYmNtb2x0X2dwb25fbmkgcG9uX25pOyAgLyoqPCBQT04gbmV0d29yayBpbnRlcmZhY2UuICovCit9IGJjbW9sdF9ncG9uX25pX2tleTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNmZyIgZ3JvdXAgb2YgdGhlICJncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YQoreworICAgIGJjbW9sdF9wb25fc3RhdHVzIHBvbl9zdGF0dXM7ICAgLyoqPCBQT04gc3RhdHVzIHBhcmFtZXRlcnMgKi8KKyAgICBiY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGggYXZhaWxhYmxlX2JhbmR3aWR0aDsgLyoqPCBQT04gYXZhaWxhYmxlIGJhbmR3aWR0aCBwYXJhbWV0ZXJzICovCisgICAgdWludDE2X3QgbnVtYmVyX29mX2FjdGl2ZV9vbnVzOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGFjdGl2ZSBPTlVzIG9uIHRoZSBQT04gKi8KKyAgICB1aW50MTZfdCBudW1iZXJfb2ZfYWN0aXZlX3N0YW5kYnlfb251czsgICAgICAgICAgICAgLyoqPCBudW1iZXIgb2YgYWN0aXZlIHN0YW5kYnkgb251cy4gKi8KKyAgICBiY21vbHRfcHJic19zdGF0dXMgcHJic19zdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBSZXN1bHQgb2YgVVMgUFJCUyBjaGVja2VyICovCisgICAgYmNtb2x0X3Bvbl9kaXN0YW5jZSBwb25fZGlzdGFuY2U7ICAgICAgICAgICAgICAgICAgIC8qKjwgUE9OIGRpc3RhbmNlICovCisgICAgdWludDMyX3QgcmFuZ2luZ193aW5kb3dfc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUmFuZ2luZyB3aW5kb3cgc2l6ZSAqLworICAgIHVpbnQzMl90IHByZWFzc2lnbmVkX2VxdWFsaXphdGlvbl9kZWxheTsgICAgICAgICAgICAvKio8IE9OVSBwcmUtYXNzaWduZWQgZXF1YWxpemF0aW9uIGRlbGF5ICovCisgICAgdWludDMyX3QgZXFkX2N5Y2xlc19udW1iZXI7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBIb3cgbWFueSByYW5naW5nIHdpbmRvd3MgYXJlIG9wZW5lZCBkdXJpbmcgYSBzaW5nbGUgT05VIGFjdGl2YXRpb24gcHJvY2VzcyAqLworICAgIGJjbW9sdF9wb25fcG93ZXJfbGV2ZWwgcG93ZXJfbGV2ZWw7ICAgICAgICAgICAgIC8qKjwgT05VIHBvd2VyIGxldmVsIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBiY21vbHRfY29udHJvbF9zdGF0ZSBkc19mZWNfbW9kZTsgICAgICAgICAgICAgICAvKio8IERTIEZFQyBtb2RlICovCisgICAgYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sIGRyaWZ0X2NvbnRyb2w7ICAgICAgICAgLyoqPCBEcmlmdCBjb250cm9sIHByb2Nlc3MgY29uZmlndXJhdGlvbiAqLworICAgIGJjbW9sdF9iZXJfaW50ZXJ2YWwgZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbDsgIC8qKjwgRFMgQkVSIHJlcG9ydGluZyBpbnRlcnZhbCAqLworICAgIHVpbnQ4X3QgbG9zX2FsYXJtX3RocmVzaG9sZDsgICAgICAgICAgICAgICAgICAgIC8qKjwgTE9TIGFsYXJtIHRocmVzaG9sZCAqLworICAgIGJjbW9sdF9zdGF0dXMgbG9zX2luaXRpYWxfdmFsdWU7ICAgICAgICAgICAgICAgIC8qKjwgTE9TIGluaXRpYWwgdmFsdWUgZm9sbG93aW5nIFBPTiBhY3RpdmF0aW9uICovCisgICAgYmNtb2x0X2dwb25fb251X2FsYXJtc190aHJlc2hvbGRzIG9udV9hbGFybXNfdGhyZXNob2xkczsgICAgLyoqPCBPTlUgYWxhcm1zIHRocmVzaG9sZHMgY29uZmlndXJhdGlvbiAqLworICAgIGJjbW9sdF9iZXJfbW9uaXRvcl9wYXJhbXMgYmVyX21vbml0b3I7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQkVSIG1vbml0b3IgcHJvY2VzcyBjb25maWd1cmF0aW9uICovCisgICAgdWludDE2X3QgcGxvYW1fYWNrX3RpbWVvdXQ7ICAgICAgICAgICAgICAgICAvKio8IFRpbWVvdXQgZm9yIHJlY2VpdmluZyBBQ0sgcGxvYW0gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfYWN0aXZhdGlvbiBvbnVfYWN0aXZhdGlvbjsgIC8qKjwgT05VIGFjdGl2YXRpb24gY29udHJvbCBwYXJhbWV0ZXJzICovCisgICAgYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb24gc25fYWNxdWlzaXRpb247ICAvKio8IFNlcmlhbCBOdW1iZXIgcHJvY2VzcyBjb25maWd1cmF0aW9uICovCisgICAgYmNtb2x0X2dwb25fa2V5X2V4Y2hhbmdlIGtleV9leGNoYW5nZTsgICAgICAvKio8IEtleSBFeGNoYW5nZSBwcm9jZXNzIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nIHByb3RlY3Rpb25fc3dpdGNoaW5nOyAgICAgICAvKio8IFByb3RlY3Rpb24gc3dpdGNoaW5nIGNvbnRyb2wgKi8KKyAgICBiY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSBjYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlOyAvKio8IENCUiBSZWFsIFRpbWUgYWxsb2NhdGlvbiBwcm9maWxlICovCisjZGVmaW5lIEJDTU9MVF9HUE9OX05JX0NGR19EQVRBX0NCUl9OUlRfQUxMT0NBVElPTl9QUk9GSUxFX0xFTiAgMgorICAgIGJjbW9sdF9hcnJfdTE2XzIgY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGU7ICAgICAgICAgICAgICAgIC8qKjwgQ0JSIG5vbiBSZWFsIFRpbWUgYWxsb2NhdGlvbiBwcm9maWxlICovCisgICAgYmNtb2x0X3Bvbl9kYmEgZGJhOyAvKio8IERCQSBjb25maWd1cmF0aW9uICovCisgICAgYmNtb2x0X29udV9wb3dlcl9tYW5hZ2VtZW50X2NvbmZpZ3VyYXRpb24gcG93ZXJfbWFuYWdlbWVudDsgICAgICAgICAgICAgLyoqPCBPTlUgcG93ZXIgbWFuYWdlbWVudCBjb250cm9sICovCisgICAgYmNtb2x0X3JvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcyByb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3M7ICAgICAgICAgLyoqPCBSb2d1ZSBPTlUgZGV0ZWN0aW9uIHByb2Nlc3MgY29uZmlndXJhdGlvbiAqLworICAgIGJjbW9sdF9wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nIHBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3Jpbmc7IC8qKjwgUGVyaW9kaWMgU3RhbmRieSBQT04gbW9uaXRvcmluZyAqLworICAgIGJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnIHByYnNfY2hlY2tlcjsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFVTIFBSQlMgY2hlY2tlciBjb25maWd1cmF0aW9uICovCisgICAgYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZyBwcmJzX2dlbmVyYXRvcjsgICAgICAgICAgICAgICAgICAgIC8qKjwgRFMgUFJCUyBnZW5lcmF0b3IgY29uZmlndXJhdGlvbiAqLworICAgIGJjbW9sdF9ncG9uX2FsbG9jX2lkIG1pbl9kYXRhX2FsbG9jX2lkOyAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE1pbiBkYXRhIEFsbG9jIElEIHZhbHVlICovCisgICAgYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uIGF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uOyAgIC8qKjwgT3B0aW9uIHRvIGRpc2FibGUgdGhlIGF1dG9tYXRpYyBkZWFjdGl2YXRpb24gb2YgT05VcyBkdWUgdG8gYWxhcm1zICovCisgICAgdWludDMyX3QgdXNfYmFuZHdpZHRoX2xpbWl0OyAgICAvKio8IFRvdGFsIFBPTiB1cHN0cmVhbSBiYW5kd2lkdGggbGltaXQgaW4gYnl0ZXMgcGVyIHNlY29uZC4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4IGFsbF9vbnVzOyAgICAgICAgICAgICAgICAgICAvKio8IEFsbCBPTlVzIGN1cnJlbnRseSBwcm92aXNpb25lZCBvbiB0aGlzIFBPTi4gKi8KKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjggYWxsX21jYXN0X2dlbV9wb3J0czsgICAvKio8IEFsbCBtdWx0aWNhc3QgR0VNIHBvcnRzIGN1cnJlbnRseSBwcm92aXNpb25lZCBvbiB0aGlzIFBPTi4gKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9kZWJ1ZyBkZWJ1ZzsgLyoqPCBQT04gTkkgZGVidWcgcGFyYW1ldGVycyAqLworICAgIGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtcyBvbnVfdXBncmFkZV9wYXJhbXM7ICAvKio8IE9OVSB1cGdyYWRlIHBhcmFtcy4gKi8KKyAgICB1aW50MTZfdCBwc19jX3dhaXRfYmVmb3JlX2RlYWN0aXZhdGlvbl90aW1lb3V0OyAgICAgLyoqPCBQUyB0eXBlIEMgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgKi8KKyAgICBiY21vbHRfY29udHJvbF9zdGF0ZSBiaXAzMl9pbmRpY2F0aW9uX2NvbnRyb2w7ICAgICAgLyoqPCBPcHRpb24gdG8gZGlzYWJsZSB0aGUgYmlwMzIgaW5kaWNhdGlvbiB3aGVuIHRoZSB2YWx1ZSBpcyB6ZXJvICovCit9IGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImNmZyIgZ3JvdXAgb2YgImdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX2NmZworeworICAgIGJjbW9sdF9jZmcgaGRyOyAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXk7ICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0IiBncm91cCBvZiB0aGUgImdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YQoreworICAgIHVpbnQ2NF90IGZlY19jb2Rld29yZHM7ICAgICAgICAgICAgIC8qKjwgUmVjZWl2ZWQgRkVDIGNvZGV3b3Jkcy4gKi8KKyAgICB1aW50NjRfdCBmZWNfY29kZXdvcmRzX3VuY29ycmVjdGVkOyAvKio8IFJlY2VpdmVkIHVuY29ycmVjdGVkIEZFQyBjb2Rld29yZHMuICovCisgICAgdWludDY0X3QgYmlwOF9ieXRlczsgICAgICAgICAgICAgICAgLyoqPCBSZWNlaXZlZCBieXRlcyBwcm90ZWN0ZWQgYnkgYmlwOC4gKi8KKyAgICB1aW50NjRfdCBiaXA4X2Vycm9yczsgICAgICAgICAgICAgICAvKio8IFJlY2VpdmVkIGJpcDggZXJyb3JzLiAqLworICAgIHVpbnQ2NF90IHJ4X2dlbV9wYWNrZXRzOyAgICAgICAgICAgIC8qKjwgUmVjZWl2ZWQgR0VNIGZyYW1lcy4gKi8KKyAgICB1aW50NjRfdCByeF9nZW1fZHJvcHBlZDsgICAgICAgICAgICAvKio8IFJlY2VpdmVkIGRyb3BwZWQgR0VNIElEIHBhY2tldHMuICovCisgICAgdWludDY0X3QgcnhfZ2VtX2lkbGU7ICAgICAgICAgICAgICAgLyoqPCBSZWNlaXZlZCBpZGxlIEdFTSBmcmFtZXMuICovCisgICAgdWludDY0X3QgcnhfZ2VtX2NvcnJlY3RlZDsgICAgICAgICAgLyoqPCBSZWNlaXZlZCBjb3JyZWN0ZWQgR0VNIGZyYW1lcy4gKi8KKyAgICB1aW50NjRfdCByeF9nZW1faWxsZWdhbDsgICAgICAgICAgICAvKio8IFJlY2VpdmVkIGlsbGVnYWwgR0VNIGZyYW1lcy4gKi8KKyAgICB1aW50NjRfdCByeF9hbGxvY2F0aW9uc192YWxpZDsgICAgICAvKio8IFJlY2VpdmVkIHZhbGlkIGFsbG9jYXRpb25zLiAqLworICAgIHVpbnQ2NF90IHJ4X2FsbG9jYXRpb25zX2ludmFsaWQ7ICAgIC8qKjwgUmVjZWl2ZWQgaW52YWxpZCBhbGxvY2F0aW9ucy4gKi8KKyAgICB1aW50NjRfdCByeF9hbGxvY2F0aW9uc19kaXNhYmxlZDsgICAvKio8IFJlY2VpdmVkIGRpc2FibGVkIGFsbG9jYXRpb25zLiAqLworICAgIHVpbnQ2NF90IHJ4X3Bsb2FtczsgICAgICAgICAgICAgICAgIC8qKjwgUmVjZWl2ZWQgUGxvYW1zLiAqLworICAgIHVpbnQ2NF90IHJ4X3Bsb2Ftc19ub25faWRsZTsgICAgICAgIC8qKjwgUmVjZWl2ZWQgbm9uIGlkbGUgUGxvYW1zLiAqLworICAgIHVpbnQ2NF90IHJ4X3Bsb2Ftc19lcnJvcjsgICAgICAgICAgIC8qKjwgUmVjZWl2ZWQgZXJyb3IgUGxvYW1zLiAqLworICAgIHVpbnQ2NF90IHJ4X3Bsb2Ftc19kcm9wcGVkOyAgICAgICAgIC8qKjwgUmVjZWl2ZWQgZHJvcHBlZCBQbG9hbXMuICovCisgICAgdWludDY0X3QgcnhfY3B1OyAgICAgICAgICAgICAgICAgICAgLyoqPCBSZWNlaXZlZCBDUFUgcGFja2V0cy4gKi8KKyAgICB1aW50NjRfdCByeF9vbWNpOyAgICAgICAgICAgICAgICAgICAvKio8IFJlY2VpdmVkIE9NQ0kgcGFja2V0cy4gKi8KKyAgICB1aW50NjRfdCByeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yOyAvKio8IFJlY2VpdmVkIE9NQ0kgcGFja2V0cyB3aXRoIENSQyBlcnJvcnMuICovCisgICAgdWludDY0X3QgcnhfZHJvcHBlZF90b29fc2hvcnQ7ICAgICAgLyoqPCBSZWNlaXZlZCBwYWNrZXRzIGRyb3BwZWQgZHVlIHRvIGxlbmd0aCB0b28gc2hvcnQuICovCisgICAgdWludDY0X3QgcnhfZHJvcHBlZF90b29fbG9uZzsgICAgICAgLyoqPCBSZWNlaXZlZCBwYWNrZXQgZHJvcHBlZCBkdWUgdG8gbGVuZ3RoIHRvbyBsb25nLiAqLworICAgIHVpbnQ2NF90IHJ4X2NyY19lcnJvcnM7ICAgICAgICAgICAgIC8qKjwgUmVjZWl2ZWQgcGFja2V0IGRyb3BwZWQgZHVlIHRvIGNyYyBlcnJvci4gKi8KKyAgICB1aW50NjRfdCByeF9rZXlfZXJyb3JzOyAgICAgICAgICAgICAvKio8IFJlY2VpdmVkIHBhY2tldCBkcm9wcGVkIGR1ZSB0byBrZXkgZXJyb3IuICovCisgICAgdWludDY0X3QgcnhfZnJhZ21lbnRzX2Vycm9yczsgICAgICAgLyoqPCBSZWNlaXZlZCBwYWNrZXQgZHJvcHBlZCBkdWUgdG8gZnJhZ21lbnRhdGlvbiBlcnJvci4gKi8KKyAgICB1aW50NjRfdCByeF9wYWNrZXRzX2Ryb3BwZWQ7ICAgICAgICAvKio8IEdsb2JhbCBkcm9wcGVkIHBhY2tldHMuICovCisgICAgdWludDY0X3QgdHhfZ2VtOyAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc21pdHRlZCBHRU0gZnJhbWVzLiAqLworICAgIHVpbnQ2NF90IHR4X3Bsb2FtczsgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNtaXR0ZWQgUGxvYW1zLiAqLworICAgIHVpbnQ2NF90IHR4X2dlbV9mcmFnbWVudHM7ICAgICAgICAgIC8qKjwgVHJhbnNtaXR0ZWQgR0VNIGZyYWdtZW50cy4gKi8KKyAgICB1aW50NjRfdCB0eF9jcHU7ICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zbWl0dGVkIENQVSBwYWNrZXRzLiAqLworICAgIHVpbnQ2NF90IHR4X29tY2k7ICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNtaXR0ZWQgT01DSSBwYWNrZXRzLiAqLworICAgIHVpbnQ4X3QgdHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkOyAgICAvKio8IFRyYW5zbWl0IHBhY2tldHMgZHJvcHBlZCBkdWUgdG8gaWxsZWdhbCBsZW5ndGguICovCisgICAgdWludDY0X3QgdHhfZHJvcHBlZF9pbGxlZ2FsX2xlbmd0aDsgICAgIC8qKjwgVHJhbnNtaXR0ZWQgcGFja2V0IGRyb3BwZWQgZHVlIHRvIGlsbGVnYWwgbGVuZ3RoLiAqLworICAgIHVpbnQ2NF90IHR4X2Ryb3BwZWRfdHBpZF9taXNzOyAgICAgICAgICAvKio8IERyb3BwZWQgYmVjYXVzZSBvZiBUUElEIG1pc3MuICovCisgICAgdWludDY0X3QgdHhfZHJvcHBlZF92aWRfbWlzczsgICAgICAgICAgIC8qKjwgRHJvcHBlZCBiZWNhdXNlIG9mIFZJRCBtaXNzLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdCIgZ3JvdXAgb2YgImdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX3N0YXQKK3sKKyAgICBiY21vbHRfc3RhdCBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5OyAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fbmlfc3RhdDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfY2ZnIiBncm91cCBvZiB0aGUgImdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2RhdGEKK3sKKyAgICBiY21vbHRfc3RhdF9hbGFybV9jb25maWcgY2ZnOyAgIC8qKjwgU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uICovCit9IGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9jZmciIGdyb3VwIG9mICJncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZworeworICAgIGJjbW9sdF9zdGF0X2NmZyBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5OyAgICAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZzsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQiIGdyb3VwIG9mIAorICogImdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5OyAvKio8IE9iamVjdCBrZXkuICovCit9IGJjbW9sdF9ncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNwdV9wYWNrZXRzX2ZhaWx1cmUiIGdyb3VwIG9mIHRoZSAiZ3Bvbl9uaSIgCisgKiBvYmplY3QuIAorICoKKyAqIEEgZmFpbHVyZSB3YXMgZW5jb3VudGVyZWQgZHVyaW5nIHRoZSAiY3B1X3BhY2tldHMiIHByb3h5IG9wZXJhdGlvbi4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YQoreworICAgIGJjbW9sdF9wYWNrZXRfaW5qZWN0aW9uX2Vycm9yIGVycm9yOyAgICAvKio8IFRoZSBlcnJvciB0aGF0IHdhcyBlbmNvdW50ZXJlZC4gKi8KKyAgICBiY21vbHRfZ3Bvbl9nZW1faWQgZ2VtX3BvcnRfaWQ7ICAgICAgICAgLyoqPCBUaGUgR0VNIHBvcnQgdGhhdCBjYXVzZWQgdGhlIGVycm9yLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiY3B1X3BhY2tldHNfZmFpbHVyZSIgZ3JvdXAgb2YgImdwb25fbmkiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZQoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5OyAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImRlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkIiBncm91cCBvZiAKKyAqICJncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5OyAvKio8IE9iamVjdCBrZXkuICovCit9IGJjbW9sdF9ncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImRpc2FibGVfYWxsX29udXNfY29tcGxldGVkIiBncm91cCBvZiAKKyAqICJncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5OyAvKio8IE9iamVjdCBrZXkuICovCit9IGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImVuYWJsZV9hbGxfb251c19jb21wbGV0ZWQiIGdyb3VwIG9mIAorICogImdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fbmlfa2V5IGtleTsgLyoqPCBPYmplY3Qga2V5LiAqLworfSBiY21vbHRfZ3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAibG9zIiBncm91cCBvZiB0aGUgImdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX2xvc19kYXRhCit7CisgICAgYmNtb2x0X3N0YXR1cyBzdGF0dXM7ICAgLyoqPCBzdGF0dXMuICovCit9IGJjbW9sdF9ncG9uX25pX2xvc19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImxvcyIgZ3JvdXAgb2YgImdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX2xvcworeworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXk7ICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX25pX2xvc19kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9sb3M7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJvbnVfZGlzY292ZXJlZCIgZ3JvdXAgb2YgdGhlICJncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhCit7CisgICAgYmNtb2x0X3NlcmlhbF9udW1iZXIgc2VyaWFsX251bWJlcjsgLyoqPCBzZXJpYWwgbnVtYmVyLiAqLworICAgIHVpbnQzMl90IHJhbmdpbmdfdGltZTsgICAgICAgICAgICAgIC8qKjwgcmFuZ2luZyB0aW1lLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9pZCBvbnVfaWQ7ICAgICAgICAgIC8qKjwgb251X2lkLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgIm9udV9kaXNjb3ZlcmVkIiBncm91cCBvZiAiZ3Bvbl9uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fbmlfa2V5IGtleTsgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgIm9udV91cGdyYWRlX2NvbXBsZXRlIiBncm91cCBvZiB0aGUgImdwb25fbmkiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YQoreworICAgIGJjbW9zX2Jvb2wgc3RhdHVzOyAgLyoqPCBTdWNjZXNzIG9yIGZhaWx1cmUuICBBZ2FpbnN0IGVudGlyZSB1cGdyYWRlIHByb2Nlc3MuICovCisgICAgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyIGxpc3Rfb2ZfZmFpbGVkX2VudGl0aWVzOyAgICAvKio8IExpc3Qgb2YgT05VLUlEcyB0aGUgdXBncmFkZSBmYWlsZWQgZm9yLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgIm9udV91cGdyYWRlX2NvbXBsZXRlIiBncm91cCBvZiAiZ3Bvbl9uaSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZQoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5OyAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkIiBncm91cCBvZiB0aGUgCisgKiAiZ3Bvbl9uaSIgb2JqZWN0LiAKKyAqCisgKiBBZnRlciBhIHN3aXRjaG92ZXIgaXMgY29tcGxldGUgYW5kIGFsbCBPTlUgcmFuZ2luZyB0aW1lcyBoYXZlIHN0YWJpbGl6ZWQsIAorICogdGhpcyBpbmRpY2F0aW9uIGlzIHNlbnQgdG8gaW5mb3JtIHRoZSBob3N0IG9mIGFsbCBuZXcgT05VIEVRRHMuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhCit7CisgICAgYmNtb2x0X2dwb25fb251X2VxZF9saXN0X3UzMiBvbnVzOyAgLyoqPCBPTlVzLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkIiBncm91cCBvZiAKKyAqICJncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5OyAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInByb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkIiAKKyAqIGdyb3VwIG9mIHRoZSAiZ3Bvbl9uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YQoreworICAgIGJjbW9sdF9yZXN1bHQgcmVzdWx0OyAgIC8qKjwgUmVzdWx0LiAqLworfSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInByb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkIiAKKyAqIGdyb3VwIG9mICJncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5OyAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUiIGdyb3VwIG9mIAorICogdGhlICJncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhCit7CisgICAgYmNtb2x0X3RyYWZmaWNfcmVzdW1lX3Jlc3VsdCByZXN1bHQ7ICAgIC8qKjwgUmVzdWx0LiAqLworfSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInByb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lIiBncm91cCAKKyAqIG9mICJncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZQoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5OyAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWU7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJyb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkIiBncm91cCBvZiB0aGUgCisgKiAiZ3Bvbl9uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhCit7CisgICAgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl93aW5kb3cgd2luZG93X3R5cGU7ICAgICAgICAgIC8qKjwgU2lsZW50IFdpbmRvdyBvciBDdXQgb2ZmIFdpbmRvdyAqLworICAgIGJjbW9sdF9yb2d1ZV9tZWFzdXJlbWVudF9yZXN1bHQgbWVhc3VyZW1lbnRfc3RhdHVzOyAvKio8IFN0YXR1cyBvZiB0aGUgcm9ndWUgT05VIGRldGVjdGlvbiByZXN1bHQuICovCisgICAgYmNtb2x0X2dwb25fYWxsb2NfaWQgYWxsb2NfaWQ7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQWxsb2MtSUQgKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfaWQgb251X2lkOyAgICAgICAgICAgICAgICAgIC8qKjwgT05VLUlEICovCisgICAgYmNtb3NfYm9vbCBpc19kZWxpbmVhdGlvbjsgICAgICAgICAgICAgICAgICAvKio8IEJ1cnN0IERlbGluZWF0aW9uIGRldGVjdGVkIGR1cmluZyB0aGUgcm9ndWUgT05VIGRldGVjdGlvbi4gKi8KKyAgICBiY21vc19ib29sIGlzX2VkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgSXMgRUQuICovCisgICAgYmNtb2x0X3U4X2xpc3RfdTMyIHJ4X2RhdGE7ICAgICAgICAgICAgICAgICAvKio8IENhcHR1cmVkIFBMT0FNdSBtZXNzYWdlIGlmIHRoZSBidXJzdCBkZWxpbmllYXRpb24gd2FzIGRldGVjdGVkLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9pZCBwbG9hbV9yZWNlaXZlZF9vbnVfaWQ7ICAgLyoqPCBPTlUgSUQgcmVjZWl2ZWQgaW4gdGhlIHBsb2FtICovCisgICAgYmNtb3NfYm9vbCBwbG9hbV9yZWNlaXZlZF9jcmNfZXJyb3I7ICAgICAgICAvKio8IENyYyBlcnJvciBpbiB0aGUgcmVjZWl2ZWQgcGxvYW0gKi8KK30gYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInJvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQiIGdyb3VwIG9mIAorICogImdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fbmlfa2V5IGtleTsgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQ7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAicm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0IiBncm91cCAKKyAqIG9mICJncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fbmlfa2V5IGtleTsgLyoqPCBPYmplY3Qga2V5LiAqLworfSBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQ7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCIgCisgKiBncm91cCBvZiAiZ3Bvbl9uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fbmlfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5OyAvKio8IE9iamVjdCBrZXkuICovCit9IGJjbW9sdF9ncG9uX25pX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCIgZ3JvdXAgCisgKiBvZiB0aGUgImdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGEKK3sKKyAgICB1aW50MzJfdCBudW1iZXJfb2ZfZGV0ZWN0ZWRfZGVsaW1pdGVyOyAgLyoqPCBudW1iZXIgb2YgZGV0ZWN0ZWQgZGVsaW1pdGVyLiAqLworICAgIGJjbW9sdF9zdGF0dXMgZW5lcmd5X2RldGVjdF9zaWduYWw7ICAgICAvKio8IGVuZXJneSBkZXRlY3Qgc2lnbmFsLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkIiAKKyAqIGdyb3VwIG9mICJncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5OyAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdF9hbGFybV9jbGVhcmVkIiBncm91cCBvZiB0aGUgImdwb25fbmkiIAorICogb2JqZWN0LiAKKyAqCisgKiBTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaXMgbm8gbG9uZ2VyIG1ldC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhCit7CisgICAgYmNtb2x0X2dwb25fbmlfc3RhdF9pZCBzdGF0OyAgICAvKio8IFN0YXRpc3RpYyBpZGVudGlmaWVyLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGF0X2FsYXJtX2NsZWFyZWQiIGdyb3VwIG9mICJncG9uX25pIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5OyAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2FsYXJtX3JhaXNlZCIgZ3JvdXAgb2YgdGhlICJncG9uX25pIiAKKyAqIG9iamVjdC4gCisgKgorICogU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEKK3sKKyAgICBiY21vbHRfZ3Bvbl9uaV9zdGF0X2lkIHN0YXQ7ICAgIC8qKjwgU3RhdGlzdGljIGlkZW50aWZpZXIuICovCit9IGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9hbGFybV9yYWlzZWQiIGdyb3VwIG9mICJncG9uX25pIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXk7IC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9yYWlzZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0ZV9jaGFuZ2VfY29tcGxldGVkIiBncm91cCBvZiB0aGUgImdwb25fbmkiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhCit7CisgICAgYmNtb2x0X3Jlc3VsdCByZXN1bHQ7ICAgICAgICAgICAgICAgLyoqPCBSZXN1bHQuICovCisgICAgYmNtb2x0X3Bvbl9zdGF0ZSBwcmV2aW91c19zdGF0ZTsgICAgLyoqPCBQcmV2aW91cyBzdGF0ZS4gKi8KKyAgICBiY21vbHRfcG9uX3N0YXRlIG5ld19zdGF0ZTsgICAgICAgICAvKio8IE5ldyBzdGF0ZS4gKi8KK30gYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXRlX2NoYW5nZV9jb21wbGV0ZWQiIGdyb3VwIG9mICJncG9uX25pIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fbmlfa2V5IGtleTsgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJ0b2RfcmVxdWVzdF9jb21wbGV0ZWQiIGdyb3VwIG9mIHRoZSAiZ3Bvbl9uaSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YQoreworICAgIGJjbW9sdF9zdHJfNjQgdG9kX3N0cmluZzsgICAvKio8IHRvZF9zdHJpbmcuICovCisgICAgdWludDMyX3Qgc2ZjOyAgICAgICAgICAgICAgIC8qKjwgc2ZjLiAqLworICAgIHVpbnQ2NF90IHJ0Y19vZmZzZXRfc2VjOyAgICAvKio8IHJ0Y19vZmZzZXRfc2VjLiAqLworICAgIHVpbnQzMl90IHJ0Y19vZmZzZXRfbnNlYzsgICAvKio8IHJ0Y19vZmZzZXRfbnNlYy4gKi8KKyAgICBiY21vbHRfcmVzdWx0IHN0YXR1czsgICAgICAgLyoqPCBzdGF0dXMuICovCit9IGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInRvZF9yZXF1ZXN0X2NvbXBsZXRlZCIgZ3JvdXAgb2YgImdwb25fbmkiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXk7IC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImF1dG9fY2ZnIiBncm91cCBvZiB0aGUgImdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGEKK3sKKyAgICBiY21vc19ib29sIGFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZDsgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAiYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIGNwdV9wYWNrZXRzX2ZhaWx1cmU7ICAgICAgICAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAiY3B1X3BhY2tldHNfZmFpbHVyZSIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBkZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZDsgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImRlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIGRpc2FibGVfYWxsX29udXNfY29tcGxldGVkOyAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAiZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZDsgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJlbmFibGVfYWxsX29udXNfY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIGxvczsgICAgICAgICAgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImxvcyIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBvbnVfZGlzY292ZXJlZDsgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJvbnVfZGlzY292ZXJlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBvbnVfdXBncmFkZV9jb21wbGV0ZTsgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJvbnVfdXBncmFkZV9jb21wbGV0ZSIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBwcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZDsgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHByb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkOyAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWU7ICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJwcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCByb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkOyAgICAgICAgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInJvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0OyAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJyb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydDsgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0IiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHN0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkOyAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAic3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgc3RhdF9hbGFybV9jbGVhcmVkOyAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAic3RhdF9hbGFybV9jbGVhcmVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHN0YXRfYWxhcm1fcmFpc2VkOyAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInN0YXRfYWxhcm1fcmFpc2VkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHN0YXRlX2NoYW5nZV9jb21wbGV0ZWQ7ICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInN0YXRlX2NoYW5nZV9jb21wbGV0ZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgdG9kX3JlcXVlc3RfY29tcGxldGVkOyAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAidG9kX3JlcXVlc3RfY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KK30gYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJhdXRvX2NmZyIgZ3JvdXAgb2YgImdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnCit7CisgICAgYmNtb2x0X2F1dG9fY2ZnIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXk7ICAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiZGlzYWJsZV9zZXJpYWxfbnVtYmVyIiBncm91cCBvZiB0aGUgImdwb25fbmkiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGEKK3sKKyAgICBiY21vbHRfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2NvbnRyb2wgY29udHJvbDsgICAvKio8IGNvbnRyb2wuICovCisgICAgYmNtb2x0X3NlcmlhbF9udW1iZXIgc2VyaWFsX251bWJlcjsgICAgICAgICAgICAgLyoqPCBzZXJpYWwgbnVtYmVyLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJkaXNhYmxlX3NlcmlhbF9udW1iZXIiIGdyb3VwIG9mICJncG9uX25pIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcgoreworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5OyAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXI7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlIAorICogInByb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlIiBncm91cCBvZiB0aGUgImdwb25fbmkiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfZGF0YQoreworICAgIGJjbW9sdF9zd2l0Y2hfb3Zlcl90eXBlX2Nfb251X3N0YXRlIG9udV9zdGF0ZTsgIC8qKjwgb251IHN0YXRlLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9pZF9saXN0X3UzMl9tYXhfMjU2IG9udV9saXN0OyAgIC8qKjwgb251IGxpc3QuICovCit9IGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAKKyAqICJwcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZSIgZ3JvdXAgb2YgImdwb25fbmkiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGUKK3sKKyAgICBiY21vbHRfb3BlciBoZHI7ICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fbmlfa2V5IGtleTsgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJyZXNldCIgZ3JvdXAgb2YgImdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX3Jlc2V0Cit7CisgICAgYmNtb2x0X29wZXIgaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXk7IC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X2dwb25fbmlfcmVzZXQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJyb2d1ZV9kZXRlY3Rpb25fd2luZG93IiBncm91cCBvZiB0aGUgImdwb25fbmkiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhCit7CisgICAgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl93aW5kb3cgd2luZG93X3R5cGU7ICAvKio8IFR5cGUgb2Ygc2lsZW50IG1lYXN1cmVtZW50IHRvIGV4ZWN1dGUgKi8KKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19pZCBhbGxvY19pZDsgICAgICAgICAgICAgIC8qKjwgQUxMT0MgSUQgdG8gc2NhbiAqLworICAgIGJjbW9sdF9ncG9uX29udV9pZCBvbnVfaWQ7ICAgICAgICAgICAgICAgICAgLyoqPCBPTlUgSUQgdG8gc2NhbiAqLworICAgIGJjbW9zX2Jvb2wgc2Vjb25kX3Jhbmdpbmdfd2luZG93OyAgICAgICAgICAgLyoqPCBOb3QgY3VycmVudGx5IHN1cHBvcnRlZCAqLworfSBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAicm9ndWVfZGV0ZWN0aW9uX3dpbmRvdyIgZ3JvdXAgb2YgImdwb25fbmkiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdworeworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5OyAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhIGRhdGE7ICAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInNldF9vbnVfc3RhdGUiIGdyb3VwIG9mIHRoZSAiZ3Bvbl9uaSIgb2JqZWN0LiAKKyAqCisgKiBTZXQgdGhlIG9wZXJhdGlvbiBzdGF0ZSBvZiBhbGwgT05Vcy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YQoreworICAgIGJjbW9sdF9vbnVfb3BlcmF0aW9uIG9udV9zdGF0ZTsgLyoqPCBOZXcgb3BlcmF0aW9uIHN0YXRlIG9mIGFsbCBPTlVzLiAgVGhlIGRlZmF1bHQgb3BlcmF0aW9uIG1heSBiZSBjb25maWd1cmVkIGJ5IHRoZSBHUE9OIE5JIGNvbmZpZ3VyYXRpb24gb2JqZWN0IDogZ3Bvbl9uaS5jZmcuc25fYWNxdWlzaXRpb24uICovCit9IGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzZXRfb251X3N0YXRlIiBncm91cCBvZiAiZ3Bvbl9uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZQoreworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fbmlfa2V5IGtleTsgICAgICAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic2V0X3Bvbl9zdGF0ZSIgZ3JvdXAgb2YgdGhlICJncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGEKK3sKKyAgICBiY21vbHRfcG9uX29wZXJhdGlvbiBwb25fc3RhdGU7IC8qKjwgUE9OIHN0YXRlLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic2V0X3Bvbl9zdGF0ZSIgZ3JvdXAgb2YgImdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGUKK3sKKyAgICBiY21vbHRfb3BlciBoZHI7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXk7ICAgICAgICAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nIiAKKyAqIGdyb3VwIG9mICJncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nCit7CisgICAgYmNtb2x0X29wZXIgaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXk7IC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X2dwb25fbmlfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXJ0X29udV91cGdyYWRlIiBncm91cCBvZiB0aGUgImdwb25fbmkiIAorICogb2JqZWN0LiAKKyAqCisgKiBPTFQgdG8gT05VIGZpcm13YXJlIHRyYW5zZmVyIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhCit7CisgICAgYmNtb2x0X3Bvbl9vbnVfaWRfbGlzdF91MzIgbGlzdF9vZl9vbnVfaWRzOyAvKio8IExpc3Qgb2YgT05VIElEcyB0byB1cGdyYWRlIHRoZSBmaXJtd2FyZS4gKi8KK30gYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGFydF9vbnVfdXBncmFkZSIgZ3JvdXAgb2YgImdwb25fbmkiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGUKK3sKKyAgICBiY21vbHRfb3BlciBoZHI7ICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fbmlfa2V5IGtleTsgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJ0b2RfcmVxdWVzdCIgZ3JvdXAgb2YgImdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0Cit7CisgICAgYmNtb2x0X29wZXIgaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXk7IC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3Q7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJicm9hZGNhc3RfcGxvYW1fcGFja2V0IiBncm91cCBvZiB0aGUgImdwb25fbmkiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhCit7CisjZGVmaW5lIEJDTU9MVF9HUE9OX05JX0JST0FEQ0FTVF9QTE9BTV9QQUNLRVRfREFUQV9QTE9BTV9MRU4gICAgMTIKKyAgICBiY21vbHRfYXJyX3U4XzEyIHBsb2FtOyAvKio8IHBsb2FtLiAqLworfSBiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiYnJvYWRjYXN0X3Bsb2FtX3BhY2tldCIgZ3JvdXAgb2YgImdwb25fbmkiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldAoreworICAgIGJjbW9sdF9wcm94eSBoZHI7ICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5OyAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhIGRhdGE7ICAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNwdV9wYWNrZXRzIiBncm91cCBvZiB0aGUgImdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2RhdGEKK3sKKyAgICBiY21vbHRfcGFja2V0X3R5cGUgcGFja2V0X3R5cGU7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBwYWNrZXQgdHlwZS4gKi8KKyAgICBiY21vc19ib29sIGNhbGNfY3JjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBjYWxjIGNyYy4gKi8KKyAgICBiY21vbHRfZ3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTYgZ2VtX3BvcnRfbGlzdDsgICAgLyoqPCBnZW0gcG9ydCBsaXN0LiAqLworICAgIGJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OCBidWZmZXI7ICAgICAgICAgICAgICAgICAvKio8IGJ1ZmZlci4gKi8KK30gYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJjcHVfcGFja2V0cyIgZ3JvdXAgb2YgImdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzCit7CisgICAgYmNtb2x0X3Byb3h5IGhkcjsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5OyAgICAgICAgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAia2V5IiBncm91cCBvZiB0aGUgImdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfa2V5Cit7CisgICAgYmNtb2x0X2dwb25fbmkgcG9uX25pOyAgICAgIC8qKjwgUE9OIG5ldHdvcmsgaW50ZXJmYWNlLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9pZCBvbnVfaWQ7ICAvKio8IE9OVSBJRC4gKi8KK30gYmNtb2x0X2dwb25fb251X2tleTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNmZyIgZ3JvdXAgb2YgdGhlICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X2NmZ19kYXRhCit7CisgICAgYmNtb2x0X29udV9zdGF0ZSBvbnVfc3RhdGU7ICAgICAgICAgLyoqPCBDdXJyZW50IE9OVSBzdGF0ZSAqLworICAgIGJjbW9sdF9zZXJpYWxfbnVtYmVyIHNlcmlhbF9udW1iZXI7IC8qKjwgT05VIHNlcmlhbCBudW1iZXIgKi8KKyNkZWZpbmUgQkNNT0xUX0dQT05fT05VX0NGR19EQVRBX1BBU1NXT1JEX0xFTiAgIDEwCisgICAgYmNtb2x0X2Fycl91OF8xMCBwYXNzd29yZDsgICAgICAgICAgLyoqPCBPTlUgcGFzc3dvcmQgKi8KKyAgICBiY21vc19ib29sIGF1dG9fcGFzc3dvcmRfbGVhcm5pbmc7ICAvKio8IEVuYWJsZVxEaXNhYmxlIGF1dG9tYXRpYyBwYXNzd29yZCBsZWFybmluZyAqLworICAgIGJjbW9zX2Jvb2wgdXNfZmVjOyAgICAgICAgICAgICAgICAgIC8qKjwgRW5hYmxlXERpc2FibGUgVVMgRkVDIGZvciBPTlUgKi8KKyAgICBiY21vbHRfZ3Bvbl9nZW1faWQgb21jaV9wb3J0X2lkOyAgICAvKio8IE9NQ0kgcG9ydCBJRCAgKi8KKyAgICBiY21vbHRfYmVyX2ludGVydmFsIGRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWw7ICAvKio8IERTIEJFUiByZXBvcnRpbmcgaW50ZXJ2YWwgKi8KKyAgICBiY21vbHRfYWVzX2tleSBhZXNfZW5jcnlwdGlvbl9rZXk7ICAgICAgICAgICAgICAvKio8IEFFUyBlbmNyeXB0aW9uIGtleS4gICovCisgICAgYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlIGFsYXJtX3N0YXRlOyAgICAgICAgLyoqPCBTdGF0ZSBvZiBhbGwgT05VIGFsYXJtcy4gIFRoaXMgaXMgbm9ybWFsbHkgcmVhZC1vbmx5IGFuZCBjYW4gb25seSBiZSB3cml0dGVuIHdoZW4gdGhlIFBPTiBpcyBpbiBhY3RpdmUtc3RhbmRieSBtb2RlIHRvIGtlZXAgdGhlIE9OVSBpbiBzeW5jLiAqLworICAgIHVpbnQzMl90IHJhbmdpbmdfdGltZTsgICAgICAgICAgICAgICAgICAvKio8IE9OVSByYW5naW5nIHRpbWUuICBUaGlzIGlzIG5vcm1hbGx5IHJlYWQtb25seSBhbmQgY2FuIG9ubHkgYmUgd3JpdHRlbiB3aGVuIHRoZSBQT04gaXMgaW4gYWN0aXZlLXN0YW5kYnkgbW9kZSB0byBrZWVwIHRoZSBPTlUgaW4gc3luYy4gKi8KKyAgICBiY21vbHRfc3RhdHVzIGRpc2FibGVkX2FmdGVyX2Rpc2NvdmVyeTsgLyoqPCBUaGlzIE9OVSB3YXMgZGlzYWJsZWQgYWZ0ZXIgU04gZGlzY292ZXJ5ICovCisgICAgYmNtb2x0X2RlYWN0aXZhdGlvbl9yZWFzb24gZGVhY3RpdmF0aW9uX3JlYXNvbjsgICAgICAgICAgICAgICAgIC8qKjwgUmVhc29uIGZvciB0aGUgbGFzdCBPTlUgZGVhY3RpdmF0aW9uICovCisgICAgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2IGFsbF9nZW1fcG9ydHM7IC8qKjwgQWxsIHVuaWNhc3QgR0VNIHBvcnRzIGN1cnJlbnRseSBwcm92aXNpb25lZCBvbiB0aGlzIE9OVS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMiBhbGxfYWxsb2NzOyAgICAgICAgLyoqPCBBbGwgYWxsb2MgSURzIGN1cnJlbnRseSBwcm92aXNpb25lZCBvbiB0aGlzIE9OVS4gKi8KKyAgICBiY21vc19ib29sIG9udV9wc190eXBlX2M7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IG9udSBwcm90ZWN0aW9uIHN3aXRjaGluZyB0eXBlIGMuICovCisgICAgYmNtb2x0X2V4dGVuZGVkX2d1YXJkX3RpbWUgZXh0ZW5kZWRfZ3VhcmRfdGltZTsgLyoqPCBBZGRpdGlvbmFsIGd1YXJkIHRpbWUgKGluIGJ5dGVzKSBmb3IgdGhpcyBPTlUuICovCit9IGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJjZmciIGdyb3VwIG9mICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X2NmZworeworICAgIGJjbW9sdF9jZmcgaGRyOyAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5OyAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfY2ZnOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdCIgZ3JvdXAgb2YgdGhlICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YQoreworICAgIHVpbnQ2NF90IGZlY19jb2Rld29yZHM7ICAgICAgICAgICAgIC8qKjwgVG90YWwgcmVjZWl2ZWQgRkVDIGNvZGV3b3Jkcy4gKi8KKyAgICB1aW50NjRfdCBmZWNfYnl0ZXNfY29ycmVjdGVkOyAgICAgICAvKio8IEZFQyBjb2Rld29yZHMgY29ycmVjdGVkIGJ5dGVzLiAqLworICAgIHVpbnQ2NF90IGZlY19jb2Rld29yZHNfY29ycmVjdGVkOyAgIC8qKjwgRkVDIGNvcnJlY3RlZCBjb2Rld29yZHMgZXJyb3IgLiAqLworICAgIHVpbnQ2NF90IGZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQ7IC8qKjwgRkVDIG5vdCBjb3JyZWN0ZWQgY29kZXdvcmRzIGVycm9yLiAqLworICAgIHVpbnQ2NF90IGJpcDhfYnl0ZXM7ICAgICAgICAgICAgICAgIC8qKjwgUmVjZWl2ZWQgYnl0ZXMgZm9yIEJJUDguICovCisgICAgdWludDY0X3QgYmlwOF9lcnJvcnM7ICAgICAgICAgICAgICAgLyoqPCBCaXQgZXJyb3IgYWNjb3JkaW5nIHRvIEJJUDguICovCisgICAgdWludDY0X3QgcnhfcGxvYW1zX2NyY19lcnJvcjsgICAgICAgLyoqPCBSZWNlaXZlZCBQTE9BTXMgd2l0aCBDUkMgZXJyb3IuICovCisgICAgdWludDY0X3QgcnhfcGxvYW1zX25vbl9pZGxlOyAgICAgICAgLyoqPCBSZWNlaXZlZCBub24gaWRsZSBQTE9BTXMuICovCisgICAgdWludDY0X3QgcG9zaXRpdmVfZHJpZnQ7ICAgICAgICAgICAgLyoqPCBQb3NpdGl2ZSBkcmlmdC4gKi8KKyAgICB1aW50NjRfdCBuZWdhdGl2ZV9kcmlmdDsgICAgICAgICAgICAvKio8IE5lZ2F0aXZlIGRyaWZ0LiAqLworICAgIHVpbnQ2NF90IHJ4X29tY2k7ICAgICAgICAgICAgICAgICAgIC8qKjwgUmVjZWl2ZWQgT01DSSBwYWNrZXRzLiAqLworICAgIHVpbnQ2NF90IHJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3I7IC8qKjwgUmVjZWl2ZWQgT01DSSBwYWNrZXRzIHdpdGggQ1JDIGVycm9ycy4gKi8KKyAgICB1aW50NjRfdCBiZXJfcmVwb3J0ZWQ7ICAgICAgICAgICAgICAvKio8IEJFUiByZXBvcnRlZC4gKi8KKyAgICB1aW50NjRfdCB1bnJlY2VpdmVkX2J1cnN0OyAgICAgICAgICAvKio8IFVucmVjZWl2ZWQgYnVyc3QuICovCisgICAgdWludDY0X3QgbGNkZ19lcnJvcnM7ICAgICAgICAgICAgICAgLyoqPCBMQ0RHIGVycm9ycy4gKi8KKyAgICB1aW50NjRfdCByZGlfZXJyb3JzOyAgICAgICAgICAgICAgICAvKio8IFJESSBlcnJvcnMuICovCisgICAgdWludDY0X3QgcnhfYnl0ZXM7ICAgICAgICAgICAgICAgICAgLyoqPCByeCBieXRlcy4gKi8KKyAgICB1aW50NjRfdCByeF9wYWNrZXRzOyAgICAgICAgICAgICAgICAvKio8IHJ4IHBhY2tldHMuICovCisgICAgdWludDY0X3QgdHhfYnl0ZXM7ICAgICAgICAgICAgICAgICAgLyoqPCB0eCBieXRlcy4gKi8KKyAgICB1aW50NjRfdCB0eF9wYWNrZXRzOyAgICAgICAgICAgICAgICAvKio8IHR4IHBhY2tldHMuICovCit9IGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdCIgZ3JvdXAgb2YgImdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfc3RhdAoreworICAgIGJjbW9sdF9zdGF0IGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5OyAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfc3RhdDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfY2ZnIiBncm91cCBvZiB0aGUgImdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfZGF0YQoreworICAgIGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyBjZmc7ICAgLyoqPCBTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4gKi8KK30gYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9jZmciIGdyb3VwIG9mICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnCit7CisgICAgYmNtb2x0X3N0YXRfY2ZnIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5OyAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImJlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCIgZ3JvdXAgb2YgCisgKiB0aGUgImdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEKK3sKKyAgICBiY21vbHRfYmVyX2ludGVydmFsIGJlcl9pbnRlcnZhbDsgICAvKio8IEJFUiBpbnRlcnZhbCBpbiBtcy4gKi8KKyAgICBiY21vbHRfcmVzdWx0IHJlc3VsdDsgICAgICAgICAgICAgICAvKio8IFJlc3VsdC4gKi8KK30gYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImJlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCIgCisgKiBncm91cCBvZiAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImRmaSIgZ3JvdXAgb2YgdGhlICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X2RmaV9kYXRhCit7CisgICAgYmNtb2x0X3N0YXR1cyBhbGFybV9zdGF0dXM7IC8qKjwgYWxhcm0gc3RhdHVzLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiZGZpIiBncm91cCBvZiAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9kZmkKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleTsgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fb251X2RmaTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImRnaSIgZ3JvdXAgb2YgdGhlICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X2RnaV9kYXRhCit7CisgICAgYmNtb2x0X3N0YXR1cyBhbGFybV9zdGF0dXM7IC8qKjwgYWxhcm0gc3RhdHVzLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfZGdpX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiZGdpIiBncm91cCBvZiAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9kZ2kKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleTsgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfZGdpX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fb251X2RnaTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImRvd2kiIGdyb3VwIG9mIHRoZSAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9kb3dpX2RhdGEKK3sKKyAgICBiY21vbHRfc3RhdHVzIGFsYXJtX3N0YXR1czsgLyoqPCBBbGFybSBzdGF0dXMuICovCisgICAgaW50MzJfdCBkcmlmdF92YWx1ZTsgICAgICAgIC8qKjwgQ2FsY3VsYXRlZCBhbW91bnQgb2YgZHJpZnQgKHBvc2l0aXZlICsgbmVnYXRpdmUgYXMgYSBzaWduZWQgdmFsdWUpLiAqLworICAgIHVpbnQzMl90IG5ld19lcWQ7ICAgICAgICAgICAvKio8IE5ldyBFUUQgYWZ0ZXIgZHJpZnQgaXMgY29ycmVjdGVkIChvbmx5IHZhbGlkIGlmIHN0YXR1cyBpcyAnb24nKS4gKi8KK30gYmNtb2x0X2dwb25fb251X2Rvd2lfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJkb3dpIiBncm91cCBvZiAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9kb3dpCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXk7ICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fb251X2Rvd2lfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX29udV9kb3dpOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiZXJyIiBncm91cCBvZiB0aGUgImdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfZXJyX2RhdGEKK3sKKyAgICB1aW50OF90IGJpcDhfZXJyb3JzOyAgICAvKio8IEJJUDggZXJyb3JzLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfZXJyX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiZXJyIiBncm91cCBvZiAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9lcnIKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleTsgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfZXJyX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fb251X2VycjsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImludmFsaWRfZGJydV9yZXBvcnQiIGdyb3VwIG9mIHRoZSAiZ3Bvbl9vbnUiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YQoreworICAgIGJjbW9sdF9ncG9uX2FsbG9jX2lkIGFsbG9jX2lkOyAgLyoqPCBBbGxvYy1JRC4gKi8KK30gYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJpbnZhbGlkX2RicnVfcmVwb3J0IiBncm91cCBvZiAiZ3Bvbl9vbnUiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleV9leGNoYW5nZV9jb21wbGV0ZWQiIGdyb3VwIG9mIHRoZSAKKyAqICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YQoreworICAgIGJjbW9sdF9hZXNfa2V5IG5ld19rZXk7IC8qKjwgbmV3IGtleS4gKi8KK30gYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJrZXlfZXhjaGFuZ2VfY29tcGxldGVkIiBncm91cCBvZiAKKyAqICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWQ7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAia2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQiIGdyb3VwIG9mIAorICogImdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCit9IGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkIiBncm91cCBvZiB0aGUgCisgKiAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9kYXRhCit7CisgICAgYmNtb2x0X2Flc19rZXkgbmV3X2tleTsgLyoqPCBuZXcga2V5LiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJrZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZCIgZ3JvdXAgb2YgCisgKiAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2giIGdyb3VwIG9mIHRoZSAKKyAqICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YQoreworICAgIGJjbW9sdF9hZXNfa2V5IGV4cGVjdGVkX2tleTsgICAgLyoqPCBleHBlY3RlZCBrZXkuICovCisgICAgYmNtb2x0X2Flc19rZXkgcmVjZWl2ZWRfa2V5OyAgICAvKio8IHJlY2VpdmVkIGtleS4gKi8KK30gYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJrZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoIiBncm91cCBvZiAKKyAqICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2gKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImtleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0IiBncm91cCBvZiAKKyAqICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0Cit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleTsgICAgLyoqPCBPYmplY3Qga2V5LiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJrZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleCIgZ3JvdXAgb2YgdGhlIAorICogImdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhfZGF0YQoreworICAgIHVpbnQzMl90IGV4cGVjdGVkX2luZGV4OyAgICAvKio8IGV4cGVjdGVkIGluZGV4LiAqLworICAgIHVpbnQzMl90IGFjdHVhbF9pbmRleDsgICAgICAvKio8IGFjdHVhbCBpbmRleC4gKi8KK30gYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAia2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXgiIGdyb3VwIG9mIAorICogImdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXgKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXg7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJsb2FpIiBncm91cCBvZiB0aGUgImdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfbG9haV9kYXRhCit7CisgICAgYmNtb2x0X3N0YXR1cyBhbGFybV9zdGF0dXM7IC8qKjwgYWxhcm0gc3RhdHVzLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfbG9haV9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImxvYWkiIGdyb3VwIG9mICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X2xvYWkKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleTsgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfbG9haV9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fb251X2xvYWk7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJsb2tpIiBncm91cCBvZiB0aGUgImdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfbG9raV9kYXRhCit7CisgICAgYmNtb2x0X3N0YXR1cyBhbGFybV9zdGF0dXM7IC8qKjwgYWxhcm0gc3RhdHVzLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfbG9raV9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImxva2kiIGdyb3VwIG9mICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X2xva2kKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleTsgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfbG9raV9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fb251X2xva2k7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJtZW1pIiBncm91cCBvZiB0aGUgImdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfbWVtaV9kYXRhCit7CisjZGVmaW5lIEJDTU9MVF9HUE9OX09OVV9NRU1JX0RBVEFfUExPQU1fQlVGRkVSX0xFTiAgMTMKKyAgICBiY21vbHRfYXJyX3U4XzEzIHBsb2FtX2J1ZmZlcjsgIC8qKjwgUExPQU0gYnVmZmVyLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfbWVtaV9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgIm1lbWkiIGdyb3VwIG9mICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X21lbWkKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleTsgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfbWVtaV9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fb251X21lbWk7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJvbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQiIGdyb3VwIG9mIAorICogdGhlICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhCit7CisgICAgYmNtb2x0X2dwb25fZ2VtX2lkIGdlbV9wb3J0OyAgICAvKio8IEdFTSBQb3J0IElELiAqLworICAgIGJjbW9sdF9yZXN1bHQgc3RhdHVzOyAgICAgICAgICAgLyoqPCBzdGF0dXMuICovCisgICAgYmNtb2x0X29tY2lfcG9ydF9pZF9vcGVyYXRpb24gb3BlcmF0aW9uOyAgICAvKio8IE9wZXJhdGlvbi4gKi8KK30gYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgIm9tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCIgCisgKiBncm91cCBvZiAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgIm9udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCIgZ3JvdXAgb2YgdGhlIAorICogImdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGEKK3sKKyAgICBiY21vbHRfcmVzdWx0IHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgc3RhdHVzLiAqLworICAgIGJjbW9sdF9hY3RpdmF0aW9uX2ZhaWxfcmVhc29uIGZhaWxfcmVhc29uOyAgLyoqPCBmYWlsIHJlYXNvbi4gKi8KK30gYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgIm9udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCIgZ3JvdXAgb2YgCisgKiAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgIm9udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkIiBncm91cCBvZiB0aGUgCisgKiAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9kYXRhCit7CisgICAgYmNtb2x0X3Jlc3VsdCByZXN1bHQ7ICAgLyoqPCByZXN1bHQuICovCit9IGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgIm9udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkIiBncm91cCBvZiAKKyAqICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleTsgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAib251X2FsYXJtIiBncm91cCBvZiB0aGUgImdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2RhdGEKK3sKKyAgICBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zIG9udV9hbGFybTsgICAvKio8IG9udSBhbGFybS4gKi8KK30gYmNtb2x0X2dwb25fb251X29udV9hbGFybV9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgIm9udV9hbGFybSIgZ3JvdXAgb2YgImdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleTsgICAgICAgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1fZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm07CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJvbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCIgZ3JvdXAgb2YgdGhlIAorICogImdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YQoreworICAgIGJjbW9sdF9yZXN1bHQgc3RhdHVzOyAgIC8qKjwgc3RhdHVzLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJvbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCIgZ3JvdXAgb2YgCisgKiAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAib251X2Rpc2FibGVfY29tcGxldGVkIiBncm91cCBvZiB0aGUgImdwb25fb251IiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YQoreworICAgIGJjbW9sdF9zZXJpYWxfbnVtYmVyIHNlcmlhbF9udW1iZXI7IC8qKjwgc2VyaWFsIG51bWJlci4gKi8KK30gYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgIm9udV9kaXNhYmxlX2NvbXBsZXRlZCIgZ3JvdXAgb2YgImdwb25fb251IiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhIGRhdGE7ICAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgIm9udV9lbmFibGVfY29tcGxldGVkIiBncm91cCBvZiB0aGUgImdwb25fb251IiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhCit7CisgICAgYmNtb2x0X3NlcmlhbF9udW1iZXIgc2VyaWFsX251bWJlcjsgLyoqPCBzZXJpYWwgbnVtYmVyLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJvbnVfZW5hYmxlX2NvbXBsZXRlZCIgZ3JvdXAgb2YgImdwb25fb251IiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZDsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJvcHRpY2FsX3JlZmxlY3Rpb24iIGdyb3VwIG9mICJncG9uX29udSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleTsgICAgLyoqPCBPYmplY3Qga2V5LiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAicGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkIiBncm91cCBvZiAKKyAqIHRoZSAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfZGF0YQoreworICAgIGJjbW9sdF9yZXN1bHQgc3RhdHVzOyAgIC8qKjwgc3RhdHVzLiAqLworICAgIGJjbW9sdF9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9mYWlsX3JlYXNvbiBmYWlsX3JlYXNvbjsgLyoqPCBmYWlsIHJlYXNvbi4gKi8KKyNkZWZpbmUgQkNNT0xUX0dQT05fT05VX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFRF9EQVRBX1BBU1NXT1JEX0xFTiAxMAorICAgIGJjbW9sdF9hcnJfdThfMTAgcGFzc3dvcmQ7ICAvKio8IHBhc3N3b3JkLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAicGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkIiBncm91cCAKKyAqIG9mICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAicGVlIiBncm91cCBvZiB0aGUgImdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfcGVlX2RhdGEKK3sKKyAgICBiY21vbHRfc3RhdHVzIGFsYXJtX3N0YXR1czsgLyoqPCBhbGFybSBzdGF0dXMuICovCit9IGJjbW9sdF9ncG9uX29udV9wZWVfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJwZWUiIGdyb3VwIG9mICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X3BlZQoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5OyAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX29udV9wZWVfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfcGVlOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAicG9zc2libGVfZHJpZnQiIGdyb3VwIG9mIHRoZSAiZ3Bvbl9vbnUiIAorICogb2JqZWN0LiAKKyAqCisgKiBBbiBPTlUgaW4gYSBsb3cgcG93ZXIgc3RhdGUgbWF5IGJlIGV4cGVyaWVuY2luZyBkcmlmdCBiZXlvbmQgdGhlIGNvbmZpZ3VyZWQgCisgKiB0aHJlc2hvbGQuIFRoZSBlc3RpbWF0ZSBtYXkgYmUgaW5hY2N1cmF0ZSBkZXBlbmRpbmcgb24gT05VIGJlaGF2aW9yLiBBY3R1YWwgCisgKiBkcmlmdCBtYXkgYmUgbGVzcyB0aGFuIGVzdGltYXRlZC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhCit7CisgICAgYmNtb2x0X3N0YXR1cyBhbGFybV9zdGF0dXM7IC8qKjwgT246IGVzdGltYXRlZCBkcmlmdCBoYXMgZXhjZWVkZWQgdGhlIGNvbmZpZ3VyZWQgdGhyZXNob2xkLiAqLworICAgIGludDMyX3QgZXN0aW1hdGVkX2RyaWZ0OyAgICAvKio8IElmIHN0YXR1cyBpcyBvbiwgdGhlIGVzdGltYXRlZCBkcmlmdCB2YWx1ZSwgb3RoZXJ3aXNlIHplcm8gKDApLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJwb3NzaWJsZV9kcmlmdCIgZ3JvdXAgb2YgImdwb25fb251IiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAicG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UiIGdyb3VwIG9mIHRoZSAKKyAqICJncG9uX29udSIgb2JqZWN0LiAKKyAqCisgKiBOb3RpZmljYXRpb24gdGhhdCBhbiBPTlVzIHBvd2VyIG1hbmFnZW1lbnQgc3RhdGUgaGFzIGNoYW5nZWQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YQoreworICAgIGJjbW9sdF9vbnVfc3RhdGUgb2xkX3N0YXRlOyAvKio8IFRoZSBzdGF0ZSB0aGUgT05VIHdhcyBwcmV2aW91c2x5IGluLiAqLworICAgIGJjbW9sdF9vbnVfc3RhdGUgbmV3X3N0YXRlOyAvKio8IFRoZSBzdGF0ZSB0aGUgT05VIGlzIGN1cnJlbnRseSBpbi4gKi8KKyAgICBiY21vbHRfcG93ZXJfbWFuYWdlbWVudF90cmFuc2l0aW9uX3JlYXNvbiByZWFzb247ICAgLyoqPCBUaGUgcmVhc29uIGZvciB0aGUgc3RhdGUgY2hhbmdlLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSIgZ3JvdXAgb2YgCisgKiAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZQoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInBzdCIgZ3JvdXAgb2YgdGhlICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X3BzdF9kYXRhCit7CisgICAgdWludDMyX3QgbGlua19udW1iZXI7ICAgLyoqPCBsaW5rIG51bWJlci4gKi8KKyAgICB1aW50OF90IGsxOyAgICAgICAgICAgICAvKio8IEsxLiAqLworICAgIHVpbnQ4X3QgazI7ICAgICAgICAgICAgIC8qKjwgSzIuICovCit9IGJjbW9sdF9ncG9uX29udV9wc3RfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJwc3QiIGdyb3VwIG9mICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X3BzdAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5OyAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX29udV9wc3RfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfcHN0OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAicmFuZ2luZ19jb21wbGV0ZWQiIGdyb3VwIG9mIHRoZSAiZ3Bvbl9vbnUiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEKK3sKKyAgICBiY21vbHRfcmVzdWx0IHN0YXR1czsgICAgICAgICAgICAgICAgICAgLyoqPCBzdGF0dXMuICovCisgICAgYmNtb2x0X3JhbmdpbmdfZmFpbF9yZWFzb24gZmFpbF9yZWFzb247IC8qKjwgZmFpbCByZWFzb24uICovCisgICAgdWludDhfdCBudW1iZXJfb2ZfcGxvYW1zOyAgICAgICAgICAgICAgIC8qKjwgbnVtYmVyIG9mIFBMT0FNcy4gKi8KKyAgICB1aW50MzJfdCBlcWQ7ICAgICAgICAgICAvKio8IEVRRC4gKi8KKyAgICB1aW50OF90IHBvd2VyX2xldmVsOyAgICAvKio8IFBvd2VyIExldmVsLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJyYW5naW5nX2NvbXBsZXRlZCIgZ3JvdXAgb2YgImdwb25fb251IiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInJlaSIgZ3JvdXAgb2YgdGhlICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X3JlaV9kYXRhCit7CisgICAgdWludDMyX3QgYmlwOF9lcnJvcnM7ICAgLyoqPCBCSVA4IGVycm9ycy4gKi8KK30gYmNtb2x0X2dwb25fb251X3JlaV9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInJlaSIgZ3JvdXAgb2YgImdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfcmVpCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXk7ICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fb251X3JlaV9kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX29udV9yZWk7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJyc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCIgZ3JvdXAgb2YgdGhlIAorICogImdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YQoreworICAgIGJjbW9sdF9yZXN1bHQgc3RhdHVzOyAgIC8qKjwgc3RhdHVzLiAqLworICAgIGJjbW9sdF9yc3NpX21lYXN1cmVtZW50X2ZhaWxfcmVhc29uIGZhaWxfcmVhc29uOyAgICAvKio8IGZhaWwgcmVhc29uLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJyc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCIgZ3JvdXAgb2YgCisgKiAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic2RpIiBncm91cCBvZiB0aGUgImdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfc2RpX2RhdGEKK3sKKyAgICBiY21vbHRfc3RhdHVzIGFsYXJtX3N0YXR1czsgLyoqPCBhbGFybSBzdGF0dXMuICovCisgICAgdWludDMyX3QgYmVyOyAgICAgICAgICAgICAgIC8qKjwgSW52ZXJzZSBiaXQgZXJyb3IgcmF0ZSAoZS5nLiBpZiB0aGlzIG51bWJlciBpcyAxMDAwLCB0aGUgQkVSIGlzIDEvMTAwMCkuICovCit9IGJjbW9sdF9ncG9uX29udV9zZGlfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzZGkiIGdyb3VwIG9mICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X3NkaQoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5OyAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX29udV9zZGlfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfc2RpOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic2ZpIiBncm91cCBvZiB0aGUgImdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfc2ZpX2RhdGEKK3sKKyAgICBiY21vbHRfc3RhdHVzIGFsYXJtX3N0YXR1czsgLyoqPCBhbGFybSBzdGF0dXMuICovCisgICAgdWludDMyX3QgYmVyOyAgICAgICAgICAgICAgIC8qKjwgSW52ZXJzZSBiaXQgZXJyb3IgcmF0ZSAoZS5nLiBpZiB0aGlzIG51bWJlciBpcyAxMDAwLCB0aGUgQkVSIGlzIDEvMTAwMCkuICovCit9IGJjbW9sdF9ncG9uX29udV9zZmlfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzZmkiIGdyb3VwIG9mICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X3NmaQoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5OyAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX29udV9zZmlfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfc2ZpOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdF9hbGFybV9jbGVhcmVkIiBncm91cCBvZiB0aGUgImdwb25fb251IiAKKyAqIG9iamVjdC4gCisgKgorICogU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEKK3sKKyAgICBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9pZCBzdGF0OyAgIC8qKjwgU3RhdGlzdGljIGlkZW50aWZpZXIuICovCit9IGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGF0X2FsYXJtX2NsZWFyZWQiIGdyb3VwIG9mICJncG9uX29udSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleTsgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfYWxhcm1fcmFpc2VkIiBncm91cCBvZiB0aGUgImdwb25fb251IiAKKyAqIG9iamVjdC4gCisgKgorICogU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhCit7CisgICAgYmNtb2x0X2dwb25fb251X3N0YXRfaWQgc3RhdDsgICAvKio8IFN0YXRpc3RpYyBpZGVudGlmaWVyLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGF0X2FsYXJtX3JhaXNlZCIgZ3JvdXAgb2YgImdwb25fb251IiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN1ZmkiIGdyb3VwIG9mIHRoZSAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9zdWZpX2RhdGEKK3sKKyAgICBiY21vbHRfc3RhdHVzIGFsYXJtX3N0YXR1czsgLyoqPCBhbGFybSBzdGF0dXMuICovCit9IGJjbW9sdF9ncG9uX29udV9zdWZpX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3VmaSIgZ3JvdXAgb2YgImdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfc3VmaQoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5OyAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX29udV9zdWZpX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfc3VmaTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInRpd2kiIGdyb3VwIG9mIHRoZSAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV90aXdpX2RhdGEKK3sKKyAgICBiY21vbHRfc3RhdHVzIGFsYXJtX3N0YXR1czsgLyoqPCBBbGFybSBzdGF0dXMuICovCisgICAgaW50MzJfdCBkcmlmdF92YWx1ZTsgICAgICAgIC8qKjwgQ2FsY3VsYXRlZCBhbW91bnQgb2YgZHJpZnQgKHBvc2l0aXZlICsgbmVnYXRpdmUgYXMgYSBzaWduZWQgdmFsdWUpLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfdGl3aV9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInRpd2kiIGdyb3VwIG9mICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X3Rpd2kKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleTsgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfdGl3aV9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2dwb25fb251X3Rpd2k7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJhdXRvX2NmZyIgZ3JvdXAgb2YgdGhlICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEKK3sKKyAgICBiY21vc19ib29sIGJlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZDsgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJiZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgZGZpOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAiZGZpIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIGRnaTsgICAgICAgICAgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImRnaSIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBkb3dpOyAgICAgICAgICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJkb3dpIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIGVycjsgICAgICAgICAgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImVyciIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBpbnZhbGlkX2RicnVfcmVwb3J0OyAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJpbnZhbGlkX2RicnVfcmVwb3J0IiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIGtleV9leGNoYW5nZV9jb21wbGV0ZWQ7ICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImtleV9leGNoYW5nZV9jb21wbGV0ZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wga2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQ7ICAgICAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAia2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wga2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWQ7ICAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAia2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wga2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaDsgICAgICAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAia2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBrZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dDsgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJrZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBrZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleDsgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJrZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBsb2FpOyAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImxvYWkiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgbG9raTsgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJsb2tpIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIG1lbWk7ICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAibWVtaSIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBvbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQ7ICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAib21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIG9udV9hY3RpdmF0aW9uX2NvbXBsZXRlZDsgICAgICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJvbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWQ7ICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgIm9udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIG9udV9hbGFybTsgICAgICAgICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJvbnVfYWxhcm0iIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQ7ICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgIm9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIG9udV9kaXNhYmxlX2NvbXBsZXRlZDsgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJvbnVfZGlzYWJsZV9jb21wbGV0ZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgb251X2VuYWJsZV9jb21wbGV0ZWQ7ICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgIm9udV9lbmFibGVfY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIG9wdGljYWxfcmVmbGVjdGlvbjsgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJvcHRpY2FsX3JlZmxlY3Rpb24iIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkOyAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAicGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHBlZTsgICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJwZWUiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgcG9zc2libGVfZHJpZnQ7ICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInBvc3NpYmxlX2RyaWZ0IiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHBvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlOyAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAicG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgcHN0OyAgICAgICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJwc3QiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgcmFuZ2luZ19jb21wbGV0ZWQ7ICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJyYW5naW5nX2NvbXBsZXRlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCByZWk7ICAgICAgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInJlaSIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCByc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZDsgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAicnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgc2RpOyAgICAgICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzZGkiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgc2ZpOyAgICAgICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzZmkiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgc3RhdF9hbGFybV9jbGVhcmVkOyAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzdGF0X2FsYXJtX2NsZWFyZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgc3RhdF9hbGFybV9yYWlzZWQ7ICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzdGF0X2FsYXJtX3JhaXNlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBzdWZpOyAgICAgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInN1ZmkiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgdGl3aTsgICAgICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJ0aXdpIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KK30gYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiYXV0b19jZmciIGdyb3VwIG9mICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnCit7CisgICAgYmNtb2x0X2F1dG9fY2ZnIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5OyAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNoYW5nZV9wb3dlcl9sZXZlbCIgZ3JvdXAgb2YgdGhlICJncG9uX29udSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2RhdGEKK3sKKyAgICBiY21vbHRfb251X3Bvd2VyX2xldmVsIHBvd2VyX2xldmVsX2FjdGlvbjsgIC8qKjwgcG93ZXIgbGV2ZWwgYWN0aW9uLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiY2hhbmdlX3Bvd2VyX2xldmVsIiBncm91cCBvZiAiZ3Bvbl9vbnUiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbAoreworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWw7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAicnNzaV9tZWFzdXJlbWVudCIgZ3JvdXAgb2YgImdwb25fb251IiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50Cit7CisgICAgYmNtb2x0X29wZXIgaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleTsgICAgLyoqPCBPYmplY3Qga2V5LiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInNldF9vbnVfc3RhdGUiIGdyb3VwIG9mIHRoZSAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGEKK3sKKyAgICBiY21vbHRfb251X29wZXJhdGlvbiBvbnVfc3RhdGU7IC8qKjwgT05VIHN0YXRlLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInNldF9vbnVfc3RhdGUiIGdyb3VwIG9mICJncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGUKK3sKKyAgICBiY21vbHRfb3BlciBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiY3B1X3BhY2tldHMiIGdyb3VwIG9mIHRoZSAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhCit7CisgICAgYmNtb2x0X3BhY2tldF90eXBlIHBhY2tldF90eXBlOyAgICAgLyoqPCBwYWNrZXQgdHlwZS4gKi8KKyAgICBiY21vc19ib29sIGNhbGNfY3JjOyAgICAgICAgICAgICAgICAvKio8IGNhbGMgY3JjLiAqLworICAgIHVpbnQ4X3QgbnVtYmVyX29mX3BhY2tldHM7ICAgICAgICAgIC8qKjwgbnVtYmVyIG9mIHBhY2tldHMuICovCisgICAgdWludDE2X3QgcGFja2V0X3NpemU7ICAgICAgICAgICAgICAgLyoqPCBTaW5nbGUgcGFja2V0IHNpemUuICovCisgICAgYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4IGJ1ZmZlcjsgLyoqPCBidWZmZXIuICovCit9IGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImNwdV9wYWNrZXRzIiBncm91cCBvZiAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0cworeworICAgIGJjbW9sdF9wcm94eSBoZHI7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXk7ICAgICAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHM7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJwbG9hbV9wYWNrZXQiIGdyb3VwIG9mIHRoZSAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YQoreworI2RlZmluZSBCQ01PTFRfR1BPTl9PTlVfUExPQU1fUEFDS0VUX0RBVEFfUExPQU1fTEVOIDEyCisgICAgYmNtb2x0X2Fycl91OF8xMiBwbG9hbTsgLyoqPCBwbG9hbS4gKi8KK30gYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInBsb2FtX3BhY2tldCIgZ3JvdXAgb2YgImdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0Cit7CisgICAgYmNtb2x0X3Byb3h5IGhkcjsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleTsgICAgICAgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJjcHVfcGFja2V0IiBncm91cCBvZiB0aGUgImdwb25fb251IiBvYmplY3QuIAorICoKKyAqIEluZGljYXRlcyBDUFUgcGFja2V0IHdhcyByZWNlaXZlZCBvbiB0aGUgVVMgZnJvbSB0aGlzIE9OVSBpZCAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfZGF0YQoreworICAgIHVpbnQxNl90IHBvcnRfaWQ7ICAgICAgICAgICAvKio8IHBvcnRfaWQuICovCisgICAgYmNtb3NfYm9vbCBjcmNfb2s7ICAgICAgICAgIC8qKjwgY3JjX29rLiAqLworICAgIHVpbnQzMl90IHBhY2tldF9zaXplOyAgICAgICAvKio8IHBhY2tldF9zaXplLiAqLworICAgIGJjbW9sdF91OF9saXN0X3UzMiBidWZmZXI7ICAvKio8IGJ1ZmZlci4gKi8KK30gYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJjcHVfcGFja2V0IiBncm91cCBvZiAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0Cit7CisgICAgYmNtb2x0X3Byb3h5X3J4IGhkcjsgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleTsgICAgICAgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAib21jaV9wYWNrZXQiIGdyb3VwIG9mIHRoZSAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKgorICogSW5kaWNhdGVzIE9NQ0kgcGFja2V0IHdhcyByZWNlaXZlZCBvbiB0aGUgVVMgZnJvbSB0aGlzIE9OVSBpZCAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2RhdGEKK3sKKyAgICB1aW50MTZfdCBwb3J0X2lkOyAgICAgICAgICAgLyoqPCBwb3J0X2lkLiAqLworICAgIGJjbW9zX2Jvb2wgY3JjX29rOyAgICAgICAgICAvKio8IGNyY19vay4gKi8KKyAgICB1aW50MzJfdCBwYWNrZXRfc2l6ZTsgICAgICAgLyoqPCBwYWNrZXRfc2l6ZS4gKi8KKyAgICBiY21vbHRfdThfbGlzdF91MzIgYnVmZmVyOyAgLyoqPCBidWZmZXIuICovCit9IGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgIm9tY2lfcGFja2V0IiBncm91cCBvZiAiZ3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldAoreworICAgIGJjbW9sdF9wcm94eV9yeCBoZHI7ICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXk7ICAgICAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJrZXkiIGdyb3VwIG9mIHRoZSAiZ3Bvbl90cngiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncG9uX3RyeF9rZXkKK3sKKyAgICBiY21vbHRfZ3Bvbl9uaSBwb25fbmk7ICAvKio8IFBPTiBuZXR3b3JrIGludGVyZmFjZS4gKi8KK30gYmNtb2x0X2dwb25fdHJ4X2tleTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNmZyIgZ3JvdXAgb2YgdGhlICJncG9uX3RyeCIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhCit7CisgICAgYmNtb2x0X3RyeF90eXBlIHRyYW5zY2VpdmVyX3R5cGU7ICAgLyoqPCB0cmFuc2NlaXZlciB0eXBlLiAqLworICAgIGJjbW9sdF9sYV9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uIGxhX2NvbmZpZ3VyYXRpb247ICAgIC8qKjwgTEEgY29uZmlndXJhdGlvbi4gKi8KKyAgICBiY21vbHRfYmNkcl9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uIGJjZHI7ICAgICAgICAgICAgICAvKio8IEJDRFIuICovCisgICAgYmNtb2x0X3Jlc3luY19jb250cm9sIGxhX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jOyAgICAgICAgLyoqPCBMQSByYW5naW5nIGFmdGVyIG5vIGVkIHJlc3luYyAuICovCisgICAgYmNtb2x0X3Jlc3luY19jb250cm9sIGJjZHJfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmM7ICAgICAgLyoqPCB1c2VkIGluIHJhbmdpbmcgbW9kZSBhZnRlciBubyBlZCBmb3VuZCAqLworICAgIGJjbW9sdF9yZXN5bmNfY29udHJvbCBsYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYzsgICAgICAgICAgIC8qKjwgTEEgcmFuZ2luZyBhZnRlciBlZCByZXN5bmMgLiAqLworICAgIGJjbW9sdF9yZXN5bmNfY29udHJvbCBiY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jOyAgICAgICAgIC8qKjwgQkNEUiByYW5naW5nIGFmdGVyIGVkIHJlc3luYy4gKi8KKyAgICBiY21vbHRfcG9sYXJpdHkgbGFfcmVzeW5jX3BvbGFyaXR5OyAgICAgLyoqPCBsYSByZXN5bmMgcG9sYXJpdHkuICovCisgICAgYmNtb2x0X3BvbGFyaXR5IGJjZHJfcmVzeW5jX3BvbGFyaXR5OyAgIC8qKjwgQkNEUiByZXN5bmMgcG9sYXJpdHkuICovCisgICAgYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMgYmNkcl9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zOyAgICAgICAgICAgIC8qKjwgYmNkciByYW5naW5nIHJlc3luYyBjb25kaXRpb25zLiAqLworICAgIGJjbW9sdF9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zIGxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnM7ICAgICAgICAgICAgICAvKio8IGxhIHJhbmdpbmcgcmVzeW5jIGNvbmRpdGlvbnMuICovCisgICAgYmNtb2x0X3RyeF9yeF9jb25maWd1cmF0aW9uIHJ4X2NvbmZpZ3VyYXRpb247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUlggY29uZmlndXJhdGlvbi4gKi8KKyAgICBiY21vbHRfcmFuZ2luZ19jb250cm9sX2NvbmZpZ3VyYXRpb24gcmFuZ2luZ19jb250cm9sX3N0YWdlc19jb25maWd1cmF0aW9uOyAgLyoqPCByYW5naW5nIGNvbnRyb2wgc3RhZ2VzIGNvbmZpZ3VyYXRpb24uICovCisgICAgYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0IGVuZXJneV9kZXRlY3Q7ICAgICAgICAgICAgIC8qKjwgRW5lcmd5IERldGVjdC4gKi8KKyAgICBiY21vbHRfcmVzeW5jX2NvbnRyb2wgZW5kX29mX2J1cnN0X2RhdGFfcGF0dGVybjsgICAgLyoqPCBlbmQgb2YgYnVyc3QgZGF0YSBwYXR0ZXJuIC4gKi8KKyAgICBiY21vbHRfcmVzeW5jX2NvbnRyb2wgZW5kX29mX2J1cnN0X3JhbmdpbmdfcGF0dGVybjsgLyoqPCBlbmQgb2YgYnVyc3QgcmFuZ2luZyBwYXR0ZXJuLiAqLworICAgIGJjbW9sdF90cnhfcHJlYW1ibGUgcHJlYW1ibGU7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFByZWFtYmxlLiAqLworICAgIGJjbW9sdF90cnhfZGVsaW1pdGVyIGRlbGltaXRlcjsgICAgICAgICAgICAgICAgICAgICAvKio8IERlbGltaXRlci4gKi8KKyAgICB1aW50MzJfdCBndWFyZF9iaXRzOyAgICAvKio8IEd1YXJkIGJpdHMuICovCisgICAgYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uIHNlcmRlc19jb25maWd1cmF0aW9uOyAgIC8qKjwgc2VyZGVzIGNvbmZpZ3VyYXRpb24uICovCisgICAgdWludDMyX3QgcGxvX3Jhbmdpbmc7ICAgLyoqPCBQTE8gZm9yIHJhbmdpbmcuICovCisgICAgdWludDMyX3QgcGxvX2RhdGE7ICAgICAgLyoqPCBQTE8gZm9yIGRhdGEuICovCisgICAgYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb24gcnNzaV9ub3JtYWxfY29uZmlnOyAgLyoqPCByc3NpIG5vcm1hbCBjb25maWcuICovCisgICAgYmNtb2x0X3JhbmdpbmdfcnNzaV9jb250cm9sIHJhbmdpbmdfcnNzaV9yZXN5bmNfY29udHJvbDsgICAgLyoqPCByYW5naW5nIHJzc2kgcmVzeW5jIGNvbnRyb2wuICovCit9IGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJjZmciIGdyb3VwIG9mICJncG9uX3RyeCIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dwb25fdHJ4X2NmZworeworICAgIGJjbW9sdF9jZmcgaGRyOyAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ncG9uX3RyeF9rZXkga2V5OyAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfZ3Bvbl90cnhfY2ZnOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAia2V5IiBncm91cCBvZiB0aGUgImxvZ19lbnRyeSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2xvZ19lbnRyeV9rZXkKK3sKKyAgICB1aW50MzJfdCBsb2dfaWQ7ICAgICAgICAvKio8IGxvZyBpZC4gKi8KKyAgICB1aW50OF90IHJlc2VydmVkOyAgICAgICAvKio8IHJlc2VydmVkLiAqLworICAgIGJjbW9sdF9zdHJfMTAwIG5hbWU7ICAgIC8qKjwgbmFtZS4gKi8KK30gYmNtb2x0X2xvZ19lbnRyeV9rZXk7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJjZmciIGdyb3VwIG9mIHRoZSAibG9nX2VudHJ5IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbG9nX2VudHJ5X2NmZ19kYXRhCit7CisgICAgYmNtb2x0X2xvZ19sZXZlbCBkZWZhdWx0X2xvZ19sZXZlbDsgLyoqPCBkZWZhdWx0IGxvZyBsZXZlbC4gKi8KKyAgICBiY21vbHRfbG9nX3R5cGUgZGVmYXVsdF9sb2dfdHlwZTsgICAvKio8IGRlZmF1bHQgbG9nIHR5cGUuICovCisgICAgYmNtb2x0X2xvZ19sZXZlbCBsb2dfbGV2ZWxfcHJpbnQ7ICAgLyoqPCBsb2cgbGV2ZWwgcHJpbnQuICovCisgICAgYmNtb2x0X2xvZ19sZXZlbCBsb2dfbGV2ZWxfc2F2ZTsgICAgLyoqPCBsb2cgbGV2ZWwgc2F2ZS4gKi8KKyAgICBiY21vbHRfbG9nX3R5cGUgbG9nX3R5cGU7ICAgICAgICAgICAvKio8IGxvZyB0eXBlLiAqLworICAgIGJjbW9sdF9sb2dfc3R5bGUgbG9nX3N0eWxlOyAgICAgICAgIC8qKjwgbG9nX3N0eWxlLiAqLworICAgIGJjbW9sdF9zdHJfMTAwIGxvZ19uYW1lOyAgICAgICAgICAgIC8qKjwgbG9nIG5hbWUuICovCit9IGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiY2ZnIiBncm91cCBvZiAibG9nX2VudHJ5IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbG9nX2VudHJ5X2NmZworeworICAgIGJjbW9sdF9jZmcgaGRyOyAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9sb2dfZW50cnlfa2V5IGtleTsgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfbG9nX2VudHJ5X2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXQiIGdyb3VwIG9mIHRoZSAibG9nX2VudHJ5IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfZGF0YQoreworI2RlZmluZSBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfREFUQV9NU0dfQ09VTlRfTEVOICAgIDYKKyAgICBiY21vbHRfYXJyX3UzMl82IG1zZ19jb3VudDsgLyoqPCBtc2cgY291bnQuICovCisgICAgdWludDMyX3QgbG9zdF9tc2dfY291bnQ7ICAgIC8qKjwgbG9zdCBtc2cgY291bnQuICovCit9IGJjbW9sdF9sb2dfZW50cnlfc3RhdF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXQiIGdyb3VwIG9mICJsb2dfZW50cnkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9sb2dfZW50cnlfc3RhdAoreworICAgIGJjbW9sdF9zdGF0IGhkcjsgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfbG9nX2VudHJ5X2tleSBrZXk7ICAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfbG9nX2VudHJ5X3N0YXQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2NmZyIgZ3JvdXAgb2YgdGhlICJsb2dfZW50cnkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfZGF0YQoreworICAgIGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyBjZmc7ICAgLyoqPCBTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4gKi8KK30gYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXRfY2ZnIiBncm91cCBvZiAibG9nX2VudHJ5IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnCit7CisgICAgYmNtb2x0X3N0YXRfY2ZnIGhkcjsgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfbG9nX2VudHJ5X2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2FsYXJtX2NsZWFyZWQiIGdyb3VwIG9mIHRoZSAibG9nX2VudHJ5IiAKKyAqIG9iamVjdC4gCisgKgorICogU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhCit7CisgICAgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2lkIHN0YXQ7ICAvKio8IFN0YXRpc3RpYyBpZGVudGlmaWVyLiAqLworfSBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXRfYWxhcm1fY2xlYXJlZCIgZ3JvdXAgb2YgImxvZ19lbnRyeSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2xvZ19lbnRyeV9rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdF9hbGFybV9yYWlzZWQiIGdyb3VwIG9mIHRoZSAibG9nX2VudHJ5IiAKKyAqIG9iamVjdC4gCisgKgorICogU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YQoreworICAgIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9pZCBzdGF0OyAgLyoqPCBTdGF0aXN0aWMgaWRlbnRpZmllci4gKi8KK30gYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXRfYWxhcm1fcmFpc2VkIiBncm91cCBvZiAibG9nX2VudHJ5IiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9sb2dfZW50cnlfa2V5IGtleTsgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiYXV0b19jZmciIGdyb3VwIG9mIHRoZSAibG9nX2VudHJ5IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2RhdGEKK3sKKyAgICBiY21vc19ib29sIHN0YXRfYWxhcm1fY2xlYXJlZDsgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAic3RhdF9hbGFybV9jbGVhcmVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHN0YXRfYWxhcm1fcmFpc2VkOyAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAic3RhdF9hbGFybV9yYWlzZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworfSBiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiYXV0b19jZmciIGdyb3VwIG9mICJsb2dfZW50cnkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmcKK3sKKyAgICBiY21vbHRfYXV0b19jZmcgaGRyOyAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9sb2dfZW50cnlfa2V5IGtleTsgICAgICAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19kYXRhIGRhdGE7ICAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleSIgZ3JvdXAgb2YgdGhlICJsb2dnZXIiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9sb2dnZXJfa2V5Cit7CisgICAgdWludDMyX3QgcmVzZXJ2ZWQ7ICAgICAgICAgIC8qKjwgcmVzZXJ2ZWQuICovCisgICAgYmNtb2x0X2xvZ19maWxlX2lkIGZpbGVfaWQ7IC8qKjwgc2hvdWxkIGJlIDAgKi8KK30gYmNtb2x0X2xvZ2dlcl9rZXk7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJjZmciIGdyb3VwIG9mIHRoZSAibG9nZ2VyIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbG9nZ2VyX2NmZ19kYXRhCit7CisgICAgYmNtb2x0X2xvZ19idWZmZXIgYnVmZmVyOyAgICAgICAvKio8IENvbnRhaW5zICJuZXh0IiBsb2cgcmVjb3JkcyByZWFkIGJ5ICJiY21vbHRfY2ZnX2dldCgpIEFQSSAqLworICAgIGJjbW9zX2Jvb2wgd3JhcF9hcm91bmQ7ICAgICAgICAgLyoqPCBMb2cgZmlsZSB3cmFwLWFyb3VuZCBvcHRpb24uIFRSVUU9d3JhcCBhcm91bmQgd2hlbiBmdWxsLiBGQUxTRT1zdG9wIHdoZW4gZnVsbCAqLworICAgIGJjbW9zX2Jvb2wgY2xlYXJfYWZ0ZXJfcmVhZDsgICAgLyoqPCBDbGVhciBsb2cgYWZ0ZXIgbGFzdCByZWNvcmQgaGFzIGJlZW4gcmVhZCAqLworICAgIGJjbW9zX2Jvb2wgZW5hYmxlX2xvZzsgICAgICAgICAgLyoqPCBFbmFibGUgbG9nZ2VyICovCisgICAgYmNtb2x0X3N0cl8xMDAwIGxvZ19uYW1lczsgICAgICAvKio8IGxvZ19uYW1lcy4gKi8KK30gYmNtb2x0X2xvZ2dlcl9jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJjZmciIGdyb3VwIG9mICJsb2dnZXIiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9sb2dnZXJfY2ZnCit7CisgICAgYmNtb2x0X2NmZyBoZHI7ICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X2xvZ2dlcl9rZXkga2V5OyAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X2xvZ2dlcl9jZmdfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9sb2dnZXJfY2ZnOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdCIgZ3JvdXAgb2YgdGhlICJsb2dnZXIiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9sb2dnZXJfc3RhdF9kYXRhCit7CisgICAgdWludDMyX3QgbGluZXNfaW5fbG9nOyAgLyoqPCBsaW5lcyBpbiBsb2cuICovCit9IGJjbW9sdF9sb2dnZXJfc3RhdF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXQiIGdyb3VwIG9mICJsb2dnZXIiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9sb2dnZXJfc3RhdAoreworICAgIGJjbW9sdF9zdGF0IGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9sb2dnZXJfa2V5IGtleTsgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9sb2dnZXJfc3RhdF9kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfbG9nZ2VyX3N0YXQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2NmZyIgZ3JvdXAgb2YgdGhlICJsb2dnZXIiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9sb2dnZXJfc3RhdF9jZmdfZGF0YQoreworICAgIGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyBjZmc7ICAgLyoqPCBTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4gKi8KK30gYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXRfY2ZnIiBncm91cCBvZiAibG9nZ2VyIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnCit7CisgICAgYmNtb2x0X3N0YXRfY2ZnIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9sb2dnZXJfa2V5IGtleTsgICAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9sb2dnZXJfc3RhdF9jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2FsYXJtX2NsZWFyZWQiIGdyb3VwIG9mIHRoZSAibG9nZ2VyIiAKKyAqIG9iamVjdC4gCisgKgorICogU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhCit7CisgICAgYmNtb2x0X2xvZ2dlcl9zdGF0X2lkIHN0YXQ7IC8qKjwgU3RhdGlzdGljIGlkZW50aWZpZXIuICovCit9IGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9hbGFybV9jbGVhcmVkIiBncm91cCBvZiAibG9nZ2VyIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9sb2dnZXJfa2V5IGtleTsgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2FsYXJtX3JhaXNlZCIgZ3JvdXAgb2YgdGhlICJsb2dnZXIiIAorICogb2JqZWN0LiAKKyAqCisgKiBTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhCit7CisgICAgYmNtb2x0X2xvZ2dlcl9zdGF0X2lkIHN0YXQ7IC8qKjwgU3RhdGlzdGljIGlkZW50aWZpZXIuICovCit9IGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGF0X2FsYXJtX3JhaXNlZCIgZ3JvdXAgb2YgImxvZ2dlciIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9sb2dnZXJfa2V5IGtleTsgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImF1dG9fY2ZnIiBncm91cCBvZiB0aGUgImxvZ2dlciIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19kYXRhCit7CisgICAgYmNtb3NfYm9vbCBzdGF0X2FsYXJtX2NsZWFyZWQ7ICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInN0YXRfYWxhcm1fY2xlYXJlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBzdGF0X2FsYXJtX3JhaXNlZDsgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInN0YXRfYWxhcm1fcmFpc2VkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KK30gYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImF1dG9fY2ZnIiBncm91cCBvZiAibG9nZ2VyIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnCit7CisgICAgYmNtb2x0X2F1dG9fY2ZnIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9sb2dnZXJfa2V5IGtleTsgICAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9sb2dnZXJfYXV0b19jZmc7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiY2xlYXJfbG9nIiBncm91cCBvZiAibG9nZ2VyIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbG9nZ2VyX2NsZWFyX2xvZworeworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfbG9nZ2VyX2tleSBrZXk7ICAvKio8IE9iamVjdCBrZXkuICovCit9IGJjbW9sdF9sb2dnZXJfY2xlYXJfbG9nOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAia2V5IiBncm91cCBvZiB0aGUgIm5uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X25uaV9rZXkKK3sKKyAgICBiY21vbHRfcG9uX25pIHBvbl9uaTsgICAvKio8IFBPTiBOSS4gKi8KK30gYmNtb2x0X25uaV9rZXk7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJjZmciIGdyb3VwIG9mIHRoZSAibm5pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbm5pX2NmZ19kYXRhCit7CisgICAgYmNtb2x0X2NvbnRyb2xfc3RhdGUgcmVtb3RlX2xvb3BiYWNrOyAgIC8qKjwgSW5jb21pbmcgcGFja2V0cyBjb21pbmcgZnJvbSB0aGUgUE9OICh1cHN0cmVhbSkgYW5kIGdvaW5nIGJhY2sgdG8gdGhlIFBPTiAoRG93bnN0cmVhbSkgICovCisgICAgYmNtb2x0X2NvbnRyb2xfc3RhdGUgbGluZV9sb29wYmFjazsgICAgIC8qKjwgSW5jb21pbmcgcGFja2V0cyBjb21pbmcgZnJvbSB0aGUgTk5JIGludGVyZmFjZSB0byB0aGUgUE0gYW5kIGdvaW5nIGJhY2sgdG93YXJkcyB0aGUgTk5JIGludGVyZmFjZSAqLworICAgIGJjbW9zX21hY19hZGRyZXNzIG1hY19hZGRyZXNzOyAgICAgICAgICAvKio8IE1hYyBhZGRyZXNzIHRvIGJlIHVzZWQgZm9yIHRoaXMgTk5JLiAqLworICAgIGJjbW9sdF9ubmlfbGlua19zdGF0dXMgbm5pX3N0YXR1czsgICAgICAvKio8IE5OSSBzdGF0dXMgKi8KKyAgICBiY21vbHRfbm5pX2xpbmtfc3RhdHVzIG5uaV9iYWNrdXBfc3RhdHVzOyAgIC8qKjwgU3RhdHVzIG9mIHRoZSBiYWNrdXAgTk5JLiAqLworICAgIGJjbW9sdF9ubmlfY29ubmVjdGlvbiBhY3RpdmVfbm5pOyAgICAgICAgICAgLyoqPCBXaGljaCBOTkkgaXMgY3VycmVudGx5IGFjdGl2ZS4gKi8KKyAgICB1aW50MzJfdCBubmlfc3RhdHVzX3BvbGxpbmdfaW50ZXJ2YWxfbXM7ICAgIC8qKjwgSG93IG9mdGVuIHRvIGNoZWNrIHRoZSBzdGF0dXMgb2YgdGhlIHByaW1hcnkgYW5kIGJhY2t1cCBOTklzICh1bml0czogbXMpLiBaZXJvICgwKSBkaXNhYmxlcyBzdGF0dXMgcG9sbGluZy4gKi8KKyAgICBiY21vc19ib29sIGF1dG9zd2l0Y2g7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgU2hvdWxkIGZpcm13YXJlIGF1dG9tYXRpY2FsbHkgc3dpdGNoIGJldHdlZW4gcHJpbWFyeS9iYWNrdXAgTk5JcyB3aGVuIExvc3Mgb2YgTGluayBpcyBkZXRlY3RlZD8gKi8KKyAgICBiY21vbHRfY29udHJvbF9zdGF0ZSBmbG93X2NvbnRyb2w7ICAgICAgICAgIC8qKjwgTk5JIEZsb3cgY29udHJvbC4gKi8KK30gYmNtb2x0X25uaV9jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJjZmciIGdyb3VwIG9mICJubmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ubmlfY2ZnCit7CisgICAgYmNtb2x0X2NmZyBoZHI7ICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfbm5pX2tleSBrZXk7ICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ubmlfY2ZnX2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ubmlfY2ZnOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdCIgZ3JvdXAgb2YgdGhlICJubmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ubmlfc3RhdF9kYXRhCit7CisgICAgdWludDY0X3QgcnhfZnJhbWVzXzY0OyAgICAgICAgICAgICAgLyoqPCBUaGUgY291bnQgb2YgUlggNjQgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuICovCisgICAgdWludDY0X3QgcnhfZnJhbWVzXzY1XzEyNzsgICAgICAgICAgLyoqPCBUaGUgY291bnQgb2YgUlggNjUgdG8gMTI3IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiAqLworICAgIHVpbnQ2NF90IHJ4X2ZyYW1lc18xMjhfMjU1OyAgICAgICAgIC8qKjwgVGhlIGNvdW50IG9mIFJYIDEyOCB0byAyNTUgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuICovCisgICAgdWludDY0X3QgcnhfZnJhbWVzXzI1Nl81MTE7ICAgICAgICAgLyoqPCBUaGUgY291bnQgb2YgUlggMjU2IHRvIDUxMSBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4gKi8KKyAgICB1aW50NjRfdCByeF9mcmFtZXNfNTEyXzEwMjM7ICAgICAgICAvKio8IFRoZSBjb3VudCBvZiBSWCA1MTIgdG8gMTAyMyBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4gKi8KKyAgICB1aW50NjRfdCByeF9mcmFtZXNfMTAyNF8xNTE4OyAgICAgICAvKio8IFRoZSBjb3VudCBvZiBSWCAxMDI0IHRvIDE1MTggYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuICovCisgICAgdWludDY0X3QgcnhfZnJhbWVzXzE1MTlfMjA0NzsgICAgICAgLyoqPCBUaGUgY291bnQgb2YgUlggMTUxOSB0byAyMDQ3IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiAqLworICAgIHVpbnQ2NF90IHJ4X2ZyYW1lc18yMDQ4XzQwOTU7ICAgICAgIC8qKjwgVGhlIGNvdW50IG9mIFJYIDIwNDggdG8gNDA5NSBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4gKi8KKyAgICB1aW50NjRfdCByeF9mcmFtZXNfNDA5Nl85MjE2OyAgICAgICAvKio8IFRoZSBjb3VudCBvZiBSWCA0MDk2IHRvIDkyMTYgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuICovCisgICAgdWludDY0X3QgcnhfZnJhbWVzXzkyMTdfMTYzODM7ICAgICAgLyoqPCBUaGUgY291bnQgb2YgUlggOTIxNyB0byAxNjM4MyBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4gKi8KKyAgICB1aW50NjRfdCByeF9mcmFtZXM7ICAgICAgICAgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgZnJhbWVzIG9uIHRoaXMgTk5JLiBUaGlzIGluY2x1ZGVzIGFsbCBlcnJvcmVkIGZyYW1lcyBhcyB3ZWxsLiAqLworICAgIHVpbnQ2NF90IHJ4X2J5dGVzOyAgICAgICAgICAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiByZWNlaXZlZCBieXRlcyBvbiB0aGlzIE5OSS4gVGhpcyBpbmNsdWRlcyBhbGwgZXJyb3JlZCBmcmFtZXMgYXMgd2VsbC4gKi8KKyAgICB1aW50NjRfdCByeF9nb29kX2ZyYW1lczsgICAgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgZ29vZCBmcmFtZXMgb24gdGhpcyBOTkkuICovCisgICAgdWludDY0X3QgcnhfdW5pY2FzdF9mcmFtZXM7ICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIHVuaWNhc3QgZnJhbWVzIG9uIHRoaXMgTk5JLiAqLworICAgIHVpbnQ2NF90IHJ4X211bHRpY2FzdF9mcmFtZXM7ICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiByZWNlaXZlZCBtdWx0aWNhc3QgZnJhbWVzIG9uIHRoaXMgTk5JLiAqLworICAgIHVpbnQ2NF90IHJ4X2Jyb2FkY2FzdF9mcmFtZXM7ICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiByZWNlaXZlZCBicm9hZGNhc3QgZnJhbWVzIG9uIHRoaXMgTk5JLiAqLworICAgIHVpbnQ2NF90IHJ4X2Zjc19lcnJvcnM7ICAgICAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiByZWNlaXZlZCBGQ1MgZXJyb3JzIG9uIHRoaXMgTk5JLiAqLworICAgIHVpbnQ2NF90IHJ4X2NvbnRyb2xfZnJhbWVzOyAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiByZWNlaXZlZCBjb250cm9sIGZyYW1lcyBvbiB0aGlzIE5OSS4gKi8KKyAgICB1aW50NjRfdCByeF9wYXVzZV9mcmFtZXM7ICAgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgcGF1c2UgZnJhbWVzIG9uIHRoaXMgTk5JLiAqLworICAgIHVpbnQ2NF90IHJ4X3BmY19mcmFtZXM7ICAgICAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiByZWNlaXZlZCBQRkMgZnJhbWVzIG9uIHRoaXMgTk5JLiAqLworICAgIHVpbnQ2NF90IHJ4X3Vuc3VwcG9ydGVkX29wY29kZTsgICAgIC8qKjwgVGhlIG51bWJlciBvZiByZWNlaXZlZCBVbnN1cHBvcnRlZCBPcGNvZGUgZnJhbWVzIG9uIHRoaXMgTk5JLiAqLworICAgIHVpbnQ2NF90IHJ4X3Vuc3VwcG9ydGVkX2RhOyAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiByZWNlaXZlZCB1bnN1cHBvcnRlZCBEQSBmcmFtZXMgb24gdGhpcyBOTkkuICovCisgICAgdWludDY0X3QgcnhfYWxpZ25tZW50X2Vycm9yczsgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIGFsaWdubWVudCBlcnJvcnMgb24gdGhpcyBOTkkuICovCisgICAgdWludDY0X3QgcnhfbGVuZ3RoX291dF9vZl9yYW5nZTsgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIGxlbmd0aCBvdXQgb2YgcmFuZ2UgZXJyb3JzIG9uIHRoaXMgTk5JLiAqLworICAgIHVpbnQ2NF90IHJ4X2NvZGVfZXJyb3JzOyAgICAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiByZWNlaXZlZCBjb2RlIGVycm9ycyBvbiB0aGlzIE5OSS4gKi8KKyAgICB1aW50NjRfdCByeF9vdmVyc2l6ZWRfZnJhbWVzOyAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgb3ZlcnNpemVkIGZyYW1lcyBvbiB0aGlzIE5OSS4gKi8KKyAgICB1aW50NjRfdCByeF9qYWJiZXJfZnJhbWVzOyAgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgamFiYmVyIGZyYW1lcyBvbiB0aGlzIE5OSS4gdGhlc2UgYXJlIG92ZXJzaXplZCBmcmFtZXMgdGhhdCBhbHNvIGNvbnRhaW4gYW4gaW52YWxpZCBDUkMsIGNvZGUgZXJyb3IsIG9yIElFRUUgbGVuZ3RoIGNoZWNrIGVycm9yLiAqLworICAgIHVpbnQ2NF90IHJ4X210dV9jaGVja19lcnJvcnM7ICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiByZWNlaXZlZCBNVFUgQ2hlY2sgRXJyb3JzIG9uIHRoaXMgTk5JLiAqLworICAgIHVpbnQ2NF90IHJ4X3Byb21pc2N1b3VzX2ZyYW1lczsgICAgIC8qKjwgVGhlIG51bWJlciBvZiByZWNlaXZlZCBmcmFtZXMgb24gdGhpcyBOTkkgdGhhdCBhcmUgbm90IGNvbnRyb2wgcGFja2V0cyBhbmQgaGF2ZSBhIERBIHRoYXQgaXMgbm90IG1hdGNoaW5nIHdpdGggdGhlIFJYIFNBLiAqLworICAgIHVpbnQ2NF90IHJ4X3ZsYW5fZnJhbWVzOyAgICAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiByZWNlaXZlZCBWTEFOIHRhZ2dlZCBmcmFtZXMgb24gdGhpcyBOTkkgKHdpdGggVFBJRCA4MTAwKS4gVGhpcyBjb3VudHMgYm90aCBzaW5nbGUgYW5kIGRvdWJsZSB0YWdnZWQgZnJhbWVzLiAqLworICAgIHVpbnQ2NF90IHJ4X2RvdWJsZV92bGFuX2ZyYW1lczsgICAgIC8qKjwgVGhlIG51bWJlciBvZiByZWNlaXZlZCBkb3VibGUgVkxBTiB0YWdnZWQgZnJhbWVzIG9uIHRoaXMgTk5JICh3aXRoIFRQSUQgODEwMCkuICAqLworICAgIHVpbnQ2NF90IHJ4X3RydW5jYXRlZF9mcmFtZXM7ICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiByZWNlaXZlZCB0cnVuY2F0ZWQgZnJhbWVzIG9uIHRoaXMgTk5JLiBUaGlzIGlzIGxpa2VseSBkdWUgdG8gUlggRklGTyBGdWxsLiAgKi8KKyAgICB1aW50NjRfdCByeF91bmRlcnNpemVfZnJhbWVzOyAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgdW5kZXJzaXplZCBmcmFtZXMgb24gdGhpcyBOTkkuICovCisgICAgdWludDY0X3QgcnhfZnJhZ21lbnRlZF9mcmFtZXM7ICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIGZyYWdtZW50ZWQgZnJhbWVzIG9uIHRoaXMgTk5JLiAqLworICAgIHVpbnQ2NF90IHJ4X3J1bnRfZnJhbWVzOyAgICAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiByZWNlaXZlZCBydW50IGZyYW1lcyBvbiB0aGlzIE5OSS4gKi8KKyAgICB1aW50NjRfdCB0eF9mcmFtZXNfNjQ7ICAgICAgICAgICAgICAvKio8IFRoZSBjb3VudCBvZiBUWCA2NCBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4gKi8KKyAgICB1aW50NjRfdCB0eF9mcmFtZXNfNjVfMTI3OyAgICAgICAgICAvKio8IFRoZSBjb3VudCBvZiBUWCA2NSB0byAxMjcgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuICovCisgICAgdWludDY0X3QgdHhfZnJhbWVzXzEyOF8yNTU7ICAgICAgICAgLyoqPCBUaGUgY291bnQgb2YgVFggMTI4IHRvIDI1NSBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4gKi8KKyAgICB1aW50NjRfdCB0eF9mcmFtZXNfMjU2XzUxMTsgICAgICAgICAvKio8IFRoZSBjb3VudCBvZiBUWCAyNTYgdG8gNTExIGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiAqLworICAgIHVpbnQ2NF90IHR4X2ZyYW1lc181MTJfMTAyMzsgICAgICAgIC8qKjwgVGhlIGNvdW50IG9mIFRYIDUxMiB0byAxMDIzIGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiAqLworICAgIHVpbnQ2NF90IHR4X2ZyYW1lc18xMDI0XzE1MTg7ICAgICAgIC8qKjwgVGhlIGNvdW50IG9mIFRYIDEwMjQgdG8gMTUxOCBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4gKi8KKyAgICB1aW50NjRfdCB0eF9mcmFtZXNfMTUxOV8yMDQ3OyAgICAgICAvKio8IFRoZSBjb3VudCBvZiBUWCAxNTE5IHRvIDIwNDcgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuICovCisgICAgdWludDY0X3QgdHhfZnJhbWVzXzIwNDhfNDA5NTsgICAgICAgLyoqPCBUaGUgY291bnQgb2YgVFggMjA0OCB0byA0MDk1IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiAqLworICAgIHVpbnQ2NF90IHR4X2ZyYW1lc180MDk2XzkyMTY7ICAgICAgIC8qKjwgVGhlIGNvdW50IG9mIFRYIDQwOTYgdG8gOTIxNiBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4gKi8KKyAgICB1aW50NjRfdCB0eF9mcmFtZXNfOTIxN18xNjM4MzsgICAgICAvKio8IFRoZSBjb3VudCBvZiBUWCA5MjE3IHRvIDE2MzgzIGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiAqLworICAgIHVpbnQ2NF90IHR4X2ZyYW1lczsgICAgICAgICAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBmcmFtZXMgb24gdGhpcyBOTkkuIFRoaXMgaW5jbHVkZXMgYWxsIGVycm9yZWQgZnJhbWVzIGFzIHdlbGwuICovCisgICAgdWludDY0X3QgdHhfYnl0ZXM7ICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIGJ5dGVzIG9uIHRoaXMgTk5JLiBUaGlzIGluY2x1ZGVzIGFsbCBlcnJvcmVkIGZyYW1lcyBhcyB3ZWxsLiAqLworICAgIHVpbnQ2NF90IHR4X2dvb2RfZnJhbWVzOyAgICAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBnb29kIGZyYW1lcyBvbiB0aGlzIE5OSS4gKi8KKyAgICB1aW50NjRfdCB0eF91bmljYXN0X2ZyYW1lczsgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgdW5pY2FzdCBmcmFtZXMgb24gdGhpcyBOTkkuICovCisgICAgdWludDY0X3QgdHhfbXVsdGljYXN0X2ZyYW1lczsgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIG11bHRpY2FzdCBmcmFtZXMgb24gdGhpcyBOTkkuICovCisgICAgdWludDY0X3QgdHhfYnJvYWRjYXN0X2ZyYW1lczsgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIGJyb2FkY2FzdCBmcmFtZXMgb24gdGhpcyBOTkkuICovCisgICAgdWludDY0X3QgdHhfcGF1c2VfZnJhbWVzOyAgICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIHBhdXNlIGZyYW1lcyBvbiB0aGlzIE5OSS4gKi8KKyAgICB1aW50NjRfdCB0eF9wZmNfZnJhbWVzOyAgICAgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgUEZDIGZyYW1lcyBvbiB0aGlzIE5OSS4gKi8KKyAgICB1aW50NjRfdCB0eF9qYWJiZXJfZnJhbWVzOyAgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgamFiYmVyIGZyYW1lcyBvbiB0aGlzIE5OSS4gVGhlc2UgYXJlIG92ZXJzaXplZCBmcmFtZXMgdGhhdCBhbHNvIGNvbnRhaW4gYW4gaW52YWxpZCBGQ1MuICovCisgICAgdWludDY0X3QgdHhfZmNzX2Vycm9yczsgICAgICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIEZDUyBlcnJvcnMgb24gdGhpcyBOTkkuICAqLworICAgIHVpbnQ2NF90IHR4X2NvbnRyb2xfZnJhbWVzOyAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBjb250cm9sIGZyYW1lcyBvbiB0aGlzIE5OSS4gICovCisgICAgdWludDY0X3QgdHhfb3ZlcnNpemVfZnJhbWVzOyAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIG92ZXJzaXplZCBmcmFtZXMgb24gdGhpcyBOTkkuICAqLworICAgIHVpbnQ2NF90IHR4X2ZyYWdtZW50ZWRfZnJhbWVzOyAgICAgIC8qKjwgVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBmcmFnbWVudGVkIGZyYW1lcyBvbiB0aGlzIE5OSS4gICovCisgICAgdWludDY0X3QgdHhfZXJyb3JfZnJhbWVzOyAgICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIGVycm9yZWQgZnJhbWVzIG9uIHRoaXMgTk5JLiAgKi8KKyAgICB1aW50NjRfdCB0eF92bGFuX2ZyYW1lczsgICAgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgVkxBTiB0YWdnZWQgZnJhbWVzIG9uIHRoaXMgTk5JICh3aXRoIFRQSUQgODEwMCkuIFRoaXMgY291bnRzIGJvdGggc2luZ2xlIGFuZCBkb3VibGUgdGFnZ2VkIGZyYW1lcy4gKi8KKyAgICB1aW50NjRfdCB0eF9kb3VibGVfdmxhbl9mcmFtZXM7ICAgICAvKio8IFRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgZG91YmxlIFZMQU4gdGFnZ2VkIGZyYW1lcyBvbiB0aGlzIE5OSSAod2l0aCBUUElEIDgxMDApLiAgKi8KKyAgICB1aW50NjRfdCB0eF9ydW50X2ZyYW1lczsgICAgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgcnVudCBmcmFtZXMgb24gdGhpcyBOTkkuICAqLworICAgIHVpbnQ2NF90IHR4X3VuZGVycnVuX2ZyYW1lczsgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCB1bmRlcnJ1biBmcmFtZXMgb24gdGhpcyBOTkkuIFRodXMgaGFwcGVucyB3aGVuIGEgZnJhbWUgZW5jb3VudGVycyBhIE1BQyB1bmRlcnJ1biAoVHggU3luYyBGSUZPIHJ1bnMgb3V0IG9mIGRhdGEgYmVmb3JlIHRoZSBlbmQgb2YgcGFja2V0KS4gKi8KK30gYmNtb2x0X25uaV9zdGF0X2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdCIgZ3JvdXAgb2YgIm5uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X25uaV9zdGF0Cit7CisgICAgYmNtb2x0X3N0YXQgaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfbm5pX2tleSBrZXk7ICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ubmlfc3RhdF9kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ubmlfc3RhdDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfY2ZnIiBncm91cCBvZiB0aGUgIm5uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X25uaV9zdGF0X2NmZ19kYXRhCit7CisgICAgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIGNmZzsgICAvKio8IFN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiAqLworfSBiY21vbHRfbm5pX3N0YXRfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9jZmciIGdyb3VwIG9mICJubmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ubmlfc3RhdF9jZmcKK3sKKyAgICBiY21vbHRfc3RhdF9jZmcgaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfbm5pX2tleSBrZXk7ICAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfbm5pX3N0YXRfY2ZnX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X25uaV9zdGF0X2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfYWxhcm1fY2xlYXJlZCIgZ3JvdXAgb2YgdGhlICJubmkiIG9iamVjdC4gCisgKgorICogU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhCit7CisgICAgYmNtb2x0X25uaV9zdGF0X2lkIHN0YXQ7ICAgIC8qKjwgU3RhdGlzdGljIGlkZW50aWZpZXIuICovCit9IGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9hbGFybV9jbGVhcmVkIiBncm91cCBvZiAibm5pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ubmlfa2V5IGtleTsgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfYWxhcm1fcmFpc2VkIiBncm91cCBvZiB0aGUgIm5uaSIgb2JqZWN0LiAKKyAqCisgKiBTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhCit7CisgICAgYmNtb2x0X25uaV9zdGF0X2lkIHN0YXQ7ICAgIC8qKjwgU3RhdGlzdGljIGlkZW50aWZpZXIuICovCit9IGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGF0X2FsYXJtX3JhaXNlZCIgZ3JvdXAgb2YgIm5uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X25uaV9rZXkga2V5OyAgICAgICAgICAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdHVzX2NoYW5nZWQiIGdyb3VwIG9mIHRoZSAibm5pIiBvYmplY3QuIAorICoKKyAqIE5OSSBMaW5rIHN0YXR1cyBjaGFuZ2VkIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2RhdGEKK3sKKyAgICBiY21vbHRfc3RhdHVzIG5ld19zdGF0dXM7ICAgICAgICAgICAgICAgLyoqPCBOZXcgTk5JIExpbmsgU3RhdHVzICovCisgICAgYmNtb2x0X25uaV9jb25uZWN0aW9uIGxpbms7ICAgICAgICAgICAgIC8qKjwgV2hpY2ggTk5JIHRoaXMgaW5kaWNhdGlvbiBwZXJ0YWlucyB0by4gKi8KKyAgICBiY21vbHRfbm5pX2Nvbm5lY3Rpb24gcHJldmlvdXNfYWN0aXZlOyAgLyoqPCBXaGljaCBOTkkgd2FzIGFjdGl2ZSBiZWZvcmUgdGhpcyBzdGF0dXMgY2hhbmdlLiAqLworICAgIGJjbW9sdF9ubmlfY29ubmVjdGlvbiBuZXdfYWN0aXZlOyAgICAgICAvKio8IFdoaWNoIE5OSSBpcyBub3cgYWN0aXZlIGFmdGVyIHRoaXMgc3RhdHVzIGNoYW5nZS4gKi8KK30gYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXR1c19jaGFuZ2VkIiBncm91cCBvZiAibm5pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfbm5pX2tleSBrZXk7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJhdXRvX2NmZyIgZ3JvdXAgb2YgdGhlICJubmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ubmlfYXV0b19jZmdfZGF0YQoreworICAgIGJjbW9zX2Jvb2wgc3RhdF9hbGFybV9jbGVhcmVkOyAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzdGF0X2FsYXJtX2NsZWFyZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgc3RhdF9hbGFybV9yYWlzZWQ7ICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzdGF0X2FsYXJtX3JhaXNlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBzdGF0dXNfY2hhbmdlZDsgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInN0YXR1c19jaGFuZ2VkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KK30gYmNtb2x0X25uaV9hdXRvX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImF1dG9fY2ZnIiBncm91cCBvZiAibm5pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfbm5pX2F1dG9fY2ZnCit7CisgICAgYmNtb2x0X2F1dG9fY2ZnIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X25uaV9rZXkga2V5OyAgICAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X25uaV9hdXRvX2NmZ19kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ubmlfYXV0b19jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJrZXkiIGdyb3VwIG9mIHRoZSAibm5pX3NlcmRlcyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X25uaV9zZXJkZXNfa2V5Cit7CisgICAgYmNtb2x0X3Bvbl9uaSBwb25fbmk7ICAgICAgICAgICAgICAgLyoqPCBQT04gTkkuICovCisgICAgYmNtb2x0X3NlcmRlc19pbnN0YW5jZSBpbnN0YW5jZTsgICAgLyoqPCBTZXJEZXMgaW5zdGFuY2UuOiAwID0gUHJpbWFyeSwgMSA9IFNlY29uZGFyeS4gKi8KK30gYmNtb2x0X25uaV9zZXJkZXNfa2V5OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiY2ZnIiBncm91cCBvZiB0aGUgIm5uaV9zZXJkZXMiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhCit7CisgICAgdWludDhfdCByeF92Z2E7ICAgICAvKio8IFJ4IFZnYS4gKi8KKyAgICB1aW50OF90IHJ4X3BmOyAgICAgIC8qKjwgUGVha2luZyBGaWx0ZXIgKi8KKyAgICB1aW50OF90IHJ4X2xmcGY7ICAgIC8qKjwgTG93IEZyZXF1ZW5jeSBQZWFraW5nIEZpbHRlciAqLworICAgIHVpbnQ4X3QgcnhfZGZlMTsgICAgLyoqPCBSeCBERkUxLiAqLworICAgIGludDhfdCByeF9kZmUyOyAgICAgLyoqPCBSeCBERkUyLiAqLworICAgIGludDhfdCByeF9kZmUzOyAgICAgLyoqPCBSeCBERkUzLiAqLworICAgIGludDhfdCByeF9kZmU0OyAgICAgLyoqPCBSeCBERkU0LiAqLworICAgIGludDhfdCByeF9kZmU1OyAgICAgLyoqPCBSeCBERkU1LiAqLworICAgIHVpbnQ4X3QgdHhfcHJlOyAgICAgLyoqPCBUeCBQcmUuICovCisgICAgdWludDhfdCB0eF9tYWluOyAgICAvKio8IFR4IE1haW4uICovCisgICAgdWludDhfdCB0eF9wb3N0MTsgICAvKio8IFR4IFBvc3QxLiAqLworICAgIGludDhfdCB0eF9wb3N0MjsgICAgLyoqPCBUeCBQb3N0Mi4gKi8KKyAgICBpbnQ4X3QgdHhfcG9zdDM7ICAgIC8qKjwgVHggUG9zdDMuICovCisgICAgdWludDhfdCB0eF9hbXA7ICAgICAvKio8IFR4IEFtcC4gKi8KK30gYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiY2ZnIiBncm91cCBvZiAibm5pX3NlcmRlcyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X25uaV9zZXJkZXNfY2ZnCit7CisgICAgYmNtb2x0X2NmZyBoZHI7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF9ubmlfc2VyZGVzX2tleSBrZXk7ICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF9ubmlfc2VyZGVzX2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleSIgZ3JvdXAgb2YgdGhlICJzb2Z0d2FyZV9lcnJvciIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleQoreworICAgIHVpbnQzMl90IHJlc2VydmVkOyAgLyoqPCBSZXNlcnZlZCAoc2V0IHRvIDApLiAqLworICAgIHVpbnQzMl90IGlkeDsgICAgICAgLyoqPCBJbmRleC4gKi8KK30gYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNmZyIgZ3JvdXAgb2YgdGhlICJzb2Z0d2FyZV9lcnJvciIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhCit7CisgICAgYmNtb2x0X3N3X2Vycm9yIGVudHJ5OyAgLyoqPCBFbnRyeS4gKi8KK30gYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImNmZyIgZ3JvdXAgb2YgInNvZnR3YXJlX2Vycm9yIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnCit7CisgICAgYmNtb2x0X2NmZyBoZHI7ICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleSBrZXk7ICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhIGRhdGE7ICAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleSIgZ3JvdXAgb2YgdGhlICJ0cnhfY2FsaWJyYXRpb24iIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5Cit7CisgICAgdWludDMyX3QgcmVzZXJ2ZWQ7ICAvKio8IFJlc2VydmVkIChzZXQgdG8gMCkgKi8KK30gYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXk7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJjYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZCIgZ3JvdXAgCisgKiBvZiB0aGUgInRyeF9jYWxpYnJhdGlvbiIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhCit7CisgICAgYmNtb2x0X3UzMl9saXN0X3UzMl9tYXhfNTAwX2hleCBkYXRhX3dpbmRvdzsgICAgLyoqPCBkYXRhIHdpbmRvdy4gKi8KKyAgICBiY21vbHRfdTMyX2xpc3RfdTMyX21heF81MDBfaGV4IHN0cm9iZV93aW5kb3c7ICAvKio8IHN0cm9iZSB3aW5kb3cuICovCisgICAgdWludDY0X3QgZWRnZV9yaXNlX21pbl9taW47ICAgICAgICAgICAgICAgICAgICAgLyoqPCBlZGdlIHJpc2UgbWluIG1pbi4gKi8KKyAgICB1aW50NjRfdCBlZGdlX3Jpc2VfbWluX21heDsgICAgICAgICAgICAgICAgICAgICAvKio8IGVkZ2UgcmlzZSBtaW4gbWF4LiAqLworICAgIHVpbnQ2NF90IGVkZ2VfcmlzZV9tYXhfbWluOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgZWRnZSByaXNlIG1heCBtaW4uICovCisgICAgdWludDY0X3QgZWRnZV9yaXNlX21heF9tYXg7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBlZGdlIHJpc2UgbWF4IG1heC4gKi8KKyAgICB1aW50NjRfdCBlZGdlX2ZhbGxfbWluX21pbjsgICAgICAgICAgICAgICAgICAgICAvKio8IGVkZ2UgZmFsbCBtaW4gbWluIC4gKi8KKyAgICB1aW50NjRfdCBlZGdlX2ZhbGxfbWluX21heDsgICAgICAgICAgICAgICAgICAgICAvKio8IGVkZ2UgZmFsbCBtaW4gbWF4LiAqLworICAgIHVpbnQ2NF90IGVkZ2VfZmFsbF9tYXhfbWluOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgZWRnZSBmYWxsIG1heCBtaW4uICovCisgICAgdWludDY0X3QgZWRnZV9mYWxsX21heF9tYXg7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBlZGdlIGZhbGwgbWF4IG1heC4gKi8KKyAgICBiY21vbHRfcmVzdWx0IHJlc3VsdDsgICAvKio8IHJlc3VsdC4gKi8KK30gYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImNhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkIiAKKyAqIGdyb3VwIG9mICJ0cnhfY2FsaWJyYXRpb24iIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleSBrZXk7IC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiYXV0b19jZmciIGdyb3VwIG9mIHRoZSAidHJ4X2NhbGlicmF0aW9uIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfZGF0YQoreworICAgIGJjbW9zX2Jvb2wgY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWQ7ICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImNhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KK30gYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImF1dG9fY2ZnIiBncm91cCBvZiAidHJ4X2NhbGlicmF0aW9uIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmcKK3sKKyAgICBiY21vbHRfYXV0b19jZmcgaGRyOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleSBrZXk7ICAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXJ0X2NhcHR1cmVfd2luZG93IiBncm91cCBvZiB0aGUgCisgKiAidHJ4X2NhbGlicmF0aW9uIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGEKK3sKKyAgICB1aW50OF90IHBvbl9uaTsgLyoqPCBwb25fbmkuICovCisgICAgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyIHRyaWdnZXI7ICAgICAgICAgLyoqPCB0cmlnZ2VyLiAqLworICAgIGJjbW9sdF9jYXB0dXJlX3N0cm9iZV9zaWduYWwgc3Ryb2JlOyAgICAgICAgICAgIC8qKjwgc3Ryb2JlLiAqLworICAgIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fd2luZG93X21vZGUgd2luZG93X21vZGU7IC8qKjwgd2luZG93IG1vZGUuICovCisgICAgdWludDE2X3Qgb251X2lkOyAgICAvKio8IG9udSBpZC4gKi8KKyAgICBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3RyaWdnZXJfcG9zaXRpb24gdHJpZ2dlcl9wb3NpdGlvbjsgICAvKio8IHRyaWdnZXIgcG9zaXRpb24uICovCisgICAgYmNtb3NfYm9vbCBzdG9wX2R1ZV90b19jb3JydXB0X3N0cm9iZTsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBlbmFibGUvZGlzYWJsZSBjb3JydXB0IHN0cm9iZSBmcm9tIE1BQyB0byB0ZXJtaW5hdGUgc3RhdCB3aW5kb3cgKi8KKyAgICB1aW50MTZfdCBzdGFydF9vZmZzZXQ7ICAgICAgLyoqPCBzdGFydCBvZmZzZXQuICovCisgICAgdWludDE2X3QgZW5kX29mZnNldDsgICAgICAgIC8qKjwgZW5kIG9mZnNldC4gKi8KKyAgICB1aW50OF90IG51bWJlcl9vZl9jeWNsZXM7ICAgLyoqPCBudW1iZXIgb2YgY3ljbGVzLiAqLworfSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhcnRfY2FwdHVyZV93aW5kb3ciIGdyb3VwIG9mIAorICogInRyeF9jYWxpYnJhdGlvbiIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvdworeworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5IGtleTsgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RvcF9jYXB0dXJlX3dpbmRvdyIgZ3JvdXAgb2YgdGhlIAorICogInRyeF9jYWxpYnJhdGlvbiIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2RhdGEKK3sKKyAgICB1aW50OF90IHBvbl9uaTsgLyoqPCBwb25fbmkuICovCit9IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvd19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0b3BfY2FwdHVyZV93aW5kb3ciIGdyb3VwIG9mIAorICogInRyeF9jYWxpYnJhdGlvbiIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93Cit7CisgICAgYmNtb2x0X29wZXIgaGRyOyAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXkga2V5OyAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvdzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleSIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9hbGxvYyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX2FsbG9jX2tleQoreworICAgIGJjbW9sdF94Z3Bvbl9uaSBwb25fbmk7ICAgICAgICAgLyoqPCBQT04gbmV0d29yayBpbnRlcmZhY2UuICovCisgICAgYmNtb2x0X3hncG9uX2FsbG9jX2lkIGFsbG9jX2lkOyAvKio8IEFsbG9jIElELiAqLworfSBiY21vbHRfeGdwb25fYWxsb2Nfa2V5OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiY2ZnIiBncm91cCBvZiB0aGUgInhncG9uX2FsbG9jIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fYWxsb2NfY2ZnX2RhdGEKK3sKKyAgICBiY21vbHRfYWxsb2Nfc3RhdGUgc3RhdGU7ICAgLyoqPCBDdXJyZW50IEFsbG9jIElEIHN0YXRlICovCisgICAgYmNtb2x0X3Bvbl9hbGxvY19zbGEgc2xhOyAgIC8qKjwgQWxsb2MgSUQgU0xBICovCisgICAgYmNtb2x0X3hncG9uX29udV9pZCBvbnVfaWQ7IC8qKjwgT05VIElEIHRoZSBhbGxvYyBJRCBpcyBhc3NpZ25lZCB0byAqLworICAgIGJjbW9zX2Jvb2wgY29sbGVjdF9zdGF0czsgICAvKio8IEVuYWJsZSBzdGF0aXN0aWNzIGNvbGxlY3Rpb24gZm9yIHRoaXMgYWxsb2MgSUQgKi8KK30gYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImNmZyIgZ3JvdXAgb2YgInhncG9uX2FsbG9jIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fYWxsb2NfY2ZnCit7CisgICAgYmNtb2x0X2NmZyBoZHI7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19rZXkga2V5OyAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fYWxsb2NfY2ZnX2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9hbGxvY19jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0IiBncm91cCBvZiB0aGUgInhncG9uX2FsbG9jIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9kYXRhCit7CisgICAgdWludDY0X3QgcnhfYnl0ZXM7ICAvKio8IE51bWJlciBvZiBhbGxvYyBJRCByZWNlaXZlZCBieXRlcy4gKi8KK30gYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGF0IiBncm91cCBvZiAieGdwb25fYWxsb2MiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0Cit7CisgICAgYmNtb2x0X3N0YXQgaGRyOyAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19rZXkga2V5OyAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdF9jZmciIGdyb3VwIG9mIHRoZSAieGdwb25fYWxsb2MiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhCit7CisgICAgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIGNmZzsgICAvKio8IFN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiAqLworfSBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGF0X2NmZyIgZ3JvdXAgb2YgInhncG9uX2FsbG9jIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmcKK3sKKyAgICBiY21vbHRfc3RhdF9jZmcgaGRyOyAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19rZXkga2V5OyAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiY29uZmlndXJhdGlvbl9jb21wbGV0ZWQiIGdyb3VwIG9mIHRoZSAKKyAqICJ4Z3Bvbl9hbGxvYyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEKK3sKKyAgICBiY21vbHRfcmVzdWx0IHN0YXR1czsgICAgICAgICAgIC8qKjwgc3RhdHVzLiAqLworICAgIGJjbW9sdF9hbGxvY19zdGF0ZSBuZXdfc3RhdGU7ICAgLyoqPCBuZXcgc3RhdGUuICovCit9IGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImNvbmZpZ3VyYXRpb25fY29tcGxldGVkIiBncm91cCBvZiAKKyAqICJ4Z3Bvbl9hbGxvYyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fYWxsb2Nfa2V5IGtleTsgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkIiBncm91cCBvZiB0aGUgCisgKiAieGdwb25fYWxsb2MiIG9iamVjdC4gCisgKgorICogQ29sbGVjdGVkIGFsbG9jIElEIHN0YXRpc3RpY3MgZnJvbSBnZXRfc3RhdHMgb3BlcmF0aW9uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhCit7CisgICAgYmNtb2x0X3Jlc3VsdCBzdGF0dXM7ICAgICAgICAgICAvKio8IHN0YXR1cy4gKi8KKyAgICB1aW50MzJfdCBhdmVyYWdlX25zcl91c2VkOyAgICAgIC8qKjwgQXZlcmFnZSBOU1IgdXNlZCB3b3Jkcy4gKi8KKyAgICB1aW50MzJfdCBhdmVyYWdlX25zcl9hbGxvY2F0ZWQ7IC8qKjwgQXZlcmFnZSBOU1IgYWxsb2NhdGVkIHdvcmRzLiAqLworICAgIHVpbnQzMl90IGF2ZXJhZ2Vfc3JfcmVwb3J0OyAgICAgLyoqPCBBdmVyYWdlIFNSIHJlcG9ydC4gKi8KK30gYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkIiBncm91cCBvZiAKKyAqICJ4Z3Bvbl9hbGxvYyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19rZXkga2V5OyAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdF9hbGFybV9jbGVhcmVkIiBncm91cCBvZiB0aGUgInhncG9uX2FsbG9jIiAKKyAqIG9iamVjdC4gCisgKgorICogU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEKK3sKKyAgICBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9pZCBzdGF0OyAgICAvKio8IFN0YXRpc3RpYyBpZGVudGlmaWVyLiAqLworfSBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9hbGFybV9jbGVhcmVkIiBncm91cCBvZiAieGdwb25fYWxsb2MiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX2FsbG9jX2tleSBrZXk7IC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdF9hbGFybV9yYWlzZWQiIGdyb3VwIG9mIHRoZSAieGdwb25fYWxsb2MiIAorICogb2JqZWN0LiAKKyAqCisgKiBTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEKK3sKKyAgICBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9pZCBzdGF0OyAgICAvKio8IFN0YXRpc3RpYyBpZGVudGlmaWVyLiAqLworfSBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzdGF0X2FsYXJtX3JhaXNlZCIgZ3JvdXAgb2YgInhncG9uX2FsbG9jIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX2FsbG9jX2tleSBrZXk7IC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImF1dG9fY2ZnIiBncm91cCBvZiB0aGUgInhncG9uX2FsbG9jIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfZGF0YQoreworICAgIGJjbW9zX2Jvb2wgY29uZmlndXJhdGlvbl9jb21wbGV0ZWQ7ICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImNvbmZpZ3VyYXRpb25fY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIGdldF9hbGxvY19zdGF0c19jb21wbGV0ZWQ7ICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHN0YXRfYWxhcm1fY2xlYXJlZDsgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzdGF0X2FsYXJtX2NsZWFyZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgc3RhdF9hbGFybV9yYWlzZWQ7ICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInN0YXRfYWxhcm1fcmFpc2VkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KK30gYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiYXV0b19jZmciIGdyb3VwIG9mICJ4Z3Bvbl9hbGxvYyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnCit7CisgICAgYmNtb2x0X2F1dG9fY2ZnIGhkcjsgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fYWxsb2Nfa2V5IGtleTsgICAgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImdldF9zdGF0cyIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9hbGxvYyIgb2JqZWN0LiAKKyAqCisgKiBSdW4gc3RhdGlzdGljcyBjb2xsZWN0aW9uIGZvciBhIGdpdmVuIHBlcmlvZCBvZiB0aW1lIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEKK3sKKyAgICB1aW50MzJfdCBudW1fb2ZfY3ljbGVzOyAvKio8IFRoZSBudW1iZXIgb2YgY3ljbGVzIHRvIHJ1biBzdGF0aXN0aWNzIGNvbGxlY3Rpb24gKi8KK30gYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImdldF9zdGF0cyIgZ3JvdXAgb2YgInhncG9uX2FsbG9jIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzCit7CisgICAgYmNtb2x0X29wZXIgaGRyOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fYWxsb2Nfa2V5IGtleTsgICAgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHM7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzZXRfc3RhdGUiIGdyb3VwIG9mIHRoZSAieGdwb25fYWxsb2MiIG9iamVjdC4gCisgKgorICogU2V0cyB0aGUgYWxsb2MncyBhY3RpdmF0aW9uIHN0YXRlLiAgVGhpcyBpcyBvbmx5IHVzZWQgZm9yIHByb3RlY3Rpb24gCisgKiBzd2l0Y2hpbmcgb24gYW4gYWN0aXZlLXN0YW5kYnkgUE9OLiAgSW4gbm9ybWFsIG9wZXJhdGlvbiwgdGhpcyBpc24ndCAKKyAqIG5lY2Vzc2FyeSBzaW5jZSBhbGxvY3MgYXJlIGFjdGl2YXRlZC9kZWFjdGl2YXRlZCBhdXRvbWF0aWNhbGx5IGFsb25nIHdpdGggCisgKiB0aGUgT05VLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhCit7CisgICAgYmNtb2x0X2FsbG9jX29wZXJhdGlvbiBzdGF0ZTsgICAvKio8IFN0YXRlLiAqLworfSBiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic2V0X3N0YXRlIiBncm91cCBvZiAieGdwb25fYWxsb2MiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGUKK3sKKyAgICBiY21vbHRfb3BlciBoZHI7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19rZXkga2V5OyAgICAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleSIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9nZW1fcG9ydCIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleQoreworICAgIGJjbW9sdF94Z3Bvbl9uaSBwb25fbmk7ICAgICAgICAgICAgIC8qKjwgUE9OIG5ldHdvcmsgaW50ZXJmYWNlLiAqLworICAgIGJjbW9sdF94Z3Bvbl9nZW1faWQgZ2VtX3BvcnRfaWQ7ICAgIC8qKjwgR0VNIFBPUlQgSUQuICovCit9IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXk7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJjZmciIGdyb3VwIG9mIHRoZSAieGdwb25fZ2VtX3BvcnQiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmdfZGF0YQoreworICAgIGJjbW9sdF9nZW1fcG9ydF9jb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb247ICAgICAgICAgICAgICAgIC8qKjwgR0VNIHBvcnQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzICovCisgICAgYmNtb2x0X3hncG9uX29udV9pZCBvbnVfaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBPTlUgSUQgdGhpcyBHRU0gcG9ydCBpcyBhc3NpZ25lZCB0byAqLworICAgIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0ZSBnZW1fcG9ydF9zdGF0ZTsgICAgICAgICAgICAgICAgIC8qKjwgQ3VycmVudCBHRU0gcG9ydCBzdGF0ZSAqLworICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIGVuY3J5cHRpb25fbW9kZTsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRW5hYmxlL0Rpc2FibGUgdGhlIGRvd25zdHJlYW0gZW5jcnlwdGlvbiBtb2RlIG9mIHRoZSBHRU0gUG9ydCAqLworICAgIGJjbW9sdF91c19nZW1fcG9ydF9kZXN0aW5hdGlvbiB1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZTsgIC8qKjwgVGhlIGRlc3RpbmF0aW9uIHF1ZXVlIG9mIHRoZSBwYWNrZXRzIGFycml2aW5nIG9uIHRoaXMgR0VNIFBvcnQgb24gdGhlIHVwc3RyZWFtIGRpcmVjdGlvbiAqLworICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIGNvbnRyb2w7ICAgLyoqPCBFbmFibGUvRGlzYWJsZSB0aGUgR0VNIFBvcnQgSUQgaW4gdGhlIE9MVCAqLworfSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiY2ZnIiBncm91cCBvZiAieGdwb25fZ2VtX3BvcnQiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmcKK3sKKyAgICBiY21vbHRfY2ZnIGhkcjsgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5IGtleTsgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdCIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9nZW1fcG9ydCIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfZGF0YQoreworICAgIHVpbnQ2NF90IHR4X2J5dGVzOyAgICAgIC8qKjwgVFggYnl0ZXMuICovCisgICAgdWludDY0X3QgdHhfcGFja2V0czsgICAgLyoqPCBUWCBwYWNrZXRzLiAqLworICAgIHVpbnQ2NF90IHJ4X3BhY2tldHM7ICAgIC8qKjwgUlggcGFja2V0cy4gKi8KKyAgICB1aW50NjRfdCByeF9ieXRlczsgICAgICAvKio8IFJYIGJ5dGVzLiAqLworfSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXQiIGdyb3VwIG9mICJ4Z3Bvbl9nZW1fcG9ydCIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXQKK3sKKyAgICBiY21vbHRfc3RhdCBoZHI7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXkga2V5OyAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2NmZyIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9nZW1fcG9ydCIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YQoreworICAgIGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyBjZmc7ICAgLyoqPCBTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4gKi8KK30gYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9jZmciIGdyb3VwIG9mICJ4Z3Bvbl9nZW1fcG9ydCIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmcKK3sKKyAgICBiY21vbHRfc3RhdF9jZmcgaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5IGtleTsgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic3RhdF9hbGFybV9jbGVhcmVkIiBncm91cCBvZiB0aGUgCisgKiAieGdwb25fZ2VtX3BvcnQiIG9iamVjdC4gCisgKgorICogU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEKK3sKKyAgICBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9pZCBzdGF0OyAvKio8IFN0YXRpc3RpYyBpZGVudGlmaWVyLiAqLworfSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9hbGFybV9jbGVhcmVkIiBncm91cCBvZiAKKyAqICJ4Z3Bvbl9nZW1fcG9ydCIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXkga2V5OyAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2FsYXJtX3JhaXNlZCIgZ3JvdXAgb2YgdGhlIAorICogInhncG9uX2dlbV9wb3J0IiBvYmplY3QuIAorICoKKyAqIFNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YQoreworICAgIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2lkIHN0YXQ7IC8qKjwgU3RhdGlzdGljIGlkZW50aWZpZXIuICovCit9IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXRfYWxhcm1fcmFpc2VkIiBncm91cCBvZiAKKyAqICJ4Z3Bvbl9nZW1fcG9ydCIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleSBrZXk7ICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiYXV0b19jZmciIGdyb3VwIG9mIHRoZSAieGdwb25fZ2VtX3BvcnQiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEKK3sKKyAgICBiY21vc19ib29sIHN0YXRfYWxhcm1fY2xlYXJlZDsgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAic3RhdF9hbGFybV9jbGVhcmVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHN0YXRfYWxhcm1fcmFpc2VkOyAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAic3RhdF9hbGFybV9yYWlzZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworfSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJhdXRvX2NmZyIgZ3JvdXAgb2YgInhncG9uX2dlbV9wb3J0IiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZworeworICAgIGJjbW9sdF9hdXRvX2NmZyBoZHI7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXkga2V5OyAgICAgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJrZXkiIGdyb3VwIG9mIHRoZSAieGdwb25faXdmIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25faXdmX2tleQoreworICAgIGJjbW9sdF94Z3Bvbl9uaSBwb25fbmk7IC8qKjwgUE9OIG5ldHdvcmsgaW50ZXJmYWNlLiAqLworfSBiY21vbHRfeGdwb25faXdmX2tleTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNmZyIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9pd2YiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2RhdGEKK3sKKyAgICB1aW50MTZfdCB1c19vdGFnX2RpcmVjdF90cGlkOyAgIC8qKjwgVFBJRCB2YWx1ZSBvZiB0aGUgVkxBTiB0YWcgYWRkZWQgdG8gdXBzdHJlYW0gcGFja2V0ICovCisjZGVmaW5lIEJDTU9MVF9YR1BPTl9JV0ZfQ0ZHX0RBVEFfRFNfVFBJRF9MRU4gICA1CisgICAgYmNtb2x0X2Fycl91MTZfNV9oZXggZHNfdHBpZDsgICAvKio8IFBhY2tldHMgbWFya2VkIHdpdGggb25lIG9mIHRoZSBmaXZlIGNvbmZpZ3VyZWQgRFMgVFBJRCBvcHRpb25zIHdpbGwgYmUgZm9yd2FyZGVkLCBhbGwgdGhlIHJlc3Qgd2lsbCBiZSBkcm9wcGVkICovCit9IGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiY2ZnIiBncm91cCBvZiAieGdwb25faXdmIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25faXdmX2NmZworeworICAgIGJjbW9sdF9jZmcgaGRyOyAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9pd2Zfa2V5IGtleTsgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25faXdmX2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleSIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX25pX2tleQoreworICAgIGJjbW9sdF94Z3Bvbl9uaSBwb25fbmk7IC8qKjwgUE9OIG5ldHdvcmsgaW50ZXJmYWNlLiAqLworfSBiY21vbHRfeGdwb25fbmlfa2V5OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiY2ZnIiBncm91cCBvZiB0aGUgInhncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEKK3sKKyAgICBiY21vbHRfaHdfcG9uX2lkIGh3X3Bvbl9pZDsgLyoqPCA1MSBiaXQgUE9OIGlkZW50aWZpZXIuIFRoaXMgYXR0cmlidXRlIGlzIHBhcnQgb2YgdGhlIGRvd25zdHJlYW0gcGh5c2ljYWwgc3luY2hyb25pemF0aW9uIGJsb2NrIChQU0JkKSAqLworICAgIGJjbW9sdF9wb25fYXZhaWxhYmxlX2JhbmR3aWR0aCBhdmFpbGFibGVfYmFuZHdpZHRoOyAvKio8IFBPTiBhdmFpbGFibGUgYmFuZHdpZHRoIHBhcmFtZXRlcnMgKi8KKyAgICB1aW50MTZfdCBudW1iZXJfb2ZfYWN0aXZlX29udXM7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgYWN0aXZlIE9OVXMgb24gdGhlIFBPTiAqLworICAgIGJjbW9sdF9wb25fc3RhdHVzIHBvbl9zdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFBPTiBzdGF0dXMgcGFyYW1ldGVycyAqLworICAgIGJjbW9sdF9wb25fZGlzdGFuY2UgcG9uX2Rpc3RhbmNlOyAgICAgICAgICAgICAgICAgICAvKio8IFBPTiBkaXN0YW5jZSAqLworICAgIHVpbnQzMl90IHJhbmdpbmdfd2luZG93X3NpemU7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFJhbmdpbmcgd2luZG93IHNpemUgaW4gQlcgdW5pdHMgKDQtYnl0ZSB3b3JkcyBmb3IgMi41RyB1cHN0cmVhbSwgMTYtYnl0ZSBibG9ja3MgZm9yIDEwRyB1cHN0cmVhbSkgKi8KKyAgICB1aW50MzJfdCBlcWRfY3ljbGVzX251bWJlcjsgICAgICAgICAgICAgLyoqPCBIb3cgbWFueSByYW5naW5nIHdpbmRvd3MgYXJlIG9wZW5lZCBkdXJpbmcgYSBzaW5nbGUgT05VIGFjdGl2YXRpb24gcHJvY2VzcyAqLworICAgIGJjbW9sdF9wb25fZHJpZnRfY29udHJvbCBkcmlmdF9jb250cm9sOyAvKio8IERyaWZ0IGNvbnRyb2wgcHJvY2VzcyBjb25maWd1cmF0aW9uICovCisgICAgdWludDhfdCBsb3NfYWxhcm1fdGhyZXNob2xkOyAgICAgICAgICAgIC8qKjwgTE9TIGFsYXJtIHRocmVzaG9sZCAqLworICAgIGJjbW9sdF9zdGF0dXMgbG9zX2luaXRpYWxfdmFsdWU7ICAgICAgICAvKio8IExPUyBpbml0aWFsIHZhbHVlIGZvbGxvd2luZyBQT04gYWN0aXZhdGlvbiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgb251X2FsYXJtc190aHJlc2hvbGRzOyAgICAgICAgICAgICAgIC8qKjwgT05VIGFsYXJtcyB0aHJlc2hvbGRzIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBiY21vbHRfYmVyX21vbml0b3JfcGFyYW1zIGJlcl9tb25pdG9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEJFUiBtb25pdG9yIHByb2Nlc3MgY29uZmlndXJhdGlvbiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfYWN0aXZhdGlvbiBvbnVfYWN0aXZhdGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgT05VIGFjdGl2YXRpb24gY29udHJvbCBwYXJhbWV0ZXJzICovCisgICAgYmNtb2x0X3hncG9uX3NuX2FjcXVpc2l0aW9uIHNuX2FjcXVpc2l0aW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBTZXJpYWwgTnVtYmVyIHByb2Nlc3MgY29uZmlndXJhdGlvbiAqLworICAgIGJjbW9sdF94Z3Bvbl9rZXlfZXhjaGFuZ2Uga2V5X2V4Y2hhbmdlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgS2V5IEV4Y2hhbmdlIHByb2Nlc3MgY29uZmlndXJhdGlvbiAqLworICAgIGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZyBwcm90ZWN0aW9uX3N3aXRjaGluZzsgICAgICAgICAgICAgICAgIC8qKjwgUHJvdGVjdGlvbiBzd2l0Y2hpbmcgY29udHJvbCAqLworICAgIGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1ZyBwcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1ZzsgICAgIC8qKjwgcHJvdGVjdGlvbiBzd2l0Y2hpbmcgZGVidWcgLiAqLworICAgIGJjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlIGNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGU7ICAgICAgICAgICAgIC8qKjwgQ0JSIFJlYWwgVGltZSBhbGxvY2F0aW9uIHByb2ZpbGUgKi8KKyNkZWZpbmUgQkNNT0xUX1hHUE9OX05JX0NGR19EQVRBX0NCUl9OUlRfQUxMT0NBVElPTl9QUk9GSUxFX0xFTiAyCisgICAgYmNtb2x0X2Fycl91MTZfMiBjYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBDQlIgbm9uIFJlYWwgVGltZSBhbGxvY2F0aW9uIHByb2ZpbGUgKi8KKyAgICBiY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbiBwb3dlcl9tYW5hZ2VtZW50OyAgICAgICAgICAgICAvKio8IE9OVSBwb3dlciBtYW5hZ2VtZW50IGNvbnRyb2wgKi8KKyAgICBiY21vbHRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzIHJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzczsgICAgICAgICAvKio8IFRCRCAqLworICAgIGJjbW9sdF9wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nIHBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3Jpbmc7IC8qKjwgUGVyaW9kaWMgU3RhbmRieSBQT04gbW9uaXRvcmluZyAqLworICAgIGJjbW9sdF9kYmFfbW9kZSBkYmFfbW9kZTsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgREJBIG1vZGUgKi8KKyAgICBiY21vbHRfeGdwb25fcGxvYW1faGFuZGxpbmcgcGxvYW1faGFuZGxpbmc7ICAgICAvKio8IFBsb2FtIGhhbmRsaW5nIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBiY21vbHRfeGdwb25fYWxsb2NfaWQgbWluX2RhdGFfYWxsb2NfaWQ7ICAgICAgICAvKio8IE1pbiBkYXRhIEFsbG9jIElEIHZhbHVlICovCisgICAgYmNtb2x0X3hncG9uX2dlbV9pZCBtaW5fZGF0YV9nZW1fcG9ydF9pZDsgICAgICAgLyoqPCBNaW4gZGF0YSBYR0VNIHBvcnQgSUQgdmFsdWUgKi8KKyAgICBiY21vbHRfeGdwb25fbXVsdGljYXN0X2tleSBtdWx0aWNhc3Rfa2V5OyAgICAgICAvKio8IE11bHRpY2FzdCBYR0VNIHBvcnRzIGVuY3J5cHRpb24gY29udHJvbCAqLworICAgIGJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnIHByYnNfY2hlY2tlcjsgICAgICAgIC8qKjwgVVMgUFJCUyBjaGVja2VyIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnIHByYnNfZ2VuZXJhdG9yOyAgICAvKio8IERTIFBSQlMgZ2VuZXJhdG9yIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBiY21vbHRfcHJic19zdGF0dXMgcHJic19zdGF0dXM7ICAgICAgICAgICAgICAgICAvKio8IFJlc3VsdCBvZiBVUyBQUkJTIGNoZWNrZXIgKi8KKyAgICBiY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24gYXV0b21hdGljX29udV9kZWFjdGl2YXRpb247ICAgLyoqPCBPcHRpb24gdG8gZGlzYWJsZSB0aGUgYXV0b21hdGljIGRlYWN0aXZhdGlvbiBvZiBPTlVzIGR1ZSB0byBhbGFybXMgKi8KKyAgICB1aW50MzJfdCB1c19iYW5kd2lkdGhfbGltaXQ7ICAgIC8qKjwgVG90YWwgUE9OIHVwc3RyZWFtIGJhbmR3aWR0aCBsaW1pdCBpbiBieXRlcyBwZXIgc2Vjb25kLiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfNTEwIGFsbF9vbnVzOyAgICAgICAgICAgICAgICAgIC8qKjwgQWxsIE9OVXMgY3VycmVudGx5IHByb3Zpc2lvbmVkIG9uIHRoaXMgUE9OLiAqLworICAgIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjggYWxsX21jYXN0X2dlbV9wb3J0czsgIC8qKjwgQWxsIG11bHRpY2FzdCBHRU0gcG9ydHMgY3VycmVudGx5IHByb3Zpc2lvbmVkIG9uIHRoaXMgUE9OLiAqLworICAgIGJjbW9sdF94Z3Bvbl9uaV9kZWJ1ZyBkZWJ1ZzsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFBPTiBOSSBkZWJ1ZyBwYXJhbWV0ZXJzICovCisgICAgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zIG9udV91cGdyYWRlX3BhcmFtczsgIC8qKjwgT05VIHVwZ3JhZGUgcGFyYW1zLiAqLworICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIGRzX2ZlY19tb2RlOyAgICAgICAgICAgICAgICAgICAvKio8IERTIEZFQyBtb2RlLiAqLworICAgIGJjbW9sdF9kYmFfdHlwZSBkYmFfdHlwZTsgICAgICAgICAgICAgICAgICAgLyoqPCBEQkEgaW1wbGVtZW50YXRpb24gdHlwZSAqLworICAgIGJjbW9sdF9vbnVfdHVuaW5nX2NvbmZpZ3VyYXRpb24gb251X3R1bmluZzsgLyoqPCBvbnUgdHVuaW5nLiAqLworfSBiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiY2ZnIiBncm91cCBvZiAieGdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9jZmcKK3sKKyAgICBiY21vbHRfY2ZnIGhkcjsgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleTsgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX25pX2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXQiIGdyb3VwIG9mIHRoZSAieGdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEKK3sKKyAgICB1aW50NjRfdCBmZWNfY29kZXdvcmRzOyAgICAgICAgICAgICAvKio8IFJlY2VpdmUgRkVDIGNvZGV3b3Jkcy4gKi8KKyAgICB1aW50NjRfdCBiaXAzMl9ieXRlczsgICAgICAgICAgICAgICAvKio8IFJlY2VpdmVkIGJ5dGVzIHByb3RlY3RlZCBieSBiaXAzMi4gKi8KKyAgICB1aW50NjRfdCBiaXAzMl9lcnJvcnM7ICAgICAgICAgICAgICAvKio8IFJlY2VpdmVkIGJpcDMyIGVycm9ycy4gKi8KKyAgICB1aW50NjRfdCByeF94Z3RjX2hlYWRlcnM7ICAgICAgICAgICAvKio8IFJlY2VpdmVkIHZhbGlkIFhHVEMgaGVhZGVycy4gKi8KKyAgICB1aW50NjRfdCByeF94Z3RjX2NvcnJlY3RlZDsgICAgICAgICAvKio8IFJlY2VpdmVkIGNvcnJlY3RlZCBYR1RDIGhlYWRlcnMuICovCisgICAgdWludDY0X3QgcnhfeGd0Y191bmNvcnJlY3RlZDsgICAgICAgLyoqPCBSZWNlaXZlZCB1bmNvcnJlY3RlZCBYR1RDIGhlYWRlcnMuICovCisgICAgdWludDY0X3QgcnhfeGdlbTsgICAgICAgICAgICAgICAgICAgLyoqPCBSZWNlaXZlZCB2YWxpZCBYR0VNIGZyYW1lcy4gKi8KKyAgICB1aW50NjRfdCByeF94Z2VtX2Ryb3BwZWQ7ICAgICAgICAgICAvKio8IFJlY2VpdmVkIGRyb3BwZWQgWEdFTSBJRCBmcmFtZXMuICovCisgICAgdWludDY0X3QgcnhfeGdlbV9pZGxlOyAgICAgICAgICAgICAgLyoqPCBSZWNlaXZlZCBpZGxlIFhHRU0gZnJhbWVzLiAqLworICAgIHVpbnQ2NF90IHJ4X3hnZW1fY29ycmVjdGVkOyAgICAgICAgIC8qKjwgUmVjZWl2ZWQgY29ycmVjdGVkIFhHRU0gZnJhbWVzLiAqLworICAgIHVpbnQ2NF90IHJ4X2NyY19lcnJvcjsgICAgICAgICAgICAgIC8qKjwgUmVjZWl2ZWQgcGFja2V0cyB3aXRoIENSQyBlcnJvci4gKi8KKyAgICB1aW50NjRfdCByeF9mcmFnbWVudF9lcnJvcjsgICAgICAgICAvKio8IFJlY2VpdmVkIGZyYWdtZW50IGVycm9ycy4gKi8KKyAgICB1aW50NjRfdCByeF9wYWNrZXRzX2Ryb3BwZWQ7ICAgICAgICAvKio8IEdsb2JhbCBkcm9wcGVkIHBhY2tldHMuICovCisgICAgdWludDY0X3QgcnhfZHJvcHBlZF90b29fc2hvcnQ7ICAgICAgLyoqPCBSZWNlaXZlZCBwYWNrZXRzIGRyb3BwZWQgZHVlIHRvIGxlbmd0aCB0b28gc2hvcnQuICovCisgICAgdWludDY0X3QgcnhfZHJvcHBlZF90b29fbG9uZzsgICAgICAgLyoqPCBSZWNlaXZlZCBwYWNrZXQgZHJvcHBlZCBkdWUgdG8gbGVuZ3RoIHRvbyBsb25nLiAqLworICAgIHVpbnQ2NF90IHJ4X2tleV9lcnJvcjsgICAgICAgICAgICAgIC8qKjwgUmVjZWl2ZWQga2V5IGVycm9ycy4gKi8KKyAgICB1aW50NjRfdCB0eF9wbG9hbXM7ICAgICAgICAgICAgICAgICAvKio8IFRyYW5zbWl0dGVkIFBsb2Ftcy4gKi8KKyAgICB1aW50NjRfdCByeF9wbG9hbXNfZHJvcHBlZDsgICAgICAgICAvKio8IFJlY2VpdmVkIGRyb3BwZWQgUGxvYW1zLiAqLworICAgIHVpbnQ2NF90IHJ4X2FsbG9jYXRpb25zX3ZhbGlkOyAgICAgIC8qKjwgUmVjZWl2ZWQgdmFsaWQgYWxsb2NhdGlvbnMuICovCisgICAgdWludDY0X3QgcnhfYWxsb2NhdGlvbnNfaW52YWxpZDsgICAgLyoqPCBSZWNlaXZlZCBpbnZhbGlkIGFsbG9jYXRpb25zLiAqLworICAgIHVpbnQ2NF90IHJ4X2FsbG9jYXRpb25zX2Rpc2FibGVkOyAgIC8qKjwgUmVjZWl2ZWQgZGlzYWJsZWQgYWxsb2NhdGlvbnMuICovCisgICAgdWludDY0X3QgcnhfcGxvYW1zOyAgICAgICAgICAgICAgICAgLyoqPCBSZWNlaXZlZCBQbG9hbXMuICovCisgICAgdWludDY0X3QgcnhfcGxvYW1zX25vbl9pZGxlOyAgICAgICAgLyoqPCBSZWNlaXZlZCBub24gaWRsZSBQbG9hbXMuICovCisgICAgdWludDY0X3QgcnhfcGxvYW1zX2Vycm9yOyAgICAgICAgICAgLyoqPCBSZWNlaXZlZCBlcnJvciBQbG9hbXMuICovCisgICAgdWludDY0X3QgcnhfY3B1OyAgICAgICAgICAgICAgICAgICAgLyoqPCBSZWNlaXZlZCBDUFUgcGFja2V0cy4gKi8KKyAgICB1aW50NjRfdCByeF9vbWNpOyAgICAgICAgICAgICAgICAgICAvKio8IFJlY2VpdmVkIE9NQ0kgcGFja2V0cy4gKi8KKyAgICB1aW50NjRfdCByeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yOyAvKio8IFJlY2VpdmVkIE9NQ0kgcGFja2V0cyB3aXRoIENSQyBlcnJvcnMuICovCisgICAgdWludDY0X3QgdHhfcGFja2V0czsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc21pdHRlZCBwYWNrZXRzLiAqLworICAgIHVpbnQ2NF90IHR4X3hnZW07ICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNtaXR0ZWQgWEdFTSBmcmFnbWVudHMuICovCisgICAgdWludDY0X3QgdHhfY3B1OyAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc21pdHRlZCBDUFUgcGFja2V0cy4gKi8KKyAgICB1aW50NjRfdCB0eF9vbWNpOyAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zbWl0dGVkIE9NQ0kgcGFja2V0cy4gKi8KKyAgICB1aW50OF90IHR4X2NwdV9vbWNpX3BhY2tldHNfZHJvcHBlZDsgICAgLyoqPCBUcmFuc21pdCBwYWNrZXRzIGRyb3BwZWQgZHVlIHRvIGlsbGVnYWwgbGVuZ3RoLiAqLworICAgIHVpbnQ2NF90IHR4X2Ryb3BwZWRfaWxsZWdhbF9sZW5ndGg7ICAgICAvKio8IFRyYW5zbWl0IHBhY2tldHMgZHJvcHBlZCBkdWUgdG8gaWxsZWdhbCBsZW5ndGguICovCisgICAgdWludDY0X3QgdHhfZHJvcHBlZF90cGlkX21pc3M7ICAgICAgICAgIC8qKjwgVHJhbnNtaXQgcGFja2V0cyBkcm9wcGVkIGR1ZSB0byBUUElEIG1pc3MuICovCisgICAgdWludDY0X3QgdHhfZHJvcHBlZF92aWRfbWlzczsgICAgICAgICAgIC8qKjwgVHJhbnNtaXQgcGFja2V0cyBkcm9wZWQgZHVlIHRvIFZJRCBtaXNzLiAqLworfSBiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXQiIGdyb3VwIG9mICJ4Z3Bvbl9uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX25pX3N0YXQKK3sKKyAgICBiY21vbHRfc3RhdCBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleTsgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX25pX3N0YXQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2NmZyIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2RhdGEKK3sKKyAgICBiY21vbHRfc3RhdF9hbGFybV9jb25maWcgY2ZnOyAgIC8qKjwgU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uICovCit9IGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXRfY2ZnIiBncm91cCBvZiAieGdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZworeworICAgIGJjbW9sdF9zdGF0X2NmZyBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleTsgICAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fbmlfc3RhdF9jZmc7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkIiBncm91cCBvZiAKKyAqICJ4Z3Bvbl9uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X3hncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNwdV9wYWNrZXRzX2ZhaWx1cmUiIGdyb3VwIG9mIHRoZSAieGdwb25fbmkiIAorICogb2JqZWN0LiAKKyAqCisgKiBBIGZhaWx1cmUgd2FzIGVuY291bnRlcmVkIGR1cmluZyB0aGUgImNwdV9wYWNrZXRzIiBwcm94eSBvcGVyYXRpb24uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhCit7CisgICAgYmNtb2x0X3BhY2tldF9pbmplY3Rpb25fZXJyb3IgZXJyb3I7ICAgIC8qKjwgVGhlIGVycm9yIHRoYXQgd2FzIGVuY291bnRlcmVkLiAqLworICAgIGJjbW9sdF94Z3Bvbl9nZW1faWQgZ2VtX3BvcnRfaWQ7ICAgICAgICAvKio8IFRoZSBHRU0gcG9ydCB0aGF0IGNhdXNlZCB0aGUgZXJyb3IuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiY3B1X3BhY2tldHNfZmFpbHVyZSIgZ3JvdXAgb2YgInhncG9uX25pIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleTsgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmU7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQiIGdyb3VwIG9mIAorICogInhncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fbmlfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZDsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJkaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCIgZ3JvdXAgb2YgCisgKiAieGdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImVuYWJsZV9hbGxfb251c19jb21wbGV0ZWQiIGdyb3VwIG9mIAorICogInhncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X3hncG9uX25pX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJsb3MiIGdyb3VwIG9mIHRoZSAieGdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9sb3NfZGF0YQoreworICAgIGJjbW9sdF9zdGF0dXMgc3RhdHVzOyAgIC8qKjwgc3RhdHVzLiAqLworfSBiY21vbHRfeGdwb25fbmlfbG9zX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAibG9zIiBncm91cCBvZiAieGdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9sb3MKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleTsgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfbG9zX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX25pX2xvczsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgIm9udV9kaXNjb3ZlcmVkIiBncm91cCBvZiB0aGUgInhncG9uX25pIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhCit7CisgICAgYmNtb2x0X3NlcmlhbF9udW1iZXIgc2VyaWFsX251bWJlcjsgLyoqPCBzZXJpYWwgbnVtYmVyLiAqLworICAgIHVpbnQzMl90IHJhbmdpbmdfdGltZTsgICAgICAgICAgICAgIC8qKjwgcmFuZ2luZyB0aW1lLiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfaWQgb251X2lkOyAgICAgICAgIC8qKjwgb251X2lkLiAqLworICAgIGJjbW9sdF91cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzIHVwc3RyZWFtX2xpbmVfcmF0ZV9jYXBhYmlsaXRpZXM7IC8qKjwgVXBzdHJlYW0gbGluZSByYXRlIGNhcGFiaWxpdGllcyAqLworICAgIHVpbnQ4X3QgY3VycmVudF9kb3duc3RyZWFtX3Bvbl9pZDsgICAgICAgICAgICAgICAgICAvKio8IFRoZSBQT04tSUQgcmVjZWl2ZWQgYnkgdGhlIE9OVSBpbiBpdHMgY3VycmVudCBkb3duc3RyZWFtIHdhdmVsZW5ndGggY2hhbm5lbCAqLworICAgIHVpbnQ4X3QgY3VycmVudF91cHN0cmVhbV9wb25faWQ7ICAgICAgICAgICAgICAgICAgICAvKio8IFRoZSBQT04tSUQgb2YgdGhlIENoYW5uZWwgUHJvZmlsZSBjb250YWluaW5nIHRoZSBkZXNjcmlwdG9yIG9mIHRoZSB1cHN0cmVhbSB3YXZlbGVuZ3RoIGNoYW5uZWwgaW4gd2hpY2ggdGhlIE9OVSBpcyB0cmFuc21pdHRpbmcgKi8KKyNkZWZpbmUgQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0RBVEFfQ0FMSUJSQVRJT05fUkVDT1JEX0xFTiAgOAorICAgIGJjbW9sdF9hcnJfY2FsaWJyYXRpb25fcmVjb3JkXzggY2FsaWJyYXRpb25fcmVjb3JkOyAvKio8IENhbGlicmF0aW9uIHJlY29yZCAqLworICAgIHVpbnQ4X3QgdHVuaW5nX2dyYW51bGFyaXR5OyAgICAgICAgICAgICAvKio8IFRoZSB0dW5pbmcgZ3JhbnVsYXJpdHkgb2YgdGhlIE9OVSB0cmFuc21pdHRlZCBleHByZXNzZWQgaW4gdW5pdHMgb2YgMUdoei4gVmFsdWUgb2YgMCBpbmRpY2F0ZXMgdGhhdCB0aGUgT05VIGRvZXMgbm90IHN1cHBvcnQgZmluZSB0dW5pbmcgLyBkaXRoZXJpbmcgKi8KKyAgICB1aW50OF90IHN0ZXBfdHVuaW5nX3RpbWU7ICAgICAgICAgICAgICAgLyoqPCBUaGUgdmFsdWUgb2YgdGhlIHR1bmluZyB0aW1lIGZvciBhIHNpbmdsZSBncmFudWxhcml0eSBzdGVwLCBleHByZXNzZWQgaW4gdW5pdCBvZiBQSFkgZnJhbWVzLiBUaGUgdmFsdWUgMCBpbmRpY2F0ZXMgdGhhdCB0aGUgT05VIGRvZXMgbm90IHN1cHBvcnQgZmluZSB0dW5pbmcgLyBkaXRoZXJpbmcgKi8KKyAgICB1aW50OF90IGF0dGVudWF0aW9uOyAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgT05VIGF0dGVudWF0aW9uIGluIHN0ZXBzIG9mIDNkQiBhdCB0aGUgdGltZSBvZiB0aGUgbWVzc2FnZSB0cmFuc21pc3Npb24gYXMgcGFydCBvZiB0aGUgcG93ZXIgbGV2ZWxsaW5nIHJlcG9ydC4gVmFsdWUgb2YgMCByZXByZXNlbnRzIHVuLWF0dGVudWF0ZWQgdHJhbnNtaXNzaW9uICovCisgICAgdWludDhfdCBwb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0aWVzOyAgIC8qKjwgVGhlIE9OVSBzdXBwb3J0cyBhdHRlbnVhdGlvbiBsZXZlbCBpbiBzdGVwIG9mIDNkQiAqLworfSBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJvbnVfZGlzY292ZXJlZCIgZ3JvdXAgb2YgInhncG9uX25pIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAib251X3VwZ3JhZGVfY29tcGxldGUiIGdyb3VwIG9mIHRoZSAieGdwb25fbmkiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEKK3sKKyAgICBiY21vc19ib29sIHN0YXR1czsgIC8qKjwgU3VjY2VzcyBvciBmYWlsdXJlLiAgQWdhaW5zdCBlbnRpcmUgdXBncmFkZSBwcm9jZXNzLiAgVGhpcyBpcyBhZGRlZCBwZXIgQW5hdCdzIHJlcXVlc3QuICovCisgICAgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyIGxpc3Rfb2ZfZmFpbGVkX2VudGl0aWVzOyAgICAvKio8IExpc3Qgb2YgT05VLUlEcyB0aGUgdXBncmFkZSBmYWlsZWQgZm9yLiAqLworfSBiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJvbnVfdXBncmFkZV9jb21wbGV0ZSIgZ3JvdXAgb2YgInhncG9uX25pIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZQoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkIiBncm91cCBvZiB0aGUgCisgKiAieGdwb25fbmkiIG9iamVjdC4gCisgKgorICogQWZ0ZXIgYSBzd2l0Y2hvdmVyIGlzIGNvbXBsZXRlIGFuZCBhbGwgT05VIHJhbmdpbmcgdGltZXMgaGF2ZSBzdGFiaWxpemVkLCAKKyAqIHRoaXMgaW5kaWNhdGlvbiBpcyBzZW50IHRvIGluZm9ybSB0aGUgaG9zdCBvZiBhbGwgbmV3IE9OVSBFUURzLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGEKK3sKKyAgICBiY21vbHRfeGdwb25fb251X2VxZF9saXN0X3UzMiBvbnVzOyAvKio8IE9OVXMuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkIiBncm91cCBvZiAKKyAqICJ4Z3Bvbl9uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleTsgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQiIAorICogZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGEKK3sKKyAgICBiY21vbHRfcmVzdWx0IHJlc3VsdDsgICAvKio8IFJlc3VsdC4gKi8KK30gYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQiIAorICogZ3JvdXAgb2YgInhncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJwcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSIgZ3JvdXAgb2YgCisgKiB0aGUgInhncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YQoreworICAgIGJjbW9sdF90cmFmZmljX3Jlc3VtZV9yZXN1bHQgcmVzdWx0OyAgICAvKio8IFJlc3VsdC4gKi8KK30gYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUiIGdyb3VwIAorICogb2YgInhncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAicm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCIgZ3JvdXAgb2YgdGhlIAorICogInhncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhCit7CisgICAgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl93aW5kb3cgd2luZG93X3R5cGU7ICAgICAgICAgIC8qKjwgU2lsZW50IFdpbmRvdyBvciBDdXQgb2ZmIFdpbmRvdyAqLworICAgIGJjbW9sdF9yb2d1ZV9tZWFzdXJlbWVudF9yZXN1bHQgbWVhc3VyZW1lbnRfc3RhdHVzOyAvKio8IFN0YXR1cyBvZiB0aGUgcm9ndWUgT05VIGRldGVjdGlvbiByZXN1bHQuICovCisgICAgYmNtb2x0X3hncG9uX2FsbG9jX2lkIGFsbG9jX2lkOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgQWxsb2MtSUQgKi8KKyAgICBiY21vbHRfeGdwb25fb251X2lkIG9udV9pZDsgICAgICAgICAgICAgICAgIC8qKjwgT05VLUlEICovCisgICAgYmNtb3NfYm9vbCBpc19kZWxpbmVhdGlvbjsgICAgICAgICAgICAgICAgICAvKio8IEJ1cnN0IERlbGluZWF0aW9uIGRldGVjdGVkIGR1cmluZyB0aGUgcm9ndWUgT05VIGRldGVjdGlvbi4gKi8KKyAgICBiY21vc19ib29sIGlzX2VkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgSXMgRUQuICovCisgICAgYmNtb2x0X3U4X2xpc3RfdTMyIHJ4X2RhdGE7ICAgICAgICAgICAgICAgICAvKio8IENhcHR1cmVkIFBMT0FNdSBtZXNzYWdlIGlmIHRoZSBidXJzdCBkZWxpbmllYXRpb24gd2FzIGRldGVjdGVkLiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfaWQgcGxvYW1fcmVjZWl2ZWRfb251X2lkOyAgLyoqPCBPTlUgSUQgcmVjZWl2ZWQgaW4gdGhlIHBsb2FtICovCisgICAgYmNtb3NfYm9vbCBwbG9hbV9yZWNlaXZlZF9taWNfZXJyb3I7ICAgICAgICAvKio8IE1pYyBlcnJvciBpbiB0aGUgcmVjZWl2ZWQgcGxvYW0gKi8KK30gYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJyb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkIiBncm91cCBvZiAKKyAqICJ4Z3Bvbl9uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInJvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCIgZ3JvdXAgCisgKiBvZiAieGdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQ7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCIgCisgKiBncm91cCBvZiAieGdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0Cit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleTsgICAgLyoqPCBPYmplY3Qga2V5LiAqLworfSBiY21vbHRfeGdwb25fbmlfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkIiBncm91cCAKKyAqIG9mIHRoZSAieGdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhCit7CisgICAgdWludDMyX3QgbnVtYmVyX29mX2RldGVjdGVkX2RlbGltaXRlcjsgIC8qKjwgbnVtYmVyIG9mIGRldGVjdGVkIGRlbGltaXRlci4gKi8KKyAgICBiY21vbHRfc3RhdHVzIGVuZXJneV9kZXRlY3Rfc2lnbmFsOyAgICAgLyoqPCBlbmVyZ3kgZGV0ZWN0IHNpZ25hbC4gKi8KK30gYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQiIAorICogZ3JvdXAgb2YgInhncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfYWxhcm1fY2xlYXJlZCIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9uaSIgCisgKiBvYmplY3QuIAorICoKKyAqIFNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBpcyBubyBsb25nZXIgbWV0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhCit7CisgICAgYmNtb2x0X3hncG9uX25pX3N0YXRfaWQgc3RhdDsgICAvKio8IFN0YXRpc3RpYyBpZGVudGlmaWVyLiAqLworfSBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9hbGFybV9jbGVhcmVkIiBncm91cCBvZiAieGdwb25fbmkiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2FsYXJtX3JhaXNlZCIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9uaSIgCisgKiBvYmplY3QuIAorICoKKyAqIFNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YQoreworICAgIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkIHN0YXQ7ICAgLyoqPCBTdGF0aXN0aWMgaWRlbnRpZmllci4gKi8KK30gYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9hbGFybV9yYWlzZWQiIGdyb3VwIG9mICJ4Z3Bvbl9uaSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0ZV9jaGFuZ2VfY29tcGxldGVkIiBncm91cCBvZiB0aGUgCisgKiAieGdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEKK3sKKyAgICBiY21vbHRfcmVzdWx0IHJlc3VsdDsgICAgICAgICAgICAgICAvKio8IFJlc3VsdC4gKi8KKyAgICBiY21vbHRfcG9uX3N0YXRlIHByZXZpb3VzX3N0YXRlOyAgICAvKio8IFByZXZpb3VzIHN0YXRlLiAqLworICAgIGJjbW9sdF9wb25fc3RhdGUgbmV3X3N0YXRlOyAgICAgICAgIC8qKjwgbmV3IHN0YXRlLiAqLworfSBiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXRlX2NoYW5nZV9jb21wbGV0ZWQiIGdyb3VwIG9mIAorICogInhncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInRvZF9yZXF1ZXN0X2NvbXBsZXRlZCIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9uaSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEKK3sKKyAgICBiY21vbHRfc3RyXzY0IHRvZF9zdHJpbmc7ICAgLyoqPCB0b2Rfc3RyaW5nLiAqLworICAgIHVpbnQ2NF90IHNmYzsgICAgICAgICAgICAgICAvKio8IHNmYy4gKi8KKyAgICB1aW50NjRfdCBydGNfb2Zmc2V0X3NlYzsgICAgLyoqPCBydGNfb2Zmc2V0X3NlYy4gKi8KKyAgICB1aW50MzJfdCBydGNfb2Zmc2V0X25zZWM7ICAgLyoqPCBydGNfb2Zmc2V0X25zZWMuICovCisgICAgYmNtb2x0X3Jlc3VsdCBzdGF0dXM7ICAgICAgIC8qKjwgc3RhdHVzLiAqLworfSBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAidG9kX3JlcXVlc3RfY29tcGxldGVkIiBncm91cCBvZiAieGdwb25fbmkiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiYXV0b19jZmciIGdyb3VwIG9mIHRoZSAieGdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhCit7CisgICAgYmNtb3NfYm9vbCBhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQ7ICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBjcHVfcGFja2V0c19mYWlsdXJlOyAgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImNwdV9wYWNrZXRzX2ZhaWx1cmUiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQ7ICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJkZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBkaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZDsgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImRpc2FibGVfYWxsX29udXNfY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIGVuYWJsZV9hbGxfb251c19jb21wbGV0ZWQ7ICAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAiZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBsb3M7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJsb3MiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgb251X2Rpc2NvdmVyZWQ7ICAgICAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAib251X2Rpc2NvdmVyZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgb251X3VwZ3JhZGVfY29tcGxldGU7ICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAib251X3VwZ3JhZGVfY29tcGxldGUiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQ7ICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJwcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBwcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZDsgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInByb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHByb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lOyAgICAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZDsgICAgICAgICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJyb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHJvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydDsgICAgICAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAicm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0IiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHNlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQ7ICAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAic2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBzdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZDsgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInN0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHN0YXRfYWxhcm1fY2xlYXJlZDsgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInN0YXRfYWxhcm1fY2xlYXJlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBzdGF0X2FsYXJtX3JhaXNlZDsgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzdGF0X2FsYXJtX3JhaXNlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBzdGF0ZV9jaGFuZ2VfY29tcGxldGVkOyAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzdGF0ZV9jaGFuZ2VfY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHRvZF9yZXF1ZXN0X2NvbXBsZXRlZDsgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInRvZF9yZXF1ZXN0X2NvbXBsZXRlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImF1dG9fY2ZnIiBncm91cCBvZiAieGdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZworeworICAgIGJjbW9sdF9hdXRvX2NmZyBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleTsgICAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fbmlfYXV0b19jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJhZGp1c3RfdHhfd2F2ZWxlbmd0aCIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9uaSIgCisgKiBvYmplY3QuIAorICoKKyAqIEluc3RydWN0IGFuIHVuYXNzaWduZWQgT05VIHRvIGFkanVzdCBpdHMgdXBzdHJlYW0gdHJhbnNtaXR0ZXIgd2F2ZWxlbmd0aCAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEKK3sKKyAgICBiY21vbHRfc2VyaWFsX251bWJlciBzZXJpYWxfbnVtYmVyOyAvKio8IFNlcmlhbCBudW1iZXIgKi8KKyAgICBiY21vbHRfZnJlcXVlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uIGZyZXFlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uOyAgICAvKio8IEZyZXF1ZW5jeSBhZGp1c3RtZW50IGRpcmVjdGlvbiAqLworICAgIHVpbnQ4X3QgZnJlcXVlbmN5X2FkanVzdG1lbnRfc2l6ZTsgIC8qKjwgVGhlIHNpemUgb2YgdGhlIGZyZXF1bmN5IGFkanVzdG1lbnQgaW4gdW5pdHMgb2YgMC4xIEdoeiAqLworfSBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJhZGp1c3RfdHhfd2F2ZWxlbmd0aCIgZ3JvdXAgb2YgInhncG9uX25pIiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aAoreworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImRpc2FibGVfc2VyaWFsX251bWJlciIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9uaSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGEKK3sKKyAgICBiY21vbHRfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2NvbnRyb2wgY29udHJvbDsgICAvKio8IGNvbnRyb2wuICovCisgICAgYmNtb2x0X3NlcmlhbF9udW1iZXIgc2VyaWFsX251bWJlcjsgICAgICAgICAgICAgLyoqPCBzZXJpYWwgbnVtYmVyLiAqLworfSBiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiZGlzYWJsZV9zZXJpYWxfbnVtYmVyIiBncm91cCBvZiAieGdwb25fbmkiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcgoreworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInJlc2V0IiBncm91cCBvZiAieGdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9yZXNldAoreworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X3hncG9uX25pX3Jlc2V0OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAicm9ndWVfZGV0ZWN0aW9uX3dpbmRvdyIgZ3JvdXAgb2YgdGhlIAorICogInhncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhCit7CisgICAgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl93aW5kb3cgd2luZG93X3R5cGU7ICAvKio8IFR5cGUgb2Ygc2lsZW50IG1lYXN1cmVtZW50IHRvIGV4ZWN1dGUgKi8KKyAgICBiY21vbHRfeGdwb25fYWxsb2NfaWQgYWxsb2NfaWQ7ICAgICAgICAgICAgIC8qKjwgQUxMT0MgSUQgdG8gc2NhbiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfaWQgb251X2lkOyAgICAgICAgICAgICAgICAgLyoqPCBPTlUgSUQgdG8gc2NhbiAqLworICAgIGJjbW9zX2Jvb2wgc2Vjb25kX3Jhbmdpbmdfd2luZG93OyAgICAgICAgICAgLyoqPCBOb3QgY3VycmVudGx5IHN1cHBvcnRlZCAqLworfSBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInJvZ3VlX2RldGVjdGlvbl93aW5kb3ciIGdyb3VwIG9mIAorICogInhncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdworeworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInJ1bl9zcGVjaWFsX2J3X21hcCIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9uaSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2RhdGEKK3sKKyAgICB1aW50OF90IG51bWJlcl9vZl9jeWNsZTsgICAgLyoqPCBudW1iZXIgb2YgY3ljbGUuICovCisgICAgdWludDhfdCBhbGxvY2F0aW9uX251bWJlcjsgIC8qKjwgYWxsb2NhdGlvbiBudW1iZXIuICovCisgICAgdWludDhfdCBid19tYXBfYXJyYXk7ICAgICAgIC8qKjwgYncgbWFwIGFycmF5LiAqLworfSBiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAicnVuX3NwZWNpYWxfYndfbWFwIiBncm91cCBvZiAieGdwb25fbmkiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcAoreworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXA7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzZXRfb251X3N0YXRlIiBncm91cCBvZiB0aGUgInhncG9uX25pIiBvYmplY3QuIAorICoKKyAqIFNldCB0aGUgb3BlcmF0aW9uIHN0YXRlIG9mIGFsbCBPTlVzLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YQoreworICAgIGJjbW9sdF9vbnVfb3BlcmF0aW9uIG9udV9zdGF0ZTsgLyoqPCBOZXcgb3BlcmF0aW9uIHN0YXRlIG9mIGFsbCBPTlVzLiAgVGhlIGRlZmF1bHQgb3BlcmF0aW9uIG1heSBiZSBjb25maWd1cmVkIGJ5IHRoZSBYR1BPTiBOSSBjb25maWd1cmF0aW9uIG9iamVjdCA6IHhncG9uX25pLmNmZy5zbl9hY3F1aXNpdGlvbi4gKi8KK30gYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzZXRfb251X3N0YXRlIiBncm91cCBvZiAieGdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlCit7CisgICAgYmNtb2x0X29wZXIgaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleTsgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInNldF9wb25fc3RhdGUiIGdyb3VwIG9mIHRoZSAieGdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGEKK3sKKyAgICBiY21vbHRfcG9uX29wZXJhdGlvbiBwb25fc3RhdGU7IC8qKjwgUE9OIHN0YXRlLiAqLworfSBiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInNldF9wb25fc3RhdGUiIGdyb3VwIG9mICJ4Z3Bvbl9uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGUKK3sKKyAgICBiY21vbHRfb3BlciBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInNpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmciIAorICogZ3JvdXAgb2YgInhncG9uX25pIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fbmlfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZworeworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXk7ICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X3hncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3Jpbmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGFydF9vbnVfdXBncmFkZSIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9uaSIgCisgKiBvYmplY3QuIAorICoKKyAqIE9MVCB0byBPTlUgZmlybXdhcmUgdHJhbnNmZXIgCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhCit7CisgICAgYmNtb2x0X3Bvbl9vbnVfaWRfbGlzdF91MzIgbGlzdF9vZl9vbnVfaWRzOyAvKio8IExpc3Qgb2YgT05VIElEcyB0byB1cGdyYWRlIHRoZSBmaXJtd2FyZS4gKi8KK30gYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhcnRfb251X3VwZ3JhZGUiIGdyb3VwIG9mICJ4Z3Bvbl9uaSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGUKK3sKKyAgICBiY21vbHRfb3BlciBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5OyAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGU7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAidG9kX3JlcXVlc3QiIGdyb3VwIG9mICJ4Z3Bvbl9uaSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0Cit7CisgICAgYmNtb2x0X29wZXIgaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleTsgICAgLyoqPCBPYmplY3Qga2V5LiAqLworfSBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3Q7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJicm9hZGNhc3RfcGxvYW1fcGFja2V0IiBncm91cCBvZiB0aGUgCisgKiAieGdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGEKK3sKKyNkZWZpbmUgQkNNT0xUX1hHUE9OX05JX0JST0FEQ0FTVF9QTE9BTV9QQUNLRVRfREFUQV9QTE9BTV9MRU4gICA0MAorICAgIGJjbW9sdF9hcnJfdThfNDAgcGxvYW07IC8qKjwgcGxvYW0uICovCit9IGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiYnJvYWRjYXN0X3Bsb2FtX3BhY2tldCIgZ3JvdXAgb2YgCisgKiAieGdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0Cit7CisgICAgYmNtb2x0X3Byb3h5IGhkcjsgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleTsgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiY3B1X3BhY2tldHMiIGdyb3VwIG9mIHRoZSAieGdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhCit7CisgICAgYmNtb2x0X3BhY2tldF90eXBlIHBhY2tldF90eXBlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgcGFja2V0IHR5cGUuICovCisgICAgYmNtb3NfYm9vbCBjYWxjX2NyYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgY2FsYyBjcmMuICovCisgICAgYmNtb2x0X3hncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNiBnZW1fcG9ydF9saXN0OyAgIC8qKjwgZ2VtIHBvcnQgbGlzdC4gKi8KKyAgICBiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDggYnVmZmVyOyAgICAgICAgICAgICAgICAgLyoqPCBidWZmZXIuICovCit9IGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImNwdV9wYWNrZXRzIiBncm91cCBvZiAieGdwb25fbmkiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0cworeworICAgIGJjbW9sdF9wcm94eSBoZHI7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXk7ICAgICAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHM7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJrZXkiIGdyb3VwIG9mIHRoZSAieGdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X2tleQoreworICAgIGJjbW9sdF94Z3Bvbl9uaSBwb25fbmk7ICAgICAvKio8IFBPTiBuZXR3b3JrIGludGVyZmFjZS4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2lkIG9udV9pZDsgLyoqPCBvbnUgaWQuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfa2V5OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiY2ZnIiBncm91cCBvZiB0aGUgInhncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YQoreworICAgIGJjbW9sdF9vbnVfc3RhdGUgb251X3N0YXRlOyAgICAgLyoqPCBDdXJyZW50IE9OVSBzdGF0ZSAqLworICAgIGJjbW9sdF9vbnVfc3RhdGUgb251X29sZF9zdGF0ZTsgLyoqPCBvbnUgb2xkIHN0YXRlLiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGUgYWxhcm1fc3RhdGU7ICAgLyoqPCBTdGF0ZSBvZiBhbGwgT05VIGFsYXJtcy4gIFRoaXMgaXMgbm9ybWFsbHkgcmVhZC1vbmx5IGFuZCBjYW4gb25seSBiZSB3cml0dGVuIHdoZW4gdGhlIFBPTiBpcyBpbiBhY3RpdmUtc3RhbmRieSBtb2RlIHRvIGtlZXAgdGhlIE9OVSBpbiBzeW5jLiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXMgcmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5czsgICAgLyoqPCBBRVMgZW5jcnlwdGlvbiBrZXlzIGxlYXJuZWQgZHVyaW5nIE9OVSByZWdpc3RyYXRpb24uICBUaGlzIGlzIG5vcm1hbGx5IHJlYWQtb25seSBhbmQgY2FuIG9ubHkgYmUgd3JpdHRlbiB3aGVuIHRoZSBQT04gaXMgaW4gYWN0aXZlLXN0YW5kYnkgbW9kZSB0byBrZWVwIHRoZSBPTlUgaW4gc3luYy4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2Flc19rZXkgY3VycmVudF9lbmNyeXB0aW9uX2tleTsgICAgICAgICAgICAgICAgICAgIC8qKjwgQ3VycmVudCBBRVMgZW5jcnlwdGlvbiBrZXkuICBUaGlzIGlzIG5vcm1hbGx5IHJlYWQtb25seSBhbmQgY2FuIG9ubHkgYmUgd3JpdHRlbiB3aGVuIHRoZSBQT04gaXMgaW4gYWN0aXZlLXN0YW5kYnkgbW9kZSB0byBrZWVwIHRoZSBPTlUgaW4gc3luYy4gKi8KKyAgICBiY21vbHRfc2VyaWFsX251bWJlciBzZXJpYWxfbnVtYmVyOyAgICAgICAgICAgICAgICAgLyoqPCBPTlUgc2VyaWFsIG51bWJlciAqLworI2RlZmluZSBCQ01PTFRfWEdQT05fT05VX0NGR19EQVRBX1JFR0lTVFJBVElPTl9JRF9MRU4gICAzNgorICAgIGJjbW9sdF9hcnJfdThfMzYgcmVnaXN0cmF0aW9uX2lkOyAgICAgICAgICAgICAgICAgICAvKio8IE9OVSByZWdpc3RyYXRpb24gSUQgKi8KKyAgICBiY21vc19ib29sIHJlZ2lzdHJhdGlvbl9pZF9hdXRvX2xlYXJuaW5nOyAgICAgICAgICAgLyoqPCBFbmFibGVcRGlzYWJsZSBhdXRvbWF0aWMgcmVnaXN0cmF0aW9uIGxlYXJuaW5nICovCisgICAgYmNtb2x0X2J1cnN0X3Byb2ZpbGVfaW5kZXggcmFuZ2luZ19idXJzdF9wcm9maWxlOyAgIC8qKjwgQnVyc3QgcHJvZmlsZSBpbmRleCBmb3IgcmFuZ2luZyBhbGxvY2F0aW9ucyAqLworICAgIGJjbW9sdF9idXJzdF9wcm9maWxlX2luZGV4IGRhdGFfYnVyc3RfcHJvZmlsZTsgICAgICAvKio8IEJ1cnN0IHByb2ZpbGUgaW5kZXggZm9yIGRhdGEgYWxsb2NhdGlvbnMgKi8KKyAgICB1aW50MzJfdCByYW5naW5nX3RpbWU7ICAgICAgICAgICAgICAgICAgLyoqPCBPTlUgcmFuZ2luZyB0aW1lLiAgVGhpcyBpcyBub3JtYWxseSByZWFkLW9ubHkgYW5kIGNhbiBvbmx5IGJlIHdyaXR0ZW4gd2hlbiB0aGUgUE9OIGlzIGluIGFjdGl2ZS1zdGFuZGJ5IG1vZGUgdG8ga2VlcCB0aGUgT05VIGluIHN5bmMuICovCisgICAgYmNtb2x0X3N0YXR1cyBkaXNhYmxlZF9hZnRlcl9kaXNjb3Zlcnk7IC8qKjwgVGhpcyBPTlUgd2FzIGRpc2FibGVkIGFmdGVyIFNOIGRpc2NvdmVyeSAqLworICAgIGJjbW9sdF9kZWFjdGl2YXRpb25fcmVhc29uIGRlYWN0aXZhdGlvbl9yZWFzb247ICAgICAgICAgICAgICAgICAgICAgLyoqPCBkZWFjdGl2YXRpb24gcmVhc29uLiAqLworICAgIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTYgYWxsX2dlbV9wb3J0czsgICAgLyoqPCBBbGwgdW5pY2FzdCBHRU0gcG9ydHMgY3VycmVudGx5IHByb3Zpc2lvbmVkIG9uIHRoaXMgT05VLiAqLworICAgIGJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMiBhbGxfYWxsb2NzOyAgICAgICAgICAgLyoqPCBBbGwgYWxsb2MgSURzIGN1cnJlbnRseSBwcm92aXNpb25lZCBvbiB0aGlzIE9OVS4gKi8KKyAgICBiY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZSBleHRlbmRlZF9ndWFyZF90aW1lOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgQWRkaXRpb25hbCBndWFyZCB0aW1lIChpbiBieXRlcykgZm9yIHRoaXMgT05VLiAqLworICAgIGJjbW9sdF91cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzIHVzX2xpbmVfcmF0ZTsgICAgICAgICAgICAgICAgLyoqPCBVUyBsaW5lIHJhdGUuICovCisjZGVmaW5lIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0RBVEFfQ0FMSUJSQVRJT05fUkVDT1JEX0xFTiAgICA4CisgICAgYmNtb2x0X2Fycl9jYWxpYnJhdGlvbl9yZWNvcmRfOCBjYWxpYnJhdGlvbl9yZWNvcmQ7ICAgICAgICAgICAgICAgICAvKio8IENhbGlicmF0aW9uIHJlY29yZC4gKi8KKyAgICB1aW50OF90IHR1bmluZ19ncmFudWxhcml0eTsgICAgICAgICAgICAgLyoqPCBUaGUgdHVuaW5nIGdyYW51bGFyaXR5IG9mIHRoZSBPTlUgdHJhbnNtaXR0ZWQgZXhwcmVzc2VkIGluIHVuaXRzIG9mIDFHSHouIFZhbHVlIG9mIDAgaW5kaWNhdGVzIHRoYXQgdGhlIE9OVSBkb2VzIG5vdCBzdXBwb3J0IGZpbmUgdHVuaW5nL2RpdGhlcmluZyAqLworICAgIHVpbnQ4X3Qgc3RlcF90dW5pbmdfdGltZTsgICAgICAgICAgICAgICAvKio8IFRoZSB2YWx1ZSBvZiB0aGUgdHVuaW5nIHRpbWUgZm9yIGEgc2luZ2xlIGdyYW51bGFyaXR5IHN0ZXAsIGV4cHJlc3NlZCBpbiB1bml0cyBvZiBQSFkgZnJhbWVzLiAqLworICAgIHVpbnQ4X3QgcG93ZXJfbGV2ZWxsaW5nX2NhcGFiaWxpdGllczsgICAvKio8IFBvd2VyIGxldmVsbGluZyBjYXBhYmlsaXRpZXMuICovCisgICAgYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cyByZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXM7IC8qKjwgVGhpcyB2YWx1ZSBpbmRpY2F0ZSB0aGF0IHRoZSBvbnUgaXMgaW4gdGhlIG1pZGRsZSBvZiByZXF1ZXN0IHJlZ2lzdHJhdGlvbiBwcm9jZXNzICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiY2ZnIiBncm91cCBvZiAieGdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X2NmZworeworICAgIGJjbW9sdF9jZmcgaGRyOyAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleTsgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fb251X2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXQiIGdyb3VwIG9mIHRoZSAieGdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YQoreworICAgIHVpbnQ2NF90IHBvc2l0aXZlX2RyaWZ0OyAgICAgICAgICAgIC8qKjwgcG9zaXRpdmUgZHJpZnQuICovCisgICAgdWludDY0X3QgbmVnYXRpdmVfZHJpZnQ7ICAgICAgICAgICAgLyoqPCBuZWdhdGl2ZSBkcmlmdC4gKi8KKyAgICB1aW50NjRfdCBkZWxpbWl0ZXJfbWlzc19kZXRlY3Rpb247ICAvKio8IGRlbGltaXRlciBtaXNzIGRldGVjdGlvbi4gKi8KKyAgICB1aW50NjRfdCBiaXAzMl9lcnJvcnM7ICAgICAgICAgICAgICAvKio8IGJpcDMyIGVycm9ycy4gKi8KKyAgICB1aW50NjRfdCByeF93b3JkczsgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiA0LWJ5dGUgd29yZHMgcmVjZWl2ZWQgKHdvcmQgc2l6ZSBpcyA0IGJ5dGVzIHJlZ2FyZGxlc3Mgb2YgdXBzdHJlYW0gZGF0YSByYXRlKS4gKi8KKyAgICB1aW50NjRfdCBmZWNfY29ycmVjdGVkX3N5bWJvbHM7ICAgICAvKio8IGZlYyBjb3JyZWN0ZWQgc3ltYm9scy4gKi8KKyAgICB1aW50NjRfdCBmZWNfY29ycmVjdGVkX2NvZGV3b3JkczsgICAvKio8IGZlYyBjb3JyZWN0ZWQgY29kZXdvcmRzLiAqLworICAgIHVpbnQ2NF90IGZlY191bmNvcnJlY3RhYmxlX2NvZGV3b3JkczsgICAvKio8IGZlYyB1bmNvcnJlY3RhYmxlIGNvZGV3b3Jkcy4gKi8KKyAgICB1aW50NjRfdCBmZWNfY29kZXdvcmRzOyAgICAgICAgICAgICAgICAgLyoqPCBmZWMgdG90YWwgY29kZXdvcmRzLiAqLworICAgIHVpbnQ2NF90IGZlY19jb3JyZWN0ZWRfYml0czsgICAgICAgICAgICAvKio8IGZlYyBjb3JyZWN0ZWQgYml0cy4gKi8KKyAgICB1aW50NjRfdCB4Z2VtX2tleV9lcnJvcnM7ICAgICAgICAgICAgICAgLyoqPCB4Z2VtIGtleSBlcnJvci4gKi8KKyAgICB1aW50NjRfdCB4Z2VtX2xvc3M7ICAgICAgICAgICAgICAgICAgICAgLyoqPCB4Z2VtIGxvc3MgLiAqLworICAgIHVpbnQ2NF90IHJ4X3Bsb2Ftc19taWNfZXJyb3I7ICAgICAgICAgICAvKio8IG1pYyBlcnJvciBwbG9hbS4gKi8KKyAgICB1aW50NjRfdCByeF9wbG9hbXNfbm9uX2lkbGU7ICAgICAgICAgICAgLyoqPCBub24gaWRsZSBwbG9hbS4gKi8KKyAgICB1aW50NjRfdCByeF9vbWNpOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBSZWNlaXZlZCBPTUNJIHBhY2tldHMuICovCisgICAgdWludDY0X3Qgcnhfb21jaV9wYWNrZXRzX2NyY19lcnJvcjsgICAgIC8qKjwgUmVjZWl2ZWQgT01DSSBwYWNrZXRzIHdpdGggQ1JDIGVycm9ycy4gKi8KKyAgICB1aW50NjRfdCByeF9ieXRlczsgICAgICAgICAgICAgICAgICAgICAgLyoqPCByeCBieXRlcy4gKi8KKyAgICB1aW50NjRfdCByeF9wYWNrZXRzOyAgICAgICAgICAgICAgICAgICAgLyoqPCByeCBwYWNrZXRzLiAqLworICAgIHVpbnQ2NF90IHR4X2J5dGVzOyAgICAgICAgICAgICAgICAgICAgICAvKio8IHR4IGJ5dGVzLiAqLworICAgIHVpbnQ2NF90IHR4X3BhY2tldHM7ICAgICAgICAgICAgICAgICAgICAvKio8IHR4IHBhY2tldHMuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXQiIGdyb3VwIG9mICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdAoreworICAgIGJjbW9sdF9zdGF0IGhkcjsgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXk7ICAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fb251X3N0YXQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2NmZyIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YQoreworICAgIGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyBjZmc7ICAgLyoqPCBTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4gKi8KK30gYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN0YXRfY2ZnIiBncm91cCBvZiAieGdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X3N0YXRfY2ZnCit7CisgICAgYmNtb2x0X3N0YXRfY2ZnIGhkcjsgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXk7ICAgICAgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJkZmkiIGdyb3VwIG9mIHRoZSAieGdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X2RmaV9kYXRhCit7CisgICAgYmNtb2x0X3N0YXR1cyBhbGFybV9zdGF0dXM7IC8qKjwgYWxhcm0gc3RhdHVzLiAqLworfSBiY21vbHRfeGdwb25fb251X2RmaV9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImRmaSIgZ3JvdXAgb2YgInhncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9kZmkKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXk7ICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2RmaV9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX29udV9kZmk7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJkZ2kiIGdyb3VwIG9mIHRoZSAieGdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X2RnaV9kYXRhCit7CisgICAgYmNtb2x0X3N0YXR1cyBhbGFybV9zdGF0dXM7IC8qKjwgYWxhcm0gc3RhdHVzLiAqLworfSBiY21vbHRfeGdwb25fb251X2RnaV9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImRnaSIgZ3JvdXAgb2YgInhncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9kZ2kKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXk7ICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2RnaV9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX29udV9kZ2k7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJkb3dpIiBncm91cCBvZiB0aGUgInhncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9kb3dpX2RhdGEKK3sKKyAgICBiY21vbHRfc3RhdHVzIGFsYXJtX3N0YXR1czsgLyoqPCBBbGFybSBzdGF0dXMuICovCisgICAgaW50MzJfdCBkcmlmdF92YWx1ZTsgICAgICAgIC8qKjwgQ2FsY3VsYXRlZCBhbW91bnQgb2YgZHJpZnQgKHBvc2l0aXZlICsgbmVnYXRpdmUgYXMgYSBzaWduZWQgdmFsdWUpLiAqLworICAgIHVpbnQzMl90IG5ld19lcWQ7ICAgICAgICAgICAvKio8IE5ldyBFUUQgYWZ0ZXIgZHJpZnQgaXMgY29ycmVjdGVkIChvbmx5IHZhbGlkIGlmIHN0YXR1cyBpcyAnb24nKS4gKi8KK30gYmNtb2x0X3hncG9uX29udV9kb3dpX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiZG93aSIgZ3JvdXAgb2YgInhncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9kb3dpCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleTsgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2Rvd2lfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfZG93aTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImludmFsaWRfZGJydV9yZXBvcnQiIGdyb3VwIG9mIHRoZSAieGdwb25fb251IiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhCit7CisgICAgYmNtb2x0X3hncG9uX2FsbG9jX2lkIGFsbG9jX2lkOyAvKio8IEFsbG9jLUlELiAqLworfSBiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJpbnZhbGlkX2RicnVfcmVwb3J0IiBncm91cCBvZiAieGdwb25fb251IiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleV9leGNoYW5nZV9jb21wbGV0ZWQiIGdyb3VwIG9mIHRoZSAKKyAqICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhCit7CisgICAgYmNtb2x0X3hncG9uX29udV9hZXNfa2V5IG5ld19rZXk7ICAgLyoqPCBuZXcga2V5LiAqLworfSBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJrZXlfZXhjaGFuZ2VfY29tcGxldGVkIiBncm91cCBvZiAKKyAqICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWQ7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAia2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQiIGdyb3VwIG9mIAorICogInhncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2giIGdyb3VwIG9mIHRoZSAKKyAqICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhCit7CisgICAgYmNtb2x0X2Flc19rZXkgZXhwZWN0ZWRfa2V5OyAgICAvKio8IGV4cGVjdGVkIGtleS4gKi8KKyAgICBiY21vbHRfYWVzX2tleSByZWNlaXZlZF9rZXk7ICAgIC8qKjwgcmVjZWl2ZWQga2V5LiAqLworfSBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJrZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoIiBncm91cCBvZiAKKyAqICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImtleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0IiBncm91cCBvZiAKKyAqICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleTsgICAvKio8IE9iamVjdCBrZXkuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJsb29jaSIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YQoreworICAgIGJjbW9sdF9zdGF0dXMgYWxhcm1fc3RhdHVzOyAvKio8IGFsYXJtIHN0YXR1cy4gKi8KK30gYmNtb2x0X3hncG9uX29udV9sb29jaV9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImxvb2NpIiBncm91cCBvZiAieGdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X2xvb2NpCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleTsgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2xvb2NpX2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2k7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJvbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQiIGdyb3VwIG9mIHRoZSAKKyAqICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGEKK3sKKyAgICBiY21vbHRfcmVzdWx0IHN0YXR1czsgICAvKio8IHN0YXR1cy4gKi8KKyAgICBiY21vbHRfYWN0aXZhdGlvbl9mYWlsX3JlYXNvbiBmYWlsX3JlYXNvbjsgIC8qKjwgZmFpbCByZWFzb24uICovCisjZGVmaW5lIEJDTU9MVF9YR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0RBVEFfUkVHSVNUUkFUSU9OX0lEX0xFTiAgMzYKKyAgICBiY21vbHRfYXJyX3U4XzM2IHJlZ2lzdHJhdGlvbl9pZDsgICAgICAgICAgIC8qKjwgcmVnaXN0cmF0aW9uIGlkLiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXMgcmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5czsgICAgLyoqPCByZWdpc3RyYXRpb24gZW5jcnlwdGlvbiBrZXlzLiAqLworfSBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgIm9udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCIgZ3JvdXAgb2YgCisgKiAieGdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhIGRhdGE7ICAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJvbnVfYWxhcm0iIGdyb3VwIG9mIHRoZSAieGdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X29udV9hbGFybV9kYXRhCit7CisgICAgYmNtb2x0X3hncG9uX29udV9hbGFybXMgb251X2FsYXJtOyAgLyoqPCBvbnUgYWxhcm0uICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAib251X2FsYXJtIiBncm91cCBvZiAieGdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X29udV9hbGFybQoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5OyAgICAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X29udV9hbGFybV9kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fb251X29udV9hbGFybTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgIm9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkIiBncm91cCBvZiB0aGUgCisgKiAieGdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGEKK3sKKyAgICBiY21vbHRfcmVzdWx0IHN0YXR1czsgICAvKio8IFN0YXR1cy4gKi8KK30gYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgIm9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkIiBncm91cCBvZiAKKyAqICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleTsgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJvbnVfZGlzYWJsZV9jb21wbGV0ZWQiIGdyb3VwIG9mIHRoZSAKKyAqICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGEKK3sKKyAgICBiY21vbHRfc2VyaWFsX251bWJlciBzZXJpYWxfbnVtYmVyOyAvKio8IHNlcmlhbCBudW1iZXIuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAib251X2Rpc2FibGVfY29tcGxldGVkIiBncm91cCBvZiAKKyAqICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAib251X2VuYWJsZV9jb21wbGV0ZWQiIGdyb3VwIG9mIHRoZSAieGdwb25fb251IiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YQoreworICAgIGJjbW9sdF9zZXJpYWxfbnVtYmVyIHNlcmlhbF9udW1iZXI7IC8qKjwgc2VyaWFsIG51bWJlci4gKi8KK30gYmNtb2x0X3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgIm9udV9lbmFibGVfY29tcGxldGVkIiBncm91cCBvZiAieGdwb25fb251IiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleTsgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhIGRhdGE7ICAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgIm9udV90dW5pbmdfaW5fY29tcGxldGVkIiBncm91cCBvZiB0aGUgCisgKiAieGdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2RhdGEKK3sKKyAgICBiY21vbHRfcmVzdWx0IHJlc3VsdDsgICAgICAgICAgICAgICAgICAgLyoqPCByZXN1bHQuICovCisgICAgYmNtb2x0X3R1bmVfaW5fZmFpbF9yZWFzb24gZmFpbF9yZWFzb247IC8qKjwgZmFpbCByZWFzb24uICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJvbnVfdHVuaW5nX2luX2NvbXBsZXRlZCIgZ3JvdXAgb2YgCisgKiAieGdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWRfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJvbnVfdHVuaW5nX291dF9jb21wbGV0ZWQiIGdyb3VwIG9mIHRoZSAKKyAqICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2RhdGEKK3sKKyAgICBiY21vbHRfcmVzdWx0IHJlc3VsdDsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgcmVzdWx0LiAqLworICAgIGJjbW9sdF90dW5lX291dF9mYWlsX3JlYXNvbiBmYWlsX3JlYXNvbjsgICAgLyoqPCBmYWlsIHJlYXNvbi4gKi8KK30gYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJvbnVfdHVuaW5nX291dF9jb21wbGV0ZWQiIGdyb3VwIG9mIAorICogInhncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleTsgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgIm9wdGljYWxfcmVmbGVjdGlvbiIgZ3JvdXAgb2YgInhncG9uX29udSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X29wdGljYWxfcmVmbGVjdGlvbgoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X3hncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb247CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJwb3NzaWJsZV9kcmlmdCIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9vbnUiIAorICogb2JqZWN0LiAKKyAqCisgKiBBbiBPTlUgaW4gYSBsb3cgcG93ZXIgc3RhdGUgbWF5IGJlIGV4cGVyaWVuY2luZyBkcmlmdCBiZXlvbmQgdGhlIGNvbmZpZ3VyZWQgCisgKiB0aHJlc2hvbGQuIFRoZSBlc3RpbWF0ZSBtYXkgYmUgaW5hY2N1cmF0ZSBkZXBlbmRpbmcgb24gT05VIGJlaGF2aW9yLiBBY3R1YWwgCisgKiBkcmlmdCBtYXkgYmUgbGVzcyB0aGFuIGVzdGltYXRlZC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YQoreworICAgIGJjbW9sdF9zdGF0dXMgYWxhcm1fc3RhdHVzOyAvKio8IE9uOiBlc3RpbWF0ZWQgZHJpZnQgaGFzIGV4Y2VlZGVkIHRoZSBjb25maWd1cmVkIHRocmVzaG9sZC4gKi8KKyAgICBpbnQzMl90IGVzdGltYXRlZF9kcmlmdDsgICAgLyoqPCBJZiBzdGF0dXMgaXMgb24sIHRoZSBlc3RpbWF0ZWQgZHJpZnQgdmFsdWUsIG90aGVyd2lzZSB6ZXJvICgwKS4gKi8KK30gYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInBvc3NpYmxlX2RyaWZ0IiBncm91cCBvZiAieGdwb25fb251IiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleTsgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhIGRhdGE7ICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJwb3dlcl9jb25zdW1wdGlvbl9yZXBvcnQiIGdyb3VwIG9mIHRoZSAKKyAqICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKgorICogUG93ZXIgY29uc3VtcHRpb24gcmVwb3J0IAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9kYXRhCit7CisjZGVmaW5lIEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfQ09OU1VNUFRJT05fUkVQT1JUX0RBVEFfUE9XRVJfQ09OU1VNUFRJT05fUkVQT1JUX0xFTiA4CisgICAgYmNtb2x0X2Fycl9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF84IHBvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydDsgLyoqPCBwb3dlciBjb25zdW1wdGlvbiByZXBvcnQuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAicG93ZXJfY29uc3VtcHRpb25fcmVwb3J0IiBncm91cCBvZiAKKyAqICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0Cit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInBvd2VyX2xldmVsX3JlcG9ydCIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9vbnUiIAorICogb2JqZWN0LiAKKyAqCisgKiBQb3dlciBsZXZlbCByZXBvcnQgCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2RhdGEKK3sKKyAgICB1aW50OF90IGF0dGVudWF0aW9uOyAgICAgICAgICAgICAgICAvKio8IEF0dGVudWF0aW9uLiAqLworICAgIHVpbnQ4X3QgcG93ZXJfbGV2ZWxsaW5nX2NhcGFiaWxpdHk7IC8qKjwgUG93ZXIgbGV2ZWxsaW5nIGNhcGFiaWxpdHkuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAicG93ZXJfbGV2ZWxfcmVwb3J0IiBncm91cCBvZiAieGdwb25fb251IiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0Cit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSIgZ3JvdXAgb2YgdGhlIAorICogInhncG9uX29udSIgb2JqZWN0LiAKKyAqCisgKiBOb3RpZmljYXRpb24gdGhhdCBhbiBPTlVzIHBvd2VyIG1hbmFnZW1lbnQgc3RhdGUgaGFzIGNoYW5nZWQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGEKK3sKKyAgICBiY21vbHRfb251X3N0YXRlIG9sZF9zdGF0ZTsgLyoqPCBUaGUgc3RhdGUgdGhlIE9OVSB3YXMgcHJldmlvdXNseSBpbi4gKi8KKyAgICBiY21vbHRfb251X3N0YXRlIG5ld19zdGF0ZTsgLyoqPCBUaGUgc3RhdGUgdGhlIE9OVSBpcyBjdXJyZW50bHkgaW4uICovCisgICAgYmNtb2x0X3Bvd2VyX21hbmFnZW1lbnRfdHJhbnNpdGlvbl9yZWFzb24gcmVhc29uOyAgIC8qKjwgVGhlIHJlYXNvbiBmb3IgdGhlIHN0YXRlIGNoYW5nZS4gKi8KK30gYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInBvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlIiBncm91cCBvZiAKKyAqICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleTsgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAicHFzaSIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhCit7CisgICAgYmNtb2x0X3N0YXR1cyBhbGFybV9zdGF0dXM7IC8qKjwgYWxhcm0gc3RhdHVzLiAqLworfSBiY21vbHRfeGdwb25fb251X3Bxc2lfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJwcXNpIiBncm91cCBvZiAieGdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X3Bxc2kKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5OyAgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhIGRhdGE7ICAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX29udV9wcXNpOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAicmFuZ2luZ19jb21wbGV0ZWQiIGdyb3VwIG9mIHRoZSAieGdwb25fb251IiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YQoreworICAgIGJjbW9sdF9yZXN1bHQgc3RhdHVzOyAgICAgICAgICAgICAgICAgICAvKio8IHN0YXR1cy4gKi8KKyAgICBiY21vbHRfcmFuZ2luZ19mYWlsX3JlYXNvbiBmYWlsX3JlYXNvbjsgLyoqPCBmYWlsIHJlYXNvbi4gKi8KKyAgICB1aW50MzJfdCBlcWQ7ICAgICAgICAgICAgICAgLyoqPCBFUUQuICovCisgICAgdWludDhfdCBudW1iZXJfb2ZfcGxvYW1zOyAgIC8qKjwgbnVtYmVyIG9mIHBsb2Ftcy4gKi8KKyAgICB1aW50OF90IHBvd2VyX2xldmVsOyAgICAgICAgLyoqPCBwb3dlciBsZXZlbC4gKi8KK30gYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInJhbmdpbmdfY29tcGxldGVkIiBncm91cCBvZiAieGdwb25fb251IiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleTsgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhIGRhdGE7ICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAicmVnaXN0cmF0aW9uX2lkIiBncm91cCBvZiB0aGUgInhncG9uX29udSIgCisgKiBvYmplY3QuIAorICoKKyAqIFJlZ2lzdHJhdGlvbiBJRCAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YQoreworI2RlZmluZSBCQ01PTFRfWEdQT05fT05VX1JFR0lTVFJBVElPTl9JRF9EQVRBX1JFR0lTVFJBVElPTl9JRF9MRU4gICAzNgorICAgIGJjbW9sdF9hcnJfdThfMzYgcmVnaXN0cmF0aW9uX2lkOyAgICAgICAgICAgLyoqPCBSZWdpc3RyYXRpb24gSUQuICovCisgICAgYmNtb2x0X3Jlc3VsdCByZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXM7ICAvKio8IHJlcXVlc3QgcmVnaXN0cmF0aW9uIHN0YXR1cy4gKi8KKyAgICBiY21vbHRfcmVxdWVzdF9yZWdpc3RyYXRpb25fZmFpbF9yZWFzb24gcmVxdWVzdF9yZWdpc3RyYXRpb25fZmFpbF9yZWFzb247ICAgLyoqPCByZXF1ZXN0IHJlZ2lzdHJhdGlvbiBmYWlsIHJlYXNvbi4gKi8KK30gYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJyZWdpc3RyYXRpb25faWQiIGdyb3VwIG9mICJ4Z3Bvbl9vbnUiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWQKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleTsgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YSBkYXRhOyAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAicnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQiIGdyb3VwIG9mIHRoZSAKKyAqICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YQoreworICAgIGJjbW9sdF9yZXN1bHQgc3RhdHVzOyAgIC8qKjwgc3RhdHVzLiAqLworICAgIGJjbW9sdF9yc3NpX21lYXN1cmVtZW50X2ZhaWxfcmVhc29uIGZhaWxfcmVhc29uOyAgICAvKio8IGZhaWwgcmVhc29uLiAqLworfSBiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAicnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQiIGdyb3VwIG9mIAorICogInhncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInNkaSIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfc2RpX2RhdGEKK3sKKyAgICBiY21vbHRfc3RhdHVzIGFsYXJtX3N0YXR1czsgLyoqPCBhbGFybSBzdGF0dXMuICovCisgICAgdWludDMyX3QgYmVyOyAgICAgICAgICAgICAgIC8qKjwgSW52ZXJzZSBiaXQgZXJyb3IgcmF0ZSAoZS5nLiBpZiB0aGlzIG51bWJlciBpcyAxMDAwLCB0aGUgQkVSIGlzIDEvMTAwMCkuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfc2RpX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic2RpIiBncm91cCBvZiAieGdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X3NkaQoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleTsgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfc2RpX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fb251X3NkaTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInNlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZSIgZ3JvdXAgb2YgCisgKiB0aGUgInhncG9uX29udSIgb2JqZWN0LiAKKyAqCisgKiBGYWlsdXJlIG9mIHNlY3VyZSBtdXR1YWwgYXV0aGVudGljYXRpb24gZHVlIHRvIE1JQyBlcnJvciAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfZGF0YQoreworICAgIGJjbW9sdF9yZXN1bHQgc3RhdHVzOyAgIC8qKjwgc3RhdHVzLiAqLworICAgIGJjbW9sdF9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWxfcmVhc29uIGZhaWxfcmVhc29uOyAgICAvKio8IHNlY3VyZSBtdXR1YWwgYXV0aGVudGljYXRpb24gZmFpbCByZWFzb24uICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlIiAKKyAqIGdyb3VwIG9mICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInNmaSIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2RhdGEKK3sKKyAgICBiY21vbHRfc3RhdHVzIGFsYXJtX3N0YXR1czsgLyoqPCBhbGFybSBzdGF0dXMuICovCisgICAgdWludDMyX3QgYmVyOyAgICAgICAgICAgICAgIC8qKjwgSW52ZXJzZSBiaXQgZXJyb3IgcmF0ZSAoZS5nLiBpZiB0aGlzIG51bWJlciBpcyAxMDAwLCB0aGUgQkVSIGlzIDEvMTAwMCkuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic2ZpIiBncm91cCBvZiAieGdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X3NmaQoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleTsgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fb251X3NmaTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInN0YXRfYWxhcm1fY2xlYXJlZCIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9vbnUiIAorICogb2JqZWN0LiAKKyAqCisgKiBTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaXMgbm8gbG9uZ2VyIG1ldC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEKK3sKKyAgICBiY21vbHRfeGdwb25fb251X3N0YXRfaWQgc3RhdDsgIC8qKjwgU3RhdGlzdGljIGlkZW50aWZpZXIuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9hbGFybV9jbGVhcmVkIiBncm91cCBvZiAieGdwb25fb251IiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkCit7CisgICAgYmNtb2x0X2F1dG8gaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdGF0X2FsYXJtX3JhaXNlZCIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9vbnUiIAorICogb2JqZWN0LiAKKyAqCisgKiBTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhCit7CisgICAgYmNtb2x0X3hncG9uX29udV9zdGF0X2lkIHN0YXQ7ICAvKio8IFN0YXRpc3RpYyBpZGVudGlmaWVyLiAqLworfSBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic3RhdF9hbGFybV9yYWlzZWQiIGdyb3VwIG9mICJ4Z3Bvbl9vbnUiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZAoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJzdWZpIiBncm91cCBvZiB0aGUgInhncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9zdWZpX2RhdGEKK3sKKyAgICBiY21vbHRfc3RhdHVzIGFsYXJtX3N0YXR1czsgLyoqPCBhbGFybSBzdGF0dXMuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfc3VmaV9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInN1ZmkiIGdyb3VwIG9mICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfc3VmaQoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXk7ICAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX29udV9zdWZpX2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fb251X3N1Zmk7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJ0aXdpIiBncm91cCBvZiB0aGUgInhncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV90aXdpX2RhdGEKK3sKKyAgICBiY21vbHRfc3RhdHVzIGFsYXJtX3N0YXR1czsgLyoqPCBBbGFybSBzdGF0dXMuICovCisgICAgaW50MzJfdCBkcmlmdF92YWx1ZTsgICAgICAgIC8qKjwgQ2FsY3VsYXRlZCBhbW91bnQgb2YgZHJpZnQgKHBvc2l0aXZlICsgbmVnYXRpdmUgYXMgYSBzaWduZWQgdmFsdWUpLiAqLworfSBiY21vbHRfeGdwb25fb251X3Rpd2lfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJ0aXdpIiBncm91cCBvZiAieGdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X3Rpd2kKK3sKKyAgICBiY21vbHRfYXV0byBoZHI7ICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5OyAgICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9kYXRhIGRhdGE7ICAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX29udV90aXdpOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAidHVuaW5nX3Jlc3BvbnNlIiBncm91cCBvZiB0aGUgInhncG9uX29udSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9kYXRhCit7CisgICAgYmNtb3NfYm9vbCBhY2s7ICAgICAgICAgLyoqPCBpcyB0dW5pbmcgcmVzcG9uc2UgcmVjZWl2ZWQgd2l0aCBhY2sgb3IgbmFjayAqLworICAgIGJjbW9sdF9yZXN1bHQgcmVzdWx0OyAgIC8qKjwgcmVzdWx0LiAqLworfSBiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInR1bmluZ19yZXNwb25zZSIgZ3JvdXAgb2YgInhncG9uX29udSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZQoreworICAgIGJjbW9sdF9hdXRvIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2U7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJhdXRvX2NmZyIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YQoreworICAgIGJjbW9zX2Jvb2wgZGZpOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAiZGZpIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIGRnaTsgICAgICAgICAgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImRnaSIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBkb3dpOyAgICAgICAgICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJkb3dpIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIGludmFsaWRfZGJydV9yZXBvcnQ7ICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImludmFsaWRfZGJydV9yZXBvcnQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wga2V5X2V4Y2hhbmdlX2NvbXBsZXRlZDsgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAia2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBrZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZDsgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJrZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBrZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoOyAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJrZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIGtleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0OyAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgImtleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0IiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIGxvb2NpOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJsb29jaSIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBvbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQ7ICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAib251X2FjdGl2YXRpb25fY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIG9udV9hbGFybTsgICAgICAgICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJvbnVfYWxhcm0iIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQ7ICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgIm9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIG9udV9kaXNhYmxlX2NvbXBsZXRlZDsgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJvbnVfZGlzYWJsZV9jb21wbGV0ZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgb251X2VuYWJsZV9jb21wbGV0ZWQ7ICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgIm9udV9lbmFibGVfY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIG9udV90dW5pbmdfaW5fY29tcGxldGVkOyAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJvbnVfdHVuaW5nX2luX2NvbXBsZXRlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBvbnVfdHVuaW5nX291dF9jb21wbGV0ZWQ7ICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAib251X3R1bmluZ19vdXRfY29tcGxldGVkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIG9wdGljYWxfcmVmbGVjdGlvbjsgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJvcHRpY2FsX3JlZmxlY3Rpb24iIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgcG9zc2libGVfZHJpZnQ7ICAgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInBvc3NpYmxlX2RyaWZ0IiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHBvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydDsgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJwb3dlcl9jb25zdW1wdGlvbl9yZXBvcnQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgcG93ZXJfbGV2ZWxfcmVwb3J0OyAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInBvd2VyX2xldmVsX3JlcG9ydCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZTsgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInBvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHBxc2k7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJwcXNpIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHJhbmdpbmdfY29tcGxldGVkOyAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJyYW5naW5nX2NvbXBsZXRlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCByZWdpc3RyYXRpb25faWQ7ICAgICAgICAgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAicmVnaXN0cmF0aW9uX2lkIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkOyAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJyc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBzZGk7IC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAic2RpIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHNlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZTsgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmUiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgc2ZpOyAgICAgICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzZmkiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgc3RhdF9hbGFybV9jbGVhcmVkOyAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzdGF0X2FsYXJtX2NsZWFyZWQiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgc3RhdF9hbGFybV9yYWlzZWQ7ICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJzdGF0X2FsYXJtX3JhaXNlZCIgd2lsbCBiZSBnZW5lcmF0ZWQuICovCisgICAgYmNtb3NfYm9vbCBzdWZpOyAgICAgICAgICAgICAgICAvKio8IElmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgInN1ZmkiIHdpbGwgYmUgZ2VuZXJhdGVkLiAqLworICAgIGJjbW9zX2Jvb2wgdGl3aTsgICAgICAgICAgICAgICAgLyoqPCBJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlICJ0aXdpIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KKyAgICBiY21vc19ib29sIHR1bmluZ19yZXNwb25zZTsgICAgIC8qKjwgSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSAidHVuaW5nX3Jlc3BvbnNlIiB3aWxsIGJlIGdlbmVyYXRlZC4gKi8KK30gYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImF1dG9fY2ZnIiBncm91cCBvZiAieGdwb25fb251IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnCit7CisgICAgYmNtb2x0X2F1dG9fY2ZnIGhkcjsgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmc7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJhZGp1c3RfdHhfd2F2ZWxlbmd0aCIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9vbnUiIAorICogb2JqZWN0LiAKKyAqCisgKiBJbnN0cnVjdCB0aGUgT05VIHRvIGFkanVzdCBpdHMgdXBzdHJlYW0gdHJhbnNtaXR0ZXIgd2F2ZWxlbmd0aCAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhCit7CisgICAgYmNtb2x0X2ZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiBmcmVxdWVuY3lfYWRqdXN0bWVudF9kaXJlY3Rpb247ICAgLyoqPCBGcmVxdWVuY3kgYWRqdXN0bWVudCBkaXJlY3Rpb24uICovCisgICAgdWludDhfdCBmcmVxdWVuY3lfYWRqdXN0bWVudF9zaXplOyAgLyoqPCBUaGUgc2l6ZSBvZiB0aGUgZnJlcXVlbmN5IGFkanVzdG1lbnQgaW4gdW5pdHMgb2YgMC4xR0h6ICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJhZGp1c3RfdHhfd2F2ZWxlbmd0aCIgZ3JvdXAgb2YgInhncG9uX29udSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoCit7CisgICAgYmNtb2x0X29wZXIgaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGg7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJjaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nIiBncm91cCBvZiB0aGUgCisgKiAieGdwb25fb251IiBvYmplY3QuIAorICoKKyAqIENoYW5nZSBwb3dlciBsZXZlbGxpbmcgCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19kYXRhCit7CisgICAgYmNtb2x0X3Bvd2VyX2xldmVsbGluZ19jb250cm9sIGNvbnRyb2w7IC8qKjwgY29udHJvbC4gKi8KKyAgICB1aW50OF90IGF0dGVudWF0aW9uOyAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgcmVxdWVzdGVkIGF0dGVudWF0aW9uIGluIHN0ZXBzIG9mIDNkQiBhcyBwYXJ0IG9mIHBvd2VyIGxldmVsbGluZyBpbnN0cnVjdGlvbiAqLworfSBiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJjaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nIiBncm91cCBvZiAKKyAqICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZworeworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmc7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiZ2V0X3Bvd2VyX2NvbnN1bXB0aW9uIiBncm91cCBvZiAKKyAqICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2NvbnN1bXB0aW9uCit7CisgICAgYmNtb2x0X29wZXIgaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworfSBiY21vbHRfeGdwb25fb251X2dldF9wb3dlcl9jb25zdW1wdGlvbjsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJnZXRfcG93ZXJfbGV2ZWwiIGdyb3VwIG9mICJ4Z3Bvbl9vbnUiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9nZXRfcG93ZXJfbGV2ZWwKK3sKKyAgICBiY21vbHRfb3BlciBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleTsgICAvKio8IE9iamVjdCBrZXkuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2xldmVsOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgIm9udV90dW5pbmdfaW4iIGdyb3VwIG9mICJ4Z3Bvbl9vbnUiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luCit7CisgICAgYmNtb2x0X29wZXIgaGRyOyAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworfSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW47CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJvbnVfdHVuaW5nX291dCIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9vbnUiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhCit7CisgICAgYmNtb2x0X3Bvbl9pZCB0YXJnZXRfZHNfcG9uX2lkOyAvKio8IHRhcmdldCBkcyBwb24gaWQuICovCisgICAgYmNtb2x0X3Bvbl9pZCB0YXJnZXRfdXNfcG9uX2lkOyAvKio8IHRhcmdldCB1cyBwb24gaWQuICovCisgICAgdWludDMyX3QgdGltZV90b19zd2l0Y2g7ICAgICAgICAvKio8IFRpbWUgdG8gc3dpdGNoIGluIG1zICovCisgICAgYmNtb3NfYm9vbCByb2xsYmFjazsgICAgICAgICAgICAvKio8IHJvbGxiYWNrLiAqLworICAgIGJjbW9sdF9zdGF0dXMgc3RhdHVzOyAgICAgICAgICAgLyoqPCBvbi0gdG8gc3RhcnQgdHVuaW5nIG91dCBvZmYtIHRvIHN0b3AgdHVuaW5nIG91dCAqLworfSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAib251X3R1bmluZ19vdXQiIGdyb3VwIG9mICJ4Z3Bvbl9vbnUiIAorICogb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dAoreworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2RhdGEgZGF0YTsgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInJlcXVlc3RfcmVnaXN0cmF0aW9uIiBncm91cCBvZiB0aGUgInhncG9uX29udSIgCisgKiBvYmplY3QuIAorICoKKyAqIFJlcXVlc3QgdGhlIE9OVSB0byBzZW5kIGl0cyBSZWdpc3RyYXRpb24gSUQgCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25fZGF0YQoreworICAgIGJjbW9zX2Jvb2wgc21hX2ZsYWc7ICAgIC8qKjwgSXMgdGhlIHJlcXVlc3QgcmVnaXN0cmF0aW9uIHByb2Nlc3MgaXMgcGFydCBvZiB0aGUgU01BIHByb2Nlc3MgKi8KK30gYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgInJlcXVlc3RfcmVnaXN0cmF0aW9uIiBncm91cCBvZiAieGdwb25fb251IiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb24KK3sKKyAgICBiY21vbHRfb3BlciBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleTsgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9kYXRhIGRhdGE7ICAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbjsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJyc3NpX21lYXN1cmVtZW50IiBncm91cCBvZiAieGdwb25fb251IiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudAoreworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KK30gYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAic2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbiIgZ3JvdXAgb2YgdGhlIAorICogInhncG9uX29udSIgb2JqZWN0LiAKKyAqCisgKiBPTUNJIGJhc2Ugc2VjdXJlIG11dHVhbCBhdXRoZW50aWNhdGlvbiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2RhdGEKK3sKKyAgICBiY21vbHRfYWVzX2tleSBtYXN0ZXJfa2V5OyAgICAgICAgICAvKio8IG1hc3RlciBrZXkuICovCisgICAgYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4IGJ1ZmZlcjsgLyoqPCBPTUNJIGRhdGEgYnVmZmVyLiAqLworICAgIHVpbnQzMl90IG1pYzsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgbWljLiAqLworfSBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJzZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uIiBncm91cCBvZiAKKyAqICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbgoreworICAgIGJjbW9sdF9vcGVyIGhkcjsgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5OyAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZGF0YSBkYXRhOyAgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbjsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgInNldF9vbnVfc3RhdGUiIGdyb3VwIG9mIHRoZSAieGdwb25fb251IiAKKyAqIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhCit7CisgICAgYmNtb2x0X29udV9vcGVyYXRpb24gb251X3N0YXRlOyAvKio8IE9OVSBzdGF0ZS4gKi8KK30gYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAic2V0X29udV9zdGF0ZSIgZ3JvdXAgb2YgInhncG9uX29udSIgCisgKiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGUKK3sKKyAgICBiY21vbHRfb3BlciBoZHI7ICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleTsgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGEgZGF0YTsgICAvKio8IEFsbCBwcm9wZXJ0aWVzIHRoYXQgbXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZTsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNwdV9wYWNrZXRzIiBncm91cCBvZiB0aGUgInhncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19kYXRhCit7CisgICAgYmNtb2x0X3BhY2tldF90eXBlIHBhY2tldF90eXBlOyAgICAgLyoqPCBwYWNrZXQgdHlwZS4gKi8KKyAgICBiY21vc19ib29sIGNhbGNfY3JjOyAgICAgICAgICAgICAgICAvKio8IGNhbGMgY3JjLiAqLworICAgIHVpbnQ4X3QgbnVtYmVyX29mX3BhY2tldHM7ICAgICAgICAgIC8qKjwgbnVtYmVyIG9mIHBhY2tldHMuICovCisgICAgdWludDE2X3QgcGFja2V0X3NpemU7ICAgICAgICAgICAgICAgLyoqPCBTaW5nbGUgcGFja2V0IHNpemUuICovCisgICAgYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4IGJ1ZmZlcjsgLyoqPCBidWZmZXIuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJjcHVfcGFja2V0cyIgZ3JvdXAgb2YgInhncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0cworeworICAgIGJjbW9sdF9wcm94eSBoZHI7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5OyAgICAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzOworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAicGxvYW1fcGFja2V0IiBncm91cCBvZiB0aGUgInhncG9uX29udSIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YQoreworICAgIGJjbW9zX2Jvb2wgZGVmYXVsdF9rZXk7IC8qKjwgZGVmYXVsdCBrZXkuICovCisjZGVmaW5lIEJDTU9MVF9YR1BPTl9PTlVfUExPQU1fUEFDS0VUX0RBVEFfUExPQU1fTEVOICAgIDQwCisgICAgYmNtb2x0X2Fycl91OF80MCBwbG9hbTsgLyoqPCBwbG9hbS4gKi8KK30gYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YTsKKworLyoqIFRyYW5zcG9ydCBtZXNzYWdlIGRlZmluaXRpb24gZm9yICJwbG9hbV9wYWNrZXQiIGdyb3VwIG9mICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0Cit7CisgICAgYmNtb2x0X3Byb3h5IGhkcjsgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlci4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXk7ICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGEgZGF0YTsgICAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImNwdV9wYWNrZXQiIGdyb3VwIG9mIHRoZSAieGdwb25fb251IiBvYmplY3QuIAorICoKKyAqIEluZGljYXRlcyBDUFUgcGFja2V0IHdhcyByZWNlaXZlZCBvbiB0aGUgVVMgZnJvbSB0aGlzIE9OVSBpZCAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2RhdGEKK3sKKyAgICB1aW50MTZfdCBwb3J0X2lkOyAgICAgICAgICAgLyoqPCBwb3J0IGlkLiAqLworICAgIGJjbW9zX2Jvb2wgY3JjX29rOyAgICAgICAgICAvKio8IGNyYyBvay4gKi8KKyAgICB1aW50MzJfdCBwYWNrZXRfc2l6ZTsgICAgICAgLyoqPCBwYWNrZXQgc2l6ZS4gKi8KKyAgICBiY21vbHRfdThfbGlzdF91MzIgYnVmZmVyOyAgLyoqPCBidWZmZXIuICovCit9IGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhOworCisvKiogVHJhbnNwb3J0IG1lc3NhZ2UgZGVmaW5pdGlvbiBmb3IgImNwdV9wYWNrZXQiIGdyb3VwIG9mICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldAoreworICAgIGJjbW9sdF9wcm94eV9yeCBoZHI7ICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5OyAgICAgICAgICAgICAgIC8qKjwgT2JqZWN0IGtleS4gKi8KKyAgICBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfZGF0YSBkYXRhOyAgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXQ7CisKKy8qKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbiBmb3IgdGhlICJvbWNpX3BhY2tldCIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKgorICogSW5kaWNhdGVzIE9NQ0kgcGFja2V0IHdhcyByZWNlaXZlZCBvbiB0aGUgVVMgZnJvbSB0aGlzIE9OVSBpZCAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhCit7CisgICAgdWludDE2X3QgcG9ydF9pZDsgICAgICAgICAgIC8qKjwgcG9ydCBpZC4gKi8KKyAgICBiY21vc19ib29sIGNyY19vazsgICAgICAgICAgLyoqPCBjcmMgb2suICovCisgICAgdWludDMyX3QgcGFja2V0X3NpemU7ICAgICAgIC8qKjwgcGFja2V0IHNpemUuICovCisgICAgYmNtb2x0X3U4X2xpc3RfdTMyIGJ1ZmZlcjsgIC8qKjwgYnVmZmVyLiAqLworfSBiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAib21jaV9wYWNrZXQiIGdyb3VwIG9mICJ4Z3Bvbl9vbnUiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXQKK3sKKyAgICBiY21vbHRfcHJveHlfcnggaGRyOyAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleTsgICAgICAgICAgICAgICAvKio8IE9iamVjdCBrZXkuICovCisgICAgYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhIGRhdGE7IC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldDsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleSIgZ3JvdXAgb2YgdGhlICJ4Z3Bvbl90cngiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94Z3Bvbl90cnhfa2V5Cit7CisgICAgYmNtb2x0X3hncG9uX25pIHBvbl9uaTsgLyoqPCBQT04gbmV0d29yayBpbnRlcmZhY2UuICovCit9IGJjbW9sdF94Z3Bvbl90cnhfa2V5OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiY2ZnIiBncm91cCBvZiB0aGUgInhncG9uX3RyeCIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YQoreworI2RlZmluZSBCQ01PTFRfWEdQT05fVFJYX0NGR19EQVRBX0JVUlNUX1BST0ZJTEVfTEVOIDQKKyAgICBiY21vbHRfYXJyX3hncG9uX2J1cnN0X3Byb2ZpbGVfNCBidXJzdF9wcm9maWxlOyAgICAgICAgICAgICAvKio8IGJ1cnN0IHByb2ZpbGUuICovCisjZGVmaW5lIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0RBVEFfVFJBTlNDRUlWRVJfQ09ORklHX0xFTiAgICA0CisgICAgYmNtb2x0X2Fycl94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl80IHRyYW5zY2VpdmVyX2NvbmZpZzsgICAgLyoqPCB0cmFuc2NlaXZlciBjb25maWcuICovCisgICAgYmNtb2x0X3hncG9uX3RyeF90eXBlIHRyYW5zY2VpdmVyX3R5cGU7ICAgICAgICAgICAgICAgICAgICAgLyoqPCB0cnggdHlwZS4gKi8KKyAgICBiY21vbHRfeGdwb25fdHJ4X2RlYnVnIGRlYnVnOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBkZWJ1Zy4gKi8KKyAgICBiY21vbHRfeGdwb25fcnNzaV9ub3JtYWxfY29uZmlnIHJzc2lfbm9ybWFsX2NvbmZpZzsgLyoqPCByc3NpIG5vcm1hbCBjb25maWcuICovCisgICAgYmNtb2x0X3hncG9uX3Jzc2lfcmFuZ2luZ19jb25maWcgcnNzaV9yYW5naW5nX2NvbmZpZzsgICAgICAgICAgICAgICAvKio8IHJzc2kgcmFuZ2luZyBjb25maWcuICovCisgICAgYmNtb2x0X3hncG9uX3NlcmRlc19jb25maWd1cmF0aW9uIHNlcmRlc19jb25maWd1cmF0aW9uOyAgICAgICAgICAgICAvKio8IHNlcmRlcyBjb25maWd1cmF0aW9uLiAqLworI2RlZmluZSBCQ01PTFRfWEdQT05fVFJYX0NGR19EQVRBX0JVUlNUX1BST0ZJTEVfREVMSU1JVEVSX01BWF9FUlJPUlNfTEVOICAgIDQKKyAgICBiY21vbHRfYXJyX3U4XzQgYnVyc3RfcHJvZmlsZV9kZWxpbWl0ZXJfbWF4X2Vycm9yczsgICAgICAgICAgICAgICAgIC8qKjwgYnVyc3QgcHJvZmlsZSBkZWxpbWl0ZXIgbWF4IGVycm9ycy4gKi8KKyAgICBiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuIHJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdDsgICAgIC8qKjwgUmVzZXQgcGF0dGVybnMgdXNlZCBhdCBJbml0IG9mIFJhbmdpbmctV2luZG93IGFuZCBhZnRlciBBY2Nlc3MgKi8KKyAgICBiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuIHJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZTsgIC8qKjwgcmFuZ2luZyBzbSBwYXR0ZXJucyBFRCBmYWlsdXJlLiAqLworICAgIGJjbW9zX2Jvb2wgcmVzZXRfb25fZGVsX21pc3M7ICAgLyoqPCByZXNldCBvbiBkZWwgbWlzcy4gKi8KKyAgICBiY21vbHRfeGdwb25fZWRfc3RhdGUgZWRfc3RhdGU7IC8qKjwgZWQgc3RhdGUuICovCisgICAgYmNtb3NfYm9vbCBpbnZlcnRfZWQ7ICAgICAgICAgICAvKio8IGludmVydCBFRC4gKi8KKyAgICBiY21vc19ib29sIGVuZF9vZl9idXJzdF9yZXNldDsgIC8qKjwgZW5kIG9mIGJ1cnN0IHJlc2V0LiAqLworICAgIGJjbW9zX2Jvb2wgdHJ4X3JzdF9wb2xhcml0eTsgICAgLyoqPCBUUlggcmVzZXQgcG9sYXJpdHkuICovCit9IGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiY2ZnIiBncm91cCBvZiAieGdwb25fdHJ4IiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeGdwb25fdHJ4X2NmZworeworICAgIGJjbW9sdF9jZmcgaGRyOyAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgaGVhZGVyLiAqLworICAgIGJjbW9sdF94Z3Bvbl90cnhfa2V5IGtleTsgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGEgZGF0YTsgLyoqPCBBbGwgcHJvcGVydGllcyB0aGF0IG11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyLiAqLworfSBiY21vbHRfeGdwb25fdHJ4X2NmZzsKKworLyoqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciB0aGUgImtleSIgZ3JvdXAgb2YgdGhlICJ4cG9uX3NlcmRlcyIgb2JqZWN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3hwb25fc2VyZGVzX2tleQoreworICAgIGJjbW9sdF9wb25fbmkgcG9uX25pOyAgICAgICAgICAgICAgIC8qKjwgUE9OIE5JLiAqLworICAgIGJjbW9sdF9zZXJkZXNfaW5zdGFuY2UgaW5zdGFuY2U7ICAgIC8qKjwgU2VyRGVzIGluc3RhbmNlOiAqLworfSBiY21vbHRfeHBvbl9zZXJkZXNfa2V5OworCisvKiogU3RydWN0dXJlIGRlZmluaXRpb24gZm9yIHRoZSAiY2ZnIiBncm91cCBvZiB0aGUgInhwb25fc2VyZGVzIiBvYmplY3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGEKK3sKKyAgICB1aW50OF90IHJ4X3ZnYTsgICAgIC8qKjwgUnggVmdhLiAqLworICAgIHVpbnQ4X3QgcnhfcGY7ICAgICAgLyoqPCBQZWFraW5nIEZpbHRlciAqLworICAgIHVpbnQ4X3QgcnhfbGZwZjsgICAgLyoqPCBMb3cgRnJlcXVlbmN5IFBlYWtpbmcgRmlsdGVyICovCisgICAgdWludDhfdCByeF9kZmUxOyAgICAvKio8IFJ4IERGRTEuICovCisgICAgaW50OF90IHJ4X2RmZTI7ICAgICAvKio8IFJ4IERGRTIuICovCisgICAgaW50OF90IHJ4X2RmZTM7ICAgICAvKio8IFJ4IERGRTMuICovCisgICAgaW50OF90IHJ4X2RmZTQ7ICAgICAvKio8IFJ4IERGRTQuICovCisgICAgaW50OF90IHJ4X2RmZTU7ICAgICAvKio8IFJ4IERGRTUuICovCisgICAgdWludDhfdCB0eF9wcmU7ICAgICAvKio8IFR4IFByZS4gKi8KKyAgICB1aW50OF90IHR4X21haW47ICAgIC8qKjwgVHggTWFpbi4gKi8KKyAgICB1aW50OF90IHR4X3Bvc3QxOyAgIC8qKjwgVHggUG9zdDEuICovCisgICAgaW50OF90IHR4X3Bvc3QyOyAgICAvKio8IFR4IFBvc3QyLiAqLworICAgIGludDhfdCB0eF9wb3N0MzsgICAgLyoqPCBUeCBQb3N0My4gKi8KKyAgICB1aW50OF90IHR4X2FtcDsgICAgIC8qKjwgVHggQW1wLiAqLworfSBiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGE7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBkZWZpbml0aW9uIGZvciAiY2ZnIiBncm91cCBvZiAieHBvbl9zZXJkZXMiIG9iamVjdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF94cG9uX3NlcmRlc19jZmcKK3sKKyAgICBiY21vbHRfY2ZnIGhkcjsgICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCBoZWFkZXIuICovCisgICAgYmNtb2x0X3hwb25fc2VyZGVzX2tleSBrZXk7ICAgICAgICAgLyoqPCBPYmplY3Qga2V5LiAqLworICAgIGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YSBkYXRhOyAgIC8qKjwgQWxsIHByb3BlcnRpZXMgdGhhdCBtdXN0IGJlIHNldCBieSB0aGUgdXNlci4gKi8KK30gYmNtb2x0X3hwb25fc2VyZGVzX2NmZzsKKworLyoqIEB9ICovCisKKy8qKiBQYWNrcyBhIGJjbW9sdF9hY3RpdmF0aW9uX2ZhaWxfcmVhc29uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hY3RpdmF0aW9uX2ZhaWxfcmVhc29uX3BhY2soYmNtb2x0X2FjdGl2YXRpb25fZmFpbF9yZWFzb24gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfYWN0aXZhdGlvbl9mYWlsX3JlYXNvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hY3RpdmF0aW9uX2ZhaWxfcmVhc29uX3VucGFjayhiY21vbHRfYWN0aXZhdGlvbl9mYWlsX3JlYXNvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2FkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHlfcGFjayhiY21vbHRfYWRkaXRpb25hbF9id19lbGlnaWJpbGl0eSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9hZGRpdGlvbmFsX2J3X2VsaWdpYmlsaXR5IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHlfdW5wYWNrKGJjbW9sdF9hZGRpdGlvbmFsX2J3X2VsaWdpYmlsaXR5ICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfYWVfbmlfY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9uaV9jZmdfaWRfcGFjayhiY21vbHRfYWVfbmlfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2FlX25pX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9uaV9jZmdfaWRfdW5wYWNrKGJjbW9sdF9hZV9uaV9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9hZV9uaV9lbl9zdGF0ZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfbmlfZW5fc3RhdGVfcGFjayhiY21vbHRfYWVfbmlfZW5fc3RhdGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfYWVfbmlfZW5fc3RhdGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfbmlfZW5fc3RhdGVfdW5wYWNrKGJjbW9sdF9hZV9uaV9lbl9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2FlX25pX2tleV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfbmlfa2V5X2lkX3BhY2soYmNtb2x0X2FlX25pX2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9hZV9uaV9rZXlfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfbmlfa2V5X2lkX3VucGFjayhiY21vbHRfYWVfbmlfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfaWRfcGFjayhiY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfaWRfdW5wYWNrKGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2lkX3BhY2soYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2lkX3VucGFjayhiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2FlX3BhdGhfZHNfa2V5X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX2tleV9pZF9wYWNrKGJjbW9sdF9hZV9wYXRoX2RzX2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9hZV9wYXRoX2RzX2tleV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX2tleV9pZF91bnBhY2soYmNtb2x0X2FlX3BhdGhfZHNfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3BhY2soYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3VucGFjayhiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3BhY2soYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3VucGFjayhiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfaWRfcGFjayhiY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfaWRfdW5wYWNrKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfaWRfcGFjayhiY21vbHRfYWVfcGF0aF9kc19zdGF0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfaWRfdW5wYWNrKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2lkX3BhY2soYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2lkX3VucGFjayhiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2FlX3BhdGhfdXNfa2V5X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX2tleV9pZF9wYWNrKGJjbW9sdF9hZV9wYXRoX3VzX2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9hZV9wYXRoX3VzX2tleV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX2tleV9pZF91bnBhY2soYmNtb2x0X2FlX3BhdGhfdXNfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3BhY2soYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3VucGFjayhiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3BhY2soYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3VucGFjayhiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfaWRfcGFjayhiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfaWRfdW5wYWNrKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfaWRfcGFjayhiY21vbHRfYWVfcGF0aF91c19zdGF0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfaWRfdW5wYWNrKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9hbGxvY19vcGVyYXRpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FsbG9jX29wZXJhdGlvbl9wYWNrKGJjbW9sdF9hbGxvY19vcGVyYXRpb24gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfYWxsb2Nfb3BlcmF0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FsbG9jX29wZXJhdGlvbl91bnBhY2soYmNtb2x0X2FsbG9jX29wZXJhdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2FsbG9jX3N0YXRlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hbGxvY19zdGF0ZV9wYWNrKGJjbW9sdF9hbGxvY19zdGF0ZSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9hbGxvY19zdGF0ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hbGxvY19zdGF0ZV91bnBhY2soYmNtb2x0X2FsbG9jX3N0YXRlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfYWxsb2NfdHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYWxsb2NfdHlwZV9wYWNrKGJjbW9sdF9hbGxvY190eXBlIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2FsbG9jX3R5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYWxsb2NfdHlwZV91bnBhY2soYmNtb2x0X2FsbG9jX3R5cGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9hbGxvY190eXBlX3RvX3NjYW4gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FsbG9jX3R5cGVfdG9fc2Nhbl9wYWNrKGJjbW9sdF9hbGxvY190eXBlX3RvX3NjYW4gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfYWxsb2NfdHlwZV90b19zY2FuIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FsbG9jX3R5cGVfdG9fc2Nhbl91bnBhY2soYmNtb2x0X2FsbG9jX3R5cGVfdG9fc2NhbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9tb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfbW9kZV9wYWNrKGJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfbW9kZSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfbW9kZV91bnBhY2soYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9tb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfYXBpX2NhcHR1cmVfbG9jYXRpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FwaV9jYXB0dXJlX2xvY2F0aW9uX3BhY2soYmNtb2x0X2FwaV9jYXB0dXJlX2xvY2F0aW9uIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2FwaV9jYXB0dXJlX2xvY2F0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FwaV9jYXB0dXJlX2xvY2F0aW9uX3VucGFjayhiY21vbHRfYXBpX2NhcHR1cmVfbG9jYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9jYWxpYnJhdGlvbl9yZWNvcmQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2NhbGlicmF0aW9uX3JlY29yZF9wYWNrKGJjbW9sdF9jYWxpYnJhdGlvbl9yZWNvcmQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfY2FsaWJyYXRpb25fcmVjb3JkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2NhbGlicmF0aW9uX3JlY29yZF91bnBhY2soYmNtb2x0X2NhbGlicmF0aW9uX3JlY29yZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3NpZ24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NpZ25fcGFjayhiY21vbHRfc2lnbiB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9zaWduIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NpZ25fdW5wYWNrKGJjbW9sdF9zaWduICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfdXBzdHJlYW1fbGluZV9yYXRlX2NhcGFiaWxpdGllcyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdXBzdHJlYW1fbGluZV9yYXRlX2NhcGFiaWxpdGllc19wYWNrKGJjbW9sdF91cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3Vwc3RyZWFtX2xpbmVfcmF0ZV9jYXBhYmlsaXRpZXMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdXBzdHJlYW1fbGluZV9yYXRlX2NhcGFiaWxpdGllc191bnBhY2soYmNtb2x0X3Vwc3RyZWFtX2xpbmVfcmF0ZV9jYXBhYmlsaXRpZXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9saW5rX3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xpbmtfdHlwZV9wYWNrKGJjbW9sdF9saW5rX3R5cGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbGlua190eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xpbmtfdHlwZV91bnBhY2soYmNtb2x0X2xpbmtfdHlwZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2NhcHR1cmVfc3Ryb2JlX3NpZ25hbCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfY2FwdHVyZV9zdHJvYmVfc2lnbmFsX3BhY2soYmNtb2x0X2NhcHR1cmVfc3Ryb2JlX3NpZ25hbCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9jYXB0dXJlX3N0cm9iZV9zaWduYWwgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfY2FwdHVyZV9zdHJvYmVfc2lnbmFsX3VucGFjayhiY21vbHRfY2FwdHVyZV9zdHJvYmVfc2lnbmFsICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfY2hhbm5lbF9jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2NoYW5uZWxfY2ZnX2lkX3BhY2soYmNtb2x0X2NoYW5uZWxfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2NoYW5uZWxfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2NoYW5uZWxfY2ZnX2lkX3VucGFjayhiY21vbHRfY2hhbm5lbF9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9jaGFubmVsX2tleV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfY2hhbm5lbF9rZXlfaWRfcGFjayhiY21vbHRfY2hhbm5lbF9rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfY2hhbm5lbF9rZXlfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfY2hhbm5lbF9rZXlfaWRfdW5wYWNrKGJjbW9sdF9jaGFubmVsX2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2NvbnNvbGVfcmVkaXJlY3Rpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2NvbnNvbGVfcmVkaXJlY3Rpb25fcGFjayhiY21vbHRfY29uc29sZV9yZWRpcmVjdGlvbiB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9jb25zb2xlX3JlZGlyZWN0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2NvbnNvbGVfcmVkaXJlY3Rpb25fdW5wYWNrKGJjbW9sdF9jb25zb2xlX3JlZGlyZWN0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfY29udHJvbF9zdGF0ZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfY29udHJvbF9zdGF0ZV9wYWNrKGJjbW9sdF9jb250cm9sX3N0YXRlIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2NvbnRyb2xfc3RhdGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfY29udHJvbF9zdGF0ZV91bnBhY2soYmNtb2x0X2NvbnRyb2xfc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9kYmFfbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGJhX21vZGVfcGFjayhiY21vbHRfZGJhX21vZGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGJhX21vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGJhX21vZGVfdW5wYWNrKGJjbW9sdF9kYmFfbW9kZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RiYV9yYW0gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RiYV9yYW1fcGFjayhiY21vbHRfZGJhX3JhbSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9kYmFfcmFtIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RiYV9yYW1fdW5wYWNrKGJjbW9sdF9kYmFfcmFtICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZGJhX3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RiYV90eXBlX3BhY2soYmNtb2x0X2RiYV90eXBlIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2RiYV90eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RiYV90eXBlX3VucGFjayhiY21vbHRfZGJhX3R5cGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9kZHJfdGVzdF9zdGF0dXMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Rkcl90ZXN0X3N0YXR1c19wYWNrKGJjbW9sdF9kZHJfdGVzdF9zdGF0dXMgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGRyX3Rlc3Rfc3RhdHVzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Rkcl90ZXN0X3N0YXR1c191bnBhY2soYmNtb2x0X2Rkcl90ZXN0X3N0YXR1cyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Rkcl90ZXN0X3Jlc3VsdCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGRyX3Rlc3RfcmVzdWx0X3BhY2soYmNtb2x0X2Rkcl90ZXN0X3Jlc3VsdCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9kZHJfdGVzdF9yZXN1bHQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGRyX3Rlc3RfcmVzdWx0X3VucGFjayhiY21vbHRfZGRyX3Rlc3RfcmVzdWx0ICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfaG9zdF9jb25uZWN0aW9uX2ZhaWxfcmVhc29uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ob3N0X2Nvbm5lY3Rpb25fZmFpbF9yZWFzb25fcGFjayhiY21vbHRfaG9zdF9jb25uZWN0aW9uX2ZhaWxfcmVhc29uIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2hvc3RfY29ubmVjdGlvbl9mYWlsX3JlYXNvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ob3N0X2Nvbm5lY3Rpb25fZmFpbF9yZWFzb25fdW5wYWNrKGJjbW9sdF9ob3N0X2Nvbm5lY3Rpb25fZmFpbF9yZWFzb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9kZWFjdGl2YXRpb25fcmVhc29uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZWFjdGl2YXRpb25fcmVhc29uX3BhY2soYmNtb2x0X2RlYWN0aXZhdGlvbl9yZWFzb24gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGVhY3RpdmF0aW9uX3JlYXNvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZWFjdGl2YXRpb25fcmVhc29uX3VucGFjayhiY21vbHRfZGVhY3RpdmF0aW9uX3JlYXNvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19pZF9wYWNrKGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19pZF91bnBhY2soYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZGVidWdfY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19jZmdfaWRfcGFjayhiY21vbHRfZGVidWdfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2RlYnVnX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19jZmdfaWRfdW5wYWNrKGJjbW9sdF9kZWJ1Z19jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9pZF9wYWNrKGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGVidWdfY2xpX2lucHV0X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9pZF91bnBhY2soYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfaWRfcGFjayhiY21vbHRfZGVidWdfY2xpX291dHB1dF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfaWRfdW5wYWNrKGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZGVidWdfZmlsZV9hbG1vc3RfZnVsbF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfZmlsZV9hbG1vc3RfZnVsbF9pZF9wYWNrKGJjbW9sdF9kZWJ1Z19maWxlX2FsbW9zdF9mdWxsX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2RlYnVnX2ZpbGVfYWxtb3N0X2Z1bGxfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfZmlsZV9hbG1vc3RfZnVsbF9pZF91bnBhY2soYmNtb2x0X2RlYnVnX2ZpbGVfYWxtb3N0X2Z1bGxfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9kZWJ1Z19rZXlfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2tleV9pZF9wYWNrKGJjbW9sdF9kZWJ1Z19rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGVidWdfa2V5X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2tleV9pZF91bnBhY2soYmNtb2x0X2RlYnVnX2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RlYnVnX3Jlc2V0X2FwaV9jYXB0dXJlX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19yZXNldF9hcGlfY2FwdHVyZV9pZF9wYWNrKGJjbW9sdF9kZWJ1Z19yZXNldF9hcGlfY2FwdHVyZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9kZWJ1Z19yZXNldF9hcGlfY2FwdHVyZV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19yZXNldF9hcGlfY2FwdHVyZV9pZF91bnBhY2soYmNtb2x0X2RlYnVnX3Jlc2V0X2FwaV9jYXB0dXJlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZGVidWdfc3RhcnRfYXBpX2NhcHR1cmVfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX3N0YXJ0X2FwaV9jYXB0dXJlX2lkX3BhY2soYmNtb2x0X2RlYnVnX3N0YXJ0X2FwaV9jYXB0dXJlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2RlYnVnX3N0YXJ0X2FwaV9jYXB0dXJlX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX3N0YXJ0X2FwaV9jYXB0dXJlX2lkX3VucGFjayhiY21vbHRfZGVidWdfc3RhcnRfYXBpX2NhcHR1cmVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9kZWJ1Z19zdG9wX2FwaV9jYXB0dXJlX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19zdG9wX2FwaV9jYXB0dXJlX2lkX3BhY2soYmNtb2x0X2RlYnVnX3N0b3BfYXBpX2NhcHR1cmVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGVidWdfc3RvcF9hcGlfY2FwdHVyZV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19zdG9wX2FwaV9jYXB0dXJlX2lkX3VucGFjayhiY21vbHRfZGVidWdfc3RvcF9hcGlfY2FwdHVyZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RldmljZV9hdXRvX2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2lkX3BhY2soYmNtb2x0X2RldmljZV9hdXRvX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2lkX3VucGFjayhiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZGV2aWNlX2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2NmZ19pZF9wYWNrKGJjbW9sdF9kZXZpY2VfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2RldmljZV9jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2NmZ19pZF91bnBhY2soYmNtb2x0X2RldmljZV9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9kZXZpY2VfY2hpcF9yZXZpc2lvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2NoaXBfcmV2aXNpb25fcGFjayhiY21vbHRfZGV2aWNlX2NoaXBfcmV2aXNpb24gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGV2aWNlX2NoaXBfcmV2aXNpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2NoaXBfcmV2aXNpb25fdW5wYWNrKGJjbW9sdF9kZXZpY2VfY2hpcF9yZXZpc2lvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RldmljZV9jb25uZWN0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfY29ubmVjdF9pZF9wYWNrKGJjbW9sdF9kZXZpY2VfY29ubmVjdF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9kZXZpY2VfY29ubmVjdF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfY29ubmVjdF9pZF91bnBhY2soYmNtb2x0X2RldmljZV9jb25uZWN0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2lkX3BhY2soYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2lkX3VucGFjayhiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9lc3RhYmxpc2hlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZXN0YWJsaXNoZWRfaWRfcGFjayhiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZXN0YWJsaXNoZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZXN0YWJsaXNoZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZXN0YWJsaXNoZWRfaWRfdW5wYWNrKGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9lc3RhYmxpc2hlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfaWRfcGFjayhiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfaWRfdW5wYWNrKGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfaWRfcGFjayhiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfaWRfdW5wYWNrKGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9pZF9wYWNrKGJjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9pZF91bnBhY2soYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfaWRfcGFjayhiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfaWRfdW5wYWNrKGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZGV2aWNlX2Rpc2Nvbm5lY3RfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9kaXNjb25uZWN0X2lkX3BhY2soYmNtb2x0X2RldmljZV9kaXNjb25uZWN0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2RldmljZV9kaXNjb25uZWN0X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9kaXNjb25uZWN0X2lkX3VucGFjayhiY21vbHRfZGV2aWNlX2Rpc2Nvbm5lY3RfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9kZXZpY2VfZGlzY29ubmVjdGlvbl9jb21wbGV0ZV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2Rpc2Nvbm5lY3Rpb25fY29tcGxldGVfaWRfcGFjayhiY21vbHRfZGV2aWNlX2Rpc2Nvbm5lY3Rpb25fY29tcGxldGVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGV2aWNlX2Rpc2Nvbm5lY3Rpb25fY29tcGxldGVfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2Rpc2Nvbm5lY3Rpb25fY29tcGxldGVfaWRfdW5wYWNrKGJjbW9sdF9kZXZpY2VfZGlzY29ubmVjdGlvbl9jb21wbGV0ZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfaWRfcGFjayhiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfaWRfdW5wYWNrKGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfaWRfcGFjayhiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfaWRfdW5wYWNrKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfaWRfcGFjayhiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfaWRfdW5wYWNrKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2lkX3BhY2soYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2lkX3VucGFjayhiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9pbWFnZV90eXBlX3BhY2soYmNtb2x0X2RldmljZV9pbWFnZV90eXBlIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2RldmljZV9pbWFnZV90eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9pbWFnZV90eXBlX3VucGFjayhiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWRfaWRfcGFjayhiY21vbHRfZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWRfaWRfdW5wYWNrKGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RldmljZV9rZXlfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9rZXlfaWRfcGFjayhiY21vbHRfZGV2aWNlX2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9kZXZpY2Vfa2V5X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9rZXlfaWRfdW5wYWNrKGJjbW9sdF9kZXZpY2Vfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfbm5pX3NwZWVkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc3BlZWRfcGFjayhiY21vbHRfbm5pX3NwZWVkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X25uaV9zcGVlZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc3BlZWRfdW5wYWNrKGJjbW9sdF9ubmlfc3BlZWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9kZXZpY2VfcmVzZXRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9yZXNldF9pZF9wYWNrKGJjbW9sdF9kZXZpY2VfcmVzZXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGV2aWNlX3Jlc2V0X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9yZXNldF9pZF91bnBhY2soYmNtb2x0X2RldmljZV9yZXNldF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RldmljZV9yZXNldF9tb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfcmVzZXRfbW9kZV9wYWNrKGJjbW9sdF9kZXZpY2VfcmVzZXRfbW9kZSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9kZXZpY2VfcmVzZXRfbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfcmVzZXRfbW9kZV91bnBhY2soYmNtb2x0X2RldmljZV9yZXNldF9tb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9pZF9wYWNrKGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9pZF91bnBhY2soYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9kZXZpY2Vfc3RhdGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9zdGF0ZV9wYWNrKGJjbW9sdF9kZXZpY2Vfc3RhdGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGV2aWNlX3N0YXRlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9zdGF0ZV91bnBhY2soYmNtb2x0X2RldmljZV9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RldmljZV9zd19lcnJvcl9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2lkX3BhY2soYmNtb2x0X2RldmljZV9zd19lcnJvcl9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2lkX3VucGFjayhiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9pZF9wYWNrKGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25faWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9pZF91bnBhY2soYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25faWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9kZXZpY2Vfc3dfdXBncmFkZV9hY3RpdmF0ZV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX3N3X3VwZ3JhZGVfYWN0aXZhdGVfaWRfcGFjayhiY21vbHRfZGV2aWNlX3N3X3VwZ3JhZGVfYWN0aXZhdGVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGV2aWNlX3N3X3VwZ3JhZGVfYWN0aXZhdGVfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX3N3X3VwZ3JhZGVfYWN0aXZhdGVfaWRfdW5wYWNrKGJjbW9sdF9kZXZpY2Vfc3dfdXBncmFkZV9hY3RpdmF0ZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Rpc2FibGVfc2VyaWFsX251bWJlcl9jb250cm9sIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kaXNhYmxlX3NlcmlhbF9udW1iZXJfY29udHJvbF9wYWNrKGJjbW9sdF9kaXNhYmxlX3NlcmlhbF9udW1iZXJfY29udHJvbCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9kaXNhYmxlX3NlcmlhbF9udW1iZXJfY29udHJvbCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kaXNhYmxlX3NlcmlhbF9udW1iZXJfY29udHJvbF91bnBhY2soYmNtb2x0X2Rpc2FibGVfc2VyaWFsX251bWJlcl9jb250cm9sICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZHJ2X2ljZl9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZHJ2X2ljZl9pZF9wYWNrKGJjbW9sdF9kcnZfaWNmX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Rydl9pY2ZfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZHJ2X2ljZl9pZF91bnBhY2soYmNtb2x0X2Rydl9pY2ZfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9kcnZfc2diX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kcnZfc2diX2lkX3BhY2soYmNtb2x0X2Rydl9zZ2JfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZHJ2X3NnYl9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kcnZfc2diX2lkX3VucGFjayhiY21vbHRfZHJ2X3NnYl9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RzX3ZsYW5fYWN0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kc192bGFuX2FjdGlvbl9wYWNrKGJjbW9sdF9kc192bGFuX2FjdGlvbiB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9kc192bGFuX2FjdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9kc192bGFuX2FjdGlvbl91bnBhY2soYmNtb2x0X2RzX3ZsYW5fYWN0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfdGZiX3RyYXBfYmVoYXZpb3IgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RmYl90cmFwX2JlaGF2aW9yX3BhY2soYmNtb2x0X3RmYl90cmFwX2JlaGF2aW9yIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3RmYl90cmFwX2JlaGF2aW9yIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RmYl90cmFwX2JlaGF2aW9yX3VucGFjayhiY21vbHRfdGZiX3RyYXBfYmVoYXZpb3IgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF90ZmJfbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdGZiX21vZGVfcGFjayhiY21vbHRfdGZiX21vZGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfdGZiX21vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdGZiX21vZGVfdW5wYWNrKGJjbW9sdF90ZmJfbW9kZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2xpbV9zZWNfbW9kZV91cCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbGltX3NlY19tb2RlX3VwX3BhY2soYmNtb2x0X2xpbV9zZWNfbW9kZV91cCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9saW1fc2VjX21vZGVfdXAgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbGltX3NlY19tb2RlX3VwX3VucGFjayhiY21vbHRfbGltX3NlY19tb2RlX3VwICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfbGltX3NlY19tb2RlX2RuIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9saW1fc2VjX21vZGVfZG5fcGFjayhiY21vbHRfbGltX3NlY19tb2RlX2RuIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2xpbV9zZWNfbW9kZV9kbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9saW1fc2VjX21vZGVfZG5fdW5wYWNrKGJjbW9sdF9saW1fc2VjX21vZGVfZG4gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94aW1fc2VjX21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hpbV9zZWNfbW9kZV9wYWNrKGJjbW9sdF94aW1fc2VjX21vZGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGltX3NlY19tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hpbV9zZWNfbW9kZV91bnBhY2soYmNtb2x0X3hpbV9zZWNfbW9kZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2hzY19yYW0gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2hzY19yYW1fcGFjayhiY21vbHRfaHNjX3JhbSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9oc2NfcmFtIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2hzY19yYW1fdW5wYWNrKGJjbW9sdF9oc2NfcmFtICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfbGltX3JhbSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbGltX3JhbV9wYWNrKGJjbW9sdF9saW1fcmFtIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2xpbV9yYW0gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbGltX3JhbV91bnBhY2soYmNtb2x0X2xpbV9yYW0gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9sa3lfcmFtIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9sa3lfcmFtX3BhY2soYmNtb2x0X2xreV9yYW0gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbGt5X3JhbSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9sa3lfcmFtX3VucGFjayhiY21vbHRfbGt5X3JhbSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X21pY19yYW0gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X21pY19yYW1fcGFjayhiY21vbHRfbWljX3JhbSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9taWNfcmFtIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X21pY19yYW1fdW5wYWNrKGJjbW9sdF9taWNfcmFtICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeHBjc3JtX3JhbSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeHBjc3JtX3JhbV9wYWNrKGJjbW9sdF94cGNzcm1fcmFtIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hwY3NybV9yYW0gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeHBjc3JtX3JhbV91bnBhY2soYmNtb2x0X3hwY3NybV9yYW0gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lbWJlZGRlZF9pbWFnZV90cmFuc2Zlcl9zdGF0dXMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2VtYmVkZGVkX2ltYWdlX3RyYW5zZmVyX3N0YXR1c19wYWNrKGJjbW9sdF9lbWJlZGRlZF9pbWFnZV90cmFuc2Zlcl9zdGF0dXMgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZW1iZWRkZWRfaW1hZ2VfdHJhbnNmZXJfc3RhdHVzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2VtYmVkZGVkX2ltYWdlX3RyYW5zZmVyX3N0YXR1c191bnBhY2soYmNtb2x0X2VtYmVkZGVkX2ltYWdlX3RyYW5zZmVyX3N0YXR1cyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9mb3JtYXQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9mb3JtYXRfcGFjayhiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2Zvcm1hdCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2VuY3J5cHRpb25faW5mb3JtYXRpb25fZm9ybWF0IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9mb3JtYXRfdW5wYWNrKGJjbW9sdF9lcG9uX2VuY3J5cHRpb25faW5mb3JtYXRpb25fZm9ybWF0ICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZW5lcmd5X2RldGVjdF9zb3VyY2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2VuZXJneV9kZXRlY3Rfc291cmNlX3BhY2soYmNtb2x0X2VuZXJneV9kZXRlY3Rfc291cmNlIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2VuZXJneV9kZXRlY3Rfc291cmNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2VuZXJneV9kZXRlY3Rfc291cmNlX3VucGFjayhiY21vbHRfZW5lcmd5X2RldGVjdF9zb3VyY2UgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uXzFnX3R1cmJvX21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fMWdfdHVyYm9fbW9kZV9wYWNrKGJjbW9sdF9lcG9uXzFnX3R1cmJvX21vZGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl8xZ190dXJib19tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fMWdfdHVyYm9fbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fMWdfdHVyYm9fbW9kZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X21vZGVfcGFjayhiY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfbW9kZSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9tb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9kYmFfcmVwb3J0aW5nX21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGJhX3JlcG9ydGluZ19tb2RlX3BhY2soYmNtb2x0X2Vwb25fZGJhX3JlcG9ydGluZ19tb2RlIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fZGJhX3JlcG9ydGluZ19tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGJhX3JlcG9ydGluZ19tb2RlX3VucGFjayhiY21vbHRfZXBvbl9kYmFfcmVwb3J0aW5nX21vZGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfcmF0ZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3JhdGVfcGFjayhiY21vbHRfZXBvbl9saW5rX3JhdGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9saW5rX3JhdGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3JhdGVfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfcmF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3N0YXR1cyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfc3RhdHVzX3BhY2soYmNtb2x0X3N0YXR1cyB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9zdGF0dXMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfc3RhdHVzX3VucGFjayhiY21vbHRfc3RhdHVzICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19pZF9wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19pZF91bnBhY2soYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfaWRfcGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleV9pZF9wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleV9pZF91bnBhY2soYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25faWRfcGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25faWRfdW5wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25faWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb25faWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9pZF9wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb25faWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9pZF91bnBhY2soYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9pZF9wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9pZF91bnBhY2soYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9pZF9wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25faWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9pZF91bnBhY2soYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25faWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25faWRfcGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25faWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25faWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25faWRfdW5wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9pZF9wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9pZF91bnBhY2soYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25faWRfcGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25faWRfdW5wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25faWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2lkX3BhY2soYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb25faWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2lkX3VucGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25faWRfcGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbl9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25faWRfdW5wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25faWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX21vZGVfcGFjayhiY21vbHRfZXBvbl9lbmNyeXB0aW9uX21vZGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX21vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fbW9kZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fa2V5X2Nob2ljZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9rZXlfY2hvaWNlX3BhY2soYmNtb2x0X2Vwb25fa2V5X2Nob2ljZSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2tleV9jaG9pY2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9rZXlfY2hvaWNlX3VucGFjayhiY21vbHRfZXBvbl9rZXlfY2hvaWNlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2RpcmVjdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2RpcmVjdGlvbl9wYWNrKGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fZGlyZWN0aW9uIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9kaXJlY3Rpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2RpcmVjdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9kaXJlY3Rpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2ZlY19lbl9zdGF0ZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGVfcGFjayhiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGVfdW5wYWNrKGJjbW9sdF9lcG9uX2ZlY19lbl9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fdHlwZSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90eXBlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfaWRfcGFjayhiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19kZWxldGVfbGlua19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2RlbGV0ZV9saW5rX2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19kZWxldGVfbGlua19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfZGVsZXRlX2xpbmtfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2RlbGV0ZV9saW5rX2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX2RlbGV0ZV9saW5rX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfaWRfcGFjayhiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfZW5jcnlwdGlvbl9lbmFibGVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfZW5jcnlwdGlvbl9lbmFibGVkX2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19lbmNyeXB0aW9uX2VuYWJsZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2VuY3J5cHRpb25fZW5hYmxlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfZW5jcnlwdGlvbl9lbmFibGVkX2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX2VuY3J5cHRpb25fZW5hYmxlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19mZWNfc3RhdGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19mZWNfc3RhdGVfcGFjayhiY21vbHRfZXBvbl9saW5rX2ZlY19zdGF0ZSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfZmVjX3N0YXRlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19mZWNfc3RhdGVfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfZmVjX3N0YXRlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2ZvcmNlX3JlZGlzY292ZXJ5X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfZm9yY2VfcmVkaXNjb3ZlcnlfaWRfcGFjayhiY21vbHRfZXBvbl9saW5rX2ZvcmNlX3JlZGlzY292ZXJ5X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19mb3JjZV9yZWRpc2NvdmVyeV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfZm9yY2VfcmVkaXNjb3ZlcnlfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfZm9yY2VfcmVkaXNjb3ZlcnlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19zdGF0dXMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0dXNfcGFjayhiY21vbHRfZXBvbl9saW5rX3N0YXR1cyB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfc3RhdHVzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0dXNfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfc3RhdHVzICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfbXBjcF9kaXNjb3ZlcnlfaW5mbyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbXBjcF9kaXNjb3ZlcnlfaW5mb19wYWNrKGJjbW9sdF9tcGNwX2Rpc2NvdmVyeV9pbmZvIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X21wY3BfZGlzY292ZXJ5X2luZm8gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbXBjcF9kaXNjb3ZlcnlfaW5mb191bnBhY2soYmNtb2x0X21wY3BfZGlzY292ZXJ5X2luZm8gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9pZF91bnBhY2soYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0ZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydGVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdG9wX2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdG9wX2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdG9wX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdG9wcGVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BwZWRfaWRfcGFjayhiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdG9wcGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcHBlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BwZWRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BwZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2tleV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19saW5rX2RlbGV0ZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19saW5rX2RlbGV0ZWRfaWRfcGFjayhiY21vbHRfZXBvbl9saW5rX2xpbmtfZGVsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfbGlua19kZWxldGVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19saW5rX2RlbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfbGlua19kZWxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kZXJlZ2lzdGVyZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19tcGNwX2RlcmVnaXN0ZXJlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kZXJlZ2lzdGVyZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9saW5rX21wY3BfZGVyZWdpc3RlcmVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19tcGNwX2RlcmVnaXN0ZXJlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fbGlua19tcGNwX2RlcmVnaXN0ZXJlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfaWRfcGFjayhiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX21wY3BfcmVnX2Fja190aW1lb3V0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZWdfYWNrX3RpbWVvdXRfaWRfcGFjayhiY21vbHRfZXBvbl9saW5rX21wY3BfcmVnX2Fja190aW1lb3V0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlZ19hY2tfdGltZW91dF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZWdfYWNrX3RpbWVvdXRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZWdfYWNrX3RpbWVvdXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfaWRfcGFjayhiY21vbHRfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfaWRfcGFjayhiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydGVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydGVkX2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydGVkX2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BfaWRfcGFjayhiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BwZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BwZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkX2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkX2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfcmVyYW5nZV9mYWlsdXJlX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfcmVyYW5nZV9mYWlsdXJlX2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19yZXJhbmdlX2ZhaWx1cmVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9saW5rX3JlcmFuZ2VfZmFpbHVyZV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfcmVyYW5nZV9mYWlsdXJlX2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX3JlcmFuZ2VfZmFpbHVyZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfcGFjayhiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWRfaWRfcGFjayhiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19pZF91bnBhY2soYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZF91bnBhY2soYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX3N0YXRlX2ZsYWdzIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGVfZmxhZ3NfcGFjayhiY21vbHRfZXBvbl9saW5rX3N0YXRlX2ZsYWdzIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19zdGF0ZV9mbGFncyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGVfZmxhZ3NfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfc3RhdGVfZmxhZ3MgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lX2lkX3BhY2soYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RvbmVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZG9uZV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lX2lkX3VucGFjayhiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZG9uZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9pZF9wYWNrKGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9pZF91bnBhY2soYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua190eXBlX3BhY2soYmNtb2x0X2Vwb25fbGlua190eXBlIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua190eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua190eXBlX3VucGFjayhiY21vbHRfZXBvbl9saW5rX3R5cGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9tcGNwX2dhdGVfbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbXBjcF9nYXRlX21vZGVfcGFjayhiY21vbHRfbXBjcF9nYXRlX21vZGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbXBjcF9nYXRlX21vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbXBjcF9nYXRlX21vZGVfdW5wYWNrKGJjbW9sdF9tcGNwX2dhdGVfbW9kZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X21wY3BfcmVnaXN0cmF0aW9uX2dhdGVfZmxhZ3MgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X21wY3BfcmVnaXN0cmF0aW9uX2dhdGVfZmxhZ3NfcGFjayhiY21vbHRfbXBjcF9yZWdpc3RyYXRpb25fZ2F0ZV9mbGFncyB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9tcGNwX3JlZ2lzdHJhdGlvbl9nYXRlX2ZsYWdzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X21wY3BfcmVnaXN0cmF0aW9uX2dhdGVfZmxhZ3NfdW5wYWNrKGJjbW9sdF9tcGNwX3JlZ2lzdHJhdGlvbl9nYXRlX2ZsYWdzICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9uaV9hZGRfbGlua19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9hZGRfbGlua19pZF9wYWNrKGJjbW9sdF9lcG9uX25pX2FkZF9saW5rX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9hZGRfbGlua19pZF91bnBhY2soYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfaWRfcGFjayhiY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfaWRfcGFjayhiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19pZF9wYWNrKGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19pZF91bnBhY2soYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX25pX2F1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmVfaWRfcGFjayhiY21vbHRfZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmVfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmVfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX25pX2F1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmVfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmVfaWRfcGFjayhiY21vbHRfZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX25pX2F1dG9fcm9ndWVfc2Nhbl8xZ19mYWlsdXJlX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmVfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX25pX2F1dG9fcm9ndWVfc2Nhbl8xZ19mYWlsdXJlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9uaV9jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfY2ZnX2lkX3BhY2soYmNtb2x0X2Vwb25fbmlfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfY2ZnX2lkX3VucGFjayhiY21vbHRfZXBvbl9uaV9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX25pX2VuX3N0YXRlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2VuX3N0YXRlX3BhY2soYmNtb2x0X2Vwb25fbmlfZW5fc3RhdGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9uaV9lbl9zdGF0ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2VuX3N0YXRlX3VucGFjayhiY21vbHRfZXBvbl9uaV9lbl9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2lkX3BhY2soYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2lkX3VucGFjayhiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9uaV9rZXlfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfa2V5X2lkX3BhY2soYmNtb2x0X2Vwb25fbmlfa2V5X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfa2V5X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfa2V5X2lkX3VucGFjayhiY21vbHRfZXBvbl9uaV9rZXlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9pZF9wYWNrKGJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2lkX3BhY2soYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX25pX21wY3BfdGltZXN0YW1wX2NoYW5nZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2lkX3VucGFjayhiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfaWRfcGFjayhiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0c19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkX3BhY2soYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkX3VucGFjayhiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2lkX3BhY2soYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfaWQgZnJvbSAKKyAqIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX25pX3JlcmFuZ2VfZmFpbHVyZV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9yZXJhbmdlX2ZhaWx1cmVfaWRfcGFjayhiY21vbHRfZXBvbl9uaV9yZXJhbmdlX2ZhaWx1cmVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9uaV9yZXJhbmdlX2ZhaWx1cmVfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9yZXJhbmdlX2ZhaWx1cmVfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX25pX3JlcmFuZ2VfZmFpbHVyZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9pZF9wYWNrKGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9pZF91bnBhY2soYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfaWRfcGFjayhiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfaWRfcGFjayhiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZF9wYWNrKGJjbW9sdF9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZF91bnBhY2soYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2V4dGVuc2lvbl90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9leHRlbnNpb25fdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9leHRlbnNpb25fdHlwZSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9leHRlbnNpb25fdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9leHRlbnNpb25fdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2V4dGVuc2lvbl90eXBlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfaWRfcGFjayhiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2lkX3BhY2soYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2lkX3VucGFjayhiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXlfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXlfaWRfcGFjayhiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXlfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2lkX3BhY2soYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2lkX3VucGFjayhiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2lkX3BhY2soYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2lkX3VucGFjayhiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfaWRfcGFjayhiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2lkX3BhY2soYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29udV8xZ191c19jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2lkX3VucGFjayhiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19rZXlfaWRfcGFjayhiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19rZXlfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX29udV8xZ191c19rZXlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2lkX3BhY2soYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2lkX3VucGFjayhiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2lkX3BhY2soYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2lkX3VucGFjayhiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfb251X3Jlc3BvbnNlX2NvZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfb251X3Jlc3BvbnNlX2NvZGVfcGFjayhiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9vbnVfcmVzcG9uc2VfY29kZSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29udV91cGdyYWRlX29udV9yZXNwb25zZV9jb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfb251X3Jlc3BvbnNlX2NvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX29udV9yZXNwb25zZV9jb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9yZXR1cm5fY29kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9yZXR1cm5fY29kZV9wYWNrKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3JldHVybl9jb2RlIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcmV0dXJuX2NvZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9yZXR1cm5fY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcmV0dXJuX2NvZGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2lkX3BhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2lkX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19pZF9wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19pZF91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXlfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5X2lkX3BhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5X2lkX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfcGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWRfcGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19pZF9wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19pZF91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9pZF9wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9pZF91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfaWRfcGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2lkX3BhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2lkX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXlfaWRfcGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXlfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXlfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2lkX3BhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2lkX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2lkX3BhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2lkX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfaWRfcGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2lkX3BhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2lkX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXlfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXlfaWRfcGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXlfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9pZF9wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9pZF91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2lkX3BhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2lkX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2lkX3BhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2lkX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19pZF9wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19pZF91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfaWRfcGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleV9pZF9wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXlfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleV9pZF91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3BhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3BhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfaWRfcGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWRfcGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zdGF0ZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N0YXRlX3BhY2soYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zdGF0ZSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3RhdGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N0YXRlX3VucGFjayhiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N0YXRlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfcGFjayhiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZXRlY3Rpb25fb3B0aW9ucyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGV0ZWN0aW9uX29wdGlvbnNfcGFjayhiY21vbHRfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGV0ZWN0aW9uX29wdGlvbnMgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGV0ZWN0aW9uX29wdGlvbnMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGV0ZWN0aW9uX29wdGlvbnNfdW5wYWNrKGJjbW9sdF9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZXRlY3Rpb25fb3B0aW9ucyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfcmVyYW5naW5nX29wdGlvbnMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfcmVyYW5naW5nX29wdGlvbnNfcGFjayhiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19yZXJhbmdpbmdfb3B0aW9ucyB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3JlcmFuZ2luZ19vcHRpb25zIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfcmVyYW5naW5nX29wdGlvbnNfdW5wYWNrKGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3JlcmFuZ2luZ19vcHRpb25zICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bpb19waW4gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwaW9fcGluX3BhY2soYmNtb2x0X2dwaW9fcGluIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwaW9fcGluIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwaW9fcGluX3VucGFjayhiY21vbHRfZ3Bpb19waW4gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncGlvX3BvbGFyaXR5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncGlvX3BvbGFyaXR5X3BhY2soYmNtb2x0X2dwaW9fcG9sYXJpdHkgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bpb19wb2xhcml0eSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncGlvX3BvbGFyaXR5X3VucGFjayhiY21vbHRfZ3Bpb19wb2xhcml0eSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fcnBfY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3JwX2NmZ19pZF9wYWNrKGJjbW9sdF9lcG9uX3JwX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3JwX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3JwX2NmZ19pZF91bnBhY2soYmNtb2x0X2Vwb25fcnBfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9ycF9rZXlfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcnBfa2V5X2lkX3BhY2soYmNtb2x0X2Vwb25fcnBfa2V5X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fcnBfa2V5X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcnBfa2V5X2lkX3VucGFjayhiY21vbHRfZXBvbl9ycF9rZXlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9leHRfaXJxIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9leHRfaXJxX3BhY2soYmNtb2x0X2V4dF9pcnEgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXh0X2lycSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9leHRfaXJxX3VucGFjayhiY21vbHRfZXh0X2lycSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2ZsdXNoX21hY190YWJsZV9vcHRpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2ZsdXNoX21hY190YWJsZV9vcHRpb25fcGFjayhiY21vbHRfZmx1c2hfbWFjX3RhYmxlX29wdGlvbiB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9mbHVzaF9tYWNfdGFibGVfb3B0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2ZsdXNoX21hY190YWJsZV9vcHRpb25fdW5wYWNrKGJjbW9sdF9mbHVzaF9tYWNfdGFibGVfb3B0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZnJlcXVlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9mcmVxdWVuY3lfYWRqdXN0bWVudF9kaXJlY3Rpb25fcGFjayhiY21vbHRfZnJlcXVlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2ZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9mcmVxdWVuY3lfYWRqdXN0bWVudF9kaXJlY3Rpb25fdW5wYWNrKGJjbW9sdF9mcmVxdWVuY3lfYWRqdXN0bWVudF9kaXJlY3Rpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9nZW1fcG9ydF9kaXJlY3Rpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dlbV9wb3J0X2RpcmVjdGlvbl9wYWNrKGJjbW9sdF9nZW1fcG9ydF9kaXJlY3Rpb24gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ2VtX3BvcnRfZGlyZWN0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dlbV9wb3J0X2RpcmVjdGlvbl91bnBhY2soYmNtb2x0X2dlbV9wb3J0X2RpcmVjdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dlbV9wb3J0X3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dlbV9wb3J0X3R5cGVfcGFjayhiY21vbHRfZ2VtX3BvcnRfdHlwZSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9nZW1fcG9ydF90eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dlbV9wb3J0X3R5cGVfdW5wYWNrKGJjbW9sdF9nZW1fcG9ydF90eXBlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ2VtX3BvcnRfb3BlcmF0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9nZW1fcG9ydF9vcGVyYXRpb25fcGFjayhiY21vbHRfZ2VtX3BvcnRfb3BlcmF0aW9uIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dlbV9wb3J0X29wZXJhdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9nZW1fcG9ydF9vcGVyYXRpb25fdW5wYWNrKGJjbW9sdF9nZW1fcG9ydF9vcGVyYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncGlvX2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bpb19jZmdfaWRfcGFjayhiY21vbHRfZ3Bpb19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bpb19jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bpb19jZmdfaWRfdW5wYWNrKGJjbW9sdF9ncGlvX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwaW9fa2V5X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncGlvX2tleV9pZF9wYWNrKGJjbW9sdF9ncGlvX2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncGlvX2tleV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncGlvX2tleV9pZF91bnBhY2soYmNtb2x0X2dwaW9fa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bpb19waW5fZGlyIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncGlvX3Bpbl9kaXJfcGFjayhiY21vbHRfZ3Bpb19waW5fZGlyIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwaW9fcGluX2RpciBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncGlvX3Bpbl9kaXJfdW5wYWNrKGJjbW9sdF9ncGlvX3Bpbl9kaXIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncGlvX3ZhbHVlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncGlvX3ZhbHVlX3BhY2soYmNtb2x0X2dwaW9fdmFsdWUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bpb192YWx1ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncGlvX3ZhbHVlX3VucGFjayhiY21vbHRfZ3Bpb192YWx1ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfaWRfcGFjayhiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9hbGxvY19jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2lkX3BhY2soYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9hbGxvY19jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2lkX3BhY2soYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2FsbG9jX2tleV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19rZXlfaWRfcGFjayhiY21vbHRfZ3Bvbl9hbGxvY19rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9hbGxvY19rZXlfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19rZXlfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2FsbG9jX2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9pZF9wYWNrKGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9pZF91bnBhY2soYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3BhY2soYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3BhY2soYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfaWRfcGFjayhiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfaWRfcGFjayhiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2lkX3BhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19pZF9wYWNrKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19pZF91bnBhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXlfaWRfcGFjayhiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXlfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXlfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9pZF9wYWNrKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9pZF91bnBhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3BhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2lkX3BhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfaWRfcGFjayhiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfaWRfcGFjayhiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRlX3BhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRlX3VucGFjayhiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19pZF9wYWNrKGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19pZF91bnBhY2soYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9jZmdfaWRfcGFjayhiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25faXdmX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9jZmdfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19pZF9wYWNrKGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19pZF91bnBhY2soYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5X2lkX3BhY2soYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXlfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5X2lkX3VucGFjayhiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19pZF9wYWNrKGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19pZF91bnBhY2soYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X2lkX3BhY2soYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X2lkX3VucGFjayhiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9jb21wbGV0ZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfY29tcGxldGVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfaWRfcGFjayhiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9rZXlfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2tleV9pZF9wYWNrKGJjbW9sdF9ncG9uX2l3Zl9rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9pd2Zfa2V5X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2tleV9pZF91bnBhY2soYmNtb2x0X2dwb25faXdmX2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2lkX3BhY2soYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19pZF9wYWNrKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19pZF91bnBhY2soYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X2lkX3BhY2soYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X2lkX3VucGFjayhiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfYWdlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19hZ2VkX2lkX3BhY2soYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfYWdlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2FnZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19hZ2VkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19hZ2VkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9pZF9wYWNrKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9pZF91bnBhY2soYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19pZF9wYWNrKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19pZF91bnBhY2soYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfaWRfcGFjayhiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3BhY2soYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3BhY2soYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfaWRfcGFjayhiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25faXdmX3N0YXRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3N0YXRfaWRfcGFjayhiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3N0YXRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2lkX3BhY2soYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXlfaWRfcGFjayhiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXlfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXlfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2tleV9leGNoYW5nZV9tb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9rZXlfZXhjaGFuZ2VfbW9kZV9wYWNrKGJjbW9sdF9rZXlfZXhjaGFuZ2VfbW9kZSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9rZXlfZXhjaGFuZ2VfbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9rZXlfZXhjaGFuZ2VfbW9kZV91bnBhY2soYmNtb2x0X2tleV9leGNoYW5nZV9tb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X2dwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2lkX3BhY2soYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2lkX3BhY2soYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfY2ZnX2lkX3BhY2soYmNtb2x0X2dwb25fbmlfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fbmlfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfY2ZnX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9pZF9wYWNrKGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9pZF91bnBhY2soYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fbmlfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fbmlfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9pZF9wYWNrKGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9pZF91bnBhY2soYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX25pX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX25pX2tleV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9rZXlfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV9rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9rZXlfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9rZXlfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX25pX2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fbmlfbG9zX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2xvc19pZF9wYWNrKGJjbW9sdF9ncG9uX25pX2xvc19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX25pX2xvc19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2xvc19pZF91bnBhY2soYmNtb2x0X2dwb25fbmlfbG9zX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkX3BhY2soYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfaWQgZnJvbSAKKyAqIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9pZCAKKyAqIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2lkX3BhY2soYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSAKKyAqIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2lkIGZyb20gCisgKiBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9pZF91bnBhY2soYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX25pX3Jlc2V0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3Jlc2V0X2lkX3BhY2soYmNtb2x0X2dwb25fbmlfcmVzZXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9yZXNldF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3Jlc2V0X2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9yZXNldF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX25pX3JvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnRfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3JvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fbmlfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0X2lkX3BhY2soYmNtb2x0X2dwb25fbmlfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX25pX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0X2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9pZF9wYWNrKGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9pZF91bnBhY2soYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fbmlfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2lkX3BhY2soYmNtb2x0X2dwb25fbmlfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfaWQgZnJvbSAKKyAqIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3BhY2soYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3BhY2soYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXRfaWRfcGFjayhiY21vbHRfZ3Bvbl9uaV9zdGF0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fbmlfc3RhdF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3N0YXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9pZF9wYWNrKGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9pZF91bnBhY2soYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9jZmdfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9jZmdfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2lkX3BhY2soYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9kZmlfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2RmaV9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9kZmlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfZGZpX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2RmaV9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X2RmaV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X2RnaV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfZGdpX2lkX3BhY2soYmNtb2x0X2dwb25fb251X2RnaV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9kZ2lfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfZGdpX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfZGdpX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfZG93aV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfZG93aV9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9kb3dpX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X2Rvd2lfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfZG93aV9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X2Rvd2lfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9lcnJfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2Vycl9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9lcnJfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfZXJyX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2Vycl9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X2Vycl9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9rZXlfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfa2V5X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X2tleV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9rZXlfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9rZXlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9sb2FpX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9sb2FpX2lkX3BhY2soYmNtb2x0X2dwb25fb251X2xvYWlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfbG9haV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9sb2FpX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfbG9haV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X2xva2lfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2xva2lfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfbG9raV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9sb2tpX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2xva2lfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9sb2tpX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfbWVtaV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfbWVtaV9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9tZW1pX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X21lbWlfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfbWVtaV9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X21lbWlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X29udV9hbGFybV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2lkX3BhY2soYmNtb2x0X2dwb25fb251X29udV9hbGFybV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1faWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb25faWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X29wdGljYWxfcmVmbGVjdGlvbl9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb25faWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb25faWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X3BlZV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcGVlX2lkX3BhY2soYmNtb2x0X2dwb25fb251X3BlZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9wZWVfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcGVlX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfcGVlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfcHN0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wc3RfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfcHN0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X3BzdF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wc3RfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9wc3RfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X3JlaV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcmVpX2lkX3BhY2soYmNtb2x0X2dwb25fb251X3JlaV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9yZWlfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcmVpX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfcmVpX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2lkX3BhY2soYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X3NkaV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc2RpX2lkX3BhY2soYmNtb2x0X2dwb25fb251X3NkaV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9zZGlfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc2RpX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfc2RpX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9zZmlfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3NmaV9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9zZmlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfc2ZpX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3NmaV9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X3NmaV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3BhY2soYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2lkX3BhY2soYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X3N0YXRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3N0YXRfaWRfcGFjayhiY21vbHRfZ3Bvbl9vbnVfc3RhdF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9zdGF0X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3N0YXRfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9zdGF0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfc3VmaV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3VmaV9pZF9wYWNrKGJjbW9sdF9ncG9uX29udV9zdWZpX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X3N1ZmlfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3VmaV9pZF91bnBhY2soYmNtb2x0X2dwb25fb251X3N1ZmlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV90aXdpX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV90aXdpX2lkX3BhY2soYmNtb2x0X2dwb25fb251X3Rpd2lfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfdGl3aV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV90aXdpX2lkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfdGl3aV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X29tY2lfZGV2aWNlX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9vbWNpX2RldmljZV9pZF9wYWNrKGJjbW9sdF9vbWNpX2RldmljZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9vbWNpX2RldmljZV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9vbWNpX2RldmljZV9pZF91bnBhY2soYmNtb2x0X29tY2lfZGV2aWNlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9yZXR1cm5fY29kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9yZXR1cm5fY29kZV9wYWNrKGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3JldHVybl9jb2RlIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcmV0dXJuX2NvZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9yZXR1cm5fY29kZV91bnBhY2soYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcmV0dXJuX2NvZGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9vbWNpX3Jlc3VsdF9jb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9vbWNpX3Jlc3VsdF9jb2RlX3BhY2soYmNtb2x0X29tY2lfcmVzdWx0X2NvZGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfb21jaV9yZXN1bHRfY29kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9vbWNpX3Jlc3VsdF9jb2RlX3VucGFjayhiY21vbHRfb21jaV9yZXN1bHRfY29kZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X29udV9zdGF0ZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfb251X3N0YXRlX3BhY2soYmNtb2x0X29udV9zdGF0ZSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9vbnVfc3RhdGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfb251X3N0YXRlX3VucGFjayhiY21vbHRfb251X3N0YXRlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfcnNzaV9sb2NhdGlvbl9zaWduIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9yc3NpX2xvY2F0aW9uX3NpZ25fcGFjayhiY21vbHRfcnNzaV9sb2NhdGlvbl9zaWduIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3Jzc2lfbG9jYXRpb25fc2lnbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9yc3NpX2xvY2F0aW9uX3NpZ25fdW5wYWNrKGJjbW9sdF9yc3NpX2xvY2F0aW9uX3NpZ24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9vbnVfcG9zdF9kaXNjb3ZlcnlfbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfb251X3Bvc3RfZGlzY292ZXJ5X21vZGVfcGFjayhiY21vbHRfb251X3Bvc3RfZGlzY292ZXJ5X21vZGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfb251X3Bvc3RfZGlzY292ZXJ5X21vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfb251X3Bvc3RfZGlzY292ZXJ5X21vZGVfdW5wYWNrKGJjbW9sdF9vbnVfcG9zdF9kaXNjb3ZlcnlfbW9kZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fdHJ4X2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl90cnhfY2ZnX2lkX3BhY2soYmNtb2x0X2dwb25fdHJ4X2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX3RyeF9jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl90cnhfY2ZnX2lkX3VucGFjayhiY21vbHRfZ3Bvbl90cnhfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl90cnhfa2V5X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX3RyeF9rZXlfaWRfcGFjayhiY21vbHRfZ3Bvbl90cnhfa2V5X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fdHJ4X2tleV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX3RyeF9rZXlfaWRfdW5wYWNrKGJjbW9sdF9ncG9uX3RyeF9rZXlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9pbWFnZV90cmFuc2Zlcl9zdGF0dXMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2ltYWdlX3RyYW5zZmVyX3N0YXR1c19wYWNrKGJjbW9sdF9pbWFnZV90cmFuc2Zlcl9zdGF0dXMgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfaW1hZ2VfdHJhbnNmZXJfc3RhdHVzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2ltYWdlX3RyYW5zZmVyX3N0YXR1c191bnBhY2soYmNtb2x0X2ltYWdlX3RyYW5zZmVyX3N0YXR1cyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2l3Zl9tb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9pd2ZfbW9kZV9wYWNrKGJjbW9sdF9pd2ZfbW9kZSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9pd2ZfbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9pd2ZfbW9kZV91bnBhY2soYmNtb2x0X2l3Zl9tb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfaWRfcGFjayhiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfaWRfdW5wYWNrKGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9sb2dfZW50cnlfY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfY2ZnX2lkX3BhY2soYmNtb2x0X2xvZ19lbnRyeV9jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbG9nX2VudHJ5X2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfY2ZnX2lkX3VucGFjayhiY21vbHRfbG9nX2VudHJ5X2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2xvZ19lbnRyeV9rZXlfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9rZXlfaWRfcGFjayhiY21vbHRfbG9nX2VudHJ5X2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9sb2dfZW50cnlfa2V5X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9rZXlfaWRfdW5wYWNrKGJjbW9sdF9sb2dfZW50cnlfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9wYWNrKGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9pZF91bnBhY2soYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9pZF9wYWNrKGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9pZF91bnBhY2soYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnX2lkX3BhY2soYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnX2lkX3VucGFjayhiY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfbG9nX2VudHJ5X3N0YXRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2lkX3BhY2soYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2lkX3VucGFjayhiY21vbHRfbG9nX2VudHJ5X3N0YXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9sb2dfZmlsZV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2ZpbGVfaWRfcGFjayhiY21vbHRfbG9nX2ZpbGVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbG9nX2ZpbGVfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2ZpbGVfaWRfdW5wYWNrKGJjbW9sdF9sb2dfZmlsZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2xvZ19sZXZlbCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2xldmVsX3BhY2soYmNtb2x0X2xvZ19sZXZlbCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9sb2dfbGV2ZWwgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2xldmVsX3VucGFjayhiY21vbHRfbG9nX2xldmVsICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfbG9nX3N0eWxlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dfc3R5bGVfcGFjayhiY21vbHRfbG9nX3N0eWxlIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2xvZ19zdHlsZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dfc3R5bGVfdW5wYWNrKGJjbW9sdF9sb2dfc3R5bGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9sb2dfdHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX3R5cGVfcGFjayhiY21vbHRfbG9nX3R5cGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbG9nX3R5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX3R5cGVfdW5wYWNrKGJjbW9sdF9sb2dfdHlwZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2lkX3BhY2soYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9sb2dnZXJfYXV0b19jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2lkX3VucGFjayhiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfbG9nZ2VyX2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX2NmZ19pZF9wYWNrKGJjbW9sdF9sb2dnZXJfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2xvZ2dlcl9jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX2NmZ19pZF91bnBhY2soYmNtb2x0X2xvZ2dlcl9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9sb2dnZXJfY2xlYXJfbG9nX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfY2xlYXJfbG9nX2lkX3BhY2soYmNtb2x0X2xvZ2dlcl9jbGVhcl9sb2dfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbG9nZ2VyX2NsZWFyX2xvZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfY2xlYXJfbG9nX2lkX3VucGFjayhiY21vbHRfbG9nZ2VyX2NsZWFyX2xvZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2xvZ2dlcl9rZXlfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9rZXlfaWRfcGFjayhiY21vbHRfbG9nZ2VyX2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9sb2dnZXJfa2V5X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9rZXlfaWRfdW5wYWNrKGJjbW9sdF9sb2dnZXJfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9wYWNrKGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF91bnBhY2soYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZF9pZF9wYWNrKGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZF9pZF91bnBhY2soYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2lkX3BhY2soYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9sb2dnZXJfc3RhdF9jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2lkX3VucGFjayhiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfbG9nZ2VyX3N0YXRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9zdGF0X2lkX3BhY2soYmNtb2x0X2xvZ2dlcl9zdGF0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2xvZ2dlcl9zdGF0X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9zdGF0X2lkX3VucGFjayhiY21vbHRfbG9nZ2VyX3N0YXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9tYWNfdGFibGVfbWlzc19mYWxsYmFjayB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbWFjX3RhYmxlX21pc3NfZmFsbGJhY2tfcGFjayhiY21vbHRfbWFjX3RhYmxlX21pc3NfZmFsbGJhY2sgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbWFjX3RhYmxlX21pc3NfZmFsbGJhY2sgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbWFjX3RhYmxlX21pc3NfZmFsbGJhY2tfdW5wYWNrKGJjbW9sdF9tYWNfdGFibGVfbWlzc19mYWxsYmFjayAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X21hY190YWJsZV9sZWFybmluZ19tb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9tYWNfdGFibGVfbGVhcm5pbmdfbW9kZV9wYWNrKGJjbW9sdF9tYWNfdGFibGVfbGVhcm5pbmdfbW9kZSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9tYWNfdGFibGVfbGVhcm5pbmdfbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9tYWNfdGFibGVfbGVhcm5pbmdfbW9kZV91bnBhY2soYmNtb2x0X21hY190YWJsZV9sZWFybmluZ19tb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfbWFwcGluZ190YWdfbWV0aG9kIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9tYXBwaW5nX3RhZ19tZXRob2RfcGFjayhiY21vbHRfbWFwcGluZ190YWdfbWV0aG9kIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X21hcHBpbmdfdGFnX21ldGhvZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9tYXBwaW5nX3RhZ19tZXRob2RfdW5wYWNrKGJjbW9sdF9tYXBwaW5nX3RhZ19tZXRob2QgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ubmlfYXV0b19jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9hdXRvX2NmZ19pZF9wYWNrKGJjbW9sdF9ubmlfYXV0b19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbm5pX2F1dG9fY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9hdXRvX2NmZ19pZF91bnBhY2soYmNtb2x0X25uaV9hdXRvX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X25uaV9jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9jZmdfaWRfcGFjayhiY21vbHRfbm5pX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ubmlfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9jZmdfaWRfdW5wYWNrKGJjbW9sdF9ubmlfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfbm5pX2Nvbm5lY3Rpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9jb25uZWN0aW9uX3BhY2soYmNtb2x0X25uaV9jb25uZWN0aW9uIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X25uaV9jb25uZWN0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9jb25uZWN0aW9uX3VucGFjayhiY21vbHRfbm5pX2Nvbm5lY3Rpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ubmlfa2V5X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfa2V5X2lkX3BhY2soYmNtb2x0X25uaV9rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbm5pX2tleV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfa2V5X2lkX3VucGFjayhiY21vbHRfbm5pX2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3RyaXZhbGVudCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdHJpdmFsZW50X3BhY2soYmNtb2x0X3RyaXZhbGVudCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF90cml2YWxlbnQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdHJpdmFsZW50X3VucGFjayhiY21vbHRfdHJpdmFsZW50ICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfbm5pX3NlcmRlc19jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2lkX3BhY2soYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2lkX3VucGFjayhiY21vbHRfbm5pX3NlcmRlc19jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ubmlfc2VyZGVzX2tleV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3NlcmRlc19rZXlfaWRfcGFjayhiY21vbHRfbm5pX3NlcmRlc19rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbm5pX3NlcmRlc19rZXlfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3NlcmRlc19rZXlfaWRfdW5wYWNrKGJjbW9sdF9ubmlfc2VyZGVzX2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfcGFjayhiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfdW5wYWNrKGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfaWRfcGFjayhiY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfaWRfdW5wYWNrKGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ubmlfc3RhdF9jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zdGF0X2NmZ19pZF9wYWNrKGJjbW9sdF9ubmlfc3RhdF9jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbm5pX3N0YXRfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zdGF0X2NmZ19pZF91bnBhY2soYmNtb2x0X25uaV9zdGF0X2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X25uaV9zdGF0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc3RhdF9pZF9wYWNrKGJjbW9sdF9ubmlfc3RhdF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ubmlfc3RhdF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc3RhdF9pZF91bnBhY2soYmNtb2x0X25uaV9zdGF0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfaWRfcGFjayhiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfaWRfdW5wYWNrKGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9vZG5fY2xhc3MgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29kbl9jbGFzc19wYWNrKGJjbW9sdF9vZG5fY2xhc3MgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfb2RuX2NsYXNzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29kbl9jbGFzc191bnBhY2soYmNtb2x0X29kbl9jbGFzcyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X29tY2lfcG9ydF9pZF9vcGVyYXRpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29tY2lfcG9ydF9pZF9vcGVyYXRpb25fcGFjayhiY21vbHRfb21jaV9wb3J0X2lkX29wZXJhdGlvbiB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9vbWNpX3BvcnRfaWRfb3BlcmF0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29tY2lfcG9ydF9pZF9vcGVyYXRpb25fdW5wYWNrKGJjbW9sdF9vbWNpX3BvcnRfaWRfb3BlcmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfb251X29wZXJhdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfb251X29wZXJhdGlvbl9wYWNrKGJjbW9sdF9vbnVfb3BlcmF0aW9uIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X29udV9vcGVyYXRpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfb251X29wZXJhdGlvbl91bnBhY2soYmNtb2x0X29udV9vcGVyYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9vbnVfcG93ZXJfbGV2ZWwgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29udV9wb3dlcl9sZXZlbF9wYWNrKGJjbW9sdF9vbnVfcG93ZXJfbGV2ZWwgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfb251X3Bvd2VyX2xldmVsIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29udV9wb3dlcl9sZXZlbF91bnBhY2soYmNtb2x0X29udV9wb3dlcl9sZXZlbCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3RjX3Byb3RvY29sIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF90Y19wcm90b2NvbF9wYWNrKGJjbW9sdF90Y19wcm90b2NvbCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF90Y19wcm90b2NvbCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF90Y19wcm90b2NvbF91bnBhY2soYmNtb2x0X3RjX3Byb3RvY29sICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfcGFja2V0X2luamVjdGlvbl9lcnJvciB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcGFja2V0X2luamVjdGlvbl9lcnJvcl9wYWNrKGJjbW9sdF9wYWNrZXRfaW5qZWN0aW9uX2Vycm9yIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3BhY2tldF9pbmplY3Rpb25fZXJyb3IgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcGFja2V0X2luamVjdGlvbl9lcnJvcl91bnBhY2soYmNtb2x0X3BhY2tldF9pbmplY3Rpb25fZXJyb3IgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9wYWNrZXRfdHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcGFja2V0X3R5cGVfcGFjayhiY21vbHRfcGFja2V0X3R5cGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfcGFja2V0X3R5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcGFja2V0X3R5cGVfdW5wYWNrKGJjbW9sdF9wYWNrZXRfdHlwZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2ZhaWxfcmVhc29uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9mYWlsX3JlYXNvbl9wYWNrKGJjbW9sdF9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9mYWlsX3JlYXNvbiB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9mYWlsX3JlYXNvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9mYWlsX3JlYXNvbl91bnBhY2soYmNtb2x0X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2ZhaWxfcmVhc29uICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfcG9sYXJpdHkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3BvbGFyaXR5X3BhY2soYmNtb2x0X3BvbGFyaXR5IHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3BvbGFyaXR5IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3BvbGFyaXR5X3VucGFjayhiY21vbHRfcG9sYXJpdHkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9wb2xsaW5nX2ludGVydmFsIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9wb2xsaW5nX2ludGVydmFsX3BhY2soYmNtb2x0X3BvbGxpbmdfaW50ZXJ2YWwgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfcG9sbGluZ19pbnRlcnZhbCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9wb2xsaW5nX2ludGVydmFsX3VucGFjayhiY21vbHRfcG9sbGluZ19pbnRlcnZhbCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3Bvbl9vcGVyYXRpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9vcGVyYXRpb25fcGFjayhiY21vbHRfcG9uX29wZXJhdGlvbiB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9wb25fb3BlcmF0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9vcGVyYXRpb25fdW5wYWNrKGJjbW9sdF9wb25fb3BlcmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29wdGlvbnMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19vcHRpb25zX3BhY2soYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19vcHRpb25zIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19vcHRpb25zIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19vcHRpb25zX3VucGFjayhiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29wdGlvbnMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9wb25fc3RhdGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9zdGF0ZV9wYWNrKGJjbW9sdF9wb25fc3RhdGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfcG9uX3N0YXRlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9zdGF0ZV91bnBhY2soYmNtb2x0X3Bvbl9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3Bvd2VyX2xldmVsbGluZ19jb250cm9sIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9wb3dlcl9sZXZlbGxpbmdfY29udHJvbF9wYWNrKGJjbW9sdF9wb3dlcl9sZXZlbGxpbmdfY29udHJvbCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9wb3dlcl9sZXZlbGxpbmdfY29udHJvbCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9wb3dlcl9sZXZlbGxpbmdfY29udHJvbF91bnBhY2soYmNtb2x0X3Bvd2VyX2xldmVsbGluZ19jb250cm9sICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfcG93ZXJfbWFuYWdlbWVudF90cmFuc2l0aW9uX3JlYXNvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG93ZXJfbWFuYWdlbWVudF90cmFuc2l0aW9uX3JlYXNvbl9wYWNrKGJjbW9sdF9wb3dlcl9tYW5hZ2VtZW50X3RyYW5zaXRpb25fcmVhc29uIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3Bvd2VyX21hbmFnZW1lbnRfdHJhbnNpdGlvbl9yZWFzb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG93ZXJfbWFuYWdlbWVudF90cmFuc2l0aW9uX3JlYXNvbl91bnBhY2soYmNtb2x0X3Bvd2VyX21hbmFnZW1lbnRfdHJhbnNpdGlvbl9yZWFzb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9wcmJzX3BvbHlub21pYWwgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3ByYnNfcG9seW5vbWlhbF9wYWNrKGJjbW9sdF9wcmJzX3BvbHlub21pYWwgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfcHJic19wb2x5bm9taWFsIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3ByYnNfcG9seW5vbWlhbF91bnBhY2soYmNtb2x0X3ByYnNfcG9seW5vbWlhbCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3ByYnNfY2hlY2tlcl9tb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9wcmJzX2NoZWNrZXJfbW9kZV9wYWNrKGJjbW9sdF9wcmJzX2NoZWNrZXJfbW9kZSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9wcmJzX2NoZWNrZXJfbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9wcmJzX2NoZWNrZXJfbW9kZV91bnBhY2soYmNtb2x0X3ByYnNfY2hlY2tlcl9tb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfcHJic19sb2NrX3N0YXRlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9wcmJzX2xvY2tfc3RhdGVfcGFjayhiY21vbHRfcHJic19sb2NrX3N0YXRlIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3ByYnNfbG9ja19zdGF0ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9wcmJzX2xvY2tfc3RhdGVfdW5wYWNrKGJjbW9sdF9wcmJzX2xvY2tfc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9yYW1hbl9taXRpZ2F0aW9uX21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JhbWFuX21pdGlnYXRpb25fbW9kZV9wYWNrKGJjbW9sdF9yYW1hbl9taXRpZ2F0aW9uX21vZGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfcmFtYW5fbWl0aWdhdGlvbl9tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JhbWFuX21pdGlnYXRpb25fbW9kZV91bnBhY2soYmNtb2x0X3JhbWFuX21pdGlnYXRpb25fbW9kZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3JhbmdpbmdfZmFpbF9yZWFzb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JhbmdpbmdfZmFpbF9yZWFzb25fcGFjayhiY21vbHRfcmFuZ2luZ19mYWlsX3JlYXNvbiB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9yYW5naW5nX2ZhaWxfcmVhc29uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JhbmdpbmdfZmFpbF9yZWFzb25fdW5wYWNrKGJjbW9sdF9yYW5naW5nX2ZhaWxfcmVhc29uICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfcmVnaXN0cmF0aW9uX2JlaGF2aW9yIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9yZWdpc3RyYXRpb25fYmVoYXZpb3JfcGFjayhiY21vbHRfcmVnaXN0cmF0aW9uX2JlaGF2aW9yIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3JlZ2lzdHJhdGlvbl9iZWhhdmlvciBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9yZWdpc3RyYXRpb25fYmVoYXZpb3JfdW5wYWNrKGJjbW9sdF9yZWdpc3RyYXRpb25fYmVoYXZpb3IgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9mYWlsX3JlYXNvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcmVxdWVzdF9yZWdpc3RyYXRpb25fZmFpbF9yZWFzb25fcGFjayhiY21vbHRfcmVxdWVzdF9yZWdpc3RyYXRpb25fZmFpbF9yZWFzb24gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfcmVxdWVzdF9yZWdpc3RyYXRpb25fZmFpbF9yZWFzb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcmVxdWVzdF9yZWdpc3RyYXRpb25fZmFpbF9yZWFzb25fdW5wYWNrKGJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9mYWlsX3JlYXNvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3Jlc3VsdCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcmVzdWx0X3BhY2soYmNtb2x0X3Jlc3VsdCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9yZXN1bHQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcmVzdWx0X3VucGFjayhiY21vbHRfcmVzdWx0ICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3R5cGVfcGFjayhiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV90eXBlIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG1fdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3R5cGVfdW5wYWNrKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3R5cGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X3BhY2soYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl93aW5kb3cgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X3VucGFjayhiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3JvZ3VlX21lYXN1cmVtZW50X3Jlc3VsdCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcm9ndWVfbWVhc3VyZW1lbnRfcmVzdWx0X3BhY2soYmNtb2x0X3JvZ3VlX21lYXN1cmVtZW50X3Jlc3VsdCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9yb2d1ZV9tZWFzdXJlbWVudF9yZXN1bHQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcm9ndWVfbWVhc3VyZW1lbnRfcmVzdWx0X3VucGFjayhiY21vbHRfcm9ndWVfbWVhc3VyZW1lbnRfcmVzdWx0ICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfcm9ndWVfc2Nhbl9zdGF0dXMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JvZ3VlX3NjYW5fc3RhdHVzX3BhY2soYmNtb2x0X3JvZ3VlX3NjYW5fc3RhdHVzIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3JvZ3VlX3NjYW5fc3RhdHVzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JvZ3VlX3NjYW5fc3RhdHVzX3VucGFjayhiY21vbHRfcm9ndWVfc2Nhbl9zdGF0dXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9yc3NpX21lYXN1cmVtZW50X2ZhaWxfcmVhc29uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9yc3NpX21lYXN1cmVtZW50X2ZhaWxfcmVhc29uX3BhY2soYmNtb2x0X3Jzc2lfbWVhc3VyZW1lbnRfZmFpbF9yZWFzb24gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfcnNzaV9tZWFzdXJlbWVudF9mYWlsX3JlYXNvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9yc3NpX21lYXN1cmVtZW50X2ZhaWxfcmVhc29uX3VucGFjayhiY21vbHRfcnNzaV9tZWFzdXJlbWVudF9mYWlsX3JlYXNvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbF9yZWFzb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbF9yZWFzb25fcGFjayhiY21vbHRfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsX3JlYXNvbiB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWxfcmVhc29uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbF9yZWFzb25fdW5wYWNrKGJjbW9sdF9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWxfcmVhc29uICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfc2VyZGVzX3JhbmdpbmdfbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfc2VyZGVzX3JhbmdpbmdfbW9kZV9wYWNrKGJjbW9sdF9zZXJkZXNfcmFuZ2luZ19tb2RlIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3NlcmRlc19yYW5naW5nX21vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfc2VyZGVzX3JhbmdpbmdfbW9kZV91bnBhY2soYmNtb2x0X3NlcmRlc19yYW5naW5nX21vZGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9zZXJkZXNfaW5zdGFuY2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NlcmRlc19pbnN0YW5jZV9wYWNrKGJjbW9sdF9zZXJkZXNfaW5zdGFuY2UgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfc2VyZGVzX2luc3RhbmNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NlcmRlc19pbnN0YW5jZV91bnBhY2soYmNtb2x0X3NlcmRlc19pbnN0YW5jZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3NoYXBlcl9tb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9zaGFwZXJfbW9kZV9wYWNrKGJjbW9sdF9zaGFwZXJfbW9kZSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9zaGFwZXJfbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9zaGFwZXJfbW9kZV91bnBhY2soYmNtb2x0X3NoYXBlcl9tb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfaWRfcGFjayhiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfaWRfdW5wYWNrKGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXlfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleV9pZF9wYWNrKGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleV9pZF91bnBhY2soYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGVfcGFjayhiY21vbHRfc3RhdF9jb25kaXRpb25fdHlwZSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9zdGF0X2NvbmRpdGlvbl90eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGVfdW5wYWNrKGJjbW9sdF9zdGF0X2NvbmRpdGlvbl90eXBlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfc3dpdGNoX292ZXJfdHlwZV9jX29udV9zdGF0ZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfc3dpdGNoX292ZXJfdHlwZV9jX29udV9zdGF0ZV9wYWNrKGJjbW9sdF9zd2l0Y2hfb3Zlcl90eXBlX2Nfb251X3N0YXRlIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3N3aXRjaF9vdmVyX3R5cGVfY19vbnVfc3RhdGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfc3dpdGNoX292ZXJfdHlwZV9jX29udV9zdGF0ZV91bnBhY2soYmNtb2x0X3N3aXRjaF9vdmVyX3R5cGVfY19vbnVfc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9zeXN0ZW1fbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfc3lzdGVtX21vZGVfcGFjayhiY21vbHRfc3lzdGVtX21vZGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfc3lzdGVtX21vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfc3lzdGVtX21vZGVfdW5wYWNrKGJjbW9sdF9zeXN0ZW1fbW9kZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3VzX29wZXJhdGluZ193YXZlbGVuZ3RoX2JhbmRzIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF91c19vcGVyYXRpbmdfd2F2ZWxlbmd0aF9iYW5kc19wYWNrKGJjbW9sdF91c19vcGVyYXRpbmdfd2F2ZWxlbmd0aF9iYW5kcyB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF91c19vcGVyYXRpbmdfd2F2ZWxlbmd0aF9iYW5kcyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF91c19vcGVyYXRpbmdfd2F2ZWxlbmd0aF9iYW5kc191bnBhY2soYmNtb2x0X3VzX29wZXJhdGluZ193YXZlbGVuZ3RoX2JhbmRzICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfdHJhZmZpY19yZXN1bWVfcmVzdWx0IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF90cmFmZmljX3Jlc3VtZV9yZXN1bHRfcGFjayhiY21vbHRfdHJhZmZpY19yZXN1bWVfcmVzdWx0IHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3RyYWZmaWNfcmVzdW1lX3Jlc3VsdCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF90cmFmZmljX3Jlc3VtZV9yZXN1bHRfdW5wYWNrKGJjbW9sdF90cmFmZmljX3Jlc3VtZV9yZXN1bHQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19pZF9wYWNrKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19pZF91bnBhY2soYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9pZCB0byAKKyAqIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9pZCAKKyAqIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXlfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXlfaWRfcGFjayhiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXlfaWRfdW5wYWNrKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfaWRfcGFjayhiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfaWRfdW5wYWNrKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvd19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfaWRfcGFjayhiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfaWRfdW5wYWNrKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvd19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fdHJpZ2dlcl9wYWNrKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fdHJpZ2dlciB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fdHJpZ2dlciBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fdHJpZ2dlcl91bnBhY2soYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3RyaWdnZXJfcG9zaXRpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyX3Bvc2l0aW9uX3BhY2soYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyX3Bvc2l0aW9uIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyX3Bvc2l0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyX3Bvc2l0aW9uX3VucGFjayhiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3RyaWdnZXJfcG9zaXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fd2luZG93X21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl93aW5kb3dfbW9kZV9wYWNrKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fd2luZG93X21vZGUgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3dpbmRvd19tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl93aW5kb3dfbW9kZV91bnBhY2soYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl93aW5kb3dfbW9kZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3RyeF90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF90cnhfdHlwZV9wYWNrKGJjbW9sdF90cnhfdHlwZSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF90cnhfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF90cnhfdHlwZV91bnBhY2soYmNtb2x0X3RyeF90eXBlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfdHVuZV9pbl9mYWlsX3JlYXNvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdHVuZV9pbl9mYWlsX3JlYXNvbl9wYWNrKGJjbW9sdF90dW5lX2luX2ZhaWxfcmVhc29uIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3R1bmVfaW5fZmFpbF9yZWFzb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdHVuZV9pbl9mYWlsX3JlYXNvbl91bnBhY2soYmNtb2x0X3R1bmVfaW5fZmFpbF9yZWFzb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF90dW5lX291dF9mYWlsX3JlYXNvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdHVuZV9vdXRfZmFpbF9yZWFzb25fcGFjayhiY21vbHRfdHVuZV9vdXRfZmFpbF9yZWFzb24gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfdHVuZV9vdXRfZmFpbF9yZWFzb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdHVuZV9vdXRfZmFpbF9yZWFzb25fdW5wYWNrKGJjbW9sdF90dW5lX291dF9mYWlsX3JlYXNvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3VhcnRfYmF1ZHJhdGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3VhcnRfYmF1ZHJhdGVfcGFjayhiY21vbHRfdWFydF9iYXVkcmF0ZSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF91YXJ0X2JhdWRyYXRlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3VhcnRfYmF1ZHJhdGVfdW5wYWNrKGJjbW9sdF91YXJ0X2JhdWRyYXRlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfdXNfZ2VtX3BvcnRfZGVzdGluYXRpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3VzX2dlbV9wb3J0X2Rlc3RpbmF0aW9uX3BhY2soYmNtb2x0X3VzX2dlbV9wb3J0X2Rlc3RpbmF0aW9uIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3VzX2dlbV9wb3J0X2Rlc3RpbmF0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3VzX2dlbV9wb3J0X2Rlc3RpbmF0aW9uX3VucGFjayhiY21vbHRfdXNfZ2VtX3BvcnRfZGVzdGluYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF91c192bGFuX2FjdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdXNfdmxhbl9hY3Rpb25fcGFjayhiY21vbHRfdXNfdmxhbl9hY3Rpb24gdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfdXNfdmxhbl9hY3Rpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdXNfdmxhbl9hY3Rpb25fdW5wYWNrKGJjbW9sdF91c192bGFuX2FjdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3ZsYW5fdG9fZmxvd19tYXBwaW5nX21ldGhvZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdmxhbl90b19mbG93X21hcHBpbmdfbWV0aG9kX3BhY2soYmNtb2x0X3ZsYW5fdG9fZmxvd19tYXBwaW5nX21ldGhvZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF92bGFuX3RvX2Zsb3dfbWFwcGluZ19tZXRob2QgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdmxhbl90b19mbG93X21hcHBpbmdfbWV0aG9kX3VucGFjayhiY21vbHRfdmxhbl90b19mbG93X21hcHBpbmdfbWV0aG9kICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2lkX3BhY2soYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2lkX3VucGFjayhiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9hbGxvY19jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19pZF9wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fYWxsb2NfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19pZF91bnBhY2soYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0c19pZF9wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0c19pZF91bnBhY2soYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0c19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX2FsbG9jX2tleV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfa2V5X2lkX3BhY2soYmNtb2x0X3hncG9uX2FsbG9jX2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9hbGxvY19rZXlfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfa2V5X2lkX3VucGFjayhiY21vbHRfeGdwb25fYWxsb2Nfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfaWRfcGFjayhiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF91bnBhY2soYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9pZF91bnBhY2soYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2lkX3BhY2soYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2lkX3VucGFjayhiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2lkX3BhY2soYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2lkX3VucGFjayhiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19pZF9wYWNrKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19pZF91bnBhY2soYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmdfaWRfcGFjayhiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmdfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXlfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleV9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleV9pZF91bnBhY2soYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3BhY2soYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3VucGFjayhiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2lkX3BhY2soYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2lkX3VucGFjayhiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfaWRfcGFjayhiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfaWRfcGFjayhiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRlX3BhY2soYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRlIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRlX3VucGFjayhiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2lkX3BhY2soYmNtb2x0X3hncG9uX2l3Zl9jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25faXdmX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2lkX3VucGFjayhiY21vbHRfeGdwb25faXdmX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX2l3Zl9rZXlfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2l3Zl9rZXlfaWRfcGFjayhiY21vbHRfeGdwb25faXdmX2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9pd2Zfa2V5X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2l3Zl9rZXlfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9pd2Zfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19pZF9wYWNrKGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2NmZ19pZF9wYWNrKGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fbmlfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2NmZ19pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2lkX3BhY2soYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2lkX3VucGFjayhiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fbmlfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X3hncG9uX25pX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfeGdwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX25pX2tleV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfa2V5X2lkX3BhY2soYmNtb2x0X3hncG9uX25pX2tleV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9rZXlfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfa2V5X2lkX3VucGFjayhiY21vbHRfeGdwb25fbmlfa2V5X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fbmlfbG9zX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9sb3NfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfbG9zX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX25pX2xvc19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9sb3NfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9sb3NfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2lkX3BhY2soYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2lkX3VucGFjayhiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9pZCB0byAKKyAqIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9pZCBmcm9tIAorICogYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX25pX3Jlc2V0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9yZXNldF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9uaV9yZXNldF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9yZXNldF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9yZXNldF9pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX3Jlc2V0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkX3BhY2soYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkX3VucGFjayhiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX25pX3JvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X2lkX3BhY2soYmNtb2x0X3hncG9uX25pX3JvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X2lkX3VucGFjayhiY21vbHRfeGdwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0X2lkX3BhY2soYmNtb2x0X3hncG9uX25pX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fbmlfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydF9pZCBmcm9tIAorICogYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2lkX3BhY2soYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2lkX3VucGFjayhiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2lkIGZyb20gCisgKiBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZ19pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfaWQgZnJvbSAKKyAqIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkX3BhY2soYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkX3VucGFjayhiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZF91bnBhY2soYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fbmlfc3RhdF9jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2lkX3BhY2soYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2lkX3VucGFjayhiY21vbHRfeGdwb25fbmlfc3RhdF9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkX3BhY2soYmNtb2x0X3hncG9uX25pX3N0YXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fbmlfc3RhdF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkX3VucGFjayhiY21vbHRfeGdwb25fbmlfc3RhdF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfaWRfcGFjayhiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX251bV9vZl9vbnVzIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9udW1fb2Zfb251c19wYWNrKGJjbW9sdF94Z3Bvbl9udW1fb2Zfb251cyB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9udW1fb2Zfb251cyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9udW1fb2Zfb251c191bnBhY2soYmNtb2x0X3hncG9uX251bV9vZl9vbnVzICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfaWRfcGFjayhiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9jZmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9jZmdfaWRfcGFjayhiY21vbHRfeGdwb25fb251X2NmZ19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9jZmdfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfaWRfcGFjayhiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X2RmaV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2RmaV9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfZGZpX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9kZmlfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2RmaV9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9kZmlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfZGdpX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfZGdpX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9kZ2lfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X2RnaV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfZGdpX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X2RnaV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9kb3dpX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9kb3dpX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X2dldF9wb3dlcl9jb25zdW1wdGlvbl9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2dldF9wb3dlcl9jb25zdW1wdGlvbl9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2NvbnN1bXB0aW9uX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9nZXRfcG93ZXJfY29uc3VtcHRpb25faWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2dldF9wb3dlcl9jb25zdW1wdGlvbl9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9nZXRfcG93ZXJfY29uc3VtcHRpb25faWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2xldmVsX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2xldmVsX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9nZXRfcG93ZXJfbGV2ZWxfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X2dldF9wb3dlcl9sZXZlbF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2xldmVsX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X2dldF9wb3dlcl9sZXZlbF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZF9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfaWRfcGFjayhiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X2tleV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9sb29jaV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2xvb2NpX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9sb29jaV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2xvb2NpX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X2xvb2NpX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfaWRfcGFjayhiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1faWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1faWRfcGFjayhiY21vbHRfeGdwb25fb251X29udV9hbGFybV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1faWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5faWRfcGFjayhiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5faWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5faWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5faWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfaWRfcGFjayhiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfaWRfcGFjayhiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb25faWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X29wdGljYWxfcmVmbGVjdGlvbl9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X29wdGljYWxfcmVmbGVjdGlvbl9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfaWRfcGFjayhiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfaWRfcGFjayhiY21vbHRfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfaWRfcGFjayhiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfaWRfcGFjayhiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Bxc2lfaWRfcGFjayhiY21vbHRfeGdwb25fb251X3Bxc2lfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X3Bxc2lfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Bxc2lfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25faWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25faWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfc2RpX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc2RpX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9zZGlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X3NkaV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc2RpX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X3NkaV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfaWRfcGFjayhiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2lkIGZyb20gCisgKiBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25faWRfcGFjayhiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25faWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25faWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25faWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X3NmaV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3NmaV9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9zZmlfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3NmaV9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9zZmlfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X3N0YXRfY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfaWRfcGFjayhiY21vbHRfeGdwb25fb251X3N0YXRfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3N0YXRfaWRfcGFjayhiY21vbHRfeGdwb25fb251X3N0YXRfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X3N0YXRfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3N0YXRfaWRfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9zdWZpX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc3VmaV9pZF9wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfc3VmaV9pZCB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfc3VmaV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc3VmaV9pZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9zdWZpX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X3Rpd2lfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV90aXdpX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV90aXdpX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV90aXdpX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV90aXdpX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X3Rpd2lfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2lkX3BhY2soYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2lkX3VucGFjayhiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX3NlcmRlc19yYW5naW5nX21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3NlcmRlc19yYW5naW5nX21vZGVfcGFjayhiY21vbHRfeGdwb25fc2VyZGVzX3JhbmdpbmdfbW9kZSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9zZXJkZXNfcmFuZ2luZ19tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3NlcmRlc19yYW5naW5nX21vZGVfdW5wYWNrKGJjbW9sdF94Z3Bvbl9zZXJkZXNfcmFuZ2luZ19tb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fdHJ4X2NmZ19pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fdHJ4X2NmZ19pZF9wYWNrKGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX3RyeF9jZmdfaWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fdHJ4X2NmZ19pZF91bnBhY2soYmNtb2x0X3hncG9uX3RyeF9jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl90cnhfa2V5X2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl90cnhfa2V5X2lkX3BhY2soYmNtb2x0X3hncG9uX3RyeF9rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fdHJ4X2tleV9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl90cnhfa2V5X2lkX3VucGFjayhiY21vbHRfeGdwb25fdHJ4X2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX3RyeF90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl90cnhfdHlwZV9wYWNrKGJjbW9sdF94Z3Bvbl90cnhfdHlwZSB0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl90cnhfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl90cnhfdHlwZV91bnBhY2soYmNtb2x0X3hncG9uX3RyeF90eXBlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94cG9uX3NlcmRlc19jZmdfaWRfcGFjayhiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2lkIHRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF94cG9uX3NlcmRlc19jZmdfaWRfdW5wYWNrKGJjbW9sdF94cG9uX3NlcmRlc19jZmdfaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94cG9uX3NlcmRlc19rZXlfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hwb25fc2VyZGVzX2tleV9pZF9wYWNrKGJjbW9sdF94cG9uX3NlcmRlc19rZXlfaWQgdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeHBvbl9zZXJkZXNfa2V5X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hwb25fc2VyZGVzX2tleV9pZF91bnBhY2soYmNtb2x0X3hwb25fc2VyZGVzX2tleV9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2FjdHVhbF9zY2hlZHVsZXJzaGFwZXIgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9hY3R1YWxfc2NoZWR1bGVyc2hhcGVyX3NldF9kZWZhdWx0KGJjbW9sdF9hY3R1YWxfc2NoZWR1bGVyc2hhcGVyICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2FjdHVhbF9zY2hlZHVsZXJzaGFwZXIgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hY3R1YWxfc2NoZWR1bGVyc2hhcGVyX3BhY2soY29uc3QgYmNtb2x0X2FjdHVhbF9zY2hlZHVsZXJzaGFwZXIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2FjdHVhbF9zY2hlZHVsZXJzaGFwZXIgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FjdHVhbF9zY2hlZHVsZXJzaGFwZXJfdW5wYWNrKGJjbW9sdF9hY3R1YWxfc2NoZWR1bGVyc2hhcGVyICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfYWN0dWFsX3NjaGVkdWxlcnNoYXBlciBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hY3R1YWxfc2NoZWR1bGVyc2hhcGVyX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9hY3R1YWxfc2NoZWR1bGVyc2hhcGVyIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FjdHVhbF9zY2hlZHVsZXJzaGFwZXJfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9hY3R1YWxfc2NoZWR1bGVyc2hhcGVyICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Flc19rZXkgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9hZXNfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF9hZXNfa2V5ICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Flc19rZXkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZXNfa2V5X3BhY2soY29uc3QgYmNtb2x0X2Flc19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Flc19rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Flc19rZXlfdW5wYWNrKGJjbW9sdF9hZXNfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfYWVzX2tleSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgCisgKiBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZXNfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9hZXNfa2V5IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Flc19rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9hZXNfa2V5ICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXIgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgCisgKiB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfcmVhZGVyX3NldF9kZWZhdWx0KGJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfcmVhZGVyICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXIgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfcmVhZGVyX3BhY2soY29uc3QgYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXIgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXJfdW5wYWNrKGJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfcmVhZGVyICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWRlciBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfcmVhZGVyX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfcmVhZGVyIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXJfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfcmVhZGVyICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2FwaV9jYXB0dXJlX2NvbmZpZyBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2FwaV9jYXB0dXJlX2NvbmZpZ19zZXRfZGVmYXVsdChiY21vbHRfYXBpX2NhcHR1cmVfY29uZmlnICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2FwaV9jYXB0dXJlX2NvbmZpZyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FwaV9jYXB0dXJlX2NvbmZpZ19wYWNrKGNvbnN0IGJjbW9sdF9hcGlfY2FwdHVyZV9jb25maWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2FwaV9jYXB0dXJlX2NvbmZpZyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXBpX2NhcHR1cmVfY29uZmlnX3VucGFjayhiY21vbHRfYXBpX2NhcHR1cmVfY29uZmlnICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfYXBpX2NhcHR1cmVfY29uZmlnIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FwaV9jYXB0dXJlX2NvbmZpZ19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfYXBpX2NhcHR1cmVfY29uZmlnIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FwaV9jYXB0dXJlX2NvbmZpZ19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2FwaV9jYXB0dXJlX2NvbmZpZyAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9hcGlfY2FwdHVyZV9zdGF0cyBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2FwaV9jYXB0dXJlX3N0YXRzX3NldF9kZWZhdWx0KGJjbW9sdF9hcGlfY2FwdHVyZV9zdGF0cyAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9hcGlfY2FwdHVyZV9zdGF0cyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FwaV9jYXB0dXJlX3N0YXRzX3BhY2soY29uc3QgYmNtb2x0X2FwaV9jYXB0dXJlX3N0YXRzICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9hcGlfY2FwdHVyZV9zdGF0cyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXBpX2NhcHR1cmVfc3RhdHNfdW5wYWNrKGJjbW9sdF9hcGlfY2FwdHVyZV9zdGF0cyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2FwaV9jYXB0dXJlX3N0YXRzIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FwaV9jYXB0dXJlX3N0YXRzX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9hcGlfY2FwdHVyZV9zdGF0cyBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcGlfY2FwdHVyZV9zdGF0c19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2FwaV9jYXB0dXJlX3N0YXRzICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2JvdW5kcyBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9ib3VuZHNfc2V0X2RlZmF1bHQoYmNtb2x0X2JvdW5kcyAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ib3VuZHMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ib3VuZHNfcGFjayhjb25zdCBiY21vbHRfYm91bmRzICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ib3VuZHMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2JvdW5kc191bnBhY2soYmNtb2x0X2JvdW5kcyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2JvdW5kcyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgCisgKiBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ib3VuZHNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2JvdW5kcyBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ib3VuZHNfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ib3VuZHMgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfYXJyX2JvdW5kc184IHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgCisgKiB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfYXJyX2JvdW5kc184X3NldF9kZWZhdWx0KGJjbW9sdF9hcnJfYm91bmRzXzggKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfYXJyX2JvdW5kc184IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX2JvdW5kc184X3BhY2soY29uc3QgYmNtb2x0X2Fycl9ib3VuZHNfOCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfYXJyX2JvdW5kc184IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcnJfYm91bmRzXzhfdW5wYWNrKGJjbW9sdF9hcnJfYm91bmRzXzggKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9hcnJfYm91bmRzXzggc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX2JvdW5kc184X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9hcnJfYm91bmRzXzggaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX2JvdW5kc184X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYXJyX2JvdW5kc184ICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Fycl9jYWxpYnJhdGlvbl9yZWNvcmRfOCBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2Fycl9jYWxpYnJhdGlvbl9yZWNvcmRfOF9zZXRfZGVmYXVsdChiY21vbHRfYXJyX2NhbGlicmF0aW9uX3JlY29yZF84ICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Fycl9jYWxpYnJhdGlvbl9yZWNvcmRfOCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl9jYWxpYnJhdGlvbl9yZWNvcmRfOF9wYWNrKGNvbnN0IGJjbW9sdF9hcnJfY2FsaWJyYXRpb25fcmVjb3JkXzggKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Fycl9jYWxpYnJhdGlvbl9yZWNvcmRfOCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX2NhbGlicmF0aW9uX3JlY29yZF84X3VucGFjayhiY21vbHRfYXJyX2NhbGlicmF0aW9uX3JlY29yZF84ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfYXJyX2NhbGlicmF0aW9uX3JlY29yZF84IHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl9jYWxpYnJhdGlvbl9yZWNvcmRfOF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfYXJyX2NhbGlicmF0aW9uX3JlY29yZF84IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl9jYWxpYnJhdGlvbl9yZWNvcmRfOF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Fycl9jYWxpYnJhdGlvbl9yZWNvcmRfOCAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9kc19mcmVxdWVuY3lfb2Zmc2V0IHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfZHNfZnJlcXVlbmN5X29mZnNldF9zZXRfZGVmYXVsdChiY21vbHRfZHNfZnJlcXVlbmN5X29mZnNldCAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9kc19mcmVxdWVuY3lfb2Zmc2V0IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZHNfZnJlcXVlbmN5X29mZnNldF9wYWNrKGNvbnN0IGJjbW9sdF9kc19mcmVxdWVuY3lfb2Zmc2V0ICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9kc19mcmVxdWVuY3lfb2Zmc2V0IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kc19mcmVxdWVuY3lfb2Zmc2V0X3VucGFjayhiY21vbHRfZHNfZnJlcXVlbmN5X29mZnNldCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2RzX2ZyZXF1ZW5jeV9vZmZzZXQgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZHNfZnJlcXVlbmN5X29mZnNldF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZHNfZnJlcXVlbmN5X29mZnNldCBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kc19mcmVxdWVuY3lfb2Zmc2V0X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZHNfZnJlcXVlbmN5X29mZnNldCAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9jaGFubmVsX3Byb2ZpbGUgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9jaGFubmVsX3Byb2ZpbGVfc2V0X2RlZmF1bHQoYmNtb2x0X2NoYW5uZWxfcHJvZmlsZSAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9jaGFubmVsX3Byb2ZpbGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9jaGFubmVsX3Byb2ZpbGVfcGFjayhjb25zdCBiY21vbHRfY2hhbm5lbF9wcm9maWxlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9jaGFubmVsX3Byb2ZpbGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2NoYW5uZWxfcHJvZmlsZV91bnBhY2soYmNtb2x0X2NoYW5uZWxfcHJvZmlsZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2NoYW5uZWxfcHJvZmlsZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9jaGFubmVsX3Byb2ZpbGVfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2NoYW5uZWxfcHJvZmlsZSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9jaGFubmVsX3Byb2ZpbGVfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9jaGFubmVsX3Byb2ZpbGUgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfYXJyX2NoYW5uZWxfcHJvZmlsZV84IHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfYXJyX2NoYW5uZWxfcHJvZmlsZV84X3NldF9kZWZhdWx0KGJjbW9sdF9hcnJfY2hhbm5lbF9wcm9maWxlXzggKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfYXJyX2NoYW5uZWxfcHJvZmlsZV84IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX2NoYW5uZWxfcHJvZmlsZV84X3BhY2soY29uc3QgYmNtb2x0X2Fycl9jaGFubmVsX3Byb2ZpbGVfOCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfYXJyX2NoYW5uZWxfcHJvZmlsZV84IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcnJfY2hhbm5lbF9wcm9maWxlXzhfdW5wYWNrKGJjbW9sdF9hcnJfY2hhbm5lbF9wcm9maWxlXzggKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9hcnJfY2hhbm5lbF9wcm9maWxlXzggc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX2NoYW5uZWxfcHJvZmlsZV84X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9hcnJfY2hhbm5lbF9wcm9maWxlXzggaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX2NoYW5uZWxfcHJvZmlsZV84X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYXJyX2NoYW5uZWxfcHJvZmlsZV84ICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0IHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfc2V0X2RlZmF1bHQoYmNtb2x0X3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0ICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfcGFjayhjb25zdCBiY21vbHRfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF91bnBhY2soYmNtb2x0X3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnQgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0IGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydCAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9hcnJfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfOCBzdHJ1Y3QuICBUaGlzIAorICogc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2Fycl9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF84X3NldF9kZWZhdWx0KGJjbW9sdF9hcnJfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfOCAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9hcnJfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfOCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF84X3BhY2soY29uc3QgYmNtb2x0X2Fycl9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF84ICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9hcnJfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfOCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0XzhfdW5wYWNrKGJjbW9sdF9hcnJfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfOCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Fycl9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF84IHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF84X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9hcnJfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfOCBpcyAKKyAqIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF84X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYXJyX3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0XzggKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfYXJyX3UxNl8yIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgCisgKiB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfYXJyX3UxNl8yX3NldF9kZWZhdWx0KGJjbW9sdF9hcnJfdTE2XzIgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfYXJyX3UxNl8yIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3UxNl8yX3BhY2soY29uc3QgYmNtb2x0X2Fycl91MTZfMiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfYXJyX3UxNl8yIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdTE2XzJfdW5wYWNrKGJjbW9sdF9hcnJfdTE2XzIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9hcnJfdTE2XzIgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIAorICogYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3UxNl8yX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9hcnJfdTE2XzIgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3UxNl8yX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYXJyX3UxNl8yICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Fycl91MTZfMl9oZXggc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9hcnJfdTE2XzJfaGV4X3NldF9kZWZhdWx0KGJjbW9sdF9hcnJfdTE2XzJfaGV4ICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Fycl91MTZfMl9oZXggdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdTE2XzJfaGV4X3BhY2soY29uc3QgYmNtb2x0X2Fycl91MTZfMl9oZXggKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Fycl91MTZfMl9oZXggZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91MTZfMl9oZXhfdW5wYWNrKGJjbW9sdF9hcnJfdTE2XzJfaGV4ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfYXJyX3UxNl8yX2hleCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdTE2XzJfaGV4X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9hcnJfdTE2XzJfaGV4IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91MTZfMl9oZXhfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9hcnJfdTE2XzJfaGV4ICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Fycl91MTZfNV9oZXggc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9hcnJfdTE2XzVfaGV4X3NldF9kZWZhdWx0KGJjbW9sdF9hcnJfdTE2XzVfaGV4ICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Fycl91MTZfNV9oZXggdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdTE2XzVfaGV4X3BhY2soY29uc3QgYmNtb2x0X2Fycl91MTZfNV9oZXggKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Fycl91MTZfNV9oZXggZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91MTZfNV9oZXhfdW5wYWNrKGJjbW9sdF9hcnJfdTE2XzVfaGV4ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfYXJyX3UxNl81X2hleCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdTE2XzVfaGV4X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9hcnJfdTE2XzVfaGV4IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91MTZfNV9oZXhfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9hcnJfdTE2XzVfaGV4ICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Fycl91MTZfNyBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2Fycl91MTZfN19zZXRfZGVmYXVsdChiY21vbHRfYXJyX3UxNl83ICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Fycl91MTZfNyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91MTZfN19wYWNrKGNvbnN0IGJjbW9sdF9hcnJfdTE2XzcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Fycl91MTZfNyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3UxNl83X3VucGFjayhiY21vbHRfYXJyX3UxNl83ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfYXJyX3UxNl83IHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyAKKyAqIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91MTZfN19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfYXJyX3UxNl83IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91MTZfN19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Fycl91MTZfNyAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9hcnJfdTMyXzYgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9hcnJfdTMyXzZfc2V0X2RlZmF1bHQoYmNtb2x0X2Fycl91MzJfNiAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9hcnJfdTMyXzYgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdTMyXzZfcGFjayhjb25zdCBiY21vbHRfYXJyX3UzMl82ICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9hcnJfdTMyXzYgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91MzJfNl91bnBhY2soYmNtb2x0X2Fycl91MzJfNiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Fycl91MzJfNiBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgCisgKiBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdTMyXzZfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Fycl91MzJfNiBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdTMyXzZfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9hcnJfdTMyXzYgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfYXJyX3U4XzEwIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgCisgKiB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfYXJyX3U4XzEwX3NldF9kZWZhdWx0KGJjbW9sdF9hcnJfdThfMTAgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfYXJyX3U4XzEwIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3U4XzEwX3BhY2soY29uc3QgYmNtb2x0X2Fycl91OF8xMCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfYXJyX3U4XzEwIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdThfMTBfdW5wYWNrKGJjbW9sdF9hcnJfdThfMTAgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9hcnJfdThfMTAgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIAorICogYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3U4XzEwX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9hcnJfdThfMTAgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3U4XzEwX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYXJyX3U4XzEwICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Fycl91OF8xMiBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2Fycl91OF8xMl9zZXRfZGVmYXVsdChiY21vbHRfYXJyX3U4XzEyICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Fycl91OF8xMiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91OF8xMl9wYWNrKGNvbnN0IGJjbW9sdF9hcnJfdThfMTIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Fycl91OF8xMiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3U4XzEyX3VucGFjayhiY21vbHRfYXJyX3U4XzEyICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfYXJyX3U4XzEyIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyAKKyAqIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91OF8xMl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfYXJyX3U4XzEyIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91OF8xMl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Fycl91OF8xMiAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9hcnJfdThfMTMgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9hcnJfdThfMTNfc2V0X2RlZmF1bHQoYmNtb2x0X2Fycl91OF8xMyAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9hcnJfdThfMTMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdThfMTNfcGFjayhjb25zdCBiY21vbHRfYXJyX3U4XzEzICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9hcnJfdThfMTMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91OF8xM191bnBhY2soYmNtb2x0X2Fycl91OF8xMyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Fycl91OF8xMyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgCisgKiBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdThfMTNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Fycl91OF8xMyBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdThfMTNfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9hcnJfdThfMTMgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfYXJyX3U4XzM2IHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgCisgKiB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfYXJyX3U4XzM2X3NldF9kZWZhdWx0KGJjbW9sdF9hcnJfdThfMzYgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfYXJyX3U4XzM2IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3U4XzM2X3BhY2soY29uc3QgYmNtb2x0X2Fycl91OF8zNiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfYXJyX3U4XzM2IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdThfMzZfdW5wYWNrKGJjbW9sdF9hcnJfdThfMzYgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9hcnJfdThfMzYgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIAorICogYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3U4XzM2X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9hcnJfdThfMzYgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3U4XzM2X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYXJyX3U4XzM2ICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Fycl91OF80IHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgCisgKiB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfYXJyX3U4XzRfc2V0X2RlZmF1bHQoYmNtb2x0X2Fycl91OF80ICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Fycl91OF80IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3U4XzRfcGFjayhjb25zdCBiY21vbHRfYXJyX3U4XzQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Fycl91OF80IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdThfNF91bnBhY2soYmNtb2x0X2Fycl91OF80ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfYXJyX3U4XzQgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIAorICogYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3U4XzRfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Fycl91OF80IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl91OF80X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYXJyX3U4XzQgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfYXJyX3U4XzQwIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgCisgKiB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfYXJyX3U4XzQwX3NldF9kZWZhdWx0KGJjbW9sdF9hcnJfdThfNDAgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfYXJyX3U4XzQwIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3U4XzQwX3BhY2soY29uc3QgYmNtb2x0X2Fycl91OF80MCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfYXJyX3U4XzQwIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcnJfdThfNDBfdW5wYWNrKGJjbW9sdF9hcnJfdThfNDAgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9hcnJfdThfNDAgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIAorICogYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3U4XzQwX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9hcnJfdThfNDAgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXJyX3U4XzQwX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYXJyX3U4XzQwICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGUgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGVfdW5wYWNrKGJjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fYnVyc3RfcHJvZmlsZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGVfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Fycl94Z3Bvbl9idXJzdF9wcm9maWxlXzQgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgCisgKiB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9hcnJfeGdwb25fYnVyc3RfcHJvZmlsZV80X3NldF9kZWZhdWx0KGJjbW9sdF9hcnJfeGdwb25fYnVyc3RfcHJvZmlsZV80ICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Fycl94Z3Bvbl9idXJzdF9wcm9maWxlXzQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcnJfeGdwb25fYnVyc3RfcHJvZmlsZV80X3BhY2soY29uc3QgYmNtb2x0X2Fycl94Z3Bvbl9idXJzdF9wcm9maWxlXzQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Fycl94Z3Bvbl9idXJzdF9wcm9maWxlXzQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl94Z3Bvbl9idXJzdF9wcm9maWxlXzRfdW5wYWNrKGJjbW9sdF9hcnJfeGdwb25fYnVyc3RfcHJvZmlsZV80ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfYXJyX3hncG9uX2J1cnN0X3Byb2ZpbGVfNCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcnJfeGdwb25fYnVyc3RfcHJvZmlsZV80X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9hcnJfeGdwb25fYnVyc3RfcHJvZmlsZV80IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl94Z3Bvbl9idXJzdF9wcm9maWxlXzRfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9hcnJfeGdwb25fYnVyc3RfcHJvZmlsZV80ICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX3RyeF9jb25maWd1cmF0aW9uIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb25fc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX3RyeF9jb25maWd1cmF0aW9uICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX3RyeF9jb25maWd1cmF0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb25fcGFjayhjb25zdCBiY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX3RyeF9jb25maWd1cmF0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl91bnBhY2soYmNtb2x0X3hncG9uX3RyeF9jb25maWd1cmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb24gc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb25fc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX3RyeF9jb25maWd1cmF0aW9uIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3RyeF9jb25maWd1cmF0aW9uX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb24gKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfYXJyX3hncG9uX3RyeF9jb25maWd1cmF0aW9uXzQgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9hcnJfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb25fNF9zZXRfZGVmYXVsdChiY21vbHRfYXJyX3hncG9uX3RyeF9jb25maWd1cmF0aW9uXzQgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfYXJyX3hncG9uX3RyeF9jb25maWd1cmF0aW9uXzQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcnJfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb25fNF9wYWNrKGNvbnN0IGJjbW9sdF9hcnJfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb25fNCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfYXJyX3hncG9uX3RyeF9jb25maWd1cmF0aW9uXzQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Fycl94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl80X3VucGFjayhiY21vbHRfYXJyX3hncG9uX3RyeF9jb25maWd1cmF0aW9uXzQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9hcnJfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb25fNCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcnJfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb25fNF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfYXJyX3hncG9uX3RyeF9jb25maWd1cmF0aW9uXzQgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hcnJfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb25fNF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Fycl94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl80ICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb25fc2V0X2RlZmF1bHQoYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb25fcGFjayhjb25zdCBiY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbl91bnBhY2soYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24gc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb25fc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb25fYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9yZXN5bmNfY29udHJvbCBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3Jlc3luY19jb250cm9sX3NldF9kZWZhdWx0KGJjbW9sdF9yZXN5bmNfY29udHJvbCAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9yZXN5bmNfY29udHJvbCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Jlc3luY19jb250cm9sX3BhY2soY29uc3QgYmNtb2x0X3Jlc3luY19jb250cm9sICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9yZXN5bmNfY29udHJvbCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcmVzeW5jX2NvbnRyb2xfdW5wYWNrKGJjbW9sdF9yZXN5bmNfY29udHJvbCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3Jlc3luY19jb250cm9sIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Jlc3luY19jb250cm9sX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9yZXN5bmNfY29udHJvbCBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9yZXN5bmNfY29udHJvbF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3Jlc3luY19jb250cm9sICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2JjZHJfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbiBzdHJ1Y3QuICBUaGlzIHNldHMgCisgKiBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2JjZHJfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbl9zZXRfZGVmYXVsdChiY21vbHRfYmNkcl9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2JjZHJfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2JjZHJfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbl9wYWNrKGNvbnN0IGJjbW9sdF9iY2RyX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2JjZHJfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYmNkcl9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uX3VucGFjayhiY21vbHRfYmNkcl9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfYmNkcl9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2JjZHJfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfYmNkcl9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uIGlzIG91dCAKKyAqIG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYmNkcl9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYmNkcl9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Jlcl9tb25pdG9yX3BhcmFtcyBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2Jlcl9tb25pdG9yX3BhcmFtc19zZXRfZGVmYXVsdChiY21vbHRfYmVyX21vbml0b3JfcGFyYW1zICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Jlcl9tb25pdG9yX3BhcmFtcyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Jlcl9tb25pdG9yX3BhcmFtc19wYWNrKGNvbnN0IGJjbW9sdF9iZXJfbW9uaXRvcl9wYXJhbXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Jlcl9tb25pdG9yX3BhcmFtcyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYmVyX21vbml0b3JfcGFyYW1zX3VucGFjayhiY21vbHRfYmVyX21vbml0b3JfcGFyYW1zICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfYmVyX21vbml0b3JfcGFyYW1zIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Jlcl9tb25pdG9yX3BhcmFtc19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfYmVyX21vbml0b3JfcGFyYW1zIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Jlcl9tb25pdG9yX3BhcmFtc19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Jlcl9tb25pdG9yX3BhcmFtcyAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZV9zZXRfZGVmYXVsdChiY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZV9wYWNrKGNvbnN0IGJjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlX3VucGFjayhiY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Nicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWQgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWRfc2V0X2RlZmF1bHQoYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZCAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWRfcGFjayhjb25zdCBiY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWQgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZF91bnBhY2soYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWRfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZCBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWRfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWQgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZGVidWdfZGV2aWNlX2NmZyBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2RlYnVnX2RldmljZV9jZmdfc2V0X2RlZmF1bHQoYmNtb2x0X2RlYnVnX2RldmljZV9jZmcgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZGVidWdfZGV2aWNlX2NmZyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2RldmljZV9jZmdfcGFjayhjb25zdCBiY21vbHRfZGVidWdfZGV2aWNlX2NmZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGVidWdfZGV2aWNlX2NmZyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfZGV2aWNlX2NmZ191bnBhY2soYmNtb2x0X2RlYnVnX2RldmljZV9jZmcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9kZWJ1Z19kZXZpY2VfY2ZnIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2RldmljZV9jZmdfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2RlYnVnX2RldmljZV9jZmcgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfZGV2aWNlX2NmZ19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2RlYnVnX2RldmljZV9jZmcgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZGV2aWNlX25uaV9zcGVlZCBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2RldmljZV9ubmlfc3BlZWRfc2V0X2RlZmF1bHQoYmNtb2x0X2RldmljZV9ubmlfc3BlZWQgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZGV2aWNlX25uaV9zcGVlZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9ubmlfc3BlZWRfcGFjayhjb25zdCBiY21vbHRfZGV2aWNlX25uaV9zcGVlZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGV2aWNlX25uaV9zcGVlZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX25uaV9zcGVlZF91bnBhY2soYmNtb2x0X2RldmljZV9ubmlfc3BlZWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9kZXZpY2Vfbm5pX3NwZWVkIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9ubmlfc3BlZWRfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2RldmljZV9ubmlfc3BlZWQgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX25uaV9zcGVlZF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2RldmljZV9ubmlfc3BlZWQgKnRoaXMpOworCisvKiBcY29uZCBVTkRPQ1VNRU5URURfU1lNQk9MUyAqLworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZHVtbXlfc3RydWN0X2Zvcl9lbWJlZGRlZF90eXBlcyBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2R1bW15X3N0cnVjdF9mb3JfZW1iZWRkZWRfdHlwZXNfc2V0X2RlZmF1bHQoYmNtb2x0X2R1bW15X3N0cnVjdF9mb3JfZW1iZWRkZWRfdHlwZXMgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZHVtbXlfc3RydWN0X2Zvcl9lbWJlZGRlZF90eXBlcyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2R1bW15X3N0cnVjdF9mb3JfZW1iZWRkZWRfdHlwZXNfcGFjayhjb25zdCBiY21vbHRfZHVtbXlfc3RydWN0X2Zvcl9lbWJlZGRlZF90eXBlcyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZHVtbXlfc3RydWN0X2Zvcl9lbWJlZGRlZF90eXBlcyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZHVtbXlfc3RydWN0X2Zvcl9lbWJlZGRlZF90eXBlc191bnBhY2soYmNtb2x0X2R1bW15X3N0cnVjdF9mb3JfZW1iZWRkZWRfdHlwZXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9kdW1teV9zdHJ1Y3RfZm9yX2VtYmVkZGVkX3R5cGVzIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2R1bW15X3N0cnVjdF9mb3JfZW1iZWRkZWRfdHlwZXNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2R1bW15X3N0cnVjdF9mb3JfZW1iZWRkZWRfdHlwZXMgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kdW1teV9zdHJ1Y3RfZm9yX2VtYmVkZGVkX3R5cGVzX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZHVtbXlfc3RydWN0X2Zvcl9lbWJlZGRlZF90eXBlcyAqdGhpcyk7CisKKy8qIFxlbmRjb25kICovCisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5X3NldF9kZWZhdWx0KGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeSAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5X3BhY2soY29uc3QgYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5ICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnlfdW5wYWNrKGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5IHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5ICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5X2xpc3RfdTggc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9saXN0X3U4X3NldF9kZWZhdWx0KGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9saXN0X3U4ICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5X2xpc3RfdTggdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9saXN0X3U4X3BhY2soY29uc3QgYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5X2xpc3RfdTggKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9saXN0X3U4IHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnlfbGlzdF91OF9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnlfbGlzdF91OCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5X2xpc3RfdTggZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5X2xpc3RfdThfdW5wYWNrKGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9saXN0X3U4ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnlfbGlzdF91OCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9saXN0X3U4X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9saXN0X3U4IGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnlfbGlzdF91OF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5X2xpc3RfdTggKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXIgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lcl9zZXRfZGVmYXVsdChiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXIgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXIgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lcl9wYWNrKGNvbnN0IGJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lciAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXJfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXIgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyX3VucGFjayhiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lciBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lcl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXIgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lcl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X2NvbmZpZ3VyYXRpb24gc3RydWN0LiAgVGhpcyBzZXRzIAorICogYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9jb25maWd1cmF0aW9uX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9jb25maWd1cmF0aW9uICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X2NvbmZpZ3VyYXRpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9jb25maWd1cmF0aW9uX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X2NvbmZpZ3VyYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X2NvbmZpZ3VyYXRpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X2NvbmZpZ3VyYXRpb25fdW5wYWNrKGJjbW9sdF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9jb25maWd1cmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfY29uZmlndXJhdGlvbiBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9jb25maWd1cmF0aW9uX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9jb25maWd1cmF0aW9uIGlzIG91dCAKKyAqIG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfY29uZmlndXJhdGlvbl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X2NvbmZpZ3VyYXRpb24gKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfdW5rbm93bl9saW5rX3N0YXR1cyBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3Vua25vd25fbGlua19zdGF0dXNfc2V0X2RlZmF1bHQoYmNtb2x0X3Vua25vd25fbGlua19zdGF0dXMgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfdW5rbm93bl9saW5rX3N0YXR1cyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Vua25vd25fbGlua19zdGF0dXNfcGFjayhjb25zdCBiY21vbHRfdW5rbm93bl9saW5rX3N0YXR1cyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfdW5rbm93bl9saW5rX3N0YXR1cyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdW5rbm93bl9saW5rX3N0YXR1c191bnBhY2soYmNtb2x0X3Vua25vd25fbGlua19zdGF0dXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF91bmtub3duX2xpbmtfc3RhdHVzIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Vua25vd25fbGlua19zdGF0dXNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3Vua25vd25fbGlua19zdGF0dXMgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdW5rbm93bl9saW5rX3N0YXR1c19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3Vua25vd25fbGlua19zdGF0dXMgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfbGFzZXJfb25fb2ZmX3N0YXR1cyBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2xhc2VyX29uX29mZl9zdGF0dXNfc2V0X2RlZmF1bHQoYmNtb2x0X2xhc2VyX29uX29mZl9zdGF0dXMgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfbGFzZXJfb25fb2ZmX3N0YXR1cyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xhc2VyX29uX29mZl9zdGF0dXNfcGFjayhjb25zdCBiY21vbHRfbGFzZXJfb25fb2ZmX3N0YXR1cyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbGFzZXJfb25fb2ZmX3N0YXR1cyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbGFzZXJfb25fb2ZmX3N0YXR1c191bnBhY2soYmNtb2x0X2xhc2VyX29uX29mZl9zdGF0dXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9sYXNlcl9vbl9vZmZfc3RhdHVzIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xhc2VyX29uX29mZl9zdGF0dXNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2xhc2VyX29uX29mZl9zdGF0dXMgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbGFzZXJfb25fb2ZmX3N0YXR1c19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2xhc2VyX29uX29mZl9zdGF0dXMgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfcmFuZ2Vfc3RhdHVzIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgCisgKiB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfcmFuZ2Vfc3RhdHVzX3NldF9kZWZhdWx0KGJjbW9sdF9yYW5nZV9zdGF0dXMgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfcmFuZ2Vfc3RhdHVzIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcmFuZ2Vfc3RhdHVzX3BhY2soY29uc3QgYmNtb2x0X3JhbmdlX3N0YXR1cyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfcmFuZ2Vfc3RhdHVzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9yYW5nZV9zdGF0dXNfdW5wYWNrKGJjbW9sdF9yYW5nZV9zdGF0dXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9yYW5nZV9zdGF0dXMgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcmFuZ2Vfc3RhdHVzX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9yYW5nZV9zdGF0dXMgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcmFuZ2Vfc3RhdHVzX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfcmFuZ2Vfc3RhdHVzICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3JvZ3VlX3N0YXR1cyBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3JvZ3VlX3N0YXR1c19zZXRfZGVmYXVsdChiY21vbHRfcm9ndWVfc3RhdHVzICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3JvZ3VlX3N0YXR1cyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JvZ3VlX3N0YXR1c19wYWNrKGNvbnN0IGJjbW9sdF9yb2d1ZV9zdGF0dXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3JvZ3VlX3N0YXR1cyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcm9ndWVfc3RhdHVzX3VucGFjayhiY21vbHRfcm9ndWVfc3RhdHVzICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfcm9ndWVfc3RhdHVzIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JvZ3VlX3N0YXR1c19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfcm9ndWVfc3RhdHVzIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JvZ3VlX3N0YXR1c19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3JvZ3VlX3N0YXR1cyAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2FsYXJtX3N0YXRlIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hbGFybV9zdGF0ZV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hbGFybV9zdGF0ZSAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2FsYXJtX3N0YXRlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hbGFybV9zdGF0ZV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2FsYXJtX3N0YXRlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2FsYXJtX3N0YXRlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2FsYXJtX3N0YXRlX3VucGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hbGFybV9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYWxhcm1fc3RhdGUgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hbGFybV9zdGF0ZV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hbGFybV9zdGF0ZSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYWxhcm1fc3RhdGVfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2FsYXJtX3N0YXRlICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9jb25maWcgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fY29uZmlnX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fY29uZmlnICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9jb25maWcgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fY29uZmlnX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9jb25maWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fY29uZmlnIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2NvbmZpZ19nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2NvbmZpZyAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9jb25maWcgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9jb25maWdfdW5wYWNrKGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fY29uZmlnICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2NvbmZpZyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fY29uZmlnX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fY29uZmlnIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9jb25maWdfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fY29uZmlnICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fa2V5X2V4Y2hhbmdlX2NvbmZpZyBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fa2V5X2V4Y2hhbmdlX2NvbmZpZ19zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9rZXlfZXhjaGFuZ2VfY29uZmlnICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fa2V5X2V4Y2hhbmdlX2NvbmZpZyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fa2V5X2V4Y2hhbmdlX2NvbmZpZ19wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2tleV9leGNoYW5nZV9jb25maWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fa2V5X2V4Y2hhbmdlX2NvbmZpZyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9rZXlfZXhjaGFuZ2VfY29uZmlnX3VucGFjayhiY21vbHRfZXBvbl9rZXlfZXhjaGFuZ2VfY29uZmlnICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9rZXlfZXhjaGFuZ2VfY29uZmlnIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fa2V5X2V4Y2hhbmdlX2NvbmZpZ19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9rZXlfZXhjaGFuZ2VfY29uZmlnIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fa2V5X2V4Y2hhbmdlX2NvbmZpZ19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fa2V5X2V4Y2hhbmdlX2NvbmZpZyAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX2xhc2VyX292ZXJoZWFkX3BhcmFtZXRlcnMgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9lcG9uX2xhc2VyX292ZXJoZWFkX3BhcmFtZXRlcnNfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVycyAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2xhc2VyX292ZXJoZWFkX3BhcmFtZXRlcnMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xhc2VyX292ZXJoZWFkX3BhcmFtZXRlcnNfcGFjayhjb25zdCBiY21vbHRfZXBvbl9sYXNlcl9vdmVyaGVhZF9wYXJhbWV0ZXJzICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2xhc2VyX292ZXJoZWFkX3BhcmFtZXRlcnMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVyc191bnBhY2soYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVycyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVycyBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xhc2VyX292ZXJoZWFkX3BhcmFtZXRlcnNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVycyBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVyc19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVycyAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX2xpbmtfYWxhcm1fc3RhdGUgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9lcG9uX2xpbmtfYWxhcm1fc3RhdGVfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbGlua19hbGFybV9zdGF0ZSAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfYWxhcm1fc3RhdGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfYWxhcm1fc3RhdGVfcGFjayhjb25zdCBiY21vbHRfZXBvbl9saW5rX2FsYXJtX3N0YXRlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfYWxhcm1fc3RhdGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19hbGFybV9zdGF0ZV91bnBhY2soYmNtb2x0X2Vwb25fbGlua19hbGFybV9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fbGlua19hbGFybV9zdGF0ZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfYWxhcm1fc3RhdGVfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fbGlua19hbGFybV9zdGF0ZSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfYWxhcm1fc3RhdGVfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfYWxhcm1fc3RhdGUgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9saW5rX2ZlY19lbiBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbGlua19mZWNfZW5fc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbGlua19mZWNfZW4gKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2ZlY19lbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19mZWNfZW5fcGFjayhjb25zdCBiY21vbHRfZXBvbl9saW5rX2ZlY19lbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2ZlY19lbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2ZlY19lbl91bnBhY2soYmNtb2x0X2Vwb25fbGlua19mZWNfZW4gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX2xpbmtfZmVjX2VuIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19mZWNfZW5fc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fbGlua19mZWNfZW4gaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2ZlY19lbl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19mZWNfZW4gKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9saW5rX2luZm8gc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9lcG9uX2xpbmtfaW5mb19zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9saW5rX2luZm8gKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2luZm8gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfaW5mb19wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfaW5mbyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2luZm8gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19pbmZvX3VucGFjayhiY21vbHRfZXBvbl9saW5rX2luZm8gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX2xpbmtfaW5mbyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfaW5mb19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9saW5rX2luZm8gaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2luZm9fYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfaW5mbyAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9nYXRlX3BhcmFtZXRlcnMgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9nYXRlX3BhcmFtZXRlcnNfc2V0X2RlZmF1bHQoYmNtb2x0X2dhdGVfcGFyYW1ldGVycyAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9nYXRlX3BhcmFtZXRlcnMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9nYXRlX3BhcmFtZXRlcnNfcGFjayhjb25zdCBiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9nYXRlX3BhcmFtZXRlcnMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dhdGVfcGFyYW1ldGVyc191bnBhY2soYmNtb2x0X2dhdGVfcGFyYW1ldGVycyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dhdGVfcGFyYW1ldGVycyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9nYXRlX3BhcmFtZXRlcnNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dhdGVfcGFyYW1ldGVycyBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9nYXRlX3BhcmFtZXRlcnNfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9nYXRlX3BhcmFtZXRlcnMgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX2xpc3RfdTMyIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX2xpc3RfdTMyX3NldF9kZWZhdWx0KGJjbW9sdF9nYXRlX3BhcmFtZXRlcnNfbGlzdF91MzIgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX2xpc3RfdTMyIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX2xpc3RfdTMyX3BhY2soY29uc3QgYmNtb2x0X2dhdGVfcGFyYW1ldGVyc19saXN0X3UzMiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dhdGVfcGFyYW1ldGVyc19saXN0X3UzMiB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dhdGVfcGFyYW1ldGVyc19saXN0X3UzMl9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX2xpc3RfdTMyICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX2xpc3RfdTMyIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9nYXRlX3BhcmFtZXRlcnNfbGlzdF91MzJfdW5wYWNrKGJjbW9sdF9nYXRlX3BhcmFtZXRlcnNfbGlzdF91MzIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9nYXRlX3BhcmFtZXRlcnNfbGlzdF91MzIgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX2xpc3RfdTMyX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9nYXRlX3BhcmFtZXRlcnNfbGlzdF91MzIgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX2xpc3RfdTMyX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX2xpc3RfdTMyICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX3JlZ2lzdHJhdGlvbl9nYXRlX21vZGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX3JlZ2lzdHJhdGlvbl9nYXRlX21vZGUgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3JlZ2lzdHJhdGlvbl9nYXRlX21vZGVfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fbG9naWNhbF9saW5rX29wdGlvbnMgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgCisgKiB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbG9naWNhbF9saW5rX29wdGlvbnMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbG9naWNhbF9saW5rX29wdGlvbnMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9uc19nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucyAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbG9naWNhbF9saW5rX29wdGlvbnMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbG9naWNhbF9saW5rX29wdGlvbnNfdW5wYWNrKGJjbW9sdF9lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbG9naWNhbF9saW5rX29wdGlvbnNfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fbmlfYWxhcm1fc3RhdGUgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9lcG9uX25pX2FsYXJtX3N0YXRlX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX25pX2FsYXJtX3N0YXRlICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfYWxhcm1fc3RhdGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2FsYXJtX3N0YXRlX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfYWxhcm1fc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfYWxhcm1fc3RhdGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfYWxhcm1fc3RhdGVfdW5wYWNrKGJjbW9sdF9lcG9uX25pX2FsYXJtX3N0YXRlICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9uaV9hbGFybV9zdGF0ZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2FsYXJtX3N0YXRlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX25pX2FsYXJtX3N0YXRlIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfYWxhcm1fc3RhdGVfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX25pX2FsYXJtX3N0YXRlICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fbmlfZW5jcnlwdGlvbl9jZmcgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9lcG9uX25pX2VuY3J5cHRpb25fY2ZnX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX25pX2VuY3J5cHRpb25fY2ZnICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfZW5jcnlwdGlvbl9jZmcgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2VuY3J5cHRpb25fY2ZnX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfZW5jcnlwdGlvbl9jZmcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfZW5jcnlwdGlvbl9jZmcgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfZW5jcnlwdGlvbl9jZmdfdW5wYWNrKGJjbW9sdF9lcG9uX25pX2VuY3J5cHRpb25fY2ZnICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9uaV9lbmNyeXB0aW9uX2NmZyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2VuY3J5cHRpb25fY2ZnX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX25pX2VuY3J5cHRpb25fY2ZnIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfZW5jcnlwdGlvbl9jZmdfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX25pX2VuY3J5cHRpb25fY2ZnICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXNfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXNfcGFjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtcyB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtcyAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtc191bnBhY2soYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXMgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXMgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXMgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgCisgKiB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXMgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1cyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzX3VucGFjayhiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1cyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXMgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXNfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1cyAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMiBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMiAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzIgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMl9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzIgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzJfdW5wYWNrKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMiBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzIgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19jb25maWd1cmF0aW9uIHN0cnVjdC4gIFRoaXMgCisgKiBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19jb25maWd1cmF0aW9uX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2NvbmZpZ3VyYXRpb24gKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19jb25maWd1cmF0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19jb25maWd1cmF0aW9uX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY29uZmlndXJhdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19jb25maWd1cmF0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2NvbmZpZ3VyYXRpb25fdW5wYWNrKGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2NvbmZpZ3VyYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2NvbmZpZ3VyYXRpb24gc3RydWN0IAorICogYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19jb25maWd1cmF0aW9uX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2NvbmZpZ3VyYXRpb24gaXMgCisgKiBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2NvbmZpZ3VyYXRpb25fYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2NvbmZpZ3VyYXRpb24gKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfdThfbGlzdF91MTYgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF91OF9saXN0X3UxNl9zZXRfZGVmYXVsdChiY21vbHRfdThfbGlzdF91MTYgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfdThfbGlzdF91MTYgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF91OF9saXN0X3UxNl9wYWNrKGNvbnN0IGJjbW9sdF91OF9saXN0X3UxNiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3U4X2xpc3RfdTE2IHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3U4X2xpc3RfdTE2X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF91OF9saXN0X3UxNiAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3U4X2xpc3RfdTE2IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF91OF9saXN0X3UxNl91bnBhY2soYmNtb2x0X3U4X2xpc3RfdTE2ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfdThfbGlzdF91MTYgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdThfbGlzdF91MTZfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3U4X2xpc3RfdTE2IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3U4X2xpc3RfdTE2X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfdThfbGlzdF91MTYgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXRoZXJuZXRfZnJhbWVfbWFza2VkIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfZXRoZXJuZXRfZnJhbWVfbWFza2VkX3NldF9kZWZhdWx0KGJjbW9sdF9ldGhlcm5ldF9mcmFtZV9tYXNrZWQgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZXRoZXJuZXRfZnJhbWVfbWFza2VkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXRoZXJuZXRfZnJhbWVfbWFza2VkX3BhY2soY29uc3QgYmNtb2x0X2V0aGVybmV0X2ZyYW1lX21hc2tlZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2V0aGVybmV0X2ZyYW1lX21hc2tlZCB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2V0aGVybmV0X2ZyYW1lX21hc2tlZF9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXRoZXJuZXRfZnJhbWVfbWFza2VkICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXRoZXJuZXRfZnJhbWVfbWFza2VkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ldGhlcm5ldF9mcmFtZV9tYXNrZWRfdW5wYWNrKGJjbW9sdF9ldGhlcm5ldF9mcmFtZV9tYXNrZWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ldGhlcm5ldF9mcmFtZV9tYXNrZWQgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXRoZXJuZXRfZnJhbWVfbWFza2VkX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ldGhlcm5ldF9mcmFtZV9tYXNrZWQgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXRoZXJuZXRfZnJhbWVfbWFza2VkX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXRoZXJuZXRfZnJhbWVfbWFza2VkICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2V0aGVybmV0X2ZyYW1lX3VubWFza2VkIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfZXRoZXJuZXRfZnJhbWVfdW5tYXNrZWRfc2V0X2RlZmF1bHQoYmNtb2x0X2V0aGVybmV0X2ZyYW1lX3VubWFza2VkICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2V0aGVybmV0X2ZyYW1lX3VubWFza2VkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXRoZXJuZXRfZnJhbWVfdW5tYXNrZWRfcGFjayhjb25zdCBiY21vbHRfZXRoZXJuZXRfZnJhbWVfdW5tYXNrZWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ldGhlcm5ldF9mcmFtZV91bm1hc2tlZCB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2V0aGVybmV0X2ZyYW1lX3VubWFza2VkX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ldGhlcm5ldF9mcmFtZV91bm1hc2tlZCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2V0aGVybmV0X2ZyYW1lX3VubWFza2VkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ldGhlcm5ldF9mcmFtZV91bm1hc2tlZF91bnBhY2soYmNtb2x0X2V0aGVybmV0X2ZyYW1lX3VubWFza2VkICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXRoZXJuZXRfZnJhbWVfdW5tYXNrZWQgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXRoZXJuZXRfZnJhbWVfdW5tYXNrZWRfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2V0aGVybmV0X2ZyYW1lX3VubWFza2VkIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2V0aGVybmV0X2ZyYW1lX3VubWFza2VkX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXRoZXJuZXRfZnJhbWVfdW5tYXNrZWQgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2V4dGVuZGVkX2d1YXJkX3RpbWVfc2V0X2RlZmF1bHQoYmNtb2x0X2V4dGVuZGVkX2d1YXJkX3RpbWUgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2V4dGVuZGVkX2d1YXJkX3RpbWVfcGFjayhjb25zdCBiY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZV91bnBhY2soYmNtb2x0X2V4dGVuZGVkX2d1YXJkX3RpbWUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9leHRlbmRlZF9ndWFyZF90aW1lIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2V4dGVuZGVkX2d1YXJkX3RpbWVfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2V4dGVuZGVkX2d1YXJkX3RpbWUgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2V4dGVuZGVkX2d1YXJkX3RpbWUgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbiBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2Zpcm13YXJlX3N3X3ZlcnNpb25fc2V0X2RlZmF1bHQoYmNtb2x0X2Zpcm13YXJlX3N3X3ZlcnNpb24gKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Zpcm13YXJlX3N3X3ZlcnNpb25fcGFjayhjb25zdCBiY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbl91bnBhY2soYmNtb2x0X2Zpcm13YXJlX3N3X3ZlcnNpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9maXJtd2FyZV9zd192ZXJzaW9uIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Zpcm13YXJlX3N3X3ZlcnNpb25fc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Zpcm13YXJlX3N3X3ZlcnNpb24gaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Zpcm13YXJlX3N3X3ZlcnNpb24gKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ2VtX3BvcnRfY29uZmlndXJhdGlvbiBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fc2V0X2RlZmF1bHQoYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb24gKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZ2VtX3BvcnRfY29uZmlndXJhdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fcGFjayhjb25zdCBiY21vbHRfZ2VtX3BvcnRfY29uZmlndXJhdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ2VtX3BvcnRfY29uZmlndXJhdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ2VtX3BvcnRfY29uZmlndXJhdGlvbl91bnBhY2soYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9nZW1fcG9ydF9jb25maWd1cmF0aW9uIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb24gaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb24gKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGUgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlX3BhY2soY29uc3QgYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGVfdW5wYWNrKGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGUgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGUgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzIgc3RydWN0LiAgVGhpcyAKKyAqIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzIgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyX3BhY2soY29uc3QgYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMl9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMiAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzIgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzJfdW5wYWNrKGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMiBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyIGlzIAorICogb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzIgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9kZWJ1Z19mbG93X2NvbmZpZyBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fZGVidWdfZmxvd19jb25maWdfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fZGVidWdfZmxvd19jb25maWcgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9kZWJ1Z19mbG93X2NvbmZpZyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZGVidWdfZmxvd19jb25maWdfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9kZWJ1Z19mbG93X2NvbmZpZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9kZWJ1Z19mbG93X2NvbmZpZyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9kZWJ1Z19mbG93X2NvbmZpZ191bnBhY2soYmNtb2x0X2dwb25fZGVidWdfZmxvd19jb25maWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX2RlYnVnX2Zsb3dfY29uZmlnIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZGVidWdfZmxvd19jb25maWdfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fZGVidWdfZmxvd19jb25maWcgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9kZWJ1Z19mbG93X2NvbmZpZ19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fZGVidWdfZmxvd19jb25maWcgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTYgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9ncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNl9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTYgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTYgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNl9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2IHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTZfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2ICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTYgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2X3VucGFjayhiY21vbHRfZ3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTYgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNiBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTYgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2ICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX3VucGFjayhiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCBzdHJ1Y3QuICBUaGlzIAorICogc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4X3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4X3BhY2soY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4ICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOF9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjggKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjhfdW5wYWNrKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4IHN0cnVjdCAKKyAqIGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCAKKyAqIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjggKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTYgc3RydWN0LiAgVGhpcyAKKyAqIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1Nl9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTYgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTYgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1Nl9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1NiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTYgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTZfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2ICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTYgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2X3VucGFjayhiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTYgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1NiBzdHJ1Y3QgCisgKiBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1Nl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTYgCisgKiBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1Nl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2ICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25faXdmX2RlYnVnX2Zsb3dfY29uZmlnIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9pd2ZfZGVidWdfZmxvd19jb25maWdfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25faXdmX2RlYnVnX2Zsb3dfY29uZmlnICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25faXdmX2RlYnVnX2Zsb3dfY29uZmlnIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZGVidWdfZmxvd19jb25maWdfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfZGVidWdfZmxvd19jb25maWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25faXdmX2RlYnVnX2Zsb3dfY29uZmlnIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9kZWJ1Z19mbG93X2NvbmZpZ191bnBhY2soYmNtb2x0X2dwb25faXdmX2RlYnVnX2Zsb3dfY29uZmlnICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9pd2ZfZGVidWdfZmxvd19jb25maWcgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZGVidWdfZmxvd19jb25maWdfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25faXdmX2RlYnVnX2Zsb3dfY29uZmlnIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZGVidWdfZmxvd19jb25maWdfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9kZWJ1Z19mbG93X2NvbmZpZyAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX2tleV9leGNoYW5nZSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fa2V5X2V4Y2hhbmdlX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2tleV9leGNoYW5nZSAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2tleV9leGNoYW5nZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fa2V5X2V4Y2hhbmdlX3BhY2soY29uc3QgYmNtb2x0X2dwb25fa2V5X2V4Y2hhbmdlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2tleV9leGNoYW5nZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9rZXlfZXhjaGFuZ2VfdW5wYWNrKGJjbW9sdF9ncG9uX2tleV9leGNoYW5nZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fa2V5X2V4Y2hhbmdlIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fa2V5X2V4Y2hhbmdlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX2tleV9leGNoYW5nZSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2tleV9leGNoYW5nZV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fa2V5X2V4Y2hhbmdlICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0IHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHRfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0ICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHRfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdF91bnBhY2soYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHQgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHRfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0IGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHRfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdCAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdF9saXN0X3UxNiBzdHJ1Y3QuICBUaGlzIHNldHMgCisgKiBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0X2xpc3RfdTE2X3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdF9saXN0X3UxNiAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdF9saXN0X3UxNiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0X2xpc3RfdTE2X3BhY2soY29uc3QgYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0X2xpc3RfdTE2ICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHRfbGlzdF91MTYgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdF9saXN0X3UxNl9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHRfbGlzdF91MTYgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdF9saXN0X3UxNiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHRfbGlzdF91MTZfdW5wYWNrKGJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdF9saXN0X3UxNiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0X2xpc3RfdTE2IHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0X2xpc3RfdTE2X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdF9saXN0X3UxNiBpcyBvdXQgCisgKiBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0X2xpc3RfdTE2X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHRfbGlzdF91MTYgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9uaV9kZWJ1ZyBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fbmlfZGVidWdfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fbmlfZGVidWcgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9kZWJ1ZyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfZGVidWdfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9kZWJ1ZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9kZWJ1ZyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9kZWJ1Z191bnBhY2soYmNtb2x0X2dwb25fbmlfZGVidWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX25pX2RlYnVnIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfZGVidWdfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fbmlfZGVidWcgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9kZWJ1Z19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fbmlfZGVidWcgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfYWN0aXZhdGlvbiBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X2FjdGl2YXRpb25fc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X2FjdGl2YXRpb24gKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfYWN0aXZhdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2FjdGl2YXRpb25fcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfYWN0aXZhdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfYWN0aXZhdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfYWN0aXZhdGlvbl91bnBhY2soYmNtb2x0X2dwb25fb251X2FjdGl2YXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX29udV9hY3RpdmF0aW9uIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2FjdGl2YXRpb25fc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fb251X2FjdGl2YXRpb24gaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfYWN0aXZhdGlvbl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X2FjdGl2YXRpb24gKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGUgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGUgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGUgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGVfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZSAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX29udV9hbGFybXMgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9ncG9uX29udV9hbGFybXNfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X2FsYXJtcyAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9hbGFybXMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9hbGFybXNfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9hbGFybXMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2FsYXJtc191bnBhY2soYmNtb2x0X2dwb25fb251X2FsYXJtcyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fb251X2FsYXJtcyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9hbGFybXNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fb251X2FsYXJtcyBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9hbGFybXNfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9hbGFybXMgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9ncG9uX29udV9hbGFybXNfdGhyZXNob2xkc19zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9hbGFybXNfdGhyZXNob2xkc19wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9hbGFybXNfdGhyZXNob2xkcyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2FsYXJtc190aHJlc2hvbGRzX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX29udV9hbGFybXNfdGhyZXNob2xkcyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9hbGFybXNfdGhyZXNob2xkc19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9hbGFybXNfdGhyZXNob2xkc19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X2FsYXJtc190aHJlc2hvbGRzICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fb251X2VxZCBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X2VxZF9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfZXFkICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X2VxZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2VxZF9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9lcWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X2VxZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfZXFkX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfZXFkICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfZXFkIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2VxZF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9vbnVfZXFkIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2VxZF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X2VxZCAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX29udV9lcWRfbGlzdF91MzIgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9ncG9uX29udV9lcWRfbGlzdF91MzJfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X2VxZF9saXN0X3UzMiAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9lcWRfbGlzdF91MzIgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9lcWRfbGlzdF91MzJfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfZXFkX2xpc3RfdTMyICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9vbnVfZXFkX2xpc3RfdTMyIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfZXFkX2xpc3RfdTMyX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9lcWRfbGlzdF91MzIgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9lcWRfbGlzdF91MzIgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2VxZF9saXN0X3UzMl91bnBhY2soYmNtb2x0X2dwb25fb251X2VxZF9saXN0X3UzMiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fb251X2VxZF9saXN0X3UzMiBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9lcWRfbGlzdF91MzJfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fb251X2VxZF9saXN0X3UzMiBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9lcWRfbGlzdF91MzJfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9lcWRfbGlzdF91MzIgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfaWRfbGlzdF91MzJfbWF4XzI1NiBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X2lkX2xpc3RfdTMyX21heF8yNTZfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X2lkX2xpc3RfdTMyX21heF8yNTYgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfaWRfbGlzdF91MzJfbWF4XzI1NiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2lkX2xpc3RfdTMyX21heF8yNTZfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfaWRfbGlzdF91MzJfbWF4XzI1NiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fb251X2lkX2xpc3RfdTMyX21heF8yNTYgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9pZF9saXN0X3UzMl9tYXhfMjU2X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9pZF9saXN0X3UzMl9tYXhfMjU2ICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfaWRfbGlzdF91MzJfbWF4XzI1NiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfaWRfbGlzdF91MzJfbWF4XzI1Nl91bnBhY2soYmNtb2x0X2dwb25fb251X2lkX2xpc3RfdTMyX21heF8yNTYgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX29udV9pZF9saXN0X3UzMl9tYXhfMjU2IHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2lkX2xpc3RfdTMyX21heF8yNTZfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fb251X2lkX2xpc3RfdTMyX21heF8yNTYgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9pZF9saXN0X3UzMl9tYXhfMjU2X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfaWRfbGlzdF91MzJfbWF4XzI1NiAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtcyBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtcyAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtcyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtcyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9wYXJhbXNfdW5wYWNrKGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtcyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtcyBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtc19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c191bnBhY2soYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXMgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXMgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzIgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMl9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzIgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzIgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMl9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzJfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzIgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMiBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzIgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGUgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGVfdW5wYWNrKGJjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGVfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCBzdHJ1Y3QuICBUaGlzIHNldHMgCisgKiBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOF9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4ICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOF9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjggKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjggCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjhfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4X3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4IHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4IGlzIAorICogb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4ICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb24gc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9ncG9uX3Jzc2lfZ2VuZXJhbF9jb25maWd1cmF0aW9uX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX3Jzc2lfZ2VuZXJhbF9jb25maWd1cmF0aW9uICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX3Jzc2lfZ2VuZXJhbF9jb25maWd1cmF0aW9uX3BhY2soY29uc3QgYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb25fdW5wYWNrKGJjbW9sdF9ncG9uX3Jzc2lfZ2VuZXJhbF9jb25maWd1cmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9yc3NpX2dlbmVyYWxfY29uZmlndXJhdGlvbiBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX3Jzc2lfZ2VuZXJhbF9jb25maWd1cmF0aW9uX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX3Jzc2lfZ2VuZXJhbF9jb25maWd1cmF0aW9uIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9yc3NpX2dlbmVyYWxfY29uZmlndXJhdGlvbl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb24gKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9zbl9hY3F1aXNpdGlvbiBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb25fc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb24gKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9zbl9hY3F1aXNpdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb25fcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9zbl9hY3F1aXNpdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9zbl9hY3F1aXNpdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9zbl9hY3F1aXNpdGlvbl91bnBhY2soYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX3NuX2FjcXVpc2l0aW9uIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb25fc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb24gaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9zbl9hY3F1aXNpdGlvbl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb24gKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfaG9zdF9zd192ZXJzaW9uIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfaG9zdF9zd192ZXJzaW9uX3NldF9kZWZhdWx0KGJjbW9sdF9ob3N0X3N3X3ZlcnNpb24gKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfaG9zdF9zd192ZXJzaW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfaG9zdF9zd192ZXJzaW9uX3BhY2soY29uc3QgYmNtb2x0X2hvc3Rfc3dfdmVyc2lvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfaG9zdF9zd192ZXJzaW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ob3N0X3N3X3ZlcnNpb25fdW5wYWNrKGJjbW9sdF9ob3N0X3N3X3ZlcnNpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ob3N0X3N3X3ZlcnNpb24gc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfaG9zdF9zd192ZXJzaW9uX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ob3N0X3N3X3ZlcnNpb24gaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfaG9zdF9zd192ZXJzaW9uX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfaG9zdF9zd192ZXJzaW9uICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2h3X3Bvbl9pZCBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2h3X3Bvbl9pZF9zZXRfZGVmYXVsdChiY21vbHRfaHdfcG9uX2lkICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2h3X3Bvbl9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2h3X3Bvbl9pZF9wYWNrKGNvbnN0IGJjbW9sdF9od19wb25faWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2h3X3Bvbl9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfaHdfcG9uX2lkX3VucGFjayhiY21vbHRfaHdfcG9uX2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfaHdfcG9uX2lkIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyAKKyAqIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2h3X3Bvbl9pZF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfaHdfcG9uX2lkIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2h3X3Bvbl9pZF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2h3X3Bvbl9pZCAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9pZWVlXzgwMjFhc19wb3J0X2lkZW50aXR5IHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfaWVlZV84MDIxYXNfcG9ydF9pZGVudGl0eV9zZXRfZGVmYXVsdChiY21vbHRfaWVlZV84MDIxYXNfcG9ydF9pZGVudGl0eSAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9pZWVlXzgwMjFhc19wb3J0X2lkZW50aXR5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfaWVlZV84MDIxYXNfcG9ydF9pZGVudGl0eV9wYWNrKGNvbnN0IGJjbW9sdF9pZWVlXzgwMjFhc19wb3J0X2lkZW50aXR5ICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9pZWVlXzgwMjFhc19wb3J0X2lkZW50aXR5IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9pZWVlXzgwMjFhc19wb3J0X2lkZW50aXR5X3VucGFjayhiY21vbHRfaWVlZV84MDIxYXNfcG9ydF9pZGVudGl0eSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2llZWVfODAyMWFzX3BvcnRfaWRlbnRpdHkgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfaWVlZV84MDIxYXNfcG9ydF9pZGVudGl0eV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfaWVlZV84MDIxYXNfcG9ydF9pZGVudGl0eSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9pZWVlXzgwMjFhc19wb3J0X2lkZW50aXR5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfaWVlZV84MDIxYXNfcG9ydF9pZGVudGl0eSAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9pZWVlXzgwMjFhc190aW1lc3RhbXAgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9pZWVlXzgwMjFhc190aW1lc3RhbXBfc2V0X2RlZmF1bHQoYmNtb2x0X2llZWVfODAyMWFzX3RpbWVzdGFtcCAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9pZWVlXzgwMjFhc190aW1lc3RhbXAgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9pZWVlXzgwMjFhc190aW1lc3RhbXBfcGFjayhjb25zdCBiY21vbHRfaWVlZV84MDIxYXNfdGltZXN0YW1wICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9pZWVlXzgwMjFhc190aW1lc3RhbXAgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2llZWVfODAyMWFzX3RpbWVzdGFtcF91bnBhY2soYmNtb2x0X2llZWVfODAyMWFzX3RpbWVzdGFtcCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2llZWVfODAyMWFzX3RpbWVzdGFtcCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9pZWVlXzgwMjFhc190aW1lc3RhbXBfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2llZWVfODAyMWFzX3RpbWVzdGFtcCBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9pZWVlXzgwMjFhc190aW1lc3RhbXBfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9pZWVlXzgwMjFhc190aW1lc3RhbXAgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfaWVlZV84MDIxYXNfdGltZV9zeW5jIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfaWVlZV84MDIxYXNfdGltZV9zeW5jX3NldF9kZWZhdWx0KGJjbW9sdF9pZWVlXzgwMjFhc190aW1lX3N5bmMgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfaWVlZV84MDIxYXNfdGltZV9zeW5jIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfaWVlZV84MDIxYXNfdGltZV9zeW5jX3BhY2soY29uc3QgYmNtb2x0X2llZWVfODAyMWFzX3RpbWVfc3luYyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfaWVlZV84MDIxYXNfdGltZV9zeW5jIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9pZWVlXzgwMjFhc190aW1lX3N5bmNfdW5wYWNrKGJjbW9sdF9pZWVlXzgwMjFhc190aW1lX3N5bmMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9pZWVlXzgwMjFhc190aW1lX3N5bmMgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfaWVlZV84MDIxYXNfdGltZV9zeW5jX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9pZWVlXzgwMjFhc190aW1lX3N5bmMgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfaWVlZV84MDIxYXNfdGltZV9zeW5jX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfaWVlZV84MDIxYXNfdGltZV9zeW5jICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2luZGljYXRpb25fc2hhcGluZyBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X2luZGljYXRpb25fc2hhcGluZ19zZXRfZGVmYXVsdChiY21vbHRfaW5kaWNhdGlvbl9zaGFwaW5nICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2luZGljYXRpb25fc2hhcGluZyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2luZGljYXRpb25fc2hhcGluZ19wYWNrKGNvbnN0IGJjbW9sdF9pbmRpY2F0aW9uX3NoYXBpbmcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2luZGljYXRpb25fc2hhcGluZyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfaW5kaWNhdGlvbl9zaGFwaW5nX3VucGFjayhiY21vbHRfaW5kaWNhdGlvbl9zaGFwaW5nICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfaW5kaWNhdGlvbl9zaGFwaW5nIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2luZGljYXRpb25fc2hhcGluZ19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfaW5kaWNhdGlvbl9zaGFwaW5nIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2luZGljYXRpb25fc2hhcGluZ19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2luZGljYXRpb25fc2hhcGluZyAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9sYV9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfbGFfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbl9zZXRfZGVmYXVsdChiY21vbHRfbGFfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbiAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9sYV9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbGFfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbl9wYWNrKGNvbnN0IGJjbW9sdF9sYV9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9sYV9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9sYV9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uX3VucGFjayhiY21vbHRfbGFfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2xhX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb24gc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbGFfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfbGFfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbiBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xhX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb25fYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9sYV9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2xvZ19idWZmZXIgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9sb2dfYnVmZmVyX3NldF9kZWZhdWx0KGJjbW9sdF9sb2dfYnVmZmVyICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2xvZ19idWZmZXIgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dfYnVmZmVyX3BhY2soY29uc3QgYmNtb2x0X2xvZ19idWZmZXIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2xvZ19idWZmZXIgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19idWZmZXJfdW5wYWNrKGJjbW9sdF9sb2dfYnVmZmVyICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfbG9nX2J1ZmZlciBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dfYnVmZmVyX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9sb2dfYnVmZmVyIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19idWZmZXJfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9sb2dfYnVmZmVyICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X21hY190YWJsZV9jb25maWd1cmF0aW9uIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb25fc2V0X2RlZmF1bHQoYmNtb2x0X21hY190YWJsZV9jb25maWd1cmF0aW9uICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X21hY190YWJsZV9jb25maWd1cmF0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb25fcGFjayhjb25zdCBiY21vbHRfbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X21hY190YWJsZV9jb25maWd1cmF0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9tYWNfdGFibGVfY29uZmlndXJhdGlvbl91bnBhY2soYmNtb2x0X21hY190YWJsZV9jb25maWd1cmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24gc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb25fc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X21hY190YWJsZV9jb25maWd1cmF0aW9uIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X21hY190YWJsZV9jb25maWd1cmF0aW9uX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24gKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMiBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfc2V0X2RlZmF1bHQoYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzIgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfcGFjayhjb25zdCBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzIgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl91bnBhY2soYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzIgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzIgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9tYXhfMjA0OCBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfbWF4XzIwNDhfc2V0X2RlZmF1bHQoYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfbWF4XzIwNDggKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9tYXhfMjA0OCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfbWF4XzIwNDhfcGFjayhjb25zdCBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9tYXhfMjA0OCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfbWF4XzIwNDggd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyX21heF8yMDQ4X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyX21heF8yMDQ4ICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9tYXhfMjA0OCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9tYXhfMjA0OF91bnBhY2soYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfbWF4XzIwNDggKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyX21heF8yMDQ4IHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfbWF4XzIwNDhfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfbWF4XzIwNDggaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyX21heF8yMDQ4X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9tYXhfMjA0OCAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ubmlfbGlua19zdGF0dXMgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9ubmlfbGlua19zdGF0dXNfc2V0X2RlZmF1bHQoYmNtb2x0X25uaV9saW5rX3N0YXR1cyAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ubmlfbGlua19zdGF0dXMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfbGlua19zdGF0dXNfcGFjayhjb25zdCBiY21vbHRfbm5pX2xpbmtfc3RhdHVzICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ubmlfbGlua19zdGF0dXMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9saW5rX3N0YXR1c191bnBhY2soYmNtb2x0X25uaV9saW5rX3N0YXR1cyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X25uaV9saW5rX3N0YXR1cyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfbGlua19zdGF0dXNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X25uaV9saW5rX3N0YXR1cyBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfbGlua19zdGF0dXNfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ubmlfbGlua19zdGF0dXMgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfb2FtX2hlYXJ0YmVhdF9jb25maWcgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9vYW1faGVhcnRiZWF0X2NvbmZpZ19zZXRfZGVmYXVsdChiY21vbHRfb2FtX2hlYXJ0YmVhdF9jb25maWcgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfb2FtX2hlYXJ0YmVhdF9jb25maWcgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9vYW1faGVhcnRiZWF0X2NvbmZpZ19wYWNrKGNvbnN0IGJjbW9sdF9vYW1faGVhcnRiZWF0X2NvbmZpZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X29hbV9oZWFydGJlYXRfY29uZmlnIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfb2FtX2hlYXJ0YmVhdF9jb25maWdfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X29hbV9oZWFydGJlYXRfY29uZmlnICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfb2FtX2hlYXJ0YmVhdF9jb25maWcgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29hbV9oZWFydGJlYXRfY29uZmlnX3VucGFjayhiY21vbHRfb2FtX2hlYXJ0YmVhdF9jb25maWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9vYW1faGVhcnRiZWF0X2NvbmZpZyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9vYW1faGVhcnRiZWF0X2NvbmZpZ19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfb2FtX2hlYXJ0YmVhdF9jb25maWcgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfb2FtX2hlYXJ0YmVhdF9jb25maWdfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9vYW1faGVhcnRiZWF0X2NvbmZpZyAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uIHN0cnVjdC4gIFRoaXMgc2V0cyAKKyAqIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbl9zZXRfZGVmYXVsdChiY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbiAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbl9wYWNrKGNvbnN0IGJjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uX3VucGFjayhiY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X29udV9wb3dlcl9tYW5hZ2VtZW50X2NvbmZpZ3VyYXRpb24gc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbiBpcyBvdXQgCisgKiBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29udV9wb3dlcl9tYW5hZ2VtZW50X2NvbmZpZ3VyYXRpb25fYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X29udV90dW5pbmdfY29uZmlndXJhdGlvbiBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X29udV90dW5pbmdfY29uZmlndXJhdGlvbl9zZXRfZGVmYXVsdChiY21vbHRfb251X3R1bmluZ19jb25maWd1cmF0aW9uICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X29udV90dW5pbmdfY29uZmlndXJhdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29udV90dW5pbmdfY29uZmlndXJhdGlvbl9wYWNrKGNvbnN0IGJjbW9sdF9vbnVfdHVuaW5nX2NvbmZpZ3VyYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X29udV90dW5pbmdfY29uZmlndXJhdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfb251X3R1bmluZ19jb25maWd1cmF0aW9uX3VucGFjayhiY21vbHRfb251X3R1bmluZ19jb25maWd1cmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfb251X3R1bmluZ19jb25maWd1cmF0aW9uIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29udV90dW5pbmdfY29uZmlndXJhdGlvbl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfb251X3R1bmluZ19jb25maWd1cmF0aW9uIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29udV90dW5pbmdfY29uZmlndXJhdGlvbl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X29udV90dW5pbmdfY29uZmlndXJhdGlvbiAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9wb25faWQgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfcG9uX2lkX3NldF9kZWZhdWx0KGJjbW9sdF9wb25faWQgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfcG9uX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX2lkX3BhY2soY29uc3QgYmNtb2x0X3Bvbl9pZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfcG9uX2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9wb25faWRfdW5wYWNrKGJjbW9sdF9wb25faWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9wb25faWQgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIAorICogYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX2lkX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9wb25faWQgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX2lkX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfcG9uX2lkICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X29wZXJhdGlvbl9jb250cm9sIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfb3BlcmF0aW9uX2NvbnRyb2xfc2V0X2RlZmF1bHQoYmNtb2x0X29wZXJhdGlvbl9jb250cm9sICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X29wZXJhdGlvbl9jb250cm9sIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfb3BlcmF0aW9uX2NvbnRyb2xfcGFjayhjb25zdCBiY21vbHRfb3BlcmF0aW9uX2NvbnRyb2wgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X29wZXJhdGlvbl9jb250cm9sIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9vcGVyYXRpb25fY29udHJvbF91bnBhY2soYmNtb2x0X29wZXJhdGlvbl9jb250cm9sICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfb3BlcmF0aW9uX2NvbnRyb2wgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfb3BlcmF0aW9uX2NvbnRyb2xfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X29wZXJhdGlvbl9jb250cm9sIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29wZXJhdGlvbl9jb250cm9sX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfb3BlcmF0aW9uX2NvbnRyb2wgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3Jpbmdfc2V0X2RlZmF1bHQoYmNtb2x0X3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfcGFjayhjb25zdCBiY21vbHRfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZ191bnBhY2soYmNtb2x0X3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3Jpbmdfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9wb25fYWdncmVnYXRlX3NoYXBlciBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3Bvbl9hZ2dyZWdhdGVfc2hhcGVyX3NldF9kZWZhdWx0KGJjbW9sdF9wb25fYWdncmVnYXRlX3NoYXBlciAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9wb25fYWdncmVnYXRlX3NoYXBlciB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9hZ2dyZWdhdGVfc2hhcGVyX3BhY2soY29uc3QgYmNtb2x0X3Bvbl9hZ2dyZWdhdGVfc2hhcGVyICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9wb25fYWdncmVnYXRlX3NoYXBlciBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX2FnZ3JlZ2F0ZV9zaGFwZXJfdW5wYWNrKGJjbW9sdF9wb25fYWdncmVnYXRlX3NoYXBlciAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3Bvbl9hZ2dyZWdhdGVfc2hhcGVyIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9hZ2dyZWdhdGVfc2hhcGVyX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9wb25fYWdncmVnYXRlX3NoYXBlciBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9wb25fYWdncmVnYXRlX3NoYXBlcl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3Bvbl9hZ2dyZWdhdGVfc2hhcGVyICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3Bvbl9hbGxvY19zbGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9wb25fYWxsb2Nfc2xhX3NldF9kZWZhdWx0KGJjbW9sdF9wb25fYWxsb2Nfc2xhICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3Bvbl9hbGxvY19zbGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9wb25fYWxsb2Nfc2xhX3BhY2soY29uc3QgYmNtb2x0X3Bvbl9hbGxvY19zbGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3Bvbl9hbGxvY19zbGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9hbGxvY19zbGFfdW5wYWNrKGJjbW9sdF9wb25fYWxsb2Nfc2xhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfcG9uX2FsbG9jX3NsYSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9wb25fYWxsb2Nfc2xhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9wb25fYWxsb2Nfc2xhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9hbGxvY19zbGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9wb25fYWxsb2Nfc2xhICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3Bvbl9hdmFpbGFibGVfYmFuZHdpZHRoIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGhfc2V0X2RlZmF1bHQoYmNtb2x0X3Bvbl9hdmFpbGFibGVfYmFuZHdpZHRoICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3Bvbl9hdmFpbGFibGVfYmFuZHdpZHRoIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGhfcGFjayhjb25zdCBiY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGggKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3Bvbl9hdmFpbGFibGVfYmFuZHdpZHRoIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9wb25fYXZhaWxhYmxlX2JhbmR3aWR0aF91bnBhY2soYmNtb2x0X3Bvbl9hdmFpbGFibGVfYmFuZHdpZHRoICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGggc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGhfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3Bvbl9hdmFpbGFibGVfYmFuZHdpZHRoIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9hdmFpbGFibGVfYmFuZHdpZHRoX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGggKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfcG9uX2RiYSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3Bvbl9kYmFfc2V0X2RlZmF1bHQoYmNtb2x0X3Bvbl9kYmEgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfcG9uX2RiYSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9kYmFfcGFjayhjb25zdCBiY21vbHRfcG9uX2RiYSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfcG9uX2RiYSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX2RiYV91bnBhY2soYmNtb2x0X3Bvbl9kYmEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9wb25fZGJhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyAKKyAqIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9kYmFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3Bvbl9kYmEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX2RiYV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3Bvbl9kYmEgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfcG9uX2Rpc3RhbmNlIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgCisgKiB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfcG9uX2Rpc3RhbmNlX3NldF9kZWZhdWx0KGJjbW9sdF9wb25fZGlzdGFuY2UgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfcG9uX2Rpc3RhbmNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX2Rpc3RhbmNlX3BhY2soY29uc3QgYmNtb2x0X3Bvbl9kaXN0YW5jZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfcG9uX2Rpc3RhbmNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9wb25fZGlzdGFuY2VfdW5wYWNrKGJjbW9sdF9wb25fZGlzdGFuY2UgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9wb25fZGlzdGFuY2Ugc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX2Rpc3RhbmNlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9wb25fZGlzdGFuY2UgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX2Rpc3RhbmNlX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfcG9uX2Rpc3RhbmNlICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfcG9uX2RyaWZ0X2NvbnRyb2xfc2V0X2RlZmF1bHQoYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX2RyaWZ0X2NvbnRyb2xfcGFjayhjb25zdCBiY21vbHRfcG9uX2RyaWZ0X2NvbnRyb2wgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9wb25fZHJpZnRfY29udHJvbF91bnBhY2soYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfcG9uX2RyaWZ0X2NvbnRyb2wgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX2RyaWZ0X2NvbnRyb2xfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfcG9uX2RyaWZ0X2NvbnRyb2wgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfcG9uX29udV9pZF9saXN0X3UzMiBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3Bvbl9vbnVfaWRfbGlzdF91MzJfc2V0X2RlZmF1bHQoYmNtb2x0X3Bvbl9vbnVfaWRfbGlzdF91MzIgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfcG9uX29udV9pZF9saXN0X3UzMiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9vbnVfaWRfbGlzdF91MzJfcGFjayhjb25zdCBiY21vbHRfcG9uX29udV9pZF9saXN0X3UzMiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3Bvbl9vbnVfaWRfbGlzdF91MzIgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9wb25fb251X2lkX2xpc3RfdTMyX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9wb25fb251X2lkX2xpc3RfdTMyICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfcG9uX29udV9pZF9saXN0X3UzMiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX29udV9pZF9saXN0X3UzMl91bnBhY2soYmNtb2x0X3Bvbl9vbnVfaWRfbGlzdF91MzIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9wb25fb251X2lkX2xpc3RfdTMyIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9vbnVfaWRfbGlzdF91MzJfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3Bvbl9vbnVfaWRfbGlzdF91MzIgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX29udV9pZF9saXN0X3UzMl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3Bvbl9vbnVfaWRfbGlzdF91MzIgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfcG9uX3Bvd2VyX2xldmVsIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfcG9uX3Bvd2VyX2xldmVsX3NldF9kZWZhdWx0KGJjbW9sdF9wb25fcG93ZXJfbGV2ZWwgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfcG9uX3Bvd2VyX2xldmVsIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX3Bvd2VyX2xldmVsX3BhY2soY29uc3QgYmNtb2x0X3Bvbl9wb3dlcl9sZXZlbCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfcG9uX3Bvd2VyX2xldmVsIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9wb25fcG93ZXJfbGV2ZWxfdW5wYWNrKGJjbW9sdF9wb25fcG93ZXJfbGV2ZWwgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9wb25fcG93ZXJfbGV2ZWwgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX3Bvd2VyX2xldmVsX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9wb25fcG93ZXJfbGV2ZWwgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX3Bvd2VyX2xldmVsX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfcG9uX3Bvd2VyX2xldmVsICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZyBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19zZXRfZGVmYXVsdChiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19wYWNrKGNvbnN0IGJjbW9sdF9wb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3VucGFjayhiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZyAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9wb25fc3RhdHVzIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgCisgKiB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfcG9uX3N0YXR1c19zZXRfZGVmYXVsdChiY21vbHRfcG9uX3N0YXR1cyAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9wb25fc3RhdHVzIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX3N0YXR1c19wYWNrKGNvbnN0IGJjbW9sdF9wb25fc3RhdHVzICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9wb25fc3RhdHVzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9wb25fc3RhdHVzX3VucGFjayhiY21vbHRfcG9uX3N0YXR1cyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3Bvbl9zdGF0dXMgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcG9uX3N0YXR1c19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfcG9uX3N0YXR1cyBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9wb25fc3RhdHVzX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfcG9uX3N0YXR1cyAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZ19zZXRfZGVmYXVsdChiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZyAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZ19wYWNrKGNvbnN0IGJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnX3VucGFjayhiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZ19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZyBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZyAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWcgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWdfc2V0X2RlZmF1bHQoYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZyAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWcgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWdfcGFjayhjb25zdCBiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWcgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZ191bnBhY2soYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWdfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZyBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWdfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWcgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfcHJic19zdGF0dXMgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9wcmJzX3N0YXR1c19zZXRfZGVmYXVsdChiY21vbHRfcHJic19zdGF0dXMgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfcHJic19zdGF0dXMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9wcmJzX3N0YXR1c19wYWNrKGNvbnN0IGJjbW9sdF9wcmJzX3N0YXR1cyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfcHJic19zdGF0dXMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3ByYnNfc3RhdHVzX3VucGFjayhiY21vbHRfcHJic19zdGF0dXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9wcmJzX3N0YXR1cyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9wcmJzX3N0YXR1c19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfcHJic19zdGF0dXMgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcHJic19zdGF0dXNfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9wcmJzX3N0YXR1cyAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9yYW5naW5nX2NvbnRyb2xfY29uZmlndXJhdGlvbiBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3JhbmdpbmdfY29udHJvbF9jb25maWd1cmF0aW9uX3NldF9kZWZhdWx0KGJjbW9sdF9yYW5naW5nX2NvbnRyb2xfY29uZmlndXJhdGlvbiAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9yYW5naW5nX2NvbnRyb2xfY29uZmlndXJhdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JhbmdpbmdfY29udHJvbF9jb25maWd1cmF0aW9uX3BhY2soY29uc3QgYmNtb2x0X3JhbmdpbmdfY29udHJvbF9jb25maWd1cmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9yYW5naW5nX2NvbnRyb2xfY29uZmlndXJhdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcmFuZ2luZ19jb250cm9sX2NvbmZpZ3VyYXRpb25fdW5wYWNrKGJjbW9sdF9yYW5naW5nX2NvbnRyb2xfY29uZmlndXJhdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3JhbmdpbmdfY29udHJvbF9jb25maWd1cmF0aW9uIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JhbmdpbmdfY29udHJvbF9jb25maWd1cmF0aW9uX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9yYW5naW5nX2NvbnRyb2xfY29uZmlndXJhdGlvbiBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JhbmdpbmdfY29udHJvbF9jb25maWd1cmF0aW9uX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfcmFuZ2luZ19jb250cm9sX2NvbmZpZ3VyYXRpb24gKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnNfc2V0X2RlZmF1bHQoYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnNfcGFjayhjb25zdCBiY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9uc191bnBhY2soYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9uc19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfcmFuZ2luZ19yc3NpX2NvbnRyb2wgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9yYW5naW5nX3Jzc2lfY29udHJvbF9zZXRfZGVmYXVsdChiY21vbHRfcmFuZ2luZ19yc3NpX2NvbnRyb2wgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfcmFuZ2luZ19yc3NpX2NvbnRyb2wgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9yYW5naW5nX3Jzc2lfY29udHJvbF9wYWNrKGNvbnN0IGJjbW9sdF9yYW5naW5nX3Jzc2lfY29udHJvbCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfcmFuZ2luZ19yc3NpX2NvbnRyb2wgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JhbmdpbmdfcnNzaV9jb250cm9sX3VucGFjayhiY21vbHRfcmFuZ2luZ19yc3NpX2NvbnRyb2wgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9yYW5naW5nX3Jzc2lfY29udHJvbCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9yYW5naW5nX3Jzc2lfY29udHJvbF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfcmFuZ2luZ19yc3NpX2NvbnRyb2wgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcmFuZ2luZ19yc3NpX2NvbnRyb2xfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9yYW5naW5nX3Jzc2lfY29udHJvbCAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXNfc2V0X2RlZmF1bHQoYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cyAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXNfcGFjayhjb25zdCBiY21vbHRfcmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1c191bnBhY2soYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cyBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1c19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cyAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXAgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXBfc2V0X2RlZmF1bHQoYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcCAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXAgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXBfcGFjayhjb25zdCBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXAgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcF91bnBhY2soYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXBfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcCBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcCAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXBfbGlzdF91MzJfbWF4Xzggc3RydWN0LiAgCisgKiBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXBfbGlzdF91MzJfbWF4Xzhfc2V0X2RlZmF1bHQoYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcF9saXN0X3UzMl9tYXhfOCAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXBfbGlzdF91MzJfbWF4XzggdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXBfbGlzdF91MzJfbWF4XzhfcGFjayhjb25zdCBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwX2xpc3RfdTMyX21heF84ICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXBfbGlzdF91MzJfbWF4Xzggd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwX2xpc3RfdTMyX21heF84X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXBfbGlzdF91MzJfbWF4XzggKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXBfbGlzdF91MzJfbWF4XzggZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcF9saXN0X3UzMl9tYXhfOF91bnBhY2soYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcF9saXN0X3UzMl9tYXhfOCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcF9saXN0X3UzMl9tYXhfOCBzdHJ1Y3QgCisgKiBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXBfbGlzdF91MzJfbWF4Xzhfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcF9saXN0X3UzMl9tYXhfOCAKKyAqIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcF9saXN0X3UzMl9tYXhfOF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcF9saXN0X3UzMl9tYXhfOCAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV9zZXRfZGVmYXVsdChiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobSAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV9wYWNrKGNvbnN0IGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG1fZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG0gKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3VucGFjayhiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG0gc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobSAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3Mgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3Nfc2V0X2RlZmF1bHQoYmNtb2x0X3JvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcyAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3NfcGFjayhjb25zdCBiY21vbHRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzc191bnBhY2soYmNtb2x0X3JvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3JvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3Nfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3JvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcyBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3JvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzc19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3JvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcyAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9zZXJkZXNfY29uZmlndXJhdGlvbiBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uX3NldF9kZWZhdWx0KGJjbW9sdF9zZXJkZXNfY29uZmlndXJhdGlvbiAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9zZXJkZXNfY29uZmlndXJhdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uX3BhY2soY29uc3QgYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9zZXJkZXNfY29uZmlndXJhdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfc2VyZGVzX2NvbmZpZ3VyYXRpb25fdW5wYWNrKGJjbW9sdF9zZXJkZXNfY29uZmlndXJhdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9zZXJkZXNfY29uZmlndXJhdGlvbiBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9zZXJkZXNfY29uZmlndXJhdGlvbl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3NlcmlhbF9udW1iZXIgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9zZXJpYWxfbnVtYmVyX3NldF9kZWZhdWx0KGJjbW9sdF9zZXJpYWxfbnVtYmVyICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3NlcmlhbF9udW1iZXIgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9zZXJpYWxfbnVtYmVyX3BhY2soY29uc3QgYmNtb2x0X3NlcmlhbF9udW1iZXIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3NlcmlhbF9udW1iZXIgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NlcmlhbF9udW1iZXJfdW5wYWNrKGJjbW9sdF9zZXJpYWxfbnVtYmVyICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfc2VyaWFsX251bWJlciBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9zZXJpYWxfbnVtYmVyX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9zZXJpYWxfbnVtYmVyIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NlcmlhbF9udW1iZXJfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9zZXJpYWxfbnVtYmVyICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3NvbGljaXRlZF9zY2hlZHVsZXIgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9zb2xpY2l0ZWRfc2NoZWR1bGVyX3NldF9kZWZhdWx0KGJjbW9sdF9zb2xpY2l0ZWRfc2NoZWR1bGVyICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3NvbGljaXRlZF9zY2hlZHVsZXIgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9zb2xpY2l0ZWRfc2NoZWR1bGVyX3BhY2soY29uc3QgYmNtb2x0X3NvbGljaXRlZF9zY2hlZHVsZXIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3NvbGljaXRlZF9zY2hlZHVsZXIgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NvbGljaXRlZF9zY2hlZHVsZXJfdW5wYWNrKGJjbW9sdF9zb2xpY2l0ZWRfc2NoZWR1bGVyICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfc29saWNpdGVkX3NjaGVkdWxlciBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9zb2xpY2l0ZWRfc2NoZWR1bGVyX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9zb2xpY2l0ZWRfc2NoZWR1bGVyIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NvbGljaXRlZF9zY2hlZHVsZXJfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9zb2xpY2l0ZWRfc2NoZWR1bGVyICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWcgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgCisgKiB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnX3NldF9kZWZhdWx0KGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWcgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnX3BhY2soY29uc3QgYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZ19nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZyAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWcgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWdfdW5wYWNrKGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWdfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3N0YXRfYWxhcm1fc29ha19jb25maWcgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9zdGF0X2FsYXJtX3NvYWtfY29uZmlnX3NldF9kZWZhdWx0KGJjbW9sdF9zdGF0X2FsYXJtX3NvYWtfY29uZmlnICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3N0YXRfYWxhcm1fc29ha19jb25maWcgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9zdGF0X2FsYXJtX3NvYWtfY29uZmlnX3BhY2soY29uc3QgYmNtb2x0X3N0YXRfYWxhcm1fc29ha19jb25maWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3N0YXRfYWxhcm1fc29ha19jb25maWcgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0YXRfYWxhcm1fc29ha19jb25maWdfdW5wYWNrKGJjbW9sdF9zdGF0X2FsYXJtX3NvYWtfY29uZmlnICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfc3RhdF9hbGFybV9zb2FrX2NvbmZpZyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9zdGF0X2FsYXJtX3NvYWtfY29uZmlnX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9zdGF0X2FsYXJtX3NvYWtfY29uZmlnIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0YXRfYWxhcm1fc29ha19jb25maWdfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9zdGF0X2FsYXJtX3NvYWtfY29uZmlnICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfc3RhdF9hbGFybV9jb25maWdfc2V0X2RlZmF1bHQoYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfc3RhdF9hbGFybV9jb25maWdfcGFjayhjb25zdCBiY21vbHRfc3RhdF9hbGFybV9jb25maWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB3b3VsZCBvY2N1cHkgb24gdGhlIAorICogd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZ191bnBhY2soYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfc3RhdF9hbGFybV9jb25maWcgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfc3RhdF9hbGFybV9jb25maWdfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfc3RhdF9hbGFybV9jb25maWcgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfc3RyXzEwMCBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3N0cl8xMDBfc2V0X2RlZmF1bHQoYmNtb2x0X3N0cl8xMDAgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfc3RyXzEwMCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0cl8xMDBfcGFjayhjb25zdCBiY21vbHRfc3RyXzEwMCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfc3RyXzEwMCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfc3RyXzEwMF91bnBhY2soYmNtb2x0X3N0cl8xMDAgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9zdHJfMTAwIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyAKKyAqIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0cl8xMDBfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3N0cl8xMDAgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfc3RyXzEwMF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3N0cl8xMDAgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfc3RyXzEwMDAgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9zdHJfMTAwMF9zZXRfZGVmYXVsdChiY21vbHRfc3RyXzEwMDAgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfc3RyXzEwMDAgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9zdHJfMTAwMF9wYWNrKGNvbnN0IGJjbW9sdF9zdHJfMTAwMCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfc3RyXzEwMDAgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0cl8xMDAwX3VucGFjayhiY21vbHRfc3RyXzEwMDAgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9zdHJfMTAwMCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgCisgKiBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9zdHJfMTAwMF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfc3RyXzEwMDAgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfc3RyXzEwMDBfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9zdHJfMTAwMCAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9zdHJfMjAwMCBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3N0cl8yMDAwX3NldF9kZWZhdWx0KGJjbW9sdF9zdHJfMjAwMCAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9zdHJfMjAwMCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0cl8yMDAwX3BhY2soY29uc3QgYmNtb2x0X3N0cl8yMDAwICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9zdHJfMjAwMCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfc3RyXzIwMDBfdW5wYWNrKGJjbW9sdF9zdHJfMjAwMCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3N0cl8yMDAwIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyAKKyAqIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0cl8yMDAwX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9zdHJfMjAwMCBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9zdHJfMjAwMF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3N0cl8yMDAwICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3N0cl8yNTYgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9zdHJfMjU2X3NldF9kZWZhdWx0KGJjbW9sdF9zdHJfMjU2ICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3N0cl8yNTYgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9zdHJfMjU2X3BhY2soY29uc3QgYmNtb2x0X3N0cl8yNTYgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3N0cl8yNTYgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0cl8yNTZfdW5wYWNrKGJjbW9sdF9zdHJfMjU2ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfc3RyXzI1NiBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgCisgKiBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9zdHJfMjU2X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9zdHJfMjU2IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0cl8yNTZfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9zdHJfMjU2ICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3N0cl82NCBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9zdHJfNjRfc2V0X2RlZmF1bHQoYmNtb2x0X3N0cl82NCAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9zdHJfNjQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9zdHJfNjRfcGFjayhjb25zdCBiY21vbHRfc3RyXzY0ICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9zdHJfNjQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N0cl82NF91bnBhY2soYmNtb2x0X3N0cl82NCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3N0cl82NCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgCisgKiBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9zdHJfNjRfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3N0cl82NCBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9zdHJfNjRfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9zdHJfNjQgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfc3dfZXJyb3Igc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF9zd19lcnJvcl9zZXRfZGVmYXVsdChiY21vbHRfc3dfZXJyb3IgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfc3dfZXJyb3IgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9zd19lcnJvcl9wYWNrKGNvbnN0IGJjbW9sdF9zd19lcnJvciAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfc3dfZXJyb3IgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N3X2Vycm9yX3VucGFjayhiY21vbHRfc3dfZXJyb3IgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9zd19lcnJvciBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgCisgKiBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9zd19lcnJvcl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfc3dfZXJyb3IgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfc3dfZXJyb3JfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9zd19lcnJvciAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9zeXN0ZW1fcHJvZmlsZSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3N5c3RlbV9wcm9maWxlX3NldF9kZWZhdWx0KGJjbW9sdF9zeXN0ZW1fcHJvZmlsZSAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9zeXN0ZW1fcHJvZmlsZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N5c3RlbV9wcm9maWxlX3BhY2soY29uc3QgYmNtb2x0X3N5c3RlbV9wcm9maWxlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9zeXN0ZW1fcHJvZmlsZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfc3lzdGVtX3Byb2ZpbGVfdW5wYWNrKGJjbW9sdF9zeXN0ZW1fcHJvZmlsZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3N5c3RlbV9wcm9maWxlIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3N5c3RlbV9wcm9maWxlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9zeXN0ZW1fcHJvZmlsZSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9zeXN0ZW1fcHJvZmlsZV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3N5c3RlbV9wcm9maWxlICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3RyeF9kZWxpbWl0ZXIgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF90cnhfZGVsaW1pdGVyX3NldF9kZWZhdWx0KGJjbW9sdF90cnhfZGVsaW1pdGVyICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3RyeF9kZWxpbWl0ZXIgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF90cnhfZGVsaW1pdGVyX3BhY2soY29uc3QgYmNtb2x0X3RyeF9kZWxpbWl0ZXIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3RyeF9kZWxpbWl0ZXIgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9kZWxpbWl0ZXJfdW5wYWNrKGJjbW9sdF90cnhfZGVsaW1pdGVyICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfdHJ4X2RlbGltaXRlciBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF90cnhfZGVsaW1pdGVyX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF90cnhfZGVsaW1pdGVyIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9kZWxpbWl0ZXJfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF90cnhfZGVsaW1pdGVyICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0IHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfdHJ4X2VuZXJneV9kZXRlY3Rfc2V0X2RlZmF1bHQoYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0ICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2VuZXJneV9kZXRlY3RfcGFjayhjb25zdCBiY21vbHRfdHJ4X2VuZXJneV9kZXRlY3QgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF90cnhfZW5lcmd5X2RldGVjdF91bnBhY2soYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfdHJ4X2VuZXJneV9kZXRlY3Qgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2VuZXJneV9kZXRlY3Rfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfdHJ4X2VuZXJneV9kZXRlY3QgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfdHJ4X3ByZWFtYmxlIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgCisgKiB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfdHJ4X3ByZWFtYmxlX3NldF9kZWZhdWx0KGJjbW9sdF90cnhfcHJlYW1ibGUgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfdHJ4X3ByZWFtYmxlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X3ByZWFtYmxlX3BhY2soY29uc3QgYmNtb2x0X3RyeF9wcmVhbWJsZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfdHJ4X3ByZWFtYmxlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF90cnhfcHJlYW1ibGVfdW5wYWNrKGJjbW9sdF90cnhfcHJlYW1ibGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF90cnhfcHJlYW1ibGUgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X3ByZWFtYmxlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF90cnhfcHJlYW1ibGUgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X3ByZWFtYmxlX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfdHJ4X3ByZWFtYmxlICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3RyeF9yeF9jb25maWd1cmF0aW9uIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfdHJ4X3J4X2NvbmZpZ3VyYXRpb25fc2V0X2RlZmF1bHQoYmNtb2x0X3RyeF9yeF9jb25maWd1cmF0aW9uICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3RyeF9yeF9jb25maWd1cmF0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X3J4X2NvbmZpZ3VyYXRpb25fcGFjayhjb25zdCBiY21vbHRfdHJ4X3J4X2NvbmZpZ3VyYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3RyeF9yeF9jb25maWd1cmF0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF90cnhfcnhfY29uZmlndXJhdGlvbl91bnBhY2soYmNtb2x0X3RyeF9yeF9jb25maWd1cmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfdHJ4X3J4X2NvbmZpZ3VyYXRpb24gc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X3J4X2NvbmZpZ3VyYXRpb25fc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3RyeF9yeF9jb25maWd1cmF0aW9uIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9yeF9jb25maWd1cmF0aW9uX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfdHJ4X3J4X2NvbmZpZ3VyYXRpb24gKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfdTMyX2xpc3RfdTMyX21heF81MDBfaGV4IHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfdTMyX2xpc3RfdTMyX21heF81MDBfaGV4X3NldF9kZWZhdWx0KGJjbW9sdF91MzJfbGlzdF91MzJfbWF4XzUwMF9oZXggKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfdTMyX2xpc3RfdTMyX21heF81MDBfaGV4IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdTMyX2xpc3RfdTMyX21heF81MDBfaGV4X3BhY2soY29uc3QgYmNtb2x0X3UzMl9saXN0X3UzMl9tYXhfNTAwX2hleCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3UzMl9saXN0X3UzMl9tYXhfNTAwX2hleCB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3UzMl9saXN0X3UzMl9tYXhfNTAwX2hleF9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfdTMyX2xpc3RfdTMyX21heF81MDBfaGV4ICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfdTMyX2xpc3RfdTMyX21heF81MDBfaGV4IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF91MzJfbGlzdF91MzJfbWF4XzUwMF9oZXhfdW5wYWNrKGJjbW9sdF91MzJfbGlzdF91MzJfbWF4XzUwMF9oZXggKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF91MzJfbGlzdF91MzJfbWF4XzUwMF9oZXggc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdTMyX2xpc3RfdTMyX21heF81MDBfaGV4X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF91MzJfbGlzdF91MzJfbWF4XzUwMF9oZXggaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdTMyX2xpc3RfdTMyX21heF81MDBfaGV4X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfdTMyX2xpc3RfdTMyX21heF81MDBfaGV4ICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3U4X2xpc3RfdTE2X2hleCBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3U4X2xpc3RfdTE2X2hleF9zZXRfZGVmYXVsdChiY21vbHRfdThfbGlzdF91MTZfaGV4ICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3U4X2xpc3RfdTE2X2hleCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3U4X2xpc3RfdTE2X2hleF9wYWNrKGNvbnN0IGJjbW9sdF91OF9saXN0X3UxNl9oZXggKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF91OF9saXN0X3UxNl9oZXggd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF91OF9saXN0X3UxNl9oZXhfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3U4X2xpc3RfdTE2X2hleCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3U4X2xpc3RfdTE2X2hleCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdThfbGlzdF91MTZfaGV4X3VucGFjayhiY21vbHRfdThfbGlzdF91MTZfaGV4ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfdThfbGlzdF91MTZfaGV4IHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3U4X2xpc3RfdTE2X2hleF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfdThfbGlzdF91MTZfaGV4IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3U4X2xpc3RfdTE2X2hleF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3U4X2xpc3RfdTE2X2hleCAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF91OF9saXN0X3UzMiBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3U4X2xpc3RfdTMyX3NldF9kZWZhdWx0KGJjbW9sdF91OF9saXN0X3UzMiAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF91OF9saXN0X3UzMiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3U4X2xpc3RfdTMyX3BhY2soY29uc3QgYmNtb2x0X3U4X2xpc3RfdTMyICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfdThfbGlzdF91MzIgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfdThfbGlzdF91MzJfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3U4X2xpc3RfdTMyICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfdThfbGlzdF91MzIgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3U4X2xpc3RfdTMyX3VucGFjayhiY21vbHRfdThfbGlzdF91MzIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF91OF9saXN0X3UzMiBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF91OF9saXN0X3UzMl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfdThfbGlzdF91MzIgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdThfbGlzdF91MzJfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF91OF9saXN0X3UzMiAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OCBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4X3NldF9kZWZhdWx0KGJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OCAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4X3BhY2soY29uc3QgYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4ICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDggd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OF9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDggKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDhfdW5wYWNrKGJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4IHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OCBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4ICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3ViZF9pbmZvIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgCisgKiB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfdWJkX2luZm9fc2V0X2RlZmF1bHQoYmNtb2x0X3ViZF9pbmZvICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3ViZF9pbmZvIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdWJkX2luZm9fcGFjayhjb25zdCBiY21vbHRfdWJkX2luZm8gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3ViZF9pbmZvIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF91YmRfaW5mb191bnBhY2soYmNtb2x0X3ViZF9pbmZvICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfdWJkX2luZm8gc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIAorICogYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdWJkX2luZm9fc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3ViZF9pbmZvIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3ViZF9pbmZvX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfdWJkX2luZm8gKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfdXBzdHJlYW1fYmFuZHdpZHRoX2Rpc3RyaWJ1dGlvbiBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb25fc2V0X2RlZmF1bHQoYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb24gKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfdXBzdHJlYW1fYmFuZHdpZHRoX2Rpc3RyaWJ1dGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb25fcGFjayhjb25zdCBiY21vbHRfdXBzdHJlYW1fYmFuZHdpZHRoX2Rpc3RyaWJ1dGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfdXBzdHJlYW1fYmFuZHdpZHRoX2Rpc3RyaWJ1dGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdXBzdHJlYW1fYmFuZHdpZHRoX2Rpc3RyaWJ1dGlvbl91bnBhY2soYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF91cHN0cmVhbV9iYW5kd2lkdGhfZGlzdHJpYnV0aW9uIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb25fc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb24gaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF91cHN0cmVhbV9iYW5kd2lkdGhfZGlzdHJpYnV0aW9uX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfdXBzdHJlYW1fYmFuZHdpZHRoX2Rpc3RyaWJ1dGlvbiAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF92bGFuX3RhZyBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3ZsYW5fdGFnX3NldF9kZWZhdWx0KGJjbW9sdF92bGFuX3RhZyAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF92bGFuX3RhZyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3ZsYW5fdGFnX3BhY2soY29uc3QgYmNtb2x0X3ZsYW5fdGFnICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF92bGFuX3RhZyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdmxhbl90YWdfdW5wYWNrKGJjbW9sdF92bGFuX3RhZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3ZsYW5fdGFnIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyAKKyAqIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3ZsYW5fdGFnX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF92bGFuX3RhZyBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF92bGFuX3RhZ19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3ZsYW5fdGFnICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGUgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfdW5wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fYWxsb2Nfd2l0aF9zdGF0ZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyIHN0cnVjdC4gIFRoaXMgCisgKiBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzJfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzJfcGFjayhjb25zdCBiY21vbHRfeGdwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMiAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMl91bnBhY2soYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzIgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzJfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyIGlzIAorICogb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzJfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMiAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9lZF9zdGF0ZSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2VkX3N0YXRlX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9lZF9zdGF0ZSAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9lZF9zdGF0ZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2VkX3N0YXRlX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX2VkX3N0YXRlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9lZF9zdGF0ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZWRfc3RhdGVfdW5wYWNrKGJjbW9sdF94Z3Bvbl9lZF9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX2VkX3N0YXRlIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2VkX3N0YXRlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9lZF9zdGF0ZSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9lZF9zdGF0ZV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX2VkX3N0YXRlICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNiBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNl9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2ICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNl9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTYgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTYgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTZfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNiAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2X3VucGFjayhiY21vbHRfeGdwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2IHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2IGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2ICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGUgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgCisgKiB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfdW5wYWNrKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCBzdHJ1Y3QuICAKKyAqIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOF9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4ICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOF9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjggKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjhfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4X3VucGFjayhiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4IHN0cnVjdCAKKyAqIGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4IAorICogaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4ICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1NiBzdHJ1Y3QuICAKKyAqIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1Nl9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2ICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1NiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1Nl9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTYgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1NiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTZfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1NiAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1NiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2X3VucGFjayhiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2IHN0cnVjdCAKKyAqIGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1Nl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2IAorICogaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2ICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX2tleV9leGNoYW5nZSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2tleV9leGNoYW5nZV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fa2V5X2V4Y2hhbmdlICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX2tleV9leGNoYW5nZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2tleV9leGNoYW5nZV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9rZXlfZXhjaGFuZ2UgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX2tleV9leGNoYW5nZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fa2V5X2V4Y2hhbmdlX3VucGFjayhiY21vbHRfeGdwb25fa2V5X2V4Y2hhbmdlICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fa2V5X2V4Y2hhbmdlIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2tleV9leGNoYW5nZV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fa2V5X2V4Y2hhbmdlIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2tleV9leGNoYW5nZV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX2tleV9leGNoYW5nZSAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9tdWx0aWNhc3Rfa2V5IHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fbXVsdGljYXN0X2tleV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbXVsdGljYXN0X2tleSAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9tdWx0aWNhc3Rfa2V5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbXVsdGljYXN0X2tleV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9tdWx0aWNhc3Rfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9tdWx0aWNhc3Rfa2V5IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9tdWx0aWNhc3Rfa2V5X3VucGFjayhiY21vbHRfeGdwb25fbXVsdGljYXN0X2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX211bHRpY2FzdF9rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbXVsdGljYXN0X2tleV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fbXVsdGljYXN0X2tleSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9tdWx0aWNhc3Rfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fbXVsdGljYXN0X2tleSAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9uaV9kZWJ1ZyBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX25pX2RlYnVnX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9uaV9kZWJ1ZyAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9kZWJ1ZyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2RlYnVnX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX25pX2RlYnVnICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9kZWJ1ZyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfZGVidWdfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9kZWJ1ZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX25pX2RlYnVnIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2RlYnVnX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9uaV9kZWJ1ZyBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9kZWJ1Z19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX25pX2RlYnVnICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX29udV9hY3RpdmF0aW9uIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fb251X2FjdGl2YXRpb25fc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9hY3RpdmF0aW9uICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9hY3RpdmF0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2FjdGl2YXRpb25fcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X2FjdGl2YXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9hY3RpdmF0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfYWN0aXZhdGlvbl91bnBhY2soYmNtb2x0X3hncG9uX29udV9hY3RpdmF0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fb251X2FjdGl2YXRpb24gc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2FjdGl2YXRpb25fc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX29udV9hY3RpdmF0aW9uIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9hY3RpdmF0aW9uX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X2FjdGl2YXRpb24gKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fb251X2Flc19rZXkgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfYWVzX2tleV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X2Flc19rZXkgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X2Flc19rZXkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfYWVzX2tleV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfYWVzX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X2Flc19rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9hZXNfa2V5X3VucGFjayhiY21vbHRfeGdwb25fb251X2Flc19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfYWVzX2tleSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfYWVzX2tleV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fb251X2Flc19rZXkgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2Flc19rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfYWVzX2tleSAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGUgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGVfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZSAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGVfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZV91bnBhY2soYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGVfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGVfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGUgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fb251X2FsYXJtcyBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9hbGFybXNfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9hbGFybXMgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X2FsYXJtcyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9hbGFybXNfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X2FsYXJtcyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X2FsYXJtcyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2FsYXJtc191bnBhY2soYmNtb2x0X3hncG9uX29udV9hbGFybXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9hbGFybXNfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX29udV9hbGFybXMgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2FsYXJtc19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9hbGFybXMgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fb251X2FsYXJtc190aHJlc2hvbGRzIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fb251X2FsYXJtc190aHJlc2hvbGRzX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X2FsYXJtc190aHJlc2hvbGRzIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2FsYXJtc190aHJlc2hvbGRzX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9hbGFybXNfdGhyZXNob2xkcyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X2FsYXJtc190aHJlc2hvbGRzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHNfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2FsYXJtc190aHJlc2hvbGRzX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHNfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fb251X2VxZCBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9lcWRfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9lcWQgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X2VxZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9lcWRfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X2VxZCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X2VxZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2VxZF91bnBhY2soYmNtb2x0X3hncG9uX29udV9lcWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfZXFkIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9lcWRfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX29udV9lcWQgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2VxZF9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9lcWQgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fb251X2VxZF9saXN0X3UzMiBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9lcWRfbGlzdF91MzJfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9lcWRfbGlzdF91MzIgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X2VxZF9saXN0X3UzMiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9lcWRfbGlzdF91MzJfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X2VxZF9saXN0X3UzMiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX29udV9lcWRfbGlzdF91MzIgd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfZXFkX2xpc3RfdTMyX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfZXFkX2xpc3RfdTMyICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X2VxZF9saXN0X3UzMiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2VxZF9saXN0X3UzMl91bnBhY2soYmNtb2x0X3hncG9uX29udV9lcWRfbGlzdF91MzIgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfZXFkX2xpc3RfdTMyIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9lcWRfbGlzdF91MzJfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX29udV9lcWRfbGlzdF91MzIgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2VxZF9saXN0X3UzMl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9lcWRfbGlzdF91MzIgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9rZXlzIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9rZXlzX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXMgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9rZXlzIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9rZXlzX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25fa2V5cyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9rZXlzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXNfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXMgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXMgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9rZXlzX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXMgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXNfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXMgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGUgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGUgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlX3VucGFjayhiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGUgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGUgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGVfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZSAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfNTEwIHN0cnVjdC4gIFRoaXMgCisgKiBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzUxMF9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzUxMCAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfNTEwIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzUxMF9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfNTEwICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzUxMCAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF81MTBfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF81MTAgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfNTEwIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfNTEwX3VucGFjayhiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzUxMCAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF81MTAgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzUxMF9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzUxMCBpcyAKKyAqIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF81MTBfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfNTEwICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fcGxvYW1faGFuZGxpbmdfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fcGxvYW1faGFuZGxpbmdfcGFjayhjb25zdCBiY21vbHRfeGdwb25fcGxvYW1faGFuZGxpbmcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9wbG9hbV9oYW5kbGluZ191bnBhY2soYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fcGxvYW1faGFuZGxpbmcgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fcGxvYW1faGFuZGxpbmdfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fcGxvYW1faGFuZGxpbmcgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmcgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmcgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmcgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmcgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3VucGFjayhiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmcgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWdfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWdfcGFjayhjb25zdCBiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1Z191bnBhY2soYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWcgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWdfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWdfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1ZyAqdGhpcyk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWcgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgCisgKiB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWdfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX3Jzc2lfbm9ybWFsX2NvbmZpZyAqdGhpcyk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWcgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWdfcGFjayhjb25zdCBiY21vbHRfeGdwb25fcnNzaV9ub3JtYWxfY29uZmlnICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWcgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3Jzc2lfbm9ybWFsX2NvbmZpZ191bnBhY2soYmNtb2x0X3hncG9uX3Jzc2lfbm9ybWFsX2NvbmZpZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX3Jzc2lfbm9ybWFsX2NvbmZpZyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWdfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX3Jzc2lfbm9ybWFsX2NvbmZpZyBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWdfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWcgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fcnNzaV9yYW5naW5nX2NvbmZpZyBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX3Jzc2lfcmFuZ2luZ19jb25maWdfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX3Jzc2lfcmFuZ2luZ19jb25maWcgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fcnNzaV9yYW5naW5nX2NvbmZpZyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3Jzc2lfcmFuZ2luZ19jb25maWdfcGFjayhjb25zdCBiY21vbHRfeGdwb25fcnNzaV9yYW5naW5nX2NvbmZpZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fcnNzaV9yYW5naW5nX2NvbmZpZyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fcnNzaV9yYW5naW5nX2NvbmZpZ191bnBhY2soYmNtb2x0X3hncG9uX3Jzc2lfcmFuZ2luZ19jb25maWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9yc3NpX3JhbmdpbmdfY29uZmlnIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3Jzc2lfcmFuZ2luZ19jb25maWdfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX3Jzc2lfcmFuZ2luZ19jb25maWcgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fcnNzaV9yYW5naW5nX2NvbmZpZ19ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX3Jzc2lfcmFuZ2luZ19jb25maWcgKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4gKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX3J4X3Jhbmdpbmdfc21fcGF0dGVybiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm5fdW5wYWNrKGJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4gc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4gaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm5fYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4gKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fc2VyZGVzX2NvbmZpZ3VyYXRpb24gc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9zZXJkZXNfY29uZmlndXJhdGlvbl9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fc2VyZGVzX2NvbmZpZ3VyYXRpb24gKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fc2VyZGVzX2NvbmZpZ3VyYXRpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9zZXJkZXNfY29uZmlndXJhdGlvbl9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9zZXJkZXNfY29uZmlndXJhdGlvbiAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fc2VyZGVzX2NvbmZpZ3VyYXRpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3NlcmRlc19jb25maWd1cmF0aW9uX3VucGFjayhiY21vbHRfeGdwb25fc2VyZGVzX2NvbmZpZ3VyYXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9zZXJkZXNfY29uZmlndXJhdGlvbiBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9zZXJkZXNfY29uZmlndXJhdGlvbl9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fc2VyZGVzX2NvbmZpZ3VyYXRpb24gaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9zZXJkZXNfY29uZmlndXJhdGlvbl9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX3NlcmRlc19jb25maWd1cmF0aW9uICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX3NuX2FjcXVpc2l0aW9uIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fc25fYWNxdWlzaXRpb25fc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX3NuX2FjcXVpc2l0aW9uICp0aGlzKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX3NuX2FjcXVpc2l0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fc25fYWNxdWlzaXRpb25fcGFjayhjb25zdCBiY21vbHRfeGdwb25fc25fYWNxdWlzaXRpb24gKnRoaXMsIGJjbW9sdF9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX3NuX2FjcXVpc2l0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9zbl9hY3F1aXNpdGlvbl91bnBhY2soYmNtb2x0X3hncG9uX3NuX2FjcXVpc2l0aW9uICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fc25fYWNxdWlzaXRpb24gc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fc25fYWNxdWlzaXRpb25fc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX3NuX2FjcXVpc2l0aW9uIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3NuX2FjcXVpc2l0aW9uX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fc25fYWNxdWlzaXRpb24gKnRoaXMpOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fdHJ4X2RlYnVnIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fdHJ4X2RlYnVnX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl90cnhfZGVidWcgKnRoaXMpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fdHJ4X2RlYnVnIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fdHJ4X2RlYnVnX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX3RyeF9kZWJ1ZyAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fdHJ4X2RlYnVnIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl90cnhfZGVidWdfdW5wYWNrKGJjbW9sdF94Z3Bvbl90cnhfZGVidWcgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl90cnhfZGVidWcgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fdHJ4X2RlYnVnX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl90cnhfZGVidWcgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fdHJ4X2RlYnVnX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fdHJ4X2RlYnVnICp0aGlzKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2FlX25pX2tleSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2FlX25pX2tleV9zZXRfZGVmYXVsdChiY21vbHRfYWVfbmlfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9hZV9uaV9rZXkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9uaV9rZXlfcGFjayhjb25zdCBiY21vbHRfYWVfbmlfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2FlX25pX2tleSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9hZV9uaV9rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2FlX25pX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9hZV9uaV9rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX25pX2tleV91bnBhY2soYmNtb2x0X2FlX25pX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9hZV9uaV9rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIAorICogYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfbmlfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfYWVfbmlfa2V5IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX25pX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2FlX25pX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9hZV9uaV9rZXlfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2FlX25pX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgCisgKiB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfYWVfbmlfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2FlX25pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9hZV9uaV9jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX25pX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2FlX25pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2FlX25pX2NmZ19kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgCisgKiB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfYWVfbmlfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2FlX25pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2FlX25pX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9uaV9jZmdfZGF0YV91bnBhY2soYmNtb2x0X2FlX25pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2FlX25pX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX25pX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfYWVfbmlfY2ZnX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfbmlfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9hZV9uaV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9hZV9uaV9jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfZGF0YV91bnBhY2soYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfYWVfcGF0aF9kc19rZXkgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9hZV9wYXRoX2RzX2tleV9zZXRfZGVmYXVsdChiY21vbHRfYWVfcGF0aF9kc19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2FlX3BhdGhfZHNfa2V5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF9kc19rZXlfcGFjayhjb25zdCBiY21vbHRfYWVfcGF0aF9kc19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfYWVfcGF0aF9kc19rZXkgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9hZV9wYXRoX2RzX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfYWVfcGF0aF9kc19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfYWVfcGF0aF9kc19rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfZHNfa2V5X3VucGFjayhiY21vbHRfYWVfcGF0aF9kc19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfYWVfcGF0aF9kc19rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF9kc19rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9hZV9wYXRoX2RzX2tleSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2FlX3BhdGhfZHNfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2FlX3BhdGhfZHNfa2V5X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGFfdW5wYWNrKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgCisgKiB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2RhdGEgd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfZGF0YV91bnBhY2soYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyAKKyAqIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3VucGFjayhiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGlzIG91dCAKKyAqIG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgCisgKiBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3VucGFjayhiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgaXMgb3V0IAorICogb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19kYXRhIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmdfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfYWVfcGF0aF91c19rZXkgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9hZV9wYXRoX3VzX2tleV9zZXRfZGVmYXVsdChiY21vbHRfYWVfcGF0aF91c19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2FlX3BhdGhfdXNfa2V5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF91c19rZXlfcGFjayhjb25zdCBiY21vbHRfYWVfcGF0aF91c19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfYWVfcGF0aF91c19rZXkgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9hZV9wYXRoX3VzX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfYWVfcGF0aF91c19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfYWVfcGF0aF91c19rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfa2V5X3VucGFjayhiY21vbHRfYWVfcGF0aF91c19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfYWVfcGF0aF91c19rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF91c19rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9hZV9wYXRoX3VzX2tleSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2FlX3BhdGhfdXNfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2FlX3BhdGhfdXNfa2V5X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGFfdW5wYWNrKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgCisgKiB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2RhdGEgd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfZGF0YV91bnBhY2soYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyAKKyAqIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3VucGFjayhiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGlzIG91dCAKKyAqIG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgCisgKiBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3VucGFjayhiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgaXMgb3V0IAorICogb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19kYXRhIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfY2hhbm5lbF9rZXkgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9jaGFubmVsX2tleV9zZXRfZGVmYXVsdChiY21vbHRfY2hhbm5lbF9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2NoYW5uZWxfa2V5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfY2hhbm5lbF9rZXlfcGFjayhjb25zdCBiY21vbHRfY2hhbm5lbF9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfY2hhbm5lbF9rZXkgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfY2hhbm5lbF9rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2NoYW5uZWxfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2NoYW5uZWxfa2V5IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9jaGFubmVsX2tleV91bnBhY2soYmNtb2x0X2NoYW5uZWxfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2NoYW5uZWxfa2V5IHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2NoYW5uZWxfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfY2hhbm5lbF9rZXkgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfY2hhbm5lbF9rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9jaGFubmVsX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9jaGFubmVsX2tleV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfY2hhbm5lbF9jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2NoYW5uZWxfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2NoYW5uZWxfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2NoYW5uZWxfY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9jaGFubmVsX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2NoYW5uZWxfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfY2hhbm5lbF9jZmdfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIAorICogd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2NoYW5uZWxfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2NoYW5uZWxfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfY2hhbm5lbF9jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfY2hhbm5lbF9jZmdfZGF0YV91bnBhY2soYmNtb2x0X2NoYW5uZWxfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfY2hhbm5lbF9jZmdfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9jaGFubmVsX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfY2hhbm5lbF9jZmdfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9jaGFubmVsX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfY2hhbm5lbF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9jaGFubmVsX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZGVidWdfa2V5IHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgCisgKiB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZGVidWdfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF9kZWJ1Z19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RlYnVnX2tleSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2tleV9wYWNrKGNvbnN0IGJjbW9sdF9kZWJ1Z19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZGVidWdfa2V5IHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2RlYnVnX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZGVidWdfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2RlYnVnX2tleSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfa2V5X3VucGFjayhiY21vbHRfZGVidWdfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2RlYnVnX2tleSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgCisgKiBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9kZWJ1Z19rZXkgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZGVidWdfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2RlYnVnX2tleV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZGVidWdfY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9kZWJ1Z19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZGVidWdfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RlYnVnX2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZGVidWdfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZGVidWdfY2ZnX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9kZWJ1Z19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZGVidWdfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGVidWdfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZGVidWdfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZGVidWdfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9kZWJ1Z19jZmdfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2RlYnVnX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2RlYnVnX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZGVidWdfY2xpX291dHB1dF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZGVidWdfY2xpX291dHB1dF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZGVidWdfY2xpX291dHB1dF9kYXRhIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZGVidWdfY2xpX291dHB1dF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGVidWdfY2xpX291dHB1dF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2RhdGFfdW5wYWNrKGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZGVidWdfY2xpX291dHB1dF9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZGVidWdfY2xpX291dHB1dF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZGVidWdfYXV0b19jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZGVidWdfYXV0b19jZmdfZGF0YSB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGVidWdfYXV0b19jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfYXV0b19jZmdfZGF0YV91bnBhY2soYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZGVidWdfYXV0b19jZmdfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZGVidWdfYXV0b19jZmdfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZGVidWdfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZGVidWdfY2xpX2lucHV0X2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZGVidWdfY2xpX2lucHV0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfY2xpX2lucHV0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfZGVidWdfY2xpX2lucHV0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZGVidWdfY2xpX2lucHV0X2RhdGEgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZGVidWdfY2xpX2lucHV0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGVidWdfY2xpX2lucHV0X2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9kYXRhX3VucGFjayhiY21vbHRfZGVidWdfY2xpX2lucHV0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZGVidWdfY2xpX2lucHV0X2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGVidWdfY2xpX2lucHV0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZGV2aWNlX2tleSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2RldmljZV9rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2RldmljZV9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RldmljZV9rZXkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2Vfa2V5X3BhY2soY29uc3QgYmNtb2x0X2RldmljZV9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZGV2aWNlX2tleSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9kZXZpY2Vfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9kZXZpY2Vfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2RldmljZV9rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9rZXlfdW5wYWNrKGJjbW9sdF9kZXZpY2Vfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2RldmljZV9rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2tleV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2RldmljZV9rZXkgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2RldmljZV9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZGV2aWNlX2tleV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZGV2aWNlX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZGV2aWNlX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RldmljZV9jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZGV2aWNlX2NmZ19kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgCisgKiB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZGV2aWNlX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGV2aWNlX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZGV2aWNlX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2RldmljZV9jZmdfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZGV2aWNlX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfZGF0YV91bnBhY2soYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfZGF0YV91bnBhY2soYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfZGF0YV91bnBhY2soYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9kYXRhX3VucGFjayhiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgCisgKiB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGEgd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfZGF0YV91bnBhY2soYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgCisgKiBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2RhdGFfdW5wYWNrKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9kYXRhIGlzIG91dCAKKyAqIG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2RhdGFfdW5wYWNrKGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RldmljZV9zd19lcnJvcl9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2RhdGEgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9zd19lcnJvcl9kYXRhX3VucGFjayhiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2RldmljZV9zd19lcnJvcl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2RldmljZV9zd19lcnJvcl9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25fZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25fZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9kYXRhIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2RhdGFfdW5wYWNrKGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25fZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25fZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RldmljZV9hdXRvX2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2RldmljZV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2RldmljZV9hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2RhdGFfdW5wYWNrKGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9kYXRhX3VucGFjayhiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfZGF0YV91bnBhY2soYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZGV2aWNlX3Jlc2V0X2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9kZXZpY2VfcmVzZXRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZGV2aWNlX3Jlc2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RldmljZV9yZXNldF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX3Jlc2V0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfZGV2aWNlX3Jlc2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZGV2aWNlX3Jlc2V0X2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9kZXZpY2VfcmVzZXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZGV2aWNlX3Jlc2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGV2aWNlX3Jlc2V0X2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9yZXNldF9kYXRhX3VucGFjayhiY21vbHRfZGV2aWNlX3Jlc2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZGV2aWNlX3Jlc2V0X2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZGV2aWNlX3Jlc2V0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9kZXZpY2VfcmVzZXRfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfcmVzZXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2RldmljZV9yZXNldF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2RldmljZV9yZXNldF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9kYXRhIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2RhdGFfdW5wYWNrKGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXlfcGFjayhjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5X3VucGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fZGF0YSBzdHJ1Y3QuICAKKyAqIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fZGF0YSAKKyAqIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgCisgKiBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25faWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9kYXRhIHN0cnVjdC4gCisgKiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb25fZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb25fZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2RhdGEgCisgKiBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIAorICogYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9kYXRhIHN0cnVjdC4gIFRoaXMgCisgKiBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25fZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25fZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25fZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9kYXRhIHN0cnVjdCAKKyAqIGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9kYXRhIAorICogaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25fZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25faWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25fZGF0YSAKKyAqIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25fZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgCisgKiB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9kYXRhIAorICogc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25fZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgCisgKiBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25fZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9kYXRhIHN0cnVjdC4gIFRoaXMgCisgKiBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25fZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25fZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25fZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9kYXRhIGlzIAorICogb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25fZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25faWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2RhdGEgc3RydWN0LiAgVGhpcyAKKyAqIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25fZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2RhdGEgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25fZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2RhdGEgaXMgCisgKiBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2RhdGEgc3RydWN0LiAKKyAqICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25fZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25fZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIAorICogd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25fZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25fZGF0YSAKKyAqIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25fZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgCisgKiBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25faWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9kYXRhIHN0cnVjdC4gIAorICogVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9kYXRhIAorICogc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSAKKyAqIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2RhdGEgc3RydWN0LiAgCisgKiBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb25fZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb25fZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb25fZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2RhdGEgCisgKiBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIAorICogYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25fZGF0YSAKKyAqIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbl9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25fZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbl9kYXRhIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbl9kYXRhIGZyb20gCisgKiBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbl9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCAKKyAqIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25fZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25fZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgCisgKiBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25faWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9saW5rX2tleSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbGlua19rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbGlua19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19rZXkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfa2V5X3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9saW5rX2tleSB3b3VsZCBvY2N1cHkgb24gdGhlIAorICogd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbGlua19rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fbGlua19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2tleSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2tleV91bnBhY2soYmNtb2x0X2Vwb25fbGlua19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9saW5rX2tleSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9saW5rX2tleSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9saW5rX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfZGF0YSB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfZGF0YSAKKyAqIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9kYXRhIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9kYXRhIGZyb20gCisgKiBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCAKKyAqIGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgCisgKiBiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyAKKyAqIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2RhdGEgaXMgb3V0IAorICogb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgCisgKiBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfZGF0YSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfZGF0YSBpcyBvdXQgCisgKiBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0X2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIAorICogYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0X2RhdGEgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0X2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0X2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0X2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0X2RhdGEgaXMgb3V0IAorICogb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyAKKyAqIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfZGF0YSBpcyAKKyAqIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2RhdGEgc3RydWN0LiAgCisgKiBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2RhdGEgc3RydWN0IAorICogYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9kYXRhIAorICogaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhIHN0cnVjdC4gIFRoaXMgCisgKiBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhIHN0cnVjdCAKKyAqIGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkX2RhdGEgCisgKiBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgCisgKiBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfZGF0YSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfZGF0YSBpcyBvdXQgCisgKiBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIAorICogYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGlzIG91dCAKKyAqIG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgCisgKiB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEgd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyAKKyAqIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfZGF0YSBpcyBvdXQgCisgKiBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9kYXRhIHN0cnVjdC4gIFRoaXMgCisgKiBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9kYXRhIHN0cnVjdCAKKyAqIGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9kYXRhIAorICogaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIAorICogYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RhdGEgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RhdGEgaXMgb3V0IAorICogb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZV9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZV9kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZV9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZV9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fbmlfa2V5IHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgCisgKiB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9uaV9rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbmlfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX25pX2tleSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfa2V5X3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fbmlfa2V5IHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbmlfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX25pX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX25pX2tleSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9rZXlfdW5wYWNrKGJjbW9sdF9lcG9uX25pX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX25pX2tleSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2tleV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fbmlfa2V5IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9uaV9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9uaV9rZXlfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9uaV9jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIAorICogYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX25pX21wY3BfdGltZXN0YW1wX2NoYW5nZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGEgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX25pX21wY3BfdGltZXN0YW1wX2NoYW5nZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX25pX21wY3BfdGltZXN0YW1wX2NoYW5nZWRfZGF0YSBpcyBvdXQgCisgKiBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0c19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfZGF0YSB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0c19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0c19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0c19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIAorICogYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhIGlzIG91dCAKKyAqIG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhIHN0cnVjdC4gIFRoaXMgCisgKiBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhIHN0cnVjdCAKKyAqIGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSBpcyAKKyAqIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgCisgKiBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhIGlzIG91dCAKKyAqIG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YSB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9uaV9hZGRfbGlua19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX25pX2FkZF9saW5rX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2FkZF9saW5rX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9uaV9hZGRfbGlua19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfZGF0YSB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9uaV9hZGRfbGlua19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9hZGRfbGlua19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9uaV9hZGRfbGlua19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2FkZF9saW5rX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX25pX2FkZF9saW5rX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9hZGRfbGlua19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9uaV9hZGRfbGlua19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19kYXRhIHN0cnVjdC4gIFRoaXMgCisgKiBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19kYXRhIHN0cnVjdCAKKyAqIGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfZGF0YSBpcyAKKyAqIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YV9kYXRhIAorICogc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfZGF0YSB0byAKKyAqIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfZGF0YSB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfZGF0YSBmcm9tIAorICogYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgCisgKiBiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIAorICogYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YV9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW5fZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW5fZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW5fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyAKKyAqIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfZGF0YSBpcyBvdXQgCisgKiBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXlfdW5wYWNrKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19kYXRhIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmdfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgc3RydWN0LiAgVGhpcyAKKyAqIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgc3RydWN0IAorICogYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGlzIAorICogb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIHN0cnVjdC4gIFRoaXMgCisgKiBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgaXMgCisgKiBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX29udV8xZ191c19rZXkgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX29udV8xZ191c19rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5X3BhY2soY29uc3QgYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29udV8xZ191c19rZXkgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29udV8xZ191c19rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29udV8xZ191c19rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleV91bnBhY2soYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29udV8xZ191c19rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX29udV8xZ191c19rZXlfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29udV8xZ191c19jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19kYXRhIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19jZmdfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX29udV8xZ191c19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX29udV8xZ191c19jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgc3RydWN0LiAgVGhpcyAKKyAqIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBpcyAKKyAqIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIHN0cnVjdC4gIFRoaXMgCisgKiBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIGlzIAorICogb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXlfcGFjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5X3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIAorICogc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBzdHJ1Y3QgCisgKiBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAKKyAqIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgc3RydWN0LiAgVGhpcyAKKyAqIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgc3RydWN0IAorICogYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIGlzIAorICogb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXlfcGFjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5X3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIAorICogc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBzdHJ1Y3QgCisgKiBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAKKyAqIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgc3RydWN0LiAgVGhpcyAKKyAqIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgc3RydWN0IAorICogYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIGlzIAorICogb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5X3BhY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleV91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgCisgKiB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGEgd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZ19kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIAorICogc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBzdHJ1Y3QgCisgKiBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgaXMgCisgKiBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgc3RydWN0LiAgVGhpcyAKKyAqIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBpcyAKKyAqIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXlfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19kYXRhIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgc3RydWN0LiAgVGhpcyAKKyAqIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgc3RydWN0IAorICogYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGlzIAorICogb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIHN0cnVjdC4gIFRoaXMgCisgKiBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgaXMgCisgKiBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX3JwX2tleSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2Vwb25fcnBfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF9lcG9uX3JwX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9ycF9rZXkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3JwX2tleV9wYWNrKGNvbnN0IGJjbW9sdF9lcG9uX3JwX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX3JwX2tleSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX3JwX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9ycF9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9ycF9rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcnBfa2V5X3VucGFjayhiY21vbHRfZXBvbl9ycF9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9ycF9rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9ycF9rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX3JwX2tleSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3JwX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2Vwb25fcnBfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fcnBfa2V5X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9lcG9uX3JwX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZXBvbl9ycF9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZXBvbl9ycF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9ycF9jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcnBfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZXBvbl9ycF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX3JwX2NmZ19kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgCisgKiB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9ycF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZXBvbl9ycF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX3JwX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX3JwX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9ycF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX3JwX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcnBfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9lcG9uX3JwX2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fcnBfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9lcG9uX3JwX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2Vwb25fcnBfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncGlvX2tleSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwaW9fa2V5X3NldF9kZWZhdWx0KGJjbW9sdF9ncGlvX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bpb19rZXkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncGlvX2tleV9wYWNrKGNvbnN0IGJjbW9sdF9ncGlvX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncGlvX2tleSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncGlvX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bpb19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bpb19rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwaW9fa2V5X3VucGFjayhiY21vbHRfZ3Bpb19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bpb19rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIAorICogYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bpb19rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncGlvX2tleSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncGlvX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwaW9fa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwaW9fa2V5X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncGlvX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgCisgKiB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bpb19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bpb19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bpb19jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwaW9fY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bpb19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncGlvX2NmZ19kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgCisgKiB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bpb19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bpb19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncGlvX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncGlvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZ3Bpb19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncGlvX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwaW9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncGlvX2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwaW9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncGlvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwaW9fY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX2FsbG9jX2tleSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fYWxsb2Nfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2FsbG9jX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9hbGxvY19rZXkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX2tleV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2FsbG9jX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX2FsbG9jX2tleSB3b3VsZCBvY2N1cHkgb24gdGhlIAorICogd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fYWxsb2Nfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2FsbG9jX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2FsbG9jX2tleSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19rZXlfdW5wYWNrKGJjbW9sdF9ncG9uX2FsbG9jX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX2FsbG9jX2tleSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX2tleV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fYWxsb2Nfa2V5IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9hbGxvY19rZXlfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2RhdGEgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9hbGxvY19jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9kYXRhIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YSB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIAorICogc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSBzdHJ1Y3QgCisgKiBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgaXMgCisgKiBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEgc3RydWN0LiAgVGhpcyAKKyAqIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEgc3RydWN0IAorICogYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YSAKKyAqIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyAKKyAqIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGlzIG91dCAKKyAqIG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgCisgKiBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgaXMgb3V0IAorICogb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0c19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXlfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5X3VucGFjayhiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSBzdHJ1Y3QuICAKKyAqIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSBzdHJ1Y3QgCisgKiBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgCisgKiBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIAorICogc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBpcyAKKyAqIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIAorICogYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIGlzIAorICogb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGVfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGVfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGVfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGVfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGVfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGVfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX2l3Zl9rZXkgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX2l3Zl9rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25faXdmX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9pd2Zfa2V5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfa2V5X3BhY2soY29uc3QgYmNtb2x0X2dwb25faXdmX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX2l3Zl9rZXkgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9pd2Zfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9pd2Zfa2V5IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9rZXlfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9pd2Zfa2V5IHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2tleV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25faXdmX2tleSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9pd2Zfa2V5X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25faXdmX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIAorICogd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25faXdmX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25faXdmX2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2RhdGEgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3N0YXRfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19kYXRhIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3N0YXRfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3N0YXRfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25faXdmX3N0YXRfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIAorICogc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9kYXRhIGlzIAorICogb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19kYXRhIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5IHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5IHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXlfdW5wYWNrKGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5IHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXlfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfZGF0YV91bnBhY2soYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X3BhY2soY29uc3QgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleV91bnBhY2soYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXlfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgCisgKiBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2RhdGEgaXMgb3V0IAorICogb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X3BhY2soY29uc3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleV91bnBhY2soYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfZGF0YV91bnBhY2soYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyAKKyAqIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2RhdGEgaXMgb3V0IAorICogb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGEgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfZGF0YV91bnBhY2soYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXkgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXlfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXkgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5X3VucGFjayhiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX25pX2tleSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fbmlfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX25pX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9rZXkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2tleV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX25pX2tleSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX25pX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9uaV9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfa2V5X3VucGFjayhiY21vbHRfZ3Bvbl9uaV9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9uaV9rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX25pX2tleSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fbmlfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fbmlfa2V5X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgCisgKiB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fbmlfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIAorICogd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2RhdGEgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fbmlfbG9zX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX25pX2xvc19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX25pX2xvc19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX25pX2xvc19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9sb3NfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX2xvc19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fbmlfbG9zX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX25pX2xvc19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX25pX2xvc19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fbmlfbG9zX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfbG9zX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX25pX2xvc19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fbmlfbG9zX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9sb3NfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fbmlfbG9zX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9sb3NfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fbmlfbG9zX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9uaV9sb3NfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyAKKyAqIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSBpcyBvdXQgCisgKiBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGEgc3RydWN0LiAgCisgKiBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIAorICogd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSAKKyAqIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIAorICogYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhIAorICogc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YSB0byAKKyAqIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YSB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YSBmcm9tIAorICogYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCAKKyAqIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSAKKyAqIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhIAorICogc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGEgCisgKiBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSAKKyAqIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhIHN0cnVjdC4gIFRoaXMgCisgKiBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEgaXMgCisgKiBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhIAorICogc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGEgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGEgZnJvbSAKKyAqIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgCisgKiBiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgCisgKiBiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIAorICogYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSBpcyBvdXQgCisgKiBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyAKKyAqIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhIGlzIG91dCAKKyAqIG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIAorICogYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGEgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGEgaXMgb3V0IAorICogb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSAKKyAqIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2RhdGEgCisgKiBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSAKKyAqIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2RhdGEgdG8gCisgKiBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIAorICogYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfZGF0YSBmcm9tIAorICogYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCAKKyAqIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2RhdGEgCisgKiBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSAKKyAqIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2RhdGEgaXMgCisgKiBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIAorICogYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YSBpcyBvdXQgCisgKiBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgCisgKiBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhIGlzIG91dCAKKyAqIG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZGF0YSB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fb251X2tleSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X2tleV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9rZXkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9rZXlfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fb251X2tleSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV91bnBhY2soYmNtb2x0X2dwb25fb251X2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX29udV9rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9vbnVfa2V5IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9rZXlfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fb251X2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fb251X2NmZ19kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgCisgKiB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fb251X2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YSB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X3N0YXRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnX2RhdGEgd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhIAorICogc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgZnJvbSAKKyAqIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIAorICogYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSAKKyAqIGJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX29udV9kZmlfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X2RmaV9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9kZmlfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2RmaV9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX29udV9kZmlfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9kZmlfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X2RmaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X2RmaV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfZGdpX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX29udV9kZ2lfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfZGdpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X2RnaV9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfZGdpX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfZGdpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9vbnVfZGdpX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9kZ2lfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfZGdpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfZGdpX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2RnaV9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfZGdpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfZGdpX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfZGdpX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX29udV9kZ2lfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9kZ2lfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X2RnaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X2RnaV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfZG93aV9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfZG93aV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9kb3dpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X2Rvd2lfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2Rvd2lfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9kb3dpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9vbnVfZG93aV9kYXRhIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfZG93aV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9kb3dpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfZG93aV9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9kb3dpX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9kb3dpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfZG93aV9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2Rvd2lfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fb251X2Rvd2lfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9kb3dpX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9kb3dpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfZG93aV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfZXJyX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX29udV9lcnJfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfZXJyX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X2Vycl9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfZXJyX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfZXJyX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9vbnVfZXJyX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9lcnJfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfZXJyX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfZXJyX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2Vycl9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfZXJyX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfZXJyX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfZXJyX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX29udV9lcnJfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9lcnJfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X2Vycl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X2Vycl9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyAKKyAqIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YSBpcyBvdXQgCisgKiBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIAorICogYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGEgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhIGlzIAorICogb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkX2RhdGEgc3RydWN0LiAgCisgKiBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkX2RhdGEgCisgKiBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgCisgKiBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhIHN0cnVjdC4gIFRoaXMgCisgKiBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhIHN0cnVjdCAKKyAqIGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YSBpcyAKKyAqIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9kYXRhIHN0cnVjdC4gIAorICogVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2RhdGEgCisgKiBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgCisgKiBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfbG9haV9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfbG9haV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9sb2FpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X2xvYWlfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2xvYWlfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9sb2FpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9vbnVfbG9haV9kYXRhIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfbG9haV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9sb2FpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfbG9haV9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9sb2FpX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9sb2FpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfbG9haV9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2xvYWlfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fb251X2xvYWlfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9sb2FpX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9sb2FpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfbG9haV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfbG9raV9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfbG9raV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9sb2tpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X2xva2lfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2xva2lfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9sb2tpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9vbnVfbG9raV9kYXRhIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfbG9raV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9sb2tpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfbG9raV9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9sb2tpX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9sb2tpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfbG9raV9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2xva2lfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fb251X2xva2lfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9sb2tpX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9sb2tpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfbG9raV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfbWVtaV9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfbWVtaV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9tZW1pX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X21lbWlfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X21lbWlfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9tZW1pX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9vbnVfbWVtaV9kYXRhIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfbWVtaV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9tZW1pX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfbWVtaV9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9tZW1pX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9tZW1pX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfbWVtaV9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X21lbWlfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fb251X21lbWlfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9tZW1pX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9tZW1pX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfbWVtaV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgCisgKiBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSBmcm9tIAorICogYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgCisgKiBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIAorICogYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIAorICogc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhIGlzIAorICogb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX2RhdGEgc3RydWN0LiAgCisgKiBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIAorICogd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfZGF0YSAKKyAqIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSAKKyAqIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1fZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X29udV9hbGFybV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1fZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1fZGF0YSB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X29udV9hbGFybV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1fZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1fZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1fZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fb251X29udV9hbGFybV9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9hbGFybV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhIHN0cnVjdC4gIFRoaXMgCisgKiBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhIHN0cnVjdCAKKyAqIGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhIAorICogaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyAKKyAqIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGEgaXMgb3V0IAorICogb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgCisgKiBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSBpcyBvdXQgCisgKiBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfZGF0YSBzdHJ1Y3QuIAorICogIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgCisgKiB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9kYXRhIAorICogc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSAKKyAqIGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfcGVlX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX29udV9wZWVfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfcGVlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X3BlZV9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcGVlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfcGVlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9vbnVfcGVlX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9wZWVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfcGVlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfcGVlX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3BlZV9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfcGVlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfcGVlX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcGVlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX29udV9wZWVfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wZWVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X3BlZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X3BlZV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhIHN0cnVjdC4gIAorICogVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhIAorICogc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIAorICogYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fb251X3BzdF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfcHN0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X3BzdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9wc3RfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3BzdF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X3BzdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fb251X3BzdF9kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgCisgKiB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfcHN0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X3BzdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X3BzdF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wc3RfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X3BzdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fb251X3BzdF9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3BzdF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9vbnVfcHN0X2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcHN0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9wc3RfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9wc3RfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfcmVpX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX29udV9yZWlfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfcmVpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X3JlaV9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcmVpX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfcmVpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9vbnVfcmVpX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9yZWlfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfcmVpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfcmVpX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3JlaV9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfcmVpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfcmVpX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcmVpX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX29udV9yZWlfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9yZWlfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X3JlaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X3JlaV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIAorICogc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSBzdHJ1Y3QgCisgKiBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSAKKyAqIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX29udV9zZGlfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X3NkaV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9zZGlfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfc2RpX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zZGlfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9zZGlfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX29udV9zZGlfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIAorICogd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X3NkaV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9zZGlfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9zZGlfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc2RpX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9zZGlfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX29udV9zZGlfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zZGlfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fb251X3NkaV9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3NkaV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfc2RpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfc2RpX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX29udV9zZmlfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X3NmaV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9zZmlfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfc2ZpX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zZmlfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9zZmlfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX29udV9zZmlfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIAorICogd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X3NmaV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9zZmlfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9zZmlfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc2ZpX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9zZmlfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX29udV9zZmlfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zZmlfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fb251X3NmaV9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3NmaV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfc2ZpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfc2ZpX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfc3VmaV9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfc3VmaV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9zdWZpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X3N1ZmlfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3N1ZmlfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9zdWZpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9vbnVfc3VmaV9kYXRhIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfc3VmaV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9zdWZpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfc3VmaV9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zdWZpX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9zdWZpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfc3VmaV9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3N1ZmlfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fb251X3N1ZmlfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9zdWZpX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9zdWZpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfc3VmaV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfdGl3aV9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfdGl3aV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV90aXdpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X3Rpd2lfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Rpd2lfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV90aXdpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9vbnVfdGl3aV9kYXRhIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfdGl3aV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV90aXdpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfdGl3aV9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV90aXdpX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV90aXdpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfdGl3aV9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Rpd2lfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fb251X3Rpd2lfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV90aXdpX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV90aXdpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfdGl3aV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2RhdGEgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgCisgKiB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2RhdGFfdW5wYWNrKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YV91bnBhY2soYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl90cnhfa2V5IHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgCisgKiB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfZ3Bvbl90cnhfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF9ncG9uX3RyeF9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fdHJ4X2tleSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fdHJ4X2tleV9wYWNrKGNvbnN0IGJjbW9sdF9ncG9uX3RyeF9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl90cnhfa2V5IHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2dwb25fdHJ4X2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl90cnhfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2dwb25fdHJ4X2tleSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl90cnhfa2V5X3VucGFjayhiY21vbHRfZ3Bvbl90cnhfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2dwb25fdHJ4X2tleSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX3RyeF9rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX3RyeF9rZXkgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl90cnhfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfZ3Bvbl90cnhfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fdHJ4X2tleV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhX3VucGFjayhiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2dwb25fdHJ4X2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfbG9nX2VudHJ5X2tleSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2xvZ19lbnRyeV9rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2xvZ19lbnRyeV9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2xvZ19lbnRyeV9rZXkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfa2V5X3BhY2soY29uc3QgYmNtb2x0X2xvZ19lbnRyeV9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfbG9nX2VudHJ5X2tleSB3b3VsZCBvY2N1cHkgb24gdGhlIAorICogd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2xvZ19lbnRyeV9rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2xvZ19lbnRyeV9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbG9nX2VudHJ5X2tleSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X2tleV91bnBhY2soYmNtb2x0X2xvZ19lbnRyeV9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfbG9nX2VudHJ5X2tleSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfbG9nX2VudHJ5X2tleSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfbG9nX2VudHJ5X2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9sb2dfZW50cnlfa2V5X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2xvZ19lbnRyeV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfbG9nX2VudHJ5X2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2xvZ19lbnRyeV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGEgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2xvZ19lbnRyeV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9jZmdfZGF0YV91bnBhY2soYmNtb2x0X2xvZ19lbnRyeV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfbG9nX2VudHJ5X2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2xvZ19lbnRyeV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9sb2dfZW50cnlfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfbG9nX2VudHJ5X3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfbG9nX2VudHJ5X3N0YXRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9kYXRhIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9kYXRhX3VucGFjayhiY21vbHRfbG9nX2VudHJ5X3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9sb2dfZW50cnlfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfZGF0YSB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIAorICogYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV91bnBhY2soYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGlzIG91dCAKKyAqIG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV91bnBhY2soYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgCisgKiB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2RhdGEgd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfbG9nZ2VyX2tleSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2xvZ2dlcl9rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X2xvZ2dlcl9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2xvZ2dlcl9rZXkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfa2V5X3BhY2soY29uc3QgYmNtb2x0X2xvZ2dlcl9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfbG9nZ2VyX2tleSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9sb2dnZXJfa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9sb2dnZXJfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2xvZ2dlcl9rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9rZXlfdW5wYWNrKGJjbW9sdF9sb2dnZXJfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2xvZ2dlcl9rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX2tleV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2xvZ2dlcl9rZXkgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2xvZ2dlcl9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfbG9nZ2VyX2tleV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfbG9nZ2VyX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfbG9nZ2VyX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9sb2dnZXJfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2xvZ2dlcl9jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9sb2dnZXJfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfbG9nZ2VyX2NmZ19kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgCisgKiB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfbG9nZ2VyX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9sb2dnZXJfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbG9nZ2VyX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9sb2dnZXJfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfbG9nZ2VyX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2xvZ2dlcl9jZmdfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9sb2dnZXJfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfbG9nZ2VyX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfbG9nZ2VyX3N0YXRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2xvZ2dlcl9zdGF0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2xvZ2dlcl9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2xvZ2dlcl9zdGF0X2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfc3RhdF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X2xvZ2dlcl9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfbG9nZ2VyX3N0YXRfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIAorICogd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2xvZ2dlcl9zdGF0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2xvZ2dlcl9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbG9nZ2VyX3N0YXRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX3N0YXRfZGF0YV91bnBhY2soYmNtb2x0X2xvZ2dlcl9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfbG9nZ2VyX3N0YXRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfc3RhdF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfbG9nZ2VyX3N0YXRfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfc3RhdF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfbG9nZ2VyX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9sb2dnZXJfc3RhdF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9sb2dnZXJfc3RhdF9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2RhdGEgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9sb2dnZXJfc3RhdF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19kYXRhX3VucGFjayhiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9sb2dnZXJfc3RhdF9jZmdfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfc3RhdF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrKGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfdW5wYWNrKGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9sb2dnZXJfYXV0b19jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19kYXRhIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9sb2dnZXJfYXV0b19jZmdfZGF0YV91bnBhY2soYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9sb2dnZXJfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9sb2dnZXJfYXV0b19jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X25uaV9rZXkgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ubmlfa2V5X3NldF9kZWZhdWx0KGJjbW9sdF9ubmlfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ubmlfa2V5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX2tleV9wYWNrKGNvbnN0IGJjbW9sdF9ubmlfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X25uaV9rZXkgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfbm5pX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfbm5pX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ubmlfa2V5IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfa2V5X3VucGFjayhiY21vbHRfbm5pX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ubmlfa2V5IHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyAKKyAqIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ubmlfa2V5IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ubmlfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X25uaV9rZXlfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X25uaV9jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X25uaV9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfbm5pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ubmlfY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfbm5pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X25uaV9jZmdfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ubmlfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X25uaV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ubmlfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9jZmdfZGF0YV91bnBhY2soYmNtb2x0X25uaV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ubmlfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfbm5pX2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X25uaV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9ubmlfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ubmlfc3RhdF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgCisgKiB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfbm5pX3N0YXRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfbm5pX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfbm5pX3N0YXRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zdGF0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfbm5pX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ubmlfc3RhdF9kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgCisgKiB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfbm5pX3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfbm5pX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ubmlfc3RhdF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc3RhdF9kYXRhX3VucGFjayhiY21vbHRfbm5pX3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ubmlfc3RhdF9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zdGF0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ubmlfc3RhdF9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zdGF0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ubmlfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X25uaV9zdGF0X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ubmlfc3RhdF9jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X25uaV9zdGF0X2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF9ubmlfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfbm5pX3N0YXRfY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc3RhdF9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF9ubmlfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ubmlfc3RhdF9jZmdfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIAorICogd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X25uaV9zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF9ubmlfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ubmlfc3RhdF9jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3N0YXRfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF9ubmlfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ubmlfc3RhdF9jZmdfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc3RhdF9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X25uaV9zdGF0X2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zdGF0X2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfbm5pX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfbm5pX3N0YXRfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV91bnBhY2soYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV91bnBhY2soYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgCisgKiB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2RhdGEgd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9kYXRhX3VucGFjayhiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfbm5pX2F1dG9fY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ubmlfYXV0b19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfbm5pX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X25uaV9hdXRvX2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX2F1dG9fY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfbm5pX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfbm5pX2F1dG9fY2ZnX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ubmlfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfbm5pX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbm5pX2F1dG9fY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfbm5pX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfbm5pX2F1dG9fY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ubmlfYXV0b19jZmdfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfYXV0b19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X25uaV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X25uaV9hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfbm5pX3NlcmRlc19rZXkgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCAKKyAqIHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9ubmlfc2VyZGVzX2tleV9zZXRfZGVmYXVsdChiY21vbHRfbm5pX3NlcmRlc19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X25uaV9zZXJkZXNfa2V5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3NlcmRlc19rZXlfcGFjayhjb25zdCBiY21vbHRfbm5pX3NlcmRlc19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfbm5pX3NlcmRlc19rZXkgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9ubmlfc2VyZGVzX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfbm5pX3NlcmRlc19rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfbm5pX3NlcmRlc19rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zZXJkZXNfa2V5X3VucGFjayhiY21vbHRfbm5pX3NlcmRlc19rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfbm5pX3NlcmRlc19rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfbm5pX3NlcmRlc19rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ubmlfc2VyZGVzX2tleSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc2VyZGVzX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X25uaV9zZXJkZXNfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X25uaV9zZXJkZXNfa2V5X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhX3VucGFjayhiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXkgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5X3BhY2soY29uc3QgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXkgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleV91bnBhY2soYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXlfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfZGF0YV91bnBhY2soYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXkgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5X3NldF9kZWZhdWx0KGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleV9wYWNrKGNvbnN0IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXkgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5X2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXlfdW5wYWNrKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXkgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSAKKyAqIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YSBzdHJ1Y3QuICAKKyAqIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGEgCisgKiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGEgCisgKiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIAorICogYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhIHN0cnVjdCAKKyAqIGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSAKKyAqIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhIHN0cnVjdC4gIFRoaXMgCisgKiBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfZGF0YV91bnBhY2soYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhIHN0cnVjdCAKKyAqIGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGEgCisgKiBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfZGF0YSBzdHJ1Y3QuICBUaGlzIAorICogc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvd19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvd19kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfZGF0YV91bnBhY2soYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfZGF0YSBzdHJ1Y3QgCisgKiBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvd19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfZGF0YSAKKyAqIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvd19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9hbGxvY19rZXkgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9hbGxvY19rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX2FsbG9jX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fYWxsb2Nfa2V5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfa2V5X3BhY2soY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9hbGxvY19rZXkgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9hbGxvY19rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9hbGxvY19rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2tleV91bnBhY2soYmNtb2x0X3hncG9uX2FsbG9jX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9hbGxvY19rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fYWxsb2Nfa2V5IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9hbGxvY19rZXlfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fYWxsb2NfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9hbGxvY19jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fYWxsb2NfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19jZmdfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fYWxsb2NfY2ZnX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2NfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9hbGxvY19jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfZGF0YSB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgCisgKiB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgc3RydWN0LiAgVGhpcyAKKyAqIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgc3RydWN0IAorICogYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgCisgKiBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhIHN0cnVjdC4gIAorICogVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhIHN0cnVjdCAKKyAqIGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YSAKKyAqIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgCisgKiBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGlzIG91dCAKKyAqIG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIAorICogYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgaXMgb3V0IAorICogb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhX3VucGFjayhiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXlfcGFjayhjb25zdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleSB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5X3VucGFjayhiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXkgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgCisgKiB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGEgd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19kYXRhX3VucGFjayhiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIAorICogdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9kYXRhIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIAorICogc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGlzIAorICogb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgc3RydWN0LiAgVGhpcyAKKyAqIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgaXMgCisgKiBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9pd2Zfa2V5IHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgCisgKiB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25faXdmX2tleV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25faXdmX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25faXdmX2tleSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2l3Zl9rZXlfcGFjayhjb25zdCBiY21vbHRfeGdwb25faXdmX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9pd2Zfa2V5IHdvdWxkIG9jY3VweSBvbiB0aGUgCisgKiB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25faXdmX2tleV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25faXdmX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9pd2Zfa2V5IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9pd2Zfa2V5X3VucGFjayhiY21vbHRfeGdwb25faXdmX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9pd2Zfa2V5IHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2l3Zl9rZXlfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9pd2Zfa2V5IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX2l3Zl9rZXlfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9pd2Zfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX2l3Zl9rZXlfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX2l3Zl9jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX2l3Zl9jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25faXdmX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25faXdmX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX2l3Zl9jZmdfZGF0YSB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX2l3Zl9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25faXdmX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX2l3Zl9jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25faXdmX2NmZ19kYXRhX3VucGFjayhiY21vbHRfeGdwb25faXdmX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX2l3Zl9jZmdfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25faXdmX2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25faXdmX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX2l3Zl9jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX25pX2tleSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX25pX2tleV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfa2V5ICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9rZXkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9rZXlfcGFjayhjb25zdCBiY21vbHRfeGdwb25fbmlfa2V5ICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX25pX2tleSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9uaV9rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX25pX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2tleV91bnBhY2soYmNtb2x0X3hncG9uX25pX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9uaV9rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fbmlfa2V5IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX25pX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9uaV9rZXlfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgCisgKiB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX25pX3N0YXRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhdF9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2RhdGEgd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhdF9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhdF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fbmlfc3RhdF9jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgCisgKiBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGEgaXMgb3V0IAorICogb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fbmlfbG9zX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9uaV9sb3NfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfbG9zX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX25pX2xvc19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfbG9zX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fbmlfbG9zX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fbmlfbG9zX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9uaV9sb3NfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfbG9zX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fbmlfbG9zX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2xvc19kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfbG9zX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fbmlfbG9zX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfbG9zX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9uaV9sb3NfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9sb3NfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX25pX2xvc19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX25pX2xvc19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyAKKyAqIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhIGlzIG91dCAKKyAqIG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGEgc3RydWN0LiAgCisgKiBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIAorICogd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSAKKyAqIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSAKKyAqIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhIAorICogc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YSB0byAKKyAqIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YSB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YSAKKyAqIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIAorICogYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgCisgKiBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhIAorICogc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGEgZnJvbSAKKyAqIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YSAKKyAqIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSAKKyAqIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEgc3RydWN0LiAgVGhpcyAKKyAqIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEgc3RydWN0IAorICogYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhIGlzIAorICogb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGEgCisgKiBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSBmcm9tIAorICogYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIAorICogYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgCisgKiBiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgCisgKiBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEgaXMgCisgKiBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIAorICogYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YSBpcyBvdXQgCisgKiBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyAKKyAqIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhIGlzIG91dCAKKyAqIG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyAKKyAqIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGEgaXMgb3V0IAorICogb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyAKKyAqIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YSBpcyAKKyAqIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgCisgKiBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGEgaXMgCisgKiBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fb251X2tleSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9rZXkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fb251X2tleSB3b3VsZCBvY2N1cHkgb24gdGhlIAorICogd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X2tleSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2tleV91bnBhY2soYmNtb2x0X3hncG9uX29udV9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fb251X2tleSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fb251X2tleSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fb251X2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9zdGF0X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X3N0YXRfY2ZnX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YSB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3N0YXRfY2ZnX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X3N0YXRfY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X3N0YXRfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9vbnVfZGZpX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfZGZpX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9kZmlfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X2RmaV9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2RmaV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9kZmlfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9vbnVfZGZpX2RhdGEgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfZGZpX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9kZmlfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfZGZpX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9kZmlfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9kZmlfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfZGZpX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2RmaV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fb251X2RmaV9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9kZmlfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9kZmlfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfZGZpX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9vbnVfZGdpX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfZGdpX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9kZ2lfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X2RnaV9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2RnaV9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9kZ2lfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9vbnVfZGdpX2RhdGEgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfZGdpX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9kZ2lfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfZGdpX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9kZ2lfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9kZ2lfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfZGdpX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2RnaV9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fb251X2RnaV9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9kZ2lfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9kZ2lfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfZGdpX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fb251X2Rvd2lfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X2Rvd2lfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X2Rvd2lfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9kb3dpX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X2Rvd2lfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9kYXRhIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X2Rvd2lfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X2Rvd2lfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X2Rvd2lfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9kb3dpX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9kb3dpX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9kb3dpX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyAKKyAqIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhIGlzIG91dCAKKyAqIG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGEgc3RydWN0LiAgVGhpcyAKKyAqIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGEgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGEgaXMgCisgKiBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YSBzdHJ1Y3QuICBUaGlzIAorICogc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YSBzdHJ1Y3QgCisgKiBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YSAKKyAqIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9sb29jaV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X2xvb2NpX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YSB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9sb29jaV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2xvb2NpX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX29udV9sb29jaV9kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9sb29jaV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X2xvb2NpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X2xvb2NpX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGEgc3RydWN0LiAgVGhpcyAKKyAqIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGEgc3RydWN0IAorICogYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhIGlzIAorICogb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1fZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyAKKyAqIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1fZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X29udV9hbGFybV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X29udV9hbGFybV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1fZGF0YSB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1fZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X29udV9hbGFybV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1fZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV9hbGFybV9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X29udV9hbGFybV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1fZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV9hbGFybV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X29udV9hbGFybV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1faWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhIHN0cnVjdC4gIFRoaXMgCisgKiBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhIHN0cnVjdCAKKyAqIGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGEgCisgKiBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyAKKyAqIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YSBpcyAKKyAqIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgCisgKiBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhIGlzIG91dCAKKyAqIG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhIHN0cnVjdC4gIFRoaXMgCisgKiBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2RhdGEgaXMgCisgKiBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9kYXRhIHN0cnVjdC4gIFRoaXMgCisgKiBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9kYXRhIHN0cnVjdCAKKyAqIGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfZGF0YSBpcyAKKyAqIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfZGF0YSBzdHJ1Y3QuICBUaGlzIAorICogc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfZGF0YSBzdHJ1Y3QgCisgKiBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2RhdGEgaXMgCisgKiBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyAKKyAqIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfZGF0YSBpcyBvdXQgCisgKiBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSBzdHJ1Y3QuICAKKyAqIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSAKKyAqIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgCisgKiBiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX29udV9wcXNpX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Bxc2lfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX29udV9wcXNpX2RhdGEgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9wcXNpX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9wcXNpX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX29udV9wcXNpX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Bxc2lfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX29udV9wcXNpX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Bxc2lfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9wcXNpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X3Bxc2lfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIAorICogc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSBzdHJ1Y3QgCisgKiBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhIAorICogaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX29udV9zZGlfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byAKKyAqIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9zZGlfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X3NkaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfc2RpX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc2RpX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X3NkaV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX29udV9zZGlfZGF0YSB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9zZGlfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X3NkaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9zZGlfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3NkaV9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X3NkaV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX29udV9zZGlfZGF0YSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc2RpX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9vbnVfc2RpX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3NkaV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X3NkaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9zZGlfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfZGF0YSAKKyAqIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9kYXRhIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9kYXRhIGZyb20gCisgKiBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIAorICogYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIAorICogYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fb251X3NmaV9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fb251X3NmaV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9zZmlfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zZmlfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fb251X3NmaV9kYXRhIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X3NmaV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X3NmaV9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fb251X3NmaV9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zZmlfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX29udV9zZmlfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X3NmaV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyAKKyAqIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSBpcyBvdXQgCisgKiBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX29udV9zdWZpX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfc3VmaV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfc3VmaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfc3VmaV9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3N1ZmlfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc3VmaV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX29udV9zdWZpX2RhdGEgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfc3VmaV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc3VmaV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9zdWZpX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zdWZpX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfc3VmaV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX29udV9zdWZpX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3N1ZmlfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX29udV9zdWZpX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3N1ZmlfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9zdWZpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X3N1ZmlfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX29udV90aXdpX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Rpd2lfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX29udV90aXdpX2RhdGEgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV90aXdpX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV90aXdpX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX29udV90aXdpX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Rpd2lfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX29udV90aXdpX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Rpd2lfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV90aXdpX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X3Rpd2lfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfZGF0YSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIAorICogZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgCisgKiB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEgd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIAorICogYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YSBpcyBvdXQgCisgKiBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19kYXRhIHN0cnVjdC4gIFRoaXMgCisgKiBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19kYXRhIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19kYXRhIGlzIAorICogb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIAorICogYWxsIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25fZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2RhdGEgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25fZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25fZGF0YSBpcyBvdXQgCisgKiBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9kYXRhIHN0cnVjdC4gIAorICogVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2RhdGEgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9kYXRhIAorICogc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIAorICogYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25faWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YV9zZXRfZGVmYXVsdChiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2RhdGFfcGFjayhjb25zdCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChjb25zdCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19kYXRhX3VucGFjayhiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2RhdGFfc2NhbihiY21vbHRfYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIENoZWNrcyBpZiBhbnkgZmllbGQgaW4gdGhlIGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSBpcyBvdXQgb2YgCisgKiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCAKKyAqIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhIGlzIG91dCBvZiAKKyAqIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhX2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgCisgKiB0byBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhX3NldF9kZWZhdWx0KGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfZGF0YV9wYWNrKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2RhdGEgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2RhdGFfdW5wYWNrKGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfZGF0YV9zY2FuKGJjbW9sdF9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogQ2hlY2tzIGlmIGFueSBmaWVsZCBpbiB0aGUgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2RhdGEgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50LCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2RhdGEgaXMgb3V0IG9mIAorICogYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCwgYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9pZCAqZmFpbGVkX3Byb3ApOworCisvKiogSW5pdGlhbGl6ZXMgYSBiY21vbHRfeGdwb25fdHJ4X2tleSBzdHJ1Y3QuICBUaGlzIHNldHMgYWxsIGZpZWxkcyB0byBkZWZhdWx0IAorICogdmFsdWVzLiAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKi8KK3ZvaWQgYmNtb2x0X3hncG9uX3RyeF9rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX3RyeF9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X3hncG9uX3RyeF9rZXkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl90cnhfa2V5X3BhY2soY29uc3QgYmNtb2x0X3hncG9uX3RyeF9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfeGdwb25fdHJ4X2tleSB3b3VsZCBvY2N1cHkgb24gdGhlIAorICogd2lyZSAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X3hncG9uX3RyeF9rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX3RyeF9rZXkgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfeGdwb25fdHJ4X2tleSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fdHJ4X2tleV91bnBhY2soYmNtb2x0X3hncG9uX3RyeF9rZXkgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfeGdwb25fdHJ4X2tleSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl90cnhfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fdHJ4X2tleSBpcyBvdXQgb2YgYm91bmRzIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxwYXJhbSBmYWlsZWRfcHJvcCBSZWZlcmVuY2UgdG8gdGhlIHByb3BlcnR5IHRoYXQgd2FzIG91dCBvZiByYW5nZSAob25seSBzZXQgCisgKiBvbiBmYWlsdXJlKSAKKyAqIFxyZXR1cm4gVFJVRSBpZiBhbGwgZmllbGRzIGFyZSBpbiB0aGUgY29ycmVjdCByYW5nZSwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94Z3Bvbl90cnhfa2V5X2JvdW5kc19jaGVjayhjb25zdCBiY21vbHRfeGdwb25fdHJ4X2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl90cnhfa2V5X2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGEgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGEgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YV91bnBhY2soYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhIGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2lkICpmYWlsZWRfcHJvcCk7CisKKy8qKiBJbml0aWFsaXplcyBhIGJjbW9sdF94cG9uX3NlcmRlc19rZXkgc3RydWN0LiAgVGhpcyBzZXRzIGFsbCBmaWVsZHMgdG8gCisgKiBkZWZhdWx0IHZhbHVlcy4gCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICovCit2b2lkIGJjbW9sdF94cG9uX3NlcmRlc19rZXlfc2V0X2RlZmF1bHQoYmNtb2x0X3hwb25fc2VyZGVzX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogUGFja3MgYSBiY21vbHRfeHBvbl9zZXJkZXNfa2V5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeHBvbl9zZXJkZXNfa2V5X3BhY2soY29uc3QgYmNtb2x0X3hwb25fc2VyZGVzX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF94cG9uX3NlcmRlc19rZXkgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF94cG9uX3NlcmRlc19rZXlfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hwb25fc2VyZGVzX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF94cG9uX3NlcmRlc19rZXkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hwb25fc2VyZGVzX2tleV91bnBhY2soYmNtb2x0X3hwb25fc2VyZGVzX2tleSAqdGhpcywgYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF94cG9uX3NlcmRlc19rZXkgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeHBvbl9zZXJkZXNfa2V5X3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeHBvbl9zZXJkZXNfa2V5IGlzIG91dCBvZiBib3VuZHMgCisgKgorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHBhcmFtIGZhaWxlZF9wcm9wIFJlZmVyZW5jZSB0byB0aGUgcHJvcGVydHkgdGhhdCB3YXMgb3V0IG9mIHJhbmdlIChvbmx5IHNldCAKKyAqIG9uIGZhaWx1cmUpIAorICogXHJldHVybiBUUlVFIGlmIGFsbCBmaWVsZHMgYXJlIGluIHRoZSBjb3JyZWN0IHJhbmdlLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hwb25fc2VyZGVzX2tleV9ib3VuZHNfY2hlY2soY29uc3QgYmNtb2x0X3hwb25fc2VyZGVzX2tleSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94cG9uX3NlcmRlc19rZXlfaWQgKmZhaWxlZF9wcm9wKTsKKworLyoqIEluaXRpYWxpemVzIGEgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhIHN0cnVjdC4gIFRoaXMgc2V0cyBhbGwgZmllbGRzIHRvIAorICogZGVmYXVsdCB2YWx1ZXMuIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSAKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqLwordm9pZCBiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGFfc2V0X2RlZmF1bHQoYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhX3BhY2soY29uc3QgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxwYXJhbSBmaWVsZHNfcHJlc2VudCBCaXRtYXNrIG9mIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLiAKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoY29uc3QgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YV91bnBhY2soYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhICp0aGlzLCBiY21vbHRfYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0sIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHBhcmFtIGZpZWxkc19wcmVzZW50IEJpdG1hc2sgb2Ygd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzdHJ1Y3R1cmUuIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhX3NjYW4oYmNtb2x0X2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtLCBiY21vbHRfcHJlc2VuY2VfbWFzayBmaWVsZHNfcHJlc2VudCk7CisKKy8qKiBDaGVja3MgaWYgYW55IGZpZWxkIGluIHRoZSBiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGEgaXMgb3V0IG9mIGJvdW5kcyAKKyAqCisgKiBccGFyYW0gZmllbGRzX3ByZXNlbnQgQml0bWFzayBvZiB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gdGhlIHN0cnVjdHVyZS4gCisgKiBccGFyYW0gZmFpbGVkX3Byb3AgUmVmZXJlbmNlIHRvIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBvdXQgb2YgcmFuZ2UgKG9ubHkgc2V0IAorICogb24gZmFpbHVyZSkgCisgKiBccmV0dXJuIFRSVUUgaWYgYWxsIGZpZWxkcyBhcmUgaW4gdGhlIGNvcnJlY3QgcmFuZ2UsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGFfYm91bmRzX2NoZWNrKGNvbnN0IGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YSAqdGhpcywgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQsIGJjbW9sdF94cG9uX3NlcmRlc19jZmdfaWQgKmZhaWxlZF9wcm9wKTsKKworLyogTWFwbGUgZGV2aWNlIHNlbGVjdGVkIGFzIGEgdGFyZ2V0IGZvciBDTEkgY29tbWFuZHMgKi8KK2V4dGVybiBiY21vbHRfZGV2aWQgY3VycmVudF9kZXZpY2U7CisKKy8qKiBTZXQgc3lzdGVtIG1vZGUKKyAqIFxwYXJhbVtpbl0gIGRldiAgICAgICAgICAgIERldmljZSBpZAorICogXHBhcmFtW2luXSAgc3lzdGVtX21vZGUgICAgU3lzdGVtIG1vZGUKKyAqIFxyZXR1cm5zIEJDTV9FUlJfT0ssIEJDTV9FUlJfTk9UX1NVUFBPUlRFRAorICovCitiY21vc19lcnJubyBiY21vbHRfc3lzdGVtX21vZGVfc2V0KGJjbW9sdF9kZXZpZCBkZXYsIGJjbW9sdF9zeXN0ZW1fbW9kZSBzeXN0ZW1fbW9kZSk7CisKKy8qKiBHZXQgc3lzdGVtIG1vZGUKKyAqIFxwYXJhbVtpbl0gIGRldiAgICAgICAgICAgIERldmljZSBpZAorICogXHBhcmFtW2luXSAgc3lzdGVtX21vZGUgICAgU3lzdGVtIG1vZGUKKyAqIFxyZXR1cm5zIEJDTV9FUlJfT0sKKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X3N5c3RlbV9tb2RlX2dldChiY21vbHRfZGV2aWQgZGV2LCBiY21vbHRfc3lzdGVtX21vZGUgKnN5c3RlbV9tb2RlKTsKKworLyoqIENoZWNrcyBpZiBvYmplY3RzIHdpdGggdGhlIGdpdmVuIHRhZyBhcmUgdmFsaWQgaW4gdGhlIGdpdmVuIHN5c3RlbSBtb2RlLiAqLworYmNtb3NfYm9vbCBiY21vbHRfb2JqX3RhZ192YWxpZF9mb3Jfc3lzdGVtX21vZGUoYmNtb2x0X3N5c3RlbV9tb2RlIHN5c3RlbV9tb2RlLCBiY21vbHRfb2JqX3RhZyB0YWcpOworCisvKiogQ2hlY2tzIGlmIHRoZSBnaXZlbiBvYmplY3QgaXMgc3VwcG9ydGVkIGluIHRoZSBnaXZlbiBzeXN0ZW0gbW9kZS4KKyAqIFxwYXJhbVtpbl0gc3lzdGVtX21vZGUgU3lzdGVtIG1vZGUKKyAqIFxwYXJhbVtpbl0gb2JqICAgICAgICAgT2JqZWN0IElECisgKiBccmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCBpcyBzdXBwb3J0ZWQgaW4gdGhlIGdpdmVuIHN5c3RlbSBtb2RlLCBmYWxzZSBvdGhlcndpc2UuCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X29iamVjdF9pc19zdXBwb3J0ZWQoYmNtb2x0X3N5c3RlbV9tb2RlIHN5c3RlbV9tb2RlLCBiY21vbHRfb2JqX2lkIG9iaik7CisKKy8qKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSBnaXZlbiBzeXN0ZW0gbW9kZSBhcyBhIHN0cmluZy4gKi8KK2NvbnN0IGNoYXIgKmJjbW9sdF9zeXN0ZW1fbW9kZV9uYW1lKGJjbW9sdF9zeXN0ZW1fbW9kZSBtb2RlKTsKKworLyoqIFNldCB4Z3BvbiBudW0gb2Ygb251cworICogXHBhcmFtW2luXSAgZGV2ICAgICAgICAgICAgRGV2aWNlIGlkCisgKiBccGFyYW1baW5dICB4Z3Bvbl9udW1fb2Zfb251cyAgICBYR1BPTiBudW0gb2Ygb251cworICogXHJldHVybnMgQkNNX0VSUl9PSywgQkNNX0VSUl9OT1RfU1VQUE9SVEVECisgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF94Z3Bvbl9udW1fb2Zfb251c19zZXQoYmNtb2x0X2RldmlkIGRldiwgYmNtb2x0X3hncG9uX251bV9vZl9vbnVzIHhncG9uX251bV9vZl9vbnVzKTsKKworLyoqIEdldCB4Z3BvbiBudW0gb2Ygb251cworICogXHBhcmFtW2luXSAgZGV2ICAgICAgICAgICAgRGV2aWNlIGlkCisgKiBccGFyYW1baW5dICB4Z3Bvbl9udW1fb2Zfb251cyAgICBYR1BPTiBudW0gb2Ygb251cworICogXHJldHVybnMgQkNNX0VSUl9PSworICovCitiY21vc19lcnJubyBiY21vbHRfeGdwb25fbnVtX29mX29udXNfZ2V0KGJjbW9sdF9kZXZpZCBkZXYsIGJjbW9sdF94Z3Bvbl9udW1fb2Zfb251cyAqeGdwb25fbnVtX29mX29udXMpOworI2VuZGlmIC8qIEJDTU9MVF9NT0RFTF9UWVBFU19IXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL21vZGVsL2JjbW9sdF9tc2dfcGFjay5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL21vZGVsL2JjbW9sdF9tc2dfcGFjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MTdmOTUKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvbW9kZWwvYmNtb2x0X21zZ19wYWNrLmMKQEAgLTAsMCArMSwyMTQ1IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OnByb3ByaWV0YXJ5OnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVGhpcyBwcm9ncmFtIGlzIHRoZSBwcm9wcmlldGFyeSBzb2Z0d2FyZSBvZiBCcm9hZGNvbSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzCitsaWNlbnNvcnMsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBkdXBsaWNhdGVkLCBtb2RpZmllZCBvciBkaXN0cmlidXRlZCBwdXJzdWFudAordG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIGEgc2VwYXJhdGUsIHdyaXR0ZW4gbGljZW5zZSBhZ3JlZW1lbnQgZXhlY3V0ZWQKK2JldHdlZW4geW91IGFuZCBCcm9hZGNvbSAoYW4gIkF1dGhvcml6ZWQgTGljZW5zZSIpLiAgRXhjZXB0IGFzIHNldCBmb3J0aCBpbgorYW4gQXV0aG9yaXplZCBMaWNlbnNlLCBCcm9hZGNvbSBncmFudHMgbm8gbGljZW5zZSAoZXhwcmVzcyBvciBpbXBsaWVkKSwgcmlnaHQKK3RvIHVzZSwgb3Igd2FpdmVyIG9mIGFueSBraW5kIHdpdGggcmVzcGVjdCB0byB0aGUgU29mdHdhcmUsIGFuZCBCcm9hZGNvbQorZXhwcmVzc2x5IHJlc2VydmVzIGFsbCByaWdodHMgaW4gYW5kIHRvIHRoZSBTb2Z0d2FyZSBhbmQgYWxsIGludGVsbGVjdHVhbAorcHJvcGVydHkgcmlnaHRzIHRoZXJlaW4uICBJRiBZT1UgSEFWRSBOTyBBVVRIT1JJWkVEIExJQ0VOU0UsIFRIRU4gWU9VIEhBVkUKK05PIFJJR0hUIFRPIFVTRSBUSElTIFNPRlRXQVJFIElOIEFOWSBXQVksIEFORCBTSE9VTEQgSU1NRURJQVRFTFkgTk9USUZZCitCUk9BRENPTSBBTkQgRElTQ09OVElOVUUgQUxMIFVTRSBPRiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBleHByZXNzbHkgc2V0IGZvcnRoIGluIHRoZSBBdXRob3JpemVkIExpY2Vuc2UsCisKKzEuIFRoaXMgcHJvZ3JhbSwgaW5jbHVkaW5nIGl0cyBzdHJ1Y3R1cmUsIHNlcXVlbmNlIGFuZCBvcmdhbml6YXRpb24sCisgICAgY29uc3RpdHV0ZXMgdGhlIHZhbHVhYmxlIHRyYWRlIHNlY3JldHMgb2YgQnJvYWRjb20sIGFuZCB5b3Ugc2hhbGwgdXNlCisgICAgYWxsIHJlYXNvbmFibGUgZWZmb3J0cyB0byBwcm90ZWN0IHRoZSBjb25maWRlbnRpYWxpdHkgdGhlcmVvZiwgYW5kIHRvCisgICAgdXNlIHRoaXMgaW5mb3JtYXRpb24gb25seSBpbiBjb25uZWN0aW9uIHdpdGggeW91ciB1c2Ugb2YgQnJvYWRjb20KKyAgICBpbnRlZ3JhdGVkIGNpcmN1aXQgcHJvZHVjdHMuCisKKzIuIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIgorICAgIEFORCBXSVRIIEFMTCBGQVVMVFMgQU5EIEJST0FEQ09NIE1BS0VTIE5PIFBST01JU0VTLCBSRVBSRVNFTlRBVElPTlMgT1IKKyAgICBXQVJSQU5USUVTLCBFSVRIRVIgRVhQUkVTUywgSU1QTElFRCwgU1RBVFVUT1JZLCBPUiBPVEhFUldJU0UsIFdJVEgKKyAgICBSRVNQRUNUIFRPIFRIRSBTT0ZUV0FSRS4gIEJST0FEQ09NIFNQRUNJRklDQUxMWSBESVNDTEFJTVMgQU5ZIEFORAorICAgIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgVElUTEUsIE1FUkNIQU5UQUJJTElUWSwgTk9OSU5GUklOR0VNRU5ULAorICAgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBMQUNLIE9GIFZJUlVTRVMsIEFDQ1VSQUNZIE9SCisgICAgQ09NUExFVEVORVNTLCBRVUlFVCBFTkpPWU1FTlQsIFFVSUVUIFBPU1NFU1NJT04gT1IgQ09SUkVTUE9OREVOQ0UKKyAgICBUTyBERVNDUklQVElPTi4gWU9VIEFTU1VNRSBUSEUgRU5USVJFIFJJU0sgQVJJU0lORyBPVVQgT0YgVVNFIE9SCisgICAgUEVSRk9STUFOQ0UgT0YgVEhFIFNPRlRXQVJFLgorCiszLiBUTyBUSEUgTUFYSU1VTSBFWFRFTlQgUEVSTUlUVEVEIEJZIExBVywgSU4gTk8gRVZFTlQgU0hBTEwgQlJPQURDT00gT1IKKyAgICBJVFMgTElDRU5TT1JTIEJFIExJQUJMRSBGT1IgKGkpIENPTlNFUVVFTlRJQUwsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgICAgSU5ESVJFQ1QsIE9SIEVYRU1QTEFSWSBEQU1BR0VTIFdIQVRTT0VWRVIgQVJJU0lORyBPVVQgT0YgT1IgSU4gQU5ZCisgICAgV0FZIFJFTEFUSU5HIFRPIFlPVVIgVVNFIE9GIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFNPRlRXQVJFIEVWRU4KKyAgICBJRiBCUk9BRENPTSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVM7CisgICAgT1IgKGlpKSBBTlkgQU1PVU5UIElOIEVYQ0VTUyBPRiBUSEUgQU1PVU5UIEFDVFVBTExZIFBBSUQgRk9SIFRIRQorICAgIFNPRlRXQVJFIElUU0VMRiBPUiBVLlMuICQxLCBXSElDSEVWRVIgSVMgR1JFQVRFUi4gVEhFU0UgTElNSVRBVElPTlMKKyAgICBTSEFMTCBBUFBMWSBOT1RXSVRIU1RBTkRJTkcgQU5ZIEZBSUxVUkUgT0YgRVNTRU5USUFMIFBVUlBPU0UgT0YgQU5ZCisgICAgTElNSVRFRCBSRU1FRFkuCis6PgorKi8KKyNpbmNsdWRlIDxiY21vbHRfYnVmLmg+CisjaW5jbHVkZSA8YmNtb2x0X21zZy5oPgorI2luY2x1ZGUgImJjbW9sdF9tc2dfcGFjay5oIgorCit0eXBlZGVmIHVpbnQzMl90ICgqYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgKHZvaWQgKnRoaXMsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKK3R5cGVkZWYgYmNtb3NfYm9vbCAoKmJjbW9sdF9mdW5jX3BhY2spICh2b2lkICp0aGlzLCBiY21vbHRfYnVmICpidWYsIGJjbW9sdF9wcmVzZW5jZV9tYXNrIGZpZWxkc19wcmVzZW50KTsKK3R5cGVkZWYgYmNtb3NfYm9vbCAoKmJjbW9sdF9mdW5jX3VucGFjaykgKHZvaWQgKnRoaXMsIGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOwordHlwZWRlZiBiY21vc19ib29sICgqYmNtb2x0X2Z1bmNfbWVtX3NjYW4pIChiY21vbHRfYnVmICogYnVmLCB1aW50MzJfdCAqIGV4dHJhX21lbSwgYmNtb2x0X3ByZXNlbmNlX21hc2sgZmllbGRzX3ByZXNlbnQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2dyb3VwX2luZm8KK3sKKyAgICBiY21vbHRfb2JqX2lkIG9ial90eXBlOworICAgIGJjbW9sdF9tZ3RfZ3JvdXAgZ3JvdXA7CisgICAgdWludDE2X3Qgc3ViZ3JvdXA7CisgICAgdWludDMyX3Qgc2l6ZTsKKyAgICB1aW50MzJfdCBjb250YWluZXJfc2l6ZTsgICAgLyogc2l6ZW9mKCkgdGhlIGtleS9kYXRhIGNvbnRhaW5lciBzdHJ1Y3QgKDAgZm9yIGtleSBncm91cHMpICovCisgICAgdWludDMyX3QgZGF0YV9vZmZzZXQ7ICAgICAgIC8qIG9mZnNldG9mKCkgZGF0YSBmaWVsZCB3aXRoaW4gY29udGFpbmVyIHN0cnVjdCAoMCBmb3Iga2V5IGdyb3VwcykgKi8KKyAgICBiY21vbHRfZnVuY19wYWNrZWRfbGVuIGdldF9wYWNrZWRfbGVuZ3RoOworICAgIGJjbW9sdF9mdW5jX3BhY2sgcGFjazsKKyAgICBiY21vbHRfZnVuY191bnBhY2sgdW5wYWNrOworICAgIGJjbW9sdF9mdW5jX21lbV9zY2FuIG1lbV9zY2FuOworfSBiY21vbHRfZ3JvdXBfaW5mbzsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9ncm91cF9pZHMKK3sKKyAgICB1aW50MzJfdCBzdWJncm91cF9jb3VudDsKKyAgICBiY21vbHRfZ3JvdXBfaWQgKnN1Ymdyb3VwX2lkczsKK30gYmNtb2x0X2dyb3VwX2lkczsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9pbnN0YW5jZV9pbmZvCit7CisgICAgaW50OF90IG9mZnNldDsKKyAgICBpbnQ4X3Qgc2l6ZTsKK30gYmNtb2x0X2luc3RhbmNlX2luZm87CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19hZV9uaV9rZXkgPSB7IEJDTU9MVF9PQkpfSURfQUVfTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBzaXplb2YoYmNtb2x0X2FlX25pX2tleSksIDAsIDAsIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfYWVfbmlfa2V5X2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2FlX25pX2tleV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfYWVfbmlfa2V5X3VucGFjaywgYmNtb2x0X2FlX25pX2tleV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19hZV9uaV9jZmcgPSB7IEJDTU9MVF9PQkpfSURfQUVfTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBzaXplb2YoYmNtb2x0X2FlX25pX2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9hZV9uaV9jZmcpLCBvZmZzZXRvZihiY21vbHRfYWVfbmlfY2ZnLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9hZV9uaV9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9hZV9uaV9jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfYWVfbmlfY2ZnX2RhdGFfdW5wYWNrLCBiY21vbHRfYWVfbmlfY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlID0geyBCQ01PTFRfT0JKX0lEX0FFX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDAsIHNpemVvZihiY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2RhdGEpLCBzaXplb2YoYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZSksIG9mZnNldG9mKGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGUsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfZGF0YV91bnBhY2ssIGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19hZV9wYXRoX2RzX2tleSA9IHsgQkNNT0xUX09CSl9JRF9BRV9QQVRIX0RTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX2RzX2tleSksIDAsIDAsIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfYWVfcGF0aF9kc19rZXlfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfYWVfcGF0aF9kc19rZXlfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2FlX3BhdGhfZHNfa2V5X3VucGFjaywgYmNtb2x0X2FlX3BhdGhfZHNfa2V5X3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2FlX3BhdGhfZHNfc3RhdCA9IHsgQkNNT0xUX09CSl9JRF9BRV9QQVRIX0RTLCBCQ01PTFRfTUdUX0dST1VQX1NUQVQsIDAsIHNpemVvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGEpLCBzaXplb2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdCksIG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YV91bnBhY2ssIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19hZV9wYXRoX2RzX3N0YXRfY2ZnID0geyBCQ01PTFRfT0JKX0lEX0FFX1BBVEhfRFMsIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkcsIDAsIHNpemVvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWQgPSB7IEJDTU9MVF9PQkpfSURfQUVfUEFUSF9EUywgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAwLCBzaXplb2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpLCBzaXplb2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkKSwgb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrLCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkID0geyBCQ01PTFRfT0JKX0lEX0FFX1BBVEhfRFMsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMSwgc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpLCBzaXplb2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWQpLCBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3VucGFjaywgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19hZV9wYXRoX2RzX2F1dG9fY2ZnID0geyBCQ01PTFRfT0JKX0lEX0FFX1BBVEhfRFMsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIHNpemVvZihiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fYWVfcGF0aF91c19rZXkgPSB7IEJDTU9MVF9PQkpfSURfQUVfUEFUSF9VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIHNpemVvZihiY21vbHRfYWVfcGF0aF91c19rZXkpLCAwLCAwLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2FlX3BhdGhfdXNfa2V5X2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2FlX3BhdGhfdXNfa2V5X3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9hZV9wYXRoX3VzX2tleV91bnBhY2ssIGJjbW9sdF9hZV9wYXRoX3VzX2tleV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19hZV9wYXRoX3VzX3N0YXQgPSB7IEJDTU9MVF9PQkpfSURfQUVfUEFUSF9VUywgQkNNT0xUX01HVF9HUk9VUF9TVEFULCAwLCBzaXplb2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXQpLCBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0LCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGFfdW5wYWNrLCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fYWVfcGF0aF91c19zdGF0X2NmZyA9IHsgQkNNT0xUX09CSl9JRF9BRV9QQVRIX1VTLCBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHLCAwLCBzaXplb2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfZGF0YSksIHNpemVvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZyksIG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2RhdGFfdW5wYWNrLCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkID0geyBCQ01PTFRfT0JKX0lEX0FFX1BBVEhfVVMsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMCwgc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZCksIG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3VucGFjaywgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZCA9IHsgQkNNT0xUX09CSl9JRF9BRV9QQVRIX1VTLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDEsIHNpemVvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkKSwgb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fYWVfcGF0aF91c19hdXRvX2NmZyA9IHsgQkNNT0xUX09CSl9JRF9BRV9QQVRIX1VTLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBzaXplb2YoYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfZGF0YSksIHNpemVvZihiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZyksIG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2RhdGFfdW5wYWNrLCBiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2NoYW5uZWxfa2V5ID0geyBCQ01PTFRfT0JKX0lEX0NIQU5ORUwsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBzaXplb2YoYmNtb2x0X2NoYW5uZWxfa2V5KSwgMCwgMCwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9jaGFubmVsX2tleV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9jaGFubmVsX2tleV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfY2hhbm5lbF9rZXlfdW5wYWNrLCBiY21vbHRfY2hhbm5lbF9rZXlfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fY2hhbm5lbF9jZmcgPSB7IEJDTU9MVF9PQkpfSURfQ0hBTk5FTCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIHNpemVvZihiY21vbHRfY2hhbm5lbF9jZmdfZGF0YSksIHNpemVvZihiY21vbHRfY2hhbm5lbF9jZmcpLCBvZmZzZXRvZihiY21vbHRfY2hhbm5lbF9jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2NoYW5uZWxfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfY2hhbm5lbF9jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfY2hhbm5lbF9jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9jaGFubmVsX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2RlYnVnX2tleSA9IHsgQkNNT0xUX09CSl9JRF9ERUJVRywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIHNpemVvZihiY21vbHRfZGVidWdfa2V5KSwgMCwgMCwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9kZWJ1Z19rZXlfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZGVidWdfa2V5X3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9kZWJ1Z19rZXlfdW5wYWNrLCBiY21vbHRfZGVidWdfa2V5X3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2RlYnVnX2NmZyA9IHsgQkNNT0xUX09CSl9JRF9ERUJVRywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIHNpemVvZihiY21vbHRfZGVidWdfY2ZnX2RhdGEpLCBzaXplb2YoYmNtb2x0X2RlYnVnX2NmZyksIG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2RlYnVnX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2RlYnVnX2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9kZWJ1Z19jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9kZWJ1Z19jZmdfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19kZWJ1Z19jbGlfb3V0cHV0ID0geyBCQ01PTFRfT0JKX0lEX0RFQlVHLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDAsIHNpemVvZihiY21vbHRfZGVidWdfY2xpX291dHB1dF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0KSwgb2Zmc2V0b2YoYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfZGF0YV91bnBhY2ssIGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZGVidWdfZmlsZV9hbG1vc3RfZnVsbCA9IHsgQkNNT0xUX09CSl9JRF9ERUJVRywgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAxLCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19kZWJ1Z19hdXRvX2NmZyA9IHsgQkNNT0xUX09CSl9JRF9ERUJVRywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9kZWJ1Z19hdXRvX2NmZyksIG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19hdXRvX2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZGVidWdfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZGVidWdfY2xpX2lucHV0ID0geyBCQ01PTFRfT0JKX0lEX0RFQlVHLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDAsIHNpemVvZihiY21vbHRfZGVidWdfY2xpX2lucHV0X2RhdGEpLCBzaXplb2YoYmNtb2x0X2RlYnVnX2NsaV9pbnB1dCksIG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfZGF0YV91bnBhY2ssIGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19kZWJ1Z19yZXNldF9hcGlfY2FwdHVyZSA9IHsgQkNNT0xUX09CSl9JRF9ERUJVRywgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCAxLCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19kZWJ1Z19zdGFydF9hcGlfY2FwdHVyZSA9IHsgQkNNT0xUX09CSl9JRF9ERUJVRywgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCAyLCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19kZWJ1Z19zdG9wX2FwaV9jYXB0dXJlID0geyBCQ01PTFRfT0JKX0lEX0RFQlVHLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDMsIDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2RldmljZV9rZXkgPSB7IEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgc2l6ZW9mKGJjbW9sdF9kZXZpY2Vfa2V5KSwgMCwgMCwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9kZXZpY2Vfa2V5X2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2RldmljZV9rZXlfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2RldmljZV9rZXlfdW5wYWNrLCBiY21vbHRfZGV2aWNlX2tleV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19kZXZpY2VfY2ZnID0geyBCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIHNpemVvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9kZXZpY2VfY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2RldmljZV9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2RldmljZV9jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGUgPSB7IEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDAsIHNpemVvZihiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfZGF0YSksIHNpemVvZihiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGUpLCBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGUsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfZGF0YV91bnBhY2ssIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2RldmljZV9jb25uZWN0aW9uX2VzdGFibGlzaGVkID0geyBCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAxLCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlID0geyBCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAyLCBzaXplb2YoYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfZGF0YSksIHNpemVvZihiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZSksIG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2RhdGFfdW5wYWNrLCBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZSA9IHsgQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMywgc2l6ZW9mKGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfZGF0YSksIHNpemVvZihiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlKSwgb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9kYXRhX3VucGFjaywgYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZSA9IHsgQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgNCwgc2l6ZW9mKGJjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfZGF0YSksIHNpemVvZihiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlKSwgb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9kYXRhX3VucGFjaywgYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2RldmljZV9kZXZpY2VfcmVhZHkgPSB7IEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDUsIHNpemVvZihiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5KSwgb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHksIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfZGF0YV91bnBhY2ssIGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZGV2aWNlX2Rpc2Nvbm5lY3Rpb25fY29tcGxldGUgPSB7IEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDYsIDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZSA9IHsgQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgNywgc2l6ZW9mKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YSksIHNpemVvZihiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlKSwgb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9kYXRhX3VucGFjaywgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkID0geyBCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCA4LCBzaXplb2YoYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2RhdGEpLCBzaXplb2YoYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkKSwgb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2RhdGFfdW5wYWNrLCBiY21vbHRfZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19kZXZpY2Vfc3dfZXJyb3IgPSB7IEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDksIHNpemVvZihiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2RhdGEpLCBzaXplb2YoYmNtb2x0X2RldmljZV9zd19lcnJvciksIG9mZnNldG9mKGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3IsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2RldmljZV9zd19lcnJvcl9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2RldmljZV9zd19lcnJvcl9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfZGF0YV91bnBhY2ssIGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19kZXZpY2Vfc3dfZXhjZXB0aW9uID0geyBCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAxMCwgc2l6ZW9mKGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2RhdGEpLCBzaXplb2YoYmNtb2x0X2RldmljZV9zd19leGNlcHRpb24pLCBvZmZzZXRvZihiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbiwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25fZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9kYXRhX3VucGFjaywgYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25fZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19kZXZpY2VfYXV0b19jZmcgPSB7IEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBzaXplb2YoYmNtb2x0X2RldmljZV9hdXRvX2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9kZXZpY2VfYXV0b19jZmcpLCBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2F1dG9fY2ZnLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGFfdW5wYWNrLCBiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZGV2aWNlX2Nvbm5lY3QgPSB7IEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDAsIDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2RldmljZV9kaXNjb25uZWN0ID0geyBCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCAxLCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19kZXZpY2VfaG9zdF9rZWVwX2FsaXZlID0geyBCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCAyLCBzaXplb2YoYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfZGF0YSksIHNpemVvZihiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZSksIG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2RhdGFfdW5wYWNrLCBiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhID0geyBCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCAzLCBzaXplb2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2RhdGEpLCBzaXplb2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhKSwgb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2RhdGFfdW5wYWNrLCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnQgPSB7IEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDQsIHNpemVvZihiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2RhdGEpLCBzaXplb2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydCksIG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfZGF0YV91bnBhY2ssIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19kZXZpY2VfcmVzZXQgPSB7IEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDUsIHNpemVvZihiY21vbHRfZGV2aWNlX3Jlc2V0X2RhdGEpLCBzaXplb2YoYmNtb2x0X2RldmljZV9yZXNldCksIG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfcmVzZXQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2RldmljZV9yZXNldF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2RldmljZV9yZXNldF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9kZXZpY2VfcmVzZXRfZGF0YV91bnBhY2ssIGJjbW9sdF9kZXZpY2VfcmVzZXRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19kZXZpY2VfcnVuX2Rkcl90ZXN0ID0geyBCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCA2LCBzaXplb2YoYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfZGF0YSksIHNpemVvZihiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdCksIG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0LCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2RhdGFfdW5wYWNrLCBiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2RldmljZV9zd191cGdyYWRlX2FjdGl2YXRlID0geyBCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCA3LCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX2RlbmllZF9saW5rX2tleSA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX0RFTklFRF9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSksIDAsIDAsIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXlfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXlfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5X3VucGFjaywgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5X3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fZGVuaWVkX2xpbmtfY2ZnID0geyBCQ01PTFRfT0JKX0lEX0VQT05fREVOSUVEX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2RhdGFfdW5wYWNrLCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb24gPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9ERU5JRURfTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAwLCBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb24pLCBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uX2RhdGFfdW5wYWNrLCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uID0geyBCQ01PTFRfT0JKX0lEX0VQT05fREVOSUVEX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMSwgc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb25fZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbiwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uID0geyBCQ01PTFRfT0JKX0lEX0VQT05fREVOSUVEX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMiwgc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbiksIG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbiwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25fZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbiA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX0RFTklFRF9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDMsIHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb24sIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25fZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25fZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb24gPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9ERU5JRURfTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCA0LCBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uX2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uX2RhdGFfdW5wYWNrLCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25fZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbiA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX0RFTklFRF9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDUsIHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25fZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb24pLCBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb24sIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25fZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25fZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbiA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX0RFTklFRF9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDYsIHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbiksIG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb24sIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25fZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25fZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWQgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9ERU5JRURfTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCA3LCBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWQpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX2RhdGFfdW5wYWNrLCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uID0geyBCQ01PTFRfT0JKX0lEX0VQT05fREVOSUVEX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgOCwgc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb25fZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbiwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbiA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX0RFTklFRF9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDksIHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbiksIG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb24sIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbl9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbl9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25fZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25fZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnID0geyBCQ01PTFRfT0JKX0lEX0VQT05fREVOSUVEX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9saW5rX2tleSA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXkpLCAwLCAwLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fbGlua19rZXlfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9saW5rX2tleV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9saW5rX2tleV91bnBhY2ssIGJjbW9sdF9lcG9uX2xpbmtfa2V5X3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fbGlua19jZmcgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19jZmcpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX2xpbmtfc3RhdCA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfU1RBVCwgMCwgc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdCksIG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9saW5rX3N0YXRfY2ZnID0geyBCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdCA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMCwgc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0KSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fbGlua19lbmNyeXB0aW9uX2VuYWJsZWQgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDEsIDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZSA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMiwgc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRlZCA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMywgMCwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdG9wcGVkID0geyBCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCA0LCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX2xpbmtfbGlua19kZWxldGVkID0geyBCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCA1LCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaCA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgNiwgc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaCksIG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9saW5rX21wY3BfZGVyZWdpc3RlcmVkID0geyBCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCA3LCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkID0geyBCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCA4LCBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZCksIG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2RhdGFfdW5wYWNrLCBiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fbGlua19tcGNwX3JlZ19hY2tfdGltZW91dCA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgOSwgMCwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXQgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDEwLCBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0X2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0KSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0LCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0X2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0X2RhdGFfdW5wYWNrLCBiY21vbHRfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0ID0geyBCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAxMSwgc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXQpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydGVkID0geyBCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAxMiwgMCwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZCA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMTMsIDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWQgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDE0LCBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZCksIG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2RhdGFfdW5wYWNrLCBiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZCA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMTUsIHNpemVvZihiY21vbHRfZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkX2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZCksIG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZCA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMTYsIHNpemVvZihiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWQpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fbGlua19yZXJhbmdlX2ZhaWx1cmUgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDE3LCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkID0geyBCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAxOCwgc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWQpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWQgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDE5LCBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWQpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfdW5wYWNrLCBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZG9uZSA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMjAsIDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fbGlua19hdXRvX2NmZyA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIHNpemVvZihiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZyksIG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX2xpbmtfZGVsZXRlX2xpbmsgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDAsIDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fbGlua19mb3JjZV9yZWRpc2NvdmVyeSA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgMSwgMCwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydCA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgMiwgc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnQpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3AgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDMsIDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0ID0geyBCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCA0LCBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0KSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0LCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2RhdGFfdW5wYWNrLCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wID0geyBCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCA1LCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbiA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgNiwgc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbiksIG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbiwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9saW5rX2luamVjdF9mcmFtZSA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFksIDAsIHNpemVvZihiY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZV9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWUsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkID0geyBCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9QUk9YWV9SWCwgMCwgc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fbmlfa2V5ID0geyBCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBzaXplb2YoYmNtb2x0X2Vwb25fbmlfa2V5KSwgMCwgMCwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX25pX2tleV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX25pX2tleV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9uaV9rZXlfdW5wYWNrLCBiY21vbHRfZXBvbl9uaV9rZXlfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9uaV9jZmcgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIHNpemVvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9uaV9jZmcpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9uaV9jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9uaV9jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlID0geyBCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMCwgMCwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZSA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDEsIDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZCA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDIsIHNpemVvZihiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZCksIG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX25pX21wY3BfdGltZXN0YW1wX2NoYW5nZWQgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAzLCBzaXplb2YoYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX25pX21wY3BfdGltZXN0YW1wX2NoYW5nZWQpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX25pX21wY3BfdGltZXN0YW1wX2NoYW5nZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX25pX21wY3BfdGltZXN0YW1wX2NoYW5nZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGFfdW5wYWNrLCBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9uaV9ub19yZXBvcnRzID0geyBCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgNCwgc2l6ZW9mKGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0cywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0c19kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0c19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGUgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCA1LCBzaXplb2YoYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZSksIG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGFfdW5wYWNrLCBiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fbmlfcmVyYW5nZV9mYWlsdXJlID0geyBCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgNiwgMCwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlID0geyBCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgNywgc2l6ZW9mKGJjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCA4LCBzaXplb2YoYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCksIG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGFfdW5wYWNrLCBiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDksIHNpemVvZihiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCksIG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX25pX2F1dG9fY2ZnID0geyBCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIHNpemVvZihiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYXV0b19jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9uaV9hZGRfbGluayA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDAsIHNpemVvZihiY21vbHRfZXBvbl9uaV9hZGRfbGlua19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2FkZF9saW5rKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmssIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX25pX2FkZF9saW5rX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX25pX2FkZF9saW5rX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmsgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCAxLCBzaXplb2YoYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2RhdGFfdW5wYWNrLCBiY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rID0geyBCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgMiwgc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmspLCBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGluaywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnQgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCAzLCBzaXplb2YoYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnQpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50LCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2RhdGFfdW5wYWNrLCBiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhID0geyBCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgNCwgc2l6ZW9mKGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YV9kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuID0geyBCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgNSwgc2l6ZW9mKGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2NhbiksIG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2NhbiwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW5fZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZSA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDYsIHNpemVvZihiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGUsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZSA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDcsIHNpemVvZihiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGUsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9vbnVfMTBnX3VzX2tleSA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBzaXplb2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkpLCAwLCAwLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXlfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleV91bnBhY2ssIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5X3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fb251XzEwZ191c19jZmcgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMTBHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmcpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX29udV8xMGdfdXNfc3RhdCA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfU1RBVCwgMCwgc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdCksIG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnID0geyBCQ01PTFRfT0JKX0lEX0VQT05fT05VXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmdfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWQgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMTBHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDAsIHNpemVvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkID0geyBCQ01PTFRfT0JKX0lEX0VQT05fT05VXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAxLCBzaXplb2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWQpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfdW5wYWNrLCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnID0geyBCQ01PTFRfT0JKX0lEX0VQT05fT05VXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fb251XzFnX3VzX2tleSA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIHNpemVvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5KSwgMCwgMCwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX29udV8xZ191c19rZXlfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5X3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX29udV8xZ191c19rZXlfdW5wYWNrLCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5X3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fb251XzFnX3VzX2NmZyA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIHNpemVvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZyksIG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX29udV8xZ191c19jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX29udV8xZ191c19jZmdfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX29udV8xZ191c19zdGF0ID0geyBCQ01PTFRfT0JKX0lEX0VQT05fT05VXzFHX1VTLCBCQ01PTFRfTUdUX0dST1VQX1NUQVQsIDAsIHNpemVvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0KSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmcgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkcsIDAsIHNpemVvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmcpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZCA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAwLCBzaXplb2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWQpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrLCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWQgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMSwgc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZCksIG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9vbnVfMWdfdXNfYXV0b19jZmcgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIHNpemVvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmcpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfZHNfa2V5ID0geyBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5KSwgMCwgMCwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXlfdW5wYWNrLCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXlfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9wYXRoXzEwZ19kc19jZmcgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19EUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmcpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfZHNfc3RhdCA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX0RTLCBCQ01PTFRfTUdUX0dST1VQX1NUQVQsIDAsIHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdCksIG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnID0geyBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkcsIDAsIHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWQgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19EUywgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAwLCBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrLCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkID0geyBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMSwgc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWQpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnID0geyBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9wYXRoXzEwZ191c19rZXkgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkpLCAwLCAwLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5X2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5X3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleV91bnBhY2ssIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX3VzX2NmZyA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZyksIG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9wYXRoXzEwZ191c19zdGF0ID0geyBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfU1RBVCwgMCwgc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0KSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmcgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmcpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZCA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDAsIHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWQpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWQgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAxLCBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZCksIG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfdW5wYWNrLCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmcgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmcpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfZHNfa2V5ID0geyBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19EUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSksIDAsIDAsIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5X3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5X3VucGFjaywgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXlfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX2RzX2NmZyA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZyksIG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGFfdW5wYWNrLCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fcGF0aF8xZ19kc19zdGF0ID0geyBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19EUywgQkNNT0xUX01HVF9HUk9VUF9TVEFULCAwLCBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0KSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0LCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGFfdW5wYWNrLCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmcgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX0RTLCBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHLCAwLCBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmcpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2RhdGFfdW5wYWNrLCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZCA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMCwgc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWQpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWQgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX0RTLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDEsIHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZCksIG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmcgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX0RTLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmcpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2RhdGFfdW5wYWNrLCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX3VzX2tleSA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkpLCAwLCAwLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXlfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleV91bnBhY2ssIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5X3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fcGF0aF8xZ191c19jZmcgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2RhdGEpLCBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmcpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfdXNfc3RhdCA9IHsgQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfU1RBVCwgMCwgc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdCksIG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnID0geyBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWQgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDAsIHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkID0geyBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAxLCBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWQpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfdW5wYWNrLCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnID0geyBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2Vwb25fcnBfa2V5ID0geyBCQ01PTFRfT0JKX0lEX0VQT05fUlAsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBzaXplb2YoYmNtb2x0X2Vwb25fcnBfa2V5KSwgMCwgMCwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9lcG9uX3JwX2tleV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9lcG9uX3JwX2tleV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9ycF9rZXlfdW5wYWNrLCBiY21vbHRfZXBvbl9ycF9rZXlfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZXBvbl9ycF9jZmcgPSB7IEJDTU9MVF9PQkpfSURfRVBPTl9SUCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIHNpemVvZihiY21vbHRfZXBvbl9ycF9jZmdfZGF0YSksIHNpemVvZihiY21vbHRfZXBvbl9ycF9jZmcpLCBvZmZzZXRvZihiY21vbHRfZXBvbl9ycF9jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2Vwb25fcnBfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZXBvbl9ycF9jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZXBvbl9ycF9jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9lcG9uX3JwX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwaW9fa2V5ID0geyBCQ01PTFRfT0JKX0lEX0dQSU8sIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBzaXplb2YoYmNtb2x0X2dwaW9fa2V5KSwgMCwgMCwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncGlvX2tleV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncGlvX2tleV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bpb19rZXlfdW5wYWNrLCBiY21vbHRfZ3Bpb19rZXlfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bpb19jZmcgPSB7IEJDTU9MVF9PQkpfSURfR1BJTywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIHNpemVvZihiY21vbHRfZ3Bpb19jZmdfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bpb19jZmcpLCBvZmZzZXRvZihiY21vbHRfZ3Bpb19jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwaW9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bpb19jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bpb19jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9ncGlvX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fYWxsb2Nfa2V5ID0geyBCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2Nfa2V5KSwgMCwgMCwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX2FsbG9jX2tleV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX2FsbG9jX2tleV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9hbGxvY19rZXlfdW5wYWNrLCBiY21vbHRfZ3Bvbl9hbGxvY19rZXlfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9hbGxvY19jZmcgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19jZmdfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19jZmcpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9hbGxvY19jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9hbGxvY19jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fYWxsb2Nfc3RhdCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX1NUQVQsIDAsIHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2Nfc3RhdCksIG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX2FsbG9jX3N0YXRfY2ZnID0geyBCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkcsIDAsIHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDAsIHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkID0geyBCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMSwgc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkID0geyBCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMiwgc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZCksIG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDMsIHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9hbGxvY19hdXRvX2NmZyA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZyksIG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fYWxsb2NfZ2V0X3N0YXRzID0geyBCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgMCwgc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0cyksIG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0cywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9hbGxvY19zZXRfc3RhdGUgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCAxLCBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX2dlbV9wb3J0X2tleSA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSksIDAsIDAsIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXlfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXlfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5X3VucGFjaywgYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5X3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fZ2VtX3BvcnRfY2ZnID0geyBCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX2dlbV9wb3J0X3N0YXQgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9TVEFULCAwLCBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXQpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0LCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZyA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHLCAwLCBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZyksIG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAwLCBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCksIG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkID0geyBCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMSwgc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZCksIG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDIsIHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZyA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZyksIG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlID0geyBCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgMCwgc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZSksIG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9pd2Zfa2V5ID0geyBCQ01PTFRfT0JKX0lEX0dQT05fSVdGLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9rZXkpLCAwLCAwLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25faXdmX2tleV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX2l3Zl9rZXlfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25faXdmX2tleV91bnBhY2ssIGJjbW9sdF9ncG9uX2l3Zl9rZXlfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9pd2ZfY2ZnID0geyBCQ01PTFRfT0JKX0lEX0dQT05fSVdGLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25faXdmX2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X2dwb25faXdmX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25faXdmX3N0YXQgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfU1RBVCwgMCwgc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25faXdmX3N0YXQpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc3RhdCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX2l3Zl9zdGF0X2NmZyA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZyksIG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X2dwb25faXdmX3N0YXRfY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAwLCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWQgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMSwgc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAyLCBzaXplb2YoYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWQpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWQgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMywgc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZCksIG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9pd2ZfYXV0b19jZmcgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmcpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25faXdmX2ZsdXNoX21hY190YWJsZSA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCAwLCBzaXplb2YoYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGUpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGUgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgMSwgc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZSksIG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5ID0geyBCQ01PTFRfT0JKX0lEX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXkpLCAwLCAwLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXlfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleV91bnBhY2ssIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXlfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnID0geyBCQ01PTFRfT0JKX0lEX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXkgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5KSwgMCwgMCwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXlfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXlfdW5wYWNrLCBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnID0geyBCQ01PTFRfT0JKX0lEX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9NQUNfVEFCTEUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBzaXplb2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkpLCAwLCAwLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXlfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleV91bnBhY2ssIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25faXdmX21hY190YWJsZV9jZmcgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfTUFDX1RBQkxFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmcpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2FnZWQgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfTUFDX1RBQkxFLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDAsIDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9NQUNfVEFCTEUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMSwgc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZSA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9NQUNfVEFCTEUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMiwgc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjID0geyBCQ01PTFRfT0JKX0lEX0dQT05fSVdGX01BQ19UQUJMRSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAzLCBzaXplb2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmcgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfTUFDX1RBQkxFLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBzaXplb2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmcpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9pd2ZfdXNfZmxvd19rZXkgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfVVNfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXkpLCAwLCAwLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5X2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5X3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleV91bnBhY2ssIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX2l3Zl91c19mbG93X2NmZyA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9VU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZyksIG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9uaV9rZXkgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIHNpemVvZihiY21vbHRfZ3Bvbl9uaV9rZXkpLCAwLCAwLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fbmlfa2V5X2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fbmlfa2V5X3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX25pX2tleV91bnBhY2ssIGJjbW9sdF9ncG9uX25pX2tleV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX25pX2NmZyA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2NmZyksIG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9uaV9zdGF0ID0geyBCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfU1RBVCwgMCwgc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9uaV9zdGF0KSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fbmlfc3RhdF9jZmcgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fbmlfc3RhdF9jZmcpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDAsIDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZSA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDEsIHNpemVvZihiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZSksIG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmUsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkID0geyBCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMiwgMCwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDMsIDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDQsIDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fbmlfbG9zID0geyBCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgNSwgc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2xvc19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2xvcyksIG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2xvcywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9uaV9sb3NfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX25pX2xvc19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX25pX2xvc19kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fbmlfbG9zX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDYsIHNpemVvZihiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZSA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDcsIHNpemVvZihiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGUsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDgsIHNpemVvZihiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDksIHNpemVvZihiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDEwLCBzaXplb2YoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSksIG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDExLCBzaXplb2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAxMiwgMCwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0ID0geyBCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMTMsIDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAxNCwgc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDE1LCBzaXplb2YoYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkID0geyBCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMTYsIHNpemVvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9yYWlzZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkID0geyBCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMTcsIHNpemVvZihiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCksIG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDE4LCBzaXplb2YoYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX25pX2F1dG9fY2ZnID0geyBCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIHNpemVvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfYXV0b19jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXIgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCAwLCBzaXplb2YoYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlID0geyBCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgMSwgc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGUpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX25pX3Jlc2V0ID0geyBCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgMiwgMCwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93ID0geyBCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgMywgc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93KSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fbmlfc2V0X29udV9zdGF0ZSA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDQsIHNpemVvZihiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZSksIG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGUsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX25pX3NldF9wb25fc3RhdGUgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCA1LCBzaXplb2YoYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGUpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nID0geyBCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgNiwgMCwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZSA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDcsIHNpemVvZihiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGUsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9uaV90b2RfcmVxdWVzdCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDgsIDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX1BST1hZLCAwLCBzaXplb2YoYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXQpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0LCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9uaV9jcHVfcGFja2V0cyA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX1BST1hZLCAxLCBzaXplb2YoYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0cyksIG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fb251X2tleSA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KSwgMCwgMCwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX29udV9rZXlfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfa2V5X3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX29udV9rZXlfdW5wYWNrLCBiY21vbHRfZ3Bvbl9vbnVfa2V5X3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fb251X2NmZyA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fb251X2NmZyksIG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fb251X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fb251X2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX29udV9zdGF0ID0geyBCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX1NUQVQsIDAsIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9zdGF0KSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N0YXQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9vbnVfc3RhdF9jZmcgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkcsIDAsIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmcpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAwLCBzaXplb2YoYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9vbnVfZGZpID0geyBCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDEsIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fb251X2RmaSksIG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9kZmksIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fb251X2RmaV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fb251X2RmaV9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX29udV9kZmlfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX29udV9kZmlfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX29udV9kZ2kgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMiwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9kZ2lfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfZGdpKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2RnaSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9vbnVfZGdpX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfZGdpX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fb251X2RnaV9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fb251X2RnaV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fb251X2Rvd2kgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMywgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9kb3dpX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fb251X2Rvd2kpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfZG93aSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9vbnVfZG93aV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fb251X2Rvd2lfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfZG93aV9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fb251X2Rvd2lfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX29udV9lcnIgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgNCwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9lcnJfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfZXJyKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2VyciwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9vbnVfZXJyX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfZXJyX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fb251X2Vycl9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fb251X2Vycl9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnQgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgNSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnQpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkID0geyBCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDYsIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgNywgMCwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWQgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgOCwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZCksIG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCA5LCBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCksIG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0ID0geyBCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDEwLCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAxMSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleCksIG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9vbnVfbG9haSA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAxMiwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9sb2FpX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fb251X2xvYWkpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfbG9haSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9vbnVfbG9haV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fb251X2xvYWlfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfbG9haV9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fb251X2xvYWlfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX29udV9sb2tpID0geyBCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDEzLCBzaXplb2YoYmNtb2x0X2dwb25fb251X2xva2lfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfbG9raSksIG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9sb2tpLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX29udV9sb2tpX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfbG9raV9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX29udV9sb2tpX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9vbnVfbG9raV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fb251X21lbWkgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMTQsIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfbWVtaV9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9tZW1pKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X21lbWksIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fb251X21lbWlfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX29udV9tZW1pX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fb251X21lbWlfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX29udV9tZW1pX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkID0geyBCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDE1LCBzaXplb2YoYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkID0geyBCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDE2LCBzaXplb2YoYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWQgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMTcsIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWQpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fb251X29udV9hbGFybSA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAxOCwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1fZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29udV9hbGFybSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fb251X29udV9hbGFybV9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fb251X29udV9hbGFybV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkID0geyBCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDE5LCBzaXplb2YoYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWQgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMjAsIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZCksIG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAyMSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZCksIG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uID0geyBCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDIyLCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWQgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMjMsIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZCksIG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX29udV9wZWUgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMjQsIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfcGVlX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fb251X3BlZSksIG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9wZWUsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fb251X3BlZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fb251X3BlZV9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX29udV9wZWVfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX29udV9wZWVfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX29udV9wb3NzaWJsZV9kcmlmdCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAyNSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdCksIG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMjYsIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fb251X3BzdCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAyNywgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9wc3RfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfcHN0KSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3BzdCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9vbnVfcHN0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfcHN0X2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fb251X3BzdF9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fb251X3BzdF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkID0geyBCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDI4LCBzaXplb2YoYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX29udV9yZWkgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMjksIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfcmVpX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fb251X3JlaSksIG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9yZWksIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fb251X3JlaV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fb251X3JlaV9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX29udV9yZWlfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX29udV9yZWlfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAzMCwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCksIG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9vbnVfc2RpID0geyBCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDMxLCBzaXplb2YoYmNtb2x0X2dwb25fb251X3NkaV9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9zZGkpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc2RpLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX29udV9zZGlfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX29udV9zZGlfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfc2RpX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9vbnVfc2RpX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9vbnVfc2ZpID0geyBCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDMyLCBzaXplb2YoYmNtb2x0X2dwb25fb251X3NmaV9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9zZmkpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc2ZpLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX29udV9zZmlfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX29udV9zZmlfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfc2ZpX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9vbnVfc2ZpX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkID0geyBCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDMzLCBzaXplb2YoYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWQpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWQgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMzQsIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWQpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fb251X3N1ZmkgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMzUsIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfc3VmaV9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9zdWZpKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N1ZmksIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fb251X3N1ZmlfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX29udV9zdWZpX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fb251X3N1ZmlfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX29udV9zdWZpX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9vbnVfdGl3aSA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAzNiwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV90aXdpX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fb251X3Rpd2kpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfdGl3aSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9vbnVfdGl3aV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fb251X3Rpd2lfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfdGl3aV9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fb251X3Rpd2lfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX29udV9hdXRvX2NmZyA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZyksIG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsID0geyBCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDAsIHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbCksIG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWwsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfZGF0YV91bnBhY2ssIGJjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX29udV9yc3NpX21lYXN1cmVtZW50ID0geyBCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDEsIDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2dwb25fb251X3NldF9vbnVfc3RhdGUgPSB7IEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgMiwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGUpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX29udV9jcHVfcGFja2V0cyA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9QUk9YWSwgMCwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0cyksIG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0cywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9vbnVfcGxvYW1fcGFja2V0ID0geyBCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX1BST1hZLCAxLCBzaXplb2YoYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXQpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0LCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGFfdW5wYWNrLCBiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl9vbnVfY3B1X3BhY2tldCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9QUk9YWV9SWCwgMCwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2RhdGEpLCBzaXplb2YoYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXQpLCBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ncG9uX29udV9vbWNpX3BhY2tldCA9IHsgQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9QUk9YWV9SWCwgMSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldCksIG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl90cnhfa2V5ID0geyBCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgc2l6ZW9mKGJjbW9sdF9ncG9uX3RyeF9rZXkpLCAwLCAwLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2dwb25fdHJ4X2tleV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ncG9uX3RyeF9rZXlfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fdHJ4X2tleV91bnBhY2ssIGJjbW9sdF9ncG9uX3RyeF9rZXlfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fZ3Bvbl90cnhfY2ZnID0geyBCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSksIHNpemVvZihiY21vbHRfZ3Bvbl90cnhfY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2xvZ19lbnRyeV9rZXkgPSB7IEJDTU9MVF9PQkpfSURfTE9HX0VOVFJZLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgc2l6ZW9mKGJjbW9sdF9sb2dfZW50cnlfa2V5KSwgMCwgMCwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9sb2dfZW50cnlfa2V5X2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2xvZ19lbnRyeV9rZXlfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2xvZ19lbnRyeV9rZXlfdW5wYWNrLCBiY21vbHRfbG9nX2VudHJ5X2tleV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19sb2dfZW50cnlfY2ZnID0geyBCQ01PTFRfT0JKX0lEX0xPR19FTlRSWSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIHNpemVvZihiY21vbHRfbG9nX2VudHJ5X2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9sb2dfZW50cnlfY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2xvZ19lbnRyeV9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2xvZ19lbnRyeV9jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fbG9nX2VudHJ5X3N0YXQgPSB7IEJDTU9MVF9PQkpfSURfTE9HX0VOVFJZLCBCQ01PTFRfTUdUX0dST1VQX1NUQVQsIDAsIHNpemVvZihiY21vbHRfbG9nX2VudHJ5X3N0YXRfZGF0YSksIHNpemVvZihiY21vbHRfbG9nX2VudHJ5X3N0YXQpLCBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X3N0YXQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfbG9nX2VudHJ5X3N0YXRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfbG9nX2VudHJ5X3N0YXRfZGF0YV91bnBhY2ssIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2xvZ19lbnRyeV9zdGF0X2NmZyA9IHsgQkNNT0xUX09CSl9JRF9MT0dfRU5UUlksIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkcsIDAsIHNpemVvZihiY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnX2RhdGEpLCBzaXplb2YoYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZyksIG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkID0geyBCQ01PTFRfT0JKX0lEX0xPR19FTlRSWSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAwLCBzaXplb2YoYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSksIHNpemVvZihiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZCksIG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrLCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZCA9IHsgQkNNT0xUX09CSl9JRF9MT0dfRU5UUlksIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMSwgc2l6ZW9mKGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSksIHNpemVvZihiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkKSwgb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3VucGFjaywgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2xvZ19lbnRyeV9hdXRvX2NmZyA9IHsgQkNNT0xUX09CSl9JRF9MT0dfRU5UUlksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIHNpemVvZihiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2RhdGEpLCBzaXplb2YoYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZyksIG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19sb2dnZXJfa2V5ID0geyBCQ01PTFRfT0JKX0lEX0xPR0dFUiwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIHNpemVvZihiY21vbHRfbG9nZ2VyX2tleSksIDAsIDAsIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfbG9nZ2VyX2tleV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9sb2dnZXJfa2V5X3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9sb2dnZXJfa2V5X3VucGFjaywgYmNtb2x0X2xvZ2dlcl9rZXlfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fbG9nZ2VyX2NmZyA9IHsgQkNNT0xUX09CSl9JRF9MT0dHRVIsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBzaXplb2YoYmNtb2x0X2xvZ2dlcl9jZmdfZGF0YSksIHNpemVvZihiY21vbHRfbG9nZ2VyX2NmZyksIG9mZnNldG9mKGJjbW9sdF9sb2dnZXJfY2ZnLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9sb2dnZXJfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfbG9nZ2VyX2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9sb2dnZXJfY2ZnX2RhdGFfdW5wYWNrLCBiY21vbHRfbG9nZ2VyX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX2xvZ2dlcl9zdGF0ID0geyBCQ01PTFRfT0JKX0lEX0xPR0dFUiwgQkNNT0xUX01HVF9HUk9VUF9TVEFULCAwLCBzaXplb2YoYmNtb2x0X2xvZ2dlcl9zdGF0X2RhdGEpLCBzaXplb2YoYmNtb2x0X2xvZ2dlcl9zdGF0KSwgb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9zdGF0LCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9sb2dnZXJfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2xvZ2dlcl9zdGF0X2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X2xvZ2dlcl9zdGF0X2RhdGFfdW5wYWNrLCBiY21vbHRfbG9nZ2VyX3N0YXRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19sb2dnZXJfc3RhdF9jZmcgPSB7IEJDTU9MVF9PQkpfSURfTE9HR0VSLCBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHLCAwLCBzaXplb2YoYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9sb2dnZXJfc3RhdF9jZmcpLCBvZmZzZXRvZihiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9sb2dnZXJfc3RhdF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9sb2dnZXJfc3RhdF9jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2RhdGFfdW5wYWNrLCBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZCA9IHsgQkNNT0xUX09CSl9JRF9MT0dHRVIsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMCwgc2l6ZW9mKGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpLCBzaXplb2YoYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWQpLCBvZmZzZXRvZihiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3VucGFjaywgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWQgPSB7IEJDTU9MVF9PQkpfSURfTE9HR0VSLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDEsIHNpemVvZihiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpLCBzaXplb2YoYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZCksIG9mZnNldG9mKGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19sb2dnZXJfYXV0b19jZmcgPSB7IEJDTU9MVF9PQkpfSURfTE9HR0VSLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBzaXplb2YoYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF9sb2dnZXJfYXV0b19jZmcpLCBvZmZzZXRvZihiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9sb2dnZXJfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9sb2dnZXJfYXV0b19jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2RhdGFfdW5wYWNrLCBiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fbG9nZ2VyX2NsZWFyX2xvZyA9IHsgQkNNT0xUX09CSl9JRF9MT0dHRVIsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgMCwgMCwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fbm5pX2tleSA9IHsgQkNNT0xUX09CSl9JRF9OTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBzaXplb2YoYmNtb2x0X25uaV9rZXkpLCAwLCAwLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X25uaV9rZXlfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfbm5pX2tleV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfbm5pX2tleV91bnBhY2ssIGJjbW9sdF9ubmlfa2V5X3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX25uaV9jZmcgPSB7IEJDTU9MVF9PQkpfSURfTk5JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9ubmlfY2ZnX2RhdGEpLCBzaXplb2YoYmNtb2x0X25uaV9jZmcpLCBvZmZzZXRvZihiY21vbHRfbm5pX2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfbm5pX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X25uaV9jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfbm5pX2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X25uaV9jZmdfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb19ubmlfc3RhdCA9IHsgQkNNT0xUX09CSl9JRF9OTkksIEJDTU9MVF9NR1RfR1JPVVBfU1RBVCwgMCwgc2l6ZW9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ubmlfc3RhdCksIG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfbm5pX3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ubmlfc3RhdF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9ubmlfc3RhdF9kYXRhX3VucGFjaywgYmNtb2x0X25uaV9zdGF0X2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fbm5pX3N0YXRfY2ZnID0geyBCQ01PTFRfT0JKX0lEX05OSSwgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9ubmlfc3RhdF9jZmdfZGF0YSksIHNpemVvZihiY21vbHRfbm5pX3N0YXRfY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfbm5pX3N0YXRfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfbm5pX3N0YXRfY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X25uaV9zdGF0X2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X25uaV9zdGF0X2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX25uaV9zdGF0X2FsYXJtX2NsZWFyZWQgPSB7IEJDTU9MVF9PQkpfSURfTk5JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDAsIHNpemVvZihiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkKSwgb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV91bnBhY2ssIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fbm5pX3N0YXRfYWxhcm1fcmFpc2VkID0geyBCQ01PTFRfT0JKX0lEX05OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAxLCBzaXplb2YoYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWQpLCBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfdW5wYWNrLCBiY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fbm5pX3N0YXR1c19jaGFuZ2VkID0geyBCQ01PTFRfT0JKX0lEX05OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAyLCBzaXplb2YoYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWQpLCBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2RhdGFfdW5wYWNrLCBiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fbm5pX2F1dG9fY2ZnID0geyBCQ01PTFRfT0JKX0lEX05OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF9ubmlfYXV0b19jZmdfZGF0YSksIHNpemVvZihiY21vbHRfbm5pX2F1dG9fY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X25uaV9hdXRvX2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfbm5pX2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfbm5pX2F1dG9fY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X25uaV9hdXRvX2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X25uaV9hdXRvX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX25uaV9zZXJkZXNfa2V5ID0geyBCQ01PTFRfT0JKX0lEX05OSV9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBzaXplb2YoYmNtb2x0X25uaV9zZXJkZXNfa2V5KSwgMCwgMCwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9ubmlfc2VyZGVzX2tleV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF9ubmlfc2VyZGVzX2tleV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfbm5pX3NlcmRlc19rZXlfdW5wYWNrLCBiY21vbHRfbm5pX3NlcmRlc19rZXlfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fbm5pX3NlcmRlc19jZmcgPSB7IEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIHNpemVvZihiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YSksIHNpemVvZihiY21vbHRfbm5pX3NlcmRlc19jZmcpLCBvZmZzZXRvZihiY21vbHRfbm5pX3NlcmRlc19jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3NvZnR3YXJlX2Vycm9yX2tleSA9IHsgQkNNT0xUX09CSl9JRF9TT0ZUV0FSRV9FUlJPUiwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIHNpemVvZihiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5KSwgMCwgMCwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXlfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5X3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXlfdW5wYWNrLCBiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5X3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3NvZnR3YXJlX2Vycm9yX2NmZyA9IHsgQkNNT0xUX09CSl9JRF9TT0ZUV0FSRV9FUlJPUiwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIHNpemVvZihiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnX2RhdGEpLCBzaXplb2YoYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZyksIG9mZnNldG9mKGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb190cnhfY2FsaWJyYXRpb25fa2V5ID0geyBCQ01PTFRfT0JKX0lEX1RSWF9DQUxJQlJBVElPTiwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIHNpemVvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleSksIDAsIDAsIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5X3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5X3VucGFjaywgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXlfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkID0geyBCQ01PTFRfT0JKX0lEX1RSWF9DQUxJQlJBVElPTiwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAwLCBzaXplb2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWQpLCBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGFfdW5wYWNrLCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9fdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnID0geyBCQ01PTFRfT0JKX0lEX1RSWF9DQUxJQlJBVElPTiwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfZGF0YSksIHNpemVvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvdyA9IHsgQkNNT0xUX09CSl9JRF9UUlhfQ0FMSUJSQVRJT04sIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgMCwgc2l6ZW9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfZGF0YSksIHNpemVvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93KSwgb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvdywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhX3VucGFjaywgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93ID0geyBCQ01PTFRfT0JKX0lEX1RSWF9DQUxJQlJBVElPTiwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCAxLCBzaXplb2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2RhdGEpLCBzaXplb2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93KSwgb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93LCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvd19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2RhdGFfdW5wYWNrLCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9hbGxvY19rZXkgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX2tleSksIDAsIDAsIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fYWxsb2Nfa2V5X2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX2FsbG9jX2tleV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fYWxsb2Nfa2V5X3VucGFjaywgYmNtb2x0X3hncG9uX2FsbG9jX2tleV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9hbGxvY19jZmcgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19jZmcpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2NfY2ZnLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9hbGxvY19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9hbGxvY19jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fYWxsb2NfY2ZnX2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fYWxsb2NfY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fYWxsb2Nfc3RhdCA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9TVEFULCAwLCBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfc3RhdCksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0LCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX2FsbG9jX3N0YXRfY2ZnID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHLCAwLCBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZCA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAwLCBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkKSwgb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDEsIHNpemVvZihiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkKSwgb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDIsIHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZCksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZCA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAzLCBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkKSwgb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9hbGxvY19hdXRvX2NmZyA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZyksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fYWxsb2NfZ2V0X3N0YXRzID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDAsIHNpemVvZihiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0cyksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHMsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9hbGxvY19zZXRfc3RhdGUgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgMSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlKSwgb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX2dlbV9wb3J0X2tleSA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5KSwgMCwgMCwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXlfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5X3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXlfdW5wYWNrLCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5X3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX2dlbV9wb3J0X2NmZyA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZyksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmdfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9nZW1fcG9ydF9zdGF0ID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX1NUQVQsIDAsIHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0KSwgb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fZ2VtX3BvcnRfc3RhdF9jZmcgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkcsIDAsIHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmcpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZCA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAwLCBzaXplb2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWQpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWQgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZCksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fZ2VtX3BvcnRfYXV0b19jZmcgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmcpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX2l3Zl9rZXkgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fSVdGLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9pd2Zfa2V5KSwgMCwgMCwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9pd2Zfa2V5X2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX2l3Zl9rZXlfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX2l3Zl9rZXlfdW5wYWNrLCBiY21vbHRfeGdwb25faXdmX2tleV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9pd2ZfY2ZnID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIHNpemVvZihiY21vbHRfeGdwb25faXdmX2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2l3Zl9jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX2l3Zl9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX2l3Zl9jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fbmlfa2V5ID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9rZXkpLCAwLCAwLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX25pX2tleV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9uaV9rZXlfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX25pX2tleV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9uaV9rZXlfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fbmlfY2ZnID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fbmlfY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX25pX3N0YXQgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfU1RBVCwgMCwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX25pX3N0YXQpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9uaV9zdGF0X2NmZyA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgMCwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZyksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fbmlfc3RhdF9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDAsIDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmUgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmUpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAyLCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAzLCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDQsIDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX25pX2xvcyA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCA1LCBzaXplb2YoYmNtb2x0X3hncG9uX25pX2xvc19kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9sb3MpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfbG9zLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9uaV9sb3NfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9uaV9sb3NfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fbmlfbG9zX2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fbmlfbG9zX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fbmlfb251X2Rpc2NvdmVyZWQgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgNiwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZCksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGUgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgNywgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZSksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgOCwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgOSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMTAsIHNpemVvZihiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMTEsIHNpemVvZihiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkKSwgb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0ID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDEyLCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0ID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDEzLCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAxNCwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDE1LCBzaXplb2YoYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWQpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWQgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMTYsIHNpemVvZihiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWQpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWQgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMTcsIHNpemVvZihiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkKSwgb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDE4LCBzaXplb2YoYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWQpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fbmlfYXV0b19jZmcgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIHNpemVvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmcpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDAsIHNpemVvZihiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGgpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGgsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlciA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCAxLCBzaXplb2YoYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXIpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fbmlfcmVzZXQgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgMiwgMCwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdyA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCAzLCBzaXplb2YoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdyksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93LCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcCA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCA0LCBzaXplb2YoYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXApLCBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fbmlfc2V0X29udV9zdGF0ZSA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCA1LCBzaXplb2YoYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZSksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX25pX3NldF9wb25fc3RhdGUgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgNiwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGUpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDcsIDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDgsIHNpemVvZihiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGUpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGUsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX25pX3RvZF9yZXF1ZXN0ID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDksIDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXQgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFksIDAsIHNpemVvZihiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0KSwgb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fbmlfY3B1X3BhY2tldHMgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFksIDEsIHNpemVvZihiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHMpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHMsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX29udV9rZXkgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KSwgMCwgMCwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX29udV9rZXlfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX29udV9rZXlfdW5wYWNrLCBiY21vbHRfeGdwb25fb251X2tleV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9vbnVfY2ZnID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIHNpemVvZihiY21vbHRfeGdwb25fb251X2NmZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnKSwgb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fb251X3N0YXQgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX1NUQVQsIDAsIHNpemVvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fb251X3N0YXQpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX29udV9zdGF0X2NmZyA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkcsIDAsIHNpemVvZihiY21vbHRfeGdwb25fb251X3N0YXRfY2ZnX2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZyksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9vbnVfZGZpID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAwLCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9kZmlfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fb251X2RmaSksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfZGZpLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9vbnVfZGZpX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fb251X2RmaV9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9vbnVfZGZpX2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fb251X2RmaV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX29udV9kZ2kgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDEsIHNpemVvZihiY21vbHRfeGdwb25fb251X2RnaV9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfZGdpKSwgb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9kZ2ksIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX29udV9kZ2lfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9vbnVfZGdpX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX29udV9kZ2lfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9vbnVfZGdpX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fb251X2Rvd2kgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDIsIHNpemVvZihiY21vbHRfeGdwb25fb251X2Rvd2lfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fb251X2Rvd2kpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2Rvd2ksIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX29udV9kb3dpX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fb251X2Rvd2lfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fb251X2Rvd2lfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9vbnVfZG93aV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0ID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAzLCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0KSwgb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0LCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgNCwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fb251X2tleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCA1LCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgNiwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0ID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCA3LCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9vbnVfbG9vY2kgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDgsIHNpemVvZihiY21vbHRfeGdwb25fb251X2xvb2NpX2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9sb29jaSksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2ksIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX29udV9sb29jaV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX29udV9sb29jaV9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCA5LCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX29udV9vbnVfYWxhcm0gPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDEwLCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1fZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fb251X29udV9hbGFybSksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fb251X29udV9hbGFybV9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fb251X29udV9hbGFybV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMTEsIHNpemVvZihiY21vbHRfeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAxMiwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWQpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWQgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDEzLCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWQpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAxNCwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWRfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkKSwgb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWQgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDE1LCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZCksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb24gPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDE2LCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnQgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDE3LCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnQpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0LCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydCA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMTgsIHNpemVvZihiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0KSwgb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydCA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMTksIHNpemVvZihiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0KSwgb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAyMCwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlKSwgb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX29udV9wcXNpID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAyMSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcHFzaSksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcHFzaSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fb251X3Bxc2lfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX29udV9wcXNpX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAyMiwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkKSwgb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX29udV9yZWdpc3RyYXRpb25faWQgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDIzLCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZCksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMjQsIHNpemVvZihiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9vbnVfc2RpID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAyNSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfc2RpX2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zZGkpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3NkaSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fb251X3NkaV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX29udV9zZGlfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fb251X3NkaV9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX29udV9zZGlfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAyNiwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmUpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9vbnVfc2ZpID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAyNywgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zZmkpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3NmaSwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fb251X3NmaV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX29udV9zZmlfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fb251X3NmaV9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX29udV9zZmlfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCAyOCwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWQpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWQgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDI5LCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWQpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fb251X3N1ZmkgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDMwLCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zdWZpX2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zdWZpKSwgb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdWZpLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9vbnVfc3VmaV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX29udV9zdWZpX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX29udV9zdWZpX2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fb251X3N1ZmlfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9vbnVfdGl3aSA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUTywgMzEsIHNpemVvZihiY21vbHRfeGdwb25fb251X3Rpd2lfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fb251X3Rpd2kpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Rpd2ksIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX29udV90aXdpX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fb251X3Rpd2lfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fb251X3Rpd2lfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX29udV90dW5pbmdfcmVzcG9uc2UgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE8sIDMyLCBzaXplb2YoYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZSksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX29udV9hdXRvX2NmZyA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIHNpemVvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZyksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGggPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDAsIHNpemVvZihiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aCksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGgsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZyA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgMSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZyksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZywgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fb251X2dldF9wb3dlcl9jb25zdW1wdGlvbiA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgMiwgMCwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fb251X2dldF9wb3dlcl9sZXZlbCA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgMywgMCwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fb251X29udV90dW5pbmdfaW4gPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDQsIDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX29udV9vbnVfdHVuaW5nX291dCA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgNSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0KSwgb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbiA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgNiwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25fZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uKSwgb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbiwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2RhdGFfcGFjaywgKGJjbW9sdF9mdW5jX3VucGFjaykgYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50ID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCA3LCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbiA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgOCwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9kYXRhKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbiksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbiwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZGF0YV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2RhdGFfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fb251X3NldF9vbnVfc3RhdGUgPSB7IEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIDksIHNpemVvZihiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGUpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGUsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX29udV9jcHVfcGFja2V0cyA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFksIDAsIHNpemVvZihiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0cyksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHMsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9vbnVfcGxvYW1fcGFja2V0ID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9QUk9YWSwgMSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXQpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldCwgZGF0YSksIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhX3VucGFjaywgYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl9vbnVfY3B1X3BhY2tldCA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFlfUlgsIDAsIHNpemVvZihiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXQpLCBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfZGF0YV9wYWNrLCAoYmNtb2x0X2Z1bmNfdW5wYWNrKSBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hncG9uX29udV9vbWNpX3BhY2tldCA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFlfUlgsIDEsIHNpemVvZihiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2RhdGEpLCBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldCksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXQsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YV91bnBhY2ssIGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gZ3JvdXBfaW5mb194Z3Bvbl90cnhfa2V5ID0geyBCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIHNpemVvZihiY21vbHRfeGdwb25fdHJ4X2tleSksIDAsIDAsIChiY21vbHRfZnVuY19wYWNrZWRfbGVuKSBiY21vbHRfeGdwb25fdHJ4X2tleV9nZXRfcGFja2VkX2xlbmd0aCwgKGJjbW9sdF9mdW5jX3BhY2spIGJjbW9sdF94Z3Bvbl90cnhfa2V5X3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl90cnhfa2V5X3VucGFjaywgYmNtb2x0X3hncG9uX3RyeF9rZXlfc2NhbiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pbmZvIGdyb3VwX2luZm9feGdwb25fdHJ4X2NmZyA9IHsgQkNNT0xUX09CSl9JRF9YR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBzaXplb2YoYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSksIHNpemVvZihiY21vbHRfeGdwb25fdHJ4X2NmZyksIG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY2ZnLCBkYXRhKSwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGFfdW5wYWNrLCBiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhX3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hwb25fc2VyZGVzX2tleSA9IHsgQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIHNpemVvZihiY21vbHRfeHBvbl9zZXJkZXNfa2V5KSwgMCwgMCwgKGJjbW9sdF9mdW5jX3BhY2tlZF9sZW4pIGJjbW9sdF94cG9uX3NlcmRlc19rZXlfZ2V0X3BhY2tlZF9sZW5ndGgsIChiY21vbHRfZnVuY19wYWNrKSBiY21vbHRfeHBvbl9zZXJkZXNfa2V5X3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94cG9uX3NlcmRlc19rZXlfdW5wYWNrLCBiY21vbHRfeHBvbl9zZXJkZXNfa2V5X3NjYW4gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaW5mbyBncm91cF9pbmZvX3hwb25fc2VyZGVzX2NmZyA9IHsgQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIHNpemVvZihiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGEpLCBzaXplb2YoYmNtb2x0X3hwb25fc2VyZGVzX2NmZyksIG9mZnNldG9mKGJjbW9sdF94cG9uX3NlcmRlc19jZmcsIGRhdGEpLCAoYmNtb2x0X2Z1bmNfcGFja2VkX2xlbikgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoLCAoYmNtb2x0X2Z1bmNfcGFjaykgYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhX3BhY2ssIChiY21vbHRfZnVuY191bnBhY2spIGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YV91bnBhY2ssIGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YV9zY2FuIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2luZm8gKmdyb3VwX2luZm9bXSA9Cit7CisgICAgJmdyb3VwX2luZm9fYWVfbmlfa2V5LAorICAgICZncm91cF9pbmZvX2FlX25pX2NmZywKKyAgICAmZ3JvdXBfaW5mb19hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGUsCisgICAgJmdyb3VwX2luZm9fYWVfcGF0aF9kc19rZXksCisgICAgJmdyb3VwX2luZm9fYWVfcGF0aF9kc19zdGF0LAorICAgICZncm91cF9pbmZvX2FlX3BhdGhfZHNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fYWVfcGF0aF9kc19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19hZV9wYXRoX2RzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2FlX3BhdGhfZHNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fYWVfcGF0aF9kc19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19hZV9wYXRoX2RzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2FlX3BhdGhfZHNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fYWVfcGF0aF9kc19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19hZV9wYXRoX2RzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2FlX3BhdGhfZHNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fYWVfcGF0aF9kc19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19hZV9wYXRoX2RzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2FlX3BhdGhfZHNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fYWVfcGF0aF9kc19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19hZV9wYXRoX2RzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2FlX3BhdGhfZHNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fYWVfcGF0aF9kc19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZCwKKyAgICAmZ3JvdXBfaW5mb19hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkLAorICAgICZncm91cF9pbmZvX2FlX3BhdGhfZHNfYXV0b19jZmcsCisgICAgJmdyb3VwX2luZm9fYWVfcGF0aF91c19rZXksCisgICAgJmdyb3VwX2luZm9fYWVfcGF0aF91c19zdGF0LAorICAgICZncm91cF9pbmZvX2FlX3BhdGhfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fYWVfcGF0aF91c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19hZV9wYXRoX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2FlX3BhdGhfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fYWVfcGF0aF91c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19hZV9wYXRoX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2FlX3BhdGhfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fYWVfcGF0aF91c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19hZV9wYXRoX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2FlX3BhdGhfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fYWVfcGF0aF91c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19hZV9wYXRoX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2FlX3BhdGhfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fYWVfcGF0aF91c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19hZV9wYXRoX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2FlX3BhdGhfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fYWVfcGF0aF91c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19hZV9wYXRoX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2FlX3BhdGhfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fYWVfcGF0aF91c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZCwKKyAgICAmZ3JvdXBfaW5mb19hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkLAorICAgICZncm91cF9pbmZvX2FlX3BhdGhfdXNfYXV0b19jZmcsCisgICAgJmdyb3VwX2luZm9fY2hhbm5lbF9rZXksCisgICAgJmdyb3VwX2luZm9fY2hhbm5lbF9jZmcsCisgICAgJmdyb3VwX2luZm9fZGVidWdfa2V5LAorICAgICZncm91cF9pbmZvX2RlYnVnX2NmZywKKyAgICAmZ3JvdXBfaW5mb19kZWJ1Z19jbGlfb3V0cHV0LAorICAgICZncm91cF9pbmZvX2RlYnVnX2ZpbGVfYWxtb3N0X2Z1bGwsCisgICAgJmdyb3VwX2luZm9fZGVidWdfYXV0b19jZmcsCisgICAgJmdyb3VwX2luZm9fZGVidWdfY2xpX2lucHV0LAorICAgICZncm91cF9pbmZvX2RlYnVnX3Jlc2V0X2FwaV9jYXB0dXJlLAorICAgICZncm91cF9pbmZvX2RlYnVnX3N0YXJ0X2FwaV9jYXB0dXJlLAorICAgICZncm91cF9pbmZvX2RlYnVnX3N0b3BfYXBpX2NhcHR1cmUsCisgICAgJmdyb3VwX2luZm9fZGV2aWNlX2tleSwKKyAgICAmZ3JvdXBfaW5mb19kZXZpY2VfY2ZnLAorICAgICZncm91cF9pbmZvX2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlLAorICAgICZncm91cF9pbmZvX2RldmljZV9jb25uZWN0aW9uX2VzdGFibGlzaGVkLAorICAgICZncm91cF9pbmZvX2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmUsCisgICAgJmdyb3VwX2luZm9fZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlLAorICAgICZncm91cF9pbmZvX2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZSwKKyAgICAmZ3JvdXBfaW5mb19kZXZpY2VfZGV2aWNlX3JlYWR5LAorICAgICZncm91cF9pbmZvX2RldmljZV9kaXNjb25uZWN0aW9uX2NvbXBsZXRlLAorICAgICZncm91cF9pbmZvX2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZSwKKyAgICAmZ3JvdXBfaW5mb19kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZCwKKyAgICAmZ3JvdXBfaW5mb19kZXZpY2Vfc3dfZXJyb3IsCisgICAgJmdyb3VwX2luZm9fZGV2aWNlX3N3X2V4Y2VwdGlvbiwKKyAgICAmZ3JvdXBfaW5mb19kZXZpY2VfYXV0b19jZmcsCisgICAgJmdyb3VwX2luZm9fZGV2aWNlX2Nvbm5lY3QsCisgICAgJmdyb3VwX2luZm9fZGV2aWNlX2Rpc2Nvbm5lY3QsCisgICAgJmdyb3VwX2luZm9fZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZSwKKyAgICAmZ3JvdXBfaW5mb19kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YSwKKyAgICAmZ3JvdXBfaW5mb19kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnQsCisgICAgJmdyb3VwX2luZm9fZGV2aWNlX3Jlc2V0LAorICAgICZncm91cF9pbmZvX2RldmljZV9ydW5fZGRyX3Rlc3QsCisgICAgJmdyb3VwX2luZm9fZGV2aWNlX3N3X3VwZ3JhZGVfYWN0aXZhdGUsCisgICAgJmdyb3VwX2luZm9fZXBvbl9kZW5pZWRfbGlua19rZXksCisgICAgJmdyb3VwX2luZm9fZXBvbl9kZW5pZWRfbGlua19jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uLAorICAgICZncm91cF9pbmZvX2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbiwKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbiwKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uLAorICAgICZncm91cF9pbmZvX2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uLAorICAgICZncm91cF9pbmZvX2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uLAorICAgICZncm91cF9pbmZvX2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbiwKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWQsCisgICAgJmdyb3VwX2luZm9fZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uLAorICAgICZncm91cF9pbmZvX2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbiwKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fbGlua19rZXksCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfc3RhdCwKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fbGlua19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fbGlua19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fbGlua19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fbGlua19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fbGlua19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fbGlua19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fbGlua19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fbGlua19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fbGlua19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fbGlua19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fbGlua19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fbGlua19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fbGlua19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fbGlua19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0LAorICAgICZncm91cF9pbmZvX2Vwb25fbGlua19lbmNyeXB0aW9uX2VuYWJsZWQsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlLAorICAgICZncm91cF9pbmZvX2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRlZCwKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BwZWQsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX2xpbmtfZGVsZXRlZCwKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaCwKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfbXBjcF9kZXJlZ2lzdGVyZWQsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZCwKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfbXBjcF9yZWdfYWNrX3RpbWVvdXQsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXQsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dCwKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydGVkLAorICAgICZncm91cF9pbmZvX2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BwZWQsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZCwKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWQsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWQsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX3JlcmFuZ2VfZmFpbHVyZSwKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkLAorICAgICZncm91cF9pbmZvX2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZCwKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lLAorICAgICZncm91cF9pbmZvX2Vwb25fbGlua19hdXRvX2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfZGVsZXRlX2xpbmssCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX2ZvcmNlX3JlZGlzY292ZXJ5LAorICAgICZncm91cF9pbmZvX2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnQsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdG9wLAorICAgICZncm91cF9pbmZvX2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0LAorICAgICZncm91cF9pbmZvX2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3AsCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb24sCisgICAgJmdyb3VwX2luZm9fZXBvbl9saW5rX2luamVjdF9mcmFtZSwKKyAgICAmZ3JvdXBfaW5mb19lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWQsCisgICAgJmdyb3VwX2luZm9fZXBvbl9uaV9rZXksCisgICAgJmdyb3VwX2luZm9fZXBvbl9uaV9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmUsCisgICAgJmdyb3VwX2luZm9fZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZSwKKyAgICAmZ3JvdXBfaW5mb19lcG9uX25pX2xsaWRfcXVhcmFudGluZWQsCisgICAgJmdyb3VwX2luZm9fZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkLAorICAgICZncm91cF9pbmZvX2Vwb25fbmlfbm9fcmVwb3J0cywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlLAorICAgICZncm91cF9pbmZvX2Vwb25fbmlfcmVyYW5nZV9mYWlsdXJlLAorICAgICZncm91cF9pbmZvX2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZSwKKyAgICAmZ3JvdXBfaW5mb19lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkLAorICAgICZncm91cF9pbmZvX2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCwKKyAgICAmZ3JvdXBfaW5mb19lcG9uX25pX2F1dG9fY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fbmlfYWRkX2xpbmssCisgICAgJmdyb3VwX2luZm9fZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmssCisgICAgJmdyb3VwX2luZm9fZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGluaywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnQsCisgICAgJmdyb3VwX2luZm9fZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhLAorICAgICZncm91cF9pbmZvX2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuLAorICAgICZncm91cF9pbmZvX2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGUsCisgICAgJmdyb3VwX2luZm9fZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZSwKKyAgICAmZ3JvdXBfaW5mb19lcG9uX29udV8xMGdfdXNfa2V5LAorICAgICZncm91cF9pbmZvX2Vwb25fb251XzEwZ191c19jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9vbnVfMTBnX3VzX3N0YXQsCisgICAgJmdyb3VwX2luZm9fZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fb251XzEwZ191c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX29udV8xMGdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWQsCisgICAgJmdyb3VwX2luZm9fZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkLAorICAgICZncm91cF9pbmZvX2Vwb25fb251XzEwZ191c19hdXRvX2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX29udV8xZ191c19rZXksCisgICAgJmdyb3VwX2luZm9fZXBvbl9vbnVfMWdfdXNfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fb251XzFnX3VzX3N0YXQsCisgICAgJmdyb3VwX2luZm9fZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkLAorICAgICZncm91cF9pbmZvX2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkLAorICAgICZncm91cF9pbmZvX2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfZHNfa2V5LAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfZHNfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfZHNfc3RhdCwKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZCwKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzEwZ191c19rZXksCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzEwZ191c19jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzEwZ191c19zdGF0LAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZCwKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX2RzX2tleSwKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfZHNfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xZ19kc19zdGF0LAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWQsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfdXNfa2V5LAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xZ191c19jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX3VzX3N0YXQsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkLAorICAgICZncm91cF9pbmZvX2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZCwKKyAgICAmZ3JvdXBfaW5mb19lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmcsCisgICAgJmdyb3VwX2luZm9fZXBvbl9ycF9rZXksCisgICAgJmdyb3VwX2luZm9fZXBvbl9ycF9jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bpb19rZXksCisgICAgJmdyb3VwX2luZm9fZ3Bpb19jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9hbGxvY19rZXksCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9hbGxvY19jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9hbGxvY19zdGF0LAorICAgICZncm91cF9pbmZvX2dwb25fYWxsb2Nfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWQsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWQsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX2FsbG9jX2F1dG9fY2ZnLAorICAgICZncm91cF9pbmZvX2dwb25fYWxsb2NfZ2V0X3N0YXRzLAorICAgICZncm91cF9pbmZvX2dwb25fYWxsb2Nfc2V0X3N0YXRlLAorICAgICZncm91cF9pbmZvX2dwb25fZ2VtX3BvcnRfa2V5LAorICAgICZncm91cF9pbmZvX2dwb25fZ2VtX3BvcnRfY2ZnLAorICAgICZncm91cF9pbmZvX2dwb25fZ2VtX3BvcnRfc3RhdCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2dwb25fZ2VtX3BvcnRfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWQsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnLAorICAgICZncm91cF9pbmZvX2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlLAorICAgICZncm91cF9pbmZvX2dwb25faXdmX2tleSwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX2l3Zl9jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9pd2Zfc3RhdCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX2l3Zl9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX2l3Zl9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX2l3Zl9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX2l3Zl9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX2l3Zl9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX2l3Zl9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX2l3Zl9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX2l3Zl9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfY29tcGxldGVkLAorICAgICZncm91cF9pbmZvX2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWQsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWQsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9pd2ZfYXV0b19jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlLAorICAgICZncm91cF9pbmZvX2dwb25faXdmX3NjYW5fbWFjX3RhYmxlLAorICAgICZncm91cF9pbmZvX2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleSwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleSwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnLAorICAgICZncm91cF9pbmZvX2dwb25faXdmX21hY190YWJsZV9rZXksCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2FnZWQsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkLAorICAgICZncm91cF9pbmZvX2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZSwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hYywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9pd2ZfdXNfZmxvd19rZXksCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9pd2ZfdXNfZmxvd19jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9rZXksCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9zdGF0LAorICAgICZncm91cF9pbmZvX2dwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2dwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2dwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2dwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2dwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2dwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2dwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2dwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2dwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2dwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2dwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2dwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlLAorICAgICZncm91cF9pbmZvX2dwb25fbmlfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWQsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9sb3MsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlLAorICAgICZncm91cF9pbmZvX2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lLAorICAgICZncm91cF9pbmZvX2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX3JvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkLAorICAgICZncm91cF9pbmZvX2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX2F1dG9fY2ZnLAorICAgICZncm91cF9pbmZvX2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyLAorICAgICZncm91cF9pbmZvX2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGUsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9yZXNldCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3csCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9zZXRfb251X3N0YXRlLAorICAgICZncm91cF9pbmZvX2dwb25fbmlfc2V0X3Bvbl9zdGF0ZSwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZSwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX3RvZF9yZXF1ZXN0LAorICAgICZncm91cF9pbmZvX2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX25pX2NwdV9wYWNrZXRzLAorICAgICZncm91cF9pbmZvX2dwb25fb251X2tleSwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9vbnVfc3RhdCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9vbnVfZGZpLAorICAgICZncm91cF9pbmZvX2dwb25fb251X2RnaSwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9kb3dpLAorICAgICZncm91cF9pbmZvX2dwb25fb251X2VyciwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0LAorICAgICZncm91cF9pbmZvX2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWQsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWQsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9sb2FpLAorICAgICZncm91cF9pbmZvX2dwb25fb251X2xva2ksCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9vbnVfbWVtaSwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkLAorICAgICZncm91cF9pbmZvX2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkLAorICAgICZncm91cF9pbmZvX2dwb25fb251X29udV9hbGFybSwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWQsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWQsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uLAorICAgICZncm91cF9pbmZvX2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9wZWUsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnQsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9vbnVfcHN0LAorICAgICZncm91cF9pbmZvX2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkLAorICAgICZncm91cF9pbmZvX2dwb25fb251X3JlaSwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9zZGksCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9vbnVfc2ZpLAorICAgICZncm91cF9pbmZvX2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9zdWZpLAorICAgICZncm91cF9pbmZvX2dwb25fb251X3Rpd2ksCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9vbnVfYXV0b19jZmcsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsLAorICAgICZncm91cF9pbmZvX2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnQsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZSwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9jcHVfcGFja2V0cywKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9wbG9hbV9wYWNrZXQsCisgICAgJmdyb3VwX2luZm9fZ3Bvbl9vbnVfY3B1X3BhY2tldCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX29udV9vbWNpX3BhY2tldCwKKyAgICAmZ3JvdXBfaW5mb19ncG9uX3RyeF9rZXksCisgICAgJmdyb3VwX2luZm9fZ3Bvbl90cnhfY2ZnLAorICAgICZncm91cF9pbmZvX2xvZ19lbnRyeV9rZXksCisgICAgJmdyb3VwX2luZm9fbG9nX2VudHJ5X2NmZywKKyAgICAmZ3JvdXBfaW5mb19sb2dfZW50cnlfc3RhdCwKKyAgICAmZ3JvdXBfaW5mb19sb2dfZW50cnlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fbG9nX2VudHJ5X3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWQsCisgICAgJmdyb3VwX2luZm9fbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkLAorICAgICZncm91cF9pbmZvX2xvZ19lbnRyeV9hdXRvX2NmZywKKyAgICAmZ3JvdXBfaW5mb19sb2dnZXJfa2V5LAorICAgICZncm91cF9pbmZvX2xvZ2dlcl9jZmcsCisgICAgJmdyb3VwX2luZm9fbG9nZ2VyX3N0YXQsCisgICAgJmdyb3VwX2luZm9fbG9nZ2VyX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWQsCisgICAgJmdyb3VwX2luZm9fbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkLAorICAgICZncm91cF9pbmZvX2xvZ2dlcl9hdXRvX2NmZywKKyAgICAmZ3JvdXBfaW5mb19sb2dnZXJfY2xlYXJfbG9nLAorICAgICZncm91cF9pbmZvX25uaV9rZXksCisgICAgJmdyb3VwX2luZm9fbm5pX2NmZywKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdCwKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fbm5pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX25uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fbm5pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX25uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fbm5pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX25uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fbm5pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX25uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fbm5pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX25uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fbm5pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX25uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fbm5pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX25uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fbm5pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX25uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fbm5pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX25uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fbm5pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX25uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fbm5pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX25uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fbm5pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX25uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fbm5pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX25uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fbm5pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX25uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fbm5pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX25uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fbm5pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX25uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fbm5pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX25uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fbm5pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX25uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fbm5pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX25uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fbm5pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX25uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9fbm5pX3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX25uaV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdF9hbGFybV9jbGVhcmVkLAorICAgICZncm91cF9pbmZvX25uaV9zdGF0X2FsYXJtX3JhaXNlZCwKKyAgICAmZ3JvdXBfaW5mb19ubmlfc3RhdHVzX2NoYW5nZWQsCisgICAgJmdyb3VwX2luZm9fbm5pX2F1dG9fY2ZnLAorICAgICZncm91cF9pbmZvX25uaV9zZXJkZXNfa2V5LAorICAgICZncm91cF9pbmZvX25uaV9zZXJkZXNfY2ZnLAorICAgICZncm91cF9pbmZvX3NvZnR3YXJlX2Vycm9yX2tleSwKKyAgICAmZ3JvdXBfaW5mb19zb2Z0d2FyZV9lcnJvcl9jZmcsCisgICAgJmdyb3VwX2luZm9fdHJ4X2NhbGlicmF0aW9uX2tleSwKKyAgICAmZ3JvdXBfaW5mb190cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWQsCisgICAgJmdyb3VwX2luZm9fdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnLAorICAgICZncm91cF9pbmZvX3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvdywKKyAgICAmZ3JvdXBfaW5mb190cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvdywKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9hbGxvY19rZXksCisgICAgJmdyb3VwX2luZm9feGdwb25fYWxsb2NfY2ZnLAorICAgICZncm91cF9pbmZvX3hncG9uX2FsbG9jX3N0YXQsCisgICAgJmdyb3VwX2luZm9feGdwb25fYWxsb2Nfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQsCisgICAgJmdyb3VwX2luZm9feGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWQsCisgICAgJmdyb3VwX2luZm9feGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWQsCisgICAgJmdyb3VwX2luZm9feGdwb25fYWxsb2NfYXV0b19jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fYWxsb2NfZ2V0X3N0YXRzLAorICAgICZncm91cF9pbmZvX3hncG9uX2FsbG9jX3NldF9zdGF0ZSwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9nZW1fcG9ydF9rZXksCisgICAgJmdyb3VwX2luZm9feGdwb25fZ2VtX3BvcnRfY2ZnLAorICAgICZncm91cF9pbmZvX3hncG9uX2dlbV9wb3J0X3N0YXQsCisgICAgJmdyb3VwX2luZm9feGdwb25fZ2VtX3BvcnRfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fZ2VtX3BvcnRfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fZ2VtX3BvcnRfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fZ2VtX3BvcnRfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkLAorICAgICZncm91cF9pbmZvX3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkLAorICAgICZncm91cF9pbmZvX3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnLAorICAgICZncm91cF9pbmZvX3hncG9uX2l3Zl9rZXksCisgICAgJmdyb3VwX2luZm9feGdwb25faXdmX2NmZywKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9uaV9rZXksCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfY2ZnLAorICAgICZncm91cF9pbmZvX3hncG9uX25pX3N0YXQsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkLAorICAgICZncm91cF9pbmZvX3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmUsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWQsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9uaV9sb3MsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfb251X2Rpc2NvdmVyZWQsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGUsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWQsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWQsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWQsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfYXV0b19jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGgsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyLAorICAgICZncm91cF9pbmZvX3hncG9uX25pX3Jlc2V0LAorICAgICZncm91cF9pbmZvX3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3csCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwLAorICAgICZncm91cF9pbmZvX3hncG9uX25pX3NldF9vbnVfc3RhdGUsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfc2V0X3Bvbl9zdGF0ZSwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nLAorICAgICZncm91cF9pbmZvX3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlLAorICAgICZncm91cF9pbmZvX3hncG9uX25pX3RvZF9yZXF1ZXN0LAorICAgICZncm91cF9pbmZvX3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXQsCisgICAgJmdyb3VwX2luZm9feGdwb25fbmlfY3B1X3BhY2tldHMsCisgICAgJmdyb3VwX2luZm9feGdwb25fb251X2tleSwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfY2ZnLAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9zdGF0LAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fb251X3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fb251X3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fb251X3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fb251X3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fb251X3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fb251X3N0YXRfY2ZnLAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9zdGF0X2NmZywKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfc3RhdF9jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fb251X2RmaSwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfZGdpLAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9kb3dpLAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0LAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkLAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXQsCisgICAgJmdyb3VwX2luZm9feGdwb25fb251X2xvb2NpLAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQsCisgICAgJmdyb3VwX2luZm9feGdwb25fb251X29udV9hbGFybSwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQsCisgICAgJmdyb3VwX2luZm9feGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZCwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWQsCisgICAgJmdyb3VwX2luZm9feGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkLAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWQsCisgICAgJmdyb3VwX2luZm9feGdwb25fb251X29wdGljYWxfcmVmbGVjdGlvbiwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnQsCisgICAgJmdyb3VwX2luZm9feGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydCwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0LAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfcHFzaSwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWQsCisgICAgJmdyb3VwX2luZm9feGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZCwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQsCisgICAgJmdyb3VwX2luZm9feGdwb25fb251X3NkaSwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlLAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9zZmksCisgICAgJmdyb3VwX2luZm9feGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZCwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWQsCisgICAgJmdyb3VwX2luZm9feGdwb25fb251X3N1ZmksCisgICAgJmdyb3VwX2luZm9feGdwb25fb251X3Rpd2ksCisgICAgJmdyb3VwX2luZm9feGdwb25fb251X3R1bmluZ19yZXNwb25zZSwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfYXV0b19jZmcsCisgICAgJmdyb3VwX2luZm9feGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoLAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nLAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9nZXRfcG93ZXJfY29uc3VtcHRpb24sCisgICAgJmdyb3VwX2luZm9feGdwb25fb251X2dldF9wb3dlcl9sZXZlbCwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfb251X3R1bmluZ19pbiwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfb251X3R1bmluZ19vdXQsCisgICAgJmdyb3VwX2luZm9feGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uLAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50LAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uLAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9zZXRfb251X3N0YXRlLAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9jcHVfcGFja2V0cywKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl9vbnVfcGxvYW1fcGFja2V0LAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9jcHVfcGFja2V0LAorICAgICZncm91cF9pbmZvX3hncG9uX29udV9vbWNpX3BhY2tldCwKKyAgICAmZ3JvdXBfaW5mb194Z3Bvbl90cnhfa2V5LAorICAgICZncm91cF9pbmZvX3hncG9uX3RyeF9jZmcsCisgICAgJmdyb3VwX2luZm9feHBvbl9zZXJkZXNfa2V5LAorICAgICZncm91cF9pbmZvX3hwb25fc2VyZGVzX2NmZworfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2FlX25pX2tleVtdID0geyBCQ01PTFRfR1JPVVBfSURfQUVfTklfS0VZIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19hZV9uaV9jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0FFX05JX0NGRyB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfYWVfbmlfb3BlcltdID0geyBCQ01PTFRfR1JPVVBfSURfQUVfTklfU0VUX0FFX05JX0VOX1NUQVRFIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19hZV9wYXRoX2RzX2tleVtdID0geyBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9EU19LRVkgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2FlX3BhdGhfZHNfc3RhdFtdID0geyBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9EU19TVEFUIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19hZV9wYXRoX2RzX3N0YXRfY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX0RTX1NUQVRfQ0ZHX0JZVEVTLCBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9EU19TVEFUX0NGR19GUkFNRVMsIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX0RTX1NUQVRfQ0ZHX0ZSQU1FU182NCwgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfRFNfU1RBVF9DRkdfRlJBTUVTXzY1XzEyNywgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfRFNfU1RBVF9DRkdfRlJBTUVTXzEyOF8yNTUsIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX0RTX1NUQVRfQ0ZHX0ZSQU1FU18yNTZfNTExLCBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9EU19TVEFUX0NGR19GUkFNRVNfNTEyXzEwMjMsIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX0RTX1NUQVRfQ0ZHX0ZSQU1FU18xMDI0XzE1MTgsIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX0RTX1NUQVRfQ0ZHX0ZSQU1FU18xNTE5XzIwNDcsIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX0RTX1NUQVRfQ0ZHX0ZSQU1FU18yMDQ4XzQwOTUsIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX0RTX1NUQVRfQ0ZHX0ZSQU1FU180MDk2XzkyMTYsIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX0RTX1NUQVRfQ0ZHX0ZSQU1FU185MjE3XzE2MzgzLCBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9EU19TVEFUX0NGR19CUk9BRENBU1RfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9EU19TVEFUX0NGR19EQVRBX0JZVEVTLCBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9EU19TVEFUX0NGR19NVUxUSUNBU1RfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9EU19TVEFUX0NGR19VTklDQVNUX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfRFNfU1RBVF9DRkdfQUJPUlRfRlJBTUVTIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19hZV9wYXRoX2RzX2F1dG9bXSA9IHsgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfRFNfU1RBVF9BTEFSTV9DTEVBUkVELCBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9EU19TVEFUX0FMQVJNX1JBSVNFRCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfYWVfcGF0aF9kc19hdXRvX2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9EU19BVVRPX0NGRyB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfYWVfcGF0aF91c19rZXlbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfVVNfS0VZIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19hZV9wYXRoX3VzX3N0YXRbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfVVNfU1RBVCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfYWVfcGF0aF91c19zdGF0X2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9VU19TVEFUX0NGR19CWVRFUywgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfVVNfU1RBVF9DRkdfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9VU19TVEFUX0NGR19GUkFNRVNfNjQsIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX1VTX1NUQVRfQ0ZHX0ZSQU1FU182NV8xMjcsIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX1VTX1NUQVRfQ0ZHX0ZSQU1FU18xMjhfMjU1LCBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9VU19TVEFUX0NGR19GUkFNRVNfMjU2XzUxMSwgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfVVNfU1RBVF9DRkdfRlJBTUVTXzUxMl8xMDIzLCBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9VU19TVEFUX0NGR19GUkFNRVNfMTAyNF8xNTE4LCBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9VU19TVEFUX0NGR19GUkFNRVNfMTUxOV8yMDQ3LCBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9VU19TVEFUX0NGR19GUkFNRVNfMjA0OF80MDk1LCBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9VU19TVEFUX0NGR19GUkFNRVNfNDA5Nl85MjE2LCBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9VU19TVEFUX0NGR19GUkFNRVNfOTIxN18xNjM4MywgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfVVNfU1RBVF9DRkdfQlJPQURDQVNUX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfVVNfU1RBVF9DRkdfREFUQV9CWVRFUywgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfVVNfU1RBVF9DRkdfTVVMVElDQVNUX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfVVNfU1RBVF9DRkdfVU5JQ0FTVF9GUkFNRVMsIEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX1VTX1NUQVRfQ0ZHX0FCT1JUX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfVVNfU1RBVF9DRkdfRkNTX0VSUk9SLCBCQ01PTFRfR1JPVVBfSURfQUVfUEFUSF9VU19TVEFUX0NGR19PVkVSU0laRV9FUlJPUiwgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfVVNfU1RBVF9DRkdfUlVOVF9FUlJPUiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfYWVfcGF0aF91c19hdXRvW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9BRV9QQVRIX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRCwgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfVVNfU1RBVF9BTEFSTV9SQUlTRUQgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2FlX3BhdGhfdXNfYXV0b19jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0FFX1BBVEhfVVNfQVVUT19DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2NoYW5uZWxfa2V5W10gPSB7IEJDTU9MVF9HUk9VUF9JRF9DSEFOTkVMX0tFWSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfY2hhbm5lbF9jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0NIQU5ORUxfQ0ZHIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19kZWJ1Z19rZXlbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0RFQlVHX0tFWSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZGVidWdfY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9ERUJVR19DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2RlYnVnX2F1dG9bXSA9IHsgQkNNT0xUX0dST1VQX0lEX0RFQlVHX0NMSV9PVVRQVVQsIEJDTU9MVF9HUk9VUF9JRF9ERUJVR19GSUxFX0FMTU9TVF9GVUxMIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19kZWJ1Z19hdXRvX2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfREVCVUdfQVVUT19DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2RlYnVnX29wZXJbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0RFQlVHX0NMSV9JTlBVVCwgQkNNT0xUX0dST1VQX0lEX0RFQlVHX1JFU0VUX0FQSV9DQVBUVVJFLCBCQ01PTFRfR1JPVVBfSURfREVCVUdfU1RBUlRfQVBJX0NBUFRVUkUsIEJDTU9MVF9HUk9VUF9JRF9ERUJVR19TVE9QX0FQSV9DQVBUVVJFIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19kZXZpY2Vfa2V5W10gPSB7IEJDTU9MVF9HUk9VUF9JRF9ERVZJQ0VfS0VZIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19kZXZpY2VfY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9ERVZJQ0VfQ0ZHIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19kZXZpY2VfYXV0b1tdID0geyBCQ01PTFRfR1JPVVBfSURfREVWSUNFX0NPTk5FQ1RJT05fQ09NUExFVEUsIEJDTU9MVF9HUk9VUF9JRF9ERVZJQ0VfQ09OTkVDVElPTl9FU1RBQkxJU0hFRCwgQkNNT0xUX0dST1VQX0lEX0RFVklDRV9DT05ORUNUSU9OX0ZBSUxVUkUsIEJDTU9MVF9HUk9VUF9JRF9ERVZJQ0VfRERSX1RFU1RfQ09NUExFVEUsIEJDTU9MVF9HUk9VUF9JRF9ERVZJQ0VfREVWSUNFX0tFRVBfQUxJVkUsIEJDTU9MVF9HUk9VUF9JRF9ERVZJQ0VfREVWSUNFX1JFQURZLCBCQ01PTFRfR1JPVVBfSURfREVWSUNFX0RJU0NPTk5FQ1RJT05fQ09NUExFVEUsIEJDTU9MVF9HUk9VUF9JRF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfQ09NUExFVEUsIEJDTU9MVF9HUk9VUF9JRF9ERVZJQ0VfSU5ESUNBVElPTlNfRFJPUFBFRCwgQkNNT0xUX0dST1VQX0lEX0RFVklDRV9TV19FUlJPUiwgQkNNT0xUX0dST1VQX0lEX0RFVklDRV9TV19FWENFUFRJT04gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2RldmljZV9hdXRvX2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfREVWSUNFX0FVVE9fQ0ZHIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19kZXZpY2Vfb3BlcltdID0geyBCQ01PTFRfR1JPVVBfSURfREVWSUNFX0NPTk5FQ1QsIEJDTU9MVF9HUk9VUF9JRF9ERVZJQ0VfRElTQ09OTkVDVCwgQkNNT0xUX0dST1VQX0lEX0RFVklDRV9IT1NUX0tFRVBfQUxJVkUsIEJDTU9MVF9HUk9VUF9JRF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfREFUQSwgQkNNT0xUX0dST1VQX0lEX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9TVEFSVCwgQkNNT0xUX0dST1VQX0lEX0RFVklDRV9SRVNFVCwgQkNNT0xUX0dST1VQX0lEX0RFVklDRV9SVU5fRERSX1RFU1QsIEJDTU9MVF9HUk9VUF9JRF9ERVZJQ0VfU1dfVVBHUkFERV9BQ1RJVkFURSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZXBvbl9kZW5pZWRfbGlua19rZXlbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0VQT05fREVOSUVEX0xJTktfS0VZIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19lcG9uX2RlbmllZF9saW5rX2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfRVBPTl9ERU5JRURfTElOS19DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fZGVuaWVkX2xpbmtfYXV0b1tdID0geyBCQ01PTFRfR1JPVVBfSURfRVBPTl9ERU5JRURfTElOS19MQVNFUl9PTl9PRkZfVklPTEFUSU9OLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9ERU5JRURfTElOS19MTElEX1BPT0xfRU1QVFlfVklPTEFUSU9OLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9ERU5JRURfTElOS19NQVhfTElOS19WSU9MQVRJT04sIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0RFTklFRF9MSU5LX09WRVJIRUFEX1BST0ZJTEVfVklPTEFUSU9OLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9ERU5JRURfTElOS19SQU5HRV9WSU9MQVRJT04sIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0RFTklFRF9MSU5LX1JPR1VFX1ZJT0xBVElPTiwgQkNNT0xUX0dST1VQX0lEX0VQT05fREVOSUVEX0xJTktfU1lTVEVNX1JFU09VUkNFX1ZJT0xBVElPTiwgQkNNT0xUX0dST1VQX0lEX0VQT05fREVOSUVEX0xJTktfVERNX0NIQU5ORUxTX0VYSEFVU1RFRCwgQkNNT0xUX0dST1VQX0lEX0VQT05fREVOSUVEX0xJTktfVU5LTk9XTl9MSU5LX1ZJT0xBVElPTiwgQkNNT0xUX0dST1VQX0lEX0VQT05fREVOSUVEX0xJTktfVVBTVFJFQU1fQkFORFdJRFRIX1ZJT0xBVElPTiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGRyB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZXBvbl9saW5rX2tleVtdID0geyBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX0tFWSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZXBvbl9saW5rX2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX0NGRyB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZXBvbl9saW5rX3N0YXRbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19lcG9uX2xpbmtfc3RhdF9jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19SWF9EQVRBX0JZVEVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1JYX0RBVEFfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1JYX0ZSQU1FU182NCwgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19SWF9GUkFNRVNfNjVfMTI3LCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1JYX0ZSQU1FU18xMjhfMjU1LCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1JYX0ZSQU1FU18yNTZfNTExLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1JYX0ZSQU1FU181MTJfMTAyMywgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19SWF9GUkFNRVNfMTAyNF8xNTE4LCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1JYX0ZSQU1FU18xNTE5XzIwNDcsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfUlhfRlJBTUVTXzIwNDhfNDA5NSwgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19SWF9GUkFNRVNfNDA5Nl85MjE2LCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1JYX0ZSQU1FU185MjE3XzE2MzgzLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1JYX09BTV9CWVRFUywgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19SWF9PQU1fRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1JYX01QQ1BfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1JYX0JST0FEQ0FTVF9GUkFNRVMsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfUlhfVU5JQ0FTVF9GUkFNRVMsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfUlhfTVVMVElDQVNUX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19SWF9SRVBPUlRfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1JYX0ZDU19FUlJPUiwgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19SWF9PVkVSU0laRV9FUlJPUiwgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19SWF9SVU5UX0VSUk9SLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1JYX0xJTkVfQ09ERV9FUlJPUiwgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19SWF9MSU5FX0NPREVfRVJST1JfTUFYLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1RYX0RBVEFfQllURVMsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfVFhfREFUQV9GUkFNRVMsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfVFhfRlJBTUVTXzY0LCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1RYX0ZSQU1FU182NV8xMjcsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfVFhfRlJBTUVTXzEyOF8yNTUsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfVFhfRlJBTUVTXzI1Nl81MTEsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfVFhfRlJBTUVTXzUxMl8xMDIzLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1RYX0ZSQU1FU18xMDI0XzE1MTgsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfVFhfRlJBTUVTXzE1MTlfMjA0NywgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19UWF9GUkFNRVNfMjA0OF80MDk1LCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1RYX0ZSQU1FU180MDk2XzkyMTYsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfVFhfRlJBTUVTXzkyMTdfMTYzODMsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfVFhfT0FNX0JZVEVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1RYX09BTV9GUkFNRVMsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfVFhfTVBDUF9GUkFNRVMsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9DRkdfVFhfQlJPQURDQVNUX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19UWF9VTklDQVNUX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19TVEFUX0NGR19UWF9NVUxUSUNBU1RfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQ0ZHX1RYX0dBVEVTIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19lcG9uX2xpbmtfYXV0b1tdID0geyBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX0RVUExJQ0FURV9NUENQX1JFR0lTVFJBVElPTl9SRVFVRVNULCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX0VOQ1JZUFRJT05fRU5BQkxFRCwgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19LRVlfRVhDSEFOR0VfRkFJTFVSRSwgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19LRVlfRVhDSEFOR0VfU1RBUlRFRCwgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19LRVlfRVhDSEFOR0VfU1RPUFBFRCwgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19MSU5LX0RFTEVURUQsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfTElOS19TUEVFRF9NSVNNQVRDSCwgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19NUENQX0RFUkVHSVNURVJFRCwgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19NUENQX0RJU0NPVkVSRUQsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfTVBDUF9SRUdfQUNLX1RJTUVPVVQsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfTVBDUF9SRVBPUlRfVElNRU9VVCwgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19PQU1fS0VFUEFMSVZFX1RJTUVPVVQsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfT0FNX0tFRVBBTElWRV9USU1FUl9TVEFSVEVELCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX09BTV9LRUVQQUxJVkVfVElNRVJfU1RPUFBFRCwgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19QUkVQUk9WSVNJT05FRF9MSU5LX0NSRUFURUQsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfUFJPVEVDVElPTl9TV0lUQ0hfT0NDVVJSRUQsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfUkFOR0VfVkFMVUVfQ0hBTkdFRCwgQkNNT0xUX0dST1VQX0lEX0VQT05fTElOS19SRVJBTkdFX0ZBSUxVUkUsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfU1RBVF9BTEFSTV9DTEVBUkVELCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRfQUxBUk1fUkFJU0VELCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRJQ19SRUdJU1RSQVRJT05fRE9ORSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZXBvbl9saW5rX2F1dG9fY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfQVVUT19DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fbGlua19vcGVyW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfREVMRVRFX0xJTkssIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfRk9SQ0VfUkVESVNDT1ZFUlksIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfS0VZX0VYQ0hBTkdFX1NUQVJULCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX0tFWV9FWENIQU5HRV9TVE9QLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX09BTV9LRUVQQUxJVkVfVElNRVJfU1RBUlQsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfT0FNX0tFRVBBTElWRV9USU1FUl9TVE9QLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX1NUQVRJQ19SRUdJU1RSQVRJT04gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fbGlua19wcm94eVtdID0geyBCQ01PTFRfR1JPVVBfSURfRVBPTl9MSU5LX0lOSkVDVF9GUkFNRSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZXBvbl9saW5rX3Byb3h5X3J4W10gPSB7IEJDTU9MVF9HUk9VUF9JRF9FUE9OX0xJTktfRlJBTUVfQ0FQVFVSRUQgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fbmlfa2V5W10gPSB7IEJDTU9MVF9HUk9VUF9JRF9FUE9OX05JX0tFWSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZXBvbl9uaV9jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0VQT05fTklfQ0ZHIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19lcG9uX25pX2F1dG9bXSA9IHsgQkNNT0xUX0dST1VQX0lEX0VQT05fTklfQVVUT19ST0dVRV9TQ0FOXzEwR19GQUlMVVJFLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9OSV9BVVRPX1JPR1VFX1NDQU5fMUdfRkFJTFVSRSwgQkNNT0xUX0dST1VQX0lEX0VQT05fTklfTExJRF9RVUFSQU5USU5FRCwgQkNNT0xUX0dST1VQX0lEX0VQT05fTklfTVBDUF9USU1FU1RBTVBfQ0hBTkdFRCwgQkNNT0xUX0dST1VQX0lEX0VQT05fTklfTk9fUkVQT1JUUywgQkNNT0xUX0dST1VQX0lEX0VQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEUsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX05JX1JFUkFOR0VfRkFJTFVSRSwgQkNNT0xUX0dST1VQX0lEX0VQT05fTklfUk9HVUVfU0NBTl9DT01QTEVURSwgQkNNT0xUX0dST1VQX0lEX0VQT05fTklfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURUQsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURUQgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fbmlfYXV0b19jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0VQT05fTklfQVVUT19DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fbmlfb3BlcltdID0geyBCQ01PTFRfR1JPVVBfSURfRVBPTl9OSV9BRERfTElOSywgQkNNT0xUX0dST1VQX0lEX0VQT05fTklfQUREX01VTFRJQ0FTVF9MSU5LLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9OSV9BRERfUFJPVEVDVEVEX1NUQU5EQllfTElOSywgQkNNT0xUX0dST1VQX0lEX0VQT05fTklfSVNTVUVfUlNTSV9HUkFOVCwgQkNNT0xUX0dST1VQX0lEX0VQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfQVBQTFlfUkVSQU5HRV9ERUxUQSwgQkNNT0xUX0dST1VQX0lEX0VQT05fTklfUk9HVUVfTExJRF9TQ0FOLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9OSV9TRVRfRVBPTl9OSV9FTl9TVEFURSwgQkNNT0xUX0dST1VQX0lEX0VQT05fTklfU1RBUlRfT05VX1VQR1JBREUgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fb251XzEwZ191c19rZXlbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzEwR19VU19LRVkgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fb251XzEwZ191c19jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzEwR19VU19DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fb251XzEwZ191c19zdGF0W10gPSB7IEJDTU9MVF9HUk9VUF9JRF9FUE9OX09OVV8xMEdfVVNfU1RBVCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9FUE9OX09OVV8xMEdfVVNfU1RBVF9DRkdfRkVDX0NPREVfV09SRFNfVE9UQUwsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX09OVV8xMEdfVVNfU1RBVF9DRkdfRkVDX0NPREVfV09SRFNfREVDT0RFX0ZBSUxTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9PTlVfMTBHX1VTX1NUQVRfQ0ZHX0ZFQ19aRVJPRVNfQ09SUkVDVEVELCBCQ01PTFRfR1JPVVBfSURfRVBPTl9PTlVfMTBHX1VTX1NUQVRfQ0ZHX0ZFQ19PTkVTX0NPUlJFQ1RFRCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZXBvbl9vbnVfMTBnX3VzX2F1dG9bXSA9IHsgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzEwR19VU19TVEFUX0FMQVJNX0NMRUFSRUQsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX09OVV8xMEdfVVNfU1RBVF9BTEFSTV9SQUlTRUQgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fb251XzEwZ191c19hdXRvX2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfRVBPTl9PTlVfMTBHX1VTX0FVVE9fQ0ZHIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19lcG9uX29udV8xZ191c19rZXlbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX0tFWSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZXBvbl9vbnVfMWdfdXNfY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9FUE9OX09OVV8xR19VU19DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fb251XzFnX3VzX3N0YXRbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVQgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9FUE9OX09OVV8xR19VU19TVEFUX0NGR19HT09EX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX0dPT0RfQllURVMsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX09OVV8xR19VU19TVEFUX0NGR19PVkVSU1pfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9PTlVfMUdfVVNfU1RBVF9DRkdfTk9OX0ZFQ19HT09EX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX05PTl9GRUNfR09PRF9CWVRFUywgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX0ZFQ19HT09EX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX0ZFQ19HT09EX0JZVEVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9PTlVfMUdfVVNfU1RBVF9DRkdfRkVDX0ZSQU1FU19FWENfRVJSUywgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX0ZFQ19CTEtTX05PX0VSUlMsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX09OVV8xR19VU19TVEFUX0NGR19GRUNfQkxLU19DT1JSX0VSUlMsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX09OVV8xR19VU19TVEFUX0NGR19GRUNfQkxLU19VTkNPUlJfRVJSUywgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX0ZFQ19DT1JSX0JZVEVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9PTlVfMUdfVVNfU1RBVF9DRkdfRkVDX0NPUlJfWkVST0VTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9PTlVfMUdfVVNfU1RBVF9DRkdfRkVDX0NPUlJfT05FUywgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX1VOREVSU1pfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9PTlVfMUdfVVNfU1RBVF9DRkdfRVJST1JTWl9GUkFNRVMgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fb251XzFnX3VzX2F1dG9bXSA9IHsgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRCwgQkNNT0xUX0dST1VQX0lEX0VQT05fT05VXzFHX1VTX1NUQVRfQUxBUk1fUkFJU0VEIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19lcG9uX29udV8xZ191c19hdXRvX2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfRVBPTl9PTlVfMUdfVVNfQVVUT19DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fcGF0aF8xMGdfZHNfa2V5W10gPSB7IEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX0RTX0tFWSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZXBvbl9wYXRoXzEwZ19kc19jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfRFNfQ0ZHIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19lcG9uX3BhdGhfMTBnX2RzX3N0YXRbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfRFNfU1RBVCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19EU19TVEFUX0NGR19CWVRFUywgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9DRkdfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19EU19TVEFUX0NGR19GUkFNRVNfNjQsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQ0ZHX0ZSQU1FU182NV8xMjcsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQ0ZHX0ZSQU1FU18xMjhfMjU1LCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19EU19TVEFUX0NGR19GUkFNRVNfMjU2XzUxMSwgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9DRkdfRlJBTUVTXzUxMl8xMDIzLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19EU19TVEFUX0NGR19GUkFNRVNfMTAyNF8xNTE4LCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19EU19TVEFUX0NGR19GUkFNRVNfMTUxOV8yMDQ3LCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19EU19TVEFUX0NGR19GUkFNRVNfMjA0OF80MDk1LCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19EU19TVEFUX0NGR19GUkFNRVNfNDA5Nl85MjE2LCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19EU19TVEFUX0NGR19GUkFNRVNfOTIxN18xNjM4MywgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9DRkdfQlJPQURDQVNUX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9DRkdfREFUQV9CWVRFUywgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9DRkdfTVVMVElDQVNUX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9DRkdfVU5JQ0FTVF9GUkFNRVMsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQ0ZHX09BTV9CWVRFUywgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9DRkdfT0FNX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9DRkdfR0FURV9GUkFNRVMsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQ0ZHX01QQ1BfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19EU19TVEFUX0NGR19BQk9SVF9GUkFNRVMgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fcGF0aF8xMGdfZHNfYXV0b1tdID0geyBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19EU19TVEFUX0FMQVJNX0NMRUFSRUQsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQUxBUk1fUkFJU0VEIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX0RTX0FVVE9fQ0ZHIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19lcG9uX3BhdGhfMTBnX3VzX2tleVtdID0geyBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19VU19LRVkgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fcGF0aF8xMGdfdXNfY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX1VTX0NGRyB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZXBvbl9wYXRoXzEwZ191c19zdGF0W10gPSB7IEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX1VTX1NUQVQgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfQllURVMsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQ0ZHX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfRlJBTUVTXzY0LCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19VU19TVEFUX0NGR19GUkFNRVNfNjVfMTI3LCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19VU19TVEFUX0NGR19GUkFNRVNfMTI4XzI1NSwgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfRlJBTUVTXzI1Nl81MTEsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQ0ZHX0ZSQU1FU181MTJfMTAyMywgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfRlJBTUVTXzEwMjRfMTUxOCwgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfRlJBTUVTXzE1MTlfMjA0NywgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfRlJBTUVTXzIwNDhfNDA5NSwgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfRlJBTUVTXzQwOTZfOTIxNiwgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfRlJBTUVTXzkyMTdfMTYzODMsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQ0ZHX0JST0FEQ0FTVF9GUkFNRVMsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQ0ZHX0RBVEFfQllURVMsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQ0ZHX01VTFRJQ0FTVF9GUkFNRVMsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQ0ZHX1VOSUNBU1RfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19VU19TVEFUX0NGR19NUENQX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfT0FNX0JZVEVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19VU19TVEFUX0NGR19PQU1fRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19VU19TVEFUX0NGR19SRVBPUlRfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19VU19TVEFUX0NGR19BQk9SVF9GUkFNRVMsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQ0ZHX0ZDU19FUlJPUiwgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfQ1JDXzhfRVJST1IsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQ0ZHX09VVF9PRl9TTE9ULCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzEwR19VU19TVEFUX0NGR19PVkVSU0laRV9FUlJPUiwgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfUlVOVF9FUlJPUiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZXBvbl9wYXRoXzEwZ191c19hdXRvW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRCwgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9BTEFSTV9SQUlTRUQgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xMEdfVVNfQVVUT19DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fcGF0aF8xZ19kc19rZXlbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19EU19LRVkgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fcGF0aF8xZ19kc19jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19EU19DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fcGF0aF8xZ19kc19zdGF0W10gPSB7IEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfQllURVMsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQ0ZHX0ZSQU1FU182NCwgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19EU19TVEFUX0NGR19GUkFNRVNfNjVfMTI3LCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQ0ZHX0ZSQU1FU18xMjhfMjU1LCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQ0ZHX0ZSQU1FU18yNTZfNTExLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQ0ZHX0ZSQU1FU181MTJfMTAyMywgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19EU19TVEFUX0NGR19GUkFNRVNfMTAyNF8xNTE4LCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQ0ZHX0ZSQU1FU18xNTE5XzIwNDcsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfRlJBTUVTXzIwNDhfNDA5NSwgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19EU19TVEFUX0NGR19GUkFNRVNfNDA5Nl85MjE2LCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQ0ZHX0ZSQU1FU185MjE3XzE2MzgzLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQ0ZHX0JST0FEQ0FTVF9GUkFNRVMsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9DRkdfREFUQV9CWVRFUywgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19EU19TVEFUX0NGR19NVUxUSUNBU1RfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQ0ZHX1VOSUNBU1RfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQ0ZHX09BTV9CWVRFUywgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19EU19TVEFUX0NGR19PQU1fRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQ0ZHX0dBVEVfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQ0ZHX01QQ1BfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQ0ZHX0FCT1JUX0ZSQU1FUyB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZXBvbl9wYXRoXzFnX2RzX2F1dG9bXSA9IHsgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19EU19TVEFUX0FMQVJNX0NMRUFSRUQsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9BTEFSTV9SQUlTRUQgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX0RTX0FVVE9fQ0ZHIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19lcG9uX3BhdGhfMWdfdXNfa2V5W10gPSB7IEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfVVNfS0VZIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19lcG9uX3BhdGhfMWdfdXNfY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfVVNfQ0ZHIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19lcG9uX3BhdGhfMWdfdXNfc3RhdFtdID0geyBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX1VTX1NUQVQgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQ0ZHX0JZVEVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQ0ZHX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19GUkFNRVNfNjQsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9DRkdfRlJBTUVTXzY1XzEyNywgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19GUkFNRVNfMTI4XzI1NSwgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19GUkFNRVNfMjU2XzUxMSwgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19GUkFNRVNfNTEyXzEwMjMsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9DRkdfRlJBTUVTXzEwMjRfMTUxOCwgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19GUkFNRVNfMTUxOV8yMDQ3LCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQ0ZHX0ZSQU1FU18yMDQ4XzQwOTUsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9DRkdfRlJBTUVTXzQwOTZfOTIxNiwgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19GUkFNRVNfOTIxN18xNjM4MywgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19CUk9BRENBU1RfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQ0ZHX0RBVEFfQllURVMsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9DRkdfTVVMVElDQVNUX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19VTklDQVNUX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19NUENQX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19PQU1fQllURVMsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9DRkdfT0FNX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19SRVBPUlRfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQ0ZHX0FCT1JUX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19GQ1NfRVJST1IsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9DRkdfQ1JDXzhfRVJST1IsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9DRkdfT1VUX09GX1NMT1QsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9DRkdfT1ZFUlNJWkVfRVJST1IsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9DRkdfUlVOVF9FUlJPUiB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZXBvbl9wYXRoXzFnX3VzX2F1dG9bXSA9IHsgQkNNT0xUX0dST1VQX0lEX0VQT05fUEFUSF8xR19VU19TVEFUX0FMQVJNX0NMRUFSRUQsIEJDTU9MVF9HUk9VUF9JRF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9BTEFSTV9SQUlTRUQgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfRVBPTl9QQVRIXzFHX1VTX0FVVE9fQ0ZHIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19lcG9uX3JwX2tleVtdID0geyBCQ01PTFRfR1JPVVBfSURfRVBPTl9SUF9LRVkgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2Vwb25fcnBfY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9FUE9OX1JQX0NGRyB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZ3Bpb19rZXlbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0dQSU9fS0VZIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19ncGlvX2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfR1BJT19DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2dwb25fYWxsb2Nfa2V5W10gPSB7IEJDTU9MVF9HUk9VUF9JRF9HUE9OX0FMTE9DX0tFWSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZ3Bvbl9hbGxvY19jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0dQT05fQUxMT0NfQ0ZHIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19ncG9uX2FsbG9jX3N0YXRbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0dQT05fQUxMT0NfU1RBVCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZ3Bvbl9hbGxvY19zdGF0X2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfR1BPTl9BTExPQ19TVEFUX0NGR19SWF9CWVRFUyB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZ3Bvbl9hbGxvY19hdXRvW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9HUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVELCBCQ01PTFRfR1JPVVBfSURfR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVELCBCQ01PTFRfR1JPVVBfSURfR1BPTl9BTExPQ19TVEFUX0FMQVJNX0NMRUFSRUQsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX0FMTE9DX1NUQVRfQUxBUk1fUkFJU0VEIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19ncG9uX2FsbG9jX2F1dG9fY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9HUE9OX0FMTE9DX0FVVE9fQ0ZHIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19ncG9uX2FsbG9jX29wZXJbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0dQT05fQUxMT0NfR0VUX1NUQVRTLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9BTExPQ19TRVRfU1RBVEUgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2dwb25fZ2VtX3BvcnRfa2V5W10gPSB7IEJDTU9MVF9HUk9VUF9JRF9HUE9OX0dFTV9QT1JUX0tFWSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZ3Bvbl9nZW1fcG9ydF9jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0dQT05fR0VNX1BPUlRfQ0ZHIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19ncG9uX2dlbV9wb3J0X3N0YXRbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0dQT05fR0VNX1BPUlRfU1RBVCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfR1BPTl9HRU1fUE9SVF9TVEFUX0NGR19SWF9QQUNLRVRTLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9HRU1fUE9SVF9TVEFUX0NGR19SWF9CWVRFUywgQkNNT0xUX0dST1VQX0lEX0dQT05fR0VNX1BPUlRfU1RBVF9DRkdfVFhfUEFDS0VUUywgQkNNT0xUX0dST1VQX0lEX0dQT05fR0VNX1BPUlRfU1RBVF9DRkdfVFhfQllURVMgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2dwb25fZ2VtX3BvcnRfYXV0b1tdID0geyBCQ01PTFRfR1JPVVBfSURfR1BPTl9HRU1fUE9SVF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRCwgQkNNT0xUX0dST1VQX0lEX0dQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9DTEVBUkVELCBCQ01PTFRfR1JPVVBfSURfR1BPTl9HRU1fUE9SVF9TVEFUX0FMQVJNX1JBSVNFRCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfR1BPTl9HRU1fUE9SVF9BVVRPX0NGRyB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZ3Bvbl9nZW1fcG9ydF9vcGVyW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9HUE9OX0dFTV9QT1JUX1NFVF9TVEFURSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZ3Bvbl9pd2Zfa2V5W10gPSB7IEJDTU9MVF9HUk9VUF9JRF9HUE9OX0lXRl9LRVkgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2dwb25faXdmX2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfR1BPTl9JV0ZfQ0ZHIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19ncG9uX2l3Zl9zdGF0W10gPSB7IEJDTU9MVF9HUk9VUF9JRF9HUE9OX0lXRl9TVEFUIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19ncG9uX2l3Zl9zdGF0X2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfR1BPTl9JV0ZfU1RBVF9DRkdfRFNfSElUX0VWRU5ULCBCQ01PTFRfR1JPVVBfSURfR1BPTl9JV0ZfU1RBVF9DRkdfRFNfTUlTU19FVkVOVCwgQkNNT0xUX0dST1VQX0lEX0dQT05fSVdGX1NUQVRfQ0ZHX0RTX0RST1BfRFVFX1RPX01JU1NfRVZFTlQsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX0lXRl9TVEFUX0NGR19EU19EUk9QX0RVRV9UT19ISVRfRVZFTlQsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX0lXRl9TVEFUX0NGR19EU19EUk9QX1RPX0RJU0FCTEVEX0dFTSwgQkNNT0xUX0dST1VQX0lEX0dQT05fSVdGX1NUQVRfQ0ZHX05FV19NQUNfRElTQ09WRVJFRCwgQkNNT0xUX0dST1VQX0lEX0dQT05fSVdGX1NUQVRfQ0ZHX01PVkVfRVZFTlQsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX0lXRl9TVEFUX0NGR19ORVdfTUFDX0RST1BfRFVFX1RPX0ZJRk9fRlVMTCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZ3Bvbl9pd2ZfYXV0b1tdID0geyBCQ01PTFRfR1JPVVBfSURfR1BPTl9JV0ZfRkxVU0hfTUFDX1RBQkxFX0NPTVBMRVRFRCwgQkNNT0xUX0dST1VQX0lEX0dQT05fSVdGX1NDQU5fTUFDX1RBQkxFX0NPTVBMRVRFRCwgQkNNT0xUX0dST1VQX0lEX0dQT05fSVdGX1NUQVRfQUxBUk1fQ0xFQVJFRCwgQkNNT0xUX0dST1VQX0lEX0dQT05fSVdGX1NUQVRfQUxBUk1fUkFJU0VEIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19ncG9uX2l3Zl9hdXRvX2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfR1BPTl9JV0ZfQVVUT19DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2dwb25faXdmX29wZXJbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0dQT05fSVdGX0ZMVVNIX01BQ19UQUJMRSwgQkNNT0xUX0dST1VQX0lEX0dQT05fSVdGX1NDQU5fTUFDX1RBQkxFIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXlbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0tFWSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXlbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19LRVkgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2dwb25faXdmX21hY190YWJsZV9rZXlbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0dQT05fSVdGX01BQ19UQUJMRV9LRVkgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2dwb25faXdmX21hY190YWJsZV9jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0dQT05fSVdGX01BQ19UQUJMRV9DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2dwb25faXdmX21hY190YWJsZV9hdXRvW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9HUE9OX0lXRl9NQUNfVEFCTEVfTUFDX0FHRUQsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX0lXRl9NQUNfVEFCTEVfTUFDX0RST1BQRUQsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX0lXRl9NQUNfVEFCTEVfTUFDX01PVkUsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX0lXRl9NQUNfVEFCTEVfTkVXX01BQyB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2dwb25faXdmX3VzX2Zsb3dfa2V5W10gPSB7IEJDTU9MVF9HUk9VUF9JRF9HUE9OX0lXRl9VU19GTE9XX0tFWSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19ncG9uX25pX2tleVtdID0geyBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9LRVkgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2dwb25fbmlfY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX0NGRyB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZ3Bvbl9uaV9zdGF0W10gPSB7IEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVQgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2dwb25fbmlfc3RhdF9jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9DRkdfRkVDX0NPREVXT1JEUywgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9DRkdfRkVDX0NPREVXT1JEU19VTkNPUlJFQ1RFRCwgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9DRkdfQklQOF9CWVRFUywgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9DRkdfQklQOF9FUlJPUlMsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQ0ZHX1JYX0dFTV9QQUNLRVRTLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFUX0NGR19SWF9HRU1fRFJPUFBFRCwgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9DRkdfUlhfR0VNX0lETEUsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQ0ZHX1JYX0dFTV9DT1JSRUNURUQsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQ0ZHX1JYX0dFTV9JTExFR0FMLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFUX0NGR19SWF9BTExPQ0FUSU9OU19WQUxJRCwgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9DRkdfUlhfQUxMT0NBVElPTlNfSU5WQUxJRCwgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9DRkdfUlhfQUxMT0NBVElPTlNfRElTQUJMRUQsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQ0ZHX1JYX1BMT0FNUywgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9DRkdfUlhfUExPQU1TX05PTl9JRExFLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFUX0NGR19SWF9QTE9BTVNfRVJST1IsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQ0ZHX1JYX1BMT0FNU19EUk9QUEVELCBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFUX0NGR19SWF9DUFUsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQ0ZHX1JYX09NQ0ksIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQ0ZHX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1IsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQ0ZHX1JYX0RST1BQRURfVE9PX1NIT1JULCBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFUX0NGR19SWF9EUk9QUEVEX1RPT19MT05HLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFUX0NGR19SWF9DUkNfRVJST1JTLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFUX0NGR19SWF9LRVlfRVJST1JTLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFUX0NGR19SWF9GUkFHTUVOVFNfRVJST1JTLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFUX0NGR19SWF9QQUNLRVRTX0RST1BQRUQsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQ0ZHX1RYX0dFTSwgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9DRkdfVFhfUExPQU1TLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFUX0NGR19UWF9HRU1fRlJBR01FTlRTLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFUX0NGR19UWF9DUFUsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQ0ZHX1RYX09NQ0ksIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQ0ZHX1RYX0NQVV9PTUNJX1BBQ0tFVFNfRFJPUFBFRCwgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9DRkdfVFhfRFJPUFBFRF9JTExFR0FMX0xFTkdUSCwgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9DRkdfVFhfRFJPUFBFRF9UUElEX01JU1MsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQ0ZHX1RYX0RST1BQRURfVklEX01JU1MgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2dwb25fbmlfYXV0b1tdID0geyBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9BQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX0NQVV9QQUNLRVRTX0ZBSUxVUkUsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX0RFQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVELCBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9ESVNBQkxFX0FMTF9PTlVTX0NPTVBMRVRFRCwgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfRU5BQkxFX0FMTF9PTlVTX0NPTVBMRVRFRCwgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfTE9TLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9PTlVfRElTQ09WRVJFRCwgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEUsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VELCBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRCwgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUUsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURUQsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1JPR1VFX09OVV9TUEVDSUFMX01BUF9DWUNMRV9TVEFSVCwgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU0VSSUFMX05VTUJFUl9BQ1FVSVNJVElPTl9DWUNMRV9TVEFSVCwgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURUQsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRfQUxBUk1fQ0xFQVJFRCwgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfU1RBVF9BTEFSTV9SQUlTRUQsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURUQsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZ3Bvbl9uaV9hdXRvX2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9BVVRPX0NGRyB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZ3Bvbl9uaV9vcGVyW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX0RJU0FCTEVfU0VSSUFMX05VTUJFUiwgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFlQRV9DX1NFVF9NVUxUSVBMRV9PTlVfU1RBVEUsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX05JX1JFU0VULCBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TRVRfT05VX1NUQVRFLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TRVRfUE9OX1NUQVRFLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TSU5HTEVfUkVRVUVTVF9TVEFOREJZX1BPTl9NT05JVE9SSU5HLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9OSV9TVEFSVF9PTlVfVVBHUkFERSwgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfVE9EX1JFUVVFU1QgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2dwb25fbmlfcHJveHlbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfQlJPQURDQVNUX1BMT0FNX1BBQ0tFVCwgQkNNT0xUX0dST1VQX0lEX0dQT05fTklfQ1BVX1BBQ0tFVFMgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2dwb25fb251X2tleVtdID0geyBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfS0VZIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19ncG9uX29udV9jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX0NGRyB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZ3Bvbl9vbnVfc3RhdFtdID0geyBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZ3Bvbl9vbnVfc3RhdF9jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX1NUQVRfQ0ZHX0ZFQ19DT0RFV09SRFMsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9TVEFUX0NGR19GRUNfQllURVNfQ09SUkVDVEVELCBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfRkVDX0NPREVXT1JEU19DT1JSRUNURUQsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9TVEFUX0NGR19GRUNfQ09ERVdPUkRTX1VOQ09SUkVDVEVELCBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfQklQOF9CWVRFUywgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX1NUQVRfQ0ZHX0JJUDhfRVJST1JTLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfUlhfUExPQU1TX0NSQ19FUlJPUiwgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX1NUQVRfQ0ZHX1JYX1BMT0FNU19OT05fSURMRSwgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX1NUQVRfQ0ZHX1BPU0lUSVZFX0RSSUZULCBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfTkVHQVRJVkVfRFJJRlQsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9TVEFUX0NGR19SWF9PTUNJLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9DRkdfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUiwgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX1NUQVRfQ0ZHX0JFUl9SRVBPUlRFRCwgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX1NUQVRfQ0ZHX1VOUkVDRUlWRURfQlVSU1QsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9TVEFUX0NGR19MQ0RHX0VSUk9SUywgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX1NUQVRfQ0ZHX1JESV9FUlJPUlMsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9TVEFUX0NGR19SWF9CWVRFUywgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX1NUQVRfQ0ZHX1JYX1BBQ0tFVFMsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9TVEFUX0NGR19UWF9CWVRFUywgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX1NUQVRfQ0ZHX1RYX1BBQ0tFVFMgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2dwb25fb251X2F1dG9bXSA9IHsgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX0JFUl9JTlRFUlZBTF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRCwgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX0RGSSwgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX0RHSSwgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX0RPV0ksIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9FUlIsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9JTlZBTElEX0RCUlVfUkVQT1JULCBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0NPTVBMRVRFRCwgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX0tFWV9FWENIQU5HRV9DWUNMRV9TS0lQUEVELCBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0RFQ1JZUFRfUkVRVUlSRUQsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENILCBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9SRVFVRVNUX1RJTUVPVVQsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfVU5DT05TRUNVVElWRV9JTkRFWCwgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX0xPQUksIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9MT0tJLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfTUVNSSwgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX09NQ0lfUE9SVF9JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRCwgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRCwgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX09OVV9BQ1RJVkFUSU9OX1NUQU5EQllfQ09NUExFVEVELCBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfT05VX0FMQVJNLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURUQsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9PTlVfRElTQUJMRV9DT01QTEVURUQsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9PTlVfRU5BQkxFX0NPTVBMRVRFRCwgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX09QVElDQUxfUkVGTEVDVElPTiwgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFRCwgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX1BFRSwgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX1BPU1NJQkxFX0RSSUZULCBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0UsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9QU1QsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRCwgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX1JFSSwgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVELCBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU0RJLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU0ZJLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9BTEFSTV9DTEVBUkVELCBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU1RBVF9BTEFSTV9SQUlTRUQsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9TVUZJLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfVElXSSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZ3Bvbl9vbnVfYXV0b19jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX0FVVE9fQ0ZHIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19ncG9uX29udV9vcGVyW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9DSEFOR0VfUE9XRVJfTEVWRUwsIEJDTU9MVF9HUk9VUF9JRF9HUE9OX09OVV9SU1NJX01FQVNVUkVNRU5ULCBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfU0VUX09OVV9TVEFURSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZ3Bvbl9vbnVfcHJveHlbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX0NQVV9QQUNLRVRTLCBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfUExPQU1fUEFDS0VUIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19ncG9uX29udV9wcm94eV9yeFtdID0geyBCQ01PTFRfR1JPVVBfSURfR1BPTl9PTlVfQ1BVX1BBQ0tFVCwgQkNNT0xUX0dST1VQX0lEX0dQT05fT05VX09NQ0lfUEFDS0VUIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19ncG9uX3RyeF9rZXlbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0dQT05fVFJYX0tFWSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfZ3Bvbl90cnhfY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9HUE9OX1RSWF9DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2xvZ19lbnRyeV9rZXlbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0xPR19FTlRSWV9LRVkgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2xvZ19lbnRyeV9jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0xPR19FTlRSWV9DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2xvZ19lbnRyeV9zdGF0W10gPSB7IEJDTU9MVF9HUk9VUF9JRF9MT0dfRU5UUllfU1RBVCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfbG9nX2VudHJ5X3N0YXRfY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9MT0dfRU5UUllfU1RBVF9DRkdfTVNHX0NPVU5ULCBCQ01PTFRfR1JPVVBfSURfTE9HX0VOVFJZX1NUQVRfQ0ZHX0xPU1RfTVNHX0NPVU5UIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19sb2dfZW50cnlfYXV0b1tdID0geyBCQ01PTFRfR1JPVVBfSURfTE9HX0VOVFJZX1NUQVRfQUxBUk1fQ0xFQVJFRCwgQkNNT0xUX0dST1VQX0lEX0xPR19FTlRSWV9TVEFUX0FMQVJNX1JBSVNFRCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfbG9nX2VudHJ5X2F1dG9fY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9MT0dfRU5UUllfQVVUT19DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2xvZ2dlcl9rZXlbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0xPR0dFUl9LRVkgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2xvZ2dlcl9jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX0xPR0dFUl9DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2xvZ2dlcl9zdGF0W10gPSB7IEJDTU9MVF9HUk9VUF9JRF9MT0dHRVJfU1RBVCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfbG9nZ2VyX3N0YXRfY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9MT0dHRVJfU1RBVF9DRkdfTElORVNfSU5fTE9HIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19sb2dnZXJfYXV0b1tdID0geyBCQ01PTFRfR1JPVVBfSURfTE9HR0VSX1NUQVRfQUxBUk1fQ0xFQVJFRCwgQkNNT0xUX0dST1VQX0lEX0xPR0dFUl9TVEFUX0FMQVJNX1JBSVNFRCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfbG9nZ2VyX2F1dG9fY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9MT0dHRVJfQVVUT19DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX2xvZ2dlcl9vcGVyW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9MT0dHRVJfQ0xFQVJfTE9HIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19ubmlfa2V5W10gPSB7IEJDTU9MVF9HUk9VUF9JRF9OTklfS0VZIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19ubmlfY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9OTklfQ0ZHIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19ubmlfc3RhdFtdID0geyBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVQgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX25uaV9zdGF0X2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX0ZSQU1FU182NCwgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9GUkFNRVNfNjVfMTI3LCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX0ZSQU1FU18xMjhfMjU1LCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX0ZSQU1FU18yNTZfNTExLCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX0ZSQU1FU181MTJfMTAyMywgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9GUkFNRVNfMTAyNF8xNTE4LCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX0ZSQU1FU18xNTE5XzIwNDcsIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfUlhfRlJBTUVTXzIwNDhfNDA5NSwgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9GUkFNRVNfNDA5Nl85MjE2LCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX0ZSQU1FU185MjE3XzE2MzgzLCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9CWVRFUywgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9HT09EX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9VTklDQVNUX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9NVUxUSUNBU1RfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX0JST0FEQ0FTVF9GUkFNRVMsIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfUlhfRkNTX0VSUk9SUywgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9DT05UUk9MX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9QQVVTRV9GUkFNRVMsIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfUlhfUEZDX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9VTlNVUFBPUlRFRF9PUENPREUsIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfUlhfVU5TVVBQT1JURURfREEsIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfUlhfQUxJR05NRU5UX0VSUk9SUywgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9MRU5HVEhfT1VUX09GX1JBTkdFLCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX0NPREVfRVJST1JTLCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX09WRVJTSVpFRF9GUkFNRVMsIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfUlhfSkFCQkVSX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9NVFVfQ0hFQ0tfRVJST1JTLCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX1BST01JU0NVT1VTX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9WTEFOX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9ET1VCTEVfVkxBTl9GUkFNRVMsIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfUlhfVFJVTkNBVEVEX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19SWF9VTkRFUlNJWkVfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX0ZSQUdNRU5URURfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1JYX1JVTlRfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1RYX0ZSQU1FU182NCwgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19UWF9GUkFNRVNfNjVfMTI3LCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1RYX0ZSQU1FU18xMjhfMjU1LCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1RYX0ZSQU1FU18yNTZfNTExLCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1RYX0ZSQU1FU181MTJfMTAyMywgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19UWF9GUkFNRVNfMTAyNF8xNTE4LCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1RYX0ZSQU1FU18xNTE5XzIwNDcsIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfVFhfRlJBTUVTXzIwNDhfNDA5NSwgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19UWF9GUkFNRVNfNDA5Nl85MjE2LCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1RYX0ZSQU1FU185MjE3XzE2MzgzLCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1RYX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19UWF9CWVRFUywgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19UWF9HT09EX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19UWF9VTklDQVNUX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19UWF9NVUxUSUNBU1RfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1RYX0JST0FEQ0FTVF9GUkFNRVMsIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfVFhfUEFVU0VfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1RYX1BGQ19GUkFNRVMsIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfVFhfSkFCQkVSX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19UWF9GQ1NfRVJST1JTLCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1RYX0NPTlRST0xfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1RYX09WRVJTSVpFX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19UWF9GUkFHTUVOVEVEX0ZSQU1FUywgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0NGR19UWF9FUlJPUl9GUkFNRVMsIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfVFhfVkxBTl9GUkFNRVMsIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9DRkdfVFhfRE9VQkxFX1ZMQU5fRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1RYX1JVTlRfRlJBTUVTLCBCQ01PTFRfR1JPVVBfSURfTk5JX1NUQVRfQ0ZHX1RYX1VOREVSUlVOX0ZSQU1FUyB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfbm5pX2F1dG9bXSA9IHsgQkNNT0xUX0dST1VQX0lEX05OSV9TVEFUX0FMQVJNX0NMRUFSRUQsIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVF9BTEFSTV9SQUlTRUQsIEJDTU9MVF9HUk9VUF9JRF9OTklfU1RBVFVTX0NIQU5HRUQgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX25uaV9hdXRvX2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfTk5JX0FVVE9fQ0ZHIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc19ubmlfc2VyZGVzX2tleVtdID0geyBCQ01PTFRfR1JPVVBfSURfTk5JX1NFUkRFU19LRVkgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX25uaV9zZXJkZXNfY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9OTklfU0VSREVTX0NGRyB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfc29mdHdhcmVfZXJyb3Jfa2V5W10gPSB7IEJDTU9MVF9HUk9VUF9JRF9TT0ZUV0FSRV9FUlJPUl9LRVkgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX3NvZnR3YXJlX2Vycm9yX2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfU09GVFdBUkVfRVJST1JfQ0ZHIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc190cnhfY2FsaWJyYXRpb25fa2V5W10gPSB7IEJDTU9MVF9HUk9VUF9JRF9UUlhfQ0FMSUJSQVRJT05fS0VZIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc190cnhfY2FsaWJyYXRpb25fYXV0b1tdID0geyBCQ01PTFRfR1JPVVBfSURfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc190cnhfY2FsaWJyYXRpb25fYXV0b19jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX1RSWF9DQUxJQlJBVElPTl9BVVRPX0NGRyB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfdHJ4X2NhbGlicmF0aW9uX29wZXJbXSA9IHsgQkNNT0xUX0dST1VQX0lEX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPVywgQkNNT0xUX0dST1VQX0lEX1RSWF9DQUxJQlJBVElPTl9TVE9QX0NBUFRVUkVfV0lORE9XIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc194Z3Bvbl9hbGxvY19rZXlbXSA9IHsgQkNNT0xUX0dST1VQX0lEX1hHUE9OX0FMTE9DX0tFWSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfeGdwb25fYWxsb2NfY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9BTExPQ19DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX3hncG9uX2FsbG9jX3N0YXRbXSA9IHsgQkNNT0xUX0dST1VQX0lEX1hHUE9OX0FMTE9DX1NUQVQgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX3hncG9uX2FsbG9jX3N0YXRfY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9BTExPQ19TVEFUX0NGR19SWF9CWVRFUyB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfeGdwb25fYWxsb2NfYXV0b1tdID0geyBCQ01PTFRfR1JPVVBfSURfWEdQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURUQsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVELCBCQ01PTFRfR1JPVVBfSURfWEdQT05fQUxMT0NfU1RBVF9BTEFSTV9DTEVBUkVELCBCQ01PTFRfR1JPVVBfSURfWEdQT05fQUxMT0NfU1RBVF9BTEFSTV9SQUlTRUQgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX3hncG9uX2FsbG9jX2F1dG9fY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9BTExPQ19BVVRPX0NGRyB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfeGdwb25fYWxsb2Nfb3BlcltdID0geyBCQ01PTFRfR1JPVVBfSURfWEdQT05fQUxMT0NfR0VUX1NUQVRTLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fQUxMT0NfU0VUX1NUQVRFIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc194Z3Bvbl9nZW1fcG9ydF9rZXlbXSA9IHsgQkNNT0xUX0dST1VQX0lEX1hHUE9OX0dFTV9QT1JUX0tFWSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfeGdwb25fZ2VtX3BvcnRfY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9HRU1fUE9SVF9DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX3hncG9uX2dlbV9wb3J0X3N0YXRbXSA9IHsgQkNNT0xUX0dST1VQX0lEX1hHUE9OX0dFTV9QT1JUX1NUQVQgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9HRU1fUE9SVF9TVEFUX0NGR19UWF9CWVRFUywgQkNNT0xUX0dST1VQX0lEX1hHUE9OX0dFTV9QT1JUX1NUQVRfQ0ZHX1RYX1BBQ0tFVFMsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9HRU1fUE9SVF9TVEFUX0NGR19SWF9QQUNLRVRTLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fR0VNX1BPUlRfU1RBVF9DRkdfUlhfQllURVMgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX3hncG9uX2dlbV9wb3J0X2F1dG9bXSA9IHsgQkNNT0xUX0dST1VQX0lEX1hHUE9OX0dFTV9QT1JUX1NUQVRfQUxBUk1fQ0xFQVJFRCwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX0dFTV9QT1JUX1NUQVRfQUxBUk1fUkFJU0VEIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc194Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfWEdQT05fR0VNX1BPUlRfQVVUT19DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX3hncG9uX2l3Zl9rZXlbXSA9IHsgQkNNT0xUX0dST1VQX0lEX1hHUE9OX0lXRl9LRVkgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX3hncG9uX2l3Zl9jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX1hHUE9OX0lXRl9DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX3hncG9uX25pX2tleVtdID0geyBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfS0VZIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc194Z3Bvbl9uaV9jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX0NGRyB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfeGdwb25fbmlfc3RhdFtdID0geyBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfU1RBVCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfeGdwb25fbmlfc3RhdF9jZmdbXSA9IHsgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX0ZFQ19DT0RFV09SRFMsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9TVEFUX0NGR19CSVAzMl9CWVRFUywgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX0JJUDMyX0VSUk9SUywgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX1hHVENfSEVBREVSUywgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX1hHVENfQ09SUkVDVEVELCBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfU1RBVF9DRkdfUlhfWEdUQ19VTkNPUlJFQ1RFRCwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX1hHRU0sIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9TVEFUX0NGR19SWF9YR0VNX0RST1BQRUQsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9TVEFUX0NGR19SWF9YR0VNX0lETEUsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9TVEFUX0NGR19SWF9YR0VNX0NPUlJFQ1RFRCwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX0NSQ19FUlJPUiwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX0ZSQUdNRU5UX0VSUk9SLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfU1RBVF9DRkdfUlhfUEFDS0VUU19EUk9QUEVELCBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfU1RBVF9DRkdfUlhfRFJPUFBFRF9UT09fU0hPUlQsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9TVEFUX0NGR19SWF9EUk9QUEVEX1RPT19MT05HLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfU1RBVF9DRkdfUlhfS0VZX0VSUk9SLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfU1RBVF9DRkdfVFhfUExPQU1TLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfU1RBVF9DRkdfUlhfUExPQU1TX0RST1BQRUQsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9TVEFUX0NGR19SWF9BTExPQ0FUSU9OU19WQUxJRCwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX0FMTE9DQVRJT05TX0lOVkFMSUQsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9TVEFUX0NGR19SWF9BTExPQ0FUSU9OU19ESVNBQkxFRCwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX1BMT0FNUywgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX1BMT0FNU19OT05fSURMRSwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX1BMT0FNU19FUlJPUiwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX0NQVSwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1JYX09NQ0ksIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9TVEFUX0NGR19SWF9PTUNJX1BBQ0tFVFNfQ1JDX0VSUk9SLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfU1RBVF9DRkdfVFhfUEFDS0VUUywgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1RYX1hHRU0sIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9TVEFUX0NGR19UWF9DUFUsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9TVEFUX0NGR19UWF9PTUNJLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfU1RBVF9DRkdfVFhfQ1BVX09NQ0lfUEFDS0VUU19EUk9QUEVELCBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfU1RBVF9DRkdfVFhfRFJPUFBFRF9JTExFR0FMX0xFTkdUSCwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRfQ0ZHX1RYX0RST1BQRURfVFBJRF9NSVNTLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfU1RBVF9DRkdfVFhfRFJPUFBFRF9WSURfTUlTUyB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfeGdwb25fbmlfYXV0b1tdID0geyBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVELCBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfQ1BVX1BBQ0tFVFNfRkFJTFVSRSwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX0RFQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVELCBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfRElTQUJMRV9BTExfT05VU19DT01QTEVURUQsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9FTkFCTEVfQUxMX09OVVNfQ09NUExFVEVELCBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfTE9TLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfT05VX0RJU0NPVkVSRUQsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9PTlVfVVBHUkFERV9DT01QTEVURSwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VELCBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfU1dJVENIT1ZFUl9DT01QTEVURUQsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRSwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURUQsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9ST0dVRV9PTlVfU1BFQ0lBTF9NQVBfQ1lDTEVfU1RBUlQsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9TRVJJQUxfTlVNQkVSX0FDUVVJU0lUSU9OX0NZQ0xFX1NUQVJULCBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURUQsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9TVEFUX0FMQVJNX0NMRUFSRUQsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9TVEFUX0FMQVJNX1JBSVNFRCwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURUQsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURUQgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX3hncG9uX25pX2F1dG9fY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9BVVRPX0NGRyB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfeGdwb25fbmlfb3BlcltdID0geyBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfQURKVVNUX1RYX1dBVkVMRU5HVEgsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9ESVNBQkxFX1NFUklBTF9OVU1CRVIsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9SRVNFVCwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1csIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9SVU5fU1BFQ0lBTF9CV19NQVAsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9TRVRfT05VX1NUQVRFLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfU0VUX1BPTl9TVEFURSwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1NJTkdMRV9SRVFVRVNUX1NUQU5EQllfUE9OX01PTklUT1JJTkcsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9OSV9TVEFSVF9PTlVfVVBHUkFERSwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX1RPRF9SRVFVRVNUIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc194Z3Bvbl9uaV9wcm94eVtdID0geyBCQ01PTFRfR1JPVVBfSURfWEdQT05fTklfQlJPQURDQVNUX1BMT0FNX1BBQ0tFVCwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX05JX0NQVV9QQUNLRVRTIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc194Z3Bvbl9vbnVfa2V5W10gPSB7IEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfS0VZIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc194Z3Bvbl9vbnVfY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfQ0ZHIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkIGdyb3VwX2lkc194Z3Bvbl9vbnVfc3RhdFtdID0geyBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1NUQVQgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX3hncG9uX29udV9zdGF0X2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1NUQVRfQ0ZHX1BPU0lUSVZFX0RSSUZULCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1NUQVRfQ0ZHX05FR0FUSVZFX0RSSUZULCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1NUQVRfQ0ZHX0RFTElNSVRFUl9NSVNTX0RFVEVDVElPTiwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9TVEFUX0NGR19CSVAzMl9FUlJPUlMsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfU1RBVF9DRkdfUlhfV09SRFMsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfU1RBVF9DRkdfRkVDX0NPUlJFQ1RFRF9TWU1CT0xTLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1NUQVRfQ0ZHX0ZFQ19DT1JSRUNURURfQ09ERVdPUkRTLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1NUQVRfQ0ZHX0ZFQ19VTkNPUlJFQ1RBQkxFX0NPREVXT1JEUywgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9TVEFUX0NGR19GRUNfQ09ERVdPUkRTLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1NUQVRfQ0ZHX0ZFQ19DT1JSRUNURURfQklUUywgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9TVEFUX0NGR19YR0VNX0tFWV9FUlJPUlMsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfU1RBVF9DRkdfWEdFTV9MT1NTLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1NUQVRfQ0ZHX1JYX1BMT0FNU19NSUNfRVJST1IsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfU1RBVF9DRkdfUlhfUExPQU1TX05PTl9JRExFLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1NUQVRfQ0ZHX1JYX09NQ0ksIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfU1RBVF9DRkdfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUiwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9TVEFUX0NGR19SWF9CWVRFUywgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9TVEFUX0NGR19SWF9QQUNLRVRTLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1NUQVRfQ0ZHX1RYX0JZVEVTLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1NUQVRfQ0ZHX1RYX1BBQ0tFVFMgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX3hncG9uX29udV9hdXRvW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfREZJLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX0RHSSwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9ET1dJLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX0lOVkFMSURfREJSVV9SRVBPUlQsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0NPTVBMRVRFRCwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9LRVlfRVhDSEFOR0VfQ1lDTEVfU0tJUFBFRCwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENILCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfUkVRVUVTVF9USU1FT1VULCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX0xPT0NJLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRCwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9PTlVfQUxBUk0sIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURUQsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfT05VX0RJU0FCTEVfQ09NUExFVEVELCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX09OVV9FTkFCTEVfQ09NUExFVEVELCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX09OVV9UVU5JTkdfSU5fQ09NUExFVEVELCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0NPTVBMRVRFRCwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9PUFRJQ0FMX1JFRkxFQ1RJT04sIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfUE9TU0lCTEVfRFJJRlQsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfUE9XRVJfQ09OU1VNUFRJT05fUkVQT1JULCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1BPV0VSX0xFVkVMX1JFUE9SVCwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRSwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9QUVNJLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVELCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1JFR0lTVFJBVElPTl9JRCwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRCwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9TREksIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9GQUlMVVJFLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1NGSSwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9TVEFUX0FMQVJNX0NMRUFSRUQsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfU1RBVF9BTEFSTV9SQUlTRUQsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfU1VGSSwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9USVdJLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1RVTklOR19SRVNQT05TRSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfeGdwb25fb251X2F1dG9fY2ZnW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfQVVUT19DRkcgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX3hncG9uX29udV9vcGVyW10gPSB7IEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfQURKVVNUX1RYX1dBVkVMRU5HVEgsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfQ0hBTkdFX1BPV0VSX0xFVkVMTElORywgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9HRVRfUE9XRVJfQ09OU1VNUFRJT04sIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfR0VUX1BPV0VSX0xFVkVMLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX09OVV9UVU5JTkdfSU4sIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVQsIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfUkVRVUVTVF9SRUdJU1RSQVRJT04sIEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfUlNTSV9NRUFTVVJFTUVOVCwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1NFVF9PTlVfU1RBVEUgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX3hncG9uX29udV9wcm94eVtdID0geyBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX0NQVV9QQUNLRVRTLCBCQ01PTFRfR1JPVVBfSURfWEdQT05fT05VX1BMT0FNX1BBQ0tFVCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfeGdwb25fb251X3Byb3h5X3J4W10gPSB7IEJDTU9MVF9HUk9VUF9JRF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVCwgQkNNT0xUX0dST1VQX0lEX1hHUE9OX09OVV9PTUNJX1BBQ0tFVCB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfeGdwb25fdHJ4X2tleVtdID0geyBCQ01PTFRfR1JPVVBfSURfWEdQT05fVFJYX0tFWSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfeGdwb25fdHJ4X2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfWEdQT05fVFJYX0NGRyB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZCBncm91cF9pZHNfeHBvbl9zZXJkZXNfa2V5W10gPSB7IEJDTU9MVF9HUk9VUF9JRF9YUE9OX1NFUkRFU19LRVkgfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWRzX3hwb25fc2VyZGVzX2NmZ1tdID0geyBCQ01PTFRfR1JPVVBfSURfWFBPTl9TRVJERVNfQ0ZHIH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkcyBncm91cF9pZHNfb2JqX2FlX25pW10gPSB7IHsgMSwgZ3JvdXBfaWRzX2FlX25pX2tleSB9LCB7IDEsIGdyb3VwX2lkc19hZV9uaV9jZmcgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMSwgZ3JvdXBfaWRzX2FlX25pX29wZXIgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9IH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkcyBncm91cF9pZHNfb2JqX2FlX3BhdGhfZHNbXSA9IHsgeyAxLCBncm91cF9pZHNfYWVfcGF0aF9kc19rZXkgfSwgeyAwLCBOVUxMIH0sIHsgMSwgZ3JvdXBfaWRzX2FlX3BhdGhfZHNfc3RhdCB9LCB7IDE3LCBncm91cF9pZHNfYWVfcGF0aF9kc19zdGF0X2NmZyB9LCB7IDIsIGdyb3VwX2lkc19hZV9wYXRoX2RzX2F1dG8gfSwgeyAxLCBncm91cF9pZHNfYWVfcGF0aF9kc19hdXRvX2NmZyB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9IH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkcyBncm91cF9pZHNfb2JqX2FlX3BhdGhfdXNbXSA9IHsgeyAxLCBncm91cF9pZHNfYWVfcGF0aF91c19rZXkgfSwgeyAwLCBOVUxMIH0sIHsgMSwgZ3JvdXBfaWRzX2FlX3BhdGhfdXNfc3RhdCB9LCB7IDIwLCBncm91cF9pZHNfYWVfcGF0aF91c19zdGF0X2NmZyB9LCB7IDIsIGdyb3VwX2lkc19hZV9wYXRoX3VzX2F1dG8gfSwgeyAxLCBncm91cF9pZHNfYWVfcGF0aF91c19hdXRvX2NmZyB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9IH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkcyBncm91cF9pZHNfb2JqX2NoYW5uZWxbXSA9IHsgeyAxLCBncm91cF9pZHNfY2hhbm5lbF9rZXkgfSwgeyAxLCBncm91cF9pZHNfY2hhbm5lbF9jZmcgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWRzIGdyb3VwX2lkc19vYmpfZGVidWdbXSA9IHsgeyAxLCBncm91cF9pZHNfZGVidWdfa2V5IH0sIHsgMSwgZ3JvdXBfaWRzX2RlYnVnX2NmZyB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMiwgZ3JvdXBfaWRzX2RlYnVnX2F1dG8gfSwgeyAxLCBncm91cF9pZHNfZGVidWdfYXV0b19jZmcgfSwgeyA0LCBncm91cF9pZHNfZGVidWdfb3BlciB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWRzIGdyb3VwX2lkc19vYmpfZGV2aWNlW10gPSB7IHsgMSwgZ3JvdXBfaWRzX2RldmljZV9rZXkgfSwgeyAxLCBncm91cF9pZHNfZGV2aWNlX2NmZyB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMTEsIGdyb3VwX2lkc19kZXZpY2VfYXV0byB9LCB7IDEsIGdyb3VwX2lkc19kZXZpY2VfYXV0b19jZmcgfSwgeyA4LCBncm91cF9pZHNfZGV2aWNlX29wZXIgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9IH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkcyBncm91cF9pZHNfb2JqX2Vwb25fZGVuaWVkX2xpbmtbXSA9IHsgeyAxLCBncm91cF9pZHNfZXBvbl9kZW5pZWRfbGlua19rZXkgfSwgeyAxLCBncm91cF9pZHNfZXBvbl9kZW5pZWRfbGlua19jZmcgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDEwLCBncm91cF9pZHNfZXBvbl9kZW5pZWRfbGlua19hdXRvIH0sIHsgMSwgZ3JvdXBfaWRzX2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmcgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZHMgZ3JvdXBfaWRzX29ial9lcG9uX2xpbmtbXSA9IHsgeyAxLCBncm91cF9pZHNfZXBvbl9saW5rX2tleSB9LCB7IDEsIGdyb3VwX2lkc19lcG9uX2xpbmtfY2ZnIH0sIHsgMSwgZ3JvdXBfaWRzX2Vwb25fbGlua19zdGF0IH0sIHsgNDMsIGdyb3VwX2lkc19lcG9uX2xpbmtfc3RhdF9jZmcgfSwgeyAyMSwgZ3JvdXBfaWRzX2Vwb25fbGlua19hdXRvIH0sIHsgMSwgZ3JvdXBfaWRzX2Vwb25fbGlua19hdXRvX2NmZyB9LCB7IDcsIGdyb3VwX2lkc19lcG9uX2xpbmtfb3BlciB9LCB7IDEsIGdyb3VwX2lkc19lcG9uX2xpbmtfcHJveHkgfSwgeyAxLCBncm91cF9pZHNfZXBvbl9saW5rX3Byb3h5X3J4IH0gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWRzIGdyb3VwX2lkc19vYmpfZXBvbl9uaVtdID0geyB7IDEsIGdyb3VwX2lkc19lcG9uX25pX2tleSB9LCB7IDEsIGdyb3VwX2lkc19lcG9uX25pX2NmZyB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMTAsIGdyb3VwX2lkc19lcG9uX25pX2F1dG8gfSwgeyAxLCBncm91cF9pZHNfZXBvbl9uaV9hdXRvX2NmZyB9LCB7IDgsIGdyb3VwX2lkc19lcG9uX25pX29wZXIgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9IH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkcyBncm91cF9pZHNfb2JqX2Vwb25fb251XzEwZ191c1tdID0geyB7IDEsIGdyb3VwX2lkc19lcG9uX29udV8xMGdfdXNfa2V5IH0sIHsgMSwgZ3JvdXBfaWRzX2Vwb25fb251XzEwZ191c19jZmcgfSwgeyAxLCBncm91cF9pZHNfZXBvbl9vbnVfMTBnX3VzX3N0YXQgfSwgeyA0LCBncm91cF9pZHNfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnIH0sIHsgMiwgZ3JvdXBfaWRzX2Vwb25fb251XzEwZ191c19hdXRvIH0sIHsgMSwgZ3JvdXBfaWRzX2Vwb25fb251XzEwZ191c19hdXRvX2NmZyB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9IH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkcyBncm91cF9pZHNfb2JqX2Vwb25fb251XzFnX3VzW10gPSB7IHsgMSwgZ3JvdXBfaWRzX2Vwb25fb251XzFnX3VzX2tleSB9LCB7IDEsIGdyb3VwX2lkc19lcG9uX29udV8xZ191c19jZmcgfSwgeyAxLCBncm91cF9pZHNfZXBvbl9vbnVfMWdfdXNfc3RhdCB9LCB7IDE2LCBncm91cF9pZHNfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmcgfSwgeyAyLCBncm91cF9pZHNfZXBvbl9vbnVfMWdfdXNfYXV0byB9LCB7IDEsIGdyb3VwX2lkc19lcG9uX29udV8xZ191c19hdXRvX2NmZyB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9IH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkcyBncm91cF9pZHNfb2JqX2Vwb25fcGF0aF8xMGdfZHNbXSA9IHsgeyAxLCBncm91cF9pZHNfZXBvbl9wYXRoXzEwZ19kc19rZXkgfSwgeyAxLCBncm91cF9pZHNfZXBvbl9wYXRoXzEwZ19kc19jZmcgfSwgeyAxLCBncm91cF9pZHNfZXBvbl9wYXRoXzEwZ19kc19zdGF0IH0sIHsgMjEsIGdyb3VwX2lkc19lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnIH0sIHsgMiwgZ3JvdXBfaWRzX2Vwb25fcGF0aF8xMGdfZHNfYXV0byB9LCB7IDEsIGdyb3VwX2lkc19lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWRzIGdyb3VwX2lkc19vYmpfZXBvbl9wYXRoXzEwZ191c1tdID0geyB7IDEsIGdyb3VwX2lkc19lcG9uX3BhdGhfMTBnX3VzX2tleSB9LCB7IDEsIGdyb3VwX2lkc19lcG9uX3BhdGhfMTBnX3VzX2NmZyB9LCB7IDEsIGdyb3VwX2lkc19lcG9uX3BhdGhfMTBnX3VzX3N0YXQgfSwgeyAyNiwgZ3JvdXBfaWRzX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmcgfSwgeyAyLCBncm91cF9pZHNfZXBvbl9wYXRoXzEwZ191c19hdXRvIH0sIHsgMSwgZ3JvdXBfaWRzX2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmcgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZHMgZ3JvdXBfaWRzX29ial9lcG9uX3BhdGhfMWdfZHNbXSA9IHsgeyAxLCBncm91cF9pZHNfZXBvbl9wYXRoXzFnX2RzX2tleSB9LCB7IDEsIGdyb3VwX2lkc19lcG9uX3BhdGhfMWdfZHNfY2ZnIH0sIHsgMSwgZ3JvdXBfaWRzX2Vwb25fcGF0aF8xZ19kc19zdGF0IH0sIHsgMjEsIGdyb3VwX2lkc19lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmcgfSwgeyAyLCBncm91cF9pZHNfZXBvbl9wYXRoXzFnX2RzX2F1dG8gfSwgeyAxLCBncm91cF9pZHNfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWRzIGdyb3VwX2lkc19vYmpfZXBvbl9wYXRoXzFnX3VzW10gPSB7IHsgMSwgZ3JvdXBfaWRzX2Vwb25fcGF0aF8xZ191c19rZXkgfSwgeyAxLCBncm91cF9pZHNfZXBvbl9wYXRoXzFnX3VzX2NmZyB9LCB7IDEsIGdyb3VwX2lkc19lcG9uX3BhdGhfMWdfdXNfc3RhdCB9LCB7IDI2LCBncm91cF9pZHNfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnIH0sIHsgMiwgZ3JvdXBfaWRzX2Vwb25fcGF0aF8xZ191c19hdXRvIH0sIHsgMSwgZ3JvdXBfaWRzX2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZyB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9IH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkcyBncm91cF9pZHNfb2JqX2Vwb25fcnBbXSA9IHsgeyAxLCBncm91cF9pZHNfZXBvbl9ycF9rZXkgfSwgeyAxLCBncm91cF9pZHNfZXBvbl9ycF9jZmcgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWRzIGdyb3VwX2lkc19vYmpfZ3Bpb1tdID0geyB7IDEsIGdyb3VwX2lkc19ncGlvX2tleSB9LCB7IDEsIGdyb3VwX2lkc19ncGlvX2NmZyB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZHMgZ3JvdXBfaWRzX29ial9ncG9uX2FsbG9jW10gPSB7IHsgMSwgZ3JvdXBfaWRzX2dwb25fYWxsb2Nfa2V5IH0sIHsgMSwgZ3JvdXBfaWRzX2dwb25fYWxsb2NfY2ZnIH0sIHsgMSwgZ3JvdXBfaWRzX2dwb25fYWxsb2Nfc3RhdCB9LCB7IDEsIGdyb3VwX2lkc19ncG9uX2FsbG9jX3N0YXRfY2ZnIH0sIHsgNCwgZ3JvdXBfaWRzX2dwb25fYWxsb2NfYXV0byB9LCB7IDEsIGdyb3VwX2lkc19ncG9uX2FsbG9jX2F1dG9fY2ZnIH0sIHsgMiwgZ3JvdXBfaWRzX2dwb25fYWxsb2Nfb3BlciB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWRzIGdyb3VwX2lkc19vYmpfZ3Bvbl9nZW1fcG9ydFtdID0geyB7IDEsIGdyb3VwX2lkc19ncG9uX2dlbV9wb3J0X2tleSB9LCB7IDEsIGdyb3VwX2lkc19ncG9uX2dlbV9wb3J0X2NmZyB9LCB7IDEsIGdyb3VwX2lkc19ncG9uX2dlbV9wb3J0X3N0YXQgfSwgeyA0LCBncm91cF9pZHNfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZyB9LCB7IDMsIGdyb3VwX2lkc19ncG9uX2dlbV9wb3J0X2F1dG8gfSwgeyAxLCBncm91cF9pZHNfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZyB9LCB7IDEsIGdyb3VwX2lkc19ncG9uX2dlbV9wb3J0X29wZXIgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9IH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkcyBncm91cF9pZHNfb2JqX2dwb25faXdmW10gPSB7IHsgMSwgZ3JvdXBfaWRzX2dwb25faXdmX2tleSB9LCB7IDEsIGdyb3VwX2lkc19ncG9uX2l3Zl9jZmcgfSwgeyAxLCBncm91cF9pZHNfZ3Bvbl9pd2Zfc3RhdCB9LCB7IDgsIGdyb3VwX2lkc19ncG9uX2l3Zl9zdGF0X2NmZyB9LCB7IDQsIGdyb3VwX2lkc19ncG9uX2l3Zl9hdXRvIH0sIHsgMSwgZ3JvdXBfaWRzX2dwb25faXdmX2F1dG9fY2ZnIH0sIHsgMiwgZ3JvdXBfaWRzX2dwb25faXdmX29wZXIgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9IH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkcyBncm91cF9pZHNfb2JqX2dwb25faXdmX2RzX2VncmVzc19mbG93W10gPSB7IHsgMSwgZ3JvdXBfaWRzX2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleSB9LCB7IDEsIGdyb3VwX2lkc19ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmcgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWRzIGdyb3VwX2lkc19vYmpfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93W10gPSB7IHsgMSwgZ3JvdXBfaWRzX2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXkgfSwgeyAxLCBncm91cF9pZHNfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZyB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZHMgZ3JvdXBfaWRzX29ial9ncG9uX2l3Zl9tYWNfdGFibGVbXSA9IHsgeyAxLCBncm91cF9pZHNfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSB9LCB7IDEsIGdyb3VwX2lkc19ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyA0LCBncm91cF9pZHNfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG8gfSwgeyAxLCBncm91cF9pZHNfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWRzIGdyb3VwX2lkc19vYmpfZ3Bvbl9pd2ZfdXNfZmxvd1tdID0geyB7IDEsIGdyb3VwX2lkc19ncG9uX2l3Zl91c19mbG93X2tleSB9LCB7IDEsIGdyb3VwX2lkc19ncG9uX2l3Zl91c19mbG93X2NmZyB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZHMgZ3JvdXBfaWRzX29ial9ncG9uX25pW10gPSB7IHsgMSwgZ3JvdXBfaWRzX2dwb25fbmlfa2V5IH0sIHsgMSwgZ3JvdXBfaWRzX2dwb25fbmlfY2ZnIH0sIHsgMSwgZ3JvdXBfaWRzX2dwb25fbmlfc3RhdCB9LCB7IDM0LCBncm91cF9pZHNfZ3Bvbl9uaV9zdGF0X2NmZyB9LCB7IDE5LCBncm91cF9pZHNfZ3Bvbl9uaV9hdXRvIH0sIHsgMSwgZ3JvdXBfaWRzX2dwb25fbmlfYXV0b19jZmcgfSwgeyA5LCBncm91cF9pZHNfZ3Bvbl9uaV9vcGVyIH0sIHsgMiwgZ3JvdXBfaWRzX2dwb25fbmlfcHJveHkgfSwgeyAwLCBOVUxMIH0gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWRzIGdyb3VwX2lkc19vYmpfZ3Bvbl9vbnVbXSA9IHsgeyAxLCBncm91cF9pZHNfZ3Bvbl9vbnVfa2V5IH0sIHsgMSwgZ3JvdXBfaWRzX2dwb25fb251X2NmZyB9LCB7IDEsIGdyb3VwX2lkc19ncG9uX29udV9zdGF0IH0sIHsgMjAsIGdyb3VwX2lkc19ncG9uX29udV9zdGF0X2NmZyB9LCB7IDM3LCBncm91cF9pZHNfZ3Bvbl9vbnVfYXV0byB9LCB7IDEsIGdyb3VwX2lkc19ncG9uX29udV9hdXRvX2NmZyB9LCB7IDMsIGdyb3VwX2lkc19ncG9uX29udV9vcGVyIH0sIHsgMiwgZ3JvdXBfaWRzX2dwb25fb251X3Byb3h5IH0sIHsgMiwgZ3JvdXBfaWRzX2dwb25fb251X3Byb3h5X3J4IH0gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWRzIGdyb3VwX2lkc19vYmpfZ3Bvbl90cnhbXSA9IHsgeyAxLCBncm91cF9pZHNfZ3Bvbl90cnhfa2V5IH0sIHsgMSwgZ3JvdXBfaWRzX2dwb25fdHJ4X2NmZyB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZHMgZ3JvdXBfaWRzX29ial9sb2dfZW50cnlbXSA9IHsgeyAxLCBncm91cF9pZHNfbG9nX2VudHJ5X2tleSB9LCB7IDEsIGdyb3VwX2lkc19sb2dfZW50cnlfY2ZnIH0sIHsgMSwgZ3JvdXBfaWRzX2xvZ19lbnRyeV9zdGF0IH0sIHsgMiwgZ3JvdXBfaWRzX2xvZ19lbnRyeV9zdGF0X2NmZyB9LCB7IDIsIGdyb3VwX2lkc19sb2dfZW50cnlfYXV0byB9LCB7IDEsIGdyb3VwX2lkc19sb2dfZW50cnlfYXV0b19jZmcgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZHMgZ3JvdXBfaWRzX29ial9sb2dnZXJbXSA9IHsgeyAxLCBncm91cF9pZHNfbG9nZ2VyX2tleSB9LCB7IDEsIGdyb3VwX2lkc19sb2dnZXJfY2ZnIH0sIHsgMSwgZ3JvdXBfaWRzX2xvZ2dlcl9zdGF0IH0sIHsgMSwgZ3JvdXBfaWRzX2xvZ2dlcl9zdGF0X2NmZyB9LCB7IDIsIGdyb3VwX2lkc19sb2dnZXJfYXV0byB9LCB7IDEsIGdyb3VwX2lkc19sb2dnZXJfYXV0b19jZmcgfSwgeyAxLCBncm91cF9pZHNfbG9nZ2VyX29wZXIgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9IH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkcyBncm91cF9pZHNfb2JqX25uaVtdID0geyB7IDEsIGdyb3VwX2lkc19ubmlfa2V5IH0sIHsgMSwgZ3JvdXBfaWRzX25uaV9jZmcgfSwgeyAxLCBncm91cF9pZHNfbm5pX3N0YXQgfSwgeyA2MywgZ3JvdXBfaWRzX25uaV9zdGF0X2NmZyB9LCB7IDMsIGdyb3VwX2lkc19ubmlfYXV0byB9LCB7IDEsIGdyb3VwX2lkc19ubmlfYXV0b19jZmcgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZHMgZ3JvdXBfaWRzX29ial9ubmlfc2VyZGVzW10gPSB7IHsgMSwgZ3JvdXBfaWRzX25uaV9zZXJkZXNfa2V5IH0sIHsgMSwgZ3JvdXBfaWRzX25uaV9zZXJkZXNfY2ZnIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9IH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkcyBncm91cF9pZHNfb2JqX3NvZnR3YXJlX2Vycm9yW10gPSB7IHsgMSwgZ3JvdXBfaWRzX3NvZnR3YXJlX2Vycm9yX2tleSB9LCB7IDEsIGdyb3VwX2lkc19zb2Z0d2FyZV9lcnJvcl9jZmcgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWRzIGdyb3VwX2lkc19vYmpfdHJ4X2NhbGlicmF0aW9uW10gPSB7IHsgMSwgZ3JvdXBfaWRzX3RyeF9jYWxpYnJhdGlvbl9rZXkgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAxLCBncm91cF9pZHNfdHJ4X2NhbGlicmF0aW9uX2F1dG8gfSwgeyAxLCBncm91cF9pZHNfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnIH0sIHsgMiwgZ3JvdXBfaWRzX3RyeF9jYWxpYnJhdGlvbl9vcGVyIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZHMgZ3JvdXBfaWRzX29ial94Z3Bvbl9hbGxvY1tdID0geyB7IDEsIGdyb3VwX2lkc194Z3Bvbl9hbGxvY19rZXkgfSwgeyAxLCBncm91cF9pZHNfeGdwb25fYWxsb2NfY2ZnIH0sIHsgMSwgZ3JvdXBfaWRzX3hncG9uX2FsbG9jX3N0YXQgfSwgeyAxLCBncm91cF9pZHNfeGdwb25fYWxsb2Nfc3RhdF9jZmcgfSwgeyA0LCBncm91cF9pZHNfeGdwb25fYWxsb2NfYXV0byB9LCB7IDEsIGdyb3VwX2lkc194Z3Bvbl9hbGxvY19hdXRvX2NmZyB9LCB7IDIsIGdyb3VwX2lkc194Z3Bvbl9hbGxvY19vcGVyIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZHMgZ3JvdXBfaWRzX29ial94Z3Bvbl9nZW1fcG9ydFtdID0geyB7IDEsIGdyb3VwX2lkc194Z3Bvbl9nZW1fcG9ydF9rZXkgfSwgeyAxLCBncm91cF9pZHNfeGdwb25fZ2VtX3BvcnRfY2ZnIH0sIHsgMSwgZ3JvdXBfaWRzX3hncG9uX2dlbV9wb3J0X3N0YXQgfSwgeyA0LCBncm91cF9pZHNfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmcgfSwgeyAyLCBncm91cF9pZHNfeGdwb25fZ2VtX3BvcnRfYXV0byB9LCB7IDEsIGdyb3VwX2lkc194Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZyB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9IH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkcyBncm91cF9pZHNfb2JqX3hncG9uX2l3ZltdID0geyB7IDEsIGdyb3VwX2lkc194Z3Bvbl9pd2Zfa2V5IH0sIHsgMSwgZ3JvdXBfaWRzX3hncG9uX2l3Zl9jZmcgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWRzIGdyb3VwX2lkc19vYmpfeGdwb25fbmlbXSA9IHsgeyAxLCBncm91cF9pZHNfeGdwb25fbmlfa2V5IH0sIHsgMSwgZ3JvdXBfaWRzX3hncG9uX25pX2NmZyB9LCB7IDEsIGdyb3VwX2lkc194Z3Bvbl9uaV9zdGF0IH0sIHsgMzUsIGdyb3VwX2lkc194Z3Bvbl9uaV9zdGF0X2NmZyB9LCB7IDE5LCBncm91cF9pZHNfeGdwb25fbmlfYXV0byB9LCB7IDEsIGdyb3VwX2lkc194Z3Bvbl9uaV9hdXRvX2NmZyB9LCB7IDEwLCBncm91cF9pZHNfeGdwb25fbmlfb3BlciB9LCB7IDIsIGdyb3VwX2lkc194Z3Bvbl9uaV9wcm94eSB9LCB7IDAsIE5VTEwgfSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZHMgZ3JvdXBfaWRzX29ial94Z3Bvbl9vbnVbXSA9IHsgeyAxLCBncm91cF9pZHNfeGdwb25fb251X2tleSB9LCB7IDEsIGdyb3VwX2lkc194Z3Bvbl9vbnVfY2ZnIH0sIHsgMSwgZ3JvdXBfaWRzX3hncG9uX29udV9zdGF0IH0sIHsgMjAsIGdyb3VwX2lkc194Z3Bvbl9vbnVfc3RhdF9jZmcgfSwgeyAzMywgZ3JvdXBfaWRzX3hncG9uX29udV9hdXRvIH0sIHsgMSwgZ3JvdXBfaWRzX3hncG9uX29udV9hdXRvX2NmZyB9LCB7IDEwLCBncm91cF9pZHNfeGdwb25fb251X29wZXIgfSwgeyAyLCBncm91cF9pZHNfeGdwb25fb251X3Byb3h5IH0sIHsgMiwgZ3JvdXBfaWRzX3hncG9uX29udV9wcm94eV9yeCB9IH07CitzdGF0aWMgYmNtb2x0X2dyb3VwX2lkcyBncm91cF9pZHNfb2JqX3hncG9uX3RyeFtdID0geyB7IDEsIGdyb3VwX2lkc194Z3Bvbl90cnhfa2V5IH0sIHsgMSwgZ3JvdXBfaWRzX3hncG9uX3RyeF9jZmcgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0gfTsKK3N0YXRpYyBiY21vbHRfZ3JvdXBfaWRzIGdyb3VwX2lkc19vYmpfeHBvbl9zZXJkZXNbXSA9IHsgeyAxLCBncm91cF9pZHNfeHBvbl9zZXJkZXNfa2V5IH0sIHsgMSwgZ3JvdXBfaWRzX3hwb25fc2VyZGVzX2NmZyB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSwgeyAwLCBOVUxMIH0sIHsgMCwgTlVMTCB9LCB7IDAsIE5VTEwgfSB9Oworc3RhdGljIGJjbW9sdF9ncm91cF9pZHMgKmdyb3VwX2lkc1tdID0geyBncm91cF9pZHNfb2JqX2FlX25pLCBncm91cF9pZHNfb2JqX2FlX3BhdGhfZHMsIGdyb3VwX2lkc19vYmpfYWVfcGF0aF91cywgZ3JvdXBfaWRzX29ial9jaGFubmVsLCBncm91cF9pZHNfb2JqX2RlYnVnLCBncm91cF9pZHNfb2JqX2RldmljZSwgZ3JvdXBfaWRzX29ial9lcG9uX2RlbmllZF9saW5rLCBncm91cF9pZHNfb2JqX2Vwb25fbGluaywgZ3JvdXBfaWRzX29ial9lcG9uX25pLCBncm91cF9pZHNfb2JqX2Vwb25fb251XzEwZ191cywgZ3JvdXBfaWRzX29ial9lcG9uX29udV8xZ191cywgZ3JvdXBfaWRzX29ial9lcG9uX3BhdGhfMTBnX2RzLCBncm91cF9pZHNfb2JqX2Vwb25fcGF0aF8xMGdfdXMsIGdyb3VwX2lkc19vYmpfZXBvbl9wYXRoXzFnX2RzLCBncm91cF9pZHNfb2JqX2Vwb25fcGF0aF8xZ191cywgZ3JvdXBfaWRzX29ial9lcG9uX3JwLCBncm91cF9pZHNfb2JqX2dwaW8sIGdyb3VwX2lkc19vYmpfZ3Bvbl9hbGxvYywgZ3JvdXBfaWRzX29ial9ncG9uX2dlbV9wb3J0LCBncm91cF9pZHNfb2JqX2dwb25faXdmLCBncm91cF9pZHNfb2JqX2dwb25faXdmX2RzX2VncmVzc19mbG93LCBncm91cF9pZHNfb2JqX2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvdywgZ3JvdXBfaWRzX29ial9ncG9uX2l3Zl9tYWNfdGFibGUsIGdyb3VwX2lkc19vYmpfZ3Bvbl9pd2ZfdXNfZmxvdywgZ3JvdXBfaWRzX29ial9ncG9uX25pLCBncm91cF9pZHNfb2JqX2dwb25fb251LCBncm91cF9pZHNfb2JqX2dwb25fdHJ4LCBncm91cF9pZHNfb2JqX2xvZ19lbnRyeSwgZ3JvdXBfaWRzX29ial9sb2dnZXIsIGdyb3VwX2lkc19vYmpfbm5pLCBncm91cF9pZHNfb2JqX25uaV9zZXJkZXMsIGdyb3VwX2lkc19vYmpfc29mdHdhcmVfZXJyb3IsIGdyb3VwX2lkc19vYmpfdHJ4X2NhbGlicmF0aW9uLCBncm91cF9pZHNfb2JqX3hncG9uX2FsbG9jLCBncm91cF9pZHNfb2JqX3hncG9uX2dlbV9wb3J0LCBncm91cF9pZHNfb2JqX3hncG9uX2l3ZiwgZ3JvdXBfaWRzX29ial94Z3Bvbl9uaSwgZ3JvdXBfaWRzX29ial94Z3Bvbl9vbnUsIGdyb3VwX2lkc19vYmpfeGdwb25fdHJ4LCBncm91cF9pZHNfb2JqX3hwb25fc2VyZGVzIH07CitzdGF0aWMgYmNtb2x0X3ByZXNlbmNlX21hc2sgcmVhZG9ubHlfcHJvcF9tYXNrW10gPSB7ICgxVUxMIDw8IEJDTU9MVF9BRV9OSV9DRkdfSURfQUVfTklfRU4pIHwgKDFVTEwgPDwgQkNNT0xUX0FFX05JX0NGR19JRF9QUkJTX1NUQVRVUyksIDAsIDAsIDAsICgoKDFVTEwgPDwgQkNNT0xUX0RFQlVHX0NGR19JRF9JTkRJQ0FUSU9OU19EUk9QUEVEKSB8ICgxVUxMIDw8IEJDTU9MVF9ERUJVR19DRkdfSURfRklMRV9VU0VEX1BFUkNFTlQpKSB8ICgxVUxMIDw8IEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfU1RBVFMpKSB8ICgxVUxMIDw8IEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfQlVGRkVSKSwgKCgoKCgoMVVMTCA8PCBCQ01PTFRfREVWSUNFX0NGR19JRF9GSVJNV0FSRV9TV19WRVJTSU9OKSB8ICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0hPU1RfU1dfVkVSU0lPTikpIHwgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfQ0hJUF9SRVZJU0lPTikpIHwgKDFVTEwgPDwgQkNNT0xUX0RFVklDRV9DRkdfSURfU1RBVEUpKSB8ICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0NISVBfVEVNUEVSQVRVUkUpKSB8ICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VNQkVEREVEX0lNQUdFX0xJU1QpKSB8ICgxVUxMIDw8IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0NISVBfVk9MVEFHRSksIDFVTEwgPDwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQ0ZHX0lEX0FMQVJNX1NUQVRFLCAoKCgoKCgoKCgoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9MSU5LX1JBVEUpIHwgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfU1RBVEVfRkxBR1MpKSB8ICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xMSUQpKSB8ICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xBU0VSX09OX1RJTUVfVFEpKSB8ICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xBU0VSX09GRl9USU1FX1RRKSkgfCAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9SQU5HRV9WQUxVRV9UUSkpIHwgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfRElTVEFOQ0UpKSB8ICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0FMQVJNX1NUQVRFKSkgfCAoMVVMTCA8PCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9VQkRfSU5GTykpIHwgKDFVTEwgPDwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfUEVORElOR19HUkFOVFMpKSB8ICgxVUxMIDw8IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xJTktfVFlQRSksICgoKCgoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRVBPTl9OSV9FTikgfCAoMVVMTCA8PCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQUxBUk1fU1RBVEUpKSB8ICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BTExfTElOS1MpKSB8ICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BUFBST1hJTUFURV9TT0xJQ0lURURfVVNBR0UpKSB8ICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BUFBST1hJTUFURV9URE1fVVNBR0UpKSB8ICgxVUxMIDw8IEJDTU9MVF9FUE9OX05JX0NGR19JRF9FU1RJTUFURURfUE9OX0xBVEVOQ1lfVFEpLCAxVUxMIDw8IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfQ0ZHX0lEX0FMTF9MSU5LUywgMVVMTCA8PCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQ0ZHX0lEX0FMTF9MSU5LUywgMCwgMVVMTCA8PCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfUFJCU19TVEFUVVMsIDAsIDFVTEwgPDwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19DRkdfSURfUFJCU19TVEFUVVMsIDAsIDAsIDFVTEwgPDwgQkNNT0xUX0dQT05fQUxMT0NfQ0ZHX0lEX1NUQVRFLCAxVUxMIDw8IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9HRU1fUE9SVF9TVEFURSwgMVVMTCA8PCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX01BQ19UQUJMRV9DT1VOVCwgMCwgMCwgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9DRkdfSURfR0VNX1BPUlRfSUQpIHwgKDFVTEwgPDwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9DRkdfSURfT05VX0lEKSwgMCwgKCgoKCgoKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPTl9TVEFUVVMpIHwgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0FWQUlMQUJMRV9CQU5EV0lEVEgpKSB8ICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9OVU1CRVJfT0ZfQUNUSVZFX09OVVMpKSB8ICgxVUxMIDw8IEJDTU9MVF9HUE9OX05JX0NGR19JRF9OVU1CRVJfT0ZfQUNUSVZFX1NUQU5EQllfT05VUykpIHwgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BSQlNfU1RBVFVTKSkgfCAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUkFOR0lOR19XSU5ET1dfU0laRSkpIHwgKDFVTEwgPDwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0FMTF9PTlVTKSkgfCAoMVVMTCA8PCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQUxMX01DQVNUX0dFTV9QT1JUUyksICgoKCgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfT05VX1NUQVRFKSB8ICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfRElTQUJMRURfQUZURVJfRElTQ09WRVJZKSkgfCAoMVVMTCA8PCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0RFQUNUSVZBVElPTl9SRUFTT04pKSB8ICgxVUxMIDw8IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQUxMX0dFTV9QT1JUUykpIHwgKDFVTEwgPDwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9BTExfQUxMT0NTKSwgKDFVTEwgPDwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9QTE9fUkFOR0lORykgfCAoMVVMTCA8PCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1BMT19EQVRBKSwgKCgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0RFRkFVTFRfTE9HX0xFVkVMKSB8ICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0RFRkFVTFRfTE9HX1RZUEUpKSB8ICgxVUxMIDw8IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19OQU1FKSwgKDFVTEwgPDwgQkNNT0xUX0xPR0dFUl9DRkdfSURfQlVGRkVSKSB8ICgxVUxMIDw8IEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX0xPR19OQU1FUyksICgxVUxMIDw8IEJDTU9MVF9OTklfQ0ZHX0lEX05OSV9TVEFUVVMpIHwgKDFVTEwgPDwgQkNNT0xUX05OSV9DRkdfSURfTk5JX0JBQ0tVUF9TVEFUVVMpLCAwLCAxVUxMIDw8IEJDTU9MVF9TT0ZUV0FSRV9FUlJPUl9DRkdfSURfRU5UUlksIDAsIDFVTEwgPDwgQkNNT0xUX1hHUE9OX0FMTE9DX0NGR19JRF9TVEFURSwgMVVMTCA8PCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX0dFTV9QT1JUX1NUQVRFLCAwLCAoKCgoKCgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQVZBSUxBQkxFX0JBTkRXSURUSCkgfCAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX05VTUJFUl9PRl9BQ1RJVkVfT05VUykpIHwgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QT05fU1RBVFVTKSkgfCAoMVVMTCA8PCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1JBTkdJTkdfV0lORE9XX1NJWkUpKSB8ICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJCU19TVEFUVVMpKSB8ICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQUxMX09OVVMpKSB8ICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQUxMX01DQVNUX0dFTV9QT1JUUyksICgoKCgoMVVMTCA8PCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9PTlVfT0xEX1NUQVRFKSB8ICgxVUxMIDw8IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0RJU0FCTEVEX0FGVEVSX0RJU0NPVkVSWSkpIHwgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfREVBQ1RJVkFUSU9OX1JFQVNPTikpIHwgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQUxMX0dFTV9QT1JUUykpIHwgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQUxMX0FMTE9DUykpIHwgKDFVTEwgPDwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkVRVUVTVF9SRUdJU1RSQVRJT05fU1RBVFVTKSwgMCwgMCB9Oworc3RhdGljIGJjbW9sdF9pbnN0YW5jZV9pbmZvIGluc3RhbmNlX2luZm9bXSA9IHsgeyBvZmZzZXRvZihiY21vbHRfYWVfbmlfa2V5LCBhZV9uaSksIHNpemVvZihiY21vbHRfYWVfbmkpIH0sIHsgb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfa2V5LCBhZV9uaSksIHNpemVvZihiY21vbHRfYWVfbmkpIH0sIHsgb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfa2V5LCBhZV9uaSksIHNpemVvZihiY21vbHRfYWVfbmkpIH0sIHsgb2Zmc2V0b2YoYmNtb2x0X2NoYW5uZWxfa2V5LCBwb25fbmkpLCBzaXplb2YoYmNtb2x0X3Bvbl9uaSkgfSwgeyBvZmZzZXRvZihiY21vbHRfZGVidWdfa2V5LCByZXNlcnZlZCksIHNpemVvZih1aW50MzJfdCkgfSwgeyBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2tleSwgcmVzZXJ2ZWQpLCBzaXplb2YodWludDMyX3QpIH0sIHsgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5LCBlcG9uX25pKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX25pKSB9LCB7IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5LCBlcG9uX25pKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX25pKSB9LCB7IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2tleSwgZXBvbl9uaSksIHNpemVvZihiY21vbHRfZXBvbl9uaSkgfSwgeyBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleSwgZXBvbl9uaSksIHNpemVvZihiY21vbHRfZXBvbl9uaSkgfSwgeyBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5LCBlcG9uX25pKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX25pKSB9LCB7IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleSwgZXBvbl9uaSksIHNpemVvZihiY21vbHRfZXBvbl9uaSkgfSwgeyBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXksIGVwb25fbmkpLCBzaXplb2YoYmNtb2x0X2Vwb25fbmkpIH0sIHsgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXksIGVwb25fbmkpLCBzaXplb2YoYmNtb2x0X2Vwb25fbmkpIH0sIHsgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXksIGVwb25fbmkpLCBzaXplb2YoYmNtb2x0X2Vwb25fbmkpIH0sIHsgb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcnBfa2V5LCBlcG9uX25pKSwgc2l6ZW9mKGJjbW9sdF9lcG9uX25pKSB9LCB7IG9mZnNldG9mKGJjbW9sdF9ncGlvX2tleSwgcmVzZXJ2ZWQpLCBzaXplb2YodWludDMyX3QpIH0sIHsgb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2Nfa2V5LCBwb25fbmkpLCBzaXplb2YoYmNtb2x0X2dwb25fbmkpIH0sIHsgb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5LCBwb25fbmkpLCBzaXplb2YoYmNtb2x0X2dwb25fbmkpIH0sIHsgb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2tleSwgcG9uX25pKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX25pKSB9LCB7IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXksIHBvbl9uaSksIHNpemVvZihiY21vbHRfZ3Bvbl9uaSkgfSwgeyBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleSwgcG9uX25pKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX25pKSB9LCB7IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5LCBwb25fbmkpLCBzaXplb2YoYmNtb2x0X2dwb25fbmkpIH0sIHsgb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5LCBwb25fbmkpLCBzaXplb2YoYmNtb2x0X2dwb25fbmkpIH0sIHsgb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfa2V5LCBwb25fbmkpLCBzaXplb2YoYmNtb2x0X2dwb25fbmkpIH0sIHsgb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2tleSwgcG9uX25pKSwgc2l6ZW9mKGJjbW9sdF9ncG9uX25pKSB9LCB7IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9rZXksIHBvbl9uaSksIHNpemVvZihiY21vbHRfZ3Bvbl9uaSkgfSwgeyBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X2tleSwgcmVzZXJ2ZWQpLCBzaXplb2YodWludDhfdCkgfSwgeyBvZmZzZXRvZihiY21vbHRfbG9nZ2VyX2tleSwgcmVzZXJ2ZWQpLCBzaXplb2YodWludDMyX3QpIH0sIHsgb2Zmc2V0b2YoYmNtb2x0X25uaV9rZXksIHBvbl9uaSksIHNpemVvZihiY21vbHRfcG9uX25pKSB9LCB7IG9mZnNldG9mKGJjbW9sdF9ubmlfc2VyZGVzX2tleSwgcG9uX25pKSwgc2l6ZW9mKGJjbW9sdF9wb25fbmkpIH0sIHsgb2Zmc2V0b2YoYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleSwgcmVzZXJ2ZWQpLCBzaXplb2YodWludDMyX3QpIH0sIHsgb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXksIHJlc2VydmVkKSwgc2l6ZW9mKHVpbnQzMl90KSB9LCB7IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19rZXksIHBvbl9uaSksIHNpemVvZihiY21vbHRfeGdwb25fbmkpIH0sIHsgb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleSwgcG9uX25pKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaSkgfSwgeyBvZmZzZXRvZihiY21vbHRfeGdwb25faXdmX2tleSwgcG9uX25pKSwgc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaSkgfSwgeyBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfa2V5LCBwb25fbmkpLCBzaXplb2YoYmNtb2x0X3hncG9uX25pKSB9LCB7IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5LCBwb25fbmkpLCBzaXplb2YoYmNtb2x0X3hncG9uX25pKSB9LCB7IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfa2V5LCBwb25fbmkpLCBzaXplb2YoYmNtb2x0X3hncG9uX25pKSB9LCB7IG9mZnNldG9mKGJjbW9sdF94cG9uX3NlcmRlc19rZXksIHBvbl9uaSksIHNpemVvZihiY21vbHRfcG9uX25pKSB9IH07CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfYm9vbCBiY21vbHRfZ2V0X2dyb3VwX2luZm8oY29uc3QgYmNtb2x0X21zZyAqbXNnLCBiY21vbHRfZ3JvdXBfaW5mbyAqKmdyb3VwLCBiY21vbHRfZ3JvdXBfaW5mbyAqKmtleSkKK3sKKyAgICBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWQ7CisgICAgYmNtb2x0X2dyb3VwX2lkIGtleV9pZDsKKyAgICBiY21vc19lcnJubyBlcnI7CisKKyAgICBlcnIgPSBiY21vbHRfZ3JvdXBfaWRfY29tYmluZShtc2ctPm9ial90eXBlLCBtc2ctPmdyb3VwLCBtc2ctPnN1Ymdyb3VwLCAmZ3JvdXBfaWQpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBlcnIgPSBiY21vbHRfZ3JvdXBfaWRfY29tYmluZShtc2ctPm9ial90eXBlLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgJmtleV9pZCk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpncm91cCA9IGdyb3VwX2luZm9bZ3JvdXBfaWRdOworICAgICprZXkgPSBncm91cF9pbmZvW2tleV9pZF07CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90IGJjbW9sdF9tc2dfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X21zZyAqbXNnKQoreworICAgIHVpbnQ4X3QgKmtleV9wdHI7CisgICAgYmNtb2x0X2dyb3VwX2luZm8gKmdyb3VwOworICAgIGJjbW9sdF9ncm91cF9pbmZvICprZXk7CisKKyAgICBpbnQzMl90IHJldCA9IGJjbW9sdF9tc2dfaGRyX2dldF9wYWNrZWRfbGVuZ3RoKG1zZyk7CisgICAgaWYgKHJldCA8IDApCisgICAgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmICghYmNtb2x0X2dldF9ncm91cF9pbmZvKG1zZywgJmdyb3VwLCAma2V5KSkKKyAgICB7CisgICAgICAgIHJldHVybiAoaW50MzJfdCkgQkNNX0VSUl9NU0dfRVJST1I7CisgICAgfQorCisgICAga2V5X3B0ciA9ICh1aW50OF90ICopIChtc2cgKyAxKTsKKyAgICByZXQgKz0ga2V5LT5nZXRfcGFja2VkX2xlbmd0aChrZXlfcHRyLCBCQ01PTFRfUFJFU0VOQ0VfTUFTS19BTEwpOworCisgICAgaWYgKGJjbW9sdF9tc2dfc2hvdWxkX3BhY2tfZGF0YShtc2cpICYmIChncm91cC0+Z2V0X3BhY2tlZF9sZW5ndGggIT0gTlVMTCkpCisgICAgeworICAgICAgICB1aW50OF90ICpkYXRhX3B0ciA9ICh1aW50OF90ICopICgobG9uZyltc2cgKyBncm91cC0+ZGF0YV9vZmZzZXQpOworICAgICAgICByZXQgKz0gZ3JvdXAtPmdldF9wYWNrZWRfbGVuZ3RoKGRhdGFfcHRyLCBtc2ctPnByZXNlbmNlX21hc2spOworICAgIH0KKworICAgIGlmIChtc2ctPnR5cGUgJiBCQ01PTFRfTVNHX1RZUEVfTVVMVEkpCisgICAgeworICAgICAgICBpZiAobXNnLT5tc2dfc2V0ID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoaW50MzJfdCkgQkNNX0VSUl9OVUxMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1zZy0+ZGlyID09IEJDTU9MVF9NU0dfRElSX1JFUVVFU1QpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldCArPSAxOTsgIC8qIGdyb3VwOiAxLCBtYXhfaW5zdGFuY2VzOiAyLCBwcmVzZW5jZV9tYXNrOiA4LCBmaWx0ZXJfZmxhZ3M6IDggKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgaW50MzJfdCBzdWJfbXNnX3JldDsKKworICAgICAgICAgICAgcmV0ICs9IDM7ICAgLyogZ3JvdXA6IG51bV9pbnN0YW5jZXM6IDIsIG1vcmU6IDEgKi8KKyAgICAgICAgICAgIHJldCArPSBrZXktPmdldF9wYWNrZWRfbGVuZ3RoKGtleV9wdHIsIEJDTU9MVF9QUkVTRU5DRV9NQVNLX0FMTCk7ICAgLyogbmV4dCBrZXkgKi8KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtc2ctPm1zZ19zZXQtPm51bV9pbnN0YW5jZXM7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobXNnLT5tc2dfc2V0LT5tc2dbaV0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoaW50MzJfdCkgQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzdWJfbXNnX3JldCA9IGJjbW9sdF9tc2dfZ2V0X3BhY2tlZF9sZW5ndGgobXNnLT5tc2dfc2V0LT5tc2dbaV0pOworICAgICAgICAgICAgICAgIGlmIChzdWJfbXNnX3JldCA8IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3ViX21zZ19yZXQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0ICs9IHN1Yl9tc2dfcmV0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworLyogQ3JlYXRlIG1lc3NhZ2Ugc2V0ICovCitiY21vc19lcnJubyBiY21vbHRfbXNnX3NldF9hbGxvYyhiY21vbHRfb2JqX2lkIG9iaiwgYmNtb2x0X21ndF9ncm91cCBncm91cCwgdWludDMyX3QgbWF4X2luc3RhbmNlcywgYmNtb2x0X21zZ19zZXQgKiptc2dfc2V0KQoreworICAgIGJjbW9sdF9tc2cgaGRyID0geyB9OworICAgIHVpbnQzMl90IHNpemU7CisgICAgYmNtb2x0X2dyb3VwX2luZm8gKmdycDsKKyAgICBiY21vbHRfZ3JvdXBfaW5mbyAqa2V5OworCisgICAgaWYgKG1zZ19zZXQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX1BBUk0sICJtc2dfc2V0IHBhcmFtZXRlciBtdXN0IGJlIHNldFxuIik7CisgICAgfQorCisgICAgaWYgKGdyb3VwICE9IEJDTU9MVF9NR1RfR1JPVVBfQ0ZHICYmIGdyb3VwICE9IEJDTU9MVF9NR1RfR1JPVVBfU1RBVCkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX05PVF9TVVBQT1JURUQsICJncm91cCBtdXN0IGJlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHIG9yIEJDTU9MVF9NR1RfR1JPVVBfU1RBVFxuIik7CisgICAgfQorCisgICAgLyogQ2FsY3VsYXRlIG1lc3NhZ2Ugc2V0IHNpemUgKi8KKyAgICBoZHIub2JqX3R5cGUgPSBvYmo7CisgICAgaGRyLmdyb3VwID0gZ3JvdXA7CisgICAgaGRyLmRpciA9IEJDTU9MVF9NU0dfRElSX1JFUVVFU1Q7CisgICAgaWYgKCFiY21vbHRfZ2V0X2dyb3VwX2luZm8oJmhkciwgJmdycCwgJmtleSkpCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9OT1RfU1VQUE9SVEVELCAiTm90IHN1cHBvcnRlZCBmb3IgdGhlIG9iamVjdFxuIik7CisgICAgfQorCisgICAgc2l6ZSA9IHNpemVvZihiY21vbHRfbXNnX3NldCkgKyBrZXktPnNpemUgKyBtYXhfaW5zdGFuY2VzICogc2l6ZW9mKGJjbW9sdF9tc2cgKik7CisgICAgKm1zZ19zZXQgPSBiY21vc19jYWxsb2Moc2l6ZSk7CisgICAgaWYgKCptc2dfc2V0ID09IE5VTEwpCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9OT01FTSwgIkNhbid0IGFsbG9jYXRlIG1lc3NhZ2Ugc2V0XG4iKTsKKyAgICB9CisgICAgKCptc2dfc2V0KS0+Z3JvdXAgPSBncm91cDsKKyAgICAoKm1zZ19zZXQpLT5tYXhfaW5zdGFuY2VzID0gbWF4X2luc3RhbmNlczsKKyAgICAoKm1zZ19zZXQpLT5uZXh0X2tleSA9ICh2b2lkICopKCYoKCptc2dfc2V0KS0+bXNnW21heF9pbnN0YW5jZXNdKSk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogUmVsZWFzZSBtZXNzYWdlIHNldAorICogXHBhcmFtW2luXSAgIG1zZ19zZXQKKyAqLwordm9pZCBiY21vbHRfbXNnX3NldF9mcmVlKGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0KQoreworICAgIHVpbnQzMl90IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbXNnX3NldC0+bWF4X2luc3RhbmNlcyAmJiBtc2dfc2V0LT5tc2dbaV0gIT0gTlVMTDsgaSsrKQorICAgIHsKKyAgICAgICAgYmNtb2x0X21zZ19mcmVlKG1zZ19zZXQtPm1zZ1tpXSk7CisgICAgfQorCisgICAgYmNtb3NfZnJlZShtc2dfc2V0KTsKK30KKworLyogUGFjayBtZXNzYWdlIHNldCwgZXhjbHVkaW5nIHRoZSBmaWx0ZXItaGVhZGVyIHdoaWNoIGlzIGFscmVhZHkgcGFja2VkICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X21zZ19zZXRfcGFjayhjb25zdCBiY21vbHRfbXNnICptc2csIGJjbW9sdF9idWYgKmJ1ZiwgY29uc3QgYmNtb2x0X2dyb3VwX2luZm8gKmtleV9pbmZvKQoreworICAgIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0ID0gbXNnLT5tc2dfc2V0OworICAgIGludCBpOworICAgIGJjbW9zX2Jvb2wgcmV0OworICAgIGJjbW9zX2Vycm5vIGVyciA9IEJDTV9FUlJfT0s7CisKKyAgICBpZiAoIW1zZ19zZXQpCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9JTlRFUk5BTCwgIm1zaC0+bXNnX3NldCA9PSBOVUxMXG4iKTsKKyAgICB9CisKKyAgICAvKiBSRVFVRVNUOgorICAgICAqIC0gZmlsdGVyIChhbHJlYWR5IHBhY2tlZCBhdCB0aGlzIHBvaW50LCBjb250YWlucyBmaXJzdCBrZXkgdG8gY2hlY2spCisgICAgICogLSBncm91cCAoRkZVKQorICAgICAqIC0gbWF4X2luc3RhbmNlcworICAgICAqIC0gcHJlc2VuY2VfbWFzaworICAgICAqIC0gZmlsdGVyX2ZsYWdzCisgICAgICoKKyAgICAgKiBSRVNQT05TRToKKyAgICAgKiAtIGZpbHRlciAoYWxyZWFkeSBwYWNrZWQgYXQgdGhpcyBwb2ludCkKKyAgICAgKiAtIG51bV9pbnN0YW5jZXMKKyAgICAgKiAtIG1vcmUKKyAgICAgKiAtIG5leHRfa2V5CisgICAgICogLSBudW1faW5zdGFuY2VzICogbXNnCisgICAgICovCisgICAgaWYgKG1zZy0+ZGlyID09IEJDTU9MVF9NU0dfRElSX1JFUVVFU1QpCisgICAgeworICAgICAgICByZXQgPSBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIG1zZ19zZXQtPmdyb3VwKTsKKyAgICAgICAgcmV0ID0gcmV0ICYmIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgbXNnX3NldC0+bWF4X2luc3RhbmNlcyk7CisgICAgICAgIHJldCA9IHJldCAmJiBiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsIG1zZ19zZXQtPnByZXNlbmNlX21hc2spOworICAgICAgICByZXQgPSByZXQgJiYgYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCBtc2dfc2V0LT5maWx0ZXJfZmxhZ3MpOworICAgICAgICBpZiAoIXJldCkgZXJyID0gQkNNX0VSUl9PVkVSRkxPVzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0ID0gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCBtc2dfc2V0LT5udW1faW5zdGFuY2VzKTsKKyAgICAgICAgcmV0ID0gcmV0ICYmIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgbXNnX3NldC0+bW9yZSk7CisgICAgICAgIHJldCA9IHJldCAmJiBrZXlfaW5mby0+cGFjayhtc2dfc2V0LT5uZXh0X2tleSwgYnVmLCBCQ01PTFRfUFJFU0VOQ0VfTUFTS19BTEwpOworICAgICAgICBpZiAoIXJldCkgcmV0dXJuIEJDTV9FUlJfT1ZFUkZMT1c7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG1zZ19zZXQtPm51bV9pbnN0YW5jZXMgJiYgZXJyID09IEJDTV9FUlJfT0s7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1zZ19zZXQtPm1zZ1tpXSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVyciA9IEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVyciA9IGJjbW9sdF9tc2dfcGFjayhtc2dfc2V0LT5tc2dbaV0sIGJ1Zik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfZXJybm8gYmNtb2x0X21zZ19wYWNrKGJjbW9sdF9tc2cgKm1zZywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgKmtleV9wdHI7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncm91cF9pbmZvICpncm91cDsKKyAgICBiY21vbHRfZ3JvdXBfaW5mbyAqa2V5OworCisgICAgaWYgKCFiY21vbHRfZ2V0X2dyb3VwX2luZm8obXNnLCAmZ3JvdXAsICZrZXkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTVNHX0VSUk9SOworICAgIH0KKworICAgIGVyciA9IGJjbW9sdF9tc2dfaGRyX3BhY2sobXNnLCBidWYpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAga2V5X3B0ciA9ICh1aW50OF90ICopIChtc2cgKyAxKTsKKyAgICBpZiAoIWtleS0+cGFjayhrZXlfcHRyLCBidWYsIEJDTU9MVF9QUkVTRU5DRV9NQVNLX0FMTCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9PVkVSRkxPVzsKKyAgICB9CisKKyAgICBpZiAoYmNtb2x0X21zZ19zaG91bGRfcGFja19kYXRhKG1zZykgJiYgKGdyb3VwLT5wYWNrICE9IE5VTEwpKQorICAgIHsKKyAgICAgICAgdWludDhfdCAqZGF0YV9wdHIgPSAodWludDhfdCAqKSAoKGxvbmcpbXNnICsgZ3JvdXAtPmRhdGFfb2Zmc2V0KTsKKyAgICAgICAgaWYgKCFncm91cC0+cGFjayhkYXRhX3B0ciwgYnVmLCBtc2ctPnByZXNlbmNlX21hc2spKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PVkVSRkxPVzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIElmIGl0IGlzIGEgbXVsdGktbWVzc2FnZSBwYWNrIHdoYXQgZm9sbG93cyB0aGUgcmVzdCBvZiB0aGUgc2V0ICovCisgICAgaWYgKG1zZy0+dHlwZSAmIEJDTU9MVF9NU0dfVFlQRV9NVUxUSSkKKyAgICB7CisgICAgICAgIGVyciA9IGJjbW9sdF9tc2dfc2V0X3BhY2sobXNnLCBidWYsIGtleSk7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworLyogc2NhbiB0aGUgaW5wdXQgYnVmZmVyIHRvIGRldGVybWluZSBob3cgbXVjaCBtZW1vcnkgd2lsbCBiZSByZXF1aXJlZCB0byB1bnBhY2sgdmFyaWFibGUtc2l6ZWQgbGlzdHMgKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfbXNnX2xpc3RfbWVtX3NjYW4oYmNtb2x0X2J1ZiAqYnVmLCBjb25zdCBiY21vbHRfbXNnICpoZHIsIGNvbnN0IGJjbW9sdF9ncm91cF9pbmZvICpncm91cCwgY29uc3QgYmNtb2x0X2dyb3VwX2luZm8gKmtleSwgdWludDMyX3QgKnNpemUpCit7CisgICAgdWludDMyX3QgcG9zX2JlZm9yZV9zY2FuID0gYmNtb2x0X2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgaWYgKCFrZXktPm1lbV9zY2FuKGJ1Ziwgc2l6ZSwgQkNNT0xUX1BSRVNFTkNFX01BU0tfQUxMKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09WRVJGTE9XOworICAgIH0KKworICAgIGlmIChiY21vbHRfbXNnX3Nob3VsZF9wYWNrX2RhdGEoaGRyKSAmJiAoZ3JvdXAtPm1lbV9zY2FuICE9IE5VTEwpICYmICFncm91cC0+bWVtX3NjYW4oYnVmLCBzaXplLCBoZHItPnByZXNlbmNlX21hc2spKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT1ZFUkZMT1c7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3Jld2luZChidWYsIGJjbW9sdF9idWZfZ2V0X3VzZWQoYnVmKSAtIHBvc19iZWZvcmVfc2NhbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9PVkVSRkxPVzsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogUGFjayBtZXNzYWdlIHNldCwgZXhjbHVkaW5nIHRoZSBmaWx0ZXItaGVhZGVyIHdoaWNoIGlzIGFscmVhZHkgcGFja2VkICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X21zZ19zZXRfdW5wYWNrKGJjbW9sdF9tc2cgKm1zZywgYmNtb2x0X2J1ZiAqYnVmLCBjb25zdCBiY21vbHRfZ3JvdXBfaW5mbyAqa2V5X2luZm8pCit7CisgICAgYmNtb2x0X21zZ19zZXQgKm1zZ19zZXQ7CisgICAgaW50IGk7CisgICAgYmNtb3NfYm9vbCByZXQ7CisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKworICAgIC8qCisgICAgICogU2VlIGVuY29kaW5nIGluIGJjbW9sdF9tc2dfc2V0X3BhY2soKQorICAgICAqLworICAgIGlmIChtc2ctPmRpciA9PSBCQ01PTFRfTVNHX0RJUl9SRVFVRVNUKQorICAgIHsKKyAgICAgICAgdWludDhfdCBncm91cDsKKyAgICAgICAgdWludDE2X3QgbWF4X2luc3RhbmNlczsKKyAgICAgICAgdWludDY0X3QgZmlsdGVyX2ZsYWdzOworCisgICAgICAgIHJldCA9IGJjbW9sdF9idWZfcmVhZF91OChidWYsICZncm91cCk7CisgICAgICAgIHJldCA9IHJldCAmJiBiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgJm1heF9pbnN0YW5jZXMpOworICAgICAgICBpZiAoIXJldCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT1ZFUkZMT1c7CisgICAgICAgIH0KKworICAgICAgICBlcnIgPSBiY21vbHRfbXNnX3NldF9hbGxvYyhtc2ctPm9ial90eXBlLCBncm91cCwgbWF4X2luc3RhbmNlcywgJm1zZ19zZXQpOworICAgICAgICBpZiAoZXJyKSByZXR1cm4gZXJyOworCisgICAgICAgIHJldCA9IHJldCAmJiBiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgJm1zZ19zZXQtPnByZXNlbmNlX21hc2spOworICAgICAgICByZXQgPSByZXQgJiYgYmNtb2x0X2J1Zl9yZWFkX3U2NChidWYsICZmaWx0ZXJfZmxhZ3MpOworICAgICAgICBpZiAoIXJldCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X21zZ19zZXRfZnJlZShtc2dfc2V0KTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09WRVJGTE9XOworICAgICAgICB9CisKKyAgICAgICAgbXNnX3NldC0+ZmlsdGVyX2ZsYWdzID0gZmlsdGVyX2ZsYWdzOworICAgICAgICBtc2ctPm1zZ19zZXQgPSBtc2dfc2V0OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB1aW50OF90IGlzX21vcmU7CisgICAgICAgIHVpbnQxNl90IG51bV9pbnN0YW5jZXM7CisKKyAgICAgICAgcmV0ID0gYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICZudW1faW5zdGFuY2VzKTsKKyAgICAgICAgaWYgKCFyZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09WRVJGTE9XOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1zZy0+bXNnX3NldCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBlcnIgPSBiY21vbHRfbXNnX3NldF9hbGxvYyhtc2ctPm9ial90eXBlLCBtc2ctPmdyb3VwLCBudW1faW5zdGFuY2VzLCAmbXNnLT5tc2dfc2V0KTsKKyAgICAgICAgICAgIGlmIChCQ01fRVJSX09LICE9IGVycikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbXNnX3NldCA9IG1zZy0+bXNnX3NldDsKKyAgICAgICAgbXNnX3NldC0+bnVtX2luc3RhbmNlcyA9IG51bV9pbnN0YW5jZXM7CisgICAgICAgIHJldCA9IHJldCAmJiBiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmaXNfbW9yZSk7CisgICAgICAgIHJldCA9IHJldCAmJiBrZXlfaW5mby0+dW5wYWNrKG1zZ19zZXQtPm5leHRfa2V5LCBidWYsIE5VTEwsIEJDTU9MVF9QUkVTRU5DRV9NQVNLX0FMTCk7CisgICAgICAgIGlmICghcmV0KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PVkVSRkxPVzsKKyAgICAgICAgfQorCisgICAgICAgIG1zZ19zZXQtPm1vcmUgPSAoYmNtb3NfYm9vbCkgaXNfbW9yZTsKKyAgICAgICAgaWYgKG1zZ19zZXQtPm51bV9pbnN0YW5jZXMgPiBtc2dfc2V0LT5tYXhfaW5zdGFuY2VzKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9JTlRFUk5BTCwgIm1zZ19zZXQgdW5wYWNrOiBudW1faW5zdGFuY2VzICV1ID4gbWF4X2luc3RhbmNlcyAldVxuIiwgbXNnX3NldC0+bnVtX2luc3RhbmNlcywgbXNnX3NldC0+bWF4X2luc3RhbmNlcyk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbXNnX3NldC0+bnVtX2luc3RhbmNlcyAmJiBlcnIgPT0gQkNNX0VSUl9PSzsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBlcnIgPSBiY21vbHRfbXNnX3VucGFjayhidWYsICZtc2dfc2V0LT5tc2dbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9tc2dfdW5wYWNrKGJjbW9sdF9idWYgKmJ1ZiwgYmNtb2x0X21zZyAqKnVucGFja2VkKQoreworICAgIGJjbW9sdF9tc2cgaGRyID0geyB9OworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3JvdXBfaW5mbyAqZ3JvdXA7CisgICAgYmNtb2x0X2dyb3VwX2luZm8gKmtleTsKKyAgICBiY21vc19ib29sIGRpZF9tYWxsb2MgPSBCQ01PU19GQUxTRTsKKyAgICB1aW50OF90ICprZXlfcHRyOworICAgIHZvaWQgKmxpc3RfbWVtID0gTlVMTDsKKyAgICB2b2lkICoqbGlzdF9tZW1fcHRyID0gTlVMTDsKKworICAgIGVyciA9IGJjbW9sdF9tc2dfaGRyX3VucGFjaygmaGRyLCBidWYpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZ2V0X2dyb3VwX2luZm8oJmhkciwgJmdyb3VwLCAma2V5KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX01TR19FUlJPUjsKKyAgICB9CisKKyAgICBpZiAoKnVucGFja2VkID09IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCBzaXplID0gZ3JvdXAtPmNvbnRhaW5lcl9zaXplID09IDAgPyBzaXplb2YoYmNtb2x0X21zZykgKyBrZXktPnNpemUgOiBncm91cC0+Y29udGFpbmVyX3NpemU7CisgICAgICAgIGVyciA9IGJjbW9sdF9tc2dfbGlzdF9tZW1fc2NhbihidWYsICZoZHIsIGdyb3VwLCBrZXksICZzaXplKTsKKyAgICAgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisKKyAgICAgICAgKnVucGFja2VkID0gYmNtb3NfY2FsbG9jKHNpemUpOworICAgICAgICBpZiAoKnVucGFja2VkID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICB9CisKKyAgICAgICAgbGlzdF9tZW0gPSAodWludDhfdCAqKSAoKnVucGFja2VkKSArIGdyb3VwLT5jb250YWluZXJfc2l6ZTsKKyAgICAgICAgbGlzdF9tZW1fcHRyID0gJmxpc3RfbWVtOworICAgICAgICBkaWRfbWFsbG9jID0gQkNNT1NfVFJVRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKCgqdW5wYWNrZWQpLT5saXN0X2J1ZiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBzaXplID0gMDsKKyAgICAgICAgICAgIGVyciA9IGJjbW9sdF9tc2dfbGlzdF9tZW1fc2NhbihidWYsICZoZHIsIGdyb3VwLCBrZXksICZzaXplKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc2l6ZSA+ICgqdW5wYWNrZWQpLT5saXN0X2J1Zl9zaXplKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX0lOU1VGRklDSUVOVF9MSVNUX01FTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbGlzdF9tZW0gPSAoKnVucGFja2VkKS0+bGlzdF9idWY7CisgICAgICAgICAgICBsaXN0X21lbV9wdHIgPSAmbGlzdF9tZW07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBoZHIubXNnX3NldCA9ICgqdW5wYWNrZWQpLT5tc2dfc2V0OworICAgICoqdW5wYWNrZWQgPSBoZHI7CisKKyAgICBrZXlfcHRyID0gKHVpbnQ4X3QgKikgKCp1bnBhY2tlZCArIDEpOworICAgIGlmICgha2V5LT51bnBhY2soa2V5X3B0ciwgYnVmLCBsaXN0X21lbV9wdHIsIEJDTU9MVF9QUkVTRU5DRV9NQVNLX0FMTCkpCisgICAgeworICAgICAgICBpZiAoZGlkX21hbGxvYykKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfZnJlZSgqdW5wYWNrZWQpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT1ZFUkZMT1c7CisgICAgfQorCisgICAgaWYgKGJjbW9sdF9tc2dfc2hvdWxkX3BhY2tfZGF0YSgmaGRyKSkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgKmRhdGFfcHRyID0gKHVpbnQ4X3QgKikgKCp1bnBhY2tlZCkgKyBncm91cC0+ZGF0YV9vZmZzZXQ7CisgICAgICAgIGlmICgoZ3JvdXAtPnVucGFjayAhPSBOVUxMKSAmJiAhZ3JvdXAtPnVucGFjayhkYXRhX3B0ciwgYnVmLCBsaXN0X21lbV9wdHIsIGhkci5wcmVzZW5jZV9tYXNrKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGRpZF9tYWxsb2MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb3NfZnJlZSgqdW5wYWNrZWQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PVkVSRkxPVzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIElmIGl0IGlzIGEgbXVsdGktbWVzc2FnZSBwYWNrIHdoYXQgZm9sbG93cyB0aGUgcmVzdCBvZiB0aGUgc2V0ICovCisgICAgaWYgKGhkci50eXBlICYgQkNNT0xUX01TR19UWVBFX01VTFRJKQorICAgIHsKKyAgICAgICAgZXJyID0gYmNtb2x0X21zZ19zZXRfdW5wYWNrKCp1bnBhY2tlZCwgYnVmLCBrZXkpOworICAgICAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChkaWRfbWFsbG9jKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9zX2ZyZWUoKnVucGFja2VkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfZXJybm8gYmNtb2x0X2dyb3VwX2lkX3NwbGl0KGJjbW9sdF9ncm91cF9pZCBncm91cF9pZCwgYmNtb2x0X29ial9pZCAqb2JqLCBiY21vbHRfbWd0X2dyb3VwICpncm91cCwgdWludDE2X3QgKnN1Ymdyb3VwKQoreworICAgIGlmICgoZ3JvdXBfaWQgPj0gQkNNT0xUX0dST1VQX0lEX19OVU1fT0YpIHx8IChncm91cF9pbmZvW2dyb3VwX2lkXSA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgICpvYmogPSBncm91cF9pbmZvW2dyb3VwX2lkXS0+b2JqX3R5cGU7CisgICAgKmdyb3VwID0gZ3JvdXBfaW5mb1tncm91cF9pZF0tPmdyb3VwOworICAgICpzdWJncm91cCA9IGdyb3VwX2luZm9bZ3JvdXBfaWRdLT5zdWJncm91cDsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9ncm91cF9pZF9jb21iaW5lKGJjbW9sdF9vYmpfaWQgb2JqLCBiY21vbHRfbWd0X2dyb3VwIGdyb3VwLCB1aW50MTZfdCBzdWJncm91cCwgYmNtb2x0X2dyb3VwX2lkICpncm91cF9pZCkKK3sKKyAgICBpZiAoKG9iaiA+PSBCQ01PTFRfT0JKX0lEX19OVU1fT0YpIHx8IChncm91cCA+PSBCQ01PTFRfTUdUX0dST1VQX19OVU1fT0YpIHx8IChncm91cF9pZHNbb2JqXSA9PSBOVUxMKSB8fCAoc3ViZ3JvdXAgPj0gZ3JvdXBfaWRzW29ial1bZ3JvdXBdLnN1Ymdyb3VwX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgICpncm91cF9pZCA9IGdyb3VwX2lkc1tvYmpdW2dyb3VwXS5zdWJncm91cF9pZHNbc3ViZ3JvdXBdOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDhfdCBiY21vbHRfbXNnX2luc3RhbmNlKGNvbnN0IGJjbW9sdF9tc2cgKm1zZykKK3sKKyAgICBjb25zdCB2b2lkICp2YWxfcHRyOworCisgICAgaWYgKG1zZy0+b2JqX3R5cGUgPj0gQkNNT0xUX09CSl9JRF9fTlVNX09GKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKGluc3RhbmNlX2luZm9bbXNnLT5vYmpfdHlwZV0ub2Zmc2V0IDwgMCkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHZhbF9wdHIgPSAoKGNvbnN0IHVpbnQ4X3QgKikobXNnICsgMSkpICsgaW5zdGFuY2VfaW5mb1ttc2ctPm9ial90eXBlXS5vZmZzZXQ7CisKKyAgICAvKiogVGhpcyBpcyBwcm9iYWJseSBub3QgdGhlIHNtYXJ0ZXN0IHdheSB0byBkbyB0aGlzLi4uIFRPRE86IHJldmlzaXQgKi8KKyAgICBzd2l0Y2ggKGluc3RhbmNlX2luZm9bbXNnLT5vYmpfdHlwZV0uc2l6ZSkKKyAgICB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHJldHVybiAqKChjb25zdCB1aW50OF90ICopdmFsX3B0cik7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHJldHVybiAodWludDhfdCkgKCooKGNvbnN0IHVpbnQxNl90ICopdmFsX3B0cikpOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICByZXR1cm4gKHVpbnQ4X3QpICgqKChjb25zdCB1aW50MzJfdCAqKXZhbF9wdHIpKTsKKyAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgcmV0dXJuICh1aW50OF90KSAoKigoY29uc3QgdWludDY0X3QgKil2YWxfcHRyKSk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBiY21vbHRfbXNnX2Nsb25lKGJjbW9sdF9tc2cgKipkZXN0LCBiY21vbHRfbXNnICpzcmMpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGludDMyX3QgcGFja2VkX2xlbjsKKyAgICB1aW50OF90ICptZW07CisgICAgYmNtb2x0X2J1ZiBidWY7CisKKyAgICBwYWNrZWRfbGVuID0gYmNtb2x0X21zZ19nZXRfcGFja2VkX2xlbmd0aChzcmMpOworICAgIGlmIChwYWNrZWRfbGVuIDwgMCkKKyAgICB7CisgICAgICAgIHJldHVybiAoYmNtb3NfZXJybm8pIHBhY2tlZF9sZW47CisgICAgfQorCisgICAgbWVtID0gYmNtb3NfY2FsbG9jKCh1aW50MzJfdCkgcGFja2VkX2xlbik7CisgICAgaWYgKG1lbSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorCisgICAgYmNtb2x0X2J1Zl9pbml0KCZidWYsICh1aW50MzJfdCkgcGFja2VkX2xlbiwgbWVtLCBCQ01PTFRfQlVGX0VORElBTl9GSVhFRCk7CisgICAgZXJyID0gYmNtb2x0X21zZ19wYWNrKHNyYywgJmJ1Zik7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgYmNtb3NfZnJlZShtZW0pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJ1Zi5jdXJyID0gYnVmLnN0YXJ0OworICAgIGVyciA9IGJjbW9sdF9tc2dfdW5wYWNrKCZidWYsIGRlc3QpOworICAgIGJjbW9zX2ZyZWUobWVtKTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfZXJybm8gYmNtb2x0X2dldF9wcm9wX3JlYWRvbmx5X21hc2soYmNtb2x0X29ial9pZCBvYmosIGJjbW9sdF9wcmVzZW5jZV9tYXNrICptYXNrKQoreworICAgIGlmIChvYmogPj0gQkNNT0xUX09CSl9JRF9fTlVNX09GKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgKm1hc2sgPSByZWFkb25seV9wcm9wX21hc2tbb2JqXTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworI2lmZGVmIF9fS0VSTkVMX18KK0VYUE9SVF9TWU1CT0woYmNtb2x0X21zZ19nZXRfcGFja2VkX2xlbmd0aCk7CitFWFBPUlRfU1lNQk9MKGJjbW9sdF9tc2dfcGFjayk7CitFWFBPUlRfU1lNQk9MKGJjbW9sdF9tc2dfdW5wYWNrKTsKK0VYUE9SVF9TWU1CT0woYmNtb2x0X2dyb3VwX2lkX3NwbGl0KTsKK0VYUE9SVF9TWU1CT0woYmNtb2x0X2dyb3VwX2lkX2NvbWJpbmUpOworRVhQT1JUX1NZTUJPTChiY21vbHRfbXNnX2luc3RhbmNlKTsKK0VYUE9SVF9TWU1CT0woYmNtb2x0X2dldF9wcm9wX3JlYWRvbmx5X21hc2spOworRVhQT1JUX1NZTUJPTChiY21vbHRfbXNnX3NldF9hbGxvYyk7CitFWFBPUlRfU1lNQk9MKGJjbW9sdF9tc2dfc2V0X2ZyZWUpOworCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9tb2RlbC9iY21vbHRfbXNnX3BhY2suaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9tb2RlbC9iY21vbHRfbXNnX3BhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzAxYmZmCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL21vZGVsL2JjbW9sdF9tc2dfcGFjay5oCkBAIC0wLDAgKzEsMTQzIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OnByb3ByaWV0YXJ5OnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVGhpcyBwcm9ncmFtIGlzIHRoZSBwcm9wcmlldGFyeSBzb2Z0d2FyZSBvZiBCcm9hZGNvbSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzCitsaWNlbnNvcnMsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBkdXBsaWNhdGVkLCBtb2RpZmllZCBvciBkaXN0cmlidXRlZCBwdXJzdWFudAordG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIGEgc2VwYXJhdGUsIHdyaXR0ZW4gbGljZW5zZSBhZ3JlZW1lbnQgZXhlY3V0ZWQKK2JldHdlZW4geW91IGFuZCBCcm9hZGNvbSAoYW4gIkF1dGhvcml6ZWQgTGljZW5zZSIpLiAgRXhjZXB0IGFzIHNldCBmb3J0aCBpbgorYW4gQXV0aG9yaXplZCBMaWNlbnNlLCBCcm9hZGNvbSBncmFudHMgbm8gbGljZW5zZSAoZXhwcmVzcyBvciBpbXBsaWVkKSwgcmlnaHQKK3RvIHVzZSwgb3Igd2FpdmVyIG9mIGFueSBraW5kIHdpdGggcmVzcGVjdCB0byB0aGUgU29mdHdhcmUsIGFuZCBCcm9hZGNvbQorZXhwcmVzc2x5IHJlc2VydmVzIGFsbCByaWdodHMgaW4gYW5kIHRvIHRoZSBTb2Z0d2FyZSBhbmQgYWxsIGludGVsbGVjdHVhbAorcHJvcGVydHkgcmlnaHRzIHRoZXJlaW4uICBJRiBZT1UgSEFWRSBOTyBBVVRIT1JJWkVEIExJQ0VOU0UsIFRIRU4gWU9VIEhBVkUKK05PIFJJR0hUIFRPIFVTRSBUSElTIFNPRlRXQVJFIElOIEFOWSBXQVksIEFORCBTSE9VTEQgSU1NRURJQVRFTFkgTk9USUZZCitCUk9BRENPTSBBTkQgRElTQ09OVElOVUUgQUxMIFVTRSBPRiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBleHByZXNzbHkgc2V0IGZvcnRoIGluIHRoZSBBdXRob3JpemVkIExpY2Vuc2UsCisKKzEuIFRoaXMgcHJvZ3JhbSwgaW5jbHVkaW5nIGl0cyBzdHJ1Y3R1cmUsIHNlcXVlbmNlIGFuZCBvcmdhbml6YXRpb24sCisgICAgY29uc3RpdHV0ZXMgdGhlIHZhbHVhYmxlIHRyYWRlIHNlY3JldHMgb2YgQnJvYWRjb20sIGFuZCB5b3Ugc2hhbGwgdXNlCisgICAgYWxsIHJlYXNvbmFibGUgZWZmb3J0cyB0byBwcm90ZWN0IHRoZSBjb25maWRlbnRpYWxpdHkgdGhlcmVvZiwgYW5kIHRvCisgICAgdXNlIHRoaXMgaW5mb3JtYXRpb24gb25seSBpbiBjb25uZWN0aW9uIHdpdGggeW91ciB1c2Ugb2YgQnJvYWRjb20KKyAgICBpbnRlZ3JhdGVkIGNpcmN1aXQgcHJvZHVjdHMuCisKKzIuIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIgorICAgIEFORCBXSVRIIEFMTCBGQVVMVFMgQU5EIEJST0FEQ09NIE1BS0VTIE5PIFBST01JU0VTLCBSRVBSRVNFTlRBVElPTlMgT1IKKyAgICBXQVJSQU5USUVTLCBFSVRIRVIgRVhQUkVTUywgSU1QTElFRCwgU1RBVFVUT1JZLCBPUiBPVEhFUldJU0UsIFdJVEgKKyAgICBSRVNQRUNUIFRPIFRIRSBTT0ZUV0FSRS4gIEJST0FEQ09NIFNQRUNJRklDQUxMWSBESVNDTEFJTVMgQU5ZIEFORAorICAgIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgVElUTEUsIE1FUkNIQU5UQUJJTElUWSwgTk9OSU5GUklOR0VNRU5ULAorICAgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBMQUNLIE9GIFZJUlVTRVMsIEFDQ1VSQUNZIE9SCisgICAgQ09NUExFVEVORVNTLCBRVUlFVCBFTkpPWU1FTlQsIFFVSUVUIFBPU1NFU1NJT04gT1IgQ09SUkVTUE9OREVOQ0UKKyAgICBUTyBERVNDUklQVElPTi4gWU9VIEFTU1VNRSBUSEUgRU5USVJFIFJJU0sgQVJJU0lORyBPVVQgT0YgVVNFIE9SCisgICAgUEVSRk9STUFOQ0UgT0YgVEhFIFNPRlRXQVJFLgorCiszLiBUTyBUSEUgTUFYSU1VTSBFWFRFTlQgUEVSTUlUVEVEIEJZIExBVywgSU4gTk8gRVZFTlQgU0hBTEwgQlJPQURDT00gT1IKKyAgICBJVFMgTElDRU5TT1JTIEJFIExJQUJMRSBGT1IgKGkpIENPTlNFUVVFTlRJQUwsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgICAgSU5ESVJFQ1QsIE9SIEVYRU1QTEFSWSBEQU1BR0VTIFdIQVRTT0VWRVIgQVJJU0lORyBPVVQgT0YgT1IgSU4gQU5ZCisgICAgV0FZIFJFTEFUSU5HIFRPIFlPVVIgVVNFIE9GIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFNPRlRXQVJFIEVWRU4KKyAgICBJRiBCUk9BRENPTSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVM7CisgICAgT1IgKGlpKSBBTlkgQU1PVU5UIElOIEVYQ0VTUyBPRiBUSEUgQU1PVU5UIEFDVFVBTExZIFBBSUQgRk9SIFRIRQorICAgIFNPRlRXQVJFIElUU0VMRiBPUiBVLlMuICQxLCBXSElDSEVWRVIgSVMgR1JFQVRFUi4gVEhFU0UgTElNSVRBVElPTlMKKyAgICBTSEFMTCBBUFBMWSBOT1RXSVRIU1RBTkRJTkcgQU5ZIEZBSUxVUkUgT0YgRVNTRU5USUFMIFBVUlBPU0UgT0YgQU5ZCisgICAgTElNSVRFRCBSRU1FRFkuCis6PgorKi8KKworI2lmbmRlZiBCQ01PTFRfTVNHX1BBQ0tfSF8KKyNkZWZpbmUgQkNNT0xUX01TR19QQUNLX0hfCisKKyNpbmNsdWRlICJiY21vc19zeXN0ZW0uaCIKKyNpbmNsdWRlICJiY21vc19jb21tb24uaCIKKyNpbmNsdWRlICJiY21vc19lcnJuby5oIgorI2luY2x1ZGUgImJjbW9sdF9idWYuaCIKKyNpbmNsdWRlICJiY21vbHRfbXNnLmgiCisjaW5jbHVkZSAiYmNtb2x0X21vZGVsX3R5cGVzLmgiCisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgYSBtZXNzYWdlIHdvdWxkIG9jY3VweSB3aGVuIHBhY2tlZC4KKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgbWVzc2FnZSB0byBzY2FuLgorICogXHJldHVybiBUaGUgc2l6ZSBpbiBieXRlcyBpZiA+IDAsIG9yIGFuIGVycm9yIGFzIGRlZmluZWQgaW4gYmNtb3NfZXJybm8uCisgKi8KK2ludDMyX3QgYmNtb2x0X21zZ19nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfbXNnICp0aGlzKTsKKworLyoqIFBhY2tzIGEgbWVzc2FnZSB0byBhIGJ5dGUgc3RyZWFtLgorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBtZXNzYWdlIHRvIHBhY2suCisgKiBccGFyYW0gYnVmIFRoZSBzdHJlYW0gdG8gcGFjayBpbnRvLgorICogXHJldHVybiBBbiBlcnJvciBjb2RlIG9yIEJDTV9FUlJfT0sgZm9yIHN1Y2Nlc3MuCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9tc2dfcGFjayhiY21vbHRfbXNnICp0aGlzLCBiY21vbHRfYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIG1lc3NhZ2UgZnJvbSBhIGJ5dGUgc3RyZWFtLgorICoKKyAqIFRoaXMgdW5wYWNrcyB0aGUgbWVzc2FnZSBmcm9tIHRoZSBwYWNrZWQgZm9ybSBpbnRvIHRoZSBzdHJ1Y3QgZm9sbG93aW5nIHRoZSAidW5wYWNrZWQiIHBvaW50ZXIuICBUaGVyZSBhcmUgc2V2ZXJhbAorICogc3BlY2lhbCBjYXNlczoKKyAqCisgKiBpZiAqdW5wYWNrZWQgPT0gTlVMTDoKKyAqICAgKnVucGFja2VkIHdpbGwgYmUgYWxsb2NhdGVkIGR5bmFtaWNhbGx5IHZpYSBiY21vc19jYWxsb2MsIGluIGEgY29udGlndW91cyBibG9jayBvZiBtZW1vcnkgd2l0aCB0aGUgc3RydWN0CisgKiAgIGl0c2VsZiBmb2xsb3dlZCBieSB0aGUgbWVtb3J5IHJlcXVpcmVkIGZvciBhbGwgdmFyaWFibGUtc2l6ZWQgbGlzdHMuCisgKgorICogaWYgKCp1bnBhY2tlZCktPmxpc3RfYnVmICE9IE5VTEw6CisgKiAgIFdoZW4gYSB2YXJpYWJsZS1sZW5ndGggbGlzdCBpcyBlbmNvdW50ZXJlZCBpbiB0aGUgaW5wdXQgc3RyZWFtLCBhbmQgdGhlIGFycmF5IGZpZWxkIHdlJ3JlIHVucGFja2luZyBpbnRvIGlzIE5VTEwsCisgKiAgIG1lbW9yeSB3aWxsIGJlIGFsbG9jYXRlZCBzdGFydGluZyBmcm9tICgqdW5wYWNrZWQpLT5saXN0X2J1Zi4gIElmIG11bHRpcGxlIHN1Y2ggbGlzdHMgZXhpc3QsIHRoZXkgd2lsbCBzaGFyZSB0aGlzCisgKiAgIGJ1ZmZlci4gIElmIHRoZSAoKnVucGFja2VkKS0+bGlzdF9idWZfc2l6ZSBpcyBub3QgbGFyZ2UgZW5vdWdoLCB0aGlzIHdpbGwgcmV0dXJuIEJDTV9FUlJfSU5TVUZGSUNJRU5UX0xJU1RfTUVNLgorICoKKyAqIFxwYXJhbSBidWYgICAgICAgICAgIFRoZSBzdHJlYW0gdG8gdW5wYWNrIGZyb20uCisgKiBccGFyYW0gdW5wYWNrZWQgICAgICBBIHBvaW50ZXIgdG8gdGhlIG1lc3NhZ2UgdG8gdW5wYWNrLgorICogXHJldHVybiBBbiBlcnJvciBhcyBkZWZpbmVkIGluIGJjbW9zX2Vycm5vLgorICovCitiY21vc19lcnJubyBiY21vbHRfbXNnX3VucGFjayhiY21vbHRfYnVmICpidWYsIGJjbW9sdF9tc2cgKip1bnBhY2tlZCk7CisKKy8qKiBDb252ZXJ0cyBhIGdlbmVyaWMgZ3JvdXAgSUQgaW50byBhIHNwZWNpZmljIG9iamVjdCB0eXBlLCBncm91cCBhbmQgc3ViZ3JvdXAuCisgKgorICogXHBhcmFtIGdyb3VwX2lkIFRoZSBnZW5lcmljIGdyb3VwIElELgorICogXHBhcmFtIG9iaiBUaGUgb2JqZWN0IHR5cGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ3JvdXAgSUQuCisgKiBccGFyYW0gZ3JvdXAgVGhlIGdyb3VwIHR5cGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ3JvdXAgSUQuCisgKiBccGFyYW0gc3ViZ3JvdXAgVGhlIHN1Ymdyb3VwIGluZGV4IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdyb3VwIElELgorICogXHJldHVybiBBbiBlcnJvciBjb2RlIG9yIEJDTV9FUlJfT0sgZm9yIHN1Y2Nlc3MuCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9ncm91cF9pZF9zcGxpdChiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X29ial9pZCAqb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9tZ3RfZ3JvdXAgKmdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICpzdWJncm91cCk7CisKKy8qKiBDb252ZXJ0cyBhIHNwZWNpZmljIG9iamVjdCB0eXBlLCBncm91cCBhbmQgc3ViZ3JvdXAgaW50byBhIGdlbmVyaWMgZ3JvdXAgSUQuCisgKgorICogXHBhcmFtIG9iaiBUaGUgb2JqZWN0IHR5cGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ3JvdXAgSUQuCisgKiBccGFyYW0gZ3JvdXAgVGhlIGdyb3VwIHR5cGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ3JvdXAgSUQuCisgKiBccGFyYW0gc3ViZ3JvdXAgVGhlIHN1Ymdyb3VwIGluZGV4IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdyb3VwIElELgorICogXHBhcmFtIGdyb3VwX2lkIFRoZSBnZW5lcmljIGdyb3VwIElELgorICogXHJldHVybiBBbiBlcnJvciBjb2RlIG9yIEJDTV9FUlJfT0sgZm9yIHN1Y2Nlc3MuCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9ncm91cF9pZF9jb21iaW5lKGJjbW9sdF9vYmpfaWQgb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X21ndF9ncm91cCBncm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHN1Ymdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2dyb3VwX2lkICpncm91cF9pZCk7CisKKy8qKiBSZXR1cm5zIHRoZSBpbnN0YW5jZSBudW1iZXIgb2YgYSBnaXZlbiBtZXNzYWdlLCBhcyBkZXRlcm1pbmVkIGJ5IHRoZSBvYmplY3Qga2V5LgorICoKKyAqIFxwYXJhbSBtc2cgVGhlIG1lc3NhZ2UgdG8gY2hlY2suCisgKiBccmV0dXJuIFRoZSBpbnN0YW5jZSBudW1iZXIgb2YgdGhlIG1lc3NhZ2UuCisgKi8KK3VpbnQ4X3QgYmNtb2x0X21zZ19pbnN0YW5jZShjb25zdCBiY21vbHRfbXNnICptc2cpOworCisvKiogR2V0cyBhIG1hc2sgb2YgYWxsIHJlYWRvbmx5IHByb3BlcnRpZXMgZm9yIGFuIG9iamVjdCdzIGNmZyBncm91cC4KKyAqCisgKiBccGFyYW0gb2JqIFRoZSBvYmplY2N0IHRvIGNoZWNrLgorICogXHBhcmFtIG1hc2sgQSBtYXNrIG9mIGJpdHMgc2V0IHRvIDEgcGVyIHJlYWQtb25seSBwcm9wZXJ0eS4KKyAqIFxyZXR1cm4gQW4gZXJyb3IgY29kZSBvciBCQ01fRVJSX09LIGZvciBzdWNjZXNzLgorICovCitiY21vc19lcnJubyBiY21vbHRfZ2V0X3Byb3BfcmVhZG9ubHlfbWFzayhiY21vbHRfb2JqX2lkIG9iaiwgYmNtb2x0X3ByZXNlbmNlX21hc2sgKm1hc2spOworCisvKiogQ2xvbmVzIGEgbWVzc2FnZSBieSBwYWNraW5nIGl0IHRvIGEgYnVmZmVyIHRoZW4gdW5wYWNraW5nIGl0IGludG8gdGhlIGRlc3RpbmF0aW9uIG1lc3NhZ2UuCisgKiBUaGlzIHVzZXMgYmNtb2x0X21zZ191bnBhY2ssIHNvIGlmICpkZXN0IGlzIE5VTEwsIG1lbW9yeSB3aWxsIGJ5IGFsbG9jYXRlZCBkeW5hbWljYWxseSB1c2luZyBiY21vc19jYWxsb2MuCisgKgorICogXHBhcmFtIGRlc3QgQSBwb2ludGVyIHRvIHRoZSBsb2NhdGlvbiBpbiBtZW1vcnkgdGhhdCB3aWxsIGhvbGQgdGhlIGNsb25lZCBtZXNzYWdlLgorICogXHBhcmFtIHNyYyBUaGUgbWVzc2FnZSB0aGF0IHNob3VsZCBiZSBjb3BpZWQuCisgKiBccmV0dXJuIEFuIGVycm9yIGNvZGUgb3IgQkNNX0VSUl9PSyBmb3Igc3VjY2Vzcy4KKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X21zZ19jbG9uZShiY21vbHRfbXNnICoqZGVzdCwgYmNtb2x0X21zZyAqc3JjKTsKKworI2VuZGlmIC8qIEJDTU9MVF9NU0dfUEFDS19IXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3BjaWUvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvcGNpZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGNjMThiCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3BjaWUvTWFrZWZpbGUKQEAgLTAsMCArMSwzNSBAQAorIyBQQ0llIGRyaXZlcgorIyAtIGxvdy1sZXZlbCBQQ0llIGRyaXZlciAoc2VuZC9yeCBmdW5jdGlvbnMpCisjCitNT0RfTkFNRSA9IHBjaWUKKworaWZlcSAoIiQoT1NfS0VSTkVMKSIsICJsaW51eCIpCitNT0RfVFlQRSA9IGxpbnV4X2xpYgorZWxzZQorTU9EX1RZUEUgPSBsaWIKK2VuZGlmCisKK01PRF9ERUZTID0gLURDSEVDS19QQVJBTQorI01PRF9ERUZTICs9IC1ESEFSRFdBUkVfVEVTVDEKKworaWZlcSAoIiQoU1VCU1lTVEVNKSIsICJlbWJlZGRlZCIpCisgICAgTU9EX0lOQ19ESVJTID0gJChTUkNfRElSKSBlbWJlZGRlZC9zeXMvZHJ2CitlbHNlCisgICAgaWZuZXEgKCIkKFJFTEVBU0VfQlVJTEQpIiwgInkiKQorICAgICAgICBNT0RfSU5DX0RJUlMgPSAkKFNSQ19ESVIpIGhvc3QvZHJpdmVyLyQoUExBVEZPUk0pL3BjaWUKKyAgICBlbmRpZgorZW5kaWYKKworIyBJZiBjYWxsZWQgYnkgbGludXgga2VybmVsIGJ1aWxkZXIgLSBhZGQgaW5jbHVkZSBwYXRocyBtYW51YWxseS4KKyMgSXQgaXMgbm90IGVsZWdhbnQsIGJ1dCB3ZSdsbCBub3QgaGF2ZSBtYW55IGxpbnV4IG1vZHVsZXMKK2lmbmVxICgiJChLQlVJTERfU1JDKSIsICIiKQorCS1pbmNsdWRlICQoT1VUX0RJUl9CQVNFKS9NYWtlZmlsZS5jb25maWcuJChNT0RfTkFNRSkKK2VuZGlmCisKK2lmbmVxICgiJChSQVdfVFJBTlNQT1JUX1ZJQV9VRFApIiwgInkiKQorICAgIHNyY3MgPSBiY210cl9wY2llLmMKK2VuZGlmCisKK1VTRV9MSU5UID0geWVzCisKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3BjaWUvYmNtb2x0X3RyX3BjaWVfc3BlY2lmaWMuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9wY2llL2JjbW9sdF90cl9wY2llX3NwZWNpZmljLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTQxMDJiYwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9wY2llL2JjbW9sdF90cl9wY2llX3NwZWNpZmljLmMKQEAgLTAsMCArMSwxMDYgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpbmNsdWRlICJiY21vc19zeXN0ZW0uaCIKKyNpbmNsdWRlICJiY210cl9wY2llLmgiCisjaW5jbHVkZSAiYmNtb2x0X3RyX3BjaWVfc3BlY2lmaWMuaCIKKworZXh0ZXJuIGZfYmNtdHJfaW50IGJjbXRyX3BjaWVfcnhfaXJxX2hhbmRsZXI7CitleHRlcm4gZl9iY210cl9pbnQgYmNtdHJfcGNpZV90eF9pcnFfaGFuZGxlcjsKK3N0YXRpYyBiY21vc19mYXN0bG9jayBpc3JfbG9jazsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIG5lZWQgdG8gcGFzcyB0aHJ1IGFsbCB0aGUgZGV2aWNlcyAtIGNoZWNrIGlmIGlycSBpcyBTSEFSRUQgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGJjbXRyX3J4X2lzcihpbnQgaXJxLCB2b2lkICppc3JfaW5mbykKK3sKKyAgICB1aW50MzJfdCBpc3JfcmVnOworICAgIHVpbnQzMl90IG1hc2tfcmVnOworICAgIGxvbmcgZmxhZ3M7CisgICAgaW50IGhhbmRsZWQgPSAwOworICAgIGJjbV9wY2llZF9pc3JfZGF0YSAqaXNyX2RhdGEgPSAoYmNtX3BjaWVkX2lzcl9kYXRhICopaXNyX2luZm87CisKKyAgICBmbGFncyA9IGJjbW9zX2Zhc3Rsb2NrX2xvY2soJmlzcl9sb2NrKTsKKworICAgIGlzcl9yZWcgPSBiY21fcGNpX3JlYWQzMigodWludDMyX3QqKShpc3JfZGF0YS0+cGNpZV9yZWdfYmFzZSArIERNQV9JTlRSX1NUQVRVUykpOworICAgIG1hc2tfcmVnID0gfmJjbV9wY2lfcmVhZDMyKCh1aW50MzJfdCopKGlzcl9kYXRhLT5wY2llX3JlZ19iYXNlICsgRE1BX0lOVFJfTUFTS19TVEFUVVMpKTsKKworICAgIGlmICgoaXNyX3JlZyAmIG1hc2tfcmVnKSYgRE1BX1RYX0RPTkVfTUFTSykKKyAgICB7CisgICAgICAgIC8qIGhhbmRsZSBUWCBET05FIGludGVycnVwdCAqLworICAgICAgICBpc3JfZGF0YS0+dHhfZG9uZV9udW0rKzsKKworICAgICAgICBpZiAoYmNtdHJfcGNpZV90eF9pcnFfaGFuZGxlcikKKyAgICAgICAgICAgIGJjbXRyX3BjaWVfdHhfaXJxX2hhbmRsZXIoaXNyX2RhdGEtPmRldmljZSk7CisKKyAgICAgICAgaGFuZGxlZCA9IDE7CisgICAgfQorCisgICAgaWYgKChpc3JfcmVnICYgbWFza19yZWcgKSAmIERNQV9SWF9ET05FX01BU0spCisgICAgeworICAgICAgICAvKiBoYW5kbGUgUlggRE9ORSBpbnRlcnJ1cHQgKi8KKyAgICAgICAgaXNyX2RhdGEtPnJ4X2RvbmVfbnVtKys7CisKKyAgICAgICAgaWYgKGJjbXRyX3BjaWVfcnhfaXJxX2hhbmRsZXIpCisgICAgICAgICAgICBiY210cl9wY2llX3J4X2lycV9oYW5kbGVyKGlzcl9kYXRhLT5kZXZpY2UpOworCisgICAgICAgIGhhbmRsZWQgPSAxOworICAgIH0KKworICAgIGlmIChpc3JfcmVnICYgKERNQV9SWF9FUlJPUl9NQVNLIHwgRE1BX1RYX0VSUk9SX01BU0spKQorICAgIHsKKyAgICAgICAgaWYgKGlzcl9yZWcgJiBETUFfUlhfRVJST1JfTUFTSykKKyAgICAgICAgICAgIGlzcl9kYXRhLT5yeF9lcnJfbnVtKys7CisgICAgICAgIGlmIChpc3JfcmVnICYgRE1BX1RYX0VSUk9SX01BU0spCisgICAgICAgICAgICBpc3JfZGF0YS0+dHhfZXJyX251bSsrOworICAgICAgICAvKiBjbGVhciBpbnRlcnJ1cHQgZXJyb3IgaW50ZXJydXB0ICovCisgICAgICAgIGJjbV9wY2lfd3JpdGUzMigodWludDMyX3QqKShpc3JfZGF0YS0+cGNpZV9yZWdfYmFzZSArIERNQV9JTlRSX0NMRUFSKSwgRE1BX1JYX0VSUk9SX01BU0sgfCBETUFfVFhfRVJST1JfTUFTSyk7CisgICAgICAgIGhhbmRsZWQgPSAxOworICAgIH0KKworICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmaXNyX2xvY2ssIGZsYWdzKTsKKworICAgIHJldHVybiBoYW5kbGVkOworfQorCit2b2lkIGJjbXRyX2Nvbm5lY3RfaXNyKHZvaWQgKmlzcl9pbmZvKQoreworICAgIHVpbnQzMl90ICAgIGZsYWdzID0gMDsKKworICAgIGJjbV9wY2llZF9pc3JfZGF0YSAqaXNyX2RhdGEgPSAoYmNtX3BjaWVkX2lzcl9kYXRhICopaXNyX2luZm87CisgICAgYmNtb3NfZmFzdGxvY2tfaW5pdCgmaXNyX2xvY2ssIGZsYWdzKTsKKyAgICAvKiBjb25uZWN0IGludGVycnVwdCB0byBzeXN0ZW0gY3B1IC0gMCAqLworICAgIGJjbW9zX2ludF9jb25uZWN0KChpbnQpaXNyX2RhdGEtPnJ4X2lycSwgMCwgQkNNT1NfSVJRX1NIQVJFRCwgYmNtdHJfcnhfaXNyLCAiZG1haXNyIiwgaXNyX2RhdGEpOworfQorCisjaWZkZWYgX19LRVJORUxfXworRVhQT1JUX1NZTUJPTChiY210cl9jb25uZWN0X2lzcik7CisjZW5kaWYKKworCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvcGNpZS9iY21vbHRfdHJfcGNpZV9zcGVjaWZpYy5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3BjaWUvYmNtb2x0X3RyX3BjaWVfc3BlY2lmaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGM4YWMxCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3BjaWUvYmNtb2x0X3RyX3BjaWVfc3BlY2lmaWMuaApAQCAtMCwwICsxLDExMyBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBCQ01PTFRfVFJfUENJRV9TUEVDSUZJQ19IXworI2RlZmluZSBCQ01PTFRfVFJfUENJRV9TUEVDSUZJQ19IXworCisjaW5jbHVkZSAiYmNtb3Nfc3lzdGVtLmgiCisjaW5jbHVkZSAiYmNtdHJfcGNpZS5oIgorCisjZGVmaW5lIERFU0NSSVBUT1JfQ09OVFJPTCAgICAgIDB4MDAwNjQ0MTAgLyogVHggU29mdHdhcmUgRGVzY3JpcHRvciBMaXN0IENvbnRyb2wgYW5kIFN0YXR1cyAqLworI2RlZmluZSBXQUtFVVBfRE1BICAgICAgICAgICAgICAweDAwMDY0NDE0IC8qIFR4IFdha2UgQ29udHJvbCAqLworI2RlZmluZSBFUlJPUl9TVEFUVVMgICAgICAgICAgICAweDAwMDY0NDE4IC8qIFR4IEVuZ2luZSBFcnJvciBTdGF0dXMgKi8KKworI2RlZmluZSBJTlRSMl9QQ0lfU1RBVFVTICAgICAgICAweDAwMDY0MzE4IC8qIFBDSSBpbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgRE1BX1RYX1NXX0RFU0NfTElTVF9DVFJMX1NUU19UWF9ETUFfUlVOX1NUT1BfTUFTSyAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgRE1BX1RYX1dBS0VfQ1RSTF9XQUtFX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKworI2RlZmluZSBETUFfSU5UUl9TVEFUVVMJICAgICAgICAweDAwMDY0MzE4IC8qIFBDSSBpbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIERNQV9JTlRSX0NMRUFSICAgICAgICAgIDB4MDAwNjQzMjAgLyogUENJIGludGVycnVwdCBDbGVhciBSZWdpc3RlciAqLworI2RlZmluZSBETUFfSU5UUl9NQVNLX1NFVCAgICAgICAweDAwMDY0MzI4IC8qIFBDSSBpbnRlcnJ1cHQgTWFzayBTZXQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRE1BX0lOVFJfTUFTS19DTEVBUiAgICAgMHgwMDA2NDMyYyAvKiBQQ0kgaW50ZXJydXB0IE1hc2sgQ2xlYXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRE1BX0lOVFJfTUFTS19TVEFUVVMgICAgMHgwMDA2NDMyNCAvKiBQQ0kgaW50ZXJydXB0IE1hc2sgJiBTdGF0dXMgUmVnaXN0ZXIgKi8KKworI2RlZmluZSBETUFfUlhfRVJST1JfTUFTSyAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIERNQV9SWF9ET05FX01BU0sgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgRE1BX1RYX0RPTkVfTUFTSyAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBETUFfVFhfRVJST1JfTUFTSyAgICAgICAweDAwMDAwMDAyCisKKyNkZWZpbmUgUENJRV9MMl9JTlRSX01BU0sgICAgICAgMHgwMDAwMDAyMCAvKiBMMiBpbnRlcnJ1cHQgYml0IGluIEwxIGludGVycnVwdCBzdGF0dXMgKi8KKworI2RlZmluZSBETUFfSU5UUjFfU1RBVFVTICAgICAgICAweDAwMDY5MzAwIC8qIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRE1BX0lOVFIxX01BU0tfQ0xFQVIgICAgMHgwMDA2OTMwYyAvKiBJbnRlcnJ1cHQgTWFzayBDbGVhciBSZWdpc3RlciAqLworI2RlZmluZSBETUFfSU5UUjFfTUFTS19TRVQgICAgICAweDAwMDY5MzA4IC8qIEludGVycnVwdCBNYXNrIFNldCBSZWdpc3RlciAqLworI2RlZmluZSBETUFfSU5UQV9NQVNLICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIERNQV9JTlRBX1NISUZUICAgICAgICAgIDEKKyNkZWZpbmUgUENJRV9TVEFUVVNfT0ZGU0VUICAgICAgMHgwMDA2NDA2OCAvKiBQQ0lFX1BDSUVfUENJRV8wX1BDSUVfUENJRV8wX01JU0NfUENJRV9TVEFUVVMgKi8KKwordm9pZCBiY210cl9jb25uZWN0X2lzcih2b2lkICppc3JfaW5mbyk7CisKKy8qIGZpcnN0IHBhcmFtZXRlciBpcyB0aGUgZGVzdCBQRCwgdGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgdGhlIHNvdXJjZSBmaWVsZCAqLworc3RhdGljIGlubGluZSB2b2lkIGJjbXRyX3NldF9kZXN0X2J1ZmZlcl9hZGRyZXNzKHVpbnQzMl90ICpwZCwgdm9pZCAqdmFsdWUpCit7CisgICAgdWludDY0X3QgdG1wID0gYmNtb3NfdmlydF90b19waHlzKHZhbHVlKTsKKworICAgIGJjbV9wY2lfd3JpdGUzMigmcGRbUENJX1BBQ0tFVF9MT1dfSU5ERVhdLCAgKHVpbnQzMl90KSggdG1wICYgMHhmZmZmZmZmZlVMKSk7CisgICAgYmNtX3BjaV93cml0ZTMyKCZwZFtQQ0lfUEFDS0VUX0hJR0hfSU5ERVhdLCAodWludDMyX3QpKCh0bXAgPj4gMzIpICYgMHhmZmZmZmZmZlVMKSk7Cit9CisKKy8qIGZpcnN0IHBhcmFtZXRlciBpcyB0aGUgZGVzdCBQRCwgdGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgdGhlIHNvdXJjZSBmaWVsZCAqLworc3RhdGljIGlubGluZSB2b2lkIGJjbXRyX3NldF9zb3VyY2VfYnVmZmVyX2FkZHJlc3ModWludDMyX3QgKnBkLCB2b2lkICp2YWx1ZSkKK3sKKyAgICB1aW50NjRfdCB0bXAgPSBiY21vc192aXJ0X3RvX3BoeXModmFsdWUpOworCisgICAgYmNtX3BjaV93cml0ZTMyKCZwZFtQQ0lfUEFDS0VUX0xPV19JTkRFWF0sICAodWludDMyX3QpKCB0bXAgJiAweGZmZmZmZmZmVUwpKTsKKyAgICBiY21fcGNpX3dyaXRlMzIoJnBkW1BDSV9QQUNLRVRfSElHSF9JTkRFWF0sICh1aW50MzJfdCkoKHRtcCA+PiAzMikgJiAweGZmZmZmZmZmVUwpKTsKK30KKworc3RhdGljIGlubGluZSBiY21vc19lcnJubyBiY210cl9jcmVhdGVfdHVfcmluZ3ModWludDMyX3QgdHhsZW5ndGgsIHVpbnQzMl90IHJ4bGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKnR4cHRyLCB2b2lkICoqcnhwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqdHhwdHJfb3JpZywgdm9pZCAqKnJ4cHRyX29yaWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHBjaWVfcmVnX2Jhc2UpCit7CisgICAgKnR4cHRyICAgICAgPSBOVUxMOworICAgICpyeHB0cl9vcmlnID0gTlVMTDsKKyAgICAqdHhwdHIgICAgICA9IE5VTEw7CisgICAgKnJ4cHRyX29yaWcgPSBOVUxMOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgYmNtdHJfcGNpZV9zcGVjaWZpY19pbml0KHVuc2lnbmVkIGxvbmcgcGNpZV9yZWdfYmFzZSkge30KK3N0YXRpYyBpbmxpbmUgdm9pZCBiY210cl9wY2llX2ZyZWVfcmluZ3ModWludDMyX3QgZGV2aWNlLCB1aW50MzJfdCAqdHhfcHRyLCB1aW50MzJfdCAqIHJ4X3B0cil7fQorc3RhdGljIGlubGluZSB2b2lkIGJjbXRyX3BjaWVfZnJlZV9pcnEodWludDMyX3QgaXJxLCB2b2lkICpwcml2KQoreworI2lmbmRlZiBTSU1VTEFUSU9OX0JVSUxECisgICAgYmNtb3NfaW50X2Rpc2Nvbm5lY3QoKGludClpcnEsIHByaXYpOworI2VuZGlmCit9CisKKyNkZWZpbmUgVFhfTE9DS0RFRiAgICAgICAgIGJjbW9zX211dGV4ICB0eF9sb2NrOworI2RlZmluZSBDUkVBVEVfVFhMT0NLKGkpICAgYmNtb3NfbXV0ZXhfY3JlYXRlKCZiY210cl9wY2llX2RhdGFbaV0udHhfbG9jaywgMCwgTlVMTCkKKyNkZWZpbmUgREVTVFJPWV9UWExPQ0soaSkgIGJjbW9zX211dGV4X2Rlc3Ryb3koJmJjbXRyX3BjaWVfZGF0YVtpXS50eF9sb2NrKQorI2RlZmluZSBMT0NLX1RYKCkgICAgICAgICAgYmNtb3NfbXV0ZXhfbG9jaygmY3VycmVudF9kZXZpY2UtPnR4X2xvY2spCisjZGVmaW5lIFVOTE9DS19UWCgpICAgICAgICBiY21vc19tdXRleF91bmxvY2soJmN1cnJlbnRfZGV2aWNlLT50eF9sb2NrKQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3BjaWUvYmNtdHJfcGNpZS5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3BjaWUvYmNtdHJfcGNpZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YjU3MmYKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvcGNpZS9iY210cl9wY2llLmMKQEAgLTAsMCArMSwxMjU2IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworI2luY2x1ZGUgImJjbXRyX3BjaWUuaCIKKyNpbmNsdWRlICJiY21vbHRfdHJfcGNpZV9zcGVjaWZpYy5oIgorCisKKy8qCisgICAgU3luY2hyb25pemF0aW9uIGZsb3cgb2YgRE1BIGRhdGEgYmFzZSBiZXR3ZWVuIEhvc3QgYW5kIE1hcGxlCisgICAgVGhlIHByb2Nlc3MgdGFrZXMgcGxhY2UgYWZ0ZXIgTWFwbGUgaXMgbG9hZGVkIGFuZCBydW4gZnJvbSBERFIuCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBIb3N0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcGxlCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIHdyaXRlIHRvIFNSQU0gaXRzIFRYIGFuZCBSWCBxdWV1ZSBzaXplCisgICAgd3JpdGUgdG8gU1JBTSBERFJfRklOSVNIIGluZGljYXRpb24KKyAgICB3YWl0IGZvciBQUk1fQklUIGZyb20gTWFwbGUgICAgICAgICAgICAgICAgICAgICAgcnVuIGZyb20gRERSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldCBmcm9tIFNSQU0gaG9zdCB0eCBhbmQgcnggcXVldWUgc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxscyBwcmVfY29ubmVjdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZSB0byBTUkFNIG9wYXF1ZSBkYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlIHRvIFNSQU0gUFJNX0JJVAorICAgIHJlYWQgZnJvbSBTUkFNIG9wYXF1ZSBkYXRhICAgICAgICAgICAgICAgICAgICAgICBjYWxscyBjb25uZWN0CisgICAgY2xlYXIgUFJNX0JJVCBmcm9tIE1hcGxlICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXQgZm9yIFBSTV9CSVQgZnJvbSBIb3N0CisgICAgY2FsbHMgcHJlX2Nvbm5lY3QKKyAgICBjYWxscyBjb25uZWN0CisgICAgd3JpdGUgdG8gU1JBTSBQUk1fQklUCisgICAgcmVnaXN0ZXIgcnggaW50ZXJydXB0IGhhbmRsZXIgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIHJ4IGludGVycnVwdCBoYW5kbGVyCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICBCb3RoIHJlYWR5IHRvIHNlbmQvcmVjZWl2ZSBwYWNrZXRzIHRocnUgRE1BOgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworLyogbWlzYyBsb2NhbF9iZCBpbmZvIHN0cnVjdHVyZQorIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCit8X19fMzEgLSAyNV9fX19ffCAgIDI0ICB8X19fXzIzIC0xNl9fX19ffF9fX18xNS0wX19fX198Cit8X19yZXNlcnZlZF9fX19ffF9fT1dOX198X19fY2hhbmFsIElEX19ffF9fX19sZW5ndGhfX198CisKKyovCisjZGVmaW5lIEJDTV9QQ0lFRF9CRF9PV05FUlNISVBfU0hJRlQgICAgICAgIDI0CisjZGVmaW5lIEJDTV9QQ0lFRF9CRF9PV05FUlNISVBfTUFTSyAgICAgICAgICgweDFVTCA8PCBCQ01fUENJRURfQkRfT1dORVJTSElQX1NISUZUKQorCisjZGVmaW5lIEJDTV9QQ0lFRF9CRF9DSEFOTkVMX0lEX1NISUZUICAgICAgIDE2CisjZGVmaW5lIEJDTV9QQ0lFRF9CRF9DSEFOTkVMX0lEX01BU0sgICAgICAgICgweGZmVUwgPDwgQkNNX1BDSUVEX0JEX0NIQU5ORUxfSURfU0hJRlQpCisKKyNkZWZpbmUgQkNNX1BDSUVEX0JEX1BLVF9MRU5HVEhfTUFTSyAgICAgICAgMHhmZmZmCisKKy8qIGxlbmd0aF9hbmRfaXNyZW5hYmxlICovCisjZGVmaW5lIEJDTV9QQ0lFRF9JTlRSX0VOQUJMRV9TSElGVCAgICAgICAgIDMxCisjZGVmaW5lIEJDTV9QQ0lFRF9JTlRSX0VOQUJMRV9NQVNLICAgICAgICAgICgweDFVTCA8PCBCQ01fUENJRURfSU5UUl9FTkFCTEVfU0hJRlQpCisKKyNkZWZpbmUgQkNNX1BDSUVEX1RSQU5TRkVSX1NJWkVfTUFTSyAgICAgICAgMHgwMWZmZmZmZlVMCisjZGVmaW5lIEJDTV9QQ0lFRF9UUkFOU0ZFUl9TSVpFX1NISUZUICAgICAgIDAKKworLyogbGFzdF9uZXh0X2luZGljYXRvciAqLworI2RlZmluZSBCQ01fUENJRURfTEFTVF9SRUNPUkRfU0hJRlQgICAgICAgICAzMQorI2RlZmluZSBCQ01fUENJRURfTEFTVF9SRUNPUkRfTUFTSyAgICAgICAgICAoMHgxVUwgPDwgQkNNX1BDSUVEX0xBU1RfUkVDT1JEX1NISUZUKQorCisKKyNkZWZpbmUgQkNNX1BDSUVEX05FWFRfQ09OVElOT1VTX1NISUZUICAgICAgMgorI2RlZmluZSBCQ01fUENJRURfTkVYVF9DT05USU5PVVNfTUFTSyAgICAgICAoMHgxVUwgPDwgQkNNX1BDSUVEX05FWFRfQ09OVElOT1VTX1NISUZUKQorCisjZGVmaW5lIEJDTV9QQ0lFX0FMTF9ETUFfSU5URVJSVVBUU19NQVNLICAgIChETUFfUlhfRE9ORV9NQVNLIHwgRE1BX1JYX0VSUk9SX01BU0sgfCBETUFfVFhfRE9ORV9NQVNLIHwgRE1BX1RYX0VSUk9SX01BU0spCisKKy8qIHBhY2tldCBkZXNjcmlwdG9yIC0gdXNlZCBieSBIVyBETUEgbWVjaGFuaXNtICwgZGVmaW5lZCBieSBIVyBkbyBub3QgY2hhbmdlIGl0ICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVpbnQzMl90ICAgIGRkcl9idWZmX2FkZHJlc3NfbG93OyAgIC8qIE1hcGxlIGFkZHJlc3MgLSB3b3JkWzBdKi8KKyAgICB1aW50MzJfdCAgICBwY2llX3BrdF9hZGRyZXNzX2xvdzsgICAvKiBIb3N0IGFkZHJlc3MgIC0gd29yZFsxXSovCisgICAgdWludDMyX3QgICAgcGNpZV9wa3RfYWRkcmVzc19oaWdoOyAgLyogICAgICAgICAgICAgICAtIHdvcmRbMl0qLworICAgIHVpbnQzMl90ICAgIGxlbmd0aF9hbmRfaXNyZW5hYmxlOyAgIC8qIGJpdCAzMSAtIGludGVycnVwdCBlbmFibGU7IGJpdHMgMjQ6MiAtIHRyYW5zZmVyIGxlbmd0aCAqLworICAgIHVpbnQzMl90ICAgIGxhc3RfbmV4dF9pbmRpY2F0b3I7ICAgIC8qIGJpdCAzMSAtIGxhc3QgaW5kaWNhdG9yOyBiaXQgMzAgLSBkaXJlY3Rpb247IGJpdCAyIC0gbmV4dCBkZXNjcmlwdG9yLCBpZiAxIC0+IGNvbnRpbnVvdXMgKi8KKyAgICB1aW50MzJfdCAgICBuZXh0X3BkX2FkZHJlc3NfbG93OworICAgIHVpbnQzMl90ICAgIG5leHRfcGRfYWRkcmVzc19oaWdoOworICAgIHVpbnQzMl90ICAgIGRkcl9idWZmX2FkZHJlc3NfaGlnaDsgIC8qICAgICAgICAgICAgICAgLSB3b3JkWzddKi8KK30gYmNtX3BjaWVkX3BkOworCisvKiB0cmFuc2ZlciB1bml0IGZvciBUWC9SWCAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21fcGNpZWRfcGQgICAgZGF0YV9wZDsgICAgICAgICAgICAvKiBQRCB1c2VkIHRvIHRyYW5zZmVyIGRhdGEgcGFja2V0ICovCisgICAgYmNtX3BjaWVkX3BkICAgIHJlbW90ZV90b19sb2NhbF9wZDsgLyogUEQgdXNlZCB0byB0cmFuc2ZlciBzaGFkb3dfcmJkIGZpZWxkIGZyb20gbG9jYWwgQ1BVCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGxvY2FsX2JkIGZpZWxkIG9uIHBlZXIgQ1BVICAgKi8KK30gYmNtX3BjaWVkX3R1OworCisvKiBvcGFxdWUgZGF0YSwgaW4gY3VycmVudCBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIHNlbnQgZnJvbSB0aGUgTWFwbGUgdG8gSG9zdCBvbmx5LgorICAgUHJvdmlkZSBvZmZzZXRzIGZyb20gdGhlIHN0YXJ0IG9mIE1hcGxlIEREUiB3aW5kb3cgZm9yIHR4IGFuZCByeCBUVSByaW5ncyAod2hlcmUgdHggYW5kIHJ4IHJpbmdzIGluIHRlcm0gb2YgSG9zdCkKKyovCitzdHJ1Y3QgYmNtdHJfcGNpZV9vcGFxdWVfZGF0YQoreworICAgIHVpbnQzMl90ICAgIHR4X3R1X3Jpbmdfb2Zmc2V0OworICAgIHVpbnQzMl90ICAgIHJ4X3R1X3Jpbmdfb2Zmc2V0OworfTsKKworLyogbWFpbiBzdHJ1Y3R1cmUgb2YgdGhlIGRyaXZlciAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21fcGNpZWRfdHUgICAgICAgICp0eF90dV9yaW5nOyAgICAgICAgLyogVFggRE1BIHJpbmcgKi8KKyAgICBiY21fcGNpZWRfdHUgICAgICAgICpyeF90dV9yaW5nOyAgICAgICAgLyogUlggRE1BIHJpbmcgKi8KKworICAgIHVpbnQzMl90ICAgICAgICAgICAgKmxvY2FsX2JkOyAgICAgICAgICAvKiB1c2VkIGZvciByZWNlaXZlLCB1cGRhdGVkIGJ5IHBlZXIgaW4gdHggKi8KKyAgICB1aW50MzJfdCAgICAgICAgICAgICpzaGFkb3dfcmJkOyAgICAgICAgIC8qIHVzZWQgYnkgbG9jYWwgaW4gdHggYXMganVzdCBidWZmZXIgZm9yIHVwZGF0ZSByZW1vdGUgbG9jYWxfYmQgKi8KKworICAgIHVpbnQzMl90ICAgICAgICAgICAgKnR4X293bmVyOyAgICAgICAgICAvKiB1c2VkIGZvciBsb2NhbCBpbiB0eCBmb3IgbG9va3VwIHRoYXQgdHUgbWluZSwgdXBkYXRlZCBieSBsb2NhbCBhbmQgcGVlciAqLworICAgIHVpbnQzMl90ICAgICAgICAgICAgKnBlZXJfdHhfb3duZXI7ICAgICAvKiB1c2VkIGluIHJ4IGZvciB1cGRhdGUgdHhfb3duZXIgb2YgdGhlIHJlbW90ZSovCisKKyAgICBiY21vc19idWYgICAgICAgICAgICoqdHhfbmJ1ZmZfc2F2ZTsgICAgLyogYXJyYXkgb2YgbmV0d29yayBidWZmZXJzIHBvaW50ZXJzLCB1c2VkIGJ5IFRYLCB0byBzdG9yZSBzZW50IGJ1ZmZlcnMgKi8KKyAgICBiY21vc19idWYgICAgICAgICAgICoqcnhfbmJ1ZmZfc2F2ZTsgICAgLyogYXJyYXkgb2YgbmV0d29yayBidWZmZXJzIHBvaW50ZXJzLCB1c2VkIGJ5IFJYLCB0byBzdG9yZSBhbGxvY2F0ZWQgZm9yIHJ4IGJ1ZmZlcnMgKi8KKworICAgIHVpbnQzMl90ICAgICAgICAgICAgY3VycmVudF90eDsgICAgICAgICAvKiBpbmRleCBvZiBjdXJyZW50IHR4IHR1ICovCisgICAgdWludDMyX3QgICAgICAgICAgICBjb25mX3R4OyAgICAgICAgICAgIC8qIGluZGV4IG9mIHRoZSBsYXN0IHJlY2xhaW1lZCB0eCB0dSAqLworICAgIHVpbnQzMl90ICAgICAgICAgICAgY3VycmVudF9yeDsgICAgICAgICAvKiBpbmRleCBvZiBjdXJyZW50IHJ4IHR1ICovCisgICAgaW50MzJfdCAgICAgICAgICAgICBwcmV2X3R4OworCisgICAgdWludDMyX3QgICAgICAgICAgICBtYXhfdHhfaW5kZXg7CisgICAgdWludDMyX3QgICAgICAgICAgICBtYXhfcnhfaW5kZXg7CisKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1heF9tdHU7CisKKyAgICB1bnNpZ25lZCBsb25nICAgICAgIGRkcl93aW5fYmFzZTsKKyAgICBiY21fcGNpZWRfaXNyX2RhdGEgIGlzcmRhdGE7ICAgICAgICAgICAgLyogaW5jbHVkZXMgcGNpZSByZWdpc3RlciBiYXNlLCBpZCBhbmQgaXJxIG51bWJlciAqLworCisgICAgVFhfTE9DS0RFRgorCisgICAgLyogY291bnRlcnMgICovCisgICAgdWludDMyX3QgICAgICAgICAgICByeF9jb3VudGVyOworICAgIHVpbnQzMl90ICAgICAgICAgICAgdHhfY291bnRlcjsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIHJ4X3BjaWVfZW1wdHlfY291bnRlcjsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIHR4X3BjaWVfZnVsbF9jb3VudGVyOworCisgICAgLyogc2F2ZWQgbWV0YS1kYXRhICovCisgICAgdWludDMyX3QgICAgICAgICAgICB0eHFfbGVuZ3RoOworICAgIHVpbnQzMl90ICAgICAgICAgICAgcnhxX2xlbmd0aDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICp0eF90dV9yaW5nX29yaWc7ICAgLyogVFggRE1BIHJpbmcgKi8KKyAgICB1aW50MzJfdCAgICAgICAgICAgICpyeF90dV9yaW5nX29yaWc7ICAgLyogUlggRE1BIHJpbmcgKi8KKworfSBiY21fcGNpZWRfY29tbV9kYXRhOworCitmX2JjbXRyX2ludCBiY210cl9wY2llX3J4X2lycV9oYW5kbGVyOworZl9iY210cl9pbnQgYmNtdHJfcGNpZV90eF9pcnFfaGFuZGxlcjsKKworc3RhdGljIHZvaWQgZGVmYXVsdF90eF9kb25lX2NhbGxiYWNrKHVpbnQ4X3QgZGV2aWNlLCBiY21vc19idWYgKmJ1Zik7CisKK3N0YXRpYyBmX2JjbXRyX2RvbmUgdHhfZG9uZV9oYW5kbGVyID0gZGVmYXVsdF90eF9kb25lX2NhbGxiYWNrOworCisvKiB1c2VkIGZvciBlcnJvciBtZXNzYWdlcyAqLworI2lmIGRlZmluZWQoX19LRVJORUxfXykKKyNkZWZpbmUgcGNpZV9wcmludChmbXQsIGFyZ3MuLi4pIHByaW50aygiJXM6ICVkOiAiIGZtdCwgX19GVU5DVElPTl9fICwgX19MSU5FX18sICMjYXJncykKKyNlbHNlCisjZGVmaW5lIHBjaWVfcHJpbnQgYmNtb3NfcHJpbnRmCisjZW5kaWYKKworI2RlZmluZSBMT0NBTF9PV05FUiAgICAgICAgICAgMAorI2RlZmluZSBSRU1PVEVfT1dORVIgICAgICAgICAgMQorCisjZGVmaW5lIElOQ1JFTUVOVF9SRUNFSVZFRChkZXZpY2UpICAgICAgYmNtdHJfcGNpZV9kYXRhW2RldmljZV0ucnhfY291bnRlcisrCisjZGVmaW5lIElOQ1JFTUVOVF9UUkFOU01JVEVEKGRldmljZSkgICAgYmNtdHJfcGNpZV9kYXRhW2RldmljZV0udHhfY291bnRlcisrCisKKy8qIHNldCBuZXh0IGluZGV4IGludG8gYSBETUEgcmluZyAqLworI2RlZmluZSBORVhUX0lOREVYKG1heGluZGV4LCBpbmRleCkgXAorZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGluZGV4Kys7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChpbmRleCA+IG1heGluZGV4KSAgICAgICAgICAgXAorICAgICAgICBpbmRleCA9IDA7ICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSgwKQorCisvKiBjYWxjdWxhdGUgcmVnaXN0ZXIgYWRkcmVzcyBhY2NvcmRpbmcgdG8gcmVnaXN0ZXJzJ2Jhc2UgYW5kIG9mZnNldCAqLworI2RlZmluZSBQQ0lfUkVHX0FERFJFU1MocmVnKSAgICAgICAgICAgICAgICh1aW50MzJfdCAqKShiY210cl9wY2llX2RhdGFbZGV2aWNlXS5pc3JkYXRhLnBjaWVfcmVnX2Jhc2UgKyByZWcpCisKKy8qIEp1c3QgZm9yIGF2b2lkIG9mIHVzaW5nIHRoaXMgIkJDTV9FUlJfT0siICBzdHVwaWQgIGRlZmluZSAsIGkgY2FuIG5vdCB1bmRlcnN0YW5kIGhvdyAiZXJyb3IiIGNhbiBiZSAib2siIChELkIuKSAqLworI2RlZmluZSBCQ01UUl9TVUNDRVNTICBCQ01fRVJSX09LCisKKyNkZWZpbmUgQkNNVFJfUEFSQU5PSURfQ0hFQ0soKSAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICghYmNtdHJfcGNpZV9kYXRhKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PUkVTOyAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoZGV2aWNlID49IGJjbXRyX21heF9kZXZpY2VzX251bWJlcilcCisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlKDApCisKKyNkZWZpbmUgQkNNVFJfUEFSQU5PSURfQ0hFQ0tfVFlQRSh0KSAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICghYmNtdHJfcGNpZV9kYXRhKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiAodClCQ01fRVJSX05PUkVTOyAgICAgICAgICAgXAorICAgICAgICBpZiAoZGV2aWNlID49IGJjbXRyX21heF9kZXZpY2VzX251bWJlcilcCisgICAgICAgICAgICByZXR1cm4gKHQpQkNNX0VSUl9SQU5HRTsgICAgICAgICAgIFwKKyAgICB9IHdoaWxlKDApCisKKyNkZWZpbmUgQkNNVFJfUEFSQU5PSURfQ0hFQ0tfRVhUKCkgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICghYmNtdHJfcGNpZV9kYXRhKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PUkVTOyAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoZGV2aWNlID49IGJjbXRyX21heF9kZXZpY2VzX251bWJlcilcCisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCFiY210cl9wY2llX2RhdGFbZGV2aWNlXS5pc3JkYXRhLnBjaWVfcmVnX2Jhc2UpXAorICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9SRVM7ICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSgwKQorCisgICAgLyogZGV2aWNlIGRhdGEgYXJyYXkgKi8KK3N0YXRpYyBiY21fcGNpZWRfY29tbV9kYXRhICpiY210cl9wY2llX2RhdGE7CisKK3N0YXRpYyB1aW50MzJfdCBiY210cl9tYXhfZGV2aWNlc19udW1iZXI7CisKKy8qIHN0b3Agb25lIGRtYSBlbmdpbmUgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzdG9wX2RtYSh1aW50OF90IGRldmljZSkKK3sKKyAgICB2b2xhdGlsZSB1aW50MzJfdCB2YWx1ZTsKKworICAgIHZhbHVlID0gYmNtX3BjaV9yZWFkMzIoUENJX1JFR19BRERSRVNTKCh1aW50MzJfdClERVNDUklQVE9SX0NPTlRST0wpKTsKKyAgICB2YWx1ZSAmPSB+RE1BX1RYX1NXX0RFU0NfTElTVF9DVFJMX1NUU19UWF9ETUFfUlVOX1NUT1BfTUFTSzsKKyAgICBiY21fcGNpX3dyaXRlMzIoUENJX1JFR19BRERSRVNTKERFU0NSSVBUT1JfQ09OVFJPTCksIHZhbHVlKTsKK30KKworLyogRGVmYXVsdCB0eC1kb25lIGNhbGxiYWNrICovCitzdGF0aWMgdm9pZCBkZWZhdWx0X3R4X2RvbmVfY2FsbGJhY2sodWludDhfdCBkZXZpY2UsIGJjbW9zX2J1ZiAqYnVmKQoreworICAgIGJjbW9zX2ZyZWUoYnVmKTsKK30KKworLyogZnJlZSBhbGwgYWxsb2NhdGVkIGJ1ZmZlcnMgKi8KK3N0YXRpYyBiY21vc19lcnJubyBmcmVlX2J1ZmZlcnModWludDhfdCBkZXZpY2UsIGNvbnN0IGNoYXIgKmVycm9yX3N0cmluZykKK3sKKyAgICB1aW50MzJfdCBpOworICAgIGJjbV9wY2llZF9jb21tX2RhdGEgKmN1cnJlbnRfZGV2aWNlID0gJmJjbXRyX3BjaWVfZGF0YVtkZXZpY2VdOworCisgICAgcGNpZV9wcmludCgiJXMiLCBlcnJvcl9zdHJpbmcpOworCisgICAgaWYgKGN1cnJlbnRfZGV2aWNlLT5yeF9uYnVmZl9zYXZlKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGN1cnJlbnRfZGV2aWNlLT5yeHFfbGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjdXJyZW50X2RldmljZS0+cnhfbmJ1ZmZfc2F2ZVtpXSkKKyAgICAgICAgICAgICAgICBiY21vc19idWZfZnJlZShjdXJyZW50X2RldmljZS0+cnhfbmJ1ZmZfc2F2ZVtpXSk7CisgICAgICAgIH0KKyAgICAgICAgYmNtb3NfZnJlZShjdXJyZW50X2RldmljZS0+cnhfbmJ1ZmZfc2F2ZSk7CisgICAgfQorCisgICAgaWYgKGN1cnJlbnRfZGV2aWNlLT50eF9uYnVmZl9zYXZlKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGN1cnJlbnRfZGV2aWNlLT50eHFfbGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjdXJyZW50X2RldmljZS0+dHhfbmJ1ZmZfc2F2ZVtpXSkKKyAgICAgICAgICAgICAgICBiY21vc19idWZfZnJlZShjdXJyZW50X2RldmljZS0+dHhfbmJ1ZmZfc2F2ZVtpXSk7CisgICAgICAgIH0KKyAgICAgICAgYmNtb3NfZnJlZShjdXJyZW50X2RldmljZS0+dHhfbmJ1ZmZfc2F2ZSk7CisgICAgfQorCisgICAgaWYgKGN1cnJlbnRfZGV2aWNlLT5sb2NhbF9iZCkKKyAgICAgICAgYmNtb3NfZG1hX2ZyZWUoZGV2aWNlLCBjdXJyZW50X2RldmljZS0+bG9jYWxfYmQpOworCisgICAgaWYgKGN1cnJlbnRfZGV2aWNlLT5zaGFkb3dfcmJkKQorICAgICAgICBiY21vc19kbWFfZnJlZShkZXZpY2UsIGN1cnJlbnRfZGV2aWNlLT5zaGFkb3dfcmJkKTsKKworICAgIERFU1RST1lfVFhMT0NLKGRldmljZSk7CisKKyAgICBiY210cl9wY2llX2ZyZWVfcmluZ3MoZGV2aWNlLCBjdXJyZW50X2RldmljZS0+dHhfdHVfcmluZ19vcmlnLCBjdXJyZW50X2RldmljZS0+cnhfdHVfcmluZ19vcmlnKTsKKworICAgIG1lbXNldCgmYmNtdHJfcGNpZV9kYXRhW2RldmljZV0sIDAsIHNpemVvZihiY21fcGNpZWRfY29tbV9kYXRhKSk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKK30KKworYmNtb3NfZXJybm8gYmNtdHJfcGNpZV9pbml0KHVpbnQ4X3QgbWF4X2RldmljZXMpCit7CisgICAgYmNtdHJfbWF4X2RldmljZXNfbnVtYmVyID0gbWF4X2RldmljZXM7CisKKyAgICBiY210cl9wY2llX2RhdGEgPSAoYmNtX3BjaWVkX2NvbW1fZGF0YSAqKWJjbW9zX2NhbGxvYyhiY210cl9tYXhfZGV2aWNlc19udW1iZXIgKiBzaXplb2YoYmNtX3BjaWVkX2NvbW1fZGF0YSkpOworICAgIGlmICghYmNtdHJfcGNpZV9kYXRhKQorICAgIHsKKyAgICAgICAgcGNpZV9wcmludCgiRHJpdmVyIGNhbm5vdCBiZSBpbml0aWFsaXplZFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKworICAgIHJldHVybiBCQ01UUl9TVUNDRVNTOworfQorCitiY21vc19lcnJubyBiY210cl9wY2llX3ByZV9jb25uZWN0KHVpbnQ4X3QgZGV2aWNlLCBjb25zdCBiY210cl9wY2llX3ByZV9jb25uZWN0X2NmZyAqY2ZnLCBiY210cl9wY2llX29wYXF1ZV9kYXRhICpvcGFxdWVfZGF0YSkKK3sKKyAgICBiY21fcGNpZWRfY29tbV9kYXRhICpjdXJyZW50X2RldmljZTsKKyAgICBiY21vc19lcnJubyAgICAgICAgIHJldF9jb2RlOworICAgIHVpbnQzMl90ICAgICAgICAgICAgaTsKKworICAgIEJDTVRSX1BBUkFOT0lEX0NIRUNLKCk7CisKKyAgICBpZiAoIWNmZykKKyAgICB7CisgICAgICAgIHBjaWVfcHJpbnQoIlNlY29uZCBwYXJhbWV0ZXIoY29uZmlnKSBpcyBOVUxMIHBvaW50ZXJcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9OVUxMOworICAgIH0KKworICAgIGlmICghb3BhcXVlX2RhdGEpCisgICAgeworICAgICAgICBwY2llX3ByaW50KCJSZXR1cm4gYXJlYSBwb2ludGVyKFRoaXJkIHBhcmFtZXRlcikgaXMgTlVMTFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05VTEw7CisgICAgfQorCisgICAgY3VycmVudF9kZXZpY2UgPSAmYmNtdHJfcGNpZV9kYXRhW2RldmljZV07CisKKyAgICBDUkVBVEVfVFhMT0NLKGRldmljZSk7CisKKyAgICAvKiBjb3B5IHVzZXIncyBkYXRhIHRvIGludGVybmFsIGRhdGEgYmFzZSAqLworICAgIGN1cnJlbnRfZGV2aWNlLT50eHFfbGVuZ3RoICAgICAgICAgICAgICA9IGNmZy0+dHhxX3NpemU7CisgICAgY3VycmVudF9kZXZpY2UtPnJ4cV9sZW5ndGggICAgICAgICAgICAgID0gY2ZnLT5yeHFfc2l6ZTsKKyAgICBjdXJyZW50X2RldmljZS0+bWF4X3R4X2luZGV4ICAgICAgICAgICAgPSBjZmctPnR4cV9zaXplIC0gMTsKKyAgICBjdXJyZW50X2RldmljZS0+bWF4X3J4X2luZGV4ICAgICAgICAgICAgPSBjZmctPnJ4cV9zaXplIC0gMTsKKyAgICBjdXJyZW50X2RldmljZS0+bWF4X210dSAgICAgICAgICAgICAgICAgPSBjZmctPm1heF9tdHU7CisgICAgY3VycmVudF9kZXZpY2UtPmlzcmRhdGEuZGV2aWNlICAgICAgICAgID0gZGV2aWNlOworICAgIGN1cnJlbnRfZGV2aWNlLT5pc3JkYXRhLnJ4X2lycSAgICAgICAgICA9IGNmZy0+cnhfaXJxOworICAgIGN1cnJlbnRfZGV2aWNlLT5pc3JkYXRhLnBjaWVfcmVnX2Jhc2UgICA9IGNmZy0+cGNpZV9yZWdfYmFzZTsKKyAgICBjdXJyZW50X2RldmljZS0+ZGRyX3dpbl9iYXNlICAgICAgICAgICAgPSBjZmctPmRkcl93aW5fYmFzZTsKKyAgICBjdXJyZW50X2RldmljZS0+cHJldl90eCAgICAgICAgICAgICAgICAgPSAtMTsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIGFsbG9jYXRlIGRhdGEgYmFzZSAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqLworCisgICAgYmNtdHJfcGNpZV9zcGVjaWZpY19pbml0KGN1cnJlbnRfZGV2aWNlLT5pc3JkYXRhLnBjaWVfcmVnX2Jhc2UpOworCisgICAgcmV0X2NvZGUgPSAgYmNtdHJfY3JlYXRlX3R1X3JpbmdzKGN1cnJlbnRfZGV2aWNlLT50eHFfbGVuZ3RoLCBjdXJyZW50X2RldmljZS0+cnhxX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKikmY3VycmVudF9kZXZpY2UtPnR4X3R1X3JpbmcsICh2b2lkICoqKSZjdXJyZW50X2RldmljZS0+cnhfdHVfcmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKikmY3VycmVudF9kZXZpY2UtPnR4X3R1X3Jpbmdfb3JpZywgKHZvaWQgKiopJmN1cnJlbnRfZGV2aWNlLT5yeF90dV9yaW5nX29yaWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9kZXZpY2UtPmlzcmRhdGEucGNpZV9yZWdfYmFzZSk7CisgICAgaWYgKHJldF9jb2RlICE9IEJDTVRSX1NVQ0NFU1MpCisgICAgeworICAgICAgICBwY2llX3ByaW50KCJGYWlsZWQgdG8gY3JlYXRlIHRyYW5zZmVyIHVuaXQgcmluZ3MgOiAoZXJyb3I9JWQpXG4iLHJldF9jb2RlKTsKKyAgICAgICAgcmV0dXJuIHJldF9jb2RlOworICAgIH0KKworICAgIC8qIGFsbG9jYXRlIGFycmF5IG9mIGxvY2FsX2JkIGZvciBSWCBjaGFpbiAqLworICAgIGN1cnJlbnRfZGV2aWNlLT5sb2NhbF9iZCA9ICh1aW50MzJfdCAqKWJjbW9zX2RtYV9hbGxvYyhkZXZpY2UsIHNpemVvZigqY3VycmVudF9kZXZpY2UtPmxvY2FsX2JkKSAqIGN1cnJlbnRfZGV2aWNlLT5yeHFfbGVuZ3RoKTsKKyAgICBpZiAoIWN1cnJlbnRfZGV2aWNlLT5sb2NhbF9iZCkKKyAgICAgICAgcmV0dXJuIGZyZWVfYnVmZmVycyhkZXZpY2UsICJGYWlsZWQgdG8gYWxsb2NhdGUgbG9jYWxfYmQgZm9yIFJYIHJpbmdcbiIpOworCisgICAgIC8qIHNldCByZW1vdGUgc2lkZSBhcyBvd25lciBmb3IgYWxsIGxvY2FsX2JkICovCisgICAgZm9yIChpID0gMDsgaSA8IGN1cnJlbnRfZGV2aWNlLT5yeHFfbGVuZ3RoOyBpKyspCisgICAgICAgICoodWludDMyX3QqKSgmY3VycmVudF9kZXZpY2UtPmxvY2FsX2JkW2ldKT0KKyAgICAgICAgICAgIEJDTU9TX0VORElBTl9DUFVfVE9fTElUVExFX1UzMigodWludDMyX3QpKFJFTU9URV9PV05FUiA8PCBCQ01fUENJRURfQkRfT1dORVJTSElQX1NISUZUKSk7CisKKyAgICAvKiBhbGxvY2F0ZSBhcnJheSBvZiBsb2NhbF9iZCBmb3IgVFggY2hhaW4gKi8KKyAgICBjdXJyZW50X2RldmljZS0+c2hhZG93X3JiZCA9ICh1aW50MzJfdCAqKWJjbW9zX2RtYV9hbGxvYyhkZXZpY2UsIHNpemVvZigqY3VycmVudF9kZXZpY2UtPnNoYWRvd19yYmQpICogY3VycmVudF9kZXZpY2UtPnR4cV9sZW5ndGgpOworICAgIGlmICghY3VycmVudF9kZXZpY2UtPnNoYWRvd19yYmQgKQorICAgICAgIHJldHVybiAgZnJlZV9idWZmZXJzKGRldmljZSwgIkZhaWxlZCB0byBhbGxvY2F0ZSBzaGFkb3dfcmJkIGZvciBUWCByaW5nXG4iKTsKKyAgICAvKiBjbGVhciBhbGwgc2hhZG93X3JiZCAsIGFjdHVhbHkgbm8gbmVlZCBidXQgc3VhdGJsZSBmb3IgZGVidWdnaW5nICovCisgICAgbWVtc2V0KGN1cnJlbnRfZGV2aWNlLT5zaGFkb3dfcmJkLCAwLCBzaXplb2YoKmN1cnJlbnRfZGV2aWNlLT5zaGFkb3dfcmJkKSAqIGN1cnJlbnRfZGV2aWNlLT50eHFfbGVuZ3RoKTsKKworICAgIC8qIGFsbG9jYXRlIG5ldG93cmsgYnVmZmVyIHBvaW50ZXJzIGFycmFpZXMgKi8KKyAgICBjdXJyZW50X2RldmljZS0+dHhfbmJ1ZmZfc2F2ZSA9IChiY21vc19idWYqKiliY21vc19jYWxsb2Moc2l6ZW9mKGJjbW9zX2J1ZiopICogY3VycmVudF9kZXZpY2UtPnR4cV9sZW5ndGgpOworICAgIGlmICghY3VycmVudF9kZXZpY2UtPnR4X25idWZmX3NhdmUpCisgICAgICAgIHJldHVybiBmcmVlX2J1ZmZlcnMoZGV2aWNlLCJGYWlsZWQgdG8gYWxsb2NhdGUgYXJyYXkgZm9yIFRYIGJ1ZmZlcnMgcG9pbnRlcnNcbiIpOworCisgICAgY3VycmVudF9kZXZpY2UtPnJ4X25idWZmX3NhdmUgPSAoYmNtb3NfYnVmKiopYmNtb3NfY2FsbG9jKHNpemVvZihiY21vc19idWYqKSAqIGN1cnJlbnRfZGV2aWNlLT5yeHFfbGVuZ3RoKTsKKyAgICBpZiAoIWN1cnJlbnRfZGV2aWNlLT5yeF9uYnVmZl9zYXZlKQorICAgICAgICByZXR1cm4gZnJlZV9idWZmZXJzKGRldmljZSwgIkZhaWxlZCB0byBhbGxvY2F0ZSBhcnJheSBmb3IgUlggYnVmZmVycyBwb2ludGVyc1xuIik7CisKKyAgICAvKiB1cGRhdGUgcmV0dXJuIHZhbHVlLCBjcm9zcyB0eCBhbmQgcnggZm9yIHBlZXIKKyAgICAgICAgSWYgd2UgZG8gbm90IGFsbG9jYXRlIHRoZSBjb3JyZXNwb25kZWQgYXJlYSBqdXN0IHNlbmQgemVybyB0byBwZWVyIGZvciBpbmRpY2F0ZSBpdAorICAgICovCisgICAgaWYgKGN1cnJlbnRfZGV2aWNlLT50eF90dV9yaW5nKQorICAgICAgICBvcGFxdWVfZGF0YS0+cnhfdHVfcmluZ19vZmZzZXQgPSAodW5zaWduZWQgbG9uZyljdXJyZW50X2RldmljZS0+dHhfdHVfcmluZyAtIGN1cnJlbnRfZGV2aWNlLT5kZHJfd2luX2Jhc2U7CisKKyAgICBpZiAoY3VycmVudF9kZXZpY2UtPnJ4X3R1X3JpbmcpCisgICAgICAgIG9wYXF1ZV9kYXRhLT50eF90dV9yaW5nX29mZnNldCA9ICh1bnNpZ25lZCBsb25nKWN1cnJlbnRfZGV2aWNlLT5yeF90dV9yaW5nIC0gY3VycmVudF9kZXZpY2UtPmRkcl93aW5fYmFzZTsKKworICAgIHJldHVybiBCQ01UUl9TVUNDRVNTOworfQorCitiY21vc19lcnJubyBiY210cl9wY2llX2Nvbm5lY3QodWludDhfdCBkZXZpY2UsIGNvbnN0IGJjbXRyX3BjaWVfb3BhcXVlX2RhdGEgKm9wYXF1ZV9kYXRhKQoreworICAgIHVpbnQzMl90ICAgICAgICAgICAgaTsKKyAgICBiY21fcGNpZWRfY29tbV9kYXRhICpjdXJyZW50X2RldmljZTsKKyAgICBiY21fcGNpZWRfdHUgICAgICAgICp0dV9wdHIgPSBOVUxMOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgKnBrdF9wdHI7CisKKyAgICBCQ01UUl9QQVJBTk9JRF9DSEVDSygpOworCisgICAgY3VycmVudF9kZXZpY2UgPSAmYmNtdHJfcGNpZV9kYXRhW2RldmljZV07CisKKyAgICAvKiB1cGRhdGUgbG9jYWwgdHVfcmluZ3MgcG9pbnRlcnMgLCBubyBuZWVkIGNyb3NzIHNpbmNlIHdlIGFscmVhZHkgZG8gaW4gcHJlLWNvbm5lY3QKKyAgICAgICAgdXBkYXRlIG9ubHkgbm90IHplcm8gcG9pbnRlcnMgKi8KKyAgICBpZiAoIWN1cnJlbnRfZGV2aWNlLT5yeF90dV9yaW5nKQorICAgICAgICBjdXJyZW50X2RldmljZS0+cnhfdHVfcmluZyA9IChiY21fcGNpZWRfdHUqKShvcGFxdWVfZGF0YS0+cnhfdHVfcmluZ19vZmZzZXQgKyBjdXJyZW50X2RldmljZS0+ZGRyX3dpbl9iYXNlKTsKKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBzZXQgbmV4dCB0byBwb2ludCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSByaW5nICovCisgICAgICAgIHR1X3B0ciA9ICZjdXJyZW50X2RldmljZS0+cnhfdHVfcmluZ1tjdXJyZW50X2RldmljZS0+bWF4X3J4X2luZGV4XTsKKyAgICAgICAgYmNtX3BjaV93cml0ZTMyKCYodHVfcHRyLT5yZW1vdGVfdG9fbG9jYWxfcGQubmV4dF9wZF9hZGRyZXNzX2xvdyksICh1aW50MzJfdCliY21vc192aXJ0X3RvX3BoeXMoY3VycmVudF9kZXZpY2UtPnJ4X3R1X3JpbmcpKTsKKyAgICB9CisKKyAgICBpZiAoIWN1cnJlbnRfZGV2aWNlLT50eF90dV9yaW5nKQorICAgICAgICBjdXJyZW50X2RldmljZS0+dHhfdHVfcmluZyA9IChiY21fcGNpZWRfdHUqKShvcGFxdWVfZGF0YS0+dHhfdHVfcmluZ19vZmZzZXQgKyBjdXJyZW50X2RldmljZS0+ZGRyX3dpbl9iYXNlKTsKKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBzZXQgbmV4dCB0byBwb2ludCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSByaW5nICovCisgICAgICAgIHR1X3B0ciA9ICZjdXJyZW50X2RldmljZS0+dHhfdHVfcmluZ1tjdXJyZW50X2RldmljZS0+bWF4X3R4X2luZGV4XTsKKyAgICAgICAgYmNtX3BjaV93cml0ZTMyKCYodHVfcHRyLT5yZW1vdGVfdG9fbG9jYWxfcGQubmV4dF9wZF9hZGRyZXNzX2xvdyksICh1aW50MzJfdCliY21vc192aXJ0X3RvX3BoeXMoY3VycmVudF9kZXZpY2UtPnR4X3R1X3JpbmcpKTsKKyAgICB9CisKKyAgICAvKiBub3cgYWxsIHR1X3JpbmdzIGFsbG9jYXRlZCBhbmQgc3luY2hyb25pemUgICwgdGltZSB0byBzZXQgdGhlIHR4X293bmVyIGFuZCBwZWVyX3R4X293bmVyICovCisgICAgY3VycmVudF9kZXZpY2UtPnR4X293bmVyICAgICAgPSAodWludDMyX3QqKSgodW5zaWduZWQgbG9uZyljdXJyZW50X2RldmljZS0+dHhfdHVfcmluZyArIHNpemVvZihiY21fcGNpZWRfdHUpICogY3VycmVudF9kZXZpY2UtPnR4cV9sZW5ndGgpOworICAgIGN1cnJlbnRfZGV2aWNlLT5wZWVyX3R4X293bmVyID0gKHVpbnQzMl90KikoKHVuc2lnbmVkIGxvbmcpY3VycmVudF9kZXZpY2UtPnJ4X3R1X3JpbmcgKyBzaXplb2YoYmNtX3BjaWVkX3R1KSAqIGN1cnJlbnRfZGV2aWNlLT5yeHFfbGVuZ3RoKTsKKworICAgIC8qIHByZWFsbG9jYXRlIHJ4IG5ldCBidWZmZXJzICovCisgICAgZm9yIChpID0gMDsgaSA8IGN1cnJlbnRfZGV2aWNlLT5yeHFfbGVuZ3RoOyBpKyspCisgICAgeworICAgICAgICBjdXJyZW50X2RldmljZS0+cnhfbmJ1ZmZfc2F2ZVtpXSA9IGJjbW9zX2J1Zl9hbGxvYyhjdXJyZW50X2RldmljZS0+bWF4X210dSk7CisgICAgICAgIGlmICghY3VycmVudF9kZXZpY2UtPnJ4X25idWZmX3NhdmVbaV0pCisgICAgICAgICAgICByZXR1cm4gZnJlZV9idWZmZXJzKGRldmljZSwgIkZhaWxlZCB0byBhbGxvY2F0ZSBidWZmZXIgZm9yIFJYXG4iKTsKKyAgICB9CisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBPSyAsIG5vdyB3ZSBhcmUgcmVhZHkgdG8gaW5pdGlhbGl6ZSB0dV9yaW5ncworICAgIE5PVEU6IGFsbCBzdHVmZiByZWxhdGVkIHRvIGNyZWF0ZSByaW5ncyAobGFzdF9uZXh0X2luZGljYXRvcixuZXh0X3BkX2FkZHJlc3NfbG93ci9oaWdoIGFscmVhZHkKKyAgICBkb25lIGJ5IGJjbXRyX2NyZWF0ZV90dV9yaW5ncworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgLypGaWxsIFRYIHJpbmcsIGZpbGwgb25seSBmaWVsZHMgd2hpY2ggSSAia25vdyIsCisgICAgIGFsbCBwZWVyIHJlbGF0ZWQgcG9pbnRlcnMgd2lsbCBiZSB1cGRhdGVkIGJ5IHBlZXIgKi8KKyAgICBmb3IgKGkgPSAwLCB0dV9wdHIgPSBjdXJyZW50X2RldmljZS0+dHhfdHVfcmluZzsgaSA8IGN1cnJlbnRfZGV2aWNlLT50eHFfbGVuZ3RoOyBpKyssIHR1X3B0cisrKQorICAgIHsKKyAgICAgICAgLyogZmlsbCB0aGUgcmVtb3RlX3RvX2xvY2FsX3BkIC0gb25seSBsYXN0IGluZGljYXRvciAqLworICAgICAgICBpZiAoaSA9PSBjdXJyZW50X2RldmljZS0+bWF4X3R4X2luZGV4KQorICAgICAgICAgICAgYmNtX3BjaV93cml0ZTMyKCYodHVfcHRyLT5yZW1vdGVfdG9fbG9jYWxfcGQubGFzdF9uZXh0X2luZGljYXRvciksIEJDTV9QQ0lFRF9MQVNUX1JFQ09SRF9NQVNLKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYmNtX3BjaV93cml0ZTMyKCYodHVfcHRyLT5yZW1vdGVfdG9fbG9jYWxfcGQubGFzdF9uZXh0X2luZGljYXRvciksIChCQ01fUENJRURfTEFTVF9SRUNPUkRfTUFTSyB8IEJDTV9QQ0lFRF9ORVhUX0NPTlRJTk9VU19NQVNLKSk7CisKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgZmlsbCBkYXRhX3BkCisgICAgICAgICAtIGxlYXZlIGxlbmd0aF9hbmRfaXNyZW5hYmxlIGluIHplcm8gLCB3aWxsIGJlIHNldCBkdXJpbmcgdHgKKyAgICAgICAgIC0gbGVhdmUgc291cmNlIGRhdGEgYnVmZmVyICBwb2ludGVycyBpbiB6ZXJvLCB3aWxsIGJlIHNldCBpbiBkdXJpbmcgdHgKKyAgICAgICAgIC0gZGVzdC4gZGF0YSBidWZmZXIgd2lsbCBiZSBzZXQgYnkgcGVlcgorICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgIGZpbGwgcmVtb3RlX3RvX2xvY2FsX3BkCisgICAgICAgICAgICAgZGVzdC4gZGF0YSBidWZmZXIgd2lsbCBiZSBzZXQgYnkgcGVlcgorICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICBiY210cl9zZXRfc291cmNlX2J1ZmZlcl9hZGRyZXNzKCh1aW50MzJfdCAqKSZ0dV9wdHItPnJlbW90ZV90b19sb2NhbF9wZCwgJmN1cnJlbnRfZGV2aWNlLT5zaGFkb3dfcmJkW2ldKTsKKworICAgICAgICAvKiBzZXQgbGFzdCBpbmRpY2F0b3IgZm9yIHRoZSBjdXJyZW50IHR1ICovCisgICAgICAgIGJjbV9wY2lfd3JpdGUzMigmdHVfcHRyLT5kYXRhX3BkLmxhc3RfbmV4dF9pbmRpY2F0b3IsIEJDTV9QQ0lFRF9ORVhUX0NPTlRJTk9VU19NQVNLKTsKKyAgICAgICAgYmNtX3BjaV93cml0ZTMyKCYodHVfcHRyLT5yZW1vdGVfdG9fbG9jYWxfcGQubGFzdF9uZXh0X2luZGljYXRvciksIEJDTV9QQ0lFRF9ORVhUX0NPTlRJTk9VU19NQVNLKTsKKworICAgICAgICAvKiBzZXQgdGhlIGxlbmd0aCBhbmQgaW50ZXJydXB0IGluZGljYXRvciAgKi8KKyAgICAgICAgYmNtX3BjaV93cml0ZTMyKCZ0dV9wdHItPnJlbW90ZV90b19sb2NhbF9wZC5sZW5ndGhfYW5kX2lzcmVuYWJsZSwgKEJDTV9QQ0lFRF9JTlRSX0VOQUJMRV9NQVNLIHwgKHNpemVvZih1aW50MzJfdCkgPDwgQkNNX1BDSUVEX1RSQU5TRkVSX1NJWkVfU0hJRlQpKSk7CisgICAgfQorCisgICAgLypGaWxsIFJYIHJpbmcsIGZpbGwgb25seSBmaWVsZHMgd2hpY2ggSSAia25vdyIsCisgICAgIGFsbCBwZWVyIHJlbGF0ZWQgcG9pbnRlcnMgd2lsbCBiZSB1cGRhdGVkIGJ5IHBlZXIgKi8KKyAgICBmb3IgKGkgPSAwLCB0dV9wdHIgPSBjdXJyZW50X2RldmljZS0+cnhfdHVfcmluZzsgaSA8IGN1cnJlbnRfZGV2aWNlLT5yeHFfbGVuZ3RoOyBpKyssIHR1X3B0cisrKQorICAgIHsKKyAgICAgICAgLyogZmlsbCB0aGUgcmVtb3RlX3RvX2xvY2FsX3BkIC0gb25seSBsYXN0IGluZGljYXRvciAqLworICAgICAgICBpZiAoaSA9PSBjdXJyZW50X2RldmljZS0+bWF4X3J4X2luZGV4KQorICAgICAgICAgICAgYmNtX3BjaV93cml0ZTMyKCYodHVfcHRyLT5yZW1vdGVfdG9fbG9jYWxfcGQubGFzdF9uZXh0X2luZGljYXRvciksIEJDTV9QQ0lFRF9MQVNUX1JFQ09SRF9NQVNLKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYmNtX3BjaV93cml0ZTMyKCYodHVfcHRyLT5yZW1vdGVfdG9fbG9jYWxfcGQubGFzdF9uZXh0X2luZGljYXRvciksIChCQ01fUENJRURfTEFTVF9SRUNPUkRfTUFTSyB8IEJDTV9QQ0lFRF9ORVhUX0NPTlRJTk9VU19NQVNLKSk7CisKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICBmaWxsIGRhdGFfcGQKKyAgICAgICAgLSBsZWF2ZSBsZW5ndGhfYW5kX2lzcmVuYWJsZSBpbiB6ZXJvICwgd2lsbCBiZSBzZXQgIGJ5IHBlZXIgZHVyaW5nIHR4CisgICAgICAgIC0gbGVhdmUgc291cmNlIGRhdGEgYnVmZmVyICBwb2ludGVycyBpbiB6ZXJvLCB3aWxsIGJlIHNldCBieSBwZWVyIGR1cmluZyB0eAorICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgIC8qIHRha2UgZGF0YSBwb2ludGVyICBmcm9tIG5idWYgc2F2ZWQgaW4gcnhfbmJ1ZmZfc2F2ZSovCisgICAgICAgIHBrdF9wdHIgPSBiY21vc19idWZfZGF0YShjdXJyZW50X2RldmljZS0+cnhfbmJ1ZmZfc2F2ZVtpXSk7CisKKyAgICAgICAgLyogaW52YWxpZGF0ZSBjYWNoZSBmb3IgdGhlIGRhdGEgYnVmZmVycyAqLworICAgICAgICBiY21vc19wcmVwYXJlX2Zvcl9kbWFfcmVhZChwa3RfcHRyLCBjdXJyZW50X2RldmljZS0+bWF4X210dSk7CisKKyAgICAgICAgLyogc2V0IGRlc3RpbmF0aW9uIGRhdGEgYnVmZmVyICovCisgICAgICAgIGJjbXRyX3NldF9kZXN0X2J1ZmZlcl9hZGRyZXNzKCh1aW50MzJfdCAqKSZ0dV9wdHItPmRhdGFfcGQsIHBrdF9wdHIpOworCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgIGZpbGwgcmVtb3RlX3RvX2xvY2FsX3BkCisgICAgICAgICAgICAtIHJlbW90ZV90b19sb2NhbF9wZC5sZW5ndGhfYW5kX2lzcmVuYWJsZSBhbHJlYWR5IHNldCBieSBwZWVyCisgICAgICAgICAgICAtIGxhc3RfbmV4dF9pbmRpY2F0b3Igd2lsbCBiZSBzZXQgYnkgcGVlciBkdXJpbmcgdHgKKyAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgIC8qIHNldCBkZXN0aW5hdGlvbiBmb3IgdGhlIEJEICovCisgICAgICAgIGJjbXRyX3NldF9kZXN0X2J1ZmZlcl9hZGRyZXNzKCh1aW50MzJfdCAqKSZ0dV9wdHItPnJlbW90ZV90b19sb2NhbF9wZCwgJmN1cnJlbnRfZGV2aWNlLT5sb2NhbF9iZFtpXSk7CisKKyAgICAgICAgLyogc2V0IG5leHQgUEQgbmV4dCBwZCBpbmRpY2F0b3IgZm9yIGJvdGggcGFydHMgb2YgdGhlIHRyYW5zZmVyIHVuaXQgKi8KKyAgICAgICAgYmNtX3BjaV93cml0ZTMyKCZ0dV9wdHItPmRhdGFfcGQubGFzdF9uZXh0X2luZGljYXRvciwgICAgICAgICAgICBCQ01fUENJRURfTkVYVF9DT05USU5PVVNfTUFTSyk7CisgICAgICAgIGJjbV9wY2lfd3JpdGUzMigmdHVfcHRyLT5yZW1vdGVfdG9fbG9jYWxfcGQubGFzdF9uZXh0X2luZGljYXRvciwgQkNNX1BDSUVEX05FWFRfQ09OVElOT1VTX01BU0spOworCisgICAgICAgIC8qIHNldCB0aGUgbGVuZ3RoIGFuZCBpbnRlcnJ1cHQgaW5kaWNhdG9yICAqLworICAgICAgICBiY21fcGNpX3dyaXRlMzIoJnR1X3B0ci0+cmVtb3RlX3RvX2xvY2FsX3BkLmxlbmd0aF9hbmRfaXNyZW5hYmxlLCAoQkNNX1BDSUVEX0lOVFJfRU5BQkxFX01BU0sgfCAoc2l6ZW9mKHVpbnQzMl90KSA8PCBCQ01fUENJRURfVFJBTlNGRVJfU0laRV9TSElGVCkpKTsKKworICAgIH0KKyNpZm5kZWYgU0lNVUxBVElPTl9CVUlMRAorICAgIGJjbXRyX2Nvbm5lY3RfaXNyKCZjdXJyZW50X2RldmljZS0+aXNyZGF0YSk7CisjZW5kaWYKKworICAgIC8qIENsZWFyIGFuZCBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzIGF0IEwyICovCisgICAgYmNtX3BjaV93cml0ZTMyKFBDSV9SRUdfQUREUkVTUyhETUFfSU5UUl9NQVNLX1NFVCksIEJDTV9QQ0lFX0FMTF9ETUFfSU5URVJSVVBUU19NQVNLKTsKKyAgICBiY21fcGNpX3dyaXRlMzIoUENJX1JFR19BRERSRVNTKERNQV9JTlRSX0NMRUFSKSwgQkNNX1BDSUVfQUxMX0RNQV9JTlRFUlJVUFRTX01BU0spOworCisgICAgLyogRW5hYmxlIEwyIGludGVycnVwdHMgYXQgTDEgKi8KKyAgICBiY21fcGNpX3dyaXRlMzIoUENJX1JFR19BRERSRVNTKERNQV9JTlRSMV9NQVNLX0NMRUFSKSwgUENJRV9MMl9JTlRSX01BU0spOworCisgICAgcmV0dXJuIEJDTVRSX1NVQ0NFU1M7Cit9CisKK2JjbW9zX2Vycm5vIGJjbXRyX3BjaWVfc2VuZCh1aW50OF90IGRldmljZSwgdWludDhfdCBjaGFubmVsLCBiY21vc19idWYgKm5ldF9idWZmKQoreworICAgIGJjbV9wY2llZF9jb21tX2RhdGEgKmN1cnJlbnRfZGV2aWNlOworICAgIGJjbV9wY2llZF90dSAgICAgICAgKmN1cnJlbnRfdHU7CisgICAgdWludDMyX3QgICAgICAgICAgICBjdXJyZW50X3R4OworICAgIHVpbnQzMl90ICAgICAgICAgICAgbmV4dF90eDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIGxlbmd0aDsKKyAgICB1aW50OF90ICAgICAgICAgICAgICpwa3RfcHRyOworI2lmZGVmIENIRUNLX1BBUkFNCisgICAgQkNNVFJfUEFSQU5PSURfQ0hFQ0soKTsKKworICAgIGlmKCFuZXRfYnVmZikKKyAgICB7CisgICAgICAgIHBjaWVfcHJpbnQoIk5ldHdvcmsgYnVmZmVyIGlzIG51bGxcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9OVUxMOworICAgIH0KKyNlbmRpZgorCisgICAgY3VycmVudF9kZXZpY2UgPSAmYmNtdHJfcGNpZV9kYXRhW2RldmljZV07CisKKyAgICBsZW5ndGggPSBiY21vc19idWZfbGVuZ3RoKG5ldF9idWZmKTsKKyAgICBpZigobGVuZ3RoID4gY3VycmVudF9kZXZpY2UtPm1heF9tdHUpIHx8IChsZW5ndGggPT0gMCkpCisgICAgeworICAgICAgICBwY2llX3ByaW50KCJQYWNrZXQgbGVuZ3RoICVkIGVycm9yIChNVFU9JWQpXG4iLCBsZW5ndGgsIGN1cnJlbnRfZGV2aWNlLT5tYXhfbXR1KTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgTE9DS19UWCgpOworCisgICAgY3VycmVudF90eCA9IGN1cnJlbnRfZGV2aWNlLT5jdXJyZW50X3R4OworCisgICAgLyogY2hlY2sgb3duZXIgaW4gdHhfb3duZXIgbGlzdCovCisgICAgaWYoYmNtX3BjaV9yZWFkMzIoJmN1cnJlbnRfZGV2aWNlLT50eF9vd25lcltjdXJyZW50X3R4XSkgIT0gTE9DQUxfT1dORVIpCisgICAgeworICAgICAgICBVTkxPQ0tfVFgoKTsKKyAgICAgICAgYmNtdHJfcGNpZV9kYXRhW2RldmljZV0udHhfcGNpZV9mdWxsX2NvdW50ZXIrKzsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUVVFVUVfRlVMTDsKKyAgICB9CisKKyAgICAvKiBEbyBub3QgZm9yZ2V0IGNoYW5nZSBvd25lciAqLworICAgIGJjbV9wY2lfd3JpdGUzMigmY3VycmVudF9kZXZpY2UtPnR4X293bmVyW2N1cnJlbnRfdHhdLCBSRU1PVEVfT1dORVIpOworCisgICAgLyogUHJlcGFyZSBzaGFkb3dfcmJkICovCisgICAgKih1aW50MzJfdCopKCZjdXJyZW50X2RldmljZS0+c2hhZG93X3JiZFtjdXJyZW50X3R4XSk9CisgICAgICAgIEJDTU9TX0VORElBTl9DUFVfVE9fTElUVExFX1UzMigodWludDMyX3QpKGxlbmd0aCB8IGNoYW5uZWwgPDwgQkNNX1BDSUVEX0JEX0NIQU5ORUxfSURfU0hJRlQgfCBMT0NBTF9PV05FUiA8PCBCQ01fUENJRURfQkRfT1dORVJTSElQX1NISUZUKSk7CisKKyAgICBjdXJyZW50X3R1ID0gJmN1cnJlbnRfZGV2aWNlLT50eF90dV9yaW5nW2N1cnJlbnRfdHhdOworCisgICAgLyogdGFrZSBkYXRhIGJ1ZmZlciBmcm9tIG5idWZmZXIgKi8KKyAgICBwa3RfcHRyID0gYmNtb3NfYnVmX2RhdGEobmV0X2J1ZmYpOworCisgICAgLyogc2V0IGRhdGFfcGQgZGVzdGluYXRpb24gZGF0YSBidWZmZXIqLworICAgIGJjbXRyX3NldF9zb3VyY2VfYnVmZmVyX2FkZHJlc3MoKHVpbnQzMl90ICopJmN1cnJlbnRfdHUtPmRhdGFfcGQsIHBrdF9wdHIpOworCisjaWZuZGVmIEhBUkRXQVJFX1RFU1QxCisgICAgLyogZmx1c2ggdGhlIGNhc2hlIGZvciB0aGUgZGF0YSBidWZmZXIgKi8KKyAgICBiY21vc19wcmVwYXJlX2Zvcl9kbWFfd3JpdGUocGt0X3B0ciwgbGVuZ3RoKTsKKyNlbmRpZgorCisgICAgLyogc2V0IGRhdGFfcGQgbGVuZ3RoX2FuZF9pc3JlbmFibGUgKG5vIG5lZWQgZW5hYmxlIGludGVycnVwdCBmb3IgZGF0YV9wZCAqLworICAgIGJjbV9wY2lfd3JpdGUzMigmY3VycmVudF90dS0+ZGF0YV9wZC5sZW5ndGhfYW5kX2lzcmVuYWJsZSwgbGVuZ3RoIDw8IEJDTV9QQ0lFRF9UUkFOU0ZFUl9TSVpFX1NISUZUKTsKKworICAgIC8qIHNldCAnbGFzdF9pbmRpY2F0b3InIGJpdCBpbnRvIGN1cnJlbnQgVFUsIHRha2VzIGNhcmUgb2Ygd3JhcHBpbmcgKi8KKyAgICBpZihjdXJyZW50X3R4ID09IGN1cnJlbnRfZGV2aWNlLT5tYXhfdHhfaW5kZXgpCisgICAgICAgIGJjbV9wY2lfd3JpdGUzMigmY3VycmVudF90dS0+cmVtb3RlX3RvX2xvY2FsX3BkLmxhc3RfbmV4dF9pbmRpY2F0b3IsIEJDTV9QQ0lFRF9MQVNUX1JFQ09SRF9NQVNLKTsKKyAgICBlbHNlCisgICAgICAgIGJjbV9wY2lfd3JpdGUzMigmY3VycmVudF90dS0+cmVtb3RlX3RvX2xvY2FsX3BkLmxhc3RfbmV4dF9pbmRpY2F0b3IsIEJDTV9QQ0lFRF9MQVNUX1JFQ09SRF9NQVNLIHwgQkNNX1BDSUVEX05FWFRfQ09OVElOT1VTX01BU0spOworCisgICAgYmNtb3NfYmFycmllcigpOworCisgICAgLyogY2xlYXIgJ2xhc3RfaW5kaWNhdG9yJyBiaXQgaW50byBwcmV2aW91c19UVSwgdGFrZXMgY2FyZSBvZiB3cmFwcGluZyAqLworICAgIGlmIChjdXJyZW50X2RldmljZS0+cHJldl90eCAhPSBjdXJyZW50X2RldmljZS0+bWF4X3R4X2luZGV4KQorICAgICAgICBiY21fcGNpX3dyaXRlMzIoJihjdXJyZW50X2RldmljZS0+dHhfdHVfcmluZ1tjdXJyZW50X2RldmljZS0+cHJldl90eF0ucmVtb3RlX3RvX2xvY2FsX3BkLmxhc3RfbmV4dF9pbmRpY2F0b3IpLCBCQ01fUENJRURfTkVYVF9DT05USU5PVVNfTUFTSyk7CisgICAgZWxzZQorICAgICAgICBiY21fcGNpX3dyaXRlMzIoJihjdXJyZW50X2RldmljZS0+dHhfdHVfcmluZ1tjdXJyZW50X2RldmljZS0+cHJldl90eF0ucmVtb3RlX3RvX2xvY2FsX3BkLmxhc3RfbmV4dF9pbmRpY2F0b3IpLCAwKTsKKworICAgIGJjbW9zX2JhcnJpZXIoKTsKKworICAgIC8qIHNldCBXQUtFIGJpdCBpbiBETUEgcmVnaXN0ZXJzICovCisgICAgYmNtX3BjaV93cml0ZTMyKFBDSV9SRUdfQUREUkVTUyhXQUtFVVBfRE1BKSwgRE1BX1RYX1dBS0VfQ1RSTF9XQUtFX01BU0spOworCisgICAgSU5DUkVNRU5UX1RSQU5TTUlURUQoZGV2aWNlKTsKKworICAgIG5leHRfdHggPSBjdXJyZW50X3R4ICsgMTsKKyAgICBpZiAobmV4dF90eCA+IGN1cnJlbnRfZGV2aWNlLT5tYXhfdHhfaW5kZXgpCisgICAgICAgIG5leHRfdHggPSAwOworCisjaWZuZGVmIEhBUkRXQVJFX1RFU1QxCisgICAgLyogcmVsZWFzZSBwcmV2aW91cyBuZXR3b3JrIGJ1ZmZlciAqLworICAgIGlmIChjdXJyZW50X2RldmljZS0+dHhfbmJ1ZmZfc2F2ZVtjdXJyZW50X3R4XSkKKyAgICB7CisgICAgICAgIHR4X2RvbmVfaGFuZGxlcihkZXZpY2UsIGN1cnJlbnRfZGV2aWNlLT50eF9uYnVmZl9zYXZlW2N1cnJlbnRfdHhdKTsKKyAgICAgICAgY3VycmVudF9kZXZpY2UtPmNvbmZfdHggPSBuZXh0X3R4OworICAgIH0KKworICAgIC8qIHN0b3JlIG5ldHdvcmsgYnVmZmVyIHBvaW50ZXIgKi8KKyAgICBjdXJyZW50X2RldmljZS0+dHhfbmJ1ZmZfc2F2ZVtjdXJyZW50X2RldmljZS0+Y3VycmVudF90eF0gPSBuZXRfYnVmZjsKKyNlbmRpZgorICAgIC8qIG1vdmUgY3VycmVudF90eCBpbmRleCAqLworICAgIGN1cnJlbnRfZGV2aWNlLT5wcmV2X3R4ID0gKGludDMyX3QpY3VycmVudF9kZXZpY2UtPmN1cnJlbnRfdHg7CisgICAgY3VycmVudF9kZXZpY2UtPmN1cnJlbnRfdHggPSBuZXh0X3R4OworCisgICAgVU5MT0NLX1RYKCk7CisgICAgcmV0dXJuIEJDTVRSX1NVQ0NFU1M7Cit9CisKKy8qKiBSZWNsYWltIGJ1ZmZlcnMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiB0cmFuc21pdHRlZAorICogXHBhcmFtW2luXSAgIGRldmljZSAgICBNYXBsZSBkZXZpY2UgaW5kZXgKKyAqIFxyZXR1cm5zOiBudW1iZXIgb2YgcmVjbGFpbWVkIFRYIGJ1ZmZlcnMgPj0gMCBvciBiY21vc19lcnJubyBlcnJvciBjb2RlIDwwCisgKi8KK2ludCBiY210cl9wY2llX3R4X2NvbGxlY3QodWludDhfdCBkZXZpY2UpCit7CisgICAgYmNtX3BjaWVkX2NvbW1fZGF0YSAqY3VycmVudF9kZXZpY2U7CisgICAgdWludDMyX3QgICAgICAgICAgICBjb25mX3R4OworICAgIGludCBuID0gMDsKKworI2lmZGVmIENIRUNLX1BBUkFNCisgICAgQkNNVFJfUEFSQU5PSURfQ0hFQ0tfVFlQRShpbnQpOworI2VuZGlmCisKKyAgICBjdXJyZW50X2RldmljZSA9ICZiY210cl9wY2llX2RhdGFbZGV2aWNlXTsKKworICAgIExPQ0tfVFgoKTsKKworICAgIGNvbmZfdHggPSBjdXJyZW50X2RldmljZS0+Y29uZl90eDsKKyAgICB3aGlsZSAoYmNtX3BjaV9yZWFkMzIoJmN1cnJlbnRfZGV2aWNlLT50eF9vd25lcltjb25mX3R4XSkgPT0gTE9DQUxfT1dORVIgJiYKKyAgICAgICAgICAgY3VycmVudF9kZXZpY2UtPnR4X25idWZmX3NhdmVbY29uZl90eF0pCisgICAgeworICAgICAgICArK247CisKKyAgICAgICAgLyogcmVsZWFzZSBwcmV2aW91cyBuZXR3b3JrIGJ1ZmZlciAqLworICAgICAgICB0eF9kb25lX2hhbmRsZXIoZGV2aWNlLCBjdXJyZW50X2RldmljZS0+dHhfbmJ1ZmZfc2F2ZVtjb25mX3R4XSk7CisgICAgICAgIGN1cnJlbnRfZGV2aWNlLT50eF9uYnVmZl9zYXZlW2NvbmZfdHhdID0gTlVMTDsKKworICAgICAgICBjb25mX3R4Kys7CisgICAgICAgIGlmIChjb25mX3R4ID4gY3VycmVudF9kZXZpY2UtPm1heF90eF9pbmRleCkKKyAgICAgICAgICAgIGNvbmZfdHggPSAwOworICAgIH0KKyAgICBjdXJyZW50X2RldmljZS0+Y29uZl90eCA9IGNvbmZfdHg7CisKKyAgICBVTkxPQ0tfVFgoKTsKKworICAgIHJldHVybiBuOworfQorCisvKgorICAgIFJlY2VpdmUgYSBkYXRhIHBhY2tldAorICAgIHJldHVybnMgY2hhbm5lbCBhbmQgcG9pbnRlciB0byBuZXR3b3JrIGJ1ZmZlciBjb250YWluaW5nIHRoZSBkYXRhCisqLworYmNtb3NfZXJybm8gYmNtdHJfcGNpZV9yZWNlaXZlKHVpbnQ4X3QgZGV2aWNlLCB1aW50OF90ICpjaGFubmVsLCBiY21vc19idWYgKipidWYpCit7CisgICAgYmNtX3BjaWVkX2NvbW1fZGF0YSAqY3VycmVudF9kZXZpY2U7CisgICAgYmNtX3BjaWVkX3R1ICAgICAgICAqY3VycmVudF90dTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIGJkX2luZm87CisgICAgdWludDMyX3QgICAgICAgICAgICBsZW5ndGg7CisgICAgdWludDMyX3QgICAgICAgICAgICBjdXJyZW50X3J4OworCisjaWZuZGVmIEhBUkRXQVJFX1RFU1QxCisgICAgYmNtb3NfYnVmICAgICAgICAgICAqbmV0X3B0ciA9IE5VTEw7CisgICAgdWludDhfdCAgICAgICAgICAgICAqcGt0X3B0ciA9IE5VTEw7CisjZW5kaWYKKworI2lmZGVmIENIRUNLX1BBUkFNCisgICAgQkNNVFJfUEFSQU5PSURfQ0hFQ0tfRVhUKCk7CisgICAgaWYgKCFjaGFubmVsIHx8ICFidWYpCisgICAgICAgIHJldHVybiBCQ01fRVJSX05VTEw7CisjZW5kaWYKKyAgICAqYnVmID0gTlVMTDsKKworICAgIGN1cnJlbnRfZGV2aWNlID0gJmJjbXRyX3BjaWVfZGF0YVtkZXZpY2VdOworCisgICAgY3VycmVudF9yeCA9IGN1cnJlbnRfZGV2aWNlLT5jdXJyZW50X3J4OworICAgIGN1cnJlbnRfdHUgPSAmY3VycmVudF9kZXZpY2UtPnJ4X3R1X3JpbmdbY3VycmVudF9yeF07CisKKyAgICAvKiBSZWFkIGxvY2FsX2JkIHRvIGxvY2FsIHZhcmlhYmxlICovCisgICAgYmRfaW5mbyA9IEJDTU9TX0VORElBTl9MSVRUTEVfVE9fQ1BVX1UzMigqKHVpbnQzMl90KikoJmN1cnJlbnRfZGV2aWNlLT5sb2NhbF9iZFtjdXJyZW50X3J4XSkpOworCisgICAgLyogY2hlY2sgb3duZXIgaW4gbG9jYWxfYmQsIGl0IGlzIHVwZGF0ZWQgYnkgdGhlIHBlZXIgKi8KKyAgICBpZiAoKGJkX2luZm8gJiBCQ01fUENJRURfQkRfT1dORVJTSElQX01BU0spID4+IEJDTV9QQ0lFRF9CRF9PV05FUlNISVBfU0hJRlQgIT0gTE9DQUxfT1dORVIpCisgICAgeworICAgICAgICBiY210cl9wY2llX2RhdGFbZGV2aWNlXS5yeF9wY2llX2VtcHR5X2NvdW50ZXIrKzsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUVVFVUVfRU1QVFk7CisgICAgfQorCisgICAgLyogY2hhbmdlIHRoZSBvd25lciBpbiBsb2NhbF9iZCB0byB0aGUgcmVtb3RlIHNpZGUgKi8KKyAgICAqKHVpbnQzMl90KikoJmN1cnJlbnRfZGV2aWNlLT5sb2NhbF9iZFtjdXJyZW50X3J4XSk9CisgICAgICAgIEJDTU9TX0VORElBTl9DUFVfVE9fTElUVExFX1UzMigodWludDMyX3QpKChSRU1PVEVfT1dORVIgPDwgQkNNX1BDSUVEX0JEX09XTkVSU0hJUF9TSElGVCkgfCBiZF9pbmZvKSk7CisKKyAgICAvKiB0YWtlIHRoZSAgcGFja2V0IGxlbmd0aCBmcm9tIGxvY2FsX2JkICovCisgICAgbGVuZ3RoID0gYmRfaW5mbyAmIEJDTV9QQ0lFRF9CRF9QS1RfTEVOR1RIX01BU0s7CisKKyAgICBpZiAoKGxlbmd0aCA9PSAwKSB8fCAobGVuZ3RoID4gY3VycmVudF9kZXZpY2UtPm1heF9tdHUpKQorICAgIHsKKyAgICAgICAgcGNpZV9wcmludCgiUGFja2V0IGxlbmd0aCBlcnJvciA6ICVkXG4iLCBsZW5ndGgpOworCisgICAgICAgIC8qIHVwZGF0ZSByZW1vdGUgc2lkZSAqLworICAgICAgICBiY21fcGNpX3dyaXRlMzIoJmN1cnJlbnRfZGV2aWNlLT5wZWVyX3R4X293bmVyW2N1cnJlbnRfcnhdLCBMT0NBTF9PV05FUik7CisKKyAgICAgICAgLyogbW92ZSBjdXJyZW50IHJ4ICovCisgICAgICAgIE5FWFRfSU5ERVgoY3VycmVudF9kZXZpY2UtPm1heF9yeF9pbmRleCwgY3VycmVudF9kZXZpY2UtPmN1cnJlbnRfcngpOworCisgICAgICAgIHJldHVybiBCQ01fRVJSX01TR19FUlJPUjsKKyAgICB9CisKKyAgICAvKiB1cGRhdGUgcGFja2V0IGNoYW5uZWwgaWQgKi8KKyAgICAqY2hhbm5lbCA9IChiZF9pbmZvICYgQkNNX1BDSUVEX0JEX0NIQU5ORUxfSURfTUFTSykgPj4gQkNNX1BDSUVEX0JEX0NIQU5ORUxfSURfU0hJRlQ7CisKKyNpZm5kZWYgSEFSRFdBUkVfVEVTVDEKKyAgICAvKiBhbGxvY2F0ZSBuZXcgYnVmZmVyIHRvIHJlY2VpdmUgcGFja2V0ICovCisgICAgbmV0X3B0ciA9IGJjbW9zX2J1Zl9hbGxvYyhjdXJyZW50X2RldmljZS0+bWF4X210dSk7CisKKyAgICAvKiBJZiBub3Qgc3VjY2Vzc2VzIGRvIGNsZWFuLXVwICovCisgICAgaWYgKCFuZXRfcHRyKQorICAgIHsKKyAgICAgICAgLyogdXBkYXRlIHJlbW90ZSBzaWRlICovCisgICAgICAgIGJjbV9wY2lfd3JpdGUzMigmY3VycmVudF9kZXZpY2UtPnBlZXJfdHhfb3duZXJbY3VycmVudF9yeF0sIExPQ0FMX09XTkVSKTsKKworICAgICAgICAvKiBtb3ZlIGN1cnJlbnQgcnggKi8KKyAgICAgICAgTkVYVF9JTkRFWChjdXJyZW50X2RldmljZS0+bWF4X3J4X2luZGV4LCBjdXJyZW50X2RldmljZS0+Y3VycmVudF9yeCk7CisKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorI2VuZGlmCisgICAgLyogdGFrZSB0aGUgZGF0YSBwb2ludGVyICovCisgICAgKmJ1ZiA9IGN1cnJlbnRfZGV2aWNlLT5yeF9uYnVmZl9zYXZlW2N1cnJlbnRfcnhdOworCisgICAgLyogaW52YWxpZGF0ZSByZWNlaXZlZCBuZXR3b3JrIGJ1ZmZlciBmb3IgY2FjaGUgKi8KKyAgICBiY21vc19wcmVwYXJlX2Zvcl9kbWFfcmVhZChiY21vc19idWZfZGF0YSgqYnVmKSwgbGVuZ3RoKTsKKworICAgIC8qIGZpbGwgbmV0d29yayBidWZmZXIgKi8KKyAgICBiY21vc19idWZfbGVuZ3RoX3NldCgqYnVmLCBsZW5ndGgpOworCisgICAgLyogdXBkYXRlIHN0YXRpc3RpY3MgKi8KKyAgICBJTkNSRU1FTlRfUkVDRUlWRUQoZGV2aWNlKTsKKworI2lmbmRlZiBIQVJEV0FSRV9URVNUMQorICAgIHBrdF9wdHIgPSBiY21vc19idWZfZGF0YShuZXRfcHRyKTsKKworICAgIC8qIGludmFsaWRhdGUgbmV0d29yayBidWZmZXIgZm9yIGNhY2hlICovCisgICAgYmNtb3NfcHJlcGFyZV9mb3JfZG1hX3JlYWQocGt0X3B0ciwgY3VycmVudF9kZXZpY2UtPm1heF9tdHUpOworCisgICAgLyogdXBkYXRlIHJ4IG5ldHdvcmsgYnVmZmVyIHdpdGggdGhlIG5ldyBwYWNrZXQgKi8KKyAgICBjdXJyZW50X2RldmljZS0+cnhfbmJ1ZmZfc2F2ZVtjdXJyZW50X3J4XSA9IG5ldF9wdHI7CisKKyAgICAvKiBzZXQgZGF0YV9wZCBkZXN0aW5hdGlvbiBkYXRhIGJ1ZmZlciovCisgICAgYmNtdHJfc2V0X2Rlc3RfYnVmZmVyX2FkZHJlc3MoKHVpbnQzMl90ICopJmN1cnJlbnRfdHUtPmRhdGFfcGQsIHBrdF9wdHIpOworI2VuZGlmCisgICAgLyogdXBkYXRlIHJlbW90ZSBzaWRlICovCisgICAgYmNtX3BjaV93cml0ZTMyKCZjdXJyZW50X2RldmljZS0+cGVlcl90eF9vd25lcltjdXJyZW50X3J4XSwgTE9DQUxfT1dORVIpOworCisgICAgLyogbW92ZSBjdXJyZW50IHJ4ICovCisgICAgTkVYVF9JTkRFWChjdXJyZW50X2RldmljZS0+bWF4X3J4X2luZGV4LCBjdXJyZW50X2RldmljZS0+Y3VycmVudF9yeCk7CisKKyAgICByZXR1cm4gQkNNVFJfU1VDQ0VTUzsKK30KKworLyogZW5hYmxlIGxldmVsIDIgUlggaW50ZXJydXB0cyAqLworYmNtb3NfZXJybm8gYmNtdHJfcGNpZV9yeGludF9lbmFibGUodWludDhfdCBkZXZpY2UpCit7CisjaWZkZWYgQ0hFQ0tfUEFSQU0KKyAgICBCQ01UUl9QQVJBTk9JRF9DSEVDS19FWFQoKTsKKyNlbmRpZgorICAgIGJjbV9wY2lfd3JpdGUzMihQQ0lfUkVHX0FERFJFU1MoRE1BX0lOVFJfTUFTS19DTEVBUiksIERNQV9SWF9FUlJPUl9NQVNLIHwgRE1BX1JYX0RPTkVfTUFTSyk7CisKKyAgICByZXR1cm4gQkNNVFJfU1VDQ0VTUzsKK30KKworLyogZGlzYWJsZSBsZXZlbCAyIFJYIGludGVycnVwdHMgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX3BjaWVfcnhpbnRfZGlzYWJsZSh1aW50OF90IGRldmljZSkKK3sKKyNpZmRlZiBDSEVDS19QQVJBTQorICAgIEJDTVRSX1BBUkFOT0lEX0NIRUNLX0VYVCgpOworI2VuZGlmCisgICAgYmNtX3BjaV93cml0ZTMyKFBDSV9SRUdfQUREUkVTUyhETUFfSU5UUl9NQVNLX1NFVCksIERNQV9SWF9FUlJPUl9NQVNLIHwgRE1BX1JYX0RPTkVfTUFTSyk7CisKKyAgICByZXR1cm4gQkNNVFJfU1VDQ0VTUzsKK30KKworYmNtb3NfZXJybm8gYmNtdHJfcGNpZV9yeGludF9jbGVhcih1aW50OF90IGRldmljZSkKK3sKKyNpZmRlZiBDSEVDS19QQVJBTQorICAgIEJDTVRSX1BBUkFOT0lEX0NIRUNLX0VYVCgpOworI2VuZGlmCisgICAgYmNtX3BjaV93cml0ZTMyKFBDSV9SRUdfQUREUkVTUyhETUFfSU5UUl9DTEVBUiksIERNQV9SWF9FUlJPUl9NQVNLIHwgRE1BX1JYX0RPTkVfTUFTSyk7CisKKyAgICByZXR1cm4gQkNNVFJfU1VDQ0VTUzsKK30KKworLyogRW5hYmxlIExldmVsIDIgIlRYIGhhbmRsZWQiIGludGVycnVwdCAqLworYmNtb3NfZXJybm8gYmNtdHJfcGNpZV90eGludF9lbmFibGUodWludDhfdCBkZXZpY2UpCit7CisjaWZkZWYgQ0hFQ0tfUEFSQU0KKyAgICBCQ01UUl9QQVJBTk9JRF9DSEVDS19FWFQoKTsKKyNlbmRpZgorICAgIGJjbV9wY2lfd3JpdGUzMihQQ0lfUkVHX0FERFJFU1MoRE1BX0lOVFJfTUFTS19DTEVBUiksIERNQV9UWF9FUlJPUl9NQVNLIHwgRE1BX1RYX0RPTkVfTUFTSyk7CisKKyAgICByZXR1cm4gQkNNVFJfU1VDQ0VTUzsKK30KKworLyogRGlzYWJsZSBsZXZlbCAyICJUWCBoYW5kbGVkIiBpbnRlcnJ1cHQgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX3BjaWVfdHhpbnRfZGlzYWJsZSh1aW50OF90IGRldmljZSkKK3sKKyNpZmRlZiBDSEVDS19QQVJBTQorICAgIEJDTVRSX1BBUkFOT0lEX0NIRUNLX0VYVCgpOworI2VuZGlmCisgICAgYmNtX3BjaV93cml0ZTMyKFBDSV9SRUdfQUREUkVTUyhETUFfSU5UUl9NQVNLX1NFVCksIERNQV9UWF9FUlJPUl9NQVNLIHwgRE1BX1RYX0RPTkVfTUFTSyk7CisKKyAgICByZXR1cm4gQkNNVFJfU1VDQ0VTUzsKK30KKworLyogQ2xlYXIgbGV2ZWwgMiAiVFggaGFuZGxlZCIgaW50ZXJydXB0ICovCitiY21vc19lcnJubyBiY210cl9wY2llX3R4aW50X2NsZWFyKHVpbnQ4X3QgZGV2aWNlKQoreworI2lmZGVmIENIRUNLX1BBUkFNCisgICAgQkNNVFJfUEFSQU5PSURfQ0hFQ0tfRVhUKCk7CisjZW5kaWYKKyAgICBiY21fcGNpX3dyaXRlMzIoUENJX1JFR19BRERSRVNTKERNQV9JTlRSX0NMRUFSKSwgRE1BX1RYX0VSUk9SX01BU0sgfCBETUFfVFhfRE9ORV9NQVNLKTsKKworICAgIHJldHVybiBCQ01UUl9TVUNDRVNTOworfQorCitiY21vc19lcnJubyBiY210cl9wY2llX2Rpc2Nvbm5lY3QodWludDhfdCBkZXZpY2UpCit7CisgICAgQkNNVFJfUEFSQU5PSURfQ0hFQ0tfRVhUKCk7CisKKyAgICBzdG9wX2RtYShkZXZpY2UpOworCisgICAgLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCisgICAgYmNtdHJfcGNpZV9yeGludF9kaXNhYmxlKGRldmljZSk7CisgICAgYmNtdHJfcGNpZV90eGludF9kaXNhYmxlKGRldmljZSk7CisKKyAgICAvKiBjbGVhciBETUEgaW50ZXJydXB0cyAqLworICAgIGJjbXRyX3BjaWVfcnhpbnRfY2xlYXIoZGV2aWNlKTsKKyAgICBiY210cl9wY2llX3R4aW50X2NsZWFyKGRldmljZSk7CisKKyAgICAvKiBEaXNhYmxlIGluIEwxIGNvbnRyb2xsZXIgKi8KKyAgICBiY21fcGNpX3dyaXRlMzIoUENJX1JFR19BRERSRVNTKERNQV9JTlRSMV9NQVNLX1NFVCksIFBDSUVfTDJfSU5UUl9NQVNLKTsKKworICAgIC8qIGZyZWUgaXJxIC0gb24gaG9zdCAoaWYgaXQgaXMgc2hhcmVkKSBtdXN0IG5vdCBmcmVlIGl0ICovCisgICAgYmNtdHJfcGNpZV9mcmVlX2lycShiY210cl9wY2llX2RhdGFbZGV2aWNlXS5pc3JkYXRhLnJ4X2lycSwgJmJjbXRyX3BjaWVfZGF0YVtkZXZpY2VdLmlzcmRhdGEpOworCisgICAgZnJlZV9idWZmZXJzKGRldmljZSwgIlBDSUUgZGlzY29ubmVjdGVkXG4iKTsKKworICAgIHJldHVybiBCQ01UUl9TVUNDRVNTOworfQorCitiY21vc19lcnJubyBiY210cl9wY2llX3J4X2lycV9jYmxrX3JlZ2lzdGVyKGZfYmNtdHJfaW50IHJ4X2lzcl9jbGJrKQoreworICAgIGJjbXRyX3BjaWVfcnhfaXJxX2hhbmRsZXIgPSByeF9pc3JfY2xiazsKKworICAgIHJldHVybiBCQ01UUl9TVUNDRVNTOworfQorCitiY21vc19lcnJubyBiY210cl9wY2llX3J4X2lycV9jYmxrX3VucmVnaXN0ZXIodm9pZCkKK3sKKyAgICBiY210cl9wY2llX3J4X2lycV9oYW5kbGVyID0gTlVMTDsKKworICAgIHJldHVybiBCQ01UUl9TVUNDRVNTOworfQorCitiY21vc19lcnJubyBiY210cl9wY2llX3R4X2lycV9jYmxrX3JlZ2lzdGVyKGZfYmNtdHJfaW50IHJ4X2lzcl9jbGJrKQoreworICAgIGJjbXRyX3BjaWVfdHhfaXJxX2hhbmRsZXIgPSByeF9pc3JfY2xiazsKKworICAgIHJldHVybiBCQ01UUl9TVUNDRVNTOworfQorCitiY21vc19lcnJubyBiY210cl9wY2llX3R4X2lycV9jYmxrX3VucmVnaXN0ZXIodm9pZCkKK3sKKyAgICBiY210cl9wY2llX3R4X2lycV9oYW5kbGVyID0gTlVMTDsKKworICAgIHJldHVybiBCQ01UUl9TVUNDRVNTOworfQorCitiY21vc19lcnJubyBiY210cl9wY2llX3R4X2RvbmVfY2Jsa19yZWdpc3RlcihmX2JjbXRyX2RvbmUgdHhfZG9uZV9jYikKK3sKKyAgICB0eF9kb25lX2hhbmRsZXIgPSB0eF9kb25lX2NiOworCisgICAgcmV0dXJuIEJDTVRSX1NVQ0NFU1M7Cit9CisKK2JjbW9zX2Vycm5vIGJjbXRyX3BjaWVfdHhfZG9uZV9jYmxrX3VucmVnaXN0ZXIodm9pZCkKK3sKKyAgICB0eF9kb25lX2hhbmRsZXIgPSBkZWZhdWx0X3R4X2RvbmVfY2FsbGJhY2s7CisKKyAgICByZXR1cm4gQkNNVFJfU1VDQ0VTUzsKK30KKwordm9pZCBiY210cl9wY2llX2V4aXQodm9pZCkKK3sKKyAgICB1aW50MzJfdCBpOworCisgICAgaWYgKGJjbXRyX3BjaWVfZGF0YSkKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBiY210cl9tYXhfZGV2aWNlc19udW1iZXI7IGkgKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbXRyX3BjaWVfZGlzY29ubmVjdChpKTsKKyAgICAgICAgfQorICAgICAgICBiY21vc19mcmVlKGJjbXRyX3BjaWVfZGF0YSk7CisgICAgfQorICAgIGJjbXRyX3BjaWVfZGF0YSA9IE5VTEw7Cit9CisKK2JjbW9zX2Vycm5vIGJjbXRyX3BjaWVfZ2V0X3N0YXRpc3RpY3ModWludDhfdCBkZXZpY2UsIHVpbnQzMl90IGNsZWFyLCBiY21fcGNpZWRfc3RhdCAqc3RhdCkKK3sKKyAgICBiY21fcGNpZWRfY29tbV9kYXRhICpjdXJyZW50X2RldmljZSA9ICZiY210cl9wY2llX2RhdGFbZGV2aWNlXTsKKworICAgIEJDTVRSX1BBUkFOT0lEX0NIRUNLKCk7CisKKyAgIGlmICghc3RhdCkKKyAgICAgICByZXR1cm4gQkNNX0VSUl9OVUxMOworCisgICAgc3RhdC0+cnhfY291bnRlciAgICA9IGN1cnJlbnRfZGV2aWNlLT5yeF9jb3VudGVyOworICAgIHN0YXQtPnR4X2NvdW50ZXIgICAgPSBjdXJyZW50X2RldmljZS0+dHhfY291bnRlcjsKKyAgICBzdGF0LT5yeF9kb25lX2lzcl9jb3VudGVyICAgPSBjdXJyZW50X2RldmljZS0+aXNyZGF0YS5yeF9kb25lX251bTsKKyAgICBzdGF0LT5yeF9lcnJfaXNyX2NvdW50ZXIgICA9IGN1cnJlbnRfZGV2aWNlLT5pc3JkYXRhLnJ4X2Vycl9udW07CisgICAgc3RhdC0+dHhfZG9uZV9pc3JfY291bnRlciAgID0gY3VycmVudF9kZXZpY2UtPmlzcmRhdGEudHhfZG9uZV9udW07CisgICAgc3RhdC0+dHhfZXJyX2lzcl9jb3VudGVyICAgPSBjdXJyZW50X2RldmljZS0+aXNyZGF0YS50eF9lcnJfbnVtOworICAgIHN0YXQtPnJ4X3BjaWVfZW1wdHlfY291bnRlciAgPSBjdXJyZW50X2RldmljZS0+cnhfcGNpZV9lbXB0eV9jb3VudGVyOworICAgIHN0YXQtPnR4X3BjaWVfZnVsbF9jb3VudGVyICA9IGN1cnJlbnRfZGV2aWNlLT50eF9wY2llX2Z1bGxfY291bnRlcjsKKyAgICBpZiAoY2xlYXIpCisgICAgeworICAgICAgICBjdXJyZW50X2RldmljZS0+cnhfY291bnRlciAgICAgICA9IDA7CisgICAgICAgIGN1cnJlbnRfZGV2aWNlLT50eF9jb3VudGVyICAgICAgID0gMDsKKyAgICAgICAgY3VycmVudF9kZXZpY2UtPmlzcmRhdGEucnhfZG9uZV9udW0gPSAwOworICAgICAgICBjdXJyZW50X2RldmljZS0+aXNyZGF0YS5yeF9lcnJfbnVtICA9IDA7CisgICAgICAgIGN1cnJlbnRfZGV2aWNlLT5pc3JkYXRhLnR4X2RvbmVfbnVtID0gMDsKKyAgICAgICAgY3VycmVudF9kZXZpY2UtPmlzcmRhdGEudHhfZXJyX251bSAgPSAwOworICAgICAgICBjdXJyZW50X2RldmljZS0+cnhfcGNpZV9lbXB0eV9jb3VudGVyID0gMDsKKyAgICAgICAgY3VycmVudF9kZXZpY2UtPnR4X3BjaWVfZnVsbF9jb3VudGVyID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNVFJfU1VDQ0VTUzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiB1c2VkIGJ5IGR1bXAgcHJvY2VkdXJlcyAtIG1heSB3cml0ZSB0byBzdGQgb3V0cHV0IG9yIHVzZXIgYnVmZmVyICovCisjZGVmaW5lIHBjaWVfYnByaW50KGJ1ZmZlciwgZm10LCBhcmdzLi4uKSAgXAorICAgIHtcCisgICAgICBpZiAoIWJ1ZmZlcilcCisgICAgICAgIHBjaWVfcHJpbnQoZm10LCAjI2FyZ3MpO1wKKyAgICAgIGVsc2VcCisgICAgICAgIHNwcmludGYoYnVmZmVyLCBmbXQsICMjYXJncyk7XAorICAgIH0KKworc3RhdGljIGlubGluZSB2b2lkIGR1bXBfYmQoY2hhciAqb3V0cHV0LCBjaGFyICp0aXRsZSwgdWludDMyX3QgYmQpCit7CisgICAgdWludDMyX3Qgb3duZXIsIGNobiwgbGVuZ3RoOworCisgICAgb3duZXIgPSAoYmQgJiBCQ01fUENJRURfQkRfT1dORVJTSElQX01BU0spID4+IEJDTV9QQ0lFRF9CRF9PV05FUlNISVBfU0hJRlQ7CisgICAgY2huID0gKGJkICYgQkNNX1BDSUVEX0JEX0NIQU5ORUxfSURfTUFTSykgPj4gQkNNX1BDSUVEX0JEX0NIQU5ORUxfSURfU0hJRlQ7CisgICAgbGVuZ3RoID0gYmQgJiBCQ01fUENJRURfQkRfUEtUX0xFTkdUSF9NQVNLOworCisgICAgcGNpZV9icHJpbnQob3V0cHV0LCAiXHQlczogKDB4JTA4eCkgb3duZXIgPSAlcyBjaGFubmVsID0gMHgleCglZCkgbGVuZ3RoID0gMHgleCglZClcbiIsCisgICAgICAgIHRpdGxlLCAodW5zaWduZWQgaW50KWJkLCBvd25lciA9PSAwID8gImxvY2FsIiA6ICJwZWVyIiwgKHVuc2lnbmVkIGludCljaG4sIGNobiwgKHVuc2lnbmVkIGludClsZW5ndGgsIGxlbmd0aCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX293bmVyKGNoYXIgKm91dHB1dCwgY2hhciAqdGl0bGUsIHVpbnQzMl90ICpjdXJyZW50X2VudHJ5KQoreworICAgIHVpbnQzMl90IG93bmVyLCBlbnRyeTsKKworICAgIGVudHJ5ID0gYmNtX3BjaV9yZWFkMzIoY3VycmVudF9lbnRyeSk7CisgICAgb3duZXIgPSAoZW50cnkgJiBCQ01fUENJRURfQkRfT1dORVJTSElQX01BU0spID4+IEJDTV9QQ0lFRF9CRF9PV05FUlNISVBfU0hJRlQ7CisgICAgcGNpZV9icHJpbnQob3V0cHV0LCAiXHQlczogb3duZXIgPSAlc1xuIiwgdGl0bGUsIG93bmVyID09IDAgPyAibG9jYWwiIDogInBlZXIiKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGR1bXBfcGQoY2hhciAqb3V0cHV0LCBiY21fcGNpZWRfcGQgKmN1cnJlbnRfcGQpCit7CisgICAgdWludDMyX3QgZGRybCxkZHJoLHBrdGwscGt0aCxsZW4sbGFzdCxuZXh0bCxuZXh0aDsKKworICAgIGRkcmwgID0gYmNtX3BjaV9yZWFkMzIoKHVpbnQzMl90ICopJmN1cnJlbnRfcGQtPmRkcl9idWZmX2FkZHJlc3NfbG93KTsKKyAgICBwa3RsICA9IGJjbV9wY2lfcmVhZDMyKCh1aW50MzJfdCAqKSZjdXJyZW50X3BkLT5wY2llX3BrdF9hZGRyZXNzX2xvdyk7CisgICAgcGt0aCAgPSBiY21fcGNpX3JlYWQzMigodWludDMyX3QgKikmY3VycmVudF9wZC0+cGNpZV9wa3RfYWRkcmVzc19oaWdoKTsKKyAgICBsZW4gICA9IGJjbV9wY2lfcmVhZDMyKCh1aW50MzJfdCAqKSZjdXJyZW50X3BkLT5sZW5ndGhfYW5kX2lzcmVuYWJsZSk7CisgICAgbGFzdCAgPSBiY21fcGNpX3JlYWQzMigodWludDMyX3QgKikmY3VycmVudF9wZC0+bGFzdF9uZXh0X2luZGljYXRvcik7CisgICAgbmV4dGwgPSBiY21fcGNpX3JlYWQzMigodWludDMyX3QgKikmY3VycmVudF9wZC0+bmV4dF9wZF9hZGRyZXNzX2xvdyk7CisgICAgbmV4dGggPSBiY21fcGNpX3JlYWQzMigodWludDMyX3QgKikmY3VycmVudF9wZC0+bmV4dF9wZF9hZGRyZXNzX2hpZ2gpOworICAgIGRkcmggID0gYmNtX3BjaV9yZWFkMzIoKHVpbnQzMl90ICopJmN1cnJlbnRfcGQtPmRkcl9idWZmX2FkZHJlc3NfaGlnaCk7CisKKyAgICBwY2llX2JwcmludChvdXRwdXQsCisgICAgICAgICAgICAgICAgIlx0XHQlLTIwcyA9IDB4JTA4eFxuIgorICAgICAgICAgICAgICAgICJcdFx0JS0yMHMgPSAweCUwOHhcbiIKKyAgICAgICAgICAgICAgICAiXHRcdCUtMjBzID0gMHglMDh4XG4iCisgICAgICAgICAgICAgICAgIlx0XHQlLTIwcyA9IDB4JTA4eFxuIgorICAgICAgICAgICAgICAgICJcdFx0JS0yMHMgPSAweCUwOHhcbiIKKyAgICAgICAgICAgICAgICAiXHRcdCUtMjBzID0gMHglMDh4XG4iCisgICAgICAgICAgICAgICAgIlx0XHQlLTIwcyA9IDB4JTA4eFxuIgorICAgICAgICAgICAgICAgICJcdFx0JS0yMHMgPSAweCUwOHhcbiIsCisgICAgICAgICAgICAgICAgImRkcl9sb3ciLCBkZHJsLAorICAgICAgICAgICAgICAgICJwa3RfbG93IiwgcGt0bCwKKyAgICAgICAgICAgICAgICAicGt0X2hpZ2giLCBwa3RoLAorICAgICAgICAgICAgICAgICJsZW5ndGhfYW5kX2lzcmVuYWJsZSIsIGxlbiwKKyAgICAgICAgICAgICAgICAibGFzdF9uZXh0X2luZGljYXRvciIsIGxhc3QsCisgICAgICAgICAgICAgICAgIm5leHRfbG93IiwgbmV4dGwsCisgICAgICAgICAgICAgICAgIm5leHRfaGlnaCIsIG5leHRoLAorICAgICAgICAgICAgICAgICJkZHJfaGlnaCIsIGRkcmgpOworfQorCisKK3N0YXRpYyBpbnQzMl90IGR1bXBfb25lX3R4KGNoYXIgKm91dHB1dCwgdWludDhfdCBkZXZpY2UsIHVpbnQzMl90IGN1cnJlbnRfaW5kZXgpCit7CisgICAgYmNtX3BjaWVkX3R1ICAgICAgICAqY3VycmVudF90dTsKKyAgICBiY21fcGNpZWRfY29tbV9kYXRhICpjdXJyZW50X2RldmljZTsKKyAgICBjaGFyICAgICAgICAgICAgICAgICpidWZmZXIgPSBvdXRwdXQ7CisKKyAgICBjdXJyZW50X2RldmljZSA9ICZiY210cl9wY2llX2RhdGFbZGV2aWNlXTsKKyAgICBjdXJyZW50X3R1ID0gJmN1cnJlbnRfZGV2aWNlLT50eF90dV9yaW5nW2N1cnJlbnRfaW5kZXhdOworICAgIGR1bXBfYmQoYnVmZmVyLCAiU0JEIiwgQkNNT1NfRU5ESUFOX0xJVFRMRV9UT19DUFVfVTMyKCoodWludDMyX3QqKSZjdXJyZW50X2RldmljZS0+c2hhZG93X3JiZFtjdXJyZW50X2luZGV4XSkpOworICAgIGlmIChidWZmZXIpCisgICAgICAgIGJ1ZmZlciArPSBzdHJsZW4oYnVmZmVyKTsKKworICAgIGR1bXBfb3duZXIoYnVmZmVyLCAidHhfb3duZXIiLCAmY3VycmVudF9kZXZpY2UtPnR4X293bmVyW2N1cnJlbnRfaW5kZXhdKTsKKyAgICBpZiAoYnVmZmVyKQorICAgICAgICBidWZmZXIgKz0gc3RybGVuKGJ1ZmZlcik7CisKKyAgICBwY2llX2JwcmludChidWZmZXIsICJcdFBEIGRhdGEgPSAweCVseFxuIiwgKHVuc2lnbmVkIGxvbmcpJmN1cnJlbnRfdHUtPmRhdGFfcGQpOworICAgIGlmIChidWZmZXIpCisgICAgICAgIGJ1ZmZlciArPSBzdHJsZW4oYnVmZmVyKTsKKworICAgIGR1bXBfcGQoYnVmZmVyLCAmY3VycmVudF90dS0+ZGF0YV9wZCk7CisgICAgaWYgKGJ1ZmZlcikKKyAgICAgICAgYnVmZmVyICs9IHN0cmxlbihidWZmZXIpOworCisgICAgcGNpZV9icHJpbnQoYnVmZmVyLCAiXHRQRCBzaGFkb3dfcmJkID0gMHglbHhcbiIsICh1bnNpZ25lZCBsb25nKSZjdXJyZW50X3R1LT5yZW1vdGVfdG9fbG9jYWxfcGQpOworICAgIGlmIChidWZmZXIpCisgICAgICAgIGJ1ZmZlciArPSBzdHJsZW4oYnVmZmVyKTsKKworICAgIGR1bXBfcGQoYnVmZmVyLCAmY3VycmVudF90dS0+cmVtb3RlX3RvX2xvY2FsX3BkKTsKKyAgICBpZiAoYnVmZmVyKQorICAgICAgICBidWZmZXIgKz0gc3RybGVuKGJ1ZmZlcik7CisKKyAgICBwY2llX2JwcmludChidWZmZXIsICJcdFRYIG5ldGJ1ZmYgPSAweCVseFxuIiwodW5zaWduZWQgbG9uZyljdXJyZW50X2RldmljZS0+dHhfbmJ1ZmZfc2F2ZVtjdXJyZW50X2luZGV4XSk7CisKKyAgICBpZiAob3V0cHV0KQorICAgICAgICByZXR1cm4gc3RybGVuKG91dHB1dCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludDMyX3QgZHVtcF9vbmVfcngoY2hhciAqb3V0cHV0LCB1aW50OF90IGRldmljZSwgdWludDMyX3QgY3VycmVudF9pbmRleCkKK3sKKyAgICBiY21fcGNpZWRfdHUgICAgICAgICpjdXJyZW50X3R1OworICAgIGJjbV9wY2llZF9jb21tX2RhdGEgKmN1cnJlbnRfZGV2aWNlOworICAgIGNoYXIgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IG91dHB1dDsKKworICAgIGN1cnJlbnRfZGV2aWNlID0gJmJjbXRyX3BjaWVfZGF0YVtkZXZpY2VdOworICAgIGN1cnJlbnRfdHUgPSAmY3VycmVudF9kZXZpY2UtPnJ4X3R1X3JpbmdbY3VycmVudF9pbmRleF07CisKKyAgICBkdW1wX2JkKGJ1ZmZlciwgIkJEIiwgQkNNT1NfRU5ESUFOX0xJVFRMRV9UT19DUFVfVTMyKCoodWludDMyX3QqKSZjdXJyZW50X2RldmljZS0+bG9jYWxfYmRbY3VycmVudF9pbmRleF0pKTsKKyAgICBpZiAoYnVmZmVyKQorICAgICAgICBidWZmZXIgKz0gc3RybGVuKGJ1ZmZlcik7CisKKyAgICBkdW1wX293bmVyKGJ1ZmZlciwgInBlZXJfdHhfb3duZXIiLCAmY3VycmVudF9kZXZpY2UtPnBlZXJfdHhfb3duZXJbY3VycmVudF9pbmRleF0pOworICAgIGlmIChidWZmZXIpCisgICAgICAgIGJ1ZmZlciArPSBzdHJsZW4oYnVmZmVyKTsKKworICAgIHBjaWVfYnByaW50KGJ1ZmZlciwgIlx0UEQgZGF0YSA9IDB4JWx4XG4iLCAodW5zaWduZWQgbG9uZykmY3VycmVudF90dS0+ZGF0YV9wZCk7CisgICAgaWYgKGJ1ZmZlcikKKyAgICAgICAgYnVmZmVyICs9IHN0cmxlbihidWZmZXIpOworCisgICAgZHVtcF9wZChidWZmZXIsICZjdXJyZW50X3R1LT5kYXRhX3BkKTsKKyAgICBpZiAoYnVmZmVyKQorICAgICAgICBidWZmZXIgKz0gc3RybGVuKGJ1ZmZlcik7CisKKyAgICBwY2llX2JwcmludChidWZmZXIsICJcdFBEIHNoYWRvd19yYmQgPSAweCVseFxuIiwgKHVuc2lnbmVkIGxvbmcpJmN1cnJlbnRfdHUtPnJlbW90ZV90b19sb2NhbF9wZCk7CisgICAgaWYgKGJ1ZmZlcikKKyAgICAgICAgYnVmZmVyICs9IHN0cmxlbihidWZmZXIpOworCisgICAgZHVtcF9wZChidWZmZXIsICZjdXJyZW50X3R1LT5yZW1vdGVfdG9fbG9jYWxfcGQpOworICAgIGlmIChidWZmZXIpCisgICAgICAgIGJ1ZmZlciArPSBzdHJsZW4oYnVmZmVyKTsKKworICAgIHBjaWVfYnByaW50KGJ1ZmZlciwgIlx0UlggbmV0YnVmZiA9IDB4JWx4XG4iLCh1bnNpZ25lZCBsb25nKWN1cnJlbnRfZGV2aWNlLT5yeF9uYnVmZl9zYXZlW2N1cnJlbnRfaW5kZXhdKTsKKworICAgIGlmIChvdXRwdXQpCisgICAgICAgIHJldHVybiBzdHJsZW4ob3V0cHV0KTsKKyAgICByZXR1cm4gMDsKK30KKworYmNtb3NfZXJybm8gYmNtdHJfcGNpZV90eF9kdW1wKGNoYXIgKm91dHB1dCwgdWludDhfdCBkZXZpY2UsIGludDMyX3Qgc3RhcnQsIGludDMyX3QgbnVtYmVyX29mX2VudHJpZXMpCit7CisgICAgaW50MzJfdCBpOworICAgIGludDMyX3QgbGVuID0gMDsKKyAgICBjaGFyICpidWZmZXIgPSBvdXRwdXQ7CisgICAgaW50MzJfdCBmcm9tID0gc3RhcnQ7CisgICAgaW50MzJfdCB0bzsKKworICAgIHBjaWVfYnByaW50KGJ1ZmZlciwgIkR1bXAgVHggcmluZ1xuIik7CisgICAgaWYgKCFiY210cl9wY2llX2RhdGEpCisgICAgeworICAgICAgICBwY2llX3ByaW50KCJEcml2ZXIgaXMgbm90IGluaXRpYWxpemVkXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9SRVM7CisgICAgfQorCisgICAgaWYgKGRldmljZSA+PSBiY210cl9tYXhfZGV2aWNlc19udW1iZXIpCisgICAgeworICAgICAgICBwY2llX3ByaW50KCJEZXZpY2UgcGFyYW1ldGVyIGlzIGdyZWF0ZXIgdGhhbiBtYXhpbXVtIGRldmljZXMoJWQpXG4iLCBiY210cl9tYXhfZGV2aWNlc19udW1iZXIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICBpZiAoZGV2aWNlICE9IGJjbXRyX3BjaWVfZGF0YVtkZXZpY2VdLmlzcmRhdGEuZGV2aWNlKQorICAgIHsKKyAgICAgICAgcGNpZV9wcmludCgiKioqIERhdGEgQ29ycnVwdGVkICoqKlxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIGlmIChzdGFydCA9PSAtMSkgLyogZnJvbSBjdXJyZW50LCBudW1iZXIgb2YgZW50cmllcyAqLworICAgICAgICBmcm9tID0gYmNtdHJfcGNpZV9kYXRhW2RldmljZV0uY3VycmVudF90eDsKKworICAgIHRvID0gZnJvbSArIG51bWJlcl9vZl9lbnRyaWVzOworCisgICAgaWYgKHRvID09IGZyb20pCisgICAgICAgIHRvKys7CisKKyAgICBpZiAodG8gPiBiY210cl9wY2llX2RhdGFbZGV2aWNlXS50eHFfbGVuZ3RoKQorICAgICAgICB0byA9IGJjbXRyX3BjaWVfZGF0YVtkZXZpY2VdLnR4cV9sZW5ndGg7CisKKyAgICBpZiAoYnVmZmVyKQorICAgICAgICBsZW4gPSBzdHJsZW4oYnVmZmVyKTsKKworICAgIGZvciAoaSA9IGZyb207IGkgPCB0bzsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKGJ1ZmZlcikKKyAgICAgICAgICAgIGJ1ZmZlciA9IG91dHB1dCArIGxlbjsgLyogbW92ZSBidWZmZXIgdG8gdGhlIG5leHQgc3BhY2UgKi8KKworICAgICAgICBpZiAoaSA9PSBiY210cl9wY2llX2RhdGFbZGV2aWNlXS5jdXJyZW50X3R4KQorICAgICAgICB7CisgICAgICAgICAgICBwY2llX2JwcmludChidWZmZXIsICJDdXJyZW50ID0gJWRcbiIsIGkpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcGNpZV9icHJpbnQoYnVmZmVyLCAiSW5kZXggPSAlZFxuIiwgaSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYnVmZmVyKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBhZGQgdG8gbGVuIHRoZSBuZXh0IGxpbmUgLSBidWZmZXIgY29udGFpbnMgb25seSB0aGUgbGFzdCBsaW5lICovCisgICAgICAgICAgICBsZW4gKz0gc3RybGVuKGJ1ZmZlcik7CisgICAgICAgICAgICBidWZmZXIgPSBvdXRwdXQgKyBsZW47CisgICAgICAgIH0KKyAgICAgICAgLyogcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBsYXN0IGxpbmVzICovCisgICAgICAgIGxlbiArPSBkdW1wX29uZV90eChidWZmZXIsIGRldmljZSwgaSk7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIGJjbXRyX3BjaWVfcnhfZHVtcChjaGFyICpvdXRwdXQsIHVpbnQ4X3QgZGV2aWNlLCBpbnQzMl90IHN0YXJ0LCBpbnQzMl90IG51bWJlcl9vZl9lbnRyaWVzKQoreworICAgIGludDMyX3QgaTsKKyAgICBpbnQzMl90IGxlbiA9IDA7CisgICAgY2hhciAqYnVmZmVyID0gb3V0cHV0OworICAgIGludDMyX3QgZnJvbSA9IHN0YXJ0OworICAgIGludDMyX3QgdG87CisKKyAgICBwY2llX2JwcmludChidWZmZXIsICJEdW1wIFJ4IHJpbmdcbiIpOworICAgIGlmICghYmNtdHJfcGNpZV9kYXRhKQorICAgIHsKKyAgICAgICAgcGNpZV9wcmludCgiRHJpdmVyIGlzIG5vdCBpbml0aWFsaXplZFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PUkVTOworICAgIH0KKworICAgIGlmIChkZXZpY2UgPj0gYmNtdHJfbWF4X2RldmljZXNfbnVtYmVyKQorICAgIHsKKyAgICAgICAgcGNpZV9wcmludCgiRGV2aWNlIHBhcmFtZXRlciBpcyBncmVhdGVyIHRoYW4gbWF4aW11bSBkZXZpY2VzKCVkKVxuIiwgYmNtdHJfbWF4X2RldmljZXNfbnVtYmVyKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgaWYgKGRldmljZSAhPSBiY210cl9wY2llX2RhdGFbZGV2aWNlXS5pc3JkYXRhLmRldmljZSkKKyAgICB7CisgICAgICAgIHBjaWVfcHJpbnQoIioqKiBEYXRhIENvcnJ1cHRlZCAqKipcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICBpZiAoc3RhcnQgPT0gLTEpIC8qIGZyb20gY3VycmVudCBudW1iZXIgb2YgZW50cmllcyAqLworICAgICAgICBmcm9tID0gYmNtdHJfcGNpZV9kYXRhW2RldmljZV0uY3VycmVudF9yeDsKKyAgICB0byA9IGZyb20gKyBudW1iZXJfb2ZfZW50cmllczsKKyAgICBpZiAodG8gPT0gZnJvbSkKKyAgICAgICAgdG8rKzsKKyAgICBpZiAodG8gPiBiY210cl9wY2llX2RhdGFbZGV2aWNlXS5yeHFfbGVuZ3RoKQorICAgICAgICB0byA9IGJjbXRyX3BjaWVfZGF0YVtkZXZpY2VdLnJ4cV9sZW5ndGg7CisKKyAgICBpZiAoYnVmZmVyKQorICAgICAgICBsZW4gPSBzdHJsZW4oYnVmZmVyKTsKKyAgICBmb3IgKGkgPSBmcm9tOyBpIDwgdG87IGkrKykKKyAgICB7CisgICAgICAgIGlmIChidWZmZXIpCisgICAgICAgICAgICBidWZmZXIgPSBvdXRwdXQgKyBsZW47CisgICAgICAgIGlmIChpID09IGJjbXRyX3BjaWVfZGF0YVtkZXZpY2VdLmN1cnJlbnRfcngpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBjaWVfYnByaW50KGJ1ZmZlciwgIkN1cnJlbnQgPSAlZFxuIiwgaSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwY2llX2JwcmludChidWZmZXIsICJJbmRleCA9ICVkXG4iLCBpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnVmZmVyKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBhZGQgdG8gbGVuIHRoZSBuZXh0IGxpbmUgLSBidWZmZXIgY29udGFpbnMgb25seSB0aGUgbGFzdCBsaW5lICovCisgICAgICAgICAgICBsZW4gKz0gc3RybGVuKGJ1ZmZlcik7CisgICAgICAgICAgICBidWZmZXIgPSBvdXRwdXQgKyBsZW47CisgICAgICAgIH0KKyAgICAgICAgLyogcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBsYXN0IGxpbmVzICovCisgICAgICAgIGxlbiArPSBkdW1wX29uZV9yeChidWZmZXIsIGRldmljZSwgaSk7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKyNpZmRlZiBfX0tFUk5FTF9fCitFWFBPUlRfU1lNQk9MKGJjbXRyX3BjaWVfcmVjZWl2ZSk7CitFWFBPUlRfU1lNQk9MKGJjbXRyX3BjaWVfaW5pdCk7CitFWFBPUlRfU1lNQk9MKGJjbXRyX3BjaWVfZXhpdCk7CitFWFBPUlRfU1lNQk9MKGJjbXRyX3BjaWVfcHJlX2Nvbm5lY3QpOworRVhQT1JUX1NZTUJPTChiY210cl9wY2llX2Nvbm5lY3QpOworRVhQT1JUX1NZTUJPTChiY210cl9wY2llX2Rpc2Nvbm5lY3QpOworRVhQT1JUX1NZTUJPTChiY210cl9wY2llX3J4X2lycV9jYmxrX3JlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0woYmNtdHJfcGNpZV9yeF9pcnFfY2Jsa191bnJlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0woYmNtdHJfcGNpZV90eF9pcnFfY2Jsa19yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKGJjbXRyX3BjaWVfdHhfaXJxX2NibGtfdW5yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKGJjbXRyX3BjaWVfc2VuZCk7CitFWFBPUlRfU1lNQk9MKGJjbXRyX3BjaWVfdHhfZHVtcCk7CitFWFBPUlRfU1lNQk9MKGJjbXRyX3BjaWVfcnhfZHVtcCk7CitFWFBPUlRfU1lNQk9MKGJjbXRyX3BjaWVfcnhpbnRfZW5hYmxlKTsKK0VYUE9SVF9TWU1CT0woYmNtdHJfcGNpZV9yeGludF9kaXNhYmxlKTsKK0VYUE9SVF9TWU1CT0woYmNtdHJfcGNpZV9yeGludF9jbGVhcik7CitFWFBPUlRfU1lNQk9MKGJjbXRyX3BjaWVfcnhfaXJxX2hhbmRsZXIpOworRVhQT1JUX1NZTUJPTChiY210cl9wY2llX3R4X2lycV9oYW5kbGVyKTsKK0VYUE9SVF9TWU1CT0woYmNtdHJfcGNpZV9nZXRfc3RhdGlzdGljcyk7CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3BjaWUvYmNtdHJfcGNpZS5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3BjaWUvYmNtdHJfcGNpZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZTI3YjgKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvcGNpZS9iY210cl9wY2llLmgKQEAgLTAsMCArMSwyNDkgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgQkNNVFJfUENJRV9IXworI2RlZmluZSBCQ01UUl9QQ0lFX0hfCisKKyNpbmNsdWRlICJiY21vc19zeXN0ZW0uaCIKKworI2RlZmluZSBERFJfUEFDS0VUX0xPV19JTkRFWCAgICAgICAgMAorI2RlZmluZSBERFJfUEFDS0VUX0hJR0hfSU5ERVggICAgICAgNworI2RlZmluZSBQQ0lfUEFDS0VUX0xPV19JTkRFWCAgICAgICAgMQorI2RlZmluZSBQQ0lfUEFDS0VUX0hJR0hfSU5ERVggICAgICAgMgorCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVpbnQzMl90ICAgIHJ4X2NvdW50ZXI7CisgICAgdWludDMyX3QgICAgdHhfY291bnRlcjsKKyAgICB1aW50MzJfdCAgICByeF9kb25lX2lzcl9jb3VudGVyOworICAgIHVpbnQzMl90ICAgIHJ4X2Vycl9pc3JfY291bnRlcjsKKyAgICB1aW50MzJfdCAgICB0eF9kb25lX2lzcl9jb3VudGVyOworICAgIHVpbnQzMl90ICAgIHR4X2Vycl9pc3JfY291bnRlcjsKKyAgICB1aW50MzJfdCAgICByeF9wY2llX2VtcHR5X2NvdW50ZXI7CisgICAgdWludDMyX3QgICAgdHhfcGNpZV9mdWxsX2NvdW50ZXI7Cit9IGJjbV9wY2llZF9zdGF0OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVuc2lnbmVkIGxvbmcgICAgICAgcGNpZV9yZWdfYmFzZTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIHJ4X2lycTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIGRldmljZTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIHJ4X2RvbmVfbnVtOworICAgIHVpbnQzMl90ICAgICAgICAgICAgcnhfZXJyX251bTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIHR4X2RvbmVfbnVtOworICAgIHVpbnQzMl90ICAgICAgICAgICAgdHhfZXJyX251bTsKK30gYmNtX3BjaWVkX2lzcl9kYXRhOworCisvKiogSW5pdGlhbGl6ZSBQQ0llIGxvdyBsZXZlbCB0cmFuc3BvcnQgbW9kdWxlCisgKiBccmV0dXJuczogMCBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSA8IDAKKyAqLworI2lmZGVmIElOX0JBTkQgCisgICAgYmNtb3NfZXJybm8gYmNtdHJfcGNpZV9pbml0KHVpbnQ4X3QgZGV2aWNlLCBiY21vc19pcHY0X2FkZHJlc3MgaXBfYWRkcmVzcywgdWludDE2X3QgdWRwX3BvcnQpOworI2Vsc2UKKyAgICBiY21vc19lcnJubyBiY210cl9wY2llX2luaXQodWludDhfdCBtYXhfZGV2aWNlcyk7CisjZW5kaWYKKworLyoqIENsZWFudXAgUENJZSBsb3cgbGV2ZWwgdHJhbnNwb3J0IG1vZHVsZQorICogXHJldHVybnM6IDAgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIGVycm9yIGNvZGUgPCAwCisgKi8KK3ZvaWQgYmNtdHJfcGNpZV9leGl0KHZvaWQpOworCisvKiogUENJZSBwcmUtY29ubmVjdCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDMyX3QgdHhxX3NpemU7ICAvKio8IFRyYW5zbWl0IHF1ZXVlIHNpemUgKi8KKyAgICB1aW50MzJfdCByeHFfc2l6ZTsgIC8qKjwgUmVjZWl2ZSBxdWV1ZSBzaXplICovCisgICAgdWludDMyX3QgbWF4X210dTsgICAvKio8IE1heCBNVFUgc2l6ZSAqLworICAgIHVpbnQzMl90IHJ4X2lycTsgICAgLyoqPCBSeCBpbnRlcnJ1cHQgbnVtYmVyICovCisgICAgdW5zaWduZWQgbG9uZyBwY2llX3JlZ19iYXNlOyAgIC8qKjwgTWFwbGUgUENJZSByZWdpc3RlciBibG9jayBhZGRyZXNzIGluIGhvc3QgYWRkcnNzIHNwYWNlICovCisgICAgdW5zaWduZWQgbG9uZyBkZHJfd2luX2Jhc2U7ICAgLyoqPCBNYXBsZSBERFIgYWRkcmVzcyBpbiBob3N0IGFkZHJzcyBzcGFjZSAqLworfSBiY210cl9wY2llX3ByZV9jb25uZWN0X2NmZzsKKworLyoqIFBDSWUgcHJlLWNvbm5lY3QgZGF0YSAtIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IGJjbXRyX3BjaWVfcHJlX2Nvbm5lY3QoKS4KKyAqIERldmljZSBjb250cm9sIGRyaXZlciBzaG91bGQgc3RvcmUgZGF0YSBmcm9tIHRoaXMgc3RydWN0dXJlCisgKiBpbiB0aGUgYm9vdCByZWNvcmQgaW4gTWFwbGUgU1JBTQorICovCit0eXBlZGVmIHN0cnVjdCBiY210cl9wY2llX29wYXF1ZV9kYXRhIGJjbXRyX3BjaWVfb3BhcXVlX2RhdGE7CisKKy8qKiBQcmVwYXJlIHRvIGNvbm5lY3QKKyAqICAgICAgT24gTWFwbGUgcmV0dXJucyBpbnRvIG9wYXF1ZV9kYXRhIHBvaW50ZXJzIG9mIHRoZQorICogIAl0cmFuc21pdCBhbmQgcmVjZWl2ZSBQYWNrZXREZXNjcmlwdG9ycworICogIAlPbiBIb3N0IG9wYXF1ZV9kYXRhIGlzIE5VTEwKKyAqIFxwYXJhbVtpbl0gICAgICBkZXZpY2UgICAgICAgICAgICBNYXBsZSBkZXZpY2UgaW5kZXgKKyAqIFxwYXJhbVtpbl0gICAgICBjZmcgICAgICAgICAgICAgICBDb25uZWN0aW9uIGNvbmZpZ3VyYXRpb24KKyAqIFxwYXJhbVtvdXRdICAgICBvcGFxdWVfZGF0YSAgICAgICBQb2ludGVyIHRvIG1lbW9yeSBibG9jaworICogIAkgd2hlcmUgcGNpZSBkcml2ZXIgcHV0IG9wYXF1ZSBkYXRhIHRvIGJlIGNvbnZleWVkIHRvIHRoZQorICogIAkgb3RoZXIgc2lkZQorICogXHJldHVybnM6IDAgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIGVycm9yIGNvZGUgPCAwCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX3BjaWVfcHJlX2Nvbm5lY3QodWludDhfdCBkZXZpY2UsIGNvbnN0IGJjbXRyX3BjaWVfcHJlX2Nvbm5lY3RfY2ZnICpjZmcsCisgICAgYmNtdHJfcGNpZV9vcGFxdWVfZGF0YSAqZGF0YSk7CisKKy8qKiBDb25uZWN0CisgKiAgCU9uIE1hcGxlIG9wYXF1ZV9kYXRhIGlzIE5VTEwKKyAqICAJT24gSG9zdCBvcGFxdWVfZGF0YSBjb250YWlucyB0aGUgcG9pbnRlcnMgdG8gUERzIGluCisgKiAgCU1hcGxlCisgKiBccGFyYW1baW5dICBkZXZpY2UgICAgICAgTWFwbGUgZGV2aWNlIGluZGV4CisgKiBccGFyYW1baW5dIG9wYXF1ZV9kYXRhICBQb2ludGVyIHRvIG9wYXF1ZSBkYXRhIGJsb2NrCisgKiBccmV0dXJuczogMCBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSA8IDAKKyAqLworYmNtb3NfZXJybm8gYmNtdHJfcGNpZV9jb25uZWN0KHVpbnQ4X3QgZGV2aWNlLCBjb25zdCBiY210cl9wY2llX29wYXF1ZV9kYXRhICpkYXRhKTsKKworLyoqIERpc2Nvbm5lY3QuIEFsbCBidWZmZXJzIGFyZSByZWxlYXNlZAorICogXHBhcmFtW2luXSAgIGRldmljZSAgICAgICBNYXBsZSBkZXZpY2UgaW5kZXgKKyAqIFxwYXJhbVtpbl0gICBvcGFxdWVfZGF0YSAgUG9pbnRlciB0byBvcGFxdWUgZGF0YSBibG9jaworICogXHJldHVybnM6IDAgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIGVycm9yIGNvZGUgPCAwCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX3BjaWVfZGlzY29ubmVjdCh1aW50OF90IGRldmljZSk7CisKKy8qCisgKiBSZWNlaXZlIGNhbGxiYWNrIHJlZ2lzdHJhdGlvbi4KKyAqIEF0dGVudGlvbiBQQ0llIGRyaXZlciBpbXBsZW1lbnRlciEhCisgKiBSZWNlaXZlZCBwYWNrZXRzIG11c3Qgc3RheSBpbiB0aGUgcXVldWUgdW50aWwgcmVjZWl2ZSBjYWxsYmFjayBpcyByZWdpc3RlcmVkLgorICovCisKKy8qKiBQQ0llIGludGVyZmFjZSBpbnRlcnJ1cHQgcmVjZWl2ZSBjYWxsYmFjayAqLwordHlwZWRlZiB2b2lkICgqZl9iY210cl9pbnQpKHVpbnQ4X3QgZGV2aWNlKTsKKworLyoqIFJlZ2lzdGVyIHJlY2VpdmUgY2FsbGJhY2sKKyAqIFxwYXJhbVtpbl0gICByeF9pc3IgICAgSW50ZXJydXB0IFJlY2VpdmUgY2FsbGJhY2sKKyAqIFxyZXR1cm5zOiAwIGluIGNhc2Ugb2Ygc3VjY2VzcyBvciBlcnJvciBjb2RlIDwgMAorICovCitiY21vc19lcnJubyBiY210cl9wY2llX3J4X2lycV9jYmxrX3JlZ2lzdGVyKGZfYmNtdHJfaW50IHVzZXJfcnhfaXNyX2NsYmspOworCisvKiogVW5yZWdpc3RlciByZWNlaXZlIGNhbGxiYWNrLgorICogXHJldHVybnM6IDAgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIGVycm9yIGNvZGUgPCAwCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX3BjaWVfcnhfaXJxX2NibGtfdW5yZWdpc3Rlcih2b2lkKTsKKworLyoqIFJlZ2lzdGVyIHRyYW5zbWl0IGNvbXBsZXRpb24gaW50ZXJydXB0IGNhbGxiYWNrCisgKiBccGFyYW1baW5dICAgdHhfaXNyICAgIFRyYW5zZmVyIGNvbXBsZXRlZCBpbnRlcnJ1cHQgY2FsbGJhY2sKKyAqIFxyZXR1cm5zOiAwIGluIGNhc2Ugb2Ygc3VjY2VzcyBvciBlcnJvciBjb2RlIDwgMAorICovCitiY21vc19lcnJubyBiY210cl9wY2llX3R4X2lycV9jYmxrX3JlZ2lzdGVyKGZfYmNtdHJfaW50IHVzZXJfdHhfaXNyX2NsYmspOworCisvKiogVW5yZWdpc3RlciB0cmFuc21pdCBjb21wbGV0ZWQgaW50ZXJydXB0IGNhbGxiYWNrLgorICogXHJldHVybnM6IDAgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIGVycm9yIGNvZGUgPCAwCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX3BjaWVfdHhfaXJxX2NibGtfdW5yZWdpc3Rlcih2b2lkKTsKKworLyoqIFR4IGRvbmUgY2FsbGJhY2sgKi8KK3R5cGVkZWYgdm9pZCAoKmZfYmNtdHJfZG9uZSkodWludDhfdCBkZXZpY2UsIGJjbW9zX2J1ZiAqYnVmKTsKKworLyoqIFJlZ2lzdGVyIGJ1ZmZlciB0cmFuc21pdCBjb21wbGV0aW9uIGNhbGxiYWNrCisgKiBccGFyYW1baW5dICAgdHhfZG9uZSAgIFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjaworICogXHJldHVybnM6IDAgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIGVycm9yIGNvZGUgPCAwCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX3BjaWVfdHhfZG9uZV9jYmxrX3JlZ2lzdGVyKGZfYmNtdHJfZG9uZSB0eF9kb25lX2NiKTsKKworLyoqIFVucmVnaXN0ZXIgYnVmZmVyIHRyYW5zbWl0IGNvbXBsZXRpb24gY2FsbGJhY2sKKyAqIFxyZXR1cm5zOiAwIGluIGNhc2Ugb2Ygc3VjY2VzcyBvciBlcnJvciBjb2RlIDwgMAorICovCitiY21vc19lcnJubyBiY210cl9wY2llX3R4X2RvbmVfY2Jsa191bnJlZ2lzdGVyKHZvaWQpOworCisvKiogU2VuZCBidWZmZXIgdG8gdGhlIHBlZXIKKyAqIFxwYXJhbVtpbl0gICBkZXZpY2UgICAgTWFwbGUgZGV2aWNlIGluZGV4CisgKiBccGFyYW1baW5dICAgY2hhbm5lbCAgIENoYW5uZWwgaWQgKG9wYXF1ZSB0byB0aGUgYmNtdHJfcGNpZSBkcml2ZXIpCisgKiBccGFyYW1baW5dICAgYnVmICAgICAgIEJ1ZmZlciB0byBiZSB0cmFuc2ZlcnJlZAorICogXHJldHVybnM6IDAgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIGVycm9yIGNvZGUgPCAwCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX3BjaWVfc2VuZCh1aW50OF90IGRldmljZSwgdWludDhfdCBjaGFubmVsLCBiY21vc19idWYgKmJ1Zik7CisKKy8qKiBSZWNsYWltIGJ1ZmZlcnMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiB0cmFuc21pdHRlZAorICogXHBhcmFtW2luXSAgIGRldmljZSAgICBNYXBsZSBkZXZpY2UgaW5kZXgKKyAqIFxyZXR1cm5zOiBudW1iZXIgb2YgcmVjbGFpbWVkIFRYIGJ1ZmZlcnMgPj0gMCBvciBiY21vc19lcnJubyBlcnJvciBjb2RlIDwwCisgKi8KK2ludCBiY210cl9wY2llX3R4X2NvbGxlY3QodWludDhfdCBkZXZpY2UpOworCisvKiogRmV0Y2ggcmVjZWl2ZWQgYnVmZmVyIGZyb20gaC93IHF1ZXVlCisgKiBccGFyYW1baW5dICAgZGV2aWNlICAgICAgICAgIE1hcGxlIGRldmljZSBpbmRleAorICogXHBhcmFtW291dF0gIGNoYW5uZWwgICAgICAgICBtZXNzYWdlIGNoYW5uZWwgZnJvbSB0aGUgQkQKKyAqIFxwYXJhbVtvdXRdICBidWYgICAgICAgICAgICAgcG9pbnRlciB0byBuZXR3b3JrIGJ1ZmZlciBjb250YWluaW5nIHRoZSByZWNlaXZlZCBwYWNrZXQKKyAqIFxyZXR1cm5zOiAwIGluIGNhc2Ugb2Ygc3VjY2VzcyBvciBlcnJvciBjb2RlIDwgMAorICovCitiY21vc19lcnJubyBiY210cl9wY2llX3JlY2VpdmUodWludDhfdCBkZXZpY2UsIHVpbnQ4X3QgKmNoYW5uZWwsIGJjbW9zX2J1ZiAqKmJ1Zik7CisKKy8qKiBFbmFibGUgRE1BX1JYIGludGVycnVwdAorICogXHBhcmFtW2luXSAgIGRldmljZSAgTWFwbGUgZGV2aWNlIGluZGV4CisgKiBccmV0dXJuczogMCBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSA8IDAKKyAqLworYmNtb3NfZXJybm8gYmNtdHJfcGNpZV9yeGludF9lbmFibGUodWludDhfdCBkZXZpY2UpOworCisvKiogRGlzYWJsZSBETUFfUlggaW50ZXJydXB0CisgKiBccGFyYW1baW5dICAgZGV2aWNlICBNYXBsZSBkZXZpY2UgaW5kZXgKKyAqIFxyZXR1cm5zOiAwIGluIGNhc2Ugb2Ygc3VjY2VzcyBvciBlcnJvciBjb2RlIDwgMAorICovCitiY21vc19lcnJubyBiY210cl9wY2llX3J4aW50X2Rpc2FibGUodWludDhfdCBkZXZpY2UpOworCisvKiogQ2xlYXIgRE1BX1JYIGludGVycnVwdAorICogXHBhcmFtW2luXSAgIGRldmljZSAgTWFwbGUgZGV2aWNlIGluZGV4CisgKiBccmV0dXJuczogMCBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSA8IDAKKyAqLworYmNtb3NfZXJybm8gYmNtdHJfcGNpZV9yeGludF9jbGVhcih1aW50OF90IGRldmljZSk7CisKKy8qKiBFbmFibGUgIlRYIGhhbmRsZWQiIGludGVycnVwdAorICogXHBhcmFtW2luXSAgIGRldmljZSAgTWFwbGUgZGV2aWNlIGluZGV4CisgKiBccmV0dXJuczogMCBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSA8IDAKKyAqLworYmNtb3NfZXJybm8gYmNtdHJfcGNpZV90eGludF9lbmFibGUodWludDhfdCBkZXZpY2UpOworCisvKiogRGlzYWJsZSAiVFggaGFuZGxlZCIgaW50ZXJydXB0CisgKiBccGFyYW1baW5dICAgZGV2aWNlICBNYXBsZSBkZXZpY2UgaW5kZXgKKyAqIFxyZXR1cm5zOiAwIGluIGNhc2Ugb2Ygc3VjY2VzcyBvciBlcnJvciBjb2RlIDwgMAorICovCitiY21vc19lcnJubyBiY210cl9wY2llX3R4aW50X2Rpc2FibGUodWludDhfdCBkZXZpY2UpOworCisvKiogQ2xlYXIgIlRYIGhhbmRsZWQiIGludGVycnVwdAorICogXHBhcmFtW2luXSAgIGRldmljZSAgTWFwbGUgZGV2aWNlIGluZGV4CisgKiBccmV0dXJuczogMCBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSA8IDAKKyAqLworYmNtb3NfZXJybm8gYmNtdHJfcGNpZV90eGludF9jbGVhcih1aW50OF90IGRldmljZSk7CisKKy8qKiBSZXR1cm5zIHN0YXRpc3RpY3MKKyAqIFxwYXJhbVtpbl0gICBkZXZpY2UgIE1hcGxlIGRldmljZSBpbmRleAorICogXHBhcmFtW2luXSAgIGNsZWFyICAgaWYgc2V0LCBjbGVhciBzdGF0aXN0aWNzLCBvdGhlcndpc2UKKyAqICAgICAgIGFjY3VtdWxhdGUKKyAqLworYmNtb3NfZXJybm8gYmNtdHJfcGNpZV9nZXRfc3RhdGlzdGljcyh1aW50OF90IGRldmljZSwgdWludDMyX3QgY2xlYXIsIGJjbV9wY2llZF9zdGF0ICpzdGF0KTsKKworLyoqIER1bXAgZGF0YSBiYXNlCisgKiBccGFyYW1baW5dICAgb3V0cHV0ICBOVUxMKHdpbGwgcHJpbnQgdG8gc3Rkb3V0KSBvciBwb2ludGVyIHRvCisgKiAgICAgICBidWZmZXIKKyAqIFxwYXJhbVtpbl0gICBkZXZpY2UgIE1hcGxlIGRldmljZSBpbmRleAorICogXHBhcmFtW2luXSAgIHN0YXJ0ICAgaW5kZXggb2YgdGhlIHN0YXJ0IGVudHJ5IGluIHJpbmcsIC0xCisgKiAgICAgICBtZWFucyBjdXJyZW50CisgKiBccGFyYW1baW5dICAgbnVtYmVyX29mX2VudHJpZXMgIGhvdyBtYW55IGVudHJpZXMgZnJvbSB0aGUKKyAqICAgICAgIHN0YXJ0CisgKiBccmV0dXJuczogMCBpZiBvdXRwdXQgaXMgTlVMTCBvciBidWZmZXIgbGVuZ3RoCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX3BjaWVfdHhfZHVtcChjaGFyICpvdXRwdXQsIHVpbnQ4X3QgZGV2aWNlLCBpbnQzMl90IHN0YXJ0LCBpbnQzMl90IG51bWJlcl9vZl9lbnRyaWVzKTsKK2JjbW9zX2Vycm5vIGJjbXRyX3BjaWVfcnhfZHVtcChjaGFyICpvdXRwdXQsIHVpbnQ4X3QgZGV2aWNlLCBpbnQzMl90IHN0YXJ0LCBpbnQzMl90IG51bWJlcl9vZl9lbnRyaWVzKTsKKworCisjZW5kaWYgLyogQkNNVFJfUENJRV9IXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3N3X2Vycm9yL2JjbW9sdF9zd19lcnJvci5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3N3X2Vycm9yL2JjbW9sdF9zd19lcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZTVlYmYKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvc3dfZXJyb3IvYmNtb2x0X3N3X2Vycm9yLmgKQEAgLTAsMCArMSw1NyBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBfQkNNT0xUX1NXX0VSUk9SX0hfCisjZGVmaW5lIF9CQ01PTFRfU1dfRVJST1JfSF8KKworI2RlZmluZSBCQ01PTFRfU1dfRVJST1JfTUFYX0ZJTEVfTkFNRV9MRU4gNjQKKyNkZWZpbmUgQkNNT0xUX1NXX0VSUk9SX01BWF9UQVNLX05BTUVfTEVOIDY0CisKK3R5cGVkZWYgc3RydWN0IF9fUEFDS0VEX0FUVFJfU1RBUlRfXworeworICAgIHVpbnQ2NF90IGZpcnN0X2Vycm9yX3RpbWU7CisgICAgdWludDY0X3QgbGFzdF9lcnJvcl90aW1lOworICAgIHVpbnQzMl90IGxpbmVfbnVtYmVyOworICAgIHVpbnQzMl90IGVycm9yX2NvdW50ZXI7CisgICAgdWludDMyX3QgaW5zdGFuY2U7CisgICAgY2hhciBmaWxlX25hbWVbQkNNT0xUX1NXX0VSUk9SX01BWF9GSUxFX05BTUVfTEVOXTsKKyAgICBjaGFyIHRhc2tfbmFtZVtCQ01PTFRfU1dfRVJST1JfTUFYX1RBU0tfTkFNRV9MRU5dOworfSBfX1BBQ0tFRF9BVFRSX0VORF9fIGJjbW9zX3N3X2Vycm9yOworCit0eXBlZGVmIHN0cnVjdCBfX1BBQ0tFRF9BVFRSX1NUQVJUX18KK3sKKyAgICB1aW50MzJfdCBjb3VudDsKKyNpZiBkZWZpbmVkKF9fU1REQ19WRVJTSU9OX18pICYmIChfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwpIC8qKjwgQ2hlY2sgd2hldGhlciBDOTkgaXMgc3VwcG9ydGVkICovCisgICAgYmNtb3Nfc3dfZXJyb3IgZXJyb3JbXTsKKyNlbHNlCisgICAgYmNtb3Nfc3dfZXJyb3IgZXJyb3JbMV07CisjZW5kaWYKK30gX19QQUNLRURfQVRUUl9FTkRfXyBiY21vc19zd19lcnJvcl90YWJsZTsKKworI2VuZGlmIC8qIF9CQ01PTFRfU1dfRVJST1JfSF8gKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9zd192ZXJzaW9uL2JjbW9sdF9ob3N0X3N3X3ZlcnNpb24uaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci9zd192ZXJzaW9uL2JjbW9sdF9ob3N0X3N3X3ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDc1MmZmCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3N3X3ZlcnNpb24vYmNtb2x0X2hvc3Rfc3dfdmVyc2lvbi5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgQkNNT0xUX0hPU1RfU1dfVkVSU0lPTl9IXworI2RlZmluZSBCQ01PTFRfSE9TVF9TV19WRVJTSU9OX0hfCisKKyNkZWZpbmUgQkNNT0xUX0hPU1RfTUFKT1JfVkVSICAgIDIKKyNkZWZpbmUgQkNNT0xUX0hPU1RfTUlOT1JfVkVSICAgIDIKKyNkZWZpbmUgQkNNT0xUX0hPU1RfUkVWSVNJT05fVkVSIDIKKworCisjZW5kaWYgLyogQkNNT0xUX0hPU1RfU1dfVkVSU0lPTl9IXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci90cmFuc3BvcnQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZkN2RkYQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci90cmFuc3BvcnQvTWFrZWZpbGUKQEAgLTAsMCArMSw0NyBAQAorIyBUcmFuc3BvcnQKKyMKK01PRF9OQU1FID0gdHJhbnNwb3J0CitNT0RfVFlQRSA9IGxpYgorTU9EX0RFUFMgPSB1dGlscyBjbGkgbW9kZWwgY29tbW9uX2FwaSB0cl9wbHVnaW4gZGV2X2xvZworCitpZmVxICgiJChSRUxFQVNFX0JVSUxEKSIsICJ5IikKKyAgICBNT0RfREVQUyArPSBhcGlfY2xpCisgICAgVFJfUEVSRl9URVNUID0gbgorZWxzZQorICAgIE1PRF9ERVBTICs9IGFwaV9jbGlfaGVscGVycworZW5kaWYKKworaWZlcSAoIiQoU1VCU1lTVEVNKSIsICJob3N0IikKKyAgICBNT0RfREVQUyArPSBkZXZpY2Vfc2VsZWN0b3IKK2VuZGlmCisKK2lmZXEgKCIkKE9TX0tFUk5FTCkiLCAibGludXgiKQorICAgTU9EX0RFUFMgKz0gZGV2X2xvZ19saW51eAorZW5kaWYKKworc3JjcyA9IGJjbXRyX3RyYW5zcG9ydC5jIGJjbXRyX2NvbmZpZy5jIGJjbXRyX2RlYnVnLmMKKworaWZlcSAoIiQoRU5BQkxFX0NMSSkiLCAieSIpCisJc3JjcyArPSBiY210cl90cmFuc3BvcnRfY2xpLmMgYmNtdHJfZGVidWdfY2xpLmMKK2Vsc2UKKyAgICBUUl9QRVJGX1RFU1QgPSBuCitlbmRpZgorCitDT05GSUdfVFJBTlNQT1JUX1JBVyA/PSBuCitDT05GSUdfVFJBTlNQT1JUX1VEUCA/PSB5CisKKyMgRXh0cmEgY29uZmlndXJhdGlvbgoraWZlcSAoIiQoQ09ORklHX1RSQU5TUE9SVF9SQVcpIiwgInkiKQorCU1PRF9ERVBTICs9IHRyX3BsdWdpbl9tdXgKKwlDT05GSUdfVFJBTlNQT1JUX1VEUCA9IG4KK2VuZGlmCitpZmVxICgiJChDT05GSUdfVFJBTlNQT1JUX1VEUCkiLCAieSIpCisJTU9EX0RFUFMgKz0gdHJfcGx1Z2luX3VkcAorZW5kaWYKKworVFJfUEVSRl9URVNUID89IHkKK2lmZXEgKCIkKFRSX1BFUkZfVEVTVCkiLCAieSIpCisgICAgRVhUUkFfREVGSU5FUyArPSAtREJDTVRSX1BFUkZURVNUCisgICAgRVhUUkFfSU5DTFVERVMgKz0gLUkkKFNSQ19ESVIpL3Rlc3QKKyAgICBzcmNzICs9IHRlc3QvYmNtdHJfcGVyZnRlc3QuYworZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci90cmFuc3BvcnQvYmNtdHJfY29uZmlnLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L2JjbXRyX2NvbmZpZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYzQ3NDkKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L2JjbXRyX2NvbmZpZy5jCkBAIC0wLDAgKzEsODIgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpbmNsdWRlICJiY210cl9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImJjbXRyX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImJjbXRyX3BsdWdpbi5oIgorCisKKyNpZmRlZiBCQ01UUl9VRFBfU1VQUE9SVAorCit1aW50MzJfdCBiY210cl9ob3N0X2lwID0gQkNNVFJfVFJfVURQX0hPU1RfSVA7Cit1aW50MTZfdCBiY210cl9ob3N0X3VkcF9wb3J0ID0gQkNNVFJfVFJfVURQX0hPU1RfUE9SVDsKK3VpbnQzMl90IGJjbXRyX29sdF9pcFtCQ01UUl9NQVhfT0xUU107Cit1aW50MTZfdCBiY210cl9vbHRfdWRwX3BvcnRbQkNNVFJfTUFYX09MVFNdOworCisjZW5kaWYKKworLyogRmV0Y2ggY29uZmlndXJhdGlvbgorICogc2V0LXVwIHRyYW5zcG9ydCBkcml2ZXIgcGx1Z2luCisgKiBFdmVudHVhbGx5IHRoaXMgZnVuY3Rpb24gY2FuIHJlYWQgZnJvbSBjb25maWcgZmlsZSBvciBkZXZpY2UgY29udHJvbCBkcml2ZXIuCisgKiBGb3Igbm93IC0gaGFyZGNvZGUKKyAqLworYmNtb3NfZXJybm8gYmNtdHJfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY210cl9jZmcgKmNmZywgYmNtdHJfZHJpdmVyICpkcml2ZXIpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisKKyAgICBjZmctPm1heF9yZXRyaWVzID0gQkNNVFJfTUFYX1JFVFJJRVM7CisgICAgY2ZnLT5tc2dfdGltZW91dCA9IEJDTVRSX01TR19USU1FT1VUOworICAgIGNmZy0+bWF4X2ZyYWdtZW50cyA9IEJDTVRSX01BWF9GUkFHTUVOVFM7CisgICAgY2ZnLT5tYXhfcmVxdWVzdHMgPSBCQ01UUl9NQVhfUkVRVUVTVFM7CisgICAgY2ZnLT5tYXhfYXV0b3MgPSBCQ01UUl9NQVhfQVVUT1M7CisgICAgY2ZnLT5tYXhfbXR1ID0gQkNNVFJfTUFYX01UVV9TSVpFOworICAgIGNmZy0+bXNnX3dhaXRfdGltZW91dCA9IEJDTVRSX01TR19XQUlUX01TOworICAgIGNmZy0+bXNnX3JlYWR5X3RpbWVvdXQgPSBCQ01UUl9NU0dfUkVBRFlfTVM7CisgICAgY2ZnLT5wbHVnaW5fY2ZnLnR5cGUgPSBCQ01UUl9UUl9UWVBFOworICAgIGNmZy0+cnhfdGhyZWFkX3ByaW9yaXR5ID0gVEFTS19QUklPUklUWV9UUkFOU1BPUlRfUlg7CisKKyNpZmRlZiBCQ01UUl9VRFBfU1VQUE9SVAorI2lmZGVmIEJDTV9TVUJTWVNURU1fSE9TVAorICAgIGNmZy0+cGx1Z2luX2NmZy54LnVkcC5teV9pcCA9IGJjbXRyX2hvc3RfaXA7CisgICAgY2ZnLT5wbHVnaW5fY2ZnLngudWRwLnJlbW90ZV9pcCA9IGJjbXRyX29sdF9pcFtkZXZpY2VdOworICAgIGNmZy0+cGx1Z2luX2NmZy54LnVkcC5teV9wb3J0ID0gYmNtdHJfaG9zdF91ZHBfcG9ydCArIGRldmljZTsKKyAgICBjZmctPnBsdWdpbl9jZmcueC51ZHAucmVtb3RlX3BvcnQgPSBiY210cl9vbHRfdWRwX3BvcnRbZGV2aWNlXTsKKyNlbHNlCisgICAgY2ZnLT5wbHVnaW5fY2ZnLngudWRwLm15X2lwID0gYmNtdHJfb2x0X2lwW2RldmljZV07CisgICAgY2ZnLT5wbHVnaW5fY2ZnLngudWRwLnJlbW90ZV9pcCA9IGJjbXRyX2hvc3RfaXA7CisgICAgY2ZnLT5wbHVnaW5fY2ZnLngudWRwLm15X3BvcnQgPSBiY210cl9vbHRfdWRwX3BvcnRbZGV2aWNlXTsKKyAgICBjZmctPnBsdWdpbl9jZmcueC51ZHAucmVtb3RlX3BvcnQgPSBiY210cl9ob3N0X3VkcF9wb3J0ICsgZGV2aWNlOworI2VuZGlmCisjZW5kaWYKKworICAgIHJjID0gYmNtdHJfcGx1Z2luX2luaXQoJmNmZy0+cGx1Z2luX2NmZywgZHJpdmVyKTsKKworICAgIHJldHVybiByYzsKK30KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9iY210cl9kZWJ1Zy5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9iY210cl9kZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4OTYzMGMKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L2JjbXRyX2RlYnVnLmMKQEAgLTAsMCArMSw4NzYgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY210cl9kZWJ1Zy5oPgorI2luY2x1ZGUgPGJjbWNsaV9zZXNzaW9uLmg+CisjaW5jbHVkZSA8YmNtX2FwaV9jbGlfaGVscGVycy5oPgorI2luY2x1ZGUgPGJjbW9sdF9tYXRoLmg+CisKKyNpZmRlZiBFTkFCTEVfTE9HCisjaW5jbHVkZSA8YmNtX2Rldl9sb2cuaD4KKyNlbmRpZgorCisjaWZkZWYgRU5BQkxFX0NMSQorI2luY2x1ZGUgPGJjbXRyX2RlYnVnX2NsaS5oPgorI2VuZGlmCisKKy8qIE1lc3NhZ2VzIGFyZSByZWNvcmRlZCBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDoKKyAqIHVpbnQzMl90IC0gZXZlbnQgdHlwZQorICogdWludDMyX3QgLSB0aW1lc3RhbXAKKyAqIHVpbnQzMl90IC0gbWVzc2FnZSBkYXRhIHNpemUKKyAqIDxtZXNzYWdlIGRhdGE+IC0gcGFkZGVkIHRvIHRoZSBuZWFyZXN0IDQgYnl0ZXMKKyAqIHVpbnQzMl90IC0gdG90YWwgc2l6ZSAtIHRvdGFsIGNhcHR1cmUgZW50cnkgc2l6ZSwgaW5jbHVkaW5nIGNvbnRyb2wgaW5mbworICovCisKKy8qIE92ZXJoZWFkIHNpemU6IGVudHJ5IGhlYWRlciArIHVpbnQzMl90IHN1ZmZpeCAqLworI2RlZmluZSBCQ01UUl9DQVBUVVJFX09WRVJIRUFEX1NJWkUgIChzaXplb2YoYmNtdHJfY2FwdHVyZV9lbnRyeSkgKyBzaXplb2YodWludDMyX3QpKQorCisjZGVmaW5lIEJDTVRSX0NBUFRVUkVfRU5UUllfRklFTERTICAoc2l6ZW9mKGJjbXRyX2NhcHR1cmVfZW50cnkpIC8gc2l6ZW9mKHVpbnQzMl90KSkKKworLyogTWF4aW11bSB0b3RhbCBudW1iZXIgb2YgY2hhcmFjdGVycyBmb3IgYSBtZXNzYWdlIGR1bXAgKi8KKyNkZWZpbmUgQkNNVFJfTUFYX01TR19EVU1QX1NUUl9TSVpFIDQwOTYKKworLyogQ2FwdHVyZSBjb250cm9sIGJsb2NrICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIGJjbXRyX2NhcHR1cmVfcGFybSBwYXJtOyAgICAgICAgICAgIC8qIENhcHR1cmUgY29uZmlndXJhdGlvbiAqLworICAgIGJjbW9zX2Jvb2wgYWN0aXZlOworCisgICAgdWludDhfdCAqc3RhcnQ7CisgICAgdWludDhfdCAqZW5kOworICAgIHVpbnQ4X3QgKmN1cjsKKyAgICB1aW50MzJfdCBzaXplOyAgICAgICAgICAgICAgICAgICAgICAvKiBCdWZmZXIgc2l6ZSAqLworICAgIHVpbnQzMl90IHVzZWQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIEJ5dGVzIHVzZWQgKi8KKyAgICB1aW50MzJfdCB3YTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgdGltZXMgYnVmZmVyIHdyYXBwZWQgYXJvdW5kICovCisgICAgdWludDMyX3QgZXZlbnRzOyAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGNhcHR1cmUgZXZlbnRzICovCit9IGJjbXRyX2NhcHR1cmVfYnVmOworCitzdGF0aWMgYmNtdHJfY2FwdHVyZV9idWYgY2FwdHVyZV9idWZbQkNNVFJfTUFYX09MVFNdOworCisvKiBDTEkgc2Vzc2lvbiB3aGVyZSB0byBkdW1wICovCitzdGF0aWMgYmNtY2xpX3Nlc3Npb24gKmJjbXRyX2NsZF9zZXNzaW9uOworCisjaWZkZWYgRU5BQkxFX0xPRworLyogTG9nZ2VyIHVzZWQgZm9yIEJDTVRSX0NMRF9MT0cgKi8KK3N0YXRpYyBkZXZfbG9nX2lkIGJjbXRyX2NsZF9sb2dfaWQ7CisjZW5kaWYKKworLyogR2xvYmFsIHZhcmlhYmxlOiBwZXIgbXNnX2lkIENMRCBsZXZlbCAqLworYmNtdHJfY2xkX3R5cGUgYmNtdHJfY2xkX2FjdGl2ZV9sZXZlbFtCQ01UUl9NQVhfT0xUU11bQkNNT0xUX0dST1VQX0lEX19OVU1fT0ZdOworCisvKiBDcmVhdGUgYSBkdW1teSBDTEkgc2Vzc2lvbiBzbyB3ZSBjYW4gcHJpbnQgdG8gYSBidWZmZXIgaW50ZXJuYWxseSBiZWZvcmUgcHJpbnRpbmcgdG8gdGhlIHJlYWwgQ0xJLgorICogVGhpcyB3YXksIHRoZSBvdXRwdXQgY2FuJ3QgYmUgaW50ZXJydXB0ZWQgYnkgYW5vdGhlciBwcmludC4gKi8KK3N0YXRpYyBjaGFyIGJjbXRyX2NsZF9zY3JhdGNoX2J1ZltCQ01UUl9NQVhfTVNHX0RVTVBfU1RSX1NJWkVdOworc3RhdGljIHVpbnQzMl90IGJjbXRyX2NsZF9zY3JhdGNoX3BvcyA9IDA7CitzdGF0aWMgYmNtY2xpX3Nlc3Npb24gKmJjbXRyX2NsZF9zY3JhdGNoX3Nlc3Npb247CisKKy8qCisgKiBJbnRlcm5hbCBmdW5jdGlvbnMKKyAqLworCisvKiBDTEkgc2Vzc2lvbiBwcmludCBjYWxsYmFjayBmb3IgdGhlIHNjcmF0Y2ggYnVmZmVyICovCitzdGF0aWMgaW50IGJjbXRyX2xvZ19jbGlfcHJpbnQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGNoYXIgKmJ1ZiwgdWludDMyX3Qgc2l6ZSkKK3sKKyAgICBzaXplID0gTUlOKHNpemUsIEJDTVRSX01BWF9NU0dfRFVNUF9TVFJfU0laRSAtIGJjbXRyX2NsZF9zY3JhdGNoX3Bvcyk7CisgICAgaWYgKHNpemUgPiAwKQorICAgIHsKKyAgICAgICAgbWVtY3B5KCZiY210cl9jbGRfc2NyYXRjaF9idWZbYmNtdHJfY2xkX3NjcmF0Y2hfcG9zXSwgYnVmLCBzaXplKTsKKyAgICB9CisgICAgYmNtdHJfY2xkX3NjcmF0Y2hfcG9zICs9IHNpemU7CisgICAgcmV0dXJuIHNpemU7Cit9CisKKy8qIEdldCBtZXNzYWdlIGV2ZW50IG5hbWUgKi8KK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqYmNtdHJfY2xkX2V2ZW50X25hbWUoYmNtdHJfY2xkX2V2ZW50X3R5cGUgZXYpCit7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmV2X25hbWVbXSA9IHsKKyAgICAgICAgW0JDTVRSX0NMRF9FVl9TRU5EXSAgICAgPSAidHgiLAorICAgICAgICBbQkNNVFJfQ0xEX0VWX1JFU0VORF0gICA9ICJyZS10eCIsCisgICAgICAgIFtCQ01UUl9DTERfRVZfUkVDVl0gICAgID0gInJ4IiwKKyAgICAgICAgW0JDTVRSX0NMRF9FVl9SRUNWX0RJU0NBUkRdID0gInJ4LWRpc2NhcmQiLAorICAgICAgICBbQkNNVFJfQ0xEX0VWX1RJTUVPVVRdID0gInRpbWVvdXQiCisgICAgfTsKKyAgICByZXR1cm4gZXZfbmFtZVtldl07Cit9CisKKy8qIFN0b3JlIGRhdGEgaW4gY2FwdHVyZSBidWZmZXIgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfYmNtdHJfY2FwdHVyZV9zdG9yZShiY210cl9jYXB0dXJlX2J1ZiAqdGIsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IHNpemUpCit7CisgICAgaW50MzJfdCBsZWZ0ID0gKGludDMyX3QpKHRiLT5lbmQgLSB0Yi0+Y3VyKTsKKyAgICBpZiAobGVmdCA+PSAoaW50MzJfdClzaXplKQorICAgIHsKKyAgICAgICAgbWVtY3B5KHRiLT5jdXIsIGRhdGEsIHNpemUpOworICAgICAgICB0Yi0+Y3VyICs9IHNpemU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG1lbWNweSh0Yi0+Y3VyLCBkYXRhLCBsZWZ0KTsKKyAgICAgICAgbWVtY3B5KHRiLT5zdGFydCwgKGNvbnN0IHVpbnQ4X3QgKilkYXRhICsgbGVmdCwgc2l6ZSAtIGxlZnQpOworICAgICAgICB0Yi0+Y3VyID0gdGItPnN0YXJ0ICsgc2l6ZSAtIGxlZnQ7CisgICAgICAgICsrdGItPndhOworICAgIH0KKyAgICB0Yi0+dXNlZCArPSBzaXplOworICAgIGlmICh0Yi0+dXNlZCA+IHRiLT5zaXplKQorICAgICAgICB0Yi0+dXNlZCA9IHRiLT5zaXplOworfQorCisKKy8qIEdldCBjYXB0dXJlIGVudHJ5IHNpemUgYW5kIHN0YXJ0IHBvaW50ZXIgZ2l2ZW4gcG9pbnRlciByaWdodCBhZnRlciB0aGUgZW50cnkgKi8KK3N0YXRpYyB2b2lkIF9iY210cl9jYXB0dXJlX2dldF9wcmV2KGJjbXRyX2NhcHR1cmVfYnVmICp0YiwgdWludDhfdCAqcHRyLCB1aW50MzJfdCAqcHJldl9zaXplLCB1aW50OF90ICoqcHJldl9wdHIpCit7CisgICAgdWludDMyX3Qgc2l6ZTsKKyAgICB1aW50OF90ICpwcmV2OworCisgICAgaWYgKHB0ciA9PSB0Yi0+c3RhcnQpCisgICAgICAgIHB0ciA9IHRiLT5lbmQ7CisgICAgc2l6ZSA9ICooKCh1aW50MzJfdCAqKShsb25nKXB0cikgLSAxKTsKKyAgICBCVUdfT04oIXNpemUgfHwgc2l6ZSA+IDB4ZmZmZiB8fCAoc2l6ZSAmIDB4MykpOworICAgIHByZXYgPSBwdHIgLSBzaXplOworICAgIGlmIChwcmV2IDwgdGItPnN0YXJ0KQorICAgICAgICBwcmV2ID0gdGItPmVuZCAtIChzaXplIC0gKHB0ciAtIHRiLT5zdGFydCkpOworICAgICpwcmV2X3NpemUgPSBzaXplOworICAgICpwcmV2X3B0ciA9IHByZXY7Cit9CisKKy8qIEdldCBudW1iZXIgb2YgY29tcGxldGUgbWVzc2FnZXMgc3RvcmVkIGluIGNhcHR1cmUgYnVmZmVyICovCitzdGF0aWMgdWludDMyX3QgX2JjbXRyX2NhcHR1cmVfbm1zZ3MoYmNtdHJfY2FwdHVyZV9idWYgKnRiKQoreworICAgIHVpbnQzMl90IG4gPSAwOworICAgIHVpbnQzMl90IHByZXZfbGVuZ3RoOworICAgIHVpbnQ4X3QgKnByZXZfc3RhcnQgPSB0Yi0+Y3VyOworCisgICAgaWYgKCF0Yi0+dXNlZCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBVbndpbmQgY2FwdHVyZSBidWZmZXIgYmFja3dhcmQgKi8KKyAgICB3aGlsZSAobiA8IHRiLT5ldmVudHMpCisgICAgeworICAgICAgICB1aW50OF90ICpwcmV2ID0gcHJldl9zdGFydDsKKyAgICAgICAgX2JjbXRyX2NhcHR1cmVfZ2V0X3ByZXYodGIsIHByZXYsICZwcmV2X2xlbmd0aCwgJnByZXZfc3RhcnQpOworICAgICAgICBpZiAocHJldl9zdGFydCA+PSBwcmV2KQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICsrbjsKKyAgICB9CisKKyAgICAvKiBJZiBidWZmZXIgaGFzIHdyYXBwZWQgYXJvdW5kIC0gY29udGludWUgdW53aW5kaW5nICovCisgICAgaWYgKHRiLT53YSkKKyAgICB7CisgICAgICAgIHdoaWxlIChwcmV2X3N0YXJ0ID49IHRiLT5jdXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9iY210cl9jYXB0dXJlX2dldF9wcmV2KHRiLCBwcmV2X3N0YXJ0LCAmcHJldl9sZW5ndGgsICZwcmV2X3N0YXJ0KTsKKyAgICAgICAgICAgICsrbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBuOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX2JjbXRyX2NhcHR1cmVfd3JhcCh1aW50OF90ICoqY3VyLCBiY210cl9jYXB0dXJlX2J1ZiAqdGIpCit7CisgICAgaWYgKCpjdXIgPiB0Yi0+ZW5kKQorICAgIHsKKyAgICAgICAgKmN1ciA9IHRiLT5zdGFydCArICgqY3VyIC0gdGItPmVuZCk7CisgICAgfQorfQorc3RhdGljIHZvaWQgX2JjbXRyX2NhcHR1cmVfdW53aW5kKGJjbXRyX2NhcHR1cmVfYnVmICp0YiwgdWludDhfdCAqKnN0YXJ0LCB1aW50MzJfdCAqY291bnQpCit7CisgICAgdWludDMyX3QgcHJldl9sZW5ndGg7CisgICAgdWludDhfdCAqcHJldl9zdGFydDsKKyAgICB1aW50MzJfdCBuID0gMDsKKyAgICB1aW50OF90ICpjdXJfaGRyID0gTlVMTDsKKworICAgIHByZXZfc3RhcnQgPSB0Yi0+Y3VyOworICAgIHdoaWxlIChuIDwgdGItPmV2ZW50cykKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgKnByZXYgPSBwcmV2X3N0YXJ0OworICAgICAgICBfYmNtdHJfY2FwdHVyZV9nZXRfcHJldih0YiwgcHJldiwgJnByZXZfbGVuZ3RoLCAmcHJldl9zdGFydCk7CisgICAgICAgIGlmIChwcmV2X3N0YXJ0ID49IHByZXYpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgKytuOworICAgICAgICBjdXJfaGRyID0gcHJldl9zdGFydDsKKyAgICB9CisKKyAgICAvKiBJZiBidWZmZXIgaGFzIHdyYXBwZWQgYXJvdW5kIC0gY29udGludWUgdW53aW5kaW5nICovCisgICAgaWYgKHRiLT53YSkKKyAgICB7CisgICAgICAgIHdoaWxlIChwcmV2X3N0YXJ0ID49IHRiLT5jdXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGN1cl9oZHIgPSBwcmV2X3N0YXJ0OworICAgICAgICAgICAgX2JjbXRyX2NhcHR1cmVfZ2V0X3ByZXYodGIsIHByZXZfc3RhcnQsICZwcmV2X2xlbmd0aCwgJnByZXZfc3RhcnQpOworICAgICAgICAgICAgKytuOworICAgICAgICB9CisgICAgfQorCisgICAgKnN0YXJ0ID0gY3VyX2hkcjsKKyAgICAqY291bnQgPSBuOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IF9iY210cl9jYXB0dXJlX21zZ19zaXplX2dldCh1aW50OF90ICpidWYpCit7CisgICAgLyogV0FSTklORzogZG8gTk9UIGFjY2VzcyBhbnkgbWVtYmVycyBvZiBiY210cl9jYXB0dXJlX2VudHJ5IG90aGVyIHRoYW4gbXNnX3NpemUgKHRoZSBmaXJzdCBtZW1iZXIpIGFzIHRoZXkgbWF5CisgICAgICAgaGF2ZSBiZWVuIHdyYXBwZWQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyLiAqLworICAgIHJldHVybiAoKGJjbXRyX2NhcHR1cmVfZW50cnkgKikobG9uZylidWYpLT5tc2dfc2l6ZTsKK30KKworc3RhdGljIHZvaWQgX2JjbXRyX2NhcHR1cmVfY29weSgKKyAgICBiY210cl9jYXB0dXJlX2J1ZiAqdGIsCisgICAgdWludDhfdCAqKmRzdCwKKyAgICB1aW50OF90ICpzcmMsCisgICAgdWludDMyX3QgdG9fY29weSwKKyAgICB1aW50MzJfdCAqcmVtYWluaW5nKQoreworICAgIHVpbnQzMl90IGxlZnQ7CisKKyAgICBsZWZ0ID0gdGItPmVuZCAtIHNyYzsKKyAgICBpZiAobGVmdCA8IHRvX2NvcHkpCisgICAgeworICAgICAgICBtZW1jcHkoKmRzdCwgc3JjLCBsZWZ0KTsKKyAgICAgICAgbWVtY3B5KCgqZHN0KSArIGxlZnQsIHRiLT5zdGFydCwgdG9fY29weSAtIGxlZnQpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBtZW1jcHkoKmRzdCwgc3JjLCB0b19jb3B5KTsKKyAgICB9CisgICAgKCpkc3QpICs9IHRvX2NvcHk7CisgICAgKCpyZW1haW5pbmcpIC09IHRvX2NvcHk7Cit9CisKK3N0YXRpYyB2b2lkIF9iY210cl9jYXB0dXJlX2NvcHlfYm91bmRlZCgKKyAgICBiY210cl9jYXB0dXJlX2J1ZiAqdGIsCisgICAgdWludDhfdCAqKmRzdCwKKyAgICB1aW50OF90ICpzcmMsCisgICAgdWludDMyX3QgdG9fY29weSwKKyAgICB1aW50MzJfdCAqcmVtYWluaW5nLAorICAgIHVpbnQzMl90IGJvdW5kKQoreworICAgIGlmIChib3VuZCA8IHRvX2NvcHkpCisgICAgeworICAgICAgICBzcmMgKz0gdG9fY29weSAtIGJvdW5kOworICAgICAgICB0b19jb3B5ID0gYm91bmQ7CisgICAgfQorICAgIGlmICgoKnJlbWFpbmluZykgPCB0b19jb3B5KQorICAgIHsKKyAgICAgICAgdG9fY29weSA9ICpyZW1haW5pbmc7CisgICAgfQorICAgIF9iY210cl9jYXB0dXJlX2NvcHkodGIsIGRzdCwgc3JjLCB0b19jb3B5LCByZW1haW5pbmcpOworfQorCisvKiBTZXQgY2FwdHVyZSwgbG9nLCBkZWJ1ZyBmb3Igc2VsZWN0ZWQgbWVzc2FnZXMgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX2NsZF9sZXZlbF9zZXQoYmNtb2x0X2RldmlkIGRldmljZSwgY29uc3QgYmNtdHJfY2xkX2ZpbHRlciAqZmlsdGVyLCBiY210cl9jbGRfdHlwZSBjbGRfbGV2ZWwpCit7CisgICAgYmNtb2x0X2dyb3VwX2lkIG1zZ19pZDsKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIGlmICgodW5zaWduZWQpZGV2aWNlID49IEJDTVRSX01BWF9PTFRTIHx8ICFmaWx0ZXIpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIEhhbmRsZSB3aWxkY2FyZCBvYmplY3QgKi8KKyAgICBpZiAoZmlsdGVyLT5vYmplY3QgPT0gQkNNT0xUX09CSkVDVF9BTlkpCisgICAgeworICAgICAgICBiY210cl9jbGRfZmlsdGVyIGYgPSAqZmlsdGVyOworCisgICAgICAgIGZvciAoZi5vYmplY3QgPSAwOyBmLm9iamVjdCA8PSBCQ01PTFRfT0JKX0lEX19OVU1fT0Y7IGYub2JqZWN0KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbXRyX2NsZF9sZXZlbF9zZXQoZGV2aWNlLCAmZiwgY2xkX2xldmVsKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisKKyAgICAvKiBIYW5kbGUgd2lsZGNhcmQgZ3JvdXAgKi8KKyAgICBpZiAoZmlsdGVyLT5ncm91cCA9PSBCQ01PTFRfTUdUX0dST1VQX0FOWSkKKyAgICB7CisgICAgICAgIGJjbXRyX2NsZF9maWx0ZXIgZiA9ICpmaWx0ZXI7CisKKyAgICAgICAgZi5zdWJncm91cCA9IEJDTU9MVF9TVUJHUk9VUF9BTlk7CisgICAgICAgIGZvciAoZi5ncm91cCA9IEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOyBmLmdyb3VwIDw9IEJDTU9MVF9NR1RfR1JPVVBfX05VTV9PRjsgZi5ncm91cCsrKQorICAgICAgICB7CisgICAgICAgICAgICBiY210cl9jbGRfbGV2ZWxfc2V0KGRldmljZSwgJmYsIGNsZF9sZXZlbCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgLyogSGFuZGxlIHdpbGRjYXJkIHN1Ymdyb3VwICovCisgICAgaWYgKGZpbHRlci0+Z3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9BTlkgfHwgZmlsdGVyLT5zdWJncm91cCA9PSBCQ01PTFRfU1VCR1JPVVBfQU5ZKQorICAgIHsKKyAgICAgICAgYmNtdHJfY2xkX2ZpbHRlciBmID0gKmZpbHRlcjsKKworICAgICAgICBmLnN1Ymdyb3VwID0gMDsKKyAgICAgICAgZm9yIChmLnN1Ymdyb3VwID0gMDsKKyAgICAgICAgICAgIGJjbW9sdF9ncm91cF9pZF9jb21iaW5lKGYub2JqZWN0LCBmLmdyb3VwLCBmLnN1Ymdyb3VwLCAmbXNnX2lkKSA9PSBCQ01fRVJSX09LOworICAgICAgICAgICAgZi5zdWJncm91cCsrKQorICAgICAgICB7CisgICAgICAgICAgICBiY210cl9jbGRfbGV2ZWxfc2V0KGRldmljZSwgJmYsIGNsZF9sZXZlbCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgLyogSWYgd2UgYXJlIGhlcmUgLSBpdCBpcyBub3QgYSB3aWxkY2FyZCAqLworICAgIHJjID0gYmNtb2x0X2dyb3VwX2lkX2NvbWJpbmUoZmlsdGVyLT5vYmplY3QsIGZpbHRlci0+Z3JvdXAsIGZpbHRlci0+c3ViZ3JvdXAsICZtc2dfaWQpOworICAgIGlmIChyYykKKyAgICAgICAgcmV0dXJuIHJjOworCisgICAgQlVHX09OKCh1bnNpZ25lZCltc2dfaWQgPj0gQkNNT0xUX0dST1VQX0lEX19OVU1fT0YpOworICAgIGJjbXRyX2NsZF9hY3RpdmVfbGV2ZWxbZGV2aWNlXVttc2dfaWRdID0gY2xkX2xldmVsOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBHZXQgY2FwdHVyZSwgbG9nLCBkZWJ1ZyBmb3Igc2VsZWN0ZWQgbWVzc2FnZSAqLworYmNtb3NfZXJybm8gYmNtdHJfY2xkX2xldmVsX2dldChiY21vbHRfZGV2aWQgZGV2aWNlLCBjb25zdCBiY210cl9jbGRfZmlsdGVyICpmaWx0ZXIsIGJjbXRyX2NsZF90eXBlICpjbGRfbGV2ZWwpCit7CisgICAgYmNtb2x0X2dyb3VwX2lkIG1zZ19pZDsKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBpZiAoKHVuc2lnbmVkKWRldmljZSA+PSBCQ01UUl9NQVhfT0xUUyB8fCAhZmlsdGVyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgcmMgPSBiY21vbHRfZ3JvdXBfaWRfY29tYmluZShmaWx0ZXItPm9iamVjdCwgZmlsdGVyLT5ncm91cCwgZmlsdGVyLT5zdWJncm91cCwgJm1zZ19pZCk7CisgICAgaWYgKHJjKQorICAgICAgICByZXR1cm4gcmM7CisgICAgQlVHX09OKCh1bnNpZ25lZCltc2dfaWQgPj0gQkNNT0xUX0dST1VQX0lEX19OVU1fT0YpOworICAgICpjbGRfbGV2ZWwgPSBiY210cl9jbGRfYWN0aXZlX2xldmVsW2RldmljZV1bbXNnX2lkXTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqIEluaXRpYWxpemUgY2FwdHVyZSAqLworYmNtb3NfZXJybm8gYmNtdHJfY2FwdHVyZV9pbml0KGJjbW9sdF9kZXZpZCBvbHQsIGNvbnN0IGJjbXRyX2NhcHR1cmVfcGFybSAqcGFybSkKK3sKKyAgICBiY210cl9jYXB0dXJlX2J1ZiAqdGI7CisKKyAgICBpZiAob2x0ID49IEJDTVRSX01BWF9PTFRTIHx8ICFwYXJtKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIGlmIChjYXB0dXJlX2J1ZltvbHRdLnN0YXJ0KQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoYmNtdHJfY2xkX3Nlc3Npb24sICJUUkFDRS8lZDogYWxyZWFkeSBpbml0aWFsaXplZFxuIiwgb2x0KTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBpZiAocGFybS0+c2l6ZSA8IEJDTVRSX0NBUFRVUkVfTUlOX0JVRl9TSVpFKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoYmNtdHJfY2xkX3Nlc3Npb24sICJUUkFDRS8lZDogY2FwdHVyZSBidWZmZXIgaXMgdG9vIHNtYWxsICgldSA8ICVkKVxuIiwKKyAgICAgICAgICAgIG9sdCwgcGFybS0+c2l6ZSwgQkNNVFJfQ0FQVFVSRV9NSU5fQlVGX1NJWkUpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIHRiID0gJmNhcHR1cmVfYnVmW29sdF07CisgICAgdGItPnNpemUgPSBwYXJtLT5zaXplICYgfjB4MzsKKyAgICAvKiBVc2VyLXN1cHBsaWVkIG9yIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBidWZmZXIgPyAqLworICAgIGlmIChwYXJtLT5wdHIpCisgICAgICAgIHRiLT5zdGFydCA9IHBhcm0tPnB0cjsKKyAgICBlbHNlCisgICAgeworICAgICAgICB0Yi0+c3RhcnQgPSBiY21vc19hbGxvYyhwYXJtLT5zaXplKTsKKyAgICAgICAgaWYgKCF0Yi0+c3RhcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KGJjbXRyX2NsZF9zZXNzaW9uLCAiVFJBQ0UvJWQ6IGNhbid0IGFsbG9jYXRlIGNhcHR1cmUgYnVmZmVyXG4iLCBvbHQpOworICAgICAgICAgICAgdGItPnNpemUgPSAwOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgICAgIH0KKyAgICB9CisgICAgdGItPmVuZCA9ICh2b2lkICopKChsb25nKXRiLT5zdGFydCArIHBhcm0tPnNpemUpOworICAgIHRiLT5jdXIgPSB0Yi0+c3RhcnQ7CisgICAgdGItPnVzZWQgPSB0Yi0+d2EgPSAwOworICAgIHRiLT5hY3RpdmUgPSBwYXJtLT5hY3RpdmF0ZTsKKyAgICB0Yi0+cGFybSA9ICpwYXJtOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qKiBEZXN0cm95IGNhcHR1cmUgYnVmZmVyICovCit2b2lkIGJjbXRyX2NhcHR1cmVfZGVzdHJveShiY21vbHRfZGV2aWQgb2x0KQoreworICAgIGJjbXRyX2NhcHR1cmVfYnVmICp0YjsKKworICAgIGlmIChvbHQgPj0gQkNNVFJfTUFYX09MVFMpCisgICAgICAgIHJldHVybjsKKyAgICB0YiA9ICZjYXB0dXJlX2J1ZltvbHRdOworICAgIHRiLT5hY3RpdmUgPSBCQ01PU19GQUxTRTsKKyAgICBpZiAodGItPnN0YXJ0ICYmICF0Yi0+cGFybS5wdHIpCisgICAgICAgIGJjbW9zX2ZyZWUodGItPnN0YXJ0KTsKKyAgICBtZW1zZXQodGIsIDAsIHNpemVvZigqdGIpKTsKK30KKworLyoqIEdldCBjYXB0dXJlIHJlY29yZGluZyBpbmZvICovCitiY21vc19lcnJubyBiY210cl9jYXB0dXJlX2luZm9fZ2V0KGJjbW9sdF9kZXZpZCBvbHQsIGJjbXRyX2NhcHR1cmVfaW5mbyAqaW5mbykKK3sKKyAgICBiY210cl9jYXB0dXJlX2J1ZiAqdGI7CisKKyAgICBpZiAob2x0ID49IEJDTVRSX01BWF9PTFRTIHx8ICFpbmZvKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIHRiID0gJmNhcHR1cmVfYnVmW29sdF07CisgICAgaWYgKHRiLT5hY3RpdmUpCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChiY210cl9jbGRfc2Vzc2lvbiwgIlRSQUNFLyVkOiBtdXN0IHN0b3AgZmlyc3RcbiIsIG9sdCk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorICAgIGluZm8tPnNpemUgPSB0Yi0+c2l6ZTsKKyAgICBpbmZvLT51c2VkID0gdGItPnVzZWQ7CisgICAgaW5mby0+d2EgICA9IHRiLT53YTsKKyAgICBpbmZvLT5tc2dzID0gX2JjbXRyX2NhcHR1cmVfbm1zZ3ModGIpOworICAgIGluZm8tPmxvc3QgPSB0Yi0+ZXZlbnRzIC0gaW5mby0+bXNnczsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtdHJfY2FwdHVyZV9zaXplX2dldChiY21vbHRfZGV2aWQgb2x0LCB1aW50MzJfdCAqc2l6ZSkKK3sKKyAgICBiY210cl9jYXB0dXJlX2J1ZiAqdGI7CisgICAgdWludDMyX3QgbiA9IDA7CisgICAgdWludDhfdCAqY3VyX2hkciA9IE5VTEw7CisgICAgdWludDMyX3QgaTsKKworICAgICpzaXplID0gMDsKKyAgICBpZiAob2x0ID49IEJDTVRSX01BWF9PTFRTKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgdGIgPSAmY2FwdHVyZV9idWZbb2x0XTsKKyAgICBpZiAoIXRiLT5zdGFydCkKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KGJjbXRyX2NsZF9zZXNzaW9uLCAiVFJBQ0UvJWQ6IG5vdCBpbml0aWFsaXplZFxuIiwgb2x0KTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgaWYgKHRiLT5hY3RpdmUpCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChiY210cl9jbGRfc2Vzc2lvbiwgIlRSQUNFLyVkOiBtdXN0IHN0b3AgZmlyc3RcbiIsIG9sdCk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgaWYgKCF0Yi0+dXNlZCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKworICAgIC8qIFVud2luZCBjYXB0dXJlIGJ1ZmZlciBiYWNrd2FyZCB0byBnZXQgdG8gdGhlIDFzdCByZWNvcmRlZCBtZXNzYWdlICovCisgICAgX2JjbXRyX2NhcHR1cmVfdW53aW5kKHRiLCAmY3VyX2hkciwgJm4pOworCisgICAgLyogImZpcnN0IiBwb2ludHMgdG8gdGhlIDFzdCByZWNvcmRlZCBlbnRyeSBhbmQgIm4iIGNvbnRhaW5zIG51bWJlciBvZiBtZXNzYWdlcy4KKyAgICAgKiBOb3cgZ28gZm9yd2FyZCBhbmQgY29weSB0byB0aGUgdXNlciBidWZmZXIKKyAgICAgKi8KKyAgICBCVUdfT04oIWN1cl9oZHIpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgeworICAgICAgICB1aW50MzJfdCBtc2dfc2l6ZSA9IF9iY210cl9jYXB0dXJlX21zZ19zaXplX2dldChjdXJfaGRyKSArIHNpemVvZihiY210cl9jYXB0dXJlX2VudHJ5KTsKKyAgICAgICAgdWludDMyX3Qgcm91bmRlZF9zaXplID0gQkNNT1NfUk9VTkRfVVAobXNnX3NpemUsIHNpemVvZih1aW50MzJfdCkpOworCisgICAgICAgICgqc2l6ZSkgKz0gbXNnX3NpemU7CisKKyAgICAgICAgLyogTW92ZSB0byB0aGUgbmV4dCBlbnRyeSBpbiBjYXB0dXJlIGJ1ZmZlciAqLworICAgICAgICBjdXJfaGRyICs9IHJvdW5kZWRfc2l6ZSArIHNpemVvZih1aW50MzJfdCk7CisgICAgICAgIF9iY210cl9jYXB0dXJlX3dyYXAoJmN1cl9oZHIsIHRiKTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtdHJfY2FwdHVyZV9yZWFkKGJjbW9sdF9kZXZpZCBvbHQsIHVpbnQ4X3QgKmJ1ZiwgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCAqbGVuZ3RoKQoreworICAgIGJjbXRyX2NhcHR1cmVfYnVmICp0YjsKKyAgICB1aW50MzJfdCBuID0gMDsKKyAgICB1aW50OF90ICpjdXJfaGRyID0gTlVMTDsKKyAgICB1aW50MzJfdCBjdXJfb2Zmc2V0ID0gMDsKKyAgICB1aW50MzJfdCBpOworCisgICAgaWYgKG9sdCA+PSBCQ01UUl9NQVhfT0xUUyB8fCAhYnVmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgdGIgPSAmY2FwdHVyZV9idWZbb2x0XTsKKyAgICBpZiAoIXRiLT5zdGFydCkKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KGJjbXRyX2NsZF9zZXNzaW9uLCAiVFJBQ0UvJWQ6IG5vdCBpbml0aWFsaXplZFxuIiwgb2x0KTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgaWYgKHRiLT5hY3RpdmUpCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChiY210cl9jbGRfc2Vzc2lvbiwgIlRSQUNFLyVkOiBtdXN0IHN0b3AgZmlyc3RcbiIsIG9sdCk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgaWYgKCF0Yi0+dXNlZCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKworICAgIC8qIFVud2luZCBjYXB0dXJlIGJ1ZmZlciBiYWNrd2FyZCB0byBnZXQgdG8gdGhlIDFzdCByZWNvcmRlZCBtZXNzYWdlICovCisgICAgX2JjbXRyX2NhcHR1cmVfdW53aW5kKHRiLCAmY3VyX2hkciwgJm4pOworCisgICAgLyogImZpcnN0IiBwb2ludHMgdG8gdGhlIDFzdCByZWNvcmRlZCBlbnRyeSBhbmQgIm4iIGNvbnRhaW5zIG51bWJlciBvZiBtZXNzYWdlcy4KKyAgICAgKiBOb3cgZ28gZm9yd2FyZCBhbmQgY29weSB0byB0aGUgdXNlciBidWZmZXIKKyAgICAgKi8KKyAgICBCVUdfT04oIWN1cl9oZHIpOworICAgIGZvciAoaSA9IDA7IChpIDwgbikgJiYgKCgqbGVuZ3RoKSA+IDApOyBpKyspCisgICAgeworICAgICAgICB1aW50MzJfdCBtc2dfc2l6ZSA9IF9iY210cl9jYXB0dXJlX21zZ19zaXplX2dldChjdXJfaGRyKTsKKyAgICAgICAgdWludDMyX3Qgcm91bmRlZF9zaXplID0gQkNNT1NfUk9VTkRfVVAobXNnX3NpemUsIHNpemVvZih1aW50MzJfdCkpOworCisgICAgICAgIGN1cl9vZmZzZXQgKz0gc2l6ZW9mKGJjbXRyX2NhcHR1cmVfZW50cnkpOworICAgICAgICBpZiAoY3VyX29mZnNldCA+IG9mZnNldCkKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdGVtcFtCQ01UUl9DQVBUVVJFX0VOVFJZX0ZJRUxEU107CisgICAgICAgICAgICB1aW50OF90IGo7CisKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBCQ01UUl9DQVBUVVJFX0VOVFJZX0ZJRUxEUzsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlbXBbal0gPSBCQ01PTFRfQlVGX0VORElBTl9DUFVfVE9fQlVGKFUzMiwgKigodWludDMyX3QqKShsb25nKWN1cl9oZHIpKTsKKyAgICAgICAgICAgICAgICBjdXJfaGRyICs9IHNpemVvZih1aW50MzJfdCk7CisgICAgICAgICAgICAgICAgX2JjbXRyX2NhcHR1cmVfd3JhcCgmY3VyX2hkciwgdGIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfYmNtdHJfY2FwdHVyZV9jb3B5X2JvdW5kZWQoCisgICAgICAgICAgICAgICAgdGIsCisgICAgICAgICAgICAgICAgJmJ1ZiwKKyAgICAgICAgICAgICAgICAodWludDhfdCopdGVtcCwKKyAgICAgICAgICAgICAgICBzaXplb2YoYmNtdHJfY2FwdHVyZV9lbnRyeSksCisgICAgICAgICAgICAgICAgbGVuZ3RoLAorICAgICAgICAgICAgICAgIGN1cl9vZmZzZXQgLSBvZmZzZXQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgY3VyX2hkciArPSBzaXplb2YoYmNtdHJfY2FwdHVyZV9lbnRyeSk7CisgICAgICAgIH0KKworICAgICAgICBjdXJfb2Zmc2V0ICs9IG1zZ19zaXplOworICAgICAgICBpZiAoY3VyX29mZnNldCA+IG9mZnNldCkKKyAgICAgICAgeworICAgICAgICAgICAgX2JjbXRyX2NhcHR1cmVfY29weV9ib3VuZGVkKAorICAgICAgICAgICAgICAgIHRiLAorICAgICAgICAgICAgICAgICZidWYsCisgICAgICAgICAgICAgICAgY3VyX2hkciwKKyAgICAgICAgICAgICAgICBtc2dfc2l6ZSwKKyAgICAgICAgICAgICAgICBsZW5ndGgsCisgICAgICAgICAgICAgICAgY3VyX29mZnNldCAtIG9mZnNldCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBNb3ZlIHRvIHRoZSBuZXh0IGVudHJ5IGluIGNhcHR1cmUgYnVmZmVyICovCisgICAgICAgIGN1cl9oZHIgKz0gcm91bmRlZF9zaXplICsgc2l6ZW9mKHVpbnQzMl90KTsKKyAgICAgICAgX2JjbXRyX2NhcHR1cmVfd3JhcCgmY3VyX2hkciwgdGIpOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19ib29sIGJjbXRyX2NhcHR1cmVfZW50cnlfZ2V0X25leHQoYmNtb2x0X2J1ZiAqYnVmLCBiY210cl9jYXB0dXJlX2VudHJ5ICpoZHIsIHVpbnQ4X3QgKiptc2cpCit7CisgICAgYmNtb3NfYm9vbCB2YWxpZDsKKworICAgIEJVR19PTihidWYgPT0gTlVMTCk7CisgICAgQlVHX09OKGhkciA9PSBOVUxMKTsKKworICAgIHZhbGlkID0gYmNtdHJfY2FwdHVyZV9lbnRyeV91bnBhY2soYnVmLCBoZHIpOworICAgIGlmIChtc2cgIT0gTlVMTCkKKyAgICB7CisgICAgICAgICptc2cgPSBiY21vbHRfYnVmX3NuYXBfZ2V0KGJ1Zik7CisgICAgfQorICAgIHJldHVybiB2YWxpZCAmJiBiY21vbHRfYnVmX3NraXAoYnVmLCBoZHItPm1zZ19zaXplKTsKK30KKworLyoqIERlY29kZSBhbmQgZHVtcCBjYXB0dXJlIHJlY29yZGluZyAqLworYmNtb3NfZXJybm8gYmNtdHJfY2FwdHVyZV9kdW1wKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBiY21vbHRfZGV2aWQgb2x0LCB1aW50MzJfdCAqbm1zZ3MpCit7CisgICAgYmNtdHJfY2FwdHVyZV9lbnRyeSBoZHI7CisgICAgdWludDhfdCAqbXNnX3N0YXJ0OworICAgIGJjbW9sdF9idWYgYnVmOworICAgIHVpbnQ4X3QgKmRhdGE7CisgICAgdWludDMyX3QgbGVuZ3RoOworICAgIHVpbnQzMl90IHJlbWFpbmluZzsKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIHJjID0gYmNtdHJfY2FwdHVyZV9zaXplX2dldChvbHQsICZsZW5ndGgpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihCQ01fRVJSX09LICE9IHJjLCByYyk7CisKKyAgICAvKiBBbGxvY2F0ZSB0ZW1wIGJ1ZmZlciBhbmQgcmVhZCBkYXRhIGludG8gaXQgKi8KKyAgICBkYXRhID0gYmNtb3NfY2FsbG9jKGxlbmd0aCk7CisgICAgaWYgKGRhdGEgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJUUkFDRS8lZDogbm8gbWVtb3J5XG4iLCBvbHQpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICB9CisKKyAgICByZW1haW5pbmcgPSBsZW5ndGg7CisgICAgcmMgPSBiY210cl9jYXB0dXJlX3JlYWQob2x0LCBkYXRhLCAwLCAmcmVtYWluaW5nKTsKKyAgICBpZiAoQkNNX0VSUl9PSyAhPSByYykKKyAgICB7CisgICAgICAgIGJjbW9zX2ZyZWUoZGF0YSk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICAvKiBEdW1wICovCisgICAgYmNtb2x0X2J1Zl9pbml0KCZidWYsIGxlbmd0aCAtIHJlbWFpbmluZywgZGF0YSwgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpOworICAgIHdoaWxlIChiY210cl9jYXB0dXJlX2VudHJ5X2dldF9uZXh0KCZidWYsICZoZHIsICZtc2dfc3RhcnQpKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2J1ZiBtc2dfYnVmOworICAgICAgICBiY21vbHRfbXNnICptc2cgPSBOVUxMOworICAgICAgICBiY21vc19lcnJubyBlcnI7CisKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIlxuJTA4eCAlczpcbiIsIGhkci50aW1lc3RhbXAsIGJjbXRyX2NsZF9ldmVudF9uYW1lKGhkci5ldmVudCkpOworICAgICAgICBiY21vbHRfYnVmX2luaXQoJm1zZ19idWYsIGhkci5tc2dfc2l6ZSwgbXNnX3N0YXJ0LCBCQ01PTFRfQlVGX0VORElBTl9GSVhFRCk7CisgICAgICAgIGVyciA9IGJjbW9sdF9tc2dfdW5wYWNrKCZtc2dfYnVmLCAmbXNnKTsKKyAgICAgICAgaWYgKEJDTV9FUlJfT0sgPT0gZXJyKQorICAgICAgICB7CisgICAgICAgICAgICAodm9pZClhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgbXNnKTsKKyAgICAgICAgICAgIGJjbW9sdF9tc2dfZnJlZShtc2cpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25faGV4ZHVtcChzZXNzaW9uLCBtc2dfc3RhcnQsIDAsIGhkci5tc2dfc2l6ZSwgTlVMTCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBiY21vc19mcmVlKGRhdGEpOworCisgICAgKm5tc2dzID0gX2JjbXRyX2NhcHR1cmVfbm1zZ3MoJmNhcHR1cmVfYnVmW29sdF0pOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qKiAoUmUpc3RhcnQgLyBTdXNwZW5kIGNhcHR1cmUgcmVjb3JkaW5nICovCitiY21vc19lcnJubyBiY210cl9jYXB0dXJlX3N0YXJ0X3N0b3AoYmNtb2x0X2RldmlkIG9sdCwgYmNtb3NfYm9vbCBzdGFydCkKK3sKKyAgICBpZiAob2x0ID49IEJDTVRSX01BWF9PTFRTKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIGlmICghY2FwdHVyZV9idWZbb2x0XS5zdGFydCAmJiBzdGFydCkKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KGJjbXRyX2NsZF9zZXNzaW9uLAorICAgICAgICAgICAgIlRSQUNFLyVkOiBDYW4ndCBzdGFydCByZWNvcmRpbmcgLSBtdXN0IGluaXRpYWxpemUgZmlyc3RcbiIsIG9sdCk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorICAgIGNhcHR1cmVfYnVmW29sdF0uYWN0aXZlID0gc3RhcnQ7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Jvb2wgYmNtdHJfY2FwdHVyZV9pc19hY3RpdmUoYmNtb2x0X2RldmlkIG9sdCkKK3sKKyAgICByZXR1cm4gY2FwdHVyZV9idWZbb2x0XS5hY3RpdmU7Cit9CisKK2JjbW9zX2Jvb2wgYmNtdHJfY2FwdHVyZV9lbnRyeV91bnBhY2soYmNtb2x0X2J1ZiAqYnVmLCBiY210cl9jYXB0dXJlX2VudHJ5ICplbnRyeSkKK3sKKyAgICByZXR1cm4KKyAgICAgICAgYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICZlbnRyeS0+bXNnX3NpemUpICYmCisgICAgICAgIGJjbW9sdF9idWZfcmVhZF91MzIoYnVmLCAmZW50cnktPmV2ZW50KSAmJgorICAgICAgICBiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgJmVudHJ5LT50aW1lc3RhbXApOworfQorCisvKiBOb3RpZnkgbWVzc2FnZSB0byBjYXB0dXJlIG1vZHVsZSAtIGNhbGxlZCBmcm9tIHRoZSB0cmFuc3BvcnQgbGF5ZXIgKi8KK3N0YXRpYyB2b2lkIGJjbXRyX2NhcHR1cmVfbm90aWZ5KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGNvbnN0IGJjbXRyX2hkciAqdHJoZHIsCisgICAgYmNtdHJfY2xkX2V2ZW50X3R5cGUgZXYsIHVpbnQzMl90IHRzLAorICAgIGNvbnN0IHZvaWQgKnBhY2tlZCwgdWludDMyX3QgcGFja2VkX2xlbmd0aCwgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGJjbXRyX2NhcHR1cmVfYnVmICp0YjsKKyAgICBiY210cl9jYXB0dXJlX2VudHJ5IGhkcjsKKyAgICB1aW50MzJfdCByb3VuZGVkX3NpemU7CisKKyAgICB0YiA9ICZjYXB0dXJlX2J1ZltkZXZpY2VdOworCisgICAgLyogU2FuaXR5ICovCisgICAgaWYgKCFwYWNrZWQpCisgICAgICAgIHJldHVybjsKKyAgICBoZHIubXNnX3NpemUgPSBwYWNrZWRfbGVuZ3RoOworICAgIC8qIEVuYWJsZSAmIG92ZXJmbG93IGNoZWNrcyAqLworICAgIGlmICghdGItPmFjdGl2ZSkKKyAgICAgICAgcmV0dXJuOworICAgIGlmICh0Yi0+cGFybS5zdG9wX29uX2Z1bGwgJiYgKHRiLT51c2VkICsgaGRyLm1zZ19zaXplICsgQkNNVFJfQ0FQVFVSRV9PVkVSSEVBRF9TSVpFID4gdGItPnNpemUpKQorICAgICAgICByZXR1cm47CisgICAgaGRyLnRpbWVzdGFtcCA9IHRzOworICAgIGhkci5ldmVudCA9IGV2OworICAgIHJvdW5kZWRfc2l6ZSA9IEJDTU9TX1JPVU5EX1VQKGhkci5tc2dfc2l6ZSwgc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgX2JjbXRyX2NhcHR1cmVfc3RvcmUodGIsICZoZHIsIHNpemVvZihoZHIpKTsKKyAgICBfYmNtdHJfY2FwdHVyZV9zdG9yZSh0YiwgcGFja2VkLCByb3VuZGVkX3NpemUpOyAvKiBvdmVyZmxvdyBieSB1cCB0byAzIGJ5dGVzOyBpcyB0aGlzIHNhZmU/ICovCisgICAgcm91bmRlZF9zaXplICs9IHNpemVvZihiY210cl9jYXB0dXJlX2VudHJ5KSArIHNpemVvZih1aW50MzJfdCk7CisgICAgX2JjbXRyX2NhcHR1cmVfc3RvcmUodGIsICZyb3VuZGVkX3NpemUsIHNpemVvZihyb3VuZGVkX3NpemUpKTsKKyAgICArK3RiLT5ldmVudHM7Cit9CisKKy8qIE5vdGlmeSBtZXNzYWdlIHRvIGxvZ2dlciAqLworc3RhdGljIHZvaWQgYmNtdHJfbG9nX25vdGlmeShiY21vbHRfZGV2aWQgZGV2aWNlLCBjb25zdCBiY210cl9oZHIgKmhkciwKKyAgICBiY210cl9jbGRfZXZlbnRfdHlwZSBldiwgdWludDMyX3QgdHMsCisgICAgY29uc3Qgdm9pZCAqcGFja2VkLCB1aW50MzJfdCBwYWNrZWRfbGVuZ3RoLCBiY21vbHRfbXNnICptc2cpCit7CisjaWZkZWYgRU5BQkxFX0xPRworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfb2JqX2lkIG9iajsKKyAgICBiY21vbHRfbWd0X2dyb3VwIGdyb3VwOworICAgIHVpbnQxNl90IHN1Ymdyb3VwOworICAgIGNvbnN0IGNoYXIgKm9ial9uYW1lOworICAgIGNvbnN0IGNoYXIgKnN1Ymdyb3VwX25hbWU7CisgICAgY29uc3QgY2hhciAqZHVtbXlfc3RyOworCisgICAgZXJyID0gYmNtb2x0X2dyb3VwX2lkX3NwbGl0KGhkci0+bXNnX2lkLCAmb2JqLCAmZ3JvdXAsICZzdWJncm91cCk7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOKGVyciAhPSBCQ01fRVJSX09LLCBlcnIsKTsKKworICAgIGVyciA9IGFwaV9jbGlfb2JqZWN0X25hbWUob2JqLCAmb2JqX25hbWUsICZkdW1teV9zdHIpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTihlcnIgIT0gQkNNX0VSUl9PSywgZXJyLCk7CisKKyAgICBlcnIgPSBhcGlfY2xpX29iamVjdF9zdWJncm91cF9uYW1lKG9iaiwgZ3JvdXAsIHN1Ymdyb3VwLCAmc3ViZ3JvdXBfbmFtZSwgJmR1bW15X3N0cik7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOKGVyciAhPSBCQ01fRVJSX09LLCBlcnIsKTsKKworICAgIC8qIGxvZyB3aXRoIHRoZSBoZWFkZXIgYnV0IHdpdGhvdXQgZmlsZS9saW5lIG51bWJlciAoZmlsZS9saW5lIG51bWJlciBpc24ndCBoZWxwZnVsIGhlcmUpLiAqLworICAgIGJjbV9kZXZfbG9nX2xvZygKKyAgICAgICAgYmNtdHJfY2xkX2xvZ19pZCwKKyAgICAgICAgREVWX0xPR19MRVZFTF9JTkZPLAorICAgICAgICBCQ01fTE9HX0ZMQUdfTk9ORSwKKyAgICAgICAgIiVzICVzOiBjb3JyX3RhZz0ldSBpbnN0YW5jZT0lZCBvYmo9JXMgZ3JvdXA9JXMgc3ViZ3JwPSVzIG9yZ190cz0ldSBlcnI9JXNcbiIsCisgICAgICAgIGJjbXRyX2NsZF9ldmVudF9uYW1lKGV2KSwKKyAgICAgICAgaGRyLT5kaXIgPT0gQkNNT0xUX01TR19ESVJfUkVTUE9OU0UgPyAicmVzcG9uc2UiIDogInJlcXVlc3QiLAorICAgICAgICBoZHItPmNvcnJfdGFnLAorICAgICAgICBoZHItPmluc3RhbmNlLAorICAgICAgICBvYmpfbmFtZSwKKyAgICAgICAgYXBpY2xpX21ndF9ncm91cF90b19zdHIoZ3JvdXApLAorICAgICAgICBzdWJncm91cF9uYW1lLAorICAgICAgICB0cywKKyAgICAgICAgbXNnID8gYmNtb3Nfc3RyZXJyb3IobXNnLT5lcnIpIDogIk4vQSIpOworI2VuZGlmCit9CisKKy8qIER1bXAgbWVzc2FnZSBoZWFkZXIgYW5kL29yIGJvZHkgKi8KK3N0YXRpYyB2b2lkIGJjbXRyX2R1bXBfbm90aWZ5KAorICAgIGJjbW9sdF9kZXZpZCBkZXZpY2UsCisgICAgY29uc3QgYmNtdHJfaGRyICpoZHIsCisgICAgYmNtdHJfY2xkX2V2ZW50X3R5cGUgZXYsCisgICAgdWludDMyX3QgdHMsCisgICAgY29uc3Qgdm9pZCAqcGFja2VkLAorICAgIHVpbnQzMl90IHBhY2tlZF9sZW5ndGgsCisgICAgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY210cl9jbGRfdHlwZSB2YWwgPSBiY210cl9jbGRfYWN0aXZlX2xldmVsW2RldmljZV1baGRyLT5tc2dfaWRdOworICAgIGJjbW9sdF9vYmpfaWQgb2JqOworICAgIGJjbW9sdF9tZ3RfZ3JvdXAgZ3JvdXA7CisgICAgdWludDE2X3Qgc3ViZ3JvdXA7CisgICAgY29uc3QgY2hhciAqb2JqX25hbWU7CisgICAgY29uc3QgY2hhciAqc3ViZ3JvdXBfbmFtZTsKKyAgICBjb25zdCBjaGFyICpkdW1teV9zdHI7CisKKyAgICBlcnIgPSBiY21vbHRfZ3JvdXBfaWRfc3BsaXQoaGRyLT5tc2dfaWQsICZvYmosICZncm91cCwgJnN1Ymdyb3VwKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk4oZXJyICE9IEJDTV9FUlJfT0ssIGVyciwpOworCisgICAgZXJyID0gYXBpX2NsaV9vYmplY3RfbmFtZShvYmosICZvYmpfbmFtZSwgJmR1bW15X3N0cik7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOKGVyciAhPSBCQ01fRVJSX09LLCBlcnIsKTsKKworICAgIGVyciA9IGFwaV9jbGlfb2JqZWN0X3N1Ymdyb3VwX25hbWUob2JqLCBncm91cCwgc3ViZ3JvdXAsICZzdWJncm91cF9uYW1lLCAmZHVtbXlfc3RyKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk4oZXJyICE9IEJDTV9FUlJfT0ssIGVyciwpOworCisgICAgLyogYWx3YXlzIGR1bXAgdGhlIG1lc3NhZ2UgaGVhZGVyIHRvIHRoZSBzY3JhdGNoIENMSSBzZXNzaW9uICovCisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoCisgICAgICAgIGJjbXRyX2NsZF9zY3JhdGNoX3Nlc3Npb24sCisgICAgICAgICJbLS0gQ0xEOiAlcyAlczogY29ycl90YWc9JXUgaW5zdGFuY2U9JWQgbXNnX2lkPSVkIG9iaj0lcyglZCkgZ3JvdXA9JXMoJWQpIHN1YmdycD0lcyglZCkiLAorICAgICAgICBiY210cl9jbGRfZXZlbnRfbmFtZShldiksCisgICAgICAgIGhkci0+ZGlyID09IEJDTU9MVF9NU0dfRElSX1JFU1BPTlNFID8gInJlc3BvbnNlIiA6ICJyZXF1ZXN0IiwKKyAgICAgICAgaGRyLT5jb3JyX3RhZywKKyAgICAgICAgaGRyLT5pbnN0YW5jZSwKKyAgICAgICAgaGRyLT5tc2dfaWQsCisgICAgICAgIG9ial9uYW1lLCBvYmosCisgICAgICAgIGFwaWNsaV9tZ3RfZ3JvdXBfdG9fc3RyKGdyb3VwKSwgZ3JvdXAsCisgICAgICAgIHN1Ymdyb3VwX25hbWUsIHN1Ymdyb3VwKTsKKworICAgIGlmIChoZHItPm1vcmVfZnJhZ21lbnRzIHx8IChoZHItPmZyYWdfbnVtYmVyICE9IDApKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoCisgICAgICAgICAgICBiY210cl9jbGRfc2NyYXRjaF9zZXNzaW9uLAorICAgICAgICAgICAgIiBtb3JlX2ZyYWdtZW50cz0lZCBmcmFnbWVudF9udW1iZXI9JXUiLAorICAgICAgICAgICAgaGRyLT5tb3JlX2ZyYWdtZW50cywKKyAgICAgICAgICAgIGhkci0+ZnJhZ19udW1iZXIpOworICAgIH0KKworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KGJjbXRyX2NsZF9zY3JhdGNoX3Nlc3Npb24sICIgLS1dXG4iKTsKKworICAgIC8qIGlmIGNvbmZpZ3VyZWQgZm9yIGEgZnVsbCBtZXNzYWdlIGR1bXAsIHdyaXRlIHRoZSBtZXNzYWdlIGRhdGEgdG8gdGhlIHNjcmF0Y2ggc2Vzc2lvbiAqLworICAgIGlmICgodmFsICYgQkNNVFJfQ0xEX0RVTVApID09IEJDTVRSX0NMRF9EVU1QKQorICAgIHsKKyAgICAgICAgaWYgKG1zZyAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChiY210cl9jbGRfc2NyYXRjaF9zZXNzaW9uLCAiWy0tIENMRCBNZXNzYWdlIER1bXAgU3RhcnQgLS1dXG4iKTsKKyAgICAgICAgICAgIGFwaWNsaV9tc2dfZHVtcChiY210cl9jbGRfc2NyYXRjaF9zZXNzaW9uLCBtc2cpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoYmNtdHJfY2xkX3NjcmF0Y2hfc2Vzc2lvbiwgIlstLSBDTEQgTWVzc2FnZSBIZXggRHVtcCBTdGFydCAtLV1cbiIpOworICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25faGV4ZHVtcChiY210cl9jbGRfc2NyYXRjaF9zZXNzaW9uLCBwYWNrZWQsIDAsIHBhY2tlZF9sZW5ndGgsIE5VTEwpOworICAgICAgICB9CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KGJjbXRyX2NsZF9zY3JhdGNoX3Nlc3Npb24sICJbLS0gQ0xEIE1lc3NhZ2UgRHVtcCBFbmQgLS1dXG4iKTsKKyAgICB9CisKKyAgICAvKiBXcml0ZSB0aGUgc2NyYXRjaCBzZXNzaW9uJ3MgYnVmZmVyIHRvIHRoZSByZWFsIENMSSBhbmQgcmVzZXQgaXQgKi8KKyAgICBiY21jbGlfc2Vzc2lvbl93cml0ZShiY210cl9jbGRfc2Vzc2lvbiwgYmNtdHJfY2xkX3NjcmF0Y2hfYnVmLCBiY210cl9jbGRfc2NyYXRjaF9wb3MpOworICAgIGJjbXRyX2NsZF9zY3JhdGNoX3BvcyA9IDA7Cit9CisKKy8qIE5vdGlmeSBjYXB0dXJlLCBsb2csIGRlYnVnICovCit2b2lkIGJjbXRyX2NsZF9ub3RpZnkoYmNtb2x0X2RldmlkIGRldmljZSwgY29uc3QgYmNtdHJfaGRyICpoZHIsCisgICAgYmNtdHJfY2xkX2V2ZW50X3R5cGUgZXYsIHVpbnQzMl90IHRzLCBjb25zdCB1aW50OF90ICpwYWNrZWQsIHVpbnQzMl90IHBhY2tlZF9sZW5ndGgsCisgICAgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGJjbXRyX2NsZF90eXBlIHZhbCA9IGJjbXRyX2NsZF9hY3RpdmVfbGV2ZWxbZGV2aWNlXVtoZHItPm1zZ19pZF07CisKKyAgICBpZiAoKHZhbCAmIEJDTVRSX0NMRF9DQVBUVVJFKSkKKyAgICAgICAgYmNtdHJfY2FwdHVyZV9ub3RpZnkoZGV2aWNlLCBoZHIsIGV2LCB0cywgcGFja2VkLCBwYWNrZWRfbGVuZ3RoLCBtc2cpOworICAgIGlmICgodmFsICYgQkNNVFJfQ0xEX0xPRykpCisgICAgICAgIGJjbXRyX2xvZ19ub3RpZnkoZGV2aWNlLCBoZHIsIGV2LCB0cywgcGFja2VkLCBwYWNrZWRfbGVuZ3RoLCBtc2cpOworICAgIGlmICgodmFsICYgQkNNVFJfQ0xEX0RVTVApKQorICAgICAgICBiY210cl9kdW1wX25vdGlmeShkZXZpY2UsIGhkciwgZXYsIHRzLCBwYWNrZWQsIHBhY2tlZF9sZW5ndGgsIG1zZyk7Cit9CisKKworYmNtb3NfZXJybm8gYmNtdHJfY2xkX2luaXQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbWNsaV9zZXNzaW9uX3Bhcm0gc2NyYXRjaF9zZXNzaW9uX3Bhcm0gPSB7IC53cml0ZSA9IGJjbXRyX2xvZ19jbGlfcHJpbnQgfTsKKworICAgIGVyciA9IGJjbWNsaV9zZXNzaW9uX29wZW5fdXNlcigmc2NyYXRjaF9zZXNzaW9uX3Bhcm0sICZiY210cl9jbGRfc2NyYXRjaF9zZXNzaW9uKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoZXJyICE9IEJDTV9FUlJfT0ssIGVycik7CisKKyAgICBiY210cl9jbGRfc2Vzc2lvbiA9IHNlc3Npb247CisKKyNpZmRlZiBFTkFCTEVfTE9HCisgICAgYmNtdHJfY2xkX2xvZ19pZCA9IGJjbV9kZXZfbG9nX2lkX3JlZ2lzdGVyKCJjbGQiLCBERVZfTE9HX0xFVkVMX0lORk8sIERFVl9MT0dfSURfVFlQRV9CT1RIKTsKKyNlbmRpZgorCisjaWZkZWYgRU5BQkxFX0NMSQorICAgIGVyciA9IGJjbXRyX2NsZF9jbGlfaW5pdCgpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihlcnIgIT0gQkNNX0VSUl9PSywgZXJyKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qKiBDbGVhbiB1cCB0cmFuc3BvcnQgY2FwdHVyZSwgbG9nLCBkZWJ1ZyBzZXJ2aWNlCisgKi8KK3ZvaWQgYmNtdHJfY2xkX2V4aXQodm9pZCkKK3sKKyNpZmRlZiBFTkFCTEVfQ0xJCisgICAgYmNtdHJfY2xkX2NsaV9leGl0KCk7CisjZW5kaWYKKyAgICBpZiAoYmNtdHJfY2xkX3NjcmF0Y2hfc2Vzc2lvbikKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX2Nsb3NlKGJjbXRyX2NsZF9zY3JhdGNoX3Nlc3Npb24pOworICAgICAgICBiY210cl9jbGRfc2NyYXRjaF9zZXNzaW9uID0gTlVMTDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L2JjbXRyX2RlYnVnLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L2JjbXRyX2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY5MDc0OAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci90cmFuc3BvcnQvYmNtdHJfZGVidWcuaApAQCAtMCwwICsxLDI1NyBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBCQ01UUl9ERUJVR19IXworI2RlZmluZSBCQ01UUl9ERUJVR19IXworCisjaW5jbHVkZSA8YmNtX2NvbmZpZy5oPgorI2luY2x1ZGUgPGJjbW9sdF9tc2dfcGFjay5oPgorI2luY2x1ZGUgPGJjbXRyX2hlYWRlci5oPgorI2luY2x1ZGUgPGJjbW9sdF9tc2cuaD4KKyNpbmNsdWRlIDxiY21jbGkuaD4KKworLyogQ0xEIHN0YW5kcyBmb3IgY2FwdHVyZSxsb2csZGVidWcgKi8KKworLyoqIENhcHR1cmUsIGxvZywgZGVidWcgdHlwZSAqLwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNVFJfQ0xEX05PTkUgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBPZmYgKi8KKyAgICBCQ01UUl9DTERfQ0FQVFVSRSAgID0gMHgwMSwgICAgICAgICAvKio8IE1lc3NhZ2UgY2FwdHVyZSAqLworICAgIEJDTVRSX0NMRF9MT0cgICAgICAgPSAweDAyLCAgICAgICAgIC8qKjwgTWVzc2FnZSBsb2dnaW5nICovCisgICAgQkNNVFJfQ0xEX0RVTVBfSERSICA9IDB4MDQsICAgICAgICAgLyoqPCBNZXNzYWdlIGhlYWRlciBkdW1wICovCisgICAgQkNNVFJfQ0xEX0RVTVAgICAgICA9IDB4MEMsICAgICAgICAgLyoqPCBNZXNzYWdlIGhlYWRlciBhbmQgYm9keSBkdW1wICovCit9IGJjbXRyX2NsZF90eXBlOworCisvKiogRXZlbnQgdHlwZSAqLwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNVFJfQ0xEX0VWX1NFTkQsICAgICAgICAgICAgICAgICAgLyoqPCBTZW5kIG1lc3NhZ2UgKi8KKyAgICBCQ01UUl9DTERfRVZfUkVTRU5ELCAgICAgICAgICAgICAgICAvKio8IFJldHJhbnNtaXQgbWVzc2FnZSAqLworICAgIEJDTVRSX0NMRF9FVl9SRUNWLCAgICAgICAgICAgICAgICAgIC8qKjwgUmVjZWl2ZSBtZXNzYWdlICovCisgICAgQkNNVFJfQ0xEX0VWX1JFQ1ZfRElTQ0FSRCwgICAgICAgICAgLyoqPCBSZWNlaXZlIG1lc3NhZ2UgZGlzY2FyZGVkICovCisgICAgQkNNVFJfQ0xEX0VWX1RJTUVPVVQsICAgICAgICAgICAgICAgLyoqPCBSZXF1ZXN0IHRpbWVkIG91dCB3YWl0aW5nIGZvciByZXNwb25zZSAqLworfSBiY210cl9jbGRfZXZlbnRfdHlwZTsKKworLyoqIENhcHR1cmUsIGxvZywgZGVidWcgZmlsdGVyICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIGJjbW9sdF9tZ3RfZ3JvdXAgZ3JvdXA7ICAgICAvKio8IE1lc3NhZ2UgZ3JvdXAuIENhbiBiZSBCQ01PTFRfTUdUX0dST1VQX0FOWSAqLworICAgIGJjbW9sdF9vYmpfaWQgb2JqZWN0OyAgICAgICAvKio8IE9iamVjdC4gQ2FuIGJlIEJDTU9MVF9PQkpFQ1RfQU5ZICovCisgICAgdWludDE2X3Qgc3ViZ3JvdXA7ICAgICAgICAgIC8qKjwgTWVzc2FnZSBzdWJncm91cC4gQ2FuIGJlIEJDTU9MVF9TVUJHUk9VUF9BTlkgKi8KK30gYmNtdHJfY2xkX2ZpbHRlcjsKKworLyoqIEluaXRpYWxpemUgdHJhbnNwb3J0IGNhcHR1cmUsbG9nLCBkZWJ1ZyBzZXJ2aWNlCisgKiBccGFyYW1baW5dICAgcGFyZW50ICBQYXJlbnQgQ0xJIGRpcmVjdG9yeS4gQ2FuIGJlIE5VTEwKKyAqIFxyZXR1cm5zIEJDTV9FUlJfT0sgb3IgZXJyb3IgY29kZQorICovCitiY21vc19lcnJubyBiY210cl9jbGRfaW5pdChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbik7CisKKy8qKiBDbGVhbiB1cCB0cmFuc3BvcnQgY2FwdHVyZSwgbG9nLCBkZWJ1ZyBzZXJ2aWNlCisgKi8KK3ZvaWQgYmNtdHJfY2xkX2V4aXQodm9pZCk7CisKKy8qKiBTZXQgY2FwdHVyZSwgbG9nLCBkZWJ1ZyBmb3Igc2VsZWN0ZWQgbWVzc2FnZXMKKyAqIFxwYXJhbVtpbl0gICBkZXZpY2UgICAgICAgICAgRGV2aWNlIGlkCisgKiBccGFyYW1baW5dICAgZmlsdGVyICAgICAgICAgIE1lc3NhZ2UgZmlsdGVyCisgKiBccGFyYW1baW5dICAgY2xkX2xldmVsICAgICAgIENhcHR1cmUsIGxvZywgZGVidWcgbGV2ZWwuIENhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIEJDTVRSX0NMRF8uLiBjb25zdGFudHMKKyAqIFxyZXR1cm5zIEJDTV9FUlJfT0sgb3IgZXJyb3IgY29kZQorICovCitiY21vc19lcnJubyBiY210cl9jbGRfbGV2ZWxfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGNvbnN0IGJjbXRyX2NsZF9maWx0ZXIgKmZpbHRlciwgYmNtdHJfY2xkX3R5cGUgY2xkX2xldmVsKTsKKworLyoqIEdldCBjYXB0dXJlLCBsb2csIGRlYnVnIGZvciBzZWxlY3RlZCBtZXNzYWdlCisgKiBccGFyYW1baW5dICAgZGV2aWNlICAgICAgICAgIERldmljZSBpZAorICogXHBhcmFtW2luXSAgIGZpbHRlciAgICAgICAgICBNZXNzYWdlIGZpbHRlci4gV2lsZGNhcmRzIGFyZSBub3QgYWxsb3dlZC4KKyAqIFxwYXJhbVtvdXRdICBjbGRfbGV2ZWwgICAgICAgQ2FwdHVyZSwgbG9nLCBkZWJ1ZyBsZXZlbAorICogXHJldHVybnMgQkNNX0VSUl9PSyBvciBlcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX2NsZF9sZXZlbF9nZXQoYmNtb2x0X2RldmlkIGRldmljZSwgY29uc3QgYmNtdHJfY2xkX2ZpbHRlciAqZmlsdGVyLCBiY210cl9jbGRfdHlwZSAqY2xkX2xldmVsKTsKKworLyoKKyAqIE1lc3NhZ2UgY2FwdHVyZSBmdW5jdGlvbnMKKyAqLworCisvKioKKyAqIE1lc3NhZ2UgY2FwdHVyZSBmYWNpbGl0eSBhbGxvd3MgY2FwdHVyaW5nIG1lc3NhZ2VzIGJldHdlZW4gdGhlIGhvc3QKKyAqIGFuZCBPTFQgYXQgcmVhbCB0aW1lLiBUaGUgcmVjb3JkZWQgdHJhY2UgY2FuIGJlIGR1bXBlZCBpbgorICogaHVtYW4gcmVhZGFibGUgZm9ybWF0IG9yICJwbGF5ZWQgYmFjayIgaW4gb3JkZXIgdG8gcmVwcm9kdWNlCisgKiB0aGUgY29uZmlndXJhdGlvbiB1bmRlciB0ZXN0LgorICogQHsKKyAqLworCisvKiogTWluaW1hbCB0cmFjZSBidWZmZXIgc2l6ZSAoYnl0ZXMpICovCisjZGVmaW5lIEJDTVRSX0NBUFRVUkVfTUlOX0JVRl9TSVpFICAgICAgICAgICgxNioxMDI0KQorCisvKiogQ2FwdHVyZSBidWZmZXIgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzICovCit0eXBlZGVmIHN0cnVjdCBiY210cl9jYXB0dXJlX3Bhcm0KK3sKKyAgICB1aW50MzJfdCBzaXplOyAgICAgICAgICAgICAgLyoqPCBDYXB0dXJlIGJ1ZmZlciBzaXplLiBNdXN0IGJlIGF0IGxlYXN0IFxyZWYgQkNNVFJfQ0FQVFVSRV9NSU5fQlVGX1NJWkUgYnl0ZXMgKi8KKyAgICB2b2lkICpwdHI7ICAgICAgICAgICAgICAgICAgLyoqPCBPcHRpb25hbCBjYXB0dXJlIGJ1ZmZlciBwb2ludGVyLiBBbGxvY2F0ZWQgYXV0b21hdGljYWxseSBpZiBOVUxMICovCisgICAgYmNtb3NfYm9vbCBzdG9wX29uX2Z1bGw7ICAgIC8qKjwgVFJVRS1zdG9wIHJlY29yZGluZyB3aGVuIGJ1ZmZlciBpcyBmdWxsLiBGQUxTRT1jaXJjdWxhciBidWZmZXIgKi8KKyAgICBiY21vc19ib29sIGFjdGl2YXRlOyAgICAgICAgLyoqPCBBdXRvLWFjdGl2YXRlIGNhcHR1cmUgaW1tZWRpYXRlbHkgYWZ0ZXIgaW5pdCAqLworfSBiY210cl9jYXB0dXJlX3Bhcm07CisKKy8qKiBDYXB0dXJlIGluZm8gcmVjb3JkICovCit0eXBlZGVmIHN0cnVjdCBiY210cl9jYXB0dXJlX2luZm8KK3sKKyAgICB1aW50MzJfdCBzaXplOyAgICAgICAgICAgICAgLyoqPCBDYXB0dXJlIGJ1ZmZlciBzaXplICovCisgICAgdWludDMyX3QgdXNlZDsgICAgICAgICAgICAgIC8qKjwgVXNlZCBieXRlcyAqLworICAgIHVpbnQzMl90IHdhOyAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiB0aW1lcyBjYXB0dXJlIGJ1ZmZlciB3cmFwcGVkIGFyb3VuZCAqLworICAgIHVpbnQzMl90IG1zZ3M7ICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjb21wbGV0ZSBtZXNzYWdlcyBzdG9yZWQgaW4gdGhlIGNhcHR1cmUgYnVmZmVyICovCisgICAgdWludDMyX3QgbG9zdDsgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIG1lc3NhZ2VzIGxvc3QgZHVlIHRvIGJ1ZmZlciBvdmVyZmxvdyAqLworfSBiY210cl9jYXB0dXJlX2luZm87CisKKy8qIENhcHR1cmUgZW50cnkgaGVhZGVyCisgKgorICogRm9sbG93ZWQgYnkgbXNnX3NpemUgYnl0ZXMgb2YgbWVzc2FnZSBkYXRhCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDMyX3QgbXNnX3NpemU7ICAgICAgICAgIC8qKjwgTWVzc2FnZSBzaXplIChieXRlcyk7IE1VU1QgYmUgdGhlIGZpcnN0IG1lbWJlciAqLworICAgIHVpbnQzMl90IGV2ZW50OyAgICAgICAgICAgICAvKio8IGJjbXRyX2NsZF9ldmVudF90eXBlIGV2ZW50ICovCisgICAgdWludDMyX3QgdGltZXN0YW1wOyAgICAgICAgIC8qKjwgTWVzc2FnZSB0aW1lc3RhbXAgKHVzKSAqLworICAgIC8qIEZvbGxvd2VkIGJ5IG1lc3NhZ2UgZGF0YSBwYWRkZWQgdG8gdGhlIG5lYXJlc3QgNCBieXRlcyAqLworfSBiY210cl9jYXB0dXJlX2VudHJ5OworCisvKiogSW5pdGlhbGl6ZSBjYXB0dXJlIGJ1ZmZlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgZmlyc3QuCisgKiBccGFyYW1baW5dICAgb2x0ICAgICBPbHQgaW5kZXgKKyAqIFxwYXJhbVtpbl0gICBjZmcgICAgIENhcHR1cmUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCisgKiBccmV0dXJuIDA9c3VjY2VzcyBvciBlcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX2NhcHR1cmVfaW5pdChiY21vbHRfZGV2aWQgb2x0LCBjb25zdCBiY210cl9jYXB0dXJlX3Bhcm0gKnBhcm0pOworCisvKiogRGVzdHJveSBjYXB0dXJlIGJ1ZmZlcgorICoKKyAqIERlc3Ryb3kgYnVmZmVyIGluaXRpYWxpemVkIGJ5IGJjbXRyX2NhcHR1cmVfSW5pdCgpLgorICogXHBhcmFtW2luXSAgIG9sdCAgICAgT2x0IGluZGV4CisgKiBGb2xsb3dpbmcgdGhpcyBjYWxsIGFsbCByZWNvcmRpbmcgaXMgbG9zdC4KKyAqLwordm9pZCBiY210cl9jYXB0dXJlX2Rlc3Ryb3koYmNtb2x0X2RldmlkIG9sdCk7CisKKy8qKiBHZXQgY2FwdHVyZSByZWNvcmRpbmcgaW5mbworICoKKyAqIFxwYXJhbVtpbl0gICBvbHQgICAgIE9sdCBpbmRleAorICogXHBhcmFtW291dF0gIGluZm8gICAgQ2FwdHVyZSBpbmZvcm1hdGlvbgorICogXHJldHVybiAwPXN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQorICovCitiY21vc19lcnJubyBiY210cl9jYXB0dXJlX2luZm9fZ2V0KGJjbW9sdF9kZXZpZCBvbHQsIGJjbXRyX2NhcHR1cmVfaW5mbyAqaW5mbyk7CisKKy8qKiBHZXQgdGhlIG51bWJlciBvZiByZWFkYWJsZSBieXRlcyBpbiB0aGUgY2FwdHVyZSBidWZmZXIKKyAqCisgKiBccGFyYW1baW5dICAgb2x0ICAgICAgICAgICAgIE9MVCBpbmRleAorICogXHBhcmFtW291dF0gIHNpemUgICAgICAgICAgICBOdW1iZXIgb2YgcmVhZGFibGUgYnl0ZXMKKyAqLworYmNtb3NfZXJybm8gYmNtdHJfY2FwdHVyZV9zaXplX2dldChiY21vbHRfZGV2aWQgb2x0LCB1aW50MzJfdCAqc2l6ZSk7CisKKy8qKiBSZWFkIHBvcnRpb24gb2YgY2FwdHVyZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgcmVjb3JkZWQgZGF0YSBpbnRvIGEgdXNlciBidWZmZXIgc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZQorICogY2FwdHVyZSB1cCB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4gQXBwbGljYXRpb25zIGNhbiB1c2UgdGhpcyBmdW5jdGlvbiBpbiBvcmRlciB0byBzYXZlIGNhcHR1cmUgaW50byBmaWxlIG9yIGR1bXAgaXQuCisgKgorICogXHBhcmFtW2luXSAgIG9sdCAgICAgICAgICAgICBPTFQgaW5kZXgKKyAqIFxwYXJhbVtvdXRdICBidWYgICAgICAgICAgICAgVXNlciBidWZmZXIKKyAqIFxwYXJhbVtpbl0gICBvZmZzZXQgICAgICAgICAgQnVmZmVyIG9mZnNldCB0byBzdGFydCByZWFkIChieXRlcykKKyAqIFxwYXJhbVtpbi9vdXRdICBsZW5ndGggICAgICAgaW46IE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgaW50byB0aGUgdXNlciBidWZmZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0OiBSZW1haW5pbmcgdW51c2VkIGJ5dGVzIGluIHVzZXIgYnVmZmVyCisgKiBccmV0dXJuIDA9c3VjY2VzcyBvciBlcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX2NhcHR1cmVfcmVhZChiY21vbHRfZGV2aWQgb2x0LCB1aW50OF90ICpidWYsIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3QgKmxlbmd0aCk7CisKKy8qKiBBZHZhbmNlIGJ1ZmZlciB0byBuZXh0IGNhcHR1cmUgZW50cnkKKyAqCisgKiBIZWxwZXIgZnVuY3Rpb24gdXNlZCB0byBzY2FuIGJ1ZmZlciByZWFkIGJ5IGJjbXRyX2NhcHR1cmVfcmVhZCgpCisgKgorICogXHBhcmFtW2luL291dF0gICBidWYgICAgICAgICBDYXB0dXJlIGJ1ZmZlcgorICogXHBhcmFtW291dF0gICAgICBoZHIgICAgICAgICBDYXB0dXJlIGVudHJ5IGhlYWRlcgorICogXHBhcmFtW291dF0gICAgICBtc2cgICAgICAgICBQb2ludGVyIHRvIHBhY2tlZCBtZXNzYWdlCisgKi8KK2JjbW9zX2Jvb2wgYmNtdHJfY2FwdHVyZV9lbnRyeV9nZXRfbmV4dChiY21vbHRfYnVmICpidWYsIGJjbXRyX2NhcHR1cmVfZW50cnkgKmhkciwgdWludDhfdCAqKm1zZyk7CisKKy8qKiBEZWNvZGUgYW5kIGR1bXAgY2FwdHVyZSByZWNvcmRpbmcKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGludGVycHJldHMgYW5kIGR1bXBzIGNhcHR1cmUgcmVjb3JkaW5nLgorICoKKyAqIFxwYXJhbVtpbl0gICBzZXNzaW9uIENMSSBzZXNzaW9uCisgKiBccGFyYW1baW5dICAgb2x0ICAgICBPTFQgaW5kZXgKKyAqIFxwYXJhbVtvdXRdICBubXNncyAgIE51bWJlciBvZiBtZXNzYWdlcyBkdW1wZWQKKyAqIFxyZXR1cm4gMD1zdWNjZXNzIG9yIGVycm9yIGNvZGUKKyAqLworYmNtb3NfZXJybm8gYmNtdHJfY2FwdHVyZV9kdW1wKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBiY21vbHRfZGV2aWQgb2x0LCB1aW50MzJfdCAqbm1zZ3MpOworCisvKiogKFJlKXN0YXJ0IC8gU3VzcGVuZCBjYXB0dXJlIHJlY29yZGluZworICoKKyAqIFxwYXJhbVtpbl0gICBvbHQgICAgIE9MVCBpbmRleAorICogXHBhcmFtW2luXSAgIHN0YXJ0ICAgVFJVRT1zdGFydCwgRkFMU0U9c3VzcGVuZAorICogXHJldHVybiAwPXN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQorICovCitiY21vc19lcnJubyBiY210cl9jYXB0dXJlX3N0YXJ0X3N0b3AoYmNtb2x0X2RldmlkIG9sdCwgYmNtb3NfYm9vbCBzdGFydCk7CisKKy8qKiBBcmUgd2UgYWN0aXZlbHkgY2FwdHVyaW5nPworICoKKyAqIFxwYXJhbVtpbl0gICBvbHQgICAgIE9MVCBpbmRleAorICogXHJldHVybiBUUlVFPWFjdGl2ZWx5IGNhcHR1cmluZywgRkFMU0U9Tk9UIGNhcHR1cmluZworICovCitiY21vc19ib29sIGJjbXRyX2NhcHR1cmVfaXNfYWN0aXZlKGJjbW9sdF9kZXZpZCBvbHQpOworCisvKiogQ29udmVydCBlbnRyeSB0byBwbGF0Zm9ybSBzcGVjaWZpYyBmb3JtYXQKKyAqCisgKiBccGFyYW1baW4vb3V0XSAgIGJ1ZiAgICAgQ2FwdHVyZSBidWZmZXIKKyAqIFxwYXJhbVtvdXRdICAgICAgZW50cnkgICBDYXB0dXJlIGVudHJ5IGhlYWRlcgorICoKKyAqIFxyZXR1cm4gVFJVRSBpZiBzdWNjZXNzLCBGQUxTRSBvdGhlcndpc2UKKyAqLworYmNtb3NfYm9vbCBiY210cl9jYXB0dXJlX2VudHJ5X3VucGFjayhiY21vbHRfYnVmICpidWYsIGJjbXRyX2NhcHR1cmVfZW50cnkgKmVudHJ5KTsKKworLyoKKyAqIEludGVybmFsIGZ1bmN0aW9ucyAtIGNhbGxlZCBmcm9tIHRyYW5zcG9ydCBsZXZlbAorICovCisKKy8qIFBlci1PTFQsIHBlci1jb21tYW5kIGNvbWJpbmVkIHRyYWNlLGxvZyxkZWJ1ZyBsZXZlbCAqLworZXh0ZXJuIGJjbXRyX2NsZF90eXBlIGJjbXRyX2NsZF9hY3RpdmVfbGV2ZWxbQkNNVFJfTUFYX09MVFNdW0JDTU9MVF9HUk9VUF9JRF9fTlVNX09GXTsKKworLyogTm90aWZ5IG1lc3NhZ2UuCisgKiBDYWxsZWQgYnkgdHJhbnNwb3J0IGxheWVyCisgKi8KK3ZvaWQgYmNtdHJfY2xkX25vdGlmeShiY21vbHRfZGV2aWQgZGV2aWNlLCBjb25zdCBiY210cl9oZHIgKmhkciwKKyAgICBiY210cl9jbGRfZXZlbnRfdHlwZSBldiwgdWludDMyX3QgdHMsIGNvbnN0IHVpbnQ4X3QgKnBhY2tlZCwgdWludDMyX3QgcGFja2VkX2xlbmd0aCwKKyAgICBiY21vbHRfbXNnICptc2cpOworCisvKiBDaGVjayBpZiBDTEQgaXMgZW5hYmxlZCBmb3IgdGhlIG1lc3NhZ2UgYW5kIHJlY29yZCBpZiB5ZXMKKyAqIENhbGxlZCBieSB0cmFuc3BvcnQgbGF5ZXIKKyAqLworI2RlZmluZSBCQ01UUl9DTERfQ0hFQ0tfTk9USUZZKF9kZXZpY2UsIF9oZHIsIF9ldiwgX3RzLCBfcGFja2VkLCBfcGFja2VkX2xlbmd0aCwgX21zZykgXAorICAgIGRvIHtcCisgICAgICAgIGlmIChiY210cl9jbGRfYWN0aXZlX2xldmVsW19kZXZpY2VdWyhfaGRyKS0+bXNnX2lkXSkgXAorICAgICAgICB7IFwKKyAgICAgICAgICAgIGJjbXRyX2NsZF9ub3RpZnkoX2RldmljZSwgX2hkciwgX2V2LCBfdHMsIF9wYWNrZWQsIF9wYWNrZWRfbGVuZ3RoLCBfbXNnKTsgXAorICAgICAgICB9IFwKKyAgICB9IHdoaWxlICgwKQorCisjZW5kaWYgLyogQkNNVFJfREVCVUdfSF8gKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci90cmFuc3BvcnQvYmNtdHJfZGVidWdfY2xpLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L2JjbXRyX2RlYnVnX2NsaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYjdkODIKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L2JjbXRyX2RlYnVnX2NsaS5jCkBAIC0wLDAgKzEsNDQwIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtdHJfZGVidWcuaD4KKyNpbmNsdWRlIDxiY210cl9kZWJ1Z19jbGkuaD4KKyNpbmNsdWRlIDxiY21fYXBpX2NsaV9oZWxwZXJzLmg+CisjaWZkZWYgQkNNX1NVQlNZU1RFTV9IT1NUCisjaW5jbHVkZSA8YmNtb2x0X2Rldl9zZWxlY3Rvci5oPgorI2VuZGlmCisKKyNkZWZpbmUgQkNNVFJfQ0xEX0NBU1RfRElTQ0FSRF9DT05TVChwLCB0eXBlKSAgICAgICAodHlwZSkoKGxvbmcpKHApKQorCitzdGF0aWMgYmNtY2xpX2VudHJ5ICpjbGRfY2xpX2RpcjsKKworc3RhdGljIGJjbW9zX2Vycm5vIF9iY210cl9jbGRfY2xpX2NyZWF0ZSh2b2lkKTsKK3N0YXRpYyB2b2lkIF9iY210cl9jbGRfY2xpX2Rlc3Ryb3kodm9pZCk7CisKKy8qCisgKiBDTEkgaGFuZGxlcnMKKyAqLworCitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbXRyX2NsZF9jbGlfc2V0Z2V0X2xldmVsKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgYmNtY2xpX251bWJlciBvYmogPSBiY21jbGlfcGFybV9nZXQoc2Vzc2lvbiwgIm9iamVjdCIpLT52YWx1ZS5udW1iZXI7CisgICAgYmNtY2xpX2NtZF9wYXJtICpncnBfcGFybSA9IGJjbWNsaV9wYXJtX2dldChzZXNzaW9uLCAiZ3JvdXAiKTsKKyAgICBiY21jbGlfbnVtYmVyIGdyb3VwID0gZ3JwX3Bhcm0gPyBncnBfcGFybS0+dmFsdWUubnVtYmVyIDogLTE7CisgICAgYmNtY2xpX2NtZF9wYXJtICpzdWJncnBfcGFybSA9IGJjbWNsaV9wYXJtX2dldChzZXNzaW9uLCAic3ViZ3JvdXAiKTsKKyAgICBiY21jbGlfbnVtYmVyIHN1Ymdyb3VwID0gc3ViZ3JwX3Bhcm0gPyBzdWJncnBfcGFybS0+dmFsdWUubnVtYmVyIDogLTE7CisgICAgYmNtdHJfY2xkX3R5cGUgbGV2ZWwgPSBiY21jbGlfcGFybV9nZXQoc2Vzc2lvbiwgImxldmVsIiktPnZhbHVlLm51bWJlcjsKKyAgICBiY210cl9jbGRfZmlsdGVyIGZpbHRlciA9IHt9OworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgaWYgKG9iaiA9PSAtMSB8fCAhYmNtY2xpX3Bhcm1faXNfc2V0KHNlc3Npb24sIGJjbWNsaV9wYXJtX2dldChzZXNzaW9uLCAib2JqZWN0IikpKQorICAgIHsKKyAgICAgICAgZmlsdGVyLm9iamVjdCA9IEJDTU9MVF9PQkpFQ1RfQU5ZOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmaWx0ZXIub2JqZWN0ID0gb2JqOworICAgIH0KKworICAgIGlmIChncm91cCA9PSAtMSB8fCAhZ3JwX3Bhcm0gfHwgIWJjbWNsaV9wYXJtX2lzX3NldChzZXNzaW9uLCBncnBfcGFybSkpCisgICAgeworICAgICAgICBmaWx0ZXIuZ3JvdXAgPSBCQ01PTFRfTUdUX0dST1VQX0FOWTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZmlsdGVyLmdyb3VwID0gZ3JvdXA7CisgICAgfQorCisgICAgaWYgKHN1Ymdyb3VwID09IC0xIHx8ICFzdWJncnBfcGFybSB8fCAhYmNtY2xpX3Bhcm1faXNfc2V0KHNlc3Npb24sIHN1YmdycF9wYXJtKSkKKyAgICB7CisgICAgICAgIGZpbHRlci5zdWJncm91cCA9IEJDTU9MVF9TVUJHUk9VUF9BTlk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZpbHRlci5zdWJncm91cCA9IHN1Ymdyb3VwOworICAgIH0KKworICAgIC8qIEdldCBvciBzZXQgbGV2ZWwgPyAqLworICAgIGlmIChiY21jbGlfcGFybV9pc19zZXQoc2Vzc2lvbiwgYmNtY2xpX3Bhcm1fZ2V0KHNlc3Npb24sICJsZXZlbCIpKSkKKyAgICB7CisgICAgICAgIHJjID0gYmNtdHJfY2xkX2xldmVsX3NldChjdXJyZW50X2RldmljZSwgJmZpbHRlciwgbGV2ZWwpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByYyA9IGJjbXRyX2NsZF9sZXZlbF9nZXQoY3VycmVudF9kZXZpY2UsICZmaWx0ZXIsICZsZXZlbCk7CisgICAgICAgIGlmIChyYyA9PSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiY2FwdHVyZTolcyBsb2c6JXMgZHVtcDolc1xuIiwKKyAgICAgICAgICAgICAgICAobGV2ZWwgJiBCQ01UUl9DTERfQ0FQVFVSRSkgPyAib24iIDogIm9mZiIsCisgICAgICAgICAgICAgICAgKGxldmVsICYgQkNNVFJfQ0xEX0xPRykgPyAib24iIDogIm9mZiIsCisgICAgICAgICAgICAgICAgKChsZXZlbCAmIEJDTVRSX0NMRF9EVU1QKSA9PSBCQ01UUl9DTERfRFVNUCkgPyAiYWxsIiA6CisgICAgICAgICAgICAgICAgICAgIChsZXZlbCAmIEJDTVRSX0NMRF9EVU1QX0hEUikgPyAiaGVhZGVycyIgOiAib2ZmIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfYmNtdHJfY2xkX2NsaV9jYXB0dXJlX2luaXQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICBiY21jbGlfbnVtYmVyIHNpemUgPSBiY21jbGlfcGFybV9nZXQoc2Vzc2lvbiwgInNpemUiKS0+dmFsdWUubnVtYmVyOworICAgIGJjbW9zX2Jvb2wgc3RvcF9vbl9mdWxsID0gYmNtY2xpX3Bhcm1fZ2V0KHNlc3Npb24sICJzdG9wX29uX2Z1bGwiKS0+dmFsdWUubnVtYmVyOworICAgIGJjbW9zX2Jvb2wgYXV0b3N0YXJ0ID0gYmNtY2xpX3Bhcm1fZ2V0KHNlc3Npb24sICJhdXRvc3RhcnQiKS0+dmFsdWUubnVtYmVyOworICAgIGJjbXRyX2NhcHR1cmVfcGFybSBwID0ge307CisKKyAgICBwLnNpemUgPSBzaXplOworICAgIHAuc3RvcF9vbl9mdWxsID0gc3RvcF9vbl9mdWxsOworICAgIHAuYWN0aXZhdGUgPSBhdXRvc3RhcnQ7CisKKyAgICByZXR1cm4gYmNtdHJfY2FwdHVyZV9pbml0KGN1cnJlbnRfZGV2aWNlLCAmcCk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfYmNtdHJfY2xkX2NsaV9jYXB0dXJlX2RlbGV0ZShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIGJjbXRyX2NhcHR1cmVfZGVzdHJveShjdXJyZW50X2RldmljZSk7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfYmNtdHJfY2xkX2NsaV9jYXB0dXJlX3N0YXJ0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgcmV0dXJuIGJjbXRyX2NhcHR1cmVfc3RhcnRfc3RvcChjdXJyZW50X2RldmljZSwgQkNNT1NfVFJVRSk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfYmNtdHJfY2xkX2NsaV9jYXB0dXJlX3N0b3AoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICByZXR1cm4gYmNtdHJfY2FwdHVyZV9zdGFydF9zdG9wKGN1cnJlbnRfZGV2aWNlLCBCQ01PU19GQUxTRSk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfYmNtdHJfY2xkX2NsaV9jYXB0dXJlX2R1bXAoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICB1aW50MzJfdCBubXNnczsKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIHJjID0gYmNtdHJfY2FwdHVyZV9kdW1wKHNlc3Npb24sIGN1cnJlbnRfZGV2aWNlLCAmbm1zZ3MpOworICAgIGlmICghcmMpCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiRHVtcGVkICV1IG1lc3NhZ2VzXG4iLCBubXNncyk7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfYmNtdHJfY2xkX2NsaV9jYXB0dXJlX2luZm8oYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICBiY210cl9jYXB0dXJlX2luZm8gaW5mbzsKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIHJjID0gYmNtdHJfY2FwdHVyZV9pbmZvX2dldChjdXJyZW50X2RldmljZSwgJmluZm8pOworICAgIGlmICghcmMpCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiQnVmZmVyOiBzaXplPSV1IHVzZWQ9JXUuIEV2ZW50czogcmVjb3JkZWQ9JXUgbG9zdD0lZC4gV3JhcHMgYXJvdW5kOiV1XG4iLAorICAgICAgICAgICAgaW5mby5zaXplLCBpbmZvLnVzZWQsIGluZm8ubXNncywgaW5mby5sb3N0LCBpbmZvLndhKTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworCisjaWZkZWYgQkNNX1NVQlNZU1RFTV9IT1NUCisvKiBDdXJyZW50IGRldmljZSBjaGFuZ2UgaW5kaWNhdGlvbiAqLworc3RhdGljIHZvaWQgX2JjbXRyX2NsZF9kZXZpY2VfY2hhbmdlX2luZChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYmNtb2x0X2RldmlkIGRldikKK3sKKyAgICBiY21jbGlfZW50cnkgKmN1cl9kaXIgPSBiY21jbGlfZGlyX2dldChzZXNzaW9uKTsKKyAgICBiY21vc19ib29sIGlzX2NsZF9jdXJfZGlyID0gKGN1cl9kaXIgJiYgY3VyX2RpciA9PSBjbGRfY2xpX2Rpcik7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICAvKiBEZXN0cm95IGFuZCByZS1jcmVhdGUgQ0xEIENMSSBkaXJlY3RvcnkgKi8KKyAgICBfYmNtdHJfY2xkX2NsaV9kZXN0cm95KCk7CisgICAgcmMgPSBfYmNtdHJfY2xkX2NsaV9jcmVhdGUoKTsKKworICAgIC8qIFJlc3RvcmUgY3VycmVudCBDTEkgZGlyZWN0b3J5IHRvIENMRCAqLworICAgIGlmICghcmMgJiYgaXNfY2xkX2N1cl9kaXIpCisgICAgICAgIGJjbWNsaV9kaXJfc2V0KHNlc3Npb24sIGNsZF9jbGlfZGlyKTsKK30KKyNlbmRpZgorCisvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIG5hbWUgYW5kIGRlc2NyaXB0aW9uIGFuZCBjb3B5IHRvIHRvIHBhcm0gKi8KK3N0YXRpYyBiY21vc19lcnJubyBfYmNtdHJfY2xkX2NvcHlfcGFybV9uYW1lKGJjbWNsaV9jbWRfcGFybSAqcGFybSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZGVzY3IpCit7CisgICAgcGFybS0+bmFtZSA9IGJjbW9zX2FsbG9jKHN0cmxlbihuYW1lKSArIDEpOworICAgIHBhcm0tPmRlc2NyaXB0aW9uID0gYmNtb3NfYWxsb2Moc3RybGVuKGRlc2NyKSArIDEpOworICAgIGlmICgocGFybS0+bmFtZSA9PSBOVUxMKSB8fCAocGFybS0+ZGVzY3JpcHRpb24gPT0gTlVMTCkpCisgICAgeworICAgICAgICAvKiBTdWNjZXNzZnVsIGFsbG9jYXRpb24gaWYgYW55IHdpbGwgYmUgcmVsZWFzZWQgYnkgY29tbW9uIGNsZWFudXAKKyAgICAgICAgICogYWxvbmcgd2l0aCB0aGUgcmVzdCBvZiBkeW5hbWljIHBhcmFtZXRlciBmaWVsZHMgKi8KKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorICAgIHN0cmNweShCQ01UUl9DTERfQ0FTVF9ESVNDQVJEX0NPTlNUKHBhcm0tPm5hbWUsIHZvaWQgKiksIG5hbWUpOworICAgIHN0cmNweShCQ01UUl9DTERfQ0FTVF9ESVNDQVJEX0NPTlNUKHBhcm0tPmRlc2NyaXB0aW9uLCB2b2lkICopLCBkZXNjcik7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIEZyZWUgImxldmVsIiBjb21tYW5kIHBhcmFtZXRlcnMuIGJvdGggbmFtZSBhbmQgZGVzY3JpcHRpb24gYXJlIGFsbG9jYXRlZCBkeW5hbWljYWxseSAqLworc3RhdGljIHZvaWQgX2JjbXRyX2NsZF9mcmVlX2xldmVsX3Bhcm1zKGJjbWNsaV9jbWRfcGFybSAqcGFybXMpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpwID0gcGFybXM7CisKKyAgICB3aGlsZSAocC0+bmFtZSkKKyAgICB7CisgICAgICAgIGlmIChwLT50eXBlID09IEJDTUNMSV9QQVJNX0VOVU0gJiYgcC0+ZW51bV90YWJsZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChwLT5mbGFncyAmIEJDTUNMSV9QQVJNX0ZMQUdfU0VMRUNUT1IpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbWNsaV9lbnVtX3ZhbCAqZSA9IHAtPmVudW1fdGFibGU7CisgICAgICAgICAgICAgICAgd2hpbGUoZS0+bmFtZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChlLT5wYXJtcykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX2JjbXRyX2NsZF9mcmVlX2xldmVsX3Bhcm1zKGUtPnBhcm1zKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICArK2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYmNtb3NfZnJlZShwLT5lbnVtX3RhYmxlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocC0+ZGVzY3JpcHRpb24pCisgICAgICAgICAgICBiY21vc19mcmVlKEJDTVRSX0NMRF9DQVNUX0RJU0NBUkRfQ09OU1QocC0+ZGVzY3JpcHRpb24sIHZvaWQgKikpOworICAgICAgICBpZiAocC0+bmFtZSkKKyAgICAgICAgICAgIGJjbW9zX2ZyZWUoQkNNVFJfQ0xEX0NBU1RfRElTQ0FSRF9DT05TVChwLT5uYW1lLCB2b2lkICopKTsKKworICAgICAgICArK3A7CisgICAgfQorICAgIGJjbW9zX2ZyZWUocGFybXMpOworfQorCisvKiBBZGQgImxldmVsIiBjb21tYW5kICovCitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbXRyX2NsZF9hZGRfbGV2ZWxfY21kKGJjbWNsaV9lbnRyeSAqZGlyKQoreworICAgIC8qIG9iamVjdDogICAgICAgICAgICAqYWxsLCBvYmplY3QgbGlzdAorICAgICAqIGdyb3VwOiAgIHNlbGVjdG9yOiAqYWxsLCBncm91cCBsaXN0CisgICAgICogc3ViZ3JvdXA6ICAgICAgICAgICphbGwsIHN1Ymdyb3VwIGxpc3QKKyAgICAgKiBsZXZlbDogICBiaXRtYXNrCisgICAgICovCisgICAgYmNtY2xpX2NtZF9leHRyYV9wYXJtIGNtZF9leHRyYXMgPSB7IC5mcmVlX3Bhcm1zID0gX2JjbXRyX2NsZF9mcmVlX2xldmVsX3Bhcm1zIH07CisgICAgYmNtY2xpX2VudW1fdmFsICpvYmpfc2VsZWN0b3I7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbWRfcGFybXM7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmFsbF9uYW1lID0gIiphbGwiOworICAgIGJjbW9sdF9zeXN0ZW1fbW9kZSBjdXJyZW50X3N5c3RlbV9tb2RlOworICAgIGludCBuX29iaiA9IDA7CisgICAgYmNtb2x0X29ial9pZCBvOworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9OT01FTTsKKworICAgIC8qIEFsbG9jYXRlIHRvcCBsZXZlbCBwYXJhbWV0ZXJzOiBvYmplY3Qgc2VsZWN0b3IsIGxldmVsLCB0ZXJtaW5hdG9yICovCisgICAgY21kX3Bhcm1zID0gYmNtb3NfY2FsbG9jKHNpemVvZihiY21jbGlfY21kX3Bhcm0pICogMyk7CisgICAgaWYgKCFjbWRfcGFybXMpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICB9CisKKyAgICAvKiBBbGxvY2F0ZSBvYmplY3QgZW51bSB0YWJsZS4gMiBleHRyYSBlbnRyaWVzIGZvciAqYWxsIGFuZCB0ZXJtaW5hdG9yICovCisgICAgb2JqX3NlbGVjdG9yID0gYmNtb3NfY2FsbG9jKHNpemVvZihiY21jbGlfZW51bV92YWwpICogKEJDTU9MVF9PQkpfSURfX05VTV9PRiArIDIpKTsKKyAgICBpZiAoIW9ial9zZWxlY3RvcikKKyAgICB7CisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CisKKyAgICAvKiBGaWxsIHVwIHBhcmFtZXRlcnMgKi8KKyAgICByYyA9IF9iY210cl9jbGRfY29weV9wYXJtX25hbWUoJmNtZF9wYXJtc1swXSwgIm9iamVjdCIsICJPYmplY3QgTmFtZSIpOworICAgIGNtZF9wYXJtc1swXS50eXBlID0gQkNNQ0xJX1BBUk1fRU5VTTsKKyAgICBjbWRfcGFybXNbMF0uZmxhZ3MgPSBCQ01DTElfUEFSTV9GTEFHX1NFTEVDVE9SOworICAgIGNtZF9wYXJtc1swXS5lbnVtX3RhYmxlID0gb2JqX3NlbGVjdG9yOworCisgICAgcmMgPSByYyA/IHJjIDogX2JjbXRyX2NsZF9jb3B5X3Bhcm1fbmFtZSgmY21kX3Bhcm1zWzFdLCAibGV2ZWwiLCAiTGV2ZWwgYml0bWFzazogMT1jYXB0dXJlLDI9bG9nLDQ9cHJpbnQgaGRyLDg9cHJpbnQgYm9keSIpOworICAgIGNtZF9wYXJtc1sxXS50eXBlID0gQkNNQ0xJX1BBUk1fREVDSU1BTDsKKyAgICBjbWRfcGFybXNbMV0uZmxhZ3MgPSBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMOworCisgICAgLyogb2JqX3NlbGVjdG9yWzBdIGlzIHJlc2VydmVkIGZvciAqYWxsICovCisgICAgb2JqX3NlbGVjdG9yWzBdLm5hbWUgPSBhbGxfbmFtZTsKKyAgICBvYmpfc2VsZWN0b3JbMF0udmFsID0gLTE7CisKKyAgICAvKiBHbyBvdmVyIG9iamVjdHMgKi8KKyAgICBiY21vbHRfc3lzdGVtX21vZGVfZ2V0KGN1cnJlbnRfZGV2aWNlLCAmY3VycmVudF9zeXN0ZW1fbW9kZSk7CisgICAgZm9yIChvID0gMDsgbyA8IEJDTU9MVF9PQkpfSURfX05VTV9PRjsgbysrKQorICAgIHsKKyAgICAgICAgYmNtY2xpX2VudW1fdmFsICpncnBfc2VsZWN0b3I7CisgICAgICAgIGJjbWNsaV9jbWRfcGFybSAqZ3JwX3Bhcm07CisgICAgICAgIGJjbW9sdF9tZ3RfZ3JvdXAgZzsKKyAgICAgICAgaW50IG5fZ3JwID0gMDsKKworICAgICAgICBpZiAoIWJjbW9sdF9vYmplY3RfaXNfc3VwcG9ydGVkKGN1cnJlbnRfc3lzdGVtX21vZGUsIG8pKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgLyogQWxsb2NhdGUgZ3JvdXAgcGFyYW1ldGVyIGFuZCBzZWxlY3RvciAqLworICAgICAgICArK25fb2JqOworICAgICAgICBvYmpfc2VsZWN0b3Jbbl9vYmpdLnZhbCA9IG87CisgICAgICAgIHJjID0gYXBpX2NsaV9vYmplY3RfbmFtZShvLCAmb2JqX3NlbGVjdG9yW25fb2JqXS5uYW1lLCBOVUxMKTsKKyAgICAgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisKKyAgICAgICAgb2JqX3NlbGVjdG9yW25fb2JqXS5wYXJtcyA9IGdycF9wYXJtID0gYmNtb3NfY2FsbG9jKHNpemVvZihiY21jbGlfY21kX3Bhcm0pKjIpOworICAgICAgICBpZiAoIWdycF9wYXJtKQorICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICByYyA9IF9iY210cl9jbGRfY29weV9wYXJtX25hbWUoZ3JwX3Bhcm0sICJncm91cCIsICJNZXNzYWdlIGdyb3VwIik7CisgICAgICAgIGdycF9wYXJtLT50eXBlID0gQkNNQ0xJX1BBUk1fRU5VTTsKKyAgICAgICAgZ3JwX3Bhcm0tPmZsYWdzID0gQkNNQ0xJX1BBUk1fRkxBR19TRUxFQ1RPUjsKKyAgICAgICAgZ3JwX3Bhcm0tPmVudW1fdGFibGUgPSBncnBfc2VsZWN0b3IgPSBiY21vc19jYWxsb2Moc2l6ZW9mKGJjbWNsaV9lbnVtX3ZhbCkgKiAoQkNNT0xUX01HVF9HUk9VUF9fTlVNX09GICsgMSkpOworICAgICAgICBpZiAoIWdycF9zZWxlY3RvcikKKyAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKworICAgICAgICAvKiBTZWxlY3RvciAwIGlzIHJlc2VydmVkIGZvciAqYWxsICovCisgICAgICAgIGdycF9zZWxlY3RvclswXS5uYW1lID0gYWxsX25hbWU7CisgICAgICAgIGdycF9zZWxlY3RvclswXS52YWwgPSAtMTsKKworICAgICAgICAvKiBHbyBvdmVyIGdyb3VwcyAqLworICAgICAgICBmb3IgKGcgPSAxOyBnIDwgQkNNT0xUX01HVF9HUk9VUF9fTlVNX09GOyBnKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IHN1Ymdyb3VwX2NvdW50ID0gYXBpX2NsaV9nZXRfc3ViZ3JvdXBfY291bnQobywgZyk7CisgICAgICAgICAgICBiY21jbGlfZW51bV92YWwgKnN1YmdycF90YWJsZTsKKyAgICAgICAgICAgIGJjbWNsaV9jbWRfcGFybSAqc3ViZ3JwX3Bhcm07CisgICAgICAgICAgICB1aW50MTZfdCBzOworICAgICAgICAgICAgaW50IHNnX3RhYmxlX2lkeDsKKworICAgICAgICAgICAgaWYgKHN1Ymdyb3VwX2NvdW50ID09IDApCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICsrbl9ncnA7CisgICAgICAgICAgICBncnBfc2VsZWN0b3Jbbl9ncnBdLm5hbWUgPSBhcGljbGlfbWd0X2dyb3VwX3RvX3N0cihnKTsKKyAgICAgICAgICAgIGdycF9zZWxlY3RvcltuX2dycF0udmFsID0gZzsKKworICAgICAgICAgICAgLyogU2tpcCBzdWJncm91cCBzZWxlY3RvciBmb3IgZ3JvdXBzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBpdCAqLworICAgICAgICAgICAgaWYgKGcgIT0gQkNNT0xUX01HVF9HUk9VUF9BVVRPICAgICAgJiYKKyAgICAgICAgICAgICAgICBnICE9IEJDTU9MVF9NR1RfR1JPVVBfT1BFUiAgICAgICYmCisgICAgICAgICAgICAgICAgZyAhPSBCQ01PTFRfTUdUX0dST1VQX1BST1hZICAgICAmJgorICAgICAgICAgICAgICAgIGcgIT0gQkNNT0xUX01HVF9HUk9VUF9QUk9YWV9SWCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZ3JwX3NlbGVjdG9yW25fZ3JwXS5wYXJtcyA9IHN1YmdycF9wYXJtID0gYmNtb3NfY2FsbG9jKHNpemVvZihiY21jbGlfY21kX3Bhcm0pKjIpOworICAgICAgICAgICAgaWYgKCFzdWJncnBfcGFybSkKKyAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgICAgICByYyA9IHJjID8gcmMgOiBfYmNtdHJfY2xkX2NvcHlfcGFybV9uYW1lKHN1YmdycF9wYXJtLCAic3ViZ3JvdXAiLCAiTWVzc2FnZSBzdWItZ3JvdXAiKTsKKyAgICAgICAgICAgIHN1YmdycF9wYXJtLT50eXBlID0gQkNNQ0xJX1BBUk1fRU5VTTsKKyAgICAgICAgICAgIHN1YmdycF9wYXJtLT5lbnVtX3RhYmxlID0gc3ViZ3JwX3RhYmxlID0gYmNtb3NfY2FsbG9jKHNpemVvZihiY21jbGlfZW51bV92YWwpICogKHN1Ymdyb3VwX2NvdW50ICsgMikpOworICAgICAgICAgICAgaWYgKCFzdWJncnBfdGFibGUpCisgICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICAgICAgc3ViZ3JwX3RhYmxlWzBdLm5hbWUgPSBhbGxfbmFtZTsKKyAgICAgICAgICAgIHN1YmdycF90YWJsZVswXS52YWwgPSAtMTsKKworICAgICAgICAgICAgc2dfdGFibGVfaWR4ID0gMTsKKyAgICAgICAgICAgIGZvciAocyA9IDA7IHMgPCBzdWJncm91cF9jb3VudDsgcysrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChhcGlfY2xpX29iamVjdF9zdWJncm91cF9uYW1lKG8sIGcsIHMsICZzdWJncnBfdGFibGVbc2dfdGFibGVfaWR4XS5uYW1lLCBOVUxMKSA9PSBCQ01fRVJSX09LKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3ViZ3JwX3RhYmxlW3NnX3RhYmxlX2lkeF0udmFsID0gczsKKyAgICAgICAgICAgICAgICAgICAgKytzZ190YWJsZV9pZHg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogRmluYWxseSBhZGQgY29tbWFuZCAqLworICAgIHJjID0gYmNtY2xpX2NtZF9hZGQoZGlyLCAibGV2ZWwiLCBfYmNtdHJfY2xkX2NsaV9zZXRnZXRfbGV2ZWwsICJTZXQvZ2V0IGNsZCBsZXZlbCIsIEJDTUNMSV9BQ0NFU1NfQURNSU4sCisgICAgICAgICZjbWRfZXh0cmFzLCBjbWRfcGFybXMpOworICAgIGlmIChyYykKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIHJldHVybiBCQ01fRVJSX09LOworCitjbGVhbnVwOgorICAgIF9iY210cl9jbGRfZnJlZV9sZXZlbF9wYXJtcyhjbWRfcGFybXMpOworICAgIHJldHVybiByYzsKK30KKworLyogQ3JlYXRlIENMSSBjb21tYW5kcyAqLworc3RhdGljIGJjbW9zX2Vycm5vIF9iY210cl9jbGRfY2xpX2NyZWF0ZSh2b2lkKQoreworICAgIGJjbWNsaV9lbnRyeSAqZGlyOworICAgIGJjbW9zX2Vycm5vIGVycjsKKworICAgIGRpciA9IGJjbWNsaV9kaXJfYWRkKE5VTEwsICJjbGQiLCAiVHJhbnNwb3J0IENhcHR1cmUsIExvZywgRGVidWciLCBCQ01DTElfQUNDRVNTX0FETUlOLCBOVUxMKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoZGlyID09IE5VTEwsIEJDTV9FUlJfTk9NRU0pOworCisgICAgZXJyID0gX2JjbXRyX2NsZF9hZGRfbGV2ZWxfY21kKGRpcik7CisgICAgaWYgKGVycikKKyAgICAgICAgcmV0dXJuIGVycjsKKworICAgIEJDTUNMSV9NQUtFX0NNRChkaXIsICJpbml0IiwgIkluaXRpYWxpemUgY2FwdHVyZSBidWZmZXIiLCBfYmNtdHJfY2xkX2NsaV9jYXB0dXJlX2luaXQsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oInNpemUiLCAiQnVmZmVyIHNpemUgKGJ5dGVzKSIsIEJDTUNMSV9QQVJNX1VERUNJTUFMLCAwKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNKCJzdG9wX29uX2Z1bGwiLCAiU3RvcCBjYXB0dXJlIHdoZW4gYnVmZmVyIGlzIGZ1bGwgKHllcykgb3Igd3JhcC1hcm91bmQgKG5vKSIsCisgICAgICAgICAgICBiY21jbGlfZW51bV9ib29sX3RhYmxlLCAwKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNKCJhdXRvc3RhcnQiLCAiQXV0b3N0YXJ0IiwgYmNtY2xpX2VudW1fYm9vbF90YWJsZSwgMCkgKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oZGlyLCAiZGVsZXRlIiwgIkRlc3Ryb3kgYnVmZmVyIiwgX2JjbXRyX2NsZF9jbGlfY2FwdHVyZV9kZWxldGUpOworCisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJzdGFydCIsICJTdGFydCBjYXB0dXJlIiwgX2JjbXRyX2NsZF9jbGlfY2FwdHVyZV9zdGFydCk7CisKKyAgICBCQ01DTElfTUFLRV9DTURfTk9QQVJNKGRpciwgInN0b3AiLCAiU3RvcCBjYXB0dXJlIiwgX2JjbXRyX2NsZF9jbGlfY2FwdHVyZV9zdG9wKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oZGlyLCAiZHVtcCIsICJEdW1wIGNhcHR1cmUgYnVmZmVyIiwgX2JjbXRyX2NsZF9jbGlfY2FwdHVyZV9kdW1wKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oZGlyLCAiaW5mbyIsICJDYXB0dXJlIGluZm8iLCBfYmNtdHJfY2xkX2NsaV9jYXB0dXJlX2luZm8pOworCisgICAgY2xkX2NsaV9kaXIgPSBkaXI7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKKworfQorCisvKiBEZXN0cm95IENMSSBjb21tYW5kcyAqLworc3RhdGljIHZvaWQgX2JjbXRyX2NsZF9jbGlfZGVzdHJveSh2b2lkKQoreworICAgIGlmIChjbGRfY2xpX2RpcikKKyAgICB7CisgICAgICAgIGJjbWNsaV90b2tlbl9kZXN0cm95KGNsZF9jbGlfZGlyKTsKKyAgICAgICAgY2xkX2NsaV9kaXIgPSBOVUxMOworICAgIH0KK30KKworCisvKiogSW5pdGlhbGl6ZSBDTEQgQ0xJIGNvbW1hbmRzCisgKiBccmV0dXJucyBCQ01fRVJSX09LICgwKSBpZiBzdWNjZXNzZnVsCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX2NsZF9jbGlfaW5pdCh2b2lkKQoreworICAgIGJjbW9zX2Vycm5vIGVyciA9IEJDTV9FUlJfT0s7CisKKyNpZmRlZiBCQ01fU1VCU1lTVEVNX0hPU1QKKyAgICAvKiBTdWJzY3JpYmUgZm9yIGRldmljZSBjaGFuZ2UgaW5kaWNhdGlvbiAqLworICAgIGVyciA9IGJjbW9sdF9kZXZfc2VsX2luZF9yZWdpc3RlcihfYmNtdHJfY2xkX2RldmljZV9jaGFuZ2VfaW5kKTsKKyNlbmRpZgorCisgICAgZXJyID0gZXJyID8gZXJyIDogX2JjbXRyX2NsZF9jbGlfY3JlYXRlKCk7CisKKyAgICByZXR1cm4gZXJyOworfQorCisvKiogQ2xlYW4tdXAgQ0xEIENMSSBjb21tYW5kcyAqLwordm9pZCBiY210cl9jbGRfY2xpX2V4aXQodm9pZCkKK3sKKyAgICBfYmNtdHJfY2xkX2NsaV9kZXN0cm95KCk7Cit9CmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L2JjbXRyX2RlYnVnX2NsaS5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9iY210cl9kZWJ1Z19jbGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmI3ZTIwCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9iY210cl9kZWJ1Z19jbGkuaApAQCAtMCwwICsxLDQxIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaWZuZGVmIEJDTVRSX0RFQlVHX0NMSV9IXworI2RlZmluZSBCQ01UUl9ERUJVR19DTElfSF8KKworLyoqIEluaXRpYWxpemUgQ0xEIENMSSBjb21tYW5kcworICogXHJldHVybnMgQkNNX0VSUl9PSyAoMCkgaWYgc3VjY2Vzc2Z1bAorICovCitiY21vc19lcnJubyBiY210cl9jbGRfY2xpX2luaXQodm9pZCk7CisKKy8qKiBDbGVhbi11cCBDTEQgQ0xJIGNvbW1hbmRzICovCit2b2lkIGJjbXRyX2NsZF9jbGlfZXhpdCh2b2lkKTsKKworI2VuZGlmIC8qIEJDTVRSX0RFQlVHX0NMSV9IXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9iY210cl9oZWFkZXIuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci90cmFuc3BvcnQvYmNtdHJfaGVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY2MjUzNQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci90cmFuc3BvcnQvYmNtdHJfaGVhZGVyLmgKQEAgLTAsMCArMSwxNDIgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgQkNNVFJfSEVBREVSX0hfCisjZGVmaW5lIEJDTVRSX0hFQURFUl9IXworCisjaW5jbHVkZSA8YmNtb2x0X2J1Zi5oPgorI2luY2x1ZGUgPGJjbW9sdF9tc2dfcGFjay5oPgorCisvKiogRW5kaWFuZXNzIG9mIG51bWJlcnMgd3JpdHRlbiB0byB0aGUgdHJhbnNwb3J0IGJ1ZmZlci4KKyAqIEN1cnJlbnRseSBiY21vbHRfYnVmIHNlcnZpY2UgZG9lc24ndCBzdXBwb3J0IHNldHRpbmcKKyAqIGVuZGlhbm5lc3MgZHluYW1pY2FsbHkuIFRyYW5zcG9ydCBidWZmZXIgZGlyZWN0aW9uIG11c3QgYmUgdGhlIHNhbWUKKyAqIGFzIHNlbGVjdGVkIGF0IGNvbXBpbGUgdGltZSBpbiBiY21vbHRfYnVmLmgKKyAqLworI2RlZmluZSBCQ01UUl9CVUZfRU5ESUFOICAgICAgICBCQ01PTFRfQlVGX0VORElBTl9GSVhFRAorCisjZGVmaW5lIEJDTVRSX0VORElBTl9DUFVfVE9fQlVGX1UzMihuKSBCQ01PTFRfQlVGX0VORElBTl9DUFVfVE9fQlVGKFUzMiwgbikKKyNkZWZpbmUgQkNNVFJfRU5ESUFOX0JVRl9UT19DUFVfVTMyKG4pIEJDTU9MVF9CVUZfRU5ESUFOX0JVRl9UT19DUFUoVTMyLCBuKQorCisvKiogVHJhbnNwb3J0IGhlYWRlci4KKyAqIEluc2VydGVkIGluIGVhY2ggcGFja2V0IHRyYW5zbWl0dGVkIG9uIHRoZSBsaW5lCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbXRyX2hkcgoreworICAgIGJjbW9sdF9tc2dfZGlyIGRpcjsgICAgICAgICAvKio8IE1lc3NhZ2UgZGlyZWN0aW9uOiByZXF1ZXN0L3Jlc3BvbnNlICovCisgICAgYmNtb3NfYm9vbCBtb3JlX2ZyYWdtZW50czsgIC8qKjwgVFJVRT1tb3JlIGZyYWdtZW50cyB0byBmb2xsb3cgKi8KKyAgICBiY21vc19ib29sIGF1dG9fcHJveHlfcmVnOyAgLyoqPCBUUlVFPW1lc3NhZ2UgaXMgYXV0byAvIHByb3h5IHJlZ2lzdHJhdGlvbiAqLworICAgIGJjbW9zX2Jvb2wgYXV0b19wcm94eV91bnJlZzsvKio8IFRSVUU9bWVzc2FnZSBpcyBhdXRvIC8gcHJveHkgdW4tcmVnaXN0cmF0aW9uICovCisgICAgdWludDhfdCBpbnN0YW5jZTsgICAgICAgICAgIC8qKjwgTWVzc2FnZSBpbnN0YW5jZSAqLworICAgIGJjbW9sdF9ncm91cF9pZCBtc2dfaWQ7ICAgICAvKio8IE1lc3NhZ2UgaWQ6IG9iamVjdCtncm91cCtzdWJncm91cCAqLworICAgIHVpbnQxNl90IGNvcnJfdGFnOyAgICAgICAgICAvKio8IGNvcnJlbGF0aW9uIHRhZyAqLworICAgIHVpbnQxNl90IGZyYWdfbnVtYmVyOyAgICAgICAvKio8IGZyYWdtZW50IG51bWJlciAqLworfSBiY210cl9oZHI7CisKKyNkZWZpbmUgQkNNVFJfSERSX1NJWkUgIDgKKworLyogU2hpZnRzIGFuZCB3aWR0aHMgb2YgdHJhbnNwb3J0IGhlYWRlciBmaWVsZHMgKi8KKyNkZWZpbmUgQkNNVFJfSERSX0RJUl9TICAgICAgICAgMzEKKyNkZWZpbmUgQkNNVFJfSERSX0RJUl9XICAgICAgICAgMQorI2RlZmluZSBCQ01UUl9IRFJfUkVHX1MgICAgICAgICAyNgorI2RlZmluZSBCQ01UUl9IRFJfUkVHX1cgICAgICAgICAxCisjZGVmaW5lIEJDTVRSX0hEUl9VTlJFR19TICAgICAgIDI1CisjZGVmaW5lIEJDTVRSX0hEUl9VTlJFR19XICAgICAgIDEKKyNkZWZpbmUgQkNNVFJfSERSX01PUkVfRlJBR1NfUyAgMjQKKyNkZWZpbmUgQkNNVFJfSERSX01PUkVfRlJBR1NfVyAgMQorI2RlZmluZSBCQ01UUl9IRFJfSU5TVEFOQ0VfUyAgICAxNgorI2RlZmluZSBCQ01UUl9IRFJfSU5TVEFOQ0VfVyAgICA4CisjZGVmaW5lIEJDTVRSX0hEUl9NU0dfSURfUyAgICAgIDAKKyNkZWZpbmUgQkNNVFJfSERSX01TR19JRF9XICAgICAgMTYKKyNkZWZpbmUgQkNNVFJfSERSX0NPUlJfVEFHX1MgICAgMTYKKyNkZWZpbmUgQkNNVFJfSERSX0NPUlJfVEFHX1cgICAgMTYKKyNkZWZpbmUgQkNNVFJfSERSX0ZSQUdfUyAgICAgICAgMAorI2RlZmluZSBCQ01UUl9IRFJfRlJBR19XICAgICAgICAxNgorCisvKiBQYWNrIHRyYW5zcG9ydCBoZWFkZXIKKyAqCisgKiBccGFyYW1baW5dICAgaGRyICAgICAgICAgICAgIFVucGFja2VkIHRyYW5zcG9ydCBoZWFkZXIKKyAqIFxwYXJhbVtvdXRdICBwYWNrZWRfaGRyICAgICAgUGFja2VkIGhlYWRlcgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtdHJfaGVhZGVyX3BhY2soY29uc3QgYmNtdHJfaGRyICpoZHIsIHVpbnQ4X3QgKnBhY2tlZF9oZHIpCit7CisgICAgdWludDMyX3Qgd1syXTsKKworICAgIHdbMF0gPSAoaGRyLT5kaXIgPDwgQkNNVFJfSERSX0RJUl9TKSAgICAgICAgICAgICAgICB8CisgICAgICAgIChoZHItPm1vcmVfZnJhZ21lbnRzIDw8IEJDTVRSX0hEUl9NT1JFX0ZSQUdTX1MpIHwKKyAgICAgICAgKGhkci0+aW5zdGFuY2UgPDwgQkNNVFJfSERSX0lOU1RBTkNFX1MpICAgICAgICAgfAorICAgICAgICAoaGRyLT5hdXRvX3Byb3h5X3JlZyA8PCBCQ01UUl9IRFJfUkVHX1MpICAgICAgICB8CisgICAgICAgIChoZHItPmF1dG9fcHJveHlfdW5yZWcgPDwgQkNNVFJfSERSX1VOUkVHX1MpICAgIHwKKyAgICAgICAgaGRyLT5tc2dfaWQ7CisgICAgd1sxXSA9IChoZHItPmNvcnJfdGFnIDw8IEJDTVRSX0hEUl9DT1JSX1RBR19TKSB8IGhkci0+ZnJhZ19udW1iZXI7CisgICAgd1swXSA9IEJDTVRSX0VORElBTl9DUFVfVE9fQlVGX1UzMih3WzBdKTsKKyAgICB3WzFdID0gQkNNVFJfRU5ESUFOX0NQVV9UT19CVUZfVTMyKHdbMV0pOworICAgIG1lbWNweShwYWNrZWRfaGRyLCB3LCBCQ01UUl9IRFJfU0laRSk7Cit9CisKKy8qIFVucGFjayB0cmFuc3BvcnQgaGVhZGVyCisgKgorICogXHBhcmFtW2luXSAgIHBhY2tlZF9oZHIgICAgICBQYWNrZWQgaGVhZGVyCisgKiBccGFyYW1bb3V0XSAgaGRyICAgICAgICAgICAgIFVucGFja2VkIHRyYW5zcG9ydCBoZWFkZXIKKyAqIEJ1ZmZlciBjdXJyZW50IHBvaW50ZXIgaXMgaW5jcmVtZW50ZWQgYnkgdGhlIGhlYWRlciBzaWRlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtdHJfaGVhZGVyX3VucGFjayhjb25zdCB1aW50OF90ICpwYWNrZWRfaGRyLCBiY210cl9oZHIgKmhkcikKK3sKKyAgICB1aW50MzJfdCB3WzJdOworICAgIG1lbWNweSh3LCBwYWNrZWRfaGRyLCBCQ01UUl9IRFJfU0laRSk7CisgICAgd1swXSA9IEJDTVRSX0VORElBTl9CVUZfVE9fQ1BVX1UzMih3WzBdKTsKKyAgICB3WzFdID0gQkNNVFJfRU5ESUFOX0JVRl9UT19DUFVfVTMyKHdbMV0pOworICAgIGhkci0+ZGlyID0gQkNNX0ZJRUxEX0dFVCh3WzBdLCBCQ01UUl9IRFJfRElSKTsKKyAgICBoZHItPm1vcmVfZnJhZ21lbnRzID0gQkNNX0ZJRUxEX0dFVCh3WzBdLCBCQ01UUl9IRFJfTU9SRV9GUkFHUyk7CisgICAgaGRyLT5pbnN0YW5jZSA9IEJDTV9GSUVMRF9HRVQod1swXSwgQkNNVFJfSERSX0lOU1RBTkNFKTsKKyAgICBoZHItPm1zZ19pZCA9IEJDTV9GSUVMRF9HRVQod1swXSwgQkNNVFJfSERSX01TR19JRCk7CisgICAgaGRyLT5hdXRvX3Byb3h5X3JlZyA9IEJDTV9GSUVMRF9HRVQod1swXSwgQkNNVFJfSERSX1JFRyk7CisgICAgaGRyLT5hdXRvX3Byb3h5X3VucmVnID0gQkNNX0ZJRUxEX0dFVCh3WzBdLCBCQ01UUl9IRFJfVU5SRUcpOworICAgIGhkci0+Y29ycl90YWcgPSBCQ01fRklFTERfR0VUKHdbMV0sIEJDTVRSX0hEUl9DT1JSX1RBRyk7CisgICAgaGRyLT5mcmFnX251bWJlciA9IEJDTV9GSUVMRF9HRVQod1sxXSwgQkNNVFJfSERSX0ZSQUcpOworfQorCisvKiBGaWxsIHRyYW5zcG9ydCBoZWFkZXIKKyAqLworc3RhdGljIGlubGluZSBiY21vc19lcnJubyBiY210cl9oZWFkZXJfZmlsbChjb25zdCBiY21vbHRfbXNnICptc2csIGJjbXRyX2hkciAqaGRyKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKworICAgIGhkci0+ZGlyID0gbXNnLT5kaXI7CisgICAgaGRyLT5tb3JlX2ZyYWdtZW50cyA9IEJDTU9TX0ZBTFNFOworICAgIGVyciA9IGJjbW9sdF9ncm91cF9pZF9jb21iaW5lKG1zZy0+b2JqX3R5cGUsIG1zZy0+Z3JvdXAsIG1zZy0+c3ViZ3JvdXAsICZoZHItPm1zZ19pZCk7CisgICAgaWYgKGVycikKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICBoZHItPmluc3RhbmNlID0gYmNtb2x0X21zZ19pbnN0YW5jZShtc2cpOworICAgIGhkci0+Y29ycl90YWcgPSBtc2ctPmNvcnJfdGFnOworICAgIGhkci0+ZnJhZ19udW1iZXIgPSAwOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisKKyNlbmRpZiAvKiBCQ01UUl9IRUFERVJfSF8gKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci90cmFuc3BvcnQvYmNtdHJfaW50ZXJmYWNlLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L2JjbXRyX2ludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NmM4Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L2JjbXRyX2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsMjQxIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaWZuZGVmIEJDTVRSX0lOVEVSRkFDRV9IXworI2RlZmluZSBCQ01UUl9JTlRFUkZBQ0VfSF8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbW9sdF9tb2RlbF90eXBlcy5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKiBUcmFuc3BvcnQgc3RhdGlzdGljcyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtdHJfc3RhdAoreworICAgIHVpbnQzMl90IG1zZ19zZW50OyAgICAgICAgICAgICAgICAgIC8qKjwgTWVzc2FnZXMgc2VudCAqLworICAgIHVpbnQzMl90IG1zZ19yZXNwX3JlY2VpdmVkOyAgICAgICAgIC8qKjwgVmFsaWQgcmVzcG9uc2VzIHJlY2VpdmVkICovCisgICAgdWludDMyX3QgbXNnX3JlcV9hdXRvX3JlY2VpdmVkOyAgICAgLyoqPCBSZXF1ZXN0IG9yIEF1dG9ub21vdXMgbWVzc2FnZSByZWNlaXZlZCAqLworICAgIHVpbnQzMl90IG1zZ19yZXFfdGltZW91dDsgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIHJlcXVlc3RzIHRoYXQgdGltZWQgb3V0ICovCisgICAgdWludDMyX3QgbXNnX3JlYXNzX3RpbWVvdXQ7ICAgICAgICAgLyoqPCBOdW1iZXIgb2YgbWVzc2FnZXMgZGlzY2FyZGVkIGR1ZSB0byByZWFzc2VtYmxlIHRpbWVvdXQgKi8KKyAgICB1aW50MzJfdCBtc2dfbm9fcmVxOyAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiByZXNwb25zZXMgZGlzY2FyZGVkIGJlY2F1c2UgdGhlcmUgd2FzIG5vIG1hdGNoaW5nIHJlcXVlc3QgKi8KKyAgICB1aW50MzJfdCBtc2dfbm9fbWVtOyAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlcyAqLworICAgIHVpbnQzMl90IG1zZ19jb21tX2VycjsgICAgICAgICAgICAgIC8qKjwgTWVzc2FnZXMgZGlzY2FyZGVkIGJlY2F1c2Ugb2YgY29tbXVuaWNhdGlvbiBlcnJvciAqLworICAgIHVpbnQzMl90IG1zZ19yZWFkeV90aW1lb3V0OyAgICAgICAgIC8qKjwgUmVzcG9uc2VzIHRoYXQgaGF2ZSBiZWVuIHJlcG9ydGVkIHRvIGFwcGxpY2F0aW9uIGJ1dCBub3QgcGVha2VkIHVwICovCisgICAgdWludDMyX3QgbXNnX3Rvb19tYW55X3JlcTsgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgcmVxdWVzdHMgZGlzY2FyZGVkIGJlY2F1c2UgdGhlcmUgd2VyZSB0b28gbWFueSBvdXRzdGFuZGluZyByZXF1ZXN0cyAqLworICAgIHVpbnQzMl90IG1zZ190b29fbWFueV9hdXRvOyAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGF1dG9ub21vdXMgbWVzc2FnZXMgZGlzY2FyZGVkIGJlY2F1c2UgdGhlcmUgd2VyZSB0b28gbWFueSBiZWluZyByZWFzc2VtYmxlZCAqLworICAgIHVpbnQzMl90IG5vdF9jb25uZWN0ZWQ7ICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIFRYIG1lc3NhZ2VzIGRpc2NhcmRlZCBiZWNhdXNlIGNvbm5lY3Rpb24gd2FzIGxvc3QgKi8KKyAgICB1aW50MzJfdCBmcmFnX3JlY2VpdmVkOyAgICAgICAgICAgICAvKio8IFZhbGlkIGZyYWdtZW50cyByZWNlaXZlZCAqLworICAgIHVpbnQzMl90IGZyYWdfaW52YWxpZDsgICAgICAgICAgICAgIC8qKjwgRnJhZ21lbnRzIGRpc2NhcmRlZCAqLworICAgIHVpbnQzMl90IHBhY2tfZXJyb3JzOyAgICAgICAgICAgICAgIC8qKjwgTWVzc2FnZSBwYWNrIGVycm9ycyAqLworICAgIHVpbnQzMl90IHVucGFja19lcnJvcnM7ICAgICAgICAgICAgIC8qKjwgTWVzc2FnZSB1bnBhY2sgZXJyb3JzICovCisgICAgdWludDMyX3Qgbm9fcnhfaGFuZGxlcjsgICAgICAgICAgICAgLyoqPCBNZXNzYWdlIGRpc2NhcmRlZCBiZWNhdXNlIHRoZXJlIHdhcyBubyByeCBoYW5kbGVyICovCit9IGJjbXRyX3N0YXQ7CisKKy8qKiBUcmFuc3BvcnQgbWVzc2FnZSBjb250cm9sIGJsb2NrICovCit0eXBlZGVmIHN0cnVjdCBiY210cl9tc2cgYmNtdHJfbXNnOworCisvKiogQ2hhbm5lbCBpZCAqLwordHlwZWRlZiB1aW50OF90IGJjbXRyX2NoYW5uZWxfaWQ7CisKKy8qKiBTZW5kIGZsYWdzICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBCQ01UUl9TRU5EX0ZMQUdTX05PTkUgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBOb25lICovCisgICAgQkNNVFJfU0VORF9GTEFHU19DQUxMICAgICAgICAgICAgICAgPSAweDAwMDEsICAgICAgIC8qKjwgUmVxdWVzdC9SZXNwb25zZSBzZXF1ZW5jZSAqLworCisgICAgQkNNVFJfU0VORF9GTEFHU19QUklfTk9STUFMICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgTm9ybWFsIHByaW9yaXR5ICovCisgICAgQkNNVFJfU0VORF9GTEFHU19QUklfSEkgICAgICAgICAgICAgPSAweDAwMTAsICAgICAgIC8qKjwgSGlnaCBwcmlvcml0eSAqLworCisgICAgQkNNVFJfU0VORF9GTEFHU19MT05HX1dBSVQgICAgICAgICAgPSAweDAxMDAsICAgICAgIC8qKjwgRW5hYmxlIGxvbmcgd2FpdCB1bnRpbCB0aGVyZSBpcyByb29tIGluIHR4IHF1ZXVlICovCisgICAgQkNNVFJfU0VORF9GTEFHU19TSE9SVF9XQUlUICAgICAgICAgPSAweDAyMDAsICAgICAgIC8qKjwgRW5hYmxlIHNob3J0IHdhaXQgdW50aWwgdGhlcmUgaXMgcm9vbSBpbiB0eCBxdWV1ZSAqLworICAgIEJDTVRSX1NFTkRfRkxBR1NfRE9fTk9UX1dBSVQgICAgICAgID0gMHgwNDAwLCAgICAgICAvKio8IERyb3AgcGFja2V0IGlmIFRYIHEgaXMgZnVsbCAqLworCit9IGJjbXRyX3NlbmRfZmxhZ3M7CisKKyNkZWZpbmUgQkNNVFJfU0VORF9GTEFHU19XQUlUX01BU0sgKEJDTVRSX1NFTkRfRkxBR1NfTE9OR19XQUlUIHwgQkNNVFJfU0VORF9GTEFHU19TSE9SVF9XQUlUIHwgQkNNVFJfU0VORF9GTEFHU19ET19OT1RfV0FJVCkKKworLyoqIFRyYW5zcG9ydCBoYW5kbGVyIHJlZ2lzdHJhdGlvbiBwYXJhbWV0ZXJzICovCit0eXBlZGVmIHN0cnVjdCBiY210cl9oYW5kbGVyX3Bhcm0KK3sKKyAgICB1aW50OF90IGluc3RhbmNlOyAgICAgICAgICAgLyoqPCBJbnN0YW5jZSAoaS5lLCBsaW5rKSAqLworICAgIGJjbW9sdF9tZ3RfZ3JvdXAgZ3JvdXA7ICAgICAvKio8IE1lc3NhZ2UgZ3JvdXAgKi8KKyAgICBiY21vbHRfb2JqX2lkIG9iamVjdDsgICAgICAgLyoqPCBPYmplY3QuIENhbiBiZSBCQ01PTFRfT0JKRUNUX0FOWSAqLworICAgIHVpbnQxNl90IHN1Ymdyb3VwOyAgICAgICAgICAvKio8IE1lc3NhZ2Ugc3ViZ3JvdXAuIENhbiBiZSBCQ01PTFRfU1VCR1JPVVBfQU5ZICovCisgICAgZl9iY21vbHRfbXNnX2hhbmRsZXIgYXBwX2NiOy8qKjwgTWVzc2FnZSBoYW5kbGVyICovCisgICAgYmNtb2x0X2F1dG9fZmxhZ3MgZmxhZ3M7ICAgIC8qKjwgRmxhZ3MuIGFwcF9jYiBpcyBjYWxsZWQgaW4gY29udGV4dCBvZiB0cmFuc3BvcnQgdGFzaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGFwcCBtb2R1bGUsIGRlcGVuZGluZyBvbiB0aGUgZmxhZ3MgKi8KKyAgICBiY21vc19tb2R1bGVfaWQgbW9kdWxlOyAgICAgLyoqPCBUYXJnZXQgbW9kdWxlIGlkLiBSZWxldmFudCBvbmx5IGlmIGZsYWdzID09IEJDTU9MVF9BVVRPX0ZMQUdTX0RJU1BBVENILgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9TX01PRFVMRV9JRF9OT05FIGlzIHJlcGxhY2VkIGJ5IHRoZSBtb2R1bGUgY2FsbGluZyByZWdpc3RyYXRpb24gZnVuY3Rpb24gKi8KK30gYmNtdHJfaGFuZGxlcl9wYXJtOworCisvKiogSW5pdGlhbGl6ZSB0cmFuc3BvcnQgbGlicmFyeS4KKyAqIFxyZXR1cm5zIEJDTV9FUlJfT0sgb3IgZXJyb3IgY29kZQorICovCitiY21vc19lcnJubyBiY210cl9pbml0KHZvaWQpOworCisvKiogUmVsZWFzZSByZXNvdXJjZXMgdXNlZCBieSB0cmFuc3BvcnQgbGlicmFyeS4KKyAqIFxyZXR1cm5zIEJDTV9FUlJfT0sgb3IgZXJyb3IgY29kZQorICovCitiY21vc19lcnJubyBiY210cl9leGl0KHZvaWQpOworCisvKiogU2VuZCBtZXNzYWdlLiBEbyBub3Qgd2FpdCBmb3IgcmVzcG9uc2UKKyAqCisgKiBTZXQtdXAgY29ubmVjdGlvbiBpZiBuZWNlc3NhcnksIHBhY2sgbWVzc2FnZSBhbmQgc2VuZCBpdCB0byB0aGUgcmVtb3RlIHNpZGUuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIGZvciBwcm94eSBhbmQgYXV0b25vbW91cyBtZXNzYWdlcy4KKyAqCisgKiBccGFyYW1baW5dICAgZGV2aWNlICBPTFQgZGV2aWNlIGluZGV4CisgKiBccGFyYW1baW5dICAgbXNnICAgICBBcHBsaWNhdGlvbiBtZXNzYWdlIHRvIGJlIHNlbnQKKyAqIFxwYXJhbVtpbl0gICBmbGFncyAgIGZsYWdzIChyZXF1ZXN0L2F1dG8gb3IgcmVwbHkpCisgKgorICogXHJldHVybnMgQkNNX0VSUl9PSyBvciBlcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX3NlbmQoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnLCBiY210cl9zZW5kX2ZsYWdzIGZsYWdzKTsKKworLyoqIFNlbmQgcmVzcG9uc2UgbWVzc2FnZQorICoKKyAqIFNldC11cCBjb25uZWN0aW9uIGlmIG5lY2Vzc2FyeSwgcGFjayBtZXNzYWdlIGFuZCBzZW5kIGl0IHRvIHRoZSByZW1vdGUgc2lkZS4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgZm9yIHByb3h5IGFuZCBhdXRvbm9tb3VzIG1lc3NhZ2VzLgorICoKKyAqIFxwYXJhbVtpbl0gICBkZXZpY2UgIE9MVCBkZXZpY2UgaW5kZXgKKyAqIFxwYXJhbVtpbl0gICBtc2cgICAgIEFwcGxpY2F0aW9uIG1lc3NhZ2UgdG8gYmUgc2VudAorICogXHBhcmFtW2luXSAgIGZsYWdzICAgZmxhZ3MgKHJlcXVlc3QvYXV0byBvciByZXBseSkKKyAqCisgKiBccmV0dXJucyBCQ01fRVJSX09LIG9yIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGlubGluZSBiY21vc19lcnJubyBiY210cl9zZW5kX3Jlc3BvbnNlKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9tc2cgKm1zZykKK3sKKyAgICBtc2ctPmRpciA9IEJDTU9MVF9NU0dfRElSX1JFU1BPTlNFOworICAgIHJldHVybiBiY210cl9zZW5kKGRldmljZSwgbXNnLCBCQ01UUl9TRU5EX0ZMQUdTX0NBTEwgfCBCQ01UUl9TRU5EX0ZMQUdTX1NIT1JUX1dBSVQpOworfQorCisvKiogU2VuZCByZXF1ZXN0IGFuZCB3YWl0IGZvciByZXBseQorICoKKyAqIFNldC11cCBjb25uZWN0aW9uIGlmIG5lY2Vzc2FyeSwgcGFjayBtZXNzYWdlIGFuZCBzZW5kIGl0IHRvIHRoZSByZW1vdGUgc2lkZS4KKyAqIFdhaXQgZm9yIHJlcGx5IG9yIHRpbWVvdXQsIHVucGFjayB0aGUgcmVwbHkgYW5kIHJldHVybi4KKyAqCisgKiBccGFyYW1baW5dICAgICAgICBkZXZpY2UgIE9MVCBkZXZpY2UgaW5kZXgKKyAqIFxwYXJhbVtpbiwgb3V0XSAgIG1zZyAgICAgQXBwbGljYXRpb24gbWVzc2FnZQorICogXHJldHVybnMgQkNNX0VSUl9PSyBvciBlcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX2NhbGwoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnKTsKKworLyoqIFJlZ2lzdGVyIG1lc3NhZ2UgaGFuZGxlcgorICoKKyAqIFxwYXJhbVtpbl0gICBkZXZpY2UgICAgICAgICAgT0xUIGRldmljZSBpbmRleAorICogXHBhcmFtW2luXSAgIHBhcm0gICAgICAgICAgICBSZWdpc3RyYXRpb24gcGFyYW1ldGVycworICogXHJldHVybnMgQkNNX0VSUl9PSyBvciBlcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX21zZ19oYW5kbGVyX3JlZ2lzdGVyKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGNvbnN0IGJjbXRyX2hhbmRsZXJfcGFybSAqcGFybSk7CisKKy8qKiBVbnJlZ2lzdGVyIG1lc3NhZ2UgaGFuZGxlcgorICoKKyAqIFxwYXJhbVtpbl0gICBkZXZpY2UgICAgICAgICAgT0xUIGRldmljZSBpbmRleAorICogXHBhcmFtW2luXSAgIHBhcm0gICAgICAgICAgICBSZWdpc3RyYXRpb24gcGFyYW1ldGVycworICogXHJldHVybnMgQkNNX0VSUl9PSyBvciBlcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX21zZ19oYW5kbGVyX3VucmVnaXN0ZXIoYmNtb2x0X2RldmlkIGRldmljZSwgY29uc3QgYmNtdHJfaGFuZGxlcl9wYXJtICpwYXJtKTsKKworLyoqIEdldCByZWdpc3RyYXRpb24gaW5mbworICoKKyAqIFxwYXJhbVtpbl0gICAgICAgICAgIGRldmljZSAgICAgICAgICBPTFQgZGV2aWNlIGluZGV4CisgKiBccGFyYW1baW4sb3V0XSAgICAgICBwYXJtICAgICAgICAgICAgUmVnaXN0cmF0aW9uIHBhcmFtZXRlcnMuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsIGdyb3VwLCBvYmplY3QsIHN1Ymdyb3VwIG11c3QgYmUgc2V0CisgKiBccmV0dXJucyBCQ01fRVJSX09LIG9yIGVycm9yIGNvZGUKKyAqLworYmNtb3NfZXJybm8gYmNtdHJfbXNnX2hhbmRsZXJfcmVnaXN0ZXJfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbXRyX2hhbmRsZXJfcGFybSAqcGFybSk7CisKKy8qKiBHZXQgdHJhbnNwb3J0IHN0YXRpc3RpY3MKKyAqCisgKiBccGFyYW1baW5dICAgZGV2aWNlICAgICAgICAgIE9MVCBkZXZpY2UgaW5kZXgKKyAqIFxwYXJhbVtvdXRdICBzdGF0ICAgICAgICAgICAgU3RhdGlzdGljcworICogXHJldHVybnMgQkNNX0VSUl9PSyBvciBlcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX3N0YXRfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbXRyX3N0YXQgKnN0YXQpOworCisvKiBRdWVyeSB3aGV0aGVyIG9yIG5vdCB0aGUgZGV2aWNlIGlzIGN1cnJlbnRseSBjb25uZWN0ZWQgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX2lzX2Nvbm5lY3RlZChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vc19ib29sICppc19jb25uZWN0ZWQpOworCisvKiBDb25uZWN0IGRldmljZSAqLworYmNtb3NfZXJybm8gYmNtdHJfY29ubmVjdChiY21vbHRfZGV2aWQgZGV2aWNlKTsKKworLyogRGlzY29ubmVjdCBkZXZpY2UgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX2Rpc2Nvbm5lY3QoYmNtb2x0X2RldmlkIGRldmljZSk7CisKKy8qIExvdy1sZXZlbCBkaXNjb25uZWN0IHRoYXQgYnJlYWtzICJwaHlzaWNhbCIgY29ubmVjdGlvbiwgYnV0IGRvZXNuJ3QgZGVzdHJveSBjb25uZWN0aW9uIHN0cnVjdHVyZSBhbmQgcmVnaXN0cmF0aW9ucyAqLworYmNtb3NfZXJybm8gYmNtdHJfZHJpdmVyX2Rpc2Nvbm5lY3QoYmNtb2x0X2RldmlkIGRldmljZSk7CisKKy8qIFJlcGFpci9yZWNvbm5lY3QgdGhlIGRyaXZlci1sZXZlbCBjb25uZWN0aW9uIGZvciBhbiBhbHJlYWR5LWNvbm5lY3RlZCBkZXZpY2UgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX2RyaXZlcl9yZWNvbm5lY3QoYmNtb2x0X2RldmlkIGRldmljZSk7CisKKy8qICJkcm9wcGVkIGJlY2F1c2Ugb2YgdHhfcXVldWUgb3ZlcmZsb3ciIGluZGljYXRpb24gKi8KK3R5cGVkZWYgdm9pZCAoKkZfYmNtdHJfdHhfb3ZlcmZsb3cpKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbXRyX3NlbmRfZmxhZ3Mgc2VuZF9mbGFncyk7CisKKy8qIFJlZ2lzdGVyIGZvciBub3RpZmljYXRpb24gdGhhdCB0cmFuc21pdCBmYWlsZWQgYmVjYXVzZQorICogdHhfcXVldWUgd2FzIGZ1bGwKKyAqIFxwYXJhbVtpbl0gICBkZXZpY2UgICAgICAgICAgT0xUIGRldmljZSBpbmRleAorICogXHBhcmFtW2luXSAgIGNiICAgICAgICAgICAgICBDYWxsYmFjayB0byBiZSBjYWxsZWQuIE5VTEw9dW5yZWdpc3RlcgorICogXHJldHVybnMgMD1PSyBvciBlcnJvciBjb2RlIDwgMAorICovCitiY21vc19lcnJubyBiY210cl90eF9vdmVyZmxvd19jYl9yZWdpc3RlcihiY21vbHRfZGV2aWQgZGV2aWNlLCBGX2JjbXRyX3R4X292ZXJmbG93IGNiKTsKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSB1c2VmdWwgZm9yIHByb3h5IGRhZW1vbi4KKyAqIFRoZXkgcHJvdmlkZSBkaXJlY3QgaW50ZXJmYWNlIHRvIHRyYW5zcG9ydCBwbHVnaW4KKyAqLworCisvKiBDb25uZWN0IGRldmljZSBpbiByYXcgbW9kZQorICogUmVjZWl2ZSB0YXNrIGlzIE5PVCBjcmVhdGVkCisgKiBccGFyYW1baW5dICAgZGV2aWNlICAgICAgICAgIE9MVCBkZXZpY2UgaW5kZXgKKyAqIFxwYXJtW291dF0gICBoZWFkcm9vbSAgICAgICAgSGVhZHJvb20gdGhhdCBzaG91bGQgYmUgcmVzZXJ2ZWQgaW4gYnVmZmVyIHdoZW4gdHJhbnNtaXR0aW5nCisgKiBccmV0dXJucyAwPU9LIG9yIGVycm9yIGNvZGUgPCAwCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX3Byb3h5X2Nvbm5lY3QoYmNtb2x0X2RldmlkIGRldmljZSwgdWludDMyX3QgKmhlYWRyb29tKTsKKworLyogU2VuZCBkYXRhIHRvIGRldmljZQorICogXHBhcmFtW2luXSAgIGRldmljZSAgICAgICAgICBPTFQgZGV2aWNlIGluZGV4CisgKiBccGFyYW1baW5dICAgdHhiICAgICAgICAgICAgIFRyYW5zbWl0IGJ1ZmZlcgorICogXHJldHVybnMgMD1PSyBvciBlcnJvciBjb2RlIDwgMAorICovCitiY21vc19lcnJubyBiY210cl9wcm94eV9zZW5kKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9idWYgKnR4X2J1Zik7CisKKy8qIFJlY2VpdmUgZGF0YSBmcm9tIGRldmljZQorICogXHBhcmFtW2luXSAgIGRldmljZSAgICAgICAgICBPTFQgZGV2aWNlIGluZGV4CisgKiBccGFyYW1baW5dICAgcnhiICAgICAgICAgICAgIFJlY2VpdmUgYnVmZmVyCisgKiBccmV0dXJucyAwPU9LLCBCQ01fRVJSX1RJTUVPVVQtdGltZW91dCBhbmQgbm8gbWVzc2FnZSwgb3RoZXIgZXJyb3JzIDwwCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX3Byb3h5X3JlY2VpdmUoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X2J1ZiAqcnhfYnVmKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogQkNNVFJfSU5URVJGQUNFX0hfICovCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L2JjbXRyX2ludGVybmFsLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L2JjbXRyX2ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IwM2UyOQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci90cmFuc3BvcnQvYmNtdHJfaW50ZXJuYWwuaApAQCAtMCwwICsxLDE1MSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBCQ01UUl9JTlRFUk5BTF9IXworI2RlZmluZSBCQ01UUl9JTlRFUk5BTF9IXworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtb2x0X2J1Zi5oPgorI2luY2x1ZGUgPGJjbW9sdF9tc2dfcGFjay5oPgorI2luY2x1ZGUgPGJjbXRyX2ludGVyZmFjZS5oPgorI2luY2x1ZGUgPGJjbXRyX3BsdWdpbi5oPgorI2luY2x1ZGUgPGJjbV9jb25maWcuaD4KKworI2luY2x1ZGUgImJjbXRyX2hlYWRlci5oIgorCisvKiogVHJhbnNwb3J0IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY210cl9wbHVnaW5fY2ZnIHBsdWdpbl9jZmc7ICAgICAgICAvKio8IFRyYW5zcG9ydCBwbHVnaW4gY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzICovCisKKyAgICAvKiogTGltaXRzIGFuZCB0aW1lb3V0cy4KKyAgICAgKiBJZiBub3Qgc2V0LCB0aGUgYXBwcm9wcmlhdGUgQkNNX1RSX2RlZmF1bHQgZGVmaW5lZCBpbiBiY21Db25maWcuaCBpcyB1c2VkCisgICAgICovCisgICAgdWludDMyX3QgbWF4X3JldHJpZXM7ICAgICAgIC8qKjwgTWF4IG51bWJlciBvZiByZXF1ZXN0IHJldHJhbnNtaXNzaW9ucyAqLworICAgIHVpbnQzMl90IG1zZ190aW1lb3V0OyAgICAgICAvKio8IE1heCB0aW1lIHRvIHdhaXQgZm9yIHJlc3BvbnNlIG9yIG5leHQgbWVzc2FnZSBwYXJ0IChtcykgKi8KKyAgICB1aW50MzJfdCBtYXhfcmVxdWVzdHM7ICAgICAgLyoqPCBNYXggbnVtYmVyIG9mIG91dHN0YW5kaW5nIHJlcXVlc3RzICovCisgICAgdWludDMyX3QgbWF4X2F1dG9zOyAgICAgICAgIC8qKjwgTWF4IG51bWJlciBvZiBtdWx0aS1wYXJ0IGF1dG9ub21vdXMgbWVzc2FnZXMgKi8KKyAgICB1aW50MzJfdCBtYXhfZnJhZ21lbnRzOyAgICAgLyoqPCBNYXggbnVtYmVyIG9mIG11bHRpLXBhcnQgbWVzc2FnZSBmcmFnbWVudHMgKi8KKyAgICB1aW50MzJfdCBtc2dfd2FpdF90aW1lb3V0OyAgLyoqPCBNZXNzYWdlIHdhaXRpbmcgdGltZW91dCAobXMpICovCisgICAgdWludDMyX3QgbXNnX3JlYWR5X3RpbWVvdXQ7IC8qKjwgVGltZSB0aGF0IHRyYW5zYWN0aW9uIGlzIGtlcHQgYWZ0ZXIgbm90aWZ5aW5nIGFwcGxpY2F0aW9uIHRoYXQgaXQgZmluaXNoZWQgKG1zKSAqLworICAgIHVpbnQzMl90IG1heF9tdHU7ICAgICAgICAgICAvKio8IE1heCBNVFUgc2l6ZSAoYnl0ZXMpICovCisKKyAgICBpbnQgcnhfdGhyZWFkX3ByaW9yaXR5OyAgICAgLyoqPCBSZWNlaXZlIHRocmVhZCBwcmlvcml0eS4gSWYgc2V0IC0xLCBSeCB0aHJlYWQgaXMgTk9UIGNyZWF0ZWQgKi8KK30gYmNtdHJfY2ZnOworCisvKiogVHJhbnNwb3J0IGNvbm5lY3Rpb24gY29udHJvbCBibG9jayAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtdHJfY29ubiBiY210cl9jb25uOworCisvKiogUmVhc3NlbWJsZSBibG9jayAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtdHJfcmVhc3MKK3sKKyAgICBiY21vbHRfYnVmICpmcmFnbWVudHM7ICAgICAgICAgICAgICAvKiogQXJyYXkgb2YgYmNtdHJfY2ZnLm1heF9mcmFnbWVudHMgKi8KKyAgICB1aW50MzJfdCBudW1fZnJhZ21lbnRzOyAgICAgICAgICAgICAvKiogTnVtYmVyIG9mIGZyYWdtZW50cyBmaWxsZWQgaW4gZnJhZ21lbnRzIGFycmF5ICovCisgICAgdWludDMyX3QgbWF4X2ZyYWdtZW50OyAgICAgICAgICAgICAgLyoqIE1heCBmcmFnbWVudCBudW1iZXIuIFNldCB3aGVuIGxhc3QgZnJhZ21lbnQgaXMgcmVjZWl2ZWQgKi8KKyAgICB1aW50MzJfdCB0b3RhbF9zaXplOyAgICAgICAgICAgICAgICAvKiogVG90YWwgc2l6ZSBvZiByZWNlaXZlZCBmcmFnbWVudHMgKi8KK30gYmNtdHJfcmVhc3M7CisKKy8qKiBUcmFuc3BvcnQgaGVhZGVyIGxpc3QgaGVhZCAqLwordHlwZWRlZiBUQUlMUV9IRUFEKGJjbXRyX21zZ19saXN0LCBiY210cl9tc2cpIGJjbXRyX21zZ19saXN0OworCisvKiogVHJhbnNwb3J0IHRyYW5zYWN0aW9uIGNvbnRyb2wgYmxvY2sgKi8KK3N0cnVjdCBiY210cl9tc2cKK3sKKyAgICBiY21vbHRfYnVmIHR4X2J1ZjsgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zbWl0IGJ1ZmZlciBpbmZvIChyZXF1ZXN0IG9ubHkpICovCisgICAgYmNtb2x0X2J1ZiByeF9idWY7ICAgICAgICAgICAgICAgICAgLyoqPCBSZWNlaXZlIGJ1ZmZlciBpbmZvIChyZXNwb25zZSBvciBhdXRvbm9tb3VzKSAqLworICAgIHVpbnQzMl90IHRpbWVzdGFtcDsgICAgICAgICAgICAgICAgIC8qKjwgTWVzc2FnZSB0aW1lc3RhbXAuIFR4IG9yIGxhc3QgUnggKi8KKyAgICB1aW50MTZfdCB0eF9jb3VudDsgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiB0aW1lcyBtZXNzYWdlIHdhcyB0cmFuc21pdHRlZCAqLworICAgIGJjbXRyX2hkciBoZHI7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IGhlYWRlciAqLworICAgIFRBSUxRX0VOVFJZKGJjbXRyX21zZykgbDsgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IG1lc3NhZ2UgbGlzdCBlbnRyeSAqLworICAgIGJjbXRyX3JlYXNzICpzZWdtOyAgICAgICAgICAgICAgICAgIC8qKjwgU2VnbWVudGF0aW9uIGJsb2NrICovCisgICAgYmNtdHJfcmVhc3MgKnJlYXNzOyAgICAgICAgICAgICAgICAgLyoqPCBSZWFzc2VtYmxlIGJsb2NrICovCisgICAgYmNtb2x0X21zZyAqbXNnOyAgICAgICAgICAgICAgICAgICAgLyoqPCBNZXNzYWdlIHJlZmVyZW5jZSAqLworICAgIGJjbW9sdF9zdWJjaGFubmVsIHN1YmNoOyAgICAgICAgICAgIC8qKjwgU3ViLWNoYW5uZWwgdmlhIHdoaWNoIG1lc3NhZ2Ugd2FzIHJlY2VpdmVkICovCisgICAgYmNtb3NfZXJybm8gZXJyOyAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgc3RhdHVzICovCisKKyAgICAvKiBUcmFuc3BvcnQgaGVhZGVyIGlzIGNsZWFyZWQgdXAgdG8gdGhpcyBwb2ludCB3aGVuIHJlbGVhc2VkLgorICAgICAqICJlcnIiIGZpZWxkIGlzIHRoZSBsYXN0IGluIHRoZSBzZWN0aW9uIHRoYXQgZ2V0cyBjbGVhcmVkLgorICAgICAqIERvIG5vdCBtb3ZlIGZpZWxkcyBiZWxvdyBhYm92ZSAiZXJyIiEKKyAgICAgKi8KKyNkZWZpbmUgQkNNVFJfSERSX0NMRUFSX1NJWkUgICAob2Zmc2V0b2YoYmNtdHJfbXNnLCBlcnIpICsgc2l6ZW9mKGJjbW9zX2Vycm5vKSkKKyAgICBiY210cl9tc2dfbGlzdCAqZnJlZV9saXN0OyAgICAgICAgICAvKio8IEZyZWUgbGlzdCBoZWFkIHJlZmVyZW5jZSAqLworICAgIGJjbXRyX2Nvbm4gKmNvbm47ICAgICAgICAgICAgICAgICAgIC8qKjwgQ29ubmVjdGlvbiBiYWNrIHJlZmVyZW5jZSAqLworICAgIGJjbW9zX3NlbSBzZW07ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgIndhaXQgZm9yIHJlc3BvbnNlIiBzZW1hcGhvcmUgKi8KKyAgICBiY21vc19tc2cgaXBjX2hkcjsgICAgICAgICAgICAgICAgICAvKio8IElQQyBtZXNzYWdlIGhlYWRlciAqLworfTsKKworLyoqIE1lc3NhZ2UgaGFuZGxlciBjb250ZXh0ICovCit0eXBlZGVmIHN0cnVjdCBiY210cl9oYW5kbGVyCit7CisgICAgZl9iY21vbHRfbXNnX2hhbmRsZXIgYXBwX2NiOyAgICAgICAgLyoqPCBBcHBsaWNhdGlvbiBjYWxsYmFjayBmdW5jdGlvbiAqLworICAgIGJjbW9sdF9hdXRvX2ZsYWdzIGZsYWdzOyAgICAgICAgICAgIC8qKjwgUmVnaXN0cmF0aW9uIGZsYWc6IGNhbGwgaW4gY29udGV4dCBvZiB0cmFuc3BvcnQgcnggdGhyZWFkIG9yIGFwcCBtb2R1bGUgKi8KKyAgICBiY21vc19tb2R1bGVfaWQgbW9kdWxlOyAgICAgICAgICAgICAvKio8IE9wdGlvbmFsIG1vZHVsZSB0byBkaXNwYXRjaCByZWNlaXZlZCBtZXNzYWdlIHRvICovCit9IGJjbXRyX2hhbmRsZXI7CisKKy8qKiBUcmFuc3BvcnQgY29ubmVjdGlvbiBjb250cm9sIGJsb2NrICovCitzdHJ1Y3QgYmNtdHJfY29ubgoreworICAgIGNoYXIgbmFtZVsxNl07ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVHJhbnNwb3J0IG5hbWUgKi8KKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlOyAgICAgICAgICAgICAgICAvKio8IERldmljZSBpbmRleCAqLworICAgIGJjbXRyX2NoYW5uZWxfaWQgY2hhbm5lbDsgICAgICAgICAgIC8qKjwgQ2hhbm5lbHMgc2VydmVkIGJ5IHRoaXMgdHJhbnNwb3J0ICovCisgICAgYmNtdHJfY2ZnIGNmZzsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzICovCisgICAgYmNtdHJfZHJpdmVyIGRyaXZlcjsgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgZHJpdmVyICovCisgICAgYmNtdHJfcGx1Z2luX2NoYW5uZWwgZHJ2X3ByaXY7ICAgICAgLyoqPCBQbHVnaW4gZHJpdmVyIHByaXZhdGUgZGF0YSAqLworICAgIGJjbW9zX3Rhc2sgcnhfdGhyZWFkOyAgICAgICAgICAgICAgIC8qKjwgUlggdGhyZWFkIGhhbmRsZSAqLworICAgIGJjbW9zX211dGV4IG11dGV4OyAgICAgICAgICAgICAgICAgIC8qKjwgTXV0ZXggcHJvdGVjdGluZyB0aGUgdHJhbnNwb3J0IHN0cnVjdHVyZSAqLworICAgIHVpbnQzMl90IGxhc3RfdGltZW91dF9jaGVjazsgICAgICAgIC8qKjwgTGFzdCB0aW1lb3V0IGNoZWNrIHRpbWVzdGFtcCAqLworICAgIHVpbnQzMl90IHRpbWVvdXRfY2hlY2tfcGVyaW9kOyAgICAgIC8qKjwgVGltZS1vdXQgY2hlY2sgcGVyaW9kICovCisgICAgYmNtdHJfbXNnX2xpc3QgbXNnX2xpc3Q7ICAgICAgICAgICAgLyoqPCBNZXNzYWdlIGxpc3QgaGVhZCAqLworICAgIGJjbXRyX21zZ19saXN0IGZyZWVfcmVxX2xpc3Q7ICAgICAgIC8qKjwgRnJlZSByZXF1ZXN0IGJsb2NrIGxpc3QgKi8KKyAgICBiY210cl9tc2dfbGlzdCBmcmVlX2F1dG9fbGlzdDsgICAgICAvKio8IEZyZWUgYXV0b25vbW91cyBibG9jayBsaXN0ICovCisgICAgYmNtdHJfbXNnICp0bXNnX2FycmF5OyAgICAgICAgICAgICAgLyoqPCBQcmUtYWxsb2NhdGVkIGFycmF5IG9mIHRyYW5zcG9ydCBoZWFkZXJzICovCisgICAgYmNtdHJfc3RhdCBzdGF0OyAgICAgICAgICAgICAgICAgICAgLyoqPCBTdGF0aXN0aWNzICovCisgICAgYmNtb3NfYm9vbCBjb25uZWN0ZWQ7ICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgc3RhdGUgKi8KKyAgICB1aW50MTZfdCBudW1fcmVxdWVzdHM7ICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBvdXRzdGFuZGluZyByZXF1ZXN0cyAqLworICAgIHVpbnQxNl90IG51bV9hdXRvOyAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGF1dG9ub21vdXMgbWVzc2FnZXMgYmVpbmcgcmVhc3NlbWJsZWQgKi8KKyAgICB1aW50MTZfdCBjb3JyX3RhZzsgICAgICAgICAgICAgICAgICAvKio8IExhc3QgdXNlZCBjb3JyZWxhdGlvbiB0YWcgKi8KKyAgICBiY21vc19ib29sIHJ4X3RocmVhZF9jcmVhdGVkOyAgICAgICAvKio8IFRSVUU9UlggdGhyZWFkIHdhcyBjcmVhdGVkICovCisgICAgaW50IGtpbGxfcmVxdWVzdDsgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc3BvcnQgdGhyZWFkIGlzIGNvbW1hbmRlZCB0byBkaWUgKi8KKyAgICBpbnQga2lsbF9kb25lOyAgICAgICAgICAgICAgICAgICAgICAvKio8IFRyYW5zcG9ydCB0aHJlYWQgaXMgZGVhZCAqLworfTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK2JjbW9zX2Vycm5vIGJjbXRyX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtdHJfY2ZnICpjZmcsIGJjbXRyX2RyaXZlciAqZHJpdmVyKTsKKworYmNtb3NfZXJybm8gX2JjbXRyX2Nvbm5fZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbXRyX2Nvbm4gKipjb25uKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIEJDTVRSX0lOVEVSTkFMX0hfICovCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L2JjbXRyX3RyYW5zcG9ydC5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9iY210cl90cmFuc3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjkxNThlCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9iY210cl90cmFuc3BvcnQuYwpAQCAtMCwwICsxLDE3MTMgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY210cl9pbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxiY210cl9kZWJ1Zy5oPgorCisjaW5jbHVkZSAiYmNtdHJfaGVhZGVyLmgiCisjaW5jbHVkZSAiYmNtdHJfaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY210cl9jb25uICpjb25uOyAvKio8IENvbm5lY3Rpb24gZHluYW1pYyBpbmZvIChhbGxvY2F0ZWQgb24gY29ubmVjdCkgKi8KKyAgICBiY210cl9oYW5kbGVyIG1zZ19oYW5kbGVyW0JDTU9MVF9HUk9VUF9JRF9fTlVNX09GXVtCQ01UUl9NQVhfSU5TVEFOQ0VTXTsKKyAgICBGX2JjbXRyX3R4X292ZXJmbG93IG92ZXJmbG93X2NiOyAgICAvKio8IENhbGxiYWNrIHRvIGJlIGNhbGxlZCBpbiBjYXNlIG9mIHR4IGRyb3AgYmVjYXVzZSBvZiBxdWV1ZSBvdmVyZmxvdyAqLworfSBiY210cl9jb25uX2luZm87CisKK3N0YXRpYyBiY210cl9jb25uX2luZm8gY29ubl9pbmZvW0JDTVRSX01BWF9PTFRTXTsgLyogU3RvcmUgY29ubmVjdGlvbiBpbmZvIHNlcGFyYXRlbHkgcGVyIE9MVCAqLworCitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbXRyX2Nvbm5lY3QoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtdHJfY29ubiAqKmNvbm4sIGJjbW9zX2Jvb2wgcmF3X21vZGUpOworCitzdGF0aWMgYmNtb3NfbXV0ZXggY29ubl9sb2NrOworCisvKiBHZXQgZXhpc3RpbmcgY29ubmVjdGlvbi4gSWYgbm9uZSAtIHNldHVwIG5ldy4KKyAqIElmIHJhd19tb2RlIGlzIFRSVUUsIHRoZSBjb25uZWN0aW9uIGlzIGludGVuZGVkIGZvciB1c2UgYnkgcmF3IGludGVyZmFjZQorICogYmNtdHJfcHJveHlfeHgoKS4gSW4gdGhpcyBjYXNlIFJYIHRhc2sgaXMgbm90IGNyZWF0ZWQKKyAqLworc3RhdGljIGJjbW9zX2Vycm5vIF9iY210cl9jb25uX2dldF9hbnkoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtdHJfY29ubiAqKmNvbm4sIGJjbW9zX2Jvb2wgaXNfcmF3KQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBpZiAoZGV2aWNlID49IEJDTVRSX01BWF9PTFRTKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorICAgICpjb25uID0gY29ubl9pbmZvW2RldmljZV0uY29ubjsKKyAgICBpZiAoKmNvbm4pCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisgICAgZXJyID0gX2JjbXRyX2Nvbm5lY3QoZGV2aWNlLCAmY29ubl9pbmZvW2RldmljZV0uY29ubiwgaXNfcmF3KTsKKyAgICAqY29ubiA9IGNvbm5faW5mb1tkZXZpY2VdLmNvbm47CisgICAgcmV0dXJuIGVycjsKK30KKworLyogR2V0IGV4aXN0aW5nIGNvbm5lY3Rpb24uIElmIG5vbmUgLSBzZXR1cCBuZXcgKi8KK2JjbW9zX2Vycm5vIF9iY210cl9jb25uX2dldChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY210cl9jb25uICoqY29ubikKK3sKKyAgICByZXR1cm4gX2JjbXRyX2Nvbm5fZ2V0X2FueShkZXZpY2UsIGNvbm4sIEJDTU9TX0ZBTFNFKTsKK30KKworLyogRnJlZSByZWFzc2VtYmxlIGJsb2NrICovCitzdGF0aWMgdm9pZCBfYmNtdHJfcmVhc3NfYmxvY2tfZnJlZShiY210cl9yZWFzcyAqKnByYikKK3sKKyAgICBiY210cl9yZWFzcyAqcmVhc3MgPSAqcHJiOworICAgIGludCBpOworCisgICAgZm9yIChpPTA7IGk8cmVhc3MtPm51bV9mcmFnbWVudHM7IGkrKykKKyAgICB7CisgICAgICAgIGJjbW9sdF9idWZfZnJlZSgmcmVhc3MtPmZyYWdtZW50c1tpXSk7CisgICAgfQorICAgIGJjbW9zX2ZyZWUocmVhc3MpOworICAgICpwcmIgPSBOVUxMOworfQorCisvKiBGcmVlIHRyYW5zcG9ydCBoZWFkZXIuIENhbGxlZCB1bmRlciB0cmFuc3BvcnQgbG9jayAqLworc3RhdGljIHZvaWQgX2JjbXRyX3Rtc2dfZnJlZShiY210cl9tc2cgKnRtc2csIGJjbXRyX21zZ19saXN0ICpjdXJfbGlzdCkKK3sKKyAgICAvKiBSZW1vdmUgZnJvbSB0aGUgbGlzdCBpdCBpcyBpbiwgaWYgYW55ICovCisgICAgaWYgKGN1cl9saXN0KQorICAgICAgICBUQUlMUV9SRU1PVkUoY3VyX2xpc3QsIHRtc2csIGwpOworCisgICAgYmNtb2x0X2J1Zl9mcmVlKCZ0bXNnLT50eF9idWYpOworICAgIGJjbW9sdF9idWZfZnJlZSgmdG1zZy0+cnhfYnVmKTsKKyAgICBpZiAodG1zZy0+cmVhc3MpCisgICAgICAgIF9iY210cl9yZWFzc19ibG9ja19mcmVlKCZ0bXNnLT5yZWFzcyk7CisgICAgbWVtc2V0KHRtc2csIDAsIEJDTVRSX0hEUl9DTEVBUl9TSVpFKTsKKworICAgIC8qIFJlcXVlc3QtcmVzcG9uc2Ugb3IgYXV0b25vbW91cyA/ICovCisgICAgVEFJTFFfSU5TRVJUX1RBSUwodG1zZy0+ZnJlZV9saXN0LCB0bXNnLCBsKTsKK30KKworLyogVW5wYWNrIG1lc3NhZ2UuICp1bnBhY2tlZCBpcyBzZXQ9TlVMTCBpbiBjYXNlIG9mIGVycm9yICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Vycm5vIF9iY210cl9tc2dfdW5wYWNrKGJjbXRyX2Nvbm4gKmNvbm4sIGJjbW9sdF9idWYgKmJ1ZiwgYmNtdHJfaGRyICpoZHIsIHVpbnQzMl90IHRzLCBiY21vbHRfbXNnICoqbXNnKQoreworICAgIGludDE2X3QgZXJyOworICAgIHVpbnQ4X3QgKnBhY2tlZCA9IGJ1Zi0+Y3VycjsKKyAgICB1aW50MzJfdCBwYWNrZWRfbGVuZ3RoID0gYmNtb2x0X2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKTsKKworICAgIC8qIFVucGFjayAqLworICAgIEJVR19PTighYnVmLT5zdGFydCk7CisgICAgZXJyID0gYmNtb2x0X21zZ191bnBhY2soYnVmLCBtc2cpOworICAgIGlmIChlcnIgPCAwKQorICAgIHsKKyAgICAgICAgQkNNVFJfQ0xEX0NIRUNLX05PVElGWShjb25uLT5kZXZpY2UsIGhkciwgQkNNVFJfQ0xEX0VWX1JFQ1ZfRElTQ0FSRCwgdHMsIHBhY2tlZCwgcGFja2VkX2xlbmd0aCwgTlVMTCk7CisgICAgICAgICsrY29ubi0+c3RhdC51bnBhY2tfZXJyb3JzOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIEJDTVRSX0NMRF9DSEVDS19OT1RJRlkoY29ubi0+ZGV2aWNlLCBoZHIsIEJDTVRSX0NMRF9FVl9SRUNWLCB0cywgcGFja2VkLCBwYWNrZWRfbGVuZ3RoLCAqbXNnKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBUcmFuc3BvcnQgSVBDIHJlbGVhc2UgY2FsbGJhY2sgKi8KK3N0YXRpYyB2b2lkIF9iY210cl9pcGNfbXNnX3JlbGVhc2UoYmNtb3NfbXNnICptKQoreworICAgIEJDTU9TX1RSQUNFX0VSUigiV2Ugc2hvdWxkbid0IGJlIGhlcmUhXG4iKTsKK30KKworLyogVHJhbnNwb3J0IElQQyBtZXNzYWdlIGhhbmRsZXIuCisgKiBDYWxsZWQgaW4gY29udGV4dCBvZiB0aGUgdGFyZ2V0IG1vZHVsZSBhcyBwYXJ0CisgKiBvZiBkaXNwYXRjaGluZyBtZXNzYWdlIHRvIHRoZSB1c2VyIHRhc2suCisgKiBJdCB1bnBhY2tzIG1lc3NhZ2UsIHJlbGVhc2VzIHRyYW5zcG9ydCBoZWFkZXIgYW5kIGNhbGxzIHVzZXIgY2FsbGJhY2sKKyAqLworc3RhdGljIHZvaWQgX2JjbXRyX2lwY19tc2dfaGFuZGxlcihiY21vc19tb2R1bGVfaWQgbW9kdWxlX2lkLCBiY21vc19tc2cgKm0pCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgYmNtdHJfbXNnICp0bXNnID0gbS0+ZGF0YTsKKyAgICBiY210cl9jb25uICpjb25uID0gdG1zZy0+Y29ubjsKKyAgICBiY21vbHRfbXNnICptc2cgPSBOVUxMOworCisgICAgLyogVW5wYWNrICovCisgICAgZXJyID0gX2JjbXRyX21zZ191bnBhY2soY29ubiwgJnRtc2ctPnJ4X2J1ZiwgJnRtc2ctPmhkciwgdG1zZy0+dGltZXN0YW1wLCAmbXNnKTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9FUlIoCisgICAgICAgICAgICAiVW5wYWNrIGVycm9yIGZvciBtb2R1bGUgJWQuIEVycm9yICVzICglZClcbiIsCisgICAgICAgICAgICBtb2R1bGVfaWQsCisgICAgICAgICAgICBiY21vc19zdHJlcnJvcihlcnIpLAorICAgICAgICAgICAgZXJyKTsKKyAgICAgICAgbXNnID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAobXNnICE9IE5VTEwpCisgICAgeworICAgICAgICBiY210cl9oYW5kbGVyICpoID0gJmNvbm5faW5mb1tjb25uLT5kZXZpY2VdLm1zZ19oYW5kbGVyW3Rtc2ctPmhkci5tc2dfaWRdW3Rtc2ctPmhkci5pbnN0YW5jZV07CisgICAgICAgIG1zZy0+c3ViY2ggPSB0bXNnLT5zdWJjaDsKKyAgICAgICAgaWYgKGgtPmFwcF9jYikKKyAgICAgICAgeworICAgICAgICAgICAgbXNnLT5jb3JyX3RhZyA9IHRtc2ctPmhkci5jb3JyX3RhZzsKKyAgICAgICAgICAgIGgtPmFwcF9jYihjb25uLT5kZXZpY2UsIG1zZyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfbXNnX2ZyZWUobXNnKTsKKyAgICAgICAgICAgICsrY29ubi0+c3RhdC5ub19yeF9oYW5kbGVyOworICAgICAgICB9CisgICAgfQorCisgICAgLyogUmVsZWFzZSB0cmFuc3BvcnQgaGVhZGVyIHVuZGVyIGNvbm4gbG9jayAqLworICAgIGJjbW9zX211dGV4X2xvY2soJmNvbm4tPm11dGV4KTsKKyAgICBfYmNtdHJfdG1zZ19mcmVlKHRtc2csIE5VTEwpOworICAgIGJjbW9zX211dGV4X3VubG9jaygmY29ubi0+bXV0ZXgpOworfQorCisvKiBJbml0IElQQyBoZWFkZXIgaW4gdHJhbnNwb3J0IG1lc3NhZ2UgKi8KK3N0YXRpYyB2b2lkIF9iY210cl90bXNnX2lwY19pbml0KGJjbXRyX21zZyAqdG1zZykKK3sKKyAgICB0bXNnLT5pcGNfaGRyLnN0YXJ0ID0gdG1zZy0+aXBjX2hkci5kYXRhID0gdG1zZzsKKyAgICB0bXNnLT5pcGNfaGRyLnR5cGUgPSBCQ01PU19NU0dfSURfSU5URVJOQUxfSVBDOworICAgIHRtc2ctPmlwY19oZHIucmVsZWFzZSA9IF9iY210cl9pcGNfbXNnX3JlbGVhc2U7CisgICAgdG1zZy0+aXBjX2hkci5oYW5kbGVyID0gX2JjbXRyX2lwY19tc2dfaGFuZGxlcjsKK30KKworLyogUHJlLWFsbG9jYXRlIHRyYW5zcG9ydCBoZWFkZXIgYXJyYXksIHB1dCBhbGwgYmxvY2tzIG9uIGZyZWUgbGlzdHMgKi8KK3N0YXRpYyBpbnQgX2JjbXRyX3Rtc2dfbGlzdF9hbGxvYyhiY210cl9jb25uICpjb25uKQoreworICAgIGludCBuX2hkciwgaTsKKyAgICBiY210cl9tc2cgKnRtc2c7CisKKyAgICBuX2hkciA9IGNvbm4tPmNmZy5tYXhfcmVxdWVzdHMgKyBjb25uLT5jZmcubWF4X2F1dG9zOworICAgIGNvbm4tPnRtc2dfYXJyYXkgPSBiY21vc19jYWxsb2Moc2l6ZW9mKGJjbXRyX21zZykgKiBuX2hkcik7CisgICAgaWYgKCFjb25uLT50bXNnX2FycmF5KQorICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKworICAgIHRtc2cgPSBjb25uLT50bXNnX2FycmF5OworICAgIGZvciAoaT0wOyBpPGNvbm4tPmNmZy5tYXhfcmVxdWVzdHM7IGkrKywgdG1zZysrKQorICAgIHsKKyAgICAgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICAgICAgVEFJTFFfSU5TRVJUX1RBSUwoJmNvbm4tPmZyZWVfcmVxX2xpc3QsIHRtc2csIGwpOworICAgICAgICB0bXNnLT5mcmVlX2xpc3QgPSAmY29ubi0+ZnJlZV9yZXFfbGlzdDsKKyAgICAgICAgcmMgPSBiY21vc19zZW1fY3JlYXRlKCZ0bXNnLT5zZW0sIDAsIDAsIE5VTEwpOworICAgICAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgX2JjbXRyX3Rtc2dfaXBjX2luaXQodG1zZyk7CisgICAgICAgIHRtc2ctPmNvbm4gPSBjb25uOworICAgIH0KKyAgICBmb3IgKGk9MDsgaTxjb25uLT5jZmcubWF4X2F1dG9zOyBpKyssIHRtc2crKykKKyAgICB7CisgICAgICAgIFRBSUxRX0lOU0VSVF9UQUlMKCZjb25uLT5mcmVlX2F1dG9fbGlzdCwgdG1zZywgbCk7CisgICAgICAgIHRtc2ctPmZyZWVfbGlzdCA9ICZjb25uLT5mcmVlX2F1dG9fbGlzdDsKKyAgICAgICAgX2JjbXRyX3Rtc2dfaXBjX2luaXQodG1zZyk7CisgICAgICAgIHRtc2ctPmNvbm4gPSBjb25uOworICAgIH0KKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogQ2xlYW51cCBmdW5jdGlvbiAtIGZyZWUgdHJhbnNwb3J0IGhlYWRlcnMgKi8KK3N0YXRpYyB2b2lkIF9iY210cl90bXNnX2xpc3RfZnJlZShiY210cl9jb25uICpjb25uKQoreworICAgIGJjbXRyX21zZyAqdG1zZywgKnRtcF90bXNnOworCisgICAgaWYgKCFjb25uLT50bXNnX2FycmF5KQorICAgICAgICByZXR1cm47CisKKyAgICBUQUlMUV9GT1JFQUNIX1NBRkUodG1zZywgJmNvbm4tPm1zZ19saXN0LCBsLCB0bXBfdG1zZykKKyAgICB7CisgICAgICAgIGJjbW9sdF9tc2cgKm1zZyA9IHRtc2ctPm1zZzsKKyAgICAgICAgLyogUmVsZWFzZSB3YWl0aW5nIHRhc2sgaWYgcmVxdWVzdC1yZXNwb25zZSAqLworICAgICAgICBpZiAobXNnICYmIHRtc2ctPmVyciA9PSBCQ01fRVJSX0lOX1BST0dSRVNTKQorICAgICAgICB7CisgICAgICAgICAgICBtc2ctPmVyciA9IEJDTV9FUlJfQ09NTV9GQUlMOworICAgICAgICAgICAgYmNtb3Nfc2VtX3Bvc3QoJnRtc2ctPnNlbSk7CisgICAgICAgIH0KKyAgICB9CisgICAgVEFJTFFfRk9SRUFDSF9TQUZFKHRtc2csICZjb25uLT5mcmVlX3JlcV9saXN0LCBsLCB0bXBfdG1zZykKKyAgICB7CisgICAgICAgIGJjbW9zX3NlbV9kZXN0cm95KCZ0bXNnLT5zZW0pOworICAgIH0KKyAgICBiY21vc19mcmVlKGNvbm4tPnRtc2dfYXJyYXkpOworfQorCisvKiBBbGxvY2F0ZSB0cmFuc3BvcnQgaGVhZGVyIGZyb20gdGhlIGdpdmVuIGZyZWUgbGlzdC4KKyAqIE11c3QgYmUgY2FsbGVkIHVuZGVyIGxvY2sKKyAqLworc3RhdGljIGlubGluZSBiY210cl9tc2cgKl9iY210cl9tc2dfZ2V0X2ZyZWUoYmNtdHJfbXNnX2xpc3QgKmZyZWVfbGlzdCkKK3sKKyAgICBiY210cl9tc2cgKnRtc2cgPSBUQUlMUV9GSVJTVChmcmVlX2xpc3QpOworICAgIGlmICh0bXNnKQorICAgICAgICBUQUlMUV9SRU1PVkUoZnJlZV9saXN0LCB0bXNnLCBsKTsKKyAgICByZXR1cm4gdG1zZzsKK30KKworLyogRmluZCBtZXNzYWdlIGJ5IGNvcnJlbGF0aW9uIHRhZworICogQ2FsbGVkIHVuZGVyIGxvY2sKKyAqLworc3RhdGljIGJjbXRyX21zZyAqX2JjbXRyX21zZ19nZXRfYnlfY29ycl90YWcoY29uc3QgYmNtdHJfY29ubiAqY29ubiwgY29uc3QgYmNtdHJfaGRyICpoZHIpCit7CisgICAgYmNtdHJfbXNnICp0bXNnOworCisgICAgVEFJTFFfRk9SRUFDSCh0bXNnLCAmY29ubi0+bXNnX2xpc3QsIGwpCisgICAgeworICAgICAgICBpZiAodG1zZy0+aGRyLmNvcnJfdGFnPT1oZHItPmNvcnJfdGFnICYmIHRtc2ctPmhkci5tc2dfaWQ9PWhkci0+bXNnX2lkICYmIHRtc2ctPmVyciA9PSBCQ01fRVJSX0lOX1BST0dSRVNTKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiB0bXNnOworfQorCisvKiBNZXNzYWdlIHJlYXNzZW1ibGVyLiBSZXR1cm5zIFRSVUUgaWYgbWVzc2FnZSByZWFzc2VtYmxpbmcgaXMgY29tcGxldGVkICovCitzdGF0aWMgYmNtb3NfYm9vbCBfYmNtdHJfcmVhc3NlbWJsZShiY210cl9jb25uICpjb25uLCBiY210cl9tc2cgKnRtc2csIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBiY210cl9oZHIgKmhkciA9ICZ0bXNnLT5oZHI7CisgICAgdWludDE2X3QgZnJhZ19udW0gPSBoZHItPmZyYWdfbnVtYmVyOworICAgIGJjbW9zX2Jvb2wgZG9uZSA9IEJDTU9TX0ZBTFNFOworICAgIGJjbW9zX2Jvb2wgaXNfbGFzdDsKKworICAgIGlzX2xhc3QgPSAhaGRyLT5tb3JlX2ZyYWdtZW50czsKKworICAgIC8qIFNpbmdsZS1idWZmZXIgbWVzc2FnZSA/ICovCisgICAgaWYgKGlzX2xhc3QgJiYgIWZyYWdfbnVtKQorICAgIHsKKyAgICAgICAgdG1zZy0+cnhfYnVmID0gKmJ1ZjsKKyAgICAgICAgdG1zZy0+ZXJyID0gQkNNX0VSUl9PSzsKKyAgICAgICAgYnVmLT5zdGFydCA9IE5VTEw7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIC8qCisgICAgICogTXVsdGktcGFydCBtZXNzYWdlCisgICAgICovCisKKyAgICAvKiBEaXNjYXJkIGlmIGludmFsaWQgZnJhZ21lbnQgbnVtYmVyIG9yIGR1cGxpY2F0ZSAqLworICAgIGlmIChmcmFnX251bSA+PSBjb25uLT5jZmcubWF4X2ZyYWdtZW50cyB8fAorICAgICAgICAodG1zZy0+cmVhc3MgJiYgdG1zZy0+cmVhc3MtPmZyYWdtZW50c1tmcmFnX251bV0uc3RhcnQpICkKKyAgICB7CisgICAgICAgIGJjbW9sdF9idWZfZnJlZShidWYpOworICAgICAgICAvKiBJZiBsYXN0IG91dC1vZiByYW5nZSBmcmFnbWVudCB3YXMgcmVjZWl2ZWQgcmVwb3J0IGl0LgorICAgICAgICAgKiBXZSB3YW50IHRvIGF2b2lkIHJlcXVlc3QgcmV0cmFuc21pc3Npb24gaW4gdGhpcyBjYXNlICovCisgICAgICAgIGlmIChmcmFnX251bSA+PSBjb25uLT5jZmcubWF4X2ZyYWdtZW50cykKKyAgICAgICAgeworICAgICAgICAgICAgdG1zZy0+ZXJyID0gQkNNX0VSUl9UT09fTUFOWV9GUkFHUzsKKyAgICAgICAgICAgIHJldHVybiBpc19sYXN0OworICAgICAgICB9CisgICAgICAgICsrY29ubi0+c3RhdC5mcmFnX2ludmFsaWQ7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAvKiBBbGxvY2F0ZSByZWFzc2VtYmx5IGJ1ZmZlciBpZiBub3QgZG9uZSB5ZXQgYW5kIHN0b3JlIGZyYWdtZW50ICovCisgICAgaWYgKCF0bXNnLT5yZWFzcykKKyAgICB7CisgICAgICAgIHRtc2ctPnJlYXNzID0gYmNtb3NfY2FsbG9jKHNpemVvZihiY210cl9yZWFzcykgKyBjb25uLT5jZmcubWF4X2ZyYWdtZW50cyAqIHNpemVvZihiY21vbHRfYnVmKSk7CisgICAgICAgIGlmICghdG1zZy0+cmVhc3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtc2ctPmVyciA9IEJDTV9FUlJfTk9NRU07CisgICAgICAgICAgICArK2Nvbm4tPnN0YXQubXNnX25vX21lbTsKKyAgICAgICAgICAgIGJjbW9sdF9idWZfZnJlZShidWYpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIHRtc2ctPnJlYXNzLT5mcmFnbWVudHMgPSAoYmNtb2x0X2J1ZiAqKSgobG9uZyl0bXNnLT5yZWFzcyArIHNpemVvZihiY210cl9yZWFzcykpOworICAgIH0KKyAgICB0bXNnLT5yZWFzcy0+dG90YWxfc2l6ZSArPSBiY21vbHRfYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpOworICAgIHRtc2ctPnJlYXNzLT5mcmFnbWVudHNbZnJhZ19udW1dID0gKmJ1ZjsKKyAgICBidWYtPnN0YXJ0ID0gTlVMTDsKKyAgICB0bXNnLT5yZWFzcy0+bnVtX2ZyYWdtZW50cysrOworICAgIGlmIChpc19sYXN0KQorICAgICAgICB0bXNnLT5yZWFzcy0+bWF4X2ZyYWdtZW50ID0gZnJhZ19udW07CisgICAgZG9uZSA9ICh0bXNnLT5yZWFzcy0+bWF4X2ZyYWdtZW50ICYmICh0bXNnLT5yZWFzcy0+bnVtX2ZyYWdtZW50cyA+IHRtc2ctPnJlYXNzLT5tYXhfZnJhZ21lbnQpKTsKKyAgICArK2Nvbm4tPnN0YXQuZnJhZ19yZWNlaXZlZDsKKworICAgIC8qIFJlYXNzZW1ibGUgaWYgZG9uZSAqLworICAgIGlmIChkb25lKQorICAgIHsKKyAgICAgICAgLyogQWxsb2NhdGUgYmlnIGZsYXQgYnVmZmVyICovCisgICAgICAgIGlmIChiY21vbHRfYnVmX2FsbG9jKCZ0bXNnLT5yeF9idWYsIHRtc2ctPnJlYXNzLT50b3RhbF9zaXplLCBCQ01UUl9CVUZfRU5ESUFOKSA9PSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmJvZHkgPSB0bXNnLT5yeF9idWYuc3RhcnQ7CisKKyAgICAgICAgICAgIGZvciAoaT0wOyBpPHRtc2ctPnJlYXNzLT5udW1fZnJhZ21lbnRzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgZnJhZ19zaXplID0gYmNtb2x0X2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoJnRtc2ctPnJlYXNzLT5mcmFnbWVudHNbaV0pOworICAgICAgICAgICAgICAgIEJVR19PTighdG1zZy0+cmVhc3MtPmZyYWdtZW50c1tpXS5jdXJyKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoYm9keSwgdG1zZy0+cmVhc3MtPmZyYWdtZW50c1tpXS5jdXJyLCBmcmFnX3NpemUpOworICAgICAgICAgICAgICAgIGJvZHkgKz0gZnJhZ19zaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdG1zZy0+ZXJyID0gQkNNX0VSUl9PSzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFJlYXNzZW1ibHkgYnVmZmVyIGFsbG9jYXRpb24gZmFpbGVkICovCisgICAgICAgICAgICB0bXNnLT5lcnIgPSBCQ01fRVJSX05PTUVNOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIE1vcmUgZnJhZ21lbnRzIGV4cGVjdGVkLiBVcGRhdGUgdGltZXN0YW1wIHRvIHByb2xvbmcgdGltaW5nIG91dCAqLworICAgICAgICB0bXNnLT50aW1lc3RhbXAgPSBiY21vc190aW1lc3RhbXAoKTsKKyAgICB9CisKKyAgICByZXR1cm4gZG9uZTsKK30KKworLyogTm90aWZ5IGFwcGxpY2F0aW9uIHRoYXQgbWVzc2FnZSBpcyByZWFkeSAqLworc3RhdGljIGlubGluZSB2b2lkIF9iY210cl9ub3RpZnlfcmVhZHkoYmNtdHJfY29ubiAqY29ubiwgYmNtdHJfbXNnICp0bXNnKQoreworICAgIGJjbW9zX3NlbV9wb3N0KCZ0bXNnLT5zZW0pOworfQorCisvKiBOb3RpZnkgcnggcmVxdWVzdC9yZXNwb25zZSBtZXNzYWdlCisgKiBjYWxsZWQgdW5kZXIgY29ubmVjdGlvbiBsb2NrCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfYmNtdHJfbm90aWZ5X3J4X3Jlc3BvbnNlKGJjbXRyX2Nvbm4gKmNvbm4sIGJjbXRyX21zZyAqdG1zZykKK3sKKyAgICArK2Nvbm4tPnN0YXQubXNnX3Jlc3BfcmVjZWl2ZWQ7CisKKyAgICAvKiBOb3cgdW5sb2NrIGFuZCBub3RpZnkgYXBwbGljYXRpb24uIEF1dG9ub21vdXMgaGFuZGxlciBpcyBvbmx5IGNhbGxlZCBpZiBtZXNzYWdlIGlzIE9LLgorICAgICAgIFRoZSBsb2NrIGhhcyBiZWVuIHRha2VuIGluIF9iY210cl9yeF9wYWNrZXQgKi8KKyAgICBiY21vc19tdXRleF91bmxvY2soJmNvbm4tPm11dGV4KTsKKworICAgIC8qIFJlbGVhc2Ugd2FpdGluZyBhcHBsaWNhdGlvbi4gSXQgd2lsbCB0YWtlIGNhcmUgb2YgdW5wYWNraW5nICovCisgICAgX2JjbXRyX25vdGlmeV9yZWFkeShjb25uLCB0bXNnKTsKK30KKworLyogTm90aWZ5IHJ4IGF1dG9ub21vdXMgbWVzc2FnZQorICogY2FsbGVkIHVuZGVyIGNvbm5lY3Rpb24gbG9jaworICovCitzdGF0aWMgaW5saW5lIHZvaWQgX2JjbXRyX25vdGlmeV9yeF9yZXFfYXV0byhiY210cl9jb25uICpjb25uLCBiY210cl9tc2cgKnRtc2cpCit7CisgICAgYmNtb2x0X2J1ZiByeF9idWY7CisgICAgYmNtb2x0X21zZyAqbXNnID0gTlVMTDsKKyAgICBiY21vbHRfZ3JvdXBfaWQgbXNnX2lkID0gdG1zZy0+aGRyLm1zZ19pZDsKKyAgICBiY210cl9oYW5kbGVyICpoOworICAgIHVpbnQxNl90IGNvcnJfdGFnOworICAgIGJjbXRyX2hkciBoZHIgPSB0bXNnLT5oZHI7CisgICAgdWludDMyX3QgdHMgPSB0bXNnLT50aW1lc3RhbXA7CisgICAgYmNtb2x0X3N1YmNoYW5uZWwgc3ViY2ggPSB0bXNnLT5zdWJjaDsKKyAgICBiY21vc19lcnJubyBlcnI7CisKKyAgICBpZiAobXNnX2lkID49IEJDTU9MVF9HUk9VUF9JRF9fTlVNX09GKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJVbmV4cGVjdGVkIG1zZyBncm91cCBpZDogJXVcbiIsIHRtc2ctPmhkci5tc2dfaWQpOworICAgICAgICBfYmNtdHJfdG1zZ19mcmVlKHRtc2csIE5VTEwpOworICAgICAgICBiY21vc19tdXRleF91bmxvY2soJmNvbm4tPm11dGV4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAodG1zZy0+aGRyLmluc3RhbmNlID49IEJDTVRSX01BWF9JTlNUQU5DRVMpCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9FUlIoIlVuZXhwZWN0ZWQgaW5zdGFuY2UgaWQ6ICV1XG4iLCB0bXNnLT5oZHIuaW5zdGFuY2UpOworICAgICAgICBfYmNtdHJfdG1zZ19mcmVlKHRtc2csIE5VTEwpOworICAgICAgICBiY21vc19tdXRleF91bmxvY2soJmNvbm4tPm11dGV4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBoID0gJmNvbm5faW5mb1tjb25uLT5kZXZpY2VdLm1zZ19oYW5kbGVyW3Rtc2ctPmhkci5tc2dfaWRdW3Rtc2ctPmhkci5pbnN0YW5jZV07CisgICAgQlVHX09OKCFoLT5hcHBfY2IpOworICAgICsrY29ubi0+c3RhdC5tc2dfcmVxX2F1dG9fcmVjZWl2ZWQ7CisKKyAgICAvKiBJZiBkaXNwYXRjaCBpcyByZXF1aXJlZCAtIGRvIGl0LgorICAgICAqIFRoZSBtZXNzYWdlIHdpbGwgYmUgdW5wYWNrZWQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHJlY2VpdmVyCisgICAgICovCisgICAgaWYgKChoLT5mbGFncyAmIEJDTU9MVF9BVVRPX0ZMQUdTX0RJU1BBVENIKSkKKyAgICB7CisgICAgICAgIGVyciA9IGJjbW9zX21zZ19zZW5kX3RvX21vZHVsZShoLT5tb2R1bGUsICZ0bXNnLT5pcGNfaGRyLCAwKTsKKyAgICAgICAgaWYgKGVycikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJDYW4ndCBkZWxpdmVyIG1lc3NhZ2UgdG8gbW9kdWxlICVkLiBFcnJvciAlcyglZClcbiIsCisgICAgICAgICAgICAgICAgaC0+bW9kdWxlLCBiY21vc19zdHJlcnJvcihlcnIpLCBlcnIpOworICAgICAgICAgICAgX2JjbXRyX3Rtc2dfZnJlZSh0bXNnLCBOVUxMKTsKKyAgICAgICAgfQorICAgICAgICBiY21vc19tdXRleF91bmxvY2soJmNvbm4tPm11dGV4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIE5vIGRpc3BhdGNoLiBVbnBhY2tpbmcgaW4gdGhlIGNvbnRleHQgb2YgcnggdGhyZWFkICovCisgICAgY29ycl90YWcgPSB0bXNnLT5oZHIuY29ycl90YWc7CisgICAgLyogTWFrZSBzdXJlIHRoYXQgcnhfYnVmIGlzIG5vdCByZWxlYXNlZCBieSB0aGUgZm9sbG93aW5nIF9iY210cl9tc2dfZnJlZS4KKyAgICAgKiBJdCBpcyBuZWVkZWQgZm9yIHVucGFjayBhbmQgd2lsbCBiZSByZWxlYXNlZCBzZXBhcmF0ZWx5IGxhdGVyLiAqLworICAgIHJ4X2J1ZiA9IHRtc2ctPnJ4X2J1ZjsKKyAgICB0bXNnLT5yeF9idWYuc3RhcnQgPSBOVUxMOworICAgIF9iY210cl90bXNnX2ZyZWUodG1zZywgTlVMTCk7CisKKyAgICAvKiBSZWxlYXNlIGNvbm5lY3Rpb24gbG9jayB0YWtlbiBpbiBfYmNtdHJfcnhfcGFja2V0ICovCisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZjb25uLT5tdXRleCk7CisKKyAgICAvKiBVbnBhY2sgYW5kIGRlbGl2ZXIgKi8KKyAgICBfYmNtdHJfbXNnX3VucGFjayhjb25uLCAmcnhfYnVmLCAmaGRyLCB0cywgJm1zZyk7CisKKyAgICBiY21vbHRfYnVmX2ZyZWUoJnJ4X2J1Zik7CisKKyAgICBpZiAobXNnKQorICAgIHsKKyAgICAgICAgbXNnLT5jb3JyX3RhZyA9IGNvcnJfdGFnOworICAgICAgICBtc2ctPnN1YmNoID0gc3ViY2g7CisgICAgICAgIGgtPmFwcF9jYihjb25uLT5kZXZpY2UsIG1zZyk7CisgICAgfQorfQorCisvKiBIYW5kbGUgcnggZGF0YS4gUmV0dXJucyBudW1iZXIgb2YgbWVzc2FnZXMgdGhhdCB3YXMgaWRlbnRpZmllZCBhbmQgcmVhc3NlbWJsZWQuIENhbiBiZSAwIG9yIDEgKi8KK3N0YXRpYyBpbnQgX2JjbXRyX3J4X3BhY2tldChiY210cl9jb25uICpjb25uLCBiY21vbHRfc3ViY2hhbm5lbCBzdWJjaCwgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGJjbXRyX2hkciBoZHI7CisgICAgYmNtdHJfbXNnICp0bXNnOworICAgIGJjbW9zX2Jvb2wgbXNnX2RvbmU7CisgICAgYmNtb3NfYm9vbCBpc19yZXNwb25zZTsKKworICAgIC8qIFRyYW5zcG9ydCBsb2NrLiBUaGlzIGxvY2sgaXMgbmVlZGVkIHRvCisgICAgICogLSBhbGxvY2F0ZS9yZWxlYXNlIHRyYW5zcG9ydCBoZWFkZXIKKyAgICAgKiAtIHVwZGF0ZSBzdGF0aXN0aWNzCisgICAgICovCisgICAgYmNtb3NfbXV0ZXhfbG9jaygmY29ubi0+bXV0ZXgpOworCisgICAgLyogSWYgc29tZSBkYXRhIHdhcyByZWNlaXZlZCAtIGhhbmRsZSBpdCAqLworICAgIGlmIChidWYtPmxlbiA8IEJDTVRSX0hEUl9TSVpFKQorICAgIHsKKyAgICAgICAgLyogTWVzc2FnZSBpcyB0b28gc2hvcnQgKi8KKyAgICAgICAgKytjb25uLT5zdGF0Lm1zZ19jb21tX2VycjsKKyAgICAgICAgZ290byByeF9mcmVlX2J1Zl9hbmRfZXJyb3JfZXhpdDsKKyAgICB9CisKKyAgICBpZiAoTlVMTCA9PSBidWYtPmN1cnIpCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9FUlIoIkludmFsaWQgYnVmZmVyIHJlY2VpdmVkIVxuIik7CisgICAgICAgIGdvdG8gcnhfZG9uZTsKKyAgICB9CisKKyAgICBiY210cl9oZWFkZXJfdW5wYWNrKGJ1Zi0+Y3VyciwgJmhkcik7CisgICAgYmNtb2x0X2J1Zl9za2lwKGJ1ZiwgQkNNVFJfSERSX1NJWkUpOworICAgIGlzX3Jlc3BvbnNlID0gKGhkci5kaXIgPT0gQkNNT0xUX01TR19ESVJfUkVTUE9OU0UpOworCisgICAgLyogRmluZCB0cmFuc3BvcnQgaGVhZGVyLiBJZiBub3QgZm91bmQgLSBhbGxvY2F0ZSBuZXcgZm9yIGF1dG9ub21vdXMgbWVzc2FnZSAqLworICAgIHRtc2cgPSBfYmNtdHJfbXNnX2dldF9ieV9jb3JyX3RhZyhjb25uLCAmaGRyKTsKKyAgICBpZiAoIXRtc2cpCisgICAgeworICAgICAgICBpZiAoIWlzX3Jlc3BvbnNlKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBBbGxvY2F0ZSBuZXcgdHJhbnNwb3J0IGJsb2NrICovCisgICAgICAgICAgICB0bXNnID0gX2JjbXRyX21zZ19nZXRfZnJlZSgmY29ubi0+ZnJlZV9hdXRvX2xpc3QpOworICAgICAgICAgICAgaWYgKCF0bXNnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICsrY29ubi0+c3RhdC5tc2dfdG9vX21hbnlfYXV0bzsKKyAgICAgICAgICAgICAgICBnb3RvIHJ4X2ZyZWVfYnVmX2FuZF9lcnJvcl9leGl0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgdG1zZy0+ZXJyID0gQkNNX0VSUl9JTl9QUk9HUkVTUzsKKyAgICAgICAgICAgIFRBSUxRX0lOU0VSVF9UQUlMKCZjb25uLT5tc2dfbGlzdCwgdG1zZywgbCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBSZXNwb25zZSwgYnV0IG5vIHJlcXVlc3QgLSBkaXNjYXJkICovCisgICAgICAgICAgICArK2Nvbm4tPnN0YXQubXNnX25vX3JlcTsKKyAgICAgICAgICAgIEJDTVRSX0NMRF9DSEVDS19OT1RJRlkoY29ubi0+ZGV2aWNlLCAmaGRyLCBCQ01UUl9DTERfRVZfUkVDVl9ESVNDQVJELAorICAgICAgICAgICAgICAgIGJjbW9zX3RpbWVzdGFtcCgpLCBidWYtPmN1cnIsIGJjbW9sdF9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZiksIE5VTEwpOworICAgICAgICAgICAgZ290byByeF9mcmVlX2J1Zl9hbmRfZXJyb3JfZXhpdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFJlYXNzZW1ibGUuICJidWYiIHNob3VsZCBub3QgYmUgdXNlZCBmb2xsb3dpbmcgdGhpcyBjYWxsICovCisgICAgdG1zZy0+aGRyID0gaGRyOworICAgIHRtc2ctPnN1YmNoID0gc3ViY2g7CisgICAgbXNnX2RvbmUgPSBfYmNtdHJfcmVhc3NlbWJsZShjb25uLCB0bXNnLCBidWYpOworCisgICAgLyogSWYgZXhwZWN0cyBtb3JlIHBhcnRzIC0gbm90aGluZyBtb3JlIHRvIGRvIGhlcmUgKi8KKyAgICBpZiAoIW1zZ19kb25lKQorICAgICAgICBnb3RvIHJ4X2RvbmU7CisKKyAgICBpZiAodG1zZy0+ZXJyICYmICFpc19yZXNwb25zZSkKKyAgICB7CisgICAgICAgIF9iY210cl90bXNnX2ZyZWUodG1zZywgJmNvbm4tPm1zZ19saXN0KTsKKyAgICAgICAgZ290byByeF9kb25lOworICAgIH0KKworICAgIC8qIERvbmUgd2l0aCB0aGUgbWVzc2FnZS4gR2V0IGl0IG91dCBvZiBwZW5kaW5nIG1lc3NhZ2UgcXVldWUgdG8gYXZvaWQgcmFjZSBjb25kaXRpb24KKyAgICAgKiB3aGVuIHRpbWVvdXQgaGFwcGVucyB3aGlsZSB0aGUgbWVzc2FnZSBpcyBpbiBmbGlnaHQgdG8gdGhlIGRlc3RpbmF0aW9uIHRhc2suCisgICAgICovCisgICAgVEFJTFFfUkVNT1ZFKCZjb25uLT5tc2dfbGlzdCwgdG1zZywgbCk7CisKKyAgICAvKiBOb3RpZnkgcnguIGNvbm4tPm11dGV4IGlzIHN0aWxsIHRha2VuLiBJdCB3aWxsIGJlIHJlbGVhc2VkCisgICAgICAgaW5zaWRlIF9iY210cl9ub3RpZnlfcnhfcmVzcG9uc2UoKSwgX2JjbXRyX25vdGlmeV9yeF9yZXFfYXV0bygpICovCisgICAgdG1zZy0+dGltZXN0YW1wID0gYmNtb3NfdGltZXN0YW1wKCk7CisgICAgaWYgKGlzX3Jlc3BvbnNlKQorICAgIHsKKyAgICAgICAgX2JjbXRyX25vdGlmeV9yeF9yZXNwb25zZShjb25uLCB0bXNnKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgX2JjbXRyX25vdGlmeV9yeF9yZXFfYXV0byhjb25uLCB0bXNnKTsKKyAgICB9CisKKyAgICByZXR1cm4gMTsKKworICAgIC8qIEVycm9yIHJldHVybiAqLworcnhfZnJlZV9idWZfYW5kX2Vycm9yX2V4aXQ6CisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZjb25uLT5tdXRleCk7CisgICAgYmNtb2x0X2J1Zl9mcmVlKGJ1Zik7CisgICAgcmV0dXJuIDA7CisKKyAgICAvKiByZXR1cm4gd2l0aG91dCBhIGJ1ZmZlciAqLworcnhfZG9uZToKKyAgICBiY21vc19tdXRleF91bmxvY2soJmNvbm4tPm11dGV4KTsKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIExvdy1sZXZlbCBmcmFnbWVudCBhbmQgc2VuZCBmdW5jdGlvbi4KKyAqIEl0IGFsbG9jYXRlcyBhIHNlcmllcyBvZiBidWZmZXJzIHVwIHRvIE1BWF9NVFUgc2l6ZSwgY29waWVzIG9yaWdpbmFsIGRhdGEgaW50byB0aGVtIGFuZCBzZW5kcy4KKyAqIFRoZSBvcmlnaW5hbCBidWZmZXIgc3RheXMgaW50YWN0IC0gaW4gY2FzZSBpdCBzaG91bGQgYmUgcmV0cmFuc21pdHRlZAorICovCitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbXRyX2ZyYWdtZW50X2FuZF9zZW5kKGJjbXRyX2Nvbm4gKmNvbm4sIGJjbXRyX21zZyAqdG1zZywgYmNtdHJfc2VuZF9mbGFncyBmbGFncykKK3sKKyAgICB1aW50MzJfdCBmcmFnX251bWJlciA9IDA7CisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKyAgICB1aW50MzJfdCBkYXRhX29mZnNldCA9IGNvbm4tPmNmZy5wbHVnaW5fY2ZnLmhlYWRyb29tICsgQkNNVFJfSERSX1NJWkU7CisgICAgdWludDMyX3QgZGF0YV9sZW4gPSBiY21vbHRfYnVmX2dldF91c2VkKCZ0bXNnLT50eF9idWYpIC0gZGF0YV9vZmZzZXQ7CisgICAgdWludDhfdCAqZGF0YSA9IHRtc2ctPnR4X2J1Zi5zdGFydCArIGRhdGFfb2Zmc2V0OworCisgICAgZG8KKyAgICB7CisgICAgICAgIHVpbnQzMl90IHNlbmRfbGVuID0gZGF0YV9sZW4gKyBCQ01UUl9IRFJfU0laRTsKKyAgICAgICAgYmNtb2x0X2J1ZiBmcmFnOworCisgICAgICAgIGlmIChzZW5kX2xlbiA+IGNvbm4tPmNmZy5tYXhfbXR1KQorICAgICAgICB7CisgICAgICAgICAgICBzZW5kX2xlbiA9IGNvbm4tPmNmZy5tYXhfbXR1OworICAgICAgICAgICAgdG1zZy0+aGRyLm1vcmVfZnJhZ21lbnRzID0gQkNNT1NfVFJVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtc2ctPmhkci5tb3JlX2ZyYWdtZW50cyA9IEJDTU9TX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgZXJyID0gYmNtb2x0X2J1Zl9hbGxvYygmZnJhZywgc2VuZF9sZW4gKyBjb25uLT5jZmcucGx1Z2luX2NmZy5oZWFkcm9vbSwgQkNNVFJfQlVGX0VORElBTik7CisgICAgICAgIGlmIChlcnIpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICB0bXNnLT5oZHIuZnJhZ19udW1iZXIgPSBmcmFnX251bWJlcisrOworCisgICAgICAgIC8qIFBhY2sgY29ycmVsYXRpb24gdGFnLCBjb21tYW5kIGFuZCBsZW5ndGggKi8KKyAgICAgICAgYmNtdHJfaGVhZGVyX3BhY2soJnRtc2ctPmhkciwgZnJhZy5zdGFydCArIGNvbm4tPmNmZy5wbHVnaW5fY2ZnLmhlYWRyb29tKTsKKyAgICAgICAgYmNtb2x0X2J1Zl9za2lwKCZmcmFnLCBkYXRhX29mZnNldCk7CisgICAgICAgIGlmIChiY21vbHRfYnVmX3dyaXRlKCZmcmFnLCBkYXRhLCBzZW5kX2xlbiAtIEJDTVRSX0hEUl9TSVpFKSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogU2VuZCB1c2luZyBjdXN0b21lci1wcm92aWRlZCBkcml2ZXIgKi8KKyAgICAgICAgICAgIGVyciA9IGNvbm4tPmRyaXZlci5zZW5kKGNvbm4tPmRydl9wcml2LCB0bXNnLT5tc2ctPnN1YmNoLCAmZnJhZywgZmxhZ3MpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZXJyID0gQkNNX0VSUl9PVkVSRkxPVzsKKyAgICAgICAgfQorICAgICAgICBiY21vbHRfYnVmX2ZyZWUoJmZyYWcpOworICAgICAgICBpZiAoZXJyKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRhdGFfbGVuIC09IChzZW5kX2xlbiAtIEJDTVRSX0hEUl9TSVpFKTsKKyAgICAgICAgZGF0YSArPSAoc2VuZF9sZW4gLSBCQ01UUl9IRFJfU0laRSk7CisKKyAgICB9IHdoaWxlIChkYXRhX2xlbik7CisKKyAgICByZXR1cm4gZXJyOworfQorCisvKiBDaGVjayBmb3IgdGltZS1vdXRzLiByZXR1cm5zIG51bWJlciBvZiBtZXNzYWdlcyB0aW1lZCBvdXQgKi8KK3N0YXRpYyBpbnQgX2JjbXRyX2NoZWNrX3RpbWVvdXQoYmNtdHJfY29ubiAqY29ubikKK3sKKyAgICBiY210cl9tc2cgKnRtc2csICp0bXA7CisgICAgdWludDMyX3Qgbm93OworICAgIGludCBubXNnID0gMDsKKyAgICBiY21vc19lcnJubyBlcnI7CisKKyAgICAvKiBUcmFuc3BvcnQgbG9jayAqLworICAgIGJjbW9zX211dGV4X2xvY2soJmNvbm4tPm11dGV4KTsKKworICAgIG5vdyA9IGJjbW9zX3RpbWVzdGFtcCgpOworICAgIFRBSUxRX0ZPUkVBQ0hfU0FGRSh0bXNnLCAmY29ubi0+bXNnX2xpc3QsIGwsIHRtcCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9tc2cgKm1zZyA9IHRtc2ctPm1zZzsKKworICAgICAgICBpZiAobm93IC0gdG1zZy0+dGltZXN0YW1wIDw9IGNvbm4tPmNmZy5tc2dfdGltZW91dCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIC8qIFJldHJhbnNtaXQgPyAqLworICAgICAgICBpZiAobXNnICYmIHRtc2ctPnR4X2NvdW50IDw9IGNvbm4tPmNmZy5tYXhfcmV0cmllcykKKyAgICAgICAgeworICAgICAgICAgICAgdG1zZy0+dGltZXN0YW1wID0gYmNtb3NfdGltZXN0YW1wKCk7CisgICAgICAgICAgICBCQ01UUl9DTERfQ0hFQ0tfTk9USUZZKAorICAgICAgICAgICAgICAgIGNvbm4tPmRldmljZSwKKyAgICAgICAgICAgICAgICAmdG1zZy0+aGRyLAorICAgICAgICAgICAgICAgIEJDTVRSX0NMRF9FVl9SRVNFTkQsCisgICAgICAgICAgICAgICAgdG1zZy0+dGltZXN0YW1wLAorICAgICAgICAgICAgICAgIHRtc2ctPnR4X2J1Zi5zdGFydCArIGNvbm4tPmNmZy5wbHVnaW5fY2ZnLmhlYWRyb29tICsgQkNNVFJfSERSX1NJWkUsCisgICAgICAgICAgICAgICAgdG1zZy0+dHhfYnVmLmxlbiAtIChjb25uLT5jZmcucGx1Z2luX2NmZy5oZWFkcm9vbSArIEJDTVRSX0hEUl9TSVpFKSwKKyAgICAgICAgICAgICAgICBtc2cpOworCisgICAgICAgICAgICAvKiBGcmFnbWVudCBhbmQgc2VuZCBvciBzZW5kIGRpcmVjdGx5LCBkZXBlbmRpbmcgb24gbWVzc2FnZSBsZW5ndGggKi8KKyAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZ0bXNnLT50eF9idWYpID4gY29ubi0+Y2ZnLm1heF9tdHUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXJyID0gX2JjbXRyX2ZyYWdtZW50X2FuZF9zZW5kKGNvbm4sIHRtc2csIEJDTVRSX1NFTkRfRkxBR1NfUFJJX05PUk1BTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXJyID0gY29ubi0+ZHJpdmVyLnNlbmQoY29ubi0+ZHJ2X3ByaXYsIG1zZy0+c3ViY2gsICZ0bXNnLT50eF9idWYsIEJDTVRSX1NFTkRfRkxBR1NfUFJJX05PUk1BTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXJyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICsrY29ubi0+c3RhdC5tc2dfY29tbV9lcnI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK3Rtc2ctPnR4X2NvdW50OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvKiBHaXZpbmcgdXAgKi8KKyAgICAgICAgLyogUmVsZWFzZSB3YWl0aW5nIHRhc2sgaWYgcmVxdWVzdC1yZXNwb25zZSAtIHVubGVzcyBpdCBoYXMgYWxyZWFkeSBiZWVuIGRvbmUgKi8KKyAgICAgICAgaWYgKG1zZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHRtc2ctPmVyciA9PSBCQ01fRVJSX0lOX1BST0dSRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRtc2ctPmVyciA9IEJDTV9FUlJfVElNRU9VVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEJDTVRSX0NMRF9DSEVDS19OT1RJRlkoCisgICAgICAgICAgICAgICAgY29ubi0+ZGV2aWNlLAorICAgICAgICAgICAgICAgICZ0bXNnLT5oZHIsCisgICAgICAgICAgICAgICAgQkNNVFJfQ0xEX0VWX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgYmNtb3NfdGltZXN0YW1wKCksCisgICAgICAgICAgICAgICAgdG1zZy0+dHhfYnVmLnN0YXJ0ICsgY29ubi0+Y2ZnLnBsdWdpbl9jZmcuaGVhZHJvb20gKyBCQ01UUl9IRFJfU0laRSwKKyAgICAgICAgICAgICAgICB0bXNnLT50eF9idWYubGVuIC0gKGNvbm4tPmNmZy5wbHVnaW5fY2ZnLmhlYWRyb29tICsgQkNNVFJfSERSX1NJWkUpLAorICAgICAgICAgICAgICAgIG1zZyk7CisgICAgICAgICAgICBUQUlMUV9SRU1PVkUoJmNvbm4tPm1zZ19saXN0LCB0bXNnLCBsKTsKKyAgICAgICAgICAgIF9iY210cl9ub3RpZnlfcmVhZHkoY29ubiwgdG1zZyk7CisgICAgICAgICAgICArK2Nvbm4tPnN0YXQubXNnX3JlcV90aW1lb3V0OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgX2JjbXRyX3Rtc2dfZnJlZSh0bXNnLCAmY29ubi0+bXNnX2xpc3QpOworICAgICAgICAgICAgKytjb25uLT5zdGF0Lm1zZ19yZWFzc190aW1lb3V0OworICAgICAgICB9CisgICAgICAgICsrbm1zZzsKKyAgICB9CisgICAgY29ubi0+bGFzdF90aW1lb3V0X2NoZWNrID0gYmNtb3NfdGltZXN0YW1wKCk7CisKKyAgICAvKiBSZWxlYXNlIHRyYW5zcG9ydCBsb2NrICovCisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZjb25uLT5tdXRleCk7CisKKyAgICByZXR1cm4gbm1zZzsKK30KKworLyogQ2hlY2sgZm9yIHJlY2VpdmUgYW5kIHRpbWVvdXRzICovCitzdGF0aWMgaW50IF9iY210cl9yeF9wb2xsKGJjbXRyX2Nvbm4gKmNvbm4sIGludCAqcG5tc2cpCit7CisgICAgYmNtb2x0X2J1ZiBidWY7CisgICAgaW50IG5tc2cgPSAwLCBubXNnX3ByZXY7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworICAgIGJjbW9sdF9zdWJjaGFubmVsIHN1YmNoOworCisgICAgZG8KKyAgICB7CisgICAgICAgIG5tc2dfcHJldiA9IG5tc2c7CisKKyAgICAgICAgLyogUGx1Z2luIGRyaXZlcidzIHJlY3YgLSBnZXQgcGVuZGluZyByeCBwYWNrZXQgaXMgYW55LgorICAgICAgICAgKiBUaGUgZnVuY3Rpb24gaXMgbm90IGFsbG93ZWQgdG8gYmxvY2sgZm9yIG1vcmUgdGhlbiBCQ01UUl9NU0dfVElNRU9VVCBtcworICAgICAgICAgKi8KKyAgICAgICAgcmMgPSBjb25uLT5kcml2ZXIucmVjdihjb25uLT5kcnZfcHJpdiwgJnN1YmNoLCAmYnVmKTsKKyAgICAgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChyYyA9PSBCQ01fRVJSX05PTUVNKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICsrY29ubi0+c3RhdC5tc2dfbm9fbWVtOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbm1zZyArPSBfYmNtdHJfcnhfcGFja2V0KGNvbm4sIHN1YmNoLCAmYnVmKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENoZWNrIGZvciB0aW1lb3V0cyBpZiBhbnkgKi8KKyAgICAgICAgaWYgKGJjbW9zX3RpbWVzdGFtcCgpIC0gY29ubi0+bGFzdF90aW1lb3V0X2NoZWNrID4gY29ubi0+dGltZW91dF9jaGVja19wZXJpb2QpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENoZWNrIHJlcXVlc3RzIHdhaXRpbmcgZm9yIGFja25vd2xlZGdlIGFuZCBtdWx0eS1wYXJ0IG1lc3NhZ2VzIGZvciB0aW1lb3V0LgorICAgICAgICAgICAgICogVGltZWQtb3V0IHJlcXVlc3RzIGFyZSByZXRyYW5zbWl0dGVkLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBubXNnICs9IF9iY210cl9jaGVja190aW1lb3V0KGNvbm4pOworICAgICAgICB9CisgICAgfSB3aGlsZShubXNnX3ByZXYgIT0gbm1zZyk7CisKKyAgICAqcG5tc2cgPSBubXNnOworCisgICAgcmV0dXJuIHJjOworfQorCisvKiBSeCB0aHJlYWQgaGFuZGxlciAqLworc3RhdGljIGludCBfYmNtdHJfcnhfdGhyZWFkX2hhbmRsZXIobG9uZyBhcmcpCit7CisgICAgYmNtdHJfY29ubiAqY29ubiA9IChiY210cl9jb25uICopYXJnOworICAgIGludCBubXNnczsKKyAgICBpbnQgcmM7CisKKyAgICB3aGlsZSghY29ubi0+a2lsbF9yZXF1ZXN0KQorICAgIHsKKyAgICAgICAgcmMgPSBfYmNtdHJfcnhfcG9sbChjb25uLCAmbm1zZ3MpOworICAgICAgICBpZiAocmMgPT0gQkNNX0VSUl9DT01NX0ZBSUwpCisgICAgICAgICAgICBiY21vc191c2xlZXAoMTAwMCk7CisgICAgfQorICAgIGNvbm4tPmtpbGxfZG9uZSA9IDE7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIEludGVybmFsIHRyYW5zcG9ydCBpbnRlcmZhY2UKKyAqLworCisKKy8qKiBEZWZhdWx0IG1lc3NhZ2UgaGFuZGxlciAtIGRpc2NhcmQgKi8KK3N0YXRpYyB2b2lkIF9iY210cl9kZnRfbXNnX2hhbmRsZXIoYmNtb2x0X2RldmlkIG9sdCwgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGJjbXRyX2Nvbm4gKmNvbm4gPSBjb25uX2luZm9bb2x0XS5jb25uOworCisgICAgLyogVG9EbzogbG9nICovCisKKyAgICBpZiAoY29ubikKKyAgICAgICAgKytjb25uLT5zdGF0Lm5vX3J4X2hhbmRsZXI7CisKKyAgICBiY21vbHRfbXNnX2ZyZWUobXNnKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9iY210cl9jcmVhdGVfcnhfdGhyZWFkKGJjbXRyX2Nvbm4gKmNvbm4sIGJjbW9zX2Jvb2wgcmF3X21vZGUpCit7CisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKworICAgIGlmIChjb25uLT5jZmcucnhfdGhyZWFkX3ByaW9yaXR5ID49IDAgJiYgIXJhd19tb2RlKQorICAgIHsKKyAgICAgICAgYmNtb3NfdGFza19wYXJtIHBhcm0gPSB7CisgICAgICAgICAgICAucHJpb3JpdHkgPSBjb25uLT5jZmcucnhfdGhyZWFkX3ByaW9yaXR5LAorICAgICAgICAgICAgLnN0YWNrX3NpemUgPSBCQ01UUl9SWF9USFJFQURfU1RBQ0ssCisgICAgICAgICAgICAuaGFuZGxlciA9IF9iY210cl9yeF90aHJlYWRfaGFuZGxlciwKKyAgICAgICAgICAgIC5uYW1lID0gY29ubi0+bmFtZSwKKyAgICAgICAgICAgIC5kYXRhID0gKGxvbmcpY29ubgorICAgICAgICB9OworICAgICAgICBjb25uLT5raWxsX3JlcXVlc3QgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgY29ubi0+a2lsbF9kb25lID0gQkNNT1NfRkFMU0U7CisgICAgICAgIGVyciA9IGJjbW9zX3Rhc2tfY3JlYXRlKCZjb25uLT5yeF90aHJlYWQsICZwYXJtKTsKKyAgICAgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgICAgICAgICAgY29ubi0+cnhfdGhyZWFkX2NyZWF0ZWQgPSBCQ01PU19UUlVFOworICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9iY210cl9kZXN0cm95X3J4X3RocmVhZChiY210cl9jb25uICpjb25uKQoreworICAgIC8qIEtpbGwgcnggdGhyZWFkIGlmIGFueSAqLworICAgIGlmIChjb25uLT5yeF90aHJlYWRfY3JlYXRlZCkKKyAgICB7CisgICAgICAgIGNvbm4tPmtpbGxfcmVxdWVzdCA9IDE7CisgICAgICAgIHdoaWxlKCFjb25uLT5raWxsX2RvbmUpCisgICAgICAgICAgICBiY21vc191c2xlZXAoMTAwMCk7CisgICAgICAgIGJjbW9zX3Rhc2tfZGVzdHJveSgmY29ubi0+cnhfdGhyZWFkKTsKKyAgICB9Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfYmNtdHJfY29ubmVjdChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY210cl9jb25uICoqcGNvbm4sIGJjbW9zX2Jvb2wgcmF3X21vZGUpCit7CisgICAgYmNtdHJfY29ubiAqY29ubjsKKyAgICBiY21vc19lcnJubyBlcnIgPSBCQ01fRVJSX09LOworCisgICAgLyogSW5pdCBPUyBhYnN0cmFjdGlvbiAtIGp1c3QgaW4gY2FzZSAqLworICAgIGVyciA9IGJjbW9zX2luaXQoKTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0sgJiYgZXJyICE9IEJDTV9FUlJfQUxSRUFEWSkKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtb3NfbXV0ZXhfbG9jaygmY29ubl9sb2NrKTsKKworICAgIC8qIEFsbG9jYXRlICovCisgICAgY29ubiA9IGJjbW9zX2NhbGxvYyhzaXplb2YoKmNvbm4pKTsKKyAgICBpZiAoIWNvbm4pCisgICAgeworICAgICAgICBiY21vc19tdXRleF91bmxvY2soJmNvbm5fbG9jayk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKworICAgIC8qIEdldCBjb25maWd1cmF0aW9uICovCisgICAgZXJyID0gYmNtdHJfY2ZnX2dldChkZXZpY2UsICZjb25uLT5jZmcsICZjb25uLT5kcml2ZXIpOworICAgIGlmIChlcnIpCisgICAgeworICAgICAgICBiY21vc19tdXRleF91bmxvY2soJmNvbm5fbG9jayk7CisgICAgICAgIGJjbW9zX2ZyZWUoY29ubik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgc25wcmludGYoY29ubi0+bmFtZSwgc2l6ZW9mKGNvbm4tPm5hbWUpLCAidHJfcngldSIsIGRldmljZSk7CisgICAgVEFJTFFfSU5JVCgmY29ubi0+ZnJlZV9yZXFfbGlzdCk7CisgICAgVEFJTFFfSU5JVCgmY29ubi0+ZnJlZV9hdXRvX2xpc3QpOworICAgIFRBSUxRX0lOSVQoJmNvbm4tPm1zZ19saXN0KTsKKyAgICBiY21vc19tdXRleF9jcmVhdGUoJmNvbm4tPm11dGV4LCAwLCBOVUxMKTsKKworICAgIC8qIENvbnZlcnQgdGltZW91dHMgdG8gdXMgKi8KKyAgICBjb25uLT5jZmcubXNnX3RpbWVvdXQgKj0gMTAwMDsKKyAgICBjb25uLT5jZmcubXNnX3JlYWR5X3RpbWVvdXQgKj0gMTAwMDsKKyAgICBjb25uLT5jZmcubXNnX3dhaXRfdGltZW91dCAqPSAxMDAwOworCisgICAgLyogU2V0IGRlZmF1bHRzICovCisgICAgY29ubi0+dGltZW91dF9jaGVja19wZXJpb2QgPSBjb25uLT5jZmcubXNnX3dhaXRfdGltZW91dDsKKyAgICBjb25uLT5sYXN0X3RpbWVvdXRfY2hlY2sgPSBiY21vc190aW1lc3RhbXAoKTsKKworICAgIC8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRyYW5zcG9ydCBibG9ja3MgYW5kIHB1dCBvbnRvIGZyZWUgcmVxdWVzdCBhbmQgYXV0b25vbW91cyBsaXN0cyAqLworICAgIGVyciA9IF9iY210cl90bXNnX2xpc3RfYWxsb2MoY29ubik7CisKKyAgICAvKiBPcGVuL2Nvbm5lY3Qgb24gZHJpdmVyIGxldmVsICovCisgICAgZXJyID0gZXJyID8gZXJyIDogY29ubi0+ZHJpdmVyLm9wZW4oZGV2aWNlLCAmY29ubi0+Y2ZnLnBsdWdpbl9jZmcsICZjb25uLT5kcnZfcHJpdik7CisgICAgaWYgKGVycikKKyAgICB7CisgICAgICAgIGJjbW9zX211dGV4X2Rlc3Ryb3koJmNvbm4tPm11dGV4KTsKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIH0KKworICAgIGNvbm4tPmNvbm5lY3RlZCA9IEJDTU9TX1RSVUU7CisKKyAgICAvKiBDcmVhdGUgcnggdGhyZWFkIGlmIG5lY2Vzc2FyeSAqLworICAgIGVyciA9IF9iY210cl9jcmVhdGVfcnhfdGhyZWFkKGNvbm4sIHJhd19tb2RlKTsKKyAgICBpZiAoZXJyKQorICAgIHsKKyAgICAgICAgY29ubi0+ZHJpdmVyLmNsb3NlKGNvbm4tPmRydl9wcml2KTsKKyAgICAgICAgYmNtb3NfbXV0ZXhfZGVzdHJveSgmY29ubi0+bXV0ZXgpOworICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQorICAgIGNvbm4tPmRldmljZSA9IGRldmljZTsKKworICAgICpwY29ubiA9IGNvbm47CisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZjb25uX2xvY2spOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisKK2NsZWFudXA6CisgICAgX2JjbXRyX3Rtc2dfbGlzdF9mcmVlKGNvbm4pOworICAgIGJjbW9zX2ZyZWUoY29ubik7CisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZjb25uX2xvY2spOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKiBRdWVyeSB3aGV0aGVyIG9yIG5vdCB0aGUgZGV2aWNlIGlzIGN1cnJlbnRseSBjb25uZWN0ZWQgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX2lzX2Nvbm5lY3RlZChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vc19ib29sICppc19jb25uZWN0ZWQpCit7CisgICAgYmNtdHJfY29ubiAqY29ubjsKKyAgICBpZiAoZGV2aWNlID49IEJDTVRSX01BWF9PTFRTKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorICAgIGNvbm4gPSBjb25uX2luZm9bZGV2aWNlXS5jb25uOworICAgICppc19jb25uZWN0ZWQgPSAoY29ubiAhPSBOVUxMICYmIGNvbm4tPmNvbm5lY3RlZCk7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qKiBPcGVuIHRyYW5zcG9ydCBjaGFubmVsICovCitiY21vc19lcnJubyBiY210cl9jb25uZWN0KGJjbW9sdF9kZXZpZCBkZXZpY2UpCit7CisgICAgYmNtdHJfY29ubiAqY29ubjsKKyAgICByZXR1cm4gX2JjbXRyX2Nvbm5fZ2V0KGRldmljZSwgJmNvbm4pOworfQorCisvKiogQ2xvc2UgdHJhbnNwb3J0IGNoYW5uZWwgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX2Rpc2Nvbm5lY3QoYmNtb2x0X2RldmlkIGRldmljZSkKK3sKKyAgICBiY210cl9jb25uICpjb25uOworCisgICAgaWYgKGRldmljZSA+PSBCQ01UUl9NQVhfT0xUUykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKyAgICBiY21vc19tdXRleF9sb2NrKCZjb25uX2xvY2spOworICAgIGNvbm4gPSBjb25uX2luZm9bZGV2aWNlXS5jb25uOworICAgIGlmICghY29ubikKKyAgICB7CisgICAgICAgIGJjbW9zX211dGV4X3VubG9jaygmY29ubl9sb2NrKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9UX0NPTk5FQ1RFRDsKKyAgICB9CisgICAgY29ubl9pbmZvW2RldmljZV0uY29ubiA9IE5VTEw7CisKKyAgICAvKiBLaWxsIHJ4IHRocmVhZCBpZiBhbnkgKi8KKyAgICBfYmNtdHJfZGVzdHJveV9yeF90aHJlYWQoY29ubik7CisKKyAgICBiY21vc19tdXRleF9sb2NrKCZjb25uLT5tdXRleCk7CisgICAgLyogQ2xvc2UgY29ubmVjdGlvbiAqLworICAgIGlmIChjb25uLT5kcml2ZXIuY2xvc2UpCisgICAgeworICAgICAgICBjb25uLT5kcml2ZXIuY2xvc2UoY29ubi0+ZHJ2X3ByaXYpOworICAgIH0KKworICAgIC8qIFJlbGVhc2UgYWxsIHBlbmRpbmcgbWVzc2FnZXMgKi8KKyAgICBiY21vc191c2xlZXAoMTAwMDAwKTsKKyAgICBfYmNtdHJfdG1zZ19saXN0X2ZyZWUoY29ubik7CisKKyAgICBiY21vc19tdXRleF91bmxvY2soJmNvbm4tPm11dGV4KTsKKyAgICBiY21vc19tdXRleF9kZXN0cm95KCZjb25uLT5tdXRleCk7CisgICAgYmNtb3NfZnJlZShjb25uKTsKKworICAgIGJjbW9zX211dGV4X3VubG9jaygmY29ubl9sb2NrKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBMb3ctbGV2ZWwgZGlzY29ubmVjdCB0aGF0IGJyZWFrcyAicGh5c2ljYWwiIGNvbm5lY3Rpb24sIGJ1dCBkb2Vzbid0IGRlc3Ryb3kgY29ubmVjdGlvbiBzdHJ1Y3R1cmUgYW5kIHJlZ2lzdHJhdGlvbnMgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX2RyaXZlcl9kaXNjb25uZWN0KGJjbW9sdF9kZXZpZCBkZXZpY2UpCit7CisgICAgYmNtdHJfY29ubiAqY29ubjsKKyAgICBiY21vc19lcnJubyBlcnIgPSBCQ01fRVJSX09LOworCisgICAgaWYgKGRldmljZSA+PSBCQ01UUl9NQVhfT0xUUykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIGJjbW9zX211dGV4X2xvY2soJmNvbm5fbG9jayk7CisKKyAgICBjb25uID0gY29ubl9pbmZvW2RldmljZV0uY29ubjsKKyAgICBpZiAoY29ubiA9PSBOVUxMIHx8ICFjb25uLT5jb25uZWN0ZWQpCisgICAgeworICAgICAgICBiY21vc19tdXRleF91bmxvY2soJmNvbm5fbG9jayk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PVF9DT05ORUNURUQ7CisgICAgfQorCisgICAgX2JjbXRyX2Rlc3Ryb3lfcnhfdGhyZWFkKGNvbm4pOworCisgICAgYmNtb3NfbXV0ZXhfbG9jaygmY29ubi0+bXV0ZXgpOworCisgICAgLyogQ2xvc2UgZHJpdmVyIGNvbm5lY3Rpb24gKi8KKyAgICBpZiAoY29ubi0+ZHJpdmVyLmNsb3NlICE9IE5VTEwpCisgICAgeworICAgICAgICBlcnIgPSBjb25uLT5kcml2ZXIuY2xvc2UoY29ubi0+ZHJ2X3ByaXYpOworICAgICAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiRmFpbGVkIHRvIGNsb3NlIHRyYW5zcG9ydCBkcml2ZXI6ICVzICglZClcbiIsIGJjbW9zX3N0cmVycm9yKGVyciksIGVycik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb25uLT5jb25uZWN0ZWQgPSBCQ01PU19GQUxTRTsKKworICAgIGJjbW9zX211dGV4X3VubG9jaygmY29ubi0+bXV0ZXgpOworCisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZjb25uX2xvY2spOworCisgICAgcmV0dXJuIGVycjsKK30KKworLyogUmVwYWlyL3JlY29ubmVjdCB0aGUgZHJpdmVyLWxldmVsIGNvbm5lY3Rpb24gZm9yIGFuIGFscmVhZHktY29ubmVjdGVkIGRldmljZSAqLworYmNtb3NfZXJybm8gYmNtdHJfZHJpdmVyX3JlY29ubmVjdChiY21vbHRfZGV2aWQgZGV2aWNlKQoreworICAgIGJjbXRyX2Nvbm4gKmNvbm47CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgaWYgKGRldmljZSA+PSBCQ01UUl9NQVhfT0xUUykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKyAgICBiY21vc19tdXRleF9sb2NrKCZjb25uX2xvY2spOworICAgIGNvbm4gPSBjb25uX2luZm9bZGV2aWNlXS5jb25uOworICAgIGlmIChjb25uID09IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19tdXRleF91bmxvY2soJmNvbm5fbG9jayk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PVF9DT05ORUNURUQ7CisgICAgfQorCisgICAgaWYgKGNvbm4tPmNvbm5lY3RlZCkKKyAgICB7CisgICAgICAgIGJjbXRyX2RyaXZlcl9kaXNjb25uZWN0KGRldmljZSk7CisgICAgfQorICAgIGJjbW9zX211dGV4X2xvY2soJmNvbm4tPm11dGV4KTsKKworICAgIC8qIFJlLW9wZW4gZHJpdmVyIGNvbm5lY3Rpb24gKi8KKyAgICBlcnIgPSBjb25uLT5kcml2ZXIub3BlbihkZXZpY2UsICZjb25uLT5jZmcucGx1Z2luX2NmZywgJmNvbm4tPmRydl9wcml2KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9FUlIoIkZhaWxlZCB0byByZS1vcGVuIHRyYW5zcG9ydCBkcml2ZXI6ICVzICglZClcbiIsIGJjbW9zX3N0cmVycm9yKGVyciksIGVycik7CisgICAgfQorCisgICAgZXJyID0gX2JjbXRyX2NyZWF0ZV9yeF90aHJlYWQoY29ubiwgQkNNT1NfRkFMU0UpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiRmFpbGVkIHRvIGNyZWF0ZSBSWCB0cmFuc3BvcnQgdGFzazogJXMgKCVkKVxuIiwgYmNtb3Nfc3RyZXJyb3IoZXJyKSwgZXJyKTsKKyAgICAgICAgY29ubi0+ZHJpdmVyLmNsb3NlKGNvbm4tPmRydl9wcml2KTsKKyAgICB9CisgICAgY29ubi0+Y29ubmVjdGVkID0gQkNNT1NfVFJVRTsKKworICAgIGJjbW9zX211dGV4X3VubG9jaygmY29ubi0+bXV0ZXgpOworCisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZjb25uX2xvY2spOworCisgICAgcmV0dXJuIGVycjsKK30KKworLyogUmVnaXN0ZXIgZm9yIG5vdGlmaWNhdGlvbiB0aGF0IHRyYW5zbWl0IGZhaWxlZCBiZWNhdXNlIHR4X3F1ZXVlIHdhcyBmdWxsICovCitiY21vc19lcnJubyBiY210cl90eF9vdmVyZmxvd19jYl9yZWdpc3RlcihiY21vbHRfZGV2aWQgZGV2aWNlLCBGX2JjbXRyX3R4X292ZXJmbG93IGNiKQoreworICAgIGlmIChkZXZpY2UgPj0gQkNNVFJfTUFYX09MVFMpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICBjb25uX2luZm9bZGV2aWNlXS5vdmVyZmxvd19jYiA9IGNiOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBTZW5kIG1lc3NhZ2UuCisgKiBJbnRlcm5hbCBmdW5jdGlvbi4gQ2FsbGVkIHVuZGVyIGNvbm5lY3Rpb24gbG9jaworICovCitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbXRyX3NlbmQoYmNtdHJfY29ubiAqY29ubiwgYmNtb2x0X21zZyAqbXNnLCBiY21vbHRfYnVmICp0eF9idWYsIGJjbXRyX3NlbmRfZmxhZ3MgZmxhZ3MsIGJjbXRyX21zZyAqKnB0bXNnKQoreworICAgIGJjbXRyX21zZyAqdG1zZzsKKyAgICBiY21vc19lcnJubyBlcnI7CisKKyAgICBpZiAoIWNvbm4tPmNvbm5lY3RlZCkKKyAgICB7CisgICAgICAgICsrY29ubi0+c3RhdC5ub3RfY29ubmVjdGVkOworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT1RfQ09OTkVDVEVEOworICAgIH0KKworICAgIC8qIEFsbG9jYXRlIG1lc3NhZ2UgdHJhbnNwb3J0IGhlYWRlciAqLworICAgIHRtc2cgPSBfYmNtdHJfbXNnX2dldF9mcmVlKCZjb25uLT5mcmVlX3JlcV9saXN0KTsKKyAgICBpZiAoIXRtc2cpCisgICAgeworICAgICAgICArK2Nvbm4tPnN0YXQubXNnX25vX21lbTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfVE9PX01BTllfUkVRUzsKKyAgICB9CisgICAgdG1zZy0+bXNnID0gbXNnOworCisgICAgLyogRmlsbCB0cmFuc3BvcnQgaGVhZGVyICovCisgICAgZXJyID0gYmNtdHJfaGVhZGVyX2ZpbGwodG1zZy0+bXNnLCAmdG1zZy0+aGRyKTsKKyAgICBpZiAoZXJyKQorICAgICAgICByZXR1cm4gZXJyOworCisgICAgdG1zZy0+ZXJyID0gQkNNX0VSUl9JTl9QUk9HUkVTUzsKKyAgICB0bXNnLT50eF9jb3VudCA9IDE7CisKKyAgICAvKiBTYXZlIHRyYW5zbWl0IGJ1ZmZlci4gSXQgd2lsbCBiZSByZWxlYXNlZCB0b2dldGhlciB3aXRoIHRyYW5zcG9ydCBoZWFkZXIgKi8KKyAgICB0bXNnLT50eF9idWYgPSAqdHhfYnVmOworCisgICAgdG1zZy0+dGltZXN0YW1wID0gYmNtb3NfdGltZXN0YW1wKCk7CisKKyAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCh0eF9idWYpID4gY29ubi0+Y2ZnLm1heF9tdHUpCisgICAgeworICAgICAgICBlcnIgPSBfYmNtdHJfZnJhZ21lbnRfYW5kX3NlbmQoY29ubiwgdG1zZywgZmxhZ3MpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBQYWNrIGNvcnJlbGF0aW9uIHRhZywgY29tbWFuZCBhbmQgbGVuZ3RoICovCisgICAgICAgIGJjbXRyX2hlYWRlcl9wYWNrKCZ0bXNnLT5oZHIsIHRtc2ctPnR4X2J1Zi5zdGFydCArIGNvbm4tPmNmZy5wbHVnaW5fY2ZnLmhlYWRyb29tKTsKKworICAgICAgICAvKiBTZW5kIHVzaW5nIGN1c3RvbWVyLXByb3ZpZGVkIGRyaXZlciAqLworICAgICAgICBlcnIgPSBjb25uLT5kcml2ZXIuc2VuZChjb25uLT5kcnZfcHJpdiwgbXNnLT5zdWJjaCwgJnRtc2ctPnR4X2J1ZiwgZmxhZ3MpOworICAgIH0KKyAgICBCQ01UUl9DTERfQ0hFQ0tfTk9USUZZKAorICAgICAgICBjb25uLT5kZXZpY2UsCisgICAgICAgICZ0bXNnLT5oZHIsCisgICAgICAgIEJDTVRSX0NMRF9FVl9TRU5ELAorICAgICAgICB0bXNnLT50aW1lc3RhbXAsCisgICAgICAgIHRtc2ctPnR4X2J1Zi5zdGFydCArIGNvbm4tPmNmZy5wbHVnaW5fY2ZnLmhlYWRyb29tICsgQkNNVFJfSERSX1NJWkUsCisgICAgICAgIHRtc2ctPnR4X2J1Zi5sZW4gLSAoY29ubi0+Y2ZnLnBsdWdpbl9jZmcuaGVhZHJvb20gKyBCQ01UUl9IRFJfU0laRSksCisgICAgICAgIG1zZyk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgKytjb25uLT5zdGF0Lm1zZ19jb21tX2VycjsKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIH0KKworICAgIHR4X2J1Zi0+c3RhcnQgPSBOVUxMOyAvKiBPd25lcnNoaXAgcGFzc2VkIHRvIHRtc2cgKi8KKyAgICArK2Nvbm4tPnN0YXQubXNnX3NlbnQ7CisKKyAgICBpZiAocHRtc2cpCisgICAgeworICAgICAgICAqcHRtc2cgPSB0bXNnOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBfYmNtdHJfdG1zZ19mcmVlKHRtc2csIE5VTEwpOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworCisgICAgLyogZXJyb3IgKi8KK2NsZWFudXA6CisgICAgdG1zZy0+dHhfYnVmLnN0YXJ0ID0gTlVMTDsgLyogcHJldmVudCB0eCBidWZmZXIgZGUtYWxsb2NhdGlvbiAqLworICAgIF9iY210cl90bXNnX2ZyZWUodG1zZywgTlVMTCk7CisgICAgcmV0dXJuIGVycjsKK30KKworCisvKiBBbGxvY2F0ZSB0eCBidWZmZXIgYW5kIHBhY2sgKi8KK3N0YXRpYyBiY21vc19lcnJubyBfYmNtdHJfcGFjayhjb25zdCBiY210cl9jb25uICpjb25uLCBiY21vbHRfbXNnICptc2csIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpbnQzMl90IGxlbiA9IGJjbW9sdF9tc2dfZ2V0X3BhY2tlZF9sZW5ndGgobXNnKTsKKyAgICB1aW50MzJfdCBoZWFkcm9vbSA9IGNvbm4tPmNmZy5wbHVnaW5fY2ZnLmhlYWRyb29tOworICAgIGJjbW9zX2Vycm5vIGVycjsKKworICAgIGlmIChsZW4gPCAwKQorICAgICAgICByZXR1cm4gKGJjbW9zX2Vycm5vKWxlbjsKKworICAgIC8qIFJlYWxsb2NhdGUgaWYgdG9vIGJpZyAqLworICAgIGxlbiArPSBCQ01UUl9IRFJfU0laRSArIGhlYWRyb29tOworICAgIGlmIChidWYtPnN0YXJ0KQorICAgIHsKKyAgICAgICAgaWYgKGJ1Zi0+bGVuIDwgbGVuKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBUb0RvOiByZWFsbG9jYXRlICovCisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PVkVSRkxPVzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9idWZfaW5pdChidWYsIGxlbiwgYnVmLT5zdGFydCwgQkNNVFJfQlVGX0VORElBTik7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZXJyID0gYmNtb2x0X2J1Zl9hbGxvYyhidWYsIGxlbiwgQkNNVFJfQlVGX0VORElBTik7CisgICAgICAgIGlmIChlcnIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBSZXNlcnZlIHJvb20gZm9yIGhlYWRlciAqLworICAgIGJ1Zi0+Y3VyciA9IGJ1Zi0+c3RhcnQgKyBCQ01UUl9IRFJfU0laRSArIGhlYWRyb29tOworCisgICAgLyogUGFjayAqLworICAgIGVyciA9IGJjbW9sdF9tc2dfcGFjayhtc2csIGJ1Zik7CisKKyAgICByZXR1cm4gZXJyOworfQorCisvKgorICogRXh0ZXJuYWwgbWVzc2FnZSBpbnRlcmZhY2UKKyAqLworCisvKiBTZW5kIG1lc3NhZ2UuIERvbid0IGV4cGVjdCByZXNwb25zZS4gKi8KK2JjbW9zX2Vycm5vIGJjbXRyX3NlbmQoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnLCBiY210cl9zZW5kX2ZsYWdzIGZsYWdzKQoreworICAgIGJjbXRyX2Nvbm4gKmNvbm47CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9idWYgdHhfYnVmID0ge307CisKKyAgICBlcnIgPSBfYmNtdHJfY29ubl9nZXQoZGV2aWNlLCAmY29ubik7CisgICAgaWYgKGVycikKKyAgICAgICAgcmV0dXJuIGVycjsKKworICAgIC8qIEFsbG9jYXRlIHRyYW5zcG9ydCBidWZmZXIgYW5kIHBhY2sgKi8KKyAgICBlcnIgPSBfYmNtdHJfcGFjayhjb25uLCBtc2csICZ0eF9idWYpOworICAgIGlmIChlcnIpCisgICAgeworICAgICAgICBiY21vbHRfYnVmX2ZyZWUoJnR4X2J1Zik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtb3NfbXV0ZXhfbG9jaygmY29ubi0+bXV0ZXgpOworICAgIGVyciA9IF9iY210cl9zZW5kKGNvbm4sIG1zZywgJnR4X2J1ZiwgZmxhZ3MsIE5VTEwpOworICAgIGJjbW9zX211dGV4X3VubG9jaygmY29ubi0+bXV0ZXgpOworICAgIGlmIChlcnIpCisgICAgeworICAgICAgICBiY21vbHRfYnVmX2ZyZWUoJnR4X2J1Zik7CisgICAgICAgIGlmIChlcnIgPT0gQkNNX0VSUl9RVUVVRV9GVUxMICYmIGNvbm5faW5mb1tkZXZpY2VdLm92ZXJmbG93X2NiKQorICAgICAgICAgICAgY29ubl9pbmZvW2RldmljZV0ub3ZlcmZsb3dfY2IoY29ubi0+ZGV2aWNlLCBmbGFncyk7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbXRyX2NhbGxfZXJyKGJjbW9sdF9tc2cgKm1zZywgYmNtb3NfZXJybm8gZXJyLCBjb25zdCBjaGFyICplcnJfdGV4dCkKK3sKKyAgICBtc2ctPmRpciA9IEJDTU9MVF9NU0dfRElSX1JFU1BPTlNFOworICAgIG1zZy0+ZXJyID0gZXJyOworICAgIGlmIChlcnJfdGV4dCAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc3RybmNweShtc2ctPmVycl90ZXh0LCBlcnJfdGV4dCwgQkNNT0xUX01BWF9FUlJfVEVYVF9MRU5HVEgtMSk7CisgICAgICAgIG1zZy0+ZXJyX3RleHRbQkNNT0xUX01BWF9FUlJfVEVYVF9MRU5HVEgtMV0gPSAwOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCisvKiBTZW5kIG1lc3NhZ2UgYW5kIHdhaXQgZm9yIHJlc3BvbnNlICovCitiY21vc19lcnJubyBiY210cl9jYWxsKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9tc2cgKm1zZykKK3sKKyAgICBzdGF0aWMgdWludDMyX3QgY29ycl90YWcgPSAwOworICAgIGJjbW9zX3Rhc2sgKnRhc2s7CisgICAgYmNtdHJfbXNnICp0bXNnID0gTlVMTDsKKyAgICBiY210cl9jb25uICpjb25uOworICAgIGJjbW9sdF9idWYgdHhfYnVmID0ge307CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIHVpbnQ4X3QgaW5zdGFuY2U7CisKKyAgICBtc2ctPmVyciA9IEJDTV9FUlJfT0s7CisgICAgbXNnLT5kaXIgPSBCQ01PTFRfTVNHX0RJUl9SRVFVRVNUOworICAgIG1zZy0+Y29ycl90YWcgPSArK2NvcnJfdGFnOworCisgICAgZXJyID0gX2JjbXRyX2Nvbm5fZ2V0KGRldmljZSwgJmNvbm4pOworICAgIGlmIChlcnIpCisgICAgeworICAgICAgICByZXR1cm4gYmNtdHJfY2FsbF9lcnIobXNnLCBlcnIsIE5VTEwpOworICAgIH0KKworICAgIC8qIHByZXZlbnQgc2xlZXBpbmcgaW4gUlggdGhyZWFkICh0aGlzIHdvdWxkIGNhdXNlIGl0IHRvIG5ldmVyIHdha2UgdXApICovCisgICAgdGFzayA9IGJjbW9zX3Rhc2tfY3VycmVudCgpOworICAgIGlmICh0YXNrID09ICZjb25uLT5yeF90aHJlYWQpCisgICAgeworICAgICAgICByZXR1cm4gYmNtdHJfY2FsbF9lcnIobXNnLCBCQ01fRVJSX0NPTU1fRkFJTCwgIkNhbm5vdCBjYWxsIEFQSSBmdW5jdGlvbnMgZnJvbSBQQ0kgUlggdGhyZWFkIik7CisgICAgfQorCisgICAgaW5zdGFuY2UgPSBiY21vbHRfbXNnX2luc3RhbmNlKG1zZyk7CisgICAgaWYgKGluc3RhbmNlID49IEJDTVRSX01BWF9JTlNUQU5DRVMpCisgICAgeworICAgICAgICByZXR1cm4gYmNtdHJfY2FsbF9lcnIobXNnLCBCQ01fRVJSX0tFWV9SQU5HRSwgIkludmFsaWQgUE9OIGluZGV4Iik7CisgICAgfQorCisgICAgLyogQWxsb2NhdGUgdHJhbnNwb3J0IGJ1ZmZlciBhbmQgcGFjayAqLworICAgIGVyciA9IF9iY210cl9wYWNrKGNvbm4sIG1zZywgJnR4X2J1Zik7CisgICAgaWYgKGVycikKKyAgICB7CisgICAgICAgIGJjbW9sdF9idWZfZnJlZSgmdHhfYnVmKTsKKyAgICAgICAgcmV0dXJuIGJjbXRyX2NhbGxfZXJyKG1zZywgZXJyLCBOVUxMKTsKKyAgICB9CisKKyAgICAvKiB0cmFuc21pdCByZXF1ZXN0IHVuZGVyIGNvbm5lY3Rpb24gbG9jayAqLworICAgIGJjbW9zX211dGV4X2xvY2soJmNvbm4tPm11dGV4KTsKKyAgICBlcnIgPSBfYmNtdHJfc2VuZChjb25uLCBtc2csICZ0eF9idWYsIEJDTVRSX1NFTkRfRkxBR1NfQ0FMTCwgJnRtc2cpOworICAgIGlmICghdG1zZykKKyAgICB7CisgICAgICAgIGJjbW9zX211dGV4X3VubG9jaygmY29ubi0+bXV0ZXgpOworICAgICAgICBiY21vbHRfYnVmX2ZyZWUoJnR4X2J1Zik7CisgICAgICAgIHJldHVybiBiY210cl9jYWxsX2Vycihtc2csIGVyciwgTlVMTCk7CisgICAgfQorICAgIFRBSUxRX0lOU0VSVF9UQUlMKCZjb25uLT5tc2dfbGlzdCwgdG1zZywgbCk7CisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZjb25uLT5tdXRleCk7CisKKyAgICAvKiBXYWl0IGZvciByZXNwb25zZSBvciB0aW1lb3V0LgorICAgICAqIE1lc3NhZ2UgdGltZW91dCBpcyBlbmZvcmNlZCBieSBhdWRpdCByYXRoZXIgdGhhbiBzZW1hcGhvcmUgdGltZW91dCBvcHRpb24KKyAgICAgKi8KKyAgICBiY21vc19zZW1fd2FpdCgmdG1zZy0+c2VtLCBCQ01PU19XQUlUX0ZPUkVWRVIpOworCisgICAgLyogQ29ubmVjdGlvbiBjb3VsZCd2ZSBiZWVuIGtpbGxlZCB3aGlsZSB3ZSBhcmUgd2FpdGluZyBoZXJlLgorICAgICAqIEl0IGlzIGluZGljYXRlZCBieSBDT01NX0ZBSUxVUkUgaW4gbXNnLT5lcnIuCisgICAgICogSW4gdGhpcyBjYXNlIHRyYW5zcG9ydCBoZWFkZXIgKHRtc2cpIGlzIGFscmVhZHkgcmVsZWFzZWQKKyAgICAgKi8KKyAgICBpZiAobXNnLT5lcnIgPT0gQkNNX0VSUl9DT01NX0ZBSUwpCisgICAgeworICAgICAgICByZXR1cm4gYmNtdHJfY2FsbF9lcnIobXNnLCBtc2ctPmVyciwgTlVMTCk7CisgICAgfQorCisgICAgZXJyID0gdG1zZy0+ZXJyOworICAgIGlmICghZXJyKQorICAgIHsKKyAgICAgICAgZXJyID0gX2JjbXRyX21zZ191bnBhY2soY29ubiwgJnRtc2ctPnJ4X2J1ZiwgJnRtc2ctPmhkciwgdG1zZy0+dGltZXN0YW1wLCAmbXNnKTsKKyAgICB9CisKKyAgICAvKiBUYWtlIGNvbm5lY3Rpb24gbG9jayBhZ2FpbiBpbiBvcmRlciB0byByZWxlYXNlIHRyYW5zcG9ydCBoZWFkZXIgc2FmZWx5ICovCisgICAgYmNtb3NfbXV0ZXhfbG9jaygmY29ubi0+bXV0ZXgpOworICAgIF9iY210cl90bXNnX2ZyZWUodG1zZywgTlVMTCk7CisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZjb25uLT5tdXRleCk7CisKKyAgICByZXR1cm4gYmNtdHJfY2FsbF9lcnIobXNnLCBlcnIgPyBlcnIgOiBtc2ctPmVyciwgTlVMTCk7Cit9CisKKworI2lmZGVmIEJDTV9TVUJTWVNURU1fSE9TVAorLyogU2VuZCAodW4pcmVnaXN0cmF0aW9uIGluZm8gdG8gdGhlIG11eCAqLworc3RhdGljIGJjbW9zX2Vycm5vIF9iY210cl9zZW5kX3RvX211eChiY210cl9jb25uICpjb25uLCBiY210cl9oZHIgKmhkcikKK3sKKyAgICBiY21vbHRfYnVmIGJ1ZjsKKyAgICB1aW50OF90IHBhY2tlZF9oZHJbQkNNVFJfSERSX1NJWkVdOworICAgIGJjbW9zX2Vycm5vIGVycjsKKworICAgIGVyciA9IGJjbW9sdF9idWZfYWxsb2MoJmJ1ZiwgQkNNVFJfSERSX1NJWkUgKyBjb25uLT5jZmcucGx1Z2luX2NmZy5oZWFkcm9vbSwgQkNNVFJfQlVGX0VORElBTik7CisgICAgaWYgKGVycikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIGJjbW9sdF9idWZfc2tpcCgmYnVmLCBjb25uLT5jZmcucGx1Z2luX2NmZy5oZWFkcm9vbSk7CisgICAgYmNtdHJfaGVhZGVyX3BhY2soaGRyLCBwYWNrZWRfaGRyKTsKKyAgICBpZiAoYmNtb2x0X2J1Zl93cml0ZSgmYnVmLCBwYWNrZWRfaGRyLCBCQ01UUl9IRFJfU0laRSkpCisgICAgICAgIGVyciA9IGNvbm4tPmRyaXZlci5zZW5kKGNvbm4tPmRydl9wcml2LCAwLCAmYnVmLCBCQ01UUl9TRU5EX0ZMQUdTX1BSSV9OT1JNQUwpOworICAgIGVsc2UKKyAgICAgICAgZXJyID0gQkNNX0VSUl9PVkVSRkxPVzsKKyAgICBiY21vbHRfYnVmX2ZyZWUoJmJ1Zik7CisgICAgcmV0dXJuIGVycjsKK30KKyNlbmRpZgorCisvKiogUmVnaXN0ZXIgbWVzc2FnZSBoYW5kbGVyCisgKgorICogXHBhcmFtW2luXSAgIGRldmljZSAgICAgICAgICBPTFQgZGV2aWNlIGluZGV4CisgKiBccGFyYW1baW5dICAgcGFybSAgICAgICAgICAgIFJlZ2lzdHJhdGlvbiBwYXJhbWV0ZXJzCisgKiBccmV0dXJucyBCQ01fRVJSX09LIG9yIGVycm9yIGNvZGUKKyAqLworYmNtb3NfZXJybm8gYmNtdHJfbXNnX2hhbmRsZXJfcmVnaXN0ZXIoYmNtb2x0X2RldmlkIGRldmljZSwgY29uc3QgYmNtdHJfaGFuZGxlcl9wYXJtICpwYXJtKQoreworICAgIGJjbXRyX2Nvbm4gKmNvbm47CisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKyAgICBiY21vbHRfZ3JvdXBfaWQgbXNnX2lkOworICAgIGJjbXRyX2hhbmRsZXIgKmg7CisKKyAgICBpZiAoZGV2aWNlID49IEJDTVRSX01BWF9PTFRTIHx8ICFwYXJtIHx8ICFwYXJtLT5hcHBfY2IgfHwgcGFybS0+aW5zdGFuY2UgPj0gQkNNVFJfTUFYX0lOU1RBTkNFUykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgaWYgKCh1bnNpZ25lZClwYXJtLT5vYmplY3QgPj0gQkNNT0xUX09CSl9JRF9fTlVNX09GKQorICAgIHsKKyAgICAgICAgYmNtdHJfaGFuZGxlcl9wYXJtIHAxID0gKnBhcm07CisKKyAgICAgICAgZm9yIChwMS5vYmplY3QgPSAwOyBwMS5vYmplY3QgPCBCQ01PTFRfT0JKX0lEX19OVU1fT0YgJiYgIWVycjsgcDEub2JqZWN0KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGVyciA9IGJjbXRyX21zZ19oYW5kbGVyX3JlZ2lzdGVyKGRldmljZSwgJnAxKTsKKyAgICAgICAgICAgIC8qIElnbm9yZSBSQU5HRSBlcnJvciB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBvYmplY3QgYmVpbmcgaXRlcmF0ZWQgZG9lc24ndCBoYXZlIHRoaXMgZ3JvdXAgKi8KKyAgICAgICAgICAgIC8qIElnbm9yZSBBTFJFQURZIGVycm9yIHRoYXQgaW5kaWNhdGVzIHRoYXQgcmVnaXN0cmF0aW9uIGlzIGFscmVhZHkgcHJlc2VudCBmb3Igc3BlY2lmaWMgbWVzc2FnZSBhbmQgd2FzIHNraXBwZWQgKi8KKyAgICAgICAgICAgIGlmICgoZXJyID09IEJDTV9FUlJfUkFOR0UpIHx8IChlcnIgPT0gQkNNX0VSUl9BTFJFQURZKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBCQ01fRVJSX09LOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKCh1bnNpZ25lZClwYXJtLT5zdWJncm91cCA9PSBCQ01PTFRfU1VCR1JPVVBfQU5ZKQorICAgIHsKKyAgICAgICAgYmNtdHJfaGFuZGxlcl9wYXJtIHAxID0gKnBhcm07CisKKyAgICAgICAgZm9yIChwMS5zdWJncm91cCA9IDA7CisgICAgICAgICAgICBiY21vbHRfZ3JvdXBfaWRfY29tYmluZShwMS5vYmplY3QsIHAxLmdyb3VwLCBwMS5zdWJncm91cCwgJm1zZ19pZCkgPT0gQkNNX0VSUl9PSyAmJgorICAgICAgICAgICAgICAgIChlcnIgPT0gQkNNX0VSUl9PSyB8fCBlcnIgPT0gQkNNX0VSUl9BTFJFQURZKTsKKyAgICAgICAgICAgIHAxLnN1Ymdyb3VwKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGVyciA9IGJjbXRyX21zZ19oYW5kbGVyX3JlZ2lzdGVyKGRldmljZSwgJnAxKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXJyID09IEJDTV9FUlJfQUxSRUFEWSkKKyAgICAgICAgeworICAgICAgICAgICAgZXJyID0gQkNNX0VSUl9PSzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIC8qIFNwZWNpZmljIG9iamVjdC9ncm91cC9zdWJncm91cCAqLworICAgIGVyciA9IGJjbW9sdF9ncm91cF9pZF9jb21iaW5lKHBhcm0tPm9iamVjdCwgcGFybS0+Z3JvdXAsIHBhcm0tPnN1Ymdyb3VwLCAmbXNnX2lkKTsKKyAgICBpZiAoZXJyKQorICAgICAgICByZXR1cm4gZXJyOworICAgIGggPSAmY29ubl9pbmZvW2RldmljZV0ubXNnX2hhbmRsZXJbbXNnX2lkXVtwYXJtLT5pbnN0YW5jZV07CisKKyAgICAvKiBSZWZ1c2UgbmV3IHJlZ2lzdHJhdGlvbiBpZiBhbHJlYWR5IHJlZ2lzdGVyZWQgKi8KKyAgICBpZiAoaC0+YXBwX2NiICE9IF9iY210cl9kZnRfbXNnX2hhbmRsZXIpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9BTFJFQURZOworICAgIH0KKworICAgIGgtPmFwcF9jYiA9IHBhcm0tPmFwcF9jYjsKKyAgICBoLT5mbGFncyA9IHBhcm0tPmZsYWdzOworICAgIGlmICgocGFybS0+ZmxhZ3MgJiBCQ01PTFRfQVVUT19GTEFHU19ESVNQQVRDSCkpCisgICAgeworICAgICAgICBpZiAocGFybS0+bW9kdWxlICE9IEJDTU9TX01PRFVMRV9JRF9OT05FKQorICAgICAgICB7CisgICAgICAgICAgICBoLT5tb2R1bGUgPSBwYXJtLT5tb2R1bGU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBoLT5tb2R1bGUgPSBiY21vc19tb2R1bGVfY3VycmVudCgpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGgtPm1vZHVsZSA9IEJDTU9TX01PRFVMRV9JRF9OT05FOworICAgIH0KKworI2lmZGVmIEJDTV9TVUJTWVNURU1fSE9TVAorICAgIC8qIE9uIHRoZSBob3N0LCBhdXRvbWF0aWNhbGx5IGNvbm5lY3Qgb24gbWVzc2FnZSBoYW5kbGVyIHJlZ2lzdHJhdGlvbiAqLworICAgIGVyciA9IF9iY210cl9jb25uX2dldChkZXZpY2UsICZjb25uKTsKKyAgICBpZiAoZXJyKQorICAgICAgICByZXR1cm4gZXJyOworCisgICAgLyogUmVnaXN0cmF0aW9uIHdpdGggdHItbXV4IGlzIHBlciBkZXZpY2UsIHBlci1pbnN0YW5jZSwgcGVyLW9iamVjdCAqLworICAgIGlmICghcGFybS0+c3ViZ3JvdXApCisgICAgeworICAgICAgICAvKiBTZW5kIHJlZ2lzdHJhdGlvbiBpbmZvIHRvIHRoZSBtdXggZHJpdmVyLiBJdCBpcyBqdXN0IGEgaGVhZGVyICovCisgICAgICAgIGJjbXRyX2hkciBoZHI7CisgICAgICAgIG1lbXNldCgmaGRyLCAwLCBzaXplb2YoaGRyKSk7CisgICAgICAgIGhkci5tc2dfaWQgPSBtc2dfaWQ7CisgICAgICAgIGhkci5hdXRvX3Byb3h5X3JlZyA9IDE7CisgICAgICAgIGhkci5pbnN0YW5jZSA9IHBhcm0tPmluc3RhbmNlOworICAgICAgICBlcnIgPSBfYmNtdHJfc2VuZF90b19tdXgoY29ubiwgJmhkcik7CisgICAgICAgIGlmIChlcnIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbXRyX21zZ19oYW5kbGVyX3VucmVnaXN0ZXIoZGV2aWNlLCBwYXJtKTsKKyAgICAgICAgfQorICAgIH0KKyNlbHNlCisgICAgKHZvaWQpY29ubjsKKyNlbmRpZgorCisgICAgcmV0dXJuIGVycjsKK30KKworLyogVW5yZWdpc3RlciBhdXRvbm9tb3VzIG1lc3NhZ2UgaGFuZGxlciAqLworYmNtb3NfZXJybm8gYmNtdHJfbXNnX2hhbmRsZXJfdW5yZWdpc3RlcihiY21vbHRfZGV2aWQgZGV2aWNlLCBjb25zdCBiY210cl9oYW5kbGVyX3Bhcm0gKnBhcm0pCit7CisgICAgYmNtdHJfY29ubiAqY29ubjsKKyAgICBiY21vc19lcnJubyBlcnIgPSBCQ01fRVJSX09LOworICAgIGJjbW9sdF9ncm91cF9pZCBtc2dfaWQ7CisgICAgYmNtdHJfaGFuZGxlciAqaDsKKworICAgIGlmIChkZXZpY2UgPj0gQkNNVFJfTUFYX09MVFMgfHwgIXBhcm0gfHwgcGFybS0+aW5zdGFuY2UgPj0gQkNNVFJfTUFYX0lOU1RBTkNFUykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgaWYgKCh1bnNpZ25lZClwYXJtLT5vYmplY3QgPj0gQkNNT0xUX09CSl9JRF9fTlVNX09GKQorICAgIHsKKyAgICAgICAgYmNtdHJfaGFuZGxlcl9wYXJtIHAxID0gKnBhcm07CisgICAgICAgIGZvciAocDEub2JqZWN0ID0gMDsgcDEub2JqZWN0IDwgQkNNT0xUX09CSl9JRF9fTlVNX09GICYmICFlcnI7IHAxLm9iamVjdCsrKQorICAgICAgICB7CisgICAgICAgICAgICBlcnIgPSBiY210cl9tc2dfaGFuZGxlcl91bnJlZ2lzdGVyKGRldmljZSwgJnAxKTsKKyAgICAgICAgICAgIC8qIElnbm9yZSBSQU5HRSBlcnJvciB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBvYmplY3QgYmVpbmcgaXRlcmF0ZWQgZG9lc24ndCBoYXZlIHRoaXMgZ3JvdXAgKi8KKyAgICAgICAgICAgIGlmIChlcnIgPT0gQkNNX0VSUl9SQU5HRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBCQ01fRVJSX09LOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKCh1bnNpZ25lZClwYXJtLT5zdWJncm91cCA9PSBCQ01PTFRfU1VCR1JPVVBfQU5ZKQorICAgIHsKKyAgICAgICAgYmNtdHJfaGFuZGxlcl9wYXJtIHAxID0gKnBhcm07CisKKyAgICAgICAgZm9yIChwMS5zdWJncm91cCA9IDA7CisgICAgICAgICAgICBiY21vbHRfZ3JvdXBfaWRfY29tYmluZShwMS5vYmplY3QsIHAxLmdyb3VwLCBwMS5zdWJncm91cCwgJm1zZ19pZCkgPT0gQkNNX0VSUl9PSyAmJiAhZXJyOworICAgICAgICAgICAgcDEuc3ViZ3JvdXArKykKKyAgICAgICAgeworICAgICAgICAgICAgZXJyID0gYmNtdHJfbXNnX2hhbmRsZXJfdW5yZWdpc3RlcihkZXZpY2UsICZwMSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBlcnIgPSBiY21vbHRfZ3JvdXBfaWRfY29tYmluZShwYXJtLT5vYmplY3QsIHBhcm0tPmdyb3VwLCBwYXJtLT5zdWJncm91cCwgJm1zZ19pZCk7CisgICAgaWYgKGVycikKKyAgICAgICAgcmV0dXJuIGVycjsKKworICAgIGggPSAmY29ubl9pbmZvW2RldmljZV0ubXNnX2hhbmRsZXJbbXNnX2lkXVtwYXJtLT5pbnN0YW5jZV07CisgICAgaC0+YXBwX2NiID0gX2JjbXRyX2RmdF9tc2dfaGFuZGxlcjsKKyAgICBoLT5mbGFncyA9IEJDTU9MVF9BVVRPX0ZMQUdTX05PTkU7CisgICAgaC0+bW9kdWxlID0gQkNNT1NfTU9EVUxFX0lEX05PTkU7CisKKyNpZmRlZiBCQ01fU1VCU1lTVEVNX0hPU1QKKyAgICAvKiBPbiB0aGUgaG9zdCwgYXV0b21hdGljYWxseSBjb25uZWN0IG9uIG1lc3NhZ2UgaGFuZGxlciAoZGUpcmVnaXN0cmF0aW9uICovCisgICAgZXJyID0gX2JjbXRyX2Nvbm5fZ2V0KGRldmljZSwgJmNvbm4pOworICAgIGlmIChlcnIpCisgICAgICAgIHJldHVybiBlcnI7CisKKyAgICAvKiBSZWdpc3RyYXRpb24gd2l0aCB0ci1tdXggaXMgcGVyIGRldmljZSwgcGVyLWluc3RhbmNlLCBwZXItb2JqZWN0ICovCisgICAgaWYgKCFwYXJtLT5zdWJncm91cCkKKyAgICB7CisgICAgICAgIC8qIFNlbmQgdW4tcmVnaXN0cmF0aW9uIGluZm8gdG8gdGhlIG11eCBkcml2ZXIuIEl0IGlzIGp1c3QgYSBoZWFkZXIgKi8KKyAgICAgICAgYmNtdHJfaGRyIGhkcjsKKyAgICAgICAgbWVtc2V0KCZoZHIsIDAsIHNpemVvZihoZHIpKTsKKyAgICAgICAgaGRyLm1zZ19pZCA9IG1zZ19pZDsKKyAgICAgICAgaGRyLmF1dG9fcHJveHlfdW5yZWcgPSAxOworICAgICAgICBoZHIuaW5zdGFuY2UgPSBwYXJtLT5pbnN0YW5jZTsKKyAgICAgICAgZXJyID0gX2JjbXRyX3NlbmRfdG9fbXV4KGNvbm4sICZoZHIpOworICAgIH0KKyNlbHNlCisgICAgKHZvaWQpY29ubjsKKyNlbmRpZgorCisgICAgcmV0dXJuIGVycjsKK30KKworLyoqIEdldCByZWdpc3RyYXRpb24gaW5mbworICoKKyAqIFxwYXJhbVtpbl0gICAgICAgICAgIGRldmljZSAgICAgICAgICBPTFQgZGV2aWNlIGluZGV4CisgKiBccGFyYW1baW4sb3V0XSAgICAgICBwYXJtICAgICAgICAgICAgUmVnaXN0cmF0aW9uIHBhcmFtZXRlcnMuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsIGdyb3VwLCBvYmplY3QsIHN1Ymdyb3VwIG11c3QgYmUgc2V0CisgKiBccmV0dXJucyBCQ01fRVJSX09LIG9yIGVycm9yIGNvZGUKKyAqLworYmNtb3NfZXJybm8gYmNtdHJfbXNnX2hhbmRsZXJfcmVnaXN0ZXJfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbXRyX2hhbmRsZXJfcGFybSAqcGFybSkKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dyb3VwX2lkIG1zZ19pZDsKKyAgICBiY210cl9oYW5kbGVyICpoOworCisgICAgaWYgKGRldmljZSA+PSBCQ01UUl9NQVhfT0xUUyB8fAorICAgICAgICAhcGFybSB8fAorICAgICAgICBwYXJtLT5pbnN0YW5jZSA+PSBCQ01UUl9NQVhfSU5TVEFOQ0VTIHx8CisgICAgICAgICh1bnNpZ25lZClwYXJtLT5vYmplY3QgPj0gQkNNT0xUX09CSl9JRF9fTlVNX09GIHx8CisgICAgICAgICh1bnNpZ25lZClwYXJtLT5zdWJncm91cCA9PSBCQ01PTFRfU1VCR1JPVVBfQU5ZKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBlcnIgPSBiY21vbHRfZ3JvdXBfaWRfY29tYmluZShwYXJtLT5vYmplY3QsIHBhcm0tPmdyb3VwLCBwYXJtLT5zdWJncm91cCwgJm1zZ19pZCk7CisgICAgaWYgKGVycikKKyAgICAgICAgcmV0dXJuIGVycjsKKworICAgIGggPSAmY29ubl9pbmZvW2RldmljZV0ubXNnX2hhbmRsZXJbbXNnX2lkXVtwYXJtLT5pbnN0YW5jZV07CisgICAgcGFybS0+YXBwX2NiID0gKGgtPmFwcF9jYiA9PSBfYmNtdHJfZGZ0X21zZ19oYW5kbGVyKSA/IE5VTEwgOiBoLT5hcHBfY2I7CisgICAgcGFybS0+ZmxhZ3MgPSBoLT5mbGFnczsKKyAgICBwYXJtLT5tb2R1bGUgPSBoLT5tb2R1bGU7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogR2V0IHRyYW5zcG9ydCBzdGF0aXN0aWNzICovCitiY21vc19lcnJubyBiY210cl9zdGF0X2dldChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY210cl9zdGF0ICpzdGF0KQoreworICAgIGJjbXRyX2Nvbm4gKmNvbm47CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgaWYgKCFzdGF0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgZXJyID0gX2JjbXRyX2Nvbm5fZ2V0KGRldmljZSwgJmNvbm4pOworICAgIGlmIChlcnIpCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBiY21vc19tdXRleF9sb2NrKCZjb25uLT5tdXRleCk7CisgICAgKnN0YXQgPSBjb25uLT5zdGF0OworICAgIG1lbXNldCgmY29ubi0+c3RhdCwgMCwgc2l6ZW9mKGNvbm4tPnN0YXQpKTsKKyAgICBiY21vc19tdXRleF91bmxvY2soJmNvbm4tPm11dGV4KTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisjaWYgZGVmaW5lZChTSU1VTEFUSU9OX0JVSUxEKSAmJiBkZWZpbmVkKExJTlVYX1VTRVJfU1BBQ0UpICYmIGRlZmluZWQoQkNNX1NVQlNZU1RFTV9FTUJFRERFRCkgJiYgZGVmaW5lZChCQ01UUl9VRFBfU1VQUE9SVCkKK3N0YXRpYyBpbnQgX2JjbXRyX2Fzc2lnbl9yYW5kb21fcG9ydCh2b2lkKQoreworICAgIGludCBwb3J0OworCisgICAgc3JhbmQoYmNtb3NfdGltZXN0YW1wKCkpOworICAgIHBvcnQgPSByYW5kKCkgJSA1MDAwMDsKKyAgICBpZiAocG9ydCA8IDIwMDAwKQorICAgIHsKKyAgICAgICAgcG9ydCArPSAyMDAwMDsKKyAgICB9CisKKyAgICByZXR1cm4gcG9ydDsKK30KKyNlbmRpZgorCisvKiBDb25uZWN0IGRldmljZSBpbiByYXcgbW9kZS4gUmVjZWl2ZSB0YXNrIGlzIE5PVCBjcmVhdGVkICovCitiY21vc19lcnJubyBiY210cl9wcm94eV9jb25uZWN0KGJjbW9sdF9kZXZpZCBkZXZpY2UsIHVpbnQzMl90ICpoZWFkcm9vbSkKK3sKKyAgICBiY210cl9jb25uICpjb25uOworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgcmMgPSBfYmNtdHJfY29ubl9nZXRfYW55KGRldmljZSwgJmNvbm4sIEJDTU9TX1RSVUUpOworICAgIGlmICghcmMpCisgICAgeworICAgICAgICAqaGVhZHJvb20gPSBjb25uLT5jZmcucGx1Z2luX2NmZy5oZWFkcm9vbTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKiBTZW5kIGRhdGEgdG8gZGV2aWNlIGluIHJhdyBtb2RlICovCitiY21vc19lcnJubyBiY210cl9wcm94eV9zZW5kKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9idWYgKnR4X2J1ZikKK3sKKyAgICBiY210cl9jb25uICpjb25uOworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIHJjID0gX2JjbXRyX2Nvbm5fZ2V0X2FueShkZXZpY2UsICZjb25uLCBCQ01PU19UUlVFKTsKKyAgICBpZiAocmMpCisgICAgICAgIHJldHVybiByYzsKKyAgICByYyA9IGNvbm4tPmRyaXZlci5zZW5kKGNvbm4tPmRydl9wcml2LCAwLCB0eF9idWYsIEJDTVRSX1NFTkRfRkxBR1NfTk9ORSk7CisgICAgcmV0dXJuIHJjOworfQorCisvKiBSZWNlaXZlIGRhdGEgZnJvbSBkZXZpY2UgaW4gcmF3IG1vZGUgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX3Byb3h5X3JlY2VpdmUoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X2J1ZiAqcnhfYnVmKQoreworICAgIGJjbXRyX2Nvbm4gKmNvbm47CisgICAgYmNtb2x0X3N1YmNoYW5uZWwgc3ViY2g7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgcmMgPSBfYmNtdHJfY29ubl9nZXRfYW55KGRldmljZSwgJmNvbm4sIEJDTU9TX1RSVUUpOworICAgIGlmIChyYykKKyAgICAgICAgcmV0dXJuIHJjOworICAgIHJjID0gY29ubi0+ZHJpdmVyLnJlY3YoY29ubi0+ZHJ2X3ByaXYsICZzdWJjaCwgcnhfYnVmKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKiBJbml0aWFsaXplIHRyYW5zcG9ydCBsaWJyYXJ5LgorICogXHJldHVybnMgQkNNX0VSUl9PSyBvciBlcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX2luaXQodm9pZCkKK3sKKyAgICBiY21vc19lcnJubyBlcnIgPSBCQ01fRVJSX09LOworICAgIGJjbW9sdF9kZXZpZCBkZXZpY2U7CisKKyAgICBiY21vc19wcmludGYoImJjbXRyX2luaXQ6IGluaXQgdHJhbnNwb3J0IGxpYnJhcnlcbiIpOworCisjaWYgZGVmaW5lZChCQ01UUl9VRFBfU1VQUE9SVCkKKworICAgIC8qIFNldCBkZWZhdWx0cyBhbmQgYWRkIGNvbmZpZ3VyYXRpb24gY29tbWFuZCAqLworICAgIGlmICghYmNtdHJfaG9zdF9pcCkKKyAgICAgICAgYmNtdHJfaG9zdF9pcCA9IEJDTVRSX1RSX1VEUF9IT1NUX0lQOworICAgIGlmICghYmNtdHJfaG9zdF91ZHBfcG9ydCkKKyAgICAgICAgYmNtdHJfaG9zdF91ZHBfcG9ydCA9IEJDTVRSX1RSX1VEUF9IT1NUX1BPUlQ7CisgICAgZm9yIChkZXZpY2UgPSAwOyBkZXZpY2UgPCBCQ01UUl9NQVhfT0xUUzsgZGV2aWNlKyspCisgICAgeworICAgICAgICBpZiAoIWJjbXRyX29sdF9pcFtkZXZpY2VdKQorICAgICAgICAgICAgYmNtdHJfb2x0X2lwW2RldmljZV0gPSBCQ01UUl9UUl9VRFBfT0xUX0lQICsgZGV2aWNlOworICAgICAgICBpZiAoIWJjbXRyX29sdF91ZHBfcG9ydFtkZXZpY2VdKQorICAgICAgICAgICAgYmNtdHJfb2x0X3VkcF9wb3J0W2RldmljZV0gPSBCQ01UUl9UUl9VRFBfT0xUX1BPUlQ7CisgICAgfQorCisgICAgLyogQSBoYWNrIHRvIGFsbG93IG11bHRpcGxlIHNpbXVsYXRpb25zIHJ1biBvbiB0aGUgc2FtZSBQQyAqLworI2lmIGRlZmluZWQoU0lNVUxBVElPTl9CVUlMRCkgJiYgZGVmaW5lZChMSU5VWF9VU0VSX1NQQUNFKSAmJiBkZWZpbmVkKEJDTV9TVUJTWVNURU1fRU1CRURERUQpCisgICAgeworICAgICAgICBiY210cl9vbHRfdWRwX3BvcnRbMF0gPSBfYmNtdHJfYXNzaWduX3JhbmRvbV9wb3J0KCk7CisgICAgfQorI2VuZGlmCisjZW5kaWYKKworICAgIC8qIEluaXRpYWxpemUgaGFuZGxlcnMgKi8KKyAgICBmb3IgKGRldmljZSA9IDA7IGRldmljZSA8IEJDTVRSX01BWF9PTFRTOyBkZXZpY2UrKykKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncm91cF9pZCBncm91cDsKKyAgICAgICAgZm9yIChncm91cCA9IDA7IGdyb3VwIDwgQkNNT0xUX0dST1VQX0lEX19OVU1fT0Y7IGdyb3VwKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpbnN0OworICAgICAgICAgICAgZm9yIChpbnN0ID0gMDsgaW5zdCA8IEJDTVRSX01BWF9JTlNUQU5DRVM7IGluc3QrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25uX2luZm9bZGV2aWNlXS5tc2dfaGFuZGxlcltncm91cF1baW5zdF0uYXBwX2NiID0gX2JjbXRyX2RmdF9tc2dfaGFuZGxlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGJjbW9zX211dGV4X2NyZWF0ZSgmY29ubl9sb2NrLCAwLCBOVUxMKTsKKworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKiBSZWxlYXNlIHJlc291cmNlcyB1c2VkIGJ5IHRyYW5zcG9ydCBsaWJyYXJ5LgorICogXHJldHVybnMgQkNNX0VSUl9PSyBvciBlcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX2V4aXQodm9pZCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBCQ01UUl9NQVhfT0xUUzsgaSsrKQorICAgICAgICBiY210cl9kaXNjb25uZWN0KGkpOworCisgICAgYmNtb3NfbXV0ZXhfZGVzdHJveSgmY29ubl9sb2NrKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9iY210cl90cmFuc3BvcnRfY2xpLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L2JjbXRyX3RyYW5zcG9ydF9jbGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmQwMDdhCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9iY210cl90cmFuc3BvcnRfY2xpLmMKQEAgLTAsMCArMSwzMDcgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21jbGkuaD4KKyNpbmNsdWRlIDxiY210cl9pbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxiY210cl9pbnRlcm5hbC5oPgorI2luY2x1ZGUgPGJjbXRyX3RyYW5zcG9ydF9jbGkuaD4KKyNpbmNsdWRlIDxiY21fYXBpX2NsaV9oZWxwZXJzLmg+CisjaWZkZWYgQkNNVFJfUEVSRlRFU1QKKyNpbmNsdWRlIDx0ZXN0L2JjbXRyX3BlcmZ0ZXN0Lmg+CisjZW5kaWYKKworI2lmZGVmIEJDTVRSX1BMVUdJTl9UQVNLX0ZPUldBUkRFUgorZXh0ZXJuIHVpbnQzMl90IHJhd190eF9kcm9wX2NvdW50OworI2VuZGlmCisKKy8qCisgKiBDTEkgc3VwcG9ydAorICovCitzdGF0aWMgYmNtY2xpX2VudHJ5ICp0cmNsaV9kaXI7CisKKyNpZmRlZiBCQ01UUl9VRFBfU1VQUE9SVAorCisvKiBEaXNwbGF5L3NldCBob3N0IElQK3BvcnQKKyAgIEJDTUNMSV9NQUtFX1BBUk0oImlwX2FkZHIiLCAiSVAgYWRkcmVzcyIsIEJDTUNMSV9QQVJNX0lQLCBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMKSwKKyAgIEJDTUNMSV9NQUtFX1BBUk1fUkFOR0UoInVkcF9wb3J0IiwgIlVEUCBwb3J0IiwgQkNNQ0xJX1BBUk1fTlVNQkVSLCBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMLAorICAgKi8KK3N0YXRpYyBiY21vc19lcnJubyBfYmNtdHJfY2xpX2hvc3RfdWRwKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgaWYgKCFucGFybXMpCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiSG9zdCBBZGRyZXNzOnBvcnQgPSAlZC4lZC4lZC4lZDolZFxuIiwKKyAgICAgICAgICAgIChiY210cl9ob3N0X2lwID4+IDI0KSAmIDB4ZmYsIChiY210cl9ob3N0X2lwID4+IDE2KSAmIDB4ZmYsCisgICAgICAgICAgICAoYmNtdHJfaG9zdF9pcCA+PiA4KSAmIDB4ZmYsIGJjbXRyX2hvc3RfaXAgJiAweGZmLCBiY210cl9ob3N0X3VkcF9wb3J0KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKGJjbWNsaV9wYXJtX2lzX3NldChzZXNzaW9uLCAmcGFybVswXSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbXRyX2hvc3RfaXAgPSBwYXJtWzBdLnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBpZiAoYmNtY2xpX3Bhcm1faXNfc2V0KHNlc3Npb24sICZwYXJtWzFdKSkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtdHJfaG9zdF91ZHBfcG9ydCA9IHBhcm1bMV0udmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIERpc3BsYXkvU2V0IE9MVCBJUCtwb3J0CisgICBCQ01DTElfTUFLRV9QQVJNX1JBTkdFKCJkZXZpY2UiLCAiRGV2aWNlIGluZGV4IiwgQkNNQ0xJX1BBUk1fREVDSU1BTCwgMCwKKyAgIEJDTUNMSV9NQUtFX1BBUk0oImlwX2FkZHIiLCAiSVAgYWRkcmVzcyIsIEJDTUNMSV9QQVJNX0lQLCBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMKSwKKyAgIEJDTUNMSV9NQUtFX1BBUk1fUkFOR0UoInVkcF9wb3J0IiwgIlVEUCBwb3J0IiwgQkNNQ0xJX1BBUk1fTlVNQkVSLCBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMLAorICAgKi8KK3N0YXRpYyBiY21vc19lcnJubyBfYmNtdHJfY2xpX29sdF91ZHAoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlID0gKGJjbW9sdF9kZXZpZClwYXJtWzBdLnZhbHVlLm51bWJlcjsKKworICAgIGlmIChucGFybXMgPT0gMSkKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJPTFRbJWRdIEFkZHJlc3M6cG9ydCA9ICVkLiVkLiVkLiVkOiVkXG4iLAorICAgICAgICAgICAgZGV2aWNlLAorICAgICAgICAgICAgKGJjbXRyX29sdF9pcFtkZXZpY2VdID4+IDI0KSAmIDB4ZmYsIChiY210cl9vbHRfaXBbZGV2aWNlXSA+PiAxNikgJiAweGZmLAorICAgICAgICAgICAgKGJjbXRyX29sdF9pcFtkZXZpY2VdID4+IDgpICYgMHhmZiwgYmNtdHJfb2x0X2lwW2RldmljZV0gJiAweGZmLAorICAgICAgICAgICAgYmNtdHJfb2x0X3VkcF9wb3J0W2RldmljZV0pOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoYmNtY2xpX3Bhcm1faXNfc2V0KHNlc3Npb24sICZwYXJtWzFdKSkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtdHJfb2x0X2lwW2RldmljZV0gPSBwYXJtWzFdLnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBpZiAoYmNtY2xpX3Bhcm1faXNfc2V0KHNlc3Npb24sICZwYXJtWzJdKSkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtdHJfb2x0X3VkcF9wb3J0W2RldmljZV0gPSBwYXJtWzJdLnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisjZW5kaWYgLyogI2lmZGVmIEJDTVRSX1VEUF9TVVBQT1JUICovCisKKy8qIENvbm5lY3QKKyAgIEJDTUNMSV9NQUtFX1BBUk1fUkFOR0UoImRldmljZSIsICJEZXZpY2UgaW5kZXgiLCBCQ01DTElfUEFSTV9ERUNJTUFMLCAwLAorICAgKi8KK3N0YXRpYyBiY21vc19lcnJubyBfYmNtdHJfY2xpX2Nvbm5lY3QoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlID0gKGJjbW9sdF9kZXZpZClwYXJtWzBdLnZhbHVlLm51bWJlcjsKKyAgICByZXR1cm4gYmNtdHJfY29ubmVjdChkZXZpY2UpOworfQorCisvKiBEaXNjb25uZWN0CisgICBCQ01DTElfTUFLRV9QQVJNX1JBTkdFKCJkZXZpY2UiLCAiRGV2aWNlIGluZGV4IiwgQkNNQ0xJX1BBUk1fREVDSU1BTCwgMCwKKyAgICovCitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbXRyX2NsaV9kaXNjb25uZWN0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgYmNtb2x0X2RldmlkIGRldmljZSA9IChiY21vbHRfZGV2aWQpcGFybVswXS52YWx1ZS5udW1iZXI7CisgICAgcmV0dXJuIGJjbXRyX2Rpc2Nvbm5lY3QoZGV2aWNlKTsKK30KKworLyogUmVjb25uZWN0CisgICBCQ01DTElfTUFLRV9QQVJNX1JBTkdFKCJkZXZpY2UiLCAiRGV2aWNlIGluZGV4IiwgQkNNQ0xJX1BBUk1fREVDSU1BTCwgMCwKKyAgICovCitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbXRyX2NsaV9yZWNvbm5lY3QoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlID0gKGJjbW9sdF9kZXZpZClwYXJtWzBdLnZhbHVlLm51bWJlcjsKKyAgICByZXR1cm4gYmNtdHJfZHJpdmVyX3JlY29ubmVjdChkZXZpY2UpOworfQorCisvKiBTdGF0CisgICBCQ01DTElfTUFLRV9QQVJNX1JBTkdFKCJkZXZpY2UiLCAiRGV2aWNlIGluZGV4IiwgQkNNQ0xJX1BBUk1fREVDSU1BTCwgMCwKKyAgICovCitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbXRyX2NsaV9zdGF0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgYmNtb2x0X2RldmlkIGRldmljZSA9IChiY21vbHRfZGV2aWQpcGFybVswXS52YWx1ZS5udW1iZXI7CisgICAgYmNtdHJfc3RhdCBzdGF0OworICAgIGJjbW9zX2Vycm5vIGVycjsKKyNpZmRlZiBCQ01UUl9QTFVHSU5fVEFTS19GT1JXQVJERVIKKyAgICBzdGF0aWMgdWludDMyX3QgcHJldl9yYXdfdHhfZHJvcF9jb3VudDsKKyAgICB1aW50MzJfdCBuZXdfcmF3X3R4X2Ryb3BfY291bnQgPSByYXdfdHhfZHJvcF9jb3VudDsKKyNlbmRpZgorCisgICAgZXJyID0gYmNtdHJfc3RhdF9nZXQoZGV2aWNlLCAmc3RhdCk7CisgICAgaWYgKGVycikKKyAgICAgICAgcmV0dXJuIGVycjsKKworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIlLTI0cyA6ICVkXG4iLCAibXNnX3NlbnQiLCBzdGF0Lm1zZ19zZW50KTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiJS0yNHMgOiAlZFxuIiwgIm1zZ19yZXNwX3JlY2VpdmVkIiwgc3RhdC5tc2dfcmVzcF9yZWNlaXZlZCk7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIiUtMjRzIDogJWRcbiIsICJtc2dfcmVxX2F1dG9fcmVjZWl2ZWQiLCBzdGF0Lm1zZ19yZXFfYXV0b19yZWNlaXZlZCk7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIiUtMjRzIDogJWRcbiIsICJtc2dfcmVxX3RpbWVvdXQiLCBzdGF0Lm1zZ19yZXFfdGltZW91dCk7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIiUtMjRzIDogJWRcbiIsICJtc2dfcmVhc3NfdGltZW91dCIsIHN0YXQubXNnX3JlYXNzX3RpbWVvdXQpOworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIlLTI0cyA6ICVkXG4iLCAibXNnX25vX3JlcSIsIHN0YXQubXNnX25vX3JlcSk7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIiUtMjRzIDogJWRcbiIsICJtc2dfbm9fbWVtIiwgc3RhdC5tc2dfbm9fbWVtKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiJS0yNHMgOiAlZFxuIiwgIm1zZ19jb21tX2VyciIsIHN0YXQubXNnX2NvbW1fZXJyKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiJS0yNHMgOiAlZFxuIiwgIm1zZ19yZWFkeV90aW1lb3V0Iiwgc3RhdC5tc2dfcmVhZHlfdGltZW91dCk7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIiUtMjRzIDogJWRcbiIsICJtc2dfdG9vX21hbnlfcmVxIiwgc3RhdC5tc2dfdG9vX21hbnlfcmVxKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiJS0yNHMgOiAlZFxuIiwgIm1zZ190b29fbWFueV9hdXRvIiwgc3RhdC5tc2dfdG9vX21hbnlfYXV0byk7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIiUtMjRzIDogJWRcbiIsICJmcmFnX3JlY2VpdmVkIiwgc3RhdC5mcmFnX3JlY2VpdmVkKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiJS0yNHMgOiAlZFxuIiwgImZyYWdfaW52YWxpZCIsIHN0YXQuZnJhZ19pbnZhbGlkKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiJS0yNHMgOiAlZFxuIiwgInVucGFja19lcnJvcnMiLCBzdGF0LnVucGFja19lcnJvcnMpOworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIlLTI0cyA6ICVkXG4iLCAicGFja19lcnJvcnMiLCBzdGF0LnBhY2tfZXJyb3JzKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiJS0yNHMgOiAlZFxuIiwgIm5vX3J4X2hhbmRsZXIiLCBzdGF0Lm5vX3J4X2hhbmRsZXIpOworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIlLTI0cyA6ICVkXG4iLCAibm90X2Nvbm5lY3RlZCIsIHN0YXQubm90X2Nvbm5lY3RlZCk7CisjaWZkZWYgQkNNVFJfUExVR0lOX1RBU0tfRk9SV0FSREVSCisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIiUtMjRzIDogJWRcbiIsICJyYXdfdHhfZHJvcCIsIG5ld19yYXdfdHhfZHJvcF9jb3VudCAtIHByZXZfcmF3X3R4X2Ryb3BfY291bnQpOworICAgIHByZXZfcmF3X3R4X2Ryb3BfY291bnQgPSBuZXdfcmF3X3R4X2Ryb3BfY291bnQ7CisjZW5kaWYKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogUmVnaXN0ZXIKKyAgIEJDTUNMSV9NQUtFX1BBUk1fUkFOR0UoImRldmljZSIsICJEZXZpY2UgaW5kZXgiLCBCQ01DTElfUEFSTV9ERUNJTUFMLCAwLAorICAgKi8KK3N0YXRpYyBiY21vc19lcnJubyBfYmNtdHJfY2xpX3JlZ2lzdGVyX2luZm8oYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlID0gKGJjbW9sdF9kZXZpZClwYXJtWzBdLnZhbHVlLm51bWJlcjsKKyAgICBiY210cl9oYW5kbGVyX3Bhcm0gcCA9CisgICAgeworICAgICAgICAuaW5zdGFuY2UgPSAodWludDhfdClwYXJtWzFdLnZhbHVlLm51bWJlciwKKyAgICAgICAgLmdyb3VwID0gKGJjbW9sdF9tZ3RfZ3JvdXApcGFybVsyXS52YWx1ZS5udW1iZXIsCisgICAgfTsKKworICAgIGlmIChwLmluc3RhbmNlID49IEJDTVRSX01BWF9JTlNUQU5DRVMpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGZvciAocC5vYmplY3QgPSBCQ01PTFRfT0JKX0lEX0RFVklDRTsgcC5vYmplY3QgPCBCQ01PTFRfT0JKX0lEX19OVU1fT0Y7IHAub2JqZWN0KyspCisgICAgeworICAgICAgICBiY21vbHRfZ3JvdXBfaWQgZ3JvdXBfaWQ7CisgICAgICAgIGNvbnN0IGNoYXIgKm9ial9uYW1lLCAqb2JqX2Rlc2NyOworICAgICAgICBjb25zdCBjaGFyICpzdWJfbmFtZSwgKnN1Yl9kZXNjcjsKKworICAgICAgICBpZiAoYXBpX2NsaV9vYmplY3RfbmFtZShwLm9iamVjdCwgJm9ial9uYW1lLCAmb2JqX2Rlc2NyKSAhPSBCQ01fRVJSX09LKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgZm9yIChwLnN1Ymdyb3VwID0gMDsgYmNtdHJfbXNnX2hhbmRsZXJfcmVnaXN0ZXJfZ2V0KGRldmljZSwgJnApID09IEJDTV9FUlJfT0s7IHAuc3ViZ3JvdXArKykKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2dyb3VwX2lkX2NvbWJpbmUocC5vYmplY3QsIHAuZ3JvdXAsIHAuc3ViZ3JvdXAsICZncm91cF9pZCk7CisgICAgICAgICAgICBhcGlfY2xpX29iamVjdF9zdWJncm91cF9uYW1lKHAub2JqZWN0LCBwLmdyb3VwLCBwLnN1Ymdyb3VwLCAmc3ViX25hbWUsICZzdWJfZGVzY3IpOworCisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiJXMgLSAlcyA6IG1zZ19pZD0ldSAiLCBvYmpfbmFtZSwgc3ViX25hbWUsIGdyb3VwX2lkKTsKKyAgICAgICAgICAgIGlmIChwLmFwcF9jYikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAibW9kdWxlOiVkIGZ1bmM6JXBcbiIsIHAubW9kdWxlLCBwLmFwcF9jYik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIk5PTkVcbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisKK2JjbW9zX2Vycm5vIGJjbXRyX2NsaV9pbml0KHZvaWQpCit7CisgICAgaWYgKCh0cmNsaV9kaXI9YmNtY2xpX2Rpcl9maW5kKE5VTEwsICJ0cmFuc3BvcnQiKSkgIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfQUxSRUFEWTsKKyAgICB0cmNsaV9kaXIgPSBiY21jbGlfZGlyX2FkZChOVUxMLCAidHJhbnNwb3J0IiwgIk1hcGxlIFRyYW5zcG9ydCIsIEJDTUNMSV9BQ0NFU1NfR1VFU1QsIE5VTEwpOworICAgIGlmICghdHJjbGlfZGlyKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCJDYW4ndCBjcmVhdGUgdHJhbnNwb3J0IGRpcmVjdG9yeVxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOworICAgIH0KKworI2lmZGVmIEJDTVRSX1VEUF9TVVBQT1JUCisKKyAgICBCQ01DTElfTUFLRV9DTUQodHJjbGlfZGlyLCAiaG9zdF91ZHAiLCAiSG9zdCBJUCBhbmQgVURQIHBvcnQgcGFyYW1ldGVycyIsIF9iY210cl9jbGlfaG9zdF91ZHAsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImlwX2FkZHIiLCAiSVAgYWRkcmVzcyIsIEJDTUNMSV9QQVJNX0lQLCBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9SQU5HRSgidWRwX3BvcnQiLCAiVURQIHBvcnQiLCBCQ01DTElfUEFSTV9OVU1CRVIsIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwsCisgICAgICAgIDAsIDB4ZmZmZikpOworICAgIEJDTUNMSV9NQUtFX0NNRCh0cmNsaV9kaXIsICJvbHRfdWRwIiwgIk9MVCBJUCBhbmQgVURQIHBvcnQgcGFyYW1ldGVycyIsIF9iY210cl9jbGlfb2x0X3VkcCwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9SQU5HRSgiZGV2aWNlIiwgIkRldmljZSBpbmRleCIsIEJDTUNMSV9QQVJNX0RFQ0lNQUwsIDAsCisgICAgICAgIDAsIEJDTVRSX01BWF9PTFRTLTEpLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJpcF9hZGRyIiwgIklQIGFkZHJlc3MiLCBCQ01DTElfUEFSTV9JUCwgQkNNQ0xJX1BBUk1fRkxBR19PUFRJT05BTCksCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fUkFOR0UoInVkcF9wb3J0IiwgIlVEUCBwb3J0IiwgQkNNQ0xJX1BBUk1fTlVNQkVSLCBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMLAorICAgICAgICAwLCAweGZmZmYpKTsKKyNlbmRpZgorCisgICAgQkNNQ0xJX01BS0VfQ01EKHRyY2xpX2RpciwgImNvbm5lY3QiLCAiQ29ubmVjdCIsIF9iY210cl9jbGlfY29ubmVjdCwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9SQU5HRSgiZGV2aWNlIiwgIkRldmljZSBpbmRleCIsIEJDTUNMSV9QQVJNX0RFQ0lNQUwsIDAsCisgICAgICAgIDAsIEJDTVRSX01BWF9PTFRTLTEpKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRCh0cmNsaV9kaXIsICJkaXNjb25uZWN0IiwgIkRpc2Nvbm5lY3QiLCBfYmNtdHJfY2xpX2Rpc2Nvbm5lY3QsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fUkFOR0UoImRldmljZSIsICJEZXZpY2UgaW5kZXgiLCBCQ01DTElfUEFSTV9ERUNJTUFMLCAwLAorICAgICAgICAwLCBCQ01UUl9NQVhfT0xUUy0xKSk7CisKKyAgICBCQ01DTElfTUFLRV9DTUQodHJjbGlfZGlyLCAicmVjb25uZWN0IiwgIlJlY29ubmVjdCIsIF9iY210cl9jbGlfcmVjb25uZWN0LAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX1JBTkdFKCJkZXZpY2UiLCAiRGV2aWNlIGluZGV4IiwgQkNNQ0xJX1BBUk1fREVDSU1BTCwgMCwKKyAgICAgICAgMCwgQkNNVFJfTUFYX09MVFMtMSkpOworCisgICAgQkNNQ0xJX01BS0VfQ01EKHRyY2xpX2RpciwgInN0YXQiLCAiVHJhbnNwb3J0IHN0YXRpc3RpY3MiLCBfYmNtdHJfY2xpX3N0YXQsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fUkFOR0UoImRldmljZSIsICJEZXZpY2UgaW5kZXgiLCBCQ01DTElfUEFSTV9ERUNJTUFMLCAwLAorICAgICAgICAwLCBCQ01UUl9NQVhfT0xUUy0xKSk7CisKKyAgICB7CisgICAgICAgIHN0YXRpYyBiY21jbGlfZW51bV92YWwgZ3JvdXBzW10gPQorICAgICAgICB7CisjaWZkZWYgQkNNX1NVQlNZU1RFTV9IT1NUCisgICAgICAgICAgICB7IC5uYW1lID0gImF1dG8iLCAudmFsID0gQkNNT0xUX01HVF9HUk9VUF9DRkcgfSwKKyAgICAgICAgICAgIHsgLm5hbWUgPSAicHJveHlfcngiLCAudmFsID0gQkNNT0xUX01HVF9HUk9VUF9QUk9YWV9SWCB9LAorI2Vsc2UKKyAgICAgICAgICAgIHsgLm5hbWUgPSAiY2ZnIiwgLnZhbCA9IEJDTU9MVF9NR1RfR1JPVVBfQ0ZHIH0sCisgICAgICAgICAgICB7IC5uYW1lID0gInN0YXQiLCAudmFsID0gQkNNT0xUX01HVF9HUk9VUF9TVEFUIH0sCisgICAgICAgICAgICB7IC5uYW1lID0gInN0YXRfY2ZnIiwgLnZhbCA9IEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkcgfSwKKyAgICAgICAgICAgIHsgLm5hbWUgPSAib3BlciIsIC52YWwgPSBCQ01PTFRfTUdUX0dST1VQX09QRVIgfSwKKyAgICAgICAgICAgIHsgLm5hbWUgPSAiYXV0b19jZmciLCAudmFsID0gQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRyB9LAorICAgICAgICAgICAgeyAubmFtZSA9ICJwcm94eSIsIC52YWwgPSBCQ01PTFRfTUdUX0dST1VQX1BST1hZIH0sCisjZW5kaWYKKyAgICAgICAgICAgIHsgLm5hbWUgPSBOVUxMIH0KKworICAgICAgICB9OworICAgICAgICBCQ01DTElfTUFLRV9DTUQodHJjbGlfZGlyLCAicmVnaXN0cmF0aW9uIiwgIlRyYW5zcG9ydCBSWCByZWdpc3RyYXRpb24gaW5mbyIsIF9iY210cl9jbGlfcmVnaXN0ZXJfaW5mbywKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fUkFOR0UoImRldmljZSIsICJEZXZpY2UgaW5kZXgiLCBCQ01DTElfUEFSTV9ERUNJTUFMLCAwLAorICAgICAgICAgICAgMCwgQkNNVFJfTUFYX09MVFMtMSksCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNX1JBTkdFKCJwb25fbmkiLCAiUE9OIE5JIiwgQkNNQ0xJX1BBUk1fREVDSU1BTCwgMCwKKyAgICAgICAgICAgIDAsIEJDTVRSX01BWF9JTlNUQU5DRVMtMSksCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oImdyb3VwIiwgIk1hbmFnZW1lbnQgZ3JvdXAiLCBncm91cHMsIDApICk7CisgICAgfQorCisgICAgLyogUGVyZm9ybWFuY2UgdGVzdGluZyBkaXJlY3RvcnkgKi8KKyNpZmRlZiBCQ01UUl9QRVJGVEVTVAorICAgIGJjbXRyX3Rlc3RfaW5pdCgpOworI2VuZGlmCisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKwordm9pZCBiY210cl9jbGlfZXhpdCh2b2lkKQoreworICAgIGlmICh0cmNsaV9kaXIpCisgICAgeworICAgICAgICBiY21jbGlfdG9rZW5fZGVzdHJveSh0cmNsaV9kaXIpOworICAgICAgICB0cmNsaV9kaXIgPSBOVUxMOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci90cmFuc3BvcnQvYmNtdHJfdHJhbnNwb3J0X2NsaS5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9iY210cl90cmFuc3BvcnRfY2xpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ViZmZhYQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci90cmFuc3BvcnQvYmNtdHJfdHJhbnNwb3J0X2NsaS5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgQkNNVFJfVFJBTlNQT1JUX0NMSV9IXworI2RlZmluZSBCQ01UUl9UUkFOU1BPUlRfQ0xJX0hfCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKworI2lmZGVmIEVOQUJMRV9DTEkKK2JjbW9zX2Vycm5vIGJjbXRyX2NsaV9pbml0KHZvaWQpOwordm9pZCBiY210cl9jbGlfZXhpdCh2b2lkKTsKKyNlbmRpZgorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9pbmJhbmQvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L2luYmFuZC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWM2YzAwCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9pbmJhbmQvTWFrZWZpbGUKQEAgLTAsMCArMSwxMCBAQAorIyBJbmJhbmQgVHJhbnNwb3J0CisjCisKK01PRF9OQU1FID0gaW5iYW5kX2RyaXZlcgorTU9EX1RZUEUgPSBsaWIKK01PRF9ERUZTID0gLURJTl9CQU5ECisKK1VTRV9MSU5UID0geWVzCisKK3NyY3MgPSBiY210cl9pbmJhbmQuYwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9pbmJhbmQvYmNtdHJfaW5iYW5kLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L2luYmFuZC9iY210cl9pbmJhbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWI3N2NhCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9pbmJhbmQvYmNtdHJfaW5iYW5kLmMKQEAgLTAsMCArMSwyNzYgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKy8qCisgKiBiY210cl9pbmJhbmQuYyAtIEluLWJhbmQgdHJhbnNwb3J0IGRyaXZlcgorICovCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtdHJfaW5iYW5kLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCit0eXBlZGVmIHN0cnVjdCBkZXZpY2VfaW5mbworeworICAgIGJjbW9zX2lwdjRfYWRkcmVzcyByZW1vdGVfaXA7CisgICAgdWludDE2X3QgcmVtb3RlX3BvcnQ7CisgICAgdWludDhfdCBjaGFubmVsOworICAgIGludCB0cl91ZHBfc29jazsKK30gZGV2aWNlX2luZm87CisKK3N0YXRpYyBkZXZpY2VfaW5mbyBkZXZfaW5mb1tCQ01UUl9NQVhfT0xUU107CisKKyNkZWZpbmUgREVCVUdfT05MWSAwCisKKy8qKiBJbml0aWFsaXplIGluLWJhbmQgdHJhbnNwb3J0IGRyaXZlcgorICogXHJldHVybnM6IDAgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIGVycm9yIGNvZGUgPCAwCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX2liX2luaXQodm9pZCkKK3sKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqIENsZWFudXAgaW4tYmFuZCB0cmFuc3BvcnQgZHJpdmVyCisgKiBccmV0dXJuczogMCBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSA8IDAKKyAqLwordm9pZCBiY210cl9pYl9leGl0KHZvaWQpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGk9MDsgaTxCQ01UUl9NQVhfT0xUUzsgaSsrKQorICAgIHsKKyAgICAgICAgYmNtdHJfaWJfZGlzY29ubmVjdChpKTsKKyAgICB9Cit9CisKKy8qIFJlY2VpdmUgcGFja2V0ICovCitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbXRyX2liX3J4KHVpbnQzMl90IGRldmljZSwgaW50IHMsIGJjbW9zX2J1ZiAqKmJ1ZiwgdWludDhfdCAqY2gpCit7CisgICAgc3RydWN0IHNvY2thZGRyX2luIHNhOworI2lmIDAKKyAgICBzdHJ1Y3QgaW92ZWMgaW92ID0gey5pb3ZfbGVuID0gQkNNVFJfTUFYX01UVV9TSVpFfTsKKyAgICBzdHJ1Y3QgbXNnaGRyIG1zZyA9IHsKKyAgICAgICAgLm1zZ19pb3YgPSAmaW92LCAubXNnX2lvdmxlbiA9IDEsCisgICAgICAgIC5tc2dfbmFtZSA9ICZzYSwgLm1zZ19uYW1lbGVuID0gc2l6ZW9mKHNhKQorICAgIH07CisjZW5kaWYKKyAgICBiY21vc19idWYgKmI7CisgICAgc3NpemVfdCBsZW47CisKKyAgICBiID0gYmNtb3NfYnVmX2FsbG9jKEJDTVRSX01BWF9NVFVfU0laRSk7CisgICAgaWYgKCFiKQorICAgIHsKKyAgICAgICAgYmNtb3NfcHJpbnRmKCIlczogRmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlclxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorI2lmIDAKKyAgICBpb3YuaW92X2Jhc2UgPSBiY21vc19idWZfZGF0YShiKTsKKyNlbmRpZgorICAgIG1lbXNldCgmc2EsIDAsIHNpemVvZihzYSkpOworICAgIGxlbiA9IHJlY3YocywgYmNtb3NfYnVmX2RhdGEoYiksIEJDTVRSX01BWF9NVFVfU0laRSwgMCk7CisgICAgaWYgKGxlbiA8PSAwKQorICAgIHsKKyAgICAgICAgYmNtb3NfcHJpbnRmKCIlczogcmVjdm1zZygpIC0tPiAlZFxuIiwgX19GVU5DVElPTl9fLCBsZW4pOworICAgICAgICBiY21vc19idWZfZnJlZShiKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfQ09NTV9GQUlMOworICAgIH0KKworICAgICpjaCA9IGRldl9pbmZvW2RldmljZV0uY2hhbm5lbDsKKyAgICBkZXZfaW5mb1tkZXZpY2VdLmNoYW5uZWwgPSAwOworICAgIGJjbW9zX2J1Zl9sZW5ndGhfc2V0KGIsIChpbnQpbGVuKTsKKyAgICAqYnVmID0gYjsKKworI2lmIERFQlVHX09OTFkKKyAgICBiY21vc19wcmludGYoIlxuUmVjZWl2ZWQgdG8gJWQgYnl0ZXMgZnJvbSBjaGFubmVsICVkLyVkIHBvcnQiLCBsZW4sICpjaCwgc2Euc2luX3BvcnQpOworCisgICAgeworICAgICAgICBpbnQgaWkgPSAwOworICAgICAgICB1bnNpZ25lZCBjaGFyICpjID0gYmNtb3NfYnVmX2RhdGEoYik7CisgICAgICAgIGludCBzaXplID0gKGludClsZW47CisKKyAgICAgICAgZm9yIChpaT0wOyBpaTxzaXplOyBpaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoMD09KGlpJTE2KSkgYmNtb3NfcHJpbnRmKCJcbiIpOworICAgICAgICAgICAgaWYgKDA9PShpaSU4KSkgYmNtb3NfcHJpbnRmKCIgICIpOworICAgICAgICAgICAgYmNtb3NfcHJpbnRmKCIgJTAyeCIsICpjKTsKKyAgICAgICAgICAgIGMrKzsKKyAgICAgICAgfQorICAgICAgICBiY21vc19wcmludGYoIlxuIik7CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqIENvbm5lY3QgdG8gbWFwbGUgZGV2aWNlICovCitiY21vc19lcnJubyBiY210cl9pYl9jb25uZWN0KHVpbnQ4X3QgZGV2aWNlLCBiY21vc19pcHY0X2FkZHJlc3MgaXBfYWRkcmVzcywgdWludDE2X3QgdWRwX3BvcnQpCit7CisgICAgaW50IHIgPSAwOworICAgIGludCBzID0gMDsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc2E7CisKKyAgICAvKkNoZWNrIGZvciB2YWxpZCBkZXZpY2UqLworICAgIEJVR19PTigodW5zaWduZWQpZGV2aWNlID49IEJDTVRSX01BWF9PTFRTKTsKKworICAgIGlmIChkZXZfaW5mb1tkZXZpY2VdLnRyX3VkcF9zb2NrKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9BTFJFQURZOworCisgICAgZGV2X2luZm9bZGV2aWNlXS5yZW1vdGVfaXAgPSBpcF9hZGRyZXNzOworICAgIGRldl9pbmZvW2RldmljZV0ucmVtb3RlX3BvcnQgPSB1ZHBfcG9ydDsKKworICAgIC8qY2hlY2sgdGhhdCBpcCBhZGRyZXNzIGFuZCBwb3J0IGhhdmUgYmVlbiBpbml0aWFsaXplZCovCisgICAgaWYoZGV2X2luZm9bZGV2aWNlXS5yZW1vdGVfcG9ydCA9PSAwICB8fCBkZXZfaW5mb1tkZXZpY2VdLnJlbW90ZV9pcC51MzIgPT0gMCkKKyAgICB7CisgICAgICAgIGJjbW9zX3ByaW50ZigiJXM6IElQIGFkZHJlc3MgYW5kIHBvcnQgbm90IGluaXRpYWxpemVkLiBFcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCByKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLyogQ3JlYXRlIHNvY2tldCAqLworICAgIHMgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisgICAgaWYgKCFzKQorICAgIHsKKyAgICAgICAgYmNtb3NfcHJpbnRmKCIlczogRmFpbGVkIHRvIGNyZWF0ZSBzb2NrZXQuIEVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sIHMpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9DT01NX0ZBSUw7CisgICAgfQorCisgICAgLyogQ29ubmVjdCB0byByZW1vdGUgKi8KKyAgICBtZW1zZXQoJnNhLCAwLCBzaXplb2Yoc2EpKTsKKyAgICBzYS5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICBzYS5zaW5fcG9ydCA9IChpbl9wb3J0X3QpaHRvbnMoZGV2X2luZm9bZGV2aWNlXS5yZW1vdGVfcG9ydCk7CisgICAgc2Euc2luX2FkZHIuc19hZGRyID0gKGluX2FkZHJfdClodG9ubChkZXZfaW5mb1tkZXZpY2VdLnJlbW90ZV9pcC51MzIpOworICAgIHIgPSBjb25uZWN0KHMsIChzdHJ1Y3Qgc29ja2FkZHIqKSZzYSwgc2l6ZW9mKHNhKSk7CisgICAgaWYgKHIpCisgICAgeworICAgICAgICBiY21vc19wcmludGYoIiVzOiBGYWlsZWQgdG8gY29ubmVjdCBzb2NrZXQuIEVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sIHIpOworICAgICAgICBjbG9zZShzKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfQ09NTV9GQUlMOworICAgIH0KKworICAgIHsKKyAgICAgICAgc29ja2xlbl90IHNsZW47CisgICAgICAgIGlmIChnZXRzb2NrbmFtZShzLCAoc3RydWN0IHNvY2thZGRyICopJnNhLCAmc2xlbikgPCAwKQorICAgICAgICB7CisgICAgICAgIGJjbW9zX3ByaW50ZigiJXM6IENvbm5lY3RlZCBzb2NrZXQgaW52YWxpZC4gRXJyb3IgJWRcbiIsIF9fRlVOQ1RJT05fXywgcik7CisgICAgICAgIGNsb3NlKHMpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9DT01NX0ZBSUw7CisgICAgICAgIH0KKworICAgICAgICBiY21vc19wcmludGYoIiVzOiBkZXZpY2UgJWQ6IHNvY2tldCAocG9ydCAlZCkgY29ubmVjdGVkIHRvICVkLiVkLiVkLiVkOiVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkZXZpY2UsIG50b2hzKCh1aW50MTZfdClzYS5zaW5fcG9ydCksCisgICAgICAgICAgICAgICAgICAgICAoaW50KShkZXZfaW5mb1tkZXZpY2VdLnJlbW90ZV9pcC51MzIgPj4gMjQpLCAoaW50KSgoZGV2X2luZm9bZGV2aWNlXS5yZW1vdGVfaXAudTMyID4+IDE2KSAmIDB4ZmYpLAorICAgICAgICAgICAgICAgICAgICAgKGludCkoKGRldl9pbmZvW2RldmljZV0ucmVtb3RlX2lwLnUzMiA+PiA4KSAmIDB4ZmYpLCAoaW50KShkZXZfaW5mb1tkZXZpY2VdLnJlbW90ZV9pcC51MzIgJiAweGZmKSwKKyAgICAgICAgICAgICAgICAgICAgIChpbnQpZGV2X2luZm9bZGV2aWNlXS5yZW1vdGVfcG9ydCk7CisgICAgfQorCisgICAgZGV2X2luZm9bZGV2aWNlXS50cl91ZHBfc29jayA9IHM7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqIERpc2Nvbm5lY3QuIEFsbCBidWZmZXJzIGFyZSByZWxlYXNlZAorICogXHBhcmFtW2luXSAgIGRldmljZSAgICAgICAgICBNYXBsZSBkZXZpY2UgaW5kZXgKKyAqIFxyZXR1cm5zOiAwIGluIGNhc2Ugb2Ygc3VjY2VzcyBvciBlcnJvciBjb2RlIDwgMAorICovCitiY21vc19lcnJubyBiY210cl9pYl9kaXNjb25uZWN0KHVpbnQ4X3QgZGV2aWNlKQoreworICAgIEJVR19PTigodW5zaWduZWQpZGV2aWNlID49IEJDTVRSX01BWF9PTFRTKTsKKworICAgIGJjbW9zX3ByaW50ZigiJXM6IGRpc2Nvbm5lY3RpbmcgJWQuLiIsIF9fRlVOQ1RJT05fXywgZGV2aWNlKTsKKyAgICBpZiAoZGV2X2luZm9bZGV2aWNlXS50cl91ZHBfc29jaykKKyAgICB7CisgICAgICAgIGludCBzID0gZGV2X2luZm9bZGV2aWNlXS50cl91ZHBfc29jazsKKyAgICAgICAgZGV2X2luZm9bZGV2aWNlXS50cl91ZHBfc29jayA9IDA7CisgICAgICAgIGNsb3NlKHMpOworICAgIH0KKyAgICBiY21vc19wcmludGYoImRvbmVcbiIpOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiogU2VuZCBwYWNrZXQgdG8gZGV2aWNlIHZpYSBpbi1iYW5kIGludGVyZmFjZQorICogXHBhcmFtW2luXSAgIGRldmljZSAgTWFwb2xlIGRldmljZSBpbmRleAorICogXHBhcmFtW2luXSAgIGNoYW5uZWwgTG9naWNhbCBjaGFubmVsCisgKiBccGFyYW1baW5dICAgYnVmICAgICBCdWZmZXIgdG8gYmUgdHJhbnNtaXR0ZWQKKyAqIFxyZXR1cm5zOiAwIGluIGNhc2Ugb2Ygc3VjY2VzcyBvciBlcnJvciBjb2RlIDwgMAorICovCitiY21vc19lcnJubyBiY210cl9pYl9zZW5kKHVpbnQ4X3QgZGV2aWNlLCB1aW50OF90IGNoYW5uZWwsIGJjbW9zX2J1ZiAqYnVmKQoreworICAgIGludCBidWZsZW4gPSBiY21vc19idWZfbGVuZ3RoKGJ1Zik7CisgICAgc3RydWN0IGlvdmVjIGlvdiA9IHsgLmlvdl9iYXNlID0gYmNtb3NfYnVmX2RhdGEoYnVmKSwgLmlvdl9sZW4gPSBidWZsZW4gfTsKKyAgICBzdHJ1Y3QgbXNnaGRyIG1zZyA9IHsKKyAgICAgICAgLm1zZ19pb3YgPSAmaW92LCAubXNnX2lvdmxlbiA9IDEsIC5tc2dfZmxhZ3M9TVNHX0RPTlRXQUlULAorICAgICAgICAubXNnX25hbWUgPSBOVUxMLCAubXNnX25hbWVsZW4gPSAwCisgICAgfTsKKyAgICBzc2l6ZV90IGxlbjsKKworICAgIGRldl9pbmZvW2RldmljZV0uY2hhbm5lbCA9IGNoYW5uZWw7CisKKyAgICBsZW4gPSBzZW5kbXNnKGRldl9pbmZvW2RldmljZV0udHJfdWRwX3NvY2ssICZtc2csIDApOworICAgIGlmICgoaW50KWxlbiA8IGJ1ZmxlbikKKyAgICB7CisgICAgICAgIGJjbW9zX3ByaW50ZigiJXM6IHNlbmRtc2coJXUpIC0tPiAlZFxuIiwgX19GVU5DVElPTl9fLCBidWZsZW4sIGxlbik7CisgICAgICAgIGJjbW9zX2J1Zl9mcmVlKGJ1Zik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PVF9DT05ORUNURUQ7CisgICAgfQorCisjaWYgMQorICAgIHsKKyAgICAgICAgaW50IGlpID0gMDsKKyAgICAgICAgdW5zaWduZWQgY2hhciAqYyA9IGJjbW9zX2J1Zl9kYXRhKGJ1Zik7CisgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBzYTsKKyAgICAgICAgc29ja2xlbl90IHNsZW47CisKKyAgICAgICAgZm9yIChpaT0wOyBpaTwoaW50KWxlbjsgaWkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKDA9PShpaSUxNikpIGJjbW9zX3ByaW50ZigiXG4iKTsKKyAgICAgICAgICAgIGlmICgwPT0oaWklOCkpIGJjbW9zX3ByaW50ZigiICAiKTsKKyAgICAgICAgICAgIGJjbW9zX3ByaW50ZigiICUwMngiLCAqYyk7CisgICAgICAgICAgICBjKys7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZ2V0c29ja25hbWUoZGV2X2luZm9bZGV2aWNlXS50cl91ZHBfc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZzYSwgJnNsZW4pIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfcHJpbnRmKCIlczogQ29ubmVjdGVkIHNvY2tldCBpbnZhbGlkXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfQ09NTV9GQUlMOworICAgICAgICB9CisgICAgICAgIGJjbW9zX3ByaW50ZigiXG5TZW50ICVkIGJ5dGVzIHRvIGNoYW5uZWwgJWQgZnJvbSBwb3J0ICVkXHQiLCBsZW4sIGNoYW5uZWwsIHNhLnNpbl9wb3J0KTsKKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBSZWNlaXZlIHBhY2tldCBmcm9tIGRldmljZSAqLworYmNtb3NfZXJybm8gYmNtdHJfaWJfcmVjZWl2ZSh1aW50MzJfdCBkZXZpY2UsIHVpbnQ4X3QgKmNoYW5uZWwsIGJjbW9zX2J1ZiAqKmJ1ZikKK3sKKyAgICBpZiAoZGV2aWNlID49IEJDTVRSX01BWF9PTFRTIHx8ICEgIGRldl9pbmZvW2RldmljZV0udHJfdWRwX3NvY2spCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIHJldHVybiBfYmNtdHJfaWJfcngoZGV2aWNlLCBkZXZfaW5mb1tkZXZpY2VdLnRyX3VkcF9zb2NrLCBidWYsIGNoYW5uZWwpOworfQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9pbmJhbmQvYmNtdHJfaW5iYW5kLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L2luYmFuZC9iY210cl9pbmJhbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGYzZDdkCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9pbmJhbmQvYmNtdHJfaW5iYW5kLmgKQEAgLTAsMCArMSw3NCBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworLyoKKyAqIGJjbXRyX2luYmFuZC5oIC0gSW5iYW5kIGhvc3QtbWFwbGUgY29tbXVuaWNhdGlvbiBpbnRlcmZhY2UKKyAqLworCisjaWZuZGVmIF9CQ01UUl9JTkJBTkRfSF8KKyNkZWZpbmUgX0JDTVRSX0lOQkFORF9IXworCisKKy8qKiBJbml0aWFsaXplIGluLWJhbmQgdHJhbnNwb3J0IGRyaXZlcgorICogXHJldHVybnM6IDAgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIGVycm9yIGNvZGUgPCAwCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX2liX2luaXQodm9pZCk7CisKKworLyoqIENsZWFudXAgaW4tYmFuZCB0cmFuc3BvcnQgZHJpdmVyCisgKiBccmV0dXJuczogMCBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSA8IDAKKyAqLwordm9pZCBiY210cl9pYl9leGl0KHZvaWQpOworCisvKiogQ29ubmVjdAorICogXHBhcmFtW2luXSAgZGV2aWNlICAgICAgICAgIE1hcGxlIGRldmljZSBpbmRleAorICogXHBhcmFtW2luXSAgaXBfYWRkcmVzcyAgICAgIE1hcGxlIElQIGFkZHJlc3MKKyAqIFxwYXJhbVtpbl0gIHVkcF9wb3J0ICAgICAgICBNYXBsZSBVRFAgcG9ydAorICogXHJldHVybnM6IDAgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIGVycm9yIGNvZGUgPCAwCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX2liX2Nvbm5lY3QodWludDhfdCBkZXZpY2UsIGJjbW9zX2lwdjRfYWRkcmVzcyBpcF9hZGRyZXNzLCB1aW50MTZfdCB1ZHBfcG9ydCk7CisKKy8qKiBEaXNjb25uZWN0LiBBbGwgYnVmZmVycyBhcmUgcmVsZWFzZWQKKyAqIFxwYXJhbVtpbl0gICBkZXZpY2UgICAgICAgICAgTWFwbGUgZGV2aWNlIGluZGV4CisgKiBccmV0dXJuczogMCBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSA8IDAKKyAqLworYmNtb3NfZXJybm8gYmNtdHJfaWJfZGlzY29ubmVjdCh1aW50OF90IGRldmljZSk7CisKKy8qKiBTZW5kIHBhY2tldCB0byBkZXZpY2UgdmlhIGluLWJhbmQgaW50ZXJmYWNlCisgKiBccGFyYW1baW5dICAgZGV2aWNlICBNYXBvbGUgZGV2aWNlIGluZGV4CisgKiBccGFyYW1baW5dICAgY2hhbm5lbCBMb2dpY2FsIGNoYW5uZWwKKyAqIFxwYXJhbVtpbl0gICBidWYgICAgIEJ1ZmZlciB0byBiZSB0cmFuc21pdHRlZAorICogXHJldHVybnM6IDAgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIGVycm9yIGNvZGUgPCAwCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX2liX3NlbmQodWludDhfdCBkZXZpY2UsIHVpbnQ4X3QgY2hhbm5lbCwgYmNtb3NfYnVmICpidWYpOworCisvKiBSZWNlaXZlIHBhY2tldCBmcm9tIGRldmljZSAqLworYmNtb3NfZXJybm8gYmNtdHJfaWJfcmVjZWl2ZSh1aW50MzJfdCBkZXZpY2UsIHVpbnQ4X3QgKmNoYW5uZWwsIGJjbW9zX2J1ZiAqKmJ1Zik7CisKKyNlbmRpZiAvKiBfQkNNVFJfSU5CQU5EX0hfICovCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L211eC9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci90cmFuc3BvcnQvbXV4L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNDVhOTcKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L211eC9NYWtlZmlsZQpAQCAtMCwwICsxLDM1IEBACisjIFBDSWUgdHJhbnNwb3J0CisjIENvbnNpc3RzIG9mIDIgY29tcG9uZW50cworIyAtIGxvdy1sZXZlbCBQQ0llIGRyaXZlciAoc2VuZC9yeCBmdW5jdGlvbnMpCisjIC0gbXVsdGlwbGV4ZXIKKyMKK01PRF9OQU1FID0gdHJtdXgKK01PRF9ERVBTID0gdHJhbnNwb3J0IG1vZGVsIHBjaWUgcGNpZV9tb2QgbGxfcGNpZSBmbGQgcGNpZV9zd19xdWV1ZQorCitpZmVxICgiJChSRUxFQVNFX0JVSUxEKSIsICJ5IikKKyAgICBNT0RfREVQUyArPSBjb21tb25fYXBpCitlbHNlCisgICAgTU9EX0RFUFMgKz0gYXBpCitlbmRpZgorCitpZmVxICgiJChSQVdfVFJBTlNQT1JUX1ZJQV9VRFApIiwgInkiKQorTU9EX0RFUFMgKz0gdHJwY2llCitlbmRpZgorCitpZmVxICgiJChPU19LRVJORUwpIiwgImxpbnV4IikKK01PRF9UWVBFID0gbGludXhfbGliCitlbHNlCitNT0RfVFlQRSA9IGxpYgorZW5kaWYKKworIyBJZiBjYWxsZWQgYnkgbGludXgga2VybmVsIGJ1aWxkZXIgLSBhZGQgaW5jbHVkZSBwYXRocyBtYW51YWxseS4KKyMgSXQgaXMgbm90IGVsZWdhbnQsIGJ1dCB3ZSdsbCBub3QgaGF2ZSBtYW55IGxpbnV4IG1vZHVsZXMKK2lmbmVxICgiJChLQlVJTERfU1JDKSIsICIiKQorCS1pbmNsdWRlICQoT1VUX0RJUl9CQVNFKS9NYWtlZmlsZS5jb25maWcuJChNT0RfTkFNRSkKK2VuZGlmCisKK3NyY3MgPSBiY21vbHRfdHJfbXV4LmMgCisKK1VTRV9MSU5UID0geWVzCisKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9tdXgvYmNtb2x0X3RyX211eC5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9tdXgvYmNtb2x0X3RyX211eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3M2U2NTAKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L211eC9iY21vbHRfdHJfbXV4LmMKQEAgLTAsMCArMSwxMDkyIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisvKgorICogYmNtdHJfbXV4LmMKKyAqCisgKiBUcmFuc3BvcnQgTXVsdGlwbGV4ZXIKKyAqIC0gUENJZS9pbi1iYW5kIGNoYW5uZWwgbXVsdGlwbGV4ZXIKKyAqIC0gbG9jYWxseS9yZW1vdGVseSAtIHRlcm1pbmF0ZWQgbWVzc2FnZSBtdWx0aXBsZXhlcgorICogLSBhdXRvbm9tb3VzIG1lc3NhZ2VzIGRlLW11bHRpcGxleGVyCisgKi8KKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21vbHRfbXNnLmg+CisjaW5jbHVkZSA8YmNtb2x0X2J1Zi5oPgorI2luY2x1ZGUgPGJjbW9sdF9tc2dfcGFjay5oPgorI2luY2x1ZGUgPGJjbXRyX2hlYWRlci5oPgorI2luY2x1ZGUgPGJjbW9sdF90cl9tdXguaD4KKyNpZmRlZiBJTl9CQU5ECisjaW5jbHVkZSA8YmNtdHJfaW5iYW5kLmg+CisjZWxzZQorI2luY2x1ZGUgPGJjbXRyX3BjaWUuaD4KKyNpbmNsdWRlIDxiY21vbHRfbGxwY2llLmg+CisjaW5jbHVkZSA8YmNtb2x0X2ZsZC5oPgorI2luY2x1ZGUgPGJjbV9mbGRfY29tbW9uLmg+CisjaW5jbHVkZSA8YmNtdHJfcGNpZV9zd19xdWV1ZS5oPgorI2VuZGlmCisjaW5jbHVkZSA8YmNtb2x0X2FwaS5oPgorI2luY2x1ZGUgPGJjbW9sdF9tb2RlbF90eXBlcy5oPgorI2luY2x1ZGUgPGJjbW9sdF9tb2RlbF9pZHMuaD4KKworI2RlZmluZSBCQ01UUk1VWF9NQVhfVFhfREVMQVkgICA1MDAgICAgIC8qIG1heCB0cmFuc21pdCBkZWxheSAodXMpICovCisjZGVmaW5lIEJDTVRSTVVYX01BWF9SWF9ERUxBWSAgIDUwMDAgICAgLyogbWF4IHJlY2VpdmUgZGVsYXkgKHVzKSAqLworCisjaWZkZWYgX19LRVJORUxfXworI2RlZmluZSBCQ01UUk1VWF9MT0cgcHJpbnRrCisjZWxzZQorI2RlZmluZSBCQ01UUk1VWF9MT0cgQkNNT1NfVFJBQ0VfSU5GTworI2VuZGlmCisKKy8qIENoYW5uZWwgcmVnaXN0cmF0aW9uIGluZm8gKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgZl9iY210cl9yeF9oYW5kbGVyIHJ4OworICAgIHZvaWQgKmRhdGE7Cit9IGJjbXRybXV4X3J4X2luZm87CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgZl9iY210cl9sb2NhbF9yeF9oYW5kbGVyIHJ4OworICAgIHZvaWQgKmRhdGE7Cit9IGJjbXRybXV4X2xvY2FsX3J4X2luZm87CisKKy8qIFJlZ2lzdHJhdGlvbiBhcnJheXMgKi8KK3N0YXRpYyBiY210cm11eF9yeF9pbmZvIGJjbXRybXV4X3J4X2luZm9fYXJyYXlbQkNNVFJfTUFYX09MVFNdW0JDTVRSTVVYX01BWF9DSEFOTkVMU107CitzdGF0aWMgYmNtdHJtdXhfbG9jYWxfcnhfaW5mbyBiY210cm11eF9sb2NhbF9yeF9pbmZvX2FycmF5W0JDTVRSX01BWF9PTFRTXTsKK3N0YXRpYyBiY210cm11eF9jaGFubmVsIGJjbXRybXV4X2F1dG9fY2hhbm5lbHNbQkNNVFJfTUFYX09MVFNdW0JDTVRSX01BWF9JTlNUQU5DRVNdW0JDTU9MVF9PQkpfSURfX05VTV9PRl07CitzdGF0aWMgYmNtdHJtdXhfY2hhbm5lbCBiY210cm11eF9wcm94eV9jaGFubmVsc1tCQ01UUl9NQVhfT0xUU11bQkNNVFJfTUFYX0lOU1RBTkNFU11bQkNNT0xUX09CSl9JRF9fTlVNX09GXTsKK3N0YXRpYyBiY21vc19ib29sIGJjbXRyX211eF9jb25uZWN0ZWRbQkNNVFJfTUFYX09MVFNdOworc3RhdGljIGJjbW9zX2Jvb2wgYmNtdHJfbXV4X3Rlcm1pbmF0ZWRbQkNNVFJfTUFYX09MVFNdOworc3RhdGljIGJjbW9zX2Jvb2wgYmNtdHJtdXhfZGV2X2N0cmxfaW50ZXJjZXB0W0JDTVRSX01BWF9PTFRTXVtCQ01PTFRfR1JPVVBfSURfX05VTV9PRl07CisKKyNpZm5kZWYgSU5fQkFORAorCisvKiBOdW1iZXIgb2YgcmVnaXN0ZXJlZCBoaWdoLXByaW9yaXR5IGNoYW5uZWxzICovCitzdGF0aWMgYmNtdHJtdXhfY2hhbm5lbCBudW1fdXJnZW50X2NoYW5uZWxzW0JDTVRSX01BWF9PTFRTXTsKKworLyogUmVjZWl2ZSBzZW1hcGhvcmUgKi8KK3N0YXRpYyBiY21vc19zZW0gYmNtdHJtdXhfcnhfbG9ja1tCQ01UUl9NQVhfT0xUU107CisKKyNlbmRpZgorCisvKiBTdGF0aXN0aWNzICovCitzdGF0aWMgYmNtdHJtdXhfc3RhdCBiY210cm11eF9zdGF0X2FycmF5W0JDTVRSX01BWF9PTFRTXTsKKworLyogUmVjZWl2ZSB0YXNrcyAqLworc3RhdGljIGJjbW9zX3Rhc2sgYmNtdHJtdXhfcnhfdGFza1tCQ01UUl9NQVhfT0xUU107CisKKy8qIFJlZ2lzdHJhdGlvbiBwcm90ZWN0aW9uICovCitzdGF0aWMgYmNtb3NfZmFzdGxvY2sgYmNtdHJtdXhfbG9jazsKKworc3RhdGljIHZvaWQgYmNtdHJtdXhfcnhfYXV0b19wcm94eShiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vc19idWYgKmJ1ZiwgYmNtdHJtdXhfY2hhbm5lbCBjaGFubmVsLCB2b2lkICpkYXRhKTsKK3N0YXRpYyB2b2lkIGJjbXRybXV4X3J4X2xvY2FsKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9zX2J1ZiAqYnVmLCBiY210cm11eF9jaGFubmVsIGNoYW5uZWwsIHZvaWQgKmRhdGEpOworCitzdGF0aWMgYmNtdHJtdXhfbXNnX2ZpbHRlcl9jYl90IGJjbXRybXV4X21zZ19maWx0ZXJfY2I7CisKKy8qIGRpc2NhcmQgcGFja2V0IGZvciB3aGljaCB0aGVyZSBpcyBubyByZWdpc3RyYXRpb24gKi8KK3N0YXRpYyB2b2lkIGJjbXRybXV4X3J4X2Rpc2NhcmQoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb3NfYnVmICpidWYsIGJjbXRybXV4X2NoYW5uZWwgY2hhbm5lbCwgdm9pZCAqZGF0YSkKK3sKKyAgICB1aW50MzJfdCAqY291bnRlciA9ICh1aW50MzJfdCAqKWRhdGE7CisgICAgKysoKmNvdW50ZXIpOworICAgIGJjbW9zX2J1Zl9mcmVlKGJ1Zik7Cit9CisKKy8qIGRpc2NhcmQgdW5wYWNrZWQgbWVzc2FnZSBmb3Igd2hpY2ggdGhlcmUgaXMgbm8gcmVnaXN0cmF0aW9uICovCitzdGF0aWMgdm9pZCBiY210cm11eF9sb2NhbF9yeF9kaXNjYXJkKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9tc2cgKm1zZywgdm9pZCAqZGF0YSkKK3sKKyAgICB1aW50MzJfdCAqY291bnRlciA9ICh1aW50MzJfdCAqKWRhdGE7CisgICAgKysoKmNvdW50ZXIpOworICAgIGJjbW9sdF9tc2dfZnJlZShtc2cpOworfQorCisvKiBGaW5kIGZyZWUgY2hhbm5lbC4gcmV0dXJucyBjaGFubmVsIGlkID49IDAgb3IgQkNNVFJNVVhfTUFYX0NIQU5ORUxTIGlmIG5vIGZyZWUgY2hhbm5lbHMgKi8KK3N0YXRpYyBpbnQgYmNtdHJtdXhfY2hhbm5lbF9nZXRfZnJlZShiY21vbHRfZGV2aWQgZGV2aWNlKQoreworICAgIGludCBpOworICAgIC8qIFN0YXJ0IGZyb20gQkNNVFJNVVhfQ0hBTk5FTF9GSVJTVF9GUkVFLiBDaGFubmVsIDAgaXMgcmVzZXJ2ZWQgZm9yIGluZGljYXRpb25zL3Byb3h5ICwgQ2hhbm5lbCAxIGlzIGZvciBLZWVwIEFsaXZlKi8KKyAgICBmb3IgKGk9QkNNVFJNVVhfQ0hBTk5FTF9GSVJTVF9GUkVFOyBpPEJDTVRSTVVYX0ZJUlNUX1VSR0VOVF9DSEFOTkVMOyBpKyspCisgICAgeworICAgICAgICBpZiAoYmNtdHJtdXhfcnhfaW5mb19hcnJheVtkZXZpY2VdW2ldLnJ4ID09IGJjbXRybXV4X3J4X2Rpc2NhcmQpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGk7Cit9CisKKyNpZm5kZWYgSU5fQkFORAorLyogUENJZSBSZWNlaXZlIGhhbmRsZXIgKi8KK3N0YXRpYyBpbnQgX2JjbXRybXV4X3BjaWVfcnhfaGFuZGxlcihsb25nIGRldmljZSkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBiY21vc19idWYgKmJ1ZjsKKyAgICB1aW50MzJfdCBuYnVmW0JDTVRSX1BDSUVfUFJUWV9fTlVNX09GXSA9IHt9OworICAgIHVpbnQ4X3QgY2g7CisKKyAgICBCVUdfT04oZGV2aWNlID49IEJDTVRSX01BWF9PTFRTKTsKKworICAgIEJDTVRSTVVYX0xPRygicnhfdGFzayglbGQpIC0gc3RhcnRlZFxuIiwgZGV2aWNlKTsKKworICAgIC8qIEVuYWJsZSByeCBpbnRlcnJ1cHQgKi8KKworICAgIHdoaWxlICgxKQorICAgIHsKKyAgICAgICAgYmNtdHJfcGNpZV9yeGludF9lbmFibGUoZGV2aWNlKTsKKyAgICAgICAgYmNtb3Nfc2VtX3dhaXQoJmJjbXRybXV4X3J4X2xvY2tbZGV2aWNlXSwgQkNNVFJNVVhfTUFYX1JYX0RFTEFZKTsKKworICAgICAgICBpZiAoIWJjbXRyX211eF9jb25uZWN0ZWRbZGV2aWNlXSkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLyogV2FpdCBmb3IgcmVjZWl2ZSAqLworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBidWYgPSBOVUxMOworICAgICAgICAgICAgcmMgPSBiY210cl9zd3FfcmVjZWl2ZShkZXZpY2UsIEJDTVRSX1BDSUVfUFJUWV9OT1JNQUwsICZjaCwgJmJ1Zik7CisgICAgICAgICAgICBpZiAocmMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogSWYgRE1BIGlzIG5vdCBzaGFyZWQgd2l0aCB1cmdlbnQgc2VydmljZSwgcG9sbCBSWFEgaGVyZSwKKyAgICAgICAgICAgICAgICAgKiBkb24ndCB3YWl0IGZvciBpbnRlcnJ1cHQKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAocmMgPT0gQkNNX0VSUl9RVUVVRV9FTVBUWSAmJiAhbnVtX3VyZ2VudF9jaGFubmVsc1tkZXZpY2VdKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtdHJfcGNpZV9yeGludF9kaXNhYmxlKGRldmljZSk7CisgICAgICAgICAgICAgICAgICAgIGJjbXRyX3N3cV9yeF9wb2xsKGRldmljZSwgbmJ1Zik7CisgICAgICAgICAgICAgICAgICAgIGJjbXRybXV4X3N0YXRfYXJyYXlbZGV2aWNlXS5yeF9wb2xsX25vcm1hbCArPSBuYnVmW0JDTVRSX1BDSUVfUFJUWV9OT1JNQUxdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBXYWl0IGZvciBpbnRlcnJ1cHQgb3Igc2VtYXBob3JlIHRpbWVvdXQgKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJjbXRybXV4X3J4X2Zyb21fbGluZSgoYmNtb2x0X2RldmlkKWRldmljZSwgKGJjbXRybXV4X2NoYW5uZWwpY2gsIGJ1Zik7CisgICAgICAgIH0gd2hpbGUgKGJjbXRyX211eF9jb25uZWN0ZWRbZGV2aWNlXSk7CisgICAgfQorICAgIEJDTVRSTVVYX0xPRygicnhfdGFzayglbGQpIC0gdGVybWluYXRlZFxuIiwgZGV2aWNlKTsKKyAgICBiY210cl9tdXhfdGVybWluYXRlZFtkZXZpY2VdID0gQkNNT1NfVFJVRTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBiY210cm11eF9yeF9pcnEoYmNtb2x0X2RldmlkIGRldmljZSkKK3sKKyAgICBiY21vc19idWYgKmJ1ZjsKKyAgICB1aW50OF90IGNoOworICAgIHVpbnQzMl90IG5idWZbQkNNVFJfUENJRV9QUlRZX19OVU1fT0ZdID0ge307CisKKyAgICBiY210cl9wY2llX3J4aW50X2Rpc2FibGUoZGV2aWNlKTsKKyAgICBiY210cl9wY2llX3J4aW50X2NsZWFyKGRldmljZSk7CisgICAgYmNtdHJfc3dxX3J4X3BvbGwoZGV2aWNlLCBuYnVmKTsKKworICAgIC8qIEdvdCBzb21lIHBhY2tldHMuIERlbGl2ZXIgaGlnaCBwcmlvcml0eSBmcm9tIGludGVycnVwdCBsZXZlbCAqLworICAgIGlmIChuYnVmW0JDTVRSX1BDSUVfUFJUWV9VUkdFTlRdKQorICAgIHsKKyAgICAgICAgYmNtdHJtdXhfc3RhdF9hcnJheVtkZXZpY2VdLnJ4X3BvbGxfdXJnZW50ICs9IG5idWZbQkNNVFJfUENJRV9QUlRZX1VSR0VOVF07CisgICAgICAgIHdoaWxlIChiY210cl9zd3FfcmVjZWl2ZShkZXZpY2UsIEJDTVRSX1BDSUVfUFJUWV9VUkdFTlQsICZjaCwgJmJ1ZikgPT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgYmNtdHJtdXhfcnhfZnJvbV9saW5lKGRldmljZSwgY2gsIGJ1Zik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDaGVjayBub3JtYWwgcHJpb3JpdHkgKi8KKyAgICBpZiAobmJ1ZltCQ01UUl9QQ0lFX1BSVFlfTk9STUFMXSkKKyAgICB7CisgICAgICAgIGJjbXRybXV4X3N0YXRfYXJyYXlbZGV2aWNlXS5yeF9wb2xsX25vcm1hbCArPSBuYnVmW0JDTVRSX1BDSUVfUFJUWV9OT1JNQUxdOworICAgICAgICBiY21vc19zZW1fcG9zdCgmYmNtdHJtdXhfcnhfbG9ja1tkZXZpY2VdKTsKKyAgICB9CisKKyAgICAvKiBFbmFibGUgcnggaW50ZXJydXB0ICovCisgICAgYmNtdHJfcGNpZV9yeGludF9lbmFibGUoZGV2aWNlKTsKKworICAgIHJldHVybjsKK30KKworLyogVHggY29uZmlybWF0aW9uIGludGVycnVwdCBoYW5kbGVyLgorICogVXNlZCBvbmx5IGlmIHRoZXJlIGFyZSB1cmdlbnQgY2hhbm5lbHMKKyAqLworc3RhdGljIHZvaWQgYmNtdHJtdXhfdHhfaXJxKGJjbW9sdF9kZXZpZCBkZXZpY2UpCit7CisgICAgLyogRGlzYWJsZSBhbmQgY2xlYXIgdHJhbnNtaXQgY29tcGxldGlvbiBpbnRlcnJ1cHRzICovCisgICAgYmNtdHJfcGNpZV90eGludF9kaXNhYmxlKGRldmljZSk7CisgICAgYmNtdHJfcGNpZV90eGludF9jbGVhcihkZXZpY2UpOworICAgIC8qIFN1Ym1pdCBidWZmZXJzIHBlbmRpbmcgaW4gc3cgcXVldWUgdG8gdGhlIGgvdyBxdWV1ZSAqLworICAgIGJjbXRyX3N3cV90eF9zdWJtaXQoZGV2aWNlKTsKKyAgICAvKiBSZS1lbmFibGUgdHggY29tcGxldGlvbiBpbnRlcnJ1cHQgKi8KKyAgICBiY210cl9wY2llX3R4aW50X2VuYWJsZShkZXZpY2UpOworICAgIHJldHVybjsKK30KKworLyogSW5pdCBQQ0lFIHRyYW5zcG9ydCAqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbXRybXV4X3BjaWVfaW5pdChiY21vbHRfZGV2aWQgZGV2aWNlLCB1aW50MzJfdCB0eHFfc2l6ZSwgdWludDMyX3QgcnhxX3NpemUpCit7CisgICAgdWludDMyX3QgcGNpZV9jb29raWVbQkNNT1NfUk9VTkRfVVAoUENJRV9PUEFRVUVfREFUQV9TSVpFLCBzaXplb2YodWludDMyX3QpKS9zaXplb2YodWludDMyX3QpXTsKKyAgICBiY210cl9wY2llX3ByZV9jb25uZWN0X2NmZyBjZmc7CisgICAgYmNtX2xsX2Rldl9pbmZvIGxsX2luZm87CisgICAgaW50IG5pdGVyID0gMDsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb3NfYm9vbCBzdGF0dXM7CisKKyNpZm5kZWYgU0lNVUxBVElPTl9CVUlMRAorICAgIGVyciA9IGJjbV9sbF9wY2llX3F1ZXJ5KGRldmljZSwgJmxsX2luZm8pOworICAgIGlmIChlcnIpCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oZXJyLCAiYmNtX2xsX3BjaWVfcXVlcnkoKSBmYWlsZWRcbiIpOworICAgIH0KKyNlbmRpZgorCisgICAgQkNNVFJNVVhfTE9HKCJXYWl0aW5nIGZvciBCQ002ODYyMCBhcHBsaWNhdGlvblxuIik7CisgICAgYmNtX2ZsZF9zZXRfcmluZ3Nfc2l6ZShkZXZpY2UsIHR4cV9zaXplLCByeHFfc2l6ZSk7CisgICAgc3RhdHVzID0gYmNtX2ZsZF90ZXN0X2RldmljZV9ib290cmVjb3JkX2ZsYWcoZGV2aWNlKTsKKworICAgIC8qIFdhaXQgZm9yIGVtYmVkZGVkIGhhbmRzaGFrZS4gQkNNVFJfUENJRV9TVEFSVF9USU1FT1VUIGlzIGluIG1zICovCisgICAgZm9yIChuaXRlciA9IDA7CisgICAgICAgICBuaXRlciA8IEJDTVRSX1BDSUVfU1RBUlRfVElNRU9VVCAvIDEwICYmICEoc3RhdHVzID0gYmNtX2ZsZF90ZXN0X2RldmljZV9ib290cmVjb3JkX2ZsYWcoZGV2aWNlKSk7CisgICAgICAgICBuaXRlcisrKQorICAgIHsKKyAgICAgICAgYmNtb3NfdXNsZWVwKDEwMDAwKTsKKyAgICB9CisgICAgaWYgKCFzdGF0dXMpCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9JTywgIkJDTTY4NjIwIGFwcGxpY2F0aW9uIHRpbWVvdXRcbiIpOworICAgIH0KKworICAgIGVyciA9IGJjbV9mbGRfZ2V0X2RldmljZV9ib290cmVjb3JkKGRldmljZSwgcGNpZV9jb29raWUpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihlcnIsICJiY21fZmxkX2dldF9kZXZpY2VfYm9vdHJlY29yZCgpIGZhaWxlZFxuIik7CisgICAgfQorCisgICAgLyogc2V0IGhvc3QgcHJtIGJpdCAtIGluZGljYXRlIGhvc3QgcmVhZHkgdG8gc2VuZC9yZWNlaXZlIERNQSAqLworICAgIGJjbV9mbGRfY2xlYXJfZGV2aWNlX2Jvb3RyZWNvcmRfZmxhZyhkZXZpY2UpOworCisgICAgY2ZnLnR4cV9zaXplID0gdHhxX3NpemU7ICAgICAgICAgICAgIC8qIFRyYW5zbWl0IHF1ZXVlIHNpemUgKi8KKyAgICBjZmcucnhxX3NpemUgPSByeHFfc2l6ZTsgICAgICAgICAgICAgLyogUmVjZWl2ZSBxdWV1ZSBzaXplICovCisgICAgY2ZnLm1heF9tdHUgPSBCQ01UUl9NQVhfTVRVX1NJWkU7ICAgIC8qIE1heCBNVFUgc2l6ZSAqLworICAgIGNmZy5wY2llX3JlZ19iYXNlID0gbGxfaW5mby5zb2NfcmVnc19iYXNlOworICAgIGNmZy5kZHJfd2luX2Jhc2UgPSBsbF9pbmZvLnNvY19kZHJfYmFzZTsKKyAgICBjZmcucnhfaXJxID0gbGxfaW5mby5pcnE7CisKKyAgICBlcnIgPSBiY210cl9wY2llX3ByZV9jb25uZWN0KGRldmljZSwgJmNmZywgKGJjbXRyX3BjaWVfb3BhcXVlX2RhdGEgKilwY2llX2Nvb2tpZSk7CisgICAgaWYgKGVycikKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihlcnIsICJiY210cl9wY2llX3ByZV9jb25uZWN0KCkgZmFpbGVkXG4iKTsKKyAgICB9CisKKyAgICBlcnIgPSBiY210cl9wY2llX2Nvbm5lY3QoZGV2aWNlLChiY210cl9wY2llX29wYXF1ZV9kYXRhICopcGNpZV9jb29raWUpOworICAgIGlmIChlcnIpCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oZXJyLCAiYmNtdHJfcGNpZV9jb25uZWN0KCkgZmFpbGVkXG4iKTsKKyAgICB9CisKKyAgICBiY21fZmxkX3NldF9ob3N0X2Jvb3RyZWNvcmRfZmxhZyhkZXZpY2UpOworCisgICAgLyogV2FpdCBmb3IgZW1iZWRkZWQgaGFuZHNoYWtlLiBCQ01UUl9QQ0lFX0NPTk5FQ1RfVElNRU9VVCBpcyBpbiBtcyAqLworICAgIGZvciAobml0ZXIgPSAwOworICAgICAgICAgbml0ZXIgPCBCQ01UUl9QQ0lFX0NPTk5FQ1RfVElNRU9VVCAvIDEwICYmIChzdGF0dXMgPSBiY21fZmxkX3Rlc3RfaG9zdF9ib290cmVjb3JkX2ZsYWcoZGV2aWNlKSk7CisgICAgICAgICBuaXRlcisrKQorICAgIHsKKyAgICAgICAgYmNtb3NfdXNsZWVwKDEwMDAwKTsKKyAgICB9CisgICAgaWYgKHN0YXR1cykKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX0lPLCAiQkNNNjg2MjAgY29ubmVjdCB0aW1lb3V0XG4iKTsKKyAgICB9CisKKyAgICBCQ01UUk1VWF9MT0coIlBDSSB0cmFuc3BvcnQ6IGluaXRpYWxpemVkXG4iKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisjZWxzZSAvKiAjaWZuZGVmIElOX0JBTkQgKi8KKworLyogSU4tQkFORCByZWNlaXZlIGhhbmRsZXIgKi8KK3N0YXRpYyBpbnQgX2JjbXRybXV4X2liX3J4X2hhbmRsZXIobG9uZyBkZXZpY2UpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgYmNtb3NfYnVmICpidWY7CisgICAgdWludDhfdCBjaDsKKworICAgIEJVR19PTihkZXZpY2UgPj0gQkNNVFJfTUFYX09MVFMpOworCisgICAgQkNNVFJNVVhfTE9HKCJyeF90YXNrKCVsZCkgLSBzdGFydGVkXG4iLCBkZXZpY2UpOworCisgICAgd2hpbGUgKGJjbXRyX211eF9jb25uZWN0ZWRbZGV2aWNlXSkKKyAgICB7CisgICAgICAgIC8qIFdhaXQgZm9yIHJlY2VpdmUgKi8KKyAgICAgICAgYnVmID0gTlVMTDsKKyAgICAgICAgcmMgPSBiY210cl9pYl9yZWNlaXZlKGRldmljZSwgJmNoLCAmYnVmKTsKKyAgICAgICAgaWYgKHJjID09IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbXRybXV4X3J4X2Zyb21fbGluZSgoYmNtb2x0X2RldmlkKWRldmljZSwgKGJjbXRybXV4X2NoYW5uZWwpY2gsIGJ1Zik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBCQ01UUk1VWF9MT0coInJ4X3Rhc2soJWxkKSAtIHRlcm1pbmF0ZWRcbiIsIGRldmljZSk7CisgICAgYmNtdHJfbXV4X3Rlcm1pbmF0ZWRbZGV2aWNlXSA9IEJDTU9TX1RSVUU7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbXRybXV4X2liX2Nvbm5lY3QoYmNtb2x0X2RldmlkIGRldmljZSwgIGJjbW9zX2lwdjRfYWRkcmVzcyBpcF9hZGRyZXNzLCB1aW50MTZfdCB1ZHBfcG9ydCkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIHJjID0gYmNtdHJfaWJfY29ubmVjdCgodWludDhfdClkZXZpY2UsIGlwX2FkZHJlc3MsIHVkcF9wb3J0KTsKKyAgICBpZiAocmMpCisgICAgeworICAgICAgICBCQ01UUk1VWF9MT0coIiVzOiBGYWlsZWQgdG8gY29ubmVjdC4gRXJyb3IgJWRcbiIsIF9fRlVOQ1RJT05fXywgcmMpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworI2VuZGlmIC8qICNpZm5kZWYgSU5fQkFORCAqLworCisKKy8qKiBJbml0aWFsaXplIG11eCBzZXJ2aWNlCisgKiBccmV0dXJuczogMCBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSA8IDAKKyAqLworYmNtb3NfZXJybm8gYmNtdHJtdXhfaW5pdChiY210cm11eF9tc2dfZmlsdGVyX2NiX3QgbXNnX2ZpbHRlcl9jYikKK3sKKyAgICBzdGF0aWMgYmNtb3NfYm9vbCBpbml0aWFsaXplZCA9IEJDTU9TX0ZBTFNFOworICAgIGludCBpLCBqOworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgYmNtdHJtdXhfbXNnX2ZpbHRlcl9jYiA9IG1zZ19maWx0ZXJfY2I7CisKKyAgICBCQ01UUk1VWF9MT0coIkluaXRpYWxpc2luZyB0cmFuc3BvcnQgTVVYIHN1YnN5c3RlbVxuIik7CisgICAgaWYgKGluaXRpYWxpemVkKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfQUxSRUFEWTsKKyAgICB9CisKKyAgICBmb3IgKGk9MDsgaTxCQ01UUl9NQVhfT0xUUzsgaSsrKQorICAgIHsKKyAgICAgICAgZm9yIChqPTA7IGo8QkNNVFJNVVhfTUFYX0NIQU5ORUxTOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbXRybXV4X3J4X2luZm9fYXJyYXlbaV1bal0ucnggPSBiY210cm11eF9yeF9kaXNjYXJkOworICAgICAgICAgICAgYmNtdHJtdXhfcnhfaW5mb19hcnJheVtpXVtqXS5kYXRhID0gJmJjbXRybXV4X3N0YXRfYXJyYXlbaV0ucnhfZGlzY19yZW1vdGU7CisgICAgICAgIH0KKyAgICAgICAgYmNtdHJtdXhfcnhfaW5mb19hcnJheVtpXVtCQ01UUk1VWF9DSEFOTkVMX0FVVE9fUFJPWFldLnJ4ID0gYmNtdHJtdXhfcnhfYXV0b19wcm94eTsKKyAgICAgICAgYmNtdHJtdXhfcnhfaW5mb19hcnJheVtpXVtCQ01UUk1VWF9DSEFOTkVMX0FVVE9fUFJPWFldLmRhdGEgPSBOVUxMOworICAgICAgICBiY210cm11eF9yeF9pbmZvX2FycmF5W2ldW0JDTVRSTVVYX0NIQU5ORUxfREVWX0NPTlRST0xdLnJ4ID0gYmNtdHJtdXhfcnhfbG9jYWw7CisgICAgICAgIGJjbXRybXV4X3J4X2luZm9fYXJyYXlbaV1bQkNNVFJNVVhfQ0hBTk5FTF9ERVZfQ09OVFJPTF0uZGF0YSA9IE5VTEw7CisgICAgICAgIGZvciAoaj0wOyBqPEJDTVRSX01BWF9JTlNUQU5DRVM7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X29ial9pZCBrOworICAgICAgICAgICAgZm9yIChrPTA7IGs8QkNNT0xUX09CSl9JRF9fTlVNX09GOyBrKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtdHJtdXhfYXV0b19jaGFubmVsc1tpXVtqXVtrXSA9IEJDTVRSTVVYX01BWF9DSEFOTkVMUzsKKyAgICAgICAgICAgICAgICBiY210cm11eF9wcm94eV9jaGFubmVsc1tpXVtqXVtrXSA9IEJDTVRSTVVYX01BWF9DSEFOTkVMUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBiY210cm11eF9sb2NhbF9yeF9pbmZvX2FycmF5W2ldLnJ4ID0gYmNtdHJtdXhfbG9jYWxfcnhfZGlzY2FyZDsKKyAgICAgICAgYmNtdHJtdXhfbG9jYWxfcnhfaW5mb19hcnJheVtpXS5kYXRhID0gJmJjbXRybXV4X3N0YXRfYXJyYXlbaV0udHhfZGlzY19sb2NhbDsKKyAgICB9CisKKyAgICBiY21vc19mYXN0bG9ja19pbml0KCZiY210cm11eF9sb2NrLCAwKTsKKworICAgIC8qRG9uJ3QgaW5pdGlhbGl6ZSBhdCB0aGlzIHRpbWUgZm9yIFVzZXIgU3BhY2UgZGV2IGN0cmwsCisgICAgICBkb24ndCBoYXZlIGVub3VnaCBpbmZvcm1hdGlvbiovCisjaWZuZGVmIElOX0JBTkQKKyAgICByYyA9IGJjbXRyX3BjaWVfaW5pdChCQ01UUl9NQVhfT0xUUyk7CisgICAgaWYgKHJjKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKHJjLCAiYmNtdHJfcGNpZV9pbml0KCkgZmFpbGVkXG4iKTsKKyAgICB9CisKKyAgICByYyA9IGJjbXRyX3N3cV9pbml0KCk7CisgICAgaWYgKHJjKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKHJjLCAiYmNtdHJfc3dxX2luaXQoKSBmYWlsZWRcbiIpOworICAgIH0KKworICAgIC8qIFJlZ2lzdGVyIHJ4IGNhbGxiYWNrIGluIFBDSWUgZHJpdmVyICovCisgICAgYmNtdHJfcGNpZV9yeF9pcnFfY2Jsa19yZWdpc3RlcihiY210cm11eF9yeF9pcnEpOworICAgIGJjbXRyX3BjaWVfdHhfaXJxX2NibGtfcmVnaXN0ZXIoYmNtdHJtdXhfdHhfaXJxKTsKKyNlbHNlCisKKyAgICByYyA9IGJjbXRyX2liX2luaXQoKTsKKyAgICBpZiAocmMpCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4ocmMsICJiY210cl9pYl9pbml0KCkgZmFpbGVkXG4iKTsKKyAgICB9CisKKyNlbmRpZiAvKiAjaWZuZGVmIElOX0JBTkQgKi8KKworICAgIEJDTVRSTVVYX0xPRygiVHJhbnNwb3J0IE1VWCBpbml0IGRvbmVcbiIpOworCisgICAgcmV0dXJuIHJjOworfQorCisvKiogTm90aWZ5IG11eCBkcml2ZXIgdGhhdCBsb3ctbGV2ZWwgdHJhbnNwb3J0IGNvbm5lY3Rpb24gaXMgcmVhZHkKKyAqIFxyZXR1cm5zOiAwIGluIGNhc2Ugb2Ygc3VjY2VzcyBvciBlcnJvciBjb2RlIDwgMAorICovCisjaWZkZWYgSU5fQkFORAorYmNtb3NfZXJybm8gYmNtdHJtdXhfY29ubmVjdChiY21vbHRfZGV2aWQgZGV2aWNlLCAgYmNtb3NfaXB2NF9hZGRyZXNzIGlwX2FkZHJlc3MsIHVpbnQxNl90IHVkcF9wb3J0KQorI2Vsc2UKK2JjbW9zX2Vycm5vIGJjbXRybXV4X2Nvbm5lY3QoYmNtb2x0X2RldmlkIGRldmljZSwgdWludDMyX3QgdHhxX3NpemUsIHVpbnQzMl90IHJ4cV9zaXplKQorI2VuZGlmCit7CisgICAgc3RhdGljIGNoYXIgdGFza19uYW1lW0JDTVRSX01BWF9PTFRTXVsxNl07CisgICAgYmNtb3NfdGFza19wYXJtIHRhc2twID0ge307CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICBpZiAoYmNtdHJfbXV4X2Nvbm5lY3RlZFtkZXZpY2VdKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfQUxSRUFEWTsKKyAgICB9CisKKyAgICBzbnByaW50Zih0YXNrX25hbWVbZGV2aWNlXSwgc2l6ZW9mKHRhc2tfbmFtZVtkZXZpY2VdKSwgImJjbXRyX3J4JWQiLCBkZXZpY2UpOworICAgIHRhc2twLmRhdGEgPSAobG9uZylkZXZpY2U7CisgICAgdGFza3AubmFtZSA9IHRhc2tfbmFtZVtkZXZpY2VdOworCisjaWZkZWYgSU5fQkFORAorICAgIHJjID0gYmNtdHJtdXhfaWJfY29ubmVjdChkZXZpY2UsIGlwX2FkZHJlc3MsIHVkcF9wb3J0KTsKKyAgICBpZiAocmMpCisgICAgeworICAgICAgICBCQ01UUk1VWF9MT0coIiVzOiBGYWlsZWQgdG8gaW5pdCBpbmJhbmQgZGV2aWNlLiBFcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCByYyk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisgICAgdGFza3AuaGFuZGxlciA9IF9iY210cm11eF9pYl9yeF9oYW5kbGVyOworI2Vsc2UKKyAgICByYyA9IGJjbW9zX3NlbV9jcmVhdGUoJmJjbXRybXV4X3J4X2xvY2tbZGV2aWNlXSwgMCwgMCwgTlVMTCk7CisgICAgaWYgKHJjKQorICAgIHsKKyAgICAgICAgQkNNVFJNVVhfTE9HKCIlczogRmFpbGVkIHRvIGNyZWF0ZSByeCBsb2NrLiBFcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCByYyk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICAvKiBJbml0aWFsaXplIGxvdy1sZXZlbCBQQ0llIHRyYW5zcG9ydCAqLworICAgIHJjID0gYmNtdHJtdXhfcGNpZV9pbml0KGRldmljZSwgdHhxX3NpemUsIHJ4cV9zaXplKTsKKyAgICBpZiAocmMpCisgICAgeworICAgICAgICBiY21vc19zZW1fZGVzdHJveSgmYmNtdHJtdXhfcnhfbG9ja1tkZXZpY2VdKTsKKyAgICAgICAgQkNNVFJNVVhfTE9HKCIlczogRmFpbGVkIHRvIGluaXQgbG93LWxldmVsIFBDSWUgdHJhbnNwb3J0LiBFcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCByYyk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisgICAgdGFza3AuaGFuZGxlciA9IF9iY210cm11eF9wY2llX3J4X2hhbmRsZXI7CisKKyAgICByYyA9IGJjbXRyX3N3cV9kZXZpY2VfaW5pdChkZXZpY2UpOworICAgIGlmIChyYykKKyAgICB7CisgICAgICAgIGJjbW9zX3NlbV9kZXN0cm95KCZiY210cm11eF9yeF9sb2NrW2RldmljZV0pOworICAgICAgICBCQ01UUk1VWF9MT0coIiVzOiBGYWlsZWQgdG8gaW5pdCBwY2llX3N3cS4gRXJyb3IgJWRcbiIsIF9fRlVOQ1RJT05fXywgcmMpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisjZW5kaWYKKyAgICBiY210cl9tdXhfY29ubmVjdGVkW2RldmljZV0gPSBCQ01PU19UUlVFOworICAgIGJjbXRyX211eF90ZXJtaW5hdGVkW2RldmljZV0gPSBCQ01PU19GQUxTRTsKKworICAgIHJjID0gYmNtb3NfdGFza19jcmVhdGUoJmJjbXRybXV4X3J4X3Rhc2tbZGV2aWNlXSwgJnRhc2twKTsKKyAgICBpZiAocmMpCisgICAgeworI2lmbmRlZiBJTl9CQU5ECisgICAgICAgIGJjbW9zX3NlbV9kZXN0cm95KCZiY210cm11eF9yeF9sb2NrW2RldmljZV0pOworI2VuZGlmCisgICAgICAgIGJjbXRyX211eF9jb25uZWN0ZWRbZGV2aWNlXSA9IEJDTU9TX0ZBTFNFOworICAgICAgICBCQ01UUk1VWF9MT0coIiVzOiBGYWlsZWQgdG8gY3JlYXRlIHJ4IHRhc2suIEVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJjKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiogTm90aWZ5IG11eCBkcml2ZXIgdGhhdCBsb3ctbGV2ZWwgdHJhbnNwb3J0IGNvbm5lY3Rpb24gaXMgZGlzY29ubmVjdGVkCisgKiBccmV0dXJuczogMCBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSA8IDAKKyAqLworYmNtb3NfZXJybm8gYmNtdHJtdXhfZGlzY29ubmVjdChiY21vbHRfZGV2aWQgZGV2aWNlKQoreworICAgIGlmICghYmNtdHJfbXV4X2Nvbm5lY3RlZFtkZXZpY2VdKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfQUxSRUFEWTsKKyAgICB9CisgICAgYmNtdHJfbXV4X2Nvbm5lY3RlZFtkZXZpY2VdID0gQkNNT1NfRkFMU0U7CisjaWZkZWYgSU5fQkFORAorICAgIGJjbXRyX2liX2Rpc2Nvbm5lY3QoKHVpbnQ4X3QpZGV2aWNlKTsKKyNlbHNlCisgICAgYmNtb3Nfc2VtX3Bvc3QoJmJjbXRybXV4X3J4X2xvY2tbZGV2aWNlXSk7CisjZW5kaWYKKyAgICB3aGlsZSAoIWJjbXRyX211eF90ZXJtaW5hdGVkW2RldmljZV0pCisgICAgeworICAgICAgICBiY21vc191c2xlZXAoMTAwMDApOworICAgIH0KKyAgICBiY21vc190YXNrX2Rlc3Ryb3koJmJjbXRybXV4X3J4X3Rhc2tbZGV2aWNlXSk7CisjaWZuZGVmIElOX0JBTkQKKyAgICBiY21vc19zZW1fZGVzdHJveSgmYmNtdHJtdXhfcnhfbG9ja1tkZXZpY2VdKTsKKyAgICBiY210cl9zd3FfZGV2aWNlX2V4aXQoZGV2aWNlKTsKKyAgICBiY210cl9wY2llX2Rpc2Nvbm5lY3QoKHVpbnQ4X3QpZGV2aWNlKTsKKyNlbmRpZgorICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiogQ2xlYW51cCBhbmQgZXhpdAorICovCit2b2lkIGJjbXRybXV4X2V4aXQodm9pZCkKK3sKKyAgICBpbnQgaTsKKworICAgIEJDTVRSTVVYX0xPRygiQ2xlYW5pbmcgdXAgdHJhbnNwb3J0IE1VWCBzdWJzeXN0ZW1cbiIpOworI2lmbmRlZiBJTl9CQU5ECisgICAgYmNtdHJfc3dxX2V4aXQoKTsKKyAgICBiY210cl9wY2llX3J4X2lycV9jYmxrX3VucmVnaXN0ZXIoKTsKKyAgICBiY210cl9wY2llX3R4X2lycV9jYmxrX3VucmVnaXN0ZXIoKTsKKyNlbmRpZgorICAgIC8qIGtpbGwgcmVjZWl2ZSB0YXNrcyAqLworICAgIGZvciAoaT0wOyBpPEJDTVRSX01BWF9PTFRTOyBpKyspCisgICAgeworICAgICAgICBiY210cm11eF9kaXNjb25uZWN0KChiY21vbHRfZGV2aWQpaSk7CisgICAgfQorI2lmZGVmIElOX0JBTkQKKyAgICBiY210cl9pYl9leGl0KCk7CisjZWxzZQorICAgIGJjbXRyX3BjaWVfZXhpdCgpOworI2VuZGlmCisgICAgQkNNVFJNVVhfTE9HKCJUcmFuc3BvcnQgTVVYIGNsZWFudXAgZG9uZVxuIik7Cit9CisKKy8qKiBSZWdpc3RlciBQQ0llIGNoYW5uZWwgb3duZXIgKi8KK2JjbW9zX2Vycm5vIGJjbXRybXV4X2NoYW5uZWxfcmVnaXN0ZXIoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtdHJtdXhfY2hhbm5lbCAqY2hhbm5lbCwKKyAgICBmX2JjbXRyX3J4X2hhbmRsZXIgcngsIHZvaWQgKmRhdGEpCit7CisgICAgYmNtdHJtdXhfY2hhbm5lbCBjaDsKKyAgICBsb25nIGZsYWdzOworCisgICAgaWYgKCh1bnNpZ25lZClkZXZpY2UgPj0gQkNNVFJfTUFYX09MVFMgfHwgIWNoYW5uZWwgfHwgIXJ4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgY2ggPSAqY2hhbm5lbDsKKworICAgIGZsYWdzID0gYmNtb3NfZmFzdGxvY2tfbG9jaygmYmNtdHJtdXhfbG9jayk7CisKKyAgICBpZiAoY2ggPT0gQkNNVFJNVVhfQ0hBTk5FTF9BVVRPX0FTU0lHTikKKyAgICB7CisgICAgICAgIC8qIEF1dG8tYXNzaWduIGZyZWUgY2hhbm5lbCAqLworICAgICAgICBjaCA9IChiY210cm11eF9jaGFubmVsKWJjbXRybXV4X2NoYW5uZWxfZ2V0X2ZyZWUoZGV2aWNlKTsKKyAgICAgICAgaWYgKGNoID49IEJDTVRSTVVYX01BWF9DSEFOTkVMUykKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZiY210cm11eF9sb2NrLCBmbGFncyk7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT1JFUzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIE1ha2Ugc3VyZSB0aGF0IGNoYW5uZWwgaXMgdmFsaWQgYW5kIG5vdCBidXN5ICovCisgICAgaWYgKCh1bnNpZ25lZCljaCA+PSBCQ01UUk1VWF9NQVhfQ0hBTk5FTFMpCisgICAgeworICAgICAgICBiY21vc19mYXN0bG9ja191bmxvY2soJmJjbXRybXV4X2xvY2ssIGZsYWdzKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgaWYgKGJjbXRybXV4X3J4X2luZm9fYXJyYXlbZGV2aWNlXVtjaF0ucnggIT0gYmNtdHJtdXhfcnhfZGlzY2FyZCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmYmNtdHJtdXhfbG9jaywgZmxhZ3MpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9BTFJFQURZOworICAgIH0KKworICAgIC8qIEFzc2lnbiBjaGFubmVsICovCisgICAgYmNtdHJtdXhfcnhfaW5mb19hcnJheVtkZXZpY2VdW2NoXS5yeCA9IHJ4OworICAgIGJjbXRybXV4X3J4X2luZm9fYXJyYXlbZGV2aWNlXVtjaF0uZGF0YSA9IGRhdGE7CisKKyNpZm5kZWYgSU5fQkFORAorICAgIC8qIFVyZ2VudCBjaGFubmVscyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgSU4tQkFORCBtYW5hZ2VtZW50ICovCisgICAgaWYgKGNoID49IEJDTVRSTVVYX0ZJUlNUX1VSR0VOVF9DSEFOTkVMKQorICAgIHsKKyAgICAgICAgLyogV2UgdXNlIHRyYW5zbWl0IGNvbmZpcm1hdGlvbiBpbnRlcnJ1cHQgdG8ga2ljayB0cmFuc21pc3Npb24KKyAgICAgICAgICogaWYgUENJIGJ1cyBpcyBzaGFyZWQgYmV0d2VlbiBoaWdoIGFuZCBsb3ctcHJpb3JpdHkgY2hhbm5lbHMKKyAgICAgICAgICovCisgICAgICAgIGlmICghbnVtX3VyZ2VudF9jaGFubmVsc1tkZXZpY2VdKQorICAgICAgICAgICAgYmNtdHJfcGNpZV90eGludF9lbmFibGUoZGV2aWNlKTsKKyAgICAgICAgKytudW1fdXJnZW50X2NoYW5uZWxzW2RldmljZV07CisgICAgfQorI2VuZGlmCisKKyAgICBiY21vc19mYXN0bG9ja191bmxvY2soJmJjbXRybXV4X2xvY2ssIGZsYWdzKTsKKworICAgICpjaGFubmVsID0gY2g7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworCisvKiogUmVsZWFzZSBQQ0llIGNoYW5uZWwgYWxsb2NhdGVkIGJ5IGJjbXRybXV4X2NoYW5uZWxfcmVnaXN0ZXIoKQorICoKKyAqIFxwYXJhbVtpbl0gICBkZXZpY2UgIE1hcGxlIGRldmljZSBpbmRleAorICogXHBhcmFtW2luXSAgIGNoYW5uZWwKKyAqIFxyZXR1cm5zOiAwIGluIGNhc2Ugb2Ygc3VjY2VzcyBvciBlcnJvciBjb2RlIDwgMAorICovCitiY21vc19lcnJubyBiY210cm11eF9jaGFubmVsX3VucmVnaXN0ZXIoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtdHJtdXhfY2hhbm5lbCBjaGFubmVsKQoreworICAgIGxvbmcgZmxhZ3M7CisKKyAgICBpZiAoKHVuc2lnbmVkKWRldmljZSA+PSBCQ01UUl9NQVhfT0xUUyB8fCAodW5zaWduZWQpY2hhbm5lbCA+PSBCQ01UUk1VWF9NQVhfQ0hBTk5FTFMpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGZsYWdzID0gYmNtb3NfZmFzdGxvY2tfbG9jaygmYmNtdHJtdXhfbG9jayk7CisKKyAgICBpZiAoYmNtdHJtdXhfcnhfaW5mb19hcnJheVtkZXZpY2VdW2NoYW5uZWxdLnJ4ID09IGJjbXRybXV4X3J4X2Rpc2NhcmQpCisgICAgeworICAgICAgICBiY21vc19mYXN0bG9ja191bmxvY2soJmJjbXRybXV4X2xvY2ssIGZsYWdzKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9FTlQ7CisgICAgfQorCisgICAgYmNtdHJtdXhfcnhfaW5mb19hcnJheVtkZXZpY2VdW2NoYW5uZWxdLnJ4ID0gYmNtdHJtdXhfcnhfZGlzY2FyZDsKKyAgICBiY210cm11eF9yeF9pbmZvX2FycmF5W2RldmljZV1bY2hhbm5lbF0uZGF0YSA9ICZiY210cm11eF9zdGF0X2FycmF5W2RldmljZV0ucnhfZGlzY19yZW1vdGU7CisKKyNpZm5kZWYgSU5fQkFORAorICAgIC8qIFVyZ2VudCBjaGFubmVscyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgSU4tQkFORCBtYW5hZ2VtZW50ICovCisgICAgaWYgKGNoYW5uZWwgPj0gQkNNVFJNVVhfRklSU1RfVVJHRU5UX0NIQU5ORUwpCisgICAgeworICAgICAgICAtLW51bV91cmdlbnRfY2hhbm5lbHNbZGV2aWNlXTsKKyAgICAgICAgLyogSWYgUENJIGJ1cyBpcyBub3Qgc2hhcmVkIGJldHdlZW4gbm9ybWFsIGFuZCB1cmdlbnQgY2hhbm5lbHMsCisgICAgICAgICAqIHRyYW5zbWl0IGNvbmZpcm1hdGlvbiBtZWNoYW5pc20gaXMgbm90IG5lZWRlZAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCFudW1fdXJnZW50X2NoYW5uZWxzW2RldmljZV0pCisgICAgICAgICAgICBiY210cl9wY2llX3R4aW50X2Rpc2FibGUoZGV2aWNlKTsKKyAgICB9CisjZW5kaWYKKworICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmYmNtdHJtdXhfbG9jaywgZmxhZ3MpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qCisgKiBMb2NhbCB0ZXJtaW5hdGlvbiBoYW5kbGVyCisgKi8KKworLyogUmVnaXN0ZXIgbG9jYWwgdGVybWluYXRpb24gaGFuZGxlci4gKi8KK2JjbW9zX2Vycm5vIGJjbXRybXV4X2xvY2FsX2hhbmRsZXJfcmVnaXN0ZXIoYmNtb2x0X2RldmlkIGRldmljZSwgZl9iY210cl9sb2NhbF9yeF9oYW5kbGVyIHJ4LCB2b2lkICpkYXRhKQoreworICAgIGxvbmcgZmxhZ3M7CisKKyAgICBpZiAoKHVuc2lnbmVkKWRldmljZSA+PSBCQ01UUl9NQVhfT0xUUyB8fCAhcngpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKyAgICBmbGFncyA9IGJjbW9zX2Zhc3Rsb2NrX2xvY2soJmJjbXRybXV4X2xvY2spOworICAgIGlmIChiY210cm11eF9sb2NhbF9yeF9pbmZvX2FycmF5W2RldmljZV0ucnggIT0gYmNtdHJtdXhfbG9jYWxfcnhfZGlzY2FyZCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmYmNtdHJtdXhfbG9jaywgZmxhZ3MpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9BTFJFQURZOworICAgIH0KKyAgICBiY210cm11eF9sb2NhbF9yeF9pbmZvX2FycmF5W2RldmljZV0ucnggPSByeDsKKyAgICBiY210cm11eF9sb2NhbF9yeF9pbmZvX2FycmF5W2RldmljZV0uZGF0YSA9IGRhdGE7CisgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZiY210cm11eF9sb2NrLCBmbGFncyk7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKworLyogVW5yZWdpc3RlciBsb2NhbCB0ZXJtaW5hdGlvbiBoYW5kbGVyIHJlZ2lzdGVyZWQgYnkgYmNtdHJtdXhfbG9jYWxfaGFuZGxlcl9yZWdpc3RlcigpICovCitiY21vc19lcnJubyBiY210cm11eF9sb2NhbF9oYW5kbGVyX3VucmVnaXN0ZXIoYmNtb2x0X2RldmlkIGRldmljZSkKK3sKKyAgICBsb25nIGZsYWdzOworCisgICAgaWYgKCh1bnNpZ25lZClkZXZpY2UgPj0gQkNNVFJfTUFYX09MVFMpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKyAgICBmbGFncyA9IGJjbW9zX2Zhc3Rsb2NrX2xvY2soJmJjbXRybXV4X2xvY2spOworICAgIGlmIChiY210cm11eF9sb2NhbF9yeF9pbmZvX2FycmF5W2RldmljZV0ucnggPT0gYmNtdHJtdXhfbG9jYWxfcnhfZGlzY2FyZCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmYmNtdHJtdXhfbG9jaywgZmxhZ3MpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT0VOVDsKKyAgICB9CisgICAgYmNtdHJtdXhfbG9jYWxfcnhfaW5mb19hcnJheVtkZXZpY2VdLmRhdGEgPSAmYmNtdHJtdXhfc3RhdF9hcnJheVtkZXZpY2VdLnR4X2Rpc2NfbG9jYWw7CisgICAgYmNtdHJtdXhfbG9jYWxfcnhfaW5mb19hcnJheVtkZXZpY2VdLnJ4ID0gYmNtdHJtdXhfbG9jYWxfcnhfZGlzY2FyZDsKKyAgICBiY21vc19mYXN0bG9ja191bmxvY2soJmJjbXRybXV4X2xvY2ssIGZsYWdzKTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogRGVsaXZlciBtZXNzYWdlIHRvIGxvY2FsIGRlc3RpbmF0aW9uICovCitzdGF0aWMgYmNtb3NfYm9vbCBiY210cm11eF9kZWxpdmVyX3RvX2xvY2FsKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbXRybXV4X2NoYW5uZWwgY2hhbm5lbCwgYmNtb3NfYnVmICpidWYsIGJjbXRyX2hkciAqaGRyKQoreworICAgIGJjbXRybXV4X2xvY2FsX3J4X2luZm8gKnJ4X2luZm87CisgICAgYmNtb2x0X21zZyAqbXNnID0gTlVMTDsKKyAgICBiY21vbHRfYnVmIHVidWY7CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgLyogVW5wYWNrICovCisgICAgYmNtb2x0X2J1Zl9pbml0KCZ1YnVmLCBiY21vc19idWZfbGVuZ3RoKGJ1ZiksIGJjbW9zX2J1Zl9kYXRhKGJ1ZiksIEJDTVRSX0JVRl9FTkRJQU4pOworICAgIGJjbW9sdF9idWZfc2tpcCgmdWJ1ZiwgQkNNVFJfSERSX1NJWkUpOworICAgIGVyciA9IGJjbW9sdF9tc2dfdW5wYWNrKCZ1YnVmLCAmbXNnKTsKKyAgICBiY21vc19idWZfZnJlZShidWYpOworICAgIGlmIChlcnIgPCAwKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJNZXNzYWdlIHVucGFjayBlcnJvciAlcyAoJWQpXG4iLCBiY21vc19zdHJlcnJvcihlcnIpLCBlcnIpOworICAgICAgICArK2JjbXRybXV4X3N0YXRfYXJyYXlbZGV2aWNlXS50eF9kaXNjX2xvY2FsOworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisgICAgbXNnLT5jb3JyX3RhZyA9IGhkci0+Y29ycl90YWc7CisgICAgbXNnLT5zdWJjaCA9IChiY21vbHRfc3ViY2hhbm5lbCljaGFubmVsOworICAgICsrYmNtdHJtdXhfc3RhdF9hcnJheVtkZXZpY2VdLnR4X2xvY2FsOworCisgICAgcnhfaW5mbyA9ICZiY210cm11eF9sb2NhbF9yeF9pbmZvX2FycmF5W2RldmljZV07CisgICAgcnhfaW5mby0+cngoZGV2aWNlLCBtc2csIHJ4X2luZm8tPmRhdGEpOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKiBzZW5kIHRvIGxpbmUgd2l0aCByZXBldGl0aXZlIGF0dGVtcHRzIGlmIHBjaWUgYnVmZmVyIGlzIGZ1bGwgKi8KK3N0YXRpYyB2b2lkIGJjbXRybXV4X3NlbmRfdG9fbGluZShiY21vbHRfZGV2aWQgZGV2aWNlLCBiY210cm11eF9jaGFubmVsIGNoYW5uZWwsIGJjbW9zX2J1ZiAqYnVmKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworCisjaWZkZWYgSU5fQkFORAorICAgIHJjID0gYmNtdHJfaWJfc2VuZCgodWludDhfdClkZXZpY2UsICh1aW50OF90KWNoYW5uZWwsIGJ1Zik7CisjZWxzZQorICAgIHJjID0gYmNtdHJfc3dxX3NlbmQoKHVpbnQ4X3QpZGV2aWNlLCBjaGFubmVsLCBidWYpOworI2VuZGlmCisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBGYWlsZWQgKi8KKyAgICAgICAgKytiY210cm11eF9zdGF0X2FycmF5W2RldmljZV0udHhfZGlzY19yZW1vdGU7CisgICAgICAgIGJjbW9zX2J1Zl9mcmVlKGJ1Zik7CisgICAgfQorfQorCisvKiBSZWNlaXZlIG1lc3NhZ2UgZnJvbSBob3N0IGFwcGxpY2F0aW9uICovCit2b2lkIGJjbXRybXV4X3J4X2Zyb21faG9zdChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY210cm11eF9jaGFubmVsIGNoYW5uZWwsIGJjbW9zX2J1ZiAqYnVmKQoreworICAgIGJjbXRyX2hkciBoZHI7CisgICAgYmNtb2x0X29ial9pZCBvYmo7CisgICAgYmNtb2x0X21ndF9ncm91cCBncm91cDsKKyAgICB1aW50MTZfdCBzdWJncm91cDsKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIC8qIFZhbGlkYXRlIHBhcmFtZXRlcnMgKi8KKyAgICBCVUdfT04oKHVuc2lnbmVkKWRldmljZSA+PSBCQ01UUl9NQVhfT0xUUyk7CisgICAgQlVHX09OKCh1bnNpZ25lZCljaGFubmVsID49IEJDTVRSTVVYX01BWF9DSEFOTkVMUyk7CisKKyAgICAvKiBQZWVrIGluIHRyYW5zcG9ydCBoZWFkZXIuIEl0IGNvbnRhaW5zIGVub3VnaCBpbmZvIHRvIGRlY2lkZSB3aGF0IHRvIGRvIHdpdGggdGhlIG1lc3NhZ2UgKi8KKyAgICBiY210cl9oZWFkZXJfdW5wYWNrKGJjbW9zX2J1Zl9kYXRhKGJ1ZiksICZoZHIpOworCisgICAgcmMgPSBiY21vbHRfZ3JvdXBfaWRfc3BsaXQoaGRyLm1zZ19pZCwgJm9iaiwgJmdyb3VwLCAmc3ViZ3JvdXApOworICAgIGlmIChyYykKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiQ2FuJ3QgZGVjb2RlIGdyb3VwX2lkICV1LiBFcnJvciAlcyAoJWQpXG4iLCBoZHIubXNnX2lkLCBiY21vc19zdHJlcnJvcihyYyksIHJjKTsKKyAgICAgICAgKytiY210cm11eF9zdGF0X2FycmF5W2RldmljZV0udHhfZGlzY19yZW1vdGU7CisgICAgICAgIGJjbW9zX2J1Zl9mcmVlKGJ1Zik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBGaWx0ZXIgYXV0by9wcm94eSAodW4pcmVnaXN0cmF0aW9uLgorICAgICAqIFRoaXMgbWVzc2FnZSBpcyB0ZXJtaW5hdGVkIGhlcmUuCisgICAgICovCisgICAgaWYgKGhkci5hdXRvX3Byb3h5X3JlZyB8fCBoZHIuYXV0b19wcm94eV91bnJlZykKKyAgICB7CisgICAgICAgIGJjbXRybXV4X2NoYW5uZWwgKnBfY2ggPSAoZ3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9BVVRPKSA/CisgICAgICAgICAgICAmYmNtdHJtdXhfYXV0b19jaGFubmVsc1tkZXZpY2VdW2hkci5pbnN0YW5jZV1bb2JqXSA6ICZiY210cm11eF9wcm94eV9jaGFubmVsc1tkZXZpY2VdW2hkci5pbnN0YW5jZV1bb2JqXTsKKworICAgICAgICBiY21vc19idWZfZnJlZShidWYpOworCisgICAgICAgIC8qIFNhbml0eSBjaGVjayAqLworICAgICAgICBpZiAoaGRyLmluc3RhbmNlID49IEJDTVRSX01BWF9JTlNUQU5DRVMgfHwgb2JqID49IEJDTU9MVF9PQkpfSURfX05VTV9PRikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJJbnN0YW5jZSAldSBvciBvYmplY3QgJWQgaXMgaW5zYW5lXG4iLCBoZHIuaW5zdGFuY2UsIG9iaik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvKiBEbyBub3Qgb3ZlcnJpZGUgYmNtb2x0X2Rldl9jdHJsIGZpbHRlcnMgKi8KKyAgICAgICAgaWYgKCpwX2NoICE9IEJDTVRSTVVYX0NIQU5ORUxfREVWX0NPTlRST0wpCisgICAgICAgIHsKKyAgICAgICAgICAgICpwX2NoID0gaGRyLmF1dG9fcHJveHlfcmVnID8gY2hhbm5lbCA6IEJDTVRSTVVYX01BWF9DSEFOTkVMUzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBGaWx0ZXIgbWVzc2FnZSB0aGF0IHNob3VsZCBnbyB0byBsb2NhbCBkZXN0aW5hdGlvbiAoZGV2aWNlIGNvbnRyb2wpICovCisgICAgaWYgKGJjbXRybXV4X21zZ19maWx0ZXJfY2IgJiYgYmNtdHJtdXhfbXNnX2ZpbHRlcl9jYihkZXZpY2UsIG9iaiwgZ3JvdXAsIHN1Ymdyb3VwKSA9PSBCQ01UUk1VWF9ERVNUX0xPQ0FMKQorICAgIHsKKyAgICAgICAgaWYgKGJjbXRybXV4X2RlbGl2ZXJfdG9fbG9jYWwoZGV2aWNlLCBjaGFubmVsLCBidWYsICZoZHIpID09IEJDTU9TX1RSVUUpCisgICAgICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogSGFuZGxlIFJlbW90ZSBtZXNzYWdlICovCisgICAgKytiY210cm11eF9zdGF0X2FycmF5W2RldmljZV0udHhfcmVtb3RlOworICAgIGJjbXRybXV4X3NlbmRfdG9fbGluZShkZXZpY2UsIGNoYW5uZWwsIGJ1Zik7Cit9CisKKworLyogUmVjZWl2ZSBwYWNrZXQgZnJvbSB0aGUgbGluZSBvciBsb2NhbCBjb250cm9sIHByb2Nlc3MuCisgKiBQYXJhbWV0ZXJzIGFyZSBleHBlY3RlZCB0byBiZSBjaGVja2VkIGJlZm9yZWhhbmQuCisgKiBUaGUgZnVuY3Rpb24gZGUtbXV4ZXMKKyAqIC0gcmVwbGllcyBiYXNlZCBvbiBjaGFubmVsCisgKiAtIGF1dG9ub21vdXMvcHJveHkgbWVzc2FnZXMgYmFzZWQgb24gcmVnaXN0cmF0aW9uIGluZm8KKyAqLworc3RhdGljIHZvaWQgYmNtdHJtdXhfcngoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtdHJtdXhfY2hhbm5lbCBjaGFubmVsLCBiY21vc19idWYgKmJ1ZikKK3sKKyAgICBiY210cm11eF9yeF9pbmZvICpyeF9pbmZvOworICAgIHJ4X2luZm8gPSAmYmNtdHJtdXhfcnhfaW5mb19hcnJheVtkZXZpY2VdW2NoYW5uZWxdOworICAgIHJ4X2luZm8tPnJ4KGRldmljZSwgYnVmLCBjaGFubmVsLCByeF9pbmZvLT5kYXRhKTsKK30KKworCisvKiBSZWNlaXZlIHBhY2tldCBmcm9tIFBDSWUgaW50ZXJmYWNlICovCit2b2lkIGJjbXRybXV4X3J4X2Zyb21fbGluZShiY21vbHRfZGV2aWQgZGV2aWNlLCBiY210cm11eF9jaGFubmVsIGNoYW5uZWwsIGJjbW9zX2J1ZiAqYnVmKQoreworICAgIEJVR19PTigodW5zaWduZWQpZGV2aWNlID49IEJDTVRSX01BWF9PTFRTKTsKKworICAgIGlmICgodW5zaWduZWQpY2hhbm5lbCA+PSBCQ01UUk1VWF9NQVhfQ0hBTk5FTFMpCisgICAgeworICAgICAgICArK2JjbXRybXV4X3N0YXRfYXJyYXlbZGV2aWNlXS5yeF9kaXNjX2ludl9jaDsKKyAgICAgICAgYmNtb3NfYnVmX2ZyZWUoYnVmKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgICsrYmNtdHJtdXhfc3RhdF9hcnJheVtkZXZpY2VdLnJ4X3JlbW90ZTsKKworICAgIGJjbXRybXV4X3J4KGRldmljZSwgY2hhbm5lbCwgYnVmKTsKK30KKworLyogSGFuZGxlIG1lc3NhZ2UgcmVjZWl2ZWQgdmlhIEF1dG8vUHJveHkgY2hhbm5lbCAqLworc3RhdGljIHZvaWQgYmNtdHJtdXhfcnhfYXV0b19wcm94eShiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vc19idWYgKmJ1ZiwgYmNtdHJtdXhfY2hhbm5lbCBjaGFubmVsLCB2b2lkICpkYXRhKQoreworICAgIGJjbXRyX2hkciBoZHI7CisgICAgYmNtb2x0X29ial9pZCBvYmo7CisgICAgYmNtb2x0X21ndF9ncm91cCBncm91cDsKKyAgICB1aW50MTZfdCBzdWJncm91cDsKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIC8qIFBlZWsgaW4gdHJhbnNwb3J0IGhlYWRlci4gSXQgY29udGFpbnMgZW5vdWdoIGluZm8gdG8gZGVjaWRlIHdoYXQgdG8gZG8gd2l0aCB0aGUgbWVzc2FnZSAqLworICAgIGJjbXRyX2hlYWRlcl91bnBhY2soYmNtb3NfYnVmX2RhdGEoYnVmKSwgJmhkcik7CisKKyAgICByYyA9IGJjbW9sdF9ncm91cF9pZF9zcGxpdChoZHIubXNnX2lkLCAmb2JqLCAmZ3JvdXAsICZzdWJncm91cCk7CisgICAgaWYgKHJjKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJDYW4ndCBkZWNvZGUgZ3JvdXBfaWQgJXUuIEVycm9yICVzICglZClcbiIsIGhkci5tc2dfaWQsIGJjbW9zX3N0cmVycm9yKHJjKSwgcmMpOworICAgICAgICArK2JjbXRybXV4X3N0YXRfYXJyYXlbZGV2aWNlXS5yeF9kaXNjX2F1dG87CisgICAgICAgIGJjbW9zX2J1Zl9mcmVlKGJ1Zik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBTYW5pdHkgY2hlY2sgKi8KKyAgICBpZiAoaGRyLmluc3RhbmNlID49IEJDTVRSX01BWF9JTlNUQU5DRVMgfHwgb2JqID49IEJDTU9MVF9PQkpfSURfX05VTV9PRikKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiSW5zdGFuY2UgJXUgb3Igb2JqZWN0ICVkIGlzIGluc2FuZVxuIiwgaGRyLmluc3RhbmNlLCBvYmopOworICAgICAgICArK2JjbXRybXV4X3N0YXRfYXJyYXlbZGV2aWNlXS5yeF9kaXNjX2F1dG87CisgICAgICAgIGJjbW9zX2J1Zl9mcmVlKGJ1Zik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBEaXNwYXRjaCBiYXNlZCBvbiBvYmplY3QgaWQgKi8KKyAgICAvKiBIYW5kbGUgZGV2X2N0cmwgaW50ZXJjZXB0ICovCisgICAgaWYgKGJjbXRybXV4X2Rldl9jdHJsX2ludGVyY2VwdFtkZXZpY2VdW2hkci5tc2dfaWRdKQorICAgIHsKKyAgICAgICAgY2hhbm5lbCA9IEJDTVRSTVVYX0NIQU5ORUxfREVWX0NPTlRST0w7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGNoYW5uZWwgPSAoZ3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9BVVRPKSA/CisgICAgICAgICAgICBiY210cm11eF9hdXRvX2NoYW5uZWxzW2RldmljZV1baGRyLmluc3RhbmNlXVtvYmpdIDogYmNtdHJtdXhfcHJveHlfY2hhbm5lbHNbZGV2aWNlXVtoZHIuaW5zdGFuY2VdW29ial07CisgICAgfQorCisgICAgLyogSWYgbm8gcmVnaXN0cmF0aW9uIC0gZGlzY2FyZCAqLworICAgIGlmIChjaGFubmVsID49IEJDTVRSTVVYX01BWF9DSEFOTkVMUykKKyAgICB7CisgICAgICAgICsrYmNtdHJtdXhfc3RhdF9hcnJheVtkZXZpY2VdLnJ4X2Rpc2NfYXV0bzsKKyAgICAgICAgYmNtb3NfYnVmX2ZyZWUoYnVmKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBiY210cm11eF9yeChkZXZpY2UsIGNoYW5uZWwsIGJ1Zik7Cit9CisKKy8qIEhhbmRsZSBtZXNzYWdlIHJlY2VpdmVkIHZpYSBERVZfQ09OVFJPTCBjaGFubmVsICovCitzdGF0aWMgdm9pZCBiY210cm11eF9yeF9sb2NhbChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vc19idWYgKmJ1ZiwgYmNtdHJtdXhfY2hhbm5lbCBjaGFubmVsLCB2b2lkICpkYXRhKQoreworICAgIGJjbXRybXV4X2xvY2FsX3J4X2luZm8gKnJ4X2luZm87CisgICAgYmNtdHJfaGRyIGhkcjsKKyAgICBiY21vbHRfYnVmIHVidWY7CisgICAgYmNtb2x0X21zZyAqbXNnID0gTlVMTDsKKyAgICBiY21vc19lcnJubyBlcnI7CisKKyAgICBiY210cl9oZWFkZXJfdW5wYWNrKGJjbW9zX2J1Zl9kYXRhKGJ1ZiksICZoZHIpOworCisgICAgYmNtb2x0X2J1Zl9pbml0KCZ1YnVmLCBiY21vc19idWZfbGVuZ3RoKGJ1ZiksIGJjbW9zX2J1Zl9kYXRhKGJ1ZiksIEJDTVRSX0JVRl9FTkRJQU4pOworICAgIGJjbW9sdF9idWZfc2tpcCgmdWJ1ZiwgQkNNVFJfSERSX1NJWkUpOworICAgIGVyciA9IGJjbW9sdF9tc2dfdW5wYWNrKCZ1YnVmLCAmbXNnKTsKKyAgICBiY21vc19idWZfZnJlZShidWYpOworICAgIGlmIChlcnIgPCAwKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJNZXNzYWdlIHVucGFjayBlcnJvciAlcyAoJWQpXG4iLCBiY21vc19zdHJlcnJvcihlcnIpLCBlcnIpOworICAgICAgICArK2JjbXRybXV4X3N0YXRfYXJyYXlbZGV2aWNlXS5yeF9kaXNjX3JlbW90ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1zZy0+Y29ycl90YWcgPSBoZHIuY29ycl90YWc7CisgICAgbXNnLT5zdWJjaCA9IChiY21vbHRfc3ViY2hhbm5lbCljaGFubmVsOworICAgICsrYmNtdHJtdXhfc3RhdF9hcnJheVtkZXZpY2VdLnJ4X2xvY2FsOworCisgICAgcnhfaW5mbyA9ICZiY210cm11eF9sb2NhbF9yeF9pbmZvX2FycmF5W2RldmljZV07CisgICAgcnhfaW5mby0+cngoZGV2aWNlLCBtc2csIHJ4X2luZm8tPmRhdGEpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtdHJtdXhfbXNnX3BhY2soYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnLCBiY21vc19idWYgKipwX2J1ZikKK3sKKyAgICBpbnQzMl90IGxlbiA9IGJjbW9sdF9tc2dfZ2V0X3BhY2tlZF9sZW5ndGgobXNnKTsKKyAgICBiY21vc19idWYgKmJ1ZjsKKyAgICBiY21vbHRfYnVmIHVidWY7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworICAgIGJjbXRyX2hkciB0aGRyID0ge307CisKKyAgICBpZiAobGVuIDwgMCkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiQ2FuJ3QgY2FsY3VsYXRlIHBhY2tldCBsZW5ndGguIEVycm9yICVzICglZClcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSwgbGVuKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgcmMgPSBiY210cl9oZWFkZXJfZmlsbChtc2csICZ0aGRyKTsKKyAgICBpZiAocmMpCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9FUlIoIkNhbid0IGNyZWF0ZSB0cmFuc3BvcnQgaGVhZGVyLiBFcnJvciAlcyAoJWQpXG4iLCBiY21vc19zdHJlcnJvcihyYyksIHJjKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBsZW4gKz0gQkNNVFJfSERSX1NJWkU7CisgICAgYnVmID0gYmNtb3NfYnVmX2FsbG9jKGxlbik7CisgICAgaWYgKCFidWYpCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9FUlIoIkNhbid0IGFsbG9jYXRlIHBhY2tldCBidWZmZXJcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICB9CisgICAgYmNtb2x0X2J1Zl9pbml0KCZ1YnVmLCBsZW4sIGJjbW9zX2J1Zl9kYXRhKGJ1ZiksIEJDTVRSX0JVRl9FTkRJQU4pOworICAgIGJjbW9sdF9idWZfc2tpcCgmdWJ1ZiwgQkNNVFJfSERSX1NJWkUpOworCisgICAgLyogUGFjayB0cmFuc3BvcnQgaGVhZGVyICovCisgICAgYmNtdHJfaGVhZGVyX3BhY2soJnRoZHIsIHVidWYuc3RhcnQpOworCisgICAgLyogUGFjayBtZXNzYWdlICovCisgICAgcmMgPSBiY21vbHRfbXNnX3BhY2sobXNnLCAmdWJ1Zik7CisgICAgaWYgKHJjKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJNZXNzYWdlIHBhY2sgZmFpbGVkLiBFcnJvciAlcyAoJWQpXG4iLCBiY21vc19zdHJlcnJvcihyYyksIHJjKTsKKyAgICAgICAgYmNtb3NfYnVmX2ZyZWUoYnVmKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgYmNtb3NfYnVmX2xlbmd0aF9zZXQoYnVmLCBsZW4pOworCisgICAgKnBfYnVmID0gYnVmOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIFNlbmQgcGFja2V0IGZyb20gbG9jYWwgY29udHJvbCBwcm9jZXNzIHRvIHRoZSBob3N0IGFwcGxpY2F0aW9uICovCitiY21vc19lcnJubyBiY210cm11eF9jb250cm9sX3RvX2hvc3QoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGJjbXRybXV4X2NoYW5uZWwgY2hhbm5lbCA9IChiY210cm11eF9jaGFubmVsKW1zZy0+c3ViY2g7CisgICAgYmNtb3NfYnVmICpidWY7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICBCVUdfT04oKHVuc2lnbmVkKWNoYW5uZWwgPj0gQkNNVFJNVVhfTUFYX0NIQU5ORUxTKTsKKyAgICBCVUdfT04oKHVuc2lnbmVkKWRldmljZSA+PSBCQ01UUl9NQVhfT0xUUyk7CisKKyAgICArK2JjbXRybXV4X3N0YXRfYXJyYXlbZGV2aWNlXS5jb250cm9sX3RvX2hvc3Q7CisKKyAgICByYyA9IGJjbXRybXV4X21zZ19wYWNrKGRldmljZSwgbXNnLCAmYnVmKTsKKyAgICBpZiAocmMpCisgICAgeworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorICAgIGJjbXRybXV4X3J4KGRldmljZSwgY2hhbm5lbCwgYnVmKTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogU2VuZCBwYWNrZXQgZnJvbSBsb2NhbCBjb250cm9sIHByb2Nlc3MgdG8gdGhlIGVtYmVkZGVkIHN5c3RlbSAqLworYmNtb3NfZXJybm8gYmNtdHJtdXhfY29udHJvbF90b19saW5lKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9tc2cgKm1zZykKK3sKKyAgICBiY21vc19idWYgKmJ1ZjsKKyAgICBiY21vc19lcnJubyBlcnI7CisKKyAgICBCVUdfT04oKHVuc2lnbmVkKWRldmljZSA+PSBCQ01UUl9NQVhfT0xUUyk7CisKKyAgICArK2JjbXRybXV4X3N0YXRfYXJyYXlbZGV2aWNlXS5jb250cm9sX3RvX2xpbmU7CisKKyAgICBlcnIgPSBiY210cm11eF9tc2dfcGFjayhkZXZpY2UsIG1zZywgJmJ1Zik7CisgICAgaWYgKGVycikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtdHJtdXhfc2VuZF90b19saW5lKGRldmljZSwgQkNNVFJNVVhfQ0hBTk5FTF9ERVZfQ09OVFJPTCwgYnVmKTsKKworICAgIHJldHVybiBlcnI7Cit9CisKKy8qIFJlZ2lzdGVyIG1lc3NhZ2UgZm9yIGludGVyY2VwdCBieSBiY21vbHRfZGV2X2N0cmwgKi8KK2JjbW9zX2Vycm5vIGJjbXRybXV4X2NvbnRyb2xfYXV0b19pbnRlcmNlcHRfZmlsdGVyKGJjbW9sdF9kZXZpZCBkZXZpY2UsICBiY21vbHRfb2JqX2lkIG9iamVjdCwgdWludDE2X3Qgc3ViZ3JvdXApCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncm91cF9pZCBtc2dfaWQ7CisKKyAgICBpZiAoKHVuc2lnbmVkKWRldmljZSA+PSBCQ01UUl9NQVhfT0xUUykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorICAgIGVyciA9IGJjbW9sdF9ncm91cF9pZF9jb21iaW5lKG9iamVjdCwgQkNNT0xUX01HVF9HUk9VUF9BVVRPLCBzdWJncm91cCwgJm1zZ19pZCk7CisgICAgaWYgKGVycikKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiQ2FuJ3QgaWRlbnRpZnkgb3BlcmF0aW9uICVkIGZvciBvYmplY3QgJWQuIEVycm9yICVzICglZClcbiIsCisgICAgICAgICAgICAoaW50KXN1Ymdyb3VwLCAoaW50KW9iamVjdCwgYmNtb3Nfc3RyZXJyb3IoZXJyKSwgZXJyKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgYmNtdHJtdXhfZGV2X2N0cmxfaW50ZXJjZXB0W2RldmljZV1bbXNnX2lkXSA9IEJDTU9TX1RSVUU7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKworLyoqIEdldCB0cmFuc3BvcnQgbXV4IHN0YXRpc3RpY3MuCisgKgorICogXHBhcmFtW2luXSAgIGRldmljZSAgTWFwbGUgZGV2aWNlIGluZGV4CisgKiBccGFyYW1bb3V0XSAgc3RhdCAgICBTdGF0aXN0aWNzCisgKiBccmV0dXJuczogMCBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSA8IDAKKyAqLworYmNtb3NfZXJybm8gYmNtdHJtdXhfc3RhdF9nZXQoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtdHJtdXhfc3RhdCAqc3RhdCkKK3sKKyAgICBpZiAoKHVuc2lnbmVkKWRldmljZSA+PSBCQ01UUl9NQVhfT0xUUyB8fCAhc3RhdCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorICAgICpzdGF0ID0gYmNtdHJtdXhfc3RhdF9hcnJheVtkZXZpY2VdOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisjaWZkZWYgX19LRVJORUxfXworCitFWFBPUlRfU1lNQk9MKGJjbXRybXV4X2luaXQpOworRVhQT1JUX1NZTUJPTChiY210cm11eF9jb25uZWN0KTsKK0VYUE9SVF9TWU1CT0woYmNtdHJtdXhfZGlzY29ubmVjdCk7CitFWFBPUlRfU1lNQk9MKGJjbXRybXV4X2NoYW5uZWxfcmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTChiY210cm11eF9jaGFubmVsX3VucmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTChiY210cm11eF9sb2NhbF9oYW5kbGVyX3JlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0woYmNtdHJtdXhfbG9jYWxfaGFuZGxlcl91bnJlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0woYmNtdHJtdXhfcnhfZnJvbV9ob3N0KTsKK0VYUE9SVF9TWU1CT0woYmNtdHJtdXhfcnhfZnJvbV9saW5lKTsKK0VYUE9SVF9TWU1CT0woYmNtdHJtdXhfY29udHJvbF90b19ob3N0KTsKK0VYUE9SVF9TWU1CT0woYmNtdHJtdXhfY29udHJvbF90b19saW5lKTsKK0VYUE9SVF9TWU1CT0woYmNtdHJtdXhfY29udHJvbF9hdXRvX2ludGVyY2VwdF9maWx0ZXIpOworRVhQT1JUX1NZTUJPTChiY210cm11eF9zdGF0X2dldCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9tdXgvYmNtb2x0X3RyX211eC5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9tdXgvYmNtb2x0X3RyX211eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MzczNzUKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L211eC9iY21vbHRfdHJfbXV4LmgKQEAgLTAsMCArMSwyNTIgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgQkNNT0xUX1RSX01VWF9IXworI2RlZmluZSBCQ01PTFRfVFJfTVVYX0hfCisKKy8qKiBcZGVmZ3JvdXAgdHJfbXV4IFRyYW5zcG9ydCBNdWx0aXBsZXhlcgorICogLSBQQ0llIGNoYW5uZWwgbXVsdGlwbGV4ZXIKKyAqIC0gbG9jYWxseS9yZW1vdGVseSAtIHRlcm1pbmF0ZWQgbWVzc2FnZSBtdWx0aXBsZXhlcgorICogLSBhdXRvbm9tb3VzIG1lc3NhZ2VzIGRlLW11bHRpcGxleGVyCisgKiBAeworICovCisKKyNpbmNsdWRlIDxiY21vbHRfbXNnLmg+CisjaWZuZGVmIElOX0JBTkQKKyNpbmNsdWRlIDxiY210cl9wY2llX3N3X3F1ZXVlLmg+CisjZW5kaWYKKworCisvKiBNZXNzYWdlIGRlc3RpbmF0aW9uOiBsb2NhbCBvciByZW1vdGUgKi8KK3R5cGVkZWYgZW51bQoreworICAgIEJDTVRSTVVYX0RFU1RfTE9DQUwsCisgICAgQkNNVFJNVVhfREVTVF9SRU1PVEUsCit9IGJjbXRybXV4X21zZ19kZXN0OworCit0eXBlZGVmIGJjbXRybXV4X21zZ19kZXN0ICgqYmNtdHJtdXhfbXNnX2ZpbHRlcl9jYl90KShiY21vbHRfZGV2aWQsIGJjbW9sdF9vYmpfaWQgb2JqLCBiY21vbHRfbWd0X2dyb3VwIGdyb3VwLCB1aW50MTZfdCBzdWJncm91cCk7CisKKy8qKiBJbml0aWFsaXplIG11eCBzZXJ2aWNlCisgKiBccmV0dXJuczogMCBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSA8IDAKKyAqLworYmNtb3NfZXJybm8gYmNtdHJtdXhfaW5pdChiY210cm11eF9tc2dfZmlsdGVyX2NiX3QgbXNnX2ZpbHRlcl9jYik7CisKKy8qKiBOb3RpZnkgbXV4IGRyaXZlciB0aGF0IGxvdy1sZXZlbCB0cmFuc3BvcnQgY29ubmVjdGlvbiBpcyByZWFkeQorICogXHJldHVybnM6IDAgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIGVycm9yIGNvZGUgPCAwCisgKi8KKyNpZmRlZiBJTl9CQU5EIAorYmNtb3NfZXJybm8gYmNtdHJtdXhfY29ubmVjdChiY21vbHRfZGV2aWQgZGV2aWNlLCAgYmNtb3NfaXB2NF9hZGRyZXNzIGlwX2FkZHJlc3MsIHVpbnQxNl90IHVkcF9wb3J0KTsKKyNlbHNlCitiY21vc19lcnJubyBiY210cm11eF9jb25uZWN0KGJjbW9sdF9kZXZpZCBkZXZpY2UsIHVpbnQzMl90IHR4cV9zaXplLCB1aW50MzJfdCByeHFfc2l6ZSk7CisjZW5kaWYKKworLyoqIE5vdGlmeSBtdXggZHJpdmVyIHRoYXQgbG93LWxldmVsIHRyYW5zcG9ydCBjb25uZWN0aW9uIGlzIGRpc2Nvbm5lY3RlZAorICogXHJldHVybnM6IDAgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIGVycm9yIGNvZGUgPCAwCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRybXV4X2Rpc2Nvbm5lY3QoYmNtb2x0X2RldmlkIGRldmljZSk7CisKKy8qKiBDbGVhbnVwIGFuZCBleGl0CisgKi8KK3ZvaWQgYmNtdHJtdXhfZXhpdCh2b2lkKTsKKworLyoKKyAqIFBDSWUgY2hhbm5lbCBtdWx0aXBsZXhlcgorICovCisKKy8qKiBMb2dpY2FsIGNoYW5uZWwgaWQgKi8KK3R5cGVkZWYgaW50IGJjbXRybXV4X2NoYW5uZWw7CisKKy8qKiBNdXggc3RhdGlzdGljcyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtdHJtdXhfc3RhdAoreworICAgIHVpbnQzMl90IHR4X3JlbW90ZTsgICAgICAgICAvKio8IEF0dGVtcHRlZCB0cmFuc21pdCB0byBkZXZpY2UgKGluY3VkaW5nIGRpc2NhcmRzKSAqLworICAgIHVpbnQzMl90IHR4X2xvY2FsOyAgICAgICAgICAvKio8IEF0dGVtcHRlZCAidHJhbnNtaXQiIHRvIGRldmljZSBjb250cm9sICovCisgICAgdWludDMyX3QgdHhfZGlzY19yZW1vdGU7ICAgIC8qKjwgRGlzY2FyZGVkIHdoZW4gdHJhbnNtaXR0aW5nIHRvIHJlbW90ZSBkZXZpY2UgKG5vdCByZWFkeSBvciBxdWV1ZSBvdmVyZmxvdykgKi8KKyAgICB1aW50MzJfdCB0eF9kaXNjX2xvY2FsOyAgICAgLyoqPCBDb3VsZG4ndCBkZWxpdmVyIHRvIGRldmljZSBjb250cm9sLiBObyBoYW5kbGVyICovCisgICAgdWludDMyX3QgcnhfcmVtb3RlOyAgICAgICAgIC8qKjwgUmVjZWl2ZWQgZnJvbSBkZXZpY2UgKi8KKyAgICB1aW50MzJfdCByeF9sb2NhbDsgICAgICAgICAgLyoqPCBNZXNzYWdlIGZyb20gdGhlIGxpbmUgaW50ZXJjZXB0ZWQgYnkgZGV2aWNlIGNvbnRyb2wgKi8KKyAgICB1aW50MzJfdCByeF9hdXRvOyAgICAgICAgICAgLyoqPCBSZWNlaXZlZCBhdXRvbm9tb3VzIG1lc3NhZ2VzICovCisgICAgdWludDMyX3QgY29udHJvbF90b19ob3N0OyAgIC8qKjwgU2VudCBieSBkZXZpY2UgY29udHJvbCB0byB0aGUgaG9zdCAqLworICAgIHVpbnQzMl90IGNvbnRyb2xfdG9fbGluZTsgICAvKio8IFNlbnQgYnkgZGV2aWNlIGNvbnRyb2wgdG8gbGluZSAqLworICAgIHVpbnQzMl90IHJ4X2Rpc2NfcmVtb3RlOyAgICAvKio8IERpc2NhcmRlZCBwYWNrZXRzIHJlY2VpdmVkIGZyb20gZGV2aWNlLiBDYW4ndCBkZW11eCBjaGFubmVsICovCisgICAgdWludDMyX3QgcnhfZGlzY19hdXRvOyAgICAgIC8qKjwgRGlzY2FyZGVkIGF1dG9ub21vdXMgbWVzc2FnZXMuIENhbid0IGRlbXV4IGF1dG8gbWVzc2FnZSAqLworICAgIHVpbnQzMl90IHJ4X2Rpc2NfbG9jYWw7ICAgICAvKio8IERpc2NhcmRlZCBwYWNrZXRzIHJlY2VpdmVkIGZyb20gZGV2aWNlIGNvbnRyb2wuIENhbid0IGRlbXV4IGNoYW5uZWwgKi8KKyAgICB1aW50MzJfdCByeF9kaXNjX2ludl9jaDsgICAgLyoqPCBEaXNjYXJkZWQgYmVjYXVzZSBjaGFubmVsIGlzIGludmFsaWQgKi8KKyAgICB1aW50MzJfdCByeF9wb2xsX3VyZ2VudDsgICAgLyoqPCBVcmdlbnQgYnVmZmVycyBjb3VudGVkIGJ5IGJjbXRyX3N3X3F1ZXVlX3J4X3BvbGwoKSAqLworICAgIHVpbnQzMl90IHJ4X3BvbGxfbm9ybWFsOyAgICAvKio8IE5vcm1hbCBidWZmZXJzIGNvdW50ZWQgYnkgYmNtdHJfc3dfcXVldWVfcnhfcG9sbCgpICovCit9IGJjbXRybXV4X3N0YXQ7CisKKworLyoqIE1heCBudW1iZXIgb2YgY2hhbm5lbHMgcGVyIGRldmljZSAqLworI2RlZmluZSBCQ01UUk1VWF9NQVhfQ0hBTk5FTFMgICAzMgorCisvKiogRmlyc3QgdXJnZW50IGNoYW5uZWwgKi8KKyNpZm5kZWYgSU5fQkFORAorI2RlZmluZSBCQ01UUk1VWF9GSVJTVF9VUkdFTlRfQ0hBTk5FTCBCQ01UUl9TV1FfRklSU1RfVVJHRU5UX0NIQU5ORUwKKyNpZiBCQ01UUk1VWF9GSVJTVF9VUkdFTlRfQ0hBTk5FTCA+PSBCQ01UUk1VWF9NQVhfQ0hBTk5FTFMKKyAgICAjZXJyb3IgQkNNVFJNVVhfRklSU1RfVVJHRU5UX0NIQU5ORUwgYW5kIEJDTVRSTVVYX01BWF9DSEFOTkVMUyBzZXR0aW5ncyBhcmUgaW5jb25zaXN0ZW50CisjZW5kaWYKKworI2Vsc2UKKworI2RlZmluZSBCQ01UUk1VWF9GSVJTVF9VUkdFTlRfQ0hBTk5FTCAoQkNNVFJNVVhfTUFYX0NIQU5ORUxTIC0gMSkgICAgICAgIC8qIFVyZ2VudCBjaGFubmVsIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIElOQkFORC4gKi8KKworI2VuZGlmCisKKworLyoqIEF1dG8tYXNzaWduIGNoYW5uZWwgKi8KKyNkZWZpbmUgQkNNVFJNVVhfQ0hBTk5FTF9BVVRPX0FTU0lHTiAgICgtMSkKKworLyoqIENoYW5uZWwgaWQgcmVzZXJ2ZWQgZm9yIGF1dG9ub21vdXMvcHJveHkgbWVzc2FnZXMgKi8KKyNkZWZpbmUgQkNNVFJNVVhfQ0hBTk5FTF9BVVRPX1BST1hZICAgICAwCisKKy8qKiBDaGFubmVsIGlkIHJlc2VydmVkIGZvciBkZXZpY2UgY29udHJvbCAqLworI2RlZmluZSBCQ01UUk1VWF9DSEFOTkVMX0RFVl9DT05UUk9MICAgIDEKKworLyoqIEZpcnN0IGNoYW5uZWwgaWQgdGhhdCBpcyBub3QgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQkNNVFJNVVhfQ0hBTk5FTF9GSVJTVF9GUkVFICAgICAoQkNNVFJNVVhfQ0hBTk5FTF9ERVZfQ09OVFJPTCArIDEpCisKKy8qKiBSZWNlaXZlIG1lc3NhZ2UgaGFuZGxlciAqLwordHlwZWRlZiB2b2lkICgqZl9iY210cl9yeF9oYW5kbGVyKShiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vc19idWYgKmJ1ZiwgYmNtdHJtdXhfY2hhbm5lbCBjaGFubmVsLCB2b2lkICpkYXRhKTsKKworLyoqIExvY2FsIHJlY2VpdmUgbWVzc2FnZSBoYW5kbGVyICovCit0eXBlZGVmIHZvaWQgKCpmX2JjbXRyX2xvY2FsX3J4X2hhbmRsZXIpKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9tc2cgKm1zZywgdm9pZCAqZGF0YSk7CisKKy8qKiBSZWdpc3RlciBQQ0llIGNoYW5uZWwgb3duZXIKKyAqCisgKiBccGFyYW1baW5dICAgICAgICAgICBkZXZpY2UgIE1hcGxlIGRldmljZSBpbmRleAorICogXHBhcmFtW2luLG91dF0gICAgICAgY2hhbm5lbCBMb2dpY2FsIFBDSWUgY2hhbm5lbCBpZC4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgQkNNVFJNVVhfQ0hBTk5FTF9BVVRPX0FTU0lHTiwgdW51c2VkIGNoYW5uZWwgaXMgYWxsb2NhdGVkIGludGVybmFsbHkuCisgKiBccGFyYW1baW5dICAgICAgICAgICByeCAgICAgIFJlY2VpdmUgY2FsbGJhY2sgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgcGFja2V0cyByZWNlaXZlZCBvdmVyIGNoYW5uZWwKKyAqIFxwYXJhbVtpbl0gICAgICAgICAgIGRhdGEgICAgRGF0YSB0byBiZSBwYXNzZWQgdG8gcmVjZWl2ZSBjYWxsYmFjaworICogXHJldHVybnM6IDAgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIGVycm9yIGNvZGUgPCAwCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRybXV4X2NoYW5uZWxfcmVnaXN0ZXIoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtdHJtdXhfY2hhbm5lbCAqY2hhbm5lbCwKKyAgICBmX2JjbXRyX3J4X2hhbmRsZXIgcngsIHZvaWQgKmRhdGEpOworCisKKy8qKiBSZWxlYXNlIFBDSWUgY2hhbm5lbCBhbGxvY2F0ZWQgYnkgYmNtdHJtdXhfY2hhbm5lbF9yZWdpc3RlcigpCisgKgorICogXHBhcmFtW2luXSAgIGRldmljZSAgTWFwbGUgZGV2aWNlIGluZGV4CisgKiBccGFyYW1baW5dICAgY2hhbm5lbAorICogXHJldHVybnM6IDAgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIGVycm9yIGNvZGUgPCAwCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRybXV4X2NoYW5uZWxfdW5yZWdpc3RlcihiY21vbHRfZGV2aWQgZGV2aWNlLCBiY210cm11eF9jaGFubmVsIGNoYW5uZWwpOworCisKKy8qKiBSZWNlaXZlIG1lc3NhZ2UgZnJvbSBob3N0IGFwcGxpY2F0aW9uCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIG1lc3NhZ2VzIHRyYW5zbWl0dGVkIGZyb20gdGhlIGhvc3QuCisgKiBNZXNzYWdlIGNhbiBiZSBsb2NhbGx5IG9yIHJlbW90ZWx5IHRlcm1pbmF0ZWQKKyAqIFxwYXJhbVtpbl0gICBkZXZpY2UgIE1hcGxlIGRldmljZSBpbmRleAorICogXHBhcmFtW2luXSAgIGNoYW5uZWwgTG9naWNhbCBjaGFubmVsCisgKiBccGFyYW1baW5dICAgYnVmICAgICBCdWZmZXIgdG8gYmUgdHJhbnNtaXR0ZWQKKyAqLwordm9pZCBiY210cm11eF9yeF9mcm9tX2hvc3QoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtdHJtdXhfY2hhbm5lbCBjaGFubmVsLCBiY21vc19idWYgKmJ1Zik7CisKKy8qKiBSZWNlaXZlIHBhY2tldCBmcm9tIFBDSWUgaW50ZXJmYWNlCisgKgorICogXHBhcmFtW2luXSAgIGRldmljZSAgTWFwbGUgZGV2aWNlIGluZGV4CisgKiBccGFyYW1baW5dICAgY2hhbm5lbCBMb2dpY2FsIGNoYW5uZWwKKyAqIFxwYXJhbVtpbl0gICBidWYgICAgIEJ1ZmZlciB0byBiZSBmb3J3YXJkZWQgdG8gYXBwbGljYXRpb24uCisgKiAgICAgICAgICAgICAgICAgICAgICBJdCBpcyBkZS1hbGxvY2F0ZWQgYXV0b21hdGljYWxseQorICovCit2b2lkIGJjbXRybXV4X3J4X2Zyb21fbGluZShiY21vbHRfZGV2aWQgZGV2aWNlLCBiY210cm11eF9jaGFubmVsIGNoYW5uZWwsIGJjbW9zX2J1ZiAqYnVmKTsKKworLyoqIFNlbmQgcGFja2V0IGZyb20gbG9jYWwgY29udHJvbCBwcm9jZXNzIHRvIHRoZSBob3N0IGFwcGxpY2F0aW9uCisgKgorICogXHBhcmFtW2luXSAgIGRldmljZSAgTWFwbGUgZGV2aWNlIGluZGV4CisgKiBccGFyYW1baW5dICAgbXNnICAgICBNZXNzYWdlIHRvIGJlIHNlbnQgdG8gaG9zdCBhcHBsaWNhdGlvbi4KKyAqICAgICAgICAgICAgICAgICAgICAgIEF0dGVudGlvbiEgSXQgaXMgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlciB0byByZWxlYXNlIHRoZSBtZXNzYWdlCisgKiAgICAgICAgICAgICAgICAgICAgICBhZnRlciByZXR1cm4gZnJvbSB0aGlzIGZ1bmN0aW9uIC0gaWYgbmVjZXNzYXJ5LgorICogICAgICAgICAgICAgICAgICAgICAgVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyB0aGF0IGl0IGlzIGV4cGVjdGVkIHRoYXQgb2Z0ZW4gbXNnIHdpbGwgYmUgYWxsb2NhdGVkIG9uIHN0YWNrLgorICogICAgICAgICAgICAgICAgICAgICAgSXQgaXMgYWxzbyByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyIHRvIG1ha2Ugc3VyZSB0aGF0IG1zZy0+c3ViY2ggaXMgc2V0IGNvcnJlY3RseQorICogICAgICAgICAgICAgICAgICAgICAgLSBwcmVzZXJ2ZWQgZm9yIHJlcXVlc3QvcmVzcG9uc2UgZXhjaGFuZ2UKKyAqICAgICAgICAgICAgICAgICAgICAgIC0gc2V0ID0gQkNNVFJNVVhfQ0hBTk5FTF9BVVRPX1BST1hZIGZvciBhdXRvbm9tb3VzIGluZGljYXRpb25zCisgKiBccmV0dXJuczogMCBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSA8IDAKKyAqLworYmNtb3NfZXJybm8gYmNtdHJtdXhfY29udHJvbF90b19ob3N0KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9tc2cgKm1zZyk7CisKKy8qKiBTZW5kIHBhY2tldCBmcm9tIGxvY2FsIGNvbnRyb2wgcHJvY2VzcyB0byB0aGUgZW1iZWRkZWQgc3lzdGVtCisgKgorICogXHBhcmFtW2luXSAgIGRldmljZSAgTWFwbGUgZGV2aWNlIGluZGV4CisgKiBccGFyYW1baW5dICAgbXNnICAgICBNZXNzYWdlIHRvIGJlIHNlbnQgdG8gdGhlIGVtYmVkZGVkIHN5c3RlbS4KKyAqICAgICAgICAgICAgICAgICAgICAgIEF0dGVudGlvbiEgSXQgaXMgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlciB0byByZWxlYXNlIHRoZSBtZXNzYWdlCisgKiAgICAgICAgICAgICAgICAgICAgICBhZnRlciByZXR1cm4gZnJvbSB0aGlzIGZ1bmN0aW9uIC0gaWYgbmVjZXNzYXJ5LgorICogICAgICAgICAgICAgICAgICAgICAgVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyB0aGF0IGl0IGlzIGV4cGVjdGVkIHRoYXQgb2Z0ZW4gbXNnIHdpbGwgYmUgYWxsb2NhdGVkIG9uIHN0YWNrLgorICogXHJldHVybnM6IDAgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIGVycm9yIGNvZGUgPCAwCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRybXV4X2NvbnRyb2xfdG9fbGluZShiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfbXNnICptc2cpOworCisvKiogUmVnaXN0ZXIgbWVzc2FnZSBmb3IgaW50ZXJjZXB0IGJ5IGRldl9jdHJsCisgKgorICogTWF0Y2hlZCBtZXNzYWdlIHJlY2VpdmUgZnJvbSB0aGUgbGluZSB3aWxsIGJlIGludGVyY2VwdGVkIGFuZAorICogZGVsaXZlcmVkIHRvIGNhbGxiYWNrIHJlZ2lzdGVyZWQgdXNpbmcgYmNtdHJtdXhfbG9jYWxfaGFuZGxlcl9yZWdpc3RlcigpCisgKgorICogXHBhcmFtW2luXSAgIGRldmljZSAgIE1hcGxlIGRldmljZSBpbmRleAorICogXHBhcmFtW2luXSAgIG9iamVjdCAgIE9iamVjdCBmb3Igd2hpY2ggbWVzc2FnZSBpcyB0byBiZSBpbnRlcmNlcHRlZAorICogXHBhcmFtW2luXSAgIHN1Ymdyb3VwIE1lc3NhZ2Ugc3ViZ3JvdXAKKyAqIFxyZXR1cm5zOiAwIGluIGNhc2Ugb2Ygc3VjY2VzcyBvciBlcnJvciBjb2RlIDwgMAorICovCitiY21vc19lcnJubyBiY210cm11eF9jb250cm9sX2F1dG9faW50ZXJjZXB0X2ZpbHRlcihiY21vbHRfZGV2aWQgZGV2aWNlLCAgYmNtb2x0X29ial9pZCBvYmplY3QsIHVpbnQxNl90IHN1Ymdyb3VwKTsKKworLyoKKyAqIExvY2FsIHRlcm1pbmF0aW9uIGhhbmRsZXIKKyAqLworCisvKiogUmVnaXN0ZXIgbG9jYWwgdGVybWluYXRpb24gaGFuZGxlci4KKyAqCisgKiBUaGlzIGhhbmRsZXIgaXMgY2FsbGVkIGZvciBtZXNzYWdlcyB0cmFuc21pdHRlZCBieSBob3N0IGFwcGxpY2F0aW9uCisgKiB0aGF0IHNob3VsZCBiZSB0ZXJtaW5hdGVkIGxvY2FsbHkgYnkgZGV2aWNlIGNvbnRyb2wgZHJpdmVyIGFuZAorICogZm9yIG1lc3NhZ2VzIHJlY2VpdmVkIGZyb20gdGhlIGxpbmUgdGhhdCBtYXRjaCBiY210cm11eF9jb250cm9sX2F1dG9faW50ZXJjZXB0X2ZpbHRlcigpCisgKgorICogXHBhcmFtW2luXSAgIGRldmljZSAgTWFwbGUgZGV2aWNlIGluZGV4CisgKiBccGFyYW1baW5dICAgcnggICAgICBSZWNlaXZlIGNhbGxiYWNrIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIGxvY2FsbHktdGVybWluYXRlZCBwYWNrZXRzLgorICogICAgICAgICAgICAgICAgICAgICAgSXQgbXVzdCByZWxlYXNlIHRoZSBidWZmZXIgd2hlbiBubyBsb25nZXIgbmVlZGVkCisgKiBccGFyYW1baW5dICAgZGF0YSAgICBEYXRhIHRvIGJlIHBhc3NlZCB0byByZWNlaXZlIGNhbGxiYWNrCisgKiBccmV0dXJuczogMCBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSA8IDAKKyAqLworYmNtb3NfZXJybm8gYmNtdHJtdXhfbG9jYWxfaGFuZGxlcl9yZWdpc3RlcihiY21vbHRfZGV2aWQgZGV2aWNlLCBmX2JjbXRyX2xvY2FsX3J4X2hhbmRsZXIgcngsIHZvaWQgKmRhdGEpOworCisvKiogVW5yZWdpc3RlciBsb2NhbCB0ZXJtaW5hdGlvbiBoYW5kbGVyIHJlZ2lzdGVyZWQgYnkgYmNtdHJtdXhfbG9jYWxfaGFuZGxlcl9yZWdpc3RlcigpCisgKgorICogXHBhcmFtW2luXSAgIGRldmljZSAgTWFwbGUgZGV2aWNlIGluZGV4CisgKiBccmV0dXJuczogMCBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSA8IDAKKyAqLworYmNtb3NfZXJybm8gYmNtdHJtdXhfbG9jYWxfaGFuZGxlcl91bnJlZ2lzdGVyKGJjbW9sdF9kZXZpZCBkZXZpY2UpOworCisvKiogR2V0IHRyYW5zcG9ydCBtdXggc3RhdGlzdGljcy4KKyAqCisgKiBccGFyYW1baW5dICAgZGV2aWNlICBNYXBsZSBkZXZpY2UgaW5kZXgKKyAqIFxwYXJhbVtvdXRdICBzdGF0ICAgIFN0YXRpc3RpY3MKKyAqIFxyZXR1cm5zOiAwIGluIGNhc2Ugb2Ygc3VjY2VzcyBvciBlcnJvciBjb2RlIDwgMAorICovCitiY21vc19lcnJubyBiY210cm11eF9zdGF0X2dldChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY210cm11eF9zdGF0ICpzdGF0KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L211eC9kYWVtb24vTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L211eC9kYWVtb24vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNmOWZjMwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci90cmFuc3BvcnQvbXV4L2RhZW1vbi9NYWtlZmlsZQpAQCAtMCwwICsxLDI3IEBACisjIEluIEJhbmQgdHJhbnNwb3J0CisjIENvbnNpc3RzIG9mIDIgY29tcG9uZW50cworIyAtIGxvdy1sZXZlbCBkcml2ZXIgKHNlbmQvcnggZnVuY3Rpb25zKQorIyAtIG11bHRpcGxleGVyCisjCitpZm5lcSAoIiQoU0lNVUxBVElPTl9CVUlMRCkiLCAieSIpCitNT0RfTkFNRSA9IHRybXV4X2RhZW1vbgorCitNT0RfREVQUyA9IHRyYW5zcG9ydCBtb2RlbCB0cm11eCBpbmJhbmRfZHJpdmVyCisKK01PRF9ERUZTICs9IC1ESU5fQkFORAorCitpZmVxICgiJChSRUxFQVNFX0JVSUxEKSIsICJ5IikKKyAgICBNT0RfREVQUyArPSBjb21tb25fYXBpCitlbHNlCisgICAgTU9EX0RFUFMgKz0gYXBpCitlbmRpZgorCitNT0RfVFlQRSA9IGxpYgorCitzcmNzID0gLi4vYmNtb2x0X3RyX211eC5jIAorCitVU0VfTElOVCA9IHllcworCitlbmRpZgorCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci90cmFuc3BvcnQvcGNpZV9zd19xdWV1ZS9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci90cmFuc3BvcnQvcGNpZV9zd19xdWV1ZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTM2ZDU3Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9wY2llX3N3X3F1ZXVlL01ha2VmaWxlCkBAIC0wLDAgKzEsMjEgQEAKKyMgUENJZSBTb2Z0d2FyZSBRdWV1ZSBkcml2ZXIKKyMgLSBTb2Z0d2FyZSBsYXllciBvbiB0b3Agb2YgbG93IGxldmVsIFBDSWUgZHJpdmVyIHRoYXQgYWRkcyBzdXBwb3J0CisjICAgZm9yIHMvdyBxdWV1ZSBhbmQgcHJpb3JpdHkKKyMKK01PRF9OQU1FID0gcGNpZV9zd19xdWV1ZQorCitNT0RfREVQUyA9IHBjaWUKKworaWZlcSAoIiQoT1NfS0VSTkVMKSIsICJsaW51eCIpCitNT0RfVFlQRSA9IGxpbnV4X2xpYgorZWxzZQorTU9EX1RZUEUgPSBsaWIKK2VuZGlmCisKK2lmbmVxICgiJChSQVdfVFJBTlNQT1JUX1ZJQV9VRFApIiwgInkiKQorICAgIHNyY3MgPSBiY210cl9wY2llX3N3X3F1ZXVlLmMKK2VuZGlmCisKK1VTRV9MSU5UID0geWVzCisKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9wY2llX3N3X3F1ZXVlL2JjbXRyX3BjaWVfc3dfcXVldWUuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci90cmFuc3BvcnQvcGNpZV9zd19xdWV1ZS9iY210cl9wY2llX3N3X3F1ZXVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI0MTAxZQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci90cmFuc3BvcnQvcGNpZV9zd19xdWV1ZS9iY210cl9wY2llX3N3X3F1ZXVlLmMKQEAgLTAsMCArMSwzODkgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisjaW5jbHVkZSA8YmNtdHJfcGNpZS5oPgorI2luY2x1ZGUgPGJjbW9sdF90cl9wY2llX3NwZWNpZmljLmg+CisjaW5jbHVkZSAiYmNtdHJfcGNpZV9zd19xdWV1ZS5oIgorCisvKgorICogYmNtX3BjaWVfc3dfcXVldWUuYworICogU29mdHdhcmUgbGF5ZXIgb24gdG9wIG9mIGxvdyBsZXZlbCBQQ0llIGRyaXZlciB0aGF0IGFkZHMgc3VwcG9ydAorICogZm9yIHMvdyBxdWV1ZSBhbmQgcHJpb3JpdHkKKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21vc19idWZfcXVldWUgdHhxOyAgICAgICAgICAgLyogVHJhbnNtaXQgcXVldWUgKi8KKyAgICBiY21vc19idWZfcXVldWUgcnhxOyAgICAgICAgICAgLyogUmVjZWl2ZSBxdWV1ZSAqLworICAgIHVpbnQzMl90IG1heF9od3Ffc2l6ZTsKKyAgICB1aW50MzJfdCBtYXhfc3dxX3NpemU7CisgICAgYmNtdHJfc3dxX3J4X2NiIHJ4X2NiOyAgICAgICAgIC8qIE9wdGlvbmFsIHJ4X2NiIGZvciBjYWxsYmFjay1iYXNlZCBSWCBidWZmZXIgZGVsaXZlcnkgKi8KK30gcGNpZV9zd3E7CisKK3N0YXRpYyBwY2llX3N3cSBzd3FfaW5mb1tCQ01UUl9NQVhfT0xUU11bQkNNVFJfUENJRV9QUlRZX19OVU1fT0ZdOworc3RhdGljIHVpbnQzMl90IGh3cV9vY2N1cGFuY3lbQkNNVFJfTUFYX09MVFNdOyAgLyogTnVtYmVyIG9mIHVuYWNrbm93bGVkZ2VkIGJ1ZmZlcnMgaW4gaHcgdHggcXVldWUgKi8KK3N0YXRpYyBiY21vc19ib29sIHN3cV9pbml0aWFsaXplZFtCQ01UUl9NQVhfT0xUU107CitzdGF0aWMgYmNtb3NfZmFzdGxvY2sgdHhfbG9ja1tCQ01UUl9NQVhfT0xUU107CitzdGF0aWMgYmNtb3NfZmFzdGxvY2sgcnhfbG9ja1tCQ01UUl9NQVhfT0xUU107CisKKyNkZWZpbmUgQkNNVFJfU1dRX0dFVF9SRVRVUk5fSUZfRVJST1IoZGV2aWNlLHBydHksc3dxKSAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGRldmljZSA+PSBCQ01UUl9NQVhfT0xUUykgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3dxID0gJnN3cV9pbmZvW2RldmljZV1bcHJ0eV07ICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCitzdGF0aWMgaW5saW5lIGxvbmcgX2JjbXRyX3N3cV90eF9sb2NrKHVpbnQ4X3QgZGV2aWNlKQoreworICAgIHJldHVybiBiY21vc19mYXN0bG9ja19sb2NrKCZ0eF9sb2NrW2RldmljZV0pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX2JjbXRyX3N3cV90eF91bmxvY2sodWludDhfdCBkZXZpY2UsIGxvbmcgZmxhZ3MpCit7CisgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZ0eF9sb2NrW2RldmljZV0sIGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSBsb25nIF9iY210cl9zd3FfcnhfbG9jayh1aW50OF90IGRldmljZSkKK3sKKyAgICByZXR1cm4gYmNtb3NfZmFzdGxvY2tfbG9jaygmcnhfbG9ja1tkZXZpY2VdKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9iY210cl9zd3FfcnhfdW5sb2NrKHVpbnQ4X3QgZGV2aWNlLCBsb25nIGZsYWdzKQoreworICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmcnhfbG9ja1tkZXZpY2VdLCBmbGFncyk7Cit9CisKKy8qKiBUeCBkb25lIGNhbGxiYWNrLgorICogTXVzdCBiZSBjYWxsZWQgdW5kZXIgdHhfbG9jaworICovCitzdGF0aWMgdm9pZCBfYmNtdHJfc3dxX3R4X2RvbmVfY2IodWludDhfdCBkZXZpY2UsIGJjbW9zX2J1ZiAqYnVmKQoreworICAgIEJVR19PTighaHdxX29jY3VwYW5jeVtkZXZpY2VdKTsKKyAgICAtLWh3cV9vY2N1cGFuY3lbZGV2aWNlXTsKKyAgICBiY21vc19idWZfZnJlZShidWYpOworfQorCisvKiBJbml0aWFsaXplIFBDSSBzb2Z0d2FyZSBxdWV1ZSBtb2R1bGUgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX3N3cV9pbml0KHZvaWQpCit7CisgICAgcmV0dXJuIGJjbXRyX3BjaWVfdHhfZG9uZV9jYmxrX3JlZ2lzdGVyKF9iY210cl9zd3FfdHhfZG9uZV9jYik7Cit9CisKKy8qIENsZWFudXAgc29mdHdhcmUgcXVldWUgbW9kdWxlCisgKi8KK3ZvaWQgYmNtdHJfc3dxX2V4aXQodm9pZCkKK3sKKyAgICBpbnQgaTsKKworICAgIC8qIFVucmVnaXN0ZXIgZnJvbSBiY210cl9wY2llIGRyaXZlciAqLworICAgIGJjbXRyX3BjaWVfdHhfZG9uZV9jYmxrX3VucmVnaXN0ZXIoKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBCQ01UUl9NQVhfT0xUUzsgaSsrKQorICAgICAgICBiY210cl9zd3FfZGV2aWNlX2V4aXQoaSk7Cit9CisKKy8qIEluaXRpYWxpemUgUENJIHNvZnR3YXJlIHF1ZXVlIG1vZHVsZSAqLworYmNtb3NfZXJybm8gYmNtdHJfc3dxX2RldmljZV9pbml0KHVpbnQ4X3QgZGV2aWNlKQoreworICAgIGJjbXRyX3BjaWVfcHJ0eSBwcnR5OworCisgICAgaWYgKGRldmljZSA+PSBCQ01UUl9NQVhfT0xUUykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKworICAgIGlmIChzd3FfaW5pdGlhbGl6ZWRbZGV2aWNlXSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfQUxSRUFEWTsKKworICAgIGJjbW9zX2Zhc3Rsb2NrX2luaXQoJnR4X2xvY2tbZGV2aWNlXSwgMCk7CisgICAgYmNtb3NfZmFzdGxvY2tfaW5pdCgmcnhfbG9ja1tkZXZpY2VdLCAwKTsKKyAgICBmb3IgKHBydHkgPSAwOyBwcnR5IDwgQkNNVFJfUENJRV9QUlRZX19OVU1fT0Y7IHBydHkrKykKKyAgICB7CisgICAgICAgIHBjaWVfc3dxICpzd3EgPSAmc3dxX2luZm9bZGV2aWNlXVtwcnR5XTsKKyAgICAgICAgYmNtb3NfYnVmX3F1ZXVlX2luaXQoJnN3cS0+dHhxKTsKKyAgICAgICAgYmNtb3NfYnVmX3F1ZXVlX2luaXQoJnN3cS0+cnhxKTsKKyAgICAgICAgc3dxLT5yeF9jYiA9IE5VTEw7CisgICAgICAgIHN3cS0+bWF4X2h3cV9zaXplID0gc3dxLT5tYXhfc3dxX3NpemUgPSAwOworICAgIH0KKyAgICBzd3FfaW5pdGlhbGl6ZWRbZGV2aWNlXSA9IEJDTU9TX1RSVUU7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogQ2xlYW51cCBzb2Z0d2FyZSBxdWV1ZSBtb2R1bGUgKi8KK3ZvaWQgYmNtdHJfc3dxX2RldmljZV9leGl0KHVpbnQ4X3QgZGV2aWNlKQoreworICAgIGJjbXRyX3BjaWVfcHJ0eSBwcnR5OworCisgICAgaWYgKCFzd3FfaW5pdGlhbGl6ZWRbZGV2aWNlXSkKKyAgICAgICAgcmV0dXJuOworCisgICAgZm9yIChwcnR5ID0gMDsgcHJ0eSA8IEJDTVRSX1BDSUVfUFJUWV9fTlVNX09GOyBwcnR5KyspCisgICAgeworICAgICAgICBwY2llX3N3cSAqc3dxID0gJnN3cV9pbmZvW2RldmljZV1bcHJ0eV07CisgICAgICAgIGJjbW9zX2J1ZiAqYnVmOworCisgICAgICAgIHdoaWxlICgoYnVmPWJjbW9zX2J1Zl9xdWV1ZV9nZXQoJnN3cS0+dHhxKSkpCisgICAgICAgICAgICBiY21vc19idWZfZnJlZShidWYpOworICAgICAgICB3aGlsZSAoKGJ1Zj1iY21vc19idWZfcXVldWVfZ2V0KCZzd3EtPnJ4cSkpKQorICAgICAgICAgICAgYmNtb3NfYnVmX2ZyZWUoYnVmKTsKKyAgICB9CisgICAgc3dxX2luaXRpYWxpemVkW2RldmljZV0gPSBCQ01PU19GQUxTRTsKKworICAgIHJldHVybjsKK30KKworLyoqIFNlbmQgYnVmZmVyIHRvIHRoZSBwZWVyCisgKiBccGFyYW1baW5dICAgZGV2aWNlICAgIE1hcGxlIGRldmljZSBpbmRleAorICogXHBhcmFtW2luXSAgIGNoYW5uZWwgICBDaGFubmVsIGlkIChvcGFxdWUgdG8gdGhlIGJjbXRyX3BjaWUgZHJpdmVyKQorICogXHBhcmFtW2luXSAgIGJ1ZiAgICAgICBCdWZmZXIgdG8gYmUgdHJhbnNmZXJyZWQKKyAqIFxyZXR1cm5zOiAwIGluIGNhc2Ugb2Ygc3VjY2VzcyBvciBlcnJvciBjb2RlIDwgMAorICovCitiY21vc19lcnJubyBiY210cl9zd3Ffc2VuZCh1aW50OF90IGRldmljZSwgdWludDhfdCBjaGFubmVsLCBiY21vc19idWYgKmJ1ZikKK3sKKyAgICBiY210cl9wY2llX3BydHkgcHJ0eSA9IChjaGFubmVsID49IEJDTVRSX1NXUV9GSVJTVF9VUkdFTlRfQ0hBTk5FTCkgPworICAgICAgICBCQ01UUl9QQ0lFX1BSVFlfVVJHRU5UIDogQkNNVFJfUENJRV9QUlRZX05PUk1BTDsKKyAgICBwY2llX3N3cSAqc3dxOworICAgIGJjbW9zX2Jvb2wgd2FzX2VtcHR5OworICAgIGJjbW9zX2Jvb2wgaHdfcXVldWVfZnVsbDsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgbG9uZyBmbGFnczsKKworICAgIEJDTVRSX1NXUV9HRVRfUkVUVVJOX0lGX0VSUk9SKGRldmljZSwgcHJ0eSwgc3dxKTsKKworICAgIC8qIFN0b3JlIGNoYW5uZWwgaW4gdGhlIGJ1ZmZlciAqLworICAgIGJjbW9zX2J1Zl9jaGFubmVsX3NldChidWYsIGNoYW5uZWwpOworCisgICAgLyogUHJldmVudCBjb25jdXJyZW50IGFjY2VzcyB0byB0aGUgcXVldWUgKi8KKyAgICBmbGFncyA9IF9iY210cl9zd3FfdHhfbG9jayhkZXZpY2UpOworCisgICAgLyogU3RvcmUgcS13YXMtZW1wdHkgc3RhdHVzICovCisgICAgd2FzX2VtcHR5ID0gYmNtb3NfYnVmX3F1ZXVlX2lzX2VtcHR5KCZzd3EtPnR4cSk7CisKKyAgICAvKiBDaGVjayBpZiBtYXggaC93IHF1ZXVlIG9jY3VwYW5jeSBpc24ndCBleGNlZWRlZC4gSWYgaXQgaXNuJ3QgYW5kIHMvdyBxdWV1ZSBpcyBlbXB0eQorICAgICAqIHN1Ym1pdCBkaXJlY3RseSB0byB0aGUgaC93IHF1ZXVlLgorICAgICAqLworICAgIGh3X3F1ZXVlX2Z1bGwgPSAoc3dxLT5tYXhfaHdxX3NpemUgJiYgaHdxX29jY3VwYW5jeVtkZXZpY2VdID49IHN3cS0+bWF4X2h3cV9zaXplKTsKKyAgICBpZiAod2FzX2VtcHR5ICYmICFod19xdWV1ZV9mdWxsKQorICAgIHsKKyAgICAgICAgKytod3Ffb2NjdXBhbmN5W2RldmljZV07CisgICAgICAgIF9iY210cl9zd3FfdHhfdW5sb2NrKGRldmljZSwgZmxhZ3MpOworICAgICAgICBlcnIgPSBiY210cl9wY2llX3NlbmQoZGV2aWNlLCBjaGFubmVsLCBidWYpOworICAgICAgICBpZiAoZXJyKQorICAgICAgICB7CisgICAgICAgICAgICBmbGFncyA9IF9iY210cl9zd3FfdHhfbG9jayhkZXZpY2UpOworICAgICAgICAgICAgLS1od3Ffb2NjdXBhbmN5W2RldmljZV07CisgICAgICAgICAgICAvKiBJZiBzdyBxIGlzIGVuYWJsZWQsIGVucXVlIHRoZSBidWZmZXIsIG90aGVyd2lzZSwganVzdCByZXR1cm4gKi8KKyAgICAgICAgICAgIGlmIChzd3EtPm1heF9zd3Ffc2l6ZSB8fCBzd3EtPm1heF9od3Ffc2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vc19idWZfcXVldWVfcHV0KCZzd3EtPnR4cSwgYnVmKTsKKyAgICAgICAgICAgICAgICBlcnIgPSBCQ01fRVJSX09LOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX2JjbXRyX3N3cV90eF91bmxvY2soZGV2aWNlLCBmbGFncyk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYmNtb3NfYnVmX3F1ZXVlX3B1dCgmc3dxLT50eHEsIGJ1Zik7CisgICAgICAgIF9iY210cl9zd3FfdHhfdW5sb2NrKGRldmljZSwgZmxhZ3MpOworICAgICAgICBlcnIgPSBCQ01fRVJSX09LOworICAgIH0KKworCisgICAgcmV0dXJuIGVycjsKK30KKworLyoqIFJlY2VpdmUgcGFja2V0IGZyb20gZGV2aWNlCisgKiBccGFyYW1baW5dICAgZGV2aWNlICAgICAgICAgIE1hcGxlIGRldmljZSBpbmRleAorICogXHBhcmFtW2luXSAgIHBydHkgICAgICAgICAgICBQcmlvcml0eQorICogXHBhcmFtW291dF0gIGNoYW5uZWwgICAgICAgICBtZXNzYWdlIGNoYW5uZWwgZnJvbSB0aGUgQkQKKyAqIFxwYXJhbVtvdXRdICBidWYgIHBvaW50ZXIgdG8gbmV0d29yayBidWZmZXIgY29udGFpbmluZyB0aGUKKyAqICAgICAgIHJlY2VpdmVkIHBhY2tldAorICogXHJldHVybnM6IDAgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIGVycm9yIGNvZGUgPCAwCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX3N3cV9yZWNlaXZlKHVpbnQ4X3QgZGV2aWNlLCBiY210cl9wY2llX3BydHkgcHJ0eSwgdWludDhfdCAqY2hhbm5lbCwgYmNtb3NfYnVmICoqYnVmKQoreworICAgIHBjaWVfc3dxICpzd3E7CisgICAgbG9uZyBmbGFnczsKKyAgICBiY21vc19lcnJubyBlcnI7CisKKyAgICBCQ01UUl9TV1FfR0VUX1JFVFVSTl9JRl9FUlJPUihkZXZpY2UsIHBydHksIHN3cSk7CisKKyAgICAvKiBQZWV2ZW50IGNvbmN1cmVudCBhY2Nlc3MgdG8gdGhlIHF1ZXVlICovCisgICAgZmxhZ3MgPSBfYmNtdHJfc3dxX3J4X2xvY2soZGV2aWNlKTsKKyAgICAqYnVmID0gYmNtb3NfYnVmX3F1ZXVlX2dldCgmc3dxLT5yeHEpOworICAgIGlmICgqYnVmKQorICAgIHsKKyAgICAgICAgKmNoYW5uZWwgPSBiY21vc19idWZfY2hhbm5lbCgqYnVmKTsKKyAgICAgICAgZXJyID0gQkNNX0VSUl9PSzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZXJyID0gQkNNX0VSUl9RVUVVRV9FTVBUWTsKKyAgICB9CisgICAgX2JjbXRyX3N3cV9yeF91bmxvY2soZGV2aWNlLCBmbGFncyk7CisKKyAgICByZXR1cm4gZXJyOworfQorCisvKiogQ29uZmlndXJlIFRYIHF1ZXVlLgorICovCitiY21vc19lcnJubyBiY210cl9zd3FfdHhfcXVldWVfY2ZnKHVpbnQ4X3QgZGV2aWNlLCBiY210cl9wY2llX3BydHkgcHJ0eSwgdWludDMyX3QgaGFyZHFfc2l6ZSwgdWludDMyX3Qgc29mdHFfc2l6ZSkKK3sKKyAgICBwY2llX3N3cSAqc3dxOworCisgICAgQkNNVFJfU1dRX0dFVF9SRVRVUk5fSUZfRVJST1IoZGV2aWNlLCBwcnR5LCBzd3EpOworCisgICAgc3dxLT5tYXhfaHdxX3NpemUgPSBoYXJkcV9zaXplOworICAgIHN3cS0+bWF4X3N3cV9zaXplID0gc29mdHFfc2l6ZTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiogUmVnaXN0ZXIgZm9yICJkYXRhIHJlY2VpdmVkIGluZGljYXRpb24iCisgKiBccGFyYW1baW5dICAgZGV2aWNlICAgICAgICAgIE1hcGxlIGRldmljZSBpbmRleAorICogXHBhcmFtW2luXSAgIHBydHkgICAgICAgICAgICBQcmlvcml0eQorICogXHBhcmFtW2luXSAgIGNiICAgICAgICAgICAgICBDYWxsYmFjayBwb2ludGVyCisgKiBccmV0dXJuczogMCBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSA8IDAKKyAqLworYmNtb3NfZXJybm8gYmNtdHJfc3dxX3J4X2NiX3JlZ2lzdGVyKHVpbnQ4X3QgZGV2aWNlLCBiY210cl9wY2llX3BydHkgcHJ0eSwgYmNtdHJfc3dxX3J4X2NiIHJ4X2NiKQoreworICAgIGlmIChkZXZpY2UgPj0gQkNNVFJfTUFYX09MVFMpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgc3dxX2luZm9bZGV2aWNlXVtwcnR5XS5yeF9jYiA9IHJ4X2NiOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qKiBVbnJlZ2lzdGVyICJkYXRhIHJlY2VpdmVkIGluZGljYXRpb24iIGNhbGxiYWNrCisgKiBccGFyYW1baW5dICAgZGV2aWNlICAgICAgICAgIE1hcGxlIGRldmljZSBpbmRleAorICogXHBhcmFtW2luXSAgIHBydHkgICAgICAgICAgICBQcmlvcml0eQorICogXHJldHVybnM6IDAgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIGVycm9yIGNvZGUgPCAwCisgKi8KK2JjbW9zX2Vycm5vIGJjbXRyX3N3cV9yeF9jYl91bnJlZ2lzdGVyKHVpbnQ4X3QgZGV2aWNlLCBiY210cl9wY2llX3BydHkgcHJ0eSkKK3sKKyAgICBpZiAoZGV2aWNlID49IEJDTVRSX01BWF9PTFRTKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIHN3cV9pbmZvW2RldmljZV1bcHJ0eV0ucnhfY2IgPSBOVUxMOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIEZldGNoIGRhdGEgZnJvbSB0aGUgaHcgdG8gdGhlIHN3IHF1ZXVlLiAqLwordm9pZCBiY210cl9zd3FfcnhfcG9sbCh1aW50OF90IGRldmljZSwgdWludDMyX3QgbmJ1ZltdKQoreworICAgIHVpbnQ4X3QgY2hhbm5lbDsKKyAgICBiY21vc19idWYgKmJ1ZjsKKyAgICBpbnQgbltCQ01UUl9QQ0lFX1BSVFlfX05VTV9PRl0gPSB7fTsKKyAgICBsb25nIGZsYWdzOworICAgIGJjbW9zX2Vycm5vIGVycjsKKworICAgIGRvCisgICAgeworICAgICAgICBiY210cl9wY2llX3BydHkgcHJ0eTsKKyAgICAgICAgcGNpZV9zd3EgKnN3cTsKKworICAgICAgICBlcnIgPSBiY210cl9wY2llX3JlY2VpdmUoZGV2aWNlLCAmY2hhbm5lbCwgJmJ1Zik7CisgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBwcnR5ID0gKGNoYW5uZWwgPj0gQkNNVFJfU1dRX0ZJUlNUX1VSR0VOVF9DSEFOTkVMKSA/CisgICAgICAgICAgICBCQ01UUl9QQ0lFX1BSVFlfVVJHRU5UIDogQkNNVFJfUENJRV9QUlRZX05PUk1BTDsKKyAgICAgICAgLyogSWYgY2FsbGJhY2sgYmFzZWQgZGVsaXZlcnkgLSBkZWxpdmVyIGJ1ZmZlciBub3csIG90aGVyd2lzZSwgcGxhY2Ugb24gcy93IHF1ZXVlICovCisgICAgICAgIHN3cSA9ICZzd3FfaW5mb1tkZXZpY2VdW3BydHldOworICAgICAgICBpZiAoc3dxLT5yeF9jYikKKyAgICAgICAgeworICAgICAgICAgICAgc3dxLT5yeF9jYihkZXZpY2UsIGNoYW5uZWwsIGJ1Zik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19idWZfY2hhbm5lbF9zZXQoYnVmLCBjaGFubmVsKTsKKyAgICAgICAgICAgIGZsYWdzID0gX2JjbXRyX3N3cV9yeF9sb2NrKGRldmljZSk7CisgICAgICAgICAgICBiY21vc19idWZfcXVldWVfcHV0KCZzd3EtPnJ4cSwgYnVmKTsKKyAgICAgICAgICAgIF9iY210cl9zd3FfcnhfdW5sb2NrKGRldmljZSwgZmxhZ3MpOworICAgICAgICB9CisgICAgICAgICsrbltwcnR5XTsKKyAgICB9IHdoaWxlIChCQ01PU19UUlVFKTsKKworCisgICAgbmJ1ZlswXSA9IG5bMF07CisgICAgbmJ1ZlsxXSA9IG5bMV07Cit9CisKKy8qIFN1Ym1pdCBkYXRhIGZyb20gdGhlIHN3IFRYIHF1ZXVlIHRvIHRoZSBoL3cgKi8KK3N0YXRpYyB2b2lkIF9iY210cl9zd3FfdHhfc3VibWl0X3BydHkodWludDhfdCBkZXZpY2UsIGJjbXRyX3BjaWVfcHJ0eSBwcnR5KQoreworICAgIGJjbW9zX2Vycm5vIGVyciA9IEJDTV9FUlJfT0s7CisgICAgcGNpZV9zd3EgKnN3cTsKKyAgICBiY21vc19idWYgKmJ1ZjsKKyAgICB1aW50OF90IGNoYW5uZWw7CisgICAgYmNtb3NfYm9vbCBod19xdWV1ZV9mdWxsOworICAgIGxvbmcgZmxhZ3M7CisKKyAgICBzd3EgPSAmc3dxX2luZm9bZGV2aWNlXVtwcnR5XTsKKyAgICBkbworICAgIHsKKyAgICAgICAgZmxhZ3MgPSBfYmNtdHJfc3dxX3R4X2xvY2soZGV2aWNlKTsKKworICAgICAgICAvKiBDaGVjayBpZiBub3Qgb3ZlciBsaW1pdCAqLworICAgICAgICBod19xdWV1ZV9mdWxsID0gKHN3cS0+bWF4X2h3cV9zaXplICYmIGh3cV9vY2N1cGFuY3lbZGV2aWNlXSA+PSBzd3EtPm1heF9od3Ffc2l6ZSk7CisgICAgICAgIGlmIChod19xdWV1ZV9mdWxsKQorICAgICAgICB7CisgICAgICAgICAgICBfYmNtdHJfc3dxX3R4X3VubG9jayhkZXZpY2UsIGZsYWdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogR2V0IGZyb20gcy93IHF1ZXVlIGFuZCBzdWJtaXQgdG8gdGhlIGgvdyBxdWV1ZSAqLworICAgICAgICBidWYgPSBiY21vc19idWZfcXVldWVfcGVlaygmc3dxLT5yeHEpOworICAgICAgICBfYmNtdHJfc3dxX3R4X3VubG9jayhkZXZpY2UsIGZsYWdzKTsKKyAgICAgICAgaWYgKCFidWYpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjaGFubmVsID0gYmNtb3NfYnVmX2NoYW5uZWwoYnVmKTsKKyAgICAgICAgZXJyID0gYmNtdHJfcGNpZV9zZW5kKGRldmljZSwgY2hhbm5lbCwgYnVmKTsKKyAgICAgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZmxhZ3MgPSBfYmNtdHJfc3dxX3R4X2xvY2soZGV2aWNlKTsKKyAgICAgICAgKytod3Ffb2NjdXBhbmN5W2RldmljZV07CisgICAgICAgIGJjbW9zX2J1Zl9xdWV1ZV9nZXQoJnN3cS0+dHhxKTsKKyAgICAgICAgX2JjbXRyX3N3cV90eF91bmxvY2soZGV2aWNlLCBmbGFncyk7CisKKyAgICB9IHdoaWxlIChCQ01PU19UUlVFKTsKK30KKworLyogU3VibWl0IGRhdGEgZnJvbSB0aGUgc3cgVFggcXVldWUgdG8gdGhlIGgvdyAqLwordm9pZCBiY210cl9zd3FfdHhfc3VibWl0KHVpbnQ4X3QgZGV2aWNlKQoreworICAgIGlmIChiY210cl9wY2llX3R4X2NvbGxlY3QoZGV2aWNlKSA+IDApCisgICAgeworICAgICAgICBfYmNtdHJfc3dxX3R4X3N1Ym1pdF9wcnR5KGRldmljZSwgQkNNVFJfUENJRV9QUlRZX1VSR0VOVCk7CisgICAgICAgIF9iY210cl9zd3FfdHhfc3VibWl0X3BydHkoZGV2aWNlLCBCQ01UUl9QQ0lFX1BSVFlfTk9STUFMKTsKKyAgICB9Cit9CisKKyNpZmRlZiBfX0tFUk5FTF9fCitFWFBPUlRfU1lNQk9MKGJjbXRyX3N3cV90eF9xdWV1ZV9jZmcpOworRVhQT1JUX1NZTUJPTChiY210cl9zd3Ffc2VuZCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci90cmFuc3BvcnQvcGNpZV9zd19xdWV1ZS9iY210cl9wY2llX3N3X3F1ZXVlLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L3BjaWVfc3dfcXVldWUvYmNtdHJfcGNpZV9zd19xdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZjZjMjMKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdHJhbnNwb3J0L3BjaWVfc3dfcXVldWUvYmNtdHJfcGNpZV9zd19xdWV1ZS5oCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogYmNtX3BjaWVfc3dfcXVldWUuaAorICoKKyAqICBDcmVhdGVkIG9uOiAzMSBKYW4gMjAxNworICogICAgICBBdXRob3I6IGlnb3J0CisgKi8KKworI2lmbmRlZiBfQkNNX1BDSUVfU1dfUVVFVUVfSF8KKyNkZWZpbmUgX0JDTV9QQ0lFX1NXX1FVRVVFX0hfCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY210cl9wY2llLmg+CisKKy8qIE1lc3NhZ2UgcHJpb3JpdHkgKi8KK3R5cGVkZWYgZW51bQoreworICAgIEJDTVRSX1BDSUVfUFJUWV9VUkdFTlQgPSAwLAorICAgIEJDTVRSX1BDSUVfUFJUWV9OT1JNQUwgPSAxLAorCisgICAgQkNNVFJfUENJRV9QUlRZX19OVU1fT0YKK30gYmNtdHJfcGNpZV9wcnR5OworCisvKiBGaXJzdCB1cmdlbnQgY2hhbm5lbCBpZCAqLworI2RlZmluZSBCQ01UUl9TV1FfRklSU1RfVVJHRU5UX0NIQU5ORUwgICAgIDMwCisKKy8qKiBJbml0aWFsaXplIFBDSSBzb2Z0d2FyZSBxdWV1ZSBtb2R1bGUKKyAqIFxyZXR1cm5zOiAwIGluIGNhc2Ugb2Ygc3VjY2VzcyBvciBlcnJvciBjb2RlIDwgMAorICovCitiY21vc19lcnJubyBiY210cl9zd3FfaW5pdCh2b2lkKTsKKworLyogQ2xlYW51cCBzb2Z0d2FyZSBxdWV1ZSBtb2R1bGUKKyAqLwordm9pZCBiY210cl9zd3FfZXhpdCh2b2lkKTsKKworLyoqIEluaXRpYWxpemUgUENJIHNvZnR3YXJlIHF1ZXVlIG1vZHVsZSBmb3IgYSBkZXZpY2UKKyAqIFxwYXJhbVtpbl0gICBkZXZpY2UgICAgTWFwbGUgZGV2aWNlIGluZGV4CisgKiBccmV0dXJuczogMCBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSA8IDAKKyAqLworYmNtb3NfZXJybm8gYmNtdHJfc3dxX2RldmljZV9pbml0KHVpbnQ4X3QgZGV2aWNlKTsKKworLyogQ2xlYW51cCBzb2Z0d2FyZSBxdWV1ZSBtb2R1bGUgZm9yIGEgZGV2aWNlCisgKiBccGFyYW1baW5dICAgZGV2aWNlICAgIE1hcGxlIGRldmljZSBpbmRleAorICovCit2b2lkIGJjbXRyX3N3cV9kZXZpY2VfZXhpdCh1aW50OF90IGRldmljZSk7CisKKy8qKiBDb25maWd1cmUgVFggcXVldWUuCisgKiBccGFyYW1baW5dICAgZGV2aWNlICAgICAgTWFwbGUgZGV2aWNlIGluZGV4CisgKiBccGFyYW1baW5dICAgcHJ0eSAgICAgICAgUHJpb3JpdHkKKyAqIFxwYXJhbVtpbl0gICBoYXJkcV9zaXplICBNYXggbnVtYmVyIG9mIGJ1ZmZlcnMgdGhhdCBjYW4gYmUgc3VibWl0dGVkIHRvIHRoZSBoL3cgcXVldWUuCisgKiAgICAgICAgICAgICAgMD11bmxpbWl0ZWQuCisgKiBccGFyYW1baW5dICAgc29mdHFfc2l6ZSAgTWF4IG51bWJlciBvZiBidWZmZXJzIHRvIGJlIHF1ZXVlZC4gMD11bmxpbWl0ZWQuCisgKiBccmV0dXJuczogMCBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSA8IDAKKyAqIEJDTV9FUlJfT1ZFUkZMT1cgLSBtYXhfc29mdHFfc2l6ZSBidWZmZXIgaXMgd2FpdGluZyB0byBiZSBoYW5kbGluZyBieSB0aGUgcmVjZWl2ZXIKKyAqLworYmNtb3NfZXJybm8gYmNtdHJfc3dxX3R4X3F1ZXVlX2NmZyh1aW50OF90IGRldmljZSwgYmNtdHJfcGNpZV9wcnR5IHBydHksIHVpbnQzMl90IGhhcmRxX3NpemUsIHVpbnQzMl90IHNvZnRxX3NpemUpOworCisvKiogU2VuZCBidWZmZXIgdG8gdGhlIHBlZXIKKyAqIFxwYXJhbVtpbl0gICBkZXZpY2UgICAgTWFwbGUgZGV2aWNlIGluZGV4CisgKiBccGFyYW1baW5dICAgcHJ0eSAgICAgIFByaW9yaXR5CisgKiBccGFyYW1baW5dICAgY2hhbm5lbCAgIENoYW5uZWwgaWQKKyAqIFxwYXJhbVtpbl0gICBidWYgICAgICAgQnVmZmVyIHRvIGJlIHRyYW5zZmVycmVkCisgKiBccmV0dXJuczogMCBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSA8IDAKKyAqLworYmNtb3NfZXJybm8gYmNtdHJfc3dxX3NlbmQodWludDhfdCBkZXZpY2UsIHVpbnQ4X3QgY2hhbm5lbCwgYmNtb3NfYnVmICpidWYpOworCisvKiogUmVjZWl2ZSBwYWNrZXQgZnJvbSBkZXZpY2UKKyAqIFxwYXJhbVtpbl0gICBkZXZpY2UgICAgICAgICAgTWFwbGUgZGV2aWNlIGluZGV4CisgKiBccGFyYW1baW5dICAgcHJ0eSAgICAgICAgICAgIFByaW9yaXR5CisgKiBccGFyYW1bb3V0XSAgY2hhbm5lbCAgICAgICAgIG1lc3NhZ2UgY2hhbm5lbCBmcm9tIHRoZSBCRAorICogXHBhcmFtW291dF0gIGJ1ZiAgcG9pbnRlciB0byBuZXR3b3JrIGJ1ZmZlciBjb250YWluaW5nIHRoZQorICogICAgICAgcmVjZWl2ZWQgcGFja2V0CisgKiBccmV0dXJuczogMCBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSA8IDAKKyAqLworYmNtb3NfZXJybm8gYmNtdHJfc3dxX3JlY2VpdmUodWludDhfdCBkZXZpY2UsIGJjbXRyX3BjaWVfcHJ0eSBwcnR5LCB1aW50OF90ICpjaGFubmVsLCBiY21vc19idWYgKipidWYpOworCisvKiogZGF0YV9yZWNlaXZlZCBjYWxsYmFjayBlbmFibGVzIGNhbGxiYWNrLWJhc2VkIHJlY2VpdmUgYnVmZmVyIGRlbGl2ZXJ5CisgKiBpbnN0ZWFkIG9mIC8gaW4gYWRkaXRpb24gdG8gYmNtdHJfc3dxX3JlY2VpdmUoKSBmdW5jdGlvbi4KKyAqIFRoaXMgY2FsbGJhY2sgdGFrZXMgYnVmZmVyIG93bmVyc2hpcAorICovCit0eXBlZGVmIHZvaWQgKCpiY210cl9zd3FfcnhfY2IpKHVpbnQ4X3QgZGV2aWNlLCB1aW50OF90IGNoYW5uZWwsIGJjbW9zX2J1ZiAqYnVmKTsKKworLyoqIFJlZ2lzdGVyIGZvciAiZGF0YSByZWNlaXZlZCIgaW5kaWNhdGlvbiIKKyAqIFxwYXJhbVtpbl0gICBkZXZpY2UgICAgICAgICAgTWFwbGUgZGV2aWNlIGluZGV4CisgKiBccGFyYW1baW5dICAgcHJ0eSAgICAgICAgICAgIFByaW9yaXR5CisgKiBccGFyYW1baW5dICAgY2IgICAgICAgICAgICAgIENhbGxiYWNrIHBvaW50ZXIKKyAqIFxyZXR1cm5zOiAwIGluIGNhc2Ugb2Ygc3VjY2VzcyBvciBlcnJvciBjb2RlIDwgMAorICovCitiY21vc19lcnJubyBiY210cl9zd3FfcnhfY2JfcmVnaXN0ZXIodWludDhfdCBkZXZpY2UsIGJjbXRyX3BjaWVfcHJ0eSBwcnR5LCBiY210cl9zd3FfcnhfY2IgcnhfY2IpOworCisvKiogVW5yZWdpc3RlciAiZGF0YSByZWNlaXZlZCBpbmRpY2F0aW9uIiBjYWxsYmFjaworICogXHBhcmFtW2luXSAgIGRldmljZSAgICAgICAgICBNYXBsZSBkZXZpY2UgaW5kZXgKKyAqIFxwYXJhbVtpbl0gICBwcnR5ICAgICAgICAgICAgUHJpb3JpdHkKKyAqIFxyZXR1cm5zOiAwIGluIGNhc2Ugb2Ygc3VjY2VzcyBvciBlcnJvciBjb2RlIDwgMAorICovCitiY21vc19lcnJubyBiY210cl9zd3FfcnhfY2JfdW5yZWdpc3Rlcih1aW50OF90IGRldmljZSwgYmNtdHJfcGNpZV9wcnR5IHBydHkpOworCisvKiogRmV0Y2ggZGF0YSBmcm9tIHRoZSBodyB0byB0aGUgc3cgcXVldWUuCisgKgorICogSXQgaXMgZXhwZWN0ZWQgdGhhdCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSB0cmlnZ2VyZWQgYnkgUlggaW50ZXJydXB0CisgKgorICogXHBhcmFtW2luXSAgIGRldmljZSAgICAgICAgICBNYXBsZSBkZXZpY2UgaW5kZXgKKyAqIFxwYXJhbVtvdXRdICBuYnVmICAgICAgICAgICAgUGVyIHByaW9yaXR5IGFycmF5IHdpdGggbnVtYmVyIG9mIGJ1ZmZlcnMKKyAqLwordm9pZCBiY210cl9zd3FfcnhfcG9sbCh1aW50OF90IGRldmljZSwgdWludDMyX3QgbmJ1ZltdKTsKKworLyoqIFN1Ym1pdCBkYXRhIGZyb20gdGhlIHN3IFRYIHF1ZXVlIHRvIHRoZSBoL3cKKyAqCisgKiBJdCBpcyBleHBlY3RlZCB0aGF0IHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHRyaWdnZXJlZCBieSBUWAorICogY29tcGxldGlvbiBpbnRlcnJ1cHQKKyAqCisgKiBccGFyYW1baW5dICAgZGV2aWNlICAgICAgICAgIE1hcGxlIGRldmljZSBpbmRleAorICovCit2b2lkIGJjbXRyX3N3cV90eF9zdWJtaXQodWludDhfdCBkZXZpY2UpOworCisjZW5kaWYgLyogX0JDTV9QQ0lFX1NXX1FVRVVFX0hfICovCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdXRpbHMvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdXRpbHMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM5MDVlYwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci91dGlscy9NYWtlZmlsZQpAQCAtMCwwICsxLDggQEAKKyMgQ29tbW9uIHV0aWxpdGllcworIworTU9EX05BTUUgPSB1dGlscworTU9EX1RZUEUgPSBsaWIKK2lmZXEgKCIkKE9TX0tFUk5FTCkiLCAibGludXgiKQorICAgIE1PRF9ERVBTID0gdXRpbHNfbGludXgKK2VuZGlmCitzcmNzID0gYmNtb2x0X3V0aWxzLmMgYmNtb2x0X2J1Zi5jIGJjbW9sdF9iaXRfdXRpbHMuYyBiY21vbHRfY29udi5jIGJjbW9sdF9zdHJpbmcuYwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3V0aWxzL2JjbW9sdF9iaXRfdXRpbHMuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci91dGlscy9iY21vbHRfYml0X3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMwYzA3ZQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci91dGlscy9iY21vbHRfYml0X3V0aWxzLmMKQEAgLTAsMCArMSwzNzAgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKworI2luY2x1ZGUgImJjbW9zX3N5c3RlbS5oIgorI2luY2x1ZGUgIm1hdGguaCIKKyNpbmNsdWRlICJiY21vbHRfYml0X3V0aWxzLmgiCisKKworLyoqIGR5bmFtaWNhbGx5IGFsbG9jYXRlIHNwYWNlIGZvciBhbiBhcnJheSBvZiBgbmJpdHMnIGJpdHMgYW5kIGluaXRhbGl6ZQorICogIHRoZSBiaXRzIHRvIGFsbCBiZSB6ZXJvLgorICoKKyAqIFxwYXJhbVtvdXRdICBidiAgICAgIHBvaW50ZXIgdG8gYSBiaXRfdmVjdG9yIHN0cnVjdC4KKyAqIFxwYXJhbVtpbl0gICBuYml0cyAgIG51bWJlciBvZiBiaXRzIHRvIGFsbG9jYXRlLgorICogXHJldHVybiAgICAgIEZBTFNFIGlmIHNwYWNlIHdhcyBub3QgYXZhaWxhYmxlLCBvdGhlcndpc2UgVFJVRS4KKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYnZfbmV3KGJpdF92ZWN0b3IgKmJ2LCBjb25zdCB1aW50MzJfdCBuYml0cykKK3sKKyAgICB1aW50MzJfdCBud29yZHMgPSBCQ01PU19ESVZJREVfUk9VTkRfVVAobmJpdHMsIChCSVRTX1NaKSk7CisKKyAgICBidi0+bmJpdHMgID0gbmJpdHM7CisgICAgYnYtPnZlY3RvciA9IChidl9iaXRzICopY2FsbG9jKG53b3Jkcywgc2l6ZW9mKGJ2X2JpdHMpKTsKKyAgICByZXR1cm4gKGJ2LT52ZWN0b3IgIT0gTlVMTCk7Cit9CisKKworLyoqIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGBvZmZzZXQndGggYml0IGVsZW1lbnQgb2YgdGhlIGJpdCB2ZWN0b3IuCisgKgorICogXHBhcmFtW2luXSAgIGJ2ICAgICAgcG9pbnRlciB0byBhIGJpdF92ZWN0b3Igc3RydWN0LgorICogXHBhcmFtW2luXSAgIG9mZnNldCAgb2Zmc2V0IG9mIGJpdCB0byB0ZXN0LgorICogXHJldHVybiAgICAgIEZBTFNFIGlmIHRoZSBiaXQgb2Zmc2V0IGlzIG91dCBvZiByYW5nZSwgb3RoZXJ3aXNlIFRSVUUuCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2J2X2dldChjb25zdCBiaXRfdmVjdG9yICpidiwgY29uc3QgdWludDMyX3Qgb2Zmc2V0KQoreworICAgIGJjbW9zX2Jvb2wgICAgcnYgPSBCQ01PU19GQUxTRTsKKworICAgIGlmIChvZmZzZXQgPD0gYnYtPm5iaXRzKQorICAgIHsKKyAgICAgICAgcnYgPSB0ZXN0X2JpdHNfc2V0KGJ2LT52ZWN0b3JbKG9mZnNldCAvIEJJVFNfU1opXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IChvZmZzZXQgJSBCSVRTX1NaKSkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9FUlIoIm91dCBvZiByYW5nZSAldVxuIiwgb2Zmc2V0KTsKKyAgICB9CisgICAgcmV0dXJuIHJ2OworfQorCisKKy8qKiBzZXQgb3IgY2xlYXIgdGhlIGJpdCBpbiBwb3NpdGlvbiBgb2Zmc2V0JyBvZiB0aGUgYml0IHZlY3Rvci4KKyAqICBidi0+dmVjdG9yW2JpdF9wb3NdIGlzIHRvIGJlIHNldCAoYXNzaWduZWQgdG8gMSkgaWYgdmFsdWUgaXMgVFJVRSwKKyAqICBvdGhlcndpc2UgaXQgaXMgdG8gYmUgY2xlYXJlZCAoYXNzaWduZWQgdG8gMCkuCisgKgorICogXHBhcmFtW2luXSAgIGJ2ICAgICAgcG9pbnRlciB0byBhIGJpdF92ZWN0b3Igc3RydWN0LgorICogXHBhcmFtW2luXSAgIG9mZnNldCAgb2Zmc2V0IG9mIGJpdCB0byBzZXQgb3IgY2xlYXIuCisgKiBccGFyYW1baW5dICAgdmFsdWUgICBib29sZWFuIHZhbHVlLiBUUlVFIGZvciBzZXQsIEJDTU9TX0ZBTFNFIGZvciBjbGVhci4KKyAqIFxyZXR1cm4gICAgICBGQUxTRSBpZiB0aGUgYml0IG9mZnNldCBpcyBvdXQgb2YgcmFuZ2UsIG90aGVyd2lzZSBUUlVFLgorICovCit2b2lkIGJjbW9sdF9idl9hc3NpZ24oYml0X3ZlY3RvciAgICAgICAqYnYsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgICAgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJjbW9zX2Jvb2wgIHZhbHVlKQoreworICAgIGlmIChvZmZzZXQgPD0gYnYtPm5iaXRzKQorICAgIHsKKyAgICAgICAgaWYgKHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBidi0+dmVjdG9yW29mZnNldCAvIEJJVFNfU1pdIHw9ICgxIDw8IChvZmZzZXQgJSBCSVRTX1NaKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBidi0+dmVjdG9yW29mZnNldCAvIEJJVFNfU1pdICY9IH4oMSA8PCAob2Zmc2V0ICUgQklUU19TWikpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX0VSUigib3V0IG9mIHJhbmdlICV1XG4iLCBvZmZzZXQpOworICAgIH0KK30KKworCisvKiogdG9nZ2xlIHRoZSBiaXQgaW4gcG9zaXRpb24gYG9mZnNldCcgb2YgdGhlIGJpdCB2ZWN0b3IuCisgKiAgaS5lLiBpZiBpdCB3YXMgMSBpdCBpcyAwOyBpZiBpdCB3YXMgMCBpdCBpcyAxLgorICoKKyAqIFxwYXJhbVtpbl0gICBidiAgICAgIHBvaW50ZXIgdG8gYSBiaXRfdmVjdG9yIHN0cnVjdC4KKyAqIFxwYXJhbVtpbl0gICBvZmZzZXQgIG9mZnNldCBvZiBiaXQgdG8gdG9nZ2xlLgorICogXHJldHVybiAgICAgIEZBTFNFIGlmIHRoZSBiaXQgb2Zmc2V0IGlzIG91dCBvZiByYW5nZSwgb3RoZXJ3aXNlIFRSVUUuCisgKi8KK3ZvaWQgYmNtb2x0X2J2X3RvZ2dsZShiaXRfdmVjdG9yICpidiwgY29uc3QgdWludDMyX3Qgb2Zmc2V0KQoreworICAgIGlmIChvZmZzZXQgPD0gYnYtPm5iaXRzKQorICAgIHsKKyAgICAgICAgYnYtPnZlY3RvcltvZmZzZXQgLyBCSVRTX1NaXSBePSAoMSA8PCAob2Zmc2V0ICUgQklUU19TWikpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9FUlIoIm91dCBvZiByYW5nZSAldVxuIiwgb2Zmc2V0KTsKKyAgICB9Cit9CisKKworLyoqIGNvcHkgYml0IHZlY3RvciBmcm9tICdzcmMnIHRvICdkc3QnLgorICoKKyAqIFxwYXJhbVtvdXRdICBkc3QgICAgIHBvaW50ZXIgdG8gYSBiaXRfdmVjdG9yIHN0cnVjdCB0byBjb3B5IHRvLgorICogXHBhcmFtW2luXSAgIHNyYyAgICAgcG9pbnRlciB0byBhIGJpdF92ZWN0b3Igc3RydWN0IHRvIGNvcHkgZnJvbS4KKyAqIFxwYXJhbVtpbl0gICBuYml0cyAgIG51bWJlciBvZiBiaXRzIHRvIGNvcHkuCisgKiBccmV0dXJuICAgICAgbm9uZS4KKyAqLwordm9pZCBiY21vbHRfYnZfY29weShiaXRfdmVjdG9yICAgICAgICAqZHN0LCAKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYml0X3ZlY3RvciAgKnNyYywgCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90ICAgICBuYml0cykKK3sKKyAgICB1aW50MzJfdCAgaTsKKyAgICB1aW50MzJfdCAgbndvcmRzICAgID0gbmJpdHMgLyBCSVRTX1NaOworICAgIGJ2X2JpdHMgICBiaXRfcmVtYWluZGVyID0gbmJpdHMgJSBCSVRTX1NaOworCisgICAgaWYgKChuYml0cyA8PSBkc3QtPm5iaXRzKSAmJiAobmJpdHMgPD0gc3JjLT5uYml0cykpCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbndvcmRzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGRzdC0+dmVjdG9yW2ldID0gc3JjLT52ZWN0b3JbaV07CisgICAgICAgIH0KKworICAgICAgICBpZiAoMCAhPSBiaXRfcmVtYWluZGVyKQorICAgICAgICB7CisgICAgICAgICAgICBkc3QtPnZlY3Rvcltud29yZHNdID0gKGRzdC0+dmVjdG9yW253b3Jkc10gJiB+KCgyXmJpdF9yZW1haW5kZXIpIC0gMSkpIHwKKyAgICAgICAgICAgICAgICAoc3JjLT52ZWN0b3JbbndvcmRzXSAmICgoMl5iaXRfcmVtYWluZGVyKSAtIDEpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9FUlIoIm91dCBvZiByYW5nZSAldVxuIiwgbmJpdHMpOworICAgIH0KK30KKworCisvKiogUHJpbnQgYml0IHBhdHRlcm4gb2Ygd29yZCBGT1JNQVRURUQgdG8gc3RyaW5nLgorICoKKyAqIFxwYXJhbVtpbl0gICB2YWx1ZSAgIHZhbHVlIHRvIHRyYW5zZm9ybSB0byBiaXQgc3RyaW5nLgorICogXHBhcmFtW2luXSAgIGJpdGNudCAgY291bnQgb2YgYml0cyB0byBiZSBzaG93bi4KKyAqIFxwYXJhbVtvdXRdICBvdXRzdHIgIHBvaW50ZXIgdG8gYSBvdXRwdXQgYnVmZmVyIHRvIHN0b3JlIHRoZSBzdHJpbmcuCisgKiBccmV0dXJuICAgICAgbm9uZQorICogXHdhcm5pbmcgICAgIHRoaXMgZm4gZG9lc24ndCBjaGVjayB0aGUgc2l6ZSBvZiAnb3V0c3RyJy4KKyAqICAgICAgICAgICAgICB0aGUgY2FsbGVyIHNob3VsZCBlbnN1cmUgJ291dHN0cicgaGFzIGVub3VnaCByb29tIGZvciB0aGUKKyAqICAgICAgICAgICAgICBiaXQgc3RyaW5nLCBzcGFjZSBjaGFyYWN0ZXJzIGFuZCBudWxsIHRlcm1pbmF0b3IuCisgKi8KK3ZvaWQgYmNtb2x0X2JpdF9zdHJpbmcoY29uc3QgYnZfYml0cyB2YWx1ZSwgY29uc3QgdWludDMyX3QgYml0Y250LCBjaGFyICpvdXRzdHIpCit7CisgICAgdWludDMyX3QgIG9mZnNldDsKKworICAgIGlmIChiaXRjbnQgPD0gQklUU19TWikKKyAgICB7CisgICAgICAgIGZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgYml0Y250OyBvZmZzZXQrKykKKyAgICAgICAgeworICAgICAgICAgICAgKm91dHN0cisrID0gKCh2YWx1ZSA+PiBvZmZzZXQpICYgMSkgKyAnMCc7CisgICAgICAgICAgICBpZiAoKCgob2Zmc2V0ICsgMSkgJSA0KSA9PSAwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqb3V0c3RyKysgPSAnICc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqb3V0c3RyID0gJ1wwJzsKK30KKworCisvKiogUHJpbnQgYWxsIGJpdHMgaW4gdGhlIGJpdCB2ZWN0b3IuCisgKgorICogXHBhcmFtW2luXSAgIGJ2ICAgICAgcG9pbnRlciB0byBhIGJpdF92ZWN0b3Igc3RydWN0LgorICogXHJldHVybiAgICAgIG5vbmUuCisgKi8KK3ZvaWQgYmNtb2x0X2J2X2R1bXAoY29uc3QgYml0X3ZlY3RvciAqYnYpCit7CisgICAgdWludDMyX3QgIGlkeDsgICAgICAgICAgICAgICAgICAgICAgICAvKiB3b3JkIGlkeCAqLworICAgIGNoYXIgICAgICBvdXRzdHJbQklUU19TWiArIDggKyAxXTsgICAgLyogOCBzcGFjZXMgKyBudWxsICovCisKKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IChidi0+bmJpdHMgLyBCSVRTX1NaKTsgaWR4KyspCisgICAgeworICAgICAgICBiY21vbHRfYml0X3N0cmluZyhidi0+dmVjdG9yW2lkeF0sIEJJVFNfU1osIG91dHN0cik7CisgICAgICAgIGJjbW9zX3ByaW50ZigiJXNcbiIsIG91dHN0cik7CisgICAgfQorCisgICAgaWYgKDAgIT0gKGJ2LT5uYml0cyAlIEJJVFNfU1opKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2JpdF9zdHJpbmcoYnYtPnZlY3RvcltpZHhdLCAoYnYtPm5iaXRzICUgQklUU19TWiksIG91dHN0cik7CisgICAgICAgIGJjbW9zX3ByaW50ZigiJXNcbiIsIG91dHN0cik7CisgICAgfQorfQorCisKKy8qKiBDb3VudCB0aGUgbnVtYmVyIG9mIGJpdHMgc2V0IGluIGEgbG9uZyBpbnRlZ2VyLgorICoKKyAqIFxwYXJhbVtpbl0gICBudW0gICAgIGludGVnZXIgdmFsdWUuCisgKiBccmV0dXJuICAgICAgbnVtYmVyIG9mIGJpdHMgc2V0LgorICovCit1aW50MzJfdCBiY21vbHRfYml0X2NvdW50KHVpbnQzMl90IG51bSkKK3sKKyAgICBudW0gPSAoKG51bSAmIDB4QUFBQUFBQUFMKSA+PiAgMSkgKyAobnVtICYgMHg1NTU1NTU1NUwpOworICAgIG51bSA9ICgobnVtICYgMHhDQ0NDQ0NDQ0wpID4+ICAyKSArIChudW0gJiAweDMzMzMzMzMzTCk7CisgICAgbnVtID0gKChudW0gJiAweEYwRjBGMEYwTCkgPj4gIDQpICsgKG51bSAmIDB4MEYwRjBGMEZMKTsKKyAgICBudW0gPSAoKG51bSAmIDB4RkYwMEZGMDBMKSA+PiAgOCkgKyAobnVtICYgMHgwMEZGMDBGRkwpOworICAgIG51bSA9ICgobnVtICYgMHhGRkZGMDAwMEwpID4+IDE2KSArIChudW0gJiAweDAwMDBGRkZGTCk7CisgICAgcmV0dXJuIG51bTsKK30KKworCisvKiogQ291bnQgdGhlIG51bWJlciBvZiBiaXRzIHNldCBpbiB0aGUgd2hvbGUgYml0IHZlY3Rvci4KKyAqCisgKiBccGFyYW1baW5dICAgYnYgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgdmVjdG9yIHN0cnVjdC4KKyAqIFxyZXR1cm4gICAgICBudW1iZXIgb2YgYml0cyBzZXQuCisgKi8KK3VpbnQzMl90IGJjbW9sdF9idl9iaXRfY291bnQoY29uc3QgYml0X3ZlY3RvciAqYnYpCit7CisgICAgdWludDMyX3QgIG53b3JkcyA9IEJDTU9TX0RJVklERV9ST1VORF9VUChidi0+bmJpdHMsIChCSVRTX1NaKSk7CisgICAgdWludDMyX3QgIGNudCA9IDA7CisKKyAgICB3aGlsZSAoMCAhPSBud29yZHMtLSkKKyAgICB7CisgICAgICAgIGNudCArPSBiY21vbHRfYml0X2NvdW50KGJ2LT52ZWN0b3JbbndvcmRzXSk7CisgICAgfQorCisgICAgcmV0dXJuIGNudDsKK30KKworCisKKy8qKiBDb3B5IGJpdCByYW5nZSBmcm9tIGEgMzItYml0IHdvcmQgYXJyYXkgdG8gYW4gYXJiaXRyYXJ5IGJpdCBwb3NpdGlvbiBvZgorICogIHRoZSBkZXN0aW5hdGlvbiAzMi1iaXQgd29yZCBhcnJheS4KKyAqCisgKiBccGFyYW1baW5dICAgZHN0ICAgICAgICAgICAgIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICogXHBhcmFtW2luXSAgIGRzdF9ieXRlcyAgICAgICBkZXN0aW5hdGlvbiBidWZmZXIgc2l6ZSBpbiBieXRlcworICogXHBhcmFtW2luXSAgIGRzdF9iaXRfcG9zICAgICBsZWFzdCBiaXQgcG9zaXRpb24gdG8gZGVzdAorICogXHBhcmFtW2luXSAgIHNyYyAgICAgICAgICAgICBzb3VyY2UgYnVmZmVyCisgKiBccGFyYW1baW5dICAgbl9iaXRzICAgICAgICAgIGhvdyBtYW55IGJpdHMgdG8gY29weSBmcm9tIHNvdXJjZQorICogXG5vdGUgICAgICAgIHNyYyBpcyBpbiBsaXR0bGUgZW5kaWFuIGFuZCBkc3QgaXMgaW4gYmlnIGVuZGlhbi4KKyAqLwordm9pZCBiY21vc19iaXRfcmFuZ2Vfc2V0KHVpbnQzMl90ICpkc3QsIHVpbnQzMl90IGRzdF9ieXRlcywgdWludDE2X3QgZHN0X2JpdF9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnNyYywgdWludDE2X3Qgbl9iaXRzKQoreworICAgIHVpbnQxNl90ICAgIGJwID0gZHN0X2JpdF9wb3M7CisgICAgdWludDE2X3QgICAgbGVuOworICAgIHVpbnQzMl90ICAgIHdwOworICAgIHVpbnQzMl90ICAgIG1hc2s7CisgICAgdWludDMyX3QgICAgc3JjX2lkeDsKKyAgICB1aW50MzJfdCAgICBkc3RfaWR4OworCisgICAgd3AgPSBicCAvIDMyOworICAgIGJwID0gYnAgJiAoMzIgLSAxKTsKKyAgICBzcmNfaWR4ID0gMDsKKworICAgIGZvciAobGVuID0gbl9iaXRzOyBsZW4gPiAwOyBsZW4gLT0gMzIpCisgICAgeworICAgICAgICBpZiAoYnAgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgbWFzayA9IChsZW4gPCAzMikgPyAoMSA8PCBsZW4pIC0gMSA6IDB4RkZGRkZGRkY7CisgICAgICAgICAgICBkc3RfaWR4ID0gd3A7CisgICAgICAgICAgICBkc3RbZHN0X2lkeF0gJj0gfihtYXNrIDw8IGJwKTsKKyAgICAgICAgICAgIGRzdFtkc3RfaWR4XSB8PSBzcmNbc3JjX2lkeF0gPDwgYnA7CisgICAgICAgICAgICB3cCsrOworICAgICAgICAgICAgaWYgKGxlbiA+ICgzMiAtIGJwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkc3RfaWR4ID0gd3A7CisgICAgICAgICAgICAgICAgZHN0W2RzdF9pZHhdICY9IH4obWFzayA+PiAoMzIgLSBicCkpOworICAgICAgICAgICAgICAgIGRzdFtkc3RfaWR4XSB8PSBzcmNbc3JjX2lkeF0gPj4gKDMyIC0gYnApICYgKCgxIDw8IGJwKSAtIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZHN0X2lkeCA9IHdwOworICAgICAgICAgICAgaWYgKGxlbiA8IDMyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1hc2sgPSAoMSA8PCBsZW4pIC0gMTsKKyAgICAgICAgICAgICAgICBkc3RbZHN0X2lkeF0gJj0gfm1hc2s7CisgICAgICAgICAgICAgICAgZHN0W2RzdF9pZHhdIHw9IHNyY1tzcmNfaWR4XSA8PCBicDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkc3RbZHN0X2lkeF0gPSBzcmNbc3JjX2lkeF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cCsrOworICAgICAgICB9CisgICAgICAgIHNyY19pZHgrKzsKKyAgICB9Cit9CisKKworLyoqIEdldCBiaXQgcmFuZ2UgYXQgYW4gYXJiaXRyYXJ5IGJpdCBwb3NpdGlvbiBvZiBhIDMyLWJpdCB3b3JkIGFycmF5CisgKiAKKyAqIFxwYXJhbVtpbl0gICBzcmMgICAgICAgICAgICAgc291cmNlIGJ1ZmZlciAoZS5nLiBkYXRhcG9ydCkKKyAqIFxwYXJhbVtpbl0gICBzcmNfYnl0ZXMgICAgICAgc291cmNlIGJ1ZmZlciBzaXplIGluIGJ5dGVzCisgKiBccGFyYW1baW5dICAgc3JjX2JpdF9wb3MgICAgIGxlYXN0IGJpdCBwb3NpdGlvbiBvZiB0aGUgc291cmNlCisgKiBccGFyYW1baW5dICAgZHN0ICAgICAgICAgICAgIGRlc3RpbmF0aW9uIGJ1ZmZlciB0byBzdG9yZSB0aGUgYml0IHZhbHVlCisgKiBccGFyYW1baW5dICAgbl9iaXRzICAgICAgICAgIGhvdyBtYW55IGJpdHMgdG8gY29weSBmcm9tIHNyb3VjZQorICogXG5vdGUgICAgICAgIHNyYyBpcyBpbiBiaWcgZW5kaWFuIGFuZCBkc3QgaXMgaW4gbGl0dGxlIGVuZGlhbi4KKyAqLwordm9pZCBiY21vc19iaXRfcmFuZ2VfZ2V0KGNvbnN0IHVpbnQzMl90ICpzcmMsIHVpbnQzMl90IHNyY19ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzcmNfYml0X3BvcywgdWludDMyX3QgKmRzdCwgdWludDE2X3Qgbl9iaXRzKQoreworICAgIHVpbnQxNl90ICAgIGJwID0gc3JjX2JpdF9wb3M7ICAgLyogZm9yIHJlYWRhYmlsaXR5ICovCisgICAgdWludDE2X3QgICAgbGVuID0gbl9iaXRzOworICAgIHVpbnQzMl90ICAgIHdwOworICAgIHVpbnQzMl90ICAgIHNyY19pZHg7CisgICAgdWludDMyX3QgICAgZHN0X2lkeDsKKworICAgIGlmIChuX2JpdHMgPT0gMSkKKyAgICB7CisgICAgICAgIHdwID0gYnAgLyAzMjsKKyAgICAgICAgYnAgPSBicCAmICgzMiAtIDEpOworICAgICAgICBzcmNfaWR4ID0gQkNNT1NfRElWSURFX1JPVU5EX1VQKHNyY19ieXRlcywgNCkgLSAxIC0gd3A7CisgICAgICAgIGRzdFswXSA9ICgoc3JjW3NyY19pZHhdICYgKDEgPDwgYnApKSAhPSAwKSA/IDE6IDA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB3cCA9IGJwIC8gMzI7CisgICAgYnAgPSBicCAmICgzMiAtIDEpOworICAgIGRzdF9pZHggPSAwOworCisgICAgZm9yICg7IGxlbiA+IDA7IGxlbiAtPSAzMikKKyAgICB7CisgICAgICAgIGlmIChicCAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBzcmNfaWR4ID0gQkNNT1NfRElWSURFX1JPVU5EX1VQKHNyY19ieXRlcywgNCkgLSAxIC0gd3A7CisgICAgICAgICAgICBkc3RbZHN0X2lkeF0gPSBzcmNbc3JjX2lkeF0gPj4gYnAgJiAoKDEgPDwgKDMyIC0gYnApKSAtIDEpOworICAgICAgICAgICAgd3ArKzsKKyAgICAgICAgICAgIGlmIChsZW4gPiAoMzIgLSBicCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3JjX2lkeCA9IEJDTU9TX0RJVklERV9ST1VORF9VUChzcmNfYnl0ZXMsIDQpIC0gMSAtIHdwOworICAgICAgICAgICAgICAgIGRzdFtkc3RfaWR4XSB8PSBzcmNbc3JjX2lkeF0gPDwgKDMyIC0gYnApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc3JjX2lkeCA9IEJDTU9TX0RJVklERV9ST1VORF9VUChzcmNfYnl0ZXMsIDQpIC0gMSAtIHdwOworICAgICAgICAgICAgZHN0W2RzdF9pZHhdID0gc3JjW3NyY19pZHhdOworICAgICAgICAgICAgd3ArKzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsZW4gPCAzMikKKyAgICAgICAgeworICAgICAgICAgICAgZHN0W2RzdF9pZHhdICY9ICgoMSA8PCBsZW4pIC0gMSk7CisgICAgICAgIH0KKyAgICAgICAgZHN0X2lkeCsrOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3V0aWxzL2JjbW9sdF9iaXRfdXRpbHMuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci91dGlscy9iY21vbHRfYml0X3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk3MTI5MgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci91dGlscy9iY21vbHRfYml0X3V0aWxzLmgKQEAgLTAsMCArMSwyNDIgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKy8qKgorICogYmNtb2x0X2JpdF91dGlscy5oCisgKiAgQ3JlYXRlZCBvbjogMDMvMTAvMjAxNAorICogICAgICBBdXRob3I6IGNwYXJrMQorICoKKyAqIFRoaXMgYml0IHZlY3RvciBpbXBsZW1lbnRhdGlvbiBpcyB1c2VkIGZvciB0aGUgRVBPTiBlbmNyeXB0aW9uLgorICogVGhlcmUgaXMgYSBjZXJ0YWluIGhhcmR3YXJlIHJlc3RyaWN0aW9uIHRoYXQgdGhlIGdsb2JhbCBlbmNyeXB0aW9uIG1vZGUKKyAqIGNhbiBub3QgYmUgY2hhbmdlZCB3aGVuIGEgbGluayBlbmNyeXB0aW9uIGlzIGNvbmZpZ3VyZWQgZm9yIGEgZGlmZmVyZW50CisgKiBlbmNyeXB0aW9uIG1vZGUuCisgKiBMaWtld2lzZSwgdGhlIGxpbmsgZW5jcnlwdGlvbiBtb2RlIGNhbiBub3QgYmUgY2hhbmdlZCBpZiB0aGUgZ2xvYmFsCisgKiBlbmNyeXB0aW9uIG1vZGUgaXMgc2V0IHRvIG90aGVyIG1vZGUuCisgKiBUaGVyZWZvcmUsIHdoZW4gdGhlIGhvc3QgdHJpZXMgdG8gY2hhbmdlIGFueSBvZiB0aGVtLCB0aGUgT0xUIG5lZWRzIHRvCisgKiBjaGVjayBlaXRoZXIgdGhlIGdsb2JhbCBlbmNyeXB0aW9uIG1vZGUgb3IgdGhlIGxpbmsgZW5jcnlwdGlvbiBtb2RlCisgKiBiZWZvcmUgYXBwbHlpbmcgdGhlIGNoYW5nZS4KKyAqIEluIHRoZSBvbGQgaW1wbGVtZW50YXRpb24gKGxpa2UgUGlvbmVlciksIHRoZSBmaXJtd2FyZSBpdGVyYXRlcyB0aHJvdWdoCisgKiBldmVyeSBsaW5rIHJlY29yZHMgb2YgZWFjaCBQT04gcG9ydCBhbmQgY2hlY2sgdGhlIGVuY3J5cHRpb24gbW9kZSBvZiBlYWNoLgorICogVGhpcyBpcyB2ZXJ5IGluZWZmaWNpZW50IGFuZCB0aW1lIGNvbnN1bWluZy4KKyAqIFRoZSBob3N0IG1heSB3YW50IHRvIGtub3cgaG93IG1hbnkgbGlua3MgYXJlIGVuYWJsZWQgZm9yIHRoZSBlbmNyeXB0aW9uLAorICogb3Igd2hpY2ggbGluayBpcyBlbmFibGVkLCBldGMuCisgKiBJIHRob3VnaHQgdGhhdCBhIGJpdCB2ZWN0b3IgaW1wbGVtZW50YXRpb24gaXMgYmVzdCBzYXRpc2ZpZXMuCisgKiBBbHNvLCB0aGlzIGltcGxlbWVudGF0aW9uIGV4YWN0bHkgcmVmbGVjdHMgdGhlIElDIGltcGxlbWVudGF0aW9uLCBzbyB3ZQorICogY2FuIHVzZSBpdCB0byBtaXJyb3IgdGhlIGhhcmR3YXJlIHN0YXR1cy4KKyAqCisgKi8KKworI2lmbmRlZiBCQ01PTFRfQklUX1VUSUxTX0gKKyNkZWZpbmUgQkNNT0xUX0JJVF9VVElMU19ICisKKworI2luY2x1ZGUgImJjbW9zX3N5c3RlbS5oIgorCisKKy8qIHRoZSBjdXJyZW50IChkcmFmdCkgZGVzaWduIG9mIHRoZSBBU0lDIHVzZXMgMzItYml0IGJpdG1hcCBkYXRhIHBvcnQgKi8KK3R5cGVkZWYgdWludDMyX3QgICAgYnZfYml0czsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50MzJfdCAgbmJpdHM7CisgICAgYnZfYml0cyAgKnZlY3RvcjsKK30gYml0X3ZlY3RvcjsKKworCisjZGVmaW5lIEJJVFNfU1ogICAgIChzaXplb2YoYnZfYml0cykgKiBDSEFSX0JJVCkKKworI2RlZmluZSBCSVRTX1NFVCh2YWwsIG1hc2spICgoKHZhbCkgJiAobWFzaykpID09IChtYXNrKSkKKworLyoqIFRlc3QgaWYgYWxsIGdpdmVuIGJpdHMgYXJlIHNldCBpbiB0aGUgZ2l2ZW4gZGF0YSB3b3JkCisgKiBccGFyYW1baW5dICAgd29yZCAgICBHaXZlbiBkYXRhIHdvcmQgdG8gdGVzdAorICogXHBhcmFtW2luXSAgIG1hc2sgICAgVGVzdCBtYXNrCisgKiBccmV0dXJuICAgICAgVFJVRSBpZiBhbGwgdGhlIGJpdHMgaW4gdGhlIGJpdE1hc2sgYXJlIHNldAorICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgdGVzdF9iaXRzX3NldCh1aW50MzJfdCB3b3JkLCB1aW50MzJfdCBtYXNrKQoreworICAgIHJldHVybiAoKHdvcmQgJiBtYXNrKSA9PSBtYXNrKTsKK30KKworLyoqIFRlc3QgaWYgYWxsIGdpdmVuIGJpdHMgYXJlIGNsZWFyIGluIHRoZSBnaXZlbiBkYXRhIHdvcmQKKyAqIFxwYXJhbSAgICAgICB3b3JkICAgIEdpdmVuIHdvcmQgdG8gdGVzdAorICogXHBhcmFtICAgICAgIG1hc2sgVGVzdCBtYXNrCisgKiBccmV0dXJuICAgICAgVFJVRSBpZiBhbGwgdGhlIGJpdHMgZ2l2ZW4gYnkgYml0TWFzayBhcmUgY2xlYXIKKyAqLworc3RhdGljIGlubGluZSBiY21vc19ib29sIHRlc3RfYml0c19jbGVhcih1aW50MzJfdCB3b3JkLCB1aW50MzJfdCBtYXNrKQoreworICAgIHJldHVybiAod29yZCAmIG1hc2spID09IDA7Cit9CisKKy8qKiBUZXN0IHdoZXRoZXIgYW55IG9mIHRoZSBnaXZlbiBiaXRzIGFyZSBzZXQgaW4gYSB2YWx1ZQorICogXHBhcmFtW2luXSAgIHZhbCAgICAgVGhlIHZhbHVlIHRvIHRlc3QKKyAqIFxwYXJhbVtpbl0gICBiaXRzICAgIFRoZSBiaXRzIHRvIHRlc3QgZm9yCisgKiBccmV0dXJuICAgICAgVFJVRSBpZiBhbnkgb2YgdGhlIGJpdHMgYXJlIHNldCBpbiB0aGUgdmFsdWUsIEZBTFNFIG90aGVyd2lzZQorICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgdGVzdF9iaXRzX2FueSh1aW50MzJfdCB2YWwsIHVpbnQzMl90IGJpdHMpCit7CisgICAgcmV0dXJuICh2YWwgJiBiaXRzKSAhPSAwOworfQorCisKKy8qKiByZXR1cm4gdHJ1ZSBpZiBvbmx5IG9uZSBiaXQgaXMgc2V0IGZvciBhIGdpdmVuIGludGVnZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfYm9vbCBpc19vbmVfYml0X3NldCh1aW50MzJfdCBudW1iZXIpCit7CisgICAgcmV0dXJuIChudW1iZXIgJiAobnVtYmVyIC0gMSkpID09IDA7Cit9CisKKworCisvKiogZHluYW1pY2FsbHkgYWxsb2NhdGUgc3BhY2UgZm9yIGFuIGFycmF5IG9mIGBuYml0cycgYml0cyBhbmQgaW5pdGFsaXplCisgKiAgdGhlIGJpdHMgdG8gYWxsIGJlIHplcm8uCisgKgorICogXHBhcmFtW291dF0gIGJ2ICAgICAgcG9pbnRlciB0byBhIGJpdF92ZWN0b3Igc3RydWN0LgorICogXHBhcmFtW2luXSAgIG5iaXRzICAgbnVtYmVyIG9mIGJpdHMgdG8gYWxsb2NhdGUuCisgKiBccmV0dXJuICAgICAgRkFMU0UgaWYgc3BhY2Ugd2FzIG5vdCBhdmFpbGFibGUsIG90aGVyd2lzZSBUUlVFLgorICovCitiY21vc19ib29sIGJjbW9sdF9idl9uZXcoYml0X3ZlY3RvciAqYnYsIGNvbnN0IHVpbnQzMl90IG5iaXRzKTsKKworCisvKiogcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgYG9mZnNldCd0aCBiaXQgZWxlbWVudCBvZiB0aGUgYml0IHZlY3Rvci4KKyAqCisgKiBccGFyYW1baW5dICAgYnYgICAgICBwb2ludGVyIHRvIGEgYml0X3ZlY3RvciBzdHJ1Y3QuCisgKiBccGFyYW1baW5dICAgb2Zmc2V0ICBvZmZzZXQgb2YgYml0IHRvIHRlc3QuCisgKiBccmV0dXJuICAgICAgRkFMU0UgaWYgdGhlIGJpdCBvZmZzZXQgaXMgb3V0IG9mIHJhbmdlLCBvdGhlcndpc2UgVFJVRS4KKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYnZfZ2V0KGNvbnN0IGJpdF92ZWN0b3IgKmJ2LCBjb25zdCB1aW50MzJfdCBvZmZzZXQpOworCisKKy8qKiBzZXQgb3IgY2xlYXIgdGhlIGJpdCBpbiBwb3NpdGlvbiBgb2Zmc2V0JyBvZiB0aGUgYml0IHZlY3Rvci4KKyAqICBidi0+dmVjdG9yW2JpdF9wb3NdIGlzIHRvIGJlIHNldCAoYXNzaWduZWQgdG8gMSkgaWYgdmFsdWUgaXMgVFJVRSwKKyAqICBvdGhlcndpc2UgaXQgaXMgdG8gYmUgY2xlYXJlZCAoYXNzaWduZWQgdG8gMCkuCisgKgorICogXHBhcmFtW2luXSAgIGJ2ICAgICAgcG9pbnRlciB0byBhIGJpdF92ZWN0b3Igc3RydWN0LgorICogXHBhcmFtW2luXSAgIG9mZnNldCAgb2Zmc2V0IG9mIGJpdCB0byBzZXQgb3IgY2xlYXIuCisgKiBccGFyYW1baW5dICAgdmFsdWUgICBib29sZWFuIHZhbHVlLiBUUlVFIGZvciBzZXQsIEZBTFNFIGZvciBjbGVhci4KKyAqIFxyZXR1cm4gICAgICBGQUxTRSBpZiB0aGUgYml0IG9mZnNldCBpcyBvdXQgb2YgcmFuZ2UsIG90aGVyd2lzZSBUUlVFLgorICovCit2b2lkIGJjbW9sdF9idl9hc3NpZ24oYml0X3ZlY3RvciAqYnYsIGNvbnN0IHVpbnQzMl90IG9mZnNldCwgY29uc3QgYmNtb3NfYm9vbCB2YWx1ZSk7CisKKworLyoqIHNldCBvciBjbGVhciAnbmJpdHMnIGJpdHMgb2YgZ2l2ZW4gYml0IHZlY3Rvci4KKyAqCisgKiBccGFyYW1baW5dICAgYnYgICAgICBwb2ludGVyIHRvIGEgYml0X3ZlY3RvciBzdHJ1Y3QuCisgKiBccGFyYW1baW5dICAgbmJpdHMgICBudW1iZXIgb2YgYml0cyB0byBzZXQgb3IgY2xlYXIuCisgKiBccGFyYW1baW5dICAgdmFsdWUgICBib29sZWFuIHZhbHVlLiBUUlVFIGZvciBzZXQsIEZBTFNFIGZvciBjbGVhci4KKyAqIFxyZXR1cm4gICAgICBGQUxTRSBpZiB0aGUgYml0IG9mZnNldCBpcyBvdXQgb2YgcmFuZ2UsIG90aGVyd2lzZSBUUlVFLgorICovCit2b2lkIGJ2X2Fzc2lnbl9uYml0cyhiaXRfdmVjdG9yICpidiwgY29uc3QgdWludDMyX3QgbmJpdHMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBiY21vc19ib29sIHZhbHVlKTsKKworCisvKiogdG9nZ2xlIHRoZSBiaXQgaW4gcG9zaXRpb24gYG9mZnNldCcgb2YgdGhlIGJpdCB2ZWN0b3IuCisgKiAgaS5lLiBpZiBpdCB3YXMgMSBpdCBpcyAwOyBpZiBpdCB3YXMgMCBpdCBpcyAxLgorICoKKyAqIFxwYXJhbVtpbl0gICBidiAgICAgIHBvaW50ZXIgdG8gYSBiaXRfdmVjdG9yIHN0cnVjdC4KKyAqIFxwYXJhbVtpbl0gICBvZmZzZXQgIG9mZnNldCBvZiBiaXQgdG8gdG9nZ2xlLgorICogXHJldHVybiAgICAgIEZBTFNFIGlmIHRoZSBiaXQgb2Zmc2V0IGlzIG91dCBvZiByYW5nZSwgb3RoZXJ3aXNlIFRSVUUuCisgKi8KK3ZvaWQgYmNtb2x0X2J2X3RvZ2dsZShiaXRfdmVjdG9yICpidiwgY29uc3QgdWludDMyX3Qgb2Zmc2V0KTsKKworCisvKiogY29weSBiaXQgdmVjdG9yIGZyb20gJ3NyYycgdG8gJ2RzdCcuCisgKgorICogXHBhcmFtW291dF0gIGRzdCAgICAgcG9pbnRlciB0byBhIGJpdF92ZWN0b3Igc3RydWN0IHRvIGNvcHkgdG8uCisgKiBccGFyYW1baW5dICAgc3JjICAgICBwb2ludGVyIHRvIGEgYml0X3ZlY3RvciBzdHJ1Y3QgdG8gY29weSBmcm9tLgorICogXHBhcmFtW2luXSAgIG5iaXRzICAgbnVtYmVyIG9mIGJpdHMgdG8gY29weS4KKyAqIFxyZXR1cm4gICAgICBub25lLgorICovCit2b2lkIGJjbW9sdF9idl9jb3B5KGJpdF92ZWN0b3IgKmRzdCwgY29uc3QgYml0X3ZlY3RvciAqc3JjLCBjb25zdCB1aW50MzJfdCBuYml0cyk7CisKKworLyoqIFByaW50IGJpdCBwYXR0ZXJuIG9mIHdvcmQgRk9STUFUVEVEIHRvIHN0cmluZy4KKyAqCisgKiBccGFyYW1baW5dICAgdmFsdWUgICB2YWx1ZSB0byB0cmFuc2Zvcm0gdG8gYml0IHN0cmluZy4KKyAqIFxwYXJhbVtpbl0gICBiaXRjbnQgIGNvdW50IG9mIGJpdHMgdG8gYmUgc2hvd24uCisgKiBccGFyYW1bb3V0XSAgb3V0c3RyICBwb2ludGVyIHRvIGEgb3V0cHV0IGJ1ZmZlciB0byBzdG9yZSB0aGUgc3RyaW5nLgorICogXHJldHVybiAgICAgIG5vbmUKKyAqIFx3YXJuaW5nICAgICB0aGlzIGZuIGRvZXNuJ3QgY2hlY2sgdGhlIHNpemUgb2YgJ291dHN0cicuCisgKiAgICAgICAgICAgICAgdGhlIGNhbGxlciBzaG91bGQgZW5zdXJlICdvdXRzdHInIGhhcyBlbm91Z2ggcm9vbSBmb3IgdGhlCisgKiAgICAgICAgICAgICAgYml0IHN0cmluZywgc3BhY2UgY2hhcmFjdGVycyBhbmQgbnVsbCB0ZXJtaW5hdG9yLgorICovCit2b2lkIGJjbW9sdF9iaXRfc3RyaW5nKGNvbnN0IGJ2X2JpdHMgdmFsdWUsIGNvbnN0IHVpbnQzMl90IGJpdGNudCwgY2hhciAqb3V0c3RyKTsKKworCisvKiogUHJpbnQgYWxsIGJpdHMgaW4gdGhlIGJpdCB2ZWN0b3IuCisgKgorICogXHBhcmFtW2luXSAgIGJ2ICAgICAgcG9pbnRlciB0byBhIGJpdF92ZWN0b3Igc3RydWN0LgorICogXHJldHVybiAgICAgIG5vbmUuCisgKi8KK3ZvaWQgYmNtb2x0X2J2X2R1bXAoY29uc3QgYml0X3ZlY3RvciAqYnYpOworCisKKy8qKiBDb3VudCB0aGUgbnVtYmVyIG9mIGJpdHMgc2V0IGluIGEgbG9uZyBpbnRlZ2VyLgorICoKKyAqIFxwYXJhbVtpbl0gICBudW0gICAgIGludGVnZXIgdmFsdWUuCisgKiBccmV0dXJuICAgICAgbnVtYmVyIG9mIGJpdHMgc2V0LgorICovCit1aW50MzJfdCBiY21vbHRfYml0X2NvdW50KHVpbnQzMl90IG51bSk7CisKKworLyoqIENvdW50IHRoZSBudW1iZXIgb2YgYml0cyBzZXQgaW4gdGhlIHdob2xlIGJpdCB2ZWN0b3IuCisgKgorICogXHBhcmFtW2luXSAgIGJ2ICAgICAgcG9pbnRlciB0byB0aGUgYml0IHZlY3RvciBzdHJ1Y3QuCisgKiBccmV0dXJuICAgICAgbnVtYmVyIG9mIGJpdHMgc2V0LgorICovCit1aW50MzJfdCBiY21vbHRfYnZfYml0X2NvdW50KGNvbnN0IGJpdF92ZWN0b3IgKmJ2KTsKKworCisvKiogQ29weSBiaXQgcmFuZ2UgZnJvbSBhIDMyLWJpdCB3b3JkIGFycmF5IHRvIGFuIGFyYml0cmFyeSBiaXQgcG9zaXRpb24gb2YKKyAqICB0aGUgZGVzdGluYXRpb24gMzItYml0IHdvcmQgYXJyYXkuCisgKgorICogXHBhcmFtW2luXSAgIGRzdCAgICAgICAgICAgICBkZXN0aW5hdGlvbiBidWZmZXIKKyAqIFxwYXJhbVtpbl0gICBkc3RfYnl0ZXMgICAgICAgZGVzdGluYXRpb24gYnVmZmVyIHNpemUgaW4gYnl0ZXMKKyAqIFxwYXJhbVtpbl0gICBkc3RfYml0X3BvcyAgICAgbGVhc3QgYml0IHBvc2l0aW9uIHRvIGRlc3QKKyAqIFxwYXJhbVtpbl0gICBzcmMgICAgICAgICAgICAgc291cmNlIGJ1ZmZlcgorICogXHBhcmFtW2luXSAgIHNyY19iaXRzICAgICAgICBtYW55IGJpdHMgdG8gY29weSBmcm9tIHNvdXJjZQorICogXG5vdGUgICAgICAgIHNyYyBpcyBpbiBsaXR0bGUgZW5kaWFuIGFuZCBkc3QgaXMgaW4gYmlnIGVuZGlhbi4KKyAqLwordm9pZCBiY21vc19iaXRfcmFuZ2Vfc2V0KHVpbnQzMl90ICpkc3QsIHVpbnQzMl90IGRzdF9ieXRlcywgdWludDE2X3QgZHN0X2JpdF9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnNyYywgdWludDE2X3Qgbl9iaXRzKTsKKworLyoqIEdldCBiaXQgcmFuZ2UgYXQgYW4gYXJiaXRyYXJ5IGJpdCBwb3NpdGlvbiBvZiBhIDMyLWJpdCB3b3JkIGFycmF5CisgKgorICogXHBhcmFtW2luXSAgIHNyYyAgICAgICAgICAgICBzb3VyY2UgYnVmZmVyIChlLmcuIGRhdGFwb3J0KQorICogXHBhcmFtW2luXSAgIHNyY19ieXRlcyAgICAgICBzb3VyY2UgYnVmZmVyIHNpemUgaW4gYnl0ZXMKKyAqIFxwYXJhbVtpbl0gICBzcmNfYml0X3BvcyAgICAgbGVhc3QgYml0IHBvc2l0aW9uIG9mIHRoZSBzb3VyY2UKKyAqIFxwYXJhbVtpbl0gICBkc3QgICAgICAgICAgICAgZGVzdGluYXRpb24gYnVmZmVyIHRvIHN0b3JlIHRoZSBiaXQgdmFsdWUKKyAqIFxwYXJhbVtpbl0gICBuX2JpdHMgICAgICAgICAgaG93IG1hbnkgYml0cyB0byBjb3B5IGZyb20gc3JvdWNlCisgKiBcbm90ZSAgICAgICAgc3JjIGlzIGluIGJpZyBlbmRpYW4gYW5kIGRzdCBpcyBpbiBsaXR0bGUgZW5kaWFuLgorICovCit2b2lkIGJjbW9zX2JpdF9yYW5nZV9nZXQoY29uc3QgdWludDMyX3QgKnNyYywgdWludDMyX3Qgc3JjX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNyY19iaXRfcG9zLCB1aW50MzJfdCAqZHN0LCB1aW50MTZfdCBuX2JpdHMpOworCisKKyNlbmRpZiAgLyogQkNNT0xUX0JJVF9VVElMU19IICovCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci91dGlscy9iY21vbHRfYnVmLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdXRpbHMvYmNtb2x0X2J1Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNTdmZTkKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdXRpbHMvYmNtb2x0X2J1Zi5jCkBAIC0wLDAgKzEsMjQ3IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaW5jbHVkZSAiYmNtb2x0X2J1Zi5oIgorI2luY2x1ZGUgImJjbW9zX3N5c3RlbS5oIgorCisvKiogSW5pdGFsaXplIGEgYmNtb2x0X2J1ZiBzdHJlYW0KKyAqCisgKiBccGFyYW0gYnVmIAorICogXHBhcmFtIHNpemUgCisgKiBccGFyYW0gc3RhcnQKKyAqIFxwYXJhbSBlbmRpYW4gRW5kaWFubmVzcyBvZiBudW1iZXJzIGluIHRoZSByZXN1bHRpbmcgc3RyZWFtCisgKi8KK3ZvaWQgYmNtb2x0X2J1Zl9pbml0KGJjbW9sdF9idWYgKmJ1ZiwgdWludDMyX3Qgc2l6ZSwgdWludDhfdCAqc3RhcnQsIGJjbW9zX2VuZGlhbiBlbmRpYW4pCit7CisgICAgYnVmLT5sZW4gPSBzaXplOworICAgIGJ1Zi0+Y3VyciA9IHN0YXJ0OworICAgIGJ1Zi0+c3RhcnQgPSBzdGFydDsKKyAgICBidWYtPmZyZWUgPSBOVUxMOworICAgIGJ1Zi0+YmggPSBOVUxMOworICAgIC8qIEN1cnJlbnRseSwgd2Ugb25seSBzdXBwb3J0IHJlYWRpbmcvd3JpdGluZyBudW1iZXJzIGluIGEgc2luZ2xlIGVuZGlhbm5lc3MuICovCisgICAgQlVHX09OKGVuZGlhbiAhPSBCQ01PTFRfQlVGX0VORElBTl9GSVhFRCk7Cit9CisKKy8qKiBBbGxvY2F0ZSBkYXRhIGJ1ZmZlciBhbmQgaW5pdGlhbGl6ZSBiY21vbHRfYnVmIHN0cmVhbQorICoKKyAqIFxwYXJhbSBidWYKKyAqIFxwYXJhbSBzaXplCisgKiBccGFyYW0gZW5kaWFuIEVuZGlhbm5lc3Mgb2YgbnVtYmVycyBpbiB0aGUgcmVzdWx0aW5nIHN0cmVhbQorICogXHJldHVybiBCQ01fRVJSX09LIG9yIEJDTV9FUlJfTk9NRU0KKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X2J1Zl9hbGxvYyhiY21vbHRfYnVmICpidWYsIHVpbnQzMl90IHNpemUsIGJjbW9zX2VuZGlhbiBlbmRpYW4pCit7CisgICAgYnVmLT5zdGFydCA9IGJjbW9zX2FsbG9jKHNpemUpOworICAgIGlmIChidWYtPnN0YXJ0ID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICB9CisgICAgYmNtb2x0X2J1Zl9pbml0KGJ1Ziwgc2l6ZSwgYnVmLT5zdGFydCwgZW5kaWFuKTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqIFJlbGVhc2UgZGF0YSBidWZmZXIgcG9pbnRlZCBieSBiY21vbHRfYnVmIHN0cmVhbQorICogXHBhcmFtW2luLG91dF0gYnVmCisgKi8KK3ZvaWQgYmNtb2x0X2J1Zl9mcmVlKGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBpZiAoYnVmLT5zdGFydCAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGJ1Zi0+ZnJlZSkKKyAgICAgICAgeworICAgICAgICAgICAgYnVmLT5mcmVlKGJ1Zi0+YmgpOworICAgICAgICAgICAgYnVmLT5mcmVlID0gTlVMTDsKKyAgICAgICAgICAgIGJ1Zi0+YmggPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfZnJlZShidWYtPnN0YXJ0KTsKKyAgICAgICAgfQorICAgICAgICBidWYtPnN0YXJ0ID0gTlVMTDsKKyAgICB9CisgICAgYnVmLT5sZW4gPSAwOworICAgIGJ1Zi0+Y3VyciA9IE5VTEw7Cit9CisKKy8qKiBSZWFkIGZyb20gdGhlIGJ1ZmZlcgorICoKKyAqIFxwYXJhbSBidWYgICAgYmNtb2x0X2J1ZiBpbnN0YW5jZQorICogXHBhcmFtIHRvICAgICBXaGVyZSB0byByZWFkIHRvCisgKiBccGFyYW0gbGVuICAgIE51bWJlciBvZiBieXRlcyB0byBjb3B5CisgKgorICogXHJldHVybiAgICAgICBCQ01PU19UUlVFIGlmIHN1Y2Nlc3NmdWxseSBjb3BpZWQKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYnVmX3JlYWQoYmNtb2x0X2J1ZiAqYnVmLCB2b2lkICp0bywgc2l6ZV90IGxlbikKK3sKKyAgICBpZiAoKGJ1Zi0+c3RhcnQgKyBidWYtPmxlbikgPj0gKGJ1Zi0+Y3VyciArIGxlbikpCisgICAgeworICAgICAgICBtZW1jcHkodG8sIGJ1Zi0+Y3VyciwgbGVuKTsKKyAgICAgICAgYnVmLT5jdXJyICs9IGxlbjsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworfQorCisvKiogVHJhbnNmZXIgYnl0ZXMgZnJvbSBvbmUgYnVmIHRvIGFub3RoZXIKKyAqCisgKiBccGFyYW0gKmZyb20gICAgU291cmNlIGJ1ZmZlcgorICogXHBhcmFtICp0byAgICAgIERlc3RpbmF0aW9uIGJ1ZmZlcgorICogXHBhcmFtIGJ5dGVzICAgIE51bWJlciBvZiBieXRlcyB0byB0cmFuc2ZlcgorICogXHJldHVybiAgICAgICAgIEJDTU9TX1RSVUUgaWYgc3VjY2Vzc2Z1bGx5IHRyYW5zZmVycmVkCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2J1Zl90cmFuc2Zlcl9ieXRlcyhiY21vbHRfYnVmICpmcm9tLCBiY21vbHRfYnVmICp0bywgdWludDMyX3QgYnl0ZXMpCit7CisgICAgdWludDhfdCB0bXBbMjU2XTsKKyAgICB1aW50MzJfdCB0b1JlYWQ7CisgICAgd2hpbGUgKGJ5dGVzICE9IDApCisgICAgeworICAgICAgICB0b1JlYWQgPSBieXRlcyA+IHNpemVvZih0bXApID8gc2l6ZW9mKHRtcCkgOiBieXRlczsKKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWQoZnJvbSwgdG1wLCB0b1JlYWQpIHx8ICFiY21vbHRfYnVmX3dyaXRlKHRvLCB0bXAsIHRvUmVhZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGJ5dGVzIC09IHRvUmVhZDsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqIFdyaXRlIHRvIHRoZSBidWZmZXIKKyAqCisgKiBccGFyYW0gYnVmICAgIGJjbW9sdF9idWYgaW5zdGFuY2UKKyAqIFxwYXJhbSBmcm9tICAgU291cmNlLCB0byBjb3B5IGZyb20KKyAqIFxwYXJhbSBsZW4gICAgTnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkKKyAqCisgKiBccmV0dXJuICAgICAgIEJDTU9TX1RSVUUgaWYgc3VjY2Vzc2Z1bGx5IGNvcGllZAorICovCitiY21vc19ib29sIGJjbW9sdF9idWZfd3JpdGUoYmNtb2x0X2J1ZiAqYnVmLCBjb25zdCB2b2lkICpmcm9tLCBzaXplX3QgbGVuKQoreworICAgIGlmICgoYnVmLT5zdGFydCArIGJ1Zi0+bGVuKSA+PSAoYnVmLT5jdXJyICsgbGVuKSkKKyAgICB7CisgICAgICAgIG1lbWNweShidWYtPmN1cnIsIGZyb20sIGxlbik7CisgICAgICAgIGJ1Zi0+Y3VyciArPSBsZW47CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorfQorCisvKiogTW92ZSB0aGUgY3VycmVudCBwb2ludGVyIHRvIGEgZ2l2ZW4gcG9zaXRpb24gaW4gdGhlIGJ1ZmZlcgorICoKKyAqIFxwYXJhbSBwb3MgICAgQnl0ZSBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyIHRvIG1vdmUgdGhlIGN1cnJlbnQgcG9pbnRlciB0bworICoKKyAqIFxwYXJhbSAqYnVmICAgSW5wdXQgYnVmZmVyCisgKiBccmV0dXJuICAgICAgIEJDTU9TX0ZBTFNFIGlmIGxlbiB0YWtlcyB1cyBwYXN0IHRoZSBlbmQgb2YgYnVmZmVyCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2J1Zl9zZXRfcG9zKGJjbW9sdF9idWYgKmJ1ZiwgdWludDMyX3QgcG9zKQoreworICAgIGlmIChwb3MgPD0gYnVmLT5sZW4pCisgICAgeworICAgICAgICBidWYtPmN1cnIgPSBidWYtPnN0YXJ0ICsgcG9zOworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfRkFMU0U7Cit9CisKKy8qKiBNb3ZlIHRoZSBjdXJyZW50IHBvaW50ZXIgYWhlYWQgYnkgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzCisgKgorICogXHBhcmFtIGJ1ZiAgICBiY21vbHRfYnVmIGluc3RhbmNlCisgKiBccGFyYW0gbGVuICAgIE51bWJlciBvZiBieXRlcyB0byBza2lwCisgKgorICogXHJldHVybiAgICAgICBCQ01PU19GQUxTRSBpZiBsZW4gdGFrZXMgdXMgcGFzdCB0aGUgZW5kIG9mIGJ1ZmZlcgorICovCitiY21vc19ib29sIGJjbW9sdF9idWZfc2tpcChiY21vbHRfYnVmICpidWYsIHVpbnQzMl90IGxlbikKK3sKKyAgICBpZiAoKGJ1Zi0+c3RhcnQgKyBidWYtPmxlbikgPj0gKGJ1Zi0+Y3VyciArIGxlbikpCisgICAgeworICAgICAgICBidWYtPmN1cnIgKz0gbGVuOworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfRkFMU0U7Cit9CisKKy8qKiBNb3ZlIHRoZSBjdXJyZW50IHBvaW50ZXIgYmFjayBieSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMKKyAqCisgKiBccGFyYW0gYnVmICAgIGJjbW9sdF9idWYgaW5zdGFuY2UKKyAqIFxwYXJhbSBsZW4gICAgTnVtYmVyIG9mIGJ5dGVzIHRvIGdvIGJhY2sKKyAqCisgKiBccmV0dXJuICAgICAgIEJDTU9TX0ZBTFNFIGlmIGxlbiB0YWtlcyB1cyBwYXN0IHRoZSBzdGFydCBvZiBidWZmZXIKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYnVmX3Jld2luZChiY21vbHRfYnVmICpidWYsIHVpbnQzMl90IGxlbikKK3sKKyAgICBpZiAoYnVmLT5jdXJyID49IChidWYtPnN0YXJ0ICsgbGVuKSkKKyAgICB7CisgICAgICAgIGJ1Zi0+Y3VyciAtPSBsZW47CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19GQUxTRTsKK30KKworLyoqIFJlYWRzIGEgYm9vbGVhbiBmcm9tIGEgYnVmZmVyCisgKgorICogXHBhcmFtICpidWYKKyAqIFxwYXJhbSAqdmFsCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2J1Zl9yZWFkX2Jvb2woYmNtb2x0X2J1ZiAqYnVmLCBiY21vc19ib29sICp2YWwpCit7CisgICAgLyogdGhpcyBmdW5jdGlvbiBpc24ndCBpbmxpbmVkIGxpa2UgdGhlIHJlc3QgYmVjYXVzZSBpdCdzIHRvbyBjb21wbGV4IHRvIGlubGluZSBjbGVhbmx5ICovCisgICAgdWludDhfdCB0bXA7CisgICAgaWYgKGJjbW9sdF9idWZfcmVhZF91OChidWYsICZ0bXApKQorICAgIHsKKyAgICAgICAgKnZhbCA9ICh0bXAgIT0gMCk7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorfQorCisKKyNpZmRlZiBfX0tFUk5FTF9fCitFWFBPUlRfU1lNQk9MKGJjbW9sdF9idWZfaW5pdCk7CitFWFBPUlRfU1lNQk9MKGJjbW9sdF9idWZfYWxsb2MpOworRVhQT1JUX1NZTUJPTChiY21vbHRfYnVmX2ZyZWUpOworRVhQT1JUX1NZTUJPTChiY21vbHRfYnVmX3JlYWQpOworRVhQT1JUX1NZTUJPTChiY21vbHRfYnVmX3RyYW5zZmVyX2J5dGVzKTsKK0VYUE9SVF9TWU1CT0woYmNtb2x0X2J1Zl93cml0ZSk7CitFWFBPUlRfU1lNQk9MKGJjbW9sdF9idWZfc2V0X3Bvcyk7CitFWFBPUlRfU1lNQk9MKGJjbW9sdF9idWZfc2tpcCk7CitFWFBPUlRfU1lNQk9MKGJjbW9sdF9idWZfcmV3aW5kKTsKK0VYUE9SVF9TWU1CT0woYmNtb2x0X2J1Zl9yZWFkX2Jvb2wpOworCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci91dGlscy9iY21vbHRfYnVmLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdXRpbHMvYmNtb2x0X2J1Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNjMzN2EKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdXRpbHMvYmNtb2x0X2J1Zi5oCkBAIC0wLDAgKzEsNzMzIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaWZuZGVmIEJDTU9MVF9CVUZfSF8KKyNkZWZpbmUgQkNNT0xUX0JVRl9IXworCisjaW5jbHVkZSAiYmNtb3Nfc3lzdGVtLmgiCisKKy8qKiBHZW5lcmljIG1lbW9yeSBzdHJlYW0gb2JqZWN0ICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfYnVmIGJjbW9sdF9idWY7CisKK3N0cnVjdCBiY21vbHRfYnVmCit7CisgICAgdWludDhfdCAqc3RhcnQ7ICAvKio8IFBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIgKi8KKyAgICB1aW50OF90ICpjdXJyOyAgIC8qKjwgUG9pbnRlciB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCisgICAgdWludDMyX3QgbGVuOyAgICAvKio8IFRvdGFsIExlbmd0aCBvZiBidWZmZXIgKi8KKyAgICAvKiBUaGUgZm9sbG93aW5nIDIgZmllbGRzIGVuYWJsZSBmb3JlaWduIGJ1ZmZlciBlbmNhcHN1bGF0aW9uICovCisgICAgdm9pZCAoKmZyZWUpKHZvaWQgKmJoKTsgIC8qKjwgRm9yZWlnbiBidWZmZXIgcmVsZWFzZSBjYWxsYmFjayAqLworICAgIHZvaWQgKmJoOyAgICAgICAgLyoqPCBGb3JlaWduIGJ1ZmZlciBoYW5kbGUgKi8KK307CisKKy8qIFNlcmlhbGl6YXRpb24gYnVmZmVyIGVuZGlhbm5lc3MgKi8KKyNkZWZpbmUgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQgQkNNT1NfRU5ESUFOX0JJRworCisjaWYgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQgPT0gQkNNT1NfRU5ESUFOX0JJRworICAgICNkZWZpbmUgQkNNT0xUX0JVRl9FTkRJQU5fQlVGX1RPX0NQVShzaXplLCBuKSBCQ01PU19FTkRJQU5fQklHX1RPX0NQVV8jI3NpemUobikKKyAgICAjZGVmaW5lIEJDTU9MVF9CVUZfRU5ESUFOX0NQVV9UT19CVUYoc2l6ZSwgbikgQkNNT1NfRU5ESUFOX0NQVV9UT19CSUdfIyNzaXplKG4pCisjZWxzZQorICAgICNkZWZpbmUgQkNNT0xUX0JVRl9FTkRJQU5fQlVGX1RPX0NQVShzaXplLCBuKSBCQ01PU19FTkRJQU5fTElUVExFX1RPX0NQVV8jI3NpemUobikKKyAgICAjZGVmaW5lIEJDTU9MVF9CVUZfRU5ESUFOX0NQVV9UT19CVUYoc2l6ZSwgbikgQkNNT1NfRU5ESUFOX0NQVV9UT19MSVRUTEVfIyNzaXplKG4pCisjZW5kaWYKKworLyoqIEluaXRhbGl6ZSBhIGJjbW9sdF9idWYgc3RyZWFtCisgKgorICogXHBhcmFtIGJ1ZgorICogXHBhcmFtIHNpemUKKyAqIFxwYXJhbSBzdGFydAorICogXHBhcmFtIGVuZGlhbiBFbmRpYW5uZXNzIG9mIG51bWJlcnMgaW4gdGhlIHJlc3VsdGluZyBzdHJlYW0uCisgKiAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIG9ubHkgZm9yIHNhbml0eSBjaGVjay4gQnVmZmVyIGVuZGlhbm5lc3MgaXMKKyAqICAgICAgICAgICAgICAgc2V0IGF0IGNvbXBpbGUgdGltZS4gQXBwbGljYXRpb24gTVVTVCBOT1QgcmVseSBvbiBkZWZhdWx0IGJ1ZmZlciBlbmRpYW5uZXNzCisgKiAgICAgICAgICAgICAgIGJlaW5nIEJpZyBFbmRpYW4uCisgKiAgICAgICAgICAgICAgIElmIEJpZyBFbmRpYW4gYnVmZmVyIGlzIHJlcXVpcmVkLCBhcHBsaWNhdGlvbiBtdXN0IHVzZQorICogICAgICAgICAgICAgICBhY2Nlc3MgZnVuY3Rpb25zIHdpdGggIl9iZSIgZGVzaWduYXRvciAoYmNtb2x0X2J1Zl9yZWFkX3UxNl9iZSgpLCBldGMuKQorICovCit2b2lkIGJjbW9sdF9idWZfaW5pdChiY21vbHRfYnVmICpidWYsIHVpbnQzMl90IHNpemUsIHVpbnQ4X3QgKnN0YXJ0LCBiY21vc19lbmRpYW4gZW5kaWFuKTsKKworLyoqIEFsbG9jYXRlIGRhdGEgYnVmZmVyIGFuZCBpbml0aWFsaXplIGJjbW9sdF9idWYgc3RyZWFtCisgKgorICogXHBhcmFtIGJ1ZgorICogXHBhcmFtIHNpemUKKyAqIFxwYXJhbSBlbmRpYW4gRW5kaWFubmVzcyBvZiBudW1iZXJzIGluIHRoZSByZXN1bHRpbmcgc3RyZWFtLgorICogICAgICAgICAgICAgICBTZWUgZXhwbGFuYXRpb24gaW4gYmNtb2x0X2J1Zl9hbGxvYygpCisgKiBccmV0dXJuIEJDTV9FUlJfT0sgb3IgQkNNX0VSUl9OT01FTQorICovCitiY21vc19lcnJubyBiY21vbHRfYnVmX2FsbG9jKGJjbW9sdF9idWYgKmJ1ZiwgdWludDMyX3Qgc2l6ZSwgYmNtb3NfZW5kaWFuIGVuZGlhbik7CisKKy8qKiBSZWxlYXNlIGRhdGEgYnVmZmVyIHBvaW50ZWQgYnkgYmNtb2x0X2J1ZiBzdHJlYW0KKyAqIFxwYXJhbVtpbixvdXRdIGJ1ZgorICovCit2b2lkIGJjbW9sdF9idWZfZnJlZShiY21vbHRfYnVmICpidWYpOworCisvKiogUmVhZCBmcm9tIHRoZSBidWZmZXIKKyAqCisgKiBccGFyYW0gYnVmICAgIGJjbW9sdF9idWYgaW5zdGFuY2UKKyAqIFxwYXJhbSB0byAgICAgV2hlcmUgdG8gcmVhZCB0bworICogXHBhcmFtIGxlbiAgICBOdW1iZXIgb2YgYnl0ZXMgdG8gY29weQorICoKKyAqIFxyZXR1cm4gICAgICAgQkNNT1NfVFJVRSBpZiBzdWNjZXNzZnVsbHkgY29waWVkCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2J1Zl9yZWFkKGJjbW9sdF9idWYgKmJ1Ziwgdm9pZCAqdG8sIHNpemVfdCBsZW4pOworCisvKiogVHJhbnNmZXIgYnl0ZXMgZnJvbSBvbmUgYnVmIHRvIGFub3RoZXIKKyAqCisgKiBccGFyYW0gKmZyb20gICAgU291cmNlIGJ1ZmZlcgorICogXHBhcmFtICp0byAgICAgIERlc3RpbmF0aW9uIGJ1ZmZlcgorICogXHBhcmFtIGJ5dGVzICAgIE51bWJlciBvZiBieXRlcyB0byB0cmFuc2ZlcgorICogXHJldHVybiAgICAgICAgIEJDTU9TX1RSVUUgaWYgc3VjY2Vzc2Z1bGx5IHRyYW5zZmVycmVkCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2J1Zl90cmFuc2Zlcl9ieXRlcyhiY21vbHRfYnVmICpmcm9tLCBiY21vbHRfYnVmICp0bywgdWludDMyX3QgYnl0ZXMpOworCisvKiogV3JpdGUgdG8gdGhlIGJ1ZmZlcgorICoKKyAqIFxwYXJhbSBidWYgICAgYmNtb2x0X2J1ZiBpbnN0YW5jZQorICogXHBhcmFtIGZyb20gICBTb3VyY2UsIHRvIGNvcHkgZnJvbQorICogXHBhcmFtIGxlbiAgICBOdW1iZXIgb2YgYnl0ZXMgdG8gY29weQorICoKKyAqIFxyZXR1cm4gICAgICAgQkNNT1NfVFJVRSBpZiBzdWNjZXNzZnVsbHkgY29waWVkCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2J1Zl93cml0ZShiY21vbHRfYnVmICpidWYsIGNvbnN0IHZvaWQgKmZyb20sIHNpemVfdCBsZW4pOworCisvKiogTW92ZSB0aGUgY3VycmVudCBwb2ludGVyIHRvIGEgZ2l2ZW4gcG9zaXRpb24gaW4gdGhlIGJ1ZmZlcgorICoKKyAqIFxwYXJhbSBwb3MgICAgQnl0ZSBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyIHRvIG1vdmUgdGhlIGN1cnJlbnQgcG9pbnRlciB0bworICoKKyAqIFxwYXJhbSAqYnVmICAgSW5wdXQgYnVmZmVyCisgKiBccmV0dXJuICAgICAgIEJDTU9TX0ZBTFNFIGlmIGxlbiB0YWtlcyB1cyBwYXN0IHRoZSBlbmQgb2YgYnVmZmVyCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2J1Zl9zZXRfcG9zKGJjbW9sdF9idWYgKmJ1ZiwgdWludDMyX3QgcG9zKTsKKworLyoqIE1vdmUgdGhlIGN1cnJlbnQgcG9pbnRlciBhaGVhZCBieSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMKKyAqCisgKiBccGFyYW0gYnVmICAgIGJjbW9sdF9idWYgaW5zdGFuY2UKKyAqIFxwYXJhbSBsZW4gICAgTnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAKKyAqCisgKiBccmV0dXJuICAgICAgIEJDTU9TX0ZBTFNFIGlmIGxlbiB0YWtlcyB1cyBwYXN0IHRoZSBlbmQgb2YgYnVmZmVyCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2J1Zl9za2lwKGJjbW9sdF9idWYgKmJ1ZiwgdWludDMyX3QgbGVuKTsKKworLyoqIE1vdmUgdGhlIGN1cnJlbnQgcG9pbnRlciBiYWNrIGJ5IGdpdmVuIG51bWJlciBvZiBieXRlcworICoKKyAqIFxwYXJhbSBidWYgICAgYmNtb2x0X2J1ZiBpbnN0YW5jZQorICogXHBhcmFtIGxlbiAgICBOdW1iZXIgb2YgYnl0ZXMgdG8gZ28gYmFjaworICoKKyAqIFxyZXR1cm4gICAgICAgQkNNT1NfRkFMU0UgaWYgbGVuIHRha2VzIHVzIHBhc3QgdGhlIHN0YXJ0IG9mIGJ1ZmZlcgorICovCitiY21vc19ib29sIGJjbW9sdF9idWZfcmV3aW5kKGJjbW9sdF9idWYgKmJ1ZiwgdWludDMyX3QgbGVuKTsKKworLyoqIEdldCB0aGUgY3VycmVudCBidWZmZXIgcG9pbnRlcgorICoKKyAqIFxwYXJhbSBidWYgICBiY21vbHRfYnVmIGluc3RhbmNlCisgKgorICogXHJldHVybiAgICAgIHRoZSBjdXJyZW50IGJ1ZmZlciBwb2ludGVyCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDhfdCAqYmNtb2x0X2J1Zl9zbmFwX2dldChjb25zdCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJ1Zi0+Y3VycjsKK30KKworLyoqIE1vdmUgdGhlIGN1cnJlbnQgcG9pbnRlciB0byBhIHNuYXBwZWQgbG9jYXRpb24KKyAqCisgKiBccGFyYW0gYnVmICAgYmNtb2x0X2J1ZiBpbnN0YW5jZQorICogXHBhcmFtIHNuYXAgIHNuYXBwZWQgbG9jYXRpb24KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGJjbW9sdF9idWZfc25hcF9yZXN0b3JlKGJjbW9sdF9idWYgKmJ1ZiwgdWludDhfdCAqc25hcCkKK3sKKyAgICBidWYtPmN1cnIgPSBzbmFwOworfQorCisvKiogR2V0IHRoZSBsZW5ndGggb2YgdW5wcm9jZXNzZWQgYnl0ZXMgaW4gZ2l2ZW4gc3RyZWFtCisgKgorICogXHBhcmFtIGJ1ZiAgICBJbnB1dCBidWZmZXIKKyAqCisgKiBccmV0dXJuICAgICAgIFRoZSBudW1iZXIgb2YgcmVtYWluaW5nIGJ5dGVzIGluIHRoZSBidWZmZXIKKyAqLworc3RhdGljIGlubGluZSB1aW50MzJfdCBiY21vbHRfYnVmX2dldF9yZW1haW5pbmdfc2l6ZShjb25zdCBiY21vbHRfYnVmICpidWYpCit7CisgICAgcmV0dXJuICh1aW50MzJfdCkoKGJ1Zi0+c3RhcnQgKyBidWYtPmxlbikgLSBidWYtPmN1cnIpOworfQorCisvKiogR2V0IGFtb3VudCBvZiBidWYgdGhhdCBoYXMgYmVlbiByZWFkIG9yIHdyaXR0ZW4gc28gZmFyCisgKgorICogXHBhcmFtIGJ1ZiAgICAgSW5wdXQgYnVmZmVyCisgKiBccmV0dXJuICAgICAgICBBbW91bnQgb2YgYnVmZmVyIHVzZWQKKyAqLworc3RhdGljIGlubGluZSB1aW50MzJfdCBiY21vbHRfYnVmX2dldF91c2VkKGNvbnN0IGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKHVpbnQzMl90KShidWYtPmN1cnIgLSBidWYtPnN0YXJ0KTsKK30KKworLyoqIFJlYWRzIGEgdWludDhfdCBmcm9tIGEgYnVmZmVyCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgdG8gcmVhZCBmcm9tCisgKiBccGFyYW0gdmFsIHVpbnQ4X3QgdG8gcmVhZAorICoKKyAqIFxyZXR1cm4gQkNNT1NfVFJVRSBpZiByZWFkIHN1Y2Nlc3NmdWwKKyAqLworc3RhdGljIGlubGluZSBiY21vc19ib29sIGJjbW9sdF9idWZfcmVhZF91OChiY21vbHRfYnVmICpidWYsIHVpbnQ4X3QgKnZhbCkKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9yZWFkKGJ1ZiwgdmFsLCBzaXplb2YoKnZhbCkpOworfQorCisvKiogV3JpdGVzIGEgdWludDhfdCB0byBhIGJ1ZmZlcgorICoKKyAqIFxwYXJhbSBidWYgICAgQnVmZmVyIHRvIHdyaXRlIHRvCisgKiBccGFyYW0gdmFsICAgIHVpbnQ4X3QgdG8gd3JpdGUKKyAqCisgKiBccmV0dXJuICAgICAgIEJDTU9TX1RSVUUgaWYgd3JpdGUgc3VjY2Vzc2Z1bAorICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgYmNtb2x0X2J1Zl93cml0ZV91OChiY21vbHRfYnVmICpidWYsIHVpbnQ4X3QgdmFsKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlKGJ1ZiwgJnZhbCwgc2l6ZW9mKHZhbCkpOworfQorCisvKiogUmVhZHMgYSBib29sZWFuIGZyb20gYSBidWZmZXIKKyAqCisgKiBccGFyYW0gKmJ1ZgorICogXHBhcmFtICp2YWwKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfYnVmX3JlYWRfYm9vbChiY21vbHRfYnVmICpidWYsIGJjbW9zX2Jvb2wgKnZhbCk7CisKKy8qKiBXcml0ZXMgYSBiY21vc19ib29sIHRvIGEgYnVmZmVyCisgKgorICogXHBhcmFtIGJ1ZiAgICBCdWZmZXIgdG8gd3JpdGUgdG8KKyAqIFxwYXJhbSB2YWwgICAgdWludDhfdCB0byB3cml0ZQorICoKKyAqIFxyZXR1cm4gICAgICAgQkNNT1NfVFJVRSBpZiB3cml0ZSBzdWNjZXNzZnVsCisgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfYm9vbCBiY21vbHRfYnVmX3dyaXRlX2Jvb2woYmNtb2x0X2J1ZiAqYnVmLCBiY21vc19ib29sIHZhbCkKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIHZhbCA/IDEgOiAwKTsKK30KKworLyoqIFJlYWRzIGEgaW50OF90IGZyb20gYSBidWZmZXIKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciB0byByZWFkIGZyb20KKyAqIFxwYXJhbSB2YWwgaW50OF90IHRvIHJlYWQKKyAqCisgKiBccmV0dXJuIEJDTU9TX1RSVUUgaWYgcmVhZCBzdWNjZXNzZnVsCisgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfYm9vbCBiY21vbHRfYnVmX3JlYWRfczgoYmNtb2x0X2J1ZiAqYnVmLCBpbnQ4X3QgKnZhbCkKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgKHVpbnQ4X3QgKil2YWwpOworfQorCisvKiogV3JpdGVzIGEgaW50OF90IHRvIGEgYnVmZmVyCisgKgorICogXHBhcmFtIGJ1ZiAgICBCdWZmZXIgdG8gd3JpdGUgdG8KKyAqIFxwYXJhbSB2YWwgICAgaW50OF90IHRvIHdyaXRlCisgKgorICogXHJldHVybiAgICAgICBCQ01PU19UUlVFIGlmIHdyaXRlIHN1Y2Nlc3NmdWwKKyAqLworc3RhdGljIGlubGluZSBiY21vc19ib29sIGJjbW9sdF9idWZfd3JpdGVfczgoYmNtb2x0X2J1ZiAqYnVmLCBpbnQ4X3QgdmFsKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpdmFsKTsKK30KKworLyoqIFJlYWRzIGEgdWludDE2X3QgZnJvbSBhIGJ1ZmZlcgorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHRvIHJlYWQgZnJvbQorICogXHBhcmFtIHZhbCB1aW50MTZfdCB0byByZWFkCisgKgorICogXHJldHVybiBCQ01PU19UUlVFIGlmIHJlYWQgc3VjY2Vzc2Z1bAorICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgYmNtb2x0X2J1Zl9yZWFkX3UxNihiY21vbHRfYnVmICpidWYsIHVpbnQxNl90ICp2YWwpCit7CisgICAgYmNtb3NfYm9vbCByZXMgPSBiY21vbHRfYnVmX3JlYWQoYnVmLCB2YWwsIHNpemVvZigqdmFsKSk7CisgICAgKnZhbCA9IEJDTU9MVF9CVUZfRU5ESUFOX0JVRl9UT19DUFUoVTE2LCAqdmFsKTsKKyAgICByZXR1cm4gcmVzOworfQorCisvKiogUmVhZHMgYSB1aW50MTZfdCBmcm9tIGEgQmlnIEVuZGlhbiBidWZmZXIKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciB0byByZWFkIGZyb20KKyAqIFxwYXJhbSB2YWwgdWludDE2X3QgdG8gcmVhZAorICoKKyAqIFxyZXR1cm4gQkNNT1NfVFJVRSBpZiByZWFkIHN1Y2Nlc3NmdWwKKyAqLworc3RhdGljIGlubGluZSBiY21vc19ib29sIGJjbW9sdF9idWZfcmVhZF91MTZfYmUoYmNtb2x0X2J1ZiAqYnVmLCB1aW50MTZfdCAqdmFsKQoreworICAgIGJjbW9zX2Jvb2wgcmVzID0gYmNtb2x0X2J1Zl9yZWFkKGJ1ZiwgdmFsLCBzaXplb2YoKnZhbCkpOworICAgICp2YWwgPSBCQ01PU19FTkRJQU5fQklHX1RPX0NQVV9VMTYoKnZhbCk7CisgICAgcmV0dXJuIHJlczsKK30KKworLyoqIFdyaXRlcyBhIHVpbnQxNl90IHRvIGEgYnVmZmVyCisgKgorICogXHBhcmFtIGJ1ZiAgICBCdWZmZXIgdG8gd3JpdGUgdG8KKyAqIFxwYXJhbSB2YWwgICAgdWludDE2X3QgdG8gd3JpdGUKKyAqCisgKiBccmV0dXJuICAgICAgIEJDTU9TX1RSVUUgaWYgd3JpdGUgc3VjY2Vzc2Z1bAorICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgYmNtb2x0X2J1Zl93cml0ZV91MTYoYmNtb2x0X2J1ZiAqYnVmLCB1aW50MTZfdCB2YWwpCit7CisgICAgdmFsID0gQkNNT0xUX0JVRl9FTkRJQU5fQ1BVX1RPX0JVRihVMTYsIHZhbCk7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGUoYnVmLCAmdmFsLCBzaXplb2YodmFsKSk7Cit9CisKKy8qKiBXcml0ZXMgYSB1aW50MTZfdCB0byBhIEJpZyBFbmRpYW4gYnVmZmVyCisgKgorICogXHBhcmFtIGJ1ZiAgICBCdWZmZXIgdG8gd3JpdGUgdG8KKyAqIFxwYXJhbSB2YWwgICAgdWludDE2X3QgdG8gd3JpdGUKKyAqCisgKiBccmV0dXJuICAgICAgIEJDTU9TX1RSVUUgaWYgd3JpdGUgc3VjY2Vzc2Z1bAorICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgYmNtb2x0X2J1Zl93cml0ZV91MTZfYmUoYmNtb2x0X2J1ZiAqYnVmLCB1aW50MTZfdCB2YWwpCit7CisgICAgdmFsID0gQkNNT1NfRU5ESUFOX0NQVV9UT19CSUdfVTE2KHZhbCk7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGUoYnVmLCAmdmFsLCBzaXplb2YodmFsKSk7Cit9CisKKy8qKiBSZWFkcyBhIGludDE2X3QgZnJvbSBhIGJ1ZmZlcgorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHRvIHJlYWQgZnJvbQorICogXHBhcmFtIHZhbCBpbnQxNl90IHRvIHJlYWQKKyAqCisgKiBccmV0dXJuIEJDTU9TX1RSVUUgaWYgcmVhZCBzdWNjZXNzZnVsCisgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfYm9vbCBiY21vbHRfYnVmX3JlYWRfczE2KGJjbW9sdF9idWYgKmJ1ZiwgaW50MTZfdCAqdmFsKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3JlYWRfdTE2KGJ1ZiwgKHVpbnQxNl90ICopdmFsKTsKK30KKworLyoqIFJlYWRzIGEgaW50MTZfdCBmcm9tIGEgQmlnIEVuZGlhbiBidWZmZXIKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciB0byByZWFkIGZyb20KKyAqIFxwYXJhbSB2YWwgaW50MTZfdCB0byByZWFkCisgKgorICogXHJldHVybiBCQ01PU19UUlVFIGlmIHJlYWQgc3VjY2Vzc2Z1bAorICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgYmNtb2x0X2J1Zl9yZWFkX3MxNl9iZShiY21vbHRfYnVmICpidWYsIGludDE2X3QgKnZhbCkKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9yZWFkX3UxNl9iZShidWYsICh1aW50MTZfdCAqKXZhbCk7Cit9CisKKy8qKiBXcml0ZXMgaW50MTZfdCB0byBhIGJ1ZmZlcgorICoKKyAqIFxwYXJhbSBidWYgICAgQnVmZmVyIHRvIHdyaXRlIHRvCisgKiBccGFyYW0gdmFsICAgIGludDE2X3QgdG8gd3JpdGUKKyAqCisgKiBccmV0dXJuICAgICAgIEJDTU9TX1RSVUUgaWYgd3JpdGUgc3VjY2Vzc2Z1bAorICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgYmNtb2x0X2J1Zl93cml0ZV9zMTYoYmNtb2x0X2J1ZiAqYnVmLCBpbnQxNl90IHZhbCkKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpdmFsKTsKK30KKworLyoqIFdyaXRlcyBpbnQxNl90IHRvIGEgQmlnIEVuZGlhbiBidWZmZXIKKyAqCisgKiBccGFyYW0gYnVmICAgIEJ1ZmZlciB0byB3cml0ZSB0bworICogXHBhcmFtIHZhbCAgICBpbnQxNl90IHRvIHdyaXRlCisgKgorICogXHJldHVybiAgICAgICBCQ01PU19UUlVFIGlmIHdyaXRlIHN1Y2Nlc3NmdWwKKyAqLworc3RhdGljIGlubGluZSBiY21vc19ib29sIGJjbW9sdF9idWZfd3JpdGVfczE2X2JlKGJjbW9sdF9idWYgKmJ1ZiwgaW50MTZfdCB2YWwpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2X2JlKGJ1ZiwgKHVpbnQxNl90KXZhbCk7Cit9CisKKy8qKiBSZWFkcyBhIGJjbW9zX3UyNCBmcm9tIGEgYnVmZmVyCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgdG8gcmVhZCBmcm9tCisgKiBccGFyYW0gdmFsIGJjbW9zX3UyNCB0byByZWFkCisgKgorICogXHJldHVybiBCQ01PU19UUlVFIGlmIHJlYWQgc3VjY2Vzc2Z1bAorICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgYmNtb2x0X2J1Zl9yZWFkX3UyNChiY21vbHRfYnVmICpidWYsIHVpbnQyNF90ICp2YWwpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfcmVhZF91OChidWYsICYodmFsLT5sb3dfaGkuaGkpKSAmJgorICAgICAgICAgICBiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmKHZhbC0+bG93X2hpLm1pZCkpICYmCisgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZF91OChidWYsICYodmFsLT5sb3dfaGkubG93KSk7Cit9CisKKy8qKiBXcml0ZXMgYSBiY21vc191MjQgdG8gYSBidWZmZXIKKyAqCisgKiBccGFyYW0gYnVmICAgIEJ1ZmZlciB0byB3cml0ZSB0bworICogXHBhcmFtIHZhbCAgICBiY21vc191MjQgdG8gd3JpdGUKKyAqCisgKiBccmV0dXJuICAgICAgIEJDTU9TX1RSVUUgaWYgd3JpdGUgc3VjY2Vzc2Z1bAorICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgYmNtb2x0X2J1Zl93cml0ZV91MjQoYmNtb2x0X2J1ZiAqYnVmLCB1aW50MjRfdCB2YWwpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB2YWwubG93X2hpLmhpKSAmJgorICAgICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgdmFsLmxvd19oaS5taWQpICYmCisgICAgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCB2YWwubG93X2hpLmxvdyk7Cit9CisKKy8qKiBSZWFkcyBhIHVpbnQzMl90IGZyb20gYSBidWZmZXIKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciB0byByZWFkIGZyb20KKyAqIFxwYXJhbSB2YWwgdWludDMyX3QgdG8gcmVhZAorICoKKyAqIFxyZXR1cm4gQkNNT1NfVFJVRSBpZiByZWFkIHN1Y2Nlc3NmdWwKKyAqLworc3RhdGljIGlubGluZSBiY21vc19ib29sIGJjbW9sdF9idWZfcmVhZF91MzIoYmNtb2x0X2J1ZiAqYnVmLCB1aW50MzJfdCAqdmFsKQoreworICAgIGJjbW9zX2Jvb2wgcmVzID0gYmNtb2x0X2J1Zl9yZWFkKGJ1ZiwgdmFsLCBzaXplb2YoKnZhbCkpOworICAgICp2YWwgPSBCQ01PTFRfQlVGX0VORElBTl9CVUZfVE9fQ1BVKFUzMiwgKnZhbCk7CisgICAgcmV0dXJuIHJlczsKK30KKworLyoqIFJlYWRzIGEgdWludDMyX3QgZnJvbSBhIEJpZyBFbmRpYW4gYnVmZmVyCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgdG8gcmVhZCBmcm9tCisgKiBccGFyYW0gdmFsIHVpbnQzMl90IHRvIHJlYWQKKyAqCisgKiBccmV0dXJuIEJDTU9TX1RSVUUgaWYgcmVhZCBzdWNjZXNzZnVsCisgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfYm9vbCBiY21vbHRfYnVmX3JlYWRfdTMyX2JlKGJjbW9sdF9idWYgKmJ1ZiwgdWludDMyX3QgKnZhbCkKK3sKKyAgICBiY21vc19ib29sIHJlcyA9IGJjbW9sdF9idWZfcmVhZChidWYsIHZhbCwgc2l6ZW9mKCp2YWwpKTsKKyAgICAqdmFsID0gQkNNT1NfRU5ESUFOX0JJR19UT19DUFVfVTMyKCp2YWwpOworICAgIHJldHVybiByZXM7Cit9CisKKy8qKiBXcml0ZXMgYSB1aW50MzJfdCB0byBhIGJ1ZmZlcgorICoKKyAqIFxwYXJhbSBidWYgICAgQnVmZmVyIHRvIHdyaXRlIHRvCisgKiBccGFyYW0gdmFsICAgIHVpbnQzMl90IHRvIHdyaXRlCisgKgorICogXHJldHVybiAgICAgICBCQ01PU19UUlVFIGlmIHdyaXRlIHN1Y2Nlc3NmdWwKKyAqLworc3RhdGljIGlubGluZSBiY21vc19ib29sIGJjbW9sdF9idWZfd3JpdGVfdTMyKGJjbW9sdF9idWYgKmJ1ZiwgdWludDMyX3QgdmFsKQoreworICAgIHZhbCA9IEJDTU9MVF9CVUZfRU5ESUFOX0NQVV9UT19CVUYoVTMyLCB2YWwpOworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlKGJ1ZiwgJnZhbCwgc2l6ZW9mKHZhbCkpOworfQorCisvKiogV3JpdGVzIGEgdWludDMyX3QgdG8gYSBCaWcgRW5kaWFuIGJ1ZmZlcgorICoKKyAqIFxwYXJhbSBidWYgICAgQnVmZmVyIHRvIHdyaXRlIHRvCisgKiBccGFyYW0gdmFsICAgIHVpbnQzMl90IHRvIHdyaXRlCisgKgorICogXHJldHVybiAgICAgICBCQ01PU19UUlVFIGlmIHdyaXRlIHN1Y2Nlc3NmdWwKKyAqLworc3RhdGljIGlubGluZSBiY21vc19ib29sIGJjbW9sdF9idWZfd3JpdGVfdTMyX2JlKGJjbW9sdF9idWYgKmJ1ZiwgdWludDMyX3QgdmFsKQoreworICAgIHZhbCA9IEJDTU9TX0VORElBTl9DUFVfVE9fQklHX1UzMih2YWwpOworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlKGJ1ZiwgJnZhbCwgc2l6ZW9mKHZhbCkpOworfQorCisvKiogUmVhZHMgYSBpbnQzMl90IGZyb20gYSBidWZmZXIKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciB0byByZWFkIGZyb20KKyAqIFxwYXJhbSB2YWwgaW50MzJfdCB0byByZWFkCisgKgorICogXHJldHVybiBCQ01PU19UUlVFIGlmIHJlYWQgc3VjY2Vzc2Z1bAorICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgYmNtb2x0X2J1Zl9yZWFkX3MzMihiY21vbHRfYnVmICpidWYsIGludDMyX3QgKnZhbCkKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9yZWFkX3UzMihidWYsICh1aW50MzJfdCAqKXZhbCk7Cit9CisKKy8qKiBSZWFkcyBhIGludDMyX3QgZnJvbSBhIGJpZyBlbmRpYW4gYnVmZmVyCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgdG8gcmVhZCBmcm9tCisgKiBccGFyYW0gdmFsIGludDMyX3QgdG8gcmVhZAorICoKKyAqIFxyZXR1cm4gQkNNT1NfVFJVRSBpZiByZWFkIHN1Y2Nlc3NmdWwKKyAqLworc3RhdGljIGlubGluZSBiY21vc19ib29sIGJjbW9sdF9idWZfcmVhZF9zMzJfYmUoYmNtb2x0X2J1ZiAqYnVmLCBpbnQzMl90ICp2YWwpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfcmVhZF91MzJfYmUoYnVmLCAodWludDMyX3QgKil2YWwpOworfQorCisvKiogV3JpdGVzIGEgaW50MzJfdCB0byBhIGJ1ZmZlcgorICoKKyAqIFxwYXJhbSBidWYgICAgQnVmZmVyIHRvIHdyaXRlIHRvCisgKiBccGFyYW0gdmFsICAgIGludDMyX3QgdG8gd3JpdGUKKyAqCisgKiBccmV0dXJuICAgICAgIEJDTU9TX1RSVUUgaWYgd3JpdGUgc3VjY2Vzc2Z1bAorICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgYmNtb2x0X2J1Zl93cml0ZV9zMzIoYmNtb2x0X2J1ZiAqYnVmLCBpbnQzMl90IHZhbCkKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpdmFsKTsKK30KKworLyoqIFdyaXRlcyBhIGludDMyX3QgdG8gYSBCaWcgRW5kaWFuIGJ1ZmZlcgorICoKKyAqIFxwYXJhbSBidWYgICAgQnVmZmVyIHRvIHdyaXRlIHRvCisgKiBccGFyYW0gdmFsICAgIGludDMyX3QgdG8gd3JpdGUKKyAqCisgKiBccmV0dXJuICAgICAgIEJDTU9TX1RSVUUgaWYgd3JpdGUgc3VjY2Vzc2Z1bAorICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgYmNtb2x0X2J1Zl93cml0ZV9zMzJfYmUoYmNtb2x0X2J1ZiAqYnVmLCBpbnQzMl90IHZhbCkKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MzJfYmUoYnVmLCAodWludDMyX3QpdmFsKTsKK30KKworLyoqIFJlYWRzIGEgdWludDY0X3QgZnJvbSBhIGJ1ZmZlcgorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHRvIHJlYWQgZnJvbQorICogXHBhcmFtIHZhbCB1aW50NjRfdCB0byByZWFkCisgKgorICogXHJldHVybiBCQ01PU19UUlVFIGlmIHJlYWQgc3VjY2Vzc2Z1bAorICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgYmNtb2x0X2J1Zl9yZWFkX3U2NChiY21vbHRfYnVmICpidWYsIHVpbnQ2NF90ICp2YWwpCit7CisgICAgYmNtb3NfYm9vbCByZXMgPSBiY21vbHRfYnVmX3JlYWQoYnVmLCB2YWwsIHNpemVvZigqdmFsKSk7CisgICAgKnZhbCA9IEJDTU9MVF9CVUZfRU5ESUFOX0JVRl9UT19DUFUoVTY0LCAqdmFsKTsKKyAgICByZXR1cm4gcmVzOworfQorCisvKiogUmVhZHMgYSB1aW50NjRfdCBmcm9tIGEgQmlnIEVuZGlhbiBidWZmZXIKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciB0byByZWFkIGZyb20KKyAqIFxwYXJhbSB2YWwgdWludDY0X3QgdG8gcmVhZAorICoKKyAqIFxyZXR1cm4gQkNNT1NfVFJVRSBpZiByZWFkIHN1Y2Nlc3NmdWwKKyAqLworc3RhdGljIGlubGluZSBiY21vc19ib29sIGJjbW9sdF9idWZfcmVhZF91NjRfYmUoYmNtb2x0X2J1ZiAqYnVmLCB1aW50NjRfdCAqdmFsKQoreworICAgIGJjbW9zX2Jvb2wgcmVzID0gYmNtb2x0X2J1Zl9yZWFkKGJ1ZiwgdmFsLCBzaXplb2YoKnZhbCkpOworICAgICp2YWwgPSBCQ01PU19FTkRJQU5fQklHX1RPX0NQVV9VNjQoKnZhbCk7CisgICAgcmV0dXJuIHJlczsKK30KKworLyoqIFdyaXRlcyBhIHVpbnQ2NF90IHRvIGEgYnVmZmVyCisgKgorICogXHBhcmFtIGJ1ZiAgICBCdWZmZXIgdG8gd3JpdGUgdG8KKyAqIFxwYXJhbSB2YWwgICAgdWludDY0X3QgdG8gd3JpdGUKKyAqCisgKiBccmV0dXJuICAgICAgIEJDTU9TX1RSVUUgaWYgd3JpdGUgc3VjY2Vzc2Z1bAorICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgYmNtb2x0X2J1Zl93cml0ZV91NjQoYmNtb2x0X2J1ZiAqYnVmLCB1aW50NjRfdCB2YWwpCit7CisgICAgdmFsID0gQkNNT0xUX0JVRl9FTkRJQU5fQ1BVX1RPX0JVRihVNjQsIHZhbCk7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGUoYnVmLCAmdmFsLCBzaXplb2YodmFsKSk7Cit9CisKKy8qKiBXcml0ZXMgYSB1aW50NjRfdCB0byBhIEJpZyBFbmRpYW4gYnVmZmVyCisgKgorICogXHBhcmFtIGJ1ZiAgICBCdWZmZXIgdG8gd3JpdGUgdG8KKyAqIFxwYXJhbSB2YWwgICAgdWludDY0X3QgdG8gd3JpdGUKKyAqCisgKiBccmV0dXJuICAgICAgIEJDTU9TX1RSVUUgaWYgd3JpdGUgc3VjY2Vzc2Z1bAorICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgYmNtb2x0X2J1Zl93cml0ZV91NjRfYmUoYmNtb2x0X2J1ZiAqYnVmLCB1aW50NjRfdCB2YWwpCit7CisgICAgdmFsID0gQkNNT1NfRU5ESUFOX0NQVV9UT19CSUdfVTY0KHZhbCk7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGUoYnVmLCAmdmFsLCBzaXplb2YodmFsKSk7Cit9CisKKy8qKiBSZWFkcyBhIGludDY0X3QgZnJvbSBhIGJ1ZmZlcgorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHRvIHJlYWQgZnJvbQorICogXHBhcmFtIHZhbCBpbnQ2NF90IHRvIHJlYWQKKyAqCisgKiBccmV0dXJuIEJDTU9TX1RSVUUgaWYgcmVhZCBzdWNjZXNzZnVsCisgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfYm9vbCBiY21vbHRfYnVmX3JlYWRfczY0KGJjbW9sdF9idWYgKmJ1ZiwgaW50NjRfdCAqdmFsKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3JlYWRfdTY0KGJ1ZiwgKHVpbnQ2NF90ICopdmFsKTsKK30KKworLyoqIFJlYWRzIGEgaW50NjRfdCBmcm9tIGEgQmlnIEVuZGlhbiBidWZmZXIKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciB0byByZWFkIGZyb20KKyAqIFxwYXJhbSB2YWwgaW50NjRfdCB0byByZWFkCisgKgorICogXHJldHVybiBCQ01PU19UUlVFIGlmIHJlYWQgc3VjY2Vzc2Z1bAorICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgYmNtb2x0X2J1Zl9yZWFkX3M2NF9iZShiY21vbHRfYnVmICpidWYsIGludDY0X3QgKnZhbCkKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9yZWFkX3U2NF9iZShidWYsICh1aW50NjRfdCAqKXZhbCk7Cit9CisKKy8qKiBXcml0ZXMgYSBpbnQ2NF90IHRvIGEgYnVmZmVyCisgKgorICogXHBhcmFtIGJ1ZiAgICBCdWZmZXIgdG8gd3JpdGUgdG8KKyAqIFxwYXJhbSB2YWwgICAgaW50NjRfdCB0byB3cml0ZQorICoKKyAqIFxyZXR1cm4gICAgICAgQkNNT1NfVFJVRSBpZiB3cml0ZSBzdWNjZXNzZnVsCisgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfYm9vbCBiY21vbHRfYnVmX3dyaXRlX3M2NChiY21vbHRfYnVmICpidWYsIGludDY0X3QgdmFsKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U2NChidWYsICh1aW50NjRfdCl2YWwpOworfQorCisvKiogV3JpdGVzIGEgaW50NjRfdCB0byBhIEJpZyBFbmRpYW4gYnVmZmVyCisgKgorICogXHBhcmFtIGJ1ZiAgICBCdWZmZXIgdG8gd3JpdGUgdG8KKyAqIFxwYXJhbSB2YWwgICAgaW50NjRfdCB0byB3cml0ZQorICoKKyAqIFxyZXR1cm4gICAgICAgQkNNT1NfVFJVRSBpZiB3cml0ZSBzdWNjZXNzZnVsCisgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfYm9vbCBiY21vbHRfYnVmX3dyaXRlX3M2NF9iZShiY21vbHRfYnVmICpidWYsIGludDY0X3QgdmFsKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlX3U2NF9iZShidWYsICh1aW50NjRfdCl2YWwpOworfQorCisvKiogUmVhZHMgYSBmbG9hdCBmcm9tIGEgYnVmZmVyCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgdG8gcmVhZCBmcm9tCisgKiBccGFyYW0gdmFsIGZsb2F0IHRvIHJlYWQKKyAqCisgKiBccmV0dXJuIEJDTU9TX1RSVUUgaWYgcmVhZCBzdWNjZXNzZnVsCisgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfYm9vbCBiY21vbHRfYnVmX3JlYWRfZmxvYXQoYmNtb2x0X2J1ZiAqYnVmLCBmbG9hdCAqdmFsKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3JlYWRfdTMyKGJ1ZiwgKHVpbnQzMl90ICopdmFsKTsKK30KKworLyoqIFdyaXRlcyBhIGZsb2F0IHRvIGEgYnVmZmVyCisgKgorICogXHBhcmFtIGJ1ZiAgICBCdWZmZXIgdG8gd3JpdGUgdG8KKyAqIFxwYXJhbSB2YWwgICAgZmxvYXQgdG8gd3JpdGUKKyAqCisgKiBccmV0dXJuICAgICAgIEJDTU9TX1RSVUUgaWYgd3JpdGUgc3VjY2Vzc2Z1bAorICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgYmNtb2x0X2J1Zl93cml0ZV9mbG9hdChiY21vbHRfYnVmICpidWYsIGZsb2F0IHZhbCkKK3sKKyAgICB1aW50MzJfdCAqbnVtID0gKHVpbnQzMl90ICopJnZhbDsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91MzIoYnVmLCAqbnVtKTsKK30KKworLyoqIFJlYWRzIGEgZG91YmxlIGZyb20gYSBidWZmZXIKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciB0byByZWFkIGZyb20KKyAqIFxwYXJhbSB2YWwgZG91YmxlIHRvIHJlYWQKKyAqCisgKiBccmV0dXJuIEJDTU9TX1RSVUUgaWYgcmVhZCBzdWNjZXNzZnVsCisgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfYm9vbCBiY21vbHRfYnVmX3JlYWRfZG91YmxlKGJjbW9sdF9idWYgKmJ1ZiwgZG91YmxlICp2YWwpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfcmVhZF91NjQoYnVmLCAodWludDY0X3QgKil2YWwpOworfQorCisvKiogV3JpdGVzIGEgZG91YmxlIHRvIGEgYnVmZmVyCisgKgorICogXHBhcmFtIGJ1ZiAgICBCdWZmZXIgdG8gd3JpdGUgdG8KKyAqIFxwYXJhbSB2YWwgICAgZG91YmxlIHRvIHdyaXRlCisgKgorICogXHJldHVybiAgICAgICBCQ01PU19UUlVFIGlmIHdyaXRlIHN1Y2Nlc3NmdWwKKyAqLworc3RhdGljIGlubGluZSBiY21vc19ib29sIGJjbW9sdF9idWZfd3JpdGVfZG91YmxlKGJjbW9sdF9idWYgKmJ1ZiwgZG91YmxlIHZhbCkKK3sKKyAgICB1aW50NjRfdCAqbnVtID0gKHVpbnQ2NF90ICopJnZhbDsKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl93cml0ZV91NjQoYnVmLCAqbnVtKTsKK30KKworLyoqIFJlYWRzIGEgYmNtb3Nfdmxhbl90YWcgZnJvbSBhIGJ1ZmZlcgorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHRvIHJlYWQgZnJvbQorICogXHBhcmFtIHZhbCBiY21vc192bGFuX3RhZyB0byByZWFkCisgKgorICogXHJldHVybiBCQ01PU19UUlVFIGlmIHJlYWQgc3VjY2Vzc2Z1bAorICovCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgYmNtb2x0X2J1Zl9yZWFkX3ZsYW5fdGFnKGJjbW9sdF9idWYgKmJ1ZiwgYmNtb3Nfdmxhbl90YWcgKnZhbCkKK3sKKyAgICByZXR1cm4gYmNtb2x0X2J1Zl9yZWFkX3UxNihidWYsICh1aW50MTZfdCAqKXZhbCk7Cit9CisKKy8qKiBXcml0ZXMgYSBiY21vc192bGFuX3RhZyB0byBhIGJ1ZmZlcgorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHRvIHdyaXRlIHRvCisgKiBccGFyYW0gdmFsIGJjbW9zX3ZsYW5fdGFnIHRvIHdyaXRlCisgKgorICogXHJldHVybiBCQ01PU19UUlVFIGlmIHdyaXRlIHN1Y2Nlc3NmdWwKKyAqLworc3RhdGljIGlubGluZSBiY21vc19ib29sIGJjbW9sdF9idWZfd3JpdGVfdmxhbl90YWcoYmNtb2x0X2J1ZiAqYnVmLCBiY21vc192bGFuX3RhZyB2YWwpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KXZhbCk7Cit9CisKKy8qKiBSZWFkcyBhIGJjbW9zX21hY19hZGRyZXNzIGZyb20gYSBidWZmZXIKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciB0byByZWFkIGZyb20KKyAqIFxwYXJhbSB2YWwgYmNtb3NfbWFjX2FkZHJlc3MgdG8gcmVhZAorICoKKyAqIFxyZXR1cm4gQkNNT1NfVFJVRSBpZiByZWFkIHN1Y2Nlc3NmdWwKKyAqLworc3RhdGljIGlubGluZSBiY21vc19ib29sIGJjbW9sdF9idWZfcmVhZF9tYWNfYWRkcmVzcyhiY21vbHRfYnVmICpidWYsIGJjbW9zX21hY19hZGRyZXNzICp2YWwpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfcmVhZChidWYsIHZhbCwgc2l6ZW9mKGJjbW9zX21hY19hZGRyZXNzKSk7Cit9CisKKy8qKiBXcml0ZXMgYSBiY21vc19tYWNfYWRkcmVzcyB0byBhIGJ1ZmZlcgorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHRvIHdyaXRlIHRvCisgKiBccGFyYW0gdmFsIGJjbW9zX21hY19hZGRyZXNzIHRvIHdyaXRlCisgKgorICogXHJldHVybiBCQ01PU19UUlVFIGlmIHdyaXRlIHN1Y2Nlc3NmdWwKKyAqLworc3RhdGljIGlubGluZSBiY21vc19ib29sIGJjbW9sdF9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYmNtb2x0X2J1ZiAqYnVmLCBiY21vc19tYWNfYWRkcmVzcyB2YWwpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGUoYnVmLCAmdmFsLCBzaXplb2YoYmNtb3NfbWFjX2FkZHJlc3MpKTsKK30KKworLyoqIFJlYWRzIGEgYmNtb3NfaXB2NF9hZGRyZXNzIGZyb20gYSBidWZmZXIKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciB0byByZWFkIGZyb20KKyAqIFxwYXJhbSB2YWwgYmNtb3NfaXB2NF9hZGRyZXNzIHRvIHJlYWQKKyAqCisgKiBccmV0dXJuIEJDTU9TX1RSVUUgaWYgcmVhZCBzdWNjZXNzZnVsCisgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfYm9vbCBiY21vbHRfYnVmX3JlYWRfaXB2NF9hZGRyZXNzKGJjbW9sdF9idWYgKmJ1ZiwgYmNtb3NfaXB2NF9hZGRyZXNzICp2YWwpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfcmVhZChidWYsIHZhbC0+dTgsIHNpemVvZihiY21vc19pcHY0X2FkZHJlc3MpKTsKK30KKworLyoqIFdyaXRlcyBhIGJjbW9zX2lwdjRfYWRkcmVzcyB0byBhIGJ1ZmZlcgorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHRvIHdyaXRlIHRvCisgKiBccGFyYW0gdmFsIGJjbW9zX2lwdjRfYWRkcmVzcyB0byB3cml0ZQorICoKKyAqIFxyZXR1cm4gQkNNT1NfVFJVRSBpZiB3cml0ZSBzdWNjZXNzZnVsCisgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfYm9vbCBiY21vbHRfYnVmX3dyaXRlX2lwdjRfYWRkcmVzcyhiY21vbHRfYnVmICpidWYsIGJjbW9zX2lwdjRfYWRkcmVzcyB2YWwpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGUoYnVmLCB2YWwudTgsIHNpemVvZihiY21vc19pcHY0X2FkZHJlc3MpKTsKK30KKworLyoqIFJlYWRzIGEgYmNtb3NfaXB2Nl9hZGRyZXNzIGZyb20gYSBidWZmZXIKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciB0byByZWFkIGZyb20KKyAqIFxwYXJhbSB2YWwgYmNtb3NfaXB2Nl9hZGRyZXNzIHRvIHJlYWQKKyAqCisgKiBccmV0dXJuIEJDTU9TX1RSVUUgaWYgcmVhZCBzdWNjZXNzZnVsCisgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfYm9vbCBiY21vbHRfYnVmX3JlYWRfaXB2Nl9hZGRyZXNzKGJjbW9sdF9idWYgKmJ1ZiwgYmNtb3NfaXB2Nl9hZGRyZXNzICp2YWwpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfcmVhZChidWYsICp2YWwsIHNpemVvZihiY21vc19pcHY2X2FkZHJlc3MpKTsKK30KKworLyoqIFdyaXRlcyBhIGJjbW9zX2lwdjZfYWRkcmVzcyB0byBhIGJ1ZmZlcgorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHRvIHdyaXRlIHRvCisgKiBccGFyYW0gdmFsIGJjbW9zX2lwdjZfYWRkcmVzcyB0byB3cml0ZQorICoKKyAqIFxyZXR1cm4gQkNNT1NfVFJVRSBpZiB3cml0ZSBzdWNjZXNzZnVsCisgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfYm9vbCBiY21vbHRfYnVmX3dyaXRlX2lwdjZfYWRkcmVzcyhiY21vbHRfYnVmICpidWYsIGJjbW9zX2lwdjZfYWRkcmVzcyB2YWwpCit7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfd3JpdGUoYnVmLCB2YWwsIHNpemVvZihiY21vc19pcHY2X2FkZHJlc3MpKTsKK30KKworI2VuZGlmIC8qIEJDTU9MVF9CVUZfSF8gKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci91dGlscy9iY21vbHRfY29udi5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3V0aWxzL2JjbW9sdF9jb252LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ3MmMyMQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci91dGlscy9iY21vbHRfY29udi5jCkBAIC0wLDAgKzEsNTkgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21vbHRfdXRpbHMuaD4KKyNpbmNsdWRlICJiY21vbHRfY29udi5oIgorCitjaGFyICpiY21vbHRfc3RyZnRpbWUoY2hhciAqdGltZV9zdHIsIHRpbWVfdCB0LCBjb25zdCBjaGFyICp0aW1lem9uZV9zdHIpCit7CisgICAgc3RydWN0IHRtIHRzOworICAgIGludDMyX3QgdHpfaG91cjsKKyAgICB1aW50MzJfdCB0el9taW47CisgICAgCisgICAgdHMgPSAqbG9jYWx0aW1lKCZ0KTsKKyAgICBpZiAodGltZXpvbmVfc3RyICYmICp0aW1lem9uZV9zdHIpCisgICAgeworICAgICAgICBpZiAoc3NjYW5mKHRpbWV6b25lX3N0ciwgIiUwM2Q6JTAydSIsICZ0el9ob3VyLCAmdHpfbWluKSA8IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHR6X2hvdXIgPSAwOworICAgICAgICAgICAgdHpfbWluID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRzLnRtX2hvdXIgKz0gdHpfaG91cjsKKyAgICAgICAgICAgIHRzLnRtX21pbiArPSB0el9taW47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdHJmdGltZSh0aW1lX3N0ciwgQkNNT0xUX1RJTUVfU1RSX01BWF9MRU4sICIlYSAlWS0lbS0lZCAlSDolTTolUyIsICZ0cyk7CisKKyAgICByZXR1cm4gdGltZV9zdHI7Cit9CisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci91dGlscy9iY21vbHRfY29udi5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3V0aWxzL2JjbW9sdF9jb252LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBjOGEwYgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci91dGlscy9iY21vbHRfY29udi5oCkBAIC0wLDAgKzEsMTg2IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaWZuZGVmIF9CQ01PTFRfQ09OVl9IXworI2RlZmluZSBfQkNNT0xUX0NPTlZfSF8KKworI2lmbmRlZiBDRkVfQlVJTEQKKyNpbmNsdWRlIDxiY21vbHRfdXRpbHMuaD4KKyNlbmRpZgorCisvKiBNYWNybyBmb3IgZ2VuZXJhdGluZyBhIGdlbmVyaWMgY29udmVyc2lvbiBmcm9tIHR5cGUgQSB0byB0eXBlIEIuCisgKiBFeGFtcGxlOgorICoKKyAqICAgICAgQkNNT0xUX1RZUEUyVFlQRShid3NfZGJhX2NvbnRyb2xfaWQsIGJ3c19kYmFfY29udHJvbF9jYiwgc3RhdGljKQorICoKKyAqIHdpbGwgZXhwYW5kIHRvOgorICoKKyAqICAgICB0eXBlZGVmIHN0cnVjdAorICogICAgIHsKKyAqICAgICAgICAgYndzX2RiYV9jb250cm9sX2lkIGZyb207CisgKiAgICAgICAgIGJ3c19kYmFfY29udHJvbF9jYiB0bzsKKyAqICAgICB9CisgKiAgICAgYndzX2RiYV9jb250cm9sX2lkMmJ3c19kYmFfY29udHJvbF9jYl90OworICogICAgIAorICogICAgIHN0YXRpYyBid3NfZGJhX2NvbnRyb2xfaWQyYndzX2RiYV9jb250cm9sX2NiX3QgYndzX2RiYV9jb250cm9sX2lkMmJ3c19kYmFfY29udHJvbF9jYltdOworICogICAgIAorICogICAgIHN0YXRpYyBpbmxpbmUgYndzX2RiYV9jb250cm9sX2NiIGJ3c19kYmFfY29udHJvbF9pZDJid3NfZGJhX2NvbnRyb2xfY2JfY29udihid3NfZGJhX2NvbnRyb2xfaWQgZnJvbSkKKyAqICAgICB7CisgKiAgICAgICAgIGNvbnN0IGJ3c19kYmFfY29udHJvbF9pZDJid3NfZGJhX2NvbnRyb2xfY2JfdCAqYXJyID0gYndzX2RiYV9jb250cm9sX2lkMmJ3c19kYmFfY29udHJvbF9jYjsKKyAqICAgICAgICAgZm9yICg7IGFyci0+ZnJvbSAhPSAoYndzX2RiYV9jb250cm9sX2lkKS0xICYmIGFyci0+ZnJvbSAhPSBmcm9tOyBhcnIrKyk7CisgKiAgICAgICAgIHJldHVybiBhcnItPnRvOworICogICAgIH0KKyAqLworI2RlZmluZSBCQ01PTFRfVFlQRTJUWVBFKGZyb21fdHlwZSwgdG9fdHlwZSwgc2NvcGUpIFwKKyAgICB0eXBlZGVmIHN0cnVjdCBcCisgICAgeyBcCisgICAgICAgIGZyb21fdHlwZSBmcm9tOyBcCisgICAgICAgIHRvX3R5cGUgdG87IFwKKyAgICB9IFwKKyAgICBmcm9tX3R5cGUjIzIjI3RvX3R5cGUjI190OyBcCisgICAgc2NvcGUgZnJvbV90eXBlIyMyIyN0b190eXBlIyNfdCBmcm9tX3R5cGUjIzIjI3RvX3R5cGVbXTsgXAorICAgIHN0YXRpYyBpbmxpbmUgdG9fdHlwZSBmcm9tX3R5cGUjIzIjI3RvX3R5cGUjI19jb252KGZyb21fdHlwZSBmcm9tKSBcCisgICAgeyBcCisgICAgICAgIGNvbnN0IGZyb21fdHlwZSMjMiMjdG9fdHlwZSMjX3QgKmFyciA9IGZyb21fdHlwZSMjMiMjdG9fdHlwZTsgXAorICAgICAgICBmb3IgKDsgYXJyLT5mcm9tICE9IChmcm9tX3R5cGUpLTEgJiYgYXJyLT5mcm9tICE9IGZyb207IGFycisrKTsgXAorICAgICAgICByZXR1cm4gYXJyLT50bzsgXAorICAgIH0KKworLyogTWFjcm8gZm9yIGdlbmVyYXRpbmcgYSBnZW5lcmljIGNvbnZlcnNpb24gZnJvbSB0eXBlIEEgdG8gYSBjb25zdGFudCBzdHJpbmcuCisgKiBFeGFtcGxlOgorICoKKyAqICAgICAgQkNNT0xUX1RZUEUyU1RSKHBvbl9tb2RlLCBleHRlcm4pCisgKgorICogd2lsbCBleHBhbmQgdG86CisgKgorICogICAgIHR5cGVkZWYgc3RydWN0CisgKiAgICAgeworICogICAgICAgICBwb25fbW9kZSBmcm9tOworICogICAgICAgICBjb25zdCBjaGFyICp0bzsKKyAqICAgICB9CisgKiAgICAgcG9uX21vZGUyc3RyX3Q7CisgKgorICogICAgIGV4dGVybiBwb25fbW9kZTJzdHJfdCBwb25fbW9kZTJzdHJbXTsKKyAqCisgKiAgICAgc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpwb25fbW9kZTJzdHJfY29udihwb25fbW9kZSBmcm9tKQorICogICAgIHsKKyAqICAgICAgICAgY29uc3QgcG9uX21vZGUyc3RyX3QgKmFyciA9IHBvbl9tb2RlMnN0cjsKKyAqICAgICAgICAgZm9yICg7IGFyci0+ZnJvbSAhPSAocG9uX21vZGUpLTEgJiYgYXJyLT5mcm9tICE9IGZyb207IGFycisrKTsKKyAqICAgICAgICAgcmV0dXJuIGFyci0+dG87CisgKiAgICAgfQorICovCisjZGVmaW5lIEJDTU9MVF9UWVBFMlNUUihmcm9tX3R5cGUsIHNjb3BlKSBcCisgICAgdHlwZWRlZiBzdHJ1Y3QgXAorICAgIHsgXAorICAgICAgICBmcm9tX3R5cGUgZnJvbTsgXAorICAgICAgICBjb25zdCBjaGFyICp0bzsgXAorICAgIH0gXAorICAgIGZyb21fdHlwZSMjMnN0cl90OyBcCisgICAgc2NvcGUgZnJvbV90eXBlIyMyc3RyX3QgZnJvbV90eXBlIyMyc3RyW107IFwKKyAgICBzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmZyb21fdHlwZSMjMnN0cl9jb252KGZyb21fdHlwZSBmcm9tKSBcCisgICAgeyBcCisgICAgICAgIGNvbnN0IGZyb21fdHlwZSMjMnN0cl90ICphcnIgPSBmcm9tX3R5cGUjIzJzdHI7IFwKKyAgICAgICAgZm9yICg7IGFyci0+ZnJvbSAhPSAoZnJvbV90eXBlKS0xICYmIGFyci0+ZnJvbSAhPSBmcm9tOyBhcnIrKyk7IFwKKyAgICAgICAgcmV0dXJuIGFyci0+dG87IFwKKyAgICB9CisKKy8qIE1hY3JvIGZvciBnZW5lcmF0aW5nIGEgZ2VuZXJpYyBjb252ZXJzaW9uIGZyb20gdHlwZSBBIHRvIGFuIGludGVnZXIuCisgKiBFeGFtcGxlOgorICoKKyAqICAgICAgQkNNT0xUX1RZUEUySU5UKHBsb2FtX2RzX2dwb25fbWVzc2FnZV9pZCwgcmVwZXRpdGlvbnMsIGV4dGVybikKKyAqCisgKiB3aWxsIGV4cGFuZCB0bzoKKyAqIAorICogICAgIHR5cGVkZWYgc3RydWN0CisgKiAgICAgeworICogICAgICAgICBwbG9hbV9kc19ncG9uX21lc3NhZ2VfaWQgZnJvbTsKKyAqICAgICAgICAgaW50IHRvOworICogICAgIH0KKyAqICAgICBwbG9hbV9kc19ncG9uX21lc3NhZ2VfaWQycmVwZXRpdGlvbnNfdDsKKyAqCisgKiAgICAgZXh0ZXJuIHBsb2FtX2RzX2dwb25fbWVzc2FnZV9pZDJyZXBldGl0aW9uc190IHBsb2FtX2RzX2dwb25fbWVzc2FnZV9pZDJyZXBldGl0aW9uc1tdOworICoKKyAqICAgICBzdGF0aWMgaW5saW5lIGludCBwbG9hbV9kc19ncG9uX21lc3NhZ2VfaWQycmVwZXRpdGlvbnNfY29udihwbG9hbV9kc19ncG9uX21lc3NhZ2VfaWQgZnJvbSkKKyAqICAgICB7CisgKiAgICAgICAgIGNvbnN0IHBsb2FtX2RzX2dwb25fbWVzc2FnZV9pZDJyZXBldGl0aW9uc190ICphcnIgPSBwbG9hbV9kc19ncG9uX21lc3NhZ2VfaWQycmVwZXRpdGlvbnM7CisgKiAgICAgICAgIGZvciAoOyBhcnItPmZyb20gIT0gKHBsb2FtX2RzX2dwb25fbWVzc2FnZV9pZCktMSAmJiBhcnItPmZyb20gIT0gZnJvbTsgYXJyKyspOworICogICAgICAgICByZXR1cm4gYXJyLT50bzsKKyAqICAgICB9CisgKi8KKyNkZWZpbmUgQkNNT0xUX1RZUEUySU5UKGZyb21fdHlwZSwgdG9fbmFtZSwgc2NvcGUpIFwKKyAgICB0eXBlZGVmIHN0cnVjdCBcCisgICAgeyBcCisgICAgICAgIGZyb21fdHlwZSBmcm9tOyBcCisgICAgICAgIGludCB0bzsgXAorICAgIH0gXAorICAgIGZyb21fdHlwZSMjMiMjdG9fbmFtZSMjX3Q7IFwKKyAgICBzY29wZSBmcm9tX3R5cGUjIzIjI3RvX25hbWUjI190IGZyb21fdHlwZSMjMiMjdG9fbmFtZVtdOyBcCisgICAgc3RhdGljIGlubGluZSBpbnQgZnJvbV90eXBlIyMyIyN0b19uYW1lIyNfY29udihmcm9tX3R5cGUgZnJvbSkgXAorICAgIHsgXAorICAgICAgICBjb25zdCBmcm9tX3R5cGUjIzIjI3RvX25hbWUjI190ICphcnIgPSBmcm9tX3R5cGUjIzIjI3RvX25hbWU7IFwKKyAgICAgICAgZm9yICg7IGFyci0+ZnJvbSAhPSAoZnJvbV90eXBlKS0xICYmIGFyci0+ZnJvbSAhPSBmcm9tOyBhcnIrKyk7IFwKKyAgICAgICAgcmV0dXJuIGFyci0+dG87IFwKKyAgICB9CisKKy8qIEFsdGhvdWdoIHdlIGhhdmUgQkNNT0xUX1RZUEUyU1RSLCBpbnQyc3RyX3QgaXMgc3RpbGwgcmVxdWlyZWQgd2hlbiB0aGUgc2FtZSBnZW5lcmljIHBvaW50ZXIgbmVlZHMgdG8gcG9pbnQgdG8gMiBkaWZmZXJlbnQgdHlwZXMgKGUuZzogb25lIHNwZWNpZmljIGZvciBHUE9OIGFuZAorICogdGhlIG90aGVyIHNwZWNpZmljIGZvciBYR1BPTikuICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIGludCBmcm9tOworICAgIGNvbnN0IGNoYXIgKnRvOworfQoraW50MnN0cl90OworCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmludDJzdHIoY29uc3QgaW50MnN0cl90ICphcnIsIGludCBmcm9tKQoreworICAgIGZvciAoOyBhcnItPmZyb20gIT0gLTEgJiYgYXJyLT5mcm9tICE9IGZyb207IGFycisrKTsKKyAgICByZXR1cm4gYXJyLT50bzsKK30KKworLyogQWx0aG91Z2ggd2UgaGF2ZSBCQ01PTFRfVFlQRTJJTlQsIGludDJpbnRfdCBpcyBzdGlsbCByZXF1aXJlZCB3aGVuIHRoZSBzYW1lIGdlbmVyaWMgcG9pbnRlciBuZWVkcyB0byBwb2ludCB0byAyIGRpZmZlcmVudCB0eXBlcyAoZS5nOiBvbmUgc3BlY2lmaWMgZm9yIEdQT04gYW5kCisgKiB0aGUgb3RoZXIgc3BlY2lmaWMgZm9yIFhHUE9OKS4gKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgaW50IGZyb207CisgICAgaW50IHRvOworfQoraW50MmludF90OworCitzdGF0aWMgaW5saW5lIGludCBpbnQyaW50KGNvbnN0IGludDJpbnRfdCAqYXJyLCBpbnQgZnJvbSkKK3sKKyAgICBmb3IgKDsgYXJyLT5mcm9tICE9IC0xICYmIGFyci0+ZnJvbSAhPSBmcm9tOyBhcnIrKyk7CisgICAgcmV0dXJuIGFyci0+dG87Cit9CisKKyNpZm5kZWYgQ0ZFX0JVSUxECitjaGFyICpiY21vbHRfc3RyZnRpbWUoY2hhciAqdGltZV9zdHIsIHRpbWVfdCB0LCBjb25zdCBjaGFyICp0aW1lem9uZV9zdHIpOworI2VuZGlmCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdXRpbHMvYmNtb2x0X2Zpcm13YXJlX2VudmVsb3BlLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdXRpbHMvYmNtb2x0X2Zpcm13YXJlX2VudmVsb3BlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ0ZDZkMAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci91dGlscy9iY21vbHRfZmlybXdhcmVfZW52ZWxvcGUuaApAQCAtMCwwICsxLDk1IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OnByb3ByaWV0YXJ5OnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVGhpcyBwcm9ncmFtIGlzIHRoZSBwcm9wcmlldGFyeSBzb2Z0d2FyZSBvZiBCcm9hZGNvbSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzCitsaWNlbnNvcnMsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBkdXBsaWNhdGVkLCBtb2RpZmllZCBvciBkaXN0cmlidXRlZCBwdXJzdWFudAordG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIGEgc2VwYXJhdGUsIHdyaXR0ZW4gbGljZW5zZSBhZ3JlZW1lbnQgZXhlY3V0ZWQKK2JldHdlZW4geW91IGFuZCBCcm9hZGNvbSAoYW4gIkF1dGhvcml6ZWQgTGljZW5zZSIpLiAgRXhjZXB0IGFzIHNldCBmb3J0aCBpbgorYW4gQXV0aG9yaXplZCBMaWNlbnNlLCBCcm9hZGNvbSBncmFudHMgbm8gbGljZW5zZSAoZXhwcmVzcyBvciBpbXBsaWVkKSwgcmlnaHQKK3RvIHVzZSwgb3Igd2FpdmVyIG9mIGFueSBraW5kIHdpdGggcmVzcGVjdCB0byB0aGUgU29mdHdhcmUsIGFuZCBCcm9hZGNvbQorZXhwcmVzc2x5IHJlc2VydmVzIGFsbCByaWdodHMgaW4gYW5kIHRvIHRoZSBTb2Z0d2FyZSBhbmQgYWxsIGludGVsbGVjdHVhbAorcHJvcGVydHkgcmlnaHRzIHRoZXJlaW4uICBJRiBZT1UgSEFWRSBOTyBBVVRIT1JJWkVEIExJQ0VOU0UsIFRIRU4gWU9VIEhBVkUKK05PIFJJR0hUIFRPIFVTRSBUSElTIFNPRlRXQVJFIElOIEFOWSBXQVksIEFORCBTSE9VTEQgSU1NRURJQVRFTFkgTk9USUZZCitCUk9BRENPTSBBTkQgRElTQ09OVElOVUUgQUxMIFVTRSBPRiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBleHByZXNzbHkgc2V0IGZvcnRoIGluIHRoZSBBdXRob3JpemVkIExpY2Vuc2UsCisKKzEuIFRoaXMgcHJvZ3JhbSwgaW5jbHVkaW5nIGl0cyBzdHJ1Y3R1cmUsIHNlcXVlbmNlIGFuZCBvcmdhbml6YXRpb24sCisgICAgY29uc3RpdHV0ZXMgdGhlIHZhbHVhYmxlIHRyYWRlIHNlY3JldHMgb2YgQnJvYWRjb20sIGFuZCB5b3Ugc2hhbGwgdXNlCisgICAgYWxsIHJlYXNvbmFibGUgZWZmb3J0cyB0byBwcm90ZWN0IHRoZSBjb25maWRlbnRpYWxpdHkgdGhlcmVvZiwgYW5kIHRvCisgICAgdXNlIHRoaXMgaW5mb3JtYXRpb24gb25seSBpbiBjb25uZWN0aW9uIHdpdGggeW91ciB1c2Ugb2YgQnJvYWRjb20KKyAgICBpbnRlZ3JhdGVkIGNpcmN1aXQgcHJvZHVjdHMuCisKKzIuIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIgorICAgIEFORCBXSVRIIEFMTCBGQVVMVFMgQU5EIEJST0FEQ09NIE1BS0VTIE5PIFBST01JU0VTLCBSRVBSRVNFTlRBVElPTlMgT1IKKyAgICBXQVJSQU5USUVTLCBFSVRIRVIgRVhQUkVTUywgSU1QTElFRCwgU1RBVFVUT1JZLCBPUiBPVEhFUldJU0UsIFdJVEgKKyAgICBSRVNQRUNUIFRPIFRIRSBTT0ZUV0FSRS4gIEJST0FEQ09NIFNQRUNJRklDQUxMWSBESVNDTEFJTVMgQU5ZIEFORAorICAgIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgVElUTEUsIE1FUkNIQU5UQUJJTElUWSwgTk9OSU5GUklOR0VNRU5ULAorICAgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBMQUNLIE9GIFZJUlVTRVMsIEFDQ1VSQUNZIE9SCisgICAgQ09NUExFVEVORVNTLCBRVUlFVCBFTkpPWU1FTlQsIFFVSUVUIFBPU1NFU1NJT04gT1IgQ09SUkVTUE9OREVOQ0UKKyAgICBUTyBERVNDUklQVElPTi4gWU9VIEFTU1VNRSBUSEUgRU5USVJFIFJJU0sgQVJJU0lORyBPVVQgT0YgVVNFIE9SCisgICAgUEVSRk9STUFOQ0UgT0YgVEhFIFNPRlRXQVJFLgorCiszLiBUTyBUSEUgTUFYSU1VTSBFWFRFTlQgUEVSTUlUVEVEIEJZIExBVywgSU4gTk8gRVZFTlQgU0hBTEwgQlJPQURDT00gT1IKKyAgICBJVFMgTElDRU5TT1JTIEJFIExJQUJMRSBGT1IgKGkpIENPTlNFUVVFTlRJQUwsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgICAgSU5ESVJFQ1QsIE9SIEVYRU1QTEFSWSBEQU1BR0VTIFdIQVRTT0VWRVIgQVJJU0lORyBPVVQgT0YgT1IgSU4gQU5ZCisgICAgV0FZIFJFTEFUSU5HIFRPIFlPVVIgVVNFIE9GIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFNPRlRXQVJFIEVWRU4KKyAgICBJRiBCUk9BRENPTSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVM7CisgICAgT1IgKGlpKSBBTlkgQU1PVU5UIElOIEVYQ0VTUyBPRiBUSEUgQU1PVU5UIEFDVFVBTExZIFBBSUQgRk9SIFRIRQorICAgIFNPRlRXQVJFIElUU0VMRiBPUiBVLlMuICQxLCBXSElDSEVWRVIgSVMgR1JFQVRFUi4gVEhFU0UgTElNSVRBVElPTlMKKyAgICBTSEFMTCBBUFBMWSBOT1RXSVRIU1RBTkRJTkcgQU5ZIEZBSUxVUkUgT0YgRVNTRU5USUFMIFBVUlBPU0UgT0YgQU5ZCisgICAgTElNSVRFRCBSRU1FRFkuCis6PgorKi8KKyNpZm5kZWYgX0JDTU9MVF9GSVJNV0FSRV9FTlZFTE9QRV9IXworI2RlZmluZSBfQkNNT0xUX0ZJUk1XQVJFX0VOVkVMT1BFX0hfCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKworI2RlZmluZSBCQ01PTFRfRklSTVdBUkVfRU5WRUxPUEVfREVTQ19NQVhfU0laRSAxMjgKKyNkZWZpbmUgQkNNT0xUX0ZJUk1XQVJFX0VOVkVMT1BFX1RJTUVfWk9ORV9TSVpFIDcKKyNkZWZpbmUgQkNNT0xUX0ZJUk1XQVJFX0VOVkVMT1BFX01ENV9DSEVDS1NVTV9TSVpFIDE2CisKKy8qIE5vcm1hbGl6ZWQgZm9ybSBvZiBhIGZpcm13YXJlIHJldmlzaW9uIGZvciBjb21wYXJpc29uIHB1cnBvc2VzLiAqLworI2RlZmluZSBERVZJQ0VfTUdNVF9SRVZJU0lPTl9SRUxFQVNFX01BSk9SX0lEX1NISUZUIDI0CisjZGVmaW5lIERFVklDRV9NR01UX1JFVklTSU9OX1JFTEVBU0VfTUlOT1JfSURfU0hJRlQgMTYKKyNkZWZpbmUgREVWSUNFX01HTVRfUkVWSVNJT05fUkVMRUFTRV9SRVZJU0lPTl9JRF9TSElGVCA4CisjZGVmaW5lIERFVklDRV9NR01UX1JFVklTSU9OX01PREVMX0lEX1NISUZUIDAKKworI2RlZmluZSBCQ01PTFRfRklSTVdBUkVfRU5WRUxPUEVfTk9STUFMSVpFKHJldl9hKSBcCisgICAgKCgocmV2X2EpLT5yZWxlYXNlX21ham9yX2lkIDw8IERFVklDRV9NR01UX1JFVklTSU9OX1JFTEVBU0VfTUFKT1JfSURfU0hJRlQpIHwgXAorICAgICgocmV2X2EpLT5yZWxlYXNlX21pbm9yX2lkIDw8IERFVklDRV9NR01UX1JFVklTSU9OX1JFTEVBU0VfTUlOT1JfSURfU0hJRlQpIHwgXAorICAgICgocmV2X2EpLT5yZWxlYXNlX3JldmlzaW9uX2lkIDw8IERFVklDRV9NR01UX1JFVklTSU9OX1JFTEVBU0VfUkVWSVNJT05fSURfU0hJRlQpIHwgXAorICAgICgocmV2X2EpLT5tb2RlbF9pZCA8PCBERVZJQ0VfTUdNVF9SRVZJU0lPTl9NT0RFTF9JRF9TSElGVCkpCisKK3R5cGVkZWYgc3RydWN0IF9fUEFDS0VEX0FUVFJfU1RBUlRfXworeworICAgIHVpbnQ4X3QgcmVsZWFzZV9tYWpvcl9pZDsKKyAgICB1aW50OF90IHJlbGVhc2VfbWlub3JfaWQ7CisgICAgdWludDhfdCByZWxlYXNlX3JldmlzaW9uX2lkOworICAgIHVpbnQzMl90IG1vZGVsX2lkOworfSBfX1BBQ0tFRF9BVFRSX0VORF9fIGJjbW9sdF9maXJtd2FyZV9lbnZlbG9wZV9yZXZpc2lvbjsKKwordHlwZWRlZiBzdHJ1Y3QgX19QQUNLRURfQVRUUl9TVEFSVF9fCit7CisgICAgdWludDhfdCBlbnZlbG9wZV9yZXZpc2lvbjsgLyogVGhlIGVudmVsb3BlIGl0c2VsZiBjYW4gYmUgY2hhbmdlZCBvdmVyIHRpbWUsIHNvIHRoaXMgZXhwbGFpbnMgd2h5IHdlIG5lZWQgYW4gZW52ZWxvcGUgcmV2aXNpb24gZmllbGQuICovCisgICAgYmNtb2x0X2Zpcm13YXJlX2VudmVsb3BlX3JldmlzaW9uIHJldmlzaW9uOyAvKiBSZXZpc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIHVpbnQzMl90IGJsb2NrX2lzc3VfZW5mb3JjZTsgLyogRXZlcnkgdGltZSBhIGNoYW5nZSBpbiB0aGUgY29kZSBjYW5ub3QgYmUgc3VwcG9ydGVkIGluIElTU1UgYW5kIHJlcXVpcmVzIGEgcmVndWxhciB1cGdyYWRlIChlLmcuOiBTR0IvU0VSREVTIGZpcm13YXJlIHVwZ3JhZGUpLCB0aGlzIGludGVnZXIgbnVtYmVyIHdpbGwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBiZSBpbmNyZW1lbnRlZC4gSWYgcmV2aXNpb24gdmFsaWRhdGlvbiBmdW5jdGlvbiBkZXRlY3RzIGEgY2hhbmdlIGluIHRoaXMgaW50ZWdlciBiZXR3ZWVuIHR3byByZXZpc2lvbnMsIHRoZW4gaXQgd2lsbCBibG9jayBJU1NVLiAqLworICAgIHVpbnQzMl90IHA0X2NoYW5nZV9zZXQ7IC8qIFRoaXMgaXMgcHVyZWx5IGluZm9ybWF0aXZlIGZpZWxkIHRoYXQgc2hvdWxkIGhhdmUgbm8gaW1wYWN0IG9uIHZhbGlkYXRpb24uICovCisgICAgdWludDMyX3QgYnVpbGRfdGltZTsgLyogVGhpcyBpcyBwdXJlbHkgaW5mb3JtYXRpdmUgZmllbGQgdGhhdCBzaG91bGQgaGF2ZSBubyBpbXBhY3Qgb24gdmFsaWRhdGlvbi4gSXQgY29udGFpbnMgdGhlIGRhdGUvdGltZSBvZiB0aGUgaW1hZ2UgaXRzZWxmLCBleHByZXNzZWQgYXMgc2Vjb25kcyBzaW5jZSB0aGUgRVBPQ0guICovCisgICAgY2hhciBidWlsZF90aW1lX3pvbmVbQkNNT0xUX0ZJUk1XQVJFX0VOVkVMT1BFX1RJTUVfWk9ORV9TSVpFXTsgLyogVGhpcyBpcyBwdXJlbHkgaW5mb3JtYXRpdmUgZmllbGQgdGhhdCBzaG91bGQgaGF2ZSBubyBpbXBhY3Qgb24gdmFsaWRhdGlvbi4gSXQgZ29lcyBhbG9uZyB3aXRoIGJ1aWxkIHRpbWUgb3B0aW9uIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHByb3ZpZGVzIHRpbWUgem9uZSBpbmZvcm1hdGlvbiwgYXMgdGhlIGVtYmVkZGVkIHNpZGUgZG9lcyBub3Qga25vdyBhbnl0aGluZyBhYm91dCB0aW1lIHpvbmUgKHdpdGhvdXQgdGhhdCwgdGhlIGJ1aWxkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdGltZSBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcgd2lsbCBhbHdheXMgeWllbGQgR01UIHRpbWUsIG5vdCBsb2NhbCB0aW1lKS4gKi8KKyAgICB1aW50OF90IGRlc2NbQkNNT0xUX0ZJUk1XQVJFX0VOVkVMT1BFX0RFU0NfTUFYX1NJWkVdOyAvKiBUaGlzIGlzIHB1cmVseSBpbmZvcm1hdGl2ZSBmaWVsZCB0aGF0IHNob3VsZCBoYXZlIG5vIGltcGFjdCBvbiB2YWxpZGF0aW9uLiAqLworICAgIHVpbnQ4X3QgbWQ1X2NoZWNrc3VtW0JDTU9MVF9GSVJNV0FSRV9FTlZFTE9QRV9NRDVfQ0hFQ0tTVU1fU0laRV07IC8qIFRoZSBNRDUgY2hlY2tzdW0gc2hvdWxkIGJlIGFwcGxpZWQgb24gdGhlIGltYWdlIGl0c2VsZiwgbm90IG9uIHRoZSBlbnZlbG9wZS4gVGhpcyBtYXkgYmUgcmVkdW5kYW50IGJlY2F1c2Ugd2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhdXRvbWF0aWNhbGx5IGRvIENSQyBpbmhlcmVudGx5IGFzIHBhcnQgb2YgaW1hZ2UgdHJhbnNmZXIgbWVjaGFuaXNtLiBIb3dldmVyLCB0aGlzIG1heSBoYXZlIHNvbWUgZnV0dXJlIHVzZS4gKi8KKyAgICB1aW50MzJfdCBpbWFnZV9sZW47IC8qIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBpbWFnZSBpdHNlbGYsIG5vdCB3aXRoIHRoZSBlbnZlbG9wZS4gNCBieXRlcyBzaG91bGQgYmUgYmlnIGVub3VnaCB0byBhY2NvbW1vZGF0ZSBpbWFnZSBsZW5ndGggdXAgdG8gNEdCLCB3aGljaCBpcyBmYXIgYmV5b25kIHdoYXQgd2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHJlYWxseSBuZWVkLiAqLworfSBfX1BBQ0tFRF9BVFRSX0VORF9fIGJjbW9sdF9maXJtd2FyZV9lbnZlbG9wZTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci91dGlscy9iY21vbHRfbWF0aC5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3V0aWxzL2JjbW9sdF9tYXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI1MmEwMAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci91dGlscy9iY21vbHRfbWF0aC5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgX0JDTU9MVF9NQVRIX0hfCisjZGVmaW5lIF9CQ01PTFRfTUFUSF9IXworCisjaW5jbHVkZSA8bWF0aC5oPgorCisjZGVmaW5lIFJPVU5EX1UzMihzaXplX2luX2J5dGVzKSAoKHVpbnQzMl90KSgoc2l6ZV9pbl9ieXRlcykgKyAwLjUpKQorI2RlZmluZSBDRUlMX1UzMihzaXplX2luX2J5dGVzKSAoKChzaXplX2luX2J5dGVzKS0odWludDMyX3QpKHNpemVfaW5fYnl0ZXMpKSA+IDAgPyAoKHVpbnQzMl90KShzaXplX2luX2J5dGVzKSsxKSA6ICh1aW50MzJfdCkoc2l6ZV9pbl9ieXRlcykpCisjZGVmaW5lIFNRVUFSRSh4KSAoKHgpICogKHgpKQorI2RlZmluZSBQRVJDRU5UKHBlcmNlbnQsIHgpICgoKGZsb2F0KShwZXJjZW50KSAqICh4KSkgLyAxMDApCisKKy8qCisgKiBVbml0IENvbnZlcnNpb24KKyAqLworI2RlZmluZSBCSVRTX1RPX0JZVEVTKGJpdHMpICgoYml0cykgPj4gMykKKyNkZWZpbmUgQllURVNfVE9fQklUUyhieXRlcykgKChieXRlcykgPDwgMykKKworLyogUXVhbnRpemF0aW9uICovCisKKy8qCisgKiBWQUxfVE9fQklOIGNsYXNzaWZpZXMgdGhlIHZhbHVlIG9mIHZhbCB0byB0aGUgcHJvcGVyIGJpbgorICogdmFsIC0gYSB2YWx1ZSBpbiB0aGUgcmFuZ2UgWzAsIG1heHZhbF0KKyAqIGJpbiAtIGEgdmFsdWUgaW4gdGhlIHJhbmdlIFswLCBiaW5zLTFdIChyZXN1bHQgb2YgbWFjcm8pCisgKi8KKyNkZWZpbmUgVkFMX1RPX0JJTih2YWwsIG1heHZhbCwgYmlucykgKCh2YWwpIDwgKG1heHZhbCkgPyAoKHZhbCkgKiAoYmlucykpIC8gKG1heHZhbCkgOiAoYmlucykgLSAxKQorCisvKiBJZiBhIHZhbHVlIGlzIGluIGEgY2VydGFpbiBiaW4sIGl0IGlzIGluIHRoZSByYW5nZSBbbWluX2Jpbl92YWwsIG1heF9iaW5fdmFsXQorICogbWluX2Jpbl92YWwgLSBtaW5pbXVtIHZhbHVlIHRoYXQgYmVsb25ncyB0byBiaW4KKyAqIG1heF9iaW5fdmFsIC0gbWF4aW11bSB2YWx1ZSB0aGF0IGJlbG9uZ3MgdG8gYmluCisgKi8KKyNkZWZpbmUgQklOX1RPX01JTl9CSU5fVkFMKGJpbiwgbWF4dmFsLCBiaW5zKSAoKGJpbikgKiAoKGRvdWJsZSkobWF4dmFsKSAvIChiaW5zKSkpCisjZGVmaW5lIEJJTl9UT19NQVhfQklOX1ZBTChiaW4sIG1heHZhbCwgYmlucykgKCgoYmluKSArIDEpICogKChkb3VibGUpKG1heHZhbCkgLyAoYmlucykpKQorCisjZGVmaW5lIEdFVF9NQVNLKHdpZHRoKSAgICAgICAgICAgICAoKDEgPDwgKHdpZHRoKSkgLSAxKQorCisjZGVmaW5lIE1BWChhLCBiKSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQorI2RlZmluZSBNSU4oYSwgYikgKChhKSA8IChiKSA/IChhKSA6IChiKSkKKyNkZWZpbmUgTUFYMyhhLCBiLCBjKSBNQVgoTUFYKGEsIGIpLCBjKQorI2RlZmluZSBNSU4zKGEsIGIsIGMpIE1JTihNSU4oYSwgYiksIGMpCisKKyNkZWZpbmUgQ0VJTElORyhhLCBiKSAgICgoKGEpICsgKChiKSAtIDEpKSAvIChiKSkKKworI2VuZGlmIC8qIF9CQ01PTFRfTUFUSF9IXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3V0aWxzL2JjbW9sdF9tb2R1bGUuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci91dGlscy9iY21vbHRfbW9kdWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ1MTNlOQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci91dGlscy9iY21vbHRfbW9kdWxlLmgKQEAgLTAsMCArMSw1MiBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBfQkNNT0xUX01PRFVMRV9IXworI2RlZmluZSBfQkNNT0xUX01PRFVMRV9IXworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtb2x0X21vZGVsX3R5cGVzLmg+CisjaW5jbHVkZSA8YmNtX2Rldl9sb2cuaD4KKworLyogVGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgY2FuIGJlIHVzZWQgYnkgcHJvYmFibHkgYWxsIG1vZHVsZXMgaW4gb3VyIHN5c3RlbS4gKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgYmNtb3NfdGFzayB0YXNrOworICAgIGJjbW9zX2Jvb2wgaXNfZW5hYmxlZDsKKyAgICBjaGFyIHRhc2tfbmFtZVtNQVhfVEFTS19OQU1FX1NJWkVdOworICAgIGRldl9sb2dfaWQgbG9nX2lkOworICAgIGJjbW9sdF9wb25fbmkgcG9uX2lkOworICAgIGNoYXIgbXNnX3F1ZXVlX25hbWVbTUFYX01TR19RVUVVRV9OQU1FX1NJWkVdOworICAgIGJjbW9zX21zZ19wb29sIG1zZ19wb29sOworICAgIGJjbW9zX21vZHVsZV9pZCBtb2R1bGVfaWQ7CisgICAgdm9pZCAqY29udGV4dDsKK30gYmNtb2x0X21vZHVsZV9nZW5fcGFyYW1zOworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3V0aWxzL2JjbW9sdF9zdHJpbmcuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci91dGlscy9iY21vbHRfc3RyaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEwZmEyMAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X2RyaXZlci91dGlscy9iY21vbHRfc3RyaW5nLmMKQEAgLTAsMCArMSwxMDIgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpbmNsdWRlICJiY21vbHRfc3RyaW5nLmgiCisjaW5jbHVkZSAiYmNtb2x0X21hdGguaCIKKworc3RydWN0IGJjbW9sdF9zdHJpbmcKK3sKKyAgICBjaGFyICpzdHI7CisgICAgdWludDMyX3QgbWF4X2xlbjsKKyAgICBjaGFyICpjdXJyOworICAgIGludDMyX3QgcmVtYWluaW5nOworfTsKKworaW50IGJjbW9sdF9zdHJpbmdfY29weShiY21vbHRfc3RyaW5nICpzdHIsIGNvbnN0IGNoYXIgKmJ1ZiwgdWludDMyX3Qgc2l6ZSkKK3sKKyAgICBpbnQgdG9fY29weSA9IE1JTihzaXplLCBzdHItPnJlbWFpbmluZyk7CisgICAgbWVtY3B5KHN0ci0+Y3VyciwgYnVmLCB0b19jb3B5KTsKKyAgICBzdHItPnJlbWFpbmluZyAtPSB0b19jb3B5OworICAgIHN0ci0+Y3VyciArPSB0b19jb3B5OworICAgIHN0ci0+Y3VyclswXSA9ICdcMCc7CisgICAgcmV0dXJuIHRvX2NvcHk7Cit9CisKK2ludCBiY21vbHRfc3RyaW5nX2FwcGVuZChiY21vbHRfc3RyaW5nICpzdHIsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICAgIGludCBuOworICAgIHZhX2xpc3QgYXJnczsKKworICAgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgICAgbiA9IHZzbnByaW50ZihzdHItPmN1cnIsIHN0ci0+cmVtYWluaW5nLCBmbXQsIGFyZ3MpOworICAgIHZhX2VuZChhcmdzKTsKKyAgICBpZiAobiA+IDApCisgICAgeworICAgICAgICBpZiAobiA+IHN0ci0+cmVtYWluaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBuID0gc3RyLT5yZW1haW5pbmc7CisgICAgICAgIH0KKyAgICAgICAgc3RyLT5yZW1haW5pbmcgLT0gbjsKKyAgICAgICAgc3RyLT5jdXJyICs9IG47CisgICAgfQorCisgICAgcmV0dXJuIG47Cit9CisKK2NvbnN0IGNoYXIgKmJjbW9sdF9zdHJpbmdfZ2V0KGJjbW9sdF9zdHJpbmcgKnN0cikKK3sKKyAgICByZXR1cm4gc3RyLT5zdHI7Cit9CisKK3ZvaWQgYmNtb2x0X3N0cmluZ19yZXNldChiY21vbHRfc3RyaW5nICpzdHIpCit7CisgICAgc3RyLT5zdHJbMF0gPSAnXDAnOworICAgIHN0ci0+Y3VyciA9IHN0ci0+c3RyOworICAgIHN0ci0+cmVtYWluaW5nID0gc3RyLT5tYXhfbGVuOworfQorCitiY21vc19lcnJubyBiY21vbHRfc3RyaW5nX2NyZWF0ZShiY21vbHRfc3RyaW5nICoqc3RyLCB1aW50MzJfdCBtYXhfbGVuKQoreworICAgICpzdHIgPSBiY21vc19jYWxsb2Moc2l6ZW9mKGJjbW9sdF9zdHJpbmcpICsgbWF4X2xlbiArIDEpOworICAgIGlmICgqc3RyICE9IE5VTEwpCisgICAgeworICAgICAgICAoKnN0ciktPnN0ciA9IChjaGFyKikoKCpzdHIpICsgMSk7CisgICAgICAgICgqc3RyKS0+bWF4X2xlbiA9IG1heF9sZW47CisgICAgICAgIGJjbW9sdF9zdHJpbmdfcmVzZXQoKnN0cik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworfQorCit2b2lkIGJjbW9sdF9zdHJpbmdfZGVzdHJveShiY21vbHRfc3RyaW5nICpzdHIpCit7CisgICAgYmNtb3NfZnJlZShzdHIpOworfQorCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdXRpbHMvYmNtb2x0X3N0cmluZy5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3V0aWxzL2JjbW9sdF9zdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWZjYWEyCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3V0aWxzL2JjbW9sdF9zdHJpbmcuaApAQCAtMCwwICsxLDQ5IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaWZuZGVmIF9CQ01PTFRfU1RSSU5HX0hfCisjZGVmaW5lIF9CQ01PTFRfU1RSSU5HX0hfCisKKyNpbmNsdWRlICJiY21vc19zeXN0ZW0uaCIKKwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X3N0cmluZyBiY21vbHRfc3RyaW5nOworCitpbnQgYmNtb2x0X3N0cmluZ19jb3B5KGJjbW9sdF9zdHJpbmcgKnN0ciwgY29uc3QgY2hhciAqYnVmLCB1aW50MzJfdCBzaXplKTsKKworaW50IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGJjbW9sdF9zdHJpbmcgKnN0ciwgY29uc3QgY2hhciAqZm10LCAuLi4pOworCitjb25zdCBjaGFyICpiY21vbHRfc3RyaW5nX2dldChiY21vbHRfc3RyaW5nICpzdHIpOworCit2b2lkIGJjbW9sdF9zdHJpbmdfcmVzZXQoYmNtb2x0X3N0cmluZyAqc3RyKTsKKworYmNtb3NfZXJybm8gYmNtb2x0X3N0cmluZ19jcmVhdGUoYmNtb2x0X3N0cmluZyAqKnN0ciwgdWludDMyX3QgbWF4X2xlbik7CisKK3ZvaWQgYmNtb2x0X3N0cmluZ19kZXN0cm95KGJjbW9sdF9zdHJpbmcgKnN0cik7CisKKyNlbmRpZiAvKiBfQkNNT0xUX1NUUklOR19IXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3V0aWxzL2JjbW9sdF91dGlscy5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3V0aWxzL2JjbW9sdF91dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YTg5OTQKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdXRpbHMvYmNtb2x0X3V0aWxzLmMKQEAgLTAsMCArMSwyMDQgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpbmNsdWRlICJiY21vbHRfdXRpbHMuaCIKKworLyogSGV4UHJpbnQgYSBzaW5nbGUgbGluZSAqLworI2RlZmluZSBCWVRFU19JTl9MSU5FIDE2CisKKyNkZWZpbmUgYjJhKGMpICAoaXNwcmludChjKT9jOicuJykKKworc3RhdGljIHZvaWQgX2hleHByaW50MShiY21vc19tc2dfcHJpbnRfY2IgcHJpbnRfY2IsIHZvaWQgKmNvbnRleHQsIHVpbnQxNl90IG8sIGNvbnN0IHVpbnQ4X3QgKnBfZGF0YSwgdWludDE2X3QgY291bnQsIGNvbnN0IGNoYXIgKmluZGVudCkKK3sKKyAgICBpbnQgaTsKKworICAgIGlmIChpbmRlbnQpCisgICAgICAgIHByaW50X2NiKGNvbnRleHQsICIlcyIsIGluZGVudCk7CisKKyAgICBwcmludF9jYihjb250ZXh0LCAiJTA0eDogIiwgbyk7CisgICAgZm9yIChpPTA7IGk8Y291bnQ7IGkrKykKKyAgICB7CisgICAgICAgIHByaW50X2NiKGNvbnRleHQsICIlMDJ4IiwgcF9kYXRhW2ldKTsKKyAgICAgICAgaWYgKCEoKGkrMSklNCkpCisgICAgICAgICAgICBwcmludF9jYihjb250ZXh0LCAiICIpOworICAgIH0KKyAgICBmb3IgKDsgaTxCWVRFU19JTl9MSU5FOyBpKyspCisgICAgeworICAgICAgICBpZiAoISgoaSsxKSU0KSkKKyAgICAgICAgICAgIHByaW50X2NiKGNvbnRleHQsICIgICAiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHJpbnRfY2IoY29udGV4dCwgIiAgIik7CisgICAgfQorICAgIGZvciAoaT0wOyBpPGNvdW50OyBpKyspCisgICAgICAgIHByaW50X2NiKGNvbnRleHQsICIlYyIsIGIyYShwX2RhdGFbaV0pKTsKKyAgICBwcmludF9jYihjb250ZXh0LCAiXG4iKTsKK30KKwordm9pZCBiY21vc19oZXhkdW1wKGJjbW9zX21zZ19wcmludF9jYiBwcmludF9jYiwgdm9pZCAqY29udGV4dCwgY29uc3Qgdm9pZCAqYnVmZmVyLCB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IGNvdW50LCBjb25zdCBjaGFyICppbmRlbnQpCit7CisgICAgY29uc3QgdWludDhfdCAqcF9kYXRhID0gYnVmZmVyOworICAgIHVpbnQxNl90IG47CisKKyAgICB3aGlsZSAoY291bnQpCisgICAgeworICAgICAgICBuID0gKGNvdW50ID4gQllURVNfSU5fTElORSkgPyBCWVRFU19JTl9MSU5FIDogY291bnQ7CisgICAgICAgIF9oZXhwcmludDEocHJpbnRfY2IsIGNvbnRleHQsIG9mZnNldCwgcF9kYXRhLCBuLCBpbmRlbnQpOworICAgICAgICBjb3VudCAtPSBuOworICAgICAgICBwX2RhdGEgKz0gbjsKKyAgICAgICAgb2Zmc2V0ICs9IG47CisgICAgfQorfQorCit2b2lkIGJjbW9zX2hleGR1bXBfb25lX2xpbmUoY29uc3QgY2hhciAqZnVuY25hbWUsICAgICAvKiBfX0ZVTkNUSU9OX18gKi8KKyAgICB1aW50MzJfdCBsaW5lbm8sICAgICAgIC8qIF9fTElORV9fICovCisgICAgYmNtb3NfbXNnX3ByaW50X2NiIHByaW50X2NiLAorICAgIHZvaWQgKmNvbnRleHQsCisgICAgY29uc3Qgdm9pZCAqYnVmZmVyLCAvKiBzdGFydCBvZiBtZW1vcnkgcmVnaW9uIHRvIGR1bXAgKi8KKyAgICB1aW50MzJfdCBzdGFydF9vZmZzZXQsIC8qIHN0YXJ0IG9mZnNldCBpbnRvIHRoZSByZWdpb24gKi8KKyAgICB1aW50MzJfdCBieXRlX2NvdW50LCAvKiBudW1iZXIgb2YgYnl0ZXMgaW4gcmVnaW9uIHRvIGR1bXAgKi8KKyAgICBjb25zdCBjaGFyICpwcmVmaXgsIC8qIG9wdGlvbmFsIHByZWZpeCBzdHJpbmcgKi8KKyAgICBjb25zdCBjaGFyICpzdWZmaXgpIC8qIG9wdGlvbmFsIHN1ZmZpeCBzdHJpbmcgKi8KK3sKKyAgICBjb25zdCB1aW50OF90ICpwX2RhdGEgPSBidWZmZXI7CisgICAgdWludDMyX3QgZGF0YV9vZmZzZXQgPSBzdGFydF9vZmZzZXQ7CisgICAgc2l6ZV90IG1heF9idWZfc2l6ZSA9IDgwMDA7IC8qIHJvb20gZW5vdWdoIHRvIGR1bXAgfjI2MDAgYnl0ZXMgd2l0aCBzaG9ydGlzaCBwcmVmaXhlcy9zdWZmaXhlcyAqLworICAgIGNoYXIgKm91dF9idWYgPSBiY21vc19jYWxsb2MobWF4X2J1Zl9zaXplKTsKKyAgICBzaXplX3Qgb3V0X2J1Zl9vZmZzZXQgPSAwOworICAgIHVpbnQzMl90IHRtcF9udW1fY2hhcnMgPSAwOworCisgICAgQlVHX1VOTEVTUyhvdXRfYnVmKTsKKworICAgIG1lbXNldChvdXRfYnVmLCAwLCBtYXhfYnVmX3NpemUpOworCisgICAgaWYgKHByZWZpeCkKKyAgICB7CisgICAgICAgIHRtcF9udW1fY2hhcnMgPSBzbnByaW50ZihvdXRfYnVmICsgb3V0X2J1Zl9vZmZzZXQsIC8qIG91dF9idWYgc3RhcnQgb2Zmc2V0ICovCisgICAgICAgICAgICBtYXhfYnVmX3NpemUgLSBvdXRfYnVmX29mZnNldCwgLyogcmVtYWluaW5nIHNwYWNlIGluIG91dF9idWYgKi8KKyAgICAgICAgICAgICJcbiU0MHM6JS01dSAgJXMiLCBmdW5jbmFtZSwgbGluZW5vLCBwcmVmaXgpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB0bXBfbnVtX2NoYXJzID0gc25wcmludGYob3V0X2J1ZiArIG91dF9idWZfb2Zmc2V0LCAvKiBvdXRfYnVmIHN0YXJ0IG9mZnNldCAqLworICAgICAgICAgICAgbWF4X2J1Zl9zaXplIC0gb3V0X2J1Zl9vZmZzZXQsIC8qIHJlbWFpbmluZyBzcGFjZSBpbiBvdXRfYnVmICovCisgICAgICAgICAgICAiXG4iKTsKKyAgICB9CisgICAgb3V0X2J1Zl9vZmZzZXQgKz0gdG1wX251bV9jaGFyczsKKworICAgIHdoaWxlICgoZGF0YV9vZmZzZXQgPCAoc3RhcnRfb2Zmc2V0ICsgYnl0ZV9jb3VudCkpICYmIChvdXRfYnVmX29mZnNldCA8IG1heF9idWZfc2l6ZSkpCisgICAgeworICAgICAgICB0bXBfbnVtX2NoYXJzID0gc25wcmludGYob3V0X2J1ZiArIG91dF9idWZfb2Zmc2V0LCAvKiBvdXRfYnVmIHN0YXJ0IG9mZnNldCAqLworICAgICAgICAgICAgbWF4X2J1Zl9zaXplIC0gb3V0X2J1Zl9vZmZzZXQsIC8qIHJlbWFpbmluZyBzcGFjZSBpbiBvdXRfYnVmICovCisgICAgICAgICAgICAiJTAyeCAiLAorICAgICAgICAgICAgcF9kYXRhW2RhdGFfb2Zmc2V0KytdKTsgLyogYnl0ZSB0byBkdW1wICovCisgICAgICAgIEJVR19VTkxFU1MoMyA9PSB0bXBfbnVtX2NoYXJzKTsKKyAgICAgICAgb3V0X2J1Zl9vZmZzZXQgKz0gdG1wX251bV9jaGFyczsKKyAgICB9CisKKyAgICBpZiAodG1wX251bV9jaGFycyA8IG1heF9idWZfc2l6ZSkKKyAgICB7CisgICAgICAgIGlmIChzdWZmaXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcF9udW1fY2hhcnMgPSBzbnByaW50ZihvdXRfYnVmICsgb3V0X2J1Zl9vZmZzZXQsIC8qIG91dF9idWYgc3RhcnQgb2Zmc2V0ICovCisgICAgICAgICAgICAgICAgbWF4X2J1Zl9zaXplIC0gb3V0X2J1Zl9vZmZzZXQsIC8qIHJlbWFpbmluZyBzcGFjZSBpbiBvdXRfYnVmICovCisgICAgICAgICAgICAgICAgIiVzIiwgc3VmZml4KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcF9udW1fY2hhcnMgPSBzbnByaW50ZihvdXRfYnVmICsgb3V0X2J1Zl9vZmZzZXQsIC8qIG91dF9idWYgc3RhcnQgb2Zmc2V0ICovCisgICAgICAgICAgICAgICAgbWF4X2J1Zl9zaXplIC0gb3V0X2J1Zl9vZmZzZXQsIC8qIHJlbWFpbmluZyBzcGFjZSBpbiBvdXRfYnVmICovCisgICAgICAgICAgICAgICAgIlxuIik7CisgICAgICAgIH0KKyAgICAgICAgb3V0X2J1Zl9vZmZzZXQgKz0gdG1wX251bV9jaGFyczsKKyAgICAgICAgQlVHX1VOTEVTUyhvdXRfYnVmX29mZnNldCA8IG1heF9idWZfc2l6ZSk7CisgICAgfQorCisgICAgcHJpbnRfY2IoY29udGV4dCwgIiVzIiwgb3V0X2J1Zik7CisgICAgYmNtb3NfZnJlZShvdXRfYnVmKTsKK30KKworc3RhdGljIHVpbnQzMl90IGV0aF9jcmMzMl90YWJbXSA9Cit7CisgICAgMHgwMDAwMDAwMCwgMHg3NzA3MzA5NiwgMHhlZTBlNjEyYywgMHg5OTA5NTFiYSwgMHgwNzZkYzQxOSwgMHg3MDZhZjQ4ZiwKKyAgICAweGU5NjNhNTM1LCAweDllNjQ5NWEzLCAweDBlZGI4ODMyLCAweDc5ZGNiOGE0LCAweGUwZDVlOTFlLCAweDk3ZDJkOTg4LAorICAgIDB4MDliNjRjMmIsIDB4N2ViMTdjYmQsIDB4ZTdiODJkMDcsIDB4OTBiZjFkOTEsIDB4MWRiNzEwNjQsIDB4NmFiMDIwZjIsCisgICAgMHhmM2I5NzE0OCwgMHg4NGJlNDFkZSwgMHgxYWRhZDQ3ZCwgMHg2ZGRkZTRlYiwgMHhmNGQ0YjU1MSwgMHg4M2QzODVjNywKKyAgICAweDEzNmM5ODU2LCAweDY0NmJhOGMwLCAweGZkNjJmOTdhLCAweDhhNjVjOWVjLCAweDE0MDE1YzRmLCAweDYzMDY2Y2Q5LAorICAgIDB4ZmEwZjNkNjMsIDB4OGQwODBkZjUsIDB4M2I2ZTIwYzgsIDB4NGM2OTEwNWUsIDB4ZDU2MDQxZTQsIDB4YTI2NzcxNzIsCisgICAgMHgzYzAzZTRkMSwgMHg0YjA0ZDQ0NywgMHhkMjBkODVmZCwgMHhhNTBhYjU2YiwgMHgzNWI1YThmYSwgMHg0MmIyOTg2YywKKyAgICAweGRiYmJjOWQ2LCAweGFjYmNmOTQwLCAweDMyZDg2Y2UzLCAweDQ1ZGY1Yzc1LCAweGRjZDYwZGNmLCAweGFiZDEzZDU5LAorICAgIDB4MjZkOTMwYWMsIDB4NTFkZTAwM2EsIDB4YzhkNzUxODAsIDB4YmZkMDYxMTYsIDB4MjFiNGY0YjUsIDB4NTZiM2M0MjMsCisgICAgMHhjZmJhOTU5OSwgMHhiOGJkYTUwZiwgMHgyODAyYjg5ZSwgMHg1ZjA1ODgwOCwgMHhjNjBjZDliMiwgMHhiMTBiZTkyNCwKKyAgICAweDJmNmY3Yzg3LCAweDU4Njg0YzExLCAweGMxNjExZGFiLCAweGI2NjYyZDNkLCAweDc2ZGM0MTkwLCAweDAxZGI3MTA2LAorICAgIDB4OThkMjIwYmMsIDB4ZWZkNTEwMmEsIDB4NzFiMTg1ODksIDB4MDZiNmI1MWYsIDB4OWZiZmU0YTUsIDB4ZThiOGQ0MzMsCisgICAgMHg3ODA3YzlhMiwgMHgwZjAwZjkzNCwgMHg5NjA5YTg4ZSwgMHhlMTBlOTgxOCwgMHg3ZjZhMGRiYiwgMHgwODZkM2QyZCwKKyAgICAweDkxNjQ2Yzk3LCAweGU2NjM1YzAxLCAweDZiNmI1MWY0LCAweDFjNmM2MTYyLCAweDg1NjUzMGQ4LCAweGYyNjIwMDRlLAorICAgIDB4NmMwNjk1ZWQsIDB4MWIwMWE1N2IsIDB4ODIwOGY0YzEsIDB4ZjUwZmM0NTcsIDB4NjViMGQ5YzYsIDB4MTJiN2U5NTAsCisgICAgMHg4YmJlYjhlYSwgMHhmY2I5ODg3YywgMHg2MmRkMWRkZiwgMHgxNWRhMmQ0OSwgMHg4Y2QzN2NmMywgMHhmYmQ0NGM2NSwKKyAgICAweDRkYjI2MTU4LCAweDNhYjU1MWNlLCAweGEzYmMwMDc0LCAweGQ0YmIzMGUyLCAweDRhZGZhNTQxLCAweDNkZDg5NWQ3LAorICAgIDB4YTRkMWM0NmQsIDB4ZDNkNmY0ZmIsIDB4NDM2OWU5NmEsIDB4MzQ2ZWQ5ZmMsIDB4YWQ2Nzg4NDYsIDB4ZGE2MGI4ZDAsCisgICAgMHg0NDA0MmQ3MywgMHgzMzAzMWRlNSwgMHhhYTBhNGM1ZiwgMHhkZDBkN2NjOSwgMHg1MDA1NzEzYywgMHgyNzAyNDFhYSwKKyAgICAweGJlMGIxMDEwLCAweGM5MGMyMDg2LCAweDU3NjhiNTI1LCAweDIwNmY4NWIzLCAweGI5NjZkNDA5LCAweGNlNjFlNDlmLAorICAgIDB4NWVkZWY5MGUsIDB4MjlkOWM5OTgsIDB4YjBkMDk4MjIsIDB4YzdkN2E4YjQsIDB4NTliMzNkMTcsIDB4MmViNDBkODEsCisgICAgMHhiN2JkNWMzYiwgMHhjMGJhNmNhZCwgMHhlZGI4ODMyMCwgMHg5YWJmYjNiNiwgMHgwM2I2ZTIwYywgMHg3NGIxZDI5YSwKKyAgICAweGVhZDU0NzM5LCAweDlkZDI3N2FmLCAweDA0ZGIyNjE1LCAweDczZGMxNjgzLCAweGUzNjMwYjEyLCAweDk0NjQzYjg0LAorICAgIDB4MGQ2ZDZhM2UsIDB4N2E2YTVhYTgsIDB4ZTQwZWNmMGIsIDB4OTMwOWZmOWQsIDB4MGEwMGFlMjcsIDB4N2QwNzllYjEsCisgICAgMHhmMDBmOTM0NCwgMHg4NzA4YTNkMiwgMHgxZTAxZjI2OCwgMHg2OTA2YzJmZSwgMHhmNzYyNTc1ZCwgMHg4MDY1NjdjYiwKKyAgICAweDE5NmMzNjcxLCAweDZlNmIwNmU3LCAweGZlZDQxYjc2LCAweDg5ZDMyYmUwLCAweDEwZGE3YTVhLCAweDY3ZGQ0YWNjLAorICAgIDB4ZjliOWRmNmYsIDB4OGViZWVmZjksIDB4MTdiN2JlNDMsIDB4NjBiMDhlZDUsIDB4ZDZkNmEzZTgsIDB4YTFkMTkzN2UsCisgICAgMHgzOGQ4YzJjNCwgMHg0ZmRmZjI1MiwgMHhkMWJiNjdmMSwgMHhhNmJjNTc2NywgMHgzZmI1MDZkZCwgMHg0OGIyMzY0YiwKKyAgICAweGQ4MGQyYmRhLCAweGFmMGExYjRjLCAweDM2MDM0YWY2LCAweDQxMDQ3YTYwLCAweGRmNjBlZmMzLCAweGE4NjdkZjU1LAorICAgIDB4MzE2ZThlZWYsIDB4NDY2OWJlNzksIDB4Y2I2MWIzOGMsIDB4YmM2NjgzMWEsIDB4MjU2ZmQyYTAsIDB4NTI2OGUyMzYsCisgICAgMHhjYzBjNzc5NSwgMHhiYjBiNDcwMywgMHgyMjAyMTZiOSwgMHg1NTA1MjYyZiwgMHhjNWJhM2JiZSwgMHhiMmJkMGIyOCwKKyAgICAweDJiYjQ1YTkyLCAweDVjYjM2YTA0LCAweGMyZDdmZmE3LCAweGI1ZDBjZjMxLCAweDJjZDk5ZThiLCAweDViZGVhZTFkLAorICAgIDB4OWI2NGMyYjAsIDB4ZWM2M2YyMjYsIDB4NzU2YWEzOWMsIDB4MDI2ZDkzMGEsIDB4OWMwOTA2YTksIDB4ZWIwZTM2M2YsCisgICAgMHg3MjA3Njc4NSwgMHgwNTAwNTcxMywgMHg5NWJmNGE4MiwgMHhlMmI4N2ExNCwgMHg3YmIxMmJhZSwgMHgwY2I2MWIzOCwKKyAgICAweDkyZDI4ZTliLCAweGU1ZDViZTBkLCAweDdjZGNlZmI3LCAweDBiZGJkZjIxLCAweDg2ZDNkMmQ0LCAweGYxZDRlMjQyLAorICAgIDB4NjhkZGIzZjgsIDB4MWZkYTgzNmUsIDB4ODFiZTE2Y2QsIDB4ZjZiOTI2NWIsIDB4NmZiMDc3ZTEsIDB4MThiNzQ3NzcsCisgICAgMHg4ODA4NWFlNiwgMHhmZjBmNmE3MCwgMHg2NjA2M2JjYSwgMHgxMTAxMGI1YywgMHg4ZjY1OWVmZiwgMHhmODYyYWU2OSwKKyAgICAweDYxNmJmZmQzLCAweDE2NmNjZjQ1LCAweGEwMGFlMjc4LCAweGQ3MGRkMmVlLCAweDRlMDQ4MzU0LCAweDM5MDNiM2MyLAorICAgIDB4YTc2NzI2NjEsIDB4ZDA2MDE2ZjcsIDB4NDk2OTQ3NGQsIDB4M2U2ZTc3ZGIsIDB4YWVkMTZhNGEsIDB4ZDlkNjVhZGMsCisgICAgMHg0MGRmMGI2NiwgMHgzN2Q4M2JmMCwgMHhhOWJjYWU1MywgMHhkZWJiOWVjNSwgMHg0N2IyY2Y3ZiwgMHgzMGI1ZmZlOSwKKyAgICAweGJkYmRmMjFjLCAweGNhYmFjMjhhLCAweDUzYjM5MzMwLCAweDI0YjRhM2E2LCAweGJhZDAzNjA1LCAweGNkZDcwNjkzLAorICAgIDB4NTRkZTU3MjksIDB4MjNkOTY3YmYsIDB4YjM2NjdhMmUsIDB4YzQ2MTRhYjgsIDB4NWQ2ODFiMDIsIDB4MmE2ZjJiOTQsCisgICAgMHhiNDBiYmUzNywgMHhjMzBjOGVhMSwgMHg1YTA1ZGYxYiwgMHgyZDAyZWY4ZAorfTsKKwordWludDMyX3QgZXRoX2NhbGNfY3JjMzIodWludDMyX3QgY3JjLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBzaXplKQoreworICAgIGNvbnN0IHVpbnQ4X3QgKnA7CisKKyAgICBwID0gYnVmOworICAgIGNyYyA9IGNyYyBeIH4wVTsKKworICAgIHdoaWxlIChzaXplLS0pCisgICAgICAgIGNyYyA9IGV0aF9jcmMzMl90YWJbKGNyYyBeICpwKyspICYgMHhGRl0gXiAoY3JjID4+IDgpOworCisgICAgcmV0dXJuIGNyYyBeIH4wVTsKK30KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3V0aWxzL2JjbW9sdF91dGlscy5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfZHJpdmVyL3V0aWxzL2JjbW9sdF91dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YTVhMmQKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9kcml2ZXIvdXRpbHMvYmNtb2x0X3V0aWxzLmgKQEAgLTAsMCArMSwxMzQgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgX0JDTU9MVF9VVElMU19IXworI2RlZmluZSBfQkNNT0xUX1VUSUxTX0hfCisKKyNpbmNsdWRlICJiY21vc19zeXN0ZW0uaCIKKworI2RlZmluZSBCQ01PU19NQUNBRERSX0ZNVF9TVFIgIiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYIgorI2RlZmluZSBCQ01PU19NQUNBRERSX1BBUkFNUyhtYWMpIChtYWMpLT51OFswXSwobWFjKS0+dThbMV0sKG1hYyktPnU4WzJdLChtYWMpLT51OFszXSwobWFjKS0+dThbNF0sKG1hYyktPnU4WzVdCisKKyNkZWZpbmUgTUFDX1NUUl9MRU4gMTgKKworI2RlZmluZSBCWVRFU19JTl9NRUdBQllURShieXRlcykgKChieXRlcykgLyAoMTAyNCAqIDEwMjQpKQorCitzdGF0aWMgaW5saW5lIGNoYXIgKmJjbW9zX21hY18yX3N0cihjb25zdCBiY21vc19tYWNfYWRkcmVzcyAqbWFjLCBjaGFyICpidWYpCit7CisgICAgc25wcmludGYoYnVmLCBNQUNfU1RSX0xFTiwgQkNNT1NfTUFDQUREUl9GTVRfU1RSLCBCQ01PU19NQUNBRERSX1BBUkFNUyhtYWMpKTsKKyAgICByZXR1cm4gYnVmOworfQorCisvKiogU3dhcCBhIGJ5dGUgc3RyaW5nIG9mIGFueSBsZW5ndGguCisgKgorICogXHBhcmFtW2luXSAgIHB0ciAgICAgcG9pbnRlciB0byBhIG1lbW9yeSBzcGFjZS4KKyAqIFxwYXJhbVtpbl0gICBsZW4gICAgIGxlbmd0aAorICogXG5vdGUKKyAqICAgICAgezAsIDEsIDIsIDN9IGJlY29tZXMgezMsIDIsIDEsIDB9CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBiY21vc19zd2FwX2J5dGVzX2luX3BsYWNlKHVpbnQ4X3QgKnB0ciwgdWludDMyX3QgbGVuKQoreworICAgIGludCAgaWk7CisgICAgY2hhciB0bXA7CisKKyAgICBmb3IgKGlpID0gMDsgaWkgPCAobGVuIC8gMik7IGlpKyspCisgICAgeworICAgICAgICB0bXAgPSBwdHJbbGVuIC0gaWkgLSAxXTsKKyAgICAgICAgcHRyW2xlbiAtIGlpIC0gMV0gPSBwdHJbaWldOworICAgICAgICBwdHJbaWldID0gdG1wOworICAgIH0KK30KKworLyoqIFN3YXAgYSBieXRlIHN0cmluZyBvZiBhbnkgbGVuZ3RoLgorICoKKyAqIFxwYXJhbVtvdXRdICAgICAgZHN0ICAgICBwb2ludGVyIHRvIGEgbWVtb3J5IHNwYWNlIGZvciB0aGUgc3dhcHBlZCBieXRlcy4KKyAqIFxwYXJhbVtpbl0gICAgICAgc3JjICAgICBwb2ludGVyIHRvIGEgbWVtb3J5IHNwYWNlIGZvciBieXRlcyB0byBiZSBzd2FwcGVkLgorICogXHBhcmFtW2luXSAgICAgICBsZW4gICAgIGxlbmd0aCBpbiBieXRlcworICogXG5vdGUKKyAqICAgICAgezAsIDEsIDIsIDN9IGJlY29tZXMgezMsIDIsIDEsIDB9CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBiY21vc19zd2FwX2J5dGVzKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBjb25zdCB1aW50MzJfdCBsZW4pCit7CisgICAgaW50ICBpaTsKKworICAgIGZvciAoaWkgPSAwOyBpaSA8IGxlbjsgaWkrKykKKyAgICB7CisgICAgICAgIGRzdFtpaV0gPSBzcmNbbGVuIC0gaWkgLSAxXTsKKyAgICB9Cit9CisKKy8qKiBDb3B5IGJpdHMgZnJvbSBhIGdpdmVuIHJhbmdlIG9mIHRoZSBzb3VyY2UgdG8gYSBkaWZmZXJlbnQgcmFuZ2Ugb2YgdGhlCisgKiAgZGVzdGluYXRpb24KKyAqCisgKiBccGFyYW1baW5dICAgZHN0ICAgICAgICAgZGVzdGluYXRpb24gdmFsdWUgdG8gYmUgbWVyZ2VkIHRvCisgKiBccGFyYW1baW5dICAgZHN0X2hpICAgICAgaGlnaCBiaXQgcG9zaXRpb24KKyAqIFxwYXJhbVtpbl0gICBkc3RfbG8gICAgICBsb3cgYml0IHBvc2l0aW9uCisgKiBccGFyYW1baW5dICAgc3JjICAgICAgICAgc291cmNlIHZhbHVlIHRvIGNvcHkgdGhlIGJpdHMgZnJvbQorICogXHBhcmFtW2luXSAgIHNyY19oaSAgICAgIGhpZ2ggYml0IHBvc2l0aW9uCisgKiBccGFyYW1baW5dICAgc3JjX2xvICAgICAgbG93IGJpdCBwb3NpdGlvbgorICoKKyAqIFxyZXR1cm4gICAgICBkZXN0aW5hdGlvbiB2YWx1ZQorICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGJjbW9zX2JpdHNfY29weV91MzIodWludDMyX3QgZHN0LCB1aW50OF90IGRzdF9oaSwgdWludDhfdCBkc3RfbG8sCisgICAgdWludDMyX3Qgc3JjLCB1aW50OF90IHNyY19oaSwgdWludDhfdCBzcmNfbG8pCit7CisgICAgZHN0ICY9ICh+KCgoMSA8PCAoKGRzdF9oaSAtIGRzdF9sbykgKyAxKSkgLSAxKSA8PCBkc3RfbG8pKTsKKyAgICBzcmMgJj0gKCgoMSA8PCAoKHNyY19oaSAtIHNyY19sbykgKyAxKSkgLSAxKSA8PCBzcmNfbG8pOworICAgIGRzdCB8PSAoKGRzdF9sbyA+PSBzcmNfbG8pPyAoc3JjIDw8IChkc3RfbG8gLSBzcmNfbG8pKTogKHNyYyA+PiAoc3JjX2xvIC0gZHN0X2xvKSkpOworICAgIHJldHVybiBkc3Q7Cit9CisKKy8qIG5ldHdvcmsgdG8gaG9zdCBvbiB1bmFsaWduZWQgYXJyYXkgb2YgdWludDMyX3QgZWxlbWVudHMuIFRyZWF0IHBvaW50ZXIgcCBhcyBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgdWludDMyX3QgZWxlbWVudHMuIEdldCBlbGVtZW50IGkuICAqLworI2RlZmluZSBOMkgzMihwLCBpKSAoKCgoY29uc3QgdWludDhfdCAqKShwKSlbKGkpICogNF08PDI0KSB8ICgoKGNvbnN0IHVpbnQ4X3QgKikocCkpWyhpKSAqIDQrMV08PDE2KSB8ICgoKGNvbnN0IHVpbnQ4X3QgKikocCkpWyhpKSAqIDQrMl08PDgpIHwgKCgoY29uc3QgdWludDhfdCAqKShwKSlbKGkpICogNCszXSkpCisvKiBuZXR3b3JrIHRvIGhvc3Qgb24gdW5hbGlnbmVkIGFycmF5IG9mIHVpbnQxNl90IGVsZW1lbnRzLiBUcmVhdCBwb2ludGVyIHAgYXMgYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHVpbnQxNl90IGVsZW1lbnRzLiBHZXQgZWxlbWVudCBpLiAqLworI2RlZmluZSBOMkgxNihwLCBpKSAoKCgoY29uc3QgdWludDhfdCAqKShwKSlbKGkpICogMl08PDgpIHwgKCgoY29uc3QgdWludDhfdCAqKShwKSlbKGkpICogMisxXSkpCisvKiBuZXR3b3JrIHRvIGhvc3Qgb24gdW5hbGlnbmVkIGFycmF5IG9mIHVpbnQ4X3QgZWxlbWVudHMuIFRyZWF0IHBvaW50ZXIgcCBhcyBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgdWludDhfdCBlbGVtZW50cy4gR2V0IGVsZW1lbnQgaS4gKi8KKyNkZWZpbmUgTjJIOChwLCBpKSAoKChjb25zdCB1aW50OF90ICopKHApKVsoaSldKQorCisvKiBGb3IgaW50ZXJuYWwgdXNlIGJ5IHRoZSBmb2xsb3dpbmcgSDJOKiBtYWNyb3MgKi8KKyNkZWZpbmUgSDJOOChwLCB2KSAgICooKHVpbnQ4X3QgKilwKSA9ICh1aW50OF90KSh2KQorLyogaG9zdCB0byBuZXR3b3JrIGNvbnZlcnNpb24gb2YgYSB1aW50MTZfdCB3aXRoIHN1cHBvcnQgZm9yIG5vbiAxNiBiaXQgYWxpZ25lZCBkZXN0aW5hdGlvbiBhZGRyZXNzLiBwIGlzIGEgKHVpbnQ4X3QgKikgZGVzdGluYXRpb24gcG9pbnRlci4gdiBpcyBhIHVpbnQxNl90IHZhbHVlLiB2IGNhbiBiZSB3cml0dGVuIHRvIHAgZXZlbiBpZiBwIGlzIHVuYWxpZ25lZCB0byAxNiBiaXRzLiAqLworI2RlZmluZSBIMk4xNihwLCB2KSAgKEgyTjgoKHApLCAodikgPj4gOCksIEgyTjgoKCh1aW50OF90ICopKHApICsgMSksICh2KSkpCisvKiBob3N0IHRvIG5ldHdvcmsgY29udmVyc2lvbiBvZiBhIHVpbnQzMl90IHdpdGggc3VwcG9ydCBmb3Igbm9uIDMyIGJpdCBhbGlnbmVkIGRlc3RpbmF0aW9uIGFkZHJlc3MuIHAgaXMgYSAodWludDhfdCAqKSBkZXN0aW5hdGlvbiBwb2ludGVyLiB2IGlzIGEgdWludDMyX3QgdmFsdWUuIHYgY2FuIGJlIHdyaXR0ZW4gdG8gcCBldmVuIGlmIHAgaXMgdW5hbGlnbmVkIHRvIDMyIGJpdHMuICovCisjZGVmaW5lIEgyTjMyKHAsIHYpICAoSDJOMTYoKHApLCAodikgPj4gMTYpLCBIMk4xNigoKHVpbnQ4X3QgKikocCkgKyAyKSwgKHYpKSkKKworI2RlZmluZSBOVU1fRUxFTShhcnJheSkgICAgIChzaXplb2YoYXJyYXkpIC8gc2l6ZW9mKChhcnJheSlbMF0pKQorCit0eXBlZGVmIHZvaWQgKCpiY21vc19tc2dfcHJpbnRfY2IpKHZvaWQgKmNvbnRleHQsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKKwordm9pZCBiY21vc19oZXhkdW1wKGJjbW9zX21zZ19wcmludF9jYiBwcmludF9jYiwgdm9pZCAqY29udGV4dCwgY29uc3Qgdm9pZCAqYnVmZmVyLCB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IGNvdW50LCBjb25zdCBjaGFyICppbmRlbnQpOwordm9pZCBiY21vc19oZXhkdW1wX29uZV9saW5lKGNvbnN0IGNoYXIgKmZ1bmNuYW1lLCB1aW50MzJfdCBsaW5lbm8sIGJjbW9zX21zZ19wcmludF9jYiBwcmludF9jYiwgdm9pZCAqY29udGV4dCwgY29uc3Qgdm9pZCAqYnVmZmVyLCB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IGNvdW50LCBjb25zdCBjaGFyICpwcmVmaXgsCisgICAgY29uc3QgY2hhciAqc3VmZml4KTsKKwordWludDMyX3QgZXRoX2NhbGNfY3JjMzIodWludDMyX3QgY3JjLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBzaXplKTsKKworI2RlZmluZSBCQ01PTFRfVElNRV9TVFJfTUFYX0xFTiA4MAorCisjZW5kaWYgLyogQkNNT0xUX1VUSUxTX0ggKi8KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2FwaV9jbGkvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvYXBpX2NsaS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTA4NjI4Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2FwaV9jbGkvTWFrZWZpbGUKQEAgLTAsMCArMSw5IEBACisjIE1hcGxlIEFQSSBDTEkKKyMKK2lmZXEgKCQoRU5BQkxFX0NMSSksIHkpCisgICAgTU9EX05BTUUgPSBhcGlfY2xpCisgICAgTU9EX1RZUEUgPSBsaWIKKyAgICBNT0RfREVQUyA9IGNvbW1vbl9hcGkgbW9kZWwgZGV2aWNlX3NlbGVjdG9yCisgICAgCisgICAgc3JjcyA9IGJjbV9hcGlfY2xpLmMgYmNtX2FwaV9jbGlfZHVtcC5jIGJjbV9hcGlfY2xpX2hhbmRsZXJzLmMgYmNtX2FwaV9jbGlfaGVscGVycy5jIAorZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfY2xpL2JjbV9hcGlfY2xpLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvYXBpX2NsaS9iY21fYXBpX2NsaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMjY2NmYKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvYXBpX2NsaS9iY21fYXBpX2NsaS5jCkBAIC0wLDAgKzEsMTIxMSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbWNsaS5oPgorI2luY2x1ZGUgPGJjbW9sdF9hcGkuaD4KKyNpbmNsdWRlIDxiY21vbHRfbW9kZWxfdHlwZXMuaD4KKyNpbmNsdWRlIDxiY21vc190eXBlcy5oPgorCisjaW5jbHVkZSAiYmNtX2FwaV9jbGkuaCIKKyNpbmNsdWRlICJiY21fYXBpX2NsaV9oZWxwZXJzLmgiCisjaW5jbHVkZSAiYmNtX2FwaV9jbGlfaGFuZGxlcnMuaCIKKyNpZmRlZiBCQ01fU1VCU1lTVEVNX0hPU1QKKyNpbmNsdWRlIDxiY21vbHRfZGV2X3NlbGVjdG9yLmg+CisjZW5kaWYKKworI2RlZmluZSBBUElDTElfQ0FTVF9ESVNDQVJEX0NPTlNUKHAsIHR5cGUpICAgICAgICh0eXBlKSgobG9uZykocCkpCisKKy8qIGJvb2wgZW51bSB0YWJsZSAqLworc3RhdGljIGJjbWNsaV9lbnVtX3ZhbCBib29sX2VudW1bXSA9Cit7CisgICAgeyAubmFtZSA9ICJ5ZXMiLCAudmFsID0gMSB9LAorICAgIHsgLm5hbWUgPSAibm8iLCAudmFsID0gMCB9LAorICAgIEJDTUNMSV9FTlVNX0xBU1QKK307CisKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBib29sX3R5cGVfZGVzY3IgPSB7CisgICAgLm5hbWUgPSAiYm9vbCIsCisgICAgLmRlc2NyID0gIkJvb2xlYW4iLAorICAgIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sCisgICAgLnNpemUgPSBzaXplb2YoYmNtb3NfYm9vbCksCisgICAgLnggPSB7LmUgPSBib29sX2VudW19Cit9OworCisvKiBwYXJhbWV0ZXIgZGF0YSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBjb25zdCBiY21jbGlfcHJvcF9kZXNjciAqcHJvcDsgICAgICAvKiBwcm9wZXJ0eSAqLworICAgIGNvbnN0IGJjbWNsaV9maWVsZF9kZXNjciAqZmllbGQ7ICAgIC8qIGZpZWxkIG9yIE5VTEwgKi8KKyAgICBjb25zdCBiY21jbGlfZmllbGRfZGVzY3IgKmFycmF5X2ZkOyAvKiBhcnJheSBmaWVsZCBkZXNjcmlwdG9yIG9yIE5VTEwgKi8KKyAgICB1aW50MTZfdCBvZmZzZXQ7ICAgICAgICAgICAgICAgICAgICAvKiBvZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwcm9wZXJ0eSAqLworICAgIHVpbnQxNl90IGFycmF5X2ZkX29mZnNldDsgICAgICAgICAgIC8qIG9mZnNldCBvZiBhcnJheV9mZCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHByb3BlcnR5ICovCisgICAgYmNtb2x0X21ndF9ncm91cCBncm91cDsgICAgICAgICAgICAgLyogbWFuYWdlbWVudCBncm91cCAqLworfSBhcGljbGlfcGFybV9kYXRhOworCit0eXBlZGVmIGVudW0KK3sKKyAgICBBUElfQ0xJX0ZMQUdTX05PTkUgPSAwLAorICAgIEFQSV9DTElfRkxBR1NfSUdOT1JFX0ZJRUxEUyA9IDEgPDwgMCwKKyAgICBBUElfQ0xJX0ZMQUdTX01VTFRJID0gMSA8PCAxCit9IGFwaV9jbGlfZmxhZ3M7CisKKy8qIE9wZXJhdGlvbjogc2V0LCBnZXQsIG1vZGlmeSAqLwordHlwZWRlZiBlbnVtCit7CisgICAgQVBJX0NMSV9PUEVSX1NFVCwKKyAgICBBUElfQ0xJX09QRVJfR0VULAorICAgIEFQSV9DTElfT1BFUl9NT0RJRlksCit9IGFwaV9jbGlfb3BlcjsKKworLyogQ3VycmVudCBzZXNzaW9uICovCitzdGF0aWMgYmNtY2xpX3Nlc3Npb24gKmN1cnJlbnRfc2Vzc2lvbjsKKworLyogQ3VycmVudCBzeXN0ZW0gbW9kZSAqLworc3RhdGljIGJjbW9sdF9zeXN0ZW1fbW9kZSBjdXJyZW50X3N5c3RlbV9tb2RlOworCisvKiBQYXJlbnQgZGlyZWN0b3J5ICovCitzdGF0aWMgYmNtY2xpX2VudHJ5ICphcGlfcGFyZW50X2RpcjsKKworLyoKKyAqIGhlbHBlcnMKKyAqLworCisvKiBjYWxjdWxhdGUgbnVtYmVyIG9mIGZpZWxkcyBpbiB0eXBlICovCitzdGF0aWMgdWludDMyX3QgX2FwaV9jbGlfZ2V0X251bV9maWVsZHNfaW5fdHlwZShjb25zdCBiY21jbGlfdHlwZV9kZXNjciAqdGQpCit7CisgICAgdWludDE2X3QgZjsKKyAgICB1aW50MzJfdCBuZiA9IDA7CisKKworICAgIHN3aXRjaCAodGQtPmJhc2VfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1Q6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghdGQtPngucy5udW1fZmllbGRzKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgQlVHX09OKCF0ZC0+eC5zLmZpZWxkcyk7CisgICAgICAgICAgICBmb3IgKGYgPSAwOyBmIDwgdGQtPngucy5udW1fZmllbGRzOyBmKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmYgKz0gIF9hcGlfY2xpX2dldF9udW1fZmllbGRzX2luX3R5cGUodGQtPngucy5maWVsZHNbZl0udHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX0JBU0VfVFlQRV9JRF9VTklPTjoKKyAgICAgICAgeworICAgICAgICAgICAgLyogVW5pb24uIENvdW50IG9ubHkgY29tbW9uIGZpZWxkcyAqLworICAgICAgICAgICAgbmYgPSB0ZC0+eC51Lm51bV9jb21tb25fZmllbGRzOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0ZJWEVEOgorICAgICAgICB7CisgICAgICAgICAgICBuZiA9IF9hcGlfY2xpX2dldF9udW1fZmllbGRzX2luX3R5cGUodGQtPnguYXJyX2ZpeGVkLmVsZW1fdHlwZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRFlOOgorICAgICAgICB7CisgICAgICAgICAgICBuZiA9IF9hcGlfY2xpX2dldF9udW1fZmllbGRzX2luX3R5cGUodGQtPnguYXJyX2R5bi5lbGVtX3R5cGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICBuZiA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBuZjsKK30KKworLyogY2FsY3VsYXRlIG51bWJlciBvZiBwcm9wZXJ0eSBmaWVsZHMgZm9yIGdpdmVuIG9iamVjdCtncm91cCtzdWJncm91cCthY2Nlc3MuIHNpbXBsZSBwcm9wZXJ0eT1zaW5nbGUgZmllbGQgKi8KK3N0YXRpYyBiY21vc19lcnJubyBfYXBpX2NsaV9nZXRfbnVtX2ZpZWxkc19pbl9ncm91cChiY21vbHRfb2JqX2lkIG8sIGJjbW9sdF9tZ3RfZ3JvdXAgZ3JvdXAsIHVpbnQxNl90IHN1Ymdyb3VwLAorICAgIGJjbW9sdF9wcm9wX2FjY2Vzc19pZCBhY2Nlc3NfbGV2ZWwsIHVpbnQzMl90ICpuZmllbGRzKQoreworICAgIHVpbnQzMl90IG5mID0gMDsKKyAgICBpbnQgaTsKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisKKyAgICBmb3IgKGkgPSAwOyByYyAhPSBCQ01fRVJSX1JBTkdFOyBpKyspCisgICAgeworICAgICAgICBjb25zdCBiY21jbGlfcHJvcF9kZXNjciAqcGQ7CisgICAgICAgIHJjID0gYXBpX2NsaV9vYmplY3RfcHJvcGVydHkobywgZ3JvdXAsIHN1Ymdyb3VwLCBpLCAmcGQpOworICAgICAgICBpZiAocmMgPT0gQkNNX0VSUl9PSyAmJiAocGQtPmFjY2VzcyAmIGFjY2Vzc19sZXZlbCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENhbGN1bGF0ZSBudW1iZXIgb2YgZmllbGRzIGlmIHdyaXRlIGFjY2Vzcy4gQ291bnQgb25seSBwcm9wZXJ0aWVzIGZvciByZWFkIGFjY2VzcyAqLworICAgICAgICAgICAgaWYgKChhY2Nlc3NfbGV2ZWwgJiBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfVykgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCVUdfT04oIXBkLT50eXBlKTsKKyAgICAgICAgICAgICAgICBuZiArPSBfYXBpX2NsaV9nZXRfbnVtX2ZpZWxkc19pbl90eXBlKHBkLT50eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICArK25mOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgICpuZmllbGRzID0gbmY7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoKKyAqIENvbW1hbmQgaGFuZGxlcnMKKyAqLworCitzdGF0aWMgYmNtb3NfZXJybm8gX2FwaWNsaV9vYmplY3RzX2hhbmRsZXIoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICBpbnQgcmM7CisgICAgYmNtb2x0X29ial9pZCBvOworICAgIGNvbnN0IGNoYXIgKm5hbWUsICpkZXNjcjsKKworICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiU3lzdGVtIE9iamVjdCBUeXBlczpcbiIpOworICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIklkICAgTmFtZSAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblxuIik7CisgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworICAgIGZvciAobyA9IDA7IG8gPCBCQ01PTFRfT0JKX0lEX19OVU1fT0Y7IG8rKykKKyAgICB7CisKKyAgICAgICAgaWYgKGN1cnJlbnRfc3lzdGVtX21vZGUgPCBCQ01PTFRfU1lTVEVNX01PREVfX05VTV9PRiAmJiAhYmNtb2x0X29iamVjdF9pc19zdXBwb3J0ZWQoY3VycmVudF9zeXN0ZW1fbW9kZSwgbykpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICByYyA9IGFwaV9jbGlfb2JqZWN0X25hbWUobywgJm5hbWUsICZkZXNjcik7CisgICAgICAgIGlmICghcmMpCisgICAgICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiUuNGQgJS0yMnMgJXNcbiIsIG8sIG5hbWUsIGRlc2NyKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9hcGljbGlfc2V0X2hhbmRsZXIoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICByZXR1cm4gYmNtb2x0X2NsaV9hcGlfY2FsbChjdXJyZW50X2RldmljZSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIEJDTU9MVF9NU0dfVFlQRV9TRVQsIHNlc3Npb24pOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2FwaWNsaV9nZXRfaGFuZGxlcihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIHJldHVybiBiY21vbHRfY2xpX2FwaV9jYWxsKGN1cnJlbnRfZGV2aWNlLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgQkNNT0xUX01TR19UWVBFX0dFVCwgc2Vzc2lvbik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfYXBpY2xpX2NsZWFyX2hhbmRsZXIoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICByZXR1cm4gYmNtb2x0X2NsaV9hcGlfY2FsbChjdXJyZW50X2RldmljZSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIEJDTU9MVF9NU0dfVFlQRV9DTEVBUiwgc2Vzc2lvbik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfYXBpY2xpX3N0YXRfaGFuZGxlcihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIHJldHVybiBiY21vbHRfY2xpX2FwaV9jYWxsKGN1cnJlbnRfZGV2aWNlLCBCQ01PTFRfTUdUX0dST1VQX1NUQVQsIEJDTU9MVF9NU0dfVFlQRV9HRVQsIHNlc3Npb24pOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2FwaWNsaV9vcGVyX2hhbmRsZXIoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICByZXR1cm4gYmNtb2x0X2NsaV9hcGlfY2FsbChjdXJyZW50X2RldmljZSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfTVNHX1RZUEVfU0VULCBzZXNzaW9uKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9hcGljbGlfc2VuZF9oYW5kbGVyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgcmV0dXJuIGJjbW9sdF9jbGlfYXBpX2NhbGwoY3VycmVudF9kZXZpY2UsIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFksIEJDTU9MVF9NU0dfVFlQRV9TRVQsIHNlc3Npb24pOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2FwaWNsaV9zdGF0X2NmZ19zZXRfaGFuZGxlcihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIHJldHVybiBiY21vbHRfY2xpX2FwaV9jYWxsKGN1cnJlbnRfZGV2aWNlLCBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHLCBCQ01PTFRfTVNHX1RZUEVfU0VULCBzZXNzaW9uKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9hcGljbGlfc3RhdF9jZmdfZ2V0X2hhbmRsZXIoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICByZXR1cm4gYmNtb2x0X2NsaV9hcGlfY2FsbChjdXJyZW50X2RldmljZSwgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgQkNNT0xUX01TR19UWVBFX0dFVCwgc2Vzc2lvbik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfYXBpY2xpX2F1dG9fY2ZnX3NldF9oYW5kbGVyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgcmV0dXJuIGJjbW9sdF9jbGlfYXBpX2NhbGwoY3VycmVudF9kZXZpY2UsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIEJDTU9MVF9NU0dfVFlQRV9TRVQsIHNlc3Npb24pOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2FwaWNsaV9hdXRvX2NmZ19nZXRfaGFuZGxlcihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIHJldHVybiBiY21vbHRfY2xpX2FwaV9jYWxsKGN1cnJlbnRfZGV2aWNlLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCBCQ01PTFRfTVNHX1RZUEVfR0VULCBzZXNzaW9uKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9hcGljbGlfYXV0b19jZmdfZ2V0X211bHRpX2hhbmRsZXIoCisgICAgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sCisgICAgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwKKyAgICB1aW50MTZfdCBucGFybXMpCit7CisgICAgcmV0dXJuIGJjbW9sdF9jbGlfYXBpX2NhbGwoY3VycmVudF9kZXZpY2UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJLCBzZXNzaW9uKTsKK30KKworLyoKKyAqIEluaXQtdGltZSBoZWxwZXJzCisgKi8KKworLyogbWFwIHRvIENMSSB0eXBlICovCitzdGF0aWMgYmNtb3NfZXJybm8gX2FwaV9jbGlfbWFwX3R5cGUoY29uc3QgYmNtY2xpX3R5cGVfZGVzY3IgKnRkLCBjb25zdCBiY21jbGlfdHlwZV9kZXNjciAqYXJyYXlfdGQsIGJjbWNsaV9jbWRfcGFybSAqY21kX3Bhcm0pCit7CisgICAgYXBpY2xpX3Bhcm1fZGF0YSAqcGFybV9kYXRhID0gY21kX3Bhcm0tPnVzZXJfZGF0YTsKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisKKyAgICAvKiBNYXAgdHlwZSAqLworICAgIHN3aXRjaCh0ZC0+YmFzZV90eXBlKQorICAgIHsKKyAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfU05VTToKKyAgICAgICAgY21kX3Bhcm0tPnR5cGUgPSBCQ01DTElfUEFSTV9OVU1CRVI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkNNT0xUX0JBU0VfVFlQRV9JRF9VTlVNOgorICAgICAgICBjbWRfcGFybS0+dHlwZSA9IEJDTUNMSV9QQVJNX1VOVU1CRVI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkNNT0xUX0JBU0VfVFlQRV9JRF9VTlVNX0hFWDoKKyAgICAgICAgY21kX3Bhcm0tPnR5cGUgPSBCQ01DTElfUEFSTV9IRVg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkNNT0xUX0JBU0VfVFlQRV9JRF9CT09MOgorICAgICAgICBjbWRfcGFybS0+dHlwZSA9IEJDTUNMSV9QQVJNX0VOVU07CisgICAgICAgIGNtZF9wYXJtLT5lbnVtX3RhYmxlID0gYm9vbF9lbnVtOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfRkxPQVQ6CisgICAgICAgIGNtZF9wYXJtLT50eXBlID0gdGQtPnNpemUgPT0gc2l6ZW9mKGRvdWJsZSkgPyBCQ01DTElfUEFSTV9ET1VCTEUgOiBCQ01DTElfUEFSTV9GTE9BVDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUklORzoKKyAgICAgICAgY21kX3Bhcm0tPnR5cGUgPSBCQ01DTElfUEFSTV9TVFJJTkc7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkNNT0xUX0JBU0VfVFlQRV9JRF9JUFY0OgorICAgICAgICBjbWRfcGFybS0+dHlwZSA9IEJDTUNMSV9QQVJNX0lQOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfTUFDOgorICAgICAgICBjbWRfcGFybS0+dHlwZSA9IEJDTUNMSV9QQVJNX01BQzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU06CisgICAgICAgIGNtZF9wYXJtLT50eXBlID0gQkNNQ0xJX1BBUk1fRU5VTTsKKyAgICAgICAgY21kX3Bhcm0tPmVudW1fdGFibGUgPSB0ZC0+eC5lOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTV9NQVNLOgorICAgICAgICBjbWRfcGFybS0+dHlwZSA9IEJDTUNMSV9QQVJNX0VOVU1fTUFTSzsKKyAgICAgICAgY21kX3Bhcm0tPmVudW1fdGFibGUgPSB0ZC0+eC5lOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBiY21jbGlfcHJpbnQoY3VycmVudF9zZXNzaW9uLCAiKioqIGNhbid0IG1hcCB0eXBlICVzICglZClcbiIsIHRkLT5uYW1lLCAoaW50KXRkLT5iYXNlX3R5cGUpOworICAgICAgICByYyA9IEJDTV9FUlJfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogTWFwIHVpbnQ4X3QgYXJyYXkgdG8gYnVmZmVyIGlmIGl0IGlzIGluZGVwZW5kZW50IChub3Qgc3RydWN0dXJlIGZpZWxkKSAqLworICAgIGlmIChhcnJheV90ZCAmJgorICAgICAgICB0ZC0+c2l6ZSA9PSAxICYmCisgICAgICAgICh0ZC0+YmFzZV90eXBlID09IEJDTU9MVF9CQVNFX1RZUEVfSURfVU5VTSB8fCB0ZC0+YmFzZV90eXBlID09IEJDTU9MVF9CQVNFX1RZUEVfSURfVU5VTV9IRVgpICYmCisgICAgICAgIChwYXJtX2RhdGEtPmFycmF5X2ZkID09IHBhcm1fZGF0YS0+ZmllbGQgfHwgIXBhcm1fZGF0YS0+ZmllbGQpKQorICAgIHsKKyAgICAgICAgY21kX3Bhcm0tPnR5cGUgPSBCQ01DTElfUEFSTV9CVUZGRVI7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIG5hbWUgYW5kIGRlc2NyaXB0aW9uIGFuZCBjb3B5IHRvIHRvIHBhcm0gKi8KK3N0YXRpYyBiY21vc19lcnJubyBfYXBpX2NsaV9jb3B5X3Bhcm1fbmFtZShiY21jbGlfY21kX3Bhcm0gKnBhcm0sIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRlc2NyKQoreworICAgIHBhcm0tPm5hbWUgPSBiY21vc19hbGxvYyhzdHJsZW4obmFtZSkgKyAxKTsKKyAgICBwYXJtLT5kZXNjcmlwdGlvbiA9IGJjbW9zX2FsbG9jKHN0cmxlbihkZXNjcikgKyAxKTsKKyAgICBpZiAoKHBhcm0tPm5hbWUgPT0gTlVMTCkgfHwgKHBhcm0tPmRlc2NyaXB0aW9uID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgLyogU3VjY2Vzc2Z1bCBhbGxvY2F0aW9uIGlmIGFueSB3aWxsIGJlIHJlbGVhc2VkIGJ5IGNvbW1vbiBjbGVhbnVwCisgICAgICAgICAqIGFsb25nIHdpdGggdGhlIHJlc3Qgb2YgZHluYW1pYyBwYXJhbWV0ZXIgZmllbGRzICovCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKyAgICBzdHJjcHkoQVBJQ0xJX0NBU1RfRElTQ0FSRF9DT05TVChwYXJtLT5uYW1lLCB2b2lkICopLCBuYW1lKTsKKyAgICBzdHJjcHkoQVBJQ0xJX0NBU1RfRElTQ0FSRF9DT05TVChwYXJtLT5kZXNjcmlwdGlvbiwgdm9pZCAqKSwgZGVzY3IpOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBwb3B1bGF0ZSBzaW5nbGUgcGFyYW1ldGVyICovCitzdGF0aWMgaW50IF9hcGlfY2xpX3BvcHVsYXRlX3Bhcm0xKGNvbnN0IGJjbWNsaV9wcm9wX2Rlc2NyICpwZCwgY29uc3QgYmNtY2xpX2ZpZWxkX2Rlc2NyICpmZCwgY29uc3QgYmNtY2xpX3R5cGVfZGVzY3IgKnRkLAorICAgIGNvbnN0IGJjbWNsaV9maWVsZF9kZXNjciAqYXJyYXlfZmQsIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3QgYXJyYXlfZmRfb2Zmc2V0LAorICAgIGJjbWNsaV9jbWRfcGFybSAqY21kX3Bhcm0sIHVpbnQzMl90IGNtZF9mbGFncywgY2hhciAqbmFtZSwgY2hhciAqaGVscCkKK3sKKyAgICBhcGljbGlfcGFybV9kYXRhICpwYXJtX2RhdGEgPSBjbWRfcGFybS0+dXNlcl9kYXRhOworICAgIGludCByYzsKKworICAgIHBhcm1fZGF0YS0+cHJvcCA9IHBkOworICAgIHBhcm1fZGF0YS0+ZmllbGQgPSBmZDsKKyAgICBwYXJtX2RhdGEtPm9mZnNldCA9IG9mZnNldDsKKyAgICBwYXJtX2RhdGEtPmFycmF5X2ZkID0gYXJyYXlfZmQ7CisgICAgcGFybV9kYXRhLT5hcnJheV9mZF9vZmZzZXQgPSBhcnJheV9mZF9vZmZzZXQ7CisKKyAgICByYyA9IF9hcGlfY2xpX2NvcHlfcGFybV9uYW1lKGNtZF9wYXJtLCBuYW1lLCBoZWxwKTsKKyAgICBpZiAocmMpCisgICAgeworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorICAgIGNtZF9wYXJtLT5mbGFncyA9IGNtZF9mbGFnczsKKyAgICBpZiAodGQtPm1pbl92YWwgIT0gdGQtPm1heF92YWwgfHwgdGQtPm1pbl92YWwpCisgICAgeworICAgICAgICBjbWRfcGFybS0+ZmxhZ3MgfD0gQkNNQ0xJX1BBUk1fRkxBR19SQU5HRTsKKyAgICAgICAgY21kX3Bhcm0tPmxvd192YWwgPSB0ZC0+bWluX3ZhbDsKKyAgICAgICAgY21kX3Bhcm0tPmhpX3ZhbCA9IHRkLT5tYXhfdmFsOworICAgIH0KKyAgICByYyA9IF9hcGlfY2xpX21hcF90eXBlKHRkLCBhcnJheV9mZCA/IGFycmF5X2ZkLT50eXBlIDogTlVMTCwgY21kX3Bhcm0pOworICAgIGlmIChyYyA8IDApCisgICAgeworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgLyogQXJyYXlzIHJlcXVpcmUgbW9yZSB3b3JrLgorICAgICAqIC0gQ2FsY3VsYXRlIHNpemUuIEtub3duIGZvciBmaXhlZCBhcnJheXMsIGhhcmQtY29kZWQgbWF4IGZvciBkeW5hbWljCisgICAgICogLSBBbGxvY2F0ZSBlaXRoZXIgYnVmZmVyIG9yIGFycmF5IG9mIHZhbHVlcyBiYXNlZCBvbiBDTEkgcGFyYW1ldGVyIHR5cGUKKyAgICAgKiAtIENhbGN1bGF0ZSBvZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGFycmF5IGVudHJ5CisgICAgICovCisgICAgaWYgKGFycmF5X2ZkKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgYXJyYXlfc2l6ZTsKKworICAgICAgICBpZiAoYXJyYXlfZmQtPnR5cGUtPmJhc2VfdHlwZSA9PSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9GSVhFRCkKKyAgICAgICAgeworICAgICAgICAgICAgYXJyYXlfc2l6ZSA9IGFycmF5X2ZkLT50eXBlLT54LmFycl9maXhlZC5zaXplOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXJyYXlfc2l6ZSA9IGFycmF5X2ZkLT50eXBlLT54LmFycl9keW4ubWF4X3NpemU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFhcnJheV9zaXplKQorICAgICAgICB7CisgICAgICAgICAgICBiY21jbGlfcHJpbnQoY3VycmVudF9zZXNzaW9uLCAiKioqIEVycm9yIGluICVzIGFycmF5IGRlc2NyaXB0b3IuIFNpemUgaXMgbm90IHNldC5cbiIsIGFycmF5X2ZkLT5uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICB9CisgICAgICAgIGlmIChjbWRfcGFybS0+dHlwZSA9PSBCQ01DTElfUEFSTV9CVUZGRVIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gYmNtb2x0X2J1Zl9hbGxvYygmY21kX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgYXJyYXlfc2l6ZSwgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpOworICAgICAgICAgICAgaWYgKHJjKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGNtZF9wYXJtLT52YWx1ZXMgPSBiY21vc19jYWxsb2Moc2l6ZW9mKGJjbWNsaV9wYXJtX3ZhbHVlKSAqIGFycmF5X3NpemUpOworICAgICAgICAgICAgaWYgKCFjbWRfcGFybS0+dmFsdWVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY21kX3Bhcm0tPm1heF9hcnJheV9zaXplID0gYXJyYXlfc2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAxOworfQorCisKKy8qIHBvcHVsYXRlIG5hbWUgYnVmIGFuZCBoZWxwIGJ1ZiAqLworc3RhdGljIHZvaWQgX2FwaV9jbGlfcG9wdWxhdGVfbmFtZV9oZWxwKGNvbnN0IGJjbWNsaV9maWVsZF9kZXNjciAqZmxkLCBjaGFyICpuYW1lX2J1ZjAsIGNoYXIgKmhlbHBfYnVmMCwKKyAgICBjaGFyICpuYW1lX2J1ZiwgY2hhciAqaGVscF9idWYpCit7CisgICAgbmFtZV9idWZbMF0gPSAwOworICAgIGhlbHBfYnVmWzBdID0gMDsKKyAgICBiY21jbGlfc3RybmNweShuYW1lX2J1ZiwgbmFtZV9idWYwLCBBUElDTElfTUFYX1BBUk1fTkFNRV9MRU5HVEgpOworICAgIGlmIChzdHJsZW4obmFtZV9idWYpKQorICAgICAgICBiY21jbGlfc3RybmNhdChuYW1lX2J1ZiwgIi4iLCBBUElDTElfTUFYX1BBUk1fTkFNRV9MRU5HVEgpOworICAgIGJjbWNsaV9zdHJuY2F0KG5hbWVfYnVmLCBmbGQtPmNsaV9uYW1lID8gZmxkLT5jbGlfbmFtZSA6IGZsZC0+bmFtZSwgQVBJQ0xJX01BWF9QQVJNX05BTUVfTEVOR1RIKTsKKyAgICBiY21jbGlfc3RybmNweShoZWxwX2J1ZiwgaGVscF9idWYwLCBBUElDTElfTUFYX1BBUk1fSEVMUF9MRU5HVEgpOworICAgIGJjbWNsaV9zdHJuY2F0KGhlbHBfYnVmLCAiIC0gIiwgQVBJQ0xJX01BWF9QQVJNX0hFTFBfTEVOR1RIKTsKKyAgICBiY21jbGlfc3RybmNhdChoZWxwX2J1ZiwgZmxkLT5kZXNjciA/IGZsZC0+ZGVzY3IgOiBmbGQtPm5hbWUsIEFQSUNMSV9NQVhfUEFSTV9IRUxQX0xFTkdUSCk7Cit9CisKKy8qIEFsbG9jYXRlIENMSSBwYXJhbWV0ZXIgYXJyYXkuIFNldCB1cCBwYXJtLT5kYXRhICovCitzdGF0aWMgYmNtY2xpX2NtZF9wYXJtICpfYXBpX2NsaV9wYXJtX2FsbG9jKGludCBucGFybXMpCit7CisgICAgdWludDMyX3Qgc2l6ZTsKKyAgICBiY21jbGlfY21kX3Bhcm0gKnBhcm1zOworICAgIGFwaWNsaV9wYXJtX2RhdGEgKnBhcm1fZGF0YTsKKyAgICBpbnQgaTsKKworICAgIC8qIEFsbG9jYXRlIHBhcmFtZXRlciB0YWJsZSBhbmQgcG9wdWxhdGUgaXQgKi8KKyAgICBzaXplID0gKHNpemVvZihiY21jbGlfY21kX3Bhcm0pICsgc2l6ZW9mKGFwaWNsaV9wYXJtX2RhdGEpKSAqIChucGFybXMgKyAxKTsKKyAgICBwYXJtcyA9IGJjbW9zX2NhbGxvYyhzaXplKTsKKyAgICBpZiAoIXBhcm1zKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIC8qIEFzc29jaWF0ZSBwYXJhbWV0ZXJfZGF0YSBzdHJ1Y3RzIHdpdGggcGFyYW1ldGVycyAqLworICAgIHBhcm1fZGF0YSA9IChhcGljbGlfcGFybV9kYXRhICopKHBhcm1zICsgbnBhcm1zICsgMSk7CisgICAgZm9yIChpID0gMDsgaSA8IG5wYXJtczsgaSsrKQorICAgIHsKKyAgICAgICAgcGFybXNbaV0udXNlcl9kYXRhID0gJnBhcm1fZGF0YVtpXTsKKyAgICB9CisgICAgcmV0dXJuIHBhcm1zOworfQorCisvKiBjbG9uZSBlbnVtIHRhYmxlICovCitzdGF0aWMgYmNtY2xpX2VudW1fdmFsICpfYXBpX2NsaV9jbG9uZV9lbnVtX3RhYmxlKGJjbWNsaV9jbWRfcGFybSAqcGFybSkKK3sKKyAgICBiY21jbGlfZW51bV92YWwgKm9yZ190YWJsZSA9IHBhcm0tPmVudW1fdGFibGU7CisgICAgYmNtY2xpX2VudW1fdmFsICp2YWwgPSBvcmdfdGFibGU7CisgICAgYmNtY2xpX2VudW1fdmFsICpjbG9uZV90YWJsZSA9IG9yZ190YWJsZTsKKyAgICBpbnQgaSwgbjsKKworICAgIEJVR19PTihwYXJtLT50eXBlICE9IEJDTUNMSV9QQVJNX0VOVU0pOworICAgIHdoaWxlICh2YWwgJiYgdmFsLT5uYW1lKQorICAgIHsKKyAgICAgICAgKyt2YWw7CisgICAgfQorICAgIG4gPSB2YWwgLSBvcmdfdGFibGU7CisKKyAgICBjbG9uZV90YWJsZSA9IGJjbW9zX2NhbGxvYyhzaXplb2YoYmNtY2xpX2VudW1fdmFsKSAqIChuICsgMSkpOworICAgIGlmICghY2xvbmVfdGFibGUpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICB7CisgICAgICAgIGNsb25lX3RhYmxlW2ldLm5hbWUgPSBvcmdfdGFibGVbaV0ubmFtZTsKKyAgICAgICAgY2xvbmVfdGFibGVbaV0udmFsID0gb3JnX3RhYmxlW2ldLnZhbDsKKyAgICB9CisgICAgcmV0dXJuIGNsb25lX3RhYmxlOworfQorCisKKy8qIHBvcHVsYXRlIENMSSBwYXJhbWV0ZXIocykgZnJvbSBhIHNpbmdsZSBwcm9wZXJ0eS4gQ2FuIGJlIG11bHRpcGxlIHBhcmFtZXRlcnMKKyAqIGlmIHByb3BlcnR5IGNvbnRhaW5zIG11bHRpcGxlIGZpZWxkcy4KKyAqIFJldHVybnMgbnVtYmVyIG9mIHBhcmFtZXRlcnMgcG9wdWxhdGVkID49IDAgb3IgZXJyb3IgPCAwCisgKi8KK3N0YXRpYyBpbnQgX2FwaV9jbGlfcG9wdWxhdGVfcGFybXNfZnJvbV9wcm9wZXJ0eShjb25zdCBiY21jbGlfcHJvcF9kZXNjciAqcGQsIGNvbnN0IGJjbWNsaV9maWVsZF9kZXNjciAqZmQsCisgICAgY29uc3QgYmNtY2xpX2ZpZWxkX2Rlc2NyICphcnJheV9mZCwgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBhcnJheV9mZF9vZmZzZXQsIGJjbWNsaV9jbWRfcGFybSAqcGFybXMsCisgICAgYmNtb2x0X3Byb3BfYWNjZXNzX2lkIGFjY2Vzc19sZXZlbCwgdWludDMyX3QgY21kX2ZsYWdzLCBjaGFyICpuYW1lX2J1ZjAsIGNoYXIgKmhlbHBfYnVmMCkKK3sKKyAgICBjb25zdCBiY21jbGlfdHlwZV9kZXNjciAqdGQgPSBmZCA/IGZkLT50eXBlIDogcGQtPnR5cGU7CisgICAgdWludDMyX3QgbmYgPSAwOworICAgIGNoYXIgbmFtZV9idWZbQVBJQ0xJX01BWF9QQVJNX05BTUVfTEVOR1RIXTsKKyAgICBjaGFyIGhlbHBfYnVmW0FQSUNMSV9NQVhfUEFSTV9IRUxQX0xFTkdUSF07CisgICAgaW50IHJjID0gMDsKKworICAgIC8qIEF0IHRvcCBsZXZlbCB0YWtlIG5hbWUgZnJvbSBwcm9wZXJ0eSAqLworICAgIGlmICh0ZCA9PSBwZC0+dHlwZSkKKyAgICB7CisgICAgICAgIC8qIEluIGNhc2UgdGhlcmUncyBhIGdsb2JhbCBwcmVmaXggKi8KKyAgICAgICAgY2hhciAqdG9wX25hbWVfYnVmID0gbmFtZV9idWYwOworICAgICAgICB1aW50MzJfdCB0b3BfbmFtZV9idWZfbGVuID0gQVBJQ0xJX01BWF9QQVJNX05BTUVfTEVOR1RIOworICAgICAgICB1aW50MzJfdCBwcmVmaXhfbGVuID0gc3RybGVuKG5hbWVfYnVmMCk7CisgICAgICAgIGlmIChwcmVmaXhfbGVuID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgdG9wX25hbWVfYnVmICs9IHByZWZpeF9sZW47CisgICAgICAgICAgICB0b3BfbmFtZV9idWZfbGVuIC09IHByZWZpeF9sZW47CisgICAgICAgIH0KKworICAgICAgICBiY21jbGlfc3RybmNweSh0b3BfbmFtZV9idWYsIHBkLT5jbGlfbmFtZSA/IHBkLT5jbGlfbmFtZSA6IHBkLT5uYW1lLCB0b3BfbmFtZV9idWZfbGVuKTsKKyAgICAgICAgYmNtY2xpX3N0cm5jcHkoaGVscF9idWYwLCBwZC0+ZGVzY3IgPyBwZC0+ZGVzY3IgOiBwZC0+bmFtZSwgQVBJQ0xJX01BWF9QQVJNX0hFTFBfTEVOR1RIKTsKKyAgICB9CisKKyAgICAvKiBGb3IgcmVhZCBhY2Nlc3Mgd2Ugb25seSBtYXJrIHdoZXRoZXIgcmVhZCBwcm9wZXJ0eSBvciBub3QuIEl0IGlzIG5vdCBmaWVsZC1ieS1maWVsZCBvcGVyYXRpb24gKi8KKyAgICBpZiAoYWNjZXNzX2xldmVsID09IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SKQorICAgIHsKKyAgICAgICAgdGQgPSAmYm9vbF90eXBlX2Rlc2NyOworICAgIH0KKworICAgIC8qIEluIGNhc2Ugb2YgYXJyYXlzIHdlIHNob3VsZAorICAgICAqIC0gY2hlY2sgdGhhdCB0aGVyZSBpcyBubyBhcnJheSBpbiBhcnJheS4gSXQgaXMgbm90IHN1cHBvcnRlZAorICAgICAqIC0gc3RvcmUgYXJyYXkgdHlwZSBkZXNjcmlwdG9yIEZGVSBhbmQgcmVwbGFjZSB0aGUgImN1cnJlbnQiIHR5cGUgZGVzY3JpcHRvciB3aXRoIGVsZW1lbnQgdHlwZQorICAgICAqIC0gcmVzZXQgb2Zmc2V0IGJlY2F1c2UgZm9yIGFycmF5IGZpZWxkcyBpdCBzaG91bGQgYmUgY2FsY3VsYXRlZCBmcm9tIGFycmF5IGJhc2UgcmF0aGVyIHRoYW4gcHJvcGVydHkKKyAgICAgKi8KKyAgICBpZiAodGQtPmJhc2VfdHlwZSA9PSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9EWU4gfHwgdGQtPmJhc2VfdHlwZSA9PSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9GSVhFRCkKKyAgICB7CisgICAgICAgIGlmIChhcnJheV9mZCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3ByaW50KGN1cnJlbnRfc2Vzc2lvbiwgIioqKiAlcyBpbiAlczogYXJyYXlzLWluLWFycmF5cyBhcmUgbm90IHN1cHBvcnRlZFxuIiwgcGQtPm5hbWUsIGFycmF5X2ZkLT5uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisgICAgICAgIH0KKyAgICAgICAgLyogc3RvcmUgYXJyYXkgdHlwZSBhbmQgZmV0Y2ggZWxlbWVudCB0eXBlICovCisgICAgICAgIGFycmF5X2ZkID0gZmQgPyBmZCA6IChjb25zdCBiY21jbGlfZmllbGRfZGVzY3IgKilwZDsKKyAgICAgICAgaWYgKHRkLT5iYXNlX3R5cGUgPT0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRFlOKQorICAgICAgICB7CisgICAgICAgICAgICB0ZCA9IHRkLT54LmFycl9keW4uZWxlbV90eXBlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGQgPSB0ZC0+eC5hcnJfZml4ZWQuZWxlbV90eXBlOworICAgICAgICB9CisgICAgICAgIGFycmF5X2ZkX29mZnNldCA9IG9mZnNldDsKKyAgICAgICAgb2Zmc2V0ID0gMDsKKyAgICB9CisKKyAgICBpZiAodGQtPmJhc2VfdHlwZSA9PSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IGY7CisgICAgICAgIGlmICghdGQtPngucy5udW1fZmllbGRzKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIEJVR19PTighdGQtPngucy5maWVsZHMpOworICAgICAgICBmb3IgKGYgPSAwOyBmIDwgdGQtPngucy5udW1fZmllbGRzOyBmKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGJjbWNsaV9maWVsZF9kZXNjciAqZmxkID0gJnRkLT54LnMuZmllbGRzW2ZdOworICAgICAgICAgICAgX2FwaV9jbGlfcG9wdWxhdGVfbmFtZV9oZWxwKGZsZCwgbmFtZV9idWYwLCBoZWxwX2J1ZjAsIG5hbWVfYnVmLCBoZWxwX2J1Zik7CisgICAgICAgICAgICByYyA9IF9hcGlfY2xpX3BvcHVsYXRlX3Bhcm1zX2Zyb21fcHJvcGVydHkocGQsIGZsZCwgYXJyYXlfZmQsIG9mZnNldCtmbGQtPm9mZnNldCwKKyAgICAgICAgICAgICAgICBhcnJheV9mZF9vZmZzZXQsICZwYXJtc1tuZl0sIGFjY2Vzc19sZXZlbCwgY21kX2ZsYWdzLCBuYW1lX2J1ZiwgaGVscF9idWYpOworICAgICAgICAgICAgaWYgKHJjID4gMCkKKyAgICAgICAgICAgICAgICBuZiArPSAgcmM7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAodGQtPmJhc2VfdHlwZSA9PSBCQ01PTFRfQkFTRV9UWVBFX0lEX1VOSU9OKQorICAgIHsKKyAgICAgICAgLyogVW5pb24gKi8KKyAgICAgICAgdWludDE2X3QgZjsKKyAgICAgICAgY29uc3QgYmNtY2xpX2ZpZWxkX2Rlc2NyICpmbGQ7CisgICAgICAgIGJjbWNsaV9jbWRfcGFybSAqc2VsX3Bhcm07CisgICAgICAgIGFwaWNsaV9wYXJtX2RhdGEgKnNlbF9kYXRhOworICAgICAgICBiY21jbGlfZW51bV92YWwgKmU7CisKKyAgICAgICAgaWYgKCF0ZC0+eC51Lm51bV9jb21tb25fZmllbGRzKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIEJVR19PTighdGQtPngudS5jb21tb25fZmllbGRzKTsKKworICAgICAgICAvKiBQb3B1bGF0ZSBwYXJhbWV0ZXJzIHByZWNlZGluZyB0aGUgdW5pb24gc2VsZWN0b3IgKi8KKyAgICAgICAgZm9yIChmID0gMDsgZiA8IHRkLT54LnUuY2xhc3NpZmllcl9pZHg7IGYrKykKKyAgICAgICAgeworICAgICAgICAgICAgZmxkID0gJnRkLT54LnUuY29tbW9uX2ZpZWxkc1tmXTsKKyAgICAgICAgICAgIF9hcGlfY2xpX3BvcHVsYXRlX25hbWVfaGVscChmbGQsIG5hbWVfYnVmMCwgaGVscF9idWYwLCBuYW1lX2J1ZiwgaGVscF9idWYpOworICAgICAgICAgICAgcmMgPSAgX2FwaV9jbGlfcG9wdWxhdGVfcGFybXNfZnJvbV9wcm9wZXJ0eShwZCwgZmxkLCBhcnJheV9mZCwKKyAgICAgICAgICAgICAgICBvZmZzZXQrZmxkLT5vZmZzZXQsIGFycmF5X2ZkX29mZnNldCwgJnBhcm1zW25mXSwgYWNjZXNzX2xldmVsLCBjbWRfZmxhZ3MsIG5hbWVfYnVmLCBoZWxwX2J1Zik7CisgICAgICAgICAgICBpZiAocmMgPiAwKQorICAgICAgICAgICAgICAgIG5mICs9IHJjOworICAgICAgICB9CisKKyAgICAgICAgLyogTm93IHBvcHVsYXRlIHBhcmFtZXRlciBmb3Igc2VsZWN0b3IgKi8KKyAgICAgICAgc2VsX3Bhcm0gPSAmcGFybXNbbmZdOworICAgICAgICBmbGQgPSAmdGQtPngudS5jb21tb25fZmllbGRzW2ZdOworICAgICAgICBfYXBpX2NsaV9wb3B1bGF0ZV9uYW1lX2hlbHAoZmxkLCBuYW1lX2J1ZjAsIGhlbHBfYnVmMCwgbmFtZV9idWYsIGhlbHBfYnVmKTsKKyAgICAgICAgcmMgPSBfYXBpX2NsaV9wb3B1bGF0ZV9wYXJtc19mcm9tX3Byb3BlcnR5KHBkLCBmbGQsIGFycmF5X2ZkLAorICAgICAgICAgICAgb2Zmc2V0K2ZsZC0+b2Zmc2V0LCBhcnJheV9mZF9vZmZzZXQsIHNlbF9wYXJtLCBhY2Nlc3NfbGV2ZWwsIGNtZF9mbGFncywgbmFtZV9idWYsIGhlbHBfYnVmKTsKKyAgICAgICAgaWYgKHJjID4gMCkKKyAgICAgICAgICAgIG5mICs9IHJjOworICAgICAgICAvKiBDbG9uZSBlbnVtIHRhYmxlIGluIG9yZGVyIHRvIGFsbG93IG1vZGlmeWluZyBpdCAqLworICAgICAgICBpZiAocmMgPj0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgc2VsX3Bhcm0tPmVudW1fdGFibGUgPSBfYXBpX2NsaV9jbG9uZV9lbnVtX3RhYmxlKHNlbF9wYXJtKTsKKyAgICAgICAgICAgIGlmICghc2VsX3Bhcm0tPmVudW1fdGFibGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX05PTUVNOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogTm93IHNldC11cCBzZWxlY3RvciAqLworICAgICAgICBzZWxfcGFybS0+ZmxhZ3MgfD0gQkNNQ0xJX1BBUk1fRkxBR19TRUxFQ1RPUjsKKyAgICAgICAgc2VsX2RhdGEgPSBzZWxfcGFybS0+dXNlcl9kYXRhOworICAgICAgICBlID0gc2VsX3Bhcm0tPmVudW1fdGFibGU7CisgICAgICAgIHdoaWxlIChlICYmIGUtPm5hbWUgJiYgcmMgPj0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgZmxkID0gJnRkLT54LnUudW5pb25fZmllbGRzW2UgLSBzZWxfcGFybS0+ZW51bV90YWJsZV07CisgICAgICAgICAgICBpZiAoZmxkLT50eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBucCA9IF9hcGlfY2xpX2dldF9udW1fZmllbGRzX2luX3R5cGUoZmxkLT50eXBlKTsKKyAgICAgICAgICAgICAgICBpbnQgaTsKKworICAgICAgICAgICAgICAgIGUtPnBhcm1zID0gX2FwaV9jbGlfcGFybV9hbGxvYyhucCk7CisgICAgICAgICAgICAgICAgaWYgKCFlLT5wYXJtcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBucDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3Bhcm1fZGF0YSAqZGF0YSA9IGUtPnBhcm1zW2ldLnVzZXJfZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgZGF0YS0+Z3JvdXAgPSBzZWxfZGF0YS0+Z3JvdXA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIENvbGxhcHNlIHN1YnN0cnVjdHVyZSBuYW1lICovCisgICAgICAgICAgICAgICAgaWYgKGZsZC0+dHlwZS0+YmFzZV90eXBlID09IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNUIHx8CisgICAgICAgICAgICAgICAgICAgIGZsZC0+dHlwZS0+YmFzZV90eXBlID09IEJDTU9MVF9CQVNFX1RZUEVfSURfVU5JT04pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21jbGlfc3RybmNweShuYW1lX2J1ZiwgbmFtZV9idWYwLCBzaXplb2YobmFtZV9idWYpKTsKKyAgICAgICAgICAgICAgICAgICAgYmNtY2xpX3N0cm5jcHkoaGVscF9idWYsIGhlbHBfYnVmMCwgc2l6ZW9mKGhlbHBfYnVmKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9hcGlfY2xpX3BvcHVsYXRlX25hbWVfaGVscChmbGQsIG5hbWVfYnVmMCwgaGVscF9idWYwLCBuYW1lX2J1ZiwgaGVscF9idWYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByYyA9IF9hcGlfY2xpX3BvcHVsYXRlX3Bhcm1zX2Zyb21fcHJvcGVydHkocGQsIGZsZCwgYXJyYXlfZmQsCisgICAgICAgICAgICAgICAgICAgIG9mZnNldCtmbGQtPm9mZnNldCwgYXJyYXlfZmRfb2Zmc2V0LCBlLT5wYXJtcywgYWNjZXNzX2xldmVsLCBjbWRfZmxhZ3MsIG5hbWVfYnVmLCBoZWxwX2J1Zik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK2U7CisgICAgICAgIH0KKworICAgICAgICAvKiBGaW5hbGx5IHBvcHVsYXRlIHBhcmFtZXRlcnMgZm9sbG93aW5nIHRoZSBzZWxlY3RvciBwYXJhbWV0ZXIgKi8KKyAgICAgICAgZm9yIChmID0gdGQtPngudS5jbGFzc2lmaWVyX2lkeCArIDE7IGYgPCB0ZC0+eC51Lm51bV9jb21tb25fZmllbGRzICYmIHJjID49IDA7IGYrKykKKyAgICAgICAgeworICAgICAgICAgICAgZmxkID0gJnRkLT54LnUuY29tbW9uX2ZpZWxkc1tmXTsKKyAgICAgICAgICAgIF9hcGlfY2xpX3BvcHVsYXRlX25hbWVfaGVscChmbGQsIG5hbWVfYnVmMCwgaGVscF9idWYwLCBuYW1lX2J1ZiwgaGVscF9idWYpOworICAgICAgICAgICAgcmMgPSBfYXBpX2NsaV9wb3B1bGF0ZV9wYXJtc19mcm9tX3Byb3BlcnR5KHBkLCBmbGQsIGFycmF5X2ZkLAorICAgICAgICAgICAgICAgIG9mZnNldCtmbGQtPm9mZnNldCwgYXJyYXlfZmRfb2Zmc2V0LCAmcGFybXNbbmZdLCBhY2Nlc3NfbGV2ZWwsIGNtZF9mbGFncywgbmFtZV9idWYsIGhlbHBfYnVmKTsKKyAgICAgICAgICAgIGlmIChyYyA+IDApCisgICAgICAgICAgICAgICAgbmYgKz0gcmM7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogRmluYWxseSEgU2ltcGxlIHR5cGUgdGhhdCBtYXBzIHRvIGEgc2luZ2xlIENMSSBwYXJhbWV0ZXIgKi8KKyAgICAgICAgbmYgPSBfYXBpX2NsaV9wb3B1bGF0ZV9wYXJtMShwZCwgZmQsIHRkLCBhcnJheV9mZCwgb2Zmc2V0LCBhcnJheV9mZF9vZmZzZXQsCisgICAgICAgICAgICAmcGFybXNbMF0sIGNtZF9mbGFncywgbmFtZV9idWYwLCBoZWxwX2J1ZjApOworICAgIH0KKyAgICByZXR1cm4gKHJjID49IDApID8gbmYgOiByYzsKK30KKworLyogcG9wdWxhdGUgQ0xJIHBhcmFtZXRlciB0YWJsZSAqLworc3RhdGljIGludCBfYXBpX2NsaV9wb3B1bGF0ZV9wYXJtcygKKyAgICBiY21vbHRfb2JqX2lkIG8sCisgICAgYmNtb2x0X21ndF9ncm91cCBncm91cCwKKyAgICB1aW50MTZfdCBzdWJncm91cCwKKyAgICBiY21vbHRfcHJvcF9hY2Nlc3NfaWQgYWNjZXNzX2xldmVsLAorICAgIGJjbWNsaV9jbWRfcGFybSAqcGFybXMsCisgICAgdWludDMyX3QgY21kX2ZsYWdzLAorICAgIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKyAgICBpbnQgbmYgPSAwOworICAgIGludCBpOworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIGZvciAoaSA9IDA7IHJjICE9IEJDTV9FUlJfUkFOR0U7IGkrKykKKyAgICB7CisgICAgICAgIGNvbnN0IGJjbWNsaV9wcm9wX2Rlc2NyICpwZDsKKyAgICAgICAgY2hhciBuYW1lX2J1ZltBUElDTElfTUFYX1BBUk1fTkFNRV9MRU5HVEhdID0gIiI7CisgICAgICAgIGNoYXIgaGVscF9idWZbQVBJQ0xJX01BWF9QQVJNX0hFTFBfTEVOR1RIXSA9ICIiOworCisgICAgICAgIHN0cm5jcHkobmFtZV9idWYsIHByZWZpeCwgQVBJQ0xJX01BWF9QQVJNX05BTUVfTEVOR1RILTEpOworICAgICAgICBuYW1lX2J1ZltBUElDTElfTUFYX1BBUk1fTkFNRV9MRU5HVEgtMV0gPSAwOworCisgICAgICAgIHJjID0gYXBpX2NsaV9vYmplY3RfcHJvcGVydHkobywgZ3JvdXAsIHN1Ymdyb3VwLCBpLCAmcGQpOworICAgICAgICBpZiAocmMgPT0gQkNNX0VSUl9PSyAmJiAocGQtPmFjY2VzcyAmIGFjY2Vzc19sZXZlbCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gX2FwaV9jbGlfcG9wdWxhdGVfcGFybXNfZnJvbV9wcm9wZXJ0eShwZCwgTlVMTCwgTlVMTCwgMCwgMCwgJnBhcm1zW25mXSwKKyAgICAgICAgICAgICAgICBhY2Nlc3NfbGV2ZWwsIGNtZF9mbGFncywgbmFtZV9idWYsIGhlbHBfYnVmKTsKKyAgICAgICAgICAgIGlmIChyYyA+IDApCisgICAgICAgICAgICAgICAgbmYgKz0gcmM7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG5mOworfQorCisKKy8qIGNvbXBhY3Qgc2VsZWN0b3IgdGFibGUuIHNxdWVlemUgb3V0IHZhbHVlcyB0aGF0IGRvbid0IGhhdmUgcGFyYW1ldGVyIHRhYmxlIGF0dGFjaGVkICovCitzdGF0aWMgdm9pZCBfYXBpX2NsaV9jb21wYWN0X3NlbGVjdG9yKGJjbWNsaV9lbnVtX3ZhbCAqc2VsZWN0b3IsIGludCBzaXplKQoreworICAgIGludCBpLCBqOworCisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICB7CisgICAgICAgIGlmICghc2VsZWN0b3JbaV0ucGFybXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoIGogPSBpICsgMTsgaiA8IHNpemUgJiYgIXNlbGVjdG9yW2pdLnBhcm1zOyBqICsrKQorICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgIGlmIChqIDwgc2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoJnNlbGVjdG9yW2ldLCAmc2VsZWN0b3Jbal0sIHNpemVvZihiY21jbGlfZW51bV92YWwpKTsKKyAgICAgICAgICAgICAgICBtZW1zZXQoJnNlbGVjdG9yW2pdLCAwLCBzaXplb2YoYmNtY2xpX2VudW1fdmFsKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWVtc2V0KCZzZWxlY3RvcltpXSwgMCwgc2l6ZW9mKGJjbWNsaV9lbnVtX3ZhbCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvKiBGcmVlIENMSSBwYXJhbWV0ZXJzLiBib3RoIG5hbWUgYW5kIGRlc2NyaXB0aW9uIGFyZSBhbGxvY2F0ZWQgZHluYW1pY2FsbHkgKi8KK3N0YXRpYyB2b2lkIF9hcGlfY2xpX2ZyZWVfcGFybXMoYmNtY2xpX2NtZF9wYXJtICpwYXJtcykKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKnAgPSBwYXJtczsKKworICAgIHdoaWxlIChwLT5uYW1lKQorICAgIHsKKyAgICAgICAgaWYgKChwLT5mbGFncyAmIEJDTUNMSV9QQVJNX0ZMQUdfU0VMRUNUT1IpKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBSZW1vdmUgc2VsZWN0b3IgdGFibGUgKi8KKyAgICAgICAgICAgIGJjbWNsaV9lbnVtX3ZhbCAqc2VsID0gcC0+ZW51bV90YWJsZTsKKyAgICAgICAgICAgIGlmIChzZWwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtY2xpX2VudW1fdmFsICplID0gc2VsOworICAgICAgICAgICAgICAgIHdoaWxlKGUtPm5hbWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZS0+cGFybXMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9hcGlfY2xpX2ZyZWVfcGFybXMoZS0+cGFybXMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICsrZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYmNtb3NfZnJlZShzZWwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChwLT5kZXNjcmlwdGlvbikKKyAgICAgICAgICAgIGJjbW9zX2ZyZWUoQVBJQ0xJX0NBU1RfRElTQ0FSRF9DT05TVChwLT5kZXNjcmlwdGlvbiwgdm9pZCAqKSk7CisgICAgICAgIGlmIChwLT5uYW1lKQorICAgICAgICAgICAgYmNtb3NfZnJlZShBUElDTElfQ0FTVF9ESVNDQVJEX0NPTlNUKHAtPm5hbWUsIHZvaWQgKikpOworICAgICAgICBpZiAocC0+bWF4X2FycmF5X3NpemUgJiYgcC0+dmFsdWVzKQorICAgICAgICAgICAgYmNtb3NfZnJlZShwLT52YWx1ZXMpOworICAgICAgICBpZiAocC0+dmFsdWUuYnVmZmVyLnN0YXJ0KQorICAgICAgICAgICAgYmNtb2x0X2J1Zl9mcmVlKCZwLT52YWx1ZS5idWZmZXIpOworCisgICAgICAgICsrcDsKKyAgICB9CisgICAgYmNtb3NfZnJlZShwYXJtcyk7Cit9CisKK3N0YXRpYyB1aW50OF90IF9hcGljbGlfZ2V0X251bV9jbWRfcGFybXMoYmNtb2x0X21ndF9ncm91cCBncm91cCwgYXBpX2NsaV9mbGFncyBmbGFncykKK3sKKyAgICBpZiAoZ3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9TVEFUKQorICAgICAgICByZXR1cm4gMjsgLyogb2JqZWN0ICsgc3RhdCBJRCAqLworICAgIGVsc2UgaWYgKGdyb3VwID09IEJDTU9MVF9NR1RfR1JPVVBfQ0ZHICYmIChmbGFncyAmIEFQSV9DTElfRkxBR1NfTVVMVEkpICE9IEFQSV9DTElfRkxBR1NfTk9ORSkKKyAgICAgICAgcmV0dXJuIDM7IC8qIG9iamVjdCArIG1heCBtc2dzICsgaW52ZXJ0IGZsYWcgKi8KKyAgICBlbHNlCisgICAgICAgIHJldHVybiAxOyAvKiBvYmplY3QgKi8KK30KKworLyogUmVhZCBnZW5lcmF0ZWQgaW5mbyBhbmQgYWRkIENMSSBjb21tYW5kICovCitzdGF0aWMgYmNtb3NfZXJybm8gX2FwaV9jbGlfYWRkKGJjbWNsaV9lbnRyeSAqZGlyLCBjb25zdCBjaGFyICpjbWRfbmFtZSwgY29uc3QgY2hhciAqY21kX2Rlc2NyLAorICAgIGJjbW9sdF9tZ3RfZ3JvdXAgZ3JvdXAsIGJjbW9sdF9wcm9wX2FjY2Vzc19pZCBhY2Nlc3NfbGV2ZWwsIGJjbWNsaV9jbWRfY2IgY21kX2hhbmRsZXIsIGFwaV9jbGlfZmxhZ3MgZmxhZ3MpCit7CisgICAgYmNtY2xpX2NtZF9leHRyYV9wYXJtIGNtZF9leHRyYXMgPSB7IC5mcmVlX3Bhcm1zID0gX2FwaV9jbGlfZnJlZV9wYXJtcyB9OworICAgIGJjbWNsaV9jbWRfcGFybSAqY21kX3Bhcm1zOworICAgIGJjbWNsaV9lbnVtX3ZhbCAqb2JqX3NlbGVjdG9yOworICAgIGJjbW9sdF9vYmpfaWQgbzsKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgdWludDMyX3QgY21kX2ZsYWdzID0gMDsKKyAgICB1aW50OF90IG51bV9jbWRfcGFybXMgPSBfYXBpY2xpX2dldF9udW1fY21kX3Bhcm1zKGdyb3VwLCBmbGFncyk7CisgICAgaW50IG5fb2JqOworICAgIGludCBpOworCisgICAgLyogQ29tbWFuZCBmbGFnczogcGFyYW1ldGVycyBpbiB0aGUgZm9sbG93aW5nIGdyb3VwcyBhcmUgb3B0aW9uYWwgKi8KKyAgICBpZiAoZ3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9DRkcgfHwgZ3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9TVEFUIHx8IGdyb3VwID09IEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcpCisgICAgICAgIGNtZF9mbGFncyA9IEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUw7CisKKyAgICAvKiBjb21tYW5kIHBhcmFtZXRlcnMgYXJlOgorICAgICAqIC0gb2JqZWN0X25hbWUgKHNlbGVjdG9yKQorICAgICAqIC0gb2JqZWN0X2tleV9maWVsZHMKKyAgICAgKiAtIG9iamVjdF9wZXJfZ3JvdXBfZmllbGRzIGZpbHRlcmVkIGJ5IGFjY2VzcworICAgICAqIFRoZXJlZm9yZSwgdGhlcmUgaXMgMSB0b3AtbGV2ZWwgZW51bSBwYXJhbWV0ZXIgKG9iamVjdCB0eXBlKSB3aXRoIHBlci12YWx1ZSBwYXJhbWV0ZXIgdGFibGVzCisgICAgICogSW4gdGhlIGNhc2Ugb2Ygb3BlcmF0aW9ucyBvciBwcm94eSBtZXNzYWdlcywgdGhlcmUgaXMgYWxzbyBhIHRvcC1sZXZlbCBlbnVtIHBhcmFtZXRlciBmb3IgdGhlIG9wZXIvcHJveHkgbmFtZQorICAgICAqLworCisgICAgLyogQWxsb2NhdGUgZW51bSB0YWJsZSBiYXNlZCBvbiBtYXggbnVtYmVyIG9mIG9iamVjdHMuIFdpbGwgYmUgY29tcGFjdGVkIGluIHRoZSBlbmQgKi8KKyAgICBjbWRfcGFybXMgPSBiY21vc19jYWxsb2Moc2l6ZW9mKGJjbWNsaV9jbWRfcGFybSkgKiAobnVtX2NtZF9wYXJtcyArIDEpKTsKKyAgICBpZiAoIWNtZF9wYXJtcykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisKKyAgICAvKiBBbGxvY2F0ZSBlbm91Z2ggc3BhY2UgZm9yIGFsbCBvYmplY3QgZW50cmllcyBhcyB3ZWxsIGFzIGEgdGVybWluYXRvciBlbnRyeSAod2hpY2ggaXMgbGVmdCBOVUxMKSAqLworICAgIG9ial9zZWxlY3RvciA9IGJjbW9zX2NhbGxvYyhzaXplb2YoYmNtY2xpX2VudW1fdmFsKSAqIChCQ01PTFRfT0JKX0lEX19OVU1fT0YgKyAxKSk7CisgICAgaWYgKCFvYmpfc2VsZWN0b3IpCisgICAgICAgIGdvdG8gbm9tZW1fY2xlYW51cDsKKworICAgIC8qIEFsbG9jYXRlIHBhcmFtZXRlciB0YWJsZSAqLworICAgIG5fb2JqID0gMDsKKyAgICBmb3IgKG8gPSAwOyBvIDwgQkNNT0xUX09CSl9JRF9fTlVNX09GOyBvKyspCisgICAgeworICAgICAgICB1aW50MzJfdCBua2V5ZmllbGRzID0gMDsKKyAgICAgICAgdWludDMyX3QgbmZpZWxkcyA9IDA7CisgICAgICAgIHVpbnQzMl90IG5maWx0ZXJmaWVsZHMgPSAwOworICAgICAgICB1aW50MzJfdCBzaXplOworICAgICAgICB1aW50MTZfdCBzOworICAgICAgICB1aW50MTZfdCBzdWJncm91cF9jb3VudCA9IGFwaV9jbGlfZ2V0X3N1Ymdyb3VwX2NvdW50KG8sIGdyb3VwKTsKKyAgICAgICAgYmNtY2xpX2VudW1fdmFsICpzdWJfc2VsZWN0b3I7CisKKyAgICAgICAgaWYgKCFiY21vbHRfb2JqZWN0X2lzX3N1cHBvcnRlZChjdXJyZW50X3N5c3RlbV9tb2RlLCBvKSAmJiBvICE9IEJDTU9MVF9PQkpfSURfREVWSUNFKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKHN1Ymdyb3VwX2NvdW50ID09IDApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBvYmpfc2VsZWN0b3Jbbl9vYmpdLnZhbCA9IG87CisgICAgICAgIHJjID0gYXBpX2NsaV9vYmplY3RfbmFtZShvLCAmb2JqX3NlbGVjdG9yW25fb2JqXS5uYW1lLCBOVUxMKTsKKyAgICAgICAgaWYgKHJjKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgLyogR2V0IG51bWJlciBvZiBrZXkgZmllbGRzIGFuZCBzYXZlIGl0ICovCisgICAgICAgIGlmIChncm91cCA9PSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHKQorICAgICAgICB7CisgICAgICAgICAgICBua2V5ZmllbGRzID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIF9hcGlfY2xpX2dldF9udW1fZmllbGRzX2luX2dyb3VwKG8sIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfVywgJm5rZXlmaWVsZHMpOworICAgICAgICB9CisKKyAgICAgICAgLyogQWxsb2NhdGUgc3ViZ3JvdXAgZW51bSB0YWJsZSAqLworICAgICAgICBzdWJfc2VsZWN0b3IgPSBiY21vc19jYWxsb2Moc2l6ZW9mKGJjbWNsaV9lbnVtX3ZhbCkgKiAoc3ViZ3JvdXBfY291bnQgKyAxKSk7CisgICAgICAgIGlmICghc3ViX3NlbGVjdG9yKQorICAgICAgICAgICAgZ290byBub21lbV9jbGVhbnVwOworCisgICAgICAgIC8qIEFsbG9jYXRlIHNpbmdsZSBzdWJncm91cCBjb21tYW5kIHBhcmFtZXRlciAqLworICAgICAgICBzaXplID0gc2l6ZW9mKGJjbWNsaV9jbWRfcGFybSkgKiAyOworICAgICAgICBvYmpfc2VsZWN0b3Jbbl9vYmpdLnBhcm1zID0gYmNtb3NfY2FsbG9jKHNpemUpOworICAgICAgICBpZiAoIW9ial9zZWxlY3RvcltuX29ial0ucGFybXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX2ZyZWUoc3ViX3NlbGVjdG9yKTsKKyAgICAgICAgICAgIGdvdG8gbm9tZW1fY2xlYW51cDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFNldHVwIHNpbmdsZSBzdWJncm91cCBjb21tYW5kIHBhcmFtZXRlciAqLworICAgICAgICBvYmpfc2VsZWN0b3Jbbl9vYmpdLnBhcm1zWzBdLnR5cGUgPSBCQ01DTElfUEFSTV9FTlVNOworICAgICAgICBvYmpfc2VsZWN0b3Jbbl9vYmpdLnBhcm1zWzBdLmZsYWdzID0gQkNNQ0xJX1BBUk1fRkxBR19TRUxFQ1RPUjsKKyAgICAgICAgb2JqX3NlbGVjdG9yW25fb2JqXS5wYXJtc1swXS5lbnVtX3RhYmxlID0gc3ViX3NlbGVjdG9yOworICAgICAgICByYyA9IF9hcGlfY2xpX2NvcHlfcGFybV9uYW1lKCZvYmpfc2VsZWN0b3Jbbl9vYmpdLnBhcm1zWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN1YiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3ViZ3JvdXAgKHNwZWNpZmljIG9wZXJhdGlvbiAvIHByb3h5IG1zZykiKTsKKyAgICAgICAgaWYgKHJjKQorICAgICAgICAgICAgZ290byBub21lbV9jbGVhbnVwOworCisgICAgICAgIGZvciAocyA9IDA7IHMgPCBzdWJncm91cF9jb3VudDsgKytzKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpzdWJfbmFtZTsKKyAgICAgICAgICAgIGJjbWNsaV9jbWRfcGFybSAqcGFybV9wdHI7CisKKyAgICAgICAgICAgIC8qIEdldCBuYW1lIG9mIHNwZWNpZmljIHN1Ymdyb3VwICovCisgICAgICAgICAgICByYyA9IGFwaV9jbGlfb2JqZWN0X3N1Ymdyb3VwX25hbWUobywgZ3JvdXAsIHMsICZzdWJfbmFtZSwgTlVMTCk7CisgICAgICAgICAgICBpZiAocmMpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIC8qIFNldHVwIGVudHJ5IGluIHN1Ymdyb3VwIGVudW0gdGFibGUgKi8KKyAgICAgICAgICAgIHN1Yl9zZWxlY3RvcltzXS5uYW1lID0gc3ViX25hbWU7CisgICAgICAgICAgICBzdWJfc2VsZWN0b3Jbc10udmFsID0gczsKKworICAgICAgICAgICAgLyogR2V0IG51bWJlciBvZiBncm91cCBmaWVsZHMgKi8KKyAgICAgICAgICAgIHJjID0gX2FwaV9jbGlfZ2V0X251bV9maWVsZHNfaW5fZ3JvdXAobywgZ3JvdXAsIHMsIGFjY2Vzc19sZXZlbCwgJm5maWVsZHMpOworICAgICAgICAgICAgaWYgKHJjKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAvKiBGb3IgbXVsdGktb2JqZWN0IEdFVCBtZXNzYWdlcywgcG9wdWxhdGUgdGhlIGZpbHRlciBmaWVsZHMganVzdCBsaWtlIGEgU0VUIChleGNlcHQgdGhhdCBhbGwgcmVhZC1vbmx5CisgICAgICAgICAgICAgICBmaWVsZHMgYXJlIGFsc28gc2V0dGFibGUpICovCisgICAgICAgICAgICBpZiAoKGZsYWdzICYgQVBJX0NMSV9GTEFHU19NVUxUSSkgIT0gQVBJX0NMSV9GTEFHU19OT05FKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gX2FwaV9jbGlfZ2V0X251bV9maWVsZHNfaW5fZ3JvdXAobywgZ3JvdXAsIHMsIEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgJm5maWx0ZXJmaWVsZHMpOworICAgICAgICAgICAgICAgIGlmIChyYykKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWYgKChmbGFncyAmIEFQSV9DTElfRkxBR1NfSUdOT1JFX0ZJRUxEUykgIT0gQVBJX0NMSV9GTEFHU19OT05FKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5maWx0ZXJmaWVsZHMgPSAwOworICAgICAgICAgICAgICAgIG5maWVsZHMgPSAwOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8qIEFsbG9jYXRlIHBhcmFtZXRlciB0YWJsZSBhbmQgcG9wdWxhdGUgaXQgKi8KKyAgICAgICAgICAgIHN1Yl9zZWxlY3RvcltzXS5wYXJtcyA9IF9hcGlfY2xpX3Bhcm1fYWxsb2MobmZpZWxkcyArIG5rZXlmaWVsZHMgKyBuZmlsdGVyZmllbGRzKTsKKyAgICAgICAgICAgIGlmICghc3ViX3NlbGVjdG9yW3NdLnBhcm1zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgICAgICAgICBnb3RvIG5vbWVtX2NsZWFudXA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmtleWZpZWxkcyArIG5maWVsZHMgKyBuZmlsdGVyZmllbGRzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3Bhcm1fZGF0YSAqcGFybV9kYXRhID0gc3ViX3NlbGVjdG9yW3NdLnBhcm1zW2ldLnVzZXJfZGF0YTsKKyAgICAgICAgICAgICAgICBwYXJtX2RhdGEtPmdyb3VwID0gKGkgPCBua2V5ZmllbGRzKSA/IEJDTU9MVF9NR1RfR1JPVVBfS0VZIDogZ3JvdXA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBhcm1fcHRyID0gc3ViX3NlbGVjdG9yW3NdLnBhcm1zOworICAgICAgICAgICAgaWYgKG5rZXlmaWVsZHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmMgPSBfYXBpX2NsaV9wb3B1bGF0ZV9wYXJtcyhvLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1BST1BfQUNDRVNTX0lEX1csIHBhcm1fcHRyLCAwLCAiIik7CisgICAgICAgICAgICAgICAgaWYgKHJjIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBub21lbV9jbGVhbnVwOworICAgICAgICAgICAgICAgIHBhcm1fcHRyICs9IHJjOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5maWx0ZXJmaWVsZHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmMgPSBfYXBpX2NsaV9wb3B1bGF0ZV9wYXJtcyhvLCBncm91cCwgcywgQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCBwYXJtX3B0ciwgY21kX2ZsYWdzLCAiZmlsdGVyLiIpOworICAgICAgICAgICAgICAgIGlmIChyYyA8IDApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gbm9tZW1fY2xlYW51cDsKKyAgICAgICAgICAgICAgICBwYXJtX3B0ciArPSByYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuZmllbGRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gX2FwaV9jbGlfcG9wdWxhdGVfcGFybXMobywgZ3JvdXAsIHMsIGFjY2Vzc19sZXZlbCwgcGFybV9wdHIsIGNtZF9mbGFncywgIiIpOworICAgICAgICAgICAgICAgIGlmIChyYyA8IDApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gbm9tZW1fY2xlYW51cDsKKyAgICAgICAgICAgICAgICBwYXJtX3B0ciArPSByYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIENvbXBhY3Qgc3ViX3NlbGVjdG9yIGVudW0uIFJlbW92ZXMgaG9sZXMgKHZhbHVlcyB3aXRob3V0IHBhcmFtZXRlciB0YWJsZSkgKi8KKyAgICAgICAgX2FwaV9jbGlfY29tcGFjdF9zZWxlY3RvcihzdWJfc2VsZWN0b3IsIHN1Ymdyb3VwX2NvdW50KTsKKworICAgICAgICAvKiBJZiB0aGUgZ3JvdXAgdHlwZSBkb2Vzbid0IHN1cHBvcnQgc3ViZ3JvdXBzLCByZW1vdmUgdGhlIHN1Ymdyb3VwIHBhcmFtIGVudHJ5ICovCisgICAgICAgIGlmIChncm91cCA9PSBCQ01PTFRfTUdUX0dST1VQX0NGRyB8fCBncm91cCA9PSBCQ01PTFRfTUdUX0dST1VQX1NUQVQgfHwgZ3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRykKKyAgICAgICAgeworICAgICAgICAgICAgLyogRnJlZSB0aGUgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgKHNpbmdsZSkgc3ViZ3JvdXAgcGFyYW0gKi8KKyAgICAgICAgICAgIGJjbW9zX2ZyZWUoQVBJQ0xJX0NBU1RfRElTQ0FSRF9DT05TVChvYmpfc2VsZWN0b3Jbbl9vYmpdLnBhcm1zWzBdLm5hbWUsIHZvaWQgKikpOworICAgICAgICAgICAgYmNtb3NfZnJlZShBUElDTElfQ0FTVF9ESVNDQVJEX0NPTlNUKG9ial9zZWxlY3RvcltuX29ial0ucGFybXNbMF0uZGVzY3JpcHRpb24sIHZvaWQgKikpOworICAgICAgICAgICAgYmNtb3NfZnJlZShvYmpfc2VsZWN0b3Jbbl9vYmpdLnBhcm1zKTsKKyAgICAgICAgICAgIC8qIEFzc2lnbiB0aGUgc3ViZ3JvdXAgcGFyYW1zIHRvIHRoZSByb290IG9iamVjdCBwYXJhbXMgKi8KKyAgICAgICAgICAgIG9ial9zZWxlY3RvcltuX29ial0ucGFybXMgPSBzdWJfc2VsZWN0b3JbMF0ucGFybXM7CisgICAgICAgICAgICBiY21vc19mcmVlKHN1Yl9zZWxlY3Rvcik7CisgICAgICAgIH0KKworICAgICAgICArK25fb2JqOyAvKiBudW1iZXIgb2YgY29uZmlndXJlZCBvYmplY3RzICovCisgICAgfQorCisgICAgLyogQ29tcGFjdCBvYmpfc2VsZWN0b3IgZW51bS4gUmVtb3ZlcyBob2xlcyAodmFsdWVzIHdpdGhvdXQgcGFyYW1ldGVyIHRhYmxlKSAqLworICAgIF9hcGlfY2xpX2NvbXBhY3Rfc2VsZWN0b3Iob2JqX3NlbGVjdG9yLCBCQ01PTFRfT0JKX0lEX19OVU1fT0YpOworCisgICAgLyogQWRkIGEgJ2NsZWFyIG9uIHJlYWQnIHRvIHN0YXRzIGdyb3VwICovCisgICAgaWYgKGdyb3VwID09IEJDTU9MVF9NR1RfR1JPVVBfU1RBVCkKKyAgICB7CisgICAgICAgIGNtZF9wYXJtc1swXS50eXBlID0gQkNNQ0xJX1BBUk1fRU5VTTsKKyAgICAgICAgY21kX3Bhcm1zWzBdLmVudW1fdGFibGUgPSBib29sX2VudW07CisgICAgICAgIHJjID0gX2FwaV9jbGlfY29weV9wYXJtX25hbWUoJmNtZF9wYXJtc1swXSwgImNsZWFyIiwgImNsZWFyIG9uIHJlYWQiKTsKKyAgICAgICAgaWYgKHJjKQorICAgICAgICAgICAgZ290byBub21lbV9jbGVhbnVwOworICAgIH0KKworICAgIC8qIEFkZCAnbWF4IG51bWJlciBvZiBtZXNzYWdlcyB0byByZWFkJyBhbmQgJ2ludmVydCBmaWx0ZXInIHRvIGNmZyBnZXRfbXVsdGkgbXNncyAqLworICAgIGlmIChncm91cCA9PSBCQ01PTFRfTUdUX0dST1VQX0NGRyAmJiAoZmxhZ3MgJiBBUElfQ0xJX0ZMQUdTX01VTFRJKSAhPSBBUElfQ0xJX0ZMQUdTX05PTkUpCisgICAgeworICAgICAgICBjbWRfcGFybXNbMF0udHlwZSA9IEJDTUNMSV9QQVJNX1VOVU1CRVI7CisgICAgICAgIHJjID0gX2FwaV9jbGlfY29weV9wYXJtX25hbWUoJmNtZF9wYXJtc1swXSwgIm1heF9tc2dzIiwgIm1heCBudW1iZXIgb2YgQVBJIEdFVCBtZXNzYWdlcyB0byByZWNlaXZlIHBlciBjYWxsIik7CisgICAgICAgIGlmIChyYykKKyAgICAgICAgICAgIGdvdG8gbm9tZW1fY2xlYW51cDsKKworICAgICAgICBjbWRfcGFybXNbMV0udHlwZSA9IEJDTUNMSV9QQVJNX0VOVU07CisgICAgICAgIGNtZF9wYXJtc1sxXS5lbnVtX3RhYmxlID0gYm9vbF9lbnVtOworICAgICAgICByYyA9IF9hcGlfY2xpX2NvcHlfcGFybV9uYW1lKCZjbWRfcGFybXNbMV0sICJmaWx0ZXJfaW52ZXJ0IiwgImludmVydCBmaWx0ZXIgKHNlbGVjdCBvYmplY3RzIHRoYXQgZG9uJ3QgbWF0Y2gpIik7CisgICAgICAgIGlmIChyYykKKyAgICAgICAgICAgIGdvdG8gbm9tZW1fY2xlYW51cDsKKyAgICB9CisKKyAgICAvKiBXZSBhcmUgcmVhZHkgdG8gYWRkIHRoaXMgY29tbWFuZCAqLworICAgIGNtZF9wYXJtc1tudW1fY21kX3Bhcm1zIC0gMV0udHlwZSA9IEJDTUNMSV9QQVJNX0VOVU07CisgICAgY21kX3Bhcm1zW251bV9jbWRfcGFybXMgLSAxXS5mbGFncyA9IEJDTUNMSV9QQVJNX0ZMQUdfU0VMRUNUT1I7CisgICAgY21kX3Bhcm1zW251bV9jbWRfcGFybXMgLSAxXS5lbnVtX3RhYmxlID0gb2JqX3NlbGVjdG9yOworICAgIHJjID0gX2FwaV9jbGlfY29weV9wYXJtX25hbWUoJmNtZF9wYXJtc1tudW1fY21kX3Bhcm1zIC0gMV0sICJvYmplY3QiLCAiT2JqZWN0IFR5cGUiKTsKKyAgICBpZiAocmMpCisgICAgICAgIGdvdG8gbm9tZW1fY2xlYW51cDsKKyAgICByYyA9IGJjbWNsaV9jbWRfYWRkKGRpciwgY21kX25hbWUsIGNtZF9oYW5kbGVyLCBjbWRfZGVzY3IsCisgICAgICAgIChhY2Nlc3NfbGV2ZWwgPT0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1cpID8gQkNNQ0xJX0FDQ0VTU19BRE1JTiA6IEJDTUNMSV9BQ0NFU1NfR1VFU1QsCisgICAgICAgICZjbWRfZXh0cmFzLCBjbWRfcGFybXMpOworICAgIGlmIChyYykKKyAgICAgICAgZ290byBub21lbV9jbGVhbnVwOworICAgIHJldHVybiAwOworCitub21lbV9jbGVhbnVwOgorICAgIGlmIChvYmpfc2VsZWN0b3IpCisgICAgeworICAgICAgICBmb3IgKG8gPSAwOyBvIDwgQkNNT0xUX09CSl9JRF9fTlVNX09GOyBvKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChvYmpfc2VsZWN0b3Jbb10ucGFybXMpCisgICAgICAgICAgICAgICAgX2FwaV9jbGlfZnJlZV9wYXJtcyhvYmpfc2VsZWN0b3Jbb10ucGFybXMpOworICAgICAgICB9CisgICAgICAgIGJjbW9zX2ZyZWUob2JqX3NlbGVjdG9yKTsKKyAgICB9CisgICAgYmNtb3NfZnJlZShjbWRfcGFybXMpOworICAgIHJldHVybiByYzsKK30KKworI2lmZGVmIEJDTV9TVUJTWVNURU1fSE9TVAorCisvKiBDdXJyZW50IGRldmljZSBjaGFuZ2UgaW5kaWNhdGlvbiAqLworc3RhdGljIHZvaWQgX2FwaV9jbGlfZGV2aWNlX2NoYW5nZV9pbmQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGJjbW9sdF9kZXZpZCBkZXYpCit7CisgICAgYXBpX2NsaV9zZXRfY29tbWFuZHMoc2Vzc2lvbik7Cit9CisKKyNpZmRlZiBMSU5VWF9VU0VSX1NQQUNFCisKK3N0YXRpYyBiY21jbGlfc2Vzc2lvbiAqX2FwaWNsaV9sb2c7CitzdGF0aWMgRklMRSAqX2FwaWNsaV9sb2dfZmlsZTsKKworc3RhdGljIGludCBfYXBpY2xpX2xvZ193cml0ZV9jYihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqYnVmLCB1aW50MzJfdCBzaXplKQoreworICAgIGlmIChfYXBpY2xpX2xvZ19maWxlID09IE5VTEwgfHwgYnVmID09IE5VTEwpCisgICAgICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOworICAgIGZ3cml0ZShidWYsIDEsIHNpemUsIF9hcGljbGlfbG9nX2ZpbGUpOworICAgIGZmbHVzaChfYXBpY2xpX2xvZ19maWxlKTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogRW5hYmxlL2Rpc2FibGUgQVBJIGxvZ2dpbmcKKyAqICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImZpbGUiLCAiTG9nIGZpbGUuIFVzZSBcIi1cIiB0byBkaXNhYmxlIGxvZ2dpbmciLCBCQ01DTElfUEFSTV9TVFJJTkcsIDApKTsKKyAqLworc3RhdGljIGJjbW9zX2Vycm5vIF9hcGljbGlfbG9nX2hhbmRsZXIoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICBjb25zdCBjaGFyICpmbmFtZSA9IHBhcm1bMF0udmFsdWUuc3RyaW5nOworICAgIGJjbWNsaV9zZXNzaW9uX3Bhcm0gc2Vzc2lvbl9wYXJhbXMgPQorICAgIHsKKyAgICAgICAgLndyaXRlID0gX2FwaWNsaV9sb2dfd3JpdGVfY2IsCisgICAgICAgIC5uYW1lID0gImFwaV9sb2ciCisgICAgfTsKKyAgICBiY21vc19lcnJubyByYzsKKyAgICB0aW1lX3Qgc3RhcnRfdGltZTsKKworICAgIC8qIENsb3NlIGV4aXN0aW5nIGxvZyBzZXNzaW9uIGlmIGFueSAqLworICAgIGlmIChfYXBpY2xpX2xvZykKKyAgICB7CisgICAgICAgIGJjbWNsaV9sb2dfc2V0KEJDTUNMSV9MT0dfTk9ORSwgTlVMTCk7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX2Nsb3NlKF9hcGljbGlfbG9nKTsKKyAgICAgICAgZmNsb3NlKF9hcGljbGlfbG9nX2ZpbGUpOworICAgICAgICBfYXBpY2xpX2xvZyA9IE5VTEw7CisgICAgICAgIF9hcGljbGlfbG9nX2ZpbGUgPSBOVUxMOworICAgIH0KKworICAgIGlmICghc3RyY21wKGZuYW1lLCAiLSIpKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKworICAgIC8qIFN0YXJ0aW5nIGEgbmV3IGxvZyBzZXNzaW9uICovCisgICAgX2FwaWNsaV9sb2dfZmlsZSA9IGZvcGVuKGZuYW1lLCAiYSIpOworICAgIGlmIChfYXBpY2xpX2xvZ19maWxlID09IE5VTEwpCisgICAgeworICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIkNhbid0IG9wZW4gZmlsZSAlcyBmb3IgbG9nZ2luZ1xuIiwgZm5hbWUpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKyAgICByYyA9IGJjbWNsaV9zZXNzaW9uX29wZW5fdXNlcigmc2Vzc2lvbl9wYXJhbXMsICZfYXBpY2xpX2xvZyk7CisgICAgaWYgKHJjKQorICAgIHsKKyAgICAgICAgZmNsb3NlKF9hcGljbGlfbG9nX2ZpbGUpOworICAgICAgICBfYXBpY2xpX2xvZ19maWxlID0gTlVMTDsKKyAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICJDYW4ndCBvcGVuIGxvZyBzZXNzaW9uLiBFcnJvciAlc1xuIiwgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKyAgICB0aW1lKCZzdGFydF90aW1lKTsKKyAgICBiY21jbGlfbG9nX3NldChCQ01DTElfTE9HX0NfQ09NTUVOVCwgX2FwaWNsaV9sb2cpOworICAgIGJjbWNsaV9sb2coIi8qIEFQSSBsb2dnaW5nIHNlc3Npb24gc3RhcnRlZC4gJXMgKi9cbiIsIGN0aW1lKCZzdGFydF90aW1lKSk7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisjZW5kaWYgLyogI2lmZGVmIExJTlVYX1VTRVJfU1BBQ0UgKi8KKworI2VuZGlmIC8qICNpZmRlZiBCQ01fU1VCU1lTVEVNX0hPU1QgKi8KKworc3RhdGljIHZvaWQgYXBpX2NsaV9maW5kX2RlbF9jbWQoYmNtY2xpX2VudHJ5ICpkaXIsIGNvbnN0IGNoYXIgKmNtZF9uYW1lKQoreworICAgIGJjbWNsaV9lbnRyeSAqY21kOworICAgIGNtZCA9IGJjbWNsaV9jbWRfZmluZChkaXIsIGNtZF9uYW1lKTsKKyAgICBpZiAoY21kKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Rva2VuX2Rlc3Ryb3koY21kKTsKKyAgICB9Cit9CisKKy8qIFVucmVnaXN0ZXJzIGNvbW1hbmRzIGFuZCBkaXJlY3RvcmllcyAqLworc3RhdGljIHZvaWQgYXBpX2NsaV9kZWxfY29tbWFuZHMoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2VudHJ5ICpkaXI7CisKKyAgICBkaXIgPSBiY21jbGlfZGlyX2ZpbmQoYXBpX3BhcmVudF9kaXIsICJhcGkiKTsKKyAgICBpZiAoIWRpcikKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYXBpX2NsaV9maW5kX2RlbF9jbWQoZGlyLCAic2V0Iik7CisgICAgYXBpX2NsaV9maW5kX2RlbF9jbWQoZGlyLCAiZ2V0Iik7CisgICAgYXBpX2NsaV9maW5kX2RlbF9jbWQoZGlyLCAibXVsdGlnZXQiKTsKKyAgICBhcGlfY2xpX2ZpbmRfZGVsX2NtZChkaXIsICJjbGVhciIpOworICAgIGFwaV9jbGlfZmluZF9kZWxfY21kKGRpciwgIm1vZGlmeSIpOworICAgIGFwaV9jbGlfZmluZF9kZWxfY21kKGRpciwgInN0YXQiKTsKKyAgICBhcGlfY2xpX2ZpbmRfZGVsX2NtZChkaXIsICJvcGVyIik7CisgICAgYXBpX2NsaV9maW5kX2RlbF9jbWQoZGlyLCAic2VuZCIpOworICAgIGFwaV9jbGlfZmluZF9kZWxfY21kKGRpciwgInNhc2V0Iik7CisgICAgYXBpX2NsaV9maW5kX2RlbF9jbWQoZGlyLCAic2FnZXQiKTsKKyAgICBhcGlfY2xpX2ZpbmRfZGVsX2NtZChkaXIsICJhY3NldCIpOworICAgIGFwaV9jbGlfZmluZF9kZWxfY21kKGRpciwgImFjZ2V0Iik7CisgICAgYXBpX2NsaV9maW5kX2RlbF9jbWQoZGlyLCAib2JqZWN0cyIpOworI2lmZGVmIEJDTV9TVUJTWVNURU1fSE9TVAorICAgIGFwaV9jbGlfZmluZF9kZWxfY21kKGRpciwgImxvZyIpOworI2VuZGlmCit9CisKKy8qIFJlZ2lzdGVycyBjb21tYW5kcyBhbmQgZGlyZWN0b3JpZXMgKi8KK3N0YXRpYyBiY21vc19lcnJubyBhcGlfY2xpX2FkZF9jb21tYW5kcyhiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfZW50cnkgKmFwaV9kaXI7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICBpZiAoKGFwaV9kaXIgPSBiY21jbGlfZGlyX2ZpbmQoYXBpX3BhcmVudF9kaXIsICJhcGkiKSkgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGFwaV9kaXIgPSBiY21jbGlfZGlyX2FkZChhcGlfcGFyZW50X2RpciwgImFwaSIsICJNYXBsZSBBUEkiLCBCQ01DTElfQUNDRVNTX0dVRVNULCBOVUxMKTsKKyAgICAgICAgaWYgKGFwaV9kaXIgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIkNhbid0IGNyZWF0ZSBhcGkgZGlyZWN0b3J5XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICB9CisgICAgfQorCisgICAgY3VycmVudF9zZXNzaW9uID0gc2Vzc2lvbjsKKyAgICBiY21vbHRfc3lzdGVtX21vZGVfZ2V0KGN1cnJlbnRfZGV2aWNlLCAmY3VycmVudF9zeXN0ZW1fbW9kZSk7CisKKyAgICAvKiBOb3cgZ2VuZXJhdGUgYW5kIGFkZCBjb21tYW5kcyAqLworICAgIHJjID0gX2FwaV9jbGlfYWRkKGFwaV9kaXIsICJzZXQiLCAiU2V0IG9iamVjdCBjb25maWd1cmF0aW9uIiwgQkNNT0xUX01HVF9HUk9VUF9DRkcsCisgICAgICAgIEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9XLCBfYXBpY2xpX3NldF9oYW5kbGVyLCBBUElfQ0xJX0ZMQUdTX05PTkUpOworICAgIHJjID0gcmMgPyByYyA6IF9hcGlfY2xpX2FkZChhcGlfZGlyLCAiZ2V0IiwgIkdldCBvYmplY3QgY29uZmlndXJhdGlvbiIsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLAorICAgICAgICBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgX2FwaWNsaV9nZXRfaGFuZGxlciwgQVBJX0NMSV9GTEFHU19OT05FKTsKKyAgICByYyA9IHJjID8gcmMgOiBfYXBpX2NsaV9hZGQoYXBpX2RpciwgImNsZWFyIiwgIkNsZWFyIG9iamVjdCBjb25maWd1cmF0aW9uIiwgQkNNT0xUX01HVF9HUk9VUF9DRkcsCisgICAgICAgIEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCBfYXBpY2xpX2NsZWFyX2hhbmRsZXIsIEFQSV9DTElfRkxBR1NfSUdOT1JFX0ZJRUxEUyk7CisgICAgcmMgPSByYyA/IHJjIDogX2FwaV9jbGlfYWRkKGFwaV9kaXIsICJzdGF0IiwgIkdldCBzdGF0aXN0aWNzIiwgQkNNT0xUX01HVF9HUk9VUF9TVEFULCBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwKKyAgICAgICAgX2FwaWNsaV9zdGF0X2hhbmRsZXIsIEFQSV9DTElfRkxBR1NfTk9ORSk7CisgICAgcmMgPSByYyA/IHJjIDogX2FwaV9jbGlfYWRkKGFwaV9kaXIsICJvcGVyIiwgIkluaXRpYXRlIE9wZXJhdGlvbiIsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwKKyAgICAgICAgQkNNT0xUX1BST1BfQUNDRVNTX0lEX1csIF9hcGljbGlfb3Blcl9oYW5kbGVyLCBBUElfQ0xJX0ZMQUdTX05PTkUpOworICAgIHJjID0gcmMgPyByYyA6IF9hcGlfY2xpX2FkZChhcGlfZGlyLCAic2VuZCIsICJTZW5kIG1lc3NhZ2UgdG8gT05VIiwgQkNNT0xUX01HVF9HUk9VUF9QUk9YWSwKKyAgICAgICAgQkNNT0xUX1BST1BfQUNDRVNTX0lEX1csIF9hcGljbGlfc2VuZF9oYW5kbGVyLCBBUElfQ0xJX0ZMQUdTX05PTkUpOworICAgIHJjID0gcmMgPyByYyA6IF9hcGlfY2xpX2FkZChhcGlfZGlyLCAic2FzZXQiLCAiU2V0IHN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uIiwKKyAgICAgICAgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgQkNNT0xUX1BST1BfQUNDRVNTX0lEX1csIF9hcGljbGlfc3RhdF9jZmdfc2V0X2hhbmRsZXIsIEFQSV9DTElfRkxBR1NfTk9ORSk7CisgICAgcmMgPSByYyA/IHJjIDogX2FwaV9jbGlfYWRkKGFwaV9kaXIsICJzYWdldCIsICJHZXQgc3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24iLAorICAgICAgICBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHLCBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgX2FwaWNsaV9zdGF0X2NmZ19nZXRfaGFuZGxlciwgQVBJX0NMSV9GTEFHU19JR05PUkVfRklFTERTKTsKKyAgICByYyA9IHJjID8gcmMgOiBfYXBpX2NsaV9hZGQoYXBpX2RpciwgImFjc2V0IiwgIlNldCBhdXRvbm9tb3VzIG1lc3NhZ2UgY29uZmlndXJhdGlvbiIsCisgICAgICAgIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9XLCBfYXBpY2xpX2F1dG9fY2ZnX3NldF9oYW5kbGVyLCBBUElfQ0xJX0ZMQUdTX05PTkUpOworICAgIHJjID0gcmMgPyByYyA6IF9hcGlfY2xpX2FkZChhcGlfZGlyLCAiYWNnZXQiLCAiR2V0IGF1dG9ub21vdXMgbWVzc2FnZSBjb25maWd1cmF0aW9uIiwKKyAgICAgICAgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIF9hcGljbGlfYXV0b19jZmdfZ2V0X2hhbmRsZXIsIEFQSV9DTElfRkxBR1NfTk9ORSk7CisgICAgcmMgPSByYyA/IHJjIDogX2FwaV9jbGlfYWRkKGFwaV9kaXIsICJtdWx0aWdldCIsICJHZXQgY29uZmlndXJhdGlvbiBmb3IgbXVsdGlwbGUgb2JqZWN0cyIsCisgICAgICAgIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgX2FwaWNsaV9hdXRvX2NmZ19nZXRfbXVsdGlfaGFuZGxlciwgQVBJX0NMSV9GTEFHU19NVUxUSSk7CisKKyAgICAvKiBMaXN0IGFsbCBzeXN0ZW0gb2JqZWN0cyAqLworICAgIHJjID0gcmMgPyByYyA6IGJjbWNsaV9jbWRfYWRkKGFwaV9kaXIsICJvYmplY3RzIiwgX2FwaWNsaV9vYmplY3RzX2hhbmRsZXIsCisgICAgICAgICJPYmplY3QgVHlwZXMiLCBCQ01DTElfQUNDRVNTX0dVRVNULCBOVUxMLCBOVUxMKTsKKworI2lmIGRlZmluZWQoQkNNX1NVQlNZU1RFTV9IT1NUKSAmJiBkZWZpbmVkKExJTlVYX1VTRVJfU1BBQ0UpCisgICAgQkNNQ0xJX01BS0VfQ01EKGFwaV9kaXIsICJsb2ciLCAiTG9nIEFQSSBjYWxscyIsIF9hcGljbGlfbG9nX2hhbmRsZXIsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImZpbGUiLCAiTG9nIGZpbGUuIFVzZSBcIi1cIiB0byBkaXNhYmxlIGxvZ2dpbmciLCBCQ01DTElfUEFSTV9TVFJJTkcsIDApKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIHJjOworfQorCisvKiBVcGRhdGUgQVBJIENMSSBjb21tYW5kcyBmb3IgdGhlIGN1cnJlbnQgZGV2aWNlICovCitiY21vc19lcnJubyBhcGlfY2xpX3NldF9jb21tYW5kcyhiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBhcGlfY2xpX2RlbF9jb21tYW5kcyhzZXNzaW9uKTsKKyAgICByYyA9IGFwaV9jbGlfYWRkX2NvbW1hbmRzKHNlc3Npb24pOworICAgIHJldHVybiByYzsKK30KKworLyogSW5pdCBBUEkgQ0xJIGNvbW1hbmRzIGZvciB0aGUgY3VycmVudCBkZXZpY2UgKi8KK2JjbW9zX2Vycm5vIGFwaV9jbGlfaW5pdChiY21jbGlfZW50cnkgKnBhcmVudF9kaXIsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgYXBpX3BhcmVudF9kaXIgPSBwYXJlbnRfZGlyOworCisgICAgcmMgPSBhcGlfY2xpX3NldF9jb21tYW5kcyhzZXNzaW9uKTsKKworI2lmZGVmIEJDTV9TVUJTWVNURU1fSE9TVAorICAgIC8qIFN1YnNjcmliZSBmb3IgZGV2aWNlIGNoYW5nZSBpbmRpY2F0aW9uICovCisgICAgcmMgPSByYyA/IHJjIDogYmNtb2x0X2Rldl9zZWxfaW5kX3JlZ2lzdGVyKF9hcGlfY2xpX2RldmljZV9jaGFuZ2VfaW5kKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2FwaV9jbGkvYmNtX2FwaV9jbGkuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfY2xpL2JjbV9hcGlfY2xpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI5ZGY1NwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfY2xpL2JjbV9hcGlfY2xpLmgKQEAgLTAsMCArMSw0OSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBNQVBMRV9DTElfQVBJX0hfCisjZGVmaW5lIE1BUExFX0NMSV9BUElfSF8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaW5jbHVkZSA8YmNtb2x0X21zZy5oPgorCisvKiBJbml0aWFsaXplIEFQSSBDTEkgKi8KK2JjbW9zX2Vycm5vIGFwaV9jbGlfaW5pdChiY21jbGlfZW50cnkgKnBhcmVudF9kaXIsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKTsKKworLyogVXBkYXRlIEFQSSBDTEkgY29tbWFuZHMgZm9yIHRoZSBjdXJyZW50IGRldmljZSAqLworYmNtb3NfZXJybm8gYXBpX2NsaV9zZXRfY29tbWFuZHMoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogTUFQTEVfQ0xJX0FQSV9IXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2FwaV9jbGkvYmNtX2FwaV9jbGlfZHVtcC5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2FwaV9jbGkvYmNtX2FwaV9jbGlfZHVtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NmRiMjYKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvYXBpX2NsaS9iY21fYXBpX2NsaV9kdW1wLmMKQEAgLTAsMCArMSw5NTQgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21vbHRfbXNnLmg+CisjaW5jbHVkZSA8YmNtY2xpLmg+CisKKyNpbmNsdWRlICJiY21fYXBpX2NsaV9oZWxwZXJzLmgiCisKK3R5cGVkZWYgZW51bQoreworICAgIEFQSUNMSV9PVVRQVVRfU1RZTEVfU1RELAorICAgIEFQSUNMSV9PVVRQVVRfU1RZTEVfQ19JTklUCit9IGFwaWNsaV9vdXRwdXRfc3R5bGU7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgY29uc3QgYmNtY2xpX3R5cGVfZGVzY3IgKnR5cGU7CisgICAgdm9pZCAqZGF0YTsKKyAgICB1aW50OF90IGJpdDsKK30gYXBpY2xpX3ByZXNlbmNlX21hc2tfaW5mbzsKKworc3RhdGljIGJjbW9zX2Vycm5vIF9hcGljbGlfZHVtcF9hcnJheSgKKyAgICBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwKKyAgICBjb25zdCBiY21jbGlfdHlwZV9kZXNjciAqdGQsCisgICAgdm9pZCAqZGF0YSwKKyAgICB1aW50MzJfdCBzaXplLAorICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgYXBpY2xpX291dHB1dF9zdHlsZSBzdHlsZSwKKyAgICBjb25zdCBhcGljbGlfcHJlc2VuY2VfbWFza19pbmZvICpwcmVzZW5jZV9tYXNrLAorICAgIGNvbnN0IGNoYXIgKnByZWZpeCwKKyAgICBjb25zdCBjaGFyICpzdWZmaXgpOworCitzdGF0aWMgYmNtb3NfZXJybm8gX2FwaWNsaV9yZWFkX3NudW0oYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV90eXBlX2Rlc2NyICp0ZCwgdm9pZCAqZGF0YSwgaW50NjRfdCAqbikKK3sKKyAgICBzd2l0Y2ggKHRkLT5zaXplKQorICAgIHsKKyAgICBjYXNlIDE6CisgICAgeworICAgICAgICBpbnQ4X3QgbjEgPSAqKGludDhfdCAqKWRhdGE7CisgICAgICAgICpuID0gbjE7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIDI6CisgICAgeworICAgICAgICBpbnQxNl90IG4yID0gKihpbnQxNl90ICopZGF0YTsKKyAgICAgICAgKm4gPSBuMjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgNDoKKyAgICB7CisgICAgICAgIGludDMyX3QgbjQgPSAqKGludDMyX3QgKilkYXRhOworICAgICAgICAqbiA9IG40OworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSA4OgorICAgIHsKKyAgICAgICAgbWVtY3B5KG4sIGRhdGEsIHNpemVvZigqbikpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIqKiogbnVtYmVyIHNpemUgJXUgaXMgbm90IHN1cHBvcnRlZFxuIiwgdGQtPnNpemUpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworICAgIH0KKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9hcGljbGlfcmVhZF91bnVtKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfdHlwZV9kZXNjciAqdGQsIHZvaWQgKmRhdGEsIHVpbnQ2NF90ICpuKQoreworICAgIHN3aXRjaCAodGQtPnNpemUpCisgICAgeworICAgIGNhc2UgMToKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgbjEgPSAqKHVpbnQ4X3QgKilkYXRhOworICAgICAgICAqbiA9IG4xOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAyOgorICAgIHsKKyAgICAgICAgdWludDE2X3QgbjIgPSAqKHVpbnQxNl90ICopZGF0YTsKKyAgICAgICAgKm4gPSBuMjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgNDoKKyAgICB7CisgICAgICAgIHVpbnQzMl90IG40ID0gKih1aW50MzJfdCAqKWRhdGE7CisgICAgICAgICpuID0gbjQ7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIDg6CisgICAgeworICAgICAgICBtZW1jcHkobiwgZGF0YSwgc2l6ZW9mKCpuKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIioqKiBudW1iZXIgc2l6ZSAldSBpcyBub3Qgc3VwcG9ydGVkXG4iLCB0ZC0+c2l6ZSk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisgICAgfQorICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgdm9pZCBfYXBpY2xpX3N0cmNhdF91cHBlcihjaGFyICpkZXN0LCB1aW50MzJfdCBkZXN0X2xlbiwgY29uc3QgY2hhciAqc3JjLCB1aW50MzJfdCBzcmNfbGVuKQoreworICAgIHVpbnQzMl90IHNyY19pZHg7CisgICAgdWludDMyX3QgZGVzdF9pZHg7CisKKyAgICBmb3IgKGRlc3RfaWR4ID0gMDsgZGVzdF9pZHggPCBkZXN0X2xlbiAtIDE7ICsrZGVzdF9pZHgpCisgICAgeworICAgICAgICBpZiAoZGVzdFtkZXN0X2lkeF0gPT0gJ1wwJykKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKHNyY19pZHggPSAwOyBzcmNfaWR4IDwgc3JjX2xlbiAmJiBkZXN0X2lkeCA8IGRlc3RfbGVuIC0gMTsgKytzcmNfaWR4LCArK2Rlc3RfaWR4KQorICAgIHsKKyAgICAgICAgZGVzdFtkZXN0X2lkeF0gPSBzcmNbc3JjX2lkeF07CisgICAgICAgIGlmIChkZXN0W2Rlc3RfaWR4XSA+PSAnYScgJiYgZGVzdFtkZXN0X2lkeF0gPD0gJ3onKQorICAgICAgICB7CisgICAgICAgICAgICBkZXN0W2Rlc3RfaWR4XSA9ICdBJyArIChkZXN0W2Rlc3RfaWR4XSAtICdhJyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkZXN0W2Rlc3RfaWR4XSA9ICdcMCc7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpfYXBpY2xpX2dldF9jX2VudW1faWQoY29uc3QgYmNtY2xpX3R5cGVfZGVzY3IgKnRkLCBjb25zdCBjaGFyICpuYW1lKQoreworICAgIHN0YXRpYyBjaGFyIGZ1bGxfbmFtZV9idWZbMjU2XTsKKyAgICBmdWxsX25hbWVfYnVmWzBdID0gJ1wwJzsKKyAgICBfYXBpY2xpX3N0cmNhdF91cHBlcihmdWxsX25hbWVfYnVmLCBzaXplb2YoZnVsbF9uYW1lX2J1ZiksIHRkLT5uYW1lLCBzdHJsZW4odGQtPm5hbWUpKTsKKyAgICBfYXBpY2xpX3N0cmNhdF91cHBlcihmdWxsX25hbWVfYnVmLCBzaXplb2YoZnVsbF9uYW1lX2J1ZiksICJfIiwgMSk7CisgICAgX2FwaWNsaV9zdHJjYXRfdXBwZXIoZnVsbF9uYW1lX2J1Ziwgc2l6ZW9mKGZ1bGxfbmFtZV9idWYpLCBuYW1lLCBzdHJsZW4obmFtZSkpOworICAgIHJldHVybiBmdWxsX25hbWVfYnVmOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2FwaWNsaV9kdW1wX3NpbXBsZV9kYXRhX3R5cGUoCisgICAgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sCisgICAgY29uc3QgYmNtY2xpX3R5cGVfZGVzY3IgKnRkLAorICAgIHZvaWQgKmRhdGEsCisgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICBhcGljbGlfb3V0cHV0X3N0eWxlIHN0eWxlKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIHN3aXRjaCAodGQtPmJhc2VfdHlwZSkKKyAgICB7CisgICAgY2FzZSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NOVU06ICAgICAgIC8qIHNpZ25lZCBudW1iZXIgKi8KKyAgICB7CisgICAgICAgIGludDY0X3QgbiA9IDA7CisgICAgICAgIHJjID0gX2FwaWNsaV9yZWFkX3NudW0oc2Vzc2lvbiwgdGQsIGRhdGEsICZuKTsKKyAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIlbGxkIiwgKGxvbmcgbG9uZyluKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBCQ01PTFRfQkFTRV9UWVBFX0lEX1VOVU06ICAgICAgIC8qIHVuc2lnbmVkIG51bWJlciAqLworICAgIHsKKyAgICAgICAgdWludDY0X3QgbiA9IDA7CisgICAgICAgIHJjID0gX2FwaWNsaV9yZWFkX3VudW0oc2Vzc2lvbiwgdGQsIGRhdGEsICZuKTsKKyAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIlbGx1IiwgKHVuc2lnbmVkIGxvbmcgbG9uZyluKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBCQ01PTFRfQkFTRV9UWVBFX0lEX1VOVU1fSEVYOiAgIC8qIHVuc2lnbmVkIG51bWJlciBwcmludGVkIGluIGhleCAqLworICAgIHsKKyAgICAgICAgdWludDY0X3QgbiA9IDA7CisgICAgICAgIHJjID0gX2FwaWNsaV9yZWFkX3VudW0oc2Vzc2lvbiwgdGQsIGRhdGEsICZuKTsKKyAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIweCVsbHgiLCAodW5zaWduZWQgbG9uZyBsb25nKW4pOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfRkxPQVQ6ICAgICAgLyogZmxvYXRpbmctcG9pbnQgbnVtYmVyICovCisgICAgeworICAgICAgICBpZiAodGQtPnNpemUgPT0gc2l6ZW9mKGZsb2F0KSkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIlZiIsICooZmxvYXQgKilkYXRhKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0ZC0+c2l6ZSA9PSBzaXplb2YoZG91YmxlKSkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIlZiIsICooZG91YmxlICopZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIioqKiBmbG9hdGluZy1wb2ludCBudW1iZXIgb2Ygd2lkdGggJXUgaXMgbm90IHN1cHBvcnRlZFxuIiwgdGQtPnNpemUpOworICAgICAgICAgICAgcmMgPSBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBCQ01PTFRfQkFTRV9UWVBFX0lEX0JPT0w6CisgICAgeworICAgICAgICBjb25zdCBjaGFyICpub19zdHIgPSBzdHlsZSA9PSBBUElDTElfT1VUUFVUX1NUWUxFX0NfSU5JVCA/ICJCQ01PU19GQUxTRSIgOiAibm8iOworICAgICAgICBjb25zdCBjaGFyICp5ZXNfc3RyID0gc3R5bGUgPT0gQVBJQ0xJX09VVFBVVF9TVFlMRV9DX0lOSVQgPyAiQkNNT1NfVFJVRSIgOiAieWVzIjsKKyAgICAgICAgdWludDY0X3QgbiA9IDA7CisgICAgICAgIHJjID0gX2FwaWNsaV9yZWFkX3VudW0oc2Vzc2lvbiwgdGQsIGRhdGEsICZuKTsKKyAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIlcyIsIG4gPT0gMCA/IG5vX3N0ciA6IHllc19zdHIpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSSU5HOiAgICAgLyogc3RyaW5nICovCisgICAgeworICAgICAgICBpZiAodGQtPnNpemUgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICJcIiVzXCIiLCAoY2hhciAqKWRhdGEpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogd2Uga25vdyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyICovCisgICAgICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIlwiJS4qc1wiIiwgdGQtPnNpemUsIChjaGFyICopZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBCQ01PTFRfQkFTRV9UWVBFX0lEX0lQVjQ6ICAgICAgIC8qIElQdjQgYWRkcmVzcyAqLworICAgIHsKKyAgICAgICAgdWludDMyX3QgaXA7CisgICAgICAgIG1lbWNweSgmaXAsIGRhdGEsIHNpemVvZihpcCkpOworICAgICAgICBiY21jbGlfcHJpbnQoCisgICAgICAgICAgICBzZXNzaW9uLAorICAgICAgICAgICAgc3R5bGUgPT0gQVBJQ0xJX09VVFBVVF9TVFlMRV9DX0lOSVQgPyAieyAlZCwlZCwlZCwlZCB9IiA6ICIlZC4lZC4lZC4lZCIsCisgICAgICAgICAgICAoaXAgPj4gMjQpICYgMHhmZiwgKGlwID4+IDE2KSAmIDB4ZmYsIChpcCA+PiA4KSAmIDB4ZmYsIGlwICYgMHhmZik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgQkNNT0xUX0JBU0VfVFlQRV9JRF9NQUM6ICAgICAgICAvKiBNQUMgYWRkcmVzcyAqLworICAgIHsKKyAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgbWFjOworICAgICAgICBtZW1jcHkobWFjLnU4LCBkYXRhLCBzaXplb2YobWFjLnU4KSk7CisgICAgICAgIGJjbWNsaV9wcmludCgKKyAgICAgICAgICAgIHNlc3Npb24sCisgICAgICAgICAgICBzdHlsZSA9PSBBUElDTElfT1VUUFVUX1NUWUxFX0NfSU5JVCA/CisgICAgICAgICAgICAgICAgInt7IDB4JTAyeCwweCUwMngsMHglMDJ4LDB4JTAyeCwweCUwMngsMHglMDJ4IH19IiA6CisgICAgICAgICAgICAgICAgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IiwKKyAgICAgICAgICAgIG1hYy51OFswXSwgbWFjLnU4WzFdLCBtYWMudThbMl0sIG1hYy51OFszXSwgbWFjLnU4WzRdLCBtYWMudThbNV0pOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTTogICAgICAgLyogZW51bSAqLworICAgIHsKKyAgICAgICAgdWludDY0X3QgbiA9IDA7CisgICAgICAgIGNvbnN0IGNoYXIgKnM7CisgICAgICAgIHJjID0gX2FwaWNsaV9yZWFkX3VudW0oc2Vzc2lvbiwgdGQsIGRhdGEsICZuKTsKKyAgICAgICAgQlVHX09OKHRkLT54LmUgPT0gTlVMTCk7CisgICAgICAgIHMgPSBiY21jbGlfZW51bV9zdHJpbmd2YWwodGQtPnguZSwgKGxvbmcpbik7CisgICAgICAgIGlmIChzdHlsZSA9PSBBUElDTElfT1VUUFVUX1NUWUxFX0NfSU5JVCkKKyAgICAgICAgeworICAgICAgICAgICAgcyA9IF9hcGljbGlfZ2V0X2NfZW51bV9pZCh0ZCwgcyk7CisgICAgICAgIH0KKyAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIlcyIsIHMpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTV9NQVNLOgorICAgIHsKKyAgICAgICAgdWludDY0X3QgbiA9IDA7CisgICAgICAgIGNvbnN0IGNoYXIgKnM7CisgICAgICAgIGNvbnN0IGNoYXIgKm5vbmUgPSBOVUxMOworICAgICAgICBiY21jbGlfZW51bV92YWwgKnZhbHVlID0gdGQtPnguZTsKKyAgICAgICAgYmNtb3NfYm9vbCBmaXJzdCA9IEJDTU9TX1RSVUU7CisgICAgICAgIEJVR19PTih2YWx1ZSA9PSBOVUxMKTsKKyAgICAgICAgcmMgPSBfYXBpY2xpX3JlYWRfdW51bShzZXNzaW9uLCB0ZCwgZGF0YSwgJm4pOworICAgICAgICB3aGlsZSAodmFsdWUtPm5hbWUgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHZhbHVlLT52YWwgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBub25lID0gdmFsdWUtPm5hbWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHZhbHVlLT52YWwgJiBuKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHMgPSB2YWx1ZS0+bmFtZTsKKyAgICAgICAgICAgICAgICBpZiAoc3R5bGUgPT0gQVBJQ0xJX09VVFBVVF9TVFlMRV9DX0lOSVQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzID0gX2FwaWNsaV9nZXRfY19lbnVtX2lkKHRkLCBzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIlcyVzIiwgZmlyc3QgPyAiIiA6IChzdHlsZSA9PSBBUElDTElfT1VUUFVUX1NUWUxFX0NfSU5JVCA/ICJ8IiA6IEJDTUNMSV9FTlVNX01BU0tfREVMX1NUUiksIHMpOworICAgICAgICAgICAgICAgIGZpcnN0ID0gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgbiAtPSB2YWx1ZS0+dmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKyt2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiJXMiLCAoc3R5bGUgPT0gQVBJQ0xJX09VVFBVVF9TVFlMRV9DX0lOSVQpIHx8IChOVUxMID09IG5vbmUpID8gIjAiIDogbm9uZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIqKiogdHlwZSAlZCBpcyBub3Qgc3VwcG9ydGVkXG4iLCAoaW50KXRkLT5iYXNlX3R5cGUpOworICAgICAgICByYyA9IEJDTV9FUlJfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworCisvKiBjYWxjdWxhdGUgbnVtYmVyIG9mIGVudW0gdmFsdWVzICovCitzdGF0aWMgaW50IF9hcGlfY2xpX2dldF9udW1fZW51bV92YWxzKGNvbnN0IGJjbWNsaV9lbnVtX3ZhbCAqdmFscykKK3sKKyAgICBjb25zdCBiY21jbGlfZW51bV92YWwgKnYgPSB2YWxzOworICAgIHdoaWxlICh2ICYmIHYtPm5hbWUpCisgICAgeworICAgICAgICArK3Y7CisgICAgfQorICAgIHJldHVybiAodiAtIHZhbHMpOworfQorCisvKiBoZWxwZXIgZnVuY3Rpb24gdG8gc2tpcCB0aGUgInUuIiBpbiBmcm9udCBvZiB1bmlvbiBmaWVsZCBuYW1lcyAqLworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpfYXBpY2xpX3NraXBfdW5pb25fcHJlZml4KGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgaWYgKG5hbWVbMF0gPT0gJ3UnICYmIG5hbWVbMV0gPT0gJy4nKQorICAgIHsKKyAgICAgICAgbmFtZSArPSAyOworICAgIH0KKyAgICByZXR1cm4gbmFtZTsKK30KKworc3RhdGljIGJjbW9zX2Jvb2wgX2FwaWNsaV9pc192YWx1ZV9zZXQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGFwaWNsaV9wcmVzZW5jZV9tYXNrX2luZm8gKnByZXNlbmNlX21hc2spCit7CisgICAgdWludDY0X3QgcG1fdmFsdWVfbnVtID0gMDsKKyAgICBpZiAoIXByZXNlbmNlX21hc2sgfHwgIXByZXNlbmNlX21hc2stPnR5cGUpCisgICAgeworICAgICAgICAvKiBubyBwcmVzZW5jZSBtYXNrIC0gYWxsIHZhbHVlcyBhcmUgaW1wbGljaXRseSBzZXQgKi8KKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorICAgIF9hcGljbGlfcmVhZF91bnVtKHNlc3Npb24sIHByZXNlbmNlX21hc2stPnR5cGUsIHByZXNlbmNlX21hc2stPmRhdGEsICZwbV92YWx1ZV9udW0pOworICAgIHJldHVybiAoKHBtX3ZhbHVlX251bSA+PiBwcmVzZW5jZV9tYXNrLT5iaXQpICYgMSkgIT0gMDsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9hcGljbGlfYXJyX2R5bl9sZW5fZ2V0KGNvbnN0IGJjbWNsaV90eXBlX2Rlc2NyICp0ZCwgdm9pZCAqZGF0YSwgdWludDMyX3QgKmFycmF5X3NpemUpCit7CisgICAgc3dpdGNoICh0ZC0+eC5hcnJfZHluLmxlbl9zaXplKQorICAgIHsKKyAgICBjYXNlIDE6ICphcnJheV9zaXplID0gKih1aW50OF90ICopZGF0YTsgYnJlYWs7CisgICAgY2FzZSAyOiAqYXJyYXlfc2l6ZSA9ICoodWludDE2X3QgKilkYXRhOyBicmVhazsKKyAgICBjYXNlIDQ6ICphcnJheV9zaXplID0gKih1aW50MzJfdCAqKWRhdGE7IGJyZWFrOworICAgIGRlZmF1bHQ6IHJldHVybiBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyB2b2lkICpfYXBpY2xpX2Fycl9keW5fZGF0YV9nZXQoY29uc3QgYmNtY2xpX3R5cGVfZGVzY3IgKnRkLCB2b2lkICpkYXRhKQoreworICAgIHJldHVybiAqKHZvaWQqKilCQ01PU19ST1VORF9VUCgobG9uZylkYXRhICsgdGQtPnguYXJyX2R5bi5sZW5fc2l6ZSwgc2l6ZW9mKHZvaWQgKikpOworfQorCisvKiBEdW1wIGRhdGEgdHlwZSAqLworc3RhdGljIGJjbW9zX2Vycm5vIF9hcGljbGlfZHVtcF9kYXRhX3R5cGUoCisgICAgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sCisgICAgY29uc3QgYmNtY2xpX3R5cGVfZGVzY3IgKnRkLAorICAgIHZvaWQgKmRhdGEsCisgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICB1aW50MzJfdCBudW1fZW50cmllcywKKyAgICB1aW50MzJfdCBlbnRyeV9zaXplLAorICAgIGFwaWNsaV9vdXRwdXRfc3R5bGUgc3R5bGUsCisgICAgY29uc3QgYXBpY2xpX3ByZXNlbmNlX21hc2tfaW5mbyAqcHJlc2VuY2VfbWFzaywKKyAgICBjb25zdCBjaGFyICpwcmVmaXgsCisgICAgY29uc3QgY2hhciAqc3VmZml4KQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIHN3aXRjaCAodGQtPmJhc2VfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1Q6CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGY7CisgICAgICAgICAgICBjaGFyIGZ1bGxfbmFtZVtBUElDTElfTUFYX1BBUk1fTkFNRV9MRU5HVEhdOworICAgICAgICAgICAgaWYgKCF0ZC0+eC5zLm51bV9maWVsZHMpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBCVUdfT04oIXRkLT54LnMuZmllbGRzKTsKKyAgICAgICAgICAgIGlmIChzdHlsZSA9PSBBUElDTElfT1VUUFVUX1NUWUxFX0NfSU5JVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgInsgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGYgPSAwOyBmIDwgdGQtPngucy5udW1fZmllbGRzOyBmKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgYmNtY2xpX2ZpZWxkX2Rlc2NyICpmbGQgPSAmdGQtPngucy5maWVsZHNbZl07CisgICAgICAgICAgICAgICAgdm9pZCAqZmRhdGEgPSAodm9pZCAqKSgobG9uZylkYXRhICsgZmxkLT5vZmZzZXQpOworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmVzZW5jZV9tYXNrX2luZm8gZmllbGRfcG0gPSB7fTsKKyAgICAgICAgICAgICAgICBpZiAoKCh0ZC0+eC5zLmZpZWxkc1swXS5mbGFncyAmIEJDTUNMSV9GSUVMRF9ERVNDUl9GTEFHU19QUkVTRU5DRV9NQVNLKSAhPSAwKSAmJgorICAgICAgICAgICAgICAgICAgICBzdHlsZSAhPSBBUElDTElfT1VUUFVUX1NUWUxFX0NfSU5JVCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIElmIHRoZSBzdHJ1Y3QgaGFzIGEgcHJlc2VuY2UgbWFzaywgc2tpcCB0aGUgcHJlc2VuY2UgbWFzayBmaWVsZCBpdHNlbGYsIHRoZW4gcmVjb3JkIHRoZSBwb3NpdGlvbgorICAgICAgICAgICAgICAgICAgICAgKiBvZiB0aGUgcHJlc2VuY2UgbWFzayBzbyB3ZSBjYW4gY2hlY2sgaXQgbGF0ZXIgZm9yIGVhY2ggZW50cnkuICovCisgICAgICAgICAgICAgICAgICAgIGlmIChmID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZmllbGRfcG0udHlwZSA9IHRkLT54LnMuZmllbGRzWzBdLnR5cGU7CisgICAgICAgICAgICAgICAgICAgIGZpZWxkX3BtLmRhdGEgPSAodWludDhfdCAqKWRhdGEgKyB0ZC0+eC5zLmZpZWxkc1swXS5vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIGZpZWxkX3BtLmJpdCA9ICh1aW50OF90KShmIC0gMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzdHlsZSA9PSBBUElDTElfT1VUUFVUX1NUWUxFX0NfSU5JVCAmJiBmID4gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYmNtY2xpX3N0cm5jcHkoZnVsbF9uYW1lLCBuYW1lLCBzaXplb2YoZnVsbF9uYW1lKSk7CisgICAgICAgICAgICAgICAgYmNtY2xpX3N0cm5jYXQoZnVsbF9uYW1lLCAiLiIsIHNpemVvZihmdWxsX25hbWUpKTsKKyAgICAgICAgICAgICAgICBiY21jbGlfc3RybmNhdChmdWxsX25hbWUsIGZsZC0+bmFtZSwgc2l6ZW9mKGZ1bGxfbmFtZSkpOworICAgICAgICAgICAgICAgIHJjID0gX2FwaWNsaV9kdW1wX2RhdGFfdHlwZShzZXNzaW9uLCBmbGQtPnR5cGUsIGZkYXRhLCBmdWxsX25hbWUsIG51bV9lbnRyaWVzLCBlbnRyeV9zaXplLCBzdHlsZSwgJmZpZWxkX3BtLCBwcmVmaXgsIHN1ZmZpeCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3R5bGUgPT0gQVBJQ0xJX09VVFBVVF9TVFlMRV9DX0lOSVQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIgfSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfVU5JT046CisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFByaW50IGZpZWxkcyB1cCB0byBzZWxlY3RvciwgdGhlbiBzZWxlY3RvciwgdGhlbiBzZWxlY3RlZCBzdWItc3RydWN0dXJlICovCisgICAgICAgICAgICB1aW50MTZfdCBmOworICAgICAgICAgICAgY2hhciBmdWxsX25hbWVbQVBJQ0xJX01BWF9QQVJNX05BTUVfTEVOR1RIXTsKKyAgICAgICAgICAgIGNvbnN0IGJjbWNsaV9maWVsZF9kZXNjciAqZmxkOworICAgICAgICAgICAgdm9pZCAqZmRhdGE7CisgICAgICAgICAgICBpbnQ2NF90IHNlbGVjdG9yX3ZhbCA9IDA7CisgICAgICAgICAgICBpbnQgbnVtX3VuaW9uX3ZhbHM7CisKKyAgICAgICAgICAgIGlmICghdGQtPngudS5udW1fY29tbW9uX2ZpZWxkcykKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIEJVR19PTighdGQtPngudS5jb21tb25fZmllbGRzKTsKKyAgICAgICAgICAgIGlmIChzdHlsZSA9PSBBUElDTElfT1VUUFVUX1NUWUxFX0NfSU5JVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgInsgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBDb21tb24gZmllbGRzLCBpbmNsdWRpbmcgc2VsZWN0b3IgKi8KKyAgICAgICAgICAgIGZvciAoZiA9IDA7IGYgPD0gdGQtPngudS5jbGFzc2lmaWVyX2lkeCAmJiAhcmM7IGYrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmbGQgPSAmdGQtPngudS5jb21tb25fZmllbGRzW2ZdOworICAgICAgICAgICAgICAgIGZkYXRhID0gKHZvaWQgKikoKGxvbmcpZGF0YSArIGZsZC0+b2Zmc2V0KTsKKworICAgICAgICAgICAgICAgIGJjbWNsaV9zdHJuY3B5KGZ1bGxfbmFtZSwgbmFtZSwgc2l6ZW9mKGZ1bGxfbmFtZSkpOworICAgICAgICAgICAgICAgIGlmIChmbGQtPm5hbWUgJiYgc3RybGVuKGZsZC0+bmFtZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21jbGlfc3RybmNhdChmdWxsX25hbWUsICIuIiwgc2l6ZW9mKGZ1bGxfbmFtZSkpOworICAgICAgICAgICAgICAgICAgICBiY21jbGlfc3RybmNhdChmdWxsX25hbWUsIGZsZC0+bmFtZSwgc2l6ZW9mKGZ1bGxfbmFtZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByYyA9IF9hcGljbGlfZHVtcF9kYXRhX3R5cGUoc2Vzc2lvbiwgZmxkLT50eXBlLCBmZGF0YSwgZnVsbF9uYW1lLCBudW1fZW50cmllcywgZW50cnlfc2l6ZSwgc3R5bGUsIHByZXNlbmNlX21hc2ssIHByZWZpeCwgc3VmZml4KTsKKyAgICAgICAgICAgICAgICBpZiAoZiA9PSB0ZC0+eC51LmNsYXNzaWZpZXJfaWR4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSByYyA/IHJjIDogX2FwaWNsaV9yZWFkX3NudW0oc2Vzc2lvbiwgZmxkLT50eXBlLCBmZGF0YSwgJnNlbGVjdG9yX3ZhbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzdHlsZSA9PSBBUElDTElfT1VUUFVUX1NUWUxFX0NfSU5JVCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIqKippbnRlcm5hbCBlcnJvciB3aGVuIGR1bXBpbmcgZmllbGQgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIHRkLT54LnUuY29tbW9uX2ZpZWxkc1tmXS5uYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG51bV91bmlvbl92YWxzID0gX2FwaV9jbGlfZ2V0X251bV9lbnVtX3ZhbHModGQtPngudS5jb21tb25fZmllbGRzW3RkLT54LnUuY2xhc3NpZmllcl9pZHhdLnR5cGUtPnguZSk7CisgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKXNlbGVjdG9yX3ZhbCA+PSBudW1fdW5pb25fdmFscykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIioqKmludmFsaWQgdW5pb24gc2VsZWN0b3IgdmFsdWUgJWxsZFxuIiwgKGxvbmcgbG9uZylzZWxlY3Rvcl92YWwpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBDb21tb24gZmllbGRzIGZvbGxvd2luZyBzZWxlY3RvciAqLworICAgICAgICAgICAgZm9yICg7IGYgPCB0ZC0+eC51Lm51bV9jb21tb25fZmllbGRzOyBmKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmxkID0gJnRkLT54LnUuY29tbW9uX2ZpZWxkc1tmXTsKKyAgICAgICAgICAgICAgICBmZGF0YSA9ICh2b2lkICopKChsb25nKWRhdGEgKyBmbGQtPm9mZnNldCk7CisKKyAgICAgICAgICAgICAgICBpZiAoc3R5bGUgPT0gQVBJQ0xJX09VVFBVVF9TVFlMRV9DX0lOSVQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJjbWNsaV9zdHJuY3B5KGZ1bGxfbmFtZSwgbmFtZSwgc2l6ZW9mKGZ1bGxfbmFtZSkpOworICAgICAgICAgICAgICAgIGlmIChmbGQtPm5hbWUgJiYgc3RybGVuKGZsZC0+bmFtZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21jbGlfc3RybmNhdChmdWxsX25hbWUsICIuIiwgc2l6ZW9mKGZ1bGxfbmFtZSkpOworICAgICAgICAgICAgICAgICAgICBiY21jbGlfc3RybmNhdChmdWxsX25hbWUsIGZsZC0+bmFtZSwgc2l6ZW9mKGZ1bGxfbmFtZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByYyA9IF9hcGljbGlfZHVtcF9kYXRhX3R5cGUoc2Vzc2lvbiwgZmxkLT50eXBlLCBmZGF0YSwgZnVsbF9uYW1lLCBudW1fZW50cmllcywgZW50cnlfc2l6ZSwgc3R5bGUsIHByZXNlbmNlX21hc2ssIHByZWZpeCwgc3VmZml4KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogU2VsZWN0ZWQgZmllbGQgKi8KKyAgICAgICAgICAgIGZsZCA9ICZ0ZC0+eC51LnVuaW9uX2ZpZWxkc1tzZWxlY3Rvcl92YWxdOworICAgICAgICAgICAgaWYgKGZsZC0+dHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoc3R5bGUgPT0gQVBJQ0xJX09VVFBVVF9TVFlMRV9DX0lOSVQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgInsgLiVzID0gIiwgX2FwaWNsaV9za2lwX3VuaW9uX3ByZWZpeChmbGQtPm5hbWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmRhdGEgPSAodm9pZCAqKSgobG9uZylkYXRhICsgZmxkLT5vZmZzZXQpOworCisgICAgICAgICAgICAgICAgYmNtY2xpX3N0cm5jcHkoZnVsbF9uYW1lLCBuYW1lLCBzaXplb2YoZnVsbF9uYW1lKSk7CisgICAgICAgICAgICAgICAgaWYgKGZsZC0+bmFtZSAmJiBzdHJsZW4oZmxkLT5uYW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbWNsaV9zdHJuY2F0KGZ1bGxfbmFtZSwgIi4iLCBzaXplb2YoZnVsbF9uYW1lKSk7CisgICAgICAgICAgICAgICAgICAgIGJjbWNsaV9zdHJuY2F0KGZ1bGxfbmFtZSwgZmxkLT5uYW1lLCBzaXplb2YoZnVsbF9uYW1lKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJjID0gX2FwaWNsaV9kdW1wX2RhdGFfdHlwZShzZXNzaW9uLCBmbGQtPnR5cGUsIGZkYXRhLCBmdWxsX25hbWUsIG51bV9lbnRyaWVzLCBlbnRyeV9zaXplLCBzdHlsZSwgcHJlc2VuY2VfbWFzaywgcHJlZml4LCBzdWZmaXgpOworICAgICAgICAgICAgICAgIGlmIChzdHlsZSA9PSBBUElDTElfT1VUUFVUX1NUWUxFX0NfSU5JVCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiIH0iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3R5bGUgPT0gQVBJQ0xJX09VVFBVVF9TVFlMRV9DX0lOSVQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIgfSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0ZJWEVEOiAvKiBmaXhlZCBhcnJheSAqLworICAgICAgICB7CisgICAgICAgICAgICByYyA9IF9hcGljbGlfZHVtcF9hcnJheShzZXNzaW9uLCB0ZC0+eC5hcnJfZml4ZWQuZWxlbV90eXBlLCBkYXRhLCB0ZC0+eC5hcnJfZml4ZWQuc2l6ZSwgbmFtZSwgc3R5bGUsIHByZXNlbmNlX21hc2ssIHByZWZpeCwgc3VmZml4KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9EWU46ICAgLyogZHluYW1pYyBhcnJheSB0aGF0IHNob3VsZCBiZSBwcmludGVkIGFzIGJ1ZmZlciAqLworICAgICAgICB7CisgICAgICAgICAgICAvKiBSZWFkIGxlbmd0aCAqLworICAgICAgICAgICAgdWludDMyX3QgYXJyYXlfc2l6ZTsKKworICAgICAgICAgICAgcmMgPSBfYXBpY2xpX2Fycl9keW5fbGVuX2dldCh0ZCwgZGF0YSwgJmFycmF5X3NpemUpOworICAgICAgICAgICAgaWYgKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiKioqICVzOiBkeW4gYXJyYXkgbGVuX3NpemUgJXUgaXMgbm90IHN1cHBvcnRlZFxuIiwgbmFtZSwgdGQtPnguYXJyX2R5bi5sZW5fc2l6ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3R5bGUgPT0gQVBJQ0xJX09VVFBVVF9TVFlMRV9DX0lOSVQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmllbGRfbmFtZSA9IHN0cnJjaHIobmFtZSwgJy4nKTsKKyAgICAgICAgICAgICAgICBpZiAoZmllbGRfbmFtZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmllbGRfbmFtZSA9IG5hbWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICsrZmllbGRfbmFtZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICJ7ICV1LCAlcyB9IiwgYXJyYXlfc2l6ZSwgZmllbGRfbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICBkYXRhID0gX2FwaWNsaV9hcnJfZHluX2RhdGFfZ2V0KHRkLCBkYXRhKTsKKyAgICAgICAgICAgIHJjID0gX2FwaWNsaV9kdW1wX2FycmF5KHNlc3Npb24sIHRkLT54LmFycl9keW4uZWxlbV90eXBlLCBkYXRhLCBhcnJheV9zaXplLCBuYW1lLCBzdHlsZSwgcHJlc2VuY2VfbWFzaywgcHJlZml4LCBzdWZmaXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICAvKiBGaW5hbGx5ISBTaW1wbGUgdHlwZSB0aGF0IG1hcHMgdG8gYSBzaW5nbGUgQ0xJIHBhcmFtZXRlciAqLworICAgICAgICAgICAgaW50IG47CisgICAgICAgICAgICBhcGljbGlfcHJlc2VuY2VfbWFza19pbmZvIGxvY2FsX3BtOworCisgICAgICAgICAgICAvKiBJZiB3ZSBoYXZlIGEgc2luZ2xlIHZhbHVlIGFuZCB0aGF0IHZhbHVlIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgcHJlc2VuY2UgbWFzaywganVzdCBza2lwIGl0IGVudGlyZWx5ICovCisgICAgICAgICAgICBpZiAobnVtX2VudHJpZXMgPT0gMSAmJiAhX2FwaWNsaV9pc192YWx1ZV9zZXQoc2Vzc2lvbiwgcHJlc2VuY2VfbWFzaykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzdHlsZSAhPSBBUElDTElfT1VUUFVUX1NUWUxFX0NfSU5JVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobmFtZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiJXMlcz0iLCBwcmVmaXgsIG5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIW51bV9lbnRyaWVzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sIEJDTUNMSV9BUlJBWV9FTVBUWSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBEdW1wIHNpbXBsZSB2YWx1ZSBvciBhcnJheSBvZiBzaW1wbGUgdmFsdWVzICovCisgICAgICAgICAgICBsb2NhbF9wbSA9IHByZXNlbmNlX21hc2sgPyAqcHJlc2VuY2VfbWFzayA6IChhcGljbGlfcHJlc2VuY2VfbWFza19pbmZvKXt9OworICAgICAgICAgICAgZm9yIChuID0gMDsgbiA8IG51bV9lbnRyaWVzOyBuKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG4pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiwiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBJZiB3ZSBoYXZlIGEgcHJlc2VuY2UgbWFzaywgbWFrZSBzdXJlIHRvIHByaW50IGEgc3BlY2lhbCB0b2tlbiBpZiB0aGUgdmFsdWUgaXMgdW5zZXQgKi8KKyAgICAgICAgICAgICAgICBpZiAoX2FwaWNsaV9pc192YWx1ZV9zZXQoc2Vzc2lvbiwgJmxvY2FsX3BtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJjID0gX2FwaWNsaV9kdW1wX3NpbXBsZV9kYXRhX3R5cGUoc2Vzc2lvbiwgdGQsIGRhdGEsIG5hbWUsIHN0eWxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sIEJDTUNMSV9QQVJNX05PX1ZBTFVFKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkYXRhID0gKHZvaWQgKikoKGxvbmcpZGF0YSArIGVudHJ5X3NpemUpOworICAgICAgICAgICAgICAgIGxvY2FsX3BtLmRhdGEgPSAodm9pZCAqKSgobG9uZylsb2NhbF9wbS5kYXRhICsgZW50cnlfc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiVzIiwgc3VmZml4KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyogRHVtcCBhcnJheSAqLworc3RhdGljIGJjbW9zX2Vycm5vIF9hcGljbGlfZHVtcF9hcnJheSgKKyAgICBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwKKyAgICBjb25zdCBiY21jbGlfdHlwZV9kZXNjciAqdGQsCisgICAgdm9pZCAqZGF0YSwKKyAgICB1aW50MzJfdCBzaXplLAorICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgYXBpY2xpX291dHB1dF9zdHlsZSBzdHlsZSwKKyAgICBjb25zdCBhcGljbGlfcHJlc2VuY2VfbWFza19pbmZvICpwcmVzZW5jZV9tYXNrLAorICAgIGNvbnN0IGNoYXIgKnByZWZpeCwKKyAgICBjb25zdCBjaGFyICpzdWZmaXgpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworCisgICAgLyogUHJpbnQgYXMgYnVmZmVyIG9yIGVsZW1lbnQgYnkgZWxlbWVudCA/ICovCisgICAgaWYgKHN0eWxlID09IEFQSUNMSV9PVVRQVVRfU1RZTEVfQ19JTklUKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICJ7ICIpOworICAgICAgICByYyA9IF9hcGljbGlfZHVtcF9kYXRhX3R5cGUoc2Vzc2lvbiwgdGQsIGRhdGEsIG5hbWUsIHNpemUsIHRkLT5zaXplLCBzdHlsZSwgcHJlc2VuY2VfbWFzaywgcHJlZml4LCBzdWZmaXgpOworICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiB9Iik7CisgICAgfQorICAgIGVsc2UgaWYgKCh0ZC0+YmFzZV90eXBlID09IEJDTU9MVF9CQVNFX1RZUEVfSURfVU5VTSB8fCB0ZC0+YmFzZV90eXBlID09IEJDTU9MVF9CQVNFX1RZUEVfSURfVU5VTV9IRVgpICYmIHRkLT5zaXplID09IDEpCisgICAgeworICAgICAgICBpZiAoX2FwaWNsaV9pc192YWx1ZV9zZXQoc2Vzc2lvbiwgcHJlc2VuY2VfbWFzaykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGk7CisKKyAgICAgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiJXMlcz0iLCBwcmVmaXgsIG5hbWUpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiUwMngiLCAoKHVpbnQ4X3QqKWRhdGEpW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiJXMiLCBzdWZmaXgpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJjID0gX2FwaWNsaV9kdW1wX2RhdGFfdHlwZShzZXNzaW9uLCB0ZCwgZGF0YSwgbmFtZSwgc2l6ZSwgdGQtPnNpemUsIHN0eWxlLCBwcmVzZW5jZV9tYXNrLCBwcmVmaXgsIHN1ZmZpeCk7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyogRHVtcCBwcm9wZXJ0eSAqLworYmNtb3NfZXJybm8gYXBpY2xpX2R1bXBfcHJvcChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX3Byb3BfZGVzY3IgKnBkLCB2b2lkICpwcm9wX2RhdGEpCit7CisgICAgcmV0dXJuIF9hcGljbGlfZHVtcF9kYXRhX3R5cGUoc2Vzc2lvbiwgcGQtPnR5cGUsIHByb3BfZGF0YSwgcGQtPm5hbWUsIDEsIDAsIEFQSUNMSV9PVVRQVVRfU1RZTEVfU1RELCBOVUxMLCAiICAgIiwgIlxuIik7Cit9CisKKy8qIER1bXAgYSBzaW5nbGUgcHJvcGVydHkgdmFsdWUgaW4gQyBpbml0aWFsaXplciBmb3JtYXQgKi8KK2JjbW9zX2Vycm5vIGFwaWNsaV9kdW1wX3Byb3BfaW5pdGlhbGl6ZXIoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9wcm9wX2Rlc2NyICpwZCwgdm9pZCAqcHJvcF9kYXRhKQoreworICAgIHJldHVybiBfYXBpY2xpX2R1bXBfZGF0YV90eXBlKHNlc3Npb24sIHBkLT50eXBlLCBwcm9wX2RhdGEsIHBkLT5uYW1lLCAxLCAwLCBBUElDTElfT1VUUFVUX1NUWUxFX0NfSU5JVCwgTlVMTCwgIiIsICIiKTsKK30KKworYmNtb3NfZXJybm8gYXBpY2xpX2R1bXBfZHluX2FycmF5KAorICAgIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLAorICAgIGNvbnN0IGJjbWNsaV90eXBlX2Rlc2NyICp0ZCwKKyAgICB2b2lkICpkYXRhLAorICAgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgdWludDMyX3QgYXJyYXlfc2l6ZTsKKworICAgIHJjID0gX2FwaWNsaV9hcnJfZHluX2xlbl9nZXQodGQsIGRhdGEsICZhcnJheV9zaXplKTsKKyAgICBCQ01PU19SRVRVUk5fSUZfRVJST1IocmMpOworICAgIHJldHVybiBfYXBpY2xpX2R1bXBfYXJyYXkoCisgICAgICAgIHNlc3Npb24sCisgICAgICAgIHRkLT54LmFycl9keW4uZWxlbV90eXBlLAorICAgICAgICBfYXBpY2xpX2Fycl9keW5fZGF0YV9nZXQodGQsIGRhdGEpLAorICAgICAgICBhcnJheV9zaXplLAorICAgICAgICBuYW1lLAorICAgICAgICBBUElDTElfT1VUUFVUX1NUWUxFX0NfSU5JVCwKKyAgICAgICAgTlVMTCwKKyAgICAgICAgIiIsCisgICAgICAgICIiKTsKK30KKworLyogRHVtcCBwcm9wZXJ0eSBhcyBDTEkgcGFyYW1ldGVycyAqLworYmNtb3NfZXJybm8gYXBpY2xpX2R1bXBfcHJvcF9wYXJhbShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX3Byb3BfZGVzY3IgKnBkLCB2b2lkICpwcm9wX2RhdGEsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKyAgICByZXR1cm4gX2FwaWNsaV9kdW1wX2RhdGFfdHlwZShzZXNzaW9uLCBwZC0+dHlwZSwgcHJvcF9kYXRhLCBwZC0+bmFtZSwgMSwgMCwgQVBJQ0xJX09VVFBVVF9TVFlMRV9TVEQsIE5VTEwsIHByZWZpeCwgIiIpOworfQorCisvKiBDYWxjdWxhdGUgcHJvcGVydHkgcG9pbnRlciBnaXZlbiB0aGUgZ3JvdXAgZGF0YSBwb2ludGVyIGFuZCBwcm9wZXJ0eSBkZXNjcmlwdGlvbiAqLworc3RhdGljIGlubGluZSB2b2lkICpfYXBpY2xpX3Byb3BfZGF0YV9wdHIodm9pZCAqZ3JvdXBfcHRyLCBjb25zdCBiY21jbGlfcHJvcF9kZXNjciAqcGQpCit7CisgICAgcmV0dXJuICh2b2lkICopKChsb25nKWdyb3VwX3B0ciArIHBkLT5vZmZzZXQpOworfQorCisvKiBEdW1wIG9iamVjdCBkYXRhICovCitzdGF0aWMgYmNtb3NfZXJybm8gX2FwaWNsaV9kdW1wX2RhdGEoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGJjbW9sdF9tc2cgKm1zZywgdm9pZCAqZGF0YSwgdWludDMyX3QgZGF0YV9zaXplKQoreworICAgIHVpbnQxNl90IHByb3A7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworICAgIGNvbnN0IGJjbWNsaV9wcm9wX2Rlc2NyICpwZDsKKworICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiZGF0YTpcbiIpOworICAgIGZvciAocHJvcCA9IDA7CisgICAgICAgICBhcGlfY2xpX29iamVjdF9wcm9wZXJ0eShtc2ctPm9ial90eXBlLCBtc2ctPmdyb3VwLCBtc2ctPnN1Ymdyb3VwLCBwcm9wLCAmcGQpID09IEJDTV9FUlJfT0s7CisgICAgICAgICArK3Byb3ApCisgICAgeworICAgICAgICB2b2lkICpwcm9wX2RhdGEgPSBfYXBpY2xpX3Byb3BfZGF0YV9wdHIoZGF0YSwgcGQpOworICAgICAgICBpZiAoIShtc2ctPnByZXNlbmNlX21hc2sgJiAoMUxMIDw8IHByb3ApKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoIXByb3BfZGF0YSkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgQlVHX09OKHBkLT5vZmZzZXQgPiBkYXRhX3NpemUpOworICAgICAgICByYyA9IGFwaWNsaV9kdW1wX3Byb3Aoc2Vzc2lvbiwgcGQsIHByb3BfZGF0YSk7CisgICAgICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKy8qIER1bXAgb2JqZWN0IGtleSAqLworc3RhdGljIGJjbW9zX2Vycm5vIF9hcGljbGlfZHVtcF9rZXkoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGJjbW9sdF9tc2cgKm1zZywgdm9pZCAqa2V5LCB1aW50MzJfdCBrZXlfc2l6ZSkKK3sKKyAgICB1aW50MTZfdCBwcm9wOworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKyAgICBjb25zdCBiY21jbGlfcHJvcF9kZXNjciAqcGQ7CisKKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgImtleTpcbiIpOworICAgIGZvciAocHJvcCA9IDA7CisgICAgICAgICBhcGlfY2xpX29iamVjdF9wcm9wZXJ0eShtc2ctPm9ial90eXBlLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgcHJvcCwgJnBkKSA9PSBCQ01fRVJSX09LOworICAgICAgICAgKytwcm9wKQorICAgIHsKKyAgICAgICAgdm9pZCAqcHJvcF9kYXRhID0gX2FwaWNsaV9wcm9wX2RhdGFfcHRyKGtleSwgcGQpOworICAgICAgICBpZiAoIXByb3BfZGF0YSkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgQlVHX09OKHBkLT5vZmZzZXQgPiBrZXlfc2l6ZSk7CisgICAgICAgIHJjID0gYXBpY2xpX2R1bXBfcHJvcChzZXNzaW9uLCBwZCwgcHJvcF9kYXRhKTsKKyAgICAgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworY29uc3QgY2hhciAqYXBpY2xpX21ndF9ncm91cF90b19zdHIoYmNtb2x0X21ndF9ncm91cCBncm91cCkKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqc3RyX3RhYmxlW0JDTU9MVF9NR1RfR1JPVVBfX05VTV9PRl0gPQorICAgIHsKKyAgICAgICAgW0JDTU9MVF9NR1RfR1JPVVBfS0VZXSAgICAgID0gImtleSIsCisgICAgICAgIFtCQ01PTFRfTUdUX0dST1VQX0NGR10gICAgICA9ICJjZmciLAorICAgICAgICBbQkNNT0xUX01HVF9HUk9VUF9TVEFUXSAgICAgPSAic3RhdCIsCisgICAgICAgIFtCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHXSA9ICJzdGF0X2NmZyIsCisgICAgICAgIFtCQ01PTFRfTUdUX0dST1VQX0FVVE9dICAgICA9ICJhdXRvIiwKKyAgICAgICAgW0JDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkddID0gImF1dG9fY2ZnIiwKKyAgICAgICAgW0JDTU9MVF9NR1RfR1JPVVBfT1BFUl0gICAgID0gIm9wZXIiLAorICAgICAgICBbQkNNT0xUX01HVF9HUk9VUF9QUk9YWV0gICAgPSAicHJveHkiLAorICAgICAgICBbQkNNT0xUX01HVF9HUk9VUF9QUk9YWV9SWF0gPSAicHJveHlfcngiCisgICAgfTsKKyAgICByZXR1cm4gKGdyb3VwID49IEJDTU9MVF9NR1RfR1JPVVBfX05VTV9PRikgPyAiPHVua25vd24+IiA6IHN0cl90YWJsZVtncm91cF07Cit9CisKKy8qIER1bXAgbWVzc2FnZSBzZXQgcmV0dXJuZWQgYnkgbXVsdGktb2JqZWN0IEdFVCAqLworc3RhdGljIGJjbW9zX2Vycm5vIF9hcGljbGlfZHVtcF9tc2dzZXQoCisgICAgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sCisgICAgYmNtb2x0X21zZyAqbXNnLAorICAgIHVpbnQzMl90IGtleV9zaXplLAorICAgIHVpbnQzMl90IGRhdGFfc2l6ZSwKKyAgICB1aW50MzJfdCBkYXRhX29mZnNldCkKK3sKKyAgICB1aW50MTZfdCBpbnN0OworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIHZvaWQgKmtleSA9IE5VTEw7CisgICAgdm9pZCAqZGF0YSA9IE5VTEw7CisKKyAgICBpZiAobXNnLT5tc2dfc2V0ID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9OVUxMOworICAgIH0KKworICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAibW9yZTogJXNcbiIsIG1zZy0+bXNnX3NldC0+bW9yZSA/ICJ5ZXMiIDogIm5vIik7CisgICAgaWYgKG1zZy0+bXNnX3NldC0+bW9yZSkKKyAgICB7CisgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAibmV4dCAiKTsKKyAgICAgICAgX2FwaWNsaV9kdW1wX2tleShzZXNzaW9uLCBtc2csIG1zZy0+bXNnX3NldC0+bmV4dF9rZXksIGtleV9zaXplKTsKKyAgICB9CisKKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIm51bWJlciBvZiBvYmplY3RzIHJldHVybmVkOiAlZFxuIiwgbXNnLT5tc2dfc2V0LT5udW1faW5zdGFuY2VzKTsKKyAgICBmb3IgKGluc3QgPSAwOyBpbnN0IDwgbXNnLT5tc2dfc2V0LT5udW1faW5zdGFuY2VzOyBpbnN0KyspCisgICAgeworICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIm9iamVjdCAlZDpcbiIsIGluc3QpOworCisgICAgICAgIGtleSA9ICh2b2lkICopKChsb25nKW1zZy0+bXNnX3NldC0+bXNnW2luc3RdICsgc2l6ZW9mKGJjbW9sdF9tc2cpKTsKKyAgICAgICAgcmMgPSBfYXBpY2xpX2R1bXBfa2V5KHNlc3Npb24sIG1zZy0+bXNnX3NldC0+bXNnW2luc3RdLCBrZXksIGtleV9zaXplKTsKKyAgICAgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorCisgICAgICAgIGRhdGEgPSAodm9pZCAqKSgobG9uZyltc2ctPm1zZ19zZXQtPm1zZ1tpbnN0XSArIGRhdGFfb2Zmc2V0KTsKKyAgICAgICAgcmMgPSBfYXBpY2xpX2R1bXBfZGF0YShzZXNzaW9uLCBtc2ctPm1zZ19zZXQtPm1zZ1tpbnN0XSwgZGF0YSwgZGF0YV9zaXplKTsKKyAgICAgICAgaWYgKHJjKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogRHVtcCBtZXNzYWdlICovCitiY21vc19lcnJubyBhcGljbGlfbXNnX2R1bXAoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGJjbW9sdF9tc2cgKm1zZykKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBjb25zdCBjaGFyICpuYW1lLCAqZGVzY3I7CisgICAgdWludDMyX3Qga2V5X3NpemU7CisgICAgdWludDMyX3Qga2V5X29mZnNldDsKKyAgICB1aW50MzJfdCBkYXRhX3NpemU7CisgICAgdWludDMyX3QgZGF0YV9vZmZzZXQ7CisgICAgdm9pZCAqa2V5ID0gTlVMTDsKKyAgICB2b2lkICpkYXRhID0gTlVMTDsKKworICAgIHJjID0gYXBpX2NsaV9vYmplY3RfbmFtZShtc2ctPm9ial90eXBlLCAmbmFtZSwgJmRlc2NyKTsKKyAgICBpZiAocmMpCisgICAgeworICAgICAgICBnb3RvIGR1bXBfZXJyb3I7CisgICAgfQorCisgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICJvYmplY3Q6ICIpOworICAgIGlmIChuYW1lKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIlcyIsIG5hbWUpOworICAgIH0KKyAgICBpZiAoZGVzY3IpCisgICAgeworICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiAtICVzIiwgZGVzY3IpOworICAgIH0KKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIlxuIik7CisgICAgcmMgPSBhcGlfY2xpX29iamVjdF9zdHJ1Y3Rfc2l6ZSgKKyAgICAgICAgbXNnLT5vYmpfdHlwZSwKKyAgICAgICAgbXNnLT5ncm91cCwKKyAgICAgICAgbXNnLT5zdWJncm91cCwKKyAgICAgICAgJmtleV9zaXplLAorICAgICAgICAma2V5X29mZnNldCwKKyAgICAgICAgJmRhdGFfc2l6ZSwKKyAgICAgICAgJmRhdGFfb2Zmc2V0KTsKKyAgICBpZiAocmMpCisgICAgeworICAgICAgICBnb3RvIGR1bXBfZXJyb3I7CisgICAgfQorCisgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sIChtc2ctPnR5cGUgJiBCQ01PTFRfTVNHX1RZUEVfR0VUKSAhPSAwID8gImdldCIgOiAic2V0Iik7CisgICAgaWYgKChtc2ctPnR5cGUgJiBCQ01PTFRfTVNHX1RZUEVfQ0xFQVIpICE9IDApCisgICAgeworICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIixjbGVhciIpOworICAgIH0KKyAgICBpZiAoKG1zZy0+dHlwZSAmIEJDTU9MVF9NU0dfVFlQRV9NVUxUSSkgIT0gMCkKKyAgICB7CisgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiLG11bHRpIik7CisgICAgfQorICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiICVzICIsIGFwaWNsaV9tZ3RfZ3JvdXBfdG9fc3RyKG1zZy0+Z3JvdXApKTsKKworICAgIGlmIChtc2ctPmdyb3VwICE9IEJDTU9MVF9NR1RfR1JPVVBfQ0ZHICYmIG1zZy0+Z3JvdXAgIT0gQkNNT0xUX01HVF9HUk9VUF9TVEFUICYmCisgICAgICAgIG1zZy0+Z3JvdXAgIT0gQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRyAmJiBtc2ctPmdyb3VwICE9IEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkcpCisgICAgeworICAgICAgICBjb25zdCBjaGFyICpzdWJfbmFtZSwgKnN1Yl9kZXNjcjsKKyAgICAgICAgLyogR2V0IG5hbWUgb2Ygc3BlY2lmaWMgc3ViZ3JvdXAgKi8KKyAgICAgICAgcmMgPSBhcGlfY2xpX29iamVjdF9zdWJncm91cF9uYW1lKG1zZy0+b2JqX3R5cGUsIG1zZy0+Z3JvdXAsIG1zZy0+c3ViZ3JvdXAsICZzdWJfbmFtZSwgJnN1Yl9kZXNjcik7CisgICAgICAgIGlmIChyYykKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBkdW1wX2Vycm9yOworICAgICAgICB9CisgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAic3ViZ3JvdXA6ICVzLSVzICIsIHN1Yl9uYW1lID8gc3ViX25hbWUgOiAiPyIsIHN1Yl9kZXNjciA/IHN1Yl9kZXNjciA6ICIiKTsKKyAgICB9CisgICAgaWYgKG1zZy0+ZGlyID09IEJDTU9MVF9NU0dfRElSX1JFUVVFU1QpCisgICAgeworICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgInJlcXVlc3RcbiIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgInJlc3BvbnNlOiAlcyAlc1xuIiwgYmNtb3Nfc3RyZXJyb3IobXNnLT5lcnIpLCBtc2ctPmVycl90ZXh0KTsKKyAgICB9CisKKyAgICBpZiAobXNnLT5kaXIgPT0gQkNNT0xUX01TR19ESVJfUkVTUE9OU0UgJiYgKG1zZy0+dHlwZSAmIEJDTU9MVF9NU0dfVFlQRV9NVUxUSSkgIT0gMCkKKyAgICB7CisgICAgICAgIHJjID0gX2FwaWNsaV9kdW1wX21zZ3NldChzZXNzaW9uLCBtc2csIGtleV9zaXplLCBkYXRhX3NpemUsIGRhdGFfb2Zmc2V0KTsKKyAgICAgICAgaWYgKHJjKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIGR1bXBfZXJyb3I7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKChtc2ctPmdyb3VwICE9IEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcpICYmIGtleV9zaXplKQorICAgICAgICB7CisgICAgICAgICAgICBrZXkgPSAodm9pZCAqKSgobG9uZyltc2cgKyBrZXlfb2Zmc2V0KTsKKyAgICAgICAgICAgIHJjID0gX2FwaWNsaV9kdW1wX2tleShzZXNzaW9uLCBtc2csIGtleSwga2V5X3NpemUpOworICAgICAgICAgICAgaWYgKHJjKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gZHVtcF9lcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZGF0YV9zaXplICYmCisgICAgICAgICAgICAgKCAgKChtc2ctPmRpciA9PSBCQ01PTFRfTVNHX0RJUl9SRVFVRVNUKSAmJiAobXNnLT50eXBlICYgQkNNT0xUX01TR19UWVBFX1NFVCkpICB8fAorICAgICAgICAgICAgICAgICgobXNnLT5kaXIgPT0gQkNNT0xUX01TR19ESVJfUkVTUE9OU0UpICYmIChtc2ctPnR5cGUgJiBCQ01PTFRfTVNHX1RZUEVfR0VUKSkgfHwKKyAgICAgICAgICAgICAgICAobXNnLT5ncm91cCA9PSBCQ01PTFRfTUdUX0dST1VQX0FVVE8pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICAgICAgICAgKG1zZy0+Z3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9QUk9YWV9SWCkKKyAgICAgICAgICAgICApCisgICAgICAgICAgICkKKyAgICAgICAgeworICAgICAgICAgICAgZGF0YSA9ICh2b2lkICopKChsb25nKW1zZyArIGRhdGFfb2Zmc2V0KTsKKyAgICAgICAgICAgIHJjID0gX2FwaWNsaV9kdW1wX2RhdGEoc2Vzc2lvbiwgbXNnLCBkYXRhLCBkYXRhX3NpemUpOworICAgICAgICAgICAgaWYgKHJjKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gZHVtcF9lcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKKworZHVtcF9lcnJvcjoKKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIioqKiBPYmplY3QgZHVtcCBlcnJvciAlcyAoJWQpXG4iLCBiY21vc19zdHJlcnJvcihyYyksIHJjKTsKKyAgICByZXR1cm4gcmM7Cit9CisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfY2xpL2JjbV9hcGlfY2xpX2hhbmRsZXJzLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvYXBpX2NsaS9iY21fYXBpX2NsaV9oYW5kbGVycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkOWJmZWYKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvYXBpX2NsaS9iY21fYXBpX2NsaV9oYW5kbGVycy5jCkBAIC0wLDAgKzEsNjc3MzEgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorKi8KKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21vbHRfYXBpLmg+CisjaW5jbHVkZSA8YmNtY2xpLmg+CisjaW5jbHVkZSA8YmNtb2x0X21vZGVsX3R5cGVzLmg+CisjaW5jbHVkZSA8YmNtX2FwaV9jbGlfaGVscGVycy5oPgorI2luY2x1ZGUgImJjbV9hcGlfY2xpX2hhbmRsZXJzLmgiCisKK2JjbWNsaV9zZXNzaW9uICphcGljbGlfY2xpX2xvZ19zZXNzaW9uID0gTlVMTDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50OF90ICpzdGFydDsKKyAgICB1aW50MzJfdCB1c2VkOworICAgIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0OyAgICAvKiB1c2VkIGZvciBtdWx0aS1vYmplY3QgZ2V0IG1lc3NhZ2VzICovCit9IGFwaWNsaV9ieXRlX3Bvb2w7CisKKy8qIG9ubHkgc3RvcmUgMSBtZXNzYWdlIHNldCBhdCBhIHRpbWUgc28gaXQncyBlYXN5IHRvIGNsZWFuIHVwIGFmdGVyICovCitzdGF0aWMgYmNtb3NfZXJybm8gYXBpY2xpX2J5dGVfcG9vbF9jcmVhdGUoYXBpY2xpX2J5dGVfcG9vbCAqYnVmKQoreworICAgIGJ1Zi0+dXNlZCA9IDA7CisgICAgYnVmLT5zdGFydCA9IGJjbW9zX2NhbGxvYyhBUElDTElfRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFKTsKKyAgICBidWYtPm1zZ19zZXQgPSBOVUxMOworICAgIHJldHVybiAoYnVmLT5zdGFydCA9PSBOVUxMKSA/IEJDTV9FUlJfTk9NRU0gOiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgdm9pZCBhcGljbGlfYnl0ZV9wb29sX2Rlc3Ryb3koYXBpY2xpX2J5dGVfcG9vbCAqYnVmKQoreworICAgIGlmIChidWYtPm1zZ19zZXQgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9tc2dfc2V0X2ZyZWUoYnVmLT5tc2dfc2V0KTsKKyAgICB9CisKKyAgICBiY21vc19mcmVlKGJ1Zi0+c3RhcnQpOworfQorCitzdGF0aWMgdm9pZCAqYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYXBpY2xpX2J5dGVfcG9vbCAqYnVmLCB1aW50MzJfdCBudW1fYnl0ZXMpCit7CisgICAgdm9pZCAqcmV0OworICAgIGlmIChidWYtPnVzZWQgKyBudW1fYnl0ZXMgPiBBUElDTElfRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0ID0gYnVmLT5zdGFydCArIGJ1Zi0+dXNlZDsKKyAgICBidWYtPnVzZWQgKz0gbnVtX2J5dGVzOworICAgIG1lbXNldChyZXQsIDAsIG51bV9ieXRlcyk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGFwaWNsaV9tc2dfc2V0X2FsbG9jKGFwaWNsaV9ieXRlX3Bvb2wgKmJ1ZiwgYmNtb2x0X29ial9pZCBvYmosIGJjbW9sdF9tZ3RfZ3JvdXAgZ3JvdXAsIHVpbnQzMl90IG1heF9pbnN0YW5jZXMsIGJjbW9sdF9tc2dfc2V0ICoqbXNnX3NldCkKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgaWYgKGJ1Zi0+bXNnX3NldCAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07ICAgLyogb25seSBvbmUgYXQgYSB0aW1lICovCisgICAgfQorCisgICAgZXJyID0gYmNtb2x0X21zZ19zZXRfYWxsb2Mob2JqLCBncm91cCwgbWF4X2luc3RhbmNlcywgJmJ1Zi0+bXNnX3NldCk7CisgICAgKm1zZ19zZXQgPSBidWYtPm1zZ19zZXQ7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoKKyAqIFN0YXJ0L2VuZCBiYW5uZXJzIC0gdGhlc2UgYXJlIHNwZWNpYWxseSBmb3JtYXR0ZWQgc28gbGlzdGVuaW5nIGFwcHMgY2FuIGVhc2lseSB0ZWxsIHdoZXJlIEFQSSBoYW5kbGluZyBzdGFydHMvZW5kcy4KKyAqLworc3RhdGljIHZvaWQgYXBpY2xpX3ByaW50X3N0YXJ0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBjaGFyICphcGlfbmFtZSkKK3sKKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIlstLSBBUEkgU3RhcnQ6ICVzIC0tXVxuIiwgYXBpX25hbWUpOworfQorCitzdGF0aWMgdm9pZCBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIlstLSBBUEkgTWVzc2FnZSBEYXRhIC0tXVxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGFwaWNsaV9wcmludF9jb21wbGV0ZShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYmNtb3NfZXJybm8gZXJyLCBjb25zdCBjaGFyICplcnJfdGV4dCkKK3sKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0sgJiYgZXJyX3RleHQgIT0gTlVMTCAmJiBlcnJfdGV4dFswXSAhPSAnXDAnKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICJFUlJPUjogJXMiLCBlcnJfdGV4dCk7CisgICAgfQorCisgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICJbLS0gQVBJIENvbXBsZXRlOiAlZCAoJXMpIC0tXVxuIiwgZXJyLCBiY21vc19zdHJlcnJvcihlcnIpKTsKK30KKworc3RhdGljIGludCBhcGljbGlfY2xpX3Nlc3Npb25fd3JpdGVfY2IoYmNtY2xpX3Nlc3Npb24gKmNsaV9zZXNzaW9uLCBjb25zdCBjaGFyICpidWYsIHVpbnQzMl90IHNpemUpCit7CisgICAgYmNtY2xpX2xvZyhidWYsICIlLipzIiwgc2l6ZSwgYnVmKTsKKyAgICByZXR1cm4gKGludClzaXplOworfQorCisvKiBMb2dzIGEgcHJvcGVydHkgdmFsdWUgdG8gdGhlIENMSSBsb2cgaW4gc3VjaCBhIHdheSB0aGF0IGl0IGlzIGEgdmFsaWQgUkhTIGluIGFuIGluaXRpYWxpemVyLiAgRm9yIGEgcHJpbWl0dmUsIHRoaXMKKyAqIHdpbGwganVzdCBwcmludCB0aGUgdmFsdWUgKGUuZy4gIjQyIikuICBGb3IgYSBzdHJ1Y3QsIGl0IHdpbGwgZW1pdCBhbGwgbWVtYmVycyBpbiBiZXR3ZWVuIGN1cmx5IGJyYWNlcy4gKi8KK3N0YXRpYyB2b2lkIGFwaWNsaV9sb2dfcHJvcF92YWwoYmNtb2x0X29ial9pZCBvYmosIGJjbW9sdF9tZ3RfZ3JvdXAgZ3JvdXAsIHVpbnQxNl90IHN1Ymdyb3VwLCB1aW50MTZfdCBwcm9wLCB2b2lkICp2YWx1ZSkKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgY29uc3QgYmNtY2xpX3Byb3BfZGVzY3IgKnByb3BfZGVzY3I7CisKKyAgICBpZiAoYXBpY2xpX2NsaV9sb2dfc2Vzc2lvbiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgc3RhdGljIGJjbWNsaV9zZXNzaW9uX3Bhcm0gc2Vzc2lvbl9wYXJhbXMgPSB7IC53cml0ZSA9IGFwaWNsaV9jbGlfc2Vzc2lvbl93cml0ZV9jYiB9OworCisgICAgICAgIGVyciA9IGJjbWNsaV9zZXNzaW9uX29wZW4oJnNlc3Npb25fcGFyYW1zLCAmYXBpY2xpX2NsaV9sb2dfc2Vzc2lvbik7CisgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvciBvcGVuaW5nIHNlc3Npb246ICVzIiwgYmNtb3Nfc3RyZXJyb3IoZXJyKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlcnIgPSBhcGlfY2xpX29iamVjdF9wcm9wZXJ0eShvYmosIGdyb3VwLCBzdWJncm91cCwgcHJvcCwgJnByb3BfZGVzY3IpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3IgZ2V0dGluZyBpbmZvIGZvciBwcm9wZXJ0eTogJXMiLCBiY21vc19zdHJlcnJvcihlcnIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGVyciA9IGFwaWNsaV9kdW1wX3Byb3BfaW5pdGlhbGl6ZXIoYXBpY2xpX2NsaV9sb2dfc2Vzc2lvbiwgcHJvcF9kZXNjciwgdmFsdWUpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3IgcHJpbnRpbmcgcHJvcGVydHk6ICVzIiwgYmNtb3Nfc3RyZXJyb3IoZXJyKSk7CisgICAgfQorfQorCitzdGF0aWMgYmNtb3NfaXB2NF9hZGRyZXNzIGFwaWNsaV91bnVtYmVyX3RvX2lwdjQodWludDMyX3QgbnVtKQoreworICAgIGJjbW9zX2lwdjRfYWRkcmVzcyBpcDsKKyAgICBpcC51MzIgPSBudW07CisgICAgcmV0dXJuIGlwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfYWVfbmlfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfYWVfbmlfY2ZnIGNmZzsgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9hZV9uaV9rZXkga2V5ID0geyB9OyAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYWVfbmlfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hZV9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhZV9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmFlX25pID0gKGJjbW9sdF9hZV9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhZV9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuYWVfbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfQUVfTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfQUVfTklfS0VZX0lEX0FFX05JLCAma2V5LmFlX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgYWVfbmksIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGFlX25pLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBhZV9uaSwgbWFjX2FkZHJlc3MpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBhZV9uaSwgbWFjX2FkZHJlc3MpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFlX25pX2VuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBhZV9uaSwgYWVfbmlfZW4pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBhZV9uaSwgYWVfbmlfZW4pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm10dV8xMGciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGFlX25pLCBtdHVfMTBnKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgYWVfbmksIG10dV8xMGcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfZ2VuZXJhdG9yIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBhZV9uaSwgcHJic19nZW5lcmF0b3IpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBhZV9uaSwgcHJic19nZW5lcmF0b3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfY2hlY2tlciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgYWVfbmksIHByYnNfY2hlY2tlcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGFlX25pLCBwcmJzX2NoZWNrZXIpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfc3RhdHVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBhZV9uaSwgcHJic19zdGF0dXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBhZV9uaSwgcHJic19zdGF0dXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgYWVfbmksIG1hY19hZGRyZXNzKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBhZV9uaSwgYWVfbmlfZW4pICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGFlX25pLCBtdHVfMTBnKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBhZV9uaSwgcHJic19nZW5lcmF0b3IpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGFlX25pLCBwcmJzX2NoZWNrZXIpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGFlX25pLCBwcmJzX3N0YXR1cykpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGFlX25pLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgYWVfbmksIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9hZV9uaV9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9hZV9uaV9jZmcgY2ZnOyAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2FlX25pX2tleSBrZXkgPSB7IH07IC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hZV9uaV9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2FlX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFlX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuYWVfbmkgPSAoYmNtb2x0X2FlX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFlX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5hZV9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9BRV9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9BRV9OSV9LRVlfSURfQUVfTkksICZrZXkuYWVfbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBhZV9uaSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgYWVfbmksIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX21hY19hZGRyZXNzIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm1hYzsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBhZV9uaSwgbWFjX2FkZHJlc3MsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgYWVfbmksIG1hY19hZGRyZXNzLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0FFX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0FFX05JX0NGR19JRF9NQUNfQUREUkVTUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm10dV8xMGciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgYWVfbmksIG10dV8xMGcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgYWVfbmksIG10dV8xMGcsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfQUVfTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfQUVfTklfQ0ZHX0lEX01UVV8xMEcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicHJic19nZW5lcmF0b3IuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2dlbmVyYXRvci5wb2x5bm9tIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucG9seW5vbSA9IChiY21vbHRfcHJic19wb2x5bm9taWFsKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19nZW5lcmF0b3IucG9seW5vbSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfZ2VuZXJhdG9yLmVycm9yX2luc2VydCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmVycm9yX2luc2VydCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19nZW5lcmF0b3IuZXJyb3JfaW5zZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19nZW5lcmF0b3IuaW52ZXJ0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaW52ZXJ0ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcmJzX2dlbmVyYXRvci5pbnZlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2dlbmVyYXRvci5jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY29udHJvbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByYnNfZ2VuZXJhdG9yLmNvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBhZV9uaSwgcHJic19nZW5lcmF0b3IsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfQUVfTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfQUVfTklfQ0ZHX0lEX1BSQlNfR0VORVJBVE9SLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgYWVfbmksIHByYnNfZ2VuZXJhdG9yLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInByYnNfY2hlY2tlci4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2NoZWNrZXIucG9seW5vbSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnBvbHlub20gPSAoYmNtb2x0X3ByYnNfcG9seW5vbWlhbCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByYnNfY2hlY2tlci5wb2x5bm9tIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19jaGVja2VyLm1vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tb2RlID0gKGJjbW9sdF9wcmJzX2NoZWNrZXJfbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByYnNfY2hlY2tlci5tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19jaGVja2VyLmRhdGFfaW52ZXJ0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZGF0YV9pbnZlcnQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByYnNfY2hlY2tlci5kYXRhX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfY2hlY2tlci5jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY29udHJvbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByYnNfY2hlY2tlci5jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgYWVfbmksIHByYnNfY2hlY2tlciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfQUVfTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfQUVfTklfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGFlX25pLCBwcmJzX2NoZWNrZXIsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfYWVfbmlfY2ZnX2NsZWFyKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9hZV9uaV9jZmcgY2ZnOyAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2FlX25pX2tleSBrZXkgPSB7IH07IC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hZV9uaV9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2FlX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2NsZWFyIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWVfbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5hZV9uaSA9IChiY21vbHRfYWVfbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWVfbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmFlX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0FFX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0FFX05JX0tFWV9JRF9BRV9OSSwgJmtleS5hZV9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGFlX25pLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBhZV9uaSwga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2FlX25pX2NmZ19nZXRfbXVsdGkoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfYWVfbmlfY2ZnIGNmZzsgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfYWVfbmlfa2V5IGtleSA9IHsgfTsgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbXNnX3NldCAqbXNnX3NldCA9IE5VTEw7IC8qKjwgZGVjbGFyZSBtZXNzYWdlIHNldCAqLworICAgIHVpbnQzMl90IG1heF9tc2dzOyAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgIC8qKjwgZGVjbGFyZSBmaWx0ZXIgaW52ZXJ0IGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hZV9uaV9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2FlX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXQqIG1zZ19zZXQgPSBOVUxMO1xuIik7CisgICAgYmNtY2xpX2xvZygidWludDMyX3QgbWF4X21zZ3M7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGludmVydF9maWx0ZXI7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0X211bHRpIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWVfbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5hZV9uaSA9IChiY21vbHRfYWVfbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWVfbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmFlX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0FFX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0FFX05JX0tFWV9JRF9BRV9OSSwgJmtleS5hZV9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX0FFX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfQUVfTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGFlX25pLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBhZV9uaSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubWFjX2FkZHJlc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX21hY19hZGRyZXNzIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm1hYzsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBhZV9uaSwgbWFjX2FkZHJlc3MsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgYWVfbmksIG1hY19hZGRyZXNzLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0FFX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0FFX05JX0NGR19JRF9NQUNfQUREUkVTUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgYWVfbmksIG1hY19hZGRyZXNzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGFlX25pLCBtYWNfYWRkcmVzcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFlX25pX2VuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYWVfbmlfZW5fc3RhdGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2FlX25pX2VuX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgYWVfbmksIGFlX25pX2VuLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGFlX25pLCBhZV9uaV9lbiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9BRV9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9BRV9OSV9DRkdfSURfQUVfTklfRU4sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhZV9uaV9lbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGFlX25pLCBhZV9uaV9lbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBhZV9uaSwgYWVfbmlfZW4pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5tdHVfMTBnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MTZfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGFlX25pLCBtdHVfMTBnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGFlX25pLCBtdHVfMTBnLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0FFX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0FFX05JX0NGR19JRF9NVFVfMTBHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXR1XzEwZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGFlX25pLCBtdHVfMTBnKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGFlX25pLCBtdHVfMTBnKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnByYnNfZ2VuZXJhdG9yLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfZ2VuZXJhdG9yLnBvbHlub20iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wb2x5bm9tID0gKGJjbW9sdF9wcmJzX3BvbHlub21pYWwpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19nZW5lcmF0b3IucG9seW5vbSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX2dlbmVyYXRvci5lcnJvcl9pbnNlcnQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5lcnJvcl9pbnNlcnQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX2dlbmVyYXRvci5lcnJvcl9pbnNlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19nZW5lcmF0b3IuaW52ZXJ0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaW52ZXJ0ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19nZW5lcmF0b3IuaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfZ2VuZXJhdG9yLmNvbnRyb2wiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jb250cm9sID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByYnNfZ2VuZXJhdG9yLmNvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBhZV9uaSwgcHJic19nZW5lcmF0b3IsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfQUVfTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfQUVfTklfQ0ZHX0lEX1BSQlNfR0VORVJBVE9SLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgYWVfbmksIHByYnNfZ2VuZXJhdG9yLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19nZW5lcmF0b3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBhZV9uaSwgcHJic19nZW5lcmF0b3IpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgYWVfbmksIHByYnNfZ2VuZXJhdG9yKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnByYnNfY2hlY2tlci4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19jaGVja2VyLnBvbHlub20iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wb2x5bm9tID0gKGJjbW9sdF9wcmJzX3BvbHlub21pYWwpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19jaGVja2VyLnBvbHlub20gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19jaGVja2VyLm1vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tb2RlID0gKGJjbW9sdF9wcmJzX2NoZWNrZXJfbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX2NoZWNrZXIubW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX2NoZWNrZXIuZGF0YV9pbnZlcnQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kYXRhX2ludmVydCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByYnNfY2hlY2tlci5kYXRhX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX2NoZWNrZXIuY29udHJvbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNvbnRyb2wgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19jaGVja2VyLmNvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBhZV9uaSwgcHJic19jaGVja2VyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9BRV9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9BRV9OSV9DRkdfSURfUFJCU19DSEVDS0VSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgYWVfbmksIHByYnNfY2hlY2tlciwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfY2hlY2tlciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGFlX25pLCBwcmJzX2NoZWNrZXIpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgYWVfbmksIHByYnNfY2hlY2tlcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5wcmJzX3N0YXR1cy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wcmJzX3N0YXR1cyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfc3RhdHVzLmxvY2tfc3RhdGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb2NrX3N0YXRlID0gKGJjbW9sdF9wcmJzX2xvY2tfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19zdGF0dXMubG9ja19zdGF0ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX3N0YXR1cy5lcnJvcl9jb3VudHMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5lcnJvcl9jb3VudHMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19zdGF0dXMuZXJyb3JfY291bnRzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgYWVfbmksIHByYnNfc3RhdHVzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3ByYnNfc3RhdHVzIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfQUVfTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfQUVfTklfQ0ZHX0lEX1BSQlNfU1RBVFVTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgYWVfbmksIHByYnNfc3RhdHVzLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19zdGF0dXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBhZV9uaSwgcHJic19zdGF0dXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgYWVfbmksIHByYnNfc3RhdHVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBhZV9uaSwgbWFjX2FkZHJlc3MpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBhZV9uaSwgYWVfbmlfZW4pICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBhZV9uaSwgbXR1XzEwZykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGFlX25pLCBwcmJzX2dlbmVyYXRvcikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGFlX25pLCBwcmJzX2NoZWNrZXIpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBhZV9uaSwgcHJic19zdGF0dXMpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgYWVfbmksIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgYWVfbmksIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfYWVfbmlfb3Blcl9zZXRfYWVfbmlfZW5fc3RhdGVfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGUgb3BlcjsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2FlX25pX2tleSBrZXkgPSB7IH07ICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGUgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hZV9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWVfbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5hZV9uaSA9IChiY21vbHRfYWVfbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWVfbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmFlX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0FFX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0FFX05JX0tFWV9JRF9BRV9OSSwgJmtleS5hZV9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgYWVfbmksIHNldF9hZV9uaV9lbl9zdGF0ZSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBhZV9uaSwgc2V0X2FlX25pX2VuX3N0YXRlLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm5ld19zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2FlX25pX2VuX3N0YXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9hZV9uaV9lbl9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgYWVfbmksIHNldF9hZV9uaV9lbl9zdGF0ZSwgbmV3X3N0YXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgYWVfbmksIHNldF9hZV9uaV9lbl9zdGF0ZSwgbmV3X3N0YXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0FFX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9BRV9OSV9PUEVSX0lEX1NFVF9BRV9OSV9FTl9TVEFURSwgQkNNT0xUX0FFX05JX1NFVF9BRV9OSV9FTl9TVEFURV9JRF9ORVdfU1RBVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9hZV9wYXRoX2RzX3N0YXRfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXQgc3RhdDsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfYWVfcGF0aF9kc19rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb3NfYm9vbCBjbGVhcl9vbl9yZWFkOyAgICAgICAgICAgLyoqPCBkZWNsYXJlICdjbGVhciBvbiByZWFkJyBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYWVfcGF0aF9kc19zdGF0IHN0YXQ7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYWVfcGF0aF9kc19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWVfbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5hZV9uaSA9IChiY21vbHRfYWVfbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWVfbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmFlX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0FFX1BBVEhfRFMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfQUVfUEFUSF9EU19LRVlfSURfQUVfTkksICZrZXkuYWVfbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgZmxhZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjbGVhciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY2xlYXJfb25fcmVhZCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjbGVhciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJjbGVhcl9vbl9yZWFkID0gJXM7XG4iLCAoY2xlYXJfb25fcmVhZCkgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfU1RBVF9JTklUKCZzdGF0LCBhZV9wYXRoX2RzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0lOSVQoJnN0YXQsIGFlX3BhdGhfZHMsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYnl0ZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF9kcywgYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfZHMsIGJ5dGVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF9kcywgZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBmcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc182NCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBmcmFtZXNfNjQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfZHMsIGZyYW1lc182NCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzY1XzEyNyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBmcmFtZXNfNjVfMTI3KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBmcmFtZXNfNjVfMTI3KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfMTI4XzI1NSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBmcmFtZXNfMTI4XzI1NSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF9kcywgZnJhbWVzXzEyOF8yNTUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc18yNTZfNTExIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfZHMsIGZyYW1lc18yNTZfNTExKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBmcmFtZXNfMjU2XzUxMSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzUxMl8xMDIzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfZHMsIGZyYW1lc181MTJfMTAyMyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF9kcywgZnJhbWVzXzUxMl8xMDIzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfMTAyNF8xNTE4Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfZHMsIGZyYW1lc18xMDI0XzE1MTgpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfZHMsIGZyYW1lc18xMDI0XzE1MTgpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc18xNTE5XzIwNDciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF9kcywgZnJhbWVzXzE1MTlfMjA0Nyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF9kcywgZnJhbWVzXzE1MTlfMjA0Nyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzIwNDhfNDA5NSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBmcmFtZXNfMjA0OF80MDk1KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBmcmFtZXNfMjA0OF80MDk1KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfNDA5Nl85MjE2Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfZHMsIGZyYW1lc180MDk2XzkyMTYpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfZHMsIGZyYW1lc180MDk2XzkyMTYpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc185MjE3XzE2MzgzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfZHMsIGZyYW1lc185MjE3XzE2MzgzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBmcmFtZXNfOTIxN18xNjM4Myk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYnJvYWRjYXN0X2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBicm9hZGNhc3RfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBicm9hZGNhc3RfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkYXRhX2J5dGVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfZHMsIGRhdGFfYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfZHMsIGRhdGFfYnl0ZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm11bHRpY2FzdF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF9kcywgbXVsdGljYXN0X2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF9kcywgbXVsdGljYXN0X2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidW5pY2FzdF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF9kcywgdW5pY2FzdF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfZHMsIHVuaWNhc3RfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhYm9ydF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF9kcywgYWJvcnRfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBhYm9ydF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBieXRlcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBmcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgYWVfcGF0aF9kcywgZnJhbWVzXzY0KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGFlX3BhdGhfZHMsIGZyYW1lc182NV8xMjcpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgYWVfcGF0aF9kcywgZnJhbWVzXzEyOF8yNTUpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgYWVfcGF0aF9kcywgZnJhbWVzXzI1Nl81MTEpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgYWVfcGF0aF9kcywgZnJhbWVzXzUxMl8xMDIzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGFlX3BhdGhfZHMsIGZyYW1lc18xMDI0XzE1MTgpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgYWVfcGF0aF9kcywgZnJhbWVzXzE1MTlfMjA0NykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBmcmFtZXNfMjA0OF80MDk1KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGFlX3BhdGhfZHMsIGZyYW1lc180MDk2XzkyMTYpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgYWVfcGF0aF9kcywgZnJhbWVzXzkyMTdfMTYzODMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgYWVfcGF0aF9kcywgYnJvYWRjYXN0X2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBkYXRhX2J5dGVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGFlX3BhdGhfZHMsIG11bHRpY2FzdF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgYWVfcGF0aF9kcywgdW5pY2FzdF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgYWVfcGF0aF9kcywgYWJvcnRfZnJhbWVzKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX2RzLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfZ2V0KGRldmljZV9pZCwgJnN0YXQuaGRyLCBjbGVhcl9vbl9yZWFkKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXQuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdC5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfYWVfcGF0aF9kc19zdGF0X2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmcgc3RhdF9jZmc7ICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfYWVfcGF0aF9kc19rZXkga2V5ID0geyB9OyAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfaWQgc3RhdF9pZDsgICAgICAvKio8IGRlY2xhcmUgc3RhdCBJRCAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYWVfcGF0aF9kc19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFlX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuYWVfbmkgPSAoYmNtb2x0X2FlX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFlX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5hZV9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9BRV9QQVRIX0RTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0FFX1BBVEhfRFNfS0VZX0lEX0FFX05JLCAma2V5LmFlX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IElEIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBzdGF0X2lkID0gKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBzd2l0Y2ggKHN0YXRfaWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGJ5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU182NDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZnJhbWVzXzY0LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXNfNjQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzY1XzEyNzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZnJhbWVzXzY1XzEyNywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZnJhbWVzXzY1XzEyNywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZnJhbWVzXzEyOF8yNTUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGZyYW1lc18xMjhfMjU1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXNfMjU2XzUxMSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZnJhbWVzXzI1Nl81MTEsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXNfNTEyXzEwMjMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGZyYW1lc181MTJfMTAyMywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXNfMTAyNF8xNTE4LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXNfMTAyNF8xNTE4LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDc6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGZyYW1lc18xNTE5XzIwNDcsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGZyYW1lc18xNTE5XzIwNDcsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZnJhbWVzXzIwNDhfNDA5NSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZnJhbWVzXzIwNDhfNDA5NSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXNfNDA5Nl85MjE2LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXNfNDA5Nl85MjE2LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXNfOTIxN18xNjM4Mywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZnJhbWVzXzkyMTdfMTYzODMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgYnJvYWRjYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgYnJvYWRjYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9EQVRBX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBkYXRhX2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBkYXRhX2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIG11bHRpY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIG11bHRpY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIHVuaWNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCB1bmljYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9BQk9SVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGFib3J0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgYWJvcnRfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXRfY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9hZV9wYXRoX2RzX3N0YXRfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZyBzdGF0X2NmZzsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9hZV9wYXRoX2RzX2tleSBrZXkgPSB7IH07ICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9pZCBzdGF0X2lkOyAgICAgIC8qKjwgZGVjbGFyZSBzdGF0IElEICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZyBzdGF0X2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hZV9wYXRoX2RzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWVfbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5hZV9uaSA9IChiY21vbHRfYWVfbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWVfbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmFlX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0FFX1BBVEhfRFMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfQUVfUEFUSF9EU19LRVlfSURfQUVfTkksICZrZXkuYWVfbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIHN3aXRjaCAoc3RhdF9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGJ5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzY0OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXNfNjQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGZyYW1lc182NCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXNfNjVfMTI3LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXNfNjVfMTI3LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXNfMTI4XzI1NSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZnJhbWVzXzEyOF8yNTUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTE6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGZyYW1lc18yNTZfNTExLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXNfMjU2XzUxMSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGZyYW1lc181MTJfMTAyMywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZnJhbWVzXzUxMl8xMDIzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTg6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGZyYW1lc18xMDI0XzE1MTgsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGZyYW1lc18xMDI0XzE1MTgsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZnJhbWVzXzE1MTlfMjA0Nywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgZnJhbWVzXzE1MTlfMjA0Nywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXNfMjA0OF80MDk1LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXNfMjA0OF80MDk1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTY6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGZyYW1lc180MDk2XzkyMTYsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGZyYW1lc180MDk2XzkyMTYsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGZyYW1lc185MjE3XzE2MzgzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBmcmFtZXNfOTIxN18xNjM4Mywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBicm9hZGNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBicm9hZGNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0RBVEFfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGRhdGFfYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGRhdGFfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgbXVsdGljYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgbXVsdGljYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgdW5pY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIHVuaWNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0FCT1JUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF9kcywgYWJvcnRfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBhYm9ydF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnR5cGUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnR5cGUgPSAoYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHZhbC50cmlnZ2VyLnR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5yaXNpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV90aHJlc2hvbGQucmlzaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5yaXNpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5mYWxsaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLmZhbGxpbmcgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmZhbGxpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9SQU5HRToKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci51cHBlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLnVwcGVyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci51cHBlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmxvd2VyIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfcmFuZ2UubG93ZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxvd2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1ZBTFVFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5saW1pdCIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS52YWx1ZV90aHJlc2hvbGQubGltaXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxpbWl0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX05PTkU6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnNvYWsuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnNvYWsuY2xlYXJfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9TVEFUX0NGR19QUk9QX1NFVCgmc3RhdF9jZmcsIGFlX3BhdGhfZHMsIGNmZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0FFX1BBVEhfRFMsIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkcsIDAsIEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfQ0ZHX0lEX0NGRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCBhZV9wYXRoX2RzLCBjZmcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdF9jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2FlX3BhdGhfZHNfYXV0b19jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnIGF1dG9fY2ZnOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2FlX3BhdGhfZHNfa2V5IGtleSA9IHsgfTsgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2FlX3BhdGhfZHNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19nZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGFlX3BhdGhfZHMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBhZV9wYXRoX2RzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fY2xlYXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGFlX3BhdGhfZHMsIHN0YXRfYWxhcm1fY2xlYXJlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBhZV9wYXRoX2RzLCBzdGF0X2FsYXJtX2NsZWFyZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fcmFpc2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgYWVfcGF0aF9kcywgc3RhdF9hbGFybV9yYWlzZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgYWVfcGF0aF9kcywgc3RhdF9hbGFybV9yYWlzZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGFlX3BhdGhfZHMsIHN0YXRfYWxhcm1fY2xlYXJlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGFlX3BhdGhfZHMsIHN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGFlX3BhdGhfZHMsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgYWVfcGF0aF9kcywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmYXV0b19jZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2FlX3BhdGhfZHNfYXV0b19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnIGF1dG9fY2ZnOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2FlX3BhdGhfZHNfa2V5IGtleSA9IHsgfTsgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2FlX3BhdGhfZHNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19zZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGFlX3BhdGhfZHMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBhZV9wYXRoX2RzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fY2xlYXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGFlX3BhdGhfZHMsIHN0YXRfYWxhcm1fY2xlYXJlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgYWVfcGF0aF9kcywgc3RhdF9hbGFybV9jbGVhcmVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0FFX1BBVEhfRFMsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9BRV9QQVRIX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fcmFpc2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgYWVfcGF0aF9kcywgc3RhdF9hbGFybV9yYWlzZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGFlX3BhdGhfZHMsIHN0YXRfYWxhcm1fcmFpc2VkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0FFX1BBVEhfRFMsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9BRV9QQVRIX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9hZV9wYXRoX3VzX3N0YXRfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXQgc3RhdDsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfYWVfcGF0aF91c19rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb3NfYm9vbCBjbGVhcl9vbl9yZWFkOyAgICAgICAgICAgLyoqPCBkZWNsYXJlICdjbGVhciBvbiByZWFkJyBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYWVfcGF0aF91c19zdGF0IHN0YXQ7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYWVfcGF0aF91c19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWVfbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5hZV9uaSA9IChiY21vbHRfYWVfbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWVfbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmFlX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0FFX1BBVEhfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfQUVfUEFUSF9VU19LRVlfSURfQUVfTkksICZrZXkuYWVfbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgZmxhZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjbGVhciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY2xlYXJfb25fcmVhZCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjbGVhciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJjbGVhcl9vbl9yZWFkID0gJXM7XG4iLCAoY2xlYXJfb25fcmVhZCkgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfU1RBVF9JTklUKCZzdGF0LCBhZV9wYXRoX3VzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0lOSVQoJnN0YXQsIGFlX3BhdGhfdXMsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYnl0ZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF91cywgYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGJ5dGVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF91cywgZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBmcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc182NCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBmcmFtZXNfNjQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGZyYW1lc182NCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzY1XzEyNyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBmcmFtZXNfNjVfMTI3KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBmcmFtZXNfNjVfMTI3KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfMTI4XzI1NSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBmcmFtZXNfMTI4XzI1NSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF91cywgZnJhbWVzXzEyOF8yNTUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc18yNTZfNTExIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGZyYW1lc18yNTZfNTExKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBmcmFtZXNfMjU2XzUxMSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzUxMl8xMDIzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGZyYW1lc181MTJfMTAyMyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF91cywgZnJhbWVzXzUxMl8xMDIzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfMTAyNF8xNTE4Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGZyYW1lc18xMDI0XzE1MTgpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGZyYW1lc18xMDI0XzE1MTgpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc18xNTE5XzIwNDciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF91cywgZnJhbWVzXzE1MTlfMjA0Nyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF91cywgZnJhbWVzXzE1MTlfMjA0Nyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzIwNDhfNDA5NSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBmcmFtZXNfMjA0OF80MDk1KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBmcmFtZXNfMjA0OF80MDk1KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfNDA5Nl85MjE2Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGZyYW1lc180MDk2XzkyMTYpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGZyYW1lc180MDk2XzkyMTYpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc185MjE3XzE2MzgzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGZyYW1lc185MjE3XzE2MzgzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBmcmFtZXNfOTIxN18xNjM4Myk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYnJvYWRjYXN0X2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBicm9hZGNhc3RfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBicm9hZGNhc3RfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkYXRhX2J5dGVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGRhdGFfYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGRhdGFfYnl0ZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm11bHRpY2FzdF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF91cywgbXVsdGljYXN0X2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF91cywgbXVsdGljYXN0X2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidW5pY2FzdF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF91cywgdW5pY2FzdF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfdXMsIHVuaWNhc3RfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhYm9ydF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF91cywgYWJvcnRfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBhYm9ydF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZjc19lcnJvciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBmY3NfZXJyb3IpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGZjc19lcnJvcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib3ZlcnNpemVfZXJyb3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgYWVfcGF0aF91cywgb3ZlcnNpemVfZXJyb3IpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfdXMsIG92ZXJzaXplX2Vycm9yKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJydW50X2Vycm9yIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfdXMsIHJ1bnRfZXJyb3IpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGFlX3BhdGhfdXMsIHJ1bnRfZXJyb3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBieXRlcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBmcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgYWVfcGF0aF91cywgZnJhbWVzXzY0KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGZyYW1lc182NV8xMjcpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgYWVfcGF0aF91cywgZnJhbWVzXzEyOF8yNTUpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgYWVfcGF0aF91cywgZnJhbWVzXzI1Nl81MTEpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgYWVfcGF0aF91cywgZnJhbWVzXzUxMl8xMDIzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGZyYW1lc18xMDI0XzE1MTgpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgYWVfcGF0aF91cywgZnJhbWVzXzE1MTlfMjA0NykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBmcmFtZXNfMjA0OF80MDk1KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGZyYW1lc180MDk2XzkyMTYpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgYWVfcGF0aF91cywgZnJhbWVzXzkyMTdfMTYzODMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgYWVfcGF0aF91cywgYnJvYWRjYXN0X2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBkYXRhX2J5dGVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGFlX3BhdGhfdXMsIG11bHRpY2FzdF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgYWVfcGF0aF91cywgdW5pY2FzdF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgYWVfcGF0aF91cywgYWJvcnRfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGFlX3BhdGhfdXMsIGZjc19lcnJvcikgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBvdmVyc2l6ZV9lcnJvcikgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBydW50X2Vycm9yKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBhZV9wYXRoX3VzLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfZ2V0KGRldmljZV9pZCwgJnN0YXQuaGRyLCBjbGVhcl9vbl9yZWFkKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXQuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdC5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfYWVfcGF0aF91c19zdGF0X2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmcgc3RhdF9jZmc7ICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfYWVfcGF0aF91c19rZXkga2V5ID0geyB9OyAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfaWQgc3RhdF9pZDsgICAgICAvKio8IGRlY2xhcmUgc3RhdCBJRCAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYWVfcGF0aF91c19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFlX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuYWVfbmkgPSAoYmNtb2x0X2FlX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFlX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5hZV9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9BRV9QQVRIX1VTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0FFX1BBVEhfVVNfS0VZX0lEX0FFX05JLCAma2V5LmFlX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IElEIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBzdGF0X2lkID0gKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBzd2l0Y2ggKHN0YXRfaWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGJ5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU182NDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZnJhbWVzXzY0LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXNfNjQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzY1XzEyNzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZnJhbWVzXzY1XzEyNywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZnJhbWVzXzY1XzEyNywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZnJhbWVzXzEyOF8yNTUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGZyYW1lc18xMjhfMjU1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXNfMjU2XzUxMSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZnJhbWVzXzI1Nl81MTEsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXNfNTEyXzEwMjMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGZyYW1lc181MTJfMTAyMywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXNfMTAyNF8xNTE4LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXNfMTAyNF8xNTE4LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDc6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGZyYW1lc18xNTE5XzIwNDcsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGZyYW1lc18xNTE5XzIwNDcsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZnJhbWVzXzIwNDhfNDA5NSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZnJhbWVzXzIwNDhfNDA5NSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXNfNDA5Nl85MjE2LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXNfNDA5Nl85MjE2LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXNfOTIxN18xNjM4Mywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZnJhbWVzXzkyMTdfMTYzODMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgYnJvYWRjYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgYnJvYWRjYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9EQVRBX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBkYXRhX2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBkYXRhX2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIG11bHRpY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIG11bHRpY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIHVuaWNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCB1bmljYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9BQk9SVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGFib3J0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgYWJvcnRfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZDU19FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZmNzX2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmY3NfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfT1ZFUlNJWkVfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIG92ZXJzaXplX2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBvdmVyc2l6ZV9lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9SVU5UX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBydW50X2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBydW50X2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXRfY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9hZV9wYXRoX3VzX3N0YXRfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZyBzdGF0X2NmZzsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9hZV9wYXRoX3VzX2tleSBrZXkgPSB7IH07ICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9pZCBzdGF0X2lkOyAgICAgIC8qKjwgZGVjbGFyZSBzdGF0IElEICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZyBzdGF0X2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hZV9wYXRoX3VzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWVfbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5hZV9uaSA9IChiY21vbHRfYWVfbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWVfbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmFlX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0FFX1BBVEhfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfQUVfUEFUSF9VU19LRVlfSURfQUVfTkksICZrZXkuYWVfbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIHN3aXRjaCAoc3RhdF9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGJ5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzY0OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXNfNjQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGZyYW1lc182NCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXNfNjVfMTI3LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXNfNjVfMTI3LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXNfMTI4XzI1NSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZnJhbWVzXzEyOF8yNTUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTE6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGZyYW1lc18yNTZfNTExLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXNfMjU2XzUxMSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGZyYW1lc181MTJfMTAyMywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZnJhbWVzXzUxMl8xMDIzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTg6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGZyYW1lc18xMDI0XzE1MTgsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGZyYW1lc18xMDI0XzE1MTgsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZnJhbWVzXzE1MTlfMjA0Nywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgZnJhbWVzXzE1MTlfMjA0Nywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXNfMjA0OF80MDk1LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXNfMjA0OF80MDk1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTY6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGZyYW1lc180MDk2XzkyMTYsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGZyYW1lc180MDk2XzkyMTYsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGZyYW1lc185MjE3XzE2MzgzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmcmFtZXNfOTIxN18xNjM4Mywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBicm9hZGNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBicm9hZGNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0RBVEFfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGRhdGFfYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGRhdGFfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgbXVsdGljYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgbXVsdGljYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgdW5pY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIHVuaWNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0FCT1JUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgYWJvcnRfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBhYm9ydF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRkNTX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBmY3NfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGZjc19lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9PVkVSU0laRV9FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgYWVfcGF0aF91cywgb3ZlcnNpemVfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIG92ZXJzaXplX2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX1JVTlRfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIHJ1bnRfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIHJ1bnRfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnR5cGUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnR5cGUgPSAoYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHZhbC50cmlnZ2VyLnR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5yaXNpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV90aHJlc2hvbGQucmlzaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5yaXNpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5mYWxsaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLmZhbGxpbmcgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmZhbGxpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9SQU5HRToKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci51cHBlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLnVwcGVyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci51cHBlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmxvd2VyIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfcmFuZ2UubG93ZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxvd2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1ZBTFVFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5saW1pdCIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS52YWx1ZV90aHJlc2hvbGQubGltaXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxpbWl0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX05PTkU6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnNvYWsuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnNvYWsuY2xlYXJfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9TVEFUX0NGR19QUk9QX1NFVCgmc3RhdF9jZmcsIGFlX3BhdGhfdXMsIGNmZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0FFX1BBVEhfVVMsIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkcsIDAsIEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfQ0ZHX0lEX0NGRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCBhZV9wYXRoX3VzLCBjZmcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdF9jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2FlX3BhdGhfdXNfYXV0b19jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnIGF1dG9fY2ZnOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2FlX3BhdGhfdXNfa2V5IGtleSA9IHsgfTsgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2FlX3BhdGhfdXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19nZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGFlX3BhdGhfdXMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBhZV9wYXRoX3VzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fY2xlYXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGFlX3BhdGhfdXMsIHN0YXRfYWxhcm1fY2xlYXJlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBhZV9wYXRoX3VzLCBzdGF0X2FsYXJtX2NsZWFyZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fcmFpc2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgYWVfcGF0aF91cywgc3RhdF9hbGFybV9yYWlzZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgYWVfcGF0aF91cywgc3RhdF9hbGFybV9yYWlzZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGFlX3BhdGhfdXMsIHN0YXRfYWxhcm1fY2xlYXJlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGFlX3BhdGhfdXMsIHN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGFlX3BhdGhfdXMsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgYWVfcGF0aF91cywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmYXV0b19jZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2FlX3BhdGhfdXNfYXV0b19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnIGF1dG9fY2ZnOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2FlX3BhdGhfdXNfa2V5IGtleSA9IHsgfTsgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2FlX3BhdGhfdXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19zZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGFlX3BhdGhfdXMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBhZV9wYXRoX3VzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fY2xlYXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGFlX3BhdGhfdXMsIHN0YXRfYWxhcm1fY2xlYXJlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgYWVfcGF0aF91cywgc3RhdF9hbGFybV9jbGVhcmVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0FFX1BBVEhfVVMsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9BRV9QQVRIX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fcmFpc2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgYWVfcGF0aF91cywgc3RhdF9hbGFybV9yYWlzZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGFlX3BhdGhfdXMsIHN0YXRfYWxhcm1fcmFpc2VkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0FFX1BBVEhfVVMsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9BRV9QQVRIX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9jaGFubmVsX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2NoYW5uZWxfY2ZnIGNmZzsgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2NoYW5uZWxfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2hhbm5lbF9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NoYW5uZWxfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9wb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfQ0hBTk5FTCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9DSEFOTkVMX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgY2hhbm5lbCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgY2hhbm5lbCwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvcGVyYXRpb25fY29udHJvbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgY2hhbm5lbCwgb3BlcmF0aW9uX2NvbnRyb2wpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBjaGFubmVsLCBvcGVyYXRpb25fY29udHJvbCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidG9sIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBjaGFubmVsLCB0b2wpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBjaGFubmVsLCB0b2wpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN5c3RlbV9wcm9maWxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBjaGFubmVsLCBzeXN0ZW1fcHJvZmlsZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGNoYW5uZWwsIHN5c3RlbV9wcm9maWxlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjaGFubmVsX3Byb2ZpbGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGNoYW5uZWwsIGNoYW5uZWxfcHJvZmlsZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGNoYW5uZWwsIGNoYW5uZWxfcHJvZmlsZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBjaGFubmVsLCBvcGVyYXRpb25fY29udHJvbCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgY2hhbm5lbCwgdG9sKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBjaGFubmVsLCBzeXN0ZW1fcHJvZmlsZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgY2hhbm5lbCwgY2hhbm5lbF9wcm9maWxlKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgY2hhbm5lbCwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGNoYW5uZWwsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9jaGFubmVsX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2NoYW5uZWxfY2ZnIGNmZzsgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2NoYW5uZWxfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2hhbm5lbF9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NoYW5uZWxfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9wb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfQ0hBTk5FTCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9DSEFOTkVMX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgY2hhbm5lbCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgY2hhbm5lbCwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAib3BlcmF0aW9uX2NvbnRyb2wuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfb3BlcmF0aW9uX2NvbnRyb2wgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9wZXJhdGlvbl9jb250cm9sLnJlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvcGVyYXRpb25fY29udHJvbC5yZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9wZXJhdGlvbl9jb250cm9sLm9kbl9jbGFzcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm9kbl9jbGFzcyA9IChiY21vbHRfb2RuX2NsYXNzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib3BlcmF0aW9uX2NvbnRyb2wub2RuX2NsYXNzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib3BlcmF0aW9uX2NvbnRyb2wuZHNfZmVjX21vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kc19mZWNfbW9kZSA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9wZXJhdGlvbl9jb250cm9sLmRzX2ZlY19tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib3BlcmF0aW9uX2NvbnRyb2wucHJvdG9jb2wiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wcm90b2NvbCA9IChiY21vbHRfdGNfcHJvdG9jb2wpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvcGVyYXRpb25fY29udHJvbC5wcm90b2NvbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9wZXJhdGlvbl9jb250cm9sLmRzX2xpbmtfdHlwZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRzX2xpbmtfdHlwZSA9IChiY21vbHRfbGlua190eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib3BlcmF0aW9uX2NvbnRyb2wuZHNfbGlua190eXBlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgIm9wZXJhdGlvbl9jb250cm9sLnBvbl9pZC4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib3BlcmF0aW9uX2NvbnRyb2wucG9uX2lkLmFkbWluaXN0cmF0aXZlX2xhYmVsIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucG9uX2lkLmFkbWluaXN0cmF0aXZlX2xhYmVsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9wZXJhdGlvbl9jb250cm9sLnBvbl9pZC5hZG1pbmlzdHJhdGl2ZV9sYWJlbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9wZXJhdGlvbl9jb250cm9sLnBvbl9pZC5kd2xjaF9pZCIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnBvbl9pZC5kd2xjaF9pZCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvcGVyYXRpb25fY29udHJvbC5wb25faWQuZHdsY2hfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvcGVyYXRpb25fY29udHJvbC5wb25faWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvcGVyYXRpb25fY29udHJvbC5jIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9wZXJhdGlvbl9jb250cm9sLmMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBjaGFubmVsLCBvcGVyYXRpb25fY29udHJvbCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyYXRpb25fY29udHJvbCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0NIQU5ORUwsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfQ0hBTk5FTF9DRkdfSURfT1BFUkFUSU9OX0NPTlRST0wsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBjaGFubmVsLCBvcGVyYXRpb25fY29udHJvbCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRvbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDE2X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBjaGFubmVsLCB0b2wsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgY2hhbm5lbCwgdG9sLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0NIQU5ORUwsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfQ0hBTk5FTF9DRkdfSURfVE9MLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInN5c3RlbV9wcm9maWxlLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3N5c3RlbV9wcm9maWxlIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzeXN0ZW1fcHJvZmlsZS5uZ18yX3N5c19pZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm5nXzJfc3lzX2lkID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3lzdGVtX3Byb2ZpbGUubmdfMl9zeXNfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzeXN0ZW1fcHJvZmlsZS52ZXJzaW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudmVyc2lvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN5c3RlbV9wcm9maWxlLnZlcnNpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzeXN0ZW1fcHJvZmlsZS5jaGFubmVsX3NwYWNpbmciKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jaGFubmVsX3NwYWNpbmcgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzeXN0ZW1fcHJvZmlsZS5jaGFubmVsX3NwYWNpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzeXN0ZW1fcHJvZmlsZS51c19vcGVyYXRpbmdfd2F2ZWxlbmd0aF9iYW5kcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnVzX29wZXJhdGluZ193YXZlbGVuZ3RoX2JhbmRzID0gKGJjbW9sdF91c19vcGVyYXRpbmdfd2F2ZWxlbmd0aF9iYW5kcykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN5c3RlbV9wcm9maWxlLnVzX29wZXJhdGluZ193YXZlbGVuZ3RoX2JhbmRzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3lzdGVtX3Byb2ZpbGUudXNfbXNlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudXNfbXNlID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3lzdGVtX3Byb2ZpbGUudXNfbXNlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3lzdGVtX3Byb2ZpbGUubG9vc2VfY2FsaWJyYXRpb25fYm91bmQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb29zZV9jYWxpYnJhdGlvbl9ib3VuZCA9IChiY21vbHRfY2FsaWJyYXRpb25fcmVjb3JkKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3lzdGVtX3Byb2ZpbGUubG9vc2VfY2FsaWJyYXRpb25fYm91bmQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzeXN0ZW1fcHJvZmlsZS5mc3IiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5mc3IgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzeXN0ZW1fcHJvZmlsZS5mc3IgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzeXN0ZW1fcHJvZmlsZS50d2RtX2NoYW5uZWxfY291bnQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50d2RtX2NoYW5uZWxfY291bnQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzeXN0ZW1fcHJvZmlsZS50d2RtX2NoYW5uZWxfY291bnQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBjaGFubmVsLCBzeXN0ZW1fcHJvZmlsZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9zeXN0ZW1fcHJvZmlsZSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0NIQU5ORUwsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfQ0hBTk5FTF9DRkdfSURfU1lTVEVNX1BST0ZJTEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBjaGFubmVsLCBzeXN0ZW1fcHJvZmlsZSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjaGFubmVsX3Byb2ZpbGUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYXJyX2NoYW5uZWxfcHJvZmlsZV84IHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2hhbm5lbF9wcm9maWxlLmFyci4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgaTA7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gOCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXJyYXkgY2hhbm5lbF9wcm9maWxlLmFyciBtdXN0IGhhdmUgOCBlbGVtZW50c1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjaGFubmVsX3Byb2ZpbGUuYXJyLnZlcnNpb24iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNoYW5uZWxfcHJvZmlsZS5hcnIudmVyc2lvbiBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDg7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS52ZXJzaW9uID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2hhbm5lbF9wcm9maWxlLmFyci5jaGFubmVsX2luZGV4Iik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gOCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjaGFubmVsX3Byb2ZpbGUuYXJyLmNoYW5uZWxfaW5kZXggaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA4OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0uY2hhbm5lbF9pbmRleCA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNoYW5uZWxfcHJvZmlsZS5hcnIuZHNfZnJlcXVlbmN5X29mZnNldC5zaWduIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gOCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjaGFubmVsX3Byb2ZpbGUuYXJyLmRzX2ZyZXF1ZW5jeV9vZmZzZXQuc2lnbiBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDg7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5kc19mcmVxdWVuY3lfb2Zmc2V0LnNpZ24gPSAoYmNtb2x0X3NpZ24pIGNsaV9wYXJtLT52YWx1ZXNbaTBdLmVudW1fdmFsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjaGFubmVsX3Byb2ZpbGUuYXJyLmRzX2ZyZXF1ZW5jeV9vZmZzZXQudmFsdWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNoYW5uZWxfcHJvZmlsZS5hcnIuZHNfZnJlcXVlbmN5X29mZnNldC52YWx1ZSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDg7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5kc19mcmVxdWVuY3lfb2Zmc2V0LnZhbHVlID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2hhbm5lbF9wcm9maWxlLmFyci5jaGFubmVsX3BhcnRpdGlvbiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2hhbm5lbF9wcm9maWxlLmFyci5jaGFubmVsX3BhcnRpdGlvbiBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDg7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5jaGFubmVsX3BhcnRpdGlvbiA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNoYW5uZWxfcHJvZmlsZS5hcnIudXdsY2hfaWQiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNoYW5uZWxfcHJvZmlsZS5hcnIudXdsY2hfaWQgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA4OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0udXdsY2hfaWQgPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjaGFubmVsX3Byb2ZpbGUuYXJyLnVzX2ZyZXF1ZW5jeSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2hhbm5lbF9wcm9maWxlLmFyci51c19mcmVxdWVuY3kgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA4OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0udXNfZnJlcXVlbmN5ID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2hhbm5lbF9wcm9maWxlLmFyci51c19yYXRlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gOCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjaGFubmVsX3Byb2ZpbGUuYXJyLnVzX3JhdGUgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA4OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0udXNfcmF0ZSA9IChiY21vbHRfdXBzdHJlYW1fbGluZV9yYXRlX2NhcGFiaWxpdGllcykgY2xpX3Bhcm0tPnZhbHVlc1tpMF0uZW51bV92YWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNoYW5uZWxfcHJvZmlsZS5hcnIuZGVmYXVsdF9vbnVfYXR0ZW51YXRpb24iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNoYW5uZWxfcHJvZmlsZS5hcnIuZGVmYXVsdF9vbnVfYXR0ZW51YXRpb24gaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA4OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0uZGVmYXVsdF9vbnVfYXR0ZW51YXRpb24gPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjaGFubmVsX3Byb2ZpbGUuYXJyLnJlc3BvbnNlX3RocmVzaG9sZCIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2hhbm5lbF9wcm9maWxlLmFyci5yZXNwb25zZV90aHJlc2hvbGQgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA4OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0ucmVzcG9uc2VfdGhyZXNob2xkID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2hhbm5lbF9wcm9maWxlLmFyci51c19saW5rX3R5cGUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNoYW5uZWxfcHJvZmlsZS5hcnIudXNfbGlua190eXBlIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgODsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdLnVzX2xpbmtfdHlwZSA9IChiY21vbHRfbGlua190eXBlKSBjbGlfcGFybS0+dmFsdWVzW2kwXS5lbnVtX3ZhbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2hhbm5lbF9wcm9maWxlLmFyci5pc192YWxpZCIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2hhbm5lbF9wcm9maWxlLmFyci5pc192YWxpZCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDg7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5pc192YWxpZCA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLm51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2hhbm5lbF9wcm9maWxlLmFyciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGNoYW5uZWwsIGNoYW5uZWxfcHJvZmlsZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9hcnJfY2hhbm5lbF9wcm9maWxlXzggdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9DSEFOTkVMLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX0NIQU5ORUxfUFJPRklMRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGNoYW5uZWwsIGNoYW5uZWxfcHJvZmlsZSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9jaGFubmVsX2NmZ19jbGVhcihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfY2hhbm5lbF9jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfY2hhbm5lbF9rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jaGFubmVsX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2hhbm5lbF9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19jbGVhciIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0NIQU5ORUwsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfQ0hBTk5FTF9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGNoYW5uZWwsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGNoYW5uZWwsIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9jaGFubmVsX2NmZ19nZXRfbXVsdGkoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfY2hhbm5lbF9jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfY2hhbm5lbF9rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbXNnX3NldCAqbXNnX3NldCA9IE5VTEw7IC8qKjwgZGVjbGFyZSBtZXNzYWdlIHNldCAqLworICAgIHVpbnQzMl90IG1heF9tc2dzOyAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgIC8qKjwgZGVjbGFyZSBmaWx0ZXIgaW52ZXJ0IGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jaGFubmVsX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2hhbm5lbF9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0KiBtc2dfc2V0ID0gTlVMTDtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQzMl90IG1heF9tc2dzO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldF9tdWx0aSIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0NIQU5ORUwsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfQ0hBTk5FTF9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX0NIQU5ORUwsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXRfYWxsb2MoQkNNT0xUX09CSl9JRF9DSEFOTkVMLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBjaGFubmVsLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBjaGFubmVsLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIub3BlcmF0aW9uX2NvbnRyb2wuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfb3BlcmF0aW9uX2NvbnRyb2wgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vcGVyYXRpb25fY29udHJvbC5yZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJlID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9wZXJhdGlvbl9jb250cm9sLnJlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9wZXJhdGlvbl9jb250cm9sLm9kbl9jbGFzcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm9kbl9jbGFzcyA9IChiY21vbHRfb2RuX2NsYXNzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9wZXJhdGlvbl9jb250cm9sLm9kbl9jbGFzcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vcGVyYXRpb25fY29udHJvbC5kc19mZWNfbW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRzX2ZlY19tb2RlID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9wZXJhdGlvbl9jb250cm9sLmRzX2ZlY19tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9wZXJhdGlvbl9jb250cm9sLnByb3RvY29sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucHJvdG9jb2wgPSAoYmNtb2x0X3RjX3Byb3RvY29sKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9wZXJhdGlvbl9jb250cm9sLnByb3RvY29sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9wZXJhdGlvbl9jb250cm9sLmRzX2xpbmtfdHlwZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRzX2xpbmtfdHlwZSA9IChiY21vbHRfbGlua190eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9wZXJhdGlvbl9jb250cm9sLmRzX2xpbmtfdHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIub3BlcmF0aW9uX2NvbnRyb2wucG9uX2lkLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub3BlcmF0aW9uX2NvbnRyb2wucG9uX2lkLmFkbWluaXN0cmF0aXZlX2xhYmVsIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucG9uX2lkLmFkbWluaXN0cmF0aXZlX2xhYmVsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vcGVyYXRpb25fY29udHJvbC5wb25faWQuYWRtaW5pc3RyYXRpdmVfbGFiZWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub3BlcmF0aW9uX2NvbnRyb2wucG9uX2lkLmR3bGNoX2lkIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucG9uX2lkLmR3bGNoX2lkID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vcGVyYXRpb25fY29udHJvbC5wb25faWQuZHdsY2hfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIub3BlcmF0aW9uX2NvbnRyb2wucG9uX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9wZXJhdGlvbl9jb250cm9sLmMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9wZXJhdGlvbl9jb250cm9sLmMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBjaGFubmVsLCBvcGVyYXRpb25fY29udHJvbCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyYXRpb25fY29udHJvbCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0NIQU5ORUwsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfQ0hBTk5FTF9DRkdfSURfT1BFUkFUSU9OX0NPTlRST0wsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBjaGFubmVsLCBvcGVyYXRpb25fY29udHJvbCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9wZXJhdGlvbl9jb250cm9sIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgY2hhbm5lbCwgb3BlcmF0aW9uX2NvbnRyb2wpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgY2hhbm5lbCwgb3BlcmF0aW9uX2NvbnRyb2wpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci50b2wiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgY2hhbm5lbCwgdG9sLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGNoYW5uZWwsIHRvbCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9DSEFOTkVMLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX1RPTCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRvbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGNoYW5uZWwsIHRvbCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBjaGFubmVsLCB0b2wpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuc3lzdGVtX3Byb2ZpbGUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc3lzdGVtX3Byb2ZpbGUgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zeXN0ZW1fcHJvZmlsZS5uZ18yX3N5c19pZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm5nXzJfc3lzX2lkID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnN5c3RlbV9wcm9maWxlLm5nXzJfc3lzX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnN5c3RlbV9wcm9maWxlLnZlcnNpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC52ZXJzaW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnN5c3RlbV9wcm9maWxlLnZlcnNpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc3lzdGVtX3Byb2ZpbGUuY2hhbm5lbF9zcGFjaW5nIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY2hhbm5lbF9zcGFjaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnN5c3RlbV9wcm9maWxlLmNoYW5uZWxfc3BhY2luZyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zeXN0ZW1fcHJvZmlsZS51c19vcGVyYXRpbmdfd2F2ZWxlbmd0aF9iYW5kcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnVzX29wZXJhdGluZ193YXZlbGVuZ3RoX2JhbmRzID0gKGJjbW9sdF91c19vcGVyYXRpbmdfd2F2ZWxlbmd0aF9iYW5kcykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zeXN0ZW1fcHJvZmlsZS51c19vcGVyYXRpbmdfd2F2ZWxlbmd0aF9iYW5kcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zeXN0ZW1fcHJvZmlsZS51c19tc2UiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC51c19tc2UgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuc3lzdGVtX3Byb2ZpbGUudXNfbXNlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnN5c3RlbV9wcm9maWxlLmxvb3NlX2NhbGlicmF0aW9uX2JvdW5kIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9vc2VfY2FsaWJyYXRpb25fYm91bmQgPSAoYmNtb2x0X2NhbGlicmF0aW9uX3JlY29yZCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zeXN0ZW1fcHJvZmlsZS5sb29zZV9jYWxpYnJhdGlvbl9ib3VuZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zeXN0ZW1fcHJvZmlsZS5mc3IiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5mc3IgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuc3lzdGVtX3Byb2ZpbGUuZnNyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnN5c3RlbV9wcm9maWxlLnR3ZG1fY2hhbm5lbF9jb3VudCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnR3ZG1fY2hhbm5lbF9jb3VudCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zeXN0ZW1fcHJvZmlsZS50d2RtX2NoYW5uZWxfY291bnQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBjaGFubmVsLCBzeXN0ZW1fcHJvZmlsZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9zeXN0ZW1fcHJvZmlsZSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0NIQU5ORUwsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfQ0hBTk5FTF9DRkdfSURfU1lTVEVNX1BST0ZJTEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBjaGFubmVsLCBzeXN0ZW1fcHJvZmlsZSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN5c3RlbV9wcm9maWxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgY2hhbm5lbCwgc3lzdGVtX3Byb2ZpbGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgY2hhbm5lbCwgc3lzdGVtX3Byb2ZpbGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuY2hhbm5lbF9wcm9maWxlLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Fycl9jaGFubmVsX3Byb2ZpbGVfOCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5jaGFubmVsX3Byb2ZpbGUuYXJyLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBpMDsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhcnJheSBmaWx0ZXIuY2hhbm5lbF9wcm9maWxlLmFyciBtdXN0IGhhdmUgOCBlbGVtZW50c1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY2hhbm5lbF9wcm9maWxlLmFyci52ZXJzaW9uIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gOCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuY2hhbm5lbF9wcm9maWxlLmFyci52ZXJzaW9uIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgODsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdLnZlcnNpb24gPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY2hhbm5lbF9wcm9maWxlLmFyci5jaGFubmVsX2luZGV4Iik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gOCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuY2hhbm5lbF9wcm9maWxlLmFyci5jaGFubmVsX2luZGV4IGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgODsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdLmNoYW5uZWxfaW5kZXggPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY2hhbm5lbF9wcm9maWxlLmFyci5kc19mcmVxdWVuY3lfb2Zmc2V0LnNpZ24iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5jaGFubmVsX3Byb2ZpbGUuYXJyLmRzX2ZyZXF1ZW5jeV9vZmZzZXQuc2lnbiBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDg7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5kc19mcmVxdWVuY3lfb2Zmc2V0LnNpZ24gPSAoYmNtb2x0X3NpZ24pIGNsaV9wYXJtLT52YWx1ZXNbaTBdLmVudW1fdmFsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY2hhbm5lbF9wcm9maWxlLmFyci5kc19mcmVxdWVuY3lfb2Zmc2V0LnZhbHVlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gOCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuY2hhbm5lbF9wcm9maWxlLmFyci5kc19mcmVxdWVuY3lfb2Zmc2V0LnZhbHVlIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgODsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdLmRzX2ZyZXF1ZW5jeV9vZmZzZXQudmFsdWUgPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY2hhbm5lbF9wcm9maWxlLmFyci5jaGFubmVsX3BhcnRpdGlvbiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmNoYW5uZWxfcHJvZmlsZS5hcnIuY2hhbm5lbF9wYXJ0aXRpb24gaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA4OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0uY2hhbm5lbF9wYXJ0aXRpb24gPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY2hhbm5lbF9wcm9maWxlLmFyci51d2xjaF9pZCIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmNoYW5uZWxfcHJvZmlsZS5hcnIudXdsY2hfaWQgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA4OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0udXdsY2hfaWQgPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY2hhbm5lbF9wcm9maWxlLmFyci51c19mcmVxdWVuY3kiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5jaGFubmVsX3Byb2ZpbGUuYXJyLnVzX2ZyZXF1ZW5jeSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDg7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS51c19mcmVxdWVuY3kgPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY2hhbm5lbF9wcm9maWxlLmFyci51c19yYXRlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gOCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuY2hhbm5lbF9wcm9maWxlLmFyci51c19yYXRlIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgODsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdLnVzX3JhdGUgPSAoYmNtb2x0X3Vwc3RyZWFtX2xpbmVfcmF0ZV9jYXBhYmlsaXRpZXMpIGNsaV9wYXJtLT52YWx1ZXNbaTBdLmVudW1fdmFsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY2hhbm5lbF9wcm9maWxlLmFyci5kZWZhdWx0X29udV9hdHRlbnVhdGlvbiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmNoYW5uZWxfcHJvZmlsZS5hcnIuZGVmYXVsdF9vbnVfYXR0ZW51YXRpb24gaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA4OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0uZGVmYXVsdF9vbnVfYXR0ZW51YXRpb24gPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY2hhbm5lbF9wcm9maWxlLmFyci5yZXNwb25zZV90aHJlc2hvbGQiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5jaGFubmVsX3Byb2ZpbGUuYXJyLnJlc3BvbnNlX3RocmVzaG9sZCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDg7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5yZXNwb25zZV90aHJlc2hvbGQgPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY2hhbm5lbF9wcm9maWxlLmFyci51c19saW5rX3R5cGUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5jaGFubmVsX3Byb2ZpbGUuYXJyLnVzX2xpbmtfdHlwZSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDg7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS51c19saW5rX3R5cGUgPSAoYmNtb2x0X2xpbmtfdHlwZSkgY2xpX3Bhcm0tPnZhbHVlc1tpMF0uZW51bV92YWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5jaGFubmVsX3Byb2ZpbGUuYXJyLmlzX3ZhbGlkIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gOCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuY2hhbm5lbF9wcm9maWxlLmFyci5pc192YWxpZCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDg7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5pc192YWxpZCA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLm51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmNoYW5uZWxfcHJvZmlsZS5hcnIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBjaGFubmVsLCBjaGFubmVsX3Byb2ZpbGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYXJyX2NoYW5uZWxfcHJvZmlsZV84IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfQ0hBTk5FTCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9DSEFOTkVMX0NGR19JRF9DSEFOTkVMX1BST0ZJTEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBjaGFubmVsLCBjaGFubmVsX3Byb2ZpbGUsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjaGFubmVsX3Byb2ZpbGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBjaGFubmVsLCBjaGFubmVsX3Byb2ZpbGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgY2hhbm5lbCwgY2hhbm5lbF9wcm9maWxlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBjaGFubmVsLCBvcGVyYXRpb25fY29udHJvbCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGNoYW5uZWwsIHRvbCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGNoYW5uZWwsIHN5c3RlbV9wcm9maWxlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgY2hhbm5lbCwgY2hhbm5lbF9wcm9maWxlKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGNoYW5uZWwsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgY2hhbm5lbCwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9kZWJ1Z19vcGVyX2NsaV9pbnB1dF9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZGVidWdfY2xpX2lucHV0IG9wZXI7ICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZGVidWdfa2V5IGtleSA9IHsgfTsgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZWJ1Z19jbGlfaW5wdXQgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZWJ1Z19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZGVidWcsIGNsaV9pbnB1dCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBkZWJ1ZywgY2xpX2lucHV0LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRhdGEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF91OF9saXN0X3UzMiB2YWwgPSB7IH07CisgICAgICAgIHZhbC5sZW4gPSBiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKTsKKyAgICAgICAgdmFsLnZhbCA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgdmFsLmxlbik7CisgICAgICAgIGlmICh2YWwudmFsID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICB9CisKKyAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwudmFsLCB2YWwubGVuKTsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGRlYnVnLCBjbGlfaW5wdXQsIGRhdGEsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfdThfbGlzdF91MzIgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERUJVRywgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfREVCVUdfT1BFUl9JRF9DTElfSU5QVVQsIEJDTU9MVF9ERUJVR19DTElfSU5QVVRfSURfREFUQSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZGVidWcsIGNsaV9pbnB1dCwgZGF0YSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2RlYnVnX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZGVidWdfY2ZnIGNmZzsgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9kZWJ1Z19rZXkga2V5ID0geyB9OyAvKio8IGRlY2xhcmUga2V5ICovCisgICAgdWludDhfdCAqbGlzdF9tZW07ICAgICAgICAgIC8qKjwgZGVjbGFyZSBtZW1vcnkgYnVmZmVyIGZvciB2YXJpYWJsZS1zaXplZCBsaXN0cyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RlYnVnX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGVidWdfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50OF90KiBsaXN0X21lbTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZGVidWcsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGRlYnVnLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNvbnNvbGVfcmVkaXJlY3Rpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRlYnVnLCBjb25zb2xlX3JlZGlyZWN0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGVidWcsIGNvbnNvbGVfcmVkaXJlY3Rpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImluZGljYXRpb25zX2Ryb3BwZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRlYnVnLCBpbmRpY2F0aW9uc19kcm9wcGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGVidWcsIGluZGljYXRpb25zX2Ryb3BwZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbGVfdXNlZF9wZXJjZW50Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZWJ1ZywgZmlsZV91c2VkX3BlcmNlbnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZWJ1ZywgZmlsZV91c2VkX3BlcmNlbnQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFwaV9jYXB0dXJlX2NmZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGVidWcsIGFwaV9jYXB0dXJlX2NmZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRlYnVnLCBhcGlfY2FwdHVyZV9jZmcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFwaV9jYXB0dXJlX3N0YXRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZWJ1ZywgYXBpX2NhcHR1cmVfc3RhdHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZWJ1ZywgYXBpX2NhcHR1cmVfc3RhdHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZWJ1ZywgYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZWJ1ZywgYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFwaV9jYXB0dXJlX2J1ZmZlciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGVidWcsIGFwaV9jYXB0dXJlX2J1ZmZlcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRlYnVnLCBhcGlfY2FwdHVyZV9idWZmZXIpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZGVidWcsIGNvbnNvbGVfcmVkaXJlY3Rpb24pICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGRlYnVnLCBpbmRpY2F0aW9uc19kcm9wcGVkKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBkZWJ1ZywgZmlsZV91c2VkX3BlcmNlbnQpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGRlYnVnLCBhcGlfY2FwdHVyZV9jZmcpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGRlYnVnLCBhcGlfY2FwdHVyZV9zdGF0cykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZGVidWcsIGFwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBkZWJ1ZywgYXBpX2NhcHR1cmVfYnVmZmVyKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGVidWcsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZWJ1ZywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogc2V0IG1lbW9yeSB0byB1c2UgZm9yIHZhcmlhYmxlLXNpemVkIGxpc3RzICovCisgICAgbGlzdF9tZW0gPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIEFQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpOworICAgIGlmIChsaXN0X21lbSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJsaXN0X21lbSA9IGJjbW9zX2NhbGxvYyhBUElDTElfRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFKTtcbiIpOworICAgIEJDTU9MVF9DRkdfTElTVF9CVUZfU0VUKCZjZmcsIGRlYnVnLCBsaXN0X21lbSwgQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19MSVNUX0JVRl9TRVQoJmNmZywgZGVidWcsIGxpc3RfbWVtLCBBUElDTElfRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFKTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2RlYnVnX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZGVidWdfY2ZnIGNmZzsgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9kZWJ1Z19rZXkga2V5ID0geyB9OyAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGVidWdfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZWJ1Z19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19zZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZGVidWcsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGRlYnVnLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNvbnNvbGVfcmVkaXJlY3Rpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9jb25zb2xlX3JlZGlyZWN0aW9uIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9jb25zb2xlX3JlZGlyZWN0aW9uKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGVidWcsIGNvbnNvbGVfcmVkaXJlY3Rpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGVidWcsIGNvbnNvbGVfcmVkaXJlY3Rpb24sICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVCVUcsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVCVUdfQ0ZHX0lEX0NPTlNPTEVfUkVESVJFQ1RJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiYXBpX2NhcHR1cmVfY2ZnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2FwaV9jYXB0dXJlX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXBpX2NhcHR1cmVfY2ZnLmxvY2F0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9jYXRpb24gPSAoYmNtb2x0X2FwaV9jYXB0dXJlX2xvY2F0aW9uKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXBpX2NhcHR1cmVfY2ZnLmxvY2F0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXBpX2NhcHR1cmVfY2ZnLmJ1ZmZlcl9zaXplX2J5dGVzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYnVmZmVyX3NpemVfYnl0ZXMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhcGlfY2FwdHVyZV9jZmcuYnVmZmVyX3NpemVfYnl0ZXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhcGlfY2FwdHVyZV9jZmcuYnVmZmVyX21vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5idWZmZXJfbW9kZSA9IChiY21vbHRfYXBpX2NhcHR1cmVfYnVmZmVyX21vZGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhcGlfY2FwdHVyZV9jZmcuYnVmZmVyX21vZGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZWJ1ZywgYXBpX2NhcHR1cmVfY2ZnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2FwaV9jYXB0dXJlX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFQlVHLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFQlVHX0NGR19JRF9BUElfQ0FQVFVSRV9DRkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZWJ1ZywgYXBpX2NhcHR1cmVfY2ZnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImFwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXIgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkLm9mZnNldCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm9mZnNldCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkLm9mZnNldCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkLnNpemUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zaXplID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQuc2l6ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRlYnVnLCBhcGlfY2FwdHVyZV9idWZmZXJfcmVhZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfcmVhZGVyIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVCVUcsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVCVUdfQ0ZHX0lEX0FQSV9DQVBUVVJFX0JVRkZFUl9SRUFELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGVidWcsIGFwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2RlYnVnX2NmZ19jbGVhcihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2RlYnVnX2NmZyBjZmc7ICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZGVidWdfa2V5IGtleSA9IHsgfTsgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RlYnVnX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGVidWdfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfY2xlYXIiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZGVidWcsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGRlYnVnLCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZGVidWdfY2ZnX2dldF9tdWx0aShiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9kZWJ1Z19jZmcgY2ZnOyAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9kZWJ1Z19rZXkga2V5ID0geyB9OyAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0ID0gTlVMTDsgLyoqPCBkZWNsYXJlIG1lc3NhZ2Ugc2V0ICovCisgICAgdWludDMyX3QgbWF4X21zZ3M7ICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgbWF4IG51bWJlciBvZiBtc2dzIHRvIGdldCAqLworICAgIGJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjsgICAgICAgLyoqPCBkZWNsYXJlIGZpbHRlciBpbnZlcnQgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RlYnVnX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGVidWdfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldCogbXNnX3NldCA9IE5VTEw7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50MzJfdCBtYXhfbXNncztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXRfbXVsdGkiKTsKKworICAgIC8qIHNldCBtYXggbnVtYmVyIG9mIG1zZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhfbXNncyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgbWF4X21zZ3MgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1heF9tc2dzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coIm1heF9tc2dzID0gJWQ7XG4iLCBtYXhfbXNncyk7CisKKyAgICAvKiBzZXQgZmlsdGVyIGludmVydCBmbGFnIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyX2ludmVydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW52ZXJ0X2ZpbHRlciA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXJfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImludmVydF9maWx0ZXIgPSAlcztcbiIsIChpbnZlcnRfZmlsdGVyKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogYWxsb2NhdGUgbWVzc2FnZSBzZXQgKi8KKyAgICBlcnIgPSBhcGljbGlfbXNnX3NldF9hbGxvYyhieXRlX3Bvb2wsIEJDTU9MVF9PQkpfSURfREVCVUcsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXRfYWxsb2MoQkNNT0xUX09CSl9JRF9ERUJVRywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZGVidWcsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGRlYnVnLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5jb25zb2xlX3JlZGlyZWN0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfY29uc29sZV9yZWRpcmVjdGlvbiB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfY29uc29sZV9yZWRpcmVjdGlvbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRlYnVnLCBjb25zb2xlX3JlZGlyZWN0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRlYnVnLCBjb25zb2xlX3JlZGlyZWN0aW9uLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFQlVHLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFQlVHX0NGR19JRF9DT05TT0xFX1JFRElSRUNUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY29uc29sZV9yZWRpcmVjdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRlYnVnLCBjb25zb2xlX3JlZGlyZWN0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRlYnVnLCBjb25zb2xlX3JlZGlyZWN0aW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuaW5kaWNhdGlvbnNfZHJvcHBlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZWJ1ZywgaW5kaWNhdGlvbnNfZHJvcHBlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZWJ1ZywgaW5kaWNhdGlvbnNfZHJvcHBlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERUJVRywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERUJVR19DRkdfSURfSU5ESUNBVElPTlNfRFJPUFBFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImluZGljYXRpb25zX2Ryb3BwZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZWJ1ZywgaW5kaWNhdGlvbnNfZHJvcHBlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZWJ1ZywgaW5kaWNhdGlvbnNfZHJvcHBlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmZpbGVfdXNlZF9wZXJjZW50Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGVidWcsIGZpbGVfdXNlZF9wZXJjZW50LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRlYnVnLCBmaWxlX3VzZWRfcGVyY2VudCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERUJVRywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERUJVR19DRkdfSURfRklMRV9VU0VEX1BFUkNFTlQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWxlX3VzZWRfcGVyY2VudCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRlYnVnLCBmaWxlX3VzZWRfcGVyY2VudCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZWJ1ZywgZmlsZV91c2VkX3BlcmNlbnQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuYXBpX2NhcHR1cmVfY2ZnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2FwaV9jYXB0dXJlX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFwaV9jYXB0dXJlX2NmZy5sb2NhdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvY2F0aW9uID0gKGJjbW9sdF9hcGlfY2FwdHVyZV9sb2NhdGlvbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hcGlfY2FwdHVyZV9jZmcubG9jYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYXBpX2NhcHR1cmVfY2ZnLmJ1ZmZlcl9zaXplX2J5dGVzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYnVmZmVyX3NpemVfYnl0ZXMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYXBpX2NhcHR1cmVfY2ZnLmJ1ZmZlcl9zaXplX2J5dGVzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFwaV9jYXB0dXJlX2NmZy5idWZmZXJfbW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmJ1ZmZlcl9tb2RlID0gKGJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hcGlfY2FwdHVyZV9jZmcuYnVmZmVyX21vZGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZWJ1ZywgYXBpX2NhcHR1cmVfY2ZnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2FwaV9jYXB0dXJlX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFQlVHLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFQlVHX0NGR19JRF9BUElfQ0FQVFVSRV9DRkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZWJ1ZywgYXBpX2NhcHR1cmVfY2ZnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXBpX2NhcHR1cmVfY2ZnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGVidWcsIGFwaV9jYXB0dXJlX2NmZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZWJ1ZywgYXBpX2NhcHR1cmVfY2ZnKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmFwaV9jYXB0dXJlX3N0YXRzLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2FwaV9jYXB0dXJlX3N0YXRzIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYXBpX2NhcHR1cmVfc3RhdHMuYnVmZmVyX3VzZWRfYnl0ZXMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5idWZmZXJfdXNlZF9ieXRlcyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hcGlfY2FwdHVyZV9zdGF0cy5idWZmZXJfdXNlZF9ieXRlcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hcGlfY2FwdHVyZV9zdGF0cy5idWZmZXJfd3JhcF9jb3VudCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmJ1ZmZlcl93cmFwX2NvdW50ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFwaV9jYXB0dXJlX3N0YXRzLmJ1ZmZlcl93cmFwX2NvdW50IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFwaV9jYXB0dXJlX3N0YXRzLmV2ZW50c19yZWNvcmRlZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmV2ZW50c19yZWNvcmRlZCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hcGlfY2FwdHVyZV9zdGF0cy5ldmVudHNfcmVjb3JkZWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYXBpX2NhcHR1cmVfc3RhdHMuZXZlbnRzX2Ryb3BwZWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5ldmVudHNfZHJvcHBlZCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hcGlfY2FwdHVyZV9zdGF0cy5ldmVudHNfZHJvcHBlZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hcGlfY2FwdHVyZV9zdGF0cy5yZWFkYWJsZV9ieXRlcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJlYWRhYmxlX2J5dGVzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFwaV9jYXB0dXJlX3N0YXRzLnJlYWRhYmxlX2J5dGVzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGVidWcsIGFwaV9jYXB0dXJlX3N0YXRzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2FwaV9jYXB0dXJlX3N0YXRzIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVCVUcsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVCVUdfQ0ZHX0lEX0FQSV9DQVBUVVJFX1NUQVRTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGVidWcsIGFwaV9jYXB0dXJlX3N0YXRzLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXBpX2NhcHR1cmVfc3RhdHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZWJ1ZywgYXBpX2NhcHR1cmVfc3RhdHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGVidWcsIGFwaV9jYXB0dXJlX3N0YXRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmFwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXIgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hcGlfY2FwdHVyZV9idWZmZXJfcmVhZC5vZmZzZXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5vZmZzZXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQub2Zmc2V0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkLnNpemUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zaXplID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkLnNpemUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZWJ1ZywgYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWRlciB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFQlVHLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFQlVHX0NGR19JRF9BUElfQ0FQVFVSRV9CVUZGRVJfUkVBRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRlYnVnLCBhcGlfY2FwdHVyZV9idWZmZXJfcmVhZCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGVidWcsIGFwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRlYnVnLCBhcGlfY2FwdHVyZV9idWZmZXJfcmVhZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFwaV9jYXB0dXJlX2J1ZmZlciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3U4X2xpc3RfdTMyIHZhbCA9IHsgfTsKKyAgICAgICAgdmFsLmxlbiA9IGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpOworICAgICAgICB2YWwudmFsID0gYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCB2YWwubGVuKTsKKyAgICAgICAgaWYgKHZhbC52YWwgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgICAgIH0KKworICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC52YWwsIHZhbC5sZW4pOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRlYnVnLCBhcGlfY2FwdHVyZV9idWZmZXIsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfdThfbGlzdF91MzIgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERUJVRywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfQlVGRkVSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGVidWcsIGFwaV9jYXB0dXJlX2J1ZmZlciwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFwaV9jYXB0dXJlX2J1ZmZlciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRlYnVnLCBhcGlfY2FwdHVyZV9idWZmZXIpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGVidWcsIGFwaV9jYXB0dXJlX2J1ZmZlcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZGVidWcsIGNvbnNvbGVfcmVkaXJlY3Rpb24pICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBkZWJ1ZywgaW5kaWNhdGlvbnNfZHJvcHBlZCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGRlYnVnLCBmaWxlX3VzZWRfcGVyY2VudCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGRlYnVnLCBhcGlfY2FwdHVyZV9jZmcpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBkZWJ1ZywgYXBpX2NhcHR1cmVfc3RhdHMpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBkZWJ1ZywgYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBkZWJ1ZywgYXBpX2NhcHR1cmVfYnVmZmVyKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRlYnVnLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRlYnVnLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2RlYnVnX29wZXJfc3RhcnRfYXBpX2NhcHR1cmVfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZGVidWdfc3RhcnRfYXBpX2NhcHR1cmUgb3BlcjsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9kZWJ1Z19rZXkga2V5ID0geyB9OyAgICAgICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGVidWdfc3RhcnRfYXBpX2NhcHR1cmUgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZWJ1Z19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZGVidWcsIHN0YXJ0X2FwaV9jYXB0dXJlLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGRlYnVnLCBzdGFydF9hcGlfY2FwdHVyZSwga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9kZWJ1Z19vcGVyX3N0b3BfYXBpX2NhcHR1cmVfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZGVidWdfc3RvcF9hcGlfY2FwdHVyZSBvcGVyOyAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2RlYnVnX2tleSBrZXkgPSB7IH07ICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RlYnVnX3N0b3BfYXBpX2NhcHR1cmUgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZWJ1Z19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZGVidWcsIHN0b3BfYXBpX2NhcHR1cmUsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZGVidWcsIHN0b3BfYXBpX2NhcHR1cmUsIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZGVidWdfb3Blcl9yZXNldF9hcGlfY2FwdHVyZV9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9kZWJ1Z19yZXNldF9hcGlfY2FwdHVyZSBvcGVyOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2RlYnVnX2tleSBrZXkgPSB7IH07ICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZWJ1Z19yZXNldF9hcGlfY2FwdHVyZSBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RlYnVnX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBkZWJ1ZywgcmVzZXRfYXBpX2NhcHR1cmUsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZGVidWcsIHJlc2V0X2FwaV9jYXB0dXJlLCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2RlYnVnX2F1dG9fY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZGVidWdfYXV0b19jZmcgYXV0b19jZmc7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZGVidWdfa2V5IGtleSA9IHsgfTsgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZWJ1Z19hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZWJ1Z19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX2dldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZGVidWcsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBkZWJ1Zywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjbGlfb3V0cHV0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZGVidWcsIGNsaV9vdXRwdXQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZGVidWcsIGNsaV9vdXRwdXQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbGVfYWxtb3N0X2Z1bGwiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBkZWJ1ZywgZmlsZV9hbG1vc3RfZnVsbCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBkZWJ1ZywgZmlsZV9hbG1vc3RfZnVsbCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZGVidWcsIGNsaV9vdXRwdXQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBkZWJ1ZywgZmlsZV9hbG1vc3RfZnVsbCkpCisgICAgeworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBkZWJ1ZywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBkZWJ1ZywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmYXV0b19jZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2RlYnVnX2F1dG9fY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZGVidWdfYXV0b19jZmcgYXV0b19jZmc7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZGVidWdfa2V5IGtleSA9IHsgfTsgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZWJ1Z19hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZWJ1Z19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX3NldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZGVidWcsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBkZWJ1Zywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjbGlfb3V0cHV0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZGVidWcsIGNsaV9vdXRwdXQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGRlYnVnLCBjbGlfb3V0cHV0LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFQlVHLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfREVCVUdfQVVUT19DRkdfSURfQ0xJX09VVFBVVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbGVfYWxtb3N0X2Z1bGwiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBkZWJ1ZywgZmlsZV9hbG1vc3RfZnVsbCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZGVidWcsIGZpbGVfYWxtb3N0X2Z1bGwsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVCVUcsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9ERUJVR19BVVRPX0NGR19JRF9GSUxFX0FMTU9TVF9GVUxMLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9kZXZpY2VfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9kZXZpY2VfY2ZnIGNmZzsgICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIHVpbnQ4X3QgKmxpc3RfbWVtOyAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1lbW9yeSBidWZmZXIgZm9yIHZhcmlhYmxlLXNpemVkIGxpc3RzICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWNlX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWNlX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygidWludDhfdCogbGlzdF9tZW07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGRldmljZSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZGV2aWNlLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN5c3RlbV9tb2RlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIHN5c3RlbV9tb2RlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCBzeXN0ZW1fbW9kZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2VlcGFsaXZlX2ludGVydmFsIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGtlZXBhbGl2ZV9pbnRlcnZhbCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwga2VlcGFsaXZlX2ludGVydmFsKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZWVwYWxpdmVfdG9sZXJhbmNlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGtlZXBhbGl2ZV90b2xlcmFuY2UpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGtlZXBhbGl2ZV90b2xlcmFuY2UpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpcm13YXJlX3N3X3ZlcnNpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgZmlybXdhcmVfc3dfdmVyc2lvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgZmlybXdhcmVfc3dfdmVyc2lvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaG9zdF9zd192ZXJzaW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGhvc3Rfc3dfdmVyc2lvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgaG9zdF9zd192ZXJzaW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjaGlwX3JldmlzaW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGNoaXBfcmV2aXNpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGNoaXBfcmV2aXNpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIHN0YXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCBzdGF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVidWciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgZGVidWcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGRlYnVnKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJubmlfc3BlZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgbm5pX3NwZWVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCBubmlfc3BlZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nX2V4dF9pcnEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZXh0X2lycSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZXh0X2lycSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9jbG9ja190cmFuc3BvcnRfc2FtcGxlX2RlbGF5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGVwb25fY2xvY2tfdHJhbnNwb3J0X3NhbXBsZV9kZWxheSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgZXBvbl9jbG9ja190cmFuc3BvcnRfc2FtcGxlX2RlbGF5KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpbmRpY2F0aW9uX3NoYXBpbmciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgaW5kaWNhdGlvbl9zaGFwaW5nKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCBpbmRpY2F0aW9uX3NoYXBpbmcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNoaXBfdGVtcGVyYXR1cmUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgY2hpcF90ZW1wZXJhdHVyZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgY2hpcF90ZW1wZXJhdHVyZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ3Bvbl94Z3Bvbl90b2RfZW5hYmxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2VuYWJsZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgZ3Bvbl94Z3Bvbl90b2RfZW5hYmxlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJncG9uX3hncG9uX3RvZF9ncGlvX3BpbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9ncGlvX3Bpbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgZ3Bvbl94Z3Bvbl90b2RfZ3Bpb19waW4pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdwb25feGdwb25fdG9kX2Nvbm5lY3RlZF9pbnRlcm5hbGx5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2Nvbm5lY3RlZF9pbnRlcm5hbGx5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9jb25uZWN0ZWRfaW50ZXJuYWxseSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl84MDIxX2FzX3RvZF9mb3JtYXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgZXBvbl84MDIxX2FzX3RvZF9mb3JtYXQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGVwb25fODAyMV9hc190b2RfZm9ybWF0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX3NoYXBlcl9tb2RlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGVwb25fc2hhcGVyX21vZGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGVwb25fc2hhcGVyX21vZGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVtYmVkZGVkX2ltYWdlX2xpc3QiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgZW1iZWRkZWRfaW1hZ2VfbGlzdCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgZW1iZWRkZWRfaW1hZ2VfbGlzdCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2hpcF92b2x0YWdlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGNoaXBfdm9sdGFnZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgY2hpcF92b2x0YWdlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX3RvZF9zdHJpbmciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgZXBvbl90b2Rfc3RyaW5nKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCBlcG9uX3RvZF9zdHJpbmcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInhncG9uX251bV9vZl9vbnVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIHhncG9uX251bV9vZl9vbnVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCB4Z3Bvbl9udW1fb2Zfb251cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGV2aWNlX2lwX2FkZHJlc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgZGV2aWNlX2lwX2FkZHJlc3MpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIGRldmljZV9pcF9hZGRyZXNzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZXZpY2VfdWRwX3BvcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGRldmljZSwgZGV2aWNlX3VkcF9wb3J0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCBkZXZpY2VfdWRwX3BvcnQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRvZF91YXJ0X2JhdWRyYXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBkZXZpY2UsIHRvZF91YXJ0X2JhdWRyYXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCB0b2RfdWFydF9iYXVkcmF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ3Bvbl94Z3Bvbl90b2Rfc3RyaW5nX2xlbmd0aCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9zdHJpbmdfbGVuZ3RoKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9zdHJpbmdfbGVuZ3RoKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGRldmljZSwgc3lzdGVtX21vZGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGRldmljZSwga2VlcGFsaXZlX2ludGVydmFsKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBkZXZpY2UsIGtlZXBhbGl2ZV90b2xlcmFuY2UpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGRldmljZSwgZmlybXdhcmVfc3dfdmVyc2lvbikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZGV2aWNlLCBob3N0X3N3X3ZlcnNpb24pICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGRldmljZSwgY2hpcF9yZXZpc2lvbikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZGV2aWNlLCBzdGF0ZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZGV2aWNlLCBkZWJ1ZykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZGV2aWNlLCBubmlfc3BlZWQpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGRldmljZSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZXh0X2lycSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZGV2aWNlLCBlcG9uX2Nsb2NrX3RyYW5zcG9ydF9zYW1wbGVfZGVsYXkpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGRldmljZSwgaW5kaWNhdGlvbl9zaGFwaW5nKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBkZXZpY2UsIGNoaXBfdGVtcGVyYXR1cmUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGRldmljZSwgZ3Bvbl94Z3Bvbl90b2RfZW5hYmxlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2dwaW9fcGluKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2Nvbm5lY3RlZF9pbnRlcm5hbGx5KSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBkZXZpY2UsIGVwb25fODAyMV9hc190b2RfZm9ybWF0KSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBkZXZpY2UsIGVwb25fc2hhcGVyX21vZGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGRldmljZSwgZW1iZWRkZWRfaW1hZ2VfbGlzdCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZGV2aWNlLCBjaGlwX3ZvbHRhZ2UpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGRldmljZSwgZXBvbl90b2Rfc3RyaW5nKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBkZXZpY2UsIHhncG9uX251bV9vZl9vbnVzKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBkZXZpY2UsIGRldmljZV9pcF9hZGRyZXNzKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBkZXZpY2UsIGRldmljZV91ZHBfcG9ydCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZGV2aWNlLCB0b2RfdWFydF9iYXVkcmF0ZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9zdHJpbmdfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBzZXQgbWVtb3J5IHRvIHVzZSBmb3IgdmFyaWFibGUtc2l6ZWQgbGlzdHMgKi8KKyAgICBsaXN0X21lbSA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7CisgICAgaWYgKGxpc3RfbWVtID09IE5VTEwpCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImxpc3RfbWVtID0gYmNtb3NfY2FsbG9jKEFQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpO1xuIik7CisgICAgQkNNT0xUX0NGR19MSVNUX0JVRl9TRVQoJmNmZywgZGV2aWNlLCBsaXN0X21lbSwgQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19MSVNUX0JVRl9TRVQoJmNmZywgZGV2aWNlLCBsaXN0X21lbSwgQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9kZXZpY2VfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9kZXZpY2VfY2ZnIGNmZzsgICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmljZV9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmljZV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19zZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZGV2aWNlLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBkZXZpY2UsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3lzdGVtX21vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zeXN0ZW1fbW9kZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfc3lzdGVtX21vZGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIHN5c3RlbV9tb2RlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgc3lzdGVtX21vZGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFVklDRV9DRkdfSURfU1lTVEVNX01PREUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZWVwYWxpdmVfaW50ZXJ2YWwiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBrZWVwYWxpdmVfaW50ZXJ2YWwsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBrZWVwYWxpdmVfaW50ZXJ2YWwsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFVklDRV9DRkdfSURfS0VFUEFMSVZFX0lOVEVSVkFMLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2VlcGFsaXZlX3RvbGVyYW5jZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGtlZXBhbGl2ZV90b2xlcmFuY2UsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBrZWVwYWxpdmVfdG9sZXJhbmNlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0tFRVBBTElWRV9UT0xFUkFOQ0UsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZGVidWcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZGVidWdfZGV2aWNlX2NmZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVidWcuaG9zdF9kbWFfcnhfcXVldWVfc2l6ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmhvc3RfZG1hX3J4X3F1ZXVlX3NpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJkZWJ1Zy5ob3N0X2RtYV9yeF9xdWV1ZV9zaXplIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVidWcuaG9zdF9kbWFfdHhfcXVldWVfc2l6ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmhvc3RfZG1hX3R4X3F1ZXVlX3NpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJkZWJ1Zy5ob3N0X2RtYV90eF9xdWV1ZV9zaXplIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVidWcuYXZzX2NvbnRyb2wiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hdnNfY29udHJvbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZGVidWcuYXZzX2NvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWJ1Zy51c2VfcHJldl9wb25fc2VyZGVzX2Zpcm13YXJlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudXNlX3ByZXZfcG9uX3NlcmRlc19maXJtd2FyZSA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZGVidWcudXNlX3ByZXZfcG9uX3NlcmRlc19maXJtd2FyZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlYnVnLnVzZV9wcmV2X25uaV9zZXJkZXNfZmlybXdhcmUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC51c2VfcHJldl9ubmlfc2VyZGVzX2Zpcm13YXJlID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJkZWJ1Zy51c2VfcHJldl9ubmlfc2VyZGVzX2Zpcm13YXJlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBkZWJ1ZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZWJ1Z19kZXZpY2VfY2ZnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFVklDRV9DRkdfSURfREVCVUcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGRlYnVnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgIm5uaV9zcGVlZC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9kZXZpY2Vfbm5pX3NwZWVkIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJubmlfc3BlZWQuZmlyc3RfaGFsZiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmZpcnN0X2hhbGYgPSAoYmNtb2x0X25uaV9zcGVlZCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm5uaV9zcGVlZC5maXJzdF9oYWxmIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibm5pX3NwZWVkLnNlY29uZF9oYWxmIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc2Vjb25kX2hhbGYgPSAoYmNtb2x0X25uaV9zcGVlZCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm5uaV9zcGVlZC5zZWNvbmRfaGFsZiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgbm5pX3NwZWVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmljZV9ubmlfc3BlZWQgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0NGR19JRF9OTklfU1BFRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIG5uaV9zcGVlZCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nX2V4dF9pcnEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9leHRfaXJxIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9leHRfaXJxKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19leHRfaXJxLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZXh0X2lycSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19FWFRfSVJRLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9jbG9ja190cmFuc3BvcnRfc2FtcGxlX2RlbGF5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgZXBvbl9jbG9ja190cmFuc3BvcnRfc2FtcGxlX2RlbGF5LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgZXBvbl9jbG9ja190cmFuc3BvcnRfc2FtcGxlX2RlbGF5LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VQT05fQ0xPQ0tfVFJBTlNQT1JUX1NBTVBMRV9ERUxBWSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJpbmRpY2F0aW9uX3NoYXBpbmcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfaW5kaWNhdGlvbl9zaGFwaW5nIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpbmRpY2F0aW9uX3NoYXBpbmcuZW5hYmxlZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmVuYWJsZWQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImluZGljYXRpb25fc2hhcGluZy5lbmFibGVkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaW5kaWNhdGlvbl9zaGFwaW5nLm1heF9yYXRlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWF4X3JhdGUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJpbmRpY2F0aW9uX3NoYXBpbmcubWF4X3JhdGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpbmRpY2F0aW9uX3NoYXBpbmcubWF4X2J1cnN0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWF4X2J1cnN0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiaW5kaWNhdGlvbl9zaGFwaW5nLm1heF9idXJzdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgaW5kaWNhdGlvbl9zaGFwaW5nLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2luZGljYXRpb25fc2hhcGluZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0lORElDQVRJT05fU0hBUElORywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgaW5kaWNhdGlvbl9zaGFwaW5nLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ3Bvbl94Z3Bvbl90b2RfZW5hYmxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfY29udHJvbF9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgZ3Bvbl94Z3Bvbl90b2RfZW5hYmxlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgZ3Bvbl94Z3Bvbl90b2RfZW5hYmxlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX0VOQUJMRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdwb25feGdwb25fdG9kX2dwaW9fcGluIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bpb19waW4gdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2dwaW9fcGluKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9ncGlvX3BpbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2dwaW9fcGluLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX0dQSU9fUElOLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ3Bvbl94Z3Bvbl90b2RfY29ubmVjdGVkX2ludGVybmFsbHkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgZ3Bvbl94Z3Bvbl90b2RfY29ubmVjdGVkX2ludGVybmFsbHksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9jb25uZWN0ZWRfaW50ZXJuYWxseSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0NGR19JRF9HUE9OX1hHUE9OX1RPRF9DT05ORUNURURfSU5URVJOQUxMWSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJlcG9uXzgwMjFfYXNfdG9kX2Zvcm1hdC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zdHJfMjU2IHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uXzgwMjFfYXNfdG9kX2Zvcm1hdC5zdHIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNucHJpbnRmKHZhbC5zdHIsIDI1NiwgIiVzIiwgY2xpX3Bhcm0tPnZhbHVlLnN0cmluZyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl84MDIxX2FzX3RvZF9mb3JtYXQuc3RyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBlcG9uXzgwMjFfYXNfdG9kX2Zvcm1hdCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdHJfMjU2IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFVklDRV9DRkdfSURfRVBPTl84MDIxX0FTX1RPRF9GT1JNQVQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGVwb25fODAyMV9hc190b2RfZm9ybWF0LCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9zaGFwZXJfbW9kZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3NoYXBlcl9tb2RlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9zaGFwZXJfbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgZXBvbl9zaGFwZXJfbW9kZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGVwb25fc2hhcGVyX21vZGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFVklDRV9DRkdfSURfRVBPTl9TSEFQRVJfTU9ERSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJlcG9uX3RvZF9zdHJpbmcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc3RyXzI1NiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl90b2Rfc3RyaW5nLnN0ciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc25wcmludGYodmFsLnN0ciwgMjU2LCAiJXMiLCBjbGlfcGFybS0+dmFsdWUuc3RyaW5nKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX3RvZF9zdHJpbmcuc3RyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBlcG9uX3RvZF9zdHJpbmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RyXzI1NiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VQT05fVE9EX1NUUklORywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgZXBvbl90b2Rfc3RyaW5nLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAieGdwb25fbnVtX29mX29udXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9udW1fb2Zfb251cyB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfeGdwb25fbnVtX29mX29udXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIHhncG9uX251bV9vZl9vbnVzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgeGdwb25fbnVtX29mX29udXMsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFVklDRV9DRkdfSURfWEdQT05fTlVNX09GX09OVVMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZXZpY2VfaXBfYWRkcmVzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfaXB2NF9hZGRyZXNzIHZhbDsKKyAgICAgICAgdmFsID0gYXBpY2xpX3VudW1iZXJfdG9faXB2NChjbGlfcGFybS0+dmFsdWUudW51bWJlcik7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBkZXZpY2VfaXBfYWRkcmVzcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGRldmljZV9pcF9hZGRyZXNzLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0RFVklDRV9JUF9BRERSRVNTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGV2aWNlX3VkcF9wb3J0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MTZfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgZGV2aWNlX3VkcF9wb3J0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgZGV2aWNlX3VkcF9wb3J0LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0RFVklDRV9VRFBfUE9SVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRvZF91YXJ0X2JhdWRyYXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdWFydF9iYXVkcmF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfdWFydF9iYXVkcmF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgdG9kX3VhcnRfYmF1ZHJhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCB0b2RfdWFydF9iYXVkcmF0ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0NGR19JRF9UT0RfVUFSVF9CQVVEUkFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdwb25feGdwb25fdG9kX3N0cmluZ19sZW5ndGgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGdwb25feGdwb25fdG9kX3N0cmluZ19sZW5ndGgsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9zdHJpbmdfbGVuZ3RoLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX1NUUklOR19MRU5HVEgsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZGV2aWNlX2NmZ19jbGVhcihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2RldmljZV9jZmcgY2ZnOyAgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2RldmljZV9rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWNlX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWNlX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2NsZWFyIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGRldmljZSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZGV2aWNlLCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZGV2aWNlX2NmZ19nZXRfbXVsdGkoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZGV2aWNlX2NmZyBjZmc7ICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZGV2aWNlX2tleSBrZXkgPSB7IH07ICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbXNnX3NldCAqbXNnX3NldCA9IE5VTEw7IC8qKjwgZGVjbGFyZSBtZXNzYWdlIHNldCAqLworICAgIHVpbnQzMl90IG1heF9tc2dzOyAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgIC8qKjwgZGVjbGFyZSBmaWx0ZXIgaW52ZXJ0IGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpY2VfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpY2Vfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldCogbXNnX3NldCA9IE5VTEw7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50MzJfdCBtYXhfbXNncztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXRfbXVsdGkiKTsKKworICAgIC8qIHNldCBtYXggbnVtYmVyIG9mIG1zZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhfbXNncyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgbWF4X21zZ3MgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1heF9tc2dzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coIm1heF9tc2dzID0gJWQ7XG4iLCBtYXhfbXNncyk7CisKKyAgICAvKiBzZXQgZmlsdGVyIGludmVydCBmbGFnIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyX2ludmVydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW52ZXJ0X2ZpbHRlciA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXJfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImludmVydF9maWx0ZXIgPSAlcztcbiIsIChpbnZlcnRfZmlsdGVyKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogYWxsb2NhdGUgbWVzc2FnZSBzZXQgKi8KKyAgICBlcnIgPSBhcGljbGlfbXNnX3NldF9hbGxvYyhieXRlX3Bvb2wsIEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBkZXZpY2UsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGRldmljZSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc3lzdGVtX21vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zeXN0ZW1fbW9kZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfc3lzdGVtX21vZGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIHN5c3RlbV9tb2RlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgc3lzdGVtX21vZGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFVklDRV9DRkdfSURfU1lTVEVNX01PREUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzeXN0ZW1fbW9kZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgc3lzdGVtX21vZGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCBzeXN0ZW1fbW9kZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmtlZXBhbGl2ZV9pbnRlcnZhbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGtlZXBhbGl2ZV9pbnRlcnZhbCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGtlZXBhbGl2ZV9pbnRlcnZhbCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0NGR19JRF9LRUVQQUxJVkVfSU5URVJWQUwsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZWVwYWxpdmVfaW50ZXJ2YWwiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIGtlZXBhbGl2ZV9pbnRlcnZhbCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIGtlZXBhbGl2ZV9pbnRlcnZhbCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmtlZXBhbGl2ZV90b2xlcmFuY2UiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBrZWVwYWxpdmVfdG9sZXJhbmNlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwga2VlcGFsaXZlX3RvbGVyYW5jZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0NGR19JRF9LRUVQQUxJVkVfVE9MRVJBTkNFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2VlcGFsaXZlX3RvbGVyYW5jZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwga2VlcGFsaXZlX3RvbGVyYW5jZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIGtlZXBhbGl2ZV90b2xlcmFuY2UpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuZmlybXdhcmVfc3dfdmVyc2lvbi4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9maXJtd2FyZV9zd192ZXJzaW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZmlybXdhcmVfc3dfdmVyc2lvbi5tYWpvciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1ham9yID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmZpcm13YXJlX3N3X3ZlcnNpb24ubWFqb3IgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZmlybXdhcmVfc3dfdmVyc2lvbi5taW5vciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1pbm9yID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmZpcm13YXJlX3N3X3ZlcnNpb24ubWlub3IgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZmlybXdhcmVfc3dfdmVyc2lvbi5yZXZpc2lvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJldmlzaW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmZpcm13YXJlX3N3X3ZlcnNpb24ucmV2aXNpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZmlybXdhcmVfc3dfdmVyc2lvbi5tb2RlbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1vZGVsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmZpcm13YXJlX3N3X3ZlcnNpb24ubW9kZWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZmlybXdhcmVfc3dfdmVyc2lvbi5idWlsZF90aW1lIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBzbnByaW50Zih2YWwuYnVpbGRfdGltZSwgMzIsICIlcyIsIGNsaV9wYXJtLT52YWx1ZS5zdHJpbmcpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5maXJtd2FyZV9zd192ZXJzaW9uLmJ1aWxkX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGZpcm13YXJlX3N3X3ZlcnNpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0ZJUk1XQVJFX1NXX1ZFUlNJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGZpcm13YXJlX3N3X3ZlcnNpb24sIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaXJtd2FyZV9zd192ZXJzaW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCBmaXJtd2FyZV9zd192ZXJzaW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgZmlybXdhcmVfc3dfdmVyc2lvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5ob3N0X3N3X3ZlcnNpb24uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfaG9zdF9zd192ZXJzaW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuaG9zdF9zd192ZXJzaW9uLm1ham9yIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWFqb3IgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuaG9zdF9zd192ZXJzaW9uLm1ham9yIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmhvc3Rfc3dfdmVyc2lvbi5taW5vciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1pbm9yID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmhvc3Rfc3dfdmVyc2lvbi5taW5vciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5ob3N0X3N3X3ZlcnNpb24ucmV2aXNpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5yZXZpc2lvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5ob3N0X3N3X3ZlcnNpb24ucmV2aXNpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuaG9zdF9zd192ZXJzaW9uLm1vZGVsIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubW9kZWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuaG9zdF9zd192ZXJzaW9uLm1vZGVsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmhvc3Rfc3dfdmVyc2lvbi5idWlsZF90aW1lIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBzbnByaW50Zih2YWwuYnVpbGRfdGltZSwgMzIsICIlcyIsIGNsaV9wYXJtLT52YWx1ZS5zdHJpbmcpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5ob3N0X3N3X3ZlcnNpb24uYnVpbGRfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgaG9zdF9zd192ZXJzaW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2hvc3Rfc3dfdmVyc2lvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0hPU1RfU1dfVkVSU0lPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgaG9zdF9zd192ZXJzaW9uLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaG9zdF9zd192ZXJzaW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCBob3N0X3N3X3ZlcnNpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCBob3N0X3N3X3ZlcnNpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5jaGlwX3JldmlzaW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZGV2aWNlX2NoaXBfcmV2aXNpb24gdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2RldmljZV9jaGlwX3JldmlzaW9uKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBjaGlwX3JldmlzaW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgY2hpcF9yZXZpc2lvbiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0NGR19JRF9DSElQX1JFVklTSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2hpcF9yZXZpc2lvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgY2hpcF9yZXZpc2lvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIGNoaXBfcmV2aXNpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2RldmljZV9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZGV2aWNlX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBzdGF0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIHN0YXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1NUQVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIHN0YXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgc3RhdGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuZGVidWcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZGVidWdfZGV2aWNlX2NmZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRlYnVnLmhvc3RfZG1hX3J4X3F1ZXVlX3NpemUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5ob3N0X2RtYV9yeF9xdWV1ZV9zaXplID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmRlYnVnLmhvc3RfZG1hX3J4X3F1ZXVlX3NpemUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZGVidWcuaG9zdF9kbWFfdHhfcXVldWVfc2l6ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmhvc3RfZG1hX3R4X3F1ZXVlX3NpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZGVidWcuaG9zdF9kbWFfdHhfcXVldWVfc2l6ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kZWJ1Zy5hdnNfY29udHJvbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmF2c19jb250cm9sID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZGVidWcuYXZzX2NvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZGVidWcudXNlX3ByZXZfcG9uX3NlcmRlc19maXJtd2FyZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnVzZV9wcmV2X3Bvbl9zZXJkZXNfZmlybXdhcmUgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5kZWJ1Zy51c2VfcHJldl9wb25fc2VyZGVzX2Zpcm13YXJlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRlYnVnLnVzZV9wcmV2X25uaV9zZXJkZXNfZmlybXdhcmUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC51c2VfcHJldl9ubmlfc2VyZGVzX2Zpcm13YXJlID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZGVidWcudXNlX3ByZXZfbm5pX3NlcmRlc19maXJtd2FyZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgZGVidWcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZGVidWdfZGV2aWNlX2NmZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0RFQlVHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBkZWJ1ZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlYnVnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCBkZWJ1Zyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIGRlYnVnKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLm5uaV9zcGVlZC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9kZXZpY2Vfbm5pX3NwZWVkIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubm5pX3NwZWVkLmZpcnN0X2hhbGYiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5maXJzdF9oYWxmID0gKGJjbW9sdF9ubmlfc3BlZWQpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubm5pX3NwZWVkLmZpcnN0X2hhbGYgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubm5pX3NwZWVkLnNlY29uZF9oYWxmIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc2Vjb25kX2hhbGYgPSAoYmNtb2x0X25uaV9zcGVlZCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5ubmlfc3BlZWQuc2Vjb25kX2hhbGYgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIG5uaV9zcGVlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpY2Vfbm5pX3NwZWVkIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFVklDRV9DRkdfSURfTk5JX1NQRUVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBubmlfc3BlZWQsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJubmlfc3BlZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIG5uaV9zcGVlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIG5uaV9zcGVlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByb3RlY3Rpb25fc3dpdGNoaW5nX2V4dF9pcnEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9leHRfaXJxIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9leHRfaXJxKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19leHRfaXJxLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZXh0X2lycSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19FWFRfSVJRLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfZXh0X2lycSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZXh0X2lycSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIHByb3RlY3Rpb25fc3dpdGNoaW5nX2V4dF9pcnEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lcG9uX2Nsb2NrX3RyYW5zcG9ydF9zYW1wbGVfZGVsYXkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBlcG9uX2Nsb2NrX3RyYW5zcG9ydF9zYW1wbGVfZGVsYXksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBlcG9uX2Nsb2NrX3RyYW5zcG9ydF9zYW1wbGVfZGVsYXksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFVklDRV9DRkdfSURfRVBPTl9DTE9DS19UUkFOU1BPUlRfU0FNUExFX0RFTEFZLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9jbG9ja190cmFuc3BvcnRfc2FtcGxlX2RlbGF5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCBlcG9uX2Nsb2NrX3RyYW5zcG9ydF9zYW1wbGVfZGVsYXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCBlcG9uX2Nsb2NrX3RyYW5zcG9ydF9zYW1wbGVfZGVsYXkpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuaW5kaWNhdGlvbl9zaGFwaW5nLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2luZGljYXRpb25fc2hhcGluZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmluZGljYXRpb25fc2hhcGluZy5lbmFibGVkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZW5hYmxlZCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmluZGljYXRpb25fc2hhcGluZy5lbmFibGVkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmluZGljYXRpb25fc2hhcGluZy5tYXhfcmF0ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1heF9yYXRlID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmluZGljYXRpb25fc2hhcGluZy5tYXhfcmF0ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5pbmRpY2F0aW9uX3NoYXBpbmcubWF4X2J1cnN0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWF4X2J1cnN0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmluZGljYXRpb25fc2hhcGluZy5tYXhfYnVyc3QgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGluZGljYXRpb25fc2hhcGluZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9pbmRpY2F0aW9uX3NoYXBpbmcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0NGR19JRF9JTkRJQ0FUSU9OX1NIQVBJTkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGluZGljYXRpb25fc2hhcGluZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImluZGljYXRpb25fc2hhcGluZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgaW5kaWNhdGlvbl9zaGFwaW5nKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgaW5kaWNhdGlvbl9zaGFwaW5nKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY2hpcF90ZW1wZXJhdHVyZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGNoaXBfdGVtcGVyYXR1cmUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBjaGlwX3RlbXBlcmF0dXJlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0NISVBfVEVNUEVSQVRVUkUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjaGlwX3RlbXBlcmF0dXJlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCBjaGlwX3RlbXBlcmF0dXJlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgY2hpcF90ZW1wZXJhdHVyZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmdwb25feGdwb25fdG9kX2VuYWJsZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2NvbnRyb2xfc3RhdGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2VuYWJsZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2VuYWJsZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0NGR19JRF9HUE9OX1hHUE9OX1RPRF9FTkFCTEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJncG9uX3hncG9uX3RvZF9lbmFibGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2VuYWJsZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2VuYWJsZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmdwb25feGdwb25fdG9kX2dwaW9fcGluIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bpb19waW4gdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2dwaW9fcGluKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9ncGlvX3BpbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2dwaW9fcGluLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX0dQSU9fUElOLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ3Bvbl94Z3Bvbl90b2RfZ3Bpb19waW4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2dwaW9fcGluKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgZ3Bvbl94Z3Bvbl90b2RfZ3Bpb19waW4pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5ncG9uX3hncG9uX3RvZF9jb25uZWN0ZWRfaW50ZXJuYWxseSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9jb25uZWN0ZWRfaW50ZXJuYWxseSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2Nvbm5lY3RlZF9pbnRlcm5hbGx5LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX0NPTk5FQ1RFRF9JTlRFUk5BTExZLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ3Bvbl94Z3Bvbl90b2RfY29ubmVjdGVkX2ludGVybmFsbHkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2Nvbm5lY3RlZF9pbnRlcm5hbGx5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgZ3Bvbl94Z3Bvbl90b2RfY29ubmVjdGVkX2ludGVybmFsbHkpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuZXBvbl84MDIxX2FzX3RvZF9mb3JtYXQuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc3RyXzI1NiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVwb25fODAyMV9hc190b2RfZm9ybWF0LnN0ciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc25wcmludGYodmFsLnN0ciwgMjU2LCAiJXMiLCBjbGlfcGFybS0+dmFsdWUuc3RyaW5nKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZXBvbl84MDIxX2FzX3RvZF9mb3JtYXQuc3RyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBlcG9uXzgwMjFfYXNfdG9kX2Zvcm1hdCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdHJfMjU2IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFVklDRV9DRkdfSURfRVBPTl84MDIxX0FTX1RPRF9GT1JNQVQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGVwb25fODAyMV9hc190b2RfZm9ybWF0LCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl84MDIxX2FzX3RvZF9mb3JtYXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIGVwb25fODAyMV9hc190b2RfZm9ybWF0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgZXBvbl84MDIxX2FzX3RvZF9mb3JtYXQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lcG9uX3NoYXBlcl9tb2RlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc2hhcGVyX21vZGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3NoYXBlcl9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCBlcG9uX3NoYXBlcl9tb2RlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgZXBvbl9zaGFwZXJfbW9kZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0NGR19JRF9FUE9OX1NIQVBFUl9NT0RFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9zaGFwZXJfbW9kZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgZXBvbl9zaGFwZXJfbW9kZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIGVwb25fc2hhcGVyX21vZGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuZW1iZWRkZWRfaW1hZ2VfbGlzdC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9saXN0X3U4IHZhbCA9IHsgfTsKKyAgICAgICAgaW50MzJfdCBpMDsKKyAgICAgICAgdmFsLnZhbCA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgY2xpX3Bhcm0tPmFycmF5X3NpemUgKiBzaXplb2YoKnZhbC52YWwpKTsKKyAgICAgICAgaWYgKHZhbC52YWwgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgICAgIH0KKworICAgICAgICB2YWwubGVuID0gY2xpX3Bhcm0tPmFycmF5X3NpemU7CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVtYmVkZGVkX2ltYWdlX2xpc3QuaW1hZ2VfdHlwZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5sZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lbWJlZGRlZF9pbWFnZV9saXN0LmltYWdlX3R5cGUgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB2YWwubGVuOyBpMCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC52YWxbaTBdLmltYWdlX3R5cGUgPSAoYmNtb2x0X2RldmljZV9pbWFnZV90eXBlKSBjbGlfcGFybS0+dmFsdWVzW2kwXS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVtYmVkZGVkX2ltYWdlX2xpc3QuaW1hZ2Vfc2l6ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5sZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lbWJlZGRlZF9pbWFnZV9saXN0LmltYWdlX3NpemUgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB2YWwubGVuOyBpMCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC52YWxbaTBdLmltYWdlX3NpemUgPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZW1iZWRkZWRfaW1hZ2VfbGlzdC5jcmMzMiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5sZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lbWJlZGRlZF9pbWFnZV9saXN0LmNyYzMyIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdmFsLmxlbjsgaTArKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudmFsW2kwXS5jcmMzMiA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lbWJlZGRlZF9pbWFnZV9saXN0LnN0YXR1cyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5sZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lbWJlZGRlZF9pbWFnZV9saXN0LnN0YXR1cyBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHZhbC5sZW47IGkwKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnZhbFtpMF0uc3RhdHVzID0gKGJjbW9sdF9lbWJlZGRlZF9pbWFnZV90cmFuc2Zlcl9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZXNbaTBdLmVudW1fdmFsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZW1iZWRkZWRfaW1hZ2VfbGlzdC5pbWFnZV9uYW1lIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gdmFsLmxlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVtYmVkZGVkX2ltYWdlX2xpc3QuaW1hZ2VfbmFtZSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHZhbC5sZW47IGkwKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc25wcmludGYodmFsLnZhbFtpMF0uaW1hZ2VfbmFtZSwgNjQsICIlcyIsIGNsaV9wYXJtLT52YWx1ZXNbaTBdLnN0cmluZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgZW1iZWRkZWRfaW1hZ2VfbGlzdCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9saXN0X3U4IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFVklDRV9DRkdfSURfRU1CRURERURfSU1BR0VfTElTVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgZW1iZWRkZWRfaW1hZ2VfbGlzdCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVtYmVkZGVkX2ltYWdlX2xpc3QiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIGVtYmVkZGVkX2ltYWdlX2xpc3QpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCBlbWJlZGRlZF9pbWFnZV9saXN0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY2hpcF92b2x0YWdlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgY2hpcF92b2x0YWdlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgY2hpcF92b2x0YWdlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0NISVBfVk9MVEFHRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNoaXBfdm9sdGFnZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgY2hpcF92b2x0YWdlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgY2hpcF92b2x0YWdlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmVwb25fdG9kX3N0cmluZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zdHJfMjU2IHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZXBvbl90b2Rfc3RyaW5nLnN0ciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc25wcmludGYodmFsLnN0ciwgMjU2LCAiJXMiLCBjbGlfcGFybS0+dmFsdWUuc3RyaW5nKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZXBvbl90b2Rfc3RyaW5nLnN0ciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgZXBvbl90b2Rfc3RyaW5nLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0cl8yNTYgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0NGR19JRF9FUE9OX1RPRF9TVFJJTkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGVwb25fdG9kX3N0cmluZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fdG9kX3N0cmluZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgZXBvbl90b2Rfc3RyaW5nKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgZXBvbl90b2Rfc3RyaW5nKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIueGdwb25fbnVtX29mX29udXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9udW1fb2Zfb251cyB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfeGdwb25fbnVtX29mX29udXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIHhncG9uX251bV9vZl9vbnVzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgeGdwb25fbnVtX29mX29udXMsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFVklDRV9DRkdfSURfWEdQT05fTlVNX09GX09OVVMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ4Z3Bvbl9udW1fb2Zfb251cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgeGdwb25fbnVtX29mX29udXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCB4Z3Bvbl9udW1fb2Zfb251cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRldmljZV9pcF9hZGRyZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19pcHY0X2FkZHJlc3MgdmFsOworICAgICAgICB2YWwgPSBhcGljbGlfdW51bWJlcl90b19pcHY0KGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyKTsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGRldmljZV9pcF9hZGRyZXNzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgZGV2aWNlX2lwX2FkZHJlc3MsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFVklDRV9DRkdfSURfREVWSUNFX0lQX0FERFJFU1MsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZXZpY2VfaXBfYWRkcmVzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgZGV2aWNlX2lwX2FkZHJlc3MpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCBkZXZpY2VfaXBfYWRkcmVzcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRldmljZV91ZHBfcG9ydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDE2X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGRldmljZV91ZHBfcG9ydCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGRldmljZV91ZHBfcG9ydCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0NGR19JRF9ERVZJQ0VfVURQX1BPUlQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZXZpY2VfdWRwX3BvcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIGRldmljZV91ZHBfcG9ydCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIGRldmljZV91ZHBfcG9ydCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnRvZF91YXJ0X2JhdWRyYXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdWFydF9iYXVkcmF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfdWFydF9iYXVkcmF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgdG9kX3VhcnRfYmF1ZHJhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZGV2aWNlLCB0b2RfdWFydF9iYXVkcmF0ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0NGR19JRF9UT0RfVUFSVF9CQVVEUkFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRvZF91YXJ0X2JhdWRyYXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCB0b2RfdWFydF9iYXVkcmF0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIHRvZF91YXJ0X2JhdWRyYXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZ3Bvbl94Z3Bvbl90b2Rfc3RyaW5nX2xlbmd0aCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgZ3Bvbl94Z3Bvbl90b2Rfc3RyaW5nX2xlbmd0aCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIGdwb25feGdwb25fdG9kX3N0cmluZ19sZW5ndGgsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0RFVklDRV9DRkdfSURfR1BPTl9YR1BPTl9UT0RfU1RSSU5HX0xFTkdUSCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdwb25feGdwb25fdG9kX3N0cmluZ19sZW5ndGgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBkZXZpY2UsIGdwb25feGdwb25fdG9kX3N0cmluZ19sZW5ndGgpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9zdHJpbmdfbGVuZ3RoKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBkZXZpY2UsIHN5c3RlbV9tb2RlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZGV2aWNlLCBrZWVwYWxpdmVfaW50ZXJ2YWwpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBkZXZpY2UsIGtlZXBhbGl2ZV90b2xlcmFuY2UpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBkZXZpY2UsIGZpcm13YXJlX3N3X3ZlcnNpb24pICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBkZXZpY2UsIGhvc3Rfc3dfdmVyc2lvbikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGRldmljZSwgY2hpcF9yZXZpc2lvbikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGRldmljZSwgc3RhdGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBkZXZpY2UsIGRlYnVnKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZGV2aWNlLCBubmlfc3BlZWQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBkZXZpY2UsIHByb3RlY3Rpb25fc3dpdGNoaW5nX2V4dF9pcnEpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBkZXZpY2UsIGVwb25fY2xvY2tfdHJhbnNwb3J0X3NhbXBsZV9kZWxheSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGRldmljZSwgaW5kaWNhdGlvbl9zaGFwaW5nKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZGV2aWNlLCBjaGlwX3RlbXBlcmF0dXJlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9lbmFibGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBkZXZpY2UsIGdwb25feGdwb25fdG9kX2dwaW9fcGluKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZGV2aWNlLCBncG9uX3hncG9uX3RvZF9jb25uZWN0ZWRfaW50ZXJuYWxseSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGRldmljZSwgZXBvbl84MDIxX2FzX3RvZF9mb3JtYXQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBkZXZpY2UsIGVwb25fc2hhcGVyX21vZGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBkZXZpY2UsIGVtYmVkZGVkX2ltYWdlX2xpc3QpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBkZXZpY2UsIGNoaXBfdm9sdGFnZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGRldmljZSwgZXBvbl90b2Rfc3RyaW5nKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZGV2aWNlLCB4Z3Bvbl9udW1fb2Zfb251cykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGRldmljZSwgZGV2aWNlX2lwX2FkZHJlc3MpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBkZXZpY2UsIGRldmljZV91ZHBfcG9ydCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGRldmljZSwgdG9kX3VhcnRfYmF1ZHJhdGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBkZXZpY2UsIGdwb25feGdwb25fdG9kX3N0cmluZ19sZW5ndGgpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZGV2aWNlLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGRldmljZSwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9kZXZpY2Vfb3Blcl9jb25uZWN0X3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2RldmljZV9jb25uZWN0IG9wZXI7ICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2RldmljZV9rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWNlX2Nvbm5lY3Qgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpY2Vfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGRldmljZSwgY29ubmVjdCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBkZXZpY2UsIGNvbm5lY3QsIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZGV2aWNlX29wZXJfZGlzY29ubmVjdF9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9kZXZpY2VfZGlzY29ubmVjdCBvcGVyOyAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmljZV9kaXNjb25uZWN0IG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWNlX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBkZXZpY2UsIGRpc2Nvbm5lY3QsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZGV2aWNlLCBkaXNjb25uZWN0LCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2RldmljZV9vcGVyX3Jlc2V0X3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZGV2aWNlX3Jlc2V0IG9wZXI7ICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZGV2aWNlX2tleSBrZXkgPSB7IH07ICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpY2VfcmVzZXQgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpY2Vfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGRldmljZSwgcmVzZXQsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZGV2aWNlLCByZXNldCwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtb2RlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZGV2aWNlX3Jlc2V0X21vZGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2RldmljZV9yZXNldF9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBkZXZpY2UsIHJlc2V0LCBtb2RlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZGV2aWNlLCByZXNldCwgbW9kZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0RFVklDRV9PUEVSX0lEX1JFU0VULCBCQ01PTFRfREVWSUNFX1JFU0VUX0lEX01PREUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9kZXZpY2Vfb3Blcl9ob3N0X2tlZXBfYWxpdmVfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlIG9wZXI7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZGV2aWNlX2tleSBrZXkgPSB7IH07ICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZSBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmljZV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZGV2aWNlLCBob3N0X2tlZXBfYWxpdmUsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZGV2aWNlLCBob3N0X2tlZXBfYWxpdmUsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2VxdWVuY2VfbnVtYmVyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZGV2aWNlLCBob3N0X2tlZXBfYWxpdmUsIHNlcXVlbmNlX251bWJlciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGRldmljZSwgaG9zdF9rZWVwX2FsaXZlLCBzZXF1ZW5jZV9udW1iZXIsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9IT1NUX0tFRVBfQUxJVkUsIEJDTU9MVF9ERVZJQ0VfSE9TVF9LRUVQX0FMSVZFX0lEX1NFUVVFTkNFX05VTUJFUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRpbWVfc3RhbXAiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBkZXZpY2UsIGhvc3Rfa2VlcF9hbGl2ZSwgdGltZV9zdGFtcCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGRldmljZSwgaG9zdF9rZWVwX2FsaXZlLCB0aW1lX3N0YW1wLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfREVWSUNFX09QRVJfSURfSE9TVF9LRUVQX0FMSVZFLCBCQ01PTFRfREVWSUNFX0hPU1RfS0VFUF9BTElWRV9JRF9USU1FX1NUQU1QLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZGV2aWNlX29wZXJfc3dfdXBncmFkZV9hY3RpdmF0ZV9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9kZXZpY2Vfc3dfdXBncmFkZV9hY3RpdmF0ZSBvcGVyOyAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2RldmljZV9rZXkga2V5ID0geyB9OyAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpY2Vfc3dfdXBncmFkZV9hY3RpdmF0ZSBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmljZV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZGV2aWNlLCBzd191cGdyYWRlX2FjdGl2YXRlLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGRldmljZSwgc3dfdXBncmFkZV9hY3RpdmF0ZSwga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9kZXZpY2Vfb3Blcl9pbWFnZV90cmFuc2Zlcl9zdGFydF9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydCBvcGVyOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2RldmljZV9rZXkga2V5ID0geyB9OyAgICAgICAgICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0IG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWNlX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBkZXZpY2UsIGltYWdlX3RyYW5zZmVyX3N0YXJ0LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGRldmljZSwgaW1hZ2VfdHJhbnNmZXJfc3RhcnQsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaW1hZ2VfdHlwZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2RldmljZV9pbWFnZV90eXBlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZGV2aWNlLCBpbWFnZV90cmFuc2Zlcl9zdGFydCwgaW1hZ2VfdHlwZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGRldmljZSwgaW1hZ2VfdHJhbnNmZXJfc3RhcnQsIGltYWdlX3R5cGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9JTUFHRV9UUkFOU0ZFUl9TVEFSVCwgQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9TVEFSVF9JRF9JTUFHRV9UWVBFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaW1hZ2Vfc2l6ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGRldmljZSwgaW1hZ2VfdHJhbnNmZXJfc3RhcnQsIGltYWdlX3NpemUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBkZXZpY2UsIGltYWdlX3RyYW5zZmVyX3N0YXJ0LCBpbWFnZV9zaXplLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfREVWSUNFX09QRVJfSURfSU1BR0VfVFJBTlNGRVJfU1RBUlQsIEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfU1RBUlRfSURfSU1BR0VfU0laRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNyYzMyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZGV2aWNlLCBpbWFnZV90cmFuc2Zlcl9zdGFydCwgY3JjMzIsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBkZXZpY2UsIGltYWdlX3RyYW5zZmVyX3N0YXJ0LCBjcmMzMiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0RFVklDRV9PUEVSX0lEX0lNQUdFX1RSQU5TRkVSX1NUQVJULCBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX1NUQVJUX0lEX0NSQzMyLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImltYWdlX25hbWUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc3RyXzY0IHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpbWFnZV9uYW1lLnN0ciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc25wcmludGYodmFsLnN0ciwgNjQsICIlcyIsIGNsaV9wYXJtLT52YWx1ZS5zdHJpbmcpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImltYWdlX25hbWUuc3RyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBkZXZpY2UsIGltYWdlX3RyYW5zZmVyX3N0YXJ0LCBpbWFnZV9uYW1lLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0cl82NCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfREVWSUNFX09QRVJfSURfSU1BR0VfVFJBTlNGRVJfU1RBUlQsIEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfU1RBUlRfSURfSU1BR0VfTkFNRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZGV2aWNlLCBpbWFnZV90cmFuc2Zlcl9zdGFydCwgaW1hZ2VfbmFtZSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2RldmljZV9vcGVyX2ltYWdlX3RyYW5zZmVyX2RhdGFfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhIG9wZXI7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZGV2aWNlX2tleSBrZXkgPSB7IH07ICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWNlX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBkZXZpY2UsIGltYWdlX3RyYW5zZmVyX2RhdGEsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZGV2aWNlLCBpbWFnZV90cmFuc2Zlcl9kYXRhLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJsb2NrX251bWJlciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGRldmljZSwgaW1hZ2VfdHJhbnNmZXJfZGF0YSwgYmxvY2tfbnVtYmVyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZGV2aWNlLCBpbWFnZV90cmFuc2Zlcl9kYXRhLCBibG9ja19udW1iZXIsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9JTUFHRV9UUkFOU0ZFUl9EQVRBLCBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX0RBVEFfSURfQkxPQ0tfTlVNQkVSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibW9yZV9kYXRhIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGRldmljZSwgaW1hZ2VfdHJhbnNmZXJfZGF0YSwgbW9yZV9kYXRhLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZGV2aWNlLCBpbWFnZV90cmFuc2Zlcl9kYXRhLCBtb3JlX2RhdGEsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9JTUFHRV9UUkFOU0ZFUl9EQVRBLCBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX0RBVEFfSURfTU9SRV9EQVRBLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGF0YSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3U4X2xpc3RfdTE2X2hleCB2YWwgPSB7IH07CisgICAgICAgIHZhbC5sZW4gPSBiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKTsKKyAgICAgICAgdmFsLnZhbCA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgdmFsLmxlbik7CisgICAgICAgIGlmICh2YWwudmFsID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICB9CisKKyAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwudmFsLCB2YWwubGVuKTsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGRldmljZSwgaW1hZ2VfdHJhbnNmZXJfZGF0YSwgZGF0YSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF91OF9saXN0X3UxNl9oZXggdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0RFVklDRV9PUEVSX0lEX0lNQUdFX1RSQU5TRkVSX0RBVEEsIEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfREFUQV9JRF9EQVRBLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBkZXZpY2UsIGltYWdlX3RyYW5zZmVyX2RhdGEsIGRhdGEsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9kZXZpY2Vfb3Blcl9ydW5fZGRyX3Rlc3Rfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0IG9wZXI7ICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZGV2aWNlX2tleSBrZXkgPSB7IH07ICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdCBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmljZV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZGV2aWNlLCBydW5fZGRyX3Rlc3QsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZGV2aWNlLCBydW5fZGRyX3Rlc3QsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY3B1Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGRldmljZSwgcnVuX2Rkcl90ZXN0LCBjcHUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBkZXZpY2UsIHJ1bl9kZHJfdGVzdCwgY3B1LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfREVWSUNFX09QRVJfSURfUlVOX0REUl9URVNULCBCQ01PTFRfREVWSUNFX1JVTl9ERFJfVEVTVF9JRF9DUFUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYXNfMCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBkZXZpY2UsIHJ1bl9kZHJfdGVzdCwgcmFzXzAsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBkZXZpY2UsIHJ1bl9kZHJfdGVzdCwgcmFzXzAsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9SVU5fRERSX1RFU1QsIEJDTU9MVF9ERVZJQ0VfUlVOX0REUl9URVNUX0lEX1JBU18wLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFzXzEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZGV2aWNlLCBydW5fZGRyX3Rlc3QsIHJhc18xLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZGV2aWNlLCBydW5fZGRyX3Rlc3QsIHJhc18xLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfREVWSUNFX09QRVJfSURfUlVOX0REUl9URVNULCBCQ01PTFRfREVWSUNFX1JVTl9ERFJfVEVTVF9JRF9SQVNfMSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2RldmljZV9hdXRvX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2RldmljZV9hdXRvX2NmZyBhdXRvX2NmZzsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGtleSA9IHsgfTsgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpY2VfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWNlX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfZ2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY29ubmVjdGlvbl9jb21wbGV0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGRldmljZSwgY29ubmVjdGlvbl9jb21wbGV0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGNvbm5lY3Rpb25fY29tcGxldGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNvbm5lY3Rpb25fZXN0YWJsaXNoZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGNvbm5lY3Rpb25fZXN0YWJsaXNoZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZGV2aWNlLCBjb25uZWN0aW9uX2VzdGFibGlzaGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb25uZWN0aW9uX2ZhaWx1cmUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGNvbm5lY3Rpb25fZmFpbHVyZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGNvbm5lY3Rpb25fZmFpbHVyZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGRyX3Rlc3RfY29tcGxldGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGRkcl90ZXN0X2NvbXBsZXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGRldmljZSwgZGRyX3Rlc3RfY29tcGxldGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRldmljZV9rZWVwX2FsaXZlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZGV2aWNlLCBkZXZpY2Vfa2VlcF9hbGl2ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGRldmljZV9rZWVwX2FsaXZlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZXZpY2VfcmVhZHkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGRldmljZV9yZWFkeSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGRldmljZV9yZWFkeSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGlzY29ubmVjdGlvbl9jb21wbGV0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGRldmljZSwgZGlzY29ubmVjdGlvbl9jb21wbGV0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGRpc2Nvbm5lY3Rpb25fY29tcGxldGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImltYWdlX3RyYW5zZmVyX2NvbXBsZXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZGV2aWNlLCBpbWFnZV90cmFuc2Zlcl9jb21wbGV0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGltYWdlX3RyYW5zZmVyX2NvbXBsZXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpbmRpY2F0aW9uc19kcm9wcGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZGV2aWNlLCBpbmRpY2F0aW9uc19kcm9wcGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGRldmljZSwgaW5kaWNhdGlvbnNfZHJvcHBlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3dfZXJyb3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIHN3X2Vycm9yKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGRldmljZSwgc3dfZXJyb3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN3X2V4Y2VwdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGRldmljZSwgc3dfZXhjZXB0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGRldmljZSwgc3dfZXhjZXB0aW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGNvbm5lY3Rpb25fY29tcGxldGUpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGNvbm5lY3Rpb25fZXN0YWJsaXNoZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGNvbm5lY3Rpb25fZmFpbHVyZSkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGRldmljZSwgZGRyX3Rlc3RfY29tcGxldGUpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGRldmljZV9rZWVwX2FsaXZlKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZGV2aWNlLCBkZXZpY2VfcmVhZHkpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGRpc2Nvbm5lY3Rpb25fY29tcGxldGUpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGltYWdlX3RyYW5zZmVyX2NvbXBsZXRlKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZGV2aWNlLCBpbmRpY2F0aW9uc19kcm9wcGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZGV2aWNlLCBzd19lcnJvcikgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGRldmljZSwgc3dfZXhjZXB0aW9uKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGRldmljZSwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmF1dG9fY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9kZXZpY2VfYXV0b19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9kZXZpY2VfYXV0b19jZmcgYXV0b19jZmc7ICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZGV2aWNlX2tleSBrZXkgPSB7IH07ICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWNlX2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmljZV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX3NldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZGV2aWNlLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZGV2aWNlLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNvbm5lY3Rpb25fY29tcGxldGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGNvbm5lY3Rpb25fY29tcGxldGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGRldmljZSwgY29ubmVjdGlvbl9jb21wbGV0ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfQ09OTkVDVElPTl9DT01QTEVURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNvbm5lY3Rpb25fZXN0YWJsaXNoZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGNvbm5lY3Rpb25fZXN0YWJsaXNoZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGRldmljZSwgY29ubmVjdGlvbl9lc3RhYmxpc2hlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfQ09OTkVDVElPTl9FU1RBQkxJU0hFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNvbm5lY3Rpb25fZmFpbHVyZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGRldmljZSwgY29ubmVjdGlvbl9mYWlsdXJlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGNvbm5lY3Rpb25fZmFpbHVyZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfQ09OTkVDVElPTl9GQUlMVVJFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGRyX3Rlc3RfY29tcGxldGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGRkcl90ZXN0X2NvbXBsZXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGRkcl90ZXN0X2NvbXBsZXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9ERFJfVEVTVF9DT01QTEVURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRldmljZV9rZWVwX2FsaXZlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZGV2aWNlLCBkZXZpY2Vfa2VlcF9hbGl2ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZGV2aWNlLCBkZXZpY2Vfa2VlcF9hbGl2ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfREVWSUNFX0tFRVBfQUxJVkUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZXZpY2VfcmVhZHkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGRldmljZV9yZWFkeSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZGV2aWNlLCBkZXZpY2VfcmVhZHksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0RFVklDRV9SRUFEWSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRpc2Nvbm5lY3Rpb25fY29tcGxldGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGRpc2Nvbm5lY3Rpb25fY29tcGxldGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGRldmljZSwgZGlzY29ubmVjdGlvbl9jb21wbGV0ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfRElTQ09OTkVDVElPTl9DT01QTEVURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImltYWdlX3RyYW5zZmVyX2NvbXBsZXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZGV2aWNlLCBpbWFnZV90cmFuc2Zlcl9jb21wbGV0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZGV2aWNlLCBpbWFnZV90cmFuc2Zlcl9jb21wbGV0ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9ERVZJQ0UsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfSU1BR0VfVFJBTlNGRVJfQ09NUExFVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpbmRpY2F0aW9uc19kcm9wcGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZGV2aWNlLCBpbmRpY2F0aW9uc19kcm9wcGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBkZXZpY2UsIGluZGljYXRpb25zX2Ryb3BwZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0lORElDQVRJT05TX0RST1BQRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzd19lcnJvciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGRldmljZSwgc3dfZXJyb3IsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGRldmljZSwgc3dfZXJyb3IsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfREVWSUNFLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX1NXX0VSUk9SLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3dfZXhjZXB0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZGV2aWNlLCBzd19leGNlcHRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGRldmljZSwgc3dfZXhjZXB0aW9uLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0RFVklDRSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9TV19FWENFUFRJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmcgY2ZnOyAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSBrZXkgPSB7IH07ICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0RFTklFRF9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm1hY19hZGRyZXNzID0gY2xpX3Bhcm0tPnZhbHVlLm1hYzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1hY19hZGRyZXNzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5tYWNfYWRkcmVzcyA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0RFTklFRF9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfS0VZX0lEX01BQ19BRERSRVNTLCAma2V5Lm1hY19hZGRyZXNzKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9kZW5pZWRfbGluaywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9kZW5pZWRfbGluaywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGFybV9zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9kZW5pZWRfbGluaywgYWxhcm1fc3RhdGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX2RlbmllZF9saW5rLCBhbGFybV9zdGF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX2RlbmllZF9saW5rLCBhbGFybV9zdGF0ZSkpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fZGVuaWVkX2xpbmssIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX2RlbmllZF9saW5rLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9kZW5pZWRfbGlua19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZyBjZmc7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fREVOSUVEX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkubWFjX2FkZHJlc3MgPSBjbGlfcGFybS0+dmFsdWUubWFjOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWFjX2FkZHJlc3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm1hY19hZGRyZXNzID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fREVOSUVEX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19LRVlfSURfTUFDX0FERFJFU1MsICZrZXkubWFjX2FkZHJlc3MpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX2RlbmllZF9saW5rLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX2RlbmllZF9saW5rLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2NsZWFyKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZyBjZmc7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19jbGVhciIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9ERU5JRURfTElOSywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5tYWNfYWRkcmVzcyA9IGNsaV9wYXJtLT52YWx1ZS5tYWM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYWNfYWRkcmVzcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkubWFjX2FkZHJlc3MgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9ERU5JRURfTElOSywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0tFWV9JRF9NQUNfQUREUkVTUywgJmtleS5tYWNfYWRkcmVzcyk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fZGVuaWVkX2xpbmssIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fZGVuaWVkX2xpbmssIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX2RlbmllZF9saW5rX2NmZ19nZXRfbXVsdGkoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmcgY2ZnOyAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSBrZXkgPSB7IH07ICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X21zZ19zZXQgKm1zZ19zZXQgPSBOVUxMOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtZXNzYWdlIHNldCAqLworICAgIHVpbnQzMl90IG1heF9tc2dzOyAgICAgICAgICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgbWF4IG51bWJlciBvZiBtc2dzIHRvIGdldCAqLworICAgIGJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjsgICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgZmlsdGVyIGludmVydCBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldCogbXNnX3NldCA9IE5VTEw7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50MzJfdCBtYXhfbXNncztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXRfbXVsdGkiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fREVOSUVEX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkubWFjX2FkZHJlc3MgPSBjbGlfcGFybS0+dmFsdWUubWFjOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWFjX2FkZHJlc3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm1hY19hZGRyZXNzID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fREVOSUVEX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19LRVlfSURfTUFDX0FERFJFU1MsICZrZXkubWFjX2FkZHJlc3MpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IG1heCBudW1iZXIgb2YgbXNncyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1heF9tc2dzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBtYXhfbXNncyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWF4X21zZ3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygibWF4X21zZ3MgPSAlZDtcbiIsIG1heF9tc2dzKTsKKworICAgIC8qIHNldCBmaWx0ZXIgaW52ZXJ0IGZsYWcgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXJfaW52ZXJ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnZlcnRfZmlsdGVyID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlcl9pbnZlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiaW52ZXJ0X2ZpbHRlciA9ICVzO1xuIiwgKGludmVydF9maWx0ZXIpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBhbGxvY2F0ZSBtZXNzYWdlIHNldCAqLworICAgIGVyciA9IGFwaWNsaV9tc2dfc2V0X2FsbG9jKGJ5dGVfcG9vbCwgQkNNT0xUX09CSl9JRF9FUE9OX0RFTklFRF9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfRVBPTl9ERU5JRURfTElOSywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9kZW5pZWRfbGluaywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9kZW5pZWRfbGluaywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYWxhcm1fc3RhdGUgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUudW5rbm93bl9saW5rX3Zpb2xhdGlvbi4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLnVua25vd25fbGlua192aW9sYXRpb24ubGlua19yYXRlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudW5rbm93bl9saW5rX3Zpb2xhdGlvbi5saW5rX3JhdGUgPSAoYmNtb2x0X2Vwb25fbGlua19yYXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGFybV9zdGF0ZS51bmtub3duX2xpbmtfdmlvbGF0aW9uLmxpbmtfcmF0ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS51bmtub3duX2xpbmtfdmlvbGF0aW9uLmFsYXJtX3N0YXR1cyIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnVua25vd25fbGlua192aW9sYXRpb24uYWxhcm1fc3RhdHVzID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLnVua25vd25fbGlua192aW9sYXRpb24uYWxhcm1fc3RhdHVzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLnVua25vd25fbGlua192aW9sYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUub3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbiA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLm92ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLm1heF9saW5rX3Zpb2xhdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1heF9saW5rX3Zpb2xhdGlvbiA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLm1heF9saW5rX3Zpb2xhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbiA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmxsaWRfcG9vbF9lbXB0eV92aW9sYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmxhc2VyX29uX29mZl92aW9sYXRpb24uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5sYXNlcl9vbl9vZmZfdmlvbGF0aW9uLmxhc2VyX29uX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5sYXNlcl9vbl9vZmZfdmlvbGF0aW9uLmxhc2VyX29uX3RpbWUgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmxhc2VyX29uX29mZl92aW9sYXRpb24ubGFzZXJfb25fdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5sYXNlcl9vbl9vZmZfdmlvbGF0aW9uLmxhc2VyX29mZl90aW1lIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwubGFzZXJfb25fb2ZmX3Zpb2xhdGlvbi5sYXNlcl9vZmZfdGltZSA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxhcm1fc3RhdGUubGFzZXJfb25fb2ZmX3Zpb2xhdGlvbi5sYXNlcl9vZmZfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5sYXNlcl9vbl9vZmZfdmlvbGF0aW9uLmFsYXJtX3N0YXR1cyIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLmxhc2VyX29uX29mZl92aW9sYXRpb24uYWxhcm1fc3RhdHVzID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmxhc2VyX29uX29mZl92aW9sYXRpb24uYWxhcm1fc3RhdHVzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmxhc2VyX29uX29mZl92aW9sYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUuc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnN5c3RlbV9yZXNvdXJjZV92aW9sYXRpb24gPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGFybV9zdGF0ZS5zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5yYW5nZV92aW9sYXRpb24uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5yYW5nZV92aW9sYXRpb24ucmFuZ2UiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yYW5nZV92aW9sYXRpb24ucmFuZ2UgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLnJhbmdlX3Zpb2xhdGlvbi5yYW5nZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5yYW5nZV92aW9sYXRpb24uYWxhcm1fc3RhdHVzIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucmFuZ2VfdmlvbGF0aW9uLmFsYXJtX3N0YXR1cyA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGFybV9zdGF0ZS5yYW5nZV92aW9sYXRpb24uYWxhcm1fc3RhdHVzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLnJhbmdlX3Zpb2xhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS50ZG1fY2hhbm5lbHNfZXhoYXVzdGVkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudGRtX2NoYW5uZWxzX2V4aGF1c3RlZCA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLnRkbV9jaGFubmVsc19leGhhdXN0ZWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLnJvZ3VlX3Zpb2xhdGlvbi4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLnJvZ3VlX3Zpb2xhdGlvbi5kZW5pZWRfbGxpZCIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnJvZ3VlX3Zpb2xhdGlvbi5kZW5pZWRfbGxpZCA9IChiY21vbHRfZXBvbl9sbGlkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLnJvZ3VlX3Zpb2xhdGlvbi5kZW5pZWRfbGxpZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5yb2d1ZV92aW9sYXRpb24uZGVuaWVkX3JhbmdlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucm9ndWVfdmlvbGF0aW9uLmRlbmllZF9yYW5nZSA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxhcm1fc3RhdGUucm9ndWVfdmlvbGF0aW9uLmRlbmllZF9yYW5nZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5yb2d1ZV92aW9sYXRpb24uYWxhcm1fc3RhdHVzIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucm9ndWVfdmlvbGF0aW9uLmFsYXJtX3N0YXR1cyA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGFybV9zdGF0ZS5yb2d1ZV92aW9sYXRpb24uYWxhcm1fc3RhdHVzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLnJvZ3VlX3Zpb2xhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS51cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbiA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLnVwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2RlbmllZF9saW5rLCBhbGFybV9zdGF0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2FsYXJtX3N0YXRlIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9ERU5JRURfTElOSywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0NGR19JRF9BTEFSTV9TVEFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fZGVuaWVkX2xpbmssIGFsYXJtX3N0YXRlLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxhcm1fc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2RlbmllZF9saW5rLCBhbGFybV9zdGF0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2RlbmllZF9saW5rLCBhbGFybV9zdGF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9kZW5pZWRfbGluaywgYWxhcm1fc3RhdGUpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9kZW5pZWRfbGluaywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2RlbmllZF9saW5rLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnIGF1dG9fY2ZnOyAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSBrZXkgPSB7IH07ICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX2dldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFzZXJfb25fb2ZmX3Zpb2xhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIGxhc2VyX29uX29mZl92aW9sYXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIGxsaWRfcG9vbF9lbXB0eV92aW9sYXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X2xpbmtfdmlvbGF0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgbWF4X2xpbmtfdmlvbGF0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIG1heF9saW5rX3Zpb2xhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2RlbmllZF9saW5rLCBvdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2RlbmllZF9saW5rLCBvdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2VfdmlvbGF0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgcmFuZ2VfdmlvbGF0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIHJhbmdlX3Zpb2xhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicm9ndWVfdmlvbGF0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgcm9ndWVfdmlvbGF0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIHJvZ3VlX3Zpb2xhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIHN5c3RlbV9yZXNvdXJjZV92aW9sYXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidGRtX2NoYW5uZWxzX2V4aGF1c3RlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIHRkbV9jaGFubmVsc19leGhhdXN0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgdGRtX2NoYW5uZWxzX2V4aGF1c3RlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidW5rbm93bl9saW5rX3Zpb2xhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIHVua25vd25fbGlua192aW9sYXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgdW5rbm93bl9saW5rX3Zpb2xhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIHVwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbikgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIGxsaWRfcG9vbF9lbXB0eV92aW9sYXRpb24pICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX2RlbmllZF9saW5rLCBtYXhfbGlua192aW9sYXRpb24pICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX2RlbmllZF9saW5rLCBvdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbikgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIHJhbmdlX3Zpb2xhdGlvbikgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIHJvZ3VlX3Zpb2xhdGlvbikgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIHN5c3RlbV9yZXNvdXJjZV92aW9sYXRpb24pICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX2RlbmllZF9saW5rLCB0ZG1fY2hhbm5lbHNfZXhoYXVzdGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgdW5rbm93bl9saW5rX3Zpb2xhdGlvbikgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIHVwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb24pKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2RlbmllZF9saW5rLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZhdXRvX2NmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmcgYXV0b19jZmc7ICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5IGtleSA9IHsgfTsgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfc2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBlcG9uX2RlbmllZF9saW5rLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsYXNlcl9vbl9vZmZfdmlvbGF0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0RFTklFRF9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9MQVNFUl9PTl9PRkZfVklPTEFUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIGxsaWRfcG9vbF9lbXB0eV92aW9sYXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIGxsaWRfcG9vbF9lbXB0eV92aW9sYXRpb24sICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9ERU5JRURfTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfTExJRF9QT09MX0VNUFRZX1ZJT0xBVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1heF9saW5rX3Zpb2xhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIG1heF9saW5rX3Zpb2xhdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgbWF4X2xpbmtfdmlvbGF0aW9uLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fREVOSUVEX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX01BWF9MSU5LX1ZJT0xBVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm92ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIG92ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fREVOSUVEX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX09WRVJIRUFEX1BST0ZJTEVfVklPTEFUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2VfdmlvbGF0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgcmFuZ2VfdmlvbGF0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2RlbmllZF9saW5rLCByYW5nZV92aW9sYXRpb24sICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9ERU5JRURfTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfUkFOR0VfVklPTEFUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicm9ndWVfdmlvbGF0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgcm9ndWVfdmlvbGF0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2RlbmllZF9saW5rLCByb2d1ZV92aW9sYXRpb24sICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9ERU5JRURfTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfUk9HVUVfVklPTEFUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIHN5c3RlbV9yZXNvdXJjZV92aW9sYXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIHN5c3RlbV9yZXNvdXJjZV92aW9sYXRpb24sICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9ERU5JRURfTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfU1lTVEVNX1JFU09VUkNFX1ZJT0xBVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRkbV9jaGFubmVsc19leGhhdXN0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2RlbmllZF9saW5rLCB0ZG1fY2hhbm5lbHNfZXhoYXVzdGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2RlbmllZF9saW5rLCB0ZG1fY2hhbm5lbHNfZXhoYXVzdGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fREVOSUVEX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX1RETV9DSEFOTkVMU19FWEhBVVNURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1bmtub3duX2xpbmtfdmlvbGF0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgdW5rbm93bl9saW5rX3Zpb2xhdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9kZW5pZWRfbGluaywgdW5rbm93bl9saW5rX3Zpb2xhdGlvbiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0RFTklFRF9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9VTktOT1dOX0xJTktfVklPTEFUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIHVwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fZGVuaWVkX2xpbmssIHVwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb24sICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9ERU5JRURfTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfVVBTVFJFQU1fQkFORFdJRFRIX1ZJT0xBVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9saW5rX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9saW5rX2NmZyBjZmc7ICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXkgPSB7IH07IC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICB1aW50OF90ICpsaXN0X21lbTsgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtZW1vcnkgYnVmZmVyIGZvciB2YXJpYWJsZS1zaXplZCBsaXN0cyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbGlua19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbGlua19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQ4X3QqIGxpc3RfbWVtO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fTElOS19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkubWFjX2FkZHJlc3MgPSBjbGlfcGFybS0+dmFsdWUubWFjOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWFjX2FkZHJlc3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm1hY19hZGRyZXNzID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX01BQ19BRERSRVNTLCAma2V5Lm1hY19hZGRyZXNzKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9saW5rLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX2xpbmssIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGlua19yYXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX2xpbmssIGxpbmtfcmF0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywgbGlua19yYXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0ZV9mbGFncyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9saW5rLCBzdGF0ZV9mbGFncyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywgc3RhdGVfZmxhZ3MpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxsaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywgbGxpZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywgbGxpZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFzZXJfb25fdGltZV90cSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9saW5rLCBsYXNlcl9vbl90aW1lX3RxKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9saW5rLCBsYXNlcl9vbl90aW1lX3RxKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsYXNlcl9vZmZfdGltZV90cSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9saW5rLCBsYXNlcl9vZmZfdGltZV90cSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywgbGFzZXJfb2ZmX3RpbWVfdHEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdlX3ZhbHVlX3RxIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX2xpbmssIHJhbmdlX3ZhbHVlX3RxKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9saW5rLCByYW5nZV92YWx1ZV90cSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGlzdGFuY2UiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywgZGlzdGFuY2UpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX2xpbmssIGRpc3RhbmNlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGFybV9zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9saW5rLCBhbGFybV9zdGF0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywgYWxhcm1fc3RhdGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR1bm5lbF9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9saW5rLCB0dW5uZWxfaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX2xpbmssIHR1bm5lbF9pZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX2xpbmssIG9udV9pZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywgb251X2lkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtaW5fbGFzZXJfb3ZlcmhlYWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywgbWluX2xhc2VyX292ZXJoZWFkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9saW5rLCBtaW5fbGFzZXJfb3ZlcmhlYWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImtleV9leGNoYW5nZV9jb25maWciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywga2V5X2V4Y2hhbmdlX2NvbmZpZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywga2V5X2V4Y2hhbmdlX2NvbmZpZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9lbmNyeXB0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX2xpbmssIGVwb25fZW5jcnlwdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywgZXBvbl9lbmNyeXB0aW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmZWNfZW5hYmxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX2xpbmssIGZlY19lbmFibGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX2xpbmssIGZlY19lbmFibGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9hbV9oZWFydGJlYXRfY29uZmlnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX2xpbmssIG9hbV9oZWFydGJlYXRfY29uZmlnKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9saW5rLCBvYW1faGVhcnRiZWF0X2NvbmZpZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXBzdHJlYW1fYmFuZHdpZHRoIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX2xpbmssIHVwc3RyZWFtX2JhbmR3aWR0aCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywgdXBzdHJlYW1fYmFuZHdpZHRoKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1YmRfaW5mbyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9saW5rLCB1YmRfaW5mbyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywgdWJkX2luZm8pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNsb2NrX3RyYW5zcG9ydF9lbmFibGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywgY2xvY2tfdHJhbnNwb3J0X2VuYWJsZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywgY2xvY2tfdHJhbnNwb3J0X2VuYWJsZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGVuZGluZ19ncmFudHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywgcGVuZGluZ19ncmFudHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX2xpbmssIHBlbmRpbmdfZ3JhbnRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsaW5rX3R5cGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbGluaywgbGlua190eXBlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9saW5rLCBsaW5rX3R5cGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9saW5rLCBsaW5rX3JhdGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fbGluaywgc3RhdGVfZmxhZ3MpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fbGluaywgbGxpZCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9saW5rLCBsYXNlcl9vbl90aW1lX3RxKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX2xpbmssIGxhc2VyX29mZl90aW1lX3RxKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX2xpbmssIHJhbmdlX3ZhbHVlX3RxKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX2xpbmssIGRpc3RhbmNlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX2xpbmssIGFsYXJtX3N0YXRlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX2xpbmssIHR1bm5lbF9pZCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9saW5rLCBvbnVfaWQpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fbGluaywgbWluX2xhc2VyX292ZXJoZWFkKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX2xpbmssIGtleV9leGNoYW5nZV9jb25maWcpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fbGluaywgZXBvbl9lbmNyeXB0aW9uKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX2xpbmssIGZlY19lbmFibGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fbGluaywgb2FtX2hlYXJ0YmVhdF9jb25maWcpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fbGluaywgdXBzdHJlYW1fYmFuZHdpZHRoKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX2xpbmssIHViZF9pbmZvKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX2xpbmssIGNsb2NrX3RyYW5zcG9ydF9lbmFibGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fbGluaywgcGVuZGluZ19ncmFudHMpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fbGluaywgbGlua190eXBlKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9saW5rLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9saW5rLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBzZXQgbWVtb3J5IHRvIHVzZSBmb3IgdmFyaWFibGUtc2l6ZWQgbGlzdHMgKi8KKyAgICBsaXN0X21lbSA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7CisgICAgaWYgKGxpc3RfbWVtID09IE5VTEwpCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImxpc3RfbWVtID0gYmNtb3NfY2FsbG9jKEFQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpO1xuIik7CisgICAgQkNNT0xUX0NGR19MSVNUX0JVRl9TRVQoJmNmZywgZXBvbl9saW5rLCBsaXN0X21lbSwgQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19MSVNUX0JVRl9TRVQoJmNmZywgZXBvbl9saW5rLCBsaXN0X21lbSwgQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX2xpbmtfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX2xpbmtfY2ZnIGNmZzsgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleSA9IHsgfTsgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbGlua19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbGlua19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm1hY19hZGRyZXNzID0gY2xpX3Bhcm0tPnZhbHVlLm1hYzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1hY19hZGRyZXNzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5tYWNfYWRkcmVzcyA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9NQUNfQUREUkVTUywgJmtleS5tYWNfYWRkcmVzcyk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fbGluaywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9saW5rLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR1bm5lbF9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fdHVubmVsX2lkIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9lcG9uX3R1bm5lbF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCB0dW5uZWxfaWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCB0dW5uZWxfaWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfVFVOTkVMX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9vbnVfaWQgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2Vwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2xpbmssIG9udV9pZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2xpbmssIG9udV9pZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9PTlVfSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAibWluX2xhc2VyX292ZXJoZWFkLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVycyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWluX2xhc2VyX292ZXJoZWFkLmxhc2VyX29uX3RpbWUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sYXNlcl9vbl90aW1lID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWluX2xhc2VyX292ZXJoZWFkLmxhc2VyX29uX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtaW5fbGFzZXJfb3ZlcmhlYWQubGFzZXJfb2ZmX3RpbWUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sYXNlcl9vZmZfdGltZSA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1pbl9sYXNlcl9vdmVyaGVhZC5sYXNlcl9vZmZfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgbWluX2xhc2VyX292ZXJoZWFkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVycyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX01JTl9MQVNFUl9PVkVSSEVBRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgbWluX2xhc2VyX292ZXJoZWFkLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImtleV9leGNoYW5nZV9jb25maWcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9rZXlfZXhjaGFuZ2VfY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXlfZXhjaGFuZ2VfY29uZmlnLm9hbV90eXBlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwub2FtX3R5cGUgPSAoYmNtb2x0X2Vwb25fb2FtX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJrZXlfZXhjaGFuZ2VfY29uZmlnLm9hbV90eXBlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2V5X2V4Y2hhbmdlX2NvbmZpZy5wZXJpb2QiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wZXJpb2QgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJrZXlfZXhjaGFuZ2VfY29uZmlnLnBlcmlvZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImtleV9leGNoYW5nZV9jb25maWcuZGlyZWN0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZGlyZWN0aW9uID0gKGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fZGlyZWN0aW9uKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAia2V5X2V4Y2hhbmdlX2NvbmZpZy5kaXJlY3Rpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2xpbmssIGtleV9leGNoYW5nZV9jb25maWcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9rZXlfZXhjaGFuZ2VfY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfS0VZX0VYQ0hBTkdFX0NPTkZJRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywga2V5X2V4Y2hhbmdlX2NvbmZpZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJlcG9uX2VuY3J5cHRpb24uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9lbmNyeXB0aW9uLmRvd25zdHJlYW1fbW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRvd25zdHJlYW1fbW9kZSA9IChiY21vbHRfZXBvbl9lbmNyeXB0aW9uX21vZGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX2VuY3J5cHRpb24uZG93bnN0cmVhbV9tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9lbmNyeXB0aW9uLmRvd25zdHJlYW1fa2V5X2Nob2ljZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRvd25zdHJlYW1fa2V5X2Nob2ljZSA9IChiY21vbHRfZXBvbl9rZXlfY2hvaWNlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9lbmNyeXB0aW9uLmRvd25zdHJlYW1fa2V5X2Nob2ljZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJlcG9uX2VuY3J5cHRpb24uZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX2VuY3J5cHRpb24uZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLmZvcm1hdCIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5mb3JtYXQgPSAoYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9mb3JtYXQpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9lbmNyeXB0aW9uLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5mb3JtYXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoICh2YWwuZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLmZvcm1hdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fSU5GT1JNQVRJT05fRk9STUFUX0NGQjoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX2VuY3J5cHRpb24uZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLmtleSIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDE2KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgZXBvbl9lbmNyeXB0aW9uLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5rZXkgbXVzdCBoYXZlIDE2IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwuZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLnUuY2ZiLmtleSwgMTYpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fZW5jcnlwdGlvbi5kb3duc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24ua2V5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fSU5GT1JNQVRJT05fRk9STUFUX0NUUjoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX2VuY3J5cHRpb24uZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLmtleSIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDE2KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgZXBvbl9lbmNyeXB0aW9uLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5rZXkgbXVzdCBoYXZlIDE2IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwuZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLnUuY3RyLmtleSwgMTYpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fZW5jcnlwdGlvbi5kb3duc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24ua2V5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9lbmNyeXB0aW9uLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5zY2kiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSA4KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgZXBvbl9lbmNyeXB0aW9uLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5zY2kgbXVzdCBoYXZlIDggYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC5kb3duc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24udS5jdHIuc2NpLCA4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX2VuY3J5cHRpb24uZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLnNjaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX2VuY3J5cHRpb24uZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX21vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC51cHN0cmVhbV9tb2RlID0gKGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fZW5jcnlwdGlvbi51cHN0cmVhbV9tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX2tleV9jaG9pY2UiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC51cHN0cmVhbV9rZXlfY2hvaWNlID0gKGJjbW9sdF9lcG9uX2tleV9jaG9pY2UpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX2VuY3J5cHRpb24udXBzdHJlYW1fa2V5X2Nob2ljZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJlcG9uX2VuY3J5cHRpb24udXBzdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24uZm9ybWF0Iik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudXBzdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5mb3JtYXQgPSAoYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9mb3JtYXQpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24uZm9ybWF0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAodmFsLnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24uZm9ybWF0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fRU5DUllQVElPTl9JTkZPUk1BVElPTl9GT1JNQVRfQ0ZCOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fZW5jcnlwdGlvbi51cHN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLmtleSIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDE2KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24ua2V5IG11c3QgaGF2ZSAxNiBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24udS5jZmIua2V5LCAxNik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24ua2V5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fSU5GT1JNQVRJT05fRk9STUFUX0NUUjoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX2VuY3J5cHRpb24udXBzdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5rZXkiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSAxNikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIGVwb25fZW5jcnlwdGlvbi51cHN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLmtleSBtdXN0IGhhdmUgMTYgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC51cHN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLnUuY3RyLmtleSwgMTYpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fZW5jcnlwdGlvbi51cHN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLmtleSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fZW5jcnlwdGlvbi51cHN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLnNjaSIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDgpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciBlcG9uX2VuY3J5cHRpb24udXBzdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5zY2kgbXVzdCBoYXZlIDggYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC51cHN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLnUuY3RyLnNjaSwgOCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24uc2NpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fZW5jcnlwdGlvbi51cHN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBlcG9uX2VuY3J5cHRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0VQT05fRU5DUllQVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgZXBvbl9lbmNyeXB0aW9uLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZlY19lbmFibGUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9saW5rX2ZlY19lbiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmVjX2VuYWJsZS51cHN0cmVhbSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnVwc3RyZWFtID0gKGJjbW9sdF9lcG9uX2xpbmtfZmVjX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmVjX2VuYWJsZS51cHN0cmVhbSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZlY19lbmFibGUuZG93bnN0cmVhbSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRvd25zdHJlYW0gPSAoYmNtb2x0X2Vwb25fbGlua19mZWNfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmZWNfZW5hYmxlLmRvd25zdHJlYW0gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2xpbmssIGZlY19lbmFibGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9saW5rX2ZlY19lbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0ZFQ19FTkFCTEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2xpbmssIGZlY19lbmFibGUsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAib2FtX2hlYXJ0YmVhdF9jb25maWcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfb2FtX2hlYXJ0YmVhdF9jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9hbV9oZWFydGJlYXRfY29uZmlnLnNlbmRfcGVyaW9kIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc2VuZF9wZXJpb2QgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvYW1faGVhcnRiZWF0X2NvbmZpZy5zZW5kX3BlcmlvZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9hbV9oZWFydGJlYXRfY29uZmlnLnRyYW5zbWl0X2ZyYW1lIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudHJhbnNtaXRfZnJhbWUubGVuID0gYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcik7CisgICAgICAgICAgICB2YWwudHJhbnNtaXRfZnJhbWUudmFsID0gYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCB2YWwudHJhbnNtaXRfZnJhbWUubGVuKTsKKyAgICAgICAgICAgIGlmICh2YWwudHJhbnNtaXRfZnJhbWUudmFsID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwudHJhbnNtaXRfZnJhbWUudmFsLCB2YWwudHJhbnNtaXRfZnJhbWUubGVuKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvYW1faGVhcnRiZWF0X2NvbmZpZy50cmFuc21pdF9mcmFtZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJvYW1faGVhcnRiZWF0X2NvbmZpZy5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9hbV9oZWFydGJlYXRfY29uZmlnLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS5mcmFtZV9vY3RldHMiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUuZnJhbWVfb2N0ZXRzLmxlbiA9IGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpOworICAgICAgICAgICAgICAgIHZhbC5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUuZnJhbWVfb2N0ZXRzLnZhbCA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgdmFsLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS5mcmFtZV9vY3RldHMubGVuKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS5mcmFtZV9vY3RldHMudmFsID09IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwuaWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlLmZyYW1lX29jdGV0cy52YWwsIHZhbC5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUuZnJhbWVfb2N0ZXRzLmxlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9hbV9oZWFydGJlYXRfY29uZmlnLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS5mcmFtZV9vY3RldHMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvYW1faGVhcnRiZWF0X2NvbmZpZy5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUubWFza19vY3RldHMiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUubWFza19vY3RldHMubGVuID0gYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgdmFsLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS5tYXNrX29jdGV0cy52YWwgPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIHZhbC5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUubWFza19vY3RldHMubGVuKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS5tYXNrX29jdGV0cy52YWwgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUubWFza19vY3RldHMudmFsLCB2YWwuaWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlLm1hc2tfb2N0ZXRzLmxlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9hbV9oZWFydGJlYXRfY29uZmlnLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS5tYXNrX29jdGV0cyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9hbV9oZWFydGJlYXRfY29uZmlnLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9hbV9oZWFydGJlYXRfY29uZmlnLnJlY2VpdmVfdGltZW91dCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJlY2VpdmVfdGltZW91dCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9hbV9oZWFydGJlYXRfY29uZmlnLnJlY2VpdmVfdGltZW91dCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9hbV9oZWFydGJlYXRfY29uZmlnLm1heGltdW1fcmVjZWl2ZV9zaXplIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWF4aW11bV9yZWNlaXZlX3NpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvYW1faGVhcnRiZWF0X2NvbmZpZy5tYXhpbXVtX3JlY2VpdmVfc2l6ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgb2FtX2hlYXJ0YmVhdF9jb25maWcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfb2FtX2hlYXJ0YmVhdF9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9PQU1fSEVBUlRCRUFUX0NPTkZJRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgb2FtX2hlYXJ0YmVhdF9jb25maWcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAidXBzdHJlYW1fYmFuZHdpZHRoLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb24gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVwc3RyZWFtX2JhbmR3aWR0aC5wb2xsaW5nX2ludGVydmFsX3VzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucG9sbGluZ19pbnRlcnZhbF91cyA9IChiY21vbHRfcG9sbGluZ19pbnRlcnZhbCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInVwc3RyZWFtX2JhbmR3aWR0aC5wb2xsaW5nX2ludGVydmFsX3VzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXBzdHJlYW1fYmFuZHdpZHRoLmdyYW50X3RocmVzaG9sZF90cSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmdyYW50X3RocmVzaG9sZF90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInVwc3RyZWFtX2JhbmR3aWR0aC5ncmFudF90aHJlc2hvbGRfdHEgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAidXBzdHJlYW1fYmFuZHdpZHRoLm1pbl9zY2hlZHVsZXJzaGFwZXIuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyLmJhbmR3aWR0aF9LYnBzIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwubWluX3NjaGVkdWxlcnNoYXBlci5iYW5kd2lkdGhfS2JwcyA9IChiY21vbHRfYmFuZHdpZHRoX0ticHMpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ1cHN0cmVhbV9iYW5kd2lkdGgubWluX3NjaGVkdWxlcnNoYXBlci5iYW5kd2lkdGhfS2JwcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyLm1heF9idXJzdF9zaXplX3RxIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwubWluX3NjaGVkdWxlcnNoYXBlci5tYXhfYnVyc3Rfc2l6ZV90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ1cHN0cmVhbV9iYW5kd2lkdGgubWluX3NjaGVkdWxlcnNoYXBlci5tYXhfYnVyc3Rfc2l6ZV90cSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyLnByaW9yaXR5Iik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwubWluX3NjaGVkdWxlcnNoYXBlci5wcmlvcml0eSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ1cHN0cmVhbV9iYW5kd2lkdGgubWluX3NjaGVkdWxlcnNoYXBlci5wcmlvcml0eSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyLndlaWdodF90cSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLm1pbl9zY2hlZHVsZXJzaGFwZXIud2VpZ2h0X3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInVwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyLndlaWdodF90cSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInVwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInVwc3RyZWFtX2JhbmR3aWR0aC5tYXhfc2NoZWR1bGVyc2hhcGVyLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci5iYW5kd2lkdGhfS2JwcyIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLm1heF9zY2hlZHVsZXJzaGFwZXIuYmFuZHdpZHRoX0ticHMgPSAoYmNtb2x0X2JhbmR3aWR0aF9LYnBzKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAidXBzdHJlYW1fYmFuZHdpZHRoLm1heF9zY2hlZHVsZXJzaGFwZXIuYmFuZHdpZHRoX0ticHMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci5tYXhfYnVyc3Rfc2l6ZV90cSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLm1heF9zY2hlZHVsZXJzaGFwZXIubWF4X2J1cnN0X3NpemVfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAidXBzdHJlYW1fYmFuZHdpZHRoLm1heF9zY2hlZHVsZXJzaGFwZXIubWF4X2J1cnN0X3NpemVfdHEgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci5wcmlvcml0eSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLm1heF9zY2hlZHVsZXJzaGFwZXIucHJpb3JpdHkgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAidXBzdHJlYW1fYmFuZHdpZHRoLm1heF9zY2hlZHVsZXJzaGFwZXIucHJpb3JpdHkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci53ZWlnaHRfdHEiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5tYXhfc2NoZWR1bGVyc2hhcGVyLndlaWdodF90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ1cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci53ZWlnaHRfdHEgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ1cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVwc3RyZWFtX2JhbmR3aWR0aC50ZG1fZ3JhbnRfc2l6ZV90cSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRkbV9ncmFudF9zaXplX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAidXBzdHJlYW1fYmFuZHdpZHRoLnRkbV9ncmFudF9zaXplX3RxIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXBzdHJlYW1fYmFuZHdpZHRoLnRkbV9ncmFudF9pbnRlcnZhbF91cyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRkbV9ncmFudF9pbnRlcnZhbF91cyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInVwc3RyZWFtX2JhbmR3aWR0aC50ZG1fZ3JhbnRfaW50ZXJ2YWxfdXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2xpbmssIHVwc3RyZWFtX2JhbmR3aWR0aCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF91cHN0cmVhbV9iYW5kd2lkdGhfZGlzdHJpYnV0aW9uIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfVVBTVFJFQU1fQkFORFdJRFRILCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCB1cHN0cmVhbV9iYW5kd2lkdGgsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjbG9ja190cmFuc3BvcnRfZW5hYmxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2xpbmssIGNsb2NrX3RyYW5zcG9ydF9lbmFibGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBjbG9ja190cmFuc3BvcnRfZW5hYmxlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0NMT0NLX1RSQU5TUE9SVF9FTkFCTEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9saW5rX2NmZ19jbGVhcihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9saW5rX2NmZyBjZmc7ICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXkgPSB7IH07IC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xpbmtfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfY2xlYXIiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm1hY19hZGRyZXNzID0gY2xpX3Bhcm0tPnZhbHVlLm1hYzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1hY19hZGRyZXNzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5tYWNfYWRkcmVzcyA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9NQUNfQUREUkVTUywgJmtleS5tYWNfYWRkcmVzcyk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fbGluaywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9saW5rLCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9saW5rX2NmZ19nZXRfbXVsdGkoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9saW5rX2NmZyBjZmc7ICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXkgPSB7IH07IC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbXNnX3NldCAqbXNnX3NldCA9IE5VTEw7IC8qKjwgZGVjbGFyZSBtZXNzYWdlIHNldCAqLworICAgIHVpbnQzMl90IG1heF9tc2dzOyAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgIC8qKjwgZGVjbGFyZSBmaWx0ZXIgaW52ZXJ0IGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xpbmtfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldCogbXNnX3NldCA9IE5VTEw7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50MzJfdCBtYXhfbXNncztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXRfbXVsdGkiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm1hY19hZGRyZXNzID0gY2xpX3Bhcm0tPnZhbHVlLm1hYzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1hY19hZGRyZXNzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5tYWNfYWRkcmVzcyA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9NQUNfQUREUkVTUywgJmtleS5tYWNfYWRkcmVzcyk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldF9hbGxvYyhCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9saW5rLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX2xpbmssIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxpbmtfcmF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fbGlua19yYXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9lcG9uX2xpbmtfcmF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgbGlua19yYXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgbGlua19yYXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xJTktfUkFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxpbmtfcmF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbGluaywgbGlua19yYXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbGluaywgbGlua19yYXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc3RhdGVfZmxhZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX2xpbmtfc3RhdGVfZmxhZ3MgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2Vwb25fbGlua19zdGF0ZV9mbGFncykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgc3RhdGVfZmxhZ3MsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBzdGF0ZV9mbGFncywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9TVEFURV9GTEFHUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRlX2ZsYWdzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9saW5rLCBzdGF0ZV9mbGFncyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2xpbmssIHN0YXRlX2ZsYWdzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubGxpZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fbGxpZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZXBvbl9sbGlkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2xpbmssIGxsaWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBsbGlkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xMSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsbGlkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9saW5rLCBsbGlkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbGluaywgbGxpZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxhc2VyX29uX3RpbWVfdHEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF90aW1lX3F1YW50YSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgbGFzZXJfb25fdGltZV90cSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2xpbmssIGxhc2VyX29uX3RpbWVfdHEsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfTEFTRVJfT05fVElNRV9UUSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhc2VyX29uX3RpbWVfdHEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2xpbmssIGxhc2VyX29uX3RpbWVfdHEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9saW5rLCBsYXNlcl9vbl90aW1lX3RxKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubGFzZXJfb2ZmX3RpbWVfdHEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF90aW1lX3F1YW50YSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgbGFzZXJfb2ZmX3RpbWVfdHEsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBsYXNlcl9vZmZfdGltZV90cSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9MQVNFUl9PRkZfVElNRV9UUSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhc2VyX29mZl90aW1lX3RxIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9saW5rLCBsYXNlcl9vZmZfdGltZV90cSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2xpbmssIGxhc2VyX29mZl90aW1lX3RxKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucmFuZ2VfdmFsdWVfdHEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF90aW1lX3F1YW50YSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgcmFuZ2VfdmFsdWVfdHEsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCByYW5nZV92YWx1ZV90cSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9SQU5HRV9WQUxVRV9UUSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdlX3ZhbHVlX3RxIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9saW5rLCByYW5nZV92YWx1ZV90cSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2xpbmssIHJhbmdlX3ZhbHVlX3RxKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZGlzdGFuY2UiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9tZXRlcnMgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X21ldGVycykgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBkaXN0YW5jZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2xpbmssIGRpc3RhbmNlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0RJU1RBTkNFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGlzdGFuY2UiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2xpbmssIGRpc3RhbmNlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbGluaywgZGlzdGFuY2UpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9saW5rX2FsYXJtX3N0YXRlIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUua2V5X2V4Y2hhbmdlX2ZhaWx1cmUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5rZXlfZXhjaGFuZ2VfZmFpbHVyZSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmtleV9leGNoYW5nZV9mYWlsdXJlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmludmFsaWRfbXBjcF9yZXBvcnRfcmVjZWl2ZWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pbnZhbGlkX21wY3BfcmVwb3J0X3JlY2VpdmVkID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxhcm1fc3RhdGUuaW52YWxpZF9tcGNwX3JlcG9ydF9yZWNlaXZlZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5tcGNwX3JlcG9ydF90aW1lb3V0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubXBjcF9yZXBvcnRfdGltZW91dCA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLm1wY3BfcmVwb3J0X3RpbWVvdXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUub2FtX2tlZXBhbGl2ZV90aW1lb3V0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwub2FtX2tlZXBhbGl2ZV90aW1lb3V0ID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxhcm1fc3RhdGUub2FtX2tlZXBhbGl2ZV90aW1lb3V0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBhbGFybV9zdGF0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xpbmtfYWxhcm1fc3RhdGUgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9BTEFSTV9TVEFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgYWxhcm1fc3RhdGUsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGFybV9zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbGluaywgYWxhcm1fc3RhdGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9saW5rLCBhbGFybV9zdGF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnR1bm5lbF9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fdHVubmVsX2lkIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9lcG9uX3R1bm5lbF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCB0dW5uZWxfaWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCB0dW5uZWxfaWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfVFVOTkVMX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHVubmVsX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9saW5rLCB0dW5uZWxfaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9saW5rLCB0dW5uZWxfaWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX29udV9pZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZXBvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgb251X2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgb251X2lkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX09OVV9JRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbGluaywgb251X2lkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbGluaywgb251X2lkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLm1pbl9sYXNlcl9vdmVyaGVhZC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX2xhc2VyX292ZXJoZWFkX3BhcmFtZXRlcnMgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5taW5fbGFzZXJfb3ZlcmhlYWQubGFzZXJfb25fdGltZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxhc2VyX29uX3RpbWUgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubWluX2xhc2VyX292ZXJoZWFkLmxhc2VyX29uX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubWluX2xhc2VyX292ZXJoZWFkLmxhc2VyX29mZl90aW1lIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubGFzZXJfb2ZmX3RpbWUgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubWluX2xhc2VyX292ZXJoZWFkLmxhc2VyX29mZl90aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBtaW5fbGFzZXJfb3ZlcmhlYWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9sYXNlcl9vdmVyaGVhZF9wYXJhbWV0ZXJzIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfTUlOX0xBU0VSX09WRVJIRUFELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBtaW5fbGFzZXJfb3ZlcmhlYWQsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtaW5fbGFzZXJfb3ZlcmhlYWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2xpbmssIG1pbl9sYXNlcl9vdmVyaGVhZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2xpbmssIG1pbl9sYXNlcl9vdmVyaGVhZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5rZXlfZXhjaGFuZ2VfY29uZmlnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fa2V5X2V4Y2hhbmdlX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmtleV9leGNoYW5nZV9jb25maWcub2FtX3R5cGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5vYW1fdHlwZSA9IChiY21vbHRfZXBvbl9vYW1fdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5rZXlfZXhjaGFuZ2VfY29uZmlnLm9hbV90eXBlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmtleV9leGNoYW5nZV9jb25maWcucGVyaW9kIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucGVyaW9kID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmtleV9leGNoYW5nZV9jb25maWcucGVyaW9kIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmtleV9leGNoYW5nZV9jb25maWcuZGlyZWN0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZGlyZWN0aW9uID0gKGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fZGlyZWN0aW9uKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmtleV9leGNoYW5nZV9jb25maWcuZGlyZWN0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBrZXlfZXhjaGFuZ2VfY29uZmlnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fa2V5X2V4Y2hhbmdlX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0tFWV9FWENIQU5HRV9DT05GSUcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2xpbmssIGtleV9leGNoYW5nZV9jb25maWcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXlfZXhjaGFuZ2VfY29uZmlnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9saW5rLCBrZXlfZXhjaGFuZ2VfY29uZmlnKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbGluaywga2V5X2V4Y2hhbmdlX2NvbmZpZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5lcG9uX2VuY3J5cHRpb24uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVwb25fZW5jcnlwdGlvbi5kb3duc3RyZWFtX21vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kb3duc3RyZWFtX21vZGUgPSAoYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVwb25fZW5jcnlwdGlvbi5kb3duc3RyZWFtX21vZGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZXBvbl9lbmNyeXB0aW9uLmRvd25zdHJlYW1fa2V5X2Nob2ljZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRvd25zdHJlYW1fa2V5X2Nob2ljZSA9IChiY21vbHRfZXBvbl9rZXlfY2hvaWNlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVwb25fZW5jcnlwdGlvbi5kb3duc3RyZWFtX2tleV9jaG9pY2UgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmVwb25fZW5jcnlwdGlvbi5kb3duc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lcG9uX2VuY3J5cHRpb24uZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLmZvcm1hdCIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5mb3JtYXQgPSAoYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9mb3JtYXQpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVwb25fZW5jcnlwdGlvbi5kb3duc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24uZm9ybWF0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAodmFsLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5mb3JtYXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX0lORk9STUFUSU9OX0ZPUk1BVF9DRkI6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVwb25fZW5jcnlwdGlvbi5kb3duc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24ua2V5Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gMTYpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciBmaWx0ZXIuZXBvbl9lbmNyeXB0aW9uLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5rZXkgbXVzdCBoYXZlIDE2IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwuZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLnUuY2ZiLmtleSwgMTYpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lcG9uX2VuY3J5cHRpb24uZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLmtleSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX0lORk9STUFUSU9OX0ZPUk1BVF9DVFI6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVwb25fZW5jcnlwdGlvbi5kb3duc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24ua2V5Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gMTYpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciBmaWx0ZXIuZXBvbl9lbmNyeXB0aW9uLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5rZXkgbXVzdCBoYXZlIDE2IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwuZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLnUuY3RyLmtleSwgMTYpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lcG9uX2VuY3J5cHRpb24uZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLmtleSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lcG9uX2VuY3J5cHRpb24uZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLnNjaSIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDgpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciBmaWx0ZXIuZXBvbl9lbmNyeXB0aW9uLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5zY2kgbXVzdCBoYXZlIDggYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC5kb3duc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24udS5jdHIuc2NpLCA4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZXBvbl9lbmNyeXB0aW9uLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5zY2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVwb25fZW5jcnlwdGlvbi5kb3duc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX21vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC51cHN0cmVhbV9tb2RlID0gKGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lcG9uX2VuY3J5cHRpb24udXBzdHJlYW1fbW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lcG9uX2VuY3J5cHRpb24udXBzdHJlYW1fa2V5X2Nob2ljZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnVwc3RyZWFtX2tleV9jaG9pY2UgPSAoYmNtb2x0X2Vwb25fa2V5X2Nob2ljZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lcG9uX2VuY3J5cHRpb24udXBzdHJlYW1fa2V5X2Nob2ljZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lcG9uX2VuY3J5cHRpb24udXBzdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5mb3JtYXQiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC51cHN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLmZvcm1hdCA9IChiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2Zvcm1hdCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24uZm9ybWF0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAodmFsLnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24uZm9ybWF0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fRU5DUllQVElPTl9JTkZPUk1BVElPTl9GT1JNQVRfQ0ZCOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lcG9uX2VuY3J5cHRpb24udXBzdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5rZXkiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSAxNikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIGZpbHRlci5lcG9uX2VuY3J5cHRpb24udXBzdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5rZXkgbXVzdCBoYXZlIDE2IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwudXBzdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi51LmNmYi5rZXksIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24ua2V5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fSU5GT1JNQVRJT05fRk9STUFUX0NUUjoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24ua2V5Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gMTYpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciBmaWx0ZXIuZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24ua2V5IG11c3QgaGF2ZSAxNiBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24udS5jdHIua2V5LCAxNik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVwb25fZW5jcnlwdGlvbi51cHN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLmtleSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lcG9uX2VuY3J5cHRpb24udXBzdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5zY2kiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSA4KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgZmlsdGVyLmVwb25fZW5jcnlwdGlvbi51cHN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uLnNjaSBtdXN0IGhhdmUgOCBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24udS5jdHIuc2NpLCA4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24uc2NpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lcG9uX2VuY3J5cHRpb24udXBzdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgZXBvbl9lbmNyeXB0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9FUE9OX0VOQ1JZUFRJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2xpbmssIGVwb25fZW5jcnlwdGlvbiwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fZW5jcnlwdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbGluaywgZXBvbl9lbmNyeXB0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbGluaywgZXBvbl9lbmNyeXB0aW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmZlY19lbmFibGUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9saW5rX2ZlY19lbiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmZlY19lbmFibGUudXBzdHJlYW0iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC51cHN0cmVhbSA9IChiY21vbHRfZXBvbl9saW5rX2ZlY19zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5mZWNfZW5hYmxlLnVwc3RyZWFtIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmZlY19lbmFibGUuZG93bnN0cmVhbSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRvd25zdHJlYW0gPSAoYmNtb2x0X2Vwb25fbGlua19mZWNfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZmVjX2VuYWJsZS5kb3duc3RyZWFtIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBmZWNfZW5hYmxlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbGlua19mZWNfZW4gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9GRUNfRU5BQkxFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBmZWNfZW5hYmxlLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmVjX2VuYWJsZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbGluaywgZmVjX2VuYWJsZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2xpbmssIGZlY19lbmFibGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIub2FtX2hlYXJ0YmVhdF9jb25maWcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfb2FtX2hlYXJ0YmVhdF9jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vYW1faGVhcnRiZWF0X2NvbmZpZy5zZW5kX3BlcmlvZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnNlbmRfcGVyaW9kID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9hbV9oZWFydGJlYXRfY29uZmlnLnNlbmRfcGVyaW9kIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9hbV9oZWFydGJlYXRfY29uZmlnLnRyYW5zbWl0X2ZyYW1lIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudHJhbnNtaXRfZnJhbWUubGVuID0gYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcik7CisgICAgICAgICAgICB2YWwudHJhbnNtaXRfZnJhbWUudmFsID0gYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCB2YWwudHJhbnNtaXRfZnJhbWUubGVuKTsKKyAgICAgICAgICAgIGlmICh2YWwudHJhbnNtaXRfZnJhbWUudmFsID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwudHJhbnNtaXRfZnJhbWUudmFsLCB2YWwudHJhbnNtaXRfZnJhbWUubGVuKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIub2FtX2hlYXJ0YmVhdF9jb25maWcudHJhbnNtaXRfZnJhbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLm9hbV9oZWFydGJlYXRfY29uZmlnLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9hbV9oZWFydGJlYXRfY29uZmlnLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS5mcmFtZV9vY3RldHMiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUuZnJhbWVfb2N0ZXRzLmxlbiA9IGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpOworICAgICAgICAgICAgICAgIHZhbC5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUuZnJhbWVfb2N0ZXRzLnZhbCA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgdmFsLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS5mcmFtZV9vY3RldHMubGVuKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS5mcmFtZV9vY3RldHMudmFsID09IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwuaWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlLmZyYW1lX29jdGV0cy52YWwsIHZhbC5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUuZnJhbWVfb2N0ZXRzLmxlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vYW1faGVhcnRiZWF0X2NvbmZpZy5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUuZnJhbWVfb2N0ZXRzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9hbV9oZWFydGJlYXRfY29uZmlnLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS5tYXNrX29jdGV0cyIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS5tYXNrX29jdGV0cy5sZW4gPSBiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKTsKKyAgICAgICAgICAgICAgICB2YWwuaWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlLm1hc2tfb2N0ZXRzLnZhbCA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgdmFsLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS5tYXNrX29jdGV0cy5sZW4pOworICAgICAgICAgICAgICAgIGlmICh2YWwuaWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlLm1hc2tfb2N0ZXRzLnZhbCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS5tYXNrX29jdGV0cy52YWwsIHZhbC5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUubWFza19vY3RldHMubGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9hbV9oZWFydGJlYXRfY29uZmlnLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS5tYXNrX29jdGV0cyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vYW1faGVhcnRiZWF0X2NvbmZpZy5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub2FtX2hlYXJ0YmVhdF9jb25maWcucmVjZWl2ZV90aW1lb3V0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmVjZWl2ZV90aW1lb3V0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9hbV9oZWFydGJlYXRfY29uZmlnLnJlY2VpdmVfdGltZW91dCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vYW1faGVhcnRiZWF0X2NvbmZpZy5tYXhpbXVtX3JlY2VpdmVfc2l6ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1heGltdW1fcmVjZWl2ZV9zaXplID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9hbV9oZWFydGJlYXRfY29uZmlnLm1heGltdW1fcmVjZWl2ZV9zaXplIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBvYW1faGVhcnRiZWF0X2NvbmZpZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9vYW1faGVhcnRiZWF0X2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX09BTV9IRUFSVEJFQVRfQ09ORklHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBvYW1faGVhcnRiZWF0X2NvbmZpZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9hbV9oZWFydGJlYXRfY29uZmlnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9saW5rLCBvYW1faGVhcnRiZWF0X2NvbmZpZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2xpbmssIG9hbV9oZWFydGJlYXRfY29uZmlnKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnVwc3RyZWFtX2JhbmR3aWR0aC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF91cHN0cmVhbV9iYW5kd2lkdGhfZGlzdHJpYnV0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudXBzdHJlYW1fYmFuZHdpZHRoLnBvbGxpbmdfaW50ZXJ2YWxfdXMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wb2xsaW5nX2ludGVydmFsX3VzID0gKGJjbW9sdF9wb2xsaW5nX2ludGVydmFsKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnVwc3RyZWFtX2JhbmR3aWR0aC5wb2xsaW5nX2ludGVydmFsX3VzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnVwc3RyZWFtX2JhbmR3aWR0aC5ncmFudF90aHJlc2hvbGRfdHEiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5ncmFudF90aHJlc2hvbGRfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIudXBzdHJlYW1fYmFuZHdpZHRoLmdyYW50X3RocmVzaG9sZF90cSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIudXBzdHJlYW1fYmFuZHdpZHRoLm1pbl9zY2hlZHVsZXJzaGFwZXIuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci51cHN0cmVhbV9iYW5kd2lkdGgubWluX3NjaGVkdWxlcnNoYXBlci5iYW5kd2lkdGhfS2JwcyIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLm1pbl9zY2hlZHVsZXJzaGFwZXIuYmFuZHdpZHRoX0ticHMgPSAoYmNtb2x0X2JhbmR3aWR0aF9LYnBzKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnVwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyLmJhbmR3aWR0aF9LYnBzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnVwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyLm1heF9idXJzdF9zaXplX3RxIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwubWluX3NjaGVkdWxlcnNoYXBlci5tYXhfYnVyc3Rfc2l6ZV90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIudXBzdHJlYW1fYmFuZHdpZHRoLm1pbl9zY2hlZHVsZXJzaGFwZXIubWF4X2J1cnN0X3NpemVfdHEgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudXBzdHJlYW1fYmFuZHdpZHRoLm1pbl9zY2hlZHVsZXJzaGFwZXIucHJpb3JpdHkiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5taW5fc2NoZWR1bGVyc2hhcGVyLnByaW9yaXR5ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci51cHN0cmVhbV9iYW5kd2lkdGgubWluX3NjaGVkdWxlcnNoYXBlci5wcmlvcml0eSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci51cHN0cmVhbV9iYW5kd2lkdGgubWluX3NjaGVkdWxlcnNoYXBlci53ZWlnaHRfdHEiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5taW5fc2NoZWR1bGVyc2hhcGVyLndlaWdodF90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIudXBzdHJlYW1fYmFuZHdpZHRoLm1pbl9zY2hlZHVsZXJzaGFwZXIud2VpZ2h0X3RxIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnVwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci51cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnVwc3RyZWFtX2JhbmR3aWR0aC5tYXhfc2NoZWR1bGVyc2hhcGVyLmJhbmR3aWR0aF9LYnBzIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwubWF4X3NjaGVkdWxlcnNoYXBlci5iYW5kd2lkdGhfS2JwcyA9IChiY21vbHRfYmFuZHdpZHRoX0ticHMpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIudXBzdHJlYW1fYmFuZHdpZHRoLm1heF9zY2hlZHVsZXJzaGFwZXIuYmFuZHdpZHRoX0ticHMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudXBzdHJlYW1fYmFuZHdpZHRoLm1heF9zY2hlZHVsZXJzaGFwZXIubWF4X2J1cnN0X3NpemVfdHEiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5tYXhfc2NoZWR1bGVyc2hhcGVyLm1heF9idXJzdF9zaXplX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci51cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci5tYXhfYnVyc3Rfc2l6ZV90cSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci51cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci5wcmlvcml0eSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLm1heF9zY2hlZHVsZXJzaGFwZXIucHJpb3JpdHkgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnVwc3RyZWFtX2JhbmR3aWR0aC5tYXhfc2NoZWR1bGVyc2hhcGVyLnByaW9yaXR5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnVwc3RyZWFtX2JhbmR3aWR0aC5tYXhfc2NoZWR1bGVyc2hhcGVyLndlaWdodF90cSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLm1heF9zY2hlZHVsZXJzaGFwZXIud2VpZ2h0X3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci51cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci53ZWlnaHRfdHEgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIudXBzdHJlYW1fYmFuZHdpZHRoLm1heF9zY2hlZHVsZXJzaGFwZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudXBzdHJlYW1fYmFuZHdpZHRoLnRkbV9ncmFudF9zaXplX3RxIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudGRtX2dyYW50X3NpemVfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIudXBzdHJlYW1fYmFuZHdpZHRoLnRkbV9ncmFudF9zaXplX3RxIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnVwc3RyZWFtX2JhbmR3aWR0aC50ZG1fZ3JhbnRfaW50ZXJ2YWxfdXMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50ZG1fZ3JhbnRfaW50ZXJ2YWxfdXMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIudXBzdHJlYW1fYmFuZHdpZHRoLnRkbV9ncmFudF9pbnRlcnZhbF91cyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgdXBzdHJlYW1fYmFuZHdpZHRoLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9VUFNUUkVBTV9CQU5EV0lEVEgsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX2xpbmssIHVwc3RyZWFtX2JhbmR3aWR0aCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVwc3RyZWFtX2JhbmR3aWR0aCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbGluaywgdXBzdHJlYW1fYmFuZHdpZHRoKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbGluaywgdXBzdHJlYW1fYmFuZHdpZHRoKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnViZF9pbmZvLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3ViZF9pbmZvIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudWJkX2luZm8uYWN0dWFsX3BvbGxpbmdfaW50ZXJ2YWwiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hY3R1YWxfcG9sbGluZ19pbnRlcnZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci51YmRfaW5mby5hY3R1YWxfcG9sbGluZ19pbnRlcnZhbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci51YmRfaW5mby5hY3R1YWxfZ3JhbnRfdGhyZXNob2xkX3RxIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWN0dWFsX2dyYW50X3RocmVzaG9sZF90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci51YmRfaW5mby5hY3R1YWxfZ3JhbnRfdGhyZXNob2xkX3RxIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci51YmRfaW5mby5hY3R1YWxfbWluX3NjaGVkdWxlcnNoYXBlci4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnViZF9pbmZvLmFjdHVhbF9taW5fc2NoZWR1bGVyc2hhcGVyLmFjdHVhbF9tYnNfdHEiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5hY3R1YWxfbWluX3NjaGVkdWxlcnNoYXBlci5hY3R1YWxfbWJzX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci51YmRfaW5mby5hY3R1YWxfbWluX3NjaGVkdWxlcnNoYXBlci5hY3R1YWxfbWJzX3RxIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnViZF9pbmZvLmFjdHVhbF9taW5fc2NoZWR1bGVyc2hhcGVyLmFjdHVhbF93ZWlnaHRfdHEiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5hY3R1YWxfbWluX3NjaGVkdWxlcnNoYXBlci5hY3R1YWxfd2VpZ2h0X3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci51YmRfaW5mby5hY3R1YWxfbWluX3NjaGVkdWxlcnNoYXBlci5hY3R1YWxfd2VpZ2h0X3RxIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnViZF9pbmZvLmFjdHVhbF9taW5fc2NoZWR1bGVyc2hhcGVyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci51YmRfaW5mby5hY3R1YWxfbWF4X3NjaGVkdWxlcnNoYXBlci4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnViZF9pbmZvLmFjdHVhbF9tYXhfc2NoZWR1bGVyc2hhcGVyLmFjdHVhbF9tYnNfdHEiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5hY3R1YWxfbWF4X3NjaGVkdWxlcnNoYXBlci5hY3R1YWxfbWJzX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci51YmRfaW5mby5hY3R1YWxfbWF4X3NjaGVkdWxlcnNoYXBlci5hY3R1YWxfbWJzX3RxIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnViZF9pbmZvLmFjdHVhbF9tYXhfc2NoZWR1bGVyc2hhcGVyLmFjdHVhbF93ZWlnaHRfdHEiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5hY3R1YWxfbWF4X3NjaGVkdWxlcnNoYXBlci5hY3R1YWxfd2VpZ2h0X3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci51YmRfaW5mby5hY3R1YWxfbWF4X3NjaGVkdWxlcnNoYXBlci5hY3R1YWxfd2VpZ2h0X3RxIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnViZF9pbmZvLmFjdHVhbF9tYXhfc2NoZWR1bGVyc2hhcGVyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCB1YmRfaW5mbywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF91YmRfaW5mbyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1VCRF9JTkZPLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCB1YmRfaW5mbywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInViZF9pbmZvIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9saW5rLCB1YmRfaW5mbyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2xpbmssIHViZF9pbmZvKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY2xvY2tfdHJhbnNwb3J0X2VuYWJsZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBjbG9ja190cmFuc3BvcnRfZW5hYmxlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgY2xvY2tfdHJhbnNwb3J0X2VuYWJsZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9DTE9DS19UUkFOU1BPUlRfRU5BQkxFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2xvY2tfdHJhbnNwb3J0X2VuYWJsZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbGluaywgY2xvY2tfdHJhbnNwb3J0X2VuYWJsZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2xpbmssIGNsb2NrX3RyYW5zcG9ydF9lbmFibGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wZW5kaW5nX2dyYW50cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbGluaywgcGVuZGluZ19ncmFudHMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBwZW5kaW5nX2dyYW50cywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9QRU5ESU5HX0dSQU5UUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBlbmRpbmdfZ3JhbnRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9saW5rLCBwZW5kaW5nX2dyYW50cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2xpbmssIHBlbmRpbmdfZ3JhbnRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubGlua190eXBlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9saW5rX3R5cGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2Vwb25fbGlua190eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBsaW5rX3R5cGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9saW5rLCBsaW5rX3R5cGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTElOS19DRkdfSURfTElOS19UWVBFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGlua190eXBlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9saW5rLCBsaW5rX3R5cGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9saW5rLCBsaW5rX3R5cGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbGluaywgbGlua19yYXRlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9saW5rLCBzdGF0ZV9mbGFncykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbGluaywgbGxpZCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbGluaywgbGFzZXJfb25fdGltZV90cSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbGluaywgbGFzZXJfb2ZmX3RpbWVfdHEpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX2xpbmssIHJhbmdlX3ZhbHVlX3RxKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9saW5rLCBkaXN0YW5jZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbGluaywgYWxhcm1fc3RhdGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX2xpbmssIHR1bm5lbF9pZCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbGluaywgb251X2lkKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9saW5rLCBtaW5fbGFzZXJfb3ZlcmhlYWQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX2xpbmssIGtleV9leGNoYW5nZV9jb25maWcpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX2xpbmssIGVwb25fZW5jcnlwdGlvbikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbGluaywgZmVjX2VuYWJsZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbGluaywgb2FtX2hlYXJ0YmVhdF9jb25maWcpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX2xpbmssIHVwc3RyZWFtX2JhbmR3aWR0aCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbGluaywgdWJkX2luZm8pICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX2xpbmssIGNsb2NrX3RyYW5zcG9ydF9lbmFibGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX2xpbmssIHBlbmRpbmdfZ3JhbnRzKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9saW5rLCBsaW5rX3R5cGUpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9saW5rLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbGluaywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX2xpbmtfc3RhdF9nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fbGlua19zdGF0IHN0YXQ7ICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkga2V5ID0geyB9OyAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb3NfYm9vbCBjbGVhcl9vbl9yZWFkOyAgICAgICAvKio8IGRlY2xhcmUgJ2NsZWFyIG9uIHJlYWQnIGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xpbmtfc3RhdCBzdGF0O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbGlua19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5tYWNfYWRkcmVzcyA9IGNsaV9wYXJtLT52YWx1ZS5tYWM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYWNfYWRkcmVzcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkubWFjX2FkZHJlc3MgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fTElOS19LRVlfSURfTUFDX0FERFJFU1MsICZrZXkubWFjX2FkZHJlc3MpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgZmxhZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjbGVhciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY2xlYXJfb25fcmVhZCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjbGVhciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJjbGVhcl9vbl9yZWFkID0gJXM7XG4iLCAoY2xlYXJfb25fcmVhZCkgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfU1RBVF9JTklUKCZzdGF0LCBlcG9uX2xpbmssIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfSU5JVCgmc3RhdCwgZXBvbl9saW5rLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2RhdGFfYnl0ZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9kYXRhX2J5dGVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2RhdGFfYnl0ZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2RhdGFfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgcnhfZGF0YV9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgcnhfZGF0YV9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2ZyYW1lc182NCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2ZyYW1lc182NCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9mcmFtZXNfNjQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2ZyYW1lc182NV8xMjciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9mcmFtZXNfNjVfMTI3KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2ZyYW1lc182NV8xMjcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2ZyYW1lc18xMjhfMjU1Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgcnhfZnJhbWVzXzEyOF8yNTUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgcnhfZnJhbWVzXzEyOF8yNTUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2ZyYW1lc18yNTZfNTExIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgcnhfZnJhbWVzXzI1Nl81MTEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgcnhfZnJhbWVzXzI1Nl81MTEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2ZyYW1lc181MTJfMTAyMyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2ZyYW1lc181MTJfMTAyMyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9mcmFtZXNfNTEyXzEwMjMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2ZyYW1lc18xMDI0XzE1MTgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9mcmFtZXNfMTAyNF8xNTE4KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2ZyYW1lc18xMDI0XzE1MTgpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2ZyYW1lc18xNTE5XzIwNDciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9mcmFtZXNfMTUxOV8yMDQ3KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2ZyYW1lc18xNTE5XzIwNDcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2ZyYW1lc18yMDQ4XzQwOTUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9mcmFtZXNfMjA0OF80MDk1KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2ZyYW1lc18yMDQ4XzQwOTUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2ZyYW1lc180MDk2XzkyMTYiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9mcmFtZXNfNDA5Nl85MjE2KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2ZyYW1lc180MDk2XzkyMTYpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2ZyYW1lc185MjE3XzE2MzgzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgcnhfZnJhbWVzXzkyMTdfMTYzODMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgcnhfZnJhbWVzXzkyMTdfMTYzODMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X29hbV9ieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X29hbV9ieXRlcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9vYW1fYnl0ZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X29hbV9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9vYW1fZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X29hbV9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X21wY3BfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgcnhfbXBjcF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgcnhfbXBjcF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2Jyb2FkY2FzdF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9icm9hZGNhc3RfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2Jyb2FkY2FzdF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3VuaWNhc3RfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgcnhfdW5pY2FzdF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgcnhfdW5pY2FzdF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X211bHRpY2FzdF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9tdWx0aWNhc3RfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X211bHRpY2FzdF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3JlcG9ydF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9yZXBvcnRfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X3JlcG9ydF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2Zjc19lcnJvciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2Zjc19lcnJvcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9mY3NfZXJyb3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X292ZXJzaXplX2Vycm9yIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgcnhfb3ZlcnNpemVfZXJyb3IpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgcnhfb3ZlcnNpemVfZXJyb3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3J1bnRfZXJyb3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9ydW50X2Vycm9yKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X3J1bnRfZXJyb3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2xpbmVfY29kZV9lcnJvciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2xpbmVfY29kZV9lcnJvcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9saW5lX2NvZGVfZXJyb3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2xpbmVfY29kZV9lcnJvcl9tYXgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9saW5lX2NvZGVfZXJyb3JfbWF4KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2xpbmVfY29kZV9lcnJvcl9tYXgpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2RhdGFfYnl0ZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9kYXRhX2J5dGVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X2RhdGFfYnl0ZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2RhdGFfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgdHhfZGF0YV9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgdHhfZGF0YV9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2ZyYW1lc182NCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X2ZyYW1lc182NCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9mcmFtZXNfNjQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2ZyYW1lc182NV8xMjciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9mcmFtZXNfNjVfMTI3KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X2ZyYW1lc182NV8xMjcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2ZyYW1lc18xMjhfMjU1Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgdHhfZnJhbWVzXzEyOF8yNTUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgdHhfZnJhbWVzXzEyOF8yNTUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2ZyYW1lc18yNTZfNTExIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgdHhfZnJhbWVzXzI1Nl81MTEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgdHhfZnJhbWVzXzI1Nl81MTEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2ZyYW1lc181MTJfMTAyMyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X2ZyYW1lc181MTJfMTAyMyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9mcmFtZXNfNTEyXzEwMjMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2ZyYW1lc18xMDI0XzE1MTgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9mcmFtZXNfMTAyNF8xNTE4KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X2ZyYW1lc18xMDI0XzE1MTgpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2ZyYW1lc18xNTE5XzIwNDciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9mcmFtZXNfMTUxOV8yMDQ3KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X2ZyYW1lc18xNTE5XzIwNDcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2ZyYW1lc18yMDQ4XzQwOTUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9mcmFtZXNfMjA0OF80MDk1KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X2ZyYW1lc18yMDQ4XzQwOTUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2ZyYW1lc180MDk2XzkyMTYiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9mcmFtZXNfNDA5Nl85MjE2KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X2ZyYW1lc180MDk2XzkyMTYpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2ZyYW1lc185MjE3XzE2MzgzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgdHhfZnJhbWVzXzkyMTdfMTYzODMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgdHhfZnJhbWVzXzkyMTdfMTYzODMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X29hbV9ieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X29hbV9ieXRlcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9vYW1fYnl0ZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X29hbV9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9vYW1fZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X29hbV9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X21wY3BfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgdHhfbXBjcF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgdHhfbXBjcF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2Jyb2FkY2FzdF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9icm9hZGNhc3RfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X2Jyb2FkY2FzdF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3VuaWNhc3RfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgdHhfdW5pY2FzdF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgdHhfdW5pY2FzdF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X211bHRpY2FzdF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9tdWx0aWNhc3RfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X211bHRpY2FzdF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2dhdGVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgdHhfZ2F0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgdHhfZ2F0ZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2RhdGFfYnl0ZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9kYXRhX2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2ZyYW1lc182NCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2ZyYW1lc182NV8xMjcpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9mcmFtZXNfMTI4XzI1NSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2ZyYW1lc18yNTZfNTExKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fbGluaywgcnhfZnJhbWVzXzUxMl8xMDIzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fbGluaywgcnhfZnJhbWVzXzEwMjRfMTUxOCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2ZyYW1lc18xNTE5XzIwNDcpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9mcmFtZXNfMjA0OF80MDk1KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fbGluaywgcnhfZnJhbWVzXzQwOTZfOTIxNikgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X2ZyYW1lc185MjE3XzE2MzgzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fbGluaywgcnhfb2FtX2J5dGVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fbGluaywgcnhfb2FtX2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X21wY3BfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fbGluaywgcnhfYnJvYWRjYXN0X2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X3VuaWNhc3RfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fbGluaywgcnhfbXVsdGljYXN0X2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X3JlcG9ydF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9mY3NfZXJyb3IpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9vdmVyc2l6ZV9lcnJvcikgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX2xpbmssIHJ4X3J1bnRfZXJyb3IpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9saW5lX2NvZGVfZXJyb3IpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9saW5rLCByeF9saW5lX2NvZGVfZXJyb3JfbWF4KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fbGluaywgdHhfZGF0YV9ieXRlcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X2RhdGFfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fbGluaywgdHhfZnJhbWVzXzY0KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fbGluaywgdHhfZnJhbWVzXzY1XzEyNykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X2ZyYW1lc18xMjhfMjU1KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fbGluaywgdHhfZnJhbWVzXzI1Nl81MTEpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9mcmFtZXNfNTEyXzEwMjMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9mcmFtZXNfMTAyNF8xNTE4KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fbGluaywgdHhfZnJhbWVzXzE1MTlfMjA0NykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX2xpbmssIHR4X2ZyYW1lc18yMDQ4XzQwOTUpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9mcmFtZXNfNDA5Nl85MjE2KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fbGluaywgdHhfZnJhbWVzXzkyMTdfMTYzODMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9vYW1fYnl0ZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9vYW1fZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fbGluaywgdHhfbXBjcF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9icm9hZGNhc3RfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fbGluaywgdHhfdW5pY2FzdF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9saW5rLCB0eF9tdWx0aWNhc3RfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fbGluaywgdHhfZ2F0ZXMpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fbGluaywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9saW5rLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfZ2V0KGRldmljZV9pZCwgJnN0YXQuaGRyLCBjbGVhcl9vbl9yZWFkKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXQuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdC5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9saW5rX29wZXJfZm9yY2VfcmVkaXNjb3Zlcnlfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX2xpbmtfZm9yY2VfcmVkaXNjb3Zlcnkgb3BlcjsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleSA9IHsgfTsgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbGlua19mb3JjZV9yZWRpc2NvdmVyeSBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbGlua19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5tYWNfYWRkcmVzcyA9IGNsaV9wYXJtLT52YWx1ZS5tYWM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYWNfYWRkcmVzcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkubWFjX2FkZHJlc3MgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fTElOS19LRVlfSURfTUFDX0FERFJFU1MsICZrZXkubWFjX2FkZHJlc3MpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGVwb25fbGluaywgZm9yY2VfcmVkaXNjb3ZlcnksIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZXBvbl9saW5rLCBmb3JjZV9yZWRpc2NvdmVyeSwga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX2xpbmtfb3Blcl9kZWxldGVfbGlua19zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fbGlua19kZWxldGVfbGluayBvcGVyOyAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleSA9IHsgfTsgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xpbmtfZGVsZXRlX2xpbmsgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fTElOS19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkubWFjX2FkZHJlc3MgPSBjbGlfcGFybS0+dmFsdWUubWFjOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWFjX2FkZHJlc3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm1hY19hZGRyZXNzID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX01BQ19BRERSRVNTLCAma2V5Lm1hY19hZGRyZXNzKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBlcG9uX2xpbmssIGRlbGV0ZV9saW5rLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGVwb25fbGluaywgZGVsZXRlX2xpbmssIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9saW5rX29wZXJfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0IG9wZXI7ICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXkgPSB7IH07ICAgICAgICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0IG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9saW5rX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm1hY19hZGRyZXNzID0gY2xpX3Bhcm0tPnZhbHVlLm1hYzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1hY19hZGRyZXNzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5tYWNfYWRkcmVzcyA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9NQUNfQUREUkVTUywgJmtleS5tYWNfYWRkcmVzcyk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZXBvbl9saW5rLCBvYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGVwb25fbGluaywgb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydCwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzZW5kX3BlcmlvZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDE2X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGVwb25fbGluaywgb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydCwgc2VuZF9wZXJpb2QsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBlcG9uX2xpbmssIG9hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnQsIHNlbmRfcGVyaW9kLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfRVBPTl9MSU5LX09QRVJfSURfT0FNX0tFRVBBTElWRV9USU1FUl9TVEFSVCwgQkNNT0xUX0VQT05fTElOS19PQU1fS0VFUEFMSVZFX1RJTUVSX1NUQVJUX0lEX1NFTkRfUEVSSU9ELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9saW5rX29wZXJfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wX3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcCBvcGVyOyAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkga2V5ID0geyB9OyAgICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3Agb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fTElOS19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkubWFjX2FkZHJlc3MgPSBjbGlfcGFybS0+dmFsdWUubWFjOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWFjX2FkZHJlc3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm1hY19hZGRyZXNzID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX01BQ19BRERSRVNTLCAma2V5Lm1hY19hZGRyZXNzKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBlcG9uX2xpbmssIG9hbV9rZWVwYWxpdmVfdGltZXJfc3RvcCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBlcG9uX2xpbmssIG9hbV9rZWVwYWxpdmVfdGltZXJfc3RvcCwga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX2xpbmtfb3Blcl9rZXlfZXhjaGFuZ2Vfc3RhcnRfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0IG9wZXI7ICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleSA9IHsgfTsgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnQgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fTElOS19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkubWFjX2FkZHJlc3MgPSBjbGlfcGFybS0+dmFsdWUubWFjOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWFjX2FkZHJlc3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm1hY19hZGRyZXNzID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX01BQ19BRERSRVNTLCAma2V5Lm1hY19hZGRyZXNzKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBlcG9uX2xpbmssIGtleV9leGNoYW5nZV9zdGFydCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBlcG9uX2xpbmssIGtleV9leGNoYW5nZV9zdGFydCwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwZXJpb2QiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBlcG9uX2xpbmssIGtleV9leGNoYW5nZV9zdGFydCwgcGVyaW9kLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZXBvbl9saW5rLCBrZXlfZXhjaGFuZ2Vfc3RhcnQsIHBlcmlvZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0VQT05fTElOS19PUEVSX0lEX0tFWV9FWENIQU5HRV9TVEFSVCwgQkNNT0xUX0VQT05fTElOS19LRVlfRVhDSEFOR0VfU1RBUlRfSURfUEVSSU9ELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9saW5rX29wZXJfa2V5X2V4Y2hhbmdlX3N0b3Bfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3Agb3BlcjsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleSA9IHsgfTsgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcCBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbGlua19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5tYWNfYWRkcmVzcyA9IGNsaV9wYXJtLT52YWx1ZS5tYWM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYWNfYWRkcmVzcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkubWFjX2FkZHJlc3MgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fTElOS19LRVlfSURfTUFDX0FERFJFU1MsICZrZXkubWFjX2FkZHJlc3MpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGVwb25fbGluaywga2V5X2V4Y2hhbmdlX3N0b3AsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZXBvbl9saW5rLCBrZXlfZXhjaGFuZ2Vfc3RvcCwga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX2xpbmtfb3Blcl9zdGF0aWNfcmVnaXN0cmF0aW9uX3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb24gb3BlcjsgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXkgPSB7IH07ICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbiBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbGlua19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5tYWNfYWRkcmVzcyA9IGNsaV9wYXJtLT52YWx1ZS5tYWM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYWNfYWRkcmVzcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkubWFjX2FkZHJlc3MgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fTElOS19LRVlfSURfTUFDX0FERFJFU1MsICZrZXkubWFjX2FkZHJlc3MpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGVwb25fbGluaywgc3RhdGljX3JlZ2lzdHJhdGlvbiwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBlcG9uX2xpbmssIHN0YXRpY19yZWdpc3RyYXRpb24sIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFzZXJvbl90aW1lX3RxIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdGltZV9xdWFudGEgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGVwb25fbGluaywgc3RhdGljX3JlZ2lzdHJhdGlvbiwgbGFzZXJvbl90aW1lX3RxLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZXBvbl9saW5rLCBzdGF0aWNfcmVnaXN0cmF0aW9uLCBsYXNlcm9uX3RpbWVfdHEsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9TVEFUSUNfUkVHSVNUUkFUSU9OLCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRJQ19SRUdJU1RSQVRJT05fSURfTEFTRVJPTl9USU1FX1RRLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFzZXJvZmZfdGltZV90cSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3RpbWVfcXVhbnRhIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBlcG9uX2xpbmssIHN0YXRpY19yZWdpc3RyYXRpb24sIGxhc2Vyb2ZmX3RpbWVfdHEsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBlcG9uX2xpbmssIHN0YXRpY19yZWdpc3RyYXRpb24sIGxhc2Vyb2ZmX3RpbWVfdHEsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9TVEFUSUNfUkVHSVNUUkFUSU9OLCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRJQ19SRUdJU1RSQVRJT05fSURfTEFTRVJPRkZfVElNRV9UUSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdlX3ZhbHVlX3RxIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdGltZV9xdWFudGEgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGVwb25fbGluaywgc3RhdGljX3JlZ2lzdHJhdGlvbiwgcmFuZ2VfdmFsdWVfdHEsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBlcG9uX2xpbmssIHN0YXRpY19yZWdpc3RyYXRpb24sIHJhbmdlX3ZhbHVlX3RxLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfRVBPTl9MSU5LX09QRVJfSURfU1RBVElDX1JFR0lTVFJBVElPTiwgQkNNT0xUX0VQT05fTElOS19TVEFUSUNfUkVHSVNUUkFUSU9OX0lEX1JBTkdFX1ZBTFVFX1RRLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGVuZGluZ19ncmFudHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGVwb25fbGluaywgc3RhdGljX3JlZ2lzdHJhdGlvbiwgcGVuZGluZ19ncmFudHMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBlcG9uX2xpbmssIHN0YXRpY19yZWdpc3RyYXRpb24sIHBlbmRpbmdfZ3JhbnRzLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfRVBPTl9MSU5LX09QRVJfSURfU1RBVElDX1JFR0lTVFJBVElPTiwgQkNNT0xUX0VQT05fTElOS19TVEFUSUNfUkVHSVNUUkFUSU9OX0lEX1BFTkRJTkdfR1JBTlRTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9saW5rX3Byb3h5X2luamVjdF9mcmFtZV9zZW5kKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWUgcHJveHk7ICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXkgPSB7IH07ICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWUgcHJveHk7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9saW5rX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfcHJveHlfc2VuZCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fTElOS19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkubWFjX2FkZHJlc3MgPSBjbGlfcGFybS0+dmFsdWUubWFjOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWFjX2FkZHJlc3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm1hY19hZGRyZXNzID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX01BQ19BRERSRVNTLCAma2V5Lm1hY19hZGRyZXNzKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfUFJPWFlfSU5JVCgmcHJveHksIGVwb25fbGluaywgaW5qZWN0X2ZyYW1lLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9QUk9YWV9JTklUKCZwcm94eSwgZXBvbl9saW5rLCBpbmplY3RfZnJhbWUsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZyYW1lLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2V0aGVybmV0X2ZyYW1lX3VubWFza2VkIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZS5mcmFtZV9vY3RldHMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5mcmFtZV9vY3RldHMubGVuID0gYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcik7CisgICAgICAgICAgICB2YWwuZnJhbWVfb2N0ZXRzLnZhbCA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgdmFsLmZyYW1lX29jdGV0cy5sZW4pOworICAgICAgICAgICAgaWYgKHZhbC5mcmFtZV9vY3RldHMudmFsID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwuZnJhbWVfb2N0ZXRzLnZhbCwgdmFsLmZyYW1lX29jdGV0cy5sZW4pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZyYW1lLmZyYW1lX29jdGV0cyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCBlcG9uX2xpbmssIGluamVjdF9mcmFtZSwgZnJhbWUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZXRoZXJuZXRfZnJhbWVfdW5tYXNrZWQgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFksIEJDTU9MVF9FUE9OX0xJTktfUFJPWFlfSURfSU5KRUNUX0ZSQU1FLCBCQ01PTFRfRVBPTl9MSU5LX0lOSkVDVF9GUkFNRV9JRF9GUkFNRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCBlcG9uX2xpbmssIGluamVjdF9mcmFtZSwgZnJhbWUsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfcHJveHlfc2VuZChkZXZpY2VfaWQsICZwcm94eS5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9wcm94eV9zZW5kKGRldmljZV9pZCwgJnByb3h5Lmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBwcm94eS5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9saW5rX3N0YXRfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnIHN0YXRfY2ZnOyAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkga2V5ID0geyB9OyAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZCBzdGF0X2lkOyAgIC8qKjwgZGVjbGFyZSBzdGF0IElEICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnIHN0YXRfY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbGlua19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fTElOS19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkubWFjX2FkZHJlc3MgPSBjbGlfcGFybS0+dmFsdWUubWFjOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWFjX2FkZHJlc3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm1hY19hZGRyZXNzID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX01BQ19BRERSRVNTLCAma2V5Lm1hY19hZGRyZXNzKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IElEIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBzdGF0X2lkID0gKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIHN3aXRjaCAoc3RhdF9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0RBVEFfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZGF0YV9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9kYXRhX2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfREFUQV9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZGF0YV9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZGF0YV9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfNjQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZnJhbWVzXzY0LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2ZyYW1lc182NCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU182NV8xMjc6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZnJhbWVzXzY1XzEyNywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mcmFtZXNfNjVfMTI3LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzEyOF8yNTU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZnJhbWVzXzEyOF8yNTUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZnJhbWVzXzEyOF8yNTUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfMjU2XzUxMToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mcmFtZXNfMjU2XzUxMSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mcmFtZXNfMjU2XzUxMSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU181MTJfMTAyMzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mcmFtZXNfNTEyXzEwMjMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZnJhbWVzXzUxMl8xMDIzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzEwMjRfMTUxODoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mcmFtZXNfMTAyNF8xNTE4LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2ZyYW1lc18xMDI0XzE1MTgsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfMTUxOV8yMDQ3OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2ZyYW1lc18xNTE5XzIwNDcsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZnJhbWVzXzE1MTlfMjA0Nywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18yMDQ4XzQwOTU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZnJhbWVzXzIwNDhfNDA5NSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mcmFtZXNfMjA0OF80MDk1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzQwOTZfOTIxNjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mcmFtZXNfNDA5Nl85MjE2LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2ZyYW1lc180MDk2XzkyMTYsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfOTIxN18xNjM4MzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mcmFtZXNfOTIxN18xNjM4Mywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mcmFtZXNfOTIxN18xNjM4Mywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX09BTV9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9vYW1fYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfb2FtX2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfT0FNX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9vYW1fZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X29hbV9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9NUENQX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9tcGNwX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9tcGNwX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0JST0FEQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfYnJvYWRjYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9icm9hZGNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfdW5pY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfdW5pY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9NVUxUSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X211bHRpY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfbXVsdGljYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX1JFUE9SVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfcmVwb3J0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9yZXBvcnRfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRkNTX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2Zjc19lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mY3NfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9PVkVSU0laRV9FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9vdmVyc2l6ZV9lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9vdmVyc2l6ZV9lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX1JVTlRfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfcnVudF9lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9ydW50X2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfTElORV9DT0RFX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2xpbmVfY29kZV9lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9saW5lX2NvZGVfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9MSU5FX0NPREVfRVJST1JfTUFYOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2xpbmVfY29kZV9lcnJvcl9tYXgsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfbGluZV9jb2RlX2Vycm9yX21heCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0RBVEFfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZGF0YV9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9kYXRhX2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfREFUQV9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZGF0YV9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZGF0YV9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfNjQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZnJhbWVzXzY0LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2ZyYW1lc182NCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU182NV8xMjc6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZnJhbWVzXzY1XzEyNywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9mcmFtZXNfNjVfMTI3LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzEyOF8yNTU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZnJhbWVzXzEyOF8yNTUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZnJhbWVzXzEyOF8yNTUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMjU2XzUxMToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9mcmFtZXNfMjU2XzUxMSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9mcmFtZXNfMjU2XzUxMSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU181MTJfMTAyMzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9mcmFtZXNfNTEyXzEwMjMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZnJhbWVzXzUxMl8xMDIzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzEwMjRfMTUxODoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9mcmFtZXNfMTAyNF8xNTE4LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2ZyYW1lc18xMDI0XzE1MTgsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMTUxOV8yMDQ3OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2ZyYW1lc18xNTE5XzIwNDcsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZnJhbWVzXzE1MTlfMjA0Nywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18yMDQ4XzQwOTU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZnJhbWVzXzIwNDhfNDA5NSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9mcmFtZXNfMjA0OF80MDk1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzQwOTZfOTIxNjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9mcmFtZXNfNDA5Nl85MjE2LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2ZyYW1lc180MDk2XzkyMTYsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfOTIxN18xNjM4MzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9mcmFtZXNfOTIxN18xNjM4Mywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9mcmFtZXNfOTIxN18xNjM4Mywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX09BTV9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9vYW1fYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfb2FtX2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfT0FNX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9vYW1fZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X29hbV9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9NUENQX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9tcGNwX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9tcGNwX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0JST0FEQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfYnJvYWRjYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9icm9hZGNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfdW5pY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfdW5pY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9NVUxUSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X211bHRpY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfbXVsdGljYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0dBVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2dhdGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2dhdGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXRfY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX2xpbmtfc3RhdF9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmcgc3RhdF9jZmc7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXkgPSB7IH07ICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkIHN0YXRfaWQ7ICAgLyoqPCBkZWNsYXJlIHN0YXQgSUQgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9saW5rX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5tYWNfYWRkcmVzcyA9IGNsaV9wYXJtLT52YWx1ZS5tYWM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYWNfYWRkcmVzcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkubWFjX2FkZHJlc3MgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fTElOS19LRVlfSURfTUFDX0FERFJFU1MsICZrZXkubWFjX2FkZHJlc3MpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgc3dpdGNoIChzdGF0X2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfREFUQV9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9kYXRhX2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2RhdGFfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9EQVRBX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9kYXRhX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9kYXRhX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU182NDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mcmFtZXNfNjQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZnJhbWVzXzY0LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzY1XzEyNzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mcmFtZXNfNjVfMTI3LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2ZyYW1lc182NV8xMjcsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfMTI4XzI1NToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mcmFtZXNfMTI4XzI1NSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mcmFtZXNfMTI4XzI1NSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18yNTZfNTExOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2ZyYW1lc18yNTZfNTExLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2ZyYW1lc18yNTZfNTExLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzUxMl8xMDIzOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2ZyYW1lc181MTJfMTAyMywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mcmFtZXNfNTEyXzEwMjMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfMTAyNF8xNTE4OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2ZyYW1lc18xMDI0XzE1MTgsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZnJhbWVzXzEwMjRfMTUxOCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18xNTE5XzIwNDc6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZnJhbWVzXzE1MTlfMjA0Nywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mcmFtZXNfMTUxOV8yMDQ3LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzIwNDhfNDA5NToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9mcmFtZXNfMjA0OF80MDk1LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2ZyYW1lc18yMDQ4XzQwOTUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfNDA5Nl85MjE2OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2ZyYW1lc180MDk2XzkyMTYsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZnJhbWVzXzQwOTZfOTIxNiwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU185MjE3XzE2MzgzOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2ZyYW1lc185MjE3XzE2MzgzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2ZyYW1lc185MjE3XzE2MzgzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfT0FNX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X29hbV9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9vYW1fYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9PQU1fRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X29hbV9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfb2FtX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX01QQ1BfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X21wY3BfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X21wY3BfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfQlJPQURDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9icm9hZGNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2Jyb2FkY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF91bmljYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF91bmljYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX01VTFRJQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfbXVsdGljYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9tdWx0aWNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfUkVQT1JUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9yZXBvcnRfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X3JlcG9ydF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GQ1NfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfZmNzX2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2Zjc19lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX09WRVJTSVpFX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X292ZXJzaXplX2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X292ZXJzaXplX2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfUlVOVF9FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9ydW50X2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X3J1bnRfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9MSU5FX0NPREVfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfbGluZV9jb2RlX2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHJ4X2xpbmVfY29kZV9lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0xJTkVfQ09ERV9FUlJPUl9NQVg6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgcnhfbGluZV9jb2RlX2Vycm9yX21heCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCByeF9saW5lX2NvZGVfZXJyb3JfbWF4LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfREFUQV9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9kYXRhX2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2RhdGFfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9EQVRBX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9kYXRhX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9kYXRhX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU182NDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9mcmFtZXNfNjQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZnJhbWVzXzY0LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzY1XzEyNzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9mcmFtZXNfNjVfMTI3LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2ZyYW1lc182NV8xMjcsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMTI4XzI1NToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9mcmFtZXNfMTI4XzI1NSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9mcmFtZXNfMTI4XzI1NSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18yNTZfNTExOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2ZyYW1lc18yNTZfNTExLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2ZyYW1lc18yNTZfNTExLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzUxMl8xMDIzOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2ZyYW1lc181MTJfMTAyMywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9mcmFtZXNfNTEyXzEwMjMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMTAyNF8xNTE4OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2ZyYW1lc18xMDI0XzE1MTgsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZnJhbWVzXzEwMjRfMTUxOCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18xNTE5XzIwNDc6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZnJhbWVzXzE1MTlfMjA0Nywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9mcmFtZXNfMTUxOV8yMDQ3LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzIwNDhfNDA5NToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9mcmFtZXNfMjA0OF80MDk1LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2ZyYW1lc18yMDQ4XzQwOTUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfNDA5Nl85MjE2OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2ZyYW1lc180MDk2XzkyMTYsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZnJhbWVzXzQwOTZfOTIxNiwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU185MjE3XzE2MzgzOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2ZyYW1lc185MjE3XzE2MzgzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2ZyYW1lc185MjE3XzE2MzgzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfT0FNX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X29hbV9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9vYW1fYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9PQU1fRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X29hbV9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfb2FtX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX01QQ1BfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X21wY3BfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X21wY3BfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfQlJPQURDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9icm9hZGNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIHR4X2Jyb2FkY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF91bmljYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF91bmljYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX01VTFRJQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfbXVsdGljYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9saW5rLCB0eF9tdWx0aWNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfR0FURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZ2F0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fbGluaywgdHhfZ2F0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnR5cGUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnR5cGUgPSAoYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHZhbC50cmlnZ2VyLnR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5yaXNpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV90aHJlc2hvbGQucmlzaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5yaXNpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5mYWxsaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLmZhbGxpbmcgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmZhbGxpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9SQU5HRToKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci51cHBlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLnVwcGVyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci51cHBlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmxvd2VyIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfcmFuZ2UubG93ZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxvd2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1ZBTFVFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5saW1pdCIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS52YWx1ZV90aHJlc2hvbGQubGltaXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxpbWl0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX05PTkU6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnNvYWsuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnNvYWsuY2xlYXJfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9TVEFUX0NGR19QUk9QX1NFVCgmc3RhdF9jZmcsIGVwb25fbGluaywgY2ZnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfQ0ZHX0lEX0NGRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCBlcG9uX2xpbmssIGNmZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0X2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9saW5rX2F1dG9fY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnIGF1dG9fY2ZnOyAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkga2V5ID0geyB9OyAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xpbmtfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19nZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGVwb25fbGluaywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGVwb25fbGluaywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3QpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBkdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZW5jcnlwdGlvbl9lbmFibGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBlbmNyeXB0aW9uX2VuYWJsZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBlbmNyeXB0aW9uX2VuYWJsZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImtleV9leGNoYW5nZV9mYWlsdXJlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBrZXlfZXhjaGFuZ2VfZmFpbHVyZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIGtleV9leGNoYW5nZV9mYWlsdXJlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXlfZXhjaGFuZ2Vfc3RhcnRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywga2V5X2V4Y2hhbmdlX3N0YXJ0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBrZXlfZXhjaGFuZ2Vfc3RhcnRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2V5X2V4Y2hhbmdlX3N0b3BwZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIGtleV9leGNoYW5nZV9zdG9wcGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywga2V5X2V4Y2hhbmdlX3N0b3BwZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxpbmtfZGVsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgbGlua19kZWxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgbGlua19kZWxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsaW5rX3NwZWVkX21pc21hdGNoIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBsaW5rX3NwZWVkX21pc21hdGNoKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgbGlua19zcGVlZF9taXNtYXRjaCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXBjcF9kZXJlZ2lzdGVyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIG1wY3BfZGVyZWdpc3RlcmVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgbXBjcF9kZXJlZ2lzdGVyZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1wY3BfZGlzY292ZXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgbXBjcF9kaXNjb3ZlcmVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgbXBjcF9kaXNjb3ZlcmVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtcGNwX3JlZ19hY2tfdGltZW91dCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgbXBjcF9yZWdfYWNrX3RpbWVvdXQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBtcGNwX3JlZ19hY2tfdGltZW91dCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXBjcF9yZXBvcnRfdGltZW91dCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgbXBjcF9yZXBvcnRfdGltZW91dCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIG1wY3BfcmVwb3J0X3RpbWVvdXQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9hbV9rZWVwYWxpdmVfdGltZW91dCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgb2FtX2tlZXBhbGl2ZV90aW1lb3V0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgb2FtX2tlZXBhbGl2ZV90aW1lb3V0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIG9hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIG9hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBvYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BwZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBvYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BwZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBwcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2VfdmFsdWVfY2hhbmdlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgcmFuZ2VfdmFsdWVfY2hhbmdlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIHJhbmdlX3ZhbHVlX2NoYW5nZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJlcmFuZ2VfZmFpbHVyZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgcmVyYW5nZV9mYWlsdXJlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgcmVyYW5nZV9mYWlsdXJlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX2NsZWFyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIHN0YXRfYWxhcm1fY2xlYXJlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIHN0YXRfYWxhcm1fY2xlYXJlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9yYWlzZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIHN0YXRfYWxhcm1fcmFpc2VkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgc3RhdF9hbGFybV9yYWlzZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRpY19yZWdpc3RyYXRpb25fZG9uZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIGR1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0KSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBlbmNyeXB0aW9uX2VuYWJsZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIGtleV9leGNoYW5nZV9mYWlsdXJlKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBrZXlfZXhjaGFuZ2Vfc3RhcnRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywga2V5X2V4Y2hhbmdlX3N0b3BwZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIGxpbmtfZGVsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgbGlua19zcGVlZF9taXNtYXRjaCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgbXBjcF9kZXJlZ2lzdGVyZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIG1wY3BfZGlzY292ZXJlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgbXBjcF9yZWdfYWNrX3RpbWVvdXQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIG1wY3BfcmVwb3J0X3RpbWVvdXQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIG9hbV9rZWVwYWxpdmVfdGltZW91dCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBvYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BwZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIHByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIHJhbmdlX3ZhbHVlX2NoYW5nZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIHJlcmFuZ2VfZmFpbHVyZSkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgc3RhdF9hbGFybV9jbGVhcmVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBzdGF0X2FsYXJtX3JhaXNlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbGluaywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmF1dG9fY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX2xpbmtfYXV0b19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmcgYXV0b19jZmc7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXkgPSB7IH07ICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbGlua19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX3NldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImR1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBkdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBkdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfRFVQTElDQVRFX01QQ1BfUkVHSVNUUkFUSU9OX1JFUVVFU1QsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmNyeXB0aW9uX2VuYWJsZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIGVuY3J5cHRpb25fZW5hYmxlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBlbmNyeXB0aW9uX2VuYWJsZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0VOQ1JZUFRJT05fRU5BQkxFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImtleV9leGNoYW5nZV9mYWlsdXJlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBrZXlfZXhjaGFuZ2VfZmFpbHVyZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBrZXlfZXhjaGFuZ2VfZmFpbHVyZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0ZBSUxVUkUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXlfZXhjaGFuZ2Vfc3RhcnRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywga2V5X2V4Y2hhbmdlX3N0YXJ0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywga2V5X2V4Y2hhbmdlX3N0YXJ0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9TVEFSVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2V5X2V4Y2hhbmdlX3N0b3BwZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIGtleV9leGNoYW5nZV9zdG9wcGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIGtleV9leGNoYW5nZV9zdG9wcGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfU1RPUFBFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxpbmtfZGVsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgbGlua19kZWxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIGxpbmtfZGVsZXRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTElOS19ERUxFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGlua19zcGVlZF9taXNtYXRjaCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgbGlua19zcGVlZF9taXNtYXRjaCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBsaW5rX3NwZWVkX21pc21hdGNoLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9MSU5LX1NQRUVEX01JU01BVENILCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXBjcF9kZXJlZ2lzdGVyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIG1wY3BfZGVyZWdpc3RlcmVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIG1wY3BfZGVyZWdpc3RlcmVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9NUENQX0RFUkVHSVNURVJFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1wY3BfZGlzY292ZXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgbXBjcF9kaXNjb3ZlcmVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIG1wY3BfZGlzY292ZXJlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTVBDUF9ESVNDT1ZFUkVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXBjcF9yZWdfYWNrX3RpbWVvdXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIG1wY3BfcmVnX2Fja190aW1lb3V0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIG1wY3BfcmVnX2Fja190aW1lb3V0LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9NUENQX1JFR19BQ0tfVElNRU9VVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1wY3BfcmVwb3J0X3RpbWVvdXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIG1wY3BfcmVwb3J0X3RpbWVvdXQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgbXBjcF9yZXBvcnRfdGltZW91dCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTVBDUF9SRVBPUlRfVElNRU9VVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9hbV9rZWVwYWxpdmVfdGltZW91dCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgb2FtX2tlZXBhbGl2ZV90aW1lb3V0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIG9hbV9rZWVwYWxpdmVfdGltZW91dCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfT0FNX0tFRVBBTElWRV9USU1FT1VULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBvYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9PQU1fS0VFUEFMSVZFX1RJTUVSX1NUQVJURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BwZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIG9hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBvYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BwZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX09BTV9LRUVQQUxJVkVfVElNRVJfU1RPUFBFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIHByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfUFJFUFJPVklTSU9ORURfTElOS19DUkVBVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIHByb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIHByb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSF9PQ0NVUlJFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdlX3ZhbHVlX2NoYW5nZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIHJhbmdlX3ZhbHVlX2NoYW5nZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgcmFuZ2VfdmFsdWVfY2hhbmdlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfUkFOR0VfVkFMVUVfQ0hBTkdFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJlcmFuZ2VfZmFpbHVyZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgcmVyYW5nZV9mYWlsdXJlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX2xpbmssIHJlcmFuZ2VfZmFpbHVyZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX0xJTkssIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfUkVSQU5HRV9GQUlMVVJFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9jbGVhcmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBzdGF0X2FsYXJtX2NsZWFyZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgc3RhdF9hbGFybV9jbGVhcmVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgc3RhdF9hbGFybV9yYWlzZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgc3RhdF9hbGFybV9yYWlzZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9saW5rLCBzdGF0aWNfcmVnaXN0cmF0aW9uX2RvbmUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbGluaywgc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9TVEFUSUNfUkVHSVNUUkFUSU9OX0RPTkUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fbmlfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX25pX2NmZyBjZmc7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX25pX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIHVpbnQ4X3QgKmxpc3RfbWVtOyAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1lbW9yeSBidWZmZXIgZm9yIHZhcmlhYmxlLXNpemVkIGxpc3RzICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9uaV9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50OF90KiBsaXN0X21lbTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9OSV9LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9uaSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9uaSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgbWFjX2FkZHJlc3MpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBtYWNfYWRkcmVzcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaV9lbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgZXBvbl9uaV9lbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIGVwb25fbmlfZW4pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJlZ2lzdHJhdGlvbl9iZWhhdmlvciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgcmVnaXN0cmF0aW9uX2JlaGF2aW9yKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgcmVnaXN0cmF0aW9uX2JlaGF2aW9yKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtdHVfMWciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIG10dV8xZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIG10dV8xZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXR1XzEwZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgbXR1XzEwZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIG10dV8xMGcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1pbmltdW1fZmliZXJfbGVuZ3RoIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBtaW5pbXVtX2ZpYmVyX2xlbmd0aCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIG1pbmltdW1fZmliZXJfbGVuZ3RoKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhpbXVtX2ZpYmVyX2xlbmd0aCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgbWF4aW11bV9maWJlcl9sZW5ndGgpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBtYXhpbXVtX2ZpYmVyX2xlbmd0aCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ3JhbnRfc3BhY2luZ190cSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgZ3JhbnRfc3BhY2luZ190cSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIGdyYW50X3NwYWNpbmdfdHEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbG9naWNhbF9saW5rX29wdGlvbnMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIGVwb25fbG9naWNhbF9saW5rX29wdGlvbnMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBlcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtcGNwX2Rpc2NvdmVyeV9wZXJpb2RfbXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIG1wY3BfZGlzY292ZXJ5X3BlcmlvZF9tcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIG1wY3BfZGlzY292ZXJ5X3BlcmlvZF9tcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxhcm1fc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIGFsYXJtX3N0YXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgYWxhcm1fc3RhdGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsbF9saW5rcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgYWxsX2xpbmtzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgYWxsX2xpbmtzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmNyeXB0aW9uX2NmZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgZW5jcnlwdGlvbl9jZmcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBlbmNyeXB0aW9uX2NmZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNsb2NrX3RyYW5zcG9ydF9jZmciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIGNsb2NrX3RyYW5zcG9ydF9jZmcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBjbG9ja190cmFuc3BvcnRfY2ZnKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkcm9wZG93bl93ZWlnaHRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBkcm9wZG93bl93ZWlnaHRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgZHJvcGRvd25fd2VpZ2h0cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXBwcm94aW1hdGVfc29saWNpdGVkX3VzYWdlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBhcHByb3hpbWF0ZV9zb2xpY2l0ZWRfdXNhZ2UpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBhcHByb3hpbWF0ZV9zb2xpY2l0ZWRfdXNhZ2UpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFwcHJveGltYXRlX3RkbV91c2FnZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgYXBwcm94aW1hdGVfdGRtX3VzYWdlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgYXBwcm94aW1hdGVfdGRtX3VzYWdlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJub19yZXBvcnRzX3NvYWtfdGltZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgbm9fcmVwb3J0c19zb2FrX3RpbWUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBub19yZXBvcnRzX3NvYWtfdGltZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX2FnZ3JlZ2F0ZV9zaGFwZXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIHBvbl9hZ2dyZWdhdGVfc2hhcGVyKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgcG9uX2FnZ3JlZ2F0ZV9zaGFwZXIpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVzdGltYXRlZF9wb25fbGF0ZW5jeV90cSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgZXN0aW1hdGVkX3Bvbl9sYXRlbmN5X3RxKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgZXN0aW1hdGVkX3Bvbl9sYXRlbmN5X3RxKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfdXBncmFkZV9wYXJhbXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIG9udV91cGdyYWRlX3BhcmFtcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIG9udV91cGdyYWRlX3BhcmFtcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXV0b19yb2d1ZV9kZXRlY3RfMTBnX2VuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBhdXRvX3JvZ3VlX2RldGVjdF8xMGdfZW4pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBhdXRvX3JvZ3VlX2RldGVjdF8xMGdfZW4pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImF1dG9fcm9ndWVfZGV0ZWN0XzFnX2VuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBhdXRvX3JvZ3VlX2RldGVjdF8xZ19lbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIGF1dG9fcm9ndWVfZGV0ZWN0XzFnX2VuKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhdXRvX3JvZ3VlX2RldGVjdF8xMGdfdGhyZXNob2xkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBhdXRvX3JvZ3VlX2RldGVjdF8xMGdfdGhyZXNob2xkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9uaSwgYXV0b19yb2d1ZV9kZXRlY3RfMTBnX3RocmVzaG9sZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX25pLCBtYWNfYWRkcmVzcykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9uaSwgZXBvbl9uaV9lbikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9uaSwgcmVnaXN0cmF0aW9uX2JlaGF2aW9yKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX25pLCBtdHVfMWcpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fbmksIG10dV8xMGcpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fbmksIG1pbmltdW1fZmliZXJfbGVuZ3RoKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX25pLCBtYXhpbXVtX2ZpYmVyX2xlbmd0aCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9uaSwgZ3JhbnRfc3BhY2luZ190cSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9uaSwgZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9uaSwgbXBjcF9kaXNjb3ZlcnlfcGVyaW9kX21zKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX25pLCBhbGFybV9zdGF0ZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9uaSwgYWxsX2xpbmtzKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX25pLCBlbmNyeXB0aW9uX2NmZykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX25pLCBjbG9ja190cmFuc3BvcnRfY2ZnKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX25pLCBkcm9wZG93bl93ZWlnaHRzKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX25pLCBhcHByb3hpbWF0ZV9zb2xpY2l0ZWRfdXNhZ2UpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fbmksIGFwcHJveGltYXRlX3RkbV91c2FnZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9uaSwgbm9fcmVwb3J0c19zb2FrX3RpbWUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fbmksIHBvbl9hZ2dyZWdhdGVfc2hhcGVyKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX25pLCBlc3RpbWF0ZWRfcG9uX2xhdGVuY3lfdHEpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fbmksIG9udV91cGdyYWRlX3BhcmFtcykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9uaSwgYXV0b19yb2d1ZV9kZXRlY3RfMTBnX2VuKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX25pLCBhdXRvX3JvZ3VlX2RldGVjdF8xZ19lbikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9uaSwgYXV0b19yb2d1ZV9kZXRlY3RfMTBnX3RocmVzaG9sZCkpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fbmksIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX25pLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBzZXQgbWVtb3J5IHRvIHVzZSBmb3IgdmFyaWFibGUtc2l6ZWQgbGlzdHMgKi8KKyAgICBsaXN0X21lbSA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7CisgICAgaWYgKGxpc3RfbWVtID09IE5VTEwpCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImxpc3RfbWVtID0gYmNtb3NfY2FsbG9jKEFQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpO1xuIik7CisgICAgQkNNT0xUX0NGR19MSVNUX0JVRl9TRVQoJmNmZywgZXBvbl9uaSwgbGlzdF9tZW0sIEFQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfTElTVF9CVUZfU0VUKCZjZmcsIGVwb25fbmksIGxpc3RfbWVtLCBBUElDTElfRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFKTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fbmlfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX25pX2NmZyBjZmc7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX25pX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbmlfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX05JX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX25pLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX25pLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19tYWNfYWRkcmVzcyB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5tYWM7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgbWFjX2FkZHJlc3MsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgbWFjX2FkZHJlc3MsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9NQUNfQUREUkVTUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJlZ2lzdHJhdGlvbl9iZWhhdmlvciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3JlZ2lzdHJhdGlvbl9iZWhhdmlvciB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfcmVnaXN0cmF0aW9uX2JlaGF2aW9yKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgcmVnaXN0cmF0aW9uX2JlaGF2aW9yLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIHJlZ2lzdHJhdGlvbl9iZWhhdmlvciwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX1JFR0lTVFJBVElPTl9CRUhBVklPUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm10dV8xZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDE2X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBtdHVfMWcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgbXR1XzFnLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTVRVXzFHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXR1XzEwZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDE2X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBtdHVfMTBnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIG10dV8xMGcsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9NVFVfMTBHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWluaW11bV9maWJlcl9sZW5ndGgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9tZXRlcnMgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X21ldGVycykgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgbWluaW11bV9maWJlcl9sZW5ndGgsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgbWluaW11bV9maWJlcl9sZW5ndGgsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9NSU5JTVVNX0ZJQkVSX0xFTkdUSCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1heGltdW1fZmliZXJfbGVuZ3RoIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfbWV0ZXJzIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9tZXRlcnMpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIG1heGltdW1fZmliZXJfbGVuZ3RoLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIG1heGltdW1fZmliZXJfbGVuZ3RoLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTUFYSU1VTV9GSUJFUl9MRU5HVEgsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJncmFudF9zcGFjaW5nX3RxIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdGltZV9xdWFudGEgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBncmFudF9zcGFjaW5nX3RxLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIGdyYW50X3NwYWNpbmdfdHEsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9HUkFOVF9TUEFDSU5HX1RRLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImVwb25fbG9naWNhbF9saW5rX29wdGlvbnMuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImVwb25fbG9naWNhbF9saW5rX29wdGlvbnMucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucy5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUgPSAoYmNtb2x0X21wY3BfZ2F0ZV9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbG9naWNhbF9saW5rX29wdGlvbnMucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAodmFsLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUucmVnaXN0cmF0aW9uX2dhdGVfbW9kZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NUENQX0dBVEVfTU9ERV9URUtOT1ZVUzoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUucmVnX2Fja190aW1lb3V0X21zIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS51LnRla25vdnVzLnJlZ19hY2tfdGltZW91dF9tcyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbG9naWNhbF9saW5rX29wdGlvbnMucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS5yZWdfYWNrX3RpbWVvdXRfbXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01QQ1BfR0FURV9NT0RFX0NVU1RPTToKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucy5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLmdhdGVzLiIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLnUuY3VzdG9tLmdhdGVzLnZhbCA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgY2xpX3Bhcm0tPmFycmF5X3NpemUgKiBzaXplb2YoKnZhbC5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLnUuY3VzdG9tLmdhdGVzLnZhbCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbC5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLnUuY3VzdG9tLmdhdGVzLnZhbCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUudS5jdXN0b20uZ2F0ZXMubGVuID0gY2xpX3Bhcm0tPmFycmF5X3NpemU7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbG9naWNhbF9saW5rX29wdGlvbnMucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS5nYXRlcy5mbGFncyIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLnUuY3VzdG9tLmdhdGVzLmxlbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUuZ2F0ZXMuZmxhZ3MgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB2YWwucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS51LmN1c3RvbS5nYXRlcy5sZW47IGkwKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS51LmN1c3RvbS5nYXRlcy52YWxbaTBdLmZsYWdzID0gKGJjbW9sdF9tcGNwX3JlZ2lzdHJhdGlvbl9nYXRlX2ZsYWdzKSBjbGlfcGFybS0+dmFsdWVzW2kwXS5lbnVtX3ZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucy5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLmdhdGVzLmRlbGF5X2JlZm9yZV9tcyIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLnUuY3VzdG9tLmdhdGVzLmxlbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUuZ2F0ZXMuZGVsYXlfYmVmb3JlX21zIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdmFsLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUudS5jdXN0b20uZ2F0ZXMubGVuOyBpMCsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUudS5jdXN0b20uZ2F0ZXMudmFsW2kwXS5kZWxheV9iZWZvcmVfbXMgPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUuZ2F0ZXMuZ2F0ZV9zaXplX3RxIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gdmFsLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUudS5jdXN0b20uZ2F0ZXMubGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbG9naWNhbF9saW5rX29wdGlvbnMucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS5nYXRlcy5nYXRlX3NpemVfdHEgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB2YWwucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS51LmN1c3RvbS5nYXRlcy5sZW47IGkwKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS51LmN1c3RvbS5nYXRlcy52YWxbaTBdLmdhdGVfc2l6ZV90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbG9naWNhbF9saW5rX29wdGlvbnMucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS5nYXRlcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLnJlcG9ydGluZ19tb2RlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmVwb3J0aW5nX21vZGUgPSAoYmNtb2x0X2Vwb25fZGJhX3JlcG9ydGluZ19tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucy5yZXBvcnRpbmdfbW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbG9naWNhbF9saW5rX29wdGlvbnMubWF4X2xpbmtzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWF4X2xpbmtzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucy5tYXhfbGlua3MgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBlcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbG9naWNhbF9saW5rX29wdGlvbnMgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0VQT05fTE9HSUNBTF9MSU5LX09QVElPTlMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBlcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXBjcF9kaXNjb3ZlcnlfcGVyaW9kX21zIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIG1wY3BfZGlzY292ZXJ5X3BlcmlvZF9tcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBtcGNwX2Rpc2NvdmVyeV9wZXJpb2RfbXMsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9NUENQX0RJU0NPVkVSWV9QRVJJT0RfTVMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZW5jcnlwdGlvbl9jZmcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9uaV9lbmNyeXB0aW9uX2NmZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZW5jcnlwdGlvbl9jZmcuZG93bnN0cmVhbV9lbmNyeXB0aW9uX21vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSA9IChiY21vbHRfZXBvbl9lbmNyeXB0aW9uX21vZGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlbmNyeXB0aW9uX2NmZy5kb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuY3J5cHRpb25fY2ZnLnVwc3RyZWFtX2VuY3J5cHRpb25fbW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnVwc3RyZWFtX2VuY3J5cHRpb25fbW9kZSA9IChiY21vbHRfZXBvbl9lbmNyeXB0aW9uX21vZGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlbmNyeXB0aW9uX2NmZy51cHN0cmVhbV9lbmNyeXB0aW9uX21vZGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBlbmNyeXB0aW9uX2NmZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX25pX2VuY3J5cHRpb25fY2ZnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9FTkNSWVBUSU9OX0NGRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIGVuY3J5cHRpb25fY2ZnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2NvbmZpZ3VyYXRpb24gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5wcm90ZWN0aW9uX3R5cGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wcm90ZWN0aW9uX3R5cGUgPSAoYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5wcm90ZWN0aW9uX3R5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcucHJvdGVjdGlvbl9zd2l0Y2hpbmdfb3B0aW9ucyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnByb3RlY3Rpb25fc3dpdGNoaW5nX29wdGlvbnMgPSAoYmNtb2x0X3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RldGVjdGlvbl9vcHRpb25zKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLnByb3RlY3Rpb25fc3dpdGNoaW5nX29wdGlvbnMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcucmVyYW5nZV9vcHRpb25zIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmVyYW5nZV9vcHRpb25zID0gKGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3JlcmFuZ2luZ19vcHRpb25zKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLnJlcmFuZ2Vfb3B0aW9ucyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5yZXJhbmdlX2F0dGVtcHRzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmVyYW5nZV9hdHRlbXB0cyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5yZXJhbmdlX2F0dGVtcHRzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLnJlcmFuZ2VfaW50ZXJ2YWwiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5yZXJhbmdlX2ludGVydmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLnJlcmFuZ2VfaW50ZXJ2YWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcuc3luY19nYXRlX2R1cmF0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc3luY19nYXRlX2R1cmF0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLnN5bmNfZ2F0ZV9kdXJhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5ncGlvX2lucHV0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZ3Bpb19pbnB1dCA9IChiY21vbHRfZ3Bpb19waW4pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcuZ3Bpb19pbnB1dCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5ncGlvX2lucHV0X3BvbGFyaXR5Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZ3Bpb19pbnB1dF9wb2xhcml0eSA9IChiY21vbHRfZ3Bpb19wb2xhcml0eSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5ncGlvX2lucHV0X3BvbGFyaXR5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLmdwaW9fb3V0cHV0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZ3Bpb19vdXRwdXQgPSAoYmNtb2x0X2dwaW9fcGluKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLmdwaW9fb3V0cHV0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLmdwaW9fb3V0cHV0X3BvbGFyaXR5Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZ3Bpb19vdXRwdXRfcG9sYXJpdHkgPSAoYmNtb2x0X2dwaW9fcG9sYXJpdHkpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcuZ3Bpb19vdXRwdXRfcG9sYXJpdHkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19jb25maWd1cmF0aW9uIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19DRkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2xvY2tfdHJhbnNwb3J0X2NmZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9jb25maWd1cmF0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjbG9ja190cmFuc3BvcnRfY2ZnLmVwb25fY2xvY2tfdHJhbnNwb3J0X21vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5lcG9uX2Nsb2NrX3RyYW5zcG9ydF9tb2RlID0gKGJjbW9sdF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2xvY2tfdHJhbnNwb3J0X2NmZy5lcG9uX2Nsb2NrX3RyYW5zcG9ydF9tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgY2xvY2tfdHJhbnNwb3J0X2NmZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9jb25maWd1cmF0aW9uIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9DTE9DS19UUkFOU1BPUlRfQ0ZHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgY2xvY2tfdHJhbnNwb3J0X2NmZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJkcm9wZG93bl93ZWlnaHRzLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Fycl91MTZfNyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZHJvcGRvd25fd2VpZ2h0cy5hcnIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgaTE7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXJyYXkgZHJvcGRvd25fd2VpZ2h0cy5hcnIgbXVzdCBoYXZlIDcgZWxlbWVudHNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IDc7IGkxKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLmFycltpMV0gPSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImRyb3Bkb3duX3dlaWdodHMuYXJyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgZHJvcGRvd25fd2VpZ2h0cywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9hcnJfdTE2XzcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0RST1BET1dOX1dFSUdIVFMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBkcm9wZG93bl93ZWlnaHRzLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibm9fcmVwb3J0c19zb2FrX3RpbWUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgbm9fcmVwb3J0c19zb2FrX3RpbWUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgbm9fcmVwb3J0c19zb2FrX3RpbWUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9OT19SRVBPUlRTX1NPQUtfVElNRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJwb25fYWdncmVnYXRlX3NoYXBlci4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wb25fYWdncmVnYXRlX3NoYXBlciB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX2FnZ3JlZ2F0ZV9zaGFwZXIuYmFuZHdpZHRoX2ticHMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5iYW5kd2lkdGhfa2JwcyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9hZ2dyZWdhdGVfc2hhcGVyLmJhbmR3aWR0aF9rYnBzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX2FnZ3JlZ2F0ZV9zaGFwZXIubWJzX2tCIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWJzX2tCID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX2FnZ3JlZ2F0ZV9zaGFwZXIubWJzX2tCIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgcG9uX2FnZ3JlZ2F0ZV9zaGFwZXIsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcG9uX2FnZ3JlZ2F0ZV9zaGFwZXIgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX1BPTl9BR0dSRUdBVEVfU0hBUEVSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgcG9uX2FnZ3JlZ2F0ZV9zaGFwZXIsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAib251X3VwZ3JhZGVfcGFyYW1zLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfdXBncmFkZV9wYXJhbXMub2FtX2V4dGVuc2lvbl90eXBlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwub2FtX2V4dGVuc2lvbl90eXBlID0gKGJjbW9sdF9lcG9uX29hbV9leHRlbnNpb25fdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV91cGdyYWRlX3BhcmFtcy5vYW1fZXh0ZW5zaW9uX3R5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoICh2YWwub2FtX2V4dGVuc2lvbl90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FWFRFTlNJT05fVFlQRV9SRVNFUlZFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VYVEVOU0lPTl9UWVBFX0JST0FEQ09NOgorICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3VwZ3JhZGVfcGFyYW1zLnJlc3BvbnNlX3RpbWVvdXRfbXMiKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC51LmJyb2FkY29tLnJlc3BvbnNlX3RpbWVvdXRfbXMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV91cGdyYWRlX3BhcmFtcy5yZXNwb25zZV90aW1lb3V0X21zIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VYVEVOU0lPTl9UWVBFX0NUQzoKKyAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV91cGdyYWRlX3BhcmFtcy5yZXNwb25zZV90aW1lb3V0X21zIik7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwudS5jdGMucmVzcG9uc2VfdGltZW91dF9tcyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X3VwZ3JhZGVfcGFyYW1zLnJlc3BvbnNlX3RpbWVvdXRfbXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfREFTQU46CisgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfdXBncmFkZV9wYXJhbXMucmVzcG9uc2VfdGltZW91dF9tcyIpOworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLnUuZGFzYW4ucmVzcG9uc2VfdGltZW91dF9tcyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X3VwZ3JhZGVfcGFyYW1zLnJlc3BvbnNlX3RpbWVvdXRfbXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfS1Q6CisgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfdXBncmFkZV9wYXJhbXMucmVzcG9uc2VfdGltZW91dF9tcyIpOworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLnUua3QucmVzcG9uc2VfdGltZW91dF9tcyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X3VwZ3JhZGVfcGFyYW1zLnJlc3BvbnNlX3RpbWVvdXRfbXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfRFBPRToKKyAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV91cGdyYWRlX3BhcmFtcy5yZXNwb25zZV90aW1lb3V0X21zIik7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwudS5kcG9lLnJlc3BvbnNlX3RpbWVvdXRfbXMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV91cGdyYWRlX3BhcmFtcy5yZXNwb25zZV90aW1lb3V0X21zIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3VwZ3JhZGVfcGFyYW1zLmJsb2NrX3NpemUiKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC51LmRwb2UuYmxvY2tfc2l6ZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X3VwZ3JhZGVfcGFyYW1zLmJsb2NrX3NpemUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfdXBncmFkZV9wYXJhbXMuZmluYWxfYWNrX3Jlc3BvbnNlX3RpbWVvdXQiKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC51LmRwb2UuZmluYWxfYWNrX3Jlc3BvbnNlX3RpbWVvdXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV91cGdyYWRlX3BhcmFtcy5maW5hbF9hY2tfcmVzcG9uc2VfdGltZW91dCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgb251X3VwZ3JhZGVfcGFyYW1zLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9PTlVfVVBHUkFERV9QQVJBTVMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBvbnVfdXBncmFkZV9wYXJhbXMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhdXRvX3JvZ3VlX2RldGVjdF8xMGdfZW4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIGF1dG9fcm9ndWVfZGV0ZWN0XzEwZ19lbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBhdXRvX3JvZ3VlX2RldGVjdF8xMGdfZW4sICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9BVVRPX1JPR1VFX0RFVEVDVF8xMEdfRU4sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhdXRvX3JvZ3VlX2RldGVjdF8xZ19lbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgYXV0b19yb2d1ZV9kZXRlY3RfMWdfZW4sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgYXV0b19yb2d1ZV9kZXRlY3RfMWdfZW4sICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9BVVRPX1JPR1VFX0RFVEVDVF8xR19FTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImF1dG9fcm9ndWVfZGV0ZWN0XzEwZ190aHJlc2hvbGQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBhdXRvX3JvZ3VlX2RldGVjdF8xMGdfdGhyZXNob2xkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIGF1dG9fcm9ndWVfZGV0ZWN0XzEwZ190aHJlc2hvbGQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9BVVRPX1JPR1VFX0RFVEVDVF8xMEdfVEhSRVNIT0xELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fbmlfY2ZnX2NsZWFyKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX25pX2NmZyBjZmc7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX25pX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbmlfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2NsZWFyIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fTklfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fbmksIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fbmksIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX25pX2NmZ19nZXRfbXVsdGkoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9uaV9jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9uaV9rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbXNnX3NldCAqbXNnX3NldCA9IE5VTEw7IC8qKjwgZGVjbGFyZSBtZXNzYWdlIHNldCAqLworICAgIHVpbnQzMl90IG1heF9tc2dzOyAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgIC8qKjwgZGVjbGFyZSBmaWx0ZXIgaW52ZXJ0IGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX25pX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0KiBtc2dfc2V0ID0gTlVMTDtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQzMl90IG1heF9tc2dzO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldF9tdWx0aSIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX05JX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IG1heCBudW1iZXIgb2YgbXNncyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1heF9tc2dzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBtYXhfbXNncyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWF4X21zZ3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygibWF4X21zZ3MgPSAlZDtcbiIsIG1heF9tc2dzKTsKKworICAgIC8qIHNldCBmaWx0ZXIgaW52ZXJ0IGZsYWcgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXJfaW52ZXJ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnZlcnRfZmlsdGVyID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlcl9pbnZlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiaW52ZXJ0X2ZpbHRlciA9ICVzO1xuIiwgKGludmVydF9maWx0ZXIpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBhbGxvY2F0ZSBtZXNzYWdlIHNldCAqLworICAgIGVyciA9IGFwaWNsaV9tc2dfc2V0X2FsbG9jKGJ5dGVfcG9vbCwgQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9uaSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9uaSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubWFjX2FkZHJlc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX21hY19hZGRyZXNzIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm1hYzsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBtYWNfYWRkcmVzcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBtYWNfYWRkcmVzcywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01BQ19BRERSRVNTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX25pLCBtYWNfYWRkcmVzcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX25pLCBtYWNfYWRkcmVzcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVwb25fbmlfZW4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX25pX2VuX3N0YXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9lcG9uX25pX2VuX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgZXBvbl9uaV9lbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBlcG9uX25pX2VuLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRVBPTl9OSV9FTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmlfZW4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX25pLCBlcG9uX25pX2VuKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIGVwb25fbmlfZW4pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yZWdpc3RyYXRpb25fYmVoYXZpb3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9yZWdpc3RyYXRpb25fYmVoYXZpb3IgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3JlZ2lzdHJhdGlvbl9iZWhhdmlvcikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIHJlZ2lzdHJhdGlvbl9iZWhhdmlvciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCByZWdpc3RyYXRpb25fYmVoYXZpb3IsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9SRUdJU1RSQVRJT05fQkVIQVZJT1IsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyZWdpc3RyYXRpb25fYmVoYXZpb3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX25pLCByZWdpc3RyYXRpb25fYmVoYXZpb3IpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgcmVnaXN0cmF0aW9uX2JlaGF2aW9yKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubXR1XzFnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MTZfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIG10dV8xZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBtdHVfMWcsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9NVFVfMUcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtdHVfMWciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX25pLCBtdHVfMWcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgbXR1XzFnKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubXR1XzEwZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDE2X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBtdHVfMTBnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIG10dV8xMGcsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9NVFVfMTBHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXR1XzEwZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIG10dV8xMGcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgbXR1XzEwZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm1pbmltdW1fZmliZXJfbGVuZ3RoIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfbWV0ZXJzIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9tZXRlcnMpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIG1pbmltdW1fZmliZXJfbGVuZ3RoLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIG1pbmltdW1fZmliZXJfbGVuZ3RoLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTUlOSU1VTV9GSUJFUl9MRU5HVEgsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtaW5pbXVtX2ZpYmVyX2xlbmd0aCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIG1pbmltdW1fZmliZXJfbGVuZ3RoKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIG1pbmltdW1fZmliZXJfbGVuZ3RoKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubWF4aW11bV9maWJlcl9sZW5ndGgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9tZXRlcnMgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X21ldGVycykgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgbWF4aW11bV9maWJlcl9sZW5ndGgsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgbWF4aW11bV9maWJlcl9sZW5ndGgsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9NQVhJTVVNX0ZJQkVSX0xFTkdUSCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1heGltdW1fZmliZXJfbGVuZ3RoIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgbWF4aW11bV9maWJlcl9sZW5ndGgpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgbWF4aW11bV9maWJlcl9sZW5ndGgpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5ncmFudF9zcGFjaW5nX3RxIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdGltZV9xdWFudGEgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBncmFudF9zcGFjaW5nX3RxLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIGdyYW50X3NwYWNpbmdfdHEsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9HUkFOVF9TUEFDSU5HX1RRLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ3JhbnRfc3BhY2luZ190cSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIGdyYW50X3NwYWNpbmdfdHEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgZ3JhbnRfc3BhY2luZ190cSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fbG9naWNhbF9saW5rX29wdGlvbnMgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucy5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucy5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUgPSAoYmNtb2x0X21wY3BfZ2F0ZV9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUucmVnaXN0cmF0aW9uX2dhdGVfbW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHZhbC5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVBDUF9HQVRFX01PREVfVEVLTk9WVVM6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVwb25fbG9naWNhbF9saW5rX29wdGlvbnMucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS5yZWdfYWNrX3RpbWVvdXRfbXMiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLnUudGVrbm92dXMucmVnX2Fja190aW1lb3V0X21zID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVwb25fbG9naWNhbF9saW5rX29wdGlvbnMucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS5yZWdfYWNrX3RpbWVvdXRfbXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01QQ1BfR0FURV9NT0RFX0NVU1RPTToKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmVwb25fbG9naWNhbF9saW5rX29wdGlvbnMucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS5nYXRlcy4iKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaTA7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS51LmN1c3RvbS5nYXRlcy52YWwgPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIGNsaV9wYXJtLT5hcnJheV9zaXplICogc2l6ZW9mKCp2YWwucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS51LmN1c3RvbS5nYXRlcy52YWwpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS51LmN1c3RvbS5nYXRlcy52YWwgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLnUuY3VzdG9tLmdhdGVzLmxlbiA9IGNsaV9wYXJtLT5hcnJheV9zaXplOworICAgICAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucy5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLmdhdGVzLmZsYWdzIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gdmFsLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUudS5jdXN0b20uZ2F0ZXMubGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUuZ2F0ZXMuZmxhZ3MgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB2YWwucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS51LmN1c3RvbS5nYXRlcy5sZW47IGkwKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS51LmN1c3RvbS5nYXRlcy52YWxbaTBdLmZsYWdzID0gKGJjbW9sdF9tcGNwX3JlZ2lzdHJhdGlvbl9nYXRlX2ZsYWdzKSBjbGlfcGFybS0+dmFsdWVzW2kwXS5lbnVtX3ZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVwb25fbG9naWNhbF9saW5rX29wdGlvbnMucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS5nYXRlcy5kZWxheV9iZWZvcmVfbXMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSB2YWwucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS51LmN1c3RvbS5nYXRlcy5sZW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVwb25fbG9naWNhbF9saW5rX29wdGlvbnMucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS5nYXRlcy5kZWxheV9iZWZvcmVfbXMgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB2YWwucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS51LmN1c3RvbS5nYXRlcy5sZW47IGkwKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwucmVnaXN0cmF0aW9uX2dhdGVfbW9kZS51LmN1c3RvbS5nYXRlcy52YWxbaTBdLmRlbGF5X2JlZm9yZV9tcyA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUuZ2F0ZXMuZ2F0ZV9zaXplX3RxIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gdmFsLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUudS5jdXN0b20uZ2F0ZXMubGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUuZ2F0ZXMuZ2F0ZV9zaXplX3RxIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdmFsLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUudS5jdXN0b20uZ2F0ZXMubGVuOyBpMCsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUudS5jdXN0b20uZ2F0ZXMudmFsW2kwXS5nYXRlX3NpemVfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucy5yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLmdhdGVzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLnJlZ2lzdHJhdGlvbl9nYXRlX21vZGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucy5yZXBvcnRpbmdfbW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJlcG9ydGluZ19tb2RlID0gKGJjbW9sdF9lcG9uX2RiYV9yZXBvcnRpbmdfbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLnJlcG9ydGluZ19tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVwb25fbG9naWNhbF9saW5rX29wdGlvbnMubWF4X2xpbmtzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWF4X2xpbmtzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVwb25fbG9naWNhbF9saW5rX29wdGlvbnMubWF4X2xpbmtzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9FUE9OX0xPR0lDQUxfTElOS19PUFRJT05TLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbG9naWNhbF9saW5rX29wdGlvbnMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX25pLCBlcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIGVwb25fbG9naWNhbF9saW5rX29wdGlvbnMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5tcGNwX2Rpc2NvdmVyeV9wZXJpb2RfbXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgbXBjcF9kaXNjb3ZlcnlfcGVyaW9kX21zLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIG1wY3BfZGlzY292ZXJ5X3BlcmlvZF9tcywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01QQ1BfRElTQ09WRVJZX1BFUklPRF9NUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1wY3BfZGlzY292ZXJ5X3BlcmlvZF9tcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIG1wY3BfZGlzY292ZXJ5X3BlcmlvZF9tcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX25pLCBtcGNwX2Rpc2NvdmVyeV9wZXJpb2RfbXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9uaV9hbGFybV9zdGF0ZSB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLm5vX3JlcG9ydHMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5ub19yZXBvcnRzID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxhcm1fc3RhdGUubm9fcmVwb3J0cyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIGFsYXJtX3N0YXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbmlfYWxhcm1fc3RhdGUgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FMQVJNX1NUQVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgYWxhcm1fc3RhdGUsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGFybV9zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIGFsYXJtX3N0YXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIGFsYXJtX3N0YXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxsX2xpbmtzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9tYXhfMjA0OCB2YWwgPSB7IH07CisgICAgICAgIGludDMyX3QgaTE7CisgICAgICAgIHZhbC52YWwgPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIGNsaV9wYXJtLT5hcnJheV9zaXplICogc2l6ZW9mKCp2YWwudmFsKSk7CisgICAgICAgIGlmICh2YWwudmFsID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICB9CisKKyAgICAgICAgdmFsLmxlbiA9IGNsaV9wYXJtLT5hcnJheV9zaXplOworICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB2YWwubGVuOyBpMSsrKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudmFsW2kxXSA9IGNsaV9wYXJtLT52YWx1ZXNbaTFdLm1hYzsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgYWxsX2xpbmtzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfbWF4XzIwNDggdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FMTF9MSU5LUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIGFsbF9saW5rcywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsbF9saW5rcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIGFsbF9saW5rcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX25pLCBhbGxfbGlua3MpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuZW5jcnlwdGlvbl9jZmcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9uaV9lbmNyeXB0aW9uX2NmZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVuY3J5cHRpb25fY2ZnLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9tb2RlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZG93bnN0cmVhbV9lbmNyeXB0aW9uX21vZGUgPSAoYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVuY3J5cHRpb25fY2ZnLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVuY3J5cHRpb25fY2ZnLnVwc3RyZWFtX2VuY3J5cHRpb25fbW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnVwc3RyZWFtX2VuY3J5cHRpb25fbW9kZSA9IChiY21vbHRfZXBvbl9lbmNyeXB0aW9uX21vZGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZW5jcnlwdGlvbl9jZmcudXBzdHJlYW1fZW5jcnlwdGlvbl9tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgZW5jcnlwdGlvbl9jZmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9uaV9lbmNyeXB0aW9uX2NmZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRU5DUllQVElPTl9DRkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBlbmNyeXB0aW9uX2NmZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuY3J5cHRpb25fY2ZnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgZW5jcnlwdGlvbl9jZmcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgZW5jcnlwdGlvbl9jZmcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY29uZmlndXJhdGlvbiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5wcm90ZWN0aW9uX3R5cGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wcm90ZWN0aW9uX3R5cGUgPSAoYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcucHJvdGVjdGlvbl90eXBlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5wcm90ZWN0aW9uX3N3aXRjaGluZ19vcHRpb25zIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucHJvdGVjdGlvbl9zd2l0Y2hpbmdfb3B0aW9ucyA9IChiY21vbHRfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGV0ZWN0aW9uX29wdGlvbnMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLnByb3RlY3Rpb25fc3dpdGNoaW5nX29wdGlvbnMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLnJlcmFuZ2Vfb3B0aW9ucyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJlcmFuZ2Vfb3B0aW9ucyA9IChiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19yZXJhbmdpbmdfb3B0aW9ucykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcucmVyYW5nZV9vcHRpb25zIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5yZXJhbmdlX2F0dGVtcHRzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmVyYW5nZV9hdHRlbXB0cyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcucmVyYW5nZV9hdHRlbXB0cyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcucmVyYW5nZV9pbnRlcnZhbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJlcmFuZ2VfaW50ZXJ2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLnJlcmFuZ2VfaW50ZXJ2YWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLnN5bmNfZ2F0ZV9kdXJhdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnN5bmNfZ2F0ZV9kdXJhdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcuc3luY19nYXRlX2R1cmF0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5ncGlvX2lucHV0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZ3Bpb19pbnB1dCA9IChiY21vbHRfZ3Bpb19waW4pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLmdwaW9faW5wdXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLmdwaW9faW5wdXRfcG9sYXJpdHkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5ncGlvX2lucHV0X3BvbGFyaXR5ID0gKGJjbW9sdF9ncGlvX3BvbGFyaXR5KSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5ncGlvX2lucHV0X3BvbGFyaXR5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZy5ncGlvX291dHB1dCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmdwaW9fb3V0cHV0ID0gKGJjbW9sdF9ncGlvX3BpbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcuZ3Bpb19vdXRwdXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLmdwaW9fb3V0cHV0X3BvbGFyaXR5Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZ3Bpb19vdXRwdXRfcG9sYXJpdHkgPSAoYmNtb2x0X2dwaW9fcG9sYXJpdHkpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLmdwaW9fb3V0cHV0X3BvbGFyaXR5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY29uZmlndXJhdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfQ0ZHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5jbG9ja190cmFuc3BvcnRfY2ZnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X2NvbmZpZ3VyYXRpb24gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5jbG9ja190cmFuc3BvcnRfY2ZnLmVwb25fY2xvY2tfdHJhbnNwb3J0X21vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5lcG9uX2Nsb2NrX3RyYW5zcG9ydF9tb2RlID0gKGJjbW9sdF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmNsb2NrX3RyYW5zcG9ydF9jZmcuZXBvbl9jbG9ja190cmFuc3BvcnRfbW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIGNsb2NrX3RyYW5zcG9ydF9jZmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfY29uZmlndXJhdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQ0xPQ0tfVFJBTlNQT1JUX0NGRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIGNsb2NrX3RyYW5zcG9ydF9jZmcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjbG9ja190cmFuc3BvcnRfY2ZnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgY2xvY2tfdHJhbnNwb3J0X2NmZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX25pLCBjbG9ja190cmFuc3BvcnRfY2ZnKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmRyb3Bkb3duX3dlaWdodHMuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYXJyX3UxNl83IHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZHJvcGRvd25fd2VpZ2h0cy5hcnIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgaTI7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXJyYXkgZmlsdGVyLmRyb3Bkb3duX3dlaWdodHMuYXJyIG11c3QgaGF2ZSA3IGVsZW1lbnRzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCA3OyBpMisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5hcnJbaTJdID0gY2xpX3Bhcm0tPnZhbHVlc1tpMl0udW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZHJvcGRvd25fd2VpZ2h0cy5hcnIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBkcm9wZG93bl93ZWlnaHRzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Fycl91MTZfNyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRFJPUERPV05fV0VJR0hUUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIGRyb3Bkb3duX3dlaWdodHMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkcm9wZG93bl93ZWlnaHRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgZHJvcGRvd25fd2VpZ2h0cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX25pLCBkcm9wZG93bl93ZWlnaHRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmFwcHJveGltYXRlX3NvbGljaXRlZF91c2FnZS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hcnJfYm91bmRzXzggdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuYXBwcm94aW1hdGVfc29saWNpdGVkX3VzYWdlLmFyci4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgaTM7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gOCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXJyYXkgZmlsdGVyLmFwcHJveGltYXRlX3NvbGljaXRlZF91c2FnZS5hcnIgbXVzdCBoYXZlIDggZWxlbWVudHNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFwcHJveGltYXRlX3NvbGljaXRlZF91c2FnZS5hcnIuYmVzdF9jYXNlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gOCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYXBwcm94aW1hdGVfc29saWNpdGVkX3VzYWdlLmFyci5iZXN0X2Nhc2UgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkzID0gMDsgaTMgPCA4OyBpMysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpM10uYmVzdF9jYXNlID0gY2xpX3Bhcm0tPnZhbHVlc1tpM10udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFwcHJveGltYXRlX3NvbGljaXRlZF91c2FnZS5hcnIud29yc3RfY2FzZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFwcHJveGltYXRlX3NvbGljaXRlZF91c2FnZS5hcnIud29yc3RfY2FzZSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IDg7IGkzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kzXS53b3JzdF9jYXNlID0gY2xpX3Bhcm0tPnZhbHVlc1tpM10udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFwcHJveGltYXRlX3NvbGljaXRlZF91c2FnZS5hcnIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBhcHByb3hpbWF0ZV9zb2xpY2l0ZWRfdXNhZ2UsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYXJyX2JvdW5kc184IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9BUFBST1hJTUFURV9TT0xJQ0lURURfVVNBR0UsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBhcHByb3hpbWF0ZV9zb2xpY2l0ZWRfdXNhZ2UsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhcHByb3hpbWF0ZV9zb2xpY2l0ZWRfdXNhZ2UiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX25pLCBhcHByb3hpbWF0ZV9zb2xpY2l0ZWRfdXNhZ2UpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgYXBwcm94aW1hdGVfc29saWNpdGVkX3VzYWdlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYXBwcm94aW1hdGVfdGRtX3VzYWdlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIGFwcHJveGltYXRlX3RkbV91c2FnZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBhcHByb3hpbWF0ZV90ZG1fdXNhZ2UsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9BUFBST1hJTUFURV9URE1fVVNBR0UsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhcHByb3hpbWF0ZV90ZG1fdXNhZ2UiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX25pLCBhcHByb3hpbWF0ZV90ZG1fdXNhZ2UpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgYXBwcm94aW1hdGVfdGRtX3VzYWdlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubm9fcmVwb3J0c19zb2FrX3RpbWUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgbm9fcmVwb3J0c19zb2FrX3RpbWUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgbm9fcmVwb3J0c19zb2FrX3RpbWUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9OT19SRVBPUlRTX1NPQUtfVElNRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm5vX3JlcG9ydHNfc29ha190aW1lIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgbm9fcmVwb3J0c19zb2FrX3RpbWUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgbm9fcmVwb3J0c19zb2FrX3RpbWUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucG9uX2FnZ3JlZ2F0ZV9zaGFwZXIuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcG9uX2FnZ3JlZ2F0ZV9zaGFwZXIgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wb25fYWdncmVnYXRlX3NoYXBlci5iYW5kd2lkdGhfa2JwcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmJhbmR3aWR0aF9rYnBzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnBvbl9hZ2dyZWdhdGVfc2hhcGVyLmJhbmR3aWR0aF9rYnBzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnBvbl9hZ2dyZWdhdGVfc2hhcGVyLm1ic19rQiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1ic19rQiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wb25fYWdncmVnYXRlX3NoYXBlci5tYnNfa0IgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBwb25fYWdncmVnYXRlX3NoYXBlciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wb25fYWdncmVnYXRlX3NoYXBlciB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfUE9OX0FHR1JFR0FURV9TSEFQRVIsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBwb25fYWdncmVnYXRlX3NoYXBlciwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9hZ2dyZWdhdGVfc2hhcGVyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgcG9uX2FnZ3JlZ2F0ZV9zaGFwZXIpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgcG9uX2FnZ3JlZ2F0ZV9zaGFwZXIpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuZXN0aW1hdGVkX3Bvbl9sYXRlbmN5X3RxLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Fycl9ib3VuZHNfOCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5lc3RpbWF0ZWRfcG9uX2xhdGVuY3lfdHEuYXJyLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBpNDsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhcnJheSBmaWx0ZXIuZXN0aW1hdGVkX3Bvbl9sYXRlbmN5X3RxLmFyciBtdXN0IGhhdmUgOCBlbGVtZW50c1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZXN0aW1hdGVkX3Bvbl9sYXRlbmN5X3RxLmFyci5iZXN0X2Nhc2UiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lc3RpbWF0ZWRfcG9uX2xhdGVuY3lfdHEuYXJyLmJlc3RfY2FzZSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTQgPSAwOyBpNCA8IDg7IGk0KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2k0XS5iZXN0X2Nhc2UgPSBjbGlfcGFybS0+dmFsdWVzW2k0XS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZXN0aW1hdGVkX3Bvbl9sYXRlbmN5X3RxLmFyci53b3JzdF9jYXNlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gOCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZXN0aW1hdGVkX3Bvbl9sYXRlbmN5X3RxLmFyci53b3JzdF9jYXNlIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNCA9IDA7IGk0IDwgODsgaTQrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTRdLndvcnN0X2Nhc2UgPSBjbGlfcGFybS0+dmFsdWVzW2k0XS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZXN0aW1hdGVkX3Bvbl9sYXRlbmN5X3RxLmFyciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIGVzdGltYXRlZF9wb25fbGF0ZW5jeV90cSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9hcnJfYm91bmRzXzggdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0VTVElNQVRFRF9QT05fTEFURU5DWV9UUSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIGVzdGltYXRlZF9wb25fbGF0ZW5jeV90cSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVzdGltYXRlZF9wb25fbGF0ZW5jeV90cSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIGVzdGltYXRlZF9wb25fbGF0ZW5jeV90cSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX25pLCBlc3RpbWF0ZWRfcG9uX2xhdGVuY3lfdHEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLm9hbV9leHRlbnNpb25fdHlwZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm9hbV9leHRlbnNpb25fdHlwZSA9IChiY21vbHRfZXBvbl9vYW1fZXh0ZW5zaW9uX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLm9hbV9leHRlbnNpb25fdHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKHZhbC5vYW1fZXh0ZW5zaW9uX3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VYVEVOU0lPTl9UWVBFX1JFU0VSVkVEOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfQlJPQURDT006CisgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLnJlc3BvbnNlX3RpbWVvdXRfbXMiKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC51LmJyb2FkY29tLnJlc3BvbnNlX3RpbWVvdXRfbXMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMucmVzcG9uc2VfdGltZW91dF9tcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FWFRFTlNJT05fVFlQRV9DVEM6CisgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLnJlc3BvbnNlX3RpbWVvdXRfbXMiKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC51LmN0Yy5yZXNwb25zZV90aW1lb3V0X21zID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLnJlc3BvbnNlX3RpbWVvdXRfbXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfREFTQU46CisgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLnJlc3BvbnNlX3RpbWVvdXRfbXMiKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC51LmRhc2FuLnJlc3BvbnNlX3RpbWVvdXRfbXMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMucmVzcG9uc2VfdGltZW91dF9tcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FWFRFTlNJT05fVFlQRV9LVDoKKyAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMucmVzcG9uc2VfdGltZW91dF9tcyIpOworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLnUua3QucmVzcG9uc2VfdGltZW91dF9tcyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9udV91cGdyYWRlX3BhcmFtcy5yZXNwb25zZV90aW1lb3V0X21zIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VYVEVOU0lPTl9UWVBFX0RQT0U6CisgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLnJlc3BvbnNlX3RpbWVvdXRfbXMiKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC51LmRwb2UucmVzcG9uc2VfdGltZW91dF9tcyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9udV91cGdyYWRlX3BhcmFtcy5yZXNwb25zZV90aW1lb3V0X21zIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9udV91cGdyYWRlX3BhcmFtcy5ibG9ja19zaXplIik7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwudS5kcG9lLmJsb2NrX3NpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMuYmxvY2tfc2l6ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMuZmluYWxfYWNrX3Jlc3BvbnNlX3RpbWVvdXQiKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC51LmRwb2UuZmluYWxfYWNrX3Jlc3BvbnNlX3RpbWVvdXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMuZmluYWxfYWNrX3Jlc3BvbnNlX3RpbWVvdXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIG9udV91cGdyYWRlX3BhcmFtcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtcyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfT05VX1VQR1JBREVfUEFSQU1TLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgb251X3VwZ3JhZGVfcGFyYW1zLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3VwZ3JhZGVfcGFyYW1zIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgb251X3VwZ3JhZGVfcGFyYW1zKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIG9udV91cGdyYWRlX3BhcmFtcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmF1dG9fcm9ndWVfZGV0ZWN0XzEwZ19lbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgYXV0b19yb2d1ZV9kZXRlY3RfMTBnX2VuLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fbmksIGF1dG9fcm9ndWVfZGV0ZWN0XzEwZ19lbiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FVVE9fUk9HVUVfREVURUNUXzEwR19FTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImF1dG9fcm9ndWVfZGV0ZWN0XzEwZ19lbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIGF1dG9fcm9ndWVfZGV0ZWN0XzEwZ19lbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX25pLCBhdXRvX3JvZ3VlX2RldGVjdF8xMGdfZW4pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hdXRvX3JvZ3VlX2RldGVjdF8xZ19lbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgYXV0b19yb2d1ZV9kZXRlY3RfMWdfZW4sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgYXV0b19yb2d1ZV9kZXRlY3RfMWdfZW4sICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0NGR19JRF9BVVRPX1JPR1VFX0RFVEVDVF8xR19FTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImF1dG9fcm9ndWVfZGV0ZWN0XzFnX2VuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgYXV0b19yb2d1ZV9kZXRlY3RfMWdfZW4pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgYXV0b19yb2d1ZV9kZXRlY3RfMWdfZW4pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hdXRvX3JvZ3VlX2RldGVjdF8xMGdfdGhyZXNob2xkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9uaSwgYXV0b19yb2d1ZV9kZXRlY3RfMTBnX3RocmVzaG9sZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX25pLCBhdXRvX3JvZ3VlX2RldGVjdF8xMGdfdGhyZXNob2xkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQVVUT19ST0dVRV9ERVRFQ1RfMTBHX1RIUkVTSE9MRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImF1dG9fcm9ndWVfZGV0ZWN0XzEwZ190aHJlc2hvbGQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX25pLCBhdXRvX3JvZ3VlX2RldGVjdF8xMGdfdGhyZXNob2xkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIGF1dG9fcm9ndWVfZGV0ZWN0XzEwZ190aHJlc2hvbGQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbmksIG1hY19hZGRyZXNzKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9uaSwgZXBvbl9uaV9lbikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbmksIHJlZ2lzdHJhdGlvbl9iZWhhdmlvcikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbmksIG10dV8xZykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbmksIG10dV8xMGcpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX25pLCBtaW5pbXVtX2ZpYmVyX2xlbmd0aCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbmksIG1heGltdW1fZmliZXJfbGVuZ3RoKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9uaSwgZ3JhbnRfc3BhY2luZ190cSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbmksIGVwb25fbG9naWNhbF9saW5rX29wdGlvbnMpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX25pLCBtcGNwX2Rpc2NvdmVyeV9wZXJpb2RfbXMpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX25pLCBhbGFybV9zdGF0ZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbmksIGFsbF9saW5rcykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbmksIGVuY3J5cHRpb25fY2ZnKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9uaSwgY2xvY2tfdHJhbnNwb3J0X2NmZykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbmksIGRyb3Bkb3duX3dlaWdodHMpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX25pLCBhcHByb3hpbWF0ZV9zb2xpY2l0ZWRfdXNhZ2UpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX25pLCBhcHByb3hpbWF0ZV90ZG1fdXNhZ2UpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX25pLCBub19yZXBvcnRzX3NvYWtfdGltZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fbmksIHBvbl9hZ2dyZWdhdGVfc2hhcGVyKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9uaSwgZXN0aW1hdGVkX3Bvbl9sYXRlbmN5X3RxKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9uaSwgb251X3VwZ3JhZGVfcGFyYW1zKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9uaSwgYXV0b19yb2d1ZV9kZXRlY3RfMTBnX2VuKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9uaSwgYXV0b19yb2d1ZV9kZXRlY3RfMWdfZW4pICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX25pLCBhdXRvX3JvZ3VlX2RldGVjdF8xMGdfdGhyZXNob2xkKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fbmksIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9uaSwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX25pX29wZXJfc2V0X2Vwb25fbmlfZW5fc3RhdGVfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlIG9wZXI7ICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX25pX2tleSBrZXkgPSB7IH07ICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGUgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9OSV9LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBlcG9uX25pLCBzZXRfZXBvbl9uaV9lbl9zdGF0ZSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBlcG9uX25pLCBzZXRfZXBvbl9uaV9lbl9zdGF0ZSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJuZXdfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX25pX2VuX3N0YXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9lcG9uX25pX2VuX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBlcG9uX25pLCBzZXRfZXBvbl9uaV9lbl9zdGF0ZSwgbmV3X3N0YXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZXBvbl9uaSwgc2V0X2Vwb25fbmlfZW5fc3RhdGUsIG5ld19zdGF0ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9FUE9OX05JX09QRVJfSURfU0VUX0VQT05fTklfRU5fU1RBVEUsIEJDTU9MVF9FUE9OX05JX1NFVF9FUE9OX05JX0VOX1NUQVRFX0lEX05FV19TVEFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fbmlfb3Blcl9pc3N1ZV9yc3NpX2dyYW50X3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50IG9wZXI7ICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX25pX2tleSBrZXkgPSB7IH07ICAgICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50IG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fTklfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZXBvbl9uaSwgaXNzdWVfcnNzaV9ncmFudCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBlcG9uX25pLCBpc3N1ZV9yc3NpX2dyYW50LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdyYW50ZWRfbGluayIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubWFjOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZXBvbl9uaSwgaXNzdWVfcnNzaV9ncmFudCwgZ3JhbnRlZF9saW5rLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZXBvbl9uaSwgaXNzdWVfcnNzaV9ncmFudCwgZ3JhbnRlZF9saW5rLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9JU1NVRV9SU1NJX0dSQU5ULCBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX0dSQU5URURfTElOSywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRyaWdnZXJfd2lkdGgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBlcG9uX25pLCBpc3N1ZV9yc3NpX2dyYW50LCB0cmlnZ2VyX3dpZHRoLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZXBvbl9uaSwgaXNzdWVfcnNzaV9ncmFudCwgdHJpZ2dlcl93aWR0aCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9FUE9OX05JX09QRVJfSURfSVNTVUVfUlNTSV9HUkFOVCwgQkNNT0xUX0VQT05fTklfSVNTVUVfUlNTSV9HUkFOVF9JRF9UUklHR0VSX1dJRFRILCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHJpZ2dlcl9kZWxheSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDE2X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGVwb25fbmksIGlzc3VlX3Jzc2lfZ3JhbnQsIHRyaWdnZXJfZGVsYXksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBlcG9uX25pLCBpc3N1ZV9yc3NpX2dyYW50LCB0cmlnZ2VyX2RlbGF5LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9JU1NVRV9SU1NJX0dSQU5ULCBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX1RSSUdHRVJfREVMQVksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzYW1wbGVfcGVyaW9kIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MTZfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZXBvbl9uaSwgaXNzdWVfcnNzaV9ncmFudCwgc2FtcGxlX3BlcmlvZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGVwb25fbmksIGlzc3VlX3Jzc2lfZ3JhbnQsIHNhbXBsZV9wZXJpb2QsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX0lTU1VFX1JTU0lfR1JBTlQsIEJDTU9MVF9FUE9OX05JX0lTU1VFX1JTU0lfR1JBTlRfSURfU0FNUExFX1BFUklPRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fbmlfb3Blcl9hZGRfbGlua19zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmsgb3BlcjsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fbmlfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9uaV9hZGRfbGluayBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX05JX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGVwb25fbmksIGFkZF9saW5rLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGVwb25fbmksIGFkZF9saW5rLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19tYWNfYWRkcmVzcyB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5tYWM7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBlcG9uX25pLCBhZGRfbGluaywgbWFjX2FkZHJlc3MsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBlcG9uX25pLCBhZGRfbGluaywgbWFjX2FkZHJlc3MsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX0FERF9MSU5LLCBCQ01PTFRfRVBPTl9OSV9BRERfTElOS19JRF9NQUNfQUREUkVTUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX2xpbmtfcmF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZXBvbl9saW5rX3JhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGVwb25fbmksIGFkZF9saW5rLCByYXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZXBvbl9uaSwgYWRkX2xpbmssIHJhdGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX0FERF9MSU5LLCBCQ01PTFRfRVBPTl9OSV9BRERfTElOS19JRF9SQVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9uaV9vcGVyX2FkZF9tdWx0aWNhc3RfbGlua19zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rIG9wZXI7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9uaV9rZXkga2V5ID0geyB9OyAgICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fTklfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZXBvbl9uaSwgYWRkX211bHRpY2FzdF9saW5rLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGVwb25fbmksIGFkZF9tdWx0aWNhc3RfbGluaywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubWFjOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZXBvbl9uaSwgYWRkX211bHRpY2FzdF9saW5rLCBtYWNfYWRkcmVzcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGVwb25fbmksIGFkZF9tdWx0aWNhc3RfbGluaywgbWFjX2FkZHJlc3MsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX0FERF9NVUxUSUNBU1RfTElOSywgQkNNT0xUX0VQT05fTklfQUREX01VTFRJQ0FTVF9MSU5LX0lEX01BQ19BRERSRVNTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fbGlua19yYXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9lcG9uX2xpbmtfcmF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZXBvbl9uaSwgYWRkX211bHRpY2FzdF9saW5rLCByYXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZXBvbl9uaSwgYWRkX211bHRpY2FzdF9saW5rLCByYXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9BRERfTVVMVElDQVNUX0xJTkssIEJDTU9MVF9FUE9OX05JX0FERF9NVUxUSUNBU1RfTElOS19JRF9SQVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9uaV9vcGVyX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGluayBvcGVyOyAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fbmlfa2V5IGtleSA9IHsgfTsgICAgICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmsgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9OSV9LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBlcG9uX25pLCBhZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGluaywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBlcG9uX25pLCBhZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGluaywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubWFjOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZXBvbl9uaSwgYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmssIG1hY19hZGRyZXNzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZXBvbl9uaSwgYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmssIG1hY19hZGRyZXNzLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9BRERfUFJPVEVDVEVEX1NUQU5EQllfTElOSywgQkNNT0xUX0VQT05fTklfQUREX1BST1RFQ1RFRF9TVEFOREJZX0xJTktfSURfTUFDX0FERFJFU1MsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAid29ya2luZ19saW5rX2luZm8uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9saW5rX2luZm8gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIndvcmtpbmdfbGlua19pbmZvLmxpbmtfc3RhdHVzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubGlua19zdGF0dXMgPSAoYmNtb2x0X2Vwb25fbGlua19zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ3b3JraW5nX2xpbmtfaW5mby5saW5rX3N0YXR1cyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIndvcmtpbmdfbGlua19pbmZvLnJhdGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5yYXRlID0gKGJjbW9sdF9lcG9uX2xpbmtfcmF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIndvcmtpbmdfbGlua19pbmZvLnJhdGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ3b3JraW5nX2xpbmtfaW5mby5sbGlkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubGxpZCA9IChiY21vbHRfZXBvbl9sbGlkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ3b3JraW5nX2xpbmtfaW5mby5sbGlkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAid29ya2luZ19saW5rX2luZm8ubXBjcF9kaXNjb3ZlcnlfaW5mbyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1wY3BfZGlzY292ZXJ5X2luZm8gPSAoYmNtb2x0X21wY3BfZGlzY292ZXJ5X2luZm8pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ3b3JraW5nX2xpbmtfaW5mby5tcGNwX2Rpc2NvdmVyeV9pbmZvIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAid29ya2luZ19saW5rX2luZm8ub251X2xhc2VyX29uX3RpbWVfdHEiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5vbnVfbGFzZXJfb25fdGltZV90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIndvcmtpbmdfbGlua19pbmZvLm9udV9sYXNlcl9vbl90aW1lX3RxIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAid29ya2luZ19saW5rX2luZm8ub251X2xhc2VyX29mZl90aW1lX3RxIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwub251X2xhc2VyX29mZl90aW1lX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAid29ya2luZ19saW5rX2luZm8ub251X2xhc2VyX29mZl90aW1lX3RxIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAid29ya2luZ19saW5rX2luZm8ucGVuZGluZ19ncmFudHMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wZW5kaW5nX2dyYW50cyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIndvcmtpbmdfbGlua19pbmZvLnBlbmRpbmdfZ3JhbnRzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAid29ya2luZ19saW5rX2luZm8ucmFuZ2VfdmFsdWVfdHEiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5yYW5nZV92YWx1ZV90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIndvcmtpbmdfbGlua19pbmZvLnJhbmdlX3ZhbHVlX3RxIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAid29ya2luZ19saW5rX2luZm8udHVubmVsX2lkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudHVubmVsX2lkID0gKGJjbW9sdF9lcG9uX3R1bm5lbF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAid29ya2luZ19saW5rX2luZm8udHVubmVsX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBlcG9uX25pLCBhZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGluaywgd29ya2luZ19saW5rX2luZm8sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9saW5rX2luZm8gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9FUE9OX05JX09QRVJfSURfQUREX1BST1RFQ1RFRF9TVEFOREJZX0xJTkssIEJDTU9MVF9FUE9OX05JX0FERF9QUk9URUNURURfU1RBTkRCWV9MSU5LX0lEX1dPUktJTkdfTElOS19JTkZPLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBlcG9uX25pLCBhZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGluaywgd29ya2luZ19saW5rX2luZm8sIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX25pX29wZXJfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YV9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YSBvcGVyOyAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9uaV9rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGEgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9OSV9LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBlcG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGVwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGEsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmVyYW5nZV9kZWx0YSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGVwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGEsIHJlcmFuZ2VfZGVsdGEsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBlcG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhLCByZXJhbmdlX2RlbHRhLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9QUk9URUNUSU9OX1NXSVRDSElOR19BUFBMWV9SRVJBTkdFX0RFTFRBLCBCQ01PTFRfRVBPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19BUFBMWV9SRVJBTkdFX0RFTFRBX0lEX1JFUkFOR0VfREVMVEEsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX25pX29wZXJfcm9ndWVfbGxpZF9zY2FuX3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW4gb3BlcjsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX25pX2tleSBrZXkgPSB7IH07ICAgICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW4gb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9OSV9LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBlcG9uX25pLCByb2d1ZV9sbGlkX3NjYW4sIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZXBvbl9uaSwgcm9ndWVfbGxpZF9zY2FuLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZXBvbl9uaSwgcm9ndWVfbGxpZF9zY2FuLCBtb2RlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZXBvbl9uaSwgcm9ndWVfbGxpZF9zY2FuLCBtb2RlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9ST0dVRV9MTElEX1NDQU4sIEJDTU9MVF9FUE9OX05JX1JPR1VFX0xMSURfU0NBTl9JRF9NT0RFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGxpZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fbGxpZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZXBvbl9sbGlkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGVwb25fbmksIHJvZ3VlX2xsaWRfc2NhbiwgbGxpZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGVwb25fbmksIHJvZ3VlX2xsaWRfc2NhbiwgbGxpZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9FUE9OX05JX09QRVJfSURfUk9HVUVfTExJRF9TQ0FOLCBCQ01PTFRfRVBPTl9OSV9ST0dVRV9MTElEX1NDQU5fSURfTExJRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fbmlfb3Blcl9zdGFydF9vbnVfdXBncmFkZV9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZSBvcGVyOyAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX25pX2tleSBrZXkgPSB7IH07ICAgICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZSBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX05JX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGVwb25fbmksIHN0YXJ0X29udV91cGdyYWRlLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGVwb25fbmksIHN0YXJ0X29udV91cGdyYWRlLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxpc3Rfb2Zfb251X2lkcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzIgdmFsID0geyB9OworICAgICAgICBpbnQzMl90IGkwOworICAgICAgICB2YWwudmFsID0gYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCBjbGlfcGFybS0+YXJyYXlfc2l6ZSAqIHNpemVvZigqdmFsLnZhbCkpOworICAgICAgICBpZiAodmFsLnZhbCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgfQorCisgICAgICAgIHZhbC5sZW4gPSBjbGlfcGFybS0+YXJyYXlfc2l6ZTsKKyAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdmFsLmxlbjsgaTArKykKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnZhbFtpMF0gPSBjbGlfcGFybS0+dmFsdWVzW2kwXS5tYWM7CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZXBvbl9uaSwgc3RhcnRfb251X3VwZ3JhZGUsIGxpc3Rfb2Zfb251X2lkcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX1NUQVJUX09OVV9VUEdSQURFLCBCQ01PTFRfRVBPTl9OSV9TVEFSVF9PTlVfVVBHUkFERV9JRF9MSVNUX09GX09OVV9JRFMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGVwb25fbmksIHN0YXJ0X29udV91cGdyYWRlLCBsaXN0X29mX29udV9pZHMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX25pX2F1dG9fY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9uaV9hdXRvX2NmZyBhdXRvX2NmZzsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fbmlfa2V5IGtleSA9IHsgfTsgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbmlfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX2dldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZXBvbl9uaSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGVwb25fbmksIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgYXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbmksIGF1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX25pLCBhdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX25pLCBhdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGxpZF9xdWFyYW50aW5lZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbmksIGxsaWRfcXVhcmFudGluZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgbGxpZF9xdWFyYW50aW5lZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXBjcF90aW1lc3RhbXBfY2hhbmdlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbmksIG1wY3BfdGltZXN0YW1wX2NoYW5nZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgbXBjcF90aW1lc3RhbXBfY2hhbmdlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibm9fcmVwb3J0cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbmksIG5vX3JlcG9ydHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgbm9fcmVwb3J0cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3VwZ3JhZGVfY29tcGxldGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX25pLCBvbnVfdXBncmFkZV9jb21wbGV0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX25pLCBvbnVfdXBncmFkZV9jb21wbGV0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmVyYW5nZV9mYWlsdXJlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgcmVyYW5nZV9mYWlsdXJlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbmksIHJlcmFuZ2VfZmFpbHVyZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicm9ndWVfc2Nhbl9jb21wbGV0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbmksIHJvZ3VlX3NjYW5fY29tcGxldGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgcm9ndWVfc2Nhbl9jb21wbGV0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX25pLCByc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX25pLCByc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdGVfY2hhbmdlX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fbmksIHN0YXRlX2NoYW5nZV9jb21wbGV0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgYXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmUpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX25pLCBsbGlkX3F1YXJhbnRpbmVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgbXBjcF90aW1lc3RhbXBfY2hhbmdlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fbmksIG5vX3JlcG9ydHMpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX25pLCBvbnVfdXBncmFkZV9jb21wbGV0ZSkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fbmksIHJlcmFuZ2VfZmFpbHVyZSkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fbmksIHJvZ3VlX3NjYW5fY29tcGxldGUpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX25pLCByc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fbmksIHN0YXRlX2NoYW5nZV9jb21wbGV0ZWQpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX25pLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZhdXRvX2NmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9uaV9hdXRvX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fbmlfYXV0b19jZmcgYXV0b19jZmc7ICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX25pX2tleSBrZXkgPSB7IH07ICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19zZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGVwb25fbmksIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBlcG9uX25pLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImF1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbmksIGF1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgYXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX0FVVE9fUk9HVUVfU0NBTl8xMEdfRkFJTFVSRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImF1dG9fcm9ndWVfc2Nhbl8xZ19mYWlsdXJlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbmksIGF1dG9fcm9ndWVfc2Nhbl8xZ19mYWlsdXJlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX0FVVE9fUk9HVUVfU0NBTl8xR19GQUlMVVJFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGxpZF9xdWFyYW50aW5lZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbmksIGxsaWRfcXVhcmFudGluZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbmksIGxsaWRfcXVhcmFudGluZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfTExJRF9RVUFSQU5USU5FRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1wY3BfdGltZXN0YW1wX2NoYW5nZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX25pLCBtcGNwX3RpbWVzdGFtcF9jaGFuZ2VkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX25pLCBtcGNwX3RpbWVzdGFtcF9jaGFuZ2VkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX01QQ1BfVElNRVNUQU1QX0NIQU5HRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJub19yZXBvcnRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgbm9fcmVwb3J0cywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgbm9fcmVwb3J0cywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9OT19SRVBPUlRTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3VwZ3JhZGVfY29tcGxldGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX25pLCBvbnVfdXBncmFkZV9jb21wbGV0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgb251X3VwZ3JhZGVfY29tcGxldGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfT05VX1VQR1JBREVfQ09NUExFVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyZXJhbmdlX2ZhaWx1cmUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX25pLCByZXJhbmdlX2ZhaWx1cmUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fbmksIHJlcmFuZ2VfZmFpbHVyZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9SRVJBTkdFX0ZBSUxVUkUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyb2d1ZV9zY2FuX2NvbXBsZXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgcm9ndWVfc2Nhbl9jb21wbGV0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgcm9ndWVfc2Nhbl9jb21wbGV0ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9ST0dVRV9TQ0FOX0NPTVBMRVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX25pLCByc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0ZV9jaGFuZ2VfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9uaSwgc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9TVEFURV9DSEFOR0VfQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX29udV8xMGdfdXNfc3RhdF9nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0IHN0YXQ7ICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDsgICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgJ2NsZWFyIG9uIHJlYWQnIGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdCBzdGF0O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF9lcG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IGZsYWdzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2xlYXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNsZWFyX29uX3JlYWQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2xlYXIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiY2xlYXJfb25fcmVhZCA9ICVzO1xuIiwgKGNsZWFyX29uX3JlYWQpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX1NUQVRfSU5JVCgmc3RhdCwgZXBvbl9vbnVfMTBnX3VzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0lOSVQoJnN0YXQsIGVwb25fb251XzEwZ191cywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmZWNfY29kZV93b3Jkc190b3RhbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xMGdfdXMsIGZlY19jb2RlX3dvcmRzX3RvdGFsKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xMGdfdXMsIGZlY19jb2RlX3dvcmRzX3RvdGFsKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmZWNfY29kZV93b3Jkc19kZWNvZGVfZmFpbHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9vbnVfMTBnX3VzLCBmZWNfY29kZV93b3Jkc19kZWNvZGVfZmFpbHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fb251XzEwZ191cywgZmVjX2NvZGVfd29yZHNfZGVjb2RlX2ZhaWxzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmZWNfemVyb2VzX2NvcnJlY3RlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xMGdfdXMsIGZlY196ZXJvZXNfY29ycmVjdGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xMGdfdXMsIGZlY196ZXJvZXNfY29ycmVjdGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmZWNfb25lc19jb3JyZWN0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9vbnVfMTBnX3VzLCBmZWNfb25lc19jb3JyZWN0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fb251XzEwZ191cywgZmVjX29uZXNfY29ycmVjdGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9vbnVfMTBnX3VzLCBmZWNfY29kZV93b3Jkc190b3RhbCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX29udV8xMGdfdXMsIGZlY19jb2RlX3dvcmRzX2RlY29kZV9mYWlscykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX29udV8xMGdfdXMsIGZlY196ZXJvZXNfY29ycmVjdGVkKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fb251XzEwZ191cywgZmVjX29uZXNfY29ycmVjdGVkKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xMGdfdXMsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fb251XzEwZ191cywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9nZXQoZGV2aWNlX2lkLCAmc3RhdC5oZHIsIGNsZWFyX29uX3JlYWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZzdGF0Lmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXQuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fb251XzEwZ191c19jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIHVpbnQ4X3QgKmxpc3RfbWVtOyAgICAgICAgICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgbWVtb3J5IGJ1ZmZlciBmb3IgdmFyaWFibGUtc2l6ZWQgbGlzdHMgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50OF90KiBsaXN0X21lbTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fT05VXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X2Vwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkub251X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fT05VXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfS0VZX0lEX09OVV9JRCwgJmtleS5vbnVfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX29udV8xMGdfdXMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fb251XzEwZ191cywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGxfbGlua3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fb251XzEwZ191cywgYWxsX2xpbmtzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9vbnVfMTBnX3VzLCBhbGxfbGlua3MpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9vbnVfMTBnX3VzLCBhbGxfbGlua3MpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX29udV8xMGdfdXMsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX29udV8xMGdfdXMsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIHNldCBtZW1vcnkgdG8gdXNlIGZvciB2YXJpYWJsZS1zaXplZCBsaXN0cyAqLworICAgIGxpc3RfbWVtID0gYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCBBUElDTElfRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFKTsKKyAgICBpZiAobGlzdF9tZW0gPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygibGlzdF9tZW0gPSBiY21vc19jYWxsb2MoQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7XG4iKTsKKyAgICBCQ01PTFRfQ0ZHX0xJU1RfQlVGX1NFVCgmY2ZnLCBlcG9uX29udV8xMGdfdXMsIGxpc3RfbWVtLCBBUElDTElfRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFKTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0xJU1RfQlVGX1NFVCgmY2ZnLCBlcG9uX29udV8xMGdfdXMsIGxpc3RfbWVtLCBBUElDTElfRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFKTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fb251XzEwZ191c19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fT05VXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X2Vwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkub251X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fT05VXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfS0VZX0lEX09OVV9JRCwgJmtleS5vbnVfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX29udV8xMGdfdXMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fb251XzEwZ191cywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX29udV8xMGdfdXNfY2ZnX2NsZWFyKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnIGNmZzsgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfY2xlYXIiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fT05VXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X2Vwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkub251X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fT05VXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfS0VZX0lEX09OVV9JRCwgJmtleS5vbnVfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX29udV8xMGdfdXMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fb251XzEwZ191cywga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fb251XzEwZ191c19jZmdfZ2V0X211bHRpKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0ID0gTlVMTDsgICAgICAgICAvKio8IGRlY2xhcmUgbWVzc2FnZSBzZXQgKi8KKyAgICB1aW50MzJfdCBtYXhfbXNnczsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGZpbHRlciBpbnZlcnQgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0KiBtc2dfc2V0ID0gTlVMTDtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQzMl90IG1heF9tc2dzO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldF9tdWx0aSIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMTBHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fT05VXzEwR19VU19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm9udV9pZCA9IChiY21vbHRfZXBvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5vbnVfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMTBHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fT05VXzEwR19VU19LRVlfSURfT05VX0lELCAma2V5Lm9udV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX0VQT05fT05VXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldF9hbGxvYyhCQ01PTFRfT0JKX0lEX0VQT05fT05VXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9vbnVfMTBnX3VzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX29udV8xMGdfdXMsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsbF9saW5rcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfbWF4XzIwNDggdmFsID0geyB9OworICAgICAgICBpbnQzMl90IGkwOworICAgICAgICB2YWwudmFsID0gYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCBjbGlfcGFybS0+YXJyYXlfc2l6ZSAqIHNpemVvZigqdmFsLnZhbCkpOworICAgICAgICBpZiAodmFsLnZhbCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgfQorCisgICAgICAgIHZhbC5sZW4gPSBjbGlfcGFybS0+YXJyYXlfc2l6ZTsKKyAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdmFsLmxlbjsgaTArKykKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnZhbFtpMF0gPSBjbGlfcGFybS0+dmFsdWVzW2kwXS5tYWM7CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fb251XzEwZ191cywgYWxsX2xpbmtzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfbWF4XzIwNDggdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0NGR19JRF9BTExfTElOS1MsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX29udV8xMGdfdXMsIGFsbF9saW5rcywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsbF9saW5rcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fb251XzEwZ191cywgYWxsX2xpbmtzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fb251XzEwZ191cywgYWxsX2xpbmtzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX29udV8xMGdfdXMsIGFsbF9saW5rcykpCisgICAgeworICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX29udV8xMGdfdXMsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9vbnVfMTBnX3VzLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZyBzdGF0X2NmZzsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkga2V5ID0geyB9OyAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2lkIHN0YXRfaWQ7ICAgICAvKio8IGRlY2xhcmUgc3RhdCBJRCAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZyBzdGF0X2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fT05VXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X2Vwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkub251X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fT05VXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfS0VZX0lEX09OVV9JRCwgJmtleS5vbnVfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgc3dpdGNoIChzdGF0X2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfRkVDX0NPREVfV09SRFNfVE9UQUw6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzEwZ191cywgZmVjX2NvZGVfd29yZHNfdG90YWwsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzEwZ191cywgZmVjX2NvZGVfd29yZHNfdG90YWwsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9JRF9GRUNfQ09ERV9XT1JEU19ERUNPREVfRkFJTFM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzEwZ191cywgZmVjX2NvZGVfd29yZHNfZGVjb2RlX2ZhaWxzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xMGdfdXMsIGZlY19jb2RlX3dvcmRzX2RlY29kZV9mYWlscywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19aRVJPRVNfQ09SUkVDVEVEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xMGdfdXMsIGZlY196ZXJvZXNfY29ycmVjdGVkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xMGdfdXMsIGZlY196ZXJvZXNfY29ycmVjdGVkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfRkVDX09ORVNfQ09SUkVDVEVEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xMGdfdXMsIGZlY19vbmVzX2NvcnJlY3RlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMTBnX3VzLCBmZWNfb25lc19jb3JyZWN0ZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmc3RhdF9jZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdF9jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZyBzdGF0X2NmZzsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkga2V5ID0geyB9OyAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2lkIHN0YXRfaWQ7ICAgICAvKio8IGRlY2xhcmUgc3RhdCBJRCAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZyBzdGF0X2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fT05VXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X2Vwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkub251X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fT05VXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfS0VZX0lEX09OVV9JRCwgJmtleS5vbnVfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgc3dpdGNoIChzdGF0X2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfRkVDX0NPREVfV09SRFNfVE9UQUw6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzEwZ191cywgZmVjX2NvZGVfd29yZHNfdG90YWwsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzEwZ191cywgZmVjX2NvZGVfd29yZHNfdG90YWwsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9JRF9GRUNfQ09ERV9XT1JEU19ERUNPREVfRkFJTFM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzEwZ191cywgZmVjX2NvZGVfd29yZHNfZGVjb2RlX2ZhaWxzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xMGdfdXMsIGZlY19jb2RlX3dvcmRzX2RlY29kZV9mYWlscywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19aRVJPRVNfQ09SUkVDVEVEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xMGdfdXMsIGZlY196ZXJvZXNfY29ycmVjdGVkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xMGdfdXMsIGZlY196ZXJvZXNfY29ycmVjdGVkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfRkVDX09ORVNfQ09SUkVDVEVEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xMGdfdXMsIGZlY19vbmVzX2NvcnJlY3RlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMTBnX3VzLCBmZWNfb25lc19jb3JyZWN0ZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnR5cGUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnR5cGUgPSAoYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHZhbC50cmlnZ2VyLnR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5yaXNpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV90aHJlc2hvbGQucmlzaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5yaXNpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5mYWxsaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLmZhbGxpbmcgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmZhbGxpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9SQU5HRToKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci51cHBlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLnVwcGVyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci51cHBlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmxvd2VyIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfcmFuZ2UubG93ZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxvd2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1ZBTFVFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5saW1pdCIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS52YWx1ZV90aHJlc2hvbGQubGltaXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxpbWl0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX05PTkU6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnNvYWsuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnNvYWsuY2xlYXJfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9TVEFUX0NGR19QUk9QX1NFVCgmc3RhdF9jZmcsIGVwb25fb251XzEwZ191cywgY2ZnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMTBHX1VTLCBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfQ0ZHX0lEX0NGRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xMGdfdXMsIGNmZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0X2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnIGF1dG9fY2ZnOyAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleSBrZXkgPSB7IH07ICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfZ2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBlcG9uX29udV8xMGdfdXMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBlcG9uX29udV8xMGdfdXMsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9jbGVhcmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9vbnVfMTBnX3VzLCBzdGF0X2FsYXJtX2NsZWFyZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9vbnVfMTBnX3VzLCBzdGF0X2FsYXJtX2NsZWFyZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fcmFpc2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9vbnVfMTBnX3VzLCBzdGF0X2FsYXJtX3JhaXNlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX29udV8xMGdfdXMsIHN0YXRfYWxhcm1fcmFpc2VkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX29udV8xMGdfdXMsIHN0YXRfYWxhcm1fY2xlYXJlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fb251XzEwZ191cywgc3RhdF9hbGFybV9yYWlzZWQpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9vbnVfMTBnX3VzLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fb251XzEwZ191cywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmYXV0b19jZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZyBhdXRvX2NmZzsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkga2V5ID0geyB9OyAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX3NldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZXBvbl9vbnVfMTBnX3VzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZXBvbl9vbnVfMTBnX3VzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fY2xlYXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fb251XzEwZ191cywgc3RhdF9hbGFybV9jbGVhcmVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX29udV8xMGdfdXMsIHN0YXRfYWxhcm1fY2xlYXJlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9yYWlzZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX29udV8xMGdfdXMsIHN0YXRfYWxhcm1fcmFpc2VkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX29udV8xMGdfdXMsIHN0YXRfYWxhcm1fcmFpc2VkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fT05VXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fT05VXzEwR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9vbnVfMWdfdXNfc3RhdF9nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXQgc3RhdDsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDsgICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgJ2NsZWFyIG9uIHJlYWQnIGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0IHN0YXQ7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGNsZWFyX29uX3JlYWQ7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X2Vwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkub251X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fT05VXzFHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fT05VXzFHX1VTX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IGZsYWdzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2xlYXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNsZWFyX29uX3JlYWQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2xlYXIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiY2xlYXJfb25fcmVhZCA9ICVzO1xuIiwgKGNsZWFyX29uX3JlYWQpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX1NUQVRfSU5JVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfSU5JVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ29vZF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIGdvb2RfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgZ29vZF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdvb2RfYnl0ZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIGdvb2RfYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCBnb29kX2J5dGVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvdmVyc3pfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCBvdmVyc3pfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgb3ZlcnN6X2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibm9uX2ZlY19nb29kX2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgbm9uX2ZlY19nb29kX2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIG5vbl9mZWNfZ29vZF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm5vbl9mZWNfZ29vZF9ieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgbm9uX2ZlY19nb29kX2J5dGVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgbm9uX2ZlY19nb29kX2J5dGVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmZWNfZ29vZF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIGZlY19nb29kX2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIGZlY19nb29kX2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmVjX2dvb2RfYnl0ZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIGZlY19nb29kX2J5dGVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgZmVjX2dvb2RfYnl0ZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZlY19mcmFtZXNfZXhjX2VycnMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIGZlY19mcmFtZXNfZXhjX2VycnMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCBmZWNfZnJhbWVzX2V4Y19lcnJzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmZWNfYmxrc19ub19lcnJzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCBmZWNfYmxrc19ub19lcnJzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgZmVjX2Jsa3Nfbm9fZXJycyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmVjX2Jsa3NfY29ycl9lcnJzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCBmZWNfYmxrc19jb3JyX2VycnMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCBmZWNfYmxrc19jb3JyX2VycnMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZlY19ibGtzX3VuY29ycl9lcnJzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCBmZWNfYmxrc191bmNvcnJfZXJycyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIGZlY19ibGtzX3VuY29ycl9lcnJzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmZWNfY29ycl9ieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgZmVjX2NvcnJfYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCBmZWNfY29ycl9ieXRlcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmVjX2NvcnJfemVyb2VzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCBmZWNfY29ycl96ZXJvZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCBmZWNfY29ycl96ZXJvZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZlY19jb3JyX29uZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIGZlY19jb3JyX29uZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCBmZWNfY29ycl9vbmVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1bmRlcnN6X2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgdW5kZXJzel9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCB1bmRlcnN6X2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXJyb3Jzel9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIGVycm9yc3pfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgZXJyb3Jzel9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgZ29vZF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIGdvb2RfYnl0ZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIG92ZXJzel9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIG5vbl9mZWNfZ29vZF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIG5vbl9mZWNfZ29vZF9ieXRlcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgZmVjX2dvb2RfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCBmZWNfZ29vZF9ieXRlcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgZmVjX2ZyYW1lc19leGNfZXJycykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgZmVjX2Jsa3Nfbm9fZXJycykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgZmVjX2Jsa3NfY29ycl9lcnJzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fb251XzFnX3VzLCBmZWNfYmxrc191bmNvcnJfZXJycykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgZmVjX2NvcnJfYnl0ZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIGZlY19jb3JyX3plcm9lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgZmVjX2NvcnJfb25lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgdW5kZXJzel9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIGVycm9yc3pfZnJhbWVzKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX29udV8xZ191cywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9vbnVfMWdfdXMsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfZ2V0KGRldmljZV9pZCwgJnN0YXQuaGRyLCBjbGVhcl9vbl9yZWFkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9nZXQoZGV2aWNlX2lkLCAmc3RhdC5oZHIsIGNsZWFyX29uX3JlYWQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmc3RhdC5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0Lmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX29udV8xZ191c19jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZyBjZmc7ICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIHVpbnQ4X3QgKmxpc3RfbWVtOyAgICAgICAgICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgbWVtb3J5IGJ1ZmZlciBmb3IgdmFyaWFibGUtc2l6ZWQgbGlzdHMgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX29udV8xZ191c19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygidWludDhfdCogbGlzdF9tZW07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX09OVV8xR19VU19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm9udV9pZCA9IChiY21vbHRfZXBvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5vbnVfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfS0VZX0lEX09OVV9JRCwgJmtleS5vbnVfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX29udV8xZ191cywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9vbnVfMWdfdXMsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxsX2xpbmtzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX29udV8xZ191cywgYWxsX2xpbmtzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9vbnVfMWdfdXMsIGFsbF9saW5rcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX29udV8xZ191cywgYWxsX2xpbmtzKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9vbnVfMWdfdXMsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX29udV8xZ191cywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogc2V0IG1lbW9yeSB0byB1c2UgZm9yIHZhcmlhYmxlLXNpemVkIGxpc3RzICovCisgICAgbGlzdF9tZW0gPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIEFQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpOworICAgIGlmIChsaXN0X21lbSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJsaXN0X21lbSA9IGJjbW9zX2NhbGxvYyhBUElDTElfRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFKTtcbiIpOworICAgIEJDTU9MVF9DRkdfTElTVF9CVUZfU0VUKCZjZmcsIGVwb25fb251XzFnX3VzLCBsaXN0X21lbSwgQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19MSVNUX0JVRl9TRVQoJmNmZywgZXBvbl9vbnVfMWdfdXMsIGxpc3RfbWVtLCBBUElDTElfRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFKTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fb251XzFnX3VzX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnIGNmZzsgICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX29udV8xZ191c19rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX29udV8xZ191c19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fT05VXzFHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fT05VXzFHX1VTX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF9lcG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX09OVV8xR19VU19LRVlfSURfT05VX0lELCAma2V5Lm9udV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fb251XzFnX3VzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX29udV8xZ191cywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX29udV8xZ191c19jZmdfY2xlYXIoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZyBjZmc7ICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfY2xlYXIiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fT05VXzFHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fT05VXzFHX1VTX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF9lcG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX09OVV8xR19VU19LRVlfSURfT05VX0lELCAma2V5Lm9udV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fb251XzFnX3VzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX29udV8xZ191cywga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fb251XzFnX3VzX2NmZ19nZXRfbXVsdGkoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnIGNmZzsgICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX29udV8xZ191c19rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X21zZ19zZXQgKm1zZ19zZXQgPSBOVUxMOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtZXNzYWdlIHNldCAqLworICAgIHVpbnQzMl90IG1heF9tc2dzOyAgICAgICAgICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgbWF4IG51bWJlciBvZiBtc2dzIHRvIGdldCAqLworICAgIGJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjsgICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgZmlsdGVyIGludmVydCBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX29udV8xZ191c19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0KiBtc2dfc2V0ID0gTlVMTDtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQzMl90IG1heF9tc2dzO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldF9tdWx0aSIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X2Vwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkub251X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fT05VXzFHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fT05VXzFHX1VTX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBtYXggbnVtYmVyIG9mIG1zZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhfbXNncyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgbWF4X21zZ3MgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1heF9tc2dzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coIm1heF9tc2dzID0gJWQ7XG4iLCBtYXhfbXNncyk7CisKKyAgICAvKiBzZXQgZmlsdGVyIGludmVydCBmbGFnIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyX2ludmVydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW52ZXJ0X2ZpbHRlciA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXJfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImludmVydF9maWx0ZXIgPSAlcztcbiIsIChpbnZlcnRfZmlsdGVyKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogYWxsb2NhdGUgbWVzc2FnZSBzZXQgKi8KKyAgICBlcnIgPSBhcGljbGlfbXNnX3NldF9hbGxvYyhieXRlX3Bvb2wsIEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXRfYWxsb2MoQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9vbnVfMWdfdXMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fb251XzFnX3VzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGxfbGlua3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyIHZhbCA9IHsgfTsKKyAgICAgICAgaW50MzJfdCBpMDsKKyAgICAgICAgdmFsLnZhbCA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgY2xpX3Bhcm0tPmFycmF5X3NpemUgKiBzaXplb2YoKnZhbC52YWwpKTsKKyAgICAgICAgaWYgKHZhbC52YWwgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgICAgIH0KKworICAgICAgICB2YWwubGVuID0gY2xpX3Bhcm0tPmFycmF5X3NpemU7CisgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHZhbC5sZW47IGkwKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC52YWxbaTBdID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0ubWFjOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX29udV8xZ191cywgYWxsX2xpbmtzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzIgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX09OVV8xR19VU19DRkdfSURfQUxMX0xJTktTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9vbnVfMWdfdXMsIGFsbF9saW5rcywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsbF9saW5rcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fb251XzFnX3VzLCBhbGxfbGlua3MpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9vbnVfMWdfdXMsIGFsbF9saW5rcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9vbnVfMWdfdXMsIGFsbF9saW5rcykpCisgICAgeworICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX29udV8xZ191cywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX29udV8xZ191cywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX29udV8xZ191c19zdGF0X2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnIHN0YXRfY2ZnOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSBrZXkgPSB7IH07ICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfaWQgc3RhdF9pZDsgICAgICAvKio8IGRlY2xhcmUgc3RhdCBJRCAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnIHN0YXRfY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX09OVV8xR19VU19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm9udV9pZCA9IChiY21vbHRfZXBvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5vbnVfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfS0VZX0lEX09OVV9JRCwgJmtleS5vbnVfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBzd2l0Y2ggKHN0YXRfaWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0dPT0RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZ29vZF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBnb29kX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfR09PRF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIGdvb2RfYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBnb29kX2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9PVkVSU1pfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgb3ZlcnN6X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIG92ZXJzel9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX05PTl9GRUNfR09PRF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBub25fZmVjX2dvb2RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgbm9uX2ZlY19nb29kX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfTk9OX0ZFQ19HT09EX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgbm9uX2ZlY19nb29kX2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgbm9uX2ZlY19nb29kX2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfR09PRF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBmZWNfZ29vZF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBmZWNfZ29vZF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19HT09EX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZmVjX2dvb2RfYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBmZWNfZ29vZF9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0ZSQU1FU19FWENfRVJSUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIGZlY19mcmFtZXNfZXhjX2VycnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBmZWNfZnJhbWVzX2V4Y19lcnJzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQkxLU19OT19FUlJTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZmVjX2Jsa3Nfbm9fZXJycywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIGZlY19ibGtzX25vX2VycnMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19CTEtTX0NPUlJfRVJSUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIGZlY19ibGtzX2NvcnJfZXJycywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIGZlY19ibGtzX2NvcnJfZXJycywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0JMS1NfVU5DT1JSX0VSUlM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBmZWNfYmxrc191bmNvcnJfZXJycywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIGZlY19ibGtzX3VuY29ycl9lcnJzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQ09SUl9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIGZlY19jb3JyX2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZmVjX2NvcnJfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19DT1JSX1pFUk9FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIGZlY19jb3JyX3plcm9lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIGZlY19jb3JyX3plcm9lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0NPUlJfT05FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIGZlY19jb3JyX29uZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBmZWNfY29ycl9vbmVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9VTkRFUlNaX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIHVuZGVyc3pfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgdW5kZXJzel9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0VSUk9SU1pfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZXJyb3Jzel9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBlcnJvcnN6X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZzdGF0X2NmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0X2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZyBzdGF0X2NmZzsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX29udV8xZ191c19rZXkga2V5ID0geyB9OyAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2lkIHN0YXRfaWQ7ICAgICAgLyoqPCBkZWNsYXJlIHN0YXQgSUQgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZyBzdGF0X2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX29udV8xZ191c19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X2Vwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkub251X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fT05VXzFHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fT05VXzFHX1VTX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IElEIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBzdGF0X2lkID0gKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgc3dpdGNoIChzdGF0X2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9HT09EX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIGdvb2RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZ29vZF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0dPT0RfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBnb29kX2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZ29vZF9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfT1ZFUlNaX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIG92ZXJzel9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBvdmVyc3pfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9OT05fRkVDX0dPT0RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgbm9uX2ZlY19nb29kX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIG5vbl9mZWNfZ29vZF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX05PTl9GRUNfR09PRF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIG5vbl9mZWNfZ29vZF9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIG5vbl9mZWNfZ29vZF9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0dPT0RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZmVjX2dvb2RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZmVjX2dvb2RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfR09PRF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIGZlY19nb29kX2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZmVjX2dvb2RfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19GUkFNRVNfRVhDX0VSUlM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBmZWNfZnJhbWVzX2V4Y19lcnJzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZmVjX2ZyYW1lc19leGNfZXJycywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0JMS1NfTk9fRVJSUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIGZlY19ibGtzX25vX2VycnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBmZWNfYmxrc19ub19lcnJzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQkxLU19DT1JSX0VSUlM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBmZWNfYmxrc19jb3JyX2VycnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBmZWNfYmxrc19jb3JyX2VycnMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19CTEtTX1VOQ09SUl9FUlJTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZmVjX2Jsa3NfdW5jb3JyX2VycnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBmZWNfYmxrc191bmNvcnJfZXJycywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0NPUlJfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBmZWNfY29ycl9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIGZlY19jb3JyX2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQ09SUl9aRVJPRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBmZWNfY29ycl96ZXJvZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBmZWNfY29ycl96ZXJvZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19DT1JSX09ORVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBmZWNfY29ycl9vbmVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZmVjX2NvcnJfb25lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfVU5ERVJTWl9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCB1bmRlcnN6X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIHVuZGVyc3pfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9FUlJPUlNaX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9vbnVfMWdfdXMsIGVycm9yc3pfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgZXJyb3Jzel9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnR5cGUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnR5cGUgPSAoYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHZhbC50cmlnZ2VyLnR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5yaXNpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV90aHJlc2hvbGQucmlzaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5yaXNpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5mYWxsaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLmZhbGxpbmcgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmZhbGxpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9SQU5HRToKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci51cHBlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLnVwcGVyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci51cHBlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmxvd2VyIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfcmFuZ2UubG93ZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxvd2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1ZBTFVFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5saW1pdCIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS52YWx1ZV90aHJlc2hvbGQubGltaXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxpbWl0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX05PTkU6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnNvYWsuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnNvYWsuY2xlYXJfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9TVEFUX0NGR19QUk9QX1NFVCgmc3RhdF9jZmcsIGVwb25fb251XzFnX3VzLCBjZmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9hbGFybV9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgMCwgQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX0lEX0NGRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCBlcG9uX29udV8xZ191cywgY2ZnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX29udV8xZ191c19hdXRvX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnIGF1dG9fY2ZnOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSBrZXkgPSB7IH07ICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19nZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGVwb25fb251XzFnX3VzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZXBvbl9vbnVfMWdfdXMsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9jbGVhcmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9vbnVfMWdfdXMsIHN0YXRfYWxhcm1fY2xlYXJlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX29udV8xZ191cywgc3RhdF9hbGFybV9jbGVhcmVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fb251XzFnX3VzLCBzdGF0X2FsYXJtX3JhaXNlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX29udV8xZ191cywgc3RhdF9hbGFybV9yYWlzZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGVwb25fb251XzFnX3VzLCBzdGF0X2FsYXJtX2NsZWFyZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX29udV8xZ191cywgc3RhdF9hbGFybV9yYWlzZWQpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9vbnVfMWdfdXMsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9vbnVfMWdfdXMsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmF1dG9fY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX29udV8xZ191c19hdXRvX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnIGF1dG9fY2ZnOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSBrZXkgPSB7IH07ICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19zZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGVwb25fb251XzFnX3VzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZXBvbl9vbnVfMWdfdXMsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9jbGVhcmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9vbnVfMWdfdXMsIHN0YXRfYWxhcm1fY2xlYXJlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9vbnVfMWdfdXMsIHN0YXRfYWxhcm1fY2xlYXJlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0VQT05fT05VXzFHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fcmFpc2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9vbnVfMWdfdXMsIHN0YXRfYWxhcm1fcmFpc2VkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX29udV8xZ191cywgc3RhdF9hbGFybV9yYWlzZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX09OVV8xR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzEwZ19kc19jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZyBjZmc7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9wYXRoXzEwZ19kcywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9wYXRoXzEwZ19kcywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmZWNfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZlY19zdGF0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZlY19zdGF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19nZW5lcmF0b3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcGF0aF8xMGdfZHMsIHByYnNfZ2VuZXJhdG9yKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9wYXRoXzEwZ19kcywgcHJic19nZW5lcmF0b3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9wYXRoXzEwZ19kcywgZmVjX3N0YXRlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBwcmJzX2dlbmVyYXRvcikpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcGF0aF8xMGdfZHMsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzEwZ19kc19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZyBjZmc7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9wYXRoXzEwZ19kcywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9wYXRoXzEwZ19kcywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmZWNfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX2ZlY19lbl9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmZWNfc3RhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzEwZ19kcywgZmVjX3N0YXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19DRkdfSURfRkVDX1NUQVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInByYnNfZ2VuZXJhdG9yLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19nZW5lcmF0b3IucG9seW5vbSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnBvbHlub20gPSAoYmNtb2x0X3ByYnNfcG9seW5vbWlhbCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByYnNfZ2VuZXJhdG9yLnBvbHlub20gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2dlbmVyYXRvci5lcnJvcl9pbnNlcnQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5lcnJvcl9pbnNlcnQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByYnNfZ2VuZXJhdG9yLmVycm9yX2luc2VydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfZ2VuZXJhdG9yLmludmVydCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmludmVydCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19nZW5lcmF0b3IuaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19nZW5lcmF0b3IuY29udHJvbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNvbnRyb2wgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcmJzX2dlbmVyYXRvci5jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzEwZ19kcywgcHJic19nZW5lcmF0b3IsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19EUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0NGR19JRF9QUkJTX0dFTkVSQVRPUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcGF0aF8xMGdfZHMsIHByYnNfZ2VuZXJhdG9yLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2NsZWFyKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZyBjZmc7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19jbGVhciIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19EUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzEwZ19kc19jZmdfZ2V0X211bHRpKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnIGNmZzsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0ID0gTlVMTDsgICAgICAgICAvKio8IGRlY2xhcmUgbWVzc2FnZSBzZXQgKi8KKyAgICB1aW50MzJfdCBtYXhfbXNnczsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGZpbHRlciBpbnZlcnQgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXQqIG1zZ19zZXQgPSBOVUxMO1xuIik7CisgICAgYmNtY2xpX2xvZygidWludDMyX3QgbWF4X21zZ3M7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGludmVydF9maWx0ZXI7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0X211bHRpIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX0RTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXRfYWxsb2MoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX0RTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5mZWNfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX2ZlY19lbl9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmZWNfc3RhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzEwZ19kcywgZmVjX3N0YXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19DRkdfSURfRkVDX1NUQVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmVjX3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9wYXRoXzEwZ19kcywgZmVjX3N0YXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xMGdfZHMsIGZlY19zdGF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5wcmJzX2dlbmVyYXRvci4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX2dlbmVyYXRvci5wb2x5bm9tIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucG9seW5vbSA9IChiY21vbHRfcHJic19wb2x5bm9taWFsKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByYnNfZ2VuZXJhdG9yLnBvbHlub20gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19nZW5lcmF0b3IuZXJyb3JfaW5zZXJ0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZXJyb3JfaW5zZXJ0ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19nZW5lcmF0b3IuZXJyb3JfaW5zZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfZ2VuZXJhdG9yLmludmVydCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmludmVydCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByYnNfZ2VuZXJhdG9yLmludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX2dlbmVyYXRvci5jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY29udHJvbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX2dlbmVyYXRvci5jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzEwZ19kcywgcHJic19nZW5lcmF0b3IsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19EUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0NGR19JRF9QUkJTX0dFTkVSQVRPUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcGF0aF8xMGdfZHMsIHByYnNfZ2VuZXJhdG9yLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19nZW5lcmF0b3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3BhdGhfMTBnX2RzLCBwcmJzX2dlbmVyYXRvcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3BhdGhfMTBnX2RzLCBwcmJzX2dlbmVyYXRvcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9wYXRoXzEwZ19kcywgZmVjX3N0YXRlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9wYXRoXzEwZ19kcywgcHJic19nZW5lcmF0b3IpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9wYXRoXzEwZ19kcywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3BhdGhfMTBnX2RzLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdCBzdGF0OyAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDsgICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgJ2NsZWFyIG9uIHJlYWQnIGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXQgc3RhdDtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBjbGVhcl9vbl9yZWFkO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IGZsYWdzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2xlYXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNsZWFyX29uX3JlYWQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2xlYXIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiY2xlYXJfb25fcmVhZCA9ICVzO1xuIiwgKGNsZWFyX29uX3JlYWQpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX1NUQVRfSU5JVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9JTklUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJ5dGVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIGJ5dGVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBieXRlcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfNjQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzY0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfNjQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc182NV8xMjciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzY1XzEyNyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzY1XzEyNyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzEyOF8yNTUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzEyOF8yNTUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc18xMjhfMjU1KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfMjU2XzUxMSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfMjU2XzUxMSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzI1Nl81MTEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc181MTJfMTAyMyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfNTEyXzEwMjMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc181MTJfMTAyMyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzEwMjRfMTUxOCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfMTAyNF8xNTE4KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfMTAyNF8xNTE4KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfMTUxOV8yMDQ3Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc18xNTE5XzIwNDcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc18xNTE5XzIwNDcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc18yMDQ4XzQwOTUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzIwNDhfNDA5NSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzIwNDhfNDA5NSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzQwOTZfOTIxNiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfNDA5Nl85MjE2KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfNDA5Nl85MjE2KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfOTIxN18xNjM4MyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfOTIxN18xNjM4Myk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzkyMTdfMTYzODMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJyb2FkY2FzdF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgYnJvYWRjYXN0X2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgYnJvYWRjYXN0X2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGF0YV9ieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBkYXRhX2J5dGVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBkYXRhX2J5dGVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtdWx0aWNhc3RfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIG11bHRpY2FzdF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIG11bHRpY2FzdF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVuaWNhc3RfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIHVuaWNhc3RfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCB1bmljYXN0X2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib2FtX2J5dGVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIG9hbV9ieXRlcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgb2FtX2J5dGVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvYW1fZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIG9hbV9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIG9hbV9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdhdGVfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIGdhdGVfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBnYXRlX2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXBjcF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgbXBjcF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIG1wY3BfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhYm9ydF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgYWJvcnRfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBhYm9ydF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBieXRlcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzY0KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc182NV8xMjcpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzEyOF8yNTUpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzI1Nl81MTEpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzUxMl8xMDIzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc18xMDI0XzE1MTgpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzE1MTlfMjA0NykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfMjA0OF80MDk1KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc180MDk2XzkyMTYpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzkyMTdfMTYzODMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgYnJvYWRjYXN0X2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBkYXRhX2J5dGVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIG11bHRpY2FzdF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgdW5pY2FzdF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgb2FtX2J5dGVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfZHMsIG9hbV9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgZ2F0ZV9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgbXBjcF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ19kcywgYWJvcnRfZnJhbWVzKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX2RzLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfZ2V0KGRldmljZV9pZCwgJnN0YXQuaGRyLCBjbGVhcl9vbl9yZWFkKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXQuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdC5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmcgc3RhdF9jZmc7ICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5IGtleSA9IHsgfTsgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9pZCBzdGF0X2lkOyAgICAvKio8IGRlY2xhcmUgc3RhdCBJRCAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19EUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIHN3aXRjaCAoc3RhdF9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGJ5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzY0OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfNjQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc182NCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfNjVfMTI3LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfNjVfMTI3LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfMTI4XzI1NSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzEyOF8yNTUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTE6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc18yNTZfNTExLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfMjU2XzUxMSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc181MTJfMTAyMywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzUxMl8xMDIzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTg6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc18xMDI0XzE1MTgsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc18xMDI0XzE1MTgsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzE1MTlfMjA0Nywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzE1MTlfMjA0Nywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfMjA0OF80MDk1LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfMjA0OF80MDk1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTY6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc180MDk2XzkyMTYsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc180MDk2XzkyMTYsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc185MjE3XzE2MzgzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfOTIxN18xNjM4Mywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBicm9hZGNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBicm9hZGNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0RBVEFfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGRhdGFfYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGRhdGFfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgbXVsdGljYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgbXVsdGljYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgdW5pY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIHVuaWNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX09BTV9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgb2FtX2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBvYW1fYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfT0FNX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgb2FtX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgb2FtX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9HQVRFX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgZ2F0ZV9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGdhdGVfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX01QQ1BfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBtcGNwX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgbXBjcF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfQUJPUlRfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBhYm9ydF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGFib3J0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZzdGF0X2NmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0X2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmcgc3RhdF9jZmc7ICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5IGtleSA9IHsgfTsgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9pZCBzdGF0X2lkOyAgICAvKio8IGRlY2xhcmUgc3RhdCBJRCAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19EUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIHN3aXRjaCAoc3RhdF9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGJ5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzY0OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfNjQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc182NCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfNjVfMTI3LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfNjVfMTI3LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfMTI4XzI1NSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzEyOF8yNTUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTE6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc18yNTZfNTExLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfMjU2XzUxMSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc181MTJfMTAyMywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzUxMl8xMDIzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTg6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc18xMDI0XzE1MTgsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc18xMDI0XzE1MTgsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzE1MTlfMjA0Nywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgZnJhbWVzXzE1MTlfMjA0Nywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfMjA0OF80MDk1LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfMjA0OF80MDk1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTY6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc180MDk2XzkyMTYsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc180MDk2XzkyMTYsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGZyYW1lc185MjE3XzE2MzgzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBmcmFtZXNfOTIxN18xNjM4Mywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBicm9hZGNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBicm9hZGNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0RBVEFfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGRhdGFfYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGRhdGFfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgbXVsdGljYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgbXVsdGljYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgdW5pY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIHVuaWNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX09BTV9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgb2FtX2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBvYW1fYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfT0FNX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgb2FtX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgb2FtX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9HQVRFX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgZ2F0ZV9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGdhdGVfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX01QQ1BfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBtcGNwX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgbXBjcF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfQUJPUlRfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBhYm9ydF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGFib3J0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjZmcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc3RhdF9hbGFybV9jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjZmcudHJpZ2dlci4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIudHlwZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudHlwZSA9IChiY21vbHRfc3RhdF9jb25kaXRpb25fdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci50eXBlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAodmFsLnRyaWdnZXIudHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfVEhSRVNIT0xEOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnJpc2luZyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3RocmVzaG9sZC5yaXNpbmcgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnJpc2luZyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmZhbGxpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV90aHJlc2hvbGQuZmFsbGluZyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIuZmFsbGluZyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1JBTkdFOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnVwcGVyIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfcmFuZ2UudXBwZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnVwcGVyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIubG93ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV9yYW5nZS5sb3dlciA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIubG93ZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfVkFMVUVfVEhSRVNIT0xEOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmxpbWl0Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnZhbHVlX3RocmVzaG9sZC5saW1pdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIubGltaXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfTk9ORToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjZmcuc29hay4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnNvYWsuYWN0aXZlX3NvYWtfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hay5hY3RpdmVfc29ha190aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnNvYWsuY2xlYXJfc29ha190aW1lIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuc29hay5jbGVhcl9zb2FrX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsuY2xlYXJfc29ha190aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX1BST1BfU0VUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ19kcywgY2ZnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19EUywgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgMCwgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9DRkdfSURfQ0ZHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19QUk9QX1NFVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGNmZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0X2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmcgYXV0b19jZmc7ICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5IGtleSA9IHsgfTsgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfZ2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzEwZ19kcywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX2NsZWFyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBzdGF0X2FsYXJtX2NsZWFyZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzEwZ19kcywgc3RhdF9hbGFybV9jbGVhcmVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xMGdfZHMsIHN0YXRfYWxhcm1fcmFpc2VkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xMGdfZHMsIHN0YXRfYWxhcm1fcmFpc2VkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBzdGF0X2FsYXJtX2NsZWFyZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBzdGF0X2FsYXJtX3JhaXNlZCkpCisgICAgeworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmF1dG9fY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZyBhdXRvX2NmZzsgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkga2V5ID0geyB9OyAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19zZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xMGdfZHMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMTBnX2RzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fY2xlYXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xMGdfZHMsIHN0YXRfYWxhcm1fY2xlYXJlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzEwZ19kcywgc3RhdF9hbGFybV9jbGVhcmVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fcmFpc2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzEwZ19kcywgc3RhdF9hbGFybV9yYWlzZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xMGdfZHMsIHN0YXRfYWxhcm1fcmFpc2VkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMTBnX3VzX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnIGNmZzsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZlY19zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9wYXRoXzEwZ191cywgZmVjX3N0YXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9wYXRoXzEwZ191cywgZmVjX3N0YXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzeW5jX3RpbWVfdHEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcGF0aF8xMGdfdXMsIHN5bmNfdGltZV90cSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcGF0aF8xMGdfdXMsIHN5bmNfdGltZV90cSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19jaGVja2VyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBwcmJzX2NoZWNrZXIpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBwcmJzX2NoZWNrZXIpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfc3RhdHVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBwcmJzX3N0YXR1cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcGF0aF8xMGdfdXMsIHByYnNfc3RhdHVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZlY19zdGF0ZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9wYXRoXzEwZ191cywgc3luY190aW1lX3RxKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBwcmJzX2NoZWNrZXIpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fcGF0aF8xMGdfdXMsIHByYnNfc3RhdHVzKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9wYXRoXzEwZ191cywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcGF0aF8xMGdfdXMsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMTBnX3VzX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnIGNmZzsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZlY19zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fZmVjX2VuX3N0YXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9lcG9uX2ZlY19lbl9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZlY19zdGF0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmZWNfc3RhdGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0NGR19JRF9GRUNfU1RBVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzeW5jX3RpbWVfdHEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF90aW1lX3F1YW50YSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcGF0aF8xMGdfdXMsIHN5bmNfdGltZV90cSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBzeW5jX3RpbWVfdHEsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0NGR19JRF9TWU5DX1RJTUVfVFEsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicHJic19jaGVja2VyLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfY2hlY2tlci5wb2x5bm9tIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucG9seW5vbSA9IChiY21vbHRfcHJic19wb2x5bm9taWFsKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19jaGVja2VyLnBvbHlub20gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2NoZWNrZXIubW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1vZGUgPSAoYmNtb2x0X3ByYnNfY2hlY2tlcl9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19jaGVja2VyLm1vZGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2NoZWNrZXIuZGF0YV9pbnZlcnQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kYXRhX2ludmVydCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19jaGVja2VyLmRhdGFfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19jaGVja2VyLmNvbnRyb2wiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jb250cm9sID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19jaGVja2VyLmNvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBwcmJzX2NoZWNrZXIsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfUFJCU19DSEVDS0VSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzEwZ191cywgcHJic19jaGVja2VyLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2NsZWFyKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZyBjZmc7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19jbGVhciIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzEwZ191c19jZmdfZ2V0X211bHRpKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnIGNmZzsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0ID0gTlVMTDsgICAgICAgICAvKio8IGRlY2xhcmUgbWVzc2FnZSBzZXQgKi8KKyAgICB1aW50MzJfdCBtYXhfbXNnczsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGZpbHRlciBpbnZlcnQgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXQqIG1zZ19zZXQgPSBOVUxMO1xuIik7CisgICAgYmNtY2xpX2xvZygidWludDMyX3QgbWF4X21zZ3M7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGludmVydF9maWx0ZXI7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0X211bHRpIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXRfYWxsb2MoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5mZWNfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX2ZlY19lbl9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmZWNfc3RhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzEwZ191cywgZmVjX3N0YXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfRkVDX1NUQVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmVjX3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9wYXRoXzEwZ191cywgZmVjX3N0YXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xMGdfdXMsIGZlY19zdGF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnN5bmNfdGltZV90cSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3RpbWVfcXVhbnRhIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzEwZ191cywgc3luY190aW1lX3RxLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcGF0aF8xMGdfdXMsIHN5bmNfdGltZV90cSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX1NZTkNfVElNRV9UUSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN5bmNfdGltZV90cSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xMGdfdXMsIHN5bmNfdGltZV90cSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3BhdGhfMTBnX3VzLCBzeW5jX3RpbWVfdHEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucHJic19jaGVja2VyLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX2NoZWNrZXIucG9seW5vbSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnBvbHlub20gPSAoYmNtb2x0X3ByYnNfcG9seW5vbWlhbCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX2NoZWNrZXIucG9seW5vbSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX2NoZWNrZXIubW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1vZGUgPSAoYmNtb2x0X3ByYnNfY2hlY2tlcl9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByYnNfY2hlY2tlci5tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfY2hlY2tlci5kYXRhX2ludmVydCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRhdGFfaW52ZXJ0ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19jaGVja2VyLmRhdGFfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfY2hlY2tlci5jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY29udHJvbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX2NoZWNrZXIuY29udHJvbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcGF0aF8xMGdfdXMsIHByYnNfY2hlY2tlciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0NGR19JRF9QUkJTX0NIRUNLRVIsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBwcmJzX2NoZWNrZXIsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2NoZWNrZXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3BhdGhfMTBnX3VzLCBwcmJzX2NoZWNrZXIpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9wYXRoXzEwZ191cywgcHJic19jaGVja2VyKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnByYnNfc3RhdHVzLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3ByYnNfc3RhdHVzIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19zdGF0dXMubG9ja19zdGF0ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvY2tfc3RhdGUgPSAoYmNtb2x0X3ByYnNfbG9ja19zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX3N0YXR1cy5sb2NrX3N0YXRlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfc3RhdHVzLmVycm9yX2NvdW50cyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmVycm9yX2NvdW50cyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX3N0YXR1cy5lcnJvcl9jb3VudHMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBwcmJzX3N0YXR1cywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wcmJzX3N0YXR1cyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfUFJCU19TVEFUVVMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBwcmJzX3N0YXR1cywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfc3RhdHVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9wYXRoXzEwZ191cywgcHJic19zdGF0dXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9wYXRoXzEwZ191cywgcHJic19zdGF0dXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xMGdfdXMsIGZlY19zdGF0ZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xMGdfdXMsIHN5bmNfdGltZV90cSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xMGdfdXMsIHByYnNfY2hlY2tlcikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xMGdfdXMsIHByYnNfc3RhdHVzKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xMGdfdXMsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9wYXRoXzEwZ191cywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXQgc3RhdDsgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vc19ib29sIGNsZWFyX29uX3JlYWQ7ICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlICdjbGVhciBvbiByZWFkJyBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0IHN0YXQ7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBmbGFncyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNsZWFyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBjbGVhcl9vbl9yZWFkID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNsZWFyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImNsZWFyX29uX3JlYWQgPSAlcztcbiIsIChjbGVhcl9vbl9yZWFkKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9TVEFUX0lOSVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfSU5JVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBieXRlcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgYnl0ZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzY0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc182NCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzY0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfNjVfMTI3Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc182NV8xMjcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc182NV8xMjcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc18xMjhfMjU1Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc18xMjhfMjU1KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfMTI4XzI1NSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzI1Nl81MTEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzI1Nl81MTEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc18yNTZfNTExKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfNTEyXzEwMjMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzUxMl8xMDIzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfNTEyXzEwMjMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc18xMDI0XzE1MTgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzEwMjRfMTUxOCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzEwMjRfMTUxOCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzE1MTlfMjA0NyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfMTUxOV8yMDQ3KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfMTUxOV8yMDQ3KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfMjA0OF80MDk1Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc18yMDQ4XzQwOTUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc18yMDQ4XzQwOTUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyYW1lc180MDk2XzkyMTYiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzQwOTZfOTIxNik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzQwOTZfOTIxNik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzkyMTdfMTYzODMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzkyMTdfMTYzODMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc185MjE3XzE2MzgzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJicm9hZGNhc3RfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGJyb2FkY2FzdF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGJyb2FkY2FzdF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRhdGFfYnl0ZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgZGF0YV9ieXRlcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgZGF0YV9ieXRlcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXVsdGljYXN0X2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBtdWx0aWNhc3RfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBtdWx0aWNhc3RfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1bmljYXN0X2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCB1bmljYXN0X2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgdW5pY2FzdF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1wY3BfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIG1wY3BfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBtcGNwX2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib2FtX2J5dGVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIG9hbV9ieXRlcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgb2FtX2J5dGVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvYW1fZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIG9hbV9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIG9hbV9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJlcG9ydF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgcmVwb3J0X2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgcmVwb3J0X2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWJvcnRfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGFib3J0X2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgYWJvcnRfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmY3NfZXJyb3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgZmNzX2Vycm9yKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBmY3NfZXJyb3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNyY184X2Vycm9yIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGNyY184X2Vycm9yKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBjcmNfOF9lcnJvcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib3V0X29mX3Nsb3QiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgb3V0X29mX3Nsb3QpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIG91dF9vZl9zbG90KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvdmVyc2l6ZV9lcnJvciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBvdmVyc2l6ZV9lcnJvcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgb3ZlcnNpemVfZXJyb3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ1bnRfZXJyb3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgcnVudF9lcnJvcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgcnVudF9lcnJvcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGJ5dGVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfNjQpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzY1XzEyNykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfMTI4XzI1NSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfMjU2XzUxMSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfNTEyXzEwMjMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzEwMjRfMTUxOCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfMTUxOV8yMDQ3KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc18yMDQ4XzQwOTUpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzQwOTZfOTIxNikgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfOTIxN18xNjM4MykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBicm9hZGNhc3RfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGRhdGFfYnl0ZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgbXVsdGljYXN0X2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCB1bmljYXN0X2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBtcGNwX2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBvYW1fYnl0ZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgb2FtX2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCByZXBvcnRfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xMGdfdXMsIGFib3J0X2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMTBnX3VzLCBmY3NfZXJyb3IpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgY3JjXzhfZXJyb3IpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgb3V0X29mX3Nsb3QpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgb3ZlcnNpemVfZXJyb3IpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgcnVudF9lcnJvcikpCisgICAgeworICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzEwZ191cywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9nZXQoZGV2aWNlX2lkLCAmc3RhdC5oZHIsIGNsZWFyX29uX3JlYWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZzdGF0Lmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXQuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnIHN0YXRfY2ZnOyAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleSBrZXkgPSB7IH07ICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfaWQgc3RhdF9pZDsgICAgLyoqPCBkZWNsYXJlIHN0YXQgSUQgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnIHN0YXRfY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IElEIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBzdGF0X2lkID0gKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBzd2l0Y2ggKHN0YXRfaWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGJ5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU182NDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzY0LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfNjQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzY1XzEyNzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzY1XzEyNywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzY1XzEyNywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzEyOF8yNTUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc18xMjhfMjU1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfMjU2XzUxMSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzI1Nl81MTEsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfNTEyXzEwMjMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc181MTJfMTAyMywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfMTAyNF8xNTE4LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfMTAyNF8xNTE4LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDc6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc18xNTE5XzIwNDcsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc18xNTE5XzIwNDcsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzIwNDhfNDA5NSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzIwNDhfNDA5NSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfNDA5Nl85MjE2LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfNDA5Nl85MjE2LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfOTIxN18xNjM4Mywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzkyMTdfMTYzODMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgYnJvYWRjYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgYnJvYWRjYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9EQVRBX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBkYXRhX2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBkYXRhX2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIG11bHRpY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIG11bHRpY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIHVuaWNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCB1bmljYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9NUENQX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgbXBjcF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIG1wY3BfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX09BTV9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgb2FtX2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBvYW1fYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfT0FNX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgb2FtX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgb2FtX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9SRVBPUlRfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCByZXBvcnRfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCByZXBvcnRfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0FCT1JUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgYWJvcnRfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBhYm9ydF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRkNTX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmY3NfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZjc19lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9DUkNfOF9FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgY3JjXzhfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGNyY184X2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX09VVF9PRl9TTE9UOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBvdXRfb2Zfc2xvdCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgb3V0X29mX3Nsb3QsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfT1ZFUlNJWkVfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIG92ZXJzaXplX2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBvdmVyc2l6ZV9lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9SVU5UX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBydW50X2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBydW50X2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXRfY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZyBzdGF0X2NmZzsgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkga2V5ID0geyB9OyAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2lkIHN0YXRfaWQ7ICAgIC8qKjwgZGVjbGFyZSBzdGF0IElEICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZyBzdGF0X2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBJRCBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc3RhdF9pZCA9IChiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgc3dpdGNoIChzdGF0X2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfNjQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc182NCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzY0LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU182NV8xMjc6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc182NV8xMjcsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc182NV8xMjcsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc18xMjhfMjU1LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfMTI4XzI1NSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzI1Nl81MTEsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc18yNTZfNTExLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzUxMl8xMDIzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfNTEyXzEwMjMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxODoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzEwMjRfMTUxOCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzEwMjRfMTUxOCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfMTUxOV8yMDQ3LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmcmFtZXNfMTUxOV8yMDQ3LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc18yMDQ4XzQwOTUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc18yMDQ4XzQwOTUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzQwOTZfOTIxNiwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzQwOTZfOTIxNiwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZnJhbWVzXzkyMTdfMTYzODMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGZyYW1lc185MjE3XzE2MzgzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGJyb2FkY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGJyb2FkY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfREFUQV9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZGF0YV9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZGF0YV9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBtdWx0aWNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBtdWx0aWNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCB1bmljYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgdW5pY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfTVBDUF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIG1wY3BfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBtcGNwX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9PQU1fQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIG9hbV9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgb2FtX2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX09BTV9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIG9hbV9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIG9hbV9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfUkVQT1JUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgcmVwb3J0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgcmVwb3J0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9BQk9SVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGFib3J0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgYWJvcnRfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZDU19FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgZmNzX2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBmY3NfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfQ1JDXzhfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGNyY184X2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBjcmNfOF9lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9PVVRfT0ZfU0xPVDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgb3V0X29mX3Nsb3QsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIG91dF9vZl9zbG90LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX09WRVJTSVpFX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBvdmVyc2l6ZV9lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgb3ZlcnNpemVfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfUlVOVF9FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgcnVudF9lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgcnVudF9lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjZmcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc3RhdF9hbGFybV9jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjZmcudHJpZ2dlci4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIudHlwZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudHlwZSA9IChiY21vbHRfc3RhdF9jb25kaXRpb25fdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci50eXBlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAodmFsLnRyaWdnZXIudHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfVEhSRVNIT0xEOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnJpc2luZyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3RocmVzaG9sZC5yaXNpbmcgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnJpc2luZyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmZhbGxpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV90aHJlc2hvbGQuZmFsbGluZyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIuZmFsbGluZyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1JBTkdFOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnVwcGVyIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfcmFuZ2UudXBwZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnVwcGVyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIubG93ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV9yYW5nZS5sb3dlciA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIubG93ZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfVkFMVUVfVEhSRVNIT0xEOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmxpbWl0Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnZhbHVlX3RocmVzaG9sZC5saW1pdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIubGltaXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfTk9ORToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjZmcuc29hay4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnNvYWsuYWN0aXZlX3NvYWtfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hay5hY3RpdmVfc29ha190aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnNvYWsuY2xlYXJfc29ha190aW1lIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuc29hay5jbGVhcl9zb2FrX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsuY2xlYXJfc29ha190aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX1BST1BfU0VUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzEwZ191cywgY2ZnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19VUywgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgMCwgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9DRkdfSURfQ0ZHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19QUk9QX1NFVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGNmZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0X2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmcgYXV0b19jZmc7ICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5IGtleSA9IHsgfTsgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfZ2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzEwZ191cywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX2NsZWFyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBzdGF0X2FsYXJtX2NsZWFyZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzEwZ191cywgc3RhdF9hbGFybV9jbGVhcmVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xMGdfdXMsIHN0YXRfYWxhcm1fcmFpc2VkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xMGdfdXMsIHN0YXRfYWxhcm1fcmFpc2VkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBzdGF0X2FsYXJtX2NsZWFyZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBzdGF0X2FsYXJtX3JhaXNlZCkpCisgICAgeworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmF1dG9fY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZyBhdXRvX2NmZzsgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkga2V5ID0geyB9OyAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19zZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xMGdfdXMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMTBnX3VzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fY2xlYXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xMGdfdXMsIHN0YXRfYWxhcm1fY2xlYXJlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzEwZ191cywgc3RhdF9hbGFybV9jbGVhcmVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fcmFpc2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzEwZ191cywgc3RhdF9hbGFybV9yYWlzZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xMGdfdXMsIHN0YXRfYWxhcm1fcmFpc2VkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMWdfZHNfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZyBjZmc7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX0RTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9wYXRoXzFnX2RzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVmYXVsdF9mZWNfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcGF0aF8xZ19kcywgZGVmYXVsdF9mZWNfc3RhdGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGRlZmF1bHRfZmVjX3N0YXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW1hbl9tb2RlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIHJhbWFuX21vZGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIHJhbWFuX21vZGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR1cmJvXzJnX21vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcGF0aF8xZ19kcywgdHVyYm9fMmdfbW9kZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcGF0aF8xZ19kcywgdHVyYm9fMmdfbW9kZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19nZW5lcmF0b3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcGF0aF8xZ19kcywgcHJic19nZW5lcmF0b3IpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIHByYnNfZ2VuZXJhdG9yKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fcGF0aF8xZ19kcywgZGVmYXVsdF9mZWNfc3RhdGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fcGF0aF8xZ19kcywgcmFtYW5fbW9kZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9wYXRoXzFnX2RzLCB0dXJib18yZ19tb2RlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIHByYnNfZ2VuZXJhdG9yKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9wYXRoXzFnX2RzLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9wYXRoXzFnX2RzLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzFnX2RzX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19EUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fcGF0aF8xZ19kcywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9wYXRoXzFnX2RzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlZmF1bHRfZmVjX3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2Vwb25fZmVjX2VuX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzFnX2RzLCBkZWZhdWx0X2ZlY19zdGF0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGRlZmF1bHRfZmVjX3N0YXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19EUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQ0ZHX0lEX0RFRkFVTFRfRkVDX1NUQVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFtYW5fbW9kZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3JhbWFuX21pdGlnYXRpb25fbW9kZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfcmFtYW5fbWl0aWdhdGlvbl9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzFnX2RzLCByYW1hbl9tb2RlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcGF0aF8xZ19kcywgcmFtYW5fbW9kZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9SQU1BTl9NT0RFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHVyYm9fMmdfbW9kZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fMWdfdHVyYm9fbW9kZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZXBvbl8xZ190dXJib19tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzFnX2RzLCB0dXJib18yZ19tb2RlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcGF0aF8xZ19kcywgdHVyYm9fMmdfbW9kZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9UVVJCT18yR19NT0RFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInByYnNfZ2VuZXJhdG9yLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19nZW5lcmF0b3IucG9seW5vbSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnBvbHlub20gPSAoYmNtb2x0X3ByYnNfcG9seW5vbWlhbCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByYnNfZ2VuZXJhdG9yLnBvbHlub20gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2dlbmVyYXRvci5lcnJvcl9pbnNlcnQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5lcnJvcl9pbnNlcnQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByYnNfZ2VuZXJhdG9yLmVycm9yX2luc2VydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfZ2VuZXJhdG9yLmludmVydCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmludmVydCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19nZW5lcmF0b3IuaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19nZW5lcmF0b3IuY29udHJvbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNvbnRyb2wgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcmJzX2dlbmVyYXRvci5jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzFnX2RzLCBwcmJzX2dlbmVyYXRvciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9QUkJTX0dFTkVSQVRPUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcGF0aF8xZ19kcywgcHJic19nZW5lcmF0b3IsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzFnX2RzX2NmZ19jbGVhcihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZyBjZmc7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2NsZWFyIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fcGF0aF8xZ19kcywga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fcGF0aF8xZ19kc19jZmdfZ2V0X211bHRpKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0ID0gTlVMTDsgICAgICAgICAvKio8IGRlY2xhcmUgbWVzc2FnZSBzZXQgKi8KKyAgICB1aW50MzJfdCBtYXhfbXNnczsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGZpbHRlciBpbnZlcnQgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0KiBtc2dfc2V0ID0gTlVMTDtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQzMl90IG1heF9tc2dzO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldF9tdWx0aSIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX0RTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBtYXggbnVtYmVyIG9mIG1zZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhfbXNncyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgbWF4X21zZ3MgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1heF9tc2dzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coIm1heF9tc2dzID0gJWQ7XG4iLCBtYXhfbXNncyk7CisKKyAgICAvKiBzZXQgZmlsdGVyIGludmVydCBmbGFnIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyX2ludmVydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW52ZXJ0X2ZpbHRlciA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXJfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImludmVydF9maWx0ZXIgPSAlcztcbiIsIChpbnZlcnRfZmlsdGVyKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogYWxsb2NhdGUgbWVzc2FnZSBzZXQgKi8KKyAgICBlcnIgPSBhcGljbGlfbXNnX3NldF9hbGxvYyhieXRlX3Bvb2wsIEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX0RTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX0RTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fcGF0aF8xZ19kcywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZGVmYXVsdF9mZWNfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX2ZlY19lbl9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGRlZmF1bHRfZmVjX3N0YXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcGF0aF8xZ19kcywgZGVmYXVsdF9mZWNfc3RhdGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX0RTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19DRkdfSURfREVGQVVMVF9GRUNfU1RBVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWZhdWx0X2ZlY19zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xZ19kcywgZGVmYXVsdF9mZWNfc3RhdGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9wYXRoXzFnX2RzLCBkZWZhdWx0X2ZlY19zdGF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJhbWFuX21vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9yYW1hbl9taXRpZ2F0aW9uX21vZGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3JhbWFuX21pdGlnYXRpb25fbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcGF0aF8xZ19kcywgcmFtYW5fbW9kZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIHJhbWFuX21vZGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX0RTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19DRkdfSURfUkFNQU5fTU9ERSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbWFuX21vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3BhdGhfMWdfZHMsIHJhbWFuX21vZGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9wYXRoXzFnX2RzLCByYW1hbl9tb2RlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudHVyYm9fMmdfbW9kZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fMWdfdHVyYm9fbW9kZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZXBvbl8xZ190dXJib19tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzFnX2RzLCB0dXJib18yZ19tb2RlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcGF0aF8xZ19kcywgdHVyYm9fMmdfbW9kZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9UVVJCT18yR19NT0RFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHVyYm9fMmdfbW9kZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xZ19kcywgdHVyYm9fMmdfbW9kZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3BhdGhfMWdfZHMsIHR1cmJvXzJnX21vZGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucHJic19nZW5lcmF0b3IuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19nZW5lcmF0b3IucG9seW5vbSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnBvbHlub20gPSAoYmNtb2x0X3ByYnNfcG9seW5vbWlhbCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX2dlbmVyYXRvci5wb2x5bm9tIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfZ2VuZXJhdG9yLmVycm9yX2luc2VydCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmVycm9yX2luc2VydCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByYnNfZ2VuZXJhdG9yLmVycm9yX2luc2VydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX2dlbmVyYXRvci5pbnZlcnQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pbnZlcnQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX2dlbmVyYXRvci5pbnZlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19nZW5lcmF0b3IuY29udHJvbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNvbnRyb2wgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19nZW5lcmF0b3IuY29udHJvbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcGF0aF8xZ19kcywgcHJic19nZW5lcmF0b3IsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX0RTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19DRkdfSURfUFJCU19HRU5FUkFUT1IsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIHByYnNfZ2VuZXJhdG9yLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19nZW5lcmF0b3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3BhdGhfMWdfZHMsIHByYnNfZ2VuZXJhdG9yKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xZ19kcywgcHJic19nZW5lcmF0b3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xZ19kcywgZGVmYXVsdF9mZWNfc3RhdGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX3BhdGhfMWdfZHMsIHJhbWFuX21vZGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX3BhdGhfMWdfZHMsIHR1cmJvXzJnX21vZGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX3BhdGhfMWdfZHMsIHByYnNfZ2VuZXJhdG9yKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xZ19kcywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3BhdGhfMWdfZHMsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdCBzdGF0OyAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vc19ib29sIGNsZWFyX29uX3JlYWQ7ICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlICdjbGVhciBvbiByZWFkJyBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXQgc3RhdDtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGNsZWFyX29uX3JlYWQ7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX0RTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IGZsYWdzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2xlYXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNsZWFyX29uX3JlYWQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2xlYXIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiY2xlYXJfb25fcmVhZCA9ICVzO1xuIiwgKGNsZWFyX29uX3JlYWQpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX1NUQVRfSU5JVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0lOSVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGJ5dGVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGJ5dGVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfNjQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfNjQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzY0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfNjVfMTI3Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzY1XzEyNyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfNjVfMTI3KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfMTI4XzI1NSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc18xMjhfMjU1KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc18xMjhfMjU1KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfMjU2XzUxMSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc18yNTZfNTExKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc18yNTZfNTExKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfNTEyXzEwMjMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfNTEyXzEwMjMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzUxMl8xMDIzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfMTAyNF8xNTE4Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzEwMjRfMTUxOCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfMTAyNF8xNTE4KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfMTUxOV8yMDQ3Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzE1MTlfMjA0Nyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfMTUxOV8yMDQ3KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfMjA0OF80MDk1Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzIwNDhfNDA5NSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfMjA0OF80MDk1KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfNDA5Nl85MjE2Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzQwOTZfOTIxNik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfNDA5Nl85MjE2KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmFtZXNfOTIxN18xNjM4MyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc185MjE3XzE2MzgzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc185MjE3XzE2MzgzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJicm9hZGNhc3RfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgYnJvYWRjYXN0X2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBicm9hZGNhc3RfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkYXRhX2J5dGVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgZGF0YV9ieXRlcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBkYXRhX2J5dGVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtdWx0aWNhc3RfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgbXVsdGljYXN0X2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBtdWx0aWNhc3RfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1bmljYXN0X2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIHVuaWNhc3RfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIHVuaWNhc3RfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvYW1fYnl0ZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBvYW1fYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgb2FtX2J5dGVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvYW1fZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgb2FtX2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBvYW1fZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnYXRlX2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGdhdGVfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGdhdGVfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtcGNwX2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIG1wY3BfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIG1wY3BfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhYm9ydF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBhYm9ydF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgYWJvcnRfZnJhbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBieXRlcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc182NCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc182NV8xMjcpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfMTI4XzI1NSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc18yNTZfNTExKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzUxMl8xMDIzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzEwMjRfMTUxOCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc18xNTE5XzIwNDcpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfMjA0OF80MDk1KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzQwOTZfOTIxNikgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc185MjE3XzE2MzgzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgYnJvYWRjYXN0X2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGRhdGFfYnl0ZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBtdWx0aWNhc3RfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgdW5pY2FzdF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBvYW1fYnl0ZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBvYW1fZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xZ19kcywgZ2F0ZV9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBtcGNwX2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGFib3J0X2ZyYW1lcykpCisgICAgeworICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX2RzLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfZHMsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfZ2V0KGRldmljZV9pZCwgJnN0YXQuaGRyLCBjbGVhcl9vbl9yZWFkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9nZXQoZGV2aWNlX2lkLCAmc3RhdC5oZHIsIGNsZWFyX29uX3JlYWQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmc3RhdC5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0Lmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmcgc3RhdF9jZmc7ICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5IGtleSA9IHsgfTsgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9pZCBzdGF0X2lkOyAgICAgLyoqPCBkZWNsYXJlIHN0YXQgSUQgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgc3dpdGNoIChzdGF0X2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU182NDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfNjQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzY0LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzY1XzEyNzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfNjVfMTI3LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc182NV8xMjcsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfMTI4XzI1NSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfMTI4XzI1NSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc18yNTZfNTExLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc18yNTZfNTExLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc181MTJfMTAyMywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfNTEyXzEwMjMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc18xMDI0XzE1MTgsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzEwMjRfMTUxOCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDc6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzE1MTlfMjA0Nywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfMTUxOV8yMDQ3LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfMjA0OF80MDk1LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc18yMDQ4XzQwOTUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc180MDk2XzkyMTYsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzQwOTZfOTIxNiwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc185MjE3XzE2MzgzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc185MjE3XzE2MzgzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBicm9hZGNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGJyb2FkY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9EQVRBX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGRhdGFfYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgZGF0YV9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgbXVsdGljYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBtdWx0aWNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgdW5pY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgdW5pY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9PQU1fQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgb2FtX2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIG9hbV9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX09BTV9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgb2FtX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBvYW1fZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfR0FURV9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgZ2F0ZV9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgZ2F0ZV9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9NUENQX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBtcGNwX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBtcGNwX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0FCT1JUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBhYm9ydF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgYWJvcnRfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXRfY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmcgc3RhdF9jZmc7ICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5IGtleSA9IHsgfTsgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9pZCBzdGF0X2lkOyAgICAgLyoqPCBkZWNsYXJlIHN0YXQgSUQgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgc3dpdGNoIChzdGF0X2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU182NDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfNjQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzY0LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzY1XzEyNzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfNjVfMTI3LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc182NV8xMjcsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfMTI4XzI1NSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfMTI4XzI1NSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc18yNTZfNTExLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc18yNTZfNTExLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc181MTJfMTAyMywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfNTEyXzEwMjMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc18xMDI0XzE1MTgsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzEwMjRfMTUxOCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDc6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzE1MTlfMjA0Nywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfMTUxOV8yMDQ3LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBmcmFtZXNfMjA0OF80MDk1LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc18yMDQ4XzQwOTUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc180MDk2XzkyMTYsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgZnJhbWVzXzQwOTZfOTIxNiwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc185MjE3XzE2MzgzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGZyYW1lc185MjE3XzE2MzgzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBicm9hZGNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGJyb2FkY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9EQVRBX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGRhdGFfYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgZGF0YV9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgbXVsdGljYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBtdWx0aWNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgdW5pY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgdW5pY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9PQU1fQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgb2FtX2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIG9hbV9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX09BTV9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgb2FtX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBvYW1fZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfR0FURV9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgZ2F0ZV9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgZ2F0ZV9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9NUENQX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBtcGNwX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBtcGNwX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0FCT1JUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBhYm9ydF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ19kcywgYWJvcnRfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy50cmlnZ2VyLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci50eXBlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci50eXBlID0gKGJjbW9sdF9zdGF0X2NvbmRpdGlvbl90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnR5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoICh2YWwudHJpZ2dlci50eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIucmlzaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLnJpc2luZyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIucmlzaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuZmFsbGluZyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3RocmVzaG9sZC5mYWxsaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5mYWxsaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfUkFOR0U6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIudXBwZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV9yYW5nZS51cHBlciA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudXBwZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5sb3dlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLmxvd2VyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5sb3dlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9WQUxVRV9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIubGltaXQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUudmFsdWVfdGhyZXNob2xkLmxpbWl0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5saW1pdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy5zb2FrLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcuc29hay5hY3RpdmVfc29ha190aW1lIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuc29hay5hY3RpdmVfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcuc29hay5jbGVhcl9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmNsZWFyX3NvYWtfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hay5jbGVhcl9zb2FrX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hayBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGNmZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19EUywgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgMCwgQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0NGR19JRF9DRkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX1BST1BfU0VUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX2RzLCBjZmcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdF9jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZyBhdXRvX2NmZzsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkga2V5ID0geyB9OyAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX2dldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzFnX2RzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzFnX2RzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fY2xlYXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xZ19kcywgc3RhdF9hbGFybV9jbGVhcmVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xZ19kcywgc3RhdF9hbGFybV9jbGVhcmVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xZ19kcywgc3RhdF9hbGFybV9yYWlzZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzFnX2RzLCBzdGF0X2FsYXJtX3JhaXNlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzFnX2RzLCBzdGF0X2FsYXJtX2NsZWFyZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIHN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xZ19kcywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmF1dG9fY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmcgYXV0b19jZmc7ICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5IGtleSA9IHsgfTsgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19zZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xZ19kcywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xZ19kcywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX2NsZWFyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMWdfZHMsIHN0YXRfYWxhcm1fY2xlYXJlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzFnX2RzLCBzdGF0X2FsYXJtX2NsZWFyZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX0RTLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fcmFpc2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzFnX2RzLCBzdGF0X2FsYXJtX3JhaXNlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzFnX2RzLCBzdGF0X2FsYXJtX3JhaXNlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfRFMsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fcGF0aF8xZ191c19jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnIGNmZzsgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fcGF0aF8xZ191cywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWZhdWx0X2ZlY19zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9wYXRoXzFnX3VzLCBkZWZhdWx0X2ZlY19zdGF0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcGF0aF8xZ191cywgZGVmYXVsdF9mZWNfc3RhdGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN5bmNfdGltZV90cSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9wYXRoXzFnX3VzLCBzeW5jX3RpbWVfdHEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIHN5bmNfdGltZV90cSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19jaGVja2VyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIHByYnNfY2hlY2tlcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcGF0aF8xZ191cywgcHJic19jaGVja2VyKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX3N0YXR1cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9wYXRoXzFnX3VzLCBwcmJzX3N0YXR1cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcGF0aF8xZ191cywgcHJic19zdGF0dXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9wYXRoXzFnX3VzLCBkZWZhdWx0X2ZlY19zdGF0ZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9wYXRoXzFnX3VzLCBzeW5jX3RpbWVfdHEpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fcGF0aF8xZ191cywgcHJic19jaGVja2VyKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIHByYnNfc3RhdHVzKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9wYXRoXzFnX3VzLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9wYXRoXzFnX3VzLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzFnX3VzX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fcGF0aF8xZ191cywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9wYXRoXzFnX3VzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlZmF1bHRfZmVjX3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2Vwb25fZmVjX2VuX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzFnX3VzLCBkZWZhdWx0X2ZlY19zdGF0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGRlZmF1bHRfZmVjX3N0YXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQ0ZHX0lEX0RFRkFVTFRfRkVDX1NUQVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3luY190aW1lX3RxIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdGltZV9xdWFudGEgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIHN5bmNfdGltZV90cSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIHN5bmNfdGltZV90cSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0NGR19JRF9TWU5DX1RJTUVfVFEsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicHJic19jaGVja2VyLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfY2hlY2tlci5wb2x5bm9tIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucG9seW5vbSA9IChiY21vbHRfcHJic19wb2x5bm9taWFsKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19jaGVja2VyLnBvbHlub20gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2NoZWNrZXIubW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1vZGUgPSAoYmNtb2x0X3ByYnNfY2hlY2tlcl9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19jaGVja2VyLm1vZGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2NoZWNrZXIuZGF0YV9pbnZlcnQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kYXRhX2ludmVydCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19jaGVja2VyLmRhdGFfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19jaGVja2VyLmNvbnRyb2wiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jb250cm9sID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19jaGVja2VyLmNvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIHByYnNfY2hlY2tlciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19DRkdfSURfUFJCU19DSEVDS0VSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzFnX3VzLCBwcmJzX2NoZWNrZXIsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzFnX3VzX2NmZ19jbGVhcihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZyBjZmc7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2NsZWFyIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0tFWV9JRF9FUE9OX05JLCAma2V5LmVwb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fcGF0aF8xZ191cywga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fcGF0aF8xZ191c19jZmdfZ2V0X211bHRpKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0ID0gTlVMTDsgICAgICAgICAvKio8IGRlY2xhcmUgbWVzc2FnZSBzZXQgKi8KKyAgICB1aW50MzJfdCBtYXhfbXNnczsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGZpbHRlciBpbnZlcnQgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0KiBtc2dfc2V0ID0gTlVMTDtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQzMl90IG1heF9tc2dzO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldF9tdWx0aSIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBtYXggbnVtYmVyIG9mIG1zZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhfbXNncyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgbWF4X21zZ3MgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1heF9tc2dzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coIm1heF9tc2dzID0gJWQ7XG4iLCBtYXhfbXNncyk7CisKKyAgICAvKiBzZXQgZmlsdGVyIGludmVydCBmbGFnIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyX2ludmVydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW52ZXJ0X2ZpbHRlciA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXJfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImludmVydF9maWx0ZXIgPSAlcztcbiIsIChpbnZlcnRfZmlsdGVyKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogYWxsb2NhdGUgbWVzc2FnZSBzZXQgKi8KKyAgICBlcnIgPSBhcGljbGlfbXNnX3NldF9hbGxvYyhieXRlX3Bvb2wsIEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fcGF0aF8xZ191cywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZGVmYXVsdF9mZWNfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX2ZlY19lbl9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGRlZmF1bHRfZmVjX3N0YXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcGF0aF8xZ191cywgZGVmYXVsdF9mZWNfc3RhdGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19DRkdfSURfREVGQVVMVF9GRUNfU1RBVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWZhdWx0X2ZlY19zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xZ191cywgZGVmYXVsdF9mZWNfc3RhdGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9wYXRoXzFnX3VzLCBkZWZhdWx0X2ZlY19zdGF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnN5bmNfdGltZV90cSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3RpbWVfcXVhbnRhIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzFnX3VzLCBzeW5jX3RpbWVfdHEsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9wYXRoXzFnX3VzLCBzeW5jX3RpbWVfdHEsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19DRkdfSURfU1lOQ19USU1FX1RRLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3luY190aW1lX3RxIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9wYXRoXzFnX3VzLCBzeW5jX3RpbWVfdHEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9wYXRoXzFnX3VzLCBzeW5jX3RpbWVfdHEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucHJic19jaGVja2VyLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX2NoZWNrZXIucG9seW5vbSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnBvbHlub20gPSAoYmNtb2x0X3ByYnNfcG9seW5vbWlhbCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX2NoZWNrZXIucG9seW5vbSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX2NoZWNrZXIubW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1vZGUgPSAoYmNtb2x0X3ByYnNfY2hlY2tlcl9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByYnNfY2hlY2tlci5tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfY2hlY2tlci5kYXRhX2ludmVydCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRhdGFfaW52ZXJ0ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19jaGVja2VyLmRhdGFfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfY2hlY2tlci5jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY29udHJvbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX2NoZWNrZXIuY29udHJvbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcGF0aF8xZ191cywgcHJic19jaGVja2VyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0NGR19JRF9QUkJTX0NIRUNLRVIsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIHByYnNfY2hlY2tlciwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfY2hlY2tlciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xZ191cywgcHJic19jaGVja2VyKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xZ191cywgcHJic19jaGVja2VyKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnByYnNfc3RhdHVzLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3ByYnNfc3RhdHVzIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19zdGF0dXMubG9ja19zdGF0ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvY2tfc3RhdGUgPSAoYmNtb2x0X3ByYnNfbG9ja19zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX3N0YXR1cy5sb2NrX3N0YXRlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfc3RhdHVzLmVycm9yX2NvdW50cyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmVycm9yX2NvdW50cyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX3N0YXR1cy5lcnJvcl9jb3VudHMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIHByYnNfc3RhdHVzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3ByYnNfc3RhdHVzIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19DRkdfSURfUFJCU19TVEFUVVMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIHByYnNfc3RhdHVzLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19zdGF0dXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3BhdGhfMWdfdXMsIHByYnNfc3RhdHVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xZ191cywgcHJic19zdGF0dXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xZ191cywgZGVmYXVsdF9mZWNfc3RhdGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX3BhdGhfMWdfdXMsIHN5bmNfdGltZV90cSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fcGF0aF8xZ191cywgcHJic19jaGVja2VyKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9wYXRoXzFnX3VzLCBwcmJzX3N0YXR1cykpCisgICAgeworICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3BhdGhfMWdfdXMsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9wYXRoXzFnX3VzLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fcGF0aF8xZ191c19zdGF0X2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXQgc3RhdDsgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb3NfYm9vbCBjbGVhcl9vbl9yZWFkOyAgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSAnY2xlYXIgb24gcmVhZCcgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0IHN0YXQ7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBjbGVhcl9vbl9yZWFkO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBmbGFncyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNsZWFyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBjbGVhcl9vbl9yZWFkID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNsZWFyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImNsZWFyX29uX3JlYWQgPSAlcztcbiIsIChjbGVhcl9vbl9yZWFkKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9TVEFUX0lOSVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9JTklUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYnl0ZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBieXRlcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBieXRlcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzY0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzY0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc182NCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzY1XzEyNyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc182NV8xMjcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzY1XzEyNyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzEyOF8yNTUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfMTI4XzI1NSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfMTI4XzI1NSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzI1Nl81MTEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfMjU2XzUxMSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfMjU2XzUxMSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzUxMl8xMDIzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzUxMl8xMDIzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc181MTJfMTAyMyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzEwMjRfMTUxOCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc18xMDI0XzE1MTgpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzEwMjRfMTUxOCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzE1MTlfMjA0NyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc18xNTE5XzIwNDcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzE1MTlfMjA0Nyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzIwNDhfNDA5NSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc18yMDQ4XzQwOTUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzIwNDhfNDA5NSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzQwOTZfOTIxNiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc180MDk2XzkyMTYpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzQwOTZfOTIxNik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJhbWVzXzkyMTdfMTYzODMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfOTIxN18xNjM4Myk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfOTIxN18xNjM4Myk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYnJvYWRjYXN0X2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGJyb2FkY2FzdF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgYnJvYWRjYXN0X2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGF0YV9ieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGRhdGFfYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgZGF0YV9ieXRlcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXVsdGljYXN0X2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIG11bHRpY2FzdF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgbXVsdGljYXN0X2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidW5pY2FzdF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCB1bmljYXN0X2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCB1bmljYXN0X2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXBjcF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBtcGNwX2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBtcGNwX2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib2FtX2J5dGVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgb2FtX2J5dGVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIG9hbV9ieXRlcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib2FtX2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIG9hbV9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgb2FtX2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmVwb3J0X2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIHJlcG9ydF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgcmVwb3J0X2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWJvcnRfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgYWJvcnRfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGFib3J0X2ZyYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmNzX2Vycm9yIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgZmNzX2Vycm9yKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGZjc19lcnJvcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY3JjXzhfZXJyb3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBjcmNfOF9lcnJvcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBjcmNfOF9lcnJvcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib3V0X29mX3Nsb3QiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBvdXRfb2Zfc2xvdCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBvdXRfb2Zfc2xvdCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib3ZlcnNpemVfZXJyb3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBvdmVyc2l6ZV9lcnJvcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBvdmVyc2l6ZV9lcnJvcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnVudF9lcnJvciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIHJ1bnRfZXJyb3IpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgcnVudF9lcnJvcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgYnl0ZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfNjQpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfNjVfMTI3KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzEyOF8yNTUpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfMjU2XzUxMSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc181MTJfMTAyMykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc18xMDI0XzE1MTgpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfMTUxOV8yMDQ3KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzIwNDhfNDA5NSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc180MDk2XzkyMTYpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfOTIxN18xNjM4MykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGJyb2FkY2FzdF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBkYXRhX2J5dGVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgbXVsdGljYXN0X2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIHVuaWNhc3RfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgbXBjcF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBvYW1fYnl0ZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBvYW1fZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgcmVwb3J0X2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGFib3J0X2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGZjc19lcnJvcikgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIGNyY184X2Vycm9yKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgb3V0X29mX3Nsb3QpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBvdmVyc2l6ZV9lcnJvcikgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBlcG9uX3BhdGhfMWdfdXMsIHJ1bnRfZXJyb3IpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGVwb25fcGF0aF8xZ191cywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZXBvbl9wYXRoXzFnX3VzLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfZ2V0KGRldmljZV9pZCwgJnN0YXQuaGRyLCBjbGVhcl9vbl9yZWFkKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXQuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdC5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnIHN0YXRfY2ZnOyAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleSBrZXkgPSB7IH07ICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWQgc3RhdF9pZDsgICAgIC8qKjwgZGVjbGFyZSBzdGF0IElEICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnIHN0YXRfY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmVwb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IElEIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBzdGF0X2lkID0gKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIHN3aXRjaCAoc3RhdF9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGJ5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGJ5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfNjQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzY0LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc182NCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU182NV8xMjc6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzY1XzEyNywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfNjVfMTI3LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzEyOF8yNTUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzEyOF8yNTUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfMjU2XzUxMSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfMjU2XzUxMSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfNTEyXzEwMjMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzUxMl8xMDIzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxODoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfMTAyNF8xNTE4LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc18xMDI0XzE1MTgsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc18xNTE5XzIwNDcsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzE1MTlfMjA0Nywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzIwNDhfNDA5NSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfMjA0OF80MDk1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfNDA5Nl85MjE2LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc180MDk2XzkyMTYsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfOTIxN18xNjM4Mywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfOTIxN18xNjM4Mywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgYnJvYWRjYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBicm9hZGNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfREFUQV9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBkYXRhX2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGRhdGFfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIG11bHRpY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgbXVsdGljYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIHVuaWNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIHVuaWNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfTVBDUF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgbXBjcF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgbXBjcF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9PQU1fQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgb2FtX2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIG9hbV9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX09BTV9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgb2FtX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBvYW1fZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfUkVQT1JUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCByZXBvcnRfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIHJlcG9ydF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9BQk9SVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgYWJvcnRfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGFib3J0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZDU19FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBmY3NfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZmNzX2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfQ1JDXzhfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgY3JjXzhfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgY3JjXzhfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9PVVRfT0ZfU0xPVDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBvdXRfb2Zfc2xvdCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBvdXRfb2Zfc2xvdCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX09WRVJTSVpFX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIG92ZXJzaXplX2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIG92ZXJzaXplX2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfUlVOVF9FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBydW50X2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIHJ1bnRfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmc3RhdF9jZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdF9jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZyBzdGF0X2NmZzsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkga2V5ID0geyB9OyAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2lkIHN0YXRfaWQ7ICAgICAvKio8IGRlY2xhcmUgc3RhdCBJRCAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZyBzdGF0X2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBJRCBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc3RhdF9pZCA9IChiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBzd2l0Y2ggKHN0YXRfaWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzY0OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc182NCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfNjQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc182NV8xMjcsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzY1XzEyNywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc18xMjhfMjU1LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc18xMjhfMjU1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTE6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzI1Nl81MTEsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzI1Nl81MTEsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzUxMl8xMDIzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc181MTJfMTAyMywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTg6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzEwMjRfMTUxOCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfMTAyNF8xNTE4LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfMTUxOV8yMDQ3LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc18xNTE5XzIwNDcsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGZyYW1lc18yMDQ4XzQwOTUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzIwNDhfNDA5NSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTY6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzQwOTZfOTIxNiwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBmcmFtZXNfNDA5Nl85MjE2LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzkyMTdfMTYzODMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZnJhbWVzXzkyMTdfMTYzODMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGJyb2FkY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgYnJvYWRjYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0RBVEFfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZGF0YV9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBkYXRhX2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBtdWx0aWNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIG11bHRpY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCB1bmljYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCB1bmljYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX01QQ1BfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIG1wY3BfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIG1wY3BfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfT0FNX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIG9hbV9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBvYW1fYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9PQU1fRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIG9hbV9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgb2FtX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX1JFUE9SVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgcmVwb3J0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCByZXBvcnRfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfQUJPUlRfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGFib3J0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBhYm9ydF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GQ1NfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgZmNzX2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGZjc19lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0NSQ184X0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGNyY184X2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGNyY184X2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfT1VUX09GX1NMT1Q6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgb3V0X29mX3Nsb3QsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgb3V0X29mX3Nsb3QsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9PVkVSU0laRV9FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBvdmVyc2l6ZV9lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBvdmVyc2l6ZV9lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX1JVTlRfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGVwb25fcGF0aF8xZ191cywgcnVudF9lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBydW50X2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy50cmlnZ2VyLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci50eXBlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci50eXBlID0gKGJjbW9sdF9zdGF0X2NvbmRpdGlvbl90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnR5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoICh2YWwudHJpZ2dlci50eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIucmlzaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLnJpc2luZyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIucmlzaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuZmFsbGluZyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3RocmVzaG9sZC5mYWxsaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5mYWxsaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfUkFOR0U6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIudXBwZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV9yYW5nZS51cHBlciA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudXBwZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5sb3dlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLmxvd2VyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5sb3dlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9WQUxVRV9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIubGltaXQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUudmFsdWVfdGhyZXNob2xkLmxpbWl0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5saW1pdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy5zb2FrLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcuc29hay5hY3RpdmVfc29ha190aW1lIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuc29hay5hY3RpdmVfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcuc29hay5jbGVhcl9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmNsZWFyX3NvYWtfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hay5jbGVhcl9zb2FrX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hayBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGNmZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19VUywgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgMCwgQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0NGR19JRF9DRkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX1BST1BfU0VUKCZzdGF0X2NmZywgZXBvbl9wYXRoXzFnX3VzLCBjZmcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdF9jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZyBhdXRvX2NmZzsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkga2V5ID0geyB9OyAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX2dldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzFnX3VzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzFnX3VzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fY2xlYXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xZ191cywgc3RhdF9hbGFybV9jbGVhcmVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xZ191cywgc3RhdF9hbGFybV9jbGVhcmVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xZ191cywgc3RhdF9hbGFybV9yYWlzZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzFnX3VzLCBzdGF0X2FsYXJtX3JhaXNlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzFnX3VzLCBzdGF0X2FsYXJtX2NsZWFyZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIHN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xZ191cywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmF1dG9fY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmcgYXV0b19jZmc7ICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5IGtleSA9IHsgfTsgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19zZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xZ191cywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGVwb25fcGF0aF8xZ191cywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX2NsZWFyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBlcG9uX3BhdGhfMWdfdXMsIHN0YXRfYWxhcm1fY2xlYXJlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzFnX3VzLCBzdGF0X2FsYXJtX2NsZWFyZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX1VTLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fcmFpc2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzFnX3VzLCBzdGF0X2FsYXJtX3JhaXNlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZXBvbl9wYXRoXzFnX3VzLCBzdGF0X2FsYXJtX3JhaXNlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfVVMsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fcnBfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9ycF9jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZXBvbl9ycF9rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3JwX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9ycF9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUlAsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9SUF9LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxpbmtfcmF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmxpbmtfcmF0ZSA9IChiY21vbHRfZXBvbl9saW5rX3JhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImxpbmtfcmF0ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkubGlua19yYXRlID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUlAsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9SUF9LRVlfSURfTElOS19SQVRFLCAma2V5LmxpbmtfcmF0ZSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fcnAsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGVwb25fcnAsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmFzZV9sbGlkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3JwLCBiYXNlX2xsaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3JwLCBiYXNlX2xsaWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1wY3BfZGlzY19lbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9ycCwgbXBjcF9kaXNjX2VuKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9ycCwgbXBjcF9kaXNjX2VuKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtcGNwX2Rpc2NfZ250X2xlbl90cSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9ycCwgbXBjcF9kaXNjX2dudF9sZW5fdHEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3JwLCBtcGNwX2Rpc2NfZ250X2xlbl90cSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXBjcF9yZXBvcnRfdGltZW91dCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9ycCwgbXBjcF9yZXBvcnRfdGltZW91dCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcnAsIG1wY3BfcmVwb3J0X3RpbWVvdXQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1heF9tcGNwX3JlZ19wZXJfZGlzY193aW5kb3ciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcnAsIG1heF9tcGNwX3JlZ19wZXJfZGlzY193aW5kb3cpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBlcG9uX3JwLCBtYXhfbXBjcF9yZWdfcGVyX2Rpc2Nfd2luZG93KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhfbGlua3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcnAsIG1heF9saW5rcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcnAsIG1heF9saW5rcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcnAsIGRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9ycCwgZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhdGVfb2ZfcmVmcmFjdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9ycCwgcmF0ZV9vZl9yZWZyYWN0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9ycCwgcmF0ZV9vZl9yZWZyYWN0aW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGVwb25fcnAsIGJhc2VfbGxpZCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9ycCwgbXBjcF9kaXNjX2VuKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX3JwLCBtcGNwX2Rpc2NfZ250X2xlbl90cSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9ycCwgbXBjcF9yZXBvcnRfdGltZW91dCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9ycCwgbWF4X21wY3BfcmVnX3Blcl9kaXNjX3dpbmRvdykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9ycCwgbWF4X2xpbmtzKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBlcG9uX3JwLCBkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZXBvbl9ycCwgcmF0ZV9vZl9yZWZyYWN0aW9uKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9ycCwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGVwb25fcnAsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9lcG9uX3JwX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fcnBfY2ZnIGNmZzsgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fcnBfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9ycF9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcnBfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1JQLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fUlBfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsaW5rX3JhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5saW5rX3JhdGUgPSAoYmNtb2x0X2Vwb25fbGlua19yYXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJsaW5rX3JhdGUgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmxpbmtfcmF0ZSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1JQLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fUlBfS0VZX0lEX0xJTktfUkFURSwgJmtleS5saW5rX3JhdGUpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3JwLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3JwLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJhc2VfbGxpZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fbGxpZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZXBvbl9sbGlkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3JwLCBiYXNlX2xsaWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9ycCwgYmFzZV9sbGlkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUlAsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9SUF9DRkdfSURfQkFTRV9MTElELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXBjcF9kaXNjX2VuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3JwLCBtcGNwX2Rpc2NfZW4sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9ycCwgbXBjcF9kaXNjX2VuLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUlAsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9SUF9DRkdfSURfTVBDUF9ESVNDX0VOLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXBjcF9kaXNjX2dudF9sZW5fdHEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF90aW1lX3F1YW50YSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcnAsIG1wY3BfZGlzY19nbnRfbGVuX3RxLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcnAsIG1wY3BfZGlzY19nbnRfbGVuX3RxLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUlAsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9SUF9DRkdfSURfTVBDUF9ESVNDX0dOVF9MRU5fVFEsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtcGNwX3JlcG9ydF90aW1lb3V0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MTZfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcnAsIG1wY3BfcmVwb3J0X3RpbWVvdXQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9ycCwgbXBjcF9yZXBvcnRfdGltZW91dCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1JQLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01QQ1BfUkVQT1JUX1RJTUVPVVQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhfbXBjcF9yZWdfcGVyX2Rpc2Nfd2luZG93Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MTZfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcnAsIG1heF9tcGNwX3JlZ19wZXJfZGlzY193aW5kb3csIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9ycCwgbWF4X21wY3BfcmVnX3Blcl9kaXNjX3dpbmRvdywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1JQLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01BWF9NUENQX1JFR19QRVJfRElTQ19XSU5ET1csICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhfbGlua3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9ycCwgbWF4X2xpbmtzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcnAsIG1heF9saW5rcywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1JQLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01BWF9MSU5LUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF91cHN0cmVhbV9iYW5kd2lkdGhfZGlzdHJpYnV0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5wb2xsaW5nX2ludGVydmFsX3VzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucG9sbGluZ19pbnRlcnZhbF91cyA9IChiY21vbHRfcG9sbGluZ19pbnRlcnZhbCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLnBvbGxpbmdfaW50ZXJ2YWxfdXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5ncmFudF90aHJlc2hvbGRfdHEiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5ncmFudF90aHJlc2hvbGRfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5ncmFudF90aHJlc2hvbGRfdHEgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgubWluX3NjaGVkdWxlcnNoYXBlci4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgubWluX3NjaGVkdWxlcnNoYXBlci5iYW5kd2lkdGhfS2JwcyIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLm1pbl9zY2hlZHVsZXJzaGFwZXIuYmFuZHdpZHRoX0ticHMgPSAoYmNtb2x0X2JhbmR3aWR0aF9LYnBzKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgubWluX3NjaGVkdWxlcnNoYXBlci5iYW5kd2lkdGhfS2JwcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLm1pbl9zY2hlZHVsZXJzaGFwZXIubWF4X2J1cnN0X3NpemVfdHEiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5taW5fc2NoZWR1bGVyc2hhcGVyLm1heF9idXJzdF9zaXplX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLm1pbl9zY2hlZHVsZXJzaGFwZXIubWF4X2J1cnN0X3NpemVfdHEgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyLnByaW9yaXR5Iik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwubWluX3NjaGVkdWxlcnNoYXBlci5wcmlvcml0eSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyLnByaW9yaXR5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgubWluX3NjaGVkdWxlcnNoYXBlci53ZWlnaHRfdHEiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5taW5fc2NoZWR1bGVyc2hhcGVyLndlaWdodF90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyLndlaWdodF90cSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLm1pbl9zY2hlZHVsZXJzaGFwZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci5iYW5kd2lkdGhfS2JwcyIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLm1heF9zY2hlZHVsZXJzaGFwZXIuYmFuZHdpZHRoX0ticHMgPSAoYmNtb2x0X2JhbmR3aWR0aF9LYnBzKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci5iYW5kd2lkdGhfS2JwcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLm1heF9zY2hlZHVsZXJzaGFwZXIubWF4X2J1cnN0X3NpemVfdHEiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5tYXhfc2NoZWR1bGVyc2hhcGVyLm1heF9idXJzdF9zaXplX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLm1heF9zY2hlZHVsZXJzaGFwZXIubWF4X2J1cnN0X3NpemVfdHEgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5tYXhfc2NoZWR1bGVyc2hhcGVyLnByaW9yaXR5Iik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwubWF4X3NjaGVkdWxlcnNoYXBlci5wcmlvcml0eSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5tYXhfc2NoZWR1bGVyc2hhcGVyLnByaW9yaXR5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci53ZWlnaHRfdHEiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5tYXhfc2NoZWR1bGVyc2hhcGVyLndlaWdodF90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5tYXhfc2NoZWR1bGVyc2hhcGVyLndlaWdodF90cSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLm1heF9zY2hlZHVsZXJzaGFwZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC50ZG1fZ3JhbnRfc2l6ZV90cSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRkbV9ncmFudF9zaXplX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgudGRtX2dyYW50X3NpemVfdHEgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC50ZG1fZ3JhbnRfaW50ZXJ2YWxfdXMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50ZG1fZ3JhbnRfaW50ZXJ2YWxfdXMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC50ZG1fZ3JhbnRfaW50ZXJ2YWxfdXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3JwLCBkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF91cHN0cmVhbV9iYW5kd2lkdGhfZGlzdHJpYnV0aW9uIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9SUCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX1JQX0NGR19JRF9ERUZBVUxUX1VQU1RSRUFNX0JBTkRXSURUSCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcnAsIGRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmF0ZV9vZl9yZWZyYWN0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBkb3VibGUgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUuZDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3JwLCByYXRlX29mX3JlZnJhY3Rpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9ycCwgcmF0ZV9vZl9yZWZyYWN0aW9uLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUlAsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9SUF9DRkdfSURfUkFURV9PRl9SRUZSQUNUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2Vwb25fcnBfY2ZnX2NsZWFyKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9lcG9uX3JwX2NmZyBjZmc7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9lcG9uX3JwX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcnBfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9lcG9uX3JwX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2NsZWFyIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZXBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZXBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1JQLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fUlBfS0VZX0lEX0VQT05fTkksICZrZXkuZXBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsaW5rX3JhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5saW5rX3JhdGUgPSAoYmNtb2x0X2Vwb25fbGlua19yYXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJsaW5rX3JhdGUgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmxpbmtfcmF0ZSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1JQLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0VQT05fUlBfS0VZX0lEX0xJTktfUkFURSwgJmtleS5saW5rX3JhdGUpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3JwLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3JwLCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZXBvbl9ycF9jZmdfZ2V0X211bHRpKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fcnBfY2ZnIGNmZzsgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2Vwb25fcnBfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X21zZ19zZXQgKm1zZ19zZXQgPSBOVUxMOyAvKio8IGRlY2xhcmUgbWVzc2FnZSBzZXQgKi8KKyAgICB1aW50MzJfdCBtYXhfbXNnczsgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYXggbnVtYmVyIG9mIG1zZ3MgdG8gZ2V0ICovCisgICAgYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyOyAgICAgICAvKio8IGRlY2xhcmUgZmlsdGVyIGludmVydCBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZXBvbl9ycF9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Vwb25fcnBfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldCogbXNnX3NldCA9IE5VTEw7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50MzJfdCBtYXhfbXNncztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXRfbXVsdGkiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlcG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5lcG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUlAsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9SUF9LRVlfSURfRVBPTl9OSSwgJmtleS5lcG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxpbmtfcmF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmxpbmtfcmF0ZSA9IChiY21vbHRfZXBvbl9saW5rX3JhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImxpbmtfcmF0ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkubGlua19yYXRlID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUlAsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfRVBPTl9SUF9LRVlfSURfTElOS19SQVRFLCAma2V5LmxpbmtfcmF0ZSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX0VQT05fUlAsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXRfYWxsb2MoQkNNT0xUX09CSl9JRF9FUE9OX1JQLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3JwLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBlcG9uX3JwLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5iYXNlX2xsaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX2xsaWQgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2Vwb25fbGxpZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9ycCwgYmFzZV9sbGlkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcnAsIGJhc2VfbGxpZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1JQLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX0JBU0VfTExJRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJhc2VfbGxpZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcnAsIGJhc2VfbGxpZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3JwLCBiYXNlX2xsaWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5tcGNwX2Rpc2NfZW4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcnAsIG1wY3BfZGlzY19lbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3JwLCBtcGNwX2Rpc2NfZW4sICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9SUCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX1JQX0NGR19JRF9NUENQX0RJU0NfRU4sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtcGNwX2Rpc2NfZW4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3JwLCBtcGNwX2Rpc2NfZW4pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9ycCwgbXBjcF9kaXNjX2VuKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubXBjcF9kaXNjX2dudF9sZW5fdHEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF90aW1lX3F1YW50YSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcnAsIG1wY3BfZGlzY19nbnRfbGVuX3RxLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcnAsIG1wY3BfZGlzY19nbnRfbGVuX3RxLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUlAsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9SUF9DRkdfSURfTVBDUF9ESVNDX0dOVF9MRU5fVFEsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtcGNwX2Rpc2NfZ250X2xlbl90cSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcnAsIG1wY3BfZGlzY19nbnRfbGVuX3RxKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcnAsIG1wY3BfZGlzY19nbnRfbGVuX3RxKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubXBjcF9yZXBvcnRfdGltZW91dCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDE2X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3JwLCBtcGNwX3JlcG9ydF90aW1lb3V0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcnAsIG1wY3BfcmVwb3J0X3RpbWVvdXQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfRVBPTl9SUCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9FUE9OX1JQX0NGR19JRF9NUENQX1JFUE9SVF9USU1FT1VULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXBjcF9yZXBvcnRfdGltZW91dCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcnAsIG1wY3BfcmVwb3J0X3RpbWVvdXQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9ycCwgbXBjcF9yZXBvcnRfdGltZW91dCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm1heF9tcGNwX3JlZ19wZXJfZGlzY193aW5kb3ciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9ycCwgbWF4X21wY3BfcmVnX3Blcl9kaXNjX3dpbmRvdywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3JwLCBtYXhfbXBjcF9yZWdfcGVyX2Rpc2Nfd2luZG93LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUlAsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9SUF9DRkdfSURfTUFYX01QQ1BfUkVHX1BFUl9ESVNDX1dJTkRPVywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1heF9tcGNwX3JlZ19wZXJfZGlzY193aW5kb3ciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3JwLCBtYXhfbXBjcF9yZWdfcGVyX2Rpc2Nfd2luZG93KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcnAsIG1heF9tcGNwX3JlZ19wZXJfZGlzY193aW5kb3cpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5tYXhfbGlua3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9ycCwgbWF4X2xpbmtzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcnAsIG1heF9saW5rcywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1JQLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01BWF9MSU5LUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1heF9saW5rcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcnAsIG1heF9saW5rcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX3JwLCBtYXhfbGlua3MpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGguIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdXBzdHJlYW1fYmFuZHdpZHRoX2Rpc3RyaWJ1dGlvbiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLnBvbGxpbmdfaW50ZXJ2YWxfdXMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wb2xsaW5nX2ludGVydmFsX3VzID0gKGJjbW9sdF9wb2xsaW5nX2ludGVydmFsKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLnBvbGxpbmdfaW50ZXJ2YWxfdXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGguZ3JhbnRfdGhyZXNob2xkX3RxIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZ3JhbnRfdGhyZXNob2xkX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLmdyYW50X3RocmVzaG9sZF90cSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgubWluX3NjaGVkdWxlcnNoYXBlci4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLm1pbl9zY2hlZHVsZXJzaGFwZXIuYmFuZHdpZHRoX0ticHMiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5taW5fc2NoZWR1bGVyc2hhcGVyLmJhbmR3aWR0aF9LYnBzID0gKGJjbW9sdF9iYW5kd2lkdGhfS2JwcykgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5kZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyLmJhbmR3aWR0aF9LYnBzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLm1pbl9zY2hlZHVsZXJzaGFwZXIubWF4X2J1cnN0X3NpemVfdHEiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5taW5fc2NoZWR1bGVyc2hhcGVyLm1heF9idXJzdF9zaXplX3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5kZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyLm1heF9idXJzdF9zaXplX3RxIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLm1pbl9zY2hlZHVsZXJzaGFwZXIucHJpb3JpdHkiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5taW5fc2NoZWR1bGVyc2hhcGVyLnByaW9yaXR5ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5kZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5taW5fc2NoZWR1bGVyc2hhcGVyLnByaW9yaXR5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLm1pbl9zY2hlZHVsZXJzaGFwZXIud2VpZ2h0X3RxIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwubWluX3NjaGVkdWxlcnNoYXBlci53ZWlnaHRfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLm1pbl9zY2hlZHVsZXJzaGFwZXIud2VpZ2h0X3RxIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLm1pbl9zY2hlZHVsZXJzaGFwZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLm1heF9zY2hlZHVsZXJzaGFwZXIuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5tYXhfc2NoZWR1bGVyc2hhcGVyLmJhbmR3aWR0aF9LYnBzIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwubWF4X3NjaGVkdWxlcnNoYXBlci5iYW5kd2lkdGhfS2JwcyA9IChiY21vbHRfYmFuZHdpZHRoX0ticHMpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci5iYW5kd2lkdGhfS2JwcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5tYXhfc2NoZWR1bGVyc2hhcGVyLm1heF9idXJzdF9zaXplX3RxIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwubWF4X3NjaGVkdWxlcnNoYXBlci5tYXhfYnVyc3Rfc2l6ZV90cSA9IChiY21vbHRfdGltZV9xdWFudGEpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci5tYXhfYnVyc3Rfc2l6ZV90cSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5tYXhfc2NoZWR1bGVyc2hhcGVyLnByaW9yaXR5Iik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwubWF4X3NjaGVkdWxlcnNoYXBlci5wcmlvcml0eSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgubWF4X3NjaGVkdWxlcnNoYXBlci5wcmlvcml0eSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5tYXhfc2NoZWR1bGVyc2hhcGVyLndlaWdodF90cSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLm1heF9zY2hlZHVsZXJzaGFwZXIud2VpZ2h0X3RxID0gKGJjbW9sdF90aW1lX3F1YW50YSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5kZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5tYXhfc2NoZWR1bGVyc2hhcGVyLndlaWdodF90cSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5kZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aC5tYXhfc2NoZWR1bGVyc2hhcGVyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLnRkbV9ncmFudF9zaXplX3RxIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudGRtX2dyYW50X3NpemVfdHEgPSAoYmNtb2x0X3RpbWVfcXVhbnRhKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgudGRtX2dyYW50X3NpemVfdHEgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgudGRtX2dyYW50X2ludGVydmFsX3VzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudGRtX2dyYW50X2ludGVydmFsX3VzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLnRkbV9ncmFudF9pbnRlcnZhbF91cyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGVwb25fcnAsIGRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9FUE9OX1JQLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX0RFRkFVTFRfVVBTVFJFQU1fQkFORFdJRFRILCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9ycCwgZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcnAsIGRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcnAsIGRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucmF0ZV9vZl9yZWZyYWN0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBkb3VibGUgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUuZDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBlcG9uX3JwLCByYXRlX29mX3JlZnJhY3Rpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZXBvbl9ycCwgcmF0ZV9vZl9yZWZyYWN0aW9uLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0VQT05fUlAsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfRVBPTl9SUF9DRkdfSURfUkFURV9PRl9SRUZSQUNUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmF0ZV9vZl9yZWZyYWN0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9ycCwgcmF0ZV9vZl9yZWZyYWN0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcnAsIHJhdGVfb2ZfcmVmcmFjdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9ycCwgYmFzZV9sbGlkKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9ycCwgbXBjcF9kaXNjX2VuKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9ycCwgbXBjcF9kaXNjX2dudF9sZW5fdHEpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBlcG9uX3JwLCBtcGNwX3JlcG9ydF90aW1lb3V0KSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9ycCwgbWF4X21wY3BfcmVnX3Blcl9kaXNjX3dpbmRvdykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fcnAsIG1heF9saW5rcykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGVwb25fcnAsIGRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZXBvbl9ycCwgcmF0ZV9vZl9yZWZyYWN0aW9uKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGVwb25fcnAsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZXBvbl9ycCwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncGlvX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwaW9fY2ZnIGNmZzsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bpb19rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwaW9fY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncGlvX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdwaW9faWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5ncGlvX2lkID0gKGJjbW9sdF9ncGlvX3BpbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZ3Bpb19pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZ3Bpb19pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUElPLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQSU9fS0VZX0lEX0dQSU9fSUQsICZrZXkuZ3Bpb19pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwaW8sIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwaW8sIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGlyZWN0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncGlvLCBkaXJlY3Rpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncGlvLCBkaXJlY3Rpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInZhbHVlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncGlvLCB2YWx1ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwaW8sIHZhbHVlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwaW8sIGRpcmVjdGlvbikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3BpbywgdmFsdWUpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncGlvLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3BpbywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwaW9fY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bpb19jZmcgY2ZnOyAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncGlvX2tleSBrZXkgPSB7IH07ICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bpb19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwaW9fa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ3Bpb19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmdwaW9faWQgPSAoYmNtb2x0X2dwaW9fcGluKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJncGlvX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5ncGlvX2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQSU8sIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BJT19LRVlfSURfR1BJT19JRCwgJmtleS5ncGlvX2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bpbywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bpbywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkaXJlY3Rpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncGlvX3Bpbl9kaXIgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2dwaW9fcGluX2RpcikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwaW8sIGRpcmVjdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncGlvLCBkaXJlY3Rpb24sICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BJTywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUElPX0NGR19JRF9ESVJFQ1RJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ2YWx1ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwaW9fdmFsdWUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2dwaW9fdmFsdWUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncGlvLCB2YWx1ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncGlvLCB2YWx1ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUElPLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQSU9fQ0ZHX0lEX1ZBTFVFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwaW9fY2ZnX2NsZWFyKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncGlvX2NmZyBjZmc7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwaW9fa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncGlvX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bpb19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19jbGVhciIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdwaW9faWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5ncGlvX2lkID0gKGJjbW9sdF9ncGlvX3BpbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZ3Bpb19pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZ3Bpb19pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUElPLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQSU9fS0VZX0lEX0dQSU9fSUQsICZrZXkuZ3Bpb19pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwaW8sIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwaW8sIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncGlvX2NmZ19nZXRfbXVsdGkoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bpb19jZmcgY2ZnOyAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bpb19rZXkga2V5ID0geyB9OyAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbXNnX3NldCAqbXNnX3NldCA9IE5VTEw7IC8qKjwgZGVjbGFyZSBtZXNzYWdlIHNldCAqLworICAgIHVpbnQzMl90IG1heF9tc2dzOyAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgIC8qKjwgZGVjbGFyZSBmaWx0ZXIgaW52ZXJ0IGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncGlvX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bpb19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0KiBtc2dfc2V0ID0gTlVMTDtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQzMl90IG1heF9tc2dzO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldF9tdWx0aSIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdwaW9faWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5ncGlvX2lkID0gKGJjbW9sdF9ncGlvX3BpbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZ3Bpb19pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZ3Bpb19pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUElPLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQSU9fS0VZX0lEX0dQSU9fSUQsICZrZXkuZ3Bpb19pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX0dQSU8sIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXRfYWxsb2MoQkNNT0xUX09CSl9JRF9HUElPLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncGlvLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncGlvLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kaXJlY3Rpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncGlvX3Bpbl9kaXIgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2dwaW9fcGluX2RpcikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwaW8sIGRpcmVjdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncGlvLCBkaXJlY3Rpb24sICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BJTywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUElPX0NGR19JRF9ESVJFQ1RJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkaXJlY3Rpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncGlvLCBkaXJlY3Rpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3BpbywgZGlyZWN0aW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudmFsdWUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncGlvX3ZhbHVlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9ncGlvX3ZhbHVlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3BpbywgdmFsdWUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3BpbywgdmFsdWUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BJTywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUElPX0NGR19JRF9WQUxVRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInZhbHVlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3BpbywgdmFsdWUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3BpbywgdmFsdWUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwaW8sIGRpcmVjdGlvbikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwaW8sIHZhbHVlKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwaW8sIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3BpbywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX2FsbG9jX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fYWxsb2NfY2ZnIGNmZzsgICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2FsbG9jX2tleSBrZXkgPSB7IH07ICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2FsbG9jX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9hbGxvY19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0FMTE9DX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsbG9jX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuYWxsb2NfaWQgPSAoYmNtb2x0X2dwb25fYWxsb2NfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxsb2NfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmFsbG9jX2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9BTExPQ19LRVlfSURfQUxMT0NfSUQsICZrZXkuYWxsb2NfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2FsbG9jLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2FsbG9jLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2FsbG9jLCBzdGF0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fYWxsb2MsIHN0YXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzbGEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fYWxsb2MsIHNsYSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fYWxsb2MsIHNsYSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2FsbG9jLCBvbnVfaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2FsbG9jLCBvbnVfaWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNvbGxlY3Rfc3RhdHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fYWxsb2MsIGNvbGxlY3Rfc3RhdHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2FsbG9jLCBjb2xsZWN0X3N0YXRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fYWxsb2MsIHN0YXRlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX2FsbG9jLCBzbGEpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fYWxsb2MsIG9udV9pZCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9hbGxvYywgY29sbGVjdF9zdGF0cykpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fYWxsb2MsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2FsbG9jLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9hbGxvY19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2FsbG9jX2NmZyBjZmc7ICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9hbGxvY19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fYWxsb2Nfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9BTExPQ19LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGxvY19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmFsbG9jX2lkID0gKGJjbW9sdF9ncG9uX2FsbG9jX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFsbG9jX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5hbGxvY19pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fQUxMT0NfS0VZX0lEX0FMTE9DX0lELCAma2V5LmFsbG9jX2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9hbGxvYywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9hbGxvYywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAic2xhLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Bvbl9hbGxvY19zbGEgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNsYS5jYnJfcnRfYnciKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jYnJfcnRfYncgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzbGEuY2JyX3J0X2J3IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2xhLmNicl9ucnRfYnciKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jYnJfbnJ0X2J3ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic2xhLmNicl9ucnRfYncgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzbGEuZ3VhcmFudGVlZF9idyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmd1YXJhbnRlZWRfYncgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzbGEuZ3VhcmFudGVlZF9idyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNsYS5tYXhpbXVtX2J3Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWF4aW11bV9idyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNsYS5tYXhpbXVtX2J3IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2xhLmFkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZGRpdGlvbmFsX2J3X2VsaWdpYmlsaXR5ID0gKGJjbW9sdF9hZGRpdGlvbmFsX2J3X2VsaWdpYmlsaXR5KSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic2xhLmFkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzbGEuY2JyX3J0X2NvbXBlbnNhdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNicl9ydF9jb21wZW5zYXRpb24gPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNsYS5jYnJfcnRfY29tcGVuc2F0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2xhLmNicl9ydF9hcF9pbmRleCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNicl9ydF9hcF9pbmRleCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNsYS5jYnJfcnRfYXBfaW5kZXggaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzbGEuY2JyX25ydF9hcF9pbmRleCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNicl9ucnRfYXBfaW5kZXggPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzbGEuY2JyX25ydF9hcF9pbmRleCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNsYS5hbGxvY190eXBlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWxsb2NfdHlwZSA9IChiY21vbHRfYWxsb2NfdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNsYS5hbGxvY190eXBlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2xhLndlaWdodCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLndlaWdodCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNsYS53ZWlnaHQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzbGEucHJpb3JpdHkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wcmlvcml0eSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNsYS5wcmlvcml0eSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fYWxsb2MsIHNsYSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wb25fYWxsb2Nfc2xhIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0FMTE9DX0NGR19JRF9TTEEsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2FsbG9jLCBzbGEsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncG9uX29udV9pZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZ3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fYWxsb2MsIG9udV9pZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2FsbG9jLCBvbnVfaWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0FMTE9DX0NGR19JRF9PTlVfSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb2xsZWN0X3N0YXRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2FsbG9jLCBjb2xsZWN0X3N0YXRzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fYWxsb2MsIGNvbGxlY3Rfc3RhdHMsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0FMTE9DX0NGR19JRF9DT0xMRUNUX1NUQVRTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fYWxsb2NfY2ZnX2NsZWFyKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2FsbG9jX2NmZyBjZmc7ICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9hbGxvY19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fYWxsb2Nfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfY2xlYXIiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0FMTE9DX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsbG9jX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuYWxsb2NfaWQgPSAoYmNtb2x0X2dwb25fYWxsb2NfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxsb2NfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmFsbG9jX2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9BTExPQ19LRVlfSURfQUxMT0NfSUQsICZrZXkuYWxsb2NfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2FsbG9jLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2FsbG9jLCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9hbGxvY19jZmdfZ2V0X211bHRpKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fYWxsb2NfY2ZnIGNmZzsgICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2FsbG9jX2tleSBrZXkgPSB7IH07ICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbXNnX3NldCAqbXNnX3NldCA9IE5VTEw7ICAgICAvKio8IGRlY2xhcmUgbWVzc2FnZSBzZXQgKi8KKyAgICB1aW50MzJfdCBtYXhfbXNnczsgICAgICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgbWF4IG51bWJlciBvZiBtc2dzIHRvIGdldCAqLworICAgIGJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjsgICAgICAgICAgIC8qKjwgZGVjbGFyZSBmaWx0ZXIgaW52ZXJ0IGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2FsbG9jX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9hbGxvY19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0KiBtc2dfc2V0ID0gTlVMTDtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQzMl90IG1heF9tc2dzO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldF9tdWx0aSIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fQUxMT0NfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxsb2NfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5hbGxvY19pZCA9IChiY21vbHRfZ3Bvbl9hbGxvY19pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhbGxvY19pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuYWxsb2NfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0FMTE9DX0tFWV9JRF9BTExPQ19JRCwgJmtleS5hbGxvY19pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXRfYWxsb2MoQkNNT0xUX09CSl9JRF9HUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2FsbG9jLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2FsbG9jLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2FsbG9jX3N0YXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9hbGxvY19zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fYWxsb2MsIHN0YXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fYWxsb2MsIHN0YXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9BTExPQ19DRkdfSURfU1RBVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fYWxsb2MsIHN0YXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fYWxsb2MsIHN0YXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnNsYS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wb25fYWxsb2Nfc2xhIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc2xhLmNicl9ydF9idyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNicl9ydF9idyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zbGEuY2JyX3J0X2J3IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnNsYS5jYnJfbnJ0X2J3Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY2JyX25ydF9idyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zbGEuY2JyX25ydF9idyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zbGEuZ3VhcmFudGVlZF9idyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmd1YXJhbnRlZWRfYncgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuc2xhLmd1YXJhbnRlZWRfYncgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc2xhLm1heGltdW1fYnciKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tYXhpbXVtX2J3ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnNsYS5tYXhpbXVtX2J3IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnNsYS5hZGRpdGlvbmFsX2J3X2VsaWdpYmlsaXR5Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWRkaXRpb25hbF9id19lbGlnaWJpbGl0eSA9IChiY21vbHRfYWRkaXRpb25hbF9id19lbGlnaWJpbGl0eSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zbGEuYWRkaXRpb25hbF9id19lbGlnaWJpbGl0eSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zbGEuY2JyX3J0X2NvbXBlbnNhdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNicl9ydF9jb21wZW5zYXRpb24gPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zbGEuY2JyX3J0X2NvbXBlbnNhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zbGEuY2JyX3J0X2FwX2luZGV4Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY2JyX3J0X2FwX2luZGV4ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnNsYS5jYnJfcnRfYXBfaW5kZXggaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc2xhLmNicl9ucnRfYXBfaW5kZXgiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jYnJfbnJ0X2FwX2luZGV4ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnNsYS5jYnJfbnJ0X2FwX2luZGV4IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnNsYS5hbGxvY190eXBlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWxsb2NfdHlwZSA9IChiY21vbHRfYWxsb2NfdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zbGEuYWxsb2NfdHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zbGEud2VpZ2h0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwud2VpZ2h0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnNsYS53ZWlnaHQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc2xhLnByaW9yaXR5Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucHJpb3JpdHkgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuc2xhLnByaW9yaXR5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9hbGxvYywgc2xhLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Bvbl9hbGxvY19zbGEgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fQUxMT0NfQ0ZHX0lEX1NMQSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fYWxsb2MsIHNsYSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNsYSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fYWxsb2MsIHNsYSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2FsbG9jLCBzbGEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncG9uX29udV9pZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZ3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fYWxsb2MsIG9udV9pZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2FsbG9jLCBvbnVfaWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0FMTE9DX0NGR19JRF9PTlVfSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2FsbG9jLCBvbnVfaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9hbGxvYywgb251X2lkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY29sbGVjdF9zdGF0cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9hbGxvYywgY29sbGVjdF9zdGF0cywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2FsbG9jLCBjb2xsZWN0X3N0YXRzLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9BTExPQ19DRkdfSURfQ09MTEVDVF9TVEFUUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNvbGxlY3Rfc3RhdHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2FsbG9jLCBjb2xsZWN0X3N0YXRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fYWxsb2MsIGNvbGxlY3Rfc3RhdHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fYWxsb2MsIHN0YXRlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9hbGxvYywgc2xhKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9hbGxvYywgb251X2lkKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9hbGxvYywgY29sbGVjdF9zdGF0cykpCisgICAgeworICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2FsbG9jLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fYWxsb2MsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9hbGxvY19zdGF0X2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0IHN0YXQ7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fYWxsb2Nfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDsgICAgICAgICAgIC8qKjwgZGVjbGFyZSAnY2xlYXIgb24gcmVhZCcgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fYWxsb2Nfc3RhdCBzdGF0O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fYWxsb2Nfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGNsZWFyX29uX3JlYWQ7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fQUxMT0NfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxsb2NfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5hbGxvY19pZCA9IChiY21vbHRfZ3Bvbl9hbGxvY19pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhbGxvY19pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuYWxsb2NfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0FMTE9DX0tFWV9JRF9BTExPQ19JRCwgJmtleS5hbGxvY19pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBmbGFncyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNsZWFyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBjbGVhcl9vbl9yZWFkID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNsZWFyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImNsZWFyX29uX3JlYWQgPSAlcztcbiIsIChjbGVhcl9vbl9yZWFkKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9TVEFUX0lOSVQoJnN0YXQsIGdwb25fYWxsb2MsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfSU5JVCgmc3RhdCwgZ3Bvbl9hbGxvYywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9ieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX2FsbG9jLCByeF9ieXRlcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9hbGxvYywgcnhfYnl0ZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX2FsbG9jLCByeF9ieXRlcykpCisgICAgeworICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9hbGxvYywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9hbGxvYywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9nZXQoZGV2aWNlX2lkLCAmc3RhdC5oZHIsIGNsZWFyX29uX3JlYWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZzdGF0Lmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXQuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fYWxsb2Nfb3Blcl9zZXRfc3RhdGVfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZSBvcGVyOyAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGUgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2FsbG9jX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0FMTE9DX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsbG9jX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuYWxsb2NfaWQgPSAoYmNtb2x0X2dwb25fYWxsb2NfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxsb2NfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmFsbG9jX2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9BTExPQ19LRVlfSURfQUxMT0NfSUQsICZrZXkuYWxsb2NfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGdwb25fYWxsb2MsIHNldF9zdGF0ZSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX2FsbG9jLCBzZXRfc3RhdGUsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hbGxvY19vcGVyYXRpb24gdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2FsbG9jX29wZXJhdGlvbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9hbGxvYywgc2V0X3N0YXRlLCBzdGF0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25fYWxsb2MsIHNldF9zdGF0ZSwgc3RhdGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfR1BPTl9BTExPQ19PUEVSX0lEX1NFVF9TVEFURSwgQkNNT0xUX0dQT05fQUxMT0NfU0VUX1NUQVRFX0lEX1NUQVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9hbGxvY19vcGVyX2dldF9zdGF0c19zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzIG9wZXI7ICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2FsbG9jX2tleSBrZXkgPSB7IH07ICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0cyBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fYWxsb2Nfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fQUxMT0NfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxsb2NfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5hbGxvY19pZCA9IChiY21vbHRfZ3Bvbl9hbGxvY19pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhbGxvY19pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuYWxsb2NfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0FMTE9DX0tFWV9JRF9BTExPQ19JRCwgJmtleS5hbGxvY19pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZ3Bvbl9hbGxvYywgZ2V0X3N0YXRzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGdwb25fYWxsb2MsIGdldF9zdGF0cywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJudW1fb2ZfY3ljbGVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9hbGxvYywgZ2V0X3N0YXRzLCBudW1fb2ZfY3ljbGVzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9hbGxvYywgZ2V0X3N0YXRzLCBudW1fb2ZfY3ljbGVzLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0dQT05fQUxMT0NfT1BFUl9JRF9HRVRfU1RBVFMsIEJDTU9MVF9HUE9OX0FMTE9DX0dFVF9TVEFUU19JRF9OVU1fT0ZfQ1lDTEVTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9hbGxvY19zdGF0X2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmcgc3RhdF9jZmc7ICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19rZXkga2V5ID0geyB9OyAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfaWQgc3RhdF9pZDsgICAgICAvKio8IGRlY2xhcmUgc3RhdCBJRCAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9hbGxvY19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fQUxMT0NfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxsb2NfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5hbGxvY19pZCA9IChiY21vbHRfZ3Bvbl9hbGxvY19pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhbGxvY19pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuYWxsb2NfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0FMTE9DX0tFWV9JRF9BTExPQ19JRCwgJmtleS5hbGxvY19pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBJRCBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc3RhdF9pZCA9IChiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgc3dpdGNoIChzdGF0X2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0lEX1JYX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX2FsbG9jLCByeF9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9hbGxvYywgcnhfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmc3RhdF9jZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdF9jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fYWxsb2Nfc3RhdF9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnIHN0YXRfY2ZnOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fYWxsb2Nfa2V5IGtleSA9IHsgfTsgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2lkIHN0YXRfaWQ7ICAgICAgLyoqPCBkZWNsYXJlIHN0YXQgSUQgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnIHN0YXRfY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fYWxsb2Nfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0FMTE9DX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsbG9jX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuYWxsb2NfaWQgPSAoYmNtb2x0X2dwb25fYWxsb2NfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxsb2NfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmFsbG9jX2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9BTExPQ19LRVlfSURfQUxMT0NfSUQsICZrZXkuYWxsb2NfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIHN3aXRjaCAoc3RhdF9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9JRF9SWF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9hbGxvYywgcnhfYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fYWxsb2MsIHJ4X2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy50cmlnZ2VyLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci50eXBlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci50eXBlID0gKGJjbW9sdF9zdGF0X2NvbmRpdGlvbl90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnR5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoICh2YWwudHJpZ2dlci50eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIucmlzaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLnJpc2luZyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIucmlzaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuZmFsbGluZyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3RocmVzaG9sZC5mYWxsaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5mYWxsaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfUkFOR0U6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIudXBwZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV9yYW5nZS51cHBlciA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudXBwZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5sb3dlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLmxvd2VyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5sb3dlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9WQUxVRV9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIubGltaXQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUudmFsdWVfdGhyZXNob2xkLmxpbWl0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5saW1pdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy5zb2FrLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcuc29hay5hY3RpdmVfc29ha190aW1lIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuc29hay5hY3RpdmVfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcuc29hay5jbGVhcl9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmNsZWFyX3NvYWtfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hay5jbGVhcl9zb2FrX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hayBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCBncG9uX2FsbG9jLCBjZmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9hbGFybV9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0NGR19JRF9DRkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX1BST1BfU0VUKCZzdGF0X2NmZywgZ3Bvbl9hbGxvYywgY2ZnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX2FsbG9jX2F1dG9fY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZyBhdXRvX2NmZzsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2FsbG9jX2tleSBrZXkgPSB7IH07ICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2FsbG9jX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfZ2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBncG9uX2FsbG9jLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZ3Bvbl9hbGxvYywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb25maWd1cmF0aW9uX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fYWxsb2MsIGNvbmZpZ3VyYXRpb25fY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fYWxsb2MsIGNvbmZpZ3VyYXRpb25fY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9hbGxvYywgZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX2FsbG9jLCBnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX2NsZWFyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX2FsbG9jLCBzdGF0X2FsYXJtX2NsZWFyZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9hbGxvYywgc3RhdF9hbGFybV9jbGVhcmVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fYWxsb2MsIHN0YXRfYWxhcm1fcmFpc2VkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fYWxsb2MsIHN0YXRfYWxhcm1fcmFpc2VkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX2FsbG9jLCBjb25maWd1cmF0aW9uX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fYWxsb2MsIGdldF9hbGxvY19zdGF0c19jb21wbGV0ZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX2FsbG9jLCBzdGF0X2FsYXJtX2NsZWFyZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX2FsbG9jLCBzdGF0X2FsYXJtX3JhaXNlZCkpCisgICAgeworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX2FsbG9jLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fYWxsb2MsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmF1dG9fY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX2FsbG9jX2F1dG9fY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZyBhdXRvX2NmZzsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2FsbG9jX2tleSBrZXkgPSB7IH07ICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2FsbG9jX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfc2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBncG9uX2FsbG9jLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZ3Bvbl9hbGxvYywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb25maWd1cmF0aW9uX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fYWxsb2MsIGNvbmZpZ3VyYXRpb25fY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX2FsbG9jLCBjb25maWd1cmF0aW9uX2NvbXBsZXRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0NGR19JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdldF9hbGxvY19zdGF0c19jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX2FsbG9jLCBnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX2FsbG9jLCBnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX0dFVF9BTExPQ19TVEFUU19DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX2NsZWFyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX2FsbG9jLCBzdGF0X2FsYXJtX2NsZWFyZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fYWxsb2MsIHN0YXRfYWxhcm1fY2xlYXJlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fYWxsb2MsIHN0YXRfYWxhcm1fcmFpc2VkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX2FsbG9jLCBzdGF0X2FsYXJtX3JhaXNlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9nZW1fcG9ydF9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZyBjZmc7ICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkga2V5ID0geyB9OyAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnZW1fcG9ydF9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmdlbV9wb3J0X2lkID0gKGJjbW9sdF9ncG9uX2dlbV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJnZW1fcG9ydF9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZ2VtX3BvcnRfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0tFWV9JRF9HRU1fUE9SVF9JRCwgJmtleS5nZW1fcG9ydF9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY29uZmlndXJhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgY29uZmlndXJhdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGNvbmZpZ3VyYXRpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgb251X2lkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgb251X2lkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnZW1fcG9ydF9zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgZ2VtX3BvcnRfc3RhdGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBnZW1fcG9ydF9zdGF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZG93bnN0cmVhbV9lbmNyeXB0aW9uX21vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGRvd25zdHJlYW1fZW5jcnlwdGlvbl9tb2RlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgZG93bnN0cmVhbV9lbmNyeXB0aW9uX21vZGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCB1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIHVwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb250cm9sIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBjb250cm9sKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgY29udHJvbCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVidWdfZmxvd19jb25maWciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGRlYnVnX2Zsb3dfY29uZmlnKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgZGVidWdfZmxvd19jb25maWcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY190YWJsZV9lbnRyeV9saW1pdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgbWFjX3RhYmxlX2VudHJ5X2xpbWl0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgbWFjX3RhYmxlX2VudHJ5X2xpbWl0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGNvbmZpZ3VyYXRpb24pICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIG9udV9pZCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgZ2VtX3BvcnRfc3RhdGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGRvd25zdHJlYW1fZW5jcnlwdGlvbl9tb2RlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCB1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgY29udHJvbCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgZGVidWdfZmxvd19jb25maWcpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIG1hY190YWJsZV9lbnRyeV9saW1pdCkpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9nZW1fcG9ydF9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZyBjZmc7ICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkga2V5ID0geyB9OyAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnZW1fcG9ydF9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmdlbV9wb3J0X2lkID0gKGJjbW9sdF9ncG9uX2dlbV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJnZW1fcG9ydF9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZ2VtX3BvcnRfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0tFWV9JRF9HRU1fUE9SVF9JRCwgJmtleS5nZW1fcG9ydF9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNvbmZpZ3VyYXRpb24uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ2VtX3BvcnRfY29uZmlndXJhdGlvbiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY29uZmlndXJhdGlvbi5kaXJlY3Rpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kaXJlY3Rpb24gPSAoYmNtb2x0X2dlbV9wb3J0X2RpcmVjdGlvbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNvbmZpZ3VyYXRpb24uZGlyZWN0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY29uZmlndXJhdGlvbi50eXBlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudHlwZSA9IChiY21vbHRfZ2VtX3BvcnRfdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNvbmZpZ3VyYXRpb24udHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGNvbmZpZ3VyYXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZ2VtX3BvcnRfY29uZmlndXJhdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfQ09ORklHVVJBVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGNvbmZpZ3VyYXRpb24sIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncG9uX29udV9pZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZ3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIG9udV9pZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBvbnVfaWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9PTlVfSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2NvbnRyb2xfc3RhdGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBkb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBkb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX0RPV05TVFJFQU1fRU5DUllQVElPTl9NT0RFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXBzdHJlYW1fZGVzdGluYXRpb25fcXVldWUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF91c19nZW1fcG9ydF9kZXN0aW5hdGlvbiB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfdXNfZ2VtX3BvcnRfZGVzdGluYXRpb24pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCB1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCB1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX1VQU1RSRUFNX0RFU1RJTkFUSU9OX1FVRVVFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY29udHJvbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2NvbnRyb2xfc3RhdGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBjb250cm9sLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGNvbnRyb2wsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9DT05UUk9MLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImRlYnVnX2Zsb3dfY29uZmlnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fZGVidWdfZmxvd19jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlYnVnX2Zsb3dfY29uZmlnLnVudGFnZ2VkX2Zsb3ciKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC51bnRhZ2dlZF9mbG93ID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZGVidWdfZmxvd19jb25maWcudW50YWdnZWRfZmxvdyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlYnVnX2Zsb3dfY29uZmlnLnVudGFnZ2VkX3ZpZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnVudGFnZ2VkX3ZpZCA9IChiY21vbHRfdmxhbl9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZGVidWdfZmxvd19jb25maWcudW50YWdnZWRfdmlkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgZGVidWdfZmxvd19jb25maWcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9kZWJ1Z19mbG93X2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfREVCVUdfRkxPV19DT05GSUcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBkZWJ1Z19mbG93X2NvbmZpZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY190YWJsZV9lbnRyeV9saW1pdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDE2X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBtYWNfdGFibGVfZW50cnlfbGltaXQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgbWFjX3RhYmxlX2VudHJ5X2xpbWl0LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfTUFDX1RBQkxFX0VOVFJZX0xJTUlULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fZ2VtX3BvcnRfY2ZnX2NsZWFyKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZyBjZmc7ICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkga2V5ID0geyB9OyAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfY2xlYXIiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdlbV9wb3J0X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZ2VtX3BvcnRfaWQgPSAoYmNtb2x0X2dwb25fZ2VtX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImdlbV9wb3J0X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5nZW1fcG9ydF9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fR0VNX1BPUlRfS0VZX0lEX0dFTV9QT1JUX0lELCAma2V5LmdlbV9wb3J0X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fZ2VtX3BvcnRfY2ZnX2dldF9tdWx0aShiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZyBjZmc7ICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkga2V5ID0geyB9OyAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X21zZ19zZXQgKm1zZ19zZXQgPSBOVUxMOyAgICAgLyoqPCBkZWNsYXJlIG1lc3NhZ2Ugc2V0ICovCisgICAgdWludDMyX3QgbWF4X21zZ3M7ICAgICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgICAgICAvKio8IGRlY2xhcmUgZmlsdGVyIGludmVydCBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldCogbXNnX3NldCA9IE5VTEw7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50MzJfdCBtYXhfbXNncztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXRfbXVsdGkiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdlbV9wb3J0X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZ2VtX3BvcnRfaWQgPSAoYmNtb2x0X2dwb25fZ2VtX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImdlbV9wb3J0X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5nZW1fcG9ydF9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fR0VNX1BPUlRfS0VZX0lEX0dFTV9QT1JUX0lELCAma2V5LmdlbV9wb3J0X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBtYXggbnVtYmVyIG9mIG1zZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhfbXNncyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgbWF4X21zZ3MgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1heF9tc2dzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coIm1heF9tc2dzID0gJWQ7XG4iLCBtYXhfbXNncyk7CisKKyAgICAvKiBzZXQgZmlsdGVyIGludmVydCBmbGFnIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyX2ludmVydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW52ZXJ0X2ZpbHRlciA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXJfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImludmVydF9maWx0ZXIgPSAlcztcbiIsIChpbnZlcnRfZmlsdGVyKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogYWxsb2NhdGUgbWVzc2FnZSBzZXQgKi8KKyAgICBlcnIgPSBhcGljbGlfbXNnX3NldF9hbGxvYyhieXRlX3Bvb2wsIEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldF9hbGxvYyhCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5jb25maWd1cmF0aW9uLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb24gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5jb25maWd1cmF0aW9uLmRpcmVjdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRpcmVjdGlvbiA9IChiY21vbHRfZ2VtX3BvcnRfZGlyZWN0aW9uKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmNvbmZpZ3VyYXRpb24uZGlyZWN0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmNvbmZpZ3VyYXRpb24udHlwZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnR5cGUgPSAoYmNtb2x0X2dlbV9wb3J0X3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuY29uZmlndXJhdGlvbi50eXBlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgY29uZmlndXJhdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9nZW1fcG9ydF9jb25maWd1cmF0aW9uIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9DT05GSUdVUkFUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgY29uZmlndXJhdGlvbiwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNvbmZpZ3VyYXRpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2dlbV9wb3J0LCBjb25maWd1cmF0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fZ2VtX3BvcnQsIGNvbmZpZ3VyYXRpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncG9uX29udV9pZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZ3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIG9udV9pZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBvbnVfaWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9PTlVfSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2dlbV9wb3J0LCBvbnVfaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9nZW1fcG9ydCwgb251X2lkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZ2VtX3BvcnRfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgZ2VtX3BvcnRfc3RhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgZ2VtX3BvcnRfc3RhdGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9HRU1fUE9SVF9TVEFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdlbV9wb3J0X3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9nZW1fcG9ydCwgZ2VtX3BvcnRfc3RhdGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9nZW1fcG9ydCwgZ2VtX3BvcnRfc3RhdGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2NvbnRyb2xfc3RhdGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBkb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBkb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX0RPV05TVFJFQU1fRU5DUllQVElPTl9NT0RFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZG93bnN0cmVhbV9lbmNyeXB0aW9uX21vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2dlbV9wb3J0LCBkb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2dlbV9wb3J0LCBkb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnVwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdXNfZ2VtX3BvcnRfZGVzdGluYXRpb24gdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3VzX2dlbV9wb3J0X2Rlc3RpbmF0aW9uKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgdXBzdHJlYW1fZGVzdGluYXRpb25fcXVldWUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgdXBzdHJlYW1fZGVzdGluYXRpb25fcXVldWUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9VUFNUUkVBTV9ERVNUSU5BVElPTl9RVUVVRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9nZW1fcG9ydCwgdXBzdHJlYW1fZGVzdGluYXRpb25fcXVldWUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9nZW1fcG9ydCwgdXBzdHJlYW1fZGVzdGluYXRpb25fcXVldWUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5jb250cm9sIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfY29udHJvbF9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGNvbnRyb2wsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgY29udHJvbCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX0NPTlRST0wsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb250cm9sIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9nZW1fcG9ydCwgY29udHJvbCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2dlbV9wb3J0LCBjb250cm9sKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmRlYnVnX2Zsb3dfY29uZmlnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fZGVidWdfZmxvd19jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kZWJ1Z19mbG93X2NvbmZpZy51bnRhZ2dlZF9mbG93Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudW50YWdnZWRfZmxvdyA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5kZWJ1Z19mbG93X2NvbmZpZy51bnRhZ2dlZF9mbG93IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRlYnVnX2Zsb3dfY29uZmlnLnVudGFnZ2VkX3ZpZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnVudGFnZ2VkX3ZpZCA9IChiY21vbHRfdmxhbl9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmRlYnVnX2Zsb3dfY29uZmlnLnVudGFnZ2VkX3ZpZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGRlYnVnX2Zsb3dfY29uZmlnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fZGVidWdfZmxvd19jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX0RFQlVHX0ZMT1dfQ09ORklHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgZGVidWdfZmxvd19jb25maWcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWJ1Z19mbG93X2NvbmZpZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fZ2VtX3BvcnQsIGRlYnVnX2Zsb3dfY29uZmlnKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fZ2VtX3BvcnQsIGRlYnVnX2Zsb3dfY29uZmlnKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubWFjX3RhYmxlX2VudHJ5X2xpbWl0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MTZfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIG1hY190YWJsZV9lbnRyeV9saW1pdCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBtYWNfdGFibGVfZW50cnlfbGltaXQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9NQUNfVEFCTEVfRU5UUllfTElNSVQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfdGFibGVfZW50cnlfbGltaXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2dlbV9wb3J0LCBtYWNfdGFibGVfZW50cnlfbGltaXQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9nZW1fcG9ydCwgbWFjX3RhYmxlX2VudHJ5X2xpbWl0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX2dlbV9wb3J0LCBjb25maWd1cmF0aW9uKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9nZW1fcG9ydCwgb251X2lkKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9nZW1fcG9ydCwgZ2VtX3BvcnRfc3RhdGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX2dlbV9wb3J0LCBkb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fZ2VtX3BvcnQsIHVwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9nZW1fcG9ydCwgY29udHJvbCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fZ2VtX3BvcnQsIGRlYnVnX2Zsb3dfY29uZmlnKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9nZW1fcG9ydCwgbWFjX3RhYmxlX2VudHJ5X2xpbWl0KSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fZ2VtX3BvcnQsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9nZW1fcG9ydCwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX2dlbV9wb3J0X3N0YXRfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXQgc3RhdDsgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkga2V5ID0geyB9OyAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb3NfYm9vbCBjbGVhcl9vbl9yZWFkOyAgICAgICAgICAgLyoqPCBkZWNsYXJlICdjbGVhciBvbiByZWFkJyBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0IHN0YXQ7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnZW1fcG9ydF9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmdlbV9wb3J0X2lkID0gKGJjbW9sdF9ncG9uX2dlbV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJnZW1fcG9ydF9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZ2VtX3BvcnRfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0tFWV9JRF9HRU1fUE9SVF9JRCwgJmtleS5nZW1fcG9ydF9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBmbGFncyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNsZWFyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBjbGVhcl9vbl9yZWFkID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNsZWFyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImNsZWFyX29uX3JlYWQgPSAlcztcbiIsIChjbGVhcl9vbl9yZWFkKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9TVEFUX0lOSVQoJnN0YXQsIGdwb25fZ2VtX3BvcnQsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfSU5JVCgmc3RhdCwgZ3Bvbl9nZW1fcG9ydCwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9wYWNrZXRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fZ2VtX3BvcnQsIHJ4X3BhY2tldHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fZ2VtX3BvcnQsIHJ4X3BhY2tldHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2J5dGVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fZ2VtX3BvcnQsIHJ4X2J5dGVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX2dlbV9wb3J0LCByeF9ieXRlcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfcGFja2V0cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX2dlbV9wb3J0LCB0eF9wYWNrZXRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX2dlbV9wb3J0LCB0eF9wYWNrZXRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9ieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX2dlbV9wb3J0LCB0eF9ieXRlcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9nZW1fcG9ydCwgdHhfYnl0ZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX2dlbV9wb3J0LCByeF9wYWNrZXRzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fZ2VtX3BvcnQsIHJ4X2J5dGVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fZ2VtX3BvcnQsIHR4X3BhY2tldHMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9nZW1fcG9ydCwgdHhfYnl0ZXMpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fZ2VtX3BvcnQsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fZ2VtX3BvcnQsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfZ2V0KGRldmljZV9pZCwgJnN0YXQuaGRyLCBjbGVhcl9vbl9yZWFkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9nZXQoZGV2aWNlX2lkLCAmc3RhdC5oZHIsIGNsZWFyX29uX3JlYWQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmc3RhdC5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0Lmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX2dlbV9wb3J0X29wZXJfc2V0X3N0YXRlX3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGUgb3BlcjsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSBrZXkgPSB7IH07ICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGUgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdlbV9wb3J0X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZ2VtX3BvcnRfaWQgPSAoYmNtb2x0X2dwb25fZ2VtX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImdlbV9wb3J0X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5nZW1fcG9ydF9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fR0VNX1BPUlRfS0VZX0lEX0dFTV9QT1JUX0lELCAma2V5LmdlbV9wb3J0X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX2dlbV9wb3J0LCBzZXRfc3RhdGUsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZ3Bvbl9nZW1fcG9ydCwgc2V0X3N0YXRlLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ2VtX3BvcnRfb3BlcmF0aW9uIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9nZW1fcG9ydF9vcGVyYXRpb24pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25fZ2VtX3BvcnQsIHNldF9zdGF0ZSwgc3RhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX2dlbV9wb3J0LCBzZXRfc3RhdGUsIHN0YXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0dQT05fR0VNX1BPUlRfT1BFUl9JRF9TRVRfU1RBVEUsIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NFVF9TVEFURV9JRF9TVEFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnIHN0YXRfY2ZnOyAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgfTsgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2lkIHN0YXRfaWQ7ICAgLyoqPCBkZWNsYXJlIHN0YXQgSUQgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnIHN0YXRfY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdlbV9wb3J0X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZ2VtX3BvcnRfaWQgPSAoYmNtb2x0X2dwb25fZ2VtX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImdlbV9wb3J0X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5nZW1fcG9ydF9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fR0VNX1BPUlRfS0VZX0lEX0dFTV9QT1JUX0lELCAma2V5LmdlbV9wb3J0X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IElEIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBzdGF0X2lkID0gKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBzd2l0Y2ggKHN0YXRfaWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfSURfUlhfUEFDS0VUUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9nZW1fcG9ydCwgcnhfcGFja2V0cywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9nZW1fcG9ydCwgcnhfcGFja2V0cywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9nZW1fcG9ydCwgcnhfYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fZ2VtX3BvcnQsIHJ4X2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1RYX1BBQ0tFVFM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fZ2VtX3BvcnQsIHR4X3BhY2tldHMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fZ2VtX3BvcnQsIHR4X3BhY2tldHMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfSURfVFhfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fZ2VtX3BvcnQsIHR4X2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX2dlbV9wb3J0LCB0eF9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZzdGF0X2NmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0X2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmcgc3RhdF9jZmc7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkga2V5ID0geyB9OyAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfaWQgc3RhdF9pZDsgICAvKio8IGRlY2xhcmUgc3RhdCBJRCAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fR0VNX1BPUlRfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ2VtX3BvcnRfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5nZW1fcG9ydF9pZCA9IChiY21vbHRfZ3Bvbl9nZW1faWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZ2VtX3BvcnRfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmdlbV9wb3J0X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9LRVlfSURfR0VNX1BPUlRfSUQsICZrZXkuZ2VtX3BvcnRfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIHN3aXRjaCAoc3RhdF9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9QQUNLRVRTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX2dlbV9wb3J0LCByeF9wYWNrZXRzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX2dlbV9wb3J0LCByeF9wYWNrZXRzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1JYX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX2dlbV9wb3J0LCByeF9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9nZW1fcG9ydCwgcnhfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfSURfVFhfUEFDS0VUUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9nZW1fcG9ydCwgdHhfcGFja2V0cywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9nZW1fcG9ydCwgdHhfcGFja2V0cywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9UWF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9nZW1fcG9ydCwgdHhfYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fZ2VtX3BvcnQsIHR4X2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy50cmlnZ2VyLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci50eXBlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci50eXBlID0gKGJjbW9sdF9zdGF0X2NvbmRpdGlvbl90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnR5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoICh2YWwudHJpZ2dlci50eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIucmlzaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLnJpc2luZyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIucmlzaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuZmFsbGluZyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3RocmVzaG9sZC5mYWxsaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5mYWxsaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfUkFOR0U6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIudXBwZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV9yYW5nZS51cHBlciA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudXBwZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5sb3dlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLmxvd2VyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5sb3dlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9WQUxVRV9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIubGltaXQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUudmFsdWVfdGhyZXNob2xkLmxpbWl0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5saW1pdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy5zb2FrLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcuc29hay5hY3RpdmVfc29ha190aW1lIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuc29hay5hY3RpdmVfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcuc29hay5jbGVhcl9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmNsZWFyX3NvYWtfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hay5jbGVhcl9zb2FrX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hayBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCBncG9uX2dlbV9wb3J0LCBjZmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9hbGFybV9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0NGR19JRF9DRkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX1BST1BfU0VUKCZzdGF0X2NmZywgZ3Bvbl9nZW1fcG9ydCwgY2ZnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZyBhdXRvX2NmZzsgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSBrZXkgPSB7IH07ICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfZ2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBncG9uX2dlbV9wb3J0LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZ3Bvbl9nZW1fcG9ydCwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb25maWd1cmF0aW9uX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fZ2VtX3BvcnQsIGNvbmZpZ3VyYXRpb25fY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fZ2VtX3BvcnQsIGNvbmZpZ3VyYXRpb25fY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX2NsZWFyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX2dlbV9wb3J0LCBzdGF0X2FsYXJtX2NsZWFyZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9nZW1fcG9ydCwgc3RhdF9hbGFybV9jbGVhcmVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fZ2VtX3BvcnQsIHN0YXRfYWxhcm1fcmFpc2VkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fZ2VtX3BvcnQsIHN0YXRfYWxhcm1fcmFpc2VkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX2dlbV9wb3J0LCBjb25maWd1cmF0aW9uX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fZ2VtX3BvcnQsIHN0YXRfYWxhcm1fY2xlYXJlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fZ2VtX3BvcnQsIHN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fZ2VtX3BvcnQsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9nZW1fcG9ydCwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmYXV0b19jZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnIGF1dG9fY2ZnOyAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgfTsgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19zZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGdwb25fZ2VtX3BvcnQsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBncG9uX2dlbV9wb3J0LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNvbmZpZ3VyYXRpb25fY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9nZW1fcG9ydCwgY29uZmlndXJhdGlvbl9jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fZ2VtX3BvcnQsIGNvbmZpZ3VyYXRpb25fY29tcGxldGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0FVVE9fQ0ZHX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9jbGVhcmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9nZW1fcG9ydCwgc3RhdF9hbGFybV9jbGVhcmVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX2dlbV9wb3J0LCBzdGF0X2FsYXJtX2NsZWFyZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9yYWlzZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX2dlbV9wb3J0LCBzdGF0X2FsYXJtX3JhaXNlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9nZW1fcG9ydCwgc3RhdF9hbGFybV9yYWlzZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25faXdmX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25faXdmX2NmZyBjZmc7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25faXdmX2tleSBrZXkgPSB7IH07ICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2l3Ziwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9pd2YsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaXdmX21vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmLCBpd2ZfbW9kZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmLCBpd2ZfbW9kZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXNfdHBpZF9wZXJfZmxvdyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2YsIHVzX3RwaWRfcGVyX2Zsb3cpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3ZiwgdXNfdHBpZF9wZXJfZmxvdyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXNfb3RhZ19kaXJlY3RfdHBpZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2YsIHVzX290YWdfZGlyZWN0X3RwaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3ZiwgdXNfb3RhZ19kaXJlY3RfdHBpZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXNfb3RhZ19kaXJlY3RfcGJpdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2YsIHVzX290YWdfZGlyZWN0X3BiaXQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3ZiwgdXNfb3RhZ19kaXJlY3RfcGJpdCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZHNfdHBpZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2YsIGRzX3RwaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3ZiwgZHNfdHBpZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmLCBtYWNfdGFibGVfY29uZmlndXJhdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmLCBtYWNfdGFibGVfY29uZmlndXJhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVidWdfZmxvd19jb25maWd1cmF0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3ZiwgZGVidWdfZmxvd19jb25maWd1cmF0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2YsIGRlYnVnX2Zsb3dfY29uZmlndXJhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX3RhYmxlX2NvdW50Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3ZiwgbWFjX3RhYmxlX2NvdW50KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2YsIG1hY190YWJsZV9jb3VudCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZm9yYmlkZGVuX3ZsYW5fZmxvd19nZW1fcmFuZ2Vfc3RhcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmLCBmb3JiaWRkZW5fdmxhbl9mbG93X2dlbV9yYW5nZV9zdGFydCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmLCBmb3JiaWRkZW5fdmxhbl9mbG93X2dlbV9yYW5nZV9zdGFydCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX2l3ZiwgaXdmX21vZGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25faXdmLCB1c190cGlkX3Blcl9mbG93KSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX2l3ZiwgdXNfb3RhZ19kaXJlY3RfdHBpZCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9pd2YsIHVzX290YWdfZGlyZWN0X3BiaXQpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25faXdmLCBkc190cGlkKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX2l3ZiwgbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24pICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25faXdmLCBkZWJ1Z19mbG93X2NvbmZpZ3VyYXRpb24pICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25faXdmLCBtYWNfdGFibGVfY291bnQpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25faXdmLCBmb3JiaWRkZW5fdmxhbl9mbG93X2dlbV9yYW5nZV9zdGFydCkpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2YsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX2l3Zl9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2l3Zl9jZmcgY2ZnOyAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2Zfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fSVdGX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9pd2YsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIml3Zl9tb2RlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfaXdmX21vZGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2l3Zl9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2YsIGl3Zl9tb2RlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmLCBpd2ZfbW9kZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfSVdGX01PREUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAidXNfdHBpZF9wZXJfZmxvdy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hcnJfdTE2XzJfaGV4IHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1c190cGlkX3Blcl9mbG93LmFyciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBpMDsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhcnJheSB1c190cGlkX3Blcl9mbG93LmFyciBtdXN0IGhhdmUgMiBlbGVtZW50c1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgMjsgaTArKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXSA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAidXNfdHBpZF9wZXJfZmxvdy5hcnIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3ZiwgdXNfdHBpZF9wZXJfZmxvdywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9hcnJfdTE2XzJfaGV4IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX1VTX1RQSURfUEVSX0ZMT1csICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3ZiwgdXNfdHBpZF9wZXJfZmxvdywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVzX290YWdfZGlyZWN0X3RwaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2YsIHVzX290YWdfZGlyZWN0X3RwaWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2YsIHVzX290YWdfZGlyZWN0X3RwaWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX1VTX09UQUdfRElSRUNUX1RQSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1c19vdGFnX2RpcmVjdF9wYml0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2YsIHVzX290YWdfZGlyZWN0X3BiaXQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2YsIHVzX290YWdfZGlyZWN0X3BiaXQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX1VTX09UQUdfRElSRUNUX1BCSVQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZHNfdHBpZC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hcnJfdTE2XzVfaGV4IHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkc190cGlkLmFyciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBpMTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA1KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhcnJheSBkc190cGlkLmFyciBtdXN0IGhhdmUgNSBlbGVtZW50c1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgNTsgaTErKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuYXJyW2kxXSA9IGNsaV9wYXJtLT52YWx1ZXNbaTFdLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZHNfdHBpZC5hcnIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3ZiwgZHNfdHBpZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9hcnJfdTE2XzVfaGV4IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX0RTX1RQSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3ZiwgZHNfdHBpZCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJtYWNfdGFibGVfY29uZmlndXJhdGlvbi4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9tYWNfdGFibGVfY29uZmlndXJhdGlvbiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24ubWlzc19mYWxsYmFjayIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1pc3NfZmFsbGJhY2sgPSAoYmNtb2x0X21hY190YWJsZV9taXNzX2ZhbGxiYWNrKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24ubWlzc19mYWxsYmFjayBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY190YWJsZV9jb25maWd1cmF0aW9uLmRlZmF1bHRfZmxvd19pZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRlZmF1bHRfZmxvd19pZCA9IChiY21vbHRfZmxvd19pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24uZGVmYXVsdF9mbG93X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24uYWdpbmdfdGltZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFnaW5nX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYWNfdGFibGVfY29uZmlndXJhdGlvbi5hZ2luZ190aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24ubGVhcm5pbmdfbW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxlYXJuaW5nX21vZGUgPSAoYmNtb2x0X21hY190YWJsZV9sZWFybmluZ19tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24ubGVhcm5pbmdfbW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY190YWJsZV9jb25maWd1cmF0aW9uLmF1dG9tYXRpY19tYWNfbGVhcm5pbmciKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hdXRvbWF0aWNfbWFjX2xlYXJuaW5nID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24uYXV0b21hdGljX21hY19sZWFybmluZyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY190YWJsZV9jb25maWd1cmF0aW9uLmF1dG9tYXRpY19tYWNfYWdpbmciKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hdXRvbWF0aWNfbWFjX2FnaW5nID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24uYXV0b21hdGljX21hY19hZ2luZyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY190YWJsZV9jb25maWd1cmF0aW9uLmF1dG9tYXRpY19tYWNfbW92ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmF1dG9tYXRpY19tYWNfbW92ZSA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1hY190YWJsZV9jb25maWd1cmF0aW9uLmF1dG9tYXRpY19tYWNfbW92ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY190YWJsZV9jb25maWd1cmF0aW9uLmF1dG9tYXRpY19zdGF0aWNfbW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmF1dG9tYXRpY19zdGF0aWNfbW9kZSA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24uYXV0b21hdGljX3N0YXRpY19tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2YsIG1hY190YWJsZV9jb25maWd1cmF0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X21hY190YWJsZV9jb25maWd1cmF0aW9uIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX01BQ19UQUJMRV9DT05GSUdVUkFUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2YsIG1hY190YWJsZV9jb25maWd1cmF0aW9uLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImRlYnVnX2Zsb3dfY29uZmlndXJhdGlvbi4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncG9uX2l3Zl9kZWJ1Z19mbG93X2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVidWdfZmxvd19jb25maWd1cmF0aW9uLmxlYXJuX3VudGFnZ2VkX2Zsb3dfdmlkcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxlYXJuX3VudGFnZ2VkX2Zsb3dfdmlkcyA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZGVidWdfZmxvd19jb25maWd1cmF0aW9uLmxlYXJuX3VudGFnZ2VkX2Zsb3dfdmlkcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlYnVnX2Zsb3dfY29uZmlndXJhdGlvbi51bnRhZ2dlZF9mbG93X3NoYXBpbmdfbXNfcGVyX3NlYyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnVudGFnZ2VkX2Zsb3dfc2hhcGluZ19tc19wZXJfc2VjID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZGVidWdfZmxvd19jb25maWd1cmF0aW9uLnVudGFnZ2VkX2Zsb3dfc2hhcGluZ19tc19wZXJfc2VjIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2YsIGRlYnVnX2Zsb3dfY29uZmlndXJhdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl9kZWJ1Z19mbG93X2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9ERUJVR19GTE9XX0NPTkZJR1VSQVRJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3ZiwgZGVidWdfZmxvd19jb25maWd1cmF0aW9uLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZm9yYmlkZGVuX3ZsYW5fZmxvd19nZW1fcmFuZ2Vfc3RhcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2YsIGZvcmJpZGRlbl92bGFuX2Zsb3dfZ2VtX3JhbmdlX3N0YXJ0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmLCBmb3JiaWRkZW5fdmxhbl9mbG93X2dlbV9yYW5nZV9zdGFydCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfRk9SQklEREVOX1ZMQU5fRkxPV19HRU1fUkFOR0VfU1RBUlQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfY2ZnX2NsZWFyKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2l3Zl9jZmcgY2ZnOyAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2Zfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfY2xlYXIiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2l3Ziwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9pd2YsIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX2l3Zl9jZmdfZ2V0X211bHRpKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25faXdmX2NmZyBjZmc7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25faXdmX2tleSBrZXkgPSB7IH07ICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X21zZ19zZXQgKm1zZ19zZXQgPSBOVUxMOyAvKio8IGRlY2xhcmUgbWVzc2FnZSBzZXQgKi8KKyAgICB1aW50MzJfdCBtYXhfbXNnczsgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYXggbnVtYmVyIG9mIG1zZ3MgdG8gZ2V0ICovCisgICAgYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyOyAgICAgICAvKio8IGRlY2xhcmUgZmlsdGVyIGludmVydCBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0KiBtc2dfc2V0ID0gTlVMTDtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQzMl90IG1heF9tc2dzO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldF9tdWx0aSIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0lXRl9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX0dQT05fSVdGLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2l3Ziwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuaXdmX21vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9pd2ZfbW9kZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfaXdmX21vZGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3ZiwgaXdmX21vZGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2YsIGl3Zl9tb2RlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fSVdGX0NGR19JRF9JV0ZfTU9ERSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIml3Zl9tb2RlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2YsIGl3Zl9tb2RlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmLCBpd2ZfbW9kZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci51c190cGlkX3Blcl9mbG93LiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Fycl91MTZfMl9oZXggdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci51c190cGlkX3Blcl9mbG93LmFyciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBpMDsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhcnJheSBmaWx0ZXIudXNfdHBpZF9wZXJfZmxvdy5hcnIgbXVzdCBoYXZlIDIgZWxlbWVudHNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDI7IGkwKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLmFycltpMF0gPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci51c190cGlkX3Blcl9mbG93LmFyciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmLCB1c190cGlkX3Blcl9mbG93LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Fycl91MTZfMl9oZXggdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfVVNfVFBJRF9QRVJfRkxPVywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmLCB1c190cGlkX3Blcl9mbG93LCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXNfdHBpZF9wZXJfZmxvdyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmLCB1c190cGlkX3Blcl9mbG93KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmLCB1c190cGlkX3Blcl9mbG93KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudXNfb3RhZ19kaXJlY3RfdHBpZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDE2X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3ZiwgdXNfb3RhZ19kaXJlY3RfdHBpZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3ZiwgdXNfb3RhZ19kaXJlY3RfdHBpZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfVVNfT1RBR19ESVJFQ1RfVFBJRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVzX290YWdfZGlyZWN0X3RwaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3ZiwgdXNfb3RhZ19kaXJlY3RfdHBpZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3ZiwgdXNfb3RhZ19kaXJlY3RfdHBpZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnVzX290YWdfZGlyZWN0X3BiaXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3ZiwgdXNfb3RhZ19kaXJlY3RfcGJpdCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3ZiwgdXNfb3RhZ19kaXJlY3RfcGJpdCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfVVNfT1RBR19ESVJFQ1RfUEJJVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVzX290YWdfZGlyZWN0X3BiaXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3ZiwgdXNfb3RhZ19kaXJlY3RfcGJpdCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3ZiwgdXNfb3RhZ19kaXJlY3RfcGJpdCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5kc190cGlkLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Fycl91MTZfNV9oZXggdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kc190cGlkLmFyciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBpMTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA1KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhcnJheSBmaWx0ZXIuZHNfdHBpZC5hcnIgbXVzdCBoYXZlIDUgZWxlbWVudHNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IDU7IGkxKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLmFycltpMV0gPSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5kc190cGlkLmFyciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmLCBkc190cGlkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Fycl91MTZfNV9oZXggdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfRFNfVFBJRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmLCBkc190cGlkLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZHNfdHBpZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmLCBkc190cGlkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmLCBkc190cGlkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLm1hY190YWJsZV9jb25maWd1cmF0aW9uLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X21hY190YWJsZV9jb25maWd1cmF0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24ubWlzc19mYWxsYmFjayIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1pc3NfZmFsbGJhY2sgPSAoYmNtb2x0X21hY190YWJsZV9taXNzX2ZhbGxiYWNrKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm1hY190YWJsZV9jb25maWd1cmF0aW9uLm1pc3NfZmFsbGJhY2sgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24uZGVmYXVsdF9mbG93X2lkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZGVmYXVsdF9mbG93X2lkID0gKGJjbW9sdF9mbG93X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24uZGVmYXVsdF9mbG93X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm1hY190YWJsZV9jb25maWd1cmF0aW9uLmFnaW5nX3RpbWUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZ2luZ190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm1hY190YWJsZV9jb25maWd1cmF0aW9uLmFnaW5nX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24ubGVhcm5pbmdfbW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxlYXJuaW5nX21vZGUgPSAoYmNtb2x0X21hY190YWJsZV9sZWFybmluZ19tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm1hY190YWJsZV9jb25maWd1cmF0aW9uLmxlYXJuaW5nX21vZGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24uYXV0b21hdGljX21hY19sZWFybmluZyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmF1dG9tYXRpY19tYWNfbGVhcm5pbmcgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24uYXV0b21hdGljX21hY19sZWFybmluZyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5tYWNfdGFibGVfY29uZmlndXJhdGlvbi5hdXRvbWF0aWNfbWFjX2FnaW5nIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYXV0b21hdGljX21hY19hZ2luZyA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5tYWNfdGFibGVfY29uZmlndXJhdGlvbi5hdXRvbWF0aWNfbWFjX2FnaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm1hY190YWJsZV9jb25maWd1cmF0aW9uLmF1dG9tYXRpY19tYWNfbW92ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmF1dG9tYXRpY19tYWNfbW92ZSA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5tYWNfdGFibGVfY29uZmlndXJhdGlvbi5hdXRvbWF0aWNfbWFjX21vdmUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24uYXV0b21hdGljX3N0YXRpY19tb2RlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYXV0b21hdGljX3N0YXRpY19tb2RlID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24uYXV0b21hdGljX3N0YXRpY19tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2YsIG1hY190YWJsZV9jb25maWd1cmF0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X21hY190YWJsZV9jb25maWd1cmF0aW9uIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX01BQ19UQUJMRV9DT05GSUdVUkFUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2YsIG1hY190YWJsZV9jb25maWd1cmF0aW9uLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3ZiwgbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2YsIG1hY190YWJsZV9jb25maWd1cmF0aW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmRlYnVnX2Zsb3dfY29uZmlndXJhdGlvbi4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncG9uX2l3Zl9kZWJ1Z19mbG93X2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRlYnVnX2Zsb3dfY29uZmlndXJhdGlvbi5sZWFybl91bnRhZ2dlZF9mbG93X3ZpZHMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sZWFybl91bnRhZ2dlZF9mbG93X3ZpZHMgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5kZWJ1Z19mbG93X2NvbmZpZ3VyYXRpb24ubGVhcm5fdW50YWdnZWRfZmxvd192aWRzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRlYnVnX2Zsb3dfY29uZmlndXJhdGlvbi51bnRhZ2dlZF9mbG93X3NoYXBpbmdfbXNfcGVyX3NlYyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnVudGFnZ2VkX2Zsb3dfc2hhcGluZ19tc19wZXJfc2VjID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmRlYnVnX2Zsb3dfY29uZmlndXJhdGlvbi51bnRhZ2dlZF9mbG93X3NoYXBpbmdfbXNfcGVyX3NlYyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmLCBkZWJ1Z19mbG93X2NvbmZpZ3VyYXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfZGVidWdfZmxvd19jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfREVCVUdfRkxPV19DT05GSUdVUkFUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2YsIGRlYnVnX2Zsb3dfY29uZmlndXJhdGlvbiwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlYnVnX2Zsb3dfY29uZmlndXJhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmLCBkZWJ1Z19mbG93X2NvbmZpZ3VyYXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2YsIGRlYnVnX2Zsb3dfY29uZmlndXJhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm1hY190YWJsZV9jb3VudCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDE2X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3ZiwgbWFjX3RhYmxlX2NvdW50LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmLCBtYWNfdGFibGVfY291bnQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX01BQ19UQUJMRV9DT1VOVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY190YWJsZV9jb3VudCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmLCBtYWNfdGFibGVfY291bnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2YsIG1hY190YWJsZV9jb3VudCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmZvcmJpZGRlbl92bGFuX2Zsb3dfZ2VtX3JhbmdlX3N0YXJ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MTZfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmLCBmb3JiaWRkZW5fdmxhbl9mbG93X2dlbV9yYW5nZV9zdGFydCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3ZiwgZm9yYmlkZGVuX3ZsYW5fZmxvd19nZW1fcmFuZ2Vfc3RhcnQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX0ZPUkJJRERFTl9WTEFOX0ZMT1dfR0VNX1JBTkdFX1NUQVJULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZm9yYmlkZGVuX3ZsYW5fZmxvd19nZW1fcmFuZ2Vfc3RhcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3ZiwgZm9yYmlkZGVuX3ZsYW5fZmxvd19nZW1fcmFuZ2Vfc3RhcnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2YsIGZvcmJpZGRlbl92bGFuX2Zsb3dfZ2VtX3JhbmdlX3N0YXJ0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX2l3ZiwgaXdmX21vZGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX2l3ZiwgdXNfdHBpZF9wZXJfZmxvdykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25faXdmLCB1c19vdGFnX2RpcmVjdF90cGlkKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9pd2YsIHVzX290YWdfZGlyZWN0X3BiaXQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX2l3ZiwgZHNfdHBpZCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25faXdmLCBtYWNfdGFibGVfY29uZmlndXJhdGlvbikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25faXdmLCBkZWJ1Z19mbG93X2NvbmZpZ3VyYXRpb24pICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX2l3ZiwgbWFjX3RhYmxlX2NvdW50KSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9pd2YsIGZvcmJpZGRlbl92bGFuX2Zsb3dfZ2VtX3JhbmdlX3N0YXJ0KSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25faXdmX3N0YXRfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2l3Zl9zdGF0IHN0YXQ7ICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDsgICAgICAgLyoqPCBkZWNsYXJlICdjbGVhciBvbiByZWFkJyBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2Zfc3RhdCBzdGF0O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBjbGVhcl9vbl9yZWFkO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgZmxhZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjbGVhciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY2xlYXJfb25fcmVhZCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjbGVhciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJjbGVhcl9vbl9yZWFkID0gJXM7XG4iLCAoY2xlYXJfb25fcmVhZCkgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfU1RBVF9JTklUKCZzdGF0LCBncG9uX2l3Ziwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9JTklUKCZzdGF0LCBncG9uX2l3Ziwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkc19oaXRfZXZlbnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9pd2YsIGRzX2hpdF9ldmVudCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9pd2YsIGRzX2hpdF9ldmVudCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZHNfbWlzc19ldmVudCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX2l3ZiwgZHNfbWlzc19ldmVudCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9pd2YsIGRzX21pc3NfZXZlbnQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRzX2Ryb3BfZHVlX3RvX21pc3NfZXZlbnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9pd2YsIGRzX2Ryb3BfZHVlX3RvX21pc3NfZXZlbnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25faXdmLCBkc19kcm9wX2R1ZV90b19taXNzX2V2ZW50KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkc19kcm9wX2R1ZV90b19oaXRfZXZlbnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9pd2YsIGRzX2Ryb3BfZHVlX3RvX2hpdF9ldmVudCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9pd2YsIGRzX2Ryb3BfZHVlX3RvX2hpdF9ldmVudCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZHNfZHJvcF90b19kaXNhYmxlZF9nZW0iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9pd2YsIGRzX2Ryb3BfdG9fZGlzYWJsZWRfZ2VtKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX2l3ZiwgZHNfZHJvcF90b19kaXNhYmxlZF9nZW0pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm5ld19tYWNfZGlzY292ZXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX2l3ZiwgbmV3X21hY19kaXNjb3ZlcmVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX2l3ZiwgbmV3X21hY19kaXNjb3ZlcmVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtb3ZlX2V2ZW50Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25faXdmLCBtb3ZlX2V2ZW50KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX2l3ZiwgbW92ZV9ldmVudCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibmV3X21hY19kcm9wX2R1ZV90b19maWZvX2Z1bGwiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9pd2YsIG5ld19tYWNfZHJvcF9kdWVfdG9fZmlmb19mdWxsKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX2l3ZiwgbmV3X21hY19kcm9wX2R1ZV90b19maWZvX2Z1bGwpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX2l3ZiwgZHNfaGl0X2V2ZW50KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25faXdmLCBkc19taXNzX2V2ZW50KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25faXdmLCBkc19kcm9wX2R1ZV90b19taXNzX2V2ZW50KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25faXdmLCBkc19kcm9wX2R1ZV90b19oaXRfZXZlbnQpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9pd2YsIGRzX2Ryb3BfdG9fZGlzYWJsZWRfZ2VtKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25faXdmLCBuZXdfbWFjX2Rpc2NvdmVyZWQpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9pd2YsIG1vdmVfZXZlbnQpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9pd2YsIG5ld19tYWNfZHJvcF9kdWVfdG9fZmlmb19mdWxsKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX2l3ZiwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9pd2YsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfZ2V0KGRldmljZV9pZCwgJnN0YXQuaGRyLCBjbGVhcl9vbl9yZWFkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9nZXQoZGV2aWNlX2lkLCAmc3RhdC5oZHIsIGNsZWFyX29uX3JlYWQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmc3RhdC5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0Lmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX2l3Zl9vcGVyX2ZsdXNoX21hY190YWJsZV9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZSBvcGVyOyAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2Zfa2V5IGtleSA9IHsgfTsgICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZSBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGdwb25faXdmLCBmbHVzaF9tYWNfdGFibGUsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZ3Bvbl9pd2YsIGZsdXNoX21hY190YWJsZSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb250cm9sIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZmx1c2hfbWFjX3RhYmxlX29wdGlvbiB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZmx1c2hfbWFjX3RhYmxlX29wdGlvbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9pd2YsIGZsdXNoX21hY190YWJsZSwgY29udHJvbCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25faXdmLCBmbHVzaF9tYWNfdGFibGUsIGNvbnRyb2wsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0dQT05fSVdGX09QRVJfSURfRkxVU0hfTUFDX1RBQkxFLCBCQ01PTFRfR1BPTl9JV0ZfRkxVU0hfTUFDX1RBQkxFX0lEX0NPTlRST0wsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ2aWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF92bGFuX2lkIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF92bGFuX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25faXdmLCBmbHVzaF9tYWNfdGFibGUsIHZpZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25faXdmLCBmbHVzaF9tYWNfdGFibGUsIHZpZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfR1BPTl9JV0ZfT1BFUl9JRF9GTFVTSF9NQUNfVEFCTEUsIEJDTU9MVF9HUE9OX0lXRl9GTFVTSF9NQUNfVEFCTEVfSURfVklELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmxvd19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Zsb3dfaWQgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2Zsb3dfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9pd2YsIGZsdXNoX21hY190YWJsZSwgZmxvd19pZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25faXdmLCBmbHVzaF9tYWNfdGFibGUsIGZsb3dfaWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0dQT05fSVdGX09QRVJfSURfRkxVU0hfTUFDX1RBQkxFLCBCQ01PTFRfR1BPTl9JV0ZfRkxVU0hfTUFDX1RBQkxFX0lEX0ZMT1dfSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX2l3Zl9vcGVyX3NjYW5fbWFjX3RhYmxlX3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGUgb3BlcjsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9rZXkga2V5ID0geyB9OyAgICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGUgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fSVdGX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX2l3Ziwgc2Nhbl9tYWNfdGFibGUsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZ3Bvbl9pd2YsIHNjYW5fbWFjX3RhYmxlLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19tYWNfYWRkcmVzcyB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5tYWM7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX2l3Ziwgc2Nhbl9tYWNfdGFibGUsIG1hY19hZGRyZXNzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9pd2YsIHNjYW5fbWFjX3RhYmxlLCBtYWNfYWRkcmVzcywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfR1BPTl9JV0ZfT1BFUl9JRF9TQ0FOX01BQ19UQUJMRSwgQkNNT0xUX0dQT05fSVdGX1NDQU5fTUFDX1RBQkxFX0lEX01BQ19BRERSRVNTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9pd2Zfc3RhdF9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZyBzdGF0X2NmZzsgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2Zfa2V5IGtleSA9IHsgfTsgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X2dwb25faXdmX3N0YXRfaWQgc3RhdF9pZDsgICAgLyoqPCBkZWNsYXJlIHN0YXQgSUQgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZyBzdGF0X2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0lXRl9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBJRCBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc3RhdF9pZCA9IChiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIHN3aXRjaCAoc3RhdF9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfSElUX0VWRU5UOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX2l3ZiwgZHNfaGl0X2V2ZW50LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX2l3ZiwgZHNfaGl0X2V2ZW50LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9EU19NSVNTX0VWRU5UOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX2l3ZiwgZHNfbWlzc19ldmVudCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9pd2YsIGRzX21pc3NfZXZlbnQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX0RTX0RST1BfRFVFX1RPX01JU1NfRVZFTlQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25faXdmLCBkc19kcm9wX2R1ZV90b19taXNzX2V2ZW50LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX2l3ZiwgZHNfZHJvcF9kdWVfdG9fbWlzc19ldmVudCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfRFJPUF9EVUVfVE9fSElUX0VWRU5UOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX2l3ZiwgZHNfZHJvcF9kdWVfdG9faGl0X2V2ZW50LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX2l3ZiwgZHNfZHJvcF9kdWVfdG9faGl0X2V2ZW50LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9EU19EUk9QX1RPX0RJU0FCTEVEX0dFTToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9pd2YsIGRzX2Ryb3BfdG9fZGlzYWJsZWRfZ2VtLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX2l3ZiwgZHNfZHJvcF90b19kaXNhYmxlZF9nZW0sIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX05FV19NQUNfRElTQ09WRVJFRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9pd2YsIG5ld19tYWNfZGlzY292ZXJlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9pd2YsIG5ld19tYWNfZGlzY292ZXJlZCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfTU9WRV9FVkVOVDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9pd2YsIG1vdmVfZXZlbnQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25faXdmLCBtb3ZlX2V2ZW50LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9ORVdfTUFDX0RST1BfRFVFX1RPX0ZJRk9fRlVMTDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9pd2YsIG5ld19tYWNfZHJvcF9kdWVfdG9fZmlmb19mdWxsLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX2l3ZiwgbmV3X21hY19kcm9wX2R1ZV90b19maWZvX2Z1bGwsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmc3RhdF9jZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdF9jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25faXdmX3N0YXRfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmcgc3RhdF9jZmc7ICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25faXdmX2tleSBrZXkgPSB7IH07ICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2lkIHN0YXRfaWQ7ICAgIC8qKjwgZGVjbGFyZSBzdGF0IElEICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2Zfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X2dwb25faXdmX3N0YXRfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBzd2l0Y2ggKHN0YXRfaWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX0RTX0hJVF9FVkVOVDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9pd2YsIGRzX2hpdF9ldmVudCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9pd2YsIGRzX2hpdF9ldmVudCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfTUlTU19FVkVOVDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9pd2YsIGRzX21pc3NfZXZlbnQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25faXdmLCBkc19taXNzX2V2ZW50LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9EU19EUk9QX0RVRV9UT19NSVNTX0VWRU5UOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX2l3ZiwgZHNfZHJvcF9kdWVfdG9fbWlzc19ldmVudCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9pd2YsIGRzX2Ryb3BfZHVlX3RvX21pc3NfZXZlbnQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX0RTX0RST1BfRFVFX1RPX0hJVF9FVkVOVDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9pd2YsIGRzX2Ryb3BfZHVlX3RvX2hpdF9ldmVudCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9pd2YsIGRzX2Ryb3BfZHVlX3RvX2hpdF9ldmVudCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfRFJPUF9UT19ESVNBQkxFRF9HRU06CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25faXdmLCBkc19kcm9wX3RvX2Rpc2FibGVkX2dlbSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9pd2YsIGRzX2Ryb3BfdG9fZGlzYWJsZWRfZ2VtLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9ORVdfTUFDX0RJU0NPVkVSRUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25faXdmLCBuZXdfbWFjX2Rpc2NvdmVyZWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25faXdmLCBuZXdfbWFjX2Rpc2NvdmVyZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX01PVkVfRVZFTlQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25faXdmLCBtb3ZlX2V2ZW50LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX2l3ZiwgbW92ZV9ldmVudCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfTkVXX01BQ19EUk9QX0RVRV9UT19GSUZPX0ZVTEw6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25faXdmLCBuZXdfbWFjX2Ryb3BfZHVlX3RvX2ZpZm9fZnVsbCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9pd2YsIG5ld19tYWNfZHJvcF9kdWVfdG9fZmlmb19mdWxsLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy50cmlnZ2VyLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci50eXBlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci50eXBlID0gKGJjbW9sdF9zdGF0X2NvbmRpdGlvbl90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnR5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoICh2YWwudHJpZ2dlci50eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIucmlzaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLnJpc2luZyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIucmlzaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuZmFsbGluZyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3RocmVzaG9sZC5mYWxsaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5mYWxsaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfUkFOR0U6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIudXBwZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV9yYW5nZS51cHBlciA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudXBwZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5sb3dlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLmxvd2VyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5sb3dlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9WQUxVRV9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIubGltaXQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUudmFsdWVfdGhyZXNob2xkLmxpbWl0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5saW1pdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy5zb2FrLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcuc29hay5hY3RpdmVfc29ha190aW1lIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuc29hay5hY3RpdmVfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcuc29hay5jbGVhcl9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmNsZWFyX3NvYWtfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hay5jbGVhcl9zb2FrX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hayBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCBncG9uX2l3ZiwgY2ZnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9TVEFUX0NGR19JRF9DRkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX1BST1BfU0VUKCZzdGF0X2NmZywgZ3Bvbl9pd2YsIGNmZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0X2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfYXV0b19jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZyBhdXRvX2NmZzsgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2Zfa2V5IGtleSA9IHsgfTsgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2Zfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19nZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGdwb25faXdmLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZ3Bvbl9pd2YsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25faXdmLCBmbHVzaF9tYWNfdGFibGVfY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25faXdmLCBmbHVzaF9tYWNfdGFibGVfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzY2FuX21hY190YWJsZV9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX2l3Ziwgc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25faXdmLCBzY2FuX21hY190YWJsZV9jb21wbGV0ZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fY2xlYXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25faXdmLCBzdGF0X2FsYXJtX2NsZWFyZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9pd2YsIHN0YXRfYWxhcm1fY2xlYXJlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9yYWlzZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX2l3Ziwgc3RhdF9hbGFybV9yYWlzZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9pd2YsIHN0YXRfYWxhcm1fcmFpc2VkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX2l3ZiwgZmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25faXdmLCBzY2FuX21hY190YWJsZV9jb21wbGV0ZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX2l3Ziwgc3RhdF9hbGFybV9jbGVhcmVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9pd2YsIHN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25faXdmLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25faXdmLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZhdXRvX2NmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfYXV0b19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZyBhdXRvX2NmZzsgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2Zfa2V5IGtleSA9IHsgfTsgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2Zfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19zZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGdwb25faXdmLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZ3Bvbl9pd2YsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25faXdmLCBmbHVzaF9tYWNfdGFibGVfY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX2l3ZiwgZmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fSVdGX0FVVE9fQ0ZHX0lEX0ZMVVNIX01BQ19UQUJMRV9DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzY2FuX21hY190YWJsZV9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX2l3Ziwgc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX2l3Ziwgc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfQVVUT19DRkdfSURfU0NBTl9NQUNfVEFCTEVfQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9jbGVhcmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9pd2YsIHN0YXRfYWxhcm1fY2xlYXJlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9pd2YsIHN0YXRfYWxhcm1fY2xlYXJlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fSVdGX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fcmFpc2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9pd2YsIHN0YXRfYWxhcm1fcmFpc2VkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX2l3Ziwgc3RhdF9hbGFybV9yYWlzZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnIGNmZzsgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZsb3dfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5mbG93X2lkID0gKGJjbW9sdF9mbG93X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZsb3dfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmZsb3dfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1dfS0VZX0lEX0ZMT1dfSUQsICZrZXkuZmxvd19pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmX2RzX2VncmVzc19mbG93LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvdywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnZW1fcG9ydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3csIGdlbV9wb3J0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3csIGdlbV9wb3J0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwYml0X2NvbnRyb2wiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmX2RzX2VncmVzc19mbG93LCBwYml0X2NvbnRyb2wpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvdywgcGJpdF9jb250cm9sKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25faXdmX2RzX2VncmVzc19mbG93LCBnZW1fcG9ydCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3csIHBiaXRfY29udHJvbCkpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmX2RzX2VncmVzc19mbG93LCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3csIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1dfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmxvd19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmZsb3dfaWQgPSAoYmNtb2x0X2Zsb3dfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmxvd19pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZmxvd19pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19LRVlfSURfRkxPV19JRCwgJmtleS5mbG93X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3csIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmX2RzX2VncmVzc19mbG93LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdlbV9wb3J0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bvbl9nZW1faWQgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2dwb25fZ2VtX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvdywgZ2VtX3BvcnQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3csIGdlbV9wb3J0LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0NGR19JRF9HRU1fUE9SVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBiaXRfY29udHJvbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3csIHBiaXRfY29udHJvbCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvdywgcGJpdF9jb250cm9sLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0NGR19JRF9QQklUX0NPTlRST0wsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2NsZWFyKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19jbGVhciIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmbG93X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZmxvd19pZCA9IChiY21vbHRfZmxvd19pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmbG93X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5mbG93X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0tFWV9JRF9GTE9XX0lELCAma2V5LmZsb3dfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvdywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3csIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfZ2V0X211bHRpKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZyBjZmc7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbXNnX3NldCAqbXNnX3NldCA9IE5VTEw7ICAgICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgbWVzc2FnZSBzZXQgKi8KKyAgICB1aW50MzJfdCBtYXhfbXNnczsgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgLyoqPCBkZWNsYXJlIGZpbHRlciBpbnZlcnQgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldCogbXNnX3NldCA9IE5VTEw7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50MzJfdCBtYXhfbXNncztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXRfbXVsdGkiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1dfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmxvd19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmZsb3dfaWQgPSAoYmNtb2x0X2Zsb3dfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmxvd19pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZmxvd19pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19LRVlfSURfRkxPV19JRCwgJmtleS5mbG93X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBtYXggbnVtYmVyIG9mIG1zZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhfbXNncyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgbWF4X21zZ3MgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1heF9tc2dzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coIm1heF9tc2dzID0gJWQ7XG4iLCBtYXhfbXNncyk7CisKKyAgICAvKiBzZXQgZmlsdGVyIGludmVydCBmbGFnIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyX2ludmVydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW52ZXJ0X2ZpbHRlciA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXJfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImludmVydF9maWx0ZXIgPSAlcztcbiIsIChpbnZlcnRfZmlsdGVyKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogYWxsb2NhdGUgbWVzc2FnZSBzZXQgKi8KKyAgICBlcnIgPSBhcGljbGlfbXNnX3NldF9hbGxvYyhieXRlX3Bvb2wsIEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXRfYWxsb2MoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3csIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmX2RzX2VncmVzc19mbG93LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5nZW1fcG9ydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fZ2VtX2lkIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9ncG9uX2dlbV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3csIGdlbV9wb3J0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX2RzX2VncmVzc19mbG93LCBnZW1fcG9ydCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19DRkdfSURfR0VNX1BPUlQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnZW1fcG9ydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmX2RzX2VncmVzc19mbG93LCBnZW1fcG9ydCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvdywgZ2VtX3BvcnQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wYml0X2NvbnRyb2wiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX2RzX2VncmVzc19mbG93LCBwYml0X2NvbnRyb2wsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3csIHBiaXRfY29udHJvbCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19DRkdfSURfUEJJVF9DT05UUk9MLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGJpdF9jb250cm9sIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3csIHBiaXRfY29udHJvbCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvdywgcGJpdF9jb250cm9sKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvdywgZ2VtX3BvcnQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvdywgcGJpdF9jb250cm9sKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmX2RzX2VncmVzc19mbG93LCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmX2RzX2VncmVzc19mbG93LCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnIGNmZzsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleSBrZXkgPSB7IH07ICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInZsYW5faWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS52bGFuX2lkID0gKGJjbW9sdF92bGFuX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInZsYW5faWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnZsYW5faWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19LRVlfSURfVkxBTl9JRCwgJmtleS52bGFuX2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFwcGluZ19tZXRob2QiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdywgbWFwcGluZ19tZXRob2QpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIG1hcHBpbmdfbWV0aG9kKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXBwaW5nX3RhZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCBtYXBwaW5nX3RhZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdywgbWFwcGluZ190YWcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInZsYW5fYWN0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIHZsYW5fYWN0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCB2bGFuX2FjdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIG1hcHBpbmdfbWV0aG9kKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIG1hcHBpbmdfdGFnKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIHZsYW5fYWN0aW9uKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmcgY2ZnOyAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidmxhbl9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnZsYW5faWQgPSAoYmNtb2x0X3ZsYW5faWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAidmxhbl9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkudmxhbl9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0tFWV9JRF9WTEFOX0lELCAma2V5LnZsYW5faWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXBwaW5nX21ldGhvZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3ZsYW5fdG9fZmxvd19tYXBwaW5nX21ldGhvZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfdmxhbl90b19mbG93X21hcHBpbmdfbWV0aG9kKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCBtYXBwaW5nX21ldGhvZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIG1hcHBpbmdfbWV0aG9kLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfQ0ZHX0lEX01BUFBJTkdfTUVUSE9ELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFwcGluZ190YWciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9tYXBwaW5nX3RhZ19tZXRob2QgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X21hcHBpbmdfdGFnX21ldGhvZCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdywgbWFwcGluZ190YWcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCBtYXBwaW5nX3RhZywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0NGR19JRF9NQVBQSU5HX1RBRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInZsYW5fYWN0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZHNfdmxhbl9hY3Rpb24gdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2RzX3ZsYW5fYWN0aW9uKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCB2bGFuX2FjdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIHZsYW5fYWN0aW9uLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfQ0ZHX0lEX1ZMQU5fQUNUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfY2xlYXIoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmcgY2ZnOyAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfY2xlYXIiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ2bGFuX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkudmxhbl9pZCA9IChiY21vbHRfdmxhbl9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ2bGFuX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS52bGFuX2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfS0VZX0lEX1ZMQU5fSUQsICZrZXkudmxhbl9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19nZXRfbXVsdGkoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZyBjZmc7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0ID0gTlVMTDsgICAgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtZXNzYWdlIHNldCAqLworICAgIHVpbnQzMl90IG1heF9tc2dzOyAgICAgICAgICAvKio8IGRlY2xhcmUgbWF4IG51bWJlciBvZiBtc2dzIHRvIGdldCAqLworICAgIGJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjsgICAvKio8IGRlY2xhcmUgZmlsdGVyIGludmVydCBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXQqIG1zZ19zZXQgPSBOVUxMO1xuIik7CisgICAgYmNtY2xpX2xvZygidWludDMyX3QgbWF4X21zZ3M7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGludmVydF9maWx0ZXI7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0X211bHRpIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidmxhbl9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnZsYW5faWQgPSAoYmNtb2x0X3ZsYW5faWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAidmxhbl9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkudmxhbl9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0tFWV9JRF9WTEFOX0lELCAma2V5LnZsYW5faWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IG1heCBudW1iZXIgb2YgbXNncyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1heF9tc2dzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBtYXhfbXNncyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWF4X21zZ3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygibWF4X21zZ3MgPSAlZDtcbiIsIG1heF9tc2dzKTsKKworICAgIC8qIHNldCBmaWx0ZXIgaW52ZXJ0IGZsYWcgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXJfaW52ZXJ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnZlcnRfZmlsdGVyID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlcl9pbnZlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiaW52ZXJ0X2ZpbHRlciA9ICVzO1xuIiwgKGludmVydF9maWx0ZXIpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBhbGxvY2F0ZSBtZXNzYWdlIHNldCAqLworICAgIGVyciA9IGFwaWNsaV9tc2dfc2V0X2FsbG9jKGJ5dGVfcG9vbCwgQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXRfYWxsb2MoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5tYXBwaW5nX21ldGhvZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3ZsYW5fdG9fZmxvd19tYXBwaW5nX21ldGhvZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfdmxhbl90b19mbG93X21hcHBpbmdfbWV0aG9kKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCBtYXBwaW5nX21ldGhvZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIG1hcHBpbmdfbWV0aG9kLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfQ0ZHX0lEX01BUFBJTkdfTUVUSE9ELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFwcGluZ19tZXRob2QiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIG1hcHBpbmdfbWV0aG9kKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdywgbWFwcGluZ19tZXRob2QpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5tYXBwaW5nX3RhZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X21hcHBpbmdfdGFnX21ldGhvZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfbWFwcGluZ190YWdfbWV0aG9kKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCBtYXBwaW5nX3RhZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIG1hcHBpbmdfdGFnLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfQ0ZHX0lEX01BUFBJTkdfVEFHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFwcGluZ190YWciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIG1hcHBpbmdfdGFnKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdywgbWFwcGluZ190YWcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci52bGFuX2FjdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2RzX3ZsYW5fYWN0aW9uIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9kc192bGFuX2FjdGlvbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdywgdmxhbl9hY3Rpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCB2bGFuX2FjdGlvbiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0NGR19JRF9WTEFOX0FDVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInZsYW5fYWN0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCB2bGFuX2FjdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIHZsYW5fYWN0aW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIG1hcHBpbmdfbWV0aG9kKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCBtYXBwaW5nX3RhZykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdywgdmxhbl9hY3Rpb24pKQorICAgIHsKKyAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93LCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZyBjZmc7ICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9NQUNfVEFCTEUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkubWFjX2FkZHJlc3MgPSBjbGlfcGFybS0+dmFsdWUubWFjOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWFjX2FkZHJlc3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm1hY19hZGRyZXNzID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX01BQ19UQUJMRSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfS0VZX0lEX01BQ19BRERSRVNTLCAma2V5Lm1hY19hZGRyZXNzKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInZsYW4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS52bGFuID0gKGJjbW9sdF92bGFuX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInZsYW4gaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnZsYW4gPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfTUFDX1RBQkxFLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9LRVlfSURfVkxBTiwgJmtleS52bGFuKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmxvd19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBmbG93X2lkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBmbG93X2lkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIHN0YXQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIHN0YXQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdlbV9wb3J0X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIGdlbV9wb3J0X2lkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBnZW1fcG9ydF9pZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIG9udV9pZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmX21hY190YWJsZSwgb251X2lkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25faXdmX21hY190YWJsZSwgZmxvd19pZCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBzdGF0KSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIGdlbV9wb3J0X2lkKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIG9udV9pZCkpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmX21hY190YWJsZSwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmX21hY190YWJsZSwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25faXdmX21hY190YWJsZV9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnIGNmZzsgICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfTUFDX1RBQkxFLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm1hY19hZGRyZXNzID0gY2xpX3Bhcm0tPnZhbHVlLm1hYzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1hY19hZGRyZXNzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5tYWNfYWRkcmVzcyA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9NQUNfVEFCTEUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0tFWV9JRF9NQUNfQUREUkVTUywgJmtleS5tYWNfYWRkcmVzcyk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ2bGFuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkudmxhbiA9IChiY21vbHRfdmxhbl9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ2bGFuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS52bGFuID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX01BQ19UQUJMRSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfS0VZX0lEX1ZMQU4sICZrZXkudmxhbik7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmX21hY190YWJsZSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZsb3dfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9mbG93X2lkIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9mbG93X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIGZsb3dfaWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBmbG93X2lkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX01BQ19UQUJMRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQ0ZHX0lEX0ZMT1dfSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIHN0YXQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBzdGF0LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX01BQ19UQUJMRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQ0ZHX0lEX1NUQVQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19jbGVhcihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZyBjZmc7ICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSBrZXkgPSB7IH07ICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfY2xlYXIiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfTUFDX1RBQkxFLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm1hY19hZGRyZXNzID0gY2xpX3Bhcm0tPnZhbHVlLm1hYzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1hY19hZGRyZXNzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5tYWNfYWRkcmVzcyA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9NQUNfVEFCTEUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0tFWV9JRF9NQUNfQUREUkVTUywgJmtleS5tYWNfYWRkcmVzcyk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ2bGFuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkudmxhbiA9IChiY21vbHRfdmxhbl9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ2bGFuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS52bGFuID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX01BQ19UQUJMRSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfS0VZX0lEX1ZMQU4sICZrZXkudmxhbik7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmX21hY190YWJsZSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19nZXRfbXVsdGkoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZyBjZmc7ICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSBrZXkgPSB7IH07ICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbXNnX3NldCAqbXNnX3NldCA9IE5VTEw7ICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtZXNzYWdlIHNldCAqLworICAgIHVpbnQzMl90IG1heF9tc2dzOyAgICAgICAgICAvKio8IGRlY2xhcmUgbWF4IG51bWJlciBvZiBtc2dzIHRvIGdldCAqLworICAgIGJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjsgICAvKio8IGRlY2xhcmUgZmlsdGVyIGludmVydCBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXQqIG1zZ19zZXQgPSBOVUxMO1xuIik7CisgICAgYmNtY2xpX2xvZygidWludDMyX3QgbWF4X21zZ3M7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGludmVydF9maWx0ZXI7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0X211bHRpIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX01BQ19UQUJMRSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5tYWNfYWRkcmVzcyA9IGNsaV9wYXJtLT52YWx1ZS5tYWM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYWNfYWRkcmVzcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkubWFjX2FkZHJlc3MgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfTUFDX1RBQkxFLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9LRVlfSURfTUFDX0FERFJFU1MsICZrZXkubWFjX2FkZHJlc3MpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidmxhbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnZsYW4gPSAoYmNtb2x0X3ZsYW5faWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAidmxhbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkudmxhbiA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9NQUNfVEFCTEUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0tFWV9JRF9WTEFOLCAma2V5LnZsYW4pOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IG1heCBudW1iZXIgb2YgbXNncyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1heF9tc2dzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBtYXhfbXNncyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWF4X21zZ3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygibWF4X21zZ3MgPSAlZDtcbiIsIG1heF9tc2dzKTsKKworICAgIC8qIHNldCBmaWx0ZXIgaW52ZXJ0IGZsYWcgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXJfaW52ZXJ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnZlcnRfZmlsdGVyID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlcl9pbnZlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiaW52ZXJ0X2ZpbHRlciA9ICVzO1xuIiwgKGludmVydF9maWx0ZXIpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBhbGxvY2F0ZSBtZXNzYWdlIHNldCAqLworICAgIGVyciA9IGFwaWNsaV9tc2dfc2V0X2FsbG9jKGJ5dGVfcG9vbCwgQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9NQUNfVEFCTEUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXRfYWxsb2MoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9NQUNfVEFCTEUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmX21hY190YWJsZSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5mbG93X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZmxvd19pZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZmxvd19pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBmbG93X2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX21hY190YWJsZSwgZmxvd19pZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9NQUNfVEFCTEUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0NGR19JRF9GTE9XX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmxvd19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmX21hY190YWJsZSwgZmxvd19pZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3Zl9tYWNfdGFibGUsIGZsb3dfaWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zdGF0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIHN0YXQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBzdGF0LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX01BQ19UQUJMRSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQ0ZHX0lEX1NUQVQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBzdGF0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmX21hY190YWJsZSwgc3RhdCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmdlbV9wb3J0X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bvbl9nZW1faWQgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2dwb25fZ2VtX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIGdlbV9wb3J0X2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX21hY190YWJsZSwgZ2VtX3BvcnRfaWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfTUFDX1RBQkxFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9DRkdfSURfR0VNX1BPUlRfSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnZW1fcG9ydF9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmX21hY190YWJsZSwgZ2VtX3BvcnRfaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBnZW1fcG9ydF9pZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fb251X2lkIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9ncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBvbnVfaWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBvbnVfaWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfTUFDX1RBQkxFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9DRkdfSURfT05VX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBvbnVfaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBvbnVfaWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25faXdmX21hY190YWJsZSwgZmxvd19pZCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25faXdmX21hY190YWJsZSwgc3RhdCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25faXdmX21hY190YWJsZSwgZ2VtX3BvcnRfaWQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX2l3Zl9tYWNfdGFibGUsIG9udV9pZCkpCisgICAgeworICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3Zl9tYWNfdGFibGUsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZyBhdXRvX2NmZzsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5IGtleSA9IHsgfTsgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfZ2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FnZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIG1hY19hZ2VkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25faXdmX21hY190YWJsZSwgbWFjX2FnZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19kcm9wcGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBtYWNfZHJvcHBlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIG1hY19kcm9wcGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfbW92ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25faXdmX21hY190YWJsZSwgbWFjX21vdmUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBtYWNfbW92ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibmV3X21hYyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25faXdmX21hY190YWJsZSwgbmV3X21hYyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIG5ld19tYWMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25faXdmX21hY190YWJsZSwgbWFjX2FnZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIG1hY19kcm9wcGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBtYWNfbW92ZSkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25faXdmX21hY190YWJsZSwgbmV3X21hYykpCisgICAgeworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZhdXRvX2NmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnIGF1dG9fY2ZnOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkga2V5ID0geyB9OyAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19zZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGdwb25faXdmX21hY190YWJsZSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGdwb25faXdmX21hY190YWJsZSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWdlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25faXdmX21hY190YWJsZSwgbWFjX2FnZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25faXdmX21hY190YWJsZSwgbWFjX2FnZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfTUFDX1RBQkxFLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fQ0ZHX0lEX01BQ19BR0VELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2Ryb3BwZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIG1hY19kcm9wcGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIG1hY19kcm9wcGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX01BQ19UQUJMRSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGR19JRF9NQUNfRFJPUFBFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19tb3ZlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBtYWNfbW92ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBtYWNfbW92ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9NQUNfVEFCTEUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19DRkdfSURfTUFDX01PVkUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJuZXdfbWFjIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBuZXdfbWFjLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIG5ld19tYWMsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfTUFDX1RBQkxFLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fQ0ZHX0lEX05FV19NQUMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25faXdmX3VzX2Zsb3dfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmcgY2ZnOyAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleSBrZXkgPSB7IH07ICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX1VTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnZW1fcG9ydF9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmdlbV9wb3J0X2lkID0gKGJjbW9sdF9ncG9uX2dlbV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJnZW1fcG9ydF9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZ2VtX3BvcnRfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfVVNfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0tFWV9JRF9HRU1fUE9SVF9JRCwgJmtleS5nZW1fcG9ydF9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmxvd19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2ZfdXNfZmxvdywgZmxvd19pZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIGZsb3dfaWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19sZWFybmluZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2ZfdXNfZmxvdywgbWFjX2xlYXJuaW5nKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2ZfdXNfZmxvdywgbWFjX2xlYXJuaW5nKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ2bGFuX2FjdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2ZfdXNfZmxvdywgdmxhbl9hY3Rpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCB2bGFuX2FjdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidmxhbl90YWciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIHZsYW5fdGFnKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2ZfdXNfZmxvdywgdmxhbl90YWcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRwaWRfaW5kZXgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIHRwaWRfaW5kZXgpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCB0cGlkX2luZGV4KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIGZsb3dfaWQpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIG1hY19sZWFybmluZykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9pd2ZfdXNfZmxvdywgdmxhbl9hY3Rpb24pICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIHZsYW5fdGFnKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCB0cGlkX2luZGV4KSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9pd2ZfdXNfZmxvdywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX2l3Zl91c19mbG93X2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnIGNmZzsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9VU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ2VtX3BvcnRfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5nZW1fcG9ydF9pZCA9IChiY21vbHRfZ3Bvbl9nZW1faWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZ2VtX3BvcnRfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmdlbV9wb3J0X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX1VTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19LRVlfSURfR0VNX1BPUlRfSUQsICZrZXkuZ2VtX3BvcnRfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZsb3dfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9mbG93X2lkIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9mbG93X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCBmbG93X2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIGZsb3dfaWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfVVNfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9GTE9XX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2xlYXJuaW5nIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCBtYWNfbGVhcm5pbmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfdXNfZmxvdywgbWFjX2xlYXJuaW5nLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX1VTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19DRkdfSURfTUFDX0xFQVJOSU5HLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidmxhbl9hY3Rpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF91c192bGFuX2FjdGlvbiB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfdXNfdmxhbl9hY3Rpb24pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCB2bGFuX2FjdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCB2bGFuX2FjdGlvbiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9VU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX1ZMQU5fQUNUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInZsYW5fdGFnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3ZsYW5fdGFnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ2bGFuX3RhZy52bGFuX2lkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudmxhbl9pZCA9IChiY21vbHRfdmxhbl9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAidmxhbl90YWcudmxhbl9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInZsYW5fdGFnLnBiaXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wYml0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAidmxhbl90YWcucGJpdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIHZsYW5fdGFnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3ZsYW5fdGFnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfVVNfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9WTEFOX1RBRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIHZsYW5fdGFnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHBpZF9pbmRleCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIHRwaWRfaW5kZXgsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfdXNfZmxvdywgdHBpZF9pbmRleCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9VU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX1RQSURfSU5ERVgsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfY2xlYXIoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnIGNmZzsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2NsZWFyIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX1VTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnZW1fcG9ydF9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmdlbV9wb3J0X2lkID0gKGJjbW9sdF9ncG9uX2dlbV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJnZW1fcG9ydF9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZ2VtX3BvcnRfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfVVNfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0tFWV9JRF9HRU1fUE9SVF9JRCwgJmtleS5nZW1fcG9ydF9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX2l3Zl91c19mbG93X2NmZ19nZXRfbXVsdGkoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmcgY2ZnOyAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleSBrZXkgPSB7IH07ICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X21zZ19zZXQgKm1zZ19zZXQgPSBOVUxMOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtZXNzYWdlIHNldCAqLworICAgIHVpbnQzMl90IG1heF9tc2dzOyAgICAgICAgICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgbWF4IG51bWJlciBvZiBtc2dzIHRvIGdldCAqLworICAgIGJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjsgICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgZmlsdGVyIGludmVydCBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldCogbXNnX3NldCA9IE5VTEw7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50MzJfdCBtYXhfbXNncztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXRfbXVsdGkiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfVVNfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdlbV9wb3J0X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZ2VtX3BvcnRfaWQgPSAoYmNtb2x0X2dwb25fZ2VtX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImdlbV9wb3J0X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5nZW1fcG9ydF9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9VU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfS0VZX0lEX0dFTV9QT1JUX0lELCAma2V5LmdlbV9wb3J0X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBtYXggbnVtYmVyIG9mIG1zZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhfbXNncyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgbWF4X21zZ3MgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1heF9tc2dzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coIm1heF9tc2dzID0gJWQ7XG4iLCBtYXhfbXNncyk7CisKKyAgICAvKiBzZXQgZmlsdGVyIGludmVydCBmbGFnIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyX2ludmVydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW52ZXJ0X2ZpbHRlciA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXJfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImludmVydF9maWx0ZXIgPSAlcztcbiIsIChpbnZlcnRfZmlsdGVyKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogYWxsb2NhdGUgbWVzc2FnZSBzZXQgKi8KKyAgICBlcnIgPSBhcGljbGlfbXNnX3NldF9hbGxvYyhieXRlX3Bvb2wsIEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfVVNfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldF9hbGxvYyhCQ01PTFRfT0JKX0lEX0dQT05fSVdGX1VTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmZsb3dfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9mbG93X2lkIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9mbG93X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCBmbG93X2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIGZsb3dfaWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfVVNfRkxPVywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9GTE9XX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmxvd19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmX3VzX2Zsb3csIGZsb3dfaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2ZfdXNfZmxvdywgZmxvd19pZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm1hY19sZWFybmluZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfdXNfZmxvdywgbWFjX2xlYXJuaW5nLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIG1hY19sZWFybmluZywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9VU19GTE9XLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX01BQ19MRUFSTklORywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19sZWFybmluZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmX3VzX2Zsb3csIG1hY19sZWFybmluZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3Zl91c19mbG93LCBtYWNfbGVhcm5pbmcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci52bGFuX2FjdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3VzX3ZsYW5fYWN0aW9uIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF91c192bGFuX2FjdGlvbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIHZsYW5fYWN0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIHZsYW5fYWN0aW9uLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX1VTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19DRkdfSURfVkxBTl9BQ1RJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ2bGFuX2FjdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmX3VzX2Zsb3csIHZsYW5fYWN0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmX3VzX2Zsb3csIHZsYW5fYWN0aW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnZsYW5fdGFnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3ZsYW5fdGFnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudmxhbl90YWcudmxhbl9pZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnZsYW5faWQgPSAoYmNtb2x0X3ZsYW5faWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci52bGFuX3RhZy52bGFuX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnZsYW5fdGFnLnBiaXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wYml0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnZsYW5fdGFnLnBiaXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCB2bGFuX3RhZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF92bGFuX3RhZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX1VTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19DRkdfSURfVkxBTl9UQUcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCB2bGFuX3RhZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInZsYW5fdGFnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2ZfdXNfZmxvdywgdmxhbl90YWcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2ZfdXNfZmxvdywgdmxhbl90YWcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci50cGlkX2luZGV4Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfdXNfZmxvdywgdHBpZF9pbmRleCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCB0cGlkX2luZGV4LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fSVdGX1VTX0ZMT1csIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19DRkdfSURfVFBJRF9JTkRFWCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRwaWRfaW5kZXgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3Zl91c19mbG93LCB0cGlkX2luZGV4KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmX3VzX2Zsb3csIHRwaWRfaW5kZXgpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25faXdmX3VzX2Zsb3csIGZsb3dfaWQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX2l3Zl91c19mbG93LCBtYWNfbGVhcm5pbmcpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX2l3Zl91c19mbG93LCB2bGFuX2FjdGlvbikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25faXdmX3VzX2Zsb3csIHZsYW5fdGFnKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9pd2ZfdXNfZmxvdywgdHBpZF9pbmRleCkpCisgICAgeworICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX2l3Zl91c19mbG93LCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmX3VzX2Zsb3csIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9uaV9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fbmlfY2ZnIGNmZzsgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fbmlfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgdWludDhfdCAqbGlzdF9tZW07ICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgbWVtb3J5IGJ1ZmZlciBmb3IgdmFyaWFibGUtc2l6ZWQgbGlzdHMgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQ4X3QqIGxpc3RfbWVtO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fTklfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX25pLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX25pLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9zdGF0dXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIHBvbl9zdGF0dXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBwb25fc3RhdHVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhdmFpbGFibGVfYmFuZHdpZHRoIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBhdmFpbGFibGVfYmFuZHdpZHRoKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgYXZhaWxhYmxlX2JhbmR3aWR0aCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibnVtYmVyX29mX2FjdGl2ZV9vbnVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBudW1iZXJfb2ZfYWN0aXZlX29udXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBudW1iZXJfb2ZfYWN0aXZlX29udXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm51bWJlcl9vZl9hY3RpdmVfc3RhbmRieV9vbnVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBudW1iZXJfb2ZfYWN0aXZlX3N0YW5kYnlfb251cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIG51bWJlcl9vZl9hY3RpdmVfc3RhbmRieV9vbnVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX3N0YXR1cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgcHJic19zdGF0dXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBwcmJzX3N0YXR1cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX2Rpc3RhbmNlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBwb25fZGlzdGFuY2UpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBwb25fZGlzdGFuY2UpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfd2luZG93X3NpemUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIHJhbmdpbmdfd2luZG93X3NpemUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCByYW5naW5nX3dpbmRvd19zaXplKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmVhc3NpZ25lZF9lcXVhbGl6YXRpb25fZGVsYXkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIHByZWFzc2lnbmVkX2VxdWFsaXphdGlvbl9kZWxheSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIHByZWFzc2lnbmVkX2VxdWFsaXphdGlvbl9kZWxheSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXFkX2N5Y2xlc19udW1iZXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIGVxZF9jeWNsZXNfbnVtYmVyKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgZXFkX2N5Y2xlc19udW1iZXIpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvd2VyX2xldmVsIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBwb3dlcl9sZXZlbCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIHBvd2VyX2xldmVsKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkc19mZWNfbW9kZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgZHNfZmVjX21vZGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBkc19mZWNfbW9kZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZHJpZnRfY29udHJvbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgZHJpZnRfY29udHJvbCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIGRyaWZ0X2NvbnRyb2wpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIGRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBkc19iZXJfcmVwb3J0aW5nX2ludGVydmFsKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsb3NfYWxhcm1fdGhyZXNob2xkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBsb3NfYWxhcm1fdGhyZXNob2xkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgbG9zX2FsYXJtX3RocmVzaG9sZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9zX2luaXRpYWxfdmFsdWUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIGxvc19pbml0aWFsX3ZhbHVlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgbG9zX2luaXRpYWxfdmFsdWUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9hbGFybXNfdGhyZXNob2xkcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgb251X2FsYXJtc190aHJlc2hvbGRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgb251X2FsYXJtc190aHJlc2hvbGRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiZXJfbW9uaXRvciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgYmVyX21vbml0b3IpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBiZXJfbW9uaXRvcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGxvYW1fYWNrX3RpbWVvdXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIHBsb2FtX2Fja190aW1lb3V0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgcGxvYW1fYWNrX3RpbWVvdXQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9hY3RpdmF0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBvbnVfYWN0aXZhdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIG9udV9hY3RpdmF0aW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzbl9hY3F1aXNpdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgc25fYWNxdWlzaXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBzbl9hY3F1aXNpdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2V5X2V4Y2hhbmdlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBrZXlfZXhjaGFuZ2UpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBrZXlfZXhjaGFuZ2UpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBjYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIGNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRiYSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgZGJhKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgZGJhKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb3dlcl9tYW5hZ2VtZW50Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBwb3dlcl9tYW5hZ2VtZW50KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgcG93ZXJfbWFuYWdlbWVudCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCByb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCByb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIHBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBwZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2NoZWNrZXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIHByYnNfY2hlY2tlcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIHByYnNfY2hlY2tlcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19nZW5lcmF0b3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIHByYnNfZ2VuZXJhdG9yKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgcHJic19nZW5lcmF0b3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1pbl9kYXRhX2FsbG9jX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBtaW5fZGF0YV9hbGxvY19pZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIG1pbl9kYXRhX2FsbG9jX2lkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXNfYmFuZHdpZHRoX2xpbWl0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCB1c19iYW5kd2lkdGhfbGltaXQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCB1c19iYW5kd2lkdGhfbGltaXQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsbF9vbnVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBhbGxfb251cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIGFsbF9vbnVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGxfbWNhc3RfZ2VtX3BvcnRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBhbGxfbWNhc3RfZ2VtX3BvcnRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgYWxsX21jYXN0X2dlbV9wb3J0cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVidWciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIGRlYnVnKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgZGVidWcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV91cGdyYWRlX3BhcmFtcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgb251X3VwZ3JhZGVfcGFyYW1zKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgb251X3VwZ3JhZGVfcGFyYW1zKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwc19jX3dhaXRfYmVmb3JlX2RlYWN0aXZhdGlvbl90aW1lb3V0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBwc19jX3dhaXRfYmVmb3JlX2RlYWN0aXZhdGlvbl90aW1lb3V0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9uaSwgcHNfY193YWl0X2JlZm9yZV9kZWFjdGl2YXRpb25fdGltZW91dCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmlwMzJfaW5kaWNhdGlvbl9jb250cm9sIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBiaXAzMl9pbmRpY2F0aW9uX2NvbnRyb2wpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBiaXAzMl9pbmRpY2F0aW9uX2NvbnRyb2wpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9uaSwgcG9uX3N0YXR1cykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9uaSwgYXZhaWxhYmxlX2JhbmR3aWR0aCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9uaSwgbnVtYmVyX29mX2FjdGl2ZV9vbnVzKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX25pLCBudW1iZXJfb2ZfYWN0aXZlX3N0YW5kYnlfb251cykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9uaSwgcHJic19zdGF0dXMpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fbmksIHBvbl9kaXN0YW5jZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9uaSwgcmFuZ2luZ193aW5kb3dfc2l6ZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9uaSwgcHJlYXNzaWduZWRfZXF1YWxpemF0aW9uX2RlbGF5KSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX25pLCBlcWRfY3ljbGVzX251bWJlcikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9uaSwgcG93ZXJfbGV2ZWwpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fbmksIGRzX2ZlY19tb2RlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX25pLCBkcmlmdF9jb250cm9sKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX25pLCBkc19iZXJfcmVwb3J0aW5nX2ludGVydmFsKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX25pLCBsb3NfYWxhcm1fdGhyZXNob2xkKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX25pLCBsb3NfaW5pdGlhbF92YWx1ZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9uaSwgb251X2FsYXJtc190aHJlc2hvbGRzKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX25pLCBiZXJfbW9uaXRvcikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9uaSwgcGxvYW1fYWNrX3RpbWVvdXQpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fbmksIG9udV9hY3RpdmF0aW9uKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX25pLCBzbl9hY3F1aXNpdGlvbikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9uaSwga2V5X2V4Y2hhbmdlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9uaSwgY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9uaSwgY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fbmksIGRiYSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9uaSwgcG93ZXJfbWFuYWdlbWVudCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9uaSwgcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX25pLCBwZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX25pLCBwcmJzX2NoZWNrZXIpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fbmksIHByYnNfZ2VuZXJhdG9yKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX25pLCBtaW5fZGF0YV9hbGxvY19pZCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9uaSwgYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24pICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fbmksIHVzX2JhbmR3aWR0aF9saW1pdCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9uaSwgYWxsX29udXMpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fbmksIGFsbF9tY2FzdF9nZW1fcG9ydHMpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fbmksIGRlYnVnKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX25pLCBvbnVfdXBncmFkZV9wYXJhbXMpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fbmksIHBzX2Nfd2FpdF9iZWZvcmVfZGVhY3RpdmF0aW9uX3RpbWVvdXQpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fbmksIGJpcDMyX2luZGljYXRpb25fY29udHJvbCkpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fbmksIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX25pLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBzZXQgbWVtb3J5IHRvIHVzZSBmb3IgdmFyaWFibGUtc2l6ZWQgbGlzdHMgKi8KKyAgICBsaXN0X21lbSA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7CisgICAgaWYgKGxpc3RfbWVtID09IE5VTEwpCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImxpc3RfbWVtID0gYmNtb3NfY2FsbG9jKEFQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpO1xuIik7CisgICAgQkNNT0xUX0NGR19MSVNUX0JVRl9TRVQoJmNmZywgZ3Bvbl9uaSwgbGlzdF9tZW0sIEFQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfTElTVF9CVUZfU0VUKCZjZmcsIGdwb25fbmksIGxpc3RfbWVtLCBBUElDTElfRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFKTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fbmlfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX25pX2NmZyBjZmc7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fbmlfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fTklfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX25pLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX25pLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJwb25fZGlzdGFuY2UuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcG9uX2Rpc3RhbmNlIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fZGlzdGFuY2UubWF4X2xvZ19kaXN0YW5jZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1heF9sb2dfZGlzdGFuY2UgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fZGlzdGFuY2UubWF4X2xvZ19kaXN0YW5jZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9kaXN0YW5jZS5tYXhfZGlmZl9yZWFjaCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1heF9kaWZmX3JlYWNoID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX2Rpc3RhbmNlLm1heF9kaWZmX3JlYWNoIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcG9uX2Rpc3RhbmNlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Bvbl9kaXN0YW5jZSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUE9OX0RJU1RBTkNFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcG9uX2Rpc3RhbmNlLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJlYXNzaWduZWRfZXF1YWxpemF0aW9uX2RlbGF5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHByZWFzc2lnbmVkX2VxdWFsaXphdGlvbl9kZWxheSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBwcmVhc3NpZ25lZF9lcXVhbGl6YXRpb25fZGVsYXksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkVBU1NJR05FRF9FUVVBTElaQVRJT05fREVMQVksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcWRfY3ljbGVzX251bWJlciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBlcWRfY3ljbGVzX251bWJlciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBlcWRfY3ljbGVzX251bWJlciwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0VRRF9DWUNMRVNfTlVNQkVSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInBvd2VyX2xldmVsLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Bvbl9wb3dlcl9sZXZlbCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG93ZXJfbGV2ZWwucGxzX21heGltdW1fYWxsb2NhdGlvbl9zaXplIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucGxzX21heGltdW1fYWxsb2NhdGlvbl9zaXplID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG93ZXJfbGV2ZWwucGxzX21heGltdW1fYWxsb2NhdGlvbl9zaXplIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG93ZXJfbGV2ZWwubW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1vZGUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb3dlcl9sZXZlbC5tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcG93ZXJfbGV2ZWwsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcG9uX3Bvd2VyX2xldmVsIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9QT1dFUl9MRVZFTCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHBvd2VyX2xldmVsLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZHNfZmVjX21vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgZHNfZmVjX21vZGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgZHNfZmVjX21vZGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9EU19GRUNfTU9ERSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJkcmlmdF9jb250cm9sLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkcmlmdF9jb250cm9sLmRyaWZ0X2ludGVydmFsIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZHJpZnRfaW50ZXJ2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJkcmlmdF9jb250cm9sLmRyaWZ0X2ludGVydmFsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZHJpZnRfY29udHJvbC5kcmlmdF9saW1pdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRyaWZ0X2xpbWl0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZHJpZnRfY29udHJvbC5kcmlmdF9saW1pdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRyaWZ0X2NvbnRyb2wudHJhbnNtaXNzaW9uX2NvbnRyb2xfbGltaXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50cmFuc21pc3Npb25fY29udHJvbF9saW1pdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImRyaWZ0X2NvbnRyb2wudHJhbnNtaXNzaW9uX2NvbnRyb2xfbGltaXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBkcmlmdF9jb250cm9sLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9EUklGVF9DT05UUk9MLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgZHJpZnRfY29udHJvbCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9iZXJfaW50ZXJ2YWwgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2Jlcl9pbnRlcnZhbCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBkc19iZXJfcmVwb3J0aW5nX2ludGVydmFsLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfRFNfQkVSX1JFUE9SVElOR19JTlRFUlZBTCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvc19hbGFybV90aHJlc2hvbGQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBsb3NfYWxhcm1fdGhyZXNob2xkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGxvc19hbGFybV90aHJlc2hvbGQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9MT1NfQUxBUk1fVEhSRVNIT0xELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9zX2luaXRpYWxfdmFsdWUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zdGF0dXMgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGxvc19pbml0aWFsX3ZhbHVlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGxvc19pbml0aWFsX3ZhbHVlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfTE9TX0lOSVRJQUxfVkFMVUUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAib251X2FsYXJtc190aHJlc2hvbGRzLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fb251X2FsYXJtc190aHJlc2hvbGRzIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfYWxhcm1zX3RocmVzaG9sZHMubG9zaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvc2kgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfYWxhcm1zX3RocmVzaG9sZHMubG9zaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9hbGFybXNfdGhyZXNob2xkcy5sb2ZpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9maSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9hbGFybXNfdGhyZXNob2xkcy5sb2ZpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2FsYXJtc190aHJlc2hvbGRzLmxvYW1pIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9hbWkgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfYWxhcm1zX3RocmVzaG9sZHMubG9hbWkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBvbnVfYWxhcm1zX3RocmVzaG9sZHMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX09OVV9BTEFSTVNfVEhSRVNIT0xEUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIG9udV9hbGFybXNfdGhyZXNob2xkcywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJiZXJfbW9uaXRvci4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9iZXJfbW9uaXRvcl9wYXJhbXMgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJlcl9tb25pdG9yLnVzX2Jlcl9pbnRlcnZhbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnVzX2Jlcl9pbnRlcnZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJlcl9tb25pdG9yLnVzX2Jlcl9pbnRlcnZhbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJlcl9tb25pdG9yLnNmX3RocmVzaG9sZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnNmX3RocmVzaG9sZCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJlcl9tb25pdG9yLnNmX3RocmVzaG9sZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJlcl9tb25pdG9yLnNkX3RocmVzaG9sZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnNkX3RocmVzaG9sZCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJlcl9tb25pdG9yLnNkX3RocmVzaG9sZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGJlcl9tb25pdG9yLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Jlcl9tb25pdG9yX3BhcmFtcyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQkVSX01PTklUT1IsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBiZXJfbW9uaXRvciwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBsb2FtX2Fja190aW1lb3V0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MTZfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHBsb2FtX2Fja190aW1lb3V0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHBsb2FtX2Fja190aW1lb3V0LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUExPQU1fQUNLX1RJTUVPVVQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAib251X2FjdGl2YXRpb24uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bvbl9vbnVfYWN0aXZhdGlvbiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2FjdGl2YXRpb24ua2V5X2V4Y2hhbmdlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwua2V5X2V4Y2hhbmdlID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X2FjdGl2YXRpb24ua2V5X2V4Y2hhbmdlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2FjdGl2YXRpb24ucGFzc3dvcmRfYXV0aGVudGljYXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wYXNzd29yZF9hdXRoZW50aWNhdGlvbiA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9hY3RpdmF0aW9uLnBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2FjdGl2YXRpb24uZmFpbF9kdWVfdG9fcGFzc3dvcmRfYXV0aGVudGljYXRpb25fZmFpbHVyZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmZhaWxfZHVlX3RvX3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmUgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfYWN0aXZhdGlvbi5mYWlsX2R1ZV90b19wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgb251X2FjdGl2YXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9vbnVfYWN0aXZhdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfT05VX0FDVElWQVRJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBvbnVfYWN0aXZhdGlvbiwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJzbl9hY3F1aXNpdGlvbi4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncG9uX3NuX2FjcXVpc2l0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzbl9hY3F1aXNpdGlvbi5pbnRlcnZhbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmludGVydmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic25fYWNxdWlzaXRpb24uaW50ZXJ2YWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzbl9hY3F1aXNpdGlvbi5jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY29udHJvbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNuX2FjcXVpc2l0aW9uLmNvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzbl9hY3F1aXNpdGlvbi5vbnVfcG9zdF9kaXNjb3ZlcnlfbW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm9udV9wb3N0X2Rpc2NvdmVyeV9tb2RlID0gKGJjbW9sdF9vbnVfcG9zdF9kaXNjb3ZlcnlfbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNuX2FjcXVpc2l0aW9uLm9udV9wb3N0X2Rpc2NvdmVyeV9tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgc25fYWNxdWlzaXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9zbl9hY3F1aXNpdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfU05fQUNRVUlTSVRJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBzbl9hY3F1aXNpdGlvbiwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJrZXlfZXhjaGFuZ2UuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bvbl9rZXlfZXhjaGFuZ2UgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImtleV9leGNoYW5nZS5pbnRlcnZhbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmludGVydmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAia2V5X2V4Y2hhbmdlLmludGVydmFsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2V5X2V4Y2hhbmdlLmNvbnRyb2wiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jb250cm9sID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAia2V5X2V4Y2hhbmdlLmNvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXlfZXhjaGFuZ2UubW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1vZGUgPSAoYmNtb2x0X2tleV9leGNoYW5nZV9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAia2V5X2V4Y2hhbmdlLm1vZGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXlfZXhjaGFuZ2UuZW5jcnlwdGVkX3BvcnRzX29ubHkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5lbmNyeXB0ZWRfcG9ydHNfb25seSA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImtleV9leGNoYW5nZS5lbmNyeXB0ZWRfcG9ydHNfb25seSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGtleV9leGNoYW5nZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2tleV9leGNoYW5nZSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfS0VZX0VYQ0hBTkdFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwga2V5X2V4Y2hhbmdlLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmcudGltZW91dCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRpbWVvdXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcm90ZWN0aW9uX3N3aXRjaGluZy50aW1lb3V0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmcuZ3Bpb19waW4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5ncGlvX3BpbiA9IChiY21vbHRfZ3Bpb19waW4pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcm90ZWN0aW9uX3N3aXRjaGluZy5ncGlvX3BpbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nLm9wdGlvbnMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5vcHRpb25zID0gKGJjbW9sdF9wb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb3B0aW9ucykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByb3RlY3Rpb25fc3dpdGNoaW5nLm9wdGlvbnMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLm1hXzciKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tYV83ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZS5tYV83IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZS5tYV8zIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWFfMyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUubWFfMyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUubWFfMSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1hXzEgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLm1hXzEgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBjYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Nicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0NCUl9SVF9BTExPQ0FUSU9OX1BST0ZJTEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBjYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Fycl91MTZfMiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUuYXJyIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGkwOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFycmF5IGNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlLmFyciBtdXN0IGhhdmUgMiBlbGVtZW50c1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgMjsgaTArKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXSA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUuYXJyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYXJyX3UxNl8yIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9DQlJfTlJUX0FMTE9DQVRJT05fUFJPRklMRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImRiYS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wb25fZGJhIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkYmEuc3JfcmVwb3J0aW5nX2Jsb2NrX3NpemUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zcl9yZXBvcnRpbmdfYmxvY2tfc2l6ZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImRiYS5zcl9yZXBvcnRpbmdfYmxvY2tfc2l6ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRiYS5kYmFfbW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRiYV9tb2RlID0gKGJjbW9sdF9kYmFfbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImRiYS5kYmFfbW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGRiYSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wb25fZGJhIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9EQkEsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBkYmEsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicG93ZXJfbWFuYWdlbWVudC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb3dlcl9tYW5hZ2VtZW50Lmlsb3dwb3dlciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmlsb3dwb3dlciA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvd2VyX21hbmFnZW1lbnQuaWxvd3Bvd2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG93ZXJfbWFuYWdlbWVudC5pYXdhcmUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pYXdhcmUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb3dlcl9tYW5hZ2VtZW50Lmlhd2FyZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvd2VyX21hbmFnZW1lbnQuaXRyYW5zaW5pdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLml0cmFuc2luaXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb3dlcl9tYW5hZ2VtZW50Lml0cmFuc2luaXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb3dlcl9tYW5hZ2VtZW50Lml0eGluaXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pdHhpbml0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG93ZXJfbWFuYWdlbWVudC5pdHhpbml0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG93ZXJfbWFuYWdlbWVudC5pcnhvZmYiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pcnhvZmYgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb3dlcl9tYW5hZ2VtZW50LmlyeG9mZiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvd2VyX21hbmFnZW1lbnQubG93X3Bvd2VyX2Nsb2JpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG93X3Bvd2VyX2Nsb2JpID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG93ZXJfbWFuYWdlbWVudC5sb3dfcG93ZXJfY2xvYmkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBwb3dlcl9tYW5hZ2VtZW50LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X29udV9wb3dlcl9tYW5hZ2VtZW50X2NvbmZpZ3VyYXRpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPV0VSX01BTkFHRU1FTlQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBwb3dlcl9tYW5hZ2VtZW50LCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY29udHJvbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hbGdvcml0aG1fdHlwZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0uYWxnb3JpdGhtX3R5cGUgPSAoYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG1fdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hbGdvcml0aG1fdHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLmFsZ29yaXRobV90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9BTEdPUklUSE1fVFlQRV9FQVJMWV9ST0dVRV9ERVRFQ1RJT046CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0ubWVhc3VyZW1lbnRfdHlwZSIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24ubWVhc3VyZW1lbnRfdHlwZSA9IChiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLm1lYXN1cmVtZW50X3R5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5pbnRlcnZhbCIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24uaW50ZXJ2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5pbnRlcnZhbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLnNlY29uZF9yYW5naW5nX3dpbmRvdyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24uc2Vjb25kX3Jhbmdpbmdfd2luZG93ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5zZWNvbmRfcmFuZ2luZ193aW5kb3cgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hbGxvY190eXBlX3RvX3NjYW4iKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuZWFybHlfcm9ndWVfZGV0ZWN0aW9uLmFsbG9jX3R5cGVfdG9fc2NhbiA9IChiY21vbHRfYWxsb2NfdHlwZV90b19zY2FuKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWxsb2NfdHlwZV90b19zY2FuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fQUxHT1JJVEhNX1RZUEVfU1BFQ0lBTF9NQVA6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLiIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMudmFsID0gYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCBjbGlfcGFybS0+YXJyYXlfc2l6ZSAqIHNpemVvZigqdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy52YWwpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLnZhbCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy5sZW4gPSBjbGlfcGFybS0+YXJyYXlfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWNjZXNzZXMucGxvX3NpemUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLmxlbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hY2Nlc3Nlcy5wbG9fc2l6ZSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMubGVuOyBpMSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy52YWxbaTFdLnBsb19zaXplID0gY2xpX3Bhcm0tPnZhbHVlc1tpMV0udW51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWNjZXNzZXMuYWxsb2NfaWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLmxlbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hY2Nlc3Nlcy5hbGxvY19pZCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMubGVuOyBpMSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy52YWxbaTFdLmFsbG9jX2lkID0gKGJjbW9sdF9wb25fYWxsb2NfaWQpIGNsaV9wYXJtLT52YWx1ZXNbaTFdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLm9udV9pZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMubGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLm9udV9pZCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMubGVuOyBpMSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy52YWxbaTFdLm9udV9pZCA9IChiY21vbHRfcG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlc1tpMV0udW51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWNjZXNzZXMuYWNjZXNzX3NpemUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLmxlbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hY2Nlc3Nlcy5hY2Nlc3Nfc2l6ZSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMubGVuOyBpMSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy52YWxbaTFdLmFjY2Vzc19zaXplID0gY2xpX3Bhcm0tPnZhbHVlc1tpMV0udW51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWNjZXNzZXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9BTEdPUklUSE1fVFlQRV9FWFRFTkRFRF9HVUFSRF9USU1FOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFkZGl0aW9uYWxfZ3VhcmRfdGltZSIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5leHRlbmRlZF9ndWFyZF90aW1lLmFkZGl0aW9uYWxfZ3VhcmRfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFkZGl0aW9uYWxfZ3VhcmRfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1JPR1VFX09OVV9ERVRFQ1RJT05fUFJPQ0VTUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJwZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcuaW50ZXJ2YWwiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pbnRlcnZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcuaW50ZXJ2YWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nLmNvbnRyb2wiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jb250cm9sID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZy5jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9QRVJJT0RJQ19TVEFOREJZX1BPTl9NT05JVE9SSU5HLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJwcmJzX2NoZWNrZXIuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19jaGVja2VyLnBvbHlub20iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wb2x5bm9tID0gKGJjbW9sdF9wcmJzX3BvbHlub21pYWwpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcmJzX2NoZWNrZXIucG9seW5vbSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfY2hlY2tlci5tb2RlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubW9kZSA9IChiY21vbHRfcHJic19jaGVja2VyX21vZGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcmJzX2NoZWNrZXIubW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfY2hlY2tlci5kYXRhX2ludmVydCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRhdGFfaW52ZXJ0ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcmJzX2NoZWNrZXIuZGF0YV9pbnZlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2NoZWNrZXIuY29udHJvbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNvbnRyb2wgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcmJzX2NoZWNrZXIuY29udHJvbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHByYnNfY2hlY2tlciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkJTX0NIRUNLRVIsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBwcmJzX2NoZWNrZXIsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicHJic19nZW5lcmF0b3IuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2dlbmVyYXRvci5wb2x5bm9tIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucG9seW5vbSA9IChiY21vbHRfcHJic19wb2x5bm9taWFsKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19nZW5lcmF0b3IucG9seW5vbSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfZ2VuZXJhdG9yLmVycm9yX2luc2VydCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmVycm9yX2luc2VydCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19nZW5lcmF0b3IuZXJyb3JfaW5zZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19nZW5lcmF0b3IuaW52ZXJ0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaW52ZXJ0ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcmJzX2dlbmVyYXRvci5pbnZlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2dlbmVyYXRvci5jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY29udHJvbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByYnNfZ2VuZXJhdG9yLmNvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBwcmJzX2dlbmVyYXRvciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BSQlNfR0VORVJBVE9SLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcHJic19nZW5lcmF0b3IsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtaW5fZGF0YV9hbGxvY19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fYWxsb2NfaWQgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2dwb25fYWxsb2NfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIG1pbl9kYXRhX2FsbG9jX2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIG1pbl9kYXRhX2FsbG9jX2lkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfTUlOX0RBVEFfQUxMT0NfSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLmxvcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvcyA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24ubG9zIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24ub251X2FsYXJtcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm9udV9hbGFybXMgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLm9udV9hbGFybXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi50aXdpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudGl3aSA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24udGl3aSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLmFja190aW1lb3V0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWNrX3RpbWVvdXQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLmFja190aW1lb3V0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24uc2ZpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc2ZpID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi5zZmkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi5sb2tpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9raSA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24ubG9raSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9BVVRPTUFUSUNfT05VX0RFQUNUSVZBVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXNfYmFuZHdpZHRoX2xpbWl0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHVzX2JhbmR3aWR0aF9saW1pdCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCB1c19iYW5kd2lkdGhfbGltaXQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9VU19CQU5EV0lEVEhfTElNSVQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZGVidWcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bvbl9uaV9kZWJ1ZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVidWcubnVtYmVyX29mX2dlbV9wb3J0c19wZXJfb251Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubnVtYmVyX29mX2dlbV9wb3J0c19wZXJfb251ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZGVidWcubnVtYmVyX29mX2dlbV9wb3J0c19wZXJfb251IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgZGVidWcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9uaV9kZWJ1ZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfREVCVUcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBkZWJ1ZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJvbnVfdXBncmFkZV9wYXJhbXMuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9wYXJhbXMgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV91cGdyYWRlX3BhcmFtcy5yZXNwb25zZV90aW1lb3V0X21zIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmVzcG9uc2VfdGltZW91dF9tcyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV91cGdyYWRlX3BhcmFtcy5yZXNwb25zZV90aW1lb3V0X21zIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3VwZ3JhZGVfcGFyYW1zLm1heF9yZXRyeV9jb3VudCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1heF9yZXRyeV9jb3VudCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV91cGdyYWRlX3BhcmFtcy5tYXhfcmV0cnlfY291bnQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfdXBncmFkZV9wYXJhbXMub21jaV9mb3JtYXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5vbWNpX2Zvcm1hdCA9IChiY21vbHRfb21jaV9kZXZpY2VfaWQpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfdXBncmFkZV9wYXJhbXMub21jaV9mb3JtYXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfdXBncmFkZV9wYXJhbXMud2luZG93X3NpemUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC53aW5kb3dfc2l6ZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV91cGdyYWRlX3BhcmFtcy53aW5kb3dfc2l6ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV91cGdyYWRlX3BhcmFtcy5hY3RpdmF0ZV9jb21taXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hY3RpdmF0ZV9jb21taXQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV91cGdyYWRlX3BhcmFtcy5hY3RpdmF0ZV9jb21taXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfdXBncmFkZV9wYXJhbXMuZGVsYXlfZm9yX2NvbW1pdF9tcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRlbGF5X2Zvcl9jb21taXRfbXMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfdXBncmFkZV9wYXJhbXMuZGVsYXlfZm9yX2NvbW1pdF9tcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV91cGdyYWRlX3BhcmFtcy5tYXhfYWN0aXZhdGlvbl9hdHRlbXB0cyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1heF9hY3RpdmF0aW9uX2F0dGVtcHRzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X3VwZ3JhZGVfcGFyYW1zLm1heF9hY3RpdmF0aW9uX2F0dGVtcHRzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgb251X3VwZ3JhZGVfcGFyYW1zLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9PTlVfVVBHUkFERV9QQVJBTVMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBvbnVfdXBncmFkZV9wYXJhbXMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwc19jX3dhaXRfYmVmb3JlX2RlYWN0aXZhdGlvbl90aW1lb3V0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MTZfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHBzX2Nfd2FpdF9iZWZvcmVfZGVhY3RpdmF0aW9uX3RpbWVvdXQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcHNfY193YWl0X2JlZm9yZV9kZWFjdGl2YXRpb25fdGltZW91dCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BTX0NfV0FJVF9CRUZPUkVfREVBQ1RJVkFUSU9OX1RJTUVPVVQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiaXAzMl9pbmRpY2F0aW9uX2NvbnRyb2wiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgYmlwMzJfaW5kaWNhdGlvbl9jb250cm9sLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGJpcDMyX2luZGljYXRpb25fY29udHJvbCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0JJUDMyX0lORElDQVRJT05fQ09OVFJPTCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX25pX2NmZ19jbGVhcihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9uaV9jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19jbGVhciIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fTklfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX25pLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX25pLCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9uaV9jZmdfZ2V0X211bHRpKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fbmlfY2ZnIGNmZzsgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fbmlfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X21zZ19zZXQgKm1zZ19zZXQgPSBOVUxMOyAvKio8IGRlY2xhcmUgbWVzc2FnZSBzZXQgKi8KKyAgICB1aW50MzJfdCBtYXhfbXNnczsgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYXggbnVtYmVyIG9mIG1zZ3MgdG8gZ2V0ICovCisgICAgYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyOyAgICAgICAvKio8IGRlY2xhcmUgZmlsdGVyIGludmVydCBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9uaV9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldCogbXNnX3NldCA9IE5VTEw7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50MzJfdCBtYXhfbXNncztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXRfbXVsdGkiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX05JX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBtYXggbnVtYmVyIG9mIG1zZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhfbXNncyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgbWF4X21zZ3MgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1heF9tc2dzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coIm1heF9tc2dzID0gJWQ7XG4iLCBtYXhfbXNncyk7CisKKyAgICAvKiBzZXQgZmlsdGVyIGludmVydCBmbGFnIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyX2ludmVydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW52ZXJ0X2ZpbHRlciA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXJfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImludmVydF9maWx0ZXIgPSAlcztcbiIsIChpbnZlcnRfZmlsdGVyKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogYWxsb2NhdGUgbWVzc2FnZSBzZXQgKi8KKyAgICBlcnIgPSBhcGljbGlfbXNnX3NldF9hbGxvYyhieXRlX3Bvb2wsIEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldF9hbGxvYyhCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fbmksIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fbmksIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5wb25fc3RhdHVzLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Bvbl9zdGF0dXMgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wb25fc3RhdHVzLnN0YXRlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc3RhdGUgPSAoYmNtb2x0X3Bvbl9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wb25fc3RhdHVzLnN0YXRlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnBvbl9zdGF0dXMubG9zX3N0YXR1cyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvc19zdGF0dXMgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wb25fc3RhdHVzLmxvc19zdGF0dXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBwb25fc3RhdHVzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Bvbl9zdGF0dXMgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPTl9TVEFUVVMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBwb25fc3RhdHVzLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX3N0YXR1cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIHBvbl9zdGF0dXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgcG9uX3N0YXR1cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5hdmFpbGFibGVfYmFuZHdpZHRoLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Bvbl9hdmFpbGFibGVfYmFuZHdpZHRoIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYXZhaWxhYmxlX2JhbmR3aWR0aC5jYnJfYnciKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jYnJfYncgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYXZhaWxhYmxlX2JhbmR3aWR0aC5jYnJfYncgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYXZhaWxhYmxlX2JhbmR3aWR0aC50b3RhbF9idyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRvdGFsX2J3ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmF2YWlsYWJsZV9iYW5kd2lkdGgudG90YWxfYncgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYXZhaWxhYmxlX2JhbmR3aWR0aC5uZXh0X29udV90b3RhbF9idyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm5leHRfb251X3RvdGFsX2J3ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmF2YWlsYWJsZV9iYW5kd2lkdGgubmV4dF9vbnVfdG90YWxfYncgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBhdmFpbGFibGVfYmFuZHdpZHRoLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Bvbl9hdmFpbGFibGVfYmFuZHdpZHRoIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9BVkFJTEFCTEVfQkFORFdJRFRILCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgYXZhaWxhYmxlX2JhbmR3aWR0aCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImF2YWlsYWJsZV9iYW5kd2lkdGgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBhdmFpbGFibGVfYmFuZHdpZHRoKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIGF2YWlsYWJsZV9iYW5kd2lkdGgpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5udW1iZXJfb2ZfYWN0aXZlX29udXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgbnVtYmVyX29mX2FjdGl2ZV9vbnVzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIG51bWJlcl9vZl9hY3RpdmVfb251cywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX05VTUJFUl9PRl9BQ1RJVkVfT05VUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm51bWJlcl9vZl9hY3RpdmVfb251cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIG51bWJlcl9vZl9hY3RpdmVfb251cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBudW1iZXJfb2ZfYWN0aXZlX29udXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5udW1iZXJfb2ZfYWN0aXZlX3N0YW5kYnlfb251cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDE2X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBudW1iZXJfb2ZfYWN0aXZlX3N0YW5kYnlfb251cywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBudW1iZXJfb2ZfYWN0aXZlX3N0YW5kYnlfb251cywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX05VTUJFUl9PRl9BQ1RJVkVfU1RBTkRCWV9PTlVTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibnVtYmVyX29mX2FjdGl2ZV9zdGFuZGJ5X29udXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBudW1iZXJfb2ZfYWN0aXZlX3N0YW5kYnlfb251cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBudW1iZXJfb2ZfYWN0aXZlX3N0YW5kYnlfb251cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5wcmJzX3N0YXR1cy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wcmJzX3N0YXR1cyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfc3RhdHVzLmxvY2tfc3RhdGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb2NrX3N0YXRlID0gKGJjbW9sdF9wcmJzX2xvY2tfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19zdGF0dXMubG9ja19zdGF0ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX3N0YXR1cy5lcnJvcl9jb3VudHMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5lcnJvcl9jb3VudHMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19zdGF0dXMuZXJyb3JfY291bnRzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcHJic19zdGF0dXMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcHJic19zdGF0dXMgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BSQlNfU1RBVFVTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcHJic19zdGF0dXMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX3N0YXR1cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIHByYnNfc3RhdHVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIHByYnNfc3RhdHVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnBvbl9kaXN0YW5jZS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wb25fZGlzdGFuY2UgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wb25fZGlzdGFuY2UubWF4X2xvZ19kaXN0YW5jZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1heF9sb2dfZGlzdGFuY2UgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucG9uX2Rpc3RhbmNlLm1heF9sb2dfZGlzdGFuY2UgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucG9uX2Rpc3RhbmNlLm1heF9kaWZmX3JlYWNoIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWF4X2RpZmZfcmVhY2ggPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucG9uX2Rpc3RhbmNlLm1heF9kaWZmX3JlYWNoIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcG9uX2Rpc3RhbmNlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Bvbl9kaXN0YW5jZSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUE9OX0RJU1RBTkNFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcG9uX2Rpc3RhbmNlLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX2Rpc3RhbmNlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgcG9uX2Rpc3RhbmNlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIHBvbl9kaXN0YW5jZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJhbmdpbmdfd2luZG93X3NpemUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcmFuZ2luZ193aW5kb3dfc2l6ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCByYW5naW5nX3dpbmRvd19zaXplLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUkFOR0lOR19XSU5ET1dfU0laRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfd2luZG93X3NpemUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCByYW5naW5nX3dpbmRvd19zaXplKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIHJhbmdpbmdfd2luZG93X3NpemUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmVhc3NpZ25lZF9lcXVhbGl6YXRpb25fZGVsYXkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcHJlYXNzaWduZWRfZXF1YWxpemF0aW9uX2RlbGF5LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHByZWFzc2lnbmVkX2VxdWFsaXphdGlvbl9kZWxheSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BSRUFTU0lHTkVEX0VRVUFMSVpBVElPTl9ERUxBWSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByZWFzc2lnbmVkX2VxdWFsaXphdGlvbl9kZWxheSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIHByZWFzc2lnbmVkX2VxdWFsaXphdGlvbl9kZWxheSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBwcmVhc3NpZ25lZF9lcXVhbGl6YXRpb25fZGVsYXkpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lcWRfY3ljbGVzX251bWJlciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBlcWRfY3ljbGVzX251bWJlciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBlcWRfY3ljbGVzX251bWJlciwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0VRRF9DWUNMRVNfTlVNQkVSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXFkX2N5Y2xlc19udW1iZXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBlcWRfY3ljbGVzX251bWJlcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBlcWRfY3ljbGVzX251bWJlcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5wb3dlcl9sZXZlbC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wb25fcG93ZXJfbGV2ZWwgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wb3dlcl9sZXZlbC5wbHNfbWF4aW11bV9hbGxvY2F0aW9uX3NpemUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wbHNfbWF4aW11bV9hbGxvY2F0aW9uX3NpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucG93ZXJfbGV2ZWwucGxzX21heGltdW1fYWxsb2NhdGlvbl9zaXplIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnBvd2VyX2xldmVsLm1vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tb2RlID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnBvd2VyX2xldmVsLm1vZGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBwb3dlcl9sZXZlbCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wb25fcG93ZXJfbGV2ZWwgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPV0VSX0xFVkVMLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcG93ZXJfbGV2ZWwsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb3dlcl9sZXZlbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIHBvd2VyX2xldmVsKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIHBvd2VyX2xldmVsKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZHNfZmVjX21vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgZHNfZmVjX21vZGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgZHNfZmVjX21vZGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9EU19GRUNfTU9ERSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRzX2ZlY19tb2RlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgZHNfZmVjX21vZGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgZHNfZmVjX21vZGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuZHJpZnRfY29udHJvbC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wb25fZHJpZnRfY29udHJvbCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRyaWZ0X2NvbnRyb2wuZHJpZnRfaW50ZXJ2YWwiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kcmlmdF9pbnRlcnZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5kcmlmdF9jb250cm9sLmRyaWZ0X2ludGVydmFsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRyaWZ0X2NvbnRyb2wuZHJpZnRfbGltaXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kcmlmdF9saW1pdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5kcmlmdF9jb250cm9sLmRyaWZ0X2xpbWl0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRyaWZ0X2NvbnRyb2wudHJhbnNtaXNzaW9uX2NvbnRyb2xfbGltaXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50cmFuc21pc3Npb25fY29udHJvbF9saW1pdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5kcmlmdF9jb250cm9sLnRyYW5zbWlzc2lvbl9jb250cm9sX2xpbWl0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgZHJpZnRfY29udHJvbCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wb25fZHJpZnRfY29udHJvbCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfRFJJRlRfQ09OVFJPTCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGRyaWZ0X2NvbnRyb2wsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkcmlmdF9jb250cm9sIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgZHJpZnRfY29udHJvbCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBkcmlmdF9jb250cm9sKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Jlcl9pbnRlcnZhbCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfYmVyX2ludGVydmFsKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBkc19iZXJfcmVwb3J0aW5nX2ludGVydmFsLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9EU19CRVJfUkVQT1JUSU5HX0lOVEVSVkFMLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIGRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxvc19hbGFybV90aHJlc2hvbGQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBsb3NfYWxhcm1fdGhyZXNob2xkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGxvc19hbGFybV90aHJlc2hvbGQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9MT1NfQUxBUk1fVEhSRVNIT0xELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9zX2FsYXJtX3RocmVzaG9sZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIGxvc19hbGFybV90aHJlc2hvbGQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgbG9zX2FsYXJtX3RocmVzaG9sZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxvc19pbml0aWFsX3ZhbHVlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc3RhdHVzIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBsb3NfaW5pdGlhbF92YWx1ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBsb3NfaW5pdGlhbF92YWx1ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0xPU19JTklUSUFMX1ZBTFVFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9zX2luaXRpYWxfdmFsdWUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBsb3NfaW5pdGlhbF92YWx1ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBsb3NfaW5pdGlhbF92YWx1ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5vbnVfYWxhcm1zX3RocmVzaG9sZHMuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfYWxhcm1zX3RocmVzaG9sZHMubG9zaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvc2kgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIub251X2FsYXJtc190aHJlc2hvbGRzLmxvc2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X2FsYXJtc190aHJlc2hvbGRzLmxvZmkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb2ZpID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9udV9hbGFybXNfdGhyZXNob2xkcy5sb2ZpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9udV9hbGFybXNfdGhyZXNob2xkcy5sb2FtaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvYW1pID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9udV9hbGFybXNfdGhyZXNob2xkcy5sb2FtaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIG9udV9hbGFybXNfdGhyZXNob2xkcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX29udV9hbGFybXNfdGhyZXNob2xkcyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfT05VX0FMQVJNU19USFJFU0hPTERTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgb251X2FsYXJtc190aHJlc2hvbGRzLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2FsYXJtc190aHJlc2hvbGRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgb251X2FsYXJtc190aHJlc2hvbGRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIG9udV9hbGFybXNfdGhyZXNob2xkcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5iZXJfbW9uaXRvci4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9iZXJfbW9uaXRvcl9wYXJhbXMgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5iZXJfbW9uaXRvci51c19iZXJfaW50ZXJ2YWwiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC51c19iZXJfaW50ZXJ2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYmVyX21vbml0b3IudXNfYmVyX2ludGVydmFsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmJlcl9tb25pdG9yLnNmX3RocmVzaG9sZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnNmX3RocmVzaG9sZCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5iZXJfbW9uaXRvci5zZl90aHJlc2hvbGQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYmVyX21vbml0b3Iuc2RfdGhyZXNob2xkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc2RfdGhyZXNob2xkID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJlcl9tb25pdG9yLnNkX3RocmVzaG9sZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGJlcl9tb25pdG9yLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Jlcl9tb25pdG9yX3BhcmFtcyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQkVSX01PTklUT1IsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBiZXJfbW9uaXRvciwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJlcl9tb25pdG9yIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgYmVyX21vbml0b3IpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgYmVyX21vbml0b3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wbG9hbV9hY2tfdGltZW91dCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDE2X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBwbG9hbV9hY2tfdGltZW91dCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBwbG9hbV9hY2tfdGltZW91dCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BMT0FNX0FDS19USU1FT1VULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGxvYW1fYWNrX3RpbWVvdXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBwbG9hbV9hY2tfdGltZW91dCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBwbG9hbV9hY2tfdGltZW91dCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5vbnVfYWN0aXZhdGlvbi4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncG9uX29udV9hY3RpdmF0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X2FjdGl2YXRpb24ua2V5X2V4Y2hhbmdlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwua2V5X2V4Y2hhbmdlID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9udV9hY3RpdmF0aW9uLmtleV9leGNoYW5nZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfYWN0aXZhdGlvbi5wYXNzd29yZF9hdXRoZW50aWNhdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9udV9hY3RpdmF0aW9uLnBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9udV9hY3RpdmF0aW9uLmZhaWxfZHVlX3RvX3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5mYWlsX2R1ZV90b19wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9udV9hY3RpdmF0aW9uLmZhaWxfZHVlX3RvX3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBvbnVfYWN0aXZhdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX29udV9hY3RpdmF0aW9uIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9PTlVfQUNUSVZBVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIG9udV9hY3RpdmF0aW9uLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2FjdGl2YXRpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBvbnVfYWN0aXZhdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBvbnVfYWN0aXZhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5zbl9hY3F1aXNpdGlvbi4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncG9uX3NuX2FjcXVpc2l0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc25fYWNxdWlzaXRpb24uaW50ZXJ2YWwiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pbnRlcnZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zbl9hY3F1aXNpdGlvbi5pbnRlcnZhbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zbl9hY3F1aXNpdGlvbi5jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY29udHJvbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zbl9hY3F1aXNpdGlvbi5jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnNuX2FjcXVpc2l0aW9uLm9udV9wb3N0X2Rpc2NvdmVyeV9tb2RlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwub251X3Bvc3RfZGlzY292ZXJ5X21vZGUgPSAoYmNtb2x0X29udV9wb3N0X2Rpc2NvdmVyeV9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnNuX2FjcXVpc2l0aW9uLm9udV9wb3N0X2Rpc2NvdmVyeV9tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgc25fYWNxdWlzaXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9zbl9hY3F1aXNpdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfU05fQUNRVUlTSVRJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBzbl9hY3F1aXNpdGlvbiwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNuX2FjcXVpc2l0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgc25fYWNxdWlzaXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgc25fYWNxdWlzaXRpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIua2V5X2V4Y2hhbmdlLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fa2V5X2V4Y2hhbmdlIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIua2V5X2V4Y2hhbmdlLmludGVydmFsIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaW50ZXJ2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIua2V5X2V4Y2hhbmdlLmludGVydmFsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmtleV9leGNoYW5nZS5jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY29udHJvbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5rZXlfZXhjaGFuZ2UuY29udHJvbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5rZXlfZXhjaGFuZ2UubW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1vZGUgPSAoYmNtb2x0X2tleV9leGNoYW5nZV9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmtleV9leGNoYW5nZS5tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmtleV9leGNoYW5nZS5lbmNyeXB0ZWRfcG9ydHNfb25seSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmVuY3J5cHRlZF9wb3J0c19vbmx5ID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmtleV9leGNoYW5nZS5lbmNyeXB0ZWRfcG9ydHNfb25seSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGtleV9leGNoYW5nZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2tleV9leGNoYW5nZSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfS0VZX0VYQ0hBTkdFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwga2V5X2V4Y2hhbmdlLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2V5X2V4Y2hhbmdlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwga2V5X2V4Y2hhbmdlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIGtleV9leGNoYW5nZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5wcm90ZWN0aW9uX3N3aXRjaGluZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcm90ZWN0aW9uX3N3aXRjaGluZy50aW1lb3V0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudGltZW91dCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcm90ZWN0aW9uX3N3aXRjaGluZy50aW1lb3V0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByb3RlY3Rpb25fc3dpdGNoaW5nLmdwaW9fcGluIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZ3Bpb19waW4gPSAoYmNtb2x0X2dwaW9fcGluKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByb3RlY3Rpb25fc3dpdGNoaW5nLmdwaW9fcGluIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByb3RlY3Rpb25fc3dpdGNoaW5nLm9wdGlvbnMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5vcHRpb25zID0gKGJjbW9sdF9wb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb3B0aW9ucykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcm90ZWN0aW9uX3N3aXRjaGluZy5vcHRpb25zIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElORywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Nicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLm1hXzciKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tYV83ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUubWFfNyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLm1hXzMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tYV8zID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUubWFfMyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLm1hXzEiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tYV8xID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUubWFfMSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQ0JSX1JUX0FMTE9DQVRJT05fUFJPRklMRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBjYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Fycl91MTZfMiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlLmFyciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBpMDsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhcnJheSBmaWx0ZXIuY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUuYXJyIG11c3QgaGF2ZSAyIGVsZW1lbnRzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCAyOyBpMCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUuYXJyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYXJyX3UxNl8yIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9DQlJfTlJUX0FMTE9DQVRJT05fUFJPRklMRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBjYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBjYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5kYmEuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcG9uX2RiYSB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRiYS5zcl9yZXBvcnRpbmdfYmxvY2tfc2l6ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnNyX3JlcG9ydGluZ19ibG9ja19zaXplID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmRiYS5zcl9yZXBvcnRpbmdfYmxvY2tfc2l6ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kYmEuZGJhX21vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kYmFfbW9kZSA9IChiY21vbHRfZGJhX21vZGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZGJhLmRiYV9tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgZGJhLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Bvbl9kYmEgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RCQSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGRiYSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRiYSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIGRiYSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBkYmEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC5pbG93cG93ZXIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pbG93cG93ZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC5pbG93cG93ZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC5pYXdhcmUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pYXdhcmUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC5pYXdhcmUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC5pdHJhbnNpbml0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaXRyYW5zaW5pdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wb3dlcl9tYW5hZ2VtZW50Lml0cmFuc2luaXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC5pdHhpbml0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaXR4aW5pdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wb3dlcl9tYW5hZ2VtZW50Lml0eGluaXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC5pcnhvZmYiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pcnhvZmYgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC5pcnhvZmYgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC5sb3dfcG93ZXJfY2xvYmkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb3dfcG93ZXJfY2xvYmkgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC5sb3dfcG93ZXJfY2xvYmkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBwb3dlcl9tYW5hZ2VtZW50LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X29udV9wb3dlcl9tYW5hZ2VtZW50X2NvbmZpZ3VyYXRpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPV0VSX01BTkFHRU1FTlQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBwb3dlcl9tYW5hZ2VtZW50LCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG93ZXJfbWFuYWdlbWVudCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIHBvd2VyX21hbmFnZW1lbnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgcG93ZXJfbWFuYWdlbWVudCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmNvbnRyb2wiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jb250cm9sID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFsZ29yaXRobV90eXBlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS5hbGdvcml0aG1fdHlwZSA9IChiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hbGdvcml0aG1fdHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLmFsZ29yaXRobV90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9BTEdPUklUSE1fVFlQRV9FQVJMWV9ST0dVRV9ERVRFQ1RJT046CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLm1lYXN1cmVtZW50X3R5cGUiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuZWFybHlfcm9ndWVfZGV0ZWN0aW9uLm1lYXN1cmVtZW50X3R5cGUgPSAoYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl93aW5kb3cpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0ubWVhc3VyZW1lbnRfdHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5pbnRlcnZhbCIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24uaW50ZXJ2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uaW50ZXJ2YWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uc2Vjb25kX3Jhbmdpbmdfd2luZG93Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LmVhcmx5X3JvZ3VlX2RldGVjdGlvbi5zZWNvbmRfcmFuZ2luZ193aW5kb3cgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5zZWNvbmRfcmFuZ2luZ193aW5kb3cgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWxsb2NfdHlwZV90b19zY2FuIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LmVhcmx5X3JvZ3VlX2RldGVjdGlvbi5hbGxvY190eXBlX3RvX3NjYW4gPSAoYmNtb2x0X2FsbG9jX3R5cGVfdG9fc2NhbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hbGxvY190eXBlX3RvX3NjYW4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9BTEdPUklUSE1fVFlQRV9TUEVDSUFMX01BUDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLiIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMudmFsID0gYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCBjbGlfcGFybS0+YXJyYXlfc2l6ZSAqIHNpemVvZigqdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy52YWwpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLnZhbCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy5sZW4gPSBjbGlfcGFybS0+YXJyYXlfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLnBsb19zaXplIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy5sZW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLnBsb19zaXplIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy5sZW47IGkxKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLnZhbFtpMV0ucGxvX3NpemUgPSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWNjZXNzZXMuYWxsb2NfaWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLmxlbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWNjZXNzZXMuYWxsb2NfaWQgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLmxlbjsgaTErKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMudmFsW2kxXS5hbGxvY19pZCA9IChiY21vbHRfcG9uX2FsbG9jX2lkKSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWNjZXNzZXMub251X2lkIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy5sZW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLm9udV9pZCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMubGVuOyBpMSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy52YWxbaTFdLm9udV9pZCA9IChiY21vbHRfcG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlc1tpMV0udW51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLmFjY2Vzc19zaXplIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy5sZW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLmFjY2Vzc19zaXplIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy5sZW47IGkxKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLnZhbFtpMV0uYWNjZXNzX3NpemUgPSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWNjZXNzZXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9BTEdPUklUSE1fVFlQRV9FWFRFTkRFRF9HVUFSRF9USU1FOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hZGRpdGlvbmFsX2d1YXJkX3RpbWUiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuZXh0ZW5kZWRfZ3VhcmRfdGltZS5hZGRpdGlvbmFsX2d1YXJkX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWRkaXRpb25hbF9ndWFyZF90aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1JPR1VFX09OVV9ERVRFQ1RJT05fUFJPQ0VTUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIHJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCByb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZy5pbnRlcnZhbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmludGVydmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcuaW50ZXJ2YWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZy5jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY29udHJvbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nLmNvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBwZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BFUklPRElDX1NUQU5EQllfUE9OX01PTklUT1JJTkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBwZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIHBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5wcmJzX2NoZWNrZXIuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfY2hlY2tlci5wb2x5bm9tIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucG9seW5vbSA9IChiY21vbHRfcHJic19wb2x5bm9taWFsKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByYnNfY2hlY2tlci5wb2x5bm9tIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfY2hlY2tlci5tb2RlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubW9kZSA9IChiY21vbHRfcHJic19jaGVja2VyX21vZGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19jaGVja2VyLm1vZGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19jaGVja2VyLmRhdGFfaW52ZXJ0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZGF0YV9pbnZlcnQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX2NoZWNrZXIuZGF0YV9pbnZlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19jaGVja2VyLmNvbnRyb2wiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jb250cm9sID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByYnNfY2hlY2tlci5jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcHJic19jaGVja2VyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHByYnNfY2hlY2tlciwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfY2hlY2tlciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIHByYnNfY2hlY2tlcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBwcmJzX2NoZWNrZXIpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucHJic19nZW5lcmF0b3IuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19nZW5lcmF0b3IucG9seW5vbSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnBvbHlub20gPSAoYmNtb2x0X3ByYnNfcG9seW5vbWlhbCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX2dlbmVyYXRvci5wb2x5bm9tIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfZ2VuZXJhdG9yLmVycm9yX2luc2VydCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmVycm9yX2luc2VydCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByYnNfZ2VuZXJhdG9yLmVycm9yX2luc2VydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX2dlbmVyYXRvci5pbnZlcnQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pbnZlcnQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX2dlbmVyYXRvci5pbnZlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19nZW5lcmF0b3IuY29udHJvbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNvbnRyb2wgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19nZW5lcmF0b3IuY29udHJvbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHByYnNfZ2VuZXJhdG9yLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUFJCU19HRU5FUkFUT1IsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBwcmJzX2dlbmVyYXRvciwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfZ2VuZXJhdG9yIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgcHJic19nZW5lcmF0b3IpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgcHJic19nZW5lcmF0b3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5taW5fZGF0YV9hbGxvY19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fYWxsb2NfaWQgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2dwb25fYWxsb2NfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIG1pbl9kYXRhX2FsbG9jX2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIG1pbl9kYXRhX2FsbG9jX2lkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfTUlOX0RBVEFfQUxMT0NfSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtaW5fZGF0YV9hbGxvY19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIG1pbl9kYXRhX2FsbG9jX2lkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIG1pbl9kYXRhX2FsbG9jX2lkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24ubG9zIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9zID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24ubG9zIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLm9udV9hbGFybXMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5vbnVfYWxhcm1zID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24ub251X2FsYXJtcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi50aXdpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudGl3aSA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLnRpd2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24uYWNrX3RpbWVvdXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hY2tfdGltZW91dCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLmFja190aW1lb3V0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLnNmaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnNmaSA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLnNmaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi5sb2tpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9raSA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLmxva2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQVVUT01BVElDX09OVV9ERUFDVElWQVRJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci51c19iYW5kd2lkdGhfbGltaXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgdXNfYmFuZHdpZHRoX2xpbWl0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHVzX2JhbmR3aWR0aF9saW1pdCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1VTX0JBTkRXSURUSF9MSU1JVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVzX2JhbmR3aWR0aF9saW1pdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIHVzX2JhbmR3aWR0aF9saW1pdCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCB1c19iYW5kd2lkdGhfbGltaXQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuYWxsX29udXMuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4IHZhbCA9IHsgfTsKKyAgICAgICAgaW50MzJfdCBpMjsKKyAgICAgICAgdmFsLnZhbCA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgY2xpX3Bhcm0tPmFycmF5X3NpemUgKiBzaXplb2YoKnZhbC52YWwpKTsKKyAgICAgICAgaWYgKHZhbC52YWwgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgICAgIH0KKworICAgICAgICB2YWwubGVuID0gY2xpX3Bhcm0tPmFycmF5X3NpemU7CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsbF9vbnVzLm9udV9pZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5sZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGxfb251cy5vbnVfaWQgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCB2YWwubGVuOyBpMisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC52YWxbaTJdLm9udV9pZCA9IChiY21vbHRfZ3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZXNbaTJdLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGxfb251cy5zdGF0ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5sZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGxfb251cy5zdGF0ZSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHZhbC5sZW47IGkyKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnZhbFtpMl0uc3RhdGUgPSAoYmNtb2x0X29udV9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlc1tpMl0uZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGFsbF9vbnVzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQUxMX09OVVMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBhbGxfb251cywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsbF9vbnVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgYWxsX29udXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgYWxsX29udXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuYWxsX21jYXN0X2dlbV9wb3J0cy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCB2YWwgPSB7IH07CisgICAgICAgIGludDMyX3QgaTM7CisgICAgICAgIHZhbC52YWwgPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIGNsaV9wYXJtLT5hcnJheV9zaXplICogc2l6ZW9mKCp2YWwudmFsKSk7CisgICAgICAgIGlmICh2YWwudmFsID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICB9CisKKyAgICAgICAgdmFsLmxlbiA9IGNsaV9wYXJtLT5hcnJheV9zaXplOworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGxfbWNhc3RfZ2VtX3BvcnRzLmdlbV9pZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5sZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGxfbWNhc3RfZ2VtX3BvcnRzLmdlbV9pZCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IHZhbC5sZW47IGkzKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnZhbFtpM10uZ2VtX2lkID0gKGJjbW9sdF9ncG9uX2dlbV9pZCkgY2xpX3Bhcm0tPnZhbHVlc1tpM10udW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsbF9tY2FzdF9nZW1fcG9ydHMuc3RhdGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSB2YWwubGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxsX21jYXN0X2dlbV9wb3J0cy5zdGF0ZSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IHZhbC5sZW47IGkzKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnZhbFtpM10uc3RhdGUgPSAoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZXNbaTNdLmVudW1fdmFsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBhbGxfbWNhc3RfZ2VtX3BvcnRzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9BTExfTUNBU1RfR0VNX1BPUlRTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgYWxsX21jYXN0X2dlbV9wb3J0cywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsbF9tY2FzdF9nZW1fcG9ydHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBhbGxfbWNhc3RfZ2VtX3BvcnRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIGFsbF9tY2FzdF9nZW1fcG9ydHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuZGVidWcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bvbl9uaV9kZWJ1ZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRlYnVnLm51bWJlcl9vZl9nZW1fcG9ydHNfcGVyX29udSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm51bWJlcl9vZl9nZW1fcG9ydHNfcGVyX29udSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5kZWJ1Zy5udW1iZXJfb2ZfZ2VtX3BvcnRzX3Blcl9vbnUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBkZWJ1ZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX2RlYnVnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9ERUJVRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGRlYnVnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVidWciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBkZWJ1Zyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBkZWJ1Zyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9wYXJhbXMgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMucmVzcG9uc2VfdGltZW91dF9tcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJlc3BvbnNlX3RpbWVvdXRfbXMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLnJlc3BvbnNlX3RpbWVvdXRfbXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLm1heF9yZXRyeV9jb3VudCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1heF9yZXRyeV9jb3VudCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMubWF4X3JldHJ5X2NvdW50IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9udV91cGdyYWRlX3BhcmFtcy5vbWNpX2Zvcm1hdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm9tY2lfZm9ybWF0ID0gKGJjbW9sdF9vbWNpX2RldmljZV9pZCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMub21jaV9mb3JtYXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLndpbmRvd19zaXplIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwud2luZG93X3NpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLndpbmRvd19zaXplIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9udV91cGdyYWRlX3BhcmFtcy5hY3RpdmF0ZV9jb21taXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hY3RpdmF0ZV9jb21taXQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMuYWN0aXZhdGVfY29tbWl0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9udV91cGdyYWRlX3BhcmFtcy5kZWxheV9mb3JfY29tbWl0X21zIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZGVsYXlfZm9yX2NvbW1pdF9tcyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMuZGVsYXlfZm9yX2NvbW1pdF9tcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMubWF4X2FjdGl2YXRpb25fYXR0ZW1wdHMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tYXhfYWN0aXZhdGlvbl9hdHRlbXB0cyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMubWF4X2FjdGl2YXRpb25fYXR0ZW1wdHMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBvbnVfdXBncmFkZV9wYXJhbXMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9wYXJhbXMgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX09OVV9VUEdSQURFX1BBUkFNUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIG9udV91cGdyYWRlX3BhcmFtcywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV91cGdyYWRlX3BhcmFtcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fbmksIG9udV91cGdyYWRlX3BhcmFtcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBvbnVfdXBncmFkZV9wYXJhbXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wc19jX3dhaXRfYmVmb3JlX2RlYWN0aXZhdGlvbl90aW1lb3V0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MTZfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHBzX2Nfd2FpdF9iZWZvcmVfZGVhY3RpdmF0aW9uX3RpbWVvdXQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgcHNfY193YWl0X2JlZm9yZV9kZWFjdGl2YXRpb25fdGltZW91dCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BTX0NfV0FJVF9CRUZPUkVfREVBQ1RJVkFUSU9OX1RJTUVPVVQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwc19jX3dhaXRfYmVmb3JlX2RlYWN0aXZhdGlvbl90aW1lb3V0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgcHNfY193YWl0X2JlZm9yZV9kZWFjdGl2YXRpb25fdGltZW91dCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBwc19jX3dhaXRfYmVmb3JlX2RlYWN0aXZhdGlvbl90aW1lb3V0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYmlwMzJfaW5kaWNhdGlvbl9jb250cm9sIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfY29udHJvbF9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIGJpcDMyX2luZGljYXRpb25fY29udHJvbCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX25pLCBiaXAzMl9pbmRpY2F0aW9uX2NvbnRyb2wsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0NGR19JRF9CSVAzMl9JTkRJQ0FUSU9OX0NPTlRST0wsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiaXAzMl9pbmRpY2F0aW9uX2NvbnRyb2wiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBiaXAzMl9pbmRpY2F0aW9uX2NvbnRyb2wpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgYmlwMzJfaW5kaWNhdGlvbl9jb250cm9sKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX25pLCBwb25fc3RhdHVzKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9uaSwgYXZhaWxhYmxlX2JhbmR3aWR0aCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fbmksIG51bWJlcl9vZl9hY3RpdmVfb251cykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fbmksIG51bWJlcl9vZl9hY3RpdmVfc3RhbmRieV9vbnVzKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9uaSwgcHJic19zdGF0dXMpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX25pLCBwb25fZGlzdGFuY2UpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX25pLCByYW5naW5nX3dpbmRvd19zaXplKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9uaSwgcHJlYXNzaWduZWRfZXF1YWxpemF0aW9uX2RlbGF5KSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9uaSwgZXFkX2N5Y2xlc19udW1iZXIpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX25pLCBwb3dlcl9sZXZlbCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fbmksIGRzX2ZlY19tb2RlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9uaSwgZHJpZnRfY29udHJvbCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fbmksIGRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX25pLCBsb3NfYWxhcm1fdGhyZXNob2xkKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9uaSwgbG9zX2luaXRpYWxfdmFsdWUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX25pLCBvbnVfYWxhcm1zX3RocmVzaG9sZHMpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX25pLCBiZXJfbW9uaXRvcikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fbmksIHBsb2FtX2Fja190aW1lb3V0KSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9uaSwgb251X2FjdGl2YXRpb24pICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX25pLCBzbl9hY3F1aXNpdGlvbikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fbmksIGtleV9leGNoYW5nZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9uaSwgY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fbmksIGNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9uaSwgZGJhKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9uaSwgcG93ZXJfbWFuYWdlbWVudCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fbmksIHJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fbmksIHBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX25pLCBwcmJzX2NoZWNrZXIpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX25pLCBwcmJzX2dlbmVyYXRvcikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fbmksIG1pbl9kYXRhX2FsbG9jX2lkKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9uaSwgYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24pICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX25pLCB1c19iYW5kd2lkdGhfbGltaXQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX25pLCBhbGxfb251cykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fbmksIGFsbF9tY2FzdF9nZW1fcG9ydHMpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX25pLCBkZWJ1ZykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fbmksIG9udV91cGdyYWRlX3BhcmFtcykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fbmksIHBzX2Nfd2FpdF9iZWZvcmVfZGVhY3RpdmF0aW9uX3RpbWVvdXQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX25pLCBiaXAzMl9pbmRpY2F0aW9uX2NvbnRyb2wpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9uaSwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX25pLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fbmlfc3RhdF9nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fbmlfc3RhdCBzdGF0OyAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fbmlfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb3NfYm9vbCBjbGVhcl9vbl9yZWFkOyAgICAgICAvKio8IGRlY2xhcmUgJ2NsZWFyIG9uIHJlYWQnIGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX3N0YXQgc3RhdDtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBjbGVhcl9vbl9yZWFkO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX05JX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IGZsYWdzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2xlYXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNsZWFyX29uX3JlYWQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2xlYXIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiY2xlYXJfb25fcmVhZCA9ICVzO1xuIiwgKGNsZWFyX29uX3JlYWQpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX1NUQVRfSU5JVCgmc3RhdCwgZ3Bvbl9uaSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9JTklUKCZzdGF0LCBncG9uX25pLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZlY19jb2Rld29yZHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgZmVjX2NvZGV3b3Jkcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgZmVjX2NvZGV3b3Jkcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmVjX2NvZGV3b3Jkc191bmNvcnJlY3RlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCBmZWNfY29kZXdvcmRzX3VuY29ycmVjdGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCBmZWNfY29kZXdvcmRzX3VuY29ycmVjdGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiaXA4X2J5dGVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIGJpcDhfYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIGJpcDhfYnl0ZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJpcDhfZXJyb3JzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIGJpcDhfZXJyb3JzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCBiaXA4X2Vycm9ycyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfZ2VtX3BhY2tldHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfZ2VtX3BhY2tldHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHJ4X2dlbV9wYWNrZXRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9nZW1fZHJvcHBlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCByeF9nZW1fZHJvcHBlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfZ2VtX2Ryb3BwZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2dlbV9pZGxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHJ4X2dlbV9pZGxlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCByeF9nZW1faWRsZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfZ2VtX2NvcnJlY3RlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCByeF9nZW1fY29ycmVjdGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCByeF9nZW1fY29ycmVjdGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9nZW1faWxsZWdhbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCByeF9nZW1faWxsZWdhbCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfZ2VtX2lsbGVnYWwpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2FsbG9jYXRpb25zX3ZhbGlkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHJ4X2FsbG9jYXRpb25zX3ZhbGlkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCByeF9hbGxvY2F0aW9uc192YWxpZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfYWxsb2NhdGlvbnNfaW52YWxpZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCByeF9hbGxvY2F0aW9uc19pbnZhbGlkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCByeF9hbGxvY2F0aW9uc19pbnZhbGlkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9hbGxvY2F0aW9uc19kaXNhYmxlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCByeF9hbGxvY2F0aW9uc19kaXNhYmxlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfYWxsb2NhdGlvbnNfZGlzYWJsZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3Bsb2FtcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCByeF9wbG9hbXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHJ4X3Bsb2Ftcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfcGxvYW1zX25vbl9pZGxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHJ4X3Bsb2Ftc19ub25faWRsZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfcGxvYW1zX25vbl9pZGxlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9wbG9hbXNfZXJyb3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfcGxvYW1zX2Vycm9yKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCByeF9wbG9hbXNfZXJyb3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3Bsb2Ftc19kcm9wcGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHJ4X3Bsb2Ftc19kcm9wcGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCByeF9wbG9hbXNfZHJvcHBlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfY3B1Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHJ4X2NwdSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfY3B1KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9vbWNpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHJ4X29tY2kpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHJ4X29tY2kpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfb21jaV9wYWNrZXRzX2NyY19lcnJvcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfb21jaV9wYWNrZXRzX2NyY19lcnJvcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfZHJvcHBlZF90b29fc2hvcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfZHJvcHBlZF90b29fc2hvcnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHJ4X2Ryb3BwZWRfdG9vX3Nob3J0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9kcm9wcGVkX3Rvb19sb25nIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHJ4X2Ryb3BwZWRfdG9vX2xvbmcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHJ4X2Ryb3BwZWRfdG9vX2xvbmcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2NyY19lcnJvcnMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfY3JjX2Vycm9ycyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfY3JjX2Vycm9ycyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfa2V5X2Vycm9ycyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCByeF9rZXlfZXJyb3JzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCByeF9rZXlfZXJyb3JzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9mcmFnbWVudHNfZXJyb3JzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHJ4X2ZyYWdtZW50c19lcnJvcnMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHJ4X2ZyYWdtZW50c19lcnJvcnMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3BhY2tldHNfZHJvcHBlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCByeF9wYWNrZXRzX2Ryb3BwZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHJ4X3BhY2tldHNfZHJvcHBlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfZ2VtIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHR4X2dlbSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgdHhfZ2VtKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9wbG9hbXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgdHhfcGxvYW1zKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCB0eF9wbG9hbXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2dlbV9mcmFnbWVudHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgdHhfZ2VtX2ZyYWdtZW50cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgdHhfZ2VtX2ZyYWdtZW50cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfY3B1Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHR4X2NwdSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgdHhfY3B1KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9vbWNpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHR4X29tY2kpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHR4X29tY2kpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2NwdV9vbWNpX3BhY2tldHNfZHJvcHBlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCB0eF9jcHVfb21jaV9wYWNrZXRzX2Ryb3BwZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIHR4X2NwdV9vbWNpX3BhY2tldHNfZHJvcHBlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfZHJvcHBlZF9pbGxlZ2FsX2xlbmd0aCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCB0eF9kcm9wcGVkX2lsbGVnYWxfbGVuZ3RoKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCB0eF9kcm9wcGVkX2lsbGVnYWxfbGVuZ3RoKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9kcm9wcGVkX3RwaWRfbWlzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCB0eF9kcm9wcGVkX3RwaWRfbWlzcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgdHhfZHJvcHBlZF90cGlkX21pc3MpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2Ryb3BwZWRfdmlkX21pc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgdHhfZHJvcHBlZF92aWRfbWlzcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9uaSwgdHhfZHJvcHBlZF92aWRfbWlzcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fbmksIGZlY19jb2Rld29yZHMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9uaSwgZmVjX2NvZGV3b3Jkc191bmNvcnJlY3RlZCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX25pLCBiaXA4X2J5dGVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fbmksIGJpcDhfZXJyb3JzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fbmksIHJ4X2dlbV9wYWNrZXRzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fbmksIHJ4X2dlbV9kcm9wcGVkKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fbmksIHJ4X2dlbV9pZGxlKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fbmksIHJ4X2dlbV9jb3JyZWN0ZWQpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfZ2VtX2lsbGVnYWwpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfYWxsb2NhdGlvbnNfdmFsaWQpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfYWxsb2NhdGlvbnNfaW52YWxpZCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX25pLCByeF9hbGxvY2F0aW9uc19kaXNhYmxlZCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX25pLCByeF9wbG9hbXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfcGxvYW1zX25vbl9pZGxlKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fbmksIHJ4X3Bsb2Ftc19lcnJvcikgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX25pLCByeF9wbG9hbXNfZHJvcHBlZCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX25pLCByeF9jcHUpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfb21jaSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX25pLCByeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fbmksIHJ4X2Ryb3BwZWRfdG9vX3Nob3J0KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fbmksIHJ4X2Ryb3BwZWRfdG9vX2xvbmcpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfY3JjX2Vycm9ycykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX25pLCByeF9rZXlfZXJyb3JzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fbmksIHJ4X2ZyYWdtZW50c19lcnJvcnMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9uaSwgcnhfcGFja2V0c19kcm9wcGVkKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fbmksIHR4X2dlbSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX25pLCB0eF9wbG9hbXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9uaSwgdHhfZ2VtX2ZyYWdtZW50cykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX25pLCB0eF9jcHUpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9uaSwgdHhfb21jaSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX25pLCB0eF9jcHVfb21jaV9wYWNrZXRzX2Ryb3BwZWQpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9uaSwgdHhfZHJvcHBlZF9pbGxlZ2FsX2xlbmd0aCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX25pLCB0eF9kcm9wcGVkX3RwaWRfbWlzcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX25pLCB0eF9kcm9wcGVkX3ZpZF9taXNzKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX25pLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfZ2V0KGRldmljZV9pZCwgJnN0YXQuaGRyLCBjbGVhcl9vbl9yZWFkKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXQuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdC5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9uaV9vcGVyX3NldF9wb25fc3RhdGVfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGUgb3BlcjsgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyB9OyAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9OSV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZ3Bvbl9uaSwgc2V0X3Bvbl9zdGF0ZSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX25pLCBzZXRfcG9uX3N0YXRlLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Bvbl9vcGVyYXRpb24gdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3Bvbl9vcGVyYXRpb24pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25fbmksIHNldF9wb25fc3RhdGUsIHBvbl9zdGF0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25fbmksIHNldF9wb25fc3RhdGUsIHBvbl9zdGF0ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9HUE9OX05JX09QRVJfSURfU0VUX1BPTl9TVEFURSwgQkNNT0xUX0dQT05fTklfU0VUX1BPTl9TVEFURV9JRF9QT05fU1RBVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX25pX29wZXJfcmVzZXRfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX25pX3Jlc2V0IG9wZXI7ICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fbmlfcmVzZXQgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX05JX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX25pLCByZXNldCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX25pLCByZXNldCwga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX25pX29wZXJfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXIgb3BlcjsgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyB9OyAgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlciBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fTklfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGdwb25fbmksIGRpc2FibGVfc2VyaWFsX251bWJlciwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX25pLCBkaXNhYmxlX3NlcmlhbF9udW1iZXIsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY29udHJvbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Rpc2FibGVfc2VyaWFsX251bWJlcl9jb250cm9sIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9kaXNhYmxlX3NlcmlhbF9udW1iZXJfY29udHJvbCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9uaSwgZGlzYWJsZV9zZXJpYWxfbnVtYmVyLCBjb250cm9sLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9uaSwgZGlzYWJsZV9zZXJpYWxfbnVtYmVyLCBjb250cm9sLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9ESVNBQkxFX1NFUklBTF9OVU1CRVIsIEJDTU9MVF9HUE9OX05JX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9JRF9DT05UUk9MLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInNlcmlhbF9udW1iZXIuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc2VyaWFsX251bWJlciB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2VyaWFsX251bWJlci52ZW5kb3JfaWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgc2VyaWFsX251bWJlci52ZW5kb3JfaWQgbXVzdCBoYXZlIDQgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC52ZW5kb3JfaWQsIDQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNlcmlhbF9udW1iZXIudmVuZG9yX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2VyaWFsX251bWJlci52ZW5kb3Jfc3BlY2lmaWMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgc2VyaWFsX251bWJlci52ZW5kb3Jfc3BlY2lmaWMgbXVzdCBoYXZlIDQgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC52ZW5kb3Jfc3BlY2lmaWMsIDQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX25pLCBkaXNhYmxlX3NlcmlhbF9udW1iZXIsIHNlcmlhbF9udW1iZXIsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfc2VyaWFsX251bWJlciB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9ESVNBQkxFX1NFUklBTF9OVU1CRVIsIEJDTU9MVF9HUE9OX05JX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9JRF9TRVJJQUxfTlVNQkVSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX25pLCBkaXNhYmxlX3NlcmlhbF9udW1iZXIsIHNlcmlhbF9udW1iZXIsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX25pX29wZXJfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZ19zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fbmlfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZyBvcGVyOyAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fbmlfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZyBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fTklfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGdwb25fbmksIHNpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmcsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZ3Bvbl9uaSwgc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZywga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX25pX29wZXJfc2V0X29udV9zdGF0ZV9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZSBvcGVyOyAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7IH07ICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGUgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX05JX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX25pLCBzZXRfb251X3N0YXRlLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGdwb25fbmksIHNldF9vbnVfc3RhdGUsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfb251X29wZXJhdGlvbiB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfb251X29wZXJhdGlvbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9uaSwgc2V0X29udV9zdGF0ZSwgb251X3N0YXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9uaSwgc2V0X29udV9zdGF0ZSwgb251X3N0YXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9TRVRfT05VX1NUQVRFLCBCQ01PTFRfR1BPTl9OSV9TRVRfT05VX1NUQVRFX0lEX09OVV9TVEFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fbmlfcHJveHlfY3B1X3BhY2tldHNfc2VuZChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzIHByb3h5OyAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyB9OyAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0cyBwcm94eTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfcHJveHlfc2VuZCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fTklfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9QUk9YWV9JTklUKCZwcm94eSwgZ3Bvbl9uaSwgY3B1X3BhY2tldHMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX1BST1hZX0lOSVQoJnByb3h5LCBncG9uX25pLCBjcHVfcGFja2V0cywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwYWNrZXRfdHlwZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3BhY2tldF90eXBlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9wYWNrZXRfdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCBncG9uX25pLCBjcHVfcGFja2V0cywgcGFja2V0X3R5cGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fbmksIGNwdV9wYWNrZXRzLCBwYWNrZXRfdHlwZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX1BST1hZLCBCQ01PTFRfR1BPTl9OSV9QUk9YWV9JRF9DUFVfUEFDS0VUUywgQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfSURfUEFDS0VUX1RZUEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjYWxjX2NyYyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fbmksIGNwdV9wYWNrZXRzLCBjYWxjX2NyYywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgZ3Bvbl9uaSwgY3B1X3BhY2tldHMsIGNhbGNfY3JjLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFksIEJDTU9MVF9HUE9OX05JX1BST1hZX0lEX0NQVV9QQUNLRVRTLCBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9DQUxDX0NSQywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdlbV9wb3J0X2xpc3QiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNiB2YWwgPSB7IH07CisgICAgICAgIGludDMyX3QgaTA7CisgICAgICAgIHZhbC52YWwgPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIGNsaV9wYXJtLT5hcnJheV9zaXplICogc2l6ZW9mKCp2YWwudmFsKSk7CisgICAgICAgIGlmICh2YWwudmFsID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICB9CisKKyAgICAgICAgdmFsLmxlbiA9IGNsaV9wYXJtLT5hcnJheV9zaXplOworICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB2YWwubGVuOyBpMCsrKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudmFsW2kwXSA9IChiY21vbHRfZ3Bvbl9nZW1faWQpIGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCBncG9uX25pLCBjcHVfcGFja2V0cywgZ2VtX3BvcnRfbGlzdCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFksIEJDTU9MVF9HUE9OX05JX1BST1hZX0lEX0NQVV9QQUNLRVRTLCBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9HRU1fUE9SVF9MSVNULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fbmksIGNwdV9wYWNrZXRzLCBnZW1fcG9ydF9saXN0LCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYnVmZmVyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDggdmFsID0geyB9OworICAgICAgICB2YWwubGVuID0gYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcik7CisgICAgICAgIHZhbC52YWwgPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIHZhbC5sZW4pOworICAgICAgICBpZiAodmFsLnZhbCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgfQorCisgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLnZhbCwgdmFsLmxlbik7CisgICAgICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fbmksIGNwdV9wYWNrZXRzLCBidWZmZXIsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDggdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX1BST1hZLCBCQ01PTFRfR1BPTl9OSV9QUk9YWV9JRF9DUFVfUEFDS0VUUywgQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fbmksIGNwdV9wYWNrZXRzLCBidWZmZXIsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfcHJveHlfc2VuZChkZXZpY2VfaWQsICZwcm94eS5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9wcm94eV9zZW5kKGRldmljZV9pZCwgJnByb3h5Lmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBwcm94eS5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9uaV9wcm94eV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X3NlbmQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldCBwcm94eTsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7IH07ICAgICAgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXQgcHJveHk7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3Byb3h5X3NlbmQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX05JX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfUFJPWFlfSU5JVCgmcHJveHksIGdwb25fbmksIGJyb2FkY2FzdF9wbG9hbV9wYWNrZXQsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX1BST1hZX0lOSVQoJnByb3h5LCBncG9uX25pLCBicm9hZGNhc3RfcGxvYW1fcGFja2V0LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJwbG9hbS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hcnJfdThfMTIgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBsb2FtLmFyciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDEyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgcGxvYW0uYXJyIG11c3QgaGF2ZSAxMiBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLmFyciwgMTIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBsb2FtLmFyciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCBncG9uX25pLCBicm9hZGNhc3RfcGxvYW1fcGFja2V0LCBwbG9hbSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9hcnJfdThfMTIgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX1BST1hZLCBCQ01PTFRfR1BPTl9OSV9QUk9YWV9JRF9CUk9BRENBU1RfUExPQU1fUEFDS0VULCBCQ01PTFRfR1BPTl9OSV9CUk9BRENBU1RfUExPQU1fUEFDS0VUX0lEX1BMT0FNLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fbmksIGJyb2FkY2FzdF9wbG9hbV9wYWNrZXQsIHBsb2FtLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3Byb3h5X3NlbmQoZGV2aWNlX2lkLCAmcHJveHkuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfcHJveHlfc2VuZChkZXZpY2VfaWQsICZwcm94eS5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgcHJveHkuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fbmlfb3Blcl9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93IG9wZXI7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyB9OyAgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3cgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX05JX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX25pLCByb2d1ZV9kZXRlY3Rpb25fd2luZG93LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGdwb25fbmksIHJvZ3VlX2RldGVjdGlvbl93aW5kb3csIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAid2luZG93X3R5cGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93IHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93KSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX25pLCByb2d1ZV9kZXRlY3Rpb25fd2luZG93LCB3aW5kb3dfdHlwZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25fbmksIHJvZ3VlX2RldGVjdGlvbl93aW5kb3csIHdpbmRvd190eXBlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9ST0dVRV9ERVRFQ1RJT05fV0lORE9XLCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX1dJTkRPV19UWVBFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxsb2NfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncG9uX2FsbG9jX2lkIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9ncG9uX2FsbG9jX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25fbmksIHJvZ3VlX2RldGVjdGlvbl93aW5kb3csIGFsbG9jX2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9uaSwgcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdywgYWxsb2NfaWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1JPR1VFX0RFVEVDVElPTl9XSU5ET1csIEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfQUxMT0NfSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ncG9uX29udV9pZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZ3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9uaSwgcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdywgb251X2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9uaSwgcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdywgb251X2lkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9ST0dVRV9ERVRFQ1RJT05fV0lORE9XLCBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX09OVV9JRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNlY29uZF9yYW5naW5nX3dpbmRvdyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX25pLCByb2d1ZV9kZXRlY3Rpb25fd2luZG93LCBzZWNvbmRfcmFuZ2luZ193aW5kb3csIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX25pLCByb2d1ZV9kZXRlY3Rpb25fd2luZG93LCBzZWNvbmRfcmFuZ2luZ193aW5kb3csICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1JPR1VFX0RFVEVDVElPTl9XSU5ET1csIEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfU0VDT05EX1JBTkdJTkdfV0lORE9XLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9uaV9vcGVyX3RvZF9yZXF1ZXN0X3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdCBvcGVyOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fbmlfa2V5IGtleSA9IHsgfTsgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3Qgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX05JX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX25pLCB0b2RfcmVxdWVzdCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX25pLCB0b2RfcmVxdWVzdCwga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX25pX29wZXJfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGUgb3BlcjsgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGUgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX05JX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zd2l0Y2hfb3Zlcl90eXBlX2Nfb251X3N0YXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9zd2l0Y2hfb3Zlcl90eXBlX2Nfb251X3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZSwgb251X3N0YXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGUsIG9udV9zdGF0ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9HUE9OX05JX09QRVJfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFlQRV9DX1NFVF9NVUxUSVBMRV9PTlVfU1RBVEUsIEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1RZUEVfQ19TRVRfTVVMVElQTEVfT05VX1NUQVRFX0lEX09OVV9TVEFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9saXN0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bvbl9vbnVfaWRfbGlzdF91MzJfbWF4XzI1NiB2YWwgPSB7IH07CisgICAgICAgIGludDMyX3QgaTA7CisgICAgICAgIHZhbC52YWwgPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIGNsaV9wYXJtLT5hcnJheV9zaXplICogc2l6ZW9mKCp2YWwudmFsKSk7CisgICAgICAgIGlmICh2YWwudmFsID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICB9CisKKyAgICAgICAgdmFsLmxlbiA9IGNsaV9wYXJtLT5hcnJheV9zaXplOworICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB2YWwubGVuOyBpMCsrKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudmFsW2kwXSA9IChiY21vbHRfZ3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGUsIG9udV9saXN0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fb251X2lkX2xpc3RfdTMyX21heF8yNTYgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9HUE9OX05JX09QRVJfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFlQRV9DX1NFVF9NVUxUSVBMRV9PTlVfU1RBVEUsIEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1RZUEVfQ19TRVRfTVVMVElQTEVfT05VX1NUQVRFX0lEX09OVV9MSVNULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZSwgb251X2xpc3QsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX25pX29wZXJfc3RhcnRfb251X3VwZ3JhZGVfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGUgb3BlcjsgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyB9OyAgICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGUgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX05JX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX25pLCBzdGFydF9vbnVfdXBncmFkZSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX25pLCBzdGFydF9vbnVfdXBncmFkZSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsaXN0X29mX29udV9pZHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wb25fb251X2lkX2xpc3RfdTMyIHZhbCA9IHsgfTsKKyAgICAgICAgaW50MzJfdCBpMDsKKyAgICAgICAgdmFsLnZhbCA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgY2xpX3Bhcm0tPmFycmF5X3NpemUgKiBzaXplb2YoKnZhbC52YWwpKTsKKyAgICAgICAgaWYgKHZhbC52YWwgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgICAgIH0KKworICAgICAgICB2YWwubGVuID0gY2xpX3Bhcm0tPmFycmF5X3NpemU7CisgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHZhbC5sZW47IGkwKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC52YWxbaTBdID0gKGJjbW9sdF9wb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25fbmksIHN0YXJ0X29udV91cGdyYWRlLCBsaXN0X29mX29udV9pZHMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcG9uX29udV9pZF9saXN0X3UzMiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9TVEFSVF9PTlVfVVBHUkFERSwgQkNNT0xUX0dQT05fTklfU1RBUlRfT05VX1VQR1JBREVfSURfTElTVF9PRl9PTlVfSURTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX25pLCBzdGFydF9vbnVfdXBncmFkZSwgbGlzdF9vZl9vbnVfaWRzLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9uaV9zdGF0X2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fbmlfc3RhdF9jZmcgc3RhdF9jZmc7ICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7IH07ICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9zdGF0X2lkIHN0YXRfaWQ7ICAgICAvKio8IGRlY2xhcmUgc3RhdCBJRCAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fbmlfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fTklfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X2dwb25fbmlfc3RhdF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIHN3aXRjaCAoc3RhdF9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9GRUNfQ09ERVdPUkRTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCBmZWNfY29kZXdvcmRzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCBmZWNfY29kZXdvcmRzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX0ZFQ19DT0RFV09SRFNfVU5DT1JSRUNURUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIGZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIGZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfQklQOF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgYmlwOF9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgYmlwOF9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9CSVA4X0VSUk9SUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgYmlwOF9lcnJvcnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIGJpcDhfZXJyb3JzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9QQUNLRVRTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9nZW1fcGFja2V0cywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfZ2VtX3BhY2tldHMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0RST1BQRUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2dlbV9kcm9wcGVkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9nZW1fZHJvcHBlZCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9HRU1fSURMRToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfZ2VtX2lkbGUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2dlbV9pZGxlLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9DT1JSRUNURUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2dlbV9jb3JyZWN0ZWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2dlbV9jb3JyZWN0ZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0lMTEVHQUw6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2dlbV9pbGxlZ2FsLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9nZW1faWxsZWdhbCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19WQUxJRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfYWxsb2NhdGlvbnNfdmFsaWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2FsbG9jYXRpb25zX3ZhbGlkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0lOVkFMSUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2FsbG9jYXRpb25zX2ludmFsaWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2FsbG9jYXRpb25zX2ludmFsaWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfRElTQUJMRUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2FsbG9jYXRpb25zX2Rpc2FibGVkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9hbGxvY2F0aW9uc19kaXNhYmxlZCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9QTE9BTVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X3Bsb2Ftcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfcGxvYW1zLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19OT05fSURMRToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfcGxvYW1zX25vbl9pZGxlLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9wbG9hbXNfbm9uX2lkbGUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9wbG9hbXNfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X3Bsb2Ftc19lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfRFJPUFBFRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfcGxvYW1zX2Ryb3BwZWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X3Bsb2Ftc19kcm9wcGVkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0NQVToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfY3B1LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9jcHUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfT01DSToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfb21jaSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfb21jaSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9PTUNJX1BBQ0tFVFNfQ1JDX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0RST1BQRURfVE9PX1NIT1JUOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9kcm9wcGVkX3Rvb19zaG9ydCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfZHJvcHBlZF90b29fc2hvcnQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fTE9ORzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfZHJvcHBlZF90b29fbG9uZywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfZHJvcHBlZF90b29fbG9uZywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9DUkNfRVJST1JTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9jcmNfZXJyb3JzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9jcmNfZXJyb3JzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0tFWV9FUlJPUlM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2tleV9lcnJvcnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2tleV9lcnJvcnMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfRlJBR01FTlRTX0VSUk9SUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfZnJhZ21lbnRzX2Vycm9ycywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfZnJhZ21lbnRzX2Vycm9ycywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9QQUNLRVRTX0RST1BQRUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X3BhY2tldHNfZHJvcHBlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfcGFja2V0c19kcm9wcGVkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0dFTToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgdHhfZ2VtLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCB0eF9nZW0sIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfUExPQU1TOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCB0eF9wbG9hbXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHR4X3Bsb2Ftcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9HRU1fRlJBR01FTlRTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCB0eF9nZW1fZnJhZ21lbnRzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCB0eF9nZW1fZnJhZ21lbnRzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0NQVToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgdHhfY3B1LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCB0eF9jcHUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfT01DSToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgdHhfb21jaSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgdHhfb21jaSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9DUFVfT01DSV9QQUNLRVRTX0RST1BQRUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHR4X2NwdV9vbWNpX3BhY2tldHNfZHJvcHBlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgdHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfSUxMRUdBTF9MRU5HVEg6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHR4X2Ryb3BwZWRfaWxsZWdhbF9sZW5ndGgsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHR4X2Ryb3BwZWRfaWxsZWdhbF9sZW5ndGgsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9UUElEX01JU1M6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHR4X2Ryb3BwZWRfdHBpZF9taXNzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCB0eF9kcm9wcGVkX3RwaWRfbWlzcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX1ZJRF9NSVNTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCB0eF9kcm9wcGVkX3ZpZF9taXNzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCB0eF9kcm9wcGVkX3ZpZF9taXNzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXRfY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX25pX3N0YXRfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZyBzdGF0X2NmZzsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fbmlfa2V5IGtleSA9IHsgfTsgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9ncG9uX25pX3N0YXRfaWQgc3RhdF9pZDsgICAgIC8qKjwgZGVjbGFyZSBzdGF0IElEICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZyBzdGF0X2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9OSV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBJRCBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc3RhdF9pZCA9IChiY21vbHRfZ3Bvbl9uaV9zdGF0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgc3dpdGNoIChzdGF0X2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX0ZFQ19DT0RFV09SRFM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIGZlY19jb2Rld29yZHMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIGZlY19jb2Rld29yZHMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfRkVDX0NPREVXT1JEU19VTkNPUlJFQ1RFRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgZmVjX2NvZGV3b3Jkc191bmNvcnJlY3RlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgZmVjX2NvZGV3b3Jkc191bmNvcnJlY3RlZCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9CSVA4X0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCBiaXA4X2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCBiaXA4X2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX0JJUDhfRVJST1JTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCBiaXA4X2Vycm9ycywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgYmlwOF9lcnJvcnMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX1BBQ0tFVFM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2dlbV9wYWNrZXRzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9nZW1fcGFja2V0cywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9HRU1fRFJPUFBFRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfZ2VtX2Ryb3BwZWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2dlbV9kcm9wcGVkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9JRExFOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9nZW1faWRsZSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfZ2VtX2lkbGUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0NPUlJFQ1RFRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfZ2VtX2NvcnJlY3RlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfZ2VtX2NvcnJlY3RlZCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9HRU1fSUxMRUdBTDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfZ2VtX2lsbGVnYWwsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2dlbV9pbGxlZ2FsLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX1ZBTElEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9hbGxvY2F0aW9uc192YWxpZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfYWxsb2NhdGlvbnNfdmFsaWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfSU5WQUxJRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfYWxsb2NhdGlvbnNfaW52YWxpZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfYWxsb2NhdGlvbnNfaW52YWxpZCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19ESVNBQkxFRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfYWxsb2NhdGlvbnNfZGlzYWJsZWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2FsbG9jYXRpb25zX2Rpc2FibGVkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfcGxvYW1zLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9wbG9hbXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX05PTl9JRExFOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9wbG9hbXNfbm9uX2lkbGUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X3Bsb2Ftc19ub25faWRsZSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X3Bsb2Ftc19lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfcGxvYW1zX2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19EUk9QUEVEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9wbG9hbXNfZHJvcHBlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfcGxvYW1zX2Ryb3BwZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfQ1BVOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9jcHUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2NwdSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9PTUNJOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9vbWNpLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9vbWNpLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fU0hPUlQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2Ryb3BwZWRfdG9vX3Nob3J0LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9kcm9wcGVkX3Rvb19zaG9ydCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9EUk9QUEVEX1RPT19MT05HOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9kcm9wcGVkX3Rvb19sb25nLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9kcm9wcGVkX3Rvb19sb25nLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0NSQ19FUlJPUlM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2NyY19lcnJvcnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHJ4X2NyY19lcnJvcnMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfS0VZX0VSUk9SUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfa2V5X2Vycm9ycywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfa2V5X2Vycm9ycywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9GUkFHTUVOVFNfRVJST1JTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9mcmFnbWVudHNfZXJyb3JzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9mcmFnbWVudHNfZXJyb3JzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX1BBQ0tFVFNfRFJPUFBFRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgcnhfcGFja2V0c19kcm9wcGVkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCByeF9wYWNrZXRzX2Ryb3BwZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfR0VNOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCB0eF9nZW0sIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHR4X2dlbSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9QTE9BTVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHR4X3Bsb2Ftcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgdHhfcGxvYW1zLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0dFTV9GUkFHTUVOVFM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHR4X2dlbV9mcmFnbWVudHMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHR4X2dlbV9mcmFnbWVudHMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfQ1BVOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCB0eF9jcHUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHR4X2NwdSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9PTUNJOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCB0eF9vbWNpLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCB0eF9vbWNpLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0NQVV9PTUNJX1BBQ0tFVFNfRFJPUFBFRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgdHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX25pLCB0eF9jcHVfb21jaV9wYWNrZXRzX2Ryb3BwZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9JTExFR0FMX0xFTkdUSDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgdHhfZHJvcHBlZF9pbGxlZ2FsX2xlbmd0aCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgdHhfZHJvcHBlZF9pbGxlZ2FsX2xlbmd0aCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX1RQSURfTUlTUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9uaSwgdHhfZHJvcHBlZF90cGlkX21pc3MsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHR4X2Ryb3BwZWRfdHBpZF9taXNzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfVklEX01JU1M6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHR4X2Ryb3BwZWRfdmlkX21pc3MsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fbmksIHR4X2Ryb3BwZWRfdmlkX21pc3MsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnR5cGUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnR5cGUgPSAoYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHZhbC50cmlnZ2VyLnR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5yaXNpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV90aHJlc2hvbGQucmlzaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5yaXNpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5mYWxsaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLmZhbGxpbmcgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmZhbGxpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9SQU5HRToKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci51cHBlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLnVwcGVyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci51cHBlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmxvd2VyIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfcmFuZ2UubG93ZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxvd2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1ZBTFVFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5saW1pdCIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS52YWx1ZV90aHJlc2hvbGQubGltaXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxpbWl0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX05PTkU6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnNvYWsuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnNvYWsuY2xlYXJfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9TVEFUX0NGR19QUk9QX1NFVCgmc3RhdF9jZmcsIGdwb25fbmksIGNmZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkcsIDAsIEJDTU9MVF9HUE9OX05JX1NUQVRfQ0ZHX0lEX0NGRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCBncG9uX25pLCBjZmcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdF9jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fbmlfYXV0b19jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnIGF1dG9fY2ZnOyAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyB9OyAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfZ2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBncG9uX25pLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZ3Bvbl9uaSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjcHVfcGFja2V0c19mYWlsdXJlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgY3B1X3BhY2tldHNfZmFpbHVyZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBjcHVfcGFja2V0c19mYWlsdXJlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIGRlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIGRlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIGRpc2FibGVfYWxsX29udXNfY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIGRpc2FibGVfYWxsX29udXNfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmFibGVfYWxsX29udXNfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBlbmFibGVfYWxsX29udXNfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsb3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBsb3MpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgbG9zKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfZGlzY292ZXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIG9udV9kaXNjb3ZlcmVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIG9udV9kaXNjb3ZlcmVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfdXBncmFkZV9jb21wbGV0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIG9udV91cGdyYWRlX2NvbXBsZXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIG9udV91cGdyYWRlX2NvbXBsZXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX25pLCByb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX25pLCByb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBzZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIHN0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIHN0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX2NsZWFyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBzdGF0X2FsYXJtX2NsZWFyZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgc3RhdF9hbGFybV9jbGVhcmVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIHN0YXRfYWxhcm1fcmFpc2VkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIHN0YXRfYWxhcm1fcmFpc2VkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0ZV9jaGFuZ2VfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBzdGF0ZV9jaGFuZ2VfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0b2RfcmVxdWVzdF9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX25pLCB0b2RfcmVxdWVzdF9jb21wbGV0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgdG9kX3JlcXVlc3RfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBjcHVfcGFja2V0c19mYWlsdXJlKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBkaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIGVuYWJsZV9hbGxfb251c19jb21wbGV0ZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBsb3MpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBvbnVfZGlzY292ZXJlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIG9udV91cGdyYWRlX2NvbXBsZXRlKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIHJvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIHNlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBzdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIHN0YXRfYWxhcm1fY2xlYXJlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIHN0YXRfYWxhcm1fcmFpc2VkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIHRvZF9yZXF1ZXN0X2NvbXBsZXRlZCkpCisgICAgeworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fbmksIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmF1dG9fY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX25pX2F1dG9fY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZyBhdXRvX2NmZzsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fbmlfa2V5IGtleSA9IHsgfTsgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fbmlfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX3NldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgZ3Bvbl9uaSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGdwb25fbmksIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY3B1X3BhY2tldHNfZmFpbHVyZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIGNwdV9wYWNrZXRzX2ZhaWx1cmUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIGNwdV9wYWNrZXRzX2ZhaWx1cmUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfQ1BVX1BBQ0tFVFNfRkFJTFVSRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIGRlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0RFQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBkaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfRElTQUJMRV9BTExfT05VU19DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmFibGVfYWxsX29udXNfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9FTkFCTEVfQUxMX09OVVNfQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9zIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgbG9zLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBsb3MsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfTE9TLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2Rpc2NvdmVyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBvbnVfZGlzY292ZXJlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgb251X2Rpc2NvdmVyZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfT05VX0RJU0NPVkVSRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfdXBncmFkZV9jb21wbGV0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIG9udV91cGdyYWRlX2NvbXBsZXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBvbnVfdXBncmFkZV9jb21wbGV0ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9PTlVfVVBHUkFERV9DT01QTEVURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfU1dJVENIT1ZFUl9DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCByb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCByb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCByb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIHJvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9ST0dVRV9PTlVfU1BFQ0lBTF9NQVBfQ1lDTEVfU1RBUlQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9TRVJJQUxfTlVNQkVSX0FDUVVJU0lUSU9OX0NZQ0xFX1NUQVJULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBzdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9uaSwgc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX2NsZWFyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBzdGF0X2FsYXJtX2NsZWFyZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIHN0YXRfYWxhcm1fY2xlYXJlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIHN0YXRfYWxhcm1fcmFpc2VkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBzdGF0X2FsYXJtX3JhaXNlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRlX2NoYW5nZV9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBzdGF0ZV9jaGFuZ2VfY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCBzdGF0ZV9jaGFuZ2VfY29tcGxldGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0b2RfcmVxdWVzdF9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX25pLCB0b2RfcmVxdWVzdF9jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fbmksIHRvZF9yZXF1ZXN0X2NvbXBsZXRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9UT0RfUkVRVUVTVF9DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fb251X2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9vbnVfY2ZnIGNmZzsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICB1aW50OF90ICpsaXN0X21lbTsgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtZW1vcnkgYnVmZmVyIGZvciB2YXJpYWJsZS1zaXplZCBsaXN0cyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fb251X2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50OF90KiBsaXN0X21lbTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF9ncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX09OVV9LRVlfSURfT05VX0lELCAma2V5Lm9udV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fb251LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX29udSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fb251LCBvbnVfc3RhdGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX29udSwgb251X3N0YXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzZXJpYWxfbnVtYmVyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX29udSwgc2VyaWFsX251bWJlcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fb251LCBzZXJpYWxfbnVtYmVyKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwYXNzd29yZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9vbnUsIHBhc3N3b3JkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9vbnUsIHBhc3N3b3JkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhdXRvX3Bhc3N3b3JkX2xlYXJuaW5nIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX29udSwgYXV0b19wYXNzd29yZF9sZWFybmluZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fb251LCBhdXRvX3Bhc3N3b3JkX2xlYXJuaW5nKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1c19mZWMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fb251LCB1c19mZWMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX29udSwgdXNfZmVjKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbWNpX3BvcnRfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fb251LCBvbWNpX3BvcnRfaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX29udSwgb21jaV9wb3J0X2lkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkc19iZXJfcmVwb3J0aW5nX2ludGVydmFsIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX29udSwgZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fb251LCBkc19iZXJfcmVwb3J0aW5nX2ludGVydmFsKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhZXNfZW5jcnlwdGlvbl9rZXkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fb251LCBhZXNfZW5jcnlwdGlvbl9rZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX29udSwgYWVzX2VuY3J5cHRpb25fa2V5KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGFybV9zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9vbnUsIGFsYXJtX3N0YXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl9vbnUsIGFsYXJtX3N0YXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX3RpbWUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fb251LCByYW5naW5nX3RpbWUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX29udSwgcmFuZ2luZ190aW1lKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkaXNhYmxlZF9hZnRlcl9kaXNjb3ZlcnkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fb251LCBkaXNhYmxlZF9hZnRlcl9kaXNjb3ZlcnkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX29udSwgZGlzYWJsZWRfYWZ0ZXJfZGlzY292ZXJ5KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWFjdGl2YXRpb25fcmVhc29uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX29udSwgZGVhY3RpdmF0aW9uX3JlYXNvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fb251LCBkZWFjdGl2YXRpb25fcmVhc29uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGxfZ2VtX3BvcnRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX29udSwgYWxsX2dlbV9wb3J0cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fb251LCBhbGxfZ2VtX3BvcnRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGxfYWxsb2NzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX29udSwgYWxsX2FsbG9jcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fb251LCBhbGxfYWxsb2NzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfcHNfdHlwZV9jIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX29udSwgb251X3BzX3R5cGVfYyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fb251LCBvbnVfcHNfdHlwZV9jKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJleHRlbmRlZF9ndWFyZF90aW1lIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX29udSwgZXh0ZW5kZWRfZ3VhcmRfdGltZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fb251LCBleHRlbmRlZF9ndWFyZF90aW1lKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fb251LCBvbnVfc3RhdGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fb251LCBzZXJpYWxfbnVtYmVyKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX29udSwgcGFzc3dvcmQpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fb251LCBhdXRvX3Bhc3N3b3JkX2xlYXJuaW5nKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX29udSwgdXNfZmVjKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX29udSwgb21jaV9wb3J0X2lkKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX29udSwgZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9vbnUsIGFlc19lbmNyeXB0aW9uX2tleSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9vbnUsIGFsYXJtX3N0YXRlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX29udSwgcmFuZ2luZ190aW1lKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX29udSwgZGlzYWJsZWRfYWZ0ZXJfZGlzY292ZXJ5KSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX29udSwgZGVhY3RpdmF0aW9uX3JlYXNvbikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9vbnUsIGFsbF9nZW1fcG9ydHMpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fb251LCBhbGxfYWxsb2NzKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX29udSwgb251X3BzX3R5cGVfYykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl9vbnUsIGV4dGVuZGVkX2d1YXJkX3RpbWUpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX29udSwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fb251LCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBzZXQgbWVtb3J5IHRvIHVzZSBmb3IgdmFyaWFibGUtc2l6ZWQgbGlzdHMgKi8KKyAgICBsaXN0X21lbSA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7CisgICAgaWYgKGxpc3RfbWVtID09IE5VTEwpCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImxpc3RfbWVtID0gYmNtb3NfY2FsbG9jKEFQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpO1xuIik7CisgICAgQkNNT0xUX0NGR19MSVNUX0JVRl9TRVQoJmNmZywgZ3Bvbl9vbnUsIGxpc3RfbWVtLCBBUElDTElfRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFKTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0xJU1RfQlVGX1NFVCgmY2ZnLCBncG9uX29udSwgbGlzdF9tZW0sIEFQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9vbnVfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX29udV9jZmcgY2ZnOyAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fb251X2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fT05VX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm9udV9pZCA9IChiY21vbHRfZ3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5vbnVfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9PTlVfS0VZX0lEX09OVV9JRCwgJmtleS5vbnVfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX29udSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9vbnUsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInNlcmlhbF9udW1iZXIuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc2VyaWFsX251bWJlciB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2VyaWFsX251bWJlci52ZW5kb3JfaWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgc2VyaWFsX251bWJlci52ZW5kb3JfaWQgbXVzdCBoYXZlIDQgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC52ZW5kb3JfaWQsIDQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNlcmlhbF9udW1iZXIudmVuZG9yX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2VyaWFsX251bWJlci52ZW5kb3Jfc3BlY2lmaWMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgc2VyaWFsX251bWJlci52ZW5kb3Jfc3BlY2lmaWMgbXVzdCBoYXZlIDQgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC52ZW5kb3Jfc3BlY2lmaWMsIDQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIHNlcmlhbF9udW1iZXIsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfc2VyaWFsX251bWJlciB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9TRVJJQUxfTlVNQkVSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIHNlcmlhbF9udW1iZXIsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicGFzc3dvcmQuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYXJyX3U4XzEwIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwYXNzd29yZC5hcnIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSAxMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIHBhc3N3b3JkLmFyciBtdXN0IGhhdmUgMTAgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC5hcnIsIDEwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwYXNzd29yZC5hcnIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgcGFzc3dvcmQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYXJyX3U4XzEwIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX1BBU1NXT1JELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIHBhc3N3b3JkLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXV0b19wYXNzd29yZF9sZWFybmluZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIGF1dG9fcGFzc3dvcmRfbGVhcm5pbmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIGF1dG9fcGFzc3dvcmRfbGVhcm5pbmcsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0FVVE9fUEFTU1dPUkRfTEVBUk5JTkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1c19mZWMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCB1c19mZWMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIHVzX2ZlYywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9DRkdfSURfVVNfRkVDLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib21jaV9wb3J0X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bvbl9nZW1faWQgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2dwb25fZ2VtX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgb21jaV9wb3J0X2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBvbWNpX3BvcnRfaWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX09NQ0lfUE9SVF9JRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9iZXJfaW50ZXJ2YWwgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2Jlcl9pbnRlcnZhbCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIGRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIGRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0RTX0JFUl9SRVBPUlRJTkdfSU5URVJWQUwsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiYWVzX2VuY3J5cHRpb25fa2V5LiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Flc19rZXkgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFlc19lbmNyeXB0aW9uX2tleS5ieXRlcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDE2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgYWVzX2VuY3J5cHRpb25fa2V5LmJ5dGVzIG11c3QgaGF2ZSAxNiBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLmJ5dGVzLCAxNik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWVzX2VuY3J5cHRpb25fa2V5LmJ5dGVzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIGFlc19lbmNyeXB0aW9uX2tleSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9hZXNfa2V5IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0FFU19FTkNSWVBUSU9OX0tFWSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBhZXNfZW5jcnlwdGlvbl9rZXksIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiYWxhcm1fc3RhdGUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGUgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsYXJtX3N0YXRlLmxvc2kiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb3NpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhbGFybV9zdGF0ZS5sb3NpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxhcm1fc3RhdGUubG9maSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvZmkgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFsYXJtX3N0YXRlLmxvZmkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGFybV9zdGF0ZS5sb2FtaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvYW1pID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhbGFybV9zdGF0ZS5sb2FtaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsYXJtX3N0YXRlLmRnaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRnaSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxhcm1fc3RhdGUuZGdpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxhcm1fc3RhdGUudGl3aSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRpd2kgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFsYXJtX3N0YXRlLnRpd2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGFybV9zdGF0ZS5kb3dpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZG93aSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxhcm1fc3RhdGUuZG93aSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsYXJtX3N0YXRlLnN1ZmkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zdWZpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhbGFybV9zdGF0ZS5zdWZpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxhcm1fc3RhdGUuc2ZpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc2ZpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhbGFybV9zdGF0ZS5zZmkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGFybV9zdGF0ZS5zZGkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zZGkgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFsYXJtX3N0YXRlLnNkaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsYXJtX3N0YXRlLmRmaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRmaSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxhcm1fc3RhdGUuZGZpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxhcm1fc3RhdGUubG9haSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvYWkgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFsYXJtX3N0YXRlLmxvYWkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGFybV9zdGF0ZS5sb2tpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9raSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxhcm1fc3RhdGUubG9raSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBhbGFybV9zdGF0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9BTEFSTV9TVEFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBhbGFybV9zdGF0ZSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfdGltZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgcmFuZ2luZ190aW1lLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCByYW5naW5nX3RpbWUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX1JBTkdJTkdfVElNRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9wc190eXBlX2MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBvbnVfcHNfdHlwZV9jLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBvbnVfcHNfdHlwZV9jLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9PTlVfUFNfVFlQRV9DLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImV4dGVuZGVkX2d1YXJkX3RpbWUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZSB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXh0ZW5kZWRfZ3VhcmRfdGltZS5hZGRpdGlvbmFsX3ByZWJ1cnN0X2d1YXJkX3RpbWUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZGRpdGlvbmFsX3ByZWJ1cnN0X2d1YXJkX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJleHRlbmRlZF9ndWFyZF90aW1lLmFkZGl0aW9uYWxfcHJlYnVyc3RfZ3VhcmRfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImV4dGVuZGVkX2d1YXJkX3RpbWUuYWRkaXRpb25hbF9wb3N0YnVyc3RfZ3VhcmRfdGltZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFkZGl0aW9uYWxfcG9zdGJ1cnN0X2d1YXJkX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJleHRlbmRlZF9ndWFyZF90aW1lLmFkZGl0aW9uYWxfcG9zdGJ1cnN0X2d1YXJkX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgZXh0ZW5kZWRfZ3VhcmRfdGltZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9leHRlbmRlZF9ndWFyZF90aW1lIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0VYVEVOREVEX0dVQVJEX1RJTUUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgZXh0ZW5kZWRfZ3VhcmRfdGltZSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX29udV9jZmdfY2xlYXIoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fb251X2NmZyBjZmc7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7IH07ICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9vbnVfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19jbGVhciIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX09OVV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X2dwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkub251X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fT05VX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9vbnUsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fb251LCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9vbnVfY2ZnX2dldF9tdWx0aShiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX29udV9jZmcgY2ZnOyAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0ID0gTlVMTDsgLyoqPCBkZWNsYXJlIG1lc3NhZ2Ugc2V0ICovCisgICAgdWludDMyX3QgbWF4X21zZ3M7ICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgbWF4IG51bWJlciBvZiBtc2dzIHRvIGdldCAqLworICAgIGJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjsgICAgICAgLyoqPCBkZWNsYXJlIGZpbHRlciBpbnZlcnQgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fb251X2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldCogbXNnX3NldCA9IE5VTEw7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50MzJfdCBtYXhfbXNncztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXRfbXVsdGkiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF9ncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX09OVV9LRVlfSURfT05VX0lELCAma2V5Lm9udV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fb251LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX29udSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfb251X3N0YXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9vbnVfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgb251X3N0YXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBvbnVfc3RhdGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX09OVV9TVEFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fb251LCBvbnVfc3RhdGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9vbnUsIG9udV9zdGF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5zZXJpYWxfbnVtYmVyLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3NlcmlhbF9udW1iZXIgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zZXJpYWxfbnVtYmVyLnZlbmRvcl9pZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciBmaWx0ZXIuc2VyaWFsX251bWJlci52ZW5kb3JfaWQgbXVzdCBoYXZlIDQgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC52ZW5kb3JfaWQsIDQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zZXJpYWxfbnVtYmVyLnZlbmRvcl9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zZXJpYWxfbnVtYmVyLnZlbmRvcl9zcGVjaWZpYyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciBmaWx0ZXIuc2VyaWFsX251bWJlci52ZW5kb3Jfc3BlY2lmaWMgbXVzdCBoYXZlIDQgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC52ZW5kb3Jfc3BlY2lmaWMsIDQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zZXJpYWxfbnVtYmVyLnZlbmRvcl9zcGVjaWZpYyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBzZXJpYWxfbnVtYmVyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3NlcmlhbF9udW1iZXIgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9DRkdfSURfU0VSSUFMX05VTUJFUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBzZXJpYWxfbnVtYmVyLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2VyaWFsX251bWJlciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fb251LCBzZXJpYWxfbnVtYmVyKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fb251LCBzZXJpYWxfbnVtYmVyKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnBhc3N3b3JkLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Fycl91OF8xMCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnBhc3N3b3JkLmFyciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDEwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgZmlsdGVyLnBhc3N3b3JkLmFyciBtdXN0IGhhdmUgMTAgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC5hcnIsIDEwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucGFzc3dvcmQuYXJyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIHBhc3N3b3JkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Fycl91OF8xMCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9QQVNTV09SRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBwYXNzd29yZCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBhc3N3b3JkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9vbnUsIHBhc3N3b3JkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fb251LCBwYXNzd29yZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmF1dG9fcGFzc3dvcmRfbGVhcm5pbmciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBhdXRvX3Bhc3N3b3JkX2xlYXJuaW5nLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBhdXRvX3Bhc3N3b3JkX2xlYXJuaW5nLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9BVVRPX1BBU1NXT1JEX0xFQVJOSU5HLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXV0b19wYXNzd29yZF9sZWFybmluZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fb251LCBhdXRvX3Bhc3N3b3JkX2xlYXJuaW5nKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fb251LCBhdXRvX3Bhc3N3b3JkX2xlYXJuaW5nKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudXNfZmVjIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgdXNfZmVjLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCB1c19mZWMsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX1VTX0ZFQywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVzX2ZlYyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fb251LCB1c19mZWMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9vbnUsIHVzX2ZlYyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9tY2lfcG9ydF9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fZ2VtX2lkIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9ncG9uX2dlbV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIG9tY2lfcG9ydF9pZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgb21jaV9wb3J0X2lkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9PTUNJX1BPUlRfSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbWNpX3BvcnRfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX29udSwgb21jaV9wb3J0X2lkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fb251LCBvbWNpX3BvcnRfaWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kc19iZXJfcmVwb3J0aW5nX2ludGVydmFsIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYmVyX2ludGVydmFsIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9iZXJfaW50ZXJ2YWwpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBkc19iZXJfcmVwb3J0aW5nX2ludGVydmFsLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBkc19iZXJfcmVwb3J0aW5nX2ludGVydmFsLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9EU19CRVJfUkVQT1JUSU5HX0lOVEVSVkFMLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fb251LCBkc19iZXJfcmVwb3J0aW5nX2ludGVydmFsKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fb251LCBkc19iZXJfcmVwb3J0aW5nX2ludGVydmFsKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmFlc19lbmNyeXB0aW9uX2tleS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hZXNfa2V5IHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWVzX2VuY3J5cHRpb25fa2V5LmJ5dGVzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gMTYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciBmaWx0ZXIuYWVzX2VuY3J5cHRpb25fa2V5LmJ5dGVzIG11c3QgaGF2ZSAxNiBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLmJ5dGVzLCAxNik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFlc19lbmNyeXB0aW9uX2tleS5ieXRlcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBhZXNfZW5jcnlwdGlvbl9rZXksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYWVzX2tleSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9BRVNfRU5DUllQVElPTl9LRVksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgYWVzX2VuY3J5cHRpb25fa2V5LCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWVzX2VuY3J5cHRpb25fa2V5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9vbnUsIGFlc19lbmNyeXB0aW9uX2tleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX29udSwgYWVzX2VuY3J5cHRpb25fa2V5KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUubG9zaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvc2kgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGFybV9zdGF0ZS5sb3NpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmxvZmkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb2ZpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxhcm1fc3RhdGUubG9maSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5sb2FtaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvYW1pID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxhcm1fc3RhdGUubG9hbWkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUuZGdpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZGdpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxhcm1fc3RhdGUuZGdpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLnRpd2kiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50aXdpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxhcm1fc3RhdGUudGl3aSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5kb3dpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZG93aSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmRvd2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUuc3VmaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnN1ZmkgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGFybV9zdGF0ZS5zdWZpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLnNmaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnNmaSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLnNmaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5zZGkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zZGkgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGFybV9zdGF0ZS5zZGkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUuZGZpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZGZpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxhcm1fc3RhdGUuZGZpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmxvYWkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb2FpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxhcm1fc3RhdGUubG9haSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5sb2tpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9raSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmxva2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgYWxhcm1fc3RhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGUgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQUxBUk1fU1RBVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgYWxhcm1fc3RhdGUsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGFybV9zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fb251LCBhbGFybV9zdGF0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX29udSwgYWxhcm1fc3RhdGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yYW5naW5nX3RpbWUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIHJhbmdpbmdfdGltZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgcmFuZ2luZ190aW1lLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9SQU5HSU5HX1RJTUUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX3RpbWUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX29udSwgcmFuZ2luZ190aW1lKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fb251LCByYW5naW5nX3RpbWUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kaXNhYmxlZF9hZnRlcl9kaXNjb3ZlcnkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zdGF0dXMgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBkaXNhYmxlZF9hZnRlcl9kaXNjb3ZlcnksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIGRpc2FibGVkX2FmdGVyX2Rpc2NvdmVyeSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9DRkdfSURfRElTQUJMRURfQUZURVJfRElTQ09WRVJZLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGlzYWJsZWRfYWZ0ZXJfZGlzY292ZXJ5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9vbnUsIGRpc2FibGVkX2FmdGVyX2Rpc2NvdmVyeSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX29udSwgZGlzYWJsZWRfYWZ0ZXJfZGlzY292ZXJ5KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZGVhY3RpdmF0aW9uX3JlYXNvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2RlYWN0aXZhdGlvbl9yZWFzb24gdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2RlYWN0aXZhdGlvbl9yZWFzb24pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgZGVhY3RpdmF0aW9uX3JlYXNvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgZGVhY3RpdmF0aW9uX3JlYXNvbiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9DRkdfSURfREVBQ1RJVkFUSU9OX1JFQVNPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlYWN0aXZhdGlvbl9yZWFzb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX29udSwgZGVhY3RpdmF0aW9uX3JlYXNvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX29udSwgZGVhY3RpdmF0aW9uX3JlYXNvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5hbGxfZ2VtX3BvcnRzLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2IHZhbCA9IHsgfTsKKyAgICAgICAgaW50MzJfdCBpMDsKKyAgICAgICAgdmFsLnZhbCA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgY2xpX3Bhcm0tPmFycmF5X3NpemUgKiBzaXplb2YoKnZhbC52YWwpKTsKKyAgICAgICAgaWYgKHZhbC52YWwgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgICAgIH0KKworICAgICAgICB2YWwubGVuID0gY2xpX3Bhcm0tPmFycmF5X3NpemU7CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsbF9nZW1fcG9ydHMuZ2VtX2lkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gdmFsLmxlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsbF9nZW1fcG9ydHMuZ2VtX2lkIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdmFsLmxlbjsgaTArKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudmFsW2kwXS5nZW1faWQgPSAoYmNtb2x0X2dwb25fZ2VtX2lkKSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxsX2dlbV9wb3J0cy5zdGF0ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5sZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGxfZ2VtX3BvcnRzLnN0YXRlIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdmFsLmxlbjsgaTArKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudmFsW2kwXS5zdGF0ZSA9IChiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlc1tpMF0uZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBhbGxfZ2VtX3BvcnRzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0FMTF9HRU1fUE9SVFMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgYWxsX2dlbV9wb3J0cywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsbF9nZW1fcG9ydHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX29udSwgYWxsX2dlbV9wb3J0cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX29udSwgYWxsX2dlbV9wb3J0cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5hbGxfYWxsb2NzLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzIgdmFsID0geyB9OworICAgICAgICBpbnQzMl90IGkxOworICAgICAgICB2YWwudmFsID0gYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCBjbGlfcGFybS0+YXJyYXlfc2l6ZSAqIHNpemVvZigqdmFsLnZhbCkpOworICAgICAgICBpZiAodmFsLnZhbCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgfQorCisgICAgICAgIHZhbC5sZW4gPSBjbGlfcGFybS0+YXJyYXlfc2l6ZTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxsX2FsbG9jcy5hbGxvY19pZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5sZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGxfYWxsb2NzLmFsbG9jX2lkIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdmFsLmxlbjsgaTErKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudmFsW2kxXS5hbGxvY19pZCA9IChiY21vbHRfZ3Bvbl9hbGxvY19pZCkgY2xpX3Bhcm0tPnZhbHVlc1tpMV0udW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsbF9hbGxvY3Muc3RhdGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSB2YWwubGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxsX2FsbG9jcy5zdGF0ZSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHZhbC5sZW47IGkxKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnZhbFtpMV0uc3RhdGUgPSAoYmNtb2x0X2FsbG9jX3N0YXRlKSBjbGlfcGFybS0+dmFsdWVzW2kxXS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIGFsbF9hbGxvY3MsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0NGR19JRF9BTExfQUxMT0NTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIGFsbF9hbGxvY3MsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGxfYWxsb2NzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9vbnUsIGFsbF9hbGxvY3MpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9vbnUsIGFsbF9hbGxvY3MpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfcHNfdHlwZV9jIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgb251X3BzX3R5cGVfYywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgb251X3BzX3R5cGVfYywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9DRkdfSURfT05VX1BTX1RZUEVfQywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9wc190eXBlX2MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX29udSwgb251X3BzX3R5cGVfYyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX29udSwgb251X3BzX3R5cGVfYyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5leHRlbmRlZF9ndWFyZF90aW1lLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2V4dGVuZGVkX2d1YXJkX3RpbWUgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5leHRlbmRlZF9ndWFyZF90aW1lLmFkZGl0aW9uYWxfcHJlYnVyc3RfZ3VhcmRfdGltZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFkZGl0aW9uYWxfcHJlYnVyc3RfZ3VhcmRfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5leHRlbmRlZF9ndWFyZF90aW1lLmFkZGl0aW9uYWxfcHJlYnVyc3RfZ3VhcmRfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5leHRlbmRlZF9ndWFyZF90aW1lLmFkZGl0aW9uYWxfcG9zdGJ1cnN0X2d1YXJkX3RpbWUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZGRpdGlvbmFsX3Bvc3RidXJzdF9ndWFyZF90aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmV4dGVuZGVkX2d1YXJkX3RpbWUuYWRkaXRpb25hbF9wb3N0YnVyc3RfZ3VhcmRfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBleHRlbmRlZF9ndWFyZF90aW1lLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2V4dGVuZGVkX2d1YXJkX3RpbWUgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9DRkdfSURfRVhURU5ERURfR1VBUkRfVElNRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBleHRlbmRlZF9ndWFyZF90aW1lLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXh0ZW5kZWRfZ3VhcmRfdGltZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fb251LCBleHRlbmRlZF9ndWFyZF90aW1lKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fb251LCBleHRlbmRlZF9ndWFyZF90aW1lKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX29udSwgb251X3N0YXRlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9vbnUsIHNlcmlhbF9udW1iZXIpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX29udSwgcGFzc3dvcmQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX29udSwgYXV0b19wYXNzd29yZF9sZWFybmluZykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fb251LCB1c19mZWMpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX29udSwgb21jaV9wb3J0X2lkKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9vbnUsIGRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX29udSwgYWVzX2VuY3J5cHRpb25fa2V5KSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9vbnUsIGFsYXJtX3N0YXRlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9vbnUsIHJhbmdpbmdfdGltZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fb251LCBkaXNhYmxlZF9hZnRlcl9kaXNjb3ZlcnkpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX29udSwgZGVhY3RpdmF0aW9uX3JlYXNvbikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fb251LCBhbGxfZ2VtX3BvcnRzKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl9vbnUsIGFsbF9hbGxvY3MpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX29udSwgb251X3BzX3R5cGVfYykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fb251LCBleHRlbmRlZF9ndWFyZF90aW1lKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fb251LCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fb251LCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fb251X3N0YXRfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX29udV9zdGF0IHN0YXQ7ICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDsgICAgICAgLyoqPCBkZWNsYXJlICdjbGVhciBvbiByZWFkJyBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9vbnVfc3RhdCBzdGF0O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBjbGVhcl9vbl9yZWFkO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF9ncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX09OVV9LRVlfSURfT05VX0lELCAma2V5Lm9udV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBmbGFncyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNsZWFyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBjbGVhcl9vbl9yZWFkID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNsZWFyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImNsZWFyX29uX3JlYWQgPSAlcztcbiIsIChjbGVhcl9vbl9yZWFkKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9TVEFUX0lOSVQoJnN0YXQsIGdwb25fb251LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0lOSVQoJnN0YXQsIGdwb25fb251LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZlY19jb2Rld29yZHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9vbnUsIGZlY19jb2Rld29yZHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fb251LCBmZWNfY29kZXdvcmRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmZWNfYnl0ZXNfY29ycmVjdGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fb251LCBmZWNfYnl0ZXNfY29ycmVjdGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX29udSwgZmVjX2J5dGVzX2NvcnJlY3RlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmVjX2NvZGV3b3Jkc19jb3JyZWN0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9vbnUsIGZlY19jb2Rld29yZHNfY29ycmVjdGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX29udSwgZmVjX2NvZGV3b3Jkc19jb3JyZWN0ZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9vbnUsIGZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fb251LCBmZWNfY29kZXdvcmRzX3VuY29ycmVjdGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiaXA4X2J5dGVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fb251LCBiaXA4X2J5dGVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX29udSwgYmlwOF9ieXRlcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmlwOF9lcnJvcnMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9vbnUsIGJpcDhfZXJyb3JzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX29udSwgYmlwOF9lcnJvcnMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3Bsb2Ftc19jcmNfZXJyb3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9vbnUsIHJ4X3Bsb2Ftc19jcmNfZXJyb3IpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fb251LCByeF9wbG9hbXNfY3JjX2Vycm9yKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9wbG9hbXNfbm9uX2lkbGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9vbnUsIHJ4X3Bsb2Ftc19ub25faWRsZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9vbnUsIHJ4X3Bsb2Ftc19ub25faWRsZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9zaXRpdmVfZHJpZnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9vbnUsIHBvc2l0aXZlX2RyaWZ0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX29udSwgcG9zaXRpdmVfZHJpZnQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm5lZ2F0aXZlX2RyaWZ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fb251LCBuZWdhdGl2ZV9kcmlmdCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9vbnUsIG5lZ2F0aXZlX2RyaWZ0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9vbWNpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fb251LCByeF9vbWNpKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX29udSwgcnhfb21jaSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX29udSwgcnhfb21jaV9wYWNrZXRzX2NyY19lcnJvcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9vbnUsIHJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJlcl9yZXBvcnRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX29udSwgYmVyX3JlcG9ydGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX29udSwgYmVyX3JlcG9ydGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1bnJlY2VpdmVkX2J1cnN0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fb251LCB1bnJlY2VpdmVkX2J1cnN0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX29udSwgdW5yZWNlaXZlZF9idXJzdCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGNkZ19lcnJvcnMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9vbnUsIGxjZGdfZXJyb3JzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX29udSwgbGNkZ19lcnJvcnMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJkaV9lcnJvcnMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9vbnUsIHJkaV9lcnJvcnMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fb251LCByZGlfZXJyb3JzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9ieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX29udSwgcnhfYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fb251LCByeF9ieXRlcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfcGFja2V0cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX29udSwgcnhfcGFja2V0cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9vbnUsIHJ4X3BhY2tldHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2J5dGVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fb251LCB0eF9ieXRlcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgZ3Bvbl9vbnUsIHR4X2J5dGVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9wYWNrZXRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fb251LCB0eF9wYWNrZXRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX29udSwgdHhfcGFja2V0cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fb251LCBmZWNfY29kZXdvcmRzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fb251LCBmZWNfYnl0ZXNfY29ycmVjdGVkKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fb251LCBmZWNfY29kZXdvcmRzX2NvcnJlY3RlZCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX29udSwgZmVjX2NvZGV3b3Jkc191bmNvcnJlY3RlZCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX29udSwgYmlwOF9ieXRlcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX29udSwgYmlwOF9lcnJvcnMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9vbnUsIHJ4X3Bsb2Ftc19jcmNfZXJyb3IpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9vbnUsIHJ4X3Bsb2Ftc19ub25faWRsZSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX29udSwgcG9zaXRpdmVfZHJpZnQpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9vbnUsIG5lZ2F0aXZlX2RyaWZ0KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fb251LCByeF9vbWNpKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fb251LCByeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fb251LCBiZXJfcmVwb3J0ZWQpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9vbnUsIHVucmVjZWl2ZWRfYnVyc3QpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9vbnUsIGxjZGdfZXJyb3JzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fb251LCByZGlfZXJyb3JzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIGdwb25fb251LCByeF9ieXRlcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX29udSwgcnhfcGFja2V0cykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBncG9uX29udSwgdHhfYnl0ZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgZ3Bvbl9vbnUsIHR4X3BhY2tldHMpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fb251LCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBncG9uX29udSwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9nZXQoZGV2aWNlX2lkLCAmc3RhdC5oZHIsIGNsZWFyX29uX3JlYWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZzdGF0Lmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXQuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fb251X29wZXJfc2V0X29udV9zdGF0ZV9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGUgb3BlcjsgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0geyB9OyAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX09OVV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X2dwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkub251X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fT05VX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX29udSwgc2V0X29udV9zdGF0ZSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX29udSwgc2V0X29udV9zdGF0ZSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9vbnVfb3BlcmF0aW9uIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9vbnVfb3BlcmF0aW9uKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX29udSwgc2V0X29udV9zdGF0ZSwgb251X3N0YXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9vbnUsIHNldF9vbnVfc3RhdGUsIG9udV9zdGF0ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfR1BPTl9PTlVfT1BFUl9JRF9TRVRfT05VX1NUQVRFLCBCQ01PTFRfR1BPTl9PTlVfU0VUX09OVV9TVEFURV9JRF9PTlVfU1RBVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX29udV9vcGVyX3Jzc2lfbWVhc3VyZW1lbnRfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50IG9wZXI7ICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7IH07ICAgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50IG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX09OVV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X2dwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkub251X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fT05VX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX29udSwgcnNzaV9tZWFzdXJlbWVudCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX29udSwgcnNzaV9tZWFzdXJlbWVudCwga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX29udV9vcGVyX2NoYW5nZV9wb3dlcl9sZXZlbF9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbCBvcGVyOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7IH07ICAgICAgICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX09OVV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X2dwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkub251X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fT05VX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX29udSwgY2hhbmdlX3Bvd2VyX2xldmVsLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGdwb25fb251LCBjaGFuZ2VfcG93ZXJfbGV2ZWwsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG93ZXJfbGV2ZWxfYWN0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfb251X3Bvd2VyX2xldmVsIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9vbnVfcG93ZXJfbGV2ZWwpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25fb251LCBjaGFuZ2VfcG93ZXJfbGV2ZWwsIHBvd2VyX2xldmVsX2FjdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25fb251LCBjaGFuZ2VfcG93ZXJfbGV2ZWwsIHBvd2VyX2xldmVsX2FjdGlvbiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfR1BPTl9PTlVfT1BFUl9JRF9DSEFOR0VfUE9XRVJfTEVWRUwsIEJDTU9MVF9HUE9OX09OVV9DSEFOR0VfUE9XRVJfTEVWRUxfSURfUE9XRVJfTEVWRUxfQUNUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9vbnVfcHJveHlfY3B1X3BhY2tldHNfc2VuZChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0cyBwcm94eTsgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsgfTsgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHMgcHJveHk7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9wcm94eV9zZW5kIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fT05VX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm9udV9pZCA9IChiY21vbHRfZ3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5vbnVfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9PTlVfS0VZX0lEX09OVV9JRCwgJmtleS5vbnVfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9QUk9YWV9JTklUKCZwcm94eSwgZ3Bvbl9vbnUsIGNwdV9wYWNrZXRzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9QUk9YWV9JTklUKCZwcm94eSwgZ3Bvbl9vbnUsIGNwdV9wYWNrZXRzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBhY2tldF90eXBlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcGFja2V0X3R5cGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3BhY2tldF90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fb251LCBjcHVfcGFja2V0cywgcGFja2V0X3R5cGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fb251LCBjcHVfcGFja2V0cywgcGFja2V0X3R5cGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFksIEJDTU9MVF9HUE9OX09OVV9QUk9YWV9JRF9DUFVfUEFDS0VUUywgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9UWVBFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2FsY19jcmMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCBncG9uX29udSwgY3B1X3BhY2tldHMsIGNhbGNfY3JjLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCBncG9uX29udSwgY3B1X3BhY2tldHMsIGNhbGNfY3JjLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX1BST1hZLCBCQ01PTFRfR1BPTl9PTlVfUFJPWFlfSURfQ1BVX1BBQ0tFVFMsIEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9DQUxDX0NSQywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm51bWJlcl9vZl9wYWNrZXRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fb251LCBjcHVfcGFja2V0cywgbnVtYmVyX29mX3BhY2tldHMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fb251LCBjcHVfcGFja2V0cywgbnVtYmVyX29mX3BhY2tldHMsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFksIEJDTU9MVF9HUE9OX09OVV9QUk9YWV9JRF9DUFVfUEFDS0VUUywgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRTX0lEX05VTUJFUl9PRl9QQUNLRVRTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGFja2V0X3NpemUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fb251LCBjcHVfcGFja2V0cywgcGFja2V0X3NpemUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fb251LCBjcHVfcGFja2V0cywgcGFja2V0X3NpemUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFksIEJDTU9MVF9HUE9OX09OVV9QUk9YWV9JRF9DUFVfUEFDS0VUUywgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9TSVpFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYnVmZmVyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDggdmFsID0geyB9OworICAgICAgICB2YWwubGVuID0gYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcik7CisgICAgICAgIHZhbC52YWwgPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIHZhbC5sZW4pOworICAgICAgICBpZiAodmFsLnZhbCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgfQorCisgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLnZhbCwgdmFsLmxlbik7CisgICAgICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fb251LCBjcHVfcGFja2V0cywgYnVmZmVyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFksIEJDTU9MVF9HUE9OX09OVV9QUk9YWV9JRF9DUFVfUEFDS0VUUywgQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRTX0lEX0JVRkZFUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCBncG9uX29udSwgY3B1X3BhY2tldHMsIGJ1ZmZlciwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9wcm94eV9zZW5kKGRldmljZV9pZCwgJnByb3h5Lmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Byb3h5X3NlbmQoZGV2aWNlX2lkLCAmcHJveHkuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHByb3h5Lmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX29udV9wcm94eV9wbG9hbV9wYWNrZXRfc2VuZChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0IHByb3h5OyAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7IH07ICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldCBwcm94eTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3Byb3h5X3NlbmQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF9ncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX09OVV9LRVlfSURfT05VX0lELCAma2V5Lm9udV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX1BST1hZX0lOSVQoJnByb3h5LCBncG9uX29udSwgcGxvYW1fcGFja2V0LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9QUk9YWV9JTklUKCZwcm94eSwgZ3Bvbl9vbnUsIHBsb2FtX3BhY2tldCwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicGxvYW0uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYXJyX3U4XzEyIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwbG9hbS5hcnIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSAxMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIHBsb2FtLmFyciBtdXN0IGhhdmUgMTIgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC5hcnIsIDEyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwbG9hbS5hcnIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgZ3Bvbl9vbnUsIHBsb2FtX3BhY2tldCwgcGxvYW0sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYXJyX3U4XzEyIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFksIEJDTU9MVF9HUE9OX09OVV9QUk9YWV9JRF9QTE9BTV9QQUNLRVQsIEJDTU9MVF9HUE9OX09OVV9QTE9BTV9QQUNLRVRfSURfUExPQU0sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgZ3Bvbl9vbnUsIHBsb2FtX3BhY2tldCwgcGxvYW0sIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfcHJveHlfc2VuZChkZXZpY2VfaWQsICZwcm94eS5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9wcm94eV9zZW5kKGRldmljZV9pZCwgJnByb3h5Lmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBwcm94eS5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9vbnVfc3RhdF9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZyBzdGF0X2NmZzsgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsgfTsgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X2dwb25fb251X3N0YXRfaWQgc3RhdF9pZDsgICAgLyoqPCBkZWNsYXJlIHN0YXQgSUQgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX29udV9zdGF0X2NmZyBzdGF0X2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX09OVV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X2dwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkub251X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fT05VX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IElEIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBzdGF0X2lkID0gKGJjbW9sdF9ncG9uX29udV9zdGF0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgc3dpdGNoIChzdGF0X2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09ERVdPUkRTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgZmVjX2NvZGV3b3Jkcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIGZlY19jb2Rld29yZHMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0ZFQ19CWVRFU19DT1JSRUNURUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCBmZWNfYnl0ZXNfY29ycmVjdGVkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgZmVjX2J5dGVzX2NvcnJlY3RlZCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEU19DT1JSRUNURUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCBmZWNfY29kZXdvcmRzX2NvcnJlY3RlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIGZlY19jb2Rld29yZHNfY29ycmVjdGVkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09ERVdPUkRTX1VOQ09SUkVDVEVEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgZmVjX2NvZGV3b3Jkc191bmNvcnJlY3RlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIGZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0JJUDhfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCBiaXA4X2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgYmlwOF9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfQklQOF9FUlJPUlM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCBiaXA4X2Vycm9ycywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIGJpcDhfZXJyb3JzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfQ1JDX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgcnhfcGxvYW1zX2NyY19lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIHJ4X3Bsb2Ftc19jcmNfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX1BMT0FNU19OT05fSURMRToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIHJ4X3Bsb2Ftc19ub25faWRsZSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIHJ4X3Bsb2Ftc19ub25faWRsZSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUE9TSVRJVkVfRFJJRlQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCBwb3NpdGl2ZV9kcmlmdCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIHBvc2l0aXZlX2RyaWZ0LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9ORUdBVElWRV9EUklGVDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIG5lZ2F0aXZlX2RyaWZ0LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgbmVnYXRpdmVfZHJpZnQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX09NQ0k6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCByeF9vbWNpLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgcnhfb21jaSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIHJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCByeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9CRVJfUkVQT1JURUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCBiZXJfcmVwb3J0ZWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCBiZXJfcmVwb3J0ZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1VOUkVDRUlWRURfQlVSU1Q6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCB1bnJlY2VpdmVkX2J1cnN0LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgdW5yZWNlaXZlZF9idXJzdCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfTENER19FUlJPUlM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCBsY2RnX2Vycm9ycywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIGxjZGdfZXJyb3JzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SRElfRVJST1JTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgcmRpX2Vycm9ycywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIHJkaV9lcnJvcnMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgcnhfYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCByeF9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfUEFDS0VUUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIHJ4X3BhY2tldHMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCByeF9wYWNrZXRzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9UWF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIHR4X2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgdHhfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1RYX1BBQ0tFVFM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCB0eF9wYWNrZXRzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgdHhfcGFja2V0cywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZzdGF0X2NmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0X2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfZ3Bvbl9vbnVfc3RhdF9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZyBzdGF0X2NmZzsgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsgfTsgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X2dwb25fb251X3N0YXRfaWQgc3RhdF9pZDsgICAgLyoqPCBkZWNsYXJlIHN0YXQgSUQgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX29udV9zdGF0X2NmZyBzdGF0X2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX09OVV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X2dwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkub251X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fT05VX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IElEIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBzdGF0X2lkID0gKGJjbW9sdF9ncG9uX29udV9zdGF0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgc3dpdGNoIChzdGF0X2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09ERVdPUkRTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgZmVjX2NvZGV3b3Jkcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIGZlY19jb2Rld29yZHMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0ZFQ19CWVRFU19DT1JSRUNURUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCBmZWNfYnl0ZXNfY29ycmVjdGVkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgZmVjX2J5dGVzX2NvcnJlY3RlZCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEU19DT1JSRUNURUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCBmZWNfY29kZXdvcmRzX2NvcnJlY3RlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIGZlY19jb2Rld29yZHNfY29ycmVjdGVkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09ERVdPUkRTX1VOQ09SUkVDVEVEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgZmVjX2NvZGV3b3Jkc191bmNvcnJlY3RlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIGZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0JJUDhfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCBiaXA4X2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgYmlwOF9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfQklQOF9FUlJPUlM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCBiaXA4X2Vycm9ycywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIGJpcDhfZXJyb3JzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfQ1JDX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgcnhfcGxvYW1zX2NyY19lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIHJ4X3Bsb2Ftc19jcmNfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX1BMT0FNU19OT05fSURMRToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIHJ4X3Bsb2Ftc19ub25faWRsZSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIHJ4X3Bsb2Ftc19ub25faWRsZSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUE9TSVRJVkVfRFJJRlQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCBwb3NpdGl2ZV9kcmlmdCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIHBvc2l0aXZlX2RyaWZ0LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9ORUdBVElWRV9EUklGVDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIG5lZ2F0aXZlX2RyaWZ0LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgbmVnYXRpdmVfZHJpZnQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX09NQ0k6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCByeF9vbWNpLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgcnhfb21jaSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIHJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCByeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9CRVJfUkVQT1JURUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCBiZXJfcmVwb3J0ZWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCBiZXJfcmVwb3J0ZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1VOUkVDRUlWRURfQlVSU1Q6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCB1bnJlY2VpdmVkX2J1cnN0LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgdW5yZWNlaXZlZF9idXJzdCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfTENER19FUlJPUlM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCBsY2RnX2Vycm9ycywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIGxjZGdfZXJyb3JzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SRElfRVJST1JTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgcmRpX2Vycm9ycywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIHJkaV9lcnJvcnMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgcnhfYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCByeF9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfUEFDS0VUUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIHJ4X3BhY2tldHMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCByeF9wYWNrZXRzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9UWF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIHR4X2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgdHhfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1RYX1BBQ0tFVFM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGdwb25fb251LCB0eF9wYWNrZXRzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBncG9uX29udSwgdHhfcGFja2V0cywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjZmcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc3RhdF9hbGFybV9jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjZmcudHJpZ2dlci4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIudHlwZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudHlwZSA9IChiY21vbHRfc3RhdF9jb25kaXRpb25fdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci50eXBlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAodmFsLnRyaWdnZXIudHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfVEhSRVNIT0xEOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnJpc2luZyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3RocmVzaG9sZC5yaXNpbmcgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnJpc2luZyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmZhbGxpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV90aHJlc2hvbGQuZmFsbGluZyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIuZmFsbGluZyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1JBTkdFOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnVwcGVyIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfcmFuZ2UudXBwZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnVwcGVyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIubG93ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV9yYW5nZS5sb3dlciA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIubG93ZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfVkFMVUVfVEhSRVNIT0xEOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmxpbWl0Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnZhbHVlX3RocmVzaG9sZC5saW1pdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIubGltaXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfTk9ORToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjZmcuc29hay4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnNvYWsuYWN0aXZlX3NvYWtfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hay5hY3RpdmVfc29ha190aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnNvYWsuY2xlYXJfc29ha190aW1lIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuc29hay5jbGVhcl9zb2FrX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsuY2xlYXJfc29ha190aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX1BST1BfU0VUKCZzdGF0X2NmZywgZ3Bvbl9vbnUsIGNmZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfU1RBVF9DRkdfSURfQ0ZHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19QUk9QX1NFVCgmc3RhdF9jZmcsIGdwb25fb251LCBjZmcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdF9jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fb251X2F1dG9fY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmcgYXV0b19jZmc7ICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7IH07ICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfZ2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBncG9uX29udSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGdwb25fb251LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBiZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGJlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGZpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGRmaSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgZGZpKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZ2kiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgZGdpKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBkZ2kpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRvd2kiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgZG93aSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgZG93aSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXJyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGVycik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgZXJyKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpbnZhbGlkX2RicnVfcmVwb3J0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGludmFsaWRfZGJydV9yZXBvcnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGludmFsaWRfZGJydV9yZXBvcnQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImtleV9leGNoYW5nZV9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwga2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwga2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwga2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGtleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBrZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwga2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImtleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2giKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwga2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwga2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwga2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGtleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBrZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwga2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXgpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvYWkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgbG9haSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgbG9haSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9raSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBsb2tpKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBsb2tpKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtZW1pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIG1lbWkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIG1lbWkpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBvbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIG9tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2FjdGl2YXRpb25fY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIG9udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgb251X2FjdGl2YXRpb25fY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBvbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9hbGFybSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBvbnVfYWxhcm0pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIG9udV9hbGFybSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIG9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfZGlzYWJsZV9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgb251X2Rpc2FibGVfY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBvbnVfZGlzYWJsZV9jb21wbGV0ZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9lbmFibGVfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIG9udV9lbmFibGVfY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBvbnVfZW5hYmxlX2NvbXBsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib3B0aWNhbF9yZWZsZWN0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIG9wdGljYWxfcmVmbGVjdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgb3B0aWNhbF9yZWZsZWN0aW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBwYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBlZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBwZWUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHBlZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9zc2libGVfZHJpZnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgcG9zc2libGVfZHJpZnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHBvc3NpYmxlX2RyaWZ0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBzdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBwc3QpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHBzdCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ19jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgcmFuZ2luZ19jb21wbGV0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHJhbmdpbmdfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyZWkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgcmVpKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCByZWkpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCByc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2RpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHNkaSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgc2RpKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzZmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgc2ZpKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBzZmkpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fY2xlYXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGdwb25fb251LCBzdGF0X2FsYXJtX2NsZWFyZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHN0YXRfYWxhcm1fY2xlYXJlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9yYWlzZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgc3RhdF9hbGFybV9yYWlzZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHN0YXRfYWxhcm1fcmFpc2VkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWZpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHN1ZmkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHN1ZmkpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRpd2kiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgdGl3aSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgdGl3aSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGJlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBkZmkpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgZGdpKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGRvd2kpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgZXJyKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGludmFsaWRfZGJydV9yZXBvcnQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwga2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBrZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBrZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBrZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGtleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0KSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGtleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4KSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGxvYWkpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgbG9raSkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBtZW1pKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIG9tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBvbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgb251X2FsYXJtKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIG9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIG9udV9kaXNhYmxlX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBvbnVfZW5hYmxlX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBvcHRpY2FsX3JlZmxlY3Rpb24pICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHBlZSkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBwb3NzaWJsZV9kcmlmdCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBwc3QpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgcmFuZ2luZ19jb21wbGV0ZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgcmVpKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHNkaSkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBzZmkpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgc3RhdF9hbGFybV9jbGVhcmVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHN0YXRfYWxhcm1fcmFpc2VkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHN1ZmkpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgdGl3aSkpCisgICAgeworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmYXV0b19jZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fb251X2F1dG9fY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmcgYXV0b19jZmc7ICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7IH07ICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfc2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBncG9uX29udSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGdwb25fb251LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBiZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBiZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9CRVJfSU5URVJWQUxfQ09ORklHVVJBVElPTl9DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgZGZpLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgZGZpLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfREZJLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGdpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGRnaSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGRnaSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0RHSSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRvd2kiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgZG93aSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGRvd2ksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9ET1dJLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXJyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGVyciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGVyciwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0VSUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImludmFsaWRfZGJydV9yZXBvcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgaW52YWxpZF9kYnJ1X3JlcG9ydCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGludmFsaWRfZGJydV9yZXBvcnQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9JTlZBTElEX0RCUlVfUkVQT1JULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBrZXlfZXhjaGFuZ2VfY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwga2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBrZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGtleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0NZQ0xFX1NLSVBQRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBrZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGtleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0RFQ1JZUFRfUkVRVUlSRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGtleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2gsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBrZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImtleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGtleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwga2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfS0VZX1JFUVVFU1RfVElNRU9VVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImtleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGtleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwga2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXgsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfVU5DT05TRUNVVElWRV9JTkRFWCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvYWkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgbG9haSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIGxvYWksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9MT0FJLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9raSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBsb2tpLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgbG9raSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0xPS0ksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtZW1pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIG1lbWksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBtZW1pLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfTUVNSSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBvbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBvbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTUNJX1BPUlRfSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgb251X2FjdGl2YXRpb25fY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgb251X2FjdGl2YXRpb25fY29tcGxldGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0FDVElWQVRJT05fQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBvbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9BQ1RJVkFUSU9OX1NUQU5EQllfQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2FsYXJtIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIG9udV9hbGFybSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIG9udV9hbGFybSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9BTEFSTSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIG9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfREVBQ1RJVkFUSU9OX0NPTVBMRVRFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9kaXNhYmxlX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBvbnVfZGlzYWJsZV9jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBvbnVfZGlzYWJsZV9jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfRElTQUJMRV9DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfZW5hYmxlX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBvbnVfZW5hYmxlX2NvbXBsZXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIG9udV9lbmFibGVfY29tcGxldGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0VOQUJMRV9DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvcHRpY2FsX3JlZmxlY3Rpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgb3B0aWNhbF9yZWZsZWN0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgb3B0aWNhbF9yZWZsZWN0aW9uLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT1BUSUNBTF9SRUZMRUNUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBlZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBwZWUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBwZWUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9QRUUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb3NzaWJsZV9kcmlmdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBwb3NzaWJsZV9kcmlmdCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHBvc3NpYmxlX2RyaWZ0LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUE9TU0lCTEVfRFJJRlQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHBvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0UsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwc3QiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgcHN0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgcHN0LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUFNULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ19jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgcmFuZ2luZ19jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCByYW5naW5nX2NvbXBsZXRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1JBTkdJTkdfQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmVpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHJlaSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHJlaSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1JFSSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNkaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBzZGksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCBzZGksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9TREksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzZmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgc2ZpLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgc2ZpLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU0ZJLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9jbGVhcmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHN0YXRfYWxhcm1fY2xlYXJlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHN0YXRfYWxhcm1fY2xlYXJlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fcmFpc2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHN0YXRfYWxhcm1fcmFpc2VkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgc3RhdF9hbGFybV9yYWlzZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1ZmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgc3VmaSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgZ3Bvbl9vbnUsIHN1ZmksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9TVUZJLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidGl3aSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGdwb25fb251LCB0aXdpLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBncG9uX29udSwgdGl3aSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1RJV0ksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fdHJ4X2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fdHJ4X2NmZyBjZmc7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fdHJ4X2tleSBrZXkgPSB7IH07ICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl90cnhfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX3RyeF9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X2dwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfR1BPTl9UUlhfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX3RyeCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl90cngsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHJhbnNjZWl2ZXJfdHlwZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIHRyYW5zY2VpdmVyX3R5cGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgdHJhbnNjZWl2ZXJfdHlwZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFfY29uZmlndXJhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIGxhX2NvbmZpZ3VyYXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgbGFfY29uZmlndXJhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmNkciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIGJjZHIpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgYmNkcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCBsYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCBsYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIGJjZHJfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCBsYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCBsYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmNkcl9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIGJjZHJfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgYmNkcl9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFfcmVzeW5jX3BvbGFyaXR5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgbGFfcmVzeW5jX3BvbGFyaXR5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIGxhX3Jlc3luY19wb2xhcml0eSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmNkcl9yZXN5bmNfcG9sYXJpdHkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCBiY2RyX3Jlc3luY19wb2xhcml0eSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCBiY2RyX3Jlc3luY19wb2xhcml0eSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmNkcl9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgYmNkcl9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIGJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIGxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgbGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfY29uZmlndXJhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIHJ4X2NvbmZpZ3VyYXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgcnhfY29uZmlndXJhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ19jb250cm9sX3N0YWdlc19jb25maWd1cmF0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgcmFuZ2luZ19jb250cm9sX3N0YWdlc19jb25maWd1cmF0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIHJhbmdpbmdfY29udHJvbF9zdGFnZXNfY29uZmlndXJhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZW5lcmd5X2RldGVjdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIGVuZXJneV9kZXRlY3QpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgZW5lcmd5X2RldGVjdCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZW5kX29mX2J1cnN0X2RhdGFfcGF0dGVybiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIGVuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgZW5kX29mX2J1cnN0X2RhdGFfcGF0dGVybik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZW5kX29mX2J1cnN0X3JhbmdpbmdfcGF0dGVybiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIGVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgZW5kX29mX2J1cnN0X3JhbmdpbmdfcGF0dGVybik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJlYW1ibGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCBwcmVhbWJsZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCBwcmVhbWJsZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVsaW1pdGVyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgZGVsaW1pdGVyKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIGRlbGltaXRlcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ3VhcmRfYml0cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIGd1YXJkX2JpdHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgZ3VhcmRfYml0cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2VyZGVzX2NvbmZpZ3VyYXRpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCBzZXJkZXNfY29uZmlndXJhdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCBzZXJkZXNfY29uZmlndXJhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGxvX3JhbmdpbmciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCBwbG9fcmFuZ2luZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCBwbG9fcmFuZ2luZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGxvX2RhdGEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCBwbG9fZGF0YSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCBwbG9fZGF0YSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnNzaV9ub3JtYWxfY29uZmlnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgcnNzaV9ub3JtYWxfY29uZmlnKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIHJzc2lfbm9ybWFsX2NvbmZpZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ19yc3NpX3Jlc3luY19jb250cm9sIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBncG9uX3RyeCwgcmFuZ2luZ19yc3NpX3Jlc3luY19jb250cm9sKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIHJhbmdpbmdfcnNzaV9yZXN5bmNfY29udHJvbCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX3RyeCwgdHJhbnNjZWl2ZXJfdHlwZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl90cngsIGxhX2NvbmZpZ3VyYXRpb24pICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fdHJ4LCBiY2RyKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX3RyeCwgbGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fdHJ4LCBiY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX3RyeCwgbGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fdHJ4LCBiY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX3RyeCwgbGFfcmVzeW5jX3BvbGFyaXR5KSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX3RyeCwgYmNkcl9yZXN5bmNfcG9sYXJpdHkpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fdHJ4LCBiY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fdHJ4LCBsYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX3RyeCwgcnhfY29uZmlndXJhdGlvbikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl90cngsIHJhbmdpbmdfY29udHJvbF9zdGFnZXNfY29uZmlndXJhdGlvbikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl90cngsIGVuZXJneV9kZXRlY3QpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fdHJ4LCBlbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX3RyeCwgZW5kX29mX2J1cnN0X3JhbmdpbmdfcGF0dGVybikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl90cngsIHByZWFtYmxlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX3RyeCwgZGVsaW1pdGVyKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX3RyeCwgZ3VhcmRfYml0cykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl90cngsIHNlcmRlc19jb25maWd1cmF0aW9uKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBncG9uX3RyeCwgcGxvX3JhbmdpbmcpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGdwb25fdHJ4LCBwbG9fZGF0YSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl90cngsIHJzc2lfbm9ybWFsX2NvbmZpZykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgZ3Bvbl90cngsIHJhbmdpbmdfcnNzaV9yZXN5bmNfY29udHJvbCkpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGdwb25fdHJ4LCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZ3Bvbl90cngsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX3RyeF9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX3RyeF9jZmcgY2ZnOyAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX3RyeF9rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fdHJ4X2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl90cnhfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fVFJYX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl90cngsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fdHJ4LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRyYW5zY2VpdmVyX3R5cGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF90cnhfdHlwZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfdHJ4X3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgdHJhbnNjZWl2ZXJfdHlwZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgdHJhbnNjZWl2ZXJfdHlwZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfVFJBTlNDRUlWRVJfVFlQRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJsYV9jb25maWd1cmF0aW9uLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2xhX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb24gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJsYV9jb25maWd1cmF0aW9uLnJlc3luY19jb250cm9sLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsYV9jb25maWd1cmF0aW9uLnJlc3luY19jb250cm9sLnN0YXJ0X3BhdHRlcm4iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yZXN5bmNfY29udHJvbC5zdGFydF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImxhX2NvbmZpZ3VyYXRpb24ucmVzeW5jX2NvbnRyb2wuc3RhcnRfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhX2NvbmZpZ3VyYXRpb24ucmVzeW5jX2NvbnRyb2wubWlkZGxlX3BhdHRlcm4iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yZXN5bmNfY29udHJvbC5taWRkbGVfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJsYV9jb25maWd1cmF0aW9uLnJlc3luY19jb250cm9sLm1pZGRsZV9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFfY29uZmlndXJhdGlvbi5yZXN5bmNfY29udHJvbC5sYXN0X3BhdHRlcm4iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yZXN5bmNfY29udHJvbC5sYXN0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibGFfY29uZmlndXJhdGlvbi5yZXN5bmNfY29udHJvbC5sYXN0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsYV9jb25maWd1cmF0aW9uLnJlc3luY19jb250cm9sLm1pZGRsZV9yZXBldGl0aW9uIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucmVzeW5jX2NvbnRyb2wubWlkZGxlX3JlcGV0aXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibGFfY29uZmlndXJhdGlvbi5yZXN5bmNfY29udHJvbC5taWRkbGVfcmVwZXRpdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhX2NvbmZpZ3VyYXRpb24ucmVzeW5jX2NvbnRyb2wubG9jYXRpb24iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yZXN5bmNfY29udHJvbC5sb2NhdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJsYV9jb25maWd1cmF0aW9uLnJlc3luY19jb250cm9sLmxvY2F0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibGFfY29uZmlndXJhdGlvbi5yZXN5bmNfY29udHJvbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJsYV9jb25maWd1cmF0aW9uLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhX2NvbmZpZ3VyYXRpb24ucmFuZ2luZ19yZXN5bmNfY29udHJvbC5zdGFydF9wYXR0ZXJuIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucmFuZ2luZ19yZXN5bmNfY29udHJvbC5zdGFydF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImxhX2NvbmZpZ3VyYXRpb24ucmFuZ2luZ19yZXN5bmNfY29udHJvbC5zdGFydF9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFfY29uZmlndXJhdGlvbi5yYW5naW5nX3Jlc3luY19jb250cm9sLm1pZGRsZV9wYXR0ZXJuIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucmFuZ2luZ19yZXN5bmNfY29udHJvbC5taWRkbGVfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJsYV9jb25maWd1cmF0aW9uLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubWlkZGxlX3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsYV9jb25maWd1cmF0aW9uLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubGFzdF9wYXR0ZXJuIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucmFuZ2luZ19yZXN5bmNfY29udHJvbC5sYXN0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibGFfY29uZmlndXJhdGlvbi5yYW5naW5nX3Jlc3luY19jb250cm9sLmxhc3RfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhX2NvbmZpZ3VyYXRpb24ucmFuZ2luZ19yZXN5bmNfY29udHJvbC5taWRkbGVfcmVwZXRpdGlvbiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubWlkZGxlX3JlcGV0aXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibGFfY29uZmlndXJhdGlvbi5yYW5naW5nX3Jlc3luY19jb250cm9sLm1pZGRsZV9yZXBldGl0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFfY29uZmlndXJhdGlvbi5yYW5naW5nX3Jlc3luY19jb250cm9sLmxvY2F0aW9uIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucmFuZ2luZ19yZXN5bmNfY29udHJvbC5sb2NhdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJsYV9jb25maWd1cmF0aW9uLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubG9jYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJsYV9jb25maWd1cmF0aW9uLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgbGFfY29uZmlndXJhdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9sYV9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX0NPTkZJR1VSQVRJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgbGFfY29uZmlndXJhdGlvbiwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJiY2RyLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2JjZHJfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImJjZHIucmVzeW5jX2NvbnRyb2wuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJjZHIucmVzeW5jX2NvbnRyb2wuc3RhcnRfcGF0dGVybiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnJlc3luY19jb250cm9sLnN0YXJ0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYmNkci5yZXN5bmNfY29udHJvbC5zdGFydF9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmNkci5yZXN5bmNfY29udHJvbC5taWRkbGVfcGF0dGVybiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnJlc3luY19jb250cm9sLm1pZGRsZV9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJjZHIucmVzeW5jX2NvbnRyb2wubWlkZGxlX3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiY2RyLnJlc3luY19jb250cm9sLmxhc3RfcGF0dGVybiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnJlc3luY19jb250cm9sLmxhc3RfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiY2RyLnJlc3luY19jb250cm9sLmxhc3RfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJjZHIucmVzeW5jX2NvbnRyb2wubWlkZGxlX3JlcGV0aXRpb24iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yZXN5bmNfY29udHJvbC5taWRkbGVfcmVwZXRpdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiY2RyLnJlc3luY19jb250cm9sLm1pZGRsZV9yZXBldGl0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmNkci5yZXN5bmNfY29udHJvbC5sb2NhdGlvbiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnJlc3luY19jb250cm9sLmxvY2F0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJjZHIucmVzeW5jX2NvbnRyb2wubG9jYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiY2RyLnJlc3luY19jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImJjZHIucmFuZ2luZ19yZXN5bmNfY29udHJvbC4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmNkci5yYW5naW5nX3Jlc3luY19jb250cm9sLnN0YXJ0X3BhdHRlcm4iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yYW5naW5nX3Jlc3luY19jb250cm9sLnN0YXJ0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYmNkci5yYW5naW5nX3Jlc3luY19jb250cm9sLnN0YXJ0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiY2RyLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubWlkZGxlX3BhdHRlcm4iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yYW5naW5nX3Jlc3luY19jb250cm9sLm1pZGRsZV9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJjZHIucmFuZ2luZ19yZXN5bmNfY29udHJvbC5taWRkbGVfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJjZHIucmFuZ2luZ19yZXN5bmNfY29udHJvbC5sYXN0X3BhdHRlcm4iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yYW5naW5nX3Jlc3luY19jb250cm9sLmxhc3RfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiY2RyLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubGFzdF9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmNkci5yYW5naW5nX3Jlc3luY19jb250cm9sLm1pZGRsZV9yZXBldGl0aW9uIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucmFuZ2luZ19yZXN5bmNfY29udHJvbC5taWRkbGVfcmVwZXRpdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiY2RyLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubWlkZGxlX3JlcGV0aXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiY2RyLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubG9jYXRpb24iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yYW5naW5nX3Jlc3luY19jb250cm9sLmxvY2F0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJjZHIucmFuZ2luZ19yZXN5bmNfY29udHJvbC5sb2NhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJjZHIucmFuZ2luZ19yZXN5bmNfY29udHJvbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBiY2RyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2JjZHJfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9CQ0RSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGJjZHIsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAibGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcmVzeW5jX2NvbnRyb2wgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLnN0YXJ0X3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zdGFydF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMuc3RhcnRfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLm1pZGRsZV9wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWlkZGxlX3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJsYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5taWRkbGVfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLmxhc3RfcGF0dGVybiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxhc3RfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImxhX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLmxhc3RfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLm1pZGRsZV9yZXBldGl0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWlkZGxlX3JlcGV0aXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJsYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5taWRkbGVfcmVwZXRpdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLmxvY2F0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9jYXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJsYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5sb2NhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBsYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9yZXN5bmNfY29udHJvbCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9SQU5HSU5HX0FGVEVSX05PX0VEX1JFU1lOQywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBsYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJiY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Jlc3luY19jb250cm9sIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLnN0YXJ0X3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zdGFydF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5zdGFydF9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5taWRkbGVfcGF0dGVybiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1pZGRsZV9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5taWRkbGVfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJjZHJfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMubGFzdF9wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubGFzdF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5sYXN0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLm1pZGRsZV9yZXBldGl0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWlkZGxlX3JlcGV0aXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLm1pZGRsZV9yZXBldGl0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5sb2NhdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvY2F0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5sb2NhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBiY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Jlc3luY19jb250cm9sIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0JDRFJfUkFOR0lOR19BRlRFUl9OT19FRF9SRVNZTkMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJsYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9yZXN5bmNfY29udHJvbCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMuc3RhcnRfcGF0dGVybiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnN0YXJ0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJsYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYy5zdGFydF9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMubWlkZGxlX3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5taWRkbGVfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImxhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLm1pZGRsZV9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMubGFzdF9wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubGFzdF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMubGFzdF9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMubWlkZGxlX3JlcGV0aXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5taWRkbGVfcmVwZXRpdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImxhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLm1pZGRsZV9yZXBldGl0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMubG9jYXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb2NhdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImxhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLmxvY2F0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGxhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Jlc3luY19jb250cm9sIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX1JBTkdJTkdfQUZURVJfRURfUkVTWU5DLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGxhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImJjZHJfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcmVzeW5jX2NvbnRyb2wgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJjZHJfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMuc3RhcnRfcGF0dGVybiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnN0YXJ0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLnN0YXJ0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLm1pZGRsZV9wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWlkZGxlX3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLm1pZGRsZV9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmNkcl9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYy5sYXN0X3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sYXN0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLmxhc3RfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJjZHJfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMubWlkZGxlX3JlcGV0aXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5taWRkbGVfcmVwZXRpdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJjZHJfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMubWlkZGxlX3JlcGV0aXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLmxvY2F0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9jYXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLmxvY2F0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGJjZHJfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcmVzeW5jX2NvbnRyb2wgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUl9SQU5HSU5HX0FGVEVSX0VEX1JFU1lOQywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBiY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFfcmVzeW5jX3BvbGFyaXR5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcG9sYXJpdHkgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3BvbGFyaXR5KSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGxhX3Jlc3luY19wb2xhcml0eSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgbGFfcmVzeW5jX3BvbGFyaXR5LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9SRVNZTkNfUE9MQVJJVFksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiY2RyX3Jlc3luY19wb2xhcml0eSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3BvbGFyaXR5IHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9wb2xhcml0eSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBiY2RyX3Jlc3luY19wb2xhcml0eSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgYmNkcl9yZXN5bmNfcG9sYXJpdHksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0JDRFJfUkVTWU5DX1BPTEFSSVRZLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfaW5pdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFmdGVyX2luaXQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5hZnRlcl9pbml0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmNkcl9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX25vX2VkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWZ0ZXJfbm9fZWQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5hZnRlcl9ub19lZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5hZnRlcl9lZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFmdGVyX2VkID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfZWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfbm9fZGVsIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWZ0ZXJfbm9fZGVsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfbm9fZGVsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmNkcl9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX3JhbmdpbmdfYWNjZXNzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWZ0ZXJfcmFuZ2luZ19hY2Nlc3MgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5hZnRlcl9yYW5naW5nX2FjY2VzcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5tZWRfdmFsIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWVkX3ZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5tZWRfdmFsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0JDRFJfUkFOR0lOR19SRVNZTkNfQ09ORElUSU9OUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBiY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAibGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX2luaXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZnRlcl9pbml0ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJsYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX2luaXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX25vX2VkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWZ0ZXJfbm9fZWQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfbm9fZWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX2VkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWZ0ZXJfZWQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfZWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX25vX2RlbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFmdGVyX25vX2RlbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5hZnRlcl9ub19kZWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX3JhbmdpbmdfYWNjZXNzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWZ0ZXJfcmFuZ2luZ19hY2Nlc3MgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfcmFuZ2luZ19hY2Nlc3MgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLm1lZF92YWwiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tZWRfdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5tZWRfdmFsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9SQU5HSU5HX1JFU1lOQ19DT05ESVRJT05TLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicnhfY29uZmlndXJhdGlvbi4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF90cnhfcnhfY29uZmlndXJhdGlvbiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfY29uZmlndXJhdGlvbi53YWl0X3dpbmRvd19zaXplIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwud2FpdF93aW5kb3dfc2l6ZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJ4X2NvbmZpZ3VyYXRpb24ud2FpdF93aW5kb3dfc2l6ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2NvbmZpZ3VyYXRpb24ucmFuZ2luZ19hY2Nlc3Nfd2luZG93X3NpemUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5yYW5naW5nX2FjY2Vzc193aW5kb3dfc2l6ZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJ4X2NvbmZpZ3VyYXRpb24ucmFuZ2luZ19hY2Nlc3Nfd2luZG93X3NpemUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgcnhfY29uZmlndXJhdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF90cnhfcnhfY29uZmlndXJhdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9SWF9DT05GSUdVUkFUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIHJ4X2NvbmZpZ3VyYXRpb24sIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicmFuZ2luZ19jb250cm9sX3N0YWdlc19jb25maWd1cmF0aW9uLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3JhbmdpbmdfY29udHJvbF9jb25maWd1cmF0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX2NvbnRyb2xfc3RhZ2VzX2NvbmZpZ3VyYXRpb24ud2FpdF9zdGF0ZV8xX3dpbmRvd19zaXplIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwud2FpdF9zdGF0ZV8xX3dpbmRvd19zaXplID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicmFuZ2luZ19jb250cm9sX3N0YWdlc19jb25maWd1cmF0aW9uLndhaXRfc3RhdGVfMV93aW5kb3dfc2l6ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfY29udHJvbF9zdGFnZXNfY29uZmlndXJhdGlvbi53YWl0X3N0YXRlXzJfd2luZG93X3NpemUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC53YWl0X3N0YXRlXzJfd2luZG93X3NpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyYW5naW5nX2NvbnRyb2xfc3RhZ2VzX2NvbmZpZ3VyYXRpb24ud2FpdF9zdGF0ZV8yX3dpbmRvd19zaXplIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ19jb250cm9sX3N0YWdlc19jb25maWd1cmF0aW9uLndhaXRfYWZ0ZXJfcmVzeW5jXzQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC53YWl0X2FmdGVyX3Jlc3luY180ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyYW5naW5nX2NvbnRyb2xfc3RhZ2VzX2NvbmZpZ3VyYXRpb24ud2FpdF9hZnRlcl9yZXN5bmNfNCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCByYW5naW5nX2NvbnRyb2xfc3RhZ2VzX2NvbmZpZ3VyYXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcmFuZ2luZ19jb250cm9sX2NvbmZpZ3VyYXRpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUkFOR0lOR19DT05UUk9MX1NUQUdFU19DT05GSUdVUkFUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIHJhbmdpbmdfY29udHJvbF9zdGFnZXNfY29uZmlndXJhdGlvbiwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJlbmVyZ3lfZGV0ZWN0LiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0IHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmVyZ3lfZGV0ZWN0LnJhbmdpbmdfZWRfc291cmNlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmFuZ2luZ19lZF9zb3VyY2UgPSAoYmNtb2x0X2VuZXJneV9kZXRlY3Rfc291cmNlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZW5lcmd5X2RldGVjdC5yYW5naW5nX2VkX3NvdXJjZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuZXJneV9kZXRlY3QuZGVsaW1pdGVyX2VkX3NvdXJjZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRlbGltaXRlcl9lZF9zb3VyY2UgPSAoYmNtb2x0X2VuZXJneV9kZXRlY3Rfc291cmNlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZW5lcmd5X2RldGVjdC5kZWxpbWl0ZXJfZWRfc291cmNlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZW5lcmd5X2RldGVjdC5taW5pbXVtX3RocmVzaG9sZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1pbmltdW1fdGhyZXNob2xkID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZW5lcmd5X2RldGVjdC5taW5pbXVtX3RocmVzaG9sZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuZXJneV9kZXRlY3QubWF4aW11bV90aHJlc2hvbGQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tYXhpbXVtX3RocmVzaG9sZCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVuZXJneV9kZXRlY3QubWF4aW11bV90aHJlc2hvbGQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmVyZ3lfZGV0ZWN0LmVkX3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5lZF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZW5lcmd5X2RldGVjdC5lZF9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZW5lcmd5X2RldGVjdC5lZF9wYXR0ZXJuX3NpemUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5lZF9wYXR0ZXJuX3NpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlbmVyZ3lfZGV0ZWN0LmVkX3BhdHRlcm5fc2l6ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuZXJneV9kZXRlY3Qud2luZG93X3NpemUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC53aW5kb3dfc2l6ZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVuZXJneV9kZXRlY3Qud2luZG93X3NpemUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmVyZ3lfZGV0ZWN0LmludmVyc2lvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmludmVyc2lvbiA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZW5lcmd5X2RldGVjdC5pbnZlcnNpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmVyZ3lfZGV0ZWN0Lm5vX2VkX3RocmVzaG9sZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm5vX2VkX3RocmVzaG9sZCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVuZXJneV9kZXRlY3Qubm9fZWRfdGhyZXNob2xkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGVuZXJneV9kZXRlY3QsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfdHJ4X2VuZXJneV9kZXRlY3QgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfRU5FUkdZX0RFVEVDVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBlbmVyZ3lfZGV0ZWN0LCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImVuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcmVzeW5jX2NvbnRyb2wgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4uc3RhcnRfcGF0dGVybiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnN0YXJ0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuLnN0YXJ0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuLm1pZGRsZV9wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWlkZGxlX3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuLm1pZGRsZV9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZW5kX29mX2J1cnN0X2RhdGFfcGF0dGVybi5sYXN0X3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sYXN0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuLmxhc3RfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4ubWlkZGxlX3JlcGV0aXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5taWRkbGVfcmVwZXRpdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4ubWlkZGxlX3JlcGV0aXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuLmxvY2F0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9jYXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuLmxvY2F0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGVuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcmVzeW5jX2NvbnRyb2wgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfRU5EX09GX0JVUlNUX0RBVEFfUEFUVEVSTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBlbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcmVzeW5jX2NvbnRyb2wgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4uc3RhcnRfcGF0dGVybiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnN0YXJ0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuLnN0YXJ0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuLm1pZGRsZV9wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWlkZGxlX3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuLm1pZGRsZV9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZW5kX29mX2J1cnN0X3JhbmdpbmdfcGF0dGVybi5sYXN0X3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sYXN0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuLmxhc3RfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4ubWlkZGxlX3JlcGV0aXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5taWRkbGVfcmVwZXRpdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4ubWlkZGxlX3JlcGV0aXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuLmxvY2F0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9jYXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJlbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuLmxvY2F0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcmVzeW5jX2NvbnRyb2wgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfRU5EX09GX0JVUlNUX1JBTkdJTkdfUEFUVEVSTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBlbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInByZWFtYmxlLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3RyeF9wcmVhbWJsZSB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJlYW1ibGUudHlwZV8xX3NpemUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50eXBlXzFfc2l6ZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByZWFtYmxlLnR5cGVfMV9zaXplIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJlYW1ibGUudHlwZV8yX3NpemUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50eXBlXzJfc2l6ZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByZWFtYmxlLnR5cGVfMl9zaXplIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJlYW1ibGUudHlwZV8zX3ByZV9yYW5naW5nX3NpemUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50eXBlXzNfcHJlX3Jhbmdpbmdfc2l6ZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByZWFtYmxlLnR5cGVfM19wcmVfcmFuZ2luZ19zaXplIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJlYW1ibGUudHlwZV8zX3Bvc3RfcmFuZ2luZ19zaXplIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudHlwZV8zX3Bvc3RfcmFuZ2luZ19zaXplID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJlYW1ibGUudHlwZV8zX3Bvc3RfcmFuZ2luZ19zaXplIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJlYW1ibGUudHlwZV8zX3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50eXBlXzNfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByZWFtYmxlLnR5cGVfM19wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIHByZWFtYmxlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3RyeF9wcmVhbWJsZSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9QUkVBTUJMRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBwcmVhbWJsZSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJkZWxpbWl0ZXIuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdHJ4X2RlbGltaXRlciB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVsaW1pdGVyLnBhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSAzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgZGVsaW1pdGVyLnBhdHRlcm4gbXVzdCBoYXZlIDMgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC5wYXR0ZXJuLCAzKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJkZWxpbWl0ZXIucGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlbGltaXRlci5zaXplIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc2l6ZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImRlbGltaXRlci5zaXplIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVsaW1pdGVyLndpbmRvd19zaXplIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwud2luZG93X3NpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJkZWxpbWl0ZXIud2luZG93X3NpemUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgZGVsaW1pdGVyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3RyeF9kZWxpbWl0ZXIgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfREVMSU1JVEVSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGRlbGltaXRlciwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImd1YXJkX2JpdHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGd1YXJkX2JpdHMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGd1YXJkX2JpdHMsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0dVQVJEX0JJVFMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAic2VyZGVzX2NvbmZpZ3VyYXRpb24uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc2VyZGVzX2NvbmZpZ3VyYXRpb24gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNlcmRlc19jb25maWd1cmF0aW9uLnJhbmdpbmdfbW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJhbmdpbmdfbW9kZSA9IChiY21vbHRfc2VyZGVzX3JhbmdpbmdfbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNlcmRlc19jb25maWd1cmF0aW9uLnJhbmdpbmdfbW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNlcmRlc19jb25maWd1cmF0aW9uLm11bHRpX2VkX21vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tdWx0aV9lZF9tb2RlID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzZXJkZXNfY29uZmlndXJhdGlvbi5tdWx0aV9lZF9tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2VyZGVzX2NvbmZpZ3VyYXRpb24uYnVyc3RfZW5hYmxlX3N0YXJ0X29mZnNldCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmJ1cnN0X2VuYWJsZV9zdGFydF9vZmZzZXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzZXJkZXNfY29uZmlndXJhdGlvbi5idXJzdF9lbmFibGVfc3RhcnRfb2Zmc2V0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2VyZGVzX2NvbmZpZ3VyYXRpb24uYnVyc3RfZW5hYmxlX2VuZF9vZmZzZXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5idXJzdF9lbmFibGVfZW5kX29mZnNldCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNlcmRlc19jb25maWd1cmF0aW9uLmJ1cnN0X2VuYWJsZV9lbmRfb2Zmc2V0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2VyZGVzX2NvbmZpZ3VyYXRpb24uZWRfaW52ZXJ0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZWRfaW52ZXJ0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzZXJkZXNfY29uZmlndXJhdGlvbi5lZF9pbnZlcnRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgc2VyZGVzX2NvbmZpZ3VyYXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfc2VyZGVzX2NvbmZpZ3VyYXRpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfU0VSREVTX0NPTkZJR1VSQVRJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgc2VyZGVzX2NvbmZpZ3VyYXRpb24sIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicnNzaV9ub3JtYWxfY29uZmlnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb24gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJzc2lfbm9ybWFsX2NvbmZpZy5sb2NhdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvY2F0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicnNzaV9ub3JtYWxfY29uZmlnLmxvY2F0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnNzaV9ub3JtYWxfY29uZmlnLmxvY2F0aW9uX3NpZ24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb2NhdGlvbl9zaWduID0gKGJjbW9sdF9yc3NpX2xvY2F0aW9uX3NpZ24pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyc3NpX25vcm1hbF9jb25maWcubG9jYXRpb25fc2lnbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJzc2lfbm9ybWFsX2NvbmZpZy5zdGFydF9wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc3RhcnRfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJzc2lfbm9ybWFsX2NvbmZpZy5zdGFydF9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnNzaV9ub3JtYWxfY29uZmlnLm1pZGRsZV9wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWlkZGxlX3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyc3NpX25vcm1hbF9jb25maWcubWlkZGxlX3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyc3NpX25vcm1hbF9jb25maWcubGFzdF9wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubGFzdF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicnNzaV9ub3JtYWxfY29uZmlnLmxhc3RfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJzc2lfbm9ybWFsX2NvbmZpZy5taWRkbGVfcmVwZXJ0aXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5taWRkbGVfcmVwZXJ0aXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyc3NpX25vcm1hbF9jb25maWcubWlkZGxlX3JlcGVydGl0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnNzaV9ub3JtYWxfY29uZmlnLm1pbmltdW1fYnVyc3QiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5taW5pbXVtX2J1cnN0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicnNzaV9ub3JtYWxfY29uZmlnLm1pbmltdW1fYnVyc3QgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgcnNzaV9ub3JtYWxfY29uZmlnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUlNTSV9OT1JNQUxfQ09ORklHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIHJzc2lfbm9ybWFsX2NvbmZpZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJyYW5naW5nX3Jzc2lfcmVzeW5jX2NvbnRyb2wuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcmFuZ2luZ19yc3NpX2NvbnRyb2wgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfcnNzaV9yZXN5bmNfY29udHJvbC5hZnRlcl9ub19lZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFmdGVyX25vX2VkID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyYW5naW5nX3Jzc2lfcmVzeW5jX2NvbnRyb2wuYWZ0ZXJfbm9fZWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX3Jzc2lfcmVzeW5jX2NvbnRyb2wuYWZ0ZXJfZWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZnRlcl9lZCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicmFuZ2luZ19yc3NpX3Jlc3luY19jb250cm9sLmFmdGVyX2VkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ19yc3NpX3Jlc3luY19jb250cm9sLmFmdGVyX3Jlc2V0XzMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZnRlcl9yZXNldF8zID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyYW5naW5nX3Jzc2lfcmVzeW5jX2NvbnRyb2wuYWZ0ZXJfcmVzZXRfMyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCByYW5naW5nX3Jzc2lfcmVzeW5jX2NvbnRyb2wsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcmFuZ2luZ19yc3NpX2NvbnRyb2wgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUkFOR0lOR19SU1NJX1JFU1lOQ19DT05UUk9MLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIHJhbmdpbmdfcnNzaV9yZXN5bmNfY29udHJvbCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ncG9uX3RyeF9jZmdfY2xlYXIoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2dwb25fdHJ4X2NmZyBjZmc7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fdHJ4X2tleSBrZXkgPSB7IH07ICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl90cnhfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX3RyeF9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19jbGVhciIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfZ3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9HUE9OX1RSWF9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fdHJ4LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX3RyeCwga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2dwb25fdHJ4X2NmZ19nZXRfbXVsdGkoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZ3Bvbl90cnhfY2ZnIGNmZzsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfZ3Bvbl90cnhfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbXNnX3NldCAqbXNnX3NldCA9IE5VTEw7IC8qKjwgZGVjbGFyZSBtZXNzYWdlIHNldCAqLworICAgIHVpbnQzMl90IG1heF9tc2dzOyAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgIC8qKjwgZGVjbGFyZSBmaWx0ZXIgaW52ZXJ0IGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ncG9uX3RyeF9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fdHJ4X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXQqIG1zZ19zZXQgPSBOVUxMO1xuIik7CisgICAgYmNtY2xpX2xvZygidWludDMyX3QgbWF4X21zZ3M7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGludmVydF9maWx0ZXI7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0X211bHRpIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9ncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0dQT05fVFJYX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBtYXggbnVtYmVyIG9mIG1zZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhfbXNncyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgbWF4X21zZ3MgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1heF9tc2dzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coIm1heF9tc2dzID0gJWQ7XG4iLCBtYXhfbXNncyk7CisKKyAgICAvKiBzZXQgZmlsdGVyIGludmVydCBmbGFnIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyX2ludmVydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW52ZXJ0X2ZpbHRlciA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXJfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImludmVydF9maWx0ZXIgPSAlcztcbiIsIChpbnZlcnRfZmlsdGVyKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogYWxsb2NhdGUgbWVzc2FnZSBzZXQgKi8KKyAgICBlcnIgPSBhcGljbGlfbXNnX3NldF9hbGxvYyhieXRlX3Bvb2wsIEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXRfYWxsb2MoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl90cngsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fdHJ4LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci50cmFuc2NlaXZlcl90eXBlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdHJ4X3R5cGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3RyeF90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIHRyYW5zY2VpdmVyX3R5cGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIHRyYW5zY2VpdmVyX3R5cGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1RSQU5TQ0VJVkVSX1RZUEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0cmFuc2NlaXZlcl90eXBlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIHRyYW5zY2VpdmVyX3R5cGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIHRyYW5zY2VpdmVyX3R5cGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIubGFfY29uZmlndXJhdGlvbi4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9sYV9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmxhX2NvbmZpZ3VyYXRpb24ucmVzeW5jX2NvbnRyb2wuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5sYV9jb25maWd1cmF0aW9uLnJlc3luY19jb250cm9sLnN0YXJ0X3BhdHRlcm4iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yZXN5bmNfY29udHJvbC5zdGFydF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5sYV9jb25maWd1cmF0aW9uLnJlc3luY19jb250cm9sLnN0YXJ0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubGFfY29uZmlndXJhdGlvbi5yZXN5bmNfY29udHJvbC5taWRkbGVfcGF0dGVybiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnJlc3luY19jb250cm9sLm1pZGRsZV9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5sYV9jb25maWd1cmF0aW9uLnJlc3luY19jb250cm9sLm1pZGRsZV9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxhX2NvbmZpZ3VyYXRpb24ucmVzeW5jX2NvbnRyb2wubGFzdF9wYXR0ZXJuIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucmVzeW5jX2NvbnRyb2wubGFzdF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5sYV9jb25maWd1cmF0aW9uLnJlc3luY19jb250cm9sLmxhc3RfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5sYV9jb25maWd1cmF0aW9uLnJlc3luY19jb250cm9sLm1pZGRsZV9yZXBldGl0aW9uIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucmVzeW5jX2NvbnRyb2wubWlkZGxlX3JlcGV0aXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmxhX2NvbmZpZ3VyYXRpb24ucmVzeW5jX2NvbnRyb2wubWlkZGxlX3JlcGV0aXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubGFfY29uZmlndXJhdGlvbi5yZXN5bmNfY29udHJvbC5sb2NhdGlvbiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnJlc3luY19jb250cm9sLmxvY2F0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5sYV9jb25maWd1cmF0aW9uLnJlc3luY19jb250cm9sLmxvY2F0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmxhX2NvbmZpZ3VyYXRpb24ucmVzeW5jX2NvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmxhX2NvbmZpZ3VyYXRpb24ucmFuZ2luZ19yZXN5bmNfY29udHJvbC4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxhX2NvbmZpZ3VyYXRpb24ucmFuZ2luZ19yZXN5bmNfY29udHJvbC5zdGFydF9wYXR0ZXJuIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucmFuZ2luZ19yZXN5bmNfY29udHJvbC5zdGFydF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5sYV9jb25maWd1cmF0aW9uLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wuc3RhcnRfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5sYV9jb25maWd1cmF0aW9uLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubWlkZGxlX3BhdHRlcm4iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yYW5naW5nX3Jlc3luY19jb250cm9sLm1pZGRsZV9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5sYV9jb25maWd1cmF0aW9uLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubWlkZGxlX3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubGFfY29uZmlndXJhdGlvbi5yYW5naW5nX3Jlc3luY19jb250cm9sLmxhc3RfcGF0dGVybiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubGFzdF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5sYV9jb25maWd1cmF0aW9uLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubGFzdF9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxhX2NvbmZpZ3VyYXRpb24ucmFuZ2luZ19yZXN5bmNfY29udHJvbC5taWRkbGVfcmVwZXRpdGlvbiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubWlkZGxlX3JlcGV0aXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmxhX2NvbmZpZ3VyYXRpb24ucmFuZ2luZ19yZXN5bmNfY29udHJvbC5taWRkbGVfcmVwZXRpdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5sYV9jb25maWd1cmF0aW9uLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubG9jYXRpb24iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yYW5naW5nX3Jlc3luY19jb250cm9sLmxvY2F0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5sYV9jb25maWd1cmF0aW9uLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubG9jYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubGFfY29uZmlndXJhdGlvbi5yYW5naW5nX3Jlc3luY19jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGxhX2NvbmZpZ3VyYXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfbGFfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9DT05GSUdVUkFUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGxhX2NvbmZpZ3VyYXRpb24sIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsYV9jb25maWd1cmF0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIGxhX2NvbmZpZ3VyYXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIGxhX2NvbmZpZ3VyYXRpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuYmNkci4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9iY2RyX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb24gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuYmNkci5yZXN5bmNfY29udHJvbC4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmJjZHIucmVzeW5jX2NvbnRyb2wuc3RhcnRfcGF0dGVybiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnJlc3luY19jb250cm9sLnN0YXJ0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJjZHIucmVzeW5jX2NvbnRyb2wuc3RhcnRfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5iY2RyLnJlc3luY19jb250cm9sLm1pZGRsZV9wYXR0ZXJuIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucmVzeW5jX2NvbnRyb2wubWlkZGxlX3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJjZHIucmVzeW5jX2NvbnRyb2wubWlkZGxlX3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYmNkci5yZXN5bmNfY29udHJvbC5sYXN0X3BhdHRlcm4iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yZXN5bmNfY29udHJvbC5sYXN0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJjZHIucmVzeW5jX2NvbnRyb2wubGFzdF9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmJjZHIucmVzeW5jX2NvbnRyb2wubWlkZGxlX3JlcGV0aXRpb24iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yZXN5bmNfY29udHJvbC5taWRkbGVfcmVwZXRpdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYmNkci5yZXN5bmNfY29udHJvbC5taWRkbGVfcmVwZXRpdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5iY2RyLnJlc3luY19jb250cm9sLmxvY2F0aW9uIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucmVzeW5jX2NvbnRyb2wubG9jYXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJjZHIucmVzeW5jX2NvbnRyb2wubG9jYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYmNkci5yZXN5bmNfY29udHJvbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuYmNkci5yYW5naW5nX3Jlc3luY19jb250cm9sLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYmNkci5yYW5naW5nX3Jlc3luY19jb250cm9sLnN0YXJ0X3BhdHRlcm4iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5yYW5naW5nX3Jlc3luY19jb250cm9sLnN0YXJ0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJjZHIucmFuZ2luZ19yZXN5bmNfY29udHJvbC5zdGFydF9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmJjZHIucmFuZ2luZ19yZXN5bmNfY29udHJvbC5taWRkbGVfcGF0dGVybiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubWlkZGxlX3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJjZHIucmFuZ2luZ19yZXN5bmNfY29udHJvbC5taWRkbGVfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5iY2RyLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubGFzdF9wYXR0ZXJuIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucmFuZ2luZ19yZXN5bmNfY29udHJvbC5sYXN0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJjZHIucmFuZ2luZ19yZXN5bmNfY29udHJvbC5sYXN0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYmNkci5yYW5naW5nX3Jlc3luY19jb250cm9sLm1pZGRsZV9yZXBldGl0aW9uIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwucmFuZ2luZ19yZXN5bmNfY29udHJvbC5taWRkbGVfcmVwZXRpdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYmNkci5yYW5naW5nX3Jlc3luY19jb250cm9sLm1pZGRsZV9yZXBldGl0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmJjZHIucmFuZ2luZ19yZXN5bmNfY29udHJvbC5sb2NhdGlvbiIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wubG9jYXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJjZHIucmFuZ2luZ19yZXN5bmNfY29udHJvbC5sb2NhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5iY2RyLnJhbmdpbmdfcmVzeW5jX2NvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgYmNkciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9iY2RyX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBiY2RyLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmNkciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBiY2RyKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBiY2RyKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmxhX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Jlc3luY19jb250cm9sIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMuc3RhcnRfcGF0dGVybiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnN0YXJ0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMuc3RhcnRfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5sYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5taWRkbGVfcGF0dGVybiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1pZGRsZV9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmxhX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLm1pZGRsZV9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxhX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLmxhc3RfcGF0dGVybiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxhc3RfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5sYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5sYXN0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMubWlkZGxlX3JlcGV0aXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5taWRkbGVfcmVwZXRpdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5sYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5taWRkbGVfcmVwZXRpdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5sYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5sb2NhdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvY2F0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmxhX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLmxvY2F0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGxhX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Jlc3luY19jb250cm9sIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX1JBTkdJTkdfQUZURVJfTk9fRURfUkVTWU5DLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGxhX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX3RyeCwgbGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIGxhX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmJjZHJfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcmVzeW5jX2NvbnRyb2wgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5iY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLnN0YXJ0X3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zdGFydF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJjZHJfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMuc3RhcnRfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5iY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLm1pZGRsZV9wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWlkZGxlX3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5taWRkbGVfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5iY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLmxhc3RfcGF0dGVybiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxhc3RfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5iY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLmxhc3RfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5iY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLm1pZGRsZV9yZXBldGl0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWlkZGxlX3JlcGV0aXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5taWRkbGVfcmVwZXRpdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5iY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLmxvY2F0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9jYXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYy5sb2NhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBiY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Jlc3luY19jb250cm9sIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0JDRFJfUkFOR0lOR19BRlRFUl9OT19FRF9SRVNZTkMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJjZHJfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX3RyeCwgYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX3RyeCwgYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5sYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9yZXN5bmNfY29udHJvbCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLnN0YXJ0X3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zdGFydF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmxhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLnN0YXJ0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMubWlkZGxlX3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5taWRkbGVfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5sYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYy5taWRkbGVfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5sYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYy5sYXN0X3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sYXN0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMubGFzdF9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLm1pZGRsZV9yZXBldGl0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWlkZGxlX3JlcGV0aXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMubWlkZGxlX3JlcGV0aXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMubG9jYXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb2NhdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5sYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYy5sb2NhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBsYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9yZXN5bmNfY29udHJvbCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9SQU5HSU5HX0FGVEVSX0VEX1JFU1lOQywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBsYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIGxhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBsYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5iY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Jlc3luY19jb250cm9sIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYmNkcl9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYy5zdGFydF9wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc3RhcnRfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5iY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jLnN0YXJ0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYmNkcl9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYy5taWRkbGVfcGF0dGVybiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1pZGRsZV9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJjZHJfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMubWlkZGxlX3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYmNkcl9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYy5sYXN0X3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sYXN0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYmNkcl9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYy5sYXN0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYmNkcl9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYy5taWRkbGVfcmVwZXRpdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1pZGRsZV9yZXBldGl0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJjZHJfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMubWlkZGxlX3JlcGV0aXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYmNkcl9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYy5sb2NhdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvY2F0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJjZHJfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMubG9jYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgYmNkcl9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9yZXN5bmNfY29udHJvbCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9CQ0RSX1JBTkdJTkdfQUZURVJfRURfUkVTWU5DLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGJjZHJfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIGJjZHJfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIGJjZHJfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5sYV9yZXN5bmNfcG9sYXJpdHkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wb2xhcml0eSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfcG9sYXJpdHkpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgbGFfcmVzeW5jX3BvbGFyaXR5LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBsYV9yZXN5bmNfcG9sYXJpdHksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX1JFU1lOQ19QT0xBUklUWSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhX3Jlc3luY19wb2xhcml0eSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBsYV9yZXN5bmNfcG9sYXJpdHkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIGxhX3Jlc3luY19wb2xhcml0eSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmJjZHJfcmVzeW5jX3BvbGFyaXR5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcG9sYXJpdHkgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3BvbGFyaXR5KSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGJjZHJfcmVzeW5jX3BvbGFyaXR5LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBiY2RyX3Jlc3luY19wb2xhcml0eSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUl9SRVNZTkNfUE9MQVJJVFksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiY2RyX3Jlc3luY19wb2xhcml0eSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBiY2RyX3Jlc3luY19wb2xhcml0eSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX3RyeCwgYmNkcl9yZXN5bmNfcG9sYXJpdHkpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuYmNkcl9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5iY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfaW5pdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFmdGVyX2luaXQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5iY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfaW5pdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5iY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfbm9fZWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZnRlcl9ub19lZCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5hZnRlcl9ub19lZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5iY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfZWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZnRlcl9lZCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5hZnRlcl9lZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5iY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfbm9fZGVsIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWZ0ZXJfbm9fZGVsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYmNkcl9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX25vX2RlbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5iY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfcmFuZ2luZ19hY2Nlc3MiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZnRlcl9yYW5naW5nX2FjY2VzcyA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5hZnRlcl9yYW5naW5nX2FjY2VzcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5iY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMubWVkX3ZhbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1lZF92YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYmNkcl9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLm1lZF92YWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgYmNkcl9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUl9SQU5HSU5HX1JFU1lOQ19DT05ESVRJT05TLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBiY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIGJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5sYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5sYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX2luaXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZnRlcl9pbml0ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5hZnRlcl9pbml0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfbm9fZWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZnRlcl9ub19lZCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfbm9fZWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5hZnRlcl9lZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFmdGVyX2VkID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5hZnRlcl9lZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5sYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLmFmdGVyX25vX2RlbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFmdGVyX25vX2RlbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfbm9fZGVsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfcmFuZ2luZ19hY2Nlc3MiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZnRlcl9yYW5naW5nX2FjY2VzcyA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMuYWZ0ZXJfcmFuZ2luZ19hY2Nlc3MgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucy5tZWRfdmFsIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWVkX3ZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5sYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLm1lZF92YWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgbGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX1JBTkdJTkdfUkVTWU5DX0NPTkRJVElPTlMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgbGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX3RyeCwgbGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX3RyeCwgbGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5yeF9jb25maWd1cmF0aW9uLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3RyeF9yeF9jb25maWd1cmF0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnhfY29uZmlndXJhdGlvbi53YWl0X3dpbmRvd19zaXplIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwud2FpdF93aW5kb3dfc2l6ZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yeF9jb25maWd1cmF0aW9uLndhaXRfd2luZG93X3NpemUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnhfY29uZmlndXJhdGlvbi5yYW5naW5nX2FjY2Vzc193aW5kb3dfc2l6ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJhbmdpbmdfYWNjZXNzX3dpbmRvd19zaXplID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJ4X2NvbmZpZ3VyYXRpb24ucmFuZ2luZ19hY2Nlc3Nfd2luZG93X3NpemUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgcnhfY29uZmlndXJhdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF90cnhfcnhfY29uZmlndXJhdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9SWF9DT05GSUdVUkFUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIHJ4X2NvbmZpZ3VyYXRpb24sIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9jb25maWd1cmF0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIHJ4X2NvbmZpZ3VyYXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIHJ4X2NvbmZpZ3VyYXRpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucmFuZ2luZ19jb250cm9sX3N0YWdlc19jb25maWd1cmF0aW9uLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3JhbmdpbmdfY29udHJvbF9jb25maWd1cmF0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucmFuZ2luZ19jb250cm9sX3N0YWdlc19jb25maWd1cmF0aW9uLndhaXRfc3RhdGVfMV93aW5kb3dfc2l6ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLndhaXRfc3RhdGVfMV93aW5kb3dfc2l6ZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yYW5naW5nX2NvbnRyb2xfc3RhZ2VzX2NvbmZpZ3VyYXRpb24ud2FpdF9zdGF0ZV8xX3dpbmRvd19zaXplIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJhbmdpbmdfY29udHJvbF9zdGFnZXNfY29uZmlndXJhdGlvbi53YWl0X3N0YXRlXzJfd2luZG93X3NpemUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC53YWl0X3N0YXRlXzJfd2luZG93X3NpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucmFuZ2luZ19jb250cm9sX3N0YWdlc19jb25maWd1cmF0aW9uLndhaXRfc3RhdGVfMl93aW5kb3dfc2l6ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yYW5naW5nX2NvbnRyb2xfc3RhZ2VzX2NvbmZpZ3VyYXRpb24ud2FpdF9hZnRlcl9yZXN5bmNfNCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLndhaXRfYWZ0ZXJfcmVzeW5jXzQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yYW5naW5nX2NvbnRyb2xfc3RhZ2VzX2NvbmZpZ3VyYXRpb24ud2FpdF9hZnRlcl9yZXN5bmNfNCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCByYW5naW5nX2NvbnRyb2xfc3RhZ2VzX2NvbmZpZ3VyYXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcmFuZ2luZ19jb250cm9sX2NvbmZpZ3VyYXRpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUkFOR0lOR19DT05UUk9MX1NUQUdFU19DT05GSUdVUkFUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIHJhbmdpbmdfY29udHJvbF9zdGFnZXNfY29uZmlndXJhdGlvbiwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfY29udHJvbF9zdGFnZXNfY29uZmlndXJhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCByYW5naW5nX2NvbnRyb2xfc3RhZ2VzX2NvbmZpZ3VyYXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIHJhbmdpbmdfY29udHJvbF9zdGFnZXNfY29uZmlndXJhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5lbmVyZ3lfZGV0ZWN0LiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0IHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZW5lcmd5X2RldGVjdC5yYW5naW5nX2VkX3NvdXJjZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJhbmdpbmdfZWRfc291cmNlID0gKGJjbW9sdF9lbmVyZ3lfZGV0ZWN0X3NvdXJjZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lbmVyZ3lfZGV0ZWN0LnJhbmdpbmdfZWRfc291cmNlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVuZXJneV9kZXRlY3QuZGVsaW1pdGVyX2VkX3NvdXJjZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRlbGltaXRlcl9lZF9zb3VyY2UgPSAoYmNtb2x0X2VuZXJneV9kZXRlY3Rfc291cmNlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVuZXJneV9kZXRlY3QuZGVsaW1pdGVyX2VkX3NvdXJjZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lbmVyZ3lfZGV0ZWN0Lm1pbmltdW1fdGhyZXNob2xkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWluaW11bV90aHJlc2hvbGQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZW5lcmd5X2RldGVjdC5taW5pbXVtX3RocmVzaG9sZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lbmVyZ3lfZGV0ZWN0Lm1heGltdW1fdGhyZXNob2xkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWF4aW11bV90aHJlc2hvbGQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZW5lcmd5X2RldGVjdC5tYXhpbXVtX3RocmVzaG9sZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lbmVyZ3lfZGV0ZWN0LmVkX3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5lZF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVuZXJneV9kZXRlY3QuZWRfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lbmVyZ3lfZGV0ZWN0LmVkX3BhdHRlcm5fc2l6ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmVkX3BhdHRlcm5fc2l6ZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lbmVyZ3lfZGV0ZWN0LmVkX3BhdHRlcm5fc2l6ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lbmVyZ3lfZGV0ZWN0LndpbmRvd19zaXplIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwud2luZG93X3NpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZW5lcmd5X2RldGVjdC53aW5kb3dfc2l6ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lbmVyZ3lfZGV0ZWN0LmludmVyc2lvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmludmVyc2lvbiA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVuZXJneV9kZXRlY3QuaW52ZXJzaW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVuZXJneV9kZXRlY3Qubm9fZWRfdGhyZXNob2xkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubm9fZWRfdGhyZXNob2xkID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVuZXJneV9kZXRlY3Qubm9fZWRfdGhyZXNob2xkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGVuZXJneV9kZXRlY3QsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfdHJ4X2VuZXJneV9kZXRlY3QgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfRU5FUkdZX0RFVEVDVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBlbmVyZ3lfZGV0ZWN0LCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZW5lcmd5X2RldGVjdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBlbmVyZ3lfZGV0ZWN0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBlbmVyZ3lfZGV0ZWN0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmVuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcmVzeW5jX2NvbnRyb2wgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuLnN0YXJ0X3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zdGFydF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4uc3RhcnRfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuLm1pZGRsZV9wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWlkZGxlX3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZW5kX29mX2J1cnN0X2RhdGFfcGF0dGVybi5taWRkbGVfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuLmxhc3RfcGF0dGVybiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxhc3RfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuLmxhc3RfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuLm1pZGRsZV9yZXBldGl0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWlkZGxlX3JlcGV0aXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZW5kX29mX2J1cnN0X2RhdGFfcGF0dGVybi5taWRkbGVfcmVwZXRpdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuLmxvY2F0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9jYXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZW5kX29mX2J1cnN0X2RhdGFfcGF0dGVybi5sb2NhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBlbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Jlc3luY19jb250cm9sIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0VORF9PRl9CVVJTVF9EQVRBX1BBVFRFUk4sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgZW5kX29mX2J1cnN0X2RhdGFfcGF0dGVybiwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX3RyeCwgZW5kX29mX2J1cnN0X2RhdGFfcGF0dGVybik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX3RyeCwgZW5kX29mX2J1cnN0X2RhdGFfcGF0dGVybik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5lbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Jlc3luY19jb250cm9sIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZW5kX29mX2J1cnN0X3JhbmdpbmdfcGF0dGVybi5zdGFydF9wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc3RhcnRfcGF0dGVybiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5lbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuLnN0YXJ0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZW5kX29mX2J1cnN0X3JhbmdpbmdfcGF0dGVybi5taWRkbGVfcGF0dGVybiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1pZGRsZV9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4ubWlkZGxlX3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZW5kX29mX2J1cnN0X3JhbmdpbmdfcGF0dGVybi5sYXN0X3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sYXN0X3BhdHRlcm4gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZW5kX29mX2J1cnN0X3JhbmdpbmdfcGF0dGVybi5sYXN0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZW5kX29mX2J1cnN0X3JhbmdpbmdfcGF0dGVybi5taWRkbGVfcmVwZXRpdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1pZGRsZV9yZXBldGl0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4ubWlkZGxlX3JlcGV0aXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZW5kX29mX2J1cnN0X3JhbmdpbmdfcGF0dGVybi5sb2NhdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvY2F0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4ubG9jYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgZW5kX29mX2J1cnN0X3JhbmdpbmdfcGF0dGVybiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9yZXN5bmNfY29udHJvbCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9FTkRfT0ZfQlVSU1RfUkFOR0lOR19QQVRURVJOLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4sIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIGVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIGVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucHJlYW1ibGUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdHJ4X3ByZWFtYmxlIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJlYW1ibGUudHlwZV8xX3NpemUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50eXBlXzFfc2l6ZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmVhbWJsZS50eXBlXzFfc2l6ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmVhbWJsZS50eXBlXzJfc2l6ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnR5cGVfMl9zaXplID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByZWFtYmxlLnR5cGVfMl9zaXplIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByZWFtYmxlLnR5cGVfM19wcmVfcmFuZ2luZ19zaXplIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudHlwZV8zX3ByZV9yYW5naW5nX3NpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJlYW1ibGUudHlwZV8zX3ByZV9yYW5naW5nX3NpemUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJlYW1ibGUudHlwZV8zX3Bvc3RfcmFuZ2luZ19zaXplIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudHlwZV8zX3Bvc3RfcmFuZ2luZ19zaXplID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByZWFtYmxlLnR5cGVfM19wb3N0X3Jhbmdpbmdfc2l6ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmVhbWJsZS50eXBlXzNfcGF0dGVybiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnR5cGVfM19wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByZWFtYmxlLnR5cGVfM19wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIHByZWFtYmxlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3RyeF9wcmVhbWJsZSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9QUkVBTUJMRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBwcmVhbWJsZSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByZWFtYmxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIHByZWFtYmxlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBwcmVhbWJsZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5kZWxpbWl0ZXIuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdHJ4X2RlbGltaXRlciB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRlbGltaXRlci5wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gMykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIGZpbHRlci5kZWxpbWl0ZXIucGF0dGVybiBtdXN0IGhhdmUgMyBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLnBhdHRlcm4sIDMpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5kZWxpbWl0ZXIucGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kZWxpbWl0ZXIuc2l6ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnNpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZGVsaW1pdGVyLnNpemUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZGVsaW1pdGVyLndpbmRvd19zaXplIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwud2luZG93X3NpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZGVsaW1pdGVyLndpbmRvd19zaXplIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIGRlbGltaXRlciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF90cnhfZGVsaW1pdGVyIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0RFTElNSVRFUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBkZWxpbWl0ZXIsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWxpbWl0ZXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX3RyeCwgZGVsaW1pdGVyKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBkZWxpbWl0ZXIpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5ndWFyZF9iaXRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBndWFyZF9iaXRzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBndWFyZF9iaXRzLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9HVUFSRF9CSVRTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ3VhcmRfYml0cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBndWFyZF9iaXRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBndWFyZF9iaXRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnNlcmRlc19jb25maWd1cmF0aW9uLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc2VyZGVzX2NvbmZpZ3VyYXRpb24ucmFuZ2luZ19tb2RlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmFuZ2luZ19tb2RlID0gKGJjbW9sdF9zZXJkZXNfcmFuZ2luZ19tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnNlcmRlc19jb25maWd1cmF0aW9uLnJhbmdpbmdfbW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zZXJkZXNfY29uZmlndXJhdGlvbi5tdWx0aV9lZF9tb2RlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubXVsdGlfZWRfbW9kZSA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnNlcmRlc19jb25maWd1cmF0aW9uLm11bHRpX2VkX21vZGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc2VyZGVzX2NvbmZpZ3VyYXRpb24uYnVyc3RfZW5hYmxlX3N0YXJ0X29mZnNldCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmJ1cnN0X2VuYWJsZV9zdGFydF9vZmZzZXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuc2VyZGVzX2NvbmZpZ3VyYXRpb24uYnVyc3RfZW5hYmxlX3N0YXJ0X29mZnNldCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zZXJkZXNfY29uZmlndXJhdGlvbi5idXJzdF9lbmFibGVfZW5kX29mZnNldCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmJ1cnN0X2VuYWJsZV9lbmRfb2Zmc2V0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnNlcmRlc19jb25maWd1cmF0aW9uLmJ1cnN0X2VuYWJsZV9lbmRfb2Zmc2V0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnNlcmRlc19jb25maWd1cmF0aW9uLmVkX2ludmVydGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmVkX2ludmVydGlvbiA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnNlcmRlc19jb25maWd1cmF0aW9uLmVkX2ludmVydGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBzZXJkZXNfY29uZmlndXJhdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9zZXJkZXNfY29uZmlndXJhdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9TRVJERVNfQ09ORklHVVJBVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBzZXJkZXNfY29uZmlndXJhdGlvbiwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNlcmRlc19jb25maWd1cmF0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIHNlcmRlc19jb25maWd1cmF0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBzZXJkZXNfY29uZmlndXJhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnBsb19yYW5naW5nIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBwbG9fcmFuZ2luZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgcGxvX3JhbmdpbmcsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1BMT19SQU5HSU5HLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGxvX3JhbmdpbmciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX3RyeCwgcGxvX3JhbmdpbmcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIHBsb19yYW5naW5nKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucGxvX2RhdGEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIHBsb19kYXRhLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCBwbG9fZGF0YSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9HUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUExPX0RBVEEsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwbG9fZGF0YSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBwbG9fZGF0YSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX3RyeCwgcGxvX2RhdGEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucnNzaV9ub3JtYWxfY29uZmlnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb24gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yc3NpX25vcm1hbF9jb25maWcubG9jYXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb2NhdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yc3NpX25vcm1hbF9jb25maWcubG9jYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnNzaV9ub3JtYWxfY29uZmlnLmxvY2F0aW9uX3NpZ24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb2NhdGlvbl9zaWduID0gKGJjbW9sdF9yc3NpX2xvY2F0aW9uX3NpZ24pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucnNzaV9ub3JtYWxfY29uZmlnLmxvY2F0aW9uX3NpZ24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnNzaV9ub3JtYWxfY29uZmlnLnN0YXJ0X3BhdHRlcm4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zdGFydF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJzc2lfbm9ybWFsX2NvbmZpZy5zdGFydF9wYXR0ZXJuIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJzc2lfbm9ybWFsX2NvbmZpZy5taWRkbGVfcGF0dGVybiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1pZGRsZV9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJzc2lfbm9ybWFsX2NvbmZpZy5taWRkbGVfcGF0dGVybiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yc3NpX25vcm1hbF9jb25maWcubGFzdF9wYXR0ZXJuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubGFzdF9wYXR0ZXJuID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJzc2lfbm9ybWFsX2NvbmZpZy5sYXN0X3BhdHRlcm4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnNzaV9ub3JtYWxfY29uZmlnLm1pZGRsZV9yZXBlcnRpdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1pZGRsZV9yZXBlcnRpdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yc3NpX25vcm1hbF9jb25maWcubWlkZGxlX3JlcGVydGl0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJzc2lfbm9ybWFsX2NvbmZpZy5taW5pbXVtX2J1cnN0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWluaW11bV9idXJzdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yc3NpX25vcm1hbF9jb25maWcubWluaW11bV9idXJzdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fdHJ4LCByc3NpX25vcm1hbF9jb25maWcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9yc3NpX2dlbmVyYWxfY29uZmlndXJhdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9SU1NJX05PUk1BTF9DT05GSUcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgcnNzaV9ub3JtYWxfY29uZmlnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnNzaV9ub3JtYWxfY29uZmlnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIHJzc2lfbm9ybWFsX2NvbmZpZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX3RyeCwgcnNzaV9ub3JtYWxfY29uZmlnKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnJhbmdpbmdfcnNzaV9yZXN5bmNfY29udHJvbC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9yYW5naW5nX3Jzc2lfY29udHJvbCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJhbmdpbmdfcnNzaV9yZXN5bmNfY29udHJvbC5hZnRlcl9ub19lZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFmdGVyX25vX2VkID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucmFuZ2luZ19yc3NpX3Jlc3luY19jb250cm9sLmFmdGVyX25vX2VkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJhbmdpbmdfcnNzaV9yZXN5bmNfY29udHJvbC5hZnRlcl9lZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFmdGVyX2VkID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucmFuZ2luZ19yc3NpX3Jlc3luY19jb250cm9sLmFmdGVyX2VkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJhbmdpbmdfcnNzaV9yZXN5bmNfY29udHJvbC5hZnRlcl9yZXNldF8zIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWZ0ZXJfcmVzZXRfMyA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJhbmdpbmdfcnNzaV9yZXN5bmNfY29udHJvbC5hZnRlcl9yZXNldF8zIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl90cngsIHJhbmdpbmdfcnNzaV9yZXN5bmNfY29udHJvbCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9yYW5naW5nX3Jzc2lfY29udHJvbCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0dQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0dQT05fVFJYX0NGR19JRF9SQU5HSU5HX1JTU0lfUkVTWU5DX0NPTlRST0wsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgcmFuZ2luZ19yc3NpX3Jlc3luY19jb250cm9sLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ19yc3NpX3Jlc3luY19jb250cm9sIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl90cngsIHJhbmdpbmdfcnNzaV9yZXN5bmNfY29udHJvbCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBncG9uX3RyeCwgcmFuZ2luZ19yc3NpX3Jlc3luY19jb250cm9sKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX3RyeCwgdHJhbnNjZWl2ZXJfdHlwZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBsYV9jb25maWd1cmF0aW9uKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl90cngsIGJjZHIpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX3RyeCwgbGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX3RyeCwgYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBsYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBiY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl90cngsIGxhX3Jlc3luY19wb2xhcml0eSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBiY2RyX3Jlc3luY19wb2xhcml0eSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBiY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX3RyeCwgbGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fdHJ4LCByeF9jb25maWd1cmF0aW9uKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl90cngsIHJhbmdpbmdfY29udHJvbF9zdGFnZXNfY29uZmlndXJhdGlvbikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBlbmVyZ3lfZGV0ZWN0KSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgZ3Bvbl90cngsIGVuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4pICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX3RyeCwgZW5kX29mX2J1cnN0X3JhbmdpbmdfcGF0dGVybikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBwcmVhbWJsZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBkZWxpbWl0ZXIpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX3RyeCwgZ3VhcmRfYml0cykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBzZXJkZXNfY29uZmlndXJhdGlvbikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBwbG9fcmFuZ2luZykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBwbG9fZGF0YSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGdwb25fdHJ4LCByc3NpX25vcm1hbF9jb25maWcpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBncG9uX3RyeCwgcmFuZ2luZ19yc3NpX3Jlc3luY19jb250cm9sKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25fdHJ4LCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2xvZ19lbnRyeV9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9sb2dfZW50cnlfY2ZnIGNmZzsgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9sb2dfZW50cnlfa2V5IGtleSA9IHsgfTsgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2xvZ19lbnRyeV9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2xvZ19lbnRyeV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsb2dfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5sb2dfaWQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImxvZ19pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkubG9nX2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR19FTlRSWSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9MT0dfRU5UUllfS0VZX0lEX0xPR19JRCwgJmtleS5sb2dfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgIm5hbWUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm5hbWUuc3RyIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBzbnByaW50ZihrZXkubmFtZS5zdHIsIDEwMCwgIiVzIiwgY2xpX3Bhcm0tPnZhbHVlLnN0cmluZyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibmFtZS5zdHIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJuYW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5uYW1lID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR19FTlRSWSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9MT0dfRU5UUllfS0VZX0lEX05BTUUsICZrZXkubmFtZSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGxvZ19lbnRyeSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgbG9nX2VudHJ5LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlZmF1bHRfbG9nX2xldmVsIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBsb2dfZW50cnksIGRlZmF1bHRfbG9nX2xldmVsKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbG9nX2VudHJ5LCBkZWZhdWx0X2xvZ19sZXZlbCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVmYXVsdF9sb2dfdHlwZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbG9nX2VudHJ5LCBkZWZhdWx0X2xvZ190eXBlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbG9nX2VudHJ5LCBkZWZhdWx0X2xvZ190eXBlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsb2dfbGV2ZWxfcHJpbnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGxvZ19lbnRyeSwgbG9nX2xldmVsX3ByaW50KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbG9nX2VudHJ5LCBsb2dfbGV2ZWxfcHJpbnQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvZ19sZXZlbF9zYXZlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBsb2dfZW50cnksIGxvZ19sZXZlbF9zYXZlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbG9nX2VudHJ5LCBsb2dfbGV2ZWxfc2F2ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9nX3R5cGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGxvZ19lbnRyeSwgbG9nX3R5cGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBsb2dfZW50cnksIGxvZ190eXBlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsb2dfc3R5bGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGxvZ19lbnRyeSwgbG9nX3N0eWxlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbG9nX2VudHJ5LCBsb2dfc3R5bGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvZ19uYW1lIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBsb2dfZW50cnksIGxvZ19uYW1lKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbG9nX2VudHJ5LCBsb2dfbmFtZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBsb2dfZW50cnksIGRlZmF1bHRfbG9nX2xldmVsKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBsb2dfZW50cnksIGRlZmF1bHRfbG9nX3R5cGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGxvZ19lbnRyeSwgbG9nX2xldmVsX3ByaW50KSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBsb2dfZW50cnksIGxvZ19sZXZlbF9zYXZlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBsb2dfZW50cnksIGxvZ190eXBlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBsb2dfZW50cnksIGxvZ19zdHlsZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgbG9nX2VudHJ5LCBsb2dfbmFtZSkpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGxvZ19lbnRyeSwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGxvZ19lbnRyeSwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2xvZ19lbnRyeV9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9sb2dfZW50cnlfY2ZnIGNmZzsgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9sb2dfZW50cnlfa2V5IGtleSA9IHsgfTsgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2xvZ19lbnRyeV9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2xvZ19lbnRyeV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsb2dfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5sb2dfaWQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImxvZ19pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkubG9nX2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR19FTlRSWSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9MT0dfRU5UUllfS0VZX0lEX0xPR19JRCwgJmtleS5sb2dfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgIm5hbWUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm5hbWUuc3RyIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBzbnByaW50ZihrZXkubmFtZS5zdHIsIDEwMCwgIiVzIiwgY2xpX3Bhcm0tPnZhbHVlLnN0cmluZyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibmFtZS5zdHIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJuYW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5uYW1lID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR19FTlRSWSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9MT0dfRU5UUllfS0VZX0lEX05BTUUsICZrZXkubmFtZSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGxvZ19lbnRyeSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgbG9nX2VudHJ5LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvZ19sZXZlbF9wcmludCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2xvZ19sZXZlbCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfbG9nX2xldmVsKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nX2VudHJ5LCBsb2dfbGV2ZWxfcHJpbnQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nX2VudHJ5LCBsb2dfbGV2ZWxfcHJpbnQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTE9HX0VOVFJZLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfTE9HX0xFVkVMX1BSSU5ULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9nX2xldmVsX3NhdmUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9sb2dfbGV2ZWwgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2xvZ19sZXZlbCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGxvZ19lbnRyeSwgbG9nX2xldmVsX3NhdmUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nX2VudHJ5LCBsb2dfbGV2ZWxfc2F2ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dfRU5UUlksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfTEVWRUxfU0FWRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvZ190eXBlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfbG9nX3R5cGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2xvZ190eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nX2VudHJ5LCBsb2dfdHlwZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBsb2dfZW50cnksIGxvZ190eXBlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR19FTlRSWSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19UWVBFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9nX3N0eWxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfbG9nX3N0eWxlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9sb2dfc3R5bGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBsb2dfZW50cnksIGxvZ19zdHlsZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBsb2dfZW50cnksIGxvZ19zdHlsZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dfRU5UUlksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfU1RZTEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfbG9nX2VudHJ5X2NmZ19jbGVhcihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfbG9nX2VudHJ5X2NmZyBjZmc7ICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfbG9nX2VudHJ5X2tleSBrZXkgPSB7IH07IC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9sb2dfZW50cnlfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9sb2dfZW50cnlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfY2xlYXIiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsb2dfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5sb2dfaWQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImxvZ19pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkubG9nX2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR19FTlRSWSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9MT0dfRU5UUllfS0VZX0lEX0xPR19JRCwgJmtleS5sb2dfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgIm5hbWUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm5hbWUuc3RyIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBzbnByaW50ZihrZXkubmFtZS5zdHIsIDEwMCwgIiVzIiwgY2xpX3Bhcm0tPnZhbHVlLnN0cmluZyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibmFtZS5zdHIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJuYW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5uYW1lID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR19FTlRSWSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9MT0dfRU5UUllfS0VZX0lEX05BTUUsICZrZXkubmFtZSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGxvZ19lbnRyeSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgbG9nX2VudHJ5LCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfbG9nX2VudHJ5X2NmZ19nZXRfbXVsdGkoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfbG9nX2VudHJ5X2NmZyBjZmc7ICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfbG9nX2VudHJ5X2tleSBrZXkgPSB7IH07IC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbXNnX3NldCAqbXNnX3NldCA9IE5VTEw7IC8qKjwgZGVjbGFyZSBtZXNzYWdlIHNldCAqLworICAgIHVpbnQzMl90IG1heF9tc2dzOyAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgIC8qKjwgZGVjbGFyZSBmaWx0ZXIgaW52ZXJ0IGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9sb2dfZW50cnlfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9sb2dfZW50cnlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldCogbXNnX3NldCA9IE5VTEw7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50MzJfdCBtYXhfbXNncztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXRfbXVsdGkiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsb2dfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5sb2dfaWQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImxvZ19pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkubG9nX2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR19FTlRSWSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9MT0dfRU5UUllfS0VZX0lEX0xPR19JRCwgJmtleS5sb2dfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgIm5hbWUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm5hbWUuc3RyIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBzbnByaW50ZihrZXkubmFtZS5zdHIsIDEwMCwgIiVzIiwgY2xpX3Bhcm0tPnZhbHVlLnN0cmluZyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibmFtZS5zdHIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJuYW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5uYW1lID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR19FTlRSWSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9MT0dfRU5UUllfS0VZX0lEX05BTUUsICZrZXkubmFtZSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX0xPR19FTlRSWSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldF9hbGxvYyhCQ01PTFRfT0JKX0lEX0xPR19FTlRSWSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgbG9nX2VudHJ5LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBsb2dfZW50cnksIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRlZmF1bHRfbG9nX2xldmVsIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfbG9nX2xldmVsIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9sb2dfbGV2ZWwpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBsb2dfZW50cnksIGRlZmF1bHRfbG9nX2xldmVsLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGxvZ19lbnRyeSwgZGVmYXVsdF9sb2dfbGV2ZWwsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTE9HX0VOVFJZLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfREVGQVVMVF9MT0dfTEVWRUwsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWZhdWx0X2xvZ19sZXZlbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGxvZ19lbnRyeSwgZGVmYXVsdF9sb2dfbGV2ZWwpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbG9nX2VudHJ5LCBkZWZhdWx0X2xvZ19sZXZlbCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRlZmF1bHRfbG9nX3R5cGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9sb2dfdHlwZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfbG9nX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBsb2dfZW50cnksIGRlZmF1bHRfbG9nX3R5cGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nX2VudHJ5LCBkZWZhdWx0X2xvZ190eXBlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR19FTlRSWSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0RFRkFVTFRfTE9HX1RZUEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWZhdWx0X2xvZ190eXBlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbG9nX2VudHJ5LCBkZWZhdWx0X2xvZ190eXBlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGxvZ19lbnRyeSwgZGVmYXVsdF9sb2dfdHlwZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxvZ19sZXZlbF9wcmludCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2xvZ19sZXZlbCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfbG9nX2xldmVsKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nX2VudHJ5LCBsb2dfbGV2ZWxfcHJpbnQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nX2VudHJ5LCBsb2dfbGV2ZWxfcHJpbnQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTE9HX0VOVFJZLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfTE9HX0xFVkVMX1BSSU5ULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9nX2xldmVsX3ByaW50Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbG9nX2VudHJ5LCBsb2dfbGV2ZWxfcHJpbnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbG9nX2VudHJ5LCBsb2dfbGV2ZWxfcHJpbnQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5sb2dfbGV2ZWxfc2F2ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2xvZ19sZXZlbCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfbG9nX2xldmVsKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nX2VudHJ5LCBsb2dfbGV2ZWxfc2F2ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBsb2dfZW50cnksIGxvZ19sZXZlbF9zYXZlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR19FTlRSWSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19MRVZFTF9TQVZFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9nX2xldmVsX3NhdmUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBsb2dfZW50cnksIGxvZ19sZXZlbF9zYXZlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGxvZ19lbnRyeSwgbG9nX2xldmVsX3NhdmUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5sb2dfdHlwZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2xvZ190eXBlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9sb2dfdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGxvZ19lbnRyeSwgbG9nX3R5cGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nX2VudHJ5LCBsb2dfdHlwZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dfRU5UUlksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfVFlQRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvZ190eXBlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbG9nX2VudHJ5LCBsb2dfdHlwZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBsb2dfZW50cnksIGxvZ190eXBlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubG9nX3N0eWxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfbG9nX3N0eWxlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9sb2dfc3R5bGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBsb2dfZW50cnksIGxvZ19zdHlsZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBsb2dfZW50cnksIGxvZ19zdHlsZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dfRU5UUlksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfU1RZTEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsb2dfc3R5bGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBsb2dfZW50cnksIGxvZ19zdHlsZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBsb2dfZW50cnksIGxvZ19zdHlsZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5sb2dfbmFtZS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zdHJfMTAwIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubG9nX25hbWUuc3RyIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBzbnByaW50Zih2YWwuc3RyLCAxMDAsICIlcyIsIGNsaV9wYXJtLT52YWx1ZS5zdHJpbmcpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5sb2dfbmFtZS5zdHIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBsb2dfZW50cnksIGxvZ19uYW1lLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0cl8xMDAgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dfRU5UUlksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfTkFNRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGxvZ19lbnRyeSwgbG9nX25hbWUsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsb2dfbmFtZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGxvZ19lbnRyeSwgbG9nX25hbWUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbG9nX2VudHJ5LCBsb2dfbmFtZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgbG9nX2VudHJ5LCBkZWZhdWx0X2xvZ19sZXZlbCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGxvZ19lbnRyeSwgZGVmYXVsdF9sb2dfdHlwZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGxvZ19lbnRyeSwgbG9nX2xldmVsX3ByaW50KSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgbG9nX2VudHJ5LCBsb2dfbGV2ZWxfc2F2ZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGxvZ19lbnRyeSwgbG9nX3R5cGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBsb2dfZW50cnksIGxvZ19zdHlsZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGxvZ19lbnRyeSwgbG9nX25hbWUpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbG9nX2VudHJ5LCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGxvZ19lbnRyeSwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9sb2dfZW50cnlfc3RhdF9nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2xvZ19lbnRyeV9zdGF0IHN0YXQ7ICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2xvZ19lbnRyeV9rZXkga2V5ID0geyB9OyAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb3NfYm9vbCBjbGVhcl9vbl9yZWFkOyAgICAgICAvKio8IGRlY2xhcmUgJ2NsZWFyIG9uIHJlYWQnIGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9sb2dfZW50cnlfc3RhdCBzdGF0O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2xvZ19lbnRyeV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9nX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkubG9nX2lkID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJsb2dfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmxvZ19pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dfRU5UUlksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9MT0dfSUQsICZrZXkubG9nX2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJuYW1lLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJuYW1lLnN0ciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc25wcmludGYoa2V5Lm5hbWUuc3RyLCAxMDAsICIlcyIsIGNsaV9wYXJtLT52YWx1ZS5zdHJpbmcpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm5hbWUuc3RyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibmFtZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkubmFtZSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dfRU5UUlksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9OQU1FLCAma2V5Lm5hbWUpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgZmxhZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjbGVhciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY2xlYXJfb25fcmVhZCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjbGVhciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJjbGVhcl9vbl9yZWFkID0gJXM7XG4iLCAoY2xlYXJfb25fcmVhZCkgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfU1RBVF9JTklUKCZzdGF0LCBsb2dfZW50cnksIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfSU5JVCgmc3RhdCwgbG9nX2VudHJ5LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1zZ19jb3VudCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBsb2dfZW50cnksIG1zZ19jb3VudCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbG9nX2VudHJ5LCBtc2dfY291bnQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvc3RfbXNnX2NvdW50Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGxvZ19lbnRyeSwgbG9zdF9tc2dfY291bnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGxvZ19lbnRyeSwgbG9zdF9tc2dfY291bnQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBsb2dfZW50cnksIG1zZ19jb3VudCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBsb2dfZW50cnksIGxvc3RfbXNnX2NvdW50KSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBsb2dfZW50cnksIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGxvZ19lbnRyeSwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9nZXQoZGV2aWNlX2lkLCAmc3RhdC5oZHIsIGNsZWFyX29uX3JlYWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZzdGF0Lmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXQuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2xvZ19lbnRyeV9zdGF0X2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZyBzdGF0X2NmZzsgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9sb2dfZW50cnlfa2V5IGtleSA9IHsgfTsgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbG9nX2VudHJ5X3N0YXRfaWQgc3RhdF9pZDsgICAvKio8IGRlY2xhcmUgc3RhdCBJRCAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZyBzdGF0X2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9sb2dfZW50cnlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsb2dfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5sb2dfaWQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImxvZ19pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkubG9nX2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR19FTlRSWSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9MT0dfRU5UUllfS0VZX0lEX0xPR19JRCwgJmtleS5sb2dfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgIm5hbWUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm5hbWUuc3RyIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBzbnByaW50ZihrZXkubmFtZS5zdHIsIDEwMCwgIiVzIiwgY2xpX3Bhcm0tPnZhbHVlLnN0cmluZyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibmFtZS5zdHIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJuYW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5uYW1lID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR19FTlRSWSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9MT0dfRU5UUllfS0VZX0lEX05BTUUsICZrZXkubmFtZSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBJRCBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc3RhdF9pZCA9IChiY21vbHRfbG9nX2VudHJ5X3N0YXRfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBzd2l0Y2ggKHN0YXRfaWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9MT0dfRU5UUllfU1RBVF9JRF9NU0dfQ09VTlQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGxvZ19lbnRyeSwgbXNnX2NvdW50LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBsb2dfZW50cnksIG1zZ19jb3VudCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0xPR19FTlRSWV9TVEFUX0lEX0xPU1RfTVNHX0NPVU5UOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBsb2dfZW50cnksIGxvc3RfbXNnX2NvdW50LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBsb2dfZW50cnksIGxvc3RfbXNnX2NvdW50LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXRfY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9sb2dfZW50cnlfc3RhdF9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmcgc3RhdF9jZmc7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfbG9nX2VudHJ5X2tleSBrZXkgPSB7IH07ICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2lkIHN0YXRfaWQ7ICAgLyoqPCBkZWNsYXJlIHN0YXQgSUQgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbG9nX2VudHJ5X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9nX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkubG9nX2lkID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJsb2dfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmxvZ19pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dfRU5UUlksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9MT0dfSUQsICZrZXkubG9nX2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJuYW1lLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJuYW1lLnN0ciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc25wcmludGYoa2V5Lm5hbWUuc3RyLCAxMDAsICIlcyIsIGNsaV9wYXJtLT52YWx1ZS5zdHJpbmcpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm5hbWUuc3RyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibmFtZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkubmFtZSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dfRU5UUlksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9OQU1FLCAma2V5Lm5hbWUpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgc3dpdGNoIChzdGF0X2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfSURfTVNHX0NPVU5UOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBsb2dfZW50cnksIG1zZ19jb3VudCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbG9nX2VudHJ5LCBtc2dfY291bnQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9MT0dfRU5UUllfU1RBVF9JRF9MT1NUX01TR19DT1VOVDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbG9nX2VudHJ5LCBsb3N0X21zZ19jb3VudCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbG9nX2VudHJ5LCBsb3N0X21zZ19jb3VudCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjZmcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc3RhdF9hbGFybV9jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjZmcudHJpZ2dlci4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIudHlwZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudHlwZSA9IChiY21vbHRfc3RhdF9jb25kaXRpb25fdHlwZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci50eXBlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAodmFsLnRyaWdnZXIudHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfVEhSRVNIT0xEOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnJpc2luZyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3RocmVzaG9sZC5yaXNpbmcgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnJpc2luZyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmZhbGxpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV90aHJlc2hvbGQuZmFsbGluZyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIuZmFsbGluZyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1JBTkdFOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnVwcGVyIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfcmFuZ2UudXBwZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnVwcGVyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIubG93ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV9yYW5nZS5sb3dlciA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIubG93ZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfVkFMVUVfVEhSRVNIT0xEOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmxpbWl0Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnZhbHVlX3RocmVzaG9sZC5saW1pdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIubGltaXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfTk9ORToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjZmcuc29hay4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnNvYWsuYWN0aXZlX3NvYWtfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hay5hY3RpdmVfc29ha190aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnNvYWsuY2xlYXJfc29ha190aW1lIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuc29hay5jbGVhcl9zb2FrX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsuY2xlYXJfc29ha190aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX1BST1BfU0VUKCZzdGF0X2NmZywgbG9nX2VudHJ5LCBjZmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9hbGFybV9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dfRU5UUlksIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkcsIDAsIEJDTU9MVF9MT0dfRU5UUllfU1RBVF9DRkdfSURfQ0ZHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19QUk9QX1NFVCgmc3RhdF9jZmcsIGxvZ19lbnRyeSwgY2ZnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9sb2dfZW50cnlfYXV0b19jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmcgYXV0b19jZmc7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfbG9nX2VudHJ5X2tleSBrZXkgPSB7IH07ICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2xvZ19lbnRyeV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX2dldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgbG9nX2VudHJ5LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgbG9nX2VudHJ5LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fY2xlYXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGxvZ19lbnRyeSwgc3RhdF9hbGFybV9jbGVhcmVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGxvZ19lbnRyeSwgc3RhdF9hbGFybV9jbGVhcmVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGxvZ19lbnRyeSwgc3RhdF9hbGFybV9yYWlzZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgbG9nX2VudHJ5LCBzdGF0X2FsYXJtX3JhaXNlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgbG9nX2VudHJ5LCBzdGF0X2FsYXJtX2NsZWFyZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBsb2dfZW50cnksIHN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGxvZ19lbnRyeSwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBsb2dfZW50cnksIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmF1dG9fY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9sb2dfZW50cnlfYXV0b19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmcgYXV0b19jZmc7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfbG9nX2VudHJ5X2tleSBrZXkgPSB7IH07ICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2xvZ19lbnRyeV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX3NldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgbG9nX2VudHJ5LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgbG9nX2VudHJ5LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fY2xlYXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIGxvZ19lbnRyeSwgc3RhdF9hbGFybV9jbGVhcmVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBsb2dfZW50cnksIHN0YXRfYWxhcm1fY2xlYXJlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dfRU5UUlksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9MT0dfRU5UUllfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9yYWlzZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBsb2dfZW50cnksIHN0YXRfYWxhcm1fcmFpc2VkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBsb2dfZW50cnksIHN0YXRfYWxhcm1fcmFpc2VkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR19FTlRSWSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX0xPR19FTlRSWV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfbG9nZ2VyX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2xvZ2dlcl9jZmcgY2ZnOyAgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2xvZ2dlcl9rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbG9nZ2VyX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbG9nZ2VyX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbGVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5maWxlX2lkID0gKGJjbW9sdF9sb2dfZmlsZV9pZCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsZV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZmlsZV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dHRVIsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfTE9HR0VSX0tFWV9JRF9GSUxFX0lELCAma2V5LmZpbGVfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBsb2dnZXIsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGxvZ2dlciwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJidWZmZXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGxvZ2dlciwgYnVmZmVyKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbG9nZ2VyLCBidWZmZXIpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIndyYXBfYXJvdW5kIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBsb2dnZXIsIHdyYXBfYXJvdW5kKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbG9nZ2VyLCB3cmFwX2Fyb3VuZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2xlYXJfYWZ0ZXJfcmVhZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbG9nZ2VyLCBjbGVhcl9hZnRlcl9yZWFkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbG9nZ2VyLCBjbGVhcl9hZnRlcl9yZWFkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmFibGVfbG9nIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBsb2dnZXIsIGVuYWJsZV9sb2cpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBsb2dnZXIsIGVuYWJsZV9sb2cpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvZ19uYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbG9nZ2VyLCBsb2dfbmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBsb2dnZXIsIGxvZ19uYW1lcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBsb2dnZXIsIGJ1ZmZlcikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgbG9nZ2VyLCB3cmFwX2Fyb3VuZCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgbG9nZ2VyLCBjbGVhcl9hZnRlcl9yZWFkKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBsb2dnZXIsIGVuYWJsZV9sb2cpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIGxvZ2dlciwgbG9nX25hbWVzKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbG9nZ2VyLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbG9nZ2VyLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfbG9nZ2VyX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2xvZ2dlcl9jZmcgY2ZnOyAgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2xvZ2dlcl9rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbG9nZ2VyX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbG9nZ2VyX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbGVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5maWxlX2lkID0gKGJjbW9sdF9sb2dfZmlsZV9pZCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsZV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZmlsZV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dHRVIsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfTE9HR0VSX0tFWV9JRF9GSUxFX0lELCAma2V5LmZpbGVfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBsb2dnZXIsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGxvZ2dlciwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ3cmFwX2Fyb3VuZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nZ2VyLCB3cmFwX2Fyb3VuZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBsb2dnZXIsIHdyYXBfYXJvdW5kLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR0dFUiwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX1dSQVBfQVJPVU5ELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2xlYXJfYWZ0ZXJfcmVhZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nZ2VyLCBjbGVhcl9hZnRlcl9yZWFkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGxvZ2dlciwgY2xlYXJfYWZ0ZXJfcmVhZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dHRVIsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTE9HR0VSX0NGR19JRF9DTEVBUl9BRlRFUl9SRUFELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZW5hYmxlX2xvZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nZ2VyLCBlbmFibGVfbG9nLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGxvZ2dlciwgZW5hYmxlX2xvZywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dHRVIsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTE9HR0VSX0NGR19JRF9FTkFCTEVfTE9HLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2xvZ2dlcl9jZmdfY2xlYXIoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2xvZ2dlcl9jZmcgY2ZnOyAgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2xvZ2dlcl9rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbG9nZ2VyX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbG9nZ2VyX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2NsZWFyIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsZV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmZpbGVfaWQgPSAoYmNtb2x0X2xvZ19maWxlX2lkKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWxlX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5maWxlX2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR0dFUiwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9MT0dHRVJfS0VZX0lEX0ZJTEVfSUQsICZrZXkuZmlsZV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGxvZ2dlciwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgbG9nZ2VyLCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfbG9nZ2VyX2NmZ19nZXRfbXVsdGkoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfbG9nZ2VyX2NmZyBjZmc7ICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfbG9nZ2VyX2tleSBrZXkgPSB7IH07ICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbXNnX3NldCAqbXNnX3NldCA9IE5VTEw7IC8qKjwgZGVjbGFyZSBtZXNzYWdlIHNldCAqLworICAgIHVpbnQzMl90IG1heF9tc2dzOyAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgIC8qKjwgZGVjbGFyZSBmaWx0ZXIgaW52ZXJ0IGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9sb2dnZXJfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9sb2dnZXJfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldCogbXNnX3NldCA9IE5VTEw7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50MzJfdCBtYXhfbXNncztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXRfbXVsdGkiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWxlX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZmlsZV9pZCA9IChiY21vbHRfbG9nX2ZpbGVfaWQpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbGVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmZpbGVfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTE9HR0VSLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0xPR0dFUl9LRVlfSURfRklMRV9JRCwgJmtleS5maWxlX2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBtYXggbnVtYmVyIG9mIG1zZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhfbXNncyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgbWF4X21zZ3MgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1heF9tc2dzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coIm1heF9tc2dzID0gJWQ7XG4iLCBtYXhfbXNncyk7CisKKyAgICAvKiBzZXQgZmlsdGVyIGludmVydCBmbGFnIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyX2ludmVydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW52ZXJ0X2ZpbHRlciA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXJfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImludmVydF9maWx0ZXIgPSAlcztcbiIsIChpbnZlcnRfZmlsdGVyKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogYWxsb2NhdGUgbWVzc2FnZSBzZXQgKi8KKyAgICBlcnIgPSBhcGljbGlfbXNnX3NldF9hbGxvYyhieXRlX3Bvb2wsIEJDTU9MVF9PQkpfSURfTE9HR0VSLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfTE9HR0VSLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBsb2dnZXIsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIGxvZ2dlciwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmJ1ZmZlci4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9sb2dfYnVmZmVyIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYnVmZmVyLmJ1ZmYiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNucHJpbnRmKHZhbC5idWZmLCAyMDQ4LCAiJXMiLCBjbGlfcGFybS0+dmFsdWUuc3RyaW5nKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYnVmZmVyLmJ1ZmYgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYnVmZmVyLm1zZ190b19yZWFkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubXNnX3RvX3JlYWQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYnVmZmVyLm1zZ190b19yZWFkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nZ2VyLCBidWZmZXIsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfbG9nX2J1ZmZlciB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR0dFUiwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX0JVRkZFUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGxvZ2dlciwgYnVmZmVyLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYnVmZmVyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbG9nZ2VyLCBidWZmZXIpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbG9nZ2VyLCBidWZmZXIpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci53cmFwX2Fyb3VuZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nZ2VyLCB3cmFwX2Fyb3VuZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBsb2dnZXIsIHdyYXBfYXJvdW5kLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR0dFUiwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX1dSQVBfQVJPVU5ELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAid3JhcF9hcm91bmQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBsb2dnZXIsIHdyYXBfYXJvdW5kKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGxvZ2dlciwgd3JhcF9hcm91bmQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5jbGVhcl9hZnRlcl9yZWFkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBsb2dnZXIsIGNsZWFyX2FmdGVyX3JlYWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nZ2VyLCBjbGVhcl9hZnRlcl9yZWFkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR0dFUiwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX0NMRUFSX0FGVEVSX1JFQUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjbGVhcl9hZnRlcl9yZWFkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbG9nZ2VyLCBjbGVhcl9hZnRlcl9yZWFkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGxvZ2dlciwgY2xlYXJfYWZ0ZXJfcmVhZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVuYWJsZV9sb2ciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGxvZ2dlciwgZW5hYmxlX2xvZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBsb2dnZXIsIGVuYWJsZV9sb2csICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTE9HR0VSLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX0xPR0dFUl9DRkdfSURfRU5BQkxFX0xPRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuYWJsZV9sb2ciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBsb2dnZXIsIGVuYWJsZV9sb2cpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbG9nZ2VyLCBlbmFibGVfbG9nKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmxvZ19uYW1lcy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zdHJfMTAwMCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxvZ19uYW1lcy5zdHIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNucHJpbnRmKHZhbC5zdHIsIDEwMDAsICIlcyIsIGNsaV9wYXJtLT52YWx1ZS5zdHJpbmcpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5sb2dfbmFtZXMuc3RyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nZ2VyLCBsb2dfbmFtZXMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RyXzEwMDAgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dHRVIsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTE9HR0VSX0NGR19JRF9MT0dfTkFNRVMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBsb2dnZXIsIGxvZ19uYW1lcywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvZ19uYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGxvZ2dlciwgbG9nX25hbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGxvZ2dlciwgbG9nX25hbWVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBsb2dnZXIsIGJ1ZmZlcikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIGxvZ2dlciwgd3JhcF9hcm91bmQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBsb2dnZXIsIGNsZWFyX2FmdGVyX3JlYWQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBsb2dnZXIsIGVuYWJsZV9sb2cpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBsb2dnZXIsIGxvZ19uYW1lcykpCisgICAgeworICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBsb2dnZXIsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbG9nZ2VyLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX2xvZ2dlcl9zdGF0X2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfbG9nZ2VyX3N0YXQgc3RhdDsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfbG9nZ2VyX2tleSBrZXkgPSB7IH07ICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vc19ib29sIGNsZWFyX29uX3JlYWQ7ICAgICAgIC8qKjwgZGVjbGFyZSAnY2xlYXIgb24gcmVhZCcgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2xvZ2dlcl9zdGF0IHN0YXQ7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbG9nZ2VyX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBjbGVhcl9vbl9yZWFkO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWxlX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZmlsZV9pZCA9IChiY21vbHRfbG9nX2ZpbGVfaWQpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbGVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmZpbGVfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTE9HR0VSLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0xPR0dFUl9LRVlfSURfRklMRV9JRCwgJmtleS5maWxlX2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IGZsYWdzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2xlYXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNsZWFyX29uX3JlYWQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2xlYXIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiY2xlYXJfb25fcmVhZCA9ICVzO1xuIiwgKGNsZWFyX29uX3JlYWQpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX1NUQVRfSU5JVCgmc3RhdCwgbG9nZ2VyLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0lOSVQoJnN0YXQsIGxvZ2dlciwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsaW5lc19pbl9sb2ciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbG9nZ2VyLCBsaW5lc19pbl9sb2cpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGxvZ2dlciwgbGluZXNfaW5fbG9nKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbG9nZ2VyLCBsaW5lc19pbl9sb2cpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGxvZ2dlciwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbG9nZ2VyLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfZ2V0KGRldmljZV9pZCwgJnN0YXQuaGRyLCBjbGVhcl9vbl9yZWFkKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXQuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdC5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfbG9nZ2VyX29wZXJfY2xlYXJfbG9nX3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfbG9nZ2VyX2NsZWFyX2xvZyBvcGVyOyAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfbG9nZ2VyX2tleSBrZXkgPSB7IH07ICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9sb2dnZXJfY2xlYXJfbG9nIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbG9nZ2VyX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWxlX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZmlsZV9pZCA9IChiY21vbHRfbG9nX2ZpbGVfaWQpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbGVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmZpbGVfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTE9HR0VSLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX0xPR0dFUl9LRVlfSURfRklMRV9JRCwgJmtleS5maWxlX2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBsb2dnZXIsIGNsZWFyX2xvZywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBsb2dnZXIsIGNsZWFyX2xvZywga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9sb2dnZXJfc3RhdF9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9sb2dnZXJfc3RhdF9jZmcgc3RhdF9jZmc7ICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfbG9nZ2VyX2tleSBrZXkgPSB7IH07ICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X2xvZ2dlcl9zdGF0X2lkIHN0YXRfaWQ7ICAgICAgLyoqPCBkZWNsYXJlIHN0YXQgSUQgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9sb2dnZXJfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbG9nZ2VyX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsZV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmZpbGVfaWQgPSAoYmNtb2x0X2xvZ19maWxlX2lkKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWxlX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5maWxlX2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX0xPR0dFUiwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9MT0dHRVJfS0VZX0lEX0ZJTEVfSUQsICZrZXkuZmlsZV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBJRCBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc3RhdF9pZCA9IChiY21vbHRfbG9nZ2VyX3N0YXRfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBzd2l0Y2ggKHN0YXRfaWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9MT0dHRVJfU1RBVF9JRF9MSU5FU19JTl9MT0c6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIGxvZ2dlciwgbGluZXNfaW5fbG9nLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBsb2dnZXIsIGxpbmVzX2luX2xvZywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZzdGF0X2NmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0X2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfbG9nZ2VyX3N0YXRfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnIHN0YXRfY2ZnOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2xvZ2dlcl9rZXkga2V5ID0geyB9OyAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9sb2dnZXJfc3RhdF9pZCBzdGF0X2lkOyAgICAgIC8qKjwgZGVjbGFyZSBzdGF0IElEICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnIHN0YXRfY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2xvZ2dlcl9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbGVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5maWxlX2lkID0gKGJjbW9sdF9sb2dfZmlsZV9pZCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsZV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZmlsZV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dHRVIsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfTE9HR0VSX0tFWV9JRF9GSUxFX0lELCAma2V5LmZpbGVfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X2xvZ2dlcl9zdGF0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgc3dpdGNoIChzdGF0X2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfTE9HR0VSX1NUQVRfSURfTElORVNfSU5fTE9HOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBsb2dnZXIsIGxpbmVzX2luX2xvZywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbG9nZ2VyLCBsaW5lc19pbl9sb2csIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnR5cGUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnR5cGUgPSAoYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHZhbC50cmlnZ2VyLnR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5yaXNpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV90aHJlc2hvbGQucmlzaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5yaXNpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5mYWxsaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLmZhbGxpbmcgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmZhbGxpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9SQU5HRToKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci51cHBlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLnVwcGVyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci51cHBlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmxvd2VyIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfcmFuZ2UubG93ZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxvd2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1ZBTFVFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5saW1pdCIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS52YWx1ZV90aHJlc2hvbGQubGltaXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxpbWl0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX05PTkU6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnNvYWsuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnNvYWsuY2xlYXJfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9TVEFUX0NGR19QUk9QX1NFVCgmc3RhdF9jZmcsIGxvZ2dlciwgY2ZnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTE9HR0VSLCBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHLCAwLCBCQ01PTFRfTE9HR0VSX1NUQVRfQ0ZHX0lEX0NGRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCBsb2dnZXIsIGNmZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0X2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfbG9nZ2VyX2F1dG9fY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnIGF1dG9fY2ZnOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2xvZ2dlcl9rZXkga2V5ID0geyB9OyAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9sb2dnZXJfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19nZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGxvZ2dlciwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGxvZ2dlciwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX2NsZWFyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBsb2dnZXIsIHN0YXRfYWxhcm1fY2xlYXJlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBsb2dnZXIsIHN0YXRfYWxhcm1fY2xlYXJlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9yYWlzZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBsb2dnZXIsIHN0YXRfYWxhcm1fcmFpc2VkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIGxvZ2dlciwgc3RhdF9hbGFybV9yYWlzZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIGxvZ2dlciwgc3RhdF9hbGFybV9jbGVhcmVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgbG9nZ2VyLCBzdGF0X2FsYXJtX3JhaXNlZCkpCisgICAgeworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBsb2dnZXIsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgbG9nZ2VyLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZhdXRvX2NmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfbG9nZ2VyX2F1dG9fY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnIGF1dG9fY2ZnOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2xvZ2dlcl9rZXkga2V5ID0geyB9OyAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9sb2dnZXJfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19zZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGxvZ2dlciwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIGxvZ2dlciwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX2NsZWFyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBsb2dnZXIsIHN0YXRfYWxhcm1fY2xlYXJlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgbG9nZ2VyLCBzdGF0X2FsYXJtX2NsZWFyZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTE9HR0VSLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfTE9HR0VSX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fcmFpc2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgbG9nZ2VyLCBzdGF0X2FsYXJtX3JhaXNlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgbG9nZ2VyLCBzdGF0X2FsYXJtX3JhaXNlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9MT0dHRVIsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9MT0dHRVJfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX25uaV9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ubmlfY2ZnIGNmZzsgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X25uaV9rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ubmlfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ubmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9wb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX05OSV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIG5uaSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgbm5pLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJlbW90ZV9sb29wYmFjayIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pLCByZW1vdGVfbG9vcGJhY2spOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmksIHJlbW90ZV9sb29wYmFjayk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibGluZV9sb29wYmFjayIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pLCBsaW5lX2xvb3BiYWNrKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pLCBsaW5lX2xvb3BiYWNrKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pLCBtYWNfYWRkcmVzcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaSwgbWFjX2FkZHJlc3MpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm5uaV9zdGF0dXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaSwgbm5pX3N0YXR1cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaSwgbm5pX3N0YXR1cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibm5pX2JhY2t1cF9zdGF0dXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaSwgbm5pX2JhY2t1cF9zdGF0dXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmksIG5uaV9iYWNrdXBfc3RhdHVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhY3RpdmVfbm5pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmksIGFjdGl2ZV9ubmkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmksIGFjdGl2ZV9ubmkpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm5uaV9zdGF0dXNfcG9sbGluZ19pbnRlcnZhbF9tcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pLCBubmlfc3RhdHVzX3BvbGxpbmdfaW50ZXJ2YWxfbXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmksIG5uaV9zdGF0dXNfcG9sbGluZ19pbnRlcnZhbF9tcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXV0b3N3aXRjaCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pLCBhdXRvc3dpdGNoKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pLCBhdXRvc3dpdGNoKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmbG93X2NvbnRyb2wiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaSwgZmxvd19jb250cm9sKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pLCBmbG93X2NvbnRyb2wpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgbm5pLCByZW1vdGVfbG9vcGJhY2spICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIG5uaSwgbGluZV9sb29wYmFjaykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgbm5pLCBtYWNfYWRkcmVzcykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgbm5pLCBubmlfc3RhdHVzKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBubmksIG5uaV9iYWNrdXBfc3RhdHVzKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBubmksIGFjdGl2ZV9ubmkpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIG5uaSwgbm5pX3N0YXR1c19wb2xsaW5nX2ludGVydmFsX21zKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBubmksIGF1dG9zd2l0Y2gpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIG5uaSwgZmxvd19jb250cm9sKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfbm5pX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X25uaV9jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfbm5pX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X25uaV9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X25uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfTk5JX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgbm5pLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBubmksIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmVtb3RlX2xvb3BiYWNrIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfY29udHJvbF9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaSwgcmVtb3RlX2xvb3BiYWNrLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaSwgcmVtb3RlX2xvb3BiYWNrLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfQ0ZHX0lEX1JFTU9URV9MT09QQkFDSywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxpbmVfbG9vcGJhY2siKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pLCBsaW5lX2xvb3BiYWNrLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaSwgbGluZV9sb29wYmFjaywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTk5JX0NGR19JRF9MSU5FX0xPT1BCQUNLLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX21hY19hZGRyZXNzIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm1hYzsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmksIG1hY19hZGRyZXNzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaSwgbWFjX2FkZHJlc3MsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX05OSV9DRkdfSURfTUFDX0FERFJFU1MsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhY3RpdmVfbm5pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfbm5pX2Nvbm5lY3Rpb24gdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X25uaV9jb25uZWN0aW9uKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pLCBhY3RpdmVfbm5pLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaSwgYWN0aXZlX25uaSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTk5JX0NGR19JRF9BQ1RJVkVfTk5JLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibm5pX3N0YXR1c19wb2xsaW5nX2ludGVydmFsX21zIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaSwgbm5pX3N0YXR1c19wb2xsaW5nX2ludGVydmFsX21zLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaSwgbm5pX3N0YXR1c19wb2xsaW5nX2ludGVydmFsX21zLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfQ0ZHX0lEX05OSV9TVEFUVVNfUE9MTElOR19JTlRFUlZBTF9NUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImF1dG9zd2l0Y2giKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaSwgYXV0b3N3aXRjaCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmksIGF1dG9zd2l0Y2gsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX05OSV9DRkdfSURfQVVUT1NXSVRDSCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZsb3dfY29udHJvbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2NvbnRyb2xfc3RhdGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmksIGZsb3dfY29udHJvbCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmksIGZsb3dfY29udHJvbCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTk5JX0NGR19JRF9GTE9XX0NPTlRST0wsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX3NldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfbm5pX2NmZ19jbGVhcihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfbm5pX2NmZyBjZmc7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ubmlfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbm5pX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbm5pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2NsZWFyIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9wb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX05OSV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIG5uaSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgbm5pLCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfbm5pX2NmZ19nZXRfbXVsdGkoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfbm5pX2NmZyBjZmc7ICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfbm5pX2tleSBrZXkgPSB7IH07ICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbXNnX3NldCAqbXNnX3NldCA9IE5VTEw7IC8qKjwgZGVjbGFyZSBtZXNzYWdlIHNldCAqLworICAgIHVpbnQzMl90IG1heF9tc2dzOyAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgIC8qKjwgZGVjbGFyZSBmaWx0ZXIgaW52ZXJ0IGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ubmlfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ubmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldCogbXNnX3NldCA9IE5VTEw7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50MzJfdCBtYXhfbXNncztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXRfbXVsdGkiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfTk5JX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBtYXggbnVtYmVyIG9mIG1zZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhfbXNncyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgbWF4X21zZ3MgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1heF9tc2dzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coIm1heF9tc2dzID0gJWQ7XG4iLCBtYXhfbXNncyk7CisKKyAgICAvKiBzZXQgZmlsdGVyIGludmVydCBmbGFnIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyX2ludmVydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW52ZXJ0X2ZpbHRlciA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXJfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImludmVydF9maWx0ZXIgPSAlcztcbiIsIChpbnZlcnRfZmlsdGVyKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogYWxsb2NhdGUgbWVzc2FnZSBzZXQgKi8KKyAgICBlcnIgPSBhcGljbGlfbXNnX3NldF9hbGxvYyhieXRlX3Bvb2wsIEJDTU9MVF9PQkpfSURfTk5JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfTk5JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBubmksIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIG5uaSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucmVtb3RlX2xvb3BiYWNrIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfY29udHJvbF9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaSwgcmVtb3RlX2xvb3BiYWNrLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaSwgcmVtb3RlX2xvb3BiYWNrLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfQ0ZHX0lEX1JFTU9URV9MT09QQkFDSywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJlbW90ZV9sb29wYmFjayIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaSwgcmVtb3RlX2xvb3BiYWNrKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaSwgcmVtb3RlX2xvb3BiYWNrKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubGluZV9sb29wYmFjayIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2NvbnRyb2xfc3RhdGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmksIGxpbmVfbG9vcGJhY2ssIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pLCBsaW5lX2xvb3BiYWNrLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfQ0ZHX0lEX0xJTkVfTE9PUEJBQ0ssICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsaW5lX2xvb3BiYWNrIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pLCBsaW5lX2xvb3BiYWNrKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaSwgbGluZV9sb29wYmFjayk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm1hY19hZGRyZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19tYWNfYWRkcmVzcyB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5tYWM7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pLCBtYWNfYWRkcmVzcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmksIG1hY19hZGRyZXNzLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfQ0ZHX0lEX01BQ19BRERSRVNTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmksIG1hY19hZGRyZXNzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaSwgbWFjX2FkZHJlc3MpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIubm5pX3N0YXR1cy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9ubmlfbGlua19zdGF0dXMgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5ubmlfc3RhdHVzLmxpbmtfc3RhdHVzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubGlua19zdGF0dXMgPSAoYmNtb2x0X3RyaXZhbGVudCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5ubmlfc3RhdHVzLmxpbmtfc3RhdHVzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm5uaV9zdGF0dXMuc2lnbmFsX2RldGVjdGVkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc2lnbmFsX2RldGVjdGVkID0gKGJjbW9sdF90cml2YWxlbnQpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubm5pX3N0YXR1cy5zaWduYWxfZGV0ZWN0ZWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubm5pX3N0YXR1cy5wbWRfbG9ja2VkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucG1kX2xvY2tlZCA9IChiY21vbHRfdHJpdmFsZW50KSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm5uaV9zdGF0dXMucG1kX2xvY2tlZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaSwgbm5pX3N0YXR1cywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9ubmlfbGlua19zdGF0dXMgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTk5JX0NGR19JRF9OTklfU1RBVFVTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pLCBubmlfc3RhdHVzLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibm5pX3N0YXR1cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaSwgbm5pX3N0YXR1cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmksIG5uaV9zdGF0dXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIubm5pX2JhY2t1cF9zdGF0dXMuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfbm5pX2xpbmtfc3RhdHVzIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubm5pX2JhY2t1cF9zdGF0dXMubGlua19zdGF0dXMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5saW5rX3N0YXR1cyA9IChiY21vbHRfdHJpdmFsZW50KSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm5uaV9iYWNrdXBfc3RhdHVzLmxpbmtfc3RhdHVzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm5uaV9iYWNrdXBfc3RhdHVzLnNpZ25hbF9kZXRlY3RlZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnNpZ25hbF9kZXRlY3RlZCA9IChiY21vbHRfdHJpdmFsZW50KSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm5uaV9iYWNrdXBfc3RhdHVzLnNpZ25hbF9kZXRlY3RlZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5ubmlfYmFja3VwX3N0YXR1cy5wbWRfbG9ja2VkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucG1kX2xvY2tlZCA9IChiY21vbHRfdHJpdmFsZW50KSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm5uaV9iYWNrdXBfc3RhdHVzLnBtZF9sb2NrZWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmksIG5uaV9iYWNrdXBfc3RhdHVzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X25uaV9saW5rX3N0YXR1cyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfQ0ZHX0lEX05OSV9CQUNLVVBfU1RBVFVTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pLCBubmlfYmFja3VwX3N0YXR1cywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm5uaV9iYWNrdXBfc3RhdHVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pLCBubmlfYmFja3VwX3N0YXR1cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmksIG5uaV9iYWNrdXBfc3RhdHVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWN0aXZlX25uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X25uaV9jb25uZWN0aW9uIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9ubmlfY29ubmVjdGlvbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaSwgYWN0aXZlX25uaSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmksIGFjdGl2ZV9ubmksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX05OSV9DRkdfSURfQUNUSVZFX05OSSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFjdGl2ZV9ubmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmksIGFjdGl2ZV9ubmkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pLCBhY3RpdmVfbm5pKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubm5pX3N0YXR1c19wb2xsaW5nX2ludGVydmFsX21zIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaSwgbm5pX3N0YXR1c19wb2xsaW5nX2ludGVydmFsX21zLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaSwgbm5pX3N0YXR1c19wb2xsaW5nX2ludGVydmFsX21zLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfQ0ZHX0lEX05OSV9TVEFUVVNfUE9MTElOR19JTlRFUlZBTF9NUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm5uaV9zdGF0dXNfcG9sbGluZ19pbnRlcnZhbF9tcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaSwgbm5pX3N0YXR1c19wb2xsaW5nX2ludGVydmFsX21zKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaSwgbm5pX3N0YXR1c19wb2xsaW5nX2ludGVydmFsX21zKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYXV0b3N3aXRjaCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pLCBhdXRvc3dpdGNoLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaSwgYXV0b3N3aXRjaCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTk5JX0NGR19JRF9BVVRPU1dJVENILCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXV0b3N3aXRjaCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaSwgYXV0b3N3aXRjaCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmksIGF1dG9zd2l0Y2gpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5mbG93X2NvbnRyb2wiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9jb250cm9sX3N0YXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pLCBmbG93X2NvbnRyb2wsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pLCBmbG93X2NvbnRyb2wsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX05OSV9DRkdfSURfRkxPV19DT05UUk9MLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmxvd19jb250cm9sIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pLCBmbG93X2NvbnRyb2wpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pLCBmbG93X2NvbnRyb2wpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIG5uaSwgcmVtb3RlX2xvb3BiYWNrKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgbm5pLCBsaW5lX2xvb3BiYWNrKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgbm5pLCBtYWNfYWRkcmVzcykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIG5uaSwgbm5pX3N0YXR1cykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIG5uaSwgbm5pX2JhY2t1cF9zdGF0dXMpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBubmksIGFjdGl2ZV9ubmkpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBubmksIG5uaV9zdGF0dXNfcG9sbGluZ19pbnRlcnZhbF9tcykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIG5uaSwgYXV0b3N3aXRjaCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIG5uaSwgZmxvd19jb250cm9sKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaSwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmksIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfbm5pX3N0YXRfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ubmlfc3RhdCBzdGF0OyAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X25uaV9rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vc19ib29sIGNsZWFyX29uX3JlYWQ7ICAgLyoqPCBkZWNsYXJlICdjbGVhciBvbiByZWFkJyBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbm5pX3N0YXQgc3RhdDtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ubmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGNsZWFyX29uX3JlYWQ7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9OTklfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgZmxhZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjbGVhciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY2xlYXJfb25fcmVhZCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjbGVhciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJjbGVhcl9vbl9yZWFkID0gJXM7XG4iLCAoY2xlYXJfb25fcmVhZCkgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfU1RBVF9JTklUKCZzdGF0LCBubmksIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfSU5JVCgmc3RhdCwgbm5pLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2ZyYW1lc182NCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X2ZyYW1lc182NCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9mcmFtZXNfNjQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2ZyYW1lc182NV8xMjciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9mcmFtZXNfNjVfMTI3KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X2ZyYW1lc182NV8xMjcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2ZyYW1lc18xMjhfMjU1Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfZnJhbWVzXzEyOF8yNTUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfZnJhbWVzXzEyOF8yNTUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2ZyYW1lc18yNTZfNTExIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfZnJhbWVzXzI1Nl81MTEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfZnJhbWVzXzI1Nl81MTEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2ZyYW1lc181MTJfMTAyMyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X2ZyYW1lc181MTJfMTAyMyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9mcmFtZXNfNTEyXzEwMjMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2ZyYW1lc18xMDI0XzE1MTgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9mcmFtZXNfMTAyNF8xNTE4KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X2ZyYW1lc18xMDI0XzE1MTgpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2ZyYW1lc18xNTE5XzIwNDciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9mcmFtZXNfMTUxOV8yMDQ3KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X2ZyYW1lc18xNTE5XzIwNDcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2ZyYW1lc18yMDQ4XzQwOTUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9mcmFtZXNfMjA0OF80MDk1KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X2ZyYW1lc18yMDQ4XzQwOTUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2ZyYW1lc180MDk2XzkyMTYiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9mcmFtZXNfNDA5Nl85MjE2KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X2ZyYW1lc180MDk2XzkyMTYpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2ZyYW1lc185MjE3XzE2MzgzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfZnJhbWVzXzkyMTdfMTYzODMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfZnJhbWVzXzkyMTdfMTYzODMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2J5dGVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfYnl0ZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2dvb2RfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfZ29vZF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfZ29vZF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3VuaWNhc3RfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfdW5pY2FzdF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfdW5pY2FzdF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X211bHRpY2FzdF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9tdWx0aWNhc3RfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X211bHRpY2FzdF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2Jyb2FkY2FzdF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9icm9hZGNhc3RfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X2Jyb2FkY2FzdF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2Zjc19lcnJvcnMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9mY3NfZXJyb3JzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X2Zjc19lcnJvcnMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2NvbnRyb2xfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfY29udHJvbF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfY29udHJvbF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3BhdXNlX2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X3BhdXNlX2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9wYXVzZV9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3BmY19mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9wZmNfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X3BmY19mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3Vuc3VwcG9ydGVkX29wY29kZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X3Vuc3VwcG9ydGVkX29wY29kZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF91bnN1cHBvcnRlZF9vcGNvZGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3Vuc3VwcG9ydGVkX2RhIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfdW5zdXBwb3J0ZWRfZGEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfdW5zdXBwb3J0ZWRfZGEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2FsaWdubWVudF9lcnJvcnMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9hbGlnbm1lbnRfZXJyb3JzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X2FsaWdubWVudF9lcnJvcnMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2xlbmd0aF9vdXRfb2ZfcmFuZ2UiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9sZW5ndGhfb3V0X29mX3JhbmdlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X2xlbmd0aF9vdXRfb2ZfcmFuZ2UpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2NvZGVfZXJyb3JzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfY29kZV9lcnJvcnMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfY29kZV9lcnJvcnMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X292ZXJzaXplZF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9vdmVyc2l6ZWRfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X292ZXJzaXplZF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2phYmJlcl9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9qYWJiZXJfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X2phYmJlcl9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X210dV9jaGVja19lcnJvcnMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9tdHVfY2hlY2tfZXJyb3JzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X210dV9jaGVja19lcnJvcnMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3Byb21pc2N1b3VzX2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X3Byb21pc2N1b3VzX2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9wcm9taXNjdW91c19mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3ZsYW5fZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfdmxhbl9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfdmxhbl9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2RvdWJsZV92bGFuX2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X2RvdWJsZV92bGFuX2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF9kb3VibGVfdmxhbl9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3RydW5jYXRlZF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF90cnVuY2F0ZWRfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X3RydW5jYXRlZF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3VuZGVyc2l6ZV9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCByeF91bmRlcnNpemVfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHJ4X3VuZGVyc2l6ZV9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2ZyYWdtZW50ZWRfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfZnJhZ21lbnRlZF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfZnJhZ21lbnRlZF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3J1bnRfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfcnVudF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgcnhfcnVudF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2ZyYW1lc182NCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X2ZyYW1lc182NCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9mcmFtZXNfNjQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2ZyYW1lc182NV8xMjciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9mcmFtZXNfNjVfMTI3KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X2ZyYW1lc182NV8xMjcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2ZyYW1lc18xMjhfMjU1Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfZnJhbWVzXzEyOF8yNTUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfZnJhbWVzXzEyOF8yNTUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2ZyYW1lc18yNTZfNTExIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfZnJhbWVzXzI1Nl81MTEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfZnJhbWVzXzI1Nl81MTEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2ZyYW1lc181MTJfMTAyMyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X2ZyYW1lc181MTJfMTAyMyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9mcmFtZXNfNTEyXzEwMjMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2ZyYW1lc18xMDI0XzE1MTgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9mcmFtZXNfMTAyNF8xNTE4KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X2ZyYW1lc18xMDI0XzE1MTgpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2ZyYW1lc18xNTE5XzIwNDciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9mcmFtZXNfMTUxOV8yMDQ3KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X2ZyYW1lc18xNTE5XzIwNDcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2ZyYW1lc18yMDQ4XzQwOTUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9mcmFtZXNfMjA0OF80MDk1KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X2ZyYW1lc18yMDQ4XzQwOTUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2ZyYW1lc180MDk2XzkyMTYiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9mcmFtZXNfNDA5Nl85MjE2KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X2ZyYW1lc180MDk2XzkyMTYpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2ZyYW1lc185MjE3XzE2MzgzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfZnJhbWVzXzkyMTdfMTYzODMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfZnJhbWVzXzkyMTdfMTYzODMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2J5dGVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfYnl0ZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2dvb2RfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfZ29vZF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfZ29vZF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3VuaWNhc3RfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfdW5pY2FzdF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfdW5pY2FzdF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X211bHRpY2FzdF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9tdWx0aWNhc3RfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X211bHRpY2FzdF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2Jyb2FkY2FzdF9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9icm9hZGNhc3RfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X2Jyb2FkY2FzdF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3BhdXNlX2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X3BhdXNlX2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9wYXVzZV9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3BmY19mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9wZmNfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X3BmY19mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2phYmJlcl9mcmFtZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9qYWJiZXJfZnJhbWVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X2phYmJlcl9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2Zjc19lcnJvcnMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9mY3NfZXJyb3JzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X2Zjc19lcnJvcnMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2NvbnRyb2xfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfY29udHJvbF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfY29udHJvbF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X292ZXJzaXplX2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X292ZXJzaXplX2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9vdmVyc2l6ZV9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2ZyYWdtZW50ZWRfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfZnJhZ21lbnRlZF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfZnJhZ21lbnRlZF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2Vycm9yX2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X2Vycm9yX2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9lcnJvcl9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3ZsYW5fZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfdmxhbl9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfdmxhbl9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2RvdWJsZV92bGFuX2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X2RvdWJsZV92bGFuX2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF9kb3VibGVfdmxhbl9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3J1bnRfZnJhbWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfcnVudF9mcmFtZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgdHhfcnVudF9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3VuZGVycnVuX2ZyYW1lcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCBubmksIHR4X3VuZGVycnVuX2ZyYW1lcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCB0eF91bmRlcnJ1bl9mcmFtZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHJ4X2ZyYW1lc182NCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHJ4X2ZyYW1lc182NV8xMjcpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCByeF9mcmFtZXNfMTI4XzI1NSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHJ4X2ZyYW1lc18yNTZfNTExKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgcnhfZnJhbWVzXzUxMl8xMDIzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgcnhfZnJhbWVzXzEwMjRfMTUxOCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHJ4X2ZyYW1lc18xNTE5XzIwNDcpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCByeF9mcmFtZXNfMjA0OF80MDk1KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgcnhfZnJhbWVzXzQwOTZfOTIxNikgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHJ4X2ZyYW1lc185MjE3XzE2MzgzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgcnhfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgcnhfYnl0ZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCByeF9nb29kX2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHJ4X3VuaWNhc3RfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgcnhfbXVsdGljYXN0X2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHJ4X2Jyb2FkY2FzdF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCByeF9mY3NfZXJyb3JzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgcnhfY29udHJvbF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCByeF9wYXVzZV9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCByeF9wZmNfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgcnhfdW5zdXBwb3J0ZWRfb3Bjb2RlKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgcnhfdW5zdXBwb3J0ZWRfZGEpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCByeF9hbGlnbm1lbnRfZXJyb3JzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgcnhfbGVuZ3RoX291dF9vZl9yYW5nZSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHJ4X2NvZGVfZXJyb3JzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgcnhfb3ZlcnNpemVkX2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHJ4X2phYmJlcl9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCByeF9tdHVfY2hlY2tfZXJyb3JzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgcnhfcHJvbWlzY3VvdXNfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgcnhfdmxhbl9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCByeF9kb3VibGVfdmxhbl9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCByeF90cnVuY2F0ZWRfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgcnhfdW5kZXJzaXplX2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHJ4X2ZyYWdtZW50ZWRfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgcnhfcnVudF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCB0eF9mcmFtZXNfNjQpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCB0eF9mcmFtZXNfNjVfMTI3KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgdHhfZnJhbWVzXzEyOF8yNTUpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCB0eF9mcmFtZXNfMjU2XzUxMSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHR4X2ZyYW1lc181MTJfMTAyMykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHR4X2ZyYW1lc18xMDI0XzE1MTgpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCB0eF9mcmFtZXNfMTUxOV8yMDQ3KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgdHhfZnJhbWVzXzIwNDhfNDA5NSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHR4X2ZyYW1lc180MDk2XzkyMTYpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCB0eF9mcmFtZXNfOTIxN18xNjM4MykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHR4X2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHR4X2J5dGVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgdHhfZ29vZF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCB0eF91bmljYXN0X2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHR4X211bHRpY2FzdF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCB0eF9icm9hZGNhc3RfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgdHhfcGF1c2VfZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgdHhfcGZjX2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHR4X2phYmJlcl9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCB0eF9mY3NfZXJyb3JzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgdHhfY29udHJvbF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCB0eF9vdmVyc2l6ZV9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCB0eF9mcmFnbWVudGVkX2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHR4X2Vycm9yX2ZyYW1lcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCBubmksIHR4X3ZsYW5fZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgdHhfZG91YmxlX3ZsYW5fZnJhbWVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIG5uaSwgdHhfcnVudF9mcmFtZXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgbm5pLCB0eF91bmRlcnJ1bl9mcmFtZXMpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIG5uaSwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgbm5pLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfZ2V0KGRldmljZV9pZCwgJnN0YXQuaGRyLCBjbGVhcl9vbl9yZWFkKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXQuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdC5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfbm5pX3N0YXRfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfbm5pX3N0YXRfY2ZnIHN0YXRfY2ZnOyAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfbm5pX2tleSBrZXkgPSB7IH07ICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbm5pX3N0YXRfaWQgc3RhdF9pZDsgICAgIC8qKjwgZGVjbGFyZSBzdGF0IElEICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbm5pX3N0YXRfY2ZnIHN0YXRfY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X25uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9OTklfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X25uaV9zdGF0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgc3dpdGNoIChzdGF0X2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzY0OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2ZyYW1lc182NCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mcmFtZXNfNjQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfNjVfMTI3OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2ZyYW1lc182NV8xMjcsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzXzY1XzEyNywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU18xMjhfMjU1OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2ZyYW1lc18xMjhfMjU1LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2ZyYW1lc18xMjhfMjU1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzI1Nl81MTE6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzXzI1Nl81MTEsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzXzI1Nl81MTEsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfNTEyXzEwMjM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzXzUxMl8xMDIzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2ZyYW1lc181MTJfMTAyMywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU18xMDI0XzE1MTg6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzXzEwMjRfMTUxOCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mcmFtZXNfMTAyNF8xNTE4LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzE1MTlfMjA0NzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mcmFtZXNfMTUxOV8yMDQ3LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2ZyYW1lc18xNTE5XzIwNDcsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfMjA0OF80MDk1OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2ZyYW1lc18yMDQ4XzQwOTUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzXzIwNDhfNDA5NSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU180MDk2XzkyMTY6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzXzQwOTZfOTIxNiwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mcmFtZXNfNDA5Nl85MjE2LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzkyMTdfMTYzODM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzXzkyMTdfMTYzODMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzXzkyMTdfMTYzODMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfR09PRF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZ29vZF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZ29vZF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF91bmljYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF91bmljYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX01VTFRJQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfbXVsdGljYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9tdWx0aWNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQlJPQURDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9icm9hZGNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2Jyb2FkY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GQ1NfRVJST1JTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2Zjc19lcnJvcnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZmNzX2Vycm9ycywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0NPTlRST0xfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2NvbnRyb2xfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2NvbnRyb2xfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfUEFVU0VfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X3BhdXNlX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9wYXVzZV9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9QRkNfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X3BmY19mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfcGZjX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1VOU1VQUE9SVEVEX09QQ09ERToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF91bnN1cHBvcnRlZF9vcGNvZGUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfdW5zdXBwb3J0ZWRfb3Bjb2RlLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVU5TVVBQT1JURURfREE6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfdW5zdXBwb3J0ZWRfZGEsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfdW5zdXBwb3J0ZWRfZGEsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9BTElHTk1FTlRfRVJST1JTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2FsaWdubWVudF9lcnJvcnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfYWxpZ25tZW50X2Vycm9ycywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0xFTkdUSF9PVVRfT0ZfUkFOR0U6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfbGVuZ3RoX291dF9vZl9yYW5nZSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9sZW5ndGhfb3V0X29mX3JhbmdlLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQ09ERV9FUlJPUlM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfY29kZV9lcnJvcnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfY29kZV9lcnJvcnMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9PVkVSU0laRURfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X292ZXJzaXplZF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfb3ZlcnNpemVkX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0pBQkJFUl9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfamFiYmVyX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9qYWJiZXJfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfTVRVX0NIRUNLX0VSUk9SUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9tdHVfY2hlY2tfZXJyb3JzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X210dV9jaGVja19lcnJvcnMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9QUk9NSVNDVU9VU19GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfcHJvbWlzY3VvdXNfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X3Byb21pc2N1b3VzX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1ZMQU5fRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X3ZsYW5fZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X3ZsYW5fZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRE9VQkxFX1ZMQU5fRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2RvdWJsZV92bGFuX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9kb3VibGVfdmxhbl9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9UUlVOQ0FURURfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X3RydW5jYXRlZF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfdHJ1bmNhdGVkX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1VOREVSU0laRV9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfdW5kZXJzaXplX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF91bmRlcnNpemVfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBR01FTlRFRF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhZ21lbnRlZF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhZ21lbnRlZF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9SVU5UX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9ydW50X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9ydW50X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU182NDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mcmFtZXNfNjQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZnJhbWVzXzY0LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzY1XzEyNzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mcmFtZXNfNjVfMTI3LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lc182NV8xMjcsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMTI4XzI1NToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mcmFtZXNfMTI4XzI1NSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mcmFtZXNfMTI4XzI1NSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18yNTZfNTExOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lc18yNTZfNTExLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lc18yNTZfNTExLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzUxMl8xMDIzOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lc181MTJfMTAyMywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mcmFtZXNfNTEyXzEwMjMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMTAyNF8xNTE4OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lc18xMDI0XzE1MTgsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZnJhbWVzXzEwMjRfMTUxOCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18xNTE5XzIwNDc6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZnJhbWVzXzE1MTlfMjA0Nywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mcmFtZXNfMTUxOV8yMDQ3LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzIwNDhfNDA5NToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mcmFtZXNfMjA0OF80MDk1LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lc18yMDQ4XzQwOTUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfNDA5Nl85MjE2OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lc180MDk2XzkyMTYsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZnJhbWVzXzQwOTZfOTIxNiwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU185MjE3XzE2MzgzOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lc185MjE3XzE2MzgzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lc185MjE3XzE2MzgzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0dPT0RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2dvb2RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2dvb2RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfdW5pY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfdW5pY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9NVUxUSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X211bHRpY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfbXVsdGljYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0JST0FEQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfYnJvYWRjYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9icm9hZGNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfUEFVU0VfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X3BhdXNlX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9wYXVzZV9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9QRkNfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X3BmY19mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfcGZjX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0pBQkJFUl9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfamFiYmVyX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9qYWJiZXJfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRkNTX0VSUk9SUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mY3NfZXJyb3JzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2Zjc19lcnJvcnMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9DT05UUk9MX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9jb250cm9sX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9jb250cm9sX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX09WRVJTSVpFX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9vdmVyc2l6ZV9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfb3ZlcnNpemVfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBR01FTlRFRF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZnJhZ21lbnRlZF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZnJhZ21lbnRlZF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9FUlJPUl9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZXJyb3JfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2Vycm9yX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX1ZMQU5fRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X3ZsYW5fZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X3ZsYW5fZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRE9VQkxFX1ZMQU5fRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2RvdWJsZV92bGFuX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9kb3VibGVfdmxhbl9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9SVU5UX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9ydW50X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9ydW50X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX1VOREVSUlVOX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF91bmRlcnJ1bl9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfdW5kZXJydW5fZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXRfY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ubmlfc3RhdF9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ubmlfc3RhdF9jZmcgc3RhdF9jZmc7ICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ubmlfa2V5IGtleSA9IHsgfTsgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9ubmlfc3RhdF9pZCBzdGF0X2lkOyAgICAgLyoqPCBkZWNsYXJlIHN0YXQgSUQgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ubmlfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbm5pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9wb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX05OSV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBJRCBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc3RhdF9pZCA9IChiY21vbHRfbm5pX3N0YXRfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBzd2l0Y2ggKHN0YXRfaWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfNjQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzXzY0LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2ZyYW1lc182NCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU182NV8xMjc6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzXzY1XzEyNywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mcmFtZXNfNjVfMTI3LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzEyOF8yNTU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzXzEyOF8yNTUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzXzEyOF8yNTUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfMjU2XzUxMToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mcmFtZXNfMjU2XzUxMSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mcmFtZXNfMjU2XzUxMSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU181MTJfMTAyMzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mcmFtZXNfNTEyXzEwMjMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzXzUxMl8xMDIzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzEwMjRfMTUxODoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mcmFtZXNfMTAyNF8xNTE4LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2ZyYW1lc18xMDI0XzE1MTgsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfMTUxOV8yMDQ3OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2ZyYW1lc18xNTE5XzIwNDcsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzXzE1MTlfMjA0Nywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU18yMDQ4XzQwOTU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzXzIwNDhfNDA5NSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mcmFtZXNfMjA0OF80MDk1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzQwOTZfOTIxNjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mcmFtZXNfNDA5Nl85MjE2LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2ZyYW1lc180MDk2XzkyMTYsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfOTIxN18xNjM4MzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mcmFtZXNfOTIxN18xNjM4Mywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mcmFtZXNfOTIxN18xNjM4Mywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9HT09EX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9nb29kX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9nb29kX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X3VuaWNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X3VuaWNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfTVVMVElDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9tdWx0aWNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X211bHRpY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9CUk9BRENBU1RfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2Jyb2FkY2FzdF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfYnJvYWRjYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZDU19FUlJPUlM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZmNzX2Vycm9ycywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mY3NfZXJyb3JzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQ09OVFJPTF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfY29udHJvbF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfY29udHJvbF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9QQVVTRV9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfcGF1c2VfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X3BhdXNlX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1BGQ19GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfcGZjX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9wZmNfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVU5TVVBQT1JURURfT1BDT0RFOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X3Vuc3VwcG9ydGVkX29wY29kZSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF91bnN1cHBvcnRlZF9vcGNvZGUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTlNVUFBPUlRFRF9EQToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF91bnN1cHBvcnRlZF9kYSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF91bnN1cHBvcnRlZF9kYSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX0FMSUdOTUVOVF9FUlJPUlM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfYWxpZ25tZW50X2Vycm9ycywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9hbGlnbm1lbnRfZXJyb3JzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfTEVOR1RIX09VVF9PRl9SQU5HRToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9sZW5ndGhfb3V0X29mX3JhbmdlLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2xlbmd0aF9vdXRfb2ZfcmFuZ2UsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9DT0RFX0VSUk9SUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9jb2RlX2Vycm9ycywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9jb2RlX2Vycm9ycywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX09WRVJTSVpFRF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfb3ZlcnNpemVkX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9vdmVyc2l6ZWRfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfSkFCQkVSX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9qYWJiZXJfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2phYmJlcl9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9NVFVfQ0hFQ0tfRVJST1JTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X210dV9jaGVja19lcnJvcnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfbXR1X2NoZWNrX2Vycm9ycywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1BST01JU0NVT1VTX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9wcm9taXNjdW91c19mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfcHJvbWlzY3VvdXNfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVkxBTl9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfdmxhbl9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfdmxhbl9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9ET1VCTEVfVkxBTl9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfZG91YmxlX3ZsYW5fZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X2RvdWJsZV92bGFuX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1RSVU5DQVRFRF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgcnhfdHJ1bmNhdGVkX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF90cnVuY2F0ZWRfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVU5ERVJTSVpFX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF91bmRlcnNpemVfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X3VuZGVyc2l6ZV9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFHTUVOVEVEX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mcmFnbWVudGVkX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCByeF9mcmFnbWVudGVkX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1JYX1JVTlRfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X3J1bnRfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHJ4X3J1bnRfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzY0OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lc182NCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mcmFtZXNfNjQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfNjVfMTI3OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lc182NV8xMjcsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZnJhbWVzXzY1XzEyNywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18xMjhfMjU1OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lc18xMjhfMjU1LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lc18xMjhfMjU1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzI1Nl81MTE6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZnJhbWVzXzI1Nl81MTEsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZnJhbWVzXzI1Nl81MTEsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfNTEyXzEwMjM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZnJhbWVzXzUxMl8xMDIzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lc181MTJfMTAyMywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18xMDI0XzE1MTg6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZnJhbWVzXzEwMjRfMTUxOCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mcmFtZXNfMTAyNF8xNTE4LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzE1MTlfMjA0NzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mcmFtZXNfMTUxOV8yMDQ3LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lc18xNTE5XzIwNDcsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMjA0OF80MDk1OgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lc18yMDQ4XzQwOTUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZnJhbWVzXzIwNDhfNDA5NSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU180MDk2XzkyMTY6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZnJhbWVzXzQwOTZfOTIxNiwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mcmFtZXNfNDA5Nl85MjE2LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzkyMTdfMTYzODM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZnJhbWVzXzkyMTdfMTYzODMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZnJhbWVzXzkyMTdfMTYzODMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfR09PRF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZ29vZF9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZ29vZF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF91bmljYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF91bmljYXN0X2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX01VTFRJQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfbXVsdGljYXN0X2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9tdWx0aWNhc3RfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfQlJPQURDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9icm9hZGNhc3RfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2Jyb2FkY2FzdF9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9QQVVTRV9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfcGF1c2VfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X3BhdXNlX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX1BGQ19GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfcGZjX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9wZmNfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfSkFCQkVSX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9qYWJiZXJfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2phYmJlcl9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GQ1NfRVJST1JTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2Zjc19lcnJvcnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZmNzX2Vycm9ycywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0NPTlRST0xfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2NvbnRyb2xfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2NvbnRyb2xfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfT1ZFUlNJWkVfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X292ZXJzaXplX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9vdmVyc2l6ZV9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFHTUVOVEVEX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mcmFnbWVudGVkX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9mcmFnbWVudGVkX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX0VSUk9SX0ZSQU1FUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF9lcnJvcl9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZXJyb3JfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfVkxBTl9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfdmxhbl9mcmFtZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfdmxhbl9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9OTklfU1RBVF9JRF9UWF9ET1VCTEVfVkxBTl9GUkFNRVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIG5uaSwgdHhfZG91YmxlX3ZsYW5fZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X2RvdWJsZV92bGFuX2ZyYW1lcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX05OSV9TVEFUX0lEX1RYX1JVTlRfRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X3J1bnRfZnJhbWVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X3J1bnRfZnJhbWVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfVU5ERVJSVU5fRlJBTUVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCBubmksIHR4X3VuZGVycnVuX2ZyYW1lcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgbm5pLCB0eF91bmRlcnJ1bl9mcmFtZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnR5cGUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnR5cGUgPSAoYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHZhbC50cmlnZ2VyLnR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5yaXNpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV90aHJlc2hvbGQucmlzaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5yaXNpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5mYWxsaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLmZhbGxpbmcgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmZhbGxpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9SQU5HRToKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci51cHBlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLnVwcGVyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci51cHBlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmxvd2VyIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfcmFuZ2UubG93ZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxvd2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1ZBTFVFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5saW1pdCIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS52YWx1ZV90aHJlc2hvbGQubGltaXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxpbWl0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX05PTkU6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnNvYWsuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnNvYWsuY2xlYXJfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9TVEFUX0NGR19QUk9QX1NFVCgmc3RhdF9jZmcsIG5uaSwgY2ZnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JLCBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHLCAwLCBCQ01PTFRfTk5JX1NUQVRfQ0ZHX0lEX0NGRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCBubmksIGNmZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0X2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfbm5pX2F1dG9fY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfbm5pX2F1dG9fY2ZnIGF1dG9fY2ZnOyAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfbm5pX2tleSBrZXkgPSB7IH07ICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ubmlfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbm5pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfZ2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBubmksIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBubmksIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9jbGVhcmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgbm5pLCBzdGF0X2FsYXJtX2NsZWFyZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgbm5pLCBzdGF0X2FsYXJtX2NsZWFyZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fcmFpc2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgbm5pLCBzdGF0X2FsYXJtX3JhaXNlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBubmksIHN0YXRfYWxhcm1fcmFpc2VkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0dXNfY2hhbmdlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIG5uaSwgc3RhdHVzX2NoYW5nZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgbm5pLCBzdGF0dXNfY2hhbmdlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgbm5pLCBzdGF0X2FsYXJtX2NsZWFyZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCBubmksIHN0YXRfYWxhcm1fcmFpc2VkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgbm5pLCBzdGF0dXNfY2hhbmdlZCkpCisgICAgeworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCBubmksIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgbm5pLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZhdXRvX2NmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfbm5pX2F1dG9fY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfbm5pX2F1dG9fY2ZnIGF1dG9fY2ZnOyAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfbm5pX2tleSBrZXkgPSB7IH07ICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ubmlfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbm5pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfc2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBubmksIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCBubmksIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9jbGVhcmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgbm5pLCBzdGF0X2FsYXJtX2NsZWFyZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIG5uaSwgc3RhdF9hbGFybV9jbGVhcmVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX05OSV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIG5uaSwgc3RhdF9hbGFybV9yYWlzZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIG5uaSwgc3RhdF9hbGFybV9yYWlzZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfTk5JX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdHVzX2NoYW5nZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBubmksIHN0YXR1c19jaGFuZ2VkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCBubmksIHN0YXR1c19jaGFuZ2VkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX05OSV9BVVRPX0NGR19JRF9TVEFUVVNfQ0hBTkdFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfbm5pX3NlcmRlc19jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ubmlfc2VyZGVzX2NmZyBjZmc7ICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfbm5pX3NlcmRlc19rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbm5pX3NlcmRlc19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X25uaV9zZXJkZXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9wb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9OTklfU0VSREVTX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImluc3RhbmNlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuaW5zdGFuY2UgPSAoYmNtb2x0X3NlcmRlc19pbnN0YW5jZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiaW5zdGFuY2UgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lmluc3RhbmNlID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSV9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfTk5JX1NFUkRFU19LRVlfSURfSU5TVEFOQ0UsICZrZXkuaW5zdGFuY2UpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBubmlfc2VyZGVzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBubmlfc2VyZGVzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3ZnYSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfdmdhKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfdmdhKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9wZiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfcGYpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9wZik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfbGZwZiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfbGZwZik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X2xmcGYpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2RmZTEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X2RmZTEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9kZmUxKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9kZmUyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9kZmUyKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfZGZlMik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfZGZlMyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfZGZlMyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X2RmZTMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2RmZTQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X2RmZTQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9kZmU0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9kZmU1Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9kZmU1KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfZGZlNSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfcHJlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmlfc2VyZGVzLCB0eF9wcmUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmlfc2VyZGVzLCB0eF9wcmUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X21haW4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaV9zZXJkZXMsIHR4X21haW4pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmlfc2VyZGVzLCB0eF9tYWluKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9wb3N0MSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pX3NlcmRlcywgdHhfcG9zdDEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmlfc2VyZGVzLCB0eF9wb3N0MSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfcG9zdDIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaV9zZXJkZXMsIHR4X3Bvc3QyKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbm5pX3NlcmRlcywgdHhfcG9zdDIpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3Bvc3QzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmlfc2VyZGVzLCB0eF9wb3N0Myk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaV9zZXJkZXMsIHR4X3Bvc3QzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9hbXAiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaV9zZXJkZXMsIHR4X2FtcCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaV9zZXJkZXMsIHR4X2FtcCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF92Z2EpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X3BmKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9sZnBmKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9kZmUxKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9kZmUyKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9kZmUzKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9kZmU0KSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9kZmU1KSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCB0eF9wcmUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHR4X21haW4pICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHR4X3Bvc3QxKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCB0eF9wb3N0MikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgbm5pX3NlcmRlcywgdHhfcG9zdDMpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHR4X2FtcCkpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIG5uaV9zZXJkZXMsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBubmlfc2VyZGVzLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfbm5pX3NlcmRlc19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ubmlfc2VyZGVzX2NmZyBjZmc7ICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfbm5pX3NlcmRlc19rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbm5pX3NlcmRlc19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X25uaV9zZXJkZXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9wb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9OTklfU0VSREVTX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImluc3RhbmNlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuaW5zdGFuY2UgPSAoYmNtb2x0X3NlcmRlc19pbnN0YW5jZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiaW5zdGFuY2UgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lmluc3RhbmNlID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSV9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfTk5JX1NFUkRFU19LRVlfSURfSU5TVEFOQ0UsICZrZXkuaW5zdGFuY2UpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBubmlfc2VyZGVzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBubmlfc2VyZGVzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3ZnYSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X3ZnYSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF92Z2EsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9WR0EsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9wZiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X3BmLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X3BmLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSV9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfUEYsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9sZnBmIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfbGZwZiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9sZnBmLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSV9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfTEZQRiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2RmZTEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9kZmUxLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X2RmZTEsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9ERkUxLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfZGZlMiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9kZmUyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X2RmZTIsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9ERkUyLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfZGZlMyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9kZmUzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X2RmZTMsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9ERkUzLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfZGZlNCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9kZmU0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X2RmZTQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9ERkU0LCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfZGZlNSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9kZmU1LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X2RmZTUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9ERkU1LCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfcHJlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pX3NlcmRlcywgdHhfcHJlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHR4X3ByZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTklfU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX1BSRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X21haW4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCB0eF9tYWluLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHR4X21haW4sICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9NQUlOLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfcG9zdDEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCB0eF9wb3N0MSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCB0eF9wb3N0MSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTklfU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QxLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfcG9zdDIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pX3NlcmRlcywgdHhfcG9zdDIsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pX3NlcmRlcywgdHhfcG9zdDIsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QT1NUMiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3Bvc3QzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHR4X3Bvc3QzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHR4X3Bvc3QzLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSV9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfUE9TVDMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9hbXAiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCB0eF9hbXAsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pX3NlcmRlcywgdHhfYW1wLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSV9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfQU1QLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX25uaV9zZXJkZXNfY2ZnX2NsZWFyKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ubmlfc2VyZGVzX2NmZyBjZmc7ICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfbm5pX3NlcmRlc19rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbm5pX3NlcmRlc19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X25uaV9zZXJkZXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfY2xlYXIiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTklfU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX05OSV9TRVJERVNfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaW5zdGFuY2UiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5pbnN0YW5jZSA9IChiY21vbHRfc2VyZGVzX2luc3RhbmNlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJpbnN0YW5jZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuaW5zdGFuY2UgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9OTklfU0VSREVTX0tFWV9JRF9JTlNUQU5DRSwgJmtleS5pbnN0YW5jZSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIG5uaV9zZXJkZXMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIG5uaV9zZXJkZXMsIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9ubmlfc2VyZGVzX2NmZ19nZXRfbXVsdGkoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfbm5pX3NlcmRlc19jZmcgY2ZnOyAgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X25uaV9zZXJkZXNfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0ID0gTlVMTDsgICAgIC8qKjwgZGVjbGFyZSBtZXNzYWdlIHNldCAqLworICAgIHVpbnQzMl90IG1heF9tc2dzOyAgICAgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYXggbnVtYmVyIG9mIG1zZ3MgdG8gZ2V0ICovCisgICAgYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyOyAgICAgICAgICAgLyoqPCBkZWNsYXJlIGZpbHRlciBpbnZlcnQgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X25uaV9zZXJkZXNfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9ubmlfc2VyZGVzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXQqIG1zZ19zZXQgPSBOVUxMO1xuIik7CisgICAgYmNtY2xpX2xvZygidWludDMyX3QgbWF4X21zZ3M7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGludmVydF9maWx0ZXI7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0X211bHRpIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9wb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9OTklfU0VSREVTX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImluc3RhbmNlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuaW5zdGFuY2UgPSAoYmNtb2x0X3NlcmRlc19pbnN0YW5jZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiaW5zdGFuY2UgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lmluc3RhbmNlID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSV9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfTk5JX1NFUkRFU19LRVlfSURfSU5TVEFOQ0UsICZrZXkuaW5zdGFuY2UpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IG1heCBudW1iZXIgb2YgbXNncyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1heF9tc2dzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBtYXhfbXNncyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWF4X21zZ3MgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygibWF4X21zZ3MgPSAlZDtcbiIsIG1heF9tc2dzKTsKKworICAgIC8qIHNldCBmaWx0ZXIgaW52ZXJ0IGZsYWcgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXJfaW52ZXJ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnZlcnRfZmlsdGVyID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlcl9pbnZlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiaW52ZXJ0X2ZpbHRlciA9ICVzO1xuIiwgKGludmVydF9maWx0ZXIpID8gIkJDTU9TX1RSVUUiIDogIkJDTU9TX0ZBTFNFIik7CisKKyAgICAvKiBhbGxvY2F0ZSBtZXNzYWdlIHNldCAqLworICAgIGVyciA9IGFwaWNsaV9tc2dfc2V0X2FsbG9jKGJ5dGVfcG9vbCwgQkNNT0xUX09CSl9JRF9OTklfU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgbm5pX3NlcmRlcywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgbm5pX3NlcmRlcywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnhfdmdhIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfdmdhLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X3ZnYSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTklfU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX1ZHQSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3ZnYSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaV9zZXJkZXMsIHJ4X3ZnYSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmlfc2VyZGVzLCByeF92Z2EpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yeF9wZiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X3BmLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X3BmLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSV9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfUEYsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9wZiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaV9zZXJkZXMsIHJ4X3BmKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaV9zZXJkZXMsIHJ4X3BmKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnhfbGZwZiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X2xmcGYsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfbGZwZiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTklfU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0xGUEYsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9sZnBmIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pX3NlcmRlcywgcnhfbGZwZik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmlfc2VyZGVzLCByeF9sZnBmKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnhfZGZlMSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X2RmZTEsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfZGZlMSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTklfU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTEsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9kZmUxIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pX3NlcmRlcywgcnhfZGZlMSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmlfc2VyZGVzLCByeF9kZmUxKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnhfZGZlMiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9kZmUyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X2RmZTIsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9ERkUyLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfZGZlMiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaV9zZXJkZXMsIHJ4X2RmZTIpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pX3NlcmRlcywgcnhfZGZlMik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJ4X2RmZTMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfZGZlMywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9kZmUzLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSV9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFMywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2RmZTMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmlfc2VyZGVzLCByeF9kZmUzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaV9zZXJkZXMsIHJ4X2RmZTMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yeF9kZmU0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X2RmZTQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pX3NlcmRlcywgcnhfZGZlNCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTklfU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9kZmU0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pX3NlcmRlcywgcnhfZGZlNCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmlfc2VyZGVzLCByeF9kZmU0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnhfZGZlNSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCByeF9kZmU1LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHJ4X2RmZTUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9ERkU1LCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfZGZlNSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaV9zZXJkZXMsIHJ4X2RmZTUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pX3NlcmRlcywgcnhfZGZlNSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnR4X3ByZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHR4X3ByZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCB0eF9wcmUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QUkUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9wcmUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmlfc2VyZGVzLCB0eF9wcmUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pX3NlcmRlcywgdHhfcHJlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudHhfbWFpbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHR4X21haW4sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pX3NlcmRlcywgdHhfbWFpbiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTklfU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX01BSU4sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9tYWluIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pX3NlcmRlcywgdHhfbWFpbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmlfc2VyZGVzLCB0eF9tYWluKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudHhfcG9zdDEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCB0eF9wb3N0MSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCB0eF9wb3N0MSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9OTklfU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QxLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfcG9zdDEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmlfc2VyZGVzLCB0eF9wb3N0MSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBubmlfc2VyZGVzLCB0eF9wb3N0MSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnR4X3Bvc3QyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHR4X3Bvc3QyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIG5uaV9zZXJkZXMsIHR4X3Bvc3QyLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSV9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfUE9TVDIsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9wb3N0MiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaV9zZXJkZXMsIHR4X3Bvc3QyKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaV9zZXJkZXMsIHR4X3Bvc3QyKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudHhfcG9zdDMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pX3NlcmRlcywgdHhfcG9zdDMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pX3NlcmRlcywgdHhfcG9zdDMsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QT1NUMywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3Bvc3QzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pX3NlcmRlcywgdHhfcG9zdDMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pX3NlcmRlcywgdHhfcG9zdDMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci50eF9hbXAiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBubmlfc2VyZGVzLCB0eF9hbXAsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbm5pX3NlcmRlcywgdHhfYW1wLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX05OSV9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfQU1QLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfYW1wIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pX3NlcmRlcywgdHhfYW1wKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaV9zZXJkZXMsIHR4X2FtcCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgbm5pX3NlcmRlcywgcnhfdmdhKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgbm5pX3NlcmRlcywgcnhfcGYpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBubmlfc2VyZGVzLCByeF9sZnBmKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgbm5pX3NlcmRlcywgcnhfZGZlMSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIG5uaV9zZXJkZXMsIHJ4X2RmZTIpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBubmlfc2VyZGVzLCByeF9kZmUzKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgbm5pX3NlcmRlcywgcnhfZGZlNCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIG5uaV9zZXJkZXMsIHJ4X2RmZTUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBubmlfc2VyZGVzLCB0eF9wcmUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBubmlfc2VyZGVzLCB0eF9tYWluKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgbm5pX3NlcmRlcywgdHhfcG9zdDEpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCBubmlfc2VyZGVzLCB0eF9wb3N0MikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIG5uaV9zZXJkZXMsIHR4X3Bvc3QzKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgbm5pX3NlcmRlcywgdHhfYW1wKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIG5uaV9zZXJkZXMsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgbm5pX3NlcmRlcywgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9zb2Z0d2FyZV9lcnJvcl9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmcgY2ZnOyAgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleSBrZXkgPSB7IH07ICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImlkeCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmlkeCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiaWR4IGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5pZHggPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfU09GVFdBUkVfRVJST1IsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfU09GVFdBUkVfRVJST1JfS0VZX0lEX0lEWCwgJmtleS5pZHgpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBzb2Z0d2FyZV9lcnJvciwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgc29mdHdhcmVfZXJyb3IsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZW50cnkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHNvZnR3YXJlX2Vycm9yLCBlbnRyeSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHNvZnR3YXJlX2Vycm9yLCBlbnRyeSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCBzb2Z0d2FyZV9lcnJvciwgZW50cnkpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBzb2Z0d2FyZV9lcnJvciwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHNvZnR3YXJlX2Vycm9yLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfc29mdHdhcmVfZXJyb3JfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnIGNmZzsgICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpZHgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5pZHggPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImlkeCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuaWR4ID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1NPRlRXQVJFX0VSUk9SLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0tFWV9JRF9JRFgsICZrZXkuaWR4KTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgc29mdHdhcmVfZXJyb3IsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIHNvZnR3YXJlX2Vycm9yLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3NvZnR3YXJlX2Vycm9yX2NmZ19jbGVhcihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnIGNmZzsgICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19jbGVhciIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImlkeCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmlkeCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiaWR4IGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5pZHggPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfU09GVFdBUkVfRVJST1IsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfU09GVFdBUkVfRVJST1JfS0VZX0lEX0lEWCwgJmtleS5pZHgpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBzb2Z0d2FyZV9lcnJvciwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgc29mdHdhcmVfZXJyb3IsIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9zb2Z0d2FyZV9lcnJvcl9jZmdfZ2V0X211bHRpKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZyBjZmc7ICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0ID0gTlVMTDsgICAgICAgICAvKio8IGRlY2xhcmUgbWVzc2FnZSBzZXQgKi8KKyAgICB1aW50MzJfdCBtYXhfbXNnczsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGZpbHRlciBpbnZlcnQgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldCogbXNnX3NldCA9IE5VTEw7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50MzJfdCBtYXhfbXNncztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXRfbXVsdGkiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpZHgiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5pZHggPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImlkeCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuaWR4ID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1NPRlRXQVJFX0VSUk9SLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0tFWV9JRF9JRFgsICZrZXkuaWR4KTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBtYXggbnVtYmVyIG9mIG1zZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhfbXNncyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgbWF4X21zZ3MgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1heF9tc2dzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coIm1heF9tc2dzID0gJWQ7XG4iLCBtYXhfbXNncyk7CisKKyAgICAvKiBzZXQgZmlsdGVyIGludmVydCBmbGFnIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyX2ludmVydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW52ZXJ0X2ZpbHRlciA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXJfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImludmVydF9maWx0ZXIgPSAlcztcbiIsIChpbnZlcnRfZmlsdGVyKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogYWxsb2NhdGUgbWVzc2FnZSBzZXQgKi8KKyAgICBlcnIgPSBhcGljbGlfbXNnX3NldF9hbGxvYyhieXRlX3Bvb2wsIEJDTU9MVF9PQkpfSURfU09GVFdBUkVfRVJST1IsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXRfYWxsb2MoQkNNT0xUX09CSl9JRF9TT0ZUV0FSRV9FUlJPUiwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgc29mdHdhcmVfZXJyb3IsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIHNvZnR3YXJlX2Vycm9yLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuZW50cnkuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc3dfZXJyb3IgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lbnRyeS5maXJzdF9lcnJvcl90aW1lX3VzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZmlyc3RfZXJyb3JfdGltZV91cyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVudHJ5LmZpcnN0X2Vycm9yX3RpbWVfdXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZW50cnkubGFzdF9lcnJvcl90aW1lX3VzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubGFzdF9lcnJvcl90aW1lX3VzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZW50cnkubGFzdF9lcnJvcl90aW1lX3VzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVudHJ5LmxpbmVfbnVtYmVyIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubGluZV9udW1iZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZW50cnkubGluZV9udW1iZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZW50cnkuZXJyb3JfY291bnRlciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmVycm9yX2NvdW50ZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZW50cnkuZXJyb3JfY291bnRlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lbnRyeS5pbnN0YW5jZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmluc3RhbmNlID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVudHJ5Lmluc3RhbmNlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVudHJ5LmZpbGVuYW1lIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBzbnByaW50Zih2YWwuZmlsZW5hbWUsIDY0LCAiJXMiLCBjbGlfcGFybS0+dmFsdWUuc3RyaW5nKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZW50cnkuZmlsZW5hbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZW50cnkudGFza19uYW1lIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBzbnByaW50Zih2YWwudGFza19uYW1lLCA2NCwgIiVzIiwgY2xpX3Bhcm0tPnZhbHVlLnN0cmluZyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVudHJ5LnRhc2tfbmFtZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHNvZnR3YXJlX2Vycm9yLCBlbnRyeSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9zd19lcnJvciB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1NPRlRXQVJFX0VSUk9SLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0NGR19JRF9FTlRSWSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHNvZnR3YXJlX2Vycm9yLCBlbnRyeSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVudHJ5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgc29mdHdhcmVfZXJyb3IsIGVudHJ5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHNvZnR3YXJlX2Vycm9yLCBlbnRyeSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgc29mdHdhcmVfZXJyb3IsIGVudHJ5KSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHNvZnR3YXJlX2Vycm9yLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHNvZnR3YXJlX2Vycm9yLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3RyeF9jYWxpYnJhdGlvbl9vcGVyX3N0YXJ0X2NhcHR1cmVfd2luZG93X3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93IG9wZXI7ICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5IGtleSA9IHsgfTsgICAgICAgICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93IG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCB0cnhfY2FsaWJyYXRpb24sIHN0YXJ0X2NhcHR1cmVfd2luZG93LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHRyeF9jYWxpYnJhdGlvbiwgc3RhcnRfY2FwdHVyZV93aW5kb3csIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB0cnhfY2FsaWJyYXRpb24sIHN0YXJ0X2NhcHR1cmVfd2luZG93LCBwb25fbmksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB0cnhfY2FsaWJyYXRpb24sIHN0YXJ0X2NhcHR1cmVfd2luZG93LCBwb25fbmksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfVFJYX0NBTElCUkFUSU9OLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fT1BFUl9JRF9TVEFSVF9DQVBUVVJFX1dJTkRPVywgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9QT05fTkksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0cmlnZ2VyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3RyaWdnZXIgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB0cnhfY2FsaWJyYXRpb24sIHN0YXJ0X2NhcHR1cmVfd2luZG93LCB0cmlnZ2VyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgdHJ4X2NhbGlicmF0aW9uLCBzdGFydF9jYXB0dXJlX3dpbmRvdywgdHJpZ2dlciwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9UUlhfQ0FMSUJSQVRJT04sIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9PUEVSX0lEX1NUQVJUX0NBUFRVUkVfV0lORE9XLCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1RSSUdHRVIsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdHJvYmUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9jYXB0dXJlX3N0cm9iZV9zaWduYWwgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2NhcHR1cmVfc3Ryb2JlX3NpZ25hbCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgdHJ4X2NhbGlicmF0aW9uLCBzdGFydF9jYXB0dXJlX3dpbmRvdywgc3Ryb2JlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgdHJ4X2NhbGlicmF0aW9uLCBzdGFydF9jYXB0dXJlX3dpbmRvdywgc3Ryb2JlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1RSWF9DQUxJQlJBVElPTiwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX09QRVJfSURfU1RBUlRfQ0FQVFVSRV9XSU5ET1csIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfU1RST0JFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAid2luZG93X21vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fd2luZG93X21vZGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl93aW5kb3dfbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgdHJ4X2NhbGlicmF0aW9uLCBzdGFydF9jYXB0dXJlX3dpbmRvdywgd2luZG93X21vZGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB0cnhfY2FsaWJyYXRpb24sIHN0YXJ0X2NhcHR1cmVfd2luZG93LCB3aW5kb3dfbW9kZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9UUlhfQ0FMSUJSQVRJT04sIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9PUEVSX0lEX1NUQVJUX0NBUFRVUkVfV0lORE9XLCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1dJTkRPV19NT0RFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MTZfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgdHJ4X2NhbGlicmF0aW9uLCBzdGFydF9jYXB0dXJlX3dpbmRvdywgb251X2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgdHJ4X2NhbGlicmF0aW9uLCBzdGFydF9jYXB0dXJlX3dpbmRvdywgb251X2lkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1RSWF9DQUxJQlJBVElPTiwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX09QRVJfSURfU1RBUlRfQ0FQVFVSRV9XSU5ET1csIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfT05VX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHJpZ2dlcl9wb3NpdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyX3Bvc2l0aW9uIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fdHJpZ2dlcl9wb3NpdGlvbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgdHJ4X2NhbGlicmF0aW9uLCBzdGFydF9jYXB0dXJlX3dpbmRvdywgdHJpZ2dlcl9wb3NpdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHRyeF9jYWxpYnJhdGlvbiwgc3RhcnRfY2FwdHVyZV93aW5kb3csIHRyaWdnZXJfcG9zaXRpb24sICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfVFJYX0NBTElCUkFUSU9OLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fT1BFUl9JRF9TVEFSVF9DQVBUVVJFX1dJTkRPVywgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9UUklHR0VSX1BPU0lUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RvcF9kdWVfdG9fY29ycnVwdF9zdHJvYmUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgdHJ4X2NhbGlicmF0aW9uLCBzdGFydF9jYXB0dXJlX3dpbmRvdywgc3RvcF9kdWVfdG9fY29ycnVwdF9zdHJvYmUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB0cnhfY2FsaWJyYXRpb24sIHN0YXJ0X2NhcHR1cmVfd2luZG93LCBzdG9wX2R1ZV90b19jb3JydXB0X3N0cm9iZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9UUlhfQ0FMSUJSQVRJT04sIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9PUEVSX0lEX1NUQVJUX0NBUFRVUkVfV0lORE9XLCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1NUT1BfRFVFX1RPX0NPUlJVUFRfU1RST0JFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhcnRfb2Zmc2V0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MTZfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgdHJ4X2NhbGlicmF0aW9uLCBzdGFydF9jYXB0dXJlX3dpbmRvdywgc3RhcnRfb2Zmc2V0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgdHJ4X2NhbGlicmF0aW9uLCBzdGFydF9jYXB0dXJlX3dpbmRvdywgc3RhcnRfb2Zmc2V0LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1RSWF9DQUxJQlJBVElPTiwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX09QRVJfSURfU1RBUlRfQ0FQVFVSRV9XSU5ET1csIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfU1RBUlRfT0ZGU0VULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZW5kX29mZnNldCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDE2X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHRyeF9jYWxpYnJhdGlvbiwgc3RhcnRfY2FwdHVyZV93aW5kb3csIGVuZF9vZmZzZXQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB0cnhfY2FsaWJyYXRpb24sIHN0YXJ0X2NhcHR1cmVfd2luZG93LCBlbmRfb2Zmc2V0LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1RSWF9DQUxJQlJBVElPTiwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX09QRVJfSURfU1RBUlRfQ0FQVFVSRV9XSU5ET1csIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfRU5EX09GRlNFVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm51bWJlcl9vZl9jeWNsZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHRyeF9jYWxpYnJhdGlvbiwgc3RhcnRfY2FwdHVyZV93aW5kb3csIG51bWJlcl9vZl9jeWNsZXMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB0cnhfY2FsaWJyYXRpb24sIHN0YXJ0X2NhcHR1cmVfd2luZG93LCBudW1iZXJfb2ZfY3ljbGVzLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1RSWF9DQUxJQlJBVElPTiwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX09QRVJfSURfU1RBUlRfQ0FQVFVSRV9XSU5ET1csIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfTlVNQkVSX09GX0NZQ0xFUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3RyeF9jYWxpYnJhdGlvbl9vcGVyX3N0b3BfY2FwdHVyZV93aW5kb3dfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvdyBvcGVyOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXkga2V5ID0geyB9OyAgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvdyBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgdHJ4X2NhbGlicmF0aW9uLCBzdG9wX2NhcHR1cmVfd2luZG93LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHRyeF9jYWxpYnJhdGlvbiwgc3RvcF9jYXB0dXJlX3dpbmRvdywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHRyeF9jYWxpYnJhdGlvbiwgc3RvcF9jYXB0dXJlX3dpbmRvdywgcG9uX25pLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgdHJ4X2NhbGlicmF0aW9uLCBzdG9wX2NhcHR1cmVfd2luZG93LCBwb25fbmksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfVFJYX0NBTElCUkFUSU9OLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fT1BFUl9JRF9TVE9QX0NBUFRVUkVfV0lORE9XLCBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUT1BfQ0FQVFVSRV9XSU5ET1dfSURfUE9OX05JLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnIGF1dG9fY2ZnOyAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleSBrZXkgPSB7IH07ICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfZ2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCB0cnhfY2FsaWJyYXRpb24sIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCB0cnhfY2FsaWJyYXRpb24sIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB0cnhfY2FsaWJyYXRpb24sIGNhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHRyeF9jYWxpYnJhdGlvbiwgY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHRyeF9jYWxpYnJhdGlvbiwgY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWQpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgdHJ4X2NhbGlicmF0aW9uLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHRyeF9jYWxpYnJhdGlvbiwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmYXV0b19jZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZyBhdXRvX2NmZzsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXkga2V5ID0geyB9OyAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX3NldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgdHJ4X2NhbGlicmF0aW9uLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgdHJ4X2NhbGlicmF0aW9uLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgdHJ4X2NhbGlicmF0aW9uLCBjYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgdHJ4X2NhbGlicmF0aW9uLCBjYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9UUlhfQ0FMSUJSQVRJT04sIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQVVUT19DRkdfSURfQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX2FsbG9jX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX2FsbG9jX2NmZyBjZmc7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9hbGxvY19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2FsbG9jX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fQUxMT0NfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxsb2NfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5hbGxvY19pZCA9IChiY21vbHRfeGdwb25fYWxsb2NfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxsb2NfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmFsbG9jX2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX0FMTE9DX0tFWV9JRF9BTExPQ19JRCwgJmtleS5hbGxvY19pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX2FsbG9jLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9hbGxvYywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fYWxsb2MsIHN0YXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fYWxsb2MsIHN0YXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzbGEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX2FsbG9jLCBzbGEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9hbGxvYywgc2xhKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX2FsbG9jLCBvbnVfaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9hbGxvYywgb251X2lkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb2xsZWN0X3N0YXRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9hbGxvYywgY29sbGVjdF9zdGF0cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX2FsbG9jLCBjb2xsZWN0X3N0YXRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX2FsbG9jLCBzdGF0ZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fYWxsb2MsIHNsYSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fYWxsb2MsIG9udV9pZCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fYWxsb2MsIGNvbGxlY3Rfc3RhdHMpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9hbGxvYywgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX2FsbG9jLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fYWxsb2NfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fYWxsb2NfY2ZnIGNmZzsgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX2FsbG9jX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2FsbG9jX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fYWxsb2Nfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9BTExPQ19LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGxvY19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmFsbG9jX2lkID0gKGJjbW9sdF94Z3Bvbl9hbGxvY19pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhbGxvY19pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuYWxsb2NfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fQUxMT0NfS0VZX0lEX0FMTE9DX0lELCAma2V5LmFsbG9jX2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fYWxsb2MsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX2FsbG9jLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJzbGEuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcG9uX2FsbG9jX3NsYSB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2xhLmNicl9ydF9idyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNicl9ydF9idyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNsYS5jYnJfcnRfYncgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzbGEuY2JyX25ydF9idyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNicl9ucnRfYncgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzbGEuY2JyX25ydF9idyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNsYS5ndWFyYW50ZWVkX2J3Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZ3VhcmFudGVlZF9idyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNsYS5ndWFyYW50ZWVkX2J3IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2xhLm1heGltdW1fYnciKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tYXhpbXVtX2J3ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic2xhLm1heGltdW1fYncgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzbGEuYWRkaXRpb25hbF9id19lbGlnaWJpbGl0eSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHkgPSAoYmNtb2x0X2FkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHkpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzbGEuYWRkaXRpb25hbF9id19lbGlnaWJpbGl0eSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNsYS5jYnJfcnRfY29tcGVuc2F0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY2JyX3J0X2NvbXBlbnNhdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic2xhLmNicl9ydF9jb21wZW5zYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzbGEuY2JyX3J0X2FwX2luZGV4Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY2JyX3J0X2FwX2luZGV4ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic2xhLmNicl9ydF9hcF9pbmRleCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNsYS5jYnJfbnJ0X2FwX2luZGV4Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY2JyX25ydF9hcF9pbmRleCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInNsYS5jYnJfbnJ0X2FwX2luZGV4IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2xhLmFsbG9jX3R5cGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hbGxvY190eXBlID0gKGJjbW9sdF9hbGxvY190eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic2xhLmFsbG9jX3R5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzbGEud2VpZ2h0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwud2VpZ2h0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic2xhLndlaWdodCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNsYS5wcmlvcml0eSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnByaW9yaXR5ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic2xhLnByaW9yaXR5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fYWxsb2MsIHNsYSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wb25fYWxsb2Nfc2xhIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fQUxMT0NfQ0ZHX0lEX1NMQSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2FsbG9jLCBzbGEsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9vbnVfaWQgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3hncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fYWxsb2MsIG9udV9pZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9hbGxvYywgb251X2lkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX0FMTE9DX0NGR19JRF9PTlVfSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb2xsZWN0X3N0YXRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9hbGxvYywgY29sbGVjdF9zdGF0cywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9hbGxvYywgY29sbGVjdF9zdGF0cywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfQ09MTEVDVF9TVEFUUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9hbGxvY19jZmdfY2xlYXIoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX2FsbG9jX2NmZyBjZmc7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9hbGxvY19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2FsbG9jX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2NsZWFyIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9BTExPQ19LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGxvY19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmFsbG9jX2lkID0gKGJjbW9sdF94Z3Bvbl9hbGxvY19pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhbGxvY19pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuYWxsb2NfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fQUxMT0NfS0VZX0lEX0FMTE9DX0lELCAma2V5LmFsbG9jX2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fYWxsb2MsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX2FsbG9jLCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fYWxsb2NfY2ZnX2dldF9tdWx0aShiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fYWxsb2Nfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X21zZ19zZXQgKm1zZ19zZXQgPSBOVUxMOyAgICAgLyoqPCBkZWNsYXJlIG1lc3NhZ2Ugc2V0ICovCisgICAgdWludDMyX3QgbWF4X21zZ3M7ICAgICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgICAgICAvKio8IGRlY2xhcmUgZmlsdGVyIGludmVydCBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fYWxsb2NfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9hbGxvY19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0KiBtc2dfc2V0ID0gTlVMTDtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQzMl90IG1heF9tc2dzO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldF9tdWx0aSIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fQUxMT0NfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxsb2NfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5hbGxvY19pZCA9IChiY21vbHRfeGdwb25fYWxsb2NfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxsb2NfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmFsbG9jX2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX0FMTE9DX0tFWV9JRF9BTExPQ19JRCwgJmtleS5hbGxvY19pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfWEdQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX2FsbG9jLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9hbGxvYywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hbGxvY19zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfYWxsb2Nfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9hbGxvYywgc3RhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fYWxsb2MsIHN0YXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX0FMTE9DX0NGR19JRF9TVEFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fYWxsb2MsIHN0YXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX2FsbG9jLCBzdGF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5zbGEuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcG9uX2FsbG9jX3NsYSB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnNsYS5jYnJfcnRfYnciKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jYnJfcnRfYncgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuc2xhLmNicl9ydF9idyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zbGEuY2JyX25ydF9idyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNicl9ucnRfYncgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuc2xhLmNicl9ucnRfYncgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc2xhLmd1YXJhbnRlZWRfYnciKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5ndWFyYW50ZWVkX2J3ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnNsYS5ndWFyYW50ZWVkX2J3IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnNsYS5tYXhpbXVtX2J3Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWF4aW11bV9idyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zbGEubWF4aW11bV9idyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zbGEuYWRkaXRpb25hbF9id19lbGlnaWJpbGl0eSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHkgPSAoYmNtb2x0X2FkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHkpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuc2xhLmFkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc2xhLmNicl9ydF9jb21wZW5zYXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jYnJfcnRfY29tcGVuc2F0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuc2xhLmNicl9ydF9jb21wZW5zYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc2xhLmNicl9ydF9hcF9pbmRleCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNicl9ydF9hcF9pbmRleCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zbGEuY2JyX3J0X2FwX2luZGV4IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnNsYS5jYnJfbnJ0X2FwX2luZGV4Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY2JyX25ydF9hcF9pbmRleCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zbGEuY2JyX25ydF9hcF9pbmRleCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zbGEuYWxsb2NfdHlwZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFsbG9jX3R5cGUgPSAoYmNtb2x0X2FsbG9jX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuc2xhLmFsbG9jX3R5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc2xhLndlaWdodCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLndlaWdodCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zbGEud2VpZ2h0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnNsYS5wcmlvcml0eSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnByaW9yaXR5ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnNsYS5wcmlvcml0eSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2FsbG9jLCBzbGEsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcG9uX2FsbG9jX3NsYSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX0FMTE9DX0NGR19JRF9TTEEsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9hbGxvYywgc2xhLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2xhIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fYWxsb2MsIHNsYSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9hbGxvYywgc2xhKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fb251X2lkIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF94Z3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2FsbG9jLCBvbnVfaWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fYWxsb2MsIG9udV9pZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfT05VX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fYWxsb2MsIG9udV9pZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9hbGxvYywgb251X2lkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY29sbGVjdF9zdGF0cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fYWxsb2MsIGNvbGxlY3Rfc3RhdHMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fYWxsb2MsIGNvbGxlY3Rfc3RhdHMsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fQUxMT0NfQ0ZHX0lEX0NPTExFQ1RfU1RBVFMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb2xsZWN0X3N0YXRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fYWxsb2MsIGNvbGxlY3Rfc3RhdHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fYWxsb2MsIGNvbGxlY3Rfc3RhdHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX2FsbG9jLCBzdGF0ZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX2FsbG9jLCBzbGEpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9hbGxvYywgb251X2lkKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fYWxsb2MsIGNvbGxlY3Rfc3RhdHMpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fYWxsb2MsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fYWxsb2MsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fYWxsb2Nfb3Blcl9nZXRfc3RhdHNfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHMgb3BlcjsgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fYWxsb2Nfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fYWxsb2Nfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fQUxMT0NfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxsb2NfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5hbGxvY19pZCA9IChiY21vbHRfeGdwb25fYWxsb2NfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxsb2NfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmFsbG9jX2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX0FMTE9DX0tFWV9JRF9BTExPQ19JRCwgJmtleS5hbGxvY19pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fYWxsb2MsIGdldF9zdGF0cywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCB4Z3Bvbl9hbGxvYywgZ2V0X3N0YXRzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm51bV9vZl9jeWNsZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9hbGxvYywgZ2V0X3N0YXRzLCBudW1fb2ZfY3ljbGVzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fYWxsb2MsIGdldF9zdGF0cywgbnVtX29mX2N5Y2xlcywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfWEdQT05fQUxMT0NfT1BFUl9JRF9HRVRfU1RBVFMsIEJDTU9MVF9YR1BPTl9BTExPQ19HRVRfU1RBVFNfSURfTlVNX09GX0NZQ0xFUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX2FsbG9jX29wZXJfc2V0X3N0YXRlX3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlIG9wZXI7ICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX2FsbG9jX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZSBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2FsbG9jX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX0FMTE9DX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsbG9jX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuYWxsb2NfaWQgPSAoYmNtb2x0X3hncG9uX2FsbG9jX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFsbG9jX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5hbGxvY19pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9BTExPQ19LRVlfSURfQUxMT0NfSUQsICZrZXkuYWxsb2NfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX2FsbG9jLCBzZXRfc3RhdGUsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fYWxsb2MsIHNldF9zdGF0ZSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2FsbG9jX29wZXJhdGlvbiB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfYWxsb2Nfb3BlcmF0aW9uKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9hbGxvYywgc2V0X3N0YXRlLCBzdGF0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX2FsbG9jLCBzZXRfc3RhdGUsIHN0YXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9YR1BPTl9BTExPQ19PUEVSX0lEX1NFVF9TVEFURSwgQkNNT0xUX1hHUE9OX0FMTE9DX1NFVF9TVEFURV9JRF9TVEFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX2FsbG9jX3N0YXRfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0IHN0YXQ7ICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fYWxsb2Nfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb3NfYm9vbCBjbGVhcl9vbl9yZWFkOyAgICAgICAgICAgLyoqPCBkZWNsYXJlICdjbGVhciBvbiByZWFkJyBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fYWxsb2Nfc3RhdCBzdGF0O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2FsbG9jX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBjbGVhcl9vbl9yZWFkO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX0FMTE9DX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsbG9jX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuYWxsb2NfaWQgPSAoYmNtb2x0X3hncG9uX2FsbG9jX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFsbG9jX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5hbGxvY19pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9BTExPQ19LRVlfSURfQUxMT0NfSUQsICZrZXkuYWxsb2NfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgZmxhZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjbGVhciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY2xlYXJfb25fcmVhZCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjbGVhciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJjbGVhcl9vbl9yZWFkID0gJXM7XG4iLCAoY2xlYXJfb25fcmVhZCkgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfU1RBVF9JTklUKCZzdGF0LCB4Z3Bvbl9hbGxvYywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9JTklUKCZzdGF0LCB4Z3Bvbl9hbGxvYywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9ieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9hbGxvYywgcnhfYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX2FsbG9jLCByeF9ieXRlcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX2FsbG9jLCByeF9ieXRlcykpCisgICAgeworICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fYWxsb2MsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX2FsbG9jLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfZ2V0KGRldmljZV9pZCwgJnN0YXQuaGRyLCBjbGVhcl9vbl9yZWFkKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXQuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdC5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fYWxsb2Nfc3RhdF9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZyBzdGF0X2NmZzsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX2FsbG9jX2tleSBrZXkgPSB7IH07ICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9pZCBzdGF0X2lkOyAgICAgLyoqPCBkZWNsYXJlIHN0YXQgSUQgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZyBzdGF0X2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9hbGxvY19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fQUxMT0NfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxsb2NfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5hbGxvY19pZCA9IChiY21vbHRfeGdwb25fYWxsb2NfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxsb2NfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmFsbG9jX2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX0FMTE9DX0tFWV9JRF9BTExPQ19JRCwgJmtleS5hbGxvY19pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBJRCBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc3RhdF9pZCA9IChiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIHN3aXRjaCAoc3RhdF9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX0FMTE9DX1NUQVRfSURfUlhfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX2FsbG9jLCByeF9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fYWxsb2MsIHJ4X2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXRfY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9hbGxvY19zdGF0X2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnIHN0YXRfY2ZnOyAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fYWxsb2Nfa2V5IGtleSA9IHsgfTsgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2lkIHN0YXRfaWQ7ICAgICAvKio8IGRlY2xhcmUgc3RhdCBJRCAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnIHN0YXRfY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2FsbG9jX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9BTExPQ19LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGxvY19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmFsbG9jX2lkID0gKGJjbW9sdF94Z3Bvbl9hbGxvY19pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhbGxvY19pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuYWxsb2NfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fQUxMT0NfS0VZX0lEX0FMTE9DX0lELCAma2V5LmFsbG9jX2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IElEIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBzdGF0X2lkID0gKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgc3dpdGNoIChzdGF0X2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fQUxMT0NfU1RBVF9JRF9SWF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fYWxsb2MsIHJ4X2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9hbGxvYywgcnhfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnR5cGUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnR5cGUgPSAoYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHZhbC50cmlnZ2VyLnR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5yaXNpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV90aHJlc2hvbGQucmlzaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5yaXNpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5mYWxsaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLmZhbGxpbmcgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmZhbGxpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9SQU5HRToKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci51cHBlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLnVwcGVyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci51cHBlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmxvd2VyIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfcmFuZ2UubG93ZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxvd2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1ZBTFVFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5saW1pdCIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS52YWx1ZV90aHJlc2hvbGQubGltaXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxpbWl0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX05PTkU6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnNvYWsuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnNvYWsuY2xlYXJfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9TVEFUX0NGR19QUk9QX1NFVCgmc3RhdF9jZmcsIHhncG9uX2FsbG9jLCBjZmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9hbGFybV9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQywgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgMCwgQkNNT0xUX1hHUE9OX0FMTE9DX1NUQVRfQ0ZHX0lEX0NGRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCB4Z3Bvbl9hbGxvYywgY2ZnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9hbGxvY19hdXRvX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnIGF1dG9fY2ZnOyAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fYWxsb2Nfa2V5IGtleSA9IHsgfTsgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2FsbG9jX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfZ2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCB4Z3Bvbl9hbGxvYywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIHhncG9uX2FsbG9jLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNvbmZpZ3VyYXRpb25fY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fYWxsb2MsIGNvbmZpZ3VyYXRpb25fY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX2FsbG9jLCBjb25maWd1cmF0aW9uX2NvbXBsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX2FsbG9jLCBnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX2FsbG9jLCBnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX2NsZWFyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9hbGxvYywgc3RhdF9hbGFybV9jbGVhcmVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX2FsbG9jLCBzdGF0X2FsYXJtX2NsZWFyZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fcmFpc2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fYWxsb2MsIHN0YXRfYWxhcm1fcmFpc2VkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX2FsbG9jLCBzdGF0X2FsYXJtX3JhaXNlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fYWxsb2MsIGNvbmZpZ3VyYXRpb25fY29tcGxldGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fYWxsb2MsIGdldF9hbGxvY19zdGF0c19jb21wbGV0ZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9hbGxvYywgc3RhdF9hbGFybV9jbGVhcmVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fYWxsb2MsIHN0YXRfYWxhcm1fcmFpc2VkKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX2FsbG9jLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX2FsbG9jLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZhdXRvX2NmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fYWxsb2NfYXV0b19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZyBhdXRvX2NmZzsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX2FsbG9jX2tleSBrZXkgPSB7IH07ICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9hbGxvY19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX3NldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgeGdwb25fYWxsb2MsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCB4Z3Bvbl9hbGxvYywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb25maWd1cmF0aW9uX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX2FsbG9jLCBjb25maWd1cmF0aW9uX2NvbXBsZXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fYWxsb2MsIGNvbmZpZ3VyYXRpb25fY29tcGxldGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19DRkdfSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fYWxsb2MsIGdldF9hbGxvY19zdGF0c19jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX2FsbG9jLCBnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19DRkdfSURfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fY2xlYXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX2FsbG9jLCBzdGF0X2FsYXJtX2NsZWFyZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX2FsbG9jLCBzdGF0X2FsYXJtX2NsZWFyZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fQUxMT0MsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9BTExPQ19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX2FsbG9jLCBzdGF0X2FsYXJtX3JhaXNlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fYWxsb2MsIHN0YXRfYWxhcm1fcmFpc2VkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX2dlbV9wb3J0X2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZyBjZmc7ICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnZW1fcG9ydF9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LmdlbV9wb3J0X2lkID0gKGJjbW9sdF94Z3Bvbl9nZW1faWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZ2VtX3BvcnRfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LmdlbV9wb3J0X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0tFWV9JRF9HRU1fUE9SVF9JRCwgJmtleS5nZW1fcG9ydF9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb25maWd1cmF0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgY29uZmlndXJhdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBjb25maWd1cmF0aW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBvbnVfaWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgb251X2lkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJnZW1fcG9ydF9zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fZ2VtX3BvcnQsIGdlbV9wb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fZ2VtX3BvcnQsIGdlbV9wb3J0X3N0YXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmNyeXB0aW9uX21vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBlbmNyeXB0aW9uX21vZGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgZW5jcnlwdGlvbl9tb2RlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fZ2VtX3BvcnQsIHVwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fZ2VtX3BvcnQsIHVwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb250cm9sIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgY29udHJvbCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBjb250cm9sKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBjb25maWd1cmF0aW9uKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgb251X2lkKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgZ2VtX3BvcnRfc3RhdGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBlbmNyeXB0aW9uX21vZGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCB1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fZ2VtX3BvcnQsIGNvbnRyb2wpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fZ2VtX3BvcnRfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnIGNmZzsgICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdlbV9wb3J0X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZ2VtX3BvcnRfaWQgPSAoYmNtb2x0X3hncG9uX2dlbV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJnZW1fcG9ydF9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZ2VtX3BvcnRfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfS0VZX0lEX0dFTV9QT1JUX0lELCAma2V5LmdlbV9wb3J0X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fZ2VtX3BvcnQsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJjb25maWd1cmF0aW9uLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb24gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNvbmZpZ3VyYXRpb24uZGlyZWN0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZGlyZWN0aW9uID0gKGJjbW9sdF9nZW1fcG9ydF9kaXJlY3Rpb24pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjb25maWd1cmF0aW9uLmRpcmVjdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNvbmZpZ3VyYXRpb24udHlwZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnR5cGUgPSAoYmNtb2x0X2dlbV9wb3J0X3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjb25maWd1cmF0aW9uLnR5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgY29uZmlndXJhdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9nZW1fcG9ydF9jb25maWd1cmF0aW9uIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX0NPTkZJR1VSQVRJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgY29uZmlndXJhdGlvbiwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX29udV9pZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfeGdwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgb251X2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBvbnVfaWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX09OVV9JRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuY3J5cHRpb25fbW9kZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2NvbnRyb2xfc3RhdGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgZW5jcnlwdGlvbl9tb2RlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBlbmNyeXB0aW9uX21vZGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX0VOQ1JZUFRJT05fTU9ERSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdXNfZ2VtX3BvcnRfZGVzdGluYXRpb24gdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3VzX2dlbV9wb3J0X2Rlc3RpbmF0aW9uKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fZ2VtX3BvcnQsIHVwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCB1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfVVBTVFJFQU1fREVTVElOQVRJT05fUVVFVUUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb250cm9sIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfY29udHJvbF9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBjb250cm9sLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBjb250cm9sLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9DT05UUk9MLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX2dlbV9wb3J0X2NmZ19jbGVhcihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnIGNmZzsgICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXkga2V5ID0geyB9OyAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19jbGVhciIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ2VtX3BvcnRfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5nZW1fcG9ydF9pZCA9IChiY21vbHRfeGdwb25fZ2VtX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImdlbV9wb3J0X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5nZW1fcG9ydF9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9LRVlfSURfR0VNX1BPUlRfSUQsICZrZXkuZ2VtX3BvcnRfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fZ2VtX3BvcnQsIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9nZW1fcG9ydF9jZmdfZ2V0X211bHRpKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZyBjZmc7ICAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0ID0gTlVMTDsgICAgICAgICAvKio8IGRlY2xhcmUgbWVzc2FnZSBzZXQgKi8KKyAgICB1aW50MzJfdCBtYXhfbXNnczsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGZpbHRlciBpbnZlcnQgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldCogbXNnX3NldCA9IE5VTEw7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJ1aW50MzJfdCBtYXhfbXNncztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXRfbXVsdGkiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdlbV9wb3J0X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZ2VtX3BvcnRfaWQgPSAoYmNtb2x0X3hncG9uX2dlbV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJnZW1fcG9ydF9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZ2VtX3BvcnRfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfS0VZX0lEX0dFTV9QT1JUX0lELCAma2V5LmdlbV9wb3J0X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBtYXggbnVtYmVyIG9mIG1zZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhfbXNncyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgbWF4X21zZ3MgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1heF9tc2dzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coIm1heF9tc2dzID0gJWQ7XG4iLCBtYXhfbXNncyk7CisKKyAgICAvKiBzZXQgZmlsdGVyIGludmVydCBmbGFnIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyX2ludmVydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW52ZXJ0X2ZpbHRlciA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXJfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImludmVydF9maWx0ZXIgPSAlcztcbiIsIChpbnZlcnRfZmlsdGVyKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogYWxsb2NhdGUgbWVzc2FnZSBzZXQgKi8KKyAgICBlcnIgPSBhcGljbGlfbXNnX3NldF9hbGxvYyhieXRlX3Bvb2wsIEJDTU9MVF9PQkpfSURfWEdQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXRfYWxsb2MoQkNNT0xUX09CSl9JRF9YR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fZ2VtX3BvcnQsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuY29uZmlndXJhdGlvbi4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9nZW1fcG9ydF9jb25maWd1cmF0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY29uZmlndXJhdGlvbi5kaXJlY3Rpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kaXJlY3Rpb24gPSAoYmNtb2x0X2dlbV9wb3J0X2RpcmVjdGlvbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5jb25maWd1cmF0aW9uLmRpcmVjdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5jb25maWd1cmF0aW9uLnR5cGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50eXBlID0gKGJjbW9sdF9nZW1fcG9ydF90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmNvbmZpZ3VyYXRpb24udHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBjb25maWd1cmF0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfQ09ORklHVVJBVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBjb25maWd1cmF0aW9uLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY29uZmlndXJhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX2dlbV9wb3J0LCBjb25maWd1cmF0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX2dlbV9wb3J0LCBjb25maWd1cmF0aW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fb251X2lkIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF94Z3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBvbnVfaWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fZ2VtX3BvcnQsIG9udV9pZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfT05VX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fZ2VtX3BvcnQsIG9udV9pZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9nZW1fcG9ydCwgb251X2lkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZ2VtX3BvcnRfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgZ2VtX3BvcnRfc3RhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fZ2VtX3BvcnQsIGdlbV9wb3J0X3N0YXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9HRU1fUE9SVF9TVEFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdlbV9wb3J0X3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fZ2VtX3BvcnQsIGdlbV9wb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX2dlbV9wb3J0LCBnZW1fcG9ydF9zdGF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVuY3J5cHRpb25fbW9kZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2NvbnRyb2xfc3RhdGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgZW5jcnlwdGlvbl9tb2RlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBlbmNyeXB0aW9uX21vZGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX0VOQ1JZUFRJT05fTU9ERSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuY3J5cHRpb25fbW9kZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX2dlbV9wb3J0LCBlbmNyeXB0aW9uX21vZGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fZ2VtX3BvcnQsIGVuY3J5cHRpb25fbW9kZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnVwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfdXNfZ2VtX3BvcnRfZGVzdGluYXRpb24gdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3VzX2dlbV9wb3J0X2Rlc3RpbmF0aW9uKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fZ2VtX3BvcnQsIHVwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCB1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfVVBTVFJFQU1fREVTVElOQVRJT05fUVVFVUUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX2dlbV9wb3J0LCB1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9nZW1fcG9ydCwgdXBzdHJlYW1fZGVzdGluYXRpb25fcXVldWUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5jb250cm9sIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfY29udHJvbF9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBjb250cm9sLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2dlbV9wb3J0LCBjb250cm9sLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9DT05UUk9MLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY29udHJvbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX2dlbV9wb3J0LCBjb250cm9sKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX2dlbV9wb3J0LCBjb250cm9sKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9nZW1fcG9ydCwgY29uZmlndXJhdGlvbikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX2dlbV9wb3J0LCBvbnVfaWQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9nZW1fcG9ydCwgZ2VtX3BvcnRfc3RhdGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9nZW1fcG9ydCwgZW5jcnlwdGlvbl9tb2RlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fZ2VtX3BvcnQsIHVwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fZ2VtX3BvcnQsIGNvbnRyb2wpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fZ2VtX3BvcnQsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fZ2VtX3BvcnQsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fZ2VtX3BvcnRfc3RhdF9nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXQgc3RhdDsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgfTsgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDsgICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgJ2NsZWFyIG9uIHJlYWQnIGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0IHN0YXQ7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGNsZWFyX29uX3JlYWQ7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ2VtX3BvcnRfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5nZW1fcG9ydF9pZCA9IChiY21vbHRfeGdwb25fZ2VtX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImdlbV9wb3J0X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5nZW1fcG9ydF9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9LRVlfSURfR0VNX1BPUlRfSUQsICZrZXkuZ2VtX3BvcnRfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgZmxhZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjbGVhciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY2xlYXJfb25fcmVhZCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjbGVhciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJjbGVhcl9vbl9yZWFkID0gJXM7XG4iLCAoY2xlYXJfb25fcmVhZCkgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfU1RBVF9JTklUKCZzdGF0LCB4Z3Bvbl9nZW1fcG9ydCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9JTklUKCZzdGF0LCB4Z3Bvbl9nZW1fcG9ydCwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9ieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9nZW1fcG9ydCwgdHhfYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX2dlbV9wb3J0LCB0eF9ieXRlcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfcGFja2V0cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9nZW1fcG9ydCwgdHhfcGFja2V0cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fZ2VtX3BvcnQsIHR4X3BhY2tldHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3BhY2tldHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fZ2VtX3BvcnQsIHJ4X3BhY2tldHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX2dlbV9wb3J0LCByeF9wYWNrZXRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9ieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9nZW1fcG9ydCwgcnhfYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX2dlbV9wb3J0LCByeF9ieXRlcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX2dlbV9wb3J0LCB0eF9ieXRlcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9nZW1fcG9ydCwgdHhfcGFja2V0cykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9nZW1fcG9ydCwgcnhfcGFja2V0cykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9nZW1fcG9ydCwgcnhfYnl0ZXMpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX2dlbV9wb3J0LCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9nZW1fcG9ydCwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9nZXQoZGV2aWNlX2lkLCAmc3RhdC5oZHIsIGNsZWFyX29uX3JlYWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZzdGF0Lmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXQuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmcgc3RhdF9jZmc7ICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgfTsgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9pZCBzdGF0X2lkOyAgICAgIC8qKjwgZGVjbGFyZSBzdGF0IElEICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdlbV9wb3J0X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZ2VtX3BvcnRfaWQgPSAoYmNtb2x0X3hncG9uX2dlbV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJnZW1fcG9ydF9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZ2VtX3BvcnRfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfS0VZX0lEX0dFTV9QT1JUX0lELCAma2V5LmdlbV9wb3J0X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IElEIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBzdGF0X2lkID0gKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgc3dpdGNoIChzdGF0X2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9JRF9UWF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fZ2VtX3BvcnQsIHR4X2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgdHhfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1RYX1BBQ0tFVFM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX2dlbV9wb3J0LCB0eF9wYWNrZXRzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgdHhfcGFja2V0cywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfSURfUlhfUEFDS0VUUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fZ2VtX3BvcnQsIHJ4X3BhY2tldHMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX2dlbV9wb3J0LCByeF9wYWNrZXRzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fZ2VtX3BvcnQsIHJ4X2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgcnhfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmc3RhdF9jZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdF9jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmcgc3RhdF9jZmc7ICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgfTsgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9pZCBzdGF0X2lkOyAgICAgIC8qKjwgZGVjbGFyZSBzdGF0IElEICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmcgc3RhdF9jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0dFTV9QT1JULCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdlbV9wb3J0X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuZ2VtX3BvcnRfaWQgPSAoYmNtb2x0X3hncG9uX2dlbV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJnZW1fcG9ydF9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuZ2VtX3BvcnRfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fR0VNX1BPUlRfS0VZX0lEX0dFTV9QT1JUX0lELCAma2V5LmdlbV9wb3J0X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IElEIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBzdGF0X2lkID0gKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgc3dpdGNoIChzdGF0X2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9JRF9UWF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fZ2VtX3BvcnQsIHR4X2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgdHhfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1RYX1BBQ0tFVFM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX2dlbV9wb3J0LCB0eF9wYWNrZXRzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgdHhfcGFja2V0cywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfSURfUlhfUEFDS0VUUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fZ2VtX3BvcnQsIHJ4X3BhY2tldHMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX2dlbV9wb3J0LCByeF9wYWNrZXRzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fZ2VtX3BvcnQsIHJ4X2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgcnhfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnR5cGUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnR5cGUgPSAoYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHZhbC50cmlnZ2VyLnR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5yaXNpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV90aHJlc2hvbGQucmlzaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5yaXNpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5mYWxsaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLmZhbGxpbmcgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmZhbGxpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9SQU5HRToKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci51cHBlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLnVwcGVyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci51cHBlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmxvd2VyIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfcmFuZ2UubG93ZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxvd2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1ZBTFVFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5saW1pdCIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS52YWx1ZV90aHJlc2hvbGQubGltaXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxpbWl0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX05PTkU6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnNvYWsuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnNvYWsuY2xlYXJfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9TVEFUX0NGR19QUk9QX1NFVCgmc3RhdF9jZmcsIHhncG9uX2dlbV9wb3J0LCBjZmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9hbGFybV9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgMCwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfQ0ZHX0lEX0NGRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgY2ZnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnIGF1dG9fY2ZnOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleSBrZXkgPSB7IH07ICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19nZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIHhncG9uX2dlbV9wb3J0LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgeGdwb25fZ2VtX3BvcnQsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9jbGVhcmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fZ2VtX3BvcnQsIHN0YXRfYWxhcm1fY2xlYXJlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgc3RhdF9hbGFybV9jbGVhcmVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX2dlbV9wb3J0LCBzdGF0X2FsYXJtX3JhaXNlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgc3RhdF9hbGFybV9yYWlzZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX2dlbV9wb3J0LCBzdGF0X2FsYXJtX2NsZWFyZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgc3RhdF9hbGFybV9yYWlzZWQpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fZ2VtX3BvcnQsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fZ2VtX3BvcnQsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmF1dG9fY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGF1dG9fY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnIGF1dG9fY2ZnOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleSBrZXkgPSB7IH07ICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9hdXRvX2NmZ19zZXQiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIHhncG9uX2dlbV9wb3J0LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgeGdwb25fZ2VtX3BvcnQsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9jbGVhcmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fZ2VtX3BvcnQsIHN0YXRfYWxhcm1fY2xlYXJlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fZ2VtX3BvcnQsIHN0YXRfYWxhcm1fY2xlYXJlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9HRU1fUE9SVCwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fcmFpc2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fZ2VtX3BvcnQsIHN0YXRfYWxhcm1fcmFpc2VkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9nZW1fcG9ydCwgc3RhdF9hbGFybV9yYWlzZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fR0VNX1BPUlQsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25faXdmX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX2l3Zl9jZmcgY2ZnOyAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX2l3Zl9rZXkga2V5ID0geyB9OyAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25faXdmX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25faXdmX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fSVdGLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX0lXRl9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX2l3Ziwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25faXdmLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVzX290YWdfZGlyZWN0X3RwaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX2l3ZiwgdXNfb3RhZ19kaXJlY3RfdHBpZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX2l3ZiwgdXNfb3RhZ19kaXJlY3RfdHBpZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZHNfdHBpZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25faXdmLCBkc190cGlkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25faXdmLCBkc190cGlkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX2l3ZiwgdXNfb3RhZ19kaXJlY3RfdHBpZCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25faXdmLCBkc190cGlkKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25faXdmLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25faXdmLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25faXdmX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX2l3Zl9jZmcgY2ZnOyAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX2l3Zl9rZXkga2V5ID0geyB9OyAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25faXdmX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25faXdmX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fSVdGLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX0lXRl9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX2l3Ziwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25faXdmLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVzX290YWdfZGlyZWN0X3RwaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25faXdmLCB1c19vdGFnX2RpcmVjdF90cGlkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2l3ZiwgdXNfb3RhZ19kaXJlY3RfdHBpZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fSVdGX0NGR19JRF9VU19PVEFHX0RJUkVDVF9UUElELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImRzX3RwaWQuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYXJyX3UxNl81X2hleCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZHNfdHBpZC5hcnIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgaTA7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXJyYXkgZHNfdHBpZC5hcnIgbXVzdCBoYXZlIDUgZWxlbWVudHNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDU7IGkwKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLmFycltpMF0gPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImRzX3RwaWQuYXJyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25faXdmLCBkc190cGlkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Fycl91MTZfNV9oZXggdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fSVdGX0NGR19JRF9EU19UUElELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25faXdmLCBkc190cGlkLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX2l3Zl9jZmdfY2xlYXIoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX2l3Zl9jZmcgY2ZnOyAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX2l3Zl9rZXkga2V5ID0geyB9OyAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25faXdmX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25faXdmX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2NsZWFyIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fSVdGX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25faXdmLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9pd2YsIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9pd2ZfY2ZnX2dldF9tdWx0aShiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnIGNmZzsgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9pd2Zfa2V5IGtleSA9IHsgfTsgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0ID0gTlVMTDsgLyoqPCBkZWNsYXJlIG1lc3NhZ2Ugc2V0ICovCisgICAgdWludDMyX3QgbWF4X21zZ3M7ICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgbWF4IG51bWJlciBvZiBtc2dzIHRvIGdldCAqLworICAgIGJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjsgICAgICAgLyoqPCBkZWNsYXJlIGZpbHRlciBpbnZlcnQgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2l3Zl9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2l3Zl9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0KiBtc2dfc2V0ID0gTlVMTDtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQzMl90IG1heF9tc2dzO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldF9tdWx0aSIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fSVdGLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX0lXRl9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX1hHUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldF9hbGxvYyhCQ01PTFRfT0JKX0lEX1hHUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25faXdmLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9pd2YsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnVzX290YWdfZGlyZWN0X3RwaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25faXdmLCB1c19vdGFnX2RpcmVjdF90cGlkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX2l3ZiwgdXNfb3RhZ19kaXJlY3RfdHBpZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9JV0YsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fSVdGX0NGR19JRF9VU19PVEFHX0RJUkVDVF9UUElELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXNfb3RhZ19kaXJlY3RfdHBpZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX2l3ZiwgdXNfb3RhZ19kaXJlY3RfdHBpZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9pd2YsIHVzX290YWdfZGlyZWN0X3RwaWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuZHNfdHBpZC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hcnJfdTE2XzVfaGV4IHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZHNfdHBpZC5hcnIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgaTA7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXJyYXkgZmlsdGVyLmRzX3RwaWQuYXJyIG11c3QgaGF2ZSA1IGVsZW1lbnRzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA1OyBpMCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZHNfdHBpZC5hcnIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9pd2YsIGRzX3RwaWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYXJyX3UxNl81X2hleCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX0lXRiwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9JV0ZfQ0ZHX0lEX0RTX1RQSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9pd2YsIGRzX3RwaWQsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkc190cGlkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25faXdmLCBkc190cGlkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX2l3ZiwgZHNfdHBpZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25faXdmLCB1c19vdGFnX2RpcmVjdF90cGlkKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25faXdmLCBkc190cGlkKSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX2l3ZiwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9pd2YsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fbmlfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9uaV9jZmcgY2ZnOyAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyB9OyAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIHVpbnQ4X3QgKmxpc3RfbWVtOyAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1lbW9yeSBidWZmZXIgZm9yIHZhcmlhYmxlLXNpemVkIGxpc3RzICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbmlfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQ4X3QqIGxpc3RfbWVtO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fTklfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9uaSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fbmksIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaHdfcG9uX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgaHdfcG9uX2lkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIGh3X3Bvbl9pZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXZhaWxhYmxlX2JhbmR3aWR0aCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIGF2YWlsYWJsZV9iYW5kd2lkdGgpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgYXZhaWxhYmxlX2JhbmR3aWR0aCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibnVtYmVyX29mX2FjdGl2ZV9vbnVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgbnVtYmVyX29mX2FjdGl2ZV9vbnVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIG51bWJlcl9vZl9hY3RpdmVfb251cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX3N0YXR1cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIHBvbl9zdGF0dXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgcG9uX3N0YXR1cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX2Rpc3RhbmNlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgcG9uX2Rpc3RhbmNlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIHBvbl9kaXN0YW5jZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ193aW5kb3dfc2l6ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIHJhbmdpbmdfd2luZG93X3NpemUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgcmFuZ2luZ193aW5kb3dfc2l6ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXFkX2N5Y2xlc19udW1iZXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBlcWRfY3ljbGVzX251bWJlcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBlcWRfY3ljbGVzX251bWJlcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZHJpZnRfY29udHJvbCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIGRyaWZ0X2NvbnRyb2wpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgZHJpZnRfY29udHJvbCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9zX2FsYXJtX3RocmVzaG9sZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIGxvc19hbGFybV90aHJlc2hvbGQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgbG9zX2FsYXJtX3RocmVzaG9sZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9zX2luaXRpYWxfdmFsdWUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBsb3NfaW5pdGlhbF92YWx1ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBsb3NfaW5pdGlhbF92YWx1ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2FsYXJtc190aHJlc2hvbGRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgb251X2FsYXJtc190aHJlc2hvbGRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIG9udV9hbGFybXNfdGhyZXNob2xkcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmVyX21vbml0b3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBiZXJfbW9uaXRvcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBiZXJfbW9uaXRvcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2FjdGl2YXRpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBvbnVfYWN0aXZhdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBvbnVfYWN0aXZhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic25fYWNxdWlzaXRpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBzbl9hY3F1aXNpdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBzbl9hY3F1aXNpdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2V5X2V4Y2hhbmdlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwga2V5X2V4Y2hhbmdlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIGtleV9leGNoYW5nZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1Zyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1Zyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIGNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBjYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBjYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG93ZXJfbWFuYWdlbWVudCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIHBvd2VyX21hbmFnZW1lbnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgcG93ZXJfbWFuYWdlbWVudCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIHJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIHBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGJhX21vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBkYmFfbW9kZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBkYmFfbW9kZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGxvYW1faGFuZGxpbmciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBwbG9hbV9oYW5kbGluZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBwbG9hbV9oYW5kbGluZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWluX2RhdGFfYWxsb2NfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBtaW5fZGF0YV9hbGxvY19pZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBtaW5fZGF0YV9hbGxvY19pZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWluX2RhdGFfZ2VtX3BvcnRfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBtaW5fZGF0YV9nZW1fcG9ydF9pZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBtaW5fZGF0YV9nZW1fcG9ydF9pZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXVsdGljYXN0X2tleSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIG11bHRpY2FzdF9rZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgbXVsdGljYXN0X2tleSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19jaGVja2VyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgcHJic19jaGVja2VyKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIHByYnNfY2hlY2tlcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19nZW5lcmF0b3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBwcmJzX2dlbmVyYXRvcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBwcmJzX2dlbmVyYXRvcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19zdGF0dXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBwcmJzX3N0YXR1cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBwcmJzX3N0YXR1cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXNfYmFuZHdpZHRoX2xpbWl0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgdXNfYmFuZHdpZHRoX2xpbWl0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIHVzX2JhbmR3aWR0aF9saW1pdCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxsX29udXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBhbGxfb251cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBhbGxfb251cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxsX21jYXN0X2dlbV9wb3J0cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIGFsbF9tY2FzdF9nZW1fcG9ydHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgYWxsX21jYXN0X2dlbV9wb3J0cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVidWciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBkZWJ1Zyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBkZWJ1Zyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3VwZ3JhZGVfcGFyYW1zIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgb251X3VwZ3JhZGVfcGFyYW1zKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIG9udV91cGdyYWRlX3BhcmFtcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZHNfZmVjX21vZGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBkc19mZWNfbW9kZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBkc19mZWNfbW9kZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGJhX3R5cGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBkYmFfdHlwZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBkYmFfdHlwZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3R1bmluZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIG9udV90dW5pbmcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9uaSwgb251X3R1bmluZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgaHdfcG9uX2lkKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgYXZhaWxhYmxlX2JhbmR3aWR0aCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fbmksIG51bWJlcl9vZl9hY3RpdmVfb251cykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fbmksIHBvbl9zdGF0dXMpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX25pLCBwb25fZGlzdGFuY2UpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX25pLCByYW5naW5nX3dpbmRvd19zaXplKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgZXFkX2N5Y2xlc19udW1iZXIpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX25pLCBkcmlmdF9jb250cm9sKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgbG9zX2FsYXJtX3RocmVzaG9sZCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fbmksIGxvc19pbml0aWFsX3ZhbHVlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgb251X2FsYXJtc190aHJlc2hvbGRzKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgYmVyX21vbml0b3IpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX25pLCBvbnVfYWN0aXZhdGlvbikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fbmksIHNuX2FjcXVpc2l0aW9uKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwga2V5X2V4Y2hhbmdlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmcpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1ZykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fbmksIGNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX25pLCBjYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fbmksIHBvd2VyX21hbmFnZW1lbnQpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX25pLCByb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX25pLCBwZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgZGJhX21vZGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX25pLCBwbG9hbV9oYW5kbGluZykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fbmksIG1pbl9kYXRhX2FsbG9jX2lkKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgbWluX2RhdGFfZ2VtX3BvcnRfaWQpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX25pLCBtdWx0aWNhc3Rfa2V5KSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcHJic19jaGVja2VyKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcHJic19nZW5lcmF0b3IpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX25pLCBwcmJzX3N0YXR1cykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fbmksIGF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgdXNfYmFuZHdpZHRoX2xpbWl0KSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgYWxsX29udXMpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX25pLCBhbGxfbWNhc3RfZ2VtX3BvcnRzKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgZGVidWcpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX25pLCBvbnVfdXBncmFkZV9wYXJhbXMpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX25pLCBkc19mZWNfbW9kZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fbmksIGRiYV90eXBlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgb251X3R1bmluZykpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX25pLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fbmksIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIHNldCBtZW1vcnkgdG8gdXNlIGZvciB2YXJpYWJsZS1zaXplZCBsaXN0cyAqLworICAgIGxpc3RfbWVtID0gYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCBBUElDTElfRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFKTsKKyAgICBpZiAobGlzdF9tZW0gPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygibGlzdF9tZW0gPSBiY21vc19jYWxsb2MoQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7XG4iKTsKKyAgICBCQ01PTFRfQ0ZHX0xJU1RfQlVGX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgbGlzdF9tZW0sIEFQSUNMSV9EWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfTElTVF9CVUZfU0VUKCZjZmcsIHhncG9uX25pLCBsaXN0X21lbSwgQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9uaV9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX25pX2NmZyBjZmc7ICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXkgPSB7IH07ICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbmlfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX05JX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fbmksIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX25pLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJod19wb25faWQuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfaHdfcG9uX2lkIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJod19wb25faWQucG9uX2lkXzEiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wb25faWRfMSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImh3X3Bvbl9pZC5wb25faWRfMSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImh3X3Bvbl9pZC5wb25faWRfMiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnBvbl9pZF8yID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiaHdfcG9uX2lkLnBvbl9pZF8yIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGh3X3Bvbl9pZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9od19wb25faWQgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfSFdfUE9OX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGh3X3Bvbl9pZCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJwb25fZGlzdGFuY2UuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcG9uX2Rpc3RhbmNlIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fZGlzdGFuY2UubWF4X2xvZ19kaXN0YW5jZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1heF9sb2dfZGlzdGFuY2UgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fZGlzdGFuY2UubWF4X2xvZ19kaXN0YW5jZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9kaXN0YW5jZS5tYXhfZGlmZl9yZWFjaCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1heF9kaWZmX3JlYWNoID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX2Rpc3RhbmNlLm1heF9kaWZmX3JlYWNoIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHBvbl9kaXN0YW5jZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wb25fZGlzdGFuY2UgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUE9OX0RJU1RBTkNFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHBvbl9kaXN0YW5jZSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVxZF9jeWNsZXNfbnVtYmVyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBlcWRfY3ljbGVzX251bWJlciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgZXFkX2N5Y2xlc19udW1iZXIsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0VRRF9DWUNMRVNfTlVNQkVSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImRyaWZ0X2NvbnRyb2wuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcG9uX2RyaWZ0X2NvbnRyb2wgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRyaWZ0X2NvbnRyb2wuZHJpZnRfaW50ZXJ2YWwiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kcmlmdF9pbnRlcnZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImRyaWZ0X2NvbnRyb2wuZHJpZnRfaW50ZXJ2YWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkcmlmdF9jb250cm9sLmRyaWZ0X2xpbWl0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZHJpZnRfbGltaXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJkcmlmdF9jb250cm9sLmRyaWZ0X2xpbWl0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZHJpZnRfY29udHJvbC50cmFuc21pc3Npb25fY29udHJvbF9saW1pdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRyYW5zbWlzc2lvbl9jb250cm9sX2xpbWl0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZHJpZnRfY29udHJvbC50cmFuc21pc3Npb25fY29udHJvbF9saW1pdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBkcmlmdF9jb250cm9sLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RSSUZUX0NPTlRST0wsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgZHJpZnRfY29udHJvbCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvc19hbGFybV90aHJlc2hvbGQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgbG9zX2FsYXJtX3RocmVzaG9sZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgbG9zX2FsYXJtX3RocmVzaG9sZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTE9TX0FMQVJNX1RIUkVTSE9MRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvc19pbml0aWFsX3ZhbHVlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc3RhdHVzIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgbG9zX2luaXRpYWxfdmFsdWUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGxvc19pbml0aWFsX3ZhbHVlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9MT1NfSU5JVElBTF9WQUxVRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJvbnVfYWxhcm1zX3RocmVzaG9sZHMuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fb251X2FsYXJtc190aHJlc2hvbGRzIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfYWxhcm1zX3RocmVzaG9sZHMubG9zaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvc2kgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfYWxhcm1zX3RocmVzaG9sZHMubG9zaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9hbGFybXNfdGhyZXNob2xkcy5sb2JpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9iaSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9hbGFybXNfdGhyZXNob2xkcy5sb2JpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2FsYXJtc190aHJlc2hvbGRzLmxvb2NpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9vY2kgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfYWxhcm1zX3RocmVzaG9sZHMubG9vY2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfYWxhcm1zX3RocmVzaG9sZHMubG9wY2kiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb3BjaSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9hbGFybXNfdGhyZXNob2xkcy5sb3BjaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBvbnVfYWxhcm1zX3RocmVzaG9sZHMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fb251X2FsYXJtc190aHJlc2hvbGRzIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX09OVV9BTEFSTVNfVEhSRVNIT0xEUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBvbnVfYWxhcm1zX3RocmVzaG9sZHMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiYmVyX21vbml0b3IuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYmVyX21vbml0b3JfcGFyYW1zIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiZXJfbW9uaXRvci51c19iZXJfaW50ZXJ2YWwiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC51c19iZXJfaW50ZXJ2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiZXJfbW9uaXRvci51c19iZXJfaW50ZXJ2YWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiZXJfbW9uaXRvci5zZl90aHJlc2hvbGQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zZl90aHJlc2hvbGQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiZXJfbW9uaXRvci5zZl90aHJlc2hvbGQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiZXJfbW9uaXRvci5zZF90aHJlc2hvbGQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zZF90aHJlc2hvbGQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJiZXJfbW9uaXRvci5zZF90aHJlc2hvbGQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgYmVyX21vbml0b3IsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYmVyX21vbml0b3JfcGFyYW1zIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0JFUl9NT05JVE9SLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGJlcl9tb25pdG9yLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgIm9udV9hY3RpdmF0aW9uLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX29udV9hY3RpdmF0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfYWN0aXZhdGlvbi5rZXlfZXhjaGFuZ2UiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5rZXlfZXhjaGFuZ2UgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfYWN0aXZhdGlvbi5rZXlfZXhjaGFuZ2UgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfYWN0aXZhdGlvbi5mYWlsX2R1ZV90b19yZWdpc19hdXRvX2ZhaWwiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5mYWlsX2R1ZV90b19yZWdpc19hdXRvX2ZhaWwgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfYWN0aXZhdGlvbi5mYWlsX2R1ZV90b19yZWdpc19hdXRvX2ZhaWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgb251X2FjdGl2YXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fb251X2FjdGl2YXRpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX0FDVElWQVRJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgb251X2FjdGl2YXRpb24sIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAic25fYWNxdWlzaXRpb24uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fc25fYWNxdWlzaXRpb24gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNuX2FjcXVpc2l0aW9uLmludGVydmFsIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaW50ZXJ2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzbl9hY3F1aXNpdGlvbi5pbnRlcnZhbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNuX2FjcXVpc2l0aW9uLmNvbnRyb2wiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jb250cm9sID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic25fYWNxdWlzaXRpb24uY29udHJvbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNuX2FjcXVpc2l0aW9uLm9udV9wb3N0X2Rpc2NvdmVyeV9tb2RlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwub251X3Bvc3RfZGlzY292ZXJ5X21vZGUgPSAoYmNtb2x0X29udV9wb3N0X2Rpc2NvdmVyeV9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic25fYWNxdWlzaXRpb24ub251X3Bvc3RfZGlzY292ZXJ5X21vZGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzbl9hY3F1aXNpdGlvbi5idXJzdF9wcm9maWxlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYnVyc3RfcHJvZmlsZSA9IChiY21vbHRfYnVyc3RfcHJvZmlsZV9pbmRleCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic25fYWNxdWlzaXRpb24uYnVyc3RfcHJvZmlsZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBzbl9hY3F1aXNpdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9zbl9hY3F1aXNpdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9TTl9BQ1FVSVNJVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBzbl9hY3F1aXNpdGlvbiwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJrZXlfZXhjaGFuZ2UuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fa2V5X2V4Y2hhbmdlIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXlfZXhjaGFuZ2UuaW50ZXJ2YWwiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pbnRlcnZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImtleV9leGNoYW5nZS5pbnRlcnZhbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImtleV9leGNoYW5nZS5jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY29udHJvbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImtleV9leGNoYW5nZS5jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2V5X2V4Y2hhbmdlLmVuY3J5cHRlZF9wb3J0c19vbmx5Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZW5jcnlwdGVkX3BvcnRzX29ubHkgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJrZXlfZXhjaGFuZ2UuZW5jcnlwdGVkX3BvcnRzX29ubHkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwga2V5X2V4Y2hhbmdlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2tleV9leGNoYW5nZSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9LRVlfRVhDSEFOR0UsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwga2V5X2V4Y2hhbmdlLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcm90ZWN0aW9uX3N3aXRjaGluZy50aW1lb3V0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudGltZW91dCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByb3RlY3Rpb25fc3dpdGNoaW5nLnRpbWVvdXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcm90ZWN0aW9uX3N3aXRjaGluZy5ncGlvX3BpbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmdwaW9fcGluID0gKGJjbW9sdF9ncGlvX3BpbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByb3RlY3Rpb25fc3dpdGNoaW5nLmdwaW9fcGluIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmcuZmFzdF9yYW5naW5nIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZmFzdF9yYW5naW5nID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcm90ZWN0aW9uX3N3aXRjaGluZy5mYXN0X3JhbmdpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnLmRhdGFfbWFwX2RlbGF5X21zIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZGF0YV9tYXBfZGVsYXlfbXMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1Zy5kYXRhX21hcF9kZWxheV9tcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnLnJlcmFuZ2Vfc2VuZF9yYW5naW5nX3RpbWUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5yZXJhbmdlX3NlbmRfcmFuZ2luZ190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1Zy5yZXJhbmdlX3NlbmRfcmFuZ2luZ190aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWcucmVyYW5nZV9zZW5kX3JhbmdpbmdfdGltZV9kZWxheSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJlcmFuZ2Vfc2VuZF9yYW5naW5nX3RpbWVfZGVsYXkgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1Zy5yZXJhbmdlX3NlbmRfcmFuZ2luZ190aW1lX2RlbGF5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX0RFQlVHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZS5tYV83Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWFfNyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUubWFfNyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUubWFfMyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1hXzMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLm1hXzMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLm1hXzEiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tYV8xID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZS5tYV8xIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9DQlJfUlRfQUxMT0NBVElPTl9QUk9GSUxFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYXJyX3UxNl8yIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZS5hcnIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgaTA7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXJyYXkgY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUuYXJyIG11c3QgaGF2ZSAyIGVsZW1lbnRzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCAyOyBpMCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZS5hcnIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYXJyX3UxNl8yIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0NCUl9OUlRfQUxMT0NBVElPTl9QUk9GSUxFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInBvd2VyX21hbmFnZW1lbnQuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG93ZXJfbWFuYWdlbWVudC5pbG93cG93ZXIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pbG93cG93ZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb3dlcl9tYW5hZ2VtZW50Lmlsb3dwb3dlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvd2VyX21hbmFnZW1lbnQuaWF3YXJlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaWF3YXJlID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG93ZXJfbWFuYWdlbWVudC5pYXdhcmUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb3dlcl9tYW5hZ2VtZW50Lml0cmFuc2luaXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pdHJhbnNpbml0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG93ZXJfbWFuYWdlbWVudC5pdHJhbnNpbml0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG93ZXJfbWFuYWdlbWVudC5pdHhpbml0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaXR4aW5pdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvd2VyX21hbmFnZW1lbnQuaXR4aW5pdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvd2VyX21hbmFnZW1lbnQuaXJ4b2ZmIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaXJ4b2ZmID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG93ZXJfbWFuYWdlbWVudC5pcnhvZmYgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb3dlcl9tYW5hZ2VtZW50Lmxvd19wb3dlcl9jbG9iaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvd19wb3dlcl9jbG9iaSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvd2VyX21hbmFnZW1lbnQubG93X3Bvd2VyX2Nsb2JpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHBvd2VyX21hbmFnZW1lbnQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QT1dFUl9NQU5BR0VNRU5ULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHBvd2VyX21hbmFnZW1lbnQsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3JvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmNvbnRyb2wiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jb250cm9sID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmNvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFsZ29yaXRobV90eXBlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS5hbGdvcml0aG1fdHlwZSA9IChiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFsZ29yaXRobV90eXBlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAodmFsLmRldGVjdGlvbl9hbGdvcml0aG0uYWxnb3JpdGhtX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfUk9HVUVfREVURUNUSU9OX0FMR09SSVRITV9UWVBFX0VBUkxZX1JPR1VFX0RFVEVDVElPTjoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5tZWFzdXJlbWVudF90eXBlIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LmVhcmx5X3JvZ3VlX2RldGVjdGlvbi5tZWFzdXJlbWVudF90eXBlID0gKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93KSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0ubWVhc3VyZW1lbnRfdHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmludGVydmFsIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LmVhcmx5X3JvZ3VlX2RldGVjdGlvbi5pbnRlcnZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmludGVydmFsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uc2Vjb25kX3Jhbmdpbmdfd2luZG93Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LmVhcmx5X3JvZ3VlX2RldGVjdGlvbi5zZWNvbmRfcmFuZ2luZ193aW5kb3cgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLnNlY29uZF9yYW5naW5nX3dpbmRvdyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFsbG9jX3R5cGVfdG9fc2NhbiIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24uYWxsb2NfdHlwZV90b19zY2FuID0gKGJjbW9sdF9hbGxvY190eXBlX3RvX3NjYW4pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hbGxvY190eXBlX3RvX3NjYW4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9BTEdPUklUSE1fVFlQRV9TUEVDSUFMX01BUDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWNjZXNzZXMuIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGkxOworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy52YWwgPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIGNsaV9wYXJtLT5hcnJheV9zaXplICogc2l6ZW9mKCp2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLnZhbCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMudmFsID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLmxlbiA9IGNsaV9wYXJtLT5hcnJheV9zaXplOworICAgICAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hY2Nlc3Nlcy5wbG9fc2l6ZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMubGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLnBsb19zaXplIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy5sZW47IGkxKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLnZhbFtpMV0ucGxvX3NpemUgPSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hY2Nlc3Nlcy5hbGxvY19pZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMubGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLmFsbG9jX2lkIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy5sZW47IGkxKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLnZhbFtpMV0uYWxsb2NfaWQgPSAoYmNtb2x0X3Bvbl9hbGxvY19pZCkgY2xpX3Bhcm0tPnZhbHVlc1tpMV0udW51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWNjZXNzZXMub251X2lkIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy5sZW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWNjZXNzZXMub251X2lkIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy5sZW47IGkxKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLnZhbFtpMV0ub251X2lkID0gKGJjbW9sdF9wb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hY2Nlc3Nlcy5hY2Nlc3Nfc2l6ZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMubGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLmFjY2Vzc19zaXplIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy5sZW47IGkxKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLnZhbFtpMV0uYWNjZXNzX3NpemUgPSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hY2Nlc3NlcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfUk9HVUVfREVURUNUSU9OX0FMR09SSVRITV9UWVBFX0VYVEVOREVEX0dVQVJEX1RJTUU6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWRkaXRpb25hbF9ndWFyZF90aW1lIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LmV4dGVuZGVkX2d1YXJkX3RpbWUuYWRkaXRpb25hbF9ndWFyZF90aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWRkaXRpb25hbF9ndWFyZF90aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUk9HVUVfT05VX0RFVEVDVElPTl9QUk9DRVNTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJwZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcuaW50ZXJ2YWwiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pbnRlcnZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcuaW50ZXJ2YWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nLmNvbnRyb2wiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jb250cm9sID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZy5jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QRVJJT0RJQ19TVEFOREJZX1BPTl9NT05JVE9SSU5HLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkYmFfbW9kZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2RiYV9tb2RlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9kYmFfbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBkYmFfbW9kZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgZGJhX21vZGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RCQV9NT0RFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInBsb2FtX2hhbmRsaW5nLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwbG9hbV9oYW5kbGluZy5hY2tfdGltZW91dCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFja190aW1lb3V0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicGxvYW1faGFuZGxpbmcuYWNrX3RpbWVvdXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwbG9hbV9oYW5kbGluZy5yZXRyYW5zX3JhbmdpbmdfdGltZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJldHJhbnNfcmFuZ2luZ190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicGxvYW1faGFuZGxpbmcucmV0cmFuc19yYW5naW5nX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwbG9hbV9oYW5kbGluZy5yZXRyYW5zX2Fzc2lnbl9hbGxvY19pZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJldHJhbnNfYXNzaWduX2FsbG9jX2lkID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicGxvYW1faGFuZGxpbmcucmV0cmFuc19hc3NpZ25fYWxsb2NfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwbG9hbV9oYW5kbGluZy5yZXRyYW5zX2tleV9jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmV0cmFuc19rZXlfY29udHJvbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBsb2FtX2hhbmRsaW5nLnJldHJhbnNfa2V5X2NvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwbG9hbV9oYW5kbGluZy5yZXRyYW5zX3JlcXVlc3RfcmVnaXN0cmF0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmV0cmFuc19yZXF1ZXN0X3JlZ2lzdHJhdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBsb2FtX2hhbmRsaW5nLnJldHJhbnNfcmVxdWVzdF9yZWdpc3RyYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcGxvYW1faGFuZGxpbmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fcGxvYW1faGFuZGxpbmcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUExPQU1fSEFORExJTkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcGxvYW1faGFuZGxpbmcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtaW5fZGF0YV9hbGxvY19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX2FsbG9jX2lkIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF94Z3Bvbl9hbGxvY19pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIG1pbl9kYXRhX2FsbG9jX2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBtaW5fZGF0YV9hbGxvY19pZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTUlOX0RBVEFfQUxMT0NfSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtaW5fZGF0YV9nZW1fcG9ydF9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX2dlbV9pZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfeGdwb25fZ2VtX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgbWluX2RhdGFfZ2VtX3BvcnRfaWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIG1pbl9kYXRhX2dlbV9wb3J0X2lkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9NSU5fREFUQV9HRU1fUE9SVF9JRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJtdWx0aWNhc3Rfa2V5LiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX211bHRpY2FzdF9rZXkgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJtdWx0aWNhc3Rfa2V5LmtleS4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXVsdGljYXN0X2tleS5rZXkuYnl0ZXMiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSAxNikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgbXVsdGljYXN0X2tleS5rZXkuYnl0ZXMgbXVzdCBoYXZlIDE2IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLmtleS5ieXRlcywgMTYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtdWx0aWNhc3Rfa2V5LmtleS5ieXRlcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm11bHRpY2FzdF9rZXkua2V5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXVsdGljYXN0X2tleS5rZXlfY29udHJvbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmtleV9jb250cm9sID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtdWx0aWNhc3Rfa2V5LmtleV9jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIG11bHRpY2FzdF9rZXksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbXVsdGljYXN0X2tleSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9NVUxUSUNBU1RfS0VZLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIG11bHRpY2FzdF9rZXksIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicHJic19jaGVja2VyLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfY2hlY2tlci5wb2x5bm9tIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucG9seW5vbSA9IChiY21vbHRfcHJic19wb2x5bm9taWFsKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19jaGVja2VyLnBvbHlub20gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2NoZWNrZXIubW9kZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1vZGUgPSAoYmNtb2x0X3ByYnNfY2hlY2tlcl9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19jaGVja2VyLm1vZGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2NoZWNrZXIuZGF0YV9pbnZlcnQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kYXRhX2ludmVydCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19jaGVja2VyLmRhdGFfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19jaGVja2VyLmNvbnRyb2wiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jb250cm9sID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19jaGVja2VyLmNvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcHJic19jaGVja2VyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJCU19DSEVDS0VSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHByYnNfY2hlY2tlciwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJwcmJzX2dlbmVyYXRvci4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfZ2VuZXJhdG9yLnBvbHlub20iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wb2x5bm9tID0gKGJjbW9sdF9wcmJzX3BvbHlub21pYWwpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcmJzX2dlbmVyYXRvci5wb2x5bm9tIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19nZW5lcmF0b3IuZXJyb3JfaW5zZXJ0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZXJyb3JfaW5zZXJ0ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwcmJzX2dlbmVyYXRvci5lcnJvcl9pbnNlcnQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcmJzX2dlbmVyYXRvci5pbnZlcnQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pbnZlcnQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInByYnNfZ2VuZXJhdG9yLmludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfZ2VuZXJhdG9yLmNvbnRyb2wiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jb250cm9sID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicHJic19nZW5lcmF0b3IuY29udHJvbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBwcmJzX2dlbmVyYXRvciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJCU19HRU5FUkFUT1IsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcHJic19nZW5lcmF0b3IsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLmxvcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvcyA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24ubG9zIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24ub251X2FsYXJtcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm9udV9hbGFybXMgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLm9udV9hbGFybXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi50aXdpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudGl3aSA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24udGl3aSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLmFja190aW1lb3V0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWNrX3RpbWVvdXQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLmFja190aW1lb3V0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24uc2ZpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc2ZpID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi5zZmkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi5sb2tpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9raSA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24ubG9raSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9BVVRPTUFUSUNfT05VX0RFQUNUSVZBVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInVzX2JhbmR3aWR0aF9saW1pdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgdXNfYmFuZHdpZHRoX2xpbWl0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCB1c19iYW5kd2lkdGhfbGltaXQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1VTX0JBTkRXSURUSF9MSU1JVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJkZWJ1Zy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9uaV9kZWJ1ZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVidWcuaW5jcmVhc2VfYXZhaWxhYmxlX2Nicl9idyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmluY3JlYXNlX2F2YWlsYWJsZV9jYnJfYncgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImRlYnVnLmluY3JlYXNlX2F2YWlsYWJsZV9jYnJfYncgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWJ1Zy5pbnRlcl9idXJzdF9nYXBfaW5fYnl0ZXMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pbnRlcl9idXJzdF9nYXBfaW5fYnl0ZXMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJkZWJ1Zy5pbnRlcl9idXJzdF9nYXBfaW5fYnl0ZXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWJ1Zy5udW1iZXJfb2ZfZ2VtX3BvcnRzX3Blcl9vbnUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5udW1iZXJfb2ZfZ2VtX3BvcnRzX3Blcl9vbnUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJkZWJ1Zy5udW1iZXJfb2ZfZ2VtX3BvcnRzX3Blcl9vbnUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgZGVidWcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbmlfZGVidWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfREVCVUcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgZGVidWcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAib251X3VwZ3JhZGVfcGFyYW1zLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfdXBncmFkZV9wYXJhbXMucmVzcG9uc2VfdGltZW91dF9tcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJlc3BvbnNlX3RpbWVvdXRfbXMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfdXBncmFkZV9wYXJhbXMucmVzcG9uc2VfdGltZW91dF9tcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV91cGdyYWRlX3BhcmFtcy5tYXhfcmV0cnlfY291bnQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tYXhfcmV0cnlfY291bnQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfdXBncmFkZV9wYXJhbXMubWF4X3JldHJ5X2NvdW50IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3VwZ3JhZGVfcGFyYW1zLm9tY2lfZm9ybWF0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwub21jaV9mb3JtYXQgPSAoYmNtb2x0X29tY2lfZGV2aWNlX2lkKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X3VwZ3JhZGVfcGFyYW1zLm9tY2lfZm9ybWF0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3VwZ3JhZGVfcGFyYW1zLndpbmRvd19zaXplIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwud2luZG93X3NpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfdXBncmFkZV9wYXJhbXMud2luZG93X3NpemUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfdXBncmFkZV9wYXJhbXMuYWN0aXZhdGVfY29tbWl0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWN0aXZhdGVfY29tbWl0ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfdXBncmFkZV9wYXJhbXMuYWN0aXZhdGVfY29tbWl0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3VwZ3JhZGVfcGFyYW1zLmRlbGF5X2Zvcl9jb21taXRfbXMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kZWxheV9mb3JfY29tbWl0X21zID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X3VwZ3JhZGVfcGFyYW1zLmRlbGF5X2Zvcl9jb21taXRfbXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfdXBncmFkZV9wYXJhbXMubWF4X2FjdGl2YXRpb25fYXR0ZW1wdHMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tYXhfYWN0aXZhdGlvbl9hdHRlbXB0cyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV91cGdyYWRlX3BhcmFtcy5tYXhfYWN0aXZhdGlvbl9hdHRlbXB0cyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBvbnVfdXBncmFkZV9wYXJhbXMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9wYXJhbXMgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX1VQR1JBREVfUEFSQU1TLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIG9udV91cGdyYWRlX3BhcmFtcywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRzX2ZlY19tb2RlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfY29udHJvbF9zdGF0ZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBkc19mZWNfbW9kZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgZHNfZmVjX21vZGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RTX0ZFQ19NT0RFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGJhX3R5cGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9kYmFfdHlwZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfZGJhX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgZGJhX3R5cGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGRiYV90eXBlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EQkFfVFlQRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJvbnVfdHVuaW5nLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X29udV90dW5pbmdfY29uZmlndXJhdGlvbiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3R1bmluZy50c291cmNlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudHNvdXJjZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV90dW5pbmcudHNvdXJjZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV90dW5pbmcudHRhcmdldCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnR0YXJnZXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfdHVuaW5nLnR0YXJnZXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfdHVuaW5nLnJlcXVlc3RfcmVnaXN0cmF0aW9uX3JlcXVpcmVkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmVxdWVzdF9yZWdpc3RyYXRpb25fcmVxdWlyZWQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV90dW5pbmcucmVxdWVzdF9yZWdpc3RyYXRpb25fcmVxdWlyZWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgb251X3R1bmluZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9vbnVfdHVuaW5nX2NvbmZpZ3VyYXRpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX1RVTklORywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBvbnVfdHVuaW5nLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX25pX2NmZ19jbGVhcihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fbmlfY2ZnIGNmZzsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2NsZWFyIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9OSV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX25pLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9uaSwga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX25pX2NmZ19nZXRfbXVsdGkoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fbmlfY2ZnIGNmZzsgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfbXNnX3NldCAqbXNnX3NldCA9IE5VTEw7IC8qKjwgZGVjbGFyZSBtZXNzYWdlIHNldCAqLworICAgIHVpbnQzMl90IG1heF9tc2dzOyAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgIC8qKjwgZGVjbGFyZSBmaWx0ZXIgaW52ZXJ0IGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X21zZ19zZXQqIG1zZ19zZXQgPSBOVUxMO1xuIik7CisgICAgYmNtY2xpX2xvZygidWludDMyX3QgbWF4X21zZ3M7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vc19ib29sIGludmVydF9maWx0ZXI7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0X211bHRpIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9OSV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX25pLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9uaSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmh3X3Bvbl9pZC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9od19wb25faWQgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5od19wb25faWQucG9uX2lkXzEiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wb25faWRfMSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5od19wb25faWQucG9uX2lkXzEgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuaHdfcG9uX2lkLnBvbl9pZF8yIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucG9uX2lkXzIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuaHdfcG9uX2lkLnBvbl9pZF8yIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGh3X3Bvbl9pZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9od19wb25faWQgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfSFdfUE9OX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGh3X3Bvbl9pZCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImh3X3Bvbl9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBod19wb25faWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIGh3X3Bvbl9pZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5hdmFpbGFibGVfYmFuZHdpZHRoLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Bvbl9hdmFpbGFibGVfYmFuZHdpZHRoIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYXZhaWxhYmxlX2JhbmR3aWR0aC5jYnJfYnciKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jYnJfYncgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYXZhaWxhYmxlX2JhbmR3aWR0aC5jYnJfYncgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYXZhaWxhYmxlX2JhbmR3aWR0aC50b3RhbF9idyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRvdGFsX2J3ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmF2YWlsYWJsZV9iYW5kd2lkdGgudG90YWxfYncgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYXZhaWxhYmxlX2JhbmR3aWR0aC5uZXh0X29udV90b3RhbF9idyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm5leHRfb251X3RvdGFsX2J3ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmF2YWlsYWJsZV9iYW5kd2lkdGgubmV4dF9vbnVfdG90YWxfYncgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgYXZhaWxhYmxlX2JhbmR3aWR0aCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wb25fYXZhaWxhYmxlX2JhbmR3aWR0aCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9BVkFJTEFCTEVfQkFORFdJRFRILCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGF2YWlsYWJsZV9iYW5kd2lkdGgsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhdmFpbGFibGVfYmFuZHdpZHRoIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIGF2YWlsYWJsZV9iYW5kd2lkdGgpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIGF2YWlsYWJsZV9iYW5kd2lkdGgpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5udW1iZXJfb2ZfYWN0aXZlX29udXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIG51bWJlcl9vZl9hY3RpdmVfb251cywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgbnVtYmVyX29mX2FjdGl2ZV9vbnVzLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9OVU1CRVJfT0ZfQUNUSVZFX09OVVMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJudW1iZXJfb2ZfYWN0aXZlX29udXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgbnVtYmVyX29mX2FjdGl2ZV9vbnVzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBudW1iZXJfb2ZfYWN0aXZlX29udXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucG9uX3N0YXR1cy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wb25fc3RhdHVzIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucG9uX3N0YXR1cy5zdGF0ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnN0YXRlID0gKGJjbW9sdF9wb25fc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucG9uX3N0YXR1cy5zdGF0ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wb25fc3RhdHVzLmxvc19zdGF0dXMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb3Nfc3RhdHVzID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucG9uX3N0YXR1cy5sb3Nfc3RhdHVzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHBvbl9zdGF0dXMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcG9uX3N0YXR1cyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QT05fU1RBVFVTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHBvbl9zdGF0dXMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fc3RhdHVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIHBvbl9zdGF0dXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIHBvbl9zdGF0dXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucG9uX2Rpc3RhbmNlLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Bvbl9kaXN0YW5jZSB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnBvbl9kaXN0YW5jZS5tYXhfbG9nX2Rpc3RhbmNlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWF4X2xvZ19kaXN0YW5jZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wb25fZGlzdGFuY2UubWF4X2xvZ19kaXN0YW5jZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wb25fZGlzdGFuY2UubWF4X2RpZmZfcmVhY2giKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tYXhfZGlmZl9yZWFjaCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wb25fZGlzdGFuY2UubWF4X2RpZmZfcmVhY2ggaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcG9uX2Rpc3RhbmNlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Bvbl9kaXN0YW5jZSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QT05fRElTVEFOQ0UsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcG9uX2Rpc3RhbmNlLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX2Rpc3RhbmNlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIHBvbl9kaXN0YW5jZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgcG9uX2Rpc3RhbmNlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucmFuZ2luZ193aW5kb3dfc2l6ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcmFuZ2luZ193aW5kb3dfc2l6ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcmFuZ2luZ193aW5kb3dfc2l6ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUkFOR0lOR19XSU5ET1dfU0laRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfd2luZG93X3NpemUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgcmFuZ2luZ193aW5kb3dfc2l6ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgcmFuZ2luZ193aW5kb3dfc2l6ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVxZF9jeWNsZXNfbnVtYmVyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBlcWRfY3ljbGVzX251bWJlciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgZXFkX2N5Y2xlc19udW1iZXIsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0VRRF9DWUNMRVNfTlVNQkVSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXFkX2N5Y2xlc19udW1iZXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgZXFkX2N5Y2xlc19udW1iZXIpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIGVxZF9jeWNsZXNfbnVtYmVyKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmRyaWZ0X2NvbnRyb2wuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcG9uX2RyaWZ0X2NvbnRyb2wgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kcmlmdF9jb250cm9sLmRyaWZ0X2ludGVydmFsIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZHJpZnRfaW50ZXJ2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZHJpZnRfY29udHJvbC5kcmlmdF9pbnRlcnZhbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kcmlmdF9jb250cm9sLmRyaWZ0X2xpbWl0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZHJpZnRfbGltaXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZHJpZnRfY29udHJvbC5kcmlmdF9saW1pdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kcmlmdF9jb250cm9sLnRyYW5zbWlzc2lvbl9jb250cm9sX2xpbWl0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudHJhbnNtaXNzaW9uX2NvbnRyb2xfbGltaXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZHJpZnRfY29udHJvbC50cmFuc21pc3Npb25fY29udHJvbF9saW1pdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBkcmlmdF9jb250cm9sLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RSSUZUX0NPTlRST0wsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgZHJpZnRfY29udHJvbCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRyaWZ0X2NvbnRyb2wiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgZHJpZnRfY29udHJvbCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgZHJpZnRfY29udHJvbCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxvc19hbGFybV90aHJlc2hvbGQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgbG9zX2FsYXJtX3RocmVzaG9sZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgbG9zX2FsYXJtX3RocmVzaG9sZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTE9TX0FMQVJNX1RIUkVTSE9MRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvc19hbGFybV90aHJlc2hvbGQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgbG9zX2FsYXJtX3RocmVzaG9sZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgbG9zX2FsYXJtX3RocmVzaG9sZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmxvc19pbml0aWFsX3ZhbHVlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc3RhdHVzIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgbG9zX2luaXRpYWxfdmFsdWUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGxvc19pbml0aWFsX3ZhbHVlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9MT1NfSU5JVElBTF9WQUxVRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImxvc19pbml0aWFsX3ZhbHVlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIGxvc19pbml0aWFsX3ZhbHVlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBsb3NfaW5pdGlhbF92YWx1ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5vbnVfYWxhcm1zX3RocmVzaG9sZHMuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fb251X2FsYXJtc190aHJlc2hvbGRzIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X2FsYXJtc190aHJlc2hvbGRzLmxvc2kiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb3NpID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9udV9hbGFybXNfdGhyZXNob2xkcy5sb3NpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9udV9hbGFybXNfdGhyZXNob2xkcy5sb2JpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9iaSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vbnVfYWxhcm1zX3RocmVzaG9sZHMubG9iaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfYWxhcm1zX3RocmVzaG9sZHMubG9vY2kiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb29jaSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vbnVfYWxhcm1zX3RocmVzaG9sZHMubG9vY2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X2FsYXJtc190aHJlc2hvbGRzLmxvcGNpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9wY2kgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIub251X2FsYXJtc190aHJlc2hvbGRzLmxvcGNpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIG9udV9hbGFybXNfdGhyZXNob2xkcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX0FMQVJNU19USFJFU0hPTERTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIG9udV9hbGFybXNfdGhyZXNob2xkcywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9hbGFybXNfdGhyZXNob2xkcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBvbnVfYWxhcm1zX3RocmVzaG9sZHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIG9udV9hbGFybXNfdGhyZXNob2xkcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5iZXJfbW9uaXRvci4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9iZXJfbW9uaXRvcl9wYXJhbXMgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5iZXJfbW9uaXRvci51c19iZXJfaW50ZXJ2YWwiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC51c19iZXJfaW50ZXJ2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYmVyX21vbml0b3IudXNfYmVyX2ludGVydmFsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmJlcl9tb25pdG9yLnNmX3RocmVzaG9sZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnNmX3RocmVzaG9sZCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5iZXJfbW9uaXRvci5zZl90aHJlc2hvbGQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYmVyX21vbml0b3Iuc2RfdGhyZXNob2xkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc2RfdGhyZXNob2xkID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJlcl9tb25pdG9yLnNkX3RocmVzaG9sZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBiZXJfbW9uaXRvciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9iZXJfbW9uaXRvcl9wYXJhbXMgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQkVSX01PTklUT1IsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgYmVyX21vbml0b3IsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiZXJfbW9uaXRvciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBiZXJfbW9uaXRvcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgYmVyX21vbml0b3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIub251X2FjdGl2YXRpb24uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fb251X2FjdGl2YXRpb24gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfYWN0aXZhdGlvbi5rZXlfZXhjaGFuZ2UiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5rZXlfZXhjaGFuZ2UgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIub251X2FjdGl2YXRpb24ua2V5X2V4Y2hhbmdlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9udV9hY3RpdmF0aW9uLmZhaWxfZHVlX3RvX3JlZ2lzX2F1dG9fZmFpbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmZhaWxfZHVlX3RvX3JlZ2lzX2F1dG9fZmFpbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vbnVfYWN0aXZhdGlvbi5mYWlsX2R1ZV90b19yZWdpc19hdXRvX2ZhaWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgb251X2FjdGl2YXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fb251X2FjdGl2YXRpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX0FDVElWQVRJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgb251X2FjdGl2YXRpb24sIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfYWN0aXZhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBvbnVfYWN0aXZhdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgb251X2FjdGl2YXRpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuc25fYWNxdWlzaXRpb24uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fc25fYWNxdWlzaXRpb24gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zbl9hY3F1aXNpdGlvbi5pbnRlcnZhbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmludGVydmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnNuX2FjcXVpc2l0aW9uLmludGVydmFsIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnNuX2FjcXVpc2l0aW9uLmNvbnRyb2wiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jb250cm9sID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnNuX2FjcXVpc2l0aW9uLmNvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc25fYWNxdWlzaXRpb24ub251X3Bvc3RfZGlzY292ZXJ5X21vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5vbnVfcG9zdF9kaXNjb3ZlcnlfbW9kZSA9IChiY21vbHRfb251X3Bvc3RfZGlzY292ZXJ5X21vZGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuc25fYWNxdWlzaXRpb24ub251X3Bvc3RfZGlzY292ZXJ5X21vZGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuc25fYWNxdWlzaXRpb24uYnVyc3RfcHJvZmlsZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmJ1cnN0X3Byb2ZpbGUgPSAoYmNtb2x0X2J1cnN0X3Byb2ZpbGVfaW5kZXgpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5zbl9hY3F1aXNpdGlvbi5idXJzdF9wcm9maWxlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHNuX2FjcXVpc2l0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX3NuX2FjcXVpc2l0aW9uIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1NOX0FDUVVJU0lUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHNuX2FjcXVpc2l0aW9uLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic25fYWNxdWlzaXRpb24iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgc25fYWNxdWlzaXRpb24pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIHNuX2FjcXVpc2l0aW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmtleV9leGNoYW5nZS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9rZXlfZXhjaGFuZ2UgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5rZXlfZXhjaGFuZ2UuaW50ZXJ2YWwiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pbnRlcnZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5rZXlfZXhjaGFuZ2UuaW50ZXJ2YWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIua2V5X2V4Y2hhbmdlLmNvbnRyb2wiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jb250cm9sID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmtleV9leGNoYW5nZS5jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmtleV9leGNoYW5nZS5lbmNyeXB0ZWRfcG9ydHNfb25seSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmVuY3J5cHRlZF9wb3J0c19vbmx5ID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmtleV9leGNoYW5nZS5lbmNyeXB0ZWRfcG9ydHNfb25seSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBrZXlfZXhjaGFuZ2UsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fa2V5X2V4Y2hhbmdlIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0tFWV9FWENIQU5HRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBrZXlfZXhjaGFuZ2UsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXlfZXhjaGFuZ2UiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwga2V5X2V4Y2hhbmdlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBrZXlfZXhjaGFuZ2UpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucHJvdGVjdGlvbl9zd2l0Y2hpbmcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcm90ZWN0aW9uX3N3aXRjaGluZy50aW1lb3V0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudGltZW91dCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcm90ZWN0aW9uX3N3aXRjaGluZy50aW1lb3V0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByb3RlY3Rpb25fc3dpdGNoaW5nLmdwaW9fcGluIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZ3Bpb19waW4gPSAoYmNtb2x0X2dwaW9fcGluKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByb3RlY3Rpb25fc3dpdGNoaW5nLmdwaW9fcGluIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByb3RlY3Rpb25fc3dpdGNoaW5nLmZhc3RfcmFuZ2luZyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmZhc3RfcmFuZ2luZyA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByb3RlY3Rpb25fc3dpdGNoaW5nLmZhc3RfcmFuZ2luZyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElORywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5wcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1Zy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1ZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnLmRhdGFfbWFwX2RlbGF5X21zIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZGF0YV9tYXBfZGVsYXlfbXMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWcuZGF0YV9tYXBfZGVsYXlfbXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWcucmVyYW5nZV9zZW5kX3JhbmdpbmdfdGltZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJlcmFuZ2Vfc2VuZF9yYW5naW5nX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1Zy5yZXJhbmdlX3NlbmRfcmFuZ2luZ190aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnLnJlcmFuZ2Vfc2VuZF9yYW5naW5nX3RpbWVfZGVsYXkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5yZXJhbmdlX3NlbmRfcmFuZ2luZ190aW1lX2RlbGF5ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnLnJlcmFuZ2Vfc2VuZF9yYW5naW5nX3RpbWVfZGVsYXkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfREVCVUcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1ZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1Zyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZS5tYV83Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWFfNyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLm1hXzcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZS5tYV8zIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWFfMyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLm1hXzMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZS5tYV8xIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubWFfMSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLm1hXzEgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0NCUl9SVF9BTExPQ0FUSU9OX1BST0ZJTEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5jYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hcnJfdTE2XzIgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5jYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZS5hcnIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgaTA7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXJyYXkgZmlsdGVyLmNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlLmFyciBtdXN0IGhhdmUgMiBlbGVtZW50c1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgMjsgaTArKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXSA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlLmFyciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBjYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9hcnJfdTE2XzIgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQ0JSX05SVF9BTExPQ0FUSU9OX1BST0ZJTEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBjYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC5pbG93cG93ZXIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pbG93cG93ZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC5pbG93cG93ZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC5pYXdhcmUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pYXdhcmUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC5pYXdhcmUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC5pdHJhbnNpbml0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaXRyYW5zaW5pdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wb3dlcl9tYW5hZ2VtZW50Lml0cmFuc2luaXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC5pdHhpbml0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuaXR4aW5pdCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wb3dlcl9tYW5hZ2VtZW50Lml0eGluaXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC5pcnhvZmYiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5pcnhvZmYgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC5pcnhvZmYgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC5sb3dfcG93ZXJfY2xvYmkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb3dfcG93ZXJfY2xvYmkgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucG93ZXJfbWFuYWdlbWVudC5sb3dfcG93ZXJfY2xvYmkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcG93ZXJfbWFuYWdlbWVudCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BPV0VSX01BTkFHRU1FTlQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcG93ZXJfbWFuYWdlbWVudCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvd2VyX21hbmFnZW1lbnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgcG93ZXJfbWFuYWdlbWVudCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgcG93ZXJfbWFuYWdlbWVudCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmNvbnRyb2wiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5jb250cm9sID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFsZ29yaXRobV90eXBlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS5hbGdvcml0aG1fdHlwZSA9IChiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hbGdvcml0aG1fdHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLmFsZ29yaXRobV90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9BTEdPUklUSE1fVFlQRV9FQVJMWV9ST0dVRV9ERVRFQ1RJT046CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLm1lYXN1cmVtZW50X3R5cGUiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuZWFybHlfcm9ndWVfZGV0ZWN0aW9uLm1lYXN1cmVtZW50X3R5cGUgPSAoYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl93aW5kb3cpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0ubWVhc3VyZW1lbnRfdHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5pbnRlcnZhbCIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24uaW50ZXJ2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uaW50ZXJ2YWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uc2Vjb25kX3Jhbmdpbmdfd2luZG93Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LmVhcmx5X3JvZ3VlX2RldGVjdGlvbi5zZWNvbmRfcmFuZ2luZ193aW5kb3cgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5zZWNvbmRfcmFuZ2luZ193aW5kb3cgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWxsb2NfdHlwZV90b19zY2FuIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LmVhcmx5X3JvZ3VlX2RldGVjdGlvbi5hbGxvY190eXBlX3RvX3NjYW4gPSAoYmNtb2x0X2FsbG9jX3R5cGVfdG9fc2NhbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hbGxvY190eXBlX3RvX3NjYW4gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9BTEdPUklUSE1fVFlQRV9TUEVDSUFMX01BUDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLiIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMudmFsID0gYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCBjbGlfcGFybS0+YXJyYXlfc2l6ZSAqIHNpemVvZigqdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy52YWwpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLnZhbCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy5sZW4gPSBjbGlfcGFybS0+YXJyYXlfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLnBsb19zaXplIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy5sZW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLnBsb19zaXplIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy5sZW47IGkxKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLnZhbFtpMV0ucGxvX3NpemUgPSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWNjZXNzZXMuYWxsb2NfaWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLmxlbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWNjZXNzZXMuYWxsb2NfaWQgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLmxlbjsgaTErKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMudmFsW2kxXS5hbGxvY19pZCA9IChiY21vbHRfcG9uX2FsbG9jX2lkKSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWNjZXNzZXMub251X2lkIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy5sZW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLm9udV9pZCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuc3BlY2lhbF9tYXAuYWNjZXNzZXMubGVuOyBpMSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy52YWxbaTFdLm9udV9pZCA9IChiY21vbHRfcG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlc1tpMV0udW51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLmFjY2Vzc19zaXplIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy5sZW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzcy5kZXRlY3Rpb25fYWxnb3JpdGhtLmFjY2Vzc2VzLmFjY2Vzc19zaXplIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdmFsLmRldGVjdGlvbl9hbGdvcml0aG0udS5zcGVjaWFsX21hcC5hY2Nlc3Nlcy5sZW47IGkxKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwuZGV0ZWN0aW9uX2FsZ29yaXRobS51LnNwZWNpYWxfbWFwLmFjY2Vzc2VzLnZhbFtpMV0uYWNjZXNzX3NpemUgPSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWNjZXNzZXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9BTEdPUklUSE1fVFlQRV9FWFRFTkRFRF9HVUFSRF9USU1FOgorICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobS5hZGRpdGlvbmFsX2d1YXJkX3RpbWUiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5kZXRlY3Rpb25fYWxnb3JpdGhtLnUuZXh0ZW5kZWRfZ3VhcmRfdGltZS5hZGRpdGlvbmFsX2d1YXJkX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzLmRldGVjdGlvbl9hbGdvcml0aG0uYWRkaXRpb25hbF9ndWFyZF90aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MuZGV0ZWN0aW9uX2FsZ29yaXRobSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCByb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1JPR1VFX09OVV9ERVRFQ1RJT05fUFJPQ0VTUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCByb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCByb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZy5pbnRlcnZhbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmludGVydmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcuaW50ZXJ2YWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZy5jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY29udHJvbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nLmNvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BFUklPRElDX1NUQU5EQllfUE9OX01PTklUT1JJTkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRiYV9tb2RlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZGJhX21vZGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2RiYV9tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGRiYV9tb2RlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBkYmFfbW9kZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfREJBX01PREUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkYmFfbW9kZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBkYmFfbW9kZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgZGJhX21vZGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucGxvYW1faGFuZGxpbmcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fcGxvYW1faGFuZGxpbmcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wbG9hbV9oYW5kbGluZy5hY2tfdGltZW91dCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFja190aW1lb3V0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnBsb2FtX2hhbmRsaW5nLmFja190aW1lb3V0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnBsb2FtX2hhbmRsaW5nLnJldHJhbnNfcmFuZ2luZ190aW1lIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmV0cmFuc19yYW5naW5nX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucGxvYW1faGFuZGxpbmcucmV0cmFuc19yYW5naW5nX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucGxvYW1faGFuZGxpbmcucmV0cmFuc19hc3NpZ25fYWxsb2NfaWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5yZXRyYW5zX2Fzc2lnbl9hbGxvY19pZCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wbG9hbV9oYW5kbGluZy5yZXRyYW5zX2Fzc2lnbl9hbGxvY19pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wbG9hbV9oYW5kbGluZy5yZXRyYW5zX2tleV9jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmV0cmFuc19rZXlfY29udHJvbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wbG9hbV9oYW5kbGluZy5yZXRyYW5zX2tleV9jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnBsb2FtX2hhbmRsaW5nLnJldHJhbnNfcmVxdWVzdF9yZWdpc3RyYXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5yZXRyYW5zX3JlcXVlc3RfcmVnaXN0cmF0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnBsb2FtX2hhbmRsaW5nLnJldHJhbnNfcmVxdWVzdF9yZWdpc3RyYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcGxvYW1faGFuZGxpbmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fcGxvYW1faGFuZGxpbmcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUExPQU1fSEFORExJTkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcGxvYW1faGFuZGxpbmcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwbG9hbV9oYW5kbGluZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBwbG9hbV9oYW5kbGluZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgcGxvYW1faGFuZGxpbmcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5taW5fZGF0YV9hbGxvY19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX2FsbG9jX2lkIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF94Z3Bvbl9hbGxvY19pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIG1pbl9kYXRhX2FsbG9jX2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBtaW5fZGF0YV9hbGxvY19pZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTUlOX0RBVEFfQUxMT0NfSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtaW5fZGF0YV9hbGxvY19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBtaW5fZGF0YV9hbGxvY19pZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgbWluX2RhdGFfYWxsb2NfaWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5taW5fZGF0YV9nZW1fcG9ydF9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX2dlbV9pZCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfeGdwb25fZ2VtX2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgbWluX2RhdGFfZ2VtX3BvcnRfaWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIG1pbl9kYXRhX2dlbV9wb3J0X2lkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9NSU5fREFUQV9HRU1fUE9SVF9JRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1pbl9kYXRhX2dlbV9wb3J0X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIG1pbl9kYXRhX2dlbV9wb3J0X2lkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBtaW5fZGF0YV9nZW1fcG9ydF9pZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5tdWx0aWNhc3Rfa2V5LiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX211bHRpY2FzdF9rZXkgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIubXVsdGljYXN0X2tleS5rZXkuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5tdWx0aWNhc3Rfa2V5LmtleS5ieXRlcyIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDE2KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciBmaWx0ZXIubXVsdGljYXN0X2tleS5rZXkuYnl0ZXMgbXVzdCBoYXZlIDE2IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLmtleS5ieXRlcywgMTYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubXVsdGljYXN0X2tleS5rZXkuYnl0ZXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubXVsdGljYXN0X2tleS5rZXkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIubXVsdGljYXN0X2tleS5rZXlfY29udHJvbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmtleV9jb250cm9sID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIubXVsdGljYXN0X2tleS5rZXlfY29udHJvbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBtdWx0aWNhc3Rfa2V5LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX211bHRpY2FzdF9rZXkgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTVVMVElDQVNUX0tFWSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBtdWx0aWNhc3Rfa2V5LCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibXVsdGljYXN0X2tleSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBtdWx0aWNhc3Rfa2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBtdWx0aWNhc3Rfa2V5KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnByYnNfY2hlY2tlci4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19jaGVja2VyLnBvbHlub20iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wb2x5bm9tID0gKGJjbW9sdF9wcmJzX3BvbHlub21pYWwpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19jaGVja2VyLnBvbHlub20gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19jaGVja2VyLm1vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tb2RlID0gKGJjbW9sdF9wcmJzX2NoZWNrZXJfbW9kZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX2NoZWNrZXIubW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX2NoZWNrZXIuZGF0YV9pbnZlcnQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kYXRhX2ludmVydCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByYnNfY2hlY2tlci5kYXRhX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX2NoZWNrZXIuY29udHJvbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmNvbnRyb2wgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19jaGVja2VyLmNvbnRyb2wgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgcHJic19jaGVja2VyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJCU19DSEVDS0VSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHByYnNfY2hlY2tlciwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfY2hlY2tlciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBwcmJzX2NoZWNrZXIpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIHByYnNfY2hlY2tlcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5wcmJzX2dlbmVyYXRvci4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX2dlbmVyYXRvci5wb2x5bm9tIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucG9seW5vbSA9IChiY21vbHRfcHJic19wb2x5bm9taWFsKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByYnNfZ2VuZXJhdG9yLnBvbHlub20gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucHJic19nZW5lcmF0b3IuZXJyb3JfaW5zZXJ0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZXJyb3JfaW5zZXJ0ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19nZW5lcmF0b3IuZXJyb3JfaW5zZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfZ2VuZXJhdG9yLmludmVydCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmludmVydCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnByYnNfZ2VuZXJhdG9yLmludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX2dlbmVyYXRvci5jb250cm9sIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuY29udHJvbCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5wcmJzX2dlbmVyYXRvci5jb250cm9sIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHByYnNfZ2VuZXJhdG9yLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QUkJTX0dFTkVSQVRPUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBwcmJzX2dlbmVyYXRvciwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByYnNfZ2VuZXJhdG9yIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIHByYnNfZ2VuZXJhdG9yKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBwcmJzX2dlbmVyYXRvcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5wcmJzX3N0YXR1cy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wcmJzX3N0YXR1cyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnByYnNfc3RhdHVzLmxvY2tfc3RhdGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb2NrX3N0YXRlID0gKGJjbW9sdF9wcmJzX2xvY2tfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19zdGF0dXMubG9ja19zdGF0ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wcmJzX3N0YXR1cy5lcnJvcl9jb3VudHMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5lcnJvcl9jb3VudHMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucHJic19zdGF0dXMuZXJyb3JfY291bnRzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHByYnNfc3RhdHVzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3ByYnNfc3RhdHVzIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BSQlNfU1RBVFVTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHByYnNfc3RhdHVzLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJic19zdGF0dXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgcHJic19zdGF0dXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIHByYnNfc3RhdHVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24ubG9zIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9zID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24ubG9zIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLm9udV9hbGFybXMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5vbnVfYWxhcm1zID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24ub251X2FsYXJtcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi50aXdpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudGl3aSA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLnRpd2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24uYWNrX3RpbWVvdXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hY2tfdGltZW91dCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLmFja190aW1lb3V0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLnNmaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnNmaSA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLnNmaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbi5sb2tpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9raSA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLmxva2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24gdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQVVUT01BVElDX09OVV9ERUFDVElWQVRJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24sIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci51c19iYW5kd2lkdGhfbGltaXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIHVzX2JhbmR3aWR0aF9saW1pdCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgdXNfYmFuZHdpZHRoX2xpbWl0LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9VU19CQU5EV0lEVEhfTElNSVQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1c19iYW5kd2lkdGhfbGltaXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgdXNfYmFuZHdpZHRoX2xpbWl0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCB1c19iYW5kd2lkdGhfbGltaXQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuYWxsX29udXMuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzUxMCB2YWwgPSB7IH07CisgICAgICAgIGludDMyX3QgaTI7CisgICAgICAgIHZhbC52YWwgPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIGNsaV9wYXJtLT5hcnJheV9zaXplICogc2l6ZW9mKCp2YWwudmFsKSk7CisgICAgICAgIGlmICh2YWwudmFsID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICB9CisKKyAgICAgICAgdmFsLmxlbiA9IGNsaV9wYXJtLT5hcnJheV9zaXplOworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGxfb251cy5vbnVfaWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSB2YWwubGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxsX29udXMub251X2lkIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpMiA9IDA7IGkyIDwgdmFsLmxlbjsgaTIrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudmFsW2kyXS5vbnVfaWQgPSAoYmNtb2x0X3hncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlc1tpMl0udW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsbF9vbnVzLnN0YXRlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gdmFsLmxlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsbF9vbnVzLnN0YXRlIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpMiA9IDA7IGkyIDwgdmFsLmxlbjsgaTIrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudmFsW2kyXS5zdGF0ZSA9IChiY21vbHRfb251X3N0YXRlKSBjbGlfcGFybS0+dmFsdWVzW2kyXS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGFsbF9vbnVzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF81MTAgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQUxMX09OVVMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgYWxsX29udXMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGxfb251cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBhbGxfb251cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgYWxsX29udXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuYWxsX21jYXN0X2dlbV9wb3J0cy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjggdmFsID0geyB9OworICAgICAgICBpbnQzMl90IGkzOworICAgICAgICB2YWwudmFsID0gYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCBjbGlfcGFybS0+YXJyYXlfc2l6ZSAqIHNpemVvZigqdmFsLnZhbCkpOworICAgICAgICBpZiAodmFsLnZhbCA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9OT01FTSwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICAgICAgfQorCisgICAgICAgIHZhbC5sZW4gPSBjbGlfcGFybS0+YXJyYXlfc2l6ZTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxsX21jYXN0X2dlbV9wb3J0cy5nZW1faWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSB2YWwubGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxsX21jYXN0X2dlbV9wb3J0cy5nZW1faWQgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkzID0gMDsgaTMgPCB2YWwubGVuOyBpMysrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC52YWxbaTNdLmdlbV9pZCA9IChiY21vbHRfeGdwb25fZ2VtX2lkKSBjbGlfcGFybS0+dmFsdWVzW2kzXS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxsX21jYXN0X2dlbV9wb3J0cy5zdGF0ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5sZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGxfbWNhc3RfZ2VtX3BvcnRzLnN0YXRlIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpMyA9IDA7IGkzIDwgdmFsLmxlbjsgaTMrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudmFsW2kzXS5zdGF0ZSA9IChiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZXNbaTNdLmVudW1fdmFsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgYWxsX21jYXN0X2dlbV9wb3J0cywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjggdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQUxMX01DQVNUX0dFTV9QT1JUUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBhbGxfbWNhc3RfZ2VtX3BvcnRzLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxsX21jYXN0X2dlbV9wb3J0cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBhbGxfbWNhc3RfZ2VtX3BvcnRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBhbGxfbWNhc3RfZ2VtX3BvcnRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmRlYnVnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX25pX2RlYnVnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZGVidWcuaW5jcmVhc2VfYXZhaWxhYmxlX2Nicl9idyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmluY3JlYXNlX2F2YWlsYWJsZV9jYnJfYncgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5kZWJ1Zy5pbmNyZWFzZV9hdmFpbGFibGVfY2JyX2J3IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRlYnVnLmludGVyX2J1cnN0X2dhcF9pbl9ieXRlcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmludGVyX2J1cnN0X2dhcF9pbl9ieXRlcyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5kZWJ1Zy5pbnRlcl9idXJzdF9nYXBfaW5fYnl0ZXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZGVidWcubnVtYmVyX29mX2dlbV9wb3J0c19wZXJfb251Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubnVtYmVyX29mX2dlbV9wb3J0c19wZXJfb251ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmRlYnVnLm51bWJlcl9vZl9nZW1fcG9ydHNfcGVyX29udSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBkZWJ1ZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9kZWJ1ZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9ERUJVRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBkZWJ1ZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlYnVnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIGRlYnVnKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBkZWJ1Zyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9wYXJhbXMgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMucmVzcG9uc2VfdGltZW91dF9tcyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJlc3BvbnNlX3RpbWVvdXRfbXMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLnJlc3BvbnNlX3RpbWVvdXRfbXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLm1heF9yZXRyeV9jb3VudCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1heF9yZXRyeV9jb3VudCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMubWF4X3JldHJ5X2NvdW50IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9udV91cGdyYWRlX3BhcmFtcy5vbWNpX2Zvcm1hdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm9tY2lfZm9ybWF0ID0gKGJjbW9sdF9vbWNpX2RldmljZV9pZCkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMub21jaV9mb3JtYXQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLndpbmRvd19zaXplIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwud2luZG93X3NpemUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIub251X3VwZ3JhZGVfcGFyYW1zLndpbmRvd19zaXplIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9udV91cGdyYWRlX3BhcmFtcy5hY3RpdmF0ZV9jb21taXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hY3RpdmF0ZV9jb21taXQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMuYWN0aXZhdGVfY29tbWl0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9udV91cGdyYWRlX3BhcmFtcy5kZWxheV9mb3JfY29tbWl0X21zIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZGVsYXlfZm9yX2NvbW1pdF9tcyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMuZGVsYXlfZm9yX2NvbW1pdF9tcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMubWF4X2FjdGl2YXRpb25fYXR0ZW1wdHMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tYXhfYWN0aXZhdGlvbl9hdHRlbXB0cyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vbnVfdXBncmFkZV9wYXJhbXMubWF4X2FjdGl2YXRpb25fYXR0ZW1wdHMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgb251X3VwZ3JhZGVfcGFyYW1zLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX09OVV9VUEdSQURFX1BBUkFNUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBvbnVfdXBncmFkZV9wYXJhbXMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfdXBncmFkZV9wYXJhbXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgb251X3VwZ3JhZGVfcGFyYW1zKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBvbnVfdXBncmFkZV9wYXJhbXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kc19mZWNfbW9kZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2NvbnRyb2xfc3RhdGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2NvbnRyb2xfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgZHNfZmVjX21vZGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGRzX2ZlY19tb2RlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EU19GRUNfTU9ERSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRzX2ZlY19tb2RlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fbmksIGRzX2ZlY19tb2RlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBkc19mZWNfbW9kZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmRiYV90eXBlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZGJhX3R5cGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2RiYV90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIGRiYV90eXBlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX25pLCBkYmFfdHlwZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfREJBX1RZUEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkYmFfdHlwZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX25pLCBkYmFfdHlwZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgZGJhX3R5cGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIub251X3R1bmluZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9vbnVfdHVuaW5nX2NvbmZpZ3VyYXRpb24gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfdHVuaW5nLnRzb3VyY2UiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50c291cmNlID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9udV90dW5pbmcudHNvdXJjZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfdHVuaW5nLnR0YXJnZXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50dGFyZ2V0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLm9udV90dW5pbmcudHRhcmdldCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5vbnVfdHVuaW5nLnJlcXVlc3RfcmVnaXN0cmF0aW9uX3JlcXVpcmVkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmVxdWVzdF9yZWdpc3RyYXRpb25fcmVxdWlyZWQgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5vbnVfdHVuaW5nLnJlcXVlc3RfcmVnaXN0cmF0aW9uX3JlcXVpcmVkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fbmksIG9udV90dW5pbmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfb251X3R1bmluZ19jb25maWd1cmF0aW9uIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX09OVV9UVU5JTkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9uaSwgb251X3R1bmluZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV90dW5pbmciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgb251X3R1bmluZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgb251X3R1bmluZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fbmksIGh3X3Bvbl9pZCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX25pLCBhdmFpbGFibGVfYmFuZHdpZHRoKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fbmksIG51bWJlcl9vZl9hY3RpdmVfb251cykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX25pLCBwb25fc3RhdHVzKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fbmksIHBvbl9kaXN0YW5jZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX25pLCByYW5naW5nX3dpbmRvd19zaXplKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fbmksIGVxZF9jeWNsZXNfbnVtYmVyKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fbmksIGRyaWZ0X2NvbnRyb2wpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgbG9zX2FsYXJtX3RocmVzaG9sZCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX25pLCBsb3NfaW5pdGlhbF92YWx1ZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX25pLCBvbnVfYWxhcm1zX3RocmVzaG9sZHMpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgYmVyX21vbml0b3IpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgb251X2FjdGl2YXRpb24pICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgc25fYWNxdWlzaXRpb24pICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9uaSwga2V5X2V4Y2hhbmdlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fbmksIGNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgcG93ZXJfbWFuYWdlbWVudCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX25pLCByb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX25pLCBkYmFfbW9kZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX25pLCBwbG9hbV9oYW5kbGluZykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX25pLCBtaW5fZGF0YV9hbGxvY19pZCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX25pLCBtaW5fZGF0YV9nZW1fcG9ydF9pZCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX25pLCBtdWx0aWNhc3Rfa2V5KSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fbmksIHByYnNfY2hlY2tlcikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX25pLCBwcmJzX2dlbmVyYXRvcikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX25pLCBwcmJzX3N0YXR1cykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX25pLCBhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX25pLCB1c19iYW5kd2lkdGhfbGltaXQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgYWxsX29udXMpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgYWxsX21jYXN0X2dlbV9wb3J0cykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX25pLCBkZWJ1ZykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX25pLCBvbnVfdXBncmFkZV9wYXJhbXMpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgZHNfZmVjX21vZGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgZGJhX3R5cGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgb251X3R1bmluZykpCisgICAgeworICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9uaSwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9uaV9zdGF0X2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fbmlfc3RhdCBzdGF0OyAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vc19ib29sIGNsZWFyX29uX3JlYWQ7ICAgICAgIC8qKjwgZGVjbGFyZSAnY2xlYXIgb24gcmVhZCcgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX25pX3N0YXQgc3RhdDtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9OSV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBmbGFncyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNsZWFyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBjbGVhcl9vbl9yZWFkID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNsZWFyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImNsZWFyX29uX3JlYWQgPSAlcztcbiIsIChjbGVhcl9vbl9yZWFkKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9TVEFUX0lOSVQoJnN0YXQsIHhncG9uX25pLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0lOSVQoJnN0YXQsIHhncG9uX25pLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZlY19jb2Rld29yZHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIGZlY19jb2Rld29yZHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCBmZWNfY29kZXdvcmRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJiaXAzMl9ieXRlcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgYmlwMzJfYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCBiaXAzMl9ieXRlcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYmlwMzJfZXJyb3JzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCBiaXAzMl9lcnJvcnMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCBiaXAzMl9lcnJvcnMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3hndGNfaGVhZGVycyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfeGd0Y19oZWFkZXJzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfeGd0Y19oZWFkZXJzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF94Z3RjX2NvcnJlY3RlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfeGd0Y19jb3JyZWN0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCByeF94Z3RjX2NvcnJlY3RlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfeGd0Y191bmNvcnJlY3RlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfeGd0Y191bmNvcnJlY3RlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X3hndGNfdW5jb3JyZWN0ZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3hnZW0iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X3hnZW0pOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCByeF94Z2VtKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF94Z2VtX2Ryb3BwZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X3hnZW1fZHJvcHBlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X3hnZW1fZHJvcHBlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfeGdlbV9pZGxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCByeF94Z2VtX2lkbGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCByeF94Z2VtX2lkbGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3hnZW1fY29ycmVjdGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCByeF94Z2VtX2NvcnJlY3RlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X3hnZW1fY29ycmVjdGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9jcmNfZXJyb3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X2NyY19lcnJvcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X2NyY19lcnJvcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfZnJhZ21lbnRfZXJyb3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X2ZyYWdtZW50X2Vycm9yKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfZnJhZ21lbnRfZXJyb3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3BhY2tldHNfZHJvcHBlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfcGFja2V0c19kcm9wcGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfcGFja2V0c19kcm9wcGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9kcm9wcGVkX3Rvb19zaG9ydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfZHJvcHBlZF90b29fc2hvcnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCByeF9kcm9wcGVkX3Rvb19zaG9ydCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfZHJvcHBlZF90b29fbG9uZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfZHJvcHBlZF90b29fbG9uZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X2Ryb3BwZWRfdG9vX2xvbmcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2tleV9lcnJvciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfa2V5X2Vycm9yKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfa2V5X2Vycm9yKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9wbG9hbXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHR4X3Bsb2Ftcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHR4X3Bsb2Ftcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfcGxvYW1zX2Ryb3BwZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X3Bsb2Ftc19kcm9wcGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfcGxvYW1zX2Ryb3BwZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2FsbG9jYXRpb25zX3ZhbGlkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCByeF9hbGxvY2F0aW9uc192YWxpZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X2FsbG9jYXRpb25zX3ZhbGlkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9hbGxvY2F0aW9uc19pbnZhbGlkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCByeF9hbGxvY2F0aW9uc19pbnZhbGlkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfYWxsb2NhdGlvbnNfaW52YWxpZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfYWxsb2NhdGlvbnNfZGlzYWJsZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X2FsbG9jYXRpb25zX2Rpc2FibGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfYWxsb2NhdGlvbnNfZGlzYWJsZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3Bsb2FtcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfcGxvYW1zKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfcGxvYW1zKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9wbG9hbXNfbm9uX2lkbGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X3Bsb2Ftc19ub25faWRsZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X3Bsb2Ftc19ub25faWRsZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfcGxvYW1zX2Vycm9yIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCByeF9wbG9hbXNfZXJyb3IpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCByeF9wbG9hbXNfZXJyb3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2NwdSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfY3B1KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfY3B1KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9vbWNpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCByeF9vbWNpKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfb21jaSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfb21jaV9wYWNrZXRzX2NyY19lcnJvcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3BhY2tldHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHR4X3BhY2tldHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCB0eF9wYWNrZXRzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF94Z2VtIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCB0eF94Z2VtKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgdHhfeGdlbSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfY3B1Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCB0eF9jcHUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCB0eF9jcHUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X29tY2kiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHR4X29tY2kpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCB0eF9vbWNpKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9jcHVfb21jaV9wYWNrZXRzX2Ryb3BwZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHR4X2NwdV9vbWNpX3BhY2tldHNfZHJvcHBlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHR4X2NwdV9vbWNpX3BhY2tldHNfZHJvcHBlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfZHJvcHBlZF9pbGxlZ2FsX2xlbmd0aCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgdHhfZHJvcHBlZF9pbGxlZ2FsX2xlbmd0aCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHR4X2Ryb3BwZWRfaWxsZWdhbF9sZW5ndGgpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2Ryb3BwZWRfdHBpZF9taXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCB0eF9kcm9wcGVkX3RwaWRfbWlzcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIHR4X2Ryb3BwZWRfdHBpZF9taXNzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9kcm9wcGVkX3ZpZF9taXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCB0eF9kcm9wcGVkX3ZpZF9taXNzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9uaSwgdHhfZHJvcHBlZF92aWRfbWlzcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX25pLCBmZWNfY29kZXdvcmRzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX25pLCBiaXAzMl9ieXRlcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9uaSwgYmlwMzJfZXJyb3JzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX25pLCByeF94Z3RjX2hlYWRlcnMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fbmksIHJ4X3hndGNfY29ycmVjdGVkKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX25pLCByeF94Z3RjX3VuY29ycmVjdGVkKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX25pLCByeF94Z2VtKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX25pLCByeF94Z2VtX2Ryb3BwZWQpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fbmksIHJ4X3hnZW1faWRsZSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfeGdlbV9jb3JyZWN0ZWQpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fbmksIHJ4X2NyY19lcnJvcikgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfZnJhZ21lbnRfZXJyb3IpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fbmksIHJ4X3BhY2tldHNfZHJvcHBlZCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfZHJvcHBlZF90b29fc2hvcnQpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fbmksIHJ4X2Ryb3BwZWRfdG9vX2xvbmcpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fbmksIHJ4X2tleV9lcnJvcikgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9uaSwgdHhfcGxvYW1zKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX25pLCByeF9wbG9hbXNfZHJvcHBlZCkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfYWxsb2NhdGlvbnNfdmFsaWQpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fbmksIHJ4X2FsbG9jYXRpb25zX2ludmFsaWQpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fbmksIHJ4X2FsbG9jYXRpb25zX2Rpc2FibGVkKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX25pLCByeF9wbG9hbXMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fbmksIHJ4X3Bsb2Ftc19ub25faWRsZSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9uaSwgcnhfcGxvYW1zX2Vycm9yKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX25pLCByeF9jcHUpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fbmksIHJ4X29tY2kpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fbmksIHJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fbmksIHR4X3BhY2tldHMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fbmksIHR4X3hnZW0pICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fbmksIHR4X2NwdSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9uaSwgdHhfb21jaSkgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9uaSwgdHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX25pLCB0eF9kcm9wcGVkX2lsbGVnYWxfbGVuZ3RoKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX25pLCB0eF9kcm9wcGVkX3RwaWRfbWlzcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9uaSwgdHhfZHJvcHBlZF92aWRfbWlzcykpCisgICAgeworICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fbmksIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX25pLCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9zdGF0X2dldChkZXZpY2VfaWQsICZzdGF0LmhkciwgY2xlYXJfb25fcmVhZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfZ2V0KGRldmljZV9pZCwgJnN0YXQuaGRyLCBjbGVhcl9vbl9yZWFkKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXQuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdC5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fbmlfb3Blcl9zZXRfcG9uX3N0YXRlX3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZSBvcGVyOyAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXkgPSB7IH07ICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGUgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9OSV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fbmksIHNldF9wb25fc3RhdGUsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fbmksIHNldF9wb25fc3RhdGUsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcG9uX29wZXJhdGlvbiB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfcG9uX29wZXJhdGlvbikgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fbmksIHNldF9wb25fc3RhdGUsIHBvbl9zdGF0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX25pLCBzZXRfcG9uX3N0YXRlLCBwb25fc3RhdGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfU0VUX1BPTl9TVEFURSwgQkNNT0xUX1hHUE9OX05JX1NFVF9QT05fU1RBVEVfSURfUE9OX1NUQVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fbmlfb3Blcl9yZXNldF9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX25pX3Jlc2V0IG9wZXI7ICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXkgPSB7IH07ICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbmlfcmVzZXQgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9OSV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fbmksIHJlc2V0LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX25pLCByZXNldCwga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9uaV9vcGVyX2Rpc2FibGVfc2VyaWFsX251bWJlcl9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlciBvcGVyOyAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXkgPSB7IH07ICAgICAgICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fTklfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX25pLCBkaXNhYmxlX3NlcmlhbF9udW1iZXIsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fbmksIGRpc2FibGVfc2VyaWFsX251bWJlciwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb250cm9sIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2NvbnRyb2wgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2Rpc2FibGVfc2VyaWFsX251bWJlcl9jb250cm9sKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9uaSwgZGlzYWJsZV9zZXJpYWxfbnVtYmVyLCBjb250cm9sLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fbmksIGRpc2FibGVfc2VyaWFsX251bWJlciwgY29udHJvbCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9ESVNBQkxFX1NFUklBTF9OVU1CRVIsIEJDTU9MVF9YR1BPTl9OSV9ESVNBQkxFX1NFUklBTF9OVU1CRVJfSURfQ09OVFJPTCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJzZXJpYWxfbnVtYmVyLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3NlcmlhbF9udW1iZXIgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNlcmlhbF9udW1iZXIudmVuZG9yX2lkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIHNlcmlhbF9udW1iZXIudmVuZG9yX2lkIG11c3QgaGF2ZSA0IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwudmVuZG9yX2lkLCA0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzZXJpYWxfbnVtYmVyLnZlbmRvcl9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIHNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljIG11c3QgaGF2ZSA0IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwudmVuZG9yX3NwZWNpZmljLCA0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzZXJpYWxfbnVtYmVyLnZlbmRvcl9zcGVjaWZpYyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fbmksIGRpc2FibGVfc2VyaWFsX251bWJlciwgc2VyaWFsX251bWJlciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9zZXJpYWxfbnVtYmVyIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfRElTQUJMRV9TRVJJQUxfTlVNQkVSLCBCQ01PTFRfWEdQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX1NFUklBTF9OVU1CRVIsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX25pLCBkaXNhYmxlX3NlcmlhbF9udW1iZXIsIHNlcmlhbF9udW1iZXIsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9uaV9vcGVyX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3Jpbmdfc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nIG9wZXI7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgfTsgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fTklfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX25pLCBzaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX25pLCBzaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nLCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX25pX29wZXJfc2V0X29udV9zdGF0ZV9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGUgb3BlcjsgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyB9OyAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fTklfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX25pLCBzZXRfb251X3N0YXRlLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX25pLCBzZXRfb251X3N0YXRlLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X29udV9vcGVyYXRpb24gdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X29udV9vcGVyYXRpb24pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX25pLCBzZXRfb251X3N0YXRlLCBvbnVfc3RhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9uaSwgc2V0X29udV9zdGF0ZSwgb251X3N0YXRlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1NFVF9PTlVfU1RBVEUsIEJDTU9MVF9YR1BPTl9OSV9TRVRfT05VX1NUQVRFX0lEX09OVV9TVEFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX25pX29wZXJfcnVuX3NwZWNpYWxfYndfbWFwX3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwIG9wZXI7ICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgfTsgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXAgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9OSV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fbmksIHJ1bl9zcGVjaWFsX2J3X21hcCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCB4Z3Bvbl9uaSwgcnVuX3NwZWNpYWxfYndfbWFwLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm51bWJlcl9vZl9jeWNsZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fbmksIHJ1bl9zcGVjaWFsX2J3X21hcCwgbnVtYmVyX29mX2N5Y2xlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fbmksIHJ1bl9zcGVjaWFsX2J3X21hcCwgbnVtYmVyX29mX2N5Y2xlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1JVTl9TUEVDSUFMX0JXX01BUCwgQkNNT0xUX1hHUE9OX05JX1JVTl9TUEVDSUFMX0JXX01BUF9JRF9OVU1CRVJfT0ZfQ1lDTEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGxvY2F0aW9uX251bWJlciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fbmksIHJ1bl9zcGVjaWFsX2J3X21hcCwgYWxsb2NhdGlvbl9udW1iZXIsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9uaSwgcnVuX3NwZWNpYWxfYndfbWFwLCBhbGxvY2F0aW9uX251bWJlciwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9SVU5fU1BFQ0lBTF9CV19NQVAsIEJDTU9MVF9YR1BPTl9OSV9SVU5fU1BFQ0lBTF9CV19NQVBfSURfQUxMT0NBVElPTl9OVU1CRVIsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJid19tYXBfYXJyYXkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX25pLCBydW5fc3BlY2lhbF9id19tYXAsIGJ3X21hcF9hcnJheSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX25pLCBydW5fc3BlY2lhbF9id19tYXAsIGJ3X21hcF9hcnJheSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9SVU5fU1BFQ0lBTF9CV19NQVAsIEJDTU9MVF9YR1BPTl9OSV9SVU5fU1BFQ0lBTF9CV19NQVBfSURfQldfTUFQX0FSUkFZLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fbmlfb3Blcl9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdyBvcGVyOyAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXkgPSB7IH07ICAgICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3cgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9OSV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fbmksIHJvZ3VlX2RldGVjdGlvbl93aW5kb3csIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fbmksIHJvZ3VlX2RldGVjdGlvbl93aW5kb3csIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAid2luZG93X3R5cGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93IHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93KSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9uaSwgcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdywgd2luZG93X3R5cGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9uaSwgcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdywgd2luZG93X3R5cGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfUk9HVUVfREVURUNUSU9OX1dJTkRPVywgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfV0lORE9XX1RZUEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGxvY19pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX2FsbG9jX2lkIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF94Z3Bvbl9hbGxvY19pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9uaSwgcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdywgYWxsb2NfaWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9uaSwgcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdywgYWxsb2NfaWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfUk9HVUVfREVURUNUSU9OX1dJTkRPVywgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfQUxMT0NfSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9vbnVfaWQgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3hncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9uaSwgcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdywgb251X2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fbmksIHJvZ3VlX2RldGVjdGlvbl93aW5kb3csIG9udV9pZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9ST0dVRV9ERVRFQ1RJT05fV0lORE9XLCBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9PTlVfSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzZWNvbmRfcmFuZ2luZ193aW5kb3ciKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fbmksIHJvZ3VlX2RldGVjdGlvbl93aW5kb3csIHNlY29uZF9yYW5naW5nX3dpbmRvdywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX25pLCByb2d1ZV9kZXRlY3Rpb25fd2luZG93LCBzZWNvbmRfcmFuZ2luZ193aW5kb3csICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfUk9HVUVfREVURUNUSU9OX1dJTkRPVywgQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfU0VDT05EX1JBTkdJTkdfV0lORE9XLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fbmlfcHJveHlfY3B1X3BhY2tldHNfc2VuZChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0cyBwcm94eTsgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgfTsgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHMgcHJveHk7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9wcm94eV9zZW5kIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9OSV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX1BST1hZX0lOSVQoJnByb3h5LCB4Z3Bvbl9uaSwgY3B1X3BhY2tldHMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX1BST1hZX0lOSVQoJnByb3h5LCB4Z3Bvbl9uaSwgY3B1X3BhY2tldHMsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGFja2V0X3R5cGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wYWNrZXRfdHlwZSB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfcGFja2V0X3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgeGdwb25fbmksIGNwdV9wYWNrZXRzLCBwYWNrZXRfdHlwZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgeGdwb25fbmksIGNwdV9wYWNrZXRzLCBwYWNrZXRfdHlwZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9QUk9YWSwgQkNNT0xUX1hHUE9OX05JX1BST1hZX0lEX0NQVV9QQUNLRVRTLCBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfSURfUEFDS0VUX1RZUEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjYWxjX2NyYyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIHhncG9uX25pLCBjcHVfcGFja2V0cywgY2FsY19jcmMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIHhncG9uX25pLCBjcHVfcGFja2V0cywgY2FsY19jcmMsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFksIEJDTU9MVF9YR1BPTl9OSV9QUk9YWV9JRF9DUFVfUEFDS0VUUywgQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0lEX0NBTENfQ1JDLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ2VtX3BvcnRfbGlzdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNiB2YWwgPSB7IH07CisgICAgICAgIGludDMyX3QgaTA7CisgICAgICAgIHZhbC52YWwgPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIGNsaV9wYXJtLT5hcnJheV9zaXplICogc2l6ZW9mKCp2YWwudmFsKSk7CisgICAgICAgIGlmICh2YWwudmFsID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICB9CisKKyAgICAgICAgdmFsLmxlbiA9IGNsaV9wYXJtLT5hcnJheV9zaXplOworICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB2YWwubGVuOyBpMCsrKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudmFsW2kwXSA9IChiY21vbHRfeGdwb25fZ2VtX2lkKSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgeGdwb25fbmksIGNwdV9wYWNrZXRzLCBnZW1fcG9ydF9saXN0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX1BST1hZLCBCQ01PTFRfWEdQT05fTklfUFJPWFlfSURfQ1BVX1BBQ0tFVFMsIEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9HRU1fUE9SVF9MSVNULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIHhncG9uX25pLCBjcHVfcGFja2V0cywgZ2VtX3BvcnRfbGlzdCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJ1ZmZlciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4IHZhbCA9IHsgfTsKKyAgICAgICAgdmFsLmxlbiA9IGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpOworICAgICAgICB2YWwudmFsID0gYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCB2YWwubGVuKTsKKyAgICAgICAgaWYgKHZhbC52YWwgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgICAgIH0KKworICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC52YWwsIHZhbC5sZW4pOworICAgICAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCB4Z3Bvbl9uaSwgY3B1X3BhY2tldHMsIGJ1ZmZlciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX1BST1hZLCBCQ01PTFRfWEdQT05fTklfUFJPWFlfSURfQ1BVX1BBQ0tFVFMsIEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9CVUZGRVIsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgeGdwb25fbmksIGNwdV9wYWNrZXRzLCBidWZmZXIsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfcHJveHlfc2VuZChkZXZpY2VfaWQsICZwcm94eS5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9wcm94eV9zZW5kKGRldmljZV9pZCwgJnByb3h5Lmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBwcm94eS5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fbmlfcHJveHlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9zZW5kKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0IHByb3h5OyAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgfTsgICAgICAgICAgICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldCBwcm94eTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3Byb3h5X3NlbmQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX05JX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfUFJPWFlfSU5JVCgmcHJveHksIHhncG9uX25pLCBicm9hZGNhc3RfcGxvYW1fcGFja2V0LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9QUk9YWV9JTklUKCZwcm94eSwgeGdwb25fbmksIGJyb2FkY2FzdF9wbG9hbV9wYWNrZXQsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInBsb2FtLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Fycl91OF80MCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGxvYW0uYXJyIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gNDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciBwbG9hbS5hcnIgbXVzdCBoYXZlIDQwIGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwuYXJyLCA0MCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicGxvYW0uYXJyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIHhncG9uX25pLCBicm9hZGNhc3RfcGxvYW1fcGFja2V0LCBwbG9hbSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9hcnJfdThfNDAgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9QUk9YWSwgQkNNT0xUX1hHUE9OX05JX1BST1hZX0lEX0JST0FEQ0FTVF9QTE9BTV9QQUNLRVQsIEJDTU9MVF9YR1BPTl9OSV9CUk9BRENBU1RfUExPQU1fUEFDS0VUX0lEX1BMT0FNLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIHhncG9uX25pLCBicm9hZGNhc3RfcGxvYW1fcGFja2V0LCBwbG9hbSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9wcm94eV9zZW5kKGRldmljZV9pZCwgJnByb3h5Lmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Byb3h5X3NlbmQoZGV2aWNlX2lkLCAmcHJveHkuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHByb3h5Lmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9uaV9vcGVyX3RvZF9yZXF1ZXN0X3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3Qgb3BlcjsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXkgPSB7IH07ICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0IG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fTklfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX25pLCB0b2RfcmVxdWVzdCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCB4Z3Bvbl9uaSwgdG9kX3JlcXVlc3QsIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fbmlfb3Blcl9zdGFydF9vbnVfdXBncmFkZV9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGUgb3BlcjsgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyB9OyAgICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGUgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9OSV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fbmksIHN0YXJ0X29udV91cGdyYWRlLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX25pLCBzdGFydF9vbnVfdXBncmFkZSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsaXN0X29mX29udV9pZHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wb25fb251X2lkX2xpc3RfdTMyIHZhbCA9IHsgfTsKKyAgICAgICAgaW50MzJfdCBpMDsKKyAgICAgICAgdmFsLnZhbCA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgY2xpX3Bhcm0tPmFycmF5X3NpemUgKiBzaXplb2YoKnZhbC52YWwpKTsKKyAgICAgICAgaWYgKHZhbC52YWwgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfTk9NRU0sICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgICAgIH0KKworICAgICAgICB2YWwubGVuID0gY2xpX3Bhcm0tPmFycmF5X3NpemU7CisgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHZhbC5sZW47IGkwKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC52YWxbaTBdID0gKGJjbW9sdF9wb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX25pLCBzdGFydF9vbnVfdXBncmFkZSwgbGlzdF9vZl9vbnVfaWRzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Bvbl9vbnVfaWRfbGlzdF91MzIgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9TVEFSVF9PTlVfVVBHUkFERSwgQkNNT0xUX1hHUE9OX05JX1NUQVJUX09OVV9VUEdSQURFX0lEX0xJU1RfT0ZfT05VX0lEUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fbmksIHN0YXJ0X29udV91cGdyYWRlLCBsaXN0X29mX29udV9pZHMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9uaV9vcGVyX2FkanVzdF90eF93YXZlbGVuZ3RoX3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGggb3BlcjsgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgfTsgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aCBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX05JX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCB4Z3Bvbl9uaSwgYWRqdXN0X3R4X3dhdmVsZW5ndGgsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fbmksIGFkanVzdF90eF93YXZlbGVuZ3RoLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJzZXJpYWxfbnVtYmVyLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3NlcmlhbF9udW1iZXIgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNlcmlhbF9udW1iZXIudmVuZG9yX2lkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIHNlcmlhbF9udW1iZXIudmVuZG9yX2lkIG11c3QgaGF2ZSA0IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwudmVuZG9yX2lkLCA0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzZXJpYWxfbnVtYmVyLnZlbmRvcl9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIHNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljIG11c3QgaGF2ZSA0IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwudmVuZG9yX3NwZWNpZmljLCA0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzZXJpYWxfbnVtYmVyLnZlbmRvcl9zcGVjaWZpYyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fbmksIGFkanVzdF90eF93YXZlbGVuZ3RoLCBzZXJpYWxfbnVtYmVyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3NlcmlhbF9udW1iZXIgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9BREpVU1RfVFhfV0FWRUxFTkdUSCwgQkNNT0xUX1hHUE9OX05JX0FESlVTVF9UWF9XQVZFTEVOR1RIX0lEX1NFUklBTF9OVU1CRVIsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX25pLCBhZGp1c3RfdHhfd2F2ZWxlbmd0aCwgc2VyaWFsX251bWJlciwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyZXFlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZnJlcXVlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9mcmVxdWVuY3lfYWRqdXN0bWVudF9kaXJlY3Rpb24pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX25pLCBhZGp1c3RfdHhfd2F2ZWxlbmd0aCwgZnJlcWVuY3lfYWRqdXN0bWVudF9kaXJlY3Rpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9uaSwgYWRqdXN0X3R4X3dhdmVsZW5ndGgsIGZyZXFlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX0FESlVTVF9UWF9XQVZFTEVOR1RILCBCQ01PTFRfWEdQT05fTklfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfRlJFUUVOQ1lfQURKVVNUTUVOVF9ESVJFQ1RJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmcmVxdWVuY3lfYWRqdXN0bWVudF9zaXplIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9uaSwgYWRqdXN0X3R4X3dhdmVsZW5ndGgsIGZyZXF1ZW5jeV9hZGp1c3RtZW50X3NpemUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9uaSwgYWRqdXN0X3R4X3dhdmVsZW5ndGgsIGZyZXF1ZW5jeV9hZGp1c3RtZW50X3NpemUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfQURKVVNUX1RYX1dBVkVMRU5HVEgsIEJDTU9MVF9YR1BPTl9OSV9BREpVU1RfVFhfV0FWRUxFTkdUSF9JRF9GUkVRVUVOQ1lfQURKVVNUTUVOVF9TSVpFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fbmlfc3RhdF9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZyBzdGF0X2NmZzsgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgfTsgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X3hncG9uX25pX3N0YXRfaWQgc3RhdF9pZDsgICAgLyoqPCBkZWNsYXJlIHN0YXQgSUQgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZyBzdGF0X2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fTklfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgSUQgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHN0YXRfaWQgPSAoYmNtb2x0X3hncG9uX25pX3N0YXRfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBzd2l0Y2ggKHN0YXRfaWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX0ZFQ19DT0RFV09SRFM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCBmZWNfY29kZXdvcmRzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgZmVjX2NvZGV3b3Jkcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfQklQMzJfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCBiaXAzMl9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIGJpcDMyX2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9CSVAzMl9FUlJPUlM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCBiaXAzMl9lcnJvcnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCBiaXAzMl9lcnJvcnMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHVENfSEVBREVSUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3hndGNfaGVhZGVycywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3hndGNfaGVhZGVycywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdUQ19DT1JSRUNURUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF94Z3RjX2NvcnJlY3RlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3hndGNfY29ycmVjdGVkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR1RDX1VOQ09SUkVDVEVEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfeGd0Y191bmNvcnJlY3RlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3hndGNfdW5jb3JyZWN0ZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHRU06CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF94Z2VtLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfeGdlbSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdFTV9EUk9QUEVEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfeGdlbV9kcm9wcGVkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfeGdlbV9kcm9wcGVkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR0VNX0lETEU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF94Z2VtX2lkbGUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF94Z2VtX2lkbGUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHRU1fQ09SUkVDVEVEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfeGdlbV9jb3JyZWN0ZWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF94Z2VtX2NvcnJlY3RlZCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQ1JDX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfY3JjX2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfY3JjX2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9GUkFHTUVOVF9FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X2ZyYWdtZW50X2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfZnJhZ21lbnRfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BBQ0tFVFNfRFJPUFBFRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3BhY2tldHNfZHJvcHBlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3BhY2tldHNfZHJvcHBlZCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fU0hPUlQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9kcm9wcGVkX3Rvb19zaG9ydCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X2Ryb3BwZWRfdG9vX3Nob3J0LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9EUk9QUEVEX1RPT19MT05HOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfZHJvcHBlZF90b29fbG9uZywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X2Ryb3BwZWRfdG9vX2xvbmcsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0tFWV9FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X2tleV9lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X2tleV9lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfUExPQU1TOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgdHhfcGxvYW1zLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgdHhfcGxvYW1zLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfRFJPUFBFRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3Bsb2Ftc19kcm9wcGVkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfcGxvYW1zX2Ryb3BwZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX1ZBTElEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfYWxsb2NhdGlvbnNfdmFsaWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9hbGxvY2F0aW9uc192YWxpZCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfSU5WQUxJRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X2FsbG9jYXRpb25zX2ludmFsaWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9hbGxvY2F0aW9uc19pbnZhbGlkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19ESVNBQkxFRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X2FsbG9jYXRpb25zX2Rpc2FibGVkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfYWxsb2NhdGlvbnNfZGlzYWJsZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3Bsb2Ftcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3Bsb2Ftcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX05PTl9JRExFOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfcGxvYW1zX25vbl9pZGxlLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfcGxvYW1zX25vbl9pZGxlLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9wbG9hbXNfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9wbG9hbXNfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0NQVToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X2NwdSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X2NwdSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfT01DSToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X29tY2ksIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9vbWNpLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9PTUNJX1BBQ0tFVFNfQ1JDX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX1BBQ0tFVFM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCB0eF9wYWNrZXRzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgdHhfcGFja2V0cywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfWEdFTToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHR4X3hnZW0sIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCB0eF94Z2VtLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9DUFU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCB0eF9jcHUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCB0eF9jcHUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX09NQ0k6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCB0eF9vbWNpLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgdHhfb21jaSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfQ1BVX09NQ0lfUEFDS0VUU19EUk9QUEVEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgdHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgdHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX0lMTEVHQUxfTEVOR1RIOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgdHhfZHJvcHBlZF9pbGxlZ2FsX2xlbmd0aCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHR4X2Ryb3BwZWRfaWxsZWdhbF9sZW5ndGgsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfVFBJRF9NSVNTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgdHhfZHJvcHBlZF90cGlkX21pc3MsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCB0eF9kcm9wcGVkX3RwaWRfbWlzcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9WSURfTUlTUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHR4X2Ryb3BwZWRfdmlkX21pc3MsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCB0eF9kcm9wcGVkX3ZpZF9taXNzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJnN0YXRfY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9uaV9zdGF0X2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnIHN0YXRfY2ZnOyAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyB9OyAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfeGdwb25fbmlfc3RhdF9pZCBzdGF0X2lkOyAgICAvKio8IGRlY2xhcmUgc3RhdCBJRCAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnIHN0YXRfY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfc3RhdF9jZmdfc2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9OSV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBJRCBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc3RhdF9pZCA9IChiY21vbHRfeGdwb25fbmlfc3RhdF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIHN3aXRjaCAoc3RhdF9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfRkVDX0NPREVXT1JEUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIGZlY19jb2Rld29yZHMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCBmZWNfY29kZXdvcmRzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9CSVAzMl9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIGJpcDMyX2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgYmlwMzJfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX0JJUDMyX0VSUk9SUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIGJpcDMyX2Vycm9ycywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIGJpcDMyX2Vycm9ycywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdUQ19IRUFERVJTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfeGd0Y19oZWFkZXJzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfeGd0Y19oZWFkZXJzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR1RDX0NPUlJFQ1RFRDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3hndGNfY29ycmVjdGVkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfeGd0Y19jb3JyZWN0ZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHVENfVU5DT1JSRUNURUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF94Z3RjX3VuY29ycmVjdGVkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfeGd0Y191bmNvcnJlY3RlZCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdFTToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3hnZW0sIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF94Z2VtLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR0VNX0RST1BQRUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF94Z2VtX2Ryb3BwZWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF94Z2VtX2Ryb3BwZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHRU1fSURMRToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3hnZW1faWRsZSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3hnZW1faWRsZSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdFTV9DT1JSRUNURUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF94Z2VtX2NvcnJlY3RlZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3hnZW1fY29ycmVjdGVkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9DUkNfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9jcmNfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9jcmNfZXJyb3IsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0ZSQUdNRU5UX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfZnJhZ21lbnRfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9mcmFnbWVudF9lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUEFDS0VUU19EUk9QUEVEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfcGFja2V0c19kcm9wcGVkLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfcGFja2V0c19kcm9wcGVkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9EUk9QUEVEX1RPT19TSE9SVDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X2Ryb3BwZWRfdG9vX3Nob3J0LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfZHJvcHBlZF90b29fc2hvcnQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0RST1BQRURfVE9PX0xPTkc6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9kcm9wcGVkX3Rvb19sb25nLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfZHJvcHBlZF90b29fbG9uZywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfS0VZX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfa2V5X2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfa2V5X2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9QTE9BTVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCB0eF9wbG9hbXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCB0eF9wbG9hbXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19EUk9QUEVEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfcGxvYW1zX2Ryb3BwZWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9wbG9hbXNfZHJvcHBlZCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfVkFMSUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9hbGxvY2F0aW9uc192YWxpZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X2FsbG9jYXRpb25zX3ZhbGlkLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19JTlZBTElEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfYWxsb2NhdGlvbnNfaW52YWxpZCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X2FsbG9jYXRpb25zX2ludmFsaWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0RJU0FCTEVEOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfYWxsb2NhdGlvbnNfZGlzYWJsZWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9hbGxvY2F0aW9uc19kaXNhYmxlZCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUExPQU1TOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfcGxvYW1zLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfcGxvYW1zLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfTk9OX0lETEU6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9wbG9hbXNfbm9uX2lkbGUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9wbG9hbXNfbm9uX2lkbGUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19FUlJPUjoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3Bsb2Ftc19lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X3Bsb2Ftc19lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQ1BVOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfY3B1LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfY3B1LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9PTUNJOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfb21jaSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHJ4X29tY2ksIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCByeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgcnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfUEFDS0VUUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHR4X3BhY2tldHMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCB0eF9wYWNrZXRzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9YR0VNOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgdHhfeGdlbSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHR4X3hnZW0sIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX0NQVToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHR4X2NwdSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHR4X2NwdSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfT01DSToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHR4X29tY2ksIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCB0eF9vbWNpLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9DUFVfT01DSV9QQUNLRVRTX0RST1BQRUQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCB0eF9jcHVfb21jaV9wYWNrZXRzX2Ryb3BwZWQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCB0eF9jcHVfb21jaV9wYWNrZXRzX2Ryb3BwZWQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfSUxMRUdBTF9MRU5HVEg6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCB0eF9kcm9wcGVkX2lsbGVnYWxfbGVuZ3RoLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgdHhfZHJvcHBlZF9pbGxlZ2FsX2xlbmd0aCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9UUElEX01JU1M6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX25pLCB0eF9kcm9wcGVkX3RwaWRfbWlzcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHR4X2Ryb3BwZWRfdHBpZF9taXNzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX1ZJRF9NSVNTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgdHhfZHJvcHBlZF92aWRfbWlzcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fbmksIHR4X2Ryb3BwZWRfdmlkX21pc3MsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLnR5cGUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnR5cGUgPSAoYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudHlwZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHZhbC50cmlnZ2VyLnR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9SQVRFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5yaXNpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV90aHJlc2hvbGQucmlzaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5yaXNpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5mYWxsaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLmZhbGxpbmcgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmZhbGxpbmcgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9SQU5HRToKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci51cHBlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLnVwcGVyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci51cHBlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy50cmlnZ2VyLmxvd2VyIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfcmFuZ2UubG93ZXIgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxvd2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1ZBTFVFX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5saW1pdCIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS52YWx1ZV90aHJlc2hvbGQubGltaXQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjY0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLmxpbWl0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX05PTkU6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY2ZnLnNvYWsuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnNvYWsuYWN0aXZlX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnNvYWsuY2xlYXJfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmNsZWFyX3NvYWtfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9TVEFUX0NGR19QUk9QX1NFVCgmc3RhdF9jZmcsIHhncG9uX25pLCBjZmcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9hbGFybV9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX1NUQVRfQ0ZHX0lEX0NGRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCB4Z3Bvbl9uaSwgY2ZnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCAmc3RhdF9jZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIHN0YXRfY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9uaV9hdXRvX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnIGF1dG9fY2ZnOyAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyB9OyAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZyBhdXRvX2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2F1dG9fY2ZnX2dldCIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9BVVRPX0NGR19JTklUKCZhdXRvX2NmZywgeGdwb25fbmksIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX25pLCBhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNwdV9wYWNrZXRzX2ZhaWx1cmUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgY3B1X3BhY2tldHNfZmFpbHVyZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgY3B1X3BhY2tldHNfZmFpbHVyZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fbmksIGRlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX25pLCBkaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuYWJsZV9hbGxfb251c19jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9zIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fbmksIGxvcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgbG9zKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfZGlzY292ZXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX25pLCBvbnVfZGlzY292ZXJlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgb251X2Rpc2NvdmVyZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV91cGdyYWRlX2NvbXBsZXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fbmksIG9udV91cGdyYWRlX2NvbXBsZXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX25pLCBvbnVfdXBncmFkZV9jb21wbGV0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX25pLCByb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX25pLCByb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX25pLCByb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHN0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX2NsZWFyZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgc3RhdF9hbGFybV9jbGVhcmVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX25pLCBzdGF0X2FsYXJtX2NsZWFyZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fcmFpc2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHN0YXRfYWxhcm1fcmFpc2VkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX25pLCBzdGF0X2FsYXJtX3JhaXNlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdGVfY2hhbmdlX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX25pLCBzdGF0ZV9jaGFuZ2VfY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX25pLCBzdGF0ZV9jaGFuZ2VfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0b2RfcmVxdWVzdF9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgdG9kX3JlcXVlc3RfY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX25pLCB0b2RfcmVxdWVzdF9jb21wbGV0ZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgY3B1X3BhY2tldHNfZmFpbHVyZSkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBkZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBkaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBlbmFibGVfYWxsX29udXNfY29tcGxldGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIGxvcykgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBvbnVfZGlzY292ZXJlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBvbnVfdXBncmFkZV9jb21wbGV0ZSkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBwcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCByb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHJvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBzZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0KSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHN0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHN0YXRfYWxhcm1fY2xlYXJlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBzdGF0X2FsYXJtX3JhaXNlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBzdGF0ZV9jaGFuZ2VfY29tcGxldGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHRvZF9yZXF1ZXN0X2NvbXBsZXRlZCkpCisgICAgeworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmYXV0b19jZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX25pX2F1dG9fY2ZnX3NldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fbmlfYXV0b19jZmcgYXV0b19jZmc7ICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXkgPSB7IH07ICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnIGF1dG9fY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX25pX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfc2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfSU5JVCgmYXV0b19jZmcsIHhncG9uX25pLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9BQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjcHVfcGFja2V0c19mYWlsdXJlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIGNwdV9wYWNrZXRzX2ZhaWx1cmUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBjcHVfcGFja2V0c19mYWlsdXJlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX05JLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfQ1BVX1BBQ0tFVFNfRkFJTFVSRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIGRlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9ERUFDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRpc2FibGVfYWxsX29udXNfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIGRpc2FibGVfYWxsX29udXNfY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9ESVNBQkxFX0FMTF9PTlVTX0NPTVBMRVRFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuYWJsZV9hbGxfb251c19jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIGVuYWJsZV9hbGxfb251c19jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9FTkFCTEVfQUxMX09OVVNfQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9zIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIGxvcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIGxvcywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX0xPUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9kaXNjb3ZlcmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIG9udV9kaXNjb3ZlcmVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgb251X2Rpc2NvdmVyZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9PTlVfRElTQ09WRVJFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV91cGdyYWRlX2NvbXBsZXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIG9udV91cGdyYWRlX2NvbXBsZXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgb251X3VwZ3JhZGVfY29tcGxldGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9PTlVfVVBHUkFERV9DT01QTEVURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19PTlVTX1JBTkdFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInByb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHByb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHJvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHJvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHJvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1JPR1VFX09OVV9TUEVDSUFMX01BUF9DWUNMRV9TVEFSVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHNlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9TRVJJQUxfTlVNQkVSX0FDUVVJU0lUSU9OX0NZQ0xFX1NUQVJULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX25pLCBzdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9jbGVhcmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHN0YXRfYWxhcm1fY2xlYXJlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHN0YXRfYWxhcm1fY2xlYXJlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fcmFpc2VkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHN0YXRfYWxhcm1fcmFpc2VkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgc3RhdF9hbGFybV9yYWlzZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRlX2NoYW5nZV9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9uaSwgc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHN0YXRlX2NoYW5nZV9jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fTkksIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFURV9DSEFOR0VfQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidG9kX3JlcXVlc3RfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHRvZF9yZXF1ZXN0X2NvbXBsZXRlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fbmksIHRvZF9yZXF1ZXN0X2NvbXBsZXRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9OSSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1RPRF9SRVFVRVNUX0NPTVBMRVRFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCAmYXV0b19jZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBhdXRvX2NmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fb251X2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGFwaWNsaV9ieXRlX3Bvb2wgKmJ5dGVfcG9vbCkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fb251X2NmZyBjZmc7ICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7IH07IC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICB1aW50OF90ICpsaXN0X21lbTsgICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBtZW1vcnkgYnVmZmVyIGZvciB2YXJpYWJsZS1zaXplZCBsaXN0cyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQ4X3QqIGxpc3RfbWVtO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X3hncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fb251LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9vbnUsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIG9udV9zdGF0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX29udSwgb251X3N0YXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfb2xkX3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIG9udV9vbGRfc3RhdGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIG9udV9vbGRfc3RhdGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsYXJtX3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGFsYXJtX3N0YXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fb251LCBhbGFybV9zdGF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fb251LCByZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fb251LCByZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjdXJyZW50X2VuY3J5cHRpb25fa2V5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGN1cnJlbnRfZW5jcnlwdGlvbl9rZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGN1cnJlbnRfZW5jcnlwdGlvbl9rZXkpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNlcmlhbF9udW1iZXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX29udSwgc2VyaWFsX251bWJlcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX29udSwgc2VyaWFsX251bWJlcik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmVnaXN0cmF0aW9uX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHJlZ2lzdHJhdGlvbl9pZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX29udSwgcmVnaXN0cmF0aW9uX2lkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyZWdpc3RyYXRpb25faWRfYXV0b19sZWFybmluZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fb251LCByZWdpc3RyYXRpb25faWRfYXV0b19sZWFybmluZyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX29udSwgcmVnaXN0cmF0aW9uX2lkX2F1dG9fbGVhcm5pbmcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfYnVyc3RfcHJvZmlsZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fb251LCByYW5naW5nX2J1cnN0X3Byb2ZpbGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHJhbmdpbmdfYnVyc3RfcHJvZmlsZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGF0YV9idXJzdF9wcm9maWxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGRhdGFfYnVyc3RfcHJvZmlsZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX29udSwgZGF0YV9idXJzdF9wcm9maWxlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX3RpbWUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX29udSwgcmFuZ2luZ190aW1lKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fb251LCByYW5naW5nX3RpbWUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRpc2FibGVkX2FmdGVyX2Rpc2NvdmVyeSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fb251LCBkaXNhYmxlZF9hZnRlcl9kaXNjb3ZlcnkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGRpc2FibGVkX2FmdGVyX2Rpc2NvdmVyeSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVhY3RpdmF0aW9uX3JlYXNvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fb251LCBkZWFjdGl2YXRpb25fcmVhc29uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fb251LCBkZWFjdGl2YXRpb25fcmVhc29uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGxfZ2VtX3BvcnRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGFsbF9nZW1fcG9ydHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGFsbF9nZW1fcG9ydHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsbF9hbGxvY3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX29udSwgYWxsX2FsbG9jcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX29udSwgYWxsX2FsbG9jcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXh0ZW5kZWRfZ3VhcmRfdGltZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fb251LCBleHRlbmRlZF9ndWFyZF90aW1lKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fb251LCBleHRlbmRlZF9ndWFyZF90aW1lKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1c19saW5lX3JhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX29udSwgdXNfbGluZV9yYXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fb251LCB1c19saW5lX3JhdGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNhbGlicmF0aW9uX3JlY29yZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fb251LCBjYWxpYnJhdGlvbl9yZWNvcmQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGNhbGlicmF0aW9uX3JlY29yZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHVuaW5nX2dyYW51bGFyaXR5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHR1bmluZ19ncmFudWxhcml0eSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX29udSwgdHVuaW5nX2dyYW51bGFyaXR5KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGVwX3R1bmluZ190aW1lIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHN0ZXBfdHVuaW5nX3RpbWUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHN0ZXBfdHVuaW5nX3RpbWUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvd2VyX2xldmVsbGluZ19jYXBhYmlsaXRpZXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX29udSwgcG93ZXJfbGV2ZWxsaW5nX2NhcGFiaWxpdGllcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX29udSwgcG93ZXJfbGV2ZWxsaW5nX2NhcGFiaWxpdGllcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHJlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX29udSwgcmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX29udSwgb251X3N0YXRlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIG9udV9vbGRfc3RhdGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX29udSwgYWxhcm1fc3RhdGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX29udSwgcmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fb251LCBjdXJyZW50X2VuY3J5cHRpb25fa2V5KSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHNlcmlhbF9udW1iZXIpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX29udSwgcmVnaXN0cmF0aW9uX2lkKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHJlZ2lzdHJhdGlvbl9pZF9hdXRvX2xlYXJuaW5nKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHJhbmdpbmdfYnVyc3RfcHJvZmlsZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fb251LCBkYXRhX2J1cnN0X3Byb2ZpbGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX29udSwgcmFuZ2luZ190aW1lKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGRpc2FibGVkX2FmdGVyX2Rpc2NvdmVyeSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fb251LCBkZWFjdGl2YXRpb25fcmVhc29uKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGFsbF9nZW1fcG9ydHMpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX29udSwgYWxsX2FsbG9jcykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fb251LCBleHRlbmRlZF9ndWFyZF90aW1lKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHVzX2xpbmVfcmF0ZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fb251LCBjYWxpYnJhdGlvbl9yZWNvcmQpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX29udSwgdHVuaW5nX2dyYW51bGFyaXR5KSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHN0ZXBfdHVuaW5nX3RpbWUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX29udSwgcG93ZXJfbGV2ZWxsaW5nX2NhcGFiaWxpdGllcykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fb251LCByZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIHNldCBtZW1vcnkgdG8gdXNlIGZvciB2YXJpYWJsZS1zaXplZCBsaXN0cyAqLworICAgIGxpc3RfbWVtID0gYXBpY2xpX2J5dGVfcG9vbF9jYWxsb2MoYnl0ZV9wb29sLCBBUElDTElfRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFKTsKKyAgICBpZiAobGlzdF9tZW0gPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygibGlzdF9tZW0gPSBiY21vc19jYWxsb2MoQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSk7XG4iKTsKKyAgICBCQ01PTFRfQ0ZHX0xJU1RfQlVGX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGxpc3RfbWVtLCBBUElDTElfRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFKTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0xJU1RfQlVGX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGxpc3RfbWVtLCBBUElDTElfRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFKTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIHByaW50IEFQSSBjb250ZW50cyB0byB0aGUgQ0xJICovCisgICAgICAgIGFwaWNsaV9wcmludF9kYXRhX3N0YXJ0KHNlc3Npb24pOworICAgICAgICBlcnIgPSBhcGljbGlfbXNnX2R1bXAoc2Vzc2lvbiwgJmNmZy5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX29udV9jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX29udV9jZmcgY2ZnOyAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyB9OyAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fb251X2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X3hncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fb251LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9vbnUsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfb251X3N0YXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9vbnVfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIG9udV9zdGF0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIG9udV9zdGF0ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9PTlVfU1RBVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiYWxhcm1fc3RhdGUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGFybV9zdGF0ZS5sb3NpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9zaSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxhcm1fc3RhdGUubG9zaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsYXJtX3N0YXRlLmxvYmkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb2JpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhbGFybV9zdGF0ZS5sb2JpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxhcm1fc3RhdGUubG9wY2kiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb3BjaSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxhcm1fc3RhdGUubG9wY2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGFybV9zdGF0ZS5sb3BjaV9taWNfZXJyb3IiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb3BjaV9taWNfZXJyb3IgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFsYXJtX3N0YXRlLmxvcGNpX21pY19lcnJvciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsYXJtX3N0YXRlLmxvb2NpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9vY2kgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFsYXJtX3N0YXRlLmxvb2NpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxhcm1fc3RhdGUudGl3aSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRpd2kgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFsYXJtX3N0YXRlLnRpd2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGFybV9zdGF0ZS5kb3dpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZG93aSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxhcm1fc3RhdGUuZG93aSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsYXJtX3N0YXRlLnN1ZmkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zdWZpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhbGFybV9zdGF0ZS5zdWZpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxhcm1fc3RhdGUuc2ZpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc2ZpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhbGFybV9zdGF0ZS5zZmkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGFybV9zdGF0ZS5zZGkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zZGkgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFsYXJtX3N0YXRlLnNkaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsYXJtX3N0YXRlLmRmaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmRmaSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxhcm1fc3RhdGUuZGZpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxhcm1fc3RhdGUuZGdpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZGdpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhbGFybV9zdGF0ZS5kZ2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJhbGFybV9zdGF0ZS5wcXNpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucHFzaSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYWxhcm1fc3RhdGUucHFzaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgYWxhcm1fc3RhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQUxBUk1fU1RBVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGFsYXJtX3N0YXRlLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9rZXlzIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5wbG9hbV9pay4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5wbG9hbV9pay5ieXRlcyIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDE2KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciByZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLnBsb2FtX2lrLmJ5dGVzIG11c3QgaGF2ZSAxNiBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC5wbG9hbV9pay5ieXRlcywgMTYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLnBsb2FtX2lrLmJ5dGVzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5wbG9hbV9payBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJyZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLm9tY2lfaWsuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMub21jaV9pay5ieXRlcyIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDE2KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciByZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLm9tY2lfaWsuYnl0ZXMgbXVzdCBoYXZlIDE2IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLm9tY2lfaWsuYnl0ZXMsIDE2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5vbWNpX2lrLmJ5dGVzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5vbWNpX2lrIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMub21jaV9rMS4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5vbWNpX2sxLmJ5dGVzIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gMTYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIHJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMub21jaV9rMS5ieXRlcyBtdXN0IGhhdmUgMTYgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwub21jaV9rMS5ieXRlcywgMTYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLm9tY2lfazEuYnl0ZXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLm9tY2lfazEgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5vbWNpX2syLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLm9tY2lfazIuYnl0ZXMiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSAxNikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgcmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5vbWNpX2syLmJ5dGVzIG11c3QgaGF2ZSAxNiBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC5vbWNpX2syLmJ5dGVzLCAxNik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMub21jaV9rMi5ieXRlcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMub21jaV9rMiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJyZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLmtlay4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5rZWsuYnl0ZXMiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSAxNikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgcmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5rZWsuYnl0ZXMgbXVzdCBoYXZlIDE2IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLmtlay5ieXRlcywgMTYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLmtlay5ieXRlcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMua2VrIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCByZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25fa2V5cyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JFR0lTVFJBVElPTl9FTkNSWVBUSU9OX0tFWVMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiY3VycmVudF9lbmNyeXB0aW9uX2tleS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9vbnVfYWVzX2tleSB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImN1cnJlbnRfZW5jcnlwdGlvbl9rZXkuZW5jcnlwdGlvbl9rZXkuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImN1cnJlbnRfZW5jcnlwdGlvbl9rZXkuZW5jcnlwdGlvbl9rZXkuYnl0ZXMiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSAxNikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgY3VycmVudF9lbmNyeXB0aW9uX2tleS5lbmNyeXB0aW9uX2tleS5ieXRlcyBtdXN0IGhhdmUgMTYgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwuZW5jcnlwdGlvbl9rZXkuYnl0ZXMsIDE2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY3VycmVudF9lbmNyeXB0aW9uX2tleS5lbmNyeXB0aW9uX2tleS5ieXRlcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImN1cnJlbnRfZW5jcnlwdGlvbl9rZXkuZW5jcnlwdGlvbl9rZXkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjdXJyZW50X2VuY3J5cHRpb25fa2V5LmtleV9pbmRleCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmtleV9pbmRleCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImN1cnJlbnRfZW5jcnlwdGlvbl9rZXkua2V5X2luZGV4IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBjdXJyZW50X2VuY3J5cHRpb25fa2V5LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9hZXNfa2V5IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQ1VSUkVOVF9FTkNSWVBUSU9OX0tFWSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgY3VycmVudF9lbmNyeXB0aW9uX2tleSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJzZXJpYWxfbnVtYmVyLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3NlcmlhbF9udW1iZXIgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNlcmlhbF9udW1iZXIudmVuZG9yX2lkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIHNlcmlhbF9udW1iZXIudmVuZG9yX2lkIG11c3QgaGF2ZSA0IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwudmVuZG9yX2lkLCA0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzZXJpYWxfbnVtYmVyLnZlbmRvcl9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIHNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljIG11c3QgaGF2ZSA0IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwudmVuZG9yX3NwZWNpZmljLCA0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzZXJpYWxfbnVtYmVyLnZlbmRvcl9zcGVjaWZpYyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgc2VyaWFsX251bWJlciwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9zZXJpYWxfbnVtYmVyIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfU0VSSUFMX05VTUJFUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgc2VyaWFsX251bWJlciwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJyZWdpc3RyYXRpb25faWQuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYXJyX3U4XzM2IHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyZWdpc3RyYXRpb25faWQuYXJyIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gMzYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciByZWdpc3RyYXRpb25faWQuYXJyIG11c3QgaGF2ZSAzNiBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLmFyciwgMzYpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJlZ2lzdHJhdGlvbl9pZC5hcnIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHJlZ2lzdHJhdGlvbl9pZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9hcnJfdThfMzYgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SRUdJU1RSQVRJT05fSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHJlZ2lzdHJhdGlvbl9pZCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJlZ2lzdHJhdGlvbl9pZF9hdXRvX2xlYXJuaW5nIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHJlZ2lzdHJhdGlvbl9pZF9hdXRvX2xlYXJuaW5nLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgcmVnaXN0cmF0aW9uX2lkX2F1dG9fbGVhcm5pbmcsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkVHSVNUUkFUSU9OX0lEX0FVVE9fTEVBUk5JTkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX2J1cnN0X3Byb2ZpbGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9idXJzdF9wcm9maWxlX2luZGV4IHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9idXJzdF9wcm9maWxlX2luZGV4KSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHJhbmdpbmdfYnVyc3RfcHJvZmlsZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHJhbmdpbmdfYnVyc3RfcHJvZmlsZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SQU5HSU5HX0JVUlNUX1BST0ZJTEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkYXRhX2J1cnN0X3Byb2ZpbGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9idXJzdF9wcm9maWxlX2luZGV4IHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9idXJzdF9wcm9maWxlX2luZGV4KSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGRhdGFfYnVyc3RfcHJvZmlsZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGRhdGFfYnVyc3RfcHJvZmlsZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9EQVRBX0JVUlNUX1BST0ZJTEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX3RpbWUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCByYW5naW5nX3RpbWUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCByYW5naW5nX3RpbWUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkFOR0lOR19USU1FLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImV4dGVuZGVkX2d1YXJkX3RpbWUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZSB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXh0ZW5kZWRfZ3VhcmRfdGltZS5hZGRpdGlvbmFsX3ByZWJ1cnN0X2d1YXJkX3RpbWUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZGRpdGlvbmFsX3ByZWJ1cnN0X2d1YXJkX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJleHRlbmRlZF9ndWFyZF90aW1lLmFkZGl0aW9uYWxfcHJlYnVyc3RfZ3VhcmRfdGltZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImV4dGVuZGVkX2d1YXJkX3RpbWUuYWRkaXRpb25hbF9wb3N0YnVyc3RfZ3VhcmRfdGltZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFkZGl0aW9uYWxfcG9zdGJ1cnN0X2d1YXJkX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJleHRlbmRlZF9ndWFyZF90aW1lLmFkZGl0aW9uYWxfcG9zdGJ1cnN0X2d1YXJkX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGV4dGVuZGVkX2d1YXJkX3RpbWUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZSB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0VYVEVOREVEX0dVQVJEX1RJTUUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGV4dGVuZGVkX2d1YXJkX3RpbWUsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ1c19saW5lX3JhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF91cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF91cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCB1c19saW5lX3JhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCB1c19saW5lX3JhdGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfVVNfTElORV9SQVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNhbGlicmF0aW9uX3JlY29yZC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hcnJfY2FsaWJyYXRpb25fcmVjb3JkXzggdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNhbGlicmF0aW9uX3JlY29yZC5hcnIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgaTA7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gOCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXJyYXkgY2FsaWJyYXRpb25fcmVjb3JkLmFyciBtdXN0IGhhdmUgOCBlbGVtZW50c1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgODsgaTArKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXSA9IChiY21vbHRfY2FsaWJyYXRpb25fcmVjb3JkKSBjbGlfcGFybS0+dmFsdWVzW2kwXS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjYWxpYnJhdGlvbl9yZWNvcmQuYXJyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBjYWxpYnJhdGlvbl9yZWNvcmQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYXJyX2NhbGlicmF0aW9uX3JlY29yZF84IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQ0FMSUJSQVRJT05fUkVDT1JELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBjYWxpYnJhdGlvbl9yZWNvcmQsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0dW5pbmdfZ3JhbnVsYXJpdHkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHR1bmluZ19ncmFudWxhcml0eSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHR1bmluZ19ncmFudWxhcml0eSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9UVU5JTkdfR1JBTlVMQVJJVFksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGVwX3R1bmluZ190aW1lIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBzdGVwX3R1bmluZ190aW1lLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgc3RlcF90dW5pbmdfdGltZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9TVEVQX1RVTklOR19USU1FLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG93ZXJfbGV2ZWxsaW5nX2NhcGFiaWxpdGllcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgcG93ZXJfbGV2ZWxsaW5nX2NhcGFiaWxpdGllcywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHBvd2VyX2xldmVsbGluZ19jYXBhYmlsaXRpZXMsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUE9XRVJfTEVWRUxMSU5HX0NBUEFCSUxJVElFUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9vbnVfY2ZnX2NsZWFyKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnIGNmZzsgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgfTsgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19jbGVhciIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X3hncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fb251LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9vbnUsIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9vbnVfY2ZnX2dldF9tdWx0aShiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnIGNmZzsgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgfTsgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0ID0gTlVMTDsgLyoqPCBkZWNsYXJlIG1lc3NhZ2Ugc2V0ICovCisgICAgdWludDMyX3QgbWF4X21zZ3M7ICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgbWF4IG51bWJlciBvZiBtc2dzIHRvIGdldCAqLworICAgIGJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjsgICAgICAgLyoqPCBkZWNsYXJlIGZpbHRlciBpbnZlcnQgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0KiBtc2dfc2V0ID0gTlVMTDtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQzMl90IG1heF9tc2dzO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldF9tdWx0aSIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X3hncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBtYXggbnVtYmVyIG9mIG1zZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXhfbXNncyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgbWF4X21zZ3MgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm1heF9tc2dzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coIm1heF9tc2dzID0gJWQ7XG4iLCBtYXhfbXNncyk7CisKKyAgICAvKiBzZXQgZmlsdGVyIGludmVydCBmbGFnIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyX2ludmVydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW52ZXJ0X2ZpbHRlciA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXJfaW52ZXJ0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImludmVydF9maWx0ZXIgPSAlcztcbiIsIChpbnZlcnRfZmlsdGVyKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworCisgICAgLyogYWxsb2NhdGUgbWVzc2FnZSBzZXQgKi8KKyAgICBlcnIgPSBhcGljbGlfbXNnX3NldF9hbGxvYyhieXRlX3Bvb2wsIEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9vbnUsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX29udSwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIub251X3N0YXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfb251X3N0YXRlIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9vbnVfc3RhdGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIG9udV9zdGF0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIG9udV9zdGF0ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9PTlVfU1RBVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIG9udV9zdGF0ZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIG9udV9zdGF0ZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLm9udV9vbGRfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9vbnVfc3RhdGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X29udV9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgb251X29sZF9zdGF0ZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIG9udV9vbGRfc3RhdGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfT05VX09MRF9TVEFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9vbGRfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIG9udV9vbGRfc3RhdGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCBvbnVfb2xkX3N0YXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZSB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmxvc2kiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb3NpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxhcm1fc3RhdGUubG9zaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5sb2JpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9iaSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmxvYmkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUubG9wY2kiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb3BjaSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmxvcGNpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmxvcGNpX21pY19lcnJvciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvcGNpX21pY19lcnJvciA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmxvcGNpX21pY19lcnJvciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5sb29jaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvb2NpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxhcm1fc3RhdGUubG9vY2kgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUudGl3aSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRpd2kgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGFybV9zdGF0ZS50aXdpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLmRvd2kiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kb3dpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxhcm1fc3RhdGUuZG93aSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5zdWZpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc3VmaSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLnN1ZmkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUuc2ZpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuc2ZpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxhcm1fc3RhdGUuc2ZpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLnNkaSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnNkaSA9IChiY21vbHRfc3RhdHVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsYXJtX3N0YXRlLnNkaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGFybV9zdGF0ZS5kZmkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kZmkgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGFybV9zdGF0ZS5kZmkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYWxhcm1fc3RhdGUuZGdpIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZGdpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxhcm1fc3RhdGUuZGdpIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsYXJtX3N0YXRlLnBxc2kiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5wcXNpID0gKGJjbW9sdF9zdGF0dXMpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxhcm1fc3RhdGUucHFzaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgYWxhcm1fc3RhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQUxBUk1fU1RBVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGFsYXJtX3N0YXRlLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxhcm1fc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIGFsYXJtX3N0YXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgYWxhcm1fc3RhdGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXMgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5wbG9hbV9pay4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMucGxvYW1faWsuYnl0ZXMiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSAxNikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgZmlsdGVyLnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMucGxvYW1faWsuYnl0ZXMgbXVzdCBoYXZlIDE2IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLnBsb2FtX2lrLmJ5dGVzLCAxNik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLnBsb2FtX2lrLmJ5dGVzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMucGxvYW1faWsgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMub21jaV9pay4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMub21jaV9pay5ieXRlcyIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDE2KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciBmaWx0ZXIucmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5vbWNpX2lrLmJ5dGVzIG11c3QgaGF2ZSAxNiBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC5vbWNpX2lrLmJ5dGVzLCAxNik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLm9tY2lfaWsuYnl0ZXMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5vbWNpX2lrIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLm9tY2lfazEuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLm9tY2lfazEuYnl0ZXMiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSAxNikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgZmlsdGVyLnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMub21jaV9rMS5ieXRlcyBtdXN0IGhhdmUgMTYgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwub21jaV9rMS5ieXRlcywgMTYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5vbWNpX2sxLmJ5dGVzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMub21jaV9rMSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5vbWNpX2syLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5vbWNpX2syLmJ5dGVzIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gMTYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIGZpbHRlci5yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLm9tY2lfazIuYnl0ZXMgbXVzdCBoYXZlIDE2IGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIDApOworICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLm9tY2lfazIuYnl0ZXMsIDE2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMub21jaV9rMi5ieXRlcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLm9tY2lfazIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMua2VrLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cy5rZWsuYnl0ZXMiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSAxNikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgZmlsdGVyLnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMua2VrLmJ5dGVzIG11c3QgaGF2ZSAxNiBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC5rZWsuYnl0ZXMsIDE2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMua2VrLmJ5dGVzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMua2VrIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCByZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25fa2V5cyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JFR0lTVFJBVElPTl9FTkNSWVBUSU9OX0tFWVMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCByZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgcmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5jdXJyZW50X2VuY3J5cHRpb25fa2V5LiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX29udV9hZXNfa2V5IHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmN1cnJlbnRfZW5jcnlwdGlvbl9rZXkuZW5jcnlwdGlvbl9rZXkuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5jdXJyZW50X2VuY3J5cHRpb25fa2V5LmVuY3J5cHRpb25fa2V5LmJ5dGVzIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gMTYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIGZpbHRlci5jdXJyZW50X2VuY3J5cHRpb25fa2V5LmVuY3J5cHRpb25fa2V5LmJ5dGVzIG11c3QgaGF2ZSAxNiBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC5lbmNyeXB0aW9uX2tleS5ieXRlcywgMTYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuY3VycmVudF9lbmNyeXB0aW9uX2tleS5lbmNyeXB0aW9uX2tleS5ieXRlcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5jdXJyZW50X2VuY3J5cHRpb25fa2V5LmVuY3J5cHRpb25fa2V5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmN1cnJlbnRfZW5jcnlwdGlvbl9rZXkua2V5X2luZGV4Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwua2V5X2luZGV4ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmN1cnJlbnRfZW5jcnlwdGlvbl9rZXkua2V5X2luZGV4IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBjdXJyZW50X2VuY3J5cHRpb25fa2V5LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9hZXNfa2V5IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQ1VSUkVOVF9FTkNSWVBUSU9OX0tFWSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgY3VycmVudF9lbmNyeXB0aW9uX2tleSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImN1cnJlbnRfZW5jcnlwdGlvbl9rZXkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIGN1cnJlbnRfZW5jcnlwdGlvbl9rZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCBjdXJyZW50X2VuY3J5cHRpb25fa2V5KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnNlcmlhbF9udW1iZXIuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfc2VyaWFsX251bWJlciB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnNlcmlhbF9udW1iZXIudmVuZG9yX2lkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIGZpbHRlci5zZXJpYWxfbnVtYmVyLnZlbmRvcl9pZCBtdXN0IGhhdmUgNCBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLnZlbmRvcl9pZCwgNCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnNlcmlhbF9udW1iZXIudmVuZG9yX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIGZpbHRlci5zZXJpYWxfbnVtYmVyLnZlbmRvcl9zcGVjaWZpYyBtdXN0IGhhdmUgNCBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLnZlbmRvcl9zcGVjaWZpYywgNCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBzZXJpYWxfbnVtYmVyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3NlcmlhbF9udW1iZXIgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9TRVJJQUxfTlVNQkVSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBzZXJpYWxfbnVtYmVyLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2VyaWFsX251bWJlciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgc2VyaWFsX251bWJlcik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIHNlcmlhbF9udW1iZXIpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucmVnaXN0cmF0aW9uX2lkLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Fycl91OF8zNiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJlZ2lzdHJhdGlvbl9pZC5hcnIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKSAhPSAzNikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVmZmVyIGZpbHRlci5yZWdpc3RyYXRpb25faWQuYXJyIG11c3QgaGF2ZSAzNiBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLmFyciwgMzYpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yZWdpc3RyYXRpb25faWQuYXJyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCByZWdpc3RyYXRpb25faWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYXJyX3U4XzM2IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkVHSVNUUkFUSU9OX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCByZWdpc3RyYXRpb25faWQsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyZWdpc3RyYXRpb25faWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIHJlZ2lzdHJhdGlvbl9pZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIHJlZ2lzdHJhdGlvbl9pZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJlZ2lzdHJhdGlvbl9pZF9hdXRvX2xlYXJuaW5nIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHJlZ2lzdHJhdGlvbl9pZF9hdXRvX2xlYXJuaW5nLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgcmVnaXN0cmF0aW9uX2lkX2F1dG9fbGVhcm5pbmcsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkVHSVNUUkFUSU9OX0lEX0FVVE9fTEVBUk5JTkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyZWdpc3RyYXRpb25faWRfYXV0b19sZWFybmluZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgcmVnaXN0cmF0aW9uX2lkX2F1dG9fbGVhcm5pbmcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCByZWdpc3RyYXRpb25faWRfYXV0b19sZWFybmluZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJhbmdpbmdfYnVyc3RfcHJvZmlsZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2J1cnN0X3Byb2ZpbGVfaW5kZXggdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2J1cnN0X3Byb2ZpbGVfaW5kZXgpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgcmFuZ2luZ19idXJzdF9wcm9maWxlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgcmFuZ2luZ19idXJzdF9wcm9maWxlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JBTkdJTkdfQlVSU1RfUFJPRklMRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfYnVyc3RfcHJvZmlsZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgcmFuZ2luZ19idXJzdF9wcm9maWxlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgcmFuZ2luZ19idXJzdF9wcm9maWxlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZGF0YV9idXJzdF9wcm9maWxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYnVyc3RfcHJvZmlsZV9pbmRleCB2YWw7CisgICAgICAgIHZhbCA9IChiY21vbHRfYnVyc3RfcHJvZmlsZV9pbmRleCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBkYXRhX2J1cnN0X3Byb2ZpbGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBkYXRhX2J1cnN0X3Byb2ZpbGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfREFUQV9CVVJTVF9QUk9GSUxFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGF0YV9idXJzdF9wcm9maWxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCBkYXRhX2J1cnN0X3Byb2ZpbGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCBkYXRhX2J1cnN0X3Byb2ZpbGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yYW5naW5nX3RpbWUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCByYW5naW5nX3RpbWUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCByYW5naW5nX3RpbWUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkFOR0lOR19USU1FLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ190aW1lIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCByYW5naW5nX3RpbWUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCByYW5naW5nX3RpbWUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kaXNhYmxlZF9hZnRlcl9kaXNjb3ZlcnkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zdGF0dXMgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgZGlzYWJsZWRfYWZ0ZXJfZGlzY292ZXJ5LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgZGlzYWJsZWRfYWZ0ZXJfZGlzY292ZXJ5LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0RJU0FCTEVEX0FGVEVSX0RJU0NPVkVSWSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRpc2FibGVkX2FmdGVyX2Rpc2NvdmVyeSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgZGlzYWJsZWRfYWZ0ZXJfZGlzY292ZXJ5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgZGlzYWJsZWRfYWZ0ZXJfZGlzY292ZXJ5KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZGVhY3RpdmF0aW9uX3JlYXNvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2RlYWN0aXZhdGlvbl9yZWFzb24gdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X2RlYWN0aXZhdGlvbl9yZWFzb24pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGRlYWN0aXZhdGlvbl9yZWFzb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBkZWFjdGl2YXRpb25fcmVhc29uLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0RFQUNUSVZBVElPTl9SRUFTT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWFjdGl2YXRpb25fcmVhc29uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCBkZWFjdGl2YXRpb25fcmVhc29uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgZGVhY3RpdmF0aW9uX3JlYXNvbik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5hbGxfZ2VtX3BvcnRzLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1NiB2YWwgPSB7IH07CisgICAgICAgIGludDMyX3QgaTA7CisgICAgICAgIHZhbC52YWwgPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIGNsaV9wYXJtLT5hcnJheV9zaXplICogc2l6ZW9mKCp2YWwudmFsKSk7CisgICAgICAgIGlmICh2YWwudmFsID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICB9CisKKyAgICAgICAgdmFsLmxlbiA9IGNsaV9wYXJtLT5hcnJheV9zaXplOworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGxfZ2VtX3BvcnRzLmdlbV9pZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IHZhbC5sZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5hbGxfZ2VtX3BvcnRzLmdlbV9pZCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHZhbC5sZW47IGkwKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnZhbFtpMF0uZ2VtX2lkID0gKGJjbW9sdF94Z3Bvbl9nZW1faWQpIGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGxfZ2VtX3BvcnRzLnN0YXRlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gdmFsLmxlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsbF9nZW1fcG9ydHMuc3RhdGUgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB2YWwubGVuOyBpMCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC52YWxbaTBdLnN0YXRlID0gKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlc1tpMF0uZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgYWxsX2dlbV9wb3J0cywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTYgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9BTExfR0VNX1BPUlRTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBhbGxfZ2VtX3BvcnRzLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYWxsX2dlbV9wb3J0cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgYWxsX2dlbV9wb3J0cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIGFsbF9nZW1fcG9ydHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuYWxsX2FsbG9jcy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMiB2YWwgPSB7IH07CisgICAgICAgIGludDMyX3QgaTE7CisgICAgICAgIHZhbC52YWwgPSBhcGljbGlfYnl0ZV9wb29sX2NhbGxvYyhieXRlX3Bvb2wsIGNsaV9wYXJtLT5hcnJheV9zaXplICogc2l6ZW9mKCp2YWwudmFsKSk7CisgICAgICAgIGlmICh2YWwudmFsID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICB9CisKKyAgICAgICAgdmFsLmxlbiA9IGNsaV9wYXJtLT5hcnJheV9zaXplOworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5hbGxfYWxsb2NzLmFsbG9jX2lkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gdmFsLmxlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmFsbF9hbGxvY3MuYWxsb2NfaWQgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB2YWwubGVuOyBpMSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC52YWxbaTFdLmFsbG9jX2lkID0gKGJjbW9sdF94Z3Bvbl9hbGxvY19pZCkgY2xpX3Bhcm0tPnZhbHVlc1tpMV0udW51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmFsbF9hbGxvY3Muc3RhdGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSB2YWwubGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYWxsX2FsbG9jcy5zdGF0ZSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHZhbC5sZW47IGkxKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLnZhbFtpMV0uc3RhdGUgPSAoYmNtb2x0X2FsbG9jX3N0YXRlKSBjbGlfcGFybS0+dmFsdWVzW2kxXS5lbnVtX3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBhbGxfYWxsb2NzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQUxMX0FMTE9DUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgYWxsX2FsbG9jcywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImFsbF9hbGxvY3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIGFsbF9hbGxvY3MpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCBhbGxfYWxsb2NzKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmV4dGVuZGVkX2d1YXJkX3RpbWUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZSB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmV4dGVuZGVkX2d1YXJkX3RpbWUuYWRkaXRpb25hbF9wcmVidXJzdF9ndWFyZF90aW1lIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYWRkaXRpb25hbF9wcmVidXJzdF9ndWFyZF90aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmV4dGVuZGVkX2d1YXJkX3RpbWUuYWRkaXRpb25hbF9wcmVidXJzdF9ndWFyZF90aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmV4dGVuZGVkX2d1YXJkX3RpbWUuYWRkaXRpb25hbF9wb3N0YnVyc3RfZ3VhcmRfdGltZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFkZGl0aW9uYWxfcG9zdGJ1cnN0X2d1YXJkX3RpbWUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZXh0ZW5kZWRfZ3VhcmRfdGltZS5hZGRpdGlvbmFsX3Bvc3RidXJzdF9ndWFyZF90aW1lIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBleHRlbmRlZF9ndWFyZF90aW1lLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2V4dGVuZGVkX2d1YXJkX3RpbWUgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9FWFRFTkRFRF9HVUFSRF9USU1FLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBleHRlbmRlZF9ndWFyZF90aW1lLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXh0ZW5kZWRfZ3VhcmRfdGltZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgZXh0ZW5kZWRfZ3VhcmRfdGltZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIGV4dGVuZGVkX2d1YXJkX3RpbWUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci51c19saW5lX3JhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF91cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF91cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCB1c19saW5lX3JhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCB1c19saW5lX3JhdGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfVVNfTElORV9SQVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXNfbGluZV9yYXRlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCB1c19saW5lX3JhdGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCB1c19saW5lX3JhdGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuY2FsaWJyYXRpb25fcmVjb3JkLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Fycl9jYWxpYnJhdGlvbl9yZWNvcmRfOCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmNhbGlicmF0aW9uX3JlY29yZC5hcnIiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgaTI7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gOCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXJyYXkgZmlsdGVyLmNhbGlicmF0aW9uX3JlY29yZC5hcnIgbXVzdCBoYXZlIDggZWxlbWVudHNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IDg7IGkyKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsLmFycltpMl0gPSAoYmNtb2x0X2NhbGlicmF0aW9uX3JlY29yZCkgY2xpX3Bhcm0tPnZhbHVlc1tpMl0uZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmNhbGlicmF0aW9uX3JlY29yZC5hcnIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGNhbGlicmF0aW9uX3JlY29yZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9hcnJfY2FsaWJyYXRpb25fcmVjb3JkXzggdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9DQUxJQlJBVElPTl9SRUNPUkQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGNhbGlicmF0aW9uX3JlY29yZCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNhbGlicmF0aW9uX3JlY29yZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgY2FsaWJyYXRpb25fcmVjb3JkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgY2FsaWJyYXRpb25fcmVjb3JkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudHVuaW5nX2dyYW51bGFyaXR5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCB0dW5pbmdfZ3JhbnVsYXJpdHksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCB0dW5pbmdfZ3JhbnVsYXJpdHksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfVFVOSU5HX0dSQU5VTEFSSVRZLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHVuaW5nX2dyYW51bGFyaXR5Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCB0dW5pbmdfZ3JhbnVsYXJpdHkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCB0dW5pbmdfZ3JhbnVsYXJpdHkpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zdGVwX3R1bmluZ190aW1lIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBzdGVwX3R1bmluZ190aW1lLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgc3RlcF90dW5pbmdfdGltZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9TVEVQX1RVTklOR19USU1FLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RlcF90dW5pbmdfdGltZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgc3RlcF90dW5pbmdfdGltZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIHN0ZXBfdHVuaW5nX3RpbWUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5wb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0aWVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBwb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0aWVzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgcG93ZXJfbGV2ZWxsaW5nX2NhcGFiaWxpdGllcywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9QT1dFUl9MRVZFTExJTkdfQ0FQQUJJTElUSUVTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG93ZXJfbGV2ZWxsaW5nX2NhcGFiaWxpdGllcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgcG93ZXJfbGV2ZWxsaW5nX2NhcGFiaWxpdGllcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIHBvd2VyX2xldmVsbGluZ19jYXBhYmlsaXRpZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIucmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cy5yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0ZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXRlID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cy5yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0ZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMuc21hX2ZsYWciKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zbWFfZmxhZyA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cy5zbWFfZmxhZyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgcmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JFUVVFU1RfUkVHSVNUUkFUSU9OX1NUQVRVUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgcmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCByZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCByZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX29udSwgb251X3N0YXRlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fb251LCBvbnVfb2xkX3N0YXRlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fb251LCBhbGFybV9zdGF0ZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX29udSwgcmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX29udSwgY3VycmVudF9lbmNyeXB0aW9uX2tleSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX29udSwgc2VyaWFsX251bWJlcikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX29udSwgcmVnaXN0cmF0aW9uX2lkKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fb251LCByZWdpc3RyYXRpb25faWRfYXV0b19sZWFybmluZykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX29udSwgcmFuZ2luZ19idXJzdF9wcm9maWxlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fb251LCBkYXRhX2J1cnN0X3Byb2ZpbGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIHJhbmdpbmdfdGltZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX29udSwgZGlzYWJsZWRfYWZ0ZXJfZGlzY292ZXJ5KSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fb251LCBkZWFjdGl2YXRpb25fcmVhc29uKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fb251LCBhbGxfZ2VtX3BvcnRzKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fb251LCBhbGxfYWxsb2NzKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fb251LCBleHRlbmRlZF9ndWFyZF90aW1lKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fb251LCB1c19saW5lX3JhdGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl9vbnUsIGNhbGlicmF0aW9uX3JlY29yZCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX29udSwgdHVuaW5nX2dyYW51bGFyaXR5KSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fb251LCBzdGVwX3R1bmluZ190aW1lKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fb251LCBwb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0aWVzKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fb251LCByZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fb251LCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX29udSwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgJmNmZy5oZHIsIChpbnZlcnRfZmlsdGVyKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgbXNnX3NldCk7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9vbnVfc3RhdF9nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX29udV9zdGF0IHN0YXQ7ICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyB9OyAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb3NfYm9vbCBjbGVhcl9vbl9yZWFkOyAgICAgICAvKio8IGRlY2xhcmUgJ2NsZWFyIG9uIHJlYWQnIGZsYWcgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9vbnVfc3RhdCBzdGF0O1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9zX2Jvb2wgY2xlYXJfb25fcmVhZDtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm9udV9pZCA9IChiY21vbHRfeGdwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkub251X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX09OVV9JRCwgJmtleS5vbnVfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogc2V0IHN0YXQgZmxhZ3MgZnJvbSBDTEkgcGFyYW1ldGVyICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjbGVhciIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY2xlYXJfb25fcmVhZCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjbGVhciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJjbGVhcl9vbl9yZWFkID0gJXM7XG4iLCAoY2xlYXJfb25fcmVhZCkgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfU1RBVF9JTklUKCZzdGF0LCB4Z3Bvbl9vbnUsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfSU5JVCgmc3RhdCwgeGdwb25fb251LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvc2l0aXZlX2RyaWZ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX29udSwgcG9zaXRpdmVfZHJpZnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX29udSwgcG9zaXRpdmVfZHJpZnQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm5lZ2F0aXZlX2RyaWZ0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX29udSwgbmVnYXRpdmVfZHJpZnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX29udSwgbmVnYXRpdmVfZHJpZnQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRlbGltaXRlcl9taXNzX2RldGVjdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIGRlbGltaXRlcl9taXNzX2RldGVjdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fb251LCBkZWxpbWl0ZXJfbWlzc19kZXRlY3Rpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJpcDMyX2Vycm9ycyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIGJpcDMyX2Vycm9ycyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fb251LCBiaXAzMl9lcnJvcnMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3dvcmRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX29udSwgcnhfd29yZHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX29udSwgcnhfd29yZHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZlY19jb3JyZWN0ZWRfc3ltYm9scyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIGZlY19jb3JyZWN0ZWRfc3ltYm9scyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fb251LCBmZWNfY29ycmVjdGVkX3N5bWJvbHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZlY19jb3JyZWN0ZWRfY29kZXdvcmRzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX29udSwgZmVjX2NvcnJlY3RlZF9jb2Rld29yZHMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX29udSwgZmVjX2NvcnJlY3RlZF9jb2Rld29yZHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZlY191bmNvcnJlY3RhYmxlX2NvZGV3b3JkcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIGZlY191bmNvcnJlY3RhYmxlX2NvZGV3b3Jkcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fb251LCBmZWNfdW5jb3JyZWN0YWJsZV9jb2Rld29yZHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZlY19jb2Rld29yZHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fb251LCBmZWNfY29kZXdvcmRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIGZlY19jb2Rld29yZHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZlY19jb3JyZWN0ZWRfYml0cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIGZlY19jb3JyZWN0ZWRfYml0cyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fb251LCBmZWNfY29ycmVjdGVkX2JpdHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInhnZW1fa2V5X2Vycm9ycyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIHhnZW1fa2V5X2Vycm9ycyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fb251LCB4Z2VtX2tleV9lcnJvcnMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInhnZW1fbG9zcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIHhnZW1fbG9zcyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fb251LCB4Z2VtX2xvc3MpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3Bsb2Ftc19taWNfZXJyb3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fb251LCByeF9wbG9hbXNfbWljX2Vycm9yKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIHJ4X3Bsb2Ftc19taWNfZXJyb3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3Bsb2Ftc19ub25faWRsZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIHJ4X3Bsb2Ftc19ub25faWRsZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fb251LCByeF9wbG9hbXNfbm9uX2lkbGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X29tY2kiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fb251LCByeF9vbWNpKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIHJ4X29tY2kpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fb251LCByeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIHJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2J5dGVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX29udSwgcnhfYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX29udSwgcnhfYnl0ZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3BhY2tldHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fb251LCByeF9wYWNrZXRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIHJ4X3BhY2tldHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2J5dGVzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX29udSwgdHhfYnl0ZXMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIHhncG9uX29udSwgdHhfYnl0ZXMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3BhY2tldHMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fb251LCB0eF9wYWNrZXRzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIHR4X3BhY2tldHMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIHBvc2l0aXZlX2RyaWZ0KSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX29udSwgbmVnYXRpdmVfZHJpZnQpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fb251LCBkZWxpbWl0ZXJfbWlzc19kZXRlY3Rpb24pICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fb251LCBiaXAzMl9lcnJvcnMpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fb251LCByeF93b3JkcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIGZlY19jb3JyZWN0ZWRfc3ltYm9scykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIGZlY19jb3JyZWN0ZWRfY29kZXdvcmRzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX29udSwgZmVjX3VuY29ycmVjdGFibGVfY29kZXdvcmRzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX29udSwgZmVjX2NvZGV3b3JkcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIGZlY19jb3JyZWN0ZWRfYml0cykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIHhnZW1fa2V5X2Vycm9ycykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIHhnZW1fbG9zcykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIHJ4X3Bsb2Ftc19taWNfZXJyb3IpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fb251LCByeF9wbG9hbXNfbm9uX2lkbGUpICYmICFCQ01PTFRfU1RBVF9QUk9QX0lTX1NFVCgmc3RhdCwgeGdwb25fb251LCByeF9vbWNpKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX29udSwgcnhfb21jaV9wYWNrZXRzX2NyY19lcnJvcikgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIHJ4X2J5dGVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX29udSwgcnhfcGFja2V0cykgJiYgIUJDTU9MVF9TVEFUX1BST1BfSVNfU0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIHR4X2J5dGVzKSAmJiAhQkNNT0xUX1NUQVRfUFJPUF9JU19TRVQoJnN0YXQsIHhncG9uX29udSwgdHhfcGFja2V0cykpCisgICAgeworICAgICAgICBCQ01PTFRfU1RBVF9QUk9QX0dFVCgmc3RhdCwgeGdwb25fb251LCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX1BST1BfR0VUKCZzdGF0LCB4Z3Bvbl9vbnUsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3N0YXRfZ2V0KGRldmljZV9pZCwgJnN0YXQuaGRyLCBjbGVhcl9vbl9yZWFkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfc3RhdF9nZXQoZGV2aWNlX2lkLCAmc3RhdC5oZHIsIGNsZWFyX29uX3JlYWQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmc3RhdC5oZHIuaGRyKTsKKyAgICB9CisKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBzdGF0Lmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9vbnVfb3Blcl9zZXRfb251X3N0YXRlX3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGUgb3BlcjsgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgfTsgICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGUgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X3hncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCB4Z3Bvbl9vbnUsIHNldF9vbnVfc3RhdGUsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fb251LCBzZXRfb251X3N0YXRlLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9zdGF0ZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X29udV9vcGVyYXRpb24gdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X29udV9vcGVyYXRpb24pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX29udSwgc2V0X29udV9zdGF0ZSwgb251X3N0YXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fb251LCBzZXRfb251X3N0YXRlLCBvbnVfc3RhdGUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9TRVRfT05VX1NUQVRFLCBCQ01PTFRfWEdQT05fT05VX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fb251X29wZXJfcnNzaV9tZWFzdXJlbWVudF9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50IG9wZXI7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7IH07ICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50IG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF94Z3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5vbnVfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfT05VX0lELCAma2V5Lm9udV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fb251LCByc3NpX21lYXN1cmVtZW50LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX29udSwgcnNzaV9tZWFzdXJlbWVudCwga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9vbnVfcHJveHlfcGxvYW1fcGFja2V0X3NlbmQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXQgcHJveHk7ICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7IH07ICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXQgcHJveHk7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfcHJveHlfc2VuZCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X3hncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfUFJPWFlfSU5JVCgmcHJveHksIHhncG9uX29udSwgcGxvYW1fcGFja2V0LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9QUk9YWV9JTklUKCZwcm94eSwgeGdwb25fb251LCBwbG9hbV9wYWNrZXQsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVmYXVsdF9rZXkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCB4Z3Bvbl9vbnUsIHBsb2FtX3BhY2tldCwgZGVmYXVsdF9rZXksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIHhncG9uX29udSwgcGxvYW1fcGFja2V0LCBkZWZhdWx0X2tleSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFksIEJDTU9MVF9YR1BPTl9PTlVfUFJPWFlfSURfUExPQU1fUEFDS0VULCBCQ01PTFRfWEdQT05fT05VX1BMT0FNX1BBQ0tFVF9JRF9ERUZBVUxUX0tFWSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJwbG9hbS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hcnJfdThfNDAgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBsb2FtLmFyciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDQwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidWZmZXIgcGxvYW0uYXJyIG11c3QgaGF2ZSA0MCBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLmFyciwgNDApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBsb2FtLmFyciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCB4Z3Bvbl9vbnUsIHBsb2FtX3BhY2tldCwgcGxvYW0sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYXJyX3U4XzQwIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX1BST1hZLCBCQ01PTFRfWEdQT05fT05VX1BST1hZX0lEX1BMT0FNX1BBQ0tFVCwgQkNNT0xUX1hHUE9OX09OVV9QTE9BTV9QQUNLRVRfSURfUExPQU0sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgeGdwb25fb251LCBwbG9hbV9wYWNrZXQsIHBsb2FtLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X3Byb3h5X3NlbmQoZGV2aWNlX2lkLCAmcHJveHkuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfcHJveHlfc2VuZChkZXZpY2VfaWQsICZwcm94eS5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgcHJveHkuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX29udV9wcm94eV9jcHVfcGFja2V0c19zZW5kKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0cyBwcm94eTsgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgfTsgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHMgcHJveHk7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfcHJveHlfc2VuZCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X3hncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfUFJPWFlfSU5JVCgmcHJveHksIHhncG9uX29udSwgY3B1X3BhY2tldHMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX1BST1hZX0lOSVQoJnByb3h5LCB4Z3Bvbl9vbnUsIGNwdV9wYWNrZXRzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBhY2tldF90eXBlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcGFja2V0X3R5cGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3BhY2tldF90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIHhncG9uX29udSwgY3B1X3BhY2tldHMsIHBhY2tldF90eXBlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCB4Z3Bvbl9vbnUsIGNwdV9wYWNrZXRzLCBwYWNrZXRfdHlwZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFksIEJDTU9MVF9YR1BPTl9PTlVfUFJPWFlfSURfQ1BVX1BBQ0tFVFMsIEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfUEFDS0VUX1RZUEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjYWxjX2NyYyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIHhncG9uX29udSwgY3B1X3BhY2tldHMsIGNhbGNfY3JjLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCB4Z3Bvbl9vbnUsIGNwdV9wYWNrZXRzLCBjYWxjX2NyYywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFksIEJDTU9MVF9YR1BPTl9PTlVfUFJPWFlfSURfQ1BVX1BBQ0tFVFMsIEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfQ0FMQ19DUkMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJudW1iZXJfb2ZfcGFja2V0cyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCB4Z3Bvbl9vbnUsIGNwdV9wYWNrZXRzLCBudW1iZXJfb2ZfcGFja2V0cywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgeGdwb25fb251LCBjcHVfcGFja2V0cywgbnVtYmVyX29mX3BhY2tldHMsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX1BST1hZLCBCQ01PTFRfWEdQT05fT05VX1BST1hZX0lEX0NQVV9QQUNLRVRTLCBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRTX0lEX05VTUJFUl9PRl9QQUNLRVRTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGFja2V0X3NpemUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQxNl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIHhncG9uX29udSwgY3B1X3BhY2tldHMsIHBhY2tldF9zaXplLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCB4Z3Bvbl9vbnUsIGNwdV9wYWNrZXRzLCBwYWNrZXRfc2l6ZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFksIEJDTU9MVF9YR1BPTl9PTlVfUFJPWFlfSURfQ1BVX1BBQ0tFVFMsIEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfUEFDS0VUX1NJWkUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJidWZmZXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OCB2YWwgPSB7IH07CisgICAgICAgIHZhbC5sZW4gPSBiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKTsKKyAgICAgICAgdmFsLnZhbCA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgdmFsLmxlbik7CisgICAgICAgIGlmICh2YWwudmFsID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICB9CisKKyAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwudmFsLCB2YWwubGVuKTsKKyAgICAgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgeGdwb25fb251LCBjcHVfcGFja2V0cywgYnVmZmVyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX1BST1hZLCBCQ01PTFRfWEdQT05fT05VX1BST1hZX0lEX0NQVV9QQUNLRVRTLCBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRTX0lEX0JVRkZFUiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCB4Z3Bvbl9vbnUsIGNwdV9wYWNrZXRzLCBidWZmZXIsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfcHJveHlfc2VuZChkZXZpY2VfaWQsICZwcm94eS5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9wcm94eV9zZW5kKGRldmljZV9pZCwgJnByb3h5Lmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBwcm94eS5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fb251X29wZXJfcmVxdWVzdF9yZWdpc3RyYXRpb25fc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb24gb3BlcjsgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgfTsgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbiBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm9udV9pZCA9IChiY21vbHRfeGdwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkub251X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX09OVV9JRCwgJmtleS5vbnVfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX29udSwgcmVxdWVzdF9yZWdpc3RyYXRpb24sIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fb251LCByZXF1ZXN0X3JlZ2lzdHJhdGlvbiwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzbWFfZmxhZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9vbnUsIHJlcXVlc3RfcmVnaXN0cmF0aW9uLCBzbWFfZmxhZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX29udSwgcmVxdWVzdF9yZWdpc3RyYXRpb24sIHNtYV9mbGFnLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfUkVRVUVTVF9SRUdJU1RSQVRJT04sIEJDTU9MVF9YR1BPTl9PTlVfUkVRVUVTVF9SRUdJU1RSQVRJT05fSURfU01BX0ZMQUcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9vbnVfb3Blcl9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmcgb3BlcjsgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyB9OyAgICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF94Z3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5vbnVfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfT05VX0lELCAma2V5Lm9udV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fb251LCBjaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX29udSwgY2hhbmdlX3Bvd2VyX2xldmVsbGluZywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb250cm9sIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfcG93ZXJfbGV2ZWxsaW5nX2NvbnRyb2wgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3Bvd2VyX2xldmVsbGluZ19jb250cm9sKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9vbnUsIGNoYW5nZV9wb3dlcl9sZXZlbGxpbmcsIGNvbnRyb2wsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9vbnUsIGNoYW5nZV9wb3dlcl9sZXZlbGxpbmcsIGNvbnRyb2wsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9DSEFOR0VfUE9XRVJfTEVWRUxMSU5HLCBCQ01PTFRfWEdQT05fT05VX0NIQU5HRV9QT1dFUl9MRVZFTExJTkdfSURfQ09OVFJPTCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImF0dGVudWF0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9vbnUsIGNoYW5nZV9wb3dlcl9sZXZlbGxpbmcsIGF0dGVudWF0aW9uLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fb251LCBjaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nLCBhdHRlbnVhdGlvbiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX0NIQU5HRV9QT1dFUl9MRVZFTExJTkcsIEJDTU9MVF9YR1BPTl9PTlVfQ0hBTkdFX1BPV0VSX0xFVkVMTElOR19JRF9BVFRFTlVBVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX29udV9vcGVyX2dldF9wb3dlcl9sZXZlbF9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX29udV9nZXRfcG93ZXJfbGV2ZWwgb3BlcjsgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7IH07ICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9nZXRfcG93ZXJfbGV2ZWwgb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X3hncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCB4Z3Bvbl9vbnUsIGdldF9wb3dlcl9sZXZlbCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCB4Z3Bvbl9vbnUsIGdldF9wb3dlcl9sZXZlbCwga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9vbnVfb3Blcl9nZXRfcG93ZXJfY29uc3VtcHRpb25fc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2NvbnN1bXB0aW9uIG9wZXI7ICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7IH07ICAgICAgICAgICAgICAgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fb251X2dldF9wb3dlcl9jb25zdW1wdGlvbiBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm9udV9pZCA9IChiY21vbHRfeGdwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkub251X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX09OVV9JRCwgJmtleS5vbnVfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX29udSwgZ2V0X3Bvd2VyX2NvbnN1bXB0aW9uLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX29udSwgZ2V0X3Bvd2VyX2NvbnN1bXB0aW9uLCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX29udV9vcGVyX2FkanVzdF90eF93YXZlbGVuZ3RoX3N1Ym1pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoIG9wZXI7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7IH07ICAgICAgICAgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGggb3BlcjtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9vcGVyX3N1Ym1pdCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X3hncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCB4Z3Bvbl9vbnUsIGFkanVzdF90eF93YXZlbGVuZ3RoLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX29udSwgYWRqdXN0X3R4X3dhdmVsZW5ndGgsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZnJlcXVlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfZnJlcXVlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uIHZhbDsKKyAgICAgICAgdmFsID0gKGJjbW9sdF9mcmVxdWVuY3lfYWRqdXN0bWVudF9kaXJlY3Rpb24pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX29udSwgYWRqdXN0X3R4X3dhdmVsZW5ndGgsIGZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX29udSwgYWRqdXN0X3R4X3dhdmVsZW5ndGgsIGZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX0FESlVTVF9UWF9XQVZFTEVOR1RILCBCQ01PTFRfWEdQT05fT05VX0FESlVTVF9UWF9XQVZFTEVOR1RIX0lEX0ZSRVFVRU5DWV9BREpVU1RNRU5UX0RJUkVDVElPTiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZyZXF1ZW5jeV9hZGp1c3RtZW50X3NpemUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX29udSwgYWRqdXN0X3R4X3dhdmVsZW5ndGgsIGZyZXF1ZW5jeV9hZGp1c3RtZW50X3NpemUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9vbnUsIGFkanVzdF90eF93YXZlbGVuZ3RoLCBmcmVxdWVuY3lfYWRqdXN0bWVudF9zaXplLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfQURKVVNUX1RYX1dBVkVMRU5HVEgsIEJDTU9MVF9YR1BPTl9PTlVfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfRlJFUVVFTkNZX0FESlVTVE1FTlRfU0laRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIG9wZXIuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX29udV9vcGVyX3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fc3VibWl0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uIG9wZXI7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7IH07ICAgICAgICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF94Z3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5vbnVfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfT05VX0lELCAma2V5Lm9udV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fb251LCBzZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX29udSwgc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbiwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAibWFzdGVyX2tleS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hZXNfa2V5IHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYXN0ZXJfa2V5LmJ5dGVzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlcikgIT0gMTYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciBtYXN0ZXJfa2V5LmJ5dGVzIG11c3QgaGF2ZSAxNiBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLmJ5dGVzLCAxNik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAibWFzdGVyX2tleS5ieXRlcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fb251LCBzZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uLCBtYXN0ZXJfa2V5LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Flc19rZXkgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfT1BFUiwgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT04sIEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9JRF9NQVNURVJfS0VZLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9vbnUsIHNlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb24sIG1hc3Rlcl9rZXksIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJidWZmZXIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OCB2YWwgPSB7IH07CisgICAgICAgIHZhbC5sZW4gPSBiY21vbHRfYnVmX2dldF91c2VkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyKTsKKyAgICAgICAgdmFsLnZhbCA9IGFwaWNsaV9ieXRlX3Bvb2xfY2FsbG9jKGJ5dGVfcG9vbCwgdmFsLmxlbik7CisgICAgICAgIGlmICh2YWwudmFsID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX05PTUVNLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICB9CisKKyAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCB2YWwudmFsLCB2YWwubGVuKTsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX29udSwgc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbiwgYnVmZmVyLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OLCBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fSURfQlVGRkVSLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9vbnUsIHNlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb24sIGJ1ZmZlciwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1pYyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX29udSwgc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbiwgbWljLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fb251LCBzZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uLCBtaWMsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OLCBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fSURfTUlDLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fb251X29wZXJfb251X3R1bmluZ19pbl9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luIG9wZXI7ICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7IH07ICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luIG9wZXI7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfb3Blcl9zdWJtaXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF94Z3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5vbnVfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfT05VX0lELCAma2V5Lm9udV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fb251LCBvbnVfdHVuaW5nX2luLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX29udSwgb251X3R1bmluZ19pbiwga2V5KTtcbiIpOworCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2VfaWQsICZvcGVyLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBvcGVyLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl9vbnVfb3Blcl9vbnVfdHVuaW5nX291dF9zdWJtaXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dCBvcGVyOyAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7IH07ICAgICAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dCBvcGVyO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X29wZXJfc3VibWl0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9pZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lm9udV9pZCA9IChiY21vbHRfeGdwb25fb251X2lkKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9udV9pZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkub251X2lkID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX09OVV9JRCwgJmtleS5vbnVfaWQpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX29udSwgb251X3R1bmluZ19vdXQsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fb251LCBvbnVfdHVuaW5nX291dCwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAidGFyZ2V0X2RzX3Bvbl9pZC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9wb25faWQgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRhcmdldF9kc19wb25faWQuYWRtaW5pc3RyYXRpdmVfbGFiZWwiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5hZG1pbmlzdHJhdGl2ZV9sYWJlbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInRhcmdldF9kc19wb25faWQuYWRtaW5pc3RyYXRpdmVfbGFiZWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0YXJnZXRfZHNfcG9uX2lkLmR3bGNoX2lkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuZHdsY2hfaWQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ0YXJnZXRfZHNfcG9uX2lkLmR3bGNoX2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9vbnUsIG9udV90dW5pbmdfb3V0LCB0YXJnZXRfZHNfcG9uX2lkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3Bvbl9pZCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfT05VX1RVTklOR19PVVQsIEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfSURfVEFSR0VUX0RTX1BPTl9JRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fb251LCBvbnVfdHVuaW5nX291dCwgdGFyZ2V0X2RzX3Bvbl9pZCwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJ0YXJnZXRfdXNfcG9uX2lkLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3Bvbl9pZCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidGFyZ2V0X3VzX3Bvbl9pZC5hZG1pbmlzdHJhdGl2ZV9sYWJlbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmFkbWluaXN0cmF0aXZlX2xhYmVsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAidGFyZ2V0X3VzX3Bvbl9pZC5hZG1pbmlzdHJhdGl2ZV9sYWJlbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRhcmdldF91c19wb25faWQuZHdsY2hfaWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5kd2xjaF9pZCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInRhcmdldF91c19wb25faWQuZHdsY2hfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX29udSwgb251X3R1bmluZ19vdXQsIHRhcmdldF91c19wb25faWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfcG9uX2lkIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX09QRVIsIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9PTlVfVFVOSU5HX09VVCwgQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9JRF9UQVJHRVRfVVNfUE9OX0lELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9vbnUsIG9udV90dW5pbmdfb3V0LCB0YXJnZXRfdXNfcG9uX2lkLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidGltZV90b19zd2l0Y2giKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9vbnUsIG9udV90dW5pbmdfb3V0LCB0aW1lX3RvX3N3aXRjaCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX29udSwgb251X3R1bmluZ19vdXQsIHRpbWVfdG9fc3dpdGNoLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfT05VX1RVTklOR19PVVQsIEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfSURfVElNRV9UT19TV0lUQ0gsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyb2xsYmFjayIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9vbnUsIG9udV90dW5pbmdfb3V0LCByb2xsYmFjaywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX29udSwgb251X3R1bmluZ19vdXQsIHJvbGxiYWNrLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfT05VX1RVTklOR19PVVQsIEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfSURfUk9MTEJBQ0ssICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0dXMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zdGF0dXMgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3N0YXR1cykgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fb251LCBvbnVfdHVuaW5nX291dCwgc3RhdHVzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fb251LCBvbnVfdHVuaW5nX291dCwgc3RhdHVzLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9PUEVSLCBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfT05VX1RVTklOR19PVVQsIEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfSURfU1RBVFVTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KGRldmljZV9pZCwgJm9wZXIuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlX2lkLCAmb3Blci5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgb3Blci5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fb251X3N0YXRfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeGdwb25fb251X3N0YXRfY2ZnIHN0YXRfY2ZnOyAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyB9OyAgICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9pZCBzdGF0X2lkOyAgIC8qKjwgZGVjbGFyZSBzdGF0IElEICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fb251X3N0YXRfY2ZnIHN0YXRfY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X3N0YXRfY2ZnX2dldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfaWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5vbnVfaWQgPSAoYmNtb2x0X3hncG9uX29udV9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJvbnVfaWQgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lm9udV9pZCA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9PTlVfSUQsICZrZXkub251X2lkKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIHNldCBzdGF0IElEIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBzdGF0X2lkID0gKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9pZCkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIHN3aXRjaCAoc3RhdF9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1BPU0lUSVZFX0RSSUZUOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHBvc2l0aXZlX2RyaWZ0LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHBvc2l0aXZlX2RyaWZ0LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfTkVHQVRJVkVfRFJJRlQ6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgbmVnYXRpdmVfZHJpZnQsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgbmVnYXRpdmVfZHJpZnQsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9ERUxJTUlURVJfTUlTU19ERVRFQ1RJT046CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgZGVsaW1pdGVyX21pc3NfZGV0ZWN0aW9uLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIGRlbGltaXRlcl9taXNzX2RldGVjdGlvbiwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0JJUDMyX0VSUk9SUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCBiaXAzMl9lcnJvcnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgYmlwMzJfZXJyb3JzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfV09SRFM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgcnhfd29yZHMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgcnhfd29yZHMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09SUkVDVEVEX1NZTUJPTFM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgZmVjX2NvcnJlY3RlZF9zeW1ib2xzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIGZlY19jb3JyZWN0ZWRfc3ltYm9scywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0ZFQ19DT1JSRUNURURfQ09ERVdPUkRTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIGZlY19jb3JyZWN0ZWRfY29kZXdvcmRzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIGZlY19jb3JyZWN0ZWRfY29kZXdvcmRzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX1VOQ09SUkVDVEFCTEVfQ09ERVdPUkRTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIGZlY191bmNvcnJlY3RhYmxlX2NvZGV3b3Jkcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCBmZWNfdW5jb3JyZWN0YWJsZV9jb2Rld29yZHMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09ERVdPUkRTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIGZlY19jb2Rld29yZHMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgZmVjX2NvZGV3b3Jkcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0ZFQ19DT1JSRUNURURfQklUUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCBmZWNfY29ycmVjdGVkX2JpdHMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgZmVjX2NvcnJlY3RlZF9iaXRzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfWEdFTV9LRVlfRVJST1JTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHhnZW1fa2V5X2Vycm9ycywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCB4Z2VtX2tleV9lcnJvcnMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9YR0VNX0xPU1M6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgeGdlbV9sb3NzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHhnZW1fbG9zcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX1BMT0FNU19NSUNfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgcnhfcGxvYW1zX21pY19lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCByeF9wbG9hbXNfbWljX2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfUExPQU1TX05PTl9JRExFOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHJ4X3Bsb2Ftc19ub25faWRsZSwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCByeF9wbG9hbXNfbm9uX2lkbGUsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9PTUNJOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHJ4X29tY2ksIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgcnhfb21jaSwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1I6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgcnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCByeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfQllURVM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgcnhfYnl0ZXMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgcnhfYnl0ZXMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9QQUNLRVRTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHJ4X3BhY2tldHMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgcnhfcGFja2V0cywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1RYX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHR4X2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHR4X2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfVFhfUEFDS0VUUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCB0eF9wYWNrZXRzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHR4X3BhY2tldHMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUkFOR0UsICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmc3RhdF9jZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdF9jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX29udV9zdGF0X2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZyBzdGF0X2NmZzsgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgfTsgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21vbHRfeGdwb25fb251X3N0YXRfaWQgc3RhdF9pZDsgICAvKio8IGRlY2xhcmUgc3RhdCBJRCAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZyBzdGF0X2NmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9zdGF0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkub251X2lkID0gKGJjbW9sdF94Z3Bvbl9vbnVfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAib251X2lkIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5vbnVfaWQgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX09OVV9LRVlfSURfT05VX0lELCAma2V5Lm9udV9pZCk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgc3RhdCBJRCBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgc3RhdF9pZCA9IChiY21vbHRfeGdwb25fb251X3N0YXRfaWQpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBzd2l0Y2ggKHN0YXRfaWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9QT1NJVElWRV9EUklGVDoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCBwb3NpdGl2ZV9kcmlmdCwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCBwb3NpdGl2ZV9kcmlmdCwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX05FR0FUSVZFX0RSSUZUOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIG5lZ2F0aXZlX2RyaWZ0LCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIG5lZ2F0aXZlX2RyaWZ0LCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfREVMSU1JVEVSX01JU1NfREVURUNUSU9OOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIGRlbGltaXRlcl9taXNzX2RldGVjdGlvbiwga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCBkZWxpbWl0ZXJfbWlzc19kZXRlY3Rpb24sIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9CSVAzMl9FUlJPUlM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgYmlwMzJfZXJyb3JzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIGJpcDMyX2Vycm9ycywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX1dPUkRTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHJ4X3dvcmRzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHJ4X3dvcmRzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX0NPUlJFQ1RFRF9TWU1CT0xTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIGZlY19jb3JyZWN0ZWRfc3ltYm9scywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCBmZWNfY29ycmVjdGVkX3N5bWJvbHMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09SUkVDVEVEX0NPREVXT1JEUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCBmZWNfY29ycmVjdGVkX2NvZGV3b3Jkcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCBmZWNfY29ycmVjdGVkX2NvZGV3b3Jkcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0ZFQ19VTkNPUlJFQ1RBQkxFX0NPREVXT1JEUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCBmZWNfdW5jb3JyZWN0YWJsZV9jb2Rld29yZHMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgZmVjX3VuY29ycmVjdGFibGVfY29kZXdvcmRzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCBmZWNfY29kZXdvcmRzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIGZlY19jb2Rld29yZHMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09SUkVDVEVEX0JJVFM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgZmVjX2NvcnJlY3RlZF9iaXRzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIGZlY19jb3JyZWN0ZWRfYml0cywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1hHRU1fS0VZX0VSUk9SUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCB4Z2VtX2tleV9lcnJvcnMsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgeGdlbV9rZXlfZXJyb3JzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfWEdFTV9MT1NTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHhnZW1fbG9zcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCB4Z2VtX2xvc3MsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfTUlDX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHJ4X3Bsb2Ftc19taWNfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgcnhfcGxvYW1zX21pY19lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX1BMT0FNU19OT05fSURMRToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCByeF9wbG9hbXNfbm9uX2lkbGUsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgcnhfcGxvYW1zX25vbl9pZGxlLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfT01DSToKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCByeF9vbWNpLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHJ4X29tY2ksIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9PTUNJX1BBQ0tFVFNfQ1JDX0VSUk9SOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IsIGtleSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgcnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciwga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX0JZVEVTOgorICAgICAgICAgICAgQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHJ4X2J5dGVzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHJ4X2J5dGVzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfUEFDS0VUUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCByeF9wYWNrZXRzLCBrZXkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX0lOSVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIHJ4X3BhY2tldHMsIGtleSk7XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9UWF9CWVRFUzoKKyAgICAgICAgICAgIEJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCB0eF9ieXRlcywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCB0eF9ieXRlcywga2V5KTtcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1RYX1BBQ0tFVFM6CisgICAgICAgICAgICBCQ01PTFRfU1RBVF9DRkdfSU5JVCgmc3RhdF9jZmcsIHhncG9uX29udSwgdHhfcGFja2V0cywga2V5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9TVEFUX0NGR19JTklUKCZzdGF0X2NmZywgeGdwb25fb251LCB0eF9wYWNrZXRzLCBrZXkpO1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1JBTkdFLCAiXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy50cmlnZ2VyLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci50eXBlIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci50eXBlID0gKGJjbW9sdF9zdGF0X2NvbmRpdGlvbl90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyLnR5cGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoICh2YWwudHJpZ2dlci50eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIucmlzaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwudHJpZ2dlci51LnJhdGVfdGhyZXNob2xkLnJpc2luZyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIucmlzaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIuZmFsbGluZyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3RocmVzaG9sZC5mYWxsaW5nID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5mYWxsaW5nIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfUkFOR0U6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIudXBwZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUucmF0ZV9yYW5nZS51cHBlciA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiY2ZnLnRyaWdnZXIudXBwZXIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcudHJpZ2dlci5sb3dlciIpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsLnRyaWdnZXIudS5yYXRlX3JhbmdlLmxvd2VyID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5sb3dlciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9WQUxVRV9USFJFU0hPTEQ6CisgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2ZnLnRyaWdnZXIubGltaXQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC50cmlnZ2VyLnUudmFsdWVfdGhyZXNob2xkLmxpbWl0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI2NDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcudHJpZ2dlci5saW1pdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9SQU5HRSwgIlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy50cmlnZ2VyIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImNmZy5zb2FrLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcuc29hay5hY3RpdmVfc29ha190aW1lIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwuc29hay5hY3RpdmVfc29ha190aW1lID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImNmZy5zb2FrLmFjdGl2ZV9zb2FrX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjZmcuc29hay5jbGVhcl9zb2FrX3RpbWUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbC5zb2FrLmNsZWFyX3NvYWtfdGltZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hay5jbGVhcl9zb2FrX3RpbWUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJjZmcuc29hayBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfU1RBVF9DRkdfUFJPUF9TRVQoJnN0YXRfY2ZnLCB4Z3Bvbl9vbnUsIGNmZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9TVEFUX0NGR19JRF9DRkcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX1NUQVRfQ0ZHX1BST1BfU0VUKCZzdGF0X2NmZywgeGdwb25fb251LCBjZmcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgJnN0YXRfY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsICZzdGF0X2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgc3RhdF9jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX29udV9hdXRvX2NmZ19nZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZyBhdXRvX2NmZzsgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgfTsgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfZ2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGZpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBkZmkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBkZmkpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRnaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgZGdpKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgZGdpKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkb3dpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBkb3dpKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgZG93aSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaW52YWxpZF9kYnJ1X3JlcG9ydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgaW52YWxpZF9kYnJ1X3JlcG9ydCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGludmFsaWRfZGJydV9yZXBvcnQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImtleV9leGNoYW5nZV9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGtleV9leGNoYW5nZV9jb21wbGV0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBrZXlfZXhjaGFuZ2VfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwga2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBrZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAia2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwga2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGtleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2gpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImtleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBrZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGtleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJsb29jaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgbG9vY2kpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBsb29jaSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2FjdGl2YXRpb25fY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBvbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBvbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9hbGFybSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb251X2FsYXJtKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb251X2FsYXJtKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBvbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2Rpc2FibGVfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBvbnVfZGlzYWJsZV9jb21wbGV0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBvbnVfZGlzYWJsZV9jb21wbGV0ZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9lbmFibGVfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBvbnVfZW5hYmxlX2NvbXBsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIG9udV9lbmFibGVfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfdHVuaW5nX2luX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb251X3R1bmluZ19pbl9jb21wbGV0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBvbnVfdHVuaW5nX2luX2NvbXBsZXRlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3R1bmluZ19vdXRfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBvbnVfdHVuaW5nX291dF9jb21wbGV0ZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBvbnVfdHVuaW5nX291dF9jb21wbGV0ZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9wdGljYWxfcmVmbGVjdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb3B0aWNhbF9yZWZsZWN0aW9uKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb3B0aWNhbF9yZWZsZWN0aW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb3NzaWJsZV9kcmlmdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgcG9zc2libGVfZHJpZnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBwb3NzaWJsZV9kcmlmdCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG93ZXJfY29uc3VtcHRpb25fcmVwb3J0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBwb3dlcl9jb25zdW1wdGlvbl9yZXBvcnQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBwb3dlcl9jb25zdW1wdGlvbl9yZXBvcnQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvd2VyX2xldmVsX3JlcG9ydCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgcG93ZXJfbGV2ZWxfcmVwb3J0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgcG93ZXJfbGV2ZWxfcmVwb3J0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicHFzaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgcHFzaSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHBxc2kpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCByYW5naW5nX2NvbXBsZXRlZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHJhbmdpbmdfY29tcGxldGVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyZWdpc3RyYXRpb25faWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHJlZ2lzdHJhdGlvbl9pZCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHJlZ2lzdHJhdGlvbl9pZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNkaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgc2RpKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgc2RpKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHNlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHNlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2ZpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBzZmkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBzZmkpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRfYWxhcm1fY2xlYXJlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgc3RhdF9hbGFybV9jbGVhcmVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgc3RhdF9hbGFybV9jbGVhcmVkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgc3RhdF9hbGFybV9yYWlzZWQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBzdGF0X2FsYXJtX3JhaXNlZCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3VmaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgc3VmaSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHN1ZmkpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRpd2kiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHRpd2kpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCB0aXdpKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0dW5pbmdfcmVzcG9uc2UiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHR1bmluZ19yZXNwb25zZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9HRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHR1bmluZ19yZXNwb25zZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBkZmkpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGRnaSkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgZG93aSkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgaW52YWxpZF9kYnJ1X3JlcG9ydCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwga2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwga2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGtleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2gpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGtleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0KSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBsb29jaSkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb251X2FjdGl2YXRpb25fY29tcGxldGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBvbnVfYWxhcm0pICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIG9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBvbnVfZGlzYWJsZV9jb21wbGV0ZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIG9udV9lbmFibGVfY29tcGxldGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBvbnVfdHVuaW5nX2luX2NvbXBsZXRlZCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb251X3R1bmluZ19vdXRfY29tcGxldGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBvcHRpY2FsX3JlZmxlY3Rpb24pICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHBvc3NpYmxlX2RyaWZ0KSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBwb3dlcl9jb25zdW1wdGlvbl9yZXBvcnQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHBvd2VyX2xldmVsX3JlcG9ydCkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHBxc2kpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHJhbmdpbmdfY29tcGxldGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCByZWdpc3RyYXRpb25faWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBzZGkpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHNlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZSkgJiYgIUJDTU9MVF9BVVRPX0NGR19QUk9QX0lTX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgc2ZpKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBzdGF0X2FsYXJtX2NsZWFyZWQpICYmICFCQ01PTFRfQVVUT19DRkdfUFJPUF9JU19TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHN0YXRfYWxhcm1fcmFpc2VkKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBzdWZpKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCB0aXdpKSAmJiAhQkNNT0xUX0FVVE9fQ0ZHX1BST1BfSVNfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCB0dW5pbmdfcmVzcG9uc2UpKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfR0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX0dFVCgmYXV0b19jZmcsIHhncG9uX29udSwgYWxsX3Byb3BlcnRpZXMpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmYXV0b19jZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX29udV9hdXRvX2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZyBhdXRvX2NmZzsgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgfTsgICAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmcgYXV0b19jZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfYXV0b19jZmdfc2V0Iik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX0lOSVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGZpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBkZmksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgZGZpLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9ERkksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZ2kiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGRnaSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBkZ2ksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0RHSSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRvd2kiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGRvd2ksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgZG93aSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfRE9XSSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImludmFsaWRfZGJydV9yZXBvcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGludmFsaWRfZGJydV9yZXBvcnQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgaW52YWxpZF9kYnJ1X3JlcG9ydCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfSU5WQUxJRF9EQlJVX1JFUE9SVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImtleV9leGNoYW5nZV9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGtleV9leGNoYW5nZV9jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwga2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0NPTVBMRVRFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImtleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBrZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBrZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0NZQ0xFX1NLSVBQRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBrZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGtleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2gsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0gsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJrZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwga2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwga2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9LRVlfUkVRVUVTVF9USU1FT1VULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibG9vY2kiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGxvb2NpLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIGxvb2NpLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9MT09DSSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb251X2FjdGl2YXRpb25fY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIG9udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0FDVElWQVRJT05fQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2FsYXJtIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBvbnVfYWxhcm0sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb251X2FsYXJtLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfQUxBUk0sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X2Rpc2FibGVfY29tcGxldGVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBvbnVfZGlzYWJsZV9jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb251X2Rpc2FibGVfY29tcGxldGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfRElTQUJMRV9DT01QTEVURUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnVfZW5hYmxlX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb251X2VuYWJsZV9jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb251X2VuYWJsZV9jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9FTkFCTEVfQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251X3R1bmluZ19pbl9jb21wbGV0ZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIG9udV90dW5pbmdfaW5fY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIG9udV90dW5pbmdfaW5fY29tcGxldGVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfVFVOSU5HX0lOX0NPTVBMRVRFRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udV90dW5pbmdfb3V0X2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb251X3R1bmluZ19vdXRfY29tcGxldGVkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIG9udV90dW5pbmdfb3V0X2NvbXBsZXRlZCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX1RVTklOR19PVVRfQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib3B0aWNhbF9yZWZsZWN0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBvcHRpY2FsX3JlZmxlY3Rpb24sIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgb3B0aWNhbF9yZWZsZWN0aW9uLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PUFRJQ0FMX1JFRkxFQ1RJT04sICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb3NzaWJsZV9kcmlmdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgcG9zc2libGVfZHJpZnQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgcG9zc2libGVfZHJpZnQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1BPU1NJQkxFX0RSSUZULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG93ZXJfY29uc3VtcHRpb25fcmVwb3J0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBwb3dlcl9jb25zdW1wdGlvbl9yZXBvcnQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9QT1dFUl9DT05TVU1QVElPTl9SRVBPUlQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb3dlcl9sZXZlbF9yZXBvcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHBvd2VyX2xldmVsX3JlcG9ydCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBwb3dlcl9sZXZlbF9yZXBvcnQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1BPV0VSX0xFVkVMX1JFUE9SVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0UsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwcXNpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBwcXNpLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHBxc2ksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1BRU0ksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgcmFuZ2luZ19jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgcmFuZ2luZ19jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1JBTkdJTkdfQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmVnaXN0cmF0aW9uX2lkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCByZWdpc3RyYXRpb25faWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgcmVnaXN0cmF0aW9uX2lkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9SRUdJU1RSQVRJT05fSUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2RpIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBzZGksIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgc2RpLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9TREksICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHNlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBzZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmUsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTFVSRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNmaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgc2ZpLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmF1dG9fY2ZnLCB4Z3Bvbl9vbnUsIHNmaSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9PTlUsIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkcsIDAsIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU0ZJLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3RhdF9hbGFybV9jbGVhcmVkIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBzdGF0X2FsYXJtX2NsZWFyZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgc3RhdF9hbGFybV9jbGVhcmVkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGF0X2FsYXJtX3JhaXNlZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgc3RhdF9hbGFybV9yYWlzZWQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgc3RhdF9hbGFybV9yYWlzZWQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fT05VLCBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHLCAwLCBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3VmaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgc3VmaSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCBzdWZpLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9TVUZJLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidGl3aSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgdGl3aSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCB0aXdpLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9USVdJLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHVuaW5nX3Jlc3BvbnNlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZhdXRvX2NmZywgeGdwb25fb251LCB0dW5pbmdfcmVzcG9uc2UsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9BVVRPX0NGR19QUk9QX1NFVCgmYXV0b19jZmcsIHhncG9uX29udSwgdHVuaW5nX3Jlc3BvbnNlLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX09OVSwgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRywgMCwgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9UVU5JTkdfUkVTUE9OU0UsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgJmF1dG9fY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsICZhdXRvX2NmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgYXV0b19jZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX3RyeF9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl90cnhfY2ZnIGNmZzsgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl90cnhfa2V5IGtleSA9IHsgfTsgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX3RyeF9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX3RyeF9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3hncG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YR1BPTl9UUlhfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl90cngsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX3RyeCwga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJidXJzdF9wcm9maWxlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl90cngsIGJ1cnN0X3Byb2ZpbGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl90cngsIGJ1cnN0X3Byb2ZpbGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRyYW5zY2VpdmVyX2NvbmZpZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fdHJ4LCB0cmFuc2NlaXZlcl9jb25maWcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl90cngsIHRyYW5zY2VpdmVyX2NvbmZpZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHJhbnNjZWl2ZXJfdHlwZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fdHJ4LCB0cmFuc2NlaXZlcl90eXBlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fdHJ4LCB0cmFuc2NlaXZlcl90eXBlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWJ1ZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fdHJ4LCBkZWJ1Zyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX3RyeCwgZGVidWcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJzc2lfbm9ybWFsX2NvbmZpZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fdHJ4LCByc3NpX25vcm1hbF9jb25maWcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl90cngsIHJzc2lfbm9ybWFsX2NvbmZpZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnNzaV9yYW5naW5nX2NvbmZpZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fdHJ4LCByc3NpX3JhbmdpbmdfY29uZmlnKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fdHJ4LCByc3NpX3JhbmdpbmdfY29uZmlnKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzZXJkZXNfY29uZmlndXJhdGlvbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fdHJ4LCBzZXJkZXNfY29uZmlndXJhdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX3RyeCwgc2VyZGVzX2NvbmZpZ3VyYXRpb24pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJ1cnN0X3Byb2ZpbGVfZGVsaW1pdGVyX21heF9lcnJvcnMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX3RyeCwgYnVyc3RfcHJvZmlsZV9kZWxpbWl0ZXJfbWF4X2Vycm9ycyk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX3RyeCwgYnVyc3RfcHJvZmlsZV9kZWxpbWl0ZXJfbWF4X2Vycm9ycyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl90cngsIHJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX3RyeCwgcmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX3RyeCwgcmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fdHJ4LCByYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJlc2V0X29uX2RlbF9taXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl90cngsIHJlc2V0X29uX2RlbF9taXNzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fdHJ4LCByZXNldF9vbl9kZWxfbWlzcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZWRfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX3RyeCwgZWRfc3RhdGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl90cngsIGVkX3N0YXRlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpbnZlcnRfZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhncG9uX3RyeCwgaW52ZXJ0X2VkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fdHJ4LCBpbnZlcnRfZWQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuZF9vZl9idXJzdF9yZXNldCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fdHJ4LCBlbmRfb2ZfYnVyc3RfcmVzZXQpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4Z3Bvbl90cngsIGVuZF9vZl9idXJzdF9yZXNldCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHJ4X3JzdF9wb2xhcml0eSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fdHJ4LCB0cnhfcnN0X3BvbGFyaXR5KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fdHJ4LCB0cnhfcnN0X3BvbGFyaXR5KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX3RyeCwgYnVyc3RfcHJvZmlsZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fdHJ4LCB0cmFuc2NlaXZlcl9jb25maWcpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX3RyeCwgdHJhbnNjZWl2ZXJfdHlwZSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fdHJ4LCBkZWJ1ZykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fdHJ4LCByc3NpX25vcm1hbF9jb25maWcpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX3RyeCwgcnNzaV9yYW5naW5nX2NvbmZpZykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fdHJ4LCBzZXJkZXNfY29uZmlndXJhdGlvbikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fdHJ4LCBidXJzdF9wcm9maWxlX2RlbGltaXRlcl9tYXhfZXJyb3JzKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIHJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fdHJ4LCByYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX3RyeCwgcmVzZXRfb25fZGVsX21pc3MpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX3RyeCwgZWRfc3RhdGUpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhncG9uX3RyeCwgaW52ZXJ0X2VkKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIGVuZF9vZl9idXJzdF9yZXNldCkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeGdwb25fdHJ4LCB0cnhfcnN0X3BvbGFyaXR5KSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fdHJ4LCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeGdwb25fdHJ4LCBhbGxfcHJvcGVydGllcyk7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfZ2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeGdwb25fdHJ4X2NmZ19zZXQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX3RyeF9jZmcgY2ZnOyAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX3RyeF9rZXkga2V5ID0geyB9OyAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fdHJ4X2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fdHJ4X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX3NldCIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX1RSWF9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX3RyeCwga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fdHJ4LCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJidXJzdF9wcm9maWxlLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Fycl94Z3Bvbl9idXJzdF9wcm9maWxlXzQgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJidXJzdF9wcm9maWxlLmFyci4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgaTA7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXJyYXkgYnVyc3RfcHJvZmlsZS5hcnIgbXVzdCBoYXZlIDQgZWxlbWVudHNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYnVyc3RfcHJvZmlsZS5hcnIucHJvZmlsZV92ZXJzaW9uIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidXJzdF9wcm9maWxlLmFyci5wcm9maWxlX3ZlcnNpb24gaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA0OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0ucHJvZmlsZV92ZXJzaW9uID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYnVyc3RfcHJvZmlsZS5hcnIuaXNfZmVjX29uIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidXJzdF9wcm9maWxlLmFyci5pc19mZWNfb24gaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA0OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0uaXNfZmVjX29uID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0ubnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJidXJzdF9wcm9maWxlLmFyci5kZWxpbWl0ZXJfc2l6ZV9pbl9ieXRlcyIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVyc3RfcHJvZmlsZS5hcnIuZGVsaW1pdGVyX3NpemVfaW5fYnl0ZXMgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA0OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0uZGVsaW1pdGVyX3NpemVfaW5fYnl0ZXMgPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJidXJzdF9wcm9maWxlLmFyci5kZWxpbWl0ZXJfcGF0dGVybl9oaWdoIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidXJzdF9wcm9maWxlLmFyci5kZWxpbWl0ZXJfcGF0dGVybl9oaWdoIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgNDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdLmRlbGltaXRlcl9wYXR0ZXJuX2hpZ2ggPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJidXJzdF9wcm9maWxlLmFyci5kZWxpbWl0ZXJfcGF0dGVybl9sb3ciKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1cnN0X3Byb2ZpbGUuYXJyLmRlbGltaXRlcl9wYXR0ZXJuX2xvdyBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5kZWxpbWl0ZXJfcGF0dGVybl9sb3cgPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJidXJzdF9wcm9maWxlLmFyci5wcmVhbWJsZV9sZW5ndGhfaW5fYnl0ZXMiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1cnN0X3Byb2ZpbGUuYXJyLnByZWFtYmxlX2xlbmd0aF9pbl9ieXRlcyBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5wcmVhbWJsZV9sZW5ndGhfaW5fYnl0ZXMgPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJidXJzdF9wcm9maWxlLmFyci5wcmVhbWJsZV9yZXBlYXRzX2NvdW50Iik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidXJzdF9wcm9maWxlLmFyci5wcmVhbWJsZV9yZXBlYXRzX2NvdW50IGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgNDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdLnByZWFtYmxlX3JlcGVhdHNfY291bnQgPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJidXJzdF9wcm9maWxlLmFyci5wcmVhbWJsZV9wYXR0ZXJuX2hpZ2giKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1cnN0X3Byb2ZpbGUuYXJyLnByZWFtYmxlX3BhdHRlcm5faGlnaCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5wcmVhbWJsZV9wYXR0ZXJuX2hpZ2ggPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJidXJzdF9wcm9maWxlLmFyci5wcmVhbWJsZV9wYXR0ZXJuX2xvdyIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVyc3RfcHJvZmlsZS5hcnIucHJlYW1ibGVfcGF0dGVybl9sb3cgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA0OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0ucHJlYW1ibGVfcGF0dGVybl9sb3cgPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJidXJzdF9wcm9maWxlLmFyci5wb25fdGFnIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJidXJzdF9wcm9maWxlLmFyci5wb25fdGFnIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgNDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdLnBvbl90YWcgPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyNjQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJ1cnN0X3Byb2ZpbGUuYXJyLm51bV9vZl9ndWFyZF9ieXRlcyIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVyc3RfcHJvZmlsZS5hcnIubnVtX29mX2d1YXJkX2J5dGVzIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgNDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdLm51bV9vZl9ndWFyZF9ieXRlcyA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJ1cnN0X3Byb2ZpbGUuYXJyLmlzX3Byb2ZpbGVfdmFsaWQiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1cnN0X3Byb2ZpbGUuYXJyLmlzX3Byb2ZpbGVfdmFsaWQgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA0OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0uaXNfcHJvZmlsZV92YWxpZCA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLm51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiYnVyc3RfcHJvZmlsZS5hcnIuYnVyc3Rfb3ZlcmhlYWRfc2l6ZV9pbl93b3JkcyIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVyc3RfcHJvZmlsZS5hcnIuYnVyc3Rfb3ZlcmhlYWRfc2l6ZV9pbl93b3JkcyBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5idXJzdF9vdmVyaGVhZF9zaXplX2luX3dvcmRzID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVyc3RfcHJvZmlsZS5hcnIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIGJ1cnN0X3Byb2ZpbGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYXJyX3hncG9uX2J1cnN0X3Byb2ZpbGVfNCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0JVUlNUX1BST0ZJTEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIGJ1cnN0X3Byb2ZpbGUsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAidHJhbnNjZWl2ZXJfY29uZmlnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Fycl94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl80IHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAidHJhbnNjZWl2ZXJfY29uZmlnLmFyci4iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgaTE7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYXJyYXkgdHJhbnNjZWl2ZXJfY29uZmlnLmFyciBtdXN0IGhhdmUgNCBlbGVtZW50c1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0cmFuc2NlaXZlcl9jb25maWcuYXJyLnRyeF9yZXNldF9wYXR0ZXJuX2ZpcnN0Iik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ0cmFuc2NlaXZlcl9jb25maWcuYXJyLnRyeF9yZXNldF9wYXR0ZXJuX2ZpcnN0IGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgNDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTFdLnRyeF9yZXNldF9wYXR0ZXJuX2ZpcnN0ID0gY2xpX3Bhcm0tPnZhbHVlc1tpMV0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHJhbnNjZWl2ZXJfY29uZmlnLmFyci50cnhfcmVzZXRfcGF0dGVybl9taWRkbGUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInRyYW5zY2VpdmVyX2NvbmZpZy5hcnIudHJ4X3Jlc2V0X3BhdHRlcm5fbWlkZGxlIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgNDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTFdLnRyeF9yZXNldF9wYXR0ZXJuX21pZGRsZSA9IGNsaV9wYXJtLT52YWx1ZXNbaTFdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRyYW5zY2VpdmVyX2NvbmZpZy5hcnIudHJ4X3Jlc2V0X3BhdHRlcm5fbGFzdCIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAidHJhbnNjZWl2ZXJfY29uZmlnLmFyci50cnhfcmVzZXRfcGF0dGVybl9sYXN0IGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgNDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTFdLnRyeF9yZXNldF9wYXR0ZXJuX2xhc3QgPSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0cmFuc2NlaXZlcl9jb25maWcuYXJyLnRyeF9yZXNldF9taWRkbGVfcmVwZWF0c19jb3VudCIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAidHJhbnNjZWl2ZXJfY29uZmlnLmFyci50cnhfcmVzZXRfbWlkZGxlX3JlcGVhdHNfY291bnQgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCA0OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMV0udHJ4X3Jlc2V0X21pZGRsZV9yZXBlYXRzX2NvdW50ID0gY2xpX3Bhcm0tPnZhbHVlc1tpMV0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHJhbnNjZWl2ZXJfY29uZmlnLmFyci50cnhfcmVzZXRfbG9jYXRpb24iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInRyYW5zY2VpdmVyX2NvbmZpZy5hcnIudHJ4X3Jlc2V0X2xvY2F0aW9uIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgNDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTFdLnRyeF9yZXNldF9sb2NhdGlvbiA9IGNsaV9wYXJtLT52YWx1ZXNbaTFdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRyYW5zY2VpdmVyX2NvbmZpZy5hcnIudHJ4X3Jlc2V0X3BvbGFyaXR5Iik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ0cmFuc2NlaXZlcl9jb25maWcuYXJyLnRyeF9yZXNldF9wb2xhcml0eSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IDQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kxXS50cnhfcmVzZXRfcG9sYXJpdHkgPSBjbGlfcGFybS0+dmFsdWVzW2kxXS5udW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRyYW5zY2VpdmVyX2NvbmZpZy5hcnIuYmNkcl9yZXNldF9wYXR0ZXJuX2ZpcnN0Iik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ0cmFuc2NlaXZlcl9jb25maWcuYXJyLmJjZHJfcmVzZXRfcGF0dGVybl9maXJzdCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IDQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kxXS5iY2RyX3Jlc2V0X3BhdHRlcm5fZmlyc3QgPSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0cmFuc2NlaXZlcl9jb25maWcuYXJyLmJjZHJfcmVzZXRfcGF0dGVybl9taWRkbGUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInRyYW5zY2VpdmVyX2NvbmZpZy5hcnIuYmNkcl9yZXNldF9wYXR0ZXJuX21pZGRsZSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IDQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kxXS5iY2RyX3Jlc2V0X3BhdHRlcm5fbWlkZGxlID0gY2xpX3Bhcm0tPnZhbHVlc1tpMV0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHJhbnNjZWl2ZXJfY29uZmlnLmFyci5iY2RyX3Jlc2V0X3BhdHRlcm5fbGFzdCIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAidHJhbnNjZWl2ZXJfY29uZmlnLmFyci5iY2RyX3Jlc2V0X3BhdHRlcm5fbGFzdCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IDQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kxXS5iY2RyX3Jlc2V0X3BhdHRlcm5fbGFzdCA9IGNsaV9wYXJtLT52YWx1ZXNbaTFdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRyYW5zY2VpdmVyX2NvbmZpZy5hcnIuYmNkcl9yZXNldF9taWRkbGVfcmVwZWF0c19jb3VudCIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAidHJhbnNjZWl2ZXJfY29uZmlnLmFyci5iY2RyX3Jlc2V0X21pZGRsZV9yZXBlYXRzX2NvdW50IGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgNDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTFdLmJjZHJfcmVzZXRfbWlkZGxlX3JlcGVhdHNfY291bnQgPSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0cmFuc2NlaXZlcl9jb25maWcuYXJyLmJjZHJfcmVzZXRfbG9jYXRpb24iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInRyYW5zY2VpdmVyX2NvbmZpZy5hcnIuYmNkcl9yZXNldF9sb2NhdGlvbiBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IDQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kxXS5iY2RyX3Jlc2V0X2xvY2F0aW9uID0gY2xpX3Bhcm0tPnZhbHVlc1tpMV0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHJhbnNjZWl2ZXJfY29uZmlnLmFyci5iY2RyX3Jlc2V0X3BvbGFyaXR5Iik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJ0cmFuc2NlaXZlcl9jb25maWcuYXJyLmJjZHJfcmVzZXRfcG9sYXJpdHkgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCA0OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMV0uYmNkcl9yZXNldF9wb2xhcml0eSA9IGNsaV9wYXJtLT52YWx1ZXNbaTFdLm51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAidHJhbnNjZWl2ZXJfY29uZmlnLmFyciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgdHJhbnNjZWl2ZXJfY29uZmlnLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X2Fycl94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl80IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfVFJBTlNDRUlWRVJfQ09ORklHLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCB0cmFuc2NlaXZlcl9jb25maWcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0cmFuc2NlaXZlcl90eXBlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fdHJ4X3R5cGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3hncG9uX3RyeF90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCB0cmFuc2NlaXZlcl90eXBlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgdHJhbnNjZWl2ZXJfdHlwZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9UUkFOU0NFSVZFUl9UWVBFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImRlYnVnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX3RyeF9kZWJ1ZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVidWcucnhfcmV2ZXJzZWRfcG9sYXJpdHkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5yeF9yZXZlcnNlZF9wb2xhcml0eSA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImRlYnVnLnJ4X3JldmVyc2VkX3BvbGFyaXR5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGVidWcubmVnX291dF9iaXQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5uZWdfb3V0X2JpdCA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImRlYnVnLm5lZ19vdXRfYml0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCBkZWJ1ZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl90cnhfZGVidWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9ERUJVRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgZGVidWcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAicnNzaV9ub3JtYWxfY29uZmlnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX3Jzc2lfbm9ybWFsX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnNzaV9ub3JtYWxfY29uZmlnLnBvbGFyaXR5Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucG9sYXJpdHkgPSAoYmNtb2x0X3BvbGFyaXR5KSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicnNzaV9ub3JtYWxfY29uZmlnLnBvbGFyaXR5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnNzaV9ub3JtYWxfY29uZmlnLmxvY2F0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwubG9jYXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyc3NpX25vcm1hbF9jb25maWcubG9jYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyc3NpX25vcm1hbF9jb25maWcubG9jYXRpb25fc2lnbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmxvY2F0aW9uX3NpZ24gPSAoYmNtb2x0X3NpZ24pIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyc3NpX25vcm1hbF9jb25maWcubG9jYXRpb25fc2lnbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJzc2lfbm9ybWFsX2NvbmZpZy5wdWxzZV93aWR0aCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnB1bHNlX3dpZHRoID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicnNzaV9ub3JtYWxfY29uZmlnLnB1bHNlX3dpZHRoIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnNzaV9ub3JtYWxfY29uZmlnLm1pbmltdW1fYnVyc3QiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5taW5pbXVtX2J1cnN0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicnNzaV9ub3JtYWxfY29uZmlnLm1pbmltdW1fYnVyc3QgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIHJzc2lfbm9ybWFsX2NvbmZpZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SU1NJX05PUk1BTF9DT05GSUcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIHJzc2lfbm9ybWFsX2NvbmZpZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJyc3NpX3JhbmdpbmdfY29uZmlnLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX3Jzc2lfcmFuZ2luZ19jb25maWcgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJzc2lfcmFuZ2luZ19jb25maWcuc3RhcnRfb25fZWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zdGFydF9vbl9lZCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicnNzaV9yYW5naW5nX2NvbmZpZy5zdGFydF9vbl9lZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJzc2lfcmFuZ2luZ19jb25maWcuZnJhbWVfZGVsYXkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5mcmFtZV9kZWxheSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJzc2lfcmFuZ2luZ19jb25maWcuZnJhbWVfZGVsYXkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyc3NpX3JhbmdpbmdfY29uZmlnLndvcmRfZGVsYXkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC53b3JkX2RlbGF5ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicnNzaV9yYW5naW5nX2NvbmZpZy53b3JkX2RlbGF5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnNzaV9yYW5naW5nX2NvbmZpZy5mcmFtZV9kZWxheV9hZnRlcl9lZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmZyYW1lX2RlbGF5X2FmdGVyX2VkID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicnNzaV9yYW5naW5nX2NvbmZpZy5mcmFtZV9kZWxheV9hZnRlcl9lZCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJzc2lfcmFuZ2luZ19jb25maWcud29yZF9kZWxheV9hZnRlcl9lZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLndvcmRfZGVsYXlfYWZ0ZXJfZWQgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyc3NpX3JhbmdpbmdfY29uZmlnLndvcmRfZGVsYXlfYWZ0ZXJfZWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIHJzc2lfcmFuZ2luZ19jb25maWcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fcnNzaV9yYW5naW5nX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1JTU0lfUkFOR0lOR19DT05GSUcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIHJzc2lfcmFuZ2luZ19jb25maWcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAic2VyZGVzX2NvbmZpZ3VyYXRpb24uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fc2VyZGVzX2NvbmZpZ3VyYXRpb24gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNlcmRlc19jb25maWd1cmF0aW9uLm11bHRpX2VkX21vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tdWx0aV9lZF9tb2RlID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzZXJkZXNfY29uZmlndXJhdGlvbi5tdWx0aV9lZF9tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2VyZGVzX2NvbmZpZ3VyYXRpb24ucmFuZ2luZ19tb2RlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmFuZ2luZ19tb2RlID0gKGJjbW9sdF94Z3Bvbl9zZXJkZXNfcmFuZ2luZ19tb2RlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic2VyZGVzX2NvbmZpZ3VyYXRpb24ucmFuZ2luZ19tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCBzZXJkZXNfY29uZmlndXJhdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9zZXJkZXNfY29uZmlndXJhdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1NFUkRFU19DT05GSUdVUkFUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCBzZXJkZXNfY29uZmlndXJhdGlvbiwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJidXJzdF9wcm9maWxlX2RlbGltaXRlcl9tYXhfZXJyb3JzLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Fycl91OF80IHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJidXJzdF9wcm9maWxlX2RlbGltaXRlcl9tYXhfZXJyb3JzLmFyciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciBidXJzdF9wcm9maWxlX2RlbGltaXRlcl9tYXhfZXJyb3JzLmFyciBtdXN0IGhhdmUgNCBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmNtb2x0X2J1Zl9zZXRfcG9zKCZjbGlfcGFybS0+dmFsdWUuYnVmZmVyLCAwKTsKKyAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZCgmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgdmFsLmFyciwgNCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiYnVyc3RfcHJvZmlsZV9kZWxpbWl0ZXJfbWF4X2Vycm9ycy5hcnIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIGJ1cnN0X3Byb2ZpbGVfZGVsaW1pdGVyX21heF9lcnJvcnMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfYXJyX3U4XzQgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9CVVJTVF9QUk9GSUxFX0RFTElNSVRFUl9NQVhfRVJST1JTLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCBidXJzdF9wcm9maWxlX2RlbGltaXRlcl9tYXhfZXJyb3JzLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC50cnhfcmVzZXRfcGF0dGVybl9maXJzdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRyeF9yZXNldF9wYXR0ZXJuX2ZpcnN0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LnRyeF9yZXNldF9wYXR0ZXJuX2ZpcnN0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LnRyeF9yZXNldF9wYXR0ZXJuX21pZGRsZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRyeF9yZXNldF9wYXR0ZXJuX21pZGRsZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC50cnhfcmVzZXRfcGF0dGVybl9taWRkbGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQudHJ4X3Jlc2V0X3BhdHRlcm5fbGFzdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRyeF9yZXNldF9wYXR0ZXJuX2xhc3QgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQudHJ4X3Jlc2V0X3BhdHRlcm5fbGFzdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC50cnhfcmVzZXRfbWlkZGxlX3JlcGVhdHMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50cnhfcmVzZXRfbWlkZGxlX3JlcGVhdHMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQudHJ4X3Jlc2V0X21pZGRsZV9yZXBlYXRzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LnRyeF9yZXNldF9sb2NhdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRyeF9yZXNldF9sb2NhdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC50cnhfcmVzZXRfbG9jYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQuYmNkcl9yZXNldF9wYXR0ZXJuX2ZpcnN0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYmNkcl9yZXNldF9wYXR0ZXJuX2ZpcnN0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LmJjZHJfcmVzZXRfcGF0dGVybl9maXJzdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC5iY2RyX3Jlc2V0X3BhdHRlcm5fbWlkZGxlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYmNkcl9yZXNldF9wYXR0ZXJuX21pZGRsZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC5iY2RyX3Jlc2V0X3BhdHRlcm5fbWlkZGxlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LmJjZHJfcmVzZXRfcGF0dGVybl9sYXN0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYmNkcl9yZXNldF9wYXR0ZXJuX2xhc3QgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQuYmNkcl9yZXNldF9wYXR0ZXJuX2xhc3QgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQuYmNkcl9yZXNldF9taWRkbGVfcmVwZWF0cyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmJjZHJfcmVzZXRfbWlkZGxlX3JlcGVhdHMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQuYmNkcl9yZXNldF9taWRkbGVfcmVwZWF0cyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC5iY2RyX3Jlc2V0X2xvY2F0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYmNkcl9yZXNldF9sb2NhdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC5iY2RyX3Jlc2V0X2xvY2F0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LmJjZHJfcmVzZXRfcG9sYXJpdHkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5iY2RyX3Jlc2V0X3BvbGFyaXR5ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQuYmNkcl9yZXNldF9wb2xhcml0eSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgcmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX3J4X3Jhbmdpbmdfc21fcGF0dGVybiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1JBTkdJTkdfU01fUEFUVEVSTlNfQVRfSU5JVCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgcmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgInJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4gdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS50cnhfcmVzZXRfcGF0dGVybl9maXJzdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRyeF9yZXNldF9wYXR0ZXJuX2ZpcnN0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLnRyeF9yZXNldF9wYXR0ZXJuX2ZpcnN0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLnRyeF9yZXNldF9wYXR0ZXJuX21pZGRsZSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRyeF9yZXNldF9wYXR0ZXJuX21pZGRsZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS50cnhfcmVzZXRfcGF0dGVybl9taWRkbGUgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUudHJ4X3Jlc2V0X3BhdHRlcm5fbGFzdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRyeF9yZXNldF9wYXR0ZXJuX2xhc3QgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUudHJ4X3Jlc2V0X3BhdHRlcm5fbGFzdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS50cnhfcmVzZXRfbWlkZGxlX3JlcGVhdHMiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50cnhfcmVzZXRfbWlkZGxlX3JlcGVhdHMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUudHJ4X3Jlc2V0X21pZGRsZV9yZXBlYXRzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLnRyeF9yZXNldF9sb2NhdGlvbiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRyeF9yZXNldF9sb2NhdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS50cnhfcmVzZXRfbG9jYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUuYmNkcl9yZXNldF9wYXR0ZXJuX2ZpcnN0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYmNkcl9yZXNldF9wYXR0ZXJuX2ZpcnN0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLmJjZHJfcmVzZXRfcGF0dGVybl9maXJzdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS5iY2RyX3Jlc2V0X3BhdHRlcm5fbWlkZGxlIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYmNkcl9yZXNldF9wYXR0ZXJuX21pZGRsZSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS5iY2RyX3Jlc2V0X3BhdHRlcm5fbWlkZGxlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLmJjZHJfcmVzZXRfcGF0dGVybl9sYXN0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYmNkcl9yZXNldF9wYXR0ZXJuX2xhc3QgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUuYmNkcl9yZXNldF9wYXR0ZXJuX2xhc3QgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUuYmNkcl9yZXNldF9taWRkbGVfcmVwZWF0cyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmJjZHJfcmVzZXRfbWlkZGxlX3JlcGVhdHMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUuYmNkcl9yZXNldF9taWRkbGVfcmVwZWF0cyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS5iY2RyX3Jlc2V0X2xvY2F0aW9uIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYmNkcl9yZXNldF9sb2NhdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS5iY2RyX3Jlc2V0X2xvY2F0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLmJjZHJfcmVzZXRfcG9sYXJpdHkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5iY2RyX3Jlc2V0X3BvbGFyaXR5ID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJyYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUuYmNkcl9yZXNldF9wb2xhcml0eSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgcmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX3J4X3Jhbmdpbmdfc21fcGF0dGVybiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1JBTkdJTkdfU01fUEFUVEVSTlNfRURfRkFJTFVSRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgcmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicmVzZXRfb25fZGVsX21pc3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgcmVzZXRfb25fZGVsX21pc3MsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCByZXNldF9vbl9kZWxfbWlzcywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SRVNFVF9PTl9ERUxfTUlTUywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJlZF9zdGF0ZS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9lZF9zdGF0ZSB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZWRfc3RhdGUucmVzZXRfb25fZWRfZmFpbCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnJlc2V0X29uX2VkX2ZhaWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImVkX3N0YXRlLnJlc2V0X29uX2VkX2ZhaWwgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlZF9zdGF0ZS5yZXNldF9vbl9lZF9zdWNjZXNzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmVzZXRfb25fZWRfc3VjY2VzcyA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZWRfc3RhdGUucmVzZXRfb25fZWRfc3VjY2VzcyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgZWRfc3RhdGUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fZWRfc3RhdGUgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9FRF9TVEFURSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgZWRfc3RhdGUsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpbnZlcnRfZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgaW52ZXJ0X2VkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgaW52ZXJ0X2VkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0lOVkVSVF9FRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVuZF9vZl9idXJzdF9yZXNldCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCBlbmRfb2ZfYnVyc3RfcmVzZXQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCBlbmRfb2ZfYnVyc3RfcmVzZXQsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfRU5EX09GX0JVUlNUX1JFU0VULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHJ4X3JzdF9wb2xhcml0eSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfYm9vbCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCB0cnhfcnN0X3BvbGFyaXR5LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgdHJ4X3JzdF9wb2xhcml0eSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9UUlhfUlNUX1BPTEFSSVRZLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19zZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgZXJyLCBjZmcuaGRyLmhkci5lcnJfdGV4dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfY2xpX3hncG9uX3RyeF9jZmdfY2xlYXIoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hncG9uX3RyeF9jZmcgY2ZnOyAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hncG9uX3RyeF9rZXkga2V5ID0geyB9OyAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fdHJ4X2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fdHJ4X2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2NsZWFyIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF94Z3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWEdQT05fVFJYX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fdHJ4LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl90cngsIGtleSk7XG4iKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2NsZWFyKGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94Z3Bvbl90cnhfY2ZnX2dldF9tdWx0aShiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94Z3Bvbl90cnhfY2ZnIGNmZzsgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94Z3Bvbl90cnhfa2V5IGtleSA9IHsgfTsgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF9tc2dfc2V0ICptc2dfc2V0ID0gTlVMTDsgLyoqPCBkZWNsYXJlIG1lc3NhZ2Ugc2V0ICovCisgICAgdWludDMyX3QgbWF4X21zZ3M7ICAgICAgICAgICAgICAvKio8IGRlY2xhcmUgbWF4IG51bWJlciBvZiBtc2dzIHRvIGdldCAqLworICAgIGJjbW9zX2Jvb2wgaW52ZXJ0X2ZpbHRlcjsgICAgICAgLyoqPCBkZWNsYXJlIGZpbHRlciBpbnZlcnQgZmxhZyAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX3RyeF9jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX3RyeF9rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0KiBtc2dfc2V0ID0gTlVMTDtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQzMl90IG1heF9tc2dzO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldF9tdWx0aSIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfeGdwb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hHUE9OX1RSWF9LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfbXNnX3NldF9hbGxvYyhCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzLCAmbXNnX3NldCk7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fdHJ4LCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl90cngsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5idXJzdF9wcm9maWxlLiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Fycl94Z3Bvbl9idXJzdF9wcm9maWxlXzQgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuYnVyc3RfcHJvZmlsZS5hcnIuIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGkwOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImFycmF5IGZpbHRlci5idXJzdF9wcm9maWxlLmFyciBtdXN0IGhhdmUgNCBlbGVtZW50c1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYnVyc3RfcHJvZmlsZS5hcnIucHJvZmlsZV92ZXJzaW9uIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYnVyc3RfcHJvZmlsZS5hcnIucHJvZmlsZV92ZXJzaW9uIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgNDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdLnByb2ZpbGVfdmVyc2lvbiA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5idXJzdF9wcm9maWxlLmFyci5pc19mZWNfb24iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5idXJzdF9wcm9maWxlLmFyci5pc19mZWNfb24gaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA0OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0uaXNfZmVjX29uID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0ubnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYnVyc3RfcHJvZmlsZS5hcnIuZGVsaW1pdGVyX3NpemVfaW5fYnl0ZXMiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5idXJzdF9wcm9maWxlLmFyci5kZWxpbWl0ZXJfc2l6ZV9pbl9ieXRlcyBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5kZWxpbWl0ZXJfc2l6ZV9pbl9ieXRlcyA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5idXJzdF9wcm9maWxlLmFyci5kZWxpbWl0ZXJfcGF0dGVybl9oaWdoIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYnVyc3RfcHJvZmlsZS5hcnIuZGVsaW1pdGVyX3BhdHRlcm5faGlnaCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5kZWxpbWl0ZXJfcGF0dGVybl9oaWdoID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmJ1cnN0X3Byb2ZpbGUuYXJyLmRlbGltaXRlcl9wYXR0ZXJuX2xvdyIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJ1cnN0X3Byb2ZpbGUuYXJyLmRlbGltaXRlcl9wYXR0ZXJuX2xvdyBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5kZWxpbWl0ZXJfcGF0dGVybl9sb3cgPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYnVyc3RfcHJvZmlsZS5hcnIucHJlYW1ibGVfbGVuZ3RoX2luX2J5dGVzIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYnVyc3RfcHJvZmlsZS5hcnIucHJlYW1ibGVfbGVuZ3RoX2luX2J5dGVzIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgNDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdLnByZWFtYmxlX2xlbmd0aF9pbl9ieXRlcyA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5idXJzdF9wcm9maWxlLmFyci5wcmVhbWJsZV9yZXBlYXRzX2NvdW50Iik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYnVyc3RfcHJvZmlsZS5hcnIucHJlYW1ibGVfcmVwZWF0c19jb3VudCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5wcmVhbWJsZV9yZXBlYXRzX2NvdW50ID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmJ1cnN0X3Byb2ZpbGUuYXJyLnByZWFtYmxlX3BhdHRlcm5faGlnaCIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJ1cnN0X3Byb2ZpbGUuYXJyLnByZWFtYmxlX3BhdHRlcm5faGlnaCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5wcmVhbWJsZV9wYXR0ZXJuX2hpZ2ggPSBjbGlfcGFybS0+dmFsdWVzW2kwXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYnVyc3RfcHJvZmlsZS5hcnIucHJlYW1ibGVfcGF0dGVybl9sb3ciKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5idXJzdF9wcm9maWxlLmFyci5wcmVhbWJsZV9wYXR0ZXJuX2xvdyBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5wcmVhbWJsZV9wYXR0ZXJuX2xvdyA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5idXJzdF9wcm9maWxlLmFyci5wb25fdGFnIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYnVyc3RfcHJvZmlsZS5hcnIucG9uX3RhZyBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5wb25fdGFnID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0udW51bWJlcjY0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYnVyc3RfcHJvZmlsZS5hcnIubnVtX29mX2d1YXJkX2J5dGVzIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYnVyc3RfcHJvZmlsZS5hcnIubnVtX29mX2d1YXJkX2J5dGVzIGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgNDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTBdLm51bV9vZl9ndWFyZF9ieXRlcyA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5idXJzdF9wcm9maWxlLmFyci5pc19wcm9maWxlX3ZhbGlkIik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuYnVyc3RfcHJvZmlsZS5hcnIuaXNfcHJvZmlsZV92YWxpZCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IDQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kwXS5pc19wcm9maWxlX3ZhbGlkID0gY2xpX3Bhcm0tPnZhbHVlc1tpMF0ubnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuYnVyc3RfcHJvZmlsZS5hcnIuYnVyc3Rfb3ZlcmhlYWRfc2l6ZV9pbl93b3JkcyIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmJ1cnN0X3Byb2ZpbGUuYXJyLmJ1cnN0X292ZXJoZWFkX3NpemVfaW5fd29yZHMgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCA0OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMF0uYnVyc3Rfb3ZlcmhlYWRfc2l6ZV9pbl93b3JkcyA9IGNsaV9wYXJtLT52YWx1ZXNbaTBdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5idXJzdF9wcm9maWxlLmFyciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgYnVyc3RfcHJvZmlsZSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9hcnJfeGdwb25fYnVyc3RfcHJvZmlsZV80IHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfQlVSU1RfUFJPRklMRSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgYnVyc3RfcHJvZmlsZSwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImJ1cnN0X3Byb2ZpbGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl90cngsIGJ1cnN0X3Byb2ZpbGUpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fdHJ4LCBidXJzdF9wcm9maWxlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnRyYW5zY2VpdmVyX2NvbmZpZy4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hcnJfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb25fNCB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci50cmFuc2NlaXZlcl9jb25maWcuYXJyLiIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBpMTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJhcnJheSBmaWx0ZXIudHJhbnNjZWl2ZXJfY29uZmlnLmFyciBtdXN0IGhhdmUgNCBlbGVtZW50c1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudHJhbnNjZWl2ZXJfY29uZmlnLmFyci50cnhfcmVzZXRfcGF0dGVybl9maXJzdCIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnRyYW5zY2VpdmVyX2NvbmZpZy5hcnIudHJ4X3Jlc2V0X3BhdHRlcm5fZmlyc3QgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCA0OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMV0udHJ4X3Jlc2V0X3BhdHRlcm5fZmlyc3QgPSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudHJhbnNjZWl2ZXJfY29uZmlnLmFyci50cnhfcmVzZXRfcGF0dGVybl9taWRkbGUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci50cmFuc2NlaXZlcl9jb25maWcuYXJyLnRyeF9yZXNldF9wYXR0ZXJuX21pZGRsZSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IDQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kxXS50cnhfcmVzZXRfcGF0dGVybl9taWRkbGUgPSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudHJhbnNjZWl2ZXJfY29uZmlnLmFyci50cnhfcmVzZXRfcGF0dGVybl9sYXN0Iik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIudHJhbnNjZWl2ZXJfY29uZmlnLmFyci50cnhfcmVzZXRfcGF0dGVybl9sYXN0IGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgNDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTFdLnRyeF9yZXNldF9wYXR0ZXJuX2xhc3QgPSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudHJhbnNjZWl2ZXJfY29uZmlnLmFyci50cnhfcmVzZXRfbWlkZGxlX3JlcGVhdHNfY291bnQiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci50cmFuc2NlaXZlcl9jb25maWcuYXJyLnRyeF9yZXNldF9taWRkbGVfcmVwZWF0c19jb3VudCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IDQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kxXS50cnhfcmVzZXRfbWlkZGxlX3JlcGVhdHNfY291bnQgPSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudHJhbnNjZWl2ZXJfY29uZmlnLmFyci50cnhfcmVzZXRfbG9jYXRpb24iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci50cmFuc2NlaXZlcl9jb25maWcuYXJyLnRyeF9yZXNldF9sb2NhdGlvbiBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IDQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kxXS50cnhfcmVzZXRfbG9jYXRpb24gPSBjbGlfcGFybS0+dmFsdWVzW2kxXS51bnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudHJhbnNjZWl2ZXJfY29uZmlnLmFyci50cnhfcmVzZXRfcG9sYXJpdHkiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci50cmFuc2NlaXZlcl9jb25maWcuYXJyLnRyeF9yZXNldF9wb2xhcml0eSBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IDQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kxXS50cnhfcmVzZXRfcG9sYXJpdHkgPSBjbGlfcGFybS0+dmFsdWVzW2kxXS5udW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci50cmFuc2NlaXZlcl9jb25maWcuYXJyLmJjZHJfcmVzZXRfcGF0dGVybl9maXJzdCIpOworICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtLT5hcnJheV9zaXplICE9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnRyYW5zY2VpdmVyX2NvbmZpZy5hcnIuYmNkcl9yZXNldF9wYXR0ZXJuX2ZpcnN0IGlzIGEgZGlmZmVyZW50IHNpemUgdGhhbiBvdGhlciBhcnJheXMgaW4gdGhlIHN0cnVjdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgNDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbC5hcnJbaTFdLmJjZHJfcmVzZXRfcGF0dGVybl9maXJzdCA9IGNsaV9wYXJtLT52YWx1ZXNbaTFdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci50cmFuc2NlaXZlcl9jb25maWcuYXJyLmJjZHJfcmVzZXRfcGF0dGVybl9taWRkbGUiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci50cmFuc2NlaXZlcl9jb25maWcuYXJyLmJjZHJfcmVzZXRfcGF0dGVybl9taWRkbGUgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCA0OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMV0uYmNkcl9yZXNldF9wYXR0ZXJuX21pZGRsZSA9IGNsaV9wYXJtLT52YWx1ZXNbaTFdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci50cmFuc2NlaXZlcl9jb25maWcuYXJyLmJjZHJfcmVzZXRfcGF0dGVybl9sYXN0Iik7CisgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0tPmFycmF5X3NpemUgIT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIudHJhbnNjZWl2ZXJfY29uZmlnLmFyci5iY2RyX3Jlc2V0X3BhdHRlcm5fbGFzdCBpcyBhIGRpZmZlcmVudCBzaXplIHRoYW4gb3RoZXIgYXJyYXlzIGluIHRoZSBzdHJ1Y3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IDQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwuYXJyW2kxXS5iY2RyX3Jlc2V0X3BhdHRlcm5fbGFzdCA9IGNsaV9wYXJtLT52YWx1ZXNbaTFdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci50cmFuc2NlaXZlcl9jb25maWcuYXJyLmJjZHJfcmVzZXRfbWlkZGxlX3JlcGVhdHNfY291bnQiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci50cmFuc2NlaXZlcl9jb25maWcuYXJyLmJjZHJfcmVzZXRfbWlkZGxlX3JlcGVhdHNfY291bnQgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCA0OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMV0uYmNkcl9yZXNldF9taWRkbGVfcmVwZWF0c19jb3VudCA9IGNsaV9wYXJtLT52YWx1ZXNbaTFdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci50cmFuc2NlaXZlcl9jb25maWcuYXJyLmJjZHJfcmVzZXRfbG9jYXRpb24iKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci50cmFuc2NlaXZlcl9jb25maWcuYXJyLmJjZHJfcmVzZXRfbG9jYXRpb24gaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCA0OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMV0uYmNkcl9yZXNldF9sb2NhdGlvbiA9IGNsaV9wYXJtLT52YWx1ZXNbaTFdLnVudW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci50cmFuc2NlaXZlcl9jb25maWcuYXJyLmJjZHJfcmVzZXRfcG9sYXJpdHkiKTsKKyAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybS0+YXJyYXlfc2l6ZSAhPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci50cmFuc2NlaXZlcl9jb25maWcuYXJyLmJjZHJfcmVzZXRfcG9sYXJpdHkgaXMgYSBkaWZmZXJlbnQgc2l6ZSB0aGFuIG90aGVyIGFycmF5cyBpbiB0aGUgc3RydWN0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCA0OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsLmFycltpMV0uYmNkcl9yZXNldF9wb2xhcml0eSA9IGNsaV9wYXJtLT52YWx1ZXNbaTFdLm51bWJlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnRyYW5zY2VpdmVyX2NvbmZpZy5hcnIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIHRyYW5zY2VpdmVyX2NvbmZpZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9hcnJfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb25fNCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1RSQU5TQ0VJVkVSX0NPTkZJRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgdHJhbnNjZWl2ZXJfY29uZmlnLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHJhbnNjZWl2ZXJfY29uZmlnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fdHJ4LCB0cmFuc2NlaXZlcl9jb25maWcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fdHJ4LCB0cmFuc2NlaXZlcl9jb25maWcpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci50cmFuc2NlaXZlcl90eXBlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fdHJ4X3R5cGUgdmFsOworICAgICAgICB2YWwgPSAoYmNtb2x0X3hncG9uX3RyeF90eXBlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCB0cmFuc2NlaXZlcl90eXBlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgdHJhbnNjZWl2ZXJfdHlwZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9UUkFOU0NFSVZFUl9UWVBFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHJhbnNjZWl2ZXJfdHlwZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgdHJhbnNjZWl2ZXJfdHlwZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl90cngsIHRyYW5zY2VpdmVyX3R5cGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KHNlc3Npb24sICJmaWx0ZXIuZGVidWcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fdHJ4X2RlYnVnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZGVidWcucnhfcmV2ZXJzZWRfcG9sYXJpdHkiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5yeF9yZXZlcnNlZF9wb2xhcml0eSA9IChiY21vbHRfY29udHJvbF9zdGF0ZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5kZWJ1Zy5yeF9yZXZlcnNlZF9wb2xhcml0eSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5kZWJ1Zy5uZWdfb3V0X2JpdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm5lZ19vdXRfYml0ID0gKGJjbW9sdF9jb250cm9sX3N0YXRlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmRlYnVnLm5lZ19vdXRfYml0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCBkZWJ1ZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl90cnhfZGVidWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9ERUJVRywgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgZGVidWcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZWJ1ZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgZGVidWcpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fdHJ4LCBkZWJ1Zyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5yc3NpX25vcm1hbF9jb25maWcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fcnNzaV9ub3JtYWxfY29uZmlnIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnNzaV9ub3JtYWxfY29uZmlnLnBvbGFyaXR5Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucG9sYXJpdHkgPSAoYmNtb2x0X3BvbGFyaXR5KSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJzc2lfbm9ybWFsX2NvbmZpZy5wb2xhcml0eSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yc3NpX25vcm1hbF9jb25maWcubG9jYXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb2NhdGlvbiA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yc3NpX25vcm1hbF9jb25maWcubG9jYXRpb24gaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnNzaV9ub3JtYWxfY29uZmlnLmxvY2F0aW9uX3NpZ24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5sb2NhdGlvbl9zaWduID0gKGJjbW9sdF9zaWduKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJzc2lfbm9ybWFsX2NvbmZpZy5sb2NhdGlvbl9zaWduIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJzc2lfbm9ybWFsX2NvbmZpZy5wdWxzZV93aWR0aCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnB1bHNlX3dpZHRoID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJzc2lfbm9ybWFsX2NvbmZpZy5wdWxzZV93aWR0aCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yc3NpX25vcm1hbF9jb25maWcubWluaW11bV9idXJzdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLm1pbmltdW1fYnVyc3QgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucnNzaV9ub3JtYWxfY29uZmlnLm1pbmltdW1fYnVyc3QgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIHJzc2lfbm9ybWFsX2NvbmZpZywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWcgdmFsID0gIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SU1NJX05PUk1BTF9DT05GSUcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIHJzc2lfbm9ybWFsX2NvbmZpZywgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJzc2lfbm9ybWFsX2NvbmZpZyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgcnNzaV9ub3JtYWxfY29uZmlnKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgcnNzaV9ub3JtYWxfY29uZmlnKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLnJzc2lfcmFuZ2luZ19jb25maWcuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fcnNzaV9yYW5naW5nX2NvbmZpZyB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJzc2lfcmFuZ2luZ19jb25maWcuc3RhcnRfb25fZWQiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5zdGFydF9vbl9lZCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJzc2lfcmFuZ2luZ19jb25maWcuc3RhcnRfb25fZWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnNzaV9yYW5naW5nX2NvbmZpZy5mcmFtZV9kZWxheSIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmZyYW1lX2RlbGF5ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJzc2lfcmFuZ2luZ19jb25maWcuZnJhbWVfZGVsYXkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnNzaV9yYW5naW5nX2NvbmZpZy53b3JkX2RlbGF5Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwud29yZF9kZWxheSA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yc3NpX3JhbmdpbmdfY29uZmlnLndvcmRfZGVsYXkgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnNzaV9yYW5naW5nX2NvbmZpZy5mcmFtZV9kZWxheV9hZnRlcl9lZCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmZyYW1lX2RlbGF5X2FmdGVyX2VkID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJzc2lfcmFuZ2luZ19jb25maWcuZnJhbWVfZGVsYXlfYWZ0ZXJfZWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnNzaV9yYW5naW5nX2NvbmZpZy53b3JkX2RlbGF5X2FmdGVyX2VkIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwud29yZF9kZWxheV9hZnRlcl9lZCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yc3NpX3JhbmdpbmdfY29uZmlnLndvcmRfZGVsYXlfYWZ0ZXJfZWQgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIHJzc2lfcmFuZ2luZ19jb25maWcsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fcnNzaV9yYW5naW5nX2NvbmZpZyB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1JTU0lfUkFOR0lOR19DT05GSUcsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIHJzc2lfcmFuZ2luZ19jb25maWcsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyc3NpX3JhbmdpbmdfY29uZmlnIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fdHJ4LCByc3NpX3JhbmdpbmdfY29uZmlnKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgcnNzaV9yYW5naW5nX2NvbmZpZyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5zZXJkZXNfY29uZmlndXJhdGlvbi4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9zZXJkZXNfY29uZmlndXJhdGlvbiB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnNlcmRlc19jb25maWd1cmF0aW9uLm11bHRpX2VkX21vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5tdWx0aV9lZF9tb2RlID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuc2VyZGVzX2NvbmZpZ3VyYXRpb24ubXVsdGlfZWRfbW9kZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5zZXJkZXNfY29uZmlndXJhdGlvbi5yYW5naW5nX21vZGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5yYW5naW5nX21vZGUgPSAoYmNtb2x0X3hncG9uX3NlcmRlc19yYW5naW5nX21vZGUpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuc2VyZGVzX2NvbmZpZ3VyYXRpb24ucmFuZ2luZ19tb2RlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCBzZXJkZXNfY29uZmlndXJhdGlvbiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF94Z3Bvbl9zZXJkZXNfY29uZmlndXJhdGlvbiB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1NFUkRFU19DT05GSUdVUkFUSU9OLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCBzZXJkZXNfY29uZmlndXJhdGlvbiwgdmFsKTtcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJ9XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNlcmRlc19jb25maWd1cmF0aW9uIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fdHJ4LCBzZXJkZXNfY29uZmlndXJhdGlvbik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl90cngsIHNlcmRlc19jb25maWd1cmF0aW9uKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9wYXJtX2J5X3ByZWZpeChzZXNzaW9uLCAiZmlsdGVyLmJ1cnN0X3Byb2ZpbGVfZGVsaW1pdGVyX21heF9lcnJvcnMuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfYXJyX3U4XzQgdmFsID0geyB9OworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5idXJzdF9wcm9maWxlX2RlbGltaXRlcl9tYXhfZXJyb3JzLmFyciIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJjbW9sdF9idWZfZ2V0X3VzZWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIpICE9IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImJ1ZmZlciBmaWx0ZXIuYnVyc3RfcHJvZmlsZV9kZWxpbWl0ZXJfbWF4X2Vycm9ycy5hcnIgbXVzdCBoYXZlIDQgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJjbW9sdF9idWZfc2V0X3BvcygmY2xpX3Bhcm0tPnZhbHVlLmJ1ZmZlciwgMCk7CisgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoJmNsaV9wYXJtLT52YWx1ZS5idWZmZXIsIHZhbC5hcnIsIDQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5idXJzdF9wcm9maWxlX2RlbGltaXRlcl9tYXhfZXJyb3JzLmFyciBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgYnVyc3RfcHJvZmlsZV9kZWxpbWl0ZXJfbWF4X2Vycm9ycywgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygie1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coImJjbW9sdF9hcnJfdThfNCB2YWwgPSAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0JVUlNUX1BST0ZJTEVfREVMSU1JVEVSX01BWF9FUlJPUlMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIGJ1cnN0X3Byb2ZpbGVfZGVsaW1pdGVyX21heF9lcnJvcnMsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJidXJzdF9wcm9maWxlX2RlbGltaXRlcl9tYXhfZXJyb3JzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fdHJ4LCBidXJzdF9wcm9maWxlX2RlbGltaXRlcl9tYXhfZXJyb3JzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgYnVyc3RfcHJvZmlsZV9kZWxpbWl0ZXJfbWF4X2Vycm9ycyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5yYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LnRyeF9yZXNldF9wYXR0ZXJuX2ZpcnN0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudHJ4X3Jlc2V0X3BhdHRlcm5fZmlyc3QgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LnRyeF9yZXNldF9wYXR0ZXJuX2ZpcnN0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC50cnhfcmVzZXRfcGF0dGVybl9taWRkbGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50cnhfcmVzZXRfcGF0dGVybl9taWRkbGUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LnRyeF9yZXNldF9wYXR0ZXJuX21pZGRsZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQudHJ4X3Jlc2V0X3BhdHRlcm5fbGFzdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRyeF9yZXNldF9wYXR0ZXJuX2xhc3QgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LnRyeF9yZXNldF9wYXR0ZXJuX2xhc3QgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LnRyeF9yZXNldF9taWRkbGVfcmVwZWF0cyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRyeF9yZXNldF9taWRkbGVfcmVwZWF0cyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQudHJ4X3Jlc2V0X21pZGRsZV9yZXBlYXRzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC50cnhfcmVzZXRfbG9jYXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50cnhfcmVzZXRfbG9jYXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LnRyeF9yZXNldF9sb2NhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQuYmNkcl9yZXNldF9wYXR0ZXJuX2ZpcnN0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYmNkcl9yZXNldF9wYXR0ZXJuX2ZpcnN0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC5iY2RyX3Jlc2V0X3BhdHRlcm5fZmlyc3QgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LmJjZHJfcmVzZXRfcGF0dGVybl9taWRkbGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5iY2RyX3Jlc2V0X3BhdHRlcm5fbWlkZGxlID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC5iY2RyX3Jlc2V0X3BhdHRlcm5fbWlkZGxlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC5iY2RyX3Jlc2V0X3BhdHRlcm5fbGFzdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmJjZHJfcmVzZXRfcGF0dGVybl9sYXN0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC5iY2RyX3Jlc2V0X3BhdHRlcm5fbGFzdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQuYmNkcl9yZXNldF9taWRkbGVfcmVwZWF0cyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmJjZHJfcmVzZXRfbWlkZGxlX3JlcGVhdHMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LmJjZHJfcmVzZXRfbWlkZGxlX3JlcGVhdHMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0LmJjZHJfcmVzZXRfbG9jYXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5iY2RyX3Jlc2V0X2xvY2F0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC5iY2RyX3Jlc2V0X2xvY2F0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC5iY2RyX3Jlc2V0X3BvbGFyaXR5Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYmNkcl9yZXNldF9wb2xhcml0eSA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdC5iY2RyX3Jlc2V0X3BvbGFyaXR5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCByYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUkFOR0lOR19TTV9QQVRURVJOU19BVF9JTklULCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCByYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl90cngsIHJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl90cngsIHJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5yYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUuIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuIHZhbCA9IHsgfTsKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLnRyeF9yZXNldF9wYXR0ZXJuX2ZpcnN0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwudHJ4X3Jlc2V0X3BhdHRlcm5fZmlyc3QgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLnRyeF9yZXNldF9wYXR0ZXJuX2ZpcnN0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS50cnhfcmVzZXRfcGF0dGVybl9taWRkbGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50cnhfcmVzZXRfcGF0dGVybl9taWRkbGUgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLnRyeF9yZXNldF9wYXR0ZXJuX21pZGRsZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUudHJ4X3Jlc2V0X3BhdHRlcm5fbGFzdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRyeF9yZXNldF9wYXR0ZXJuX2xhc3QgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLnRyeF9yZXNldF9wYXR0ZXJuX2xhc3QgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLnRyeF9yZXNldF9taWRkbGVfcmVwZWF0cyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLnRyeF9yZXNldF9taWRkbGVfcmVwZWF0cyA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImZpbHRlci5yYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUudHJ4X3Jlc2V0X21pZGRsZV9yZXBlYXRzIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS50cnhfcmVzZXRfbG9jYXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC50cnhfcmVzZXRfbG9jYXRpb24gPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLnRyeF9yZXNldF9sb2NhdGlvbiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUuYmNkcl9yZXNldF9wYXR0ZXJuX2ZpcnN0Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYmNkcl9yZXNldF9wYXR0ZXJuX2ZpcnN0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS5iY2RyX3Jlc2V0X3BhdHRlcm5fZmlyc3QgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLmJjZHJfcmVzZXRfcGF0dGVybl9taWRkbGUiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5iY2RyX3Jlc2V0X3BhdHRlcm5fbWlkZGxlID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS5iY2RyX3Jlc2V0X3BhdHRlcm5fbWlkZGxlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS5iY2RyX3Jlc2V0X3BhdHRlcm5fbGFzdCIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmJjZHJfcmVzZXRfcGF0dGVybl9sYXN0ID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS5iY2RyX3Jlc2V0X3BhdHRlcm5fbGFzdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUuYmNkcl9yZXNldF9taWRkbGVfcmVwZWF0cyIpOworICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsLmJjZHJfcmVzZXRfbWlkZGxlX3JlcGVhdHMgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIucmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLmJjZHJfcmVzZXRfbWlkZGxlX3JlcGVhdHMgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLmJjZHJfcmVzZXRfbG9jYXRpb24iKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5iY2RyX3Jlc2V0X2xvY2F0aW9uID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS5iY2RyX3Jlc2V0X2xvY2F0aW9uIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS5iY2RyX3Jlc2V0X3BvbGFyaXR5Iik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwuYmNkcl9yZXNldF9wb2xhcml0eSA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLnJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZS5iY2RyX3Jlc2V0X3BvbGFyaXR5IGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCByYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIntcbiIpOworICAgICAgICBiY21jbGlfbG9nKCJiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUkFOR0lOR19TTV9QQVRURVJOU19FRF9GQUlMVVJFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fdHJ4LCByYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUsIHZhbCk7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygifVxuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl90cngsIHJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl90cngsIHJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJlc2V0X29uX2RlbF9taXNzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIHJlc2V0X29uX2RlbF9taXNzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgcmVzZXRfb25fZGVsX21pc3MsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUkVTRVRfT05fREVMX01JU1MsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyZXNldF9vbl9kZWxfbWlzcyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgcmVzZXRfb25fZGVsX21pc3MpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fdHJ4LCByZXNldF9vbl9kZWxfbWlzcyk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoc2Vzc2lvbiwgImZpbHRlci5lZF9zdGF0ZS4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9sdF94Z3Bvbl9lZF9zdGF0ZSB2YWwgPSB7IH07CisgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLmVkX3N0YXRlLnJlc2V0X29uX2VkX2ZhaWwiKTsKKyAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbC5yZXNldF9vbl9lZF9mYWlsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJmaWx0ZXIuZWRfc3RhdGUucmVzZXRfb25fZWRfZmFpbCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgIH0KKworICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5lZF9zdGF0ZS5yZXNldF9vbl9lZF9zdWNjZXNzIik7CisgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwucmVzZXRfb25fZWRfc3VjY2VzcyA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyLmVkX3N0YXRlLnJlc2V0X29uX2VkX3N1Y2Nlc3MgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIGVkX3N0YXRlLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJ7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hncG9uX2VkX3N0YXRlIHZhbCA9ICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfRURfU1RBVEUsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIGVkX3N0YXRlLCB2YWwpO1xuIik7CisgICAgICAgIGJjbWNsaV9sb2coIn1cbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZWRfc3RhdGUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl90cngsIGVkX3N0YXRlKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgZWRfc3RhdGUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5pbnZlcnRfZWQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgaW52ZXJ0X2VkLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgaW52ZXJ0X2VkLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWCwgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0lOVkVSVF9FRCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImludmVydF9lZCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgaW52ZXJ0X2VkKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgaW52ZXJ0X2VkKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIuZW5kX29mX2J1cnN0X3Jlc2V0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vc19ib29sIHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIGVuZF9vZl9idXJzdF9yZXNldCwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIGVuZF9vZl9idXJzdF9yZXNldCwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YR1BPTl9UUlgsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9FTkRfT0ZfQlVSU1RfUkVTRVQsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlbmRfb2ZfYnVyc3RfcmVzZXQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl90cngsIGVuZF9vZl9idXJzdF9yZXNldCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl90cngsIGVuZF9vZl9idXJzdF9yZXNldCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnRyeF9yc3RfcG9sYXJpdHkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX3RyeCwgdHJ4X3JzdF9wb2xhcml0eSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl90cngsIHRyeF9yc3RfcG9sYXJpdHksICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWEdQT05fVFJYLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfVFJYX1JTVF9QT0xBUklUWSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRyeF9yc3RfcG9sYXJpdHkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl90cngsIHRyeF9yc3RfcG9sYXJpdHkpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeGdwb25fdHJ4LCB0cnhfcnN0X3BvbGFyaXR5KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm8gcHJvcGVydGllcyB3ZXJlIHJlcXVlc3RlZCwgaW5jbHVkZSBldmVyeXRoaW5nICovCisgICAgaWYgKCFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl90cngsIGJ1cnN0X3Byb2ZpbGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl90cngsIHRyYW5zY2VpdmVyX2NvbmZpZykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgdHJhbnNjZWl2ZXJfdHlwZSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgZGVidWcpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl90cngsIHJzc2lfbm9ybWFsX2NvbmZpZykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgcnNzaV9yYW5naW5nX2NvbmZpZykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgc2VyZGVzX2NvbmZpZ3VyYXRpb24pICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl90cngsIGJ1cnN0X3Byb2ZpbGVfZGVsaW1pdGVyX21heF9lcnJvcnMpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl90cngsIHJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgcmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fdHJ4LCByZXNldF9vbl9kZWxfbWlzcykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgZWRfc3RhdGUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4Z3Bvbl90cngsIGludmVydF9lZCkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgZW5kX29mX2J1cnN0X3Jlc2V0KSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeGdwb25fdHJ4LCB0cnhfcnN0X3BvbGFyaXR5KSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhncG9uX3RyeCwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4Z3Bvbl90cngsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeHBvbl9zZXJkZXNfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmNsaV9wYXJtOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfeHBvbl9zZXJkZXNfY2ZnIGNmZzsgICAgICAgICAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X3hwb25fc2VyZGVzX2tleSBrZXkgPSB7IH07ICAgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbWNsaV9sb2coImJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAlZDtcbiIsIGRldmljZV9pZCk7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hwb25fc2VyZGVzX2NmZyBjZmc7XG4iKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeHBvbl9zZXJkZXNfa2V5IGtleSA9IHsgIH07XG4iKTsKKyAgICBhcGljbGlfcHJpbnRfc3RhcnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0Iik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9wb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWFBPTl9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWFBPTl9TRVJERVNfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaW5zdGFuY2UiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5pbnN0YW5jZSA9IChiY21vbHRfc2VyZGVzX2luc3RhbmNlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJpbnN0YW5jZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuaW5zdGFuY2UgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWFBPTl9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWFBPTl9TRVJERVNfS0VZX0lEX0lOU1RBTkNFLCAma2V5Lmluc3RhbmNlKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeHBvbl9zZXJkZXMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIHhwb25fc2VyZGVzLCBrZXkpO1xuIik7CisKKyAgICAvKiBkZWNvZGUgQVBJIHBhcmFtZXRlcnMgZnJvbSBDTEkgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3ZnYSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X3ZnYSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF92Z2EpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X3BmIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfcGYpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfcGYpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2xmcGYiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9sZnBmKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X2xmcGYpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2RmZTEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9kZmUxKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X2RmZTEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2RmZTIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9kZmUyKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X2RmZTIpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2RmZTMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9kZmUzKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X2RmZTMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2RmZTQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9kZmU0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X2RmZTQpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2RmZTUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9kZmU1KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X2RmZTUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3ByZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeHBvbl9zZXJkZXMsIHR4X3ByZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhwb25fc2VyZGVzLCB0eF9wcmUpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X21haW4iKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhwb25fc2VyZGVzLCB0eF9tYWluKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeHBvbl9zZXJkZXMsIHR4X21haW4pO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3Bvc3QxIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4cG9uX3NlcmRlcywgdHhfcG9zdDEpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4cG9uX3NlcmRlcywgdHhfcG9zdDEpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3Bvc3QyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4cG9uX3NlcmRlcywgdHhfcG9zdDIpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4cG9uX3NlcmRlcywgdHhfcG9zdDIpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3Bvc3QzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4cG9uX3NlcmRlcywgdHhfcG9zdDMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCB4cG9uX3NlcmRlcywgdHhfcG9zdDMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2FtcCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeHBvbl9zZXJkZXMsIHR4X2FtcCk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhwb25fc2VyZGVzLCB0eF9hbXApO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBubyBwcm9wZXJ0aWVzIHdlcmUgcmVxdWVzdGVkLCBpbmNsdWRlIGV2ZXJ5dGhpbmcgKi8KKyAgICBpZiAoIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X3ZnYSkgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X3BmKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfbGZwZikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X2RmZTEpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9kZmUyKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfZGZlMykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X2RmZTQpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9kZmU1KSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgdHhfcHJlKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgdHhfbWFpbikgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHR4X3Bvc3QxKSAmJiAhQkNNT0xUX0NGR19QUk9QX0lTX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgdHhfcG9zdDIpICYmICFCQ01PTFRfQ0ZHX1BST1BfSVNfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCB0eF9wb3N0MykgJiYgIUJDTU9MVF9DRkdfUFJPUF9JU19TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHR4X2FtcCkpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIHhwb25fc2VyZGVzLCBhbGxfcHJvcGVydGllcyk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgeHBvbl9zZXJkZXMsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmY2ZnLmhkcik7XG4iKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBwcmludCBBUEkgY29udGVudHMgdG8gdGhlIENMSSAqLworICAgICAgICBhcGljbGlfcHJpbnRfZGF0YV9zdGFydChzZXNzaW9uKTsKKyAgICAgICAgZXJyID0gYXBpY2xpX21zZ19kdW1wKHNlc3Npb24sICZjZmcuaGRyLmhkcik7CisgICAgfQorCisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94cG9uX3NlcmRlc19jZmdfc2V0KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94cG9uX3NlcmRlc19jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeHBvbl9zZXJkZXNfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeHBvbl9zZXJkZXNfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94cG9uX3NlcmRlc19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGFwaWNsaV9wcmludF9zdGFydChzZXNzaW9uLCAiYmNtb2x0X2NmZ19zZXQiKTsKKworICAgIC8qIGJ1aWxkIGtleSBmcm9tIENMSSBwYXJhbWV0ZXJzICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5wb25fbmkgPSAoYmNtb2x0X3Bvbl9uaSkgY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJwb25fbmkgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5LnBvbl9uaSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YUE9OX1NFUkRFU19LRVlfSURfUE9OX05JLCAma2V5LnBvbl9uaSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpbnN0YW5jZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5Lmluc3RhbmNlID0gKGJjbW9sdF9zZXJkZXNfaW5zdGFuY2UpIGNsaV9wYXJtLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgImluc3RhbmNlIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5pbnN0YW5jZSA9ICIpOworICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9LRVksIDAsIEJDTU9MVF9YUE9OX1NFUkRFU19LRVlfSURfSU5TVEFOQ0UsICZrZXkuaW5zdGFuY2UpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4cG9uX3NlcmRlcywga2V5KTsKKyAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeHBvbl9zZXJkZXMsIGtleSk7XG4iKTsKKworICAgIC8qIGRlY29kZSBBUEkgcGFyYW1ldGVycyBmcm9tIENMSSAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfdmdhIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X3ZnYSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfdmdhLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9WR0EsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9wZiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9wZiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfcGYsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWFBPTl9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX1BGLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfbGZwZiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9sZnBmLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9sZnBmLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9MRlBGLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfZGZlMSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9kZmUxLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9kZmUxLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkUxLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfZGZlMiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfZGZlMiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfZGZlMiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFMiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2RmZTMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X2RmZTMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X2RmZTMsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWFBPTl9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9kZmU0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9kZmU0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9kZmU0LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkU0LCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfZGZlNSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfZGZlNSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfZGZlNSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFNSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3ByZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCB0eF9wcmUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHR4X3ByZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfUFJFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfbWFpbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCB0eF9tYWluLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCB0eF9tYWluLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9NQUlOLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfcG9zdDEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgdHhfcG9zdDEsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHR4X3Bvc3QxLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9QT1NUMSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3Bvc3QyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCB0eF9wb3N0MiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgdHhfcG9zdDIsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWFBPTl9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QyLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfcG9zdDMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHR4X3Bvc3QzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCB0eF9wb3N0MywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfUE9TVDMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9hbXAiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgdHhfYW1wLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCB0eF9hbXAsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWFBPTl9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX0FNUCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9jZmdfc2V0KGRldmljZV9pZCwgJmNmZy5oZHIpO1xuIik7CisgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIGVyciwgY2ZnLmhkci5oZHIuZXJyX3RleHQpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X2NsaV94cG9uX3NlcmRlc19jZmdfY2xlYXIoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3hwb25fc2VyZGVzX2NmZyBjZmc7ICAgICAgICAgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF94cG9uX3NlcmRlc19rZXkga2V5ID0geyB9OyAgIC8qKjwgZGVjbGFyZSBrZXkgKi8KKyAgICBiY21jbGlfbG9nKCJiY21vbHRfZGV2aWQgZGV2aWNlX2lkID0gJWQ7XG4iLCBkZXZpY2VfaWQpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94cG9uX3NlcmRlc19jZmcgY2ZnO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X3hwb25fc2VyZGVzX2tleSBrZXkgPSB7ICB9O1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2NsZWFyIik7CisKKyAgICAvKiBidWlsZCBrZXkgZnJvbSBDTEkgcGFyYW1ldGVycyAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkucG9uX25pID0gKGJjbW9sdF9wb25fbmkpIGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAicG9uX25pIGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImtleS5wb25fbmkgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWFBPTl9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWFBPTl9TRVJERVNfS0VZX0lEX1BPTl9OSSwgJmtleS5wb25fbmkpOworICAgIGJjbWNsaV9sb2coIjtcbiIpOworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaW5zdGFuY2UiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGtleS5pbnN0YW5jZSA9IChiY21vbHRfc2VyZGVzX2luc3RhbmNlKSBjbGlfcGFybS0+dmFsdWUuZW51bV92YWw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJpbnN0YW5jZSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkuaW5zdGFuY2UgPSAiKTsKKyAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWFBPTl9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBCQ01PTFRfWFBPTl9TRVJERVNfS0VZX0lEX0lOU1RBTkNFLCAma2V5Lmluc3RhbmNlKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeHBvbl9zZXJkZXMsIGtleSk7CisgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19JTklUKCZjZmcsIHhwb25fc2VyZGVzLCBrZXkpO1xuIik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIGVyciA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2NmZ19jbGVhcihkZXZpY2VfaWQsICZjZmcuaGRyKTtcbiIpOworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfeHBvbl9zZXJkZXNfY2ZnX2dldF9tdWx0aShiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYXBpY2xpX2J5dGVfcG9vbCAqYnl0ZV9wb29sKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqY2xpX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF94cG9uX3NlcmRlc19jZmcgY2ZnOyAgICAgICAgIC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfeHBvbl9zZXJkZXNfa2V5IGtleSA9IHsgfTsgICAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X21zZ19zZXQgKm1zZ19zZXQgPSBOVUxMOyAgICAgLyoqPCBkZWNsYXJlIG1lc3NhZ2Ugc2V0ICovCisgICAgdWludDMyX3QgbWF4X21zZ3M7ICAgICAgICAgICAgICAgICAgLyoqPCBkZWNsYXJlIG1heCBudW1iZXIgb2YgbXNncyB0byBnZXQgKi8KKyAgICBiY21vc19ib29sIGludmVydF9maWx0ZXI7ICAgICAgICAgICAvKio8IGRlY2xhcmUgZmlsdGVyIGludmVydCBmbGFnICovCisgICAgYmNtY2xpX2xvZygiYmNtb2x0X2RldmlkIGRldmljZV9pZCA9ICVkO1xuIiwgZGV2aWNlX2lkKTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfeHBvbl9zZXJkZXNfY2ZnIGNmZztcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF94cG9uX3NlcmRlc19rZXkga2V5ID0geyAgfTtcbiIpOworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0KiBtc2dfc2V0ID0gTlVMTDtcbiIpOworICAgIGJjbWNsaV9sb2coInVpbnQzMl90IG1heF9tc2dzO1xuIik7CisgICAgYmNtY2xpX2xvZygiYmNtb3NfYm9vbCBpbnZlcnRfZmlsdGVyO1xuIik7CisgICAgYXBpY2xpX3ByaW50X3N0YXJ0KHNlc3Npb24sICJiY21vbHRfY2ZnX2dldF9tdWx0aSIpOworCisgICAgLyogYnVpbGQga2V5IGZyb20gQ0xJIHBhcmFtZXRlcnMgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAga2V5LnBvbl9uaSA9IChiY21vbHRfcG9uX25pKSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInBvbl9uaSBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJrZXkucG9uX25pID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hQT05fU0VSREVTX0tFWV9JRF9QT05fTkksICZrZXkucG9uX25pKTsKKyAgICBiY21jbGlfbG9nKCI7XG4iKTsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImluc3RhbmNlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBrZXkuaW5zdGFuY2UgPSAoYmNtb2x0X3NlcmRlc19pbnN0YW5jZSkgY2xpX3Bhcm0tPnZhbHVlLmVudW1fdmFsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiaW5zdGFuY2UgaXMgbm90IHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgYmNtY2xpX2xvZygia2V5Lmluc3RhbmNlID0gIik7CisgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0tFWSwgMCwgQkNNT0xUX1hQT05fU0VSREVTX0tFWV9JRF9JTlNUQU5DRSwgJmtleS5pbnN0YW5jZSk7CisgICAgYmNtY2xpX2xvZygiO1xuIik7CisKKyAgICAvKiBzZXQgbWF4IG51bWJlciBvZiBtc2dzIGZyb20gQ0xJIHBhcmFtZXRlciAqLworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X21zZ3MiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG1heF9tc2dzID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJtYXhfbXNncyBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJtYXhfbXNncyA9ICVkO1xuIiwgbWF4X21zZ3MpOworCisgICAgLyogc2V0IGZpbHRlciBpbnZlcnQgZmxhZyBmcm9tIENMSSBwYXJhbWV0ZXIgKi8KKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlcl9pbnZlcnQiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludmVydF9maWx0ZXIgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAiZmlsdGVyX2ludmVydCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBiY21jbGlfbG9nKCJpbnZlcnRfZmlsdGVyID0gJXM7XG4iLCAoaW52ZXJ0X2ZpbHRlcikgPyAiQkNNT1NfVFJVRSIgOiAiQkNNT1NfRkFMU0UiKTsKKworICAgIC8qIGFsbG9jYXRlIG1lc3NhZ2Ugc2V0ICovCisgICAgZXJyID0gYXBpY2xpX21zZ19zZXRfYWxsb2MoYnl0ZV9wb29sLCBCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3MsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbWNsaV9sb2coImJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfWFBPTl9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCBtYXhfbXNncywgJm1zZ19zZXQpO1xuIik7CisKKyAgICAvKiBpbml0IHRoZSBBUEkgc3RydWN0ICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIHhwb25fc2VyZGVzLCBrZXkpOworICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4cG9uX3NlcmRlcywga2V5KTtcbiIpOworCisgICAgLyogZGVjb2RlIEFQSSBwYXJhbWV0ZXJzIGZyb20gQ0xJICovCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnhfdmdhIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICB1aW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLnVudW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X3ZnYSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfdmdhLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9WR0EsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF92Z2EiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4cG9uX3NlcmRlcywgcnhfdmdhKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCByeF92Z2EpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yeF9wZiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9wZiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfcGYsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWFBPTl9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX1BGLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfcGYiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4cG9uX3NlcmRlcywgcnhfcGYpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeHBvbl9zZXJkZXMsIHJ4X3BmKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnhfbGZwZiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9sZnBmLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9sZnBmLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9MRlBGLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfbGZwZiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCByeF9sZnBmKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCByeF9sZnBmKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnhfZGZlMSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9kZmUxLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9kZmUxLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkUxLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfZGZlMSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCByeF9kZmUxKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCByeF9kZmUxKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnhfZGZlMiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfZGZlMiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfZGZlMiwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFMiwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2RmZTIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4cG9uX3NlcmRlcywgcnhfZGZlMik7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4cG9uX3NlcmRlcywgcnhfZGZlMik7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnJ4X2RmZTMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X2RmZTMsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHJ4X2RmZTMsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWFBPTl9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyeF9kZmUzIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeHBvbl9zZXJkZXMsIHJ4X2RmZTMpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeHBvbl9zZXJkZXMsIHJ4X2RmZTMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci5yeF9kZmU0Iik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9kZmU0LCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCByeF9kZmU0LCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkU0LCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicnhfZGZlNCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCByeF9kZmU0KTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCByeF9kZmU0KTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIucnhfZGZlNSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW50OF90IHZhbDsKKyAgICAgICAgdmFsID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfZGZlNSwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgcnhfZGZlNSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFNSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJ4X2RmZTUiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4cG9uX3NlcmRlcywgcnhfZGZlNSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4cG9uX3NlcmRlcywgcnhfZGZlNSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnR4X3ByZSIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCB0eF9wcmUsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHR4X3ByZSwgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfUFJFLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfcHJlIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeHBvbl9zZXJkZXMsIHR4X3ByZSk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4cG9uX3NlcmRlcywgdHhfcHJlKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudHhfbWFpbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgdWludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS51bnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCB0eF9tYWluLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCB0eF9tYWluLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9NQUlOLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfbWFpbiIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCB0eF9tYWluKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCB0eF9tYWluKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudHhfcG9zdDEiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgdHhfcG9zdDEsIHZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHR4X3Bvc3QxLCAiKTsKKyAgICAgICAgYXBpY2xpX2xvZ19wcm9wX3ZhbChCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgMCwgQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9QT1NUMSwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X3Bvc3QxIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoY2xpX3Bhcm0tPnZhbHVlLm51bWJlcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeHBvbl9zZXJkZXMsIHR4X3Bvc3QxKTsKKyAgICAgICAgICAgIGJjbWNsaV9sb2coIkJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCB0eF9wb3N0MSk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsdGVyLnR4X3Bvc3QyIik7CisgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCB0eF9wb3N0MiwgdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgdHhfcG9zdDIsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWFBPTl9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QyLCAmdmFsKTsKKyAgICAgICAgYmNtY2xpX2xvZygiKTtcbiIpOworICAgIH0KKworICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidHhfcG9zdDIiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlmIChjbGlfcGFybS0+dmFsdWUubnVtYmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4cG9uX3NlcmRlcywgdHhfcG9zdDIpOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeHBvbl9zZXJkZXMsIHR4X3Bvc3QyKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJmaWx0ZXIudHhfcG9zdDMiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludDhfdCB2YWw7CisgICAgICAgIHZhbCA9IGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeHBvbl9zZXJkZXMsIHR4X3Bvc3QzLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCB0eF9wb3N0MywgIik7CisgICAgICAgIGFwaWNsaV9sb2dfcHJvcF92YWwoQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIDAsIEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfUE9TVDMsICZ2YWwpOworICAgICAgICBiY21jbGlfbG9nKCIpO1xuIik7CisgICAgfQorCisgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0eF9wb3N0MyIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCB0eF9wb3N0Myk7CisgICAgICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCB4cG9uX3NlcmRlcywgdHhfcG9zdDMpO1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbHRlci50eF9hbXAiKTsKKyAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgdmFsOworICAgICAgICB2YWwgPSBjbGlfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4cG9uX3NlcmRlcywgdHhfYW1wLCB2YWwpOworICAgICAgICBiY21jbGlfbG9nKCJCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhwb25fc2VyZGVzLCB0eF9hbXAsICIpOworICAgICAgICBhcGljbGlfbG9nX3Byb3BfdmFsKEJDTU9MVF9PQkpfSURfWFBPTl9TRVJERVMsIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCAwLCBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX0FNUCwgJnZhbCk7CisgICAgICAgIGJjbWNsaV9sb2coIik7XG4iKTsKKyAgICB9CisKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInR4X2FtcCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaWYgKGNsaV9wYXJtLT52YWx1ZS5udW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCB0eF9hbXApOworICAgICAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeHBvbl9zZXJkZXMsIHR4X2FtcCk7XG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlmIG5vIHByb3BlcnRpZXMgd2VyZSByZXF1ZXN0ZWQsIGluY2x1ZGUgZXZlcnl0aGluZyAqLworICAgIGlmICghQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeHBvbl9zZXJkZXMsIHJ4X3ZnYSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCByeF9wZikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCByeF9sZnBmKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeHBvbl9zZXJkZXMsIHJ4X2RmZTEpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4cG9uX3NlcmRlcywgcnhfZGZlMikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCByeF9kZmUzKSAmJiAhQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9JU19TRVQobXNnX3NldCwgeHBvbl9zZXJkZXMsIHJ4X2RmZTQpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4cG9uX3NlcmRlcywgcnhfZGZlNSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCB0eF9wcmUpICYmICFCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0lTX1NFVChtc2dfc2V0LCB4cG9uX3NlcmRlcywgdHhfbWFpbikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCB0eF9wb3N0MSkgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCB0eF9wb3N0MikgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCB0eF9wb3N0MykgJiYgIUJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfSVNfU0VUKG1zZ19zZXQsIHhwb25fc2VyZGVzLCB0eF9hbXApKQorICAgIHsKKyAgICAgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeHBvbl9zZXJkZXMsIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICAgICAgYmNtY2xpX2xvZygiQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgeHBvbl9zZXJkZXMsIGFsbF9wcm9wZXJ0aWVzKTtcbiIpOworICAgIH0KKworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCAmY2ZnLmhkciwgKGludmVydF9maWx0ZXIpID8gQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OIDogQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTsKKyAgICBiY21jbGlfbG9nKCJiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZjZmcuaGRyLCAoaW52ZXJ0X2ZpbHRlcikgPyBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT04gOiBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpO1xuIik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogcHJpbnQgQVBJIGNvbnRlbnRzIHRvIHRoZSBDTEkgKi8KKyAgICAgICAgYXBpY2xpX3ByaW50X2RhdGFfc3RhcnQoc2Vzc2lvbik7CisgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCAmY2ZnLmhkci5oZHIpOworICAgIH0KKworICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBlcnIsIGNmZy5oZHIuaGRyLmVycl90ZXh0KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9jbGlfYXBpX3Jvb3QoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtb2x0X21ndF9ncm91cCBncm91cF90eXBlLCBiY21vbHRfbXNnX3R5cGUgbXNnX3R5cGUsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBhcGljbGlfYnl0ZV9wb29sICpieXRlX3Bvb2wpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbGlfcGFybTsKKyAgICBiY21vbHRfb2JqX2lkIG9ial9pZDsKKyAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9iamVjdCIpOworICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgb2JqX2lkID0gY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgIm9iamVjdCBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG9ial9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9BRV9OSToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfYWVfbmlfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2FlX25pX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0NMRUFSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2FlX25pX2NmZ19jbGVhcihkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2FlX25pX2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9hZV9uaV9vcGVyX2lkIHN1YjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSAoYmNtb2x0X2FlX25pX29wZXJfaWQpIGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1YikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9OSV9PUEVSX0lEX1NFVF9BRV9OSV9FTl9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfYWVfbmlfb3Blcl9zZXRfYWVfbmlfZW5fc3RhdGVfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9BRV9QQVRIX0RTOgorICAgICAgICAgICAgc3dpdGNoIChncm91cF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9hZV9wYXRoX2RzX3N0YXRfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfYWVfcGF0aF9kc19zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9hZV9wYXRoX2RzX3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfYWVfcGF0aF9kc19hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9hZV9wYXRoX2RzX2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0FFX1BBVEhfVVM6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2FlX3BhdGhfdXNfc3RhdF9nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9hZV9wYXRoX3VzX3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2FlX3BhdGhfdXNfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9hZV9wYXRoX3VzX2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2FlX3BhdGhfdXNfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfQ0hBTk5FTDoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfY2hhbm5lbF9jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfY2hhbm5lbF9jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9jaGFubmVsX2NmZ19jbGVhcihkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2NoYW5uZWxfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfREVCVUc6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2RlYnVnX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2RlYnVnX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZGVidWdfY2ZnX2NsZWFyKGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVRfTVVMVEk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZGVidWdfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9kZWJ1Z19hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9kZWJ1Z19hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZGVidWdfb3Blcl9pZCBzdWI7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gKGJjbW9sdF9kZWJ1Z19vcGVyX2lkKSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVCVUdfT1BFUl9JRF9DTElfSU5QVVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2RlYnVnX29wZXJfY2xpX2lucHV0X3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVCVUdfT1BFUl9JRF9TVEFSVF9BUElfQ0FQVFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZGVidWdfb3Blcl9zdGFydF9hcGlfY2FwdHVyZV9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERUJVR19PUEVSX0lEX1NUT1BfQVBJX0NBUFRVUkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2RlYnVnX29wZXJfc3RvcF9hcGlfY2FwdHVyZV9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERUJVR19PUEVSX0lEX1JFU0VUX0FQSV9DQVBUVVJFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9kZWJ1Z19vcGVyX3Jlc2V0X2FwaV9jYXB0dXJlX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfREVWSUNFOgorICAgICAgICAgICAgc3dpdGNoIChncm91cF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9kZXZpY2VfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZGV2aWNlX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZGV2aWNlX2NmZ19jbGVhcihkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2RldmljZV9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2RldmljZV9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9kZXZpY2VfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2RldmljZV9vcGVyX2lkIHN1YjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSAoYmNtb2x0X2RldmljZV9vcGVyX2lkKSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX09QRVJfSURfQ09OTkVDVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZGV2aWNlX29wZXJfY29ubmVjdF9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9ESVNDT05ORUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9kZXZpY2Vfb3Blcl9kaXNjb25uZWN0X3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9PUEVSX0lEX1JFU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9kZXZpY2Vfb3Blcl9yZXNldF9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9IT1NUX0tFRVBfQUxJVkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2RldmljZV9vcGVyX2hvc3Rfa2VlcF9hbGl2ZV9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9TV19VUEdSQURFX0FDVElWQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9kZXZpY2Vfb3Blcl9zd191cGdyYWRlX2FjdGl2YXRlX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9PUEVSX0lEX0lNQUdFX1RSQU5TRkVSX1NUQVJUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9kZXZpY2Vfb3Blcl9pbWFnZV90cmFuc2Zlcl9zdGFydF9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9JTUFHRV9UUkFOU0ZFUl9EQVRBOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9kZXZpY2Vfb3Blcl9pbWFnZV90cmFuc2Zlcl9kYXRhX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX09QRVJfSURfUlVOX0REUl9URVNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9kZXZpY2Vfb3Blcl9ydW5fZGRyX3Rlc3Rfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX0RFTklFRF9MSU5LOgorICAgICAgICAgICAgc3dpdGNoIChncm91cF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX2RlbmllZF9saW5rX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX2RlbmllZF9saW5rX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0NMRUFSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2NsZWFyKGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVRfTVVMVEk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9kZW5pZWRfbGlua19jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX0xJTks6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fbGlua19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX2xpbmtfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX2xpbmtfY2ZnX2NsZWFyKGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVRfTVVMVEk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9saW5rX2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fbGlua19zdGF0X2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fbGlua19zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX2xpbmtfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX2xpbmtfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9saW5rX2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX2xpbmtfb3Blcl9pZCBzdWI7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gKGJjbW9sdF9lcG9uX2xpbmtfb3Blcl9pZCkgY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19PUEVSX0lEX0ZPUkNFX1JFRElTQ09WRVJZOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX2xpbmtfb3Blcl9mb3JjZV9yZWRpc2NvdmVyeV9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9ERUxFVEVfTElOSzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9saW5rX29wZXJfZGVsZXRlX2xpbmtfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX09QRVJfSURfT0FNX0tFRVBBTElWRV9USU1FUl9TVEFSVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9saW5rX29wZXJfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9PQU1fS0VFUEFMSVZFX1RJTUVSX1NUT1A6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fbGlua19vcGVyX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcF9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9LRVlfRVhDSEFOR0VfU1RBUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fbGlua19vcGVyX2tleV9leGNoYW5nZV9zdGFydF9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9LRVlfRVhDSEFOR0VfU1RPUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9saW5rX29wZXJfa2V5X2V4Y2hhbmdlX3N0b3Bfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX09QRVJfSURfU1RBVElDX1JFR0lTVFJBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9saW5rX29wZXJfc3RhdGljX3JlZ2lzdHJhdGlvbl9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1BST1hZOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9saW5rX3Byb3h5X2lkIHN1YjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSAoYmNtb2x0X2Vwb25fbGlua19wcm94eV9pZCkgY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19QUk9YWV9JRF9JTkpFQ1RfRlJBTUU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fbGlua19wcm94eV9pbmplY3RfZnJhbWVfc2VuZChkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX05JOgorICAgICAgICAgICAgc3dpdGNoIChncm91cF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX25pX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fbmlfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX25pX2NmZ19jbGVhcihkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fbmlfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX25pX2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fbmlfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fbmlfb3Blcl9pZCBzdWI7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gKGJjbW9sdF9lcG9uX25pX29wZXJfaWQpIGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1YikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX09QRVJfSURfU0VUX0VQT05fTklfRU5fU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fbmlfb3Blcl9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX09QRVJfSURfSVNTVUVfUlNTSV9HUkFOVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9uaV9vcGVyX2lzc3VlX3Jzc2lfZ3JhbnRfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX0FERF9MSU5LOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX25pX29wZXJfYWRkX2xpbmtfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX0FERF9NVUxUSUNBU1RfTElOSzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9uaV9vcGVyX2FkZF9tdWx0aWNhc3RfbGlua19zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX09QRVJfSURfQUREX1BST1RFQ1RFRF9TVEFOREJZX0xJTks6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fbmlfb3Blcl9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX09QRVJfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfQVBQTFlfUkVSQU5HRV9ERUxUQToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9uaV9vcGVyX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX1JPR1VFX0xMSURfU0NBTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9uaV9vcGVyX3JvZ3VlX2xsaWRfc2Nhbl9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX09QRVJfSURfU1RBUlRfT05VX1VQR1JBREU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fbmlfb3Blcl9zdGFydF9vbnVfdXBncmFkZV9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMTBHX1VTOgorICAgICAgICAgICAgc3dpdGNoIChncm91cF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX29udV8xMGdfdXNfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9vbnVfMTBnX3VzX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9vbnVfMTBnX3VzX2NmZ19jbGVhcihkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fb251XzEwZ191c19jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX29udV8xMGdfdXNfc3RhdF9nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xR19VUzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9vbnVfMWdfdXNfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9vbnVfMWdfdXNfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX29udV8xZ191c19jZmdfY2xlYXIoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVF9NVUxUSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX29udV8xZ191c19jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX29udV8xZ191c19zdGF0X2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzEwR19EUzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzEwZ19kc19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzEwZ19kc19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMTBnX2RzX2NmZ19jbGVhcihkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX1VTOgorICAgICAgICAgICAgc3dpdGNoIChncm91cF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMTBnX3VzX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMTBnX3VzX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0NMRUFSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2NsZWFyKGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVRfTVVMVEk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzEwZ191c19jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19EUzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzFnX2RzX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMWdfZHNfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzFnX2RzX2NmZ19jbGVhcihkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fcGF0aF8xZ19kc19jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMWdfZHNfc3RhdF9nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfVVM6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fcGF0aF8xZ191c19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzFnX3VzX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0NMRUFSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fcGF0aF8xZ191c19jZmdfY2xlYXIoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVF9NVUxUSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMWdfdXNfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfRVBPTl9SUDoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9ycF9jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZXBvbl9ycF9jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9lcG9uX3JwX2NmZ19jbGVhcihkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2Vwb25fcnBfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BJTzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bpb19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bpb19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncGlvX2NmZ19jbGVhcihkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwaW9fY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9hbGxvY19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9hbGxvY19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2FsbG9jX2NmZ19jbGVhcihkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fYWxsb2NfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9hbGxvY19zdGF0X2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fYWxsb2Nfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9hbGxvY19zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fYWxsb2NfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9hbGxvY19hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZ3Bvbl9hbGxvY19vcGVyX2lkIHN1YjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSAoYmNtb2x0X2dwb25fYWxsb2Nfb3Blcl9pZCkgY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fQUxMT0NfT1BFUl9JRF9TRVRfU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fYWxsb2Nfb3Blcl9zZXRfc3RhdGVfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9BTExPQ19PUEVSX0lEX0dFVF9TVEFUUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9hbGxvY19vcGVyX2dldF9zdGF0c19zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQ6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fZ2VtX3BvcnRfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fZ2VtX3BvcnRfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9nZW1fcG9ydF9jZmdfY2xlYXIoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVF9NVUxUSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2dlbV9wb3J0X2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fZ2VtX3BvcnRfc3RhdF9nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2dwb25fZ2VtX3BvcnRfb3Blcl9pZCBzdWI7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gKGJjbW9sdF9ncG9uX2dlbV9wb3J0X29wZXJfaWQpIGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1YikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0dFTV9QT1JUX09QRVJfSURfU0VUX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2dlbV9wb3J0X29wZXJfc2V0X3N0YXRlX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9JV0Y6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25faXdmX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2l3Zl9jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2l3Zl9jZmdfY2xlYXIoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVF9NVUxUSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2l3Zl9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2l3Zl9zdGF0X2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25faXdmX3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25faXdmX3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2dwb25faXdmX29wZXJfaWQgc3ViOworICAgICAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiA9IChiY21vbHRfZ3Bvbl9pd2Zfb3Blcl9pZCkgY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX09QRVJfSURfRkxVU0hfTUFDX1RBQkxFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2l3Zl9vcGVyX2ZsdXNoX21hY190YWJsZV9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9PUEVSX0lEX1NDQU5fTUFDX1RBQkxFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2l3Zl9vcGVyX3NjYW5fbWFjX3RhYmxlX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1c6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfY2xlYXIoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVF9NVUxUSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1c6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0NMRUFSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfY2xlYXIoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVF9NVUxUSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfTUFDX1RBQkxFOgorICAgICAgICAgICAgc3dpdGNoIChncm91cF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25faXdmX21hY190YWJsZV9jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2NsZWFyKGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVRfTVVMVEk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9VU19GTE9XOgorICAgICAgICAgICAgc3dpdGNoIChncm91cF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2l3Zl91c19mbG93X2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX2l3Zl91c19mbG93X2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0NMRUFSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25faXdmX3VzX2Zsb3dfY2ZnX2NsZWFyKGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVRfTVVMVEk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX05JOgorICAgICAgICAgICAgc3dpdGNoIChncm91cF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX25pX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fbmlfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX25pX2NmZ19jbGVhcihkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fbmlfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9uaV9zdGF0X2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fbmlfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9uaV9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fbmlfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9uaV9hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZ3Bvbl9uaV9vcGVyX2lkIHN1YjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSAoYmNtb2x0X2dwb25fbmlfb3Blcl9pZCkgY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9TRVRfUE9OX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX25pX29wZXJfc2V0X3Bvbl9zdGF0ZV9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX09QRVJfSURfUkVTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fbmlfb3Blcl9yZXNldF9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX09QRVJfSURfRElTQUJMRV9TRVJJQUxfTlVNQkVSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX25pX29wZXJfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9TSU5HTEVfUkVRVUVTVF9TVEFOREJZX1BPTl9NT05JVE9SSU5HOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX25pX29wZXJfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZ19zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX09QRVJfSURfU0VUX09OVV9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9uaV9vcGVyX3NldF9vbnVfc3RhdGVfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1JPR1VFX0RFVEVDVElPTl9XSU5ET1c6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fbmlfb3Blcl9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9UT0RfUkVRVUVTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9uaV9vcGVyX3RvZF9yZXF1ZXN0X3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9QUk9URUNUSU9OX1NXSVRDSElOR19UWVBFX0NfU0VUX01VTFRJUExFX09OVV9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9uaV9vcGVyX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1NUQVJUX09OVV9VUEdSQURFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX25pX29wZXJfc3RhcnRfb251X3VwZ3JhZGVfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1BST1hZOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZ3Bvbl9uaV9wcm94eV9pZCBzdWI7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gKGJjbW9sdF9ncG9uX25pX3Byb3h5X2lkKSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9QUk9YWV9JRF9DUFVfUEFDS0VUUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9uaV9wcm94eV9jcHVfcGFja2V0c19zZW5kKGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX1BST1hZX0lEX0JST0FEQ0FTVF9QTE9BTV9QQUNLRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fbmlfcHJveHlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9zZW5kKGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX09OVToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9vbnVfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9vbnVfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX29udV9jZmdfY2xlYXIoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVF9NVUxUSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX29udV9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX29udV9zdGF0X2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fb251X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fb251X3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9vbnVfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9vbnVfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2dwb25fb251X29wZXJfaWQgc3ViOworICAgICAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiA9IChiY21vbHRfZ3Bvbl9vbnVfb3Blcl9pZCkgY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX09QRVJfSURfU0VUX09OVV9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9vbnVfb3Blcl9zZXRfb251X3N0YXRlX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX09QRVJfSURfUlNTSV9NRUFTVVJFTUVOVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9vbnVfb3Blcl9yc3NpX21lYXN1cmVtZW50X3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX09QRVJfSURfQ0hBTkdFX1BPV0VSX0xFVkVMOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX29udV9vcGVyX2NoYW5nZV9wb3dlcl9sZXZlbF9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1BST1hZOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZ3Bvbl9vbnVfcHJveHlfaWQgc3ViOworICAgICAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiA9IChiY21vbHRfZ3Bvbl9vbnVfcHJveHlfaWQpIGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1YikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9QUk9YWV9JRF9DUFVfUEFDS0VUUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfZ3Bvbl9vbnVfcHJveHlfY3B1X3BhY2tldHNfc2VuZChkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfUFJPWFlfSURfUExPQU1fUEFDS0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX29udV9wcm94eV9wbG9hbV9wYWNrZXRfc2VuZChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9UUlg6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2dwb25fdHJ4X2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX3RyeF9jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX3RyeF9jZmdfY2xlYXIoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVF9NVUxUSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ncG9uX3RyeF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9MT0dfRU5UUlk6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2xvZ19lbnRyeV9jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfbG9nX2VudHJ5X2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0NMRUFSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2xvZ19lbnRyeV9jZmdfY2xlYXIoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVF9NVUxUSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9sb2dfZW50cnlfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfbG9nX2VudHJ5X3N0YXRfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfbG9nX2VudHJ5X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2xvZ19lbnRyeV9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2xvZ19lbnRyeV9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9sb2dfZW50cnlfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfTE9HR0VSOgorICAgICAgICAgICAgc3dpdGNoIChncm91cF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9sb2dnZXJfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2xvZ2dlcl9jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9sb2dnZXJfY2ZnX2NsZWFyKGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVRfTVVMVEk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfbG9nZ2VyX2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2xvZ2dlcl9zdGF0X2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX2xvZ2dlcl9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9sb2dnZXJfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9sb2dnZXJfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfbG9nZ2VyX2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9sb2dnZXJfb3Blcl9pZCBzdWI7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gKGJjbW9sdF9sb2dnZXJfb3Blcl9pZCkgY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0xPR0dFUl9PUEVSX0lEX0NMRUFSX0xPRzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfbG9nZ2VyX29wZXJfY2xlYXJfbG9nX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfTk5JOgorICAgICAgICAgICAgc3dpdGNoIChncm91cF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ubmlfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX25uaV9jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ubmlfY2ZnX2NsZWFyKGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVRfTVVMVEk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfbm5pX2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX25uaV9zdGF0X2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX25uaV9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ubmlfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ubmlfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfbm5pX2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX05OSV9TRVJERVM6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX25uaV9zZXJkZXNfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX25uaV9zZXJkZXNfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfbm5pX3NlcmRlc19jZmdfY2xlYXIoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVF9NVUxUSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9ubmlfc2VyZGVzX2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1NPRlRXQVJFX0VSUk9SOgorICAgICAgICAgICAgc3dpdGNoIChncm91cF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV9zb2Z0d2FyZV9lcnJvcl9jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfc29mdHdhcmVfZXJyb3JfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfc29mdHdhcmVfZXJyb3JfY2ZnX2NsZWFyKGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVRfTVVMVEk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfc29mdHdhcmVfZXJyb3JfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfVFJYX0NBTElCUkFUSU9OOgorICAgICAgICAgICAgc3dpdGNoIChncm91cF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9vcGVyX2lkIHN1YjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSAoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9vcGVyX2lkKSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX09QRVJfSURfU1RBUlRfQ0FQVFVSRV9XSU5ET1c6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3RyeF9jYWxpYnJhdGlvbl9vcGVyX3N0YXJ0X2NhcHR1cmVfd2luZG93X3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9PUEVSX0lEX1NUT1BfQ0FQVFVSRV9XSU5ET1c6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3RyeF9jYWxpYnJhdGlvbl9vcGVyX3N0b3BfY2FwdHVyZV93aW5kb3dfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fYWxsb2NfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX2FsbG9jX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0NMRUFSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX2FsbG9jX2NmZ19jbGVhcihkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX2FsbG9jX2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX2FsbG9jX3N0YXRfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fYWxsb2Nfc3RhdF9jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fYWxsb2Nfc3RhdF9jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9hbGxvY19hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9hbGxvY19hdXRvX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfeGdwb25fYWxsb2Nfb3Blcl9pZCBzdWI7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gKGJjbW9sdF94Z3Bvbl9hbGxvY19vcGVyX2lkKSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fQUxMT0NfT1BFUl9JRF9HRVRfU1RBVFM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX2FsbG9jX29wZXJfZ2V0X3N0YXRzX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX0FMTE9DX09QRVJfSURfU0VUX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9hbGxvY19vcGVyX3NldF9zdGF0ZV9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1hHUE9OX0dFTV9QT1JUOgorICAgICAgICAgICAgc3dpdGNoIChncm91cF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9nZW1fcG9ydF9jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fZ2VtX3BvcnRfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fZ2VtX3BvcnRfY2ZnX2NsZWFyKGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVRfTVVMVEk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fZ2VtX3BvcnRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fZ2VtX3BvcnRfc3RhdF9nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobXNnX3R5cGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1hHUE9OX0lXRjoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25faXdmX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9pd2ZfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25faXdmX2NmZ19jbGVhcihkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX2l3Zl9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9YR1BPTl9OSToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fbmlfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fbmlfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9DTEVBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9uaV9jZmdfY2xlYXIoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVF9NVUxUSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9uaV9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9uaV9zdGF0X2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX25pX3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX25pX3N0YXRfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fbmlfYXV0b19jZmdfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fbmlfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X3hncG9uX25pX29wZXJfaWQgc3ViOworICAgICAgICAgICAgICAgICAgICAgICAgY2xpX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGlfcGFybSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiA9IChiY21vbHRfeGdwb25fbmlfb3Blcl9pZCkgY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfU0VUX1BPTl9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fbmlfb3Blcl9zZXRfcG9uX3N0YXRlX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfUkVTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX25pX29wZXJfcmVzZXRfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9ESVNBQkxFX1NFUklBTF9OVU1CRVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX25pX29wZXJfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfU0lOR0xFX1JFUVVFU1RfU1RBTkRCWV9QT05fTU9OSVRPUklORzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fbmlfb3Blcl9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfU0VUX09OVV9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fbmlfb3Blcl9zZXRfb251X3N0YXRlX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfUlVOX1NQRUNJQUxfQldfTUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9uaV9vcGVyX3J1bl9zcGVjaWFsX2J3X21hcF9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1JPR1VFX0RFVEVDVElPTl9XSU5ET1c6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX25pX29wZXJfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1RPRF9SRVFVRVNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9uaV9vcGVyX3RvZF9yZXF1ZXN0X3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfU1RBUlRfT05VX1VQR1JBREU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX25pX29wZXJfc3RhcnRfb251X3VwZ3JhZGVfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX0FESlVTVF9UWF9XQVZFTEVOR1RIOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9uaV9vcGVyX2FkanVzdF90eF93YXZlbGVuZ3RoX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFk6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF94Z3Bvbl9uaV9wcm94eV9pZCBzdWI7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gKGJjbW9sdF94Z3Bvbl9uaV9wcm94eV9pZCkgY2xpX3Bhcm0tPnZhbHVlLm51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljbGlfcHJpbnRfY29tcGxldGUoc2Vzc2lvbiwgQkNNX0VSUl9QQVJNLCAic3ViIGlzIG5vdCBzZXRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1BST1hZX0lEX0NQVV9QQUNLRVRTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9uaV9wcm94eV9jcHVfcGFja2V0c19zZW5kKGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9QUk9YWV9JRF9CUk9BRENBU1RfUExPQU1fUEFDS0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9uaV9wcm94eV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X3NlbmQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1hHUE9OX09OVToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fb251X2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX29udV9jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0NMRUFSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX29udV9jZmdfY2xlYXIoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVF9NVUxUSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9vbnVfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fb251X3N0YXRfZ2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fb251X3N0YXRfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX29udV9zdGF0X2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX29udV9hdXRvX2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9vbnVfYXV0b19jZmdfc2V0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X3hncG9uX29udV9vcGVyX2lkIHN1YjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaV9wYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3ViIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpX3Bhcm0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSAoYmNtb2x0X3hncG9uX29udV9vcGVyX2lkKSBjbGlfcGFybS0+dmFsdWUubnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaWNsaV9wcmludF9jb21wbGV0ZShzZXNzaW9uLCBCQ01fRVJSX1BBUk0sICJzdWIgaXMgbm90IHNldFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfU0VUX09OVV9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fb251X29wZXJfc2V0X29udV9zdGF0ZV9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9SU1NJX01FQVNVUkVNRU5UOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9vbnVfb3Blcl9yc3NpX21lYXN1cmVtZW50X3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX1JFUVVFU1RfUkVHSVNUUkFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9vbnVfb3Blcl9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9DSEFOR0VfUE9XRVJfTEVWRUxMSU5HOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9vbnVfb3Blcl9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX0dFVF9QT1dFUl9MRVZFTDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fb251X29wZXJfZ2V0X3Bvd2VyX2xldmVsX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX0dFVF9QT1dFUl9DT05TVU1QVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fb251X29wZXJfZ2V0X3Bvd2VyX2NvbnN1bXB0aW9uX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX0FESlVTVF9UWF9XQVZFTEVOR1RIOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9vbnVfb3Blcl9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9vbnVfb3Blcl9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX3N1Ym1pdChkZXZpY2VfaWQsIHNlc3Npb24sIGJ5dGVfcG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfT05VX1RVTklOR19JTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fb251X29wZXJfb251X3R1bmluZ19pbl9zdWJtaXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9PTlVfVFVOSU5HX09VVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fb251X29wZXJfb251X3R1bmluZ19vdXRfc3VibWl0KGRldmljZV9pZCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9QUk9YWToKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X3hncG9uX29udV9wcm94eV9pZCBzdWI7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGlfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN1YiIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaV9wYXJtICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gKGJjbW9sdF94Z3Bvbl9vbnVfcHJveHlfaWQpIGNsaV9wYXJtLT52YWx1ZS5udW1iZXI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY2xpX3ByaW50X2NvbXBsZXRlKHNlc3Npb24sIEJDTV9FUlJfUEFSTSwgInN1YiBpcyBub3Qgc2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1YikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfUFJPWFlfSURfUExPQU1fUEFDS0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl9vbnVfcHJveHlfcGxvYW1fcGFja2V0X3NlbmQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfUFJPWFlfSURfQ1BVX1BBQ0tFVFM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX29udV9wcm94eV9jcHVfcGFja2V0c19zZW5kKGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWDoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fdHJ4X2NmZ19nZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmNtb2x0X2NsaV94Z3Bvbl90cnhfY2ZnX3NldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeGdwb25fdHJ4X2NmZ19jbGVhcihkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hncG9uX3RyeF9jZmdfZ2V0X211bHRpKGRldmljZV9pZCwgc2Vzc2lvbiwgYnl0ZV9wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9YUE9OX1NFUkRFUzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJjbW9sdF9jbGlfeHBvbl9zZXJkZXNfY2ZnX2dldChkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hwb25fc2VyZGVzX2NmZ19zZXQoZGV2aWNlX2lkLCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0NMRUFSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hwb25fc2VyZGVzX2NmZ19jbGVhcihkZXZpY2VfaWQsIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiY21vbHRfY2xpX3hwb25fc2VyZGVzX2NmZ19nZXRfbXVsdGkoZGV2aWNlX2lkLCBzZXNzaW9uLCBieXRlX3Bvb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KK30KKworLyogUGVyZm9ybSBhbiBBUEkgY2FsbCBiYXNlZCBvbiBDTEkgaW5wdXQgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9jbGlfYXBpX2NhbGwoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtb2x0X21ndF9ncm91cCBncm91cF90eXBlLCBiY21vbHRfbXNnX3R5cGUgbXNnX3R5cGUsIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBhcGljbGlfYnl0ZV9wb29sIGJ5dGVfcG9vbDsKKyAgICAodm9pZClhcGljbGlfdW51bWJlcl90b19pcHY0OworCisgICAgLyogc2V0dXAgbWVtb3J5IHBvb2wgZm9yIGR5bmFtaWNhbGx5LXNpemVkIGxpc3QgbWVtb3J5IGFsbG9jYXRpb24gKi8KKyAgICBlcnIgPSBhcGljbGlfYnl0ZV9wb29sX2NyZWF0ZSgmYnl0ZV9wb29sKTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIC8qIGNhbGwgdGhlIHJvb3QgQVBJIGhhbmRsZXIgKi8KKyAgICBlcnIgPSBiY21vbHRfY2xpX2FwaV9yb290KGRldmljZV9pZCwgZ3JvdXBfdHlwZSwgbXNnX3R5cGUsIHNlc3Npb24sICZieXRlX3Bvb2wpOworCisgICAgLyogZnJlZSBhbGwgZHluYW1pY2FsbHkgYWxsb2NhdGVkIG1lbW9yeSAqLworICAgIGFwaWNsaV9ieXRlX3Bvb2xfZGVzdHJveSgmYnl0ZV9wb29sKTsKKworICAgIHJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvYXBpX2NsaS9iY21fYXBpX2NsaV9oYW5kbGVycy5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2FwaV9jbGkvYmNtX2FwaV9jbGlfaGFuZGxlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGE1ZTU4Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2FwaV9jbGkvYmNtX2FwaV9jbGlfaGFuZGxlcnMuaApAQCAtMCwwICsxLDQ4IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyovCisKKyNpZm5kZWYgTUFQTEVfQ0xJX0hBTkRMRVJTX0hfCisjZGVmaW5lIE1BUExFX0NMSV9IQU5ETEVSU19IXworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtb2x0X2FwaS5oPgorI2luY2x1ZGUgPGJjbWNsaS5oPgorI2luY2x1ZGUgPGJjbW9sdF9tb2RlbF90eXBlcy5oPgorCisvKiB0aGUgbWF4aW11bSBhbW91bnQgb2YgbWVtb3J5IHRoYXQgY291bGQgcG9zc2libHkgYnkgdXNlZCBieSBhbGwgdmFyaWFibGUtc2l6ZWQgbGlzdHMgd2l0aGluIGEgR0VUIHJlcXVlc3QgKi8KKyNkZWZpbmUgQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSAoMzIgKiAxMDI0KQorCisvKiBQZXJmb3JtIGFuIEFQSSBjYWxsIGJhc2VkIG9uIENMSSBpbnB1dCAqLworYmNtb3NfZXJybm8gYmNtb2x0X2NsaV9hcGlfY2FsbCgKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgIGJjbW9sdF9tZ3RfZ3JvdXAgZ3JvdXBfdHlwZSwKKyAgICBiY21vbHRfbXNnX3R5cGUgbXNnX3R5cGUsCisgICAgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfY2xpL2JjbV9hcGlfY2xpX2hlbHBlcnMuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfY2xpL2JjbV9hcGlfY2xpX2hlbHBlcnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjc3YWVjCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2FwaV9jbGkvYmNtX2FwaV9jbGlfaGVscGVycy5jCkBAIC0wLDAgKzEsMjQ3MzQgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6cHJvcHJpZXRhcnk6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitUaGlzIHByb2dyYW0gaXMgdGhlIHByb3ByaWV0YXJ5IHNvZnR3YXJlIG9mIEJyb2FkY29tIENvcnBvcmF0aW9uIGFuZC9vciBpdHMKK2xpY2Vuc29ycywgYW5kIG1heSBvbmx5IGJlIHVzZWQsIGR1cGxpY2F0ZWQsIG1vZGlmaWVkIG9yIGRpc3RyaWJ1dGVkIHB1cnN1YW50Cit0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgYSBzZXBhcmF0ZSwgd3JpdHRlbiBsaWNlbnNlIGFncmVlbWVudCBleGVjdXRlZAorYmV0d2VlbiB5b3UgYW5kIEJyb2FkY29tIChhbiAiQXV0aG9yaXplZCBMaWNlbnNlIikuICBFeGNlcHQgYXMgc2V0IGZvcnRoIGluCithbiBBdXRob3JpemVkIExpY2Vuc2UsIEJyb2FkY29tIGdyYW50cyBubyBsaWNlbnNlIChleHByZXNzIG9yIGltcGxpZWQpLCByaWdodAordG8gdXNlLCBvciB3YWl2ZXIgb2YgYW55IGtpbmQgd2l0aCByZXNwZWN0IHRvIHRoZSBTb2Z0d2FyZSwgYW5kIEJyb2FkY29tCitleHByZXNzbHkgcmVzZXJ2ZXMgYWxsIHJpZ2h0cyBpbiBhbmQgdG8gdGhlIFNvZnR3YXJlIGFuZCBhbGwgaW50ZWxsZWN0dWFsCitwcm9wZXJ0eSByaWdodHMgdGhlcmVpbi4gIElGIFlPVSBIQVZFIE5PIEFVVEhPUklaRUQgTElDRU5TRSwgVEhFTiBZT1UgSEFWRQorTk8gUklHSFQgVE8gVVNFIFRISVMgU09GVFdBUkUgSU4gQU5ZIFdBWSwgQU5EIFNIT1VMRCBJTU1FRElBVEVMWSBOT1RJRlkKK0JST0FEQ09NIEFORCBESVNDT05USU5VRSBBTEwgVVNFIE9GIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGV4cHJlc3NseSBzZXQgZm9ydGggaW4gdGhlIEF1dGhvcml6ZWQgTGljZW5zZSwKKworMS4gVGhpcyBwcm9ncmFtLCBpbmNsdWRpbmcgaXRzIHN0cnVjdHVyZSwgc2VxdWVuY2UgYW5kIG9yZ2FuaXphdGlvbiwKKyAgICBjb25zdGl0dXRlcyB0aGUgdmFsdWFibGUgdHJhZGUgc2VjcmV0cyBvZiBCcm9hZGNvbSwgYW5kIHlvdSBzaGFsbCB1c2UKKyAgICBhbGwgcmVhc29uYWJsZSBlZmZvcnRzIHRvIHByb3RlY3QgdGhlIGNvbmZpZGVudGlhbGl0eSB0aGVyZW9mLCBhbmQgdG8KKyAgICB1c2UgdGhpcyBpbmZvcm1hdGlvbiBvbmx5IGluIGNvbm5lY3Rpb24gd2l0aCB5b3VyIHVzZSBvZiBCcm9hZGNvbQorICAgIGludGVncmF0ZWQgY2lyY3VpdCBwcm9kdWN0cy4KKworMi4gVE8gVEhFIE1BWElNVU0gRVhURU5UIFBFUk1JVFRFRCBCWSBMQVcsIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiCisgICAgQU5EIFdJVEggQUxMIEZBVUxUUyBBTkQgQlJPQURDT00gTUFLRVMgTk8gUFJPTUlTRVMsIFJFUFJFU0VOVEFUSU9OUyBPUgorICAgIFdBUlJBTlRJRVMsIEVJVEhFUiBFWFBSRVNTLCBJTVBMSUVELCBTVEFUVVRPUlksIE9SIE9USEVSV0lTRSwgV0lUSAorICAgIFJFU1BFQ1QgVE8gVEhFIFNPRlRXQVJFLiAgQlJPQURDT00gU1BFQ0lGSUNBTExZIERJU0NMQUlNUyBBTlkgQU5ECisgICAgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBUSVRMRSwgTUVSQ0hBTlRBQklMSVRZLCBOT05JTkZSSU5HRU1FTlQsCisgICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIExBQ0sgT0YgVklSVVNFUywgQUNDVVJBQ1kgT1IKKyAgICBDT01QTEVURU5FU1MsIFFVSUVUIEVOSk9ZTUVOVCwgUVVJRVQgUE9TU0VTU0lPTiBPUiBDT1JSRVNQT05ERU5DRQorICAgIFRPIERFU0NSSVBUSU9OLiBZT1UgQVNTVU1FIFRIRSBFTlRJUkUgUklTSyBBUklTSU5HIE9VVCBPRiBVU0UgT1IKKyAgICBQRVJGT1JNQU5DRSBPRiBUSEUgU09GVFdBUkUuCisKKzMuIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBJTiBOTyBFVkVOVCBTSEFMTCBCUk9BRENPTSBPUgorICAgIElUUyBMSUNFTlNPUlMgQkUgTElBQkxFIEZPUiAoaSkgQ09OU0VRVUVOVElBTCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAgICBJTkRJUkVDVCwgT1IgRVhFTVBMQVJZIERBTUFHRVMgV0hBVFNPRVZFUiBBUklTSU5HIE9VVCBPRiBPUiBJTiBBTlkKKyAgICBXQVkgUkVMQVRJTkcgVE8gWU9VUiBVU0UgT0YgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgU09GVFdBUkUgRVZFTgorICAgIElGIEJST0FEQ09NIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUzsKKyAgICBPUiAoaWkpIEFOWSBBTU9VTlQgSU4gRVhDRVNTIE9GIFRIRSBBTU9VTlQgQUNUVUFMTFkgUEFJRCBGT1IgVEhFCisgICAgU09GVFdBUkUgSVRTRUxGIE9SIFUuUy4gJDEsIFdISUNIRVZFUiBJUyBHUkVBVEVSLiBUSEVTRSBMSU1JVEFUSU9OUworICAgIFNIQUxMIEFQUExZIE5PVFdJVEhTVEFORElORyBBTlkgRkFJTFVSRSBPRiBFU1NFTlRJQUwgUFVSUE9TRSBPRiBBTlkKKyAgICBMSU1JVEVEIFJFTUVEWS4KKzo+CisqLworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbWNsaS5oPgorI2luY2x1ZGUgPGJjbW9sdF9tb2RlbF90eXBlcy5oPgorCisjaW5jbHVkZSAiYmNtX2FwaV9jbGlfaGVscGVycy5oIgorCisvKiBhbGxvdyBwb3NzaWJseSB1bnVzZWQgZGVzY3JpcHRvcnMgdG8gbWFrZSB0aGUgY29kZSBlYXNpZXIgdG8gZ2VuZXJhdGUgKi8KKyNpZmRlZiBfX0dOVUNfXworI2RlZmluZSBCQ01fREVTQ1IgICBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKQorI2Vsc2UKKyNkZWZpbmUgQkNNX0RFU0NSCisjZW5kaWYKKworLyogVW5sZXNzIHNwZWNpZmllZCBpbiB0aGUgWE1MIG1vZGVsLCBkeW5hbWljIGFycmF5cyB3aWxsIGhhdmUgdGhpcyBtYXggc2l6ZSAoaW4gYnl0ZXMsIHdpbGwgZGl2aWRlIGJ5IGVsZW1lbnQgc2l6ZSkgKi8KKyNkZWZpbmUgREVGQVVMVF9EWU5fQVJSX01BWF9TSVpFICAgIDIwNDgKKworLyogPT09PSBCYXNlIFR5cGUgRGVzY3JpcHRvcnMgPT09PSAqLworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX3VpbnQ4X3QgPSB7IC5uYW1lID0gInVpbnQ4X3QiLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9VTlVNLCAuc2l6ZSA9IHNpemVvZih1aW50OF90KSB9OworCitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfdWludDE2X3QgPSB7IC5uYW1lID0gInVpbnQxNl90IiwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfVU5VTSwgLnNpemUgPSBzaXplb2YodWludDE2X3QpIH07CisKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl91aW50MzJfdCA9IHsgLm5hbWUgPSAidWludDMyX3QiLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9VTlVNLCAuc2l6ZSA9IHNpemVvZih1aW50MzJfdCkgfTsKKworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX3VpbnQ2NF90ID0geyAubmFtZSA9ICJ1aW50NjRfdCIsIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1VOVU0sIC5zaXplID0gc2l6ZW9mKHVpbnQ2NF90KSB9OworCitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfdWludDhfdF9oZXggPSB7IC5uYW1lID0gInVpbnQ4X3QiLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9VTlVNX0hFWCwgLnNpemUgPSBzaXplb2YodWludDhfdCkgfTsKKworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX3VpbnQxNl90X2hleCA9IHsgLm5hbWUgPSAidWludDE2X3QiLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9VTlVNX0hFWCwgLnNpemUgPSBzaXplb2YodWludDE2X3QpIH07CisKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl91aW50MzJfdF9oZXggPSB7IC5uYW1lID0gInVpbnQzMl90IiwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfVU5VTV9IRVgsIC5zaXplID0gc2l6ZW9mKHVpbnQzMl90KSB9OworCitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfdWludDY0X3RfaGV4ID0geyAubmFtZSA9ICJ1aW50NjRfdCIsIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1VOVU1fSEVYLCAuc2l6ZSA9IHNpemVvZih1aW50NjRfdCkgfTsKKworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2ludDhfdCA9IHsgLm5hbWUgPSAiaW50OF90IiwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU05VTSwgLnNpemUgPSBzaXplb2YoaW50OF90KSB9OworCitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfaW50MTZfdCA9IHsgLm5hbWUgPSAiaW50MTZfdCIsIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NOVU0sIC5zaXplID0gc2l6ZW9mKGludDE2X3QpIH07CisKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9pbnQzMl90ID0geyAubmFtZSA9ICJpbnQzMl90IiwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU05VTSwgLnNpemUgPSBzaXplb2YoaW50MzJfdCkgfTsKKworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2ludDY0X3QgPSB7IC5uYW1lID0gImludDY0X3QiLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TTlVNLCAuc2l6ZSA9IHNpemVvZihpbnQ2NF90KSB9OworCitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfZmxvYXQgPSB7IC5uYW1lID0gImZsb2F0IiwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRkxPQVQsIC5zaXplID0gc2l6ZW9mKGZsb2F0KSB9OworCitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfZG91YmxlID0geyAubmFtZSA9ICJkb3VibGUiLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9GTE9BVCwgLnNpemUgPSBzaXplb2YoZG91YmxlKSB9OworCitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb3NfbWFjX2FkZHJlc3MgPSB7IC5uYW1lID0gImJjbW9zX21hY19hZGRyZXNzIiwgLmRlc2NyID0gIk1BQyBhZGRyZXNzIiwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfTUFDLCAuc2l6ZSA9IHNpemVvZihiY21vc19tYWNfYWRkcmVzcykgfTsKKworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9zX2lwdjRfYWRkcmVzcyA9IHsgLm5hbWUgPSAiYmNtb3NfaXB2NF9hZGRyZXNzIiwgLmRlc2NyID0gIklQdjQgYWRkcmVzcyIsIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0lQVjQsIC5zaXplID0gc2l6ZW9mKGJjbW9zX2lwdjRfYWRkcmVzcykgfTsKKworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgPSB7IC5uYW1lID0gImJjbW9zX2Jvb2wiLCAuZGVzY3IgPSAiQm9vbGVhbiIsIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0JPT0wsIC5zaXplID0gc2l6ZW9mKGJjbW9zX2Jvb2wpIH07CisKKy8qID09PT0gT2JqZWN0IFR5cGUgSW5mb3JtYXRpb24gPT09PSAqLworc3RhdGljIGNoYXIgKm9iamVjdF9uYW1lW10gPSB7ICJhZV9uaSIsICJhZV9wYXRoX2RzIiwgImFlX3BhdGhfdXMiLCAiY2hhbm5lbCIsICJkZWJ1ZyIsICJkZXZpY2UiLCAiZXBvbl9kZW5pZWRfbGluayIsICJlcG9uX2xpbmsiLCAiZXBvbl9uaSIsICJlcG9uX29udV8xMGdfdXMiLCAiZXBvbl9vbnVfMWdfdXMiLCAiZXBvbl9wYXRoXzEwZ19kcyIsICJlcG9uX3BhdGhfMTBnX3VzIiwgImVwb25fcGF0aF8xZ19kcyIsICJlcG9uX3BhdGhfMWdfdXMiLCAiZXBvbl9ycCIsICJncGlvIiwgImdwb25fYWxsb2MiLCAiZ3Bvbl9nZW1fcG9ydCIsICJncG9uX2l3ZiIsICJncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvdyIsICJncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3ciLCAiZ3Bvbl9pd2ZfbWFjX3RhYmxlIiwgImdwb25faXdmX3VzX2Zsb3ciLCAiZ3Bvbl9uaSIsICJncG9uX29udSIsICJncG9uX3RyeCIsICJsb2dfZW50cnkiLCAibG9nZ2VyIiwgIm5uaSIsICJubmlfc2VyZGVzIiwgInNvZnR3YXJlX2Vycm9yIiwgInRyeF9jYWxpYnJhdGlvbiIsICJ4Z3Bvbl9hbGxvYyIsICJ4Z3Bvbl9nZW1fcG9ydCIsICJ4Z3Bvbl9pd2YiLCAieGdwb25fbmkiLCAieGdwb25fb251IiwgInhncG9uX3RyeCIsICJ4cG9uX3NlcmRlcyIgfTsKK3N0YXRpYyBjaGFyICpvYmplY3RfZGVzY3JbXSA9IHsgIkFFIE5ldHdvcmsgSW50ZXJmYWNlLiIsICJBRSBkb3duc3RyZWFtIGRhdGEgcGF0aC4iLCAiQUUgdXBzdHJlYW0gZGF0YSBwYXRoLiIsICJDaGFubmVsIiwgIkRlYnVnIEZlYXR1cmVzIiwgIlNpbmdsZXRvbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBkZXZpY2UgYXMgYSB3aG9sZS4iLCAiVW5pY2FzdCBFUE9OIGxpbmsgdGhhdCBoYXMgYmVlbiBkZW5pZWQgcmVnaXN0cmF0aW9uIGZvciBzb21lIHJlYXNvbi4gVG8gYmUgYW4gb2JqZWN0IG9mIHRoaXMgdHlwZSB5b3UgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBhY3RpdmUgYWxhcm0gcG9zdGVkIGFnYWluc3QgeW91LiIsICJVbmljYXN0IEVQT04gbGluayIsICJFUE9OIE5ldHdvcmsgSW50ZXJmYWNlLiIsICJFUE9OIE9OVSAxMEcgVVMiLCAiRVBPTiBPTlUgaW50ZXJmYWNlIG9mIG9uZSBvciBtb3JlIEVQT04gbGlua3MuIiwgIkVQT04gMTBHIGRvd25zdHJlYW0gZGF0YSBwYXRoLiIsICJFUE9OIDEwRyB1cHN0cmVhbSBkYXRhIHBhdGguIiwgIkVQT04gMUcgZG93bnN0cmVhbSBkYXRhIHBhdGguIiwgIkVQT04gMUcgdXBzdHJlYW0gZGF0YSBwYXRoLiIsICIxMC8xMCwgMTAvMSBvciAxLzEgRFMvVVMgcGFpciBvZiBFUE9OIFBhdGhzIiwgIkdQSU8gY29udHJvbCIsICJHUE9OIEFsbG9jIiwgIkdQT04gR0VNIFBvcnQiLCAiR1BPTiBJV0YiLCAiR1BPTiBJV0YgRFMgZWdyZXNzIGZsb3ciLCAiR1BPTiBJV0YgRFMgaW5ncmVzcyBmbG93IiwgIkdQT04gSVdGIE1BQyB0YWJsZSIsICJHUE9OIElXRiBVUyBmbG93IiwgIkdQT04gbmV0d29yayBpbnRlcmZhY2UiLCAiR1BPTiBPTlUiLCAiR1BPTiBUUlgiLCAibG9nIGVudHJ5IiwgImxvZ2dlciIsICJVc2UgZm9yIGxvb3BiYWNrcyIsICJOTkkgU0VSREVTIHBhcmFtZXRlcnMuIiwgIlNvZnR3YXJlIEVycm9yIiwgIlRSWCBDYWxpYnJhdGlvbiIsICJYR1BPTiBBbGxvYyIsICJYR1BPTiBHRU0gcG9ydCIsICJYR1BPTiBJV0YiLCAiWEdQT04gbmV0d29yayBpbnRlcmZhY2UiLCAiWEdQT04gT05VIiwgIlhHUE9OIFRSWCIsICJQT04gU0VSREVTIHBhcmFtZXRlcnMuIiB9OworCisvKiA9PT09IFN1cHBvcnRpbmcgVHlwZXMgPT09PSAqLworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hY3RpdmF0aW9uX2ZhaWxfcmVhc29uX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm5vbmUiLCAudmFsID0gQkNNT0xUX0FDVElWQVRJT05fRkFJTF9SRUFTT05fTk9ORSB9LCB7IC5uYW1lID0gInJhbmdpbmciLCAudmFsID0gQkNNT0xUX0FDVElWQVRJT05fRkFJTF9SRUFTT05fUkFOR0lORyB9LCB7IC5uYW1lID0gInBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uIiwgLnZhbCA9IEJDTU9MVF9BQ1RJVkFUSU9OX0ZBSUxfUkVBU09OX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OIH0sIHsgLm5hbWUgPSAibG9zIiwgLnZhbCA9IEJDTU9MVF9BQ1RJVkFUSU9OX0ZBSUxfUkVBU09OX0xPUyB9LCB7IC5uYW1lID0gIm9udV9hbGFybSIsIC52YWwgPSBCQ01PTFRfQUNUSVZBVElPTl9GQUlMX1JFQVNPTl9PTlVfQUxBUk0gfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hY3RpdmF0aW9uX2ZhaWxfcmVhc29uID0geyAubmFtZSA9ICJiY21vbHRfYWN0aXZhdGlvbl9mYWlsX3JlYXNvbiIsIC5kZXNjciA9ICJhY3RpdmF0aW9uIGZhaWwgcmVhc29uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FjdGl2YXRpb25fZmFpbF9yZWFzb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfYWN0aXZhdGlvbl9mYWlsX3JlYXNvbl9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWN0dWFsX3NjaGVkdWxlcnNoYXBlcl9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhY3R1YWxfbWJzX3RxIiwgLmRlc2NyID0gIkFjdHVhbCBNQlMgKFRRKSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWN0dWFsX3NjaGVkdWxlcnNoYXBlciwgYWN0dWFsX21ic190cSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJhY3R1YWxfd2VpZ2h0X3RxIiwgLmRlc2NyID0gIkFjdHVhbCBXZWlnaHQgKFRRKSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWN0dWFsX3NjaGVkdWxlcnNoYXBlciwgYWN0dWFsX3dlaWdodF90cSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hY3R1YWxfc2NoZWR1bGVyc2hhcGVyID0geyAubmFtZSA9ICJiY21vbHRfYWN0dWFsX3NjaGVkdWxlcnNoYXBlciIsIC5kZXNjciA9ICJBY3R1YWwgU2NoZWR1bGVyL1NoYXBlciIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hY3R1YWxfc2NoZWR1bGVyc2hhcGVyKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2FjdHVhbF9zY2hlZHVsZXJzaGFwZXJfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfYWN0dWFsX3NjaGVkdWxlcnNoYXBlcl9maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2FkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHlfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibm9uZSIsIC52YWwgPSBCQ01PTFRfQURESVRJT05BTF9CV19FTElHSUJJTElUWV9OT05FIH0sIHsgLm5hbWUgPSAibm9uX2Fzc3VyZWQiLCAudmFsID0gQkNNT0xUX0FERElUSU9OQUxfQldfRUxJR0lCSUxJVFlfTk9OX0FTU1VSRUQgfSwgeyAubmFtZSA9ICJiZXN0X2VmZm9ydCIsIC52YWwgPSBCQ01PTFRfQURESVRJT05BTF9CV19FTElHSUJJTElUWV9CRVNUX0VGRk9SVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHkgPSB7IC5uYW1lID0gImJjbW9sdF9hZGRpdGlvbmFsX2J3X2VsaWdpYmlsaXR5IiwgLmRlc2NyID0gIkFkZGl0aW9uYWwgQlcgZWxpZ2liaWxpdHkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYWRkaXRpb25hbF9id19lbGlnaWJpbGl0eSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9hZGRpdGlvbmFsX2J3X2VsaWdpYmlsaXR5X3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2FlX25pX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJtYWNfYWRkcmVzcyIsIC52YWwgPSBCQ01PTFRfQUVfTklfQ0ZHX0lEX01BQ19BRERSRVNTIH0sIHsgLm5hbWUgPSAiYWVfbmlfZW4iLCAudmFsID0gQkNNT0xUX0FFX05JX0NGR19JRF9BRV9OSV9FTiB9LCB7IC5uYW1lID0gIm10dV8xMGciLCAudmFsID0gQkNNT0xUX0FFX05JX0NGR19JRF9NVFVfMTBHIH0sIHsgLm5hbWUgPSAicHJic19nZW5lcmF0b3IiLCAudmFsID0gQkNNT0xUX0FFX05JX0NGR19JRF9QUkJTX0dFTkVSQVRPUiB9LCB7IC5uYW1lID0gInByYnNfY2hlY2tlciIsIC52YWwgPSBCQ01PTFRfQUVfTklfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUiB9LCB7IC5uYW1lID0gInByYnNfc3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9BRV9OSV9DRkdfSURfUFJCU19TVEFUVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9uaV9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9hZV9uaV9jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgYWVfbmlfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9uaV9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfYWVfbmlfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2FlX25pX2VuX3N0YXRlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImRpc2FibGVkIiwgLnZhbCA9IEJDTU9MVF9BRV9OSV9FTl9TVEFURV9ESVNBQkxFRCB9LCB7IC5uYW1lID0gImVuYWJsZWQiLCAudmFsID0gQkNNT0xUX0FFX05JX0VOX1NUQVRFX0VOQUJMRUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9uaV9lbl9zdGF0ZSA9IHsgLm5hbWUgPSAiYmNtb2x0X2FlX25pX2VuX3N0YXRlIiwgLmRlc2NyID0gIkVuYWJsZSBzdGF0ZSBvZiB0aGUgQUUgTkkuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FlX25pX2VuX3N0YXRlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2FlX25pX2VuX3N0YXRlX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2FlX25pX2tleV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhZV9uaSIsIC52YWwgPSBCQ01PTFRfQUVfTklfS0VZX0lEX0FFX05JIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWVfbmlfa2V5X2lkID0geyAubmFtZSA9ICJiY21vbHRfYWVfbmlfa2V5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGFlX25pX2tleSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfbmlfa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2FlX25pX2tleV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibmV3X3N0YXRlIiwgLnZhbCA9IEJDTU9MVF9BRV9OSV9TRVRfQUVfTklfRU5fU1RBVEVfSURfTkVXX1NUQVRFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2lkID0geyAubmFtZSA9ICJiY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGFlX25pX3NldF9hZV9uaV9lbl9zdGF0ZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGFlX3BhdGhfZHNfYXV0b19jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hZV9wYXRoX2RzX2tleV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhZV9uaSIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9EU19LRVlfSURfQUVfTkkgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX2RzX2tleV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2FlX3BhdGhfZHNfa2V5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGFlX3BhdGhfZHNfa2V5IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX2RzX2tleV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9hZV9wYXRoX2RzX2tleV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBhZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkID0geyAubmFtZSA9ICJiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBhZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJjZmciLCAudmFsID0gQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9DRkdfSURfQ0ZHIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgYWVfcGF0aF9kc19zdGF0X2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJieXRlcyIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0JZVEVTIH0sIHsgLm5hbWUgPSAiZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTIH0sIHsgLm5hbWUgPSAiZnJhbWVzXzY0IiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzY0IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzY1XzEyNyIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU182NV8xMjcgfSwgeyAubmFtZSA9ICJmcmFtZXNfMTI4XzI1NSIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzI1Nl81MTEiLCAudmFsID0gQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMSB9LCB7IC5uYW1lID0gImZyYW1lc181MTJfMTAyMyIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMyB9LCB7IC5uYW1lID0gImZyYW1lc18xMDI0XzE1MTgiLCAudmFsID0gQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzE1MTlfMjA0NyIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDcgfSwgeyAubmFtZSA9ICJmcmFtZXNfMjA0OF80MDk1IiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NSB9LCB7IC5uYW1lID0gImZyYW1lc180MDk2XzkyMTYiLCAudmFsID0gQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzkyMTdfMTYzODMiLCAudmFsID0gQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MyB9LCB7IC5uYW1lID0gImJyb2FkY2FzdF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTIH0sIHsgLm5hbWUgPSAiZGF0YV9ieXRlcyIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0RBVEFfQllURVMgfSwgeyAubmFtZSA9ICJtdWx0aWNhc3RfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUyB9LCB7IC5uYW1lID0gInVuaWNhc3RfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVMgfSwgeyAubmFtZSA9ICJhYm9ydF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9BQk9SVF9GUkFNRVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX2RzX3N0YXRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgYWVfcGF0aF9kc19zdGF0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgYWVfcGF0aF91c19hdXRvX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2FlX3BhdGhfdXNfa2V5X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFlX25pIiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX1VTX0tFWV9JRF9BRV9OSSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfdXNfa2V5X2lkID0geyAubmFtZSA9ICJiY21vbHRfYWVfcGF0aF91c19rZXlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgYWVfcGF0aF91c19rZXkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfdXNfa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2FlX3BhdGhfdXNfa2V5X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXQiLCAudmFsID0gQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGFlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXQiLCAudmFsID0gQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGFlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNmZyIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0NGR19JRF9DRkcgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBhZV9wYXRoX3VzX3N0YXRfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImJ5dGVzIiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfQllURVMgfSwgeyAubmFtZSA9ICJmcmFtZXMiLCAudmFsID0gQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVMgfSwgeyAubmFtZSA9ICJmcmFtZXNfNjQiLCAudmFsID0gQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfNjQgfSwgeyAubmFtZSA9ICJmcmFtZXNfNjVfMTI3IiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzY1XzEyNyB9LCB7IC5uYW1lID0gImZyYW1lc18xMjhfMjU1IiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTUgfSwgeyAubmFtZSA9ICJmcmFtZXNfMjU2XzUxMSIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExIH0sIHsgLm5hbWUgPSAiZnJhbWVzXzUxMl8xMDIzIiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzIH0sIHsgLm5hbWUgPSAiZnJhbWVzXzEwMjRfMTUxOCIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTggfSwgeyAubmFtZSA9ICJmcmFtZXNfMTUxOV8yMDQ3IiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NyB9LCB7IC5uYW1lID0gImZyYW1lc18yMDQ4XzQwOTUiLCAudmFsID0gQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzQwOTZfOTIxNiIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTYgfSwgeyAubmFtZSA9ICJmcmFtZXNfOTIxN18xNjM4MyIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzIH0sIHsgLm5hbWUgPSAiYnJvYWRjYXN0X2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVMgfSwgeyAubmFtZSA9ICJkYXRhX2J5dGVzIiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfREFUQV9CWVRFUyB9LCB7IC5uYW1lID0gIm11bHRpY2FzdF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTIH0sIHsgLm5hbWUgPSAidW5pY2FzdF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUyB9LCB7IC5uYW1lID0gImFib3J0X2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0FCT1JUX0ZSQU1FUyB9LCB7IC5uYW1lID0gImZjc19lcnJvciIsIC52YWwgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZDU19FUlJPUiB9LCB7IC5uYW1lID0gIm92ZXJzaXplX2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfT1ZFUlNJWkVfRVJST1IgfSwgeyAubmFtZSA9ICJydW50X2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfUlVOVF9FUlJPUiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBhZV9wYXRoX3VzX3N0YXQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl91aW50OF90X2Fycl8xNiA9IHsgLm5hbWUgPSAidWludDhfdFsxNl0iLCAuZGVzY3IgPSAiQXJyYXkgb2YgMTYgZWxlbWVudHMgb2YgdHlwZSB1aW50OF90IiwgLnNpemUgPSBzaXplb2YodWludDhfdFsxNl0pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRklYRUQsIC54ID0geyAuYXJyX2ZpeGVkID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCwgLnNpemUgPSAxNiB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Flc19rZXlfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYnl0ZXMiLCAuZGVzY3IgPSAiQnl0ZXMgdGhhdCBjb21wcmlzZSB0aGUga2V5LiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVzX2tleSwgYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3RfYXJyXzE2IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWVzX2tleSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Flc19rZXkiLCAuZGVzY3IgPSAiMTI4LWJpdCBBRVMga2V5IHVzZWQgZm9yIE9OVSBhdXRoZW50aWNhdGlvbi4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYWVzX2tleSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9hZXNfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Flc19rZXlfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hbGxvY19vcGVyYXRpb25fc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWN0aXZhdGUiLCAudmFsID0gQkNNT0xUX0FMTE9DX09QRVJBVElPTl9BQ1RJVkFURSB9LCB7IC5uYW1lID0gImRlYWN0aXZhdGUiLCAudmFsID0gQkNNT0xUX0FMTE9DX09QRVJBVElPTl9ERUFDVElWQVRFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWxsb2Nfb3BlcmF0aW9uID0geyAubmFtZSA9ICJiY21vbHRfYWxsb2Nfb3BlcmF0aW9uIiwgLmRlc2NyID0gIkFsbG9jIG9wZXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hbGxvY19vcGVyYXRpb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfYWxsb2Nfb3BlcmF0aW9uX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2FsbG9jX3N0YXRlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm5vdF9jb25maWd1cmVkIiwgLnZhbCA9IEJDTU9MVF9BTExPQ19TVEFURV9OT1RfQ09ORklHVVJFRCB9LCB7IC5uYW1lID0gImluYWN0aXZlIiwgLnZhbCA9IEJDTU9MVF9BTExPQ19TVEFURV9JTkFDVElWRSB9LCB7IC5uYW1lID0gInByb2Nlc3NpbmciLCAudmFsID0gQkNNT0xUX0FMTE9DX1NUQVRFX1BST0NFU1NJTkcgfSwgeyAubmFtZSA9ICJhY3RpdmUiLCAudmFsID0gQkNNT0xUX0FMTE9DX1NUQVRFX0FDVElWRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FsbG9jX3N0YXRlID0geyAubmFtZSA9ICJiY21vbHRfYWxsb2Nfc3RhdGUiLCAuZGVzY3IgPSAiQWxsb2MgU3RhdGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYWxsb2Nfc3RhdGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfYWxsb2Nfc3RhdGVfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfYWxsb2NfdHlwZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJub25lIiwgLnZhbCA9IEJDTU9MVF9BTExPQ19UWVBFX05PTkUgfSwgeyAubmFtZSA9ICJuc3IiLCAudmFsID0gQkNNT0xUX0FMTE9DX1RZUEVfTlNSIH0sIHsgLm5hbWUgPSAic3IiLCAudmFsID0gQkNNT0xUX0FMTE9DX1RZUEVfU1IgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hbGxvY190eXBlID0geyAubmFtZSA9ICJiY21vbHRfYWxsb2NfdHlwZSIsIC5kZXNjciA9ICJBbGxvYyBUeXBlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FsbG9jX3R5cGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfYWxsb2NfdHlwZV9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hbGxvY190eXBlX3RvX3NjYW5fc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAidW51c2VkIiwgLnZhbCA9IEJDTU9MVF9BTExPQ19UWVBFX1RPX1NDQU5fVU5VU0VEIH0sIHsgLm5hbWUgPSAicHJldmlvdXNseV91c2VkIiwgLnZhbCA9IEJDTU9MVF9BTExPQ19UWVBFX1RPX1NDQU5fUFJFVklPVVNMWV9VU0VEIH0sIHsgLm5hbWUgPSAiYWxsIiwgLnZhbCA9IEJDTU9MVF9BTExPQ19UWVBFX1RPX1NDQU5fQUxMIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWxsb2NfdHlwZV90b19zY2FuID0geyAubmFtZSA9ICJiY21vbHRfYWxsb2NfdHlwZV90b19zY2FuIiwgLmRlc2NyID0gIkFsbG9jIFR5cGUgdG8gc2NhbiBkdXJpbmcgdGhlIHJvZ3VlIG9udSBkZXRlY3Rpb24gcHJvY2Vzcy4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYWxsb2NfdHlwZV90b19zY2FuKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2FsbG9jX3R5cGVfdG9fc2Nhbl9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfbW9kZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJvdmVyZmxvdyIsIC52YWwgPSBCQ01PTFRfQVBJX0NBUFRVUkVfQlVGRkVSX01PREVfT1ZFUkZMT1cgfSwgeyAubmFtZSA9ICJ3cmFwIiwgLnZhbCA9IEJDTU9MVF9BUElfQ0FQVFVSRV9CVUZGRVJfTU9ERV9XUkFQIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXBpX2NhcHR1cmVfYnVmZmVyX21vZGUgPSB7IC5uYW1lID0gImJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfbW9kZSIsIC5kZXNjciA9ICJXaGF0IHRvIGRvIHdoZW4gdGhlIGNhcHR1cmUgYnVmZmVyIGlzIGZ1bGwuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9tb2RlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9tb2RlX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfcmVhZGVyX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm9mZnNldCIsIC5kZXNjciA9ICJUaGUgYnl0ZXMgb2Zmc2V0IHRvIHJlYWQgZnJvbS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXIsIG9mZnNldCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJzaXplIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXIsIHNpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWRlciA9IHsgLm5hbWUgPSAiYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXIiLCAuZGVzY3IgPSAiV2hhdCBwb3J0aW9uIG9mIHRoZSBjYXB0dXJlIGJ1ZmZlciB0byByZWFkLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfcmVhZGVyKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXJfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWRlcl9maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2FwaV9jYXB0dXJlX2xvY2F0aW9uX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImRldmljZSIsIC52YWwgPSBCQ01PTFRfQVBJX0NBUFRVUkVfTE9DQVRJT05fREVWSUNFIH0sIHsgLm5hbWUgPSAiaG9zdCIsIC52YWwgPSBCQ01PTFRfQVBJX0NBUFRVUkVfTE9DQVRJT05fSE9TVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FwaV9jYXB0dXJlX2xvY2F0aW9uID0geyAubmFtZSA9ICJiY21vbHRfYXBpX2NhcHR1cmVfbG9jYXRpb24iLCAuZGVzY3IgPSAiV2hlcmUgdG8gcGVyZm9ybSB0aGUgQVBJIGNhcHR1cmUuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FwaV9jYXB0dXJlX2xvY2F0aW9uKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2FwaV9jYXB0dXJlX2xvY2F0aW9uX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hcGlfY2FwdHVyZV9jb25maWdfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibG9jYXRpb24iLCAuZGVzY3IgPSAiV2hlcmUgdG8gcGVyZm9ybSB0aGUgQVBJIGNhcHR1cmUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hcGlfY2FwdHVyZV9jb25maWcsIGxvY2F0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXBpX2NhcHR1cmVfbG9jYXRpb24gfSwgeyAubmFtZSA9ICJidWZmZXJfc2l6ZV9ieXRlcyIsIC5kZXNjciA9ICJNYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBjYXB0dXJlLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYXBpX2NhcHR1cmVfY29uZmlnLCBidWZmZXJfc2l6ZV9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJidWZmZXJfbW9kZSIsIC5kZXNjciA9ICJXaGF0IHRvIGRvIHdoZW4gdGhlIGNhcHR1cmUgYnVmZmVyIGlzIGZ1bGwuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hcGlfY2FwdHVyZV9jb25maWcsIGJ1ZmZlcl9tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXBpX2NhcHR1cmVfYnVmZmVyX21vZGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hcGlfY2FwdHVyZV9jb25maWcgPSB7IC5uYW1lID0gImJjbW9sdF9hcGlfY2FwdHVyZV9jb25maWciLCAuZGVzY3IgPSAiQ29uZmlndXJhdGlvbiBmb3IgQVBJIGNhcHR1cmUuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FwaV9jYXB0dXJlX2NvbmZpZyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9hcGlfY2FwdHVyZV9jb25maWdfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfYXBpX2NhcHR1cmVfY29uZmlnX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FwaV9jYXB0dXJlX3N0YXRzX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImJ1ZmZlcl91c2VkX2J5dGVzIiwgLmRlc2NyID0gIlVzZWQgc3BhY2UgaW4gdGhlIGNhcHR1cmUgYnVmZmVyIChpbiBieXRlcykuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hcGlfY2FwdHVyZV9zdGF0cywgYnVmZmVyX3VzZWRfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiYnVmZmVyX3dyYXBfY291bnQiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIHRpbWVzIHRoZSBjYXB0dXJlIGJ1ZmZlciBoYXMgd3JhcHBlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FwaV9jYXB0dXJlX3N0YXRzLCBidWZmZXJfd3JhcF9jb3VudCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJldmVudHNfcmVjb3JkZWQiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIGV2ZW50cyByZWNvcmRlZCBpbiB0aGUgY2FwdHVyZSBidWZmZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hcGlfY2FwdHVyZV9zdGF0cywgZXZlbnRzX3JlY29yZGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImV2ZW50c19kcm9wcGVkIiwgLmRlc2NyID0gIk51bWJlciBvZiBldmVudHMgZHJvcHBlZCBkdWUgdG8gb3ZlcmZsb3cuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hcGlfY2FwdHVyZV9zdGF0cywgZXZlbnRzX2Ryb3BwZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAicmVhZGFibGVfYnl0ZXMiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCB0byByZXRyaWV2ZSBjYXB0dXJlIGJ1ZmZlci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FwaV9jYXB0dXJlX3N0YXRzLCByZWFkYWJsZV9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hcGlfY2FwdHVyZV9zdGF0cyA9IHsgLm5hbWUgPSAiYmNtb2x0X2FwaV9jYXB0dXJlX3N0YXRzIiwgLmRlc2NyID0gIlN0YXRpc3RpY3Mgb24gdGhlIG1vc3QgcmVjZW50IEFQSSBjYXB0dXJlLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hcGlfY2FwdHVyZV9zdGF0cyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9hcGlfY2FwdHVyZV9zdGF0c19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9hcGlfY2FwdHVyZV9zdGF0c19maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ib3VuZHNfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYmVzdF9jYXNlIiwgLmRlc2NyID0gIkJlc3QgQ2FzZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYm91bmRzLCBiZXN0X2Nhc2UpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAid29yc3RfY2FzZSIsIC5kZXNjciA9ICJXb3JzdCBDYXNlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ib3VuZHMsIHdvcnN0X2Nhc2UpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYm91bmRzID0geyAubmFtZSA9ICJiY21vbHRfYm91bmRzIiwgLmRlc2NyID0gIkJvdW5kcyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ib3VuZHMpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfYm91bmRzX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2JvdW5kc19maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2JvdW5kc19hcnJfOCA9IHsgLm5hbWUgPSAiYmNtb2x0X2JvdW5kc1s4XSIsIC5kZXNjciA9ICJBcnJheSBvZiA4IGVsZW1lbnRzIG9mIHR5cGUgYmNtb2x0X2JvdW5kcyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ib3VuZHNbOF0pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRklYRUQsIC54ID0geyAuYXJyX2ZpeGVkID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2JvdW5kcywgLnNpemUgPSA4IH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXJyX2JvdW5kc184X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFyciIsIC5kZXNjciA9ICJBcnJheSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYXJyX2JvdW5kc184LCBhcnIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ib3VuZHNfYXJyXzggfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfYm91bmRzXzggPSB7IC5uYW1lID0gImJjbW9sdF9hcnJfYm91bmRzXzgiLCAuZGVzY3IgPSAiRml4ZWQtTGVuZ3RoIGxpc3Q6IDh4IGJvdW5kcyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hcnJfYm91bmRzXzgpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfYXJyX2JvdW5kc184X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Fycl9ib3VuZHNfOF9maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2NhbGlicmF0aW9uX3JlY29yZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJ1bnNwZWNpZmllZCIsIC52YWwgPSBCQ01PTFRfQ0FMSUJSQVRJT05fUkVDT1JEX1VOU1BFQ0lGSUVEIH0sIHsgLm5hbWUgPSAidW5jYWxpYnJhdGVkIiwgLnZhbCA9IEJDTU9MVF9DQUxJQlJBVElPTl9SRUNPUkRfVU5DQUxJQlJBVEVEIH0sIHsgLm5hbWUgPSAibG9vc2UiLCAudmFsID0gQkNNT0xUX0NBTElCUkFUSU9OX1JFQ09SRF9MT09TRSB9LCB7IC5uYW1lID0gInN1ZmZpY2llbnQiLCAudmFsID0gQkNNT0xUX0NBTElCUkFUSU9OX1JFQ09SRF9TVUZGSUNJRU5UIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfY2FsaWJyYXRpb25fcmVjb3JkID0geyAubmFtZSA9ICJiY21vbHRfY2FsaWJyYXRpb25fcmVjb3JkIiwgLmRlc2NyID0gIkNhbGlicmF0aW9uIFJlY29yZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9jYWxpYnJhdGlvbl9yZWNvcmQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfY2FsaWJyYXRpb25fcmVjb3JkX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2NhbGlicmF0aW9uX3JlY29yZF9hcnJfOCA9IHsgLm5hbWUgPSAiYmNtb2x0X2NhbGlicmF0aW9uX3JlY29yZFs4XSIsIC5kZXNjciA9ICJBcnJheSBvZiA4IGVsZW1lbnRzIG9mIHR5cGUgYmNtb2x0X2NhbGlicmF0aW9uX3JlY29yZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9jYWxpYnJhdGlvbl9yZWNvcmRbOF0pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRklYRUQsIC54ID0geyAuYXJyX2ZpeGVkID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NhbGlicmF0aW9uX3JlY29yZCwgLnNpemUgPSA4IH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXJyX2NhbGlicmF0aW9uX3JlY29yZF84X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFyciIsIC5kZXNjciA9ICJBcnJheSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYXJyX2NhbGlicmF0aW9uX3JlY29yZF84LCBhcnIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jYWxpYnJhdGlvbl9yZWNvcmRfYXJyXzggfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfY2FsaWJyYXRpb25fcmVjb3JkXzggPSB7IC5uYW1lID0gImJjbW9sdF9hcnJfY2FsaWJyYXRpb25fcmVjb3JkXzgiLCAuZGVzY3IgPSAiRml4ZWQtTGVuZ3RoIGxpc3Q6IDh4IGNhbGlicmF0aW9uX3JlY29yZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hcnJfY2FsaWJyYXRpb25fcmVjb3JkXzgpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfYXJyX2NhbGlicmF0aW9uX3JlY29yZF84X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Fycl9jYWxpYnJhdGlvbl9yZWNvcmRfOF9maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3NpZ25fc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicG9zaXRpdmUiLCAudmFsID0gQkNNT0xUX1NJR05fUE9TSVRJVkUgfSwgeyAubmFtZSA9ICJuZWdhdGl2ZSIsIC52YWwgPSBCQ01PTFRfU0lHTl9ORUdBVElWRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3NpZ24gPSB7IC5uYW1lID0gImJjbW9sdF9zaWduIiwgLmRlc2NyID0gInNpZ24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfc2lnbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9zaWduX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kc19mcmVxdWVuY3lfb2Zmc2V0X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInNpZ24iLCAuZGVzY3IgPSAic2lnbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZHNfZnJlcXVlbmN5X29mZnNldCwgc2lnbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3NpZ24gfSwgeyAubmFtZSA9ICJ2YWx1ZSIsIC5kZXNjciA9ICJ2YWx1ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZHNfZnJlcXVlbmN5X29mZnNldCwgdmFsdWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kc19mcmVxdWVuY3lfb2Zmc2V0ID0geyAubmFtZSA9ICJiY21vbHRfZHNfZnJlcXVlbmN5X29mZnNldCIsIC5kZXNjciA9ICJEUyBmcmVxdWVuY3kgb2Zmc2V0IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RzX2ZyZXF1ZW5jeV9vZmZzZXQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZHNfZnJlcXVlbmN5X29mZnNldF9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9kc19mcmVxdWVuY3lfb2Zmc2V0X2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfdXBzdHJlYW1fbGluZV9yYXRlX2NhcGFiaWxpdGllc19zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJyYXRlXzJfcF81X2ciLCAudmFsID0gQkNNT0xUX1VQU1RSRUFNX0xJTkVfUkFURV9DQVBBQklMSVRJRVNfUkFURV8yX1BfNV9HIH0sIHsgLm5hbWUgPSAicmF0ZV8xMF9nIiwgLnZhbCA9IEJDTU9MVF9VUFNUUkVBTV9MSU5FX1JBVEVfQ0FQQUJJTElUSUVTX1JBVEVfMTBfRyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3Vwc3RyZWFtX2xpbmVfcmF0ZV9jYXBhYmlsaXRpZXMgPSB7IC5uYW1lID0gImJjbW9sdF91cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzIiwgLmRlc2NyID0gIlhHUE9OIG5pIHVwc3RyZWFtIGxpbmUgcmF0ZSBjYXBhYmlsaXRpZXMiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfdXBzdHJlYW1fbGluZV9yYXRlX2NhcGFiaWxpdGllcyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF91cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2xpbmtfdHlwZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJ1bnNwZWNpZmllZCIsIC52YWwgPSBCQ01PTFRfTElOS19UWVBFX1VOU1BFQ0lGSUVEIH0sIHsgLm5hbWUgPSAiYiIsIC52YWwgPSBCQ01PTFRfTElOS19UWVBFX0IgfSwgeyAubmFtZSA9ICJhIiwgLnZhbCA9IEJDTU9MVF9MSU5LX1RZUEVfQSB9LCB7IC5uYW1lID0gImFfYW5kX2IiLCAudmFsID0gQkNNT0xUX0xJTktfVFlQRV9BX0FORF9CIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbGlua190eXBlID0geyAubmFtZSA9ICJiY21vbHRfbGlua190eXBlIiwgLmRlc2NyID0gIkxpbmsgdHlwZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9saW5rX3R5cGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbGlua190eXBlX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9jaGFubmVsX3Byb2ZpbGVfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAidmVyc2lvbiIsIC5kZXNjciA9ICJDaGFubmVsIHByb2ZpbGUgdmVyc2lvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfY2hhbm5lbF9wcm9maWxlLCB2ZXJzaW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAiY2hhbm5lbF9pbmRleCIsIC5kZXNjciA9ICJDaGFubmVsIHByb2ZpbGUgaW5kZXgiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2NoYW5uZWxfcHJvZmlsZSwgY2hhbm5lbF9pbmRleCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gImRzX2ZyZXF1ZW5jeV9vZmZzZXQiLCAuZGVzY3IgPSAiVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgYWN0dWFsIE9MVCBDVCBUeCBmcmVxdWVuY3kgYW5kIHRoZSBub21pbmFsIGNlbnRyYWwgZnJlcXVlbmN5IGZvciB0aGUgZ2l2ZW4gRFdMQ0ggSUQsIGV4cHJlc3NlZCBpbiB1bml0cyBvZiAwLjFHSHoiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2NoYW5uZWxfcHJvZmlsZSwgZHNfZnJlcXVlbmN5X29mZnNldCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2RzX2ZyZXF1ZW5jeV9vZmZzZXQgfSwgeyAubmFtZSA9ICJjaGFubmVsX3BhcnRpdGlvbiIsIC5kZXNjciA9ICJDaGFubmVsIHBhcnRpdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfY2hhbm5lbF9wcm9maWxlLCBjaGFubmVsX3BhcnRpdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInV3bGNoX2lkIiwgLmRlc2NyID0gIlRoZSBhc3NpZ25lZCB1cHN0cmVhbSB3YXZlbGVuZ3RoIGNoYW5uZWwgSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2NoYW5uZWxfcHJvZmlsZSwgdXdsY2hfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJ1c19mcmVxdWVuY3kiLCAuZGVzY3IgPSAiVGhlIG5vbWluYWwgY2VudHJhbCBmcmVxdWVuY3kgb2YgdGhlIHVwc3RyZWFtIHdhdmVsZW5ndGggY2hhbm5lbCBvciBhIHJvb3QgZnJlcXVlbmN5IG9mIHRoZSBjeWNsaWMgc2V0IG9mIGNlbnRyYWwgZnJlcXVlbmNpZXMgZm9ybWluZyBhbiB1cHN0cmVhbSB3YXZlbGVuZ3RoIGNoYW5uZWwsIGluZGljYXRlcyB0aGUgdmFsdWUgaW4gdW5pdHMgb2YgMC4xIEdIei4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2NoYW5uZWxfcHJvZmlsZSwgdXNfZnJlcXVlbmN5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gInVzX3JhdGUiLCAuZGVzY3IgPSAiVVMgcmF0ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfY2hhbm5lbF9wcm9maWxlLCB1c19yYXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdXBzdHJlYW1fbGluZV9yYXRlX2NhcGFiaWxpdGllcyB9LCB7IC5uYW1lID0gImRlZmF1bHRfb251X2F0dGVudWF0aW9uIiwgLmRlc2NyID0gIlRoZSBkZWZhdWx0IE9OVSBhdHRlbnVhdGlvbiBsZXZlbCBpbiBzdGVwcyBvZiAzZEIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2NoYW5uZWxfcHJvZmlsZSwgZGVmYXVsdF9vbnVfYXR0ZW51YXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJyZXNwb25zZV90aHJlc2hvbGQiLCAuZGVzY3IgPSAiVGhyZXNob2xkIHJlcHJlc2VudCB0aGUgbWF4aW11bSBudW1iZXIgb2YgUGxvYW1zIHRoZSBPTlUgY2FuIHRyYW5zbWl0IGF0IG5vbi16ZXJvIGF0dGVudWF0aW9uIGxldmVsIHdoaWxlIGF0dGVtcHRpbmcgdG8gZXN0YWJsaXNoIGNvbW11bmljYXRpb24gd2l0aCBPTFQgQ1QiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2NoYW5uZWxfcHJvZmlsZSwgcmVzcG9uc2VfdGhyZXNob2xkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAidXNfbGlua190eXBlIiwgLmRlc2NyID0gIlVTIGxpbmsgdHlwZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfY2hhbm5lbF9wcm9maWxlLCB1c19saW5rX3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9saW5rX3R5cGUgfSwgeyAubmFtZSA9ICJpc192YWxpZCIsIC5kZXNjciA9ICJpcyB2YWxpZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfY2hhbm5lbF9wcm9maWxlLCBpc192YWxpZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2NoYW5uZWxfcHJvZmlsZSA9IHsgLm5hbWUgPSAiYmNtb2x0X2NoYW5uZWxfcHJvZmlsZSIsIC5kZXNjciA9ICJDaGFubmVsIFByb2ZpbGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfY2hhbm5lbF9wcm9maWxlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2NoYW5uZWxfcHJvZmlsZV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9jaGFubmVsX3Byb2ZpbGVfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9jaGFubmVsX3Byb2ZpbGVfYXJyXzggPSB7IC5uYW1lID0gImJjbW9sdF9jaGFubmVsX3Byb2ZpbGVbOF0iLCAuZGVzY3IgPSAiQXJyYXkgb2YgOCBlbGVtZW50cyBvZiB0eXBlIGJjbW9sdF9jaGFubmVsX3Byb2ZpbGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfY2hhbm5lbF9wcm9maWxlWzhdKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0ZJWEVELCAueCA9IHsgLmFycl9maXhlZCA9IHsgLmVsZW1fdHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jaGFubmVsX3Byb2ZpbGUsIC5zaXplID0gOCB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Fycl9jaGFubmVsX3Byb2ZpbGVfOF9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhcnIiLCAuZGVzY3IgPSAiQXJyYXkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Fycl9jaGFubmVsX3Byb2ZpbGVfOCwgYXJyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY2hhbm5lbF9wcm9maWxlX2Fycl84IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXJyX2NoYW5uZWxfcHJvZmlsZV84ID0geyAubmFtZSA9ICJiY21vbHRfYXJyX2NoYW5uZWxfcHJvZmlsZV84IiwgLmRlc2NyID0gIkZpeGVkLUxlbmd0aCBsaXN0OiA4eCBjaGFubmVsX3Byb2ZpbGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYXJyX2NoYW5uZWxfcHJvZmlsZV84KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Fycl9jaGFubmVsX3Byb2ZpbGVfOF9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfY2hhbm5lbF9wcm9maWxlXzhfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZHNfd2F2ZWxlbmd0aF9jaGFubmVsX2lkIiwgLmRlc2NyID0gIkRvd25zdHJlYW0gd2F2ZWxlbmd0aCBjaGFubmVsIElEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydCwgZHNfd2F2ZWxlbmd0aF9jaGFubmVsX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAidXNfd2F2ZWxlbmd0aF9jaGFubmVsX2lkIiwgLmRlc2NyID0gIlVwc3RyZWFtIHdhdmVsZW5ndGggY2hhbm5lbCBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnQsIHVzX3dhdmVsZW5ndGhfY2hhbm5lbF9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInBvd2VyX2NvbnN1bXB0aW9uIiwgLmRlc2NyID0gIlBvd2VyIGNvbnN1bXB0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydCwgcG93ZXJfY29uc3VtcHRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnQgPSB7IC5uYW1lID0gImJjbW9sdF9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydCIsIC5kZXNjciA9ICJQb3dlciBjb25zdW1wdGlvbiByZXBvcnQgcGVyIGNoYW5uZWwiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF9hcnJfOCA9IHsgLm5hbWUgPSAiYmNtb2x0X3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0WzhdIiwgLmRlc2NyID0gIkFycmF5IG9mIDggZWxlbWVudHMgb2YgdHlwZSBiY21vbHRfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRbOF0pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRklYRUQsIC54ID0geyAuYXJyX2ZpeGVkID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0LCAuc2l6ZSA9IDggfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfOF9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhcnIiLCAuZGVzY3IgPSAiQXJyYXkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Fycl9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF84LCBhcnIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF9hcnJfOCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Fycl9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF84ID0geyAubmFtZSA9ICJiY21vbHRfYXJyX3Bvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0XzgiLCAuZGVzY3IgPSAiRml4ZWQtTGVuZ3RoIGxpc3Q6IDh4IHBvd2VyX2NvbnN1bXB0aW9uX2NoYW5uZWxfcmVwb3J0IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Fycl9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF84KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Fycl9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF84X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Fycl9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF84X2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl91aW50MTZfdF9hcnJfMiA9IHsgLm5hbWUgPSAidWludDE2X3RbMl0iLCAuZGVzY3IgPSAiQXJyYXkgb2YgMiBlbGVtZW50cyBvZiB0eXBlIHVpbnQxNl90IiwgLnNpemUgPSBzaXplb2YodWludDE2X3RbMl0pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRklYRUQsIC54ID0geyAuYXJyX2ZpeGVkID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QsIC5zaXplID0gMiB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91MTZfMl9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhcnIiLCAuZGVzY3IgPSAiQXJyYXkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Fycl91MTZfMiwgYXJyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdF9hcnJfMiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91MTZfMiA9IHsgLm5hbWUgPSAiYmNtb2x0X2Fycl91MTZfMiIsIC5kZXNjciA9ICJGaXhlZC1MZW5ndGggbGlzdDogMnggVTE2IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Fycl91MTZfMiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdTE2XzJfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfYXJyX3UxNl8yX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl91aW50MTZfdF9hcnJfMl9oZXggPSB7IC5uYW1lID0gInVpbnQxNl90WzJdIiwgLmRlc2NyID0gIkFycmF5IG9mIDIgZWxlbWVudHMgb2YgdHlwZSB1aW50MTZfdCIsIC5zaXplID0gc2l6ZW9mKHVpbnQxNl90WzJdKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0ZJWEVELCAueCA9IHsgLmFycl9maXhlZCA9IHsgLmVsZW1fdHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90X2hleCwgLnNpemUgPSAyIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXJyX3UxNl8yX2hleF9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhcnIiLCAuZGVzY3IgPSAiQXJyYXkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Fycl91MTZfMl9oZXgsIGFyciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3RfYXJyXzJfaGV4IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXJyX3UxNl8yX2hleCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Fycl91MTZfMl9oZXgiLCAuZGVzY3IgPSAiRml4ZWQtTGVuZ3RoIGxpc3Q6IDJ4IFUxNiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hcnJfdTE2XzJfaGV4KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91MTZfMl9oZXhfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfYXJyX3UxNl8yX2hleF9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfdWludDE2X3RfYXJyXzVfaGV4ID0geyAubmFtZSA9ICJ1aW50MTZfdFs1XSIsIC5kZXNjciA9ICJBcnJheSBvZiA1IGVsZW1lbnRzIG9mIHR5cGUgdWludDE2X3QiLCAuc2l6ZSA9IHNpemVvZih1aW50MTZfdFs1XSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9GSVhFRCwgLnggPSB7IC5hcnJfZml4ZWQgPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdF9oZXgsIC5zaXplID0gNSB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91MTZfNV9oZXhfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYXJyIiwgLmRlc2NyID0gIkFycmF5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hcnJfdTE2XzVfaGV4LCBhcnIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90X2Fycl81X2hleCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91MTZfNV9oZXggPSB7IC5uYW1lID0gImJjbW9sdF9hcnJfdTE2XzVfaGV4IiwgLmRlc2NyID0gIkZpeGVkLUxlbmd0aCBsaXN0OiA1eCBVMTYiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYXJyX3UxNl81X2hleCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdTE2XzVfaGV4X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91MTZfNV9oZXhfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX3VpbnQxNl90X2Fycl83ID0geyAubmFtZSA9ICJ1aW50MTZfdFs3XSIsIC5kZXNjciA9ICJBcnJheSBvZiA3IGVsZW1lbnRzIG9mIHR5cGUgdWludDE2X3QiLCAuc2l6ZSA9IHNpemVvZih1aW50MTZfdFs3XSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9GSVhFRCwgLnggPSB7IC5hcnJfZml4ZWQgPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCwgLnNpemUgPSA3IH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXJyX3UxNl83X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFyciIsIC5kZXNjciA9ICJBcnJheSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYXJyX3UxNl83LCBhcnIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90X2Fycl83IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXJyX3UxNl83ID0geyAubmFtZSA9ICJiY21vbHRfYXJyX3UxNl83IiwgLmRlc2NyID0gIkZpeGVkLUxlbmd0aCBsaXN0OiA3eCBVMTYiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYXJyX3UxNl83KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91MTZfN19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdTE2XzdfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX3VpbnQzMl90X2Fycl82ID0geyAubmFtZSA9ICJ1aW50MzJfdFs2XSIsIC5kZXNjciA9ICJBcnJheSBvZiA2IGVsZW1lbnRzIG9mIHR5cGUgdWludDMyX3QiLCAuc2l6ZSA9IHNpemVvZih1aW50MzJfdFs2XSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9GSVhFRCwgLnggPSB7IC5hcnJfZml4ZWQgPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCwgLnNpemUgPSA2IH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXJyX3UzMl82X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFyciIsIC5kZXNjciA9ICJBcnJheSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYXJyX3UzMl82LCBhcnIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90X2Fycl82IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXJyX3UzMl82ID0geyAubmFtZSA9ICJiY21vbHRfYXJyX3UzMl82IiwgLmRlc2NyID0gIkZpeGVkLUxlbmd0aCBsaXN0OiA2eCBVMzIiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYXJyX3UzMl82KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91MzJfNl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdTMyXzZfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX3VpbnQ4X3RfYXJyXzEwID0geyAubmFtZSA9ICJ1aW50OF90WzEwXSIsIC5kZXNjciA9ICJBcnJheSBvZiAxMCBlbGVtZW50cyBvZiB0eXBlIHVpbnQ4X3QiLCAuc2l6ZSA9IHNpemVvZih1aW50OF90WzEwXSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9GSVhFRCwgLnggPSB7IC5hcnJfZml4ZWQgPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90LCAuc2l6ZSA9IDEwIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzEwX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFyciIsIC5kZXNjciA9ICJBcnJheSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYXJyX3U4XzEwLCBhcnIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3RfYXJyXzEwIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzEwID0geyAubmFtZSA9ICJiY21vbHRfYXJyX3U4XzEwIiwgLmRlc2NyID0gIkZpeGVkLUxlbmd0aCBsaXN0OiAxMHggVTgiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYXJyX3U4XzEwKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91OF8xMF9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdThfMTBfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX3VpbnQ4X3RfYXJyXzEyID0geyAubmFtZSA9ICJ1aW50OF90WzEyXSIsIC5kZXNjciA9ICJBcnJheSBvZiAxMiBlbGVtZW50cyBvZiB0eXBlIHVpbnQ4X3QiLCAuc2l6ZSA9IHNpemVvZih1aW50OF90WzEyXSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9GSVhFRCwgLnggPSB7IC5hcnJfZml4ZWQgPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90LCAuc2l6ZSA9IDEyIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzEyX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFyciIsIC5kZXNjciA9ICJBcnJheSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYXJyX3U4XzEyLCBhcnIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3RfYXJyXzEyIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzEyID0geyAubmFtZSA9ICJiY21vbHRfYXJyX3U4XzEyIiwgLmRlc2NyID0gIkZpeGVkLUxlbmd0aCBsaXN0OiAxMnggVTgiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYXJyX3U4XzEyKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91OF8xMl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdThfMTJfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX3VpbnQ4X3RfYXJyXzEzID0geyAubmFtZSA9ICJ1aW50OF90WzEzXSIsIC5kZXNjciA9ICJBcnJheSBvZiAxMyBlbGVtZW50cyBvZiB0eXBlIHVpbnQ4X3QiLCAuc2l6ZSA9IHNpemVvZih1aW50OF90WzEzXSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9GSVhFRCwgLnggPSB7IC5hcnJfZml4ZWQgPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90LCAuc2l6ZSA9IDEzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzEzX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFyciIsIC5kZXNjciA9ICJBcnJheSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYXJyX3U4XzEzLCBhcnIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3RfYXJyXzEzIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzEzID0geyAubmFtZSA9ICJiY21vbHRfYXJyX3U4XzEzIiwgLmRlc2NyID0gIkZpeGVkLUxlbmd0aCBsaXN0OiAxM3ggVTgiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYXJyX3U4XzEzKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91OF8xM19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdThfMTNfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX3VpbnQ4X3RfYXJyXzM2ID0geyAubmFtZSA9ICJ1aW50OF90WzM2XSIsIC5kZXNjciA9ICJBcnJheSBvZiAzNiBlbGVtZW50cyBvZiB0eXBlIHVpbnQ4X3QiLCAuc2l6ZSA9IHNpemVvZih1aW50OF90WzM2XSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9GSVhFRCwgLnggPSB7IC5hcnJfZml4ZWQgPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90LCAuc2l6ZSA9IDM2IH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzM2X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFyciIsIC5kZXNjciA9ICJBcnJheSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYXJyX3U4XzM2LCBhcnIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3RfYXJyXzM2IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzM2ID0geyAubmFtZSA9ICJiY21vbHRfYXJyX3U4XzM2IiwgLmRlc2NyID0gIkZpeGVkLUxlbmd0aCBsaXN0OiAzNnggVTgiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYXJyX3U4XzM2KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91OF8zNl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdThfMzZfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX3VpbnQ4X3RfYXJyXzQgPSB7IC5uYW1lID0gInVpbnQ4X3RbNF0iLCAuZGVzY3IgPSAiQXJyYXkgb2YgNCBlbGVtZW50cyBvZiB0eXBlIHVpbnQ4X3QiLCAuc2l6ZSA9IHNpemVvZih1aW50OF90WzRdKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0ZJWEVELCAueCA9IHsgLmFycl9maXhlZCA9IHsgLmVsZW1fdHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QsIC5zaXplID0gNCB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91OF80X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFyciIsIC5kZXNjciA9ICJBcnJheSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYXJyX3U4XzQsIGFyciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdF9hcnJfNCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91OF80ID0geyAubmFtZSA9ICJiY21vbHRfYXJyX3U4XzQiLCAuZGVzY3IgPSAiRml4ZWQtTGVuZ3RoIGxpc3Q6IDR4IFU4IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Fycl91OF80KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91OF80X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91OF80X2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl91aW50OF90X2Fycl80MCA9IHsgLm5hbWUgPSAidWludDhfdFs0MF0iLCAuZGVzY3IgPSAiQXJyYXkgb2YgNDAgZWxlbWVudHMgb2YgdHlwZSB1aW50OF90IiwgLnNpemUgPSBzaXplb2YodWludDhfdFs0MF0pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRklYRUQsIC54ID0geyAuYXJyX2ZpeGVkID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCwgLnNpemUgPSA0MCB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91OF80MF9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhcnIiLCAuZGVzY3IgPSAiQXJyYXkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Fycl91OF80MCwgYXJyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90X2Fycl80MCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Fycl91OF80MCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Fycl91OF80MCIsIC5kZXNjciA9ICJGaXhlZC1MZW5ndGggbGlzdDogNDB4IFU4IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Fycl91OF80MCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdThfNDBfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzQwX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGVfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicHJvZmlsZV92ZXJzaW9uIiwgLmRlc2NyID0gInByb2ZpbGUgdmVyc2lvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYnVyc3RfcHJvZmlsZSwgcHJvZmlsZV92ZXJzaW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90X2hleCB9LCB7IC5uYW1lID0gImlzX2ZlY19vbiIsIC5kZXNjciA9ICJpcyBmZWMgb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGUsIGlzX2ZlY19vbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImRlbGltaXRlcl9zaXplX2luX2J5dGVzIiwgLmRlc2NyID0gImRlbGltaXRlciBzaXplIGluIGJ5dGVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlLCBkZWxpbWl0ZXJfc2l6ZV9pbl9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gImRlbGltaXRlcl9wYXR0ZXJuX2hpZ2giLCAuZGVzY3IgPSAiZGVsaW1pdGVyIHBhdHRlcm4gaGlnaCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYnVyc3RfcHJvZmlsZSwgZGVsaW1pdGVyX3BhdHRlcm5faGlnaCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3RfaGV4IH0sIHsgLm5hbWUgPSAiZGVsaW1pdGVyX3BhdHRlcm5fbG93IiwgLmRlc2NyID0gImRlbGltaXRlciBwYXR0ZXJuIGxvdyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYnVyc3RfcHJvZmlsZSwgZGVsaW1pdGVyX3BhdHRlcm5fbG93KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdF9oZXggfSwgeyAubmFtZSA9ICJwcmVhbWJsZV9sZW5ndGhfaW5fYnl0ZXMiLCAuZGVzY3IgPSAicHJlYW1ibGUgbGVuZ3RoIGluIGJ5dGVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlLCBwcmVhbWJsZV9sZW5ndGhfaW5fYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJwcmVhbWJsZV9yZXBlYXRzX2NvdW50IiwgLmRlc2NyID0gInByZWFtYmxlIHJlcGVhdHMgY291bnQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGUsIHByZWFtYmxlX3JlcGVhdHNfY291bnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJwcmVhbWJsZV9wYXR0ZXJuX2hpZ2giLCAuZGVzY3IgPSAicHJlYW1ibGUgcGF0dGVybiBoaWdoIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlLCBwcmVhbWJsZV9wYXR0ZXJuX2hpZ2gpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90X2hleCB9LCB7IC5uYW1lID0gInByZWFtYmxlX3BhdHRlcm5fbG93IiwgLmRlc2NyID0gInByZWFtYmxlIHBhdHRlcm4gbG93IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlLCBwcmVhbWJsZV9wYXR0ZXJuX2xvdyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3RfaGV4IH0sIHsgLm5hbWUgPSAicG9uX3RhZyIsIC5kZXNjciA9ICJQT04gdGFnIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlLCBwb25fdGFnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gIm51bV9vZl9ndWFyZF9ieXRlcyIsIC5kZXNjciA9ICJudW1iZXIgb2YgZ3VhcmQgYnl0ZXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGUsIG51bV9vZl9ndWFyZF9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJpc19wcm9maWxlX3ZhbGlkIiwgLmRlc2NyID0gImlzIHByb2ZpbGUgdmFsaWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGUsIGlzX3Byb2ZpbGVfdmFsaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJidXJzdF9vdmVyaGVhZF9zaXplX2luX3dvcmRzIiwgLmRlc2NyID0gIkJ1cnN0IG92ZXJoZWFkIHNpemUgaW4gNC1ieXRlIHdvcmRzICh3b3JkIHNpemUgaXMgNCBieXRlcyByZWdhcmRsZXNzIG9mIHVwc3RyZWFtIGRhdGEgcmF0ZSkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlLCBidXJzdF9vdmVyaGVhZF9zaXplX2luX3dvcmRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGUgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlIiwgLmRlc2NyID0gIlhHUE9OIGJ1cnN0IHByb2ZpbGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYnVyc3RfcHJvZmlsZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGVfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9idXJzdF9wcm9maWxlX2Fycl80ID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fYnVyc3RfcHJvZmlsZVs0XSIsIC5kZXNjciA9ICJBcnJheSBvZiA0IGVsZW1lbnRzIG9mIHR5cGUgYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYnVyc3RfcHJvZmlsZVs0XSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9GSVhFRCwgLnggPSB7IC5hcnJfZml4ZWQgPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYnVyc3RfcHJvZmlsZSwgLnNpemUgPSA0IH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXJyX3hncG9uX2J1cnN0X3Byb2ZpbGVfNF9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhcnIiLCAuZGVzY3IgPSAiQXJyYXkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Fycl94Z3Bvbl9idXJzdF9wcm9maWxlXzQsIGFyciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2J1cnN0X3Byb2ZpbGVfYXJyXzQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfeGdwb25fYnVyc3RfcHJvZmlsZV80ID0geyAubmFtZSA9ICJiY21vbHRfYXJyX3hncG9uX2J1cnN0X3Byb2ZpbGVfNCIsIC5kZXNjciA9ICJGaXhlZC1MZW5ndGggbGlzdDogNHggeGdwb25fYnVyc3RfcHJvZmlsZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hcnJfeGdwb25fYnVyc3RfcHJvZmlsZV80KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Fycl94Z3Bvbl9idXJzdF9wcm9maWxlXzRfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfYXJyX3hncG9uX2J1cnN0X3Byb2ZpbGVfNF9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJ0cnhfcmVzZXRfcGF0dGVybl9maXJzdCIsIC5kZXNjciA9ICJ0cnggcmVzZXQgcGF0dGVybiBmaXJzdCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb24sIHRyeF9yZXNldF9wYXR0ZXJuX2ZpcnN0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdF9oZXggfSwgeyAubmFtZSA9ICJ0cnhfcmVzZXRfcGF0dGVybl9taWRkbGUiLCAuZGVzY3IgPSAidHJ4IHJlc2V0IHBhdHRlcm4gbWlkZGxlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY29uZmlndXJhdGlvbiwgdHJ4X3Jlc2V0X3BhdHRlcm5fbWlkZGxlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdF9oZXggfSwgeyAubmFtZSA9ICJ0cnhfcmVzZXRfcGF0dGVybl9sYXN0IiwgLmRlc2NyID0gInRyeCByZXNldCBwYXR0ZXJuIGxhc3QiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3RyeF9jb25maWd1cmF0aW9uLCB0cnhfcmVzZXRfcGF0dGVybl9sYXN0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdF9oZXggfSwgeyAubmFtZSA9ICJ0cnhfcmVzZXRfbWlkZGxlX3JlcGVhdHNfY291bnQiLCAuZGVzY3IgPSAidHJ4IHJlc2V0IG1pZGRsZSByZXBlYXRzIGNvdW50IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY29uZmlndXJhdGlvbiwgdHJ4X3Jlc2V0X21pZGRsZV9yZXBlYXRzX2NvdW50KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAidHJ4X3Jlc2V0X2xvY2F0aW9uIiwgLmRlc2NyID0gInRyeCByZXNldCBsb2NhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb24sIHRyeF9yZXNldF9sb2NhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJ0cnhfcmVzZXRfcG9sYXJpdHkiLCAuZGVzY3IgPSAidHJ4IHJlc2V0IHBvbGFyaXR5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY29uZmlndXJhdGlvbiwgdHJ4X3Jlc2V0X3BvbGFyaXR5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiYmNkcl9yZXNldF9wYXR0ZXJuX2ZpcnN0IiwgLmRlc2NyID0gImJjZHIgcmVzZXQgcGF0dGVybiBmaXJzdCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb24sIGJjZHJfcmVzZXRfcGF0dGVybl9maXJzdCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3RfaGV4IH0sIHsgLm5hbWUgPSAiYmNkcl9yZXNldF9wYXR0ZXJuX21pZGRsZSIsIC5kZXNjciA9ICJiY2RyIHJlc2V0IHBhdHRlcm4gbWlkZGxlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY29uZmlndXJhdGlvbiwgYmNkcl9yZXNldF9wYXR0ZXJuX21pZGRsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3RfaGV4IH0sIHsgLm5hbWUgPSAiYmNkcl9yZXNldF9wYXR0ZXJuX2xhc3QiLCAuZGVzY3IgPSAiYmNkciByZXNldCBwYXR0ZXJuIGxhc3QiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3RyeF9jb25maWd1cmF0aW9uLCBiY2RyX3Jlc2V0X3BhdHRlcm5fbGFzdCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3RfaGV4IH0sIHsgLm5hbWUgPSAiYmNkcl9yZXNldF9taWRkbGVfcmVwZWF0c19jb3VudCIsIC5kZXNjciA9ICJiY2RyIHJlc2V0IG1pZGRsZSByZXBlYXRzIGNvdW50IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY29uZmlndXJhdGlvbiwgYmNkcl9yZXNldF9taWRkbGVfcmVwZWF0c19jb3VudCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gImJjZHJfcmVzZXRfbG9jYXRpb24iLCAuZGVzY3IgPSAiYmNkciByZXNldCBsb2NhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb24sIGJjZHJfcmVzZXRfbG9jYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJiY2RyX3Jlc2V0X3BvbGFyaXR5IiwgLmRlc2NyID0gImJjZHIgcmVzZXQgcG9sYXJpdHkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3RyeF9jb25maWd1cmF0aW9uLCBiY2RyX3Jlc2V0X3BvbGFyaXR5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb24gPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl90cnhfY29uZmlndXJhdGlvbiIsIC5kZXNjciA9ICJYR1BPTiBUUlggY29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl90cnhfY29uZmlndXJhdGlvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3RyeF9jb25maWd1cmF0aW9uX2Fycl80ID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb25bNF0iLCAuZGVzY3IgPSAiQXJyYXkgb2YgNCBlbGVtZW50cyBvZiB0eXBlIGJjbW9sdF94Z3Bvbl90cnhfY29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl90cnhfY29uZmlndXJhdGlvbls0XSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9GSVhFRCwgLnggPSB7IC5hcnJfZml4ZWQgPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb24sIC5zaXplID0gNCB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Fycl94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl80X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFyciIsIC5kZXNjciA9ICJBcnJheSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYXJyX3hncG9uX3RyeF9jb25maWd1cmF0aW9uXzQsIGFyciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3RyeF9jb25maWd1cmF0aW9uX2Fycl80IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXJyX3hncG9uX3RyeF9jb25maWd1cmF0aW9uXzQgPSB7IC5uYW1lID0gImJjbW9sdF9hcnJfeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb25fNCIsIC5kZXNjciA9ICJGaXhlZC1MZW5ndGggbGlzdDogNHggeGdwb25fdHJ4X2NvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYXJyX3hncG9uX3RyeF9jb25maWd1cmF0aW9uXzQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfYXJyX3hncG9uX3RyeF9jb25maWd1cmF0aW9uXzRfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfYXJyX3hncG9uX3RyeF9jb25maWd1cmF0aW9uXzRfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb25fZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibG9zIiwgLmRlc2NyID0gIkF1dG8gZGVhY3RpdmF0ZSBPTlUgZHVlIHRvIExPUyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24sIGxvcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm9udV9hbGFybXMiLCAuZGVzY3IgPSAiQXV0byBkZWFjdGl2YXRlIE9OVSBkdWUgdG8gT05VIGFsYXJtcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24sIG9udV9hbGFybXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJ0aXdpIiwgLmRlc2NyID0gIkF1dG8gZGVhY3RpdmF0ZSBPTlUgZHVlIHRvIFRJV2kgYWxhcm0iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLCB0aXdpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiYWNrX3RpbWVvdXQiLCAuZGVzY3IgPSAiQXV0byBkZWFjdGl2YXRlIE9OVSBkdWUgdG8gQWNrIHRpbWVvdXQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLCBhY2tfdGltZW91dCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInNmaSIsIC5kZXNjciA9ICJBdXRvIGRlYWN0aXZhdGUgT05VIGR1ZSB0byBTRmkgYWxhcm0iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLCBzZmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJsb2tpIiwgLmRlc2NyID0gIkF1dG8gZGVhY3RpdmF0ZSBPTlUgZHVlIHRvIExva2kgYWxhcm0iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uLCBsb2tpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24gPSB7IC5uYW1lID0gImJjbW9sdF9hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiIsIC5kZXNjciA9ICJBdXRvbWF0aWMgT05VIGRlYWN0aXZhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbl9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9yZXN5bmNfY29udHJvbF9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGFydF9wYXR0ZXJuIiwgLmRlc2NyID0gInN0YXJ0IHBhdHRlcm4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Jlc3luY19jb250cm9sLCBzdGFydF9wYXR0ZXJuKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAibWlkZGxlX3BhdHRlcm4iLCAuZGVzY3IgPSAibWlkZGxlIHBhdHRlcm4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Jlc3luY19jb250cm9sLCBtaWRkbGVfcGF0dGVybiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gImxhc3RfcGF0dGVybiIsIC5kZXNjciA9ICJsYXN0IHBhdHRlcm4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Jlc3luY19jb250cm9sLCBsYXN0X3BhdHRlcm4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJtaWRkbGVfcmVwZXRpdGlvbiIsIC5kZXNjciA9ICJtaWRkbGUgcmVwZXRpdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcmVzeW5jX2NvbnRyb2wsIG1pZGRsZV9yZXBldGl0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAibG9jYXRpb24iLCAuZGVzY3IgPSAibG9jYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Jlc3luY19jb250cm9sLCBsb2NhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3Jlc3luY19jb250cm9sID0geyAubmFtZSA9ICJiY21vbHRfcmVzeW5jX2NvbnRyb2wiLCAuZGVzY3IgPSAiVFJYIFJlc3luYyBwYXR0ZXJuIGNvbnRyb2wiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcmVzeW5jX2NvbnRyb2wpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfcmVzeW5jX2NvbnRyb2xfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfcmVzeW5jX2NvbnRyb2xfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYmNkcl9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJlc3luY19jb250cm9sIiwgLmRlc2NyID0gInJlc3luYyBjb250cm9sIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9iY2RyX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb24sIHJlc3luY19jb250cm9sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzeW5jX2NvbnRyb2wgfSwgeyAubmFtZSA9ICJyYW5naW5nX3Jlc3luY19jb250cm9sIiwgLmRlc2NyID0gInJhbmdpbmcgcmVzeW5jIGNvbnRyb2wiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2JjZHJfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbiwgcmFuZ2luZ19yZXN5bmNfY29udHJvbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3luY19jb250cm9sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYmNkcl9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uID0geyAubmFtZSA9ICJiY21vbHRfYmNkcl9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uIiwgLmRlc2NyID0gIkJDRFIgcmVzeW5jIHBhdHRlcm4gY29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9iY2RyX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfYmNkcl9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2JjZHJfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbl9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9iZXJfbW9uaXRvcl9wYXJhbXNfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAidXNfYmVyX2ludGVydmFsIiwgLmRlc2NyID0gIkludGVydmFsIGluIG1pbGxpc2Vjb25kcyBmb3IgdXBzdHJlYW0gQkVSIG1vbml0b3JpbmcgKDAgPSBkaXNhYmxlZCkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9iZXJfbW9uaXRvcl9wYXJhbXMsIHVzX2Jlcl9pbnRlcnZhbCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJzZl90aHJlc2hvbGQiLCAuZGVzY3IgPSAiU2lnbmFsIGZhaWwgYWxhcm0gaXMgcmFpc2VkIHdoZW4gQkVSIHJhaXNlcyB0byAxMF4teCwgd2hlcmUgeCBpcyB0aGlzIG51bWJlci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Jlcl9tb25pdG9yX3BhcmFtcywgc2ZfdGhyZXNob2xkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAic2RfdGhyZXNob2xkIiwgLmRlc2NyID0gIlNpZ25hbCBkZWdyYWRlIGFsYXJtIGlzIHJhaXNlZCB3aGVuIEJFUiByYWlzZXMgdG8gMTBeLXgsIHdoZXJlIHggaXMgdGhpcyBudW1iZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9iZXJfbW9uaXRvcl9wYXJhbXMsIHNkX3RocmVzaG9sZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Jlcl9tb25pdG9yX3BhcmFtcyA9IHsgLm5hbWUgPSAiYmNtb2x0X2Jlcl9tb25pdG9yX3BhcmFtcyIsIC5kZXNjciA9ICJCRVIgbW9uaXRvcmluZyBwYXJhbWV0ZXJzIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Jlcl9tb25pdG9yX3BhcmFtcyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9iZXJfbW9uaXRvcl9wYXJhbXNfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfYmVyX21vbml0b3JfcGFyYW1zX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfY2FwdHVyZV9zdHJvYmVfc2lnbmFsX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImdwb25fYmNkcl9yZXNldCIsIC52YWwgPSBCQ01PTFRfQ0FQVFVSRV9TVFJPQkVfU0lHTkFMX0dQT05fQkNEUl9SRVNFVCB9LCB7IC5uYW1lID0gImdwb25fdHJ4X2VkIiwgLnZhbCA9IEJDTU9MVF9DQVBUVVJFX1NUUk9CRV9TSUdOQUxfR1BPTl9UUlhfRUQgfSwgeyAubmFtZSA9ICJncG9uX3Jzc2kiLCAudmFsID0gQkNNT0xUX0NBUFRVUkVfU1RST0JFX1NJR05BTF9HUE9OX1JTU0kgfSwgeyAubmFtZSA9ICJncG9uX2VvYiIsIC52YWwgPSBCQ01PTFRfQ0FQVFVSRV9TVFJPQkVfU0lHTkFMX0dQT05fRU9CIH0sIHsgLm5hbWUgPSAic2VyZGVzX2J1cnN0X2VuIiwgLnZhbCA9IEJDTU9MVF9DQVBUVVJFX1NUUk9CRV9TSUdOQUxfU0VSREVTX0JVUlNUX0VOIH0sIHsgLm5hbWUgPSAic2VyZGVzX3J4X2xvY2siLCAudmFsID0gQkNNT0xUX0NBUFRVUkVfU1RST0JFX1NJR05BTF9TRVJERVNfUlhfTE9DSyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2NhcHR1cmVfc3Ryb2JlX3NpZ25hbCA9IHsgLm5hbWUgPSAiYmNtb2x0X2NhcHR1cmVfc3Ryb2JlX3NpZ25hbCIsIC5kZXNjciA9ICJjYXB0dXJlIHN0cm9iZSBzaWduYWwiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfY2FwdHVyZV9zdHJvYmVfc2lnbmFsKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2NhcHR1cmVfc3Ryb2JlX3NpZ25hbF9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJtYV83IiwgLmRlc2NyID0gIkNCQSBtYXhpbXVtIGFsbG9jYXRpb24gc2l6ZSBmb3IgZnJhbWUgZ2FwIDciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Nicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUsIG1hXzcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAibWFfMyIsIC5kZXNjciA9ICJDQkEgbWF4aW11bSBhbGxvY2F0aW9uIHNpemUgZm9yIGZyYW1lIGdhcCAzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLCBtYV8zKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gIm1hXzEiLCAuZGVzY3IgPSAiQ0JBIG1heGltdW0gYWxsb2NhdGlvbiBzaXplIGZvciBmcmFtZSBnYXAgMSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSwgbWFfMSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlID0geyAubmFtZSA9ICJiY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSIsIC5kZXNjciA9ICJDQlIgUlQgQWxsb2NhdGlvbiBwcm9maWxlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Nicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfY2hhbm5lbF9jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAib3BlcmF0aW9uX2NvbnRyb2wiLCAudmFsID0gQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX09QRVJBVElPTl9DT05UUk9MIH0sIHsgLm5hbWUgPSAidG9sIiwgLnZhbCA9IEJDTU9MVF9DSEFOTkVMX0NGR19JRF9UT0wgfSwgeyAubmFtZSA9ICJzeXN0ZW1fcHJvZmlsZSIsIC52YWwgPSBCQ01PTFRfQ0hBTk5FTF9DRkdfSURfU1lTVEVNX1BST0ZJTEUgfSwgeyAubmFtZSA9ICJjaGFubmVsX3Byb2ZpbGUiLCAudmFsID0gQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX0NIQU5ORUxfUFJPRklMRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2NoYW5uZWxfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfY2hhbm5lbF9jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgY2hhbm5lbF9jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2NoYW5uZWxfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2NoYW5uZWxfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2NoYW5uZWxfa2V5X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInBvbl9uaSIsIC52YWwgPSBCQ01PTFRfQ0hBTk5FTF9LRVlfSURfUE9OX05JIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfY2hhbm5lbF9rZXlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9jaGFubmVsX2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBjaGFubmVsX2tleSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfY2hhbm5lbF9rZXlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfY2hhbm5lbF9rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfY29uc29sZV9yZWRpcmVjdGlvbl9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJub25lIiwgLnZhbCA9IEJDTU9MVF9DT05TT0xFX1JFRElSRUNUSU9OX05PTkUgfSwgeyAubmFtZSA9ICJyZWRpcmVjdCIsIC52YWwgPSBCQ01PTFRfQ09OU09MRV9SRURJUkVDVElPTl9SRURJUkVDVCB9LCB7IC5uYW1lID0gImNsb25lIiwgLnZhbCA9IEJDTU9MVF9DT05TT0xFX1JFRElSRUNUSU9OX0NMT05FIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfY29uc29sZV9yZWRpcmVjdGlvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X2NvbnNvbGVfcmVkaXJlY3Rpb24iLCAuZGVzY3IgPSAiQ29uc29sZSBSZWRpcmVjdGlvbiBUeXBlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2NvbnNvbGVfcmVkaXJlY3Rpb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfY29uc29sZV9yZWRpcmVjdGlvbl9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9jb250cm9sX3N0YXRlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImRpc2FibGUiLCAudmFsID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRSB9LCB7IC5uYW1lID0gImVuYWJsZSIsIC52YWwgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9FTkFCTEUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9jb250cm9sX3N0YXRlID0geyAubmFtZSA9ICJiY21vbHRfY29udHJvbF9zdGF0ZSIsIC5kZXNjciA9ICJjb250cm9sIHN0YXRlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2NvbnRyb2xfc3RhdGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfY29udHJvbF9zdGF0ZV9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kYmFfbW9kZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJub3JtYWwiLCAudmFsID0gQkNNT0xUX0RCQV9NT0RFX05PUk1BTCB9LCB7IC5uYW1lID0gImV4dGVuZGVkIiwgLnZhbCA9IEJDTU9MVF9EQkFfTU9ERV9FWFRFTkRFRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RiYV9tb2RlID0geyAubmFtZSA9ICJiY21vbHRfZGJhX21vZGUiLCAuZGVzY3IgPSAiZGJhIG1vZGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGJhX21vZGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZGJhX21vZGVfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGJhX3JhbV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJncmFudF9maWZvX3JhbV8wIiwgLnZhbCA9IEJDTU9MVF9EQkFfUkFNX0dSQU5UX0ZJRk9fUkFNXzAgfSwgeyAubmFtZSA9ICJncmFudF9maWZvX3JhbV8xIiwgLnZhbCA9IEJDTU9MVF9EQkFfUkFNX0dSQU5UX0ZJRk9fUkFNXzEgfSwgeyAubmFtZSA9ICJncmFudF9maWZvX3JhbV8yIiwgLnZhbCA9IEJDTU9MVF9EQkFfUkFNX0dSQU5UX0ZJRk9fUkFNXzIgfSwgeyAubmFtZSA9ICJncmFudF9maWZvX3JhbV8zIiwgLnZhbCA9IEJDTU9MVF9EQkFfUkFNX0dSQU5UX0ZJRk9fUkFNXzMgfSwgeyAubmFtZSA9ICJncmFudF9maWZvX3JhbV80IiwgLnZhbCA9IEJDTU9MVF9EQkFfUkFNX0dSQU5UX0ZJRk9fUkFNXzQgfSwgeyAubmFtZSA9ICJncmFudF9maWZvX3JhbV81IiwgLnZhbCA9IEJDTU9MVF9EQkFfUkFNX0dSQU5UX0ZJRk9fUkFNXzUgfSwgeyAubmFtZSA9ICJncmFudF9maWZvX3JhbV82IiwgLnZhbCA9IEJDTU9MVF9EQkFfUkFNX0dSQU5UX0ZJRk9fUkFNXzYgfSwgeyAubmFtZSA9ICJncmFudF9maWZvX3JhbV83IiwgLnZhbCA9IEJDTU9MVF9EQkFfUkFNX0dSQU5UX0ZJRk9fUkFNXzcgfSwgeyAubmFtZSA9ICJncmFudHNfb3V0X3JhbSIsIC52YWwgPSBCQ01PTFRfREJBX1JBTV9HUkFOVFNfT1VUX1JBTSB9LCB7IC5uYW1lID0gImdyYW50c19pbl9yYW0iLCAudmFsID0gQkNNT0xUX0RCQV9SQU1fR1JBTlRTX0lOX1JBTSB9LCB7IC5uYW1lID0gImdyYW50c19yZXRpcmVkX3JhbSIsIC52YWwgPSBCQ01PTFRfREJBX1JBTV9HUkFOVFNfUkVUSVJFRF9SQU0gfSwgeyAubmFtZSA9ICJyZXBvcnRfcmFtIiwgLnZhbCA9IEJDTU9MVF9EQkFfUkFNX1JFUE9SVF9SQU0gfSwgeyAubmFtZSA9ICJncmFudF9jZmdfcmFtIiwgLnZhbCA9IEJDTU9MVF9EQkFfUkFNX0dSQU5UX0NGR19SQU0gfSwgeyAubmFtZSA9ICJkZWZhdWx0X3Rva2Vuc19yYW0iLCAudmFsID0gQkNNT0xUX0RCQV9SQU1fREVGQVVMVF9UT0tFTlNfUkFNIH0sIHsgLm5hbWUgPSAicG9sbF9yZWNvcmRzX3JhbSIsIC52YWwgPSBCQ01PTFRfREJBX1JBTV9QT0xMX1JFQ09SRFNfUkFNIH0sIHsgLm5hbWUgPSAiaGVpcl9wb2xsX3JhbSIsIC52YWwgPSBCQ01PTFRfREJBX1JBTV9IRUlSX1BPTExfUkFNIH0sIHsgLm5hbWUgPSAibGFzdF9wb2xsX3RpbWVfcmFtIiwgLnZhbCA9IEJDTU9MVF9EQkFfUkFNX0xBU1RfUE9MTF9USU1FX1JBTSB9LCB7IC5uYW1lID0gInBvbGxfb3JkZXJfcmFtIiwgLnZhbCA9IEJDTU9MVF9EQkFfUkFNX1BPTExfT1JERVJfUkFNIH0sIHsgLm5hbWUgPSAidGRtX3JhbV8wIiwgLnZhbCA9IEJDTU9MVF9EQkFfUkFNX1RETV9SQU1fMCB9LCB7IC5uYW1lID0gInRkbV9yYW1fMSIsIC52YWwgPSBCQ01PTFRfREJBX1JBTV9URE1fUkFNXzEgfSwgeyAubmFtZSA9ICJ0ZG1fcmFtXzIiLCAudmFsID0gQkNNT0xUX0RCQV9SQU1fVERNX1JBTV8yIH0sIHsgLm5hbWUgPSAidGRtX3JhbV8zIiwgLnZhbCA9IEJDTU9MVF9EQkFfUkFNX1RETV9SQU1fMyB9LCB7IC5uYW1lID0gInRkbV9yYW1fNCIsIC52YWwgPSBCQ01PTFRfREJBX1JBTV9URE1fUkFNXzQgfSwgeyAubmFtZSA9ICJ0ZG1fcmFtXzUiLCAudmFsID0gQkNNT0xUX0RCQV9SQU1fVERNX1JBTV81IH0sIHsgLm5hbWUgPSAidGRtX3JhbV82IiwgLnZhbCA9IEJDTU9MVF9EQkFfUkFNX1RETV9SQU1fNiB9LCB7IC5uYW1lID0gInRkbV9yYW1fNyIsIC52YWwgPSBCQ01PTFRfREJBX1JBTV9URE1fUkFNXzcgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kYmFfcmFtID0geyAubmFtZSA9ICJiY21vbHRfZGJhX3JhbSIsIC5kZXNjciA9ICJEQkEgUkFNIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RiYV9yYW0pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZGJhX3JhbV9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kYmFfdHlwZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJpbnRlcm5hbCIsIC52YWwgPSBCQ01PTFRfREJBX1RZUEVfSU5URVJOQUwgfSwgeyAubmFtZSA9ICJwYXJ0aWFsX2V4dGVybmFsIiwgLnZhbCA9IEJDTU9MVF9EQkFfVFlQRV9QQVJUSUFMX0VYVEVSTkFMIH0sIHsgLm5hbWUgPSAiZXh0ZXJuYWwiLCAudmFsID0gQkNNT0xUX0RCQV9UWVBFX0VYVEVSTkFMIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGJhX3R5cGUgPSB7IC5uYW1lID0gImJjbW9sdF9kYmFfdHlwZSIsIC5kZXNjciA9ICJEQkEgdHlwZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kYmFfdHlwZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9kYmFfdHlwZV9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZHJfdGVzdF9zdGF0dXNfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiY29tcGxldGVkIiwgLnZhbCA9IEJDTU9MVF9ERFJfVEVTVF9TVEFUVVNfQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAiY29ubmVjdGlvbl9mYWlsZWQiLCAudmFsID0gQkNNT0xUX0REUl9URVNUX1NUQVRVU19DT05ORUNUSU9OX0ZBSUxFRCB9LCB7IC5uYW1lID0gInRpbWVvdXQiLCAudmFsID0gQkNNT0xUX0REUl9URVNUX1NUQVRVU19USU1FT1VUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGRyX3Rlc3Rfc3RhdHVzID0geyAubmFtZSA9ICJiY21vbHRfZGRyX3Rlc3Rfc3RhdHVzIiwgLmRlc2NyID0gIkREUiBUZXN0IFN0YXR1cyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZHJfdGVzdF9zdGF0dXMpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZGRyX3Rlc3Rfc3RhdHVzX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Rkcl90ZXN0X3Jlc3VsdF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdWNjZXNzIiwgLnZhbCA9IEJDTU9MVF9ERFJfVEVTVF9SRVNVTFRfU1VDQ0VTUyB9LCB7IC5uYW1lID0gInBoeV9pbml0X2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9ERFJfVEVTVF9SRVNVTFRfUEhZX0lOSVRfRVJST1IgfSwgeyAubmFtZSA9ICJkcmFtX2luaXRfZXJyb3IiLCAudmFsID0gQkNNT0xUX0REUl9URVNUX1JFU1VMVF9EUkFNX0lOSVRfRVJST1IgfSwgeyAubmFtZSA9ICJzaG1vb19lcnJvciIsIC52YWwgPSBCQ01PTFRfRERSX1RFU1RfUkVTVUxUX1NITU9PX0VSUk9SIH0sIHsgLm5hbWUgPSAiZWRpc190ZXN0X2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9ERFJfVEVTVF9SRVNVTFRfRURJU19URVNUX0VSUk9SIH0sIHsgLm5hbWUgPSAibWVtX3Rlc3RfZXJyb3IiLCAudmFsID0gQkNNT0xUX0REUl9URVNUX1JFU1VMVF9NRU1fVEVTVF9FUlJPUiB9LCB7IC5uYW1lID0gIm5vdF90ZXN0ZWQiLCAudmFsID0gQkNNT0xUX0REUl9URVNUX1JFU1VMVF9OT1RfVEVTVEVEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGRyX3Rlc3RfcmVzdWx0ID0geyAubmFtZSA9ICJiY21vbHRfZGRyX3Rlc3RfcmVzdWx0IiwgLmRlc2NyID0gIkREUiBUZXN0IFJlc3VsdCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZHJfdGVzdF9yZXN1bHQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZGRyX3Rlc3RfcmVzdWx0X3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2hvc3RfY29ubmVjdGlvbl9mYWlsX3JlYXNvbl9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJ0aW1lb3V0IiwgLnZhbCA9IEJDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fVElNRU9VVCB9LCB7IC5uYW1lID0gImtlZXBhbGl2ZSIsIC52YWwgPSBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX0tFRVBBTElWRSB9LCB7IC5uYW1lID0gInVzZXJfY2FsbGJhY2tfZXJyb3IiLCAudmFsID0gQkNNT0xUX0hPU1RfQ09OTkVDVElPTl9GQUlMX1JFQVNPTl9VU0VSX0NBTExCQUNLX0VSUk9SIH0sIHsgLm5hbWUgPSAic29mdHdhcmVfdmVyc2lvbl9taXNtYXRjaCIsIC52YWwgPSBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX1NPRlRXQVJFX1ZFUlNJT05fTUlTTUFUQ0ggfSwgeyAubmFtZSA9ICJzeXN0ZW1fbW9kZV9taXNtYXRjaCIsIC52YWwgPSBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX1NZU1RFTV9NT0RFX01JU01BVENIIH0sIHsgLm5hbWUgPSAibm5pX3NwZWVkX21pc21hdGNoIiwgLnZhbCA9IEJDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fTk5JX1NQRUVEX01JU01BVENIIH0sIHsgLm5hbWUgPSAicmVjb25uZWN0X3RpbWVvdXQiLCAudmFsID0gQkNNT0xUX0hPU1RfQ09OTkVDVElPTl9GQUlMX1JFQVNPTl9SRUNPTk5FQ1RfVElNRU9VVCB9LCB7IC5uYW1lID0gImludGVybmFsX2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fSU5URVJOQUxfRVJST1IgfSwgeyAubmFtZSA9ICJzeXN0ZW1fbW9kZV9ub3Rfc3VwcG9ydGVkIiwgLnZhbCA9IEJDTU9MVF9IT1NUX0NPTk5FQ1RJT05fRkFJTF9SRUFTT05fU1lTVEVNX01PREVfTk9UX1NVUFBPUlRFRCB9LCB7IC5uYW1lID0gInBhcmFtZXRlciIsIC52YWwgPSBCQ01PTFRfSE9TVF9DT05ORUNUSU9OX0ZBSUxfUkVBU09OX1BBUkFNRVRFUiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2hvc3RfY29ubmVjdGlvbl9mYWlsX3JlYXNvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X2hvc3RfY29ubmVjdGlvbl9mYWlsX3JlYXNvbiIsIC5kZXNjciA9ICJSZWFzb25zIHdoeSB0aGUgY29ubmVjdGlvbiBiZXR3ZWVuIHRoZSBob3N0IGFuZCB0aGUgZGV2aWNlIGZhaWxlZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ob3N0X2Nvbm5lY3Rpb25fZmFpbF9yZWFzb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfaG9zdF9jb25uZWN0aW9uX2ZhaWxfcmVhc29uX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWRfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gIk91dGNvbWUgb2YgdGhlIEREUiB0ZXN0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWQsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Rkcl90ZXN0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWRfY29tcGxldGVkX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImNwdV9yZXN1bHQiLCAuZGVzY3IgPSAiQ1BVIFJlc3VsdCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkLCB1LmNvbXBsZXRlZC5jcHVfcmVzdWx0KSAtIG9mZnNldG9mKGJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWQsIHUuY29tcGxldGVkLmNwdV9yZXN1bHQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9kZHJfdGVzdF9yZXN1bHQgfSwgeyAubmFtZSA9ICJyYXNfMF9yZXN1bHQiLCAuZGVzY3IgPSAiUkFTIDAgUmVzdWx0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWQsIHUuY29tcGxldGVkLnJhc18wX3Jlc3VsdCkgLSBvZmZzZXRvZihiY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkLCB1LmNvbXBsZXRlZC5jcHVfcmVzdWx0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZGRyX3Rlc3RfcmVzdWx0IH0sIHsgLm5hbWUgPSAicmFzXzFfcmVzdWx0IiwgLmRlc2NyID0gIlJBUyAxIFJlc3VsdCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkLCB1LmNvbXBsZXRlZC5yYXNfMV9yZXN1bHQpIC0gb2Zmc2V0b2YoYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZCwgdS5jb21wbGV0ZWQuY3B1X3Jlc3VsdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Rkcl90ZXN0X3Jlc3VsdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZF9jb21wbGV0ZWQgPSB7IC5uYW1lID0gImJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWRfY29tcGxldGVkIiwgLmRlc2NyID0gIkREUiBUZXN0IENvbXBsZXRlZCBDb21wbGV0ZWQiLCAuc2l6ZSA9IHNpemVvZigoKGJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWQgKikwKS0+dS5jb21wbGV0ZWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkX2NvbXBsZXRlZF9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWRfY29tcGxldGVkX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZF9jb25uZWN0aW9uX2ZhaWxlZF9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyZWFzb24iLCAuZGVzY3IgPSAiQ29ubmVjdGlvbiBmYWlsIHJlYXNvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkLCB1LmNvbm5lY3Rpb25fZmFpbGVkLnJlYXNvbikgLSBvZmZzZXRvZihiY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkLCB1LmNvbm5lY3Rpb25fZmFpbGVkLnJlYXNvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2hvc3RfY29ubmVjdGlvbl9mYWlsX3JlYXNvbiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZF9jb25uZWN0aW9uX2ZhaWxlZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZF9jb25uZWN0aW9uX2ZhaWxlZCIsIC5kZXNjciA9ICJERFIgVGVzdCBDb21wbGV0ZWQgQ29ubmVjdGlvbiBGYWlsZWQiLCAuc2l6ZSA9IHNpemVvZigoKGJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWQgKikwKS0+dS5jb25uZWN0aW9uX2ZhaWxlZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWRfY29ubmVjdGlvbl9mYWlsZWRfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkX2Nvbm5lY3Rpb25fZmFpbGVkX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZF91bmlvbl9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJ1LmNvbXBsZXRlZCIsIC5kZXNjciA9ICIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZCwgdS5jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWRfY29tcGxldGVkIH0sIHsgLm5hbWUgPSAidS5jb25uZWN0aW9uX2ZhaWxlZCIsIC5kZXNjciA9ICIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZCwgdS5jb25uZWN0aW9uX2ZhaWxlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZF9jb25uZWN0aW9uX2ZhaWxlZCB9LCB7IH0sIHsgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWQgPSB7IC5uYW1lID0gImJjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiUmVzdWx0cyBvZiB0aGUgRERSIHRlc3QiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfVU5JT04sIC54ID0geyAudSA9IHsgLm51bV9jb21tb25fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZF9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5jb21tb25fZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZGRyX3Rlc3RfY29tcGxldGVkX2ZpZWxkcywgLmNsYXNzaWZpZXJfaWR4ID0gMCwgLnVuaW9uX2ZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Rkcl90ZXN0X2NvbXBsZXRlZF91bmlvbl9maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2RlYWN0aXZhdGlvbl9yZWFzb25fc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibm9uZSIsIC52YWwgPSBCQ01PTFRfREVBQ1RJVkFUSU9OX1JFQVNPTl9OT05FIH0sIHsgLm5hbWUgPSAiZGVhY3RpdmF0aW9uIiwgLnZhbCA9IEJDTU9MVF9ERUFDVElWQVRJT05fUkVBU09OX0RFQUNUSVZBVElPTiB9LCB7IC5uYW1lID0gImFja190aW1lb3V0IiwgLnZhbCA9IEJDTU9MVF9ERUFDVElWQVRJT05fUkVBU09OX0FDS19USU1FT1VUIH0sIHsgLm5hbWUgPSAic2ZpIiwgLnZhbCA9IEJDTU9MVF9ERUFDVElWQVRJT05fUkVBU09OX1NGSSB9LCB7IC5uYW1lID0gInRpd2kiLCAudmFsID0gQkNNT0xUX0RFQUNUSVZBVElPTl9SRUFTT05fVElXSSB9LCB7IC5uYW1lID0gInBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uIiwgLnZhbCA9IEJDTU9MVF9ERUFDVElWQVRJT05fUkVBU09OX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OIH0sIHsgLm5hbWUgPSAib251X2FsYXJtIiwgLnZhbCA9IEJDTU9MVF9ERUFDVElWQVRJT05fUkVBU09OX09OVV9BTEFSTSB9LCB7IC5uYW1lID0gImxvcyIsIC52YWwgPSBCQ01PTFRfREVBQ1RJVkFUSU9OX1JFQVNPTl9MT1MgfSwgeyAubmFtZSA9ICJsb2tpIiwgLnZhbCA9IEJDTU9MVF9ERUFDVElWQVRJT05fUkVBU09OX0xPS0kgfSwgeyAubmFtZSA9ICJyZXJhbmdlX2ZhaWx1cmUiLCAudmFsID0gQkNNT0xUX0RFQUNUSVZBVElPTl9SRUFTT05fUkVSQU5HRV9GQUlMVVJFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGVhY3RpdmF0aW9uX3JlYXNvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X2RlYWN0aXZhdGlvbl9yZWFzb24iLCAuZGVzY3IgPSAiZGVhY3RpdmF0aW9uIHJlYXNvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZWFjdGl2YXRpb25fcmVhc29uKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2RlYWN0aXZhdGlvbl9yZWFzb25fc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGVidWdfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiY2xpX291dHB1dCIsIC52YWwgPSBCQ01PTFRfREVCVUdfQVVUT19DRkdfSURfQ0xJX09VVFBVVCB9LCB7IC5uYW1lID0gImZpbGVfYWxtb3N0X2Z1bGwiLCAudmFsID0gQkNNT0xUX0RFQlVHX0FVVE9fQ0ZHX0lEX0ZJTEVfQUxNT1NUX0ZVTEwgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZWJ1Z19hdXRvX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRlYnVnX2F1dG9fY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZWJ1Z19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiY29uc29sZV9yZWRpcmVjdGlvbiIsIC52YWwgPSBCQ01PTFRfREVCVUdfQ0ZHX0lEX0NPTlNPTEVfUkVESVJFQ1RJT04gfSwgeyAubmFtZSA9ICJpbmRpY2F0aW9uc19kcm9wcGVkIiwgLnZhbCA9IEJDTU9MVF9ERUJVR19DRkdfSURfSU5ESUNBVElPTlNfRFJPUFBFRCB9LCB7IC5uYW1lID0gImZpbGVfdXNlZF9wZXJjZW50IiwgLnZhbCA9IEJDTU9MVF9ERUJVR19DRkdfSURfRklMRV9VU0VEX1BFUkNFTlQgfSwgeyAubmFtZSA9ICJhcGlfY2FwdHVyZV9jZmciLCAudmFsID0gQkNNT0xUX0RFQlVHX0NGR19JRF9BUElfQ0FQVFVSRV9DRkcgfSwgeyAubmFtZSA9ICJhcGlfY2FwdHVyZV9zdGF0cyIsIC52YWwgPSBCQ01PTFRfREVCVUdfQ0ZHX0lEX0FQSV9DQVBUVVJFX1NUQVRTIH0sIHsgLm5hbWUgPSAiYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQiLCAudmFsID0gQkNNT0xUX0RFQlVHX0NGR19JRF9BUElfQ0FQVFVSRV9CVUZGRVJfUkVBRCB9LCB7IC5uYW1lID0gImFwaV9jYXB0dXJlX2J1ZmZlciIsIC52YWwgPSBCQ01PTFRfREVCVUdfQ0ZHX0lEX0FQSV9DQVBUVVJFX0JVRkZFUiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RlYnVnX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2RlYnVnX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBkZWJ1Z19jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RlYnVnX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9kZWJ1Z19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGVidWdfY2xpX2lucHV0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImRhdGEiLCAudmFsID0gQkNNT0xUX0RFQlVHX0NMSV9JTlBVVF9JRF9EQVRBIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGVidWdfY2xpX2lucHV0X2lkID0geyAubmFtZSA9ICJiY21vbHRfZGVidWdfY2xpX2lucHV0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRlYnVnX2NsaV9pbnB1dCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGVidWdfY2xpX2lucHV0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImRhdGEiLCAudmFsID0gQkNNT0xUX0RFQlVHX0NMSV9PVVRQVVRfSURfREFUQSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRlYnVnX2NsaV9vdXRwdXQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZGVidWdfY2xpX291dHB1dF9pZF9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGVidWdfZGV2aWNlX2NmZ19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJob3N0X2RtYV9yeF9xdWV1ZV9zaXplIiwgLmRlc2NyID0gIlJYIFF1ZXVlIHNpemUgb2YgdGhlIGhvc3QgRE1BICAgICIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGVidWdfZGV2aWNlX2NmZywgaG9zdF9kbWFfcnhfcXVldWVfc2l6ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJob3N0X2RtYV90eF9xdWV1ZV9zaXplIiwgLmRlc2NyID0gIlRYIFF1ZXVlIHNpemUgb2YgdGhlIGhvc3QgRE1BICAgICIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGVidWdfZGV2aWNlX2NmZywgaG9zdF9kbWFfdHhfcXVldWVfc2l6ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJhdnNfY29udHJvbCIsIC5kZXNjciA9ICJBVlMgY29udHJvbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGVidWdfZGV2aWNlX2NmZywgYXZzX2NvbnRyb2wpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJ1c2VfcHJldl9wb25fc2VyZGVzX2Zpcm13YXJlIiwgLmRlc2NyID0gIlRoaXMgaXMgYSBmYWxsYmFjayBvcHRpb24gaWYgdGhlcmUgYXJlIGlzc3VlcyB3aXRoIHRoZSBuZXcgZmlybXdhcmUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RlYnVnX2RldmljZV9jZmcsIHVzZV9wcmV2X3Bvbl9zZXJkZXNfZmlybXdhcmUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJ1c2VfcHJldl9ubmlfc2VyZGVzX2Zpcm13YXJlIiwgLmRlc2NyID0gIlRoaXMgaXMgYSBmYWxsYmFjayBvcHRpb24gaWYgdGhlcmUgYXJlIGlzc3VlcyB3aXRoIHRoZSBuZXcgZmlybXdhcmUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RlYnVnX2RldmljZV9jZmcsIHVzZV9wcmV2X25uaV9zZXJkZXNfZmlybXdhcmUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZWJ1Z19kZXZpY2VfY2ZnID0geyAubmFtZSA9ICJiY21vbHRfZGVidWdfZGV2aWNlX2NmZyIsIC5kZXNjciA9ICJEZWJ1ZyBwYXJhbWV0ZXJzIGZvciBkZXZpY2UgY29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZWJ1Z19kZXZpY2VfY2ZnKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2RlYnVnX2RldmljZV9jZmdfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZGVidWdfZGV2aWNlX2NmZ19maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2RlYnVnX2ZpbGVfYWxtb3N0X2Z1bGxfaWRfc3RyaW5nX3RhYmxlW10gPSB7IEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGVidWdfZmlsZV9hbG1vc3RfZnVsbF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2RlYnVnX2ZpbGVfYWxtb3N0X2Z1bGxfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGVidWdfZmlsZV9hbG1vc3RfZnVsbCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGVidWdfZmlsZV9hbG1vc3RfZnVsbF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9kZWJ1Z19maWxlX2FsbW9zdF9mdWxsX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2RlYnVnX2tleV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJyZXNlcnZlZCIsIC52YWwgPSBCQ01PTFRfREVCVUdfS0VZX0lEX1JFU0VSVkVEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGVidWdfa2V5X2lkID0geyAubmFtZSA9ICJiY21vbHRfZGVidWdfa2V5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRlYnVnX2tleSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGVidWdfa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2RlYnVnX2tleV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZWJ1Z19yZXNldF9hcGlfY2FwdHVyZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZWJ1Z19yZXNldF9hcGlfY2FwdHVyZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2RlYnVnX3Jlc2V0X2FwaV9jYXB0dXJlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRlYnVnX3Jlc2V0X2FwaV9jYXB0dXJlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZWJ1Z19yZXNldF9hcGlfY2FwdHVyZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9kZWJ1Z19yZXNldF9hcGlfY2FwdHVyZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZWJ1Z19zdGFydF9hcGlfY2FwdHVyZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZWJ1Z19zdGFydF9hcGlfY2FwdHVyZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2RlYnVnX3N0YXJ0X2FwaV9jYXB0dXJlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRlYnVnX3N0YXJ0X2FwaV9jYXB0dXJlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZWJ1Z19zdGFydF9hcGlfY2FwdHVyZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9kZWJ1Z19zdGFydF9hcGlfY2FwdHVyZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZWJ1Z19zdG9wX2FwaV9jYXB0dXJlX2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RlYnVnX3N0b3BfYXBpX2NhcHR1cmVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9kZWJ1Z19zdG9wX2FwaV9jYXB0dXJlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRlYnVnX3N0b3BfYXBpX2NhcHR1cmUgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RlYnVnX3N0b3BfYXBpX2NhcHR1cmVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZGVidWdfc3RvcF9hcGlfY2FwdHVyZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiY29ubmVjdGlvbl9jb21wbGV0ZSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0NPTk5FQ1RJT05fQ09NUExFVEUgfSwgeyAubmFtZSA9ICJjb25uZWN0aW9uX2VzdGFibGlzaGVkIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfQ09OTkVDVElPTl9FU1RBQkxJU0hFRCB9LCB7IC5uYW1lID0gImNvbm5lY3Rpb25fZmFpbHVyZSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0NPTk5FQ1RJT05fRkFJTFVSRSB9LCB7IC5uYW1lID0gImRkcl90ZXN0X2NvbXBsZXRlIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfRERSX1RFU1RfQ09NUExFVEUgfSwgeyAubmFtZSA9ICJkZXZpY2Vfa2VlcF9hbGl2ZSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0RFVklDRV9LRUVQX0FMSVZFIH0sIHsgLm5hbWUgPSAiZGV2aWNlX3JlYWR5IiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfREVWSUNFX1JFQURZIH0sIHsgLm5hbWUgPSAiZGlzY29ubmVjdGlvbl9jb21wbGV0ZSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0RJU0NPTk5FQ1RJT05fQ09NUExFVEUgfSwgeyAubmFtZSA9ICJpbWFnZV90cmFuc2Zlcl9jb21wbGV0ZSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0lNQUdFX1RSQU5TRkVSX0NPTVBMRVRFIH0sIHsgLm5hbWUgPSAiaW5kaWNhdGlvbnNfZHJvcHBlZCIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0lORElDQVRJT05TX0RST1BQRUQgfSwgeyAubmFtZSA9ICJzd19lcnJvciIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX1NXX0VSUk9SIH0sIHsgLm5hbWUgPSAic3dfZXhjZXB0aW9uIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfU1dfRVhDRVBUSU9OIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRldmljZV9hdXRvX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2RldmljZV9hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2VfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN5c3RlbV9tb2RlIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1NZU1RFTV9NT0RFIH0sIHsgLm5hbWUgPSAia2VlcGFsaXZlX2ludGVydmFsIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0tFRVBBTElWRV9JTlRFUlZBTCB9LCB7IC5uYW1lID0gImtlZXBhbGl2ZV90b2xlcmFuY2UiLCAudmFsID0gQkNNT0xUX0RFVklDRV9DRkdfSURfS0VFUEFMSVZFX1RPTEVSQU5DRSB9LCB7IC5uYW1lID0gImZpcm13YXJlX3N3X3ZlcnNpb24iLCAudmFsID0gQkNNT0xUX0RFVklDRV9DRkdfSURfRklSTVdBUkVfU1dfVkVSU0lPTiB9LCB7IC5uYW1lID0gImhvc3Rfc3dfdmVyc2lvbiIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9IT1NUX1NXX1ZFUlNJT04gfSwgeyAubmFtZSA9ICJjaGlwX3JldmlzaW9uIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0NISVBfUkVWSVNJT04gfSwgeyAubmFtZSA9ICJzdGF0ZSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9TVEFURSB9LCB7IC5uYW1lID0gImRlYnVnIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0RFQlVHIH0sIHsgLm5hbWUgPSAibm5pX3NwZWVkIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX05OSV9TUEVFRCB9LCB7IC5uYW1lID0gInByb3RlY3Rpb25fc3dpdGNoaW5nX2V4dF9pcnEiLCAudmFsID0gQkNNT0xUX0RFVklDRV9DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfRVhUX0lSUSB9LCB7IC5uYW1lID0gImVwb25fY2xvY2tfdHJhbnNwb3J0X3NhbXBsZV9kZWxheSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9FUE9OX0NMT0NLX1RSQU5TUE9SVF9TQU1QTEVfREVMQVkgfSwgeyAubmFtZSA9ICJpbmRpY2F0aW9uX3NoYXBpbmciLCAudmFsID0gQkNNT0xUX0RFVklDRV9DRkdfSURfSU5ESUNBVElPTl9TSEFQSU5HIH0sIHsgLm5hbWUgPSAiY2hpcF90ZW1wZXJhdHVyZSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9DSElQX1RFTVBFUkFUVVJFIH0sIHsgLm5hbWUgPSAiZ3Bvbl94Z3Bvbl90b2RfZW5hYmxlIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX0VOQUJMRSB9LCB7IC5uYW1lID0gImdwb25feGdwb25fdG9kX2dwaW9fcGluIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX0dQSU9fUElOIH0sIHsgLm5hbWUgPSAiZ3Bvbl94Z3Bvbl90b2RfY29ubmVjdGVkX2ludGVybmFsbHkiLCAudmFsID0gQkNNT0xUX0RFVklDRV9DRkdfSURfR1BPTl9YR1BPTl9UT0RfQ09OTkVDVEVEX0lOVEVSTkFMTFkgfSwgeyAubmFtZSA9ICJlcG9uXzgwMjFfYXNfdG9kX2Zvcm1hdCIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9FUE9OXzgwMjFfQVNfVE9EX0ZPUk1BVCB9LCB7IC5uYW1lID0gImVwb25fc2hhcGVyX21vZGUiLCAudmFsID0gQkNNT0xUX0RFVklDRV9DRkdfSURfRVBPTl9TSEFQRVJfTU9ERSB9LCB7IC5uYW1lID0gImVtYmVkZGVkX2ltYWdlX2xpc3QiLCAudmFsID0gQkNNT0xUX0RFVklDRV9DRkdfSURfRU1CRURERURfSU1BR0VfTElTVCB9LCB7IC5uYW1lID0gImNoaXBfdm9sdGFnZSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9DSElQX1ZPTFRBR0UgfSwgeyAubmFtZSA9ICJlcG9uX3RvZF9zdHJpbmciLCAudmFsID0gQkNNT0xUX0RFVklDRV9DRkdfSURfRVBPTl9UT0RfU1RSSU5HIH0sIHsgLm5hbWUgPSAieGdwb25fbnVtX29mX29udXMiLCAudmFsID0gQkNNT0xUX0RFVklDRV9DRkdfSURfWEdQT05fTlVNX09GX09OVVMgfSwgeyAubmFtZSA9ICJkZXZpY2VfaXBfYWRkcmVzcyIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9ERVZJQ0VfSVBfQUREUkVTUyB9LCB7IC5uYW1lID0gImRldmljZV91ZHBfcG9ydCIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9ERVZJQ0VfVURQX1BPUlQgfSwgeyAubmFtZSA9ICJ0b2RfdWFydF9iYXVkcmF0ZSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9UT0RfVUFSVF9CQVVEUkFURSB9LCB7IC5uYW1lID0gImdwb25feGdwb25fdG9kX3N0cmluZ19sZW5ndGgiLCAudmFsID0gQkNNT0xUX0RFVklDRV9DRkdfSURfR1BPTl9YR1BPTl9UT0RfU1RSSU5HX0xFTkdUSCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9kZXZpY2VfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRldmljZV9jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZGV2aWNlX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2VfY2hpcF9yZXZpc2lvbl9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhMCIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0NISVBfUkVWSVNJT05fQTAgfSwgeyAubmFtZSA9ICJiMCIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0NISVBfUkVWSVNJT05fQjAgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfY2hpcF9yZXZpc2lvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X2RldmljZV9jaGlwX3JldmlzaW9uIiwgLmRlc2NyID0gIlJldmlzaW9uIG9mIHRoZSBCQ002ODYyMCBkZXZpY2UuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9jaGlwX3JldmlzaW9uKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2RldmljZV9jaGlwX3JldmlzaW9uX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9jb25uZWN0X2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9jb25uZWN0X2lkID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX2Nvbm5lY3RfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGV2aWNlX2Nvbm5lY3QgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9jb25uZWN0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2RldmljZV9jb25uZWN0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YW5kYWxvbmUiLCAudmFsID0gQkNNT0xUX0RFVklDRV9DT05ORUNUSU9OX0NPTVBMRVRFX0lEX1NUQU5EQUxPTkUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9lc3RhYmxpc2hlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9lc3RhYmxpc2hlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2VzdGFibGlzaGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRldmljZV9jb25uZWN0aW9uX2VzdGFibGlzaGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9lc3RhYmxpc2hlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9lc3RhYmxpc2hlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInJlYXNvbiIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0NPTk5FQ1RJT05fRkFJTFVSRV9JRF9SRUFTT04gfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2lkID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBkZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImRkcl90ZXN0IiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfRERSX1RFU1RfQ09NUExFVEVfSURfRERSX1RFU1QgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzZXF1ZW5jZV9udW1iZXIiLCAudmFsID0gQkNNT0xUX0RFVklDRV9ERVZJQ0VfS0VFUF9BTElWRV9JRF9TRVFVRU5DRV9OVU1CRVIgfSwgeyAubmFtZSA9ICJ0aW1lX3N0YW1wIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfREVWSUNFX0tFRVBfQUxJVkVfSURfVElNRV9TVEFNUCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBkZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmUgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJmaXJtd2FyZV9zd192ZXJzaW9uIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX0ZJUk1XQVJFX1NXX1ZFUlNJT04gfSwgeyAubmFtZSA9ICJzeXN0ZW1fbW9kZSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0RFVklDRV9SRUFEWV9JRF9TWVNURU1fTU9ERSB9LCB7IC5uYW1lID0gIm5uaV9zcGVlZCIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0RFVklDRV9SRUFEWV9JRF9OTklfU1BFRUQgfSwgeyAubmFtZSA9ICJjaGlwX3JldmlzaW9uIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX0NISVBfUkVWSVNJT04gfSwgeyAubmFtZSA9ICJ0b2RfZW5hYmxlIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX1RPRF9FTkFCTEUgfSwgeyAubmFtZSA9ICJ0b2RfZ3Bpb19waW4iLCAudmFsID0gQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfVE9EX0dQSU9fUElOIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGV2aWNlX2RldmljZV9yZWFkeSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9kaXNjb25uZWN0X2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9kaXNjb25uZWN0X2lkID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX2Rpc2Nvbm5lY3RfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGV2aWNlX2Rpc2Nvbm5lY3QgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9kaXNjb25uZWN0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2RldmljZV9kaXNjb25uZWN0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9kaXNjb25uZWN0aW9uX2NvbXBsZXRlX2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9kaXNjb25uZWN0aW9uX2NvbXBsZXRlX2lkID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX2Rpc2Nvbm5lY3Rpb25fY29tcGxldGVfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGV2aWNlX2Rpc2Nvbm5lY3Rpb25fY29tcGxldGUgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9kaXNjb25uZWN0aW9uX2NvbXBsZXRlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2RldmljZV9kaXNjb25uZWN0aW9uX2NvbXBsZXRlX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic2VxdWVuY2VfbnVtYmVyIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfSE9TVF9LRUVQX0FMSVZFX0lEX1NFUVVFTkNFX05VTUJFUiB9LCB7IC5uYW1lID0gInRpbWVfc3RhbXAiLCAudmFsID0gQkNNT0xUX0RFVklDRV9IT1NUX0tFRVBfQUxJVkVfSURfVElNRV9TVEFNUCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRldmljZV9ob3N0X2tlZXBfYWxpdmUgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiaW1hZ2VfdHlwZSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX0NPTVBMRVRFX0lEX0lNQUdFX1RZUEUgfSwgeyAubmFtZSA9ICJibG9ja19udW1iZXIiLCAudmFsID0gQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9DT01QTEVURV9JRF9CTE9DS19OVU1CRVIgfSwgeyAubmFtZSA9ICJzdGF0dXMiLCAudmFsID0gQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9DT01QTEVURV9JRF9TVEFUVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImJsb2NrX251bWJlciIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX0RBVEFfSURfQkxPQ0tfTlVNQkVSIH0sIHsgLm5hbWUgPSAibW9yZV9kYXRhIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfREFUQV9JRF9NT1JFX0RBVEEgfSwgeyAubmFtZSA9ICJkYXRhIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfREFUQV9JRF9EQVRBIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBkZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImltYWdlX3R5cGUiLCAudmFsID0gQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9TVEFSVF9JRF9JTUFHRV9UWVBFIH0sIHsgLm5hbWUgPSAiaW1hZ2Vfc2l6ZSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX1NUQVJUX0lEX0lNQUdFX1NJWkUgfSwgeyAubmFtZSA9ICJjcmMzMiIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX1NUQVJUX0lEX0NSQzMyIH0sIHsgLm5hbWUgPSAiaW1hZ2VfbmFtZSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX1NUQVJUX0lEX0lNQUdFX05BTUUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9pbWFnZV90eXBlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImJvb3Rsb2FkZXIiLCAudmFsID0gQkNNT0xUX0RFVklDRV9JTUFHRV9UWVBFX0JPT1RMT0FERVIgfSwgeyAubmFtZSA9ICJhcHBsaWNhdGlvbiIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0lNQUdFX1RZUEVfQVBQTElDQVRJT04gfSwgeyAubmFtZSA9ICJpdHVfcG9uX29udV9maXJtd2FyZSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0lNQUdFX1RZUEVfSVRVX1BPTl9PTlVfRklSTVdBUkUgfSwgeyAubmFtZSA9ICJlcG9uX29udV9maXJtd2FyZSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX0lNQUdFX1RZUEVfRVBPTl9PTlVfRklSTVdBUkUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfaW1hZ2VfdHlwZSA9IHsgLm5hbWUgPSAiYmNtb2x0X2RldmljZV9pbWFnZV90eXBlIiwgLmRlc2NyID0gIkRldmljZSBJbWFnZSBUeXBlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9pbWFnZV90eXBlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2RldmljZV9pbWFnZV90eXBlX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInRvdGFsX2NvdW50IiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfSU5ESUNBVElPTlNfRFJPUFBFRF9JRF9UT1RBTF9DT1VOVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9rZXlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicmVzZXJ2ZWQiLCAudmFsID0gQkNNT0xUX0RFVklDRV9LRVlfSURfUkVTRVJWRUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2Vfa2V5X2lkID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBkZXZpY2Vfa2V5IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2Vfa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2RldmljZV9rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbm5pX3NwZWVkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImdicHNfMSIsIC52YWwgPSBCQ01PTFRfTk5JX1NQRUVEX0dCUFNfMSB9LCB7IC5uYW1lID0gImdicHNfMnA1IiwgLnZhbCA9IEJDTU9MVF9OTklfU1BFRURfR0JQU18yUDUgfSwgeyAubmFtZSA9ICJnYnBzXzEwIiwgLnZhbCA9IEJDTU9MVF9OTklfU1BFRURfR0JQU18xMCB9LCB7IC5uYW1lID0gImdicHNfMTJwNSIsIC52YWwgPSBCQ01PTFRfTk5JX1NQRUVEX0dCUFNfMTJQNSB9LCB7IC5uYW1lID0gImdicHNfMTBfZ19tdXgiLCAudmFsID0gQkNNT0xUX05OSV9TUEVFRF9HQlBTXzEwX0dfTVVYIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbm5pX3NwZWVkID0geyAubmFtZSA9ICJiY21vbHRfbm5pX3NwZWVkIiwgLmRlc2NyID0gIk5ldHdvcmsgaW50ZXJmYWNlIHNwZWVkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X25uaV9zcGVlZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ubmlfc3BlZWRfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9ubmlfc3BlZWRfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZmlyc3RfaGFsZiIsIC5kZXNjciA9ICJJbnRlcmZhY2Ugc3BlZWQgZm9yIHRoZSBmaXJzdCBoYWxmIG9mIHRoZSBOTkkgcG9ydHMgb24gdGhlIHN5c3RlbS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9ubmlfc3BlZWQsIGZpcnN0X2hhbGYpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfc3BlZWQgfSwgeyAubmFtZSA9ICJzZWNvbmRfaGFsZiIsIC5kZXNjciA9ICJJbnRlcmZhY2Ugc3BlZWQgZm9yIHRoZSBzZWNvbmQgaGFsZiBvZiB0aGUgTk5JIHBvcnRzIG9uIHRoZSBzeXN0ZW0uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2Vfbm5pX3NwZWVkLCBzZWNvbmRfaGFsZiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X25uaV9zcGVlZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9ubmlfc3BlZWQgPSB7IC5uYW1lID0gImJjbW9sdF9kZXZpY2Vfbm5pX3NwZWVkIiwgLmRlc2NyID0gIkRldmljZSBOTkkgU3BlZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX25uaV9zcGVlZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2Vfbm5pX3NwZWVkX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9ubmlfc3BlZWRfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2VfcmVzZXRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibW9kZSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX1JFU0VUX0lEX01PREUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfcmVzZXRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9kZXZpY2VfcmVzZXRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGV2aWNlX3Jlc2V0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2VfcmVzZXRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZGV2aWNlX3Jlc2V0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9yZXNldF9tb2RlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImRldmljZSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX1JFU0VUX01PREVfREVWSUNFIH0sIHsgLm5hbWUgPSAiaG9zdCIsIC52YWwgPSBCQ01PTFRfREVWSUNFX1JFU0VUX01PREVfSE9TVCB9LCB7IC5uYW1lID0gImFsbCIsIC52YWwgPSBCQ01PTFRfREVWSUNFX1JFU0VUX01PREVfQUxMIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX3Jlc2V0X21vZGUgPSB7IC5uYW1lID0gImJjbW9sdF9kZXZpY2VfcmVzZXRfbW9kZSIsIC5kZXNjciA9ICJPcHRpb25zIGZvciB0aGUgcmVzZXQgb3BlcmF0aW9uLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2VfcmVzZXRfbW9kZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9kZXZpY2VfcmVzZXRfbW9kZV9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNwdSIsIC52YWwgPSBCQ01PTFRfREVWSUNFX1JVTl9ERFJfVEVTVF9JRF9DUFUgfSwgeyAubmFtZSA9ICJyYXNfMCIsIC52YWwgPSBCQ01PTFRfREVWSUNFX1JVTl9ERFJfVEVTVF9JRF9SQVNfMCB9LCB7IC5uYW1lID0gInJhc18xIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfUlVOX0REUl9URVNUX0lEX1JBU18xIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZGV2aWNlX3J1bl9kZHJfdGVzdCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9zdGF0ZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJkaXNjb25uZWN0ZWQiLCAudmFsID0gQkNNT0xUX0RFVklDRV9TVEFURV9ESVNDT05ORUNURUQgfSwgeyAubmFtZSA9ICJjb25uZWN0aW5nIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfU1RBVEVfQ09OTkVDVElORyB9LCB7IC5uYW1lID0gInJlYWR5IiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfU1RBVEVfUkVBRFkgfSwgeyAubmFtZSA9ICJ3YWl0aW5nX2Zvcl9kZXZpY2UiLCAudmFsID0gQkNNT0xUX0RFVklDRV9TVEFURV9XQUlUSU5HX0ZPUl9ERVZJQ0UgfSwgeyAubmFtZSA9ICJ0ZXN0aW5nX2RkciIsIC52YWwgPSBCQ01PTFRfREVWSUNFX1NUQVRFX1RFU1RJTkdfRERSIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX3N0YXRlID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX3N0YXRlIiwgLmRlc2NyID0gIlRoZSBvdmVyYWxsIHN0YXRlIG9mIHRoZSBob3N0J3MgY29ubmVjdGlvbiB0byB0aGUgZGV2aWNlLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2Vfc3RhdGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZGV2aWNlX3N0YXRlX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9zd19lcnJvcl9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJ0YXNrX25hbWUiLCAudmFsID0gQkNNT0xUX0RFVklDRV9TV19FUlJPUl9JRF9UQVNLX05BTUUgfSwgeyAubmFtZSA9ICJmaWxlX25hbWUiLCAudmFsID0gQkNNT0xUX0RFVklDRV9TV19FUlJPUl9JRF9GSUxFX05BTUUgfSwgeyAubmFtZSA9ICJsaW5lX251bWJlciIsIC52YWwgPSBCQ01PTFRfREVWSUNFX1NXX0VSUk9SX0lEX0xJTkVfTlVNQkVSIH0sIHsgLm5hbWUgPSAicG9uX25pIiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfU1dfRVJST1JfSURfUE9OX05JIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX3N3X2Vycm9yX2lkID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGRldmljZV9zd19lcnJvciBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2RldmljZV9zd19lcnJvcl9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNwdV9pZCIsIC52YWwgPSBCQ01PTFRfREVWSUNFX1NXX0VYQ0VQVElPTl9JRF9DUFVfSUQgfSwgeyAubmFtZSA9ICJ0ZXh0IiwgLnZhbCA9IEJDTU9MVF9ERVZJQ0VfU1dfRVhDRVBUSU9OX0lEX1RFWFQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2lkID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBkZXZpY2Vfc3dfZXhjZXB0aW9uIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25faWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGV2aWNlX3N3X3VwZ3JhZGVfYWN0aXZhdGVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX3N3X3VwZ3JhZGVfYWN0aXZhdGVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9kZXZpY2Vfc3dfdXBncmFkZV9hY3RpdmF0ZV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBkZXZpY2Vfc3dfdXBncmFkZV9hY3RpdmF0ZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX3N3X3VwZ3JhZGVfYWN0aXZhdGVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZGV2aWNlX3N3X3VwZ3JhZGVfYWN0aXZhdGVfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2NvbnRyb2xfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAidW5pY2FzdF9kaXNhYmxlIiwgLnZhbCA9IEJDTU9MVF9ESVNBQkxFX1NFUklBTF9OVU1CRVJfQ09OVFJPTF9VTklDQVNUX0RJU0FCTEUgfSwgeyAubmFtZSA9ICJ1bmljYXN0X2VuYWJsZSIsIC52YWwgPSBCQ01PTFRfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0NPTlRST0xfVU5JQ0FTVF9FTkFCTEUgfSwgeyAubmFtZSA9ICJicm9hZGNhc3RfZW5hYmxlIiwgLnZhbCA9IEJDTU9MVF9ESVNBQkxFX1NFUklBTF9OVU1CRVJfQ09OVFJPTF9CUk9BRENBU1RfRU5BQkxFIH0sIHsgLm5hbWUgPSAiYnJvYWRjYXN0X2Rpc2FibGUiLCAudmFsID0gQkNNT0xUX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9DT05UUk9MX0JST0FEQ0FTVF9ESVNBQkxFIH0sIHsgLm5hbWUgPSAiZGlzYWJsZV9kaXNjb3ZlcnkiLCAudmFsID0gQkNNT0xUX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9DT05UUk9MX0RJU0FCTEVfRElTQ09WRVJZIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2NvbnRyb2wgPSB7IC5uYW1lID0gImJjbW9sdF9kaXNhYmxlX3NlcmlhbF9udW1iZXJfY29udHJvbCIsIC5kZXNjciA9ICJEaXNhYmxlIFNlcmlhbCBOdW1iZXIgQ29udHJvbCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kaXNhYmxlX3NlcmlhbF9udW1iZXJfY29udHJvbCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9kaXNhYmxlX3NlcmlhbF9udW1iZXJfY29udHJvbF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kcnZfaWNmX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImlkeDAiLCAudmFsID0gQkNNT0xUX0RSVl9JQ0ZfSURfSURYMCB9LCB7IC5uYW1lID0gImlkeDEiLCAudmFsID0gQkNNT0xUX0RSVl9JQ0ZfSURfSURYMSB9LCB7IC5uYW1lID0gImlkeDIiLCAudmFsID0gQkNNT0xUX0RSVl9JQ0ZfSURfSURYMiB9LCB7IC5uYW1lID0gImlkeDMiLCAudmFsID0gQkNNT0xUX0RSVl9JQ0ZfSURfSURYMyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Rydl9pY2ZfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9kcnZfaWNmX2lkIiwgLmRlc2NyID0gImRydl9pY2ZfaWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZHJ2X2ljZl9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9kcnZfaWNmX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Rydl9zZ2JfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiaWR4MCIsIC52YWwgPSBCQ01PTFRfRFJWX1NHQl9JRF9JRFgwIH0sIHsgLm5hbWUgPSAiaWR4MSIsIC52YWwgPSBCQ01PTFRfRFJWX1NHQl9JRF9JRFgxIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZHJ2X3NnYl9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Rydl9zZ2JfaWQiLCAuZGVzY3IgPSAiZHJ2X3NnYl9pZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kcnZfc2diX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Rydl9zZ2JfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZHNfdmxhbl9hY3Rpb25fc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicmVtb3ZlIiwgLnZhbCA9IEJDTU9MVF9EU19WTEFOX0FDVElPTl9SRU1PVkUgfSwgeyAubmFtZSA9ICJ0cmFuc3BhcmVudCIsIC52YWwgPSBCQ01PTFRfRFNfVkxBTl9BQ1RJT05fVFJBTlNQQVJFTlQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kc192bGFuX2FjdGlvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X2RzX3ZsYW5fYWN0aW9uIiwgLmRlc2NyID0gIkRTIFZMQU4gYWN0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RzX3ZsYW5fYWN0aW9uKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2RzX3ZsYW5fYWN0aW9uX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3RmYl90cmFwX2JlaGF2aW9yX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImRyb3AiLCAudmFsID0gQkNNT0xUX1RGQl9UUkFQX0JFSEFWSU9SX0RST1AgfSwgeyAubmFtZSA9ICJmb3J3YXJkX25uaSIsIC52YWwgPSBCQ01PTFRfVEZCX1RSQVBfQkVIQVZJT1JfRk9SV0FSRF9OTkkgfSwgeyAubmFtZSA9ICJmb3J3YXJkX2NwdSIsIC52YWwgPSBCQ01PTFRfVEZCX1RSQVBfQkVIQVZJT1JfRk9SV0FSRF9DUFUgfSwgeyAubmFtZSA9ICJzbm9vcCIsIC52YWwgPSBCQ01PTFRfVEZCX1RSQVBfQkVIQVZJT1JfU05PT1AgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF90ZmJfdHJhcF9iZWhhdmlvciA9IHsgLm5hbWUgPSAiYmNtb2x0X3RmYl90cmFwX2JlaGF2aW9yIiwgLmRlc2NyID0gIlRGQiBUcmFwIEJlaGF2aW9yIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3RmYl90cmFwX2JlaGF2aW9yKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3RmYl90cmFwX2JlaGF2aW9yX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3RmYl9tb2RlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImdwb24iLCAudmFsID0gQkNNT0xUX1RGQl9NT0RFX0dQT04gfSwgeyAubmFtZSA9ICJ4Z3BvbiIsIC52YWwgPSBCQ01PTFRfVEZCX01PREVfWEdQT04gfSwgeyAubmFtZSA9ICJlcG9uIiwgLnZhbCA9IEJDTU9MVF9URkJfTU9ERV9FUE9OIH0sIHsgLm5hbWUgPSAieGVwb24iLCAudmFsID0gQkNNT0xUX1RGQl9NT0RFX1hFUE9OIH0sIHsgLm5hbWUgPSAiY29leCIsIC52YWwgPSBCQ01PTFRfVEZCX01PREVfQ09FWCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3RmYl9tb2RlID0geyAubmFtZSA9ICJiY21vbHRfdGZiX21vZGUiLCAuZGVzY3IgPSAiVEZCIE1vZGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfdGZiX21vZGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfdGZiX21vZGVfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbGltX3NlY19tb2RlX3VwX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInRlayIsIC52YWwgPSBCQ01PTFRfTElNX1NFQ19NT0RFX1VQX1RFSyB9LCB7IC5uYW1lID0gInBlcl9sbGlkIiwgLnZhbCA9IEJDTU9MVF9MSU1fU0VDX01PREVfVVBfUEVSX0xMSUQgfSwgeyAubmFtZSA9ICJudHQiLCAudmFsID0gQkNNT0xUX0xJTV9TRUNfTU9ERV9VUF9OVFQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9saW1fc2VjX21vZGVfdXAgPSB7IC5uYW1lID0gImJjbW9sdF9saW1fc2VjX21vZGVfdXAiLCAuZGVzY3IgPSAiTElNIFNFQyBNb2RlIFVwIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2xpbV9zZWNfbW9kZV91cCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9saW1fc2VjX21vZGVfdXBfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbGltX3NlY19tb2RlX2RuX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInRlayIsIC52YWwgPSBCQ01PTFRfTElNX1NFQ19NT0RFX0ROX1RFSyB9LCB7IC5uYW1lID0gInBlcl9sbGlkIiwgLnZhbCA9IEJDTU9MVF9MSU1fU0VDX01PREVfRE5fUEVSX0xMSUQgfSwgeyAubmFtZSA9ICJudHQiLCAudmFsID0gQkNNT0xUX0xJTV9TRUNfTU9ERV9ETl9OVFQgfSwgeyAubmFtZSA9ICJjZXBvbiIsIC52YWwgPSBCQ01PTFRfTElNX1NFQ19NT0RFX0ROX0NFUE9OIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbGltX3NlY19tb2RlX2RuID0geyAubmFtZSA9ICJiY21vbHRfbGltX3NlY19tb2RlX2RuIiwgLmRlc2NyID0gIkxJTSBTRUMgTW9kZSBEbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9saW1fc2VjX21vZGVfZG4pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbGltX3NlY19tb2RlX2RuX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hpbV9zZWNfbW9kZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJyZXNlcnZlZF8wIiwgLnZhbCA9IEJDTU9MVF9YSU1fU0VDX01PREVfUkVTRVJWRURfMCB9LCB7IC5uYW1lID0gInBlcl9sbGlkIiwgLnZhbCA9IEJDTU9MVF9YSU1fU0VDX01PREVfUEVSX0xMSUQgfSwgeyAubmFtZSA9ICJyZXNlcnZlZF8yIiwgLnZhbCA9IEJDTU9MVF9YSU1fU0VDX01PREVfUkVTRVJWRURfMiB9LCB7IC5uYW1lID0gImNlcG9uIiwgLnZhbCA9IEJDTU9MVF9YSU1fU0VDX01PREVfQ0VQT04gfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94aW1fc2VjX21vZGUgPSB7IC5uYW1lID0gImJjbW9sdF94aW1fc2VjX21vZGUiLCAuZGVzY3IgPSAiWElNIFNFQyBNb2RlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hpbV9zZWNfbW9kZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94aW1fc2VjX21vZGVfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfaHNjX3JhbV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJsbGNfdDEiLCAudmFsID0gQkNNT0xUX0hTQ19SQU1fTExDX1QxIH0sIHsgLm5hbWUgPSAibGxjX3QyIiwgLnZhbCA9IEJDTU9MVF9IU0NfUkFNX0xMQ19UMiB9LCB7IC5uYW1lID0gImxsY190MyIsIC52YWwgPSBCQ01PTFRfSFNDX1JBTV9MTENfVDMgfSwgeyAubmFtZSA9ICJncnBfdDIiLCAudmFsID0gQkNNT0xUX0hTQ19SQU1fR1JQX1QyIH0sIHsgLm5hbWUgPSAiZ3JwX3QzIiwgLnZhbCA9IEJDTU9MVF9IU0NfUkFNX0dSUF9UMyB9LCB7IC5uYW1lID0gInNocF90MSIsIC52YWwgPSBCQ01PTFRfSFNDX1JBTV9TSFBfVDEgfSwgeyAubmFtZSA9ICJzaHBfdDIiLCAudmFsID0gQkNNT0xUX0hTQ19SQU1fU0hQX1QyIH0sIHsgLm5hbWUgPSAic2hwX3QzIiwgLnZhbCA9IEJDTU9MVF9IU0NfUkFNX1NIUF9UMyB9LCB7IC5uYW1lID0gInByZl90MSIsIC52YWwgPSBCQ01PTFRfSFNDX1JBTV9QUkZfVDEgfSwgeyAubmFtZSA9ICJwcmZfdDIiLCAudmFsID0gQkNNT0xUX0hTQ19SQU1fUFJGX1QyIH0sIHsgLm5hbWUgPSAicHJmX3QzIiwgLnZhbCA9IEJDTU9MVF9IU0NfUkFNX1BSRl9UMyB9LCB7IC5uYW1lID0gImNyZV90MSIsIC52YWwgPSBCQ01PTFRfSFNDX1JBTV9DUkVfVDEgfSwgeyAubmFtZSA9ICJjcmVfdDIiLCAudmFsID0gQkNNT0xUX0hTQ19SQU1fQ1JFX1QyIH0sIHsgLm5hbWUgPSAiY3JlX3QzIiwgLnZhbCA9IEJDTU9MVF9IU0NfUkFNX0NSRV9UMyB9LCB7IC5uYW1lID0gImVsdSIsIC52YWwgPSBCQ01PTFRfSFNDX1JBTV9FTFUgfSwgeyAubmFtZSA9ICJwdHJfdDEiLCAudmFsID0gQkNNT0xUX0hTQ19SQU1fUFRSX1QxIH0sIHsgLm5hbWUgPSAicHRyX3QyIiwgLnZhbCA9IEJDTU9MVF9IU0NfUkFNX1BUUl9UMiB9LCB7IC5uYW1lID0gImFncl9zaHBfdDEiLCAudmFsID0gQkNNT0xUX0hTQ19SQU1fQUdSX1NIUF9UMSB9LCB7IC5uYW1lID0gImFlbSIsIC52YWwgPSBCQ01PTFRfSFNDX1JBTV9BRU0gfSwgeyAubmFtZSA9ICJhbGxfbGxjIiwgLnZhbCA9IEJDTU9MVF9IU0NfUkFNX0FMTF9MTEMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9oc2NfcmFtID0geyAubmFtZSA9ICJiY21vbHRfaHNjX3JhbSIsIC5kZXNjciA9ICJIU0MgUkFNIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2hzY19yYW0pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfaHNjX3JhbV9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9saW1fcmFtX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImxsaWRfdXAiLCAudmFsID0gQkNNT0xUX0xJTV9SQU1fTExJRF9VUCB9LCB7IC5uYW1lID0gInBlcl9vbnVfc3RhdCIsIC52YWwgPSBCQ01PTFRfTElNX1JBTV9QRVJfT05VX1NUQVQgfSwgeyAubmFtZSA9ICJmZWNfdXBfZnVsbF9zIiwgLnZhbCA9IEJDTU9MVF9MSU1fUkFNX0ZFQ19VUF9GVUxMX1MgfSwgeyAubmFtZSA9ICJmZWNfdXBfZGF0YSIsIC52YWwgPSBCQ01PTFRfTElNX1JBTV9GRUNfVVBfREFUQSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xpbV9yYW0gPSB7IC5uYW1lID0gImJjbW9sdF9saW1fcmFtIiwgLmRlc2NyID0gIkxJTSBSQU0iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbGltX3JhbSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9saW1fcmFtX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2xreV9yYW1fc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAidHhfa2V5X3JhbSIsIC52YWwgPSBCQ01PTFRfTEtZX1JBTV9UWF9LRVlfUkFNIH0sIHsgLm5hbWUgPSAidHhfa2V5X2J1ZmZlciIsIC52YWwgPSBCQ01PTFRfTEtZX1JBTV9UWF9LRVlfQlVGRkVSIH0sIHsgLm5hbWUgPSAicnhfa2V5X3JhbSIsIC52YWwgPSBCQ01PTFRfTEtZX1JBTV9SWF9LRVlfUkFNIH0sIHsgLm5hbWUgPSAicnhfa2V5X2J1ZmZlciIsIC52YWwgPSBCQ01PTFRfTEtZX1JBTV9SWF9LRVlfQlVGRkVSIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbGt5X3JhbSA9IHsgLm5hbWUgPSAiYmNtb2x0X2xreV9yYW0iLCAuZGVzY3IgPSAiTEtZIFJBTSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9sa3lfcmFtKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2xreV9yYW1fc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbWljX3JhbV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJyYW5nZSIsIC52YWwgPSBCQ01PTFRfTUlDX1JBTV9SQU5HRSB9LCB7IC5uYW1lID0gImxsaWQiLCAudmFsID0gQkNNT0xUX01JQ19SQU1fTExJRCB9LCB7IC5uYW1lID0gImluZGV4IiwgLnZhbCA9IEJDTU9MVF9NSUNfUkFNX0lEWCB9LCB7IC5uYW1lID0gImdyYW50X21pc3MiLCAudmFsID0gQkNNT0xUX01JQ19SQU1fR1JBTlRfTUlTUyB9LCB7IC5uYW1lID0gImdyYW50X2lkIiwgLnZhbCA9IEJDTU9MVF9NSUNfUkFNX0dSQU5UX0lEIH0sIHsgLm5hbWUgPSAidHhfaXYiLCAudmFsID0gQkNNT0xUX01JQ19SQU1fVFhfSVYgfSwgeyAubmFtZSA9ICJyeF9pdiIsIC52YWwgPSBCQ01PTFRfTUlDX1JBTV9SWF9JViB9LCB7IC5uYW1lID0gInR4X3BvcnRfc3RhdCIsIC52YWwgPSBCQ01PTFRfTUlDX1JBTV9UWF9QT1JUX1NUQVQgfSwgeyAubmFtZSA9ICJyeF9wb3J0X3N0YXQiLCAudmFsID0gQkNNT0xUX01JQ19SQU1fUlhfUE9SVF9TVEFUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbWljX3JhbSA9IHsgLm5hbWUgPSAiYmNtb2x0X21pY19yYW0iLCAuZGVzY3IgPSAiTUlDIFJBTSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9taWNfcmFtKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X21pY19yYW1fc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeHBjc3JtX3JhbV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJjYXB0dXJlX2ZpZm8iLCAudmFsID0gQkNNT0xUX1hQQ1NSTV9SQU1fQ0FQVFVSRV9GSUZPIH0sIHsgLm5hbWUgPSAiZmVjX2RlY29kZSIsIC52YWwgPSBCQ01PTFRfWFBDU1JNX1JBTV9GRUNfREVDT0RFIH0sIHsgLm5hbWUgPSAiZmVjX3N0YXRzIiwgLnZhbCA9IEJDTU9MVF9YUENTUk1fUkFNX0ZFQ19TVEFUUyB9LCB7IC5uYW1lID0gImZlY19lbnF1ZXVlIiwgLnZhbCA9IEJDTU9MVF9YUENTUk1fUkFNX0ZFQ19FTlFVRVVFIH0sIHsgLm5hbWUgPSAiaWRsZV9pbnNlcnQiLCAudmFsID0gQkNNT0xUX1hQQ1NSTV9SQU1fSURMRV9JTlNFUlQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94cGNzcm1fcmFtID0geyAubmFtZSA9ICJiY21vbHRfeHBjc3JtX3JhbSIsIC5kZXNjciA9ICJYUENTUk0gUkFNIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hwY3NybV9yYW0pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeHBjc3JtX3JhbV9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZHVtbXlfc3RydWN0X2Zvcl9lbWJlZGRlZF90eXBlc19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhZCIsIC5kZXNjciA9ICJhZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZHVtbXlfc3RydWN0X2Zvcl9lbWJlZGRlZF90eXBlcywgYWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJldCIsIC5kZXNjciA9ICJldCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZHVtbXlfc3RydWN0X2Zvcl9lbWJlZGRlZF90eXBlcywgZXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJlbGciLCAuZGVzY3IgPSAiZWxnIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kdW1teV9zdHJ1Y3RfZm9yX2VtYmVkZGVkX3R5cGVzLCBlbGcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJkYmFfcG9ydCIsIC5kZXNjciA9ICJkYmEgcG9ydCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZHVtbXlfc3RydWN0X2Zvcl9lbWJlZGRlZF90eXBlcywgZGJhX3BvcnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJzZ2IiLCAuZGVzY3IgPSAic2diIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kdW1teV9zdHJ1Y3RfZm9yX2VtYmVkZGVkX3R5cGVzLCBzZ2IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9kcnZfc2diX2lkIH0sIHsgLm5hbWUgPSAiaWNmIiwgLmRlc2NyID0gImljZiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZHVtbXlfc3RydWN0X2Zvcl9lbWJlZGRlZF90eXBlcywgaWNmKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZHJ2X2ljZl9pZCB9LCB7IC5uYW1lID0gInRmYl90cmFwX2JlaGF2aW9yIiwgLmRlc2NyID0gInRmYiB0cmFwIGJlaGF2aW9yIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kdW1teV9zdHJ1Y3RfZm9yX2VtYmVkZGVkX3R5cGVzLCB0ZmJfdHJhcF9iZWhhdmlvciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3RmYl90cmFwX2JlaGF2aW9yIH0sIHsgLm5hbWUgPSAidGZiX21vZGUiLCAuZGVzY3IgPSAidGZiIG1vZGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2R1bW15X3N0cnVjdF9mb3JfZW1iZWRkZWRfdHlwZXMsIHRmYl9tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdGZiX21vZGUgfSwgeyAubmFtZSA9ICJsaW1fc2VjX21vZGVfdXAiLCAuZGVzY3IgPSAibGltIHNlYyBtb2RlIHVwIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kdW1teV9zdHJ1Y3RfZm9yX2VtYmVkZGVkX3R5cGVzLCBsaW1fc2VjX21vZGVfdXApLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9saW1fc2VjX21vZGVfdXAgfSwgeyAubmFtZSA9ICJsaW1fc2VjX21vZGVfZG4iLCAuZGVzY3IgPSAibGltIHNlYyBtb2RlIGRuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kdW1teV9zdHJ1Y3RfZm9yX2VtYmVkZGVkX3R5cGVzLCBsaW1fc2VjX21vZGVfZG4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9saW1fc2VjX21vZGVfZG4gfSwgeyAubmFtZSA9ICJ4aW1fc2VjX21vZGUiLCAuZGVzY3IgPSAieGltIHNlYyBtb2RlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kdW1teV9zdHJ1Y3RfZm9yX2VtYmVkZGVkX3R5cGVzLCB4aW1fc2VjX21vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94aW1fc2VjX21vZGUgfSwgeyAubmFtZSA9ICJkYmFfcmFtIiwgLmRlc2NyID0gImRiYSByYW0iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2R1bW15X3N0cnVjdF9mb3JfZW1iZWRkZWRfdHlwZXMsIGRiYV9yYW0pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9kYmFfcmFtIH0sIHsgLm5hbWUgPSAiaHNjX3JhbSIsIC5kZXNjciA9ICJoc2MgcmFtIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kdW1teV9zdHJ1Y3RfZm9yX2VtYmVkZGVkX3R5cGVzLCBoc2NfcmFtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfaHNjX3JhbSB9LCB7IC5uYW1lID0gImxpbV9yYW0iLCAuZGVzY3IgPSAibGltIHJhbSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZHVtbXlfc3RydWN0X2Zvcl9lbWJlZGRlZF90eXBlcywgbGltX3JhbSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2xpbV9yYW0gfSwgeyAubmFtZSA9ICJsa3lfcmFtIiwgLmRlc2NyID0gImxreSByYW0iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2R1bW15X3N0cnVjdF9mb3JfZW1iZWRkZWRfdHlwZXMsIGxreV9yYW0pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9sa3lfcmFtIH0sIHsgLm5hbWUgPSAibWljX3JhbSIsIC5kZXNjciA9ICJtaWMgcmFtIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kdW1teV9zdHJ1Y3RfZm9yX2VtYmVkZGVkX3R5cGVzLCBtaWNfcmFtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbWljX3JhbSB9LCB7IC5uYW1lID0gInhwY3NfcmFtIiwgLmRlc2NyID0gInhwY3MgcmFtIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kdW1teV9zdHJ1Y3RfZm9yX2VtYmVkZGVkX3R5cGVzLCB4cGNzX3JhbSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hwY3NybV9yYW0gfSwgeyAubmFtZSA9ICJ4ZzJnX2lkIiwgLmRlc2NyID0gInhnMmcgaWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2R1bW15X3N0cnVjdF9mb3JfZW1iZWRkZWRfdHlwZXMsIHhnMmdfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kdW1teV9zdHJ1Y3RfZm9yX2VtYmVkZGVkX3R5cGVzID0geyAubmFtZSA9ICJiY21vbHRfZHVtbXlfc3RydWN0X2Zvcl9lbWJlZGRlZF90eXBlcyIsIC5kZXNjciA9ICJEdW1teSBTdHJ1Y3QgRm9yIEVtYmVkZGVkIFR5cGVzIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2R1bW15X3N0cnVjdF9mb3JfZW1iZWRkZWRfdHlwZXMpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZHVtbXlfc3RydWN0X2Zvcl9lbWJlZGRlZF90eXBlc19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9kdW1teV9zdHJ1Y3RfZm9yX2VtYmVkZGVkX3R5cGVzX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZW1iZWRkZWRfaW1hZ2VfdHJhbnNmZXJfc3RhdHVzX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm5vbmUiLCAudmFsID0gQkNNT0xUX0VNQkVEREVEX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19OT05FIH0sIHsgLm5hbWUgPSAiaW5fcHJvZ3Jlc3MiLCAudmFsID0gQkNNT0xUX0VNQkVEREVEX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19JTl9QUk9HUkVTUyB9LCB7IC5uYW1lID0gInN1Y2Nlc3MiLCAudmFsID0gQkNNT0xUX0VNQkVEREVEX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19TVUNDRVNTIH0sIHsgLm5hbWUgPSAiZmFpbHVyZSIsIC52YWwgPSBCQ01PTFRfRU1CRURERURfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX0ZBSUxVUkUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lbWJlZGRlZF9pbWFnZV90cmFuc2Zlcl9zdGF0dXMgPSB7IC5uYW1lID0gImJjbW9sdF9lbWJlZGRlZF9pbWFnZV90cmFuc2Zlcl9zdGF0dXMiLCAuZGVzY3IgPSAiZW1iZWRkZWQgaW1hZ2UgdHJhbnNmZXIgc3RhdHVzIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2VtYmVkZGVkX2ltYWdlX3RyYW5zZmVyX3N0YXR1cyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lbWJlZGRlZF9pbWFnZV90cmFuc2Zlcl9zdGF0dXNfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1Igc3RyaW5nXzY0ID0geyAubmFtZSA9ICJzdHJpbmdbNjRdIiwgLmRlc2NyID0gIkFTQ0lJIHN0cmluZyB3aXRoIG1heCBsZW5ndGggNjQiLCAuc2l6ZSA9IHNpemVvZihjaGFyWzY0XSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUklORyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnlfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiaW1hZ2VfdHlwZSIsIC5kZXNjciA9ICJUeXBlIG9mIHRoZSBlbWJlZGRlZCBmaWxlIGltYWdlLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnksIGltYWdlX3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfaW1hZ2VfdHlwZSB9LCB7IC5uYW1lID0gImltYWdlX3NpemUiLCAuZGVzY3IgPSAiU2l6ZSBvZiB0aGUgZW1iZWRkZWQgZmlsZSBpbWFnZS4gIFVuaXQgaXMgYnl0ZXMuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeSwgaW1hZ2Vfc2l6ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJjcmMzMiIsIC5kZXNjciA9ICJDUkMgMzIgY2hlY2tzdW0gb2YgZW50aXJlIGZpbGUgaW1hZ2UgZGF0YS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5LCBjcmMzMiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3RfaGV4IH0sIHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gIkltYWdlIHRyYW5zZmVyIHN0YXR1cy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5LCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lbWJlZGRlZF9pbWFnZV90cmFuc2Zlcl9zdGF0dXMgfSwgeyAubmFtZSA9ICJpbWFnZV9uYW1lIiwgLmRlc2NyID0gIk5hbWUgb2YgdGhlIGZpbGUgaW1hZ2UuICBOdWxsLXRlcm1pbmF0ZWQgc3RyaW5nLiAgVGhpcyBpcyByZXF1aXJlZCBmb3IgdGhlIERQb0UgT05VIG9ubHkuICBEUG9FIHJlcXVpcmVzIHRoZSB3cml0ZSByZXF1ZXN0IE9BTSBjb250YWlucyB0aGUgbmFtZSBvZiB0aGUgZmlsZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5LCBpbWFnZV9uYW1lKSwgLnR5cGUgPSAmc3RyaW5nXzY0IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnkgPSB7IC5uYW1lID0gImJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeSIsIC5kZXNjciA9ICJFbWJlZGRlZCBpbWFnZSBlbnRyeSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5X2xpc3RfdTggPSB7IC5uYW1lID0gImJjbW9sdF9lbWJlZGRlZF9pbWFnZV9lbnRyeV9saXN0X3U4IiwgLmRlc2NyID0gIlZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIGVtYmVkZGVkX2ltYWdlX2VudHJ5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5X2xpc3RfdTgpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRFlOLCAueCA9IHsgLmFycl9keW4gPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnksIC5sZW5fc2l6ZSA9IDEsIC5tYXhfc2l6ZSA9IERFRkFVTFRfRFlOX0FSUl9NQVhfU0laRSAvIHNpemVvZihiY21vbHRfZW1iZWRkZWRfaW1hZ2VfZW50cnkpIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2VuY3J5cHRpb25faW5mb3JtYXRpb25fZm9ybWF0X3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNmYiIsIC52YWwgPSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX0lORk9STUFUSU9OX0ZPUk1BVF9DRkIgfSwgeyAubmFtZSA9ICJjdHIiLCAudmFsID0gQkNNT0xUX0VQT05fRU5DUllQVElPTl9JTkZPUk1BVElPTl9GT1JNQVRfQ1RSIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2Zvcm1hdCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9mb3JtYXQiLCAuZGVzY3IgPSAiRVBPTiBFbmNyeXB0aW9uIGluZm9ybWF0aW9uIGZvcm1hdCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2VuY3J5cHRpb25faW5mb3JtYXRpb25fZm9ybWF0KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9mb3JtYXRfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImZvcm1hdCIsIC5kZXNjciA9ICJGb3JtYXQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyLCBmb3JtYXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2VuY3J5cHRpb25faW5mb3JtYXRpb25fZm9ybWF0IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyX2NmYl9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJrZXkiLCAuZGVzY3IgPSAiS2V5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lciwgdS5jZmIua2V5KSAtIG9mZnNldG9mKGJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lciwgdS5jZmIua2V5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90X2Fycl8xNiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyX2NmYiA9IHsgLm5hbWUgPSAiYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyX2NmYiIsIC5kZXNjciA9ICJFbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lciBDRkIiLCAuc2l6ZSA9IHNpemVvZigoKGJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lciAqKTApLT51LmNmYiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lcl9jZmJfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXJfY2ZiX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl91aW50OF90X2Fycl84ID0geyAubmFtZSA9ICJ1aW50OF90WzhdIiwgLmRlc2NyID0gIkFycmF5IG9mIDggZWxlbWVudHMgb2YgdHlwZSB1aW50OF90IiwgLnNpemUgPSBzaXplb2YodWludDhfdFs4XSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9GSVhFRCwgLnggPSB7IC5hcnJfZml4ZWQgPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90LCAuc2l6ZSA9IDggfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lcl9jdHJfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAia2V5IiwgLmRlc2NyID0gIktleSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXIsIHUuY3RyLmtleSkgLSBvZmZzZXRvZihiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXIsIHUuY3RyLmtleSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdF9hcnJfMTYgfSwgeyAubmFtZSA9ICJzY2kiLCAuZGVzY3IgPSAiU0NJIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lciwgdS5jdHIuc2NpKSAtIG9mZnNldG9mKGJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lciwgdS5jdHIua2V5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90X2Fycl84IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXJfY3RyID0geyAubmFtZSA9ICJiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXJfY3RyIiwgLmRlc2NyID0gIkVuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyIENUUiIsIC5zaXplID0gc2l6ZW9mKCgoYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyICopMCktPnUuY3RyKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyX2N0cl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lcl9jdHJfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXJfdW5pb25fZmllbGRzW10gPSB7IHsgLm5hbWUgPSAidS5jZmIiLCAuZGVzY3IgPSAiIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lciwgdS5jZmIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lcl9jZmIgfSwgeyAubmFtZSA9ICJ1LmN0ciIsIC5kZXNjciA9ICIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyLCB1LmN0ciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyX2N0ciB9LCB7IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXIgPSB7IC5uYW1lID0gImJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lciIsIC5kZXNjciA9ICJFbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lciIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lciksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1VOSU9OLCAueCA9IHsgLnUgPSB7IC5udW1fY29tbW9uX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lcl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5jb21tb25fZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXJfZmllbGRzLCAuY2xhc3NpZmllcl9pZHggPSAwLCAudW5pb25fZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXJfdW5pb25fZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lbmVyZ3lfZGV0ZWN0X3NvdXJjZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJpbnRlcm5hbCIsIC52YWwgPSBCQ01PTFRfRU5FUkdZX0RFVEVDVF9TT1VSQ0VfSU5URVJOQUwgfSwgeyAubmFtZSA9ICJ0cngiLCAudmFsID0gQkNNT0xUX0VORVJHWV9ERVRFQ1RfU09VUkNFX1RSWCB9LCB7IC5uYW1lID0gImJjZHIiLCAudmFsID0gQkNNT0xUX0VORVJHWV9ERVRFQ1RfU09VUkNFX0JDRFIgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lbmVyZ3lfZGV0ZWN0X3NvdXJjZSA9IHsgLm5hbWUgPSAiYmNtb2x0X2VuZXJneV9kZXRlY3Rfc291cmNlIiwgLmRlc2NyID0gImVuZXJneSBkZXRlY3Qgc291cmNlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2VuZXJneV9kZXRlY3Rfc291cmNlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2VuZXJneV9kZXRlY3Rfc291cmNlX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fMWdfdHVyYm9fbW9kZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJkaXNhYmxlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl8xR19UVVJCT19NT0RFX0RJU0FCTEVEIH0sIHsgLm5hbWUgPSAiZW5hYmxlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl8xR19UVVJCT19NT0RFX0VOQUJMRUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uXzFnX3R1cmJvX21vZGUgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uXzFnX3R1cmJvX21vZGUiLCAuZGVzY3IgPSAiRVBPTiB0dXJibyBtb2RlLiAgRW5hYmxlcyBkb3VibGUgZG93bnN0cmVhbSBzcGVlZCAoMkcpIG9uIDFHIEVQT04gTklzIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fMWdfdHVyYm9fbW9kZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uXzFnX3R1cmJvX21vZGVfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfbW9kZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJob3N0X2RyaXZlbiIsIC52YWwgPSBCQ01PTFRfRVBPTl9DTE9DS19UUkFOU1BPUlRfTU9ERV9IT1NUX0RSSVZFTiB9LCB7IC5uYW1lID0gImVtYmVkZGVkX2RyaXZlbiIsIC52YWwgPSBCQ01PTFRfRVBPTl9DTE9DS19UUkFOU1BPUlRfTU9ERV9FTUJFRERFRF9EUklWRU4gfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9tb2RlID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfbW9kZSIsIC5kZXNjciA9ICJFUE9OIENsb2NrIFRyYW5zcG9ydCBNb2RlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X21vZGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfbW9kZV9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfY29uZmlndXJhdGlvbl9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJlcG9uX2Nsb2NrX3RyYW5zcG9ydF9tb2RlIiwgLmRlc2NyID0gIkNsb2NrIFRyYW5zcG9ydCBtb2RlIG9uIHRoaXMgT0xUIFBPTiBQb3J0LiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfY29uZmlndXJhdGlvbiwgZXBvbl9jbG9ja190cmFuc3BvcnRfbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X21vZGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9jb25maWd1cmF0aW9uID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfY29uZmlndXJhdGlvbiIsIC5kZXNjciA9ICJFUE9OIGNsb2NrIHRyYW5zcG9ydCBjb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X2NvbmZpZ3VyYXRpb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfY29uZmlndXJhdGlvbl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2Nsb2NrX3RyYW5zcG9ydF9jb25maWd1cmF0aW9uX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9kYmFfcmVwb3J0aW5nX21vZGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic2llcG9uX2EiLCAudmFsID0gQkNNT0xUX0VQT05fREJBX1JFUE9SVElOR19NT0RFX1NJRVBPTl9BIH0sIHsgLm5hbWUgPSAic2llcG9uX2IiLCAudmFsID0gQkNNT0xUX0VQT05fREJBX1JFUE9SVElOR19NT0RFX1NJRVBPTl9CIH0sIHsgLm5hbWUgPSAic2llcG9uX2MiLCAudmFsID0gQkNNT0xUX0VQT05fREJBX1JFUE9SVElOR19NT0RFX1NJRVBPTl9DIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kYmFfcmVwb3J0aW5nX21vZGUgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2RiYV9yZXBvcnRpbmdfbW9kZSIsIC5kZXNjciA9ICJDb250cm9sIGZvciBob3cgdGhlIERCQSBoYW5kbGVzIHJlY2VpdmVkIE1QQ1AgcmVwb3J0IGZyYW1lcy4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kYmFfcmVwb3J0aW5nX21vZGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9kYmFfcmVwb3J0aW5nX21vZGVfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX3JhdGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAidGVuX3RlbiIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfVEVOX1RFTiB9LCB7IC5uYW1lID0gInRlbl9vbmUiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19SQVRFX1RFTl9PTkUgfSwgeyAubmFtZSA9ICJvbmVfb25lIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfUkFURV9PTkVfT05FIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3JhdGUgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfcmF0ZSIsIC5kZXNjciA9ICJFUE9OIGxpbmsgcmF0ZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfcmF0ZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2xpbmtfcmF0ZV9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9zdGF0dXNfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAib2ZmIiwgLnZhbCA9IEJDTU9MVF9TVEFUVVNfT0ZGIH0sIHsgLm5hbWUgPSAib24iLCAudmFsID0gQkNNT0xUX1NUQVRVU19PTiB9LCB7IC5uYW1lID0gIm5vX2NoYW5nZSIsIC52YWwgPSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyA9IHsgLm5hbWUgPSAiYmNtb2x0X3N0YXR1cyIsIC5kZXNjciA9ICJTdGF0dXMiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfc3RhdHVzKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3N0YXR1c19zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdW5rbm93bl9saW5rX3N0YXR1c19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJsaW5rX3JhdGUiLCAuZGVzY3IgPSAiVGhlIHJhdGUgb2YgdGhlIHVua25vd24gbGluayIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdW5rbm93bl9saW5rX3N0YXR1cywgbGlua19yYXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3JhdGUgfSwgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiV2hldGhlciB0aGUgdW5rbm93biBsaW5rIGFsYXJtIGlzIHJhaXNlZCBvciBjbGVhcmVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdW5rbm93bl9saW5rX3N0YXR1cywgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdW5rbm93bl9saW5rX3N0YXR1cyA9IHsgLm5hbWUgPSAiYmNtb2x0X3Vua25vd25fbGlua19zdGF0dXMiLCAuZGVzY3IgPSAiRGF0YSBvZiB1bmtub3duIGxpbmssIGluY2x1ZGluZyByYXRlIGFuZCBhbGFybSBzdGF0dXMiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfdW5rbm93bl9saW5rX3N0YXR1cyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF91bmtub3duX2xpbmtfc3RhdHVzX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3Vua25vd25fbGlua19zdGF0dXNfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbGFzZXJfb25fb2ZmX3N0YXR1c19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJsYXNlcl9vbl90aW1lIiwgLmRlc2NyID0gIlRoZSBsYXNlciBvbiB0aW1lIG9mIHRoZSBPTlUgdGhhdCBpcyB2aW9sYXRpbmcuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sYXNlcl9vbl9vZmZfc3RhdHVzLCBsYXNlcl9vbl90aW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImxhc2VyX29mZl90aW1lIiwgLmRlc2NyID0gIlRoZSBsYXNlciBvZmYgdGltZSBvZiB0aGUgT05VIHRoYXQgaXMgdmlvbGF0aW5nLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbGFzZXJfb25fb2ZmX3N0YXR1cywgbGFzZXJfb2ZmX3RpbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gIldoZXRoZXIgdGhlIGxhc2VyIG9uL29mZiB2aW9sYXRpb24gYWxhcm0gaXMgcmFpc2VkIG9yIGNsZWFyZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sYXNlcl9vbl9vZmZfc3RhdHVzLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sYXNlcl9vbl9vZmZfc3RhdHVzID0geyAubmFtZSA9ICJiY21vbHRfbGFzZXJfb25fb2ZmX3N0YXR1cyIsIC5kZXNjciA9ICJEYXRhIG9mIGxhc2VyIG9uL29mZiB2aW9sYXRpbmcgbGluaywgaW5jbHVkaW5nIGF0dGVtcHRlZCBsYXNlciBvbiB0aW1lLCBhdHRlbXB0ZWQgbGFzZXIgb2ZmIHRpbWUsIGFuZCBhbGFybSBzdGF0dXMuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2xhc2VyX29uX29mZl9zdGF0dXMpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfbGFzZXJfb25fb2ZmX3N0YXR1c19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9sYXNlcl9vbl9vZmZfc3RhdHVzX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3JhbmdlX3N0YXR1c19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyYW5nZSIsIC5kZXNjciA9ICJUaGUgcmFuZ2UgdGhhdCB0aGUgdmlvbGF0aW5nIGxpbmsgYXR0ZW1wdGVkIHRvIHJlZ2lzdGVyIGF0LiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcmFuZ2Vfc3RhdHVzLCByYW5nZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiV2hldGhlciB0aGUgcmFuZ2UgdmlvbGF0aW9uIGFsYXJtIGlzIHJhaXNlZCBvciBjbGVhcmVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcmFuZ2Vfc3RhdHVzLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9yYW5nZV9zdGF0dXMgPSB7IC5uYW1lID0gImJjbW9sdF9yYW5nZV9zdGF0dXMiLCAuZGVzY3IgPSAiRGF0YSBvZiByYW5nZSB2aW9sYXRpbmcgbGluaywgaW5jbHVkaW5nIHRoZSByYW5nZSBpdCBhdHRlbXB0ZWQgdG8gdXNlLCBhbmQgYWxhcm0gc3RhdHVzLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9yYW5nZV9zdGF0dXMpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfcmFuZ2Vfc3RhdHVzX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3JhbmdlX3N0YXR1c19maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9zdGF0dXNfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZGVuaWVkX2xsaWQiLCAuZGVzY3IgPSAiTExJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcm9ndWVfc3RhdHVzLCBkZW5pZWRfbGxpZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJkZW5pZWRfcmFuZ2UiLCAuZGVzY3IgPSAiT05VIFJhbmdlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9yb2d1ZV9zdGF0dXMsIGRlbmllZF9yYW5nZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiQWxhcm0gU3RhdGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3JvZ3VlX3N0YXR1cywgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfc3RhdHVzID0geyAubmFtZSA9ICJiY21vbHRfcm9ndWVfc3RhdHVzIiwgLmRlc2NyID0gIkRldGFpbHMgb2YgU3VzcGVjdGVkIFJvZ3VlIE9OVSBwcm92aWRlZCBpbiBEZW5pZWQgTGluayBBbGFybSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9yb2d1ZV9zdGF0dXMpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfc3RhdHVzX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX3N0YXR1c19maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX2FsYXJtX3N0YXRlX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInVua25vd25fbGlua192aW9sYXRpb24iLCAuZGVzY3IgPSAiVW5rbm93biBMaW5rIFZpb2xhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hbGFybV9zdGF0ZSwgdW5rbm93bl9saW5rX3Zpb2xhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Vua25vd25fbGlua19zdGF0dXMgfSwgeyAubmFtZSA9ICJvdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbiIsIC5kZXNjciA9ICJPdmVyaGVhZCBQcm9maWxlIFZpb2xhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hbGFybV9zdGF0ZSwgb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJtYXhfbGlua192aW9sYXRpb24iLCAuZGVzY3IgPSAiTWF4IExpbmsgVmlvbGF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2FsYXJtX3N0YXRlLCBtYXhfbGlua192aW9sYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJsbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uIiwgLmRlc2NyID0gIkxMSUQgUG9vbCBFbXB0eSBWaW9sYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYWxhcm1fc3RhdGUsIGxsaWRfcG9vbF9lbXB0eV92aW9sYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJsYXNlcl9vbl9vZmZfdmlvbGF0aW9uIiwgLmRlc2NyID0gIkxhc2VyIE9uL09mZiBWaW9sYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYWxhcm1fc3RhdGUsIGxhc2VyX29uX29mZl92aW9sYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9sYXNlcl9vbl9vZmZfc3RhdHVzIH0sIHsgLm5hbWUgPSAic3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbiIsIC5kZXNjciA9ICJTeXN0ZW0gUmVzb3VyY2UgVmlvbGF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2FsYXJtX3N0YXRlLCBzeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAicmFuZ2VfdmlvbGF0aW9uIiwgLmRlc2NyID0gIlJhbmdlIFZpb2xhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hbGFybV9zdGF0ZSwgcmFuZ2VfdmlvbGF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmFuZ2Vfc3RhdHVzIH0sIHsgLm5hbWUgPSAidGRtX2NoYW5uZWxzX2V4aGF1c3RlZCIsIC5kZXNjciA9ICJURE0gQ2hhbm5lbHMgRXhoYXVzdGVkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2FsYXJtX3N0YXRlLCB0ZG1fY2hhbm5lbHNfZXhoYXVzdGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAicm9ndWVfdmlvbGF0aW9uIiwgLmRlc2NyID0gIlJvZ3VlIE9OVSBWaW9sYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYWxhcm1fc3RhdGUsIHJvZ3VlX3Zpb2xhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX3N0YXR1cyB9LCB7IC5uYW1lID0gInVwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb24iLCAuZGVzY3IgPSAiVXBzdHJlYW0gQmFuZHdpZHRoIFZpb2xhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hbGFybV9zdGF0ZSwgdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYWxhcm1fc3RhdGUgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2FsYXJtX3N0YXRlIiwgLmRlc2NyID0gIlRoZSBzdGF0ZSBvZiBhbGwgYWxhcm1zIG9uIGFuIEVQT04gRGVuaWVkIExpbmsuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYWxhcm1fc3RhdGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua19hbGFybV9zdGF0ZV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX2FsYXJtX3N0YXRlX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJsYXNlcl9vbl9vZmZfdmlvbGF0aW9uIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX0xBU0VSX09OX09GRl9WSU9MQVRJT04gfSwgeyAubmFtZSA9ICJsbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX0xMSURfUE9PTF9FTVBUWV9WSU9MQVRJT04gfSwgeyAubmFtZSA9ICJtYXhfbGlua192aW9sYXRpb24iLCAudmFsID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfTUFYX0xJTktfVklPTEFUSU9OIH0sIHsgLm5hbWUgPSAib3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb24iLCAudmFsID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfT1ZFUkhFQURfUFJPRklMRV9WSU9MQVRJT04gfSwgeyAubmFtZSA9ICJyYW5nZV92aW9sYXRpb24iLCAudmFsID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfUkFOR0VfVklPTEFUSU9OIH0sIHsgLm5hbWUgPSAicm9ndWVfdmlvbGF0aW9uIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX1JPR1VFX1ZJT0xBVElPTiB9LCB7IC5uYW1lID0gInN5c3RlbV9yZXNvdXJjZV92aW9sYXRpb24iLCAudmFsID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfU1lTVEVNX1JFU09VUkNFX1ZJT0xBVElPTiB9LCB7IC5uYW1lID0gInRkbV9jaGFubmVsc19leGhhdXN0ZWQiLCAudmFsID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfVERNX0NIQU5ORUxTX0VYSEFVU1RFRCB9LCB7IC5uYW1lID0gInVua25vd25fbGlua192aW9sYXRpb24iLCAudmFsID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfVU5LTk9XTl9MSU5LX1ZJT0xBVElPTiB9LCB7IC5uYW1lID0gInVwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb24iLCAudmFsID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfVVBTVFJFQU1fQkFORFdJRFRIX1ZJT0xBVElPTiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fZGVuaWVkX2xpbmtfYXV0b19jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0ZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19DRkdfSURfQUxBUk1fU1RBVEUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fZGVuaWVkX2xpbmtfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJlcG9uX25pIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0tFWV9JRF9FUE9OX05JIH0sIHsgLm5hbWUgPSAibWFjX2FkZHJlc3MiLCAudmFsID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfS0VZX0lEX01BQ19BRERSRVNTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2RlbmllZF9saW5rX2tleSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19MQVNFUl9PTl9PRkZfVklPTEFUSU9OX0lEX0FMQVJNX1NUQVRVUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb24gZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25faWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19MTElEX1BPT0xfRU1QVFlfVklPTEFUSU9OX0lEX0FMQVJNX1NUQVRVUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb24gZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb25faWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25faWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX01BWF9MSU5LX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19PVkVSSEVBRF9QUk9GSUxFX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25faWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25faWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1JBTkdFX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAudmFsID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfUk9HVUVfVklPTEFUSU9OX0lEX0FMQVJNX1NUQVRVUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25faWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb24gZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAudmFsID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfU1lTVEVNX1JFU09VUkNFX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25faWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25faWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25faWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAudmFsID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfVERNX0NIQU5ORUxTX0VYSEFVU1RFRF9JRF9BTEFSTV9TVEFUVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAudmFsID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfVU5LTk9XTl9MSU5LX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb25faWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb25faWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb25faWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbl9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAudmFsID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfVVBTVFJFQU1fQkFORFdJRFRIX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25faWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25faWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25faWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9tb2RlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm5vX2VuY3J5cHRpb24iLCAudmFsID0gQkNNT0xUX0VQT05fRU5DUllQVElPTl9NT0RFX05PX0VOQ1JZUFRJT04gfSwgeyAubmFtZSA9ICJlcG9uX3RyaXBsZV9jaHVybmluZyIsIC52YWwgPSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX01PREVfRVBPTl9UUklQTEVfQ0hVUk5JTkcgfSwgeyAubmFtZSA9ICJlcG9uX3plcm9fb3ZlcmhlYWRfYWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fTU9ERV9FUE9OX1pFUk9fT1ZFUkhFQURfQUVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9lbmNyeXB0aW9uX21vZGUgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2VuY3J5cHRpb25fbW9kZSIsIC5kZXNjciA9ICJFUE9OIGVuY3J5cHRpb24gbW9kZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fbW9kZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fbW9kZV9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2tleV9jaG9pY2Vfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAia2V5XzAiLCAudmFsID0gQkNNT0xUX0VQT05fS0VZX0NIT0lDRV9LRVlfMCB9LCB7IC5uYW1lID0gImtleV8xIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0tFWV9DSE9JQ0VfS0VZXzEgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2tleV9jaG9pY2UgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2tleV9jaG9pY2UiLCAuZGVzY3IgPSAiRXBvbiBLZXkgQ2hvaWNlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fa2V5X2Nob2ljZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2tleV9jaG9pY2Vfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9jb25maWdfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZG93bnN0cmVhbV9tb2RlIiwgLmRlc2NyID0gIkRvd25zdHJlYW0gTW9kZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2NvbmZpZywgZG93bnN0cmVhbV9tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9lbmNyeXB0aW9uX21vZGUgfSwgeyAubmFtZSA9ICJkb3duc3RyZWFtX2tleV9jaG9pY2UiLCAuZGVzY3IgPSAiRG93bnN0cmVhbSBLZXkgQ2hvaWNlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fY29uZmlnLCBkb3duc3RyZWFtX2tleV9jaG9pY2UpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2tleV9jaG9pY2UgfSwgeyAubmFtZSA9ICJkb3duc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24iLCAuZGVzY3IgPSAiRG93bnN0cmVhbSBFbmNyeXB0aW9uIEluZm9ybWF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fY29uZmlnLCBkb3duc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lbmNyeXB0aW9uX2luZm9ybWF0aW9uX2NvbnRhaW5lciB9LCB7IC5uYW1lID0gInVwc3RyZWFtX21vZGUiLCAuZGVzY3IgPSAiVXBzdHJlYW0gTW9kZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2NvbmZpZywgdXBzdHJlYW1fbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9tb2RlIH0sIHsgLm5hbWUgPSAidXBzdHJlYW1fa2V5X2Nob2ljZSIsIC5kZXNjciA9ICJVcHN0cmVhbSBLZXkgQ2hvaWNlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fY29uZmlnLCB1cHN0cmVhbV9rZXlfY2hvaWNlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9rZXlfY2hvaWNlIH0sIHsgLm5hbWUgPSAidXBzdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbiIsIC5kZXNjciA9ICJVcHN0cmVhbSBFbmNyeXB0aW9uIEluZm9ybWF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fY29uZmlnLCB1cHN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXIgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2VuY3J5cHRpb25fY29uZmlnID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2NvbmZpZyIsIC5kZXNjciA9ICJLZXlzIGFuZCBtb2RlIGZvciBlbmNyeXB0aW5nIHRoZSBFUE9OIGxvZ2ljYWwgbGluay4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2NvbmZpZyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2VuY3J5cHRpb25fY29uZmlnX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9jb25maWdfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fZGlyZWN0aW9uX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImRvd25zdHJlYW1fb25seSIsIC52YWwgPSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX0RJUkVDVElPTl9ET1dOU1RSRUFNX09OTFkgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2VuY3J5cHRpb25fZGlyZWN0aW9uID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2RpcmVjdGlvbiIsIC5kZXNjciA9ICJFUE9OIEVuY3J5cHRpb24gRGlyZWN0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9kaXJlY3Rpb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX2RpcmVjdGlvbl9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2ZlY19lbl9zdGF0ZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJkaXNhYmxlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9GRUNfRU5fU1RBVEVfRElTQUJMRUQgfSwgeyAubmFtZSA9ICJlbmFibGVkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0ZFQ19FTl9TVEFURV9FTkFCTEVEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9mZWNfZW5fc3RhdGUgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2ZlY19lbl9zdGF0ZSIsIC5kZXNjciA9ICJFUE9OIEZFQyBlbmFibGUgc3RhdGUuICBTZWUgZmxhZyBkZXNjcmlwdGlvbnMgZm9yIHJlc3RyaWN0aW9ucy4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGVfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9vYW1fdHlwZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJicm9hZGNvbSIsIC52YWwgPSBCQ01PTFRfRVBPTl9PQU1fVFlQRV9CUk9BRENPTSB9LCB7IC5uYW1lID0gImN0YyIsIC52YWwgPSBCQ01PTFRfRVBPTl9PQU1fVFlQRV9DVEMgfSwgeyAubmFtZSA9ICJkcG9lIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09BTV9UWVBFX0RQT0UgfSwgeyAubmFtZSA9ICJzaWVwb25hIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09BTV9UWVBFX1NJRVBPTkEgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29hbV90eXBlID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9vYW1fdHlwZSIsIC5kZXNjciA9ICJUaGUgdHlwZXMgb2YgT0FNIHRvIGNob29zZSBmcm9tLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90eXBlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fb2FtX3R5cGVfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fa2V5X2V4Y2hhbmdlX2NvbmZpZ19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJvYW1fdHlwZSIsIC5kZXNjciA9ICJUaGUgdHlwZSBvZiBPQU0gdGhhdCBpcyBzZW50IHRvIHN0YXJ0IHRoZSBrZXkgZXhjaGFuZ2UuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2tleV9leGNoYW5nZV9jb25maWcsIG9hbV90eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vYW1fdHlwZSB9LCB7IC5uYW1lID0gInBlcmlvZCIsIC5kZXNjciA9ICJwZXJpb2QiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fa2V5X2V4Y2hhbmdlX2NvbmZpZywgcGVyaW9kKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gImRpcmVjdGlvbiIsIC5kZXNjciA9ICJFbmNyeXB0aW9uIGRpcmVjdGlvbjogRG93bnN0cmVhbSBvbmx5IG9yIEJpLWRpcmVjdGlvbmFsLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9rZXlfZXhjaGFuZ2VfY29uZmlnLCBkaXJlY3Rpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2VuY3J5cHRpb25fZGlyZWN0aW9uIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9rZXlfZXhjaGFuZ2VfY29uZmlnID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9rZXlfZXhjaGFuZ2VfY29uZmlnIiwgLmRlc2NyID0gIktleSBleGNoYW5nZSBjb25maWd1cmF0aW9uIHRoYXQgYXBwbGllcyB0byB0aGUgRVBPTiBsaW5rLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2tleV9leGNoYW5nZV9jb25maWcpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9rZXlfZXhjaGFuZ2VfY29uZmlnX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fa2V5X2V4Y2hhbmdlX2NvbmZpZ19maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xhc2VyX292ZXJoZWFkX3BhcmFtZXRlcnNfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibGFzZXJfb25fdGltZSIsIC5kZXNjciA9ICJOdW1iZXIgb2YgdGltZSBxdWFudGEgdG8gYWxsb3cgZm9yIE9OVXMnIGxhc2VyLW9uIHRyYW5zaXRpb24uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xhc2VyX292ZXJoZWFkX3BhcmFtZXRlcnMsIGxhc2VyX29uX3RpbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAibGFzZXJfb2ZmX3RpbWUiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIHRpbWUgcXVhbnRhIHRvIGFsbG93IGZvciBPTlVzJyBsYXNlci1vZmYgdHJhbnNpdGlvbi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVycywgbGFzZXJfb2ZmX3RpbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9sYXNlcl9vdmVyaGVhZF9wYXJhbWV0ZXJzID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9sYXNlcl9vdmVyaGVhZF9wYXJhbWV0ZXJzIiwgLmRlc2NyID0gIkVQT04gbGFzZXIgb3ZlcmhlYWQgcGFyYW1ldGVycy4gKExhc2VyIE9uIGFuZCBMYXNlciBPZmYgdGltZXMpIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVycyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xhc2VyX292ZXJoZWFkX3BhcmFtZXRlcnNfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9sYXNlcl9vdmVyaGVhZF9wYXJhbWV0ZXJzX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19hbGFybV9zdGF0ZV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJrZXlfZXhjaGFuZ2VfZmFpbHVyZSIsIC5kZXNjciA9ICJLZXkgRXhjaGFuZ2UgRmFpbHVyZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2FsYXJtX3N0YXRlLCBrZXlfZXhjaGFuZ2VfZmFpbHVyZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9LCB7IC5uYW1lID0gImludmFsaWRfbXBjcF9yZXBvcnRfcmVjZWl2ZWQiLCAuZGVzY3IgPSAiSW52YWxpZCBNUENQIFJlcG9ydCBSZWNlaXZlZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2FsYXJtX3N0YXRlLCBpbnZhbGlkX21wY3BfcmVwb3J0X3JlY2VpdmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAibXBjcF9yZXBvcnRfdGltZW91dCIsIC5kZXNjciA9ICJNUENQIFJlcG9ydCBUaW1lb3V0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYWxhcm1fc3RhdGUsIG1wY3BfcmVwb3J0X3RpbWVvdXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJvYW1fa2VlcGFsaXZlX3RpbWVvdXQiLCAuZGVzY3IgPSAiT0FNIEtlZXBhbGl2ZSBUaW1lb3V0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYWxhcm1fc3RhdGUsIG9hbV9rZWVwYWxpdmVfdGltZW91dCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19hbGFybV9zdGF0ZSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19hbGFybV9zdGF0ZSIsIC5kZXNjciA9ICJUaGUgc3RhdGUgb2YgYWxsIGFsYXJtcyBvbiBhbiBFUE9OIExpbmsuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19hbGFybV9zdGF0ZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfYWxhcm1fc3RhdGVfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2FsYXJtX3N0YXRlX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImR1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0IiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfRFVQTElDQVRFX01QQ1BfUkVHSVNUUkFUSU9OX1JFUVVFU1QgfSwgeyAubmFtZSA9ICJlbmNyeXB0aW9uX2VuYWJsZWQiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9FTkNSWVBUSU9OX0VOQUJMRUQgfSwgeyAubmFtZSA9ICJrZXlfZXhjaGFuZ2VfZmFpbHVyZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9GQUlMVVJFIH0sIHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlX3N0YXJ0ZWQiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfU1RBUlRFRCB9LCB7IC5uYW1lID0gImtleV9leGNoYW5nZV9zdG9wcGVkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX1NUT1BQRUQgfSwgeyAubmFtZSA9ICJsaW5rX2RlbGV0ZWQiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9MSU5LX0RFTEVURUQgfSwgeyAubmFtZSA9ICJsaW5rX3NwZWVkX21pc21hdGNoIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTElOS19TUEVFRF9NSVNNQVRDSCB9LCB7IC5uYW1lID0gIm1wY3BfZGVyZWdpc3RlcmVkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTVBDUF9ERVJFR0lTVEVSRUQgfSwgeyAubmFtZSA9ICJtcGNwX2Rpc2NvdmVyZWQiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9NUENQX0RJU0NPVkVSRUQgfSwgeyAubmFtZSA9ICJtcGNwX3JlZ19hY2tfdGltZW91dCIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX01QQ1BfUkVHX0FDS19USU1FT1VUIH0sIHsgLm5hbWUgPSAibXBjcF9yZXBvcnRfdGltZW91dCIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX01QQ1BfUkVQT1JUX1RJTUVPVVQgfSwgeyAubmFtZSA9ICJvYW1fa2VlcGFsaXZlX3RpbWVvdXQiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9PQU1fS0VFUEFMSVZFX1RJTUVPVVQgfSwgeyAubmFtZSA9ICJvYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0ZWQiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9PQU1fS0VFUEFMSVZFX1RJTUVSX1NUQVJURUQgfSwgeyAubmFtZSA9ICJvYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BwZWQiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9PQU1fS0VFUEFMSVZFX1RJTUVSX1NUT1BQRUQgfSwgeyAubmFtZSA9ICJwcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWQiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9QUkVQUk9WSVNJT05FRF9MSU5LX0NSRUFURUQgfSwgeyAubmFtZSA9ICJwcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENIX09DQ1VSUkVEIH0sIHsgLm5hbWUgPSAicmFuZ2VfdmFsdWVfY2hhbmdlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX1JBTkdFX1ZBTFVFX0NIQU5HRUQgfSwgeyAubmFtZSA9ICJyZXJhbmdlX2ZhaWx1cmUiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9SRVJBTkdFX0ZBSUxVUkUgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEIH0sIHsgLm5hbWUgPSAic3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfU1RBVElDX1JFR0lTVFJBVElPTl9ET05FIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbGlua19hdXRvX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImxpbmtfcmF0ZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9MSU5LX1JBVEUgfSwgeyAubmFtZSA9ICJzdGF0ZV9mbGFncyIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9TVEFURV9GTEFHUyB9LCB7IC5uYW1lID0gImxsaWQiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfTExJRCB9LCB7IC5uYW1lID0gImxhc2VyX29uX3RpbWVfdHEiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfTEFTRVJfT05fVElNRV9UUSB9LCB7IC5uYW1lID0gImxhc2VyX29mZl90aW1lX3RxIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xBU0VSX09GRl9USU1FX1RRIH0sIHsgLm5hbWUgPSAicmFuZ2VfdmFsdWVfdHEiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfUkFOR0VfVkFMVUVfVFEgfSwgeyAubmFtZSA9ICJkaXN0YW5jZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9ESVNUQU5DRSB9LCB7IC5uYW1lID0gImFsYXJtX3N0YXRlIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0FMQVJNX1NUQVRFIH0sIHsgLm5hbWUgPSAidHVubmVsX2lkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1RVTk5FTF9JRCB9LCB7IC5uYW1lID0gIm9udV9pZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9PTlVfSUQgfSwgeyAubmFtZSA9ICJtaW5fbGFzZXJfb3ZlcmhlYWQiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfTUlOX0xBU0VSX09WRVJIRUFEIH0sIHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlX2NvbmZpZyIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9LRVlfRVhDSEFOR0VfQ09ORklHIH0sIHsgLm5hbWUgPSAiZXBvbl9lbmNyeXB0aW9uIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0VQT05fRU5DUllQVElPTiB9LCB7IC5uYW1lID0gImZlY19lbmFibGUiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfRkVDX0VOQUJMRSB9LCB7IC5uYW1lID0gIm9hbV9oZWFydGJlYXRfY29uZmlnIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX09BTV9IRUFSVEJFQVRfQ09ORklHIH0sIHsgLm5hbWUgPSAidXBzdHJlYW1fYmFuZHdpZHRoIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1VQU1RSRUFNX0JBTkRXSURUSCB9LCB7IC5uYW1lID0gInViZF9pbmZvIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1VCRF9JTkZPIH0sIHsgLm5hbWUgPSAiY2xvY2tfdHJhbnNwb3J0X2VuYWJsZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9DTE9DS19UUkFOU1BPUlRfRU5BQkxFIH0sIHsgLm5hbWUgPSAicGVuZGluZ19ncmFudHMiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfUEVORElOR19HUkFOVFMgfSwgeyAubmFtZSA9ICJsaW5rX3R5cGUiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfTElOS19UWVBFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9saW5rX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19kZWxldGVfbGlua19pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfZGVsZXRlX2xpbmtfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfZGVsZXRlX2xpbmtfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9saW5rX2RlbGV0ZV9saW5rIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfZGVsZXRlX2xpbmtfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9saW5rX2RlbGV0ZV9saW5rX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJpbml0aWFsX3JhbmdlX3RxIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfRFVQTElDQVRFX01QQ1BfUkVHSVNUUkFUSU9OX1JFUVVFU1RfSURfSU5JVElBTF9SQU5HRV9UUSB9LCB7IC5uYW1lID0gImN1cnJlbnRfcmFuZ2VfdHEiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19EVVBMSUNBVEVfTVBDUF9SRUdJU1RSQVRJT05fUkVRVUVTVF9JRF9DVVJSRU5UX1JBTkdFX1RRIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfZW5jcnlwdGlvbl9lbmFibGVkX2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19lbmNyeXB0aW9uX2VuYWJsZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfZW5jcnlwdGlvbl9lbmFibGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbGlua19lbmNyeXB0aW9uX2VuYWJsZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19lbmNyeXB0aW9uX2VuYWJsZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9saW5rX2VuY3J5cHRpb25fZW5hYmxlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfZmVjX3N0YXRlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImRpc2FibGVkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfRkVDX1NUQVRFX0RJU0FCTEVEIH0sIHsgLm5hbWUgPSAiZW5hYmxlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0ZFQ19TVEFURV9FTkFCTEVEIH0sIHsgLm5hbWUgPSAidXNlX2RlZmF1bHQiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19GRUNfU1RBVEVfVVNFX0RFRkFVTFQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfZmVjX3N0YXRlID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX2ZlY19zdGF0ZSIsIC5kZXNjciA9ICJlcG9uIGxpbmsgZmVjIHN0YXRlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19mZWNfc3RhdGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9saW5rX2ZlY19zdGF0ZV9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2ZlY19lbl9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJ1cHN0cmVhbSIsIC5kZXNjciA9ICJGRUMgZW5hYmxlIHN0YXRlIGZvciB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2ZlY19lbiwgdXBzdHJlYW0pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfZmVjX3N0YXRlIH0sIHsgLm5hbWUgPSAiZG93bnN0cmVhbSIsIC5kZXNjciA9ICJGRUMgZW5hYmxlIHN0YXRlIGZvciBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfZmVjX2VuLCBkb3duc3RyZWFtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2ZlY19zdGF0ZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19mZWNfZW4gPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfZmVjX2VuIiwgLmRlc2NyID0gIkRvd25zdHJlYW0gYW5kIHVwc3RyZWFtIEZFQyBlbmFibGUgc3RhdGUgZm9yIGFuIEVQT04gbGluay4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2ZlY19lbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfZmVjX2VuX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19mZWNfZW5fZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfZm9yY2VfcmVkaXNjb3ZlcnlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2ZvcmNlX3JlZGlzY292ZXJ5X2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX2ZvcmNlX3JlZGlzY292ZXJ5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbGlua19mb3JjZV9yZWRpc2NvdmVyeSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2ZvcmNlX3JlZGlzY292ZXJ5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbGlua19mb3JjZV9yZWRpc2NvdmVyeV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZnJhbWUiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19GUkFNRV9DQVBUVVJFRF9JRF9GUkFNRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX3N0YXR1c19zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJub25lIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVFVTX05PTkUgfSwgeyAubmFtZSA9ICJkaXNjb3ZlcmVkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVFVTX0RJU0NPVkVSRUQgfSwgeyAubmFtZSA9ICJyZWdpc3RyYXRpb25fcHJldmVudGVkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVFVTX1JFR0lTVFJBVElPTl9QUkVWRU5URUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfc3RhdHVzID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX3N0YXR1cyIsIC5kZXNjciA9ICJUaGUgY3VycmVudCByZWdpc3RyYXRpb24gc3RhdHVzIG9mIGEgbGluay4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX3N0YXR1cyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU1fTUFTSywgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbGlua19zdGF0dXNfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbXBjcF9kaXNjb3ZlcnlfaW5mb19zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJub25lIiwgLnZhbCA9IEJDTU9MVF9NUENQX0RJU0NPVkVSWV9JTkZPX05PTkUgfSwgeyAubmFtZSA9ICJvbmVfZ19jYXBhYmxlIiwgLnZhbCA9IEJDTU9MVF9NUENQX0RJU0NPVkVSWV9JTkZPX09ORV9HX0NBUEFCTEUgfSwgeyAubmFtZSA9ICJ0ZW5fZ19jYXBhYmxlIiwgLnZhbCA9IEJDTU9MVF9NUENQX0RJU0NPVkVSWV9JTkZPX1RFTl9HX0NBUEFCTEUgfSwgeyAubmFtZSA9ICJvbmVfZ193aW5kb3ciLCAudmFsID0gQkNNT0xUX01QQ1BfRElTQ09WRVJZX0lORk9fT05FX0dfV0lORE9XIH0sIHsgLm5hbWUgPSAidGVuX2dfd2luZG93IiwgLnZhbCA9IEJDTU9MVF9NUENQX0RJU0NPVkVSWV9JTkZPX1RFTl9HX1dJTkRPVyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X21wY3BfZGlzY292ZXJ5X2luZm8gPSB7IC5uYW1lID0gImJjbW9sdF9tcGNwX2Rpc2NvdmVyeV9pbmZvIiwgLmRlc2NyID0gIk1QQ1AgZGlzY292ZXJ5IGluZm8iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbXBjcF9kaXNjb3ZlcnlfaW5mbyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU1fTUFTSywgLnggPSB7IC5lID0gYmNtb2x0X21wY3BfZGlzY292ZXJ5X2luZm9fc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19pbmZvX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImxpbmtfc3RhdHVzIiwgLmRlc2NyID0gIkxpbmsgc3RhdHVzIGZsYWdzLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2luZm8sIGxpbmtfc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3N0YXR1cyB9LCB7IC5uYW1lID0gInJhdGUiLCAuZGVzY3IgPSAiVGhlIHJhdGUgYXQgd2hpY2ggdGhlIGxpbmsgb3BlcmF0ZXMuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfaW5mbywgcmF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19yYXRlIH0sIHsgLm5hbWUgPSAibGxpZCIsIC5kZXNjciA9ICJUaGUgTExJRCBvZiB0aGUgbGluay4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19pbmZvLCBsbGlkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdF9oZXggfSwgeyAubmFtZSA9ICJtcGNwX2Rpc2NvdmVyeV9pbmZvIiwgLmRlc2NyID0gIkZsYWdzIGZyb20gTVBDUCBkaXNjb3ZlcnkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfaW5mbywgbXBjcF9kaXNjb3ZlcnlfaW5mbyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X21wY3BfZGlzY292ZXJ5X2luZm8gfSwgeyAubmFtZSA9ICJvbnVfbGFzZXJfb25fdGltZV90cSIsIC5kZXNjciA9ICJMYXNlciBvbiB0aW1lIHJlcG9ydGVkIGJ5IE9OVS4gIFRoaXMgaXMgc2V0IHRvIDAgZm9yIDFHLzFHIGxpbmtzIGFzIDFHIE1QQ1AgZG9lcyBub3QgaW5jbHVkZSB0aGlzIGZpZWxkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2luZm8sIG9udV9sYXNlcl9vbl90aW1lX3RxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gIm9udV9sYXNlcl9vZmZfdGltZV90cSIsIC5kZXNjciA9ICJMYXNlciBvZmYgdGltZSByZXBvcnRlZCBieSBPTlUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfaW5mbywgb251X2xhc2VyX29mZl90aW1lX3RxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gInBlbmRpbmdfZ3JhbnRzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcGVuZGluZyBncmFudHMuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfaW5mbywgcGVuZGluZ19ncmFudHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJyYW5nZV92YWx1ZV90cSIsIC5kZXNjciA9ICJUaGUgbGluaydzIHJhbmdlIHZhbHVlIGluIFRRLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2luZm8sIHJhbmdlX3ZhbHVlX3RxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gInR1bm5lbF9pZCIsIC5kZXNjciA9ICJUaGUgdHVubmVsIElEIHRvIHVzZSB3aGVuIHNlbmRpbmcgdHJhZmZpYyB0byB0aGUgbGluay4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19pbmZvLCB0dW5uZWxfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90X2hleCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19pbmZvID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX2luZm8iLCAuZGVzY3IgPSAiRVBPTiBsb2dpY2FsIGxpbmsuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19pbmZvKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19pbmZvX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19pbmZvX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJmcmFtZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0lOSkVDVF9GUkFNRV9JRF9GUkFNRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbGlua19pbmplY3RfZnJhbWUgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfS0VZX0VYQ0hBTkdFX0ZBSUxVUkVfSURfQUxBUk1fU1RBVFVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInBlcmlvZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0tFWV9FWENIQU5HRV9TVEFSVF9JRF9QRVJJT0QgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydGVkX2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdG9wX2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3AgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdG9wcGVkX2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcHBlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcHBlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BwZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcHBlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BwZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX2tleV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJlcG9uX25pIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX0VQT05fTkkgfSwgeyAubmFtZSA9ICJtYWNfYWRkcmVzcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX0tFWV9JRF9NQUNfQUREUkVTUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19rZXlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfa2V5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbGlua19rZXkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9saW5rX2tleV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfbGlua19kZWxldGVkX2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19saW5rX2RlbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfbGlua19kZWxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbGlua19saW5rX2RlbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19saW5rX2RlbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9saW5rX2xpbmtfZGVsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwcmV2aW91c19yYXRlIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfTElOS19TUEVFRF9NSVNNQVRDSF9JRF9QUkVWSU9VU19SQVRFIH0sIHsgLm5hbWUgPSAiY3VycmVudF9yYXRlIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfTElOS19TUEVFRF9NSVNNQVRDSF9JRF9DVVJSRU5UX1JBVEUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kZXJlZ2lzdGVyZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX21wY3BfZGVyZWdpc3RlcmVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX21wY3BfZGVyZWdpc3RlcmVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbGlua19tcGNwX2RlcmVnaXN0ZXJlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX21wY3BfZGVyZWdpc3RlcmVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbGlua19tcGNwX2RlcmVnaXN0ZXJlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImxpbmtfaW5mbyIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX01QQ1BfRElTQ09WRVJFRF9JRF9MSU5LX0lORk8gfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX21wY3BfcmVnX2Fja190aW1lb3V0X2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlZ19hY2tfdGltZW91dF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlZ19hY2tfdGltZW91dF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfbXBjcF9yZWdfYWNrX3RpbWVvdXQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlZ19hY2tfdGltZW91dF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZWdfYWNrX3RpbWVvdXRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfTVBDUF9SRVBPUlRfVElNRU9VVF9JRF9BTEFSTV9TVEFUVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX09BTV9LRUVQQUxJVkVfVElNRU9VVF9JRF9BTEFSTV9TVEFUVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic2VuZF9wZXJpb2QiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19PQU1fS0VFUEFMSVZFX1RJTUVSX1NUQVJUX0lEX1NFTkRfUEVSSU9EIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BwZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJsaW5rX2luZm8iLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19QUkVQUk9WSVNJT05FRF9MSU5LX0NSRUFURURfSURfTElOS19JTkZPIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwcm90ZWN0aW9uX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1BST1RFQ1RJT05fU1dJVENIX09DQ1VSUkVEX0lEX1BST1RFQ1RJT05fU1RBVFVTIH0sIHsgLm5hbWUgPSAicmFuZ2VfdmFsdWVfdHEiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19QUk9URUNUSU9OX1NXSVRDSF9PQ0NVUlJFRF9JRF9SQU5HRV9WQUxVRV9UUSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicmFuZ2VfdmFsdWVfdHEiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19SQU5HRV9WQUxVRV9DSEFOR0VEX0lEX1JBTkdFX1ZBTFVFX1RRIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX3JlcmFuZ2VfZmFpbHVyZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfcmVyYW5nZV9mYWlsdXJlX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX3JlcmFuZ2VfZmFpbHVyZV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfcmVyYW5nZV9mYWlsdXJlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfcmVyYW5nZV9mYWlsdXJlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbGlua19yZXJhbmdlX2ZhaWx1cmVfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXQiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9DRkdfSURfQ0ZHIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbGlua19zdGF0X2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJyeF9kYXRhX2J5dGVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9EQVRBX0JZVEVTIH0sIHsgLm5hbWUgPSAicnhfZGF0YV9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0RBVEFfRlJBTUVTIH0sIHsgLm5hbWUgPSAicnhfZnJhbWVzXzY0IiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfNjQgfSwgeyAubmFtZSA9ICJyeF9mcmFtZXNfNjVfMTI3IiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfNjVfMTI3IH0sIHsgLm5hbWUgPSAicnhfZnJhbWVzXzEyOF8yNTUiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18xMjhfMjU1IH0sIHsgLm5hbWUgPSAicnhfZnJhbWVzXzI1Nl81MTEiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18yNTZfNTExIH0sIHsgLm5hbWUgPSAicnhfZnJhbWVzXzUxMl8xMDIzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfNTEyXzEwMjMgfSwgeyAubmFtZSA9ICJyeF9mcmFtZXNfMTAyNF8xNTE4IiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfMTAyNF8xNTE4IH0sIHsgLm5hbWUgPSAicnhfZnJhbWVzXzE1MTlfMjA0NyIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzE1MTlfMjA0NyB9LCB7IC5uYW1lID0gInJ4X2ZyYW1lc18yMDQ4XzQwOTUiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18yMDQ4XzQwOTUgfSwgeyAubmFtZSA9ICJyeF9mcmFtZXNfNDA5Nl85MjE2IiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfNDA5Nl85MjE2IH0sIHsgLm5hbWUgPSAicnhfZnJhbWVzXzkyMTdfMTYzODMiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU185MjE3XzE2MzgzIH0sIHsgLm5hbWUgPSAicnhfb2FtX2J5dGVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9PQU1fQllURVMgfSwgeyAubmFtZSA9ICJyeF9vYW1fZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9PQU1fRlJBTUVTIH0sIHsgLm5hbWUgPSAicnhfbXBjcF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX01QQ1BfRlJBTUVTIH0sIHsgLm5hbWUgPSAicnhfYnJvYWRjYXN0X2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfQlJPQURDQVNUX0ZSQU1FUyB9LCB7IC5uYW1lID0gInJ4X3VuaWNhc3RfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9VTklDQVNUX0ZSQU1FUyB9LCB7IC5uYW1lID0gInJ4X211bHRpY2FzdF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX01VTFRJQ0FTVF9GUkFNRVMgfSwgeyAubmFtZSA9ICJyeF9yZXBvcnRfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9SRVBPUlRfRlJBTUVTIH0sIHsgLm5hbWUgPSAicnhfZmNzX2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GQ1NfRVJST1IgfSwgeyAubmFtZSA9ICJyeF9vdmVyc2l6ZV9lcnJvciIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfT1ZFUlNJWkVfRVJST1IgfSwgeyAubmFtZSA9ICJyeF9ydW50X2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9SVU5UX0VSUk9SIH0sIHsgLm5hbWUgPSAicnhfbGluZV9jb2RlX2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9MSU5FX0NPREVfRVJST1IgfSwgeyAubmFtZSA9ICJyeF9saW5lX2NvZGVfZXJyb3JfbWF4IiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9MSU5FX0NPREVfRVJST1JfTUFYIH0sIHsgLm5hbWUgPSAidHhfZGF0YV9ieXRlcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfREFUQV9CWVRFUyB9LCB7IC5uYW1lID0gInR4X2RhdGFfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9EQVRBX0ZSQU1FUyB9LCB7IC5uYW1lID0gInR4X2ZyYW1lc182NCIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzY0IH0sIHsgLm5hbWUgPSAidHhfZnJhbWVzXzY1XzEyNyIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzY1XzEyNyB9LCB7IC5uYW1lID0gInR4X2ZyYW1lc18xMjhfMjU1IiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMTI4XzI1NSB9LCB7IC5uYW1lID0gInR4X2ZyYW1lc18yNTZfNTExIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMjU2XzUxMSB9LCB7IC5uYW1lID0gInR4X2ZyYW1lc181MTJfMTAyMyIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzUxMl8xMDIzIH0sIHsgLm5hbWUgPSAidHhfZnJhbWVzXzEwMjRfMTUxOCIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzEwMjRfMTUxOCB9LCB7IC5uYW1lID0gInR4X2ZyYW1lc18xNTE5XzIwNDciLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18xNTE5XzIwNDcgfSwgeyAubmFtZSA9ICJ0eF9mcmFtZXNfMjA0OF80MDk1IiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfMjA0OF80MDk1IH0sIHsgLm5hbWUgPSAidHhfZnJhbWVzXzQwOTZfOTIxNiIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzQwOTZfOTIxNiB9LCB7IC5uYW1lID0gInR4X2ZyYW1lc185MjE3XzE2MzgzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfOTIxN18xNjM4MyB9LCB7IC5uYW1lID0gInR4X29hbV9ieXRlcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfT0FNX0JZVEVTIH0sIHsgLm5hbWUgPSAidHhfb2FtX2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfT0FNX0ZSQU1FUyB9LCB7IC5uYW1lID0gInR4X21wY3BfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9NUENQX0ZSQU1FUyB9LCB7IC5uYW1lID0gInR4X2Jyb2FkY2FzdF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0JST0FEQ0FTVF9GUkFNRVMgfSwgeyAubmFtZSA9ICJ0eF91bmljYXN0X2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfVU5JQ0FTVF9GUkFNRVMgfSwgeyAubmFtZSA9ICJ0eF9tdWx0aWNhc3RfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9NVUxUSUNBU1RfRlJBTUVTIH0sIHsgLm5hbWUgPSAidHhfZ2F0ZXMiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0dBVEVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3N0YXRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfc3RhdCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9saW5rX3N0YXRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX3N0YXRlX2ZsYWdzX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm5vbmUiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19TVEFURV9GTEFHU19OT05FIH0sIHsgLm5hbWUgPSAibXBjcF9yZWdpc3RyYXRpb25fY29tcGxldGUiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19TVEFURV9GTEFHU19NUENQX1JFR0lTVFJBVElPTl9DT01QTEVURSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19zdGF0ZV9mbGFncyA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19zdGF0ZV9mbGFncyIsIC5kZXNjciA9ICJFUE9OIGxpbmsgc3RhdGUgZmxhZ3MgcmVmbGVjdCB0aGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIGxpbmsuICIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdGVfZmxhZ3MpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNX01BU0ssIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX2xpbmtfc3RhdGVfZmxhZ3Nfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZG9uZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZG9uZV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RvbmVfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25faWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibGFzZXJvbl90aW1lX3RxIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVElDX1JFR0lTVFJBVElPTl9JRF9MQVNFUk9OX1RJTUVfVFEgfSwgeyAubmFtZSA9ICJsYXNlcm9mZl90aW1lX3RxIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVElDX1JFR0lTVFJBVElPTl9JRF9MQVNFUk9GRl9USU1FX1RRIH0sIHsgLm5hbWUgPSAicmFuZ2VfdmFsdWVfdHEiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19TVEFUSUNfUkVHSVNUUkFUSU9OX0lEX1JBTkdFX1ZBTFVFX1RRIH0sIHsgLm5hbWUgPSAicGVuZGluZ19ncmFudHMiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19TVEFUSUNfUkVHSVNUUkFUSU9OX0lEX1BFTkRJTkdfR1JBTlRTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25faWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbiBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25faWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25faWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX3R5cGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3lzdGVtIiwgLnZhbCA9IEJDTU9MVF9FUE9OX0xJTktfVFlQRV9TWVNURU0gfSwgeyAubmFtZSA9ICJkb3duc3RyZWFtX29ubHkiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19UWVBFX0RPV05TVFJFQU1fT05MWSB9LCB7IC5uYW1lID0gImJpZGlyZWN0aW9uYWwiLCAudmFsID0gQkNNT0xUX0VQT05fTElOS19UWVBFX0JJRElSRUNUSU9OQUwgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfdHlwZSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua190eXBlIiwgLmRlc2NyID0gIkVQT04gTGluayBUeXBlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua190eXBlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbGlua190eXBlX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X21wY3BfZ2F0ZV9tb2RlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInRla25vdnVzIiwgLnZhbCA9IEJDTU9MVF9NUENQX0dBVEVfTU9ERV9URUtOT1ZVUyB9LCB7IC5uYW1lID0gImN1c3RvbSIsIC52YWwgPSBCQ01PTFRfTVBDUF9HQVRFX01PREVfQ1VTVE9NIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbXBjcF9nYXRlX21vZGUgPSB7IC5uYW1lID0gImJjbW9sdF9tcGNwX2dhdGVfbW9kZSIsIC5kZXNjciA9ICJNUENQIGdhdGUgbW9kZS4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbXBjcF9nYXRlX21vZGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbXBjcF9nYXRlX21vZGVfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbXBjcF9yZWdpc3RyYXRpb25fZ2F0ZV9mbGFnc19zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJub25lIiwgLnZhbCA9IEJDTU9MVF9NUENQX1JFR0lTVFJBVElPTl9HQVRFX0ZMQUdTX05PTkUgfSwgeyAubmFtZSA9ICJmb3JjZV9yZXBvcnQiLCAudmFsID0gQkNNT0xUX01QQ1BfUkVHSVNUUkFUSU9OX0dBVEVfRkxBR1NfRk9SQ0VfUkVQT1JUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbXBjcF9yZWdpc3RyYXRpb25fZ2F0ZV9mbGFncyA9IHsgLm5hbWUgPSAiYmNtb2x0X21wY3BfcmVnaXN0cmF0aW9uX2dhdGVfZmxhZ3MiLCAuZGVzY3IgPSAiTVBDUCByZWdpc3RyYXRpb24gZ2F0ZSBmbGFncy4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbXBjcF9yZWdpc3RyYXRpb25fZ2F0ZV9mbGFncyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU1fTUFTSywgLnggPSB7IC5lID0gYmNtb2x0X21wY3BfcmVnaXN0cmF0aW9uX2dhdGVfZmxhZ3Nfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dhdGVfcGFyYW1ldGVyc19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJmbGFncyIsIC5kZXNjciA9ICJGbGFncyB0byBzZXQgZm9yIHRoaXMgZ2F0ZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dhdGVfcGFyYW1ldGVycywgZmxhZ3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9tcGNwX3JlZ2lzdHJhdGlvbl9nYXRlX2ZsYWdzIH0sIHsgLm5hbWUgPSAiZGVsYXlfYmVmb3JlX21zIiwgLmRlc2NyID0gIkRlbGF5IGJlZm9yZSBzZW5kaW5nIHRoaXMgZ2F0ZSBpbiBtaWxsaXNlY29uZHMuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9nYXRlX3BhcmFtZXRlcnMsIGRlbGF5X2JlZm9yZV9tcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJnYXRlX3NpemVfdHEiLCAuZGVzY3IgPSAiU2l6ZSBvZiB0aGlzIGdhdGUgaW4gdGltZSBxdWFudGEuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9nYXRlX3BhcmFtZXRlcnMsIGdhdGVfc2l6ZV90cSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9nYXRlX3BhcmFtZXRlcnMgPSB7IC5uYW1lID0gImJjbW9sdF9nYXRlX3BhcmFtZXRlcnMiLCAuZGVzY3IgPSAiR2F0ZSBwYXJhbWV0ZXJzLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9nYXRlX3BhcmFtZXRlcnMpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dhdGVfcGFyYW1ldGVyc19maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dhdGVfcGFyYW1ldGVyc19saXN0X3UzMiA9IHsgLm5hbWUgPSAiYmNtb2x0X2dhdGVfcGFyYW1ldGVyc19saXN0X3UzMiIsIC5kZXNjciA9ICJWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiBnYXRlX3BhcmFtZXRlcnMiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ2F0ZV9wYXJhbWV0ZXJzX2xpc3RfdTMyKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0RZTiwgLnggPSB7IC5hcnJfZHluID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dhdGVfcGFyYW1ldGVycywgLmxlbl9zaXplID0gNCwgLm1heF9zaXplID0gREVGQVVMVF9EWU5fQVJSX01BWF9TSVpFIC8gc2l6ZW9mKGJjbW9sdF9nYXRlX3BhcmFtZXRlcnMpIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJlZ2lzdHJhdGlvbl9nYXRlX21vZGUiLCAuZGVzY3IgPSAiTVBDUCByZWdpc3RyYXRpb24gZ2F0ZSBtb2RlLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLCByZWdpc3RyYXRpb25fZ2F0ZV9tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbXBjcF9nYXRlX21vZGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlX3Rla25vdnVzX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJlZ19hY2tfdGltZW91dF9tcyIsIC5kZXNjciA9ICJBbW91bnQgb2YgdGltZSB0byB3YWl0IGZvciBhIGxpbmsgdG8gcmVzcG9uZCB3aXRoIGEgcmVnaXN0ZXIgYWNrIGFmdGVyIGEgcmVnaXN0ZXIgaXMgc2VudC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZSwgdS50ZWtub3Z1cy5yZWdfYWNrX3RpbWVvdXRfbXMpIC0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZSwgdS50ZWtub3Z1cy5yZWdfYWNrX3RpbWVvdXRfbXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlX3Rla25vdnVzID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlX3Rla25vdnVzIiwgLmRlc2NyID0gIkVQT04gcmVnaXN0cmF0aW9uIGdhdGUgbW9kZSBUZWtub3Z1cyIsIC5zaXplID0gc2l6ZW9mKCgoYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZSAqKTApLT51LnRla25vdnVzKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZV90ZWtub3Z1c19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3JlZ2lzdHJhdGlvbl9nYXRlX21vZGVfdGVrbm92dXNfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlX2N1c3RvbV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJnYXRlcyIsIC5kZXNjciA9ICJHYXRlcyB0byBzZW5kIGZvciBSRUcgQUNLLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLCB1LmN1c3RvbS5nYXRlcykgLSBvZmZzZXRvZihiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLCB1LmN1c3RvbS5nYXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dhdGVfcGFyYW1ldGVyc19saXN0X3UzMiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZV9jdXN0b20gPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3JlZ2lzdHJhdGlvbl9nYXRlX21vZGVfY3VzdG9tIiwgLmRlc2NyID0gIkVQT04gcmVnaXN0cmF0aW9uIGdhdGUgbW9kZSBDdXN0b20iLCAuc2l6ZSA9IHNpemVvZigoKGJjbW9sdF9lcG9uX3JlZ2lzdHJhdGlvbl9nYXRlX21vZGUgKikwKS0+dS5jdXN0b20pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlX2N1c3RvbV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3JlZ2lzdHJhdGlvbl9nYXRlX21vZGVfY3VzdG9tX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZV91bmlvbl9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJ1LnRla25vdnVzIiwgLmRlc2NyID0gIiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlLCB1LnRla25vdnVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlX3Rla25vdnVzIH0sIHsgLm5hbWUgPSAidS5jdXN0b20iLCAuZGVzY3IgPSAiIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3JlZ2lzdHJhdGlvbl9nYXRlX21vZGUsIHUuY3VzdG9tKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlX2N1c3RvbSB9LCB7IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9yZWdpc3RyYXRpb25fZ2F0ZV9tb2RlIiwgLmRlc2NyID0gIlNwZWNpZmljYXRpb24gb2YgdGhlIEVQT04gZ2F0ZSBtb2RlIGFuZCBhc3NvY2lhdGVkIHBhcmFtZXRlcnMuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1VOSU9OLCAueCA9IHsgLnUgPSB7IC5udW1fY29tbW9uX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3JlZ2lzdHJhdGlvbl9nYXRlX21vZGVfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuY29tbW9uX2ZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcmVnaXN0cmF0aW9uX2dhdGVfbW9kZV9maWVsZHMsIC5jbGFzc2lmaWVyX2lkeCA9IDAsIC51bmlvbl9maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3JlZ2lzdHJhdGlvbl9nYXRlX21vZGVfdW5pb25fZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9uc19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyZWdpc3RyYXRpb25fZ2F0ZV9tb2RlIiwgLmRlc2NyID0gIkVQT04gcmVnaXN0cmF0aW9uIGdhdGUgbW9kZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbG9naWNhbF9saW5rX29wdGlvbnMsIHJlZ2lzdHJhdGlvbl9nYXRlX21vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3JlZ2lzdHJhdGlvbl9nYXRlX21vZGUgfSwgeyAubmFtZSA9ICJyZXBvcnRpbmdfbW9kZSIsIC5kZXNjciA9ICJDb250cm9sIGZvciBob3cgdGhlIERCQSBoYW5kbGVzIHJlY2VpdmVkIE1QQ1AgcmVwb3J0IGZyYW1lcy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbG9naWNhbF9saW5rX29wdGlvbnMsIHJlcG9ydGluZ19tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kYmFfcmVwb3J0aW5nX21vZGUgfSwgeyAubmFtZSA9ICJtYXhfbGlua3MiLCAuZGVzY3IgPSAiTWF4aW11bSBudW1iZXIgb2YgbGlua3MgdG8gcmVnaXN0ZXIgb24gdGhlIEVQT04gTkkuICBBIHZhbHVlIG9mIHplcm8gaW5kaWNhdGVzIG5vIGZpeGVkIGxpbWl0LiBUaGlzIGlzIGFuIGFnZ3JlZ2F0ZSBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIG5vbi1zeXN0ZW0gbGlua3Mgb24gYSBQT04uIFRoaXMgbGltaXQgYXBwbGllcyB0byBib3RoIHJlZ2lzdGVyZWQgYW5kIG5vbi1yZWdpc3RlcmVkIGxpbmtzLiBUaGlzIHZhbHVlIGNhbm5vdCBiZSByZWR1Y2VkIGJlbG93IHRoZSBjb3VudCBvZiBsaW5rcyBjdXJyZW50bHkgYWxsb2NhdGVkLCBub3IgaXMgaXQgdmFsaWQgdG8gaW5jcmVhc2UgaXQgYWJvdmUgdGhlIHN1bSBvZiB0aGUgcGVyIFJQIG1hY19saW5rcyBsaW1pdHMuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zLCBtYXhfbGlua3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucyA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbG9naWNhbF9saW5rX29wdGlvbnMiLCAuZGVzY3IgPSAiQ29uZmlndXJhdGlvbiByZWxhdGVkIHRvIEVQT04gbG9naWNhbCBsaW5rIHJlZ2lzdHJhdGlvbiBhbmQgcmVwb3J0aW5nLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbG9naWNhbF9saW5rX29wdGlvbnNfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9uc19maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibWFjX2FkZHJlc3MiLCAudmFsID0gQkNNT0xUX0VQT05fTklfQUREX0xJTktfSURfTUFDX0FERFJFU1MgfSwgeyAubmFtZSA9ICJyYXRlIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0FERF9MSU5LX0lEX1JBVEUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2FkZF9saW5rX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9hZGRfbGlua19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX25pX2FkZF9saW5rIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2FkZF9saW5rX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibWFjX2FkZHJlc3MiLCAudmFsID0gQkNNT0xUX0VQT05fTklfQUREX01VTFRJQ0FTVF9MSU5LX0lEX01BQ19BRERSRVNTIH0sIHsgLm5hbWUgPSAicmF0ZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9BRERfTVVMVElDQVNUX0xJTktfSURfUkFURSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmsgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibWFjX2FkZHJlc3MiLCAudmFsID0gQkNNT0xUX0VQT05fTklfQUREX1BST1RFQ1RFRF9TVEFOREJZX0xJTktfSURfTUFDX0FERFJFU1MgfSwgeyAubmFtZSA9ICJ3b3JraW5nX2xpbmtfaW5mbyIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9BRERfUFJPVEVDVEVEX1NUQU5EQllfTElOS19JRF9XT1JLSU5HX0xJTktfSU5GTyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmsgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19pZF9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9hbGFybV9zdGF0ZV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJub19yZXBvcnRzIiwgLmRlc2NyID0gIk5vIFJlcG9ydHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYWxhcm1fc3RhdGUsIG5vX3JlcG9ydHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2FsYXJtX3N0YXRlID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9hbGFybV9zdGF0ZSIsIC5kZXNjciA9ICJUaGUgbGlzdCBvZiBhbGFybXMgZGVmaW5lZCBmb3IgYW4gRVBPTiBOSSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2FsYXJtX3N0YXRlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfYWxhcm1fc3RhdGVfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9hbGFybV9zdGF0ZV9maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX0FVVE9fUk9HVUVfU0NBTl8xMEdfRkFJTFVSRSB9LCB7IC5uYW1lID0gImF1dG9fcm9ndWVfc2Nhbl8xZ19mYWlsdXJlIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX0FVVE9fUk9HVUVfU0NBTl8xR19GQUlMVVJFIH0sIHsgLm5hbWUgPSAibGxpZF9xdWFyYW50aW5lZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9MTElEX1FVQVJBTlRJTkVEIH0sIHsgLm5hbWUgPSAibXBjcF90aW1lc3RhbXBfY2hhbmdlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9NUENQX1RJTUVTVEFNUF9DSEFOR0VEIH0sIHsgLm5hbWUgPSAibm9fcmVwb3J0cyIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9OT19SRVBPUlRTIH0sIHsgLm5hbWUgPSAib251X3VwZ3JhZGVfY29tcGxldGUiLCAudmFsID0gQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfT05VX1VQR1JBREVfQ09NUExFVEUgfSwgeyAubmFtZSA9ICJyZXJhbmdlX2ZhaWx1cmUiLCAudmFsID0gQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfUkVSQU5HRV9GQUlMVVJFIH0sIHsgLm5hbWUgPSAicm9ndWVfc2Nhbl9jb21wbGV0ZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9ST0dVRV9TQ0FOX0NPTVBMRVRFIH0sIHsgLm5hbWUgPSAicnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQiLCAudmFsID0gQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURUQgfSwgeyAubmFtZSA9ICJzdGF0ZV9jaGFuZ2VfY29tcGxldGVkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX25pX2F1dG9fY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX25pX2F1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX25pX2F1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmVfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2F1dG9fcm9ndWVfc2Nhbl8xZ19mYWlsdXJlX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX25pX2F1dG9fcm9ndWVfc2Nhbl8xZ19mYWlsdXJlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2F1dG9fcm9ndWVfc2Nhbl8xZ19mYWlsdXJlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmVfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibWFjX2FkZHJlc3MiLCAudmFsID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01BQ19BRERSRVNTIH0sIHsgLm5hbWUgPSAiZXBvbl9uaV9lbiIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRVBPTl9OSV9FTiB9LCB7IC5uYW1lID0gInJlZ2lzdHJhdGlvbl9iZWhhdmlvciIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfUkVHSVNUUkFUSU9OX0JFSEFWSU9SIH0sIHsgLm5hbWUgPSAibXR1XzFnIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9NVFVfMUcgfSwgeyAubmFtZSA9ICJtdHVfMTBnIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9NVFVfMTBHIH0sIHsgLm5hbWUgPSAibWluaW11bV9maWJlcl9sZW5ndGgiLCAudmFsID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01JTklNVU1fRklCRVJfTEVOR1RIIH0sIHsgLm5hbWUgPSAibWF4aW11bV9maWJlcl9sZW5ndGgiLCAudmFsID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01BWElNVU1fRklCRVJfTEVOR1RIIH0sIHsgLm5hbWUgPSAiZ3JhbnRfc3BhY2luZ190cSIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfR1JBTlRfU1BBQ0lOR19UUSB9LCB7IC5uYW1lID0gImVwb25fbG9naWNhbF9saW5rX29wdGlvbnMiLCAudmFsID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0VQT05fTE9HSUNBTF9MSU5LX09QVElPTlMgfSwgeyAubmFtZSA9ICJtcGNwX2Rpc2NvdmVyeV9wZXJpb2RfbXMiLCAudmFsID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX01QQ1BfRElTQ09WRVJZX1BFUklPRF9NUyB9LCB7IC5uYW1lID0gImFsYXJtX3N0YXRlIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BTEFSTV9TVEFURSB9LCB7IC5uYW1lID0gImFsbF9saW5rcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQUxMX0xJTktTIH0sIHsgLm5hbWUgPSAiZW5jcnlwdGlvbl9jZmciLCAudmFsID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0VOQ1JZUFRJT05fQ0ZHIH0sIHsgLm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19DRkcgfSwgeyAubmFtZSA9ICJjbG9ja190cmFuc3BvcnRfY2ZnIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9DTE9DS19UUkFOU1BPUlRfQ0ZHIH0sIHsgLm5hbWUgPSAiZHJvcGRvd25fd2VpZ2h0cyIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRFJPUERPV05fV0VJR0hUUyB9LCB7IC5uYW1lID0gImFwcHJveGltYXRlX3NvbGljaXRlZF91c2FnZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQVBQUk9YSU1BVEVfU09MSUNJVEVEX1VTQUdFIH0sIHsgLm5hbWUgPSAiYXBwcm94aW1hdGVfdGRtX3VzYWdlIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BUFBST1hJTUFURV9URE1fVVNBR0UgfSwgeyAubmFtZSA9ICJub19yZXBvcnRzX3NvYWtfdGltZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTk9fUkVQT1JUU19TT0FLX1RJTUUgfSwgeyAubmFtZSA9ICJwb25fYWdncmVnYXRlX3NoYXBlciIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfUE9OX0FHR1JFR0FURV9TSEFQRVIgfSwgeyAubmFtZSA9ICJlc3RpbWF0ZWRfcG9uX2xhdGVuY3lfdHEiLCAudmFsID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0VTVElNQVRFRF9QT05fTEFURU5DWV9UUSB9LCB7IC5uYW1lID0gIm9udV91cGdyYWRlX3BhcmFtcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfT05VX1VQR1JBREVfUEFSQU1TIH0sIHsgLm5hbWUgPSAiYXV0b19yb2d1ZV9kZXRlY3RfMTBnX2VuIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BVVRPX1JPR1VFX0RFVEVDVF8xMEdfRU4gfSwgeyAubmFtZSA9ICJhdXRvX3JvZ3VlX2RldGVjdF8xZ19lbiIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQVVUT19ST0dVRV9ERVRFQ1RfMUdfRU4gfSwgeyAubmFtZSA9ICJhdXRvX3JvZ3VlX2RldGVjdF8xMGdfdGhyZXNob2xkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BVVRPX1JPR1VFX0RFVEVDVF8xMEdfVEhSRVNIT0xEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX25pX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX25pX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9uaV9jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9lbl9zdGF0ZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJkaXNhYmxlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9FTl9TVEFURV9ESVNBQkxFRCB9LCB7IC5uYW1lID0gImVuYWJsZWQiLCAudmFsID0gQkNNT0xUX0VQT05fTklfRU5fU1RBVEVfRU5BQkxFRCB9LCB7IC5uYW1lID0gInByb3RlY3RlZF93b3JraW5nIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0VOX1NUQVRFX1BST1RFQ1RFRF9XT1JLSU5HIH0sIHsgLm5hbWUgPSAicHJvdGVjdGVkX3N0YW5kYnkiLCAudmFsID0gQkNNT0xUX0VQT05fTklfRU5fU1RBVEVfUFJPVEVDVEVEX1NUQU5EQlkgfSwgeyAubmFtZSA9ICJwcm9jZXNzaW5nIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0VOX1NUQVRFX1BST0NFU1NJTkcgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2VuX3N0YXRlID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9lbl9zdGF0ZSIsIC5kZXNjciA9ICJFbmFibGUgc3RhdGUgb2YgdGhlIEVQT04gTkkuICBJbml0aWFsbHkgdGhlIG9ubHkgZW5hYmxlIHN0YXRlcyBkZWZpbmVkIGFyZSBgZGlzYWJsZWQnIGFuZCBgZW5hYmxlZCcsIGJ1dCB0aGlzIG1heSBsYXRlciBiZSBleHRlbmRlZCB0byBpbmNsdWRlIGRpZmZlcmVudCBkZWdyZWVzIG9mIGVuYWJsZW1lbnQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfZW5fc3RhdGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9uaV9lbl9zdGF0ZV9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9lbmNyeXB0aW9uX2NmZ19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJkb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSIsIC5kZXNjciA9ICJEb3duc3RyZWFtIGVuY3J5cHRpb24gbW9kZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfZW5jcnlwdGlvbl9jZmcsIGRvd25zdHJlYW1fZW5jcnlwdGlvbl9tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9lbmNyeXB0aW9uX21vZGUgfSwgeyAubmFtZSA9ICJ1cHN0cmVhbV9lbmNyeXB0aW9uX21vZGUiLCAuZGVzY3IgPSAiVXBzdHJlYW0gZW5jcnlwdGlvbiBtb2RlLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9lbmNyeXB0aW9uX2NmZywgdXBzdHJlYW1fZW5jcnlwdGlvbl9tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9lbmNyeXB0aW9uX21vZGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2VuY3J5cHRpb25fY2ZnID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9lbmNyeXB0aW9uX2NmZyIsIC5kZXNjciA9ICJFbmNyeXB0aW9uIGNvbmZpZ3VyYXRpb24gdGhhdCBhcHBsaWVzIHRvIHRoZSBFUE9OIE5JIGFzIGEgd2hvbGUuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfZW5jcnlwdGlvbl9jZmcpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9lbmNyeXB0aW9uX2NmZ19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2VuY3J5cHRpb25fY2ZnX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImdyYW50ZWRfbGluayIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX0dSQU5URURfTElOSyB9LCB7IC5uYW1lID0gInRyaWdnZXJfd2lkdGgiLCAudmFsID0gQkNNT0xUX0VQT05fTklfSVNTVUVfUlNTSV9HUkFOVF9JRF9UUklHR0VSX1dJRFRIIH0sIHsgLm5hbWUgPSAidHJpZ2dlcl9kZWxheSIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX1RSSUdHRVJfREVMQVkgfSwgeyAubmFtZSA9ICJzYW1wbGVfcGVyaW9kIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0lTU1VFX1JTU0lfR1JBTlRfSURfU0FNUExFX1BFUklPRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9rZXlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZXBvbl9uaSIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9LRVlfSURfRVBPTl9OSSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfa2V5X2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9rZXlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9uaV9rZXkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbmlfa2V5X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJsbGlkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0xMSURfUVVBUkFOVElORURfSURfTExJRCB9LCB7IC5uYW1lID0gImxpbmtfcmF0ZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9MTElEX1FVQVJBTlRJTkVEX0lEX0xJTktfUkFURSB9LCB7IC5uYW1lID0gImxpbmtfbWFjIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX0xMSURfUVVBUkFOVElORURfSURfTElOS19NQUMgfSwgeyAubmFtZSA9ICJyYW5nZV92YWx1ZV90cSIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9MTElEX1FVQVJBTlRJTkVEX0lEX1JBTkdFX1ZBTFVFX1RRIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbmlfbGxpZF9xdWFyYW50aW5lZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX25pX21wY3BfdGltZXN0YW1wX2NoYW5nZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibXBjcF90aW1lc3RhbXAiLCAudmFsID0gQkNNT0xUX0VQT05fTklfTVBDUF9USU1FU1RBTVBfQ0hBTkdFRF9JRF9NUENQX1RJTUVTVEFNUCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX25pX21wY3BfdGltZXN0YW1wX2NoYW5nZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX25pX21wY3BfdGltZXN0YW1wX2NoYW5nZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9OT19SRVBPUlRTX0lEX0FMQVJNX1NUQVRVUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0c19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0c19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX25pX25vX3JlcG9ydHMgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0c19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0dXMiLCAudmFsID0gQkNNT0xUX0VQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfU1RBVFVTIH0sIHsgLm5hbWUgPSAibGlzdF9vZl9mYWlsZWRfZW50aXRpZXMiLCAudmFsID0gQkNNT0xUX0VQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfTElTVF9PRl9GQUlMRURfRU5USVRJRVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInJlcmFuZ2VfZGVsdGEiLCAudmFsID0gQkNNT0xUX0VQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfQVBQTFlfUkVSQU5HRV9ERUxUQV9JRF9SRVJBTkdFX0RFTFRBIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX25pX3JlcmFuZ2VfZmFpbHVyZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX3JlcmFuZ2VfZmFpbHVyZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbmlfcmVyYW5nZV9mYWlsdXJlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbmlfcmVyYW5nZV9mYWlsdXJlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX3JlcmFuZ2VfZmFpbHVyZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX25pX3JlcmFuZ2VfZmFpbHVyZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJtb2RlIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX1JPR1VFX0xMSURfU0NBTl9JRF9NT0RFIH0sIHsgLm5hbWUgPSAibGxpZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9ST0dVRV9MTElEX1NDQU5fSURfTExJRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW5faWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW4gZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJyZXR1cm5faW5kX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9ST0dVRV9TQ0FOX0NPTVBMRVRFX0lEX1JFVFVSTl9JTkRfU1RBVFVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXR1cyIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9TVEFUVVMgfSwgeyAubmFtZSA9ICJsbGlkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX05JX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX0xMSUQgfSwgeyAubmFtZSA9ICJsaW5rX21hYyIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9MSU5LX01BQyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm5ld19zdGF0ZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9OSV9TRVRfRVBPTl9OSV9FTl9TVEFURV9JRF9ORVdfU1RBVEUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJsaXN0X29mX29udV9pZHMiLCAudmFsID0gQkNNT0xUX0VQT05fTklfU1RBUlRfT05VX1VQR1JBREVfSURfTElTVF9PRl9PTlVfSURTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJuZXdfc3RhdGUiLCAudmFsID0gQkNNT0xUX0VQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9ORVdfU1RBVEUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fb2FtX2V4dGVuc2lvbl90eXBlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInJlc2VydmVkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09BTV9FWFRFTlNJT05fVFlQRV9SRVNFUlZFRCB9LCB7IC5uYW1lID0gImJyb2FkY29tIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09BTV9FWFRFTlNJT05fVFlQRV9CUk9BRENPTSB9LCB7IC5uYW1lID0gImN0YyIsIC52YWwgPSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfQ1RDIH0sIHsgLm5hbWUgPSAiZGFzYW4iLCAudmFsID0gQkNNT0xUX0VQT05fT0FNX0VYVEVOU0lPTl9UWVBFX0RBU0FOIH0sIHsgLm5hbWUgPSAia3QiLCAudmFsID0gQkNNT0xUX0VQT05fT0FNX0VYVEVOU0lPTl9UWVBFX0tUIH0sIHsgLm5hbWUgPSAiZHBvZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9PQU1fRVhURU5TSU9OX1RZUEVfRFBPRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb2FtX2V4dGVuc2lvbl90eXBlID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9vYW1fZXh0ZW5zaW9uX3R5cGUiLCAuZGVzY3IgPSAiRVBPTiBPQU0gRXh0ZW5zaW9uIFR5cGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vYW1fZXh0ZW5zaW9uX3R5cGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9vYW1fZXh0ZW5zaW9uX3R5cGVfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWxsX2xpbmtzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfQ0ZHX0lEX0FMTF9MSU5LUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fb251XzEwZ191c19jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImVwb25fbmkiLCAudmFsID0gQkNNT0xUX0VQT05fT05VXzEwR19VU19LRVlfSURfRVBPTl9OSSB9LCB7IC5uYW1lID0gIm9udV9pZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0tFWV9JRF9PTlVfSUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5X2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX29udV8xMGdfdXNfa2V5IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXQiLCAudmFsID0gQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9DRkdfSURfQ0ZHIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fb251XzEwZ191c19zdGF0X2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJmZWNfY29kZV93b3Jkc190b3RhbCIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfRkVDX0NPREVfV09SRFNfVE9UQUwgfSwgeyAubmFtZSA9ICJmZWNfY29kZV93b3Jkc19kZWNvZGVfZmFpbHMiLCAudmFsID0gQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19DT0RFX1dPUkRTX0RFQ09ERV9GQUlMUyB9LCB7IC5uYW1lID0gImZlY196ZXJvZXNfY29ycmVjdGVkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9JRF9GRUNfWkVST0VTX0NPUlJFQ1RFRCB9LCB7IC5uYW1lID0gImZlY19vbmVzX2NvcnJlY3RlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfRkVDX09ORVNfQ09SUkVDVEVEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX29udV8xMGdfdXNfc3RhdCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV8xR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fb251XzFnX3VzX2F1dG9fY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX29udV8xZ191c19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWxsX2xpbmtzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV8xR19VU19DRkdfSURfQUxMX0xJTktTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fb251XzFnX3VzX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX29udV8xZ191c19rZXlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZXBvbl9uaSIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfS0VZX0lEX0VQT05fTkkgfSwgeyAubmFtZSA9ICJvbnVfaWQiLCAudmFsID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX0tFWV9JRF9PTlVfSUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xZ191c19rZXlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX29udV8xZ191c19rZXlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9vbnVfMWdfdXNfa2V5IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xZ191c19rZXlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNmZyIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9DRkdfSURfQ0ZHIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX29udV8xZ191c19zdGF0X2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJnb29kX2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9HT09EX0ZSQU1FUyB9LCB7IC5uYW1lID0gImdvb2RfYnl0ZXMiLCAudmFsID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfR09PRF9CWVRFUyB9LCB7IC5uYW1lID0gIm92ZXJzel9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfT1ZFUlNaX0ZSQU1FUyB9LCB7IC5uYW1lID0gIm5vbl9mZWNfZ29vZF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfTk9OX0ZFQ19HT09EX0ZSQU1FUyB9LCB7IC5uYW1lID0gIm5vbl9mZWNfZ29vZF9ieXRlcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9OT05fRkVDX0dPT0RfQllURVMgfSwgeyAubmFtZSA9ICJmZWNfZ29vZF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0dPT0RfRlJBTUVTIH0sIHsgLm5hbWUgPSAiZmVjX2dvb2RfYnl0ZXMiLCAudmFsID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0dPT0RfQllURVMgfSwgeyAubmFtZSA9ICJmZWNfZnJhbWVzX2V4Y19lcnJzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19GUkFNRVNfRVhDX0VSUlMgfSwgeyAubmFtZSA9ICJmZWNfYmxrc19ub19lcnJzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19CTEtTX05PX0VSUlMgfSwgeyAubmFtZSA9ICJmZWNfYmxrc19jb3JyX2VycnMiLCAudmFsID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0JMS1NfQ09SUl9FUlJTIH0sIHsgLm5hbWUgPSAiZmVjX2Jsa3NfdW5jb3JyX2VycnMiLCAudmFsID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0JMS1NfVU5DT1JSX0VSUlMgfSwgeyAubmFtZSA9ICJmZWNfY29ycl9ieXRlcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQ09SUl9CWVRFUyB9LCB7IC5uYW1lID0gImZlY19jb3JyX3plcm9lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQ09SUl9aRVJPRVMgfSwgeyAubmFtZSA9ICJmZWNfY29ycl9vbmVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19DT1JSX09ORVMgfSwgeyAubmFtZSA9ICJ1bmRlcnN6X2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9VTkRFUlNaX0ZSQU1FUyB9LCB7IC5uYW1lID0gImVycm9yc3pfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0VSUk9SU1pfRlJBTUVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9vbnVfMWdfdXNfc3RhdCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfb251X3Jlc3BvbnNlX2NvZGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAib2siLCAudmFsID0gQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfT0sgfSwgeyAubmFtZSA9ICJ1bmRlZmluZWQiLCAudmFsID0gQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfVU5ERUZJTkVEIH0sIHsgLm5hbWUgPSAibm90X2ZvdW5kIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX05PVF9GT1VORCB9LCB7IC5uYW1lID0gIm5vX2FjY2VzcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9OT19BQ0NFU1MgfSwgeyAubmFtZSA9ICJmdWxsIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX0ZVTEwgfSwgeyAubmFtZSA9ICJpbGxlZ2FsX29wZXJhdGlvbiIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9JTExFR0FMX09QRVJBVElPTiB9LCB7IC5uYW1lID0gInVua25vd25faWQiLCAudmFsID0gQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfVU5LTk9XTl9JRCB9LCB7IC5uYW1lID0gImJhZF9ibG9jayIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9CQURfQkxPQ0sgfSwgeyAubmFtZSA9ICJ0aW1lb3V0IiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX1RJTUVPVVQgfSwgeyAubmFtZSA9ICJidXN5IiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX0JVU1kgfSwgeyAubmFtZSA9ICJpbmNvbXBhdGlibGVfZmlsZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9JTkNPTVBBVElCTEVfRklMRSB9LCB7IC5uYW1lID0gImNvcnJ1cHRlZF9maWxlIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX0NPUlJVUFRFRF9GSUxFIH0sIHsgLm5hbWUgPSAiZXJyb3Jfbm90X2RlZmluZWQiLCAudmFsID0gQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfRVJST1JfTk9UX0RFRklORUQgfSwgeyAubmFtZSA9ICJlcnJvcl9hbGxvY19leGNlZWRlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9FUlJPUl9BTExPQ19FWENFRURFRCB9LCB7IC5uYW1lID0gImVycm9yX2lsbGVnYWxfb3AiLCAudmFsID0gQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfRVJST1JfSUxMRUdBTF9PUCB9LCB7IC5uYW1lID0gImVycm9yX2ZpbGVfZXhpc3RzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX0VSUk9SX0ZJTEVfRVhJU1RTIH0sIHsgLm5hbWUgPSAiZW5kX3dyaXRpbmdfbnZzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX0VORF9XUklUSU5HX05WUyB9LCB7IC5uYW1lID0gImVuZF9jcmNfZXJyb3IiLCAudmFsID0gQkNNT0xUX0VQT05fT05VX1VQR1JBREVfT05VX1JFU1BPTlNFX0NPREVfRU5EX0NSQ19FUlJPUiB9LCB7IC5uYW1lID0gImVuZF9wYXJhbV9lcnJvciIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9PTlVfUkVTUE9OU0VfQ09ERV9FTkRfUEFSQU1fRVJST1IgfSwgeyAubmFtZSA9ICJlbmRfY21kX3Vuc3VwcG9ydGVkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX0VORF9DTURfVU5TVVBQT1JURUQgfSwgeyAubmFtZSA9ICJsYXN0IiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX09OVV9SRVNQT05TRV9DT0RFX0xBU1QgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV91cGdyYWRlX29udV9yZXNwb25zZV9jb2RlID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9vbnVfcmVzcG9uc2VfY29kZSIsIC5kZXNjciA9ICJFUE9OIE9OVSBVcGdyYWRlIE9OVSBSZXNwb25zZSBDb2RlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfb251X3Jlc3BvbnNlX2NvZGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9vbnVfcmVzcG9uc2VfY29kZV9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXNfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAib2FtX2V4dGVuc2lvbl90eXBlIiwgLmRlc2NyID0gIk9BTSBFeHRlbnNpb24gVHlwZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXMsIG9hbV9leHRlbnNpb25fdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb2FtX2V4dGVuc2lvbl90eXBlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2Jyb2FkY29tX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJlc3BvbnNlX3RpbWVvdXRfbXMiLCAuZGVzY3IgPSAiVGhlIGxlbmd0aCBvZiB0aW1lIHRoYXQgdGhlIE9MVCB3aWxsIHdhaXQgZm9yIHRoZSBPTlUgdG8gcmVzcG9uZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zLCB1LmJyb2FkY29tLnJlc3BvbnNlX3RpbWVvdXRfbXMpIC0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zLCB1LmJyb2FkY29tLnJlc3BvbnNlX3RpbWVvdXRfbXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXNfYnJvYWRjb20gPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtc19icm9hZGNvbSIsIC5kZXNjciA9ICJFUE9OIE9OVSBVcGdyYWRlIFBhcmFtZXRlcnMgQnJvYWRjb20iLCAuc2l6ZSA9IHNpemVvZigoKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtcyAqKTApLT51LmJyb2FkY29tKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2Jyb2FkY29tX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2Jyb2FkY29tX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2N0Y19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyZXNwb25zZV90aW1lb3V0X21zIiwgLmRlc2NyID0gIlRoZSBsZW5ndGggb2YgdGltZSB0aGF0IHRoZSBPTFQgd2lsbCB3YWl0IGZvciB0aGUgT05VIHRvIHJlc3BvbmQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtcywgdS5jdGMucmVzcG9uc2VfdGltZW91dF9tcykgLSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXMsIHUuY3RjLnJlc3BvbnNlX3RpbWVvdXRfbXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXNfY3RjID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXNfY3RjIiwgLmRlc2NyID0gIkVQT04gT05VIFVwZ3JhZGUgUGFyYW1ldGVycyBDVEMiLCAuc2l6ZSA9IHNpemVvZigoKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtcyAqKTApLT51LmN0YyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtc19jdGNfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXNfY3RjX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2Rhc2FuX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJlc3BvbnNlX3RpbWVvdXRfbXMiLCAuZGVzY3IgPSAiVGhlIGxlbmd0aCBvZiB0aW1lIHRoYXQgdGhlIE9MVCB3aWxsIHdhaXQgZm9yIHRoZSBPTlUgdG8gcmVzcG9uZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zLCB1LmRhc2FuLnJlc3BvbnNlX3RpbWVvdXRfbXMpIC0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zLCB1LmRhc2FuLnJlc3BvbnNlX3RpbWVvdXRfbXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXNfZGFzYW4gPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtc19kYXNhbiIsIC5kZXNjciA9ICJFUE9OIE9OVSBVcGdyYWRlIFBhcmFtZXRlcnMgRGFzYW4iLCAuc2l6ZSA9IHNpemVvZigoKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtcyAqKTApLT51LmRhc2FuKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2Rhc2FuX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2Rhc2FuX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2t0X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJlc3BvbnNlX3RpbWVvdXRfbXMiLCAuZGVzY3IgPSAiVGhlIGxlbmd0aCBvZiB0aW1lIHRoYXQgdGhlIE9MVCB3aWxsIHdhaXQgZm9yIHRoZSBPTlUgdG8gcmVzcG9uZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zLCB1Lmt0LnJlc3BvbnNlX3RpbWVvdXRfbXMpIC0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zLCB1Lmt0LnJlc3BvbnNlX3RpbWVvdXRfbXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXNfa3QgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtc19rdCIsIC5kZXNjciA9ICJFUE9OIE9OVSBVcGdyYWRlIFBhcmFtZXRlcnMgS1QiLCAuc2l6ZSA9IHNpemVvZigoKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtcyAqKTApLT51Lmt0KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2t0X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2t0X2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2Rwb2VfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicmVzcG9uc2VfdGltZW91dF9tcyIsIC5kZXNjciA9ICJUaGUgbGVuZ3RoIG9mIHRpbWUgdGhhdCB0aGUgT0xUIHdpbGwgd2FpdCBmb3IgdGhlIE9OVSB0byByZXNwb25kLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXMsIHUuZHBvZS5yZXNwb25zZV90aW1lb3V0X21zKSAtIG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtcywgdS5kcG9lLnJlc3BvbnNlX3RpbWVvdXRfbXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiYmxvY2tfc2l6ZSIsIC5kZXNjciA9ICJOdW1iZXIgb2YgYnl0ZSBwZXIgZGF0YSBibG9jay4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zLCB1LmRwb2UuYmxvY2tfc2l6ZSkgLSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXMsIHUuZHBvZS5yZXNwb25zZV90aW1lb3V0X21zKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gImZpbmFsX2Fja19yZXNwb25zZV90aW1lb3V0IiwgLmRlc2NyID0gIlRpbWVvdXQgZm9yIHRoZSBmaW5hbCBBQ0sgcmVzcG9uc2UuICBUaGUgRFBvRSBzdGFuZGFyZCAxLjAgc3BlY2lmaWVzIHRoaXMgc2hvdWxkIGJlIGF0IGxlYXN0IDE1IHNlY29uZHMuICBVbml0IGlzIHNlY29uZHMuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtcywgdS5kcG9lLmZpbmFsX2Fja19yZXNwb25zZV90aW1lb3V0KSAtIG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtcywgdS5kcG9lLnJlc3BvbnNlX3RpbWVvdXRfbXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXNfZHBvZSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2Rwb2UiLCAuZGVzY3IgPSAiRVBPTiBPTlUgVXBncmFkZSBQYXJhbWV0ZXJzIERQb0UiLCAuc2l6ZSA9IHNpemVvZigoKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtcyAqKTApLT51LmRwb2UpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXNfZHBvZV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtc19kcG9lX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX3VuaW9uX2ZpZWxkc1tdID0geyB7IH0sIHsgLm5hbWUgPSAidS5icm9hZGNvbSIsIC5kZXNjciA9ICIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zLCB1LmJyb2FkY29tKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXNfYnJvYWRjb20gfSwgeyAubmFtZSA9ICJ1LmN0YyIsIC5kZXNjciA9ICIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zLCB1LmN0YyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2N0YyB9LCB7IC5uYW1lID0gInUuZGFzYW4iLCAuZGVzY3IgPSAiIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtcywgdS5kYXNhbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2Rhc2FuIH0sIHsgLm5hbWUgPSAidS5rdCIsIC5kZXNjciA9ICIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zLCB1Lmt0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXNfa3QgfSwgeyAubmFtZSA9ICJ1LmRwb2UiLCAuZGVzY3IgPSAiIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtcywgdS5kcG9lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXNfZHBvZSB9LCB7IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXMgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX29udV91cGdyYWRlX3BhcmFtcyIsIC5kZXNjciA9ICJFUE9OIE9OVSBVcGdyYWRlIFBhcmFtZXRlcnMiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXMpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9VTklPTiwgLnggPSB7IC51ID0geyAubnVtX2NvbW1vbl9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXNfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuY29tbW9uX2ZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX2ZpZWxkcywgLmNsYXNzaWZpZXJfaWR4ID0gMCwgLnVuaW9uX2ZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zX3VuaW9uX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9yZXR1cm5fY29kZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdWNjZXNzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX1JFVFVSTl9DT0RFX1NVQ0NFU1MgfSwgeyAubmFtZSA9ICJvbnVfcmVzcG9uc2VfdGltZW91dCIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9SRVRVUk5fQ09ERV9PTlVfUkVTUE9OU0VfVElNRU9VVCB9LCB7IC5uYW1lID0gIm9udV9lcnJvcl9yZXNwb25zZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9SRVRVUk5fQ09ERV9PTlVfRVJST1JfUkVTUE9OU0UgfSwgeyAubmFtZSA9ICJzeW5jX2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX1JFVFVSTl9DT0RFX1NZTkNfRVJST1IgfSwgeyAubmFtZSA9ICJjb21taXRfZmFpbGVkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX1JFVFVSTl9DT0RFX0NPTU1JVF9GQUlMRUQgfSwgeyAubmFtZSA9ICJpbnRlcm5hbCIsIC52YWwgPSBCQ01PTFRfRVBPTl9PTlVfVVBHUkFERV9SRVRVUk5fQ09ERV9JTlRFUk5BTCB9LCB7IC5uYW1lID0gInBhcnNlX2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9FUE9OX09OVV9VUEdSQURFX1JFVFVSTl9DT0RFX1BBUlNFX0VSUk9SIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfdXBncmFkZV9yZXR1cm5fY29kZSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcmV0dXJuX2NvZGUiLCAuZGVzY3IgPSAiRVBPTiBPTlUgVXBncmFkZSBSZXR1cm4gQ29kZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3JldHVybl9jb2RlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcmV0dXJuX2NvZGVfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm9udV9pZCIsIC5kZXNjciA9ICJPTlUgSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzLCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX21hY19hZGRyZXNzIH0sIHsgLm5hbWUgPSAiZXJyb3JfY29kZSIsIC5kZXNjciA9ICJVcGdyYWRlIHN0YXR1cy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzLCBlcnJvcl9jb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfdXBncmFkZV9yZXR1cm5fY29kZSB9LCB7IC5uYW1lID0gIm9udV9yZXR1cm5fY29kZSIsIC5kZXNjciA9ICJSZXNwb25zZSBjb2RlIGZyb20gdGhlIE9OVS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzLCBvbnVfcmV0dXJuX2NvZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV91cGdyYWRlX29udV9yZXNwb25zZV9jb2RlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXMgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1cyIsIC5kZXNjciA9ICJFUE9OIE9OVSBVcGdyYWRlIFN0YXR1cyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1cyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzIiLCAuZGVzY3IgPSAiVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgZXBvbl9vbnVfdXBncmFkZV9zdGF0dXMiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzIpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRFlOLCAueCA9IHsgLmFycl9keW4gPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXMsIC5sZW5fc2l6ZSA9IDQsIC5tYXhfc2l6ZSA9IERFRkFVTFRfRFlOX0FSUl9NQVhfU0laRSAvIHNpemVvZihiY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXMpIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fcGF0aF8xMGdfZHNfYXV0b19jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJmZWNfc3RhdGUiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfQ0ZHX0lEX0ZFQ19TVEFURSB9LCB7IC5uYW1lID0gInByYnNfZ2VuZXJhdG9yIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0NGR19JRF9QUkJTX0dFTkVSQVRPUiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9wYXRoXzEwZ19kc19jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImVwb25fbmkiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfS0VZX0lEX0VQT05fTkkgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fcGF0aF8xMGdfZHNfa2V5IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJjZmciLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9DRkdfSURfQ0ZHIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJieXRlcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0JZVEVTIH0sIHsgLm5hbWUgPSAiZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTIH0sIHsgLm5hbWUgPSAiZnJhbWVzXzY0IiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzY0IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzY1XzEyNyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU182NV8xMjcgfSwgeyAubmFtZSA9ICJmcmFtZXNfMTI4XzI1NSIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzI1Nl81MTEiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMSB9LCB7IC5uYW1lID0gImZyYW1lc181MTJfMTAyMyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMyB9LCB7IC5uYW1lID0gImZyYW1lc18xMDI0XzE1MTgiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzE1MTlfMjA0NyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDcgfSwgeyAubmFtZSA9ICJmcmFtZXNfMjA0OF80MDk1IiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NSB9LCB7IC5uYW1lID0gImZyYW1lc180MDk2XzkyMTYiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzkyMTdfMTYzODMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MyB9LCB7IC5uYW1lID0gImJyb2FkY2FzdF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTIH0sIHsgLm5hbWUgPSAiZGF0YV9ieXRlcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0RBVEFfQllURVMgfSwgeyAubmFtZSA9ICJtdWx0aWNhc3RfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUyB9LCB7IC5uYW1lID0gInVuaWNhc3RfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVMgfSwgeyAubmFtZSA9ICJvYW1fYnl0ZXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9PQU1fQllURVMgfSwgeyAubmFtZSA9ICJvYW1fZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfT0FNX0ZSQU1FUyB9LCB7IC5uYW1lID0gImdhdGVfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfR0FURV9GUkFNRVMgfSwgeyAubmFtZSA9ICJtcGNwX2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX01QQ1BfRlJBTUVTIH0sIHsgLm5hbWUgPSAiYWJvcnRfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfQUJPUlRfRlJBTUVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fcGF0aF8xMGdfZHNfc3RhdCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fcGF0aF8xMGdfdXNfYXV0b19jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJmZWNfc3RhdGUiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX0ZFQ19TVEFURSB9LCB7IC5uYW1lID0gInN5bmNfdGltZV90cSIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfU1lOQ19USU1FX1RRIH0sIHsgLm5hbWUgPSAicHJic19jaGVja2VyIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0NGR19JRF9QUkJTX0NIRUNLRVIgfSwgeyAubmFtZSA9ICJwcmJzX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfUFJCU19TVEFUVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fcGF0aF8xMGdfdXNfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJlcG9uX25pIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0tFWV9JRF9FUE9OX05JIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3BhdGhfMTBnX3VzX2tleSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQ0ZHX0lEX0NGRyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYnl0ZXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9CWVRFUyB9LCB7IC5uYW1lID0gImZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FUyB9LCB7IC5uYW1lID0gImZyYW1lc182NCIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU182NCB9LCB7IC5uYW1lID0gImZyYW1lc182NV8xMjciLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzEyOF8yNTUiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NSB9LCB7IC5uYW1lID0gImZyYW1lc18yNTZfNTExIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTEgfSwgeyAubmFtZSA9ICJmcmFtZXNfNTEyXzEwMjMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjMgfSwgeyAubmFtZSA9ICJmcmFtZXNfMTAyNF8xNTE4IiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxOCB9LCB7IC5uYW1lID0gImZyYW1lc18xNTE5XzIwNDciLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzIwNDhfNDA5NSIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTUgfSwgeyAubmFtZSA9ICJmcmFtZXNfNDA5Nl85MjE2IiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNiB9LCB7IC5uYW1lID0gImZyYW1lc185MjE3XzE2MzgzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODMgfSwgeyAubmFtZSA9ICJicm9hZGNhc3RfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUyB9LCB7IC5uYW1lID0gImRhdGFfYnl0ZXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9EQVRBX0JZVEVTIH0sIHsgLm5hbWUgPSAibXVsdGljYXN0X2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVMgfSwgeyAubmFtZSA9ICJ1bmljYXN0X2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTIH0sIHsgLm5hbWUgPSAibXBjcF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9NUENQX0ZSQU1FUyB9LCB7IC5uYW1lID0gIm9hbV9ieXRlcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX09BTV9CWVRFUyB9LCB7IC5uYW1lID0gIm9hbV9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9PQU1fRlJBTUVTIH0sIHsgLm5hbWUgPSAicmVwb3J0X2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX1JFUE9SVF9GUkFNRVMgfSwgeyAubmFtZSA9ICJhYm9ydF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9BQk9SVF9GUkFNRVMgfSwgeyAubmFtZSA9ICJmY3NfZXJyb3IiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GQ1NfRVJST1IgfSwgeyAubmFtZSA9ICJjcmNfOF9lcnJvciIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0NSQ184X0VSUk9SIH0sIHsgLm5hbWUgPSAib3V0X29mX3Nsb3QiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9PVVRfT0ZfU0xPVCB9LCB7IC5uYW1lID0gIm92ZXJzaXplX2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfT1ZFUlNJWkVfRVJST1IgfSwgeyAubmFtZSA9ICJydW50X2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfUlVOVF9FUlJPUiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3BhdGhfMTBnX3VzX3N0YXQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZGVmYXVsdF9mZWNfc3RhdGUiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19DRkdfSURfREVGQVVMVF9GRUNfU1RBVEUgfSwgeyAubmFtZSA9ICJyYW1hbl9tb2RlIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQ0ZHX0lEX1JBTUFOX01PREUgfSwgeyAubmFtZSA9ICJ0dXJib18yZ19tb2RlIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQ0ZHX0lEX1RVUkJPXzJHX01PREUgfSwgeyAubmFtZSA9ICJwcmJzX2dlbmVyYXRvciIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9QUkJTX0dFTkVSQVRPUiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fcGF0aF8xZ19kc19jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImVwb25fbmkiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19LRVlfSURfRVBPTl9OSSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fcGF0aF8xZ19kc19rZXkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXQiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJjZmciLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0NGR19JRF9DRkcgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImJ5dGVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9CWVRFUyB9LCB7IC5uYW1lID0gImZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTIH0sIHsgLm5hbWUgPSAiZnJhbWVzXzY0IiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfNjQgfSwgeyAubmFtZSA9ICJmcmFtZXNfNjVfMTI3IiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzEyOF8yNTUiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzI1Nl81MTEiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExIH0sIHsgLm5hbWUgPSAiZnJhbWVzXzUxMl8xMDIzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjMgfSwgeyAubmFtZSA9ICJmcmFtZXNfMTAyNF8xNTE4IiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzE1MTlfMjA0NyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NyB9LCB7IC5uYW1lID0gImZyYW1lc18yMDQ4XzQwOTUiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTUgfSwgeyAubmFtZSA9ICJmcmFtZXNfNDA5Nl85MjE2IiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzkyMTdfMTYzODMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzIH0sIHsgLm5hbWUgPSAiYnJvYWRjYXN0X2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUyB9LCB7IC5uYW1lID0gImRhdGFfYnl0ZXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0RBVEFfQllURVMgfSwgeyAubmFtZSA9ICJtdWx0aWNhc3RfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTIH0sIHsgLm5hbWUgPSAidW5pY2FzdF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTIH0sIHsgLm5hbWUgPSAib2FtX2J5dGVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9PQU1fQllURVMgfSwgeyAubmFtZSA9ICJvYW1fZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9PQU1fRlJBTUVTIH0sIHsgLm5hbWUgPSAiZ2F0ZV9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0dBVEVfRlJBTUVTIH0sIHsgLm5hbWUgPSAibXBjcF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX01QQ1BfRlJBTUVTIH0sIHsgLm5hbWUgPSAiYWJvcnRfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9BQk9SVF9GUkFNRVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fcGF0aF8xZ19kc19zdGF0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3BhdGhfMWdfdXNfYXV0b19jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJkZWZhdWx0X2ZlY19zdGF0ZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0NGR19JRF9ERUZBVUxUX0ZFQ19TVEFURSB9LCB7IC5uYW1lID0gInN5bmNfdGltZV90cSIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0NGR19JRF9TWU5DX1RJTUVfVFEgfSwgeyAubmFtZSA9ICJwcmJzX2NoZWNrZXIiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19DRkdfSURfUFJCU19DSEVDS0VSIH0sIHsgLm5hbWUgPSAicHJic19zdGF0dXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19DRkdfSURfUFJCU19TVEFUVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3BhdGhfMWdfdXNfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJlcG9uX25pIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfS0VZX0lEX0VQT05fTkkgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5X2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3BhdGhfMWdfdXNfa2V5IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXQiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9DRkdfSURfQ0ZHIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGVwb25fcGF0aF8xZ191c19zdGF0X2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJieXRlcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfQllURVMgfSwgeyAubmFtZSA9ICJmcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FUyB9LCB7IC5uYW1lID0gImZyYW1lc182NCIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzY0IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzY1XzEyNyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzY1XzEyNyB9LCB7IC5uYW1lID0gImZyYW1lc18xMjhfMjU1IiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NSB9LCB7IC5uYW1lID0gImZyYW1lc18yNTZfNTExIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMSB9LCB7IC5uYW1lID0gImZyYW1lc181MTJfMTAyMyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzIH0sIHsgLm5hbWUgPSAiZnJhbWVzXzEwMjRfMTUxOCIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxOCB9LCB7IC5uYW1lID0gImZyYW1lc18xNTE5XzIwNDciLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDcgfSwgeyAubmFtZSA9ICJmcmFtZXNfMjA0OF80MDk1IiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzQwOTZfOTIxNiIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNiB9LCB7IC5uYW1lID0gImZyYW1lc185MjE3XzE2MzgzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MyB9LCB7IC5uYW1lID0gImJyb2FkY2FzdF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVMgfSwgeyAubmFtZSA9ICJkYXRhX2J5dGVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9EQVRBX0JZVEVTIH0sIHsgLm5hbWUgPSAibXVsdGljYXN0X2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUyB9LCB7IC5uYW1lID0gInVuaWNhc3RfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUyB9LCB7IC5uYW1lID0gIm1wY3BfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9NUENQX0ZSQU1FUyB9LCB7IC5uYW1lID0gIm9hbV9ieXRlcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfT0FNX0JZVEVTIH0sIHsgLm5hbWUgPSAib2FtX2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfT0FNX0ZSQU1FUyB9LCB7IC5uYW1lID0gInJlcG9ydF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX1JFUE9SVF9GUkFNRVMgfSwgeyAubmFtZSA9ICJhYm9ydF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0FCT1JUX0ZSQU1FUyB9LCB7IC5uYW1lID0gImZjc19lcnJvciIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRkNTX0VSUk9SIH0sIHsgLm5hbWUgPSAiY3JjXzhfZXJyb3IiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0NSQ184X0VSUk9SIH0sIHsgLm5hbWUgPSAib3V0X29mX3Nsb3QiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX09VVF9PRl9TTE9UIH0sIHsgLm5hbWUgPSAib3ZlcnNpemVfZXJyb3IiLCAudmFsID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX09WRVJTSVpFX0VSUk9SIH0sIHsgLm5hbWUgPSAicnVudF9lcnJvciIsIC52YWwgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfUlVOVF9FUlJPUiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2lkID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZXBvbl9wYXRoXzFnX3VzX3N0YXQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zdGF0ZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJ1bnByb3RlY3RlZCIsIC52YWwgPSBCQ01PTFRfRVBPTl9QUk9URUNUSU9OX1NUQVRFX1VOUFJPVEVDVEVEIH0sIHsgLm5hbWUgPSAicHJvdGVjdGVkX3N0YW5kYnkiLCAudmFsID0gQkNNT0xUX0VQT05fUFJPVEVDVElPTl9TVEFURV9QUk9URUNURURfU1RBTkRCWSB9LCB7IC5uYW1lID0gInByb3RlY3RlZF93b3JraW5nIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BST1RFQ1RJT05fU1RBVEVfUFJPVEVDVEVEX1dPUktJTkcgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3RhdGUgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3RhdGUiLCAuZGVzY3IgPSAiSW5kaWNhdGVzIHdoZXRoZXIgbGlua3MgYXJlIHVucHJvdGVjdGVkLCBwcm90ZWN0ZWQgc3RhbmRieSwgb3IgcHJvdGVjdGVkIHdvcmtpbmcuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zdGF0ZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3RhdGVfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm5vX3Byb3RlY3Rpb25fc3d0aWNoaW5nIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BST1RFQ1RJT05fU1dJVENISU5HX1RZUEVfTk9fUFJPVEVDVElPTl9TV1RJQ0hJTkcgfSwgeyAubmFtZSA9ICJsaW5lX2NhcmRfcHJvdGVjdGlvbl9zd2l0Y2hpbmciLCAudmFsID0gQkNNT0xUX0VQT05fUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFlQRV9MSU5FX0NBUkRfUFJPVEVDVElPTl9TV0lUQ0hJTkcgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGUgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGUiLCAuZGVzY3IgPSAiRVBPTiBQcm90ZWN0aW9uIFN3aXRjaGluZyBUeXBlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGV0ZWN0aW9uX29wdGlvbnNfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibm9uZSIsIC52YWwgPSBCQ01PTFRfUFJPVEVDVElPTl9TV0lUQ0hJTkdfREVURUNUSU9OX09QVElPTlNfTk9ORSB9LCB7IC5uYW1lID0gInN0YW5kYnlfbG9zX2RldGVjdGlvbiIsIC52YWwgPSBCQ01PTFRfUFJPVEVDVElPTl9TV0lUQ0hJTkdfREVURUNUSU9OX09QVElPTlNfU1RBTkRCWV9MT1NfREVURUNUSU9OIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGV0ZWN0aW9uX29wdGlvbnMgPSB7IC5uYW1lID0gImJjbW9sdF9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZXRlY3Rpb25fb3B0aW9ucyIsIC5kZXNjciA9ICJQcm90ZWN0aW9uIFN3aXRjaGluZyBEZXRlY3Rpb24gT3B0aW9ucyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZXRlY3Rpb25fb3B0aW9ucyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU1fTUFTSywgLnggPSB7IC5lID0gYmNtb2x0X3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RldGVjdGlvbl9vcHRpb25zX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfcmVyYW5naW5nX29wdGlvbnNfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicmVyYW5nZV9ub25lIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BST1RFQ1RJT05fU1dJVENISU5HX1JFUkFOR0lOR19PUFRJT05TX1JFUkFOR0VfTk9ORSB9LCB7IC5uYW1lID0gInJlcmFuZ2Vfc2luZ2xlX2xvZ2ljYWxfbGluayIsIC52YWwgPSBCQ01PTFRfRVBPTl9QUk9URUNUSU9OX1NXSVRDSElOR19SRVJBTkdJTkdfT1BUSU9OU19SRVJBTkdFX1NJTkdMRV9MT0dJQ0FMX0xJTksgfSwgeyAubmFtZSA9ICJyZXJhbmdlX2FsbF9sb2dpY2FsX2xpbmtzIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1BST1RFQ1RJT05fU1dJVENISU5HX1JFUkFOR0lOR19PUFRJT05TX1JFUkFOR0VfQUxMX0xPR0lDQUxfTElOS1MgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3JlcmFuZ2luZ19vcHRpb25zID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19yZXJhbmdpbmdfb3B0aW9ucyIsIC5kZXNjciA9ICJDcml0ZXJpYSBmb3IgbG9naWNhbCBsaW5rIHNlbGVjdGlvbiBkdXJpbmcgcmUtcmFuZ2luZyBwcm9jZXNzIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfcmVyYW5naW5nX29wdGlvbnMpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19yZXJhbmdpbmdfb3B0aW9uc19zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncGlvX3Bpbl9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwaW4wIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU4wIH0sIHsgLm5hbWUgPSAicGluMSIsIC52YWwgPSBCQ01PTFRfR1BJT19QSU5fUElOMSB9LCB7IC5uYW1lID0gInBpbjIiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjIgfSwgeyAubmFtZSA9ICJwaW4zIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU4zIH0sIHsgLm5hbWUgPSAicGluNCIsIC52YWwgPSBCQ01PTFRfR1BJT19QSU5fUElONCB9LCB7IC5uYW1lID0gInBpbjUiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjUgfSwgeyAubmFtZSA9ICJwaW42IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU42IH0sIHsgLm5hbWUgPSAicGluNyIsIC52YWwgPSBCQ01PTFRfR1BJT19QSU5fUElONyB9LCB7IC5uYW1lID0gInBpbjgiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjggfSwgeyAubmFtZSA9ICJwaW45IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU45IH0sIHsgLm5hbWUgPSAicGluMTAiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjEwIH0sIHsgLm5hbWUgPSAicGluMTEiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjExIH0sIHsgLm5hbWUgPSAicGluMTIiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjEyIH0sIHsgLm5hbWUgPSAicGluMTMiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjEzIH0sIHsgLm5hbWUgPSAicGluMTQiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjE0IH0sIHsgLm5hbWUgPSAicGluMTUiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjE1IH0sIHsgLm5hbWUgPSAicGluMTYiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjE2IH0sIHsgLm5hbWUgPSAicGluMTciLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjE3IH0sIHsgLm5hbWUgPSAicGluMTgiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjE4IH0sIHsgLm5hbWUgPSAicGluMTkiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjE5IH0sIHsgLm5hbWUgPSAicGluMjAiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjIwIH0sIHsgLm5hbWUgPSAicGluMjEiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjIxIH0sIHsgLm5hbWUgPSAicGluMjIiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjIyIH0sIHsgLm5hbWUgPSAicGluMjMiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjIzIH0sIHsgLm5hbWUgPSAicGluMjQiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjI0IH0sIHsgLm5hbWUgPSAicGluMjUiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjI1IH0sIHsgLm5hbWUgPSAicGluMjYiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjI2IH0sIHsgLm5hbWUgPSAicGluMjciLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjI3IH0sIHsgLm5hbWUgPSAicGluMjgiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjI4IH0sIHsgLm5hbWUgPSAicGluMjkiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjI5IH0sIHsgLm5hbWUgPSAicGluMzAiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjMwIH0sIHsgLm5hbWUgPSAicGluMzEiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjMxIH0sIHsgLm5hbWUgPSAicGluMzIiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjMyIH0sIHsgLm5hbWUgPSAicGluMzMiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjMzIH0sIHsgLm5hbWUgPSAicGluMzQiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjM0IH0sIHsgLm5hbWUgPSAicGluMzUiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjM1IH0sIHsgLm5hbWUgPSAicGluMzYiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjM2IH0sIHsgLm5hbWUgPSAicGluMzciLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjM3IH0sIHsgLm5hbWUgPSAicGluMzgiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjM4IH0sIHsgLm5hbWUgPSAicGluMzkiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjM5IH0sIHsgLm5hbWUgPSAicGluNDAiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjQwIH0sIHsgLm5hbWUgPSAicGluNDEiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjQxIH0sIHsgLm5hbWUgPSAicGluNDIiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjQyIH0sIHsgLm5hbWUgPSAicGluNDMiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjQzIH0sIHsgLm5hbWUgPSAicGluNDQiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjQ0IH0sIHsgLm5hbWUgPSAicGluNDUiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjQ1IH0sIHsgLm5hbWUgPSAicGluNDYiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjQ2IH0sIHsgLm5hbWUgPSAicGluNDciLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjQ3IH0sIHsgLm5hbWUgPSAicGluNDgiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjQ4IH0sIHsgLm5hbWUgPSAicGluNDkiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjQ5IH0sIHsgLm5hbWUgPSAicGluNTAiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjUwIH0sIHsgLm5hbWUgPSAicGluNTEiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjUxIH0sIHsgLm5hbWUgPSAicGluNTIiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjUyIH0sIHsgLm5hbWUgPSAicGluNTMiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjUzIH0sIHsgLm5hbWUgPSAicGluNTQiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjU0IH0sIHsgLm5hbWUgPSAicGluNTUiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjU1IH0sIHsgLm5hbWUgPSAicGluNTYiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjU2IH0sIHsgLm5hbWUgPSAicGluNTciLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjU3IH0sIHsgLm5hbWUgPSAicGluNTgiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjU4IH0sIHsgLm5hbWUgPSAicGluNTkiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjU5IH0sIHsgLm5hbWUgPSAicGluNjAiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjYwIH0sIHsgLm5hbWUgPSAicGluNjEiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjYxIH0sIHsgLm5hbWUgPSAicGluNjIiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjYyIH0sIHsgLm5hbWUgPSAicGluNjMiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjYzIH0sIHsgLm5hbWUgPSAicGluNjQiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjY0IH0sIHsgLm5hbWUgPSAicGluNjUiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjY1IH0sIHsgLm5hbWUgPSAicGluNjYiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjY2IH0sIHsgLm5hbWUgPSAicGluNjciLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjY3IH0sIHsgLm5hbWUgPSAicGluNjgiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjY4IH0sIHsgLm5hbWUgPSAicGluNjkiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjY5IH0sIHsgLm5hbWUgPSAicGluNzAiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjcwIH0sIHsgLm5hbWUgPSAicGluNzEiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjcxIH0sIHsgLm5hbWUgPSAicGluNzIiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjcyIH0sIHsgLm5hbWUgPSAicGluNzMiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjczIH0sIHsgLm5hbWUgPSAicGluNzQiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjc0IH0sIHsgLm5hbWUgPSAicGluNzUiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjc1IH0sIHsgLm5hbWUgPSAicGluNzYiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjc2IH0sIHsgLm5hbWUgPSAicGluNzciLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjc3IH0sIHsgLm5hbWUgPSAicGluNzgiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjc4IH0sIHsgLm5hbWUgPSAicGluNzkiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjc5IH0sIHsgLm5hbWUgPSAicGluODAiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjgwIH0sIHsgLm5hbWUgPSAicGluODEiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjgxIH0sIHsgLm5hbWUgPSAicGluODIiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjgyIH0sIHsgLm5hbWUgPSAicGluODMiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjgzIH0sIHsgLm5hbWUgPSAicGluODQiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjg0IH0sIHsgLm5hbWUgPSAicGluODUiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjg1IH0sIHsgLm5hbWUgPSAicGluODYiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjg2IH0sIHsgLm5hbWUgPSAicGluODciLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjg3IH0sIHsgLm5hbWUgPSAicGluODgiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjg4IH0sIHsgLm5hbWUgPSAicGluODkiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjg5IH0sIHsgLm5hbWUgPSAicGluOTAiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjkwIH0sIHsgLm5hbWUgPSAicGluOTEiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjkxIH0sIHsgLm5hbWUgPSAicGluOTIiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjkyIH0sIHsgLm5hbWUgPSAicGluOTMiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjkzIH0sIHsgLm5hbWUgPSAicGluOTQiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjk0IH0sIHsgLm5hbWUgPSAicGluOTUiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjk1IH0sIHsgLm5hbWUgPSAicGluOTYiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjk2IH0sIHsgLm5hbWUgPSAicGluOTciLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjk3IH0sIHsgLm5hbWUgPSAicGluOTgiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjk4IH0sIHsgLm5hbWUgPSAicGluOTkiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjk5IH0sIHsgLm5hbWUgPSAicGluMTAwIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU4xMDAgfSwgeyAubmFtZSA9ICJwaW4xMDEiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjEwMSB9LCB7IC5uYW1lID0gInBpbjEwMiIsIC52YWwgPSBCQ01PTFRfR1BJT19QSU5fUElOMTAyIH0sIHsgLm5hbWUgPSAicGluMTAzIiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU4xMDMgfSwgeyAubmFtZSA9ICJwaW4xMDQiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1BJTjEwNCB9LCB7IC5uYW1lID0gInBpbjEwNSIsIC52YWwgPSBCQ01PTFRfR1BJT19QSU5fUElOMTA1IH0sIHsgLm5hbWUgPSAicGluMTA2IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9QSU4xMDYgfSwgeyAubmFtZSA9ICJ1bmNvbmZpZ3VyZWQiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX1VOQ09ORklHVVJFRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwaW9fcGluID0geyAubmFtZSA9ICJiY21vbHRfZ3Bpb19waW4iLCAuZGVzY3IgPSAiR1BJTyBwaW4gbnVtYmVyIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwaW9fcGluKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwaW9fcGluX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwaW9fcG9sYXJpdHlfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWN0aXZlX2xvdyIsIC52YWwgPSBCQ01PTFRfR1BJT19QT0xBUklUWV9BQ1RJVkVfTE9XIH0sIHsgLm5hbWUgPSAiYWN0aXZlX2hpZ2giLCAudmFsID0gQkNNT0xUX0dQSU9fUE9MQVJJVFlfQUNUSVZFX0hJR0ggfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncGlvX3BvbGFyaXR5ID0geyAubmFtZSA9ICJiY21vbHRfZ3Bpb19wb2xhcml0eSIsIC5kZXNjciA9ICJHUElPIFBvbGFyaXR5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwaW9fcG9sYXJpdHkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bpb19wb2xhcml0eV9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19jb25maWd1cmF0aW9uX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInByb3RlY3Rpb25fdHlwZSIsIC5kZXNjciA9ICJQcm90ZWN0aW9uIHNjaGVtZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY29uZmlndXJhdGlvbiwgcHJvdGVjdGlvbl90eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlIH0sIHsgLm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfb3B0aW9ucyIsIC5kZXNjciA9ICJQcm90ZWN0aW9uIHN3aXRjaGluZyBvcHRpb25zIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2NvbmZpZ3VyYXRpb24sIHByb3RlY3Rpb25fc3dpdGNoaW5nX29wdGlvbnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZXRlY3Rpb25fb3B0aW9ucyB9LCB7IC5uYW1lID0gInJlcmFuZ2Vfb3B0aW9ucyIsIC5kZXNjciA9ICJSZS1yYW5naW5nIGFsZ29yaXRobSBzZWxlY3Rpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY29uZmlndXJhdGlvbiwgcmVyYW5nZV9vcHRpb25zKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19yZXJhbmdpbmdfb3B0aW9ucyB9LCB7IC5uYW1lID0gInJlcmFuZ2VfYXR0ZW1wdHMiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIHRpbWVzIHRvIHJlIHJhbmdlIGR1cmluZyBhIHN3aXRjaCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19jb25maWd1cmF0aW9uLCByZXJhbmdlX2F0dGVtcHRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAicmVyYW5nZV9pbnRlcnZhbCIsIC5kZXNjciA9ICJJbnRlcnZhbCBiZXR3ZWVuIHJlLXJhbmdlIGF0dGVtcHRzLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19jb25maWd1cmF0aW9uLCByZXJhbmdlX2ludGVydmFsKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gInN5bmNfZ2F0ZV9kdXJhdGlvbiIsIC5kZXNjciA9ICJEdXJhdGlvbiBvZiBzeW5jIGdhdGUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2NvbmZpZ3VyYXRpb24sIHN5bmNfZ2F0ZV9kdXJhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJncGlvX2lucHV0IiwgLmRlc2NyID0gIkNvbmZpZ3VyZXMgc3RhdGUgb24gUE9OICh3b3JraW5nL3N0YW5kYnkpIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2NvbmZpZ3VyYXRpb24sIGdwaW9faW5wdXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncGlvX3BpbiB9LCB7IC5uYW1lID0gImdwaW9faW5wdXRfcG9sYXJpdHkiLCAuZGVzY3IgPSAiR1BJTyBJbnB1dCBQb2xhcml0eSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19jb25maWd1cmF0aW9uLCBncGlvX2lucHV0X3BvbGFyaXR5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bpb19wb2xhcml0eSB9LCB7IC5uYW1lID0gImdwaW9fb3V0cHV0IiwgLmRlc2NyID0gIkluZGljYXRlcyBzdGF0ZSBvbiBQT04gKHdvcmtpbmcvc3RhbmRieSkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY29uZmlndXJhdGlvbiwgZ3Bpb19vdXRwdXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncGlvX3BpbiB9LCB7IC5uYW1lID0gImdwaW9fb3V0cHV0X3BvbGFyaXR5IiwgLmRlc2NyID0gIkdQSU8gT3V0cHV0IFBvbGFyaXR5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2NvbmZpZ3VyYXRpb24sIGdwaW9fb3V0cHV0X3BvbGFyaXR5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bpb19wb2xhcml0eSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY29uZmlndXJhdGlvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY29uZmlndXJhdGlvbiIsIC5kZXNjciA9ICJFUE9OIHByb3RlY3Rpb24gc3dpdGNoaW5nIGNvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19jb25maWd1cmF0aW9uKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY29uZmlndXJhdGlvbl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2NvbmZpZ3VyYXRpb25fZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3JwX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJiYXNlX2xsaWQiLCAudmFsID0gQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX0JBU0VfTExJRCB9LCB7IC5uYW1lID0gIm1wY3BfZGlzY19lbiIsIC52YWwgPSBCQ01PTFRfRVBPTl9SUF9DRkdfSURfTVBDUF9ESVNDX0VOIH0sIHsgLm5hbWUgPSAibXBjcF9kaXNjX2dudF9sZW5fdHEiLCAudmFsID0gQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01QQ1BfRElTQ19HTlRfTEVOX1RRIH0sIHsgLm5hbWUgPSAibXBjcF9yZXBvcnRfdGltZW91dCIsIC52YWwgPSBCQ01PTFRfRVBPTl9SUF9DRkdfSURfTVBDUF9SRVBPUlRfVElNRU9VVCB9LCB7IC5uYW1lID0gIm1heF9tcGNwX3JlZ19wZXJfZGlzY193aW5kb3ciLCAudmFsID0gQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01BWF9NUENQX1JFR19QRVJfRElTQ19XSU5ET1cgfSwgeyAubmFtZSA9ICJtYXhfbGlua3MiLCAudmFsID0gQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01BWF9MSU5LUyB9LCB7IC5uYW1lID0gImRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoIiwgLnZhbCA9IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9ERUZBVUxUX1VQU1RSRUFNX0JBTkRXSURUSCB9LCB7IC5uYW1lID0gInJhdGVfb2ZfcmVmcmFjdGlvbiIsIC52YWwgPSBCQ01PTFRfRVBPTl9SUF9DRkdfSURfUkFURV9PRl9SRUZSQUNUSU9OIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9ycF9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3JwX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3JwX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9ycF9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9ycF9jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9ycF9rZXlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZXBvbl9uaSIsIC52YWwgPSBCQ01PTFRfRVBPTl9SUF9LRVlfSURfRVBPTl9OSSB9LCB7IC5uYW1lID0gImxpbmtfcmF0ZSIsIC52YWwgPSBCQ01PTFRfRVBPTl9SUF9LRVlfSURfTElOS19SQVRFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9ycF9rZXlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3JwX2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBlcG9uX3JwX2tleSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9ycF9rZXlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXBvbl9ycF9rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdThfbGlzdF91MTYgPSB7IC5uYW1lID0gImJjbW9sdF91OF9saXN0X3UxNiIsIC5kZXNjciA9ICJWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiBVOCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF91OF9saXN0X3UxNiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9EWU4sIC54ID0geyAuYXJyX2R5biA9IHsgLmVsZW1fdHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QsIC5sZW5fc2l6ZSA9IDIsIC5tYXhfc2l6ZSA9IERFRkFVTFRfRFlOX0FSUl9NQVhfU0laRSAvIHNpemVvZih1aW50OF90KSB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2V0aGVybmV0X2ZyYW1lX21hc2tlZF9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJmcmFtZV9vY3RldHMiLCAuZGVzY3IgPSAiRnJhbWUgb2N0ZXRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ldGhlcm5ldF9mcmFtZV9tYXNrZWQsIGZyYW1lX29jdGV0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3U4X2xpc3RfdTE2IH0sIHsgLm5hbWUgPSAibWFza19vY3RldHMiLCAuZGVzY3IgPSAiTWFzayBvY3RldHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2V0aGVybmV0X2ZyYW1lX21hc2tlZCwgbWFza19vY3RldHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91OF9saXN0X3UxNiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2V0aGVybmV0X2ZyYW1lX21hc2tlZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2V0aGVybmV0X2ZyYW1lX21hc2tlZCIsIC5kZXNjciA9ICJFdGhlcm5ldCBmcmFtZSwgbWFza2VkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2V0aGVybmV0X2ZyYW1lX21hc2tlZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ldGhlcm5ldF9mcmFtZV9tYXNrZWRfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXRoZXJuZXRfZnJhbWVfbWFza2VkX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2V0aGVybmV0X2ZyYW1lX3VubWFza2VkX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImZyYW1lX29jdGV0cyIsIC5kZXNjciA9ICJGcmFtZSBvY3RldHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2V0aGVybmV0X2ZyYW1lX3VubWFza2VkLCBmcmFtZV9vY3RldHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91OF9saXN0X3UxNiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2V0aGVybmV0X2ZyYW1lX3VubWFza2VkID0geyAubmFtZSA9ICJiY21vbHRfZXRoZXJuZXRfZnJhbWVfdW5tYXNrZWQiLCAuZGVzY3IgPSAiRXRoZXJuZXQgZnJhbWUsIHVubWFza2VkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2V0aGVybmV0X2ZyYW1lX3VubWFza2VkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2V0aGVybmV0X2ZyYW1lX3VubWFza2VkX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2V0aGVybmV0X2ZyYW1lX3VubWFza2VkX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXh0X2lycV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJleHRfaXJxMCIsIC52YWwgPSBCQ01PTFRfRVhUX0lSUV9FWFRfSVJRMCB9LCB7IC5uYW1lID0gImV4dF9pcnExIiwgLnZhbCA9IEJDTU9MVF9FWFRfSVJRX0VYVF9JUlExIH0sIHsgLm5hbWUgPSAiZXh0X2lycTIiLCAudmFsID0gQkNNT0xUX0VYVF9JUlFfRVhUX0lSUTIgfSwgeyAubmFtZSA9ICJleHRfaXJxMyIsIC52YWwgPSBCQ01PTFRfRVhUX0lSUV9FWFRfSVJRMyB9LCB7IC5uYW1lID0gImV4dF9pcnE0IiwgLnZhbCA9IEJDTU9MVF9FWFRfSVJRX0VYVF9JUlE0IH0sIHsgLm5hbWUgPSAiZXh0X2lycTUiLCAudmFsID0gQkNNT0xUX0VYVF9JUlFfRVhUX0lSUTUgfSwgeyAubmFtZSA9ICJ1bmNvbmZpZ3VyZWQiLCAudmFsID0gQkNNT0xUX0VYVF9JUlFfVU5DT05GSUdVUkVEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXh0X2lycSA9IHsgLm5hbWUgPSAiYmNtb2x0X2V4dF9pcnEiLCAuZGVzY3IgPSAiRXh0ZXJuYWwgSVJRIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2V4dF9pcnEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZXh0X2lycV9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhZGRpdGlvbmFsX3ByZWJ1cnN0X2d1YXJkX3RpbWUiLCAuZGVzY3IgPSAiQWRkaXRpb25hbCBndWFyZCB0aW1lIChpbiBieXRlcykgYmVmb3JlIGFsbCBidXJzdHMgZm9yIHRoaXMgT05VLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZSwgYWRkaXRpb25hbF9wcmVidXJzdF9ndWFyZF90aW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImFkZGl0aW9uYWxfcG9zdGJ1cnN0X2d1YXJkX3RpbWUiLCAuZGVzY3IgPSAiQWRkaXRpb25hbCBndWFyZCB0aW1lIChpbiBieXRlcykgYWZ0ZXIgYWxsIGJ1cnN0cyBmb3IgdGhpcyBPTlUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9leHRlbmRlZF9ndWFyZF90aW1lLCBhZGRpdGlvbmFsX3Bvc3RidXJzdF9ndWFyZF90aW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2V4dGVuZGVkX2d1YXJkX3RpbWUgPSB7IC5uYW1lID0gImJjbW9sdF9leHRlbmRlZF9ndWFyZF90aW1lIiwgLmRlc2NyID0gIkV4dGVuZGVkIEd1YXJkIFRpbWUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXh0ZW5kZWRfZ3VhcmRfdGltZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9leHRlbmRlZF9ndWFyZF90aW1lX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2V4dGVuZGVkX2d1YXJkX3RpbWVfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiBzdHJpbmdfMzIgPSB7IC5uYW1lID0gInN0cmluZ1szMl0iLCAuZGVzY3IgPSAiQVNDSUkgc3RyaW5nIHdpdGggbWF4IGxlbmd0aCAzMiIsIC5zaXplID0gc2l6ZW9mKGNoYXJbMzJdKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSSU5HIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9maXJtd2FyZV9zd192ZXJzaW9uX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm1ham9yIiwgLmRlc2NyID0gIk1ham9yICIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbiwgbWFqb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJtaW5vciIsIC5kZXNjciA9ICJNaW5vciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbiwgbWlub3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJyZXZpc2lvbiIsIC5kZXNjciA9ICJSZXZpc2lvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbiwgcmV2aXNpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3RfaGV4IH0sIHsgLm5hbWUgPSAibW9kZWwiLCAuZGVzY3IgPSAiTW9kZWwiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Zpcm13YXJlX3N3X3ZlcnNpb24sIG1vZGVsKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImJ1aWxkX3RpbWUiLCAuZGVzY3IgPSAiRmlybXdhcmUgU1cgYnVpbGQgdGltZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbiwgYnVpbGRfdGltZSksIC50eXBlID0gJnN0cmluZ18zMiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Zpcm13YXJlX3N3X3ZlcnNpb24gPSB7IC5uYW1lID0gImJjbW9sdF9maXJtd2FyZV9zd192ZXJzaW9uIiwgLmRlc2NyID0gIkZpcm13YXJlIFNXIFZlcnNpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9maXJtd2FyZV9zd192ZXJzaW9uX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Zpcm13YXJlX3N3X3ZlcnNpb25fZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9mbHVzaF9tYWNfdGFibGVfb3B0aW9uX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsbCIsIC52YWwgPSBCQ01PTFRfRkxVU0hfTUFDX1RBQkxFX09QVElPTl9BTEwgfSwgeyAubmFtZSA9ICJwZXJfdmlkIiwgLnZhbCA9IEJDTU9MVF9GTFVTSF9NQUNfVEFCTEVfT1BUSU9OX1BFUl9WSUQgfSwgeyAubmFtZSA9ICJwZXJfZmxvdyIsIC52YWwgPSBCQ01PTFRfRkxVU0hfTUFDX1RBQkxFX09QVElPTl9QRVJfRkxPVyB9LCB7IC5uYW1lID0gInZpZF9wbHVzX2Zsb3ciLCAudmFsID0gQkNNT0xUX0ZMVVNIX01BQ19UQUJMRV9PUFRJT05fVklEX1BMVVNfRkxPVyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2ZsdXNoX21hY190YWJsZV9vcHRpb24gPSB7IC5uYW1lID0gImJjbW9sdF9mbHVzaF9tYWNfdGFibGVfb3B0aW9uIiwgLmRlc2NyID0gIkZsdXNoIE1BQyB0YWJsZSBvcHRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZmx1c2hfbWFjX3RhYmxlX29wdGlvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9mbHVzaF9tYWNfdGFibGVfb3B0aW9uX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2ZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbl9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJsb3dlciIsIC52YWwgPSBCQ01PTFRfRlJFUVVFTkNZX0FESlVTVE1FTlRfRElSRUNUSU9OX0xPV0VSIH0sIHsgLm5hbWUgPSAiaGlnaGVyIiwgLnZhbCA9IEJDTU9MVF9GUkVRVUVOQ1lfQURKVVNUTUVOVF9ESVJFQ1RJT05fSElHSEVSIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZnJlcXVlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uID0geyAubmFtZSA9ICJiY21vbHRfZnJlcXVlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uIiwgLmRlc2NyID0gIkZyZXF1ZW5jeSBhZGp1c3RtZW50IGRpcmVjdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9mcmVxdWVuY3lfYWRqdXN0bWVudF9kaXJlY3Rpb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZnJlcXVlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dlbV9wb3J0X2RpcmVjdGlvbl9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJkb3duc3RyZWFtIiwgLnZhbCA9IEJDTU9MVF9HRU1fUE9SVF9ESVJFQ1RJT05fRE9XTlNUUkVBTSB9LCB7IC5uYW1lID0gInVwc3RyZWFtIiwgLnZhbCA9IEJDTU9MVF9HRU1fUE9SVF9ESVJFQ1RJT05fVVBTVFJFQU0gfSwgeyAubmFtZSA9ICJiaWRpcmVjdGlvbmFsIiwgLnZhbCA9IEJDTU9MVF9HRU1fUE9SVF9ESVJFQ1RJT05fQklESVJFQ1RJT05BTCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dlbV9wb3J0X2RpcmVjdGlvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X2dlbV9wb3J0X2RpcmVjdGlvbiIsIC5kZXNjciA9ICJHRU0gcG9ydCBJRCBkaXJlY3Rpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ2VtX3BvcnRfZGlyZWN0aW9uKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dlbV9wb3J0X2RpcmVjdGlvbl9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9nZW1fcG9ydF90eXBlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInVuaWNhc3QiLCAudmFsID0gQkNNT0xUX0dFTV9QT1JUX1RZUEVfVU5JQ0FTVCB9LCB7IC5uYW1lID0gIm11bHRpY2FzdCIsIC52YWwgPSBCQ01PTFRfR0VNX1BPUlRfVFlQRV9NVUxUSUNBU1QgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9nZW1fcG9ydF90eXBlID0geyAubmFtZSA9ICJiY21vbHRfZ2VtX3BvcnRfdHlwZSIsIC5kZXNjciA9ICJHRU0gcG9ydCB0eXBlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dlbV9wb3J0X3R5cGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ2VtX3BvcnRfdHlwZV9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJkaXJlY3Rpb24iLCAuZGVzY3IgPSAiR0VNIHBvcnQgZGlyZWN0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9nZW1fcG9ydF9jb25maWd1cmF0aW9uLCBkaXJlY3Rpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9nZW1fcG9ydF9kaXJlY3Rpb24gfSwgeyAubmFtZSA9ICJ0eXBlIiwgLmRlc2NyID0gIkdFTSBwb3J0IHR5cGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb24sIHR5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9nZW1fcG9ydF90eXBlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ2VtX3BvcnRfY29uZmlndXJhdGlvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb24iLCAuZGVzY3IgPSAiR0VNIHBvcnQgY29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9nZW1fcG9ydF9jb25maWd1cmF0aW9uKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dlbV9wb3J0X29wZXJhdGlvbl9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhY3RpdmF0ZSIsIC52YWwgPSBCQ01PTFRfR0VNX1BPUlRfT1BFUkFUSU9OX0FDVElWQVRFIH0sIHsgLm5hbWUgPSAiZGVhY3RpdmF0ZSIsIC52YWwgPSBCQ01PTFRfR0VNX1BPUlRfT1BFUkFUSU9OX0RFQUNUSVZBVEUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9nZW1fcG9ydF9vcGVyYXRpb24gPSB7IC5uYW1lID0gImJjbW9sdF9nZW1fcG9ydF9vcGVyYXRpb24iLCAuZGVzY3IgPSAiR0VNIHBvcnQgb3BlcmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dlbV9wb3J0X29wZXJhdGlvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9nZW1fcG9ydF9vcGVyYXRpb25fc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bpb19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZGlyZWN0aW9uIiwgLnZhbCA9IEJDTU9MVF9HUElPX0NGR19JRF9ESVJFQ1RJT04gfSwgeyAubmFtZSA9ICJ2YWx1ZSIsIC52YWwgPSBCQ01PTFRfR1BJT19DRkdfSURfVkFMVUUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncGlvX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwaW9fY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwaW9fY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncGlvX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncGlvX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncGlvX2tleV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJyZXNlcnZlZCIsIC52YWwgPSBCQ01PTFRfR1BJT19LRVlfSURfUkVTRVJWRUQgfSwgeyAubmFtZSA9ICJncGlvX2lkIiwgLnZhbCA9IEJDTU9MVF9HUElPX0tFWV9JRF9HUElPX0lEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bpb19rZXlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncGlvX2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncGlvX2tleSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bpb19rZXlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bpb19rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bpb19waW5fZGlyX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImlucHV0IiwgLnZhbCA9IEJDTU9MVF9HUElPX1BJTl9ESVJfSU5QVVQgfSwgeyAubmFtZSA9ICJvdXRwdXQiLCAudmFsID0gQkNNT0xUX0dQSU9fUElOX0RJUl9PVVRQVVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncGlvX3Bpbl9kaXIgPSB7IC5uYW1lID0gImJjbW9sdF9ncGlvX3Bpbl9kaXIiLCAuZGVzY3IgPSAiR1BJTyBQSU4gRGlyZWN0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwaW9fcGluX2RpciksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncGlvX3Bpbl9kaXJfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bpb192YWx1ZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJjbGVhciIsIC52YWwgPSBCQ01PTFRfR1BJT19WQUxVRV9DTEVBUiB9LCB7IC5uYW1lID0gInNldCIsIC52YWwgPSBCQ01PTFRfR1BJT19WQUxVRV9TRVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncGlvX3ZhbHVlID0geyAubmFtZSA9ICJiY21vbHRfZ3Bpb192YWx1ZSIsIC5kZXNjciA9ICJHUElPIFZhbHVlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwaW9fdmFsdWUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bpb192YWx1ZV9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNvbmZpZ3VyYXRpb25fY29tcGxldGVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAiZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0NGR19JRF9HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9hbGxvY19hdXRvX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXRlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0FMTE9DX0NGR19JRF9TVEFURSB9LCB7IC5uYW1lID0gInNsYSIsIC52YWwgPSBCQ01PTFRfR1BPTl9BTExPQ19DRkdfSURfU0xBIH0sIHsgLm5hbWUgPSAib251X2lkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0FMTE9DX0NGR19JRF9PTlVfSUQgfSwgeyAubmFtZSA9ICJjb2xsZWN0X3N0YXRzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0FMTE9DX0NGR19JRF9DT0xMRUNUX1NUQVRTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2FsbG9jX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2FsbG9jX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9hbGxvY19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0dXMiLCAudmFsID0gQkNNT0xUX0dQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfU1RBVFVTIH0sIHsgLm5hbWUgPSAibmV3X3N0YXRlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX05FV19TVEFURSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfU1RBVFVTIH0sIHsgLm5hbWUgPSAiYXZlcmFnZV9uc3JfdXNlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX0FWRVJBR0VfTlNSX1VTRUQgfSwgeyAubmFtZSA9ICJhdmVyYWdlX25zcl9hbGxvY2F0ZWQiLCAudmFsID0gQkNNT0xUX0dQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX05TUl9BTExPQ0FURUQgfSwgeyAubmFtZSA9ICJhdmVyYWdlX3NyX3JlcG9ydCIsIC52YWwgPSBCQ01PTFRfR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX0FWRVJBR0VfU1JfUkVQT1JUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0c19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJudW1fb2ZfY3ljbGVzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0FMTE9DX0dFVF9TVEFUU19JRF9OVU1fT0ZfQ1lDTEVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0c19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2FsbG9jX2dldF9zdGF0cyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9hbGxvY19rZXlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicG9uX25pIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0FMTE9DX0tFWV9JRF9QT05fTkkgfSwgeyAubmFtZSA9ICJhbGxvY19pZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9BTExPQ19LRVlfSURfQUxMT0NfSUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX2tleV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fYWxsb2Nfa2V5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fYWxsb2Nfa2V5IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX2tleV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX2FsbG9jX2tleV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0ZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9BTExPQ19TRVRfU1RBVEVfSURfU1RBVEUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fYWxsb2Nfc2V0X3N0YXRlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9HUE9OX0FMTE9DX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9HUE9OX0FMTE9DX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJjZmciLCAudmFsID0gQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9DRkdfSURfQ0ZHIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9hbGxvY19zdGF0X2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJyeF9ieXRlcyIsIC52YWwgPSBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0lEX1JYX0JZVEVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fYWxsb2Nfc3RhdCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9pZF9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFsbG9jX2lkIiwgLmRlc2NyID0gIkFsbG9jIElEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGUsIGFsbG9jX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gInN0YXRlIiwgLmRlc2NyID0gIlN0YXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGUsIHN0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYWxsb2Nfc3RhdGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGUgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGUiLCAuZGVzY3IgPSAiR1BPTiBBbGxvYyBXaXRoIFN0YXRlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGVfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMiA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzIiLCAuZGVzY3IgPSAiVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgZ3Bvbl9hbGxvY193aXRoX3N0YXRlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzIpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRFlOLCAueCA9IHsgLmFycl9keW4gPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY193aXRoX3N0YXRlLCAubGVuX3NpemUgPSAyLCAubWF4X3NpemUgPSAzMiB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZGVidWdfZmxvd19jb25maWdfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAidW50YWdnZWRfZmxvdyIsIC5kZXNjciA9ICJJZiBlbmFibGVkLCB0aGlzIEdFTSBwb3J0IHdpbGwgZXhwZWN0IHVwc3RyZWFtIHRyYWZmaWMgdG8gYmUgdW50YWdnZWQgYW5kIGRvd25zdHJlYW0gdHJhZmZpYyB0byB1c2UgYSBjdXN0b20gVkxBTiB0YWcuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2RlYnVnX2Zsb3dfY29uZmlnLCB1bnRhZ2dlZF9mbG93KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY29udHJvbF9zdGF0ZSB9LCB7IC5uYW1lID0gInVudGFnZ2VkX3ZpZCIsIC5kZXNjciA9ICJUaGUgVkxBTiBJRCB0byB1c2Ugd2hlbiBhZGRpbmcgTUFDIHRhYmxlIGVudHJpZXMgZm9yIHVudGFnZ2VkIHRyYWZmaWMuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2RlYnVnX2Zsb3dfY29uZmlnLCB1bnRhZ2dlZF92aWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9kZWJ1Z19mbG93X2NvbmZpZyA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fZGVidWdfZmxvd19jb25maWciLCAuZGVzY3IgPSAiR1BPTiBEZWJ1ZyBGbG93IENvbmZpZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2RlYnVnX2Zsb3dfY29uZmlnKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZGVidWdfZmxvd19jb25maWdfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9kZWJ1Z19mbG93X2NvbmZpZ19maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2ID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTYiLCAuZGVzY3IgPSAiVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgZ3Bvbl9nZW1faWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTYpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRFlOLCAueCA9IHsgLmFycl9keW4gPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCwgLmxlbl9zaXplID0gMSwgLm1heF9zaXplID0gMTYgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiY29uZmlndXJhdGlvbl9jb21wbGV0ZWQiLCAudmFsID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAudmFsID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAudmFsID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2dlbV9wb3J0X2F1dG9fY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiY29uZmlndXJhdGlvbiIsIC52YWwgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfQ09ORklHVVJBVElPTiB9LCB7IC5uYW1lID0gIm9udV9pZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfT05VX0lEIH0sIHsgLm5hbWUgPSAiZ2VtX3BvcnRfc3RhdGUiLCAudmFsID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX0dFTV9QT1JUX1NUQVRFIH0sIHsgLm5hbWUgPSAiZG93bnN0cmVhbV9lbmNyeXB0aW9uX21vZGUiLCAudmFsID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX0RPV05TVFJFQU1fRU5DUllQVElPTl9NT0RFIH0sIHsgLm5hbWUgPSAidXBzdHJlYW1fZGVzdGluYXRpb25fcXVldWUiLCAudmFsID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX1VQU1RSRUFNX0RFU1RJTkFUSU9OX1FVRVVFIH0sIHsgLm5hbWUgPSAiY29udHJvbCIsIC52YWwgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfQ09OVFJPTCB9LCB7IC5uYW1lID0gImRlYnVnX2Zsb3dfY29uZmlnIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9ERUJVR19GTE9XX0NPTkZJRyB9LCB7IC5uYW1lID0gIm1hY190YWJsZV9lbnRyeV9saW1pdCIsIC52YWwgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfTUFDX1RBQkxFX0VOVFJZX0xJTUlUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2dlbV9wb3J0X2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0dXMiLCAudmFsID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfU1RBVFVTIH0sIHsgLm5hbWUgPSAibmV3X3N0YXRlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX05FV19TVEFURSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAudmFsID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfS0VZX0lEX1BPTl9OSSB9LCB7IC5uYW1lID0gImdlbV9wb3J0X2lkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0tFWV9JRF9HRU1fUE9SVF9JRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5X2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9nZW1fcG9ydF9rZXkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXRlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NFVF9TVEFURV9JRF9TVEFURSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGVfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGUgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXQiLCAudmFsID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXQiLCAudmFsID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNmZyIsIC52YWwgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0NGR19JRF9DRkcgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2dlbV9wb3J0X3N0YXRfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInJ4X3BhY2tldHMiLCAudmFsID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9QQUNLRVRTIH0sIHsgLm5hbWUgPSAicnhfYnl0ZXMiLCAudmFsID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9CWVRFUyB9LCB7IC5uYW1lID0gInR4X3BhY2tldHMiLCAudmFsID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9UWF9QQUNLRVRTIH0sIHsgLm5hbWUgPSAidHhfYnl0ZXMiLCAudmFsID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9UWF9CWVRFUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2dlbV9wb3J0X3N0YXQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0ZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJub3RfY29uZmlndXJlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFURV9OT1RfQ09ORklHVVJFRCB9LCB7IC5uYW1lID0gImluYWN0aXZlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRFX0lOQUNUSVZFIH0sIHsgLm5hbWUgPSAicHJvY2Vzc2luZyIsIC52YWwgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFURV9QUk9DRVNTSU5HIH0sIHsgLm5hbWUgPSAiYWN0aXZlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRFX0FDVElWRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdGUgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRlIiwgLmRlc2NyID0gIkdQT04gR0VNIFBvcnQgU3RhdGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0ZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRlX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZ2VtX2lkIiwgLmRlc2NyID0gIkdFTSBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlLCBnZW1faWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAic3RhdGUiLCAuZGVzY3IgPSAiU3RhdGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSwgc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlIiwgLmRlc2NyID0gIkdQT04gR0VNIFBvcnQgV2l0aCBTdGF0ZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4ID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjgiLCAuZGVzY3IgPSAiVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0RZTiwgLnggPSB7IC5hcnJfZHluID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSwgLmxlbl9zaXplID0gMiwgLm1heF9zaXplID0gMTI4IH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1NiA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2IiwgLmRlc2NyID0gIlZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzI1NiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9EWU4sIC54ID0geyAuYXJyX2R5biA9IHsgLmVsZW1fdHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGUsIC5sZW5fc2l6ZSA9IDIsIC5tYXhfc2l6ZSA9IDI1NiB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfQVVUT19DRkdfSURfRkxVU0hfTUFDX1RBQkxFX0NPTVBMRVRFRCB9LCB7IC5uYW1lID0gInNjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfQVVUT19DRkdfSURfU0NBTl9NQUNfVEFCTEVfQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25faXdmX2F1dG9fY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2l3Zl9jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiaXdmX21vZGUiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX0NGR19JRF9JV0ZfTU9ERSB9LCB7IC5uYW1lID0gInVzX3RwaWRfcGVyX2Zsb3ciLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX0NGR19JRF9VU19UUElEX1BFUl9GTE9XIH0sIHsgLm5hbWUgPSAidXNfb3RhZ19kaXJlY3RfdHBpZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX1VTX09UQUdfRElSRUNUX1RQSUQgfSwgeyAubmFtZSA9ICJ1c19vdGFnX2RpcmVjdF9wYml0IiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfVVNfT1RBR19ESVJFQ1RfUEJJVCB9LCB7IC5uYW1lID0gImRzX3RwaWQiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX0NGR19JRF9EU19UUElEIH0sIHsgLm5hbWUgPSAibWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24iLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX0NGR19JRF9NQUNfVEFCTEVfQ09ORklHVVJBVElPTiB9LCB7IC5uYW1lID0gImRlYnVnX2Zsb3dfY29uZmlndXJhdGlvbiIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX0RFQlVHX0ZMT1dfQ09ORklHVVJBVElPTiB9LCB7IC5uYW1lID0gIm1hY190YWJsZV9jb3VudCIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX01BQ19UQUJMRV9DT1VOVCB9LCB7IC5uYW1lID0gImZvcmJpZGRlbl92bGFuX2Zsb3dfZ2VtX3JhbmdlX3N0YXJ0IiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfRk9SQklEREVOX1ZMQU5fRkxPV19HRU1fUkFOR0VfU1RBUlQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2l3Zl9jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2ZfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9kZWJ1Z19mbG93X2NvbmZpZ19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJsZWFybl91bnRhZ2dlZF9mbG93X3ZpZHMiLCAuZGVzY3IgPSAiV2hlbiBhIE1BQy9WSUQgaXMgbGVhcm5lZCBvbiBhbiB1bnRhZ2dlZCBmbG93LCBsZWFybiB0aGUgcmVjZWl2ZWQgTUFDIGFkZHJlc3Mgd2l0aCBib3RoIHRoZSB1bnRhZ2dlZCBWSUQgYW5kIHRoZSByZWNlaXZlZCBWSUQgKGV2ZW4gdGhvdWdoIGl0IHdpbGwgYmUgaW52YWxpZCkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9kZWJ1Z19mbG93X2NvbmZpZywgbGVhcm5fdW50YWdnZWRfZmxvd192aWRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAidW50YWdnZWRfZmxvd19zaGFwaW5nX21zX3Blcl9zZWMiLCAuZGVzY3IgPSAiSWYgdGhpcyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gMCwgbGVhcm5pbmcgZXZlbnRzIG9uIHVudGFnZ2VkIGZsb3dzIHdpbGwgb25seSBiZSBlbmFibGVkIGZvciBOIG1pbGxpc2Vjb25kcyBldmVyeSBzZWNvbmQuICBGb3IgZXhhbXBsZSwgYSB2YWx1ZSBvZiAxMCB3b3VsZCBtZWFuIGxlYXJuaW5nIGlzIG9ubHkgZW5hYmxlZCBmb3IgMSUgb2YgdGhlIHRvdGFsIHRpbWUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9kZWJ1Z19mbG93X2NvbmZpZywgdW50YWdnZWRfZmxvd19zaGFwaW5nX21zX3Blcl9zZWMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfZGVidWdfZmxvd19jb25maWcgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2l3Zl9kZWJ1Z19mbG93X2NvbmZpZyIsIC5kZXNjciA9ICJPcHRpb25zIGZvciBjb25maWd1cmluZyB0aGUgXCJ1bnRhZ2dlZCBmbG93XCIgZmVhdHVyZS4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfZGVidWdfZmxvd19jb25maWcpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfZGVidWdfZmxvd19jb25maWdfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfZGVidWdfZmxvd19jb25maWdfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZ2VtX3BvcnQiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0NGR19JRF9HRU1fUE9SVCB9LCB7IC5uYW1lID0gInBiaXRfY29udHJvbCIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1dfQ0ZHX0lEX1BCSVRfQ09OVFJPTCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInBvbl9uaSIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1dfS0VZX0lEX1BPTl9OSSB9LCB7IC5uYW1lID0gImZsb3dfaWQiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0tFWV9JRF9GTE9XX0lEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5X2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25faXdmX2RzX2VncmVzc19mbG93X2tleSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm1hcHBpbmdfbWV0aG9kIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfQ0ZHX0lEX01BUFBJTkdfTUVUSE9EIH0sIHsgLm5hbWUgPSAibWFwcGluZ190YWciLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19DRkdfSURfTUFQUElOR19UQUcgfSwgeyAubmFtZSA9ICJ2bGFuX2FjdGlvbiIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0NGR19JRF9WTEFOX0FDVElPTiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInBvbl9uaSIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XX0tFWV9JRF9QT05fTkkgfSwgeyAubmFtZSA9ICJ2bGFuX2lkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfS0VZX0lEX1ZMQU5fSUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfY29tcGxldGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNvbnRyb2wiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX0ZMVVNIX01BQ19UQUJMRV9JRF9DT05UUk9MIH0sIHsgLm5hbWUgPSAidmlkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9GTFVTSF9NQUNfVEFCTEVfSURfVklEIH0sIHsgLm5hbWUgPSAiZmxvd19pZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfRkxVU0hfTUFDX1RBQkxFX0lEX0ZMT1dfSUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX2tleV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX0tFWV9JRF9QT05fTkkgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9rZXlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2l3Zl9rZXlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2Zfa2V5IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9rZXlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9pd2Zfa2V5X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJtYWNfYWdlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fQ0ZHX0lEX01BQ19BR0VEIH0sIHsgLm5hbWUgPSAibWFjX2Ryb3BwZWQiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGR19JRF9NQUNfRFJPUFBFRCB9LCB7IC5uYW1lID0gIm1hY19tb3ZlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19DRkdfSURfTUFDX01PVkUgfSwgeyAubmFtZSA9ICJuZXdfbWFjIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19DRkdfSURfTkVXX01BQyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJmbG93X2lkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQ0ZHX0lEX0ZMT1dfSUQgfSwgeyAubmFtZSA9ICJzdGF0aWMiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9DRkdfSURfU1RBVCB9LCB7IC5uYW1lID0gImdlbV9wb3J0X2lkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQ0ZHX0lEX0dFTV9QT1JUX0lEIH0sIHsgLm5hbWUgPSAib251X2lkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQ0ZHX0lEX09OVV9JRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25faXdmX21hY190YWJsZV9jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInBvbl9uaSIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0tFWV9JRF9QT05fTkkgfSwgeyAubmFtZSA9ICJtYWNfYWRkcmVzcyIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0tFWV9JRF9NQUNfQUREUkVTUyB9LCB7IC5uYW1lID0gInZsYW4iLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9LRVlfSURfVkxBTiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25faXdmX21hY190YWJsZV9rZXkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2FnZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19hZ2VkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19hZ2VkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25faXdmX21hY190YWJsZV9tYWNfYWdlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19hZ2VkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfYWdlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZmxvd19pZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX01BQ19EUk9QUEVEX0lEX0ZMT1dfSUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJvbGRfZmxvd19pZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX01BQ19NT1ZFX0lEX09MRF9GTE9XX0lEIH0sIHsgLm5hbWUgPSAibmV3X2Zsb3dfaWQiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9NQUNfTU9WRV9JRF9ORVdfRkxPV19JRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmUgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZmxvd19pZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX05FV19NQUNfSURfRkxPV19JRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWMgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJtYWNfYWRkcmVzcyIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfU0NBTl9NQUNfVEFCTEVfQ09NUExFVEVEX0lEX01BQ19BRERSRVNTIH0sIHsgLm5hbWUgPSAiZW50cmllcyIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfU0NBTl9NQUNfVEFCTEVfQ09NUExFVEVEX0lEX0VOVFJJRVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm1hY19hZGRyZXNzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9TQ0FOX01BQ19UQUJMRV9JRF9NQUNfQUREUkVTUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGUgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNmZyIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9DRkdfSURfQ0ZHIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX2l3Zl9zdGF0X2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJkc19oaXRfZXZlbnQiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfSElUX0VWRU5UIH0sIHsgLm5hbWUgPSAiZHNfbWlzc19ldmVudCIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9EU19NSVNTX0VWRU5UIH0sIHsgLm5hbWUgPSAiZHNfZHJvcF9kdWVfdG9fbWlzc19ldmVudCIsIC52YWwgPSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9EU19EUk9QX0RVRV9UT19NSVNTX0VWRU5UIH0sIHsgLm5hbWUgPSAiZHNfZHJvcF9kdWVfdG9faGl0X2V2ZW50IiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX0RTX0RST1BfRFVFX1RPX0hJVF9FVkVOVCB9LCB7IC5uYW1lID0gImRzX2Ryb3BfdG9fZGlzYWJsZWRfZ2VtIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX0RTX0RST1BfVE9fRElTQUJMRURfR0VNIH0sIHsgLm5hbWUgPSAibmV3X21hY19kaXNjb3ZlcmVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX05FV19NQUNfRElTQ09WRVJFRCB9LCB7IC5uYW1lID0gIm1vdmVfZXZlbnQiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfTU9WRV9FVkVOVCB9LCB7IC5uYW1lID0gIm5ld19tYWNfZHJvcF9kdWVfdG9fZmlmb19mdWxsIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX05FV19NQUNfRFJPUF9EVUVfVE9fRklGT19GVUxMIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2Zfc3RhdF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25faXdmX3N0YXRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2Zfc3RhdCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImZsb3dfaWQiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX0ZMT1dfSUQgfSwgeyAubmFtZSA9ICJtYWNfbGVhcm5pbmciLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX01BQ19MRUFSTklORyB9LCB7IC5uYW1lID0gInZsYW5fYWN0aW9uIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9WTEFOX0FDVElPTiB9LCB7IC5uYW1lID0gInZsYW5fdGFnIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9WTEFOX1RBRyB9LCB7IC5uYW1lID0gInRwaWRfaW5kZXgiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX1RQSURfSU5ERVggfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25faXdmX3VzX2Zsb3dfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAudmFsID0gQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfS0VZX0lEX1BPTl9OSSB9LCB7IC5uYW1lID0gImdlbV9wb3J0X2lkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0tFWV9JRF9HRU1fUE9SVF9JRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5X2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9pd2ZfdXNfZmxvd19rZXkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2tleV9leGNoYW5nZV9tb2RlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm5vcm1hbCIsIC52YWwgPSBCQ01PTFRfS0VZX0VYQ0hBTkdFX01PREVfTk9STUFMIH0sIHsgLm5hbWUgPSAiZW5oYW5jZWQiLCAudmFsID0gQkNNT0xUX0tFWV9FWENIQU5HRV9NT0RFX0VOSEFOQ0VEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfa2V5X2V4Y2hhbmdlX21vZGUgPSB7IC5uYW1lID0gImJjbW9sdF9rZXlfZXhjaGFuZ2VfbW9kZSIsIC5kZXNjciA9ICJLZXkgZXhjaGFuZ2UgbW9kZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9rZXlfZXhjaGFuZ2VfbW9kZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9rZXlfZXhjaGFuZ2VfbW9kZV9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9rZXlfZXhjaGFuZ2VfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiaW50ZXJ2YWwiLCAuZGVzY3IgPSAiS2V5IEV4Y2hhbmdlIHByb2Nlc3MgaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2tleV9leGNoYW5nZSwgaW50ZXJ2YWwpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiY29udHJvbCIsIC5kZXNjciA9ICJFbmFibGVcXGRpc2FibGUgcGVyaW9kaWMgcHJvY2VzcyBvZiBLZXkgRXhjaGFuZ2UgZm9yIGFjdGl2ZSBPTlVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2tleV9leGNoYW5nZSwgY29udHJvbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfSwgeyAubmFtZSA9ICJtb2RlIiwgLmRlc2NyID0gIktleSBleGNoYW5nZSBtb2RlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2tleV9leGNoYW5nZSwgbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2tleV9leGNoYW5nZV9tb2RlIH0sIHsgLm5hbWUgPSAiZW5jcnlwdGVkX3BvcnRzX29ubHkiLCAuZGVzY3IgPSAiUGVyZm9ybSBrZXkgZXhjaGFuZ2Ugb25seSB0byBPTlVzIHdpdGggR0VNIHBvcnRzIHRoYXQgaGF2ZSBkb3duc3RyZWFtIGVuY3J5cHRpb24gZW5hYmxlZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9rZXlfZXhjaGFuZ2UsIGVuY3J5cHRlZF9wb3J0c19vbmx5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY29udHJvbF9zdGF0ZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fa2V5X2V4Y2hhbmdlID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9rZXlfZXhjaGFuZ2UiLCAuZGVzY3IgPSAiR1BPTiBLZXkgRXhjaGFuZ2UgIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fa2V5X2V4Y2hhbmdlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fa2V5X2V4Y2hhbmdlX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fa2V5X2V4Y2hhbmdlX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInZsYW4iLCAuZGVzY3IgPSAiVGhlIFZMQU4gSUQgb2YgdGhlIGVudHJ5LiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHQsIHZsYW4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiZmxvd19pZCIsIC5kZXNjciA9ICJUaGUgZmxvdyBJRCBhc3NpZ25lZCB0byB0cmFmZmljIHRoYXQgbWF0Y2hlcyB0aGlzIE1BQyB0YWJsZSBlbnRyeS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0LCBmbG93X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiV2hldGhlciBvciBub3QgdGhlIE1BQyBlbnRyeSBpcyBzdGF0aWMuICBTdGF0aWMgZW50cmllcyBkb24ndCBhZ2UuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdCwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImdlbV9wb3J0X2lkIiwgLmRlc2NyID0gIlRoZSBHRU0gcG9ydCBJRCBvZiB0aGUgdHJhZmZpYyB0aGF0IGNyZWF0ZWQgdGhpcyB0YWJsZSBlbnRyeS4gIFRoaXMgb25seSBhcHBsaWVzIHRvIGF1dG9tYXRpY2FsbHktbGVhcm5lZCBlbnRyaWVzLiAgTWFudWFsbHktYWRkZWQgZW50cmllcyB3aWxsIGhhdmUgdGhlIHZhbHVlIEJDTU9MVF9QT05fR0VNX1BPUlRfSURfSU5WQUxJRC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0LCBnZW1fcG9ydF9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJvbnVfaWQiLCAuZGVzY3IgPSAiVGhlIE9OVSBJRCBmb3IgdGhlIHRyYWZmaWMgdGhhdCBjcmVhdGVkIHRoaXMgdGFibGUgZW50cnkuICBUaGlzIG9ubHkgdmFsaWQgaWYgZ2VtX3BvcnRfaWQgaXMgdmFsaWQuICBPdGhlcndpc2UgdGhpcyB3aWxsIGJlIHNldCB0byBCQ01PTFRfR1BPTl9PTlVfSURfSU5WQUxJRC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0LCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdCIsIC5kZXNjciA9ICJHUE9OIE1BQyB0YWJsZSBzY2FuIHJlc3VsdCBmb3IgYSBzaW5nbGUgTUFDIHRhYmxlIGVudHJ5LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdF9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdF9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbWFjX3RhYmxlX3NjYW5fcmVzdWx0X2xpc3RfdTE2ID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHRfbGlzdF91MTYiLCAuZGVzY3IgPSAiVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHRfbGlzdF91MTYpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRFlOLCAueCA9IHsgLmFycl9keW4gPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHQsIC5sZW5fc2l6ZSA9IDIsIC5tYXhfc2l6ZSA9IERFRkFVTFRfRFlOX0FSUl9NQVhfU0laRSAvIHNpemVvZihiY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHQpIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9BQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQgfSwgeyAubmFtZSA9ICJjcHVfcGFja2V0c19mYWlsdXJlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0NQVV9QQUNLRVRTX0ZBSUxVUkUgfSwgeyAubmFtZSA9ICJkZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9ERUFDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRCB9LCB7IC5uYW1lID0gImRpc2FibGVfYWxsX29udXNfY29tcGxldGVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0RJU0FCTEVfQUxMX09OVVNfQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAiZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9FTkFCTEVfQUxMX09OVVNfQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAibG9zIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0xPUyB9LCB7IC5uYW1lID0gIm9udV9kaXNjb3ZlcmVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX09OVV9ESVNDT1ZFUkVEIH0sIHsgLm5hbWUgPSAib251X3VwZ3JhZGVfY29tcGxldGUiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfT05VX1VQR1JBREVfQ09NUExFVEUgfSwgeyAubmFtZSA9ICJwcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19PTlVTX1JBTkdFRCB9LCB7IC5uYW1lID0gInByb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUUgfSwgeyAubmFtZSA9ICJyb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURUQgfSwgeyAubmFtZSA9ICJyb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfUk9HVUVfT05VX1NQRUNJQUxfTUFQX0NZQ0xFX1NUQVJUIH0sIHsgLm5hbWUgPSAic2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9TRVJJQUxfTlVNQkVSX0FDUVVJU0lUSU9OX0NZQ0xFX1NUQVJUIH0sIHsgLm5hbWUgPSAic3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURUQgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQgfSwgeyAubmFtZSA9ICJzdGF0ZV9jaGFuZ2VfY29tcGxldGVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQgfSwgeyAubmFtZSA9ICJ0b2RfcmVxdWVzdF9jb21wbGV0ZWQiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfVE9EX1JFUVVFU1RfQ09NUExFVEVEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9hdXRvX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwbG9hbSIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9CUk9BRENBU1RfUExPQU1fUEFDS0VUX0lEX1BMT0FNIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwb25fc3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QT05fU1RBVFVTIH0sIHsgLm5hbWUgPSAiYXZhaWxhYmxlX2JhbmR3aWR0aCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQVZBSUxBQkxFX0JBTkRXSURUSCB9LCB7IC5uYW1lID0gIm51bWJlcl9vZl9hY3RpdmVfb251cyIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfTlVNQkVSX09GX0FDVElWRV9PTlVTIH0sIHsgLm5hbWUgPSAibnVtYmVyX29mX2FjdGl2ZV9zdGFuZGJ5X29udXMiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX05VTUJFUl9PRl9BQ1RJVkVfU1RBTkRCWV9PTlVTIH0sIHsgLm5hbWUgPSAicHJic19zdGF0dXMiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BSQlNfU1RBVFVTIH0sIHsgLm5hbWUgPSAicG9uX2Rpc3RhbmNlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QT05fRElTVEFOQ0UgfSwgeyAubmFtZSA9ICJyYW5naW5nX3dpbmRvd19zaXplIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9SQU5HSU5HX1dJTkRPV19TSVpFIH0sIHsgLm5hbWUgPSAicHJlYXNzaWduZWRfZXF1YWxpemF0aW9uX2RlbGF5IiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkVBU1NJR05FRF9FUVVBTElaQVRJT05fREVMQVkgfSwgeyAubmFtZSA9ICJlcWRfY3ljbGVzX251bWJlciIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfRVFEX0NZQ0xFU19OVU1CRVIgfSwgeyAubmFtZSA9ICJwb3dlcl9sZXZlbCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUE9XRVJfTEVWRUwgfSwgeyAubmFtZSA9ICJkc19mZWNfbW9kZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfRFNfRkVDX01PREUgfSwgeyAubmFtZSA9ICJkcmlmdF9jb250cm9sIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9EUklGVF9DT05UUk9MIH0sIHsgLm5hbWUgPSAiZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfRFNfQkVSX1JFUE9SVElOR19JTlRFUlZBTCB9LCB7IC5uYW1lID0gImxvc19hbGFybV90aHJlc2hvbGQiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0xPU19BTEFSTV9USFJFU0hPTEQgfSwgeyAubmFtZSA9ICJsb3NfaW5pdGlhbF92YWx1ZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfTE9TX0lOSVRJQUxfVkFMVUUgfSwgeyAubmFtZSA9ICJvbnVfYWxhcm1zX3RocmVzaG9sZHMiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX09OVV9BTEFSTVNfVEhSRVNIT0xEUyB9LCB7IC5uYW1lID0gImJlcl9tb25pdG9yIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9CRVJfTU9OSVRPUiB9LCB7IC5uYW1lID0gInBsb2FtX2Fja190aW1lb3V0IiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QTE9BTV9BQ0tfVElNRU9VVCB9LCB7IC5uYW1lID0gIm9udV9hY3RpdmF0aW9uIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9PTlVfQUNUSVZBVElPTiB9LCB7IC5uYW1lID0gInNuX2FjcXVpc2l0aW9uIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9TTl9BQ1FVSVNJVElPTiB9LCB7IC5uYW1lID0gImtleV9leGNoYW5nZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfS0VZX0VYQ0hBTkdFIH0sIHsgLm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hpbmciLCAudmFsID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HIH0sIHsgLm5hbWUgPSAiY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQ0JSX1JUX0FMTE9DQVRJT05fUFJPRklMRSB9LCB7IC5uYW1lID0gImNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9DQlJfTlJUX0FMTE9DQVRJT05fUFJPRklMRSB9LCB7IC5uYW1lID0gImRiYSIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfREJBIH0sIHsgLm5hbWUgPSAicG93ZXJfbWFuYWdlbWVudCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUE9XRVJfTUFOQUdFTUVOVCB9LCB7IC5uYW1lID0gInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcyIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUk9HVUVfT05VX0RFVEVDVElPTl9QUk9DRVNTIH0sIHsgLm5hbWUgPSAicGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUEVSSU9ESUNfU1RBTkRCWV9QT05fTU9OSVRPUklORyB9LCB7IC5uYW1lID0gInByYnNfY2hlY2tlciIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUFJCU19DSEVDS0VSIH0sIHsgLm5hbWUgPSAicHJic19nZW5lcmF0b3IiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BSQlNfR0VORVJBVE9SIH0sIHsgLm5hbWUgPSAibWluX2RhdGFfYWxsb2NfaWQiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX01JTl9EQVRBX0FMTE9DX0lEIH0sIHsgLm5hbWUgPSAiYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24iLCAudmFsID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0FVVE9NQVRJQ19PTlVfREVBQ1RJVkFUSU9OIH0sIHsgLm5hbWUgPSAidXNfYmFuZHdpZHRoX2xpbWl0IiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9VU19CQU5EV0lEVEhfTElNSVQgfSwgeyAubmFtZSA9ICJhbGxfb251cyIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQUxMX09OVVMgfSwgeyAubmFtZSA9ICJhbGxfbWNhc3RfZ2VtX3BvcnRzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9BTExfTUNBU1RfR0VNX1BPUlRTIH0sIHsgLm5hbWUgPSAiZGVidWciLCAudmFsID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RFQlVHIH0sIHsgLm5hbWUgPSAib251X3VwZ3JhZGVfcGFyYW1zIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9PTlVfVVBHUkFERV9QQVJBTVMgfSwgeyAubmFtZSA9ICJwc19jX3dhaXRfYmVmb3JlX2RlYWN0aXZhdGlvbl90aW1lb3V0IiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QU19DX1dBSVRfQkVGT1JFX0RFQUNUSVZBVElPTl9USU1FT1VUIH0sIHsgLm5hbWUgPSAiYmlwMzJfaW5kaWNhdGlvbl9jb250cm9sIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9CSVAzMl9JTkRJQ0FUSU9OX0NPTlRST0wgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fbmlfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX25pX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZXJyb3IiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfRkFJTFVSRV9JRF9FUlJPUiB9LCB7IC5uYW1lID0gImdlbV9wb3J0X2lkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0ZBSUxVUkVfSURfR0VNX1BPUlRfSUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicGFja2V0X3R5cGUiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfSURfUEFDS0VUX1RZUEUgfSwgeyAubmFtZSA9ICJjYWxjX2NyYyIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9DQUxDX0NSQyB9LCB7IC5uYW1lID0gImdlbV9wb3J0X2xpc3QiLCAudmFsID0gQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfSURfR0VNX1BPUlRfTElTVCB9LCB7IC5uYW1lID0gImJ1ZmZlciIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9CVUZGRVIgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX25pX2NwdV9wYWNrZXRzIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fbmlfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfZGVidWdfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibnVtYmVyX29mX2dlbV9wb3J0c19wZXJfb251IiwgLmRlc2NyID0gIk51bWJlciBvZiBHZW0gcG9ydHMgcGVyIE9OVSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9kZWJ1ZywgbnVtYmVyX29mX2dlbV9wb3J0c19wZXJfb251KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfZGVidWcgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX2RlYnVnIiwgLmRlc2NyID0gIkdQT04gTkkgRGVidWcgcGFyYW1ldGVycyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2RlYnVnKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfZGVidWdfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9kZWJ1Z19maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNvbnRyb2wiLCAudmFsID0gQkNNT0xUX0dQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX0NPTlRST0wgfSwgeyAubmFtZSA9ICJzZXJpYWxfbnVtYmVyIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0RJU0FCTEVfU0VSSUFMX05VTUJFUl9JRF9TRVJJQUxfTlVNQkVSIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlciBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX25pX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX25pX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9rZXlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicG9uX25pIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX0tFWV9JRF9QT05fTkkgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2tleV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfa2V5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fbmlfa2V5IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2tleV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX25pX2tleV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX2xvc19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0dXMiLCAudmFsID0gQkNNT0xUX0dQT05fTklfTE9TX0lEX1NUQVRVUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfbG9zX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9sb3NfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9sb3MgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfbG9zX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fbmlfbG9zX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic2VyaWFsX251bWJlciIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9TRVJJQUxfTlVNQkVSIH0sIHsgLm5hbWUgPSAicmFuZ2luZ190aW1lIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1JBTkdJTkdfVElNRSB9LCB7IC5uYW1lID0gIm9udV9pZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9PTlVfSUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX25pX29udV9kaXNjb3ZlcmVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0dXMiLCAudmFsID0gQkNNT0xUX0dQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfU1RBVFVTIH0sIHsgLm5hbWUgPSAibGlzdF9vZl9mYWlsZWRfZW50aXRpZXMiLCAudmFsID0gQkNNT0xUX0dQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfTElTVF9PRl9GQUlMRURfRU5USVRJRVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJvbnVzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VEX0lEX09OVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJyZXN1bHQiLCAudmFsID0gQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfU1dJVENIT1ZFUl9DT01QTEVURURfSURfUkVTVUxUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicmVzdWx0IiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FX0lEX1JFU1VMVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm9udV9zdGF0ZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UWVBFX0NfU0VUX01VTFRJUExFX09OVV9TVEFURV9JRF9PTlVfU1RBVEUgfSwgeyAubmFtZSA9ICJvbnVfbGlzdCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UWVBFX0NfU0VUX01VTFRJUExFX09OVV9TVEFURV9JRF9PTlVfTElTVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGUgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX3Jlc2V0X2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfcmVzZXRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX3Jlc2V0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fbmlfcmVzZXQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfcmVzZXRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9uaV9yZXNldF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAid2luZG93X3R5cGUiLCAudmFsID0gQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9XSU5ET1dfVFlQRSB9LCB7IC5uYW1lID0gIm1lYXN1cmVtZW50X3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX01FQVNVUkVNRU5UX1NUQVRVUyB9LCB7IC5uYW1lID0gImFsbG9jX2lkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfQUxMT0NfSUQgfSwgeyAubmFtZSA9ICJvbnVfaWQiLCAudmFsID0gQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9PTlVfSUQgfSwgeyAubmFtZSA9ICJpc19kZWxpbmVhdGlvbiIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX0lTX0RFTElORUFUSU9OIH0sIHsgLm5hbWUgPSAiaXNfZWQiLCAudmFsID0gQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9JU19FRCB9LCB7IC5uYW1lID0gInJ4X2RhdGEiLCAudmFsID0gQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9SWF9EQVRBIH0sIHsgLm5hbWUgPSAicGxvYW1fcmVjZWl2ZWRfb251X2lkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUExPQU1fUkVDRUlWRURfT05VX0lEIH0sIHsgLm5hbWUgPSAicGxvYW1fcmVjZWl2ZWRfY3JjX2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUExPQU1fUkVDRUlWRURfQ1JDX0VSUk9SIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAid2luZG93X3R5cGUiLCAudmFsID0gQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9XSU5ET1dfVFlQRSB9LCB7IC5uYW1lID0gImFsbG9jX2lkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfQUxMT0NfSUQgfSwgeyAubmFtZSA9ICJvbnVfaWQiLCAudmFsID0gQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9PTlVfSUQgfSwgeyAubmFtZSA9ICJzZWNvbmRfcmFuZ2luZ193aW5kb3ciLCAudmFsID0gQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9TRUNPTkRfUkFOR0lOR19XSU5ET1cgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJvbnVfc3RhdGUiLCAudmFsID0gQkNNT0xUX0dQT05fTklfU0VUX09OVV9TVEFURV9JRF9PTlVfU1RBVEUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9zZXRfb251X3N0YXRlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwb25fc3RhdGUiLCAudmFsID0gQkNNT0xUX0dQT05fTklfU0VUX1BPTl9TVEFURV9JRF9QT05fU1RBVEUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibnVtYmVyX29mX2RldGVjdGVkX2RlbGltaXRlciIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRF9JRF9OVU1CRVJfT0ZfREVURUNURURfREVMSU1JVEVSIH0sIHsgLm5hbWUgPSAiZW5lcmd5X2RldGVjdF9zaWduYWwiLCAudmFsID0gQkNNT0xUX0dQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURURfSURfRU5FUkdZX0RFVEVDVF9TSUdOQUwgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJsaXN0X29mX29udV9pZHMiLCAudmFsID0gQkNNT0xUX0dQT05fTklfU1RBUlRfT05VX1VQR1JBREVfSURfTElTVF9PRl9PTlVfSURTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXQiLCAudmFsID0gQkNNT0xUX0dQT05fTklfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXQiLCAudmFsID0gQkNNT0xUX0dQT05fTklfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNmZyIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0NGR19JRF9DRkcgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX25pX3N0YXRfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImZlY19jb2Rld29yZHMiLCAudmFsID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9GRUNfQ09ERVdPUkRTIH0sIHsgLm5hbWUgPSAiZmVjX2NvZGV3b3Jkc191bmNvcnJlY3RlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX0ZFQ19DT0RFV09SRFNfVU5DT1JSRUNURUQgfSwgeyAubmFtZSA9ICJiaXA4X2J5dGVzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfQklQOF9CWVRFUyB9LCB7IC5uYW1lID0gImJpcDhfZXJyb3JzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfQklQOF9FUlJPUlMgfSwgeyAubmFtZSA9ICJyeF9nZW1fcGFja2V0cyIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9QQUNLRVRTIH0sIHsgLm5hbWUgPSAicnhfZ2VtX2Ryb3BwZWQiLCAudmFsID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9HRU1fRFJPUFBFRCB9LCB7IC5uYW1lID0gInJ4X2dlbV9pZGxlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0lETEUgfSwgeyAubmFtZSA9ICJyeF9nZW1fY29ycmVjdGVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0NPUlJFQ1RFRCB9LCB7IC5uYW1lID0gInJ4X2dlbV9pbGxlZ2FsIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0lMTEVHQUwgfSwgeyAubmFtZSA9ICJyeF9hbGxvY2F0aW9uc192YWxpZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX1ZBTElEIH0sIHsgLm5hbWUgPSAicnhfYWxsb2NhdGlvbnNfaW52YWxpZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0lOVkFMSUQgfSwgeyAubmFtZSA9ICJyeF9hbGxvY2F0aW9uc19kaXNhYmxlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0RJU0FCTEVEIH0sIHsgLm5hbWUgPSAicnhfcGxvYW1zIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUExPQU1TIH0sIHsgLm5hbWUgPSAicnhfcGxvYW1zX25vbl9pZGxlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX05PTl9JRExFIH0sIHsgLm5hbWUgPSAicnhfcGxvYW1zX2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX0VSUk9SIH0sIHsgLm5hbWUgPSAicnhfcGxvYW1zX2Ryb3BwZWQiLCAudmFsID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfRFJPUFBFRCB9LCB7IC5uYW1lID0gInJ4X2NwdSIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0NQVSB9LCB7IC5uYW1lID0gInJ4X29tY2kiLCAudmFsID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9PTUNJIH0sIHsgLm5hbWUgPSAicnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1IgfSwgeyAubmFtZSA9ICJyeF9kcm9wcGVkX3Rvb19zaG9ydCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0RST1BQRURfVE9PX1NIT1JUIH0sIHsgLm5hbWUgPSAicnhfZHJvcHBlZF90b29fbG9uZyIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0RST1BQRURfVE9PX0xPTkcgfSwgeyAubmFtZSA9ICJyeF9jcmNfZXJyb3JzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfQ1JDX0VSUk9SUyB9LCB7IC5uYW1lID0gInJ4X2tleV9lcnJvcnMiLCAudmFsID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9LRVlfRVJST1JTIH0sIHsgLm5hbWUgPSAicnhfZnJhZ21lbnRzX2Vycm9ycyIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0ZSQUdNRU5UU19FUlJPUlMgfSwgeyAubmFtZSA9ICJyeF9wYWNrZXRzX2Ryb3BwZWQiLCAudmFsID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9QQUNLRVRTX0RST1BQRUQgfSwgeyAubmFtZSA9ICJ0eF9nZW0iLCAudmFsID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9HRU0gfSwgeyAubmFtZSA9ICJ0eF9wbG9hbXMiLCAudmFsID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9QTE9BTVMgfSwgeyAubmFtZSA9ICJ0eF9nZW1fZnJhZ21lbnRzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfR0VNX0ZSQUdNRU5UUyB9LCB7IC5uYW1lID0gInR4X2NwdSIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0NQVSB9LCB7IC5uYW1lID0gInR4X29tY2kiLCAudmFsID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9PTUNJIH0sIHsgLm5hbWUgPSAidHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfQ1BVX09NQ0lfUEFDS0VUU19EUk9QUEVEIH0sIHsgLm5hbWUgPSAidHhfZHJvcHBlZF9pbGxlZ2FsX2xlbmd0aCIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfSUxMRUdBTF9MRU5HVEggfSwgeyAubmFtZSA9ICJ0eF9kcm9wcGVkX3RwaWRfbWlzcyIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfVFBJRF9NSVNTIH0sIHsgLm5hbWUgPSAidHhfZHJvcHBlZF92aWRfbWlzcyIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfVklEX01JU1MgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3N0YXRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX3N0YXRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9uaV9zdGF0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3N0YXRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9uaV9zdGF0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJyZXN1bHQiLCAudmFsID0gQkNNT0xUX0dQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9SRVNVTFQgfSwgeyAubmFtZSA9ICJwcmV2aW91c19zdGF0ZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX1BSRVZJT1VTX1NUQVRFIH0sIHsgLm5hbWUgPSAibmV3X3N0YXRlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfTkVXX1NUQVRFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJ0b2Rfc3RyaW5nIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9UT0RfU1RSSU5HIH0sIHsgLm5hbWUgPSAic2ZjIiwgLnZhbCA9IEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9TRkMgfSwgeyAubmFtZSA9ICJydGNfb2Zmc2V0X3NlYyIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfUlRDX09GRlNFVF9TRUMgfSwgeyAubmFtZSA9ICJydGNfb2Zmc2V0X25zZWMiLCAudmFsID0gQkNNT0xUX0dQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1JUQ19PRkZTRVRfTlNFQyB9LCB7IC5uYW1lID0gInN0YXR1cyIsIC52YWwgPSBCQ01PTFRfR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfU1RBVFVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX25pX3RvZF9yZXF1ZXN0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2FjdGl2YXRpb25fZmllbGRzW10gPSB7IHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlIiwgLmRlc2NyID0gIlBlcmZvcm0gc2luZ2xlIGtleSBleGNoYW5nZSBkdXJpbmcgYWN0aXZhdGlvbi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2FjdGl2YXRpb24sIGtleV9leGNoYW5nZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfSwgeyAubmFtZSA9ICJwYXNzd29yZF9hdXRoZW50aWNhdGlvbiIsIC5kZXNjciA9ICJQZXJmb3JtIHBhc3N3b3JkIGF1dGhlbnRpY2F0aW9uIGR1cmluZyBhY3RpdmF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hY3RpdmF0aW9uLCBwYXNzd29yZF9hdXRoZW50aWNhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfSwgeyAubmFtZSA9ICJmYWlsX2R1ZV90b19wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlIiwgLmRlc2NyID0gIkRlYWN0aXZhdGUgT05VIGR1ZSB0byBwYXNzd29yZCBhdXRoZW50aWNhdGlvbiBmYWlsdXJlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hY3RpdmF0aW9uLCBmYWlsX2R1ZV90b19wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY29udHJvbF9zdGF0ZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2FjdGl2YXRpb24gPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9hY3RpdmF0aW9uIiwgLmRlc2NyID0gIkdQT04gT05VIGFjdGl2YXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfYWN0aXZhdGlvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9hY3RpdmF0aW9uX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2FjdGl2YXRpb25fZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGVfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibG9zaSIsIC5kZXNjciA9ICJMb3NzIG9mIHNpZ25hbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGUsIGxvc2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJsb2ZpIiwgLmRlc2NyID0gIkxvc3Mgb2YgZnJhbWUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlLCBsb2ZpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAibG9hbWkiLCAuZGVzY3IgPSAiTG9zcyBvZiBQTE9BTSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGUsIGxvYW1pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAiZGdpIiwgLmRlc2NyID0gIkR5aW5nIEdhc3AiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlLCBkZ2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJ0aXdpIiwgLmRlc2NyID0gIlRyYW5zbWlzc2lvbiBpbnRlcmZlcmVuY2UgQWxhcm0iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlLCB0aXdpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAiZG93aSIsIC5kZXNjciA9ICJEcmlmdCBvZiBXaW5kb3ciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlLCBkb3dpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAic3VmaSIsIC5kZXNjciA9ICJTdGFydCBVUCBGYWlsdXJlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZSwgc3VmaSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9LCB7IC5uYW1lID0gInNmaSIsIC5kZXNjciA9ICJTaWduYWwgRmFpbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGUsIHNmaSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9LCB7IC5uYW1lID0gInNkaSIsIC5kZXNjciA9ICJTaWduYWwgRGVncmFkZWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlLCBzZGkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJkZmkiLCAuZGVzY3IgPSAiRGVhY3RpdmF0aW9uIEZhaWx1cmUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlLCBkZmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJsb2FpIiwgLmRlc2NyID0gIkxvc3Mgb2YgYWNrIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZSwgbG9haSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9LCB7IC5uYW1lID0gImxva2kiLCAuZGVzY3IgPSAibG9zcyBvZiBrZXkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlLCBsb2tpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGUgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZSIsIC5kZXNjciA9ICJHUE9OIE9OVSBhbGFybSBzdGF0dXMiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGVfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGVfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImxvc2kiLCAuZGVzY3IgPSAiTE9TaSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zLCBsb3NpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAibG9maSIsIC5kZXNjciA9ICJMT0ZpIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hbGFybXMsIGxvZmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJsb2FtaSIsIC5kZXNjciA9ICJMT0FNaSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zLCBsb2FtaSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2FsYXJtcyA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X2FsYXJtcyIsIC5kZXNjciA9ICJHUE9OIE9OVSBhbGFybXMiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2FsYXJtc19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9hbGFybXNfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHNfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibG9zaSIsIC5kZXNjciA9ICJUaHJlc2hvbGQgZm9yIGFzc2VydGluZyBMT1NpIGFsYXJtIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hbGFybXNfdGhyZXNob2xkcywgbG9zaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gImxvZmkiLCAuZGVzY3IgPSAiVGhyZXNob2xkIGZvciBhc3NlcnRpbmcgTE9GaSBhbGFybSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMsIGxvZmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJsb2FtaSIsIC5kZXNjciA9ICJUaHJlc2hvbGQgZm9yIGFzc2VydGluZyBMT0FNaSBhbGFybSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMsIGxvYW1pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9hbGFybXNfdGhyZXNob2xkcyIsIC5kZXNjciA9ICJHUE9OIE9OVSBhbGFybXMgdGhyZXNob2xkcyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9hbGFybXNfdGhyZXNob2xkcyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9hbGFybXNfdGhyZXNob2xkc19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9hbGFybXNfdGhyZXNob2xkc19maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImJlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfQkVSX0lOVEVSVkFMX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAiZGZpIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9ERkkgfSwgeyAubmFtZSA9ICJkZ2kiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0RHSSB9LCB7IC5uYW1lID0gImRvd2kiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0RPV0kgfSwgeyAubmFtZSA9ICJlcnIiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0VSUiB9LCB7IC5uYW1lID0gImludmFsaWRfZGJydV9yZXBvcnQiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0lOVkFMSURfREJSVV9SRVBPUlQgfSwgeyAubmFtZSA9ICJrZXlfZXhjaGFuZ2VfY29tcGxldGVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9DWUNMRV9TS0lQUEVEIH0sIHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWQiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9ERUNSWVBUX1JFUVVJUkVEIH0sIHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSCB9LCB7IC5uYW1lID0gImtleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0IiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfS0VZX1JFUVVFU1RfVElNRU9VVCB9LCB7IC5uYW1lID0gImtleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4IiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfVU5DT05TRUNVVElWRV9JTkRFWCB9LCB7IC5uYW1lID0gImxvYWkiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0xPQUkgfSwgeyAubmFtZSA9ICJsb2tpIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9MT0tJIH0sIHsgLm5hbWUgPSAibWVtaSIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfTUVNSSB9LCB7IC5uYW1lID0gIm9tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT01DSV9QT1JUX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAib251X2FjdGl2YXRpb25fY29tcGxldGVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfQUNUSVZBVElPTl9DT01QTEVURUQgfSwgeyAubmFtZSA9ICJvbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0FDVElWQVRJT05fU1RBTkRCWV9DT01QTEVURUQgfSwgeyAubmFtZSA9ICJvbnVfYWxhcm0iLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9BTEFSTSB9LCB7IC5uYW1lID0gIm9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfREVBQ1RJVkFUSU9OX0NPTVBMRVRFRCB9LCB7IC5uYW1lID0gIm9udV9kaXNhYmxlX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0RJU0FCTEVfQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAib251X2VuYWJsZV9jb21wbGV0ZWQiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9FTkFCTEVfQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAib3B0aWNhbF9yZWZsZWN0aW9uIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PUFRJQ0FMX1JFRkxFQ1RJT04gfSwgeyAubmFtZSA9ICJwYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWQiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFRCB9LCB7IC5uYW1lID0gInBlZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUEVFIH0sIHsgLm5hbWUgPSAicG9zc2libGVfZHJpZnQiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1BPU1NJQkxFX0RSSUZUIH0sIHsgLm5hbWUgPSAicG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFIH0sIHsgLm5hbWUgPSAicHN0IiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9QU1QgfSwgeyAubmFtZSA9ICJyYW5naW5nX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUkFOR0lOR19DT01QTEVURUQgfSwgeyAubmFtZSA9ICJyZWkiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1JFSSB9LCB7IC5uYW1lID0gInJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRCB9LCB7IC5uYW1lID0gInNkaSIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU0RJIH0sIHsgLm5hbWUgPSAic2ZpIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9TRkkgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCB9LCB7IC5uYW1lID0gInN1ZmkiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1NVRkkgfSwgeyAubmFtZSA9ICJ0aXdpIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9USVdJIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9hdXRvX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImJlcl9pbnRlcnZhbCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQkVSX0lOVEVSVkFMX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX0JFUl9JTlRFUlZBTCB9LCB7IC5uYW1lID0gInJlc3VsdCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQkVSX0lOVEVSVkFMX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX1JFU1VMVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm9udV9zdGF0ZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX09OVV9TVEFURSB9LCB7IC5uYW1lID0gInNlcmlhbF9udW1iZXIiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0NGR19JRF9TRVJJQUxfTlVNQkVSIH0sIHsgLm5hbWUgPSAicGFzc3dvcmQiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0NGR19JRF9QQVNTV09SRCB9LCB7IC5uYW1lID0gImF1dG9fcGFzc3dvcmRfbGVhcm5pbmciLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0NGR19JRF9BVVRPX1BBU1NXT1JEX0xFQVJOSU5HIH0sIHsgLm5hbWUgPSAidXNfZmVjIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfVVNfRkVDIH0sIHsgLm5hbWUgPSAib21jaV9wb3J0X2lkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfT01DSV9QT1JUX0lEIH0sIHsgLm5hbWUgPSAiZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0RTX0JFUl9SRVBPUlRJTkdfSU5URVJWQUwgfSwgeyAubmFtZSA9ICJhZXNfZW5jcnlwdGlvbl9rZXkiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0NGR19JRF9BRVNfRU5DUllQVElPTl9LRVkgfSwgeyAubmFtZSA9ICJhbGFybV9zdGF0ZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0FMQVJNX1NUQVRFIH0sIHsgLm5hbWUgPSAicmFuZ2luZ190aW1lIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfUkFOR0lOR19USU1FIH0sIHsgLm5hbWUgPSAiZGlzYWJsZWRfYWZ0ZXJfZGlzY292ZXJ5IiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfRElTQUJMRURfQUZURVJfRElTQ09WRVJZIH0sIHsgLm5hbWUgPSAiZGVhY3RpdmF0aW9uX3JlYXNvbiIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0RFQUNUSVZBVElPTl9SRUFTT04gfSwgeyAubmFtZSA9ICJhbGxfZ2VtX3BvcnRzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQUxMX0dFTV9QT1JUUyB9LCB7IC5uYW1lID0gImFsbF9hbGxvY3MiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0NGR19JRF9BTExfQUxMT0NTIH0sIHsgLm5hbWUgPSAib251X3BzX3R5cGVfYyIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX09OVV9QU19UWVBFX0MgfSwgeyAubmFtZSA9ICJleHRlbmRlZF9ndWFyZF90aW1lIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfRVhURU5ERURfR1VBUkRfVElNRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX29udV9jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInBvd2VyX2xldmVsX2FjdGlvbiIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQ0hBTkdFX1BPV0VSX0xFVkVMX0lEX1BPV0VSX0xFVkVMX0FDVElPTiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWwgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwb3J0X2lkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUX0lEX1BPUlRfSUQgfSwgeyAubmFtZSA9ICJjcmNfb2siLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRfSURfQ1JDX09LIH0sIHsgLm5hbWUgPSAicGFja2V0X3NpemUiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRfSURfUEFDS0VUX1NJWkUgfSwgeyAubmFtZSA9ICJidWZmZXIiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRfSURfQlVGRkVSIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfY3B1X3BhY2tldCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInBhY2tldF90eXBlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfVFlQRSB9LCB7IC5uYW1lID0gImNhbGNfY3JjIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9DQUxDX0NSQyB9LCB7IC5uYW1lID0gIm51bWJlcl9vZl9wYWNrZXRzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9OVU1CRVJfT0ZfUEFDS0VUUyB9LCB7IC5uYW1lID0gInBhY2tldF9zaXplIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfU0laRSB9LCB7IC5uYW1lID0gImJ1ZmZlciIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9jcHVfcGFja2V0cyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfZGZpX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfREZJX0lEX0FMQVJNX1NUQVRVUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2RmaV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X2RmaV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9kZmkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2RmaV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX29udV9kZmlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfZGdpX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfREdJX0lEX0FMQVJNX1NUQVRVUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2RnaV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X2RnaV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9kZ2kgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2RnaV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX29udV9kZ2lfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfZG93aV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0RPV0lfSURfQUxBUk1fU1RBVFVTIH0sIHsgLm5hbWUgPSAiZHJpZnRfdmFsdWUiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0RPV0lfSURfRFJJRlRfVkFMVUUgfSwgeyAubmFtZSA9ICJuZXdfZXFkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9ET1dJX0lEX05FV19FUUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9kb3dpX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfZG93aV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9kb3dpIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9kb3dpX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X2Rvd2lfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2VxZF9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJvbnVfaWQiLCAuZGVzY3IgPSAiT05VIElEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9lcWQsIG9udV9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJlcWQiLCAuZGVzY3IgPSAiRVFEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9lcWQsIGVxZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9lcWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9lcWQiLCAuZGVzY3IgPSAiR1BPTiBPTlUgRVFEIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2VxZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9lcWRfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfZXFkX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfZXFkX2xpc3RfdTMyID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfZXFkX2xpc3RfdTMyIiwgLmRlc2NyID0gIlZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIGdwb25fb251X2VxZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9lcWRfbGlzdF91MzIpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRFlOLCAueCA9IHsgLmFycl9keW4gPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfZXFkLCAubGVuX3NpemUgPSA0LCAubWF4X3NpemUgPSBERUZBVUxUX0RZTl9BUlJfTUFYX1NJWkUgLyBzaXplb2YoYmNtb2x0X2dwb25fb251X2VxZCkgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X2Vycl9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJiaXA4X2Vycm9ycyIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfRVJSX0lEX0JJUDhfRVJST1JTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfZXJyX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfZXJyX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X2VyciBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfZXJyX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X2Vycl9pZF9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9pZF9saXN0X3UzMl9tYXhfMjU2ID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfaWRfbGlzdF91MzJfbWF4XzI1NiIsIC5kZXNjciA9ICJWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiBncG9uX29udV9pZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9pZF9saXN0X3UzMl9tYXhfMjU2KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0RZTiwgLnggPSB7IC5hcnJfZHluID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QsIC5sZW5fc2l6ZSA9IDQsIC5tYXhfc2l6ZSA9IDI1NiB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhbGxvY19pZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfSU5WQUxJRF9EQlJVX1JFUE9SVF9JRF9BTExPQ19JRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm5ld19rZXkiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9DT01QTEVURURfSURfTkVXX0tFWSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X2tleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJuZXdfa2V5IiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfREVDUllQVF9SRVFVSVJFRF9JRF9ORVdfS0VZIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJleHBlY3RlZF9rZXkiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0hfSURfRVhQRUNURURfS0VZIH0sIHsgLm5hbWUgPSAicmVjZWl2ZWRfa2V5IiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENIX0lEX1JFQ0VJVkVEX0tFWSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2ggZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJleHBlY3RlZF9pbmRleCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX1VOQ09OU0VDVVRJVkVfSU5ERVhfSURfRVhQRUNURURfSU5ERVggfSwgeyAubmFtZSA9ICJhY3R1YWxfaW5kZXgiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9VTkNPTlNFQ1VUSVZFX0lOREVYX0lEX0FDVFVBTF9JTkRFWCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXggZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X2tleV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0tFWV9JRF9QT05fTkkgfSwgeyAubmFtZSA9ICJvbnVfaWQiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX0tFWV9JRF9PTlVfSUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9rZXlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9rZXlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfa2V5IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfa2V5X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X2xvYWlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9MT0FJX0lEX0FMQVJNX1NUQVRVUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2xvYWlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9sb2FpX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X2xvYWkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2xvYWlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfbG9haV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9sb2tpX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfTE9LSV9JRF9BTEFSTV9TVEFUVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9sb2tpX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfbG9raV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9sb2tpIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9sb2tpX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X2xva2lfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfbWVtaV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwbG9hbV9idWZmZXIiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX01FTUlfSURfUExPQU1fQlVGRkVSIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfbWVtaV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X21lbWlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfbWVtaSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfbWVtaV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX29udV9tZW1pX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInBvcnRfaWQiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX09NQ0lfUEFDS0VUX0lEX1BPUlRfSUQgfSwgeyAubmFtZSA9ICJjcmNfb2siLCAudmFsID0gQkNNT0xUX0dQT05fT05VX09NQ0lfUEFDS0VUX0lEX0NSQ19PSyB9LCB7IC5uYW1lID0gInBhY2tldF9zaXplIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9QQUNLRVRfU0laRSB9LCB7IC5uYW1lID0gImJ1ZmZlciIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfQlVGRkVSIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9vbWNpX3BhY2tldCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImdlbV9wb3J0IiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9PTUNJX1BPUlRfSURfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfR0VNX1BPUlQgfSwgeyAubmFtZSA9ICJzdGF0dXMiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX09NQ0lfUE9SVF9JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVMgfSwgeyAubmFtZSA9ICJvcGVyYXRpb24iLCAudmFsID0gQkNNT0xUX0dQT05fT05VX09NQ0lfUE9SVF9JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9PUEVSQVRJT04gfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0dXMiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVMgfSwgeyAubmFtZSA9ICJmYWlsX3JlYXNvbiIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJyZXN1bHQiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX09OVV9BQ1RJVkFUSU9OX1NUQU5EQllfQ09NUExFVEVEX0lEX1JFU1VMVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X29udV9hbGFybV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJvbnVfYWxhcm0iLCAudmFsID0gQkNNT0xUX0dQT05fT05VX09OVV9BTEFSTV9JRF9PTlVfQUxBUk0gfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1faWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1faWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfb251X2FsYXJtIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1faWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXR1cyIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURURfSURfU1RBVFVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInNlcmlhbF9udW1iZXIiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX09OVV9ESVNBQkxFX0NPTVBMRVRFRF9JRF9TRVJJQUxfTlVNQkVSIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzZXJpYWxfbnVtYmVyIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9PTlVfRU5BQkxFX0NPTVBMRVRFRF9JRF9TRVJJQUxfTlVNQkVSIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uX2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X29wdGljYWxfcmVmbGVjdGlvbl9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X29wdGljYWxfcmVmbGVjdGlvbl9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb24gZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X29wdGljYWxfcmVmbGVjdGlvbl9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb25faWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXR1cyIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUyB9LCB7IC5uYW1lID0gImZhaWxfcmVhc29uIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9DT01QTEVURURfSURfRkFJTF9SRUFTT04gfSwgeyAubmFtZSA9ICJwYXNzd29yZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fQ09NUExFVEVEX0lEX1BBU1NXT1JEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9wZWVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9QRUVfSURfQUxBUk1fU1RBVFVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcGVlX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfcGVlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X3BlZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfcGVlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X3BlZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicGxvYW0iLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1BMT0FNX1BBQ0tFVF9JRF9QTE9BTSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9wbG9hbV9wYWNrZXQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3Bsb2FtX3BhY2tldF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9QT1NTSUJMRV9EUklGVF9JRF9BTEFSTV9TVEFUVVMgfSwgeyAubmFtZSA9ICJlc3RpbWF0ZWRfZHJpZnQiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1BPU1NJQkxFX0RSSUZUX0lEX0VTVElNQVRFRF9EUklGVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm9sZF9zdGF0ZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0VfSURfT0xEX1NUQVRFIH0sIHsgLm5hbWUgPSAibmV3X3N0YXRlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9ORVdfU1RBVEUgfSwgeyAubmFtZSA9ICJyZWFzb24iLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX1JFQVNPTiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X3BzdF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJsaW5rX251bWJlciIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfUFNUX0lEX0xJTktfTlVNQkVSIH0sIHsgLm5hbWUgPSAiazEiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1BTVF9JRF9LMSB9LCB7IC5uYW1lID0gImsyIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9QU1RfSURfSzIgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9wc3RfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9wc3RfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfcHN0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9wc3RfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfcHN0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXR1cyIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfU1RBVFVTIH0sIHsgLm5hbWUgPSAiZmFpbF9yZWFzb24iLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OIH0sIHsgLm5hbWUgPSAibnVtYmVyX29mX3Bsb2FtcyIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfTlVNQkVSX09GX1BMT0FNUyB9LCB7IC5uYW1lID0gImVxZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfRVFEIH0sIHsgLm5hbWUgPSAicG93ZXJfbGV2ZWwiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX1BPV0VSX0xFVkVMIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfcmVpX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImJpcDhfZXJyb3JzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9SRUlfSURfQklQOF9FUlJPUlMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9yZWlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9yZWlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfcmVpIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9yZWlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfcmVpX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXR1cyIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfU1RBVFVTIH0sIHsgLm5hbWUgPSAiZmFpbF9yZWFzb24iLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9yc3NpX21lYXN1cmVtZW50IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfc2RpX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfU0RJX0lEX0FMQVJNX1NUQVRVUyB9LCB7IC5uYW1lID0gImJlciIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfU0RJX0lEX0JFUiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3NkaV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X3NkaV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9zZGkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3NkaV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX29udV9zZGlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJvbnVfc3RhdGUiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X3NmaV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1NGSV9JRF9BTEFSTV9TVEFUVVMgfSwgeyAubmFtZSA9ICJiZXIiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1NGSV9JRF9CRVIgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9zZmlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9zZmlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfc2ZpIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9zZmlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfc2ZpX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNmZyIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9DRkdfSURfQ0ZHIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBncG9uX29udV9zdGF0X2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJmZWNfY29kZXdvcmRzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0ZFQ19DT0RFV09SRFMgfSwgeyAubmFtZSA9ICJmZWNfYnl0ZXNfY29ycmVjdGVkIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0ZFQ19CWVRFU19DT1JSRUNURUQgfSwgeyAubmFtZSA9ICJmZWNfY29kZXdvcmRzX2NvcnJlY3RlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09ERVdPUkRTX0NPUlJFQ1RFRCB9LCB7IC5uYW1lID0gImZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEU19VTkNPUlJFQ1RFRCB9LCB7IC5uYW1lID0gImJpcDhfYnl0ZXMiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1NUQVRfSURfQklQOF9CWVRFUyB9LCB7IC5uYW1lID0gImJpcDhfZXJyb3JzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX0JJUDhfRVJST1JTIH0sIHsgLm5hbWUgPSAicnhfcGxvYW1zX2NyY19lcnJvciIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfQ1JDX0VSUk9SIH0sIHsgLm5hbWUgPSAicnhfcGxvYW1zX25vbl9pZGxlIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX1BMT0FNU19OT05fSURMRSB9LCB7IC5uYW1lID0gInBvc2l0aXZlX2RyaWZ0IiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1BPU0lUSVZFX0RSSUZUIH0sIHsgLm5hbWUgPSAibmVnYXRpdmVfZHJpZnQiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1NUQVRfSURfTkVHQVRJVkVfRFJJRlQgfSwgeyAubmFtZSA9ICJyeF9vbWNpIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX09NQ0kgfSwgeyAubmFtZSA9ICJyeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1IgfSwgeyAubmFtZSA9ICJiZXJfcmVwb3J0ZWQiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1NUQVRfSURfQkVSX1JFUE9SVEVEIH0sIHsgLm5hbWUgPSAidW5yZWNlaXZlZF9idXJzdCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9VTlJFQ0VJVkVEX0JVUlNUIH0sIHsgLm5hbWUgPSAibGNkZ19lcnJvcnMiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1NUQVRfSURfTENER19FUlJPUlMgfSwgeyAubmFtZSA9ICJyZGlfZXJyb3JzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JESV9FUlJPUlMgfSwgeyAubmFtZSA9ICJyeF9ieXRlcyIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9CWVRFUyB9LCB7IC5uYW1lID0gInJ4X3BhY2tldHMiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfUEFDS0VUUyB9LCB7IC5uYW1lID0gInR4X2J5dGVzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1RYX0JZVEVTIH0sIHsgLm5hbWUgPSAidHhfcGFja2V0cyIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9UWF9QQUNLRVRTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfc3RhdF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X3N0YXRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZ3Bvbl9vbnVfc3RhdCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX29udV9zdGF0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X3N1ZmlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9TVUZJX0lEX0FMQVJNX1NUQVRVUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3N1ZmlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9zdWZpX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X3N1ZmkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3N1ZmlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfc3VmaV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV90aXdpX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfVElXSV9JRF9BTEFSTV9TVEFUVVMgfSwgeyAubmFtZSA9ICJkcmlmdF92YWx1ZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfVElXSV9JRF9EUklGVF9WQUxVRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3Rpd2lfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV90aXdpX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fb251X3Rpd2kgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3Rpd2lfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfZ3Bvbl9vbnVfdGl3aV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9vbWNpX2RldmljZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJiYXNlbGluZSIsIC52YWwgPSBCQ01PTFRfT01DSV9ERVZJQ0VfSURfQkFTRUxJTkUgfSwgeyAubmFtZSA9ICJleHRlbmRlZCIsIC52YWwgPSBCQ01PTFRfT01DSV9ERVZJQ0VfSURfRVhURU5ERUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9vbWNpX2RldmljZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X29tY2lfZGV2aWNlX2lkIiwgLmRlc2NyID0gIk9NQ0kgRGV2aWNlIElEIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X29tY2lfZGV2aWNlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X29tY2lfZGV2aWNlX2lkX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtc19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyZXNwb25zZV90aW1lb3V0X21zIiwgLmRlc2NyID0gIlRoZSBsZW5ndGggb2YgdGltZSB0aGF0IHRoZSBPTFQgd2lsbCB3YWl0IGZvciB0aGUgT05VIHRvIHJlc3BvbmQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtcywgcmVzcG9uc2VfdGltZW91dF9tcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJtYXhfcmV0cnlfY291bnQiLCAuZGVzY3IgPSAiTWF4aW11bSByZXRyeSBjb3VudCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9wYXJhbXMsIG1heF9yZXRyeV9jb3VudCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gIm9tY2lfZm9ybWF0IiwgLmRlc2NyID0gIk9NQ0kgZm9ybWF0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtcywgb21jaV9mb3JtYXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9vbWNpX2RldmljZV9pZCB9LCB7IC5uYW1lID0gIndpbmRvd19zaXplIiwgLmRlc2NyID0gIldpbmRvdyBzaXplIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtcywgd2luZG93X3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiYWN0aXZhdGVfY29tbWl0IiwgLmRlc2NyID0gIkF1dG9tYXRpY2FsbHkgYWN0aXZhdGUgdGhlIG5ldyBpbWFnZSBhbmQgY29tbWl0LiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9wYXJhbXMsIGFjdGl2YXRlX2NvbW1pdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImRlbGF5X2Zvcl9jb21taXRfbXMiLCAuZGVzY3IgPSAiRGVsYXkgdGltZSBiZWZvcmUgQ09NTUlUIGNvbW1hbmQuICBVbml0IGlzIG1pbGxpc2Vjb25kcy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zLCBkZWxheV9mb3JfY29tbWl0X21zKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gIm1heF9hY3RpdmF0aW9uX2F0dGVtcHRzIiwgLmRlc2NyID0gIk1heGltdW0gbnVtYmVyIG9mIHJlLWF0dGVtcHRzIHRvIGFjdGl2YXRlIHRoZSBPTlUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtcywgbWF4X2FjdGl2YXRpb25fYXR0ZW1wdHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtcyA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zIiwgLmRlc2NyID0gIkdQT04gT05VIHVwZ3JhZGUgcGFyYW1zIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9yZXR1cm5fY29kZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdWNjZXNzIiwgLnZhbCA9IEJDTU9MVF9HUE9OX09OVV9VUEdSQURFX1JFVFVSTl9DT0RFX1NVQ0NFU1MgfSwgeyAubmFtZSA9ICJvbnVfcmVzcG9uc2VfdGltZW91dCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfVVBHUkFERV9SRVRVUk5fQ09ERV9PTlVfUkVTUE9OU0VfVElNRU9VVCB9LCB7IC5uYW1lID0gIm9udV9lcnJvcl9yZXNwb25zZSIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfVVBHUkFERV9SRVRVUk5fQ09ERV9PTlVfRVJST1JfUkVTUE9OU0UgfSwgeyAubmFtZSA9ICJ0Y2lfbWlzbWF0Y2giLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1VQR1JBREVfUkVUVVJOX0NPREVfVENJX01JU01BVENIIH0sIHsgLm5hbWUgPSAiZ2V0X2ltYWdlX2ZhaWxlZCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfVVBHUkFERV9SRVRVUk5fQ09ERV9HRVRfSU1BR0VfRkFJTEVEIH0sIHsgLm5hbWUgPSAiYWN0aXZhdGlvbl9mYWlsZWQiLCAudmFsID0gQkNNT0xUX0dQT05fT05VX1VQR1JBREVfUkVUVVJOX0NPREVfQUNUSVZBVElPTl9GQUlMRUQgfSwgeyAubmFtZSA9ICJpbnRlcm5hbCIsIC52YWwgPSBCQ01PTFRfR1BPTl9PTlVfVVBHUkFERV9SRVRVUk5fQ09ERV9JTlRFUk5BTCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcmV0dXJuX2NvZGUgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV91cGdyYWRlX3JldHVybl9jb2RlIiwgLmRlc2NyID0gIkdQT04gT05VIFVwZ3JhZGUgUmV0dXJuIENvZGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9yZXR1cm5fY29kZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ncG9uX29udV91cGdyYWRlX3JldHVybl9jb2RlX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X29tY2lfcmVzdWx0X2NvZGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibm9fZXJyb3IiLCAudmFsID0gQkNNT0xUX09NQ0lfUkVTVUxUX0NPREVfTk9fRVJST1IgfSwgeyAubmFtZSA9ICJwcm9jZXNzaW5nX2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9PTUNJX1JFU1VMVF9DT0RFX1BST0NFU1NJTkdfRVJST1IgfSwgeyAubmFtZSA9ICJub3Rfc3VwcG9ydGVkIiwgLnZhbCA9IEJDTU9MVF9PTUNJX1JFU1VMVF9DT0RFX05PVF9TVVBQT1JURUQgfSwgeyAubmFtZSA9ICJwYXJhbWV0ZXJfZXJyb3IiLCAudmFsID0gQkNNT0xUX09NQ0lfUkVTVUxUX0NPREVfUEFSQU1FVEVSX0VSUk9SIH0sIHsgLm5hbWUgPSAidW5rbm93bl9lbnRpdHkiLCAudmFsID0gQkNNT0xUX09NQ0lfUkVTVUxUX0NPREVfVU5LTk9XTl9FTlRJVFkgfSwgeyAubmFtZSA9ICJ1bmtub3duX2luc3RhbmNlIiwgLnZhbCA9IEJDTU9MVF9PTUNJX1JFU1VMVF9DT0RFX1VOS05PV05fSU5TVEFOQ0UgfSwgeyAubmFtZSA9ICJkZXZpY2VfYnVzeSIsIC52YWwgPSBCQ01PTFRfT01DSV9SRVNVTFRfQ09ERV9ERVZJQ0VfQlVTWSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X29tY2lfcmVzdWx0X2NvZGUgPSB7IC5uYW1lID0gImJjbW9sdF9vbWNpX3Jlc3VsdF9jb2RlIiwgLmRlc2NyID0gIkcuOTg4IE9NQ0kgUmVzdWx0IENvZGUuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X29tY2lfcmVzdWx0X2NvZGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfb21jaV9yZXN1bHRfY29kZV9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAib251X2lkIiwgLmRlc2NyID0gIk9OVSBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXMsIG9udV9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJlcnJvcl9jb2RlIiwgLmRlc2NyID0gIkVycm9yIENvZGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzLCBlcnJvcl9jb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9yZXR1cm5fY29kZSB9LCB7IC5uYW1lID0gImZhaWxfcmVhc29uIiwgLmRlc2NyID0gIkZhaWx1cmUgcmVhc29uIHNwZWNpZmljIHRvIHRoZSBFcnJvciBDb2RlIGFib3ZlLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXMsIGZhaWxfcmVhc29uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb21jaV9yZXN1bHRfY29kZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXMiLCAuZGVzY3IgPSAiR1BPTiBPTlUgVXBncmFkZSBTdGF0dXMiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXMpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMiA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyIiwgLmRlc2NyID0gIlZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIGdwb25fb251X3VwZ3JhZGVfc3RhdHVzIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0RZTiwgLnggPSB7IC5hcnJfZHluID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzLCAubGVuX3NpemUgPSA0LCAubWF4X3NpemUgPSBERUZBVUxUX0RZTl9BUlJfTUFYX1NJWkUgLyBzaXplb2YoYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzKSB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfb251X3N0YXRlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm5vdF9jb25maWd1cmVkIiwgLnZhbCA9IEJDTU9MVF9PTlVfU1RBVEVfTk9UX0NPTkZJR1VSRUQgfSwgeyAubmFtZSA9ICJpbmFjdGl2ZSIsIC52YWwgPSBCQ01PTFRfT05VX1NUQVRFX0lOQUNUSVZFIH0sIHsgLm5hbWUgPSAiYWN0aXZlIiwgLnZhbCA9IEJDTU9MVF9PTlVfU1RBVEVfQUNUSVZFIH0sIHsgLm5hbWUgPSAiYWN0aXZlX3N0YW5kYnkiLCAudmFsID0gQkNNT0xUX09OVV9TVEFURV9BQ1RJVkVfU1RBTkRCWSB9LCB7IC5uYW1lID0gImRpc2FibGVkIiwgLnZhbCA9IEJDTU9MVF9PTlVfU1RBVEVfRElTQUJMRUQgfSwgeyAubmFtZSA9ICJhd2FrZV9mcmVlIiwgLnZhbCA9IEJDTU9MVF9PTlVfU1RBVEVfQVdBS0VfRlJFRSB9LCB7IC5uYW1lID0gInByb2Nlc3NpbmciLCAudmFsID0gQkNNT0xUX09OVV9TVEFURV9QUk9DRVNTSU5HIH0sIHsgLm5hbWUgPSAibG93X3Bvd2VyX2RvemUiLCAudmFsID0gQkNNT0xUX09OVV9TVEFURV9MT1dfUE9XRVJfRE9aRSB9LCB7IC5uYW1lID0gImxvd19wb3dlcl9zbGVlcCIsIC52YWwgPSBCQ01PTFRfT05VX1NUQVRFX0xPV19QT1dFUl9TTEVFUCB9LCB7IC5uYW1lID0gImxvd19wb3dlcl93YXRjaCIsIC52YWwgPSBCQ01PTFRfT05VX1NUQVRFX0xPV19QT1dFUl9XQVRDSCB9LCB7IC5uYW1lID0gInVuYXdhcmUiLCAudmFsID0gQkNNT0xUX09OVV9TVEFURV9VTkFXQVJFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfb251X3N0YXRlID0geyAubmFtZSA9ICJiY21vbHRfb251X3N0YXRlIiwgLmRlc2NyID0gIk9OVSBzdGF0ZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9vbnVfc3RhdGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfb251X3N0YXRlX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm9udV9pZCIsIC5kZXNjciA9ICJPTlUgSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGUsIG9udV9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJzdGF0ZSIsIC5kZXNjciA9ICJTdGF0ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZSwgc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9vbnVfc3RhdGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZSIsIC5kZXNjciA9ICJHUE9OIE9OVSBXaXRoIFN0YXRlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV93aXRoX3N0YXRlX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4ID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4IiwgLmRlc2NyID0gIlZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIGdwb25fb251X3dpdGhfc3RhdGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0RZTiwgLnggPSB7IC5hcnJfZHluID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGUsIC5sZW5fc2l6ZSA9IDIsIC5tYXhfc2l6ZSA9IDEyOCB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcnNzaV9sb2NhdGlvbl9zaWduX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImJlZm9yZSIsIC52YWwgPSBCQ01PTFRfUlNTSV9MT0NBVElPTl9TSUdOX0JFRk9SRSB9LCB7IC5uYW1lID0gImFmdGVyIiwgLnZhbCA9IEJDTU9MVF9SU1NJX0xPQ0FUSU9OX1NJR05fQUZURVIgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9yc3NpX2xvY2F0aW9uX3NpZ24gPSB7IC5uYW1lID0gImJjbW9sdF9yc3NpX2xvY2F0aW9uX3NpZ24iLCAuZGVzY3IgPSAicnNzaSBsb2NhdGlvbiBzaWduIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3Jzc2lfbG9jYXRpb25fc2lnbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9yc3NpX2xvY2F0aW9uX3NpZ25fc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb25fZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibG9jYXRpb24iLCAuZGVzY3IgPSAidGhlIHBhdHRlcm4gYWN0aXZhdGlvbiBsb2NhdGlvbiBpbiBjbG9jayBjeWNsZXMgcmVsYXRpdmUgKGJlZm9yZSkgdG8gc3RhcnQgb2YgYnVyc3QuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3Jzc2lfZ2VuZXJhbF9jb25maWd1cmF0aW9uLCBsb2NhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gImxvY2F0aW9uX3NpZ24iLCAuZGVzY3IgPSAidGhpcyBiaXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBsb2NhdGlvbiBvZiB0aGUgUlNTSSBpbiBkYXRhIG1vZGUgKGNvbmZpZ3VyZWQgYXMgUlNTSSBwYXR0ZXJuIDEpIHdpbGwgYmUgYmVmb3JlIG9yIGFmdGVyIHRoZSBidXJzdCBzdGFydC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb24sIGxvY2F0aW9uX3NpZ24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yc3NpX2xvY2F0aW9uX3NpZ24gfSwgeyAubmFtZSA9ICJzdGFydF9wYXR0ZXJuIiwgLmRlc2NyID0gInRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgY3ljbGUgb2YgdGhlIHBhdHRlcm4gKHdpbGwgYmUgdHJhbnNtaXR0ZWQgb25jZSkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3Jzc2lfZ2VuZXJhbF9jb25maWd1cmF0aW9uLCBzdGFydF9wYXR0ZXJuKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAibWlkZGxlX3BhdHRlcm4iLCAuZGVzY3IgPSAidGhlIHZhbHVlIG9mIHRoZSBwYXR0ZXJuIHRoYXQgd2lsbCBiZSB0cmFuc21pdHRlZCBtaWRkbGVfcmVwZXRpdGlvbiB0aW1lcyBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgdGhlIGVuZCBvZiB0aGUgcGF0dGVybi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb24sIG1pZGRsZV9wYXR0ZXJuKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAibGFzdF9wYXR0ZXJuIiwgLmRlc2NyID0gInRoZSB2YWx1ZSBvZiB0aGUgbGFzdCBjeWNsZSBvZiB0aGUgcGF0dGVybi4gd2lsbCBiZSB0cmFuc21pdHRlZCBvbmNlLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9yc3NpX2dlbmVyYWxfY29uZmlndXJhdGlvbiwgbGFzdF9wYXR0ZXJuKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAibWlkZGxlX3JlcGVydGl0aW9uIiwgLmRlc2NyID0gInRoZSBudW1iZXIgb2YgdGltZXMgdGhlIG1pZGRsZSBwYXR0ZXJuIHdpbGwgYmUgcmVwZWF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3Jzc2lfZ2VuZXJhbF9jb25maWd1cmF0aW9uLCBtaWRkbGVfcmVwZXJ0aXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJtaW5pbXVtX2J1cnN0IiwgLmRlc2NyID0gInRoZSBtaW5pbXVtIGJ1cnN0IHNpemUgbmVlZGVkIG1lYXN1cmVtZW50IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3Jzc2lfZ2VuZXJhbF9jb25maWd1cmF0aW9uLCBtaW5pbXVtX2J1cnN0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb24gPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX3Jzc2lfZ2VuZXJhbF9jb25maWd1cmF0aW9uIiwgLmRlc2NyID0gImdwb24gUlNTSSBnZW5lcmFsIGNvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9yc3NpX2dlbmVyYWxfY29uZmlndXJhdGlvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX3Jzc2lfZ2VuZXJhbF9jb25maWd1cmF0aW9uX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb25fZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9vbnVfcG9zdF9kaXNjb3ZlcnlfbW9kZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJub25lIiwgLnZhbCA9IEJDTU9MVF9PTlVfUE9TVF9ESVNDT1ZFUllfTU9ERV9OT05FIH0sIHsgLm5hbWUgPSAiYWN0aXZhdGUiLCAudmFsID0gQkNNT0xUX09OVV9QT1NUX0RJU0NPVkVSWV9NT0RFX0FDVElWQVRFIH0sIHsgLm5hbWUgPSAiZGlzYWJsZSIsIC52YWwgPSBCQ01PTFRfT05VX1BPU1RfRElTQ09WRVJZX01PREVfRElTQUJMRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X29udV9wb3N0X2Rpc2NvdmVyeV9tb2RlID0geyAubmFtZSA9ICJiY21vbHRfb251X3Bvc3RfZGlzY292ZXJ5X21vZGUiLCAuZGVzY3IgPSAiT05VIHBvc3QgZGlzY292ZXJ5IG1vZGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfb251X3Bvc3RfZGlzY292ZXJ5X21vZGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfb251X3Bvc3RfZGlzY292ZXJ5X21vZGVfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb25fZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiaW50ZXJ2YWwiLCAuZGVzY3IgPSAiU04gcHJvY2VzcyBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb24sIGludGVydmFsKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImNvbnRyb2wiLCAuZGVzY3IgPSAiU04gcHJvY2VzcyBjb250cm9sIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3NuX2FjcXVpc2l0aW9uLCBjb250cm9sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY29udHJvbF9zdGF0ZSB9LCB7IC5uYW1lID0gIm9udV9wb3N0X2Rpc2NvdmVyeV9tb2RlIiwgLmRlc2NyID0gIkF1dG9tYXRpYyBvcGVyYXRpb24gZm9sbG93aW5nIE9OVSBkaXNjb3ZlcnkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb24sIG9udV9wb3N0X2Rpc2NvdmVyeV9tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb251X3Bvc3RfZGlzY292ZXJ5X21vZGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX3NuX2FjcXVpc2l0aW9uID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9zbl9hY3F1aXNpdGlvbiIsIC5kZXNjciA9ICJHUE9OIFNOIEFjcXVpc2l0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9zbl9hY3F1aXNpdGlvbl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX3NuX2FjcXVpc2l0aW9uX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl90cnhfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInRyYW5zY2VpdmVyX3R5cGUiLCAudmFsID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9UUkFOU0NFSVZFUl9UWVBFIH0sIHsgLm5hbWUgPSAibGFfY29uZmlndXJhdGlvbiIsIC52YWwgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX0NPTkZJR1VSQVRJT04gfSwgeyAubmFtZSA9ICJiY2RyIiwgLnZhbCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUiB9LCB7IC5uYW1lID0gImxhX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jIiwgLnZhbCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfUkFOR0lOR19BRlRFUl9OT19FRF9SRVNZTkMgfSwgeyAubmFtZSA9ICJiY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jIiwgLnZhbCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUl9SQU5HSU5HX0FGVEVSX05PX0VEX1JFU1lOQyB9LCB7IC5uYW1lID0gImxhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jIiwgLnZhbCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfUkFOR0lOR19BRlRFUl9FRF9SRVNZTkMgfSwgeyAubmFtZSA9ICJiY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jIiwgLnZhbCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUl9SQU5HSU5HX0FGVEVSX0VEX1JFU1lOQyB9LCB7IC5uYW1lID0gImxhX3Jlc3luY19wb2xhcml0eSIsIC52YWwgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX1JFU1lOQ19QT0xBUklUWSB9LCB7IC5uYW1lID0gImJjZHJfcmVzeW5jX3BvbGFyaXR5IiwgLnZhbCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUl9SRVNZTkNfUE9MQVJJVFkgfSwgeyAubmFtZSA9ICJiY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMiLCAudmFsID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9CQ0RSX1JBTkdJTkdfUkVTWU5DX0NPTkRJVElPTlMgfSwgeyAubmFtZSA9ICJsYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zIiwgLnZhbCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfUkFOR0lOR19SRVNZTkNfQ09ORElUSU9OUyB9LCB7IC5uYW1lID0gInJ4X2NvbmZpZ3VyYXRpb24iLCAudmFsID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9SWF9DT05GSUdVUkFUSU9OIH0sIHsgLm5hbWUgPSAicmFuZ2luZ19jb250cm9sX3N0YWdlc19jb25maWd1cmF0aW9uIiwgLnZhbCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUkFOR0lOR19DT05UUk9MX1NUQUdFU19DT05GSUdVUkFUSU9OIH0sIHsgLm5hbWUgPSAiZW5lcmd5X2RldGVjdCIsIC52YWwgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0VORVJHWV9ERVRFQ1QgfSwgeyAubmFtZSA9ICJlbmRfb2ZfYnVyc3RfZGF0YV9wYXR0ZXJuIiwgLnZhbCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfRU5EX09GX0JVUlNUX0RBVEFfUEFUVEVSTiB9LCB7IC5uYW1lID0gImVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4iLCAudmFsID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9FTkRfT0ZfQlVSU1RfUkFOR0lOR19QQVRURVJOIH0sIHsgLm5hbWUgPSAicHJlYW1ibGUiLCAudmFsID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9QUkVBTUJMRSB9LCB7IC5uYW1lID0gImRlbGltaXRlciIsIC52YWwgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0RFTElNSVRFUiB9LCB7IC5uYW1lID0gImd1YXJkX2JpdHMiLCAudmFsID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9HVUFSRF9CSVRTIH0sIHsgLm5hbWUgPSAic2VyZGVzX2NvbmZpZ3VyYXRpb24iLCAudmFsID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9TRVJERVNfQ09ORklHVVJBVElPTiB9LCB7IC5uYW1lID0gInBsb19yYW5naW5nIiwgLnZhbCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUExPX1JBTkdJTkcgfSwgeyAubmFtZSA9ICJwbG9fZGF0YSIsIC52YWwgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1BMT19EQVRBIH0sIHsgLm5hbWUgPSAicnNzaV9ub3JtYWxfY29uZmlnIiwgLnZhbCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUlNTSV9OT1JNQUxfQ09ORklHIH0sIHsgLm5hbWUgPSAicmFuZ2luZ19yc3NpX3Jlc3luY19jb250cm9sIiwgLnZhbCA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUkFOR0lOR19SU1NJX1JFU1lOQ19DT05UUk9MIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl90cnhfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl90cnhfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fdHJ4X2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fdHJ4X2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX3RyeF9rZXlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicG9uX25pIiwgLnZhbCA9IEJDTU9MVF9HUE9OX1RSWF9LRVlfSURfUE9OX05JIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl90cnhfa2V5X2lkID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl90cnhfa2V5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGdwb25fdHJ4X2tleSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl90cnhfa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2dwb25fdHJ4X2tleV9pZF9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfaG9zdF9zd192ZXJzaW9uX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm1ham9yIiwgLmRlc2NyID0gIk1ham9yICIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfaG9zdF9zd192ZXJzaW9uLCBtYWpvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gIm1pbm9yIiwgLmRlc2NyID0gIk1pbm9yIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ob3N0X3N3X3ZlcnNpb24sIG1pbm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAicmV2aXNpb24iLCAuZGVzY3IgPSAiUmV2aXNpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2hvc3Rfc3dfdmVyc2lvbiwgcmV2aXNpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3RfaGV4IH0sIHsgLm5hbWUgPSAibW9kZWwiLCAuZGVzY3IgPSAiTW9kZWwiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2hvc3Rfc3dfdmVyc2lvbiwgbW9kZWwpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiYnVpbGRfdGltZSIsIC5kZXNjciA9ICJGaXJtd2FyZSBTVyBidWlsZCB0aW1lIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ob3N0X3N3X3ZlcnNpb24sIGJ1aWxkX3RpbWUpLCAudHlwZSA9ICZzdHJpbmdfMzIgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ob3N0X3N3X3ZlcnNpb24gPSB7IC5uYW1lID0gImJjbW9sdF9ob3N0X3N3X3ZlcnNpb24iLCAuZGVzY3IgPSAiSG9zdCBTVyBWZXJzaW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2hvc3Rfc3dfdmVyc2lvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ob3N0X3N3X3ZlcnNpb25fZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfaG9zdF9zd192ZXJzaW9uX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2h3X3Bvbl9pZF9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwb25faWRfMSIsIC5kZXNjciA9ICJMU0IgMzIgYml0cyBvZiBQT04gSUQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9od19wb25faWQsIHBvbl9pZF8xKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gInBvbl9pZF8yIiwgLmRlc2NyID0gIk1TQiAxOSBiaXRzIG9mIFBPTiBJRC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2h3X3Bvbl9pZCwgcG9uX2lkXzIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfaHdfcG9uX2lkID0geyAubmFtZSA9ICJiY21vbHRfaHdfcG9uX2lkIiwgLmRlc2NyID0gIkhXIFBPTiBJRCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9od19wb25faWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfaHdfcG9uX2lkX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2h3X3Bvbl9pZF9maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2ltYWdlX3RyYW5zZmVyX3N0YXR1c19zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdWNjZXNzIiwgLnZhbCA9IEJDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfU1VDQ0VTUyB9LCB7IC5uYW1lID0gIm1lbW9yeV9hbGxvY2F0aW9uX2ZhaWx1cmUiLCAudmFsID0gQkNNT0xUX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19NRU1PUllfQUxMT0NBVElPTl9GQUlMVVJFIH0sIHsgLm5hbWUgPSAidW5zdXBwb3J0ZWRfZmlsZV90eXBlIiwgLnZhbCA9IEJDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfVU5TVVBQT1JURURfRklMRV9UWVBFIH0sIHsgLm5hbWUgPSAiY3JjX2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfQ1JDX0VSUk9SIH0sIHsgLm5hbWUgPSAiYmxvY2tfb3V0X29mX3N5bmMiLCAudmFsID0gQkNNT0xUX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19CTE9DS19PVVRfT0ZfU1lOQyB9LCB7IC5uYW1lID0gImludGVybmFsX2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfSU5URVJOQUxfRVJST1IgfSwgeyAubmFtZSA9ICJpbnZhbGlkX3N0YXRlIiwgLnZhbCA9IEJDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfSU5WQUxJRF9TVEFURSB9LCB7IC5uYW1lID0gInByZW1hdHVyZV90ZXJtaW5hdGlvbiIsIC52YWwgPSBCQ01PTFRfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX1BSRU1BVFVSRV9URVJNSU5BVElPTiB9LCB7IC5uYW1lID0gImFja190aW1lb3V0IiwgLnZhbCA9IEJDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfQUNLX1RJTUVPVVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9pbWFnZV90cmFuc2Zlcl9zdGF0dXMgPSB7IC5uYW1lID0gImJjbW9sdF9pbWFnZV90cmFuc2Zlcl9zdGF0dXMiLCAuZGVzY3IgPSAiSW1hZ2UgdHJhbnNmZXIgc3RhdHVzIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2ltYWdlX3RyYW5zZmVyX3N0YXR1cyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9pbWFnZV90cmFuc2Zlcl9zdGF0dXNfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2luZGljYXRpb25fc2hhcGluZ19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJlbmFibGVkIiwgLmRlc2NyID0gIldoZXRoZXIgb3Igbm90IHRoZSBkZXZpY2Ugd2lsbCBsaW1pdCB0aGUgcmF0ZSBvZiBpbmRpY2F0aW9ucyBzZW50IHRvIHRoZSBob3N0LiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfaW5kaWNhdGlvbl9zaGFwaW5nLCBlbmFibGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAibWF4X3JhdGUiLCAuZGVzY3IgPSAiTWF4aW11bSBudW1iZXIgb2YgaW5kaWNhdGlvbnMgcGVyIHNlY29uZCB0byBiZSBnZW5lcmF0ZWQgYnkgdGhlIGRldmljZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2luZGljYXRpb25fc2hhcGluZywgbWF4X3JhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAibWF4X2J1cnN0IiwgLmRlc2NyID0gIk1heGltdW0gbnVtYmVyIG9mIGluZGljYXRpb25zIHRoYXQgYXJlIGFsbG93ZWQgdG8gYmUgc2VudCBiYWNrLXRvLWJhY2suIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9pbmRpY2F0aW9uX3NoYXBpbmcsIG1heF9idXJzdCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9pbmRpY2F0aW9uX3NoYXBpbmcgPSB7IC5uYW1lID0gImJjbW9sdF9pbmRpY2F0aW9uX3NoYXBpbmciLCAuZGVzY3IgPSAiUmF0ZSBsaW1pdGluZyAvIHNoYXBpbmcgZm9yIHRoZSBpbmRpY2F0aW9uIGNoYW5uZWwuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2luZGljYXRpb25fc2hhcGluZyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9pbmRpY2F0aW9uX3NoYXBpbmdfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfaW5kaWNhdGlvbl9zaGFwaW5nX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfaXdmX21vZGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZGlyZWN0X21hcHBpbmdfbW9kZSIsIC52YWwgPSBCQ01PTFRfSVdGX01PREVfRElSRUNUX01BUFBJTkdfTU9ERSB9LCB7IC5uYW1lID0gInBlcl9mbG93X21vZGUiLCAudmFsID0gQkNNT0xUX0lXRl9NT0RFX1BFUl9GTE9XX01PREUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9pd2ZfbW9kZSA9IHsgLm5hbWUgPSAiYmNtb2x0X2l3Zl9tb2RlIiwgLmRlc2NyID0gIml3ZiBtb2RlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2l3Zl9tb2RlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2l3Zl9tb2RlX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sYV9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJlc3luY19jb250cm9sIiwgLmRlc2NyID0gInVzZWQgaW4gbm9ybWFsIG1vZGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xhX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb24sIHJlc3luY19jb250cm9sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzeW5jX2NvbnRyb2wgfSwgeyAubmFtZSA9ICJyYW5naW5nX3Jlc3luY19jb250cm9sIiwgLmRlc2NyID0gInVzZWQgaW4gcmFuZ2luZyBtb2RlIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCByYW5naW5nIGN5Y2xlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sYV9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uLCByYW5naW5nX3Jlc3luY19jb250cm9sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzeW5jX2NvbnRyb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sYV9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uID0geyAubmFtZSA9ICJiY21vbHRfbGFfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbiIsIC5kZXNjciA9ICJMQSByZXN5bmMgcGF0dGVybiBjb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2xhX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfbGFfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9sYV9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1Igc3RyaW5nXzIwNDggPSB7IC5uYW1lID0gInN0cmluZ1syMDQ4XSIsIC5kZXNjciA9ICJBU0NJSSBzdHJpbmcgd2l0aCBtYXggbGVuZ3RoIDIwNDgiLCAuc2l6ZSA9IHNpemVvZihjaGFyWzIwNDhdKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSSU5HIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfYnVmZmVyX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImJ1ZmYiLCAuZGVzY3IgPSAiYnVmZiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2J1ZmZlciwgYnVmZiksIC50eXBlID0gJnN0cmluZ18yMDQ4IH0sIHsgLm5hbWUgPSAibXNnX3RvX3JlYWQiLCAuZGVzY3IgPSAibXNnX3RvX3JlYWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ19idWZmZXIsIG1zZ190b19yZWFkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ19idWZmZXIgPSB7IC5uYW1lID0gImJjbW9sdF9sb2dfYnVmZmVyIiwgLmRlc2NyID0gImxvZyBidWZmZXIiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nX2J1ZmZlciksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfYnVmZmVyX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2xvZ19idWZmZXJfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLnZhbCA9IEJDTU9MVF9MT0dfRU5UUllfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAudmFsID0gQkNNT0xUX0xPR19FTlRSWV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBsb2dfZW50cnlfYXV0b19jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbG9nX2VudHJ5X2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJkZWZhdWx0X2xvZ19sZXZlbCIsIC52YWwgPSBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9ERUZBVUxUX0xPR19MRVZFTCB9LCB7IC5uYW1lID0gImRlZmF1bHRfbG9nX3R5cGUiLCAudmFsID0gQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfREVGQVVMVF9MT0dfVFlQRSB9LCB7IC5uYW1lID0gImxvZ19sZXZlbF9wcmludCIsIC52YWwgPSBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfTEVWRUxfUFJJTlQgfSwgeyAubmFtZSA9ICJsb2dfbGV2ZWxfc2F2ZSIsIC52YWwgPSBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfTEVWRUxfU0FWRSB9LCB7IC5uYW1lID0gImxvZ190eXBlIiwgLnZhbCA9IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19UWVBFIH0sIHsgLm5hbWUgPSAibG9nX3N0eWxlIiwgLnZhbCA9IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19TVFlMRSB9LCB7IC5uYW1lID0gImxvZ19uYW1lIiwgLnZhbCA9IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19OQU1FIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbG9nX2VudHJ5X2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2xvZ19lbnRyeV9jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgbG9nX2VudHJ5X2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nX2VudHJ5X2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9sb2dfZW50cnlfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2xvZ19lbnRyeV9rZXlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibG9nX2lkIiwgLnZhbCA9IEJDTU9MVF9MT0dfRU5UUllfS0VZX0lEX0xPR19JRCB9LCB7IC5uYW1lID0gInJlc2VydmVkIiwgLnZhbCA9IEJDTU9MVF9MT0dfRU5UUllfS0VZX0lEX1JFU0VSVkVEIH0sIHsgLm5hbWUgPSAibmFtZSIsIC52YWwgPSBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9OQU1FIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbG9nX2VudHJ5X2tleV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2xvZ19lbnRyeV9rZXlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgbG9nX2VudHJ5X2tleSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nX2VudHJ5X2tleV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9sb2dfZW50cnlfa2V5X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC52YWwgPSBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9MT0dfRU5UUllfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBsb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNmZyIsIC52YWwgPSBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfQ0ZHX0lEX0NGRyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBsb2dfZW50cnlfc3RhdF9jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibXNnX2NvdW50IiwgLnZhbCA9IEJDTU9MVF9MT0dfRU5UUllfU1RBVF9JRF9NU0dfQ09VTlQgfSwgeyAubmFtZSA9ICJsb3N0X21zZ19jb3VudCIsIC52YWwgPSBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfSURfTE9TVF9NU0dfQ09VTlQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZW50cnlfc3RhdF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGxvZ19lbnRyeV9zdGF0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dfZW50cnlfc3RhdF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9sb2dfZW50cnlfc3RhdF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9sb2dfZmlsZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzcmFtIiwgLnZhbCA9IEJDTU9MVF9MT0dfRklMRV9JRF9TUkFNIH0sIHsgLm5hbWUgPSAiZGRyIiwgLnZhbCA9IEJDTU9MVF9MT0dfRklMRV9JRF9ERFIgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZmlsZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X2xvZ19maWxlX2lkIiwgLmRlc2NyID0gImxvZyBmaWxlIGlkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2xvZ19maWxlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2xvZ19maWxlX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2xvZ19sZXZlbF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJub19sb2ciLCAudmFsID0gQkNNT0xUX0xPR19MRVZFTF9OT19MT0cgfSwgeyAubmFtZSA9ICJmYXRhbCIsIC52YWwgPSBCQ01PTFRfTE9HX0xFVkVMX0ZBVEFMIH0sIHsgLm5hbWUgPSAiZXJyb3IiLCAudmFsID0gQkNNT0xUX0xPR19MRVZFTF9FUlJPUiB9LCB7IC5uYW1lID0gIndhcm5pbmciLCAudmFsID0gQkNNT0xUX0xPR19MRVZFTF9XQVJOSU5HIH0sIHsgLm5hbWUgPSAiaW5mbyIsIC52YWwgPSBCQ01PTFRfTE9HX0xFVkVMX0lORk8gfSwgeyAubmFtZSA9ICJkZWJ1ZyIsIC52YWwgPSBCQ01PTFRfTE9HX0xFVkVMX0RFQlVHIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbG9nX2xldmVsID0geyAubmFtZSA9ICJiY21vbHRfbG9nX2xldmVsIiwgLmRlc2NyID0gImxvZyBsZXZlbCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dfbGV2ZWwpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbG9nX2xldmVsX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2xvZ19zdHlsZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJub3JtYWwiLCAudmFsID0gQkNNT0xUX0xPR19TVFlMRV9OT1JNQUwgfSwgeyAubmFtZSA9ICJib2xkIiwgLnZhbCA9IEJDTU9MVF9MT0dfU1RZTEVfQk9MRCB9LCB7IC5uYW1lID0gInVuZGVybGluZSIsIC52YWwgPSBCQ01PTFRfTE9HX1NUWUxFX1VOREVSTElORSB9LCB7IC5uYW1lID0gImJsaW5rIiwgLnZhbCA9IEJDTU9MVF9MT0dfU1RZTEVfQkxJTksgfSwgeyAubmFtZSA9ICJyZXZlcnNlX3ZpZGVvIiwgLnZhbCA9IEJDTU9MVF9MT0dfU1RZTEVfUkVWRVJTRV9WSURFTyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ19zdHlsZSA9IHsgLm5hbWUgPSAiYmNtb2x0X2xvZ19zdHlsZSIsIC5kZXNjciA9ICJsb2cgc3R5bGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nX3N0eWxlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2xvZ19zdHlsZV9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9sb2dfdHlwZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJub25lIiwgLnZhbCA9IEJDTU9MVF9MT0dfVFlQRV9OT05FIH0sIHsgLm5hbWUgPSAicHJpbnQiLCAudmFsID0gQkNNT0xUX0xPR19UWVBFX1BSSU5UIH0sIHsgLm5hbWUgPSAic2F2ZSIsIC52YWwgPSBCQ01PTFRfTE9HX1RZUEVfU0FWRSB9LCB7IC5uYW1lID0gImJvdGgiLCAudmFsID0gQkNNT0xUX0xPR19UWVBFX0JPVEggfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfdHlwZSA9IHsgLm5hbWUgPSAiYmNtb2x0X2xvZ190eXBlIiwgLmRlc2NyID0gImxvZyB0eXBlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2xvZ190eXBlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2xvZ190eXBlX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAudmFsID0gQkNNT0xUX0xPR0dFUl9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC52YWwgPSBCQ01PTFRfTE9HR0VSX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGxvZ2dlcl9hdXRvX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9sb2dnZXJfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImJ1ZmZlciIsIC52YWwgPSBCQ01PTFRfTE9HR0VSX0NGR19JRF9CVUZGRVIgfSwgeyAubmFtZSA9ICJ3cmFwX2Fyb3VuZCIsIC52YWwgPSBCQ01PTFRfTE9HR0VSX0NGR19JRF9XUkFQX0FST1VORCB9LCB7IC5uYW1lID0gImNsZWFyX2FmdGVyX3JlYWQiLCAudmFsID0gQkNNT0xUX0xPR0dFUl9DRkdfSURfQ0xFQVJfQUZURVJfUkVBRCB9LCB7IC5uYW1lID0gImVuYWJsZV9sb2ciLCAudmFsID0gQkNNT0xUX0xPR0dFUl9DRkdfSURfRU5BQkxFX0xPRyB9LCB7IC5uYW1lID0gImxvZ19uYW1lcyIsIC52YWwgPSBCQ01PTFRfTE9HR0VSX0NGR19JRF9MT0dfTkFNRVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dnZXJfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfbG9nZ2VyX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBsb2dnZXJfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dnZXJfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2xvZ2dlcl9jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbG9nZ2VyX2NsZWFyX2xvZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dnZXJfY2xlYXJfbG9nX2lkID0geyAubmFtZSA9ICJiY21vbHRfbG9nZ2VyX2NsZWFyX2xvZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBsb2dnZXJfY2xlYXJfbG9nIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dnZXJfY2xlYXJfbG9nX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X2xvZ2dlcl9jbGVhcl9sb2dfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbG9nZ2VyX2tleV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJyZXNlcnZlZCIsIC52YWwgPSBCQ01PTFRfTE9HR0VSX0tFWV9JRF9SRVNFUlZFRCB9LCB7IC5uYW1lID0gImZpbGVfaWQiLCAudmFsID0gQkNNT0xUX0xPR0dFUl9LRVlfSURfRklMRV9JRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ2dlcl9rZXlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9sb2dnZXJfa2V5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGxvZ2dlcl9rZXkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2xvZ2dlcl9rZXlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbG9nZ2VyX2tleV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXQiLCAudmFsID0gQkNNT0xUX0xPR0dFUl9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIGxvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC52YWwgPSBCQ01PTFRfTE9HR0VSX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJjZmciLCAudmFsID0gQkNNT0xUX0xPR0dFUl9TVEFUX0NGR19JRF9DRkcgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dnZXJfc3RhdF9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9sb2dnZXJfc3RhdF9jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgbG9nZ2VyX3N0YXRfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dnZXJfc3RhdF9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X2xvZ2dlcl9zdGF0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImxpbmVzX2luX2xvZyIsIC52YWwgPSBCQ01PTFRfTE9HR0VSX1NUQVRfSURfTElORVNfSU5fTE9HIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbG9nZ2VyX3N0YXRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9sb2dnZXJfc3RhdF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBsb2dnZXJfc3RhdCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nZ2VyX3N0YXRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbG9nZ2VyX3N0YXRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbWFjX3RhYmxlX21pc3NfZmFsbGJhY2tfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZHJvcCIsIC52YWwgPSBCQ01PTFRfTUFDX1RBQkxFX01JU1NfRkFMTEJBQ0tfRFJPUCB9LCB7IC5uYW1lID0gImRlZmF1bHRfZmxvdyIsIC52YWwgPSBCQ01PTFRfTUFDX1RBQkxFX01JU1NfRkFMTEJBQ0tfREVGQVVMVF9GTE9XIH0sIHsgLm5hbWUgPSAidmlkIiwgLnZhbCA9IEJDTU9MVF9NQUNfVEFCTEVfTUlTU19GQUxMQkFDS19WSUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9tYWNfdGFibGVfbWlzc19mYWxsYmFjayA9IHsgLm5hbWUgPSAiYmNtb2x0X21hY190YWJsZV9taXNzX2ZhbGxiYWNrIiwgLmRlc2NyID0gIk1BQyB0YWJsZSBtaXNzIGZhbGxiYWNrIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X21hY190YWJsZV9taXNzX2ZhbGxiYWNrKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X21hY190YWJsZV9taXNzX2ZhbGxiYWNrX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X21hY190YWJsZV9sZWFybmluZ19tb2RlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm5vcm1hbCIsIC52YWwgPSBCQ01PTFRfTUFDX1RBQkxFX0xFQVJOSU5HX01PREVfTk9STUFMIH0sIHsgLm5hbWUgPSAibW92ZSIsIC52YWwgPSBCQ01PTFRfTUFDX1RBQkxFX0xFQVJOSU5HX01PREVfTU9WRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X21hY190YWJsZV9sZWFybmluZ19tb2RlID0geyAubmFtZSA9ICJiY21vbHRfbWFjX3RhYmxlX2xlYXJuaW5nX21vZGUiLCAuZGVzY3IgPSAiTUFDIHRhYmxlIExlYXJuaW5nIG1vZGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbWFjX3RhYmxlX2xlYXJuaW5nX21vZGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbWFjX3RhYmxlX2xlYXJuaW5nX21vZGVfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X21hY190YWJsZV9jb25maWd1cmF0aW9uX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm1pc3NfZmFsbGJhY2siLCAuZGVzY3IgPSAiQmVoYXZpb3IgZm9yIGRvd25zdHJlYW0gdHJhZmZpYyB3aGVuIE1BQyB0YWJsZSBsb29rdXAgZmFpbHMuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9tYWNfdGFibGVfY29uZmlndXJhdGlvbiwgbWlzc19mYWxsYmFjayksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X21hY190YWJsZV9taXNzX2ZhbGxiYWNrIH0sIHsgLm5hbWUgPSAiZGVmYXVsdF9mbG93X2lkIiwgLmRlc2NyID0gIkZsb3cgSUQgYXNzaWduZWQgdG8gdXBzdHJlYW0gdHJhZmZpYyBvbiBhIE1BQyB0YWJsZSBtaXNzIGlmIG1pc3NfZmFsbGJhY2sgaXMgc2V0IHRvIGRlZmF1bHRfZmxvdy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X21hY190YWJsZV9jb25maWd1cmF0aW9uLCBkZWZhdWx0X2Zsb3dfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiYWdpbmdfdGltZSIsIC5kZXNjciA9ICJBZ2luZyB0aW1lIGluIHNlY29uZHMuICBJZiBubyB0cmFmZmljIGlzIHNlZW4gZm9yIGEgZ2l2ZW4gTUFDIGFkZHJlc3MgLyBWSUQgZm9yIHRoaXMgbGVuZ3RoIG9mIHRpbWUsIHRoZSBlbnRyeSB3aWxsIGFnZSBhbmQgdGhlIGhvc3Qgd2lsbCBiZSBub3RpZmllZCB2aWEgaW5kaWNhdGlvbi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X21hY190YWJsZV9jb25maWd1cmF0aW9uLCBhZ2luZ190aW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImxlYXJuaW5nX21vZGUiLCAuZGVzY3IgPSAiTGVhcm5pbmcgdGFibGUgbW9kZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X21hY190YWJsZV9jb25maWd1cmF0aW9uLCBsZWFybmluZ19tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbWFjX3RhYmxlX2xlYXJuaW5nX21vZGUgfSwgeyAubmFtZSA9ICJhdXRvbWF0aWNfbWFjX2xlYXJuaW5nIiwgLmRlc2NyID0gIklmIGVuYWJsZWQsIG5ldyBNQUMgdGFibGUgZW50cmllcyBhcmUgYWRkZWQgYXV0b21hdGljYWxseSB0aGUgZmlyc3QgdGltZSBhIG5ldyBNQUMgYWRkcmVzcy9WSUQgY29tYmluYXRpb24gaXMgc2Vlbi4gIElmIGRpc2FibGVkLCBubyBhY3Rpb25zIGFyZSB0YWtlbiBhdXRvbWF0aWNhbGx5IGV4Y2VwdCBub3RpZnlpbmcgdGhlIGhvc3QgdmlhIGluZGljYXRpb24uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9tYWNfdGFibGVfY29uZmlndXJhdGlvbiwgYXV0b21hdGljX21hY19sZWFybmluZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfSwgeyAubmFtZSA9ICJhdXRvbWF0aWNfbWFjX2FnaW5nIiwgLmRlc2NyID0gIklmIGVuYWJsZWQsIE1BQyB0YWJsZSBlbnRyaWVzIGFyZSBkZWxldGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGV5IGFnZS4gIElmIGRpc2FibGVkLCBubyBhY3Rpb25zIGFyZSB0YWtlbiBhdXRvbWF0aWNhbGx5IGV4Y2VwdCBub3RpZnlpbmcgdGhlIGhvc3QgdmlhIGluZGljYXRpb24uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9tYWNfdGFibGVfY29uZmlndXJhdGlvbiwgYXV0b21hdGljX21hY19hZ2luZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfSwgeyAubmFtZSA9ICJhdXRvbWF0aWNfbWFjX21vdmUiLCAuZGVzY3IgPSAiT25seSBhcHBsaWNhYmxlIGlmIGxlYXJuaW5nX21vZGUgaXMgbW92ZS4gIElmIGVuYWJsZWQsIE1BQyB0YWJsZSBlbnRyaWVzIGFyZSBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgd2hlbiBhIE1BQyBtb3ZlIGNvbmRpdGlvbiBpcyBlbmNvdW50ZXJlZC4gIElmIGRpc2FibGVkLCBubyBhY3Rpb25zIGFyZSB0YWtlbiBhdXRvbWF0aWNhbGx5IGV4Y2VwdCBub3RpZnlpbmcgdGhlIGhvc3QgdmlhIGluZGljYXRpb24uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9tYWNfdGFibGVfY29uZmlndXJhdGlvbiwgYXV0b21hdGljX21hY19tb3ZlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY29udHJvbF9zdGF0ZSB9LCB7IC5uYW1lID0gImF1dG9tYXRpY19zdGF0aWNfbW9kZSIsIC5kZXNjciA9ICJJZiBlbmFibGVkLCBhbGwgTUFDIGVudHJpZXMgdGhhdCBhcmUgYWRkZWQgYXV0b21hdGljYWxseSB2aWEgYXV0b21hdGljX21hY19sZWFybmluZyBhbmQgYXV0b21hdGljX21hY19tb3ZlIHdpbGwgYmUgdHJlYXRlZCBhcyBzdGF0aWMgKG5vdCBhZ2luZykuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9tYWNfdGFibGVfY29uZmlndXJhdGlvbiwgYXV0b21hdGljX3N0YXRpY19tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24gPSB7IC5uYW1lID0gImJjbW9sdF9tYWNfdGFibGVfY29uZmlndXJhdGlvbiIsIC5kZXNjciA9ICJNQUMgdGFibGUgY29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9tYWNfdGFibGVfY29uZmlndXJhdGlvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9tYWNfdGFibGVfY29uZmlndXJhdGlvbl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9tYWNfdGFibGVfY29uZmlndXJhdGlvbl9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzIgPSB7IC5uYW1lID0gImJjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyIiwgLmRlc2NyID0gIlZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIE1hY0FkZHJlc3MiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9EWU4sIC54ID0geyAuYXJyX2R5biA9IHsgLmVsZW1fdHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX21hY19hZGRyZXNzLCAubGVuX3NpemUgPSA0LCAubWF4X3NpemUgPSBERUZBVUxUX0RZTl9BUlJfTUFYX1NJWkUgLyBzaXplb2YoYmNtb3NfbWFjX2FkZHJlc3MpIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyX21heF8yMDQ4ID0geyAubmFtZSA9ICJiY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9tYXhfMjA0OCIsIC5kZXNjciA9ICJWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiBNYWNBZGRyZXNzIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfbWF4XzIwNDgpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRFlOLCAueCA9IHsgLmFycl9keW4gPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19tYWNfYWRkcmVzcywgLmxlbl9zaXplID0gNCwgLm1heF9zaXplID0gMjA0OCB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbWFwcGluZ190YWdfbWV0aG9kX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm91dGVyX3ZpZCIsIC52YWwgPSBCQ01PTFRfTUFQUElOR19UQUdfTUVUSE9EX09VVEVSX1ZJRCB9LCB7IC5uYW1lID0gImlubmVyX3ZpZCIsIC52YWwgPSBCQ01PTFRfTUFQUElOR19UQUdfTUVUSE9EX0lOTkVSX1ZJRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X21hcHBpbmdfdGFnX21ldGhvZCA9IHsgLm5hbWUgPSAiYmNtb2x0X21hcHBpbmdfdGFnX21ldGhvZCIsIC5kZXNjciA9ICJNYXBwaW5nIHRhZyBtZXRob2QiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbWFwcGluZ190YWdfbWV0aG9kKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X21hcHBpbmdfdGFnX21ldGhvZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ubmlfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLnZhbCA9IEJDTU9MVF9OTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAudmFsID0gQkNNT0xUX05OSV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCB9LCB7IC5uYW1lID0gInN0YXR1c19jaGFuZ2VkIiwgLnZhbCA9IEJDTU9MVF9OTklfQVVUT19DRkdfSURfU1RBVFVTX0NIQU5HRUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfYXV0b19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ubmlfYXV0b19jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgbm5pX2F1dG9fY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfYXV0b19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbm5pX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X25uaV9jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicmVtb3RlX2xvb3BiYWNrIiwgLnZhbCA9IEJDTU9MVF9OTklfQ0ZHX0lEX1JFTU9URV9MT09QQkFDSyB9LCB7IC5uYW1lID0gImxpbmVfbG9vcGJhY2siLCAudmFsID0gQkNNT0xUX05OSV9DRkdfSURfTElORV9MT09QQkFDSyB9LCB7IC5uYW1lID0gIm1hY19hZGRyZXNzIiwgLnZhbCA9IEJDTU9MVF9OTklfQ0ZHX0lEX01BQ19BRERSRVNTIH0sIHsgLm5hbWUgPSAibm5pX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfTk5JX0NGR19JRF9OTklfU1RBVFVTIH0sIHsgLm5hbWUgPSAibm5pX2JhY2t1cF9zdGF0dXMiLCAudmFsID0gQkNNT0xUX05OSV9DRkdfSURfTk5JX0JBQ0tVUF9TVEFUVVMgfSwgeyAubmFtZSA9ICJhY3RpdmVfbm5pIiwgLnZhbCA9IEJDTU9MVF9OTklfQ0ZHX0lEX0FDVElWRV9OTkkgfSwgeyAubmFtZSA9ICJubmlfc3RhdHVzX3BvbGxpbmdfaW50ZXJ2YWxfbXMiLCAudmFsID0gQkNNT0xUX05OSV9DRkdfSURfTk5JX1NUQVRVU19QT0xMSU5HX0lOVEVSVkFMX01TIH0sIHsgLm5hbWUgPSAiYXV0b3N3aXRjaCIsIC52YWwgPSBCQ01PTFRfTk5JX0NGR19JRF9BVVRPU1dJVENIIH0sIHsgLm5hbWUgPSAiZmxvd19jb250cm9sIiwgLnZhbCA9IEJDTU9MVF9OTklfQ0ZHX0lEX0ZMT1dfQ09OVFJPTCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X25uaV9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ubmlfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIG5uaV9jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X25uaV9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbm5pX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ubmlfY29ubmVjdGlvbl9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwcmltYXJ5IiwgLnZhbCA9IEJDTU9MVF9OTklfQ09OTkVDVElPTl9QUklNQVJZIH0sIHsgLm5hbWUgPSAiYmFja3VwIiwgLnZhbCA9IEJDTU9MVF9OTklfQ09OTkVDVElPTl9CQUNLVVAgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfY29ubmVjdGlvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X25uaV9jb25uZWN0aW9uIiwgLmRlc2NyID0gIk5OSSBDb25uZWN0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X25uaV9jb25uZWN0aW9uKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X25uaV9jb25uZWN0aW9uX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X25uaV9rZXlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicG9uX25pIiwgLnZhbCA9IEJDTU9MVF9OTklfS0VZX0lEX1BPTl9OSSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X25uaV9rZXlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ubmlfa2V5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIG5uaV9rZXkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X25uaV9rZXlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbm5pX2tleV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF90cml2YWxlbnRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZmFsc2UiLCAudmFsID0gQkNNT0xUX1RSSVZBTEVOVF9GQUxTRSB9LCB7IC5uYW1lID0gInRydWUiLCAudmFsID0gQkNNT0xUX1RSSVZBTEVOVF9UUlVFIH0sIHsgLm5hbWUgPSAibm90X2FwcGxpY2FibGUiLCAudmFsID0gQkNNT0xUX1RSSVZBTEVOVF9OT1RfQVBQTElDQUJMRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3RyaXZhbGVudCA9IHsgLm5hbWUgPSAiYmNtb2x0X3RyaXZhbGVudCIsIC5kZXNjciA9ICJUcml2YWxlbnQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfdHJpdmFsZW50KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3RyaXZhbGVudF9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbm5pX2xpbmtfc3RhdHVzX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImxpbmtfc3RhdHVzIiwgLmRlc2NyID0gIlRoZSBsb2NhbCBhbmQgcmVtb3RlIHBhcnRuZXJzIGFyZSBhYmxlZCBhbmQgcmVhZHkgdG8gdHJhbnNtaXQvcmVjZWl2ZSB0cmFmZmljLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX2xpbmtfc3RhdHVzLCBsaW5rX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3RyaXZhbGVudCB9LCB7IC5uYW1lID0gInNpZ25hbF9kZXRlY3RlZCIsIC5kZXNjciA9ICJTZXJkZXMgY29udHJvbGxlciBoYXMgZGV0ZWN0ZWQgZW5lcmd5IG9uIHRoZSBsaW5lLiAgZGVidWdnaW5nIHB1cnBvc2UuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfbGlua19zdGF0dXMsIHNpZ25hbF9kZXRlY3RlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3RyaXZhbGVudCB9LCB7IC5uYW1lID0gInBtZF9sb2NrZWQiLCAuZGVzY3IgPSAiSW5kaWNhdGVzIFBNRCBsb2NrZWQuICBkZWJ1Z2dpbmcgcHVycG9zZS4gIElmIHRoaXMgaXMgdHJ1ZSwgYnV0IHRoZSBsaW5rcyBzdGF0dXMgaXMgbm90LCB0aGF0IG1lYW5zIHRoZSB0cmFuc2NlaXZlciBpcyBub3QgZW5hYmxlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9saW5rX3N0YXR1cywgcG1kX2xvY2tlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3RyaXZhbGVudCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X25uaV9saW5rX3N0YXR1cyA9IHsgLm5hbWUgPSAiYmNtb2x0X25uaV9saW5rX3N0YXR1cyIsIC5kZXNjciA9ICJOTkkgTGluayBTdGF0dXMiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbm5pX2xpbmtfc3RhdHVzKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X25uaV9saW5rX3N0YXR1c19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfbGlua19zdGF0dXNfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJyeF92Z2EiLCAudmFsID0gQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX1ZHQSB9LCB7IC5uYW1lID0gInJ4X3BmIiwgLnZhbCA9IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9QRiB9LCB7IC5uYW1lID0gInJ4X2xmcGYiLCAudmFsID0gQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0xGUEYgfSwgeyAubmFtZSA9ICJyeF9kZmUxIiwgLnZhbCA9IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9ERkUxIH0sIHsgLm5hbWUgPSAicnhfZGZlMiIsIC52YWwgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFMiB9LCB7IC5uYW1lID0gInJ4X2RmZTMiLCAudmFsID0gQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0RGRTMgfSwgeyAubmFtZSA9ICJyeF9kZmU0IiwgLnZhbCA9IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9ERkU0IH0sIHsgLm5hbWUgPSAicnhfZGZlNSIsIC52YWwgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFNSB9LCB7IC5uYW1lID0gInR4X3ByZSIsIC52YWwgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfUFJFIH0sIHsgLm5hbWUgPSAidHhfbWFpbiIsIC52YWwgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfTUFJTiB9LCB7IC5uYW1lID0gInR4X3Bvc3QxIiwgLnZhbCA9IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QT1NUMSB9LCB7IC5uYW1lID0gInR4X3Bvc3QyIiwgLnZhbCA9IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QT1NUMiB9LCB7IC5uYW1lID0gInR4X3Bvc3QzIiwgLnZhbCA9IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QT1NUMyB9LCB7IC5uYW1lID0gInR4X2FtcCIsIC52YWwgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfQU1QIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbm5pX3NlcmRlc19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ubmlfc2VyZGVzX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBubmlfc2VyZGVzX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbm5pX3NlcmRlc19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbm5pX3NlcmRlc19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbm5pX3NlcmRlc19rZXlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicG9uX25pIiwgLnZhbCA9IEJDTU9MVF9OTklfU0VSREVTX0tFWV9JRF9QT05fTkkgfSwgeyAubmFtZSA9ICJpbnN0YW5jZSIsIC52YWwgPSBCQ01PTFRfTk5JX1NFUkRFU19LRVlfSURfSU5TVEFOQ0UgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfc2VyZGVzX2tleV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X25uaV9zZXJkZXNfa2V5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIG5uaV9zZXJkZXNfa2V5IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfc2VyZGVzX2tleV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ubmlfc2VyZGVzX2tleV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXQiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIG5uaV9zdGF0X2FsYXJtX2NsZWFyZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgbm5pX3N0YXRfYWxhcm1fcmFpc2VkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X25uaV9zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJjZmciLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0NGR19JRF9DRkcgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfc3RhdF9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ubmlfc3RhdF9jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgbm5pX3N0YXRfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfc3RhdF9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbm5pX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X25uaV9zdGF0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInJ4X2ZyYW1lc182NCIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzY0IH0sIHsgLm5hbWUgPSAicnhfZnJhbWVzXzY1XzEyNyIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzY1XzEyNyB9LCB7IC5uYW1lID0gInJ4X2ZyYW1lc18xMjhfMjU1IiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfMTI4XzI1NSB9LCB7IC5uYW1lID0gInJ4X2ZyYW1lc18yNTZfNTExIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfMjU2XzUxMSB9LCB7IC5uYW1lID0gInJ4X2ZyYW1lc181MTJfMTAyMyIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzUxMl8xMDIzIH0sIHsgLm5hbWUgPSAicnhfZnJhbWVzXzEwMjRfMTUxOCIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzEwMjRfMTUxOCB9LCB7IC5uYW1lID0gInJ4X2ZyYW1lc18xNTE5XzIwNDciLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU18xNTE5XzIwNDcgfSwgeyAubmFtZSA9ICJyeF9mcmFtZXNfMjA0OF80MDk1IiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfMjA0OF80MDk1IH0sIHsgLm5hbWUgPSAicnhfZnJhbWVzXzQwOTZfOTIxNiIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzQwOTZfOTIxNiB9LCB7IC5uYW1lID0gInJ4X2ZyYW1lc185MjE3XzE2MzgzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfOTIxN18xNjM4MyB9LCB7IC5uYW1lID0gInJ4X2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTIH0sIHsgLm5hbWUgPSAicnhfYnl0ZXMiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX0JZVEVTIH0sIHsgLm5hbWUgPSAicnhfZ29vZF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX0dPT0RfRlJBTUVTIH0sIHsgLm5hbWUgPSAicnhfdW5pY2FzdF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX1VOSUNBU1RfRlJBTUVTIH0sIHsgLm5hbWUgPSAicnhfbXVsdGljYXN0X2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfTVVMVElDQVNUX0ZSQU1FUyB9LCB7IC5uYW1lID0gInJ4X2Jyb2FkY2FzdF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX0JST0FEQ0FTVF9GUkFNRVMgfSwgeyAubmFtZSA9ICJyeF9mY3NfZXJyb3JzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GQ1NfRVJST1JTIH0sIHsgLm5hbWUgPSAicnhfY29udHJvbF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX0NPTlRST0xfRlJBTUVTIH0sIHsgLm5hbWUgPSAicnhfcGF1c2VfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9QQVVTRV9GUkFNRVMgfSwgeyAubmFtZSA9ICJyeF9wZmNfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9QRkNfRlJBTUVTIH0sIHsgLm5hbWUgPSAicnhfdW5zdXBwb3J0ZWRfb3Bjb2RlIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTlNVUFBPUlRFRF9PUENPREUgfSwgeyAubmFtZSA9ICJyeF91bnN1cHBvcnRlZF9kYSIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVU5TVVBQT1JURURfREEgfSwgeyAubmFtZSA9ICJyeF9hbGlnbm1lbnRfZXJyb3JzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9BTElHTk1FTlRfRVJST1JTIH0sIHsgLm5hbWUgPSAicnhfbGVuZ3RoX291dF9vZl9yYW5nZSIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfTEVOR1RIX09VVF9PRl9SQU5HRSB9LCB7IC5uYW1lID0gInJ4X2NvZGVfZXJyb3JzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9DT0RFX0VSUk9SUyB9LCB7IC5uYW1lID0gInJ4X292ZXJzaXplZF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX09WRVJTSVpFRF9GUkFNRVMgfSwgeyAubmFtZSA9ICJyeF9qYWJiZXJfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9KQUJCRVJfRlJBTUVTIH0sIHsgLm5hbWUgPSAicnhfbXR1X2NoZWNrX2Vycm9ycyIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfTVRVX0NIRUNLX0VSUk9SUyB9LCB7IC5uYW1lID0gInJ4X3Byb21pc2N1b3VzX2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfUFJPTUlTQ1VPVVNfRlJBTUVTIH0sIHsgLm5hbWUgPSAicnhfdmxhbl9mcmFtZXMiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX1ZMQU5fRlJBTUVTIH0sIHsgLm5hbWUgPSAicnhfZG91YmxlX3ZsYW5fZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9ET1VCTEVfVkxBTl9GUkFNRVMgfSwgeyAubmFtZSA9ICJyeF90cnVuY2F0ZWRfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9UUlVOQ0FURURfRlJBTUVTIH0sIHsgLm5hbWUgPSAicnhfdW5kZXJzaXplX2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfVU5ERVJTSVpFX0ZSQU1FUyB9LCB7IC5uYW1lID0gInJ4X2ZyYWdtZW50ZWRfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFHTUVOVEVEX0ZSQU1FUyB9LCB7IC5uYW1lID0gInJ4X3J1bnRfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9SVU5UX0ZSQU1FUyB9LCB7IC5uYW1lID0gInR4X2ZyYW1lc182NCIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzY0IH0sIHsgLm5hbWUgPSAidHhfZnJhbWVzXzY1XzEyNyIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzY1XzEyNyB9LCB7IC5uYW1lID0gInR4X2ZyYW1lc18xMjhfMjU1IiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMTI4XzI1NSB9LCB7IC5uYW1lID0gInR4X2ZyYW1lc18yNTZfNTExIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMjU2XzUxMSB9LCB7IC5uYW1lID0gInR4X2ZyYW1lc181MTJfMTAyMyIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzUxMl8xMDIzIH0sIHsgLm5hbWUgPSAidHhfZnJhbWVzXzEwMjRfMTUxOCIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzEwMjRfMTUxOCB9LCB7IC5uYW1lID0gInR4X2ZyYW1lc18xNTE5XzIwNDciLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18xNTE5XzIwNDcgfSwgeyAubmFtZSA9ICJ0eF9mcmFtZXNfMjA0OF80MDk1IiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMjA0OF80MDk1IH0sIHsgLm5hbWUgPSAidHhfZnJhbWVzXzQwOTZfOTIxNiIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzQwOTZfOTIxNiB9LCB7IC5uYW1lID0gInR4X2ZyYW1lc185MjE3XzE2MzgzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfOTIxN18xNjM4MyB9LCB7IC5uYW1lID0gInR4X2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTIH0sIHsgLm5hbWUgPSAidHhfYnl0ZXMiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX0JZVEVTIH0sIHsgLm5hbWUgPSAidHhfZ29vZF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX0dPT0RfRlJBTUVTIH0sIHsgLm5hbWUgPSAidHhfdW5pY2FzdF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX1VOSUNBU1RfRlJBTUVTIH0sIHsgLm5hbWUgPSAidHhfbXVsdGljYXN0X2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfTVVMVElDQVNUX0ZSQU1FUyB9LCB7IC5uYW1lID0gInR4X2Jyb2FkY2FzdF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX0JST0FEQ0FTVF9GUkFNRVMgfSwgeyAubmFtZSA9ICJ0eF9wYXVzZV9mcmFtZXMiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX1BBVVNFX0ZSQU1FUyB9LCB7IC5uYW1lID0gInR4X3BmY19mcmFtZXMiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX1BGQ19GUkFNRVMgfSwgeyAubmFtZSA9ICJ0eF9qYWJiZXJfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9KQUJCRVJfRlJBTUVTIH0sIHsgLm5hbWUgPSAidHhfZmNzX2Vycm9ycyIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRkNTX0VSUk9SUyB9LCB7IC5uYW1lID0gInR4X2NvbnRyb2xfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9DT05UUk9MX0ZSQU1FUyB9LCB7IC5uYW1lID0gInR4X292ZXJzaXplX2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfT1ZFUlNJWkVfRlJBTUVTIH0sIHsgLm5hbWUgPSAidHhfZnJhZ21lbnRlZF9mcmFtZXMiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQUdNRU5URURfRlJBTUVTIH0sIHsgLm5hbWUgPSAidHhfZXJyb3JfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9FUlJPUl9GUkFNRVMgfSwgeyAubmFtZSA9ICJ0eF92bGFuX2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfVkxBTl9GUkFNRVMgfSwgeyAubmFtZSA9ICJ0eF9kb3VibGVfdmxhbl9mcmFtZXMiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX0RPVUJMRV9WTEFOX0ZSQU1FUyB9LCB7IC5uYW1lID0gInR4X3J1bnRfZnJhbWVzIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9SVU5UX0ZSQU1FUyB9LCB7IC5uYW1lID0gInR4X3VuZGVycnVuX2ZyYW1lcyIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfVU5ERVJSVU5fRlJBTUVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbm5pX3N0YXRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF9ubmlfc3RhdF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBubmlfc3RhdCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbm5pX3N0YXRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfbm5pX3N0YXRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm5ld19zdGF0dXMiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUVVNfQ0hBTkdFRF9JRF9ORVdfU1RBVFVTIH0sIHsgLm5hbWUgPSAibGluayIsIC52YWwgPSBCQ01PTFRfTk5JX1NUQVRVU19DSEFOR0VEX0lEX0xJTksgfSwgeyAubmFtZSA9ICJwcmV2aW91c19hY3RpdmUiLCAudmFsID0gQkNNT0xUX05OSV9TVEFUVVNfQ0hBTkdFRF9JRF9QUkVWSU9VU19BQ1RJVkUgfSwgeyAubmFtZSA9ICJuZXdfYWN0aXZlIiwgLnZhbCA9IEJDTU9MVF9OTklfU1RBVFVTX0NIQU5HRURfSURfTkVXX0FDVElWRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBubmlfc3RhdHVzX2NoYW5nZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X29hbV9oZWFydGJlYXRfY29uZmlnX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInNlbmRfcGVyaW9kIiwgLmRlc2NyID0gIlRoZSBwZXJpb2QgYXQgd2hpY2ggdG8gc2VuZCBPQU0gaW5mbyBmcmFtZXMsIGFuZCBleHBlY3QgaW5mbyByZXNwb25zZXMgb24gdGhpcyBsaW5rIChpbiBzZWNvbmRzKS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X29hbV9oZWFydGJlYXRfY29uZmlnLCBzZW5kX3BlcmlvZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJ0cmFuc21pdF9mcmFtZSIsIC5kZXNjciA9ICJUcmFuc21pdCBmcmFtZSBvY3RldHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X29hbV9oZWFydGJlYXRfY29uZmlnLCB0cmFuc21pdF9mcmFtZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3U4X2xpc3RfdTE2IH0sIHsgLm5hbWUgPSAiaWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlIiwgLmRlc2NyID0gIklnbm9yZWQgcmVjZWl2ZSBmcmFtZSB0ZW1wbGF0ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfb2FtX2hlYXJ0YmVhdF9jb25maWcsIGlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2V0aGVybmV0X2ZyYW1lX21hc2tlZCB9LCB7IC5uYW1lID0gInJlY2VpdmVfdGltZW91dCIsIC5kZXNjciA9ICJUaGUgdGltZSAoaW4gc2Vjb25kcykgdG8gcmVwb3J0IE9BTSB0aW1lb3V0IGFmdGVyIHRoZSBsYXN0IHJlY2VpdmVkIE9BTSBmcmFtZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X29hbV9oZWFydGJlYXRfY29uZmlnLCByZWNlaXZlX3RpbWVvdXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAibWF4aW11bV9yZWNlaXZlX3NpemUiLCAuZGVzY3IgPSAiTWF4aW11bSBzaXplIG9mIHJlY2VpdmVkIGZyYW1lcy4gIFNldHRpbmcgdGhpcyB2YWx1ZSB0byB6ZXJvIHdpbGwgY2F1c2UgYWxsIE9BTSBmcmFtZXMgdG8gYmUgZHJvcHBlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X29hbV9oZWFydGJlYXRfY29uZmlnLCBtYXhpbXVtX3JlY2VpdmVfc2l6ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9vYW1faGVhcnRiZWF0X2NvbmZpZyA9IHsgLm5hbWUgPSAiYmNtb2x0X29hbV9oZWFydGJlYXRfY29uZmlnIiwgLmRlc2NyID0gIk9BTSBoZWFydGJlYXQgY29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9vYW1faGVhcnRiZWF0X2NvbmZpZyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9vYW1faGVhcnRiZWF0X2NvbmZpZ19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9vYW1faGVhcnRiZWF0X2NvbmZpZ19maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X29kbl9jbGFzc19zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJuMSIsIC52YWwgPSBCQ01PTFRfT0ROX0NMQVNTX04xIH0sIHsgLm5hbWUgPSAibjIiLCAudmFsID0gQkNNT0xUX09ETl9DTEFTU19OMiB9LCB7IC5uYW1lID0gImUxIiwgLnZhbCA9IEJDTU9MVF9PRE5fQ0xBU1NfRTEgfSwgeyAubmFtZSA9ICJlMiIsIC52YWwgPSBCQ01PTFRfT0ROX0NMQVNTX0UyIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfb2RuX2NsYXNzID0geyAubmFtZSA9ICJiY21vbHRfb2RuX2NsYXNzIiwgLmRlc2NyID0gIk9ETiBDbGFzcyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9vZG5fY2xhc3MpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfb2RuX2NsYXNzX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X29tY2lfcG9ydF9pZF9vcGVyYXRpb25fc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiY29uZmlndXJlIiwgLnZhbCA9IEJDTU9MVF9PTUNJX1BPUlRfSURfT1BFUkFUSU9OX0NPTkZJR1VSRSB9LCB7IC5uYW1lID0gInJlbW92ZSIsIC52YWwgPSBCQ01PTFRfT01DSV9QT1JUX0lEX09QRVJBVElPTl9SRU1PVkUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9vbWNpX3BvcnRfaWRfb3BlcmF0aW9uID0geyAubmFtZSA9ICJiY21vbHRfb21jaV9wb3J0X2lkX29wZXJhdGlvbiIsIC5kZXNjciA9ICJPTUNJIFBvcnQgSUQgb3BlcmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X29tY2lfcG9ydF9pZF9vcGVyYXRpb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfb21jaV9wb3J0X2lkX29wZXJhdGlvbl9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9vbnVfb3BlcmF0aW9uX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImluYWN0aXZlIiwgLnZhbCA9IEJDTU9MVF9PTlVfT1BFUkFUSU9OX0lOQUNUSVZFIH0sIHsgLm5hbWUgPSAiYWN0aXZlIiwgLnZhbCA9IEJDTU9MVF9PTlVfT1BFUkFUSU9OX0FDVElWRSB9LCB7IC5uYW1lID0gImRpc2FibGUiLCAudmFsID0gQkNNT0xUX09OVV9PUEVSQVRJT05fRElTQUJMRSB9LCB7IC5uYW1lID0gImVuYWJsZSIsIC52YWwgPSBCQ01PTFRfT05VX09QRVJBVElPTl9FTkFCTEUgfSwgeyAubmFtZSA9ICJhY3RpdmVfc3RhbmRieSIsIC52YWwgPSBCQ01PTFRfT05VX09QRVJBVElPTl9BQ1RJVkVfU1RBTkRCWSB9LCB7IC5uYW1lID0gImF3YWtlX2ZyZWUiLCAudmFsID0gQkNNT0xUX09OVV9PUEVSQVRJT05fQVdBS0VfRlJFRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X29udV9vcGVyYXRpb24gPSB7IC5uYW1lID0gImJjbW9sdF9vbnVfb3BlcmF0aW9uIiwgLmRlc2NyID0gIk9OVSBvcGVyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfb251X29wZXJhdGlvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9vbnVfb3BlcmF0aW9uX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X29udV9wb3dlcl9sZXZlbF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJpbmNyZWFzZSIsIC52YWwgPSBCQ01PTFRfT05VX1BPV0VSX0xFVkVMX0lOQ1JFQVNFIH0sIHsgLm5hbWUgPSAiZGVjcmVhc2UiLCAudmFsID0gQkNNT0xUX09OVV9QT1dFUl9MRVZFTF9ERUNSRUFTRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X29udV9wb3dlcl9sZXZlbCA9IHsgLm5hbWUgPSAiYmNtb2x0X29udV9wb3dlcl9sZXZlbCIsIC5kZXNjciA9ICJPTlUgUG93ZXIgbGV2ZWwiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfb251X3Bvd2VyX2xldmVsKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X29udV9wb3dlcl9sZXZlbF9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbl9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJpbG93cG93ZXIiLCAuZGVzY3IgPSAiVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgYW55IE9OVSBvbiB0aGlzIE5JIG1heSBzcGVuZCBpbiBhIGxvdyBwb3dlciBzdGF0ZSBpbiB1bml0cyBvZiAxMjV1cy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X29udV9wb3dlcl9tYW5hZ2VtZW50X2NvbmZpZ3VyYXRpb24sIGlsb3dwb3dlciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJpYXdhcmUiLCAuZGVzY3IgPSAiVGhlIG1pbmltdW0gYW1vdW50IG9mIHRpbWUgZXZlcnkgT05VIG9uIGhpcyBOSSBtdXN0IHNwZW5kIGluIGFuIGF3YXJlIHN0YXRlIGluIHVuaXRzIG9mIDEyNXVzLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbiwgaWF3YXJlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gIml0cmFuc2luaXQiLCAuZGVzY3IgPSAiVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgcmVxdWlyZWQgYnkgYW55IE9OVSBvbiB0aGlzIE5JIHRvIHBvd2VyIHVwIGl0cyB0cmFuc21pdHRlciBvbmx5IGZyb20gYSBsb3cgcG93ZXIgc3RhdGUgaW4gdW5pdHMgb2YgMTI1dXMuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uLCBpdHJhbnNpbml0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gIml0eGluaXQiLCAuZGVzY3IgPSAiVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgcmVxdWlyZWQgYnkgYW55IE9OVSBvbiB0aGlzIE5JIHRvIHBvd2VyIHVwIGl0cyB0cmFuc2NlaXZlciAodHJhbnNtaXR0ZXIgKyByZWNlaXZlcikgZnJvbSBhIGxvdyBwb3dlciBzdGF0ZSBpbiB1bml0cyBvZiAxMjV1cy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X29udV9wb3dlcl9tYW5hZ2VtZW50X2NvbmZpZ3VyYXRpb24sIGl0eGluaXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiaXJ4b2ZmIiwgLmRlc2NyID0gIlRoZSBtYXhpbXVtIGFtb3VudCBvZiB0aW1lIGFueSBPTlUgb24gdGhpcyBOSSBtYXkgc3BlbmQgd2l0aCBpdHMgcmVjZWl2ZXIgZGlzYWJsZWQgaW4gdW5pdHMgb2YgMTI1dXMuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uLCBpcnhvZmYpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAibG93X3Bvd2VyX2Nsb2JpIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgbm9uLWNvbnRpZ3VvdXMgbWlzc2luZyBhbGxvY2F0aW9ucyB0byBhbGxvdyBiZWZvcmUgcmFpc2luZyB0aGUgTE9TaS9MT0ZpL0xPQmkgYWxhcm1zIG9uIGFueSBPTlUgb24gdGhpcyBOSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X29udV9wb3dlcl9tYW5hZ2VtZW50X2NvbmZpZ3VyYXRpb24sIGxvd19wb3dlcl9jbG9iaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uID0geyAubmFtZSA9ICJiY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbiIsIC5kZXNjciA9ICJDb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgZm9yIHRoZSBPTlUgcG93ZXIgbWFuYWdlbWVudCBmZWF0dXJlLiBUaGVzZSBzaG91bGQgbWF0Y2ggdGhlIHBhcmFtZXRlcnMgc2VudCB0byB0aGUgT05VIHZpYSBPTUNJLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X29udV9wb3dlcl9tYW5hZ2VtZW50X2NvbmZpZ3VyYXRpb25fZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbl9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9vbnVfdHVuaW5nX2NvbmZpZ3VyYXRpb25fZmllbGRzW10gPSB7IHsgLm5hbWUgPSAidHNvdXJjZSIsIC5kZXNjciA9ICJUc291cmNlIHRpbWVyIGluIG1zZWMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X29udV90dW5pbmdfY29uZmlndXJhdGlvbiwgdHNvdXJjZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJ0dGFyZ2V0IiwgLmRlc2NyID0gIlR0YXJnZXQgdGltZXIgaW4gbXNlYyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfb251X3R1bmluZ19jb25maWd1cmF0aW9uLCB0dGFyZ2V0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gInJlcXVlc3RfcmVnaXN0cmF0aW9uX3JlcXVpcmVkIiwgLmRlc2NyID0gImlzIHJlcXVlc3QgcmVnaXN0cmF0aW9uIHBhcnQgb2YgdGhlIHR1bmluZyBpbiBwcm9jZXNzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9vbnVfdHVuaW5nX2NvbmZpZ3VyYXRpb24sIHJlcXVlc3RfcmVnaXN0cmF0aW9uX3JlcXVpcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfb251X3R1bmluZ19jb25maWd1cmF0aW9uID0geyAubmFtZSA9ICJiY21vbHRfb251X3R1bmluZ19jb25maWd1cmF0aW9uIiwgLmRlc2NyID0gIm9udSB0dW5pbmcgY29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9vbnVfdHVuaW5nX2NvbmZpZ3VyYXRpb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfb251X3R1bmluZ19jb25maWd1cmF0aW9uX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X29udV90dW5pbmdfY29uZmlndXJhdGlvbl9maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3RjX3Byb3RvY29sX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInRjX2xheWVyX3Byb3RvY29sX2dfOTg3X3BfMyIsIC52YWwgPSBCQ01PTFRfVENfUFJPVE9DT0xfVENfTEFZRVJfUFJPVE9DT0xfR185ODdfUF8zIH0sIHsgLm5hbWUgPSAidGNfbGF5ZXJfcHJvdG9jb2xfZ185ODlfcF8zIiwgLnZhbCA9IEJDTU9MVF9UQ19QUk9UT0NPTF9UQ19MQVlFUl9QUk9UT0NPTF9HXzk4OV9QXzMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF90Y19wcm90b2NvbCA9IHsgLm5hbWUgPSAiYmNtb2x0X3RjX3Byb3RvY29sIiwgLmRlc2NyID0gIlRDIGxheWVyIHByb3RvY29sIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3RjX3Byb3RvY29sKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3RjX3Byb3RvY29sX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wb25faWRfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWRtaW5pc3RyYXRpdmVfbGFiZWwiLCAuZGVzY3IgPSAiTVNCIDI4IGJpdCBvZiB0aGUgUE9OIElEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9wb25faWQsIGFkbWluaXN0cmF0aXZlX2xhYmVsKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImR3bGNoX2lkIiwgLmRlc2NyID0gIkxTQiA0IGJpdHMgb2YgdGhlIFBPTiBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcG9uX2lkLCBkd2xjaF9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3Bvbl9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVzIHRoZSBUV0RNIGNoYW5uZWwgdGVybWluYXRpb24gd2l0aGluIGEgY2VydGFpbiBkb21haW4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcG9uX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9pZF9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9wb25faWRfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfb3BlcmF0aW9uX2NvbnRyb2xfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicmUiLCAuZGVzY3IgPSAiSW5kaWNhdGVzIHdoZXRoZXIgdGhlIFRyYW5zbWl0IE9wdGljYWwgTGV2ZWwgKFRPTCkgY29udGFpbnMgdGhlIGxhdW5jaCBwb3dlciBvZiB0aGUgT1RMIChSRT0wKSBvciBvZiBhIHJlYWNoIGV4dGVuZGVyIChSRT0xKSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfb3BlcmF0aW9uX2NvbnRyb2wsIHJlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAib2RuX2NsYXNzIiwgLmRlc2NyID0gIklkZW50aWZpZXMgdGhlIG5vbWluYWwgb3B0aWNhbCBwYXJhbWV0ZXJzIG9mIHRoZSB0cmFuc2NlaXZlciBhY2NvcmRpbmcgdG8gdGhlIE9ETiBPcHRpY2FsIFBhdGggTG9zcyAoT1BMKSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfb3BlcmF0aW9uX2NvbnRyb2wsIG9kbl9jbGFzcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X29kbl9jbGFzcyB9LCB7IC5uYW1lID0gImRzX2ZlY19tb2RlIiwgLmRlc2NyID0gIkVuYWJsZS9EaXNhYmxlIHRoZSBkb3duc3RyZWFtIEZFQy4gRGVmYXVsdCBpcyBFbmFibGUuIEF0dHJpYnV0ZSBjYW4gYmUgc2V0IG9ubHkgd2hlbiBQT04gTkkgc3RhdGUgaXMgSW5hY3RpdmUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9vcGVyYXRpb25fY29udHJvbCwgZHNfZmVjX21vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb250cm9sX3N0YXRlIH0sIHsgLm5hbWUgPSAicHJvdG9jb2wiLCAuZGVzY3IgPSAiV2hlbiBzeXN0ZW0gbW9kZSBpcyBOR1BPTjIsIHRoaXMgcGFyYW1ldGVyIEluZGljYXRlIHRoZSBUQyBsYXllciBwcm90b2NvbDogSVRVLVQgRy45ODkuMyBvciBJVFUtVCBHLjk4Ny4zIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9vcGVyYXRpb25fY29udHJvbCwgcHJvdG9jb2wpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF90Y19wcm90b2NvbCB9LCB7IC5uYW1lID0gImRzX2xpbmtfdHlwZSIsIC5kZXNjciA9ICJPcHRpY2FsIGxpbmsgdHlwZSAoVW5zcGVjaWZpZWQsIEEsIEIsIEJvdGgpIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9vcGVyYXRpb25fY29udHJvbCwgZHNfbGlua190eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbGlua190eXBlIH0sIHsgLm5hbWUgPSAicG9uX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXMgdGhlIFRXRE0gY2hhbm5lbCB0ZXJtaW5hdGlvbiB3aXRoaW4gYSBjZXJ0YWluIGRvbWFpbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfb3BlcmF0aW9uX2NvbnRyb2wsIHBvbl9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9pZCB9LCB7IC5uYW1lID0gImMiLCAuZGVzY3IgPSAiVHJhbnNtaXQgb3B0aWNhbCBsZXZlbCAoVE9MKSByZWZlcmVuY2UgcG9pbnQgaW5kaWNhdG9yOiBTL1ItQ0cgb3IgUy9SLUNQIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9vcGVyYXRpb25fY29udHJvbCwgYyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X29wZXJhdGlvbl9jb250cm9sID0geyAubmFtZSA9ICJiY21vbHRfb3BlcmF0aW9uX2NvbnRyb2wiLCAuZGVzY3IgPSAiT3BlcmF0aW9uIENvbnRyb2wiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfb3BlcmF0aW9uX2NvbnRyb2wpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfb3BlcmF0aW9uX2NvbnRyb2xfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfb3BlcmF0aW9uX2NvbnRyb2xfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9wYWNrZXRfaW5qZWN0aW9uX2Vycm9yX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImdlbV9wb3J0X25vdF9hY3RpdmUiLCAudmFsID0gQkNNT0xUX1BBQ0tFVF9JTkpFQ1RJT05fRVJST1JfR0VNX1BPUlRfTk9UX0FDVElWRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3BhY2tldF9pbmplY3Rpb25fZXJyb3IgPSB7IC5uYW1lID0gImJjbW9sdF9wYWNrZXRfaW5qZWN0aW9uX2Vycm9yIiwgLmRlc2NyID0gIlBhY2tldCBJbmplY3Rpb24gRXJyb3IiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcGFja2V0X2luamVjdGlvbl9lcnJvciksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9wYWNrZXRfaW5qZWN0aW9uX2Vycm9yX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3BhY2tldF90eXBlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNwdSIsIC52YWwgPSBCQ01PTFRfUEFDS0VUX1RZUEVfQ1BVIH0sIHsgLm5hbWUgPSAib21jaSIsIC52YWwgPSBCQ01PTFRfUEFDS0VUX1RZUEVfT01DSSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3BhY2tldF90eXBlID0geyAubmFtZSA9ICJiY21vbHRfcGFja2V0X3R5cGUiLCAuZGVzY3IgPSAicGFja2V0IHR5cGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcGFja2V0X3R5cGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfcGFja2V0X3R5cGVfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fZmFpbF9yZWFzb25fc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibm9uZSIsIC52YWwgPSBCQ01PTFRfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fRkFJTF9SRUFTT05fTk9ORSB9LCB7IC5uYW1lID0gInBhc3N3b3JkX2luY29uc2lzdGVuY3kiLCAudmFsID0gQkNNT0xUX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0ZBSUxfUkVBU09OX1BBU1NXT1JEX0lOQ09OU0lTVEVOQ1kgfSwgeyAubmFtZSA9ICJwYXNzd29yZF9taXNtYXRjaCIsIC52YWwgPSBCQ01PTFRfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fRkFJTF9SRUFTT05fUEFTU1dPUkRfTUlTTUFUQ0ggfSwgeyAubmFtZSA9ICJwYXNzd29yZF9hdXRoZW50aWNhdGlvbl90aW1lb3V0IiwgLnZhbCA9IEJDTU9MVF9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9GQUlMX1JFQVNPTl9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9USU1FT1VUIH0sIHsgLm5hbWUgPSAib251X2FsYXJtIiwgLnZhbCA9IEJDTU9MVF9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9GQUlMX1JFQVNPTl9PTlVfQUxBUk0gfSwgeyAubmFtZSA9ICJsb3NfZXZlbnQiLCAudmFsID0gQkNNT0xUX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0ZBSUxfUkVBU09OX0xPU19FVkVOVCB9LCB7IC5uYW1lID0gImRpc2FibGVfZXZlbnQiLCAudmFsID0gQkNNT0xUX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0ZBSUxfUkVBU09OX0RJU0FCTEVfRVZFTlQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9mYWlsX3JlYXNvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2ZhaWxfcmVhc29uIiwgLmRlc2NyID0gIlBhc3N3b3JkIGF1dGhlbnRpY2F0aW9uIGZhaWwgcmVhc29uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2ZhaWxfcmVhc29uKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2ZhaWxfcmVhc29uX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImludGVydmFsIiwgLmRlc2NyID0gImludGVydmFsIGluIG1zIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nLCBpbnRlcnZhbCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJjb250cm9sIiwgLmRlc2NyID0gImNvbnRyb2wiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcsIGNvbnRyb2wpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb250cm9sX3N0YXRlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyA9IHsgLm5hbWUgPSAiYmNtb2x0X3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmciLCAuZGVzY3IgPSAiUGVyaW9kaWMgU3RhbmRieSBQT04gbW9uaXRvcmluZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZ19maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3BvbGFyaXR5X3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImxvdyIsIC52YWwgPSBCQ01PTFRfUE9MQVJJVFlfTE9XIH0sIHsgLm5hbWUgPSAiaGlnaCIsIC52YWwgPSBCQ01PTFRfUE9MQVJJVFlfSElHSCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3BvbGFyaXR5ID0geyAubmFtZSA9ICJiY21vbHRfcG9sYXJpdHkiLCAuZGVzY3IgPSAiUG9sYXJpdHkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcG9sYXJpdHkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfcG9sYXJpdHlfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcG9sbGluZ19pbnRlcnZhbF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwb2xsaW5nX2Rpc2FibGVkIiwgLnZhbCA9IEJDTU9MVF9QT0xMSU5HX0lOVEVSVkFMX1BPTExJTkdfRElTQUJMRUQgfSwgeyAubmFtZSA9ICJ1c181MDAiLCAudmFsID0gQkNNT0xUX1BPTExJTkdfSU5URVJWQUxfVVNfNTAwIH0sIHsgLm5hbWUgPSAibXNfMSIsIC52YWwgPSBCQ01PTFRfUE9MTElOR19JTlRFUlZBTF9NU18xIH0sIHsgLm5hbWUgPSAibXNfMiIsIC52YWwgPSBCQ01PTFRfUE9MTElOR19JTlRFUlZBTF9NU18yIH0sIHsgLm5hbWUgPSAibXNfNCIsIC52YWwgPSBCQ01PTFRfUE9MTElOR19JTlRFUlZBTF9NU180IH0sIHsgLm5hbWUgPSAibXNfOCIsIC52YWwgPSBCQ01PTFRfUE9MTElOR19JTlRFUlZBTF9NU184IH0sIHsgLm5hbWUgPSAibXNfMTYiLCAudmFsID0gQkNNT0xUX1BPTExJTkdfSU5URVJWQUxfTVNfMTYgfSwgeyAubmFtZSA9ICJhdXRvbWF0aWMiLCAudmFsID0gQkNNT0xUX1BPTExJTkdfSU5URVJWQUxfQVVUT01BVElDIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcG9sbGluZ19pbnRlcnZhbCA9IHsgLm5hbWUgPSAiYmNtb2x0X3BvbGxpbmdfaW50ZXJ2YWwiLCAuZGVzY3IgPSAiUG9sbGluZyBJbnRlcnZhbCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9wb2xsaW5nX2ludGVydmFsKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3BvbGxpbmdfaW50ZXJ2YWxfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9hZ2dyZWdhdGVfc2hhcGVyX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImJhbmR3aWR0aF9rYnBzIiwgLmRlc2NyID0gIlJhdGUgaW4ga2JwcywgMCBpcyBkaXNhYmxlZCwgSWYgcmF0ZSBpcyA+MUcgdGhlbiB1c2UgMjU2a2JwcyBpbmNyZW1lbnRzLCBpZiByYXRlIGlzIDwgMUcgdGhlbiB1c2UgNjRrYnBzIGluY3JlbWVudHMuICIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcG9uX2FnZ3JlZ2F0ZV9zaGFwZXIsIGJhbmR3aWR0aF9rYnBzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gIm1ic19rQiIsIC5kZXNjciA9ICJNYXhpbXVtIEJ1cnN0IFNpemUgaW4gS0IgOiByYW5nZSBpcyAyS0IgdG8gNE1CIGluIDFLQiBpbmNyZW1lbnRzLiAiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Bvbl9hZ2dyZWdhdGVfc2hhcGVyLCBtYnNfa0IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcG9uX2FnZ3JlZ2F0ZV9zaGFwZXIgPSB7IC5uYW1lID0gImJjbW9sdF9wb25fYWdncmVnYXRlX3NoYXBlciIsIC5kZXNjciA9ICJQb3J0IExldmVsIFNoYXBlciBDb25maWd1cmF0aW9uOiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9wb25fYWdncmVnYXRlX3NoYXBlciksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9wb25fYWdncmVnYXRlX3NoYXBlcl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9wb25fYWdncmVnYXRlX3NoYXBlcl9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wb25fYWxsb2Nfc2xhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImNicl9ydF9idyIsIC5kZXNjciA9ICJDQlIgUmVhbCBUaW1lIEJhbmR3aWR0aCB3aGljaCByZXF1aXJlIHNoYXBpbmcgb2YgdGhlIGJhbmR3aWR0aCBhbGxvY2F0aW9ucyBpbiBhIGZpbmUgZ3JhbnVsYXJpdHkuICIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcG9uX2FsbG9jX3NsYSwgY2JyX3J0X2J3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImNicl9ucnRfYnciLCAuZGVzY3IgPSAiRml4ZWQgQmFuZHdpZHRoIHdpdGggbm8gY3JpdGljYWwgcmVxdWlyZW1lbnQgb2Ygc2hhcGluZyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcG9uX2FsbG9jX3NsYSwgY2JyX25ydF9idyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJndWFyYW50ZWVkX2J3IiwgLmRlc2NyID0gIkR5bmFtaWMgYmFuZHdpZHRoIHdoaWNoIHRoZSBPTFQgaXMgY29tbWl0dGVkIHRvIGFsbG9jYXRlIHVwb24gZGVtYW5kIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9wb25fYWxsb2Nfc2xhLCBndWFyYW50ZWVkX2J3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gIm1heGltdW1fYnciLCAuZGVzY3IgPSAiTWF4aW11bSBhbGxvY2F0ZWQgYmFuZHdpZHRoIGFsbG93ZWQgZm9yIHRoaXMgYWxsb2MgSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Bvbl9hbGxvY19zbGEsIG1heGltdW1fYncpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiYWRkaXRpb25hbF9id19lbGlnaWJpbGl0eSIsIC5kZXNjciA9ICJBbGxvYyBJRCBhZGRpdGlvbmFsIEJXIGVsaWdpYmlsaXR5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9wb25fYWxsb2Nfc2xhLCBhZGRpdGlvbmFsX2J3X2VsaWdpYmlsaXR5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYWRkaXRpb25hbF9id19lbGlnaWJpbGl0eSB9LCB7IC5uYW1lID0gImNicl9ydF9jb21wZW5zYXRpb24iLCAuZGVzY3IgPSAiU2V0IHRvIFRydWUgZm9yIEFsbG9jSUQgd2l0aCBDQlIgUlQgQmFuZHdpZHRoIHRoYXQgcmVxdWlyZXMgY29tcGVuc2F0aW9uIGZvciBza2lwcGVkIGFsbG9jYXRpb25zIGR1cmluZyBxdWlldCB3aW5kb3ciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Bvbl9hbGxvY19zbGEsIGNicl9ydF9jb21wZW5zYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJjYnJfcnRfYXBfaW5kZXgiLCAuZGVzY3IgPSAiQWxsb2NhdGlvbiBQcm9maWxlIGluZGV4IGZvciBDQlIgUlQgQmFuZHdpZHRoIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9wb25fYWxsb2Nfc2xhLCBjYnJfcnRfYXBfaW5kZXgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJjYnJfbnJ0X2FwX2luZGV4IiwgLmRlc2NyID0gIkFsbG9jYXRpb24gUHJvZmlsZSBpbmRleCBmb3IgQ0JSIG5vbi1SVCBCYW5kd2lkdGgiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Bvbl9hbGxvY19zbGEsIGNicl9ucnRfYXBfaW5kZXgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJhbGxvY190eXBlIiwgLmRlc2NyID0gIlR5cGUgb2YgdGhlIGFsbG9jIElEICIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcG9uX2FsbG9jX3NsYSwgYWxsb2NfdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FsbG9jX3R5cGUgfSwgeyAubmFtZSA9ICJ3ZWlnaHQiLCAuZGVzY3IgPSAiQWxsb2MgSUQgV2VpZ2h0IHVzZWQgaW4gY2FzZSBvZiBFeHRlbmRlZCBEQkEgbW9kZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcG9uX2FsbG9jX3NsYSwgd2VpZ2h0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAicHJpb3JpdHkiLCAuZGVzY3IgPSAiQWxsb2MgSUQgUHJpb3JpdHkgdXNlZCBpbiBjYXNlIG9mIEV4dGVuZGVkIERCQSBtb2RlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9wb25fYWxsb2Nfc2xhLCBwcmlvcml0eSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9hbGxvY19zbGEgPSB7IC5uYW1lID0gImJjbW9sdF9wb25fYWxsb2Nfc2xhIiwgLmRlc2NyID0gIlBPTiBBbGxvYyBTTEEiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcG9uX2FsbG9jX3NsYSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9wb25fYWxsb2Nfc2xhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9hbGxvY19zbGFfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGhfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY2JyX2J3IiwgLmRlc2NyID0gIlRvdGFsIEJXIGF2YWlsYWJsZSBmb3IgQ0JSIHJlYWwtdGltZSB0cmFmZmljIChieXRlcy9zZWMpLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGgsIGNicl9idyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJ0b3RhbF9idyIsIC5kZXNjciA9ICJUb3RhbCBCVyBhdmFpbGFibGUgZm9yIGd1YXJhbnRlZWQgdHJhZmZpYyAoYnl0ZXMvc2VjKSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGgsIHRvdGFsX2J3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gIm5leHRfb251X3RvdGFsX2J3IiwgLmRlc2NyID0gIlRvdGFsIEJXIGF2YWlsYWJsZSBmb3IgZ3VhcmFudGVlZCB0cmFmZmljIGFmdGVyIG5ldyBPTlUgaXMgYWRkZWQgKGJ5dGVzL3NlYykuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9wb25fYXZhaWxhYmxlX2JhbmR3aWR0aCwgbmV4dF9vbnVfdG90YWxfYncpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGggPSB7IC5uYW1lID0gImJjbW9sdF9wb25fYXZhaWxhYmxlX2JhbmR3aWR0aCIsIC5kZXNjciA9ICJQT04gYXZhaWxhYmxlIGJhbmR3aWR0aCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9wb25fYXZhaWxhYmxlX2JhbmR3aWR0aCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9wb25fYXZhaWxhYmxlX2JhbmR3aWR0aF9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9wb25fYXZhaWxhYmxlX2JhbmR3aWR0aF9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wb25fZGJhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInNyX3JlcG9ydGluZ19ibG9ja19zaXplIiwgLmRlc2NyID0gIk9OVSBzdGF0dXMgcmVwb3J0IGJsb2NrIHNpemUgaW4gYnl0ZXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Bvbl9kYmEsIHNyX3JlcG9ydGluZ19ibG9ja19zaXplKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAiZGJhX21vZGUiLCAuZGVzY3IgPSAiREJBIG1vZGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Bvbl9kYmEsIGRiYV9tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZGJhX21vZGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wb25fZGJhID0geyAubmFtZSA9ICJiY21vbHRfcG9uX2RiYSIsIC5kZXNjciA9ICJQT04gREJBIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3Bvbl9kYmEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfcG9uX2RiYV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9wb25fZGJhX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9kaXN0YW5jZV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJtYXhfbG9nX2Rpc3RhbmNlIiwgLmRlc2NyID0gIk1heCBsb2dpY2FsIGRpc3RhbmNlIG9mIGFuIE9OVSBvbiB0aGUgUE9OIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9wb25fZGlzdGFuY2UsIG1heF9sb2dfZGlzdGFuY2UpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAibWF4X2RpZmZfcmVhY2giLCAuZGVzY3IgPSAiTWF4IGRpc3RhbmNlIGJldHdlZW4gdGhlIGNsb3Nlc3QgYW5kIGZhcnRoZXN0IE9OVSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcG9uX2Rpc3RhbmNlLCBtYXhfZGlmZl9yZWFjaCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wb25fZGlzdGFuY2UgPSB7IC5uYW1lID0gImJjbW9sdF9wb25fZGlzdGFuY2UiLCAuZGVzY3IgPSAiUE9OIERpc3RhbmNlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3Bvbl9kaXN0YW5jZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9wb25fZGlzdGFuY2VfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfcG9uX2Rpc3RhbmNlX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImRyaWZ0X2ludGVydmFsIiwgLmRlc2NyID0gIkludGVydmFsIGluIG1pbGxpc2Vjb25kcyBmb3IgT05VIHRyYW5zbWlzc2lvbiBkcmlmdCBtb25pdG9yaW5nICgwID0gZGlzYWJsZWQpLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcG9uX2RyaWZ0X2NvbnRyb2wsIGRyaWZ0X2ludGVydmFsKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImRyaWZ0X2xpbWl0IiwgLmRlc2NyID0gIkRPV2kgdGhyZXNob2xkIGluIGJpdHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sLCBkcmlmdF9saW1pdCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInRyYW5zbWlzc2lvbl9jb250cm9sX2xpbWl0IiwgLmRlc2NyID0gIlRJV2kgdGhyZXNob2xkIGluIGJpdHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sLCB0cmFuc21pc3Npb25fY29udHJvbF9saW1pdCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sID0geyAubmFtZSA9ICJiY21vbHRfcG9uX2RyaWZ0X2NvbnRyb2wiLCAuZGVzY3IgPSAiUE9OIERyaWZ0IENvbnRyb2wiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcG9uX2RyaWZ0X2NvbnRyb2wpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfcG9uX2RyaWZ0X2NvbnRyb2xfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfcG9uX2RyaWZ0X2NvbnRyb2xfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wb25fb251X2lkX2xpc3RfdTMyID0geyAubmFtZSA9ICJiY21vbHRfcG9uX29udV9pZF9saXN0X3UzMiIsIC5kZXNjciA9ICJWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiBwb25fb251X2lkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3Bvbl9vbnVfaWRfbGlzdF91MzIpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRFlOLCAueCA9IHsgLmFycl9keW4gPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCwgLmxlbl9zaXplID0gNCwgLm1heF9zaXplID0gREVGQVVMVF9EWU5fQVJSX01BWF9TSVpFIC8gc2l6ZW9mKGJjbW9sdF9wb25fb251X2lkKSB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcG9uX29wZXJhdGlvbl9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJpbmFjdGl2ZSIsIC52YWwgPSBCQ01PTFRfUE9OX09QRVJBVElPTl9JTkFDVElWRSB9LCB7IC5uYW1lID0gImFjdGl2ZV93b3JraW5nIiwgLnZhbCA9IEJDTU9MVF9QT05fT1BFUkFUSU9OX0FDVElWRV9XT1JLSU5HIH0sIHsgLm5hbWUgPSAiYWN0aXZlX3N0YW5kYnkiLCAudmFsID0gQkNNT0xUX1BPTl9PUEVSQVRJT05fQUNUSVZFX1NUQU5EQlkgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wb25fb3BlcmF0aW9uID0geyAubmFtZSA9ICJiY21vbHRfcG9uX29wZXJhdGlvbiIsIC5kZXNjciA9ICJQT04gT3BlcmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3Bvbl9vcGVyYXRpb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfcG9uX29wZXJhdGlvbl9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcG9uX3Bvd2VyX2xldmVsX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBsc19tYXhpbXVtX2FsbG9jYXRpb25fc2l6ZSIsIC5kZXNjciA9ICJNYXggYWxsb2NhdGlvbiBzaXplIGZvciBQTFMgdHJhbnNtaXNzaW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9wb25fcG93ZXJfbGV2ZWwsIHBsc19tYXhpbXVtX2FsbG9jYXRpb25fc2l6ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJtb2RlIiwgLmRlc2NyID0gIk9OVSBkZWZhdWx0IHBvd2VyIGxldmVsIG1vZGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Bvbl9wb3dlcl9sZXZlbCwgbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9wb3dlcl9sZXZlbCA9IHsgLm5hbWUgPSAiYmNtb2x0X3Bvbl9wb3dlcl9sZXZlbCIsIC5kZXNjciA9ICJQT04gUG93ZXIgTGV2ZWwiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcG9uX3Bvd2VyX2xldmVsKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9wb3dlcl9sZXZlbF9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9wb25fcG93ZXJfbGV2ZWxfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9wb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb3B0aW9uc19zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJub25lIiwgLnZhbCA9IEJDTU9MVF9QT05fUFJPVEVDVElPTl9TV0lUQ0hJTkdfT1BUSU9OU19OT05FIH0sIHsgLm5hbWUgPSAic3dpZnRfcG9wdXAiLCAudmFsID0gQkNNT0xUX1BPTl9QUk9URUNUSU9OX1NXSVRDSElOR19PUFRJT05TX1NXSUZUX1BPUFVQIH0sIHsgLm5hbWUgPSAiZGVidWdfZmFzdF9yYW5naW5nIiwgLnZhbCA9IEJDTU9MVF9QT05fUFJPVEVDVElPTl9TV0lUQ0hJTkdfT1BUSU9OU19ERUJVR19GQVNUX1JBTkdJTkcgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb3B0aW9ucyA9IHsgLm5hbWUgPSAiYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19vcHRpb25zIiwgLmRlc2NyID0gIlBPTiBQcm90ZWN0aW9uIFN3aXRjaGluZyBPcHRpb25zIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19vcHRpb25zKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTV9NQVNLLCAueCA9IHsgLmUgPSBiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29wdGlvbnNfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJ0aW1lb3V0IiwgLmRlc2NyID0gIkxPUyBzd2l0Y2ggb3ZlciB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nLCB0aW1lb3V0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gImdwaW9fcGluIiwgLmRlc2NyID0gIkdQSU8gcGluIGZvciBpbnB1dC9vdXRwdXQgc2lnbmFsIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9wb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmcsIGdwaW9fcGluKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bpb19waW4gfSwgeyAubmFtZSA9ICJvcHRpb25zIiwgLmRlc2NyID0gIk9wdGlvbnMgdG8gY29udHJvbCB0aGUgcHJvdGVjdGlvbiBzd2l0Y2hpbmcgcHJvY2VzcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nLCBvcHRpb25zKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29wdGlvbnMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmcgPSB7IC5uYW1lID0gImJjbW9sdF9wb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmciLCAuZGVzY3IgPSAiR1BPTiBwcm90ZWN0aW9uIHN3aXRjaGluZyBjb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9wb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcG9uX3N0YXRlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImluYWN0aXZlIiwgLnZhbCA9IEJDTU9MVF9QT05fU1RBVEVfSU5BQ1RJVkUgfSwgeyAubmFtZSA9ICJwcm9jZXNzaW5nIiwgLnZhbCA9IEJDTU9MVF9QT05fU1RBVEVfUFJPQ0VTU0lORyB9LCB7IC5uYW1lID0gImFjdGl2ZV93b3JraW5nIiwgLnZhbCA9IEJDTU9MVF9QT05fU1RBVEVfQUNUSVZFX1dPUktJTkcgfSwgeyAubmFtZSA9ICJhY3RpdmVfc3RhbmRieSIsIC52YWwgPSBCQ01PTFRfUE9OX1NUQVRFX0FDVElWRV9TVEFOREJZIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcG9uX3N0YXRlID0geyAubmFtZSA9ICJiY21vbHRfcG9uX3N0YXRlIiwgLmRlc2NyID0gIlBPTiBzdGF0ZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9wb25fc3RhdGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfcG9uX3N0YXRlX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wb25fc3RhdHVzX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXRlIiwgLmRlc2NyID0gInN0YXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9wb25fc3RhdHVzLCBzdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9zdGF0ZSB9LCB7IC5uYW1lID0gImxvc19zdGF0dXMiLCAuZGVzY3IgPSAiTE9TIHN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcG9uX3N0YXR1cywgbG9zX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9zdGF0dXMgPSB7IC5uYW1lID0gImJjbW9sdF9wb25fc3RhdHVzIiwgLmRlc2NyID0gIlBPTiBTdGF0dXMiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcG9uX3N0YXR1cyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9wb25fc3RhdHVzX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9zdGF0dXNfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9wb3dlcl9sZXZlbGxpbmdfY29udHJvbF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJkaXJlY3QiLCAudmFsID0gQkNNT0xUX1BPV0VSX0xFVkVMTElOR19DT05UUk9MX0RJUkVDVCB9LCB7IC5uYW1lID0gImRlY3JlYXNlIiwgLnZhbCA9IEJDTU9MVF9QT1dFUl9MRVZFTExJTkdfQ09OVFJPTF9ERUNSRUFTRSB9LCB7IC5uYW1lID0gImluY3JlYXNlIiwgLnZhbCA9IEJDTU9MVF9QT1dFUl9MRVZFTExJTkdfQ09OVFJPTF9JTkNSRUFTRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3Bvd2VyX2xldmVsbGluZ19jb250cm9sID0geyAubmFtZSA9ICJiY21vbHRfcG93ZXJfbGV2ZWxsaW5nX2NvbnRyb2wiLCAuZGVzY3IgPSAicG93ZXIgbGV2ZWxsaW5nIGNvbnRyb2wiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcG93ZXJfbGV2ZWxsaW5nX2NvbnRyb2wpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfcG93ZXJfbGV2ZWxsaW5nX2NvbnRyb2xfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcG93ZXJfbWFuYWdlbWVudF90cmFuc2l0aW9uX3JlYXNvbl9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwb3dlcl9tYW5hZ2VtZW50X2VuYWJsZWQiLCAudmFsID0gQkNNT0xUX1BPV0VSX01BTkFHRU1FTlRfVFJBTlNJVElPTl9SRUFTT05fUE9XRVJfTUFOQUdFTUVOVF9FTkFCTEVEIH0sIHsgLm5hbWUgPSAicG93ZXJfbWFuYWdlbWVudF9kaXNhYmxlZCIsIC52YWwgPSBCQ01PTFRfUE9XRVJfTUFOQUdFTUVOVF9UUkFOU0lUSU9OX1JFQVNPTl9QT1dFUl9NQU5BR0VNRU5UX0RJU0FCTEVEIH0sIHsgLm5hbWUgPSAic2xlZXBfcmVxdWVzdF9hd2FrZSIsIC52YWwgPSBCQ01PTFRfUE9XRVJfTUFOQUdFTUVOVF9UUkFOU0lUSU9OX1JFQVNPTl9TTEVFUF9SRVFVRVNUX0FXQUtFIH0sIHsgLm5hbWUgPSAic2xlZXBfcmVxdWVzdF9kb3plIiwgLnZhbCA9IEJDTU9MVF9QT1dFUl9NQU5BR0VNRU5UX1RSQU5TSVRJT05fUkVBU09OX1NMRUVQX1JFUVVFU1RfRE9aRSB9LCB7IC5uYW1lID0gInNsZWVwX3JlcXVlc3Rfc2xlZXAiLCAudmFsID0gQkNNT0xUX1BPV0VSX01BTkFHRU1FTlRfVFJBTlNJVElPTl9SRUFTT05fU0xFRVBfUkVRVUVTVF9TTEVFUCB9LCB7IC5uYW1lID0gInNsZWVwX3JlcXVlc3Rfd2F0Y2giLCAudmFsID0gQkNNT0xUX1BPV0VSX01BTkFHRU1FTlRfVFJBTlNJVElPTl9SRUFTT05fU0xFRVBfUkVRVUVTVF9XQVRDSCB9LCB7IC5uYW1lID0gInRlcmlfZXhwaXJlZCIsIC52YWwgPSBCQ01PTFRfUE9XRVJfTUFOQUdFTUVOVF9UUkFOU0lUSU9OX1JFQVNPTl9URVJJX0VYUElSRUQgfSwgeyAubmFtZSA9ICJ0YWxlcnRlZF9leHBpcmVkIiwgLnZhbCA9IEJDTU9MVF9QT1dFUl9NQU5BR0VNRU5UX1RSQU5TSVRJT05fUkVBU09OX1RBTEVSVEVEX0VYUElSRUQgfSwgeyAubmFtZSA9ICJhbGFybSIsIC52YWwgPSBCQ01PTFRfUE9XRVJfTUFOQUdFTUVOVF9UUkFOU0lUSU9OX1JFQVNPTl9BTEFSTSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3Bvd2VyX21hbmFnZW1lbnRfdHJhbnNpdGlvbl9yZWFzb24gPSB7IC5uYW1lID0gImJjbW9sdF9wb3dlcl9tYW5hZ2VtZW50X3RyYW5zaXRpb25fcmVhc29uIiwgLmRlc2NyID0gIlRoZSByZWFzb24gdGhhdCBhIHBvd2VyIG1hbmFnZW1lbnQgc3RhdGUgY2hhbmdlIG9jY3VycmVkLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9wb3dlcl9tYW5hZ2VtZW50X3RyYW5zaXRpb25fcmVhc29uKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3Bvd2VyX21hbmFnZW1lbnRfdHJhbnNpdGlvbl9yZWFzb25fc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcHJic19wb2x5bm9taWFsX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInByYnNfNyIsIC52YWwgPSBCQ01PTFRfUFJCU19QT0xZTk9NSUFMX1BSQlNfNyB9LCB7IC5uYW1lID0gInByYnNfOSIsIC52YWwgPSBCQ01PTFRfUFJCU19QT0xZTk9NSUFMX1BSQlNfOSB9LCB7IC5uYW1lID0gInByYnNfMTEiLCAudmFsID0gQkNNT0xUX1BSQlNfUE9MWU5PTUlBTF9QUkJTXzExIH0sIHsgLm5hbWUgPSAicHJic18xNSIsIC52YWwgPSBCQ01PTFRfUFJCU19QT0xZTk9NSUFMX1BSQlNfMTUgfSwgeyAubmFtZSA9ICJwcmJzXzIzIiwgLnZhbCA9IEJDTU9MVF9QUkJTX1BPTFlOT01JQUxfUFJCU18yMyB9LCB7IC5uYW1lID0gInByYnNfMzEiLCAudmFsID0gQkNNT0xUX1BSQlNfUE9MWU5PTUlBTF9QUkJTXzMxIH0sIHsgLm5hbWUgPSAicHJic181OCIsIC52YWwgPSBCQ01PTFRfUFJCU19QT0xZTk9NSUFMX1BSQlNfNTggfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wcmJzX3BvbHlub21pYWwgPSB7IC5uYW1lID0gImJjbW9sdF9wcmJzX3BvbHlub21pYWwiLCAuZGVzY3IgPSAiUFJCUyBQb2x5bm9taWFsIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3ByYnNfcG9seW5vbWlhbCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9wcmJzX3BvbHlub21pYWxfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcHJic19jaGVja2VyX21vZGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic2VsZl9zeW5jIiwgLnZhbCA9IEJDTU9MVF9QUkJTX0NIRUNLRVJfTU9ERV9TRUxGX1NZTkMgfSwgeyAubmFtZSA9ICJpbml0aWFsX3NlZWRfbW9kZSIsIC52YWwgPSBCQ01PTFRfUFJCU19DSEVDS0VSX01PREVfSU5JVElBTF9TRUVEX01PREUgfSwgeyAubmFtZSA9ICJpbml0aWFsX3NlZWRfbW9kZV8yIiwgLnZhbCA9IEJDTU9MVF9QUkJTX0NIRUNLRVJfTU9ERV9JTklUSUFMX1NFRURfTU9ERV8yIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcHJic19jaGVja2VyX21vZGUgPSB7IC5uYW1lID0gImJjbW9sdF9wcmJzX2NoZWNrZXJfbW9kZSIsIC5kZXNjciA9ICJQUkJTIGNoZWNrZXIgbW9kZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9wcmJzX2NoZWNrZXJfbW9kZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9wcmJzX2NoZWNrZXJfbW9kZV9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcHJic19jaGVja2VyX2NvbmZpZ19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwb2x5bm9tIiwgLmRlc2NyID0gIlBSQlMgcG9seW5vbSB0eXBlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnLCBwb2x5bm9tKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcHJic19wb2x5bm9taWFsIH0sIHsgLm5hbWUgPSAibW9kZSIsIC5kZXNjciA9ICJQUkJTIExPQ0sgc3RhdGUgbWFjaGluZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcsIG1vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wcmJzX2NoZWNrZXJfbW9kZSB9LCB7IC5uYW1lID0gImRhdGFfaW52ZXJ0IiwgLmRlc2NyID0gIkludmVydCBvciBubyBpbnZlcnQgZm9yIHJlY2VpdmVkIFBSQlMgZGF0YSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZywgZGF0YV9pbnZlcnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJjb250cm9sIiwgLmRlc2NyID0gIkVuYWJsZVxcRGlzYWJsZSB0aGUgVVMgUFJCUyBjaGVja2VyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnLCBjb250cm9sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY29udHJvbF9zdGF0ZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcgPSB7IC5uYW1lID0gImJjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnIiwgLmRlc2NyID0gIlBSQlMgY2hlY2tlciBjb25maWciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcHJic19jaGVja2VyX2NvbmZpZyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWdfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBvbHlub20iLCAuZGVzY3IgPSAiUFJCUyBwb2x5bm9tIHR5cGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZywgcG9seW5vbSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3ByYnNfcG9seW5vbWlhbCB9LCB7IC5uYW1lID0gImVycm9yX2luc2VydCIsIC5kZXNjciA9ICIwIHRvIDEgdHJhbnNpdGlvbiBvbiB0aGlzIHNpZ25hbCB3aWxsIGluc2VydCBzaW5nbGUgYml0IGVycm9yIGluIHRoZSBNU0IgYml0IG9mIHRoZSBkYXRhIGJ1cy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZywgZXJyb3JfaW5zZXJ0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiaW52ZXJ0IiwgLmRlc2NyID0gIkludmVydCBvciBubyBpbnZlcnQgZm9yIHRyYW5zbWl0dGVkIFBSQlMgZGF0YSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnLCBpbnZlcnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJjb250cm9sIiwgLmRlc2NyID0gIkVuYWJsZVxcRGlzYWJsZSB0aGUgRFMgUFJCUyBnZW5lcmF0b3IiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZywgY29udHJvbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWcgPSB7IC5uYW1lID0gImJjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWciLCAuZGVzY3IgPSAiUFJCUyBHZW5lcmF0b3IgY29uZmlnIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWdfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcHJic19sb2NrX3N0YXRlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInVubG9ja2VkIiwgLnZhbCA9IEJDTU9MVF9QUkJTX0xPQ0tfU1RBVEVfVU5MT0NLRUQgfSwgeyAubmFtZSA9ICJsb2NrZWQiLCAudmFsID0gQkNNT0xUX1BSQlNfTE9DS19TVEFURV9MT0NLRUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wcmJzX2xvY2tfc3RhdGUgPSB7IC5uYW1lID0gImJjbW9sdF9wcmJzX2xvY2tfc3RhdGUiLCAuZGVzY3IgPSAiUFJCUyBMb2NrIFN0YXRlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3ByYnNfbG9ja19zdGF0ZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9wcmJzX2xvY2tfc3RhdGVfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3ByYnNfc3RhdHVzX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImxvY2tfc3RhdGUiLCAuZGVzY3IgPSAiVGhlIHN0YXRlIG9mIHRoZSBQUkJTIGxvY2siLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3ByYnNfc3RhdHVzLCBsb2NrX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcHJic19sb2NrX3N0YXRlIH0sIHsgLm5hbWUgPSAiZXJyb3JfY291bnRzIiwgLmRlc2NyID0gIlRoZSBiaXQgZXJyb3JzIG9ic2VydmVkIGR1cmluZyB0aGUgUFJCUyB0ZXN0LiAgVGhpcyBmaWVsZCBpcyBjbGVhciBvbiByZWFkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcHJic19zdGF0dXMsIGVycm9yX2NvdW50cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9wcmJzX3N0YXR1cyA9IHsgLm5hbWUgPSAiYmNtb2x0X3ByYnNfc3RhdHVzIiwgLmRlc2NyID0gIlRoYXQgc3RhdGUgb2YgdGhlIFBSQlMgdGVzdCwgbG9jayBzdGF0ZSwgYW5kIGVycm9yIGNvdW50ZXJzLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9wcmJzX3N0YXR1cyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9wcmJzX3N0YXR1c19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9wcmJzX3N0YXR1c19maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3JhbWFuX21pdGlnYXRpb25fbW9kZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJkaXNhYmxlZCIsIC52YWwgPSBCQ01PTFRfUkFNQU5fTUlUSUdBVElPTl9NT0RFX0RJU0FCTEVEIH0sIHsgLm5hbWUgPSAicmFuZG9tIiwgLnZhbCA9IEJDTU9MVF9SQU1BTl9NSVRJR0FUSU9OX01PREVfUkFORE9NIH0sIHsgLm5hbWUgPSAiZml4ZWQiLCAudmFsID0gQkNNT0xUX1JBTUFOX01JVElHQVRJT05fTU9ERV9GSVhFRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3JhbWFuX21pdGlnYXRpb25fbW9kZSA9IHsgLm5hbWUgPSAiYmNtb2x0X3JhbWFuX21pdGlnYXRpb25fbW9kZSIsIC5kZXNjciA9ICJSYW1hbiBtaXRpZ2F0aW9uIG1vZGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcmFtYW5fbWl0aWdhdGlvbl9tb2RlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3JhbWFuX21pdGlnYXRpb25fbW9kZV9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcmFuZ2luZ19jb250cm9sX2NvbmZpZ3VyYXRpb25fZmllbGRzW10gPSB7IHsgLm5hbWUgPSAid2FpdF9zdGF0ZV8xX3dpbmRvd19zaXplIiwgLmRlc2NyID0gIndhaXQgc3RhdGUgMSB3aW5kb3cgc2l6ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcmFuZ2luZ19jb250cm9sX2NvbmZpZ3VyYXRpb24sIHdhaXRfc3RhdGVfMV93aW5kb3dfc2l6ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gIndhaXRfc3RhdGVfMl93aW5kb3dfc2l6ZSIsIC5kZXNjciA9ICJ3YWl0IHN0YXRlIDIgd2luZG93IHNpemUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3JhbmdpbmdfY29udHJvbF9jb25maWd1cmF0aW9uLCB3YWl0X3N0YXRlXzJfd2luZG93X3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJ3YWl0X2FmdGVyX3Jlc3luY180IiwgLmRlc2NyID0gIndhaXQgYWZ0ZXIgcmVzeW5jIDQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3JhbmdpbmdfY29udHJvbF9jb25maWd1cmF0aW9uLCB3YWl0X2FmdGVyX3Jlc3luY180KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcmFuZ2luZ19jb250cm9sX2NvbmZpZ3VyYXRpb24gPSB7IC5uYW1lID0gImJjbW9sdF9yYW5naW5nX2NvbnRyb2xfY29uZmlndXJhdGlvbiIsIC5kZXNjciA9ICJyYW5naW5nIGNvbnRyb2wgY29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9yYW5naW5nX2NvbnRyb2xfY29uZmlndXJhdGlvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9yYW5naW5nX2NvbnRyb2xfY29uZmlndXJhdGlvbl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9yYW5naW5nX2NvbnRyb2xfY29uZmlndXJhdGlvbl9maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3JhbmdpbmdfZmFpbF9yZWFzb25fc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibm9uZSIsIC52YWwgPSBCQ01PTFRfUkFOR0lOR19GQUlMX1JFQVNPTl9OT05FIH0sIHsgLm5hbWUgPSAicmFuZ2luZ19hY2tfdGltZW91dCIsIC52YWwgPSBCQ01PTFRfUkFOR0lOR19GQUlMX1JFQVNPTl9SQU5HSU5HX0FDS19USU1FT1VUIH0sIHsgLm5hbWUgPSAicGxvYW1fZGF0YV9taXNtYXRjaCIsIC52YWwgPSBCQ01PTFRfUkFOR0lOR19GQUlMX1JFQVNPTl9QTE9BTV9EQVRBX01JU01BVENIIH0sIHsgLm5hbWUgPSAicGxvYW1fdHlwZV9taXNtYXRjaCIsIC52YWwgPSBCQ01PTFRfUkFOR0lOR19GQUlMX1JFQVNPTl9QTE9BTV9UWVBFX01JU01BVENIIH0sIHsgLm5hbWUgPSAicGxvYW1fb251X2lkX21pc21hdGNoIiwgLnZhbCA9IEJDTU9MVF9SQU5HSU5HX0ZBSUxfUkVBU09OX1BMT0FNX09OVV9JRF9NSVNNQVRDSCB9LCB7IC5uYW1lID0gImRyaWZ0X2V4Y2VlZGVkIiwgLnZhbCA9IEJDTU9MVF9SQU5HSU5HX0ZBSUxfUkVBU09OX0RSSUZUX0VYQ0VFREVEIH0sIHsgLm5hbWUgPSAibm9fcGxvYW1fcmVjZWl2ZWQiLCAudmFsID0gQkNNT0xUX1JBTkdJTkdfRkFJTF9SRUFTT05fTk9fUExPQU1fUkVDRUlWRUQgfSwgeyAubmFtZSA9ICJsb3MiLCAudmFsID0gQkNNT0xUX1JBTkdJTkdfRkFJTF9SRUFTT05fTE9TIH0sIHsgLm5hbWUgPSAiYWxhcm1zIiwgLnZhbCA9IEJDTU9MVF9SQU5HSU5HX0ZBSUxfUkVBU09OX0FMQVJNUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3JhbmdpbmdfZmFpbF9yZWFzb24gPSB7IC5uYW1lID0gImJjbW9sdF9yYW5naW5nX2ZhaWxfcmVhc29uIiwgLmRlc2NyID0gIlJhbmdpbmcgZmFpbCByZWFzb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcmFuZ2luZ19mYWlsX3JlYXNvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9yYW5naW5nX2ZhaWxfcmVhc29uX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFmdGVyX2luaXQiLCAuZGVzY3IgPSAiYWZ0ZXIgaW5pdCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucywgYWZ0ZXJfaW5pdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImFmdGVyX25vX2VkIiwgLmRlc2NyID0gImFmdGVyIG5vIGVkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLCBhZnRlcl9ub19lZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImFmdGVyX2VkIiwgLmRlc2NyID0gImFmdGVyIGVkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLCBhZnRlcl9lZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImFmdGVyX25vX2RlbCIsIC5kZXNjciA9ICJhZnRlciBubyBkZWwiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMsIGFmdGVyX25vX2RlbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImFmdGVyX3JhbmdpbmdfYWNjZXNzIiwgLmRlc2NyID0gImFmdGVyIHJhbmdpbmcgYWNjZXNzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zLCBhZnRlcl9yYW5naW5nX2FjY2VzcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm1lZF92YWwiLCAuZGVzY3IgPSAibWVkIHZhbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucywgbWVkX3ZhbCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zID0geyAubmFtZSA9ICJiY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyIsIC5kZXNjciA9ICJyYW5naW5nIHJlc3luYyBjb25kaXRpb25zIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9uc19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3JhbmdpbmdfcnNzaV9jb250cm9sX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFmdGVyX25vX2VkIiwgLmRlc2NyID0gImFmdGVyIG5vIGVkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9yYW5naW5nX3Jzc2lfY29udHJvbCwgYWZ0ZXJfbm9fZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJhZnRlcl9lZCIsIC5kZXNjciA9ICJhZnRlciBlZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcmFuZ2luZ19yc3NpX2NvbnRyb2wsIGFmdGVyX2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiYWZ0ZXJfcmVzZXRfMyIsIC5kZXNjciA9ICJhZnRlciByZXNldCAzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9yYW5naW5nX3Jzc2lfY29udHJvbCwgYWZ0ZXJfcmVzZXRfMyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3JhbmdpbmdfcnNzaV9jb250cm9sID0geyAubmFtZSA9ICJiY21vbHRfcmFuZ2luZ19yc3NpX2NvbnRyb2wiLCAuZGVzY3IgPSAicmFuZ2luZyByc3NpIGNvbnRyb2wiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcmFuZ2luZ19yc3NpX2NvbnRyb2wpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfcmFuZ2luZ19yc3NpX2NvbnRyb2xfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfcmFuZ2luZ19yc3NpX2NvbnRyb2xfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9yZWdpc3RyYXRpb25fYmVoYXZpb3Jfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYXV0b21hdGljIiwgLnZhbCA9IEJDTU9MVF9SRUdJU1RSQVRJT05fQkVIQVZJT1JfQVVUT01BVElDIH0sIHsgLm5hbWUgPSAibm90aWZ5X3Vua25vd24iLCAudmFsID0gQkNNT0xUX1JFR0lTVFJBVElPTl9CRUhBVklPUl9OT1RJRllfVU5LTk9XTiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3JlZ2lzdHJhdGlvbl9iZWhhdmlvciA9IHsgLm5hbWUgPSAiYmNtb2x0X3JlZ2lzdHJhdGlvbl9iZWhhdmlvciIsIC5kZXNjciA9ICJSZWdpc3RyYXRpb24gQmVoYXZpb3IiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcmVnaXN0cmF0aW9uX2JlaGF2aW9yKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3JlZ2lzdHJhdGlvbl9iZWhhdmlvcl9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9mYWlsX3JlYXNvbl9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJub25lIiwgLnZhbCA9IEJDTU9MVF9SRVFVRVNUX1JFR0lTVFJBVElPTl9GQUlMX1JFQVNPTl9OT05FIH0sIHsgLm5hbWUgPSAicmVnaXN0cmF0aW9uX3Bsb2FtX3RpbWVvdXQiLCAudmFsID0gQkNNT0xUX1JFUVVFU1RfUkVHSVNUUkFUSU9OX0ZBSUxfUkVBU09OX1JFR0lTVFJBVElPTl9QTE9BTV9USU1FT1VUIH0sIHsgLm5hbWUgPSAib251X2FsYXJtIiwgLnZhbCA9IEJDTU9MVF9SRVFVRVNUX1JFR0lTVFJBVElPTl9GQUlMX1JFQVNPTl9PTlVfQUxBUk0gfSwgeyAubmFtZSA9ICJkZWFjdGl2YXRpb24iLCAudmFsID0gQkNNT0xUX1JFUVVFU1RfUkVHSVNUUkFUSU9OX0ZBSUxfUkVBU09OX0RFQUNUSVZBVElPTiB9LCB7IC5uYW1lID0gImRpc2FibGUiLCAudmFsID0gQkNNT0xUX1JFUVVFU1RfUkVHSVNUUkFUSU9OX0ZBSUxfUkVBU09OX0RJU0FCTEUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9mYWlsX3JlYXNvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2ZhaWxfcmVhc29uIiwgLmRlc2NyID0gInJlcXVlc3QgcmVnaXN0cmF0aW9uIGZhaWwgcmVhc29uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2ZhaWxfcmVhc29uKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2ZhaWxfcmVhc29uX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXNfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdGUiLCAuZGVzY3IgPSAicmVxdWVzdCByZWdpc3RyYXRpb24gc3RhdGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cywgcmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb250cm9sX3N0YXRlIH0sIHsgLm5hbWUgPSAic21hX2ZsYWciLCAuZGVzY3IgPSAiaXMgcmVxdWVzdCByZWdpc3RyYXRpb24gaXMgcGFydCBvZiBzbWEgcHJvY2VzcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzLCBzbWFfZmxhZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cyA9IHsgLm5hbWUgPSAiYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cyIsIC5kZXNjciA9ICJyZXF1ZXN0IHJlZ2lzdHJhdGlvbiBzdGF0dXMiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1c19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXNfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9yZXN1bHRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3VjY2VzcyIsIC52YWwgPSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1MgfSwgeyAubmFtZSA9ICJmYWlsIiwgLnZhbCA9IEJDTU9MVF9SRVNVTFRfRkFJTCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCA9IHsgLm5hbWUgPSAiYmNtb2x0X3Jlc3VsdCIsIC5kZXNjciA9ICJSZXN1bHQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcmVzdWx0KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3Jlc3VsdF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3R5cGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZWFybHlfcm9ndWVfZGV0ZWN0aW9uIiwgLnZhbCA9IEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fQUxHT1JJVEhNX1RZUEVfRUFSTFlfUk9HVUVfREVURUNUSU9OIH0sIHsgLm5hbWUgPSAic3BlY2lhbF9tYXAiLCAudmFsID0gQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9BTEdPUklUSE1fVFlQRV9TUEVDSUFMX01BUCB9LCB7IC5uYW1lID0gImV4dGVuZGVkX2d1YXJkX3RpbWUiLCAudmFsID0gQkNNT0xUX1JPR1VFX0RFVEVDVElPTl9BTEdPUklUSE1fVFlQRV9FWFRFTkRFRF9HVUFSRF9USU1FIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV90eXBlID0geyAubmFtZSA9ICJiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV90eXBlIiwgLmRlc2NyID0gIlR5cGUgb2YgdGhlIHJvZ3VlIGRldGVjdGlvbiBhbGdvcml0aG0uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG1fdHlwZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3R5cGVfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzaWxlbnRfd2luZG93IiwgLnZhbCA9IEJDTU9MVF9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX1NJTEVOVF9XSU5ET1cgfSwgeyAubmFtZSA9ICJjdXRfb2ZmX3dpbmRvdyIsIC52YWwgPSBCQ01PTFRfUk9HVUVfREVURUNUSU9OX1dJTkRPV19DVVRfT0ZGX1dJTkRPVyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl93aW5kb3cgPSB7IC5uYW1lID0gImJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93IiwgLmRlc2NyID0gIlJvZ3VlIE9OVSBkZXRlY3Rpb24gbWVhc3VyZW1lbnQgdHlwZS4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXBfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicGxvX3NpemUiLCAuZGVzY3IgPSAiUExPIHNpemUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcCwgcGxvX3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiYWxsb2NfaWQiLCAuZGVzY3IgPSAiQWxsb2MgSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcCwgYWxsb2NfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAib251X2lkIiwgLmRlc2NyID0gIk9OVSBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwLCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiYWNjZXNzX3NpemUiLCAuZGVzY3IgPSAiQWNjZXNzIHNpemUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcCwgYWNjZXNzX3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXAgPSB7IC5uYW1lID0gImJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXAiLCAuZGVzY3IgPSAiUm9ndWUgRGV0ZWN0aW9uIFNwZWNpYWwgTWFwIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXBfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwX2xpc3RfdTMyX21heF84ID0geyAubmFtZSA9ICJiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwX2xpc3RfdTMyX21heF84IiwgLmRlc2NyID0gIlZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIHJvZ3VlX2RldGVjdGlvbl9zcGVjaWFsX21hcCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fc3BlY2lhbF9tYXBfbGlzdF91MzJfbWF4XzgpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRFlOLCAueCA9IHsgLmFycl9keW4gPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwLCAubGVuX3NpemUgPSA0LCAubWF4X3NpemUgPSA4IH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGdvcml0aG1fdHlwZSIsIC5kZXNjciA9ICJUeXBlIG9mIHRoZSByb2d1ZSBkZXRlY3Rpb24gYWxnb3JpdGhtLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobSwgYWxnb3JpdGhtX3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3R5cGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV9lYXJseV9yb2d1ZV9kZXRlY3Rpb25fZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibWVhc3VyZW1lbnRfdHlwZSIsIC5kZXNjciA9ICJTaWxlbnQgV2luZG93IG9yIEN1dCBvZmYgV2luZG93IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtLCB1LmVhcmx5X3JvZ3VlX2RldGVjdGlvbi5tZWFzdXJlbWVudF90eXBlKSAtIG9mZnNldG9mKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtLCB1LmVhcmx5X3JvZ3VlX2RldGVjdGlvbi5tZWFzdXJlbWVudF90eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdyB9LCB7IC5uYW1lID0gImludGVydmFsIiwgLmRlc2NyID0gIlBlcmlvZGljIHByb2Nlc3MgdGltZXIgaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtLCB1LmVhcmx5X3JvZ3VlX2RldGVjdGlvbi5pbnRlcnZhbCkgLSBvZmZzZXRvZihiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobSwgdS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24ubWVhc3VyZW1lbnRfdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJzZWNvbmRfcmFuZ2luZ193aW5kb3ciLCAuZGVzY3IgPSAiRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzZWNvbmQgcmFuZ2luZyB3aW5kb3cgc2hvdWxkIGJlIGludm9rZWQgb3Igbm90LiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobSwgdS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24uc2Vjb25kX3Jhbmdpbmdfd2luZG93KSAtIG9mZnNldG9mKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtLCB1LmVhcmx5X3JvZ3VlX2RldGVjdGlvbi5tZWFzdXJlbWVudF90eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiYWxsb2NfdHlwZV90b19zY2FuIiwgLmRlc2NyID0gIkFsbG9jIHR5cGUgdG8gc2NhbiBkdXJpbmcgcm9ndWUgZGV0ZWN0aW9uLiAgVW51c2VkLCBwcmV2aW91c2x5IHVzZWQsIG9yIGFsbCBBbGxvYy1JRHMuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtLCB1LmVhcmx5X3JvZ3VlX2RldGVjdGlvbi5hbGxvY190eXBlX3RvX3NjYW4pIC0gb2Zmc2V0b2YoYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG0sIHUuZWFybHlfcm9ndWVfZGV0ZWN0aW9uLm1lYXN1cmVtZW50X3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hbGxvY190eXBlX3RvX3NjYW4gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX2Vhcmx5X3JvZ3VlX2RldGVjdGlvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG1fZWFybHlfcm9ndWVfZGV0ZWN0aW9uIiwgLmRlc2NyID0gIlJvZ3VlIERldGVjdGlvbiBBbGdvcml0aG0gRWFybHkgUm9ndWUgRGV0ZWN0aW9uIiwgLnNpemUgPSBzaXplb2YoKChiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobSAqKTApLT51LmVhcmx5X3JvZ3VlX2RldGVjdGlvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX2Vhcmx5X3JvZ3VlX2RldGVjdGlvbl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX2Vhcmx5X3JvZ3VlX2RldGVjdGlvbl9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3NwZWNpYWxfbWFwX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFjY2Vzc2VzIiwgLmRlc2NyID0gIkFjY2Vzc2VzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtLCB1LnNwZWNpYWxfbWFwLmFjY2Vzc2VzKSAtIG9mZnNldG9mKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtLCB1LnNwZWNpYWxfbWFwLmFjY2Vzc2VzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3NwZWNpYWxfbWFwX2xpc3RfdTMyX21heF84IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV9zcGVjaWFsX21hcCA9IHsgLm5hbWUgPSAiYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG1fc3BlY2lhbF9tYXAiLCAuZGVzY3IgPSAiUm9ndWUgRGV0ZWN0aW9uIEFsZ29yaXRobSBTcGVjaWFsIE1hcCIsIC5zaXplID0gc2l6ZW9mKCgoYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG0gKikwKS0+dS5zcGVjaWFsX21hcCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3NwZWNpYWxfbWFwX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG1fc3BlY2lhbF9tYXBfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV9leHRlbmRlZF9ndWFyZF90aW1lX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFkZGl0aW9uYWxfZ3VhcmRfdGltZSIsIC5kZXNjciA9ICJBZGRpdGlvbmFsIGd1YXJkIHRpbWUgKGluIGJ5dGVzKSBmb3IgYWxsIE9OVXMgb24gdGhpcyBQT04uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtLCB1LmV4dGVuZGVkX2d1YXJkX3RpbWUuYWRkaXRpb25hbF9ndWFyZF90aW1lKSAtIG9mZnNldG9mKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtLCB1LmV4dGVuZGVkX2d1YXJkX3RpbWUuYWRkaXRpb25hbF9ndWFyZF90aW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG1fZXh0ZW5kZWRfZ3VhcmRfdGltZSA9IHsgLm5hbWUgPSAiYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG1fZXh0ZW5kZWRfZ3VhcmRfdGltZSIsIC5kZXNjciA9ICJSb2d1ZSBEZXRlY3Rpb24gQWxnb3JpdGhtIEV4dGVuZGVkIEd1YXJkIFRpbWUiLCAuc2l6ZSA9IHNpemVvZigoKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtICopMCktPnUuZXh0ZW5kZWRfZ3VhcmRfdGltZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX2V4dGVuZGVkX2d1YXJkX3RpbWVfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV9leHRlbmRlZF9ndWFyZF90aW1lX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG1fdW5pb25fZmllbGRzW10gPSB7IHsgLm5hbWUgPSAidS5lYXJseV9yb2d1ZV9kZXRlY3Rpb24iLCAuZGVzY3IgPSAiIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtLCB1LmVhcmx5X3JvZ3VlX2RldGVjdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG1fZWFybHlfcm9ndWVfZGV0ZWN0aW9uIH0sIHsgLm5hbWUgPSAidS5zcGVjaWFsX21hcCIsIC5kZXNjciA9ICIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG0sIHUuc3BlY2lhbF9tYXApLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3NwZWNpYWxfbWFwIH0sIHsgLm5hbWUgPSAidS5leHRlbmRlZF9ndWFyZF90aW1lIiwgLmRlc2NyID0gIiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobSwgdS5leHRlbmRlZF9ndWFyZF90aW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV9leHRlbmRlZF9ndWFyZF90aW1lIH0sIHsgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtID0geyAubmFtZSA9ICJiY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobSIsIC5kZXNjciA9ICJUeXBlIGFuZCBhdHRyaWJ1dGVzIG9mIHRoZSByb2d1ZSBkZXRlY3Rpb24gYWxnb3JpdGhtLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfVU5JT04sIC54ID0geyAudSA9IHsgLm51bV9jb21tb25fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG1fZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuY29tbW9uX2ZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl9hbGdvcml0aG1fZmllbGRzLCAuY2xhc3NpZmllcl9pZHggPSAwLCAudW5pb25fZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX2FsZ29yaXRobV91bmlvbl9maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3JvZ3VlX21lYXN1cmVtZW50X3Jlc3VsdF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJyc3NpX2NvbXBsZXRlIiwgLnZhbCA9IEJDTU9MVF9ST0dVRV9NRUFTVVJFTUVOVF9SRVNVTFRfUlNTSV9DT01QTEVURSB9LCB7IC5uYW1lID0gIm5vdF9wZXJmb3JtZWQiLCAudmFsID0gQkNNT0xUX1JPR1VFX01FQVNVUkVNRU5UX1JFU1VMVF9OT1RfUEVSRk9STUVEIH0sIHsgLm5hbWUgPSAicm9ndWVfY3ljbGVfc3RvcCIsIC52YWwgPSBCQ01PTFRfUk9HVUVfTUVBU1VSRU1FTlRfUkVTVUxUX1JPR1VFX0NZQ0xFX1NUT1AgfSwgeyAubmFtZSA9ICJyc3NpX2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9ST0dVRV9NRUFTVVJFTUVOVF9SRVNVTFRfUlNTSV9FUlJPUiB9LCB7IC5uYW1lID0gInJzc2lfbm90X2NvbXBsZXRlIiwgLnZhbCA9IEJDTU9MVF9ST0dVRV9NRUFTVVJFTUVOVF9SRVNVTFRfUlNTSV9OT1RfQ09NUExFVEUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9tZWFzdXJlbWVudF9yZXN1bHQgPSB7IC5uYW1lID0gImJjbW9sdF9yb2d1ZV9tZWFzdXJlbWVudF9yZXN1bHQiLCAuZGVzY3IgPSAiU3RhdHVzIG9mIHRoZSByb2d1ZSBPTlUgZGV0ZWN0aW9uIHJlc3VsdC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcm9ndWVfbWVhc3VyZW1lbnRfcmVzdWx0KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3JvZ3VlX21lYXN1cmVtZW50X3Jlc3VsdF9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImNvbnRyb2wiLCAuZGVzY3IgPSAiRW5hYmxlL0Rpc2FibGUgdGhlIHJvZ3VlIE9OVSBkZXRlY3Rpb24gcHJvY2Vzcy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3JvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcywgY29udHJvbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfSwgeyAubmFtZSA9ICJkZXRlY3Rpb25fYWxnb3JpdGhtIiwgLmRlc2NyID0gIlR5cGUgYW5kIGF0dHJpYnV0ZXMgb2YgdGhlIHJvZ3VlIGRldGVjdGlvbiBhbGdvcml0aG0uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MsIGRldGVjdGlvbl9hbGdvcml0aG0pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzID0geyAubmFtZSA9ICJiY21vbHRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzIiwgLmRlc2NyID0gIkNvbmZpZ3VyZXMgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIHJvZ3VlIE9OVSBkZXRlY3Rpb24gcGVyaW9kaWMgcHJvY2Vzcy4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2Vzc19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3NfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9yb2d1ZV9zY2FuX3N0YXR1c19zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJjb21wbGV0ZSIsIC52YWwgPSBCQ01PTFRfUk9HVUVfU0NBTl9TVEFUVVNfQ09NUExFVEUgfSwgeyAubmFtZSA9ICJsbGlkX3N0YXRlX2lzX2JhZCIsIC52YWwgPSBCQ01PTFRfUk9HVUVfU0NBTl9TVEFUVVNfTExJRF9TVEFURV9JU19CQUQgfSwgeyAubmFtZSA9ICJsbGlkX2lzX29vciIsIC52YWwgPSBCQ01PTFRfUk9HVUVfU0NBTl9TVEFUVVNfTExJRF9JU19PT1IgfSwgeyAubmFtZSA9ICJzY2FuX2Vycl9ub3JlcyIsIC52YWwgPSBCQ01PTFRfUk9HVUVfU0NBTl9TVEFUVVNfU0NBTl9FUlJfTk9SRVMgfSwgeyAubmFtZSA9ICJzY2FuX2Vycl9pbnRlcm5hbCIsIC52YWwgPSBCQ01PTFRfUk9HVUVfU0NBTl9TVEFUVVNfU0NBTl9FUlJfSU5URVJOQUwgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9zY2FuX3N0YXR1cyA9IHsgLm5hbWUgPSAiYmNtb2x0X3JvZ3VlX3NjYW5fc3RhdHVzIiwgLmRlc2NyID0gIlJvZ3VlIFNjYW4gSW5kaWNhdGlvbiBTdGF0dXMgIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3JvZ3VlX3NjYW5fc3RhdHVzKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3JvZ3VlX3NjYW5fc3RhdHVzX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3Jzc2lfbWVhc3VyZW1lbnRfZmFpbF9yZWFzb25fc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibm9uZSIsIC52YWwgPSBCQ01PTFRfUlNTSV9NRUFTVVJFTUVOVF9GQUlMX1JFQVNPTl9OT05FIH0sIHsgLm5hbWUgPSAibm9fZGVsaW1pdGVyIiwgLnZhbCA9IEJDTU9MVF9SU1NJX01FQVNVUkVNRU5UX0ZBSUxfUkVBU09OX05PX0RFTElNSVRFUiB9LCB7IC5uYW1lID0gIm5vX2FjY2VzcyIsIC52YWwgPSBCQ01PTFRfUlNTSV9NRUFTVVJFTUVOVF9GQUlMX1JFQVNPTl9OT19BQ0NFU1MgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9yc3NpX21lYXN1cmVtZW50X2ZhaWxfcmVhc29uID0geyAubmFtZSA9ICJiY21vbHRfcnNzaV9tZWFzdXJlbWVudF9mYWlsX3JlYXNvbiIsIC5kZXNjciA9ICJSU1NJIG1lYXN1cmVtZW50IGZhaWwgcmVhc29uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3Jzc2lfbWVhc3VyZW1lbnRfZmFpbF9yZWFzb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfcnNzaV9tZWFzdXJlbWVudF9mYWlsX3JlYXNvbl9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWxfcmVhc29uX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInRpbWVvdXQiLCAudmFsID0gQkNNT0xUX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTF9SRUFTT05fVElNRU9VVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbF9yZWFzb24gPSB7IC5uYW1lID0gImJjbW9sdF9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWxfcmVhc29uIiwgLmRlc2NyID0gInNlY3VyZSBtdXR1YWwgYXV0aGVudGljYXRpb24gZmFpbCByZWFzb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsX3JlYXNvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWxfcmVhc29uX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3NlcmRlc19yYW5naW5nX21vZGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZWRfbW9kZSIsIC52YWwgPSBCQ01PTFRfU0VSREVTX1JBTkdJTkdfTU9ERV9FRF9NT0RFIH0sIHsgLm5hbWUgPSAiYmNkcl9yZXNldF9tb2RlIiwgLnZhbCA9IEJDTU9MVF9TRVJERVNfUkFOR0lOR19NT0RFX0JDRFJfUkVTRVRfTU9ERSB9LCB7IC5uYW1lID0gImZhc3RfbW9kZSIsIC52YWwgPSBCQ01PTFRfU0VSREVTX1JBTkdJTkdfTU9ERV9GQVNUX01PREUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9zZXJkZXNfcmFuZ2luZ19tb2RlID0geyAubmFtZSA9ICJiY21vbHRfc2VyZGVzX3JhbmdpbmdfbW9kZSIsIC5kZXNjciA9ICJzZXJkZXMgcmFuZ2luZyBtb2RlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3NlcmRlc19yYW5naW5nX21vZGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfc2VyZGVzX3JhbmdpbmdfbW9kZV9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc2VyZGVzX2NvbmZpZ3VyYXRpb25fZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicmFuZ2luZ19tb2RlIiwgLmRlc2NyID0gInJhbmdpbmcgbW9kZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc2VyZGVzX2NvbmZpZ3VyYXRpb24sIHJhbmdpbmdfbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3NlcmRlc19yYW5naW5nX21vZGUgfSwgeyAubmFtZSA9ICJtdWx0aV9lZF9tb2RlIiwgLmRlc2NyID0gIm11bHRpIGVkIG1vZGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uLCBtdWx0aV9lZF9tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiYnVyc3RfZW5hYmxlX3N0YXJ0X29mZnNldCIsIC5kZXNjciA9ICJidXJzdCBlbmFibGUgc3RhcnQgb2Zmc2V0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zZXJkZXNfY29uZmlndXJhdGlvbiwgYnVyc3RfZW5hYmxlX3N0YXJ0X29mZnNldCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJidXJzdF9lbmFibGVfZW5kX29mZnNldCIsIC5kZXNjciA9ICJidXJzdCBlbmFibGUgZW5kIG9mZnNldCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc2VyZGVzX2NvbmZpZ3VyYXRpb24sIGJ1cnN0X2VuYWJsZV9lbmRfb2Zmc2V0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gImVkX2ludmVydGlvbiIsIC5kZXNjciA9ICJlZCBpbnZlcnRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uLCBlZF9pbnZlcnRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9zZXJkZXNfY29uZmlndXJhdGlvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uIiwgLmRlc2NyID0gInNlcmRlcyBjb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfc2VyZGVzX2luc3RhbmNlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImluc3RhbmNlXzAiLCAudmFsID0gQkNNT0xUX1NFUkRFU19JTlNUQU5DRV9JTlNUQU5DRV8wIH0sIHsgLm5hbWUgPSAiaW5zdGFuY2VfMSIsIC52YWwgPSBCQ01PTFRfU0VSREVTX0lOU1RBTkNFX0lOU1RBTkNFXzEgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9zZXJkZXNfaW5zdGFuY2UgPSB7IC5uYW1lID0gImJjbW9sdF9zZXJkZXNfaW5zdGFuY2UiLCAuZGVzY3IgPSAiU2VyRGVzIEluc3RhbmNlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3NlcmRlc19pbnN0YW5jZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9zZXJkZXNfaW5zdGFuY2Vfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3NlcmlhbF9udW1iZXJfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAidmVuZG9yX2lkIiwgLmRlc2NyID0gInZlbmRvciBpZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc2VyaWFsX251bWJlciwgdmVuZG9yX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90X2Fycl80IH0sIHsgLm5hbWUgPSAidmVuZG9yX3NwZWNpZmljIiwgLmRlc2NyID0gInZlbmRvciBzcGVjaWZpYyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc2VyaWFsX251bWJlciwgdmVuZG9yX3NwZWNpZmljKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90X2Fycl80IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc2VyaWFsX251bWJlciA9IHsgLm5hbWUgPSAiYmNtb2x0X3NlcmlhbF9udW1iZXIiLCAuZGVzY3IgPSAic2VyaWFsIG51bWJlciIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9zZXJpYWxfbnVtYmVyKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3NlcmlhbF9udW1iZXJfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfc2VyaWFsX251bWJlcl9maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3NoYXBlcl9tb2RlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImxheWVyXzEiLCAudmFsID0gQkNNT0xUX1NIQVBFUl9NT0RFX0xBWUVSXzEgfSwgeyAubmFtZSA9ICJsYXllcl8yIiwgLnZhbCA9IEJDTU9MVF9TSEFQRVJfTU9ERV9MQVlFUl8yIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc2hhcGVyX21vZGUgPSB7IC5uYW1lID0gImJjbW9sdF9zaGFwZXJfbW9kZSIsIC5kZXNjciA9ICJTaGFwZXIgTW9kZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9zaGFwZXJfbW9kZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9zaGFwZXJfbW9kZV9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZW50cnkiLCAudmFsID0gQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0NGR19JRF9FTlRSWSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBzb2Z0d2FyZV9lcnJvcl9jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInJlc2VydmVkIiwgLnZhbCA9IEJDTU9MVF9TT0ZUV0FSRV9FUlJPUl9LRVlfSURfUkVTRVJWRUQgfSwgeyAubmFtZSA9ICJpbmRleCIsIC52YWwgPSBCQ01PTFRfU09GVFdBUkVfRVJST1JfS0VZX0lEX0lEWCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSBzb2Z0d2FyZV9lcnJvcl9rZXkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3NvbGljaXRlZF9zY2hlZHVsZXJfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYmFuZHdpZHRoX0ticHMiLCAuZGVzY3IgPSAiQmFuZHdpZHRoIChLYnBzKSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc29saWNpdGVkX3NjaGVkdWxlciwgYmFuZHdpZHRoX0ticHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAibWF4X2J1cnN0X3NpemVfdHEiLCAuZGVzY3IgPSAiTWF4IEJ1cnN0IFNpemUgKFRRKSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc29saWNpdGVkX3NjaGVkdWxlciwgbWF4X2J1cnN0X3NpemVfdHEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAicHJpb3JpdHkiLCAuZGVzY3IgPSAiUHJpb3JpdHkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3NvbGljaXRlZF9zY2hlZHVsZXIsIHByaW9yaXR5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAid2VpZ2h0X3RxIiwgLmRlc2NyID0gIldlaWdodCAoVFEpIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zb2xpY2l0ZWRfc2NoZWR1bGVyLCB3ZWlnaHRfdHEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc29saWNpdGVkX3NjaGVkdWxlciA9IHsgLm5hbWUgPSAiYmNtb2x0X3NvbGljaXRlZF9zY2hlZHVsZXIiLCAuZGVzY3IgPSAiU29saWNpdGVkIFNjaGVkdWxlciIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9zb2xpY2l0ZWRfc2NoZWR1bGVyKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3NvbGljaXRlZF9zY2hlZHVsZXJfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfc29saWNpdGVkX3NjaGVkdWxlcl9maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibm9uZSIsIC52YWwgPSBCQ01PTFRfU1RBVF9DT05ESVRJT05fVFlQRV9OT05FIH0sIHsgLm5hbWUgPSAicmF0ZV90aHJlc2hvbGQiLCAudmFsID0gQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfUkFURV9USFJFU0hPTEQgfSwgeyAubmFtZSA9ICJyYXRlX3JhbmdlIiwgLnZhbCA9IEJDTU9MVF9TVEFUX0NPTkRJVElPTl9UWVBFX1JBVEVfUkFOR0UgfSwgeyAubmFtZSA9ICJ2YWx1ZV90aHJlc2hvbGQiLCAudmFsID0gQkNNT0xUX1NUQVRfQ09ORElUSU9OX1RZUEVfVkFMVUVfVEhSRVNIT0xEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9jb25kaXRpb25fdHlwZSA9IHsgLm5hbWUgPSAiYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGUiLCAuZGVzY3IgPSAiQWxsIHBvc3NpYmxlIHN0YXRpc3RpYyBhbGFybSB0cmlnZ2VyIGNvbmRpdGlvbnMuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfc3RhdF9jb25kaXRpb25fdHlwZV9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZ19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJ0eXBlIiwgLmRlc2NyID0gIlR5cGUgb2YgY29uZGl0aW9uIHRvIHRyaWdnZXIgdGhlIGFsYXJtLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZywgdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZ19yYXRlX3RocmVzaG9sZF9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyaXNpbmciLCAuZGVzY3IgPSAiUmlzaW5nIFRocmVzaG9sZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZywgdS5yYXRlX3RocmVzaG9sZC5yaXNpbmcpIC0gb2Zmc2V0b2YoYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWcsIHUucmF0ZV90aHJlc2hvbGQucmlzaW5nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZhbGxpbmciLCAuZGVzY3IgPSAiVGhlIGFsYXJtIGlzIGNsZWFyZWQgaWYgdGhlIHN0YXRzIGRlbHRhIHZhbHVlIHBlciBzZWNvbmQgYmVjb21lcyBsZXNzIHRoYW4gdGhpcyB0aHJlc2hvbGQgbGV2ZWwuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnLCB1LnJhdGVfdGhyZXNob2xkLmZhbGxpbmcpIC0gb2Zmc2V0b2YoYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWcsIHUucmF0ZV90aHJlc2hvbGQucmlzaW5nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWdfcmF0ZV90aHJlc2hvbGQgPSB7IC5uYW1lID0gImJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnX3JhdGVfdGhyZXNob2xkIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBBbGFybSBUcmlnZ2VyIENvbmZpZ3VyYXRpb24gUmF0ZSB0aHJlc2hvbGQiLCAuc2l6ZSA9IHNpemVvZigoKGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnICopMCktPnUucmF0ZV90aHJlc2hvbGQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZ19yYXRlX3RocmVzaG9sZF9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnX3JhdGVfdGhyZXNob2xkX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWdfcmF0ZV9yYW5nZV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJ1cHBlciIsIC5kZXNjciA9ICJUaGUgYWxhcm0gaXMgcmFpc2VkIGlmIHRoZSBzdGF0cyBkZWx0YSB2YWx1ZSBwZXIgc2Vjb25kIGJlY29tZXMgZ3JlYXRlciB0aGFuIHRoaXMgdXBwZXIgbGV2ZWwuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnLCB1LnJhdGVfcmFuZ2UudXBwZXIpIC0gb2Zmc2V0b2YoYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWcsIHUucmF0ZV9yYW5nZS51cHBlciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJsb3dlciIsIC5kZXNjciA9ICJUaGUgYWxhcm0gaXMgcmFpc2VkIGlmIHRoZSBzdGF0cyBkZWx0YSB2YWx1ZSBwZXIgc2Vjb25kIGJlY29tZXMgbGVzcyB0aGFuIHRoaXMgbG93ZXIgbGV2ZWwuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnLCB1LnJhdGVfcmFuZ2UubG93ZXIpIC0gb2Zmc2V0b2YoYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWcsIHUucmF0ZV9yYW5nZS51cHBlciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnX3JhdGVfcmFuZ2UgPSB7IC5uYW1lID0gImJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnX3JhdGVfcmFuZ2UiLCAuZGVzY3IgPSAiU3RhdGlzdGljIEFsYXJtIFRyaWdnZXIgQ29uZmlndXJhdGlvbiBSYXRlIHJhbmdlIiwgLnNpemUgPSBzaXplb2YoKChiY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZyAqKTApLT51LnJhdGVfcmFuZ2UpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZ19yYXRlX3JhbmdlX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWdfcmF0ZV9yYW5nZV9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnX3ZhbHVlX3RocmVzaG9sZF9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJsaW1pdCIsIC5kZXNjciA9ICJUaGUgYWxhcm0gaXMgcmFpc2VkIGlmIHRoZSBzdGF0cyBzYW1wbGUgdmFsdWUgYmVjb21lcyBncmVhdGVyIHRoYW4gdGhpcyBsZXZlbC4gIFRoZSBhbGFybSBpcyBjbGVhcmVkIHdoZW4gdGhlIGhvc3QgY2xlYXJzIHRoZSBzdGF0cy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWcsIHUudmFsdWVfdGhyZXNob2xkLmxpbWl0KSAtIG9mZnNldG9mKGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnLCB1LnZhbHVlX3RocmVzaG9sZC5saW1pdCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnX3ZhbHVlX3RocmVzaG9sZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWdfdmFsdWVfdGhyZXNob2xkIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBBbGFybSBUcmlnZ2VyIENvbmZpZ3VyYXRpb24gVmFsdWUgdGhyZXNob2xkIiwgLnNpemUgPSBzaXplb2YoKChiY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZyAqKTApLT51LnZhbHVlX3RocmVzaG9sZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnX3ZhbHVlX3RocmVzaG9sZF9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnX3ZhbHVlX3RocmVzaG9sZF9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnX3VuaW9uX2ZpZWxkc1tdID0geyB7IH0sIHsgLm5hbWUgPSAidS5yYXRlX3RocmVzaG9sZCIsIC5kZXNjciA9ICIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWcsIHUucmF0ZV90aHJlc2hvbGQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnX3JhdGVfdGhyZXNob2xkIH0sIHsgLm5hbWUgPSAidS5yYXRlX3JhbmdlIiwgLmRlc2NyID0gIiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZywgdS5yYXRlX3JhbmdlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZ19yYXRlX3JhbmdlIH0sIHsgLm5hbWUgPSAidS52YWx1ZV90aHJlc2hvbGQiLCAuZGVzY3IgPSAiIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnLCB1LnZhbHVlX3RocmVzaG9sZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWdfdmFsdWVfdGhyZXNob2xkIH0sIHsgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnID0geyAubmFtZSA9ICJiY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZyIsIC5kZXNjciA9ICJTdGF0aXN0aWMgYWxhcm0gdHJpZ2dlciBjb25maWd1cmF0aW9uLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9zdGF0X2FsYXJtX3RyaWdnZXJfY29uZmlnKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfVU5JT04sIC54ID0geyAudSA9IHsgLm51bV9jb21tb25fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWdfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuY29tbW9uX2ZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fdHJpZ2dlcl9jb25maWdfZmllbGRzLCAuY2xhc3NpZmllcl9pZHggPSAwLCAudW5pb25fZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZ191bmlvbl9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX3NvYWtfY29uZmlnX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFjdGl2ZV9zb2FrX3RpbWUiLCAuZGVzY3IgPSAiQWN0aXZlIFNvYWsgVGltZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc3RhdF9hbGFybV9zb2FrX2NvbmZpZywgYWN0aXZlX3NvYWtfdGltZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJjbGVhcl9zb2FrX3RpbWUiLCAuZGVzY3IgPSAiQ2xlYXIgU29hayBUaW1lIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zdGF0X2FsYXJtX3NvYWtfY29uZmlnLCBjbGVhcl9zb2FrX3RpbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9zb2FrX2NvbmZpZyA9IHsgLm5hbWUgPSAiYmNtb2x0X3N0YXRfYWxhcm1fc29ha19jb25maWciLCAuZGVzY3IgPSAiU3RhdGlzdGljcyBhbGFybSBzb2FraW5nIGNvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfc3RhdF9hbGFybV9zb2FrX2NvbmZpZyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX3NvYWtfY29uZmlnX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fc29ha19jb25maWdfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9jb25maWdfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAidHJpZ2dlciIsIC5kZXNjciA9ICJTdGF0aXN0aWNzIGFsYXJtIHRyaWdnZXIgY29uZmlndXJhdGlvbi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnLCB0cmlnZ2VyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV90cmlnZ2VyX2NvbmZpZyB9LCB7IC5uYW1lID0gInNvYWsiLCAuZGVzY3IgPSAiU3RhdGlzdGljcyBhbGFybSBzb2FraW5nIGNvbmZpZ3VyYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnLCBzb2FrKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9zb2FrX2NvbmZpZyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnID0geyAubmFtZSA9ICJiY21vbHRfc3RhdF9hbGFybV9jb25maWciLCAuZGVzY3IgPSAiU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1Igc3RyaW5nXzEwMCA9IHsgLm5hbWUgPSAic3RyaW5nWzEwMF0iLCAuZGVzY3IgPSAiQVNDSUkgc3RyaW5nIHdpdGggbWF4IGxlbmd0aCAxMDAiLCAuc2l6ZSA9IHNpemVvZihjaGFyWzEwMF0pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJJTkcgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3N0cl8xMDBfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RyIiwgLmRlc2NyID0gIlN0cmluZyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc3RyXzEwMCwgc3RyKSwgLnR5cGUgPSAmc3RyaW5nXzEwMCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3N0cl8xMDAgPSB7IC5uYW1lID0gImJjbW9sdF9zdHJfMTAwIiwgLmRlc2NyID0gIkFTQ0lJIHN0cmluZyB3aXRoIG1heCBsZW5ndGggMTAwIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3N0cl8xMDApLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfc3RyXzEwMF9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9zdHJfMTAwX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1Igc3RyaW5nXzEwMDAgPSB7IC5uYW1lID0gInN0cmluZ1sxMDAwXSIsIC5kZXNjciA9ICJBU0NJSSBzdHJpbmcgd2l0aCBtYXggbGVuZ3RoIDEwMDAiLCAuc2l6ZSA9IHNpemVvZihjaGFyWzEwMDBdKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSSU5HIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9zdHJfMTAwMF9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdHIiLCAuZGVzY3IgPSAiU3RyaW5nIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zdHJfMTAwMCwgc3RyKSwgLnR5cGUgPSAmc3RyaW5nXzEwMDAgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9zdHJfMTAwMCA9IHsgLm5hbWUgPSAiYmNtb2x0X3N0cl8xMDAwIiwgLmRlc2NyID0gIkFTQ0lJIHN0cmluZyB3aXRoIG1heCBsZW5ndGggMTAwMCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9zdHJfMTAwMCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9zdHJfMTAwMF9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9zdHJfMTAwMF9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHN0cmluZ18yMDAwID0geyAubmFtZSA9ICJzdHJpbmdbMjAwMF0iLCAuZGVzY3IgPSAiQVNDSUkgc3RyaW5nIHdpdGggbWF4IGxlbmd0aCAyMDAwIiwgLnNpemUgPSBzaXplb2YoY2hhclsyMDAwXSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUklORyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc3RyXzIwMDBfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RyIiwgLmRlc2NyID0gIlN0cmluZyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc3RyXzIwMDAsIHN0ciksIC50eXBlID0gJnN0cmluZ18yMDAwIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc3RyXzIwMDAgPSB7IC5uYW1lID0gImJjbW9sdF9zdHJfMjAwMCIsIC5kZXNjciA9ICJBU0NJSSBzdHJpbmcgd2l0aCBtYXggbGVuZ3RoIDIwMDAiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfc3RyXzIwMDApLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfc3RyXzIwMDBfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfc3RyXzIwMDBfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiBzdHJpbmdfMjU2ID0geyAubmFtZSA9ICJzdHJpbmdbMjU2XSIsIC5kZXNjciA9ICJBU0NJSSBzdHJpbmcgd2l0aCBtYXggbGVuZ3RoIDI1NiIsIC5zaXplID0gc2l6ZW9mKGNoYXJbMjU2XSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUklORyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc3RyXzI1Nl9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdHIiLCAuZGVzY3IgPSAiU3RyaW5nIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zdHJfMjU2LCBzdHIpLCAudHlwZSA9ICZzdHJpbmdfMjU2IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc3RyXzI1NiA9IHsgLm5hbWUgPSAiYmNtb2x0X3N0cl8yNTYiLCAuZGVzY3IgPSAiQVNDSUkgc3RyaW5nIHdpdGggbWF4IGxlbmd0aCAyNTYiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfc3RyXzI1NiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9zdHJfMjU2X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3N0cl8yNTZfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc3RyXzY0X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0ciIsIC5kZXNjciA9ICJTdHJpbmciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3N0cl82NCwgc3RyKSwgLnR5cGUgPSAmc3RyaW5nXzY0IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc3RyXzY0ID0geyAubmFtZSA9ICJiY21vbHRfc3RyXzY0IiwgLmRlc2NyID0gIkFTQ0lJIHN0cmluZyB3aXRoIG1heCBsZW5ndGggNjQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfc3RyXzY0KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3N0cl82NF9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9zdHJfNjRfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc3dfZXJyb3JfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZmlyc3RfZXJyb3JfdGltZV91cyIsIC5kZXNjciA9ICJUaW1lc3RhbXAgKGluIHVzKSB3aGVuIGhpcyBlcnJvciBmaXJzdCBvY2N1cnJlZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc3dfZXJyb3IsIGZpcnN0X2Vycm9yX3RpbWVfdXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAibGFzdF9lcnJvcl90aW1lX3VzIiwgLmRlc2NyID0gIlRpbWVzdGFtcCAoaW4gdXMpIHdoZW4gaGlzIGVycm9yIGxhc3Qgb2NjdXJyZWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3N3X2Vycm9yLCBsYXN0X2Vycm9yX3RpbWVfdXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAibGluZV9udW1iZXIiLCAuZGVzY3IgPSAiTGluZSBOdW1iZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3N3X2Vycm9yLCBsaW5lX251bWJlciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJlcnJvcl9jb3VudGVyIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBlcnJvciBoYXMgb2NjdXJyZWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3N3X2Vycm9yLCBlcnJvcl9jb3VudGVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImluc3RhbmNlIiwgLmRlc2NyID0gIkluc3RhbmNlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zd19lcnJvciwgaW5zdGFuY2UpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiZmlsZW5hbWUiLCAuZGVzY3IgPSAiRmlsZW5hbWUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3N3X2Vycm9yLCBmaWxlbmFtZSksIC50eXBlID0gJnN0cmluZ182NCB9LCB7IC5uYW1lID0gInRhc2tfbmFtZSIsIC5kZXNjciA9ICJUYXNrIE5hbWUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3N3X2Vycm9yLCB0YXNrX25hbWUpLCAudHlwZSA9ICZzdHJpbmdfNjQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9zd19lcnJvciA9IHsgLm5hbWUgPSAiYmNtb2x0X3N3X2Vycm9yIiwgLmRlc2NyID0gIlNXIEVycm9yIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3N3X2Vycm9yKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3N3X2Vycm9yX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3N3X2Vycm9yX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfc3dpdGNoX292ZXJfdHlwZV9jX29udV9zdGF0ZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhY3RpdmUiLCAudmFsID0gQkNNT0xUX1NXSVRDSF9PVkVSX1RZUEVfQ19PTlVfU1RBVEVfQUNUSVZFIH0sIHsgLm5hbWUgPSAiYWN0aXZlX3N0YW5kYnkiLCAudmFsID0gQkNNT0xUX1NXSVRDSF9PVkVSX1RZUEVfQ19PTlVfU1RBVEVfQUNUSVZFX1NUQU5EQlkgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9zd2l0Y2hfb3Zlcl90eXBlX2Nfb251X3N0YXRlID0geyAubmFtZSA9ICJiY21vbHRfc3dpdGNoX292ZXJfdHlwZV9jX29udV9zdGF0ZSIsIC5kZXNjciA9ICJTd2l0Y2ggb3ZlciB0eXBlIGMgb251IHN0YXRlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3N3aXRjaF9vdmVyX3R5cGVfY19vbnVfc3RhdGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfc3dpdGNoX292ZXJfdHlwZV9jX29udV9zdGF0ZV9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9zeXN0ZW1fbW9kZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJncG9uX18xNl94IiwgLnZhbCA9IEJDTU9MVF9TWVNURU1fTU9ERV9HUE9OX18xNl9YIH0sIHsgLm5hbWUgPSAiZ3Bvbl9fOF94IiwgLnZhbCA9IEJDTU9MVF9TWVNURU1fTU9ERV9HUE9OX184X1ggfSwgeyAubmFtZSA9ICJncG9uX180X3giLCAudmFsID0gQkNNT0xUX1NZU1RFTV9NT0RFX0dQT05fXzRfWCB9LCB7IC5uYW1lID0gImVwb25fXzE2X3giLCAudmFsID0gQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzE2X1ggfSwgeyAubmFtZSA9ICJ4Z3Bvbl8xX184X3giLCAudmFsID0gQkNNT0xUX1NZU1RFTV9NT0RFX1hHUE9OXzFfXzhfWCB9LCB7IC5uYW1lID0gImVwb25fXzhfeF9jb2V4aXN0ZW5jZV90ZG1hIiwgLnZhbCA9IEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX184X1hfQ09FWElTVEVOQ0VfVERNQSB9LCB7IC5uYW1lID0gImFlXzhfeCIsIC52YWwgPSBCQ01PTFRfU1lTVEVNX01PREVfQUVfOF9YIH0sIHsgLm5hbWUgPSAiZXBvbl9fOF94XzEwX2ciLCAudmFsID0gQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzhfWF8xMF9HIH0sIHsgLm5hbWUgPSAiZ3Bvbl84X3hncG9uXzRfeF9jb2V4aXN0ZW5jZSIsIC52YWwgPSBCQ01PTFRfU1lTVEVNX01PREVfR1BPTl84X1hHUE9OXzRfWF9DT0VYSVNURU5DRSB9LCB7IC5uYW1lID0gImVwb25fXzhfeCIsIC52YWwgPSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fOF9YIH0sIHsgLm5hbWUgPSAiZXBvbl9fNF94IiwgLnZhbCA9IEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX180X1ggfSwgeyAubmFtZSA9ICJlcG9uX180X3hfY29leGlzdGVuY2VfdGRtYSIsIC52YWwgPSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fNF9YX0NPRVhJU1RFTkNFX1RETUEgfSwgeyAubmFtZSA9ICJlcG9uX180X3hfMTBfZyIsIC52YWwgPSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fNF9YXzEwX0cgfSwgeyAubmFtZSA9ICJ4Z3NfXzJfeF8xMF9nIiwgLnZhbCA9IEJDTU9MVF9TWVNURU1fTU9ERV9YR1NfXzJfWF8xMF9HIH0sIHsgLm5hbWUgPSAibmdwb24yX18yX3hfMTBfZyIsIC52YWwgPSBCQ01PTFRfU1lTVEVNX01PREVfTkdQT04yX18yX1hfMTBfRyB9LCB7IC5uYW1lID0gIm5ncG9uMl9fOF94XzJfcF81X2ciLCAudmFsID0gQkNNT0xUX1NZU1RFTV9NT0RFX05HUE9OMl9fOF9YXzJfUF81X0cgfSwgeyAubmFtZSA9ICJ4Z3Bvbl8xX180X3giLCAudmFsID0gQkNNT0xUX1NZU1RFTV9NT0RFX1hHUE9OXzFfXzRfWCB9LCB7IC5uYW1lID0gImVwb25fXzJfeF8xMF9nIiwgLnZhbCA9IEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX18yX1hfMTBfRyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3N5c3RlbV9tb2RlID0geyAubmFtZSA9ICJiY21vbHRfc3lzdGVtX21vZGUiLCAuZGVzY3IgPSAiU3lzdGVtIHdvcmtpbmcgbW9kZSAoR1BPTi9FUE9OIGV0Yy4pIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3N5c3RlbV9tb2RlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3N5c3RlbV9tb2RlX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3VzX29wZXJhdGluZ193YXZlbGVuZ3RoX2JhbmRzX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImV4cGFuZGVkX3NwZWN0cnVtX3dpZGVfYmFuZCIsIC52YWwgPSBCQ01PTFRfVVNfT1BFUkFUSU5HX1dBVkVMRU5HVEhfQkFORFNfRVhQQU5ERURfU1BFQ1RSVU1fV0lERV9CQU5EIH0sIHsgLm5hbWUgPSAiZXhwYW5kZWRfc3BlY3RydW1fcmVkdWNlZF9iYW5kIiwgLnZhbCA9IEJDTU9MVF9VU19PUEVSQVRJTkdfV0FWRUxFTkdUSF9CQU5EU19FWFBBTkRFRF9TUEVDVFJVTV9SRURVQ0VEX0JBTkQgfSwgeyAubmFtZSA9ICJleHBhbmRlZF9zcGVjdHJ1bV9uYXJyb3dfYmFuZCIsIC52YWwgPSBCQ01PTFRfVVNfT1BFUkFUSU5HX1dBVkVMRU5HVEhfQkFORFNfRVhQQU5ERURfU1BFQ1RSVU1fTkFSUk9XX0JBTkQgfSwgeyAubmFtZSA9ICJzaGFyZWRfc3BlY3RydW1fd2lkZV9iYW5kIiwgLnZhbCA9IEJDTU9MVF9VU19PUEVSQVRJTkdfV0FWRUxFTkdUSF9CQU5EU19TSEFSRURfU1BFQ1RSVU1fV0lERV9CQU5EIH0sIHsgLm5hbWUgPSAic2hhcmVkX3NwZWN0cnVtX3JlZHVjZWRfYmFuZCIsIC52YWwgPSBCQ01PTFRfVVNfT1BFUkFUSU5HX1dBVkVMRU5HVEhfQkFORFNfU0hBUkVEX1NQRUNUUlVNX1JFRFVDRURfQkFORCB9LCB7IC5uYW1lID0gInNoYXJlZF9zcGVjdHJ1bV9uYXJyb3dfYmFuZCIsIC52YWwgPSBCQ01PTFRfVVNfT1BFUkFUSU5HX1dBVkVMRU5HVEhfQkFORFNfU0hBUkVEX1NQRUNUUlVNX05BUlJPV19CQU5EIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdXNfb3BlcmF0aW5nX3dhdmVsZW5ndGhfYmFuZHMgPSB7IC5uYW1lID0gImJjbW9sdF91c19vcGVyYXRpbmdfd2F2ZWxlbmd0aF9iYW5kcyIsIC5kZXNjciA9ICJVUyBvcGVyYXRpbmcgd2F2ZWxlbmd0aCBiYW5kcyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF91c19vcGVyYXRpbmdfd2F2ZWxlbmd0aF9iYW5kcyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF91c19vcGVyYXRpbmdfd2F2ZWxlbmd0aF9iYW5kc19zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc3lzdGVtX3Byb2ZpbGVfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibmdfMl9zeXNfaWQiLCAuZGVzY3IgPSAiMjAtYml0IGlkZW50aWZpZXIgb2YgdGhlIE5HUE9OMiBzeXN0ZW0iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3N5c3RlbV9wcm9maWxlLCBuZ18yX3N5c19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJ2ZXJzaW9uIiwgLmRlc2NyID0gIlN5c3RlbSBwcm9maWxlIHZlcnNpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3N5c3RlbV9wcm9maWxlLCB2ZXJzaW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAiY2hhbm5lbF9zcGFjaW5nIiwgLmRlc2NyID0gIkFuIGludGVnZXIgaW5kaWNhdGluZyB0aGUgY2hhbm5lbCBzcGFjaW5nIGluIHVuaXRzIG9mIDFHSHoiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3N5c3RlbV9wcm9maWxlLCBjaGFubmVsX3NwYWNpbmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJ1c19vcGVyYXRpbmdfd2F2ZWxlbmd0aF9iYW5kcyIsIC5kZXNjciA9ICJVcHN0cmVhbSBvcGVyYXRpbmcgd2F2ZWxlbmd0aCBiYW5kcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc3lzdGVtX3Byb2ZpbGUsIHVzX29wZXJhdGluZ193YXZlbGVuZ3RoX2JhbmRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdXNfb3BlcmF0aW5nX3dhdmVsZW5ndGhfYmFuZHMgfSwgeyAubmFtZSA9ICJ1c19tc2UiLCAuZGVzY3IgPSAiVXBzdHJlYW0gTWF4aW11bSBTcGVjdHJhbCBFeGN1cnNpb24gKE1TRSkgcmVwcmVzZW50ZWQgYXMgYW4gdW5zaWduZWQgaW50ZWdlciBpbmRpY2F0aW5nIHRoZSB2YWx1ZSBpbiB1bml0cyBvZiAxR0h6IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zeXN0ZW1fcHJvZmlsZSwgdXNfbXNlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAibG9vc2VfY2FsaWJyYXRpb25fYm91bmQiLCAuZGVzY3IgPSAiU3BlY3RyYWwgZXhjdXJzaW9uIGJvdW5kIGJlbG93IHdoaWNoIGEgVFdETSBPTlUgY2FuIGJlIGNvbnNpZGVyZWQgYXMgbG9vc2VseSBjYWxpYnJhdGVkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zeXN0ZW1fcHJvZmlsZSwgbG9vc2VfY2FsaWJyYXRpb25fYm91bmQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jYWxpYnJhdGlvbl9yZWNvcmQgfSwgeyAubmFtZSA9ICJmc3IiLCAuZGVzY3IgPSAiSWYgYSBjeWNsaWMgV00gaXMgdXNlZCBpbiB0aGUgdXBzdHJlYW0sIEZyZWUgU3BlY3RyYWwgUmFuZ2UgaW5kaWNhdGVzIHRoZSB2YWx1ZSBpbiB1bml0cyBvZiAwLjEgR0h6IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zeXN0ZW1fcHJvZmlsZSwgZnNyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gInR3ZG1fY2hhbm5lbF9jb3VudCIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIENoYW5uZWxfUHJvZmlsZSBQTE9BTSBtZXNzYWdlcyB3aXRoIGRpc3RpbmN0IENoYW5uZWwgUHJvZmlsZSBpbmRpY2VzIHRoYXQgYW4gT05VIGNhbiBleHBlY3QgdG8gcmVjZWl2ZSB3aGlsZSBsaXN0ZW5pbmcgdG8gdGhpcyBkb3duc3RyZWFtIHdhdmVsZW5ndGggY2hhbm5lbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc3lzdGVtX3Byb2ZpbGUsIHR3ZG1fY2hhbm5lbF9jb3VudCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3N5c3RlbV9wcm9maWxlID0geyAubmFtZSA9ICJiY21vbHRfc3lzdGVtX3Byb2ZpbGUiLCAuZGVzY3IgPSAiU3lzdGVtIHByb2ZpbGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfc3lzdGVtX3Byb2ZpbGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfc3lzdGVtX3Byb2ZpbGVfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfc3lzdGVtX3Byb2ZpbGVfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF90cmFmZmljX3Jlc3VtZV9yZXN1bHRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3VjY2VzcyIsIC52YWwgPSBCQ01PTFRfVFJBRkZJQ19SRVNVTUVfUkVTVUxUX1NVQ0NFU1MgfSwgeyAubmFtZSA9ICJmYWlsdXJlIiwgLnZhbCA9IEJDTU9MVF9UUkFGRklDX1JFU1VNRV9SRVNVTFRfRkFJTFVSRSB9LCB7IC5uYW1lID0gInN1c3BlY3RlZF9sb3MiLCAudmFsID0gQkNNT0xUX1RSQUZGSUNfUkVTVU1FX1JFU1VMVF9TVVNQRUNURURfTE9TIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdHJhZmZpY19yZXN1bWVfcmVzdWx0ID0geyAubmFtZSA9ICJiY21vbHRfdHJhZmZpY19yZXN1bWVfcmVzdWx0IiwgLmRlc2NyID0gIlRyYWZmaWMgcmVzdW1lIHJlc3VsdCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF90cmFmZmljX3Jlc3VtZV9yZXN1bHQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfdHJhZmZpY19yZXN1bWVfcmVzdWx0X3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJjYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0FVVE9fQ0ZHX0lEX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHRyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZGF0YV93aW5kb3ciLCAudmFsID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9EQVRBX1dJTkRPVyB9LCB7IC5uYW1lID0gInN0cm9iZV93aW5kb3ciLCAudmFsID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9TVFJPQkVfV0lORE9XIH0sIHsgLm5hbWUgPSAiZWRnZV9yaXNlX21pbl9taW4iLCAudmFsID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9FREdFX1JJU0VfTUlOX01JTiB9LCB7IC5uYW1lID0gImVkZ2VfcmlzZV9taW5fbWF4IiwgLnZhbCA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9SSVNFX01JTl9NQVggfSwgeyAubmFtZSA9ICJlZGdlX3Jpc2VfbWF4X21pbiIsIC52YWwgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfUklTRV9NQVhfTUlOIH0sIHsgLm5hbWUgPSAiZWRnZV9yaXNlX21heF9tYXgiLCAudmFsID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9FREdFX1JJU0VfTUFYX01BWCB9LCB7IC5uYW1lID0gImVkZ2VfZmFsbF9taW5fbWluIiwgLnZhbCA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9GQUxMX01JTl9NSU4gfSwgeyAubmFtZSA9ICJlZGdlX2ZhbGxfbWluX21heCIsIC52YWwgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfRkFMTF9NSU5fTUFYIH0sIHsgLm5hbWUgPSAiZWRnZV9mYWxsX21heF9taW4iLCAudmFsID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9FREdFX0ZBTExfTUFYX01JTiB9LCB7IC5uYW1lID0gImVkZ2VfZmFsbF9tYXhfbWF4IiwgLnZhbCA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9GQUxMX01BWF9NQVggfSwgeyAubmFtZSA9ICJyZXN1bHQiLCAudmFsID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9SRVNVTFQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicmVzZXJ2ZWQiLCAudmFsID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9LRVlfSURfUkVTRVJWRUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5X2lkID0geyAubmFtZSA9ICJiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB0cnhfY2FsaWJyYXRpb25fa2V5IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInBvbl9uaSIsIC52YWwgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1BPTl9OSSB9LCB7IC5uYW1lID0gInRyaWdnZXIiLCAudmFsID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9UUklHR0VSIH0sIHsgLm5hbWUgPSAic3Ryb2JlIiwgLnZhbCA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfU1RST0JFIH0sIHsgLm5hbWUgPSAid2luZG93X21vZGUiLCAudmFsID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9XSU5ET1dfTU9ERSB9LCB7IC5uYW1lID0gIm9udV9pZCIsIC52YWwgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX09OVV9JRCB9LCB7IC5uYW1lID0gInRyaWdnZXJfcG9zaXRpb24iLCAudmFsID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9UUklHR0VSX1BPU0lUSU9OIH0sIHsgLm5hbWUgPSAic3RvcF9kdWVfdG9fY29ycnVwdF9zdHJvYmUiLCAudmFsID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9TVE9QX0RVRV9UT19DT1JSVVBUX1NUUk9CRSB9LCB7IC5uYW1lID0gInN0YXJ0X29mZnNldCIsIC52YWwgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1NUQVJUX09GRlNFVCB9LCB7IC5uYW1lID0gImVuZF9vZmZzZXQiLCAudmFsID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9FTkRfT0ZGU0VUIH0sIHsgLm5hbWUgPSAibnVtYmVyX29mX2N5Y2xlcyIsIC52YWwgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX05VTUJFUl9PRl9DWUNMRVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfaWQgPSB7IC5uYW1lID0gImJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInBvbl9uaSIsIC52YWwgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUT1BfQ0FQVFVSRV9XSU5ET1dfSURfUE9OX05JIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfaWQgPSB7IC5uYW1lID0gImJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvd19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB0cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvdyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3RyaWdnZXJfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZXBvbl9zdGF0IiwgLnZhbCA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fVFJJR0dFUl9FUE9OX1NUQVQgfSwgeyAubmFtZSA9ICJncG9uX2JjZHJfcmVzZXQiLCAudmFsID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9UUklHR0VSX0dQT05fQkNEUl9SRVNFVCB9LCB7IC5uYW1lID0gImdwb25fdHJ4X3Jlc2V0IiwgLnZhbCA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fVFJJR0dFUl9HUE9OX1RSWF9SRVNFVCB9LCB7IC5uYW1lID0gImdwb25fdHJ4X2VkIiwgLnZhbCA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fVFJJR0dFUl9HUE9OX1RSWF9FRCB9LCB7IC5uYW1lID0gImdwb25fcnNzaSIsIC52YWwgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1RSSUdHRVJfR1BPTl9SU1NJIH0sIHsgLm5hbWUgPSAiZ3Bvbl9lb2IiLCAudmFsID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9UUklHR0VSX0dQT05fRU9CIH0sIHsgLm5hbWUgPSAiZ3Bvbl9yYW5naW5nIiwgLnZhbCA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fVFJJR0dFUl9HUE9OX1JBTkdJTkcgfSwgeyAubmFtZSA9ICJzZXJkZXNfYnVyc3RfZW4iLCAudmFsID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9UUklHR0VSX1NFUkRFU19CVVJTVF9FTiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyID0geyAubmFtZSA9ICJiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3RyaWdnZXIiLCAuZGVzY3IgPSAidHJ4IGNhbGlicmF0aW9uIHRyaWdnZXIiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3RyaWdnZXIpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3RyaWdnZXJfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3RyaWdnZXJfcG9zaXRpb25fc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicmlzaW5nIiwgLnZhbCA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fVFJJR0dFUl9QT1NJVElPTl9SSVNJTkcgfSwgeyAubmFtZSA9ICJmYWxsaW5nIiwgLnZhbCA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fVFJJR0dFUl9QT1NJVElPTl9GQUxMSU5HIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdHJ4X2NhbGlicmF0aW9uX3RyaWdnZXJfcG9zaXRpb24gPSB7IC5uYW1lID0gImJjbW9sdF90cnhfY2FsaWJyYXRpb25fdHJpZ2dlcl9wb3NpdGlvbiIsIC5kZXNjciA9ICJ0cnggY2FsaWJyYXRpb24gdHJpZ2dlciBwb3NpdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fdHJpZ2dlcl9wb3NpdGlvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fdHJpZ2dlcl9wb3NpdGlvbl9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fd2luZG93X21vZGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicmFuZ2luZyIsIC52YWwgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1dJTkRPV19NT0RFX1JBTkdJTkcgfSwgeyAubmFtZSA9ICJub25fcmFuZ2luZyIsIC52YWwgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1dJTkRPV19NT0RFX05PTl9SQU5HSU5HIH0sIHsgLm5hbWUgPSAiYm90aCIsIC52YWwgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1dJTkRPV19NT0RFX0JPVEggfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF90cnhfY2FsaWJyYXRpb25fd2luZG93X21vZGUgPSB7IC5uYW1lID0gImJjbW9sdF90cnhfY2FsaWJyYXRpb25fd2luZG93X21vZGUiLCAuZGVzY3IgPSAidHJ4IGNhbGlicmF0aW9uIHdpbmRvdyBtb2RlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl93aW5kb3dfbW9kZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF90cnhfY2FsaWJyYXRpb25fd2luZG93X21vZGVfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl91aW50OF90X2Fycl8zID0geyAubmFtZSA9ICJ1aW50OF90WzNdIiwgLmRlc2NyID0gIkFycmF5IG9mIDMgZWxlbWVudHMgb2YgdHlwZSB1aW50OF90IiwgLnNpemUgPSBzaXplb2YodWludDhfdFszXSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9GSVhFRCwgLnggPSB7IC5hcnJfZml4ZWQgPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90LCAuc2l6ZSA9IDMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF90cnhfZGVsaW1pdGVyX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBhdHRlcm4iLCAuZGVzY3IgPSAicGF0dGVybiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2RlbGltaXRlciwgcGF0dGVybiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdF9hcnJfMyB9LCB7IC5uYW1lID0gInNpemUiLCAuZGVzY3IgPSAiU2l6ZSBpbiBieXRlcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2RlbGltaXRlciwgc2l6ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gIndpbmRvd19zaXplIiwgLmRlc2NyID0gIldpbmRvdyBzaXplIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfZGVsaW1pdGVyLCB3aW5kb3dfc2l6ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3RyeF9kZWxpbWl0ZXIgPSB7IC5uYW1lID0gImJjbW9sdF90cnhfZGVsaW1pdGVyIiwgLmRlc2NyID0gIlRSWCBEZWxpbWl0ZXIiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfdHJ4X2RlbGltaXRlciksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF90cnhfZGVsaW1pdGVyX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3RyeF9kZWxpbWl0ZXJfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdHJ4X2VuZXJneV9kZXRlY3RfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicmFuZ2luZ19lZF9zb3VyY2UiLCAuZGVzY3IgPSAiUmFuZ2luZyBFRCBzb3VyY2UiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0LCByYW5naW5nX2VkX3NvdXJjZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2VuZXJneV9kZXRlY3Rfc291cmNlIH0sIHsgLm5hbWUgPSAiZGVsaW1pdGVyX2VkX3NvdXJjZSIsIC5kZXNjciA9ICJEZWxpbWl0ZXIgRUQgc291cmNlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfZW5lcmd5X2RldGVjdCwgZGVsaW1pdGVyX2VkX3NvdXJjZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2VuZXJneV9kZXRlY3Rfc291cmNlIH0sIHsgLm5hbWUgPSAibWluaW11bV90aHJlc2hvbGQiLCAuZGVzY3IgPSAiTWluaW11bSB0aHJlc2hvbGQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0LCBtaW5pbXVtX3RocmVzaG9sZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gIm1heGltdW1fdGhyZXNob2xkIiwgLmRlc2NyID0gIk1heGltdW0gdGhyZXNob2xkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfZW5lcmd5X2RldGVjdCwgbWF4aW11bV90aHJlc2hvbGQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJlZF9wYXR0ZXJuIiwgLmRlc2NyID0gIkVEIHBhdHRlcm4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0LCBlZF9wYXR0ZXJuKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAiZWRfcGF0dGVybl9zaXplIiwgLmRlc2NyID0gIkVEIHBhdHRlcm4gc2l6ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2VuZXJneV9kZXRlY3QsIGVkX3BhdHRlcm5fc2l6ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gIndpbmRvd19zaXplIiwgLmRlc2NyID0gIldpbmRvdyBzaXplIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfZW5lcmd5X2RldGVjdCwgd2luZG93X3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJpbnZlcnNpb24iLCAuZGVzY3IgPSAiSW52ZXJzaW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfZW5lcmd5X2RldGVjdCwgaW52ZXJzaW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAibm9fZWRfdGhyZXNob2xkIiwgLmRlc2NyID0gIm5vIGVkIHRocmVzaG9sZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2VuZXJneV9kZXRlY3QsIG5vX2VkX3RocmVzaG9sZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0ID0geyAubmFtZSA9ICJiY21vbHRfdHJ4X2VuZXJneV9kZXRlY3QiLCAuZGVzY3IgPSAiVFJYIEVuZXJneSBkZXRlY3QiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfdHJ4X2VuZXJneV9kZXRlY3QpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfdHJ4X2VuZXJneV9kZXRlY3RfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfdHJ4X2VuZXJneV9kZXRlY3RfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdHJ4X3ByZWFtYmxlX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInR5cGVfMV9zaXplIiwgLmRlc2NyID0gIlR5cGUgMSBzaXplIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfcHJlYW1ibGUsIHR5cGVfMV9zaXplKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAidHlwZV8yX3NpemUiLCAuZGVzY3IgPSAiVHlwZSAyIHNpemUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9wcmVhbWJsZSwgdHlwZV8yX3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJ0eXBlXzNfcHJlX3Jhbmdpbmdfc2l6ZSIsIC5kZXNjciA9ICJUeXBlIDMgcHJlIHJhbmdpbmcgc2l6ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X3ByZWFtYmxlLCB0eXBlXzNfcHJlX3Jhbmdpbmdfc2l6ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInR5cGVfM19wb3N0X3Jhbmdpbmdfc2l6ZSIsIC5kZXNjciA9ICJUeXBlIDMgcG9zdCByYW5naW5nIHNpemUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9wcmVhbWJsZSwgdHlwZV8zX3Bvc3RfcmFuZ2luZ19zaXplKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAidHlwZV8zX3BhdHRlcm4iLCAuZGVzY3IgPSAiVHlwZSAzIHBhdHRlcm4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9wcmVhbWJsZSwgdHlwZV8zX3BhdHRlcm4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF90cnhfcHJlYW1ibGUgPSB7IC5uYW1lID0gImJjbW9sdF90cnhfcHJlYW1ibGUiLCAuZGVzY3IgPSAiVFJYIFByZWFtYmxlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3RyeF9wcmVhbWJsZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF90cnhfcHJlYW1ibGVfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfdHJ4X3ByZWFtYmxlX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3RyeF9yeF9jb25maWd1cmF0aW9uX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIndhaXRfd2luZG93X3NpemUiLCAuZGVzY3IgPSAiV2FpdCBXaW5kb3cgc2l6ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X3J4X2NvbmZpZ3VyYXRpb24sIHdhaXRfd2luZG93X3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJyYW5naW5nX2FjY2Vzc193aW5kb3dfc2l6ZSIsIC5kZXNjciA9ICJSYW5naW5nIGFjY2VzcyB3aW5kb3cgc2l6ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X3J4X2NvbmZpZ3VyYXRpb24sIHJhbmdpbmdfYWNjZXNzX3dpbmRvd19zaXplKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdHJ4X3J4X2NvbmZpZ3VyYXRpb24gPSB7IC5uYW1lID0gImJjbW9sdF90cnhfcnhfY29uZmlndXJhdGlvbiIsIC5kZXNjciA9ICJUUlggUlggY29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF90cnhfcnhfY29uZmlndXJhdGlvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF90cnhfcnhfY29uZmlndXJhdGlvbl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF90cnhfcnhfY29uZmlndXJhdGlvbl9maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3RyeF90eXBlX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInNwc180M180OF9oX2hwX2NkZV9zZF8yMDEzIiwgLnZhbCA9IEJDTU9MVF9UUlhfVFlQRV9TUFNfNDNfNDhfSF9IUF9DREVfU0RfMjAxMyB9LCB7IC5uYW1lID0gInNvZ180MzIxX3BzZ2IiLCAudmFsID0gQkNNT0xUX1RSWF9UWVBFX1NPR180MzIxX1BTR0IgfSwgeyAubmFtZSA9ICJsdGVfMzY4MF9tIiwgLnZhbCA9IEJDTU9MVF9UUlhfVFlQRV9MVEVfMzY4MF9NIH0sIHsgLm5hbWUgPSAic291cmNlX3Bob3RvbmljcyIsIC52YWwgPSBCQ01PTFRfVFJYX1RZUEVfU09VUkNFX1BIT1RPTklDUyB9LCB7IC5uYW1lID0gImx0ZV8zNjgwX3BfdHlwZV9jX3BsdXMiLCAudmFsID0gQkNNT0xUX1RSWF9UWVBFX0xURV8zNjgwX1BfVFlQRV9DX1BMVVMgfSwgeyAubmFtZSA9ICJhbnkiLCAudmFsID0gQkNNT0xUX1RSWF9UWVBFX0FOWSB9LCB7IC5uYW1lID0gImFueV9yZXNldF9ndWFyZCIsIC52YWwgPSBCQ01PTFRfVFJYX1RZUEVfQU5ZX1JFU0VUX0dVQVJEIH0sIHsgLm5hbWUgPSAiYW55X3Jlc2V0X3ByZWFtYmxlIiwgLnZhbCA9IEJDTU9MVF9UUlhfVFlQRV9BTllfUkVTRVRfUFJFQU1CTEUgfSwgeyAubmFtZSA9ICJ3dGRfcnR4bV8xNjdfNTI2X2NwbHVzIiwgLnZhbCA9IEJDTU9MVF9UUlhfVFlQRV9XVERfUlRYTV8xNjdfNTI2X0NQTFVTIH0sIHsgLm5hbWUgPSAid3RkX3J0eG1fMTY3XzUyMl9icGx1cyIsIC52YWwgPSBCQ01PTFRfVFJYX1RZUEVfV1REX1JUWE1fMTY3XzUyMl9CUExVUyB9LCB7IC5uYW1lID0gImx0ZV8zNjgwX3BfYmMiLCAudmFsID0gQkNNT0xUX1RSWF9UWVBFX0xURV8zNjgwX1BfQkMgfSwgeyAubmFtZSA9ICJzb2dxXzQzMjFfcHNnYl9jX3BsdXMiLCAudmFsID0gQkNNT0xUX1RSWF9UWVBFX1NPR1FfNDMyMV9QU0dCX0NfUExVUyB9LCB7IC5uYW1lID0gInd0ZF9ydHhtMTY3XzUyMSIsIC52YWwgPSBCQ01PTFRfVFJYX1RZUEVfV1REX1JUWE0xNjdfNTIxIH0sIHsgLm5hbWUgPSAibHRlMzY3OCIsIC52YWwgPSBCQ01PTFRfVFJYX1RZUEVfTFRFMzY3OCB9LCB7IC5uYW1lID0gInNvZ3BfNDMyMV9wc2dhIiwgLnZhbCA9IEJDTU9MVF9UUlhfVFlQRV9TT0dQXzQzMjFfUFNHQSB9LCB7IC5uYW1lID0gImdwb25fZ2VuZXJhbF8xIiwgLnZhbCA9IEJDTU9MVF9UUlhfVFlQRV9HUE9OX0dFTkVSQUxfMSB9LCB7IC5uYW1lID0gImdwb25fZ2VuZXJhbF8yIiwgLnZhbCA9IEJDTU9MVF9UUlhfVFlQRV9HUE9OX0dFTkVSQUxfMiB9LCB7IC5uYW1lID0gImdwb25fZ2VuZXJhbF8zIiwgLnZhbCA9IEJDTU9MVF9UUlhfVFlQRV9HUE9OX0dFTkVSQUxfMyB9LCB7IC5uYW1lID0gImdwb25fZ2VuZXJhbF80IiwgLnZhbCA9IEJDTU9MVF9UUlhfVFlQRV9HUE9OX0dFTkVSQUxfNCB9LCB7IC5uYW1lID0gImdwb25fZ2VuZXJhbF81IiwgLnZhbCA9IEJDTU9MVF9UUlhfVFlQRV9HUE9OX0dFTkVSQUxfNSB9LCB7IC5uYW1lID0gImdwb25fZ2VuZXJhbF82IiwgLnZhbCA9IEJDTU9MVF9UUlhfVFlQRV9HUE9OX0dFTkVSQUxfNiB9LCB7IC5uYW1lID0gImdwb25fZ2VuZXJhbF83IiwgLnZhbCA9IEJDTU9MVF9UUlhfVFlQRV9HUE9OX0dFTkVSQUxfNyB9LCB7IC5uYW1lID0gImdwb25fZ2VuZXJhbF84IiwgLnZhbCA9IEJDTU9MVF9UUlhfVFlQRV9HUE9OX0dFTkVSQUxfOCB9LCB7IC5uYW1lID0gImdwb25fZ2VuZXJhbF85IiwgLnZhbCA9IEJDTU9MVF9UUlhfVFlQRV9HUE9OX0dFTkVSQUxfOSB9LCB7IC5uYW1lID0gImdwb25fZ2VuZXJhbF8xMCIsIC52YWwgPSBCQ01PTFRfVFJYX1RZUEVfR1BPTl9HRU5FUkFMXzEwIH0sIHsgLm5hbWUgPSAiZ3Bvbl9nZW5lcmFsXzExIiwgLnZhbCA9IEJDTU9MVF9UUlhfVFlQRV9HUE9OX0dFTkVSQUxfMTEgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF90cnhfdHlwZSA9IHsgLm5hbWUgPSAiYmNtb2x0X3RyeF90eXBlIiwgLmRlc2NyID0gIlRSWCB0eXBlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3RyeF90eXBlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3RyeF90eXBlX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3R1bmVfaW5fZmFpbF9yZWFzb25fc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibm9uZSIsIC52YWwgPSBCQ01PTFRfVFVORV9JTl9GQUlMX1JFQVNPTl9OT05FIH0sIHsgLm5hbWUgPSAibm9fdHVuaW5nX3Jlc3BvbnNlX3Bsb2FtX3JlY2VpdmVkIiwgLnZhbCA9IEJDTU9MVF9UVU5FX0lOX0ZBSUxfUkVBU09OX05PX1RVTklOR19SRVNQT05TRV9QTE9BTV9SRUNFSVZFRCB9LCB7IC5uYW1lID0gIm9udV9hY3RpdmF0aW9uX2ZhaWxlZCIsIC52YWwgPSBCQ01PTFRfVFVORV9JTl9GQUlMX1JFQVNPTl9PTlVfQUNUSVZBVElPTl9GQUlMRUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF90dW5lX2luX2ZhaWxfcmVhc29uID0geyAubmFtZSA9ICJiY21vbHRfdHVuZV9pbl9mYWlsX3JlYXNvbiIsIC5kZXNjciA9ICJUdW5lIGluIGZhaWwgcmVhc29uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3R1bmVfaW5fZmFpbF9yZWFzb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfdHVuZV9pbl9mYWlsX3JlYXNvbl9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF90dW5lX291dF9mYWlsX3JlYXNvbl9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJub25lIiwgLnZhbCA9IEJDTU9MVF9UVU5FX09VVF9GQUlMX1JFQVNPTl9OT05FIH0sIHsgLm5hbWUgPSAibmFja19wbG9hbV9yZWNlaXZlZCIsIC52YWwgPSBCQ01PTFRfVFVORV9PVVRfRkFJTF9SRUFTT05fTkFDS19QTE9BTV9SRUNFSVZFRCB9LCB7IC5uYW1lID0gIm5vX3R1bmluZ19yZXNwb25zZV9wbG9hbV9yZWNlaXZlZCIsIC52YWwgPSBCQ01PTFRfVFVORV9PVVRfRkFJTF9SRUFTT05fTk9fVFVOSU5HX1JFU1BPTlNFX1BMT0FNX1JFQ0VJVkVEIH0sIHsgLm5hbWUgPSAidHNvdXJjZV90aW1lb3V0IiwgLnZhbCA9IEJDTU9MVF9UVU5FX09VVF9GQUlMX1JFQVNPTl9UU09VUkNFX1RJTUVPVVQgfSwgeyAubmFtZSA9ICJyb2xsYmFja19yZXF1ZXN0IiwgLnZhbCA9IEJDTU9MVF9UVU5FX09VVF9GQUlMX1JFQVNPTl9ST0xMQkFDS19SRVFVRVNUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdHVuZV9vdXRfZmFpbF9yZWFzb24gPSB7IC5uYW1lID0gImJjbW9sdF90dW5lX291dF9mYWlsX3JlYXNvbiIsIC5kZXNjciA9ICJUdW5lIG91dCBmYWlsIHJlYXNvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF90dW5lX291dF9mYWlsX3JlYXNvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF90dW5lX291dF9mYWlsX3JlYXNvbl9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF91MzJfbGlzdF91MzJfbWF4XzUwMF9oZXggPSB7IC5uYW1lID0gImJjbW9sdF91MzJfbGlzdF91MzJfbWF4XzUwMF9oZXgiLCAuZGVzY3IgPSAiVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgVTMyIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3UzMl9saXN0X3UzMl9tYXhfNTAwX2hleCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9EWU4sIC54ID0geyAuYXJyX2R5biA9IHsgLmVsZW1fdHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90X2hleCwgLmxlbl9zaXplID0gNCwgLm1heF9zaXplID0gNTAwIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF91OF9saXN0X3UxNl9oZXggPSB7IC5uYW1lID0gImJjbW9sdF91OF9saXN0X3UxNl9oZXgiLCAuZGVzY3IgPSAiVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgVTgiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfdThfbGlzdF91MTZfaGV4KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0RZTiwgLnggPSB7IC5hcnJfZHluID0geyAuZWxlbV90eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdF9oZXgsIC5sZW5fc2l6ZSA9IDIsIC5tYXhfc2l6ZSA9IERFRkFVTFRfRFlOX0FSUl9NQVhfU0laRSAvIHNpemVvZih1aW50OF90KSB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdThfbGlzdF91MzIgPSB7IC5uYW1lID0gImJjbW9sdF91OF9saXN0X3UzMiIsIC5kZXNjciA9ICJWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiBVOCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF91OF9saXN0X3UzMiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9EWU4sIC54ID0geyAuYXJyX2R5biA9IHsgLmVsZW1fdHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QsIC5sZW5fc2l6ZSA9IDQsIC5tYXhfc2l6ZSA9IERFRkFVTFRfRFlOX0FSUl9NQVhfU0laRSAvIHNpemVvZih1aW50OF90KSB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDggPSB7IC5uYW1lID0gImJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OCIsIC5kZXNjciA9ICJWYXJpYWJsZS1sZW5ndGggbGlzdCBvZiBVOCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9EWU4sIC54ID0geyAuYXJyX2R5biA9IHsgLmVsZW1fdHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QsIC5sZW5fc2l6ZSA9IDQsIC5tYXhfc2l6ZSA9IDIwNDggfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3VhcnRfYmF1ZHJhdGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAidWFydF9yYXRlXzQ4MDAiLCAudmFsID0gQkNNT0xUX1VBUlRfQkFVRFJBVEVfVUFSVF9SQVRFXzQ4MDAgfSwgeyAubmFtZSA9ICJ1YXJ0X3JhdGVfOTYwMCIsIC52YWwgPSBCQ01PTFRfVUFSVF9CQVVEUkFURV9VQVJUX1JBVEVfOTYwMCB9LCB7IC5uYW1lID0gInVhcnRfcmF0ZV8xNDQwMCIsIC52YWwgPSBCQ01PTFRfVUFSVF9CQVVEUkFURV9VQVJUX1JBVEVfMTQ0MDAgfSwgeyAubmFtZSA9ICJ1YXJ0X3JhdGVfMTkyMDAiLCAudmFsID0gQkNNT0xUX1VBUlRfQkFVRFJBVEVfVUFSVF9SQVRFXzE5MjAwIH0sIHsgLm5hbWUgPSAidWFydF9yYXRlXzM4NDAwIiwgLnZhbCA9IEJDTU9MVF9VQVJUX0JBVURSQVRFX1VBUlRfUkFURV8zODQwMCB9LCB7IC5uYW1lID0gInVhcnRfcmF0ZV81NzYwMCIsIC52YWwgPSBCQ01PTFRfVUFSVF9CQVVEUkFURV9VQVJUX1JBVEVfNTc2MDAgfSwgeyAubmFtZSA9ICJ1YXJ0X3JhdGVfMTE1MjAwIiwgLnZhbCA9IEJDTU9MVF9VQVJUX0JBVURSQVRFX1VBUlRfUkFURV8xMTUyMDAgfSwgeyAubmFtZSA9ICJ1YXJ0X3JhdGVfMjMwNDAwIiwgLnZhbCA9IEJDTU9MVF9VQVJUX0JBVURSQVRFX1VBUlRfUkFURV8yMzA0MDAgfSwgeyAubmFtZSA9ICJ1YXJ0X3JhdGVfMzgwNDAwIiwgLnZhbCA9IEJDTU9MVF9VQVJUX0JBVURSQVRFX1VBUlRfUkFURV8zODA0MDAgfSwgeyAubmFtZSA9ICJ1YXJ0X3JhdGVfNDYwODAwIiwgLnZhbCA9IEJDTU9MVF9VQVJUX0JBVURSQVRFX1VBUlRfUkFURV80NjA4MDAgfSwgeyAubmFtZSA9ICJ1YXJ0X3JhdGVfOTIxNjAwIiwgLnZhbCA9IEJDTU9MVF9VQVJUX0JBVURSQVRFX1VBUlRfUkFURV85MjE2MDAgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF91YXJ0X2JhdWRyYXRlID0geyAubmFtZSA9ICJiY21vbHRfdWFydF9iYXVkcmF0ZSIsIC5kZXNjciA9ICJVQVJUIGJhdWQgcmF0ZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF91YXJ0X2JhdWRyYXRlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3VhcnRfYmF1ZHJhdGVfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3ViZF9pbmZvX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFjdHVhbF9wb2xsaW5nX2ludGVydmFsIiwgLmRlc2NyID0gIlVuaXRzOiA2NS41MzZ1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdWJkX2luZm8sIGFjdHVhbF9wb2xsaW5nX2ludGVydmFsKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gImFjdHVhbF9ncmFudF90aHJlc2hvbGRfdHEiLCAuZGVzY3IgPSAiQWN0dWFsIEdyYW50IFRocmVzaG9sZCAoVFEpIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF91YmRfaW5mbywgYWN0dWFsX2dyYW50X3RocmVzaG9sZF90cSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJhY3R1YWxfbWluX3NjaGVkdWxlcnNoYXBlciIsIC5kZXNjciA9ICJBY3R1YWwgTWluIFNjaGVkdWxlci9TaGFwZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3ViZF9pbmZvLCBhY3R1YWxfbWluX3NjaGVkdWxlcnNoYXBlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FjdHVhbF9zY2hlZHVsZXJzaGFwZXIgfSwgeyAubmFtZSA9ICJhY3R1YWxfbWF4X3NjaGVkdWxlcnNoYXBlciIsIC5kZXNjciA9ICJBY3R1YWwgTWF4IFNjaGVkdWxlci9TaGFwZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3ViZF9pbmZvLCBhY3R1YWxfbWF4X3NjaGVkdWxlcnNoYXBlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FjdHVhbF9zY2hlZHVsZXJzaGFwZXIgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF91YmRfaW5mbyA9IHsgLm5hbWUgPSAiYmNtb2x0X3ViZF9pbmZvIiwgLmRlc2NyID0gIlVCRCBJbmZvIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3ViZF9pbmZvKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3ViZF9pbmZvX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3ViZF9pbmZvX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb25fZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicG9sbGluZ19pbnRlcnZhbF91cyIsIC5kZXNjciA9ICJQb2xsaW5nIEludGVydmFsIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF91cHN0cmVhbV9iYW5kd2lkdGhfZGlzdHJpYnV0aW9uLCBwb2xsaW5nX2ludGVydmFsX3VzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9sbGluZ19pbnRlcnZhbCB9LCB7IC5uYW1lID0gImdyYW50X3RocmVzaG9sZF90cSIsIC5kZXNjciA9ICJHcmFudCBUaHJlc2hvbGQgKFRRKSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdXBzdHJlYW1fYmFuZHdpZHRoX2Rpc3RyaWJ1dGlvbiwgZ3JhbnRfdGhyZXNob2xkX3RxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gIm1pbl9zY2hlZHVsZXJzaGFwZXIiLCAuZGVzY3IgPSAiTWluIFNjaGVkdWxlci9TaGFwZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb24sIG1pbl9zY2hlZHVsZXJzaGFwZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zb2xpY2l0ZWRfc2NoZWR1bGVyIH0sIHsgLm5hbWUgPSAibWF4X3NjaGVkdWxlcnNoYXBlciIsIC5kZXNjciA9ICJNYXggU2NoZWR1bGVyL1NoYXBlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdXBzdHJlYW1fYmFuZHdpZHRoX2Rpc3RyaWJ1dGlvbiwgbWF4X3NjaGVkdWxlcnNoYXBlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3NvbGljaXRlZF9zY2hlZHVsZXIgfSwgeyAubmFtZSA9ICJ0ZG1fZ3JhbnRfc2l6ZV90cSIsIC5kZXNjciA9ICJURE0gR3JhbnQgU2l6ZSAoVFEpIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF91cHN0cmVhbV9iYW5kd2lkdGhfZGlzdHJpYnV0aW9uLCB0ZG1fZ3JhbnRfc2l6ZV90cSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJ0ZG1fZ3JhbnRfaW50ZXJ2YWxfdXMiLCAuZGVzY3IgPSAiSW50ZXJ2YWwgYmV0d2VlbiBURE0gZ3JhbnRzIChpbiB1cykuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF91cHN0cmVhbV9iYW5kd2lkdGhfZGlzdHJpYnV0aW9uLCB0ZG1fZ3JhbnRfaW50ZXJ2YWxfdXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdXBzdHJlYW1fYmFuZHdpZHRoX2Rpc3RyaWJ1dGlvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb24iLCAuZGVzY3IgPSAiVGhlIHVwc3RyZWFtIGJhbmR3aWR0aCBkaXN0cmlidXRpb24gZm9yIHRoaXMgTExJRC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfdXBzdHJlYW1fYmFuZHdpZHRoX2Rpc3RyaWJ1dGlvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF91cHN0cmVhbV9iYW5kd2lkdGhfZGlzdHJpYnV0aW9uX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb25fZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF91c19nZW1fcG9ydF9kZXN0aW5hdGlvbl9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJkYXRhIiwgLnZhbCA9IEJDTU9MVF9VU19HRU1fUE9SVF9ERVNUSU5BVElPTl9EQVRBIH0sIHsgLm5hbWUgPSAiY3B1IiwgLnZhbCA9IEJDTU9MVF9VU19HRU1fUE9SVF9ERVNUSU5BVElPTl9DUFUgfSwgeyAubmFtZSA9ICJvbWNpIiwgLnZhbCA9IEJDTU9MVF9VU19HRU1fUE9SVF9ERVNUSU5BVElPTl9PTUNJIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdXNfZ2VtX3BvcnRfZGVzdGluYXRpb24gPSB7IC5uYW1lID0gImJjbW9sdF91c19nZW1fcG9ydF9kZXN0aW5hdGlvbiIsIC5kZXNjciA9ICJ1c19nZW1fcG9ydF9kZXN0aW5hdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF91c19nZW1fcG9ydF9kZXN0aW5hdGlvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF91c19nZW1fcG9ydF9kZXN0aW5hdGlvbl9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF91c192bGFuX2FjdGlvbl9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhZGQiLCAudmFsID0gQkNNT0xUX1VTX1ZMQU5fQUNUSU9OX0FERCB9LCB7IC5uYW1lID0gInRyYW5zcGFyZW50IiwgLnZhbCA9IEJDTU9MVF9VU19WTEFOX0FDVElPTl9UUkFOU1BBUkVOVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3VzX3ZsYW5fYWN0aW9uID0geyAubmFtZSA9ICJiY21vbHRfdXNfdmxhbl9hY3Rpb24iLCAuZGVzY3IgPSAiVVMgVkxBTiBhY3Rpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfdXNfdmxhbl9hY3Rpb24pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfdXNfdmxhbl9hY3Rpb25fc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3ZsYW5fdGFnX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInZsYW5faWQiLCAuZGVzY3IgPSAiVkxBTiBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdmxhbl90YWcsIHZsYW5faWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAicGJpdCIsIC5kZXNjciA9ICJQYml0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF92bGFuX3RhZywgcGJpdCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3ZsYW5fdGFnID0geyAubmFtZSA9ICJiY21vbHRfdmxhbl90YWciLCAuZGVzY3IgPSAiVkxBTiB0YWciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfdmxhbl90YWcpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfdmxhbl90YWdfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfdmxhbl90YWdfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF92bGFuX3RvX2Zsb3dfbWFwcGluZ19tZXRob2Rfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAidmlkIiwgLnZhbCA9IEJDTU9MVF9WTEFOX1RPX0ZMT1dfTUFQUElOR19NRVRIT0RfVklEIH0sIHsgLm5hbWUgPSAibWFjcGx1c3ZpZCIsIC52YWwgPSBCQ01PTFRfVkxBTl9UT19GTE9XX01BUFBJTkdfTUVUSE9EX01BQ1BMVVNWSUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF92bGFuX3RvX2Zsb3dfbWFwcGluZ19tZXRob2QgPSB7IC5uYW1lID0gImJjbW9sdF92bGFuX3RvX2Zsb3dfbWFwcGluZ19tZXRob2QiLCAuZGVzY3IgPSAiVkxBTiB0byBmbG93IG1hcHBpbmcgbWV0aG9kIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3ZsYW5fdG9fZmxvd19tYXBwaW5nX21ldGhvZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF92bGFuX3RvX2Zsb3dfbWFwcGluZ19tZXRob2Rfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiY29uZmlndXJhdGlvbl9jb21wbGV0ZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAiZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19DRkdfSURfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVEIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9hbGxvY19hdXRvX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fYWxsb2NfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXRlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfU1RBVEUgfSwgeyAubmFtZSA9ICJzbGEiLCAudmFsID0gQkNNT0xUX1hHUE9OX0FMTE9DX0NGR19JRF9TTEEgfSwgeyAubmFtZSA9ICJvbnVfaWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX0FMTE9DX0NGR19JRF9PTlVfSUQgfSwgeyAubmFtZSA9ICJjb2xsZWN0X3N0YXRzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfQ09MTEVDVF9TVEFUUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9hbGxvY19jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9hbGxvY19jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9BTExPQ19DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVMgfSwgeyAubmFtZSA9ICJuZXdfc3RhdGUiLCAudmFsID0gQkNNT0xUX1hHUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX05FV19TVEFURSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX1NUQVRVUyB9LCB7IC5uYW1lID0gImF2ZXJhZ2VfbnNyX3VzZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfQVZFUkFHRV9OU1JfVVNFRCB9LCB7IC5uYW1lID0gImF2ZXJhZ2VfbnNyX2FsbG9jYXRlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX05TUl9BTExPQ0FURUQgfSwgeyAubmFtZSA9ICJhdmVyYWdlX3NyX3JlcG9ydCIsIC52YWwgPSBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX1NSX1JFUE9SVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibnVtX29mX2N5Y2xlcyIsIC52YWwgPSBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX1NUQVRTX0lEX05VTV9PRl9DWUNMRVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fYWxsb2NfZ2V0X3N0YXRzIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX2FsbG9jX2tleV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAudmFsID0gQkNNT0xUX1hHUE9OX0FMTE9DX0tFWV9JRF9QT05fTkkgfSwgeyAubmFtZSA9ICJhbGxvY19pZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fQUxMT0NfS0VZX0lEX0FMTE9DX0lEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfa2V5X2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fYWxsb2Nfa2V5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX2FsbG9jX2tleSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX2FsbG9jX2tleV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdGUiLCAudmFsID0gQkNNT0xUX1hHUE9OX0FMTE9DX1NFVF9TVEFURV9JRF9TVEFURSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9hbGxvY19zZXRfc3RhdGUgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXQiLCAudmFsID0gQkNNT0xUX1hHUE9OX0FMTE9DX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0NGR19JRF9DRkcgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX2FsbG9jX3N0YXRfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInJ4X2J5dGVzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0lEX1JYX0JZVEVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fYWxsb2Nfc3RhdCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2lkX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFsbG9jX2lkIiwgLmRlc2NyID0gIkFsbG9jIElEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlLCBhbGxvY19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJzdGF0ZSIsIC5kZXNjciA9ICJTdGF0ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2Nfd2l0aF9zdGF0ZSwgc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hbGxvY19zdGF0ZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGUgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlIiwgLmRlc2NyID0gIlhHUE9OIEFsbG9jIFdpdGggU3RhdGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfd2l0aF9zdGF0ZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY193aXRoX3N0YXRlX2xpc3RfdTE2X21heF8zMiA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyIiwgLmRlc2NyID0gIlZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIHhncG9uX2FsbG9jX3dpdGhfc3RhdGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMzIpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRFlOLCAueCA9IHsgLmFycl9keW4gPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfd2l0aF9zdGF0ZSwgLmxlbl9zaXplID0gMiwgLm1heF9zaXplID0gMzIgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9lZF9zdGF0ZV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyZXNldF9vbl9lZF9mYWlsIiwgLmRlc2NyID0gInJlc2V0IG9uIEVEIGZhaWwiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2VkX3N0YXRlLCByZXNldF9vbl9lZF9mYWlsKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicmVzZXRfb25fZWRfc3VjY2VzcyIsIC5kZXNjciA9ICJyZXNldCBvbiBFRCBzdWNjZXNzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9lZF9zdGF0ZSwgcmVzZXRfb25fZWRfc3VjY2VzcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2VkX3N0YXRlID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fZWRfc3RhdGUiLCAuZGVzY3IgPSAieGdwb24gZWQgc3RhdGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fZWRfc3RhdGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZWRfc3RhdGVfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZWRfc3RhdGVfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTYgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTYiLCAuZGVzY3IgPSAiVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgeGdwb25fZ2VtX2lkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9EWU4sIC54ID0geyAuYXJyX2R5biA9IHsgLmVsZW1fdHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90LCAubGVuX3NpemUgPSAxLCAubWF4X3NpemUgPSAxNiB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX2dlbV9wb3J0X2F1dG9fY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiY29uZmlndXJhdGlvbiIsIC52YWwgPSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX0NPTkZJR1VSQVRJT04gfSwgeyAubmFtZSA9ICJvbnVfaWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9PTlVfSUQgfSwgeyAubmFtZSA9ICJnZW1fcG9ydF9zdGF0ZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX0dFTV9QT1JUX1NUQVRFIH0sIHsgLm5hbWUgPSAiZW5jcnlwdGlvbl9tb2RlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfRU5DUllQVElPTl9NT0RFIH0sIHsgLm5hbWUgPSAidXBzdHJlYW1fZGVzdGluYXRpb25fcXVldWUiLCAudmFsID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9VUFNUUkVBTV9ERVNUSU5BVElPTl9RVUVVRSB9LCB7IC5uYW1lID0gImNvbnRyb2wiLCAudmFsID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9DT05UUk9MIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX2dlbV9wb3J0X2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicG9uX25pIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9LRVlfSURfUE9OX05JIH0sIHsgLm5hbWUgPSAiZ2VtX3BvcnRfaWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0tFWV9JRF9HRU1fUE9SVF9JRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9nZW1fcG9ydF9rZXkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXQiLCAudmFsID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0NGR19JRF9DRkcgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX2dlbV9wb3J0X3N0YXRfY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInR4X2J5dGVzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1RYX0JZVEVTIH0sIHsgLm5hbWUgPSAidHhfcGFja2V0cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9JRF9UWF9QQUNLRVRTIH0sIHsgLm5hbWUgPSAicnhfcGFja2V0cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9QQUNLRVRTIH0sIHsgLm5hbWUgPSAicnhfYnl0ZXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfSURfUlhfQllURVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9nZW1fcG9ydF9zdGF0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibm90X2NvbmZpZ3VyZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRFX05PVF9DT05GSUdVUkVEIH0sIHsgLm5hbWUgPSAiaW5hY3RpdmUiLCAudmFsID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRFX0lOQUNUSVZFIH0sIHsgLm5hbWUgPSAiYWN0aXZlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFURV9BQ1RJVkUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0ZSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRlIiwgLmRlc2NyID0gIlhHUE9OIEdFTSBQb3J0IFN0YXRlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRlX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImdlbV9pZCIsIC5kZXNjciA9ICJHRU0gSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGUsIGdlbV9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJzdGF0ZSIsIC5kZXNjciA9ICJTdGF0ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSwgc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0ZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGUgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlIiwgLmRlc2NyID0gIlhHUE9OIEdFTSBQb3J0IFdpdGggU3RhdGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2dlbV9wb3J0X3dpdGhfc3RhdGVfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjggPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjgiLCAuZGVzY3IgPSAiVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjgpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRFlOLCAueCA9IHsgLmFycl9keW4gPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSwgLmxlbl9zaXplID0gMiwgLm1heF9zaXplID0gMTI4IH0gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTYgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTYiLCAuZGVzY3IgPSAiVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTYpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRFlOLCAueCA9IHsgLmFycl9keW4gPSB7IC5lbGVtX3R5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZSwgLmxlbl9zaXplID0gMiwgLm1heF9zaXplID0gMjU2IH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInVzX290YWdfZGlyZWN0X3RwaWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX0lXRl9DRkdfSURfVVNfT1RBR19ESVJFQ1RfVFBJRCB9LCB7IC5uYW1lID0gImRzX3RwaWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX0lXRl9DRkdfSURfRFNfVFBJRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2l3Zl9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX2l3Zl9jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2l3Zl9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25faXdmX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9pd2Zfa2V5X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInBvbl9uaSIsIC52YWwgPSBCQ01PTFRfWEdQT05fSVdGX0tFWV9JRF9QT05fTkkgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9pd2Zfa2V5X2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25faXdmX2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9pd2Zfa2V5IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9pd2Zfa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX2l3Zl9rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2tleV9leGNoYW5nZV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJpbnRlcnZhbCIsIC5kZXNjciA9ICJLZXkgRXhjaGFuZ2UgcHJvY2VzcyBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2tleV9leGNoYW5nZSwgaW50ZXJ2YWwpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiY29udHJvbCIsIC5kZXNjciA9ICJFbmFibGVcXGRpc2FibGUgcGVyaW9kaWMgcHJvY2VzcyBvZiBLZXkgRXhjaGFuZ2UgZm9yIGFjdGl2ZSBPTlVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9rZXlfZXhjaGFuZ2UsIGNvbnRyb2wpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb250cm9sX3N0YXRlIH0sIHsgLm5hbWUgPSAiZW5jcnlwdGVkX3BvcnRzX29ubHkiLCAuZGVzY3IgPSAiUGVyZm9ybSBrZXkgZXhjaGFuZ2Ugb25seSB0byBPTlVzIHdpdGggR0VNIHBvcnRzIHRoYXQgaGF2ZSBkb3duc3RyZWFtIGVuY3J5cHRpb24gZW5hYmxlZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fa2V5X2V4Y2hhbmdlLCBlbmNyeXB0ZWRfcG9ydHNfb25seSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9rZXlfZXhjaGFuZ2UgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9rZXlfZXhjaGFuZ2UiLCAuZGVzY3IgPSAiWEdQT04gS2V5IEV4Y2hhbmdlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2tleV9leGNoYW5nZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9rZXlfZXhjaGFuZ2VfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fa2V5X2V4Y2hhbmdlX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX211bHRpY2FzdF9rZXlfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAia2V5IiwgLmRlc2NyID0gIkFFUyBlbmNyeXB0aW9uIGtleSBmb3IgbXVsdGljc2F0IFhHRU0gcG9ydCBJRHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX211bHRpY2FzdF9rZXksIGtleSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Flc19rZXkgfSwgeyAubmFtZSA9ICJrZXlfY29udHJvbCIsIC5kZXNjciA9ICJFbmFibGVcXERpc2FibGUgZW5jcnlwdGlvbiBvbiBtdWx0aWNhc3QgWEdFTSBwb3J0cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbXVsdGljYXN0X2tleSwga2V5X2NvbnRyb2wpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9tdWx0aWNhc3Rfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbXVsdGljYXN0X2tleSIsIC5kZXNjciA9ICJYR1BPTiBNdWx0aWNhc3Qga2V5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX211bHRpY2FzdF9rZXkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbXVsdGljYXN0X2tleV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9tdWx0aWNhc3Rfa2V5X2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic2VyaWFsX251bWJlciIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQURKVVNUX1RYX1dBVkVMRU5HVEhfSURfU0VSSUFMX05VTUJFUiB9LCB7IC5uYW1lID0gImZyZXFlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9BREpVU1RfVFhfV0FWRUxFTkdUSF9JRF9GUkVRRU5DWV9BREpVU1RNRU5UX0RJUkVDVElPTiB9LCB7IC5uYW1lID0gImZyZXF1ZW5jeV9hZGp1c3RtZW50X3NpemUiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0FESlVTVF9UWF9XQVZFTEVOR1RIX0lEX0ZSRVFVRU5DWV9BREpVU1RNRU5UX1NJWkUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX0FDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRCB9LCB7IC5uYW1lID0gImNwdV9wYWNrZXRzX2ZhaWx1cmUiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX0NQVV9QQUNLRVRTX0ZBSUxVUkUgfSwgeyAubmFtZSA9ICJkZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfREVBQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQgfSwgeyAubmFtZSA9ICJkaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfRElTQUJMRV9BTExfT05VU19DT01QTEVURUQgfSwgeyAubmFtZSA9ICJlbmFibGVfYWxsX29udXNfY29tcGxldGVkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9FTkFCTEVfQUxMX09OVVNfQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAibG9zIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9MT1MgfSwgeyAubmFtZSA9ICJvbnVfZGlzY292ZXJlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfT05VX0RJU0NPVkVSRUQgfSwgeyAubmFtZSA9ICJvbnVfdXBncmFkZV9jb21wbGV0ZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfT05VX1VQR1JBREVfQ09NUExFVEUgfSwgeyAubmFtZSA9ICJwcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRUQgfSwgeyAubmFtZSA9ICJwcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfU1dJVENIT1ZFUl9DT01QTEVURUQgfSwgeyAubmFtZSA9ICJwcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUUgfSwgeyAubmFtZSA9ICJyb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAicm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9ST0dVRV9PTlVfU1BFQ0lBTF9NQVBfQ1lDTEVfU1RBUlQgfSwgeyAubmFtZSA9ICJzZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9TRVJJQUxfTlVNQkVSX0FDUVVJU0lUSU9OX0NZQ0xFX1NUQVJUIH0sIHsgLm5hbWUgPSAic3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQgfSwgeyAubmFtZSA9ICJzdGF0ZV9jaGFuZ2VfY29tcGxldGVkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFURV9DSEFOR0VfQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAidG9kX3JlcXVlc3RfY29tcGxldGVkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9UT0RfUkVRVUVTVF9DT01QTEVURUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX25pX2F1dG9fY2ZnIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInBsb2FtIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9CUk9BRENBU1RfUExPQU1fUEFDS0VUX0lEX1BMT0FNIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJod19wb25faWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9IV19QT05fSUQgfSwgeyAubmFtZSA9ICJhdmFpbGFibGVfYmFuZHdpZHRoIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQVZBSUxBQkxFX0JBTkRXSURUSCB9LCB7IC5uYW1lID0gIm51bWJlcl9vZl9hY3RpdmVfb251cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX05VTUJFUl9PRl9BQ1RJVkVfT05VUyB9LCB7IC5uYW1lID0gInBvbl9zdGF0dXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QT05fU1RBVFVTIH0sIHsgLm5hbWUgPSAicG9uX2Rpc3RhbmNlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUE9OX0RJU1RBTkNFIH0sIHsgLm5hbWUgPSAicmFuZ2luZ193aW5kb3dfc2l6ZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1JBTkdJTkdfV0lORE9XX1NJWkUgfSwgeyAubmFtZSA9ICJlcWRfY3ljbGVzX251bWJlciIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0VRRF9DWUNMRVNfTlVNQkVSIH0sIHsgLm5hbWUgPSAiZHJpZnRfY29udHJvbCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RSSUZUX0NPTlRST0wgfSwgeyAubmFtZSA9ICJsb3NfYWxhcm1fdGhyZXNob2xkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTE9TX0FMQVJNX1RIUkVTSE9MRCB9LCB7IC5uYW1lID0gImxvc19pbml0aWFsX3ZhbHVlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTE9TX0lOSVRJQUxfVkFMVUUgfSwgeyAubmFtZSA9ICJvbnVfYWxhcm1zX3RocmVzaG9sZHMiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9PTlVfQUxBUk1TX1RIUkVTSE9MRFMgfSwgeyAubmFtZSA9ICJiZXJfbW9uaXRvciIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0JFUl9NT05JVE9SIH0sIHsgLm5hbWUgPSAib251X2FjdGl2YXRpb24iLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9PTlVfQUNUSVZBVElPTiB9LCB7IC5uYW1lID0gInNuX2FjcXVpc2l0aW9uIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfU05fQUNRVUlTSVRJT04gfSwgeyAubmFtZSA9ICJrZXlfZXhjaGFuZ2UiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9LRVlfRVhDSEFOR0UgfSwgeyAubmFtZSA9ICJwcm90ZWN0aW9uX3N3aXRjaGluZyIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HIH0sIHsgLm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWciLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19ERUJVRyB9LCB7IC5uYW1lID0gImNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9DQlJfUlRfQUxMT0NBVElPTl9QUk9GSUxFIH0sIHsgLm5hbWUgPSAiY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9DQlJfTlJUX0FMTE9DQVRJT05fUFJPRklMRSB9LCB7IC5uYW1lID0gInBvd2VyX21hbmFnZW1lbnQiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QT1dFUl9NQU5BR0VNRU5UIH0sIHsgLm5hbWUgPSAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUk9HVUVfT05VX0RFVEVDVElPTl9QUk9DRVNTIH0sIHsgLm5hbWUgPSAicGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BFUklPRElDX1NUQU5EQllfUE9OX01PTklUT1JJTkcgfSwgeyAubmFtZSA9ICJkYmFfbW9kZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RCQV9NT0RFIH0sIHsgLm5hbWUgPSAicGxvYW1faGFuZGxpbmciLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QTE9BTV9IQU5ETElORyB9LCB7IC5uYW1lID0gIm1pbl9kYXRhX2FsbG9jX2lkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTUlOX0RBVEFfQUxMT0NfSUQgfSwgeyAubmFtZSA9ICJtaW5fZGF0YV9nZW1fcG9ydF9pZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX01JTl9EQVRBX0dFTV9QT1JUX0lEIH0sIHsgLm5hbWUgPSAibXVsdGljYXN0X2tleSIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX01VTFRJQ0FTVF9LRVkgfSwgeyAubmFtZSA9ICJwcmJzX2NoZWNrZXIiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QUkJTX0NIRUNLRVIgfSwgeyAubmFtZSA9ICJwcmJzX2dlbmVyYXRvciIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BSQlNfR0VORVJBVE9SIH0sIHsgLm5hbWUgPSAicHJic19zdGF0dXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QUkJTX1NUQVRVUyB9LCB7IC5uYW1lID0gImF1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQVVUT01BVElDX09OVV9ERUFDVElWQVRJT04gfSwgeyAubmFtZSA9ICJ1c19iYW5kd2lkdGhfbGltaXQiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9VU19CQU5EV0lEVEhfTElNSVQgfSwgeyAubmFtZSA9ICJhbGxfb251cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0FMTF9PTlVTIH0sIHsgLm5hbWUgPSAiYWxsX21jYXN0X2dlbV9wb3J0cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0FMTF9NQ0FTVF9HRU1fUE9SVFMgfSwgeyAubmFtZSA9ICJkZWJ1ZyIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RFQlVHIH0sIHsgLm5hbWUgPSAib251X3VwZ3JhZGVfcGFyYW1zIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX1VQR1JBREVfUEFSQU1TIH0sIHsgLm5hbWUgPSAiZHNfZmVjX21vZGUiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EU19GRUNfTU9ERSB9LCB7IC5uYW1lID0gImRiYV90eXBlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfREJBX1RZUEUgfSwgeyAubmFtZSA9ICJvbnVfdHVuaW5nIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX1RVTklORyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJlcnJvciIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfQ1BVX1BBQ0tFVFNfRkFJTFVSRV9JRF9FUlJPUiB9LCB7IC5uYW1lID0gImdlbV9wb3J0X2lkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19GQUlMVVJFX0lEX0dFTV9QT1JUX0lEIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInBhY2tldF90eXBlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfVFlQRSB9LCB7IC5uYW1lID0gImNhbGNfY3JjIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9DQUxDX0NSQyB9LCB7IC5uYW1lID0gImdlbV9wb3J0X2xpc3QiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0lEX0dFTV9QT1JUX0xJU1QgfSwgeyAubmFtZSA9ICJidWZmZXIiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0lEX0JVRkZFUiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfY3B1X3BhY2tldHMgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9kZWJ1Z19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJpbmNyZWFzZV9hdmFpbGFibGVfY2JyX2J3IiwgLmRlc2NyID0gIlVzZSBpbmNyZWFzZSBhdmFpbGFibGUgQ0JSIGJhbmR3aWR0aCBmb3IgYmV0dGVyIEJXIHV0aWxpemF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9kZWJ1ZywgaW5jcmVhc2VfYXZhaWxhYmxlX2Nicl9idyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImludGVyX2J1cnN0X2dhcF9pbl9ieXRlcyIsIC5kZXNjciA9ICJHYXAgYmV0d2VlbiB0d28gY29uc2VjdXRpdmUgYnVyc3RzIGZvciB0aGUgc2FtZSBPTlUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2RlYnVnLCBpbnRlcl9idXJzdF9nYXBfaW5fYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAibnVtYmVyX29mX2dlbV9wb3J0c19wZXJfb251IiwgLmRlc2NyID0gIk51bWJlciBvZiBnZW0gcG9ydHMgcGVyIG9udSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfZGVidWcsIG51bWJlcl9vZl9nZW1fcG9ydHNfcGVyX29udSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9kZWJ1ZyA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX2RlYnVnIiwgLmRlc2NyID0gIlhHUE9OIE5JIERlYnVnIHBhcmFtZXRlcnMiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfZGVidWcpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfZGVidWdfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfZGVidWdfZmllbGRzIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiY29udHJvbCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX0NPTlRST0wgfSwgeyAubmFtZSA9ICJzZXJpYWxfbnVtYmVyIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9ESVNBQkxFX1NFUklBTF9OVU1CRVJfSURfU0VSSUFMX05VTUJFUiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXIgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX25pX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfa2V5X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInBvbl9uaSIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfS0VZX0lEX1BPTl9OSSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2tleV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9rZXkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2tleV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9uaV9rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfbG9zX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXR1cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfTE9TX0lEX1NUQVRVUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2xvc19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX2xvc19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9sb3MgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2xvc19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9uaV9sb3NfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic2VyaWFsX251bWJlciIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfU0VSSUFMX05VTUJFUiB9LCB7IC5uYW1lID0gInJhbmdpbmdfdGltZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfUkFOR0lOR19USU1FIH0sIHsgLm5hbWUgPSAib251X2lkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9PTlVfSUQgfSwgeyAubmFtZSA9ICJ1cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9VUFNUUkVBTV9MSU5FX1JBVEVfQ0FQQUJJTElUSUVTIH0sIHsgLm5hbWUgPSAiY3VycmVudF9kb3duc3RyZWFtX3Bvbl9pZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfQ1VSUkVOVF9ET1dOU1RSRUFNX1BPTl9JRCB9LCB7IC5uYW1lID0gImN1cnJlbnRfdXBzdHJlYW1fcG9uX2lkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9DVVJSRU5UX1VQU1RSRUFNX1BPTl9JRCB9LCB7IC5uYW1lID0gImNhbGlicmF0aW9uX3JlY29yZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfQ0FMSUJSQVRJT05fUkVDT1JEIH0sIHsgLm5hbWUgPSAidHVuaW5nX2dyYW51bGFyaXR5IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9UVU5JTkdfR1JBTlVMQVJJVFkgfSwgeyAubmFtZSA9ICJzdGVwX3R1bmluZ190aW1lIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9TVEVQX1RVTklOR19USU1FIH0sIHsgLm5hbWUgPSAiYXR0ZW51YXRpb24iLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX0FUVEVOVUFUSU9OIH0sIHsgLm5hbWUgPSAicG93ZXJfbGV2ZWxsaW5nX2NhcGFiaWxpdGllcyIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfUE9XRVJfTEVWRUxMSU5HX0NBUEFCSUxJVElFUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfb251X2Rpc2NvdmVyZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXR1cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfT05VX1VQR1JBREVfQ09NUExFVEVfSURfU1RBVFVTIH0sIHsgLm5hbWUgPSAibGlzdF9vZl9mYWlsZWRfZW50aXRpZXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX0xJU1RfT0ZfRkFJTEVEX0VOVElUSUVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAib251cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRURfSURfT05VUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInJlc3VsdCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfU1dJVENIT1ZFUl9DT01QTEVURURfSURfUkVTVUxUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicmVzdWx0IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRV9JRF9SRVNVTFQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9yZXNldF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9yZXNldF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX3Jlc2V0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX25pX3Jlc2V0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9yZXNldF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9uaV9yZXNldF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIndpbmRvd190eXBlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1dJTkRPV19UWVBFIH0sIHsgLm5hbWUgPSAibWVhc3VyZW1lbnRfc3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX01FQVNVUkVNRU5UX1NUQVRVUyB9LCB7IC5uYW1lID0gImFsbG9jX2lkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX0FMTE9DX0lEIH0sIHsgLm5hbWUgPSAib251X2lkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX09OVV9JRCB9LCB7IC5uYW1lID0gImlzX2RlbGluZWF0aW9uIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX0lTX0RFTElORUFUSU9OIH0sIHsgLm5hbWUgPSAiaXNfZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfSVNfRUQgfSwgeyAubmFtZSA9ICJyeF9kYXRhIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1JYX0RBVEEgfSwgeyAubmFtZSA9ICJwbG9hbV9yZWNlaXZlZF9vbnVfaWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUExPQU1fUkVDRUlWRURfT05VX0lEIH0sIHsgLm5hbWUgPSAicGxvYW1fcmVjZWl2ZWRfbWljX2Vycm9yIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1BMT0FNX1JFQ0VJVkVEX01JQ19FUlJPUiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIndpbmRvd190eXBlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX1dJTkRPV19UWVBFIH0sIHsgLm5hbWUgPSAiYWxsb2NfaWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfQUxMT0NfSUQgfSwgeyAubmFtZSA9ICJvbnVfaWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfT05VX0lEIH0sIHsgLm5hbWUgPSAic2Vjb25kX3Jhbmdpbmdfd2luZG93IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX1NFQ09ORF9SQU5HSU5HX1dJTkRPVyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3cgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX25pX3JvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX25pX3JvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibnVtYmVyX29mX2N5Y2xlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9SVU5fU1BFQ0lBTF9CV19NQVBfSURfTlVNQkVSX09GX0NZQ0xFIH0sIHsgLm5hbWUgPSAiYWxsb2NhdGlvbl9udW1iZXIiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1JVTl9TUEVDSUFMX0JXX01BUF9JRF9BTExPQ0FUSU9OX05VTUJFUiB9LCB7IC5uYW1lID0gImJ3X21hcF9hcnJheSIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfUlVOX1NQRUNJQUxfQldfTUFQX0lEX0JXX01BUF9BUlJBWSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXAgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0X2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX25pX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJvbnVfc3RhdGUiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfc2V0X29udV9zdGF0ZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicG9uX3N0YXRlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9TRVRfUE9OX1NUQVRFX0lEX1BPTl9TVEFURSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX25pX3NldF9wb25fc3RhdGUgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9zaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fbmlfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJudW1iZXJfb2ZfZGV0ZWN0ZWRfZGVsaW1pdGVyIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRF9JRF9OVU1CRVJfT0ZfREVURUNURURfREVMSU1JVEVSIH0sIHsgLm5hbWUgPSAiZW5lcmd5X2RldGVjdF9zaWduYWwiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVEX0lEX0VORVJHWV9ERVRFQ1RfU0lHTkFMIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAibGlzdF9vZl9vbnVfaWRzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9TVEFSVF9PTlVfVVBHUkFERV9JRF9MSVNUX09GX09OVV9JRFMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX25pX3N0YXJ0X29udV91cGdyYWRlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInN0YXQiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJjZmciLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfQ0ZHX0lEX0NGRyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfc3RhdF9jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfc3RhdF9jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX3N0YXRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZmVjX2NvZGV3b3JkcyIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9GRUNfQ09ERVdPUkRTIH0sIHsgLm5hbWUgPSAiYmlwMzJfYnl0ZXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfQklQMzJfQllURVMgfSwgeyAubmFtZSA9ICJiaXAzMl9lcnJvcnMiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfQklQMzJfRVJST1JTIH0sIHsgLm5hbWUgPSAicnhfeGd0Y19oZWFkZXJzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHVENfSEVBREVSUyB9LCB7IC5uYW1lID0gInJ4X3hndGNfY29ycmVjdGVkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHVENfQ09SUkVDVEVEIH0sIHsgLm5hbWUgPSAicnhfeGd0Y191bmNvcnJlY3RlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR1RDX1VOQ09SUkVDVEVEIH0sIHsgLm5hbWUgPSAicnhfeGdlbSIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR0VNIH0sIHsgLm5hbWUgPSAicnhfeGdlbV9kcm9wcGVkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHRU1fRFJPUFBFRCB9LCB7IC5uYW1lID0gInJ4X3hnZW1faWRsZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR0VNX0lETEUgfSwgeyAubmFtZSA9ICJyeF94Z2VtX2NvcnJlY3RlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR0VNX0NPUlJFQ1RFRCB9LCB7IC5uYW1lID0gInJ4X2NyY19lcnJvciIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9DUkNfRVJST1IgfSwgeyAubmFtZSA9ICJyeF9mcmFnbWVudF9lcnJvciIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9GUkFHTUVOVF9FUlJPUiB9LCB7IC5uYW1lID0gInJ4X3BhY2tldHNfZHJvcHBlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QQUNLRVRTX0RST1BQRUQgfSwgeyAubmFtZSA9ICJyeF9kcm9wcGVkX3Rvb19zaG9ydCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9EUk9QUEVEX1RPT19TSE9SVCB9LCB7IC5uYW1lID0gInJ4X2Ryb3BwZWRfdG9vX2xvbmciLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fTE9ORyB9LCB7IC5uYW1lID0gInJ4X2tleV9lcnJvciIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9LRVlfRVJST1IgfSwgeyAubmFtZSA9ICJ0eF9wbG9hbXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfUExPQU1TIH0sIHsgLm5hbWUgPSAicnhfcGxvYW1zX2Ryb3BwZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX0RST1BQRUQgfSwgeyAubmFtZSA9ICJyeF9hbGxvY2F0aW9uc192YWxpZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19WQUxJRCB9LCB7IC5uYW1lID0gInJ4X2FsbG9jYXRpb25zX2ludmFsaWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfSU5WQUxJRCB9LCB7IC5uYW1lID0gInJ4X2FsbG9jYXRpb25zX2Rpc2FibGVkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0FMTE9DQVRJT05TX0RJU0FCTEVEIH0sIHsgLm5hbWUgPSAicnhfcGxvYW1zIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNUyB9LCB7IC5uYW1lID0gInJ4X3Bsb2Ftc19ub25faWRsZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QTE9BTVNfTk9OX0lETEUgfSwgeyAubmFtZSA9ICJyeF9wbG9hbXNfZXJyb3IiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX0VSUk9SIH0sIHsgLm5hbWUgPSAicnhfY3B1IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0NQVSB9LCB7IC5uYW1lID0gInJ4X29tY2kiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfT01DSSB9LCB7IC5uYW1lID0gInJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUiB9LCB7IC5uYW1lID0gInR4X3BhY2tldHMiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfUEFDS0VUUyB9LCB7IC5uYW1lID0gInR4X3hnZW0iLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfWEdFTSB9LCB7IC5uYW1lID0gInR4X2NwdSIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9DUFUgfSwgeyAubmFtZSA9ICJ0eF9vbWNpIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX09NQ0kgfSwgeyAubmFtZSA9ICJ0eF9jcHVfb21jaV9wYWNrZXRzX2Ryb3BwZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfQ1BVX09NQ0lfUEFDS0VUU19EUk9QUEVEIH0sIHsgLm5hbWUgPSAidHhfZHJvcHBlZF9pbGxlZ2FsX2xlbmd0aCIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX0lMTEVHQUxfTEVOR1RIIH0sIHsgLm5hbWUgPSAidHhfZHJvcHBlZF90cGlkX21pc3MiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9UUElEX01JU1MgfSwgeyAubmFtZSA9ICJ0eF9kcm9wcGVkX3ZpZF9taXNzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfVklEX01JU1MgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfc3RhdF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9uaV9zdGF0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX25pX3N0YXRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJyZXN1bHQiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfUkVTVUxUIH0sIHsgLm5hbWUgPSAicHJldmlvdXNfc3RhdGUiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfUFJFVklPVVNfU1RBVEUgfSwgeyAubmFtZSA9ICJuZXdfc3RhdGUiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfTkVXX1NUQVRFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJ0b2Rfc3RyaW5nIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfVE9EX1NUUklORyB9LCB7IC5uYW1lID0gInNmYyIsIC52YWwgPSBCQ01PTFRfWEdQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1NGQyB9LCB7IC5uYW1lID0gInJ0Y19vZmZzZXRfc2VjIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfUlRDX09GRlNFVF9TRUMgfSwgeyAubmFtZSA9ICJydGNfb2Zmc2V0X25zZWMiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9SVENfT0ZGU0VUX05TRUMgfSwgeyAubmFtZSA9ICJzdGF0dXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9TVEFUVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fbmlfdG9kX3JlcXVlc3QgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX251bV9vZl9vbnVzX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInhncG9uX3N1cHBvcnRfMjU2X29udXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX05VTV9PRl9PTlVTX1hHUE9OX1NVUFBPUlRfMjU2X09OVVMgfSwgeyAubmFtZSA9ICJ4Z3Bvbl9zdXBwb3J0XzUxMF9vbnVzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9OVU1fT0ZfT05VU19YR1BPTl9TVVBQT1JUXzUxMF9PTlVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbnVtX29mX29udXMgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9udW1fb2Zfb251cyIsIC5kZXNjciA9ICJ4Z3BvbiBudW0gb2Ygb251cyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9udW1fb2Zfb251cyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9udW1fb2Zfb251c19zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2FjdGl2YXRpb25fZmllbGRzW10gPSB7IHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlIiwgLmRlc2NyID0gIlBlcmZvcm0gc2luZ2xlIGtleSBleGNoYW5nZSBkdXJpbmcgYWN0aXZhdGlvbi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hY3RpdmF0aW9uLCBrZXlfZXhjaGFuZ2UpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb250cm9sX3N0YXRlIH0sIHsgLm5hbWUgPSAiZmFpbF9kdWVfdG9fcmVnaXNfYXV0b19mYWlsIiwgLmRlc2NyID0gIkRlYWN0aXZhdGUgT05VIGR1ZSB0byByZWdpc3RyYXRpb24gYXV0aGVudGljYXRpb24gZmFpbHVyZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2FjdGl2YXRpb24sIGZhaWxfZHVlX3RvX3JlZ2lzX2F1dG9fZmFpbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfYWN0aXZhdGlvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9hY3RpdmF0aW9uIiwgLmRlc2NyID0gIlhHUE9OIE9OVSBBY3RpdmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9hY3RpdmF0aW9uKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9hY3RpdmF0aW9uX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9hY3RpdmF0aW9uX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0FESlVTVF9UWF9XQVZFTEVOR1RIX0lEX0ZSRVFVRU5DWV9BREpVU1RNRU5UX0RJUkVDVElPTiB9LCB7IC5uYW1lID0gImZyZXF1ZW5jeV9hZGp1c3RtZW50X3NpemUiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9BREpVU1RfVFhfV0FWRUxFTkdUSF9JRF9GUkVRVUVOQ1lfQURKVVNUTUVOVF9TSVpFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9pZF9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2Flc19rZXlfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZW5jcnlwdGlvbl9rZXkiLCAuZGVzY3IgPSAiZW5jcnlwdGlvbiBrZXkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hZXNfa2V5LCBlbmNyeXB0aW9uX2tleSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Flc19rZXkgfSwgeyAubmFtZSA9ICJrZXlfaW5kZXgiLCAuZGVzY3IgPSAia2V5IGluZGV4IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYWVzX2tleSwga2V5X2luZGV4KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2Flc19rZXkgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfYWVzX2tleSIsIC5kZXNjciA9ICJYR1BPTiBPTlUgQUVTIEtFWSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfYWVzX2tleSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfYWVzX2tleV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfYWVzX2tleV9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGVfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibG9zaSIsIC5kZXNjciA9ICJMb3NzIG9mIHNpZ25hbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlLCBsb3NpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAibG9iaSIsIC5kZXNjciA9ICJMb3NzIG9mIGJ1cnN0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGUsIGxvYmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJsb3BjaSIsIC5kZXNjciA9ICJMb3NzIG9mIFBMT0FNIGNoYW5uZWwiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZSwgbG9wY2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJsb3BjaV9taWNfZXJyb3IiLCAuZGVzY3IgPSAiTWljIGVycm9yIG9uIHBsb2FtIGNoYW5uZWwiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZSwgbG9wY2lfbWljX2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAibG9vY2kiLCAuZGVzY3IgPSAiTG9zcyBvZiBPTUNJIGNoYW5uZWwiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZSwgbG9vY2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJ0aXdpIiwgLmRlc2NyID0gIlRyYW5zbWlzc2lvbiBpbnRlcmZlcmVuY2UgQWxhcm0iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZSwgdGl3aSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9LCB7IC5uYW1lID0gImRvd2kiLCAuZGVzY3IgPSAiRHJpZnQgb2YgV2luZG93IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGUsIGRvd2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJzdWZpIiwgLmRlc2NyID0gIlN0YXJ0IFVQIEZhaWx1cmUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZSwgc3VmaSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9LCB7IC5uYW1lID0gInNmaSIsIC5kZXNjciA9ICJTaWduYWwgRmFpbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlLCBzZmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJzZGkiLCAuZGVzY3IgPSAiU2lnbmFsIERlZ3JhZGVkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGUsIHNkaSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9LCB7IC5uYW1lID0gImRmaSIsIC5kZXNjciA9ICJEZWFjdGl2YXRpb24gRmFpbHVyZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlLCBkZmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJkZ2kiLCAuZGVzY3IgPSAiRHlpbmcgZ2FzcCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlLCBkZ2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJwcXNpIiwgLmRlc2NyID0gIlBsb2FtIHF1ZXVlIHN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlLCBwcXNpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlIiwgLmRlc2NyID0gIlhHUE9OIE9OVSBhbGFybSBzdGF0dXMiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGVfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2FsYXJtc19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJsb3NpIiwgLmRlc2NyID0gIkxPU2kiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hbGFybXMsIGxvc2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJsb2JpIiwgLmRlc2NyID0gIkxPQmkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hbGFybXMsIGxvYmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJsb3BjaV9taXNzIiwgLmRlc2NyID0gIkxPUENpIG1pc3MiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hbGFybXMsIGxvcGNpX21pc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJsb3BjaV9taWNfZXJyb3IiLCAuZGVzY3IgPSAiTE9QQ2kgbWljIGVycm9yIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zLCBsb3BjaV9taWNfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X2FsYXJtcyIsIC5kZXNjciA9ICJYR1BPTiBPTlUgYWxhcm1zIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9hbGFybXMpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2FsYXJtc19maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9hbGFybXNfdGhyZXNob2xkc19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJsb3NpIiwgLmRlc2NyID0gIlRocmVzaG9sZCBmb3IgYXNzZXJ0aW5nIExPU2kgYWxhcm0uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMsIGxvc2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJsb2JpIiwgLmRlc2NyID0gIlRocmVzaG9sZCBmb3IgYXNzZXJ0aW5nIExPQmkgYWxhcm0uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMsIGxvYmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJsb29jaSIsIC5kZXNjciA9ICJUaHJlc2hvbGQgZm9yIGFzc2VydGluZyBMT09DaSBhbGFybS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hbGFybXNfdGhyZXNob2xkcywgbG9vY2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJsb3BjaSIsIC5kZXNjciA9ICJUaHJlc2hvbGQgZm9yIGFzc2VydGluZyBMT1BDaSBhbGFybS4gIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMsIGxvcGNpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2FsYXJtc190aHJlc2hvbGRzID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X2FsYXJtc190aHJlc2hvbGRzIiwgLmRlc2NyID0gIlhHUE9OIE9OVSBhbGFybXMgdGhyZXNob2xkcyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2FsYXJtc190aHJlc2hvbGRzX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9hbGFybXNfdGhyZXNob2xkc19maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJkZmkiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9ERkkgfSwgeyAubmFtZSA9ICJkZ2kiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9ER0kgfSwgeyAubmFtZSA9ICJkb3dpIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfRE9XSSB9LCB7IC5uYW1lID0gImludmFsaWRfZGJydV9yZXBvcnQiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9JTlZBTElEX0RCUlVfUkVQT1JUIH0sIHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9DT01QTEVURUQgfSwgeyAubmFtZSA9ICJrZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9DWUNMRV9TS0lQUEVEIH0sIHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0ggfSwgeyAubmFtZSA9ICJrZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9LRVlfUkVRVUVTVF9USU1FT1VUIH0sIHsgLm5hbWUgPSAibG9vY2kiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9MT09DSSB9LCB7IC5uYW1lID0gIm9udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRCB9LCB7IC5uYW1lID0gIm9udV9hbGFybSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9BTEFSTSB9LCB7IC5uYW1lID0gIm9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURUQgfSwgeyAubmFtZSA9ICJvbnVfZGlzYWJsZV9jb21wbGV0ZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfRElTQUJMRV9DT01QTEVURUQgfSwgeyAubmFtZSA9ICJvbnVfZW5hYmxlX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9FTkFCTEVfQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAib251X3R1bmluZ19pbl9jb21wbGV0ZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfVFVOSU5HX0lOX0NPTVBMRVRFRCB9LCB7IC5uYW1lID0gIm9udV90dW5pbmdfb3V0X2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9UVU5JTkdfT1VUX0NPTVBMRVRFRCB9LCB7IC5uYW1lID0gIm9wdGljYWxfcmVmbGVjdGlvbiIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09QVElDQUxfUkVGTEVDVElPTiB9LCB7IC5uYW1lID0gInBvc3NpYmxlX2RyaWZ0IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUE9TU0lCTEVfRFJJRlQgfSwgeyAubmFtZSA9ICJwb3dlcl9jb25zdW1wdGlvbl9yZXBvcnQiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9QT1dFUl9DT05TVU1QVElPTl9SRVBPUlQgfSwgeyAubmFtZSA9ICJwb3dlcl9sZXZlbF9yZXBvcnQiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9QT1dFUl9MRVZFTF9SRVBPUlQgfSwgeyAubmFtZSA9ICJwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFIH0sIHsgLm5hbWUgPSAicHFzaSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1BRU0kgfSwgeyAubmFtZSA9ICJyYW5naW5nX2NvbXBsZXRlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1JBTkdJTkdfQ09NUExFVEVEIH0sIHsgLm5hbWUgPSAicmVnaXN0cmF0aW9uX2lkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUkVHSVNUUkFUSU9OX0lEIH0sIHsgLm5hbWUgPSAicnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRCB9LCB7IC5uYW1lID0gInNkaSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1NESSB9LCB7IC5uYW1lID0gInNlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTFVSRSB9LCB7IC5uYW1lID0gInNmaSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1NGSSB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQgfSwgeyAubmFtZSA9ICJzdWZpIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU1VGSSB9LCB7IC5uYW1lID0gInRpd2kiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9USVdJIH0sIHsgLm5hbWUgPSAidHVuaW5nX3Jlc3BvbnNlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfVFVOSU5HX1JFU1BPTlNFIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9hdXRvX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm9udV9zdGF0ZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9PTlVfU1RBVEUgfSwgeyAubmFtZSA9ICJvbnVfb2xkX3N0YXRlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX09OVV9PTERfU1RBVEUgfSwgeyAubmFtZSA9ICJhbGFybV9zdGF0ZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9BTEFSTV9TVEFURSB9LCB7IC5uYW1lID0gInJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkVHSVNUUkFUSU9OX0VOQ1JZUFRJT05fS0VZUyB9LCB7IC5uYW1lID0gImN1cnJlbnRfZW5jcnlwdGlvbl9rZXkiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQ1VSUkVOVF9FTkNSWVBUSU9OX0tFWSB9LCB7IC5uYW1lID0gInNlcmlhbF9udW1iZXIiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfU0VSSUFMX05VTUJFUiB9LCB7IC5uYW1lID0gInJlZ2lzdHJhdGlvbl9pZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SRUdJU1RSQVRJT05fSUQgfSwgeyAubmFtZSA9ICJyZWdpc3RyYXRpb25faWRfYXV0b19sZWFybmluZyIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SRUdJU1RSQVRJT05fSURfQVVUT19MRUFSTklORyB9LCB7IC5uYW1lID0gInJhbmdpbmdfYnVyc3RfcHJvZmlsZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SQU5HSU5HX0JVUlNUX1BST0ZJTEUgfSwgeyAubmFtZSA9ICJkYXRhX2J1cnN0X3Byb2ZpbGUiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfREFUQV9CVVJTVF9QUk9GSUxFIH0sIHsgLm5hbWUgPSAicmFuZ2luZ190aW1lIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JBTkdJTkdfVElNRSB9LCB7IC5uYW1lID0gImRpc2FibGVkX2FmdGVyX2Rpc2NvdmVyeSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9ESVNBQkxFRF9BRlRFUl9ESVNDT1ZFUlkgfSwgeyAubmFtZSA9ICJkZWFjdGl2YXRpb25fcmVhc29uIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0RFQUNUSVZBVElPTl9SRUFTT04gfSwgeyAubmFtZSA9ICJhbGxfZ2VtX3BvcnRzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0FMTF9HRU1fUE9SVFMgfSwgeyAubmFtZSA9ICJhbGxfYWxsb2NzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0FMTF9BTExPQ1MgfSwgeyAubmFtZSA9ICJleHRlbmRlZF9ndWFyZF90aW1lIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0VYVEVOREVEX0dVQVJEX1RJTUUgfSwgeyAubmFtZSA9ICJ1c19saW5lX3JhdGUiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfVVNfTElORV9SQVRFIH0sIHsgLm5hbWUgPSAiY2FsaWJyYXRpb25fcmVjb3JkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0NBTElCUkFUSU9OX1JFQ09SRCB9LCB7IC5uYW1lID0gInR1bmluZ19ncmFudWxhcml0eSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9UVU5JTkdfR1JBTlVMQVJJVFkgfSwgeyAubmFtZSA9ICJzdGVwX3R1bmluZ190aW1lIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1NURVBfVFVOSU5HX1RJTUUgfSwgeyAubmFtZSA9ICJwb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0aWVzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1BPV0VSX0xFVkVMTElOR19DQVBBQklMSVRJRVMgfSwgeyAubmFtZSA9ICJyZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkVRVUVTVF9SRUdJU1RSQVRJT05fU1RBVFVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9jZmdfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNvbnRyb2wiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9DSEFOR0VfUE9XRVJfTEVWRUxMSU5HX0lEX0NPTlRST0wgfSwgeyAubmFtZSA9ICJhdHRlbnVhdGlvbiIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0NIQU5HRV9QT1dFUl9MRVZFTExJTkdfSURfQVRURU5VQVRJT04gfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwb3J0X2lkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9QT1JUX0lEIH0sIHsgLm5hbWUgPSAiY3JjX29rIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9DUkNfT0sgfSwgeyAubmFtZSA9ICJwYWNrZXRfc2l6ZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRfSURfUEFDS0VUX1NJWkUgfSwgeyAubmFtZSA9ICJidWZmZXIiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUX0lEX0JVRkZFUiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X2NwdV9wYWNrZXQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwYWNrZXRfdHlwZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9UWVBFIH0sIHsgLm5hbWUgPSAiY2FsY19jcmMiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9DQUxDX0NSQyB9LCB7IC5uYW1lID0gIm51bWJlcl9vZl9wYWNrZXRzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfTlVNQkVSX09GX1BBQ0tFVFMgfSwgeyAubmFtZSA9ICJwYWNrZXRfc2l6ZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9TSVpFIH0sIHsgLm5hbWUgPSAiYnVmZmVyIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9jcHVfcGFja2V0cyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfZGZpX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0RGSV9JRF9BTEFSTV9TVEFUVVMgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfZGZpX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X2RmaV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfZGZpIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfZGZpX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9kZmlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X2RnaV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9ER0lfSURfQUxBUk1fU1RBVFVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2RnaV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9kZ2lfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X2RnaSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2RnaV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfZGdpX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9kb3dpX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0RPV0lfSURfQUxBUk1fU1RBVFVTIH0sIHsgLm5hbWUgPSAiZHJpZnRfdmFsdWUiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9ET1dJX0lEX0RSSUZUX1ZBTFVFIH0sIHsgLm5hbWUgPSAibmV3X2VxZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0RPV0lfSURfTkVXX0VRRCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9kb3dpX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X2Rvd2lfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X2Rvd2kgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9kb3dpX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9kb3dpX2lkX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfZXFkX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm9udV9pZCIsIC5kZXNjciA9ICJPTlUgSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9lcWQsIG9udV9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJlcWQiLCAuZGVzY3IgPSAiRVFEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfZXFkLCBlcWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2VxZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9lcWQiLCAuZGVzY3IgPSAiWEdQT04gT05VIEVRRCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfZXFkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9lcWRfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2VxZF9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9lcWRfbGlzdF91MzIgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfZXFkX2xpc3RfdTMyIiwgLmRlc2NyID0gIlZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIHhncG9uX29udV9lcWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2VxZF9saXN0X3UzMiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9EWU4sIC54ID0geyAuYXJyX2R5biA9IHsgLmVsZW1fdHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfZXFkLCAubGVuX3NpemUgPSA0LCAubWF4X3NpemUgPSBERUZBVUxUX0RZTl9BUlJfTUFYX1NJWkUgLyBzaXplb2YoYmNtb2x0X3hncG9uX29udV9lcWQpIH0gfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2NvbnN1bXB0aW9uX2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9nZXRfcG93ZXJfY29uc3VtcHRpb25faWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2NvbnN1bXB0aW9uX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9nZXRfcG93ZXJfY29uc3VtcHRpb24gZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9nZXRfcG93ZXJfY29uc3VtcHRpb25faWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X2dldF9wb3dlcl9jb25zdW1wdGlvbl9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2xldmVsX2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9nZXRfcG93ZXJfbGV2ZWxfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2xldmVsX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9nZXRfcG93ZXJfbGV2ZWwgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9nZXRfcG93ZXJfbGV2ZWxfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X2dldF9wb3dlcl9sZXZlbF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhbGxvY19pZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0lOVkFMSURfREJSVV9SRVBPUlRfSURfQUxMT0NfSUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJuZXdfa2V5IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0NPTVBMRVRFRF9JRF9ORVdfS0VZIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkX2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZXhwZWN0ZWRfa2V5IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSF9JRF9FWFBFQ1RFRF9LRVkgfSwgeyAubmFtZSA9ICJyZWNlaXZlZF9rZXkiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENIX0lEX1JFQ0VJVkVEX0tFWSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2ggZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9rZXlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicG9uX25pIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSB9LCB7IC5uYW1lID0gIm9udV9pZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0tFWV9JRF9PTlVfSUQgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfa2V5X2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfa2V5IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X2xvb2NpX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX0xPT0NJX0lEX0FMQVJNX1NUQVRVUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9sb29jaV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9sb29jaV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfbG9vY2kgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9sb29jaV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInBvcnRfaWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9QT1JUX0lEIH0sIHsgLm5hbWUgPSAiY3JjX29rIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfQ1JDX09LIH0sIHsgLm5hbWUgPSAicGFja2V0X3NpemUiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9QQUNLRVRfU0laRSB9LCB7IC5uYW1lID0gImJ1ZmZlciIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX09NQ0lfUEFDS0VUX0lEX0JVRkZFUiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfb21jaV9wYWNrZXQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0dXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfU1RBVFVTIH0sIHsgLm5hbWUgPSAiZmFpbF9yZWFzb24iLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfRkFJTF9SRUFTT04gfSwgeyAubmFtZSA9ICJyZWdpc3RyYXRpb25faWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfUkVHSVNUUkFUSU9OX0lEIH0sIHsgLm5hbWUgPSAicmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9SRUdJU1RSQVRJT05fRU5DUllQVElPTl9LRVlTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1faWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAib251X2FsYXJtIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfT05VX0FMQVJNX0lEX09OVV9BTEFSTSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1faWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9vbnVfYWxhcm0gZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1faWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X29udV9hbGFybV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURURfSURfU1RBVFVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInNlcmlhbF9udW1iZXIiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9PTlVfRElTQUJMRV9DT01QTEVURURfSURfU0VSSUFMX05VTUJFUiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic2VyaWFsX251bWJlciIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX09OVV9FTkFCTEVfQ09NUExFVEVEX0lEX1NFUklBTF9OVU1CRVIgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJyZXN1bHQiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX0lOX0NPTVBMRVRFRF9JRF9SRVNVTFQgfSwgeyAubmFtZSA9ICJmYWlsX3JlYXNvbiIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfSU5fQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9vbnVfdHVuaW5nX2luIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInJlc3VsdCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0NPTVBMRVRFRF9JRF9SRVNVTFQgfSwgeyAubmFtZSA9ICJmYWlsX3JlYXNvbiIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTiB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAidGFyZ2V0X2RzX3Bvbl9pZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1RBUkdFVF9EU19QT05fSUQgfSwgeyAubmFtZSA9ICJ0YXJnZXRfdXNfcG9uX2lkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfSURfVEFSR0VUX1VTX1BPTl9JRCB9LCB7IC5uYW1lID0gInRpbWVfdG9fc3dpdGNoIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfSURfVElNRV9UT19TV0lUQ0ggfSwgeyAubmFtZSA9ICJyb2xsYmFjayIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1JPTExCQUNLIH0sIHsgLm5hbWUgPSAic3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfSURfU1RBVFVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9vbnVfdHVuaW5nX291dCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uX2lkX3N0cmluZ190YWJsZVtdID0geyBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb25faWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb24gZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb25faWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X29wdGljYWxfcmVmbGVjdGlvbl9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImRlZmF1bHRfa2V5IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfUExPQU1fUEFDS0VUX0lEX0RFRkFVTFRfS0VZIH0sIHsgLm5hbWUgPSAicGxvYW0iLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9QTE9BTV9QQUNLRVRfSURfUExPQU0gfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfcGxvYW1fcGFja2V0IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1BPU1NJQkxFX0RSSUZUX0lEX0FMQVJNX1NUQVRVUyB9LCB7IC5uYW1lID0gImVzdGltYXRlZF9kcmlmdCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1BPU1NJQkxFX0RSSUZUX0lEX0VTVElNQVRFRF9EUklGVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJwb3dlcl9jb25zdW1wdGlvbl9yZXBvcnQiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9DT05TVU1QVElPTl9SRVBPUlRfSURfUE9XRVJfQ09OU1VNUFRJT05fUkVQT1JUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYXR0ZW51YXRpb24iLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9MRVZFTF9SRVBPUlRfSURfQVRURU5VQVRJT04gfSwgeyAubmFtZSA9ICJwb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0eSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1BPV0VSX0xFVkVMX1JFUE9SVF9JRF9QT1dFUl9MRVZFTExJTkdfQ0FQQUJJTElUWSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAib2xkX3N0YXRlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0VfSURfT0xEX1NUQVRFIH0sIHsgLm5hbWUgPSAibmV3X3N0YXRlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0VfSURfTkVXX1NUQVRFIH0sIHsgLm5hbWUgPSAicmVhc29uIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0VfSURfUkVBU09OIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9QUVNJX0lEX0FMQVJNX1NUQVRVUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9wcXNpX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X3Bxc2lfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X3Bxc2kgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9wcXNpX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9wcXNpX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0dXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9TVEFUVVMgfSwgeyAubmFtZSA9ICJmYWlsX3JlYXNvbiIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OIH0sIHsgLm5hbWUgPSAiZXFkIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfRVFEIH0sIHsgLm5hbWUgPSAibnVtYmVyX29mX3Bsb2FtcyIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX05VTUJFUl9PRl9QTE9BTVMgfSwgeyAubmFtZSA9ICJwb3dlcl9sZXZlbCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX1BPV0VSX0xFVkVMIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInJlZ2lzdHJhdGlvbl9pZCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1JFR0lTVFJBVElPTl9JRF9JRF9SRUdJU1RSQVRJT05fSUQgfSwgeyAubmFtZSA9ICJyZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9SRUdJU1RSQVRJT05fSURfSURfUkVRVUVTVF9SRUdJU1RSQVRJT05fU1RBVFVTIH0sIHsgLm5hbWUgPSAicmVxdWVzdF9yZWdpc3RyYXRpb25fZmFpbF9yZWFzb24iLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9SRUdJU1RSQVRJT05fSURfSURfUkVRVUVTVF9SRUdJU1RSQVRJT05fRkFJTF9SRUFTT04gfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25fa2V5c19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwbG9hbV9payIsIC5kZXNjciA9ICJwbG9hbSBpayIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9rZXlzLCBwbG9hbV9payksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Flc19rZXkgfSwgeyAubmFtZSA9ICJvbWNpX2lrIiwgLmRlc2NyID0gIm9tY2kgaWsiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25fa2V5cywgb21jaV9payksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Flc19rZXkgfSwgeyAubmFtZSA9ICJvbWNpX2sxIiwgLmRlc2NyID0gIm9tY2kgazEiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25fa2V5cywgb21jaV9rMSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Flc19rZXkgfSwgeyAubmFtZSA9ICJvbWNpX2syIiwgLmRlc2NyID0gIm9tY2kgazIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25fa2V5cywgb21jaV9rMiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Flc19rZXkgfSwgeyAubmFtZSA9ICJrZWsiLCAuZGVzY3IgPSAia2VrIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXMsIGtlayksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Flc19rZXkgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXMgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXMiLCAuZGVzY3IgPSAiWEdQT04gT05VIHJlZ2lzdHJhdGlvbiBrZXlzIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25fa2V5cyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXNfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9rZXlzX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gInNtYV9mbGFnIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfUkVRVUVTVF9SRUdJU1RSQVRJT05fSURfU01BX0ZMQUcgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25faWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25faWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25faWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0dXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9TVEFUVVMgfSwgeyAubmFtZSA9ICJmYWlsX3JlYXNvbiIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9yc3NpX21lYXN1cmVtZW50IGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfc2RpX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1NESV9JRF9BTEFSTV9TVEFUVVMgfSwgeyAubmFtZSA9ICJiZXIiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9TRElfSURfQkVSIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3NkaV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9zZGlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X3NkaSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3NkaV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfc2RpX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9GQUlMVVJFX0lEX1NUQVRVUyB9LCB7IC5uYW1lID0gImZhaWxfcmVhc29uIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9GQUlMVVJFX0lEX0ZBSUxfUkVBU09OIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gIm1hc3Rlcl9rZXkiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0lEX01BU1RFUl9LRVkgfSwgeyAubmFtZSA9ICJidWZmZXIiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0lEX0JVRkZFUiB9LCB7IC5uYW1lID0gIm1pYyIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fSURfTUlDIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25faWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbiBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25faWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25faWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGVfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAib251X3N0YXRlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfU0VUX09OVV9TVEFURV9JRF9PTlVfU1RBVEUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV9zZXRfb251X3N0YXRlIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1NGSV9JRF9BTEFSTV9TVEFUVVMgfSwgeyAubmFtZSA9ICJiZXIiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9TRklfSURfQkVSIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3NmaV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9zZmlfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X3NmaSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3NmaV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZCBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImNmZyIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfQ0ZHX0lEX0NGRyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfc3RhdF9jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X3N0YXRfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicG9zaXRpdmVfZHJpZnQiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1BPU0lUSVZFX0RSSUZUIH0sIHsgLm5hbWUgPSAibmVnYXRpdmVfZHJpZnQiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX05FR0FUSVZFX0RSSUZUIH0sIHsgLm5hbWUgPSAiZGVsaW1pdGVyX21pc3NfZGV0ZWN0aW9uIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9ERUxJTUlURVJfTUlTU19ERVRFQ1RJT04gfSwgeyAubmFtZSA9ICJiaXAzMl9lcnJvcnMiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0JJUDMyX0VSUk9SUyB9LCB7IC5uYW1lID0gInJ4X3dvcmRzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9XT1JEUyB9LCB7IC5uYW1lID0gImZlY19jb3JyZWN0ZWRfc3ltYm9scyIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX0NPUlJFQ1RFRF9TWU1CT0xTIH0sIHsgLm5hbWUgPSAiZmVjX2NvcnJlY3RlZF9jb2Rld29yZHMiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX0ZFQ19DT1JSRUNURURfQ09ERVdPUkRTIH0sIHsgLm5hbWUgPSAiZmVjX3VuY29ycmVjdGFibGVfY29kZXdvcmRzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfVU5DT1JSRUNUQUJMRV9DT0RFV09SRFMgfSwgeyAubmFtZSA9ICJmZWNfY29kZXdvcmRzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09ERVdPUkRTIH0sIHsgLm5hbWUgPSAiZmVjX2NvcnJlY3RlZF9iaXRzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09SUkVDVEVEX0JJVFMgfSwgeyAubmFtZSA9ICJ4Z2VtX2tleV9lcnJvcnMiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1hHRU1fS0VZX0VSUk9SUyB9LCB7IC5uYW1lID0gInhnZW1fbG9zcyIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfWEdFTV9MT1NTIH0sIHsgLm5hbWUgPSAicnhfcGxvYW1zX21pY19lcnJvciIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfUExPQU1TX01JQ19FUlJPUiB9LCB7IC5uYW1lID0gInJ4X3Bsb2Ftc19ub25faWRsZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfUExPQU1TX05PTl9JRExFIH0sIHsgLm5hbWUgPSAicnhfb21jaSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfT01DSSB9LCB7IC5uYW1lID0gInJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1IgfSwgeyAubmFtZSA9ICJyeF9ieXRlcyIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfQllURVMgfSwgeyAubmFtZSA9ICJyeF9wYWNrZXRzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9QQUNLRVRTIH0sIHsgLm5hbWUgPSAidHhfYnl0ZXMiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1RYX0JZVEVTIH0sIHsgLm5hbWUgPSAidHhfcGFja2V0cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfVFhfUEFDS0VUUyB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zdGF0X2lkID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X3N0YXRfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X3N0YXQgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hncG9uX29udV9zdGF0X2lkX3N0cmluZ190YWJsZSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9zdWZpX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1NVRklfSURfQUxBUk1fU1RBVFVTIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3N1ZmlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfc3VmaV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4Z3Bvbl9vbnVfc3VmaSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3N1ZmlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fb251X3N1ZmlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X3Rpd2lfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9PTlVfVElXSV9JRF9BTEFSTV9TVEFUVVMgfSwgeyAubmFtZSA9ICJkcmlmdF92YWx1ZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1RJV0lfSURfRFJJRlRfVkFMVUUgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfdGl3aV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV90aXdpX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX29udV90aXdpIGdyb3VwLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfdGl3aV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2lkX3N0cmluZ190YWJsZVtdID0geyB7IC5uYW1lID0gImFjayIsIC52YWwgPSBCQ01PTFRfWEdQT05fT05VX1RVTklOR19SRVNQT05TRV9JRF9BQ0sgfSwgeyAubmFtZSA9ICJyZXN1bHQiLCAudmFsID0gQkNNT0xUX1hHUE9OX09OVV9UVU5JTkdfUkVTUE9OU0VfSURfUkVTVUxUIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfaWQiLCAuZGVzY3IgPSAiSWRlbnRpZmllcnMgZm9yIGFsbCBwcm9wZXJ0aWVzIGNvbnRhaW5lZCBpbiB0aGUgeGdwb25fb251X3R1bmluZ19yZXNwb25zZSBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2lkX3N0cmluZ190YWJsZSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJvbnVfaWQiLCAuZGVzY3IgPSAiT05VIElEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZSwgb251X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gInN0YXRlIiwgLmRlc2NyID0gIlN0YXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZSwgc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9vbnVfc3RhdGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlIiwgLmRlc2NyID0gIlhHUE9OIE9OVSBXaXRoIFN0YXRlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzUxMCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF81MTAiLCAuZGVzY3IgPSAiVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgeGdwb25fb251X3dpdGhfc3RhdGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzUxMCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9EWU4sIC54ID0geyAuYXJyX2R5biA9IHsgLmVsZW1fdHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZSwgLmxlbl9zaXplID0gMiwgLm1heF9zaXplID0gNTEwIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fcGxvYW1faGFuZGxpbmdfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWNrX3RpbWVvdXQiLCAuZGVzY3IgPSAiVGltZW91dCBmb3IgcmVjZWl2aW5nIEFDSyBwbG9hbSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fcGxvYW1faGFuZGxpbmcsIGFja190aW1lb3V0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gInJldHJhbnNfcmFuZ2luZ190aW1lIiwgLmRlc2NyID0gIk51bWJlciBvZiBSYW5naW5nIFRpbWUgcGxvYW0gcmV0cmFuc21pc3Npb25zIGluIGNhc2Ugb2YgQUNLIHRpbWVvdXQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nLCByZXRyYW5zX3JhbmdpbmdfdGltZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInJldHJhbnNfYXNzaWduX2FsbG9jX2lkIiwgLmRlc2NyID0gIk51bWJlciBvZiBBc3NpZ24gQWxsb2MgSUQgcGxvYW0gcmV0cmFuc21pc3Npb25zIGluIGNhc2Ugb2YgQUNLIHRpbWVvdXQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nLCByZXRyYW5zX2Fzc2lnbl9hbGxvY19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInJldHJhbnNfa2V5X2NvbnRyb2wiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIEtleSBDb250cm9sIHBsb2FtIHJldHJhbnNtaXNzaW9ucyBpbiBjYXNlIG9mIEFDSyB0aW1lb3V0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9wbG9hbV9oYW5kbGluZywgcmV0cmFuc19rZXlfY29udHJvbCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInJldHJhbnNfcmVxdWVzdF9yZWdpc3RyYXRpb24iLCAuZGVzY3IgPSAiTnVtYmVyIG9mIFJlcXVlc3QgUmVnaXN0cmF0aW9uIHBsb2FtIHJldHJhbnNtaXNzaW9ucyBpbiBjYXNlIG9mIEFDSyB0aW1lb3V0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9wbG9hbV9oYW5kbGluZywgcmV0cmFuc19yZXF1ZXN0X3JlZ2lzdHJhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fcGxvYW1faGFuZGxpbmciLCAuZGVzY3IgPSAiWEdQT04gUExPQU0gaGFuZGxpbmciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fcGxvYW1faGFuZGxpbmcpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fcGxvYW1faGFuZGxpbmdfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fcGxvYW1faGFuZGxpbmdfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAidGltZW91dCIsIC5kZXNjciA9ICJMT1Mgc3dpdGNoIG92ZXIgdGltZW91dCBpbiBtaWxsaXNlY29uZHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nLCB0aW1lb3V0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gImdwaW9fcGluIiwgLmRlc2NyID0gIkdQSU8gcGluIGZvciBpbnB1dC9vdXRwdXQgc2lnbmFsIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZywgZ3Bpb19waW4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncGlvX3BpbiB9LCB7IC5uYW1lID0gImZhc3RfcmFuZ2luZyIsIC5kZXNjciA9ICJmYXN0IHJhbmdpbmcgIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZywgZmFzdF9yYW5naW5nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmcgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZyIsIC5kZXNjciA9ICJYR1BPTiBwcm90ZWN0aW9uIHN3aXRjaGluZyBjb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImRhdGFfbWFwX2RlbGF5X21zIiwgLmRlc2NyID0gImRlbGF5IHRvIHdhaXQgYWZ0ZXIgc2VuZGluZyByYW5naW5nIHRpbWUgZGVsdGEgYmVmb3JlIHJ1bm5pbmcgdGhlIGRhdGEgbWFwICAiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnLCBkYXRhX21hcF9kZWxheV9tcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJyZXJhbmdlX3NlbmRfcmFuZ2luZ190aW1lIiwgLmRlc2NyID0gIlNob3VsZCB0aGUgU00gc2VuZCB0aGUgY3VycmVudCByYW5naW5nIHRpbWUgYmVmb3JlIGRvaW5nIHRoZSByZS1yYW5naW5nICIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZGVidWcsIHJlcmFuZ2Vfc2VuZF9yYW5naW5nX3RpbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJyZXJhbmdlX3NlbmRfcmFuZ2luZ190aW1lX2RlbGF5IiwgLmRlc2NyID0gInRoZSBkZWxheSBiZXR3ZWVuIHNlbmRpbmcgdGhlIHJhbmdpbmcgdGltZSBhbmQgc3RhcnRpbmcgdGhlIHJlcmFuZ2UgIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1ZywgcmVyYW5nZV9zZW5kX3JhbmdpbmdfdGltZV9kZWxheSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1ZyA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnIiwgLmRlc2NyID0gInhncG9uIHByb3RlY3Rpb24gc3dpdGNoaW5nIGRlYnVnIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnX2ZpZWxkcyB9IH0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3Jzc2lfbm9ybWFsX2NvbmZpZ19maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwb2xhcml0eSIsIC5kZXNjciA9ICJSU1NJIHNpZ25hbCBwb2xhcml0eSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fcnNzaV9ub3JtYWxfY29uZmlnLCBwb2xhcml0eSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3BvbGFyaXR5IH0sIHsgLm5hbWUgPSAibG9jYXRpb24iLCAuZGVzY3IgPSAiUlNTSSBzaWduYWwgbG9jYXRpb24gaW4gd29yZHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3Jzc2lfbm9ybWFsX2NvbmZpZywgbG9jYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJsb2NhdGlvbl9zaWduIiwgLmRlc2NyID0gIlJTU0kgc2lnbmFsIGxvY2F0aW9uIHNpZ24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3Jzc2lfbm9ybWFsX2NvbmZpZywgbG9jYXRpb25fc2lnbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3NpZ24gfSwgeyAubmFtZSA9ICJwdWxzZV93aWR0aCIsIC5kZXNjciA9ICJSU1NJIHB1bHNlIHdpZHRoIGluIHdvcmRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWcsIHB1bHNlX3dpZHRoKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gIm1pbmltdW1fYnVyc3QiLCAuZGVzY3IgPSAiRGF0YSBtaW5pbXVtIGJ1cnN0IHNpemUgaW4gd29yZHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3Jzc2lfbm9ybWFsX2NvbmZpZywgbWluaW11bV9idXJzdCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWcgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWciLCAuZGVzY3IgPSAiWEdQT04gUlNTSSBub3JtYWwgY29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWcpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fcnNzaV9ub3JtYWxfY29uZmlnX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3Jzc2lfbm9ybWFsX2NvbmZpZ19maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9yc3NpX3JhbmdpbmdfY29uZmlnX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXJ0X29uX2VkIiwgLmRlc2NyID0gInN0YXJ0IG9uIEVEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9yc3NpX3JhbmdpbmdfY29uZmlnLCBzdGFydF9vbl9lZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImZyYW1lX2RlbGF5IiwgLmRlc2NyID0gImZyYW1lIGRlbGF5IGZyb20gRUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3Jzc2lfcmFuZ2luZ19jb25maWcsIGZyYW1lX2RlbGF5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAid29yZF9kZWxheSIsIC5kZXNjciA9ICJ3b3JkIGRlbGF5IGZyb20gRUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3Jzc2lfcmFuZ2luZ19jb25maWcsIHdvcmRfZGVsYXkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiZnJhbWVfZGVsYXlfYWZ0ZXJfZWQiLCAuZGVzY3IgPSAiZnJhbWUgZGVsYXkgZnJvbSBzdGFydCAgb2YgcmFuZ2luZyB3aW5kb3ciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3Jzc2lfcmFuZ2luZ19jb25maWcsIGZyYW1lX2RlbGF5X2FmdGVyX2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAid29yZF9kZWxheV9hZnRlcl9lZCIsIC5kZXNjciA9ICJ3b3JkIGRlbGF5IGZyb20gc3RhcnQgIG9mIHJhbmdpbmcgd2luZG93IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9yc3NpX3JhbmdpbmdfY29uZmlnLCB3b3JkX2RlbGF5X2FmdGVyX2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3Jzc2lfcmFuZ2luZ19jb25maWcgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9yc3NpX3JhbmdpbmdfY29uZmlnIiwgLmRlc2NyID0gInhncG9uIHJzc2kgcmFuZ2luZyBjb25maWciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fcnNzaV9yYW5naW5nX2NvbmZpZyksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9yc3NpX3JhbmdpbmdfY29uZmlnX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3Jzc2lfcmFuZ2luZ19jb25maWdfZmllbGRzIH0gfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInRyeF9yZXNldF9wYXR0ZXJuX2ZpcnN0IiwgLmRlc2NyID0gInRyeCByZXNldCBwYXR0ZXJuIGZpcnN0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4sIHRyeF9yZXNldF9wYXR0ZXJuX2ZpcnN0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdF9oZXggfSwgeyAubmFtZSA9ICJ0cnhfcmVzZXRfcGF0dGVybl9taWRkbGUiLCAuZGVzY3IgPSAidHJ4IHJlc2V0IHBhdHRlcm4gbWlkZGxlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4sIHRyeF9yZXNldF9wYXR0ZXJuX21pZGRsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3RfaGV4IH0sIHsgLm5hbWUgPSAidHJ4X3Jlc2V0X3BhdHRlcm5fbGFzdCIsIC5kZXNjciA9ICJ0cnggcmVzZXQgcGF0dGVybiBsYXN0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4sIHRyeF9yZXNldF9wYXR0ZXJuX2xhc3QpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90X2hleCB9LCB7IC5uYW1lID0gInRyeF9yZXNldF9taWRkbGVfcmVwZWF0cyIsIC5kZXNjciA9ICJ0cnggcmVzZXQgbWlkZGxlIHJlcGVhdHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3J4X3Jhbmdpbmdfc21fcGF0dGVybiwgdHJ4X3Jlc2V0X21pZGRsZV9yZXBlYXRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAidHJ4X3Jlc2V0X2xvY2F0aW9uIiwgLmRlc2NyID0gInRyeCByZXNldCBsb2NhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuLCB0cnhfcmVzZXRfbG9jYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJiY2RyX3Jlc2V0X3BhdHRlcm5fZmlyc3QiLCAuZGVzY3IgPSAiYmNkciByZXNldCBwYXR0ZXJuIGZpcnN0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4sIGJjZHJfcmVzZXRfcGF0dGVybl9maXJzdCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3RfaGV4IH0sIHsgLm5hbWUgPSAiYmNkcl9yZXNldF9wYXR0ZXJuX21pZGRsZSIsIC5kZXNjciA9ICJiY2RyIHJlc2V0IHBhdHRlcm4gbWlkZGxlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4sIGJjZHJfcmVzZXRfcGF0dGVybl9taWRkbGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90X2hleCB9LCB7IC5uYW1lID0gImJjZHJfcmVzZXRfcGF0dGVybl9sYXN0IiwgLmRlc2NyID0gImJjZHIgcmVzZXQgcGF0dGVybiBsYXN0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4sIGJjZHJfcmVzZXRfcGF0dGVybl9sYXN0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdF9oZXggfSwgeyAubmFtZSA9ICJiY2RyX3Jlc2V0X21pZGRsZV9yZXBlYXRzIiwgLmRlc2NyID0gImJjZHIgcmVzZXQgbWlkZGxlIHJlcGVhdHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3J4X3Jhbmdpbmdfc21fcGF0dGVybiwgYmNkcl9yZXNldF9taWRkbGVfcmVwZWF0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gImJjZHJfcmVzZXRfbG9jYXRpb24iLCAuZGVzY3IgPSAiYmNkciByZXNldCBsb2NhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuLCBiY2RyX3Jlc2V0X2xvY2F0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAiYmNkcl9yZXNldF9wb2xhcml0eSIsIC5kZXNjciA9ICJiY2RyIHJlc2V0IHBvbGFyaXR5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4sIGJjZHJfcmVzZXRfcG9sYXJpdHkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4gPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4iLCAuZGVzY3IgPSAieGdwb24gcnggcmFuZ2luZyBTTSBwYXR0ZXJucyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4pLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fcnhfcmFuZ2luZ19zbV9wYXR0ZXJuX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3J4X3Jhbmdpbmdfc21fcGF0dGVybl9maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX3NlcmRlc19yYW5naW5nX21vZGVfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAiZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX1NFUkRFU19SQU5HSU5HX01PREVfRUQgfSwgeyAubmFtZSA9ICJiY2RyIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9TRVJERVNfUkFOR0lOR19NT0RFX0JDRFIgfSwgeyAubmFtZSA9ICJmYXN0X3JhbmdpbmcxIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9TRVJERVNfUkFOR0lOR19NT0RFX0ZBU1RfUkFOR0lORzEgfSwgeyAubmFtZSA9ICJmYXN0X3JhbmdpbmcyIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9TRVJERVNfUkFOR0lOR19NT0RFX0ZBU1RfUkFOR0lORzIgfSwgQkNNQ0xJX0VOVU1fTEFTVCB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9zZXJkZXNfcmFuZ2luZ19tb2RlID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fc2VyZGVzX3JhbmdpbmdfbW9kZSIsIC5kZXNjciA9ICJ4Z3BvbiBzZXJkZXMgcmFuZ2luZyBtb2RlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX3NlcmRlc19yYW5naW5nX21vZGUpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fc2VyZGVzX3JhbmdpbmdfbW9kZV9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fc2VyZGVzX2NvbmZpZ3VyYXRpb25fZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibXVsdGlfZWRfbW9kZSIsIC5kZXNjciA9ICJtdWx0aSBlZCBtb2RlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9zZXJkZXNfY29uZmlndXJhdGlvbiwgbXVsdGlfZWRfbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInJhbmdpbmdfbW9kZSIsIC5kZXNjciA9ICJyYW5naW5nIG1vZGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3NlcmRlc19jb25maWd1cmF0aW9uLCByYW5naW5nX21vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9zZXJkZXNfcmFuZ2luZ19tb2RlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fc2VyZGVzX2NvbmZpZ3VyYXRpb24gPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9zZXJkZXNfY29uZmlndXJhdGlvbiIsIC5kZXNjciA9ICJ4Z3BvbiBzZXJkZXMgY29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9zZXJkZXNfY29uZmlndXJhdGlvbiksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9zZXJkZXNfY29uZmlndXJhdGlvbl9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9zZXJkZXNfY29uZmlndXJhdGlvbl9maWVsZHMgfSB9IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9zbl9hY3F1aXNpdGlvbl9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJpbnRlcnZhbCIsIC5kZXNjciA9ICJTTiBwcm9jZXNzIGludGVydmFsIGluIG1pbGxpc2Vjb25kcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fc25fYWNxdWlzaXRpb24sIGludGVydmFsKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImNvbnRyb2wiLCAuZGVzY3IgPSAiU04gcHJvY2VzcyBjb250cm9sIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9zbl9hY3F1aXNpdGlvbiwgY29udHJvbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfSwgeyAubmFtZSA9ICJvbnVfcG9zdF9kaXNjb3ZlcnlfbW9kZSIsIC5kZXNjciA9ICJBdXRvbWF0aWMgb3BlcmF0aW9uIGZvbGxvd2luZyBPTlUgZGlzY292ZXJ5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9zbl9hY3F1aXNpdGlvbiwgb251X3Bvc3RfZGlzY292ZXJ5X21vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9vbnVfcG9zdF9kaXNjb3ZlcnlfbW9kZSB9LCB7IC5uYW1lID0gImJ1cnN0X3Byb2ZpbGUiLCAuZGVzY3IgPSAiQnVyc3QgcHJvZmlsZSBpbmRleCB0byB1c2UgZHVyaW5nIFNOIGFjcXVpc2l0aW9uIHdpbmRvdyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fc25fYWNxdWlzaXRpb24sIGJ1cnN0X3Byb2ZpbGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9zbl9hY3F1aXNpdGlvbiA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX3NuX2FjcXVpc2l0aW9uIiwgLmRlc2NyID0gIlhHUE9OIFNOIEFjcXVpc2l0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX3NuX2FjcXVpc2l0aW9uKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3NuX2FjcXVpc2l0aW9uX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3NuX2FjcXVpc2l0aW9uX2ZpZWxkcyB9IH0gfTsKK2JjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fdHJ4X2NmZ19pZF9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJidXJzdF9wcm9maWxlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0JVUlNUX1BST0ZJTEUgfSwgeyAubmFtZSA9ICJ0cmFuc2NlaXZlcl9jb25maWciLCAudmFsID0gQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfVFJBTlNDRUlWRVJfQ09ORklHIH0sIHsgLm5hbWUgPSAidHJhbnNjZWl2ZXJfdHlwZSIsIC52YWwgPSBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9UUkFOU0NFSVZFUl9UWVBFIH0sIHsgLm5hbWUgPSAiZGVidWciLCAudmFsID0gQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfREVCVUcgfSwgeyAubmFtZSA9ICJyc3NpX25vcm1hbF9jb25maWciLCAudmFsID0gQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUlNTSV9OT1JNQUxfQ09ORklHIH0sIHsgLm5hbWUgPSAicnNzaV9yYW5naW5nX2NvbmZpZyIsIC52YWwgPSBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SU1NJX1JBTkdJTkdfQ09ORklHIH0sIHsgLm5hbWUgPSAic2VyZGVzX2NvbmZpZ3VyYXRpb24iLCAudmFsID0gQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfU0VSREVTX0NPTkZJR1VSQVRJT04gfSwgeyAubmFtZSA9ICJidXJzdF9wcm9maWxlX2RlbGltaXRlcl9tYXhfZXJyb3JzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0JVUlNUX1BST0ZJTEVfREVMSU1JVEVSX01BWF9FUlJPUlMgfSwgeyAubmFtZSA9ICJyYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQiLCAudmFsID0gQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUkFOR0lOR19TTV9QQVRURVJOU19BVF9JTklUIH0sIHsgLm5hbWUgPSAicmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1JBTkdJTkdfU01fUEFUVEVSTlNfRURfRkFJTFVSRSB9LCB7IC5uYW1lID0gInJlc2V0X29uX2RlbF9taXNzIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1JFU0VUX09OX0RFTF9NSVNTIH0sIHsgLm5hbWUgPSAiZWRfc3RhdGUiLCAudmFsID0gQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfRURfU1RBVEUgfSwgeyAubmFtZSA9ICJpbnZlcnRfZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfSU5WRVJUX0VEIH0sIHsgLm5hbWUgPSAiZW5kX29mX2J1cnN0X3Jlc2V0IiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0VORF9PRl9CVVJTVF9SRVNFVCB9LCB7IC5uYW1lID0gInRyeF9yc3RfcG9sYXJpdHkiLCAudmFsID0gQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfVFJYX1JTVF9QT0xBUklUWSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3RyeF9jZmdfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl90cnhfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX3RyeF9jZmcgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX3RyeF9jZmdfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fdHJ4X2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fdHJ4X2RlYnVnX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJ4X3JldmVyc2VkX3BvbGFyaXR5IiwgLmRlc2NyID0gInRyYW5zY2VpdmVyIHJldmVyc2VkIHBvbGFyaXR5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfZGVidWcsIHJ4X3JldmVyc2VkX3BvbGFyaXR5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY29udHJvbF9zdGF0ZSB9LCB7IC5uYW1lID0gIm5lZ19vdXRfYml0IiwgLmRlc2NyID0gInR1cm4gYWxsIDEgdG8gMCBhbmQgYWxsIDAgdG8gMSBhdCB0aGUgb3V0cHV0LiBkZWZhdWx0IGlzIG5vdCB0byBtYWtlIG5lZ2F0aXZlIGJpdHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3RyeF9kZWJ1ZywgbmVnX291dF9iaXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb250cm9sX3N0YXRlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fdHJ4X2RlYnVnID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fdHJ4X2RlYnVnIiwgLmRlc2NyID0gInhncG9uX3RyeF9kZWJ1ZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl90cnhfZGVidWcpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fdHJ4X2RlYnVnX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3RyeF9kZWJ1Z19maWVsZHMgfSB9IH07CitiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX3RyeF9rZXlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicG9uX25pIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9UUlhfS0VZX0lEX1BPTl9OSSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3RyeF9rZXlfaWQgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl90cnhfa2V5X2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhncG9uX3RyeF9rZXkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX3RyeF9rZXlfaWQpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAueCA9IHsgLmUgPSBiY21vbHRfeGdwb25fdHJ4X2tleV9pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl90cnhfdHlwZV9zdHJpbmdfdGFibGVbXSA9IHsgeyAubmFtZSA9ICJsdGhfNzIyMl9wYyIsIC52YWwgPSBCQ01PTFRfWEdQT05fVFJYX1RZUEVfTFRIXzcyMjJfUEMgfSwgeyAubmFtZSA9ICJ1c2VyX2RlZmluZWQiLCAudmFsID0gQkNNT0xUX1hHUE9OX1RSWF9UWVBFX1VTRVJfREVGSU5FRCB9LCB7IC5uYW1lID0gInd0ZF9ydHhtMjY2XzcwMiIsIC52YWwgPSBCQ01PTFRfWEdQT05fVFJYX1RZUEVfV1REX1JUWE0yNjZfNzAyIH0sIHsgLm5hbWUgPSAibHRoXzcyMjJfYmNfcGx1cyIsIC52YWwgPSBCQ01PTFRfWEdQT05fVFJYX1RZUEVfTFRIXzcyMjJfQkNfUExVUyB9LCB7IC5uYW1lID0gImx0aF83MjI2X3BjIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9UUlhfVFlQRV9MVEhfNzIyNl9QQyB9LCB7IC5uYW1lID0gImx0aF81MzAyX3BjIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9UUlhfVFlQRV9MVEhfNTMwMl9QQyB9LCB7IC5uYW1lID0gInhncG9uX2dlbmVyYWxfMSIsIC52YWwgPSBCQ01PTFRfWEdQT05fVFJYX1RZUEVfWEdQT05fR0VORVJBTF8xIH0sIHsgLm5hbWUgPSAieGdwb25fZ2VuZXJhbF8yIiwgLnZhbCA9IEJDTU9MVF9YR1BPTl9UUlhfVFlQRV9YR1BPTl9HRU5FUkFMXzIgfSwgeyAubmFtZSA9ICJsdHdfNjI3X3hfcGMiLCAudmFsID0gQkNNT0xUX1hHUE9OX1RSWF9UWVBFX0xUV182MjdfWF9QQyB9LCB7IC5uYW1lID0gInhwcF94ZV9yXzNfY2RmYiIsIC52YWwgPSBCQ01PTFRfWEdQT05fVFJYX1RZUEVfWFBQX1hFX1JfM19DREZCIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fdHJ4X3R5cGUgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl90cnhfdHlwZSIsIC5kZXNjciA9ICJYR1BPTiBUUlggdHlwZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl90cnhfdHlwZSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94Z3Bvbl90cnhfdHlwZV9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94cG9uX3NlcmRlc19jZmdfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicnhfdmdhIiwgLnZhbCA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfVkdBIH0sIHsgLm5hbWUgPSAicnhfcGYiLCAudmFsID0gQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9QRiB9LCB7IC5uYW1lID0gInJ4X2xmcGYiLCAudmFsID0gQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9MRlBGIH0sIHsgLm5hbWUgPSAicnhfZGZlMSIsIC52YWwgPSBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTEgfSwgeyAubmFtZSA9ICJyeF9kZmUyIiwgLnZhbCA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFMiB9LCB7IC5uYW1lID0gInJ4X2RmZTMiLCAudmFsID0gQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkUzIH0sIHsgLm5hbWUgPSAicnhfZGZlNCIsIC52YWwgPSBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTQgfSwgeyAubmFtZSA9ICJyeF9kZmU1IiwgLnZhbCA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfREZFNSB9LCB7IC5uYW1lID0gInR4X3ByZSIsIC52YWwgPSBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX1BSRSB9LCB7IC5uYW1lID0gInR4X21haW4iLCAudmFsID0gQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9NQUlOIH0sIHsgLm5hbWUgPSAidHhfcG9zdDEiLCAudmFsID0gQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9QT1NUMSB9LCB7IC5uYW1lID0gInR4X3Bvc3QyIiwgLnZhbCA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfUE9TVDIgfSwgeyAubmFtZSA9ICJ0eF9wb3N0MyIsIC52YWwgPSBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QzIH0sIHsgLm5hbWUgPSAidHhfYW1wIiwgLnZhbCA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfQU1QIH0sIEJDTUNMSV9FTlVNX0xBU1QgfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2lkID0geyAubmFtZSA9ICJiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2lkIiwgLmRlc2NyID0gIklkZW50aWZpZXJzIGZvciBhbGwgcHJvcGVydGllcyBjb250YWluZWQgaW4gdGhlIHhwb25fc2VyZGVzX2NmZyBncm91cC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2lkKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTSwgLnggPSB7IC5lID0gYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19pZF9zdHJpbmdfdGFibGUgfSB9OworYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94cG9uX3NlcmRlc19rZXlfaWRfc3RyaW5nX3RhYmxlW10gPSB7IHsgLm5hbWUgPSAicG9uX25pIiwgLnZhbCA9IEJDTU9MVF9YUE9OX1NFUkRFU19LRVlfSURfUE9OX05JIH0sIHsgLm5hbWUgPSAiaW5zdGFuY2UiLCAudmFsID0gQkNNT0xUX1hQT05fU0VSREVTX0tFWV9JRF9JTlNUQU5DRSB9LCBCQ01DTElfRU5VTV9MQVNUIH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hwb25fc2VyZGVzX2tleV9pZCA9IHsgLm5hbWUgPSAiYmNtb2x0X3hwb25fc2VyZGVzX2tleV9pZCIsIC5kZXNjciA9ICJJZGVudGlmaWVycyBmb3IgYWxsIHByb3BlcnRpZXMgY29udGFpbmVkIGluIHRoZSB4cG9uX3NlcmRlc19rZXkgZ3JvdXAuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hwb25fc2VyZGVzX2tleV9pZCksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX0VOVU0sIC54ID0geyAuZSA9IGJjbW9sdF94cG9uX3NlcmRlc19rZXlfaWRfc3RyaW5nX3RhYmxlIH0gfTsKKworLyogPT09PSBPYmplY3Q6IGFlX25pID09PT0gKi8KKworLyogR3JvdXA6IGFlX25pIC0ga2V5ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfbmlfa2V5X2FlX25pID0geyAubmFtZSA9ICJhZV9uaSIsIC5kZXNjciA9ICJUaGUgaW5kZXggb2YgYSBzcGVjaWZpYyBBRSBOSSBpbnN0YW5jZSBhcyBzZWVuIGJ5IHRoZSBob3N0LiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9OSV9LRVlfSURfQUVfTkksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfbmlfa2V5LCBhZV9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBhZV9uaV9rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9hZV9uaV9rZXlfYWVfbmkgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX25pX2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhZV9uaSIsIC5kZXNjciA9ICJUaGUgaW5kZXggb2YgYSBzcGVjaWZpYyBBRSBOSSBpbnN0YW5jZSBhcyBzZWVuIGJ5IHRoZSBob3N0LiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfbmlfa2V5LCBhZV9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9uaV9rZXkgPSB7IC5uYW1lID0gImJjbW9sdF9hZV9uaV9rZXkiLCAuZGVzY3IgPSAia2V5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FlX25pX2tleSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9hZV9uaV9rZXlfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfYWVfbmlfa2V5X2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGFlX25pIC0gY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfbmlfY2ZnX21hY19hZGRyZXNzID0geyAubmFtZSA9ICJtYWNfYWRkcmVzcyIsIC5kZXNjciA9ICJUaGUgTUFDIGFkZHJlc3MgdXNlZCBmb3IgYWxsIGZyYW1lcyBnZW5lcmF0ZWQgYnkgdGhlIE9MVCBvbiB0aGUgbmV0d29yay4gIFRoaXMgdmFsdWUgbXVzdCBiZSBzZXQgYmVmb3JlIEFFX05JIGlzIGZpcnN0IGVuYWJsZWQsIGFuZCBjYW5ub3QgYmUgY2hhbmdlZCB3aGlsZSB0aGUgQUVfTkkgaXMgZW5hYmxlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfTklfQ0ZHX0lEX01BQ19BRERSRVNTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX25pX2NmZ19kYXRhLCBtYWNfYWRkcmVzcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfbWFjX2FkZHJlc3MgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9uaV9jZmdfYWVfbmlfZW4gPSB7IC5uYW1lID0gImFlX25pX2VuIiwgLmRlc2NyID0gIkluZGljYXRlcyB0aGUgZW5hYmxlIHN0YXRlIG9mIHRoZSBBRSBOSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9OSV9DRkdfSURfQUVfTklfRU4sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfbmlfY2ZnX2RhdGEsIGFlX25pX2VuKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYWVfbmlfZW5fc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9uaV9jZmdfbXR1XzEwZyA9IHsgLm5hbWUgPSAibXR1XzEwZyIsIC5kZXNjciA9ICJNYXhpbXVtIGZyYW1lIHNpemUgKGluY2x1ZGluZyBGQ1MpIG9uIHRoZSAxMEcgcGF0aC4gVGhpcyBhdHRyaWJ1dGUgY2Fubm90IGJlIGNoYW5nZWQgb24gYW4gZW5hYmxlZCBBRV9OSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfTklfQ0ZHX0lEX01UVV8xMEcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfbmlfY2ZnX2RhdGEsIG10dV8xMGcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfbmlfY2ZnX3ByYnNfZ2VuZXJhdG9yID0geyAubmFtZSA9ICJwcmJzX2dlbmVyYXRvciIsIC5kZXNjciA9ICJEUyBQUkJTIGdlbmVyYXRvciBjb25maWd1cmF0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX05JX0NGR19JRF9QUkJTX0dFTkVSQVRPUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9uaV9jZmdfZGF0YSwgcHJic19nZW5lcmF0b3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWcgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9uaV9jZmdfcHJic19jaGVja2VyID0geyAubmFtZSA9ICJwcmJzX2NoZWNrZXIiLCAuZGVzY3IgPSAiVVMgUFJCUyBjaGVja2VyIGNvbmZpZ3VyYXRpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfTklfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9uaV9jZmdfZGF0YSwgcHJic19jaGVja2VyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcHJic19jaGVja2VyX2NvbmZpZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX25pX2NmZ19wcmJzX3N0YXR1cyA9IHsgLm5hbWUgPSAicHJic19zdGF0dXMiLCAuZGVzY3IgPSAiUmVzdWx0IG9mIFVTIFBSQlMgY2hlY2tlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0FFX05JX0NGR19JRF9QUkJTX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9uaV9jZmdfZGF0YSwgcHJic19zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wcmJzX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGFlX25pX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2FlX25pX2NmZ19tYWNfYWRkcmVzcywgJnByb3BfZGVzY3JfYWVfbmlfY2ZnX2FlX25pX2VuLCAmcHJvcF9kZXNjcl9hZV9uaV9jZmdfbXR1XzEwZywgJnByb3BfZGVzY3JfYWVfbmlfY2ZnX3ByYnNfZ2VuZXJhdG9yLCAmcHJvcF9kZXNjcl9hZV9uaV9jZmdfcHJic19jaGVja2VyLCAmcHJvcF9kZXNjcl9hZV9uaV9jZmdfcHJic19zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX25pX2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm1hY19hZGRyZXNzIiwgLmRlc2NyID0gIlRoZSBNQUMgYWRkcmVzcyB1c2VkIGZvciBhbGwgZnJhbWVzIGdlbmVyYXRlZCBieSB0aGUgT0xUIG9uIHRoZSBuZXR3b3JrLiAgVGhpcyB2YWx1ZSBtdXN0IGJlIHNldCBiZWZvcmUgQUVfTkkgaXMgZmlyc3QgZW5hYmxlZCwgYW5kIGNhbm5vdCBiZSBjaGFuZ2VkIHdoaWxlIHRoZSBBRV9OSSBpcyBlbmFibGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfbmlfY2ZnX2RhdGEsIG1hY19hZGRyZXNzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19tYWNfYWRkcmVzcyB9LCB7IC5uYW1lID0gImFlX25pX2VuIiwgLmRlc2NyID0gIkluZGljYXRlcyB0aGUgZW5hYmxlIHN0YXRlIG9mIHRoZSBBRSBOSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX25pX2NmZ19kYXRhLCBhZV9uaV9lbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FlX25pX2VuX3N0YXRlIH0sIHsgLm5hbWUgPSAibXR1XzEwZyIsIC5kZXNjciA9ICJNYXhpbXVtIGZyYW1lIHNpemUgKGluY2x1ZGluZyBGQ1MpIG9uIHRoZSAxMEcgcGF0aC4gVGhpcyBhdHRyaWJ1dGUgY2Fubm90IGJlIGNoYW5nZWQgb24gYW4gZW5hYmxlZCBBRV9OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX25pX2NmZ19kYXRhLCBtdHVfMTBnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gInByYnNfZ2VuZXJhdG9yIiwgLmRlc2NyID0gIkRTIFBSQlMgZ2VuZXJhdG9yIGNvbmZpZ3VyYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX25pX2NmZ19kYXRhLCBwcmJzX2dlbmVyYXRvciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZyB9LCB7IC5uYW1lID0gInByYnNfY2hlY2tlciIsIC5kZXNjciA9ICJVUyBQUkJTIGNoZWNrZXIgY29uZmlndXJhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfbmlfY2ZnX2RhdGEsIHByYnNfY2hlY2tlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcgfSwgeyAubmFtZSA9ICJwcmJzX3N0YXR1cyIsIC5kZXNjciA9ICJSZXN1bHQgb2YgVVMgUFJCUyBjaGVja2VyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9uaV9jZmdfZGF0YSwgcHJic19zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wcmJzX3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX25pX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfYWVfbmlfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiY2ZnIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FlX25pX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2FlX25pX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2FlX25pX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGFlX25pIC0gc2V0X2FlX25pX2VuX3N0YXRlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX25ld19zdGF0ZSA9IHsgLm5hbWUgPSAibmV3X3N0YXRlIiwgLmRlc2NyID0gIk5ldyBFUE9OIE5JIGVuYWJsZSBzdGF0ZS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfTklfU0VUX0FFX05JX0VOX1NUQVRFX0lEX05FV19TVEFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfZGF0YSwgbmV3X3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYWVfbmlfZW5fc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBhZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfbmV3X3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJuZXdfc3RhdGUiLCAuZGVzY3IgPSAiTmV3IEVQT04gTkkgZW5hYmxlIHN0YXRlLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2RhdGEsIG5ld19zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FlX25pX2VuX3N0YXRlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfZGF0YSIsIC5kZXNjciA9ICJTZXQgdGhlIEFFIE5JIGVuYWJsZSBzdGF0ZS4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiA9PT09IE9iamVjdDogYWVfcGF0aF9kcyA9PT09ICovCisKKy8qIEdyb3VwOiBhZV9wYXRoX2RzIC0ga2V5ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF9kc19rZXlfYWVfbmkgPSB7IC5uYW1lID0gImFlX25pIiwgLmRlc2NyID0gIkFFIE5JIGFzc29jaWF0ZWQgd2l0aCB0aGlzIDEwRyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX1BBVEhfRFNfS0VZX0lEX0FFX05JLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfa2V5LCBhZV9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBhZV9wYXRoX2RzX2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfa2V5X2FlX25pIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX2RzX2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhZV9uaSIsIC5kZXNjciA9ICJBRSBOSSBhc3NvY2lhdGVkIHdpdGggdGhpcyAxMEcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19rZXksIGFlX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfZHNfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfYWVfcGF0aF9kc19rZXkiLCAuZGVzY3IgPSAia2V5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfZHNfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfZHNfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfZHNfa2V5X2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGFlX3BhdGhfZHMgLSBzdGF0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF9kc19zdGF0X2J5dGVzID0geyAubmFtZSA9ICJieXRlcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJ5dGVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0JZVEVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhLCBieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX2RzX3N0YXRfZnJhbWVzID0geyAubmFtZSA9ICJmcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhLCBmcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF9kc19zdGF0X2ZyYW1lc182NCA9IHsgLm5hbWUgPSAiZnJhbWVzXzY0IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNjQgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzY0LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhLCBmcmFtZXNfNjQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF9kc19zdGF0X2ZyYW1lc182NV8xMjcgPSB7IC5uYW1lID0gImZyYW1lc182NV8xMjciLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA2NSB0byAxMjcgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzY1XzEyNywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzY1XzEyNyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX2RzX3N0YXRfZnJhbWVzXzEyOF8yNTUgPSB7IC5uYW1lID0gImZyYW1lc18xMjhfMjU1IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTI4IHRvIDI1NSBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzEyOF8yNTUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF9kc19zdGF0X2ZyYW1lc18yNTZfNTExID0geyAubmFtZSA9ICJmcmFtZXNfMjU2XzUxMSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDI1NiB0byA1MTEgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGEsIGZyYW1lc18yNTZfNTExKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfc3RhdF9mcmFtZXNfNTEyXzEwMjMgPSB7IC5uYW1lID0gImZyYW1lc181MTJfMTAyMyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDUxMiB0byAxMDIzIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzUxMl8xMDIzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfc3RhdF9mcmFtZXNfMTAyNF8xNTE4ID0geyAubmFtZSA9ICJmcmFtZXNfMTAyNF8xNTE4IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTAyNCB0byAxNTE4IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTgsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGEsIGZyYW1lc18xMDI0XzE1MTgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF9kc19zdGF0X2ZyYW1lc18xNTE5XzIwNDcgPSB7IC5uYW1lID0gImZyYW1lc18xNTE5XzIwNDciLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxNTE5IHRvIDIwNDcgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzE1MTlfMjA0NyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX2RzX3N0YXRfZnJhbWVzXzIwNDhfNDA5NSA9IHsgLm5hbWUgPSAiZnJhbWVzXzIwNDhfNDA5NSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDIwNDggdG8gNDA5NSBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhLCBmcmFtZXNfMjA0OF80MDk1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfc3RhdF9mcmFtZXNfNDA5Nl85MjE2ID0geyAubmFtZSA9ICJmcmFtZXNfNDA5Nl85MjE2IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNDA5NiB0byA5MjE2IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTYsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGEsIGZyYW1lc180MDk2XzkyMTYpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF9kc19zdGF0X2ZyYW1lc185MjE3XzE2MzgzID0geyAubmFtZSA9ICJmcmFtZXNfOTIxN18xNjM4MyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDkyMTcgdG8gMTYzODMgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGEsIGZyYW1lc185MjE3XzE2MzgzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfc3RhdF9icm9hZGNhc3RfZnJhbWVzID0geyAubmFtZSA9ICJicm9hZGNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnJvYWRjYXN0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhLCBicm9hZGNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfc3RhdF9kYXRhX2J5dGVzID0geyAubmFtZSA9ICJkYXRhX2J5dGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9EQVRBX0JZVEVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhLCBkYXRhX2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfc3RhdF9tdWx0aWNhc3RfZnJhbWVzID0geyAubmFtZSA9ICJtdWx0aWNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgbXVsdGljYXN0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhLCBtdWx0aWNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfc3RhdF91bmljYXN0X2ZyYW1lcyA9IHsgLm5hbWUgPSAidW5pY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB1bmljYXN0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSwgdW5pY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF9kc19zdGF0X2Fib3J0X2ZyYW1lcyA9IHsgLm5hbWUgPSAiYWJvcnRfZnJhbWVzIiwgLmRlc2NyID0gIk51bWJlciBvZiBhYm9ydCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfSURfQUJPUlRfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhLCBhYm9ydF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgYWVfcGF0aF9kc19zdGF0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfYWVfcGF0aF9kc19zdGF0X2J5dGVzLCAmcHJvcF9kZXNjcl9hZV9wYXRoX2RzX3N0YXRfZnJhbWVzLCAmcHJvcF9kZXNjcl9hZV9wYXRoX2RzX3N0YXRfZnJhbWVzXzY0LCAmcHJvcF9kZXNjcl9hZV9wYXRoX2RzX3N0YXRfZnJhbWVzXzY1XzEyNywgJnByb3BfZGVzY3JfYWVfcGF0aF9kc19zdGF0X2ZyYW1lc18xMjhfMjU1LCAmcHJvcF9kZXNjcl9hZV9wYXRoX2RzX3N0YXRfZnJhbWVzXzI1Nl81MTEsICZwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfc3RhdF9mcmFtZXNfNTEyXzEwMjMsICZwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfc3RhdF9mcmFtZXNfMTAyNF8xNTE4LCAmcHJvcF9kZXNjcl9hZV9wYXRoX2RzX3N0YXRfZnJhbWVzXzE1MTlfMjA0NywgJnByb3BfZGVzY3JfYWVfcGF0aF9kc19zdGF0X2ZyYW1lc18yMDQ4XzQwOTUsICZwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfc3RhdF9mcmFtZXNfNDA5Nl85MjE2LCAmcHJvcF9kZXNjcl9hZV9wYXRoX2RzX3N0YXRfZnJhbWVzXzkyMTdfMTYzODMsICZwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfc3RhdF9icm9hZGNhc3RfZnJhbWVzLCAmcHJvcF9kZXNjcl9hZV9wYXRoX2RzX3N0YXRfZGF0YV9ieXRlcywgJnByb3BfZGVzY3JfYWVfcGF0aF9kc19zdGF0X211bHRpY2FzdF9mcmFtZXMsICZwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfc3RhdF91bmljYXN0X2ZyYW1lcywgJnByb3BfZGVzY3JfYWVfcGF0aF9kc19zdGF0X2Fib3J0X2ZyYW1lcyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYnl0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBieXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSwgYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhLCBmcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzY0IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNjQgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGEsIGZyYW1lc182NCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfNjVfMTI3IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNjUgdG8gMTI3IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhLCBmcmFtZXNfNjVfMTI3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc18xMjhfMjU1IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTI4IHRvIDI1NSBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzEyOF8yNTUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzI1Nl81MTEiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAyNTYgdG8gNTExIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhLCBmcmFtZXNfMjU2XzUxMSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfNTEyXzEwMjMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA1MTIgdG8gMTAyMyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzUxMl8xMDIzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc18xMDI0XzE1MTgiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMDI0IHRvIDE1MTggYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGEsIGZyYW1lc18xMDI0XzE1MTgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzE1MTlfMjA0NyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDE1MTkgdG8gMjA0NyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzE1MTlfMjA0NyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfMjA0OF80MDk1IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMjA0OCB0byA0MDk1IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhLCBmcmFtZXNfMjA0OF80MDk1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc180MDk2XzkyMTYiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA0MDk2IHRvIDkyMTYgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGEsIGZyYW1lc180MDk2XzkyMTYpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzkyMTdfMTYzODMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA5MjE3IHRvIDE2MzgzIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhLCBmcmFtZXNfOTIxN18xNjM4MyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJicm9hZGNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnJvYWRjYXN0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSwgYnJvYWRjYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJkYXRhX2J5dGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSwgZGF0YV9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJtdWx0aWNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgbXVsdGljYXN0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSwgbXVsdGljYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJ1bmljYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHVuaWNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhLCB1bmljYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJhYm9ydF9mcmFtZXMiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIGFib3J0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSwgYWJvcnRfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfYWVfcGF0aF9kc19zdGF0X2RhdGEiLCAuZGVzY3IgPSAic3RhdCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX2RzX3N0YXRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBhZV9wYXRoX2RzIC0gc3RhdF9jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX2RzX3N0YXRfY2ZnX2NmZyA9IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX0RTX1NUQVRfQ0ZHX0lEX0NGRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgYWVfcGF0aF9kc19zdGF0X2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfc3RhdF9jZmdfY2ZnIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZ19kYXRhLCBjZmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfZGF0YSIsIC5kZXNjciA9ICJTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBhZV9wYXRoX2RzIC0gc3RhdF9hbGFybV9yYWlzZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX1BBVEhfRFNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX2RzX3N0YXRfaWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBhZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9zdGF0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBhZV9wYXRoX2RzIC0gc3RhdF9hbGFybV9jbGVhcmVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCA9IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfUEFUSF9EU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF9kc19zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9zdGF0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF9kc19zdGF0X2lkIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGFlX3BhdGhfZHMgLSBhdXRvX2NmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfYXV0b19jZmdfc3RhdF9hbGFybV9jbGVhcmVkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fY2xlYXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfYXV0b19jZmdfc3RhdF9hbGFybV9yYWlzZWQgPSB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX3JhaXNlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9yYWlzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBhZV9wYXRoX2RzX2F1dG9fY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfYWVfcGF0aF9kc19hdXRvX2NmZ19zdGF0X2FsYXJtX2NsZWFyZWQsICZwcm9wX2Rlc2NyX2FlX3BhdGhfZHNfYXV0b19jZmdfc3RhdF9hbGFybV9yYWlzZWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX2NsZWFyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9yYWlzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2RhdGEiLCAuZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfZHNfYXV0b19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogPT09PSBPYmplY3Q6IGFlX3BhdGhfdXMgPT09PSAqLworCisvKiBHcm91cDogYWVfcGF0aF91cyAtIGtleSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfa2V5X2FlX25pID0geyAubmFtZSA9ICJhZV9uaSIsIC5kZXNjciA9ICJBRSBOSSBhc3NvY2lhdGVkIHdpdGggdGhpcyAxMEcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfUEFUSF9VU19LRVlfSURfQUVfTkksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19rZXksIGFlX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGFlX3BhdGhfdXNfa2V5X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfYWVfcGF0aF91c19rZXlfYWVfbmkgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfdXNfa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFlX25pIiwgLmRlc2NyID0gIkFFIE5JIGFzc29jaWF0ZWQgd2l0aCB0aGlzIDEwRyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19rZXksIGFlX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfdXNfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfYWVfcGF0aF91c19rZXkiLCAuZGVzY3IgPSAia2V5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfdXNfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfdXNfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfdXNfa2V5X2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGFlX3BhdGhfdXMgLSBzdGF0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF91c19zdGF0X2J5dGVzID0geyAubmFtZSA9ICJieXRlcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSwgYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF91c19zdGF0X2ZyYW1lcyA9IHsgLm5hbWUgPSAiZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIGZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfZnJhbWVzXzY0ID0geyAubmFtZSA9ICJmcmFtZXNfNjQiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA2NCBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzY0LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhLCBmcmFtZXNfNjQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF91c19zdGF0X2ZyYW1lc182NV8xMjcgPSB7IC5uYW1lID0gImZyYW1lc182NV8xMjciLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA2NSB0byAxMjcgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU182NV8xMjcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIGZyYW1lc182NV8xMjcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF91c19zdGF0X2ZyYW1lc18xMjhfMjU1ID0geyAubmFtZSA9ICJmcmFtZXNfMTI4XzI1NSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEyOCB0byAyNTUgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZSQU1FU18xMjhfMjU1LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhLCBmcmFtZXNfMTI4XzI1NSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfZnJhbWVzXzI1Nl81MTEgPSB7IC5uYW1lID0gImZyYW1lc18yNTZfNTExIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMjU2IHRvIDUxMSBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIGZyYW1lc18yNTZfNTExKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfc3RhdF9mcmFtZXNfNTEyXzEwMjMgPSB7IC5uYW1lID0gImZyYW1lc181MTJfMTAyMyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDUxMiB0byAxMDIzIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIGZyYW1lc181MTJfMTAyMyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfZnJhbWVzXzEwMjRfMTUxOCA9IHsgLm5hbWUgPSAiZnJhbWVzXzEwMjRfMTUxOCIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEwMjQgdG8gMTUxOCBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzEwMjRfMTUxOCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzEwMjRfMTUxOCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfZnJhbWVzXzE1MTlfMjA0NyA9IHsgLm5hbWUgPSAiZnJhbWVzXzE1MTlfMjA0NyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDE1MTkgdG8gMjA0NyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzE1MTlfMjA0NyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfZnJhbWVzXzIwNDhfNDA5NSA9IHsgLm5hbWUgPSAiZnJhbWVzXzIwNDhfNDA5NSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDIwNDggdG8gNDA5NSBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzIwNDhfNDA5NSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfZnJhbWVzXzQwOTZfOTIxNiA9IHsgLm5hbWUgPSAiZnJhbWVzXzQwOTZfOTIxNiIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDQwOTYgdG8gOTIxNiBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzQwOTZfOTIxNiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzQwOTZfOTIxNiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfZnJhbWVzXzkyMTdfMTYzODMgPSB7IC5uYW1lID0gImZyYW1lc185MjE3XzE2MzgzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgOTIxNyB0byAxNjM4MyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIGZyYW1lc185MjE3XzE2MzgzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfc3RhdF9icm9hZGNhc3RfZnJhbWVzID0geyAubmFtZSA9ICJicm9hZGNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnJvYWRjYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSwgYnJvYWRjYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfZGF0YV9ieXRlcyA9IHsgLm5hbWUgPSAiZGF0YV9ieXRlcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0RBVEFfQllURVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIGRhdGFfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF91c19zdGF0X211bHRpY2FzdF9mcmFtZXMgPSB7IC5uYW1lID0gIm11bHRpY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBtdWx0aWNhc3QgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhLCBtdWx0aWNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfc3RhdF91bmljYXN0X2ZyYW1lcyA9IHsgLm5hbWUgPSAidW5pY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB1bmljYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIHVuaWNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfc3RhdF9hYm9ydF9mcmFtZXMgPSB7IC5uYW1lID0gImFib3J0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGFib3J0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfSURfQUJPUlRfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhLCBhYm9ydF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF91c19zdGF0X2Zjc19lcnJvciA9IHsgLm5hbWUgPSAiZmNzX2Vycm9yIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYmFkIEZDUyBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX0ZDU19FUlJPUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSwgZmNzX2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfc3RhdF9vdmVyc2l6ZV9lcnJvciA9IHsgLm5hbWUgPSAib3ZlcnNpemVfZXJyb3IiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBvdmVyc2l6ZSBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0lEX09WRVJTSVpFX0VSUk9SLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhLCBvdmVyc2l6ZV9lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfcnVudF9lcnJvciA9IHsgLm5hbWUgPSAicnVudF9lcnJvciIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJ1bnQgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9JRF9SVU5UX0VSUk9SLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhLCBydW50X2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGFlX3BhdGhfdXNfc3RhdF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfc3RhdF9ieXRlcywgJnByb3BfZGVzY3JfYWVfcGF0aF91c19zdGF0X2ZyYW1lcywgJnByb3BfZGVzY3JfYWVfcGF0aF91c19zdGF0X2ZyYW1lc182NCwgJnByb3BfZGVzY3JfYWVfcGF0aF91c19zdGF0X2ZyYW1lc182NV8xMjcsICZwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfc3RhdF9mcmFtZXNfMTI4XzI1NSwgJnByb3BfZGVzY3JfYWVfcGF0aF91c19zdGF0X2ZyYW1lc18yNTZfNTExLCAmcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfZnJhbWVzXzUxMl8xMDIzLCAmcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfZnJhbWVzXzEwMjRfMTUxOCwgJnByb3BfZGVzY3JfYWVfcGF0aF91c19zdGF0X2ZyYW1lc18xNTE5XzIwNDcsICZwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfc3RhdF9mcmFtZXNfMjA0OF80MDk1LCAmcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfZnJhbWVzXzQwOTZfOTIxNiwgJnByb3BfZGVzY3JfYWVfcGF0aF91c19zdGF0X2ZyYW1lc185MjE3XzE2MzgzLCAmcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfYnJvYWRjYXN0X2ZyYW1lcywgJnByb3BfZGVzY3JfYWVfcGF0aF91c19zdGF0X2RhdGFfYnl0ZXMsICZwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfc3RhdF9tdWx0aWNhc3RfZnJhbWVzLCAmcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfdW5pY2FzdF9mcmFtZXMsICZwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfc3RhdF9hYm9ydF9mcmFtZXMsICZwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfc3RhdF9mY3NfZXJyb3IsICZwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfc3RhdF9vdmVyc2l6ZV9lcnJvciwgJnByb3BfZGVzY3JfYWVfcGF0aF91c19zdGF0X3J1bnRfZXJyb3IgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImJ5dGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhLCBieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhLCBmcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzY0IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNjQgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhLCBmcmFtZXNfNjQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzY1XzEyNyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY1IHRvIDEyNyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIGZyYW1lc182NV8xMjcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzEyOF8yNTUiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMjggdG8gMjU1IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzEyOF8yNTUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzI1Nl81MTEiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAyNTYgdG8gNTExIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzI1Nl81MTEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzUxMl8xMDIzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNTEyIHRvIDEwMjMgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhLCBmcmFtZXNfNTEyXzEwMjMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzEwMjRfMTUxOCIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEwMjQgdG8gMTUxOCBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIGZyYW1lc18xMDI0XzE1MTgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzE1MTlfMjA0NyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDE1MTkgdG8gMjA0NyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIGZyYW1lc18xNTE5XzIwNDcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzIwNDhfNDA5NSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDIwNDggdG8gNDA5NSBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIGZyYW1lc18yMDQ4XzQwOTUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzQwOTZfOTIxNiIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDQwOTYgdG8gOTIxNiBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIGZyYW1lc180MDk2XzkyMTYpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzkyMTdfMTYzODMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA5MjE3IHRvIDE2MzgzIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzkyMTdfMTYzODMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiYnJvYWRjYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJyb2FkY2FzdCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhLCBicm9hZGNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImRhdGFfYnl0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSwgZGF0YV9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJtdWx0aWNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgbXVsdGljYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIG11bHRpY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidW5pY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB1bmljYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIHVuaWNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImFib3J0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGFib3J0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIGFib3J0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmY3NfZXJyb3IiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBiYWQgRkNTIGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIGZjc19lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJvdmVyc2l6ZV9lcnJvciIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIG92ZXJzaXplIGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIG92ZXJzaXplX2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ1bnRfZXJyb3IiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBydW50IGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEsIHJ1bnRfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfZGF0YSIsIC5kZXNjciA9ICJzdGF0IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGFlX3BhdGhfdXMgLSBzdGF0X2NmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfc3RhdF9jZmdfY2ZnID0geyAubmFtZSA9ICJjZmciLCAuZGVzY3IgPSAiU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX1BBVEhfVVNfU1RBVF9DRkdfSURfQ0ZHLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfZGF0YSwgY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9jb25maWcgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBhZV9wYXRoX3VzX3N0YXRfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfYWVfcGF0aF91c19zdGF0X2NmZ19jZmcgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJjZmciLCAuZGVzY3IgPSAiU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZ19kYXRhIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX3VzX3N0YXRfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGFlX3BhdGhfdXMgLSBzdGF0X2FsYXJtX3JhaXNlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfc3RhdCA9IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQUVfUEFUSF9VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9pZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGFlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX3N0YXQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF91c19zdGF0X2lkIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIiwgLmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGFlX3BhdGhfdXMgLSBzdGF0X2FsYXJtX2NsZWFyZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9zdGF0ID0geyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9BRV9QQVRIX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX3VzX3N0YXRfaWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBhZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX3N0YXQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX3VzX3N0YXRfaWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaXMgbm8gbG9uZ2VyIG1ldC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogYWVfcGF0aF91cyAtIGF1dG9fY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF91c19hdXRvX2NmZ19zdGF0X2FsYXJtX2NsZWFyZWQgPSB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9jbGVhcmVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX1BBVEhfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9jbGVhcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfYWVfcGF0aF91c19hdXRvX2NmZ19zdGF0X2FsYXJtX3JhaXNlZCA9IHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fcmFpc2VkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0FFX1BBVEhfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX3JhaXNlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGFlX3BhdGhfdXNfYXV0b19jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9hZV9wYXRoX3VzX2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCwgJnByb3BfZGVzY3JfYWVfcGF0aF91c19hdXRvX2NmZ19zdGF0X2FsYXJtX3JhaXNlZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9jbGVhcmVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fY2xlYXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX3JhaXNlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX3JhaXNlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfZGF0YSIsIC5kZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfcGF0aF91c19hdXRvX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiA9PT09IE9iamVjdDogY2hhbm5lbCA9PT09ICovCisKKy8qIEdyb3VwOiBjaGFubmVsIC0ga2V5ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfY2hhbm5lbF9rZXlfcG9uX25pID0geyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIG5ldHdvcmsgaW50ZXJmYWNlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0NIQU5ORUxfS0VZX0lEX1BPTl9OSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9jaGFubmVsX2tleSwgcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgY2hhbm5lbF9rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9jaGFubmVsX2tleV9wb25fbmkgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2NoYW5uZWxfa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBvbl9uaSIsIC5kZXNjciA9ICJQT04gbmV0d29yayBpbnRlcmZhY2UiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2NoYW5uZWxfa2V5LCBwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9jaGFubmVsX2tleSA9IHsgLm5hbWUgPSAiYmNtb2x0X2NoYW5uZWxfa2V5IiwgLmRlc2NyID0gImtleSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9jaGFubmVsX2tleSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9jaGFubmVsX2tleV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9jaGFubmVsX2tleV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBjaGFubmVsIC0gY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfY2hhbm5lbF9jZmdfb3BlcmF0aW9uX2NvbnRyb2wgPSB7IC5uYW1lID0gIm9wZXJhdGlvbl9jb250cm9sIiwgLmRlc2NyID0gIk9wZXJhdGlvbiBjb250cm9sIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0NIQU5ORUxfQ0ZHX0lEX09QRVJBVElPTl9DT05UUk9MLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2NoYW5uZWxfY2ZnX2RhdGEsIG9wZXJhdGlvbl9jb250cm9sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb3BlcmF0aW9uX2NvbnRyb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9jaGFubmVsX2NmZ190b2wgPSB7IC5uYW1lID0gInRvbCIsIC5kZXNjciA9ICJUcmFuc21pdCBPcHRpY2FsIExldmVsLiBBbiBpbmRpY2F0aW9uIG9mIHRoZSBjdXJyZW50IE9MVCBDVCB0cmFuc2NlaXZlciBjaGFubmVsIGxhdW5jaCBwb3dlciBpbnRvIHRoZSBPRE4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQ0hBTk5FTF9DRkdfSURfVE9MLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2NoYW5uZWxfY2ZnX2RhdGEsIHRvbCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9jaGFubmVsX2NmZ19zeXN0ZW1fcHJvZmlsZSA9IHsgLm5hbWUgPSAic3lzdGVtX3Byb2ZpbGUiLCAuZGVzY3IgPSAiU3lzdGVtIHByb2ZpbGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfQ0hBTk5FTF9DRkdfSURfU1lTVEVNX1BST0ZJTEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfY2hhbm5lbF9jZmdfZGF0YSwgc3lzdGVtX3Byb2ZpbGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zeXN0ZW1fcHJvZmlsZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2NoYW5uZWxfY2ZnX2NoYW5uZWxfcHJvZmlsZSA9IHsgLm5hbWUgPSAiY2hhbm5lbF9wcm9maWxlIiwgLmRlc2NyID0gIkNoYW5uZWwgcHJvZmlsZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9DSEFOTkVMX0NGR19JRF9DSEFOTkVMX1BST0ZJTEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfY2hhbm5lbF9jZmdfZGF0YSwgY2hhbm5lbF9wcm9maWxlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX2NoYW5uZWxfcHJvZmlsZV84IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgY2hhbm5lbF9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9jaGFubmVsX2NmZ19vcGVyYXRpb25fY29udHJvbCwgJnByb3BfZGVzY3JfY2hhbm5lbF9jZmdfdG9sLCAmcHJvcF9kZXNjcl9jaGFubmVsX2NmZ19zeXN0ZW1fcHJvZmlsZSwgJnByb3BfZGVzY3JfY2hhbm5lbF9jZmdfY2hhbm5lbF9wcm9maWxlIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9jaGFubmVsX2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm9wZXJhdGlvbl9jb250cm9sIiwgLmRlc2NyID0gIk9wZXJhdGlvbiBjb250cm9sIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9jaGFubmVsX2NmZ19kYXRhLCBvcGVyYXRpb25fY29udHJvbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X29wZXJhdGlvbl9jb250cm9sIH0sIHsgLm5hbWUgPSAidG9sIiwgLmRlc2NyID0gIlRyYW5zbWl0IE9wdGljYWwgTGV2ZWwuIEFuIGluZGljYXRpb24gb2YgdGhlIGN1cnJlbnQgT0xUIENUIHRyYW5zY2VpdmVyIGNoYW5uZWwgbGF1bmNoIHBvd2VyIGludG8gdGhlIE9ETiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfY2hhbm5lbF9jZmdfZGF0YSwgdG9sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gInN5c3RlbV9wcm9maWxlIiwgLmRlc2NyID0gIlN5c3RlbSBwcm9maWxlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9jaGFubmVsX2NmZ19kYXRhLCBzeXN0ZW1fcHJvZmlsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N5c3RlbV9wcm9maWxlIH0sIHsgLm5hbWUgPSAiY2hhbm5lbF9wcm9maWxlIiwgLmRlc2NyID0gIkNoYW5uZWwgcHJvZmlsZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfY2hhbm5lbF9jZmdfZGF0YSwgY2hhbm5lbF9wcm9maWxlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX2NoYW5uZWxfcHJvZmlsZV84IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfY2hhbm5lbF9jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2NoYW5uZWxfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiY2ZnIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2NoYW5uZWxfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfY2hhbm5lbF9jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9jaGFubmVsX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogPT09PSBPYmplY3Q6IGRlYnVnID09PT0gKi8KKworLyogR3JvdXA6IGRlYnVnIC0ga2V5ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGVidWdfa2V5X3Jlc2VydmVkID0geyAubmFtZSA9ICJyZXNlcnZlZCIsIC5kZXNjciA9ICJSZXNlcnZlZCAoc2V0IHRvIDApIiwgLmFjY2VzcyA9IDAsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERUJVR19LRVlfSURfUkVTRVJWRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGVidWdfa2V5LCByZXNlcnZlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBkZWJ1Z19rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9kZWJ1Z19rZXlfcmVzZXJ2ZWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RlYnVnX2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyZXNlcnZlZCIsIC5kZXNjciA9ICJSZXNlcnZlZCAoc2V0IHRvIDApIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19rZXksIHJlc2VydmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RlYnVnX2tleSA9IHsgLm5hbWUgPSAiYmNtb2x0X2RlYnVnX2tleSIsIC5kZXNjciA9ICJrZXkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGVidWdfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2RlYnVnX2tleV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9kZWJ1Z19rZXlfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZGVidWcgLSBjbGlfaW5wdXQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZWJ1Z19jbGlfaW5wdXRfZGF0YSA9IHsgLm5hbWUgPSAiZGF0YSIsIC5kZXNjciA9ICJJbnB1dCBTdHJpbmciLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVCVUdfQ0xJX0lOUFVUX0lEX0RBVEEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGVidWdfY2xpX2lucHV0X2RhdGEsIGRhdGEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91OF9saXN0X3UzMiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGRlYnVnX2NsaV9pbnB1dF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2RlYnVnX2NsaV9pbnB1dF9kYXRhIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJkYXRhIiwgLmRlc2NyID0gIklucHV0IFN0cmluZyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGVidWdfY2xpX2lucHV0X2RhdGEsIGRhdGEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91OF9saXN0X3UzMiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZGVidWdfY2xpX2lucHV0X2RhdGEiLCAuZGVzY3IgPSAiQ0xJIElucHV0IFN0cmluZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBkZWJ1ZyAtIGNsaV9vdXRwdXQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZWJ1Z19jbGlfb3V0cHV0X2RhdGEgPSB7IC5uYW1lID0gImRhdGEiLCAuZGVzY3IgPSAib3V0cHV0IGRhdGEiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVCVUdfQ0xJX09VVFBVVF9JRF9EQVRBLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfZGF0YSwgZGF0YSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3U4X2xpc3RfdTMyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZGVidWdfY2xpX291dHB1dF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2RlYnVnX2NsaV9vdXRwdXRfZGF0YSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGVidWdfY2xpX291dHB1dF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImRhdGEiLCAuZGVzY3IgPSAib3V0cHV0IGRhdGEiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfZGF0YSwgZGF0YSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3U4X2xpc3RfdTMyIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGVidWdfY2xpX291dHB1dF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZGVidWdfY2xpX291dHB1dF9kYXRhIiwgLmRlc2NyID0gIkNMSSBPdXRwdXQgU3RyaW5nIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZGVidWdfY2xpX291dHB1dF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGRlYnVnIC0gY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGVidWdfY2ZnX2NvbnNvbGVfcmVkaXJlY3Rpb24gPSB7IC5uYW1lID0gImNvbnNvbGVfcmVkaXJlY3Rpb24iLCAuZGVzY3IgPSAiTG9nIG91dHB1dCByZWRpcmVjdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERUJVR19DRkdfSURfQ09OU09MRV9SRURJUkVDVElPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19jZmdfZGF0YSwgY29uc29sZV9yZWRpcmVjdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnNvbGVfcmVkaXJlY3Rpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZWJ1Z19jZmdfaW5kaWNhdGlvbnNfZHJvcHBlZCA9IHsgLm5hbWUgPSAiaW5kaWNhdGlvbnNfZHJvcHBlZCIsIC5kZXNjciA9ICJOdW1iZXIgb2YgaW5kaWNhdGlvbnMgZHJvcHBlZCBkdWUgdG8gY29uZ2VzdGlvbiAvIHNoYXBpbmcuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfREVCVUdfQ0ZHX0lEX0lORElDQVRJT05TX0RST1BQRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGVidWdfY2ZnX2RhdGEsIGluZGljYXRpb25zX2Ryb3BwZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGVidWdfY2ZnX2ZpbGVfdXNlZF9wZXJjZW50ID0geyAubmFtZSA9ICJmaWxlX3VzZWRfcGVyY2VudCIsIC5kZXNjciA9ICJERFIgbG9nIGZpbGUgdXNlZCBwZXJjZW50IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfREVCVUdfQ0ZHX0lEX0ZJTEVfVVNFRF9QRVJDRU5ULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RlYnVnX2NmZ19kYXRhLCBmaWxlX3VzZWRfcGVyY2VudCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RlYnVnX2NmZ19hcGlfY2FwdHVyZV9jZmcgPSB7IC5uYW1lID0gImFwaV9jYXB0dXJlX2NmZyIsIC5kZXNjciA9ICJDb25maWd1cmF0aW9uIGZvciBBUEkgY2FwdHVyZS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVCVUdfQ0ZHX0lEX0FQSV9DQVBUVVJFX0NGRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19jZmdfZGF0YSwgYXBpX2NhcHR1cmVfY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXBpX2NhcHR1cmVfY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGVidWdfY2ZnX2FwaV9jYXB0dXJlX3N0YXRzID0geyAubmFtZSA9ICJhcGlfY2FwdHVyZV9zdGF0cyIsIC5kZXNjciA9ICJTdGF0aXN0aWNzIG9uIHRoZSBtb3N0IHJlY2VudCBBUEkgY2FwdHVyZS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERUJVR19DRkdfSURfQVBJX0NBUFRVUkVfU1RBVFMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGVidWdfY2ZnX2RhdGEsIGFwaV9jYXB0dXJlX3N0YXRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXBpX2NhcHR1cmVfc3RhdHMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZWJ1Z19jZmdfYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQgPSB7IC5uYW1lID0gImFwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkIiwgLmRlc2NyID0gIkNvbnRyb2xzIHdoYXQgcG9ydGlvbiBvZiB0aGUgY2FwdHVyZSBidWZmZXIgaXMgcmV0dXJuZWQgd2hlbiBwZXJmb3JtaW5nIGEgY2ZnX2dldC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVCVUdfQ0ZHX0lEX0FQSV9DQVBUVVJFX0JVRkZFUl9SRUFELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RlYnVnX2NmZ19kYXRhLCBhcGlfY2FwdHVyZV9idWZmZXJfcmVhZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXIgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZWJ1Z19jZmdfYXBpX2NhcHR1cmVfYnVmZmVyID0geyAubmFtZSA9ICJhcGlfY2FwdHVyZV9idWZmZXIiLCAuZGVzY3IgPSAiVGhlIHBvcnRpb24gb2YgdGhlIGNhcHR1cmUgYnVmZmVyIGN1cnJlbnRseSBzcGVjaWZpZWQgYnkgYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfREVCVUdfQ0ZHX0lEX0FQSV9DQVBUVVJFX0JVRkZFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19jZmdfZGF0YSwgYXBpX2NhcHR1cmVfYnVmZmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdThfbGlzdF91MzIgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBkZWJ1Z19jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9kZWJ1Z19jZmdfY29uc29sZV9yZWRpcmVjdGlvbiwgJnByb3BfZGVzY3JfZGVidWdfY2ZnX2luZGljYXRpb25zX2Ryb3BwZWQsICZwcm9wX2Rlc2NyX2RlYnVnX2NmZ19maWxlX3VzZWRfcGVyY2VudCwgJnByb3BfZGVzY3JfZGVidWdfY2ZnX2FwaV9jYXB0dXJlX2NmZywgJnByb3BfZGVzY3JfZGVidWdfY2ZnX2FwaV9jYXB0dXJlX3N0YXRzLCAmcHJvcF9kZXNjcl9kZWJ1Z19jZmdfYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQsICZwcm9wX2Rlc2NyX2RlYnVnX2NmZ19hcGlfY2FwdHVyZV9idWZmZXIgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RlYnVnX2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImNvbnNvbGVfcmVkaXJlY3Rpb24iLCAuZGVzY3IgPSAiTG9nIG91dHB1dCByZWRpcmVjdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGVidWdfY2ZnX2RhdGEsIGNvbnNvbGVfcmVkaXJlY3Rpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb25zb2xlX3JlZGlyZWN0aW9uIH0sIHsgLm5hbWUgPSAiaW5kaWNhdGlvbnNfZHJvcHBlZCIsIC5kZXNjciA9ICJOdW1iZXIgb2YgaW5kaWNhdGlvbnMgZHJvcHBlZCBkdWUgdG8gY29uZ2VzdGlvbiAvIHNoYXBpbmcuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19jZmdfZGF0YSwgaW5kaWNhdGlvbnNfZHJvcHBlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJmaWxlX3VzZWRfcGVyY2VudCIsIC5kZXNjciA9ICJERFIgbG9nIGZpbGUgdXNlZCBwZXJjZW50IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19jZmdfZGF0YSwgZmlsZV91c2VkX3BlcmNlbnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJhcGlfY2FwdHVyZV9jZmciLCAuZGVzY3IgPSAiQ29uZmlndXJhdGlvbiBmb3IgQVBJIGNhcHR1cmUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19jZmdfZGF0YSwgYXBpX2NhcHR1cmVfY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXBpX2NhcHR1cmVfY29uZmlnIH0sIHsgLm5hbWUgPSAiYXBpX2NhcHR1cmVfc3RhdHMiLCAuZGVzY3IgPSAiU3RhdGlzdGljcyBvbiB0aGUgbW9zdCByZWNlbnQgQVBJIGNhcHR1cmUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19jZmdfZGF0YSwgYXBpX2NhcHR1cmVfc3RhdHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcGlfY2FwdHVyZV9zdGF0cyB9LCB7IC5uYW1lID0gImFwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkIiwgLmRlc2NyID0gIkNvbnRyb2xzIHdoYXQgcG9ydGlvbiBvZiB0aGUgY2FwdHVyZSBidWZmZXIgaXMgcmV0dXJuZWQgd2hlbiBwZXJmb3JtaW5nIGEgY2ZnX2dldC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RlYnVnX2NmZ19kYXRhLCBhcGlfY2FwdHVyZV9idWZmZXJfcmVhZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FwaV9jYXB0dXJlX2J1ZmZlcl9yZWFkZXIgfSwgeyAubmFtZSA9ICJhcGlfY2FwdHVyZV9idWZmZXIiLCAuZGVzY3IgPSAiVGhlIHBvcnRpb24gb2YgdGhlIGNhcHR1cmUgYnVmZmVyIGN1cnJlbnRseSBzcGVjaWZpZWQgYnkgYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19jZmdfZGF0YSwgYXBpX2NhcHR1cmVfYnVmZmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdThfbGlzdF91MzIgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZWJ1Z19jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2RlYnVnX2NmZ19kYXRhIiwgLmRlc2NyID0gImNmZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZWJ1Z19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9kZWJ1Z19jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9kZWJ1Z19jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBkZWJ1ZyAtIGZpbGVfYWxtb3N0X2Z1bGwgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBkZWJ1Z19maWxlX2FsbW9zdF9mdWxsX3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGRlYnVnIC0gc3RhcnRfYXBpX2NhcHR1cmUgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBkZWJ1Z19zdGFydF9hcGlfY2FwdHVyZV9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiBkZWJ1ZyAtIHN0b3BfYXBpX2NhcHR1cmUgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBkZWJ1Z19zdG9wX2FwaV9jYXB0dXJlX3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGRlYnVnIC0gcmVzZXRfYXBpX2NhcHR1cmUgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBkZWJ1Z19yZXNldF9hcGlfY2FwdHVyZV9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiBkZWJ1ZyAtIGF1dG9fY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGVidWdfYXV0b19jZmdfY2xpX291dHB1dCA9IHsgLm5hbWUgPSAiY2xpX291dHB1dCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiY2xpX291dHB1dFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERUJVR19BVVRPX0NGR19JRF9DTElfT1VUUFVULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2RhdGEsIGNsaV9vdXRwdXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZWJ1Z19hdXRvX2NmZ19maWxlX2FsbW9zdF9mdWxsID0geyAubmFtZSA9ICJmaWxlX2FsbW9zdF9mdWxsIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJmaWxlX2FsbW9zdF9mdWxsXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFQlVHX0FVVE9fQ0ZHX0lEX0ZJTEVfQUxNT1NUX0ZVTEwsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGVidWdfYXV0b19jZmdfZGF0YSwgZmlsZV9hbG1vc3RfZnVsbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGRlYnVnX2F1dG9fY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZGVidWdfYXV0b19jZmdfY2xpX291dHB1dCwgJnByb3BfZGVzY3JfZGVidWdfYXV0b19jZmdfZmlsZV9hbG1vc3RfZnVsbCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGVidWdfYXV0b19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJjbGlfb3V0cHV0IiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJjbGlfb3V0cHV0XCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19kYXRhLCBjbGlfb3V0cHV0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiZmlsZV9hbG1vc3RfZnVsbCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZmlsZV9hbG1vc3RfZnVsbFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGVidWdfYXV0b19jZmdfZGF0YSwgZmlsZV9hbG1vc3RfZnVsbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19kYXRhIiwgLmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZGVidWdfYXV0b19jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qID09PT0gT2JqZWN0OiBkZXZpY2UgPT09PSAqLworCisvKiBHcm91cDogZGV2aWNlIC0gY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2NmZ19zeXN0ZW1fbW9kZSA9IHsgLm5hbWUgPSAic3lzdGVtX21vZGUiLCAuZGVzY3IgPSAiU3lzdGVtIG1vZGUgLSB0aGlzIG11c3QgYmUgc2V0IGJ5IHRoZSBob3N0IHdoZW4gaW5pdGlhbGx5IHByb3Zpc2lvbmluZyB0aGUgc3lzdGVtLiAgU2V0dGluZyB0aGlzIGFsc28gc2V0cyB0aGUgXCJubmlfc3BlZWRcIiBwcm9wZXJ0eSwgdW5sZXNzIGl0IGlzIG92ZXJyaWRkZW4uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9DRkdfSURfU1lTVEVNX01PREUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCBzeXN0ZW1fbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N5c3RlbV9tb2RlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2NmZ19rZWVwYWxpdmVfaW50ZXJ2YWwgPSB7IC5uYW1lID0gImtlZXBhbGl2ZV9pbnRlcnZhbCIsIC5kZXNjciA9ICJLZWVwYWxpdmUgSW50ZXJ2YWwgaW4gU2Vjb25kcyAgKDAgPSBEaXNhYmxlKSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0tFRVBBTElWRV9JTlRFUlZBTCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIGtlZXBhbGl2ZV9pbnRlcnZhbCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX2tlZXBhbGl2ZV90b2xlcmFuY2UgPSB7IC5uYW1lID0gImtlZXBhbGl2ZV90b2xlcmFuY2UiLCAuZGVzY3IgPSAiSG93IG1hbnkga2VlcGFsaXZlIG1lc3NhZ2VzIGNhbiBiZSBsb3N0IGJlZm9yZSB0cmlnZ2VyaW5nIGEgZGlzY29ubmVjdCBzZXF1ZW5jZSAiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9LRUVQQUxJVkVfVE9MRVJBTkNFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwga2VlcGFsaXZlX3RvbGVyYW5jZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX2Zpcm13YXJlX3N3X3ZlcnNpb24gPSB7IC5uYW1lID0gImZpcm13YXJlX3N3X3ZlcnNpb24iLCAuZGVzY3IgPSAiRmlybXdhcmUgU1cgVmVyc2lvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9DRkdfSURfRklSTVdBUkVfU1dfVkVSU0lPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIGZpcm13YXJlX3N3X3ZlcnNpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9maXJtd2FyZV9zd192ZXJzaW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2NmZ19ob3N0X3N3X3ZlcnNpb24gPSB7IC5uYW1lID0gImhvc3Rfc3dfdmVyc2lvbiIsIC5kZXNjciA9ICJIb3N0IFNXIFZlcnNpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0hPU1RfU1dfVkVSU0lPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIGhvc3Rfc3dfdmVyc2lvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2hvc3Rfc3dfdmVyc2lvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9jZmdfY2hpcF9yZXZpc2lvbiA9IHsgLm5hbWUgPSAiY2hpcF9yZXZpc2lvbiIsIC5kZXNjciA9ICJSZXZpc2lvbiBvZiB0aGUgQkNNNjg2MjAgZGV2aWNlLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9DRkdfSURfQ0hJUF9SRVZJU0lPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIGNoaXBfcmV2aXNpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfY2hpcF9yZXZpc2lvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9jZmdfc3RhdGUgPSB7IC5uYW1lID0gInN0YXRlIiwgLmRlc2NyID0gIkRldmljZSBzdGF0ZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9DRkdfSURfU1RBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCBzdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9jZmdfZGVidWcgPSB7IC5uYW1lID0gImRlYnVnIiwgLmRlc2NyID0gIkRldmljZSBjb25maWd1cmF0aW9uIGRlYnVnIHBhcmFtZXRlcnMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9ERUJVRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIGRlYnVnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZGVidWdfZGV2aWNlX2NmZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9jZmdfbm5pX3NwZWVkID0geyAubmFtZSA9ICJubmlfc3BlZWQiLCAuZGVzY3IgPSAiU3BlZWQgb2YgdGhlIE5OSSBpbnRlcmZhY2UuICBUaGlzIGlzIGNhbGN1bGF0ZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZSBcInN5c3RlbV9tb2RlXCIgcHJvcGVydHkgaXMgc2V0LCBidXQgY2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGhvc3QuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9DRkdfSURfTk5JX1NQRUVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgbm5pX3NwZWVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX25uaV9zcGVlZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9jZmdfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZXh0X2lycSA9IHsgLm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfZXh0X2lycSIsIC5kZXNjciA9ICJUaGUgc2VsZWN0ZWQgZXh0ZXJuYWwgSVJRIGZvciBwcm90ZWN0aW9uIHN3aXRjaGluZyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX0VYVF9JUlEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19leHRfaXJxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXh0X2lycSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9jZmdfZXBvbl9jbG9ja190cmFuc3BvcnRfc2FtcGxlX2RlbGF5ID0geyAubmFtZSA9ICJlcG9uX2Nsb2NrX3RyYW5zcG9ydF9zYW1wbGVfZGVsYXkiLCAuZGVzY3IgPSAiVGhlIHRpbWUgKGluIFRRKSB0aGF0IGl0IHRha2VzIGZyb20gd2hlbiBhIHB1bHNlIGlzIGdlbmVyYXRlZCBhdCB0aGUgZXh0ZXJuYWwgc291cmNlIHRvIHdoZW4gd2Ugc2FtcGxlIGl0LiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VQT05fQ0xPQ0tfVFJBTlNQT1JUX1NBTVBMRV9ERUxBWSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIGVwb25fY2xvY2tfdHJhbnNwb3J0X3NhbXBsZV9kZWxheSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX2luZGljYXRpb25fc2hhcGluZyA9IHsgLm5hbWUgPSAiaW5kaWNhdGlvbl9zaGFwaW5nIiwgLmRlc2NyID0gIlNoYXBpbmcgLyByYXRlIGxpbWl0aW5nIGZvciB0aGUgaW5kaWNhdGlvbiBjaGFubmVsLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0lORElDQVRJT05fU0hBUElORywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIGluZGljYXRpb25fc2hhcGluZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2luZGljYXRpb25fc2hhcGluZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9jZmdfY2hpcF90ZW1wZXJhdHVyZSA9IHsgLm5hbWUgPSAiY2hpcF90ZW1wZXJhdHVyZSIsIC5kZXNjciA9ICJDdXJyZW50IGRpZSB0ZW1wZXJhdHVyZS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0NISVBfVEVNUEVSQVRVUkUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCBjaGlwX3RlbXBlcmF0dXJlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9jZmdfZ3Bvbl94Z3Bvbl90b2RfZW5hYmxlID0geyAubmFtZSA9ICJncG9uX3hncG9uX3RvZF9lbmFibGUiLCAuZGVzY3IgPSAiR1BPTi9YR1BPTiBUb0QgY29udHJvbCBzdGF0ZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX0VOQUJMRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIGdwb25feGdwb25fdG9kX2VuYWJsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX2dwb25feGdwb25fdG9kX2dwaW9fcGluID0geyAubmFtZSA9ICJncG9uX3hncG9uX3RvZF9ncGlvX3BpbiIsIC5kZXNjciA9ICJHUE9OL1hHUE9OIFRvRCBHSU8gcGluIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9DRkdfSURfR1BPTl9YR1BPTl9UT0RfR1BJT19QSU4sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCBncG9uX3hncG9uX3RvZF9ncGlvX3BpbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwaW9fcGluIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2NmZ19ncG9uX3hncG9uX3RvZF9jb25uZWN0ZWRfaW50ZXJuYWxseSA9IHsgLm5hbWUgPSAiZ3Bvbl94Z3Bvbl90b2RfY29ubmVjdGVkX2ludGVybmFsbHkiLCAuZGVzY3IgPSAiR1BPTi9YR1BPTiBpcyBUb0QgaW50ZXJuYWxseSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0dQT05fWEdQT05fVE9EX0NPTk5FQ1RFRF9JTlRFUk5BTExZLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgZ3Bvbl94Z3Bvbl90b2RfY29ubmVjdGVkX2ludGVybmFsbHkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX2Vwb25fODAyMV9hc190b2RfZm9ybWF0ID0geyAubmFtZSA9ICJlcG9uXzgwMjFfYXNfdG9kX2Zvcm1hdCIsIC5kZXNjciA9ICJFUE9OIDgwMi4xQVMgVG9EIEZvcm1hdCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VQT05fODAyMV9BU19UT0RfRk9STUFULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgZXBvbl84MDIxX2FzX3RvZF9mb3JtYXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdHJfMjU2IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2NmZ19lcG9uX3NoYXBlcl9tb2RlID0geyAubmFtZSA9ICJlcG9uX3NoYXBlcl9tb2RlIiwgLmRlc2NyID0gIkNvbnRyb2xzIEVQT04gc2hhcGVyIGJlaGF2aW9yLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0VQT05fU0hBUEVSX01PREUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCBlcG9uX3NoYXBlcl9tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc2hhcGVyX21vZGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX2VtYmVkZGVkX2ltYWdlX2xpc3QgPSB7IC5uYW1lID0gImVtYmVkZGVkX2ltYWdlX2xpc3QiLCAuZGVzY3IgPSAiTGlzdCBvZiBhbGwgZmlsZSBpbWFnZXMgc3RvcmVkIGluIHRoZSBPTFQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9FTUJFRERFRF9JTUFHRV9MSVNULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgZW1iZWRkZWRfaW1hZ2VfbGlzdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5X2xpc3RfdTggfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX2NoaXBfdm9sdGFnZSA9IHsgLm5hbWUgPSAiY2hpcF92b2x0YWdlIiwgLmRlc2NyID0gIkNoaXAgdm9sdGFnZSBpbiBtViIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9DRkdfSURfQ0hJUF9WT0xUQUdFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgY2hpcF92b2x0YWdlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9jZmdfZXBvbl90b2Rfc3RyaW5nID0geyAubmFtZSA9ICJlcG9uX3RvZF9zdHJpbmciLCAuZGVzY3IgPSAiRVBPTiBUb0QgU3RyaW5nIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9DRkdfSURfRVBPTl9UT0RfU1RSSU5HLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgZXBvbl90b2Rfc3RyaW5nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RyXzI1NiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9jZmdfeGdwb25fbnVtX29mX29udXMgPSB7IC5uYW1lID0gInhncG9uX251bV9vZl9vbnVzIiwgLmRlc2NyID0gInhncG9uIG51bSBvZiBvbnVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9DRkdfSURfWEdQT05fTlVNX09GX09OVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCB4Z3Bvbl9udW1fb2Zfb251cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX251bV9vZl9vbnVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2NmZ19kZXZpY2VfaXBfYWRkcmVzcyA9IHsgLm5hbWUgPSAiZGV2aWNlX2lwX2FkZHJlc3MiLCAuZGVzY3IgPSAiVGhlIElQIEFkZHJlc3Mgb2YgdGhlIGRldmljZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfQ0ZHX0lEX0RFVklDRV9JUF9BRERSRVNTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgZGV2aWNlX2lwX2FkZHJlc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2lwdjRfYWRkcmVzcyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9jZmdfZGV2aWNlX3VkcF9wb3J0ID0geyAubmFtZSA9ICJkZXZpY2VfdWRwX3BvcnQiLCAuZGVzY3IgPSAiVGhlIFVEUCBwb3J0IG9mIHRoZSBEZXZpY2UiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9ERVZJQ0VfVURQX1BPUlQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCBkZXZpY2VfdWRwX3BvcnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2NmZ190b2RfdWFydF9iYXVkcmF0ZSA9IHsgLm5hbWUgPSAidG9kX3VhcnRfYmF1ZHJhdGUiLCAuZGVzY3IgPSAiVUFSVCBiYXVkIHJhdGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0NGR19JRF9UT0RfVUFSVF9CQVVEUkFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIHRvZF91YXJ0X2JhdWRyYXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdWFydF9iYXVkcmF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9jZmdfZ3Bvbl94Z3Bvbl90b2Rfc3RyaW5nX2xlbmd0aCA9IHsgLm5hbWUgPSAiZ3Bvbl94Z3Bvbl90b2Rfc3RyaW5nX2xlbmd0aCIsIC5kZXNjciA9ICJHUE9OL1hHUE9OIFRvRCBzdHJpbmcgbGVuZ3RoIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9DRkdfSURfR1BPTl9YR1BPTl9UT0RfU1RSSU5HX0xFTkdUSCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIGdwb25feGdwb25fdG9kX3N0cmluZ19sZW5ndGgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBkZXZpY2VfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZGV2aWNlX2NmZ19zeXN0ZW1fbW9kZSwgJnByb3BfZGVzY3JfZGV2aWNlX2NmZ19rZWVwYWxpdmVfaW50ZXJ2YWwsICZwcm9wX2Rlc2NyX2RldmljZV9jZmdfa2VlcGFsaXZlX3RvbGVyYW5jZSwgJnByb3BfZGVzY3JfZGV2aWNlX2NmZ19maXJtd2FyZV9zd192ZXJzaW9uLCAmcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX2hvc3Rfc3dfdmVyc2lvbiwgJnByb3BfZGVzY3JfZGV2aWNlX2NmZ19jaGlwX3JldmlzaW9uLCAmcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX3N0YXRlLCAmcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX2RlYnVnLCAmcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX25uaV9zcGVlZCwgJnByb3BfZGVzY3JfZGV2aWNlX2NmZ19wcm90ZWN0aW9uX3N3aXRjaGluZ19leHRfaXJxLCAmcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX2Vwb25fY2xvY2tfdHJhbnNwb3J0X3NhbXBsZV9kZWxheSwgJnByb3BfZGVzY3JfZGV2aWNlX2NmZ19pbmRpY2F0aW9uX3NoYXBpbmcsICZwcm9wX2Rlc2NyX2RldmljZV9jZmdfY2hpcF90ZW1wZXJhdHVyZSwgJnByb3BfZGVzY3JfZGV2aWNlX2NmZ19ncG9uX3hncG9uX3RvZF9lbmFibGUsICZwcm9wX2Rlc2NyX2RldmljZV9jZmdfZ3Bvbl94Z3Bvbl90b2RfZ3Bpb19waW4sICZwcm9wX2Rlc2NyX2RldmljZV9jZmdfZ3Bvbl94Z3Bvbl90b2RfY29ubmVjdGVkX2ludGVybmFsbHksICZwcm9wX2Rlc2NyX2RldmljZV9jZmdfZXBvbl84MDIxX2FzX3RvZF9mb3JtYXQsICZwcm9wX2Rlc2NyX2RldmljZV9jZmdfZXBvbl9zaGFwZXJfbW9kZSwgJnByb3BfZGVzY3JfZGV2aWNlX2NmZ19lbWJlZGRlZF9pbWFnZV9saXN0LCAmcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX2NoaXBfdm9sdGFnZSwgJnByb3BfZGVzY3JfZGV2aWNlX2NmZ19lcG9uX3RvZF9zdHJpbmcsICZwcm9wX2Rlc2NyX2RldmljZV9jZmdfeGdwb25fbnVtX29mX29udXMsICZwcm9wX2Rlc2NyX2RldmljZV9jZmdfZGV2aWNlX2lwX2FkZHJlc3MsICZwcm9wX2Rlc2NyX2RldmljZV9jZmdfZGV2aWNlX3VkcF9wb3J0LCAmcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX3RvZF91YXJ0X2JhdWRyYXRlLCAmcHJvcF9kZXNjcl9kZXZpY2VfY2ZnX2dwb25feGdwb25fdG9kX3N0cmluZ19sZW5ndGggfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzeXN0ZW1fbW9kZSIsIC5kZXNjciA9ICJTeXN0ZW0gbW9kZSAtIHRoaXMgbXVzdCBiZSBzZXQgYnkgdGhlIGhvc3Qgd2hlbiBpbml0aWFsbHkgcHJvdmlzaW9uaW5nIHRoZSBzeXN0ZW0uICBTZXR0aW5nIHRoaXMgYWxzbyBzZXRzIHRoZSBcIm5uaV9zcGVlZFwiIHByb3BlcnR5LCB1bmxlc3MgaXQgaXMgb3ZlcnJpZGRlbi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgc3lzdGVtX21vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zeXN0ZW1fbW9kZSB9LCB7IC5uYW1lID0gImtlZXBhbGl2ZV9pbnRlcnZhbCIsIC5kZXNjciA9ICJLZWVwYWxpdmUgSW50ZXJ2YWwgaW4gU2Vjb25kcyAgKDAgPSBEaXNhYmxlKSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCBrZWVwYWxpdmVfaW50ZXJ2YWwpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAia2VlcGFsaXZlX3RvbGVyYW5jZSIsIC5kZXNjciA9ICJIb3cgbWFueSBrZWVwYWxpdmUgbWVzc2FnZXMgY2FuIGJlIGxvc3QgYmVmb3JlIHRyaWdnZXJpbmcgYSBkaXNjb25uZWN0IHNlcXVlbmNlICIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCBrZWVwYWxpdmVfdG9sZXJhbmNlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImZpcm13YXJlX3N3X3ZlcnNpb24iLCAuZGVzY3IgPSAiRmlybXdhcmUgU1cgVmVyc2lvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCBmaXJtd2FyZV9zd192ZXJzaW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbiB9LCB7IC5uYW1lID0gImhvc3Rfc3dfdmVyc2lvbiIsIC5kZXNjciA9ICJIb3N0IFNXIFZlcnNpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgaG9zdF9zd192ZXJzaW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfaG9zdF9zd192ZXJzaW9uIH0sIHsgLm5hbWUgPSAiY2hpcF9yZXZpc2lvbiIsIC5kZXNjciA9ICJSZXZpc2lvbiBvZiB0aGUgQkNNNjg2MjAgZGV2aWNlLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCBjaGlwX3JldmlzaW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2NoaXBfcmV2aXNpb24gfSwgeyAubmFtZSA9ICJzdGF0ZSIsIC5kZXNjciA9ICJEZXZpY2Ugc3RhdGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2Vfc3RhdGUgfSwgeyAubmFtZSA9ICJkZWJ1ZyIsIC5kZXNjciA9ICJEZXZpY2UgY29uZmlndXJhdGlvbiBkZWJ1ZyBwYXJhbWV0ZXJzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIGRlYnVnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZGVidWdfZGV2aWNlX2NmZyB9LCB7IC5uYW1lID0gIm5uaV9zcGVlZCIsIC5kZXNjciA9ICJTcGVlZCBvZiB0aGUgTk5JIGludGVyZmFjZS4gIFRoaXMgaXMgY2FsY3VsYXRlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIFwic3lzdGVtX21vZGVcIiBwcm9wZXJ0eSBpcyBzZXQsIGJ1dCBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgaG9zdC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgbm5pX3NwZWVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX25uaV9zcGVlZCB9LCB7IC5uYW1lID0gInByb3RlY3Rpb25fc3dpdGNoaW5nX2V4dF9pcnEiLCAuZGVzY3IgPSAiVGhlIHNlbGVjdGVkIGV4dGVybmFsIElSUSBmb3IgcHJvdGVjdGlvbiBzd2l0Y2hpbmciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfZXh0X2lycSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2V4dF9pcnEgfSwgeyAubmFtZSA9ICJlcG9uX2Nsb2NrX3RyYW5zcG9ydF9zYW1wbGVfZGVsYXkiLCAuZGVzY3IgPSAiVGhlIHRpbWUgKGluIFRRKSB0aGF0IGl0IHRha2VzIGZyb20gd2hlbiBhIHB1bHNlIGlzIGdlbmVyYXRlZCBhdCB0aGUgZXh0ZXJuYWwgc291cmNlIHRvIHdoZW4gd2Ugc2FtcGxlIGl0LiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCBlcG9uX2Nsb2NrX3RyYW5zcG9ydF9zYW1wbGVfZGVsYXkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiaW5kaWNhdGlvbl9zaGFwaW5nIiwgLmRlc2NyID0gIlNoYXBpbmcgLyByYXRlIGxpbWl0aW5nIGZvciB0aGUgaW5kaWNhdGlvbiBjaGFubmVsLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCBpbmRpY2F0aW9uX3NoYXBpbmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9pbmRpY2F0aW9uX3NoYXBpbmcgfSwgeyAubmFtZSA9ICJjaGlwX3RlbXBlcmF0dXJlIiwgLmRlc2NyID0gIkN1cnJlbnQgZGllIHRlbXBlcmF0dXJlLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCBjaGlwX3RlbXBlcmF0dXJlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImdwb25feGdwb25fdG9kX2VuYWJsZSIsIC5kZXNjciA9ICJHUE9OL1hHUE9OIFRvRCBjb250cm9sIHN0YXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIGdwb25feGdwb25fdG9kX2VuYWJsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfSwgeyAubmFtZSA9ICJncG9uX3hncG9uX3RvZF9ncGlvX3BpbiIsIC5kZXNjciA9ICJHUE9OL1hHUE9OIFRvRCBHSU8gcGluIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIGdwb25feGdwb25fdG9kX2dwaW9fcGluKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bpb19waW4gfSwgeyAubmFtZSA9ICJncG9uX3hncG9uX3RvZF9jb25uZWN0ZWRfaW50ZXJuYWxseSIsIC5kZXNjciA9ICJHUE9OL1hHUE9OIGlzIFRvRCBpbnRlcm5hbGx5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIGdwb25feGdwb25fdG9kX2Nvbm5lY3RlZF9pbnRlcm5hbGx5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiZXBvbl84MDIxX2FzX3RvZF9mb3JtYXQiLCAuZGVzY3IgPSAiRVBPTiA4MDIuMUFTIFRvRCBGb3JtYXQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgZXBvbl84MDIxX2FzX3RvZF9mb3JtYXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdHJfMjU2IH0sIHsgLm5hbWUgPSAiZXBvbl9zaGFwZXJfbW9kZSIsIC5kZXNjciA9ICJDb250cm9scyBFUE9OIHNoYXBlciBiZWhhdmlvci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgZXBvbl9zaGFwZXJfbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3NoYXBlcl9tb2RlIH0sIHsgLm5hbWUgPSAiZW1iZWRkZWRfaW1hZ2VfbGlzdCIsIC5kZXNjciA9ICJMaXN0IG9mIGFsbCBmaWxlIGltYWdlcyBzdG9yZWQgaW4gdGhlIE9MVC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgZW1iZWRkZWRfaW1hZ2VfbGlzdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2VtYmVkZGVkX2ltYWdlX2VudHJ5X2xpc3RfdTggfSwgeyAubmFtZSA9ICJjaGlwX3ZvbHRhZ2UiLCAuZGVzY3IgPSAiQ2hpcCB2b2x0YWdlIGluIG1WIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIGNoaXBfdm9sdGFnZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJlcG9uX3RvZF9zdHJpbmciLCAuZGVzY3IgPSAiRVBPTiBUb0QgU3RyaW5nIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIGVwb25fdG9kX3N0cmluZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0cl8yNTYgfSwgeyAubmFtZSA9ICJ4Z3Bvbl9udW1fb2Zfb251cyIsIC5kZXNjciA9ICJ4Z3BvbiBudW0gb2Ygb251cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCB4Z3Bvbl9udW1fb2Zfb251cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX251bV9vZl9vbnVzIH0sIHsgLm5hbWUgPSAiZGV2aWNlX2lwX2FkZHJlc3MiLCAuZGVzY3IgPSAiVGhlIElQIEFkZHJlc3Mgb2YgdGhlIGRldmljZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCBkZXZpY2VfaXBfYWRkcmVzcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfaXB2NF9hZGRyZXNzIH0sIHsgLm5hbWUgPSAiZGV2aWNlX3VkcF9wb3J0IiwgLmRlc2NyID0gIlRoZSBVRFAgcG9ydCBvZiB0aGUgRGV2aWNlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnX2RhdGEsIGRldmljZV91ZHBfcG9ydCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJ0b2RfdWFydF9iYXVkcmF0ZSIsIC5kZXNjciA9ICJVQVJUIGJhdWQgcmF0ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhLCB0b2RfdWFydF9iYXVkcmF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3VhcnRfYmF1ZHJhdGUgfSwgeyAubmFtZSA9ICJncG9uX3hncG9uX3RvZF9zdHJpbmdfbGVuZ3RoIiwgLmRlc2NyID0gIkdQT04vWEdQT04gVG9EIHN0cmluZyBsZW5ndGgiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSwgZ3Bvbl94Z3Bvbl90b2Rfc3RyaW5nX2xlbmd0aCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2RldmljZV9jZmdfZGF0YSIsIC5kZXNjciA9ICJjZmciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZGV2aWNlIC0ga2V5ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2tleV9yZXNlcnZlZCA9IHsgLm5hbWUgPSAicmVzZXJ2ZWQiLCAuZGVzY3IgPSAiUmVzZXJ2ZWQgKHNldCB0byAwKS4iLCAuYWNjZXNzID0gMCwgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9LRVlfSURfUkVTRVJWRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2tleSwgcmVzZXJ2ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZGV2aWNlX2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2RldmljZV9rZXlfcmVzZXJ2ZWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9rZXlfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicmVzZXJ2ZWQiLCAuZGVzY3IgPSAiUmVzZXJ2ZWQgKHNldCB0byAwKS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9rZXksIHJlc2VydmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9rZXkgPSB7IC5uYW1lID0gImJjbW9sdF9kZXZpY2Vfa2V5IiwgLmRlc2NyID0gImtleSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2Vfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9rZXlfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2tleV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBkZXZpY2UgLSBjb25uZWN0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZGV2aWNlX2Nvbm5lY3RfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogZGV2aWNlIC0gZGlzY29ubmVjdCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGRldmljZV9kaXNjb25uZWN0X3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGRldmljZSAtIHJlc2V0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX3Jlc2V0X21vZGUgPSB7IC5uYW1lID0gIm1vZGUiLCAuZGVzY3IgPSAiT3B0aW9ucyB0byBjb250cm9sIHdoYXQgc2hvdWxkIGJlIHJlc2V0LiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfUkVTRVRfSURfTU9ERSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfcmVzZXRfZGF0YSwgbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9yZXNldF9tb2RlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZGV2aWNlX3Jlc2V0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZGV2aWNlX3Jlc2V0X21vZGUgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9yZXNldF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm1vZGUiLCAuZGVzY3IgPSAiT3B0aW9ucyB0byBjb250cm9sIHdoYXQgc2hvdWxkIGJlIHJlc2V0LiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX3Jlc2V0X2RhdGEsIG1vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfcmVzZXRfbW9kZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9yZXNldF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX3Jlc2V0X2RhdGEiLCAuZGVzY3IgPSAiUmVzZXRzIHRoZSBob3N0L2RldmljZS4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX3Jlc2V0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX3Jlc2V0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX3Jlc2V0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZGV2aWNlIC0gaG9zdF9rZWVwX2FsaXZlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9zZXF1ZW5jZV9udW1iZXIgPSB7IC5uYW1lID0gInNlcXVlbmNlX251bWJlciIsIC5kZXNjciA9ICJzZXF1ZW5jZSBudW1iZXIiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0hPU1RfS0VFUF9BTElWRV9JRF9TRVFVRU5DRV9OVU1CRVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9kYXRhLCBzZXF1ZW5jZV9udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV90aW1lX3N0YW1wID0geyAubmFtZSA9ICJ0aW1lX3N0YW1wIiwgLmRlc2NyID0gInRpbWUgc3RhbXAiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0hPU1RfS0VFUF9BTElWRV9JRF9USU1FX1NUQU1QLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfZGF0YSwgdGltZV9zdGFtcCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBkZXZpY2VfaG9zdF9rZWVwX2FsaXZlX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9zZXF1ZW5jZV9udW1iZXIsICZwcm9wX2Rlc2NyX2RldmljZV9ob3N0X2tlZXBfYWxpdmVfdGltZV9zdGFtcCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInNlcXVlbmNlX251bWJlciIsIC5kZXNjciA9ICJzZXF1ZW5jZSBudW1iZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfZGF0YSwgc2VxdWVuY2VfbnVtYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gInRpbWVfc3RhbXAiLCAuZGVzY3IgPSAidGltZSBzdGFtcCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9kYXRhLCB0aW1lX3N0YW1wKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfZGF0YSIsIC5kZXNjciA9ICJLZWVwIGFsaXZlIG1lc3NhZ2UgZnJvbSB0aGUgaG9zdCB0byB0aGUgZGV2aWNlIC0gdXNlZCBieSB0aGUgZGV2aWNlIGNvbnRyb2wgbGlicmFyeSAoc2hvdWxkIG5vdCBiZSBzZW50IGJ5IHRoZSBob3N0IGFwcGxpY2F0aW9uKS4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2hvc3Rfa2VlcF9hbGl2ZV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZGV2aWNlIC0gc3dfdXBncmFkZV9hY3RpdmF0ZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGRldmljZV9zd191cGdyYWRlX2FjdGl2YXRlX3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGRldmljZSAtIGRldmljZV9yZWFkeSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9kZXZpY2VfcmVhZHlfZmlybXdhcmVfc3dfdmVyc2lvbiA9IHsgLm5hbWUgPSAiZmlybXdhcmVfc3dfdmVyc2lvbiIsIC5kZXNjciA9ICJTb2Z0d2FyZSBWZXJzaW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9ERVZJQ0VfUkVBRFlfSURfRklSTVdBUkVfU1dfVkVSU0lPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGEsIGZpcm13YXJlX3N3X3ZlcnNpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9maXJtd2FyZV9zd192ZXJzaW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2RldmljZV9yZWFkeV9zeXN0ZW1fbW9kZSA9IHsgLm5hbWUgPSAic3lzdGVtX21vZGUiLCAuZGVzY3IgPSAiU3lzdGVtIE1vZGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0RFVklDRV9SRUFEWV9JRF9TWVNURU1fTU9ERSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGEsIHN5c3RlbV9tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3lzdGVtX21vZGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfZGV2aWNlX3JlYWR5X25uaV9zcGVlZCA9IHsgLm5hbWUgPSAibm5pX3NwZWVkIiwgLmRlc2NyID0gIk5OSSBTcGVlZCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX05OSV9TUEVFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGEsIG5uaV9zcGVlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9ubmlfc3BlZWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfZGV2aWNlX3JlYWR5X2NoaXBfcmV2aXNpb24gPSB7IC5uYW1lID0gImNoaXBfcmV2aXNpb24iLCAuZGVzY3IgPSAiQ2hpcCBSZXZpc2lvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX0NISVBfUkVWSVNJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9kYXRhLCBjaGlwX3JldmlzaW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2NoaXBfcmV2aXNpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfZGV2aWNlX3JlYWR5X3RvZF9lbmFibGUgPSB7IC5uYW1lID0gInRvZF9lbmFibGUiLCAuZGVzY3IgPSAiVG9EIGNvbnRyb2wiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0RFVklDRV9SRUFEWV9JRF9UT0RfRU5BQkxFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfZGF0YSwgdG9kX2VuYWJsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfZGV2aWNlX3JlYWR5X3RvZF9ncGlvX3BpbiA9IHsgLm5hbWUgPSAidG9kX2dwaW9fcGluIiwgLmRlc2NyID0gIkdQSU8gcGluIGlzIHVzZWQgd2hlbiBUb0QgVUFSVCBpcyBub3QgY29ubmVjdGVkIHRvIHRoZSBlbWJlZGRlZCwgYW5kIFRPRCB2YWx1ZSBpcyBvYnRhaW5lZCBieSB0aGUgaG9zdCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfREVWSUNFX1JFQURZX0lEX1RPRF9HUElPX1BJTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGEsIHRvZF9ncGlvX3BpbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwaW9fcGluIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZGV2aWNlX2RldmljZV9yZWFkeV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2RldmljZV9kZXZpY2VfcmVhZHlfZmlybXdhcmVfc3dfdmVyc2lvbiwgJnByb3BfZGVzY3JfZGV2aWNlX2RldmljZV9yZWFkeV9zeXN0ZW1fbW9kZSwgJnByb3BfZGVzY3JfZGV2aWNlX2RldmljZV9yZWFkeV9ubmlfc3BlZWQsICZwcm9wX2Rlc2NyX2RldmljZV9kZXZpY2VfcmVhZHlfY2hpcF9yZXZpc2lvbiwgJnByb3BfZGVzY3JfZGV2aWNlX2RldmljZV9yZWFkeV90b2RfZW5hYmxlLCAmcHJvcF9kZXNjcl9kZXZpY2VfZGV2aWNlX3JlYWR5X3RvZF9ncGlvX3BpbiB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImZpcm13YXJlX3N3X3ZlcnNpb24iLCAuZGVzY3IgPSAiU29mdHdhcmUgVmVyc2lvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9kYXRhLCBmaXJtd2FyZV9zd192ZXJzaW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZmlybXdhcmVfc3dfdmVyc2lvbiB9LCB7IC5uYW1lID0gInN5c3RlbV9tb2RlIiwgLmRlc2NyID0gIlN5c3RlbSBNb2RlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGEsIHN5c3RlbV9tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3lzdGVtX21vZGUgfSwgeyAubmFtZSA9ICJubmlfc3BlZWQiLCAuZGVzY3IgPSAiTk5JIFNwZWVkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGEsIG5uaV9zcGVlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9ubmlfc3BlZWQgfSwgeyAubmFtZSA9ICJjaGlwX3JldmlzaW9uIiwgLmRlc2NyID0gIkNoaXAgUmV2aXNpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfZGF0YSwgY2hpcF9yZXZpc2lvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9jaGlwX3JldmlzaW9uIH0sIHsgLm5hbWUgPSAidG9kX2VuYWJsZSIsIC5kZXNjciA9ICJUb0QgY29udHJvbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9kYXRhLCB0b2RfZW5hYmxlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY29udHJvbF9zdGF0ZSB9LCB7IC5uYW1lID0gInRvZF9ncGlvX3BpbiIsIC5kZXNjciA9ICJHUElPIHBpbiBpcyB1c2VkIHdoZW4gVG9EIFVBUlQgaXMgbm90IGNvbm5lY3RlZCB0byB0aGUgZW1iZWRkZWQsIGFuZCBUT0QgdmFsdWUgaXMgb2J0YWluZWQgYnkgdGhlIGhvc3QiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfZGF0YSwgdG9kX2dwaW9fcGluKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bpb19waW4gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGEiLCAuZGVzY3IgPSAiRGV2aWNlIHJlYWR5IGluZGljYXRpb24gdXNlZCBieSB0aGUgZGV2aWNlIGNvbnRyb2wgbGlicmFyeSAobm90IHNlbnQgdG8gdGhlIGhvc3QgYXBwbGljYXRpb24pLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2VfZGV2aWNlX3JlYWR5X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHlfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBkZXZpY2UgLSBjb25uZWN0aW9uX2VzdGFibGlzaGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZGV2aWNlX2Nvbm5lY3Rpb25fZXN0YWJsaXNoZWRfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogZGV2aWNlIC0gZGV2aWNlX2tlZXBfYWxpdmUgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfc2VxdWVuY2VfbnVtYmVyID0geyAubmFtZSA9ICJzZXF1ZW5jZV9udW1iZXIiLCAuZGVzY3IgPSAic2VxdWVuY2UgbnVtYmVyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9ERVZJQ0VfS0VFUF9BTElWRV9JRF9TRVFVRU5DRV9OVU1CRVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGEsIHNlcXVlbmNlX251bWJlciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfdGltZV9zdGFtcCA9IHsgLm5hbWUgPSAidGltZV9zdGFtcCIsIC5kZXNjciA9ICJ0aW1lIHN0YW1wIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9ERVZJQ0VfS0VFUF9BTElWRV9JRF9USU1FX1NUQU1QLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9kYXRhLCB0aW1lX3N0YW1wKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGRldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9zZXF1ZW5jZV9udW1iZXIsICZwcm9wX2Rlc2NyX2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV90aW1lX3N0YW1wIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzZXF1ZW5jZV9udW1iZXIiLCAuZGVzY3IgPSAic2VxdWVuY2UgbnVtYmVyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfZGF0YSwgc2VxdWVuY2VfbnVtYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gInRpbWVfc3RhbXAiLCAuZGVzY3IgPSAidGltZSBzdGFtcCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGEsIHRpbWVfc3RhbXApLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfZGF0YSIsIC5kZXNjciA9ICJLZWVwIGFsaXZlIG1lc3NhZ2UgZnJvbSB0aGUgZGV2aWNlIHRvIHRoZSBob3N0IC0gdXNlZCBieSB0aGUgZGV2aWNlIGNvbnRyb2wgbGlicmFyeSAobm90IHNlbnQgdG8gdGhlIGhvc3QgYXBwbGljYXRpb24pLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBkZXZpY2UgLSBjb25uZWN0aW9uX2ZhaWx1cmUgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX3JlYXNvbiA9IHsgLm5hbWUgPSAicmVhc29uIiwgLmRlc2NyID0gIkNvbm5lY3Rpb24gZmFpbCByZWFzb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0NPTk5FQ1RJT05fRkFJTFVSRV9JRF9SRUFTT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9kYXRhLCByZWFzb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ob3N0X2Nvbm5lY3Rpb25fZmFpbF9yZWFzb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBkZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9yZWFzb24gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyZWFzb24iLCAuZGVzY3IgPSAiQ29ubmVjdGlvbiBmYWlsIHJlYXNvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9kYXRhLCByZWFzb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ob3N0X2Nvbm5lY3Rpb25fZmFpbF9yZWFzb24gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2RhdGEiLCAuZGVzY3IgPSAiVGhlIGhvc3QgZmFpbGVkIHRvIGNvbm5lY3QgdG8gdGhlIGRldmljZS4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZGV2aWNlIC0gY29ubmVjdGlvbl9jb21wbGV0ZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX3N0YW5kYWxvbmUgPSB7IC5uYW1lID0gInN0YW5kYWxvbmUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgdGhlIGRldmljZSB3YXMgcHJldmlvdXNseSBydW5uaW5nIGluIHN0YW5kYWxvbmUgbW9kZSBiZWZvcmUgdGhpcyBjb25uZWN0aW9uIHdhcyBlc3RhYmxpc2hlZC4gIElmIGZhbHNlLCB0aGUgZGV2aWNlIHdhcyBib290ZWQgZnJvbSByZXNldCB3aXRoIG5ldyBmaXJtd2FyZSwgZXRjLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfQ09OTkVDVElPTl9DT01QTEVURV9JRF9TVEFOREFMT05FLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2RhdGEsIHN0YW5kYWxvbmUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBkZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX3N0YW5kYWxvbmUgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhbmRhbG9uZSIsIC5kZXNjciA9ICJJZiB0cnVlLCB0aGUgZGV2aWNlIHdhcyBwcmV2aW91c2x5IHJ1bm5pbmcgaW4gc3RhbmRhbG9uZSBtb2RlIGJlZm9yZSB0aGlzIGNvbm5lY3Rpb24gd2FzIGVzdGFibGlzaGVkLiAgSWYgZmFsc2UsIHRoZSBkZXZpY2Ugd2FzIGJvb3RlZCBmcm9tIHJlc2V0IHdpdGggbmV3IGZpcm13YXJlLCBldGMuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9kYXRhLCBzdGFuZGFsb25lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2RhdGEiLCAuZGVzY3IgPSAiVGhlIGhvc3Qgc3VjY2Vzc2Z1bGx5IGNvbm5lY3RlZCB0byB0aGUgZGV2aWNlLiAgVGhlIGRldmljZSBoYXMgZWl0aGVyIGJlZW4gcmVwcm9ncmFtbWVkIHdpdGggbmV3IGZpcm13YXJlLCBvciBhIGNvbm5lY3Rpb24gd2FzIGVzdGFibGlzaGVkIHdpdGggYW4gZXhpc3RpbmcgZGV2aWNlIChzZWUgdGhlIFwic3RhbmRhbG9uZVwiIGZpZWxkKS4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9jb21wbGV0ZV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZGV2aWNlIC0gZGlzY29ubmVjdGlvbl9jb21wbGV0ZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGRldmljZV9kaXNjb25uZWN0aW9uX2NvbXBsZXRlX3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGRldmljZSAtIHN3X2Vycm9yICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX3N3X2Vycm9yX3Rhc2tfbmFtZSA9IHsgLm5hbWUgPSAidGFza19uYW1lIiwgLmRlc2NyID0gInRhc2sgbmFtZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfU1dfRVJST1JfSURfVEFTS19OQU1FLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9zd19lcnJvcl9kYXRhLCB0YXNrX25hbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdHJfMTAwIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX3N3X2Vycm9yX2ZpbGVfbmFtZSA9IHsgLm5hbWUgPSAiZmlsZV9uYW1lIiwgLmRlc2NyID0gImZpbGUgbmFtZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfU1dfRVJST1JfSURfRklMRV9OQU1FLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9zd19lcnJvcl9kYXRhLCBmaWxlX25hbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdHJfMTAwIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX3N3X2Vycm9yX2xpbmVfbnVtYmVyID0geyAubmFtZSA9ICJsaW5lX251bWJlciIsIC5kZXNjciA9ICJsaW5lIG51bWJlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfU1dfRVJST1JfSURfTElORV9OVU1CRVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2RhdGEsIGxpbmVfbnVtYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9zd19lcnJvcl9wb25fbmkgPSB7IC5uYW1lID0gInBvbl9uaSIsIC5kZXNjciA9ICJwb25fbmkiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX1NXX0VSUk9SX0lEX1BPTl9OSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfZGF0YSwgcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZGV2aWNlX3N3X2Vycm9yX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZGV2aWNlX3N3X2Vycm9yX3Rhc2tfbmFtZSwgJnByb3BfZGVzY3JfZGV2aWNlX3N3X2Vycm9yX2ZpbGVfbmFtZSwgJnByb3BfZGVzY3JfZGV2aWNlX3N3X2Vycm9yX2xpbmVfbnVtYmVyLCAmcHJvcF9kZXNjcl9kZXZpY2Vfc3dfZXJyb3JfcG9uX25pIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJ0YXNrX25hbWUiLCAuZGVzY3IgPSAidGFzayBuYW1lIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfZGF0YSwgdGFza19uYW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RyXzEwMCB9LCB7IC5uYW1lID0gImZpbGVfbmFtZSIsIC5kZXNjciA9ICJmaWxlIG5hbWUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9zd19lcnJvcl9kYXRhLCBmaWxlX25hbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdHJfMTAwIH0sIHsgLm5hbWUgPSAibGluZV9udW1iZXIiLCAuZGVzY3IgPSAibGluZSBudW1iZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9zd19lcnJvcl9kYXRhLCBsaW5lX251bWJlciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAicG9uX25pIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfZGF0YSwgcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX3N3X2Vycm9yX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfZGF0YSIsIC5kZXNjciA9ICJzdyBlcnJvciIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2Vfc3dfZXJyb3JfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBkZXZpY2UgLSBzd19leGNlcHRpb24gKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2Vfc3dfZXhjZXB0aW9uX2NwdV9pZCA9IHsgLm5hbWUgPSAiY3B1X2lkIiwgLmRlc2NyID0gIkNQVSBJRCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfU1dfRVhDRVBUSU9OX0lEX0NQVV9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2RhdGEsIGNwdV9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9zd19leGNlcHRpb25fdGV4dCA9IHsgLm5hbWUgPSAidGV4dCIsIC5kZXNjciA9ICJ0ZXh0IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9TV19FWENFUFRJT05fSURfVEVYVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2RhdGEsIHRleHQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdHJfMjAwMCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGRldmljZV9zd19leGNlcHRpb25fcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9kZXZpY2Vfc3dfZXhjZXB0aW9uX2NwdV9pZCwgJnByb3BfZGVzY3JfZGV2aWNlX3N3X2V4Y2VwdGlvbl90ZXh0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY3B1X2lkIiwgLmRlc2NyID0gIkNQVSBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9kYXRhLCBjcHVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJ0ZXh0IiwgLmRlc2NyID0gInRleHQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25fZGF0YSwgdGV4dCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0cl8yMDAwIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9kYXRhIiwgLmRlc2NyID0gInN3IGV4Y2VwdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbl9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25fZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBkZXZpY2UgLSBpbmRpY2F0aW9uc19kcm9wcGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWRfdG90YWxfY291bnQgPSB7IC5uYW1lID0gInRvdGFsX2NvdW50IiwgLmRlc2NyID0gIlRvdGFsIG51bWJlciBvZiBpbmRpY2F0aW9ucyBkcm9wcGVkIHNpbmNlIHRoZSBzeXN0ZW0gd2FzIHN0YXJ0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9JTkRJQ0FUSU9OU19EUk9QUEVEX0lEX1RPVEFMX0NPVU5ULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2RhdGEsIHRvdGFsX2NvdW50KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGRldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWRfdG90YWxfY291bnQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAidG90YWxfY291bnQiLCAuZGVzY3IgPSAiVG90YWwgbnVtYmVyIG9mIGluZGljYXRpb25zIGRyb3BwZWQgc2luY2UgdGhlIHN5c3RlbSB3YXMgc3RhcnRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2RhdGEsIHRvdGFsX2NvdW50KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9kYXRhIiwgLmRlc2NyID0gIlNlbnQgd2hlbiBpbmRpY2F0aW9ucyBhcmUgZHJvcHBlZCBkdWUgdG8gY29uZ2VzdGlvbiAvIHNoYXBpbmcuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGRldmljZSAtIGltYWdlX3RyYW5zZmVyX3N0YXJ0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2ltYWdlX3R5cGUgPSB7IC5uYW1lID0gImltYWdlX3R5cGUiLCAuZGVzY3IgPSAiRmlsZSB0eXBlLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfU1RBUlRfSURfSU1BR0VfVFlQRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfZGF0YSwgaW1hZ2VfdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9pbWFnZV90eXBlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2ltYWdlX3NpemUgPSB7IC5uYW1lID0gImltYWdlX3NpemUiLCAuZGVzY3IgPSAiU2l6ZSBvZiB0aGUgZmlsZSBpbWFnZS4gIElnbm9yZWQgZm9yIFJSUSBvcGVyYXRpb24uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9TVEFSVF9JRF9JTUFHRV9TSVpFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhLCBpbWFnZV9zaXplKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9jcmMzMiA9IHsgLm5hbWUgPSAiY3JjMzIiLCAuZGVzY3IgPSAiQ1JDMzIgY2hlY2tzdW0gb2YgdGhlIGVudGlyZSBmaWxlIGltYWdlLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfU1RBUlRfSURfQ1JDMzIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2RhdGEsIGNyYzMyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdF9oZXggfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfaW1hZ2VfbmFtZSA9IHsgLm5hbWUgPSAiaW1hZ2VfbmFtZSIsIC5kZXNjciA9ICJOYW1lIG9mIHRoZSBmaWxlIGltYWdlLiAgTnVsbC10ZXJtaW5hdGVkIHN0cmluZy4gIFRoaXMgaXMgcmVxdWlyZWQgZm9yIHRoZSBEUG9FIE9OVSBvbmx5LiAgRFBvRSByZXF1aXJlcyB0aGUgd3JpdGUgcmVxdWVzdCBPQU0gY29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIGZpbGUuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9TVEFSVF9JRF9JTUFHRV9OQU1FLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhLCBpbWFnZV9uYW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RyXzY0IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2ltYWdlX3R5cGUsICZwcm9wX2Rlc2NyX2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9pbWFnZV9zaXplLCAmcHJvcF9kZXNjcl9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfY3JjMzIsICZwcm9wX2Rlc2NyX2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9pbWFnZV9uYW1lIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJpbWFnZV90eXBlIiwgLmRlc2NyID0gIkZpbGUgdHlwZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhLCBpbWFnZV90eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgfSwgeyAubmFtZSA9ICJpbWFnZV9zaXplIiwgLmRlc2NyID0gIlNpemUgb2YgdGhlIGZpbGUgaW1hZ2UuICBJZ25vcmVkIGZvciBSUlEgb3BlcmF0aW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2RhdGEsIGltYWdlX3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiY3JjMzIiLCAuZGVzY3IgPSAiQ1JDMzIgY2hlY2tzdW0gb2YgdGhlIGVudGlyZSBmaWxlIGltYWdlLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2RhdGEsIGNyYzMyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdF9oZXggfSwgeyAubmFtZSA9ICJpbWFnZV9uYW1lIiwgLmRlc2NyID0gIk5hbWUgb2YgdGhlIGZpbGUgaW1hZ2UuICBOdWxsLXRlcm1pbmF0ZWQgc3RyaW5nLiAgVGhpcyBpcyByZXF1aXJlZCBmb3IgdGhlIERQb0UgT05VIG9ubHkuICBEUG9FIHJlcXVpcmVzIHRoZSB3cml0ZSByZXF1ZXN0IE9BTSBjb250YWlucyB0aGUgbmFtZSBvZiB0aGUgZmlsZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhLCBpbWFnZV9uYW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RyXzY0IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfZGF0YSIsIC5kZXNjciA9ICJUaGlzIEFQSSBtZXNzYWdlIGluZm9ybXMgdGhlIE9MVCBvZiB0aGUgc3RhcnQgb2YgaW1hZ2UgdHJhbnNmZXIsIGFuZCBwcm92aWRlcyB0aGUgaW5mb3JtYXRpb24gb2YgdGhlIGZpbGUgaW1hZ2UuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGRldmljZSAtIGltYWdlX3RyYW5zZmVyX2RhdGEgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9ibG9ja19udW1iZXIgPSB7IC5uYW1lID0gImJsb2NrX251bWJlciIsIC5kZXNjciA9ICJCbG9jayBudW1iZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9EQVRBX0lEX0JMT0NLX05VTUJFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9kYXRhLCBibG9ja19udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfbW9yZV9kYXRhID0geyAubmFtZSA9ICJtb3JlX2RhdGEiLCAuZGVzY3IgPSAiU3BlY2lmaWVzIHRoYXQgdGhlcmUgYXJlIG1vcmUgZGF0YSB0byBjb21lLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfREFUQV9JRF9NT1JFX0RBVEEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfZGF0YSwgbW9yZV9kYXRhKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfZGF0YSA9IHsgLm5hbWUgPSAiZGF0YSIsIC5kZXNjciA9ICJEYXRhLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfREFUQV9JRF9EQVRBLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2RhdGEsIGRhdGEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91OF9saXN0X3UxNl9oZXggfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBkZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2Jsb2NrX251bWJlciwgJnByb3BfZGVzY3JfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfbW9yZV9kYXRhLCAmcHJvcF9kZXNjcl9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9kYXRhIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImJsb2NrX251bWJlciIsIC5kZXNjciA9ICJCbG9jayBudW1iZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9kYXRhLCBibG9ja19udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAibW9yZV9kYXRhIiwgLmRlc2NyID0gIlNwZWNpZmllcyB0aGF0IHRoZXJlIGFyZSBtb3JlIGRhdGEgdG8gY29tZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2RhdGEsIG1vcmVfZGF0YSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImRhdGEiLCAuZGVzY3IgPSAiRGF0YS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2RhdGEsIGRhdGEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91OF9saXN0X3UxNl9oZXggfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfZGF0YSIsIC5kZXNjciA9ICJ1c2VkIGZvciB0cmFuc2ZlcnJpbmcgdGhlIGFjdHVhbCBkYXRhIGZyb20vdG8gdGhlIE9MVC4gICBub3QgdG8gYmUgZGlyZWN0bHkgY2FsbGVkIGJ5IHRoZSB1c2VyLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfZGF0YV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBkZXZpY2UgLSBpbWFnZV90cmFuc2Zlcl9jb21wbGV0ZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9pbWFnZV90eXBlID0geyAubmFtZSA9ICJpbWFnZV90eXBlIiwgLmRlc2NyID0gIkltYWdlIHR5cGUuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9JTUFHRV9UUkFOU0ZFUl9DT01QTEVURV9JRF9JTUFHRV9UWVBFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9kYXRhLCBpbWFnZV90eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfYmxvY2tfbnVtYmVyID0geyAubmFtZSA9ICJibG9ja19udW1iZXIiLCAuZGVzY3IgPSAiQmxvY2sgbnVtYmVyLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFJBTlNGRVJfQ09NUExFVEVfSURfQkxPQ0tfTlVNQkVSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9kYXRhLCBibG9ja19udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX3N0YXR1cyA9IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gIkltYWdlIHRyYW5zZmVyIHN0YXR1cy4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0lNQUdFX1RSQU5TRkVSX0NPTVBMRVRFX0lEX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfaW1hZ2VfdHJhbnNmZXJfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2ltYWdlX3R5cGUsICZwcm9wX2Rlc2NyX2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9ibG9ja19udW1iZXIsICZwcm9wX2Rlc2NyX2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImltYWdlX3R5cGUiLCAuZGVzY3IgPSAiSW1hZ2UgdHlwZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9kYXRhLCBpbWFnZV90eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgfSwgeyAubmFtZSA9ICJibG9ja19udW1iZXIiLCAuZGVzY3IgPSAiQmxvY2sgbnVtYmVyLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2RhdGEsIGJsb2NrX251bWJlciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJzdGF0dXMiLCAuZGVzY3IgPSAiSW1hZ2UgdHJhbnNmZXIgc3RhdHVzLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2ltYWdlX3RyYW5zZmVyX3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2RhdGEiLCAuZGVzY3IgPSAiSW1hZ2UgVHJhbnNmZXIgQ29tcGxldGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZGV2aWNlIC0gcnVuX2Rkcl90ZXN0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX3J1bl9kZHJfdGVzdF9jcHUgPSB7IC5uYW1lID0gImNwdSIsIC5kZXNjciA9ICJXaGV0aGVyIG9yIG5vdCB0byB0ZXN0IHRoZSBDUFUgRERSIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9SVU5fRERSX1RFU1RfSURfQ1BVLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfZGF0YSwgY3B1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX3J1bl9kZHJfdGVzdF9yYXNfMCA9IHsgLm5hbWUgPSAicmFzXzAiLCAuZGVzY3IgPSAiV2hldGhlciBvciBub3QgdG8gdGVzdCBSQVMgMCBERFIiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX1JVTl9ERFJfVEVTVF9JRF9SQVNfMCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2RhdGEsIHJhc18wKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX3J1bl9kZHJfdGVzdF9yYXNfMSA9IHsgLm5hbWUgPSAicmFzXzEiLCAuZGVzY3IgPSAiV2hldGhlciBvciBub3QgdG8gdGVzdCBSQVMgMSBERFIiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX1JVTl9ERFJfVEVTVF9JRF9SQVNfMSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2RhdGEsIHJhc18xKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZGV2aWNlX3J1bl9kZHJfdGVzdF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2RldmljZV9ydW5fZGRyX3Rlc3RfY3B1LCAmcHJvcF9kZXNjcl9kZXZpY2VfcnVuX2Rkcl90ZXN0X3Jhc18wLCAmcHJvcF9kZXNjcl9kZXZpY2VfcnVuX2Rkcl90ZXN0X3Jhc18xIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY3B1IiwgLmRlc2NyID0gIldoZXRoZXIgb3Igbm90IHRvIHRlc3QgdGhlIENQVSBERFIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfZGF0YSwgY3B1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicmFzXzAiLCAuZGVzY3IgPSAiV2hldGhlciBvciBub3QgdG8gdGVzdCBSQVMgMCBERFIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfZGF0YSwgcmFzXzApLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJyYXNfMSIsIC5kZXNjciA9ICJXaGV0aGVyIG9yIG5vdCB0byB0ZXN0IFJBUyAxIEREUiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9kYXRhLCByYXNfMSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfZGF0YSIsIC5kZXNjciA9ICJSdW4gYSB0ZXN0IG9uIG9uZSBvciBtb3JlIG9mIHRoZSBERFIgY29tcG9uZW50cy4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3RfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfcnVuX2Rkcl90ZXN0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZGV2aWNlIC0gZGRyX3Rlc3RfY29tcGxldGUgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfZGRyX3Rlc3QgPSB7IC5uYW1lID0gImRkcl90ZXN0IiwgLmRlc2NyID0gIlJlc3VsdHMgb2YgdGhlIEREUiBUZXN0IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9ERFJfVEVTVF9DT01QTEVURV9JRF9ERFJfVEVTVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfZGF0YSwgZGRyX3Rlc3QpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBkZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfZGRyX3Rlc3QgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImRkcl90ZXN0IiwgLmRlc2NyID0gIlJlc3VsdHMgb2YgdGhlIEREUiBUZXN0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfZGF0YSwgZGRyX3Rlc3QpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9kZHJfdGVzdF9jb21wbGV0ZWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGVfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9kYXRhIiwgLmRlc2NyID0gIlRoZSBERFIgVGVzdCBoYXMgY29tcGxldGVkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGRldmljZSAtIGF1dG9fY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2F1dG9fY2ZnX2Nvbm5lY3Rpb25fY29tcGxldGUgPSB7IC5uYW1lID0gImNvbm5lY3Rpb25fY29tcGxldGUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImNvbm5lY3Rpb25fY29tcGxldGVcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0NPTk5FQ1RJT05fQ09NUExFVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEsIGNvbm5lY3Rpb25fY29tcGxldGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfYXV0b19jZmdfY29ubmVjdGlvbl9lc3RhYmxpc2hlZCA9IHsgLm5hbWUgPSAiY29ubmVjdGlvbl9lc3RhYmxpc2hlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiY29ubmVjdGlvbl9lc3RhYmxpc2hlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfQ09OTkVDVElPTl9FU1RBQkxJU0hFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfZGF0YSwgY29ubmVjdGlvbl9lc3RhYmxpc2hlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9hdXRvX2NmZ19jb25uZWN0aW9uX2ZhaWx1cmUgPSB7IC5uYW1lID0gImNvbm5lY3Rpb25fZmFpbHVyZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiY29ubmVjdGlvbl9mYWlsdXJlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9DT05ORUNUSU9OX0ZBSUxVUkUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEsIGNvbm5lY3Rpb25fZmFpbHVyZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2RldmljZV9hdXRvX2NmZ19kZHJfdGVzdF9jb21wbGV0ZSA9IHsgLm5hbWUgPSAiZGRyX3Rlc3RfY29tcGxldGUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImRkcl90ZXN0X2NvbXBsZXRlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0RFVklDRV9BVVRPX0NGR19JRF9ERFJfVEVTVF9DT01QTEVURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfZGF0YSwgZGRyX3Rlc3RfY29tcGxldGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfYXV0b19jZmdfZGV2aWNlX2tlZXBfYWxpdmUgPSB7IC5uYW1lID0gImRldmljZV9rZWVwX2FsaXZlIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJkZXZpY2Vfa2VlcF9hbGl2ZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfREVWSUNFX0tFRVBfQUxJVkUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEsIGRldmljZV9rZWVwX2FsaXZlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2F1dG9fY2ZnX2RldmljZV9yZWFkeSA9IHsgLm5hbWUgPSAiZGV2aWNlX3JlYWR5IiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJkZXZpY2VfcmVhZHlcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0RFVklDRV9SRUFEWSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfZGF0YSwgZGV2aWNlX3JlYWR5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2F1dG9fY2ZnX2Rpc2Nvbm5lY3Rpb25fY29tcGxldGUgPSB7IC5uYW1lID0gImRpc2Nvbm5lY3Rpb25fY29tcGxldGUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImRpc2Nvbm5lY3Rpb25fY29tcGxldGVcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0RJU0NPTk5FQ1RJT05fQ09NUExFVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEsIGRpc2Nvbm5lY3Rpb25fY29tcGxldGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfYXV0b19jZmdfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGUgPSB7IC5uYW1lID0gImltYWdlX3RyYW5zZmVyX2NvbXBsZXRlIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJpbWFnZV90cmFuc2Zlcl9jb21wbGV0ZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfSU1BR0VfVFJBTlNGRVJfQ09NUExFVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEsIGltYWdlX3RyYW5zZmVyX2NvbXBsZXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2F1dG9fY2ZnX2luZGljYXRpb25zX2Ryb3BwZWQgPSB7IC5uYW1lID0gImluZGljYXRpb25zX2Ryb3BwZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImluZGljYXRpb25zX2Ryb3BwZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX0lORElDQVRJT05TX0RST1BQRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEsIGluZGljYXRpb25zX2Ryb3BwZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9kZXZpY2VfYXV0b19jZmdfc3dfZXJyb3IgPSB7IC5uYW1lID0gInN3X2Vycm9yIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzd19lcnJvclwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9ERVZJQ0VfQVVUT19DRkdfSURfU1dfRVJST1IsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEsIHN3X2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZGV2aWNlX2F1dG9fY2ZnX3N3X2V4Y2VwdGlvbiA9IHsgLm5hbWUgPSAic3dfZXhjZXB0aW9uIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzd19leGNlcHRpb25cIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX1NXX0VYQ0VQVElPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfZGF0YSwgc3dfZXhjZXB0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZGV2aWNlX2F1dG9fY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZGV2aWNlX2F1dG9fY2ZnX2Nvbm5lY3Rpb25fY29tcGxldGUsICZwcm9wX2Rlc2NyX2RldmljZV9hdXRvX2NmZ19jb25uZWN0aW9uX2VzdGFibGlzaGVkLCAmcHJvcF9kZXNjcl9kZXZpY2VfYXV0b19jZmdfY29ubmVjdGlvbl9mYWlsdXJlLCAmcHJvcF9kZXNjcl9kZXZpY2VfYXV0b19jZmdfZGRyX3Rlc3RfY29tcGxldGUsICZwcm9wX2Rlc2NyX2RldmljZV9hdXRvX2NmZ19kZXZpY2Vfa2VlcF9hbGl2ZSwgJnByb3BfZGVzY3JfZGV2aWNlX2F1dG9fY2ZnX2RldmljZV9yZWFkeSwgJnByb3BfZGVzY3JfZGV2aWNlX2F1dG9fY2ZnX2Rpc2Nvbm5lY3Rpb25fY29tcGxldGUsICZwcm9wX2Rlc2NyX2RldmljZV9hdXRvX2NmZ19pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZSwgJnByb3BfZGVzY3JfZGV2aWNlX2F1dG9fY2ZnX2luZGljYXRpb25zX2Ryb3BwZWQsICZwcm9wX2Rlc2NyX2RldmljZV9hdXRvX2NmZ19zd19lcnJvciwgJnByb3BfZGVzY3JfZGV2aWNlX2F1dG9fY2ZnX3N3X2V4Y2VwdGlvbiB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY29ubmVjdGlvbl9jb21wbGV0ZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiY29ubmVjdGlvbl9jb21wbGV0ZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEsIGNvbm5lY3Rpb25fY29tcGxldGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJjb25uZWN0aW9uX2VzdGFibGlzaGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJjb25uZWN0aW9uX2VzdGFibGlzaGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfZGF0YSwgY29ubmVjdGlvbl9lc3RhYmxpc2hlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImNvbm5lY3Rpb25fZmFpbHVyZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiY29ubmVjdGlvbl9mYWlsdXJlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfZGF0YSwgY29ubmVjdGlvbl9mYWlsdXJlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiZGRyX3Rlc3RfY29tcGxldGUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImRkcl90ZXN0X2NvbXBsZXRlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfZGF0YSwgZGRyX3Rlc3RfY29tcGxldGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJkZXZpY2Vfa2VlcF9hbGl2ZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZGV2aWNlX2tlZXBfYWxpdmVcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9hdXRvX2NmZ19kYXRhLCBkZXZpY2Vfa2VlcF9hbGl2ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImRldmljZV9yZWFkeSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZGV2aWNlX3JlYWR5XCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfZGF0YSwgZGV2aWNlX3JlYWR5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiZGlzY29ubmVjdGlvbl9jb21wbGV0ZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZGlzY29ubmVjdGlvbl9jb21wbGV0ZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEsIGRpc2Nvbm5lY3Rpb25fY29tcGxldGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJpbWFnZV90cmFuc2Zlcl9jb21wbGV0ZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9hdXRvX2NmZ19kYXRhLCBpbWFnZV90cmFuc2Zlcl9jb21wbGV0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImluZGljYXRpb25zX2Ryb3BwZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImluZGljYXRpb25zX2Ryb3BwZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9hdXRvX2NmZ19kYXRhLCBpbmRpY2F0aW9uc19kcm9wcGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic3dfZXJyb3IiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN3X2Vycm9yXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfZGF0YSwgc3dfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzd19leGNlcHRpb24iLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN3X2V4Y2VwdGlvblwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEsIHN3X2V4Y2VwdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9hdXRvX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEiLCAuZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9hdXRvX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9hdXRvX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2RldmljZV9hdXRvX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogPT09PSBPYmplY3Q6IGVwb25fZGVuaWVkX2xpbmsgPT09PSAqLworCisvKiBHcm91cDogZXBvbl9kZW5pZWRfbGluayAtIGtleSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfa2V5X2Vwb25fbmkgPSB7IC5uYW1lID0gImVwb25fbmkiLCAuZGVzY3IgPSAiVW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgRVBPTiBOSSBjb250YWluaW5nIHRoZSBsaW5rLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0tFWV9JRF9FUE9OX05JLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5LCBlcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfa2V5X21hY19hZGRyZXNzID0geyAubmFtZSA9ICJtYWNfYWRkcmVzcyIsIC5kZXNjciA9ICJUaGUgTUFDIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBFUE9OIGxpbmsuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfS0VZX0lEX01BQ19BRERSRVNTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5LCBtYWNfYWRkcmVzcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfbWFjX2FkZHJlc3MgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2RlbmllZF9saW5rX2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfa2V5X2Vwb25fbmksICZwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfa2V5X21hY19hZGRyZXNzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJlcG9uX25pIiwgLmRlc2NyID0gIlVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEVQT04gTkkgY29udGFpbmluZyB0aGUgbGluay4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5LCBlcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gIm1hY19hZGRyZXNzIiwgLmRlc2NyID0gIlRoZSBNQUMgYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggdGhlIEVQT04gbGluay4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5LCBtYWNfYWRkcmVzcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfbWFjX2FkZHJlc3MgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5IiwgLmRlc2NyID0gImtleSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX2RlbmllZF9saW5rIC0gY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9kZW5pZWRfbGlua19jZmdfYWxhcm1fc3RhdGUgPSB7IC5uYW1lID0gImFsYXJtX3N0YXRlIiwgLmRlc2NyID0gIlRoZSBzdGF0ZSBvZiB0aGUgYWxhcm1zIG9uIHRoaXMgbGluay4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0NGR19JRF9BTEFSTV9TVEFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19kYXRhLCBhbGFybV9zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYWxhcm1fc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2RlbmllZF9saW5rX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2FsYXJtX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXRlIiwgLmRlc2NyID0gIlRoZSBzdGF0ZSBvZiB0aGUgYWxhcm1zIG9uIHRoaXMgbGluay4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2RhdGEsIGFsYXJtX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua19hbGFybV9zdGF0ZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19kYXRhIiwgLmRlc2NyID0gImNmZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX2RlbmllZF9saW5rIC0gdW5rbm93bl9saW5rX3Zpb2xhdGlvbiAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBTdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19VTktOT1dOX0xJTktfVklPTEFUSU9OX0lEX0FMQVJNX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb25fZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdW5rbm93bl9saW5rX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9hbGFybV9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBTdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91bmtub3duX2xpbmtfc3RhdHVzIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb25fZGF0YSIsIC5kZXNjciA9ICJBIGxpbmsgdHJpZWQgdG8gcmVnaXN0ZXIgd2hpbGUgdGhlIFBPTiB3YXMgc2V0IHRvIFwibm90aWZ5IHVua25vd25cIiByZWdpc3RyYXRpb24gYmVoYXZpb3IgYW5kIHRoaXMgbGluayB3YXMgbm90IHByZS1wcm92aXNpb25lZC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9kZW5pZWRfbGluayAtIG92ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19PVkVSSEVBRF9QUk9GSUxFX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9hbGFybV9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25fZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiQWxhcm0gc3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25fZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25fZGF0YSIsIC5kZXNjciA9ICJUaGlzIGlzIHdoZW4gbGluayB0cmllcyB0byByZWdpc3RlciBhbmQgdGhlcmUgYXJlIGFscmVhZHkgdG9vIG1hbnkgZXhpc3RpbmcgbGFzZXIgb24vb2ZmIGNvbWJpbmF0aW9ucy4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbl9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25fZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9kZW5pZWRfbGluayAtIGxhc2VyX29uX29mZl92aW9sYXRpb24gKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fYWxhcm1fc3RhdHVzID0geyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiQWxhcm0gU3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfTEFTRVJfT05fT0ZGX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2xhc2VyX29uX29mZl9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fYWxhcm1fc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiQWxhcm0gU3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbGFzZXJfb25fb2ZmX3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uX2RhdGEiLCAuZGVzY3IgPSAiVGhpcyBpcyB3aGVuIGEgbGluayB0cmllcyB0byByZWlnc3RlciB3aXRoIGFuIGltcG9zc2libGUgbGFzZXIgb24gb3Igb2ZmIHRpbWUuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fZGVuaWVkX2xpbmsgLSBtYXhfbGlua192aW9sYXRpb24gKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBTdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19NQVhfTElOS19WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25fYWxhcm1fc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBTdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9kYXRhIiwgLmRlc2NyID0gIkEgbGluayB0cmllZCB0byByZWdpc3RlciBhbmQgaXQgd291bGQgaGF2ZSBwdXQgdXMgb3ZlciB0aGUgcHJvdmlzaW9uZWQgbWF4IGxpbmtzIGZvciB0aGUgY29ycmVzcG9uZGluZyBFUE9OIE5JLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua19tYXhfbGlua192aW9sYXRpb25fZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX2RlbmllZF9saW5rIC0gbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbiAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBTdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19MTElEX1BPT0xfRU1QVFlfVklPTEFUSU9OX0lEX0FMQVJNX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb25fZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2FsYXJtX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gIkFsYXJtIFN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbl9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2RhdGEiLCAuZGVzY3IgPSAiQSBsaW5rIHRyaWVkIHRvIHJlZ2lzdGVyIGFuZCBpdCB0aGVyZSBhcmUgbm8gTExJRHMgYXZhaWxhYmxlLiBJZiB0aGlzIG9jY3VycywgaXQgaXMgcG9zc2libGUgdGhlcmUgaXMgYW4gaXNzdWUgd2l0aCB5b3VyICdtYXggbGlua3MnIGFuZC9vciAnQmFzZSBMTElEJyBmaWVsZHMgb24geW91ciBSUC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9kZW5pZWRfbGluayAtIHN5c3RlbV9yZXNvdXJjZV92aW9sYXRpb24gKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25fYWxhcm1fc3RhdHVzID0geyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiQWxhcm0gU3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfU1lTVEVNX1JFU09VUkNFX1ZJT0xBVElPTl9JRF9BTEFSTV9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9hbGFybV9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBTdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb25fZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9kYXRhIiwgLmRlc2NyID0gIkEgbGluayB0cmllZCB0byByZWdpc3RlciBhbmQgd2Ugd2VyZSB1bmFibGUgdG8gYWxsb2NhdGUgc3lzdGVtIHJlc291cmNlcyBmb3IgaXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fZGVuaWVkX2xpbmsgLSByYW5nZV92aW9sYXRpb24gKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBTdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19SQU5HRV9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JhbmdlX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25fYWxhcm1fc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBTdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JhbmdlX3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9kYXRhIiwgLmRlc2NyID0gIkEgbGluayB0cmllZCB0byByZWdpc3RlciB3aXRoIGEgcmFuZ2UgdmFsdWUgdGhhdCB3YXMgb3V0c2lkZSBvZiB0aGUgbWluL21heCBmaWJlciBsZW5ndGguIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25fZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fZGVuaWVkX2xpbmsgLSB0ZG1fY2hhbm5lbHNfZXhoYXVzdGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX2FsYXJtX3N0YXR1cyA9IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gIkFsYXJtIFN0YXR1cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1RETV9DSEFOTkVMU19FWEhBVVNURURfSURfQUxBUk1fU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfYWxhcm1fc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiQWxhcm0gU3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfZGF0YSIsIC5kZXNjciA9ICJURE0gQ2hhbm5lbHMgRXhoYXVzdGVkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fZGVuaWVkX2xpbmsgLSByb2d1ZV92aW9sYXRpb24gKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBTdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19ST0dVRV9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25fYWxhcm1fc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBTdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9kYXRhIiwgLmRlc2NyID0gIkEgUm9ndWUgT05VIHdhcyBkZXRlY3RlZCBvbiB0aGlzIGxpbmsvTExJRC4gIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25fZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbl9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fZGVuaWVkX2xpbmsgLSB1cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2FsYXJtX3N0YXR1cyA9IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gIkFsYXJtIFN0YXR1cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX1VQU1RSRUFNX0JBTkRXSURUSF9WSU9MQVRJT05fSURfQUxBUk1fU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbl9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25fcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25fYWxhcm1fc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25fZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiQWxhcm0gU3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25fZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25fZGF0YSIsIC5kZXNjciA9ICJUaGlzIGxpbmsgZmFpbGVkIHRvIHJlZ2lzdGVyIGJlY2F1c2UgdGhlcmUgd2FzIGluc3VmZmljaWVudCB1cHN0cmVhbSBiYW5kd2lkdGggYXZhaWxhYmxlIHRvIHByb3ZpZGUgdGhlIGRlZmF1bHQgVUJELiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25fZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25fZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25fZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX2RlbmllZF9saW5rIC0gYXV0b19jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2xhc2VyX29uX29mZl92aW9sYXRpb24gPSB7IC5uYW1lID0gImxhc2VyX29uX29mZl92aW9sYXRpb24iLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImxhc2VyX29uX29mZl92aW9sYXRpb25cIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9MQVNFUl9PTl9PRkZfVklPTEFUSU9OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZGF0YSwgbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfbGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbiA9IHsgLm5hbWUgPSAibGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbiIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvblwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX0xMSURfUE9PTF9FTVBUWV9WSU9MQVRJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhLCBsbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19tYXhfbGlua192aW9sYXRpb24gPSB7IC5uYW1lID0gIm1heF9saW5rX3Zpb2xhdGlvbiIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibWF4X2xpbmtfdmlvbGF0aW9uXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfTUFYX0xJTktfVklPTEFUSU9OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZGF0YSwgbWF4X2xpbmtfdmlvbGF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbiA9IHsgLm5hbWUgPSAib3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb24iLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm92ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfT1ZFUkhFQURfUFJPRklMRV9WSU9MQVRJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhLCBvdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfcmFuZ2VfdmlvbGF0aW9uID0geyAubmFtZSA9ICJyYW5nZV92aW9sYXRpb24iLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInJhbmdlX3Zpb2xhdGlvblwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX1JBTkdFX1ZJT0xBVElPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGEsIHJhbmdlX3Zpb2xhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfcm9ndWVfdmlvbGF0aW9uID0geyAubmFtZSA9ICJyb2d1ZV92aW9sYXRpb24iLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInJvZ3VlX3Zpb2xhdGlvblwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX1JPR1VFX1ZJT0xBVElPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGEsIHJvZ3VlX3Zpb2xhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbiA9IHsgLm5hbWUgPSAic3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbiIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvblwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX1NZU1RFTV9SRVNPVVJDRV9WSU9MQVRJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhLCBzeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkID0geyAubmFtZSA9ICJ0ZG1fY2hhbm5lbHNfZXhoYXVzdGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJ0ZG1fY2hhbm5lbHNfZXhoYXVzdGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19DRkdfSURfVERNX0NIQU5ORUxTX0VYSEFVU1RFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGEsIHRkbV9jaGFubmVsc19leGhhdXN0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX3Vua25vd25fbGlua192aW9sYXRpb24gPSB7IC5uYW1lID0gInVua25vd25fbGlua192aW9sYXRpb24iLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInVua25vd25fbGlua192aW9sYXRpb25cIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0NGR19JRF9VTktOT1dOX0xJTktfVklPTEFUSU9OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZGF0YSwgdW5rbm93bl9saW5rX3Zpb2xhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbiA9IHsgLm5hbWUgPSAidXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbiIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwidXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvblwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fQ0ZHX0lEX1VQU1RSRUFNX0JBTkRXSURUSF9WSU9MQVRJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhLCB1cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbiwgJnByb3BfZGVzY3JfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uLCAmcHJvcF9kZXNjcl9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX21heF9saW5rX3Zpb2xhdGlvbiwgJnByb3BfZGVzY3JfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbiwgJnByb3BfZGVzY3JfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19yYW5nZV92aW9sYXRpb24sICZwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfcm9ndWVfdmlvbGF0aW9uLCAmcHJvcF9kZXNjcl9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX3N5c3RlbV9yZXNvdXJjZV92aW9sYXRpb24sICZwcm9wX2Rlc2NyX2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZCwgJnByb3BfZGVzY3JfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ191bmtub3duX2xpbmtfdmlvbGF0aW9uLCAmcHJvcF9kZXNjcl9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb24gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJsYXNlcl9vbl9vZmZfdmlvbGF0aW9uIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJsYXNlcl9vbl9vZmZfdmlvbGF0aW9uXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGEsIGxhc2VyX29uX29mZl92aW9sYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJsbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJsbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGEsIGxsaWRfcG9vbF9lbXB0eV92aW9sYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJtYXhfbGlua192aW9sYXRpb24iLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm1heF9saW5rX3Zpb2xhdGlvblwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhLCBtYXhfbGlua192aW9sYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJvdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbiIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwib3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25cIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZGF0YSwgb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJyYW5nZV92aW9sYXRpb24iLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInJhbmdlX3Zpb2xhdGlvblwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhLCByYW5nZV92aW9sYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJyb2d1ZV92aW9sYXRpb24iLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInJvZ3VlX3Zpb2xhdGlvblwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhLCByb2d1ZV92aW9sYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGEsIHN5c3RlbV9yZXNvdXJjZV92aW9sYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJ0ZG1fY2hhbm5lbHNfZXhoYXVzdGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJ0ZG1fY2hhbm5lbHNfZXhoYXVzdGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGEsIHRkbV9jaGFubmVsc19leGhhdXN0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJ1bmtub3duX2xpbmtfdmlvbGF0aW9uIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJ1bmtub3duX2xpbmtfdmlvbGF0aW9uXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGEsIHVua25vd25fbGlua192aW9sYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJ1cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJ1cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGEsIHVwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGEiLCAuZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfYXV0b19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogPT09PSBPYmplY3Q6IGVwb25fbGluayA9PT09ICovCisKKy8qIEdyb3VwOiBlcG9uX2xpbmsgLSBrZXkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfa2V5X2Vwb25fbmkgPSB7IC5uYW1lID0gImVwb25fbmkiLCAuZGVzY3IgPSAiVW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgRVBPTiBOSSBjb250YWluaW5nIHRoZSBsaW5rLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfS0VZX0lEX0VQT05fTkksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2tleSwgZXBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfa2V5X21hY19hZGRyZXNzID0geyAubmFtZSA9ICJtYWNfYWRkcmVzcyIsIC5kZXNjciA9ICJUaGUgTUFDIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBFUE9OIGxpbmsuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19LRVlfSURfTUFDX0FERFJFU1MsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2tleSwgbWFjX2FkZHJlc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX21hY19hZGRyZXNzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9saW5rX2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fbGlua19rZXlfZXBvbl9uaSwgJnByb3BfZGVzY3JfZXBvbl9saW5rX2tleV9tYWNfYWRkcmVzcyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJlcG9uX25pIiwgLmRlc2NyID0gIlVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEVQT04gTkkgY29udGFpbmluZyB0aGUgbGluay4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19rZXksIGVwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAibWFjX2FkZHJlc3MiLCAuZGVzY3IgPSAiVGhlIE1BQyBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgRVBPTiBsaW5rLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2tleSwgbWFjX2FkZHJlc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX21hY19hZGRyZXNzIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2tleSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19rZXkiLCAuZGVzY3IgPSAia2V5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2tleV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfa2V5X2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fbGluayAtIGNmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19jZmdfbGlua19yYXRlID0geyAubmFtZSA9ICJsaW5rX3JhdGUiLCAuZGVzY3IgPSAiVGhpcyBsaW5rJ3MgZG93bnN0cmVhbSBhbmQgdXBzdHJlYW0gcmF0ZS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX0xJTktfUkFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEsIGxpbmtfcmF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19yYXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2NmZ19zdGF0ZV9mbGFncyA9IHsgLm5hbWUgPSAic3RhdGVfZmxhZ3MiLCAuZGVzY3IgPSAiRVBPTiBsaW5rIHN0YXRlIGZsYWdzIHJlZmxlY3QgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBsaW5rLiAgIFJlZ2lzdGVyZWQgc3RhdGUgZmxhZyBpcyBjb250cm9sZWQgYnkgdGhlIHN0YXRpYyByZWdpc3RyYXRpb24gb3BlcmF0aW9uIGZvciBsaW5rcyBvbiBhIHByb3RlY3RlZC1zdGFuZGJ5IFBPTi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1NUQVRFX0ZMQUdTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YSwgc3RhdGVfZmxhZ3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfc3RhdGVfZmxhZ3MgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfY2ZnX2xsaWQgPSB7IC5uYW1lID0gImxsaWQiLCAuZGVzY3IgPSAiTExJRCBhc3NvY2lhdGVkIHdpdGggdGhpcyBsaW5rLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfTExJRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEsIGxsaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90X2hleCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19jZmdfbGFzZXJfb25fdGltZV90cSA9IHsgLm5hbWUgPSAibGFzZXJfb25fdGltZV90cSIsIC5kZXNjciA9ICJMYXNlci1vbiB0aW1lIGluIHRpbWUgcXVhbnRhLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfTEFTRVJfT05fVElNRV9UUSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEsIGxhc2VyX29uX3RpbWVfdHEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2NmZ19sYXNlcl9vZmZfdGltZV90cSA9IHsgLm5hbWUgPSAibGFzZXJfb2ZmX3RpbWVfdHEiLCAuZGVzY3IgPSAiTGFzZXItb2ZmIHRpbWUgaW4gdGltZSBxdWFudGEuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9MQVNFUl9PRkZfVElNRV9UUSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEsIGxhc2VyX29mZl90aW1lX3RxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19jZmdfcmFuZ2VfdmFsdWVfdHEgPSB7IC5uYW1lID0gInJhbmdlX3ZhbHVlX3RxIiwgLmRlc2NyID0gIlJhbmdlIHZhbHVlIHVzZWQgZm9yIHRoaXMgbGluayAtIGluIHRpbWUgcXVhbnRhLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfUkFOR0VfVkFMVUVfVFEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCByYW5nZV92YWx1ZV90cSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfY2ZnX2Rpc3RhbmNlID0geyAubmFtZSA9ICJkaXN0YW5jZSIsIC5kZXNjciA9ICJEaXN0YW5jZSB0byB0aGUgT05VIChEaWZmZXJzIGZyb20gcmFuZ2UgdmFsdWUgaW4gdGhhdCB0aGlzIGlnbm9yZXMgaW50ZXJuYWwgZGVsYXlzKSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfRElTVEFOQ0UsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCBkaXN0YW5jZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfY2ZnX2FsYXJtX3N0YXRlID0geyAubmFtZSA9ICJhbGFybV9zdGF0ZSIsIC5kZXNjciA9ICJUaGUgc3RhdGUgb2YgdGhlIGFsYXJtcyBvbiB0aGlzIGxpbmsuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9BTEFSTV9TVEFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEsIGFsYXJtX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2FsYXJtX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2NmZ190dW5uZWxfaWQgPSB7IC5uYW1lID0gInR1bm5lbF9pZCIsIC5kZXNjciA9ICJUdW5uZWwgSUQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9UVU5ORUxfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCB0dW5uZWxfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90X2hleCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19jZmdfb251X2lkID0geyAubmFtZSA9ICJvbnVfaWQiLCAuZGVzY3IgPSAiT05VIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEVQT04gbGluay4gIEEgdmFsdWUgb2YgMHhGRiBpbmRpY2F0ZXMgdGhhdCB0aGUgbGluayBoYXMgbm90IGJlZW4gYXNzb2NpYXRlZCB3aXRoIGFuIE9OVS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9PTlVfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfY2ZnX21pbl9sYXNlcl9vdmVyaGVhZCA9IHsgLm5hbWUgPSAibWluX2xhc2VyX292ZXJoZWFkIiwgLmRlc2NyID0gIk1pbiBMYXNlciBPdmVyaGVhZCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX01JTl9MQVNFUl9PVkVSSEVBRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEsIG1pbl9sYXNlcl9vdmVyaGVhZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVycyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19jZmdfa2V5X2V4Y2hhbmdlX2NvbmZpZyA9IHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlX2NvbmZpZyIsIC5kZXNjciA9ICJFbmNyeXB0aW9uIGtleSBleGNoYW5nZSBjb25maWd1cmF0aW9uIGZvciB0aGlzIGxpbmsuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfS0VZX0VYQ0hBTkdFX0NPTkZJRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEsIGtleV9leGNoYW5nZV9jb25maWcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2tleV9leGNoYW5nZV9jb25maWcgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfY2ZnX2Vwb25fZW5jcnlwdGlvbiA9IHsgLm5hbWUgPSAiZXBvbl9lbmNyeXB0aW9uIiwgLmRlc2NyID0gIkVQT04gRW5jcnlwdGlvbiAiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9FUE9OX0VOQ1JZUFRJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCBlcG9uX2VuY3J5cHRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2VuY3J5cHRpb25fY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2NmZ19mZWNfZW5hYmxlID0geyAubmFtZSA9ICJmZWNfZW5hYmxlIiwgLmRlc2NyID0gIkZFQyBlbmFibGUgc3RhdGUgZm9yIHRoaXMgbGluay4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9GRUNfRU5BQkxFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YSwgZmVjX2VuYWJsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19mZWNfZW4gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfY2ZnX29hbV9oZWFydGJlYXRfY29uZmlnID0geyAubmFtZSA9ICJvYW1faGVhcnRiZWF0X2NvbmZpZyIsIC5kZXNjciA9ICJPQU0gaGVhcnRiZWF0IGNvbmZpZ3VyYXRpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9PQU1fSEVBUlRCRUFUX0NPTkZJRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEsIG9hbV9oZWFydGJlYXRfY29uZmlnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb2FtX2hlYXJ0YmVhdF9jb25maWcgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfY2ZnX3Vwc3RyZWFtX2JhbmR3aWR0aCA9IHsgLm5hbWUgPSAidXBzdHJlYW1fYmFuZHdpZHRoIiwgLmRlc2NyID0gIlVwc3RyZWFtIEJhbmR3aWR0aCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfQ0ZHX0lEX1VQU1RSRUFNX0JBTkRXSURUSCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEsIHVwc3RyZWFtX2JhbmR3aWR0aCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfY2ZnX3ViZF9pbmZvID0geyAubmFtZSA9ICJ1YmRfaW5mbyIsIC5kZXNjciA9ICJSZXR1cm5zIHRoZSBhY3R1YWwgdmFsdWVzIGZyb20gdGhlIFVCRC4gVXNlZnVsIGlmIHlvdSB3YW50IHRvIHNlZSB3aGF0IHZhbHVlIHRoZSBmaXJtd2FyZSBjaG9zZSBmb3IgYSBmaWVsZCBzZXQgdG8gJ2F1dG9tYXRpYycuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9VQkRfSU5GTywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEsIHViZF9pbmZvKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdWJkX2luZm8gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfY2ZnX2Nsb2NrX3RyYW5zcG9ydF9lbmFibGUgPSB7IC5uYW1lID0gImNsb2NrX3RyYW5zcG9ydF9lbmFibGUiLCAuZGVzY3IgPSAiV2hldGhlciBvciBub3QgdG8gZW5hYmxlIGNsb2NrIHRyYW5zcG9ydCBvbiB0aGlzIGxpbmsuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfQ0xPQ0tfVFJBTlNQT1JUX0VOQUJMRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEsIGNsb2NrX3RyYW5zcG9ydF9lbmFibGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfY2ZnX3BlbmRpbmdfZ3JhbnRzID0geyAubmFtZSA9ICJwZW5kaW5nX2dyYW50cyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHBlbmRpbmcgZ3JhbnRzLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19DRkdfSURfUEVORElOR19HUkFOVFMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCBwZW5kaW5nX2dyYW50cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19jZmdfbGlua190eXBlID0geyAubmFtZSA9ICJsaW5rX3R5cGUiLCAuZGVzY3IgPSAiTGluayBUeXBlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0NGR19JRF9MSU5LX1RZUEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCBsaW5rX3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfdHlwZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbGlua19jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfY2ZnX2xpbmtfcmF0ZSwgJnByb3BfZGVzY3JfZXBvbl9saW5rX2NmZ19zdGF0ZV9mbGFncywgJnByb3BfZGVzY3JfZXBvbl9saW5rX2NmZ19sbGlkLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfY2ZnX2xhc2VyX29uX3RpbWVfdHEsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19jZmdfbGFzZXJfb2ZmX3RpbWVfdHEsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19jZmdfcmFuZ2VfdmFsdWVfdHEsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19jZmdfZGlzdGFuY2UsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19jZmdfYWxhcm1fc3RhdGUsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19jZmdfdHVubmVsX2lkLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfY2ZnX29udV9pZCwgJnByb3BfZGVzY3JfZXBvbl9saW5rX2NmZ19taW5fbGFzZXJfb3ZlcmhlYWQsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19jZmdfa2V5X2V4Y2hhbmdlX2NvbmZpZywgJnByb3BfZGVzY3JfZXBvbl9saW5rX2NmZ19lcG9uX2VuY3J5cHRpb24sICZwcm9wX2Rlc2NyX2Vwb25fbGlua19jZmdfZmVjX2VuYWJsZSwgJnByb3BfZGVzY3JfZXBvbl9saW5rX2NmZ19vYW1faGVhcnRiZWF0X2NvbmZpZywgJnByb3BfZGVzY3JfZXBvbl9saW5rX2NmZ191cHN0cmVhbV9iYW5kd2lkdGgsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19jZmdfdWJkX2luZm8sICZwcm9wX2Rlc2NyX2Vwb25fbGlua19jZmdfY2xvY2tfdHJhbnNwb3J0X2VuYWJsZSwgJnByb3BfZGVzY3JfZXBvbl9saW5rX2NmZ19wZW5kaW5nX2dyYW50cywgJnByb3BfZGVzY3JfZXBvbl9saW5rX2NmZ19saW5rX3R5cGUgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJsaW5rX3JhdGUiLCAuZGVzY3IgPSAiVGhpcyBsaW5rJ3MgZG93bnN0cmVhbSBhbmQgdXBzdHJlYW0gcmF0ZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YSwgbGlua19yYXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3JhdGUgfSwgeyAubmFtZSA9ICJzdGF0ZV9mbGFncyIsIC5kZXNjciA9ICJFUE9OIGxpbmsgc3RhdGUgZmxhZ3MgcmVmbGVjdCB0aGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIGxpbmsuICAgUmVnaXN0ZXJlZCBzdGF0ZSBmbGFnIGlzIGNvbnRyb2xlZCBieSB0aGUgc3RhdGljIHJlZ2lzdHJhdGlvbiBvcGVyYXRpb24gZm9yIGxpbmtzIG9uIGEgcHJvdGVjdGVkLXN0YW5kYnkgUE9OLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCBzdGF0ZV9mbGFncyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19zdGF0ZV9mbGFncyB9LCB7IC5uYW1lID0gImxsaWQiLCAuZGVzY3IgPSAiTExJRCBhc3NvY2lhdGVkIHdpdGggdGhpcyBsaW5rLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCBsbGlkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdF9oZXggfSwgeyAubmFtZSA9ICJsYXNlcl9vbl90aW1lX3RxIiwgLmRlc2NyID0gIkxhc2VyLW9uIHRpbWUgaW4gdGltZSBxdWFudGEuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEsIGxhc2VyX29uX3RpbWVfdHEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAibGFzZXJfb2ZmX3RpbWVfdHEiLCAuZGVzY3IgPSAiTGFzZXItb2ZmIHRpbWUgaW4gdGltZSBxdWFudGEuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEsIGxhc2VyX29mZl90aW1lX3RxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gInJhbmdlX3ZhbHVlX3RxIiwgLmRlc2NyID0gIlJhbmdlIHZhbHVlIHVzZWQgZm9yIHRoaXMgbGluayAtIGluIHRpbWUgcXVhbnRhLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCByYW5nZV92YWx1ZV90cSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJkaXN0YW5jZSIsIC5kZXNjciA9ICJEaXN0YW5jZSB0byB0aGUgT05VIChEaWZmZXJzIGZyb20gcmFuZ2UgdmFsdWUgaW4gdGhhdCB0aGlzIGlnbm9yZXMgaW50ZXJuYWwgZGVsYXlzKSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCBkaXN0YW5jZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJhbGFybV9zdGF0ZSIsIC5kZXNjciA9ICJUaGUgc3RhdGUgb2YgdGhlIGFsYXJtcyBvbiB0aGlzIGxpbmsuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEsIGFsYXJtX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2FsYXJtX3N0YXRlIH0sIHsgLm5hbWUgPSAidHVubmVsX2lkIiwgLmRlc2NyID0gIlR1bm5lbCBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCB0dW5uZWxfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90X2hleCB9LCB7IC5uYW1lID0gIm9udV9pZCIsIC5kZXNjciA9ICJPTlUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgRVBPTiBsaW5rLiAgQSB2YWx1ZSBvZiAweEZGIGluZGljYXRlcyB0aGF0IHRoZSBsaW5rIGhhcyBub3QgYmVlbiBhc3NvY2lhdGVkIHdpdGggYW4gT05VLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJtaW5fbGFzZXJfb3ZlcmhlYWQiLCAuZGVzY3IgPSAiTWluIExhc2VyIE92ZXJoZWFkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEsIG1pbl9sYXNlcl9vdmVyaGVhZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGFzZXJfb3ZlcmhlYWRfcGFyYW1ldGVycyB9LCB7IC5uYW1lID0gImtleV9leGNoYW5nZV9jb25maWciLCAuZGVzY3IgPSAiRW5jcnlwdGlvbiBrZXkgZXhjaGFuZ2UgY29uZmlndXJhdGlvbiBmb3IgdGhpcyBsaW5rLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCBrZXlfZXhjaGFuZ2VfY29uZmlnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9rZXlfZXhjaGFuZ2VfY29uZmlnIH0sIHsgLm5hbWUgPSAiZXBvbl9lbmNyeXB0aW9uIiwgLmRlc2NyID0gIkVQT04gRW5jcnlwdGlvbiAiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YSwgZXBvbl9lbmNyeXB0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9lbmNyeXB0aW9uX2NvbmZpZyB9LCB7IC5uYW1lID0gImZlY19lbmFibGUiLCAuZGVzY3IgPSAiRkVDIGVuYWJsZSBzdGF0ZSBmb3IgdGhpcyBsaW5rLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCBmZWNfZW5hYmxlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2ZlY19lbiB9LCB7IC5uYW1lID0gIm9hbV9oZWFydGJlYXRfY29uZmlnIiwgLmRlc2NyID0gIk9BTSBoZWFydGJlYXQgY29uZmlndXJhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCBvYW1faGVhcnRiZWF0X2NvbmZpZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X29hbV9oZWFydGJlYXRfY29uZmlnIH0sIHsgLm5hbWUgPSAidXBzdHJlYW1fYmFuZHdpZHRoIiwgLmRlc2NyID0gIlVwc3RyZWFtIEJhbmR3aWR0aCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCB1cHN0cmVhbV9iYW5kd2lkdGgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91cHN0cmVhbV9iYW5kd2lkdGhfZGlzdHJpYnV0aW9uIH0sIHsgLm5hbWUgPSAidWJkX2luZm8iLCAuZGVzY3IgPSAiUmV0dXJucyB0aGUgYWN0dWFsIHZhbHVlcyBmcm9tIHRoZSBVQkQuIFVzZWZ1bCBpZiB5b3Ugd2FudCB0byBzZWUgd2hhdCB2YWx1ZSB0aGUgZmlybXdhcmUgY2hvc2UgZm9yIGEgZmllbGQgc2V0IHRvICdhdXRvbWF0aWMnLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCB1YmRfaW5mbyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3ViZF9pbmZvIH0sIHsgLm5hbWUgPSAiY2xvY2tfdHJhbnNwb3J0X2VuYWJsZSIsIC5kZXNjciA9ICJXaGV0aGVyIG9yIG5vdCB0byBlbmFibGUgY2xvY2sgdHJhbnNwb3J0IG9uIHRoaXMgbGluay4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YSwgY2xvY2tfdHJhbnNwb3J0X2VuYWJsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInBlbmRpbmdfZ3JhbnRzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcGVuZGluZyBncmFudHMuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEsIHBlbmRpbmdfZ3JhbnRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAibGlua190eXBlIiwgLmRlc2NyID0gIkxpbmsgVHlwZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhLCBsaW5rX3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfdHlwZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YSIsIC5kZXNjciA9ICJjZmciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9saW5rIC0gc3RhdCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3J4X2RhdGFfYnl0ZXMgPSB7IC5uYW1lID0gInJ4X2RhdGFfYnl0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBsaW5rLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9EQVRBX0JZVEVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X2RhdGFfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfZGF0YV9mcmFtZXMgPSB7IC5uYW1lID0gInJ4X2RhdGFfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZGF0YSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIGxpbmsuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0RBVEFfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X2RhdGFfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3J4X2ZyYW1lc182NCA9IHsgLm5hbWUgPSAicnhfZnJhbWVzXzY0IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNjQgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzY0LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X2ZyYW1lc182NCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF9mcmFtZXNfNjVfMTI3ID0geyAubmFtZSA9ICJyeF9mcmFtZXNfNjVfMTI3IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNjUgdG8gMTI3IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU182NV8xMjcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfZnJhbWVzXzY1XzEyNyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF9mcmFtZXNfMTI4XzI1NSA9IHsgLm5hbWUgPSAicnhfZnJhbWVzXzEyOF8yNTUiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMjggdG8gMjU1IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0ZSQU1FU18xMjhfMjU1LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X2ZyYW1lc18xMjhfMjU1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3J4X2ZyYW1lc18yNTZfNTExID0geyAubmFtZSA9ICJyeF9mcmFtZXNfMjU2XzUxMSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDI1NiB0byA1MTEgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzI1Nl81MTEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfZnJhbWVzXzI1Nl81MTEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfZnJhbWVzXzUxMl8xMDIzID0geyAubmFtZSA9ICJyeF9mcmFtZXNfNTEyXzEwMjMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA1MTIgdG8gMTAyMyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gTGluayIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9SWF9GUkFNRVNfNTEyXzEwMjMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfZnJhbWVzXzUxMl8xMDIzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3J4X2ZyYW1lc18xMDI0XzE1MTggPSB7IC5uYW1lID0gInJ4X2ZyYW1lc18xMDI0XzE1MTgiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMDI0IHRvIDE1MTggYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzEwMjRfMTUxOCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCByeF9mcmFtZXNfMTAyNF8xNTE4KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3J4X2ZyYW1lc18xNTE5XzIwNDcgPSB7IC5uYW1lID0gInJ4X2ZyYW1lc18xNTE5XzIwNDciLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxNTE5IHRvIDIwNDcgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzE1MTlfMjA0NywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCByeF9mcmFtZXNfMTUxOV8yMDQ3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3J4X2ZyYW1lc18yMDQ4XzQwOTUgPSB7IC5uYW1lID0gInJ4X2ZyYW1lc18yMDQ4XzQwOTUiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAyMDQ4IHRvIDQwOTUgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzIwNDhfNDA5NSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCByeF9mcmFtZXNfMjA0OF80MDk1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3J4X2ZyYW1lc180MDk2XzkyMTYgPSB7IC5uYW1lID0gInJ4X2ZyYW1lc180MDk2XzkyMTYiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA0MDk2IHRvIDkyMTYgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzQwOTZfOTIxNiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCByeF9mcmFtZXNfNDA5Nl85MjE2KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3J4X2ZyYW1lc185MjE3XzE2MzgzID0geyAubmFtZSA9ICJyeF9mcmFtZXNfOTIxN18xNjM4MyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDkyMTcgdG8gMTYzODMgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRlJBTUVTXzkyMTdfMTYzODMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfZnJhbWVzXzkyMTdfMTYzODMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfb2FtX2J5dGVzID0geyAubmFtZSA9ICJyeF9vYW1fYnl0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBPQU0gYnl0ZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIGxpbmsuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX09BTV9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCByeF9vYW1fYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfb2FtX2ZyYW1lcyA9IHsgLm5hbWUgPSAicnhfb2FtX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIE9BTSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIGxpbmsuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX09BTV9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfb2FtX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF9tcGNwX2ZyYW1lcyA9IHsgLm5hbWUgPSAicnhfbXBjcF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBNUENQIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gbGluay4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfTVBDUF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfbXBjcF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfYnJvYWRjYXN0X2ZyYW1lcyA9IHsgLm5hbWUgPSAicnhfYnJvYWRjYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJyb2FkY2FzdCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIGxpbmsuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX0JST0FEQ0FTVF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfYnJvYWRjYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF91bmljYXN0X2ZyYW1lcyA9IHsgLm5hbWUgPSAicnhfdW5pY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB1bmljYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gbGluay4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfVU5JQ0FTVF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfdW5pY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfbXVsdGljYXN0X2ZyYW1lcyA9IHsgLm5hbWUgPSAicnhfbXVsdGljYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIG11bHRpY2FzdCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIGxpbmsuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX01VTFRJQ0FTVF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfbXVsdGljYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF9yZXBvcnRfZnJhbWVzID0geyAubmFtZSA9ICJyeF9yZXBvcnRfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVwb3J0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gbGluay4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfUkVQT1JUX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCByeF9yZXBvcnRfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3J4X2Zjc19lcnJvciA9IHsgLm5hbWUgPSAicnhfZmNzX2Vycm9yIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYmFkIEZDUyBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfRkNTX0VSUk9SLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X2Zjc19lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF9vdmVyc2l6ZV9lcnJvciA9IHsgLm5hbWUgPSAicnhfb3ZlcnNpemVfZXJyb3IiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBvdmVyc2l6ZSBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfT1ZFUlNJWkVfRVJST1IsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfb3ZlcnNpemVfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfcnVudF9lcnJvciA9IHsgLm5hbWUgPSAicnhfcnVudF9lcnJvciIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJ1bnQgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1JYX1JVTlRfRVJST1IsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfcnVudF9lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF9saW5lX2NvZGVfZXJyb3IgPSB7IC5uYW1lID0gInJ4X2xpbmVfY29kZV9lcnJvciIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGxpbmUgY29kZSBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfTElORV9DT0RFX0VSUk9SLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X2xpbmVfY29kZV9lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF9saW5lX2NvZGVfZXJyb3JfbWF4ID0geyAubmFtZSA9ICJyeF9saW5lX2NvZGVfZXJyb3JfbWF4IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgbGluZSBjb2RlIGVycm9ycyBtYXggcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfUlhfTElORV9DT0RFX0VSUk9SX01BWCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCByeF9saW5lX2NvZGVfZXJyb3JfbWF4KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3R4X2RhdGFfYnl0ZXMgPSB7IC5uYW1lID0gInR4X2RhdGFfYnl0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBsaW5rLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9EQVRBX0JZVEVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHR4X2RhdGFfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfdHhfZGF0YV9mcmFtZXMgPSB7IC5uYW1lID0gInR4X2RhdGFfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZGF0YSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIGxpbmsuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0RBVEFfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHR4X2RhdGFfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3R4X2ZyYW1lc182NCA9IHsgLm5hbWUgPSAidHhfZnJhbWVzXzY0IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNjQgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzY0LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHR4X2ZyYW1lc182NCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF90eF9mcmFtZXNfNjVfMTI3ID0geyAubmFtZSA9ICJ0eF9mcmFtZXNfNjVfMTI3IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNjUgdG8gMTI3IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU182NV8xMjcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgdHhfZnJhbWVzXzY1XzEyNyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF90eF9mcmFtZXNfMTI4XzI1NSA9IHsgLm5hbWUgPSAidHhfZnJhbWVzXzEyOF8yNTUiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMjggdG8gMjU1IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0ZSQU1FU18xMjhfMjU1LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHR4X2ZyYW1lc18xMjhfMjU1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3R4X2ZyYW1lc18yNTZfNTExID0geyAubmFtZSA9ICJ0eF9mcmFtZXNfMjU2XzUxMSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDI1NiB0byA1MTEgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzI1Nl81MTEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgdHhfZnJhbWVzXzI1Nl81MTEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfdHhfZnJhbWVzXzUxMl8xMDIzID0geyAubmFtZSA9ICJ0eF9mcmFtZXNfNTEyXzEwMjMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA1MTIgdG8gMTAyMyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gTGluayIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfU1RBVF9JRF9UWF9GUkFNRVNfNTEyXzEwMjMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgdHhfZnJhbWVzXzUxMl8xMDIzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3R4X2ZyYW1lc18xMDI0XzE1MTggPSB7IC5uYW1lID0gInR4X2ZyYW1lc18xMDI0XzE1MTgiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMDI0IHRvIDE1MTggYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzEwMjRfMTUxOCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCB0eF9mcmFtZXNfMTAyNF8xNTE4KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3R4X2ZyYW1lc18xNTE5XzIwNDcgPSB7IC5uYW1lID0gInR4X2ZyYW1lc18xNTE5XzIwNDciLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxNTE5IHRvIDIwNDcgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzE1MTlfMjA0NywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCB0eF9mcmFtZXNfMTUxOV8yMDQ3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3R4X2ZyYW1lc18yMDQ4XzQwOTUgPSB7IC5uYW1lID0gInR4X2ZyYW1lc18yMDQ4XzQwOTUiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAyMDQ4IHRvIDQwOTUgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzIwNDhfNDA5NSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCB0eF9mcmFtZXNfMjA0OF80MDk1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3R4X2ZyYW1lc180MDk2XzkyMTYgPSB7IC5uYW1lID0gInR4X2ZyYW1lc180MDk2XzkyMTYiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA0MDk2IHRvIDkyMTYgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzQwOTZfOTIxNiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCB0eF9mcmFtZXNfNDA5Nl85MjE2KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3R4X2ZyYW1lc185MjE3XzE2MzgzID0geyAubmFtZSA9ICJ0eF9mcmFtZXNfOTIxN18xNjM4MyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDkyMTcgdG8gMTYzODMgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfRlJBTUVTXzkyMTdfMTYzODMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgdHhfZnJhbWVzXzkyMTdfMTYzODMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfdHhfb2FtX2J5dGVzID0geyAubmFtZSA9ICJ0eF9vYW1fYnl0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBPQU0gYnl0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIGxpbmsuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX09BTV9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCB0eF9vYW1fYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfdHhfb2FtX2ZyYW1lcyA9IHsgLm5hbWUgPSAidHhfb2FtX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIE9BTSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIGxpbmsuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX09BTV9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgdHhfb2FtX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF90eF9tcGNwX2ZyYW1lcyA9IHsgLm5hbWUgPSAidHhfbXBjcF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBNUENQIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gbGluay4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfTVBDUF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgdHhfbXBjcF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfdHhfYnJvYWRjYXN0X2ZyYW1lcyA9IHsgLm5hbWUgPSAidHhfYnJvYWRjYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJyb2FkY2FzdCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIGxpbmsuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX0JST0FEQ0FTVF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgdHhfYnJvYWRjYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF90eF91bmljYXN0X2ZyYW1lcyA9IHsgLm5hbWUgPSAidHhfdW5pY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB1bmljYXN0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gbGluay4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfVU5JQ0FTVF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgdHhfdW5pY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfdHhfbXVsdGljYXN0X2ZyYW1lcyA9IHsgLm5hbWUgPSAidHhfbXVsdGljYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIG11bHRpY2FzdCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIGxpbmsuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0lEX1RYX01VTFRJQ0FTVF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgdHhfbXVsdGljYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF90eF9nYXRlcyA9IHsgLm5hbWUgPSAidHhfZ2F0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBnYXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gbGluay4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfSURfVFhfR0FURVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgdHhfZ2F0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9saW5rX3N0YXRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF9kYXRhX2J5dGVzLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF9kYXRhX2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfZnJhbWVzXzY0LCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF9mcmFtZXNfNjVfMTI3LCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF9mcmFtZXNfMTI4XzI1NSwgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfZnJhbWVzXzI1Nl81MTEsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3J4X2ZyYW1lc181MTJfMTAyMywgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfZnJhbWVzXzEwMjRfMTUxOCwgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfZnJhbWVzXzE1MTlfMjA0NywgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfZnJhbWVzXzIwNDhfNDA5NSwgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfZnJhbWVzXzQwOTZfOTIxNiwgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfZnJhbWVzXzkyMTdfMTYzODMsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3J4X29hbV9ieXRlcywgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfb2FtX2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfcnhfbXBjcF9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3J4X2Jyb2FkY2FzdF9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3J4X3VuaWNhc3RfZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF9tdWx0aWNhc3RfZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF9yZXBvcnRfZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF9mY3NfZXJyb3IsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3J4X292ZXJzaXplX2Vycm9yLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF9ydW50X2Vycm9yLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9yeF9saW5lX2NvZGVfZXJyb3IsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3J4X2xpbmVfY29kZV9lcnJvcl9tYXgsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3R4X2RhdGFfYnl0ZXMsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3R4X2RhdGFfZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF90eF9mcmFtZXNfNjQsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3R4X2ZyYW1lc182NV8xMjcsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3R4X2ZyYW1lc18xMjhfMjU1LCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF90eF9mcmFtZXNfMjU2XzUxMSwgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfdHhfZnJhbWVzXzUxMl8xMDIzLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF90eF9mcmFtZXNfMTAyNF8xNTE4LCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF90eF9mcmFtZXNfMTUxOV8yMDQ3LCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF90eF9mcmFtZXNfMjA0OF80MDk1LCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF90eF9mcmFtZXNfNDA5Nl85MjE2LCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF90eF9mcmFtZXNfOTIxN18xNjM4MywgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfdHhfb2FtX2J5dGVzLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF90eF9vYW1fZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF90eF9tcGNwX2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfdHhfYnJvYWRjYXN0X2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfdHhfdW5pY2FzdF9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3R4X211bHRpY2FzdF9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X3R4X2dhdGVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJ4X2RhdGFfYnl0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBsaW5rLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfZGF0YV9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9kYXRhX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGRhdGEgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBsaW5rLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfZGF0YV9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfZnJhbWVzXzY0IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNjQgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X2ZyYW1lc182NCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9mcmFtZXNfNjVfMTI3IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNjUgdG8gMTI3IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCByeF9mcmFtZXNfNjVfMTI3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X2ZyYW1lc18xMjhfMjU1IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTI4IHRvIDI1NSBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gTGluayIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfZnJhbWVzXzEyOF8yNTUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfZnJhbWVzXzI1Nl81MTEiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAyNTYgdG8gNTExIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCByeF9mcmFtZXNfMjU2XzUxMSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9mcmFtZXNfNTEyXzEwMjMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA1MTIgdG8gMTAyMyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gTGluayIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfZnJhbWVzXzUxMl8xMDIzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X2ZyYW1lc18xMDI0XzE1MTgiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMDI0IHRvIDE1MTggYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X2ZyYW1lc18xMDI0XzE1MTgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfZnJhbWVzXzE1MTlfMjA0NyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDE1MTkgdG8gMjA0NyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gTGluayIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfZnJhbWVzXzE1MTlfMjA0NyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9mcmFtZXNfMjA0OF80MDk1IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMjA0OCB0byA0MDk1IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCByeF9mcmFtZXNfMjA0OF80MDk1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X2ZyYW1lc180MDk2XzkyMTYiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA0MDk2IHRvIDkyMTYgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X2ZyYW1lc180MDk2XzkyMTYpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfZnJhbWVzXzkyMTdfMTYzODMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA5MjE3IHRvIDE2MzgzIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCByeF9mcmFtZXNfOTIxN18xNjM4MyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9vYW1fYnl0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBPQU0gYnl0ZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIGxpbmsuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCByeF9vYW1fYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfb2FtX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIE9BTSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIGxpbmsuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCByeF9vYW1fZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X21wY3BfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgTVBDUCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIGxpbmsuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCByeF9tcGNwX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9icm9hZGNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnJvYWRjYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gbGluay4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X2Jyb2FkY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfdW5pY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB1bmljYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gbGluay4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X3VuaWNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X211bHRpY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBtdWx0aWNhc3QgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBsaW5rLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfbXVsdGljYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9yZXBvcnRfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVwb3J0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gbGluay4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X3JlcG9ydF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfZmNzX2Vycm9yIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYmFkIEZDUyBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X2Zjc19lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9vdmVyc2l6ZV9lcnJvciIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIG92ZXJzaXplIGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIEVQT04gTGluayIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgcnhfb3ZlcnNpemVfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfcnVudF9lcnJvciIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJ1bnQgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCByeF9ydW50X2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X2xpbmVfY29kZV9lcnJvciIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGxpbmUgY29kZSBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X2xpbmVfY29kZV9lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9saW5lX2NvZGVfZXJyb3JfbWF4IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgbGluZSBjb2RlIGVycm9ycyBtYXggcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHJ4X2xpbmVfY29kZV9lcnJvcl9tYXgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfZGF0YV9ieXRlcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIGxpbmsuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCB0eF9kYXRhX2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInR4X2RhdGFfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZGF0YSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIGxpbmsuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCB0eF9kYXRhX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJ0eF9mcmFtZXNfNjQiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA2NCBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gTGluayIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgdHhfZnJhbWVzXzY0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInR4X2ZyYW1lc182NV8xMjciLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA2NSB0byAxMjcgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHR4X2ZyYW1lc182NV8xMjcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfZnJhbWVzXzEyOF8yNTUiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMjggdG8gMjU1IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCB0eF9mcmFtZXNfMTI4XzI1NSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJ0eF9mcmFtZXNfMjU2XzUxMSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDI1NiB0byA1MTEgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHR4X2ZyYW1lc18yNTZfNTExKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInR4X2ZyYW1lc181MTJfMTAyMyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDUxMiB0byAxMDIzIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCB0eF9mcmFtZXNfNTEyXzEwMjMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfZnJhbWVzXzEwMjRfMTUxOCIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEwMjQgdG8gMTUxOCBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gTGluayIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgdHhfZnJhbWVzXzEwMjRfMTUxOCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJ0eF9mcmFtZXNfMTUxOV8yMDQ3IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTUxOSB0byAyMDQ3IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBMaW5rIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCB0eF9mcmFtZXNfMTUxOV8yMDQ3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInR4X2ZyYW1lc18yMDQ4XzQwOTUiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAyMDQ4IHRvIDQwOTUgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHR4X2ZyYW1lc18yMDQ4XzQwOTUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfZnJhbWVzXzQwOTZfOTIxNiIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDQwOTYgdG8gOTIxNiBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gTGluayIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgdHhfZnJhbWVzXzQwOTZfOTIxNiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJ0eF9mcmFtZXNfOTIxN18xNjM4MyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDkyMTcgdG8gMTYzODMgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIExpbmsiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHR4X2ZyYW1lc185MjE3XzE2MzgzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInR4X29hbV9ieXRlcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIE9BTSBieXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gbGluay4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHR4X29hbV9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJ0eF9vYW1fZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgT0FNIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gbGluay4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHR4X29hbV9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfbXBjcF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBNUENQIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gbGluay4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEsIHR4X21wY3BfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInR4X2Jyb2FkY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBicm9hZGNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBsaW5rLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgdHhfYnJvYWRjYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJ0eF91bmljYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHVuaWNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBsaW5rLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSwgdHhfdW5pY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfbXVsdGljYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIG11bHRpY2FzdCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIGxpbmsuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCB0eF9tdWx0aWNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInR4X2dhdGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZ2F0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIGxpbmsuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhLCB0eF9nYXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YSIsIC5kZXNjciA9ICJzdGF0IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3N0YXRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fbGluayAtIGZvcmNlX3JlZGlzY292ZXJ5ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9saW5rX2ZvcmNlX3JlZGlzY292ZXJ5X3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGVwb25fbGluayAtIGRlbGV0ZV9saW5rICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9saW5rX2RlbGV0ZV9saW5rX3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGVwb25fbGluayAtIGtleV9leGNoYW5nZV9mYWlsdXJlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2FsYXJtX3N0YXR1cyA9IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gImFsYXJtIHN0YXR1cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfS0VZX0VYQ0hBTkdFX0ZBSUxVUkVfSURfQUxBUk1fU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfYWxhcm1fc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiYWxhcm0gc3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfZGF0YSIsIC5kZXNjciA9ICJUaGUgT0xUIGZhaWxlZCB0byByZWNlaXZlIGFuIHVwZGF0ZWQgZW5jcnlwdGlvbiBrZXkgd2l0aGluIHRoZSBleHBlY3RlZCB0aW1lIHBlcmlvZCBhZnRlciBlbmNyeXB0aW9uIGtleSBleGNoYW5nZSBoYXMgYmVlbiBpbml0aWF0ZWQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fbGluayAtIGVuY3J5cHRpb25fZW5hYmxlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbGlua19lbmNyeXB0aW9uX2VuYWJsZWRfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogZXBvbl9saW5rIC0gbXBjcF9yZWdfYWNrX3RpbWVvdXQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2xpbmtfbXBjcF9yZWdfYWNrX3RpbWVvdXRfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogZXBvbl9saW5rIC0gcmFuZ2VfdmFsdWVfY2hhbmdlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX3JhbmdlX3ZhbHVlX3RxID0geyAubmFtZSA9ICJyYW5nZV92YWx1ZV90cSIsIC5kZXNjciA9ICJOZXcgcmFuZ2UgdmFsdWUuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19SQU5HRV9WQUxVRV9DSEFOR0VEX0lEX1JBTkdFX1ZBTFVFX1RRLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2RhdGEsIHJhbmdlX3ZhbHVlX3RxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfcmFuZ2VfdmFsdWVfdHEgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicmFuZ2VfdmFsdWVfdHEiLCAuZGVzY3IgPSAiTmV3IHJhbmdlIHZhbHVlLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfZGF0YSwgcmFuZ2VfdmFsdWVfdHEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2RhdGEiLCAuZGVzY3IgPSAiSW5kaWNhdGlvbiBzZW50IHdoZW4gYSByYW5nZSB2YWx1ZSBoYXMgYmVlbiBjaGFuZ2VkLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX2xpbmsgLSBwcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9wcm90ZWN0aW9uX3N0YXR1cyA9IHsgLm5hbWUgPSAicHJvdGVjdGlvbl9zdGF0dXMiLCAuZGVzY3IgPSAiVGhlIGxpbmsncyBwb3N0LXN3aXRjaCByb2xlICh3b3JraW5nIG9yIHN0YW5kYnkpLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfUFJPVEVDVElPTl9TV0lUQ0hfT0NDVVJSRURfSURfUFJPVEVDVElPTl9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkX2RhdGEsIHByb3RlY3Rpb25fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkX3JhbmdlX3ZhbHVlX3RxID0geyAubmFtZSA9ICJyYW5nZV92YWx1ZV90cSIsIC5kZXNjciA9ICJDdXJyZW50IHJhbmdlIHZhbHVlIGluIHRpbWUgcXVhbnRhLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfUFJPVEVDVElPTl9TV0lUQ0hfT0NDVVJSRURfSURfUkFOR0VfVkFMVUVfVFEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkX2RhdGEsIHJhbmdlX3ZhbHVlX3RxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9wcm90ZWN0aW9uX3N0YXR1cywgJnByb3BfZGVzY3JfZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkX3JhbmdlX3ZhbHVlX3RxIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwcm90ZWN0aW9uX3N0YXR1cyIsIC5kZXNjciA9ICJUaGUgbGluaydzIHBvc3Qtc3dpdGNoIHJvbGUgKHdvcmtpbmcgb3Igc3RhbmRieSkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfZGF0YSwgcHJvdGVjdGlvbl9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3RhdGUgfSwgeyAubmFtZSA9ICJyYW5nZV92YWx1ZV90cSIsIC5kZXNjciA9ICJDdXJyZW50IHJhbmdlIHZhbHVlIGluIHRpbWUgcXVhbnRhLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkX2RhdGEsIHJhbmdlX3ZhbHVlX3RxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkX2RhdGEiLCAuZGVzY3IgPSAiVGhlIGxpbmsgaGFzIHVuZGVyZ29uZSBhIHByb3RlY3Rpb24gc3dpdGNoIGV2ZW50LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX2xpbmsgLSBkdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9pbml0aWFsX3JhbmdlX3RxID0geyAubmFtZSA9ICJpbml0aWFsX3JhbmdlX3RxIiwgLmRlc2NyID0gIlJhbmdlIGFzIGNhbGN1bGF0ZWQgZnJvbSB0aGUgZmlyc3QgZnJhbWUgcmVjZWl2ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19EVVBMSUNBVEVfTVBDUF9SRUdJU1RSQVRJT05fUkVRVUVTVF9JRF9JTklUSUFMX1JBTkdFX1RRLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9kYXRhLCBpbml0aWFsX3JhbmdlX3RxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9jdXJyZW50X3JhbmdlX3RxID0geyAubmFtZSA9ICJjdXJyZW50X3JhbmdlX3RxIiwgLmRlc2NyID0gIlJhbmdlIGFzIGNhbGN1bGF0ZWQgZnJvbSB0aGUgY3VycmVudCBmcmFtZS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0RVUExJQ0FURV9NUENQX1JFR0lTVFJBVElPTl9SRVFVRVNUX0lEX0NVUlJFTlRfUkFOR0VfVFEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2RhdGEsIGN1cnJlbnRfcmFuZ2VfdHEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2luaXRpYWxfcmFuZ2VfdHEsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9jdXJyZW50X3JhbmdlX3RxIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJpbml0aWFsX3JhbmdlX3RxIiwgLmRlc2NyID0gIlJhbmdlIGFzIGNhbGN1bGF0ZWQgZnJvbSB0aGUgZmlyc3QgZnJhbWUgcmVjZWl2ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfZGF0YSwgaW5pdGlhbF9yYW5nZV90cSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJjdXJyZW50X3JhbmdlX3RxIiwgLmRlc2NyID0gIlJhbmdlIGFzIGNhbGN1bGF0ZWQgZnJvbSB0aGUgY3VycmVudCBmcmFtZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9kYXRhLCBjdXJyZW50X3JhbmdlX3RxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X2RhdGEiLCAuZGVzY3IgPSAiQSByZWdpc3RlciByZXF1ZXN0ZWQgd2FzIHJlY2VpdmVkIGZvciBhIGxpbmsgd2l0aCB0aGUgc2FtZSBNQUMgYWRkcmVzcyBhcyBhIGxpbmsgdGhhdCBoYXMgYWxyZWFkeSByZWdpc3RlcmVkLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX2xpbmsgLSBsaW5rX3NwZWVkX21pc21hdGNoICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfcHJldmlvdXNfcmF0ZSA9IHsgLm5hbWUgPSAicHJldmlvdXNfcmF0ZSIsIC5kZXNjciA9ICJQT04gcmF0ZSBsaW5rIGluaXRpYWxseSByZWdpc3RlcmVkIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19MSU5LX1NQRUVEX01JU01BVENIX0lEX1BSRVZJT1VTX1JBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfZGF0YSwgcHJldmlvdXNfcmF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19yYXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfY3VycmVudF9yYXRlID0geyAubmFtZSA9ICJjdXJyZW50X3JhdGUiLCAuZGVzY3IgPSAiUE9OIHJhdGUgbGluayBpcyBjdXJyZW50bHkgYXR0ZW1wdGluZyB0byByZWdpc3RlciBhdCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfTElOS19TUEVFRF9NSVNNQVRDSF9JRF9DVVJSRU5UX1JBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfZGF0YSwgY3VycmVudF9yYXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3JhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX3ByZXZpb3VzX3JhdGUsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2N1cnJlbnRfcmF0ZSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwcmV2aW91c19yYXRlIiwgLmRlc2NyID0gIlBPTiByYXRlIGxpbmsgaW5pdGlhbGx5IHJlZ2lzdGVyZWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2RhdGEsIHByZXZpb3VzX3JhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfcmF0ZSB9LCB7IC5uYW1lID0gImN1cnJlbnRfcmF0ZSIsIC5kZXNjciA9ICJQT04gcmF0ZSBsaW5rIGlzIGN1cnJlbnRseSBhdHRlbXB0aW5nIHRvIHJlZ2lzdGVyIGF0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9kYXRhLCBjdXJyZW50X3JhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfcmF0ZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9kYXRhIiwgLmRlc2NyID0gIkhvc3Qgd2lsbCByZWNlaXZlIHRoaXMgaW5kaWNhdGlvbiBpZiBhIGxpbmsgcmVnaXN0ZXJzIHRoZW4gYXR0ZW1wdHMgdG8gcmVnaXN0ZXIgbGF0ZXIgYXQgYSBkaWZmZXJlbnQgc3BlZWQsIG9yIGlmIHRoZSBsaW5rIHJlZ2lzdGVycyBhdCBhIGRpZmZlcmVudCBzcGVlZCB0aGFuIHRoZSBzcGVlZCB3aXRoIHdoaWNoIGl0IHdhcyBwcmUtcHJvdmlzaW9uZWQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fbGluayAtIG1wY3BfcmVwb3J0X3RpbWVvdXQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBTdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX01QQ1BfUkVQT1JUX1RJTUVPVVRfSURfQUxBUk1fU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0X2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfYWxhcm1fc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBTdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0X2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0X2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhIiwgLmRlc2NyID0gIlRoZSBwcm92aXNpb25lZCBsaW1pdCBiZXR3ZWVuIHJlcG9ydHMgZm9yIHRoZSBzcGVjaWZpZWQgbGluayBoYXMgYmVlbiBleGNlZWRlZC4gIFRoaXMgbGluayB3aWxsIGJlIGRlLXJlZ2lzdGVyZWQsIGFuZCB0aGUgYWxhcm1fc3RhdHVzIHNldCB3aGVuIHRoaXMgb2NjdXJzLiAgVGhlIGFsYXJtX3N0YXR1cyB3aWxsIGJlIGNsZWFyZWQgd2hlbiB0aGUgbGluayBhdHRlbXB0cyB0byByZWdpc3RlciBhZ2Fpbi4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9saW5rIC0gb2FtX2tlZXBhbGl2ZV90aW1lb3V0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBTdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX09BTV9LRUVQQUxJVkVfVElNRU9VVF9JRF9BTEFSTV9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9hbGFybV9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiQWxhcm0gU3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfZGF0YSIsIC5kZXNjciA9ICJUaGUgcHJvdmlzaW9uZWQgdGltZSBsaW1pdCBiZXR3ZWVuIHJlY2VpdmluZyB1cHN0cmVhbSBpbmZvIGZyYW1lcyBoYXMgYmVlbiBleGNlZWRlZC4gIE5vcm1hbGx5IGFuIE9OVSB3aWxsIHJlc2V0IGl0cyBPQU0gc3RhdGUgbWFjaGluZSB3aGVuIHRoaXMgb2NjdXJycyBhbmQgdGhlIGhvc3QgbXVzdCByZS1uZWdvdGlhdGUgT0FNIGFuZCByZXByb3Zpc2lvbiB0aGUgbGluay4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZW91dF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9saW5rIC0gbXBjcF9kaXNjb3ZlcmVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9saW5rX2luZm8gPSB7IC5uYW1lID0gImxpbmtfaW5mbyIsIC5kZXNjciA9ICJJbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGRpc2NvdmVyZWQgbGluay4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX01QQ1BfRElTQ09WRVJFRF9JRF9MSU5LX0lORk8sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9kYXRhLCBsaW5rX2luZm8pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfaW5mbyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2xpbmtfaW5mbyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImxpbmtfaW5mbyIsIC5kZXNjciA9ICJJbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGRpc2NvdmVyZWQgbGluay4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfZGF0YSwgbGlua19pbmZvKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2luZm8gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2RhdGEiLCAuZGVzY3IgPSAiQSBsaW5rIGhhcyBjb21wbGV0ZWQgTVBDUCBsaW5rIHJlZ2lzdHJhdGlvbi4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9saW5rIC0gbXBjcF9kZXJlZ2lzdGVyZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2xpbmtfbXBjcF9kZXJlZ2lzdGVyZWRfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogZXBvbl9saW5rIC0gcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9saW5rX2luZm8gPSB7IC5uYW1lID0gImxpbmtfaW5mbyIsIC5kZXNjciA9ICJJbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGxpbmsuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19QUkVQUk9WSVNJT05FRF9MSU5LX0NSRUFURURfSURfTElOS19JTkZPLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfZGF0YSwgbGlua19pbmZvKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2luZm8gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9saW5rX2luZm8gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJsaW5rX2luZm8iLCAuZGVzY3IgPSAiSW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5rLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9kYXRhLCBsaW5rX2luZm8pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfaW5mbyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfZGF0YSIsIC5kZXNjciA9ICJSYWlzZWQgYWZ0ZXIgYW4gJ2FkZF9saW5rJyBvcGVyYXRpb24gb24gYW4gRVBPTiBOSSBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fbGluayAtIG9hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9zZW5kX3BlcmlvZCA9IHsgLm5hbWUgPSAic2VuZF9wZXJpb2QiLCAuZGVzY3IgPSAiVGhlIHBlcmlvZCBhdCB3aGljaCB0byBzZW5kIE9BTSBpbmZvIGZyYW1lcyAoaW4gc2Vjb25kcykuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19PQU1fS0VFUEFMSVZFX1RJTUVSX1NUQVJUX0lEX1NFTkRfUEVSSU9ELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2RhdGEsIHNlbmRfcGVyaW9kKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfc2VuZF9wZXJpb2QgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic2VuZF9wZXJpb2QiLCAuZGVzY3IgPSAiVGhlIHBlcmlvZCBhdCB3aGljaCB0byBzZW5kIE9BTSBpbmZvIGZyYW1lcyAoaW4gc2Vjb25kcykuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9kYXRhLCBzZW5kX3BlcmlvZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfZGF0YSIsIC5kZXNjciA9ICJTdGFydCB0aGUgT0FNIGtlZXBhbGl2ZSB0aW1lciBhZ2FpbnN0IHRoaXMgbGluay4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9saW5rIC0gb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcF9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiBlcG9uX2xpbmsgLSBrZXlfZXhjaGFuZ2Vfc3RhcnQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X3BlcmlvZCA9IHsgLm5hbWUgPSAicGVyaW9kIiwgLmRlc2NyID0gIktleSBleGNoYW5nZSBwZXJpb2QgaW4gc2Vjb25kcy4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0tFWV9FWENIQU5HRV9TVEFSVF9JRF9QRVJJT0QsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9kYXRhLCBwZXJpb2QpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfcGVyaW9kIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicGVyaW9kIiwgLmRlc2NyID0gIktleSBleGNoYW5nZSBwZXJpb2QgaW4gc2Vjb25kcy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfZGF0YSwgcGVyaW9kKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfZGF0YSIsIC5kZXNjciA9ICJBcHBseSB0aGUgY29ycmVzcG9uZGluZyBwcm92aXNpb25pbmcgZm9yICdlcG9uX2xpbmsua2V5X2V4Y2hhbmdlX2NvbmZpZycgYWdhaW5zdCB0aGlzIGxpbmsgYW5kIHRoZW4gc3RhcnQga2V5IGV4Y2hhbmdlIHRpbWVyIHdpdGggdGhlIGdpdmVuIHBlcmlvZC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9saW5rIC0ga2V5X2V4Y2hhbmdlX3N0b3AgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogZXBvbl9saW5rIC0gb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZF9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiBlcG9uX2xpbmsgLSBvYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BwZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkX3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGVwb25fbGluayAtIGtleV9leGNoYW5nZV9zdGFydGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydGVkX3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGVwb25fbGluayAtIGtleV9leGNoYW5nZV9zdG9wcGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdG9wcGVkX3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGVwb25fbGluayAtIHN0YXRpY19yZWdpc3RyYXRpb24gKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9sYXNlcm9uX3RpbWVfdHEgPSB7IC5uYW1lID0gImxhc2Vyb25fdGltZV90cSIsIC5kZXNjciA9ICJMYXNlci1vbiB0aW1lIGluIHRpbWUgcXVhbnRhLlxcIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUSUNfUkVHSVNUUkFUSU9OX0lEX0xBU0VST05fVElNRV9UUSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kYXRhLCBsYXNlcm9uX3RpbWVfdHEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fbGFzZXJvZmZfdGltZV90cSA9IHsgLm5hbWUgPSAibGFzZXJvZmZfdGltZV90cSIsIC5kZXNjciA9ICJMYXNlci1vZmYgdGltZSBpbiB0aW1lIHF1YW50YS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRJQ19SRUdJU1RSQVRJT05fSURfTEFTRVJPRkZfVElNRV9UUSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kYXRhLCBsYXNlcm9mZl90aW1lX3RxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX3JhbmdlX3ZhbHVlX3RxID0geyAubmFtZSA9ICJyYW5nZV92YWx1ZV90cSIsIC5kZXNjciA9ICJSYW5nZSB2YWx1ZSB1c2VkIGZvciB0aGlzIGxpbmsgLSBpbiB0aW1lIHF1YW50YS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRJQ19SRUdJU1RSQVRJT05fSURfUkFOR0VfVkFMVUVfVFEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZGF0YSwgcmFuZ2VfdmFsdWVfdHEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fcGVuZGluZ19ncmFudHMgPSB7IC5uYW1lID0gInBlbmRpbmdfZ3JhbnRzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcGVuZGluZyBncmFudHMuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUSUNfUkVHSVNUUkFUSU9OX0lEX1BFTkRJTkdfR1JBTlRTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RhdGEsIHBlbmRpbmdfZ3JhbnRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9sYXNlcm9uX3RpbWVfdHEsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2xhc2Vyb2ZmX3RpbWVfdHEsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX3JhbmdlX3ZhbHVlX3RxLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9wZW5kaW5nX2dyYW50cyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJsYXNlcm9uX3RpbWVfdHEiLCAuZGVzY3IgPSAiTGFzZXItb24gdGltZSBpbiB0aW1lIHF1YW50YS5cXCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZGF0YSwgbGFzZXJvbl90aW1lX3RxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImxhc2Vyb2ZmX3RpbWVfdHEiLCAuZGVzY3IgPSAiTGFzZXItb2ZmIHRpbWUgaW4gdGltZSBxdWFudGEuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kYXRhLCBsYXNlcm9mZl90aW1lX3RxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gInJhbmdlX3ZhbHVlX3RxIiwgLmRlc2NyID0gIlJhbmdlIHZhbHVlIHVzZWQgZm9yIHRoaXMgbGluayAtIGluIHRpbWUgcXVhbnRhLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZGF0YSwgcmFuZ2VfdmFsdWVfdHEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAicGVuZGluZ19ncmFudHMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBwZW5kaW5nIGdyYW50cy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RhdGEsIHBlbmRpbmdfZ3JhbnRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RhdGEiLCAuZGVzY3IgPSAiU3RhdGljYWxseSByZWdpc3RlcnMgdGhlIGxvZ2ljYWwgbGluayIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX2xpbmsgLSBzdGF0aWNfcmVnaXN0cmF0aW9uX2RvbmUgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lX3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGVwb25fbGluayAtIHJlcmFuZ2VfZmFpbHVyZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbGlua19yZXJhbmdlX2ZhaWx1cmVfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogZXBvbl9saW5rIC0gaW5qZWN0X2ZyYW1lICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2luamVjdF9mcmFtZV9mcmFtZSA9IHsgLm5hbWUgPSAiZnJhbWUiLCAuZGVzY3IgPSAiQ29tcGxldGUgY29udGVudHMgb2YgdGhlIGZyYW1lIGJlZ2lubmluZyB3aXRoIHRoZSBEQSB1cCB0aHJvdWdoIGJ1dCBub3QgaW5jbHVkaW5nIHRoZSBDUkMuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19JTkpFQ1RfRlJBTUVfSURfRlJBTUUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZV9kYXRhLCBmcmFtZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2V0aGVybmV0X2ZyYW1lX3VubWFza2VkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9saW5rX2luamVjdF9mcmFtZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fbGlua19pbmplY3RfZnJhbWVfZnJhbWUgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJmcmFtZSIsIC5kZXNjciA9ICJDb21wbGV0ZSBjb250ZW50cyBvZiB0aGUgZnJhbWUgYmVnaW5uaW5nIHdpdGggdGhlIERBIHVwIHRocm91Z2ggYnV0IG5vdCBpbmNsdWRpbmcgdGhlIENSQy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfZGF0YSwgZnJhbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ldGhlcm5ldF9mcmFtZV91bm1hc2tlZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfZGF0YSIsIC5kZXNjciA9ICJTZW5kIGFuIGFyYml0cmFyeSBmcmFtZSBhY3Jvc3MgdGhlIHNwZWNpZmllZCBsaW5rLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWVfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX2xpbmsgLSBmcmFtZV9jYXB0dXJlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9mcmFtZSA9IHsgLm5hbWUgPSAiZnJhbWUiLCAuZGVzY3IgPSAiQ29udGVudHMgb2YgdGhlIGZyYW1lLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfRlJBTUVfQ0FQVFVSRURfSURfRlJBTUUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkX2RhdGEsIGZyYW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdThfbGlzdF91MzIgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfZnJhbWUgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImZyYW1lIiwgLmRlc2NyID0gIkNvbnRlbnRzIG9mIHRoZSBmcmFtZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9kYXRhLCBmcmFtZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3U4X2xpc3RfdTMyIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfZGF0YSIsIC5kZXNjciA9ICJBIGZyYW1lIG1hdGNoaW5nIGhvc3Qtc3BlY2lmaWVkIGNyaXRlcmlhIHdhcyByZWNlaXZlZC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9saW5rIC0gbGlua19kZWxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9saW5rX2xpbmtfZGVsZXRlZF9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiBlcG9uX2xpbmsgLSBzdGF0X2NmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X2NmZ19jZmcgPSB7IC5uYW1lID0gImNmZyIsIC5kZXNjciA9ICJTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfQ0ZHX0lEX0NGRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfZGF0YSwgY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9jb25maWcgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2xpbmtfc3RhdF9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9jZmdfY2ZnIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJjZmciLCAuZGVzY3IgPSAiU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfZGF0YSwgY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9jb25maWcgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19kYXRhIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fbGluayAtIHN0YXRfYWxhcm1fcmFpc2VkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3N0YXRfaWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3N0YXRfaWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIiwgLmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fbGluayAtIHN0YXRfYWxhcm1fY2xlYXJlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCA9IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfc3RhdF9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaXMgbm8gbG9uZ2VyIG1ldC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9saW5rIC0gYXV0b19jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfYXV0b19jZmdfZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3QgPSB7IC5uYW1lID0gImR1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0IiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJkdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfRFVQTElDQVRFX01QQ1BfUkVHSVNUUkFUSU9OX1JFUVVFU1QsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEsIGR1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX2VuY3J5cHRpb25fZW5hYmxlZCA9IHsgLm5hbWUgPSAiZW5jcnlwdGlvbl9lbmFibGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJlbmNyeXB0aW9uX2VuYWJsZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0VOQ1JZUFRJT05fRU5BQkxFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSwgZW5jcnlwdGlvbl9lbmFibGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX2tleV9leGNoYW5nZV9mYWlsdXJlID0geyAubmFtZSA9ICJrZXlfZXhjaGFuZ2VfZmFpbHVyZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwia2V5X2V4Y2hhbmdlX2ZhaWx1cmVcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9GQUlMVVJFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhLCBrZXlfZXhjaGFuZ2VfZmFpbHVyZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19hdXRvX2NmZ19rZXlfZXhjaGFuZ2Vfc3RhcnRlZCA9IHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlX3N0YXJ0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImtleV9leGNoYW5nZV9zdGFydGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfU1RBUlRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSwga2V5X2V4Y2hhbmdlX3N0YXJ0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfYXV0b19jZmdfa2V5X2V4Y2hhbmdlX3N0b3BwZWQgPSB7IC5uYW1lID0gImtleV9leGNoYW5nZV9zdG9wcGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJrZXlfZXhjaGFuZ2Vfc3RvcHBlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX1NUT1BQRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEsIGtleV9leGNoYW5nZV9zdG9wcGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX2xpbmtfZGVsZXRlZCA9IHsgLm5hbWUgPSAibGlua19kZWxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJsaW5rX2RlbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0xJTktfREVMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSwgbGlua19kZWxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX2xpbmtfc3BlZWRfbWlzbWF0Y2ggPSB7IC5uYW1lID0gImxpbmtfc3BlZWRfbWlzbWF0Y2giLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImxpbmtfc3BlZWRfbWlzbWF0Y2hcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX0xJTktfU1BFRURfTUlTTUFUQ0gsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEsIGxpbmtfc3BlZWRfbWlzbWF0Y2gpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX2xpbmtfYXV0b19jZmdfbXBjcF9kZXJlZ2lzdGVyZWQgPSB7IC5uYW1lID0gIm1wY3BfZGVyZWdpc3RlcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJtcGNwX2RlcmVnaXN0ZXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTVBDUF9ERVJFR0lTVEVSRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEsIG1wY3BfZGVyZWdpc3RlcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX21wY3BfZGlzY292ZXJlZCA9IHsgLm5hbWUgPSAibXBjcF9kaXNjb3ZlcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJtcGNwX2Rpc2NvdmVyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX01QQ1BfRElTQ09WRVJFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSwgbXBjcF9kaXNjb3ZlcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX21wY3BfcmVnX2Fja190aW1lb3V0ID0geyAubmFtZSA9ICJtcGNwX3JlZ19hY2tfdGltZW91dCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibXBjcF9yZWdfYWNrX3RpbWVvdXRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX01QQ1BfUkVHX0FDS19USU1FT1VULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhLCBtcGNwX3JlZ19hY2tfdGltZW91dCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19hdXRvX2NmZ19tcGNwX3JlcG9ydF90aW1lb3V0ID0geyAubmFtZSA9ICJtcGNwX3JlcG9ydF90aW1lb3V0IiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJtcGNwX3JlcG9ydF90aW1lb3V0XCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9NUENQX1JFUE9SVF9USU1FT1VULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhLCBtcGNwX3JlcG9ydF90aW1lb3V0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX29hbV9rZWVwYWxpdmVfdGltZW91dCA9IHsgLm5hbWUgPSAib2FtX2tlZXBhbGl2ZV90aW1lb3V0IiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvYW1fa2VlcGFsaXZlX3RpbWVvdXRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX09BTV9LRUVQQUxJVkVfVElNRU9VVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSwgb2FtX2tlZXBhbGl2ZV90aW1lb3V0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZCA9IHsgLm5hbWUgPSAib2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX09BTV9LRUVQQUxJVkVfVElNRVJfU1RBUlRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSwgb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZCA9IHsgLm5hbWUgPSAib2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BwZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX09BTV9LRUVQQUxJVkVfVElNRVJfU1RPUFBFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSwgb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZCA9IHsgLm5hbWUgPSAicHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJwcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX1BSRVBST1ZJU0lPTkVEX0xJTktfQ1JFQVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSwgcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkID0geyAubmFtZSA9ICJwcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENIX09DQ1VSUkVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhLCBwcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19hdXRvX2NmZ19yYW5nZV92YWx1ZV9jaGFuZ2VkID0geyAubmFtZSA9ICJyYW5nZV92YWx1ZV9jaGFuZ2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJyYW5nZV92YWx1ZV9jaGFuZ2VkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9SQU5HRV9WQUxVRV9DSEFOR0VELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhLCByYW5nZV92YWx1ZV9jaGFuZ2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX3JlcmFuZ2VfZmFpbHVyZSA9IHsgLm5hbWUgPSAicmVyYW5nZV9mYWlsdXJlIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJyZXJhbmdlX2ZhaWx1cmVcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX1JFUkFOR0VfRkFJTFVSRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSwgcmVyYW5nZV9mYWlsdXJlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCA9IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9jbGVhcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX3N0YXRfYWxhcm1fcmFpc2VkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX3JhaXNlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbGlua19hdXRvX2NmZ19zdGF0aWNfcmVnaXN0cmF0aW9uX2RvbmUgPSB7IC5uYW1lID0gInN0YXRpY19yZWdpc3RyYXRpb25fZG9uZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTElOS19BVVRPX0NGR19JRF9TVEFUSUNfUkVHSVNUUkFUSU9OX0RPTkUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEsIHN0YXRpY19yZWdpc3RyYXRpb25fZG9uZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbGlua19hdXRvX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fbGlua19hdXRvX2NmZ19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdCwgJnByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX2VuY3J5cHRpb25fZW5hYmxlZCwgJnByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX2tleV9leGNoYW5nZV9mYWlsdXJlLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfYXV0b19jZmdfa2V5X2V4Y2hhbmdlX3N0YXJ0ZWQsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19hdXRvX2NmZ19rZXlfZXhjaGFuZ2Vfc3RvcHBlZCwgJnByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX2xpbmtfZGVsZXRlZCwgJnByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX2xpbmtfc3BlZWRfbWlzbWF0Y2gsICZwcm9wX2Rlc2NyX2Vwb25fbGlua19hdXRvX2NmZ19tcGNwX2RlcmVnaXN0ZXJlZCwgJnByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX21wY3BfZGlzY292ZXJlZCwgJnByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX21wY3BfcmVnX2Fja190aW1lb3V0LCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfYXV0b19jZmdfbXBjcF9yZXBvcnRfdGltZW91dCwgJnByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX29hbV9rZWVwYWxpdmVfdGltZW91dCwgJnByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZCwgJnByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZCwgJnByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX3ByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZCwgJnByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfYXV0b19jZmdfcmFuZ2VfdmFsdWVfY2hhbmdlZCwgJnByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX3JlcmFuZ2VfZmFpbHVyZSwgJnByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCwgJnByb3BfZGVzY3JfZXBvbl9saW5rX2F1dG9fY2ZnX3N0YXRfYWxhcm1fcmFpc2VkLCAmcHJvcF9kZXNjcl9lcG9uX2xpbmtfYXV0b19jZmdfc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJkdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3RcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhLCBkdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImVuY3J5cHRpb25fZW5hYmxlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZW5jcnlwdGlvbl9lbmFibGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSwgZW5jcnlwdGlvbl9lbmFibGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlX2ZhaWx1cmUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImtleV9leGNoYW5nZV9mYWlsdXJlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSwga2V5X2V4Y2hhbmdlX2ZhaWx1cmUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJrZXlfZXhjaGFuZ2Vfc3RhcnRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwia2V5X2V4Y2hhbmdlX3N0YXJ0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhLCBrZXlfZXhjaGFuZ2Vfc3RhcnRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImtleV9leGNoYW5nZV9zdG9wcGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJrZXlfZXhjaGFuZ2Vfc3RvcHBlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEsIGtleV9leGNoYW5nZV9zdG9wcGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAibGlua19kZWxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJsaW5rX2RlbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhLCBsaW5rX2RlbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJsaW5rX3NwZWVkX21pc21hdGNoIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJsaW5rX3NwZWVkX21pc21hdGNoXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSwgbGlua19zcGVlZF9taXNtYXRjaCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm1wY3BfZGVyZWdpc3RlcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJtcGNwX2RlcmVnaXN0ZXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEsIG1wY3BfZGVyZWdpc3RlcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAibXBjcF9kaXNjb3ZlcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJtcGNwX2Rpc2NvdmVyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhLCBtcGNwX2Rpc2NvdmVyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJtcGNwX3JlZ19hY2tfdGltZW91dCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibXBjcF9yZWdfYWNrX3RpbWVvdXRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhLCBtcGNwX3JlZ19hY2tfdGltZW91dCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm1wY3BfcmVwb3J0X3RpbWVvdXQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm1wY3BfcmVwb3J0X3RpbWVvdXRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhLCBtcGNwX3JlcG9ydF90aW1lb3V0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAib2FtX2tlZXBhbGl2ZV90aW1lb3V0IiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvYW1fa2VlcGFsaXZlX3RpbWVvdXRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhLCBvYW1fa2VlcGFsaXZlX3RpbWVvdXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJvYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm9hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEsIG9hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm9hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwib2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSwgb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJwcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhLCBwcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJwcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhLCBwcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInJhbmdlX3ZhbHVlX2NoYW5nZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInJhbmdlX3ZhbHVlX2NoYW5nZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhLCByYW5nZV92YWx1ZV9jaGFuZ2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicmVyYW5nZV9mYWlsdXJlIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJyZXJhbmdlX2ZhaWx1cmVcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhLCByZXJhbmdlX2ZhaWx1cmUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fY2xlYXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX3JhaXNlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fcmFpc2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0aWNfcmVnaXN0cmF0aW9uX2RvbmVcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhLCBzdGF0aWNfcmVnaXN0cmF0aW9uX2RvbmUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbGlua19hdXRvX2NmZ19kYXRhIiwgLmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qID09PT0gT2JqZWN0OiBlcG9uX25pID09PT0gKi8KKworLyogR3JvdXA6IGVwb25fbmkgLSBrZXkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2tleV9lcG9uX25pID0geyAubmFtZSA9ICJlcG9uX25pIiwgLmRlc2NyID0gIlRoZSBpbmRleCBvZiBhIHNwZWNpZmljIEVQT04gTkkgaW5zdGFuY2UgYXMgc2VlbiBieSB0aGUgaG9zdC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9LRVlfSURfRVBPTl9OSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2tleSwgZXBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX25pX2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fbmlfa2V5X2Vwb25fbmkgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImVwb25fbmkiLCAuZGVzY3IgPSAiVGhlIGluZGV4IG9mIGEgc3BlY2lmaWMgRVBPTiBOSSBpbnN0YW5jZSBhcyBzZWVuIGJ5IHRoZSBob3N0LiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9rZXksIGVwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9rZXkgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX25pX2tleSIsIC5kZXNjciA9ICJrZXkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9rZXkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9rZXlfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9rZXlfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9uaSAtIGNmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX21hY19hZGRyZXNzID0geyAubmFtZSA9ICJtYWNfYWRkcmVzcyIsIC5kZXNjciA9ICJUaGUgTUFDIGFkZHJlc3MgdXNlZCBmb3IgYWxsIGZyYW1lcyBnZW5lcmF0ZWQgYnkgdGhlIE9MVCBvbiB0aGUgUE9OLiAgVGhpcyB2YWx1ZSBtdXN0IGJlIHNldCBiZWZvcmUgRVBPTl9OSSBpcyBmaXJzdCBlbmFibGVkLCBhbmQgY2Fubm90IGJlIGNoYW5nZWQgd2hpbGUgdGhlIEVQT05fTkkgaXMgZW5hYmxlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTUFDX0FERFJFU1MsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgbWFjX2FkZHJlc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX21hY19hZGRyZXNzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9jZmdfZXBvbl9uaV9lbiA9IHsgLm5hbWUgPSAiZXBvbl9uaV9lbiIsIC5kZXNjciA9ICJJbmRpY2F0ZXMgdGhlIGVuYWJsZSBzdGF0ZSBvZiB0aGUgRVBPTiBOSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9FUE9OX05JX0VOLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEsIGVwb25fbmlfZW4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2VuX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9jZmdfcmVnaXN0cmF0aW9uX2JlaGF2aW9yID0geyAubmFtZSA9ICJyZWdpc3RyYXRpb25fYmVoYXZpb3IiLCAuZGVzY3IgPSAiRGV0ZXJtaW5lcyBob3cgcmVnaXN0cmF0aW9uIHJlcXVlc3RzIGZyb20gdW5rbm93biBsaW5rcyBhcmUgaGFuZGxlZC4gIFNldCB0byAnTm90aWZ5IFVua25vd24nIHRvIGZvcmNlIGFsbCBsaW5rcyB0byBiZSBwcmUtcHJvdmlzaW9uZWQuICBJZiBpbiAnTm90aWZ5IFVua25vd24nIG1vZGUsIE1QQ1AgUmVnaXN0cmF0aW9uIG9mIGFuIHVua25vd24gbGluayB3aWxsIGJlIGRlbmllZCwgYW5kIGEgJ1doaXRlIExpc3QgVmlvbGF0aW9uXCIgd2lsbCBiZSBzZW50IHRvIHRoZSBob3N0LiBJZiBzZXQgdG8gJ0F1dG9tYXRpYycsIHRoZSBsaW5rIHJlZ2lzdGVycyBmdWxseSB3aXRob3V0IGhvc3QgaW50ZXJhY3Rpb24uICIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9SRUdJU1RSQVRJT05fQkVIQVZJT1IsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgcmVnaXN0cmF0aW9uX2JlaGF2aW9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVnaXN0cmF0aW9uX2JlaGF2aW9yIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9jZmdfbXR1XzFnID0geyAubmFtZSA9ICJtdHVfMWciLCAuZGVzY3IgPSAiTWF4aW11bSBmcmFtZSBzaXplIChpbmNsdWRpbmcgRkNTKSBvbiB0aGUgMUcgcGF0aC4gVGhpcyBhdHRyaWJ1dGUgY2Fubm90IGJlIGNoYW5nZWQgb24gYW4gZW5hYmxlZCBFUE9OX05JLiBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgYW4gb2RkIHZhbHVlLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9NVFVfMUcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgbXR1XzFnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX210dV8xMGcgPSB7IC5uYW1lID0gIm10dV8xMGciLCAuZGVzY3IgPSAiTWF4aW11bSBmcmFtZSBzaXplIChpbmNsdWRpbmcgRkNTKSBvbiB0aGUgMTBHIHBhdGguIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBjaGFuZ2VkIG9uIGFuIGVuYWJsZWQgRVBPTl9OSS4gVGhpcyBhdHRyaWJ1dGUgY2Fubm90IGJlIGFuIG9kZCB2YWx1ZS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTVRVXzEwRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBtdHVfMTBnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX21pbmltdW1fZmliZXJfbGVuZ3RoID0geyAubmFtZSA9ICJtaW5pbXVtX2ZpYmVyX2xlbmd0aCIsIC5kZXNjciA9ICJUaGUgbWluaW11bSBmaWJlciBsZW5ndGgsIGluIG1ldGVycywgYXQgd2hpY2ggd2UgZXhwZWN0IHRvIGZpbmQgYW4gT05VLiBOb3RlczogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBmaWJlciBsZW5ndGggY2Fubm90IGV4Y2VlZCAxMDAga20uIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBjaGFuZ2VkIG9uIGFuIGVuYWJsZWQgRVBPTl9OSS4gU29tZSBPTlVzIGNhbiByZWdpc3RlciBhdCBkaXN0YW5jZXMgdGhhdCBhcmUgbGVzcyB0aGFuIHRoZSBwcm92aXNpb25lZCBtaW5pbXVtLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9NSU5JTVVNX0ZJQkVSX0xFTkdUSCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBtaW5pbXVtX2ZpYmVyX2xlbmd0aCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19tYXhpbXVtX2ZpYmVyX2xlbmd0aCA9IHsgLm5hbWUgPSAibWF4aW11bV9maWJlcl9sZW5ndGgiLCAuZGVzY3IgPSAiVGhlIG1heGltdW0gZmliZXIgbGVuZ3RoLCBpbiBtZXRlcnMsIGF0IHdoaWNoIHdlIGV4cGVjdCB0byBmaW5kIGFuIE9OVS4gTm90ZXM6IFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG1pbmltdW0gYW5kIG1heGltdW0gZmliZXIgbGVuZ3RoIGNhbm5vdCBleGNlZWQgMTAwIGttLiBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgY2hhbmdlZCBvbiBhbiBlbmFibGVkIEVQT05fTkkuIFNvbWUgT05VcyBjYW4gcmVnaXN0ZXIgYXQgZGlzdGFuY2VzIHRoYXQgYXJlIGdyZWF0ZXIgdGhhbiB0aGUgcHJvdmlzaW9uZWQgbWF4aW11bS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfTUFYSU1VTV9GSUJFUl9MRU5HVEgsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgbWF4aW11bV9maWJlcl9sZW5ndGgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9jZmdfZ3JhbnRfc3BhY2luZ190cSA9IHsgLm5hbWUgPSAiZ3JhbnRfc3BhY2luZ190cSIsIC5kZXNjciA9ICJUaGUgZGVhZCB0aW1lIG9uIHRoZSBQT04gYmV0d2VlbiB1cHN0cmVhbSBidXJzdHMuICBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgY2hhbmdlZCBvbiBhbiBlbmFibGVkIEVQT05fTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0dSQU5UX1NQQUNJTkdfVFEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgZ3JhbnRfc3BhY2luZ190cSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19lcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zID0geyAubmFtZSA9ICJlcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zIiwgLmRlc2NyID0gIkNvbmZpZ3VyYXRpb24gcmVsYXRlZCB0byBFUE9OIGxpbmtzIHJlZ2lzdHJhdGlvbiBhbmQgcmVwb3J0aW5nLiBUaGlzIHZhbHVlIGNhbm5vdCBiZSBjaGFuZ2VkIG9uIGFuIGVuYWJsZWQgRVBPTl9OSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRVBPTl9MT0dJQ0FMX0xJTktfT1BUSU9OUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBlcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX21wY3BfZGlzY292ZXJ5X3BlcmlvZF9tcyA9IHsgLm5hbWUgPSAibXBjcF9kaXNjb3ZlcnlfcGVyaW9kX21zIiwgLmRlc2NyID0gIlBlcmlvZCBvZiBNUENQIGRpc2NvdmVyeSB3aW5kb3dzLiAgSW4gdGhpcyB0aW1lIHBlcmlvZCwgb25lIGRpc2NvdmVyeSBnYXRlIHdpbGwgYmUgc2VudCBmb3IgZXZlcnkgZW5hYmxlZCBSUC4gIFRoZSBkaXNjb3ZlcnkgZ2F0ZXMgd2lsbCBiZSBzcGFjZWQgZXF1YWxseSBhY3Jvc3MgdGhlIHRpbWUgcGVyaW9kLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9NUENQX0RJU0NPVkVSWV9QRVJJT0RfTVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgbXBjcF9kaXNjb3ZlcnlfcGVyaW9kX21zKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX2FsYXJtX3N0YXRlID0geyAubmFtZSA9ICJhbGFybV9zdGF0ZSIsIC5kZXNjciA9ICJUaGUgc3RhdGUgb2YgdGhlIGFsYXJtcyBvbiB0aGlzIEVQT04gTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQUxBUk1fU1RBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgYWxhcm1fc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2FsYXJtX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9jZmdfYWxsX2xpbmtzID0geyAubmFtZSA9ICJhbGxfbGlua3MiLCAuZGVzY3IgPSAiTGlzdCBvZiBhbGwgbGlua3Mgb24gdGhlIEVQT04gTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQUxMX0xJTktTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEsIGFsbF9saW5rcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfbWF4XzIwNDggfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19lbmNyeXB0aW9uX2NmZyA9IHsgLm5hbWUgPSAiZW5jcnlwdGlvbl9jZmciLCAuZGVzY3IgPSAiRW5jcnlwdGlvbiBjb25maWd1cmF0aW9uIHRoYXQgYXBwbGllcyB0byB0aGUgRVBPTiBOSSBhcyBhIHdob2xlLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9FTkNSWVBUSU9OX0NGRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBlbmNyeXB0aW9uX2NmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfZW5jcnlwdGlvbl9jZmcgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19wcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcgPSB7IC5uYW1lID0gInByb3RlY3Rpb25fc3dpdGNoaW5nX2NmZyIsIC5kZXNjciA9ICJQcm90ZWN0aW9uIHN3aXRjaGluZyBjb25maWd1cmF0aW9uLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19DRkcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19jb25maWd1cmF0aW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9jZmdfY2xvY2tfdHJhbnNwb3J0X2NmZyA9IHsgLm5hbWUgPSAiY2xvY2tfdHJhbnNwb3J0X2NmZyIsIC5kZXNjciA9ICJDbG9jayB0cmFuc3BvcnQgY29uZmlndXJhdGlvbi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQ0xPQ0tfVFJBTlNQT1JUX0NGRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBjbG9ja190cmFuc3BvcnRfY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9jbG9ja190cmFuc3BvcnRfY29uZmlndXJhdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX2Ryb3Bkb3duX3dlaWdodHMgPSB7IC5uYW1lID0gImRyb3Bkb3duX3dlaWdodHMiLCAuZGVzY3IgPSAiRHJvcC1kb3duIFdlaWdodHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRFJPUERPV05fV0VJR0hUUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBkcm9wZG93bl93ZWlnaHRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX3UxNl83IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9jZmdfYXBwcm94aW1hdGVfc29saWNpdGVkX3VzYWdlID0geyAubmFtZSA9ICJhcHByb3hpbWF0ZV9zb2xpY2l0ZWRfdXNhZ2UiLCAuZGVzY3IgPSAiQXBwcm94aW1hdGUgU29saWNpdGVkIFVzYWdlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQVBQUk9YSU1BVEVfU09MSUNJVEVEX1VTQUdFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEsIGFwcHJveGltYXRlX3NvbGljaXRlZF91c2FnZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl9ib3VuZHNfOCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX2FwcHJveGltYXRlX3RkbV91c2FnZSA9IHsgLm5hbWUgPSAiYXBwcm94aW1hdGVfdGRtX3VzYWdlIiwgLmRlc2NyID0gIkFwcHJveGltYXRlIFRETSBVc2FnZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfQ0ZHX0lEX0FQUFJPWElNQVRFX1RETV9VU0FHRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBhcHByb3hpbWF0ZV90ZG1fdXNhZ2UpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9jZmdfbm9fcmVwb3J0c19zb2FrX3RpbWUgPSB7IC5uYW1lID0gIm5vX3JlcG9ydHNfc29ha190aW1lIiwgLmRlc2NyID0gIlBlcmlvZCBvZiB0aW1lIGFmdGVyIGxhc3QgcmVwb3J0IHJlY2VpdmVkIHRvIHNlbmQgbm8gcmVwb3J0cyBhbGFybSAoaW4gbXMpLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9OT19SRVBPUlRTX1NPQUtfVElNRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBub19yZXBvcnRzX3NvYWtfdGltZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19wb25fYWdncmVnYXRlX3NoYXBlciA9IHsgLm5hbWUgPSAicG9uX2FnZ3JlZ2F0ZV9zaGFwZXIiLCAuZGVzY3IgPSAiUE9OIEFnZ3JlZ2F0ZSBTaGFwZXIiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfUE9OX0FHR1JFR0FURV9TSEFQRVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgcG9uX2FnZ3JlZ2F0ZV9zaGFwZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25fYWdncmVnYXRlX3NoYXBlciB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX2VzdGltYXRlZF9wb25fbGF0ZW5jeV90cSA9IHsgLm5hbWUgPSAiZXN0aW1hdGVkX3Bvbl9sYXRlbmN5X3RxIiwgLmRlc2NyID0gIkVzdGltYXRlZCBQT04gTGF0ZW5jeSAoVFEpIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfRVNUSU1BVEVEX1BPTl9MQVRFTkNZX1RRLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEsIGVzdGltYXRlZF9wb25fbGF0ZW5jeV90cSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl9ib3VuZHNfOCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX29udV91cGdyYWRlX3BhcmFtcyA9IHsgLm5hbWUgPSAib251X3VwZ3JhZGVfcGFyYW1zIiwgLmRlc2NyID0gIk9OVSB1cGdyYWRlIHBhcmFtcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9PTlVfVVBHUkFERV9QQVJBTVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgb251X3VwZ3JhZGVfcGFyYW1zKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfdXBncmFkZV9wYXJhbXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19hdXRvX3JvZ3VlX2RldGVjdF8xMGdfZW4gPSB7IC5uYW1lID0gImF1dG9fcm9ndWVfZGV0ZWN0XzEwZ19lbiIsIC5kZXNjciA9ICJFbmFibGUgMTBHIEF1dG9ub21vdXMgUm9ndWUgRGVjdGlvbiBkdXJpbmcgZGlzY292ZXJ5IHdpbmRvdyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX0NGR19JRF9BVVRPX1JPR1VFX0RFVEVDVF8xMEdfRU4sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgYXV0b19yb2d1ZV9kZXRlY3RfMTBnX2VuKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9jZmdfYXV0b19yb2d1ZV9kZXRlY3RfMWdfZW4gPSB7IC5uYW1lID0gImF1dG9fcm9ndWVfZGV0ZWN0XzFnX2VuIiwgLmRlc2NyID0gIkVuYWJsZSAxRyBBdXRvbm9tb3VzIFJvZ3VlIERlY3Rpb24gZHVyaW5nIGRpc2NvdmVyeSB3aW5kb3ciLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQVVUT19ST0dVRV9ERVRFQ1RfMUdfRU4sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgYXV0b19yb2d1ZV9kZXRlY3RfMWdfZW4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19hdXRvX3JvZ3VlX2RldGVjdF8xMGdfdGhyZXNob2xkID0geyAubmFtZSA9ICJhdXRvX3JvZ3VlX2RldGVjdF8xMGdfdGhyZXNob2xkIiwgLmRlc2NyID0gIlNldCB0aHJlc2hvbGQgZm9yIG51bWJlciBvZiBTeW5jUGF0dGVybnMgcmVjZWl2ZWQgd2l0aG91dCBhIEJ1cnN0IERlbGltaXRlciB0byB0cmlnZ2VyIHRoZSBmYXVsdC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9DRkdfSURfQVVUT19ST0dVRV9ERVRFQ1RfMTBHX1RIUkVTSE9MRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBhdXRvX3JvZ3VlX2RldGVjdF8xMGdfdGhyZXNob2xkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9uaV9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19tYWNfYWRkcmVzcywgJnByb3BfZGVzY3JfZXBvbl9uaV9jZmdfZXBvbl9uaV9lbiwgJnByb3BfZGVzY3JfZXBvbl9uaV9jZmdfcmVnaXN0cmF0aW9uX2JlaGF2aW9yLCAmcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19tdHVfMWcsICZwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX210dV8xMGcsICZwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX21pbmltdW1fZmliZXJfbGVuZ3RoLCAmcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19tYXhpbXVtX2ZpYmVyX2xlbmd0aCwgJnByb3BfZGVzY3JfZXBvbl9uaV9jZmdfZ3JhbnRfc3BhY2luZ190cSwgJnByb3BfZGVzY3JfZXBvbl9uaV9jZmdfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucywgJnByb3BfZGVzY3JfZXBvbl9uaV9jZmdfbXBjcF9kaXNjb3ZlcnlfcGVyaW9kX21zLCAmcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19hbGFybV9zdGF0ZSwgJnByb3BfZGVzY3JfZXBvbl9uaV9jZmdfYWxsX2xpbmtzLCAmcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19lbmNyeXB0aW9uX2NmZywgJnByb3BfZGVzY3JfZXBvbl9uaV9jZmdfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnLCAmcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19jbG9ja190cmFuc3BvcnRfY2ZnLCAmcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19kcm9wZG93bl93ZWlnaHRzLCAmcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19hcHByb3hpbWF0ZV9zb2xpY2l0ZWRfdXNhZ2UsICZwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX2FwcHJveGltYXRlX3RkbV91c2FnZSwgJnByb3BfZGVzY3JfZXBvbl9uaV9jZmdfbm9fcmVwb3J0c19zb2FrX3RpbWUsICZwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX3Bvbl9hZ2dyZWdhdGVfc2hhcGVyLCAmcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19lc3RpbWF0ZWRfcG9uX2xhdGVuY3lfdHEsICZwcm9wX2Rlc2NyX2Vwb25fbmlfY2ZnX29udV91cGdyYWRlX3BhcmFtcywgJnByb3BfZGVzY3JfZXBvbl9uaV9jZmdfYXV0b19yb2d1ZV9kZXRlY3RfMTBnX2VuLCAmcHJvcF9kZXNjcl9lcG9uX25pX2NmZ19hdXRvX3JvZ3VlX2RldGVjdF8xZ19lbiwgJnByb3BfZGVzY3JfZXBvbl9uaV9jZmdfYXV0b19yb2d1ZV9kZXRlY3RfMTBnX3RocmVzaG9sZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJtYWNfYWRkcmVzcyIsIC5kZXNjciA9ICJUaGUgTUFDIGFkZHJlc3MgdXNlZCBmb3IgYWxsIGZyYW1lcyBnZW5lcmF0ZWQgYnkgdGhlIE9MVCBvbiB0aGUgUE9OLiAgVGhpcyB2YWx1ZSBtdXN0IGJlIHNldCBiZWZvcmUgRVBPTl9OSSBpcyBmaXJzdCBlbmFibGVkLCBhbmQgY2Fubm90IGJlIGNoYW5nZWQgd2hpbGUgdGhlIEVQT05fTkkgaXMgZW5hYmxlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEsIG1hY19hZGRyZXNzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19tYWNfYWRkcmVzcyB9LCB7IC5uYW1lID0gImVwb25fbmlfZW4iLCAuZGVzY3IgPSAiSW5kaWNhdGVzIHRoZSBlbmFibGUgc3RhdGUgb2YgdGhlIEVQT04gTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBlcG9uX25pX2VuKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9lbl9zdGF0ZSB9LCB7IC5uYW1lID0gInJlZ2lzdHJhdGlvbl9iZWhhdmlvciIsIC5kZXNjciA9ICJEZXRlcm1pbmVzIGhvdyByZWdpc3RyYXRpb24gcmVxdWVzdHMgZnJvbSB1bmtub3duIGxpbmtzIGFyZSBoYW5kbGVkLiAgU2V0IHRvICdOb3RpZnkgVW5rbm93bicgdG8gZm9yY2UgYWxsIGxpbmtzIHRvIGJlIHByZS1wcm92aXNpb25lZC4gIElmIGluICdOb3RpZnkgVW5rbm93bicgbW9kZSwgTVBDUCBSZWdpc3RyYXRpb24gb2YgYW4gdW5rbm93biBsaW5rIHdpbGwgYmUgZGVuaWVkLCBhbmQgYSAnV2hpdGUgTGlzdCBWaW9sYXRpb25cIiB3aWxsIGJlIHNlbnQgdG8gdGhlIGhvc3QuIElmIHNldCB0byAnQXV0b21hdGljJywgdGhlIGxpbmsgcmVnaXN0ZXJzIGZ1bGx5IHdpdGhvdXQgaG9zdCBpbnRlcmFjdGlvbi4gIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCByZWdpc3RyYXRpb25fYmVoYXZpb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZWdpc3RyYXRpb25fYmVoYXZpb3IgfSwgeyAubmFtZSA9ICJtdHVfMWciLCAuZGVzY3IgPSAiTWF4aW11bSBmcmFtZSBzaXplIChpbmNsdWRpbmcgRkNTKSBvbiB0aGUgMUcgcGF0aC4gVGhpcyBhdHRyaWJ1dGUgY2Fubm90IGJlIGNoYW5nZWQgb24gYW4gZW5hYmxlZCBFUE9OX05JLiBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgYW4gb2RkIHZhbHVlLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgbXR1XzFnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gIm10dV8xMGciLCAuZGVzY3IgPSAiTWF4aW11bSBmcmFtZSBzaXplIChpbmNsdWRpbmcgRkNTKSBvbiB0aGUgMTBHIHBhdGguIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBjaGFuZ2VkIG9uIGFuIGVuYWJsZWQgRVBPTl9OSS4gVGhpcyBhdHRyaWJ1dGUgY2Fubm90IGJlIGFuIG9kZCB2YWx1ZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEsIG10dV8xMGcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAibWluaW11bV9maWJlcl9sZW5ndGgiLCAuZGVzY3IgPSAiVGhlIG1pbmltdW0gZmliZXIgbGVuZ3RoLCBpbiBtZXRlcnMsIGF0IHdoaWNoIHdlIGV4cGVjdCB0byBmaW5kIGFuIE9OVS4gTm90ZXM6IFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG1pbmltdW0gYW5kIG1heGltdW0gZmliZXIgbGVuZ3RoIGNhbm5vdCBleGNlZWQgMTAwIGttLiBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgY2hhbmdlZCBvbiBhbiBlbmFibGVkIEVQT05fTkkuIFNvbWUgT05VcyBjYW4gcmVnaXN0ZXIgYXQgZGlzdGFuY2VzIHRoYXQgYXJlIGxlc3MgdGhhbiB0aGUgcHJvdmlzaW9uZWQgbWluaW11bS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEsIG1pbmltdW1fZmliZXJfbGVuZ3RoKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gIm1heGltdW1fZmliZXJfbGVuZ3RoIiwgLmRlc2NyID0gIlRoZSBtYXhpbXVtIGZpYmVyIGxlbmd0aCwgaW4gbWV0ZXJzLCBhdCB3aGljaCB3ZSBleHBlY3QgdG8gZmluZCBhbiBPTlUuIE5vdGVzOiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIGZpYmVyIGxlbmd0aCBjYW5ub3QgZXhjZWVkIDEwMCBrbS4gVGhpcyBhdHRyaWJ1dGUgY2Fubm90IGJlIGNoYW5nZWQgb24gYW4gZW5hYmxlZCBFUE9OX05JLiBTb21lIE9OVXMgY2FuIHJlZ2lzdGVyIGF0IGRpc3RhbmNlcyB0aGF0IGFyZSBncmVhdGVyIHRoYW4gdGhlIHByb3Zpc2lvbmVkIG1heGltdW0uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBtYXhpbXVtX2ZpYmVyX2xlbmd0aCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJncmFudF9zcGFjaW5nX3RxIiwgLmRlc2NyID0gIlRoZSBkZWFkIHRpbWUgb24gdGhlIFBPTiBiZXR3ZWVuIHVwc3RyZWFtIGJ1cnN0cy4gIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBjaGFuZ2VkIG9uIGFuIGVuYWJsZWQgRVBPTl9OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEsIGdyYW50X3NwYWNpbmdfdHEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucyIsIC5kZXNjciA9ICJDb25maWd1cmF0aW9uIHJlbGF0ZWQgdG8gRVBPTiBsaW5rcyByZWdpc3RyYXRpb24gYW5kIHJlcG9ydGluZy4gVGhpcyB2YWx1ZSBjYW5ub3QgYmUgY2hhbmdlZCBvbiBhbiBlbmFibGVkIEVQT05fTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBlcG9uX2xvZ2ljYWxfbGlua19vcHRpb25zKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9sb2dpY2FsX2xpbmtfb3B0aW9ucyB9LCB7IC5uYW1lID0gIm1wY3BfZGlzY292ZXJ5X3BlcmlvZF9tcyIsIC5kZXNjciA9ICJQZXJpb2Qgb2YgTVBDUCBkaXNjb3Zlcnkgd2luZG93cy4gIEluIHRoaXMgdGltZSBwZXJpb2QsIG9uZSBkaXNjb3ZlcnkgZ2F0ZSB3aWxsIGJlIHNlbnQgZm9yIGV2ZXJ5IGVuYWJsZWQgUlAuICBUaGUgZGlzY292ZXJ5IGdhdGVzIHdpbGwgYmUgc3BhY2VkIGVxdWFsbHkgYWNyb3NzIHRoZSB0aW1lIHBlcmlvZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEsIG1wY3BfZGlzY292ZXJ5X3BlcmlvZF9tcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJhbGFybV9zdGF0ZSIsIC5kZXNjciA9ICJUaGUgc3RhdGUgb2YgdGhlIGFsYXJtcyBvbiB0aGlzIEVQT04gTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBhbGFybV9zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfYWxhcm1fc3RhdGUgfSwgeyAubmFtZSA9ICJhbGxfbGlua3MiLCAuZGVzY3IgPSAiTGlzdCBvZiBhbGwgbGlua3Mgb24gdGhlIEVQT04gTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBhbGxfbGlua3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyX21heF8yMDQ4IH0sIHsgLm5hbWUgPSAiZW5jcnlwdGlvbl9jZmciLCAuZGVzY3IgPSAiRW5jcnlwdGlvbiBjb25maWd1cmF0aW9uIHRoYXQgYXBwbGllcyB0byB0aGUgRVBPTiBOSSBhcyBhIHdob2xlLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgZW5jcnlwdGlvbl9jZmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2VuY3J5cHRpb25fY2ZnIH0sIHsgLm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfY2ZnIiwgLmRlc2NyID0gIlByb3RlY3Rpb24gc3dpdGNoaW5nIGNvbmZpZ3VyYXRpb24uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19jZmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2NvbmZpZ3VyYXRpb24gfSwgeyAubmFtZSA9ICJjbG9ja190cmFuc3BvcnRfY2ZnIiwgLmRlc2NyID0gIkNsb2NrIHRyYW5zcG9ydCBjb25maWd1cmF0aW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgY2xvY2tfdHJhbnNwb3J0X2NmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X2NvbmZpZ3VyYXRpb24gfSwgeyAubmFtZSA9ICJkcm9wZG93bl93ZWlnaHRzIiwgLmRlc2NyID0gIkRyb3AtZG93biBXZWlnaHRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBkcm9wZG93bl93ZWlnaHRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX3UxNl83IH0sIHsgLm5hbWUgPSAiYXBwcm94aW1hdGVfc29saWNpdGVkX3VzYWdlIiwgLmRlc2NyID0gIkFwcHJveGltYXRlIFNvbGljaXRlZCBVc2FnZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgYXBwcm94aW1hdGVfc29saWNpdGVkX3VzYWdlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX2JvdW5kc184IH0sIHsgLm5hbWUgPSAiYXBwcm94aW1hdGVfdGRtX3VzYWdlIiwgLmRlc2NyID0gIkFwcHJveGltYXRlIFRETSBVc2FnZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgYXBwcm94aW1hdGVfdGRtX3VzYWdlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gIm5vX3JlcG9ydHNfc29ha190aW1lIiwgLmRlc2NyID0gIlBlcmlvZCBvZiB0aW1lIGFmdGVyIGxhc3QgcmVwb3J0IHJlY2VpdmVkIHRvIHNlbmQgbm8gcmVwb3J0cyBhbGFybSAoaW4gbXMpLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgbm9fcmVwb3J0c19zb2FrX3RpbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAicG9uX2FnZ3JlZ2F0ZV9zaGFwZXIiLCAuZGVzY3IgPSAiUE9OIEFnZ3JlZ2F0ZSBTaGFwZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEsIHBvbl9hZ2dyZWdhdGVfc2hhcGVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX2FnZ3JlZ2F0ZV9zaGFwZXIgfSwgeyAubmFtZSA9ICJlc3RpbWF0ZWRfcG9uX2xhdGVuY3lfdHEiLCAuZGVzY3IgPSAiRXN0aW1hdGVkIFBPTiBMYXRlbmN5IChUUSkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEsIGVzdGltYXRlZF9wb25fbGF0ZW5jeV90cSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl9ib3VuZHNfOCB9LCB7IC5uYW1lID0gIm9udV91cGdyYWRlX3BhcmFtcyIsIC5kZXNjciA9ICJPTlUgdXBncmFkZSBwYXJhbXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEsIG9udV91cGdyYWRlX3BhcmFtcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfcGFyYW1zIH0sIHsgLm5hbWUgPSAiYXV0b19yb2d1ZV9kZXRlY3RfMTBnX2VuIiwgLmRlc2NyID0gIkVuYWJsZSAxMEcgQXV0b25vbW91cyBSb2d1ZSBEZWN0aW9uIGR1cmluZyBkaXNjb3Zlcnkgd2luZG93IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBhdXRvX3JvZ3VlX2RldGVjdF8xMGdfZW4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJhdXRvX3JvZ3VlX2RldGVjdF8xZ19lbiIsIC5kZXNjciA9ICJFbmFibGUgMUcgQXV0b25vbW91cyBSb2d1ZSBEZWN0aW9uIGR1cmluZyBkaXNjb3Zlcnkgd2luZG93IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhLCBhdXRvX3JvZ3VlX2RldGVjdF8xZ19lbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImF1dG9fcm9ndWVfZGV0ZWN0XzEwZ190aHJlc2hvbGQiLCAuZGVzY3IgPSAiU2V0IHRocmVzaG9sZCBmb3IgbnVtYmVyIG9mIFN5bmNQYXR0ZXJucyByZWNlaXZlZCB3aXRob3V0IGEgQnVyc3QgRGVsaW1pdGVyIHRvIHRyaWdnZXIgdGhlIGZhdWx0LiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9jZmdfZGF0YSwgYXV0b19yb2d1ZV9kZXRlY3RfMTBnX3RocmVzaG9sZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX25pX2NmZ19kYXRhIiwgLmRlc2NyID0gImNmZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX25pIC0gc2V0X2Vwb25fbmlfZW5fc3RhdGUgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX25ld19zdGF0ZSA9IHsgLm5hbWUgPSAibmV3X3N0YXRlIiwgLmRlc2NyID0gIk5ldyBFUE9OIE5JIGVuYWJsZSBzdGF0ZS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9TRVRfRVBPTl9OSV9FTl9TVEFURV9JRF9ORVdfU1RBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9kYXRhLCBuZXdfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2VuX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfbmV3X3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibmV3X3N0YXRlIiwgLmRlc2NyID0gIk5ldyBFUE9OIE5JIGVuYWJsZSBzdGF0ZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfZGF0YSwgbmV3X3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9lbl9zdGF0ZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfZGF0YSIsIC5kZXNjciA9ICJTZXQgdGhlIEVQT04gTkkgZW5hYmxlIHN0YXRlLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX3NldF9lcG9uX25pX2VuX3N0YXRlX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGVfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX25pIC0gaXNzdWVfcnNzaV9ncmFudCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9ncmFudGVkX2xpbmsgPSB7IC5uYW1lID0gImdyYW50ZWRfbGluayIsIC5kZXNjciA9ICJMb2dpY2FsIGxpbmsgdG8gZ3JhbnQsIHdoaWNoIHNob3VsZCBlaXRoZXIgYmUgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciB1bmljYXN0IGxpbmsgb2YgaW50ZXJlc3Qgb24gdGhlIFBPTiBvciwgMCBmb3IgaWRsZSBwb3dlciBtZWFzdXJlbWVudC4gMCB3aWxsIHVzZSBhIGxpbmsgdGhhdCB3aWxsIG5vdCByZXN1bHQgaW4gdXBzdHJlYW0gdHJhbnNtaXNzaW9uIGJ5IGFueSBkZXZpY2Ugb24gdGhlIFBPTi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX0dSQU5URURfTElOSywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YSwgZ3JhbnRlZF9saW5rKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19tYWNfYWRkcmVzcyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF90cmlnZ2VyX3dpZHRoID0geyAubmFtZSA9ICJ0cmlnZ2VyX3dpZHRoIiwgLmRlc2NyID0gIlJzc2kgVHJpZ2dlciBXaWR0aCBpbiBucyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX0lTU1VFX1JTU0lfR1JBTlRfSURfVFJJR0dFUl9XSURUSCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YSwgdHJpZ2dlcl93aWR0aCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfdHJpZ2dlcl9kZWxheSA9IHsgLm5hbWUgPSAidHJpZ2dlcl9kZWxheSIsIC5kZXNjciA9ICJSc3NpIFRyaWdnZXIgRGVsYXkgaW4gbnMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX1RSSUdHRVJfREVMQVksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2RhdGEsIHRyaWdnZXJfZGVsYXkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X3NhbXBsZV9wZXJpb2QgPSB7IC5uYW1lID0gInNhbXBsZV9wZXJpb2QiLCAuZGVzY3IgPSAiUnNzaSBTYW1wZSBQZXJpb2QgaW4gdXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9JU1NVRV9SU1NJX0dSQU5UX0lEX1NBTVBMRV9QRVJJT0QsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2RhdGEsIHNhbXBsZV9wZXJpb2QpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2dyYW50ZWRfbGluaywgJnByb3BfZGVzY3JfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X3RyaWdnZXJfd2lkdGgsICZwcm9wX2Rlc2NyX2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF90cmlnZ2VyX2RlbGF5LCAmcHJvcF9kZXNjcl9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfc2FtcGxlX3BlcmlvZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZ3JhbnRlZF9saW5rIiwgLmRlc2NyID0gIkxvZ2ljYWwgbGluayB0byBncmFudCwgd2hpY2ggc2hvdWxkIGVpdGhlciBiZSBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIHVuaWNhc3QgbGluayBvZiBpbnRlcmVzdCBvbiB0aGUgUE9OIG9yLCAwIGZvciBpZGxlIHBvd2VyIG1lYXN1cmVtZW50LiAwIHdpbGwgdXNlIGEgbGluayB0aGF0IHdpbGwgbm90IHJlc3VsdCBpbiB1cHN0cmVhbSB0cmFuc21pc3Npb24gYnkgYW55IGRldmljZSBvbiB0aGUgUE9OLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2RhdGEsIGdyYW50ZWRfbGluayksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfbWFjX2FkZHJlc3MgfSwgeyAubmFtZSA9ICJ0cmlnZ2VyX3dpZHRoIiwgLmRlc2NyID0gIlJzc2kgVHJpZ2dlciBXaWR0aCBpbiBucyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2RhdGEsIHRyaWdnZXJfd2lkdGgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAidHJpZ2dlcl9kZWxheSIsIC5kZXNjciA9ICJSc3NpIFRyaWdnZXIgRGVsYXkgaW4gbnMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9kYXRhLCB0cmlnZ2VyX2RlbGF5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gInNhbXBsZV9wZXJpb2QiLCAuZGVzY3IgPSAiUnNzaSBTYW1wZSBQZXJpb2QgaW4gdXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9kYXRhLCBzYW1wbGVfcGVyaW9kKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2RhdGEiLCAuZGVzY3IgPSAiSXNzdWVzIGFuIFJTU0kgZ3JhbnQgdG8gcmVhZCBSWCBQb3dlciIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX25pIC0gYWRkX2xpbmsgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2FkZF9saW5rX21hY19hZGRyZXNzID0geyAubmFtZSA9ICJtYWNfYWRkcmVzcyIsIC5kZXNjciA9ICJUaGUgTUFDIGFkZHJlc3Mgb2YgdGhlIEVQT04gbGluay4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9BRERfTElOS19JRF9NQUNfQUREUkVTUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2FkZF9saW5rX2RhdGEsIG1hY19hZGRyZXNzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19tYWNfYWRkcmVzcyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfYWRkX2xpbmtfcmF0ZSA9IHsgLm5hbWUgPSAicmF0ZSIsIC5kZXNjciA9ICJSYXRlIG9mIGxpbmsgdG8gcHJlLXByb3Zpc2lvbi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9BRERfTElOS19JRF9SQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfZGF0YSwgcmF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19yYXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9uaV9hZGRfbGlua19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fbmlfYWRkX2xpbmtfbWFjX2FkZHJlc3MsICZwcm9wX2Rlc2NyX2Vwb25fbmlfYWRkX2xpbmtfcmF0ZSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9hZGRfbGlua19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm1hY19hZGRyZXNzIiwgLmRlc2NyID0gIlRoZSBNQUMgYWRkcmVzcyBvZiB0aGUgRVBPTiBsaW5rLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9hZGRfbGlua19kYXRhLCBtYWNfYWRkcmVzcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfbWFjX2FkZHJlc3MgfSwgeyAubmFtZSA9ICJyYXRlIiwgLmRlc2NyID0gIlJhdGUgb2YgbGluayB0byBwcmUtcHJvdmlzaW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9hZGRfbGlua19kYXRhLCByYXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3JhdGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2FkZF9saW5rX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX25pX2FkZF9saW5rX2RhdGEiLCAuZGVzY3IgPSAiUHJlLXByb3Zpc2lvbiBhbiBFUE9OIGxpbmsuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmtfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2FkZF9saW5rX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9hZGRfbGlua19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fbmkgLSBhZGRfbXVsdGljYXN0X2xpbmsgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19tYWNfYWRkcmVzcyA9IHsgLm5hbWUgPSAibWFjX2FkZHJlc3MiLCAuZGVzY3IgPSAiVGhlIE1BQyBhZGRyZXNzIG9mIHRoZSBFUE9OIGxpbmsuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfQUREX01VTFRJQ0FTVF9MSU5LX0lEX01BQ19BRERSRVNTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2RhdGEsIG1hY19hZGRyZXNzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19tYWNfYWRkcmVzcyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX3JhdGUgPSB7IC5uYW1lID0gInJhdGUiLCAuZGVzY3IgPSAiUmF0ZSBvZiBsaW5rIHRvIHByZS1wcm92aXNpb24uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfQUREX01VTFRJQ0FTVF9MSU5LX0lEX1JBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfZGF0YSwgcmF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19yYXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19tYWNfYWRkcmVzcywgJnByb3BfZGVzY3JfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfcmF0ZSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJtYWNfYWRkcmVzcyIsIC5kZXNjciA9ICJUaGUgTUFDIGFkZHJlc3Mgb2YgdGhlIEVQT04gbGluay4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2RhdGEsIG1hY19hZGRyZXNzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19tYWNfYWRkcmVzcyB9LCB7IC5uYW1lID0gInJhdGUiLCAuZGVzY3IgPSAiUmF0ZSBvZiBsaW5rIHRvIHByZS1wcm92aXNpb24uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19kYXRhLCByYXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX3JhdGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfZGF0YSIsIC5kZXNjciA9ICJQcmUtcHJvdmlzaW9uIGFuIEVQT04gbXVsdGljYXN0IGxpbmsuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fbmkgLSBhZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGluayAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfbWFjX2FkZHJlc3MgPSB7IC5uYW1lID0gIm1hY19hZGRyZXNzIiwgLmRlc2NyID0gIlRoZSBNQUMgYWRkcmVzcyBvZiB0aGUgRVBPTiBsaW5rLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX0FERF9QUk9URUNURURfU1RBTkRCWV9MSU5LX0lEX01BQ19BRERSRVNTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfZGF0YSwgbWFjX2FkZHJlc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX21hY19hZGRyZXNzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua193b3JraW5nX2xpbmtfaW5mbyA9IHsgLm5hbWUgPSAid29ya2luZ19saW5rX2luZm8iLCAuZGVzY3IgPSAiTGluayBpbmZvIGZvciB0aGUgYXNzb2NpYXRlZCB3b3JraW5nIGxpbmsuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfQUREX1BST1RFQ1RFRF9TVEFOREJZX0xJTktfSURfV09SS0lOR19MSU5LX0lORk8sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19kYXRhLCB3b3JraW5nX2xpbmtfaW5mbyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19pbmZvIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfbWFjX2FkZHJlc3MsICZwcm9wX2Rlc2NyX2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfd29ya2luZ19saW5rX2luZm8gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJtYWNfYWRkcmVzcyIsIC5kZXNjciA9ICJUaGUgTUFDIGFkZHJlc3Mgb2YgdGhlIEVQT04gbGluay4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfZGF0YSwgbWFjX2FkZHJlc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX21hY19hZGRyZXNzIH0sIHsgLm5hbWUgPSAid29ya2luZ19saW5rX2luZm8iLCAuZGVzY3IgPSAiTGluayBpbmZvIGZvciB0aGUgYXNzb2NpYXRlZCB3b3JraW5nIGxpbmsuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2RhdGEsIHdvcmtpbmdfbGlua19pbmZvKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9saW5rX2luZm8gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2RhdGEiLCAuZGVzY3IgPSAiQWRkcyBhIHByb3RlY3RlZCBzdGFuZGJ5IGxpbmsuICBPbmNlIGl0IGhhcyBiZWVuIGNyZWF0ZWQsIHRoZSBsaW5rIGlzIGNvbnNpZGVyZWQgXCJzdGFuZGJ5XCIgZm9yIHRoZSBwdXBvc2VzIG9mIHByb3RlY3Rpb24gc3dpdGNoaW5nLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGlua19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX25pIC0gbm9fcmVwb3J0cyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfbm9fcmVwb3J0c19hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBTdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9OT19SRVBPUlRTX0lEX0FMQVJNX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHNfZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9uaV9ub19yZXBvcnRzX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9uaV9ub19yZXBvcnRzX2FsYXJtX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gIkFsYXJtIFN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0c19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2RhdGEiLCAuZGVzY3IgPSAiTG9zcyBvZiBhbGwgcmVwb3J0cyBvbiBhbGwgbGlua3Mgb24gdGhlIEVQT04gTkkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9uaSAtIGxsaWRfcXVhcmFudGluZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfbGxpZCA9IHsgLm5hbWUgPSAibGxpZCIsIC5kZXNjciA9ICJMTElEIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfTExJRF9RVUFSQU5USU5FRF9JRF9MTElELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhLCBsbGlkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdF9oZXggfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfbGlua19yYXRlID0geyAubmFtZSA9ICJsaW5rX3JhdGUiLCAuZGVzY3IgPSAiTGluayBSYXRlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfTExJRF9RVUFSQU5USU5FRF9JRF9MSU5LX1JBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2RhdGEsIGxpbmtfcmF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19yYXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2xpbmtfbWFjID0geyAubmFtZSA9ICJsaW5rX21hYyIsIC5kZXNjciA9ICJMaW5rIE1BQyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX0xMSURfUVVBUkFOVElORURfSURfTElOS19NQUMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2RhdGEsIGxpbmtfbWFjKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19tYWNfYWRkcmVzcyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9yYW5nZV92YWx1ZV90cSA9IHsgLm5hbWUgPSAicmFuZ2VfdmFsdWVfdHEiLCAuZGVzY3IgPSAiUmFuZ2UgdmFsdWUgaW4gdGltZSBxdWFudGEiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9MTElEX1FVQVJBTlRJTkVEX0lEX1JBTkdFX1ZBTFVFX1RRLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhLCByYW5nZV92YWx1ZV90cSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX25pX2xsaWRfcXVhcmFudGluZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfbGxpZCwgJnByb3BfZGVzY3JfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2xpbmtfcmF0ZSwgJnByb3BfZGVzY3JfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2xpbmtfbWFjLCAmcHJvcF9kZXNjcl9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfcmFuZ2VfdmFsdWVfdHEgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImxsaWQiLCAuZGVzY3IgPSAiTExJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2RhdGEsIGxsaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90X2hleCB9LCB7IC5uYW1lID0gImxpbmtfcmF0ZSIsIC5kZXNjciA9ICJMaW5rIFJhdGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhLCBsaW5rX3JhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfcmF0ZSB9LCB7IC5uYW1lID0gImxpbmtfbWFjIiwgLmRlc2NyID0gIkxpbmsgTUFDIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfZGF0YSwgbGlua19tYWMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX21hY19hZGRyZXNzIH0sIHsgLm5hbWUgPSAicmFuZ2VfdmFsdWVfdHEiLCAuZGVzY3IgPSAiUmFuZ2UgdmFsdWUgaW4gdGltZSBxdWFudGEiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhLCByYW5nZV92YWx1ZV90cSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9kYXRhIiwgLmRlc2NyID0gIkxMSUQgUXVhcmFudGluZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9uaSAtIHN0YXRlX2NoYW5nZV9jb21wbGV0ZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfbmV3X3N0YXRlID0geyAubmFtZSA9ICJuZXdfc3RhdGUiLCAuZGVzY3IgPSAiTmV3IEVQT04gTkkgZW5hYmxlIHN0YXRlLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX1NUQVRFX0NIQU5HRV9DT01QTEVURURfSURfTkVXX1NUQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhLCBuZXdfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2VuX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX25ld19zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibmV3X3N0YXRlIiwgLmRlc2NyID0gIk5ldyBFUE9OIE5JIGVuYWJsZSBzdGF0ZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhLCBuZXdfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2VuX3N0YXRlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IGFmdGVyIGEgJ3NldF9lcG9uX25pX2VuX3N0YXRlJyBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9uaSAtIHByb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGEgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfcmVyYW5nZV9kZWx0YSA9IHsgLm5hbWUgPSAicmVyYW5nZV9kZWx0YSIsIC5kZXNjciA9ICJSZS1yYW5nZSBkZWx0YSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX0FQUExZX1JFUkFOR0VfREVMVEFfSURfUkVSQU5HRV9ERUxUQSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfZGF0YSwgcmVyYW5nZV9kZWx0YSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfcmVyYW5nZV9kZWx0YSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicmVyYW5nZV9kZWx0YSIsIC5kZXNjciA9ICJSZS1yYW5nZSBkZWx0YSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2RhdGEsIHJlcmFuZ2VfZGVsdGEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfZGF0YSIsIC5kZXNjciA9ICJQcm90ZWN0aW9uIHN3aXRjaGluZyBhcHBseSByZS1yYW5nZSBkZWx0YSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX25pIC0gcmVyYW5nZV9mYWlsdXJlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9uaV9yZXJhbmdlX2ZhaWx1cmVfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogZXBvbl9uaSAtIHJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9zdGF0dXMgPSB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2xsaWQgPSB7IC5uYW1lID0gImxsaWQiLCAuZGVzY3IgPSAiTExJRCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX0xMSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhLCBsbGlkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdF9oZXggfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2xpbmtfbWFjID0geyAubmFtZSA9ICJsaW5rX21hYyIsIC5kZXNjciA9ICJMaW5rIE1BQyAiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9MSU5LX01BQywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEsIGxpbmtfbWFjKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19tYWNfYWRkcmVzcyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX3N0YXR1cywgJnByb3BfZGVzY3JfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9sbGlkLCAmcHJvcF9kZXNjcl9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2xpbmtfbWFjIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gInN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfSwgeyAubmFtZSA9ICJsbGlkIiwgLmRlc2NyID0gIkxMSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSwgbGxpZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3RfaGV4IH0sIHsgLm5hbWUgPSAibGlua19tYWMiLCAuZGVzY3IgPSAiTGluayBNQUMgIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEsIGxpbmtfbWFjKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19tYWNfYWRkcmVzcyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJSU1NJIE1lYXN1cmVtZW50IENvbXBsZXRlZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX25pIC0gcm9ndWVfbGxpZF9zY2FuICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW5fbW9kZSA9IHsgLm5hbWUgPSAibW9kZSIsIC5kZXNjciA9ICJUcnVlID0gU2NhbiBhbGwgTExJRFMgb24gdGhlIFBPTiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX1JPR1VFX0xMSURfU0NBTl9JRF9NT0RFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2RhdGEsIG1vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9sbGlkID0geyAubmFtZSA9ICJsbGlkIiwgLmRlc2NyID0gIlNwZWNpZmljIExMSUQgdG8gc2NhbiBvciAwIHRvIHNjYW4gYWxsIHdoZW4gbW9kZSBpcyBBTEwiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9ST0dVRV9MTElEX1NDQU5fSURfTExJRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9kYXRhLCBsbGlkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdF9oZXggfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX21vZGUsICZwcm9wX2Rlc2NyX2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2xsaWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibW9kZSIsIC5kZXNjciA9ICJUcnVlID0gU2NhbiBhbGwgTExJRFMgb24gdGhlIFBPTiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW5fZGF0YSwgbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImxsaWQiLCAuZGVzY3IgPSAiU3BlY2lmaWMgTExJRCB0byBzY2FuIG9yIDAgdG8gc2NhbiBhbGwgd2hlbiBtb2RlIGlzIEFMTCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW5fZGF0YSwgbGxpZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3RfaGV4IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW5fZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2RhdGEiLCAuZGVzY3IgPSAiSXNzdWUgYSByZXF1ZXN0IHRvIHNjYW4gYWxsIExMSURzIG9yIGEgc3BlY2lmaWMgTExJRCBvbiBhIFBPTiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW5fZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX25pIC0gc3RhcnRfb251X3VwZ3JhZGUgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2xpc3Rfb2Zfb251X2lkcyA9IHsgLm5hbWUgPSAibGlzdF9vZl9vbnVfaWRzIiwgLmRlc2NyID0gIkxpc3Qgb2YgT05VcyB0byB1cGdyYWRlIHRoZSBmaXJtd2FyZS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9TVEFSVF9PTlVfVVBHUkFERV9JRF9MSVNUX09GX09OVV9JRFMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhLCBsaXN0X29mX29udV9pZHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9tYWNhZGRyZXNzX2xpc3RfdTMyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfbGlzdF9vZl9vbnVfaWRzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibGlzdF9vZl9vbnVfaWRzIiwgLmRlc2NyID0gIkxpc3Qgb2YgT05VcyB0byB1cGdyYWRlIHRoZSBmaXJtd2FyZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSwgbGlzdF9vZl9vbnVfaWRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSIsIC5kZXNjciA9ICJTdGFydCBPTlUgRmlybXdhcmUgVXBncmFkZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX25pIC0gb251X3VwZ3JhZGVfY29tcGxldGUgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX3N0YXR1cyA9IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gIlN1Y2Nlc3Mgb3IgZmFpbHVyZS4gIEFnYWluc3QgZW50aXJlIHVwZ3JhZGUgcHJvY2Vzcy4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9PTlVfVVBHUkFERV9DT01QTEVURV9JRF9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2xpc3Rfb2ZfZmFpbGVkX2VudGl0aWVzID0geyAubmFtZSA9ICJsaXN0X29mX2ZhaWxlZF9lbnRpdGllcyIsIC5kZXNjciA9ICJMaXN0IG9mIE9OVS1JRHMgdGhlIHVwZ3JhZGUgZmFpbGVkIGZvci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9PTlVfVVBHUkFERV9DT01QTEVURV9JRF9MSVNUX09GX0ZBSUxFRF9FTlRJVElFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEsIGxpc3Rfb2ZfZmFpbGVkX2VudGl0aWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzIgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9zdGF0dXMsICZwcm9wX2Rlc2NyX2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfbGlzdF9vZl9mYWlsZWRfZW50aXRpZXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0dXMiLCAuZGVzY3IgPSAiU3VjY2VzcyBvciBmYWlsdXJlLiAgQWdhaW5zdCBlbnRpcmUgdXBncmFkZSBwcm9jZXNzLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJsaXN0X29mX2ZhaWxlZF9lbnRpdGllcyIsIC5kZXNjciA9ICJMaXN0IG9mIE9OVS1JRHMgdGhlIHVwZ3JhZGUgZmFpbGVkIGZvci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSwgbGlzdF9vZl9mYWlsZWRfZW50aXRpZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSIsIC5kZXNjciA9ICJPTlUgVXBncmFkZSBDb21wbGV0ZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX25pIC0gcm9ndWVfc2Nhbl9jb21wbGV0ZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9yZXR1cm5faW5kX3N0YXR1cyA9IHsgLm5hbWUgPSAicmV0dXJuX2luZF9zdGF0dXMiLCAuZGVzY3IgPSAiU3RhdHVzIG9mIGNvbXBsZXRlZCBzY2FuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfUk9HVUVfU0NBTl9DT01QTEVURV9JRF9SRVRVUk5fSU5EX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfZGF0YSwgcmV0dXJuX2luZF9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9zY2FuX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9yZXR1cm5faW5kX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicmV0dXJuX2luZF9zdGF0dXMiLCAuZGVzY3IgPSAiU3RhdHVzIG9mIGNvbXBsZXRlZCBzY2FuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfZGF0YSwgcmV0dXJuX2luZF9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9zY2FuX3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX2RhdGEiLCAuZGVzY3IgPSAiSW5kY2lhdGlvbiB0aGF0IGEgc2NhbiBpcyBjb21wbGV0ZSwgYW55IGVycm9yIGlzIGFsc28gcmV0dXJuZWQuICIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX25pIC0gbXBjcF90aW1lc3RhbXBfY2hhbmdlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9tcGNwX3RpbWVzdGFtcCA9IHsgLm5hbWUgPSAibXBjcF90aW1lc3RhbXAiLCAuZGVzY3IgPSAiVGhlIE1QQ1AgdGltZSBhdCB3aGljaCB0aGUgcHVsc2Ugd2FzIHJlY2VpdmVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX01QQ1BfVElNRVNUQU1QX0NIQU5HRURfSURfTVBDUF9USU1FU1RBTVAsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGEsIG1wY3BfdGltZXN0YW1wKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9tcGNwX3RpbWVzdGFtcCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibXBjcF90aW1lc3RhbXAiLCAuZGVzY3IgPSAiVGhlIE1QQ1AgdGltZSBhdCB3aGljaCB0aGUgcHVsc2Ugd2FzIHJlY2VpdmVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGEsIG1wY3BfdGltZXN0YW1wKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGEiLCAuZGVzY3IgPSAiQSBjbG9jayB0cmFuc3BvcnQgcHVsc2Ugd2FzIHJlY2VpdmVkIGF0IHRoZSBnaXZlbiBNUENQIHRpbWVzdGFtcC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9uaSAtIGF1dG9fcm9ndWVfc2Nhbl8xZ19mYWlsdXJlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZV9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiBlcG9uX25pIC0gYXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmVfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogZXBvbl9uaSAtIGF1dG9fY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9hdXRvX2NmZ19hdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmUgPSB7IC5uYW1lID0gImF1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiYXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfQVVUT19ST0dVRV9TQ0FOXzEwR19GQUlMVVJFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YSwgYXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9hdXRvX2NmZ19hdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZSA9IHsgLm5hbWUgPSAiYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImF1dG9fcm9ndWVfc2Nhbl8xZ19mYWlsdXJlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfQVVUT19ST0dVRV9TQ0FOXzFHX0ZBSUxVUkUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhLCBhdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfYXV0b19jZmdfbGxpZF9xdWFyYW50aW5lZCA9IHsgLm5hbWUgPSAibGxpZF9xdWFyYW50aW5lZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibGxpZF9xdWFyYW50aW5lZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX0xMSURfUVVBUkFOVElORUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhLCBsbGlkX3F1YXJhbnRpbmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9uaV9hdXRvX2NmZ19tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkID0geyAubmFtZSA9ICJtcGNwX3RpbWVzdGFtcF9jaGFuZ2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJtcGNwX3RpbWVzdGFtcF9jaGFuZ2VkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfTVBDUF9USU1FU1RBTVBfQ0hBTkdFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2RhdGEsIG1wY3BfdGltZXN0YW1wX2NoYW5nZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2F1dG9fY2ZnX25vX3JlcG9ydHMgPSB7IC5uYW1lID0gIm5vX3JlcG9ydHMiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm5vX3JlcG9ydHNcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9OT19SRVBPUlRTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YSwgbm9fcmVwb3J0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfYXV0b19jZmdfb251X3VwZ3JhZGVfY29tcGxldGUgPSB7IC5uYW1lID0gIm9udV91cGdyYWRlX2NvbXBsZXRlIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvbnVfdXBncmFkZV9jb21wbGV0ZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX09OVV9VUEdSQURFX0NPTVBMRVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YSwgb251X3VwZ3JhZGVfY29tcGxldGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2F1dG9fY2ZnX3JlcmFuZ2VfZmFpbHVyZSA9IHsgLm5hbWUgPSAicmVyYW5nZV9mYWlsdXJlIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJyZXJhbmdlX2ZhaWx1cmVcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9SRVJBTkdFX0ZBSUxVUkUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhLCByZXJhbmdlX2ZhaWx1cmUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2F1dG9fY2ZnX3JvZ3VlX3NjYW5fY29tcGxldGUgPSB7IC5uYW1lID0gInJvZ3VlX3NjYW5fY29tcGxldGUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInJvZ3VlX3NjYW5fY29tcGxldGVcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9ST0dVRV9TQ0FOX0NPTVBMRVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YSwgcm9ndWVfc2Nhbl9jb21wbGV0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fbmlfYXV0b19jZmdfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQgPSB7IC5uYW1lID0gInJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJyc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX05JX0FVVE9fQ0ZHX0lEX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YSwgcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX25pX2F1dG9fY2ZnX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWQgPSB7IC5uYW1lID0gInN0YXRlX2NoYW5nZV9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRlX2NoYW5nZV9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9OSV9BVVRPX0NGR19JRF9TVEFURV9DSEFOR0VfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YSwgc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fbmlfYXV0b19jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX25pX2F1dG9fY2ZnX2F1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZSwgJnByb3BfZGVzY3JfZXBvbl9uaV9hdXRvX2NmZ19hdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZSwgJnByb3BfZGVzY3JfZXBvbl9uaV9hdXRvX2NmZ19sbGlkX3F1YXJhbnRpbmVkLCAmcHJvcF9kZXNjcl9lcG9uX25pX2F1dG9fY2ZnX21wY3BfdGltZXN0YW1wX2NoYW5nZWQsICZwcm9wX2Rlc2NyX2Vwb25fbmlfYXV0b19jZmdfbm9fcmVwb3J0cywgJnByb3BfZGVzY3JfZXBvbl9uaV9hdXRvX2NmZ19vbnVfdXBncmFkZV9jb21wbGV0ZSwgJnByb3BfZGVzY3JfZXBvbl9uaV9hdXRvX2NmZ19yZXJhbmdlX2ZhaWx1cmUsICZwcm9wX2Rlc2NyX2Vwb25fbmlfYXV0b19jZmdfcm9ndWVfc2Nhbl9jb21wbGV0ZSwgJnByb3BfZGVzY3JfZXBvbl9uaV9hdXRvX2NmZ19yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfZXBvbl9uaV9hdXRvX2NmZ19zdGF0ZV9jaGFuZ2VfY29tcGxldGVkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJhdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmVcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YSwgYXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImF1dG9fcm9ndWVfc2Nhbl8xZ19mYWlsdXJlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2RhdGEsIGF1dG9fcm9ndWVfc2Nhbl8xZ19mYWlsdXJlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAibGxpZF9xdWFyYW50aW5lZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibGxpZF9xdWFyYW50aW5lZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhLCBsbGlkX3F1YXJhbnRpbmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAibXBjcF90aW1lc3RhbXBfY2hhbmdlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibXBjcF90aW1lc3RhbXBfY2hhbmdlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhLCBtcGNwX3RpbWVzdGFtcF9jaGFuZ2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAibm9fcmVwb3J0cyIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibm9fcmVwb3J0c1wiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhLCBub19yZXBvcnRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAib251X3VwZ3JhZGVfY29tcGxldGUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm9udV91cGdyYWRlX2NvbXBsZXRlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2RhdGEsIG9udV91cGdyYWRlX2NvbXBsZXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicmVyYW5nZV9mYWlsdXJlIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJyZXJhbmdlX2ZhaWx1cmVcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YSwgcmVyYW5nZV9mYWlsdXJlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicm9ndWVfc2Nhbl9jb21wbGV0ZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicm9ndWVfc2Nhbl9jb21wbGV0ZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhLCByb2d1ZV9zY2FuX2NvbXBsZXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2RhdGEsIHJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic3RhdGVfY2hhbmdlX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdGVfY2hhbmdlX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhLCBzdGF0ZV9jaGFuZ2VfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhIiwgLmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2F1dG9fY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbmlfYXV0b19jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qID09PT0gT2JqZWN0OiBlcG9uX29udV8xMGdfdXMgPT09PSAqLworCisvKiBHcm91cDogZXBvbl9vbnVfMTBnX3VzIC0ga2V5ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9vbnVfMTBnX3VzX2tleV9lcG9uX25pID0geyAubmFtZSA9ICJlcG9uX25pIiwgLmRlc2NyID0gIkVQT04gTkkgd2l0aCB3aGljaCB0aGlzIE9OVSBpbnRlcmZhY2UgaXMgYXNzb2NpYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0tFWV9JRF9FUE9OX05JLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXksIGVwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9vbnVfMTBnX3VzX2tleV9vbnVfaWQgPSB7IC5uYW1lID0gIm9udV9pZCIsIC5kZXNjciA9ICJVbmlxdWUgaWRlbnRpZmllciBvZiB0aGUgT05VIGludGVyZmFjZSB3aXRoaW4gaXRzIEVQT04gTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fT05VXzEwR19VU19LRVlfSURfT05VX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXksIG9udV9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fb251XzEwZ191c19rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX29udV8xMGdfdXNfa2V5X2Vwb25fbmksICZwcm9wX2Rlc2NyX2Vwb25fb251XzEwZ191c19rZXlfb251X2lkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImVwb25fbmkiLCAuZGVzY3IgPSAiRVBPTiBOSSB3aXRoIHdoaWNoIHRoaXMgT05VIGludGVyZmFjZSBpcyBhc3NvY2lhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleSwgZXBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJvbnVfaWQiLCAuZGVzY3IgPSAiVW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIE9OVSBpbnRlcmZhY2Ugd2l0aGluIGl0cyBFUE9OIE5JLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleSwgb251X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkiLCAuZGVzY3IgPSAia2V5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5X2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fb251XzEwZ191cyAtIHN0YXQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX29udV8xMGdfdXNfc3RhdF9mZWNfY29kZV93b3Jkc190b3RhbCA9IHsgLm5hbWUgPSAiZmVjX2NvZGVfd29yZHNfdG90YWwiLCAuZGVzY3IgPSAiRkVDIHN0YXRzIGNvZGUgd29yZHMgdG90YWwiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfRkVDX0NPREVfV09SRFNfVE9UQUwsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZGF0YSwgZmVjX2NvZGVfd29yZHNfdG90YWwpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZmVjX2NvZGVfd29yZHNfZGVjb2RlX2ZhaWxzID0geyAubmFtZSA9ICJmZWNfY29kZV93b3Jkc19kZWNvZGVfZmFpbHMiLCAuZGVzY3IgPSAiRkVDIHN0YXRzIGNvZGUgd29yZHMgZGVjb2RlIGZhaWxzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0lEX0ZFQ19DT0RFX1dPUkRTX0RFQ09ERV9GQUlMUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9kYXRhLCBmZWNfY29kZV93b3Jkc19kZWNvZGVfZmFpbHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZmVjX3plcm9lc19jb3JyZWN0ZWQgPSB7IC5uYW1lID0gImZlY196ZXJvZXNfY29ycmVjdGVkIiwgLmRlc2NyID0gIkZFQyBzdGF0cyB6ZXJvcyBjb3JyZWN0ZWQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfRkVDX1pFUk9FU19DT1JSRUNURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZGF0YSwgZmVjX3plcm9lc19jb3JyZWN0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZmVjX29uZXNfY29ycmVjdGVkID0geyAubmFtZSA9ICJmZWNfb25lc19jb3JyZWN0ZWQiLCAuZGVzY3IgPSAiRkVDIHN0YXRzIG9uZXMgY29yZWN0ZWQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX1NUQVRfSURfRkVDX09ORVNfQ09SUkVDVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2RhdGEsIGZlY19vbmVzX2NvcnJlY3RlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX29udV8xMGdfdXNfc3RhdF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fb251XzEwZ191c19zdGF0X2ZlY19jb2RlX3dvcmRzX3RvdGFsLCAmcHJvcF9kZXNjcl9lcG9uX29udV8xMGdfdXNfc3RhdF9mZWNfY29kZV93b3Jkc19kZWNvZGVfZmFpbHMsICZwcm9wX2Rlc2NyX2Vwb25fb251XzEwZ191c19zdGF0X2ZlY196ZXJvZXNfY29ycmVjdGVkLCAmcHJvcF9kZXNjcl9lcG9uX29udV8xMGdfdXNfc3RhdF9mZWNfb25lc19jb3JyZWN0ZWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZmVjX2NvZGVfd29yZHNfdG90YWwiLCAuZGVzY3IgPSAiRkVDIHN0YXRzIGNvZGUgd29yZHMgdG90YWwiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2RhdGEsIGZlY19jb2RlX3dvcmRzX3RvdGFsKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZlY19jb2RlX3dvcmRzX2RlY29kZV9mYWlscyIsIC5kZXNjciA9ICJGRUMgc3RhdHMgY29kZSB3b3JkcyBkZWNvZGUgZmFpbHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2RhdGEsIGZlY19jb2RlX3dvcmRzX2RlY29kZV9mYWlscyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmZWNfemVyb2VzX2NvcnJlY3RlZCIsIC5kZXNjciA9ICJGRUMgc3RhdHMgemVyb3MgY29ycmVjdGVkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9kYXRhLCBmZWNfemVyb2VzX2NvcnJlY3RlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmZWNfb25lc19jb3JyZWN0ZWQiLCAuZGVzY3IgPSAiRkVDIHN0YXRzIG9uZXMgY29yZWN0ZWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2RhdGEsIGZlY19vbmVzX2NvcnJlY3RlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZGF0YSIsIC5kZXNjciA9ICJzdGF0IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fb251XzEwZ191cyAtIGNmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fb251XzEwZ191c19jZmdfYWxsX2xpbmtzID0geyAubmFtZSA9ICJhbGxfbGlua3MiLCAuZGVzY3IgPSAiTGlzdCBvZiBNQUMgQWRkcmVzc2VzIGZvciBhbGwgbGlua3Mgb24gdGhlIE9OVSBJZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfQ0ZHX0lEX0FMTF9MSU5LUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2RhdGEsIGFsbF9saW5rcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzJfbWF4XzIwNDggfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX29udV8xMGdfdXNfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9vbnVfMTBnX3VzX2NmZ19hbGxfbGlua3MgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGxfbGlua3MiLCAuZGVzY3IgPSAiTGlzdCBvZiBNQUMgQWRkcmVzc2VzIGZvciBhbGwgbGlua3Mgb24gdGhlIE9OVSBJZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfZGF0YSwgYWxsX2xpbmtzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMl9tYXhfMjA0OCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfZGF0YSIsIC5kZXNjciA9ICJjZmciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9vbnVfMTBnX3VzIC0gc3RhdF9jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmdfY2ZnID0geyAubmFtZSA9ICJjZmciLCAuZGVzY3IgPSAiU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0NGR19JRF9DRkcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2NmZyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmdfZGF0YSIsIC5kZXNjciA9ICJTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX29udV8xMGdfdXMgLSBzdGF0X2FsYXJtX3JhaXNlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9zdGF0ID0geyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX09OVV8xMEdfVVNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX3N0YXQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2lkIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX29udV8xMGdfdXMgLSBzdGF0X2FsYXJtX2NsZWFyZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fT05VXzEwR19VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9pZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX3N0YXQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfaWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fb251XzEwZ191cyAtIGF1dG9fY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCA9IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9jbGVhcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX3N0YXRfYWxhcm1fcmFpc2VkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX3JhaXNlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fb251XzEwZ191c19hdXRvX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19zdGF0X2FsYXJtX2NsZWFyZWQsICZwcm9wX2Rlc2NyX2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19zdGF0X2FsYXJtX3JhaXNlZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX2NsZWFyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX3JhaXNlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2F1dG9fY2ZnX2RhdGEiLCAuZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogPT09PSBPYmplY3Q6IGVwb25fb251XzFnX3VzID09PT0gKi8KKworLyogR3JvdXA6IGVwb25fb251XzFnX3VzIC0ga2V5ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfa2V5X2Vwb25fbmkgPSB7IC5uYW1lID0gImVwb25fbmkiLCAuZGVzY3IgPSAiRVBPTiBOSSB3aXRoIHdoaWNoIHRoaXMgT05VIGludGVyZmFjZSBpcyBhc3NvY2lhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX09OVV8xR19VU19LRVlfSURfRVBPTl9OSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19rZXksIGVwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfa2V5X29udV9pZCA9IHsgLm5hbWUgPSAib251X2lkIiwgLmRlc2NyID0gIlVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBPTlUgaW50ZXJmYWNlIHdpdGhpbiBpdHMgRVBPTiBOSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfS0VZX0lEX09OVV9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19rZXksIG9udV9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fb251XzFnX3VzX2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fb251XzFnX3VzX2tleV9lcG9uX25pLCAmcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19rZXlfb251X2lkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xZ191c19rZXlfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZXBvbl9uaSIsIC5kZXNjciA9ICJFUE9OIE5JIHdpdGggd2hpY2ggdGhpcyBPTlUgaW50ZXJmYWNlIGlzIGFzc29jaWF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19rZXksIGVwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAib251X2lkIiwgLmRlc2NyID0gIlVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBPTlUgaW50ZXJmYWNlIHdpdGhpbiBpdHMgRVBPTiBOSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSwgb251X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5IiwgLmRlc2NyID0gImtleSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xZ191c19rZXkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX29udV8xZ191cyAtIHN0YXQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19zdGF0X2dvb2RfZnJhbWVzID0geyAubmFtZSA9ICJnb29kX2ZyYW1lcyIsIC5kZXNjciA9ICJHb29kIEZyYW1lIENvdW50LCBpbmNsdWRpbmcgbm9uRkVDIGFuZCBGRUMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9HT09EX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGEsIGdvb2RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fb251XzFnX3VzX3N0YXRfZ29vZF9ieXRlcyA9IHsgLm5hbWUgPSAiZ29vZF9ieXRlcyIsIC5kZXNjciA9ICJHb29kIEJ5dGUgQ291bnQsIGluY2x1ZGluZyBub25GRUMgYW5kIEZFQyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0dPT0RfQllURVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhLCBnb29kX2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fb251XzFnX3VzX3N0YXRfb3ZlcnN6X2ZyYW1lcyA9IHsgLm5hbWUgPSAib3ZlcnN6X2ZyYW1lcyIsIC5kZXNjciA9ICJPdmVyc2l6ZWQgZnJhbWUgY291bnQgKGZyYW1lcyBsYXJnZXIgdGhhbiAyMDAwIGJ5dGVzKSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX09WRVJTWl9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhLCBvdmVyc3pfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fb251XzFnX3VzX3N0YXRfbm9uX2ZlY19nb29kX2ZyYW1lcyA9IHsgLm5hbWUgPSAibm9uX2ZlY19nb29kX2ZyYW1lcyIsIC5kZXNjciA9ICJOb24gRkVDIEdvb2QgRnJhbWUgQ291bnQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9OT05fRkVDX0dPT0RfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSwgbm9uX2ZlY19nb29kX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19zdGF0X25vbl9mZWNfZ29vZF9ieXRlcyA9IHsgLm5hbWUgPSAibm9uX2ZlY19nb29kX2J5dGVzIiwgLmRlc2NyID0gIk5vbiBGRUMgR29vZCBCeXRlIENvdW50IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfTk9OX0ZFQ19HT09EX0JZVEVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSwgbm9uX2ZlY19nb29kX2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fb251XzFnX3VzX3N0YXRfZmVjX2dvb2RfZnJhbWVzID0geyAubmFtZSA9ICJmZWNfZ29vZF9mcmFtZXMiLCAuZGVzY3IgPSAiRkVDIEdvb2QgRnJhbWUgQ291bnQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfR09PRF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhLCBmZWNfZ29vZF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfc3RhdF9mZWNfZ29vZF9ieXRlcyA9IHsgLm5hbWUgPSAiZmVjX2dvb2RfYnl0ZXMiLCAuZGVzY3IgPSAiRkVDIEdvb2QgQnl0ZSBDb3VudCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19HT09EX0JZVEVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSwgZmVjX2dvb2RfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfc3RhdF9mZWNfZnJhbWVzX2V4Y19lcnJzID0geyAubmFtZSA9ICJmZWNfZnJhbWVzX2V4Y19lcnJzIiwgLmRlc2NyID0gIkZFQyBGcmFtZXMgd2hpY2ggZXhjZWVkZWQgOCBzeW1ib2wgZXJyb3JzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0ZSQU1FU19FWENfRVJSUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGEsIGZlY19mcmFtZXNfZXhjX2VycnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfc3RhdF9mZWNfYmxrc19ub19lcnJzID0geyAubmFtZSA9ICJmZWNfYmxrc19ub19lcnJzIiwgLmRlc2NyID0gIkZFQyBCbG9ja3Mgd2l0aCBubyBlcnJvcnMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQkxLU19OT19FUlJTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSwgZmVjX2Jsa3Nfbm9fZXJycyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19zdGF0X2ZlY19ibGtzX2NvcnJfZXJycyA9IHsgLm5hbWUgPSAiZmVjX2Jsa3NfY29ycl9lcnJzIiwgLmRlc2NyID0gIkZFQyBCbG9ja3Mgd2l0aCBjb3JyZWN0YWJsZSBlcnJvcnMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQkxLU19DT1JSX0VSUlMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhLCBmZWNfYmxrc19jb3JyX2VycnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfc3RhdF9mZWNfYmxrc191bmNvcnJfZXJycyA9IHsgLm5hbWUgPSAiZmVjX2Jsa3NfdW5jb3JyX2VycnMiLCAuZGVzY3IgPSAiRkVDIEJsb2NrcyB3aXRoIHVuY29ycmVjdGFibGUgZXJyb3JzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfRkVDX0JMS1NfVU5DT1JSX0VSUlMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhLCBmZWNfYmxrc191bmNvcnJfZXJycyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19zdGF0X2ZlY19jb3JyX2J5dGVzID0geyAubmFtZSA9ICJmZWNfY29ycl9ieXRlcyIsIC5kZXNjciA9ICJGRUMgQ29ycmVjdGVkIEJ5dGVzL1N5bWJvbHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQ09SUl9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGEsIGZlY19jb3JyX2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fb251XzFnX3VzX3N0YXRfZmVjX2NvcnJfemVyb2VzID0geyAubmFtZSA9ICJmZWNfY29ycl96ZXJvZXMiLCAuZGVzY3IgPSAiRkVDIENvcnJlY3RlZCBaZXJvZXMsIDhiIGRvbWFpbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0ZFQ19DT1JSX1pFUk9FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGEsIGZlY19jb3JyX3plcm9lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19zdGF0X2ZlY19jb3JyX29uZXMgPSB7IC5uYW1lID0gImZlY19jb3JyX29uZXMiLCAuZGVzY3IgPSAiRkVDIENvcnJlY3RlZCBPbmVzLCA4YiBkb21haW4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9JRF9GRUNfQ09SUl9PTkVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSwgZmVjX2NvcnJfb25lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19zdGF0X3VuZGVyc3pfZnJhbWVzID0geyAubmFtZSA9ICJ1bmRlcnN6X2ZyYW1lcyIsIC5kZXNjciA9ICJVbmRlcnNpemUgZnJhbWUgY291bnQgKGZyYW1lcyBsZXNzIHRoYW4gNjQgYnl0ZXMpIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfSURfVU5ERVJTWl9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhLCB1bmRlcnN6X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19zdGF0X2Vycm9yc3pfZnJhbWVzID0geyAubmFtZSA9ICJlcnJvcnN6X2ZyYW1lcyIsIC5kZXNjciA9ICJFcnJvcmVkIGZyYW1lICIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX09OVV8xR19VU19TVEFUX0lEX0VSUk9SU1pfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSwgZXJyb3Jzel9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9vbnVfMWdfdXNfc3RhdF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fb251XzFnX3VzX3N0YXRfZ29vZF9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fb251XzFnX3VzX3N0YXRfZ29vZF9ieXRlcywgJnByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfc3RhdF9vdmVyc3pfZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19zdGF0X25vbl9mZWNfZ29vZF9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fb251XzFnX3VzX3N0YXRfbm9uX2ZlY19nb29kX2J5dGVzLCAmcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19zdGF0X2ZlY19nb29kX2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfc3RhdF9mZWNfZ29vZF9ieXRlcywgJnByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfc3RhdF9mZWNfZnJhbWVzX2V4Y19lcnJzLCAmcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19zdGF0X2ZlY19ibGtzX25vX2VycnMsICZwcm9wX2Rlc2NyX2Vwb25fb251XzFnX3VzX3N0YXRfZmVjX2Jsa3NfY29ycl9lcnJzLCAmcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19zdGF0X2ZlY19ibGtzX3VuY29ycl9lcnJzLCAmcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19zdGF0X2ZlY19jb3JyX2J5dGVzLCAmcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19zdGF0X2ZlY19jb3JyX3plcm9lcywgJnByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfc3RhdF9mZWNfY29ycl9vbmVzLCAmcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19zdGF0X3VuZGVyc3pfZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19zdGF0X2Vycm9yc3pfZnJhbWVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZ29vZF9mcmFtZXMiLCAuZGVzY3IgPSAiR29vZCBGcmFtZSBDb3VudCwgaW5jbHVkaW5nIG5vbkZFQyBhbmQgRkVDIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGEsIGdvb2RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImdvb2RfYnl0ZXMiLCAuZGVzY3IgPSAiR29vZCBCeXRlIENvdW50LCBpbmNsdWRpbmcgbm9uRkVDIGFuZCBGRUMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSwgZ29vZF9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJvdmVyc3pfZnJhbWVzIiwgLmRlc2NyID0gIk92ZXJzaXplZCBmcmFtZSBjb3VudCAoZnJhbWVzIGxhcmdlciB0aGFuIDIwMDAgYnl0ZXMpIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGEsIG92ZXJzel9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAibm9uX2ZlY19nb29kX2ZyYW1lcyIsIC5kZXNjciA9ICJOb24gRkVDIEdvb2QgRnJhbWUgQ291bnQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSwgbm9uX2ZlY19nb29kX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJub25fZmVjX2dvb2RfYnl0ZXMiLCAuZGVzY3IgPSAiTm9uIEZFQyBHb29kIEJ5dGUgQ291bnQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSwgbm9uX2ZlY19nb29kX2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZlY19nb29kX2ZyYW1lcyIsIC5kZXNjciA9ICJGRUMgR29vZCBGcmFtZSBDb3VudCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhLCBmZWNfZ29vZF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZmVjX2dvb2RfYnl0ZXMiLCAuZGVzY3IgPSAiRkVDIEdvb2QgQnl0ZSBDb3VudCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhLCBmZWNfZ29vZF9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmZWNfZnJhbWVzX2V4Y19lcnJzIiwgLmRlc2NyID0gIkZFQyBGcmFtZXMgd2hpY2ggZXhjZWVkZWQgOCBzeW1ib2wgZXJyb3JzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGEsIGZlY19mcmFtZXNfZXhjX2VycnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZmVjX2Jsa3Nfbm9fZXJycyIsIC5kZXNjciA9ICJGRUMgQmxvY2tzIHdpdGggbm8gZXJyb3JzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGEsIGZlY19ibGtzX25vX2VycnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZmVjX2Jsa3NfY29ycl9lcnJzIiwgLmRlc2NyID0gIkZFQyBCbG9ja3Mgd2l0aCBjb3JyZWN0YWJsZSBlcnJvcnMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSwgZmVjX2Jsa3NfY29ycl9lcnJzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZlY19ibGtzX3VuY29ycl9lcnJzIiwgLmRlc2NyID0gIkZFQyBCbG9ja3Mgd2l0aCB1bmNvcnJlY3RhYmxlIGVycm9ycyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhLCBmZWNfYmxrc191bmNvcnJfZXJycyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmZWNfY29ycl9ieXRlcyIsIC5kZXNjciA9ICJGRUMgQ29ycmVjdGVkIEJ5dGVzL1N5bWJvbHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSwgZmVjX2NvcnJfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZmVjX2NvcnJfemVyb2VzIiwgLmRlc2NyID0gIkZFQyBDb3JyZWN0ZWQgWmVyb2VzLCA4YiBkb21haW4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSwgZmVjX2NvcnJfemVyb2VzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZlY19jb3JyX29uZXMiLCAuZGVzY3IgPSAiRkVDIENvcnJlY3RlZCBPbmVzLCA4YiBkb21haW4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSwgZmVjX2NvcnJfb25lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJ1bmRlcnN6X2ZyYW1lcyIsIC5kZXNjciA9ICJVbmRlcnNpemUgZnJhbWUgY291bnQgKGZyYW1lcyBsZXNzIHRoYW4gNjQgYnl0ZXMpIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGEsIHVuZGVyc3pfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImVycm9yc3pfZnJhbWVzIiwgLmRlc2NyID0gIkVycm9yZWQgZnJhbWUgIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGEsIGVycm9yc3pfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSIsIC5kZXNjciA9ICJzdGF0IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fb251XzFnX3VzIC0gY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfY2ZnX2FsbF9saW5rcyA9IHsgLm5hbWUgPSAiYWxsX2xpbmtzIiwgLmRlc2NyID0gIkxpc3Qgb2YgTUFDIEFkZHJlc3NlcyBmb3IgYWxsIGxpbmtzIG9uIHRoZSBPTlUgSWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQ0ZHX0lEX0FMTF9MSU5LUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19jZmdfZGF0YSwgYWxsX2xpbmtzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbWFjYWRkcmVzc19saXN0X3UzMiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fb251XzFnX3VzX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fb251XzFnX3VzX2NmZ19hbGxfbGlua3MgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFsbF9saW5rcyIsIC5kZXNjciA9ICJMaXN0IG9mIE1BQyBBZGRyZXNzZXMgZm9yIGFsbCBsaW5rcyBvbiB0aGUgT05VIElkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnX2RhdGEsIGFsbF9saW5rcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X21hY2FkZHJlc3NfbGlzdF91MzIgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xZ191c19jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19kYXRhIiwgLmRlc2NyID0gImNmZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xZ191c19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xZ191c19jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xZ191c19jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX29udV8xZ191cyAtIHN0YXRfY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfY2ZnID0geyAubmFtZSA9ICJjZmciLCAuZGVzY3IgPSAiU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfQ0ZHX0lEX0NGRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19kYXRhLCBjZmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fb251XzFnX3VzX3N0YXRfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfY2ZnIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImNmZyIsIC5kZXNjciA9ICJTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiU3RhdGlzdGljIENvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9vbnVfMWdfdXMgLSBzdGF0X2FsYXJtX3JhaXNlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fT05VXzFHX1VTX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfaWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX3N0YXQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2lkIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9vbnVfMWdfdXMgLSBzdGF0X2FsYXJtX2NsZWFyZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCA9IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX3N0YXQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfaWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIiwgLmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBpcyBubyBsb25nZXIgbWV0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX29udV8xZ191cyAtIGF1dG9fY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfc3RhdF9hbGFybV9jbGVhcmVkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX09OVV8xR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9jbGVhcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfc3RhdF9hbGFybV9yYWlzZWQgPSB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX3JhaXNlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX09OVV8xR19VU19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX3JhaXNlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fb251XzFnX3VzX2F1dG9fY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfc3RhdF9hbGFybV9jbGVhcmVkLCAmcHJvcF9kZXNjcl9lcG9uX29udV8xZ191c19hdXRvX2NmZ19zdGF0X2FsYXJtX3JhaXNlZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9jbGVhcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fcmFpc2VkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX3JhaXNlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19kYXRhIiwgLmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xZ191c19hdXRvX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qID09PT0gT2JqZWN0OiBlcG9uX3BhdGhfMTBnX2RzID09PT0gKi8KKworLyogR3JvdXA6IGVwb25fcGF0aF8xMGdfZHMgLSBrZXkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX2tleV9lcG9uX25pID0geyAubmFtZSA9ICJlcG9uX25pIiwgLmRlc2NyID0gIkVQT04gTkkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgMTBHIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19LRVlfSURfRVBPTl9OSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleSwgZXBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX3BhdGhfMTBnX2RzX2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfa2V5X2Vwb25fbmkgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImVwb25fbmkiLCAuZGVzY3IgPSAiRVBPTiBOSSBhc3NvY2lhdGVkIHdpdGggdGhpcyAxMEcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXksIGVwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleSIsIC5kZXNjciA9ICJrZXkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXlfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXlfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9wYXRoXzEwZ19kcyAtIGNmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2ZlY19zdGF0ZSA9IHsgLm5hbWUgPSAiZmVjX3N0YXRlIiwgLmRlc2NyID0gIkZFQyBlbmFibGUgc3RhdGUgZm9yIHRoZSAxMEcgZG93bnN0cmVhbSBwYXRoIG9uIHRoaXMgRVBPTiBOSS4gIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBjaGFuZ2VkIHdoaWxlIHRoZSBFUE9OX05JIGlzIGVuYWJsZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfQ0ZHX0lEX0ZFQ19TVEFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19kYXRhLCBmZWNfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2ZlY19lbl9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfY2ZnX3ByYnNfZ2VuZXJhdG9yID0geyAubmFtZSA9ICJwcmJzX2dlbmVyYXRvciIsIC5kZXNjciA9ICJEUyBQUkJTIGdlbmVyYXRvciBjb25maWd1cmF0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfQ0ZHX0lEX1BSQlNfR0VORVJBVE9SLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2RhdGEsIHByYnNfZ2VuZXJhdG9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9wYXRoXzEwZ19kc19jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX2NmZ19mZWNfc3RhdGUsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfY2ZnX3ByYnNfZ2VuZXJhdG9yIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImZlY19zdGF0ZSIsIC5kZXNjciA9ICJGRUMgZW5hYmxlIHN0YXRlIGZvciB0aGUgMTBHIGRvd25zdHJlYW0gcGF0aCBvbiB0aGlzIEVQT04gTkkuICBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgY2hhbmdlZCB3aGlsZSB0aGUgRVBPTl9OSSBpcyBlbmFibGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfZGF0YSwgZmVjX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9mZWNfZW5fc3RhdGUgfSwgeyAubmFtZSA9ICJwcmJzX2dlbmVyYXRvciIsIC5kZXNjciA9ICJEUyBQUkJTIGdlbmVyYXRvciBjb25maWd1cmF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19kYXRhLCBwcmJzX2dlbmVyYXRvciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19kYXRhIiwgLmRlc2NyID0gImNmZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ19kc19jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX3BhdGhfMTBnX2RzIC0gc3RhdCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9ieXRlcyA9IHsgLm5hbWUgPSAiYnl0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBieXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSwgYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2ZyYW1lcyA9IHsgLm5hbWUgPSAiZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSwgZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9mcmFtZXNfNjQgPSB7IC5uYW1lID0gImZyYW1lc182NCIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY0IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU182NCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzY0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9mcmFtZXNfNjVfMTI3ID0geyAubmFtZSA9ICJmcmFtZXNfNjVfMTI3IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNjUgdG8gMTI3IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU182NV8xMjcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIGZyYW1lc182NV8xMjcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2ZyYW1lc18xMjhfMjU1ID0geyAubmFtZSA9ICJmcmFtZXNfMTI4XzI1NSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEyOCB0byAyNTUgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIGZyYW1lc18xMjhfMjU1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9mcmFtZXNfMjU2XzUxMSA9IHsgLm5hbWUgPSAiZnJhbWVzXzI1Nl81MTEiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAyNTYgdG8gNTExIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18yNTZfNTExLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhLCBmcmFtZXNfMjU2XzUxMSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZnJhbWVzXzUxMl8xMDIzID0geyAubmFtZSA9ICJmcmFtZXNfNTEyXzEwMjMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA1MTIgdG8gMTAyMyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNTEyXzEwMjMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIGZyYW1lc181MTJfMTAyMyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZnJhbWVzXzEwMjRfMTUxOCA9IHsgLm5hbWUgPSAiZnJhbWVzXzEwMjRfMTUxOCIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEwMjQgdG8gMTUxOCBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhLCBmcmFtZXNfMTAyNF8xNTE4KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9mcmFtZXNfMTUxOV8yMDQ3ID0geyAubmFtZSA9ICJmcmFtZXNfMTUxOV8yMDQ3IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTUxOSB0byAyMDQ3IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU18xNTE5XzIwNDcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIGZyYW1lc18xNTE5XzIwNDcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2ZyYW1lc18yMDQ4XzQwOTUgPSB7IC5uYW1lID0gImZyYW1lc18yMDQ4XzQwOTUiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAyMDQ4IHRvIDQwOTUgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfRlJBTUVTXzIwNDhfNDA5NSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzIwNDhfNDA5NSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZnJhbWVzXzQwOTZfOTIxNiA9IHsgLm5hbWUgPSAiZnJhbWVzXzQwOTZfOTIxNiIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDQwOTYgdG8gOTIxNiBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhLCBmcmFtZXNfNDA5Nl85MjE2KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9mcmFtZXNfOTIxN18xNjM4MyA9IHsgLm5hbWUgPSAiZnJhbWVzXzkyMTdfMTYzODMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA5MjE3IHRvIDE2MzgzIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX0ZSQU1FU185MjE3XzE2MzgzLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhLCBmcmFtZXNfOTIxN18xNjM4MyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYnJvYWRjYXN0X2ZyYW1lcyA9IHsgLm5hbWUgPSAiYnJvYWRjYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJyb2FkY2FzdCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfQlJPQURDQVNUX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSwgYnJvYWRjYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YV9ieXRlcyA9IHsgLm5hbWUgPSAiZGF0YV9ieXRlcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfREFUQV9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSwgZGF0YV9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfbXVsdGljYXN0X2ZyYW1lcyA9IHsgLm5hbWUgPSAibXVsdGljYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIG11bHRpY2FzdCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfTVVMVElDQVNUX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSwgbXVsdGljYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfdW5pY2FzdF9mcmFtZXMgPSB7IC5uYW1lID0gInVuaWNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdW5pY2FzdCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfVU5JQ0FTVF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIHVuaWNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9vYW1fYnl0ZXMgPSB7IC5uYW1lID0gIm9hbV9ieXRlcyIsIC5kZXNjciA9ICJOdW1iZXIgb2YgT0FNIGJ5dGVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX09BTV9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSwgb2FtX2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9vYW1fZnJhbWVzID0geyAubmFtZSA9ICJvYW1fZnJhbWVzIiwgLmRlc2NyID0gIk51bWJlciBvZiBPQU0gZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX09BTV9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIG9hbV9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2dhdGVfZnJhbWVzID0geyAubmFtZSA9ICJnYXRlX2ZyYW1lcyIsIC5kZXNjciA9ICJOdW1iZXIgb2YgZ2F0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfSURfR0FURV9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIGdhdGVfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9tcGNwX2ZyYW1lcyA9IHsgLm5hbWUgPSAibXBjcF9mcmFtZXMiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIE1QQ1AgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0lEX01QQ1BfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhLCBtcGNwX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWJvcnRfZnJhbWVzID0geyAubmFtZSA9ICJhYm9ydF9mcmFtZXMiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIGFib3J0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9JRF9BQk9SVF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIGFib3J0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX3BhdGhfMTBnX2RzX3N0YXRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYnl0ZXMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9mcmFtZXNfNjQsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9mcmFtZXNfNjVfMTI3LCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZnJhbWVzXzEyOF8yNTUsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9mcmFtZXNfMjU2XzUxMSwgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2ZyYW1lc181MTJfMTAyMywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2ZyYW1lc18xMDI0XzE1MTgsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9mcmFtZXNfMTUxOV8yMDQ3LCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZnJhbWVzXzIwNDhfNDA5NSwgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2ZyYW1lc180MDk2XzkyMTYsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9mcmFtZXNfOTIxN18xNjM4MywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2Jyb2FkY2FzdF9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhX2J5dGVzLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfbXVsdGljYXN0X2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ19kc19zdGF0X3VuaWNhc3RfZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfb2FtX2J5dGVzLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfb2FtX2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2dhdGVfZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfbXBjcF9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hYm9ydF9mcmFtZXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImJ5dGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnl0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIGJ5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSwgZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc182NCIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY0IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhLCBmcmFtZXNfNjQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzY1XzEyNyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY1IHRvIDEyNyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzY1XzEyNyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfMTI4XzI1NSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEyOCB0byAyNTUgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIGZyYW1lc18xMjhfMjU1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc18yNTZfNTExIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMjU2IHRvIDUxMSBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzI1Nl81MTEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzUxMl8xMDIzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNTEyIHRvIDEwMjMgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIGZyYW1lc181MTJfMTAyMyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfMTAyNF8xNTE4IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTAyNCB0byAxNTE4IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhLCBmcmFtZXNfMTAyNF8xNTE4KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc18xNTE5XzIwNDciLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxNTE5IHRvIDIwNDcgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIGZyYW1lc18xNTE5XzIwNDcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzIwNDhfNDA5NSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDIwNDggdG8gNDA5NSBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzIwNDhfNDA5NSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfNDA5Nl85MjE2IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNDA5NiB0byA5MjE2IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhLCBmcmFtZXNfNDA5Nl85MjE2KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc185MjE3XzE2MzgzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgOTIxNyB0byAxNjM4MyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzkyMTdfMTYzODMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiYnJvYWRjYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJyb2FkY2FzdCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIGJyb2FkY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZGF0YV9ieXRlcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIGRhdGFfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAibXVsdGljYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIG11bHRpY2FzdCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIG11bHRpY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidW5pY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB1bmljYXN0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSwgdW5pY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAib2FtX2J5dGVzIiwgLmRlc2NyID0gIk51bWJlciBvZiBPQU0gYnl0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEsIG9hbV9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJvYW1fZnJhbWVzIiwgLmRlc2NyID0gIk51bWJlciBvZiBPQU0gZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhLCBvYW1fZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImdhdGVfZnJhbWVzIiwgLmRlc2NyID0gIk51bWJlciBvZiBnYXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSwgZ2F0ZV9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAibXBjcF9mcmFtZXMiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIE1QQ1AgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhLCBtcGNwX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJhYm9ydF9mcmFtZXMiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIGFib3J0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSwgYWJvcnRfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2RhdGEiLCAuZGVzY3IgPSAic3RhdCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX3BhdGhfMTBnX2RzIC0gc3RhdF9jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2NmZyA9IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX1NUQVRfQ0ZHX0lEX0NGRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfY2ZnIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19kYXRhLCBjZmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfZGF0YSIsIC5kZXNjciA9ICJTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX3BhdGhfMTBnX2RzIC0gc3RhdF9hbGFybV9yYWlzZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfaWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9zdGF0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX3BhdGhfMTBnX2RzIC0gc3RhdF9hbGFybV9jbGVhcmVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCA9IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9zdGF0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2lkIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fcGF0aF8xMGdfZHMgLSBhdXRvX2NmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfc3RhdF9hbGFybV9jbGVhcmVkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fY2xlYXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfc3RhdF9hbGFybV9yYWlzZWQgPSB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX3JhaXNlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9yYWlzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19zdGF0X2FsYXJtX2NsZWFyZWQsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfc3RhdF9hbGFybV9yYWlzZWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX2NsZWFyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9yYWlzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2RhdGEiLCAuZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogPT09PSBPYmplY3Q6IGVwb25fcGF0aF8xMGdfdXMgPT09PSAqLworCisvKiBHcm91cDogZXBvbl9wYXRoXzEwZ191cyAtIGtleSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfa2V5X2Vwb25fbmkgPSB7IC5uYW1lID0gImVwb25fbmkiLCAuZGVzY3IgPSAiRVBPTiBOSSBhc3NvY2lhdGVkIHdpdGggdGhpcyAxMEcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19LRVlfSURfRVBPTl9OSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleSwgZXBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX3BhdGhfMTBnX3VzX2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfa2V5X2Vwb25fbmkgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImVwb25fbmkiLCAuZGVzY3IgPSAiRVBPTiBOSSBhc3NvY2lhdGVkIHdpdGggdGhpcyAxMEcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5LCBlcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkiLCAuZGVzY3IgPSAia2V5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5X2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fcGF0aF8xMGdfdXMgLSBjZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX2NmZ19mZWNfc3RhdGUgPSB7IC5uYW1lID0gImZlY19zdGF0ZSIsIC5kZXNjciA9ICJGRUMgZW5hYmxlIHN0YXRlIGZvciB0aGUgMTBHIHVwc3RyZWFtIHBhdGggb24gdGhpcyBFUE9OIE5JLiAgVGhpcyBhdHRyaWJ1dGUgY2Fubm90IGJlIGNoYW5nZWQgd2hpbGUgdGhlIEVQT05fTkkgaXMgZW5hYmxlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfRkVDX1NUQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2RhdGEsIGZlY19zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZmVjX2VuX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19jZmdfc3luY190aW1lX3RxID0geyAubmFtZSA9ICJzeW5jX3RpbWVfdHEiLCAuZGVzY3IgPSAiVGltZSBxdWFudGEgb2Ygc3luYyBhdCBzdGFydCBvZiBVUyBidXJzdC4gIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBjaGFuZ2VkIHdoaWxlIHRoZSBFUE9OX05JIGlzIGVuYWJsZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX1NZTkNfVElNRV9UUSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19kYXRhLCBzeW5jX3RpbWVfdHEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19jZmdfcHJic19jaGVja2VyID0geyAubmFtZSA9ICJwcmJzX2NoZWNrZXIiLCAuZGVzY3IgPSAiVVMgUFJCUyBjaGVja2VyIGNvbmZpZ3VyYXRpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19DRkdfSURfUFJCU19DSEVDS0VSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2RhdGEsIHByYnNfY2hlY2tlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX2NmZ19wcmJzX3N0YXR1cyA9IHsgLm5hbWUgPSAicHJic19zdGF0dXMiLCAuZGVzY3IgPSAiUmVzdWx0IG9mIFVTIFBSQlMgY2hlY2tlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQ0ZHX0lEX1BSQlNfU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2RhdGEsIHByYnNfc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcHJic19zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX3BhdGhfMTBnX3VzX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2ZlY19zdGF0ZSwgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19jZmdfc3luY190aW1lX3RxLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX2NmZ19wcmJzX2NoZWNrZXIsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfY2ZnX3ByYnNfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImZlY19zdGF0ZSIsIC5kZXNjciA9ICJGRUMgZW5hYmxlIHN0YXRlIGZvciB0aGUgMTBHIHVwc3RyZWFtIHBhdGggb24gdGhpcyBFUE9OIE5JLiAgVGhpcyBhdHRyaWJ1dGUgY2Fubm90IGJlIGNoYW5nZWQgd2hpbGUgdGhlIEVQT05fTkkgaXMgZW5hYmxlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2RhdGEsIGZlY19zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZmVjX2VuX3N0YXRlIH0sIHsgLm5hbWUgPSAic3luY190aW1lX3RxIiwgLmRlc2NyID0gIlRpbWUgcXVhbnRhIG9mIHN5bmMgYXQgc3RhcnQgb2YgVVMgYnVyc3QuICBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgY2hhbmdlZCB3aGlsZSB0aGUgRVBPTl9OSSBpcyBlbmFibGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfZGF0YSwgc3luY190aW1lX3RxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gInByYnNfY2hlY2tlciIsIC5kZXNjciA9ICJVUyBQUkJTIGNoZWNrZXIgY29uZmlndXJhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfZGF0YSwgcHJic19jaGVja2VyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcHJic19jaGVja2VyX2NvbmZpZyB9LCB7IC5uYW1lID0gInByYnNfc3RhdHVzIiwgLmRlc2NyID0gIlJlc3VsdCBvZiBVUyBQUkJTIGNoZWNrZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2RhdGEsIHByYnNfc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcHJic19zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfZGF0YSIsIC5kZXNjciA9ICJjZmciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9wYXRoXzEwZ191cyAtIHN0YXQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYnl0ZXMgPSB7IC5uYW1lID0gImJ5dGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0JZVEVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZnJhbWVzID0geyAubmFtZSA9ICJmcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9mcmFtZXNfNjQgPSB7IC5uYW1lID0gImZyYW1lc182NCIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY0IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfNjQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEsIGZyYW1lc182NCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZnJhbWVzXzY1XzEyNyA9IHsgLm5hbWUgPSAiZnJhbWVzXzY1XzEyNyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY1IHRvIDEyNyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzY1XzEyNywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzY1XzEyNyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZnJhbWVzXzEyOF8yNTUgPSB7IC5uYW1lID0gImZyYW1lc18xMjhfMjU1IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTI4IHRvIDI1NSBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEsIGZyYW1lc18xMjhfMjU1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9mcmFtZXNfMjU2XzUxMSA9IHsgLm5hbWUgPSAiZnJhbWVzXzI1Nl81MTEiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAyNTYgdG8gNTExIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMjU2XzUxMSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzI1Nl81MTEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X2ZyYW1lc181MTJfMTAyMyA9IHsgLm5hbWUgPSAiZnJhbWVzXzUxMl8xMDIzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNTEyIHRvIDEwMjMgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzUxMl8xMDIzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9mcmFtZXNfMTAyNF8xNTE4ID0geyAubmFtZSA9ICJmcmFtZXNfMTAyNF8xNTE4IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTAyNCB0byAxNTE4IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBmcmFtZXNfMTAyNF8xNTE4KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9mcmFtZXNfMTUxOV8yMDQ3ID0geyAubmFtZSA9ICJmcmFtZXNfMTUxOV8yMDQ3IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTUxOSB0byAyMDQ3IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMTUxOV8yMDQ3LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBmcmFtZXNfMTUxOV8yMDQ3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9mcmFtZXNfMjA0OF80MDk1ID0geyAubmFtZSA9ICJmcmFtZXNfMjA0OF80MDk1IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMjA0OCB0byA0MDk1IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBmcmFtZXNfMjA0OF80MDk1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9mcmFtZXNfNDA5Nl85MjE2ID0geyAubmFtZSA9ICJmcmFtZXNfNDA5Nl85MjE2IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNDA5NiB0byA5MjE2IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBmcmFtZXNfNDA5Nl85MjE2KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9mcmFtZXNfOTIxN18xNjM4MyA9IHsgLm5hbWUgPSAiZnJhbWVzXzkyMTdfMTYzODMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA5MjE3IHRvIDE2MzgzIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9GUkFNRVNfOTIxN18xNjM4MywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzkyMTdfMTYzODMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X2Jyb2FkY2FzdF9mcmFtZXMgPSB7IC5uYW1lID0gImJyb2FkY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBicm9hZGNhc3QgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBicm9hZGNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhX2J5dGVzID0geyAubmFtZSA9ICJkYXRhX2J5dGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfREFUQV9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgZGF0YV9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfbXVsdGljYXN0X2ZyYW1lcyA9IHsgLm5hbWUgPSAibXVsdGljYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIG11bHRpY2FzdCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEsIG11bHRpY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X3VuaWNhc3RfZnJhbWVzID0geyAubmFtZSA9ICJ1bmljYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHVuaWNhc3QgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgdW5pY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X21wY3BfZnJhbWVzID0geyAubmFtZSA9ICJtcGNwX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIE1QQ1AgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9NUENQX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgbXBjcF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X29hbV9ieXRlcyA9IHsgLm5hbWUgPSAib2FtX2J5dGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgT0FNIGJ5dGVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9PQU1fQllURVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEsIG9hbV9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfb2FtX2ZyYW1lcyA9IHsgLm5hbWUgPSAib2FtX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIE9BTSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX09BTV9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEsIG9hbV9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X3JlcG9ydF9mcmFtZXMgPSB7IC5uYW1lID0gInJlcG9ydF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZXBvcnQgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9SRVBPUlRfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCByZXBvcnRfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hYm9ydF9mcmFtZXMgPSB7IC5uYW1lID0gImFib3J0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGFib3J0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfQUJPUlRfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBhYm9ydF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X2Zjc19lcnJvciA9IHsgLm5hbWUgPSAiZmNzX2Vycm9yIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYmFkIEZDUyBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX0ZDU19FUlJPUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgZmNzX2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jcmNfOF9lcnJvciA9IHsgLm5hbWUgPSAiY3JjXzhfZXJyb3IiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBDUkM4IGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfQ1JDXzhfRVJST1IsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEsIGNyY184X2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9vdXRfb2Zfc2xvdCA9IHsgLm5hbWUgPSAib3V0X29mX3Nsb3QiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBvdXQgb2Ygc2xvdCBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0lEX09VVF9PRl9TTE9ULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBvdXRfb2Zfc2xvdCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfb3ZlcnNpemVfZXJyb3IgPSB7IC5uYW1lID0gIm92ZXJzaXplX2Vycm9yIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2Ygb3ZlcnNpemUgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9JRF9PVkVSU0laRV9FUlJPUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgb3ZlcnNpemVfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X3J1bnRfZXJyb3IgPSB7IC5uYW1lID0gInJ1bnRfZXJyb3IiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBydW50IGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfSURfUlVOVF9FUlJPUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgcnVudF9lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX3BhdGhfMTBnX3VzX3N0YXRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYnl0ZXMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9mcmFtZXNfNjQsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9mcmFtZXNfNjVfMTI3LCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZnJhbWVzXzEyOF8yNTUsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9mcmFtZXNfMjU2XzUxMSwgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X2ZyYW1lc181MTJfMTAyMywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X2ZyYW1lc18xMDI0XzE1MTgsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9mcmFtZXNfMTUxOV8yMDQ3LCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZnJhbWVzXzIwNDhfNDA5NSwgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X2ZyYW1lc180MDk2XzkyMTYsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9mcmFtZXNfOTIxN18xNjM4MywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X2Jyb2FkY2FzdF9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhX2J5dGVzLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfbXVsdGljYXN0X2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X3VuaWNhc3RfZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfbXBjcF9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9vYW1fYnl0ZXMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9vYW1fZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfcmVwb3J0X2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X2Fib3J0X2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X2Zjc19lcnJvciwgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NyY184X2Vycm9yLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfb3V0X29mX3Nsb3QsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9vdmVyc2l6ZV9lcnJvciwgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X3J1bnRfZXJyb3IgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImJ5dGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBmcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzY0IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNjQgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBmcmFtZXNfNjQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzY1XzEyNyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY1IHRvIDEyNyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEsIGZyYW1lc182NV8xMjcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzEyOF8yNTUiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMjggdG8gMjU1IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzEyOF8yNTUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzI1Nl81MTEiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAyNTYgdG8gNTExIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzI1Nl81MTEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzUxMl8xMDIzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNTEyIHRvIDEwMjMgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBmcmFtZXNfNTEyXzEwMjMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzEwMjRfMTUxOCIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEwMjQgdG8gMTUxOCBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEsIGZyYW1lc18xMDI0XzE1MTgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzE1MTlfMjA0NyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDE1MTkgdG8gMjA0NyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEsIGZyYW1lc18xNTE5XzIwNDcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzIwNDhfNDA5NSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDIwNDggdG8gNDA5NSBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEsIGZyYW1lc18yMDQ4XzQwOTUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzQwOTZfOTIxNiIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDQwOTYgdG8gOTIxNiBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEsIGZyYW1lc180MDk2XzkyMTYpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzkyMTdfMTYzODMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA5MjE3IHRvIDE2MzgzIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzkyMTdfMTYzODMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiYnJvYWRjYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJyb2FkY2FzdCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBicm9hZGNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImRhdGFfYnl0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgZGF0YV9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJtdWx0aWNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgbXVsdGljYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEsIG11bHRpY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidW5pY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB1bmljYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEsIHVuaWNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gIm1wY3BfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgTVBDUCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBtcGNwX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJvYW1fYnl0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBPQU0gYnl0ZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBvYW1fYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAib2FtX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIE9BTSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBvYW1fZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJlcG9ydF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZXBvcnQgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgcmVwb3J0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJhYm9ydF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBhYm9ydCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBhYm9ydF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZmNzX2Vycm9yIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYmFkIEZDUyBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBmY3NfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiY3JjXzhfZXJyb3IiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBDUkM4IGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEsIGNyY184X2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gIm91dF9vZl9zbG90IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2Ygb3V0IG9mIHNsb3QgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSwgb3V0X29mX3Nsb3QpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAib3ZlcnNpemVfZXJyb3IiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBvdmVyc2l6ZSBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBvdmVyc2l6ZV9lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJydW50X2Vycm9yIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcnVudCBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhLCBydW50X2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2RhdGEiLCAuZGVzY3IgPSAic3RhdCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX3BhdGhfMTBnX3VzIC0gc3RhdF9jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2NmZyA9IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX1NUQVRfQ0ZHX0lEX0NGRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfY2ZnIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19kYXRhLCBjZmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfZGF0YSIsIC5kZXNjciA9ICJTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX3BhdGhfMTBnX3VzIC0gc3RhdF9hbGFybV9yYWlzZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfaWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9zdGF0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX3BhdGhfMTBnX3VzIC0gc3RhdF9hbGFybV9jbGVhcmVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCA9IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9zdGF0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2lkIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fcGF0aF8xMGdfdXMgLSBhdXRvX2NmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfc3RhdF9hbGFybV9jbGVhcmVkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fY2xlYXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfc3RhdF9hbGFybV9yYWlzZWQgPSB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX3JhaXNlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMTBHX1VTX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9yYWlzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19zdGF0X2FsYXJtX2NsZWFyZWQsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfc3RhdF9hbGFybV9yYWlzZWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX2NsZWFyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9yYWlzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2RhdGEiLCAuZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfYXV0b19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogPT09PSBPYmplY3Q6IGVwb25fcGF0aF8xZ19kcyA9PT09ICovCisKKy8qIEdyb3VwOiBlcG9uX3BhdGhfMWdfZHMgLSBrZXkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfa2V5X2Vwb25fbmkgPSB7IC5uYW1lID0gImVwb25fbmkiLCAuZGVzY3IgPSAiRVBPTiBOSSBhc3NvY2lhdGVkIHdpdGggdGhpcyAxRyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19LRVlfSURfRVBPTl9OSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5LCBlcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fcGF0aF8xZ19kc19rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfa2V5X2Vwb25fbmkgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXlfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZXBvbl9uaSIsIC5kZXNjciA9ICJFUE9OIE5JIGFzc29jaWF0ZWQgd2l0aCB0aGlzIDFHIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXksIGVwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkiLCAuZGVzY3IgPSAia2V5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5X2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fcGF0aF8xZ19kcyAtIGNmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19jZmdfZGVmYXVsdF9mZWNfc3RhdGUgPSB7IC5uYW1lID0gImRlZmF1bHRfZmVjX3N0YXRlIiwgLmRlc2NyID0gIkRlZmF1bHQgRkVDIGVuYWJsZSBzdGF0ZSBmb3IgdGhlIDFHIGRvd25zdHJlYW0gcGF0aCBvbiB0aGlzIEVQT04gTkkuICBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgY2hhbmdlZCB3aGlsZSB0aGUgRVBPTl9OSSBpcyBlbmFibGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQ0ZHX0lEX0RFRkFVTFRfRkVDX1NUQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfZGF0YSwgZGVmYXVsdF9mZWNfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2ZlY19lbl9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19jZmdfcmFtYW5fbW9kZSA9IHsgLm5hbWUgPSAicmFtYW5fbW9kZSIsIC5kZXNjciA9ICJSYW1hbiBtaXRpZ2F0aW9uIG1vZGUgZm9yIHRoZSAxRyBkb3duc3RyZWFtIHBhdGggb24gdGhpcyBFUE9OIE5JLiAgUmFtYW4gbWl0aWdhdGlvbiBjYW5ub3QgY29leGlzdCB3aXRoIHR1cmJvIG1vZGUuICBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgY2hhbmdlZCB3aGlsZSB0aGUgRVBPTl9OSSBpcyBlbmFibGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQ0ZHX0lEX1JBTUFOX01PREUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZ19kYXRhLCByYW1hbl9tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmFtYW5fbWl0aWdhdGlvbl9tb2RlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX2NmZ190dXJib18yZ19tb2RlID0geyAubmFtZSA9ICJ0dXJib18yZ19tb2RlIiwgLmRlc2NyID0gIk9wZXJhdGUgdGhlIDFHIGRvd25zdHJlYW0gcGF0aCBhdCB0aGUgdHVyYm8gMkcgZGF0YSByYXRlIG9uIHRoaXMgRVBPTiBOSS4gIFJhbWFuIG1pdGlnYXRpb24gY2Fubm90IGNvZXhpc3Qgd2l0aCB0dXJibyBtb2RlLiAgVGhpcyBhdHRyaWJ1dGUgY2Fubm90IGJlIGNoYW5nZWQgd2hpbGUgdGhlIEVQT05fTkkgaXMgZW5hYmxlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9UVVJCT18yR19NT0RFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfZGF0YSwgdHVyYm9fMmdfbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fMWdfdHVyYm9fbW9kZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19jZmdfcHJic19nZW5lcmF0b3IgPSB7IC5uYW1lID0gInByYnNfZ2VuZXJhdG9yIiwgLmRlc2NyID0gIkRTIFBSQlMgZ2VuZXJhdG9yIGNvbmZpZ3VyYXRpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0NGR19JRF9QUkJTX0dFTkVSQVRPUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGEsIHByYnNfZ2VuZXJhdG9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9wYXRoXzFnX2RzX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19jZmdfZGVmYXVsdF9mZWNfc3RhdGUsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19jZmdfcmFtYW5fbW9kZSwgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX2NmZ190dXJib18yZ19tb2RlLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfY2ZnX3ByYnNfZ2VuZXJhdG9yIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZGVmYXVsdF9mZWNfc3RhdGUiLCAuZGVzY3IgPSAiRGVmYXVsdCBGRUMgZW5hYmxlIHN0YXRlIGZvciB0aGUgMUcgZG93bnN0cmVhbSBwYXRoIG9uIHRoaXMgRVBPTiBOSS4gIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBjaGFuZ2VkIHdoaWxlIHRoZSBFUE9OX05JIGlzIGVuYWJsZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGEsIGRlZmF1bHRfZmVjX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9mZWNfZW5fc3RhdGUgfSwgeyAubmFtZSA9ICJyYW1hbl9tb2RlIiwgLmRlc2NyID0gIlJhbWFuIG1pdGlnYXRpb24gbW9kZSBmb3IgdGhlIDFHIGRvd25zdHJlYW0gcGF0aCBvbiB0aGlzIEVQT04gTkkuICBSYW1hbiBtaXRpZ2F0aW9uIGNhbm5vdCBjb2V4aXN0IHdpdGggdHVyYm8gbW9kZS4gIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBjaGFuZ2VkIHdoaWxlIHRoZSBFUE9OX05JIGlzIGVuYWJsZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGEsIHJhbWFuX21vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yYW1hbl9taXRpZ2F0aW9uX21vZGUgfSwgeyAubmFtZSA9ICJ0dXJib18yZ19tb2RlIiwgLmRlc2NyID0gIk9wZXJhdGUgdGhlIDFHIGRvd25zdHJlYW0gcGF0aCBhdCB0aGUgdHVyYm8gMkcgZGF0YSByYXRlIG9uIHRoaXMgRVBPTiBOSS4gIFJhbWFuIG1pdGlnYXRpb24gY2Fubm90IGNvZXhpc3Qgd2l0aCB0dXJibyBtb2RlLiAgVGhpcyBhdHRyaWJ1dGUgY2Fubm90IGJlIGNoYW5nZWQgd2hpbGUgdGhlIEVQT05fTkkgaXMgZW5hYmxlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfZGF0YSwgdHVyYm9fMmdfbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fMWdfdHVyYm9fbW9kZSB9LCB7IC5uYW1lID0gInByYnNfZ2VuZXJhdG9yIiwgLmRlc2NyID0gIkRTIFBSQlMgZ2VuZXJhdG9yIGNvbmZpZ3VyYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfZGF0YSwgcHJic19nZW5lcmF0b3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWcgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiY2ZnIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fcGF0aF8xZ19kcyAtIHN0YXQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfc3RhdF9ieXRlcyA9IHsgLm5hbWUgPSAiYnl0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBieXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfQllURVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSwgYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZnJhbWVzID0geyAubmFtZSA9ICJmcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhLCBmcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZnJhbWVzXzY0ID0geyAubmFtZSA9ICJmcmFtZXNfNjQiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA2NCBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzY0LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEsIGZyYW1lc182NCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfc3RhdF9mcmFtZXNfNjVfMTI3ID0geyAubmFtZSA9ICJmcmFtZXNfNjVfMTI3IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNjUgdG8gMTI3IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfNjVfMTI3LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEsIGZyYW1lc182NV8xMjcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZnJhbWVzXzEyOF8yNTUgPSB7IC5uYW1lID0gImZyYW1lc18xMjhfMjU1IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTI4IHRvIDI1NSBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzEyOF8yNTUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzEyOF8yNTUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZnJhbWVzXzI1Nl81MTEgPSB7IC5uYW1lID0gImZyYW1lc18yNTZfNTExIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMjU2IHRvIDUxMSBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzI1Nl81MTEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZnJhbWVzXzUxMl8xMDIzID0geyAubmFtZSA9ICJmcmFtZXNfNTEyXzEwMjMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA1MTIgdG8gMTAyMyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzUxMl8xMDIzLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEsIGZyYW1lc181MTJfMTAyMyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfc3RhdF9mcmFtZXNfMTAyNF8xNTE4ID0geyAubmFtZSA9ICJmcmFtZXNfMTAyNF8xNTE4IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTAyNCB0byAxNTE4IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfMTAyNF8xNTE4LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEsIGZyYW1lc18xMDI0XzE1MTgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZnJhbWVzXzE1MTlfMjA0NyA9IHsgLm5hbWUgPSAiZnJhbWVzXzE1MTlfMjA0NyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDE1MTkgdG8gMjA0NyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhLCBmcmFtZXNfMTUxOV8yMDQ3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19zdGF0X2ZyYW1lc18yMDQ4XzQwOTUgPSB7IC5uYW1lID0gImZyYW1lc18yMDQ4XzQwOTUiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAyMDQ4IHRvIDQwOTUgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0ZSQU1FU18yMDQ4XzQwOTUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzIwNDhfNDA5NSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfc3RhdF9mcmFtZXNfNDA5Nl85MjE2ID0geyAubmFtZSA9ICJmcmFtZXNfNDA5Nl85MjE2IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNDA5NiB0byA5MjE2IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9GUkFNRVNfNDA5Nl85MjE2LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEsIGZyYW1lc180MDk2XzkyMTYpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZnJhbWVzXzkyMTdfMTYzODMgPSB7IC5uYW1lID0gImZyYW1lc185MjE3XzE2MzgzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgOTIxNyB0byAxNjM4MyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzkyMTdfMTYzODMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYnJvYWRjYXN0X2ZyYW1lcyA9IHsgLm5hbWUgPSAiYnJvYWRjYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJyb2FkY2FzdCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSwgYnJvYWRjYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhX2J5dGVzID0geyAubmFtZSA9ICJkYXRhX2J5dGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfREFUQV9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhLCBkYXRhX2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19zdGF0X211bHRpY2FzdF9mcmFtZXMgPSB7IC5uYW1lID0gIm11bHRpY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBtdWx0aWNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEsIG11bHRpY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfdW5pY2FzdF9mcmFtZXMgPSB7IC5uYW1lID0gInVuaWNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdW5pY2FzdCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX1VOSUNBU1RfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEsIHVuaWNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19zdGF0X29hbV9ieXRlcyA9IHsgLm5hbWUgPSAib2FtX2J5dGVzIiwgLmRlc2NyID0gIk51bWJlciBvZiBPQU0gYnl0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX09BTV9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhLCBvYW1fYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfb2FtX2ZyYW1lcyA9IHsgLm5hbWUgPSAib2FtX2ZyYW1lcyIsIC5kZXNjciA9ICJOdW1iZXIgb2YgT0FNIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfSURfT0FNX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhLCBvYW1fZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19zdGF0X2dhdGVfZnJhbWVzID0geyAubmFtZSA9ICJnYXRlX2ZyYW1lcyIsIC5kZXNjciA9ICJOdW1iZXIgb2YgZ2F0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0dBVEVfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEsIGdhdGVfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19zdGF0X21wY3BfZnJhbWVzID0geyAubmFtZSA9ICJtcGNwX2ZyYW1lcyIsIC5kZXNjciA9ICJOdW1iZXIgb2YgTVBDUCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX01QQ1BfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEsIG1wY3BfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19zdGF0X2Fib3J0X2ZyYW1lcyA9IHsgLm5hbWUgPSAiYWJvcnRfZnJhbWVzIiwgLmRlc2NyID0gIk51bWJlciBvZiBhYm9ydCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0lEX0FCT1JUX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhLCBhYm9ydF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9wYXRoXzFnX2RzX3N0YXRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfc3RhdF9ieXRlcywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfc3RhdF9mcmFtZXNfNjQsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19zdGF0X2ZyYW1lc182NV8xMjcsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19zdGF0X2ZyYW1lc18xMjhfMjU1LCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfc3RhdF9mcmFtZXNfMjU2XzUxMSwgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZnJhbWVzXzUxMl8xMDIzLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfc3RhdF9mcmFtZXNfMTAyNF8xNTE4LCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfc3RhdF9mcmFtZXNfMTUxOV8yMDQ3LCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfc3RhdF9mcmFtZXNfMjA0OF80MDk1LCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfc3RhdF9mcmFtZXNfNDA5Nl85MjE2LCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfc3RhdF9mcmFtZXNfOTIxN18xNjM4MywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYnJvYWRjYXN0X2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YV9ieXRlcywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfbXVsdGljYXN0X2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfdW5pY2FzdF9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19zdGF0X29hbV9ieXRlcywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfb2FtX2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZ2F0ZV9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19zdGF0X21wY3BfZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hYm9ydF9mcmFtZXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYnl0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBieXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEsIGJ5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEsIGZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfNjQiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA2NCBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEsIGZyYW1lc182NCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfNjVfMTI3IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNjUgdG8gMTI3IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzY1XzEyNyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfMTI4XzI1NSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEyOCB0byAyNTUgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhLCBmcmFtZXNfMTI4XzI1NSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfMjU2XzUxMSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDI1NiB0byA1MTEgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhLCBmcmFtZXNfMjU2XzUxMSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfNTEyXzEwMjMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA1MTIgdG8gMTAyMyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEsIGZyYW1lc181MTJfMTAyMyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfMTAyNF8xNTE4IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTAyNCB0byAxNTE4IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzEwMjRfMTUxOCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfMTUxOV8yMDQ3IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTUxOSB0byAyMDQ3IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzE1MTlfMjA0NyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfMjA0OF80MDk1IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMjA0OCB0byA0MDk1IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzIwNDhfNDA5NSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfNDA5Nl85MjE2IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNDA5NiB0byA5MjE2IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSwgZnJhbWVzXzQwOTZfOTIxNiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfOTIxN18xNjM4MyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDkyMTcgdG8gMTYzODMgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhLCBmcmFtZXNfOTIxN18xNjM4MyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJicm9hZGNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnJvYWRjYXN0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEsIGJyb2FkY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZGF0YV9ieXRlcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhLCBkYXRhX2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gIm11bHRpY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBtdWx0aWNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSwgbXVsdGljYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJ1bmljYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHVuaWNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSwgdW5pY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAib2FtX2J5dGVzIiwgLmRlc2NyID0gIk51bWJlciBvZiBPQU0gYnl0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhLCBvYW1fYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAib2FtX2ZyYW1lcyIsIC5kZXNjciA9ICJOdW1iZXIgb2YgT0FNIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEsIG9hbV9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZ2F0ZV9mcmFtZXMiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIGdhdGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSwgZ2F0ZV9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAibXBjcF9mcmFtZXMiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIE1QQ1AgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSwgbXBjcF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiYWJvcnRfZnJhbWVzIiwgLmRlc2NyID0gIk51bWJlciBvZiBhYm9ydCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhLCBhYm9ydF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGEiLCAuZGVzY3IgPSAic3RhdCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX3BhdGhfMWdfZHMgLSBzdGF0X2NmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZ19jZmcgPSB7IC5uYW1lID0gImNmZyIsIC5kZXNjciA9ICJTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQ0ZHX0lEX0NGRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YSwgY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9jb25maWcgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfY2ZnIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJjZmciLCAuZGVzY3IgPSAiU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YSwgY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9jb25maWcgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZ19kYXRhIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fcGF0aF8xZ19kcyAtIHN0YXRfYWxhcm1fcmFpc2VkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19EU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfaWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfaWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIiwgLmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fcGF0aF8xZ19kcyAtIHN0YXRfYWxhcm1fY2xlYXJlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCA9IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaXMgbm8gbG9uZ2VyIG1ldC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9wYXRoXzFnX2RzIC0gYXV0b19jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfc3RhdF9hbGFybV9jbGVhcmVkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX2NsZWFyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfc3RhdF9hbGFybV9yYWlzZWQgPSB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX3JhaXNlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfRFNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fcmFpc2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCwgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX3N0YXRfYWxhcm1fcmFpc2VkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fY2xlYXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX3JhaXNlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fcmFpc2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfZGF0YSIsIC5kZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiA9PT09IE9iamVjdDogZXBvbl9wYXRoXzFnX3VzID09PT0gKi8KKworLyogR3JvdXA6IGVwb25fcGF0aF8xZ191cyAtIGtleSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19rZXlfZXBvbl9uaSA9IHsgLm5hbWUgPSAiZXBvbl9uaSIsIC5kZXNjciA9ICJFUE9OIE5JIGFzc29jaWF0ZWQgd2l0aCB0aGlzIDFHIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19LRVlfSURfRVBPTl9OSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5LCBlcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGVwb25fcGF0aF8xZ191c19rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfa2V5X2Vwb25fbmkgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXlfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZXBvbl9uaSIsIC5kZXNjciA9ICJFUE9OIE5JIGFzc29jaWF0ZWQgd2l0aCB0aGlzIDFHIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5LCBlcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5IiwgLmRlc2NyID0gImtleSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXlfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX3BhdGhfMWdfdXMgLSBjZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfY2ZnX2RlZmF1bHRfZmVjX3N0YXRlID0geyAubmFtZSA9ICJkZWZhdWx0X2ZlY19zdGF0ZSIsIC5kZXNjciA9ICJEZWZhdWx0IEZFQyBlbmFibGUgc3RhdGUgZm9yIHRoZSAxRyB1cHN0cmVhbSBwYXRoIG9uIHRoaXMgRVBPTiBOSS4gIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBjaGFuZ2VkIHdoaWxlIHRoZSBFUE9OX05JIGlzIGVuYWJsZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19DRkdfSURfREVGQVVMVF9GRUNfU1RBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19kYXRhLCBkZWZhdWx0X2ZlY19zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZmVjX2VuX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX2NmZ19zeW5jX3RpbWVfdHEgPSB7IC5uYW1lID0gInN5bmNfdGltZV90cSIsIC5kZXNjciA9ICJUaW1lIHF1YW50YSBvZiBzeW5jIGF0IHN0YXJ0IG9mIFVTIGJ1cnN0LiAgVGhpcyBhdHRyaWJ1dGUgY2Fubm90IGJlIGNoYW5nZWQgd2hpbGUgdGhlIEVQT05fTkkgaXMgZW5hYmxlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0NGR19JRF9TWU5DX1RJTUVfVFEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19kYXRhLCBzeW5jX3RpbWVfdHEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX2NmZ19wcmJzX2NoZWNrZXIgPSB7IC5uYW1lID0gInByYnNfY2hlY2tlciIsIC5kZXNjciA9ICJVUyBQUkJTIGNoZWNrZXIgY29uZmlndXJhdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2RhdGEsIHByYnNfY2hlY2tlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfY2ZnX3ByYnNfc3RhdHVzID0geyAubmFtZSA9ICJwcmJzX3N0YXR1cyIsIC5kZXNjciA9ICJSZXN1bHQgb2YgVVMgUFJCUyBjaGVja2VyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0NGR19JRF9QUkJTX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2RhdGEsIHByYnNfc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcHJic19zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX3BhdGhfMWdfdXNfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX2NmZ19kZWZhdWx0X2ZlY19zdGF0ZSwgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX2NmZ19zeW5jX3RpbWVfdHEsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19jZmdfcHJic19jaGVja2VyLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfY2ZnX3ByYnNfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZGVmYXVsdF9mZWNfc3RhdGUiLCAuZGVzY3IgPSAiRGVmYXVsdCBGRUMgZW5hYmxlIHN0YXRlIGZvciB0aGUgMUcgdXBzdHJlYW0gcGF0aCBvbiB0aGlzIEVQT04gTkkuICBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgY2hhbmdlZCB3aGlsZSB0aGUgRVBPTl9OSSBpcyBlbmFibGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19kYXRhLCBkZWZhdWx0X2ZlY19zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fZmVjX2VuX3N0YXRlIH0sIHsgLm5hbWUgPSAic3luY190aW1lX3RxIiwgLmRlc2NyID0gIlRpbWUgcXVhbnRhIG9mIHN5bmMgYXQgc3RhcnQgb2YgVVMgYnVyc3QuICBUaGlzIGF0dHJpYnV0ZSBjYW5ub3QgYmUgY2hhbmdlZCB3aGlsZSB0aGUgRVBPTl9OSSBpcyBlbmFibGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19kYXRhLCBzeW5jX3RpbWVfdHEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAicHJic19jaGVja2VyIiwgLmRlc2NyID0gIlVTIFBSQlMgY2hlY2tlciBjb25maWd1cmF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2RhdGEsIHByYnNfY2hlY2tlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3ByYnNfY2hlY2tlcl9jb25maWcgfSwgeyAubmFtZSA9ICJwcmJzX3N0YXR1cyIsIC5kZXNjciA9ICJSZXN1bHQgb2YgVVMgUFJCUyBjaGVja2VyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2RhdGEsIHByYnNfc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcHJic19zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiY2ZnIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fcGF0aF8xZ191cyAtIHN0YXQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9ieXRlcyA9IHsgLm5hbWUgPSAiYnl0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBieXRlcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0JZVEVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIGJ5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19zdGF0X2ZyYW1lcyA9IHsgLm5hbWUgPSAiZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIGZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9mcmFtZXNfNjQgPSB7IC5uYW1lID0gImZyYW1lc182NCIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY0IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzY0LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIGZyYW1lc182NCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9mcmFtZXNfNjVfMTI3ID0geyAubmFtZSA9ICJmcmFtZXNfNjVfMTI3IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNjUgdG8gMTI3IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzY1XzEyNywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBmcmFtZXNfNjVfMTI3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19zdGF0X2ZyYW1lc18xMjhfMjU1ID0geyAubmFtZSA9ICJmcmFtZXNfMTI4XzI1NSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEyOCB0byAyNTUgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMTI4XzI1NSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBmcmFtZXNfMTI4XzI1NSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9mcmFtZXNfMjU2XzUxMSA9IHsgLm5hbWUgPSAiZnJhbWVzXzI1Nl81MTEiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAyNTYgdG8gNTExIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzI1Nl81MTEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzI1Nl81MTEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZnJhbWVzXzUxMl8xMDIzID0geyAubmFtZSA9ICJmcmFtZXNfNTEyXzEwMjMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA1MTIgdG8gMTAyMyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU181MTJfMTAyMywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBmcmFtZXNfNTEyXzEwMjMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZnJhbWVzXzEwMjRfMTUxOCA9IHsgLm5hbWUgPSAiZnJhbWVzXzEwMjRfMTUxOCIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEwMjQgdG8gMTUxOCBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU18xMDI0XzE1MTgsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzEwMjRfMTUxOCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9mcmFtZXNfMTUxOV8yMDQ3ID0geyAubmFtZSA9ICJmcmFtZXNfMTUxOV8yMDQ3IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTUxOSB0byAyMDQ3IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzE1MTlfMjA0NywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBmcmFtZXNfMTUxOV8yMDQ3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19zdGF0X2ZyYW1lc18yMDQ4XzQwOTUgPSB7IC5uYW1lID0gImZyYW1lc18yMDQ4XzQwOTUiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAyMDQ4IHRvIDQwOTUgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9GUkFNRVNfMjA0OF80MDk1LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIGZyYW1lc18yMDQ4XzQwOTUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZnJhbWVzXzQwOTZfOTIxNiA9IHsgLm5hbWUgPSAiZnJhbWVzXzQwOTZfOTIxNiIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDQwOTYgdG8gOTIxNiBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZSQU1FU180MDk2XzkyMTYsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzQwOTZfOTIxNiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9mcmFtZXNfOTIxN18xNjM4MyA9IHsgLm5hbWUgPSAiZnJhbWVzXzkyMTdfMTYzODMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA5MjE3IHRvIDE2MzgzIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfRlJBTUVTXzkyMTdfMTYzODMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzkyMTdfMTYzODMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYnJvYWRjYXN0X2ZyYW1lcyA9IHsgLm5hbWUgPSAiYnJvYWRjYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJyb2FkY2FzdCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9CUk9BRENBU1RfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIGJyb2FkY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YV9ieXRlcyA9IHsgLm5hbWUgPSAiZGF0YV9ieXRlcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9EQVRBX0JZVEVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIGRhdGFfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfbXVsdGljYXN0X2ZyYW1lcyA9IHsgLm5hbWUgPSAibXVsdGljYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIG11bHRpY2FzdCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9NVUxUSUNBU1RfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIG11bHRpY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfdW5pY2FzdF9mcmFtZXMgPSB7IC5uYW1lID0gInVuaWNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdW5pY2FzdCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9VTklDQVNUX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCB1bmljYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9tcGNwX2ZyYW1lcyA9IHsgLm5hbWUgPSAibXBjcF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBNUENQIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX01QQ1BfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIG1wY3BfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19zdGF0X29hbV9ieXRlcyA9IHsgLm5hbWUgPSAib2FtX2J5dGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgT0FNIGJ5dGVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfSURfT0FNX0JZVEVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIG9hbV9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9vYW1fZnJhbWVzID0geyAubmFtZSA9ICJvYW1fZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgT0FNIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX09BTV9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgb2FtX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9yZXBvcnRfZnJhbWVzID0geyAubmFtZSA9ICJyZXBvcnRfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVwb3J0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX1JFUE9SVF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgcmVwb3J0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hYm9ydF9mcmFtZXMgPSB7IC5uYW1lID0gImFib3J0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGFib3J0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0FCT1JUX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBhYm9ydF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZmNzX2Vycm9yID0geyAubmFtZSA9ICJmY3NfZXJyb3IiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBiYWQgRkNTIGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0lEX0ZDU19FUlJPUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBmY3NfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY3JjXzhfZXJyb3IgPSB7IC5uYW1lID0gImNyY184X2Vycm9yIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgQ1JDOCBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9DUkNfOF9FUlJPUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBjcmNfOF9lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9vdXRfb2Zfc2xvdCA9IHsgLm5hbWUgPSAib3V0X29mX3Nsb3QiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBvdXQgb2Ygc2xvdCBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9PVVRfT0ZfU0xPVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBvdXRfb2Zfc2xvdCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9vdmVyc2l6ZV9lcnJvciA9IHsgLm5hbWUgPSAib3ZlcnNpemVfZXJyb3IiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBvdmVyc2l6ZSBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9PVkVSU0laRV9FUlJPUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBvdmVyc2l6ZV9lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9ydW50X2Vycm9yID0geyAubmFtZSA9ICJydW50X2Vycm9yIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcnVudCBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfU1RBVF9JRF9SVU5UX0VSUk9SLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIHJ1bnRfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9wYXRoXzFnX3VzX3N0YXRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9ieXRlcywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9mcmFtZXNfNjQsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19zdGF0X2ZyYW1lc182NV8xMjcsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19zdGF0X2ZyYW1lc18xMjhfMjU1LCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9mcmFtZXNfMjU2XzUxMSwgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZnJhbWVzXzUxMl8xMDIzLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9mcmFtZXNfMTAyNF8xNTE4LCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9mcmFtZXNfMTUxOV8yMDQ3LCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9mcmFtZXNfMjA0OF80MDk1LCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9mcmFtZXNfNDA5Nl85MjE2LCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9mcmFtZXNfOTIxN18xNjM4MywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYnJvYWRjYXN0X2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YV9ieXRlcywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfbXVsdGljYXN0X2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfdW5pY2FzdF9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19zdGF0X21wY3BfZnJhbWVzLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9vYW1fYnl0ZXMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19zdGF0X29hbV9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19zdGF0X3JlcG9ydF9mcmFtZXMsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19zdGF0X2Fib3J0X2ZyYW1lcywgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZmNzX2Vycm9yLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jcmNfOF9lcnJvciwgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfb3V0X29mX3Nsb3QsICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19zdGF0X292ZXJzaXplX2Vycm9yLCAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9ydW50X2Vycm9yIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImJ5dGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIGZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfNjQiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA2NCBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBmcmFtZXNfNjQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzY1XzEyNyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY1IHRvIDEyNyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBmcmFtZXNfNjVfMTI3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc18xMjhfMjU1IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTI4IHRvIDI1NSBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBmcmFtZXNfMTI4XzI1NSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfMjU2XzUxMSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDI1NiB0byA1MTEgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzI1Nl81MTEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzUxMl8xMDIzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNTEyIHRvIDEwMjMgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzUxMl8xMDIzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc18xMDI0XzE1MTgiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMDI0IHRvIDE1MTggYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzEwMjRfMTUxOCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfMTUxOV8yMDQ3IiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTUxOSB0byAyMDQ3IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIGZyYW1lc18xNTE5XzIwNDcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZnJhbWVzXzIwNDhfNDA5NSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDIwNDggdG8gNDA5NSBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBmcmFtZXNfMjA0OF80MDk1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZyYW1lc180MDk2XzkyMTYiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiA0MDk2IHRvIDkyMTYgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzQwOTZfOTIxNiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmcmFtZXNfOTIxN18xNjM4MyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIDkyMTcgdG8gMTYzODMgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgZnJhbWVzXzkyMTdfMTYzODMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiYnJvYWRjYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJyb2FkY2FzdCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgYnJvYWRjYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJkYXRhX2J5dGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBkYXRhX2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gIm11bHRpY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBtdWx0aWNhc3QgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIG11bHRpY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidW5pY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB1bmljYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCB1bmljYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJtcGNwX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIE1QQ1AgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIG1wY3BfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gIm9hbV9ieXRlcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIE9BTSBieXRlcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBvYW1fYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAib2FtX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIE9BTSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgb2FtX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyZXBvcnRfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVwb3J0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCByZXBvcnRfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImFib3J0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGFib3J0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhLCBhYm9ydF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZmNzX2Vycm9yIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYmFkIEZDUyBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgZmNzX2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImNyY184X2Vycm9yIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgQ1JDOCBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgY3JjXzhfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAib3V0X29mX3Nsb3QiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBvdXQgb2Ygc2xvdCBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgb3V0X29mX3Nsb3QpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAib3ZlcnNpemVfZXJyb3IiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBvdmVyc2l6ZSBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSwgb3ZlcnNpemVfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnVudF9lcnJvciIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJ1bnQgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEsIHJ1bnRfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGEiLCAuZGVzY3IgPSAic3RhdCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBlcG9uX3BhdGhfMWdfdXMgLSBzdGF0X2NmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19jZmcgPSB7IC5uYW1lID0gImNmZyIsIC5kZXNjciA9ICJTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQ0ZHX0lEX0NGRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfZGF0YSwgY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9jb25maWcgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfY2ZnIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJjZmciLCAuZGVzY3IgPSAiU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfZGF0YSwgY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9jb25maWcgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19kYXRhIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fcGF0aF8xZ191cyAtIHN0YXRfYWxhcm1fcmFpc2VkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUEFUSF8xR19VU19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBlcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfaWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIiwgLmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fcGF0aF8xZ191cyAtIHN0YXRfYWxhcm1fY2xlYXJlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCA9IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaXMgbm8gbG9uZ2VyIG1ldC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZXBvbl9wYXRoXzFnX3VzIC0gYXV0b19jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfc3RhdF9hbGFybV9jbGVhcmVkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX2NsZWFyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfc3RhdF9hbGFybV9yYWlzZWQgPSB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX3JhaXNlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fcmFpc2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCwgJnByb3BfZGVzY3JfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX3N0YXRfYWxhcm1fcmFpc2VkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fY2xlYXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX3JhaXNlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fcmFpc2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfZGF0YSIsIC5kZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiA9PT09IE9iamVjdDogZXBvbl9ycCA9PT09ICovCisKKy8qIEdyb3VwOiBlcG9uX3JwIC0ga2V5ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9ycF9rZXlfZXBvbl9uaSA9IHsgLm5hbWUgPSAiZXBvbl9uaSIsIC5kZXNjciA9ICJFUE9OIE5JIGNvbnRhaW5pbmcgdGhpcyBSUC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9SUF9LRVlfSURfRVBPTl9OSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3JwX2tleSwgZXBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3JwX2tleV9saW5rX3JhdGUgPSB7IC5uYW1lID0gImxpbmtfcmF0ZSIsIC5kZXNjciA9ICJMaW5rIHJhdGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgUlAuICBNdXN0IGJlIG9uZSBvZiAxMC8xMCwgMTAvMSwgb3IgMS8xLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1JQX0tFWV9JRF9MSU5LX1JBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9ycF9rZXksIGxpbmtfcmF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fbGlua19yYXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9ycF9rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX3JwX2tleV9lcG9uX25pLCAmcHJvcF9kZXNjcl9lcG9uX3JwX2tleV9saW5rX3JhdGUgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcnBfa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImVwb25fbmkiLCAuZGVzY3IgPSAiRVBPTiBOSSBjb250YWluaW5nIHRoaXMgUlAuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3JwX2tleSwgZXBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJsaW5rX3JhdGUiLCAuZGVzY3IgPSAiTGluayByYXRlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFJQLiAgTXVzdCBiZSBvbmUgb2YgMTAvMTAsIDEwLzEsIG9yIDEvMS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcnBfa2V5LCBsaW5rX3JhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX2xpbmtfcmF0ZSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcnBfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9ycF9rZXkiLCAuZGVzY3IgPSAia2V5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcnBfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcnBfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcnBfa2V5X2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGVwb25fcnAgLSBjZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3JwX2NmZ19iYXNlX2xsaWQgPSB7IC5uYW1lID0gImJhc2VfbGxpZCIsIC5kZXNjciA9ICJCYXNlIChsb3dlc3QpIGxvZ2ljYWwgbGluayBpZGVudGlmaWVyIGZvciB0aGlzIFJQLiAgVGhpcyBhdHRyaWJ1dGUgY2Fubm90IGJlIGNoYW5nZWQgd2hpbGUgdGhlIEVQT05fTkkgaXMgZW5hYmxlZCwgbm9yIHdoaWxlIGFueSBub24tc3lzdGVtIGxpbmtzIGV4aXN0LiAgVGhlIHN1bSBvZiB0aGlzIHZhbHVlIGFuZCBtYXhfbGlua3MgZm9yIHRoaXMgUlAgbXVzdCBiZSAweDdlZmYgb3Igc21hbGxlci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9SUF9DRkdfSURfQkFTRV9MTElELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcnBfY2ZnX2RhdGEsIGJhc2VfbGxpZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3RfaGV4IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9ycF9jZmdfbXBjcF9kaXNjX2VuID0geyAubmFtZSA9ICJtcGNwX2Rpc2NfZW4iLCAuZGVzY3IgPSAiR292ZXJucyB3aGV0aGVyIGRpc2NvdmVyeSBnYXRlcyBmb3IgdGhpcyBSUCBhcmUgaXNzdWVkICIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9NUENQX0RJU0NfRU4sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9ycF9jZmdfZGF0YSwgbXBjcF9kaXNjX2VuKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9ycF9jZmdfbXBjcF9kaXNjX2dudF9sZW5fdHEgPSB7IC5uYW1lID0gIm1wY3BfZGlzY19nbnRfbGVuX3RxIiwgLmRlc2NyID0gIkxlbmd0aCBvZiBkaXNjb3ZlcnkgZ3JhbnRzIGluIHRpbWUgcXVhbnRhIGZvciB0aGlzIFJQLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9NUENQX0RJU0NfR05UX0xFTl9UUSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3JwX2NmZ19kYXRhLCBtcGNwX2Rpc2NfZ250X2xlbl90cSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3JwX2NmZ19tcGNwX3JlcG9ydF90aW1lb3V0ID0geyAubmFtZSA9ICJtcGNwX3JlcG9ydF90aW1lb3V0IiwgLmRlc2NyID0gIk51bWJlciBvZiBtcyBiZWZvcmUgbGlua3MgYXJlIGRlcmVnaXN0ZXJlZCBkdWUgdG8gbm8gcmVwb3J0IHJlY2VpdmVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9NUENQX1JFUE9SVF9USU1FT1VULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcnBfY2ZnX2RhdGEsIG1wY3BfcmVwb3J0X3RpbWVvdXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9ycF9jZmdfbWF4X21wY3BfcmVnX3Blcl9kaXNjX3dpbmRvdyA9IHsgLm5hbWUgPSAibWF4X21wY3BfcmVnX3Blcl9kaXNjX3dpbmRvdyIsIC5kZXNjciA9ICJNYXhpbXVtIG51bWJlciBvZiBNUENQIHJlZ2lzdHJhdGlvbnMgcGVyIGRpc2NvdmVyeSB3aW5kb3cgb24gdGhpcyBSUCAoMCBpbmRpY2F0ZXMgdW5saW1pdGVkKS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9SUF9DRkdfSURfTUFYX01QQ1BfUkVHX1BFUl9ESVNDX1dJTkRPVywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3JwX2NmZ19kYXRhLCBtYXhfbXBjcF9yZWdfcGVyX2Rpc2Nfd2luZG93KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2Vwb25fcnBfY2ZnX21heF9saW5rcyA9IHsgLm5hbWUgPSAibWF4X2xpbmtzIiwgLmRlc2NyID0gIk1heGltdW0gbnVtYmVyIG9mIGxpbmtzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0VQT05fUlBfQ0ZHX0lEX01BWF9MSU5LUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3JwX2NmZ19kYXRhLCBtYXhfbGlua3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZXBvbl9ycF9jZmdfZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGggPSB7IC5uYW1lID0gImRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoIiwgLmRlc2NyID0gIkRlZmF1bHQgdXBzdHJlYW0gYmFuZHdpZHRoIGZvciBuZXdseSBjcmVhdGVkIGxpbmtzLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9FUE9OX1JQX0NGR19JRF9ERUZBVUxUX1VQU1RSRUFNX0JBTkRXSURUSCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3JwX2NmZ19kYXRhLCBkZWZhdWx0X3Vwc3RyZWFtX2JhbmR3aWR0aCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Vwc3RyZWFtX2JhbmR3aWR0aF9kaXN0cmlidXRpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9lcG9uX3JwX2NmZ19yYXRlX29mX3JlZnJhY3Rpb24gPSB7IC5uYW1lID0gInJhdGVfb2ZfcmVmcmFjdGlvbiIsIC5kZXNjciA9ICJSYXRlIG9mIFJlZnJhY3Rpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfRVBPTl9SUF9DRkdfSURfUkFURV9PRl9SRUZSQUNUSU9OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcnBfY2ZnX2RhdGEsIHJhdGVfb2ZfcmVmcmFjdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfZG91YmxlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZXBvbl9ycF9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9lcG9uX3JwX2NmZ19iYXNlX2xsaWQsICZwcm9wX2Rlc2NyX2Vwb25fcnBfY2ZnX21wY3BfZGlzY19lbiwgJnByb3BfZGVzY3JfZXBvbl9ycF9jZmdfbXBjcF9kaXNjX2dudF9sZW5fdHEsICZwcm9wX2Rlc2NyX2Vwb25fcnBfY2ZnX21wY3BfcmVwb3J0X3RpbWVvdXQsICZwcm9wX2Rlc2NyX2Vwb25fcnBfY2ZnX21heF9tcGNwX3JlZ19wZXJfZGlzY193aW5kb3csICZwcm9wX2Rlc2NyX2Vwb25fcnBfY2ZnX21heF9saW5rcywgJnByb3BfZGVzY3JfZXBvbl9ycF9jZmdfZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgsICZwcm9wX2Rlc2NyX2Vwb25fcnBfY2ZnX3JhdGVfb2ZfcmVmcmFjdGlvbiB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZXBvbl9ycF9jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJiYXNlX2xsaWQiLCAuZGVzY3IgPSAiQmFzZSAobG93ZXN0KSBsb2dpY2FsIGxpbmsgaWRlbnRpZmllciBmb3IgdGhpcyBSUC4gIFRoaXMgYXR0cmlidXRlIGNhbm5vdCBiZSBjaGFuZ2VkIHdoaWxlIHRoZSBFUE9OX05JIGlzIGVuYWJsZWQsIG5vciB3aGlsZSBhbnkgbm9uLXN5c3RlbSBsaW5rcyBleGlzdC4gIFRoZSBzdW0gb2YgdGhpcyB2YWx1ZSBhbmQgbWF4X2xpbmtzIGZvciB0aGlzIFJQIG11c3QgYmUgMHg3ZWZmIG9yIHNtYWxsZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3JwX2NmZ19kYXRhLCBiYXNlX2xsaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90X2hleCB9LCB7IC5uYW1lID0gIm1wY3BfZGlzY19lbiIsIC5kZXNjciA9ICJHb3Zlcm5zIHdoZXRoZXIgZGlzY292ZXJ5IGdhdGVzIGZvciB0aGlzIFJQIGFyZSBpc3N1ZWQgIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3JwX2NmZ19kYXRhLCBtcGNwX2Rpc2NfZW4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJtcGNwX2Rpc2NfZ250X2xlbl90cSIsIC5kZXNjciA9ICJMZW5ndGggb2YgZGlzY292ZXJ5IGdyYW50cyBpbiB0aW1lIHF1YW50YSBmb3IgdGhpcyBSUC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcnBfY2ZnX2RhdGEsIG1wY3BfZGlzY19nbnRfbGVuX3RxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gIm1wY3BfcmVwb3J0X3RpbWVvdXQiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIG1zIGJlZm9yZSBsaW5rcyBhcmUgZGVyZWdpc3RlcmVkIGR1ZSB0byBubyByZXBvcnQgcmVjZWl2ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3JwX2NmZ19kYXRhLCBtcGNwX3JlcG9ydF90aW1lb3V0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gIm1heF9tcGNwX3JlZ19wZXJfZGlzY193aW5kb3ciLCAuZGVzY3IgPSAiTWF4aW11bSBudW1iZXIgb2YgTVBDUCByZWdpc3RyYXRpb25zIHBlciBkaXNjb3Zlcnkgd2luZG93IG9uIHRoaXMgUlAgKDAgaW5kaWNhdGVzIHVubGltaXRlZCkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3JwX2NmZ19kYXRhLCBtYXhfbXBjcF9yZWdfcGVyX2Rpc2Nfd2luZG93KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gIm1heF9saW5rcyIsIC5kZXNjciA9ICJNYXhpbXVtIG51bWJlciBvZiBsaW5rcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9ycF9jZmdfZGF0YSwgbWF4X2xpbmtzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gImRlZmF1bHRfdXBzdHJlYW1fYmFuZHdpZHRoIiwgLmRlc2NyID0gIkRlZmF1bHQgdXBzdHJlYW0gYmFuZHdpZHRoIGZvciBuZXdseSBjcmVhdGVkIGxpbmtzLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9ycF9jZmdfZGF0YSwgZGVmYXVsdF91cHN0cmVhbV9iYW5kd2lkdGgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91cHN0cmVhbV9iYW5kd2lkdGhfZGlzdHJpYnV0aW9uIH0sIHsgLm5hbWUgPSAicmF0ZV9vZl9yZWZyYWN0aW9uIiwgLmRlc2NyID0gIlJhdGUgb2YgUmVmcmFjdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9ycF9jZmdfZGF0YSwgcmF0ZV9vZl9yZWZyYWN0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9kb3VibGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3JwX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZXBvbl9ycF9jZmdfZGF0YSIsIC5kZXNjciA9ICJjZmciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9ycF9jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9lcG9uX3JwX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2Vwb25fcnBfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiA9PT09IE9iamVjdDogZ3BpbyA9PT09ICovCisKKy8qIEdyb3VwOiBncGlvIC0ga2V5ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bpb19rZXlfcmVzZXJ2ZWQgPSB7IC5uYW1lID0gInJlc2VydmVkIiwgLmRlc2NyID0gIlJlc2VydmVkIChzZXQgdG8gMCkuIiwgLmFjY2VzcyA9IDAsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUElPX0tFWV9JRF9SRVNFUlZFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncGlvX2tleSwgcmVzZXJ2ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bpb19rZXlfZ3Bpb19pZCA9IHsgLm5hbWUgPSAiZ3Bpb19pZCIsIC5kZXNjciA9ICJHUElPIElEIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQSU9fS0VZX0lEX0dQSU9fSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bpb19rZXksIGdwaW9faWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncGlvX3BpbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwaW9fa2V5X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bpb19rZXlfcmVzZXJ2ZWQsICZwcm9wX2Rlc2NyX2dwaW9fa2V5X2dwaW9faWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwaW9fa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJlc2VydmVkIiwgLmRlc2NyID0gIlJlc2VydmVkIChzZXQgdG8gMCkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncGlvX2tleSwgcmVzZXJ2ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiZ3Bpb19pZCIsIC5kZXNjciA9ICJHUElPIElEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncGlvX2tleSwgZ3Bpb19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwaW9fcGluIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bpb19rZXkgPSB7IC5uYW1lID0gImJjbW9sdF9ncGlvX2tleSIsIC5kZXNjciA9ICJrZXkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bpb19rZXkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bpb19rZXlfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bpb19rZXlfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3BpbyAtIGNmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwaW9fY2ZnX2RpcmVjdGlvbiA9IHsgLm5hbWUgPSAiZGlyZWN0aW9uIiwgLmRlc2NyID0gIkdQSU8gUElOIGRpcmVjdGlvbiAoaW5wdXQgb3Igb3V0cHV0KSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUElPX0NGR19JRF9ESVJFQ1RJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bpb19jZmdfZGF0YSwgZGlyZWN0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bpb19waW5fZGlyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bpb19jZmdfdmFsdWUgPSB7IC5uYW1lID0gInZhbHVlIiwgLmRlc2NyID0gIlZhbHVlIHRvIHdyaXRlLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUElPX0NGR19JRF9WQUxVRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncGlvX2NmZ19kYXRhLCB2YWx1ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwaW9fdmFsdWUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncGlvX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwaW9fY2ZnX2RpcmVjdGlvbiwgJnByb3BfZGVzY3JfZ3Bpb19jZmdfdmFsdWUgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwaW9fY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZGlyZWN0aW9uIiwgLmRlc2NyID0gIkdQSU8gUElOIGRpcmVjdGlvbiAoaW5wdXQgb3Igb3V0cHV0KSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bpb19jZmdfZGF0YSwgZGlyZWN0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bpb19waW5fZGlyIH0sIHsgLm5hbWUgPSAidmFsdWUiLCAuZGVzY3IgPSAiVmFsdWUgdG8gd3JpdGUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncGlvX2NmZ19kYXRhLCB2YWx1ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwaW9fdmFsdWUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncGlvX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bpb19jZmdfZGF0YSIsIC5kZXNjciA9ICJjZmciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bpb19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncGlvX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwaW9fY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiA9PT09IE9iamVjdDogZ3Bvbl9hbGxvYyA9PT09ICovCisKKy8qIEdyb3VwOiBncG9uX2FsbG9jIC0ga2V5ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9hbGxvY19rZXlfcG9uX25pID0geyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIG5ldHdvcmsgaW50ZXJmYWNlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fQUxMT0NfS0VZX0lEX1BPTl9OSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2tleSwgcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9hbGxvY19rZXlfYWxsb2NfaWQgPSB7IC5uYW1lID0gImFsbG9jX2lkIiwgLmRlc2NyID0gIkFsbG9jIElEIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fQUxMT0NfS0VZX0lEX0FMTE9DX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2Nfa2V5LCBhbGxvY19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX2FsbG9jX2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fYWxsb2Nfa2V5X3Bvbl9uaSwgJnByb3BfZGVzY3JfZ3Bvbl9hbGxvY19rZXlfYWxsb2NfaWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2Nfa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBvbl9uaSIsIC5kZXNjciA9ICJQT04gbmV0d29yayBpbnRlcmZhY2UiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2Nfa2V5LCBwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJhbGxvY19pZCIsIC5kZXNjciA9ICJBbGxvYyBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19rZXksIGFsbG9jX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2Nfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9hbGxvY19rZXkiLCAuZGVzY3IgPSAia2V5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2Nfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2Nfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2Nfa2V5X2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fYWxsb2MgLSBjZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2FsbG9jX2NmZ19zdGF0ZSA9IHsgLm5hbWUgPSAic3RhdGUiLCAuZGVzY3IgPSAiQ3VycmVudCBBbGxvYyBJRCBzdGF0ZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fQUxMT0NfQ0ZHX0lEX1NUQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2RhdGEsIHN0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYWxsb2Nfc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2FsbG9jX2NmZ19zbGEgPSB7IC5uYW1lID0gInNsYSIsIC5kZXNjciA9ICJBbGxvYyBJRCBTTEEiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9BTExPQ19DRkdfSURfU0xBLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2RhdGEsIHNsYSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9hbGxvY19zbGEgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2FsbG9jX2NmZ19vbnVfaWQgPSB7IC5uYW1lID0gIm9udV9pZCIsIC5kZXNjciA9ICJPTlUgSUQgdGhlIGFsbG9jIElEIGlzIGFzc2lnbmVkIHRvIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fQUxMT0NfQ0ZHX0lEX09OVV9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19kYXRhLCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9hbGxvY19jZmdfY29sbGVjdF9zdGF0cyA9IHsgLm5hbWUgPSAiY29sbGVjdF9zdGF0cyIsIC5kZXNjciA9ICJFbmFibGUgc3RhdGlzdGljcyBjb2xsZWN0aW9uIGZvciB0aGlzIGFsbG9jIElEIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fQUxMT0NfQ0ZHX0lEX0NPTExFQ1RfU1RBVFMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19jZmdfZGF0YSwgY29sbGVjdF9zdGF0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fYWxsb2NfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9hbGxvY19jZmdfc3RhdGUsICZwcm9wX2Rlc2NyX2dwb25fYWxsb2NfY2ZnX3NsYSwgJnByb3BfZGVzY3JfZ3Bvbl9hbGxvY19jZmdfb251X2lkLCAmcHJvcF9kZXNjcl9ncG9uX2FsbG9jX2NmZ19jb2xsZWN0X3N0YXRzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXRlIiwgLmRlc2NyID0gIkN1cnJlbnQgQWxsb2MgSUQgc3RhdGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2RhdGEsIHN0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYWxsb2Nfc3RhdGUgfSwgeyAubmFtZSA9ICJzbGEiLCAuZGVzY3IgPSAiQWxsb2MgSUQgU0xBIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19kYXRhLCBzbGEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25fYWxsb2Nfc2xhIH0sIHsgLm5hbWUgPSAib251X2lkIiwgLmRlc2NyID0gIk9OVSBJRCB0aGUgYWxsb2MgSUQgaXMgYXNzaWduZWQgdG8iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2RhdGEsIG9udV9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJjb2xsZWN0X3N0YXRzIiwgLmRlc2NyID0gIkVuYWJsZSBzdGF0aXN0aWNzIGNvbGxlY3Rpb24gZm9yIHRoaXMgYWxsb2MgSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2RhdGEsIGNvbGxlY3Rfc3RhdHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9hbGxvY19jZmdfZGF0YSIsIC5kZXNjciA9ICJjZmciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2NfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9hbGxvYyAtIHN0YXQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2FsbG9jX3N0YXRfcnhfYnl0ZXMgPSB7IC5uYW1lID0gInJ4X2J5dGVzIiwgLmRlc2NyID0gIlJlY2VpdmVkIEJ5dGVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9JRF9SWF9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfZGF0YSwgcnhfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9hbGxvY19zdGF0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9hbGxvY19zdGF0X3J4X2J5dGVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX3N0YXRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyeF9ieXRlcyIsIC5kZXNjciA9ICJSZWNlaXZlZCBCeXRlcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2RhdGEsIHJ4X2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2RhdGEiLCAuZGVzY3IgPSAic3RhdCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX3N0YXRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX3N0YXRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX2FsbG9jIC0gY29uZmlndXJhdGlvbl9jb21wbGV0ZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX3N0YXR1cyA9IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gIlN0YXR1cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0FMTE9DX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfbmV3X3N0YXRlID0geyAubmFtZSA9ICJuZXdfc3RhdGUiLCAuZGVzY3IgPSAibmV3IHN0YXRlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfTkVXX1NUQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSwgbmV3X3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYWxsb2Nfc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9zdGF0dXMsICZwcm9wX2Rlc2NyX2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfbmV3X3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gIlN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfSwgeyAubmFtZSA9ICJuZXdfc3RhdGUiLCAuZGVzY3IgPSAibmV3IHN0YXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEsIG5ld19zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FsbG9jX3N0YXRlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhIiwgLmRlc2NyID0gIkNvbmZpZ3VyYXRpb24gQ29tcGxldGVkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fYWxsb2MgLSBzZXRfc3RhdGUgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2FsbG9jX3NldF9zdGF0ZV9zdGF0ZSA9IHsgLm5hbWUgPSAic3RhdGUiLCAuZGVzY3IgPSAiU3RhdGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9BTExPQ19TRVRfU1RBVEVfSURfU1RBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSwgc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hbGxvY19vcGVyYXRpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX2FsbG9jX3NldF9zdGF0ZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fYWxsb2Nfc2V0X3N0YXRlX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXRlIiwgLmRlc2NyID0gIlN0YXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhLCBzdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FsbG9jX29wZXJhdGlvbiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhIiwgLmRlc2NyID0gIlNldHMgdGhlIGFsbG9jJ3MgYWN0aXZhdGlvbiBzdGF0ZS4gIFRoaXMgaXMgb25seSB1c2VkIGZvciBwcm90ZWN0aW9uIHN3aXRjaGluZyBvbiBhbiBhY3RpdmUtc3RhbmRieSBQT04uICBJbiBub3JtYWwgb3BlcmF0aW9uLCB0aGlzIGlzbid0IG5lY2Vzc2FyeSBzaW5jZSBhbGxvY3MgYXJlIGFjdGl2YXRlZC9kZWFjdGl2YXRlZCBhdXRvbWF0aWNhbGx5IGFsb25nIHdpdGggdGhlIE9OVS4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9hbGxvYyAtIGdldF9zdGF0cyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fYWxsb2NfZ2V0X3N0YXRzX251bV9vZl9jeWNsZXMgPSB7IC5uYW1lID0gIm51bV9vZl9jeWNsZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBjeWNsZXMgdG8gcnVuIHN0YXRpc3RpY3MgY29sbGVjdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0FMTE9DX0dFVF9TVEFUU19JRF9OVU1fT0ZfQ1lDTEVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEsIG51bV9vZl9jeWNsZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9hbGxvY19nZXRfc3RhdHNfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX2FsbG9jX2dldF9zdGF0c19udW1fb2ZfY3ljbGVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm51bV9vZl9jeWNsZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiBjeWNsZXMgdG8gcnVuIHN0YXRpc3RpY3MgY29sbGVjdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YSwgbnVtX29mX2N5Y2xlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YSIsIC5kZXNjciA9ICJSdW4gc3RhdGlzdGljcyBjb2xsZWN0aW9uIGZvciBhIGdpdmVuIHBlcmlvZCBvZiB0aW1lIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fYWxsb2MgLSBnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX3N0YXR1cyA9IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gInN0YXR1cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfYXZlcmFnZV9uc3JfdXNlZCA9IHsgLm5hbWUgPSAiYXZlcmFnZV9uc3JfdXNlZCIsIC5kZXNjciA9ICJBdmVyYWdlIE5TUiB1c2VkIGJ5dGVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX05TUl9VU0VELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhLCBhdmVyYWdlX25zcl91c2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9hdmVyYWdlX25zcl9hbGxvY2F0ZWQgPSB7IC5uYW1lID0gImF2ZXJhZ2VfbnNyX2FsbG9jYXRlZCIsIC5kZXNjciA9ICJBdmVyYWdlIE5TUiBhbGxvY2F0ZWQgYnl0ZXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX0FWRVJBR0VfTlNSX0FMTE9DQVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YSwgYXZlcmFnZV9uc3JfYWxsb2NhdGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9hdmVyYWdlX3NyX3JlcG9ydCA9IHsgLm5hbWUgPSAiYXZlcmFnZV9zcl9yZXBvcnQiLCAuZGVzY3IgPSAiQXZlcmFnZSBTUiByZXBvcnQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX0FWRVJBR0VfU1JfUkVQT1JULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhLCBhdmVyYWdlX3NyX3JlcG9ydCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfc3RhdHVzLCAmcHJvcF9kZXNjcl9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfYXZlcmFnZV9uc3JfdXNlZCwgJnByb3BfZGVzY3JfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2F2ZXJhZ2VfbnNyX2FsbG9jYXRlZCwgJnByb3BfZGVzY3JfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2F2ZXJhZ2Vfc3JfcmVwb3J0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0dXMiLCAuZGVzY3IgPSAic3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH0sIHsgLm5hbWUgPSAiYXZlcmFnZV9uc3JfdXNlZCIsIC5kZXNjciA9ICJBdmVyYWdlIE5TUiB1c2VkIGJ5dGVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YSwgYXZlcmFnZV9uc3JfdXNlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJhdmVyYWdlX25zcl9hbGxvY2F0ZWQiLCAuZGVzY3IgPSAiQXZlcmFnZSBOU1IgYWxsb2NhdGVkIGJ5dGVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YSwgYXZlcmFnZV9uc3JfYWxsb2NhdGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImF2ZXJhZ2Vfc3JfcmVwb3J0IiwgLmRlc2NyID0gIkF2ZXJhZ2UgU1IgcmVwb3J0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YSwgYXZlcmFnZV9zcl9yZXBvcnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJDb2xsZWN0ZWQgYWxsb2MgSUQgc3RhdGlzdGljcyBmcm9tIGdldF9zdGF0cyBvcGVyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9hbGxvYyAtIHN0YXRfY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9hbGxvY19zdGF0X2NmZ19jZmcgPSB7IC5uYW1lID0gImNmZyIsIC5kZXNjciA9ICJTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9BTExPQ19TVEFUX0NGR19JRF9DRkcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhLCBjZmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fYWxsb2Nfc3RhdF9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX2FsbG9jX3N0YXRfY2ZnX2NmZyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImNmZyIsIC5kZXNjciA9ICJTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YSwgY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9jb25maWcgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiU3RhdGlzdGljIENvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9hbGxvYyAtIHN0YXRfYWxhcm1fcmFpc2VkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9zdGF0ID0geyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0FMTE9DX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX3N0YXRfaWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9hbGxvYyAtIHN0YXRfYWxhcm1fY2xlYXJlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fQUxMT0NfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9pZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIiwgLmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBpcyBubyBsb25nZXIgbWV0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX2FsbG9jIC0gYXV0b19jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2FsbG9jX2F1dG9fY2ZnX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkID0geyAubmFtZSA9ICJjb25maWd1cmF0aW9uX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiY29uZmlndXJhdGlvbl9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0NGR19JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEsIGNvbmZpZ3VyYXRpb25fY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9hbGxvY19hdXRvX2NmZ19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkID0geyAubmFtZSA9ICJnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fQUxMT0NfQVVUT19DRkdfSURfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEsIGdldF9hbGxvY19zdGF0c19jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2FsbG9jX2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCA9IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX2NsZWFyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2FsbG9jX2F1dG9fY2ZnX3N0YXRfYWxhcm1fcmFpc2VkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fcmFpc2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9hbGxvY19hdXRvX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fYWxsb2NfYXV0b19jZmdfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQsICZwcm9wX2Rlc2NyX2dwb25fYWxsb2NfYXV0b19jZmdfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfZ3Bvbl9hbGxvY19hdXRvX2NmZ19zdGF0X2FsYXJtX2NsZWFyZWQsICZwcm9wX2Rlc2NyX2dwb25fYWxsb2NfYXV0b19jZmdfc3RhdF9hbGFybV9yYWlzZWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJjb25maWd1cmF0aW9uX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiY29uZmlndXJhdGlvbl9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfZGF0YSwgY29uZmlndXJhdGlvbl9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEsIGdldF9hbGxvY19zdGF0c19jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX2NsZWFyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9yYWlzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEiLCAuZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogPT09PSBPYmplY3Q6IGdwb25fZ2VtX3BvcnQgPT09PSAqLworCisvKiBHcm91cDogZ3Bvbl9nZW1fcG9ydCAtIGtleSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fZ2VtX3BvcnRfa2V5X3Bvbl9uaSA9IHsgLm5hbWUgPSAicG9uX25pIiwgLmRlc2NyID0gIlBPTiBuZXR3b3JrIGludGVyZmFjZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0tFWV9JRF9QT05fTkksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fZ2VtX3BvcnRfa2V5X2dlbV9wb3J0X2lkID0geyAubmFtZSA9ICJnZW1fcG9ydF9pZCIsIC5kZXNjciA9ICJHRU0gUG9ydCBJRCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0tFWV9JRF9HRU1fUE9SVF9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSwgZ2VtX3BvcnRfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9nZW1fcG9ydF9rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX2dlbV9wb3J0X2tleV9wb25fbmksICZwcm9wX2Rlc2NyX2dwb25fZ2VtX3BvcnRfa2V5X2dlbV9wb3J0X2lkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIG5ldHdvcmsgaW50ZXJmYWNlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSwgcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAiZ2VtX3BvcnRfaWQiLCAuZGVzY3IgPSAiR0VNIFBvcnQgSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5LCBnZW1fcG9ydF9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5IiwgLmRlc2NyID0gImtleSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X2tleV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X2tleV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX2dlbV9wb3J0IC0gY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9jZmdfY29uZmlndXJhdGlvbiA9IHsgLm5hbWUgPSAiY29uZmlndXJhdGlvbiIsIC5kZXNjciA9ICJHRU0gcG9ydCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DRkdfSURfQ09ORklHVVJBVElPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhLCBjb25maWd1cmF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ2VtX3BvcnRfY29uZmlndXJhdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fZ2VtX3BvcnRfY2ZnX29udV9pZCA9IHsgLm5hbWUgPSAib251X2lkIiwgLmRlc2NyID0gIk9OVSBJRCB0aGlzIEdFTSBwb3J0IGlzIGFzc2lnbmVkIHRvIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX09OVV9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhLCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9jZmdfZ2VtX3BvcnRfc3RhdGUgPSB7IC5uYW1lID0gImdlbV9wb3J0X3N0YXRlIiwgLmRlc2NyID0gIkN1cnJlbnQgR0VNIHBvcnQgc3RhdGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9HRU1fUE9SVF9TVEFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhLCBnZW1fcG9ydF9zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2dlbV9wb3J0X2NmZ19kb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSA9IHsgLm5hbWUgPSAiZG93bnN0cmVhbV9lbmNyeXB0aW9uX21vZGUiLCAuZGVzY3IgPSAiRW5hYmxlL0Rpc2FibGUgdGhlIGRvd25zdHJlYW0gZW5jcnlwdGlvbiBtb2RlIG9mIHRoZSBHRU0gUG9ydCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9ET1dOU1RSRUFNX0VOQ1JZUFRJT05fTU9ERSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhLCBkb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2dlbV9wb3J0X2NmZ191cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSA9IHsgLm5hbWUgPSAidXBzdHJlYW1fZGVzdGluYXRpb25fcXVldWUiLCAuZGVzY3IgPSAiVGhlIGRlc3RpbmF0aW9uIHF1ZXVlIG9mIHRoZSBwYWNrZXRzIGFycml2aW5nIG9uIHRoaXMgR0VNIFBvcnQgb24gdGhlIHVwc3RyZWFtIGRpcmVjdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9VUFNUUkVBTV9ERVNUSU5BVElPTl9RVUVVRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhLCB1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3VzX2dlbV9wb3J0X2Rlc3RpbmF0aW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9jZmdfY29udHJvbCA9IHsgLm5hbWUgPSAiY29udHJvbCIsIC5kZXNjciA9ICJFbmFibGUvRGlzYWJsZSB0aGUgR0VNIFBvcnQgSUQgaW4gdGhlIE9MVCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9DT05UUk9MLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2RhdGEsIGNvbnRyb2wpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb250cm9sX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9jZmdfZGVidWdfZmxvd19jb25maWcgPSB7IC5uYW1lID0gImRlYnVnX2Zsb3dfY29uZmlnIiwgLmRlc2NyID0gIlRyYWZmaWMgZmxvdyBkZWJ1ZyBvcHRpb25zIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfQ0ZHX0lEX0RFQlVHX0ZMT1dfQ09ORklHLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2RhdGEsIGRlYnVnX2Zsb3dfY29uZmlnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9kZWJ1Z19mbG93X2NvbmZpZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fZ2VtX3BvcnRfY2ZnX21hY190YWJsZV9lbnRyeV9saW1pdCA9IHsgLm5hbWUgPSAibWFjX3RhYmxlX2VudHJ5X2xpbWl0IiwgLmRlc2NyID0gIlRoZSBtYXhpbXVtIG51bWJlciBvZiBNQUMgdGFibGUgZW50cmllcyBhbGxvd2VkIGZvciB0aGlzIEdFTSBwb3J0ICgwID0gbm8gbGltaXQpLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NGR19JRF9NQUNfVEFCTEVfRU5UUllfTElNSVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSwgbWFjX3RhYmxlX2VudHJ5X2xpbWl0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fZ2VtX3BvcnRfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9jZmdfY29uZmlndXJhdGlvbiwgJnByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9jZmdfb251X2lkLCAmcHJvcF9kZXNjcl9ncG9uX2dlbV9wb3J0X2NmZ19nZW1fcG9ydF9zdGF0ZSwgJnByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9jZmdfZG93bnN0cmVhbV9lbmNyeXB0aW9uX21vZGUsICZwcm9wX2Rlc2NyX2dwb25fZ2VtX3BvcnRfY2ZnX3Vwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlLCAmcHJvcF9kZXNjcl9ncG9uX2dlbV9wb3J0X2NmZ19jb250cm9sLCAmcHJvcF9kZXNjcl9ncG9uX2dlbV9wb3J0X2NmZ19kZWJ1Z19mbG93X2NvbmZpZywgJnByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9jZmdfbWFjX3RhYmxlX2VudHJ5X2xpbWl0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImNvbmZpZ3VyYXRpb24iLCAuZGVzY3IgPSAiR0VNIHBvcnQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhLCBjb25maWd1cmF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ2VtX3BvcnRfY29uZmlndXJhdGlvbiB9LCB7IC5uYW1lID0gIm9udV9pZCIsIC5kZXNjciA9ICJPTlUgSUQgdGhpcyBHRU0gcG9ydCBpcyBhc3NpZ25lZCB0byIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSwgb251X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gImdlbV9wb3J0X3N0YXRlIiwgLmRlc2NyID0gIkN1cnJlbnQgR0VNIHBvcnQgc3RhdGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2RhdGEsIGdlbV9wb3J0X3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0ZSB9LCB7IC5uYW1lID0gImRvd25zdHJlYW1fZW5jcnlwdGlvbl9tb2RlIiwgLmRlc2NyID0gIkVuYWJsZS9EaXNhYmxlIHRoZSBkb3duc3RyZWFtIGVuY3J5cHRpb24gbW9kZSBvZiB0aGUgR0VNIFBvcnQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2RhdGEsIGRvd25zdHJlYW1fZW5jcnlwdGlvbl9tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY29udHJvbF9zdGF0ZSB9LCB7IC5uYW1lID0gInVwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlIiwgLmRlc2NyID0gIlRoZSBkZXN0aW5hdGlvbiBxdWV1ZSBvZiB0aGUgcGFja2V0cyBhcnJpdmluZyBvbiB0aGlzIEdFTSBQb3J0IG9uIHRoZSB1cHN0cmVhbSBkaXJlY3Rpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2RhdGEsIHVwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdXNfZ2VtX3BvcnRfZGVzdGluYXRpb24gfSwgeyAubmFtZSA9ICJjb250cm9sIiwgLmRlc2NyID0gIkVuYWJsZS9EaXNhYmxlIHRoZSBHRU0gUG9ydCBJRCBpbiB0aGUgT0xUIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhLCBjb250cm9sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY29udHJvbF9zdGF0ZSB9LCB7IC5uYW1lID0gImRlYnVnX2Zsb3dfY29uZmlnIiwgLmRlc2NyID0gIlRyYWZmaWMgZmxvdyBkZWJ1ZyBvcHRpb25zIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhLCBkZWJ1Z19mbG93X2NvbmZpZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZGVidWdfZmxvd19jb25maWcgfSwgeyAubmFtZSA9ICJtYWNfdGFibGVfZW50cnlfbGltaXQiLCAuZGVzY3IgPSAiVGhlIG1heGltdW0gbnVtYmVyIG9mIE1BQyB0YWJsZSBlbnRyaWVzIGFsbG93ZWQgZm9yIHRoaXMgR0VNIHBvcnQgKDAgPSBubyBsaW1pdCkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhLCBtYWNfdGFibGVfZW50cnlfbGltaXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiY2ZnIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fZ2VtX3BvcnQgLSBzdGF0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9zdGF0X3J4X3BhY2tldHMgPSB7IC5uYW1lID0gInJ4X3BhY2tldHMiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgR0VNIGZyYW1lcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfSURfUlhfUEFDS0VUUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSwgcnhfcGFja2V0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2dlbV9wb3J0X3N0YXRfcnhfYnl0ZXMgPSB7IC5uYW1lID0gInJ4X2J5dGVzIiwgLmRlc2NyID0gIlJlY2VpdmVkIGJ5dGVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSwgcnhfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9zdGF0X3R4X3BhY2tldHMgPSB7IC5uYW1lID0gInR4X3BhY2tldHMiLCAuZGVzY3IgPSAiVHJhbnNtaXR0ZWQgR0VNIGZyYW1lcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfSURfVFhfUEFDS0VUUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSwgdHhfcGFja2V0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2dlbV9wb3J0X3N0YXRfdHhfYnl0ZXMgPSB7IC5uYW1lID0gInR4X2J5dGVzIiwgLmRlc2NyID0gIlRyYW5zbWl0dGVkIGJ5dGVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9JRF9UWF9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSwgdHhfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9nZW1fcG9ydF9zdGF0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9zdGF0X3J4X3BhY2tldHMsICZwcm9wX2Rlc2NyX2dwb25fZ2VtX3BvcnRfc3RhdF9yeF9ieXRlcywgJnByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9zdGF0X3R4X3BhY2tldHMsICZwcm9wX2Rlc2NyX2dwb25fZ2VtX3BvcnRfc3RhdF90eF9ieXRlcyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicnhfcGFja2V0cyIsIC5kZXNjciA9ICJSZWNlaXZlZCBHRU0gZnJhbWVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSwgcnhfcGFja2V0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9ieXRlcyIsIC5kZXNjciA9ICJSZWNlaXZlZCBieXRlcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGEsIHJ4X2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInR4X3BhY2tldHMiLCAuZGVzY3IgPSAiVHJhbnNtaXR0ZWQgR0VNIGZyYW1lcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGEsIHR4X3BhY2tldHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfYnl0ZXMiLCAuZGVzY3IgPSAiVHJhbnNtaXR0ZWQgYnl0ZXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9kYXRhLCB0eF9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9kYXRhIiwgLmRlc2NyID0gInN0YXQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9nZW1fcG9ydCAtIGNvbmZpZ3VyYXRpb25fY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9zdGF0dXMgPSB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX25ld19zdGF0ZSA9IHsgLm5hbWUgPSAibmV3X3N0YXRlIiwgLmRlc2NyID0gIm5ldyBzdGF0ZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX05FV19TVEFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEsIG5ld19zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9zdGF0dXMsICZwcm9wX2Rlc2NyX2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfbmV3X3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gInN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfSwgeyAubmFtZSA9ICJuZXdfc3RhdGUiLCAuZGVzY3IgPSAibmV3IHN0YXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEsIG5ld19zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEiLCAuZGVzY3IgPSAiQ29uZmlndXJhdGlvbiBDb21wbGV0ZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9nZW1fcG9ydCAtIHNldF9zdGF0ZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX3N0YXRlID0geyAubmFtZSA9ICJzdGF0ZSIsIC5kZXNjciA9ICJTdGF0ZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NFVF9TVEFURV9JRF9TVEFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9kYXRhLCBzdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dlbV9wb3J0X29wZXJhdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGVfc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdGUiLCAuZGVzY3IgPSAiU3RhdGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2RhdGEsIHN0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ2VtX3BvcnRfb3BlcmF0aW9uIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGVfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2RhdGEiLCAuZGVzY3IgPSAiU2V0cyB0aGUgR0VNIHBvcnQncyBhY3RpdmF0aW9uIHN0YXRlLiAgVGhpcyBpcyBvbmx5IHVzZWQgZm9yIHByb3RlY3Rpb24gc3dpdGNoaW5nIG9uIGFuIGFjdGl2ZS1zdGFuZGJ5IFBPTi4gIEluIG5vcm1hbCBvcGVyYXRpb24sIHRoaXMgaXNuJ3QgbmVjZXNzYXJ5IHNpbmNlIEdFTSBwb3J0cyBhcmUgYWN0aXZhdGVkL2RlYWN0aXZhdGVkIGF1dG9tYXRpY2FsbHkgYWxvbmcgd2l0aCB0aGUgT05VLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGVfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX2dlbV9wb3J0IC0gc3RhdF9jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2NmZyA9IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRfQ0ZHX0lEX0NGRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfY2ZnIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhLCBjZmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YSIsIC5kZXNjciA9ICJTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX2dlbV9wb3J0IC0gc3RhdF9hbGFybV9yYWlzZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fR0VNX1BPUlRfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfaWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9zdGF0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX2dlbV9wb3J0IC0gc3RhdF9hbGFybV9jbGVhcmVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCA9IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9zdGF0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2lkIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fZ2VtX3BvcnQgLSBhdXRvX2NmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQgPSB7IC5uYW1lID0gImNvbmZpZ3VyYXRpb25fY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJjb25maWd1cmF0aW9uX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0dFTV9QT1JUX0FVVE9fQ0ZHX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YSwgY29uZmlndXJhdGlvbl9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCA9IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX2NsZWFyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX3N0YXRfYWxhcm1fcmFpc2VkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fcmFpc2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQsICZwcm9wX2Rlc2NyX2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfc3RhdF9hbGFybV9jbGVhcmVkLCAmcHJvcF9kZXNjcl9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX3N0YXRfYWxhcm1fcmFpc2VkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY29uZmlndXJhdGlvbl9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImNvbmZpZ3VyYXRpb25fY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEsIGNvbmZpZ3VyYXRpb25fY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9jbGVhcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fcmFpc2VkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fcmFpc2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhIiwgLmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qID09PT0gT2JqZWN0OiBncG9uX2l3ZiA9PT09ICovCisKKy8qIEdyb3VwOiBncG9uX2l3ZiAtIGtleSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX2tleV9wb25fbmkgPSB7IC5uYW1lID0gInBvbl9uaSIsIC5kZXNjciA9ICJQT04gbmV0d29yayBpbnRlcmZhY2UiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfS0VZX0lEX1BPTl9OSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25faXdmX2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25faXdmX2tleV9wb25fbmkgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIG5ldHdvcmsgaW50ZXJmYWNlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX2tleSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25faXdmX2tleSIsIC5kZXNjciA9ICJrZXkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2Zfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX2tleV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9rZXlfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9pd2YgLSBjZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl9jZmdfaXdmX21vZGUgPSB7IC5uYW1lID0gIml3Zl9tb2RlIiwgLmRlc2NyID0gIklXRiBtYXBwaW5nIG1vZGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX0lXRl9NT0RFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2NmZ19kYXRhLCBpd2ZfbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2l3Zl9tb2RlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2ZfY2ZnX3VzX3RwaWRfcGVyX2Zsb3cgPSB7IC5uYW1lID0gInVzX3RwaWRfcGVyX2Zsb3ciLCAuZGVzY3IgPSAiVFBJRCB2YWx1ZSBvZiB0aGUgVkxBTiB0YWcgYWRkZWQgdG8gdXBzdHJlYW0gcGFja2V0IHdoZW4gSVdGIG1vZGUgaXMgc2V0IHRvIHBlciBmbG93IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX0NGR19JRF9VU19UUElEX1BFUl9GTE9XLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2NmZ19kYXRhLCB1c190cGlkX3Blcl9mbG93KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX3UxNl8yX2hleCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX2NmZ191c19vdGFnX2RpcmVjdF90cGlkID0geyAubmFtZSA9ICJ1c19vdGFnX2RpcmVjdF90cGlkIiwgLmRlc2NyID0gIlRQSUQgdmFsdWUgb2YgdGhlIFZMQU4gdGFnIGFkZGVkIHRvIHVwc3RyZWFtIHBhY2tldCB3aGVuIElXRiBtb2RlIGlzIHNldCB0byBkaXJlY3QgbW9kZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfVVNfT1RBR19ESVJFQ1RfVFBJRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YSwgdXNfb3RhZ19kaXJlY3RfdHBpZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3RfaGV4IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2ZfY2ZnX3VzX290YWdfZGlyZWN0X3BiaXQgPSB7IC5uYW1lID0gInVzX290YWdfZGlyZWN0X3BiaXQiLCAuZGVzY3IgPSAiUC1iaXQgdmFsdWUgb2YgdGhlIFZMQU4gdGFnIGFkZGVkIHRvIHVwc3RyZWFtIHBhY2tldCB3aGVuIElXRiBtb2RlIGlzIHNldCB0byBkaXJlY3QgbW9kZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfVVNfT1RBR19ESVJFQ1RfUEJJVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YSwgdXNfb3RhZ19kaXJlY3RfcGJpdCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX2NmZ19kc190cGlkID0geyAubmFtZSA9ICJkc190cGlkIiwgLmRlc2NyID0gIlBhY2tldHMgbWFya2VkIHdpdGggb25lIG9mIHRoZSBmaXZlIGNvbmZpZ3VyZWQgRFMgVFBJRCBvcHRpb25zIHdpbGwgYmUgZm9yd2FyZGVkLCBhbGwgdGhlIHJlc3Qgd2lsbCBiZSBkcm9wcGVkIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX0NGR19JRF9EU19UUElELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2NmZ19kYXRhLCBkc190cGlkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX3UxNl81X2hleCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX2NmZ19tYWNfdGFibGVfY29uZmlndXJhdGlvbiA9IHsgLm5hbWUgPSAibWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24iLCAuZGVzY3IgPSAiTUFDIHRhYmxlIGNvbmZpZ3VyYXRpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfQ0ZHX0lEX01BQ19UQUJMRV9DT05GSUdVUkFUSU9OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2NmZ19kYXRhLCBtYWNfdGFibGVfY29uZmlndXJhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X21hY190YWJsZV9jb25maWd1cmF0aW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2ZfY2ZnX2RlYnVnX2Zsb3dfY29uZmlndXJhdGlvbiA9IHsgLm5hbWUgPSAiZGVidWdfZmxvd19jb25maWd1cmF0aW9uIiwgLmRlc2NyID0gIk1BQyB0YWJsZSBjb25maWd1cmF0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX0NGR19JRF9ERUJVR19GTE9XX0NPTkZJR1VSQVRJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGEsIGRlYnVnX2Zsb3dfY29uZmlndXJhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX2RlYnVnX2Zsb3dfY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2ZfY2ZnX21hY190YWJsZV9jb3VudCA9IHsgLm5hbWUgPSAibWFjX3RhYmxlX2NvdW50IiwgLmRlc2NyID0gIk51bWJlciBvZiBNQUMgdGFibGUgZW50cmllcyBjb25maWd1cmVkIGluIHRoZSBNQUMgdGFibGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfTUFDX1RBQkxFX0NPVU5ULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2NmZ19kYXRhLCBtYWNfdGFibGVfY291bnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2ZfY2ZnX2ZvcmJpZGRlbl92bGFuX2Zsb3dfZ2VtX3JhbmdlX3N0YXJ0ID0geyAubmFtZSA9ICJmb3JiaWRkZW5fdmxhbl9mbG93X2dlbV9yYW5nZV9zdGFydCIsIC5kZXNjciA9ICJGb3JiaWRkZW4gcmFuZ2UgZm9yIFZsYW5zLCBGbG93cyBhbmQgR2VtcyBzdGFydCB2YWx1ZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9DRkdfSURfRk9SQklEREVOX1ZMQU5fRkxPV19HRU1fUkFOR0VfU1RBUlQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGEsIGZvcmJpZGRlbl92bGFuX2Zsb3dfZ2VtX3JhbmdlX3N0YXJ0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25faXdmX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25faXdmX2NmZ19pd2ZfbW9kZSwgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfY2ZnX3VzX3RwaWRfcGVyX2Zsb3csICZwcm9wX2Rlc2NyX2dwb25faXdmX2NmZ191c19vdGFnX2RpcmVjdF90cGlkLCAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9jZmdfdXNfb3RhZ19kaXJlY3RfcGJpdCwgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfY2ZnX2RzX3RwaWQsICZwcm9wX2Rlc2NyX2dwb25faXdmX2NmZ19tYWNfdGFibGVfY29uZmlndXJhdGlvbiwgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfY2ZnX2RlYnVnX2Zsb3dfY29uZmlndXJhdGlvbiwgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfY2ZnX21hY190YWJsZV9jb3VudCwgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfY2ZnX2ZvcmJpZGRlbl92bGFuX2Zsb3dfZ2VtX3JhbmdlX3N0YXJ0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJpd2ZfbW9kZSIsIC5kZXNjciA9ICJJV0YgbWFwcGluZyBtb2RlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YSwgaXdmX21vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9pd2ZfbW9kZSB9LCB7IC5uYW1lID0gInVzX3RwaWRfcGVyX2Zsb3ciLCAuZGVzY3IgPSAiVFBJRCB2YWx1ZSBvZiB0aGUgVkxBTiB0YWcgYWRkZWQgdG8gdXBzdHJlYW0gcGFja2V0IHdoZW4gSVdGIG1vZGUgaXMgc2V0IHRvIHBlciBmbG93IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YSwgdXNfdHBpZF9wZXJfZmxvdyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl91MTZfMl9oZXggfSwgeyAubmFtZSA9ICJ1c19vdGFnX2RpcmVjdF90cGlkIiwgLmRlc2NyID0gIlRQSUQgdmFsdWUgb2YgdGhlIFZMQU4gdGFnIGFkZGVkIHRvIHVwc3RyZWFtIHBhY2tldCB3aGVuIElXRiBtb2RlIGlzIHNldCB0byBkaXJlY3QgbW9kZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGEsIHVzX290YWdfZGlyZWN0X3RwaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90X2hleCB9LCB7IC5uYW1lID0gInVzX290YWdfZGlyZWN0X3BiaXQiLCAuZGVzY3IgPSAiUC1iaXQgdmFsdWUgb2YgdGhlIFZMQU4gdGFnIGFkZGVkIHRvIHVwc3RyZWFtIHBhY2tldCB3aGVuIElXRiBtb2RlIGlzIHNldCB0byBkaXJlY3QgbW9kZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGEsIHVzX290YWdfZGlyZWN0X3BiaXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJkc190cGlkIiwgLmRlc2NyID0gIlBhY2tldHMgbWFya2VkIHdpdGggb25lIG9mIHRoZSBmaXZlIGNvbmZpZ3VyZWQgRFMgVFBJRCBvcHRpb25zIHdpbGwgYmUgZm9yd2FyZGVkLCBhbGwgdGhlIHJlc3Qgd2lsbCBiZSBkcm9wcGVkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YSwgZHNfdHBpZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl91MTZfNV9oZXggfSwgeyAubmFtZSA9ICJtYWNfdGFibGVfY29uZmlndXJhdGlvbiIsIC5kZXNjciA9ICJNQUMgdGFibGUgY29uZmlndXJhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGEsIG1hY190YWJsZV9jb25maWd1cmF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24gfSwgeyAubmFtZSA9ICJkZWJ1Z19mbG93X2NvbmZpZ3VyYXRpb24iLCAuZGVzY3IgPSAiTUFDIHRhYmxlIGNvbmZpZ3VyYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2NmZ19kYXRhLCBkZWJ1Z19mbG93X2NvbmZpZ3VyYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9kZWJ1Z19mbG93X2NvbmZpZyB9LCB7IC5uYW1lID0gIm1hY190YWJsZV9jb3VudCIsIC5kZXNjciA9ICJOdW1iZXIgb2YgTUFDIHRhYmxlIGVudHJpZXMgY29uZmlndXJlZCBpbiB0aGUgTUFDIHRhYmxlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YSwgbWFjX3RhYmxlX2NvdW50KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gImZvcmJpZGRlbl92bGFuX2Zsb3dfZ2VtX3JhbmdlX3N0YXJ0IiwgLmRlc2NyID0gIkZvcmJpZGRlbiByYW5nZSBmb3IgVmxhbnMsIEZsb3dzIGFuZCBHZW1zIHN0YXJ0IHZhbHVlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YSwgZm9yYmlkZGVuX3ZsYW5fZmxvd19nZW1fcmFuZ2Vfc3RhcnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YSIsIC5kZXNjciA9ICJjZmciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9pd2YgLSBzdGF0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2Zfc3RhdF9kc19oaXRfZXZlbnQgPSB7IC5uYW1lID0gImRzX2hpdF9ldmVudCIsIC5kZXNjciA9ICJEUyBoaXQgZXZlbnQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9EU19ISVRfRVZFTlQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9kYXRhLCBkc19oaXRfZXZlbnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2Zfc3RhdF9kc19taXNzX2V2ZW50ID0geyAubmFtZSA9ICJkc19taXNzX2V2ZW50IiwgLmRlc2NyID0gIkRTIG1pc3MgZXZlbnQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9JRF9EU19NSVNTX0VWRU5ULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YSwgZHNfbWlzc19ldmVudCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl9zdGF0X2RzX2Ryb3BfZHVlX3RvX21pc3NfZXZlbnQgPSB7IC5uYW1lID0gImRzX2Ryb3BfZHVlX3RvX21pc3NfZXZlbnQiLCAuZGVzY3IgPSAiRFMgZHJvcCBkdWUgdG8gbWlzcyBldmVudCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX0RTX0RST1BfRFVFX1RPX01JU1NfRVZFTlQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9kYXRhLCBkc19kcm9wX2R1ZV90b19taXNzX2V2ZW50KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX3N0YXRfZHNfZHJvcF9kdWVfdG9faGl0X2V2ZW50ID0geyAubmFtZSA9ICJkc19kcm9wX2R1ZV90b19oaXRfZXZlbnQiLCAuZGVzY3IgPSAiRFMgZHJvcCBkdWUgdG8gaGl0IGV2ZW50IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfRFJPUF9EVUVfVE9fSElUX0VWRU5ULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YSwgZHNfZHJvcF9kdWVfdG9faGl0X2V2ZW50KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX3N0YXRfZHNfZHJvcF90b19kaXNhYmxlZF9nZW0gPSB7IC5uYW1lID0gImRzX2Ryb3BfdG9fZGlzYWJsZWRfZ2VtIiwgLmRlc2NyID0gIkRTIGRyb3AgdG8gZGlzYWJsZWQgR0VNIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfRFNfRFJPUF9UT19ESVNBQkxFRF9HRU0sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9kYXRhLCBkc19kcm9wX3RvX2Rpc2FibGVkX2dlbSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl9zdGF0X25ld19tYWNfZGlzY292ZXJlZCA9IHsgLm5hbWUgPSAibmV3X21hY19kaXNjb3ZlcmVkIiwgLmRlc2NyID0gIk5ldyBNQUMgZGlzY292ZXJlZCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX05FV19NQUNfRElTQ09WRVJFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2RhdGEsIG5ld19tYWNfZGlzY292ZXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl9zdGF0X21vdmVfZXZlbnQgPSB7IC5uYW1lID0gIm1vdmVfZXZlbnQiLCAuZGVzY3IgPSAiTW92ZSBldmVudCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0lEX01PVkVfRVZFTlQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9kYXRhLCBtb3ZlX2V2ZW50KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX3N0YXRfbmV3X21hY19kcm9wX2R1ZV90b19maWZvX2Z1bGwgPSB7IC5uYW1lID0gIm5ld19tYWNfZHJvcF9kdWVfdG9fZmlmb19mdWxsIiwgLmRlc2NyID0gIk5ldyBNQUMgZHJvcCBkdWUgdG8gZmlmbyBmdWxsIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX1NUQVRfSURfTkVXX01BQ19EUk9QX0RVRV9UT19GSUZPX0ZVTEwsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9kYXRhLCBuZXdfbWFjX2Ryb3BfZHVlX3RvX2ZpZm9fZnVsbCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX2l3Zl9zdGF0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9pd2Zfc3RhdF9kc19oaXRfZXZlbnQsICZwcm9wX2Rlc2NyX2dwb25faXdmX3N0YXRfZHNfbWlzc19ldmVudCwgJnByb3BfZGVzY3JfZ3Bvbl9pd2Zfc3RhdF9kc19kcm9wX2R1ZV90b19taXNzX2V2ZW50LCAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9zdGF0X2RzX2Ryb3BfZHVlX3RvX2hpdF9ldmVudCwgJnByb3BfZGVzY3JfZ3Bvbl9pd2Zfc3RhdF9kc19kcm9wX3RvX2Rpc2FibGVkX2dlbSwgJnByb3BfZGVzY3JfZ3Bvbl9pd2Zfc3RhdF9uZXdfbWFjX2Rpc2NvdmVyZWQsICZwcm9wX2Rlc2NyX2dwb25faXdmX3N0YXRfbW92ZV9ldmVudCwgJnByb3BfZGVzY3JfZ3Bvbl9pd2Zfc3RhdF9uZXdfbWFjX2Ryb3BfZHVlX3RvX2ZpZm9fZnVsbCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2Zfc3RhdF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImRzX2hpdF9ldmVudCIsIC5kZXNjciA9ICJEUyBoaXQgZXZlbnQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YSwgZHNfaGl0X2V2ZW50KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImRzX21pc3NfZXZlbnQiLCAuZGVzY3IgPSAiRFMgbWlzcyBldmVudCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9kYXRhLCBkc19taXNzX2V2ZW50KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImRzX2Ryb3BfZHVlX3RvX21pc3NfZXZlbnQiLCAuZGVzY3IgPSAiRFMgZHJvcCBkdWUgdG8gbWlzcyBldmVudCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9kYXRhLCBkc19kcm9wX2R1ZV90b19taXNzX2V2ZW50KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImRzX2Ryb3BfZHVlX3RvX2hpdF9ldmVudCIsIC5kZXNjciA9ICJEUyBkcm9wIGR1ZSB0byBoaXQgZXZlbnQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YSwgZHNfZHJvcF9kdWVfdG9faGl0X2V2ZW50KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImRzX2Ryb3BfdG9fZGlzYWJsZWRfZ2VtIiwgLmRlc2NyID0gIkRTIGRyb3AgdG8gZGlzYWJsZWQgR0VNIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2RhdGEsIGRzX2Ryb3BfdG9fZGlzYWJsZWRfZ2VtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gIm5ld19tYWNfZGlzY292ZXJlZCIsIC5kZXNjciA9ICJOZXcgTUFDIGRpc2NvdmVyZWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YSwgbmV3X21hY19kaXNjb3ZlcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gIm1vdmVfZXZlbnQiLCAuZGVzY3IgPSAiTW92ZSBldmVudCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9kYXRhLCBtb3ZlX2V2ZW50KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gIm5ld19tYWNfZHJvcF9kdWVfdG9fZmlmb19mdWxsIiwgLmRlc2NyID0gIk5ldyBNQUMgZHJvcCBkdWUgdG8gZmlmbyBmdWxsIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2RhdGEsIG5ld19tYWNfZHJvcF9kdWVfdG9fZmlmb19mdWxsKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YSIsIC5kZXNjciA9ICJzdGF0IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9zdGF0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2Zfc3RhdF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25faXdmIC0gZmx1c2hfbWFjX3RhYmxlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2NvbnRyb2wgPSB7IC5uYW1lID0gImNvbnRyb2wiLCAuZGVzY3IgPSAiY29udHJvbCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9GTFVTSF9NQUNfVEFCTEVfSURfQ09OVFJPTCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfZGF0YSwgY29udHJvbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2ZsdXNoX21hY190YWJsZV9vcHRpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfdmlkID0geyAubmFtZSA9ICJ2aWQiLCAuZGVzY3IgPSAiVklEIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX0ZMVVNIX01BQ19UQUJMRV9JRF9WSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2RhdGEsIHZpZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfZmxvd19pZCA9IHsgLm5hbWUgPSAiZmxvd19pZCIsIC5kZXNjciA9ICJGTE9XIElEIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX0ZMVVNIX01BQ19UQUJMRV9JRF9GTE9XX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9kYXRhLCBmbG93X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25faXdmX2ZsdXNoX21hY190YWJsZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25faXdmX2ZsdXNoX21hY190YWJsZV9jb250cm9sLCAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfdmlkLCAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfZmxvd19pZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY29udHJvbCIsIC5kZXNjciA9ICJjb250cm9sIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfZGF0YSwgY29udHJvbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2ZsdXNoX21hY190YWJsZV9vcHRpb24gfSwgeyAubmFtZSA9ICJ2aWQiLCAuZGVzY3IgPSAiVklEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfZGF0YSwgdmlkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gImZsb3dfaWQiLCAuZGVzY3IgPSAiRkxPVyBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2RhdGEsIGZsb3dfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfZGF0YSIsIC5kZXNjciA9ICJGbHVzaCBNQUMgVGFibGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9pd2YgLSBzY2FuX21hY190YWJsZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX21hY19hZGRyZXNzID0geyAubmFtZSA9ICJtYWNfYWRkcmVzcyIsIC5kZXNjciA9ICJFbnRyeSBNQUMgYWRkcmVzcy4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfU0NBTl9NQUNfVEFCTEVfSURfTUFDX0FERFJFU1MsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfZGF0YSwgbWFjX2FkZHJlc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX21hY19hZGRyZXNzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9tYWNfYWRkcmVzcyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJtYWNfYWRkcmVzcyIsIC5kZXNjciA9ICJFbnRyeSBNQUMgYWRkcmVzcy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2RhdGEsIG1hY19hZGRyZXNzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19tYWNfYWRkcmVzcyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9kYXRhIiwgLmRlc2NyID0gIlNjYW5zIE1BQyB0YWJsZSBmb3IgYSBnaXZlbiBNQUMgYWRkcmVzcyB0aGVuIHJldHVybnMgdGhlIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9pd2YgLSBmbHVzaF9tYWNfdGFibGVfY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZF9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiBncG9uX2l3ZiAtIHNjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9tYWNfYWRkcmVzcyA9IHsgLm5hbWUgPSAibWFjX2FkZHJlc3MiLCAuZGVzY3IgPSAiRW50cnkgTUFDIGFkZHJlc3MuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX1NDQU5fTUFDX1RBQkxFX0NPTVBMRVRFRF9JRF9NQUNfQUREUkVTUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfZGF0YSwgbWFjX2FkZHJlc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX21hY19hZGRyZXNzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX2VudHJpZXMgPSB7IC5uYW1lID0gImVudHJpZXMiLCAuZGVzY3IgPSAiU2NhbiByZXN1bHRzIGZvciB0aGlzIGVudHJ5LiAgSWYgdGhpcyBsaXN0IGlzIGVtcHR5LCB0aGUgTUFDIGFkZHJlc3Mgd2FzIG5vdCBmb3VuZCBpbiB0aGUgdGFibGUuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX1NDQU5fTUFDX1RBQkxFX0NPTVBMRVRFRF9JRF9FTlRSSUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9kYXRhLCBlbnRyaWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9tYWNfdGFibGVfc2Nhbl9yZXN1bHRfbGlzdF91MTYgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfbWFjX2FkZHJlc3MsICZwcm9wX2Rlc2NyX2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9lbnRyaWVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJtYWNfYWRkcmVzcyIsIC5kZXNjciA9ICJFbnRyeSBNQUMgYWRkcmVzcy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9kYXRhLCBtYWNfYWRkcmVzcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfbWFjX2FkZHJlc3MgfSwgeyAubmFtZSA9ICJlbnRyaWVzIiwgLmRlc2NyID0gIlNjYW4gcmVzdWx0cyBmb3IgdGhpcyBlbnRyeS4gIElmIHRoaXMgbGlzdCBpcyBlbXB0eSwgdGhlIE1BQyBhZGRyZXNzIHdhcyBub3QgZm91bmQgaW4gdGhlIHRhYmxlLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX2RhdGEsIGVudHJpZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX21hY190YWJsZV9zY2FuX3Jlc3VsdF9saXN0X3UxNiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX2RhdGEiLCAuZGVzY3IgPSAiQSBNQUMgdGFibGUgc2NhbiBpbml0aWF0ZWQgdXNpbmcgdGhlIFwic2Nhbl9tYWNfdGFibGVcIiBvcGVyYXRpb24gaXMgY29tcGxldGUuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25faXdmIC0gc3RhdF9jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl9zdGF0X2NmZ19jZmcgPSB7IC5uYW1lID0gImNmZyIsIC5kZXNjciA9ICJTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9DRkdfSURfQ0ZHLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9pd2Zfc3RhdF9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9zdGF0X2NmZ19jZmcgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3N0YXRfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfZGF0YSwgY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9jb25maWcgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfZGF0YSIsIC5kZXNjciA9ICJTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3N0YXRfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2Zfc3RhdF9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX2l3ZiAtIHN0YXRfYWxhcm1fcmFpc2VkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfc3RhdCA9IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2Zfc3RhdF9pZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3N0YXRfaWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX2l3ZiAtIHN0YXRfYWxhcm1fY2xlYXJlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9zdGF0ID0geyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3N0YXRfaWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2Zfc3RhdF9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25faXdmIC0gYXV0b19jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl9hdXRvX2NmZ19mbHVzaF9tYWNfdGFibGVfY29tcGxldGVkID0geyAubmFtZSA9ICJmbHVzaF9tYWNfdGFibGVfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJmbHVzaF9tYWNfdGFibGVfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX0FVVE9fQ0ZHX0lEX0ZMVVNIX01BQ19UQUJMRV9DT01QTEVURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YSwgZmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX2F1dG9fY2ZnX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZCA9IHsgLm5hbWUgPSAic2Nhbl9tYWNfdGFibGVfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzY2FuX21hY190YWJsZV9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfQVVUT19DRkdfSURfU0NBTl9NQUNfVEFCTEVfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2RhdGEsIHNjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCA9IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fY2xlYXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX2F1dG9fY2ZnX3N0YXRfYWxhcm1fcmFpc2VkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9yYWlzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX2l3Zl9hdXRvX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25faXdmX2F1dG9fY2ZnX2ZsdXNoX21hY190YWJsZV9jb21wbGV0ZWQsICZwcm9wX2Rlc2NyX2dwb25faXdmX2F1dG9fY2ZnX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfYXV0b19jZmdfc3RhdF9hbGFybV9jbGVhcmVkLCAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9hdXRvX2NmZ19zdGF0X2FsYXJtX3JhaXNlZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJmbHVzaF9tYWNfdGFibGVfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJmbHVzaF9tYWNfdGFibGVfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19kYXRhLCBmbHVzaF9tYWNfdGFibGVfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic2Nhbl9tYWNfdGFibGVfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzY2FuX21hY190YWJsZV9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2RhdGEsIHNjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9jbGVhcmVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX2NsZWFyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fcmFpc2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2RhdGEiLCAuZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogPT09PSBPYmplY3Q6IGdwb25faXdmX2RzX2VncmVzc19mbG93ID09PT0gKi8KKworLyogR3JvdXA6IGdwb25faXdmX2RzX2VncmVzc19mbG93IC0ga2V5ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5X3Bvbl9uaSA9IHsgLm5hbWUgPSAicG9uX25pIiwgLmRlc2NyID0gIlBPTiBuZXR3b3JrIGludGVyZmFjZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19LRVlfSURfUE9OX05JLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleSwgcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5X2Zsb3dfaWQgPSB7IC5uYW1lID0gImZsb3dfaWQiLCAuZGVzY3IgPSAiRmxvdyBJRCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPV19LRVlfSURfRkxPV19JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXksIGZsb3dfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5X3Bvbl9uaSwgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5X2Zsb3dfaWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIG5ldHdvcmsgaW50ZXJmYWNlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gImZsb3dfaWQiLCAuZGVzY3IgPSAiRmxvdyBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5LCBmbG93X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleSIsIC5kZXNjciA9ICJrZXkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2tleV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXlfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3cgLSBjZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfZ2VtX3BvcnQgPSB7IC5uYW1lID0gImdlbV9wb3J0IiwgLmRlc2NyID0gIkdFTSBwb3J0IElEIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX0RTX0VHUkVTU19GTE9XX0NGR19JRF9HRU1fUE9SVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfZGF0YSwgZ2VtX3BvcnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX3BiaXRfY29udHJvbCA9IHsgLm5hbWUgPSAicGJpdF9jb250cm9sIiwgLmRlc2NyID0gIklmIGVuYWJsZWQsIHRoZSBQYml0cyB2YWx1ZSBpcyB0YWtlbiBmcm9tIHRoZSBtYXBwaW5nIFZMQU4gdGFnIChJbm5lci9PdXRlcikgVkxBTiBQYml0cyBsb2NhdGlvbiBhbmQgYWRkZWQgdG8gdGhlIGNvbmZpZ3VyZWQgR0VNIHBvcnQgSUQgdmFsdWUgdG8gY3JlYXRlIHRoZSBGaW5hbCBHRU0gSUQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1dfQ0ZHX0lEX1BCSVRfQ09OVFJPTCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfZGF0YSwgcGJpdF9jb250cm9sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2dlbV9wb3J0LCAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfcGJpdF9jb250cm9sIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJnZW1fcG9ydCIsIC5kZXNjciA9ICJHRU0gcG9ydCBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2RhdGEsIGdlbV9wb3J0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gInBiaXRfY29udHJvbCIsIC5kZXNjciA9ICJJZiBlbmFibGVkLCB0aGUgUGJpdHMgdmFsdWUgaXMgdGFrZW4gZnJvbSB0aGUgbWFwcGluZyBWTEFOIHRhZyAoSW5uZXIvT3V0ZXIpIFZMQU4gUGJpdHMgbG9jYXRpb24gYW5kIGFkZGVkIHRvIHRoZSBjb25maWd1cmVkIEdFTSBwb3J0IElEIHZhbHVlIHRvIGNyZWF0ZSB0aGUgRmluYWwgR0VNIElEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfZGF0YSwgcGJpdF9jb250cm9sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmdfZGF0YSIsIC5kZXNjciA9ICJjZmciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiA9PT09IE9iamVjdDogZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93ID09PT0gKi8KKworLyogR3JvdXA6IGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvdyAtIGtleSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXlfcG9uX25pID0geyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIG5ldHdvcmsgaW50ZXJmYWNlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19LRVlfSURfUE9OX05JLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXlfdmxhbl9pZCA9IHsgLm5hbWUgPSAidmxhbl9pZCIsIC5kZXNjciA9ICJ2bGFuIElEIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19LRVlfSURfVkxBTl9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5LCB2bGFuX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X3Bvbl9uaSwgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleV92bGFuX2lkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBvbl9uaSIsIC5kZXNjciA9ICJQT04gbmV0d29yayBpbnRlcmZhY2UiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInZsYW5faWQiLCAuZGVzY3IgPSAidmxhbiBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleSwgdmxhbl9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleSIsIC5kZXNjciA9ICJrZXkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXlfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93IC0gY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19tYXBwaW5nX21ldGhvZCA9IHsgLm5hbWUgPSAibWFwcGluZ19tZXRob2QiLCAuZGVzY3IgPSAiVGhlIE1hcHBpbmcgbWV0aG9kIGRlZmluZXMgaG93IHRoZSBmbG93IElEIHdpbGwgYmUgZGV0ZXJtaW5lZCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfQ0ZHX0lEX01BUFBJTkdfTUVUSE9ELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YSwgbWFwcGluZ19tZXRob2QpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF92bGFuX3RvX2Zsb3dfbWFwcGluZ19tZXRob2QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX21hcHBpbmdfdGFnID0geyAubmFtZSA9ICJtYXBwaW5nX3RhZyIsIC5kZXNjciA9ICJEZWZpbmUgaWYgdGhlIG91dGVyIG9yIHRoZSBpbm5lciBWTEFOIHRhZyBvZiB0aGUgcGFja2V0IHdpbGwgZGV0ZXJtaW5lIHRoZSBmbG93IElEIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPV19DRkdfSURfTUFQUElOR19UQUcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19kYXRhLCBtYXBwaW5nX3RhZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X21hcHBpbmdfdGFnX21ldGhvZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfdmxhbl9hY3Rpb24gPSB7IC5uYW1lID0gInZsYW5fYWN0aW9uIiwgLmRlc2NyID0gIkRlZmluZSB0aGUgb3V0ZXIgVkxBTiB0YWcgbWFuaXB1bGF0aW9uIG9uIHRoZSBwYWNrZXQ6IHRyYW5zcGFyZW50IG9yIHJlbW92ZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9EU19JTkdSRVNTX0ZMT1dfQ0ZHX0lEX1ZMQU5fQUNUSU9OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YSwgdmxhbl9hY3Rpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9kc192bGFuX2FjdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX21hcHBpbmdfbWV0aG9kLCAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX21hcHBpbmdfdGFnLCAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX3ZsYW5fYWN0aW9uIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibWFwcGluZ19tZXRob2QiLCAuZGVzY3IgPSAiVGhlIE1hcHBpbmcgbWV0aG9kIGRlZmluZXMgaG93IHRoZSBmbG93IElEIHdpbGwgYmUgZGV0ZXJtaW5lZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19kYXRhLCBtYXBwaW5nX21ldGhvZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3ZsYW5fdG9fZmxvd19tYXBwaW5nX21ldGhvZCB9LCB7IC5uYW1lID0gIm1hcHBpbmdfdGFnIiwgLmRlc2NyID0gIkRlZmluZSBpZiB0aGUgb3V0ZXIgb3IgdGhlIGlubmVyIFZMQU4gdGFnIG9mIHRoZSBwYWNrZXQgd2lsbCBkZXRlcm1pbmUgdGhlIGZsb3cgSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YSwgbWFwcGluZ190YWcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9tYXBwaW5nX3RhZ19tZXRob2QgfSwgeyAubmFtZSA9ICJ2bGFuX2FjdGlvbiIsIC5kZXNjciA9ICJEZWZpbmUgdGhlIG91dGVyIFZMQU4gdGFnIG1hbmlwdWxhdGlvbiBvbiB0aGUgcGFja2V0OiB0cmFuc3BhcmVudCBvciByZW1vdmUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YSwgdmxhbl9hY3Rpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9kc192bGFuX2FjdGlvbiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YSIsIC5kZXNjciA9ICJjZmciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiA9PT09IE9iamVjdDogZ3Bvbl9pd2ZfbWFjX3RhYmxlID09PT0gKi8KKworLyogR3JvdXA6IGdwb25faXdmX21hY190YWJsZSAtIGtleSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX21hY190YWJsZV9rZXlfcG9uX25pID0geyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIG5ldHdvcmsgaW50ZXJmYWNlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9LRVlfSURfUE9OX05JLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX21hY190YWJsZV9rZXlfbWFjX2FkZHJlc3MgPSB7IC5uYW1lID0gIm1hY19hZGRyZXNzIiwgLmRlc2NyID0gIk1BQyBhZGRyZXNzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9LRVlfSURfTUFDX0FERFJFU1MsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSwgbWFjX2FkZHJlc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX21hY19hZGRyZXNzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleV92bGFuID0geyAubmFtZSA9ICJ2bGFuIiwgLmRlc2NyID0gIlZMQU4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0tFWV9JRF9WTEFOLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXksIHZsYW4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25faXdmX21hY190YWJsZV9rZXlfcG9uX25pLCAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X21hY19hZGRyZXNzLCAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X3ZsYW4gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXlfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicG9uX25pIiwgLmRlc2NyID0gIlBPTiBuZXR3b3JrIGludGVyZmFjZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSwgcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAibWFjX2FkZHJlc3MiLCAuZGVzY3IgPSAiTUFDIGFkZHJlc3MiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXksIG1hY19hZGRyZXNzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19tYWNfYWRkcmVzcyB9LCB7IC5uYW1lID0gInZsYW4iLCAuZGVzY3IgPSAiVkxBTiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSwgdmxhbiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSIsIC5kZXNjciA9ICJrZXkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXlfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9pd2ZfbWFjX3RhYmxlIC0gY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19mbG93X2lkID0geyAubmFtZSA9ICJmbG93X2lkIiwgLmRlc2NyID0gIlRoZSBmbG93IElEIGFzc2lnbmVkIHRvIHRyYWZmaWMgdGhhdCBtYXRjaGVzIHRoaXMgTUFDIHRhYmxlIGVudHJ5LiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQ0ZHX0lEX0ZMT1dfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19kYXRhLCBmbG93X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX21hY190YWJsZV9jZmdfc3RhdCA9IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJXaGV0aGVyIG9yIG5vdCB0aGUgTUFDIGVudHJ5IGlzIHN0YXRpYy4gIFN0YXRpYyBlbnRyaWVzIGRvbid0IGFnZS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0NGR19JRF9TVEFULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX21hY190YWJsZV9jZmdfZ2VtX3BvcnRfaWQgPSB7IC5uYW1lID0gImdlbV9wb3J0X2lkIiwgLmRlc2NyID0gIlRoZSBHRU0gcG9ydCBJRCBvZiB0aGUgdHJhZmZpYyB0aGF0IGNyZWF0ZWQgdGhpcyB0YWJsZSBlbnRyeS4gIFRoaXMgb25seSBhcHBsaWVzIHRvIGF1dG9tYXRpY2FsbHktbGVhcm5lZCBlbnRyaWVzLiAgTWFudWFsbHktYWRkZWQgZW50cmllcyB3aWxsIGhhdmUgdGhlIHZhbHVlIEJDTU9MVF9QT05fR0VNX1BPUlRfSURfSU5WQUxJRC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQ0ZHX0lEX0dFTV9QT1JUX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfZGF0YSwgZ2VtX3BvcnRfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19vbnVfaWQgPSB7IC5uYW1lID0gIm9udV9pZCIsIC5kZXNjciA9ICJUaGUgT05VIElEIGZvciB0aGUgdHJhZmZpYyB0aGF0IGNyZWF0ZWQgdGhpcyB0YWJsZSBlbnRyeS4gIFRoaXMgb25seSB2YWxpZCBpZiBnZW1fcG9ydF9pZCBpcyB2YWxpZC4gIE90aGVyd2lzZSB0aGlzIHdpbGwgYmUgc2V0IHRvIEJDTU9MVF9HUE9OX09OVV9JRF9JTlZBTElELiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9DRkdfSURfT05VX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfZGF0YSwgb251X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25faXdmX21hY190YWJsZV9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2Zsb3dfaWQsICZwcm9wX2Rlc2NyX2dwb25faXdmX21hY190YWJsZV9jZmdfc3RhdCwgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19nZW1fcG9ydF9pZCwgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19vbnVfaWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJmbG93X2lkIiwgLmRlc2NyID0gIlRoZSBmbG93IElEIGFzc2lnbmVkIHRvIHRyYWZmaWMgdGhhdCBtYXRjaGVzIHRoaXMgTUFDIHRhYmxlIGVudHJ5LiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19kYXRhLCBmbG93X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiV2hldGhlciBvciBub3QgdGhlIE1BQyBlbnRyeSBpcyBzdGF0aWMuICBTdGF0aWMgZW50cmllcyBkb24ndCBhZ2UuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJnZW1fcG9ydF9pZCIsIC5kZXNjciA9ICJUaGUgR0VNIHBvcnQgSUQgb2YgdGhlIHRyYWZmaWMgdGhhdCBjcmVhdGVkIHRoaXMgdGFibGUgZW50cnkuICBUaGlzIG9ubHkgYXBwbGllcyB0byBhdXRvbWF0aWNhbGx5LWxlYXJuZWQgZW50cmllcy4gIE1hbnVhbGx5LWFkZGVkIGVudHJpZXMgd2lsbCBoYXZlIHRoZSB2YWx1ZSBCQ01PTFRfUE9OX0dFTV9QT1JUX0lEX0lOVkFMSUQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2RhdGEsIGdlbV9wb3J0X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gIm9udV9pZCIsIC5kZXNjciA9ICJUaGUgT05VIElEIGZvciB0aGUgdHJhZmZpYyB0aGF0IGNyZWF0ZWQgdGhpcyB0YWJsZSBlbnRyeS4gIFRoaXMgb25seSB2YWxpZCBpZiBnZW1fcG9ydF9pZCBpcyB2YWxpZC4gIE90aGVyd2lzZSB0aGlzIHdpbGwgYmUgc2V0IHRvIEJDTU9MVF9HUE9OX09OVV9JRF9JTlZBTElELiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19kYXRhLCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19kYXRhIiwgLmRlc2NyID0gImNmZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX2l3Zl9tYWNfdGFibGUgLSBuZXdfbWFjICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfZmxvd19pZCA9IHsgLm5hbWUgPSAiZmxvd19pZCIsIC5kZXNjciA9ICJUaGUgZmxvdyBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIG5ldyBlbnRyeS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX05FV19NQUNfSURfRkxPV19JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19kYXRhLCBmbG93X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25faXdmX21hY190YWJsZV9uZXdfbWFjX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfZmxvd19pZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJmbG93X2lkIiwgLmRlc2NyID0gIlRoZSBmbG93IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV3IGVudHJ5LiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfZGF0YSwgZmxvd19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBuZXcgTUFDIGFkZHJlc3MgLyBWSUQgY29tYmluYXRpb24gaXMgc2VlbiBpbiB0aGUgdXBzdHJlYW0gdHJhZmZpYyBzdHJlYW0uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25faXdmX21hY190YWJsZSAtIG1hY19hZ2VkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19hZ2VkX3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGdwb25faXdmX21hY190YWJsZSAtIG1hY19tb3ZlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX29sZF9mbG93X2lkID0geyAubmFtZSA9ICJvbGRfZmxvd19pZCIsIC5kZXNjciA9ICJUaGUgZmxvdyBJRCBpbiB0aGUgY3VycmVudCBNQUMgdGFibGUgZW50cnkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9NQUNfTU9WRV9JRF9PTERfRkxPV19JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfZGF0YSwgb2xkX2Zsb3dfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX25ld19mbG93X2lkID0geyAubmFtZSA9ICJuZXdfZmxvd19pZCIsIC5kZXNjciA9ICJUaGUgZmxvdyBJRCBzZWVuIGluIHRoZSB0cmFmZmljIHN0cmVhbS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX01BQ19NT1ZFX0lEX05FV19GTE9XX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9kYXRhLCBuZXdfZmxvd19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfb2xkX2Zsb3dfaWQsICZwcm9wX2Rlc2NyX2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9uZXdfZmxvd19pZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAib2xkX2Zsb3dfaWQiLCAuZGVzY3IgPSAiVGhlIGZsb3cgSUQgaW4gdGhlIGN1cnJlbnQgTUFDIHRhYmxlIGVudHJ5LiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGEsIG9sZF9mbG93X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gIm5ld19mbG93X2lkIiwgLmRlc2NyID0gIlRoZSBmbG93IElEIHNlZW4gaW4gdGhlIHRyYWZmaWMgc3RyZWFtLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGEsIG5ld19mbG93X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIHRoZSBNQUMgdGFibGUgaXMgaW4gbW92ZSBtb2RlIGFuZCBhIHBhY2tldCBpcyBzZWVuIHRoYXQgbWF0Y2hlcyBvbiBNQUMgYWRkcmVzcyAvIFZJRCBidXQgZG9lc24ndCBtYXRjaCBvbiBmbG93IElELiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX2l3Zl9tYWNfdGFibGUgLSBtYWNfZHJvcHBlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9mbG93X2lkID0geyAubmFtZSA9ICJmbG93X2lkIiwgLmRlc2NyID0gIlRoZSBmbG93IElEIG9mIHRoZSBlbnRyeSB0aGF0IHdhcyBkcm9wcGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfTUFDX0RST1BQRURfSURfRkxPV19JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfZGF0YSwgZmxvd19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfZmxvd19pZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZmxvd19pZCIsIC5kZXNjciA9ICJUaGUgZmxvdyBJRCBvZiB0aGUgZW50cnkgdGhhdCB3YXMgZHJvcHBlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9kYXRhLCBmbG93X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGFuIGVudHJ5IGNhbm5vdCBiZSBsZWFybmVkIHNpbmNlIHRoZSBNQUMgdGFibGUgaXMgZnVsbC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9pd2ZfbWFjX3RhYmxlIC0gYXV0b19jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfbWFjX2FnZWQgPSB7IC5uYW1lID0gIm1hY19hZ2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJtYWNfYWdlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19DRkdfSURfTUFDX0FHRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2RhdGEsIG1hY19hZ2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX21hY19kcm9wcGVkID0geyAubmFtZSA9ICJtYWNfZHJvcHBlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibWFjX2Ryb3BwZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fQ0ZHX0lEX01BQ19EUk9QUEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhLCBtYWNfZHJvcHBlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19tYWNfbW92ZSA9IHsgLm5hbWUgPSAibWFjX21vdmUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm1hY19tb3ZlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGR19JRF9NQUNfTU9WRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfZGF0YSwgbWFjX21vdmUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfbmV3X21hYyA9IHsgLm5hbWUgPSAibmV3X21hYyIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibmV3X21hY1wiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19DRkdfSURfTkVXX01BQywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfZGF0YSwgbmV3X21hYyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19tYWNfYWdlZCwgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX21hY19kcm9wcGVkLCAmcHJvcF9kZXNjcl9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfbWFjX21vdmUsICZwcm9wX2Rlc2NyX2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19uZXdfbWFjIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJtYWNfYWdlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibWFjX2FnZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhLCBtYWNfYWdlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm1hY19kcm9wcGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJtYWNfZHJvcHBlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2RhdGEsIG1hY19kcm9wcGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAibWFjX21vdmUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm1hY19tb3ZlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfZGF0YSwgbWFjX21vdmUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJuZXdfbWFjIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJuZXdfbWFjXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfZGF0YSwgbmV3X21hYyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2RhdGEiLCAuZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogPT09PSBPYmplY3Q6IGdwb25faXdmX3VzX2Zsb3cgPT09PSAqLworCisvKiBHcm91cDogZ3Bvbl9pd2ZfdXNfZmxvdyAtIGtleSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX3VzX2Zsb3dfa2V5X3Bvbl9uaSA9IHsgLm5hbWUgPSAicG9uX25pIiwgLmRlc2NyID0gIlBPTiBuZXR3b3JrIGludGVyZmFjZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0tFWV9JRF9QT05fTkksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX3VzX2Zsb3dfa2V5X2dlbV9wb3J0X2lkID0geyAubmFtZSA9ICJnZW1fcG9ydF9pZCIsIC5kZXNjciA9ICJHRU0gUG9ydCAgSUQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19LRVlfSURfR0VNX1BPUlRfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXksIGdlbV9wb3J0X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25faXdmX3VzX2Zsb3dfa2V5X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfdXNfZmxvd19rZXlfcG9uX25pLCAmcHJvcF9kZXNjcl9ncG9uX2l3Zl91c19mbG93X2tleV9nZW1fcG9ydF9pZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXlfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicG9uX25pIiwgLmRlc2NyID0gIlBPTiBuZXR3b3JrIGludGVyZmFjZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gImdlbV9wb3J0X2lkIiwgLmRlc2NyID0gIkdFTSBQb3J0ICBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXksIGdlbV9wb3J0X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXkiLCAuZGVzY3IgPSAia2V5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5X2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25faXdmX3VzX2Zsb3cgLSBjZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl91c19mbG93X2NmZ19mbG93X2lkID0geyAubmFtZSA9ICJmbG93X2lkIiwgLmRlc2NyID0gIkZsb3cgSUQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19DRkdfSURfRkxPV19JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhLCBmbG93X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX3VzX2Zsb3dfY2ZnX21hY19sZWFybmluZyA9IHsgLm5hbWUgPSAibWFjX2xlYXJuaW5nIiwgLmRlc2NyID0gIk1BQyBsZWFybmluZyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9NQUNfTEVBUk5JTkcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfZGF0YSwgbWFjX2xlYXJuaW5nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfdmxhbl9hY3Rpb24gPSB7IC5uYW1lID0gInZsYW5fYWN0aW9uIiwgLmRlc2NyID0gIlZMQU4gYWN0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fSVdGX1VTX0ZMT1dfQ0ZHX0lEX1ZMQU5fQUNUSU9OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2RhdGEsIHZsYW5fYWN0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdXNfdmxhbl9hY3Rpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX2l3Zl91c19mbG93X2NmZ192bGFuX3RhZyA9IHsgLm5hbWUgPSAidmxhbl90YWciLCAuZGVzY3IgPSAiVmxhbiB0YWciLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9JV0ZfVVNfRkxPV19DRkdfSURfVkxBTl9UQUcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfZGF0YSwgdmxhbl90YWcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF92bGFuX3RhZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25faXdmX3VzX2Zsb3dfY2ZnX3RwaWRfaW5kZXggPSB7IC5uYW1lID0gInRwaWRfaW5kZXgiLCAuZGVzY3IgPSAiVFBJRCBpbmRleCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX0lXRl9VU19GTE9XX0NGR19JRF9UUElEX0lOREVYLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2RhdGEsIHRwaWRfaW5kZXgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX2l3Zl91c19mbG93X2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25faXdmX3VzX2Zsb3dfY2ZnX2Zsb3dfaWQsICZwcm9wX2Rlc2NyX2dwb25faXdmX3VzX2Zsb3dfY2ZnX21hY19sZWFybmluZywgJnByb3BfZGVzY3JfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfdmxhbl9hY3Rpb24sICZwcm9wX2Rlc2NyX2dwb25faXdmX3VzX2Zsb3dfY2ZnX3ZsYW5fdGFnLCAmcHJvcF9kZXNjcl9ncG9uX2l3Zl91c19mbG93X2NmZ190cGlkX2luZGV4IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImZsb3dfaWQiLCAuZGVzY3IgPSAiRmxvdyBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfZGF0YSwgZmxvd19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJtYWNfbGVhcm5pbmciLCAuZGVzY3IgPSAiTUFDIGxlYXJuaW5nIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhLCBtYWNfbGVhcm5pbmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJ2bGFuX2FjdGlvbiIsIC5kZXNjciA9ICJWTEFOIGFjdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfZGF0YSwgdmxhbl9hY3Rpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91c192bGFuX2FjdGlvbiB9LCB7IC5uYW1lID0gInZsYW5fdGFnIiwgLmRlc2NyID0gIlZsYW4gdGFnIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhLCB2bGFuX3RhZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3ZsYW5fdGFnIH0sIHsgLm5hbWUgPSAidHBpZF9pbmRleCIsIC5kZXNjciA9ICJUUElEIGluZGV4IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhLCB0cGlkX2luZGV4KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiY2ZnIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogPT09PSBPYmplY3Q6IGdwb25fbmkgPT09PSAqLworCisvKiBHcm91cDogZ3Bvbl9uaSAtIGtleSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfa2V5X3Bvbl9uaSA9IHsgLm5hbWUgPSAicG9uX25pIiwgLmRlc2NyID0gIlBPTiBuZXR3b3JrIGludGVyZmFjZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0tFWV9JRF9QT05fTkksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fbmlfa2V5X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9uaV9rZXlfcG9uX25pIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIG5ldHdvcmsgaW50ZXJmYWNlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2tleSwgcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9rZXkgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX2tleSIsIC5kZXNjciA9ICJrZXkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9rZXkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9rZXlfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9rZXlfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9uaSAtIGNmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX3Bvbl9zdGF0dXMgPSB7IC5uYW1lID0gInBvbl9zdGF0dXMiLCAuZGVzY3IgPSAiUE9OIHN0YXR1cyBwYXJhbWV0ZXJzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUE9OX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBwb25fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX2F2YWlsYWJsZV9iYW5kd2lkdGggPSB7IC5uYW1lID0gImF2YWlsYWJsZV9iYW5kd2lkdGgiLCAuZGVzY3IgPSAiUE9OIGF2YWlsYWJsZSBiYW5kd2lkdGggcGFyYW1ldGVycyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0FWQUlMQUJMRV9CQU5EV0lEVEgsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgYXZhaWxhYmxlX2JhbmR3aWR0aCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9hdmFpbGFibGVfYmFuZHdpZHRoIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfbnVtYmVyX29mX2FjdGl2ZV9vbnVzID0geyAubmFtZSA9ICJudW1iZXJfb2ZfYWN0aXZlX29udXMiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIGFjdGl2ZSBPTlVzIG9uIHRoZSBQT04iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9OVU1CRVJfT0ZfQUNUSVZFX09OVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgbnVtYmVyX29mX2FjdGl2ZV9vbnVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX251bWJlcl9vZl9hY3RpdmVfc3RhbmRieV9vbnVzID0geyAubmFtZSA9ICJudW1iZXJfb2ZfYWN0aXZlX3N0YW5kYnlfb251cyIsIC5kZXNjciA9ICJudW1iZXIgb2YgYWN0aXZlIHN0YW5kYnkgb251cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX05VTUJFUl9PRl9BQ1RJVkVfU1RBTkRCWV9PTlVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIG51bWJlcl9vZl9hY3RpdmVfc3RhbmRieV9vbnVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX3ByYnNfc3RhdHVzID0geyAubmFtZSA9ICJwcmJzX3N0YXR1cyIsIC5kZXNjciA9ICJSZXN1bHQgb2YgVVMgUFJCUyBjaGVja2VyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUFJCU19TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgcHJic19zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wcmJzX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX3Bvbl9kaXN0YW5jZSA9IHsgLm5hbWUgPSAicG9uX2Rpc3RhbmNlIiwgLmRlc2NyID0gIlBPTiBkaXN0YW5jZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QT05fRElTVEFOQ0UsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgcG9uX2Rpc3RhbmNlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX2Rpc3RhbmNlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfcmFuZ2luZ193aW5kb3dfc2l6ZSA9IHsgLm5hbWUgPSAicmFuZ2luZ193aW5kb3dfc2l6ZSIsIC5kZXNjciA9ICJSYW5naW5nIHdpbmRvdyBzaXplIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfUkFOR0lOR19XSU5ET1dfU0laRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCByYW5naW5nX3dpbmRvd19zaXplKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX3ByZWFzc2lnbmVkX2VxdWFsaXphdGlvbl9kZWxheSA9IHsgLm5hbWUgPSAicHJlYXNzaWduZWRfZXF1YWxpemF0aW9uX2RlbGF5IiwgLmRlc2NyID0gIk9OVSBwcmUtYXNzaWduZWQgZXF1YWxpemF0aW9uIGRlbGF5IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BSRUFTU0lHTkVEX0VRVUFMSVpBVElPTl9ERUxBWSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBwcmVhc3NpZ25lZF9lcXVhbGl6YXRpb25fZGVsYXkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfZXFkX2N5Y2xlc19udW1iZXIgPSB7IC5uYW1lID0gImVxZF9jeWNsZXNfbnVtYmVyIiwgLmRlc2NyID0gIkhvdyBtYW55IHJhbmdpbmcgd2luZG93cyBhcmUgb3BlbmVkIGR1cmluZyBhIHNpbmdsZSBPTlUgYWN0aXZhdGlvbiBwcm9jZXNzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0VRRF9DWUNMRVNfTlVNQkVSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIGVxZF9jeWNsZXNfbnVtYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX3Bvd2VyX2xldmVsID0geyAubmFtZSA9ICJwb3dlcl9sZXZlbCIsIC5kZXNjciA9ICJPTlUgcG93ZXIgbGV2ZWwgY29uZmlndXJhdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QT1dFUl9MRVZFTCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBwb3dlcl9sZXZlbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9wb3dlcl9sZXZlbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX2RzX2ZlY19tb2RlID0geyAubmFtZSA9ICJkc19mZWNfbW9kZSIsIC5kZXNjciA9ICJEUyBGRUMgbW9kZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9EU19GRUNfTU9ERSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBkc19mZWNfbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19kcmlmdF9jb250cm9sID0geyAubmFtZSA9ICJkcmlmdF9jb250cm9sIiwgLmRlc2NyID0gIkRyaWZ0IGNvbnRyb2wgcHJvY2VzcyBjb25maWd1cmF0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RSSUZUX0NPTlRST0wsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgZHJpZnRfY29udHJvbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9kcmlmdF9jb250cm9sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbCA9IHsgLm5hbWUgPSAiZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbCIsIC5kZXNjciA9ICJEUyBCRVIgcmVwb3J0aW5nIGludGVydmFsIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RTX0JFUl9SRVBPUlRJTkdfSU5URVJWQUwsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19sb3NfYWxhcm1fdGhyZXNob2xkID0geyAubmFtZSA9ICJsb3NfYWxhcm1fdGhyZXNob2xkIiwgLmRlc2NyID0gIkxPUyBhbGFybSB0aHJlc2hvbGQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfTE9TX0FMQVJNX1RIUkVTSE9MRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBsb3NfYWxhcm1fdGhyZXNob2xkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfbG9zX2luaXRpYWxfdmFsdWUgPSB7IC5uYW1lID0gImxvc19pbml0aWFsX3ZhbHVlIiwgLmRlc2NyID0gIkxPUyBpbml0aWFsIHZhbHVlIGZvbGxvd2luZyBQT04gYWN0aXZhdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9MT1NfSU5JVElBTF9WQUxVRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBsb3NfaW5pdGlhbF92YWx1ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX29udV9hbGFybXNfdGhyZXNob2xkcyA9IHsgLm5hbWUgPSAib251X2FsYXJtc190aHJlc2hvbGRzIiwgLmRlc2NyID0gIk9OVSBhbGFybXMgdGhyZXNob2xkcyBjb25maWd1cmF0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX09OVV9BTEFSTVNfVEhSRVNIT0xEUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBvbnVfYWxhcm1zX3RocmVzaG9sZHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9hbGFybXNfdGhyZXNob2xkcyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX2Jlcl9tb25pdG9yID0geyAubmFtZSA9ICJiZXJfbW9uaXRvciIsIC5kZXNjciA9ICJCRVIgbW9uaXRvciBwcm9jZXNzIGNvbmZpZ3VyYXRpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQkVSX01PTklUT1IsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgYmVyX21vbml0b3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9iZXJfbW9uaXRvcl9wYXJhbXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19wbG9hbV9hY2tfdGltZW91dCA9IHsgLm5hbWUgPSAicGxvYW1fYWNrX3RpbWVvdXQiLCAuZGVzY3IgPSAiVGltZW91dCBmb3IgcmVjZWl2aW5nIEFDSyBwbG9hbSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QTE9BTV9BQ0tfVElNRU9VVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBwbG9hbV9hY2tfdGltZW91dCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19vbnVfYWN0aXZhdGlvbiA9IHsgLm5hbWUgPSAib251X2FjdGl2YXRpb24iLCAuZGVzY3IgPSAiT05VIGFjdGl2YXRpb24gY29udHJvbCBwYXJhbWV0ZXJzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX09OVV9BQ1RJVkFUSU9OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIG9udV9hY3RpdmF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfYWN0aXZhdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX3NuX2FjcXVpc2l0aW9uID0geyAubmFtZSA9ICJzbl9hY3F1aXNpdGlvbiIsIC5kZXNjciA9ICJTZXJpYWwgTnVtYmVyIHByb2Nlc3MgY29uZmlndXJhdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9TTl9BQ1FVSVNJVElPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBzbl9hY3F1aXNpdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19rZXlfZXhjaGFuZ2UgPSB7IC5uYW1lID0gImtleV9leGNoYW5nZSIsIC5kZXNjciA9ICJLZXkgRXhjaGFuZ2UgcHJvY2VzcyBjb25maWd1cmF0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0tFWV9FWENIQU5HRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBrZXlfZXhjaGFuZ2UpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2tleV9leGNoYW5nZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX3Byb3RlY3Rpb25fc3dpdGNoaW5nID0geyAubmFtZSA9ICJwcm90ZWN0aW9uX3N3aXRjaGluZyIsIC5kZXNjciA9ICJQcm90ZWN0aW9uIHN3aXRjaGluZyBjb250cm9sIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIHByb3RlY3Rpb25fc3dpdGNoaW5nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSA9IHsgLm5hbWUgPSAiY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSIsIC5kZXNjciA9ICJDQlIgUmVhbCBUaW1lIGFsbG9jYXRpb24gcHJvZmlsZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9DQlJfUlRfQUxMT0NBVElPTl9QUk9GSUxFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIGNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUgPSB7IC5uYW1lID0gImNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlIiwgLmRlc2NyID0gIkNCUiBub24gUmVhbCBUaW1lIGFsbG9jYXRpb24gcHJvZmlsZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9DQlJfTlJUX0FMTE9DQVRJT05fUFJPRklMRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBjYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl91MTZfMiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX2RiYSA9IHsgLm5hbWUgPSAiZGJhIiwgLmRlc2NyID0gIkRCQSBjb25maWd1cmF0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0RCQSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBkYmEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25fZGJhIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfcG93ZXJfbWFuYWdlbWVudCA9IHsgLm5hbWUgPSAicG93ZXJfbWFuYWdlbWVudCIsIC5kZXNjciA9ICJPTlUgcG93ZXIgbWFuYWdlbWVudCBjb250cm9sIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BPV0VSX01BTkFHRU1FTlQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgcG93ZXJfbWFuYWdlbWVudCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X29udV9wb3dlcl9tYW5hZ2VtZW50X2NvbmZpZ3VyYXRpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MgPSB7IC5uYW1lID0gInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcyIsIC5kZXNjciA9ICJSb2d1ZSBPTlUgZGV0ZWN0aW9uIHByb2Nlc3MgY29uZmlndXJhdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9ST0dVRV9PTlVfREVURUNUSU9OX1BST0NFU1MsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyA9IHsgLm5hbWUgPSAicGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyIsIC5kZXNjciA9ICJQZXJpb2RpYyBTdGFuZGJ5IFBPTiBtb25pdG9yaW5nIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BFUklPRElDX1NUQU5EQllfUE9OX01PTklUT1JJTkcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19wcmJzX2NoZWNrZXIgPSB7IC5uYW1lID0gInByYnNfY2hlY2tlciIsIC5kZXNjciA9ICJVUyBQUkJTIGNoZWNrZXIgY29uZmlndXJhdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NGR19JRF9QUkJTX0NIRUNLRVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgcHJic19jaGVja2VyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcHJic19jaGVja2VyX2NvbmZpZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX3ByYnNfZ2VuZXJhdG9yID0geyAubmFtZSA9ICJwcmJzX2dlbmVyYXRvciIsIC5kZXNjciA9ICJEUyBQUkJTIGdlbmVyYXRvciBjb25maWd1cmF0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BSQlNfR0VORVJBVE9SLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIHByYnNfZ2VuZXJhdG9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfbWluX2RhdGFfYWxsb2NfaWQgPSB7IC5uYW1lID0gIm1pbl9kYXRhX2FsbG9jX2lkIiwgLmRlc2NyID0gIk1pbiBkYXRhIEFsbG9jIElEIHZhbHVlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX01JTl9EQVRBX0FMTE9DX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIG1pbl9kYXRhX2FsbG9jX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uID0geyAubmFtZSA9ICJhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiIsIC5kZXNjciA9ICJPcHRpb24gdG8gZGlzYWJsZSB0aGUgYXV0b21hdGljIGRlYWN0aXZhdGlvbiBvZiBPTlVzIGR1ZSB0byBhbGFybXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQVVUT01BVElDX09OVV9ERUFDVElWQVRJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX3VzX2JhbmR3aWR0aF9saW1pdCA9IHsgLm5hbWUgPSAidXNfYmFuZHdpZHRoX2xpbWl0IiwgLmRlc2NyID0gIlRvdGFsIFBPTiB1cHN0cmVhbSBiYW5kd2lkdGggbGltaXQgaW4gYnl0ZXMgcGVyIHNlY29uZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfVVNfQkFORFdJRFRIX0xJTUlULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIHVzX2JhbmR3aWR0aF9saW1pdCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19hbGxfb251cyA9IHsgLm5hbWUgPSAiYWxsX29udXMiLCAuZGVzY3IgPSAiQWxsIE9OVXMgY3VycmVudGx5IHByb3Zpc2lvbmVkIG9uIHRoaXMgUE9OLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0FMTF9PTlVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIGFsbF9vbnVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfYWxsX21jYXN0X2dlbV9wb3J0cyA9IHsgLm5hbWUgPSAiYWxsX21jYXN0X2dlbV9wb3J0cyIsIC5kZXNjciA9ICJBbGwgbXVsdGljYXN0IEdFTSBwb3J0cyBjdXJyZW50bHkgcHJvdmlzaW9uZWQgb24gdGhpcyBQT04uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfQUxMX01DQVNUX0dFTV9QT1JUUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBhbGxfbWNhc3RfZ2VtX3BvcnRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8xMjggfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19kZWJ1ZyA9IHsgLm5hbWUgPSAiZGVidWciLCAuZGVzY3IgPSAiUE9OIE5JIGRlYnVnIHBhcmFtZXRlcnMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9DRkdfSURfREVCVUcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgZGVidWcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2RlYnVnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfb251X3VwZ3JhZGVfcGFyYW1zID0geyAubmFtZSA9ICJvbnVfdXBncmFkZV9wYXJhbXMiLCAuZGVzY3IgPSAiT05VIHVwZ3JhZGUgcGFyYW1zIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX09OVV9VUEdSQURFX1BBUkFNUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBvbnVfdXBncmFkZV9wYXJhbXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV91cGdyYWRlX3BhcmFtcyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX3BzX2Nfd2FpdF9iZWZvcmVfZGVhY3RpdmF0aW9uX3RpbWVvdXQgPSB7IC5uYW1lID0gInBzX2Nfd2FpdF9iZWZvcmVfZGVhY3RpdmF0aW9uX3RpbWVvdXQiLCAuZGVzY3IgPSAiUFMgdHlwZSBDIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX1BTX0NfV0FJVF9CRUZPUkVfREVBQ1RJVkFUSU9OX1RJTUVPVVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgcHNfY193YWl0X2JlZm9yZV9kZWFjdGl2YXRpb25fdGltZW91dCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19iaXAzMl9pbmRpY2F0aW9uX2NvbnRyb2wgPSB7IC5uYW1lID0gImJpcDMyX2luZGljYXRpb25fY29udHJvbCIsIC5kZXNjciA9ICJPcHRpb24gdG8gZGlzYWJsZSB0aGUgYmlwMzIgaW5kaWNhdGlvbiB3aGVuIHRoZSB2YWx1ZSBpcyB6ZXJvIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ0ZHX0lEX0JJUDMyX0lORElDQVRJT05fQ09OVFJPTCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBiaXAzMl9pbmRpY2F0aW9uX2NvbnRyb2wpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb250cm9sX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9uaV9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19wb25fc3RhdHVzLCAmcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19hdmFpbGFibGVfYmFuZHdpZHRoLCAmcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19udW1iZXJfb2ZfYWN0aXZlX29udXMsICZwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX251bWJlcl9vZl9hY3RpdmVfc3RhbmRieV9vbnVzLCAmcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19wcmJzX3N0YXR1cywgJnByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfcG9uX2Rpc3RhbmNlLCAmcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19yYW5naW5nX3dpbmRvd19zaXplLCAmcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19wcmVhc3NpZ25lZF9lcXVhbGl6YXRpb25fZGVsYXksICZwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX2VxZF9jeWNsZXNfbnVtYmVyLCAmcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19wb3dlcl9sZXZlbCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfZHNfZmVjX21vZGUsICZwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX2RyaWZ0X2NvbnRyb2wsICZwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX2RzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwsICZwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX2xvc19hbGFybV90aHJlc2hvbGQsICZwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX2xvc19pbml0aWFsX3ZhbHVlLCAmcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19vbnVfYWxhcm1zX3RocmVzaG9sZHMsICZwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX2Jlcl9tb25pdG9yLCAmcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19wbG9hbV9hY2tfdGltZW91dCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfb251X2FjdGl2YXRpb24sICZwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX3NuX2FjcXVpc2l0aW9uLCAmcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19rZXlfZXhjaGFuZ2UsICZwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX3Byb3RlY3Rpb25fc3dpdGNoaW5nLCAmcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlLCAmcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19jYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZSwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfZGJhLCAmcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19wb3dlcl9tYW5hZ2VtZW50LCAmcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MsICZwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcsICZwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX3ByYnNfY2hlY2tlciwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfcHJic19nZW5lcmF0b3IsICZwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX21pbl9kYXRhX2FsbG9jX2lkLCAmcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfdXNfYmFuZHdpZHRoX2xpbWl0LCAmcHJvcF9kZXNjcl9ncG9uX25pX2NmZ19hbGxfb251cywgJnByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfYWxsX21jYXN0X2dlbV9wb3J0cywgJnByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfZGVidWcsICZwcm9wX2Rlc2NyX2dwb25fbmlfY2ZnX29udV91cGdyYWRlX3BhcmFtcywgJnByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfcHNfY193YWl0X2JlZm9yZV9kZWFjdGl2YXRpb25fdGltZW91dCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9jZmdfYmlwMzJfaW5kaWNhdGlvbl9jb250cm9sIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBvbl9zdGF0dXMiLCAuZGVzY3IgPSAiUE9OIHN0YXR1cyBwYXJhbWV0ZXJzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBwb25fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX3N0YXR1cyB9LCB7IC5uYW1lID0gImF2YWlsYWJsZV9iYW5kd2lkdGgiLCAuZGVzY3IgPSAiUE9OIGF2YWlsYWJsZSBiYW5kd2lkdGggcGFyYW1ldGVycyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgYXZhaWxhYmxlX2JhbmR3aWR0aCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9hdmFpbGFibGVfYmFuZHdpZHRoIH0sIHsgLm5hbWUgPSAibnVtYmVyX29mX2FjdGl2ZV9vbnVzIiwgLmRlc2NyID0gIk51bWJlciBvZiBhY3RpdmUgT05VcyBvbiB0aGUgUE9OIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBudW1iZXJfb2ZfYWN0aXZlX29udXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAibnVtYmVyX29mX2FjdGl2ZV9zdGFuZGJ5X29udXMiLCAuZGVzY3IgPSAibnVtYmVyIG9mIGFjdGl2ZSBzdGFuZGJ5IG9udXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIG51bWJlcl9vZl9hY3RpdmVfc3RhbmRieV9vbnVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gInByYnNfc3RhdHVzIiwgLmRlc2NyID0gIlJlc3VsdCBvZiBVUyBQUkJTIGNoZWNrZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIHByYnNfc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcHJic19zdGF0dXMgfSwgeyAubmFtZSA9ICJwb25fZGlzdGFuY2UiLCAuZGVzY3IgPSAiUE9OIGRpc3RhbmNlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBwb25fZGlzdGFuY2UpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25fZGlzdGFuY2UgfSwgeyAubmFtZSA9ICJyYW5naW5nX3dpbmRvd19zaXplIiwgLmRlc2NyID0gIlJhbmdpbmcgd2luZG93IHNpemUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIHJhbmdpbmdfd2luZG93X3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAicHJlYXNzaWduZWRfZXF1YWxpemF0aW9uX2RlbGF5IiwgLmRlc2NyID0gIk9OVSBwcmUtYXNzaWduZWQgZXF1YWxpemF0aW9uIGRlbGF5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBwcmVhc3NpZ25lZF9lcXVhbGl6YXRpb25fZGVsYXkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiZXFkX2N5Y2xlc19udW1iZXIiLCAuZGVzY3IgPSAiSG93IG1hbnkgcmFuZ2luZyB3aW5kb3dzIGFyZSBvcGVuZWQgZHVyaW5nIGEgc2luZ2xlIE9OVSBhY3RpdmF0aW9uIHByb2Nlc3MiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIGVxZF9jeWNsZXNfbnVtYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gInBvd2VyX2xldmVsIiwgLmRlc2NyID0gIk9OVSBwb3dlciBsZXZlbCBjb25maWd1cmF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBwb3dlcl9sZXZlbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9wb3dlcl9sZXZlbCB9LCB7IC5uYW1lID0gImRzX2ZlY19tb2RlIiwgLmRlc2NyID0gIkRTIEZFQyBtb2RlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBkc19mZWNfbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfSwgeyAubmFtZSA9ICJkcmlmdF9jb250cm9sIiwgLmRlc2NyID0gIkRyaWZ0IGNvbnRyb2wgcHJvY2VzcyBjb25maWd1cmF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBkcmlmdF9jb250cm9sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX2RyaWZ0X2NvbnRyb2wgfSwgeyAubmFtZSA9ICJkc19iZXJfcmVwb3J0aW5nX2ludGVydmFsIiwgLmRlc2NyID0gIkRTIEJFUiByZXBvcnRpbmcgaW50ZXJ2YWwiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIGRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAibG9zX2FsYXJtX3RocmVzaG9sZCIsIC5kZXNjciA9ICJMT1MgYWxhcm0gdGhyZXNob2xkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBsb3NfYWxhcm1fdGhyZXNob2xkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAibG9zX2luaXRpYWxfdmFsdWUiLCAuZGVzY3IgPSAiTE9TIGluaXRpYWwgdmFsdWUgZm9sbG93aW5nIFBPTiBhY3RpdmF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBsb3NfaW5pdGlhbF92YWx1ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9LCB7IC5uYW1lID0gIm9udV9hbGFybXNfdGhyZXNob2xkcyIsIC5kZXNjciA9ICJPTlUgYWxhcm1zIHRocmVzaG9sZHMgY29uZmlndXJhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgb251X2FsYXJtc190aHJlc2hvbGRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgfSwgeyAubmFtZSA9ICJiZXJfbW9uaXRvciIsIC5kZXNjciA9ICJCRVIgbW9uaXRvciBwcm9jZXNzIGNvbmZpZ3VyYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIGJlcl9tb25pdG9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYmVyX21vbml0b3JfcGFyYW1zIH0sIHsgLm5hbWUgPSAicGxvYW1fYWNrX3RpbWVvdXQiLCAuZGVzY3IgPSAiVGltZW91dCBmb3IgcmVjZWl2aW5nIEFDSyBwbG9hbSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgcGxvYW1fYWNrX3RpbWVvdXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAib251X2FjdGl2YXRpb24iLCAuZGVzY3IgPSAiT05VIGFjdGl2YXRpb24gY29udHJvbCBwYXJhbWV0ZXJzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBvbnVfYWN0aXZhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2FjdGl2YXRpb24gfSwgeyAubmFtZSA9ICJzbl9hY3F1aXNpdGlvbiIsIC5kZXNjciA9ICJTZXJpYWwgTnVtYmVyIHByb2Nlc3MgY29uZmlndXJhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgc25fYWNxdWlzaXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX3NuX2FjcXVpc2l0aW9uIH0sIHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlIiwgLmRlc2NyID0gIktleSBFeGNoYW5nZSBwcm9jZXNzIGNvbmZpZ3VyYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIGtleV9leGNoYW5nZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fa2V5X2V4Y2hhbmdlIH0sIHsgLm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hpbmciLCAuZGVzY3IgPSAiUHJvdGVjdGlvbiBzd2l0Y2hpbmcgY29udHJvbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmcgfSwgeyAubmFtZSA9ICJjYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlIiwgLmRlc2NyID0gIkNCUiBSZWFsIFRpbWUgYWxsb2NhdGlvbiBwcm9maWxlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBjYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSB9LCB7IC5uYW1lID0gImNicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlIiwgLmRlc2NyID0gIkNCUiBub24gUmVhbCBUaW1lIGFsbG9jYXRpb24gcHJvZmlsZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdTE2XzIgfSwgeyAubmFtZSA9ICJkYmEiLCAuZGVzY3IgPSAiREJBIGNvbmZpZ3VyYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIGRiYSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9kYmEgfSwgeyAubmFtZSA9ICJwb3dlcl9tYW5hZ2VtZW50IiwgLmRlc2NyID0gIk9OVSBwb3dlciBtYW5hZ2VtZW50IGNvbnRyb2wiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIHBvd2VyX21hbmFnZW1lbnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uIH0sIHsgLm5hbWUgPSAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzIiwgLmRlc2NyID0gIlJvZ3VlIE9OVSBkZXRlY3Rpb24gcHJvY2VzcyBjb25maWd1cmF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCByb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MgfSwgeyAubmFtZSA9ICJwZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nIiwgLmRlc2NyID0gIlBlcmlvZGljIFN0YW5kYnkgUE9OIG1vbml0b3JpbmciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIHBlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nIH0sIHsgLm5hbWUgPSAicHJic19jaGVja2VyIiwgLmRlc2NyID0gIlVTIFBSQlMgY2hlY2tlciBjb25maWd1cmF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBwcmJzX2NoZWNrZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wcmJzX2NoZWNrZXJfY29uZmlnIH0sIHsgLm5hbWUgPSAicHJic19nZW5lcmF0b3IiLCAuZGVzY3IgPSAiRFMgUFJCUyBnZW5lcmF0b3IgY29uZmlndXJhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgcHJic19nZW5lcmF0b3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wcmJzX2dlbmVyYXRvcl9jb25maWcgfSwgeyAubmFtZSA9ICJtaW5fZGF0YV9hbGxvY19pZCIsIC5kZXNjciA9ICJNaW4gZGF0YSBBbGxvYyBJRCB2YWx1ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgbWluX2RhdGFfYWxsb2NfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24iLCAuZGVzY3IgPSAiT3B0aW9uIHRvIGRpc2FibGUgdGhlIGF1dG9tYXRpYyBkZWFjdGl2YXRpb24gb2YgT05VcyBkdWUgdG8gYWxhcm1zIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uIH0sIHsgLm5hbWUgPSAidXNfYmFuZHdpZHRoX2xpbWl0IiwgLmRlc2NyID0gIlRvdGFsIFBPTiB1cHN0cmVhbSBiYW5kd2lkdGggbGltaXQgaW4gYnl0ZXMgcGVyIHNlY29uZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIHVzX2JhbmR3aWR0aF9saW1pdCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJhbGxfb251cyIsIC5kZXNjciA9ICJBbGwgT05VcyBjdXJyZW50bHkgcHJvdmlzaW9uZWQgb24gdGhpcyBQT04uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhLCBhbGxfb251cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzEyOCB9LCB7IC5uYW1lID0gImFsbF9tY2FzdF9nZW1fcG9ydHMiLCAuZGVzY3IgPSAiQWxsIG11bHRpY2FzdCBHRU0gcG9ydHMgY3VycmVudGx5IHByb3Zpc2lvbmVkIG9uIHRoaXMgUE9OLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSwgYWxsX21jYXN0X2dlbV9wb3J0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4IH0sIHsgLm5hbWUgPSAiZGVidWciLCAuZGVzY3IgPSAiUE9OIE5JIGRlYnVnIHBhcmFtZXRlcnMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIGRlYnVnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9kZWJ1ZyB9LCB7IC5uYW1lID0gIm9udV91cGdyYWRlX3BhcmFtcyIsIC5kZXNjciA9ICJPTlUgdXBncmFkZSBwYXJhbXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIG9udV91cGdyYWRlX3BhcmFtcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zIH0sIHsgLm5hbWUgPSAicHNfY193YWl0X2JlZm9yZV9kZWFjdGl2YXRpb25fdGltZW91dCIsIC5kZXNjciA9ICJQUyB0eXBlIEMgdGltZW91dCBpbiBtaWxsaXNlY29uZHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIHBzX2Nfd2FpdF9iZWZvcmVfZGVhY3RpdmF0aW9uX3RpbWVvdXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiYmlwMzJfaW5kaWNhdGlvbl9jb250cm9sIiwgLmRlc2NyID0gIk9wdGlvbiB0byBkaXNhYmxlIHRoZSBiaXAzMiBpbmRpY2F0aW9uIHdoZW4gdGhlIHZhbHVlIGlzIHplcm8iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGEsIGJpcDMyX2luZGljYXRpb25fY29udHJvbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSIsIC5kZXNjciA9ICJjZmciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9uaSAtIHN0YXQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfZmVjX2NvZGV3b3JkcyA9IHsgLm5hbWUgPSAiZmVjX2NvZGV3b3JkcyIsIC5kZXNjciA9ICJSZWNlaXZlZCBGRUMgY29kZXdvcmRzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9GRUNfQ09ERVdPUkRTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCBmZWNfY29kZXdvcmRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9mZWNfY29kZXdvcmRzX3VuY29ycmVjdGVkID0geyAubmFtZSA9ICJmZWNfY29kZXdvcmRzX3VuY29ycmVjdGVkIiwgLmRlc2NyID0gIlJlY2VpdmVkIHVuY29ycmVjdGVkIEZFQyBjb2Rld29yZHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX0ZFQ19DT0RFV09SRFNfVU5DT1JSRUNURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIGZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X2JpcDhfYnl0ZXMgPSB7IC5uYW1lID0gImJpcDhfYnl0ZXMiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgYnl0ZXMgcHJvdGVjdGVkIGJ5IGJpcDgiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX0JJUDhfQllURVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIGJpcDhfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X2JpcDhfZXJyb3JzID0geyAubmFtZSA9ICJiaXA4X2Vycm9ycyIsIC5kZXNjciA9ICJSZWNlaXZlZCBiaXA4IGVycm9ycyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfQklQOF9FUlJPUlMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIGJpcDhfZXJyb3JzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9yeF9nZW1fcGFja2V0cyA9IHsgLm5hbWUgPSAicnhfZ2VtX3BhY2tldHMiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgR0VNIGZyYW1lcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX1BBQ0tFVFMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X2dlbV9wYWNrZXRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9yeF9nZW1fZHJvcHBlZCA9IHsgLm5hbWUgPSAicnhfZ2VtX2Ryb3BwZWQiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgZHJvcHBlZCBHRU0gSUQgcGFja2V0cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfR0VNX0RST1BQRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X2dlbV9kcm9wcGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9yeF9nZW1faWRsZSA9IHsgLm5hbWUgPSAicnhfZ2VtX2lkbGUiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgaWRsZSBHRU0gZnJhbWVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9HRU1fSURMRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgcnhfZ2VtX2lkbGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X2dlbV9jb3JyZWN0ZWQgPSB7IC5uYW1lID0gInJ4X2dlbV9jb3JyZWN0ZWQiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgY29ycmVjdGVkIEdFTSBmcmFtZXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9DT1JSRUNURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X2dlbV9jb3JyZWN0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X2dlbV9pbGxlZ2FsID0geyAubmFtZSA9ICJyeF9nZW1faWxsZWdhbCIsIC5kZXNjciA9ICJSZWNlaXZlZCBpbGxlZ2FsIEdFTSBmcmFtZXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0dFTV9JTExFR0FMLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9nZW1faWxsZWdhbCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfcnhfYWxsb2NhdGlvbnNfdmFsaWQgPSB7IC5uYW1lID0gInJ4X2FsbG9jYXRpb25zX3ZhbGlkIiwgLmRlc2NyID0gIlJlY2VpdmVkIHZhbGlkIGFsbG9jYXRpb25zIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19WQUxJRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgcnhfYWxsb2NhdGlvbnNfdmFsaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X2FsbG9jYXRpb25zX2ludmFsaWQgPSB7IC5uYW1lID0gInJ4X2FsbG9jYXRpb25zX2ludmFsaWQiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgaW52YWxpZCBhbGxvY2F0aW9ucyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfSU5WQUxJRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgcnhfYWxsb2NhdGlvbnNfaW52YWxpZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfcnhfYWxsb2NhdGlvbnNfZGlzYWJsZWQgPSB7IC5uYW1lID0gInJ4X2FsbG9jYXRpb25zX2Rpc2FibGVkIiwgLmRlc2NyID0gIlJlY2VpdmVkIGRpc2FibGVkIGFsbG9jYXRpb25zIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19ESVNBQkxFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgcnhfYWxsb2NhdGlvbnNfZGlzYWJsZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X3Bsb2FtcyA9IHsgLm5hbWUgPSAicnhfcGxvYW1zIiwgLmRlc2NyID0gIlJlY2VpdmVkIFBsb2FtcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUExPQU1TLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9wbG9hbXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X3Bsb2Ftc19ub25faWRsZSA9IHsgLm5hbWUgPSAicnhfcGxvYW1zX25vbl9pZGxlIiwgLmRlc2NyID0gIlJlY2VpdmVkIG5vbiBpZGxlIFBsb2FtcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX05PTl9JRExFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9wbG9hbXNfbm9uX2lkbGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X3Bsb2Ftc19lcnJvciA9IHsgLm5hbWUgPSAicnhfcGxvYW1zX2Vycm9yIiwgLmRlc2NyID0gIlJlY2VpdmVkIGVycm9yIFBsb2FtcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX0VSUk9SLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9wbG9hbXNfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X3Bsb2Ftc19kcm9wcGVkID0geyAubmFtZSA9ICJyeF9wbG9hbXNfZHJvcHBlZCIsIC5kZXNjciA9ICJSZWNlaXZlZCBkcm9wcGVkIFBsb2FtcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX0RST1BQRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X3Bsb2Ftc19kcm9wcGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9yeF9jcHUgPSB7IC5uYW1lID0gInJ4X2NwdSIsIC5kZXNjciA9ICJSZWNlaXZlZCBDUFUgcGFja2V0cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfQ1BVLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9jcHUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X29tY2kgPSB7IC5uYW1lID0gInJ4X29tY2kiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgT01DSSBwYWNrZXRzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9PTUNJLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9vbWNpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9yeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yID0geyAubmFtZSA9ICJyeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yIiwgLmRlc2NyID0gIlJlY2VpdmVkIE9NQ0kgcGFja2V0cyB3aXRoIENSQyBlcnJvcnMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1IsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X2Ryb3BwZWRfdG9vX3Nob3J0ID0geyAubmFtZSA9ICJyeF9kcm9wcGVkX3Rvb19zaG9ydCIsIC5kZXNjciA9ICJSZWNlaXZlZCBwYWNrZXRzIGRyb3BwZWQgZHVlIHRvIGxlbmd0aCB0b28gc2hvcnQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0RST1BQRURfVE9PX1NIT1JULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9kcm9wcGVkX3Rvb19zaG9ydCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfcnhfZHJvcHBlZF90b29fbG9uZyA9IHsgLm5hbWUgPSAicnhfZHJvcHBlZF90b29fbG9uZyIsIC5kZXNjciA9ICJSZWNlaXZlZCBwYWNrZXQgZHJvcHBlZCBkdWUgdG8gbGVuZ3RoIHRvbyBsb25nIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9SWF9EUk9QUEVEX1RPT19MT05HLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9kcm9wcGVkX3Rvb19sb25nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9yeF9jcmNfZXJyb3JzID0geyAubmFtZSA9ICJyeF9jcmNfZXJyb3JzIiwgLmRlc2NyID0gIlJlY2VpdmVkIHBhY2tldCBkcm9wcGVkIGR1ZSB0byBjcmMgZXJyb3IiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1JYX0NSQ19FUlJPUlMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X2NyY19lcnJvcnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X2tleV9lcnJvcnMgPSB7IC5uYW1lID0gInJ4X2tleV9lcnJvcnMiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgcGFja2V0IGRyb3BwZWQgZHVlIHRvIGtleSBlcnJvciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfS0VZX0VSUk9SUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgcnhfa2V5X2Vycm9ycyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfcnhfZnJhZ21lbnRzX2Vycm9ycyA9IHsgLm5hbWUgPSAicnhfZnJhZ21lbnRzX2Vycm9ycyIsIC5kZXNjciA9ICJSZWNlaXZlZCBwYWNrZXQgZHJvcHBlZCBkdWUgdG8gZnJhZ21lbnRhdGlvbiBlcnJvciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfRlJBR01FTlRTX0VSUk9SUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgcnhfZnJhZ21lbnRzX2Vycm9ycyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfcnhfcGFja2V0c19kcm9wcGVkID0geyAubmFtZSA9ICJyeF9wYWNrZXRzX2Ryb3BwZWQiLCAuZGVzY3IgPSAiR2xvYmFsIGRyb3BwZWQgcGFja2V0cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfUlhfUEFDS0VUU19EUk9QUEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9wYWNrZXRzX2Ryb3BwZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3R4X2dlbSA9IHsgLm5hbWUgPSAidHhfZ2VtIiwgLmRlc2NyID0gIlRyYW5zbWl0dGVkIEdFTSBmcmFtZXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0dFTSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgdHhfZ2VtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF90eF9wbG9hbXMgPSB7IC5uYW1lID0gInR4X3Bsb2FtcyIsIC5kZXNjciA9ICJUcmFuc21pdHRlZCBQbG9hbXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX1BMT0FNUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgdHhfcGxvYW1zKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF90eF9nZW1fZnJhZ21lbnRzID0geyAubmFtZSA9ICJ0eF9nZW1fZnJhZ21lbnRzIiwgLmRlc2NyID0gIlRyYW5zbWl0dGVkIEdFTSBmcmFnbWVudHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0dFTV9GUkFHTUVOVFMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHR4X2dlbV9mcmFnbWVudHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3R4X2NwdSA9IHsgLm5hbWUgPSAidHhfY3B1IiwgLmRlc2NyID0gIlRyYW5zbWl0dGVkIENQVSBwYWNrZXRzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9DUFUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHR4X2NwdSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfdHhfb21jaSA9IHsgLm5hbWUgPSAidHhfb21jaSIsIC5kZXNjciA9ICJUcmFuc21pdHRlZCBPTUNJIHBhY2tldHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX09NQ0ksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHR4X29tY2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3R4X2NwdV9vbWNpX3BhY2tldHNfZHJvcHBlZCA9IHsgLm5hbWUgPSAidHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkIiwgLmRlc2NyID0gIlRyYW5zbWl0IHBhY2tldHMgZHJvcHBlZCBkdWUgdG8gaWxsZWdhbCBsZW5ndGgiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0lEX1RYX0NQVV9PTUNJX1BBQ0tFVFNfRFJPUFBFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgdHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3R4X2Ryb3BwZWRfaWxsZWdhbF9sZW5ndGggPSB7IC5uYW1lID0gInR4X2Ryb3BwZWRfaWxsZWdhbF9sZW5ndGgiLCAuZGVzY3IgPSAiVHJhbnNtaXR0ZWQgcGFja2V0IGRyb3BwZWQgZHVlIHRvIGlsbGVnYWwgbGVuZ3RoIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfU1RBVF9JRF9UWF9EUk9QUEVEX0lMTEVHQUxfTEVOR1RILCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCB0eF9kcm9wcGVkX2lsbGVnYWxfbGVuZ3RoKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF90eF9kcm9wcGVkX3RwaWRfbWlzcyA9IHsgLm5hbWUgPSAidHhfZHJvcHBlZF90cGlkX21pc3MiLCAuZGVzY3IgPSAiRHJvcHBlZCBiZWNhdXNlIG9mIFRQSUQgbWlzcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9UUElEX01JU1MsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHR4X2Ryb3BwZWRfdHBpZF9taXNzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF90eF9kcm9wcGVkX3ZpZF9taXNzID0geyAubmFtZSA9ICJ0eF9kcm9wcGVkX3ZpZF9taXNzIiwgLmRlc2NyID0gIkRyb3BwZWQgYmVjYXVzZSBvZiBWSUQgbWlzcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9WSURfTUlTUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgdHhfZHJvcHBlZF92aWRfbWlzcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX25pX3N0YXRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfZmVjX2NvZGV3b3JkcywgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X2ZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQsICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9iaXA4X2J5dGVzLCAmcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfYmlwOF9lcnJvcnMsICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9yeF9nZW1fcGFja2V0cywgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X2dlbV9kcm9wcGVkLCAmcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfcnhfZ2VtX2lkbGUsICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9yeF9nZW1fY29ycmVjdGVkLCAmcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfcnhfZ2VtX2lsbGVnYWwsICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9yeF9hbGxvY2F0aW9uc192YWxpZCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X2FsbG9jYXRpb25zX2ludmFsaWQsICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9yeF9hbGxvY2F0aW9uc19kaXNhYmxlZCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X3Bsb2FtcywgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X3Bsb2Ftc19ub25faWRsZSwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X3Bsb2Ftc19lcnJvciwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X3Bsb2Ftc19kcm9wcGVkLCAmcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfcnhfY3B1LCAmcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfcnhfb21jaSwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X29tY2lfcGFja2V0c19jcmNfZXJyb3IsICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9yeF9kcm9wcGVkX3Rvb19zaG9ydCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X2Ryb3BwZWRfdG9vX2xvbmcsICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9yeF9jcmNfZXJyb3JzLCAmcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfcnhfa2V5X2Vycm9ycywgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3J4X2ZyYWdtZW50c19lcnJvcnMsICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9yeF9wYWNrZXRzX2Ryb3BwZWQsICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF90eF9nZW0sICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF90eF9wbG9hbXMsICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF90eF9nZW1fZnJhZ21lbnRzLCAmcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfdHhfY3B1LCAmcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfdHhfb21jaSwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3R4X2NwdV9vbWNpX3BhY2tldHNfZHJvcHBlZCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3R4X2Ryb3BwZWRfaWxsZWdhbF9sZW5ndGgsICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF90eF9kcm9wcGVkX3RwaWRfbWlzcywgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X3R4X2Ryb3BwZWRfdmlkX21pc3MgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImZlY19jb2Rld29yZHMiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgRkVDIGNvZGV3b3JkcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIGZlY19jb2Rld29yZHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZmVjX2NvZGV3b3Jkc191bmNvcnJlY3RlZCIsIC5kZXNjciA9ICJSZWNlaXZlZCB1bmNvcnJlY3RlZCBGRUMgY29kZXdvcmRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgZmVjX2NvZGV3b3Jkc191bmNvcnJlY3RlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJiaXA4X2J5dGVzIiwgLmRlc2NyID0gIlJlY2VpdmVkIGJ5dGVzIHByb3RlY3RlZCBieSBiaXA4IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgYmlwOF9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJiaXA4X2Vycm9ycyIsIC5kZXNjciA9ICJSZWNlaXZlZCBiaXA4IGVycm9ycyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIGJpcDhfZXJyb3JzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X2dlbV9wYWNrZXRzIiwgLmRlc2NyID0gIlJlY2VpdmVkIEdFTSBmcmFtZXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9nZW1fcGFja2V0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9nZW1fZHJvcHBlZCIsIC5kZXNjciA9ICJSZWNlaXZlZCBkcm9wcGVkIEdFTSBJRCBwYWNrZXRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgcnhfZ2VtX2Ryb3BwZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfZ2VtX2lkbGUiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgaWRsZSBHRU0gZnJhbWVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgcnhfZ2VtX2lkbGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfZ2VtX2NvcnJlY3RlZCIsIC5kZXNjciA9ICJSZWNlaXZlZCBjb3JyZWN0ZWQgR0VNIGZyYW1lcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X2dlbV9jb3JyZWN0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfZ2VtX2lsbGVnYWwiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgaWxsZWdhbCBHRU0gZnJhbWVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgcnhfZ2VtX2lsbGVnYWwpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfYWxsb2NhdGlvbnNfdmFsaWQiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgdmFsaWQgYWxsb2NhdGlvbnMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9hbGxvY2F0aW9uc192YWxpZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9hbGxvY2F0aW9uc19pbnZhbGlkIiwgLmRlc2NyID0gIlJlY2VpdmVkIGludmFsaWQgYWxsb2NhdGlvbnMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9hbGxvY2F0aW9uc19pbnZhbGlkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X2FsbG9jYXRpb25zX2Rpc2FibGVkIiwgLmRlc2NyID0gIlJlY2VpdmVkIGRpc2FibGVkIGFsbG9jYXRpb25zIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgcnhfYWxsb2NhdGlvbnNfZGlzYWJsZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfcGxvYW1zIiwgLmRlc2NyID0gIlJlY2VpdmVkIFBsb2FtcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X3Bsb2FtcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9wbG9hbXNfbm9uX2lkbGUiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgbm9uIGlkbGUgUGxvYW1zIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgcnhfcGxvYW1zX25vbl9pZGxlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X3Bsb2Ftc19lcnJvciIsIC5kZXNjciA9ICJSZWNlaXZlZCBlcnJvciBQbG9hbXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9wbG9hbXNfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfcGxvYW1zX2Ryb3BwZWQiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgZHJvcHBlZCBQbG9hbXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9wbG9hbXNfZHJvcHBlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9jcHUiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgQ1BVIHBhY2tldHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9jcHUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfb21jaSIsIC5kZXNjciA9ICJSZWNlaXZlZCBPTUNJIHBhY2tldHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9vbWNpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgT01DSSBwYWNrZXRzIHdpdGggQ1JDIGVycm9ycyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfZHJvcHBlZF90b29fc2hvcnQiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgcGFja2V0cyBkcm9wcGVkIGR1ZSB0byBsZW5ndGggdG9vIHNob3J0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgcnhfZHJvcHBlZF90b29fc2hvcnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfZHJvcHBlZF90b29fbG9uZyIsIC5kZXNjciA9ICJSZWNlaXZlZCBwYWNrZXQgZHJvcHBlZCBkdWUgdG8gbGVuZ3RoIHRvbyBsb25nIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgcnhfZHJvcHBlZF90b29fbG9uZyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9jcmNfZXJyb3JzIiwgLmRlc2NyID0gIlJlY2VpdmVkIHBhY2tldCBkcm9wcGVkIGR1ZSB0byBjcmMgZXJyb3IiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9jcmNfZXJyb3JzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X2tleV9lcnJvcnMiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgcGFja2V0IGRyb3BwZWQgZHVlIHRvIGtleSBlcnJvciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X2tleV9lcnJvcnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfZnJhZ21lbnRzX2Vycm9ycyIsIC5kZXNjciA9ICJSZWNlaXZlZCBwYWNrZXQgZHJvcHBlZCBkdWUgdG8gZnJhZ21lbnRhdGlvbiBlcnJvciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X2ZyYWdtZW50c19lcnJvcnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfcGFja2V0c19kcm9wcGVkIiwgLmRlc2NyID0gIkdsb2JhbCBkcm9wcGVkIHBhY2tldHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCByeF9wYWNrZXRzX2Ryb3BwZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfZ2VtIiwgLmRlc2NyID0gIlRyYW5zbWl0dGVkIEdFTSBmcmFtZXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCB0eF9nZW0pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfcGxvYW1zIiwgLmRlc2NyID0gIlRyYW5zbWl0dGVkIFBsb2FtcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHR4X3Bsb2FtcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJ0eF9nZW1fZnJhZ21lbnRzIiwgLmRlc2NyID0gIlRyYW5zbWl0dGVkIEdFTSBmcmFnbWVudHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCB0eF9nZW1fZnJhZ21lbnRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInR4X2NwdSIsIC5kZXNjciA9ICJUcmFuc21pdHRlZCBDUFUgcGFja2V0cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHR4X2NwdSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJ0eF9vbWNpIiwgLmRlc2NyID0gIlRyYW5zbWl0dGVkIE9NQ0kgcGFja2V0cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHR4X29tY2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkIiwgLmRlc2NyID0gIlRyYW5zbWl0IHBhY2tldHMgZHJvcHBlZCBkdWUgdG8gaWxsZWdhbCBsZW5ndGgiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhLCB0eF9jcHVfb21jaV9wYWNrZXRzX2Ryb3BwZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJ0eF9kcm9wcGVkX2lsbGVnYWxfbGVuZ3RoIiwgLmRlc2NyID0gIlRyYW5zbWl0dGVkIHBhY2tldCBkcm9wcGVkIGR1ZSB0byBpbGxlZ2FsIGxlbmd0aCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHR4X2Ryb3BwZWRfaWxsZWdhbF9sZW5ndGgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfZHJvcHBlZF90cGlkX21pc3MiLCAuZGVzY3IgPSAiRHJvcHBlZCBiZWNhdXNlIG9mIFRQSUQgbWlzcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEsIHR4X2Ryb3BwZWRfdHBpZF9taXNzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInR4X2Ryb3BwZWRfdmlkX21pc3MiLCAuZGVzY3IgPSAiRHJvcHBlZCBiZWNhdXNlIG9mIFZJRCBtaXNzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSwgdHhfZHJvcHBlZF92aWRfbWlzcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3N0YXRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfc3RhdF9kYXRhIiwgLmRlc2NyID0gInN0YXQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9uaSAtIHNldF9wb25fc3RhdGUgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3NldF9wb25fc3RhdGVfcG9uX3N0YXRlID0geyAubmFtZSA9ICJwb25fc3RhdGUiLCAuZGVzY3IgPSAiUE9OIHN0YXRlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfU0VUX1BPTl9TVEFURV9JRF9QT05fU1RBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGEsIHBvbl9zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9vcGVyYXRpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX25pX3NldF9wb25fc3RhdGVfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX25pX3NldF9wb25fc3RhdGVfcG9uX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwb25fc3RhdGUiLCAuZGVzY3IgPSAiUE9OIHN0YXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YSwgcG9uX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX29wZXJhdGlvbiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGEiLCAuZGVzY3IgPSAiU2V0IFBPTiBTdGF0ZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX25pIC0gcmVzZXQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX25pX3Jlc2V0X3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGdwb25fbmkgLSBkaXNhYmxlX3NlcmlhbF9udW1iZXIgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9jb250cm9sID0geyAubmFtZSA9ICJjb250cm9sIiwgLmRlc2NyID0gImNvbnRyb2wiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9ESVNBQkxFX1NFUklBTF9OVU1CRVJfSURfQ09OVFJPTCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhLCBjb250cm9sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2NvbnRyb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9zZXJpYWxfbnVtYmVyID0geyAubmFtZSA9ICJzZXJpYWxfbnVtYmVyIiwgLmRlc2NyID0gInNlcmlhbCBudW1iZXIiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9ESVNBQkxFX1NFUklBTF9OVU1CRVJfSURfU0VSSUFMX05VTUJFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhLCBzZXJpYWxfbnVtYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc2VyaWFsX251bWJlciB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfY29udHJvbCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfc2VyaWFsX251bWJlciB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJjb250cm9sIiwgLmRlc2NyID0gImNvbnRyb2wiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGEsIGNvbnRyb2wpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9kaXNhYmxlX3NlcmlhbF9udW1iZXJfY29udHJvbCB9LCB7IC5uYW1lID0gInNlcmlhbF9udW1iZXIiLCAuZGVzY3IgPSAic2VyaWFsIG51bWJlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YSwgc2VyaWFsX251bWJlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3NlcmlhbF9udW1iZXIgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YSIsIC5kZXNjciA9ICJEaXNhYmxlIFNlcmlhbCBOdW1iZXIiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9uaSAtIHNpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogZ3Bvbl9uaSAtIHNldF9vbnVfc3RhdGUgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3NldF9vbnVfc3RhdGVfb251X3N0YXRlID0geyAubmFtZSA9ICJvbnVfc3RhdGUiLCAuZGVzY3IgPSAiTmV3IG9wZXJhdGlvbiBzdGF0ZSBvZiBhbGwgT05Vcy4gIFRoZSBkZWZhdWx0IG9wZXJhdGlvbiBtYXkgYmUgY29uZmlndXJlZCBieSB0aGUgR1BPTiBOSSBjb25maWd1cmF0aW9uIG9iamVjdCA6IGdwb25fbmkuY2ZnLnNuX2FjcXVpc2l0aW9uLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1NFVF9PTlVfU1RBVEVfSURfT05VX1NUQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhLCBvbnVfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9vbnVfb3BlcmF0aW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9uaV9zZXRfb251X3N0YXRlX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX29udV9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAib251X3N0YXRlIiwgLmRlc2NyID0gIk5ldyBvcGVyYXRpb24gc3RhdGUgb2YgYWxsIE9OVXMuICBUaGUgZGVmYXVsdCBvcGVyYXRpb24gbWF5IGJlIGNvbmZpZ3VyZWQgYnkgdGhlIEdQT04gTkkgY29uZmlndXJhdGlvbiBvYmplY3QgOiBncG9uX25pLmNmZy5zbl9hY3F1aXNpdGlvbi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhLCBvbnVfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9vbnVfb3BlcmF0aW9uIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YSIsIC5kZXNjciA9ICJTZXQgdGhlIG9wZXJhdGlvbiBzdGF0ZSBvZiBhbGwgT05Vcy4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9uaSAtIHN0YXRlX2NoYW5nZV9jb21wbGV0ZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfcmVzdWx0ID0geyAubmFtZSA9ICJyZXN1bHQiLCAuZGVzY3IgPSAiUmVzdWx0IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9SRVNVTFQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEsIHJlc3VsdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9wcmV2aW91c19zdGF0ZSA9IHsgLm5hbWUgPSAicHJldmlvdXNfc3RhdGUiLCAuZGVzY3IgPSAiUHJldmlvdXMgc3RhdGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX1BSRVZJT1VTX1NUQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhLCBwcmV2aW91c19zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9uZXdfc3RhdGUgPSB7IC5uYW1lID0gIm5ld19zdGF0ZSIsIC5kZXNjciA9ICJOZXcgc3RhdGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX05FV19TVEFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSwgbmV3X3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX3Jlc3VsdCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX3ByZXZpb3VzX3N0YXRlLCAmcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfbmV3X3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyZXN1bHQiLCAuZGVzY3IgPSAiUmVzdWx0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSwgcmVzdWx0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH0sIHsgLm5hbWUgPSAicHJldmlvdXNfc3RhdGUiLCAuZGVzY3IgPSAiUHJldmlvdXMgc3RhdGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhLCBwcmV2aW91c19zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9zdGF0ZSB9LCB7IC5uYW1lID0gIm5ld19zdGF0ZSIsIC5kZXNjciA9ICJOZXcgc3RhdGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhLCBuZXdfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25fc3RhdGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhIiwgLmRlc2NyID0gIlN0YXRlIENoYW5nZSBDb21wbGV0ZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9uaSAtIGxvcyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfbG9zX3N0YXR1cyA9IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gInN0YXR1cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0xPU19JRF9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9sb3NfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9uaV9sb3NfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX25pX2xvc19zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfbG9zX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gInN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9sb3NfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9sb3NfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfbG9zX2RhdGEiLCAuZGVzY3IgPSAiTE9TIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfbG9zX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9sb3NfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2xvc19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fbmkgLSBzZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0X3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGdwb25fbmkgLSBwcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfcmVzdWx0ID0geyAubmFtZSA9ICJyZXN1bHQiLCAuZGVzY3IgPSAiUmVzdWx0IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUVfSURfUkVTVUxULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YSwgcmVzdWx0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdHJhZmZpY19yZXN1bWVfcmVzdWx0IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfcmVzdWx0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicmVzdWx0IiwgLmRlc2NyID0gIlJlc3VsdCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhLCByZXN1bHQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF90cmFmZmljX3Jlc3VtZV9yZXN1bHQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGEiLCAuZGVzY3IgPSAiUHJvdGVjdGlvbiBTd2l0Y2hpbmcgVHJhZmZpYyBSZXN1bWUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9uaSAtIHByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9vbnVzID0geyAubmFtZSA9ICJvbnVzIiwgLmRlc2NyID0gIk9OVXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19PTlVTX1JBTkdFRF9JRF9PTlVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSwgb251cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2VxZF9saXN0X3UzMiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX29udXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJvbnVzIiwgLmRlc2NyID0gIk9OVXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSwgb251cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2VxZF9saXN0X3UzMiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSIsIC5kZXNjciA9ICJBZnRlciBhIHN3aXRjaG92ZXIgaXMgY29tcGxldGUgYW5kIGFsbCBPTlUgcmFuZ2luZyB0aW1lcyBoYXZlIHN0YWJpbGl6ZWQsIHRoaXMgaW5kaWNhdGlvbiBpcyBzZW50IHRvIGluZm9ybSB0aGUgaG9zdCBvZiBhbGwgbmV3IE9OVSBFUURzLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX25pIC0gcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX3Jlc3VsdCA9IHsgLm5hbWUgPSAicmVzdWx0IiwgLmRlc2NyID0gIlJlc3VsdCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVEX0lEX1JFU1VMVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGEsIHJlc3VsdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX3Jlc3VsdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJlc3VsdCIsIC5kZXNjciA9ICJSZXN1bHQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YSwgcmVzdWx0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhIiwgLmRlc2NyID0gIlByb3RlY3Rpb24gU3dpdGNoaW5nIFN3aXRjaG92ZXIgQ29tcGxldGVkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fbmkgLSBzdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfbnVtYmVyX29mX2RldGVjdGVkX2RlbGltaXRlciA9IHsgLm5hbWUgPSAibnVtYmVyX29mX2RldGVjdGVkX2RlbGltaXRlciIsIC5kZXNjciA9ICJudW1iZXIgb2YgZGV0ZWN0ZWQgZGVsaW1pdGVyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURURfSURfTlVNQkVSX09GX0RFVEVDVEVEX0RFTElNSVRFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGEsIG51bWJlcl9vZl9kZXRlY3RlZF9kZWxpbWl0ZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9lbmVyZ3lfZGV0ZWN0X3NpZ25hbCA9IHsgLm5hbWUgPSAiZW5lcmd5X2RldGVjdF9zaWduYWwiLCAuZGVzY3IgPSAiZW5lcmd5IGRldGVjdCBzaWduYWwiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRF9JRF9FTkVSR1lfREVURUNUX1NJR05BTCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGEsIGVuZXJneV9kZXRlY3Rfc2lnbmFsKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfbnVtYmVyX29mX2RldGVjdGVkX2RlbGltaXRlciwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9lbmVyZ3lfZGV0ZWN0X3NpZ25hbCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm51bWJlcl9vZl9kZXRlY3RlZF9kZWxpbWl0ZXIiLCAuZGVzY3IgPSAibnVtYmVyIG9mIGRldGVjdGVkIGRlbGltaXRlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhLCBudW1iZXJfb2ZfZGV0ZWN0ZWRfZGVsaW1pdGVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImVuZXJneV9kZXRlY3Rfc2lnbmFsIiwgLmRlc2NyID0gImVuZXJneSBkZXRlY3Qgc2lnbmFsIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGEsIGVuZXJneV9kZXRlY3Rfc2lnbmFsKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhIiwgLmRlc2NyID0gIlN0YW5kYnkgUE9OIE1vbml0b3JpbmcgQ3ljbGUgQ29tcGxldGVkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fbmkgLSBvbnVfZGlzY292ZXJlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfb251X2Rpc2NvdmVyZWRfc2VyaWFsX251bWJlciA9IHsgLm5hbWUgPSAic2VyaWFsX251bWJlciIsIC5kZXNjciA9ICJzZXJpYWwgbnVtYmVyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfT05VX0RJU0NPVkVSRURfSURfU0VSSUFMX05VTUJFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEsIHNlcmlhbF9udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zZXJpYWxfbnVtYmVyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9yYW5naW5nX3RpbWUgPSB7IC5uYW1lID0gInJhbmdpbmdfdGltZSIsIC5kZXNjciA9ICJyYW5naW5nIHRpbWUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9SQU5HSU5HX1RJTUUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhLCByYW5naW5nX3RpbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9vbnVfaWQgPSB7IC5uYW1lID0gIm9udV9pZCIsIC5kZXNjciA9ICJvbnVfaWQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9PTlVfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhLCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fbmlfb251X2Rpc2NvdmVyZWRfc2VyaWFsX251bWJlciwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9yYW5naW5nX3RpbWUsICZwcm9wX2Rlc2NyX2dwb25fbmlfb251X2Rpc2NvdmVyZWRfb251X2lkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic2VyaWFsX251bWJlciIsIC5kZXNjciA9ICJzZXJpYWwgbnVtYmVyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEsIHNlcmlhbF9udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zZXJpYWxfbnVtYmVyIH0sIHsgLm5hbWUgPSAicmFuZ2luZ190aW1lIiwgLmRlc2NyID0gInJhbmdpbmcgdGltZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhLCByYW5naW5nX3RpbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAib251X2lkIiwgLmRlc2NyID0gIm9udV9pZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhLCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhIiwgLmRlc2NyID0gIk9OVSBEaXNjb3ZlcmVkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fbmkgLSBjcHVfcGFja2V0c19mYWlsdXJlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2Vycm9yID0geyAubmFtZSA9ICJlcnJvciIsIC5kZXNjciA9ICJUaGUgZXJyb3IgdGhhdCB3YXMgZW5jb3VudGVyZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfRkFJTFVSRV9JRF9FUlJPUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSwgZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wYWNrZXRfaW5qZWN0aW9uX2Vycm9yIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2dlbV9wb3J0X2lkID0geyAubmFtZSA9ICJnZW1fcG9ydF9pZCIsIC5kZXNjciA9ICJUaGUgR0VNIHBvcnQgdGhhdCBjYXVzZWQgdGhlIGVycm9yLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0ZBSUxVUkVfSURfR0VNX1BPUlRfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGEsIGdlbV9wb3J0X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9lcnJvciwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2dlbV9wb3J0X2lkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJlcnJvciIsIC5kZXNjciA9ICJUaGUgZXJyb3IgdGhhdCB3YXMgZW5jb3VudGVyZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSwgZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wYWNrZXRfaW5qZWN0aW9uX2Vycm9yIH0sIHsgLm5hbWUgPSAiZ2VtX3BvcnRfaWQiLCAuZGVzY3IgPSAiVGhlIEdFTSBwb3J0IHRoYXQgY2F1c2VkIHRoZSBlcnJvci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhLCBnZW1fcG9ydF9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhIiwgLmRlc2NyID0gIkEgZmFpbHVyZSB3YXMgZW5jb3VudGVyZWQgZHVyaW5nIHRoZSBcImNwdV9wYWNrZXRzXCIgcHJveHkgb3BlcmF0aW9uLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX25pIC0gY3B1X3BhY2tldHMgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2NwdV9wYWNrZXRzX3BhY2tldF90eXBlID0geyAubmFtZSA9ICJwYWNrZXRfdHlwZSIsIC5kZXNjciA9ICJwYWNrZXQgdHlwZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0NQVV9QQUNLRVRTX0lEX1BBQ0tFVF9UWVBFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZGF0YSwgcGFja2V0X3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wYWNrZXRfdHlwZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY3B1X3BhY2tldHNfY2FsY19jcmMgPSB7IC5uYW1lID0gImNhbGNfY3JjIiwgLmRlc2NyID0gImNhbGMgY3JjIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfSURfQ0FMQ19DUkMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhLCBjYWxjX2NyYyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY3B1X3BhY2tldHNfZ2VtX3BvcnRfbGlzdCA9IHsgLm5hbWUgPSAiZ2VtX3BvcnRfbGlzdCIsIC5kZXNjciA9ICJnZW0gcG9ydCBsaXN0IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfSURfR0VNX1BPUlRfTElTVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2RhdGEsIGdlbV9wb3J0X2xpc3QpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfY3B1X3BhY2tldHNfYnVmZmVyID0geyAubmFtZSA9ICJidWZmZXIiLCAuZGVzY3IgPSAiYnVmZmVyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZGF0YSwgYnVmZmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDggfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX25pX2NwdV9wYWNrZXRzX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9uaV9jcHVfcGFja2V0c19wYWNrZXRfdHlwZSwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9jcHVfcGFja2V0c19jYWxjX2NyYywgJnByb3BfZGVzY3JfZ3Bvbl9uaV9jcHVfcGFja2V0c19nZW1fcG9ydF9saXN0LCAmcHJvcF9kZXNjcl9ncG9uX25pX2NwdV9wYWNrZXRzX2J1ZmZlciB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBhY2tldF90eXBlIiwgLmRlc2NyID0gInBhY2tldCB0eXBlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2RhdGEsIHBhY2tldF90eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcGFja2V0X3R5cGUgfSwgeyAubmFtZSA9ICJjYWxjX2NyYyIsIC5kZXNjciA9ICJjYWxjIGNyYyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhLCBjYWxjX2NyYyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImdlbV9wb3J0X2xpc3QiLCAuZGVzY3IgPSAiZ2VtIHBvcnQgbGlzdCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhLCBnZW1fcG9ydF9saXN0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTYgfSwgeyAubmFtZSA9ICJidWZmZXIiLCAuZGVzY3IgPSAiYnVmZmVyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2RhdGEsIGJ1ZmZlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhIiwgLmRlc2NyID0gIkdQT04gQ1BVIFBhY2tldHMiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9uaSAtIGJyb2FkY2FzdF9wbG9hbV9wYWNrZXQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfcGxvYW0gPSB7IC5uYW1lID0gInBsb2FtIiwgLmRlc2NyID0gInBsb2FtIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQlJPQURDQVNUX1BMT0FNX1BBQ0tFVF9JRF9QTE9BTSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YSwgcGxvYW0pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdThfMTIgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfcGxvYW0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBsb2FtIiwgLmRlc2NyID0gInBsb2FtIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YSwgcGxvYW0pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdThfMTIgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhIiwgLmRlc2NyID0gIkJyb2FkY2FzdCBQTE9BTSBQYWNrZXQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9uaSAtIHJvZ3VlX2RldGVjdGlvbl93aW5kb3cgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfd2luZG93X3R5cGUgPSB7IC5uYW1lID0gIndpbmRvd190eXBlIiwgLmRlc2NyID0gIlR5cGUgb2Ygc2lsZW50IG1lYXN1cmVtZW50IHRvIGV4ZWN1dGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX1dJTkRPV19UWVBFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhLCB3aW5kb3dfdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl93aW5kb3cgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfYWxsb2NfaWQgPSB7IC5uYW1lID0gImFsbG9jX2lkIiwgLmRlc2NyID0gIkFMTE9DIElEIHRvIHNjYW4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX0FMTE9DX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhLCBhbGxvY19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfb251X2lkID0geyAubmFtZSA9ICJvbnVfaWQiLCAuZGVzY3IgPSAiT05VIElEIHRvIHNjYW4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX09OVV9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YSwgb251X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19zZWNvbmRfcmFuZ2luZ193aW5kb3cgPSB7IC5uYW1lID0gInNlY29uZF9yYW5naW5nX3dpbmRvdyIsIC5kZXNjciA9ICJOb3QgY3VycmVudGx5IHN1cHBvcnRlZCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9XSU5ET1dfSURfU0VDT05EX1JBTkdJTkdfV0lORE9XLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhLCBzZWNvbmRfcmFuZ2luZ193aW5kb3cpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfd2luZG93X3R5cGUsICZwcm9wX2Rlc2NyX2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19hbGxvY19pZCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X29udV9pZCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X3NlY29uZF9yYW5naW5nX3dpbmRvdyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAid2luZG93X3R5cGUiLCAuZGVzY3IgPSAiVHlwZSBvZiBzaWxlbnQgbWVhc3VyZW1lbnQgdG8gZXhlY3V0ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEsIHdpbmRvd190eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdyB9LCB7IC5uYW1lID0gImFsbG9jX2lkIiwgLmRlc2NyID0gIkFMTE9DIElEIHRvIHNjYW4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhLCBhbGxvY19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJvbnVfaWQiLCAuZGVzY3IgPSAiT05VIElEIHRvIHNjYW4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhLCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAic2Vjb25kX3Jhbmdpbmdfd2luZG93IiwgLmRlc2NyID0gIk5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YSwgc2Vjb25kX3Jhbmdpbmdfd2luZG93KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YSIsIC5kZXNjciA9ICJSb2d1ZSBEZXRlY3Rpb24gV2luZG93IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fbmkgLSByb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX3dpbmRvd190eXBlID0geyAubmFtZSA9ICJ3aW5kb3dfdHlwZSIsIC5kZXNjciA9ICJTaWxlbnQgV2luZG93IG9yIEN1dCBvZmYgV2luZG93IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9XSU5ET1dfVFlQRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSwgd2luZG93X3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX21lYXN1cmVtZW50X3N0YXR1cyA9IHsgLm5hbWUgPSAibWVhc3VyZW1lbnRfc3RhdHVzIiwgLmRlc2NyID0gIlN0YXR1cyBvZiB0aGUgcm9ndWUgT05VIGRldGVjdGlvbiByZXN1bHQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9NRUFTVVJFTUVOVF9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEsIG1lYXN1cmVtZW50X3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX21lYXN1cmVtZW50X3Jlc3VsdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9hbGxvY19pZCA9IHsgLm5hbWUgPSAiYWxsb2NfaWQiLCAuZGVzY3IgPSAiQWxsb2MtSUQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX0FMTE9DX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhLCBhbGxvY19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfb251X2lkID0geyAubmFtZSA9ICJvbnVfaWQiLCAuZGVzY3IgPSAiT05VLUlEIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9PTlVfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEsIG9udV9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaXNfZGVsaW5lYXRpb24gPSB7IC5uYW1lID0gImlzX2RlbGluZWF0aW9uIiwgLmRlc2NyID0gIkJ1cnN0IERlbGluZWF0aW9uIGRldGVjdGVkIGR1cmluZyB0aGUgcm9ndWUgT05VIGRldGVjdGlvbi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX0lTX0RFTElORUFUSU9OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhLCBpc19kZWxpbmVhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pc19lZCA9IHsgLm5hbWUgPSAiaXNfZWQiLCAuZGVzY3IgPSAiSXMgRUQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX0lTX0VELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhLCBpc19lZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9yeF9kYXRhID0geyAubmFtZSA9ICJyeF9kYXRhIiwgLmRlc2NyID0gIkNhcHR1cmVkIFBMT0FNdSBtZXNzYWdlIGlmIHRoZSBidXJzdCBkZWxpbmllYXRpb24gd2FzIGRldGVjdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUlhfREFUQSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSwgcnhfZGF0YSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3U4X2xpc3RfdTMyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX3Bsb2FtX3JlY2VpdmVkX29udV9pZCA9IHsgLm5hbWUgPSAicGxvYW1fcmVjZWl2ZWRfb251X2lkIiwgLmRlc2NyID0gIk9OVSBJRCByZWNlaXZlZCBpbiB0aGUgcGxvYW0iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1BMT0FNX1JFQ0VJVkVEX09OVV9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSwgcGxvYW1fcmVjZWl2ZWRfb251X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9wbG9hbV9yZWNlaXZlZF9jcmNfZXJyb3IgPSB7IC5uYW1lID0gInBsb2FtX3JlY2VpdmVkX2NyY19lcnJvciIsIC5kZXNjciA9ICJDcmMgZXJyb3IgaW4gdGhlIHJlY2VpdmVkIHBsb2FtIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9QTE9BTV9SRUNFSVZFRF9DUkNfRVJST1IsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEsIHBsb2FtX3JlY2VpdmVkX2NyY19lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF93aW5kb3dfdHlwZSwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX21lYXN1cmVtZW50X3N0YXR1cywgJnByb3BfZGVzY3JfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2FsbG9jX2lkLCAmcHJvcF9kZXNjcl9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfb251X2lkLCAmcHJvcF9kZXNjcl9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaXNfZGVsaW5lYXRpb24sICZwcm9wX2Rlc2NyX2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9pc19lZCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX3J4X2RhdGEsICZwcm9wX2Rlc2NyX2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9wbG9hbV9yZWNlaXZlZF9vbnVfaWQsICZwcm9wX2Rlc2NyX2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9wbG9hbV9yZWNlaXZlZF9jcmNfZXJyb3IgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIndpbmRvd190eXBlIiwgLmRlc2NyID0gIlNpbGVudCBXaW5kb3cgb3IgQ3V0IG9mZiBXaW5kb3ciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhLCB3aW5kb3dfdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl93aW5kb3cgfSwgeyAubmFtZSA9ICJtZWFzdXJlbWVudF9zdGF0dXMiLCAuZGVzY3IgPSAiU3RhdHVzIG9mIHRoZSByb2d1ZSBPTlUgZGV0ZWN0aW9uIHJlc3VsdC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhLCBtZWFzdXJlbWVudF9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9tZWFzdXJlbWVudF9yZXN1bHQgfSwgeyAubmFtZSA9ICJhbGxvY19pZCIsIC5kZXNjciA9ICJBbGxvYy1JRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEsIGFsbG9jX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gIm9udV9pZCIsIC5kZXNjciA9ICJPTlUtSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhLCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiaXNfZGVsaW5lYXRpb24iLCAuZGVzY3IgPSAiQnVyc3QgRGVsaW5lYXRpb24gZGV0ZWN0ZWQgZHVyaW5nIHRoZSByb2d1ZSBPTlUgZGV0ZWN0aW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEsIGlzX2RlbGluZWF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiaXNfZWQiLCAuZGVzY3IgPSAiSXMgRUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhLCBpc19lZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInJ4X2RhdGEiLCAuZGVzY3IgPSAiQ2FwdHVyZWQgUExPQU11IG1lc3NhZ2UgaWYgdGhlIGJ1cnN0IGRlbGluaWVhdGlvbiB3YXMgZGV0ZWN0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSwgcnhfZGF0YSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3U4X2xpc3RfdTMyIH0sIHsgLm5hbWUgPSAicGxvYW1fcmVjZWl2ZWRfb251X2lkIiwgLmRlc2NyID0gIk9OVSBJRCByZWNlaXZlZCBpbiB0aGUgcGxvYW0iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhLCBwbG9hbV9yZWNlaXZlZF9vbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAicGxvYW1fcmVjZWl2ZWRfY3JjX2Vycm9yIiwgLmRlc2NyID0gIkNyYyBlcnJvciBpbiB0aGUgcmVjZWl2ZWQgcGxvYW0iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhLCBwbG9hbV9yZWNlaXZlZF9jcmNfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhIiwgLmRlc2NyID0gIlJvZ3VlIGRldGVjdGlvbiBjb21wbGV0ZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9uaSAtIGRlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiBncG9uX25pIC0gZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkX3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGdwb25fbmkgLSBhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiBncG9uX25pIC0gZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiBncG9uX25pIC0gdG9kX3JlcXVlc3QgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX25pX3RvZF9yZXF1ZXN0X3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGdwb25fbmkgLSB0b2RfcmVxdWVzdF9jb21wbGV0ZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF90b2Rfc3RyaW5nID0geyAubmFtZSA9ICJ0b2Rfc3RyaW5nIiwgLmRlc2NyID0gInRvZF9zdHJpbmciLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfVE9EX1NUUklORywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhLCB0b2Rfc3RyaW5nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RyXzY0IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfc2ZjID0geyAubmFtZSA9ICJzZmMiLCAuZGVzY3IgPSAic2ZjIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1NGQywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhLCBzZmMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfcnRjX29mZnNldF9zZWMgPSB7IC5uYW1lID0gInJ0Y19vZmZzZXRfc2VjIiwgLmRlc2NyID0gInJ0Y19vZmZzZXRfc2VjIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1JUQ19PRkZTRVRfU0VDLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEsIHJ0Y19vZmZzZXRfc2VjKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX3J0Y19vZmZzZXRfbnNlYyA9IHsgLm5hbWUgPSAicnRjX29mZnNldF9uc2VjIiwgLmRlc2NyID0gInJ0Y19vZmZzZXRfbnNlYyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9SVENfT0ZGU0VUX05TRUMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YSwgcnRjX29mZnNldF9uc2VjKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX3N0YXR1cyA9IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gInN0YXR1cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF90b2Rfc3RyaW5nLCAmcHJvcF9kZXNjcl9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9zZmMsICZwcm9wX2Rlc2NyX2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX3J0Y19vZmZzZXRfc2VjLCAmcHJvcF9kZXNjcl9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9ydGNfb2Zmc2V0X25zZWMsICZwcm9wX2Rlc2NyX2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJ0b2Rfc3RyaW5nIiwgLmRlc2NyID0gInRvZF9zdHJpbmciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEsIHRvZF9zdHJpbmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdHJfNjQgfSwgeyAubmFtZSA9ICJzZmMiLCAuZGVzY3IgPSAic2ZjIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhLCBzZmMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAicnRjX29mZnNldF9zZWMiLCAuZGVzY3IgPSAicnRjX29mZnNldF9zZWMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEsIHJ0Y19vZmZzZXRfc2VjKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ0Y19vZmZzZXRfbnNlYyIsIC5kZXNjciA9ICJydGNfb2Zmc2V0X25zZWMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEsIHJ0Y19vZmZzZXRfbnNlYyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJzdGF0dXMiLCAuZGVzY3IgPSAic3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJUT0QgcmVxdWVzdCBjb21wbGV0ZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9uaSAtIHByb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9vbnVfc3RhdGUgPSB7IC5uYW1lID0gIm9udV9zdGF0ZSIsIC5kZXNjciA9ICJvbnUgc3RhdGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UWVBFX0NfU0VUX01VTFRJUExFX09OVV9TVEFURV9JRF9PTlVfU1RBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9kYXRhLCBvbnVfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zd2l0Y2hfb3Zlcl90eXBlX2Nfb251X3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9vbnVfbGlzdCA9IHsgLm5hbWUgPSAib251X2xpc3QiLCAuZGVzY3IgPSAib251IGxpc3QiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UWVBFX0NfU0VUX01VTFRJUExFX09OVV9TVEFURV9JRF9PTlVfTElTVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2RhdGEsIG9udV9saXN0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfaWRfbGlzdF91MzJfbWF4XzI1NiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX29udV9zdGF0ZSwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9vbnVfbGlzdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm9udV9zdGF0ZSIsIC5kZXNjciA9ICJvbnUgc3RhdGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfZGF0YSwgb251X3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3dpdGNoX292ZXJfdHlwZV9jX29udV9zdGF0ZSB9LCB7IC5uYW1lID0gIm9udV9saXN0IiwgLmRlc2NyID0gIm9udSBsaXN0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2RhdGEsIG9udV9saXN0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfaWRfbGlzdF91MzJfbWF4XzI1NiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfZGF0YSIsIC5kZXNjciA9ICJwcm90ZWN0aW9uIHN3aXRjaGluZyB0eXBlIGMgc2V0IG11bHRpcGxlIG9udSBzdGF0ZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX25pIC0gc3RhcnRfb251X3VwZ3JhZGUgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2xpc3Rfb2Zfb251X2lkcyA9IHsgLm5hbWUgPSAibGlzdF9vZl9vbnVfaWRzIiwgLmRlc2NyID0gIkxpc3Qgb2YgT05VIElEcyB0byB1cGdyYWRlIHRoZSBmaXJtd2FyZS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFSVF9PTlVfVVBHUkFERV9JRF9MSVNUX09GX09OVV9JRFMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhLCBsaXN0X29mX29udV9pZHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25fb251X2lkX2xpc3RfdTMyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfbGlzdF9vZl9vbnVfaWRzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibGlzdF9vZl9vbnVfaWRzIiwgLmRlc2NyID0gIkxpc3Qgb2YgT05VIElEcyB0byB1cGdyYWRlIHRoZSBmaXJtd2FyZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSwgbGlzdF9vZl9vbnVfaWRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX29udV9pZF9saXN0X3UzMiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSIsIC5kZXNjciA9ICJPTFQgdG8gT05VIGZpcm13YXJlIHRyYW5zZmVyIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fbmkgLSBvbnVfdXBncmFkZV9jb21wbGV0ZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfc3RhdHVzID0geyAubmFtZSA9ICJzdGF0dXMiLCAuZGVzY3IgPSAiU3VjY2VzcyBvciBmYWlsdXJlLiAgQWdhaW5zdCBlbnRpcmUgdXBncmFkZSBwcm9jZXNzLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfbGlzdF9vZl9mYWlsZWRfZW50aXRpZXMgPSB7IC5uYW1lID0gImxpc3Rfb2ZfZmFpbGVkX2VudGl0aWVzIiwgLmRlc2NyID0gIkxpc3Qgb2YgT05VLUlEcyB0aGUgdXBncmFkZSBmYWlsZWQgZm9yLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX0xJU1RfT0ZfRkFJTEVEX0VOVElUSUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSwgbGlzdF9vZl9mYWlsZWRfZW50aXRpZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV91cGdyYWRlX3N0YXR1c19saXN0X3UzMiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX3N0YXR1cywgJnByb3BfZGVzY3JfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9saXN0X29mX2ZhaWxlZF9lbnRpdGllcyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJTdWNjZXNzIG9yIGZhaWx1cmUuICBBZ2FpbnN0IGVudGlyZSB1cGdyYWRlIHByb2Nlc3MuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImxpc3Rfb2ZfZmFpbGVkX2VudGl0aWVzIiwgLmRlc2NyID0gIkxpc3Qgb2YgT05VLUlEcyB0aGUgdXBncmFkZSBmYWlsZWQgZm9yLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhLCBsaXN0X29mX2ZhaWxlZF9lbnRpdGllcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhIiwgLmRlc2NyID0gIk9OVSBVcGdyYWRlIENvbXBsZXRlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fbmkgLSByb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX25pX3JvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydF9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiBncG9uX25pIC0gc3RhdF9jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfY2ZnX2NmZyA9IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX1NUQVRfQ0ZHX0lEX0NGRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9uaV9zdGF0X2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fbmlfc3RhdF9jZmdfY2ZnIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZ19kYXRhLCBjZmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfZGF0YSIsIC5kZXNjciA9ICJTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfc3RhdF9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX25pIC0gc3RhdF9hbGFybV9yYWlzZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3N0YXRfaWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9zdGF0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfc3RhdF9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX25pIC0gc3RhdF9hbGFybV9jbGVhcmVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCA9IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9zdGF0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGF0X2lkIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fbmkgLSBhdXRvX2NmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfYXV0b19jZmdfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkID0geyAubmFtZSA9ICJhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0FDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGEsIGFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfYXV0b19jZmdfY3B1X3BhY2tldHNfZmFpbHVyZSA9IHsgLm5hbWUgPSAiY3B1X3BhY2tldHNfZmFpbHVyZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiY3B1X3BhY2tldHNfZmFpbHVyZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0NQVV9QQUNLRVRTX0ZBSUxVUkUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBjcHVfcGFja2V0c19mYWlsdXJlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ19kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCA9IHsgLm5hbWUgPSAiZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImRlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfREVBQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBkZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfYXV0b19jZmdfZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWQgPSB7IC5uYW1lID0gImRpc2FibGVfYWxsX29udXNfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJkaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0RJU0FCTEVfQUxMX09OVVNfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSwgZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2F1dG9fY2ZnX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWQgPSB7IC5uYW1lID0gImVuYWJsZV9hbGxfb251c19jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImVuYWJsZV9hbGxfb251c19jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9FTkFCTEVfQUxMX09OVVNfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSwgZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfYXV0b19jZmdfbG9zID0geyAubmFtZSA9ICJsb3MiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImxvc1wiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX0xPUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGEsIGxvcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfYXV0b19jZmdfb251X2Rpc2NvdmVyZWQgPSB7IC5uYW1lID0gIm9udV9kaXNjb3ZlcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvbnVfZGlzY292ZXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX09OVV9ESVNDT1ZFUkVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSwgb251X2Rpc2NvdmVyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2F1dG9fY2ZnX29udV91cGdyYWRlX2NvbXBsZXRlID0geyAubmFtZSA9ICJvbnVfdXBncmFkZV9jb21wbGV0ZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwib251X3VwZ3JhZGVfY29tcGxldGVcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9PTlVfVVBHUkFERV9DT01QTEVURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGEsIG9udV91cGdyYWRlX2NvbXBsZXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ19wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCA9IHsgLm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfYXV0b19jZmdfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQgPSB7IC5uYW1lID0gInByb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJwcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2F1dG9fY2ZnX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lID0geyAubmFtZSA9ICJwcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGEsIHByb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ19yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkID0geyAubmFtZSA9ICJyb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJyb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGEsIHJvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2F1dG9fY2ZnX3JvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCA9IHsgLm5hbWUgPSAicm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0IiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJyb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9ST0dVRV9PTlVfU1BFQ0lBTF9NQVBfQ1lDTEVfU1RBUlQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCByb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2F1dG9fY2ZnX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQgPSB7IC5uYW1lID0gInNlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInNlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9TRVJJQUxfTlVNQkVSX0FDUVVJU0lUSU9OX0NZQ0xFX1NUQVJULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSwgc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fbmlfYXV0b19jZmdfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQgPSB7IC5uYW1lID0gInN0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSwgc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCA9IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX2NsZWFyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2F1dG9fY2ZnX3N0YXRfYWxhcm1fcmFpc2VkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fcmFpc2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ19zdGF0ZV9jaGFuZ2VfY29tcGxldGVkID0geyAubmFtZSA9ICJzdGF0ZV9jaGFuZ2VfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0ZV9jaGFuZ2VfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fTklfQVVUT19DRkdfSURfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGEsIHN0YXRlX2NoYW5nZV9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX25pX2F1dG9fY2ZnX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZCA9IHsgLm5hbWUgPSAidG9kX3JlcXVlc3RfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJ0b2RfcmVxdWVzdF9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9OSV9BVVRPX0NGR19JRF9UT0RfUkVRVUVTVF9DT01QTEVURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCB0b2RfcmVxdWVzdF9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX25pX2F1dG9fY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ19hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQsICZwcm9wX2Rlc2NyX2dwb25fbmlfYXV0b19jZmdfY3B1X3BhY2tldHNfZmFpbHVyZSwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ19kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ19kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ19lbmFibGVfYWxsX29udXNfY29tcGxldGVkLCAmcHJvcF9kZXNjcl9ncG9uX25pX2F1dG9fY2ZnX2xvcywgJnByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ19vbnVfZGlzY292ZXJlZCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ19vbnVfdXBncmFkZV9jb21wbGV0ZSwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ19wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ19wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ19wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ19yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkLCAmcHJvcF9kZXNjcl9ncG9uX25pX2F1dG9fY2ZnX3JvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ19zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0LCAmcHJvcF9kZXNjcl9ncG9uX25pX2F1dG9fY2ZnX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkLCAmcHJvcF9kZXNjcl9ncG9uX25pX2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ19zdGF0X2FsYXJtX3JhaXNlZCwgJnByb3BfZGVzY3JfZ3Bvbl9uaV9hdXRvX2NmZ19zdGF0ZV9jaGFuZ2VfY29tcGxldGVkLCAmcHJvcF9kZXNjcl9ncG9uX25pX2F1dG9fY2ZnX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGEsIGFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImNwdV9wYWNrZXRzX2ZhaWx1cmUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImNwdV9wYWNrZXRzX2ZhaWx1cmVcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSwgY3B1X3BhY2tldHNfZmFpbHVyZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImRlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJkZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBkZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImRpc2FibGVfYWxsX29udXNfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJkaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBkaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImVuYWJsZV9hbGxfb251c19jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImVuYWJsZV9hbGxfb251c19jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSwgZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImxvcyIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibG9zXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGEsIGxvcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm9udV9kaXNjb3ZlcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvbnVfZGlzY292ZXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBvbnVfZGlzY292ZXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm9udV91cGdyYWRlX2NvbXBsZXRlIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvbnVfdXBncmFkZV9jb21wbGV0ZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBvbnVfdXBncmFkZV9jb21wbGV0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJwcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInByb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJwcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInByb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJwcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBwcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInJvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInJvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSwgcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInJvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0XCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGEsIHJvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInNlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInNlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSwgc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBzdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9jbGVhcmVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fY2xlYXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX3JhaXNlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX3JhaXNlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN0YXRlX2NoYW5nZV9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRlX2NoYW5nZV9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSwgc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInRvZF9yZXF1ZXN0X2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwidG9kX3JlcXVlc3RfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGEsIHRvZF9yZXF1ZXN0X2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YSIsIC5kZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX25pX2F1dG9fY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiA9PT09IE9iamVjdDogZ3Bvbl9vbnUgPT09PSAqLworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBrZXkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9rZXlfcG9uX25pID0geyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIG5ldHdvcmsgaW50ZXJmYWNlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0tFWV9JRF9QT05fTkksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfa2V5LCBwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9rZXlfb251X2lkID0geyAubmFtZSA9ICJvbnVfaWQiLCAuZGVzY3IgPSAiT05VIElEIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0tFWV9JRF9PTlVfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfa2V5LCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfa2V5X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfa2V5X3Bvbl9uaSwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfa2V5X29udV9pZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBvbl9uaSIsIC5kZXNjciA9ICJQT04gbmV0d29yayBpbnRlcmZhY2UiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2tleSwgcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAib251X2lkIiwgLmRlc2NyID0gIk9OVSBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfa2V5LCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfa2V5IiwgLmRlc2NyID0gImtleSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2tleV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX29udSAtIGNmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2NmZ19vbnVfc3RhdGUgPSB7IC5uYW1lID0gIm9udV9zdGF0ZSIsIC5kZXNjciA9ICJDdXJyZW50IE9OVSBzdGF0ZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0NGR19JRF9PTlVfU1RBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEsIG9udV9zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X29udV9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2NmZ19zZXJpYWxfbnVtYmVyID0geyAubmFtZSA9ICJzZXJpYWxfbnVtYmVyIiwgLmRlc2NyID0gIk9OVSBzZXJpYWwgbnVtYmVyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0NGR19JRF9TRVJJQUxfTlVNQkVSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NmZ19kYXRhLCBzZXJpYWxfbnVtYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc2VyaWFsX251bWJlciB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2NmZ19wYXNzd29yZCA9IHsgLm5hbWUgPSAicGFzc3dvcmQiLCAuZGVzY3IgPSAiT05VIHBhc3N3b3JkIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0NGR19JRF9QQVNTV09SRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSwgcGFzc3dvcmQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdThfMTAgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9jZmdfYXV0b19wYXNzd29yZF9sZWFybmluZyA9IHsgLm5hbWUgPSAiYXV0b19wYXNzd29yZF9sZWFybmluZyIsIC5kZXNjciA9ICJFbmFibGVcXERpc2FibGUgYXV0b21hdGljIHBhc3N3b3JkIGxlYXJuaW5nIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0NGR19JRF9BVVRPX1BBU1NXT1JEX0xFQVJOSU5HLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NmZ19kYXRhLCBhdXRvX3Bhc3N3b3JkX2xlYXJuaW5nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfY2ZnX3VzX2ZlYyA9IHsgLm5hbWUgPSAidXNfZmVjIiwgLmRlc2NyID0gIkVuYWJsZVxcRGlzYWJsZSBVUyBGRUMgZm9yIE9OVSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfVVNfRkVDLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NmZ19kYXRhLCB1c19mZWMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9jZmdfb21jaV9wb3J0X2lkID0geyAubmFtZSA9ICJvbWNpX3BvcnRfaWQiLCAuZGVzY3IgPSAiT01DSSBwb3J0IElEICIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfT01DSV9QT1JUX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NmZ19kYXRhLCBvbWNpX3BvcnRfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfY2ZnX2RzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwgPSB7IC5uYW1lID0gImRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwiLCAuZGVzY3IgPSAiRFMgQkVSIHJlcG9ydGluZyBpbnRlcnZhbCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfRFNfQkVSX1JFUE9SVElOR19JTlRFUlZBTCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSwgZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9jZmdfYWVzX2VuY3J5cHRpb25fa2V5ID0geyAubmFtZSA9ICJhZXNfZW5jcnlwdGlvbl9rZXkiLCAuZGVzY3IgPSAiQUVTIGVuY3J5cHRpb24ga2V5LiAiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0FFU19FTkNSWVBUSU9OX0tFWSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSwgYWVzX2VuY3J5cHRpb25fa2V5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYWVzX2tleSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2NmZ19hbGFybV9zdGF0ZSA9IHsgLm5hbWUgPSAiYWxhcm1fc3RhdGUiLCAuZGVzY3IgPSAiU3RhdGUgb2YgYWxsIE9OVSBhbGFybXMuICBUaGlzIGlzIG5vcm1hbGx5IHJlYWQtb25seSBhbmQgY2FuIG9ubHkgYmUgd3JpdHRlbiB3aGVuIHRoZSBQT04gaXMgaW4gYWN0aXZlLXN0YW5kYnkgbW9kZSB0byBrZWVwIHRoZSBPTlUgaW4gc3luYy4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0FMQVJNX1NUQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NmZ19kYXRhLCBhbGFybV9zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfY2ZnX3JhbmdpbmdfdGltZSA9IHsgLm5hbWUgPSAicmFuZ2luZ190aW1lIiwgLmRlc2NyID0gIk9OVSByYW5naW5nIHRpbWUuICBUaGlzIGlzIG5vcm1hbGx5IHJlYWQtb25seSBhbmQgY2FuIG9ubHkgYmUgd3JpdHRlbiB3aGVuIHRoZSBQT04gaXMgaW4gYWN0aXZlLXN0YW5kYnkgbW9kZSB0byBrZWVwIHRoZSBPTlUgaW4gc3luYy4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX1JBTkdJTkdfVElNRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSwgcmFuZ2luZ190aW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2NmZ19kaXNhYmxlZF9hZnRlcl9kaXNjb3ZlcnkgPSB7IC5uYW1lID0gImRpc2FibGVkX2FmdGVyX2Rpc2NvdmVyeSIsIC5kZXNjciA9ICJUaGlzIE9OVSB3YXMgZGlzYWJsZWQgYWZ0ZXIgU04gZGlzY292ZXJ5IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0RJU0FCTEVEX0FGVEVSX0RJU0NPVkVSWSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSwgZGlzYWJsZWRfYWZ0ZXJfZGlzY292ZXJ5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfY2ZnX2RlYWN0aXZhdGlvbl9yZWFzb24gPSB7IC5uYW1lID0gImRlYWN0aXZhdGlvbl9yZWFzb24iLCAuZGVzY3IgPSAiUmVhc29uIGZvciB0aGUgbGFzdCBPTlUgZGVhY3RpdmF0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0RFQUNUSVZBVElPTl9SRUFTT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEsIGRlYWN0aXZhdGlvbl9yZWFzb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9kZWFjdGl2YXRpb25fcmVhc29uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfY2ZnX2FsbF9nZW1fcG9ydHMgPSB7IC5uYW1lID0gImFsbF9nZW1fcG9ydHMiLCAuZGVzY3IgPSAiQWxsIHVuaWNhc3QgR0VNIHBvcnRzIGN1cnJlbnRseSBwcm92aXNpb25lZCBvbiB0aGlzIE9OVS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfQUxMX0dFTV9QT1JUUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSwgYWxsX2dlbV9wb3J0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfY2ZnX2FsbF9hbGxvY3MgPSB7IC5uYW1lID0gImFsbF9hbGxvY3MiLCAuZGVzY3IgPSAiQWxsIGFsbG9jIElEcyBjdXJyZW50bHkgcHJvdmlzaW9uZWQgb24gdGhpcyBPTlUuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0FMTF9BTExPQ1MsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEsIGFsbF9hbGxvY3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfY2ZnX29udV9wc190eXBlX2MgPSB7IC5uYW1lID0gIm9udV9wc190eXBlX2MiLCAuZGVzY3IgPSAib251IHByb3RlY3Rpb24gc3dpdGNoaW5nIHR5cGUgYyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9DRkdfSURfT05VX1BTX1RZUEVfQywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSwgb251X3BzX3R5cGVfYyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2NmZ19leHRlbmRlZF9ndWFyZF90aW1lID0geyAubmFtZSA9ICJleHRlbmRlZF9ndWFyZF90aW1lIiwgLmRlc2NyID0gIkFkZGl0aW9uYWwgZ3VhcmQgdGltZSAoaW4gYnl0ZXMpIGZvciB0aGlzIE9OVS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQ0ZHX0lEX0VYVEVOREVEX0dVQVJEX1RJTUUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEsIGV4dGVuZGVkX2d1YXJkX3RpbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9leHRlbmRlZF9ndWFyZF90aW1lIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfY2ZnX29udV9zdGF0ZSwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfY2ZnX3NlcmlhbF9udW1iZXIsICZwcm9wX2Rlc2NyX2dwb25fb251X2NmZ19wYXNzd29yZCwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfY2ZnX2F1dG9fcGFzc3dvcmRfbGVhcm5pbmcsICZwcm9wX2Rlc2NyX2dwb25fb251X2NmZ191c19mZWMsICZwcm9wX2Rlc2NyX2dwb25fb251X2NmZ19vbWNpX3BvcnRfaWQsICZwcm9wX2Rlc2NyX2dwb25fb251X2NmZ19kc19iZXJfcmVwb3J0aW5nX2ludGVydmFsLCAmcHJvcF9kZXNjcl9ncG9uX29udV9jZmdfYWVzX2VuY3J5cHRpb25fa2V5LCAmcHJvcF9kZXNjcl9ncG9uX29udV9jZmdfYWxhcm1fc3RhdGUsICZwcm9wX2Rlc2NyX2dwb25fb251X2NmZ19yYW5naW5nX3RpbWUsICZwcm9wX2Rlc2NyX2dwb25fb251X2NmZ19kaXNhYmxlZF9hZnRlcl9kaXNjb3ZlcnksICZwcm9wX2Rlc2NyX2dwb25fb251X2NmZ19kZWFjdGl2YXRpb25fcmVhc29uLCAmcHJvcF9kZXNjcl9ncG9uX29udV9jZmdfYWxsX2dlbV9wb3J0cywgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfY2ZnX2FsbF9hbGxvY3MsICZwcm9wX2Rlc2NyX2dwb25fb251X2NmZ19vbnVfcHNfdHlwZV9jLCAmcHJvcF9kZXNjcl9ncG9uX29udV9jZmdfZXh0ZW5kZWRfZ3VhcmRfdGltZSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAib251X3N0YXRlIiwgLmRlc2NyID0gIkN1cnJlbnQgT05VIHN0YXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSwgb251X3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb251X3N0YXRlIH0sIHsgLm5hbWUgPSAic2VyaWFsX251bWJlciIsIC5kZXNjciA9ICJPTlUgc2VyaWFsIG51bWJlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEsIHNlcmlhbF9udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zZXJpYWxfbnVtYmVyIH0sIHsgLm5hbWUgPSAicGFzc3dvcmQiLCAuZGVzY3IgPSAiT05VIHBhc3N3b3JkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSwgcGFzc3dvcmQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdThfMTAgfSwgeyAubmFtZSA9ICJhdXRvX3Bhc3N3b3JkX2xlYXJuaW5nIiwgLmRlc2NyID0gIkVuYWJsZVxcRGlzYWJsZSBhdXRvbWF0aWMgcGFzc3dvcmQgbGVhcm5pbmciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NmZ19kYXRhLCBhdXRvX3Bhc3N3b3JkX2xlYXJuaW5nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAidXNfZmVjIiwgLmRlc2NyID0gIkVuYWJsZVxcRGlzYWJsZSBVUyBGRUMgZm9yIE9OVSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEsIHVzX2ZlYyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm9tY2lfcG9ydF9pZCIsIC5kZXNjciA9ICJPTUNJIHBvcnQgSUQgIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSwgb21jaV9wb3J0X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gImRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwiLCAuZGVzY3IgPSAiRFMgQkVSIHJlcG9ydGluZyBpbnRlcnZhbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEsIGRzX2Jlcl9yZXBvcnRpbmdfaW50ZXJ2YWwpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiYWVzX2VuY3J5cHRpb25fa2V5IiwgLmRlc2NyID0gIkFFUyBlbmNyeXB0aW9uIGtleS4gIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSwgYWVzX2VuY3J5cHRpb25fa2V5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYWVzX2tleSB9LCB7IC5uYW1lID0gImFsYXJtX3N0YXRlIiwgLmRlc2NyID0gIlN0YXRlIG9mIGFsbCBPTlUgYWxhcm1zLiAgVGhpcyBpcyBub3JtYWxseSByZWFkLW9ubHkgYW5kIGNhbiBvbmx5IGJlIHdyaXR0ZW4gd2hlbiB0aGUgUE9OIGlzIGluIGFjdGl2ZS1zdGFuZGJ5IG1vZGUgdG8ga2VlcCB0aGUgT05VIGluIHN5bmMuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSwgYWxhcm1fc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZSB9LCB7IC5uYW1lID0gInJhbmdpbmdfdGltZSIsIC5kZXNjciA9ICJPTlUgcmFuZ2luZyB0aW1lLiAgVGhpcyBpcyBub3JtYWxseSByZWFkLW9ubHkgYW5kIGNhbiBvbmx5IGJlIHdyaXR0ZW4gd2hlbiB0aGUgUE9OIGlzIGluIGFjdGl2ZS1zdGFuZGJ5IG1vZGUgdG8ga2VlcCB0aGUgT05VIGluIHN5bmMuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSwgcmFuZ2luZ190aW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImRpc2FibGVkX2FmdGVyX2Rpc2NvdmVyeSIsIC5kZXNjciA9ICJUaGlzIE9OVSB3YXMgZGlzYWJsZWQgYWZ0ZXIgU04gZGlzY292ZXJ5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSwgZGlzYWJsZWRfYWZ0ZXJfZGlzY292ZXJ5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAiZGVhY3RpdmF0aW9uX3JlYXNvbiIsIC5kZXNjciA9ICJSZWFzb24gZm9yIHRoZSBsYXN0IE9OVSBkZWFjdGl2YXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NmZ19kYXRhLCBkZWFjdGl2YXRpb25fcmVhc29uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZGVhY3RpdmF0aW9uX3JlYXNvbiB9LCB7IC5uYW1lID0gImFsbF9nZW1fcG9ydHMiLCAuZGVzY3IgPSAiQWxsIHVuaWNhc3QgR0VNIHBvcnRzIGN1cnJlbnRseSBwcm92aXNpb25lZCBvbiB0aGlzIE9OVS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NmZ19kYXRhLCBhbGxfZ2VtX3BvcnRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTYgfSwgeyAubmFtZSA9ICJhbGxfYWxsb2NzIiwgLmRlc2NyID0gIkFsbCBhbGxvYyBJRHMgY3VycmVudGx5IHByb3Zpc2lvbmVkIG9uIHRoaXMgT05VLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEsIGFsbF9hbGxvY3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyIH0sIHsgLm5hbWUgPSAib251X3BzX3R5cGVfYyIsIC5kZXNjciA9ICJvbnUgcHJvdGVjdGlvbiBzd2l0Y2hpbmcgdHlwZSBjIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSwgb251X3BzX3R5cGVfYyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImV4dGVuZGVkX2d1YXJkX3RpbWUiLCAuZGVzY3IgPSAiQWRkaXRpb25hbCBndWFyZCB0aW1lIChpbiBieXRlcykgZm9yIHRoaXMgT05VLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEsIGV4dGVuZGVkX2d1YXJkX3RpbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9leHRlbmRlZF9ndWFyZF90aW1lIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSIsIC5kZXNjciA9ICJjZmciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBzdGF0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF9mZWNfY29kZXdvcmRzID0geyAubmFtZSA9ICJmZWNfY29kZXdvcmRzIiwgLmRlc2NyID0gIlRvdGFsIHJlY2VpdmVkIEZFQyBjb2Rld29yZHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09ERVdPUkRTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YSwgZmVjX2NvZGV3b3JkcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X2ZlY19ieXRlc19jb3JyZWN0ZWQgPSB7IC5uYW1lID0gImZlY19ieXRlc19jb3JyZWN0ZWQiLCAuZGVzY3IgPSAiRkVDIGNvZGV3b3JkcyBjb3JyZWN0ZWQgYnl0ZXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9GRUNfQllURVNfQ09SUkVDVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YSwgZmVjX2J5dGVzX2NvcnJlY3RlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X2ZlY19jb2Rld29yZHNfY29ycmVjdGVkID0geyAubmFtZSA9ICJmZWNfY29kZXdvcmRzX2NvcnJlY3RlZCIsIC5kZXNjciA9ICJGRUMgY29ycmVjdGVkIGNvZGV3b3JkcyBlcnJvciAiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09ERVdPUkRTX0NPUlJFQ1RFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIGZlY19jb2Rld29yZHNfY29ycmVjdGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3N0YXRfZmVjX2NvZGV3b3Jkc191bmNvcnJlY3RlZCA9IHsgLm5hbWUgPSAiZmVjX2NvZGV3b3Jkc191bmNvcnJlY3RlZCIsIC5kZXNjciA9ICJGRUMgbm90IGNvcnJlY3RlZCBjb2Rld29yZHMgZXJyb3IiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09ERVdPUkRTX1VOQ09SUkVDVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YSwgZmVjX2NvZGV3b3Jkc191bmNvcnJlY3RlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X2JpcDhfYnl0ZXMgPSB7IC5uYW1lID0gImJpcDhfYnl0ZXMiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgYnl0ZXMgZm9yIEJJUDgiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9CSVA4X0JZVEVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YSwgYmlwOF9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X2JpcDhfZXJyb3JzID0geyAubmFtZSA9ICJiaXA4X2Vycm9ycyIsIC5kZXNjciA9ICJCaXQgZXJyb3IgYWNjb3JkaW5nIHRvIEJJUDgiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9CSVA4X0VSUk9SUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIGJpcDhfZXJyb3JzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3N0YXRfcnhfcGxvYW1zX2NyY19lcnJvciA9IHsgLm5hbWUgPSAicnhfcGxvYW1zX2NyY19lcnJvciIsIC5kZXNjciA9ICJSZWNlaXZlZCBQTE9BTXMgd2l0aCBDUkMgZXJyb3IiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfQ1JDX0VSUk9SLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YSwgcnhfcGxvYW1zX2NyY19lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X3J4X3Bsb2Ftc19ub25faWRsZSA9IHsgLm5hbWUgPSAicnhfcGxvYW1zX25vbl9pZGxlIiwgLmRlc2NyID0gIlJlY2VpdmVkIG5vbiBpZGxlIFBMT0FNcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX1BMT0FNU19OT05fSURMRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIHJ4X3Bsb2Ftc19ub25faWRsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X3Bvc2l0aXZlX2RyaWZ0ID0geyAubmFtZSA9ICJwb3NpdGl2ZV9kcmlmdCIsIC5kZXNjciA9ICJQb3NpdGl2ZSBkcmlmdCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1BPU0lUSVZFX0RSSUZULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YSwgcG9zaXRpdmVfZHJpZnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF9uZWdhdGl2ZV9kcmlmdCA9IHsgLm5hbWUgPSAibmVnYXRpdmVfZHJpZnQiLCAuZGVzY3IgPSAiTmVnYXRpdmUgZHJpZnQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9ORUdBVElWRV9EUklGVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIG5lZ2F0aXZlX2RyaWZ0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3N0YXRfcnhfb21jaSA9IHsgLm5hbWUgPSAicnhfb21jaSIsIC5kZXNjciA9ICJSZWNlaXZlZCBPTUNJIHBhY2tldHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9PTUNJLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YSwgcnhfb21jaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X3J4X29tY2lfcGFja2V0c19jcmNfZXJyb3IgPSB7IC5uYW1lID0gInJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgT01DSSBwYWNrZXRzIHdpdGggQ1JDIGVycm9ycyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9TVEFUX0lEX1JYX09NQ0lfUEFDS0VUU19DUkNfRVJST1IsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhLCByeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3N0YXRfYmVyX3JlcG9ydGVkID0geyAubmFtZSA9ICJiZXJfcmVwb3J0ZWQiLCAuZGVzY3IgPSAiQkVSIHJlcG9ydGVkIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1NUQVRfSURfQkVSX1JFUE9SVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YSwgYmVyX3JlcG9ydGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3N0YXRfdW5yZWNlaXZlZF9idXJzdCA9IHsgLm5hbWUgPSAidW5yZWNlaXZlZF9idXJzdCIsIC5kZXNjciA9ICJVbnJlY2VpdmVkIGJ1cnN0IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1NUQVRfSURfVU5SRUNFSVZFRF9CVVJTVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIHVucmVjZWl2ZWRfYnVyc3QpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF9sY2RnX2Vycm9ycyA9IHsgLm5hbWUgPSAibGNkZ19lcnJvcnMiLCAuZGVzY3IgPSAiTENERyBlcnJvcnMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9MQ0RHX0VSUk9SUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIGxjZGdfZXJyb3JzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3N0YXRfcmRpX2Vycm9ycyA9IHsgLm5hbWUgPSAicmRpX2Vycm9ycyIsIC5kZXNjciA9ICJSREkgZXJyb3JzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUkRJX0VSUk9SUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIHJkaV9lcnJvcnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF9yeF9ieXRlcyA9IHsgLm5hbWUgPSAicnhfYnl0ZXMiLCAuZGVzY3IgPSAicnggYnl0ZXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9SWF9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIHJ4X2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3N0YXRfcnhfcGFja2V0cyA9IHsgLm5hbWUgPSAicnhfcGFja2V0cyIsIC5kZXNjciA9ICJyeCBwYWNrZXRzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1NUQVRfSURfUlhfUEFDS0VUUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIHJ4X3BhY2tldHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF90eF9ieXRlcyA9IHsgLm5hbWUgPSAidHhfYnl0ZXMiLCAuZGVzY3IgPSAidHggYnl0ZXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9JRF9UWF9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIHR4X2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3N0YXRfdHhfcGFja2V0cyA9IHsgLm5hbWUgPSAidHhfcGFja2V0cyIsIC5kZXNjciA9ICJ0eCBwYWNrZXRzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1NUQVRfSURfVFhfUEFDS0VUUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIHR4X3BhY2tldHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfc3RhdF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X3N0YXRfZmVjX2NvZGV3b3JkcywgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF9mZWNfYnl0ZXNfY29ycmVjdGVkLCAmcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X2ZlY19jb2Rld29yZHNfY29ycmVjdGVkLCAmcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X2ZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQsICZwcm9wX2Rlc2NyX2dwb25fb251X3N0YXRfYmlwOF9ieXRlcywgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF9iaXA4X2Vycm9ycywgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF9yeF9wbG9hbXNfY3JjX2Vycm9yLCAmcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X3J4X3Bsb2Ftc19ub25faWRsZSwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF9wb3NpdGl2ZV9kcmlmdCwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF9uZWdhdGl2ZV9kcmlmdCwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF9yeF9vbWNpLCAmcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X3J4X29tY2lfcGFja2V0c19jcmNfZXJyb3IsICZwcm9wX2Rlc2NyX2dwb25fb251X3N0YXRfYmVyX3JlcG9ydGVkLCAmcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X3VucmVjZWl2ZWRfYnVyc3QsICZwcm9wX2Rlc2NyX2dwb25fb251X3N0YXRfbGNkZ19lcnJvcnMsICZwcm9wX2Rlc2NyX2dwb25fb251X3N0YXRfcmRpX2Vycm9ycywgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF9yeF9ieXRlcywgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF9yeF9wYWNrZXRzLCAmcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X3R4X2J5dGVzLCAmcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X3R4X3BhY2tldHMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJmZWNfY29kZXdvcmRzIiwgLmRlc2NyID0gIlRvdGFsIHJlY2VpdmVkIEZFQyBjb2Rld29yZHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YSwgZmVjX2NvZGV3b3JkcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmZWNfYnl0ZXNfY29ycmVjdGVkIiwgLmRlc2NyID0gIkZFQyBjb2Rld29yZHMgY29ycmVjdGVkIGJ5dGVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIGZlY19ieXRlc19jb3JyZWN0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZmVjX2NvZGV3b3Jkc19jb3JyZWN0ZWQiLCAuZGVzY3IgPSAiRkVDIGNvcnJlY3RlZCBjb2Rld29yZHMgZXJyb3IgIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIGZlY19jb2Rld29yZHNfY29ycmVjdGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQiLCAuZGVzY3IgPSAiRkVDIG5vdCBjb3JyZWN0ZWQgY29kZXdvcmRzIGVycm9yIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIGZlY19jb2Rld29yZHNfdW5jb3JyZWN0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiYmlwOF9ieXRlcyIsIC5kZXNjciA9ICJSZWNlaXZlZCBieXRlcyBmb3IgQklQOCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhLCBiaXA4X2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImJpcDhfZXJyb3JzIiwgLmRlc2NyID0gIkJpdCBlcnJvciBhY2NvcmRpbmcgdG8gQklQOCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhLCBiaXA4X2Vycm9ycyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9wbG9hbXNfY3JjX2Vycm9yIiwgLmRlc2NyID0gIlJlY2VpdmVkIFBMT0FNcyB3aXRoIENSQyBlcnJvciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhLCByeF9wbG9hbXNfY3JjX2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X3Bsb2Ftc19ub25faWRsZSIsIC5kZXNjciA9ICJSZWNlaXZlZCBub24gaWRsZSBQTE9BTXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YSwgcnhfcGxvYW1zX25vbl9pZGxlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInBvc2l0aXZlX2RyaWZ0IiwgLmRlc2NyID0gIlBvc2l0aXZlIGRyaWZ0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIHBvc2l0aXZlX2RyaWZ0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gIm5lZ2F0aXZlX2RyaWZ0IiwgLmRlc2NyID0gIk5lZ2F0aXZlIGRyaWZ0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIG5lZ2F0aXZlX2RyaWZ0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X29tY2kiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgT01DSSBwYWNrZXRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIHJ4X29tY2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciIsIC5kZXNjciA9ICJSZWNlaXZlZCBPTUNJIHBhY2tldHMgd2l0aCBDUkMgZXJyb3JzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIHJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiYmVyX3JlcG9ydGVkIiwgLmRlc2NyID0gIkJFUiByZXBvcnRlZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhLCBiZXJfcmVwb3J0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidW5yZWNlaXZlZF9idXJzdCIsIC5kZXNjciA9ICJVbnJlY2VpdmVkIGJ1cnN0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIHVucmVjZWl2ZWRfYnVyc3QpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAibGNkZ19lcnJvcnMiLCAuZGVzY3IgPSAiTENERyBlcnJvcnMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YSwgbGNkZ19lcnJvcnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicmRpX2Vycm9ycyIsIC5kZXNjciA9ICJSREkgZXJyb3JzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIHJkaV9lcnJvcnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfYnl0ZXMiLCAuZGVzY3IgPSAicnggYnl0ZXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YSwgcnhfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfcGFja2V0cyIsIC5kZXNjciA9ICJyeCBwYWNrZXRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIHJ4X3BhY2tldHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfYnl0ZXMiLCAuZGVzY3IgPSAidHggYnl0ZXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YSwgdHhfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfcGFja2V0cyIsIC5kZXNjciA9ICJ0eCBwYWNrZXRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2RhdGEsIHR4X3BhY2tldHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhIiwgLmRlc2NyID0gInN0YXQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9zdGF0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBzZXRfb251X3N0YXRlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9vbnVfc3RhdGUgPSB7IC5uYW1lID0gIm9udV9zdGF0ZSIsIC5kZXNjciA9ICJPTlUgc3RhdGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfU0VUX09OVV9TVEFURV9JRF9PTlVfU1RBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhLCBvbnVfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9vbnVfb3BlcmF0aW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X3NldF9vbnVfc3RhdGVfb251X3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAib251X3N0YXRlIiwgLmRlc2NyID0gIk9OVSBzdGF0ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhLCBvbnVfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9vbnVfb3BlcmF0aW9uIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhIiwgLmRlc2NyID0gIlNldCBPTlUgU3RhdGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSByc3NpX21lYXN1cmVtZW50ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiBncG9uX29udSAtIGNoYW5nZV9wb3dlcl9sZXZlbCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9wb3dlcl9sZXZlbF9hY3Rpb24gPSB7IC5uYW1lID0gInBvd2VyX2xldmVsX2FjdGlvbiIsIC5kZXNjciA9ICJwb3dlciBsZXZlbCBhY3Rpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQ0hBTkdFX1BPV0VSX0xFVkVMX0lEX1BPV0VSX0xFVkVMX0FDVElPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfZGF0YSwgcG93ZXJfbGV2ZWxfYWN0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb251X3Bvd2VyX2xldmVsIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX3Bvd2VyX2xldmVsX2FjdGlvbiB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicG93ZXJfbGV2ZWxfYWN0aW9uIiwgLmRlc2NyID0gInBvd2VyIGxldmVsIGFjdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2RhdGEsIHBvd2VyX2xldmVsX2FjdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X29udV9wb3dlcl9sZXZlbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2RhdGEiLCAuZGVzY3IgPSAiQ2hhbmdlIFBvd2VyIExldmVsIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fb251IC0gb251X2FsYXJtICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfb251X2FsYXJtX29udV9hbGFybSA9IHsgLm5hbWUgPSAib251X2FsYXJtIiwgLmRlc2NyID0gIm9udSBhbGFybSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9PTlVfQUxBUk1fSURfT05VX0FMQVJNLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29udV9hbGFybV9kYXRhLCBvbnVfYWxhcm0pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9hbGFybXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX29udV9vbnVfYWxhcm1fcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX29udV9vbnVfYWxhcm1fb251X2FsYXJtIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1fZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJvbnVfYWxhcm0iLCAuZGVzY3IgPSAib251IGFsYXJtIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1fZGF0YSwgb251X2FsYXJtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfYWxhcm1zIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm1fZGF0YSIsIC5kZXNjciA9ICJPTlUgQWxhcm0iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBkb3dpICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfZG93aV9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfRE9XSV9JRF9BTEFSTV9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfZG93aV9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9kb3dpX2RyaWZ0X3ZhbHVlID0geyAubmFtZSA9ICJkcmlmdF92YWx1ZSIsIC5kZXNjciA9ICJDYWxjdWxhdGVkIGFtb3VudCBvZiBkcmlmdCAocG9zaXRpdmUgKyBuZWdhdGl2ZSBhcyBhIHNpZ25lZCB2YWx1ZSkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0RPV0lfSURfRFJJRlRfVkFMVUUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfZG93aV9kYXRhLCBkcmlmdF92YWx1ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfaW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2Rvd2lfbmV3X2VxZCA9IHsgLm5hbWUgPSAibmV3X2VxZCIsIC5kZXNjciA9ICJOZXcgRVFEIGFmdGVyIGRyaWZ0IGlzIGNvcnJlY3RlZCAob25seSB2YWxpZCBpZiBzdGF0dXMgaXMgJ29uJykuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0RPV0lfSURfTkVXX0VRRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9kb3dpX2RhdGEsIG5ld19lcWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfZG93aV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X2Rvd2lfYWxhcm1fc3RhdHVzLCAmcHJvcF9kZXNjcl9ncG9uX29udV9kb3dpX2RyaWZ0X3ZhbHVlLCAmcHJvcF9kZXNjcl9ncG9uX29udV9kb3dpX25ld19lcWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2Rvd2lfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiQWxhcm0gc3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9kb3dpX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9LCB7IC5uYW1lID0gImRyaWZ0X3ZhbHVlIiwgLmRlc2NyID0gIkNhbGN1bGF0ZWQgYW1vdW50IG9mIGRyaWZ0IChwb3NpdGl2ZSArIG5lZ2F0aXZlIGFzIGEgc2lnbmVkIHZhbHVlKS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2Rvd2lfZGF0YSwgZHJpZnRfdmFsdWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2ludDMyX3QgfSwgeyAubmFtZSA9ICJuZXdfZXFkIiwgLmRlc2NyID0gIk5ldyBFUUQgYWZ0ZXIgZHJpZnQgaXMgY29ycmVjdGVkIChvbmx5IHZhbGlkIGlmIHN0YXR1cyBpcyAnb24nKS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2Rvd2lfZGF0YSwgbmV3X2VxZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9kb3dpX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9kb3dpX2RhdGEiLCAuZGVzY3IgPSAiRHJpZnQgb2YgV2luZG93IG9mIE9OVWkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfZG93aV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2Rvd2lfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9kb3dpX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBzZmkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9zZmlfYWxhcm1fc3RhdHVzID0geyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiYWxhcm0gc3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1NGSV9JRF9BTEFSTV9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc2ZpX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3NmaV9iZXIgPSB7IC5uYW1lID0gImJlciIsIC5kZXNjciA9ICJJbnZlcnNlIGJpdCBlcnJvciByYXRlIChlLmcuIGlmIHRoaXMgbnVtYmVyIGlzIDEwMDAsIHRoZSBCRVIgaXMgMS8xMDAwKS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfU0ZJX0lEX0JFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zZmlfZGF0YSwgYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fb251X3NmaV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X3NmaV9hbGFybV9zdGF0dXMsICZwcm9wX2Rlc2NyX2dwb25fb251X3NmaV9iZXIgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3NmaV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJhbGFybSBzdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3NmaV9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJiZXIiLCAuZGVzY3IgPSAiSW52ZXJzZSBiaXQgZXJyb3IgcmF0ZSAoZS5nLiBpZiB0aGlzIG51bWJlciBpcyAxMDAwLCB0aGUgQkVSIGlzIDEvMTAwMCkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zZmlfZGF0YSwgYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3NmaV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfc2ZpX2RhdGEiLCAuZGVzY3IgPSAiU2lnbmFsIEZhaWwgb2YgT05VaSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9zZmlfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9zZmlfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9zZmlfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX29udSAtIHNkaSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3NkaV9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJhbGFybSBzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfU0RJX0lEX0FMQVJNX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zZGlfZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfc2RpX2JlciA9IHsgLm5hbWUgPSAiYmVyIiwgLmRlc2NyID0gIkludmVyc2UgYml0IGVycm9yIHJhdGUgKGUuZy4gaWYgdGhpcyBudW1iZXIgaXMgMTAwMCwgdGhlIEJFUiBpcyAxLzEwMDApLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9TRElfSURfQkVSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3NkaV9kYXRhLCBiZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfc2RpX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfc2RpX2FsYXJtX3N0YXR1cywgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfc2RpX2JlciB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfc2RpX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gImFsYXJtIHN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc2RpX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9LCB7IC5uYW1lID0gImJlciIsIC5kZXNjciA9ICJJbnZlcnNlIGJpdCBlcnJvciByYXRlIChlLmcuIGlmIHRoaXMgbnVtYmVyIGlzIDEwMDAsIHRoZSBCRVIgaXMgMS8xMDAwKS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3NkaV9kYXRhLCBiZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfc2RpX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9zZGlfZGF0YSIsIC5kZXNjciA9ICJTaWduYWwgRGVncmFkZWQgb2YgT05VaSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9zZGlfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9zZGlfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9zZGlfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX29udSAtIGRmaSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2RmaV9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJhbGFybSBzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfREZJX0lEX0FMQVJNX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9kZmlfZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfZGZpX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfZGZpX2FsYXJtX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gImFsYXJtIHN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2RmaV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGEiLCAuZGVzY3IgPSAiUmVjZWl2ZSBEeWluZy1HYXNwIG9mIE9OVWkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBzdWZpICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfc3VmaV9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJhbGFybSBzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfU1VGSV9JRF9BTEFSTV9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3VmaV9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX29udV9zdWZpX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfc3VmaV9hbGFybV9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3N1ZmlfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiYWxhcm0gc3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdWZpX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3N1ZmlfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X3N1ZmlfZGF0YSIsIC5kZXNjciA9ICJTVUZpIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3N1ZmlfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9zdWZpX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfc3VmaV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fb251IC0gbG9haSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2xvYWlfYWxhcm1fc3RhdHVzID0geyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiYWxhcm0gc3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0xPQUlfSURfQUxBUk1fU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2xvYWlfZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfbG9haV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X2xvYWlfYWxhcm1fc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9sb2FpX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gImFsYXJtIHN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfbG9haV9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9sb2FpX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9sb2FpX2RhdGEiLCAuZGVzY3IgPSAiTE9BaSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9sb2FpX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfbG9haV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2xvYWlfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX29udSAtIGRnaSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2RnaV9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJhbGFybSBzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfREdJX0lEX0FMQVJNX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9kZ2lfZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfZGdpX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfZGdpX2FsYXJtX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfZGdpX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gImFsYXJtIHN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfZGdpX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2RnaV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfZGdpX2RhdGEiLCAuZGVzY3IgPSAiUmVjZWl2ZSBEeWluZy1HYXNwIG9mIE9OVWkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfZGdpX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfZGdpX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfZGdpX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBwZWUgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9wZWVfYWxhcm1fc3RhdHVzID0geyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiYWxhcm0gc3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1BFRV9JRF9BTEFSTV9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcGVlX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fb251X3BlZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X3BlZV9hbGFybV9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3BlZV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJhbGFybSBzdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3BlZV9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9wZWVfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X3BlZV9kYXRhIiwgLmRlc2NyID0gIlBFRSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9wZWVfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9wZWVfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9wZWVfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX29udSAtIHBzdCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3BzdF9saW5rX251bWJlciA9IHsgLm5hbWUgPSAibGlua19udW1iZXIiLCAuZGVzY3IgPSAibGluayBudW1iZXIiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfUFNUX0lEX0xJTktfTlVNQkVSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3BzdF9kYXRhLCBsaW5rX251bWJlciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9wc3RfazEgPSB7IC5uYW1lID0gImsxIiwgLmRlc2NyID0gIksxIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1BTVF9JRF9LMSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9wc3RfZGF0YSwgazEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9wc3RfazIgPSB7IC5uYW1lID0gImsyIiwgLmRlc2NyID0gIksyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1BTVF9JRF9LMiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9wc3RfZGF0YSwgazIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX29udV9wc3RfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX29udV9wc3RfbGlua19udW1iZXIsICZwcm9wX2Rlc2NyX2dwb25fb251X3BzdF9rMSwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfcHN0X2syIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9wc3RfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJsaW5rX251bWJlciIsIC5kZXNjciA9ICJsaW5rIG51bWJlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcHN0X2RhdGEsIGxpbmtfbnVtYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImsxIiwgLmRlc2NyID0gIksxIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9wc3RfZGF0YSwgazEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJrMiIsIC5kZXNjciA9ICJLMiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcHN0X2RhdGEsIGsyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcHN0X2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9wc3RfZGF0YSIsIC5kZXNjciA9ICJQU1QiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfcHN0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcHN0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcHN0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSB0aXdpICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfdGl3aV9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfVElXSV9JRF9BTEFSTV9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfdGl3aV9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV90aXdpX2RyaWZ0X3ZhbHVlID0geyAubmFtZSA9ICJkcmlmdF92YWx1ZSIsIC5kZXNjciA9ICJDYWxjdWxhdGVkIGFtb3VudCBvZiBkcmlmdCAocG9zaXRpdmUgKyBuZWdhdGl2ZSBhcyBhIHNpZ25lZCB2YWx1ZSkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1RJV0lfSURfRFJJRlRfVkFMVUUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfdGl3aV9kYXRhLCBkcmlmdF92YWx1ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfaW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fb251X3Rpd2lfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX29udV90aXdpX2FsYXJtX3N0YXR1cywgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfdGl3aV9kcmlmdF92YWx1ZSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfdGl3aV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBzdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3Rpd2lfZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAiZHJpZnRfdmFsdWUiLCAuZGVzY3IgPSAiQ2FsY3VsYXRlZCBhbW91bnQgb2YgZHJpZnQgKHBvc2l0aXZlICsgbmVnYXRpdmUgYXMgYSBzaWduZWQgdmFsdWUpLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfdGl3aV9kYXRhLCBkcmlmdF92YWx1ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfaW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3Rpd2lfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X3Rpd2lfZGF0YSIsIC5kZXNjciA9ICJUcmFuc21pc3Npb24gSW50ZXJmZXJlbmNlIFdhcm5pbmciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfdGl3aV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3Rpd2lfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV90aXdpX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBsb2tpICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfbG9raV9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJhbGFybSBzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfTE9LSV9JRF9BTEFSTV9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfbG9raV9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX29udV9sb2tpX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfbG9raV9hbGFybV9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2xva2lfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiYWxhcm0gc3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9sb2tpX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2xva2lfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X2xva2lfZGF0YSIsIC5kZXNjciA9ICJMT2tpIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2xva2lfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9sb2tpX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfbG9raV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fb251IC0gbWVtaSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X21lbWlfcGxvYW1fYnVmZmVyID0geyAubmFtZSA9ICJwbG9hbV9idWZmZXIiLCAuZGVzY3IgPSAiUExPQU0gYnVmZmVyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX01FTUlfSURfUExPQU1fQlVGRkVSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X21lbWlfZGF0YSwgcGxvYW1fYnVmZmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzEzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfbWVtaV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X21lbWlfcGxvYW1fYnVmZmVyIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9tZW1pX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicGxvYW1fYnVmZmVyIiwgLmRlc2NyID0gIlBMT0FNIGJ1ZmZlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfbWVtaV9kYXRhLCBwbG9hbV9idWZmZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdThfMTMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9tZW1pX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9tZW1pX2RhdGEiLCAuZGVzY3IgPSAiTUVNaSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9tZW1pX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfbWVtaV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X21lbWlfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX29udSAtIG9tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9nZW1fcG9ydCA9IHsgLm5hbWUgPSAiZ2VtX3BvcnQiLCAuZGVzY3IgPSAiR0VNIFBvcnQgSUQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfT01DSV9QT1JUX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX0dFTV9QT1JULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhLCBnZW1fcG9ydCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfc3RhdHVzID0geyAubmFtZSA9ICJzdGF0dXMiLCAuZGVzY3IgPSAic3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX09NQ0lfUE9SVF9JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9vcGVyYXRpb24gPSB7IC5uYW1lID0gIm9wZXJhdGlvbiIsIC5kZXNjciA9ICJPcGVyYXRpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfT01DSV9QT1JUX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX09QRVJBVElPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSwgb3BlcmF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb21jaV9wb3J0X2lkX29wZXJhdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9nZW1fcG9ydCwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX3N0YXR1cywgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX29wZXJhdGlvbiB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZ2VtX3BvcnQiLCAuZGVzY3IgPSAiR0VNIFBvcnQgSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhLCBnZW1fcG9ydCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJzdGF0dXMiLCAuZGVzY3IgPSAic3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH0sIHsgLm5hbWUgPSAib3BlcmF0aW9uIiwgLmRlc2NyID0gIk9wZXJhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEsIG9wZXJhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X29tY2lfcG9ydF9pZF9vcGVyYXRpb24gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhIiwgLmRlc2NyID0gIk9NQ0kgUE9SVCBJRCBDb25maWd1cmF0aW9uIENvbXBsZXRlZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX29udSAtIGJlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9iZXJfaW50ZXJ2YWwgPSB7IC5uYW1lID0gImJlcl9pbnRlcnZhbCIsIC5kZXNjciA9ICJCRVIgaW50ZXJ2YWwgaW4gbXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQkVSX0lOVEVSVkFMX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX0JFUl9JTlRFUlZBTCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSwgYmVyX2ludGVydmFsKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9yZXN1bHQgPSB7IC5uYW1lID0gInJlc3VsdCIsIC5kZXNjciA9ICJSZXN1bHQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQkVSX0lOVEVSVkFMX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEX0lEX1JFU1VMVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSwgcmVzdWx0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2Jlcl9pbnRlcnZhbCwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX3Jlc3VsdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYmVyX2ludGVydmFsIiwgLmRlc2NyID0gIkJFUiBpbnRlcnZhbCBpbiBtcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEsIGJlcl9pbnRlcnZhbCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJyZXN1bHQiLCAuZGVzY3IgPSAiUmVzdWx0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSwgcmVzdWx0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJCRVIgSW50ZXJ2YWwgQ29uZmlndXJhdGlvbiBDb21wbGV0ZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBlcnIgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9lcnJfYmlwOF9lcnJvcnMgPSB7IC5uYW1lID0gImJpcDhfZXJyb3JzIiwgLmRlc2NyID0gIkJJUDggZXJyb3JzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0VSUl9JRF9CSVA4X0VSUk9SUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9lcnJfZGF0YSwgYmlwOF9lcnJvcnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX29udV9lcnJfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX29udV9lcnJfYmlwOF9lcnJvcnMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2Vycl9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImJpcDhfZXJyb3JzIiwgLmRlc2NyID0gIkJJUDggZXJyb3JzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9lcnJfZGF0YSwgYmlwOF9lcnJvcnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9lcnJfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X2Vycl9kYXRhIiwgLmRlc2NyID0gIkVSUiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9lcnJfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9lcnJfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9lcnJfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX29udSAtIHJlaSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3JlaV9iaXA4X2Vycm9ycyA9IHsgLm5hbWUgPSAiYmlwOF9lcnJvcnMiLCAuZGVzY3IgPSAiQklQOCBlcnJvcnMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfUkVJX0lEX0JJUDhfRVJST1JTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3JlaV9kYXRhLCBiaXA4X2Vycm9ycyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX29udV9yZWlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX29udV9yZWlfYmlwOF9lcnJvcnMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3JlaV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImJpcDhfZXJyb3JzIiwgLmRlc2NyID0gIkJJUDggZXJyb3JzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9yZWlfZGF0YSwgYmlwOF9lcnJvcnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcmVpX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9yZWlfZGF0YSIsIC5kZXNjciA9ICJSRUkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfcmVpX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcmVpX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcmVpX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSByYW5naW5nX2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX3N0YXR1cyA9IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gInN0YXR1cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZmFpbF9yZWFzb24gPSB7IC5uYW1lID0gImZhaWxfcmVhc29uIiwgLmRlc2NyID0gImZhaWwgcmVhc29uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEsIGZhaWxfcmVhc29uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmFuZ2luZ19mYWlsX3JlYXNvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX251bWJlcl9vZl9wbG9hbXMgPSB7IC5uYW1lID0gIm51bWJlcl9vZl9wbG9hbXMiLCAuZGVzY3IgPSAibnVtYmVyIG9mIFBMT0FNcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9OVU1CRVJfT0ZfUExPQU1TLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEsIG51bWJlcl9vZl9wbG9hbXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9lcWQgPSB7IC5uYW1lID0gImVxZCIsIC5kZXNjciA9ICJFUUQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfRVFELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEsIGVxZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9wb3dlcl9sZXZlbCA9IHsgLm5hbWUgPSAicG93ZXJfbGV2ZWwiLCAuZGVzY3IgPSAiUG93ZXIgTGV2ZWwiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfUE9XRVJfTEVWRUwsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSwgcG93ZXJfbGV2ZWwpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX3N0YXR1cywgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZmFpbF9yZWFzb24sICZwcm9wX2Rlc2NyX2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX251bWJlcl9vZl9wbG9hbXMsICZwcm9wX2Rlc2NyX2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2VxZCwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfcG93ZXJfbGV2ZWwgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gInN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH0sIHsgLm5hbWUgPSAiZmFpbF9yZWFzb24iLCAuZGVzY3IgPSAiZmFpbCByZWFzb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEsIGZhaWxfcmVhc29uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmFuZ2luZ19mYWlsX3JlYXNvbiB9LCB7IC5uYW1lID0gIm51bWJlcl9vZl9wbG9hbXMiLCAuZGVzY3IgPSAibnVtYmVyIG9mIFBMT0FNcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSwgbnVtYmVyX29mX3Bsb2FtcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gImVxZCIsIC5kZXNjciA9ICJFUUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEsIGVxZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJwb3dlcl9sZXZlbCIsIC5kZXNjciA9ICJQb3dlciBMZXZlbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSwgcG93ZXJfbGV2ZWwpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJSYW5naW5nIENvbXBsZXRlZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX29udSAtIHBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9zdGF0dXMgPSB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfUEFTU1dPUkRfQVVUSEVOVElDQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2ZhaWxfcmVhc29uID0geyAubmFtZSA9ICJmYWlsX3JlYXNvbiIsIC5kZXNjciA9ICJmYWlsIHJlYXNvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9DT01QTEVURURfSURfRkFJTF9SRUFTT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2RhdGEsIGZhaWxfcmVhc29uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fZmFpbF9yZWFzb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfcGFzc3dvcmQgPSB7IC5uYW1lID0gInBhc3N3b3JkIiwgLmRlc2NyID0gInBhc3N3b3JkIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFRF9JRF9QQVNTV09SRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfZGF0YSwgcGFzc3dvcmQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdThfMTAgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfc3RhdHVzLCAmcHJvcF9kZXNjcl9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfZmFpbF9yZWFzb24sICZwcm9wX2Rlc2NyX2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9wYXNzd29yZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gInN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9LCB7IC5uYW1lID0gImZhaWxfcmVhc29uIiwgLmRlc2NyID0gImZhaWwgcmVhc29uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfZGF0YSwgZmFpbF9yZWFzb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9mYWlsX3JlYXNvbiB9LCB7IC5uYW1lID0gInBhc3N3b3JkIiwgLmRlc2NyID0gInBhc3N3b3JkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfZGF0YSwgcGFzc3dvcmQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdThfMTAgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9kYXRhIiwgLmRlc2NyID0gIlBhc3N3b3JkIEF1dGhlbnRpY2F0aW9uIENvbXBsZXRlZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX29udSAtIG9udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9zdGF0dXMgPSB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfT05VX0FDVElWQVRJT05fQ09NUExFVEVEX0lEX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2ZhaWxfcmVhc29uID0geyAubmFtZSA9ICJmYWlsX3JlYXNvbiIsIC5kZXNjciA9ICJmYWlsIHJlYXNvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfRkFJTF9SRUFTT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGEsIGZhaWxfcmVhc29uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYWN0aXZhdGlvbl9mYWlsX3JlYXNvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9zdGF0dXMsICZwcm9wX2Rlc2NyX2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9mYWlsX3JlYXNvbiB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gInN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9LCB7IC5uYW1lID0gImZhaWxfcmVhc29uIiwgLmRlc2NyID0gImZhaWwgcmVhc29uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSwgZmFpbF9yZWFzb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hY3RpdmF0aW9uX2ZhaWxfcmVhc29uIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJPTlUgQWN0aXZhdGlvbiBDb21wbGV0ZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBvbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX3N0YXR1cyA9IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gInN0YXR1cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9PTlVfREVBQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gInN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGEiLCAuZGVzY3IgPSAiT05VIERlYWN0aXZhdGlvbiBDb21wbGV0ZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBvbnVfZW5hYmxlX2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX3NlcmlhbF9udW1iZXIgPSB7IC5uYW1lID0gInNlcmlhbF9udW1iZXIiLCAuZGVzY3IgPSAic2VyaWFsIG51bWJlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9PTlVfRU5BQkxFX0NPTVBMRVRFRF9JRF9TRVJJQUxfTlVNQkVSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGEsIHNlcmlhbF9udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zZXJpYWxfbnVtYmVyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9zZXJpYWxfbnVtYmVyIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInNlcmlhbF9udW1iZXIiLCAuZGVzY3IgPSAic2VyaWFsIG51bWJlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSwgc2VyaWFsX251bWJlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3NlcmlhbF9udW1iZXIgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJPTlUgRW5hYmxlIENvbXBsZXRlZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX29udSAtIG9udV9kaXNhYmxlX2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9zZXJpYWxfbnVtYmVyID0geyAubmFtZSA9ICJzZXJpYWxfbnVtYmVyIiwgLmRlc2NyID0gInNlcmlhbCBudW1iZXIiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfT05VX0RJU0FCTEVfQ09NUExFVEVEX0lEX1NFUklBTF9OVU1CRVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGEsIHNlcmlhbF9udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zZXJpYWxfbnVtYmVyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX3NlcmlhbF9udW1iZXIgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInNlcmlhbF9udW1iZXIiLCAuZGVzY3IgPSAic2VyaWFsIG51bWJlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGEsIHNlcmlhbF9udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zZXJpYWxfbnVtYmVyIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJPTlUgRGlzYWJsZSBDb21wbGV0ZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBpbnZhbGlkX2RicnVfcmVwb3J0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9hbGxvY19pZCA9IHsgLm5hbWUgPSAiYWxsb2NfaWQiLCAuZGVzY3IgPSAiQWxsb2MtSUQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfSU5WQUxJRF9EQlJVX1JFUE9SVF9JRF9BTExPQ19JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGEsIGFsbG9jX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2FsbG9jX2lkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWxsb2NfaWQiLCAuZGVzY3IgPSAiQWxsb2MtSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YSwgYWxsb2NfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhIiwgLmRlc2NyID0gIkludmFsaWQgREJSdSBSZXBvcnQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBrZXlfZXhjaGFuZ2VfY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9uZXdfa2V5ID0geyAubmFtZSA9ICJuZXdfa2V5IiwgLmRlc2NyID0gIm5ldyBrZXkiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX0NPTVBMRVRFRF9JRF9ORVdfS0VZLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YSwgbmV3X2tleSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Flc19rZXkgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9uZXdfa2V5IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibmV3X2tleSIsIC5kZXNjciA9ICJuZXcga2V5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGEsIG5ld19rZXkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hZXNfa2V5IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhIiwgLmRlc2NyID0gIktleSBFeGNoYW5nZSBDb21wbGV0ZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBrZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0X3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGdwb25fb251IC0ga2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZF9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiBncG9uX29udSAtIGtleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2ggKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2V4cGVjdGVkX2tleSA9IHsgLm5hbWUgPSAiZXhwZWN0ZWRfa2V5IiwgLmRlc2NyID0gImV4cGVjdGVkIGtleSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENIX0lEX0VYUEVDVEVEX0tFWSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGEsIGV4cGVjdGVkX2tleSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Flc19rZXkgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX3JlY2VpdmVkX2tleSA9IHsgLm5hbWUgPSAicmVjZWl2ZWRfa2V5IiwgLmRlc2NyID0gInJlY2VpdmVkIGtleSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENIX0lEX1JFQ0VJVkVEX0tFWSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGEsIHJlY2VpdmVkX2tleSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Flc19rZXkgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9leHBlY3RlZF9rZXksICZwcm9wX2Rlc2NyX2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfcmVjZWl2ZWRfa2V5IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZXhwZWN0ZWRfa2V5IiwgLmRlc2NyID0gImV4cGVjdGVkIGtleSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhLCBleHBlY3RlZF9rZXkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hZXNfa2V5IH0sIHsgLm5hbWUgPSAicmVjZWl2ZWRfa2V5IiwgLmRlc2NyID0gInJlY2VpdmVkIGtleSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhLCByZWNlaXZlZF9rZXkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hZXNfa2V5IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhIiwgLmRlc2NyID0gIktleSBFeGNoYW5nZSBLZXkgTWlzbWF0Y2giLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBrZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2V4cGVjdGVkX2luZGV4ID0geyAubmFtZSA9ICJleHBlY3RlZF9pbmRleCIsIC5kZXNjciA9ICJleHBlY3RlZCBpbmRleCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9LRVlfRVhDSEFOR0VfVU5DT05TRUNVVElWRV9JTkRFWF9JRF9FWFBFQ1RFRF9JTkRFWCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9kYXRhLCBleHBlY3RlZF9pbmRleCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9hY3R1YWxfaW5kZXggPSB7IC5uYW1lID0gImFjdHVhbF9pbmRleCIsIC5kZXNjciA9ICJhY3R1YWwgaW5kZXgiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfS0VZX0VYQ0hBTkdFX1VOQ09OU0VDVVRJVkVfSU5ERVhfSURfQUNUVUFMX0lOREVYLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2RhdGEsIGFjdHVhbF9pbmRleCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2V4cGVjdGVkX2luZGV4LCAmcHJvcF9kZXNjcl9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9hY3R1YWxfaW5kZXggfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZXhwZWN0ZWRfaW5kZXgiLCAuZGVzY3IgPSAiZXhwZWN0ZWQgaW5kZXgiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2RhdGEsIGV4cGVjdGVkX2luZGV4KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImFjdHVhbF9pbmRleCIsIC5kZXNjciA9ICJhY3R1YWwgaW5kZXgiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2RhdGEsIGFjdHVhbF9pbmRleCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhfZGF0YSIsIC5kZXNjciA9ICJLZXkgRXhjaGFuZ2UgVW5jb25zZWN1dGl2ZSBJbmRleCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX29udSAtIHJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfc3RhdHVzID0geyAubmFtZSA9ICJzdGF0dXMiLCAuZGVzY3IgPSAic3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9mYWlsX3JlYXNvbiA9IHsgLm5hbWUgPSAiZmFpbF9yZWFzb24iLCAuZGVzY3IgPSAiZmFpbCByZWFzb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURURfSURfRkFJTF9SRUFTT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSwgZmFpbF9yZWFzb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yc3NpX21lYXN1cmVtZW50X2ZhaWxfcmVhc29uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9zdGF0dXMsICZwcm9wX2Rlc2NyX2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2ZhaWxfcmVhc29uIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJzdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9LCB7IC5uYW1lID0gImZhaWxfcmVhc29uIiwgLmRlc2NyID0gImZhaWwgcmVhc29uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhLCBmYWlsX3JlYXNvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jzc2lfbWVhc3VyZW1lbnRfZmFpbF9yZWFzb24gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJSU1NJIE1lYXN1cmVtZW50IENvbXBsZXRlZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX29udSAtIGtleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfbmV3X2tleSA9IHsgLm5hbWUgPSAibmV3X2tleSIsIC5kZXNjciA9ICJuZXcga2V5IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0tFWV9FWENIQU5HRV9ERUNSWVBUX1JFUVVJUkVEX0lEX05FV19LRVksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfZGF0YSwgbmV3X2tleSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Flc19rZXkgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkX25ld19rZXkgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibmV3X2tleSIsIC5kZXNjciA9ICJuZXcga2V5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9kYXRhLCBuZXdfa2V5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYWVzX2tleSB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9kYXRhIiwgLmRlc2NyID0gIktleSBFeGNoYW5nZSBEZWNyeXB0IFJlcXVpcmVkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fb251IC0gb3B0aWNhbF9yZWZsZWN0aW9uICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uX3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGdwb25fb251IC0gY3B1X3BhY2tldHMgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9jcHVfcGFja2V0c19wYWNrZXRfdHlwZSA9IHsgLm5hbWUgPSAicGFja2V0X3R5cGUiLCAuZGVzY3IgPSAicGFja2V0IHR5cGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfUEFDS0VUX1RZUEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSwgcGFja2V0X3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wYWNrZXRfdHlwZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2NwdV9wYWNrZXRzX2NhbGNfY3JjID0geyAubmFtZSA9ICJjYWxjX2NyYyIsIC5kZXNjciA9ICJjYWxjIGNyYyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9DQUxDX0NSQywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhLCBjYWxjX2NyYyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2NwdV9wYWNrZXRzX251bWJlcl9vZl9wYWNrZXRzID0geyAubmFtZSA9ICJudW1iZXJfb2ZfcGFja2V0cyIsIC5kZXNjciA9ICJudW1iZXIgb2YgcGFja2V0cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUU19JRF9OVU1CRVJfT0ZfUEFDS0VUUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhLCBudW1iZXJfb2ZfcGFja2V0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2NwdV9wYWNrZXRzX3BhY2tldF9zaXplID0geyAubmFtZSA9ICJwYWNrZXRfc2l6ZSIsIC5kZXNjciA9ICJTaW5nbGUgcGFja2V0IHNpemUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfUEFDS0VUX1NJWkUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSwgcGFja2V0X3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfYnVmZmVyID0geyAubmFtZSA9ICJidWZmZXIiLCAuZGVzY3IgPSAiYnVmZmVyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRTX0lEX0JVRkZFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhLCBidWZmZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fb251X2NwdV9wYWNrZXRzX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfcGFja2V0X3R5cGUsICZwcm9wX2Rlc2NyX2dwb25fb251X2NwdV9wYWNrZXRzX2NhbGNfY3JjLCAmcHJvcF9kZXNjcl9ncG9uX29udV9jcHVfcGFja2V0c19udW1iZXJfb2ZfcGFja2V0cywgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfcGFja2V0X3NpemUsICZwcm9wX2Rlc2NyX2dwb25fb251X2NwdV9wYWNrZXRzX2J1ZmZlciB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwYWNrZXRfdHlwZSIsIC5kZXNjciA9ICJwYWNrZXQgdHlwZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSwgcGFja2V0X3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wYWNrZXRfdHlwZSB9LCB7IC5uYW1lID0gImNhbGNfY3JjIiwgLmRlc2NyID0gImNhbGMgY3JjIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhLCBjYWxjX2NyYyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm51bWJlcl9vZl9wYWNrZXRzIiwgLmRlc2NyID0gIm51bWJlciBvZiBwYWNrZXRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhLCBudW1iZXJfb2ZfcGFja2V0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInBhY2tldF9zaXplIiwgLmRlc2NyID0gIlNpbmdsZSBwYWNrZXQgc2l6ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSwgcGFja2V0X3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiYnVmZmVyIiwgLmRlc2NyID0gImJ1ZmZlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSwgYnVmZmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDggfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSIsIC5kZXNjciA9ICJHUE9OIENQVSBQYWNrZXRzIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fb251IC0gcGxvYW1fcGFja2V0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X3Bsb2FtID0geyAubmFtZSA9ICJwbG9hbSIsIC5kZXNjciA9ICJwbG9hbSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9QTE9BTV9QQUNLRVRfSURfUExPQU0sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGEsIHBsb2FtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzEyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X3Bsb2FtIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwbG9hbSIsIC5kZXNjciA9ICJwbG9hbSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGEsIHBsb2FtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzEyIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YSIsIC5kZXNjciA9ICJQTE9BTSBQYWNrZXQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBjcHVfcGFja2V0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfY3B1X3BhY2tldF9wb3J0X2lkID0geyAubmFtZSA9ICJwb3J0X2lkIiwgLmRlc2NyID0gInBvcnRfaWQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9QT1JUX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfZGF0YSwgcG9ydF9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9jcHVfcGFja2V0X2NyY19vayA9IHsgLm5hbWUgPSAiY3JjX29rIiwgLmRlc2NyID0gImNyY19vayIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUX0lEX0NSQ19PSywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2RhdGEsIGNyY19vayksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2NwdV9wYWNrZXRfcGFja2V0X3NpemUgPSB7IC5uYW1lID0gInBhY2tldF9zaXplIiwgLmRlc2NyID0gInBhY2tldF9zaXplIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0NQVV9QQUNLRVRfSURfUEFDS0VUX1NJWkUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhLCBwYWNrZXRfc2l6ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9jcHVfcGFja2V0X2J1ZmZlciA9IHsgLm5hbWUgPSAiYnVmZmVyIiwgLmRlc2NyID0gImJ1ZmZlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9DUFVfUEFDS0VUX0lEX0JVRkZFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2RhdGEsIGJ1ZmZlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3U4X2xpc3RfdTMyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfY3B1X3BhY2tldF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X2NwdV9wYWNrZXRfcG9ydF9pZCwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfY3B1X3BhY2tldF9jcmNfb2ssICZwcm9wX2Rlc2NyX2dwb25fb251X2NwdV9wYWNrZXRfcGFja2V0X3NpemUsICZwcm9wX2Rlc2NyX2dwb25fb251X2NwdV9wYWNrZXRfYnVmZmVyIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicG9ydF9pZCIsIC5kZXNjciA9ICJwb3J0X2lkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2RhdGEsIHBvcnRfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiY3JjX29rIiwgLmRlc2NyID0gImNyY19vayIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhLCBjcmNfb2spLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJwYWNrZXRfc2l6ZSIsIC5kZXNjciA9ICJwYWNrZXRfc2l6ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhLCBwYWNrZXRfc2l6ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJidWZmZXIiLCAuZGVzY3IgPSAiYnVmZmVyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2RhdGEsIGJ1ZmZlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3U4X2xpc3RfdTMyIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhIiwgLmRlc2NyID0gIkluZGljYXRlcyBDUFUgcGFja2V0IHdhcyByZWNlaXZlZCBvbiB0aGUgVVMgZnJvbSB0aGlzIE9OVSBpZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX29udSAtIG9tY2lfcGFja2V0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfcG9ydF9pZCA9IHsgLm5hbWUgPSAicG9ydF9pZCIsIC5kZXNjciA9ICJwb3J0X2lkIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX09NQ0lfUEFDS0VUX0lEX1BPUlRfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YSwgcG9ydF9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9vbWNpX3BhY2tldF9jcmNfb2sgPSB7IC5uYW1lID0gImNyY19vayIsIC5kZXNjciA9ICJjcmNfb2siLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfQ1JDX09LLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2RhdGEsIGNyY19vayksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X29tY2lfcGFja2V0X3BhY2tldF9zaXplID0geyAubmFtZSA9ICJwYWNrZXRfc2l6ZSIsIC5kZXNjciA9ICJwYWNrZXRfc2l6ZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9QQUNLRVRfU0laRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9kYXRhLCBwYWNrZXRfc2l6ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9vbWNpX3BhY2tldF9idWZmZXIgPSB7IC5uYW1lID0gImJ1ZmZlciIsIC5kZXNjciA9ICJidWZmZXIiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfQlVGRkVSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2RhdGEsIGJ1ZmZlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3U4X2xpc3RfdTMyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfb21jaV9wYWNrZXRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX29udV9vbWNpX3BhY2tldF9wb3J0X2lkLCAmcHJvcF9kZXNjcl9ncG9uX29udV9vbWNpX3BhY2tldF9jcmNfb2ssICZwcm9wX2Rlc2NyX2dwb25fb251X29tY2lfcGFja2V0X3BhY2tldF9zaXplLCAmcHJvcF9kZXNjcl9ncG9uX29udV9vbWNpX3BhY2tldF9idWZmZXIgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicG9ydF9pZCIsIC5kZXNjciA9ICJwb3J0X2lkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9kYXRhLCBwb3J0X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gImNyY19vayIsIC5kZXNjciA9ICJjcmNfb2siLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2RhdGEsIGNyY19vayksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInBhY2tldF9zaXplIiwgLmRlc2NyID0gInBhY2tldF9zaXplIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9kYXRhLCBwYWNrZXRfc2l6ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJidWZmZXIiLCAuZGVzY3IgPSAiYnVmZmVyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9kYXRhLCBidWZmZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91OF9saXN0X3UzMiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9kYXRhIiwgLmRlc2NyID0gIkluZGljYXRlcyBPTUNJIHBhY2tldCB3YXMgcmVjZWl2ZWQgb24gdGhlIFVTIGZyb20gdGhpcyBPTlUgaWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBvbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX3Jlc3VsdCA9IHsgLm5hbWUgPSAicmVzdWx0IiwgLmRlc2NyID0gInJlc3VsdCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9PTlVfQUNUSVZBVElPTl9TVEFOREJZX0NPTVBMRVRFRF9JRF9SRVNVTFQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfZGF0YSwgcmVzdWx0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9yZXN1bHQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicmVzdWx0IiwgLmRlc2NyID0gInJlc3VsdCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfZGF0YSwgcmVzdWx0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX2RhdGEiLCAuZGVzY3IgPSAib251IGFjdGl2YXRpb24gc3RhbmRieSBjb21wbGV0ZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX29sZF9zdGF0ZSA9IHsgLm5hbWUgPSAib2xkX3N0YXRlIiwgLmRlc2NyID0gIlRoZSBzdGF0ZSB0aGUgT05VIHdhcyBwcmV2aW91c2x5IGluLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9PTERfU1RBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSwgb2xkX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb251X3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfbmV3X3N0YXRlID0geyAubmFtZSA9ICJuZXdfc3RhdGUiLCAuZGVzY3IgPSAiVGhlIHN0YXRlIHRoZSBPTlUgaXMgY3VycmVudGx5IGluLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9ORVdfU1RBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSwgbmV3X3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb251X3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfcmVhc29uID0geyAubmFtZSA9ICJyZWFzb24iLCAuZGVzY3IgPSAiVGhlIHJlYXNvbiBmb3IgdGhlIHN0YXRlIGNoYW5nZS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0VfSURfUkVBU09OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGEsIHJlYXNvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvd2VyX21hbmFnZW1lbnRfdHJhbnNpdGlvbl9yZWFzb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX29sZF9zdGF0ZSwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfbmV3X3N0YXRlLCAmcHJvcF9kZXNjcl9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9yZWFzb24gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAib2xkX3N0YXRlIiwgLmRlc2NyID0gIlRoZSBzdGF0ZSB0aGUgT05VIHdhcyBwcmV2aW91c2x5IGluLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSwgb2xkX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb251X3N0YXRlIH0sIHsgLm5hbWUgPSAibmV3X3N0YXRlIiwgLmRlc2NyID0gIlRoZSBzdGF0ZSB0aGUgT05VIGlzIGN1cnJlbnRseSBpbi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGEsIG5ld19zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X29udV9zdGF0ZSB9LCB7IC5uYW1lID0gInJlYXNvbiIsIC5kZXNjciA9ICJUaGUgcmVhc29uIGZvciB0aGUgc3RhdGUgY2hhbmdlLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSwgcmVhc29uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG93ZXJfbWFuYWdlbWVudF90cmFuc2l0aW9uX3JlYXNvbiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhIiwgLmRlc2NyID0gIk5vdGlmaWNhdGlvbiB0aGF0IGFuIE9OVXMgcG93ZXIgbWFuYWdlbWVudCBzdGF0ZSBoYXMgY2hhbmdlZC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogZ3Bvbl9vbnUgLSBwb3NzaWJsZV9kcmlmdCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2FsYXJtX3N0YXR1cyA9IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gIkFsYXJtIFN0YXR1cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9QT1NTSUJMRV9EUklGVF9JRF9BTEFSTV9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZXN0aW1hdGVkX2RyaWZ0ID0geyAubmFtZSA9ICJlc3RpbWF0ZWRfZHJpZnQiLCAuZGVzY3IgPSAiSWYgc3RhdHVzIGlzIG9uLCB0aGUgZXN0aW1hdGVkIGRyaWZ0IHZhbHVlLCBvdGhlcndpc2UgemVybyAoMCkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX1BPU1NJQkxFX0RSSUZUX0lEX0VTVElNQVRFRF9EUklGVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhLCBlc3RpbWF0ZWRfZHJpZnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2ludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX29udV9wb3NzaWJsZV9kcmlmdF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2FsYXJtX3N0YXR1cywgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZXN0aW1hdGVkX2RyaWZ0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBTdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9LCB7IC5uYW1lID0gImVzdGltYXRlZF9kcmlmdCIsIC5kZXNjciA9ICJJZiBzdGF0dXMgaXMgb24sIHRoZSBlc3RpbWF0ZWQgZHJpZnQgdmFsdWUsIG90aGVyd2lzZSB6ZXJvICgwKS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGEsIGVzdGltYXRlZF9kcmlmdCksIC50eXBlID0gJnR5cGVfZGVzY3JfaW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhIiwgLmRlc2NyID0gIkFuIE9OVSBpbiBhIGxvdyBwb3dlciBzdGF0ZSBtYXkgYmUgZXhwZXJpZW5jaW5nIGRyaWZ0IGJleW9uZCB0aGUgY29uZmlndXJlZCB0aHJlc2hvbGQuIFRoZSBlc3RpbWF0ZSBtYXkgYmUgaW5hY2N1cmF0ZSBkZXBlbmRpbmcgb24gT05VIGJlaGF2aW9yLiBBY3R1YWwgZHJpZnQgbWF5IGJlIGxlc3MgdGhhbiBlc3RpbWF0ZWQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fb251IC0gc3RhdF9jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X2NmZ19jZmcgPSB7IC5uYW1lID0gImNmZyIsIC5kZXNjciA9ICJTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9DRkdfSURfQ0ZHLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl9vbnVfc3RhdF9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X2NmZ19jZmcgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfZGF0YSwgY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9jb25maWcgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfZGF0YSIsIC5kZXNjciA9ICJTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3N0YXRfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX29udSAtIHN0YXRfYWxhcm1fcmFpc2VkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfc3RhdCA9IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfc3RhdF9pZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3N0YXRfaWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX29udSAtIHN0YXRfYWxhcm1fY2xlYXJlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9zdGF0ID0geyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3N0YXRfaWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfc3RhdF9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGdwb25fb251IC0gYXV0b19jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19iZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQgPSB7IC5uYW1lID0gImJlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0JFUl9JTlRFUlZBTF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBiZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19kZmkgPSB7IC5uYW1lID0gImRmaSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZGZpXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0RGSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBkZmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19kZ2kgPSB7IC5uYW1lID0gImRnaSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZGdpXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0RHSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBkZ2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19kb3dpID0geyAubmFtZSA9ICJkb3dpIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJkb3dpXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0RPV0ksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgZG93aSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX2VyciA9IHsgLm5hbWUgPSAiZXJyIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJlcnJcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfRVJSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIGVyciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX2ludmFsaWRfZGJydV9yZXBvcnQgPSB7IC5uYW1lID0gImludmFsaWRfZGJydV9yZXBvcnQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImludmFsaWRfZGJydV9yZXBvcnRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfSU5WQUxJRF9EQlJVX1JFUE9SVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBpbnZhbGlkX2RicnVfcmVwb3J0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCA9IHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwia2V5X2V4Y2hhbmdlX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIGtleV9leGNoYW5nZV9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCA9IHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImtleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9DWUNMRV9TS0lQUEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIGtleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWQgPSB7IC5uYW1lID0gImtleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJrZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfREVDUllQVF9SRVFVSVJFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBrZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2ggPSB7IC5uYW1lID0gImtleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2giLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImtleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBrZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXQgPSB7IC5uYW1lID0gImtleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0IiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJrZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfS0VZX1JFUVVFU1RfVElNRU9VVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBrZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4ID0geyAubmFtZSA9ICJrZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwia2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfS0VZX0VYQ0hBTkdFX1VOQ09OU0VDVVRJVkVfSU5ERVgsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwga2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19sb2FpID0geyAubmFtZSA9ICJsb2FpIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJsb2FpXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX0xPQUksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgbG9haSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX2xva2kgPSB7IC5uYW1lID0gImxva2kiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImxva2lcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfTE9LSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBsb2tpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfbWVtaSA9IHsgLm5hbWUgPSAibWVtaSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibWVtaVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9NRU1JLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIG1lbWkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQgPSB7IC5uYW1lID0gIm9tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwib21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09NQ0lfUE9SVF9JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBvbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQgPSB7IC5uYW1lID0gIm9udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwib251X2FjdGl2YXRpb25fY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBvbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZCA9IHsgLm5hbWUgPSAib251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm9udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9BQ1RJVkFUSU9OX1NUQU5EQllfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIG9udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfb251X2FsYXJtID0geyAubmFtZSA9ICJvbnVfYWxhcm0iLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm9udV9hbGFybVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfQUxBUk0sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgb251X2FsYXJtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQgPSB7IC5uYW1lID0gIm9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfREVBQ1RJVkFUSU9OX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBvbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX29udV9kaXNhYmxlX2NvbXBsZXRlZCA9IHsgLm5hbWUgPSAib251X2Rpc2FibGVfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvbnVfZGlzYWJsZV9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0RJU0FCTEVfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIG9udV9kaXNhYmxlX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX29udV9lbmFibGVfY29tcGxldGVkID0geyAubmFtZSA9ICJvbnVfZW5hYmxlX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwib251X2VuYWJsZV9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0VOQUJMRV9DT01QTEVURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgb251X2VuYWJsZV9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19vcHRpY2FsX3JlZmxlY3Rpb24gPSB7IC5uYW1lID0gIm9wdGljYWxfcmVmbGVjdGlvbiIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwib3B0aWNhbF9yZWZsZWN0aW9uXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX09QVElDQUxfUkVGTEVDVElPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBvcHRpY2FsX3JlZmxlY3Rpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWQgPSB7IC5uYW1lID0gInBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBwYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19wZWUgPSB7IC5uYW1lID0gInBlZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicGVlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1BFRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBwZWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19wb3NzaWJsZV9kcmlmdCA9IHsgLm5hbWUgPSAicG9zc2libGVfZHJpZnQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInBvc3NpYmxlX2RyaWZ0XCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1BPU1NJQkxFX0RSSUZULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIHBvc3NpYmxlX2RyaWZ0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UgPSB7IC5uYW1lID0gInBvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX3BzdCA9IHsgLm5hbWUgPSAicHN0IiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJwc3RcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUFNULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIHBzdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX3JhbmdpbmdfY29tcGxldGVkID0geyAubmFtZSA9ICJyYW5naW5nX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicmFuZ2luZ19jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfUkFOR0lOR19DT01QTEVURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgcmFuZ2luZ19jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19yZWkgPSB7IC5uYW1lID0gInJlaSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicmVpXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1JFSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCByZWkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCA9IHsgLm5hbWUgPSAicnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fT05VX0FVVE9fQ0ZHX0lEX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIHJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfc2RpID0geyAubmFtZSA9ICJzZGkiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInNkaVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9TREksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgc2RpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfc2ZpID0geyAubmFtZSA9ICJzZmkiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInNmaVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9TRkksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgc2ZpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfc3RhdF9hbGFybV9jbGVhcmVkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9jbGVhcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfc3RhdF9hbGFybV9yYWlzZWQgPSB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX3JhaXNlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX3JhaXNlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX3N1ZmkgPSB7IC5uYW1lID0gInN1ZmkiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN1ZmlcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9PTlVfQVVUT19DRkdfSURfU1VGSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBzdWZpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfdGl3aSA9IHsgLm5hbWUgPSAidGl3aSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwidGl3aVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX09OVV9BVVRPX0NGR19JRF9USVdJLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIHRpd2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBncG9uX29udV9hdXRvX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfZGZpLCAmcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19kZ2ksICZwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX2Rvd2ksICZwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX2VyciwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfaW52YWxpZF9kYnJ1X3JlcG9ydCwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQsICZwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkLCAmcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoLCAmcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXgsICZwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX2xvYWksICZwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX2xva2ksICZwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX21lbWksICZwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfb251X2FjdGl2YXRpb25fY29tcGxldGVkLCAmcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfb251X2FsYXJtLCAmcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfb251X2Rpc2FibGVfY29tcGxldGVkLCAmcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19vbnVfZW5hYmxlX2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfb3B0aWNhbF9yZWZsZWN0aW9uLCAmcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWQsICZwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX3BlZSwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfcG9zc2libGVfZHJpZnQsICZwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlLCAmcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19wc3QsICZwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX3JhbmdpbmdfY29tcGxldGVkLCAmcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19yZWksICZwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkLCAmcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19zZGksICZwcm9wX2Rlc2NyX2dwb25fb251X2F1dG9fY2ZnX3NmaSwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfc3RhdF9hbGFybV9jbGVhcmVkLCAmcHJvcF9kZXNjcl9ncG9uX29udV9hdXRvX2NmZ19zdGF0X2FsYXJtX3JhaXNlZCwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfc3VmaSwgJnByb3BfZGVzY3JfZ3Bvbl9vbnVfYXV0b19jZmdfdGl3aSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJiZXJfaW50ZXJ2YWxfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImJlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiZGZpIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJkZmlcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIGRmaSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImRnaSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZGdpXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBkZ2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJkb3dpIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJkb3dpXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBkb3dpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiZXJyIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJlcnJcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIGVyciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImludmFsaWRfZGJydV9yZXBvcnQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImludmFsaWRfZGJydV9yZXBvcnRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIGludmFsaWRfZGJydV9yZXBvcnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJrZXlfZXhjaGFuZ2VfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJrZXlfZXhjaGFuZ2VfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBrZXlfZXhjaGFuZ2VfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImtleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBrZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImtleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJrZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwga2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJrZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJrZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBrZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImtleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0XCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBrZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImtleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4IiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJrZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwga2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJsb2FpIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJsb2FpXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBsb2FpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAibG9raSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibG9raVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgbG9raSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm1lbWkiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm1lbWlcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIG1lbWkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJvbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm9tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAib251X2FjdGl2YXRpb25fY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIG9udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm9udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJvbnVfYWxhcm0iLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm9udV9hbGFybVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgb251X2FsYXJtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAib251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBvbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm9udV9kaXNhYmxlX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwib251X2Rpc2FibGVfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBvbnVfZGlzYWJsZV9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJvbnVfZW5hYmxlX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwib251X2VuYWJsZV9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIG9udV9lbmFibGVfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAib3B0aWNhbF9yZWZsZWN0aW9uIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvcHRpY2FsX3JlZmxlY3Rpb25cIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIG9wdGljYWxfcmVmbGVjdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBwYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJwZWUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInBlZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgcGVlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicG9zc2libGVfZHJpZnQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInBvc3NpYmxlX2RyaWZ0XCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBwb3NzaWJsZV9kcmlmdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInBvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJwc3QiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInBzdFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgcHN0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicmFuZ2luZ19jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInJhbmdpbmdfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCByYW5naW5nX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInJlaSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicmVpXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCByZWkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJyc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIHJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic2RpIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzZGlcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIHNkaSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInNmaSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic2ZpXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBzZmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9jbGVhcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fcmFpc2VkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX3JhaXNlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN1ZmkiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN1ZmlcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEsIHN1ZmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJ0aXdpIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJ0aXdpXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhLCB0aXdpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEiLCAuZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogPT09PSBPYmplY3Q6IGdwb25fdHJ4ID09PT0gKi8KKworLyogR3JvdXA6IGdwb25fdHJ4IC0ga2V5ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl90cnhfa2V5X3Bvbl9uaSA9IHsgLm5hbWUgPSAicG9uX25pIiwgLmRlc2NyID0gIlBPTiBuZXR3b3JrIGludGVyZmFjZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX1RSWF9LRVlfSURfUE9OX05JLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2tleSwgcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgZ3Bvbl90cnhfa2V5X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfZ3Bvbl90cnhfa2V5X3Bvbl9uaSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl90cnhfa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBvbl9uaSIsIC5kZXNjciA9ICJQT04gbmV0d29yayBpbnRlcmZhY2UiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2tleSwgcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl90cnhfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfZ3Bvbl90cnhfa2V5IiwgLmRlc2NyID0gImtleSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX3RyeF9rZXkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl90cnhfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2dwb25fdHJ4X2tleV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBncG9uX3RyeCAtIGNmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ190cmFuc2NlaXZlcl90eXBlID0geyAubmFtZSA9ICJ0cmFuc2NlaXZlcl90eXBlIiwgLmRlc2NyID0gInRyYW5zY2VpdmVyIHR5cGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1RSQU5TQ0VJVkVSX1RZUEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIHRyYW5zY2VpdmVyX3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF90cnhfdHlwZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ19sYV9jb25maWd1cmF0aW9uID0geyAubmFtZSA9ICJsYV9jb25maWd1cmF0aW9uIiwgLmRlc2NyID0gIkxBIGNvbmZpZ3VyYXRpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX0xBX0NPTkZJR1VSQVRJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIGxhX2NvbmZpZ3VyYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9sYV9yZXN5bmNfcGF0dGVybl9jb25maWd1cmF0aW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl90cnhfY2ZnX2JjZHIgPSB7IC5uYW1lID0gImJjZHIiLCAuZGVzY3IgPSAiQkNEUiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgYmNkciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2JjZHJfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ19sYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYyA9IHsgLm5hbWUgPSAibGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMiLCAuZGVzY3IgPSAiTEEgcmFuZ2luZyBhZnRlciBubyBlZCByZXN5bmMgIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9SQU5HSU5HX0FGVEVSX05PX0VEX1JFU1lOQywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgbGFfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN5bmNfY29udHJvbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ19iY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jID0geyAubmFtZSA9ICJiY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jIiwgLmRlc2NyID0gInVzZWQgaW4gcmFuZ2luZyBtb2RlIGFmdGVyIG5vIGVkIGZvdW5kIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9CQ0RSX1JBTkdJTkdfQUZURVJfTk9fRURfUkVTWU5DLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhLCBiY2RyX3JhbmdpbmdfYWZ0ZXJfbm9fZWRfcmVzeW5jKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzeW5jX2NvbnRyb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfbGFfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMgPSB7IC5uYW1lID0gImxhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jIiwgLmRlc2NyID0gIkxBIHJhbmdpbmcgYWZ0ZXIgZWQgcmVzeW5jICIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfTEFfUkFOR0lOR19BRlRFUl9FRF9SRVNZTkMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIGxhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzeW5jX2NvbnRyb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfYmNkcl9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYyA9IHsgLm5hbWUgPSAiYmNkcl9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYyIsIC5kZXNjciA9ICJCQ0RSIHJhbmdpbmcgYWZ0ZXIgZWQgcmVzeW5jIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9CQ0RSX1JBTkdJTkdfQUZURVJfRURfUkVTWU5DLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhLCBiY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzeW5jX2NvbnRyb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfbGFfcmVzeW5jX3BvbGFyaXR5ID0geyAubmFtZSA9ICJsYV9yZXN5bmNfcG9sYXJpdHkiLCAuZGVzY3IgPSAibGEgcmVzeW5jIHBvbGFyaXR5IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9SRVNZTkNfUE9MQVJJVFksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIGxhX3Jlc3luY19wb2xhcml0eSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3BvbGFyaXR5IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl90cnhfY2ZnX2JjZHJfcmVzeW5jX3BvbGFyaXR5ID0geyAubmFtZSA9ICJiY2RyX3Jlc3luY19wb2xhcml0eSIsIC5kZXNjciA9ICJCQ0RSIHJlc3luYyBwb2xhcml0eSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfQkNEUl9SRVNZTkNfUE9MQVJJVFksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIGJjZHJfcmVzeW5jX3BvbGFyaXR5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9sYXJpdHkgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfYmNkcl9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zID0geyAubmFtZSA9ICJiY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMiLCAuZGVzY3IgPSAiYmNkciByYW5naW5nIHJlc3luYyBjb25kaXRpb25zIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9CQ0RSX1JBTkdJTkdfUkVTWU5DX0NPTkRJVElPTlMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIGJjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfbGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyA9IHsgLm5hbWUgPSAibGFfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyIsIC5kZXNjciA9ICJsYSByYW5naW5nIHJlc3luYyBjb25kaXRpb25zIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9MQV9SQU5HSU5HX1JFU1lOQ19DT05ESVRJT05TLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhLCBsYV9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ19yeF9jb25maWd1cmF0aW9uID0geyAubmFtZSA9ICJyeF9jb25maWd1cmF0aW9uIiwgLmRlc2NyID0gIlJYIGNvbmZpZ3VyYXRpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1JYX0NPTkZJR1VSQVRJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIHJ4X2NvbmZpZ3VyYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF90cnhfcnhfY29uZmlndXJhdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ19yYW5naW5nX2NvbnRyb2xfc3RhZ2VzX2NvbmZpZ3VyYXRpb24gPSB7IC5uYW1lID0gInJhbmdpbmdfY29udHJvbF9zdGFnZXNfY29uZmlndXJhdGlvbiIsIC5kZXNjciA9ICJyYW5naW5nIGNvbnRyb2wgc3RhZ2VzIGNvbmZpZ3VyYXRpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1JBTkdJTkdfQ09OVFJPTF9TVEFHRVNfQ09ORklHVVJBVElPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgcmFuZ2luZ19jb250cm9sX3N0YWdlc19jb25maWd1cmF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmFuZ2luZ19jb250cm9sX2NvbmZpZ3VyYXRpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfZW5lcmd5X2RldGVjdCA9IHsgLm5hbWUgPSAiZW5lcmd5X2RldGVjdCIsIC5kZXNjciA9ICJFbmVyZ3kgRGV0ZWN0IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9FTkVSR1lfREVURUNULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhLCBlbmVyZ3lfZGV0ZWN0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdHJ4X2VuZXJneV9kZXRlY3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfZW5kX29mX2J1cnN0X2RhdGFfcGF0dGVybiA9IHsgLm5hbWUgPSAiZW5kX29mX2J1cnN0X2RhdGFfcGF0dGVybiIsIC5kZXNjciA9ICJlbmQgb2YgYnVyc3QgZGF0YSBwYXR0ZXJuICIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfRU5EX09GX0JVUlNUX0RBVEFfUEFUVEVSTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgZW5kX29mX2J1cnN0X2RhdGFfcGF0dGVybiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3luY19jb250cm9sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl90cnhfY2ZnX2VuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4gPSB7IC5uYW1lID0gImVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4iLCAuZGVzY3IgPSAiZW5kIG9mIGJ1cnN0IHJhbmdpbmcgcGF0dGVybiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfRU5EX09GX0JVUlNUX1JBTkdJTkdfUEFUVEVSTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgZW5kX29mX2J1cnN0X3JhbmdpbmdfcGF0dGVybiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3luY19jb250cm9sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl90cnhfY2ZnX3ByZWFtYmxlID0geyAubmFtZSA9ICJwcmVhbWJsZSIsIC5kZXNjciA9ICJQcmVhbWJsZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUFJFQU1CTEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIHByZWFtYmxlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdHJ4X3ByZWFtYmxlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl90cnhfY2ZnX2RlbGltaXRlciA9IHsgLm5hbWUgPSAiZGVsaW1pdGVyIiwgLmRlc2NyID0gIkRlbGltaXRlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfREVMSU1JVEVSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhLCBkZWxpbWl0ZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF90cnhfZGVsaW1pdGVyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl90cnhfY2ZnX2d1YXJkX2JpdHMgPSB7IC5uYW1lID0gImd1YXJkX2JpdHMiLCAuZGVzY3IgPSAiR3VhcmQgYml0cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfR1VBUkRfQklUUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgZ3VhcmRfYml0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfc2VyZGVzX2NvbmZpZ3VyYXRpb24gPSB7IC5uYW1lID0gInNlcmRlc19jb25maWd1cmF0aW9uIiwgLmRlc2NyID0gInNlcmRlcyBjb25maWd1cmF0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9TRVJERVNfQ09ORklHVVJBVElPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgc2VyZGVzX2NvbmZpZ3VyYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zZXJkZXNfY29uZmlndXJhdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ19wbG9fcmFuZ2luZyA9IHsgLm5hbWUgPSAicGxvX3JhbmdpbmciLCAuZGVzY3IgPSAiUExPIGZvciByYW5naW5nIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfR1BPTl9UUlhfQ0ZHX0lEX1BMT19SQU5HSU5HLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhLCBwbG9fcmFuZ2luZyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfcGxvX2RhdGEgPSB7IC5uYW1lID0gInBsb19kYXRhIiwgLmRlc2NyID0gIlBMTyBmb3IgZGF0YSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0dQT05fVFJYX0NGR19JRF9QTE9fREFUQSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgcGxvX2RhdGEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl90cnhfY2ZnX3Jzc2lfbm9ybWFsX2NvbmZpZyA9IHsgLm5hbWUgPSAicnNzaV9ub3JtYWxfY29uZmlnIiwgLmRlc2NyID0gInJzc2kgbm9ybWFsIGNvbmZpZyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUlNTSV9OT1JNQUxfQ09ORklHLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhLCByc3NpX25vcm1hbF9jb25maWcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX3Jzc2lfZ2VuZXJhbF9jb25maWd1cmF0aW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfZ3Bvbl90cnhfY2ZnX3JhbmdpbmdfcnNzaV9yZXN5bmNfY29udHJvbCA9IHsgLm5hbWUgPSAicmFuZ2luZ19yc3NpX3Jlc3luY19jb250cm9sIiwgLmRlc2NyID0gInJhbmdpbmcgcnNzaSByZXN5bmMgY29udHJvbCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9HUE9OX1RSWF9DRkdfSURfUkFOR0lOR19SU1NJX1JFU1lOQ19DT05UUk9MLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhLCByYW5naW5nX3Jzc2lfcmVzeW5jX2NvbnRyb2wpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yYW5naW5nX3Jzc2lfY29udHJvbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGdwb25fdHJ4X2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ190cmFuc2NlaXZlcl90eXBlLCAmcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfbGFfY29uZmlndXJhdGlvbiwgJnByb3BfZGVzY3JfZ3Bvbl90cnhfY2ZnX2JjZHIsICZwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ19sYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYywgJnByb3BfZGVzY3JfZ3Bvbl90cnhfY2ZnX2JjZHJfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMsICZwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ19sYV9yYW5naW5nX2FmdGVyX2VkX3Jlc3luYywgJnByb3BfZGVzY3JfZ3Bvbl90cnhfY2ZnX2JjZHJfcmFuZ2luZ19hZnRlcl9lZF9yZXN5bmMsICZwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ19sYV9yZXN5bmNfcG9sYXJpdHksICZwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ19iY2RyX3Jlc3luY19wb2xhcml0eSwgJnByb3BfZGVzY3JfZ3Bvbl90cnhfY2ZnX2JjZHJfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucywgJnByb3BfZGVzY3JfZ3Bvbl90cnhfY2ZnX2xhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMsICZwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ19yeF9jb25maWd1cmF0aW9uLCAmcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfcmFuZ2luZ19jb250cm9sX3N0YWdlc19jb25maWd1cmF0aW9uLCAmcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfZW5lcmd5X2RldGVjdCwgJnByb3BfZGVzY3JfZ3Bvbl90cnhfY2ZnX2VuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4sICZwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ19lbmRfb2ZfYnVyc3RfcmFuZ2luZ19wYXR0ZXJuLCAmcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfcHJlYW1ibGUsICZwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ19kZWxpbWl0ZXIsICZwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ19ndWFyZF9iaXRzLCAmcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfc2VyZGVzX2NvbmZpZ3VyYXRpb24sICZwcm9wX2Rlc2NyX2dwb25fdHJ4X2NmZ19wbG9fcmFuZ2luZywgJnByb3BfZGVzY3JfZ3Bvbl90cnhfY2ZnX3Bsb19kYXRhLCAmcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfcnNzaV9ub3JtYWxfY29uZmlnLCAmcHJvcF9kZXNjcl9ncG9uX3RyeF9jZmdfcmFuZ2luZ19yc3NpX3Jlc3luY19jb250cm9sIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJ0cmFuc2NlaXZlcl90eXBlIiwgLmRlc2NyID0gInRyYW5zY2VpdmVyIHR5cGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhLCB0cmFuc2NlaXZlcl90eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdHJ4X3R5cGUgfSwgeyAubmFtZSA9ICJsYV9jb25maWd1cmF0aW9uIiwgLmRlc2NyID0gIkxBIGNvbmZpZ3VyYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhLCBsYV9jb25maWd1cmF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbGFfcmVzeW5jX3BhdHRlcm5fY29uZmlndXJhdGlvbiB9LCB7IC5uYW1lID0gImJjZHIiLCAuZGVzY3IgPSAiQkNEUiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIGJjZHIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9iY2RyX3Jlc3luY19wYXR0ZXJuX2NvbmZpZ3VyYXRpb24gfSwgeyAubmFtZSA9ICJsYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYyIsIC5kZXNjciA9ICJMQSByYW5naW5nIGFmdGVyIG5vIGVkIHJlc3luYyAiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhLCBsYV9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3luY19jb250cm9sIH0sIHsgLm5hbWUgPSAiYmNkcl9yYW5naW5nX2FmdGVyX25vX2VkX3Jlc3luYyIsIC5kZXNjciA9ICJ1c2VkIGluIHJhbmdpbmcgbW9kZSBhZnRlciBubyBlZCBmb3VuZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIGJjZHJfcmFuZ2luZ19hZnRlcl9ub19lZF9yZXN5bmMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN5bmNfY29udHJvbCB9LCB7IC5uYW1lID0gImxhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jIiwgLmRlc2NyID0gIkxBIHJhbmdpbmcgYWZ0ZXIgZWQgcmVzeW5jICIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIGxhX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzeW5jX2NvbnRyb2wgfSwgeyAubmFtZSA9ICJiY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jIiwgLmRlc2NyID0gIkJDRFIgcmFuZ2luZyBhZnRlciBlZCByZXN5bmMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhLCBiY2RyX3JhbmdpbmdfYWZ0ZXJfZWRfcmVzeW5jKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzeW5jX2NvbnRyb2wgfSwgeyAubmFtZSA9ICJsYV9yZXN5bmNfcG9sYXJpdHkiLCAuZGVzY3IgPSAibGEgcmVzeW5jIHBvbGFyaXR5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgbGFfcmVzeW5jX3BvbGFyaXR5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9sYXJpdHkgfSwgeyAubmFtZSA9ICJiY2RyX3Jlc3luY19wb2xhcml0eSIsIC5kZXNjciA9ICJCQ0RSIHJlc3luYyBwb2xhcml0eSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIGJjZHJfcmVzeW5jX3BvbGFyaXR5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9sYXJpdHkgfSwgeyAubmFtZSA9ICJiY2RyX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMiLCAuZGVzY3IgPSAiYmNkciByYW5naW5nIHJlc3luYyBjb25kaXRpb25zIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgYmNkcl9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmFuZ2luZ19yZXN5bmNfY29uZGl0aW9ucyB9LCB7IC5uYW1lID0gImxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMiLCAuZGVzY3IgPSAibGEgcmFuZ2luZyByZXN5bmMgY29uZGl0aW9ucyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIGxhX3JhbmdpbmdfcmVzeW5jX2NvbmRpdGlvbnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yYW5naW5nX3Jlc3luY19jb25kaXRpb25zIH0sIHsgLm5hbWUgPSAicnhfY29uZmlndXJhdGlvbiIsIC5kZXNjciA9ICJSWCBjb25maWd1cmF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgcnhfY29uZmlndXJhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3RyeF9yeF9jb25maWd1cmF0aW9uIH0sIHsgLm5hbWUgPSAicmFuZ2luZ19jb250cm9sX3N0YWdlc19jb25maWd1cmF0aW9uIiwgLmRlc2NyID0gInJhbmdpbmcgY29udHJvbCBzdGFnZXMgY29uZmlndXJhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIHJhbmdpbmdfY29udHJvbF9zdGFnZXNfY29uZmlndXJhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JhbmdpbmdfY29udHJvbF9jb25maWd1cmF0aW9uIH0sIHsgLm5hbWUgPSAiZW5lcmd5X2RldGVjdCIsIC5kZXNjciA9ICJFbmVyZ3kgRGV0ZWN0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgZW5lcmd5X2RldGVjdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3RyeF9lbmVyZ3lfZGV0ZWN0IH0sIHsgLm5hbWUgPSAiZW5kX29mX2J1cnN0X2RhdGFfcGF0dGVybiIsIC5kZXNjciA9ICJlbmQgb2YgYnVyc3QgZGF0YSBwYXR0ZXJuICIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIGVuZF9vZl9idXJzdF9kYXRhX3BhdHRlcm4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN5bmNfY29udHJvbCB9LCB7IC5uYW1lID0gImVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4iLCAuZGVzY3IgPSAiZW5kIG9mIGJ1cnN0IHJhbmdpbmcgcGF0dGVybiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIGVuZF9vZl9idXJzdF9yYW5naW5nX3BhdHRlcm4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN5bmNfY29udHJvbCB9LCB7IC5uYW1lID0gInByZWFtYmxlIiwgLmRlc2NyID0gIlByZWFtYmxlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgcHJlYW1ibGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF90cnhfcHJlYW1ibGUgfSwgeyAubmFtZSA9ICJkZWxpbWl0ZXIiLCAuZGVzY3IgPSAiRGVsaW1pdGVyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgZGVsaW1pdGVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdHJ4X2RlbGltaXRlciB9LCB7IC5uYW1lID0gImd1YXJkX2JpdHMiLCAuZGVzY3IgPSAiR3VhcmQgYml0cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIGd1YXJkX2JpdHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAic2VyZGVzX2NvbmZpZ3VyYXRpb24iLCAuZGVzY3IgPSAic2VyZGVzIGNvbmZpZ3VyYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhLCBzZXJkZXNfY29uZmlndXJhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3NlcmRlc19jb25maWd1cmF0aW9uIH0sIHsgLm5hbWUgPSAicGxvX3JhbmdpbmciLCAuZGVzY3IgPSAiUExPIGZvciByYW5naW5nIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgcGxvX3JhbmdpbmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAicGxvX2RhdGEiLCAuZGVzY3IgPSAiUExPIGZvciBkYXRhIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgcGxvX2RhdGEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAicnNzaV9ub3JtYWxfY29uZmlnIiwgLmRlc2NyID0gInJzc2kgbm9ybWFsIGNvbmZpZyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnX2RhdGEsIHJzc2lfbm9ybWFsX2NvbmZpZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fcnNzaV9nZW5lcmFsX2NvbmZpZ3VyYXRpb24gfSwgeyAubmFtZSA9ICJyYW5naW5nX3Jzc2lfcmVzeW5jX2NvbnRyb2wiLCAuZGVzY3IgPSAicmFuZ2luZyByc3NpIHJlc3luYyBjb250cm9sIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSwgcmFuZ2luZ19yc3NpX3Jlc3luY19jb250cm9sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmFuZ2luZ19yc3NpX2NvbnRyb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhIiwgLmRlc2NyID0gImNmZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ncG9uX3RyeF9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qID09PT0gT2JqZWN0OiBsb2dfZW50cnkgPT09PSAqLworCisvKiBHcm91cDogbG9nX2VudHJ5IC0ga2V5ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfbG9nX2VudHJ5X2tleV9sb2dfaWQgPSB7IC5uYW1lID0gImxvZ19pZCIsIC5kZXNjciA9ICJsb2cgaWQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9MT0dfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X2tleSwgbG9nX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2xvZ19lbnRyeV9rZXlfcmVzZXJ2ZWQgPSB7IC5uYW1lID0gInJlc2VydmVkIiwgLmRlc2NyID0gInJlc2VydmVkIiwgLmFjY2VzcyA9IDAsIC5wcm9wZXJ0eSA9IEJDTU9MVF9MT0dfRU5UUllfS0VZX0lEX1JFU0VSVkVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9rZXksIHJlc2VydmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfbG9nX2VudHJ5X2tleV9uYW1lID0geyAubmFtZSA9ICJuYW1lIiwgLmRlc2NyID0gIm5hbWUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTE9HX0VOVFJZX0tFWV9JRF9OQU1FLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9rZXksIG5hbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdHJfMTAwIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgbG9nX2VudHJ5X2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2xvZ19lbnRyeV9rZXlfbG9nX2lkLCAmcHJvcF9kZXNjcl9sb2dfZW50cnlfa2V5X3Jlc2VydmVkLCAmcHJvcF9kZXNjcl9sb2dfZW50cnlfa2V5X25hbWUgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ19lbnRyeV9rZXlfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibG9nX2lkIiwgLmRlc2NyID0gImxvZyBpZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X2tleSwgbG9nX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gInJlc2VydmVkIiwgLmRlc2NyID0gInJlc2VydmVkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfa2V5LCByZXNlcnZlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gIm5hbWUiLCAuZGVzY3IgPSAibmFtZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X2tleSwgbmFtZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0cl8xMDAgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZW50cnlfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfbG9nX2VudHJ5X2tleSIsIC5kZXNjciA9ICJrZXkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nX2VudHJ5X2tleSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZW50cnlfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2xvZ19lbnRyeV9rZXlfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogbG9nX2VudHJ5IC0gY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfbG9nX2VudHJ5X2NmZ19kZWZhdWx0X2xvZ19sZXZlbCA9IHsgLm5hbWUgPSAiZGVmYXVsdF9sb2dfbGV2ZWwiLCAuZGVzY3IgPSAiZGVmYXVsdCBsb2cgbGV2ZWwiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0RFRkFVTFRfTE9HX0xFVkVMLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9jZmdfZGF0YSwgZGVmYXVsdF9sb2dfbGV2ZWwpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfbGV2ZWwgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9sb2dfZW50cnlfY2ZnX2RlZmF1bHRfbG9nX3R5cGUgPSB7IC5uYW1lID0gImRlZmF1bHRfbG9nX3R5cGUiLCAuZGVzY3IgPSAiZGVmYXVsdCBsb2cgdHlwZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfREVGQVVMVF9MT0dfVFlQRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGEsIGRlZmF1bHRfbG9nX3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfdHlwZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2xvZ19lbnRyeV9jZmdfbG9nX2xldmVsX3ByaW50ID0geyAubmFtZSA9ICJsb2dfbGV2ZWxfcHJpbnQiLCAuZGVzY3IgPSAibG9nIGxldmVsIHByaW50IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0xPR19FTlRSWV9DRkdfSURfTE9HX0xFVkVMX1BSSU5ULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9jZmdfZGF0YSwgbG9nX2xldmVsX3ByaW50KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbG9nX2xldmVsIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfbG9nX2VudHJ5X2NmZ19sb2dfbGV2ZWxfc2F2ZSA9IHsgLm5hbWUgPSAibG9nX2xldmVsX3NhdmUiLCAuZGVzY3IgPSAibG9nIGxldmVsIHNhdmUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfTEVWRUxfU0FWRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGEsIGxvZ19sZXZlbF9zYXZlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbG9nX2xldmVsIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfbG9nX2VudHJ5X2NmZ19sb2dfdHlwZSA9IHsgLm5hbWUgPSAibG9nX3R5cGUiLCAuZGVzY3IgPSAibG9nIHR5cGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfVFlQRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGEsIGxvZ190eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbG9nX3R5cGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9sb2dfZW50cnlfY2ZnX2xvZ19zdHlsZSA9IHsgLm5hbWUgPSAibG9nX3N0eWxlIiwgLmRlc2NyID0gImxvZ19zdHlsZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9MT0dfRU5UUllfQ0ZHX0lEX0xPR19TVFlMRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGEsIGxvZ19zdHlsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2xvZ19zdHlsZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2xvZ19lbnRyeV9jZmdfbG9nX25hbWUgPSB7IC5uYW1lID0gImxvZ19uYW1lIiwgLmRlc2NyID0gImxvZyBuYW1lIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfTE9HX0VOVFJZX0NGR19JRF9MT0dfTkFNRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGEsIGxvZ19uYW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RyXzEwMCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGxvZ19lbnRyeV9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9sb2dfZW50cnlfY2ZnX2RlZmF1bHRfbG9nX2xldmVsLCAmcHJvcF9kZXNjcl9sb2dfZW50cnlfY2ZnX2RlZmF1bHRfbG9nX3R5cGUsICZwcm9wX2Rlc2NyX2xvZ19lbnRyeV9jZmdfbG9nX2xldmVsX3ByaW50LCAmcHJvcF9kZXNjcl9sb2dfZW50cnlfY2ZnX2xvZ19sZXZlbF9zYXZlLCAmcHJvcF9kZXNjcl9sb2dfZW50cnlfY2ZnX2xvZ190eXBlLCAmcHJvcF9kZXNjcl9sb2dfZW50cnlfY2ZnX2xvZ19zdHlsZSwgJnByb3BfZGVzY3JfbG9nX2VudHJ5X2NmZ19sb2dfbmFtZSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbG9nX2VudHJ5X2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImRlZmF1bHRfbG9nX2xldmVsIiwgLmRlc2NyID0gImRlZmF1bHQgbG9nIGxldmVsIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGEsIGRlZmF1bHRfbG9nX2xldmVsKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbG9nX2xldmVsIH0sIHsgLm5hbWUgPSAiZGVmYXVsdF9sb2dfdHlwZSIsIC5kZXNjciA9ICJkZWZhdWx0IGxvZyB0eXBlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGEsIGRlZmF1bHRfbG9nX3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfdHlwZSB9LCB7IC5uYW1lID0gImxvZ19sZXZlbF9wcmludCIsIC5kZXNjciA9ICJsb2cgbGV2ZWwgcHJpbnQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9jZmdfZGF0YSwgbG9nX2xldmVsX3ByaW50KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbG9nX2xldmVsIH0sIHsgLm5hbWUgPSAibG9nX2xldmVsX3NhdmUiLCAuZGVzY3IgPSAibG9nIGxldmVsIHNhdmUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9jZmdfZGF0YSwgbG9nX2xldmVsX3NhdmUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfbGV2ZWwgfSwgeyAubmFtZSA9ICJsb2dfdHlwZSIsIC5kZXNjciA9ICJsb2cgdHlwZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X2NmZ19kYXRhLCBsb2dfdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2xvZ190eXBlIH0sIHsgLm5hbWUgPSAibG9nX3N0eWxlIiwgLmRlc2NyID0gImxvZ19zdHlsZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X2NmZ19kYXRhLCBsb2dfc3R5bGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfc3R5bGUgfSwgeyAubmFtZSA9ICJsb2dfbmFtZSIsIC5kZXNjciA9ICJsb2cgbmFtZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X2NmZ19kYXRhLCBsb2dfbmFtZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0cl8xMDAgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiY2ZnIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2xvZ19lbnRyeV9jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfbG9nX2VudHJ5X2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGxvZ19lbnRyeSAtIHN0YXQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9sb2dfZW50cnlfc3RhdF9tc2dfY291bnQgPSB7IC5uYW1lID0gIm1zZ19jb3VudCIsIC5kZXNjciA9ICJtc2cgY291bnQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTE9HX0VOVFJZX1NUQVRfSURfTVNHX0NPVU5ULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2RhdGEsIG1zZ19jb3VudCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl91MzJfNiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2xvZ19lbnRyeV9zdGF0X2xvc3RfbXNnX2NvdW50ID0geyAubmFtZSA9ICJsb3N0X21zZ19jb3VudCIsIC5kZXNjciA9ICJsb3N0IG1zZyBjb3VudCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9MT0dfRU5UUllfU1RBVF9JRF9MT1NUX01TR19DT1VOVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfc3RhdF9kYXRhLCBsb3N0X21zZ19jb3VudCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBsb2dfZW50cnlfc3RhdF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2xvZ19lbnRyeV9zdGF0X21zZ19jb3VudCwgJnByb3BfZGVzY3JfbG9nX2VudHJ5X3N0YXRfbG9zdF9tc2dfY291bnQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibXNnX2NvdW50IiwgLmRlc2NyID0gIm1zZyBjb3VudCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X3N0YXRfZGF0YSwgbXNnX2NvdW50KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX3UzMl82IH0sIHsgLm5hbWUgPSAibG9zdF9tc2dfY291bnQiLCAuZGVzY3IgPSAibG9zdCBtc2cgY291bnQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2RhdGEsIGxvc3RfbXNnX2NvdW50KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9sb2dfZW50cnlfc3RhdF9kYXRhIiwgLmRlc2NyID0gInN0YXQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nX2VudHJ5X3N0YXRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZW50cnlfc3RhdF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogbG9nX2VudHJ5IC0gc3RhdF9jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9sb2dfZW50cnlfc3RhdF9jZmdfY2ZnID0geyAubmFtZSA9ICJjZmciLCAuZGVzY3IgPSAiU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0xPR19FTlRSWV9TVEFUX0NGR19JRF9DRkcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgbG9nX2VudHJ5X3N0YXRfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfbG9nX2VudHJ5X3N0YXRfY2ZnX2NmZyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfZGF0YSIsIC5kZXNjciA9ICJTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBsb2dfZW50cnkgLSBzdGF0X2FsYXJtX3JhaXNlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9zdGF0ID0geyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9MT0dfRU5UUllfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkX3N0YXQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2lkIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBsb2dfZW50cnkgLSBzdGF0X2FsYXJtX2NsZWFyZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0xPR19FTlRSWV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZW50cnlfc3RhdF9pZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGxvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX3N0YXQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbG9nX2VudHJ5X3N0YXRfaWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGxvZ19lbnRyeSAtIGF1dG9fY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfbG9nX2VudHJ5X2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCA9IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTE9HX0VOVFJZX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9jbGVhcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfbG9nX2VudHJ5X2F1dG9fY2ZnX3N0YXRfYWxhcm1fcmFpc2VkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTE9HX0VOVFJZX0FVVE9fQ0ZHX0lEX1NUQVRfQUxBUk1fUkFJU0VELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX3JhaXNlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGxvZ19lbnRyeV9hdXRvX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2xvZ19lbnRyeV9hdXRvX2NmZ19zdGF0X2FsYXJtX2NsZWFyZWQsICZwcm9wX2Rlc2NyX2xvZ19lbnRyeV9hdXRvX2NmZ19zdGF0X2FsYXJtX3JhaXNlZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX2NsZWFyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX3JhaXNlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2RhdGEiLCAuZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogPT09PSBPYmplY3Q6IGxvZ2dlciA9PT09ICovCisKKy8qIEdyb3VwOiBsb2dnZXIgLSBrZXkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9sb2dnZXJfa2V5X3Jlc2VydmVkID0geyAubmFtZSA9ICJyZXNlcnZlZCIsIC5kZXNjciA9ICJyZXNlcnZlZCIsIC5hY2Nlc3MgPSAwLCAucHJvcGVydHkgPSBCQ01PTFRfTE9HR0VSX0tFWV9JRF9SRVNFUlZFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dnZXJfa2V5LCByZXNlcnZlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9sb2dnZXJfa2V5X2ZpbGVfaWQgPSB7IC5uYW1lID0gImZpbGVfaWQiLCAuZGVzY3IgPSAic2hvdWxkIGJlIDAiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTE9HR0VSX0tFWV9JRF9GSUxFX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9rZXksIGZpbGVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZmlsZV9pZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGxvZ2dlcl9rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9sb2dnZXJfa2V5X3Jlc2VydmVkLCAmcHJvcF9kZXNjcl9sb2dnZXJfa2V5X2ZpbGVfaWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ2dlcl9rZXlfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicmVzZXJ2ZWQiLCAuZGVzY3IgPSAicmVzZXJ2ZWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9rZXksIHJlc2VydmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImZpbGVfaWQiLCAuZGVzY3IgPSAic2hvdWxkIGJlIDAiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9rZXksIGZpbGVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfZmlsZV9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ2dlcl9rZXkgPSB7IC5uYW1lID0gImJjbW9sdF9sb2dnZXJfa2V5IiwgLmRlc2NyID0gImtleSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dnZXJfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2xvZ2dlcl9rZXlfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfbG9nZ2VyX2tleV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBsb2dnZXIgLSBjZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9sb2dnZXJfY2ZnX2J1ZmZlciA9IHsgLm5hbWUgPSAiYnVmZmVyIiwgLmRlc2NyID0gIkNvbnRhaW5zIFwibmV4dFwiIGxvZyByZWNvcmRzIHJlYWQgYnkgXCJiY21vbHRfY2ZnX2dldCgpIEFQSSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX0xPR0dFUl9DRkdfSURfQlVGRkVSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9jZmdfZGF0YSwgYnVmZmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbG9nX2J1ZmZlciB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2xvZ2dlcl9jZmdfd3JhcF9hcm91bmQgPSB7IC5uYW1lID0gIndyYXBfYXJvdW5kIiwgLmRlc2NyID0gIkxvZyBmaWxlIHdyYXAtYXJvdW5kIG9wdGlvbi4gVFJVRT13cmFwIGFyb3VuZCB3aGVuIGZ1bGwuIEZBTFNFPXN0b3Agd2hlbiBmdWxsIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0xPR0dFUl9DRkdfSURfV1JBUF9BUk9VTkQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nZ2VyX2NmZ19kYXRhLCB3cmFwX2Fyb3VuZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2xvZ2dlcl9jZmdfY2xlYXJfYWZ0ZXJfcmVhZCA9IHsgLm5hbWUgPSAiY2xlYXJfYWZ0ZXJfcmVhZCIsIC5kZXNjciA9ICJDbGVhciBsb2cgYWZ0ZXIgbGFzdCByZWNvcmQgaGFzIGJlZW4gcmVhZCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9MT0dHRVJfQ0ZHX0lEX0NMRUFSX0FGVEVSX1JFQUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nZ2VyX2NmZ19kYXRhLCBjbGVhcl9hZnRlcl9yZWFkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfbG9nZ2VyX2NmZ19lbmFibGVfbG9nID0geyAubmFtZSA9ICJlbmFibGVfbG9nIiwgLmRlc2NyID0gIkVuYWJsZSBsb2dnZXIiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTE9HR0VSX0NGR19JRF9FTkFCTEVfTE9HLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9jZmdfZGF0YSwgZW5hYmxlX2xvZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2xvZ2dlcl9jZmdfbG9nX25hbWVzID0geyAubmFtZSA9ICJsb2dfbmFtZXMiLCAuZGVzY3IgPSAibG9nX25hbWVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfTE9HR0VSX0NGR19JRF9MT0dfTkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nZ2VyX2NmZ19kYXRhLCBsb2dfbmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdHJfMTAwMCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGxvZ2dlcl9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9sb2dnZXJfY2ZnX2J1ZmZlciwgJnByb3BfZGVzY3JfbG9nZ2VyX2NmZ193cmFwX2Fyb3VuZCwgJnByb3BfZGVzY3JfbG9nZ2VyX2NmZ19jbGVhcl9hZnRlcl9yZWFkLCAmcHJvcF9kZXNjcl9sb2dnZXJfY2ZnX2VuYWJsZV9sb2csICZwcm9wX2Rlc2NyX2xvZ2dlcl9jZmdfbG9nX25hbWVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dnZXJfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYnVmZmVyIiwgLmRlc2NyID0gIkNvbnRhaW5zIFwibmV4dFwiIGxvZyByZWNvcmRzIHJlYWQgYnkgXCJiY21vbHRfY2ZnX2dldCgpIEFQSSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nZ2VyX2NmZ19kYXRhLCBidWZmZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9sb2dfYnVmZmVyIH0sIHsgLm5hbWUgPSAid3JhcF9hcm91bmQiLCAuZGVzY3IgPSAiTG9nIGZpbGUgd3JhcC1hcm91bmQgb3B0aW9uLiBUUlVFPXdyYXAgYXJvdW5kIHdoZW4gZnVsbC4gRkFMU0U9c3RvcCB3aGVuIGZ1bGwiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9jZmdfZGF0YSwgd3JhcF9hcm91bmQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJjbGVhcl9hZnRlcl9yZWFkIiwgLmRlc2NyID0gIkNsZWFyIGxvZyBhZnRlciBsYXN0IHJlY29yZCBoYXMgYmVlbiByZWFkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dnZXJfY2ZnX2RhdGEsIGNsZWFyX2FmdGVyX3JlYWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJlbmFibGVfbG9nIiwgLmRlc2NyID0gIkVuYWJsZSBsb2dnZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9jZmdfZGF0YSwgZW5hYmxlX2xvZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImxvZ19uYW1lcyIsIC5kZXNjciA9ICJsb2dfbmFtZXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9jZmdfZGF0YSwgbG9nX25hbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RyXzEwMDAgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dnZXJfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9sb2dnZXJfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiY2ZnIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X2xvZ2dlcl9jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9sb2dnZXJfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfbG9nZ2VyX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IGxvZ2dlciAtIHN0YXQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9sb2dnZXJfc3RhdF9saW5lc19pbl9sb2cgPSB7IC5uYW1lID0gImxpbmVzX2luX2xvZyIsIC5kZXNjciA9ICJsaW5lcyBpbiBsb2ciLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTE9HR0VSX1NUQVRfSURfTElORVNfSU5fTE9HLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9zdGF0X2RhdGEsIGxpbmVzX2luX2xvZyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBsb2dnZXJfc3RhdF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2xvZ2dlcl9zdGF0X2xpbmVzX2luX2xvZyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbG9nZ2VyX3N0YXRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJsaW5lc19pbl9sb2ciLCAuZGVzY3IgPSAibGluZXMgaW4gbG9nIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dnZXJfc3RhdF9kYXRhLCBsaW5lc19pbl9sb2cpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbG9nZ2VyX3N0YXRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2xvZ2dlcl9zdGF0X2RhdGEiLCAuZGVzY3IgPSAic3RhdCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dnZXJfc3RhdF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X2xvZ2dlcl9zdGF0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfbG9nZ2VyX3N0YXRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBsb2dnZXIgLSBjbGVhcl9sb2cgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBsb2dnZXJfY2xlYXJfbG9nX3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IGxvZ2dlciAtIHN0YXRfY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfbG9nZ2VyX3N0YXRfY2ZnX2NmZyA9IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9MT0dHRVJfU1RBVF9DRkdfSURfQ0ZHLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19kYXRhLCBjZmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGxvZ2dlcl9zdGF0X2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2xvZ2dlcl9zdGF0X2NmZ19jZmcgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImNmZyIsIC5kZXNjciA9ICJTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19kYXRhLCBjZmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiU3RhdGlzdGljIENvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfbG9nZ2VyX3N0YXRfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogbG9nZ2VyIC0gc3RhdF9hbGFybV9yYWlzZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfc3RhdCA9IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTE9HR0VSX1NUQVRfQUxBUk1fUkFJU0VEX0lEX1NUQVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9sb2dnZXJfc3RhdF9pZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIGxvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZF9zdGF0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9sb2dnZXJfc3RhdF9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogbG9nZ2VyIC0gc3RhdF9hbGFybV9jbGVhcmVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9zdGF0ID0geyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9MT0dHRVJfU1RBVF9BTEFSTV9DTEVBUkVEX0lEX1NUQVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbG9nZ2VyX3N0YXRfaWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBsb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9zdGF0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2xvZ2dlcl9zdGF0X2lkIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhIiwgLmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBpcyBubyBsb25nZXIgbWV0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBsb2dnZXIgLSBhdXRvX2NmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2xvZ2dlcl9hdXRvX2NmZ19zdGF0X2FsYXJtX2NsZWFyZWQgPSB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9jbGVhcmVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0xPR0dFUl9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fY2xlYXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX2xvZ2dlcl9hdXRvX2NmZ19zdGF0X2FsYXJtX3JhaXNlZCA9IHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fcmFpc2VkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX0xPR0dFUl9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dnZXJfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9yYWlzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBsb2dnZXJfYXV0b19jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9sb2dnZXJfYXV0b19jZmdfc3RhdF9hbGFybV9jbGVhcmVkLCAmcHJvcF9kZXNjcl9sb2dnZXJfYXV0b19jZmdfc3RhdF9hbGFybV9yYWlzZWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9jbGVhcmVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dnZXJfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9jbGVhcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fcmFpc2VkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dnZXJfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9yYWlzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dnZXJfYXV0b19jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X2xvZ2dlcl9hdXRvX2NmZ19kYXRhIiwgLmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dnZXJfYXV0b19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9sb2dnZXJfYXV0b19jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9sb2dnZXJfYXV0b19jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qID09PT0gT2JqZWN0OiBubmkgPT09PSAqLworCisvKiBHcm91cDogbm5pIC0ga2V5ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX2tleV9wb25fbmkgPSB7IC5uYW1lID0gInBvbl9uaSIsIC5kZXNjciA9ICJQT04gTkkiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX0tFWV9JRF9QT05fTkksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX2tleSwgcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1Igbm5pX2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX25uaV9rZXlfcG9uX25pIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBvbl9uaSIsIC5kZXNjciA9ICJQT04gTkkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X25uaV9rZXkgPSB7IC5uYW1lID0gImJjbW9sdF9ubmlfa2V5IiwgLmRlc2NyID0gImtleSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X25uaV9rZXlfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfbm5pX2tleV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBubmkgLSBjZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfY2ZnX3JlbW90ZV9sb29wYmFjayA9IHsgLm5hbWUgPSAicmVtb3RlX2xvb3BiYWNrIiwgLmRlc2NyID0gIkluY29taW5nIHBhY2tldHMgY29taW5nIGZyb20gdGhlIFBPTiAodXBzdHJlYW0pIGFuZCBnb2luZyBiYWNrIHRvIHRoZSBQT04gKERvd25zdHJlYW0pICIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfQ0ZHX0lEX1JFTU9URV9MT09QQkFDSywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfY2ZnX2RhdGEsIHJlbW90ZV9sb29wYmFjayksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfY2ZnX2xpbmVfbG9vcGJhY2sgPSB7IC5uYW1lID0gImxpbmVfbG9vcGJhY2siLCAuZGVzY3IgPSAiSW5jb21pbmcgcGFja2V0cyBjb21pbmcgZnJvbSB0aGUgTk5JIGludGVyZmFjZSB0byB0aGUgUE0gYW5kIGdvaW5nIGJhY2sgdG93YXJkcyB0aGUgTk5JIGludGVyZmFjZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfQ0ZHX0lEX0xJTkVfTE9PUEJBQ0ssIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX2NmZ19kYXRhLCBsaW5lX2xvb3BiYWNrKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY29udHJvbF9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9jZmdfbWFjX2FkZHJlc3MgPSB7IC5uYW1lID0gIm1hY19hZGRyZXNzIiwgLmRlc2NyID0gIk1hYyBhZGRyZXNzIHRvIGJlIHVzZWQgZm9yIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfQ0ZHX0lEX01BQ19BRERSRVNTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9jZmdfZGF0YSwgbWFjX2FkZHJlc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX21hY19hZGRyZXNzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX2NmZ19ubmlfc3RhdHVzID0geyAubmFtZSA9ICJubmlfc3RhdHVzIiwgLmRlc2NyID0gIk5OSSBzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfQ0ZHX0lEX05OSV9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX2NmZ19kYXRhLCBubmlfc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbm5pX2xpbmtfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX2NmZ19ubmlfYmFja3VwX3N0YXR1cyA9IHsgLm5hbWUgPSAibm5pX2JhY2t1cF9zdGF0dXMiLCAuZGVzY3IgPSAiU3RhdHVzIG9mIHRoZSBiYWNrdXAgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9DRkdfSURfTk5JX0JBQ0tVUF9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX2NmZ19kYXRhLCBubmlfYmFja3VwX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X25uaV9saW5rX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9jZmdfYWN0aXZlX25uaSA9IHsgLm5hbWUgPSAiYWN0aXZlX25uaSIsIC5kZXNjciA9ICJXaGljaCBOTkkgaXMgY3VycmVudGx5IGFjdGl2ZS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX0NGR19JRF9BQ1RJVkVfTk5JLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9jZmdfZGF0YSwgYWN0aXZlX25uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X25uaV9jb25uZWN0aW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX2NmZ19ubmlfc3RhdHVzX3BvbGxpbmdfaW50ZXJ2YWxfbXMgPSB7IC5uYW1lID0gIm5uaV9zdGF0dXNfcG9sbGluZ19pbnRlcnZhbF9tcyIsIC5kZXNjciA9ICJIb3cgb2Z0ZW4gdG8gY2hlY2sgdGhlIHN0YXR1cyBvZiB0aGUgcHJpbWFyeSBhbmQgYmFja3VwIE5OSXMgKHVuaXRzOiBtcykuIFplcm8gKDApIGRpc2FibGVzIHN0YXR1cyBwb2xsaW5nLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfQ0ZHX0lEX05OSV9TVEFUVVNfUE9MTElOR19JTlRFUlZBTF9NUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfY2ZnX2RhdGEsIG5uaV9zdGF0dXNfcG9sbGluZ19pbnRlcnZhbF9tcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfY2ZnX2F1dG9zd2l0Y2ggPSB7IC5uYW1lID0gImF1dG9zd2l0Y2giLCAuZGVzY3IgPSAiU2hvdWxkIGZpcm13YXJlIGF1dG9tYXRpY2FsbHkgc3dpdGNoIGJldHdlZW4gcHJpbWFyeS9iYWNrdXAgTk5JcyB3aGVuIExvc3Mgb2YgTGluayBpcyBkZXRlY3RlZD8iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX0NGR19JRF9BVVRPU1dJVENILCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9jZmdfZGF0YSwgYXV0b3N3aXRjaCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9jZmdfZmxvd19jb250cm9sID0geyAubmFtZSA9ICJmbG93X2NvbnRyb2wiLCAuZGVzY3IgPSAiTk5JIEZsb3cgY29udHJvbC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX0NGR19JRF9GTE9XX0NPTlRST0wsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX2NmZ19kYXRhLCBmbG93X2NvbnRyb2wpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb250cm9sX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1Igbm5pX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX25uaV9jZmdfcmVtb3RlX2xvb3BiYWNrLCAmcHJvcF9kZXNjcl9ubmlfY2ZnX2xpbmVfbG9vcGJhY2ssICZwcm9wX2Rlc2NyX25uaV9jZmdfbWFjX2FkZHJlc3MsICZwcm9wX2Rlc2NyX25uaV9jZmdfbm5pX3N0YXR1cywgJnByb3BfZGVzY3Jfbm5pX2NmZ19ubmlfYmFja3VwX3N0YXR1cywgJnByb3BfZGVzY3Jfbm5pX2NmZ19hY3RpdmVfbm5pLCAmcHJvcF9kZXNjcl9ubmlfY2ZnX25uaV9zdGF0dXNfcG9sbGluZ19pbnRlcnZhbF9tcywgJnByb3BfZGVzY3Jfbm5pX2NmZ19hdXRvc3dpdGNoLCAmcHJvcF9kZXNjcl9ubmlfY2ZnX2Zsb3dfY29udHJvbCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbm5pX2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJlbW90ZV9sb29wYmFjayIsIC5kZXNjciA9ICJJbmNvbWluZyBwYWNrZXRzIGNvbWluZyBmcm9tIHRoZSBQT04gKHVwc3RyZWFtKSBhbmQgZ29pbmcgYmFjayB0byB0aGUgUE9OIChEb3duc3RyZWFtKSAiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9jZmdfZGF0YSwgcmVtb3RlX2xvb3BiYWNrKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY29udHJvbF9zdGF0ZSB9LCB7IC5uYW1lID0gImxpbmVfbG9vcGJhY2siLCAuZGVzY3IgPSAiSW5jb21pbmcgcGFja2V0cyBjb21pbmcgZnJvbSB0aGUgTk5JIGludGVyZmFjZSB0byB0aGUgUE0gYW5kIGdvaW5nIGJhY2sgdG93YXJkcyB0aGUgTk5JIGludGVyZmFjZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX2NmZ19kYXRhLCBsaW5lX2xvb3BiYWNrKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY29udHJvbF9zdGF0ZSB9LCB7IC5uYW1lID0gIm1hY19hZGRyZXNzIiwgLmRlc2NyID0gIk1hYyBhZGRyZXNzIHRvIGJlIHVzZWQgZm9yIHRoaXMgTk5JLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX2NmZ19kYXRhLCBtYWNfYWRkcmVzcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfbWFjX2FkZHJlc3MgfSwgeyAubmFtZSA9ICJubmlfc3RhdHVzIiwgLmRlc2NyID0gIk5OSSBzdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9jZmdfZGF0YSwgbm5pX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X25uaV9saW5rX3N0YXR1cyB9LCB7IC5uYW1lID0gIm5uaV9iYWNrdXBfc3RhdHVzIiwgLmRlc2NyID0gIlN0YXR1cyBvZiB0aGUgYmFja3VwIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9jZmdfZGF0YSwgbm5pX2JhY2t1cF9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfbGlua19zdGF0dXMgfSwgeyAubmFtZSA9ICJhY3RpdmVfbm5pIiwgLmRlc2NyID0gIldoaWNoIE5OSSBpcyBjdXJyZW50bHkgYWN0aXZlLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX2NmZ19kYXRhLCBhY3RpdmVfbm5pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbm5pX2Nvbm5lY3Rpb24gfSwgeyAubmFtZSA9ICJubmlfc3RhdHVzX3BvbGxpbmdfaW50ZXJ2YWxfbXMiLCAuZGVzY3IgPSAiSG93IG9mdGVuIHRvIGNoZWNrIHRoZSBzdGF0dXMgb2YgdGhlIHByaW1hcnkgYW5kIGJhY2t1cCBOTklzICh1bml0czogbXMpLiBaZXJvICgwKSBkaXNhYmxlcyBzdGF0dXMgcG9sbGluZy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9jZmdfZGF0YSwgbm5pX3N0YXR1c19wb2xsaW5nX2ludGVydmFsX21zKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImF1dG9zd2l0Y2giLCAuZGVzY3IgPSAiU2hvdWxkIGZpcm13YXJlIGF1dG9tYXRpY2FsbHkgc3dpdGNoIGJldHdlZW4gcHJpbWFyeS9iYWNrdXAgTk5JcyB3aGVuIExvc3Mgb2YgTGluayBpcyBkZXRlY3RlZD8iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9jZmdfZGF0YSwgYXV0b3N3aXRjaCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImZsb3dfY29udHJvbCIsIC5kZXNjciA9ICJOTkkgRmxvdyBjb250cm9sLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX2NmZ19kYXRhLCBmbG93X2NvbnRyb2wpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb250cm9sX3N0YXRlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbm5pX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfbm5pX2NmZ19kYXRhIiwgLmRlc2NyID0gImNmZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfbm5pX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X25uaV9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBubmkgLSBzdGF0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfZnJhbWVzXzY0ID0geyAubmFtZSA9ICJyeF9mcmFtZXNfNjQiLCAuZGVzY3IgPSAiVGhlIGNvdW50IG9mIFJYIDY0IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfNjQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfZnJhbWVzXzY0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X2ZyYW1lc182NV8xMjcgPSB7IC5uYW1lID0gInJ4X2ZyYW1lc182NV8xMjciLCAuZGVzY3IgPSAiVGhlIGNvdW50IG9mIFJYIDY1IHRvIDEyNyBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzY1XzEyNywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9mcmFtZXNfNjVfMTI3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X2ZyYW1lc18xMjhfMjU1ID0geyAubmFtZSA9ICJyeF9mcmFtZXNfMTI4XzI1NSIsIC5kZXNjciA9ICJUaGUgY291bnQgb2YgUlggMTI4IHRvIDI1NSBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTXzEyOF8yNTUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfZnJhbWVzXzEyOF8yNTUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfZnJhbWVzXzI1Nl81MTEgPSB7IC5uYW1lID0gInJ4X2ZyYW1lc18yNTZfNTExIiwgLmRlc2NyID0gIlRoZSBjb3VudCBvZiBSWCAyNTYgdG8gNTExIGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfMjU2XzUxMSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9mcmFtZXNfMjU2XzUxMSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9mcmFtZXNfNTEyXzEwMjMgPSB7IC5uYW1lID0gInJ4X2ZyYW1lc181MTJfMTAyMyIsIC5kZXNjciA9ICJUaGUgY291bnQgb2YgUlggNTEyIHRvIDEwMjMgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQU1FU181MTJfMTAyMywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9mcmFtZXNfNTEyXzEwMjMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfZnJhbWVzXzEwMjRfMTUxOCA9IHsgLm5hbWUgPSAicnhfZnJhbWVzXzEwMjRfMTUxOCIsIC5kZXNjciA9ICJUaGUgY291bnQgb2YgUlggMTAyNCB0byAxNTE4IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfMTAyNF8xNTE4LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2ZyYW1lc18xMDI0XzE1MTgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfZnJhbWVzXzE1MTlfMjA0NyA9IHsgLm5hbWUgPSAicnhfZnJhbWVzXzE1MTlfMjA0NyIsIC5kZXNjciA9ICJUaGUgY291bnQgb2YgUlggMTUxOSB0byAyMDQ3IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfMTUxOV8yMDQ3LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2ZyYW1lc18xNTE5XzIwNDcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfZnJhbWVzXzIwNDhfNDA5NSA9IHsgLm5hbWUgPSAicnhfZnJhbWVzXzIwNDhfNDA5NSIsIC5kZXNjciA9ICJUaGUgY291bnQgb2YgUlggMjA0OCB0byA0MDk1IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfMjA0OF80MDk1LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2ZyYW1lc18yMDQ4XzQwOTUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfZnJhbWVzXzQwOTZfOTIxNiA9IHsgLm5hbWUgPSAicnhfZnJhbWVzXzQwOTZfOTIxNiIsIC5kZXNjciA9ICJUaGUgY291bnQgb2YgUlggNDA5NiB0byA5MjE2IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfNDA5Nl85MjE2LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2ZyYW1lc180MDk2XzkyMTYpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfZnJhbWVzXzkyMTdfMTYzODMgPSB7IC5uYW1lID0gInJ4X2ZyYW1lc185MjE3XzE2MzgzIiwgLmRlc2NyID0gIlRoZSBjb3VudCBvZiBSWCA5MjE3IHRvIDE2MzgzIGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9GUkFNRVNfOTIxN18xNjM4MywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9mcmFtZXNfOTIxN18xNjM4MyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9mcmFtZXMgPSB7IC5uYW1lID0gInJ4X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIGZyYW1lcyBvbiB0aGlzIE5OSS4gVGhpcyBpbmNsdWRlcyBhbGwgZXJyb3JlZCBmcmFtZXMgYXMgd2VsbC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9ieXRlcyA9IHsgLm5hbWUgPSAicnhfYnl0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBieXRlcyBvbiB0aGlzIE5OSS4gVGhpcyBpbmNsdWRlcyBhbGwgZXJyb3JlZCBmcmFtZXMgYXMgd2VsbC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQllURVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfZ29vZF9mcmFtZXMgPSB7IC5uYW1lID0gInJ4X2dvb2RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgZ29vZCBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX0dPT0RfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2dvb2RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X3VuaWNhc3RfZnJhbWVzID0geyAubmFtZSA9ICJyeF91bmljYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIHVuaWNhc3QgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTklDQVNUX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF91bmljYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9tdWx0aWNhc3RfZnJhbWVzID0geyAubmFtZSA9ICJyeF9tdWx0aWNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgbXVsdGljYXN0IGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfTVVMVElDQVNUX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9tdWx0aWNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X2Jyb2FkY2FzdF9mcmFtZXMgPSB7IC5uYW1lID0gInJ4X2Jyb2FkY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBicm9hZGNhc3QgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9CUk9BRENBU1RfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2Jyb2FkY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfZmNzX2Vycm9ycyA9IHsgLm5hbWUgPSAicnhfZmNzX2Vycm9ycyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIEZDUyBlcnJvcnMgb24gdGhpcyBOTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZDU19FUlJPUlMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfZmNzX2Vycm9ycyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9jb250cm9sX2ZyYW1lcyA9IHsgLm5hbWUgPSAicnhfY29udHJvbF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBjb250cm9sIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQ09OVFJPTF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfY29udHJvbF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfcGF1c2VfZnJhbWVzID0geyAubmFtZSA9ICJyeF9wYXVzZV9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBwYXVzZSBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX1BBVVNFX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9wYXVzZV9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfcGZjX2ZyYW1lcyA9IHsgLm5hbWUgPSAicnhfcGZjX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIFBGQyBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX1BGQ19GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfcGZjX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF91bnN1cHBvcnRlZF9vcGNvZGUgPSB7IC5uYW1lID0gInJ4X3Vuc3VwcG9ydGVkX29wY29kZSIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIFVuc3VwcG9ydGVkIE9wY29kZSBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX1VOU1VQUE9SVEVEX09QQ09ERSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF91bnN1cHBvcnRlZF9vcGNvZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfdW5zdXBwb3J0ZWRfZGEgPSB7IC5uYW1lID0gInJ4X3Vuc3VwcG9ydGVkX2RhIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgdW5zdXBwb3J0ZWQgREEgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTlNVUFBPUlRFRF9EQSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF91bnN1cHBvcnRlZF9kYSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9hbGlnbm1lbnRfZXJyb3JzID0geyAubmFtZSA9ICJyeF9hbGlnbm1lbnRfZXJyb3JzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgYWxpZ25tZW50IGVycm9ycyBvbiB0aGlzIE5OSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfQUxJR05NRU5UX0VSUk9SUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9hbGlnbm1lbnRfZXJyb3JzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X2xlbmd0aF9vdXRfb2ZfcmFuZ2UgPSB7IC5uYW1lID0gInJ4X2xlbmd0aF9vdXRfb2ZfcmFuZ2UiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBsZW5ndGggb3V0IG9mIHJhbmdlIGVycm9ycyBvbiB0aGlzIE5OSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfTEVOR1RIX09VVF9PRl9SQU5HRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9sZW5ndGhfb3V0X29mX3JhbmdlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X2NvZGVfZXJyb3JzID0geyAubmFtZSA9ICJyeF9jb2RlX2Vycm9ycyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIGNvZGUgZXJyb3JzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9DT0RFX0VSUk9SUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9jb2RlX2Vycm9ycyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9vdmVyc2l6ZWRfZnJhbWVzID0geyAubmFtZSA9ICJyeF9vdmVyc2l6ZWRfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgb3ZlcnNpemVkIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfT1ZFUlNJWkVEX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9vdmVyc2l6ZWRfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X2phYmJlcl9mcmFtZXMgPSB7IC5uYW1lID0gInJ4X2phYmJlcl9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBqYWJiZXIgZnJhbWVzIG9uIHRoaXMgTk5JLiB0aGVzZSBhcmUgb3ZlcnNpemVkIGZyYW1lcyB0aGF0IGFsc28gY29udGFpbiBhbiBpbnZhbGlkIENSQywgY29kZSBlcnJvciwgb3IgSUVFRSBsZW5ndGggY2hlY2sgZXJyb3IuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX0pBQkJFUl9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfamFiYmVyX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9tdHVfY2hlY2tfZXJyb3JzID0geyAubmFtZSA9ICJyeF9tdHVfY2hlY2tfZXJyb3JzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgTVRVIENoZWNrIEVycm9ycyBvbiB0aGlzIE5OSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfTVRVX0NIRUNLX0VSUk9SUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9tdHVfY2hlY2tfZXJyb3JzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X3Byb21pc2N1b3VzX2ZyYW1lcyA9IHsgLm5hbWUgPSAicnhfcHJvbWlzY3VvdXNfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgZnJhbWVzIG9uIHRoaXMgTk5JIHRoYXQgYXJlIG5vdCBjb250cm9sIHBhY2tldHMgYW5kIGhhdmUgYSBEQSB0aGF0IGlzIG5vdCBtYXRjaGluZyB3aXRoIHRoZSBSWCBTQS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfUlhfUFJPTUlTQ1VPVVNfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X3Byb21pc2N1b3VzX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF92bGFuX2ZyYW1lcyA9IHsgLm5hbWUgPSAicnhfdmxhbl9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBWTEFOIHRhZ2dlZCBmcmFtZXMgb24gdGhpcyBOTkkgKHdpdGggVFBJRCA4MTAwKS4gVGhpcyBjb3VudHMgYm90aCBzaW5nbGUgYW5kIGRvdWJsZSB0YWdnZWQgZnJhbWVzLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9WTEFOX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF92bGFuX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9kb3VibGVfdmxhbl9mcmFtZXMgPSB7IC5uYW1lID0gInJ4X2RvdWJsZV92bGFuX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIGRvdWJsZSBWTEFOIHRhZ2dlZCBmcmFtZXMgb24gdGhpcyBOTkkgKHdpdGggVFBJRCA4MTAwKS4gIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX0RPVUJMRV9WTEFOX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9kb3VibGVfdmxhbl9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfdHJ1bmNhdGVkX2ZyYW1lcyA9IHsgLm5hbWUgPSAicnhfdHJ1bmNhdGVkX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIHRydW5jYXRlZCBmcmFtZXMgb24gdGhpcyBOTkkuIFRoaXMgaXMgbGlrZWx5IGR1ZSB0byBSWCBGSUZPIEZ1bGwuICIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9UUlVOQ0FURURfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X3RydW5jYXRlZF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfdW5kZXJzaXplX2ZyYW1lcyA9IHsgLm5hbWUgPSAicnhfdW5kZXJzaXplX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIHVuZGVyc2l6ZWQgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9VTkRFUlNJWkVfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X3VuZGVyc2l6ZV9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfZnJhZ21lbnRlZF9mcmFtZXMgPSB7IC5uYW1lID0gInJ4X2ZyYWdtZW50ZWRfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgZnJhZ21lbnRlZCBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1JYX0ZSQUdNRU5URURfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2ZyYWdtZW50ZWRfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X3J1bnRfZnJhbWVzID0geyAubmFtZSA9ICJyeF9ydW50X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIHJ1bnQgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9SWF9SVU5UX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9ydW50X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9mcmFtZXNfNjQgPSB7IC5uYW1lID0gInR4X2ZyYW1lc182NCIsIC5kZXNjciA9ICJUaGUgY291bnQgb2YgVFggNjQgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU182NCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF9mcmFtZXNfNjQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfdHhfZnJhbWVzXzY1XzEyNyA9IHsgLm5hbWUgPSAidHhfZnJhbWVzXzY1XzEyNyIsIC5kZXNjciA9ICJUaGUgY291bnQgb2YgVFggNjUgdG8gMTI3IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfNjVfMTI3LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2ZyYW1lc182NV8xMjcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfdHhfZnJhbWVzXzEyOF8yNTUgPSB7IC5uYW1lID0gInR4X2ZyYW1lc18xMjhfMjU1IiwgLmRlc2NyID0gIlRoZSBjb3VudCBvZiBUWCAxMjggdG8gMjU1IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVNfMTI4XzI1NSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF9mcmFtZXNfMTI4XzI1NSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9mcmFtZXNfMjU2XzUxMSA9IHsgLm5hbWUgPSAidHhfZnJhbWVzXzI1Nl81MTEiLCAuZGVzY3IgPSAiVGhlIGNvdW50IG9mIFRYIDI1NiB0byA1MTEgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18yNTZfNTExLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2ZyYW1lc18yNTZfNTExKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2ZyYW1lc181MTJfMTAyMyA9IHsgLm5hbWUgPSAidHhfZnJhbWVzXzUxMl8xMDIzIiwgLmRlc2NyID0gIlRoZSBjb3VudCBvZiBUWCA1MTIgdG8gMTAyMyBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRlJBTUVTXzUxMl8xMDIzLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2ZyYW1lc181MTJfMTAyMyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9mcmFtZXNfMTAyNF8xNTE4ID0geyAubmFtZSA9ICJ0eF9mcmFtZXNfMTAyNF8xNTE4IiwgLmRlc2NyID0gIlRoZSBjb3VudCBvZiBUWCAxMDI0IHRvIDE1MTggYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18xMDI0XzE1MTgsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfZnJhbWVzXzEwMjRfMTUxOCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9mcmFtZXNfMTUxOV8yMDQ3ID0geyAubmFtZSA9ICJ0eF9mcmFtZXNfMTUxOV8yMDQ3IiwgLmRlc2NyID0gIlRoZSBjb3VudCBvZiBUWCAxNTE5IHRvIDIwNDcgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18xNTE5XzIwNDcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfZnJhbWVzXzE1MTlfMjA0NyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9mcmFtZXNfMjA0OF80MDk1ID0geyAubmFtZSA9ICJ0eF9mcmFtZXNfMjA0OF80MDk1IiwgLmRlc2NyID0gIlRoZSBjb3VudCBvZiBUWCAyMDQ4IHRvIDQwOTUgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU18yMDQ4XzQwOTUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfZnJhbWVzXzIwNDhfNDA5NSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9mcmFtZXNfNDA5Nl85MjE2ID0geyAubmFtZSA9ICJ0eF9mcmFtZXNfNDA5Nl85MjE2IiwgLmRlc2NyID0gIlRoZSBjb3VudCBvZiBUWCA0MDk2IHRvIDkyMTYgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU180MDk2XzkyMTYsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfZnJhbWVzXzQwOTZfOTIxNiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9mcmFtZXNfOTIxN18xNjM4MyA9IHsgLm5hbWUgPSAidHhfZnJhbWVzXzkyMTdfMTYzODMiLCAuZGVzY3IgPSAiVGhlIGNvdW50IG9mIFRYIDkyMTcgdG8gMTYzODMgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQU1FU185MjE3XzE2MzgzLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2ZyYW1lc185MjE3XzE2MzgzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2ZyYW1lcyA9IHsgLm5hbWUgPSAidHhfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgZnJhbWVzIG9uIHRoaXMgTk5JLiBUaGlzIGluY2x1ZGVzIGFsbCBlcnJvcmVkIGZyYW1lcyBhcyB3ZWxsLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2J5dGVzID0geyAubmFtZSA9ICJ0eF9ieXRlcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIGJ5dGVzIG9uIHRoaXMgTk5JLiBUaGlzIGluY2x1ZGVzIGFsbCBlcnJvcmVkIGZyYW1lcyBhcyB3ZWxsLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9nb29kX2ZyYW1lcyA9IHsgLm5hbWUgPSAidHhfZ29vZF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBnb29kIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfR09PRF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfZ29vZF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfdHhfdW5pY2FzdF9mcmFtZXMgPSB7IC5uYW1lID0gInR4X3VuaWNhc3RfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgdW5pY2FzdCBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX1VOSUNBU1RfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X3VuaWNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X211bHRpY2FzdF9mcmFtZXMgPSB7IC5uYW1lID0gInR4X211bHRpY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBtdWx0aWNhc3QgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9NVUxUSUNBU1RfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X211bHRpY2FzdF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfdHhfYnJvYWRjYXN0X2ZyYW1lcyA9IHsgLm5hbWUgPSAidHhfYnJvYWRjYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIGJyb2FkY2FzdCBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX0JST0FEQ0FTVF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfYnJvYWRjYXN0X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9wYXVzZV9mcmFtZXMgPSB7IC5uYW1lID0gInR4X3BhdXNlX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIHBhdXNlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfUEFVU0VfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X3BhdXNlX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9wZmNfZnJhbWVzID0geyAubmFtZSA9ICJ0eF9wZmNfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgUEZDIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfUEZDX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF9wZmNfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2phYmJlcl9mcmFtZXMgPSB7IC5uYW1lID0gInR4X2phYmJlcl9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBqYWJiZXIgZnJhbWVzIG9uIHRoaXMgTk5JLiBUaGVzZSBhcmUgb3ZlcnNpemVkIGZyYW1lcyB0aGF0IGFsc28gY29udGFpbiBhbiBpbnZhbGlkIEZDUy4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfSkFCQkVSX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF9qYWJiZXJfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2Zjc19lcnJvcnMgPSB7IC5uYW1lID0gInR4X2Zjc19lcnJvcnMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBGQ1MgZXJyb3JzIG9uIHRoaXMgTk5JLiAiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRkNTX0VSUk9SUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF9mY3NfZXJyb3JzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2NvbnRyb2xfZnJhbWVzID0geyAubmFtZSA9ICJ0eF9jb250cm9sX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIGNvbnRyb2wgZnJhbWVzIG9uIHRoaXMgTk5JLiAiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfQ09OVFJPTF9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfY29udHJvbF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfdHhfb3ZlcnNpemVfZnJhbWVzID0geyAubmFtZSA9ICJ0eF9vdmVyc2l6ZV9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBvdmVyc2l6ZWQgZnJhbWVzIG9uIHRoaXMgTk5JLiAiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfT1ZFUlNJWkVfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X292ZXJzaXplX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9mcmFnbWVudGVkX2ZyYW1lcyA9IHsgLm5hbWUgPSAidHhfZnJhZ21lbnRlZF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBmcmFnbWVudGVkIGZyYW1lcyBvbiB0aGlzIE5OSS4gIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX0ZSQUdNRU5URURfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2ZyYWdtZW50ZWRfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2Vycm9yX2ZyYW1lcyA9IHsgLm5hbWUgPSAidHhfZXJyb3JfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgZXJyb3JlZCBmcmFtZXMgb24gdGhpcyBOTkkuICIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVF9JRF9UWF9FUlJPUl9GUkFNRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfZXJyb3JfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X3ZsYW5fZnJhbWVzID0geyAubmFtZSA9ICJ0eF92bGFuX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIFZMQU4gdGFnZ2VkIGZyYW1lcyBvbiB0aGlzIE5OSSAod2l0aCBUUElEIDgxMDApLiBUaGlzIGNvdW50cyBib3RoIHNpbmdsZSBhbmQgZG91YmxlIHRhZ2dlZCBmcmFtZXMuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX1ZMQU5fRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X3ZsYW5fZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2RvdWJsZV92bGFuX2ZyYW1lcyA9IHsgLm5hbWUgPSAidHhfZG91YmxlX3ZsYW5fZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgZG91YmxlIFZMQU4gdGFnZ2VkIGZyYW1lcyBvbiB0aGlzIE5OSSAod2l0aCBUUElEIDgxMDApLiAiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfSURfVFhfRE9VQkxFX1ZMQU5fRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2RvdWJsZV92bGFuX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9ydW50X2ZyYW1lcyA9IHsgLm5hbWUgPSAidHhfcnVudF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBydW50IGZyYW1lcyBvbiB0aGlzIE5OSS4gIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX1JVTlRfRlJBTUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X3J1bnRfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X3VuZGVycnVuX2ZyYW1lcyA9IHsgLm5hbWUgPSAidHhfdW5kZXJydW5fZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgdW5kZXJydW4gZnJhbWVzIG9uIHRoaXMgTk5JLiBUaHVzIGhhcHBlbnMgd2hlbiBhIGZyYW1lIGVuY291bnRlcnMgYSBNQUMgdW5kZXJydW4gKFR4IFN5bmMgRklGTyBydW5zIG91dCBvZiBkYXRhIGJlZm9yZSB0aGUgZW5kIG9mIHBhY2tldCkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0lEX1RYX1VOREVSUlVOX0ZSQU1FUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF91bmRlcnJ1bl9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1Igbm5pX3N0YXRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9mcmFtZXNfNjQsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X2ZyYW1lc182NV8xMjcsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X2ZyYW1lc18xMjhfMjU1LCAmcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9mcmFtZXNfMjU2XzUxMSwgJnByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfZnJhbWVzXzUxMl8xMDIzLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9mcmFtZXNfMTAyNF8xNTE4LCAmcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9mcmFtZXNfMTUxOV8yMDQ3LCAmcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9mcmFtZXNfMjA0OF80MDk1LCAmcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9mcmFtZXNfNDA5Nl85MjE2LCAmcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9mcmFtZXNfOTIxN18xNjM4MywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfZnJhbWVzLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9ieXRlcywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfZ29vZF9mcmFtZXMsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X3VuaWNhc3RfZnJhbWVzLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9tdWx0aWNhc3RfZnJhbWVzLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9icm9hZGNhc3RfZnJhbWVzLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9mY3NfZXJyb3JzLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9jb250cm9sX2ZyYW1lcywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfcGF1c2VfZnJhbWVzLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9wZmNfZnJhbWVzLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF91bnN1cHBvcnRlZF9vcGNvZGUsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3J4X3Vuc3VwcG9ydGVkX2RhLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9hbGlnbm1lbnRfZXJyb3JzLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9sZW5ndGhfb3V0X29mX3JhbmdlLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9jb2RlX2Vycm9ycywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfb3ZlcnNpemVkX2ZyYW1lcywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfamFiYmVyX2ZyYW1lcywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfbXR1X2NoZWNrX2Vycm9ycywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfcHJvbWlzY3VvdXNfZnJhbWVzLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF92bGFuX2ZyYW1lcywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfZG91YmxlX3ZsYW5fZnJhbWVzLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF90cnVuY2F0ZWRfZnJhbWVzLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF91bmRlcnNpemVfZnJhbWVzLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF9yeF9mcmFnbWVudGVkX2ZyYW1lcywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfcnhfcnVudF9mcmFtZXMsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2ZyYW1lc182NCwgJnByb3BfZGVzY3Jfbm5pX3N0YXRfdHhfZnJhbWVzXzY1XzEyNywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfdHhfZnJhbWVzXzEyOF8yNTUsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2ZyYW1lc18yNTZfNTExLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9mcmFtZXNfNTEyXzEwMjMsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2ZyYW1lc18xMDI0XzE1MTgsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2ZyYW1lc18xNTE5XzIwNDcsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2ZyYW1lc18yMDQ4XzQwOTUsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2ZyYW1lc180MDk2XzkyMTYsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2ZyYW1lc185MjE3XzE2MzgzLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9mcmFtZXMsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2J5dGVzLCAmcHJvcF9kZXNjcl9ubmlfc3RhdF90eF9nb29kX2ZyYW1lcywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfdHhfdW5pY2FzdF9mcmFtZXMsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X211bHRpY2FzdF9mcmFtZXMsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2Jyb2FkY2FzdF9mcmFtZXMsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X3BhdXNlX2ZyYW1lcywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfdHhfcGZjX2ZyYW1lcywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfdHhfamFiYmVyX2ZyYW1lcywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfdHhfZmNzX2Vycm9ycywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfdHhfY29udHJvbF9mcmFtZXMsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X292ZXJzaXplX2ZyYW1lcywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfdHhfZnJhZ21lbnRlZF9mcmFtZXMsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2Vycm9yX2ZyYW1lcywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfdHhfdmxhbl9mcmFtZXMsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X2RvdWJsZV92bGFuX2ZyYW1lcywgJnByb3BfZGVzY3Jfbm5pX3N0YXRfdHhfcnVudF9mcmFtZXMsICZwcm9wX2Rlc2NyX25uaV9zdGF0X3R4X3VuZGVycnVuX2ZyYW1lcyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbm5pX3N0YXRfZGF0YV9maWVsZHNbXSA9Cit7CisgICAgeyAubmFtZSA9ICJyeF9mcmFtZXNfNjQiLCAuZGVzY3IgPSAiVGhlIGNvdW50IG9mIFJYIDY0IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfZnJhbWVzXzY0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfZnJhbWVzXzY1XzEyNyIsIC5kZXNjciA9ICJUaGUgY291bnQgb2YgUlggNjUgdG8gMTI3IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfZnJhbWVzXzY1XzEyNyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInJ4X2ZyYW1lc18xMjhfMjU1IiwgLmRlc2NyID0gIlRoZSBjb3VudCBvZiBSWCAxMjggdG8gMjU1IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfZnJhbWVzXzEyOF8yNTUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sCisgICAgeyAubmFtZSA9ICJyeF9mcmFtZXNfMjU2XzUxMSIsIC5kZXNjciA9ICJUaGUgY291bnQgb2YgUlggMjU2IHRvIDUxMSBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2ZyYW1lc18yNTZfNTExKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfZnJhbWVzXzUxMl8xMDIzIiwgLmRlc2NyID0gIlRoZSBjb3VudCBvZiBSWCA1MTIgdG8gMTAyMyBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2ZyYW1lc181MTJfMTAyMyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInJ4X2ZyYW1lc18xMDI0XzE1MTgiLCAuZGVzY3IgPSAiVGhlIGNvdW50IG9mIFJYIDEwMjQgdG8gMTUxOCBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2ZyYW1lc18xMDI0XzE1MTgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sCisgICAgeyAubmFtZSA9ICJyeF9mcmFtZXNfMTUxOV8yMDQ3IiwgLmRlc2NyID0gIlRoZSBjb3VudCBvZiBSWCAxNTE5IHRvIDIwNDcgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9mcmFtZXNfMTUxOV8yMDQ3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfZnJhbWVzXzIwNDhfNDA5NSIsIC5kZXNjciA9ICJUaGUgY291bnQgb2YgUlggMjA0OCB0byA0MDk1IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfZnJhbWVzXzIwNDhfNDA5NSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInJ4X2ZyYW1lc180MDk2XzkyMTYiLCAuZGVzY3IgPSAiVGhlIGNvdW50IG9mIFJYIDQwOTYgdG8gOTIxNiBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2ZyYW1lc180MDk2XzkyMTYpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sCisgICAgeyAubmFtZSA9ICJyeF9mcmFtZXNfOTIxN18xNjM4MyIsIC5kZXNjciA9ICJUaGUgY291bnQgb2YgUlggOTIxNyB0byAxNjM4MyBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2ZyYW1lc185MjE3XzE2MzgzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgZnJhbWVzIG9uIHRoaXMgTk5JLiBUaGlzIGluY2x1ZGVzIGFsbCBlcnJvcmVkIGZyYW1lcyBhcyB3ZWxsLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfYnl0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBieXRlcyBvbiB0aGlzIE5OSS4gVGhpcyBpbmNsdWRlcyBhbGwgZXJyb3JlZCBmcmFtZXMgYXMgd2VsbC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfZ29vZF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBnb29kIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2dvb2RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfdW5pY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCB1bmljYXN0IGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X3VuaWNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfbXVsdGljYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIG11bHRpY2FzdCBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9tdWx0aWNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfYnJvYWRjYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIGJyb2FkY2FzdCBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9icm9hZGNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfZmNzX2Vycm9ycyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIEZDUyBlcnJvcnMgb24gdGhpcyBOTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9mY3NfZXJyb3JzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfY29udHJvbF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBjb250cm9sIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2NvbnRyb2xfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfcGF1c2VfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgcGF1c2UgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfcGF1c2VfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfcGZjX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIFBGQyBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9wZmNfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfdW5zdXBwb3J0ZWRfb3Bjb2RlIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgVW5zdXBwb3J0ZWQgT3Bjb2RlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X3Vuc3VwcG9ydGVkX29wY29kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInJ4X3Vuc3VwcG9ydGVkX2RhIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgdW5zdXBwb3J0ZWQgREEgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfdW5zdXBwb3J0ZWRfZGEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sCisgICAgeyAubmFtZSA9ICJyeF9hbGlnbm1lbnRfZXJyb3JzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgYWxpZ25tZW50IGVycm9ycyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2FsaWdubWVudF9lcnJvcnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sCisgICAgeyAubmFtZSA9ICJyeF9sZW5ndGhfb3V0X29mX3JhbmdlIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgbGVuZ3RoIG91dCBvZiByYW5nZSBlcnJvcnMgb24gdGhpcyBOTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9sZW5ndGhfb3V0X29mX3JhbmdlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfY29kZV9lcnJvcnMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBjb2RlIGVycm9ycyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2NvZGVfZXJyb3JzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfb3ZlcnNpemVkX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIG92ZXJzaXplZCBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCByeF9vdmVyc2l6ZWRfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfamFiYmVyX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIGphYmJlciBmcmFtZXMgb24gdGhpcyBOTkkuIHRoZXNlIGFyZSBvdmVyc2l6ZWQgZnJhbWVzIHRoYXQgYWxzbyBjb250YWluIGFuIGludmFsaWQgQ1JDLCBjb2RlIGVycm9yLCBvciBJRUVFIGxlbmd0aCBjaGVjayBlcnJvci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X2phYmJlcl9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sCisgICAgeyAubmFtZSA9ICJyeF9tdHVfY2hlY2tfZXJyb3JzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgTVRVIENoZWNrIEVycm9ycyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X210dV9jaGVja19lcnJvcnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sCisgICAgeyAubmFtZSA9ICJyeF9wcm9taXNjdW91c19mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBmcmFtZXMgb24gdGhpcyBOTkkgdGhhdCBhcmUgbm90IGNvbnRyb2wgcGFja2V0cyBhbmQgaGF2ZSBhIERBIHRoYXQgaXMgbm90IG1hdGNoaW5nIHdpdGggdGhlIFJYIFNBLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfcHJvbWlzY3VvdXNfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfdmxhbl9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBWTEFOIHRhZ2dlZCBmcmFtZXMgb24gdGhpcyBOTkkgKHdpdGggVFBJRCA4MTAwKS4gVGhpcyBjb3VudHMgYm90aCBzaW5nbGUgYW5kIGRvdWJsZSB0YWdnZWQgZnJhbWVzLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfdmxhbl9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sCisgICAgeyAubmFtZSA9ICJyeF9kb3VibGVfdmxhbl9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBkb3VibGUgVkxBTiB0YWdnZWQgZnJhbWVzIG9uIHRoaXMgTk5JICh3aXRoIFRQSUQgODEwMCkuICIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfZG91YmxlX3ZsYW5fZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAicnhfdHJ1bmNhdGVkX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIHRydW5jYXRlZCBmcmFtZXMgb24gdGhpcyBOTkkuIFRoaXMgaXMgbGlrZWx5IGR1ZSB0byBSWCBGSUZPIEZ1bGwuICIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfdHJ1bmNhdGVkX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInJ4X3VuZGVyc2l6ZV9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCB1bmRlcnNpemVkIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHJ4X3VuZGVyc2l6ZV9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sCisgICAgeyAubmFtZSA9ICJyeF9mcmFnbWVudGVkX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIGZyYWdtZW50ZWQgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfZnJhZ21lbnRlZF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sCisgICAgeyAubmFtZSA9ICJyeF9ydW50X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIHJ1bnQgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgcnhfcnVudF9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sCisgICAgeyAubmFtZSA9ICJ0eF9mcmFtZXNfNjQiLCAuZGVzY3IgPSAiVGhlIGNvdW50IG9mIFRYIDY0IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfZnJhbWVzXzY0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAidHhfZnJhbWVzXzY1XzEyNyIsIC5kZXNjciA9ICJUaGUgY291bnQgb2YgVFggNjUgdG8gMTI3IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfZnJhbWVzXzY1XzEyNyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInR4X2ZyYW1lc18xMjhfMjU1IiwgLmRlc2NyID0gIlRoZSBjb3VudCBvZiBUWCAxMjggdG8gMjU1IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfZnJhbWVzXzEyOF8yNTUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sCisgICAgeyAubmFtZSA9ICJ0eF9mcmFtZXNfMjU2XzUxMSIsIC5kZXNjciA9ICJUaGUgY291bnQgb2YgVFggMjU2IHRvIDUxMSBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2ZyYW1lc18yNTZfNTExKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAidHhfZnJhbWVzXzUxMl8xMDIzIiwgLmRlc2NyID0gIlRoZSBjb3VudCBvZiBUWCA1MTIgdG8gMTAyMyBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2ZyYW1lc181MTJfMTAyMyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInR4X2ZyYW1lc18xMDI0XzE1MTgiLCAuZGVzY3IgPSAiVGhlIGNvdW50IG9mIFRYIDEwMjQgdG8gMTUxOCBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2ZyYW1lc18xMDI0XzE1MTgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sCisgICAgeyAubmFtZSA9ICJ0eF9mcmFtZXNfMTUxOV8yMDQ3IiwgLmRlc2NyID0gIlRoZSBjb3VudCBvZiBUWCAxNTE5IHRvIDIwNDcgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF9mcmFtZXNfMTUxOV8yMDQ3KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAidHhfZnJhbWVzXzIwNDhfNDA5NSIsIC5kZXNjciA9ICJUaGUgY291bnQgb2YgVFggMjA0OCB0byA0MDk1IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfZnJhbWVzXzIwNDhfNDA5NSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInR4X2ZyYW1lc180MDk2XzkyMTYiLCAuZGVzY3IgPSAiVGhlIGNvdW50IG9mIFRYIDQwOTYgdG8gOTIxNiBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2ZyYW1lc180MDk2XzkyMTYpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sCisgICAgeyAubmFtZSA9ICJ0eF9mcmFtZXNfOTIxN18xNjM4MyIsIC5kZXNjciA9ICJUaGUgY291bnQgb2YgVFggOTIxNyB0byAxNjM4MyBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2ZyYW1lc185MjE3XzE2MzgzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAidHhfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgZnJhbWVzIG9uIHRoaXMgTk5JLiBUaGlzIGluY2x1ZGVzIGFsbCBlcnJvcmVkIGZyYW1lcyBhcyB3ZWxsLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAidHhfYnl0ZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBieXRlcyBvbiB0aGlzIE5OSS4gVGhpcyBpbmNsdWRlcyBhbGwgZXJyb3JlZCBmcmFtZXMgYXMgd2VsbC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAidHhfZ29vZF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBnb29kIGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2dvb2RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAidHhfdW5pY2FzdF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCB1bmljYXN0IGZyYW1lcyBvbiB0aGlzIE5OSS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X3VuaWNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAidHhfbXVsdGljYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIG11bHRpY2FzdCBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF9tdWx0aWNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAidHhfYnJvYWRjYXN0X2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIGJyb2FkY2FzdCBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF9icm9hZGNhc3RfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAidHhfcGF1c2VfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgcGF1c2UgZnJhbWVzIG9uIHRoaXMgTk5JLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfcGF1c2VfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAidHhfcGZjX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIFBGQyBmcmFtZXMgb24gdGhpcyBOTkkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF9wZmNfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAidHhfamFiYmVyX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIGphYmJlciBmcmFtZXMgb24gdGhpcyBOTkkuIFRoZXNlIGFyZSBvdmVyc2l6ZWQgZnJhbWVzIHRoYXQgYWxzbyBjb250YWluIGFuIGludmFsaWQgRkNTLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfamFiYmVyX2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInR4X2Zjc19lcnJvcnMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBGQ1MgZXJyb3JzIG9uIHRoaXMgTk5JLiAiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2Zjc19lcnJvcnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sCisgICAgeyAubmFtZSA9ICJ0eF9jb250cm9sX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIGNvbnRyb2wgZnJhbWVzIG9uIHRoaXMgTk5JLiAiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2NvbnRyb2xfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAidHhfb3ZlcnNpemVfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgb3ZlcnNpemVkIGZyYW1lcyBvbiB0aGlzIE5OSS4gIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF9vdmVyc2l6ZV9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sCisgICAgeyAubmFtZSA9ICJ0eF9mcmFnbWVudGVkX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIGZyYWdtZW50ZWQgZnJhbWVzIG9uIHRoaXMgTk5JLiAiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2RhdGEsIHR4X2ZyYWdtZW50ZWRfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAidHhfZXJyb3JfZnJhbWVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgZXJyb3JlZCBmcmFtZXMgb24gdGhpcyBOTkkuICIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfZXJyb3JfZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAidHhfdmxhbl9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBWTEFOIHRhZ2dlZCBmcmFtZXMgb24gdGhpcyBOTkkgKHdpdGggVFBJRCA4MTAwKS4gVGhpcyBjb3VudHMgYm90aCBzaW5nbGUgYW5kIGRvdWJsZSB0YWdnZWQgZnJhbWVzLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfdmxhbl9mcmFtZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sCisgICAgeyAubmFtZSA9ICJ0eF9kb3VibGVfdmxhbl9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBkb3VibGUgVkxBTiB0YWdnZWQgZnJhbWVzIG9uIHRoaXMgTk5JICh3aXRoIFRQSUQgODEwMCkuICIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfZG91YmxlX3ZsYW5fZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LAorICAgIHsgLm5hbWUgPSAidHhfcnVudF9mcmFtZXMiLCAuZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBydW50IGZyYW1lcyBvbiB0aGlzIE5OSS4gIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhLCB0eF9ydW50X2ZyYW1lcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwKKyAgICB7IC5uYW1lID0gInR4X3VuZGVycnVuX2ZyYW1lcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIHVuZGVycnVuIGZyYW1lcyBvbiB0aGlzIE5OSS4gVGh1cyBoYXBwZW5zIHdoZW4gYSBmcmFtZSBlbmNvdW50ZXJzIGEgTUFDIHVuZGVycnVuIChUeCBTeW5jIEZJRk8gcnVucyBvdXQgb2YgZGF0YSBiZWZvcmUgdGhlIGVuZCBvZiBwYWNrZXQpLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfZGF0YSwgdHhfdW5kZXJydW5fZnJhbWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Cit9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfc3RhdF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfbm5pX3N0YXRfZGF0YSIsIC5kZXNjciA9ICJzdGF0IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X25uaV9zdGF0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfbm5pX3N0YXRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfc3RhdF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IG5uaSAtIHN0YXR1c19jaGFuZ2VkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXR1c19jaGFuZ2VkX25ld19zdGF0dXMgPSB7IC5uYW1lID0gIm5ld19zdGF0dXMiLCAuZGVzY3IgPSAiTmV3IE5OSSBMaW5rIFN0YXR1cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU1RBVFVTX0NIQU5HRURfSURfTkVXX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfZGF0YSwgbmV3X3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0dXNfY2hhbmdlZF9saW5rID0geyAubmFtZSA9ICJsaW5rIiwgLmRlc2NyID0gIldoaWNoIE5OSSB0aGlzIGluZGljYXRpb24gcGVydGFpbnMgdG8uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUVVNfQ0hBTkdFRF9JRF9MSU5LLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9kYXRhLCBsaW5rKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbm5pX2Nvbm5lY3Rpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdHVzX2NoYW5nZWRfcHJldmlvdXNfYWN0aXZlID0geyAubmFtZSA9ICJwcmV2aW91c19hY3RpdmUiLCAuZGVzY3IgPSAiV2hpY2ggTk5JIHdhcyBhY3RpdmUgYmVmb3JlIHRoaXMgc3RhdHVzIGNoYW5nZS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRVU19DSEFOR0VEX0lEX1BSRVZJT1VTX0FDVElWRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfZGF0YSwgcHJldmlvdXNfYWN0aXZlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbm5pX2Nvbm5lY3Rpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc3RhdHVzX2NoYW5nZWRfbmV3X2FjdGl2ZSA9IHsgLm5hbWUgPSAibmV3X2FjdGl2ZSIsIC5kZXNjciA9ICJXaGljaCBOTkkgaXMgbm93IGFjdGl2ZSBhZnRlciB0aGlzIHN0YXR1cyBjaGFuZ2UuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUVVNfQ0hBTkdFRF9JRF9ORVdfQUNUSVZFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9kYXRhLCBuZXdfYWN0aXZlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbm5pX2Nvbm5lY3Rpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBubmlfc3RhdHVzX2NoYW5nZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ubmlfc3RhdHVzX2NoYW5nZWRfbmV3X3N0YXR1cywgJnByb3BfZGVzY3Jfbm5pX3N0YXR1c19jaGFuZ2VkX2xpbmssICZwcm9wX2Rlc2NyX25uaV9zdGF0dXNfY2hhbmdlZF9wcmV2aW91c19hY3RpdmUsICZwcm9wX2Rlc2NyX25uaV9zdGF0dXNfY2hhbmdlZF9uZXdfYWN0aXZlIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJuZXdfc3RhdHVzIiwgLmRlc2NyID0gIk5ldyBOTkkgTGluayBTdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0dXNfY2hhbmdlZF9kYXRhLCBuZXdfc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAibGluayIsIC5kZXNjciA9ICJXaGljaCBOTkkgdGhpcyBpbmRpY2F0aW9uIHBlcnRhaW5zIHRvLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2RhdGEsIGxpbmspLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfY29ubmVjdGlvbiB9LCB7IC5uYW1lID0gInByZXZpb3VzX2FjdGl2ZSIsIC5kZXNjciA9ICJXaGljaCBOTkkgd2FzIGFjdGl2ZSBiZWZvcmUgdGhpcyBzdGF0dXMgY2hhbmdlLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2RhdGEsIHByZXZpb3VzX2FjdGl2ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X25uaV9jb25uZWN0aW9uIH0sIHsgLm5hbWUgPSAibmV3X2FjdGl2ZSIsIC5kZXNjciA9ICJXaGljaCBOTkkgaXMgbm93IGFjdGl2ZSBhZnRlciB0aGlzIHN0YXR1cyBjaGFuZ2UuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfZGF0YSwgbmV3X2FjdGl2ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X25uaV9jb25uZWN0aW9uIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfZGF0YSIsIC5kZXNjciA9ICJOTkkgTGluayBzdGF0dXMgY2hhbmdlZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBubmkgLSBzdGF0X2NmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X2NmZ19jZmcgPSB7IC5uYW1lID0gImNmZyIsIC5kZXNjciA9ICJTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfQ0ZHX0lEX0NGRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9jZmdfZGF0YSwgY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9jb25maWcgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBubmlfc3RhdF9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ubmlfc3RhdF9jZmdfY2ZnIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfc3RhdF9jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJjZmciLCAuZGVzY3IgPSAiU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9jZmdfZGF0YSwgY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9jb25maWcgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfc3RhdF9jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X25uaV9zdGF0X2NmZ19kYXRhIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X25uaV9zdGF0X2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X25uaV9zdGF0X2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X25uaV9zdGF0X2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IG5uaSAtIHN0YXRfYWxhcm1fcmFpc2VkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3N0YXRfYWxhcm1fcmFpc2VkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbm5pX3N0YXRfaWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBubmlfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9ubmlfc3RhdF9hbGFybV9yYWlzZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfbm5pX3N0YXRfaWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIiwgLmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IG5uaSAtIHN0YXRfYWxhcm1fY2xlYXJlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCA9IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X25uaV9zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1Igbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfc3RhdF9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaXMgbm8gbG9uZ2VyIG1ldC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X25uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogbm5pIC0gYXV0b19jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfYXV0b19jZmdfc3RhdF9hbGFybV9jbGVhcmVkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX2NsZWFyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfYXV0b19jZmdfc3RhdF9hbGFybV9yYWlzZWQgPSB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX3JhaXNlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fcmFpc2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX2F1dG9fY2ZnX3N0YXR1c19jaGFuZ2VkID0geyAubmFtZSA9ICJzdGF0dXNfY2hhbmdlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdHVzX2NoYW5nZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX0FVVE9fQ0ZHX0lEX1NUQVRVU19DSEFOR0VELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9hdXRvX2NmZ19kYXRhLCBzdGF0dXNfY2hhbmdlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIG5uaV9hdXRvX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX25uaV9hdXRvX2NmZ19zdGF0X2FsYXJtX2NsZWFyZWQsICZwcm9wX2Rlc2NyX25uaV9hdXRvX2NmZ19zdGF0X2FsYXJtX3JhaXNlZCwgJnByb3BfZGVzY3Jfbm5pX2F1dG9fY2ZnX3N0YXR1c19jaGFuZ2VkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfYXV0b19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fY2xlYXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX3JhaXNlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fcmFpc2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic3RhdHVzX2NoYW5nZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXR1c19jaGFuZ2VkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfYXV0b19jZmdfZGF0YSwgc3RhdHVzX2NoYW5nZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfYXV0b19jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X25uaV9hdXRvX2NmZ19kYXRhIiwgLmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfYXV0b19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfYXV0b19jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfYXV0b19jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qID09PT0gT2JqZWN0OiBubmlfc2VyZGVzID09PT0gKi8KKworLyogR3JvdXA6IG5uaV9zZXJkZXMgLSBrZXkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc2VyZGVzX2tleV9wb25fbmkgPSB7IC5uYW1lID0gInBvbl9uaSIsIC5kZXNjciA9ICJQT04gTkkiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NFUkRFU19LRVlfSURfUE9OX05JLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zZXJkZXNfa2V5LCBwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc2VyZGVzX2tleV9pbnN0YW5jZSA9IHsgLm5hbWUgPSAiaW5zdGFuY2UiLCAuZGVzY3IgPSAiU2VyRGVzIGluc3RhbmNlLjogMCA9IFByaW1hcnksIDEgPSBTZWNvbmRhcnkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TRVJERVNfS0VZX0lEX0lOU1RBTkNFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zZXJkZXNfa2V5LCBpbnN0YW5jZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3NlcmRlc19pbnN0YW5jZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIG5uaV9zZXJkZXNfa2V5X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3Jfbm5pX3NlcmRlc19rZXlfcG9uX25pLCAmcHJvcF9kZXNjcl9ubmlfc2VyZGVzX2tleV9pbnN0YW5jZSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbm5pX3NlcmRlc19rZXlfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicG9uX25pIiwgLmRlc2NyID0gIlBPTiBOSSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3NlcmRlc19rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gImluc3RhbmNlIiwgLmRlc2NyID0gIlNlckRlcyBpbnN0YW5jZS46IDAgPSBQcmltYXJ5LCAxID0gU2Vjb25kYXJ5LiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3NlcmRlc19rZXksIGluc3RhbmNlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc2VyZGVzX2luc3RhbmNlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfbm5pX3NlcmRlc19rZXkgPSB7IC5uYW1lID0gImJjbW9sdF9ubmlfc2VyZGVzX2tleSIsIC5kZXNjciA9ICJrZXkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfbm5pX3NlcmRlc19rZXkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfbm5pX3NlcmRlc19rZXlfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfbm5pX3NlcmRlc19rZXlfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogbm5pX3NlcmRlcyAtIGNmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zZXJkZXNfY2ZnX3J4X3ZnYSA9IHsgLm5hbWUgPSAicnhfdmdhIiwgLmRlc2NyID0gIlJ4IFZnYSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9WR0EsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YSwgcnhfdmdhKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3NlcmRlc19jZmdfcnhfcGYgPSB7IC5uYW1lID0gInJ4X3BmIiwgLmRlc2NyID0gIlBlYWtpbmcgRmlsdGVyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX1BGLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGEsIHJ4X3BmKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3NlcmRlc19jZmdfcnhfbGZwZiA9IHsgLm5hbWUgPSAicnhfbGZwZiIsIC5kZXNjciA9ICJMb3cgRnJlcXVlbmN5IFBlYWtpbmcgRmlsdGVyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1JYX0xGUEYsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YSwgcnhfbGZwZiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zZXJkZXNfY2ZnX3J4X2RmZTEgPSB7IC5uYW1lID0gInJ4X2RmZTEiLCAuZGVzY3IgPSAiUnggREZFMSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9SWF9ERkUxLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGEsIHJ4X2RmZTEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc2VyZGVzX2NmZ19yeF9kZmUyID0geyAubmFtZSA9ICJyeF9kZmUyIiwgLmRlc2NyID0gIlJ4IERGRTIiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFMiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhLCByeF9kZmUyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9pbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc2VyZGVzX2NmZ19yeF9kZmUzID0geyAubmFtZSA9ICJyeF9kZmUzIiwgLmRlc2NyID0gIlJ4IERGRTMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFMywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhLCByeF9kZmUzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9pbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc2VyZGVzX2NmZ19yeF9kZmU0ID0geyAubmFtZSA9ICJyeF9kZmU0IiwgLmRlc2NyID0gIlJ4IERGRTQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFNCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhLCByeF9kZmU0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9pbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc2VyZGVzX2NmZ19yeF9kZmU1ID0geyAubmFtZSA9ICJyeF9kZmU1IiwgLmRlc2NyID0gIlJ4IERGRTUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfUlhfREZFNSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhLCByeF9kZmU1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9pbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc2VyZGVzX2NmZ190eF9wcmUgPSB7IC5uYW1lID0gInR4X3ByZSIsIC5kZXNjciA9ICJUeCBQcmUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfUFJFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGEsIHR4X3ByZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zZXJkZXNfY2ZnX3R4X21haW4gPSB7IC5uYW1lID0gInR4X21haW4iLCAuZGVzY3IgPSAiVHggTWFpbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9NQUlOLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGEsIHR4X21haW4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc2VyZGVzX2NmZ190eF9wb3N0MSA9IHsgLm5hbWUgPSAidHhfcG9zdDEiLCAuZGVzY3IgPSAiVHggUG9zdDEiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfUE9TVDEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YSwgdHhfcG9zdDEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl9ubmlfc2VyZGVzX2NmZ190eF9wb3N0MiA9IHsgLm5hbWUgPSAidHhfcG9zdDIiLCAuZGVzY3IgPSAiVHggUG9zdDIiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfTk5JX1NFUkRFU19DRkdfSURfVFhfUE9TVDIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YSwgdHhfcG9zdDIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2ludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX25uaV9zZXJkZXNfY2ZnX3R4X3Bvc3QzID0geyAubmFtZSA9ICJ0eF9wb3N0MyIsIC5kZXNjciA9ICJUeCBQb3N0MyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9OTklfU0VSREVTX0NGR19JRF9UWF9QT1NUMywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhLCB0eF9wb3N0MyksIC50eXBlID0gJnR5cGVfZGVzY3JfaW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3Jfbm5pX3NlcmRlc19jZmdfdHhfYW1wID0geyAubmFtZSA9ICJ0eF9hbXAiLCAuZGVzY3IgPSAiVHggQW1wIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX05OSV9TRVJERVNfQ0ZHX0lEX1RYX0FNUCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhLCB0eF9hbXApLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBubmlfc2VyZGVzX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX25uaV9zZXJkZXNfY2ZnX3J4X3ZnYSwgJnByb3BfZGVzY3Jfbm5pX3NlcmRlc19jZmdfcnhfcGYsICZwcm9wX2Rlc2NyX25uaV9zZXJkZXNfY2ZnX3J4X2xmcGYsICZwcm9wX2Rlc2NyX25uaV9zZXJkZXNfY2ZnX3J4X2RmZTEsICZwcm9wX2Rlc2NyX25uaV9zZXJkZXNfY2ZnX3J4X2RmZTIsICZwcm9wX2Rlc2NyX25uaV9zZXJkZXNfY2ZnX3J4X2RmZTMsICZwcm9wX2Rlc2NyX25uaV9zZXJkZXNfY2ZnX3J4X2RmZTQsICZwcm9wX2Rlc2NyX25uaV9zZXJkZXNfY2ZnX3J4X2RmZTUsICZwcm9wX2Rlc2NyX25uaV9zZXJkZXNfY2ZnX3R4X3ByZSwgJnByb3BfZGVzY3Jfbm5pX3NlcmRlc19jZmdfdHhfbWFpbiwgJnByb3BfZGVzY3Jfbm5pX3NlcmRlc19jZmdfdHhfcG9zdDEsICZwcm9wX2Rlc2NyX25uaV9zZXJkZXNfY2ZnX3R4X3Bvc3QyLCAmcHJvcF9kZXNjcl9ubmlfc2VyZGVzX2NmZ190eF9wb3N0MywgJnByb3BfZGVzY3Jfbm5pX3NlcmRlc19jZmdfdHhfYW1wIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJ4X3ZnYSIsIC5kZXNjciA9ICJSeCBWZ2EiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGEsIHJ4X3ZnYSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInJ4X3BmIiwgLmRlc2NyID0gIlBlYWtpbmcgRmlsdGVyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhLCByeF9wZiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInJ4X2xmcGYiLCAuZGVzY3IgPSAiTG93IEZyZXF1ZW5jeSBQZWFraW5nIEZpbHRlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YSwgcnhfbGZwZiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInJ4X2RmZTEiLCAuZGVzY3IgPSAiUnggREZFMSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YSwgcnhfZGZlMSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInJ4X2RmZTIiLCAuZGVzY3IgPSAiUnggREZFMiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YSwgcnhfZGZlMiksIC50eXBlID0gJnR5cGVfZGVzY3JfaW50OF90IH0sIHsgLm5hbWUgPSAicnhfZGZlMyIsIC5kZXNjciA9ICJSeCBERkUzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhLCByeF9kZmUzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9pbnQ4X3QgfSwgeyAubmFtZSA9ICJyeF9kZmU0IiwgLmRlc2NyID0gIlJ4IERGRTQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGEsIHJ4X2RmZTQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2ludDhfdCB9LCB7IC5uYW1lID0gInJ4X2RmZTUiLCAuZGVzY3IgPSAiUnggREZFNSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YSwgcnhfZGZlNSksIC50eXBlID0gJnR5cGVfZGVzY3JfaW50OF90IH0sIHsgLm5hbWUgPSAidHhfcHJlIiwgLmRlc2NyID0gIlR4IFByZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YSwgdHhfcHJlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAidHhfbWFpbiIsIC5kZXNjciA9ICJUeCBNYWluIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhLCB0eF9tYWluKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAidHhfcG9zdDEiLCAuZGVzY3IgPSAiVHggUG9zdDEiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGEsIHR4X3Bvc3QxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAidHhfcG9zdDIiLCAuZGVzY3IgPSAiVHggUG9zdDIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGEsIHR4X3Bvc3QyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9pbnQ4X3QgfSwgeyAubmFtZSA9ICJ0eF9wb3N0MyIsIC5kZXNjciA9ICJUeCBQb3N0MyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YSwgdHhfcG9zdDMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2ludDhfdCB9LCB7IC5uYW1lID0gInR4X2FtcCIsIC5kZXNjciA9ICJUeCBBbXAiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGEsIHR4X2FtcCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhIiwgLmRlc2NyID0gImNmZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfbm5pX3NlcmRlc19jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qID09PT0gT2JqZWN0OiBzb2Z0d2FyZV9lcnJvciA9PT09ICovCisKKy8qIEdyb3VwOiBzb2Z0d2FyZV9lcnJvciAtIGtleSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3NvZnR3YXJlX2Vycm9yX2tleV9yZXNlcnZlZCA9IHsgLm5hbWUgPSAicmVzZXJ2ZWQiLCAuZGVzY3IgPSAiUmVzZXJ2ZWQgKHNldCB0byAwKS4iLCAuYWNjZXNzID0gMCwgLnByb3BlcnR5ID0gQkNNT0xUX1NPRlRXQVJFX0VSUk9SX0tFWV9JRF9SRVNFUlZFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXksIHJlc2VydmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3NvZnR3YXJlX2Vycm9yX2tleV9pZHggPSB7IC5uYW1lID0gImlkeCIsIC5kZXNjciA9ICJJbmRleCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9TT0ZUV0FSRV9FUlJPUl9LRVlfSURfSURYLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleSwgaWR4KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHNvZnR3YXJlX2Vycm9yX2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3NvZnR3YXJlX2Vycm9yX2tleV9yZXNlcnZlZCwgJnByb3BfZGVzY3Jfc29mdHdhcmVfZXJyb3Jfa2V5X2lkeCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJlc2VydmVkIiwgLmRlc2NyID0gIlJlc2VydmVkIChzZXQgdG8gMCkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXksIHJlc2VydmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImlkeCIsIC5kZXNjciA9ICJJbmRleCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5LCBpZHgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5IiwgLmRlc2NyID0gImtleSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9rZXkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfc29mdHdhcmVfZXJyb3Jfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiBzb2Z0d2FyZV9lcnJvciAtIGNmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3NvZnR3YXJlX2Vycm9yX2NmZ19lbnRyeSA9IHsgLm5hbWUgPSAiZW50cnkiLCAuZGVzY3IgPSAiRW50cnkiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9TT0ZUV0FSRV9FUlJPUl9DRkdfSURfRU5UUlksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnX2RhdGEsIGVudHJ5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3dfZXJyb3IgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiBzb2Z0d2FyZV9lcnJvcl9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl9zb2Z0d2FyZV9lcnJvcl9jZmdfZW50cnkgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImVudHJ5IiwgLmRlc2NyID0gIkVudHJ5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9zb2Z0d2FyZV9lcnJvcl9jZmdfZGF0YSwgZW50cnkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zd19lcnJvciB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiY2ZnIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogPT09PSBPYmplY3Q6IHRyeF9jYWxpYnJhdGlvbiA9PT09ICovCisKKy8qIEdyb3VwOiB0cnhfY2FsaWJyYXRpb24gLSBrZXkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl90cnhfY2FsaWJyYXRpb25fa2V5X3Jlc2VydmVkID0geyAubmFtZSA9ICJyZXNlcnZlZCIsIC5kZXNjciA9ICJSZXNlcnZlZCAoc2V0IHRvIDApIiwgLmFjY2VzcyA9IDAsIC5wcm9wZXJ0eSA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fS0VZX0lEX1JFU0VSVkVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXksIHJlc2VydmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHRyeF9jYWxpYnJhdGlvbl9rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl90cnhfY2FsaWJyYXRpb25fa2V5X3Jlc2VydmVkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJlc2VydmVkIiwgLmRlc2NyID0gIlJlc2VydmVkIChzZXQgdG8gMCkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXksIHJlc2VydmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXkgPSB7IC5uYW1lID0gImJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5IiwgLmRlc2NyID0gImtleSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXlfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB0cnhfY2FsaWJyYXRpb24gLSBzdGFydF9jYXB0dXJlX3dpbmRvdyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19wb25fbmkgPSB7IC5uYW1lID0gInBvbl9uaSIsIC5kZXNjciA9ICJwb25fbmkiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX1NUQVJUX0NBUFRVUkVfV0lORE9XX0lEX1BPTl9OSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfZGF0YSwgcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X3RyaWdnZXIgPSB7IC5uYW1lID0gInRyaWdnZXIiLCAuZGVzY3IgPSAidHJpZ2dlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfVFJJR0dFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfZGF0YSwgdHJpZ2dlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X3N0cm9iZSA9IHsgLm5hbWUgPSAic3Ryb2JlIiwgLmRlc2NyID0gInN0cm9iZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfU1RST0JFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhLCBzdHJvYmUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jYXB0dXJlX3N0cm9iZV9zaWduYWwgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfd2luZG93X21vZGUgPSB7IC5uYW1lID0gIndpbmRvd19tb2RlIiwgLmRlc2NyID0gIndpbmRvdyBtb2RlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9XSU5ET1dfTU9ERSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfZGF0YSwgd2luZG93X21vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF90cnhfY2FsaWJyYXRpb25fd2luZG93X21vZGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfb251X2lkID0geyAubmFtZSA9ICJvbnVfaWQiLCAuZGVzY3IgPSAib251IGlkIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9PTlVfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGEsIG9udV9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfdHJpZ2dlcl9wb3NpdGlvbiA9IHsgLm5hbWUgPSAidHJpZ2dlcl9wb3NpdGlvbiIsIC5kZXNjciA9ICJ0cmlnZ2VyIHBvc2l0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9UUklHR0VSX1BPU0lUSU9OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhLCB0cmlnZ2VyX3Bvc2l0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdHJ4X2NhbGlicmF0aW9uX3RyaWdnZXJfcG9zaXRpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfc3RvcF9kdWVfdG9fY29ycnVwdF9zdHJvYmUgPSB7IC5uYW1lID0gInN0b3BfZHVlX3RvX2NvcnJ1cHRfc3Ryb2JlIiwgLmRlc2NyID0gImVuYWJsZS9kaXNhYmxlIGNvcnJ1cHQgc3Ryb2JlIGZyb20gTUFDIHRvIHRlcm1pbmF0ZSBzdGF0IHdpbmRvdyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfU1RPUF9EVUVfVE9fQ09SUlVQVF9TVFJPQkUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGEsIHN0b3BfZHVlX3RvX2NvcnJ1cHRfc3Ryb2JlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X3N0YXJ0X29mZnNldCA9IHsgLm5hbWUgPSAic3RhcnRfb2Zmc2V0IiwgLmRlc2NyID0gInN0YXJ0IG9mZnNldCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfU1RBUlRfT0ZGU0VULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhLCBzdGFydF9vZmZzZXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2VuZF9vZmZzZXQgPSB7IC5uYW1lID0gImVuZF9vZmZzZXQiLCAuZGVzY3IgPSAiZW5kIG9mZnNldCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fU1RBUlRfQ0FQVFVSRV9XSU5ET1dfSURfRU5EX09GRlNFVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfZGF0YSwgZW5kX29mZnNldCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfbnVtYmVyX29mX2N5Y2xlcyA9IHsgLm5hbWUgPSAibnVtYmVyX29mX2N5Y2xlcyIsIC5kZXNjciA9ICJudW1iZXIgb2YgY3ljbGVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVEFSVF9DQVBUVVJFX1dJTkRPV19JRF9OVU1CRVJfT0ZfQ1lDTEVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhLCBudW1iZXJfb2ZfY3ljbGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X3Bvbl9uaSwgJnByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X3RyaWdnZXIsICZwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19zdHJvYmUsICZwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd193aW5kb3dfbW9kZSwgJnByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X29udV9pZCwgJnByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X3RyaWdnZXJfcG9zaXRpb24sICZwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19zdG9wX2R1ZV90b19jb3JydXB0X3N0cm9iZSwgJnByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X3N0YXJ0X29mZnNldCwgJnByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2VuZF9vZmZzZXQsICZwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19udW1iZXJfb2ZfY3ljbGVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAicG9uX25pIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfZGF0YSwgcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAidHJpZ2dlciIsIC5kZXNjciA9ICJ0cmlnZ2VyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfZGF0YSwgdHJpZ2dlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyIH0sIHsgLm5hbWUgPSAic3Ryb2JlIiwgLmRlc2NyID0gInN0cm9iZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGEsIHN0cm9iZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NhcHR1cmVfc3Ryb2JlX3NpZ25hbCB9LCB7IC5uYW1lID0gIndpbmRvd19tb2RlIiwgLmRlc2NyID0gIndpbmRvdyBtb2RlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfZGF0YSwgd2luZG93X21vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF90cnhfY2FsaWJyYXRpb25fd2luZG93X21vZGUgfSwgeyAubmFtZSA9ICJvbnVfaWQiLCAuZGVzY3IgPSAib251IGlkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfZGF0YSwgb251X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gInRyaWdnZXJfcG9zaXRpb24iLCAuZGVzY3IgPSAidHJpZ2dlciBwb3NpdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGEsIHRyaWdnZXJfcG9zaXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF90cnhfY2FsaWJyYXRpb25fdHJpZ2dlcl9wb3NpdGlvbiB9LCB7IC5uYW1lID0gInN0b3BfZHVlX3RvX2NvcnJ1cHRfc3Ryb2JlIiwgLmRlc2NyID0gImVuYWJsZS9kaXNhYmxlIGNvcnJ1cHQgc3Ryb2JlIGZyb20gTUFDIHRvIHRlcm1pbmF0ZSBzdGF0IHdpbmRvdyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGEsIHN0b3BfZHVlX3RvX2NvcnJ1cHRfc3Ryb2JlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic3RhcnRfb2Zmc2V0IiwgLmRlc2NyID0gInN0YXJ0IG9mZnNldCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGEsIHN0YXJ0X29mZnNldCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJlbmRfb2Zmc2V0IiwgLmRlc2NyID0gImVuZCBvZmZzZXQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhLCBlbmRfb2Zmc2V0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gIm51bWJlcl9vZl9jeWNsZXMiLCAuZGVzY3IgPSAibnVtYmVyIG9mIGN5Y2xlcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0YXJ0X2NhcHR1cmVfd2luZG93X2RhdGEsIG51bWJlcl9vZl9jeWNsZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhIiwgLmRlc2NyID0gInN0YXJ0IGNhcHR1cmUgd2luZG93IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHRyeF9jYWxpYnJhdGlvbiAtIGNhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGFfd2luZG93ID0geyAubmFtZSA9ICJkYXRhX3dpbmRvdyIsIC5kZXNjciA9ICJkYXRhIHdpbmRvdyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfREFUQV9XSU5ET1csIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGEsIGRhdGFfd2luZG93KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdTMyX2xpc3RfdTMyX21heF81MDBfaGV4IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX3N0cm9iZV93aW5kb3cgPSB7IC5uYW1lID0gInN0cm9iZV93aW5kb3ciLCAuZGVzY3IgPSAic3Ryb2JlIHdpbmRvdyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfU1RST0JFX1dJTkRPVywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YSwgc3Ryb2JlX3dpbmRvdyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3UzMl9saXN0X3UzMl9tYXhfNTAwX2hleCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9lZGdlX3Jpc2VfbWluX21pbiA9IHsgLm5hbWUgPSAiZWRnZV9yaXNlX21pbl9taW4iLCAuZGVzY3IgPSAiZWRnZSByaXNlIG1pbiBtaW4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfUklTRV9NSU5fTUlOLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhLCBlZGdlX3Jpc2VfbWluX21pbiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZWRnZV9yaXNlX21pbl9tYXggPSB7IC5uYW1lID0gImVkZ2VfcmlzZV9taW5fbWF4IiwgLmRlc2NyID0gImVkZ2UgcmlzZSBtaW4gbWF4IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9FREdFX1JJU0VfTUlOX01BWCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YSwgZWRnZV9yaXNlX21pbl9tYXgpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2VkZ2VfcmlzZV9tYXhfbWluID0geyAubmFtZSA9ICJlZGdlX3Jpc2VfbWF4X21pbiIsIC5kZXNjciA9ICJlZGdlIHJpc2UgbWF4IG1pbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9SSVNFX01BWF9NSU4sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGEsIGVkZ2VfcmlzZV9tYXhfbWluKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9lZGdlX3Jpc2VfbWF4X21heCA9IHsgLm5hbWUgPSAiZWRnZV9yaXNlX21heF9tYXgiLCAuZGVzY3IgPSAiZWRnZSByaXNlIG1heCBtYXgiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfUklTRV9NQVhfTUFYLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhLCBlZGdlX3Jpc2VfbWF4X21heCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZWRnZV9mYWxsX21pbl9taW4gPSB7IC5uYW1lID0gImVkZ2VfZmFsbF9taW5fbWluIiwgLmRlc2NyID0gImVkZ2UgZmFsbCBtaW4gbWluICIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9GQUxMX01JTl9NSU4sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGEsIGVkZ2VfZmFsbF9taW5fbWluKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9lZGdlX2ZhbGxfbWluX21heCA9IHsgLm5hbWUgPSAiZWRnZV9mYWxsX21pbl9tYXgiLCAuZGVzY3IgPSAiZWRnZSBmYWxsIG1pbiBtYXgiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX0VER0VfRkFMTF9NSU5fTUFYLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhLCBlZGdlX2ZhbGxfbWluX21heCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZWRnZV9mYWxsX21heF9taW4gPSB7IC5uYW1lID0gImVkZ2VfZmFsbF9tYXhfbWluIiwgLmRlc2NyID0gImVkZ2UgZmFsbCBtYXggbWluIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRF9JRF9FREdFX0ZBTExfTUFYX01JTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YSwgZWRnZV9mYWxsX21heF9taW4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2VkZ2VfZmFsbF9tYXhfbWF4ID0geyAubmFtZSA9ICJlZGdlX2ZhbGxfbWF4X21heCIsIC5kZXNjciA9ICJlZGdlIGZhbGwgbWF4IG1heCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQ0FQVFVSRV9XSU5ET1dfQU5EX1NUQVRJU1RJQ19DT01QTEVURURfSURfRURHRV9GQUxMX01BWF9NQVgsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGEsIGVkZ2VfZmFsbF9tYXhfbWF4KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9yZXN1bHQgPSB7IC5uYW1lID0gInJlc3VsdCIsIC5kZXNjciA9ICJyZXN1bHQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEX0lEX1JFU1VMVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YSwgcmVzdWx0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGFfd2luZG93LCAmcHJvcF9kZXNjcl90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfc3Ryb2JlX3dpbmRvdywgJnByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2VkZ2VfcmlzZV9taW5fbWluLCAmcHJvcF9kZXNjcl90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZWRnZV9yaXNlX21pbl9tYXgsICZwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9lZGdlX3Jpc2VfbWF4X21pbiwgJnByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2VkZ2VfcmlzZV9tYXhfbWF4LCAmcHJvcF9kZXNjcl90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZWRnZV9mYWxsX21pbl9taW4sICZwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9lZGdlX2ZhbGxfbWluX21heCwgJnByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2VkZ2VfZmFsbF9tYXhfbWluLCAmcHJvcF9kZXNjcl90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZWRnZV9mYWxsX21heF9tYXgsICZwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9yZXN1bHQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImRhdGFfd2luZG93IiwgLmRlc2NyID0gImRhdGEgd2luZG93IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YSwgZGF0YV93aW5kb3cpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91MzJfbGlzdF91MzJfbWF4XzUwMF9oZXggfSwgeyAubmFtZSA9ICJzdHJvYmVfd2luZG93IiwgLmRlc2NyID0gInN0cm9iZSB3aW5kb3ciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhLCBzdHJvYmVfd2luZG93KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdTMyX2xpc3RfdTMyX21heF81MDBfaGV4IH0sIHsgLm5hbWUgPSAiZWRnZV9yaXNlX21pbl9taW4iLCAuZGVzY3IgPSAiZWRnZSByaXNlIG1pbiBtaW4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhLCBlZGdlX3Jpc2VfbWluX21pbiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJlZGdlX3Jpc2VfbWluX21heCIsIC5kZXNjciA9ICJlZGdlIHJpc2UgbWluIG1heCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGEsIGVkZ2VfcmlzZV9taW5fbWF4KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImVkZ2VfcmlzZV9tYXhfbWluIiwgLmRlc2NyID0gImVkZ2UgcmlzZSBtYXggbWluIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YSwgZWRnZV9yaXNlX21heF9taW4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZWRnZV9yaXNlX21heF9tYXgiLCAuZGVzY3IgPSAiZWRnZSByaXNlIG1heCBtYXgiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhLCBlZGdlX3Jpc2VfbWF4X21heCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJlZGdlX2ZhbGxfbWluX21pbiIsIC5kZXNjciA9ICJlZGdlIGZhbGwgbWluIG1pbiAiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhLCBlZGdlX2ZhbGxfbWluX21pbiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJlZGdlX2ZhbGxfbWluX21heCIsIC5kZXNjciA9ICJlZGdlIGZhbGwgbWluIG1heCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGEsIGVkZ2VfZmFsbF9taW5fbWF4KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImVkZ2VfZmFsbF9tYXhfbWluIiwgLmRlc2NyID0gImVkZ2UgZmFsbCBtYXggbWluIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YSwgZWRnZV9mYWxsX21heF9taW4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZWRnZV9mYWxsX21heF9tYXgiLCAuZGVzY3IgPSAiZWRnZSBmYWxsIG1heCBtYXgiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhLCBlZGdlX2ZhbGxfbWF4X21heCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyZXN1bHQiLCAuZGVzY3IgPSAicmVzdWx0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YSwgcmVzdWx0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJDYXB0dXJlIHdpbmRvdyBhbmQgc3RhdGlzdGljIGNvbXBsZXRlZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF90cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB0cnhfY2FsaWJyYXRpb24gLSBzdG9wX2NhcHR1cmVfd2luZG93ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfcG9uX25pID0geyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAicG9uX25pIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9TVE9QX0NBUFRVUkVfV0lORE9XX0lEX1BPTl9OSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvd19kYXRhLCBwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB0cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvd19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X3Bvbl9uaSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAicG9uX25pIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvd19kYXRhLCBwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvd19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfZGF0YSIsIC5kZXNjciA9ICJzdG9wIGNhcHR1cmUgd2luZG93IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvd19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHRyeF9jYWxpYnJhdGlvbiAtIGF1dG9fY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkID0geyAubmFtZSA9ICJjYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX0FVVE9fQ0ZHX0lEX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19kYXRhLCBjYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHRyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImNhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfZGF0YSwgY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19kYXRhIiwgLmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF90cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qID09PT0gT2JqZWN0OiB4Z3Bvbl9hbGxvYyA9PT09ICovCisKKy8qIEdyb3VwOiB4Z3Bvbl9hbGxvYyAtIGtleSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX2tleV9wb25fbmkgPSB7IC5uYW1lID0gInBvbl9uaSIsIC5kZXNjciA9ICJQT04gbmV0d29yayBpbnRlcmZhY2UiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fQUxMT0NfS0VZX0lEX1BPTl9OSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX2tleV9hbGxvY19pZCA9IHsgLm5hbWUgPSAiYWxsb2NfaWQiLCAuZGVzY3IgPSAiQWxsb2MgSUQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fQUxMT0NfS0VZX0lEX0FMTE9DX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2tleSwgYWxsb2NfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fYWxsb2Nfa2V5X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fYWxsb2Nfa2V5X3Bvbl9uaSwgJnByb3BfZGVzY3JfeGdwb25fYWxsb2Nfa2V5X2FsbG9jX2lkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19rZXlfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicG9uX25pIiwgLmRlc2NyID0gIlBPTiBuZXR3b3JrIGludGVyZmFjZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2Nfa2V5LCBwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJhbGxvY19pZCIsIC5kZXNjciA9ICJBbGxvYyBJRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2Nfa2V5LCBhbGxvY19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19rZXkgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9hbGxvY19rZXkiLCAuZGVzY3IgPSAia2V5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX2tleSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19rZXlfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfa2V5X2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX2FsbG9jIC0gY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fYWxsb2NfY2ZnX3N0YXRlID0geyAubmFtZSA9ICJzdGF0ZSIsIC5kZXNjciA9ICJDdXJyZW50IEFsbG9jIElEIHN0YXRlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fQUxMT0NfQ0ZHX0lEX1NUQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhLCBzdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FsbG9jX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fYWxsb2NfY2ZnX3NsYSA9IHsgLm5hbWUgPSAic2xhIiwgLmRlc2NyID0gIkFsbG9jIElEIFNMQSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9BTExPQ19DRkdfSURfU0xBLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhLCBzbGEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25fYWxsb2Nfc2xhIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fYWxsb2NfY2ZnX29udV9pZCA9IHsgLm5hbWUgPSAib251X2lkIiwgLmRlc2NyID0gIk9OVSBJRCB0aGUgYWxsb2MgSUQgaXMgYXNzaWduZWQgdG8iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fQUxMT0NfQ0ZHX0lEX09OVV9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19jZmdfZGF0YSwgb251X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX2NmZ19jb2xsZWN0X3N0YXRzID0geyAubmFtZSA9ICJjb2xsZWN0X3N0YXRzIiwgLmRlc2NyID0gIkVuYWJsZSBzdGF0aXN0aWNzIGNvbGxlY3Rpb24gZm9yIHRoaXMgYWxsb2MgSUQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fQUxMT0NfQ0ZHX0lEX0NPTExFQ1RfU1RBVFMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2NfY2ZnX2RhdGEsIGNvbGxlY3Rfc3RhdHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9hbGxvY19jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9hbGxvY19jZmdfc3RhdGUsICZwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX2NmZ19zbGEsICZwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX2NmZ19vbnVfaWQsICZwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX2NmZ19jb2xsZWN0X3N0YXRzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0ZSIsIC5kZXNjciA9ICJDdXJyZW50IEFsbG9jIElEIHN0YXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19jZmdfZGF0YSwgc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hbGxvY19zdGF0ZSB9LCB7IC5uYW1lID0gInNsYSIsIC5kZXNjciA9ICJBbGxvYyBJRCBTTEEiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhLCBzbGEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25fYWxsb2Nfc2xhIH0sIHsgLm5hbWUgPSAib251X2lkIiwgLmRlc2NyID0gIk9OVSBJRCB0aGUgYWxsb2MgSUQgaXMgYXNzaWduZWQgdG8iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhLCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiY29sbGVjdF9zdGF0cyIsIC5kZXNjciA9ICJFbmFibGUgc3RhdGlzdGljcyBjb2xsZWN0aW9uIGZvciB0aGlzIGFsbG9jIElEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19jZmdfZGF0YSwgY29sbGVjdF9zdGF0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fYWxsb2NfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiY2ZnIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX2FsbG9jIC0gY29uZmlndXJhdGlvbl9jb21wbGV0ZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9zdGF0dXMgPSB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fQUxMT0NfQ09ORklHVVJBVElPTl9DT01QTEVURURfSURfU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX25ld19zdGF0ZSA9IHsgLm5hbWUgPSAibmV3X3N0YXRlIiwgLmRlc2NyID0gIm5ldyBzdGF0ZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9BTExPQ19DT05GSUdVUkFUSU9OX0NPTVBMRVRFRF9JRF9ORVdfU1RBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSwgbmV3X3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYWxsb2Nfc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX3N0YXR1cywgJnByb3BfZGVzY3JfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfbmV3X3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJzdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9LCB7IC5uYW1lID0gIm5ld19zdGF0ZSIsIC5kZXNjciA9ICJuZXcgc3RhdGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEsIG5ld19zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FsbG9jX3N0YXRlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEiLCAuZGVzY3IgPSAiQ29uZmlndXJhdGlvbiBDb21wbGV0ZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fYWxsb2MgLSBnZXRfc3RhdHMgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfbnVtX29mX2N5Y2xlcyA9IHsgLm5hbWUgPSAibnVtX29mX2N5Y2xlcyIsIC5kZXNjciA9ICJUaGUgbnVtYmVyIG9mIGN5Y2xlcyB0byBydW4gc3RhdGlzdGljcyBjb2xsZWN0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX0FMTE9DX0dFVF9TVEFUU19JRF9OVU1fT0ZfQ1lDTEVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhLCBudW1fb2ZfY3ljbGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX2FsbG9jX2dldF9zdGF0c19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX2dldF9zdGF0c19udW1fb2ZfY3ljbGVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJudW1fb2ZfY3ljbGVzIiwgLmRlc2NyID0gIlRoZSBudW1iZXIgb2YgY3ljbGVzIHRvIHJ1biBzdGF0aXN0aWNzIGNvbGxlY3Rpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhLCBudW1fb2ZfY3ljbGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzX2RhdGEiLCAuZGVzY3IgPSAiUnVuIHN0YXRpc3RpY3MgY29sbGVjdGlvbiBmb3IgYSBnaXZlbiBwZXJpb2Qgb2YgdGltZSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9hbGxvYyAtIGdldF9hbGxvY19zdGF0c19jb21wbGV0ZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX3N0YXR1cyA9IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gInN0YXR1cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9BTExPQ19HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEX0lEX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfYXZlcmFnZV9uc3JfdXNlZCA9IHsgLm5hbWUgPSAiYXZlcmFnZV9uc3JfdXNlZCIsIC5kZXNjciA9ICJBdmVyYWdlIE5TUiB1c2VkIHdvcmRzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX0FMTE9DX0dFVF9BTExPQ19TVEFUU19DT01QTEVURURfSURfQVZFUkFHRV9OU1JfVVNFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEsIGF2ZXJhZ2VfbnNyX3VzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9hdmVyYWdlX25zcl9hbGxvY2F0ZWQgPSB7IC5uYW1lID0gImF2ZXJhZ2VfbnNyX2FsbG9jYXRlZCIsIC5kZXNjciA9ICJBdmVyYWdlIE5TUiBhbGxvY2F0ZWQgd29yZHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX05TUl9BTExPQ0FURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhLCBhdmVyYWdlX25zcl9hbGxvY2F0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9hdmVyYWdlX3NyX3JlcG9ydCA9IHsgLm5hbWUgPSAiYXZlcmFnZV9zcl9yZXBvcnQiLCAuZGVzY3IgPSAiQXZlcmFnZSBTUiByZXBvcnQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fQUxMT0NfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRF9JRF9BVkVSQUdFX1NSX1JFUE9SVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEsIGF2ZXJhZ2Vfc3JfcmVwb3J0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX3N0YXR1cywgJnByb3BfZGVzY3JfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9hdmVyYWdlX25zcl91c2VkLCAmcHJvcF9kZXNjcl94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2F2ZXJhZ2VfbnNyX2FsbG9jYXRlZCwgJnByb3BfZGVzY3JfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9hdmVyYWdlX3NyX3JlcG9ydCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJzdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH0sIHsgLm5hbWUgPSAiYXZlcmFnZV9uc3JfdXNlZCIsIC5kZXNjciA9ICJBdmVyYWdlIE5TUiB1c2VkIHdvcmRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEsIGF2ZXJhZ2VfbnNyX3VzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiYXZlcmFnZV9uc3JfYWxsb2NhdGVkIiwgLmRlc2NyID0gIkF2ZXJhZ2UgTlNSIGFsbG9jYXRlZCB3b3JkcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhLCBhdmVyYWdlX25zcl9hbGxvY2F0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiYXZlcmFnZV9zcl9yZXBvcnQiLCAuZGVzY3IgPSAiQXZlcmFnZSBTUiByZXBvcnQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YSwgYXZlcmFnZV9zcl9yZXBvcnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhIiwgLmRlc2NyID0gIkNvbGxlY3RlZCBhbGxvYyBJRCBzdGF0aXN0aWNzIGZyb20gZ2V0X3N0YXRzIG9wZXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9hbGxvYyAtIHNldF9zdGF0ZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX3NldF9zdGF0ZV9zdGF0ZSA9IHsgLm5hbWUgPSAic3RhdGUiLCAuZGVzY3IgPSAiU3RhdGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fQUxMT0NfU0VUX1NUQVRFX0lEX1NUQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhLCBzdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FsbG9jX29wZXJhdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX2FsbG9jX3NldF9zdGF0ZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX3NldF9zdGF0ZV9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdGUiLCAuZGVzY3IgPSAiU3RhdGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhLCBzdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2FsbG9jX29wZXJhdGlvbiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGEiLCAuZGVzY3IgPSAiU2V0cyB0aGUgYWxsb2MncyBhY3RpdmF0aW9uIHN0YXRlLiAgVGhpcyBpcyBvbmx5IHVzZWQgZm9yIHByb3RlY3Rpb24gc3dpdGNoaW5nIG9uIGFuIGFjdGl2ZS1zdGFuZGJ5IFBPTi4gIEluIG5vcm1hbCBvcGVyYXRpb24sIHRoaXMgaXNuJ3QgbmVjZXNzYXJ5IHNpbmNlIGFsbG9jcyBhcmUgYWN0aXZhdGVkL2RlYWN0aXZhdGVkIGF1dG9tYXRpY2FsbHkgYWxvbmcgd2l0aCB0aGUgT05VLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9hbGxvYyAtIHN0YXQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9hbGxvY19zdGF0X3J4X2J5dGVzID0geyAubmFtZSA9ICJyeF9ieXRlcyIsIC5kZXNjciA9ICJOdW1iZXIgb2YgYWxsb2MgSUQgcmVjZWl2ZWQgYnl0ZXMuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX0FMTE9DX1NUQVRfSURfUlhfQllURVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9kYXRhLCByeF9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9hbGxvY19zdGF0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fYWxsb2Nfc3RhdF9yeF9ieXRlcyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJ4X2J5dGVzIiwgLmRlc2NyID0gIk51bWJlciBvZiBhbGxvYyBJRCByZWNlaXZlZCBieXRlcy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfZGF0YSwgcnhfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9kYXRhIiwgLmRlc2NyID0gInN0YXQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fYWxsb2MgLSBzdGF0X2NmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX3N0YXRfY2ZnX2NmZyA9IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0NGR19JRF9DRkcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YSwgY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9jb25maWcgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9hbGxvY19zdGF0X2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX3N0YXRfY2ZnX2NmZyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJjZmciLCAuZGVzY3IgPSAiU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhLCBjZmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX2FsbG9jIC0gc3RhdF9hbGFybV9yYWlzZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9zdGF0ID0geyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9BTExPQ19TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9zdGF0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIiwgLmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX2FsbG9jIC0gc3RhdF9hbGFybV9jbGVhcmVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX0FMTE9DX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9pZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9zdGF0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2lkIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaXMgbm8gbG9uZ2VyIG1ldC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fYWxsb2MgLSBhdXRvX2NmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX2F1dG9fY2ZnX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkID0geyAubmFtZSA9ICJjb25maWd1cmF0aW9uX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiY29uZmlndXJhdGlvbl9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19DRkdfSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfZGF0YSwgY29uZmlndXJhdGlvbl9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9hbGxvY19hdXRvX2NmZ19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkID0geyAubmFtZSA9ICJnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fQ0ZHX0lEX0dFVF9BTExPQ19TVEFUU19DT01QTEVURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfZGF0YSwgZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCA9IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fY2xlYXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX2F1dG9fY2ZnX3N0YXRfYWxhcm1fcmFpc2VkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9yYWlzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9hbGxvY19hdXRvX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX2F1dG9fY2ZnX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkLCAmcHJvcF9kZXNjcl94Z3Bvbl9hbGxvY19hdXRvX2NmZ19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkLCAmcHJvcF9kZXNjcl94Z3Bvbl9hbGxvY19hdXRvX2NmZ19zdGF0X2FsYXJtX2NsZWFyZWQsICZwcm9wX2Rlc2NyX3hncG9uX2FsbG9jX2F1dG9fY2ZnX3N0YXRfYWxhcm1fcmFpc2VkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImNvbmZpZ3VyYXRpb25fY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJjb25maWd1cmF0aW9uX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfZGF0YSwgY29uZmlndXJhdGlvbl9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhLCBnZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fY2xlYXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX3JhaXNlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9yYWlzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfZGF0YSIsIC5kZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiA9PT09IE9iamVjdDogeGdwb25fZ2VtX3BvcnQgPT09PSAqLworCisvKiBHcm91cDogeGdwb25fZ2VtX3BvcnQgLSBrZXkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9nZW1fcG9ydF9rZXlfcG9uX25pID0geyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIG5ldHdvcmsgaW50ZXJmYWNlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0tFWV9JRF9QT05fTkksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5LCBwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9nZW1fcG9ydF9rZXlfZ2VtX3BvcnRfaWQgPSB7IC5uYW1lID0gImdlbV9wb3J0X2lkIiwgLmRlc2NyID0gIkdFTSBQT1JUIElEIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0tFWV9JRF9HRU1fUE9SVF9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXksIGdlbV9wb3J0X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX2dlbV9wb3J0X2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX2dlbV9wb3J0X2tleV9wb25fbmksICZwcm9wX2Rlc2NyX3hncG9uX2dlbV9wb3J0X2tleV9nZW1fcG9ydF9pZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5X2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBvbl9uaSIsIC5kZXNjciA9ICJQT04gbmV0d29yayBpbnRlcmZhY2UiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleSwgcG9uX25pKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAiZ2VtX3BvcnRfaWQiLCAuZGVzY3IgPSAiR0VNIFBPUlQgSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleSwgZ2VtX3BvcnRfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5IiwgLmRlc2NyID0gImtleSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9nZW1fcG9ydCAtIGNmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2dlbV9wb3J0X2NmZ19jb25maWd1cmF0aW9uID0geyAubmFtZSA9ICJjb25maWd1cmF0aW9uIiwgLmRlc2NyID0gIkdFTSBwb3J0IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9DRkdfSURfQ09ORklHVVJBVElPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSwgY29uZmlndXJhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9nZW1fcG9ydF9jZmdfb251X2lkID0geyAubmFtZSA9ICJvbnVfaWQiLCAuZGVzY3IgPSAiT05VIElEIHRoaXMgR0VNIHBvcnQgaXMgYXNzaWduZWQgdG8iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX09OVV9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSwgb251X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2dlbV9wb3J0X2NmZ19nZW1fcG9ydF9zdGF0ZSA9IHsgLm5hbWUgPSAiZ2VtX3BvcnRfc3RhdGUiLCAuZGVzY3IgPSAiQ3VycmVudCBHRU0gcG9ydCBzdGF0ZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9HRU1fUE9SVF9TVEFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSwgZ2VtX3BvcnRfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2dlbV9wb3J0X2NmZ19lbmNyeXB0aW9uX21vZGUgPSB7IC5uYW1lID0gImVuY3J5cHRpb25fbW9kZSIsIC5kZXNjciA9ICJFbmFibGUvRGlzYWJsZSB0aGUgZG93bnN0cmVhbSBlbmNyeXB0aW9uIG1vZGUgb2YgdGhlIEdFTSBQb3J0IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0NGR19JRF9FTkNSWVBUSU9OX01PREUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGEsIGVuY3J5cHRpb25fbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9nZW1fcG9ydF9jZmdfdXBzdHJlYW1fZGVzdGluYXRpb25fcXVldWUgPSB7IC5uYW1lID0gInVwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlIiwgLmRlc2NyID0gIlRoZSBkZXN0aW5hdGlvbiBxdWV1ZSBvZiB0aGUgcGFja2V0cyBhcnJpdmluZyBvbiB0aGlzIEdFTSBQb3J0IG9uIHRoZSB1cHN0cmVhbSBkaXJlY3Rpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX1VQU1RSRUFNX0RFU1RJTkFUSU9OX1FVRVVFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19kYXRhLCB1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3VzX2dlbV9wb3J0X2Rlc3RpbmF0aW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fZ2VtX3BvcnRfY2ZnX2NvbnRyb2wgPSB7IC5uYW1lID0gImNvbnRyb2wiLCAuZGVzY3IgPSAiRW5hYmxlL0Rpc2FibGUgdGhlIEdFTSBQb3J0IElEIGluIHRoZSBPTFQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQ0ZHX0lEX0NPTlRST0wsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGEsIGNvbnRyb2wpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb250cm9sX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fZ2VtX3BvcnRfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fZ2VtX3BvcnRfY2ZnX2NvbmZpZ3VyYXRpb24sICZwcm9wX2Rlc2NyX3hncG9uX2dlbV9wb3J0X2NmZ19vbnVfaWQsICZwcm9wX2Rlc2NyX3hncG9uX2dlbV9wb3J0X2NmZ19nZW1fcG9ydF9zdGF0ZSwgJnByb3BfZGVzY3JfeGdwb25fZ2VtX3BvcnRfY2ZnX2VuY3J5cHRpb25fbW9kZSwgJnByb3BfZGVzY3JfeGdwb25fZ2VtX3BvcnRfY2ZnX3Vwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlLCAmcHJvcF9kZXNjcl94Z3Bvbl9nZW1fcG9ydF9jZmdfY29udHJvbCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY29uZmlndXJhdGlvbiIsIC5kZXNjciA9ICJHRU0gcG9ydCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19kYXRhLCBjb25maWd1cmF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ2VtX3BvcnRfY29uZmlndXJhdGlvbiB9LCB7IC5uYW1lID0gIm9udV9pZCIsIC5kZXNjciA9ICJPTlUgSUQgdGhpcyBHRU0gcG9ydCBpcyBhc3NpZ25lZCB0byIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGEsIG9udV9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJnZW1fcG9ydF9zdGF0ZSIsIC5kZXNjciA9ICJDdXJyZW50IEdFTSBwb3J0IHN0YXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSwgZ2VtX3BvcnRfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0ZSB9LCB7IC5uYW1lID0gImVuY3J5cHRpb25fbW9kZSIsIC5kZXNjciA9ICJFbmFibGUvRGlzYWJsZSB0aGUgZG93bnN0cmVhbSBlbmNyeXB0aW9uIG1vZGUgb2YgdGhlIEdFTSBQb3J0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSwgZW5jcnlwdGlvbl9tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY29udHJvbF9zdGF0ZSB9LCB7IC5uYW1lID0gInVwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlIiwgLmRlc2NyID0gIlRoZSBkZXN0aW5hdGlvbiBxdWV1ZSBvZiB0aGUgcGFja2V0cyBhcnJpdmluZyBvbiB0aGlzIEdFTSBQb3J0IG9uIHRoZSB1cHN0cmVhbSBkaXJlY3Rpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZ19kYXRhLCB1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3VzX2dlbV9wb3J0X2Rlc3RpbmF0aW9uIH0sIHsgLm5hbWUgPSAiY29udHJvbCIsIC5kZXNjciA9ICJFbmFibGUvRGlzYWJsZSB0aGUgR0VNIFBvcnQgSUQgaW4gdGhlIE9MVCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGEsIGNvbnRyb2wpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jb250cm9sX3N0YXRlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSIsIC5kZXNjciA9ICJjZmciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fZ2VtX3BvcnQgLSBzdGF0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fZ2VtX3BvcnRfc3RhdF90eF9ieXRlcyA9IHsgLm5hbWUgPSAidHhfYnl0ZXMiLCAuZGVzY3IgPSAiVFggYnl0ZXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9JRF9UWF9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGEsIHR4X2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2dlbV9wb3J0X3N0YXRfdHhfcGFja2V0cyA9IHsgLm5hbWUgPSAidHhfcGFja2V0cyIsIC5kZXNjciA9ICJUWCBwYWNrZXRzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfSURfVFhfUEFDS0VUUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGEsIHR4X3BhY2tldHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fZ2VtX3BvcnRfc3RhdF9yeF9wYWNrZXRzID0geyAubmFtZSA9ICJyeF9wYWNrZXRzIiwgLmRlc2NyID0gIlJYIHBhY2tldHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfU1RBVF9JRF9SWF9QQUNLRVRTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSwgcnhfcGFja2V0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9nZW1fcG9ydF9zdGF0X3J4X2J5dGVzID0geyAubmFtZSA9ICJyeF9ieXRlcyIsIC5kZXNjciA9ICJSWCBieXRlcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0lEX1JYX0JZVEVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSwgcnhfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fZ2VtX3BvcnRfc3RhdF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX2dlbV9wb3J0X3N0YXRfdHhfYnl0ZXMsICZwcm9wX2Rlc2NyX3hncG9uX2dlbV9wb3J0X3N0YXRfdHhfcGFja2V0cywgJnByb3BfZGVzY3JfeGdwb25fZ2VtX3BvcnRfc3RhdF9yeF9wYWNrZXRzLCAmcHJvcF9kZXNjcl94Z3Bvbl9nZW1fcG9ydF9zdGF0X3J4X2J5dGVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAidHhfYnl0ZXMiLCAuZGVzY3IgPSAiVFggYnl0ZXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSwgdHhfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfcGFja2V0cyIsIC5kZXNjciA9ICJUWCBwYWNrZXRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGEsIHR4X3BhY2tldHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfcGFja2V0cyIsIC5kZXNjciA9ICJSWCBwYWNrZXRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGEsIHJ4X3BhY2tldHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfYnl0ZXMiLCAuZGVzY3IgPSAiUlggYnl0ZXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSwgcnhfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9kYXRhIiwgLmRlc2NyID0gInN0YXQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fZ2VtX3BvcnQgLSBzdGF0X2NmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2NmZyA9IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0NGR19JRF9DRkcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YSwgY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9jb25maWcgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2NmZyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJjZmciLCAuZGVzY3IgPSAiU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhLCBjZmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0X2FsYXJtX2NvbmZpZyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX2dlbV9wb3J0IC0gc3RhdF9hbGFybV9yYWlzZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9zdGF0ID0geyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9TVEFUX0FMQVJNX1JBSVNFRF9JRF9TVEFULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9zdGF0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhIiwgLmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX2dlbV9wb3J0IC0gc3RhdF9hbGFybV9jbGVhcmVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX0dFTV9QT1JUX1NUQVRfQUxBUk1fQ0xFQVJFRF9JRF9TVEFULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9pZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9zdGF0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2lkIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaXMgbm8gbG9uZ2VyIG1ldC4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fZ2VtX3BvcnQgLSBhdXRvX2NmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCA9IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fY2xlYXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX3N0YXRfYWxhcm1fcmFpc2VkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3RhdF9hbGFybV9yYWlzZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9yYWlzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCwgJnByb3BfZGVzY3JfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfc3RhdF9hbGFybV9yYWlzZWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX2NsZWFyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fY2xlYXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX3JhaXNlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9yYWlzZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YSIsIC5kZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiA9PT09IE9iamVjdDogeGdwb25faXdmID09PT0gKi8KKworLyogR3JvdXA6IHhncG9uX2l3ZiAtIGtleSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX2l3Zl9rZXlfcG9uX25pID0geyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIG5ldHdvcmsgaW50ZXJmYWNlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX0lXRl9LRVlfSURfUE9OX05JLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2l3Zl9rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX2l3Zl9rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9pd2Zfa2V5X3Bvbl9uaSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25faXdmX2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIG5ldHdvcmsgaW50ZXJmYWNlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9pd2Zfa2V5LCBwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9pd2Zfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25faXdmX2tleSIsIC5kZXNjciA9ICJrZXkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25faXdmX2tleSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9pd2Zfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2l3Zl9rZXlfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25faXdmIC0gY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25faXdmX2NmZ191c19vdGFnX2RpcmVjdF90cGlkID0geyAubmFtZSA9ICJ1c19vdGFnX2RpcmVjdF90cGlkIiwgLmRlc2NyID0gIlRQSUQgdmFsdWUgb2YgdGhlIFZMQU4gdGFnIGFkZGVkIHRvIHVwc3RyZWFtIHBhY2tldCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9JV0ZfQ0ZHX0lEX1VTX09UQUdfRElSRUNUX1RQSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25faXdmX2NmZ19kYXRhLCB1c19vdGFnX2RpcmVjdF90cGlkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdF9oZXggfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9pd2ZfY2ZnX2RzX3RwaWQgPSB7IC5uYW1lID0gImRzX3RwaWQiLCAuZGVzY3IgPSAiUGFja2V0cyBtYXJrZWQgd2l0aCBvbmUgb2YgdGhlIGZpdmUgY29uZmlndXJlZCBEUyBUUElEIG9wdGlvbnMgd2lsbCBiZSBmb3J3YXJkZWQsIGFsbCB0aGUgcmVzdCB3aWxsIGJlIGRyb3BwZWQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fSVdGX0NGR19JRF9EU19UUElELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2l3Zl9jZmdfZGF0YSwgZHNfdHBpZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl91MTZfNV9oZXggfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9pd2ZfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25faXdmX2NmZ191c19vdGFnX2RpcmVjdF90cGlkLCAmcHJvcF9kZXNjcl94Z3Bvbl9pd2ZfY2ZnX2RzX3RwaWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2l3Zl9jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJ1c19vdGFnX2RpcmVjdF90cGlkIiwgLmRlc2NyID0gIlRQSUQgdmFsdWUgb2YgdGhlIFZMQU4gdGFnIGFkZGVkIHRvIHVwc3RyZWFtIHBhY2tldCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25faXdmX2NmZ19kYXRhLCB1c19vdGFnX2RpcmVjdF90cGlkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdF9oZXggfSwgeyAubmFtZSA9ICJkc190cGlkIiwgLmRlc2NyID0gIlBhY2tldHMgbWFya2VkIHdpdGggb25lIG9mIHRoZSBmaXZlIGNvbmZpZ3VyZWQgRFMgVFBJRCBvcHRpb25zIHdpbGwgYmUgZm9yd2FyZGVkLCBhbGwgdGhlIHJlc3Qgd2lsbCBiZSBkcm9wcGVkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2RhdGEsIGRzX3RwaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdTE2XzVfaGV4IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25faXdmX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25faXdmX2NmZ19kYXRhIiwgLmRlc2NyID0gImNmZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9pd2ZfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25faXdmX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2l3Zl9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qID09PT0gT2JqZWN0OiB4Z3Bvbl9uaSA9PT09ICovCisKKy8qIEdyb3VwOiB4Z3Bvbl9uaSAtIGtleSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2tleV9wb25fbmkgPSB7IC5uYW1lID0gInBvbl9uaSIsIC5kZXNjciA9ICJQT04gbmV0d29yayBpbnRlcmZhY2UiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfS0VZX0lEX1BPTl9OSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX25pX2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX25pX2tleV9wb25fbmkgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIG5ldHdvcmsgaW50ZXJmYWNlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2tleSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX2tleSIsIC5kZXNjciA9ICJrZXkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfa2V5KSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2tleV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9rZXlfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fbmkgLSBjZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfaHdfcG9uX2lkID0geyAubmFtZSA9ICJod19wb25faWQiLCAuZGVzY3IgPSAiNTEgYml0IFBPTiBpZGVudGlmaWVyLiBUaGlzIGF0dHJpYnV0ZSBpcyBwYXJ0IG9mIHRoZSBkb3duc3RyZWFtIHBoeXNpY2FsIHN5bmNocm9uaXphdGlvbiBibG9jayAoUFNCZCkiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0hXX1BPTl9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgaHdfcG9uX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfaHdfcG9uX2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX2F2YWlsYWJsZV9iYW5kd2lkdGggPSB7IC5uYW1lID0gImF2YWlsYWJsZV9iYW5kd2lkdGgiLCAuZGVzY3IgPSAiUE9OIGF2YWlsYWJsZSBiYW5kd2lkdGggcGFyYW1ldGVycyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9BVkFJTEFCTEVfQkFORFdJRFRILCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBhdmFpbGFibGVfYmFuZHdpZHRoKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGggfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfbnVtYmVyX29mX2FjdGl2ZV9vbnVzID0geyAubmFtZSA9ICJudW1iZXJfb2ZfYWN0aXZlX29udXMiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIGFjdGl2ZSBPTlVzIG9uIHRoZSBQT04iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTlVNQkVSX09GX0FDVElWRV9PTlVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBudW1iZXJfb2ZfYWN0aXZlX29udXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX3Bvbl9zdGF0dXMgPSB7IC5uYW1lID0gInBvbl9zdGF0dXMiLCAuZGVzY3IgPSAiUE9OIHN0YXR1cyBwYXJhbWV0ZXJzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BPTl9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIHBvbl9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25fc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX3Bvbl9kaXN0YW5jZSA9IHsgLm5hbWUgPSAicG9uX2Rpc3RhbmNlIiwgLmRlc2NyID0gIlBPTiBkaXN0YW5jZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUE9OX0RJU1RBTkNFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBwb25fZGlzdGFuY2UpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25fZGlzdGFuY2UgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfcmFuZ2luZ193aW5kb3dfc2l6ZSA9IHsgLm5hbWUgPSAicmFuZ2luZ193aW5kb3dfc2l6ZSIsIC5kZXNjciA9ICJSYW5naW5nIHdpbmRvdyBzaXplIGluIEJXIHVuaXRzICg0LWJ5dGUgd29yZHMgZm9yIDIuNUcgdXBzdHJlYW0sIDE2LWJ5dGUgYmxvY2tzIGZvciAxMEcgdXBzdHJlYW0pIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1JBTkdJTkdfV0lORE9XX1NJWkUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIHJhbmdpbmdfd2luZG93X3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX2VxZF9jeWNsZXNfbnVtYmVyID0geyAubmFtZSA9ICJlcWRfY3ljbGVzX251bWJlciIsIC5kZXNjciA9ICJIb3cgbWFueSByYW5naW5nIHdpbmRvd3MgYXJlIG9wZW5lZCBkdXJpbmcgYSBzaW5nbGUgT05VIGFjdGl2YXRpb24gcHJvY2VzcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfRVFEX0NZQ0xFU19OVU1CRVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIGVxZF9jeWNsZXNfbnVtYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19kcmlmdF9jb250cm9sID0geyAubmFtZSA9ICJkcmlmdF9jb250cm9sIiwgLmRlc2NyID0gIkRyaWZ0IGNvbnRyb2wgcHJvY2VzcyBjb25maWd1cmF0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9EUklGVF9DT05UUk9MLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBkcmlmdF9jb250cm9sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX2RyaWZ0X2NvbnRyb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfbG9zX2FsYXJtX3RocmVzaG9sZCA9IHsgLm5hbWUgPSAibG9zX2FsYXJtX3RocmVzaG9sZCIsIC5kZXNjciA9ICJMT1MgYWxhcm0gdGhyZXNob2xkIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9MT1NfQUxBUk1fVEhSRVNIT0xELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBsb3NfYWxhcm1fdGhyZXNob2xkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX2xvc19pbml0aWFsX3ZhbHVlID0geyAubmFtZSA9ICJsb3NfaW5pdGlhbF92YWx1ZSIsIC5kZXNjciA9ICJMT1MgaW5pdGlhbCB2YWx1ZSBmb2xsb3dpbmcgUE9OIGFjdGl2YXRpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0xPU19JTklUSUFMX1ZBTFVFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBsb3NfaW5pdGlhbF92YWx1ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19vbnVfYWxhcm1zX3RocmVzaG9sZHMgPSB7IC5uYW1lID0gIm9udV9hbGFybXNfdGhyZXNob2xkcyIsIC5kZXNjciA9ICJPTlUgYWxhcm1zIHRocmVzaG9sZHMgY29uZmlndXJhdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX0FMQVJNU19USFJFU0hPTERTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBvbnVfYWxhcm1zX3RocmVzaG9sZHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfYWxhcm1zX3RocmVzaG9sZHMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfYmVyX21vbml0b3IgPSB7IC5uYW1lID0gImJlcl9tb25pdG9yIiwgLmRlc2NyID0gIkJFUiBtb25pdG9yIHByb2Nlc3MgY29uZmlndXJhdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfQkVSX01PTklUT1IsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIGJlcl9tb25pdG9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYmVyX21vbml0b3JfcGFyYW1zIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX29udV9hY3RpdmF0aW9uID0geyAubmFtZSA9ICJvbnVfYWN0aXZhdGlvbiIsIC5kZXNjciA9ICJPTlUgYWN0aXZhdGlvbiBjb250cm9sIHBhcmFtZXRlcnMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX09OVV9BQ1RJVkFUSU9OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBvbnVfYWN0aXZhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9hY3RpdmF0aW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX3NuX2FjcXVpc2l0aW9uID0geyAubmFtZSA9ICJzbl9hY3F1aXNpdGlvbiIsIC5kZXNjciA9ICJTZXJpYWwgTnVtYmVyIHByb2Nlc3MgY29uZmlndXJhdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfU05fQUNRVUlTSVRJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIHNuX2FjcXVpc2l0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fc25fYWNxdWlzaXRpb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfa2V5X2V4Y2hhbmdlID0geyAubmFtZSA9ICJrZXlfZXhjaGFuZ2UiLCAuZGVzY3IgPSAiS2V5IEV4Y2hhbmdlIHByb2Nlc3MgY29uZmlndXJhdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfS0VZX0VYQ0hBTkdFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBrZXlfZXhjaGFuZ2UpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9rZXlfZXhjaGFuZ2UgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfcHJvdGVjdGlvbl9zd2l0Y2hpbmcgPSB7IC5uYW1lID0gInByb3RlY3Rpb25fc3dpdGNoaW5nIiwgLmRlc2NyID0gIlByb3RlY3Rpb24gc3dpdGNoaW5nIGNvbnRyb2wiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBwcm90ZWN0aW9uX3N3aXRjaGluZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnID0geyAubmFtZSA9ICJwcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1ZyIsIC5kZXNjciA9ICJwcm90ZWN0aW9uIHN3aXRjaGluZyBkZWJ1ZyAiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX0RFQlVHLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1ZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX2Nicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUgPSB7IC5uYW1lID0gImNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUiLCAuZGVzY3IgPSAiQ0JSIFJlYWwgVGltZSBhbGxvY2F0aW9uIHByb2ZpbGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0NCUl9SVF9BTExPQ0FUSU9OX1BST0ZJTEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIGNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX2Nicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlID0geyAubmFtZSA9ICJjYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZSIsIC5kZXNjciA9ICJDQlIgbm9uIFJlYWwgVGltZSBhbGxvY2F0aW9uIHByb2ZpbGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0NCUl9OUlRfQUxMT0NBVElPTl9QUk9GSUxFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBjYnJfbnJ0X2FsbG9jYXRpb25fcHJvZmlsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl91MTZfMiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19wb3dlcl9tYW5hZ2VtZW50ID0geyAubmFtZSA9ICJwb3dlcl9tYW5hZ2VtZW50IiwgLmRlc2NyID0gIk9OVSBwb3dlciBtYW5hZ2VtZW50IGNvbnRyb2wiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BPV0VSX01BTkFHRU1FTlQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIHBvd2VyX21hbmFnZW1lbnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9vbnVfcG93ZXJfbWFuYWdlbWVudF9jb25maWd1cmF0aW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX3JvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcyA9IHsgLm5hbWUgPSAicm9ndWVfb251X2RldGVjdGlvbl9wcm9jZXNzIiwgLmRlc2NyID0gIlRCRCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUk9HVUVfT05VX0RFVEVDVElPTl9QUk9DRVNTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCByb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyA9IHsgLm5hbWUgPSAicGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyIsIC5kZXNjciA9ICJQZXJpb2RpYyBTdGFuZGJ5IFBPTiBtb25pdG9yaW5nIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QRVJJT0RJQ19TVEFOREJZX1BPTl9NT05JVE9SSU5HLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBwZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19kYmFfbW9kZSA9IHsgLm5hbWUgPSAiZGJhX21vZGUiLCAuZGVzY3IgPSAiREJBIG1vZGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RCQV9NT0RFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBkYmFfbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2RiYV9tb2RlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX3Bsb2FtX2hhbmRsaW5nID0geyAubmFtZSA9ICJwbG9hbV9oYW5kbGluZyIsIC5kZXNjciA9ICJQbG9hbSBoYW5kbGluZyBjb25maWd1cmF0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9QTE9BTV9IQU5ETElORywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgcGxvYW1faGFuZGxpbmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9wbG9hbV9oYW5kbGluZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19taW5fZGF0YV9hbGxvY19pZCA9IHsgLm5hbWUgPSAibWluX2RhdGFfYWxsb2NfaWQiLCAuZGVzY3IgPSAiTWluIGRhdGEgQWxsb2MgSUQgdmFsdWUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX01JTl9EQVRBX0FMTE9DX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBtaW5fZGF0YV9hbGxvY19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfbWluX2RhdGFfZ2VtX3BvcnRfaWQgPSB7IC5uYW1lID0gIm1pbl9kYXRhX2dlbV9wb3J0X2lkIiwgLmRlc2NyID0gIk1pbiBkYXRhIFhHRU0gcG9ydCBJRCB2YWx1ZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTUlOX0RBVEFfR0VNX1BPUlRfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIG1pbl9kYXRhX2dlbV9wb3J0X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19tdWx0aWNhc3Rfa2V5ID0geyAubmFtZSA9ICJtdWx0aWNhc3Rfa2V5IiwgLmRlc2NyID0gIk11bHRpY2FzdCBYR0VNIHBvcnRzIGVuY3J5cHRpb24gY29udHJvbCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfTVVMVElDQVNUX0tFWSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgbXVsdGljYXN0X2tleSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX211bHRpY2FzdF9rZXkgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfcHJic19jaGVja2VyID0geyAubmFtZSA9ICJwcmJzX2NoZWNrZXIiLCAuZGVzY3IgPSAiVVMgUFJCUyBjaGVja2VyIGNvbmZpZ3VyYXRpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BSQlNfQ0hFQ0tFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgcHJic19jaGVja2VyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcHJic19jaGVja2VyX2NvbmZpZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19wcmJzX2dlbmVyYXRvciA9IHsgLm5hbWUgPSAicHJic19nZW5lcmF0b3IiLCAuZGVzY3IgPSAiRFMgUFJCUyBnZW5lcmF0b3IgY29uZmlndXJhdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfUFJCU19HRU5FUkFUT1IsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIHByYnNfZ2VuZXJhdG9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcHJic19nZW5lcmF0b3JfY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX3ByYnNfc3RhdHVzID0geyAubmFtZSA9ICJwcmJzX3N0YXR1cyIsIC5kZXNjciA9ICJSZXN1bHQgb2YgVVMgUFJCUyBjaGVja2VyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1BSQlNfU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBwcmJzX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3ByYnNfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uID0geyAubmFtZSA9ICJhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiIsIC5kZXNjciA9ICJPcHRpb24gdG8gZGlzYWJsZSB0aGUgYXV0b21hdGljIGRlYWN0aXZhdGlvbiBvZiBPTlVzIGR1ZSB0byBhbGFybXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0FVVE9NQVRJQ19PTlVfREVBQ1RJVkFUSU9OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBhdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2F1dG9tYXRpY19vbnVfZGVhY3RpdmF0aW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX3VzX2JhbmR3aWR0aF9saW1pdCA9IHsgLm5hbWUgPSAidXNfYmFuZHdpZHRoX2xpbWl0IiwgLmRlc2NyID0gIlRvdGFsIFBPTiB1cHN0cmVhbSBiYW5kd2lkdGggbGltaXQgaW4gYnl0ZXMgcGVyIHNlY29uZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX1VTX0JBTkRXSURUSF9MSU1JVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgdXNfYmFuZHdpZHRoX2xpbWl0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19hbGxfb251cyA9IHsgLm5hbWUgPSAiYWxsX29udXMiLCAuZGVzY3IgPSAiQWxsIE9OVXMgY3VycmVudGx5IHByb3Zpc2lvbmVkIG9uIHRoaXMgUE9OLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9BTExfT05VUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgYWxsX29udXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfNTEwIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX2FsbF9tY2FzdF9nZW1fcG9ydHMgPSB7IC5uYW1lID0gImFsbF9tY2FzdF9nZW1fcG9ydHMiLCAuZGVzY3IgPSAiQWxsIG11bHRpY2FzdCBHRU0gcG9ydHMgY3VycmVudGx5IHByb3Zpc2lvbmVkIG9uIHRoaXMgUE9OLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9BTExfTUNBU1RfR0VNX1BPUlRTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBhbGxfbWNhc3RfZ2VtX3BvcnRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX2RlYnVnID0geyAubmFtZSA9ICJkZWJ1ZyIsIC5kZXNjciA9ICJQT04gTkkgZGVidWcgcGFyYW1ldGVycyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfREVCVUcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIGRlYnVnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfZGVidWcgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfb251X3VwZ3JhZGVfcGFyYW1zID0geyAubmFtZSA9ICJvbnVfdXBncmFkZV9wYXJhbXMiLCAuZGVzY3IgPSAiT05VIHVwZ3JhZGUgcGFyYW1zIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0NGR19JRF9PTlVfVVBHUkFERV9QQVJBTVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIG9udV91cGdyYWRlX3BhcmFtcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX2RzX2ZlY19tb2RlID0geyAubmFtZSA9ICJkc19mZWNfbW9kZSIsIC5kZXNjciA9ICJEUyBGRUMgbW9kZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfRFNfRkVDX01PREUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIGRzX2ZlY19tb2RlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfY29udHJvbF9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19kYmFfdHlwZSA9IHsgLm5hbWUgPSAiZGJhX3R5cGUiLCAuZGVzY3IgPSAiREJBIGltcGxlbWVudGF0aW9uIHR5cGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQ0ZHX0lEX0RCQV9UWVBFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBkYmFfdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2RiYV90eXBlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX29udV90dW5pbmcgPSB7IC5uYW1lID0gIm9udV90dW5pbmciLCAuZGVzY3IgPSAib251IHR1bmluZyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9DRkdfSURfT05VX1RVTklORywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgb251X3R1bmluZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X29udV90dW5pbmdfY29uZmlndXJhdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX25pX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19od19wb25faWQsICZwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19hdmFpbGFibGVfYmFuZHdpZHRoLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfbnVtYmVyX29mX2FjdGl2ZV9vbnVzLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfcG9uX3N0YXR1cywgJnByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX3Bvbl9kaXN0YW5jZSwgJnByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX3Jhbmdpbmdfd2luZG93X3NpemUsICZwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19lcWRfY3ljbGVzX251bWJlciwgJnByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX2RyaWZ0X2NvbnRyb2wsICZwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19sb3NfYWxhcm1fdGhyZXNob2xkLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfbG9zX2luaXRpYWxfdmFsdWUsICZwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19vbnVfYWxhcm1zX3RocmVzaG9sZHMsICZwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19iZXJfbW9uaXRvciwgJnByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX29udV9hY3RpdmF0aW9uLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfc25fYWNxdWlzaXRpb24sICZwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19rZXlfZXhjaGFuZ2UsICZwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19wcm90ZWN0aW9uX3N3aXRjaGluZywgJnByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSwgJnByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX2Nicl9ucnRfYWxsb2NhdGlvbl9wcm9maWxlLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfcG93ZXJfbWFuYWdlbWVudCwgJnByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX3JvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcywgJnByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX3BlcmlvZGljX3N0YW5kYnlfcG9uX21vbml0b3JpbmcsICZwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19kYmFfbW9kZSwgJnByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX3Bsb2FtX2hhbmRsaW5nLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfbWluX2RhdGFfYWxsb2NfaWQsICZwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19taW5fZGF0YV9nZW1fcG9ydF9pZCwgJnByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX211bHRpY2FzdF9rZXksICZwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19wcmJzX2NoZWNrZXIsICZwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19wcmJzX2dlbmVyYXRvciwgJnByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX3ByYnNfc3RhdHVzLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24sICZwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ191c19iYW5kd2lkdGhfbGltaXQsICZwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19hbGxfb251cywgJnByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX2FsbF9tY2FzdF9nZW1fcG9ydHMsICZwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19kZWJ1ZywgJnByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX29udV91cGdyYWRlX3BhcmFtcywgJnByb3BfZGVzY3JfeGdwb25fbmlfY2ZnX2RzX2ZlY19tb2RlLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9jZmdfZGJhX3R5cGUsICZwcm9wX2Rlc2NyX3hncG9uX25pX2NmZ19vbnVfdHVuaW5nIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJod19wb25faWQiLCAuZGVzY3IgPSAiNTEgYml0IFBPTiBpZGVudGlmaWVyLiBUaGlzIGF0dHJpYnV0ZSBpcyBwYXJ0IG9mIHRoZSBkb3duc3RyZWFtIHBoeXNpY2FsIHN5bmNocm9uaXphdGlvbiBibG9jayAoUFNCZCkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBod19wb25faWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9od19wb25faWQgfSwgeyAubmFtZSA9ICJhdmFpbGFibGVfYmFuZHdpZHRoIiwgLmRlc2NyID0gIlBPTiBhdmFpbGFibGUgYmFuZHdpZHRoIHBhcmFtZXRlcnMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBhdmFpbGFibGVfYmFuZHdpZHRoKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX2F2YWlsYWJsZV9iYW5kd2lkdGggfSwgeyAubmFtZSA9ICJudW1iZXJfb2ZfYWN0aXZlX29udXMiLCAuZGVzY3IgPSAiTnVtYmVyIG9mIGFjdGl2ZSBPTlVzIG9uIHRoZSBQT04iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBudW1iZXJfb2ZfYWN0aXZlX29udXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAicG9uX3N0YXR1cyIsIC5kZXNjciA9ICJQT04gc3RhdHVzIHBhcmFtZXRlcnMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBwb25fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX3N0YXR1cyB9LCB7IC5uYW1lID0gInBvbl9kaXN0YW5jZSIsIC5kZXNjciA9ICJQT04gZGlzdGFuY2UiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBwb25fZGlzdGFuY2UpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25fZGlzdGFuY2UgfSwgeyAubmFtZSA9ICJyYW5naW5nX3dpbmRvd19zaXplIiwgLmRlc2NyID0gIlJhbmdpbmcgd2luZG93IHNpemUgaW4gQlcgdW5pdHMgKDQtYnl0ZSB3b3JkcyBmb3IgMi41RyB1cHN0cmVhbSwgMTYtYnl0ZSBibG9ja3MgZm9yIDEwRyB1cHN0cmVhbSkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCByYW5naW5nX3dpbmRvd19zaXplKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImVxZF9jeWNsZXNfbnVtYmVyIiwgLmRlc2NyID0gIkhvdyBtYW55IHJhbmdpbmcgd2luZG93cyBhcmUgb3BlbmVkIGR1cmluZyBhIHNpbmdsZSBPTlUgYWN0aXZhdGlvbiBwcm9jZXNzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgZXFkX2N5Y2xlc19udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiZHJpZnRfY29udHJvbCIsIC5kZXNjciA9ICJEcmlmdCBjb250cm9sIHByb2Nlc3MgY29uZmlndXJhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIGRyaWZ0X2NvbnRyb2wpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25fZHJpZnRfY29udHJvbCB9LCB7IC5uYW1lID0gImxvc19hbGFybV90aHJlc2hvbGQiLCAuZGVzY3IgPSAiTE9TIGFsYXJtIHRocmVzaG9sZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIGxvc19hbGFybV90aHJlc2hvbGQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJsb3NfaW5pdGlhbF92YWx1ZSIsIC5kZXNjciA9ICJMT1MgaW5pdGlhbCB2YWx1ZSBmb2xsb3dpbmcgUE9OIGFjdGl2YXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBsb3NfaW5pdGlhbF92YWx1ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9LCB7IC5uYW1lID0gIm9udV9hbGFybXNfdGhyZXNob2xkcyIsIC5kZXNjciA9ICJPTlUgYWxhcm1zIHRocmVzaG9sZHMgY29uZmlndXJhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIG9udV9hbGFybXNfdGhyZXNob2xkcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9hbGFybXNfdGhyZXNob2xkcyB9LCB7IC5uYW1lID0gImJlcl9tb25pdG9yIiwgLmRlc2NyID0gIkJFUiBtb25pdG9yIHByb2Nlc3MgY29uZmlndXJhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIGJlcl9tb25pdG9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYmVyX21vbml0b3JfcGFyYW1zIH0sIHsgLm5hbWUgPSAib251X2FjdGl2YXRpb24iLCAuZGVzY3IgPSAiT05VIGFjdGl2YXRpb24gY29udHJvbCBwYXJhbWV0ZXJzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgb251X2FjdGl2YXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfYWN0aXZhdGlvbiB9LCB7IC5uYW1lID0gInNuX2FjcXVpc2l0aW9uIiwgLmRlc2NyID0gIlNlcmlhbCBOdW1iZXIgcHJvY2VzcyBjb25maWd1cmF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgc25fYWNxdWlzaXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9zbl9hY3F1aXNpdGlvbiB9LCB7IC5uYW1lID0gImtleV9leGNoYW5nZSIsIC5kZXNjciA9ICJLZXkgRXhjaGFuZ2UgcHJvY2VzcyBjb25maWd1cmF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwga2V5X2V4Y2hhbmdlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fa2V5X2V4Y2hhbmdlIH0sIHsgLm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hpbmciLCAuZGVzY3IgPSAiUHJvdGVjdGlvbiBzd2l0Y2hpbmcgY29udHJvbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIHByb3RlY3Rpb25fc3dpdGNoaW5nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmcgfSwgeyAubmFtZSA9ICJwcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1ZyIsIC5kZXNjciA9ICJwcm90ZWN0aW9uIHN3aXRjaGluZyBkZWJ1ZyAiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBwcm90ZWN0aW9uX3N3aXRjaGluZ19kZWJ1ZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RlYnVnIH0sIHsgLm5hbWUgPSAiY2JyX3J0X2FsbG9jYXRpb25fcHJvZmlsZSIsIC5kZXNjciA9ICJDQlIgUmVhbCBUaW1lIGFsbG9jYXRpb24gcHJvZmlsZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIGNicl9ydF9hbGxvY2F0aW9uX3Byb2ZpbGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9jYnJfcnRfYWxsb2NhdGlvbl9wcm9maWxlIH0sIHsgLm5hbWUgPSAiY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUiLCAuZGVzY3IgPSAiQ0JSIG5vbiBSZWFsIFRpbWUgYWxsb2NhdGlvbiBwcm9maWxlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgY2JyX25ydF9hbGxvY2F0aW9uX3Byb2ZpbGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdTE2XzIgfSwgeyAubmFtZSA9ICJwb3dlcl9tYW5hZ2VtZW50IiwgLmRlc2NyID0gIk9OVSBwb3dlciBtYW5hZ2VtZW50IGNvbnRyb2wiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBwb3dlcl9tYW5hZ2VtZW50KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb251X3Bvd2VyX21hbmFnZW1lbnRfY29uZmlndXJhdGlvbiB9LCB7IC5uYW1lID0gInJvZ3VlX29udV9kZXRlY3Rpb25fcHJvY2VzcyIsIC5kZXNjciA9ICJUQkQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCByb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9vbnVfZGV0ZWN0aW9uX3Byb2Nlc3MgfSwgeyAubmFtZSA9ICJwZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nIiwgLmRlc2NyID0gIlBlcmlvZGljIFN0YW5kYnkgUE9OIG1vbml0b3JpbmciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBwZXJpb2RpY19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcGVyaW9kaWNfc3RhbmRieV9wb25fbW9uaXRvcmluZyB9LCB7IC5uYW1lID0gImRiYV9tb2RlIiwgLmRlc2NyID0gIkRCQSBtb2RlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgZGJhX21vZGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9kYmFfbW9kZSB9LCB7IC5uYW1lID0gInBsb2FtX2hhbmRsaW5nIiwgLmRlc2NyID0gIlBsb2FtIGhhbmRsaW5nIGNvbmZpZ3VyYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBwbG9hbV9oYW5kbGluZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3Bsb2FtX2hhbmRsaW5nIH0sIHsgLm5hbWUgPSAibWluX2RhdGFfYWxsb2NfaWQiLCAuZGVzY3IgPSAiTWluIGRhdGEgQWxsb2MgSUQgdmFsdWUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBtaW5fZGF0YV9hbGxvY19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJtaW5fZGF0YV9nZW1fcG9ydF9pZCIsIC5kZXNjciA9ICJNaW4gZGF0YSBYR0VNIHBvcnQgSUQgdmFsdWUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBtaW5fZGF0YV9nZW1fcG9ydF9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJtdWx0aWNhc3Rfa2V5IiwgLmRlc2NyID0gIk11bHRpY2FzdCBYR0VNIHBvcnRzIGVuY3J5cHRpb24gY29udHJvbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIG11bHRpY2FzdF9rZXkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9tdWx0aWNhc3Rfa2V5IH0sIHsgLm5hbWUgPSAicHJic19jaGVja2VyIiwgLmRlc2NyID0gIlVTIFBSQlMgY2hlY2tlciBjb25maWd1cmF0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgcHJic19jaGVja2VyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcHJic19jaGVja2VyX2NvbmZpZyB9LCB7IC5uYW1lID0gInByYnNfZ2VuZXJhdG9yIiwgLmRlc2NyID0gIkRTIFBSQlMgZ2VuZXJhdG9yIGNvbmZpZ3VyYXRpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBwcmJzX2dlbmVyYXRvciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3ByYnNfZ2VuZXJhdG9yX2NvbmZpZyB9LCB7IC5uYW1lID0gInByYnNfc3RhdHVzIiwgLmRlc2NyID0gIlJlc3VsdCBvZiBVUyBQUkJTIGNoZWNrZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBwcmJzX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3ByYnNfc3RhdHVzIH0sIHsgLm5hbWUgPSAiYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24iLCAuZGVzY3IgPSAiT3B0aW9uIHRvIGRpc2FibGUgdGhlIGF1dG9tYXRpYyBkZWFjdGl2YXRpb24gb2YgT05VcyBkdWUgdG8gYWxhcm1zIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgYXV0b21hdGljX29udV9kZWFjdGl2YXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hdXRvbWF0aWNfb251X2RlYWN0aXZhdGlvbiB9LCB7IC5uYW1lID0gInVzX2JhbmR3aWR0aF9saW1pdCIsIC5kZXNjciA9ICJUb3RhbCBQT04gdXBzdHJlYW0gYmFuZHdpZHRoIGxpbWl0IGluIGJ5dGVzIHBlciBzZWNvbmQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSwgdXNfYmFuZHdpZHRoX2xpbWl0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImFsbF9vbnVzIiwgLmRlc2NyID0gIkFsbCBPTlVzIGN1cnJlbnRseSBwcm92aXNpb25lZCBvbiB0aGlzIFBPTi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBhbGxfb251cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV93aXRoX3N0YXRlX2xpc3RfdTE2X21heF81MTAgfSwgeyAubmFtZSA9ICJhbGxfbWNhc3RfZ2VtX3BvcnRzIiwgLmRlc2NyID0gIkFsbCBtdWx0aWNhc3QgR0VNIHBvcnRzIGN1cnJlbnRseSBwcm92aXNpb25lZCBvbiB0aGlzIFBPTi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBhbGxfbWNhc3RfZ2VtX3BvcnRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMTI4IH0sIHsgLm5hbWUgPSAiZGVidWciLCAuZGVzY3IgPSAiUE9OIE5JIGRlYnVnIHBhcmFtZXRlcnMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBkZWJ1ZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2RlYnVnIH0sIHsgLm5hbWUgPSAib251X3VwZ3JhZGVfcGFyYW1zIiwgLmRlc2NyID0gIk9OVSB1cGdyYWRlIHBhcmFtcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIG9udV91cGdyYWRlX3BhcmFtcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfcGFyYW1zIH0sIHsgLm5hbWUgPSAiZHNfZmVjX21vZGUiLCAuZGVzY3IgPSAiRFMgRkVDIG1vZGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBkc19mZWNfbW9kZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2NvbnRyb2xfc3RhdGUgfSwgeyAubmFtZSA9ICJkYmFfdHlwZSIsIC5kZXNjciA9ICJEQkEgaW1wbGVtZW50YXRpb24gdHlwZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEsIGRiYV90eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZGJhX3R5cGUgfSwgeyAubmFtZSA9ICJvbnVfdHVuaW5nIiwgLmRlc2NyID0gIm9udSB0dW5pbmciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhLCBvbnVfdHVuaW5nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb251X3R1bmluZ19jb25maWd1cmF0aW9uIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9jZmdfZGF0YSIsIC5kZXNjciA9ICJjZmciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fbmkgLSBzdGF0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9mZWNfY29kZXdvcmRzID0geyAubmFtZSA9ICJmZWNfY29kZXdvcmRzIiwgLmRlc2NyID0gIlJlY2VpdmUgRkVDIGNvZGV3b3JkcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX0ZFQ19DT0RFV09SRFMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCBmZWNfY29kZXdvcmRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfYmlwMzJfYnl0ZXMgPSB7IC5uYW1lID0gImJpcDMyX2J5dGVzIiwgLmRlc2NyID0gIlJlY2VpdmVkIGJ5dGVzIHByb3RlY3RlZCBieSBiaXAzMiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX0JJUDMyX0JZVEVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgYmlwMzJfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9iaXAzMl9lcnJvcnMgPSB7IC5uYW1lID0gImJpcDMyX2Vycm9ycyIsIC5kZXNjciA9ICJSZWNlaXZlZCBiaXAzMiBlcnJvcnMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9CSVAzMl9FUlJPUlMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCBiaXAzMl9lcnJvcnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9yeF94Z3RjX2hlYWRlcnMgPSB7IC5uYW1lID0gInJ4X3hndGNfaGVhZGVycyIsIC5kZXNjciA9ICJSZWNlaXZlZCB2YWxpZCBYR1RDIGhlYWRlcnMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR1RDX0hFQURFUlMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF94Z3RjX2hlYWRlcnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9yeF94Z3RjX2NvcnJlY3RlZCA9IHsgLm5hbWUgPSAicnhfeGd0Y19jb3JyZWN0ZWQiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgY29ycmVjdGVkIFhHVEMgaGVhZGVycyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHVENfQ09SUkVDVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgcnhfeGd0Y19jb3JyZWN0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9yeF94Z3RjX3VuY29ycmVjdGVkID0geyAubmFtZSA9ICJyeF94Z3RjX3VuY29ycmVjdGVkIiwgLmRlc2NyID0gIlJlY2VpdmVkIHVuY29ycmVjdGVkIFhHVEMgaGVhZGVycyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHVENfVU5DT1JSRUNURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF94Z3RjX3VuY29ycmVjdGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfeGdlbSA9IHsgLm5hbWUgPSAicnhfeGdlbSIsIC5kZXNjciA9ICJSZWNlaXZlZCB2YWxpZCBYR0VNIGZyYW1lcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHRU0sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF94Z2VtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfeGdlbV9kcm9wcGVkID0geyAubmFtZSA9ICJyeF94Z2VtX2Ryb3BwZWQiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgZHJvcHBlZCBYR0VNIElEIGZyYW1lcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1hHRU1fRFJPUFBFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X3hnZW1fZHJvcHBlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3J4X3hnZW1faWRsZSA9IHsgLm5hbWUgPSAicnhfeGdlbV9pZGxlIiwgLmRlc2NyID0gIlJlY2VpdmVkIGlkbGUgWEdFTSBmcmFtZXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9YR0VNX0lETEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF94Z2VtX2lkbGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9yeF94Z2VtX2NvcnJlY3RlZCA9IHsgLm5hbWUgPSAicnhfeGdlbV9jb3JyZWN0ZWQiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgY29ycmVjdGVkIFhHRU0gZnJhbWVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfWEdFTV9DT1JSRUNURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF94Z2VtX2NvcnJlY3RlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3J4X2NyY19lcnJvciA9IHsgLm5hbWUgPSAicnhfY3JjX2Vycm9yIiwgLmRlc2NyID0gIlJlY2VpdmVkIHBhY2tldHMgd2l0aCBDUkMgZXJyb3IiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9DUkNfRVJST1IsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF9jcmNfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9yeF9mcmFnbWVudF9lcnJvciA9IHsgLm5hbWUgPSAicnhfZnJhZ21lbnRfZXJyb3IiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgZnJhZ21lbnQgZXJyb3JzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfRlJBR01FTlRfRVJST1IsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF9mcmFnbWVudF9lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3J4X3BhY2tldHNfZHJvcHBlZCA9IHsgLm5hbWUgPSAicnhfcGFja2V0c19kcm9wcGVkIiwgLmRlc2NyID0gIkdsb2JhbCBkcm9wcGVkIHBhY2tldHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9QQUNLRVRTX0RST1BQRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF9wYWNrZXRzX2Ryb3BwZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9yeF9kcm9wcGVkX3Rvb19zaG9ydCA9IHsgLm5hbWUgPSAicnhfZHJvcHBlZF90b29fc2hvcnQiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgcGFja2V0cyBkcm9wcGVkIGR1ZSB0byBsZW5ndGggdG9vIHNob3J0IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfRFJPUFBFRF9UT09fU0hPUlQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF9kcm9wcGVkX3Rvb19zaG9ydCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3J4X2Ryb3BwZWRfdG9vX2xvbmcgPSB7IC5uYW1lID0gInJ4X2Ryb3BwZWRfdG9vX2xvbmciLCAuZGVzY3IgPSAiUmVjZWl2ZWQgcGFja2V0IGRyb3BwZWQgZHVlIHRvIGxlbmd0aCB0b28gbG9uZyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0RST1BQRURfVE9PX0xPTkcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF9kcm9wcGVkX3Rvb19sb25nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfa2V5X2Vycm9yID0geyAubmFtZSA9ICJyeF9rZXlfZXJyb3IiLCAuZGVzY3IgPSAiUmVjZWl2ZWQga2V5IGVycm9ycyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX0tFWV9FUlJPUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X2tleV9lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3R4X3Bsb2FtcyA9IHsgLm5hbWUgPSAidHhfcGxvYW1zIiwgLmRlc2NyID0gIlRyYW5zbWl0dGVkIFBsb2FtcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX1BMT0FNUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHR4X3Bsb2FtcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3J4X3Bsb2Ftc19kcm9wcGVkID0geyAubmFtZSA9ICJyeF9wbG9hbXNfZHJvcHBlZCIsIC5kZXNjciA9ICJSZWNlaXZlZCBkcm9wcGVkIFBsb2FtcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX1BMT0FNU19EUk9QUEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgcnhfcGxvYW1zX2Ryb3BwZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9yeF9hbGxvY2F0aW9uc192YWxpZCA9IHsgLm5hbWUgPSAicnhfYWxsb2NhdGlvbnNfdmFsaWQiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgdmFsaWQgYWxsb2NhdGlvbnMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19WQUxJRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X2FsbG9jYXRpb25zX3ZhbGlkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfYWxsb2NhdGlvbnNfaW52YWxpZCA9IHsgLm5hbWUgPSAicnhfYWxsb2NhdGlvbnNfaW52YWxpZCIsIC5kZXNjciA9ICJSZWNlaXZlZCBpbnZhbGlkIGFsbG9jYXRpb25zIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfQUxMT0NBVElPTlNfSU5WQUxJRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X2FsbG9jYXRpb25zX2ludmFsaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9yeF9hbGxvY2F0aW9uc19kaXNhYmxlZCA9IHsgLm5hbWUgPSAicnhfYWxsb2NhdGlvbnNfZGlzYWJsZWQiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgZGlzYWJsZWQgYWxsb2NhdGlvbnMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9BTExPQ0FUSU9OU19ESVNBQkxFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X2FsbG9jYXRpb25zX2Rpc2FibGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfcGxvYW1zID0geyAubmFtZSA9ICJyeF9wbG9hbXMiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgUGxvYW1zIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUExPQU1TLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgcnhfcGxvYW1zKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfcGxvYW1zX25vbl9pZGxlID0geyAubmFtZSA9ICJyeF9wbG9hbXNfbm9uX2lkbGUiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgbm9uIGlkbGUgUGxvYW1zIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX05PTl9JRExFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgcnhfcGxvYW1zX25vbl9pZGxlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfcGxvYW1zX2Vycm9yID0geyAubmFtZSA9ICJyeF9wbG9hbXNfZXJyb3IiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgZXJyb3IgUGxvYW1zIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfUExPQU1TX0VSUk9SLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgcnhfcGxvYW1zX2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfY3B1ID0geyAubmFtZSA9ICJyeF9jcHUiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgQ1BVIHBhY2tldHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9SWF9DUFUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF9jcHUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9yeF9vbWNpID0geyAubmFtZSA9ICJyeF9vbWNpIiwgLmRlc2NyID0gIlJlY2VpdmVkIE9NQ0kgcGFja2V0cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1JYX09NQ0ksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF9vbWNpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciA9IHsgLm5hbWUgPSAicnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciIsIC5kZXNjciA9ICJSZWNlaXZlZCBPTUNJIHBhY2tldHMgd2l0aCBDUkMgZXJyb3JzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF90eF9wYWNrZXRzID0geyAubmFtZSA9ICJ0eF9wYWNrZXRzIiwgLmRlc2NyID0gIlRyYW5zbWl0dGVkIHBhY2tldHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9QQUNLRVRTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgdHhfcGFja2V0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3R4X3hnZW0gPSB7IC5uYW1lID0gInR4X3hnZW0iLCAuZGVzY3IgPSAiVHJhbnNtaXR0ZWQgWEdFTSBmcmFnbWVudHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9YR0VNLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgdHhfeGdlbSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3R4X2NwdSA9IHsgLm5hbWUgPSAidHhfY3B1IiwgLmRlc2NyID0gIlRyYW5zbWl0dGVkIENQVSBwYWNrZXRzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfQ1BVLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgdHhfY3B1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfdHhfb21jaSA9IHsgLm5hbWUgPSAidHhfb21jaSIsIC5kZXNjciA9ICJUcmFuc21pdHRlZCBPTUNJIHBhY2tldHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9PTUNJLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgdHhfb21jaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3R4X2NwdV9vbWNpX3BhY2tldHNfZHJvcHBlZCA9IHsgLm5hbWUgPSAidHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkIiwgLmRlc2NyID0gIlRyYW5zbWl0IHBhY2tldHMgZHJvcHBlZCBkdWUgdG8gaWxsZWdhbCBsZW5ndGgiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9JRF9UWF9DUFVfT01DSV9QQUNLRVRTX0RST1BQRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCB0eF9jcHVfb21jaV9wYWNrZXRzX2Ryb3BwZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3R4X2Ryb3BwZWRfaWxsZWdhbF9sZW5ndGggPSB7IC5uYW1lID0gInR4X2Ryb3BwZWRfaWxsZWdhbF9sZW5ndGgiLCAuZGVzY3IgPSAiVHJhbnNtaXQgcGFja2V0cyBkcm9wcGVkIGR1ZSB0byBpbGxlZ2FsIGxlbmd0aCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0lEX1RYX0RST1BQRURfSUxMRUdBTF9MRU5HVEgsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCB0eF9kcm9wcGVkX2lsbGVnYWxfbGVuZ3RoKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfdHhfZHJvcHBlZF90cGlkX21pc3MgPSB7IC5uYW1lID0gInR4X2Ryb3BwZWRfdHBpZF9taXNzIiwgLmRlc2NyID0gIlRyYW5zbWl0IHBhY2tldHMgZHJvcHBlZCBkdWUgdG8gVFBJRCBtaXNzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9UUElEX01JU1MsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCB0eF9kcm9wcGVkX3RwaWRfbWlzcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3R4X2Ryb3BwZWRfdmlkX21pc3MgPSB7IC5uYW1lID0gInR4X2Ryb3BwZWRfdmlkX21pc3MiLCAuZGVzY3IgPSAiVHJhbnNtaXQgcGFja2V0cyBkcm9wZWQgZHVlIHRvIFZJRCBtaXNzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1NUQVRfSURfVFhfRFJPUFBFRF9WSURfTUlTUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHR4X2Ryb3BwZWRfdmlkX21pc3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fbmlfc3RhdF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfZmVjX2NvZGV3b3JkcywgJnByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9iaXAzMl9ieXRlcywgJnByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9iaXAzMl9lcnJvcnMsICZwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfeGd0Y19oZWFkZXJzLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3J4X3hndGNfY29ycmVjdGVkLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3J4X3hndGNfdW5jb3JyZWN0ZWQsICZwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfeGdlbSwgJnByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9yeF94Z2VtX2Ryb3BwZWQsICZwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfeGdlbV9pZGxlLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3J4X3hnZW1fY29ycmVjdGVkLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3J4X2NyY19lcnJvciwgJnByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9yeF9mcmFnbWVudF9lcnJvciwgJnByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9yeF9wYWNrZXRzX2Ryb3BwZWQsICZwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfZHJvcHBlZF90b29fc2hvcnQsICZwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfZHJvcHBlZF90b29fbG9uZywgJnByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9yeF9rZXlfZXJyb3IsICZwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfdHhfcGxvYW1zLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3J4X3Bsb2Ftc19kcm9wcGVkLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3J4X2FsbG9jYXRpb25zX3ZhbGlkLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3J4X2FsbG9jYXRpb25zX2ludmFsaWQsICZwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfYWxsb2NhdGlvbnNfZGlzYWJsZWQsICZwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfcGxvYW1zLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3J4X3Bsb2Ftc19ub25faWRsZSwgJnByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9yeF9wbG9hbXNfZXJyb3IsICZwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfY3B1LCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3J4X29tY2ksICZwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfcnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciwgJnByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF90eF9wYWNrZXRzLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3R4X3hnZW0sICZwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfdHhfY3B1LCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3R4X29tY2ksICZwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfdHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X3R4X2Ryb3BwZWRfaWxsZWdhbF9sZW5ndGgsICZwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfdHhfZHJvcHBlZF90cGlkX21pc3MsICZwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfdHhfZHJvcHBlZF92aWRfbWlzcyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImZlY19jb2Rld29yZHMiLCAuZGVzY3IgPSAiUmVjZWl2ZSBGRUMgY29kZXdvcmRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIGZlY19jb2Rld29yZHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiYmlwMzJfYnl0ZXMiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgYnl0ZXMgcHJvdGVjdGVkIGJ5IGJpcDMyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIGJpcDMyX2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImJpcDMyX2Vycm9ycyIsIC5kZXNjciA9ICJSZWNlaXZlZCBiaXAzMiBlcnJvcnMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgYmlwMzJfZXJyb3JzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X3hndGNfaGVhZGVycyIsIC5kZXNjciA9ICJSZWNlaXZlZCB2YWxpZCBYR1RDIGhlYWRlcnMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgcnhfeGd0Y19oZWFkZXJzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X3hndGNfY29ycmVjdGVkIiwgLmRlc2NyID0gIlJlY2VpdmVkIGNvcnJlY3RlZCBYR1RDIGhlYWRlcnMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgcnhfeGd0Y19jb3JyZWN0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfeGd0Y191bmNvcnJlY3RlZCIsIC5kZXNjciA9ICJSZWNlaXZlZCB1bmNvcnJlY3RlZCBYR1RDIGhlYWRlcnMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgcnhfeGd0Y191bmNvcnJlY3RlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF94Z2VtIiwgLmRlc2NyID0gIlJlY2VpdmVkIHZhbGlkIFhHRU0gZnJhbWVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X3hnZW0pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfeGdlbV9kcm9wcGVkIiwgLmRlc2NyID0gIlJlY2VpdmVkIGRyb3BwZWQgWEdFTSBJRCBmcmFtZXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgcnhfeGdlbV9kcm9wcGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X3hnZW1faWRsZSIsIC5kZXNjciA9ICJSZWNlaXZlZCBpZGxlIFhHRU0gZnJhbWVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X3hnZW1faWRsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF94Z2VtX2NvcnJlY3RlZCIsIC5kZXNjciA9ICJSZWNlaXZlZCBjb3JyZWN0ZWQgWEdFTSBmcmFtZXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgcnhfeGdlbV9jb3JyZWN0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfY3JjX2Vycm9yIiwgLmRlc2NyID0gIlJlY2VpdmVkIHBhY2tldHMgd2l0aCBDUkMgZXJyb3IiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgcnhfY3JjX2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X2ZyYWdtZW50X2Vycm9yIiwgLmRlc2NyID0gIlJlY2VpdmVkIGZyYWdtZW50IGVycm9ycyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF9mcmFnbWVudF9lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9wYWNrZXRzX2Ryb3BwZWQiLCAuZGVzY3IgPSAiR2xvYmFsIGRyb3BwZWQgcGFja2V0cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF9wYWNrZXRzX2Ryb3BwZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfZHJvcHBlZF90b29fc2hvcnQiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgcGFja2V0cyBkcm9wcGVkIGR1ZSB0byBsZW5ndGggdG9vIHNob3J0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X2Ryb3BwZWRfdG9vX3Nob3J0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X2Ryb3BwZWRfdG9vX2xvbmciLCAuZGVzY3IgPSAiUmVjZWl2ZWQgcGFja2V0IGRyb3BwZWQgZHVlIHRvIGxlbmd0aCB0b28gbG9uZyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF9kcm9wcGVkX3Rvb19sb25nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X2tleV9lcnJvciIsIC5kZXNjciA9ICJSZWNlaXZlZCBrZXkgZXJyb3JzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X2tleV9lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJ0eF9wbG9hbXMiLCAuZGVzY3IgPSAiVHJhbnNtaXR0ZWQgUGxvYW1zIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHR4X3Bsb2FtcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9wbG9hbXNfZHJvcHBlZCIsIC5kZXNjciA9ICJSZWNlaXZlZCBkcm9wcGVkIFBsb2FtcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF9wbG9hbXNfZHJvcHBlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9hbGxvY2F0aW9uc192YWxpZCIsIC5kZXNjciA9ICJSZWNlaXZlZCB2YWxpZCBhbGxvY2F0aW9ucyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF9hbGxvY2F0aW9uc192YWxpZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9hbGxvY2F0aW9uc19pbnZhbGlkIiwgLmRlc2NyID0gIlJlY2VpdmVkIGludmFsaWQgYWxsb2NhdGlvbnMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgcnhfYWxsb2NhdGlvbnNfaW52YWxpZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9hbGxvY2F0aW9uc19kaXNhYmxlZCIsIC5kZXNjciA9ICJSZWNlaXZlZCBkaXNhYmxlZCBhbGxvY2F0aW9ucyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCByeF9hbGxvY2F0aW9uc19kaXNhYmxlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9wbG9hbXMiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgUGxvYW1zIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X3Bsb2FtcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9wbG9hbXNfbm9uX2lkbGUiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgbm9uIGlkbGUgUGxvYW1zIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X3Bsb2Ftc19ub25faWRsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9wbG9hbXNfZXJyb3IiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgZXJyb3IgUGxvYW1zIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X3Bsb2Ftc19lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9jcHUiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgQ1BVIHBhY2tldHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgcnhfY3B1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X29tY2kiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgT01DSSBwYWNrZXRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X29tY2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciIsIC5kZXNjciA9ICJSZWNlaXZlZCBPTUNJIHBhY2tldHMgd2l0aCBDUkMgZXJyb3JzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfcGFja2V0cyIsIC5kZXNjciA9ICJUcmFuc21pdHRlZCBwYWNrZXRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGEsIHR4X3BhY2tldHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfeGdlbSIsIC5kZXNjciA9ICJUcmFuc21pdHRlZCBYR0VNIGZyYWdtZW50cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCB0eF94Z2VtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInR4X2NwdSIsIC5kZXNjciA9ICJUcmFuc21pdHRlZCBDUFUgcGFja2V0cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCB0eF9jcHUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfb21jaSIsIC5kZXNjciA9ICJUcmFuc21pdHRlZCBPTUNJIHBhY2tldHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgdHhfb21jaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJ0eF9jcHVfb21jaV9wYWNrZXRzX2Ryb3BwZWQiLCAuZGVzY3IgPSAiVHJhbnNtaXQgcGFja2V0cyBkcm9wcGVkIGR1ZSB0byBpbGxlZ2FsIGxlbmd0aCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCB0eF9jcHVfb21jaV9wYWNrZXRzX2Ryb3BwZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJ0eF9kcm9wcGVkX2lsbGVnYWxfbGVuZ3RoIiwgLmRlc2NyID0gIlRyYW5zbWl0IHBhY2tldHMgZHJvcHBlZCBkdWUgdG8gaWxsZWdhbCBsZW5ndGgiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSwgdHhfZHJvcHBlZF9pbGxlZ2FsX2xlbmd0aCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJ0eF9kcm9wcGVkX3RwaWRfbWlzcyIsIC5kZXNjciA9ICJUcmFuc21pdCBwYWNrZXRzIGRyb3BwZWQgZHVlIHRvIFRQSUQgbWlzcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCB0eF9kcm9wcGVkX3RwaWRfbWlzcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJ0eF9kcm9wcGVkX3ZpZF9taXNzIiwgLmRlc2NyID0gIlRyYW5zbWl0IHBhY2tldHMgZHJvcGVkIGR1ZSB0byBWSUQgbWlzcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhLCB0eF9kcm9wcGVkX3ZpZF9taXNzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSIsIC5kZXNjciA9ICJzdGF0IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3N0YXRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9zdGF0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX25pIC0gc2V0X3Bvbl9zdGF0ZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3NldF9wb25fc3RhdGVfcG9uX3N0YXRlID0geyAubmFtZSA9ICJwb25fc3RhdGUiLCAuZGVzY3IgPSAiUE9OIHN0YXRlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1NFVF9QT05fU1RBVEVfSURfUE9OX1NUQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YSwgcG9uX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX29wZXJhdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX25pX3NldF9wb25fc3RhdGVfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX3Bvbl9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBvbl9zdGF0ZSIsIC5kZXNjciA9ICJQT04gc3RhdGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YSwgcG9uX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX29wZXJhdGlvbiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YSIsIC5kZXNjciA9ICJTZXQgUE9OIFN0YXRlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGVfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX25pIC0gcmVzZXQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9uaV9yZXNldF9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9uaSAtIGRpc2FibGVfc2VyaWFsX251bWJlciAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9jb250cm9sID0geyAubmFtZSA9ICJjb250cm9sIiwgLmRlc2NyID0gImNvbnRyb2wiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX0NPTlRST0wsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGEsIGNvbnRyb2wpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9kaXNhYmxlX3NlcmlhbF9udW1iZXJfY29udHJvbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9zZXJpYWxfbnVtYmVyID0geyAubmFtZSA9ICJzZXJpYWxfbnVtYmVyIiwgLmRlc2NyID0gInNlcmlhbCBudW1iZXIiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfRElTQUJMRV9TRVJJQUxfTlVNQkVSX0lEX1NFUklBTF9OVU1CRVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGEsIHNlcmlhbF9udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zZXJpYWxfbnVtYmVyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2NvbnRyb2wsICZwcm9wX2Rlc2NyX3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9zZXJpYWxfbnVtYmVyIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJjb250cm9sIiwgLmRlc2NyID0gImNvbnRyb2wiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhLCBjb250cm9sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2NvbnRyb2wgfSwgeyAubmFtZSA9ICJzZXJpYWxfbnVtYmVyIiwgLmRlc2NyID0gInNlcmlhbCBudW1iZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhLCBzZXJpYWxfbnVtYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc2VyaWFsX251bWJlciB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGEiLCAuZGVzY3IgPSAiRGlzYWJsZSBTZXJpYWwgTnVtYmVyIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX25pIC0gc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogeGdwb25fbmkgLSBzZXRfb251X3N0YXRlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9vbnVfc3RhdGUgPSB7IC5uYW1lID0gIm9udV9zdGF0ZSIsIC5kZXNjciA9ICJOZXcgb3BlcmF0aW9uIHN0YXRlIG9mIGFsbCBPTlVzLiAgVGhlIGRlZmF1bHQgb3BlcmF0aW9uIG1heSBiZSBjb25maWd1cmVkIGJ5IHRoZSBYR1BPTiBOSSBjb25maWd1cmF0aW9uIG9iamVjdCA6IHhncG9uX25pLmNmZy5zbl9hY3F1aXNpdGlvbi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU0VUX09OVV9TVEFURV9JRF9PTlVfU1RBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhLCBvbnVfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9vbnVfb3BlcmF0aW9uIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fbmlfc2V0X29udV9zdGF0ZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX25pX3NldF9vbnVfc3RhdGVfb251X3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAib251X3N0YXRlIiwgLmRlc2NyID0gIk5ldyBvcGVyYXRpb24gc3RhdGUgb2YgYWxsIE9OVXMuICBUaGUgZGVmYXVsdCBvcGVyYXRpb24gbWF5IGJlIGNvbmZpZ3VyZWQgYnkgdGhlIFhHUE9OIE5JIGNvbmZpZ3VyYXRpb24gb2JqZWN0IDogeGdwb25fbmkuY2ZnLnNuX2FjcXVpc2l0aW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhLCBvbnVfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9vbnVfb3BlcmF0aW9uIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhIiwgLmRlc2NyID0gIlNldCB0aGUgb3BlcmF0aW9uIHN0YXRlIG9mIGFsbCBPTlVzLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc2V0X29udV9zdGF0ZV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9uaSAtIHJ1bl9zcGVjaWFsX2J3X21hcCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9udW1iZXJfb2ZfY3ljbGUgPSB7IC5uYW1lID0gIm51bWJlcl9vZl9jeWNsZSIsIC5kZXNjciA9ICJudW1iZXIgb2YgY3ljbGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfUlVOX1NQRUNJQUxfQldfTUFQX0lEX05VTUJFUl9PRl9DWUNMRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YSwgbnVtYmVyX29mX2N5Y2xlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2FsbG9jYXRpb25fbnVtYmVyID0geyAubmFtZSA9ICJhbGxvY2F0aW9uX251bWJlciIsIC5kZXNjciA9ICJhbGxvY2F0aW9uIG51bWJlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9SVU5fU1BFQ0lBTF9CV19NQVBfSURfQUxMT0NBVElPTl9OVU1CRVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2RhdGEsIGFsbG9jYXRpb25fbnVtYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2J3X21hcF9hcnJheSA9IHsgLm5hbWUgPSAiYndfbWFwX2FycmF5IiwgLmRlc2NyID0gImJ3IG1hcCBhcnJheSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9SVU5fU1BFQ0lBTF9CV19NQVBfSURfQldfTUFQX0FSUkFZLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9kYXRhLCBid19tYXBfYXJyYXkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfbnVtYmVyX29mX2N5Y2xlLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfYWxsb2NhdGlvbl9udW1iZXIsICZwcm9wX2Rlc2NyX3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9id19tYXBfYXJyYXkgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm51bWJlcl9vZl9jeWNsZSIsIC5kZXNjciA9ICJudW1iZXIgb2YgY3ljbGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9kYXRhLCBudW1iZXJfb2ZfY3ljbGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJhbGxvY2F0aW9uX251bWJlciIsIC5kZXNjciA9ICJhbGxvY2F0aW9uIG51bWJlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2RhdGEsIGFsbG9jYXRpb25fbnVtYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAiYndfbWFwX2FycmF5IiwgLmRlc2NyID0gImJ3IG1hcCBhcnJheSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2RhdGEsIGJ3X21hcF9hcnJheSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2RhdGEiLCAuZGVzY3IgPSAiUnVuIFNwZWNpYWwgQlcgTWFwIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX25pIC0gcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfd2luZG93X3R5cGUgPSB7IC5uYW1lID0gIndpbmRvd190eXBlIiwgLmRlc2NyID0gIlR5cGUgb2Ygc2lsZW50IG1lYXN1cmVtZW50IHRvIGV4ZWN1dGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9XSU5ET1dfVFlQRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEsIHdpbmRvd190eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfYWxsb2NfaWQgPSB7IC5uYW1lID0gImFsbG9jX2lkIiwgLmRlc2NyID0gIkFMTE9DIElEIHRvIHNjYW4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9BTExPQ19JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEsIGFsbG9jX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfb251X2lkID0geyAubmFtZSA9ICJvbnVfaWQiLCAuZGVzY3IgPSAiT05VIElEIHRvIHNjYW4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX1dJTkRPV19JRF9PTlVfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhLCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19zZWNvbmRfcmFuZ2luZ193aW5kb3cgPSB7IC5uYW1lID0gInNlY29uZF9yYW5naW5nX3dpbmRvdyIsIC5kZXNjciA9ICJOb3QgY3VycmVudGx5IHN1cHBvcnRlZCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fV0lORE9XX0lEX1NFQ09ORF9SQU5HSU5HX1dJTkRPVywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEsIHNlY29uZF9yYW5naW5nX3dpbmRvdyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X3dpbmRvd190eXBlLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2FsbG9jX2lkLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X29udV9pZCwgJnByb3BfZGVzY3JfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19zZWNvbmRfcmFuZ2luZ193aW5kb3cgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJ3aW5kb3dfdHlwZSIsIC5kZXNjciA9ICJUeXBlIG9mIHNpbGVudCBtZWFzdXJlbWVudCB0byBleGVjdXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEsIHdpbmRvd190eXBlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdyB9LCB7IC5uYW1lID0gImFsbG9jX2lkIiwgLmRlc2NyID0gIkFMTE9DIElEIHRvIHNjYW4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YSwgYWxsb2NfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAib251X2lkIiwgLmRlc2NyID0gIk9OVSBJRCB0byBzY2FuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEsIG9udV9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJzZWNvbmRfcmFuZ2luZ193aW5kb3ciLCAuZGVzY3IgPSAiTm90IGN1cnJlbnRseSBzdXBwb3J0ZWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YSwgc2Vjb25kX3Jhbmdpbmdfd2luZG93KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhIiwgLmRlc2NyID0gIlJvZ3VlIERldGVjdGlvbiBXaW5kb3ciLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fbmkgLSBzdGF0ZV9jaGFuZ2VfY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9yZXN1bHQgPSB7IC5uYW1lID0gInJlc3VsdCIsIC5kZXNjciA9ICJSZXN1bHQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRF9JRF9SRVNVTFQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhLCByZXN1bHQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX3ByZXZpb3VzX3N0YXRlID0geyAubmFtZSA9ICJwcmV2aW91c19zdGF0ZSIsIC5kZXNjciA9ICJQcmV2aW91cyBzdGF0ZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX1BSRVZJT1VTX1NUQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSwgcHJldmlvdXNfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25fc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX25ld19zdGF0ZSA9IHsgLm5hbWUgPSAibmV3X3N0YXRlIiwgLmRlc2NyID0gIm5ldyBzdGF0ZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9TVEFURV9DSEFOR0VfQ09NUExFVEVEX0lEX05FV19TVEFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEsIG5ld19zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9zdGF0ZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX3Jlc3VsdCwgJnByb3BfZGVzY3JfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9wcmV2aW91c19zdGF0ZSwgJnByb3BfZGVzY3JfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9uZXdfc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyZXN1bHQiLCAuZGVzY3IgPSAiUmVzdWx0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEsIHJlc3VsdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9LCB7IC5uYW1lID0gInByZXZpb3VzX3N0YXRlIiwgLmRlc2NyID0gIlByZXZpb3VzIHN0YXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEsIHByZXZpb3VzX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX3N0YXRlIH0sIHsgLm5hbWUgPSAibmV3X3N0YXRlIiwgLmRlc2NyID0gIm5ldyBzdGF0ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhLCBuZXdfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25fc3RhdGUgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEiLCAuZGVzY3IgPSAiU3RhdGUgQ2hhbmdlIENvbXBsZXRlZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9uaSAtIGxvcyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2xvc19zdGF0dXMgPSB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfTE9TX0lEX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9sb3NfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fbmlfbG9zX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fbmlfbG9zX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfbG9zX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gInN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfbG9zX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2xvc19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfbG9zX2RhdGEiLCAuZGVzY3IgPSAiTE9TIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2xvc19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2xvc19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2xvc19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX25pIC0gc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX25pX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnRfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogeGdwb25fbmkgLSBwcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX3Jlc3VsdCA9IHsgLm5hbWUgPSAicmVzdWx0IiwgLmRlc2NyID0gIlJlc3VsdCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRV9JRF9SRVNVTFQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YSwgcmVzdWx0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdHJhZmZpY19yZXN1bWVfcmVzdWx0IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9yZXN1bHQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicmVzdWx0IiwgLmRlc2NyID0gIlJlc3VsdCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YSwgcmVzdWx0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdHJhZmZpY19yZXN1bWVfcmVzdWx0IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGEiLCAuZGVzY3IgPSAiUHJvdGVjdGlvbiBTd2l0Y2hpbmcgVHJhZmZpYyBSZXN1bWUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fbmkgLSBwcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX29udXMgPSB7IC5uYW1lID0gIm9udXMiLCAuZGVzY3IgPSAiT05VcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9QUk9URUNUSU9OX1NXSVRDSElOR19PTlVTX1JBTkdFRF9JRF9PTlVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGEsIG9udXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfZXFkX2xpc3RfdTMyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9vbnVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm9udXMiLCAuZGVzY3IgPSAiT05VcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSwgb251cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9lcWRfbGlzdF91MzIgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSIsIC5kZXNjciA9ICJBZnRlciBhIHN3aXRjaG92ZXIgaXMgY29tcGxldGUgYW5kIGFsbCBPTlUgcmFuZ2luZyB0aW1lcyBoYXZlIHN0YWJpbGl6ZWQsIHRoaXMgaW5kaWNhdGlvbiBpcyBzZW50IHRvIGluZm9ybSB0aGUgaG9zdCBvZiBhbGwgbmV3IE9OVSBFUURzLiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9uaSAtIHByb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfcmVzdWx0ID0geyAubmFtZSA9ICJyZXN1bHQiLCAuZGVzY3IgPSAiUmVzdWx0IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVEX0lEX1JFU1VMVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhLCByZXN1bHQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX3Jlc3VsdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyZXN1bHQiLCAuZGVzY3IgPSAiUmVzdWx0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhLCByZXN1bHQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJQcm90ZWN0aW9uIFN3aXRjaGluZyBTd2l0Y2hvdmVyIENvbXBsZXRlZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9uaSAtIHN0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfbnVtYmVyX29mX2RldGVjdGVkX2RlbGltaXRlciA9IHsgLm5hbWUgPSAibnVtYmVyX29mX2RldGVjdGVkX2RlbGltaXRlciIsIC5kZXNjciA9ICJudW1iZXIgb2YgZGV0ZWN0ZWQgZGVsaW1pdGVyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVEX0lEX05VTUJFUl9PRl9ERVRFQ1RFRF9ERUxJTUlURVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSwgbnVtYmVyX29mX2RldGVjdGVkX2RlbGltaXRlciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9lbmVyZ3lfZGV0ZWN0X3NpZ25hbCA9IHsgLm5hbWUgPSAiZW5lcmd5X2RldGVjdF9zaWduYWwiLCAuZGVzY3IgPSAiZW5lcmd5IGRldGVjdCBzaWduYWwiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURURfSURfRU5FUkdZX0RFVEVDVF9TSUdOQUwsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSwgZW5lcmd5X2RldGVjdF9zaWduYWwpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX251bWJlcl9vZl9kZXRlY3RlZF9kZWxpbWl0ZXIsICZwcm9wX2Rlc2NyX3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2VuZXJneV9kZXRlY3Rfc2lnbmFsIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm51bWJlcl9vZl9kZXRlY3RlZF9kZWxpbWl0ZXIiLCAuZGVzY3IgPSAibnVtYmVyIG9mIGRldGVjdGVkIGRlbGltaXRlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSwgbnVtYmVyX29mX2RldGVjdGVkX2RlbGltaXRlciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJlbmVyZ3lfZGV0ZWN0X3NpZ25hbCIsIC5kZXNjciA9ICJlbmVyZ3kgZGV0ZWN0IHNpZ25hbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSwgZW5lcmd5X2RldGVjdF9zaWduYWwpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJTdGFuZGJ5IFBPTiBNb25pdG9yaW5nIEN5Y2xlIENvbXBsZXRlZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9uaSAtIG9udV9kaXNjb3ZlcmVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfc2VyaWFsX251bWJlciA9IHsgLm5hbWUgPSAic2VyaWFsX251bWJlciIsIC5kZXNjciA9ICJzZXJpYWwgbnVtYmVyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1NFUklBTF9OVU1CRVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSwgc2VyaWFsX251bWJlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3NlcmlhbF9udW1iZXIgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9yYW5naW5nX3RpbWUgPSB7IC5uYW1lID0gInJhbmdpbmdfdGltZSIsIC5kZXNjciA9ICJyYW5naW5nIHRpbWUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfUkFOR0lOR19USU1FLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEsIHJhbmdpbmdfdGltZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9vbnVfaWQgPSB7IC5uYW1lID0gIm9udV9pZCIsIC5kZXNjciA9ICJvbnVfaWQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfT05VX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEsIG9udV9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF91cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzID0geyAubmFtZSA9ICJ1cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzIiwgLmRlc2NyID0gIlVwc3RyZWFtIGxpbmUgcmF0ZSBjYXBhYmlsaXRpZXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfT05VX0RJU0NPVkVSRURfSURfVVBTVFJFQU1fTElORV9SQVRFX0NBUEFCSUxJVElFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhLCB1cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdXBzdHJlYW1fbGluZV9yYXRlX2NhcGFiaWxpdGllcyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2N1cnJlbnRfZG93bnN0cmVhbV9wb25faWQgPSB7IC5uYW1lID0gImN1cnJlbnRfZG93bnN0cmVhbV9wb25faWQiLCAuZGVzY3IgPSAiVGhlIFBPTi1JRCByZWNlaXZlZCBieSB0aGUgT05VIGluIGl0cyBjdXJyZW50IGRvd25zdHJlYW0gd2F2ZWxlbmd0aCBjaGFubmVsIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX0NVUlJFTlRfRE9XTlNUUkVBTV9QT05fSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSwgY3VycmVudF9kb3duc3RyZWFtX3Bvbl9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2N1cnJlbnRfdXBzdHJlYW1fcG9uX2lkID0geyAubmFtZSA9ICJjdXJyZW50X3Vwc3RyZWFtX3Bvbl9pZCIsIC5kZXNjciA9ICJUaGUgUE9OLUlEIG9mIHRoZSBDaGFubmVsIFByb2ZpbGUgY29udGFpbmluZyB0aGUgZGVzY3JpcHRvciBvZiB0aGUgdXBzdHJlYW0gd2F2ZWxlbmd0aCBjaGFubmVsIGluIHdoaWNoIHRoZSBPTlUgaXMgdHJhbnNtaXR0aW5nIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX0NVUlJFTlRfVVBTVFJFQU1fUE9OX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEsIGN1cnJlbnRfdXBzdHJlYW1fcG9uX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfY2FsaWJyYXRpb25fcmVjb3JkID0geyAubmFtZSA9ICJjYWxpYnJhdGlvbl9yZWNvcmQiLCAuZGVzY3IgPSAiQ2FsaWJyYXRpb24gcmVjb3JkIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX0NBTElCUkFUSU9OX1JFQ09SRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhLCBjYWxpYnJhdGlvbl9yZWNvcmQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfY2FsaWJyYXRpb25fcmVjb3JkXzggfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF90dW5pbmdfZ3JhbnVsYXJpdHkgPSB7IC5uYW1lID0gInR1bmluZ19ncmFudWxhcml0eSIsIC5kZXNjciA9ICJUaGUgdHVuaW5nIGdyYW51bGFyaXR5IG9mIHRoZSBPTlUgdHJhbnNtaXR0ZWQgZXhwcmVzc2VkIGluIHVuaXRzIG9mIDFHaHouIFZhbHVlIG9mIDAgaW5kaWNhdGVzIHRoYXQgdGhlIE9OVSBkb2VzIG5vdCBzdXBwb3J0IGZpbmUgdHVuaW5nIC8gZGl0aGVyaW5nIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX09OVV9ESVNDT1ZFUkVEX0lEX1RVTklOR19HUkFOVUxBUklUWSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhLCB0dW5pbmdfZ3JhbnVsYXJpdHkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9zdGVwX3R1bmluZ190aW1lID0geyAubmFtZSA9ICJzdGVwX3R1bmluZ190aW1lIiwgLmRlc2NyID0gIlRoZSB2YWx1ZSBvZiB0aGUgdHVuaW5nIHRpbWUgZm9yIGEgc2luZ2xlIGdyYW51bGFyaXR5IHN0ZXAsIGV4cHJlc3NlZCBpbiB1bml0IG9mIFBIWSBmcmFtZXMuIFRoZSB2YWx1ZSAwIGluZGljYXRlcyB0aGF0IHRoZSBPTlUgZG9lcyBub3Qgc3VwcG9ydCBmaW5lIHR1bmluZyAvIGRpdGhlcmluZyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9TVEVQX1RVTklOR19USU1FLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEsIHN0ZXBfdHVuaW5nX3RpbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9hdHRlbnVhdGlvbiA9IHsgLm5hbWUgPSAiYXR0ZW51YXRpb24iLCAuZGVzY3IgPSAiVGhlIE9OVSBhdHRlbnVhdGlvbiBpbiBzdGVwcyBvZiAzZEIgYXQgdGhlIHRpbWUgb2YgdGhlIG1lc3NhZ2UgdHJhbnNtaXNzaW9uIGFzIHBhcnQgb2YgdGhlIHBvd2VyIGxldmVsbGluZyByZXBvcnQuIFZhbHVlIG9mIDAgcmVwcmVzZW50cyB1bi1hdHRlbnVhdGVkIHRyYW5zbWlzc2lvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9BVFRFTlVBVElPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhLCBhdHRlbnVhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX29udV9kaXNjb3ZlcmVkX3Bvd2VyX2xldmVsbGluZ19jYXBhYmlsaXRpZXMgPSB7IC5uYW1lID0gInBvd2VyX2xldmVsbGluZ19jYXBhYmlsaXRpZXMiLCAuZGVzY3IgPSAiVGhlIE9OVSBzdXBwb3J0cyBhdHRlbnVhdGlvbiBsZXZlbCBpbiBzdGVwIG9mIDNkQiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9PTlVfRElTQ09WRVJFRF9JRF9QT1dFUl9MRVZFTExJTkdfQ0FQQUJJTElUSUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEsIHBvd2VyX2xldmVsbGluZ19jYXBhYmlsaXRpZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX25pX29udV9kaXNjb3ZlcmVkX3NlcmlhbF9udW1iZXIsICZwcm9wX2Rlc2NyX3hncG9uX25pX29udV9kaXNjb3ZlcmVkX3JhbmdpbmdfdGltZSwgJnByb3BfZGVzY3JfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfb251X2lkLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF91cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9jdXJyZW50X2Rvd25zdHJlYW1fcG9uX2lkLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9jdXJyZW50X3Vwc3RyZWFtX3Bvbl9pZCwgJnByb3BfZGVzY3JfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfY2FsaWJyYXRpb25fcmVjb3JkLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF90dW5pbmdfZ3JhbnVsYXJpdHksICZwcm9wX2Rlc2NyX3hncG9uX25pX29udV9kaXNjb3ZlcmVkX3N0ZXBfdHVuaW5nX3RpbWUsICZwcm9wX2Rlc2NyX3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2F0dGVudWF0aW9uLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9wb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0aWVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInNlcmlhbF9udW1iZXIiLCAuZGVzY3IgPSAic2VyaWFsIG51bWJlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSwgc2VyaWFsX251bWJlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3NlcmlhbF9udW1iZXIgfSwgeyAubmFtZSA9ICJyYW5naW5nX3RpbWUiLCAuZGVzY3IgPSAicmFuZ2luZyB0aW1lIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhLCByYW5naW5nX3RpbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAib251X2lkIiwgLmRlc2NyID0gIm9udV9pZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSwgb251X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gInVwc3RyZWFtX2xpbmVfcmF0ZV9jYXBhYmlsaXRpZXMiLCAuZGVzY3IgPSAiVXBzdHJlYW0gbGluZSByYXRlIGNhcGFiaWxpdGllcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSwgdXBzdHJlYW1fbGluZV9yYXRlX2NhcGFiaWxpdGllcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Vwc3RyZWFtX2xpbmVfcmF0ZV9jYXBhYmlsaXRpZXMgfSwgeyAubmFtZSA9ICJjdXJyZW50X2Rvd25zdHJlYW1fcG9uX2lkIiwgLmRlc2NyID0gIlRoZSBQT04tSUQgcmVjZWl2ZWQgYnkgdGhlIE9OVSBpbiBpdHMgY3VycmVudCBkb3duc3RyZWFtIHdhdmVsZW5ndGggY2hhbm5lbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSwgY3VycmVudF9kb3duc3RyZWFtX3Bvbl9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gImN1cnJlbnRfdXBzdHJlYW1fcG9uX2lkIiwgLmRlc2NyID0gIlRoZSBQT04tSUQgb2YgdGhlIENoYW5uZWwgUHJvZmlsZSBjb250YWluaW5nIHRoZSBkZXNjcmlwdG9yIG9mIHRoZSB1cHN0cmVhbSB3YXZlbGVuZ3RoIGNoYW5uZWwgaW4gd2hpY2ggdGhlIE9OVSBpcyB0cmFuc21pdHRpbmciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEsIGN1cnJlbnRfdXBzdHJlYW1fcG9uX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAiY2FsaWJyYXRpb25fcmVjb3JkIiwgLmRlc2NyID0gIkNhbGlicmF0aW9uIHJlY29yZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSwgY2FsaWJyYXRpb25fcmVjb3JkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX2NhbGlicmF0aW9uX3JlY29yZF84IH0sIHsgLm5hbWUgPSAidHVuaW5nX2dyYW51bGFyaXR5IiwgLmRlc2NyID0gIlRoZSB0dW5pbmcgZ3JhbnVsYXJpdHkgb2YgdGhlIE9OVSB0cmFuc21pdHRlZCBleHByZXNzZWQgaW4gdW5pdHMgb2YgMUdoei4gVmFsdWUgb2YgMCBpbmRpY2F0ZXMgdGhhdCB0aGUgT05VIGRvZXMgbm90IHN1cHBvcnQgZmluZSB0dW5pbmcgLyBkaXRoZXJpbmciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEsIHR1bmluZ19ncmFudWxhcml0eSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInN0ZXBfdHVuaW5nX3RpbWUiLCAuZGVzY3IgPSAiVGhlIHZhbHVlIG9mIHRoZSB0dW5pbmcgdGltZSBmb3IgYSBzaW5nbGUgZ3JhbnVsYXJpdHkgc3RlcCwgZXhwcmVzc2VkIGluIHVuaXQgb2YgUEhZIGZyYW1lcy4gVGhlIHZhbHVlIDAgaW5kaWNhdGVzIHRoYXQgdGhlIE9OVSBkb2VzIG5vdCBzdXBwb3J0IGZpbmUgdHVuaW5nIC8gZGl0aGVyaW5nIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhLCBzdGVwX3R1bmluZ190aW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAiYXR0ZW51YXRpb24iLCAuZGVzY3IgPSAiVGhlIE9OVSBhdHRlbnVhdGlvbiBpbiBzdGVwcyBvZiAzZEIgYXQgdGhlIHRpbWUgb2YgdGhlIG1lc3NhZ2UgdHJhbnNtaXNzaW9uIGFzIHBhcnQgb2YgdGhlIHBvd2VyIGxldmVsbGluZyByZXBvcnQuIFZhbHVlIG9mIDAgcmVwcmVzZW50cyB1bi1hdHRlbnVhdGVkIHRyYW5zbWlzc2lvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSwgYXR0ZW51YXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJwb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0aWVzIiwgLmRlc2NyID0gIlRoZSBPTlUgc3VwcG9ydHMgYXR0ZW51YXRpb24gbGV2ZWwgaW4gc3RlcCBvZiAzZEIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGEsIHBvd2VyX2xldmVsbGluZ19jYXBhYmlsaXRpZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSIsIC5kZXNjciA9ICJPTlUgRGlzY292ZXJlZCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9uaSAtIGNwdV9wYWNrZXRzX2ZhaWx1cmUgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2Vycm9yID0geyAubmFtZSA9ICJlcnJvciIsIC5kZXNjciA9ICJUaGUgZXJyb3IgdGhhdCB3YXMgZW5jb3VudGVyZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0ZBSUxVUkVfSURfRVJST1IsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhLCBlcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3BhY2tldF9pbmplY3Rpb25fZXJyb3IgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2dlbV9wb3J0X2lkID0geyAubmFtZSA9ICJnZW1fcG9ydF9pZCIsIC5kZXNjciA9ICJUaGUgR0VNIHBvcnQgdGhhdCBjYXVzZWQgdGhlIGVycm9yLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19GQUlMVVJFX0lEX0dFTV9QT1JUX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSwgZ2VtX3BvcnRfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZXJyb3IsICZwcm9wX2Rlc2NyX3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZ2VtX3BvcnRfaWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJlcnJvciIsIC5kZXNjciA9ICJUaGUgZXJyb3IgdGhhdCB3YXMgZW5jb3VudGVyZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGEsIGVycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcGFja2V0X2luamVjdGlvbl9lcnJvciB9LCB7IC5uYW1lID0gImdlbV9wb3J0X2lkIiwgLmRlc2NyID0gIlRoZSBHRU0gcG9ydCB0aGF0IGNhdXNlZCB0aGUgZXJyb3IuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGEsIGdlbV9wb3J0X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSIsIC5kZXNjciA9ICJBIGZhaWx1cmUgd2FzIGVuY291bnRlcmVkIGR1cmluZyB0aGUgXCJjcHVfcGFja2V0c1wiIHByb3h5IG9wZXJhdGlvbi4iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fbmkgLSBjcHVfcGFja2V0cyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2NwdV9wYWNrZXRzX3BhY2tldF90eXBlID0geyAubmFtZSA9ICJwYWNrZXRfdHlwZSIsIC5kZXNjciA9ICJwYWNrZXQgdHlwZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfVFlQRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhLCBwYWNrZXRfdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3BhY2tldF90eXBlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY3B1X3BhY2tldHNfY2FsY19jcmMgPSB7IC5uYW1lID0gImNhbGNfY3JjIiwgLmRlc2NyID0gImNhbGMgY3JjIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0lEX0NBTENfQ1JDLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2RhdGEsIGNhbGNfY3JjKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfY3B1X3BhY2tldHNfZ2VtX3BvcnRfbGlzdCA9IHsgLm5hbWUgPSAiZ2VtX3BvcnRfbGlzdCIsIC5kZXNjciA9ICJnZW0gcG9ydCBsaXN0IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0NQVV9QQUNLRVRTX0lEX0dFTV9QT1JUX0xJU1QsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YSwgZ2VtX3BvcnRfbGlzdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2dlbV9pZF9saXN0X3U4X21heF8xNiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2NwdV9wYWNrZXRzX2J1ZmZlciA9IHsgLm5hbWUgPSAiYnVmZmVyIiwgLmRlc2NyID0gImJ1ZmZlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9DUFVfUEFDS0VUU19JRF9CVUZGRVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YSwgYnVmZmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDggfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9uaV9jcHVfcGFja2V0c19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX25pX2NwdV9wYWNrZXRzX3BhY2tldF90eXBlLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9jcHVfcGFja2V0c19jYWxjX2NyYywgJnByb3BfZGVzY3JfeGdwb25fbmlfY3B1X3BhY2tldHNfZ2VtX3BvcnRfbGlzdCwgJnByb3BfZGVzY3JfeGdwb25fbmlfY3B1X3BhY2tldHNfYnVmZmVyIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBhY2tldF90eXBlIiwgLmRlc2NyID0gInBhY2tldCB0eXBlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhLCBwYWNrZXRfdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3BhY2tldF90eXBlIH0sIHsgLm5hbWUgPSAiY2FsY19jcmMiLCAuZGVzY3IgPSAiY2FsYyBjcmMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2RhdGEsIGNhbGNfY3JjKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiZ2VtX3BvcnRfbGlzdCIsIC5kZXNjciA9ICJnZW0gcG9ydCBsaXN0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhLCBnZW1fcG9ydF9saXN0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2IH0sIHsgLm5hbWUgPSAiYnVmZmVyIiwgLmRlc2NyID0gImJ1ZmZlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YSwgYnVmZmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDggfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YSIsIC5kZXNjciA9ICJYR1BPTiBDUFUgcGFja2V0cyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9uaSAtIGJyb2FkY2FzdF9wbG9hbV9wYWNrZXQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X3Bsb2FtID0geyAubmFtZSA9ICJwbG9hbSIsIC5kZXNjciA9ICJwbG9hbSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9CUk9BRENBU1RfUExPQU1fUEFDS0VUX0lEX1BMT0FNLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YSwgcGxvYW0pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdThfNDAgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9wbG9hbSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInBsb2FtIiwgLmRlc2NyID0gInBsb2FtIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGEsIHBsb2FtKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzQwIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhIiwgLmRlc2NyID0gIkJyb2FkY2FzdCBQTE9BTSBQYWNrZXQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fbmkgLSByb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF93aW5kb3dfdHlwZSA9IHsgLm5hbWUgPSAid2luZG93X3R5cGUiLCAuZGVzY3IgPSAiU2lsZW50IFdpbmRvdyBvciBDdXQgb2ZmIFdpbmRvdyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1dJTkRPV19UWVBFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSwgd2luZG93X3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9tZWFzdXJlbWVudF9zdGF0dXMgPSB7IC5uYW1lID0gIm1lYXN1cmVtZW50X3N0YXR1cyIsIC5kZXNjciA9ICJTdGF0dXMgb2YgdGhlIHJvZ3VlIE9OVSBkZXRlY3Rpb24gcmVzdWx0LiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX01FQVNVUkVNRU5UX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEsIG1lYXN1cmVtZW50X3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX21lYXN1cmVtZW50X3Jlc3VsdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfYWxsb2NfaWQgPSB7IC5uYW1lID0gImFsbG9jX2lkIiwgLmRlc2NyID0gIkFsbG9jLUlEIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfQUxMT0NfSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhLCBhbGxvY19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX29udV9pZCA9IHsgLm5hbWUgPSAib251X2lkIiwgLmRlc2NyID0gIk9OVS1JRCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX09OVV9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEsIG9udV9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2lzX2RlbGluZWF0aW9uID0geyAubmFtZSA9ICJpc19kZWxpbmVhdGlvbiIsIC5kZXNjciA9ICJCdXJzdCBEZWxpbmVhdGlvbiBkZXRlY3RlZCBkdXJpbmcgdGhlIHJvZ3VlIE9OVSBkZXRlY3Rpb24uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfSVNfREVMSU5FQVRJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhLCBpc19kZWxpbmVhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaXNfZWQgPSB7IC5uYW1lID0gImlzX2VkIiwgLmRlc2NyID0gIklzIEVEIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfSVNfRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhLCBpc19lZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfcnhfZGF0YSA9IHsgLm5hbWUgPSAicnhfZGF0YSIsIC5kZXNjciA9ICJDYXB0dXJlZCBQTE9BTXUgbWVzc2FnZSBpZiB0aGUgYnVyc3QgZGVsaW5pZWF0aW9uIHdhcyBkZXRlY3RlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRF9JRF9SWF9EQVRBLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSwgcnhfZGF0YSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3U4X2xpc3RfdTMyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9wbG9hbV9yZWNlaXZlZF9vbnVfaWQgPSB7IC5uYW1lID0gInBsb2FtX3JlY2VpdmVkX29udV9pZCIsIC5kZXNjciA9ICJPTlUgSUQgcmVjZWl2ZWQgaW4gdGhlIHBsb2FtIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURURfSURfUExPQU1fUkVDRUlWRURfT05VX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSwgcGxvYW1fcmVjZWl2ZWRfb251X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfcGxvYW1fcmVjZWl2ZWRfbWljX2Vycm9yID0geyAubmFtZSA9ICJwbG9hbV9yZWNlaXZlZF9taWNfZXJyb3IiLCAuZGVzY3IgPSAiTWljIGVycm9yIGluIHRoZSByZWNlaXZlZCBwbG9hbSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEX0lEX1BMT0FNX1JFQ0VJVkVEX01JQ19FUlJPUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEsIHBsb2FtX3JlY2VpdmVkX21pY19lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX3dpbmRvd190eXBlLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX21lYXN1cmVtZW50X3N0YXR1cywgJnByb3BfZGVzY3JfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9hbGxvY19pZCwgJnByb3BfZGVzY3JfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9vbnVfaWQsICZwcm9wX2Rlc2NyX3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaXNfZGVsaW5lYXRpb24sICZwcm9wX2Rlc2NyX3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaXNfZWQsICZwcm9wX2Rlc2NyX3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfcnhfZGF0YSwgJnByb3BfZGVzY3JfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9wbG9hbV9yZWNlaXZlZF9vbnVfaWQsICZwcm9wX2Rlc2NyX3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfcGxvYW1fcmVjZWl2ZWRfbWljX2Vycm9yIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAid2luZG93X3R5cGUiLCAuZGVzY3IgPSAiU2lsZW50IFdpbmRvdyBvciBDdXQgb2ZmIFdpbmRvdyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhLCB3aW5kb3dfdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JvZ3VlX2RldGVjdGlvbl93aW5kb3cgfSwgeyAubmFtZSA9ICJtZWFzdXJlbWVudF9zdGF0dXMiLCAuZGVzY3IgPSAiU3RhdHVzIG9mIHRoZSByb2d1ZSBPTlUgZGV0ZWN0aW9uIHJlc3VsdC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSwgbWVhc3VyZW1lbnRfc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcm9ndWVfbWVhc3VyZW1lbnRfcmVzdWx0IH0sIHsgLm5hbWUgPSAiYWxsb2NfaWQiLCAuZGVzY3IgPSAiQWxsb2MtSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSwgYWxsb2NfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAib251X2lkIiwgLmRlc2NyID0gIk9OVS1JRCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhLCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiaXNfZGVsaW5lYXRpb24iLCAuZGVzY3IgPSAiQnVyc3QgRGVsaW5lYXRpb24gZGV0ZWN0ZWQgZHVyaW5nIHRoZSByb2d1ZSBPTlUgZGV0ZWN0aW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhLCBpc19kZWxpbmVhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImlzX2VkIiwgLmRlc2NyID0gIklzIEVEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEsIGlzX2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicnhfZGF0YSIsIC5kZXNjciA9ICJDYXB0dXJlZCBQTE9BTXUgbWVzc2FnZSBpZiB0aGUgYnVyc3QgZGVsaW5pZWF0aW9uIHdhcyBkZXRlY3RlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSwgcnhfZGF0YSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3U4X2xpc3RfdTMyIH0sIHsgLm5hbWUgPSAicGxvYW1fcmVjZWl2ZWRfb251X2lkIiwgLmRlc2NyID0gIk9OVSBJRCByZWNlaXZlZCBpbiB0aGUgcGxvYW0iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSwgcGxvYW1fcmVjZWl2ZWRfb251X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9LCB7IC5uYW1lID0gInBsb2FtX3JlY2VpdmVkX21pY19lcnJvciIsIC5kZXNjciA9ICJNaWMgZXJyb3IgaW4gdGhlIHJlY2VpdmVkIHBsb2FtIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGEsIHBsb2FtX3JlY2VpdmVkX21pY19lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJSb2d1ZSBkZXRlY3Rpb24gY29tcGxldGVkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX25pIC0gZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9uaSAtIGRpc2FibGVfYWxsX29udXNfY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fbmlfZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogeGdwb25fbmkgLSBhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogeGdwb25fbmkgLSBlbmFibGVfYWxsX29udXNfY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9uaSAtIHRvZF9yZXF1ZXN0X2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF90b2Rfc3RyaW5nID0geyAubmFtZSA9ICJ0b2Rfc3RyaW5nIiwgLmRlc2NyID0gInRvZF9zdHJpbmciLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfVE9EX1JFUVVFU1RfQ09NUExFVEVEX0lEX1RPRF9TVFJJTkcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEsIHRvZF9zdHJpbmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdHJfNjQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfc2ZjID0geyAubmFtZSA9ICJzZmMiLCAuZGVzY3IgPSAic2ZjIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9TRkMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEsIHNmYyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfcnRjX29mZnNldF9zZWMgPSB7IC5uYW1lID0gInJ0Y19vZmZzZXRfc2VjIiwgLmRlc2NyID0gInJ0Y19vZmZzZXRfc2VjIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX1RPRF9SRVFVRVNUX0NPTVBMRVRFRF9JRF9SVENfT0ZGU0VUX1NFQywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YSwgcnRjX29mZnNldF9zZWMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX3J0Y19vZmZzZXRfbnNlYyA9IHsgLm5hbWUgPSAicnRjX29mZnNldF9uc2VjIiwgLmRlc2NyID0gInJ0Y19vZmZzZXRfbnNlYyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfUlRDX09GRlNFVF9OU0VDLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhLCBydGNfb2Zmc2V0X25zZWMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX3N0YXR1cyA9IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gInN0YXR1cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9UT0RfUkVRVUVTVF9DT01QTEVURURfSURfU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfdG9kX3N0cmluZywgJnByb3BfZGVzY3JfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX3NmYywgJnByb3BfZGVzY3JfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX3J0Y19vZmZzZXRfc2VjLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfcnRjX29mZnNldF9uc2VjLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJ0b2Rfc3RyaW5nIiwgLmRlc2NyID0gInRvZF9zdHJpbmciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhLCB0b2Rfc3RyaW5nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RyXzY0IH0sIHsgLm5hbWUgPSAic2ZjIiwgLmRlc2NyID0gInNmYyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEsIHNmYyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJydGNfb2Zmc2V0X3NlYyIsIC5kZXNjciA9ICJydGNfb2Zmc2V0X3NlYyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEsIHJ0Y19vZmZzZXRfc2VjKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ0Y19vZmZzZXRfbnNlYyIsIC5kZXNjciA9ICJydGNfb2Zmc2V0X25zZWMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhLCBydGNfb2Zmc2V0X25zZWMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gInN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEiLCAuZGVzY3IgPSAiVE9EIHJlcXVlc3QgY29tcGxldGVkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX25pIC0gdG9kX3JlcXVlc3QgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9uaV90b2RfcmVxdWVzdF9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9uaSAtIHN0YXJ0X29udV91cGdyYWRlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfbGlzdF9vZl9vbnVfaWRzID0geyAubmFtZSA9ICJsaXN0X29mX29udV9pZHMiLCAuZGVzY3IgPSAiTGlzdCBvZiBPTlUgSURzIHRvIHVwZ3JhZGUgdGhlIGZpcm13YXJlLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9TVEFSVF9PTlVfVVBHUkFERV9JRF9MSVNUX09GX09OVV9JRFMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSwgbGlzdF9vZl9vbnVfaWRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX29udV9pZF9saXN0X3UzMiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfbGlzdF9vZl9vbnVfaWRzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImxpc3Rfb2Zfb251X2lkcyIsIC5kZXNjciA9ICJMaXN0IG9mIE9OVSBJRHMgdG8gdXBncmFkZSB0aGUgZmlybXdhcmUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhLCBsaXN0X29mX29udV9pZHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25fb251X2lkX2xpc3RfdTMyIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGEiLCAuZGVzY3IgPSAiT0xUIHRvIE9OVSBmaXJtd2FyZSB0cmFuc2ZlciIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9uaSAtIG9udV91cGdyYWRlX2NvbXBsZXRlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfc3RhdHVzID0geyAubmFtZSA9ICJzdGF0dXMiLCAuZGVzY3IgPSAiU3VjY2VzcyBvciBmYWlsdXJlLiAgQWdhaW5zdCBlbnRpcmUgdXBncmFkZSBwcm9jZXNzLiAgVGhpcyBpcyBhZGRlZCBwZXIgQW5hdCdzIHJlcXVlc3QuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9saXN0X29mX2ZhaWxlZF9lbnRpdGllcyA9IHsgLm5hbWUgPSAibGlzdF9vZl9mYWlsZWRfZW50aXRpZXMiLCAuZGVzY3IgPSAiTGlzdCBvZiBPTlUtSURzIHRoZSB1cGdyYWRlIGZhaWxlZCBmb3IuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX09OVV9VUEdSQURFX0NPTVBMRVRFX0lEX0xJU1RfT0ZfRkFJTEVEX0VOVElUSUVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEsIGxpc3Rfb2ZfZmFpbGVkX2VudGl0aWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9zdGF0dXNfbGlzdF91MzIgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX3N0YXR1cywgJnByb3BfZGVzY3JfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfbGlzdF9vZl9mYWlsZWRfZW50aXRpZXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdHVzIiwgLmRlc2NyID0gIlN1Y2Nlc3Mgb3IgZmFpbHVyZS4gIEFnYWluc3QgZW50aXJlIHVwZ3JhZGUgcHJvY2Vzcy4gIFRoaXMgaXMgYWRkZWQgcGVyIEFuYXQncyByZXF1ZXN0LiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAibGlzdF9vZl9mYWlsZWRfZW50aXRpZXMiLCAuZGVzY3IgPSAiTGlzdCBvZiBPTlUtSURzIHRoZSB1cGdyYWRlIGZhaWxlZCBmb3IuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhLCBsaXN0X29mX2ZhaWxlZF9lbnRpdGllcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2dwb25fb251X3VwZ3JhZGVfc3RhdHVzX2xpc3RfdTMyIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEiLCAuZGVzY3IgPSAiT05VIFVwZ3JhZGUgQ29tcGxldGUiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fbmkgLSByb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnRfcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogeGdwb25fbmkgLSBhZGp1c3RfdHhfd2F2ZWxlbmd0aCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX3NlcmlhbF9udW1iZXIgPSB7IC5uYW1lID0gInNlcmlhbF9udW1iZXIiLCAuZGVzY3IgPSAiU2VyaWFsIG51bWJlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9BREpVU1RfVFhfV0FWRUxFTkdUSF9JRF9TRVJJQUxfTlVNQkVSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEsIHNlcmlhbF9udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zZXJpYWxfbnVtYmVyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZnJlcWVuY3lfYWRqdXN0bWVudF9kaXJlY3Rpb24gPSB7IC5uYW1lID0gImZyZXFlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uIiwgLmRlc2NyID0gIkZyZXF1ZW5jeSBhZGp1c3RtZW50IGRpcmVjdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9BREpVU1RfVFhfV0FWRUxFTkdUSF9JRF9GUkVRRU5DWV9BREpVU1RNRU5UX0RJUkVDVElPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhLCBmcmVxZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2ZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2ZyZXF1ZW5jeV9hZGp1c3RtZW50X3NpemUgPSB7IC5uYW1lID0gImZyZXF1ZW5jeV9hZGp1c3RtZW50X3NpemUiLCAuZGVzY3IgPSAiVGhlIHNpemUgb2YgdGhlIGZyZXF1bmN5IGFkanVzdG1lbnQgaW4gdW5pdHMgb2YgMC4xIEdoeiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9BREpVU1RfVFhfV0FWRUxFTkdUSF9JRF9GUkVRVUVOQ1lfQURKVVNUTUVOVF9TSVpFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEsIGZyZXF1ZW5jeV9hZGp1c3RtZW50X3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX3NlcmlhbF9udW1iZXIsICZwcm9wX2Rlc2NyX3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2ZyZXFlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9mcmVxdWVuY3lfYWRqdXN0bWVudF9zaXplIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInNlcmlhbF9udW1iZXIiLCAuZGVzY3IgPSAiU2VyaWFsIG51bWJlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YSwgc2VyaWFsX251bWJlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3NlcmlhbF9udW1iZXIgfSwgeyAubmFtZSA9ICJmcmVxZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiIsIC5kZXNjciA9ICJGcmVxdWVuY3kgYWRqdXN0bWVudCBkaXJlY3Rpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEsIGZyZXFlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZnJlcXVlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uIH0sIHsgLm5hbWUgPSAiZnJlcXVlbmN5X2FkanVzdG1lbnRfc2l6ZSIsIC5kZXNjciA9ICJUaGUgc2l6ZSBvZiB0aGUgZnJlcXVuY3kgYWRqdXN0bWVudCBpbiB1bml0cyBvZiAwLjEgR2h6IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhLCBmcmVxdWVuY3lfYWRqdXN0bWVudF9zaXplKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEiLCAuZGVzY3IgPSAiSW5zdHJ1Y3QgYW4gdW5hc3NpZ25lZCBPTlUgdG8gYWRqdXN0IGl0cyB1cHN0cmVhbSB0cmFuc21pdHRlciB3YXZlbGVuZ3RoIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX25pIC0gc3RhdF9jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X2NmZ19jZmcgPSB7IC5uYW1lID0gImNmZyIsIC5kZXNjciA9ICJTdGF0aXN0aWMgYWxhcm0gY29uZmlndXJhdGlvbi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9DRkdfSURfQ0ZHLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fbmlfc3RhdF9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X2NmZ19jZmcgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9jZmdfZGF0YSwgY2ZnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdF9hbGFybV9jb25maWcgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfc3RhdF9jZmdfZGF0YSIsIC5kZXNjciA9ICJTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc3RhdF9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9uaSAtIHN0YXRfYWxhcm1fcmFpc2VkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfc3RhdCA9IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc3RhdF9pZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3N0YXRfaWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9uaSAtIHN0YXRfYWxhcm1fY2xlYXJlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9zdGF0ID0geyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3N0YXRfaWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfc3RhdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic3RhdCIsIC5kZXNjciA9ICJTdGF0aXN0aWMgaWRlbnRpZmllci4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfc3RhdF9pZCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX25pIC0gYXV0b19jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9hdXRvX2NmZ19hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQgPSB7IC5uYW1lID0gImFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX0FDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9hdXRvX2NmZ19jcHVfcGFja2V0c19mYWlsdXJlID0geyAubmFtZSA9ICJjcHVfcGFja2V0c19mYWlsdXJlIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJjcHVfcGFja2V0c19mYWlsdXJlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX0NQVV9QQUNLRVRTX0ZBSUxVUkUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSwgY3B1X3BhY2tldHNfZmFpbHVyZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2F1dG9fY2ZnX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkID0geyAubmFtZSA9ICJkZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfREVBQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSwgZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9hdXRvX2NmZ19kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCA9IHsgLm5hbWUgPSAiZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImRpc2FibGVfYWxsX29udXNfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX0RJU0FCTEVfQUxMX09OVVNfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGEsIGRpc2FibGVfYWxsX29udXNfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfYXV0b19jZmdfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCA9IHsgLm5hbWUgPSAiZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9FTkFCTEVfQUxMX09OVVNfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGEsIGVuYWJsZV9hbGxfb251c19jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9hdXRvX2NmZ19sb3MgPSB7IC5uYW1lID0gImxvcyIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibG9zXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX0xPUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBsb3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9hdXRvX2NmZ19vbnVfZGlzY292ZXJlZCA9IHsgLm5hbWUgPSAib251X2Rpc2NvdmVyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm9udV9kaXNjb3ZlcmVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX09OVV9ESVNDT1ZFUkVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGEsIG9udV9kaXNjb3ZlcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfYXV0b19jZmdfb251X3VwZ3JhZGVfY29tcGxldGUgPSB7IC5uYW1lID0gIm9udV91cGdyYWRlX2NvbXBsZXRlIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvbnVfdXBncmFkZV9jb21wbGV0ZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9PTlVfVVBHUkFERV9DT01QTEVURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBvbnVfdXBncmFkZV9jb21wbGV0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2F1dG9fY2ZnX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkID0geyAubmFtZSA9ICJwcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9hdXRvX2NmZ19wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCA9IHsgLm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInByb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGEsIHByb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfYXV0b19jZmdfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUgPSB7IC5uYW1lID0gInByb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJwcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBwcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2F1dG9fY2ZnX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQgPSB7IC5uYW1lID0gInJvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInJvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfUk9HVUVfREVURUNUSU9OX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCByb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfYXV0b19jZmdfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0ID0geyAubmFtZSA9ICJyb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInJvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9ST0dVRV9PTlVfU1BFQ0lBTF9NQVBfQ1lDTEVfU1RBUlQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSwgcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfYXV0b19jZmdfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCA9IHsgLm5hbWUgPSAic2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9TRVJJQUxfTlVNQkVSX0FDUVVJU0lUSU9OX0NZQ0xFX1NUQVJULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGEsIHNlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9uaV9hdXRvX2NmZ19zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCA9IHsgLm5hbWUgPSAic3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX05JX0FVVE9fQ0ZHX0lEX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGEsIHN0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfYXV0b19jZmdfc3RhdF9hbGFybV9jbGVhcmVkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX0NMRUFSRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9jbGVhcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfYXV0b19jZmdfc3RhdF9hbGFybV9yYWlzZWQgPSB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX3JhaXNlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9TVEFUX0FMQVJNX1JBSVNFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX3JhaXNlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX25pX2F1dG9fY2ZnX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWQgPSB7IC5uYW1lID0gInN0YXRlX2NoYW5nZV9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRlX2NoYW5nZV9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fTklfQVVUT19DRkdfSURfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBzdGF0ZV9jaGFuZ2VfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fbmlfYXV0b19jZmdfdG9kX3JlcXVlc3RfY29tcGxldGVkID0geyAubmFtZSA9ICJ0b2RfcmVxdWVzdF9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInRvZF9yZXF1ZXN0X2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0NGR19JRF9UT0RfUkVRVUVTVF9DT01QTEVURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSwgdG9kX3JlcXVlc3RfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fbmlfYXV0b19jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9hdXRvX2NmZ19hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQsICZwcm9wX2Rlc2NyX3hncG9uX25pX2F1dG9fY2ZnX2NwdV9wYWNrZXRzX2ZhaWx1cmUsICZwcm9wX2Rlc2NyX3hncG9uX25pX2F1dG9fY2ZnX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9hdXRvX2NmZ19kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfeGdwb25fbmlfYXV0b19jZmdfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfeGdwb25fbmlfYXV0b19jZmdfbG9zLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9hdXRvX2NmZ19vbnVfZGlzY292ZXJlZCwgJnByb3BfZGVzY3JfeGdwb25fbmlfYXV0b19jZmdfb251X3VwZ3JhZGVfY29tcGxldGUsICZwcm9wX2Rlc2NyX3hncG9uX25pX2F1dG9fY2ZnX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkLCAmcHJvcF9kZXNjcl94Z3Bvbl9uaV9hdXRvX2NmZ19wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfeGdwb25fbmlfYXV0b19jZmdfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUsICZwcm9wX2Rlc2NyX3hncG9uX25pX2F1dG9fY2ZnX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQsICZwcm9wX2Rlc2NyX3hncG9uX25pX2F1dG9fY2ZnX3JvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydCwgJnByb3BfZGVzY3JfeGdwb25fbmlfYXV0b19jZmdfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCwgJnByb3BfZGVzY3JfeGdwb25fbmlfYXV0b19jZmdfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQsICZwcm9wX2Rlc2NyX3hncG9uX25pX2F1dG9fY2ZnX3N0YXRfYWxhcm1fY2xlYXJlZCwgJnByb3BfZGVzY3JfeGdwb25fbmlfYXV0b19jZmdfc3RhdF9hbGFybV9yYWlzZWQsICZwcm9wX2Rlc2NyX3hncG9uX25pX2F1dG9fY2ZnX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWQsICZwcm9wX2Rlc2NyX3hncG9uX25pX2F1dG9fY2ZnX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSwgYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiY3B1X3BhY2tldHNfZmFpbHVyZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiY3B1X3BhY2tldHNfZmFpbHVyZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSwgY3B1X3BhY2tldHNfZmFpbHVyZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImRlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJkZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSwgZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJkaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGEsIGRpc2FibGVfYWxsX29udXNfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSwgZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImxvcyIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwibG9zXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBsb3MpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJvbnVfZGlzY292ZXJlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwib251X2Rpc2NvdmVyZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGEsIG9udV9kaXNjb3ZlcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAib251X3VwZ3JhZGVfY29tcGxldGUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm9udV91cGdyYWRlX2NvbXBsZXRlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBvbnVfdXBncmFkZV9jb21wbGV0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJwcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSwgcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJwcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGEsIHByb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInByb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBwcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInJvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInJvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGEsIHJvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJyb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInJvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSwgcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSwgc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSwgc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSwgc3RhdF9hbGFybV9jbGVhcmVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fcmFpc2VkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX3JhaXNlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN0YXRlX2NoYW5nZV9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRlX2NoYW5nZV9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGEsIHN0YXRlX2NoYW5nZV9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJ0b2RfcmVxdWVzdF9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInRvZF9yZXF1ZXN0X2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSwgdG9kX3JlcXVlc3RfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGEiLCAuZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2F1dG9fY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fbmlfYXV0b19jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogPT09PSBPYmplY3Q6IHhncG9uX29udSA9PT09ICovCisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSBrZXkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfa2V5X3Bvbl9uaSA9IHsgLm5hbWUgPSAicG9uX25pIiwgLmRlc2NyID0gIlBPTiBuZXR3b3JrIGludGVyZmFjZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX1BPTl9OSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5LCBwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfa2V5X29udV9pZCA9IHsgLm5hbWUgPSAib251X2lkIiwgLmRlc2NyID0gIm9udSBpZCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfS0VZX0lEX09OVV9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5LCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X2tleV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX29udV9rZXlfcG9uX25pLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfa2V5X29udV9pZCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIG5ldHdvcmsgaW50ZXJmYWNlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5LCBwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJvbnVfaWQiLCAuZGVzY3IgPSAib251IGlkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5LCBvbnVfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2tleSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9rZXkiLCAuZGVzY3IgPSAia2V5IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2tleV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfa2V5X2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIGNmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9jZmdfb251X3N0YXRlID0geyAubmFtZSA9ICJvbnVfc3RhdGUiLCAuZGVzY3IgPSAiQ3VycmVudCBPTlUgc3RhdGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9PTlVfU1RBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NmZ19kYXRhLCBvbnVfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9vbnVfc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2ZnX29udV9vbGRfc3RhdGUgPSB7IC5uYW1lID0gIm9udV9vbGRfc3RhdGUiLCAuZGVzY3IgPSAib251IG9sZCBzdGF0ZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfT05VX09MRF9TVEFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEsIG9udV9vbGRfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9vbnVfc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2ZnX2FsYXJtX3N0YXRlID0geyAubmFtZSA9ICJhbGFybV9zdGF0ZSIsIC5kZXNjciA9ICJTdGF0ZSBvZiBhbGwgT05VIGFsYXJtcy4gIFRoaXMgaXMgbm9ybWFsbHkgcmVhZC1vbmx5IGFuZCBjYW4gb25seSBiZSB3cml0dGVuIHdoZW4gdGhlIFBPTiBpcyBpbiBhY3RpdmUtc3RhbmRieSBtb2RlIHRvIGtlZXAgdGhlIE9OVSBpbiBzeW5jLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0FMQVJNX1NUQVRFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgYWxhcm1fc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2ZnX3JlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMgPSB7IC5uYW1lID0gInJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMiLCAuZGVzY3IgPSAiQUVTIGVuY3J5cHRpb24ga2V5cyBsZWFybmVkIGR1cmluZyBPTlUgcmVnaXN0cmF0aW9uLiAgVGhpcyBpcyBub3JtYWxseSByZWFkLW9ubHkgYW5kIGNhbiBvbmx5IGJlIHdyaXR0ZW4gd2hlbiB0aGUgUE9OIGlzIGluIGFjdGl2ZS1zdGFuZGJ5IG1vZGUgdG8ga2VlcCB0aGUgT05VIGluIHN5bmMuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkVHSVNUUkFUSU9OX0VOQ1JZUFRJT05fS0VZUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEsIHJlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2tleXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2ZnX2N1cnJlbnRfZW5jcnlwdGlvbl9rZXkgPSB7IC5uYW1lID0gImN1cnJlbnRfZW5jcnlwdGlvbl9rZXkiLCAuZGVzY3IgPSAiQ3VycmVudCBBRVMgZW5jcnlwdGlvbiBrZXkuICBUaGlzIGlzIG5vcm1hbGx5IHJlYWQtb25seSBhbmQgY2FuIG9ubHkgYmUgd3JpdHRlbiB3aGVuIHRoZSBQT04gaXMgaW4gYWN0aXZlLXN0YW5kYnkgbW9kZSB0byBrZWVwIHRoZSBPTlUgaW4gc3luYy4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9DVVJSRU5UX0VOQ1JZUFRJT05fS0VZLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgY3VycmVudF9lbmNyeXB0aW9uX2tleSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9hZXNfa2V5IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2NmZ19zZXJpYWxfbnVtYmVyID0geyAubmFtZSA9ICJzZXJpYWxfbnVtYmVyIiwgLmRlc2NyID0gIk9OVSBzZXJpYWwgbnVtYmVyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfU0VSSUFMX05VTUJFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEsIHNlcmlhbF9udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zZXJpYWxfbnVtYmVyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2NmZ19yZWdpc3RyYXRpb25faWQgPSB7IC5uYW1lID0gInJlZ2lzdHJhdGlvbl9pZCIsIC5kZXNjciA9ICJPTlUgcmVnaXN0cmF0aW9uIElEIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkVHSVNUUkFUSU9OX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgcmVnaXN0cmF0aW9uX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzM2IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2NmZ19yZWdpc3RyYXRpb25faWRfYXV0b19sZWFybmluZyA9IHsgLm5hbWUgPSAicmVnaXN0cmF0aW9uX2lkX2F1dG9fbGVhcm5pbmciLCAuZGVzY3IgPSAiRW5hYmxlXFxEaXNhYmxlIGF1dG9tYXRpYyByZWdpc3RyYXRpb24gbGVhcm5pbmciLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9SRUdJU1RSQVRJT05fSURfQVVUT19MRUFSTklORywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEsIHJlZ2lzdHJhdGlvbl9pZF9hdXRvX2xlYXJuaW5nKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2NmZ19yYW5naW5nX2J1cnN0X3Byb2ZpbGUgPSB7IC5uYW1lID0gInJhbmdpbmdfYnVyc3RfcHJvZmlsZSIsIC5kZXNjciA9ICJCdXJzdCBwcm9maWxlIGluZGV4IGZvciByYW5naW5nIGFsbG9jYXRpb25zIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkFOR0lOR19CVVJTVF9QUk9GSUxFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgcmFuZ2luZ19idXJzdF9wcm9maWxlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2NmZ19kYXRhX2J1cnN0X3Byb2ZpbGUgPSB7IC5uYW1lID0gImRhdGFfYnVyc3RfcHJvZmlsZSIsIC5kZXNjciA9ICJCdXJzdCBwcm9maWxlIGluZGV4IGZvciBkYXRhIGFsbG9jYXRpb25zIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfREFUQV9CVVJTVF9QUk9GSUxFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgZGF0YV9idXJzdF9wcm9maWxlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2NmZ19yYW5naW5nX3RpbWUgPSB7IC5uYW1lID0gInJhbmdpbmdfdGltZSIsIC5kZXNjciA9ICJPTlUgcmFuZ2luZyB0aW1lLiAgVGhpcyBpcyBub3JtYWxseSByZWFkLW9ubHkgYW5kIGNhbiBvbmx5IGJlIHdyaXR0ZW4gd2hlbiB0aGUgUE9OIGlzIGluIGFjdGl2ZS1zdGFuZGJ5IG1vZGUgdG8ga2VlcCB0aGUgT05VIGluIHN5bmMuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfUkFOR0lOR19USU1FLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgcmFuZ2luZ190aW1lKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9jZmdfZGlzYWJsZWRfYWZ0ZXJfZGlzY292ZXJ5ID0geyAubmFtZSA9ICJkaXNhYmxlZF9hZnRlcl9kaXNjb3ZlcnkiLCAuZGVzY3IgPSAiVGhpcyBPTlUgd2FzIGRpc2FibGVkIGFmdGVyIFNOIGRpc2NvdmVyeSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfRElTQUJMRURfQUZURVJfRElTQ09WRVJZLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgZGlzYWJsZWRfYWZ0ZXJfZGlzY292ZXJ5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2NmZ19kZWFjdGl2YXRpb25fcmVhc29uID0geyAubmFtZSA9ICJkZWFjdGl2YXRpb25fcmVhc29uIiwgLmRlc2NyID0gImRlYWN0aXZhdGlvbiByZWFzb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0RFQUNUSVZBVElPTl9SRUFTT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NmZ19kYXRhLCBkZWFjdGl2YXRpb25fcmVhc29uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfZGVhY3RpdmF0aW9uX3JlYXNvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9jZmdfYWxsX2dlbV9wb3J0cyA9IHsgLm5hbWUgPSAiYWxsX2dlbV9wb3J0cyIsIC5kZXNjciA9ICJBbGwgdW5pY2FzdCBHRU0gcG9ydHMgY3VycmVudGx5IHByb3Zpc2lvbmVkIG9uIHRoaXMgT05VLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUiwgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfQUxMX0dFTV9QT1JUUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEsIGFsbF9nZW1fcG9ydHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9nZW1fcG9ydF93aXRoX3N0YXRlX2xpc3RfdTE2X21heF8yNTYgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2ZnX2FsbF9hbGxvY3MgPSB7IC5uYW1lID0gImFsbF9hbGxvY3MiLCAuZGVzY3IgPSAiQWxsIGFsbG9jIElEcyBjdXJyZW50bHkgcHJvdmlzaW9uZWQgb24gdGhpcyBPTlUuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9BTExfQUxMT0NTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgYWxsX2FsbG9jcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2NmZ19leHRlbmRlZF9ndWFyZF90aW1lID0geyAubmFtZSA9ICJleHRlbmRlZF9ndWFyZF90aW1lIiwgLmRlc2NyID0gIkFkZGl0aW9uYWwgZ3VhcmQgdGltZSAoaW4gYnl0ZXMpIGZvciB0aGlzIE9OVS4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9FWFRFTkRFRF9HVUFSRF9USU1FLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgZXh0ZW5kZWRfZ3VhcmRfdGltZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2V4dGVuZGVkX2d1YXJkX3RpbWUgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2ZnX3VzX2xpbmVfcmF0ZSA9IHsgLm5hbWUgPSAidXNfbGluZV9yYXRlIiwgLmRlc2NyID0gIlVTIGxpbmUgcmF0ZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1VTX0xJTkVfUkFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEsIHVzX2xpbmVfcmF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Vwc3RyZWFtX2xpbmVfcmF0ZV9jYXBhYmlsaXRpZXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2ZnX2NhbGlicmF0aW9uX3JlY29yZCA9IHsgLm5hbWUgPSAiY2FsaWJyYXRpb25fcmVjb3JkIiwgLmRlc2NyID0gIkNhbGlicmF0aW9uIHJlY29yZCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX0NBTElCUkFUSU9OX1JFQ09SRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEsIGNhbGlicmF0aW9uX3JlY29yZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl9jYWxpYnJhdGlvbl9yZWNvcmRfOCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9jZmdfdHVuaW5nX2dyYW51bGFyaXR5ID0geyAubmFtZSA9ICJ0dW5pbmdfZ3JhbnVsYXJpdHkiLCAuZGVzY3IgPSAiVGhlIHR1bmluZyBncmFudWxhcml0eSBvZiB0aGUgT05VIHRyYW5zbWl0dGVkIGV4cHJlc3NlZCBpbiB1bml0cyBvZiAxR0h6LiBWYWx1ZSBvZiAwIGluZGljYXRlcyB0aGF0IHRoZSBPTlUgZG9lcyBub3Qgc3VwcG9ydCBmaW5lIHR1bmluZy9kaXRoZXJpbmciLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0NGR19JRF9UVU5JTkdfR1JBTlVMQVJJVFksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NmZ19kYXRhLCB0dW5pbmdfZ3JhbnVsYXJpdHkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2ZnX3N0ZXBfdHVuaW5nX3RpbWUgPSB7IC5uYW1lID0gInN0ZXBfdHVuaW5nX3RpbWUiLCAuZGVzY3IgPSAiVGhlIHZhbHVlIG9mIHRoZSB0dW5pbmcgdGltZSBmb3IgYSBzaW5nbGUgZ3JhbnVsYXJpdHkgc3RlcCwgZXhwcmVzc2VkIGluIHVuaXRzIG9mIFBIWSBmcmFtZXMuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9DRkdfSURfU1RFUF9UVU5JTkdfVElNRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEsIHN0ZXBfdHVuaW5nX3RpbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2ZnX3Bvd2VyX2xldmVsbGluZ19jYXBhYmlsaXRpZXMgPSB7IC5uYW1lID0gInBvd2VyX2xldmVsbGluZ19jYXBhYmlsaXRpZXMiLCAuZGVzY3IgPSAiUG93ZXIgbGV2ZWxsaW5nIGNhcGFiaWxpdGllcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1BPV0VSX0xFVkVMTElOR19DQVBBQklMSVRJRVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NmZ19kYXRhLCBwb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0aWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2NmZ19yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMgPSB7IC5uYW1lID0gInJlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cyIsIC5kZXNjciA9ICJUaGlzIHZhbHVlIGluZGljYXRlIHRoYXQgdGhlIG9udSBpcyBpbiB0aGUgbWlkZGxlIG9mIHJlcXVlc3QgcmVnaXN0cmF0aW9uIHByb2Nlc3MiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQ0ZHX0lEX1JFUVVFU1RfUkVHSVNUUkFUSU9OX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEsIHJlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3JlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX29udV9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2ZnX29udV9zdGF0ZSwgJnByb3BfZGVzY3JfeGdwb25fb251X2NmZ19vbnVfb2xkX3N0YXRlLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2ZnX2FsYXJtX3N0YXRlLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2ZnX3JlZ2lzdHJhdGlvbl9lbmNyeXB0aW9uX2tleXMsICZwcm9wX2Rlc2NyX3hncG9uX29udV9jZmdfY3VycmVudF9lbmNyeXB0aW9uX2tleSwgJnByb3BfZGVzY3JfeGdwb25fb251X2NmZ19zZXJpYWxfbnVtYmVyLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2ZnX3JlZ2lzdHJhdGlvbl9pZCwgJnByb3BfZGVzY3JfeGdwb25fb251X2NmZ19yZWdpc3RyYXRpb25faWRfYXV0b19sZWFybmluZywgJnByb3BfZGVzY3JfeGdwb25fb251X2NmZ19yYW5naW5nX2J1cnN0X3Byb2ZpbGUsICZwcm9wX2Rlc2NyX3hncG9uX29udV9jZmdfZGF0YV9idXJzdF9wcm9maWxlLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2ZnX3JhbmdpbmdfdGltZSwgJnByb3BfZGVzY3JfeGdwb25fb251X2NmZ19kaXNhYmxlZF9hZnRlcl9kaXNjb3ZlcnksICZwcm9wX2Rlc2NyX3hncG9uX29udV9jZmdfZGVhY3RpdmF0aW9uX3JlYXNvbiwgJnByb3BfZGVzY3JfeGdwb25fb251X2NmZ19hbGxfZ2VtX3BvcnRzLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2ZnX2FsbF9hbGxvY3MsICZwcm9wX2Rlc2NyX3hncG9uX29udV9jZmdfZXh0ZW5kZWRfZ3VhcmRfdGltZSwgJnByb3BfZGVzY3JfeGdwb25fb251X2NmZ191c19saW5lX3JhdGUsICZwcm9wX2Rlc2NyX3hncG9uX29udV9jZmdfY2FsaWJyYXRpb25fcmVjb3JkLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2ZnX3R1bmluZ19ncmFudWxhcml0eSwgJnByb3BfZGVzY3JfeGdwb25fb251X2NmZ19zdGVwX3R1bmluZ190aW1lLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2ZnX3Bvd2VyX2xldmVsbGluZ19jYXBhYmlsaXRpZXMsICZwcm9wX2Rlc2NyX3hncG9uX29udV9jZmdfcmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAib251X3N0YXRlIiwgLmRlc2NyID0gIkN1cnJlbnQgT05VIHN0YXRlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEsIG9udV9zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X29udV9zdGF0ZSB9LCB7IC5uYW1lID0gIm9udV9vbGRfc3RhdGUiLCAuZGVzY3IgPSAib251IG9sZCBzdGF0ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NmZ19kYXRhLCBvbnVfb2xkX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb251X3N0YXRlIH0sIHsgLm5hbWUgPSAiYWxhcm1fc3RhdGUiLCAuZGVzY3IgPSAiU3RhdGUgb2YgYWxsIE9OVSBhbGFybXMuICBUaGlzIGlzIG5vcm1hbGx5IHJlYWQtb25seSBhbmQgY2FuIG9ubHkgYmUgd3JpdHRlbiB3aGVuIHRoZSBQT04gaXMgaW4gYWN0aXZlLXN0YW5kYnkgbW9kZSB0byBrZWVwIHRoZSBPTlUgaW4gc3luYy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgYWxhcm1fc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGUgfSwgeyAubmFtZSA9ICJyZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzIiwgLmRlc2NyID0gIkFFUyBlbmNyeXB0aW9uIGtleXMgbGVhcm5lZCBkdXJpbmcgT05VIHJlZ2lzdHJhdGlvbi4gIFRoaXMgaXMgbm9ybWFsbHkgcmVhZC1vbmx5IGFuZCBjYW4gb25seSBiZSB3cml0dGVuIHdoZW4gdGhlIFBPTiBpcyBpbiBhY3RpdmUtc3RhbmRieSBtb2RlIHRvIGtlZXAgdGhlIE9OVSBpbiBzeW5jLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NmZ19kYXRhLCByZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9rZXlzIH0sIHsgLm5hbWUgPSAiY3VycmVudF9lbmNyeXB0aW9uX2tleSIsIC5kZXNjciA9ICJDdXJyZW50IEFFUyBlbmNyeXB0aW9uIGtleS4gIFRoaXMgaXMgbm9ybWFsbHkgcmVhZC1vbmx5IGFuZCBjYW4gb25seSBiZSB3cml0dGVuIHdoZW4gdGhlIFBPTiBpcyBpbiBhY3RpdmUtc3RhbmRieSBtb2RlIHRvIGtlZXAgdGhlIE9OVSBpbiBzeW5jLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NmZ19kYXRhLCBjdXJyZW50X2VuY3J5cHRpb25fa2V5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2Flc19rZXkgfSwgeyAubmFtZSA9ICJzZXJpYWxfbnVtYmVyIiwgLmRlc2NyID0gIk9OVSBzZXJpYWwgbnVtYmVyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEsIHNlcmlhbF9udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zZXJpYWxfbnVtYmVyIH0sIHsgLm5hbWUgPSAicmVnaXN0cmF0aW9uX2lkIiwgLmRlc2NyID0gIk9OVSByZWdpc3RyYXRpb24gSUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgcmVnaXN0cmF0aW9uX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzM2IH0sIHsgLm5hbWUgPSAicmVnaXN0cmF0aW9uX2lkX2F1dG9fbGVhcm5pbmciLCAuZGVzY3IgPSAiRW5hYmxlXFxEaXNhYmxlIGF1dG9tYXRpYyByZWdpc3RyYXRpb24gbGVhcm5pbmciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgcmVnaXN0cmF0aW9uX2lkX2F1dG9fbGVhcm5pbmcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJyYW5naW5nX2J1cnN0X3Byb2ZpbGUiLCAuZGVzY3IgPSAiQnVyc3QgcHJvZmlsZSBpbmRleCBmb3IgcmFuZ2luZyBhbGxvY2F0aW9ucyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NmZ19kYXRhLCByYW5naW5nX2J1cnN0X3Byb2ZpbGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJkYXRhX2J1cnN0X3Byb2ZpbGUiLCAuZGVzY3IgPSAiQnVyc3QgcHJvZmlsZSBpbmRleCBmb3IgZGF0YSBhbGxvY2F0aW9ucyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NmZ19kYXRhLCBkYXRhX2J1cnN0X3Byb2ZpbGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJyYW5naW5nX3RpbWUiLCAuZGVzY3IgPSAiT05VIHJhbmdpbmcgdGltZS4gIFRoaXMgaXMgbm9ybWFsbHkgcmVhZC1vbmx5IGFuZCBjYW4gb25seSBiZSB3cml0dGVuIHdoZW4gdGhlIFBPTiBpcyBpbiBhY3RpdmUtc3RhbmRieSBtb2RlIHRvIGtlZXAgdGhlIE9OVSBpbiBzeW5jLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NmZ19kYXRhLCByYW5naW5nX3RpbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAiZGlzYWJsZWRfYWZ0ZXJfZGlzY292ZXJ5IiwgLmRlc2NyID0gIlRoaXMgT05VIHdhcyBkaXNhYmxlZCBhZnRlciBTTiBkaXNjb3ZlcnkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgZGlzYWJsZWRfYWZ0ZXJfZGlzY292ZXJ5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAiZGVhY3RpdmF0aW9uX3JlYXNvbiIsIC5kZXNjciA9ICJkZWFjdGl2YXRpb24gcmVhc29uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEsIGRlYWN0aXZhdGlvbl9yZWFzb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9kZWFjdGl2YXRpb25fcmVhc29uIH0sIHsgLm5hbWUgPSAiYWxsX2dlbV9wb3J0cyIsIC5kZXNjciA9ICJBbGwgdW5pY2FzdCBHRU0gcG9ydHMgY3VycmVudGx5IHByb3Zpc2lvbmVkIG9uIHRoaXMgT05VLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NmZ19kYXRhLCBhbGxfZ2VtX3BvcnRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fZ2VtX3BvcnRfd2l0aF9zdGF0ZV9saXN0X3UxNl9tYXhfMjU2IH0sIHsgLm5hbWUgPSAiYWxsX2FsbG9jcyIsIC5kZXNjciA9ICJBbGwgYWxsb2MgSURzIGN1cnJlbnRseSBwcm92aXNpb25lZCBvbiB0aGlzIE9OVS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgYWxsX2FsbG9jcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2FsbG9jX3dpdGhfc3RhdGVfbGlzdF91MTZfbWF4XzMyIH0sIHsgLm5hbWUgPSAiZXh0ZW5kZWRfZ3VhcmRfdGltZSIsIC5kZXNjciA9ICJBZGRpdGlvbmFsIGd1YXJkIHRpbWUgKGluIGJ5dGVzKSBmb3IgdGhpcyBPTlUuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEsIGV4dGVuZGVkX2d1YXJkX3RpbWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9leHRlbmRlZF9ndWFyZF90aW1lIH0sIHsgLm5hbWUgPSAidXNfbGluZV9yYXRlIiwgLmRlc2NyID0gIlVTIGxpbmUgcmF0ZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NmZ19kYXRhLCB1c19saW5lX3JhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91cHN0cmVhbV9saW5lX3JhdGVfY2FwYWJpbGl0aWVzIH0sIHsgLm5hbWUgPSAiY2FsaWJyYXRpb25fcmVjb3JkIiwgLmRlc2NyID0gIkNhbGlicmF0aW9uIHJlY29yZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NmZ19kYXRhLCBjYWxpYnJhdGlvbl9yZWNvcmQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfY2FsaWJyYXRpb25fcmVjb3JkXzggfSwgeyAubmFtZSA9ICJ0dW5pbmdfZ3JhbnVsYXJpdHkiLCAuZGVzY3IgPSAiVGhlIHR1bmluZyBncmFudWxhcml0eSBvZiB0aGUgT05VIHRyYW5zbWl0dGVkIGV4cHJlc3NlZCBpbiB1bml0cyBvZiAxR0h6LiBWYWx1ZSBvZiAwIGluZGljYXRlcyB0aGF0IHRoZSBPTlUgZG9lcyBub3Qgc3VwcG9ydCBmaW5lIHR1bmluZy9kaXRoZXJpbmciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgdHVuaW5nX2dyYW51bGFyaXR5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAic3RlcF90dW5pbmdfdGltZSIsIC5kZXNjciA9ICJUaGUgdmFsdWUgb2YgdGhlIHR1bmluZyB0aW1lIGZvciBhIHNpbmdsZSBncmFudWxhcml0eSBzdGVwLCBleHByZXNzZWQgaW4gdW5pdHMgb2YgUEhZIGZyYW1lcy4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSwgc3RlcF90dW5pbmdfdGltZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInBvd2VyX2xldmVsbGluZ19jYXBhYmlsaXRpZXMiLCAuZGVzY3IgPSAiUG93ZXIgbGV2ZWxsaW5nIGNhcGFiaWxpdGllcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NmZ19kYXRhLCBwb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0aWVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAicmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzIiwgLmRlc2NyID0gIlRoaXMgdmFsdWUgaW5kaWNhdGUgdGhhdCB0aGUgb251IGlzIGluIHRoZSBtaWRkbGUgb2YgcmVxdWVzdCByZWdpc3RyYXRpb24gcHJvY2VzcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NmZ19kYXRhLCByZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiY2ZnIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIHN0YXQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF9wb3NpdGl2ZV9kcmlmdCA9IHsgLm5hbWUgPSAicG9zaXRpdmVfZHJpZnQiLCAuZGVzY3IgPSAicG9zaXRpdmUgZHJpZnQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUE9TSVRJVkVfRFJJRlQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgcG9zaXRpdmVfZHJpZnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3N0YXRfbmVnYXRpdmVfZHJpZnQgPSB7IC5uYW1lID0gIm5lZ2F0aXZlX2RyaWZ0IiwgLmRlc2NyID0gIm5lZ2F0aXZlIGRyaWZ0IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX05FR0FUSVZFX0RSSUZULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGEsIG5lZ2F0aXZlX2RyaWZ0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X2RlbGltaXRlcl9taXNzX2RldGVjdGlvbiA9IHsgLm5hbWUgPSAiZGVsaW1pdGVyX21pc3NfZGV0ZWN0aW9uIiwgLmRlc2NyID0gImRlbGltaXRlciBtaXNzIGRldGVjdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9ERUxJTUlURVJfTUlTU19ERVRFQ1RJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgZGVsaW1pdGVyX21pc3NfZGV0ZWN0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X2JpcDMyX2Vycm9ycyA9IHsgLm5hbWUgPSAiYmlwMzJfZXJyb3JzIiwgLmRlc2NyID0gImJpcDMyIGVycm9ycyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9CSVAzMl9FUlJPUlMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgYmlwMzJfZXJyb3JzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X3J4X3dvcmRzID0geyAubmFtZSA9ICJyeF93b3JkcyIsIC5kZXNjciA9ICJOdW1iZXIgb2YgNC1ieXRlIHdvcmRzIHJlY2VpdmVkICh3b3JkIHNpemUgaXMgNCBieXRlcyByZWdhcmRsZXNzIG9mIHVwc3RyZWFtIGRhdGEgcmF0ZSkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX1dPUkRTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGEsIHJ4X3dvcmRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X2ZlY19jb3JyZWN0ZWRfc3ltYm9scyA9IHsgLm5hbWUgPSAiZmVjX2NvcnJlY3RlZF9zeW1ib2xzIiwgLmRlc2NyID0gImZlYyBjb3JyZWN0ZWQgc3ltYm9scyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09SUkVDVEVEX1NZTUJPTFMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgZmVjX2NvcnJlY3RlZF9zeW1ib2xzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X2ZlY19jb3JyZWN0ZWRfY29kZXdvcmRzID0geyAubmFtZSA9ICJmZWNfY29ycmVjdGVkX2NvZGV3b3JkcyIsIC5kZXNjciA9ICJmZWMgY29ycmVjdGVkIGNvZGV3b3JkcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09SUkVDVEVEX0NPREVXT1JEUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhLCBmZWNfY29ycmVjdGVkX2NvZGV3b3JkcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF9mZWNfdW5jb3JyZWN0YWJsZV9jb2Rld29yZHMgPSB7IC5uYW1lID0gImZlY191bmNvcnJlY3RhYmxlX2NvZGV3b3JkcyIsIC5kZXNjciA9ICJmZWMgdW5jb3JyZWN0YWJsZSBjb2Rld29yZHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX1VOQ09SUkVDVEFCTEVfQ09ERVdPUkRTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGEsIGZlY191bmNvcnJlY3RhYmxlX2NvZGV3b3JkcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF9mZWNfY29kZXdvcmRzID0geyAubmFtZSA9ICJmZWNfY29kZXdvcmRzIiwgLmRlc2NyID0gImZlYyB0b3RhbCBjb2Rld29yZHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfRkVDX0NPREVXT1JEUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhLCBmZWNfY29kZXdvcmRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X2ZlY19jb3JyZWN0ZWRfYml0cyA9IHsgLm5hbWUgPSAiZmVjX2NvcnJlY3RlZF9iaXRzIiwgLmRlc2NyID0gImZlYyBjb3JyZWN0ZWQgYml0cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9GRUNfQ09SUkVDVEVEX0JJVFMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgZmVjX2NvcnJlY3RlZF9iaXRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X3hnZW1fa2V5X2Vycm9ycyA9IHsgLm5hbWUgPSAieGdlbV9rZXlfZXJyb3JzIiwgLmRlc2NyID0gInhnZW0ga2V5IGVycm9yIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1hHRU1fS0VZX0VSUk9SUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhLCB4Z2VtX2tleV9lcnJvcnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3N0YXRfeGdlbV9sb3NzID0geyAubmFtZSA9ICJ4Z2VtX2xvc3MiLCAuZGVzY3IgPSAieGdlbSBsb3NzICIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9YR0VNX0xPU1MsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgeGdlbV9sb3NzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X3J4X3Bsb2Ftc19taWNfZXJyb3IgPSB7IC5uYW1lID0gInJ4X3Bsb2Ftc19taWNfZXJyb3IiLCAuZGVzY3IgPSAibWljIGVycm9yIHBsb2FtIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX1BMT0FNU19NSUNfRVJST1IsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgcnhfcGxvYW1zX21pY19lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF9yeF9wbG9hbXNfbm9uX2lkbGUgPSB7IC5uYW1lID0gInJ4X3Bsb2Ftc19ub25faWRsZSIsIC5kZXNjciA9ICJub24gaWRsZSBwbG9hbSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9QTE9BTVNfTk9OX0lETEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgcnhfcGxvYW1zX25vbl9pZGxlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X3J4X29tY2kgPSB7IC5uYW1lID0gInJ4X29tY2kiLCAuZGVzY3IgPSAiUmVjZWl2ZWQgT01DSSBwYWNrZXRzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0lEX1JYX09NQ0ksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgcnhfb21jaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF9yeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yID0geyAubmFtZSA9ICJyeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yIiwgLmRlc2NyID0gIlJlY2VpdmVkIE9NQ0kgcGFja2V0cyB3aXRoIENSQyBlcnJvcnMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfT01DSV9QQUNLRVRTX0NSQ19FUlJPUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhLCByeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X3J4X2J5dGVzID0geyAubmFtZSA9ICJyeF9ieXRlcyIsIC5kZXNjciA9ICJyeCBieXRlcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9SWF9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhLCByeF9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF9yeF9wYWNrZXRzID0geyAubmFtZSA9ICJyeF9wYWNrZXRzIiwgLmRlc2NyID0gInJ4IHBhY2tldHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfUlhfUEFDS0VUUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhLCByeF9wYWNrZXRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X3R4X2J5dGVzID0geyAubmFtZSA9ICJ0eF9ieXRlcyIsIC5kZXNjciA9ICJ0eCBieXRlcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9JRF9UWF9CWVRFUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhLCB0eF9ieXRlcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF90eF9wYWNrZXRzID0geyAubmFtZSA9ICJ0eF9wYWNrZXRzIiwgLmRlc2NyID0gInR4IHBhY2tldHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1NUQVRfSURfVFhfUEFDS0VUUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhLCB0eF9wYWNrZXRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX29udV9zdGF0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fb251X3N0YXRfcG9zaXRpdmVfZHJpZnQsICZwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X25lZ2F0aXZlX2RyaWZ0LCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF9kZWxpbWl0ZXJfbWlzc19kZXRlY3Rpb24sICZwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X2JpcDMyX2Vycm9ycywgJnByb3BfZGVzY3JfeGdwb25fb251X3N0YXRfcnhfd29yZHMsICZwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X2ZlY19jb3JyZWN0ZWRfc3ltYm9scywgJnByb3BfZGVzY3JfeGdwb25fb251X3N0YXRfZmVjX2NvcnJlY3RlZF9jb2Rld29yZHMsICZwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X2ZlY191bmNvcnJlY3RhYmxlX2NvZGV3b3JkcywgJnByb3BfZGVzY3JfeGdwb25fb251X3N0YXRfZmVjX2NvZGV3b3JkcywgJnByb3BfZGVzY3JfeGdwb25fb251X3N0YXRfZmVjX2NvcnJlY3RlZF9iaXRzLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF94Z2VtX2tleV9lcnJvcnMsICZwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X3hnZW1fbG9zcywgJnByb3BfZGVzY3JfeGdwb25fb251X3N0YXRfcnhfcGxvYW1zX21pY19lcnJvciwgJnByb3BfZGVzY3JfeGdwb25fb251X3N0YXRfcnhfcGxvYW1zX25vbl9pZGxlLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF9yeF9vbWNpLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF9yeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF9yeF9ieXRlcywgJnByb3BfZGVzY3JfeGdwb25fb251X3N0YXRfcnhfcGFja2V0cywgJnByb3BfZGVzY3JfeGdwb25fb251X3N0YXRfdHhfYnl0ZXMsICZwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X3R4X3BhY2tldHMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicG9zaXRpdmVfZHJpZnQiLCAuZGVzY3IgPSAicG9zaXRpdmUgZHJpZnQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGEsIHBvc2l0aXZlX2RyaWZ0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gIm5lZ2F0aXZlX2RyaWZ0IiwgLmRlc2NyID0gIm5lZ2F0aXZlIGRyaWZ0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhLCBuZWdhdGl2ZV9kcmlmdCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJkZWxpbWl0ZXJfbWlzc19kZXRlY3Rpb24iLCAuZGVzY3IgPSAiZGVsaW1pdGVyIG1pc3MgZGV0ZWN0aW9uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhLCBkZWxpbWl0ZXJfbWlzc19kZXRlY3Rpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiYmlwMzJfZXJyb3JzIiwgLmRlc2NyID0gImJpcDMyIGVycm9ycyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgYmlwMzJfZXJyb3JzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X3dvcmRzIiwgLmRlc2NyID0gIk51bWJlciBvZiA0LWJ5dGUgd29yZHMgcmVjZWl2ZWQgKHdvcmQgc2l6ZSBpcyA0IGJ5dGVzIHJlZ2FyZGxlc3Mgb2YgdXBzdHJlYW0gZGF0YSByYXRlKS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGEsIHJ4X3dvcmRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZlY19jb3JyZWN0ZWRfc3ltYm9scyIsIC5kZXNjciA9ICJmZWMgY29ycmVjdGVkIHN5bWJvbHMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGEsIGZlY19jb3JyZWN0ZWRfc3ltYm9scyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmZWNfY29ycmVjdGVkX2NvZGV3b3JkcyIsIC5kZXNjciA9ICJmZWMgY29ycmVjdGVkIGNvZGV3b3JkcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgZmVjX2NvcnJlY3RlZF9jb2Rld29yZHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAiZmVjX3VuY29ycmVjdGFibGVfY29kZXdvcmRzIiwgLmRlc2NyID0gImZlYyB1bmNvcnJlY3RhYmxlIGNvZGV3b3JkcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgZmVjX3VuY29ycmVjdGFibGVfY29kZXdvcmRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gImZlY19jb2Rld29yZHMiLCAuZGVzY3IgPSAiZmVjIHRvdGFsIGNvZGV3b3JkcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgZmVjX2NvZGV3b3JkcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJmZWNfY29ycmVjdGVkX2JpdHMiLCAuZGVzY3IgPSAiZmVjIGNvcnJlY3RlZCBiaXRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhLCBmZWNfY29ycmVjdGVkX2JpdHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAieGdlbV9rZXlfZXJyb3JzIiwgLmRlc2NyID0gInhnZW0ga2V5IGVycm9yIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhLCB4Z2VtX2tleV9lcnJvcnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAieGdlbV9sb3NzIiwgLmRlc2NyID0gInhnZW0gbG9zcyAiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGEsIHhnZW1fbG9zcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9wbG9hbXNfbWljX2Vycm9yIiwgLmRlc2NyID0gIm1pYyBlcnJvciBwbG9hbSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgcnhfcGxvYW1zX21pY19lcnJvciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9wbG9hbXNfbm9uX2lkbGUiLCAuZGVzY3IgPSAibm9uIGlkbGUgcGxvYW0iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGEsIHJ4X3Bsb2Ftc19ub25faWRsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9vbWNpIiwgLmRlc2NyID0gIlJlY2VpdmVkIE9NQ0kgcGFja2V0cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgcnhfb21jaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJyeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yIiwgLmRlc2NyID0gIlJlY2VpdmVkIE9NQ0kgcGFja2V0cyB3aXRoIENSQyBlcnJvcnMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGEsIHJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAicnhfYnl0ZXMiLCAuZGVzY3IgPSAicnggYnl0ZXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGEsIHJ4X2J5dGVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9LCB7IC5uYW1lID0gInJ4X3BhY2tldHMiLCAuZGVzY3IgPSAicnggcGFja2V0cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgcnhfcGFja2V0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDY0X3QgfSwgeyAubmFtZSA9ICJ0eF9ieXRlcyIsIC5kZXNjciA9ICJ0eCBieXRlcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSwgdHhfYnl0ZXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ2NF90IH0sIHsgLm5hbWUgPSAidHhfcGFja2V0cyIsIC5kZXNjciA9ICJ0eCBwYWNrZXRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhLCB0eF9wYWNrZXRzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50NjRfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhIiwgLmRlc2NyID0gInN0YXQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3N0YXRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zdGF0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fb251IC0gc2V0X29udV9zdGF0ZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9zZXRfb251X3N0YXRlX29udV9zdGF0ZSA9IHsgLm5hbWUgPSAib251X3N0YXRlIiwgLmRlc2NyID0gIk9OVSBzdGF0ZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfU0VUX09OVV9TVEFURV9JRF9PTlVfU1RBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YSwgb251X3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb251X29wZXJhdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX29udV9zZXRfb251X3N0YXRlX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fb251X3NldF9vbnVfc3RhdGVfb251X3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm9udV9zdGF0ZSIsIC5kZXNjciA9ICJPTlUgc3RhdGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGEsIG9udV9zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X29udV9vcGVyYXRpb24gfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YSIsIC5kZXNjciA9ICJTZXQgT05VIFN0YXRlIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGVfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIHJzc2lfbWVhc3VyZW1lbnQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSBvbnVfYWxhcm0gKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfb251X2FsYXJtX29udV9hbGFybSA9IHsgLm5hbWUgPSAib251X2FsYXJtIiwgLmRlc2NyID0gIm9udSBhbGFybSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfT05VX0FMQVJNX0lEX09OVV9BTEFSTSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2RhdGEsIG9udV9hbGFybSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9hbGFybXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfb251X2FsYXJtX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fb251X29udV9hbGFybV9vbnVfYWxhcm0gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1fZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJvbnVfYWxhcm0iLCAuZGVzY3IgPSAib251IGFsYXJtIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2RhdGEsIG9udV9hbGFybSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9hbGFybXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2RhdGEiLCAuZGVzY3IgPSAiT05VIEFsYXJtIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1fZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X29udV9hbGFybV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIGRvd2kgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfZG93aV9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0RPV0lfSURfQUxBUk1fU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9kb3dpX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9kb3dpX2RyaWZ0X3ZhbHVlID0geyAubmFtZSA9ICJkcmlmdF92YWx1ZSIsIC5kZXNjciA9ICJDYWxjdWxhdGVkIGFtb3VudCBvZiBkcmlmdCAocG9zaXRpdmUgKyBuZWdhdGl2ZSBhcyBhIHNpZ25lZCB2YWx1ZSkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9ET1dJX0lEX0RSSUZUX1ZBTFVFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9kb3dpX2RhdGEsIGRyaWZ0X3ZhbHVlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9pbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2Rvd2lfbmV3X2VxZCA9IHsgLm5hbWUgPSAibmV3X2VxZCIsIC5kZXNjciA9ICJOZXcgRVFEIGFmdGVyIGRyaWZ0IGlzIGNvcnJlY3RlZCAob25seSB2YWxpZCBpZiBzdGF0dXMgaXMgJ29uJykuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9ET1dJX0lEX05FV19FUUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2Rvd2lfZGF0YSwgbmV3X2VxZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfZG93aV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX29udV9kb3dpX2FsYXJtX3N0YXR1cywgJnByb3BfZGVzY3JfeGdwb25fb251X2Rvd2lfZHJpZnRfdmFsdWUsICZwcm9wX2Rlc2NyX3hncG9uX29udV9kb3dpX25ld19lcWQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9kb3dpX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gIkFsYXJtIHN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2Rvd2lfZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0sIHsgLm5hbWUgPSAiZHJpZnRfdmFsdWUiLCAuZGVzY3IgPSAiQ2FsY3VsYXRlZCBhbW91bnQgb2YgZHJpZnQgKHBvc2l0aXZlICsgbmVnYXRpdmUgYXMgYSBzaWduZWQgdmFsdWUpLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2Rvd2lfZGF0YSwgZHJpZnRfdmFsdWUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2ludDMyX3QgfSwgeyAubmFtZSA9ICJuZXdfZXFkIiwgLmRlc2NyID0gIk5ldyBFUUQgYWZ0ZXIgZHJpZnQgaXMgY29ycmVjdGVkIChvbmx5IHZhbGlkIGlmIHN0YXR1cyBpcyAnb24nKS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9kb3dpX2RhdGEsIG5ld19lcWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2Rvd2lfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9kb3dpX2RhdGEiLCAuZGVzY3IgPSAiRHJpZnQgb2YgV2luZG93IG9mIE9OVWkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2Rvd2lfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfZG93aV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9kb3dpX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fb251IC0gc2ZpICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3NmaV9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJhbGFybSBzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1NGSV9JRF9BTEFSTV9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3NmaV9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc2ZpX2JlciA9IHsgLm5hbWUgPSAiYmVyIiwgLmRlc2NyID0gIkludmVyc2UgYml0IGVycm9yIHJhdGUgKGUuZy4gaWYgdGhpcyBudW1iZXIgaXMgMTAwMCwgdGhlIEJFUiBpcyAxLzEwMDApLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfU0ZJX0lEX0JFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2RhdGEsIGJlciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfc2ZpX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fb251X3NmaV9hbGFybV9zdGF0dXMsICZwcm9wX2Rlc2NyX3hncG9uX29udV9zZmlfYmVyIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc2ZpX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gImFsYXJtIHN0YXR1cyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3NmaV9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSwgeyAubmFtZSA9ICJiZXIiLCAuZGVzY3IgPSAiSW52ZXJzZSBiaXQgZXJyb3IgcmF0ZSAoZS5nLiBpZiB0aGlzIG51bWJlciBpcyAxMDAwLCB0aGUgQkVSIGlzIDEvMTAwMCkuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2RhdGEsIGJlciksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc2ZpX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2RhdGEiLCAuZGVzY3IgPSAiU2lnbmFsIEZhaWwgb2YgT05VaSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfc2ZpX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3NmaV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zZmlfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSBzZGkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc2RpX2FsYXJtX3N0YXR1cyA9IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gImFsYXJtIHN0YXR1cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfU0RJX0lEX0FMQVJNX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc2RpX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9zZGlfYmVyID0geyAubmFtZSA9ICJiZXIiLCAuZGVzY3IgPSAiSW52ZXJzZSBiaXQgZXJyb3IgcmF0ZSAoZS5nLiBpZiB0aGlzIG51bWJlciBpcyAxMDAwLCB0aGUgQkVSIGlzIDEvMTAwMCkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9TRElfSURfQkVSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zZGlfZGF0YSwgYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX29udV9zZGlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc2RpX2FsYXJtX3N0YXR1cywgJnByb3BfZGVzY3JfeGdwb25fb251X3NkaV9iZXIgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zZGlfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiYWxhcm0gc3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc2RpX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9LCB7IC5uYW1lID0gImJlciIsIC5kZXNjciA9ICJJbnZlcnNlIGJpdCBlcnJvciByYXRlIChlLmcuIGlmIHRoaXMgbnVtYmVyIGlzIDEwMDAsIHRoZSBCRVIgaXMgMS8xMDAwKS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zZGlfZGF0YSwgYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zZGlfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9zZGlfZGF0YSIsIC5kZXNjciA9ICJTaWduYWwgRGVncmFkZWQgb2YgT05VaSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfc2RpX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3NkaV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zZGlfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSBkZmkgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfZGZpX2FsYXJtX3N0YXR1cyA9IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gImFsYXJtIHN0YXR1cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfREZJX0lEX0FMQVJNX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfZGZpX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX29udV9kZmlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfZGZpX2FsYXJtX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2RmaV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJhbGFybSBzdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9kZmlfZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2RmaV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X2RmaV9kYXRhIiwgLmRlc2NyID0gIlJlY2VpdmUgRHlpbmctR2FzcCBvZiBPTlVpIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9kZmlfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfZGZpX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2RmaV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIHBxc2kgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcHFzaV9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJhbGFybSBzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1BRU0lfSURfQUxBUk1fU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9wcXNpX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX29udV9wcXNpX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fb251X3Bxc2lfYWxhcm1fc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJhbGFybSBzdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9wcXNpX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9wcXNpX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhIiwgLmRlc2NyID0gInBsb2FtIHF1ZXVlIHN0YXR1cyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcHFzaV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9wcXNpX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3Bxc2lfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSBzdWZpICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3N1ZmlfYWxhcm1fc3RhdHVzID0geyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiYWxhcm0gc3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9TVUZJX0lEX0FMQVJNX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3VmaV9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfc3VmaV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX29udV9zdWZpX2FsYXJtX3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3N1ZmlfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiYWxhcm0gc3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3VmaV9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc3VmaV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X3N1ZmlfZGF0YSIsIC5kZXNjciA9ICJTVUZpIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zdWZpX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3N1ZmlfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc3VmaV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIHRpd2kgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfdGl3aV9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1RJV0lfSURfQUxBUk1fU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV90aXdpX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV90aXdpX2RyaWZ0X3ZhbHVlID0geyAubmFtZSA9ICJkcmlmdF92YWx1ZSIsIC5kZXNjciA9ICJDYWxjdWxhdGVkIGFtb3VudCBvZiBkcmlmdCAocG9zaXRpdmUgKyBuZWdhdGl2ZSBhcyBhIHNpZ25lZCB2YWx1ZSkuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9USVdJX0lEX0RSSUZUX1ZBTFVFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV90aXdpX2RhdGEsIGRyaWZ0X3ZhbHVlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9pbnQzMl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X3Rpd2lfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfdGl3aV9hbGFybV9zdGF0dXMsICZwcm9wX2Rlc2NyX3hncG9uX29udV90aXdpX2RyaWZ0X3ZhbHVlIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfdGl3aV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJBbGFybSBzdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV90aXdpX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9LCB7IC5uYW1lID0gImRyaWZ0X3ZhbHVlIiwgLmRlc2NyID0gIkNhbGN1bGF0ZWQgYW1vdW50IG9mIGRyaWZ0IChwb3NpdGl2ZSArIG5lZ2F0aXZlIGFzIGEgc2lnbmVkIHZhbHVlKS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV90aXdpX2RhdGEsIGRyaWZ0X3ZhbHVlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9pbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3Rpd2lfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV90aXdpX2RhdGEiLCAuZGVzY3IgPSAiVHJhbnNtaXNzaW9uIEludGVyZmVyZW5jZSBXYXJuaW5nIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV90aXdpX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3Rpd2lfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfdGl3aV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIGxvb2NpICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2xvb2NpX2FsYXJtX3N0YXR1cyA9IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gImFsYXJtIHN0YXR1cyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfTE9PQ0lfSURfQUxBUk1fU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9sb29jaV9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfbG9vY2lfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfbG9vY2lfYWxhcm1fc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiYWxhcm0gc3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2xvb2NpX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YSIsIC5kZXNjciA9ICJMT09DaSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSByYW5naW5nX2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9zdGF0dXMgPSB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2ZhaWxfcmVhc29uID0geyAubmFtZSA9ICJmYWlsX3JlYXNvbiIsIC5kZXNjciA9ICJmYWlsIHJlYXNvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfUkFOR0lOR19DT01QTEVURURfSURfRkFJTF9SRUFTT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEsIGZhaWxfcmVhc29uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmFuZ2luZ19mYWlsX3JlYXNvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9lcWQgPSB7IC5uYW1lID0gImVxZCIsIC5kZXNjciA9ICJFUUQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX0VRRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSwgZXFkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9udW1iZXJfb2ZfcGxvYW1zID0geyAubmFtZSA9ICJudW1iZXJfb2ZfcGxvYW1zIiwgLmRlc2NyID0gIm51bWJlciBvZiBwbG9hbXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1JBTkdJTkdfQ09NUExFVEVEX0lEX05VTUJFUl9PRl9QTE9BTVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEsIG51bWJlcl9vZl9wbG9hbXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfcG93ZXJfbGV2ZWwgPSB7IC5uYW1lID0gInBvd2VyX2xldmVsIiwgLmRlc2NyID0gInBvd2VyIGxldmVsIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9SQU5HSU5HX0NPTVBMRVRFRF9JRF9QT1dFUl9MRVZFTCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSwgcG93ZXJfbGV2ZWwpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfc3RhdHVzLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZmFpbF9yZWFzb24sICZwcm9wX2Rlc2NyX3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9lcWQsICZwcm9wX2Rlc2NyX3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9udW1iZXJfb2ZfcGxvYW1zLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfcG93ZXJfbGV2ZWwgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJzdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfSwgeyAubmFtZSA9ICJmYWlsX3JlYXNvbiIsIC5kZXNjciA9ICJmYWlsIHJlYXNvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2RhdGEsIGZhaWxfcmVhc29uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmFuZ2luZ19mYWlsX3JlYXNvbiB9LCB7IC5uYW1lID0gImVxZCIsIC5kZXNjciA9ICJFUUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhLCBlcWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAibnVtYmVyX29mX3Bsb2FtcyIsIC5kZXNjciA9ICJudW1iZXIgb2YgcGxvYW1zIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSwgbnVtYmVyX29mX3Bsb2FtcyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInBvd2VyX2xldmVsIiwgLmRlc2NyID0gInBvd2VyIGxldmVsIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSwgcG93ZXJfbGV2ZWwpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhIiwgLmRlc2NyID0gIlJhbmdpbmcgQ29tcGxldGVkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIG9udV9hY3RpdmF0aW9uX2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfc3RhdHVzID0geyAubmFtZSA9ICJzdGF0dXMiLCAuZGVzY3IgPSAic3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9mYWlsX3JlYXNvbiA9IHsgLm5hbWUgPSAiZmFpbF9yZWFzb24iLCAuZGVzY3IgPSAiZmFpbCByZWFzb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9GQUlMX1JFQVNPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGEsIGZhaWxfcmVhc29uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYWN0aXZhdGlvbl9mYWlsX3JlYXNvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfcmVnaXN0cmF0aW9uX2lkID0geyAubmFtZSA9ICJyZWdpc3RyYXRpb25faWQiLCAuZGVzY3IgPSAicmVnaXN0cmF0aW9uIGlkIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9PTlVfQUNUSVZBVElPTl9DT01QTEVURURfSURfUkVHSVNUUkFUSU9OX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSwgcmVnaXN0cmF0aW9uX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzM2IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9yZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzID0geyAubmFtZSA9ICJyZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzIiwgLmRlc2NyID0gInJlZ2lzdHJhdGlvbiBlbmNyeXB0aW9uIGtleXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9SRUdJU1RSQVRJT05fRU5DUllQVElPTl9LRVlTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSwgcmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25fa2V5cyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX3N0YXR1cywgJnByb3BfZGVzY3JfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9mYWlsX3JlYXNvbiwgJnByb3BfZGVzY3JfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9yZWdpc3RyYXRpb25faWQsICZwcm9wX2Rlc2NyX3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfcmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJzdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSwgc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH0sIHsgLm5hbWUgPSAiZmFpbF9yZWFzb24iLCAuZGVzY3IgPSAiZmFpbCByZWFzb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSwgZmFpbF9yZWFzb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hY3RpdmF0aW9uX2ZhaWxfcmVhc29uIH0sIHsgLm5hbWUgPSAicmVnaXN0cmF0aW9uX2lkIiwgLmRlc2NyID0gInJlZ2lzdHJhdGlvbiBpZCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhLCByZWdpc3RyYXRpb25faWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdThfMzYgfSwgeyAubmFtZSA9ICJyZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzIiwgLmRlc2NyID0gInJlZ2lzdHJhdGlvbiBlbmNyeXB0aW9uIGtleXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSwgcmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25fa2V5cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJPTlUgQWN0aXZhdGlvbiBDb21wbGV0ZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fb251IC0gb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfc3RhdHVzID0geyAubmFtZSA9ICJzdGF0dXMiLCAuZGVzY3IgPSAiU3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9PTlVfREVBQ1RJVkFUSU9OX0NPTVBMRVRFRF9JRF9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJTdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhIiwgLmRlc2NyID0gIk9OVSBEZWFjdGl2YXRpb24gQ29tcGxldGVkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIG9udV9lbmFibGVfY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX3NlcmlhbF9udW1iZXIgPSB7IC5uYW1lID0gInNlcmlhbF9udW1iZXIiLCAuZGVzY3IgPSAic2VyaWFsIG51bWJlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfT05VX0VOQUJMRV9DT01QTEVURURfSURfU0VSSUFMX05VTUJFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSwgc2VyaWFsX251bWJlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3NlcmlhbF9udW1iZXIgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfc2VyaWFsX251bWJlciB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAic2VyaWFsX251bWJlciIsIC5kZXNjciA9ICJzZXJpYWwgbnVtYmVyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSwgc2VyaWFsX251bWJlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3NlcmlhbF9udW1iZXIgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhIiwgLmRlc2NyID0gIk9OVSBFbmFibGUgQ29tcGxldGVkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIG9udV9kaXNhYmxlX2NvbXBsZXRlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfc2VyaWFsX251bWJlciA9IHsgLm5hbWUgPSAic2VyaWFsX251bWJlciIsIC5kZXNjciA9ICJzZXJpYWwgbnVtYmVyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9PTlVfRElTQUJMRV9DT01QTEVURURfSURfU0VSSUFMX05VTUJFUiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGEsIHNlcmlhbF9udW1iZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zZXJpYWxfbnVtYmVyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfc2VyaWFsX251bWJlciB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInNlcmlhbF9udW1iZXIiLCAuZGVzY3IgPSAic2VyaWFsIG51bWJlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhLCBzZXJpYWxfbnVtYmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc2VyaWFsX251bWJlciB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJPTlUgRGlzYWJsZSBDb21wbGV0ZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fb251IC0gcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfc3RhdHVzID0geyAubmFtZSA9ICJzdGF0dXMiLCAuZGVzY3IgPSAic3RhdHVzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRF9JRF9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9mYWlsX3JlYXNvbiA9IHsgLm5hbWUgPSAiZmFpbF9yZWFzb24iLCAuZGVzY3IgPSAiZmFpbCByZWFzb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhLCBmYWlsX3JlYXNvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jzc2lfbWVhc3VyZW1lbnRfZmFpbF9yZWFzb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfc3RhdHVzLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfZmFpbF9yZWFzb24gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJzdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfSwgeyAubmFtZSA9ICJmYWlsX3JlYXNvbiIsIC5kZXNjciA9ICJmYWlsIHJlYXNvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEsIGZhaWxfcmVhc29uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcnNzaV9tZWFzdXJlbWVudF9mYWlsX3JlYXNvbiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEiLCAuZGVzY3IgPSAiUlNTSSBNZWFzdXJlbWVudCBDb21wbGV0ZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fb251IC0gaW52YWxpZF9kYnJ1X3JlcG9ydCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2FsbG9jX2lkID0geyAubmFtZSA9ICJhbGxvY19pZCIsIC5kZXNjciA9ICJBbGxvYy1JRCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfSU5WQUxJRF9EQlJVX1JFUE9SVF9JRF9BTExPQ19JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhLCBhbGxvY19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2FsbG9jX2lkIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFsbG9jX2lkIiwgLmRlc2NyID0gIkFsbG9jLUlEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhLCBhbGxvY19pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YSIsIC5kZXNjciA9ICJJbnZhbGlkIERCUnUgUmVwb3J0IiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIGtleV9leGNoYW5nZV9jb21wbGV0ZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9uZXdfa2V5ID0geyAubmFtZSA9ICJuZXdfa2V5IiwgLmRlc2NyID0gIm5ldyBrZXkiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0tFWV9FWENIQU5HRV9DT01QTEVURURfSURfTkVXX0tFWSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhLCBuZXdfa2V5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2Flc19rZXkgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX25ld19rZXkgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAibmV3X2tleSIsIC5kZXNjciA9ICJuZXcga2V5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhLCBuZXdfa2V5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2Flc19rZXkgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJLZXkgRXhjaGFuZ2UgQ29tcGxldGVkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIGtleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0X3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIGtleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X2tleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkX3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIGtleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2ggKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9leHBlY3RlZF9rZXkgPSB7IC5uYW1lID0gImV4cGVjdGVkX2tleSIsIC5kZXNjciA9ICJleHBlY3RlZCBrZXkiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0hfSURfRVhQRUNURURfS0VZLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGEsIGV4cGVjdGVkX2tleSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Flc19rZXkgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9yZWNlaXZlZF9rZXkgPSB7IC5uYW1lID0gInJlY2VpdmVkX2tleSIsIC5kZXNjciA9ICJyZWNlaXZlZCBrZXkiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0hfSURfUkVDRUlWRURfS0VZLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGEsIHJlY2VpdmVkX2tleSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Flc19rZXkgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2V4cGVjdGVkX2tleSwgJnByb3BfZGVzY3JfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfcmVjZWl2ZWRfa2V5IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImV4cGVjdGVkX2tleSIsIC5kZXNjciA9ICJleHBlY3RlZCBrZXkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGEsIGV4cGVjdGVkX2tleSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Flc19rZXkgfSwgeyAubmFtZSA9ICJyZWNlaXZlZF9rZXkiLCAuZGVzY3IgPSAicmVjZWl2ZWQga2V5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhLCByZWNlaXZlZF9rZXkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hZXNfa2V5IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGEiLCAuZGVzY3IgPSAiS2V5IEV4Y2hhbmdlIEtleSBNaXNtYXRjaCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSBvcHRpY2FsX3JlZmxlY3Rpb24gKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uX3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIHBsb2FtX3BhY2tldCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9wbG9hbV9wYWNrZXRfZGVmYXVsdF9rZXkgPSB7IC5uYW1lID0gImRlZmF1bHRfa2V5IiwgLmRlc2NyID0gImRlZmF1bHQga2V5IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9QTE9BTV9QQUNLRVRfSURfREVGQVVMVF9LRVksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhLCBkZWZhdWx0X2tleSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9wbG9hbV9wYWNrZXRfcGxvYW0gPSB7IC5uYW1lID0gInBsb2FtIiwgLmRlc2NyID0gInBsb2FtIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9QTE9BTV9QQUNLRVRfSURfUExPQU0sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhLCBwbG9hbSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl91OF80MCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX29udV9wbG9hbV9wYWNrZXRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RlZmF1bHRfa2V5LCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X3Bsb2FtIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZGVmYXVsdF9rZXkiLCAuZGVzY3IgPSAiZGVmYXVsdCBrZXkiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YSwgZGVmYXVsdF9rZXkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJwbG9hbSIsIC5kZXNjciA9ICJwbG9hbSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhLCBwbG9hbSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl91OF80MCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YSIsIC5kZXNjciA9ICJQTE9BTSBQYWNrZXQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fb251IC0gY3B1X3BhY2tldHMgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfcGFja2V0X3R5cGUgPSB7IC5uYW1lID0gInBhY2tldF90eXBlIiwgLmRlc2NyID0gInBhY2tldCB0eXBlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfVFlQRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSwgcGFja2V0X3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wYWNrZXRfdHlwZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9jcHVfcGFja2V0c19jYWxjX2NyYyA9IHsgLm5hbWUgPSAiY2FsY19jcmMiLCAuZGVzY3IgPSAiY2FsYyBjcmMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRTX0lEX0NBTENfQ1JDLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19kYXRhLCBjYWxjX2NyYyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9jcHVfcGFja2V0c19udW1iZXJfb2ZfcGFja2V0cyA9IHsgLm5hbWUgPSAibnVtYmVyX29mX3BhY2tldHMiLCAuZGVzY3IgPSAibnVtYmVyIG9mIHBhY2tldHMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRTX0lEX05VTUJFUl9PRl9QQUNLRVRTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19kYXRhLCBudW1iZXJfb2ZfcGFja2V0cyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9jcHVfcGFja2V0c19wYWNrZXRfc2l6ZSA9IHsgLm5hbWUgPSAicGFja2V0X3NpemUiLCAuZGVzY3IgPSAiU2luZ2xlIHBhY2tldCBzaXplIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUU19JRF9QQUNLRVRfU0laRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSwgcGFja2V0X3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2NwdV9wYWNrZXRzX2J1ZmZlciA9IHsgLm5hbWUgPSAiYnVmZmVyIiwgLmRlc2NyID0gImJ1ZmZlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVFNfSURfQlVGRkVSLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19kYXRhLCBidWZmZXIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX29udV9jcHVfcGFja2V0c19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX29udV9jcHVfcGFja2V0c19wYWNrZXRfdHlwZSwgJnByb3BfZGVzY3JfeGdwb25fb251X2NwdV9wYWNrZXRzX2NhbGNfY3JjLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfbnVtYmVyX29mX3BhY2tldHMsICZwcm9wX2Rlc2NyX3hncG9uX29udV9jcHVfcGFja2V0c19wYWNrZXRfc2l6ZSwgJnByb3BfZGVzY3JfeGdwb25fb251X2NwdV9wYWNrZXRzX2J1ZmZlciB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicGFja2V0X3R5cGUiLCAuZGVzY3IgPSAicGFja2V0IHR5cGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19kYXRhLCBwYWNrZXRfdHlwZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3BhY2tldF90eXBlIH0sIHsgLm5hbWUgPSAiY2FsY19jcmMiLCAuZGVzY3IgPSAiY2FsYyBjcmMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19kYXRhLCBjYWxjX2NyYyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm51bWJlcl9vZl9wYWNrZXRzIiwgLmRlc2NyID0gIm51bWJlciBvZiBwYWNrZXRzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSwgbnVtYmVyX29mX3BhY2tldHMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJwYWNrZXRfc2l6ZSIsIC5kZXNjciA9ICJTaW5nbGUgcGFja2V0IHNpemUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19kYXRhLCBwYWNrZXRfc2l6ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJidWZmZXIiLCAuZGVzY3IgPSAiYnVmZmVyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSwgYnVmZmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDggfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19kYXRhIiwgLmRlc2NyID0gIlhHUE9OIENQVSBwYWNrZXRzIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0c19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIGNwdV9wYWNrZXQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY3B1X3BhY2tldF9wb3J0X2lkID0geyAubmFtZSA9ICJwb3J0X2lkIiwgLmRlc2NyID0gInBvcnQgaWQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0NQVV9QQUNLRVRfSURfUE9SVF9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhLCBwb3J0X2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MTZfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9jcHVfcGFja2V0X2NyY19vayA9IHsgLm5hbWUgPSAiY3JjX29rIiwgLmRlc2NyID0gImNyYyBvayIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9DUkNfT0ssIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfZGF0YSwgY3JjX29rKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2NwdV9wYWNrZXRfcGFja2V0X3NpemUgPSB7IC5uYW1lID0gInBhY2tldF9zaXplIiwgLmRlc2NyID0gInBhY2tldCBzaXplIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9DUFVfUEFDS0VUX0lEX1BBQ0tFVF9TSVpFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2RhdGEsIHBhY2tldF9zaXplKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9jcHVfcGFja2V0X2J1ZmZlciA9IHsgLm5hbWUgPSAiYnVmZmVyIiwgLmRlc2NyID0gImJ1ZmZlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQ1BVX1BBQ0tFVF9JRF9CVUZGRVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfZGF0YSwgYnVmZmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdThfbGlzdF91MzIgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfY3B1X3BhY2tldF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX29udV9jcHVfcGFja2V0X3BvcnRfaWQsICZwcm9wX2Rlc2NyX3hncG9uX29udV9jcHVfcGFja2V0X2NyY19vaywgJnByb3BfZGVzY3JfeGdwb25fb251X2NwdV9wYWNrZXRfcGFja2V0X3NpemUsICZwcm9wX2Rlc2NyX3hncG9uX29udV9jcHVfcGFja2V0X2J1ZmZlciB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwb3J0X2lkIiwgLmRlc2NyID0gInBvcnQgaWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2RhdGEsIHBvcnRfaWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQxNl90IH0sIHsgLm5hbWUgPSAiY3JjX29rIiwgLmRlc2NyID0gImNyYyBvayIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfZGF0YSwgY3JjX29rKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicGFja2V0X3NpemUiLCAuZGVzY3IgPSAicGFja2V0IHNpemUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2RhdGEsIHBhY2tldF9zaXplKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9LCB7IC5uYW1lID0gImJ1ZmZlciIsIC5kZXNjciA9ICJidWZmZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2RhdGEsIGJ1ZmZlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3U4X2xpc3RfdTMyIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2RhdGEiLCAuZGVzY3IgPSAiSW5kaWNhdGVzIENQVSBwYWNrZXQgd2FzIHJlY2VpdmVkIG9uIHRoZSBVUyBmcm9tIHRoaXMgT05VIGlkIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIG9tY2lfcGFja2V0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X29tY2lfcGFja2V0X3BvcnRfaWQgPSB7IC5uYW1lID0gInBvcnRfaWQiLCAuZGVzY3IgPSAicG9ydCBpZCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfT01DSV9QQUNLRVRfSURfUE9SVF9JRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YSwgcG9ydF9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfY3JjX29rID0geyAubmFtZSA9ICJjcmNfb2siLCAuZGVzY3IgPSAiY3JjIG9rIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9DUkNfT0ssIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2RhdGEsIGNyY19vayksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9vbWNpX3BhY2tldF9wYWNrZXRfc2l6ZSA9IHsgLm5hbWUgPSAicGFja2V0X3NpemUiLCAuZGVzY3IgPSAicGFja2V0IHNpemUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX09NQ0lfUEFDS0VUX0lEX1BBQ0tFVF9TSVpFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhLCBwYWNrZXRfc2l6ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfYnVmZmVyID0geyAubmFtZSA9ICJidWZmZXIiLCAuZGVzY3IgPSAiYnVmZmVyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9PTUNJX1BBQ0tFVF9JRF9CVUZGRVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2RhdGEsIGJ1ZmZlciksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3U4X2xpc3RfdTMyIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X29tY2lfcGFja2V0X3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fb251X29tY2lfcGFja2V0X3BvcnRfaWQsICZwcm9wX2Rlc2NyX3hncG9uX29udV9vbWNpX3BhY2tldF9jcmNfb2ssICZwcm9wX2Rlc2NyX3hncG9uX29udV9vbWNpX3BhY2tldF9wYWNrZXRfc2l6ZSwgJnByb3BfZGVzY3JfeGdwb25fb251X29tY2lfcGFja2V0X2J1ZmZlciB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicG9ydF9pZCIsIC5kZXNjciA9ICJwb3J0IGlkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YSwgcG9ydF9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDE2X3QgfSwgeyAubmFtZSA9ICJjcmNfb2siLCAuZGVzY3IgPSAiY3JjIG9rIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YSwgY3JjX29rKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicGFja2V0X3NpemUiLCAuZGVzY3IgPSAicGFja2V0IHNpemUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhLCBwYWNrZXRfc2l6ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfSwgeyAubmFtZSA9ICJidWZmZXIiLCAuZGVzY3IgPSAiYnVmZmVyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YSwgYnVmZmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdThfbGlzdF91MzIgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9vbWNpX3BhY2tldF9kYXRhIiwgLmRlc2NyID0gIkluZGljYXRlcyBPTUNJIHBhY2tldCB3YXMgcmVjZWl2ZWQgb24gdGhlIFVTIGZyb20gdGhpcyBPTlUgaWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fb251IC0gZGdpICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2RnaV9hbGFybV9zdGF0dXMgPSB7IC5uYW1lID0gImFsYXJtX3N0YXR1cyIsIC5kZXNjciA9ICJhbGFybSBzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0RHSV9JRF9BTEFSTV9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2RnaV9kYXRhLCBhbGFybV9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfZGdpX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fb251X2RnaV9hbGFybV9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9kZ2lfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiYWxhcm0gc3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfZGdpX2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9kZ2lfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9kZ2lfZGF0YSIsIC5kZXNjciA9ICJSZWNlaXZlIER5aW5nLUdhc3Agb2YgT05VaSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfZGdpX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2RnaV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9kZ2lfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSBwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9vbGRfc3RhdGUgPSB7IC5uYW1lID0gIm9sZF9zdGF0ZSIsIC5kZXNjciA9ICJUaGUgc3RhdGUgdGhlIE9OVSB3YXMgcHJldmlvdXNseSBpbi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX09MRF9TVEFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSwgb2xkX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb251X3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX25ld19zdGF0ZSA9IHsgLm5hbWUgPSAibmV3X3N0YXRlIiwgLmRlc2NyID0gIlRoZSBzdGF0ZSB0aGUgT05VIGlzIGN1cnJlbnRseSBpbi4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFX0lEX05FV19TVEFURSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSwgbmV3X3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb251X3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX3JlYXNvbiA9IHsgLm5hbWUgPSAicmVhc29uIiwgLmRlc2NyID0gIlRoZSByZWFzb24gZm9yIHRoZSBzdGF0ZSBjaGFuZ2UuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRV9JRF9SRUFTT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGEsIHJlYXNvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvd2VyX21hbmFnZW1lbnRfdHJhbnNpdGlvbl9yZWFzb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2Vfb2xkX3N0YXRlLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfbmV3X3N0YXRlLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfcmVhc29uIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJvbGRfc3RhdGUiLCAuZGVzY3IgPSAiVGhlIHN0YXRlIHRoZSBPTlUgd2FzIHByZXZpb3VzbHkgaW4uIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSwgb2xkX3N0YXRlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfb251X3N0YXRlIH0sIHsgLm5hbWUgPSAibmV3X3N0YXRlIiwgLmRlc2NyID0gIlRoZSBzdGF0ZSB0aGUgT05VIGlzIGN1cnJlbnRseSBpbi4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhLCBuZXdfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9vbnVfc3RhdGUgfSwgeyAubmFtZSA9ICJyZWFzb24iLCAuZGVzY3IgPSAiVGhlIHJlYXNvbiBmb3IgdGhlIHN0YXRlIGNoYW5nZS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhLCByZWFzb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb3dlcl9tYW5hZ2VtZW50X3RyYW5zaXRpb25fcmVhc29uIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfZGF0YSIsIC5kZXNjciA9ICJOb3RpZmljYXRpb24gdGhhdCBhbiBPTlVzIHBvd2VyIG1hbmFnZW1lbnQgc3RhdGUgaGFzIGNoYW5nZWQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIHBvc3NpYmxlX2RyaWZ0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2FsYXJtX3N0YXR1cyA9IHsgLm5hbWUgPSAiYWxhcm1fc3RhdHVzIiwgLmRlc2NyID0gIk9uOiBlc3RpbWF0ZWQgZHJpZnQgaGFzIGV4Y2VlZGVkIHRoZSBjb25maWd1cmVkIHRocmVzaG9sZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1BPU1NJQkxFX0RSSUZUX0lEX0FMQVJNX1NUQVRVUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YSwgYWxhcm1fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2VzdGltYXRlZF9kcmlmdCA9IHsgLm5hbWUgPSAiZXN0aW1hdGVkX2RyaWZ0IiwgLmRlc2NyID0gIklmIHN0YXR1cyBpcyBvbiwgdGhlIGVzdGltYXRlZCBkcmlmdCB2YWx1ZSwgb3RoZXJ3aXNlIHplcm8gKDApLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfUE9TU0lCTEVfRFJJRlRfSURfRVNUSU1BVEVEX0RSSUZULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhLCBlc3RpbWF0ZWRfZHJpZnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2ludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfYWxhcm1fc3RhdHVzLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZXN0aW1hdGVkX2RyaWZ0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhbGFybV9zdGF0dXMiLCAuZGVzY3IgPSAiT246IGVzdGltYXRlZCBkcmlmdCBoYXMgZXhjZWVkZWQgdGhlIGNvbmZpZ3VyZWQgdGhyZXNob2xkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X2RhdGEsIGFsYXJtX3N0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9LCB7IC5uYW1lID0gImVzdGltYXRlZF9kcmlmdCIsIC5kZXNjciA9ICJJZiBzdGF0dXMgaXMgb24sIHRoZSBlc3RpbWF0ZWQgZHJpZnQgdmFsdWUsIG90aGVyd2lzZSB6ZXJvICgwKS4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhLCBlc3RpbWF0ZWRfZHJpZnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2ludDMyX3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhIiwgLmRlc2NyID0gIkFuIE9OVSBpbiBhIGxvdyBwb3dlciBzdGF0ZSBtYXkgYmUgZXhwZXJpZW5jaW5nIGRyaWZ0IGJleW9uZCB0aGUgY29uZmlndXJlZCB0aHJlc2hvbGQuIFRoZSBlc3RpbWF0ZSBtYXkgYmUgaW5hY2N1cmF0ZSBkZXBlbmRpbmcgb24gT05VIGJlaGF2aW9yLiBBY3R1YWwgZHJpZnQgbWF5IGJlIGxlc3MgdGhhbiBlc3RpbWF0ZWQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIHJlcXVlc3RfcmVnaXN0cmF0aW9uICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX3NtYV9mbGFnID0geyAubmFtZSA9ICJzbWFfZmxhZyIsIC5kZXNjciA9ICJJcyB0aGUgcmVxdWVzdCByZWdpc3RyYXRpb24gcHJvY2VzcyBpcyBwYXJ0IG9mIHRoZSBTTUEgcHJvY2VzcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfUkVRVUVTVF9SRUdJU1RSQVRJT05fSURfU01BX0ZMQUcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2RhdGEsIHNtYV9mbGFnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX3NtYV9mbGFnIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25fZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzbWFfZmxhZyIsIC5kZXNjciA9ICJJcyB0aGUgcmVxdWVzdCByZWdpc3RyYXRpb24gcHJvY2VzcyBpcyBwYXJ0IG9mIHRoZSBTTUEgcHJvY2VzcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2RhdGEsIHNtYV9mbGFnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25fZGF0YSIsIC5kZXNjciA9ICJSZXF1ZXN0IHRoZSBPTlUgdG8gc2VuZCBpdHMgUmVnaXN0cmF0aW9uIElEIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIGNoYW5nZV9wb3dlcl9sZXZlbGxpbmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19jb250cm9sID0geyAubmFtZSA9ICJjb250cm9sIiwgLmRlc2NyID0gImNvbnRyb2wiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0NIQU5HRV9QT1dFUl9MRVZFTExJTkdfSURfQ09OVFJPTCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19kYXRhLCBjb250cm9sKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG93ZXJfbGV2ZWxsaW5nX2NvbnRyb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19hdHRlbnVhdGlvbiA9IHsgLm5hbWUgPSAiYXR0ZW51YXRpb24iLCAuZGVzY3IgPSAiVGhlIHJlcXVlc3RlZCBhdHRlbnVhdGlvbiBpbiBzdGVwcyBvZiAzZEIgYXMgcGFydCBvZiBwb3dlciBsZXZlbGxpbmcgaW5zdHJ1Y3Rpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0NIQU5HRV9QT1dFUl9MRVZFTExJTkdfSURfQVRURU5VQVRJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfZGF0YSwgYXR0ZW51YXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2NvbnRyb2wsICZwcm9wX2Rlc2NyX3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2F0dGVudWF0aW9uIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImNvbnRyb2wiLCAuZGVzY3IgPSAiY29udHJvbCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfZGF0YSwgY29udHJvbCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvd2VyX2xldmVsbGluZ19jb250cm9sIH0sIHsgLm5hbWUgPSAiYXR0ZW51YXRpb24iLCAuZGVzY3IgPSAiVGhlIHJlcXVlc3RlZCBhdHRlbnVhdGlvbiBpbiBzdGVwcyBvZiAzZEIgYXMgcGFydCBvZiBwb3dlciBsZXZlbGxpbmcgaW5zdHJ1Y3Rpb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2RhdGEsIGF0dGVudWF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2RhdGEiLCAuZGVzY3IgPSAiQ2hhbmdlIHBvd2VyIGxldmVsbGluZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSBnZXRfcG93ZXJfbGV2ZWwgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2xldmVsX3Byb3BfYXJyYXlbXSA9IHsgfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIGdldF9wb3dlcl9jb25zdW1wdGlvbiAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX29udV9nZXRfcG93ZXJfY29uc3VtcHRpb25fcHJvcF9hcnJheVtdID0geyB9OworCisvKiBHcm91cDogeGdwb25fb251IC0gYWRqdXN0X3R4X3dhdmVsZW5ndGggKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZnJlcXVlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uID0geyAubmFtZSA9ICJmcmVxdWVuY3lfYWRqdXN0bWVudF9kaXJlY3Rpb24iLCAuZGVzY3IgPSAiRnJlcXVlbmN5IGFkanVzdG1lbnQgZGlyZWN0aW9uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9BREpVU1RfVFhfV0FWRUxFTkdUSF9JRF9GUkVRVUVOQ1lfQURKVVNUTUVOVF9ESVJFQ1RJT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEsIGZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2ZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9mcmVxdWVuY3lfYWRqdXN0bWVudF9zaXplID0geyAubmFtZSA9ICJmcmVxdWVuY3lfYWRqdXN0bWVudF9zaXplIiwgLmRlc2NyID0gIlRoZSBzaXplIG9mIHRoZSBmcmVxdWVuY3kgYWRqdXN0bWVudCBpbiB1bml0cyBvZiAwLjFHSHoiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0FESlVTVF9UWF9XQVZFTEVOR1RIX0lEX0ZSRVFVRU5DWV9BREpVU1RNRU5UX1NJWkUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEsIGZyZXF1ZW5jeV9hZGp1c3RtZW50X3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZnJlcXVlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZnJlcXVlbmN5X2FkanVzdG1lbnRfc2l6ZSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZnJlcXVlbmN5X2FkanVzdG1lbnRfZGlyZWN0aW9uIiwgLmRlc2NyID0gIkZyZXF1ZW5jeSBhZGp1c3RtZW50IGRpcmVjdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEsIGZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2ZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbiB9LCB7IC5uYW1lID0gImZyZXF1ZW5jeV9hZGp1c3RtZW50X3NpemUiLCAuZGVzY3IgPSAiVGhlIHNpemUgb2YgdGhlIGZyZXF1ZW5jeSBhZGp1c3RtZW50IGluIHVuaXRzIG9mIDAuMUdIeiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEsIGZyZXF1ZW5jeV9hZGp1c3RtZW50X3NpemUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhIiwgLmRlc2NyID0gIkluc3RydWN0IHRoZSBPTlUgdG8gYWRqdXN0IGl0cyB1cHN0cmVhbSB0cmFuc21pdHRlciB3YXZlbGVuZ3RoIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIHJlZ2lzdHJhdGlvbl9pZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfcmVnaXN0cmF0aW9uX2lkID0geyAubmFtZSA9ICJyZWdpc3RyYXRpb25faWQiLCAuZGVzY3IgPSAiUmVnaXN0cmF0aW9uIElEIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9SRUdJU1RSQVRJT05fSURfSURfUkVHSVNUUkFUSU9OX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YSwgcmVnaXN0cmF0aW9uX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX3U4XzM2IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMgPSB7IC5uYW1lID0gInJlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cyIsIC5kZXNjciA9ICJyZXF1ZXN0IHJlZ2lzdHJhdGlvbiBzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1JFR0lTVFJBVElPTl9JRF9JRF9SRVFVRVNUX1JFR0lTVFJBVElPTl9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9kYXRhLCByZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX3JlcXVlc3RfcmVnaXN0cmF0aW9uX2ZhaWxfcmVhc29uID0geyAubmFtZSA9ICJyZXF1ZXN0X3JlZ2lzdHJhdGlvbl9mYWlsX3JlYXNvbiIsIC5kZXNjciA9ICJyZXF1ZXN0IHJlZ2lzdHJhdGlvbiBmYWlsIHJlYXNvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfUkVHSVNUUkFUSU9OX0lEX0lEX1JFUVVFU1RfUkVHSVNUUkFUSU9OX0ZBSUxfUkVBU09OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YSwgcmVxdWVzdF9yZWdpc3RyYXRpb25fZmFpbF9yZWFzb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9mYWlsX3JlYXNvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX29udV9yZWdpc3RyYXRpb25faWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX3JlZ2lzdHJhdGlvbl9pZCwgJnByb3BfZGVzY3JfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9zdGF0dXMsICZwcm9wX2Rlc2NyX3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfcmVxdWVzdF9yZWdpc3RyYXRpb25fZmFpbF9yZWFzb24gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyZWdpc3RyYXRpb25faWQiLCAuZGVzY3IgPSAiUmVnaXN0cmF0aW9uIElEIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2RhdGEsIHJlZ2lzdHJhdGlvbl9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl91OF8zNiB9LCB7IC5uYW1lID0gInJlcXVlc3RfcmVnaXN0cmF0aW9uX3N0YXR1cyIsIC5kZXNjciA9ICJyZXF1ZXN0IHJlZ2lzdHJhdGlvbiBzdGF0dXMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YSwgcmVxdWVzdF9yZWdpc3RyYXRpb25fc3RhdHVzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH0sIHsgLm5hbWUgPSAicmVxdWVzdF9yZWdpc3RyYXRpb25fZmFpbF9yZWFzb24iLCAuZGVzY3IgPSAicmVxdWVzdCByZWdpc3RyYXRpb24gZmFpbCByZWFzb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YSwgcmVxdWVzdF9yZWdpc3RyYXRpb25fZmFpbF9yZWFzb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9mYWlsX3JlYXNvbiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YSIsIC5kZXNjciA9ICJSZWdpc3RyYXRpb24gSUQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fb251IC0gcG93ZXJfbGV2ZWxfcmVwb3J0ICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9hdHRlbnVhdGlvbiA9IHsgLm5hbWUgPSAiYXR0ZW51YXRpb24iLCAuZGVzY3IgPSAiQXR0ZW51YXRpb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1BPV0VSX0xFVkVMX1JFUE9SVF9JRF9BVFRFTlVBVElPTiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2RhdGEsIGF0dGVudWF0aW9uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9wb3dlcl9sZXZlbGxpbmdfY2FwYWJpbGl0eSA9IHsgLm5hbWUgPSAicG93ZXJfbGV2ZWxsaW5nX2NhcGFiaWxpdHkiLCAuZGVzY3IgPSAiUG93ZXIgbGV2ZWxsaW5nIGNhcGFiaWxpdHkiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1BPV0VSX0xFVkVMX1JFUE9SVF9JRF9QT1dFUl9MRVZFTExJTkdfQ0FQQUJJTElUWSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2RhdGEsIHBvd2VyX2xldmVsbGluZ19jYXBhYmlsaXR5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfYXR0ZW51YXRpb24sICZwcm9wX2Rlc2NyX3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfcG93ZXJfbGV2ZWxsaW5nX2NhcGFiaWxpdHkgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJhdHRlbnVhdGlvbiIsIC5kZXNjciA9ICJBdHRlbnVhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9kYXRhLCBhdHRlbnVhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInBvd2VyX2xldmVsbGluZ19jYXBhYmlsaXR5IiwgLmRlc2NyID0gIlBvd2VyIGxldmVsbGluZyBjYXBhYmlsaXR5IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2RhdGEsIHBvd2VyX2xldmVsbGluZ19jYXBhYmlsaXR5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9kYXRhIiwgLmRlc2NyID0gIlBvd2VyIGxldmVsIHJlcG9ydCIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSBwb3dlcl9jb25zdW1wdGlvbl9yZXBvcnQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydCA9IHsgLm5hbWUgPSAicG93ZXJfY29uc3VtcHRpb25fcmVwb3J0IiwgLmRlc2NyID0gInBvd2VyIGNvbnN1bXB0aW9uIHJlcG9ydCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfUE9XRVJfQ09OU1VNUFRJT05fUkVQT1JUX0lEX1BPV0VSX0NPTlNVTVBUSU9OX1JFUE9SVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2RhdGEsIHBvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl9wb3dlcl9jb25zdW1wdGlvbl9jaGFubmVsX3JlcG9ydF84IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0IH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAicG93ZXJfY29uc3VtcHRpb25fcmVwb3J0IiwgLmRlc2NyID0gInBvd2VyIGNvbnN1bXB0aW9uIHJlcG9ydCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9kYXRhLCBwb3dlcl9jb25zdW1wdGlvbl9yZXBvcnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfcG93ZXJfY29uc3VtcHRpb25fY2hhbm5lbF9yZXBvcnRfOCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfZGF0YSIsIC5kZXNjciA9ICJQb3dlciBjb25zdW1wdGlvbiByZXBvcnQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fb251IC0gc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbiAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX21hc3Rlcl9rZXkgPSB7IC5uYW1lID0gIm1hc3Rlcl9rZXkiLCAuZGVzY3IgPSAibWFzdGVyIGtleSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9JRF9NQVNURVJfS0VZLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2RhdGEsIG1hc3Rlcl9rZXkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hZXNfa2V5IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fYnVmZmVyID0geyAubmFtZSA9ICJidWZmZXIiLCAuZGVzY3IgPSAiT01DSSBkYXRhIGJ1ZmZlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9JRF9CVUZGRVIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZGF0YSwgYnVmZmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDggfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9taWMgPSB7IC5uYW1lID0gIm1pYyIsIC5kZXNjciA9ICJtaWMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fSURfTUlDLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2RhdGEsIG1pYyksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDMyX3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX21hc3Rlcl9rZXksICZwcm9wX2Rlc2NyX3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2J1ZmZlciwgJnByb3BfZGVzY3JfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fbWljIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gIm1hc3Rlcl9rZXkiLCAuZGVzY3IgPSAibWFzdGVyIGtleSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZGF0YSwgbWFzdGVyX2tleSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Flc19rZXkgfSwgeyAubmFtZSA9ICJidWZmZXIiLCAuZGVzY3IgPSAiT01DSSBkYXRhIGJ1ZmZlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZGF0YSwgYnVmZmVyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDggfSwgeyAubmFtZSA9ICJtaWMiLCAuZGVzY3IgPSAibWljIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9kYXRhLCBtaWMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2RhdGEiLCAuZGVzY3IgPSAiT01DSSBiYXNlIHNlY3VyZSBtdXR1YWwgYXV0aGVudGljYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fb251IC0gc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9zdGF0dXMgPSB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJzdGF0dXMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTFVSRV9JRF9TVEFUVVMsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2ZhaWxfcmVhc29uID0geyAubmFtZSA9ICJmYWlsX3JlYXNvbiIsIC5kZXNjciA9ICJzZWN1cmUgbXV0dWFsIGF1dGhlbnRpY2F0aW9uIGZhaWwgcmVhc29uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OX0ZBSUxVUkVfSURfRkFJTF9SRUFTT04sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9kYXRhLCBmYWlsX3JlYXNvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbF9yZWFzb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9zdGF0dXMsICZwcm9wX2Rlc2NyX3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfZmFpbF9yZWFzb24gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0dXMiLCAuZGVzY3IgPSAic3RhdHVzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9LCB7IC5uYW1lID0gImZhaWxfcmVhc29uIiwgLmRlc2NyID0gInNlY3VyZSBtdXR1YWwgYXV0aGVudGljYXRpb24gZmFpbCByZWFzb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfZGF0YSwgZmFpbF9yZWFzb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWxfcmVhc29uIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9kYXRhIiwgLmRlc2NyID0gIkZhaWx1cmUgb2Ygc2VjdXJlIG11dHVhbCBhdXRoZW50aWNhdGlvbiBkdWUgdG8gTUlDIGVycm9yIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIG9udV90dW5pbmdfaW4gKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9wcm9wX2FycmF5W10gPSB7IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSBvbnVfdHVuaW5nX291dCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9vbnVfdHVuaW5nX291dF90YXJnZXRfZHNfcG9uX2lkID0geyAubmFtZSA9ICJ0YXJnZXRfZHNfcG9uX2lkIiwgLmRlc2NyID0gInRhcmdldCBkcyBwb24gaWQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1RBUkdFVF9EU19QT05fSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2RhdGEsIHRhcmdldF9kc19wb25faWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9wb25faWQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfdGFyZ2V0X3VzX3Bvbl9pZCA9IHsgLm5hbWUgPSAidGFyZ2V0X3VzX3Bvbl9pZCIsIC5kZXNjciA9ICJ0YXJnZXQgdXMgcG9uIGlkIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX09VVF9JRF9UQVJHRVRfVVNfUE9OX0lELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhLCB0YXJnZXRfdXNfcG9uX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X29udV90dW5pbmdfb3V0X3RpbWVfdG9fc3dpdGNoID0geyAubmFtZSA9ICJ0aW1lX3RvX3N3aXRjaCIsIC5kZXNjciA9ICJUaW1lIHRvIHN3aXRjaCBpbiBtcyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfSURfVElNRV9UT19TV0lUQ0gsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2RhdGEsIHRpbWVfdG9fc3dpdGNoKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50MzJfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9vbnVfdHVuaW5nX291dF9yb2xsYmFjayA9IHsgLm5hbWUgPSAicm9sbGJhY2siLCAuZGVzY3IgPSAicm9sbGJhY2siLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0lEX1JPTExCQUNLLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhLCByb2xsYmFjayksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9vbnVfdHVuaW5nX291dF9zdGF0dXMgPSB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJvbi0gdG8gc3RhcnQgdHVuaW5nIG91dCBvZmYtIHRvIHN0b3AgdHVuaW5nIG91dCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfSURfU1RBVFVTLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhLCBzdGF0dXMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zdGF0dXMgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfdGFyZ2V0X2RzX3Bvbl9pZCwgJnByb3BfZGVzY3JfeGdwb25fb251X29udV90dW5pbmdfb3V0X3RhcmdldF91c19wb25faWQsICZwcm9wX2Rlc2NyX3hncG9uX29udV9vbnVfdHVuaW5nX291dF90aW1lX3RvX3N3aXRjaCwgJnByb3BfZGVzY3JfeGdwb25fb251X29udV90dW5pbmdfb3V0X3JvbGxiYWNrLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfc3RhdHVzIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJ0YXJnZXRfZHNfcG9uX2lkIiwgLmRlc2NyID0gInRhcmdldCBkcyBwb24gaWQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhLCB0YXJnZXRfZHNfcG9uX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcG9uX2lkIH0sIHsgLm5hbWUgPSAidGFyZ2V0X3VzX3Bvbl9pZCIsIC5kZXNjciA9ICJ0YXJnZXQgdXMgcG9uIGlkIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfZGF0YSwgdGFyZ2V0X3VzX3Bvbl9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Bvbl9pZCB9LCB7IC5uYW1lID0gInRpbWVfdG9fc3dpdGNoIiwgLmRlc2NyID0gIlRpbWUgdG8gc3dpdGNoIGluIG1zIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfZGF0YSwgdGltZV90b19zd2l0Y2gpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQzMl90IH0sIHsgLm5hbWUgPSAicm9sbGJhY2siLCAuZGVzY3IgPSAicm9sbGJhY2siLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhLCByb2xsYmFjayksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN0YXR1cyIsIC5kZXNjciA9ICJvbi0gdG8gc3RhcnQgdHVuaW5nIG91dCBvZmYtIHRvIHN0b3AgdHVuaW5nIG91dCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2RhdGEsIHN0YXR1cyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXR1cyB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2RhdGEiLCAuZGVzY3IgPSAiT05VIFR1bmluZyBvdXQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fb251IC0gb251X3R1bmluZ19vdXRfY29tcGxldGVkICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9yZXN1bHQgPSB7IC5uYW1lID0gInJlc3VsdCIsIC5kZXNjciA9ICJyZXN1bHQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfT1VUX0NPTVBMRVRFRF9JRF9SRVNVTFQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9kYXRhLCByZXN1bHQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2ZhaWxfcmVhc29uID0geyAubmFtZSA9ICJmYWlsX3JlYXNvbiIsIC5kZXNjciA9ICJmYWlsIHJlYXNvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfT05VX1RVTklOR19PVVRfQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfZGF0YSwgZmFpbF9yZWFzb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF90dW5lX291dF9mYWlsX3JlYXNvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX3Jlc3VsdCwgJnByb3BfZGVzY3JfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9mYWlsX3JlYXNvbiB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJlc3VsdCIsIC5kZXNjciA9ICJyZXN1bHQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfZGF0YSwgcmVzdWx0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH0sIHsgLm5hbWUgPSAiZmFpbF9yZWFzb24iLCAuZGVzY3IgPSAiZmFpbCByZWFzb24iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfZGF0YSwgZmFpbF9yZWFzb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF90dW5lX291dF9mYWlsX3JlYXNvbiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfZGF0YSIsIC5kZXNjciA9ICJPTlUgVHVuaW5nIG91dCBjb21wbGV0ZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fb251IC0gb251X3R1bmluZ19pbl9jb21wbGV0ZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWRfcmVzdWx0ID0geyAubmFtZSA9ICJyZXN1bHQiLCAuZGVzY3IgPSAicmVzdWx0IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9PTlVfVFVOSU5HX0lOX0NPTVBMRVRFRF9JRF9SRVNVTFQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2RhdGEsIHJlc3VsdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9mYWlsX3JlYXNvbiA9IHsgLm5hbWUgPSAiZmFpbF9yZWFzb24iLCAuZGVzY3IgPSAiZmFpbCByZWFzb24iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX09OVV9UVU5JTkdfSU5fQ09NUExFVEVEX0lEX0ZBSUxfUkVBU09OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhLCBmYWlsX3JlYXNvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3R1bmVfaW5fZmFpbF9yZWFzb24gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWRfcmVzdWx0LCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWRfZmFpbF9yZWFzb24gfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInJlc3VsdCIsIC5kZXNjciA9ICJyZXN1bHQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhLCByZXN1bHQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9yZXN1bHQgfSwgeyAubmFtZSA9ICJmYWlsX3JlYXNvbiIsIC5kZXNjciA9ICJmYWlsIHJlYXNvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2RhdGEsIGZhaWxfcmVhc29uKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfdHVuZV9pbl9mYWlsX3JlYXNvbiB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZF9kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2RhdGEiLCAuZGVzY3IgPSAiT05VIFR1bmluZyBpbiBjb21wbGV0ZWQiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fb251IC0gdHVuaW5nX3Jlc3BvbnNlICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9hY2sgPSB7IC5uYW1lID0gImFjayIsIC5kZXNjciA9ICJpcyB0dW5pbmcgcmVzcG9uc2UgcmVjZWl2ZWQgd2l0aCBhY2sgb3IgbmFjayIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfVFVOSU5HX1JFU1BPTlNFX0lEX0FDSywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2RhdGEsIGFjayksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfcmVzdWx0ID0geyAubmFtZSA9ICJyZXN1bHQiLCAuZGVzY3IgPSAicmVzdWx0IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9UVU5JTkdfUkVTUE9OU0VfSURfUkVTVUxULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfZGF0YSwgcmVzdWx0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfcmVzdWx0IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfYWNrLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX3Jlc3VsdCB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImFjayIsIC5kZXNjciA9ICJpcyB0dW5pbmcgcmVzcG9uc2UgcmVjZWl2ZWQgd2l0aCBhY2sgb3IgbmFjayIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9kYXRhLCBhY2spLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJyZXN1bHQiLCAuZGVzY3IgPSAicmVzdWx0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2RhdGEsIHJlc3VsdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3Jlc3VsdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfZGF0YSA9IHsgLm5hbWUgPSAiYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfZGF0YSIsIC5kZXNjciA9ICJUdW5pbmcgcmVzcG9uc2UiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZV9kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV90dW5pbmdfcmVzcG9uc2VfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fb251IC0gc3RhdF9jZmcgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF9jZmdfY2ZnID0geyAubmFtZSA9ICJjZmciLCAuZGVzY3IgPSAiU3RhdGlzdGljIGFsYXJtIGNvbmZpZ3VyYXRpb24uIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0NGR19JRF9DRkcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X3N0YXRfY2ZnX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fb251X3N0YXRfY2ZnX2NmZyB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3N0YXRfY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiY2ZnIiwgLmRlc2NyID0gIlN0YXRpc3RpYyBhbGFybSBjb25maWd1cmF0aW9uLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfY2ZnX2RhdGEsIGNmZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3N0YXRfYWxhcm1fY29uZmlnIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3N0YXRfY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YSIsIC5kZXNjciA9ICJTdGF0aXN0aWMgQ29uZmlndXJhdGlvbiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSBzdGF0X2FsYXJtX3JhaXNlZCAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9zdGF0ID0geyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfU1RBVF9BTEFSTV9SQUlTRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zdGF0X2lkIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKiBCQ01fREVTQ1IgeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXlbXSA9IHsgJnByb3BfZGVzY3JfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX3N0YXQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSwgc3RhdCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zdGF0X2lkIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSIsIC5kZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMpIC8gc2l6ZW9mKGJjbWNsaV9maWVsZF9kZXNjciksIC5maWVsZHMgPSB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4Z3Bvbl9vbnUgLSBzdGF0X2FsYXJtX2NsZWFyZWQgKi8KK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX3N0YXQgPSB7IC5uYW1lID0gInN0YXQiLCAuZGVzY3IgPSAiU3RhdGlzdGljIGlkZW50aWZpZXIuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9TVEFUX0FMQVJNX0NMRUFSRURfSURfU1RBVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEsIHN0YXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc3RhdF9pZCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX3N0YXQgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJzdGF0IiwgLmRlc2NyID0gIlN0YXRpc3RpYyBpZGVudGlmaWVyLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhLCBzdGF0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3N0YXRfaWQgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEiLCAuZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogR3JvdXA6IHhncG9uX29udSAtIGF1dG9fY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX2RmaSA9IHsgLm5hbWUgPSAiZGZpIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJkZmlcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0RGSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgZGZpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX2RnaSA9IHsgLm5hbWUgPSAiZGdpIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJkZ2lcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0RHSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgZGdpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX2Rvd2kgPSB7IC5uYW1lID0gImRvd2kiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImRvd2lcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0RPV0ksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIGRvd2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfaW52YWxpZF9kYnJ1X3JlcG9ydCA9IHsgLm5hbWUgPSAiaW52YWxpZF9kYnJ1X3JlcG9ydCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiaW52YWxpZF9kYnJ1X3JlcG9ydFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfSU5WQUxJRF9EQlJVX1JFUE9SVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgaW52YWxpZF9kYnJ1X3JlcG9ydCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19rZXlfZXhjaGFuZ2VfY29tcGxldGVkID0geyAubmFtZSA9ICJrZXlfZXhjaGFuZ2VfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJrZXlfZXhjaGFuZ2VfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBrZXlfZXhjaGFuZ2VfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX2tleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkID0geyAubmFtZSA9ICJrZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwia2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9DWUNMRV9TS0lQUEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBrZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoID0geyAubmFtZSA9ICJrZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJrZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENILCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBrZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX2tleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0ID0geyAubmFtZSA9ICJrZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwia2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX0tFWV9FWENIQU5HRV9LRVlfUkVRVUVTVF9USU1FT1VULCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBrZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19sb29jaSA9IHsgLm5hbWUgPSAibG9vY2kiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImxvb2NpXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9MT09DSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgbG9vY2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfb251X2FjdGl2YXRpb25fY29tcGxldGVkID0geyAubmFtZSA9ICJvbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm9udV9hY3RpdmF0aW9uX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0FDVElWQVRJT05fQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBvbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfb251X2FsYXJtID0geyAubmFtZSA9ICJvbnVfYWxhcm0iLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm9udV9hbGFybVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0FMQVJNLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBvbnVfYWxhcm0pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQgPSB7IC5uYW1lID0gIm9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIG9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX29udV9kaXNhYmxlX2NvbXBsZXRlZCA9IHsgLm5hbWUgPSAib251X2Rpc2FibGVfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvbnVfZGlzYWJsZV9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9ESVNBQkxFX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgb251X2Rpc2FibGVfY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX29udV9lbmFibGVfY29tcGxldGVkID0geyAubmFtZSA9ICJvbnVfZW5hYmxlX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwib251X2VuYWJsZV9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX09OVV9FTkFCTEVfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBvbnVfZW5hYmxlX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19vbnVfdHVuaW5nX2luX2NvbXBsZXRlZCA9IHsgLm5hbWUgPSAib251X3R1bmluZ19pbl9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm9udV90dW5pbmdfaW5fY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9PTlVfVFVOSU5HX0lOX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgb251X3R1bmluZ19pbl9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfb251X3R1bmluZ19vdXRfY29tcGxldGVkID0geyAubmFtZSA9ICJvbnVfdHVuaW5nX291dF9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm9udV90dW5pbmdfb3V0X2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT05VX1RVTklOR19PVVRfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBvbnVfdHVuaW5nX291dF9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfb3B0aWNhbF9yZWZsZWN0aW9uID0geyAubmFtZSA9ICJvcHRpY2FsX3JlZmxlY3Rpb24iLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm9wdGljYWxfcmVmbGVjdGlvblwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfT1BUSUNBTF9SRUZMRUNUSU9OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBvcHRpY2FsX3JlZmxlY3Rpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfcG9zc2libGVfZHJpZnQgPSB7IC5uYW1lID0gInBvc3NpYmxlX2RyaWZ0IiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJwb3NzaWJsZV9kcmlmdFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfUE9TU0lCTEVfRFJJRlQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIHBvc3NpYmxlX2RyaWZ0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydCA9IHsgLm5hbWUgPSAicG93ZXJfY29uc3VtcHRpb25fcmVwb3J0IiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJwb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1BPV0VSX0NPTlNVTVBUSU9OX1JFUE9SVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX3Bvd2VyX2xldmVsX3JlcG9ydCA9IHsgLm5hbWUgPSAicG93ZXJfbGV2ZWxfcmVwb3J0IiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJwb3dlcl9sZXZlbF9yZXBvcnRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1BPV0VSX0xFVkVMX1JFUE9SVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgcG93ZXJfbGV2ZWxfcmVwb3J0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlID0geyAubmFtZSA9ICJwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19wcXNpID0geyAubmFtZSA9ICJwcXNpIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJwcXNpXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9QUVNJLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBwcXNpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX3JhbmdpbmdfY29tcGxldGVkID0geyAubmFtZSA9ICJyYW5naW5nX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicmFuZ2luZ19jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1JBTkdJTkdfQ09NUExFVEVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCByYW5naW5nX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19yZWdpc3RyYXRpb25faWQgPSB7IC5uYW1lID0gInJlZ2lzdHJhdGlvbl9pZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicmVnaXN0cmF0aW9uX2lkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9SRUdJU1RSQVRJT05fSUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIHJlZ2lzdHJhdGlvbl9pZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCA9IHsgLm5hbWUgPSAicnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfc2RpID0geyAubmFtZSA9ICJzZGkiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInNkaVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU0RJLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBzZGkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlID0geyAubmFtZSA9ICJzZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmUiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInNlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9GQUlMVVJFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBzZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfc2ZpID0geyAubmFtZSA9ICJzZmkiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInNmaVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU0ZJLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBzZmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfc3RhdF9hbGFybV9jbGVhcmVkID0geyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9DTEVBUkVELCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBzdGF0X2FsYXJtX2NsZWFyZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfc3RhdF9hbGFybV9yYWlzZWQgPSB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX3JhaXNlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfU1RBVF9BTEFSTV9SQUlTRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fcmFpc2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX3N1ZmkgPSB7IC5uYW1lID0gInN1ZmkiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN1ZmlcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fT05VX0FVVE9fQ0ZHX0lEX1NVRkksIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIHN1ZmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfdGl3aSA9IHsgLm5hbWUgPSAidGl3aSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwidGl3aVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9PTlVfQVVUT19DRkdfSURfVElXSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgdGl3aSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ190dW5pbmdfcmVzcG9uc2UgPSB7IC5uYW1lID0gInR1bmluZ19yZXNwb25zZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwidHVuaW5nX3Jlc3BvbnNlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX09OVV9BVVRPX0NGR19JRF9UVU5JTkdfUkVTUE9OU0UsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIHR1bmluZ19yZXNwb25zZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX29udV9hdXRvX2NmZ19wcm9wX2FycmF5W10gPSB7ICZwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19kZmksICZwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19kZ2ksICZwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19kb3dpLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfaW52YWxpZF9kYnJ1X3JlcG9ydCwgJnByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX2tleV9leGNoYW5nZV9jb21wbGV0ZWQsICZwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCwgJnByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2gsICZwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCwgJnByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX2xvb2NpLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfb251X2FjdGl2YXRpb25fY29tcGxldGVkLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfb251X2FsYXJtLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQsICZwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19vbnVfZGlzYWJsZV9jb21wbGV0ZWQsICZwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19vbnVfZW5hYmxlX2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX29udV90dW5pbmdfaW5fY29tcGxldGVkLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfb251X3R1bmluZ19vdXRfY29tcGxldGVkLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfb3B0aWNhbF9yZWZsZWN0aW9uLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfcG9zc2libGVfZHJpZnQsICZwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnQsICZwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19wb3dlcl9sZXZlbF9yZXBvcnQsICZwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSwgJnByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX3Bxc2ksICZwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19yYW5naW5nX2NvbXBsZXRlZCwgJnByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX3JlZ2lzdHJhdGlvbl9pZCwgJnByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfc2RpLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfc2ZpLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfc3RhdF9hbGFybV9jbGVhcmVkLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfc3RhdF9hbGFybV9yYWlzZWQsICZwcm9wX2Rlc2NyX3hncG9uX29udV9hdXRvX2NmZ19zdWZpLCAmcHJvcF9kZXNjcl94Z3Bvbl9vbnVfYXV0b19jZmdfdGl3aSwgJnByb3BfZGVzY3JfeGdwb25fb251X2F1dG9fY2ZnX3R1bmluZ19yZXNwb25zZSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGFfZmllbGRzW10gPSB7IHsgLm5hbWUgPSAiZGZpIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJkZmlcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBkZmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJkZ2kiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImRnaVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIGRnaSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImRvd2kiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcImRvd2lcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBkb3dpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiaW52YWxpZF9kYnJ1X3JlcG9ydCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwiaW52YWxpZF9kYnJ1X3JlcG9ydFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIGludmFsaWRfZGJydV9yZXBvcnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJrZXlfZXhjaGFuZ2VfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJrZXlfZXhjaGFuZ2VfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwga2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImtleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJrZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIGtleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAia2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwia2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIGtleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2gpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJrZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwia2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBrZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gImxvb2NpIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJsb29jaVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIGxvb2NpKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAib251X2FjdGl2YXRpb25fY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBvbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJvbnVfYWxhcm0iLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm9udV9hbGFybVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIG9udV9hbGFybSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIG9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAib251X2Rpc2FibGVfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvbnVfZGlzYWJsZV9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBvbnVfZGlzYWJsZV9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJvbnVfZW5hYmxlX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwib251X2VuYWJsZV9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBvbnVfZW5hYmxlX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gIm9udV90dW5pbmdfaW5fY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvbnVfdHVuaW5nX2luX2NvbXBsZXRlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIG9udV90dW5pbmdfaW5fY29tcGxldGVkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAib251X3R1bmluZ19vdXRfY29tcGxldGVkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJvbnVfdHVuaW5nX291dF9jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBvbnVfdHVuaW5nX291dF9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJvcHRpY2FsX3JlZmxlY3Rpb24iLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcIm9wdGljYWxfcmVmbGVjdGlvblwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIG9wdGljYWxfcmVmbGVjdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInBvc3NpYmxlX2RyaWZ0IiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJwb3NzaWJsZV9kcmlmdFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIHBvc3NpYmxlX2RyaWZ0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicG93ZXJfY29uc3VtcHRpb25fcmVwb3J0IiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJwb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBwb3dlcl9jb25zdW1wdGlvbl9yZXBvcnQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJwb3dlcl9sZXZlbF9yZXBvcnQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInBvd2VyX2xldmVsX3JlcG9ydFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIHBvd2VyX2xldmVsX3JlcG9ydCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInBvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJwb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIHBvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicHFzaSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicHFzaVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIHBxc2kpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJyYW5naW5nX2NvbXBsZXRlZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicmFuZ2luZ19jb21wbGV0ZWRcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCByYW5naW5nX2NvbXBsZXRlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInJlZ2lzdHJhdGlvbl9pZCIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwicmVnaXN0cmF0aW9uX2lkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgcmVnaXN0cmF0aW9uX2lkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAicnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzZGkiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInNkaVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIHNkaSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInNlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic2ZpIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzZmlcIiB3aWxsIGJlIGdlbmVyYXRlZC4iLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZ19kYXRhLCBzZmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiLCAuZGVzY3IgPSAiSWYgdHJ1ZSwgaW5kaWNhdGlvbnMgb2YgdHlwZSBcInN0YXRfYWxhcm1fY2xlYXJlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fY2xlYXJlZCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJzdGF0X2FsYXJtX3JhaXNlZFwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIHN0YXRfYWxhcm1fcmFpc2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAic3VmaSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwic3VmaVwiIHdpbGwgYmUgZ2VuZXJhdGVkLiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEsIHN1ZmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJ0aXdpIiwgLmRlc2NyID0gIklmIHRydWUsIGluZGljYXRpb25zIG9mIHR5cGUgXCJ0aXdpXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgdGl3aSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9LCB7IC5uYW1lID0gInR1bmluZ19yZXNwb25zZSIsIC5kZXNjciA9ICJJZiB0cnVlLCBpbmRpY2F0aW9ucyBvZiB0eXBlIFwidHVuaW5nX3Jlc3BvbnNlXCIgd2lsbCBiZSBnZW5lcmF0ZWQuIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSwgdHVuaW5nX3Jlc3BvbnNlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEgPSB7IC5uYW1lID0gImJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSIsIC5kZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGFfZmllbGRzKSAvIHNpemVvZihiY21jbGlfZmllbGRfZGVzY3IpLCAuZmllbGRzID0gdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2RhdGFfZmllbGRzIH0gfSB9OworCisvKiA9PT09IE9iamVjdDogeGdwb25fdHJ4ID09PT0gKi8KKworLyogR3JvdXA6IHhncG9uX3RyeCAtIGtleSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX3RyeF9rZXlfcG9uX25pID0geyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIG5ldHdvcmsgaW50ZXJmYWNlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX1RSWF9LRVlfSURfUE9OX05JLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3RyeF9rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX3RyeF9rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl90cnhfa2V5X3Bvbl9uaSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fdHJ4X2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIG5ldHdvcmsgaW50ZXJmYWNlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfa2V5LCBwb25fbmkpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSB9Oworc3RhdGljIGJjbWNsaV90eXBlX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl90cnhfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fdHJ4X2tleSIsIC5kZXNjciA9ICJrZXkiLCAuc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fdHJ4X2tleSksIC5iYXNlX3R5cGUgPSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgLnggPSB7IC5zID0geyAubnVtX2ZpZWxkcyA9IHNpemVvZih0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl90cnhfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3RyeF9rZXlfZmllbGRzIH0gfSB9OworCisvKiBHcm91cDogeGdwb25fdHJ4IC0gY2ZnICovCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fdHJ4X2NmZ19idXJzdF9wcm9maWxlID0geyAubmFtZSA9ICJidXJzdF9wcm9maWxlIiwgLmRlc2NyID0gImJ1cnN0IHByb2ZpbGUiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9CVVJTVF9QUk9GSUxFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSwgYnVyc3RfcHJvZmlsZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl94Z3Bvbl9idXJzdF9wcm9maWxlXzQgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl90cnhfY2ZnX3RyYW5zY2VpdmVyX2NvbmZpZyA9IHsgLm5hbWUgPSAidHJhbnNjZWl2ZXJfY29uZmlnIiwgLmRlc2NyID0gInRyYW5zY2VpdmVyIGNvbmZpZyIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1RSQU5TQ0VJVkVSX0NPTkZJRywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGEsIHRyYW5zY2VpdmVyX2NvbmZpZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X2Fycl94Z3Bvbl90cnhfY29uZmlndXJhdGlvbl80IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fdHJ4X2NmZ190cmFuc2NlaXZlcl90eXBlID0geyAubmFtZSA9ICJ0cmFuc2NlaXZlcl90eXBlIiwgLmRlc2NyID0gInRyeCB0eXBlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfVFJBTlNDRUlWRVJfVFlQRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGEsIHRyYW5zY2VpdmVyX3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl90cnhfdHlwZSB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX3RyeF9jZmdfZGVidWcgPSB7IC5uYW1lID0gImRlYnVnIiwgLmRlc2NyID0gImRlYnVnIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfREVCVUcsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhLCBkZWJ1ZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3RyeF9kZWJ1ZyB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX3RyeF9jZmdfcnNzaV9ub3JtYWxfY29uZmlnID0geyAubmFtZSA9ICJyc3NpX25vcm1hbF9jb25maWciLCAuZGVzY3IgPSAicnNzaSBub3JtYWwgY29uZmlnIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUlNTSV9OT1JNQUxfQ09ORklHLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSwgcnNzaV9ub3JtYWxfY29uZmlnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fcnNzaV9ub3JtYWxfY29uZmlnIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fdHJ4X2NmZ19yc3NpX3JhbmdpbmdfY29uZmlnID0geyAubmFtZSA9ICJyc3NpX3JhbmdpbmdfY29uZmlnIiwgLmRlc2NyID0gInJzc2kgcmFuZ2luZyBjb25maWciLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SU1NJX1JBTkdJTkdfQ09ORklHLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSwgcnNzaV9yYW5naW5nX2NvbmZpZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3Jzc2lfcmFuZ2luZ19jb25maWcgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl90cnhfY2ZnX3NlcmRlc19jb25maWd1cmF0aW9uID0geyAubmFtZSA9ICJzZXJkZXNfY29uZmlndXJhdGlvbiIsIC5kZXNjciA9ICJzZXJkZXMgY29uZmlndXJhdGlvbiIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1NFUkRFU19DT05GSUdVUkFUSU9OLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSwgc2VyZGVzX2NvbmZpZ3VyYXRpb24pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9zZXJkZXNfY29uZmlndXJhdGlvbiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX3RyeF9jZmdfYnVyc3RfcHJvZmlsZV9kZWxpbWl0ZXJfbWF4X2Vycm9ycyA9IHsgLm5hbWUgPSAiYnVyc3RfcHJvZmlsZV9kZWxpbWl0ZXJfbWF4X2Vycm9ycyIsIC5kZXNjciA9ICJidXJzdCBwcm9maWxlIGRlbGltaXRlciBtYXggZXJyb3JzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfQlVSU1RfUFJPRklMRV9ERUxJTUlURVJfTUFYX0VSUk9SUywgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGEsIGJ1cnN0X3Byb2ZpbGVfZGVsaW1pdGVyX21heF9lcnJvcnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdThfNCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX3RyeF9jZmdfcmFuZ2luZ19zbV9wYXR0ZXJuc19hdF9pbml0ID0geyAubmFtZSA9ICJyYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQiLCAuZGVzY3IgPSAiUmVzZXQgcGF0dGVybnMgdXNlZCBhdCBJbml0IG9mIFJhbmdpbmctV2luZG93IGFuZCBhZnRlciBBY2Nlc3MiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9SQU5HSU5HX1NNX1BBVFRFUk5TX0FUX0lOSVQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhLCByYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4gfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl90cnhfY2ZnX3Jhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZSA9IHsgLm5hbWUgPSAicmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlIiwgLmRlc2NyID0gInJhbmdpbmcgc20gcGF0dGVybnMgRUQgZmFpbHVyZSIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX1JBTkdJTkdfU01fUEFUVEVSTlNfRURfRkFJTFVSRSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGEsIHJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3J4X3Jhbmdpbmdfc21fcGF0dGVybiB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX3RyeF9jZmdfcmVzZXRfb25fZGVsX21pc3MgPSB7IC5uYW1lID0gInJlc2V0X29uX2RlbF9taXNzIiwgLmRlc2NyID0gInJlc2V0IG9uIGRlbCBtaXNzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfUkVTRVRfT05fREVMX01JU1MsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhLCByZXNldF9vbl9kZWxfbWlzcyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX3RyeF9jZmdfZWRfc3RhdGUgPSB7IC5uYW1lID0gImVkX3N0YXRlIiwgLmRlc2NyID0gImVkIHN0YXRlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hHUE9OX1RSWF9DRkdfSURfRURfU1RBVEUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhLCBlZF9zdGF0ZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX2VkX3N0YXRlIH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeGdwb25fdHJ4X2NmZ19pbnZlcnRfZWQgPSB7IC5uYW1lID0gImludmVydF9lZCIsIC5kZXNjciA9ICJpbnZlcnQgRUQiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9JTlZFUlRfRUQsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhLCBpbnZlcnRfZWQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94Z3Bvbl90cnhfY2ZnX2VuZF9vZl9idXJzdF9yZXNldCA9IHsgLm5hbWUgPSAiZW5kX29mX2J1cnN0X3Jlc2V0IiwgLmRlc2NyID0gImVuZCBvZiBidXJzdCByZXNldCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YR1BPTl9UUlhfQ0ZHX0lEX0VORF9PRl9CVVJTVF9SRVNFVCwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGEsIGVuZF9vZl9idXJzdF9yZXNldCksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hncG9uX3RyeF9jZmdfdHJ4X3JzdF9wb2xhcml0eSA9IHsgLm5hbWUgPSAidHJ4X3JzdF9wb2xhcml0eSIsIC5kZXNjciA9ICJUUlggcmVzZXQgcG9sYXJpdHkiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWEdQT05fVFJYX0NGR19JRF9UUlhfUlNUX1BPTEFSSVRZLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSwgdHJ4X3JzdF9wb2xhcml0eSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb3NfYm9vbCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyICogQkNNX0RFU0NSIHhncG9uX3RyeF9jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94Z3Bvbl90cnhfY2ZnX2J1cnN0X3Byb2ZpbGUsICZwcm9wX2Rlc2NyX3hncG9uX3RyeF9jZmdfdHJhbnNjZWl2ZXJfY29uZmlnLCAmcHJvcF9kZXNjcl94Z3Bvbl90cnhfY2ZnX3RyYW5zY2VpdmVyX3R5cGUsICZwcm9wX2Rlc2NyX3hncG9uX3RyeF9jZmdfZGVidWcsICZwcm9wX2Rlc2NyX3hncG9uX3RyeF9jZmdfcnNzaV9ub3JtYWxfY29uZmlnLCAmcHJvcF9kZXNjcl94Z3Bvbl90cnhfY2ZnX3Jzc2lfcmFuZ2luZ19jb25maWcsICZwcm9wX2Rlc2NyX3hncG9uX3RyeF9jZmdfc2VyZGVzX2NvbmZpZ3VyYXRpb24sICZwcm9wX2Rlc2NyX3hncG9uX3RyeF9jZmdfYnVyc3RfcHJvZmlsZV9kZWxpbWl0ZXJfbWF4X2Vycm9ycywgJnByb3BfZGVzY3JfeGdwb25fdHJ4X2NmZ19yYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQsICZwcm9wX2Rlc2NyX3hncG9uX3RyeF9jZmdfcmFuZ2luZ19zbV9wYXR0ZXJuc19lZF9mYWlsdXJlLCAmcHJvcF9kZXNjcl94Z3Bvbl90cnhfY2ZnX3Jlc2V0X29uX2RlbF9taXNzLCAmcHJvcF9kZXNjcl94Z3Bvbl90cnhfY2ZnX2VkX3N0YXRlLCAmcHJvcF9kZXNjcl94Z3Bvbl90cnhfY2ZnX2ludmVydF9lZCwgJnByb3BfZGVzY3JfeGdwb25fdHJ4X2NmZ19lbmRfb2ZfYnVyc3RfcmVzZXQsICZwcm9wX2Rlc2NyX3hncG9uX3RyeF9jZmdfdHJ4X3JzdF9wb2xhcml0eSB9Oworc3RhdGljIGJjbWNsaV9maWVsZF9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhX2ZpZWxkc1tdID0geyB7IC5uYW1lID0gImJ1cnN0X3Byb2ZpbGUiLCAuZGVzY3IgPSAiYnVyc3QgcHJvZmlsZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhLCBidXJzdF9wcm9maWxlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX3hncG9uX2J1cnN0X3Byb2ZpbGVfNCB9LCB7IC5uYW1lID0gInRyYW5zY2VpdmVyX2NvbmZpZyIsIC5kZXNjciA9ICJ0cmFuc2NlaXZlciBjb25maWciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSwgdHJhbnNjZWl2ZXJfY29uZmlnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfYXJyX3hncG9uX3RyeF9jb25maWd1cmF0aW9uXzQgfSwgeyAubmFtZSA9ICJ0cmFuc2NlaXZlcl90eXBlIiwgLmRlc2NyID0gInRyeCB0eXBlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGEsIHRyYW5zY2VpdmVyX3R5cGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl90cnhfdHlwZSB9LCB7IC5uYW1lID0gImRlYnVnIiwgLmRlc2NyID0gImRlYnVnIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGEsIGRlYnVnKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fdHJ4X2RlYnVnIH0sIHsgLm5hbWUgPSAicnNzaV9ub3JtYWxfY29uZmlnIiwgLmRlc2NyID0gInJzc2kgbm9ybWFsIGNvbmZpZyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhLCByc3NpX25vcm1hbF9jb25maWcpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9yc3NpX25vcm1hbF9jb25maWcgfSwgeyAubmFtZSA9ICJyc3NpX3JhbmdpbmdfY29uZmlnIiwgLmRlc2NyID0gInJzc2kgcmFuZ2luZyBjb25maWciLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSwgcnNzaV9yYW5naW5nX2NvbmZpZyksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3Jzc2lfcmFuZ2luZ19jb25maWcgfSwgeyAubmFtZSA9ICJzZXJkZXNfY29uZmlndXJhdGlvbiIsIC5kZXNjciA9ICJzZXJkZXMgY29uZmlndXJhdGlvbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhLCBzZXJkZXNfY29uZmlndXJhdGlvbiksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3NlcmRlc19jb25maWd1cmF0aW9uIH0sIHsgLm5hbWUgPSAiYnVyc3RfcHJvZmlsZV9kZWxpbWl0ZXJfbWF4X2Vycm9ycyIsIC5kZXNjciA9ICJidXJzdCBwcm9maWxlIGRlbGltaXRlciBtYXggZXJyb3JzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGEsIGJ1cnN0X3Byb2ZpbGVfZGVsaW1pdGVyX21heF9lcnJvcnMpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9hcnJfdThfNCB9LCB7IC5uYW1lID0gInJhbmdpbmdfc21fcGF0dGVybnNfYXRfaW5pdCIsIC5kZXNjciA9ICJSZXNldCBwYXR0ZXJucyB1c2VkIGF0IEluaXQgb2YgUmFuZ2luZy1XaW5kb3cgYW5kIGFmdGVyIEFjY2VzcyIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhLCByYW5naW5nX3NtX3BhdHRlcm5zX2F0X2luaXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9yeF9yYW5naW5nX3NtX3BhdHRlcm4gfSwgeyAubmFtZSA9ICJyYW5naW5nX3NtX3BhdHRlcm5zX2VkX2ZhaWx1cmUiLCAuZGVzY3IgPSAicmFuZ2luZyBzbSBwYXR0ZXJucyBFRCBmYWlsdXJlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGEsIHJhbmdpbmdfc21fcGF0dGVybnNfZWRfZmFpbHVyZSksIC50eXBlID0gJnR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3J4X3Jhbmdpbmdfc21fcGF0dGVybiB9LCB7IC5uYW1lID0gInJlc2V0X29uX2RlbF9taXNzIiwgLmRlc2NyID0gInJlc2V0IG9uIGRlbCBtaXNzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGEsIHJlc2V0X29uX2RlbF9taXNzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiZWRfc3RhdGUiLCAuZGVzY3IgPSAiZWQgc3RhdGUiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSwgZWRfc3RhdGUpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF94Z3Bvbl9lZF9zdGF0ZSB9LCB7IC5uYW1lID0gImludmVydF9lZCIsIC5kZXNjciA9ICJpbnZlcnQgRUQiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSwgaW52ZXJ0X2VkKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0sIHsgLm5hbWUgPSAiZW5kX29mX2J1cnN0X3Jlc2V0IiwgLmRlc2NyID0gImVuZCBvZiBidXJzdCByZXNldCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhLCBlbmRfb2ZfYnVyc3RfcmVzZXQpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9zX2Jvb2wgfSwgeyAubmFtZSA9ICJ0cnhfcnN0X3BvbGFyaXR5IiwgLmRlc2NyID0gIlRSWCByZXNldCBwb2xhcml0eSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhLCB0cnhfcnN0X3BvbGFyaXR5KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vc19ib29sIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhIiwgLmRlc2NyID0gImNmZyIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl90cnhfY2ZnX2RhdGEpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeGdwb25fdHJ4X2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YV9maWVsZHMgfSB9IH07CisKKy8qID09PT0gT2JqZWN0OiB4cG9uX3NlcmRlcyA9PT09ICovCisKKy8qIEdyb3VwOiB4cG9uX3NlcmRlcyAtIGtleSAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hwb25fc2VyZGVzX2tleV9wb25fbmkgPSB7IC5uYW1lID0gInBvbl9uaSIsIC5kZXNjciA9ICJQT04gTkkiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWFBPTl9TRVJERVNfS0VZX0lEX1BPTl9OSSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94cG9uX3NlcmRlc19rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hwb25fc2VyZGVzX2tleV9pbnN0YW5jZSA9IHsgLm5hbWUgPSAiaW5zdGFuY2UiLCAuZGVzY3IgPSAiSW5zdGFuY2UiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWFBPTl9TRVJERVNfS0VZX0lEX0lOU1RBTkNFLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hwb25fc2VyZGVzX2tleSwgaW5zdGFuY2UpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2JjbW9sdF9zZXJkZXNfaW5zdGFuY2UgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4cG9uX3NlcmRlc19rZXlfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94cG9uX3NlcmRlc19rZXlfcG9uX25pLCAmcHJvcF9kZXNjcl94cG9uX3NlcmRlc19rZXlfaW5zdGFuY2UgfTsKK3N0YXRpYyBiY21jbGlfZmllbGRfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hwb25fc2VyZGVzX2tleV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJwb25fbmkiLCAuZGVzY3IgPSAiUE9OIE5JIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94cG9uX3NlcmRlc19rZXksIHBvbl9uaSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gImluc3RhbmNlIiwgLmRlc2NyID0gIkluc3RhbmNlIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94cG9uX3NlcmRlc19rZXksIGluc3RhbmNlKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9iY21vbHRfc2VyZGVzX2luc3RhbmNlIH0gfTsKK3N0YXRpYyBiY21jbGlfdHlwZV9kZXNjciBCQ01fREVTQ1IgdHlwZV9kZXNjcl9iY21vbHRfeHBvbl9zZXJkZXNfa2V5ID0geyAubmFtZSA9ICJiY21vbHRfeHBvbl9zZXJkZXNfa2V5IiwgLmRlc2NyID0gImtleSIsIC5zaXplID0gc2l6ZW9mKGJjbW9sdF94cG9uX3NlcmRlc19rZXkpLCAuYmFzZV90eXBlID0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QsIC54ID0geyAucyA9IHsgLm51bV9maWVsZHMgPSBzaXplb2YodHlwZV9kZXNjcl9iY21vbHRfeHBvbl9zZXJkZXNfa2V5X2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hwb25fc2VyZGVzX2tleV9maWVsZHMgfSB9IH07CisKKy8qIEdyb3VwOiB4cG9uX3NlcmRlcyAtIGNmZyAqLworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hwb25fc2VyZGVzX2NmZ19yeF92Z2EgPSB7IC5uYW1lID0gInJ4X3ZnYSIsIC5kZXNjciA9ICJSeCBWZ2EiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX1ZHQSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YSwgcnhfdmdhKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeHBvbl9zZXJkZXNfY2ZnX3J4X3BmID0geyAubmFtZSA9ICJyeF9wZiIsIC5kZXNjciA9ICJQZWFraW5nIEZpbHRlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfUEYsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGEsIHJ4X3BmKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeHBvbl9zZXJkZXNfY2ZnX3J4X2xmcGYgPSB7IC5uYW1lID0gInJ4X2xmcGYiLCAuZGVzY3IgPSAiTG93IEZyZXF1ZW5jeSBQZWFraW5nIEZpbHRlciIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfUlhfTEZQRiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YSwgcnhfbGZwZiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hwb25fc2VyZGVzX2NmZ19yeF9kZmUxID0geyAubmFtZSA9ICJyeF9kZmUxIiwgLmRlc2NyID0gIlJ4IERGRTEiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1JYX0RGRTEsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGEsIHJ4X2RmZTEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94cG9uX3NlcmRlc19jZmdfcnhfZGZlMiA9IHsgLm5hbWUgPSAicnhfZGZlMiIsIC5kZXNjciA9ICJSeCBERkUyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkUyLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhLCByeF9kZmUyKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9pbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94cG9uX3NlcmRlc19jZmdfcnhfZGZlMyA9IHsgLm5hbWUgPSAicnhfZGZlMyIsIC5kZXNjciA9ICJSeCBERkUzIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkUzLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhLCByeF9kZmUzKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9pbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94cG9uX3NlcmRlc19jZmdfcnhfZGZlNCA9IHsgLm5hbWUgPSAicnhfZGZlNCIsIC5kZXNjciA9ICJSeCBERkU0IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkU0LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhLCByeF9kZmU0KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9pbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94cG9uX3NlcmRlc19jZmdfcnhfZGZlNSA9IHsgLm5hbWUgPSAicnhfZGZlNSIsIC5kZXNjciA9ICJSeCBERkU1IiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9SWF9ERkU1LCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhLCByeF9kZmU1KSwgLnR5cGUgPSAmdHlwZV9kZXNjcl9pbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94cG9uX3NlcmRlc19jZmdfdHhfcHJlID0geyAubmFtZSA9ICJ0eF9wcmUiLCAuZGVzY3IgPSAiVHggUHJlIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9QUkUsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGEsIHR4X3ByZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hwb25fc2VyZGVzX2NmZ190eF9tYWluID0geyAubmFtZSA9ICJ0eF9tYWluIiwgLmRlc2NyID0gIlR4IE1haW4iLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX01BSU4sIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGEsIHR4X21haW4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94cG9uX3NlcmRlc19jZmdfdHhfcG9zdDEgPSB7IC5uYW1lID0gInR4X3Bvc3QxIiwgLmRlc2NyID0gIlR4IFBvc3QxIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9QT1NUMSwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YSwgdHhfcG9zdDEpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciBCQ01fREVTQ1IgcHJvcF9kZXNjcl94cG9uX3NlcmRlc19jZmdfdHhfcG9zdDIgPSB7IC5uYW1lID0gInR4X3Bvc3QyIiwgLmRlc2NyID0gIlR4IFBvc3QyIiwgLmFjY2VzcyA9IEJDTU9MVF9QUk9QX0FDQ0VTU19JRF9SVywgLnByb3BlcnR5ID0gQkNNT0xUX1hQT05fU0VSREVTX0NGR19JRF9UWF9QT1NUMiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YSwgdHhfcG9zdDIpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX2ludDhfdCB9Oworc3RhdGljIGJjbWNsaV9wcm9wX2Rlc2NyIEJDTV9ERVNDUiBwcm9wX2Rlc2NyX3hwb25fc2VyZGVzX2NmZ190eF9wb3N0MyA9IHsgLm5hbWUgPSAidHhfcG9zdDMiLCAuZGVzY3IgPSAiVHggUG9zdDMiLCAuYWNjZXNzID0gQkNNT0xUX1BST1BfQUNDRVNTX0lEX1JXLCAucHJvcGVydHkgPSBCQ01PTFRfWFBPTl9TRVJERVNfQ0ZHX0lEX1RYX1BPU1QzLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhLCB0eF9wb3N0MyksIC50eXBlID0gJnR5cGVfZGVzY3JfaW50OF90IH07CitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgQkNNX0RFU0NSIHByb3BfZGVzY3JfeHBvbl9zZXJkZXNfY2ZnX3R4X2FtcCA9IHsgLm5hbWUgPSAidHhfYW1wIiwgLmRlc2NyID0gIlR4IEFtcCIsIC5hY2Nlc3MgPSBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcsIC5wcm9wZXJ0eSA9IEJDTU9MVF9YUE9OX1NFUkRFU19DRkdfSURfVFhfQU1QLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhLCB0eF9hbXApLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfTsKK3N0YXRpYyBiY21jbGlfcHJvcF9kZXNjciAqIEJDTV9ERVNDUiB4cG9uX3NlcmRlc19jZmdfcHJvcF9hcnJheVtdID0geyAmcHJvcF9kZXNjcl94cG9uX3NlcmRlc19jZmdfcnhfdmdhLCAmcHJvcF9kZXNjcl94cG9uX3NlcmRlc19jZmdfcnhfcGYsICZwcm9wX2Rlc2NyX3hwb25fc2VyZGVzX2NmZ19yeF9sZnBmLCAmcHJvcF9kZXNjcl94cG9uX3NlcmRlc19jZmdfcnhfZGZlMSwgJnByb3BfZGVzY3JfeHBvbl9zZXJkZXNfY2ZnX3J4X2RmZTIsICZwcm9wX2Rlc2NyX3hwb25fc2VyZGVzX2NmZ19yeF9kZmUzLCAmcHJvcF9kZXNjcl94cG9uX3NlcmRlc19jZmdfcnhfZGZlNCwgJnByb3BfZGVzY3JfeHBvbl9zZXJkZXNfY2ZnX3J4X2RmZTUsICZwcm9wX2Rlc2NyX3hwb25fc2VyZGVzX2NmZ190eF9wcmUsICZwcm9wX2Rlc2NyX3hwb25fc2VyZGVzX2NmZ190eF9tYWluLCAmcHJvcF9kZXNjcl94cG9uX3NlcmRlc19jZmdfdHhfcG9zdDEsICZwcm9wX2Rlc2NyX3hwb25fc2VyZGVzX2NmZ190eF9wb3N0MiwgJnByb3BfZGVzY3JfeHBvbl9zZXJkZXNfY2ZnX3R4X3Bvc3QzLCAmcHJvcF9kZXNjcl94cG9uX3NlcmRlc19jZmdfdHhfYW1wIH07CitzdGF0aWMgYmNtY2xpX2ZpZWxkX2Rlc2NyIEJDTV9ERVNDUiB0eXBlX2Rlc2NyX2JjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YV9maWVsZHNbXSA9IHsgeyAubmFtZSA9ICJyeF92Z2EiLCAuZGVzY3IgPSAiUnggVmdhIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YSwgcnhfdmdhKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAicnhfcGYiLCAuZGVzY3IgPSAiUGVha2luZyBGaWx0ZXIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhLCByeF9wZiksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInJ4X2xmcGYiLCAuZGVzY3IgPSAiTG93IEZyZXF1ZW5jeSBQZWFraW5nIEZpbHRlciIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGEsIHJ4X2xmcGYpLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJyeF9kZmUxIiwgLmRlc2NyID0gIlJ4IERGRTEiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhLCByeF9kZmUxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAicnhfZGZlMiIsIC5kZXNjciA9ICJSeCBERkUyIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YSwgcnhfZGZlMiksIC50eXBlID0gJnR5cGVfZGVzY3JfaW50OF90IH0sIHsgLm5hbWUgPSAicnhfZGZlMyIsIC5kZXNjciA9ICJSeCBERkUzIiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YSwgcnhfZGZlMyksIC50eXBlID0gJnR5cGVfZGVzY3JfaW50OF90IH0sIHsgLm5hbWUgPSAicnhfZGZlNCIsIC5kZXNjciA9ICJSeCBERkU0IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YSwgcnhfZGZlNCksIC50eXBlID0gJnR5cGVfZGVzY3JfaW50OF90IH0sIHsgLm5hbWUgPSAicnhfZGZlNSIsIC5kZXNjciA9ICJSeCBERkU1IiwgLm9mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YSwgcnhfZGZlNSksIC50eXBlID0gJnR5cGVfZGVzY3JfaW50OF90IH0sIHsgLm5hbWUgPSAidHhfcHJlIiwgLmRlc2NyID0gIlR4IFByZSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGEsIHR4X3ByZSksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9LCB7IC5uYW1lID0gInR4X21haW4iLCAuZGVzY3IgPSAiVHggTWFpbiIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGEsIHR4X21haW4pLCAudHlwZSA9ICZ0eXBlX2Rlc2NyX3VpbnQ4X3QgfSwgeyAubmFtZSA9ICJ0eF9wb3N0MSIsIC5kZXNjciA9ICJUeCBQb3N0MSIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGEsIHR4X3Bvc3QxKSwgLnR5cGUgPSAmdHlwZV9kZXNjcl91aW50OF90IH0sIHsgLm5hbWUgPSAidHhfcG9zdDIiLCAuZGVzY3IgPSAiVHggUG9zdDIiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhLCB0eF9wb3N0MiksIC50eXBlID0gJnR5cGVfZGVzY3JfaW50OF90IH0sIHsgLm5hbWUgPSAidHhfcG9zdDMiLCAuZGVzY3IgPSAiVHggUG9zdDMiLCAub2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhLCB0eF9wb3N0MyksIC50eXBlID0gJnR5cGVfZGVzY3JfaW50OF90IH0sIHsgLm5hbWUgPSAidHhfYW1wIiwgLmRlc2NyID0gIlR4IEFtcCIsIC5vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGEsIHR4X2FtcCksIC50eXBlID0gJnR5cGVfZGVzY3JfdWludDhfdCB9IH07CitzdGF0aWMgYmNtY2xpX3R5cGVfZGVzY3IgQkNNX0RFU0NSIHR5cGVfZGVzY3JfYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhID0geyAubmFtZSA9ICJiY21vbHRfeHBvbl9zZXJkZXNfY2ZnX2RhdGEiLCAuZGVzY3IgPSAiY2ZnIiwgLnNpemUgPSBzaXplb2YoYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhKSwgLmJhc2VfdHlwZSA9IEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSVUNULCAueCA9IHsgLnMgPSB7IC5udW1fZmllbGRzID0gc2l6ZW9mKHR5cGVfZGVzY3JfYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhX2ZpZWxkcykgLyBzaXplb2YoYmNtY2xpX2ZpZWxkX2Rlc2NyKSwgLmZpZWxkcyA9IHR5cGVfZGVzY3JfYmNtb2x0X3hwb25fc2VyZGVzX2NmZ19kYXRhX2ZpZWxkcyB9IH0gfTsKKworLyogPT09PSBBUEkgSGVscGVyIEZ1bmN0aW9uIEltcGxlbWVudGF0aW9ucyA9PT09ICovCitiY21vc19lcnJubyBhcGlfY2xpX29iamVjdF9zdHJ1Y3Rfc2l6ZShiY21vbHRfb2JqX2lkIG9iaiwgYmNtb2x0X21ndF9ncm91cCBncm91cCwgdWludDE2X3Qgc3ViZ3JvdXAsIHVpbnQzMl90ICprZXlfc2l6ZSwgdWludDMyX3QgKmtleV9vZmZzZXQsIHVpbnQzMl90ICpkYXRhX3NpemUsIHVpbnQzMl90ICpkYXRhX29mZnNldCkKK3sKKyAgICBpZiAoKChrZXlfc2l6ZSA9PSBOVUxMKSB8fCAoa2V5X29mZnNldCA9PSBOVUxMKSkgfHwgKChkYXRhX3NpemUgPT0gTlVMTCkgfHwgKGRhdGFfb2Zmc2V0ID09IE5VTEwpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIHN3aXRjaCAob2JqKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0FFX05JOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX25pX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9uaV9jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX25pX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfTklfT1BFUl9JRF9TRVRfQUVfTklfRU5fU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX25pX3NldF9hZV9uaV9lbl9zdGF0ZSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfQUVfUEFUSF9EUzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfcGF0aF9kc19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX2RzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX2RzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfZHNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfZHNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfZHNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX2RzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX2RzX2F1dG9fY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9BRV9QQVRIX1VTOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9hZV9wYXRoX3VzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfdXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfdXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfcGF0aF91c19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfcGF0aF91c19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9yYWlzZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfYWVfcGF0aF91c19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfdXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9hZV9wYXRoX3VzX2F1dG9fY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0NIQU5ORUw6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2NoYW5uZWxfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfY2hhbm5lbF9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9jaGFubmVsX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfY2hhbm5lbF9jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfY2hhbm5lbF9jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2NoYW5uZWxfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9ERUJVRzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZGVidWdfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZGVidWdfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZGVidWdfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZGVidWdfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFQlVHX0FVVE9fSURfQ0xJX09VVFBVVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2RlYnVnX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGVidWdfY2xpX291dHB1dCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFQlVHX0FVVE9fSURfRklMRV9BTE1PU1RfRlVMTDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2RlYnVnX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGVidWdfZmlsZV9hbG1vc3RfZnVsbCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZWJ1Z19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RlYnVnX2F1dG9fY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2RlYnVnX2F1dG9fY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19hdXRvX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVCVUdfT1BFUl9JRF9DTElfSU5QVVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZWJ1Z19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RlYnVnX2NsaV9pbnB1dCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZWJ1Z19jbGlfaW5wdXRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RlYnVnX2NsaV9pbnB1dCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERUJVR19PUEVSX0lEX1NUQVJUX0FQSV9DQVBUVVJFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZGVidWdfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19zdGFydF9hcGlfY2FwdHVyZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVCVUdfT1BFUl9JRF9TVE9QX0FQSV9DQVBUVVJFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZGVidWdfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19zdG9wX2FwaV9jYXB0dXJlLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERUJVR19PUEVSX0lEX1JFU0VUX0FQSV9DQVBUVVJFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZGVidWdfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZWJ1Z19yZXNldF9hcGlfY2FwdHVyZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0RFVklDRToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2Vfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9BVVRPX0lEX0RFVklDRV9SRUFEWToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9kZXZpY2VfcmVhZHksIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9DT05ORUNUSU9OX0VTVEFCTElTSEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZXN0YWJsaXNoZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9BVVRPX0lEX0RFVklDRV9LRUVQX0FMSVZFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9BVVRPX0lEX0NPTk5FQ1RJT05fRkFJTFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2ZhaWx1cmUsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZmFpbHVyZSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9DT05ORUNUSU9OX0NPTVBMRVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGUsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9BVVRPX0lEX0RJU0NPTk5FQ1RJT05fQ09NUExFVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2Vfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfZGlzY29ubmVjdGlvbl9jb21wbGV0ZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0FVVE9fSURfU1dfRVJST1I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2Vfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3IsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX3N3X2Vycm9yX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2Vfc3dfZXJyb3IsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0FVVE9fSURfU1dfRVhDRVBUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX3N3X2V4Y2VwdGlvbiwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2Vfc3dfZXhjZXB0aW9uLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9BVVRPX0lEX0lORElDQVRJT05TX0RST1BQRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2Vfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2luZGljYXRpb25zX2Ryb3BwZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0FVVE9fSURfSU1BR0VfVFJBTlNGRVJfQ09NUExFVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2Vfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGUsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGUsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0FVVE9fSURfRERSX1RFU1RfQ09NUExFVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2Vfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGUsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfZGRyX3Rlc3RfY29tcGxldGUsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2Vfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfYXV0b19jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2F1dG9fY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfYXV0b19jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9PUEVSX0lEX0NPTk5FQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2Vfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfY29ubmVjdCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX09QRVJfSURfRElTQ09OTkVDVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9kaXNjb25uZWN0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9SRVNFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9yZXNldCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2VfcmVzZXRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9yZXNldCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9IT1NUX0tFRVBfQUxJVkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2Vfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmVfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9ob3N0X2tlZXBfYWxpdmUsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX09QRVJfSURfU1dfVVBHUkFERV9BQ1RJVkFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9zd191cGdyYWRlX2FjdGl2YXRlLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9JTUFHRV9UUkFOU0ZFUl9TVEFSVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9zdGFydCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9JTUFHRV9UUkFOU0ZFUl9EQVRBOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGEsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9PUEVSX0lEX1JVTl9ERFJfVEVTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2RldmljZV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2RldmljZV9ydW5fZGRyX3Rlc3QsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfRVBPTl9ERU5JRURfTElOSzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19JRF9VTktOT1dOX0xJTktfVklPTEFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbiwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb25fZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbiwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fSURfT1ZFUkhFQURfUFJPRklMRV9WSU9MQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19vdmVyaGVhZF9wcm9maWxlX3Zpb2xhdGlvbiwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX292ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19JRF9MQVNFUl9PTl9PRkZfVklPTEFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbiwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25fZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbiwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fSURfTUFYX0xJTktfVklPTEFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbiwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fSURfTExJRF9QT09MX0VNUFRZX1ZJT0xBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb24sIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb24sIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX1NZU1RFTV9SRVNPVVJDRV9WSU9MQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19JRF9SQU5HRV9WSU9MQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb24sIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yYW5nZV92aW9sYXRpb25fZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19JRF9URE1fQ0hBTk5FTFNfRVhIQVVTVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfdGRtX2NoYW5uZWxzX2V4aGF1c3RlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fSURfUk9HVUVfVklPTEFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbiwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fSURfVVBTVFJFQU1fQkFORFdJRFRIX1ZJT0xBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb24sIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb24sIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2F1dG9fY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX0xJTks6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0MToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX3N0YXRfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX0tFWV9FWENIQU5HRV9GQUlMVVJFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX0VOQ1JZUFRJT05fRU5BQkxFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19lbmNyeXB0aW9uX2VuYWJsZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX01QQ1BfUkVHX0FDS19USU1FT1VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX21wY3BfcmVnX2Fja190aW1lb3V0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9SQU5HRV9WQUxVRV9DSEFOR0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX1BST1RFQ1RJT05fU1dJVENIX09DQ1VSUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19wcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX0RVUExJQ0FURV9NUENQX1JFR0lTVFJBVElPTl9SRVFVRVNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX0xJTktfU1BFRURfTUlTTUFUQ0g6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2gsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfTVBDUF9SRVBPUlRfVElNRU9VVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19tcGNwX3JlcG9ydF90aW1lb3V0X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9PQU1fS0VFUEFMSVZFX1RJTUVPVVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVvdXQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfTVBDUF9ESVNDT1ZFUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX01QQ1BfREVSRUdJU1RFUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX21wY3BfZGVyZWdpc3RlcmVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9QUkVQUk9WSVNJT05FRF9MSU5LX0NSRUFURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19wcmVwcm92aXNpb25lZF9saW5rX2NyZWF0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfT0FNX0tFRVBBTElWRV9USU1FUl9TVEFSVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfT0FNX0tFRVBBTElWRV9USU1FUl9TVE9QUEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcHBlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfS0VZX0VYQ0hBTkdFX1NUQVJURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX0tFWV9FWENIQU5HRV9TVE9QUEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdG9wcGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9TVEFUSUNfUkVHSVNUUkFUSU9OX0RPTkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9SRVJBTkdFX0ZBSUxVUkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfcmVyYW5nZV9mYWlsdXJlLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9MSU5LX0RFTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfbGlua19kZWxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX2NsZWFyZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfYXV0b19jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19PUEVSX0lEX0ZPUkNFX1JFRElTQ09WRVJZOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2ZvcmNlX3JlZGlzY292ZXJ5LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9ERUxFVEVfTElOSzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19kZWxldGVfbGluaywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX09QRVJfSURfT0FNX0tFRVBBTElWRV9USU1FUl9TVEFSVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0YXJ0X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9PQU1fS0VFUEFMSVZFX1RJTUVSX1NUT1A6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9LRVlfRVhDSEFOR0VfU1RBUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0YXJ0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX09QRVJfSURfS0VZX0VYQ0hBTkdFX1NUT1A6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3AsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19PUEVSX0lEX1NUQVRJQ19SRUdJU1RSQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbiwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfc3RhdGljX3JlZ2lzdHJhdGlvbl9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb24sIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1BST1hZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfUFJPWFlfSURfSU5KRUNUX0ZSQU1FOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9QUk9YWV9SWDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1BST1hZX1JYX0lEX0ZSQU1FX0NBUFRVUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX05JOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9BVVRPX0lEX05PX1JFUE9SVFM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfbm9fcmVwb3J0c19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfQVVUT19JRF9MTElEX1FVQVJBTlRJTkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2xsaWRfcXVhcmFudGluZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfbGxpZF9xdWFyYW50aW5lZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9BVVRPX0lEX1JFUkFOR0VfRkFJTFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX3JlcmFuZ2VfZmFpbHVyZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9BVVRPX0lEX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfT05VX1VQR1JBREVfQ09NUExFVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfQVVUT19JRF9ST0dVRV9TQ0FOX0NPTVBMRVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfTVBDUF9USU1FU1RBTVBfQ0hBTkdFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX21wY3BfdGltZXN0YW1wX2NoYW5nZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX21wY3BfdGltZXN0YW1wX2NoYW5nZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9BVVRPX0lEX0FVVE9fUk9HVUVfU0NBTl8xR19GQUlMVVJFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzFnX2ZhaWx1cmUsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfQVVUT19JRF9BVVRPX1JPR1VFX1NDQU5fMTBHX0ZBSUxVUkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmUsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYXV0b19jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9hdXRvX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX1NFVF9FUE9OX05JX0VOX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGUsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX09QRVJfSURfSVNTVUVfUlNTSV9HUkFOVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX0FERF9MSU5LOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYWRkX2xpbmssIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9hZGRfbGlua19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9hZGRfbGluaywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX09QRVJfSURfQUREX01VTFRJQ0FTVF9MSU5LOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2FkZF9tdWx0aWNhc3RfbGluaywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX09QRVJfSURfQUREX1BST1RFQ1RFRF9TVEFOREJZX0xJTks6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGluaywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9QUk9URUNUSU9OX1NXSVRDSElOR19BUFBMWV9SRVJBTkdFX0RFTFRBOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGFfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX09QRVJfSURfUk9HVUVfTExJRF9TQ0FOOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fbmlfcm9ndWVfbGxpZF9zY2FuX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2NhbiwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX09QRVJfSURfU1RBUlRfT05VX1VQR1JBREU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9uaV9zdGFydF9vbnVfdXBncmFkZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX25pX3N0YXJ0X29udV91cGdyYWRlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xMEdfVVM6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfc3RhdF9jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzEwR19VU19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzEwR19VU19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xMGdfdXNfYXV0b19jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMUdfVVM6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xZ191c19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xZ191c19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fb251XzFnX3VzX2F1dG9fY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX0RTOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19EU19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2FsYXJtX3JhaXNlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX2F1dG9fY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfYXV0b19jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfVVM6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfRFM6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19zdGF0X2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfVVM6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX3JhaXNlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2F1dG9fY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0VQT05fUlA6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2Vwb25fcnBfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9ycF9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9lcG9uX3JwX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZXBvbl9ycF9jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZXBvbl9ycF9jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2Vwb25fcnBfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUElPOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncGlvX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwaW9fa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bpb19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwaW9fY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwaW9fY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncGlvX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2Nfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2Nfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19JRF9HRVRfQUxMT0NfU1RBVFNfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19hdXRvX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9BTExPQ19PUEVSX0lEX1NFVF9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2Nfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX3NldF9zdGF0ZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGUsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9BTExPQ19PUEVSX0lEX0dFVF9TVEFUUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fYWxsb2Nfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0cywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9hbGxvY19nZXRfc3RhdHMsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQ6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9BVVRPX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfYXV0b19jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9PUEVSX0lEX1NFVF9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGUsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fSVdGOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2Zfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX3N0YXRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3N0YXQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3N0YXRfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX3N0YXRfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfQVVUT19JRF9GTFVTSF9NQUNfVEFCTEVfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2Zfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9BVVRPX0lEX1NDQU5fTUFDX1RBQkxFX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2FsYXJtX3JhaXNlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2Zfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9hdXRvX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfYXV0b19jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX09QRVJfSURfRkxVU0hfTUFDX1RBQkxFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2Zfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGUsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGUsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfT1BFUl9JRF9TQ0FOX01BQ19UQUJMRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGUsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9EU19FR1JFU1NfRkxPVzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fSVdGX0RTX0lOR1JFU1NfRkxPVzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fSVdGX01BQ19UQUJMRToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0lEX05FV19NQUM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hYywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWMsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fSURfTUFDX0FHRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2FnZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0lEX01BQ19NT1ZFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfbW92ZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0lEX01BQ19EUk9QUEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9VU19GTE9XOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9OSToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX0xPUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2xvcywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2xvc19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9sb3MsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX1NFUklBTF9OVU1CRVJfQUNRVUlTSVRJT05fQ1lDTEVfU1RBUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19PTlVTX1JBTkdFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9PTlVfRElTQ09WRVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX29udV9kaXNjb3ZlcmVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX0NQVV9QQUNLRVRTX0ZBSUxVUkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfREVBQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX0RJU0FCTEVfQUxMX09OVVNfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9BQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9FTkFCTEVfQUxMX09OVVNfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX1RPRF9SRVFVRVNUX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX09OVV9VUEdSQURFX0NPTVBMRVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGUsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfUk9HVUVfT05VX1NQRUNJQUxfTUFQX0NZQ0xFX1NUQVJUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfYXV0b19jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9hdXRvX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1NFVF9QT05fU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zZXRfcG9uX3N0YXRlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9SRVNFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3Jlc2V0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX09QRVJfSURfRElTQUJMRV9TRVJJQUxfTlVNQkVSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlciwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX09QRVJfSURfU0lOR0xFX1JFUVVFU1RfU1RBTkRCWV9QT05fTU9OSVRPUklORzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9TRVRfT05VX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX09QRVJfSURfUk9HVUVfREVURUNUSU9OX1dJTkRPVzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3csIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3csIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1RPRF9SRVFVRVNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3QsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9QUk9URUNUSU9OX1NXSVRDSElOR19UWVBFX0NfU0VUX01VTFRJUExFX09OVV9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGUsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1NUQVJUX09OVV9VUEdSQURFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fbmlfc3RhcnRfb251X3VwZ3JhZGUsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfUFJPWFlfSURfQ1BVX1BBQ0tFVFM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0cywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2NwdV9wYWNrZXRzLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfUFJPWFlfSURfQlJPQURDQVNUX1BMT0FNX1BBQ0tFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fT05VOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3N0YXRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N0YXQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT05VX0FMQVJNOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm0sIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbnVfYWxhcm0sIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9ET1dJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9kb3dpLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2Rvd2lfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2Rvd2ksIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9TRkk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3NmaSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9zZmlfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3NmaSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1NESToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc2RpLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3NkaV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc2RpLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfREZJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9kZmksIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfZGZpX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9kZmksIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9TVUZJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdWZpLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3N1ZmlfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N1ZmksIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9MT0FJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9sb2FpLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2xvYWlfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2xvYWksIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9ER0k6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2RnaSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9kZ2lfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2RnaSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1BFRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcGVlLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3BlZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcGVlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfUFNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9wc3QsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfcHN0X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9wc3QsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9USVdJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV90aXdpLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3Rpd2lfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3Rpd2ksIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9MT0tJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9sb2tpLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2xva2lfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2xva2ksIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9NRU1JOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9tZW1pLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X21lbWlfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X21lbWksIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9PTUNJX1BPUlRfSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0JFUl9JTlRFUlZBTF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfRVJSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9lcnIsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfZXJyX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9lcnIsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9SRUk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3JlaSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9yZWlfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3JlaSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1JBTkdJTkdfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX09OVV9FTkFCTEVfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9PTlVfRElTQUJMRV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0lOVkFMSURfREJSVV9SRVBPUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0tFWV9FWENIQU5HRV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0tFWV9FWENIQU5HRV9LRVlfUkVRVUVTVF9USU1FT1VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfQ1lDTEVfU0tJUFBFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfS0VZX0VYQ0hBTkdFX0tFWV9NSVNNQVRDSDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfS0VZX0VYQ0hBTkdFX1VOQ09OU0VDVVRJVkVfSU5ERVg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfREVDUllQVF9SRVFVSVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT1BUSUNBTF9SRUZMRUNUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb24sIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT05VX0FDVElWQVRJT05fU1RBTkRCWV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9QT1NTSUJMRV9EUklGVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3Bvc3NpYmxlX2RyaWZ0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9hdXRvX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfYXV0b19jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX09QRVJfSURfU0VUX09OVV9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfc2V0X29udV9zdGF0ZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX09QRVJfSURfUlNTSV9NRUFTVVJFTUVOVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfT1BFUl9JRF9DSEFOR0VfUE9XRVJfTEVWRUw6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1BST1hZX0lEX0NQVV9QQUNLRVRTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0cywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0c19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldHMsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfUFJPWFlfSURfUExPQU1fUEFDS0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfcGxvYW1fcGFja2V0X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1BST1hZX1JYOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9QUk9YWV9SWF9JRF9DUFVfUEFDS0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfZ3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfUFJPWFlfUlhfSURfT01DSV9QQUNLRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fb251X29tY2lfcGFja2V0X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ncG9uX29udV9vbWNpX3BhY2tldCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9UUlg6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fdHJ4X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fdHJ4X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fdHJ4X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2dwb25fdHJ4X2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfZ3Bvbl90cnhfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9MT0dfRU5UUlk6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2xvZ19lbnRyeV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dfZW50cnlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nX2VudHJ5X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dfZW50cnlfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dfZW50cnlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfc3RhdCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dfZW50cnlfc3RhdF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X3N0YXQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dfZW50cnlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dfZW50cnlfc3RhdF9jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0xPR19FTlRSWV9BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nX2VudHJ5X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0xPR19FTlRSWV9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2xvZ19lbnRyeV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fY2xlYXJlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2xvZ19lbnRyeV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dfZW50cnlfYXV0b19jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ19lbnRyeV9hdXRvX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfTE9HR0VSOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dnZXJfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nZ2VyX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2xvZ2dlcl9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nZ2VyX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nZ2VyX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nZ2VyX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nZ2VyX3N0YXQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nZ2VyX3N0YXRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9zdGF0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nZ2VyX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbG9nZ2VyX3N0YXRfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dHRVJfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2xvZ2dlcl9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dHRVJfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dnZXJfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dnZXJfc3RhdF9hbGFybV9jbGVhcmVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX2NsZWFyZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9sb2dnZXJfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dnZXJfYXV0b19jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9sb2dnZXJfYXV0b19jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0xPR0dFUl9PUEVSX0lEX0NMRUFSX0xPRzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X2xvZ2dlcl9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X2xvZ2dlcl9jbGVhcl9sb2csIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9OTkk6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X25uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfbm5pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfc3RhdF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0MToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0NDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0NzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1MDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDUyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1MzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1NjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDYxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2MjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X25uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfc3RhdF9jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zdGF0X2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX0FVVE9fSURfU1RBVFVTX0NIQU5HRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdHVzX2NoYW5nZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfbm5pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9hbGFybV9yYWlzZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfbm5pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc3RhdF9hbGFybV9jbGVhcmVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfbm5pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX2F1dG9fY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X25uaV9hdXRvX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfbm5pX2F1dG9fY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9OTklfU0VSREVTOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF9ubmlfc2VyZGVzX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X25uaV9zZXJkZXNfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfbm5pX3NlcmRlc19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X25uaV9zZXJkZXNfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X25uaV9zZXJkZXNfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF9ubmlfc2VyZGVzX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfU09GVFdBUkVfRVJST1I6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfc29mdHdhcmVfZXJyb3JfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9UUlhfQ0FMSUJSQVRJT046CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9BVVRPX0lEX0NBUFRVUkVfV0lORE9XX0FORF9TVEFUSVNUSUNfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2NhcHR1cmVfd2luZG93X2FuZF9zdGF0aXN0aWNfY29tcGxldGVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fT1BFUl9JRF9TVEFSVF9DQVBUVVJFX1dJTkRPVzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvdywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvdywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fT1BFUl9JRF9TVE9QX0NBUFRVUkVfV0lORE9XOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3csIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9zdG9wX2NhcHR1cmVfd2luZG93LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2NfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2Nfc3RhdCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9BTExPQ19BVVRPX0lEX0dFVF9BTExPQ19TVEFUU19DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9BTExPQ19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2FsbG9jX2F1dG9fY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9BTExPQ19PUEVSX0lEX0dFVF9TVEFUUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2FsbG9jX2dldF9zdGF0c19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fYWxsb2NfZ2V0X3N0YXRzLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX0FMTE9DX09QRVJfSURfU0VUX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGUsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fYWxsb2Nfc2V0X3N0YXRlX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGUsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1hHUE9OX0dFTV9QT1JUOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfWEdQT05fSVdGOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9pd2Zfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25faXdmX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX2l3Zl9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX2l3Zl9jZmcsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25faXdmX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25faXdmX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfWEdQT05fTkk6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfc3RhdF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9TVEFURV9DSEFOR0VfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9MT1M6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2xvcywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9sb3NfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2xvcywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1NFUklBTF9OVU1CRVJfQUNRVUlTSVRJT05fQ1lDTEVfU1RBUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX09OVVNfUkFOR0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfU1RBTkRCWV9QT05fTU9OSVRPUklOR19DWUNMRV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX09OVV9ESVNDT1ZFUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfb251X2Rpc2NvdmVyZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9DUFVfUEFDS0VUU19GQUlMVVJFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmUsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9ST0dVRV9ERVRFQ1RJT05fQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9ERUFDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfRElTQUJMRV9BTExfT05VU19DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX0FDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX0VOQUJMRV9BTExfT05VU19DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfVE9EX1JFUVVFU1RfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9PTlVfVVBHUkFERV9DT01QTEVURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGUsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfUk9HVUVfT05VX1NQRUNJQUxfTUFQX0NZQ0xFX1NUQVJUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhdF9hbGFybV9jbGVhcmVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYXV0b19jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfU0VUX1BPTl9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfUkVTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3Jlc2V0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX0RJU0FCTEVfU0VSSUFMX05VTUJFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfU0lOR0xFX1JFUVVFU1RfU1RBTkRCWV9QT05fTU9OSVRPUklORzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9TRVRfT05VX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9zZXRfb251X3N0YXRlLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGUsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9SVU5fU1BFQ0lBTF9CV19NQVA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1JPR1VFX0RFVEVDVElPTl9XSU5ET1c6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3csIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvdywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1RPRF9SRVFVRVNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9TVEFSVF9PTlVfVVBHUkFERToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGUsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX3N0YXJ0X29udV91cGdyYWRlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfQURKVVNUX1RYX1dBVkVMRU5HVEg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1BST1hZX0lEX0NQVV9QQUNLRVRTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fbmlfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0cywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHMsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfUFJPWFlfSURfQlJPQURDQVNUX1BMT0FNX1BBQ0tFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX25pX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlU6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2NmZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfY2ZnLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9PTlVfQUxBUk06CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2FsYXJtLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1fZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm0sIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfRE9XSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9kb3dpLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9kb3dpX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfZG93aSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9TRkk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc2ZpLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zZmlfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zZmksIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfU0RJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3NkaSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfc2RpX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc2RpLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX0RGSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9kZmksIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2RmaV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2RmaSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9QUVNJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Bxc2ksIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3Bxc2lfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9wcXNpLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1NVRkk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc3VmaSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfc3VmaV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N1ZmksIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfVElXSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV90aXdpLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV90aXdpX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfdGl3aSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9MT09DSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9sb29jaSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2lfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9sb29jaSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9SQU5HSU5HX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9PTlVfQUNUSVZBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT05VX0VOQUJMRV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT05VX0RJU0FCTEVfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX0lOVkFMSURfREJSVV9SRVBPUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfS0VZX0VYQ0hBTkdFX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfS0VZX1JFUVVFU1RfVElNRU9VVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfS0VZX0VYQ0hBTkdFX0NZQ0xFX1NLSVBQRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0g6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2gsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT1BUSUNBTF9SRUZMRUNUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29wdGljYWxfcmVmbGVjdGlvbiwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfREdJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2RnaSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfZGdpX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfZGdpLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1BPU1NJQkxFX0RSSUZUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9wb3NzaWJsZV9kcmlmdF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1JFR0lTVFJBVElPTl9JRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9yZWdpc3RyYXRpb25faWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9QT1dFUl9MRVZFTF9SRVBPUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfbGV2ZWxfcmVwb3J0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9wb3dlcl9sZXZlbF9yZXBvcnQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfUE9XRVJfQ09OU1VNUFRJT05fUkVQT1JUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Bvd2VyX2NvbnN1bXB0aW9uX3JlcG9ydCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmUsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fZmFpbHVyZSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9PTlVfVFVOSU5HX09VVF9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9jb21wbGV0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT05VX1RVTklOR19JTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfVFVOSU5HX1JFU1BPTlNFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3R1bmluZ19yZXNwb25zZSwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfYXV0b19jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9hdXRvX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfU0VUX09OVV9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZSwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9SU1NJX01FQVNVUkVNRU5UOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX1JFUVVFU1RfUkVHSVNUUkFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3JlcXVlc3RfcmVnaXN0cmF0aW9uLCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX0NIQU5HRV9QT1dFUl9MRVZFTExJTkc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfR0VUX1BPV0VSX0xFVkVMOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2dldF9wb3dlcl9sZXZlbCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfR0VUX1BPV0VSX0NPTlNVTVBUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X2dldF9wb3dlcl9jb25zdW1wdGlvbiwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfQURKVVNUX1RYX1dBVkVMRU5HVEg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGgsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGgsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbiwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9PTlVfVFVOSU5HX0lOOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW4sIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX09OVV9UVU5JTkdfT1VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX291dF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0LCBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9QUk9YWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1BST1hZX0lEX1BMT0FNX1BBQ0tFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihiY21vbHRfeGdwb25fb251X3Bsb2FtX3BhY2tldCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfUFJPWFlfSURfQ1BVX1BBQ0tFVFM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHMsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHMsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1BST1hZX1JYOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfUFJPWFlfUlhfSURfQ1BVX1BBQ0tFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0LCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX29udV9jcHVfcGFja2V0X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfUFJPWFlfUlhfSURfT01DSV9QQUNLRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl9vbnVfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXQsIGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl9vbnVfb21jaV9wYWNrZXQsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1hHUE9OX1RSWDoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfc2l6ZSA9IHNpemVvZihiY21vbHRfeGdwb25fdHJ4X2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX3RyeF9rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94Z3Bvbl90cnhfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2V5X29mZnNldCA9IG9mZnNldG9mKGJjbW9sdF94Z3Bvbl90cnhfY2ZnLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX3NpemUgPSBzaXplb2YoYmNtb2x0X3hncG9uX3RyeF9jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hncG9uX3RyeF9jZmcsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94cG9uX3NlcmRlc19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94cG9uX3NlcmRlc19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmtleV9zaXplID0gc2l6ZW9mKGJjbW9sdF94cG9uX3NlcmRlc19rZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICprZXlfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hwb25fc2VyZGVzX2NmZywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gc2l6ZW9mKGJjbW9sdF94cG9uX3NlcmRlc19jZmdfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFfb2Zmc2V0ID0gb2Zmc2V0b2YoYmNtb2x0X3hwb25fc2VyZGVzX2NmZywgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7ICAgIC8qKjwgIHNob3VsZCBuZXZlciBoYXBwZW4uICovCit9CisKK2JjbW9zX2Vycm5vIGFwaV9jbGlfb2JqZWN0X3N1Ymdyb3VwX25hbWUoYmNtb2x0X29ial9pZCBvYmosIGJjbW9sdF9tZ3RfZ3JvdXAgZ3JvdXAsIHVpbnQxNl90IHN1Ymdyb3VwLCBjb25zdCBjaGFyICoqbmFtZSwgY29uc3QgY2hhciAqKmRlc2NyKQoreworICAgIHN3aXRjaCAob2JqKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0FFX05JOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX05JX09QRVJfSURfU0VUX0FFX05JX0VOX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzZXRfYWVfbmlfZW5fc3RhdGUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNldCB0aGUgQUUgTkkgZW5hYmxlIHN0YXRlLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfQUVfUEFUSF9EUzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJzdGF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJieXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBieXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzY0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY0IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfNjVfMTI3IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY1IHRvIDEyNyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzEyOF8yNTUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTI4IHRvIDI1NSBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzI1Nl81MTEiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMjU2IHRvIDUxMSBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzUxMl8xMDIzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDUxMiB0byAxMDIzIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfMTAyNF8xNTE4IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEwMjQgdG8gMTUxOCBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzE1MTlfMjA0NyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxNTE5IHRvIDIwNDcgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc18yMDQ4XzQwOTUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMjA0OCB0byA0MDk1IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzQwOTZfOTIxNiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA0MDk2IHRvIDkyMTYgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfOTIxN18xNjM4MyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA5MjE3IHRvIDE2MzgzIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYnJvYWRjYXN0X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBicm9hZGNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZGF0YV9ieXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAibXVsdGljYXN0X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBtdWx0aWNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidW5pY2FzdF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdW5pY2FzdCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJhYm9ydF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIk51bWJlciBvZiBhYm9ydCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaXMgbm8gbG9uZ2VyIG1ldC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImF1dG9fY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0FFX1BBVEhfVVM6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzY0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY0IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzY1XzEyNyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA2NSB0byAxMjcgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfMTI4XzI1NSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMjggdG8gMjU1IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzI1Nl81MTEiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMjU2IHRvIDUxMSBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc181MTJfMTAyMyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA1MTIgdG8gMTAyMyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc18xMDI0XzE1MTgiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTAyNCB0byAxNTE4IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzE1MTlfMjA0NyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxNTE5IHRvIDIwNDcgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfMjA0OF80MDk1IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDIwNDggdG8gNDA5NSBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfNDA5Nl85MjE2IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDQwOTYgdG8gOTIxNiBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfOTIxN18xNjM4MyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA5MjE3IHRvIDE2MzgzIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImJyb2FkY2FzdF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnJvYWRjYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJkYXRhX2J5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAibXVsdGljYXN0X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBtdWx0aWNhc3QgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInVuaWNhc3RfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHVuaWNhc3QgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImFib3J0X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBhYm9ydCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZmNzX2Vycm9yIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIGJhZCBGQ1MgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm92ZXJzaXplX2Vycm9yIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIG92ZXJzaXplIGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJydW50X2Vycm9yIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJ1bnQgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBpcyBubyBsb25nZXIgbWV0LiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYXV0b19jZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfQ0hBTk5FTDoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9ERUJVRzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERUJVR19BVVRPX0lEX0NMSV9PVVRQVVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNsaV9vdXRwdXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkNMSSBPdXRwdXQgU3RyaW5nIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFQlVHX0FVVE9fSURfRklMRV9BTE1PU1RfRlVMTDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZmlsZV9hbG1vc3RfZnVsbCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhpcyBpbmRpY2F0aW9uIGlzIHNlbnQgd2hlbiBERFIgbG9nIGZpbGUgaXMgNzUlIGZ1bGwiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImF1dG9fY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFQlVHX09QRVJfSURfQ0xJX0lOUFVUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjbGlfaW5wdXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkNMSSBJbnB1dCBTdHJpbmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVCVUdfT1BFUl9JRF9TVEFSVF9BUElfQ0FQVFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhcnRfYXBpX2NhcHR1cmUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlN0YXJ0IEFQSSBDYXB0dXJlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFQlVHX09QRVJfSURfU1RPUF9BUElfQ0FQVFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RvcF9hcGlfY2FwdHVyZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU3RvcCBBUEkgQ2FwdHVyZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERUJVR19PUEVSX0lEX1JFU0VUX0FQSV9DQVBUVVJFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyZXNldF9hcGlfY2FwdHVyZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVzZXQgQVBJIENhcHR1cmUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0RFVklDRToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9ERVZJQ0VfUkVBRFk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImRldmljZV9yZWFkeSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiRGV2aWNlIHJlYWR5IGluZGljYXRpb24gdXNlZCBieSB0aGUgZGV2aWNlIGNvbnRyb2wgbGlicmFyeSAobm90IHNlbnQgdG8gdGhlIGhvc3QgYXBwbGljYXRpb24pLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9DT05ORUNUSU9OX0VTVEFCTElTSEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjb25uZWN0aW9uX2VzdGFibGlzaGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJDb25uZWN0aW9uIGVzdGFibGlzaGVkIGluZGljYXRpb24gdXNlZCBieSB0aGUgZGV2aWNlIGNvbnRyb2wgbGlicmFyeSAobm90IHNlbnQgdG8gdGhlIGhvc3QgYXBwbGljYXRpb24pLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9ERVZJQ0VfS0VFUF9BTElWRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZGV2aWNlX2tlZXBfYWxpdmUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIktlZXAgYWxpdmUgbWVzc2FnZSBmcm9tIHRoZSBkZXZpY2UgdG8gdGhlIGhvc3QgLSB1c2VkIGJ5IHRoZSBkZXZpY2UgY29udHJvbCBsaWJyYXJ5IChub3Qgc2VudCB0byB0aGUgaG9zdCBhcHBsaWNhdGlvbikuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9BVVRPX0lEX0NPTk5FQ1RJT05fRkFJTFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY29ubmVjdGlvbl9mYWlsdXJlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgaG9zdCBmYWlsZWQgdG8gY29ubmVjdCB0byB0aGUgZGV2aWNlLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9DT05ORUNUSU9OX0NPTVBMRVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjb25uZWN0aW9uX2NvbXBsZXRlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgaG9zdCBzdWNjZXNzZnVsbHkgY29ubmVjdGVkIHRvIHRoZSBkZXZpY2UuICBUaGUgZGV2aWNlIGhhcyBlaXRoZXIgYmVlbiByZXByb2dyYW1tZWQgd2l0aCBuZXcgZmlybXdhcmUsIG9yIGEgY29ubmVjdGlvbiB3YXMgZXN0YWJsaXNoZWQgd2l0aCBhbiBleGlzdGluZyBkZXZpY2UgKHNlZSB0aGUgXCJzdGFuZGFsb25lXCIgZmllbGQpLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9ESVNDT05ORUNUSU9OX0NPTVBMRVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJkaXNjb25uZWN0aW9uX2NvbXBsZXRlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgaG9zdCBzdWNjZXNzZnVsbHkgZGlzY29ubmVjdGVkIGZyb20gdGhlIGRldmljZS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0FVVE9fSURfU1dfRVJST1I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN3X2Vycm9yIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJzdyBlcnJvciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9TV19FWENFUFRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN3X2V4Y2VwdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAic3cgZXhjZXB0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9BVVRPX0lEX0lORElDQVRJT05TX0RST1BQRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImluZGljYXRpb25zX2Ryb3BwZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbnQgd2hlbiBpbmRpY2F0aW9ucyBhcmUgZHJvcHBlZCBkdWUgdG8gY29uZ2VzdGlvbiAvIHNoYXBpbmcuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9BVVRPX0lEX0lNQUdFX1RSQU5TRkVSX0NPTVBMRVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJpbWFnZV90cmFuc2Zlcl9jb21wbGV0ZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW1hZ2UgVHJhbnNmZXIgQ29tcGxldGUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0FVVE9fSURfRERSX1RFU1RfQ09NUExFVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImRkcl90ZXN0X2NvbXBsZXRlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgRERSIFRlc3QgaGFzIGNvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYXV0b19jZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX09QRVJfSURfQ09OTkVDVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY29ubmVjdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU3RhcnQgY29ubmVjdGlvbiBwcm9jZXNzIGJldHdlZW4gdGhlIGhvc3QgcHJvY2Vzc29yIGFuZCB0aGUgZGV2aWNlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9PUEVSX0lEX0RJU0NPTk5FQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImRpc2Nvbm5lY3QiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkRpc2Nvbm5lY3QgdGhlIGhvc3QgZnJvbSB0aGUgZGV2aWNlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9PUEVSX0lEX1JFU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyZXNldCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVzZXRzIHRoZSBob3N0L2RldmljZS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX09QRVJfSURfSE9TVF9LRUVQX0FMSVZFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJob3N0X2tlZXBfYWxpdmUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIktlZXAgYWxpdmUgbWVzc2FnZSBmcm9tIHRoZSBob3N0IHRvIHRoZSBkZXZpY2UgLSB1c2VkIGJ5IHRoZSBkZXZpY2UgY29udHJvbCBsaWJyYXJ5IChzaG91bGQgbm90IGJlIHNlbnQgYnkgdGhlIGhvc3QgYXBwbGljYXRpb24pLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9TV19VUEdSQURFX0FDVElWQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzd191cGdyYWRlX2FjdGl2YXRlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTVyBpbWFnZSBhY3RpdmF0aW9uIGZvciBJbi1TZXJ2aWNlIFNXIHVwZ3JhZGUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX09QRVJfSURfSU1BR0VfVFJBTlNGRVJfU1RBUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImltYWdlX3RyYW5zZmVyX3N0YXJ0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGlzIEFQSSBtZXNzYWdlIGluZm9ybXMgdGhlIE9MVCBvZiB0aGUgc3RhcnQgb2YgaW1hZ2UgdHJhbnNmZXIsIGFuZCBwcm92aWRlcyB0aGUgaW5mb3JtYXRpb24gb2YgdGhlIGZpbGUgaW1hZ2UuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9PUEVSX0lEX0lNQUdFX1RSQU5TRkVSX0RBVEE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImltYWdlX3RyYW5zZmVyX2RhdGEiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gInVzZWQgZm9yIHRyYW5zZmVycmluZyB0aGUgYWN0dWFsIGRhdGEgZnJvbS90byB0aGUgT0xULiAgIG5vdCB0byBiZSBkaXJlY3RseSBjYWxsZWQgYnkgdGhlIHVzZXIuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9PUEVSX0lEX1JVTl9ERFJfVEVTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnVuX2Rkcl90ZXN0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSdW4gYSB0ZXN0IG9uIG9uZSBvciBtb3JlIG9mIHRoZSBERFIgY29tcG9uZW50cy4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0VQT05fREVOSUVEX0xJTks6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX1VOS05PV05fTElOS19WSU9MQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInVua25vd25fbGlua192aW9sYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkEgbGluayB0cmllZCB0byByZWdpc3RlciB3aGlsZSB0aGUgUE9OIHdhcyBzZXQgdG8gXCJub3RpZnkgdW5rbm93blwiIHJlZ2lzdHJhdGlvbiBiZWhhdmlvciBhbmQgdGhpcyBsaW5rIHdhcyBub3QgcHJlLXByb3Zpc2lvbmVkLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fSURfT1ZFUkhFQURfUFJPRklMRV9WSU9MQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm92ZXJoZWFkX3Byb2ZpbGVfdmlvbGF0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGlzIGlzIHdoZW4gbGluayB0cmllcyB0byByZWdpc3RlciBhbmQgdGhlcmUgYXJlIGFscmVhZHkgdG9vIG1hbnkgZXhpc3RpbmcgbGFzZXIgb24vb2ZmIGNvbWJpbmF0aW9ucy4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX0xBU0VSX09OX09GRl9WSU9MQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImxhc2VyX29uX29mZl92aW9sYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoaXMgaXMgd2hlbiBhIGxpbmsgdHJpZXMgdG8gcmVpZ3N0ZXIgd2l0aCBhbiBpbXBvc3NpYmxlIGxhc2VyIG9uIG9yIG9mZiB0aW1lLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fSURfTUFYX0xJTktfVklPTEFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJtYXhfbGlua192aW9sYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkEgbGluayB0cmllZCB0byByZWdpc3RlciBhbmQgaXQgd291bGQgaGF2ZSBwdXQgdXMgb3ZlciB0aGUgcHJvdmlzaW9uZWQgbWF4IGxpbmtzIGZvciB0aGUgY29ycmVzcG9uZGluZyBFUE9OIE5JLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fSURfTExJRF9QT09MX0VNUFRZX1ZJT0xBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAibGxpZF9wb29sX2VtcHR5X3Zpb2xhdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiQSBsaW5rIHRyaWVkIHRvIHJlZ2lzdGVyIGFuZCBpdCB0aGVyZSBhcmUgbm8gTExJRHMgYXZhaWxhYmxlLiBJZiB0aGlzIG9jY3VycywgaXQgaXMgcG9zc2libGUgdGhlcmUgaXMgYW4gaXNzdWUgd2l0aCB5b3VyICdtYXggbGlua3MnIGFuZC9vciAnQmFzZSBMTElEJyBmaWVsZHMgb24geW91ciBSUC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX1NZU1RFTV9SRVNPVVJDRV9WSU9MQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN5c3RlbV9yZXNvdXJjZV92aW9sYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkEgbGluayB0cmllZCB0byByZWdpc3RlciBhbmQgd2Ugd2VyZSB1bmFibGUgdG8gYWxsb2NhdGUgc3lzdGVtIHJlc291cmNlcyBmb3IgaXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19JRF9SQU5HRV9WSU9MQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJhbmdlX3Zpb2xhdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiQSBsaW5rIHRyaWVkIHRvIHJlZ2lzdGVyIHdpdGggYSByYW5nZSB2YWx1ZSB0aGF0IHdhcyBvdXRzaWRlIG9mIHRoZSBtaW4vbWF4IGZpYmVyIGxlbmd0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX1RETV9DSEFOTkVMU19FWEhBVVNURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInRkbV9jaGFubmVsc19leGhhdXN0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRETSBDaGFubmVscyBFeGhhdXN0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX1JPR1VFX1ZJT0xBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicm9ndWVfdmlvbGF0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJBIFJvZ3VlIE9OVSB3YXMgZGV0ZWN0ZWQgb24gdGhpcyBsaW5rL0xMSUQuICI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fSURfVVBTVFJFQU1fQkFORFdJRFRIX1ZJT0xBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhpcyBsaW5rIGZhaWxlZCB0byByZWdpc3RlciBiZWNhdXNlIHRoZXJlIHdhcyBpbnN1ZmZpY2llbnQgdXBzdHJlYW0gYmFuZHdpZHRoIGF2YWlsYWJsZSB0byBwcm92aWRlIHRoZSBkZWZhdWx0IFVCRC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImF1dG9fY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0VQT05fTElOSzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gInN0YXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2RhdGFfYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gbGluay4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9kYXRhX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBkYXRhIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gbGluay4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9mcmFtZXNfNjQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNjQgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9mcmFtZXNfNjVfMTI3IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY1IHRvIDEyNyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gTGluayI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2ZyYW1lc18xMjhfMjU1IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEyOCB0byAyNTUgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9mcmFtZXNfMjU2XzUxMSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiAyNTYgdG8gNTExIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfZnJhbWVzXzUxMl8xMDIzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDUxMiB0byAxMDIzIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfZnJhbWVzXzEwMjRfMTUxOCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMDI0IHRvIDE1MTggYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9mcmFtZXNfMTUxOV8yMDQ3IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDE1MTkgdG8gMjA0NyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gTGluayI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2ZyYW1lc18yMDQ4XzQwOTUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMjA0OCB0byA0MDk1IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2ZyYW1lc180MDk2XzkyMTYiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNDA5NiB0byA5MjE2IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2ZyYW1lc185MjE3XzE2MzgzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDkyMTcgdG8gMTYzODMgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfb2FtX2J5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIE9BTSBieXRlcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gbGluay4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfb2FtX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBPQU0gZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBsaW5rLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9tcGNwX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBNUENQIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gbGluay4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfYnJvYWRjYXN0X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBicm9hZGNhc3QgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBsaW5rLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF91bmljYXN0X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiB1bmljYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIEVQT04gbGluay4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfbXVsdGljYXN0X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBtdWx0aWNhc3QgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBsaW5rLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9yZXBvcnRfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlcG9ydCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIGxpbmsuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2Zjc19lcnJvciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBiYWQgRkNTIGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIEVQT04gTGluayI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9vdmVyc2l6ZV9lcnJvciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBvdmVyc2l6ZSBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyBFUE9OIExpbmsiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfcnVudF9lcnJvciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBydW50IGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIEVQT04gTGluayI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9saW5lX2NvZGVfZXJyb3IiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgbGluZSBjb2RlIGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIEVQT04gTGluayI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9saW5lX2NvZGVfZXJyb3JfbWF4IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIGxpbmUgY29kZSBlcnJvcnMgbWF4IHJlY2VpdmVkIG9uIHRoaXMgRVBPTiBMaW5rIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2RhdGFfYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gbGluay4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfZGF0YV9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZGF0YSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIGxpbmsuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2ZyYW1lc182NCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA2NCBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gTGluayI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI3OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9mcmFtZXNfNjVfMTI3IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY1IHRvIDEyNyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gTGluayI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI4OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9mcmFtZXNfMTI4XzI1NSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMjggdG8gMjU1IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBMaW5rIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2ZyYW1lc18yNTZfNTExIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDI1NiB0byA1MTEgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIExpbmsiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfZnJhbWVzXzUxMl8xMDIzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDUxMiB0byAxMDIzIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBMaW5rIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2ZyYW1lc18xMDI0XzE1MTgiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTAyNCB0byAxNTE4IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBMaW5rIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2ZyYW1lc18xNTE5XzIwNDciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTUxOSB0byAyMDQ3IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBMaW5rIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2ZyYW1lc18yMDQ4XzQwOTUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMjA0OCB0byA0MDk1IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBMaW5rIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2ZyYW1lc180MDk2XzkyMTYiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNDA5NiB0byA5MjE2IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBMaW5rIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2ZyYW1lc185MjE3XzE2MzgzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDkyMTcgdG8gMTYzODMgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyBFUE9OIExpbmsiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfb2FtX2J5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIE9BTSBieXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gbGluay4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzNzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfb2FtX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBPQU0gZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBsaW5rLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM4OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9tcGNwX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBNUENQIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gbGluay4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfYnJvYWRjYXN0X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBicm9hZGNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBsaW5rLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF91bmljYXN0X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiB1bmljYXN0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gbGluay4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0MToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfbXVsdGljYXN0X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBtdWx0aWNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgRVBPTiBsaW5rLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9nYXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBnYXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIEVQT04gbGluay4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX0tFWV9FWENIQU5HRV9GQUlMVVJFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXlfZXhjaGFuZ2VfZmFpbHVyZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIE9MVCBmYWlsZWQgdG8gcmVjZWl2ZSBhbiB1cGRhdGVkIGVuY3J5cHRpb24ga2V5IHdpdGhpbiB0aGUgZXhwZWN0ZWQgdGltZSBwZXJpb2QgYWZ0ZXIgZW5jcnlwdGlvbiBrZXkgZXhjaGFuZ2UgaGFzIGJlZW4gaW5pdGlhdGVkLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9FTkNSWVBUSU9OX0VOQUJMRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImVuY3J5cHRpb25fZW5hYmxlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiRW5jcnlwdGlvbiBoYXMgYmVlbiBzdGFydGVkIG9uIHRoZSBNYXBsZS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfTVBDUF9SRUdfQUNLX1RJTUVPVVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm1wY3BfcmVnX2Fja190aW1lb3V0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJBbiBNUENQIHJlZ2lzdGVyIGFja25vd2xlZGdlbWVudCB3YXMgbm90IHJlY2VpdmVkIGluIHRoZSBleHBlY3RlZCB0aW1lIGludGVydmFsIGZvciBhIGxpbmsgdGhhdCB0cmllZCB0byByZWdpc3RlciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9SQU5HRV9WQUxVRV9DSEFOR0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyYW5nZV92YWx1ZV9jaGFuZ2VkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbmRpY2F0aW9uIHNlbnQgd2hlbiBhIHJhbmdlIHZhbHVlIGhhcyBiZWVuIGNoYW5nZWQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX1BST1RFQ1RJT05fU1dJVENIX09DQ1VSUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJwcm90ZWN0aW9uX3N3aXRjaF9vY2N1cnJlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIGxpbmsgaGFzIHVuZGVyZ29uZSBhIHByb3RlY3Rpb24gc3dpdGNoIGV2ZW50LiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9EVVBMSUNBVEVfTVBDUF9SRUdJU1RSQVRJT05fUkVRVUVTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZHVwbGljYXRlX21wY3BfcmVnaXN0cmF0aW9uX3JlcXVlc3QiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkEgcmVnaXN0ZXIgcmVxdWVzdGVkIHdhcyByZWNlaXZlZCBmb3IgYSBsaW5rIHdpdGggdGhlIHNhbWUgTUFDIGFkZHJlc3MgYXMgYSBsaW5rIHRoYXQgaGFzIGFscmVhZHkgcmVnaXN0ZXJlZC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfTElOS19TUEVFRF9NSVNNQVRDSDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAibGlua19zcGVlZF9taXNtYXRjaCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSG9zdCB3aWxsIHJlY2VpdmUgdGhpcyBpbmRpY2F0aW9uIGlmIGEgbGluayByZWdpc3RlcnMgdGhlbiBhdHRlbXB0cyB0byByZWdpc3RlciBsYXRlciBhdCBhIGRpZmZlcmVudCBzcGVlZCwgb3IgaWYgdGhlIGxpbmsgcmVnaXN0ZXJzIGF0IGEgZGlmZmVyZW50IHNwZWVkIHRoYW4gdGhlIHNwZWVkIHdpdGggd2hpY2ggaXQgd2FzIHByZS1wcm92aXNpb25lZC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfTVBDUF9SRVBPUlRfVElNRU9VVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAibXBjcF9yZXBvcnRfdGltZW91dCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIHByb3Zpc2lvbmVkIGxpbWl0IGJldHdlZW4gcmVwb3J0cyBmb3IgdGhlIHNwZWNpZmllZCBsaW5rIGhhcyBiZWVuIGV4Y2VlZGVkLiAgVGhpcyBsaW5rIHdpbGwgYmUgZGUtcmVnaXN0ZXJlZCwgYW5kIHRoZSBhbGFybV9zdGF0dXMgc2V0IHdoZW4gdGhpcyBvY2N1cnMuICBUaGUgYWxhcm1fc3RhdHVzIHdpbGwgYmUgY2xlYXJlZCB3aGVuIHRoZSBsaW5rIGF0dGVtcHRzIHRvIHJlZ2lzdGVyIGFnYWluLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9PQU1fS0VFUEFMSVZFX1RJTUVPVVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm9hbV9rZWVwYWxpdmVfdGltZW91dCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIHByb3Zpc2lvbmVkIHRpbWUgbGltaXQgYmV0d2VlbiByZWNlaXZpbmcgdXBzdHJlYW0gaW5mbyBmcmFtZXMgaGFzIGJlZW4gZXhjZWVkZWQuICBOb3JtYWxseSBhbiBPTlUgd2lsbCByZXNldCBpdHMgT0FNIHN0YXRlIG1hY2hpbmUgd2hlbiB0aGlzIG9jY3VycnMgYW5kIHRoZSBob3N0IG11c3QgcmUtbmVnb3RpYXRlIE9BTSBhbmQgcmVwcm92aXNpb24gdGhlIGxpbmsuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX01QQ1BfRElTQ09WRVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAibXBjcF9kaXNjb3ZlcmVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJBIGxpbmsgaGFzIGNvbXBsZXRlZCBNUENQIGxpbmsgcmVnaXN0cmF0aW9uLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9NUENQX0RFUkVHSVNURVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAibXBjcF9kZXJlZ2lzdGVyZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkEgcHJldmlvdXNseSByZWdpc3RlcmVkIGxpbmsgaGFzIGNvbXBsZXRlZCBNUENQIGRlLXJlZ2lzdHJhdGlvbi4gIFRoaXMgY291bGQgYmUgYWNjb21wYW5pZWQgYnkgYW4gbXBjcF9yZXBvcnRfdGltZW91dCBhbGFybSBpZiB0aGUgbGluayBqdXN0IGRpc2FwcGVhcmVkLCBvciBub3QgaWYgdGhpcyBpbmRpY2F0aW9uIGlzIGEgcmVzdWx0IG9mIGFuIE9MVCBzZW5kaW5nIGEgTVBDUCBkZXJlZ2lzdGVyIHRvIHRoZSBsaW5rLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9QUkVQUk9WSVNJT05FRF9MSU5LX0NSRUFURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInByZXByb3Zpc2lvbmVkX2xpbmtfY3JlYXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmFpc2VkIGFmdGVyIGFuICdhZGRfbGluaycgb3BlcmF0aW9uIG9uIGFuIEVQT04gTkkgY29tcGxldGVzIHN1Y2Nlc3NmdWxseSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9PQU1fS0VFUEFMSVZFX1RJTUVSX1NUQVJURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm9hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiT0FNIGtlZXBhbGl2ZSB0aW1lciBpcyBzdGFydGVkIGZvciB0aGlzIGxpbmsuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX09BTV9LRUVQQUxJVkVfVElNRVJfU1RPUFBFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAib2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wcGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJPQU0ga2VlcGFsaXZlIHRpbWVyIGlzIHN0b3BwZWQgZm9yIHRoaXMgbGluay4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfS0VZX0VYQ0hBTkdFX1NUQVJURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleV9leGNoYW5nZV9zdGFydGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJrZXlfZXhjaGFuZ2Vfc3RhcnRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9LRVlfRVhDSEFOR0VfU1RPUFBFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5X2V4Y2hhbmdlX3N0b3BwZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImtleV9leGNoYW5nZV9zdG9wcGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX1NUQVRJQ19SRUdJU1RSQVRJT05fRE9ORToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdGljX3JlZ2lzdHJhdGlvbl9kb25lIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTdGF0aWMgcmVnaXN0cmF0aW9uIGRvbmUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfUkVSQU5HRV9GQUlMVVJFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyZXJhbmdlX2ZhaWx1cmUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlLXJhbmdlIGZhaWx1cmUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfTElOS19ERUxFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJsaW5rX2RlbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkxpbmsgRGVsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaXMgbm8gbG9uZ2VyIG1ldC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImF1dG9fY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19PUEVSX0lEX0ZPUkNFX1JFRElTQ09WRVJZOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmb3JjZV9yZWRpc2NvdmVyeSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiRGVyZWdpc3RlciB0aGUgc3BlY2lmaWVkIEVQT04gbGluayBhbmQgZm9yY2UgaXQgdG8gcmUtcmVnaXN0ZXIuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19PUEVSX0lEX0RFTEVURV9MSU5LOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJkZWxldGVfbGluayI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVtb3ZlIGEgbG9naWNhbCBsaW5rIGZyb20gdGhlIHN5c3RlbSBlbnRpcmVseS4gSWYgdGhlIGxpbmsgaXMgbm90IHJlZ2lzdGVyZWQsIGl0IHdpbGwgYmUgcmVtb3ZlZC4gIElmIHRoZSBsaW5rIGlzIGN1cnJlbnRseSByZWdpc3RlcmVkLCBpdCB3aWxsICBkZXJlZ2lzdGVyZWQgYW5kIHJlbW92ZWQuICBJdCBtYXkgaW1tZWRpYXRlbHkgcmUtcmVnaXN0ZXIgd2l0aCBkZWZhdWx0IHBhcmFtZXRlcnMgaWYgdGhlIEVQT05fTkkgaXMgY29uZmlndXJlZCB0byBhbGxvdyBhbGwgbGlua3MgdG8gcmVnaXN0ZXIuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19PUEVSX0lEX09BTV9LRUVQQUxJVkVfVElNRVJfU1RBUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm9hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlN0YXJ0IHRoZSBPQU0ga2VlcGFsaXZlIHRpbWVyIGFnYWluc3QgdGhpcyBsaW5rLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9PQU1fS0VFUEFMSVZFX1RJTUVSX1NUT1A6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm9hbV9rZWVwYWxpdmVfdGltZXJfc3RvcCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU3RvcCB0aGUgT0FNIGtlZXBhbGl2ZSB0aW1lciBmb3IgdGhpcyBsaW5rLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9LRVlfRVhDSEFOR0VfU1RBUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleV9leGNoYW5nZV9zdGFydCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiQXBwbHkgdGhlIGNvcnJlc3BvbmRpbmcgcHJvdmlzaW9uaW5nIGZvciAnZXBvbl9saW5rLmtleV9leGNoYW5nZV9jb25maWcnIGFnYWluc3QgdGhpcyBsaW5rIGFuZCB0aGVuIHN0YXJ0IGtleSBleGNoYW5nZSB0aW1lciB3aXRoIHRoZSBnaXZlbiBwZXJpb2QuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19PUEVSX0lEX0tFWV9FWENIQU5HRV9TVE9QOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXlfZXhjaGFuZ2Vfc3RvcCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU3RvcHMgdGhlIGtleSBleGNoYW5nZSB0aW1lciBmb3IgdGhpcyBsaW5rLiBUaGlzIG9wZXJhdGlvbiBzaG91bGQgZ2VuZXJhbGx5IG9ubHkgYmUgY2FsbGVkIGFmdGVyIGEgc3VjY2Vzc2Z1bCBrZXlfZXhjaGFuZ2Vfc3RhcnQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19PUEVSX0lEX1NUQVRJQ19SRUdJU1RSQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRpY19yZWdpc3RyYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlN0YXRpY2FsbHkgcmVnaXN0ZXJzIHRoZSBsb2dpY2FsIGxpbmsiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1BST1hZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfUFJPWFlfSURfSU5KRUNUX0ZSQU1FOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJpbmplY3RfZnJhbWUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbmQgYW4gYXJiaXRyYXJ5IGZyYW1lIGFjcm9zcyB0aGUgc3BlY2lmaWVkIGxpbmsuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9QUk9YWV9SWDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX1BST1hZX1JYX0lEX0ZSQU1FX0NBUFRVUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZV9jYXB0dXJlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiQSBmcmFtZSBtYXRjaGluZyBob3N0LXNwZWNpZmllZCBjcml0ZXJpYSB3YXMgcmVjZWl2ZWQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX05JOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfQVVUT19JRF9OT19SRVBPUlRTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJub19yZXBvcnRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJMb3NzIG9mIGFsbCByZXBvcnRzIG9uIGFsbCBsaW5rcyBvbiB0aGUgRVBPTiBOSSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfTExJRF9RVUFSQU5USU5FRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAibGxpZF9xdWFyYW50aW5lZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiTExJRCBRdWFyYW50aW5lZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdGVfY2hhbmdlX2NvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCBhZnRlciBhICdzZXRfZXBvbl9uaV9lbl9zdGF0ZScgb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfQVVUT19JRF9SRVJBTkdFX0ZBSUxVUkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJlcmFuZ2VfZmFpbHVyZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW5kaWNhdGVzIHRoZSByZS1yYW5naW5nIHByb2Nlc3MgaGFzIGZhaWxlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSU1NJIE1lYXN1cmVtZW50IENvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfT05VX1VQR1JBREVfQ09NUExFVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm9udV91cGdyYWRlX2NvbXBsZXRlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJPTlUgVXBncmFkZSBDb21wbGV0ZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfUk9HVUVfU0NBTl9DT01QTEVURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicm9ndWVfc2Nhbl9jb21wbGV0ZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW5kY2lhdGlvbiB0aGF0IGEgc2NhbiBpcyBjb21wbGV0ZSwgYW55IGVycm9yIGlzIGFsc28gcmV0dXJuZWQuICI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfTVBDUF9USU1FU1RBTVBfQ0hBTkdFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAibXBjcF90aW1lc3RhbXBfY2hhbmdlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiQSBjbG9jayB0cmFuc3BvcnQgcHVsc2Ugd2FzIHJlY2VpdmVkIGF0IHRoZSBnaXZlbiBNUENQIHRpbWVzdGFtcC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9BVVRPX0lEX0FVVE9fUk9HVUVfU0NBTl8xR19GQUlMVVJFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJhdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIGF1dG8gcm9ndWUgc2NhbiBmb3VuZCBwb3NzaWJsZSByb2d1ZSBvbnVzIG9uIHRoZSAxRyBzdHJlYW0uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfQVVUT19JRF9BVVRPX1JPR1VFX1NDQU5fMTBHX0ZBSUxVUkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImF1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIGF1dG8gcm9ndWUgc2NhbiBmb3VuZCBwb3NzaWJsZSByb2d1ZSBvbnVzIG9uIHRoZSAxRyBzdHJlYW0uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJhdXRvX2NmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX09QRVJfSURfU0VUX0VQT05fTklfRU5fU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInNldF9lcG9uX25pX2VuX3N0YXRlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZXQgdGhlIEVQT04gTkkgZW5hYmxlIHN0YXRlLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX09QRVJfSURfSVNTVUVfUlNTSV9HUkFOVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiaXNzdWVfcnNzaV9ncmFudCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSXNzdWVzIGFuIFJTU0kgZ3JhbnQgdG8gcmVhZCBSWCBQb3dlciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX09QRVJfSURfQUREX0xJTks6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImFkZF9saW5rIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJQcmUtcHJvdmlzaW9uIGFuIEVQT04gbGluay4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX0FERF9NVUxUSUNBU1RfTElOSzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYWRkX211bHRpY2FzdF9saW5rIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJQcmUtcHJvdmlzaW9uIGFuIEVQT04gbXVsdGljYXN0IGxpbmsuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9BRERfUFJPVEVDVEVEX1NUQU5EQllfTElOSzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmsiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkFkZHMgYSBwcm90ZWN0ZWQgc3RhbmRieSBsaW5rLiAgT25jZSBpdCBoYXMgYmVlbiBjcmVhdGVkLCB0aGUgbGluayBpcyBjb25zaWRlcmVkIFwic3RhbmRieVwiIGZvciB0aGUgcHVwb3NlcyBvZiBwcm90ZWN0aW9uIHN3aXRjaGluZy4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX0FQUExZX1JFUkFOR0VfREVMVEE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInByb3RlY3Rpb25fc3dpdGNoaW5nX2FwcGx5X3JlcmFuZ2VfZGVsdGEiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlByb3RlY3Rpb24gc3dpdGNoaW5nIGFwcGx5IHJlLXJhbmdlIGRlbHRhIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9ST0dVRV9MTElEX1NDQU46CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJvZ3VlX2xsaWRfc2NhbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSXNzdWUgYSByZXF1ZXN0IHRvIHNjYW4gYWxsIExMSURzIG9yIGEgc3BlY2lmaWMgTExJRCBvbiBhIFBPTiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX09QRVJfSURfU1RBUlRfT05VX1VQR1JBREU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXJ0X29udV91cGdyYWRlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTdGFydCBPTlUgRmlybXdhcmUgVXBncmFkZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMTBHX1VTOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZmVjX2NvZGVfd29yZHNfdG90YWwiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkZFQyBzdGF0cyBjb2RlIHdvcmRzIHRvdGFsIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZmVjX2NvZGVfd29yZHNfZGVjb2RlX2ZhaWxzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJGRUMgc3RhdHMgY29kZSB3b3JkcyBkZWNvZGUgZmFpbHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmZWNfemVyb2VzX2NvcnJlY3RlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiRkVDIHN0YXRzIHplcm9zIGNvcnJlY3RlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZlY19vbmVzX2NvcnJlY3RlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiRkVDIHN0YXRzIG9uZXMgY29yZWN0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzEwR19VU19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBpcyBubyBsb25nZXIgbWV0LiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYXV0b19jZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfRVBPTl9PTlVfMUdfVVM6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJzdGF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJnb29kX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiR29vZCBGcmFtZSBDb3VudCwgaW5jbHVkaW5nIG5vbkZFQyBhbmQgRkVDIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZ29vZF9ieXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiR29vZCBCeXRlIENvdW50LCBpbmNsdWRpbmcgbm9uRkVDIGFuZCBGRUMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJvdmVyc3pfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJPdmVyc2l6ZWQgZnJhbWUgY291bnQgKGZyYW1lcyBsYXJnZXIgdGhhbiAyMDAwIGJ5dGVzKSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm5vbl9mZWNfZ29vZF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIk5vbiBGRUMgR29vZCBGcmFtZSBDb3VudCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm5vbl9mZWNfZ29vZF9ieXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiTm9uIEZFQyBHb29kIEJ5dGUgQ291bnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmZWNfZ29vZF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkZFQyBHb29kIEZyYW1lIENvdW50IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZmVjX2dvb2RfYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkZFQyBHb29kIEJ5dGUgQ291bnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmZWNfZnJhbWVzX2V4Y19lcnJzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJGRUMgRnJhbWVzIHdoaWNoIGV4Y2VlZGVkIDggc3ltYm9sIGVycm9ycyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZlY19ibGtzX25vX2VycnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkZFQyBCbG9ja3Mgd2l0aCBubyBlcnJvcnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmZWNfYmxrc19jb3JyX2VycnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkZFQyBCbG9ja3Mgd2l0aCBjb3JyZWN0YWJsZSBlcnJvcnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZmVjX2Jsa3NfdW5jb3JyX2VycnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkZFQyBCbG9ja3Mgd2l0aCB1bmNvcnJlY3RhYmxlIGVycm9ycyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmZWNfY29ycl9ieXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiRkVDIENvcnJlY3RlZCBCeXRlcy9TeW1ib2xzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZlY19jb3JyX3plcm9lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiRkVDIENvcnJlY3RlZCBaZXJvZXMsIDhiIGRvbWFpbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmZWNfY29ycl9vbmVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJGRUMgQ29ycmVjdGVkIE9uZXMsIDhiIGRvbWFpbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ1bmRlcnN6X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVW5kZXJzaXplIGZyYW1lIGNvdW50IChmcmFtZXMgbGVzcyB0aGFuIDY0IGJ5dGVzKSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJlcnJvcnN6X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiRXJyb3JlZCBmcmFtZSAiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzFHX1VTX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaXMgbm8gbG9uZ2VyIG1ldC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImF1dG9fY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfRFM6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJzdGF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJieXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBieXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzY0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY0IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfNjVfMTI3IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY1IHRvIDEyNyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzEyOF8yNTUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTI4IHRvIDI1NSBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzI1Nl81MTEiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMjU2IHRvIDUxMSBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzUxMl8xMDIzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDUxMiB0byAxMDIzIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfMTAyNF8xNTE4IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEwMjQgdG8gMTUxOCBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzE1MTlfMjA0NyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxNTE5IHRvIDIwNDcgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc18yMDQ4XzQwOTUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMjA0OCB0byA0MDk1IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzQwOTZfOTIxNiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA0MDk2IHRvIDkyMTYgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfOTIxN18xNjM4MyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA5MjE3IHRvIDE2MzgzIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYnJvYWRjYXN0X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBicm9hZGNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZGF0YV9ieXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAibXVsdGljYXN0X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBtdWx0aWNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidW5pY2FzdF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdW5pY2FzdCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJvYW1fYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIk51bWJlciBvZiBPQU0gYnl0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJvYW1fZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJOdW1iZXIgb2YgT0FNIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDEwZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImdhdGVfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJOdW1iZXIgb2YgZ2F0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxMGcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJtcGNwX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiTnVtYmVyIG9mIE1QQ1AgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYWJvcnRfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJOdW1iZXIgb2YgYWJvcnQgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMTBnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJhdXRvX2NmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMTBHX1VTOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzY0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY0IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzY1XzEyNyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA2NSB0byAxMjcgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfMTI4XzI1NSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMjggdG8gMjU1IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzI1Nl81MTEiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMjU2IHRvIDUxMSBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc181MTJfMTAyMyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA1MTIgdG8gMTAyMyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc18xMDI0XzE1MTgiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTAyNCB0byAxNTE4IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzE1MTlfMjA0NyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxNTE5IHRvIDIwNDcgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfMjA0OF80MDk1IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDIwNDggdG8gNDA5NSBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfNDA5Nl85MjE2IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDQwOTYgdG8gOTIxNiBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfOTIxN18xNjM4MyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA5MjE3IHRvIDE2MzgzIGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImJyb2FkY2FzdF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnJvYWRjYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJkYXRhX2J5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAibXVsdGljYXN0X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBtdWx0aWNhc3QgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInVuaWNhc3RfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHVuaWNhc3QgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm1wY3BfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIE1QQ1AgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm9hbV9ieXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBPQU0gYnl0ZXMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxODoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAib2FtX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBPQU0gZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJlcG9ydF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVwb3J0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJhYm9ydF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYWJvcnQgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZjc19lcnJvciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBiYWQgRkNTIGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjcmNfOF9lcnJvciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBDUkM4IGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIDEwZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJvdXRfb2Zfc2xvdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBvdXQgb2Ygc2xvdCBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAib3ZlcnNpemVfZXJyb3IiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2Ygb3ZlcnNpemUgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMTBnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ1bnRfZXJyb3IiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcnVudCBlcnJvcnMgcmVjZWl2ZWQgb24gdGhpcyAxMGcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJhdXRvX2NmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX1BBVEhfMUdfRFM6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJzdGF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJieXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBieXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc182NCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA2NCBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfNjVfMTI3IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDY1IHRvIDEyNyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfMTI4XzI1NSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMjggdG8gMjU1IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc18yNTZfNTExIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDI1NiB0byA1MTEgYnl0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzUxMl8xMDIzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDUxMiB0byAxMDIzIGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc18xMDI0XzE1MTgiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTAyNCB0byAxNTE4IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc18xNTE5XzIwNDciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTUxOSB0byAyMDQ3IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc18yMDQ4XzQwOTUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMjA0OCB0byA0MDk1IGJ5dGUgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfNDA5Nl85MjE2IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDQwOTYgdG8gOTIxNiBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzkyMTdfMTYzODMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgOTIxNyB0byAxNjM4MyBieXRlIGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYnJvYWRjYXN0X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBicm9hZGNhc3QgZnJhbWVzIHRyYW5zbWl0dGVkIG9uIHRoaXMgMWcgZG93bnN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJkYXRhX2J5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm11bHRpY2FzdF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgbXVsdGljYXN0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidW5pY2FzdF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdW5pY2FzdCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm9hbV9ieXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiTnVtYmVyIG9mIE9BTSBieXRlcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAib2FtX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiTnVtYmVyIG9mIE9BTSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImdhdGVfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJOdW1iZXIgb2YgZ2F0ZSBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm1wY3BfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJOdW1iZXIgb2YgTVBDUCBmcmFtZXMgdHJhbnNtaXR0ZWQgb24gdGhpcyAxZyBkb3duc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImFib3J0X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiTnVtYmVyIG9mIGFib3J0IGZyYW1lcyB0cmFuc21pdHRlZCBvbiB0aGlzIDFnIGRvd25zdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBpcyBubyBsb25nZXIgbWV0LiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYXV0b19jZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX1VTOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc182NCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA2NCBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzY1XzEyNyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA2NSB0byAxMjcgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc18xMjhfMjU1IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDEyOCB0byAyNTUgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc18yNTZfNTExIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDI1NiB0byA1MTEgYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc181MTJfMTAyMyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiA1MTIgdG8gMTAyMyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzEwMjRfMTUxOCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiAxMDI0IHRvIDE1MTggYnl0ZSBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc18xNTE5XzIwNDciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgMTUxOSB0byAyMDQ3IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmcmFtZXNfMjA0OF80MDk1IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIDIwNDggdG8gNDA5NSBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZyYW1lc180MDk2XzkyMTYiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgNDA5NiB0byA5MjE2IGJ5dGUgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZnJhbWVzXzkyMTdfMTYzODMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgOTIxNyB0byAxNjM4MyBieXRlIGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImJyb2FkY2FzdF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgYnJvYWRjYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImRhdGFfYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm11bHRpY2FzdF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgbXVsdGljYXN0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInVuaWNhc3RfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHVuaWNhc3QgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAibXBjcF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgTVBDUCBmcmFtZXMgcmVjZWl2ZWQgb24gdGhpcyAxZyB1cHN0cmVhbSBwYXRoLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJvYW1fYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgT0FNIGJ5dGVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxODoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAib2FtX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBPQU0gZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicmVwb3J0X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZXBvcnQgZnJhbWVzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYWJvcnRfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIGFib3J0IGZyYW1lcyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZjc19lcnJvciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBiYWQgRkNTIGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNyY184X2Vycm9yIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIENSQzggZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAib3V0X29mX3Nsb3QiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2Ygb3V0IG9mIHNsb3QgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAib3ZlcnNpemVfZXJyb3IiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2Ygb3ZlcnNpemUgZXJyb3JzIHJlY2VpdmVkIG9uIHRoaXMgMWcgdXBzdHJlYW0gcGF0aC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnVudF9lcnJvciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiBydW50IGVycm9ycyByZWNlaXZlZCBvbiB0aGlzIDFnIHVwc3RyZWFtIHBhdGguIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMUdfVVNfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaXMgbm8gbG9uZ2VyIG1ldC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImF1dG9fY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0VQT05fUlA6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BJTzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX0FMTE9DOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIEJ5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNvbmZpZ3VyYXRpb25fY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJDb25maWd1cmF0aW9uIENvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fSURfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiQ29sbGVjdGVkIGFsbG9jIElEIHN0YXRpc3RpY3MgZnJvbSBnZXRfc3RhdHMgb3BlcmF0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJhdXRvX2NmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0FMTE9DX09QRVJfSURfU0VUX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzZXRfc3RhdGUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNldHMgdGhlIGFsbG9jJ3MgYWN0aXZhdGlvbiBzdGF0ZS4gIFRoaXMgaXMgb25seSB1c2VkIGZvciBwcm90ZWN0aW9uIHN3aXRjaGluZyBvbiBhbiBhY3RpdmUtc3RhbmRieSBQT04uICBJbiBub3JtYWwgb3BlcmF0aW9uLCB0aGlzIGlzbid0IG5lY2Vzc2FyeSBzaW5jZSBhbGxvY3MgYXJlIGFjdGl2YXRlZC9kZWFjdGl2YXRlZCBhdXRvbWF0aWNhbGx5IGFsb25nIHdpdGggdGhlIE9OVS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9BTExPQ19PUEVSX0lEX0dFVF9TVEFUUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZ2V0X3N0YXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSdW4gc3RhdGlzdGljcyBjb2xsZWN0aW9uIGZvciBhIGdpdmVuIHBlcmlvZCBvZiB0aW1lIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX0dFTV9QT1JUOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfcGFja2V0cyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgR0VNIGZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2J5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBieXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X3BhY2tldHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRyYW5zbWl0dGVkIEdFTSBmcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9ieXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVHJhbnNtaXR0ZWQgYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY29uZmlndXJhdGlvbl9jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkNvbmZpZ3VyYXRpb24gQ29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJhdXRvX2NmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0dFTV9QT1JUX09QRVJfSURfU0VUX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzZXRfc3RhdGUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNldHMgdGhlIEdFTSBwb3J0J3MgYWN0aXZhdGlvbiBzdGF0ZS4gIFRoaXMgaXMgb25seSB1c2VkIGZvciBwcm90ZWN0aW9uIHN3aXRjaGluZyBvbiBhbiBhY3RpdmUtc3RhbmRieSBQT04uICBJbiBub3JtYWwgb3BlcmF0aW9uLCB0aGlzIGlzbid0IG5lY2Vzc2FyeSBzaW5jZSBHRU0gcG9ydHMgYXJlIGFjdGl2YXRlZC9kZWFjdGl2YXRlZCBhdXRvbWF0aWNhbGx5IGFsb25nIHdpdGggdGhlIE9OVS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fSVdGOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZHNfaGl0X2V2ZW50IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJEUyBoaXQgZXZlbnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJkc19taXNzX2V2ZW50IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJEUyBtaXNzIGV2ZW50IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZHNfZHJvcF9kdWVfdG9fbWlzc19ldmVudCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiRFMgZHJvcCBkdWUgdG8gbWlzcyBldmVudCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImRzX2Ryb3BfZHVlX3RvX2hpdF9ldmVudCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiRFMgZHJvcCBkdWUgdG8gaGl0IGV2ZW50IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZHNfZHJvcF90b19kaXNhYmxlZF9nZW0iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkRTIGRyb3AgdG8gZGlzYWJsZWQgR0VNIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAibmV3X21hY19kaXNjb3ZlcmVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJOZXcgTUFDIGRpc2NvdmVyZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJtb3ZlX2V2ZW50IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJNb3ZlIGV2ZW50IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAibmV3X21hY19kcm9wX2R1ZV90b19maWZvX2Z1bGwiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIk5ldyBNQUMgZHJvcCBkdWUgdG8gZmlmbyBmdWxsIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9BVVRPX0lEX0ZMVVNIX01BQ19UQUJMRV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZsdXNoX21hY190YWJsZV9jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkZsdXNoIE1BQyBUYWJsZSBDb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfQVVUT19JRF9TQ0FOX01BQ19UQUJMRV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInNjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiQSBNQUMgdGFibGUgc2NhbiBpbml0aWF0ZWQgdXNpbmcgdGhlIFwic2Nhbl9tYWNfdGFibGVcIiBvcGVyYXRpb24gaXMgY29tcGxldGUuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaXMgbm8gbG9uZ2VyIG1ldC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImF1dG9fY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX09QRVJfSURfRkxVU0hfTUFDX1RBQkxFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmbHVzaF9tYWNfdGFibGUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkZsdXNoIE1BQyBUYWJsZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9PUEVSX0lEX1NDQU5fTUFDX1RBQkxFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzY2FuX21hY190YWJsZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2NhbnMgTUFDIHRhYmxlIGZvciBhIGdpdmVuIE1BQyBhZGRyZXNzIHRoZW4gcmV0dXJucyB0aGUgYXNzb2NpYXRlZCBpbmZvcm1hdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1c6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fSVdGX01BQ19UQUJMRToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19JRF9ORVdfTUFDOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJuZXdfbWFjIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBuZXcgTUFDIGFkZHJlc3MgLyBWSUQgY29tYmluYXRpb24gaXMgc2VlbiBpbiB0aGUgdXBzdHJlYW0gdHJhZmZpYyBzdHJlYW0uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0lEX01BQ19BR0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJtYWNfYWdlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIGEgTUFDIHRhYmxlIGVudHJ5IGFnZXMuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0lEX01BQ19NT1ZFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJtYWNfbW92ZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIHRoZSBNQUMgdGFibGUgaXMgaW4gbW92ZSBtb2RlIGFuZCBhIHBhY2tldCBpcyBzZWVuIHRoYXQgbWF0Y2hlcyBvbiBNQUMgYWRkcmVzcyAvIFZJRCBidXQgZG9lc24ndCBtYXRjaCBvbiBmbG93IElELiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19JRF9NQUNfRFJPUFBFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAibWFjX2Ryb3BwZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbnQgd2hlbiBhbiBlbnRyeSBjYW5ub3QgYmUgbGVhcm5lZCBzaW5jZSB0aGUgTUFDIHRhYmxlIGlzIGZ1bGwuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJhdXRvX2NmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9VU19GTE9XOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fTkk6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJzdGF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmZWNfY29kZXdvcmRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBGRUMgY29kZXdvcmRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZmVjX2NvZGV3b3Jkc191bmNvcnJlY3RlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgdW5jb3JyZWN0ZWQgRkVDIGNvZGV3b3JkcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImJpcDhfYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIGJ5dGVzIHByb3RlY3RlZCBieSBiaXA4IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYmlwOF9lcnJvcnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIGJpcDggZXJyb3JzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfZ2VtX3BhY2tldHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIEdFTSBmcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9nZW1fZHJvcHBlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgZHJvcHBlZCBHRU0gSUQgcGFja2V0cyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2dlbV9pZGxlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBpZGxlIEdFTSBmcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9nZW1fY29ycmVjdGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBjb3JyZWN0ZWQgR0VNIGZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2dlbV9pbGxlZ2FsIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBpbGxlZ2FsIEdFTSBmcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9hbGxvY2F0aW9uc192YWxpZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgdmFsaWQgYWxsb2NhdGlvbnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfYWxsb2NhdGlvbnNfaW52YWxpZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgaW52YWxpZCBhbGxvY2F0aW9ucyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9hbGxvY2F0aW9uc19kaXNhYmxlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgZGlzYWJsZWQgYWxsb2NhdGlvbnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfcGxvYW1zIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBQbG9hbXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfcGxvYW1zX25vbl9pZGxlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBub24gaWRsZSBQbG9hbXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfcGxvYW1zX2Vycm9yIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBlcnJvciBQbG9hbXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfcGxvYW1zX2Ryb3BwZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIGRyb3BwZWQgUGxvYW1zIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2NwdSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgQ1BVIHBhY2tldHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfb21jaSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgT01DSSBwYWNrZXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIE9NQ0kgcGFja2V0cyB3aXRoIENSQyBlcnJvcnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfZHJvcHBlZF90b29fc2hvcnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIHBhY2tldHMgZHJvcHBlZCBkdWUgdG8gbGVuZ3RoIHRvbyBzaG9ydCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9kcm9wcGVkX3Rvb19sb25nIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBwYWNrZXQgZHJvcHBlZCBkdWUgdG8gbGVuZ3RoIHRvbyBsb25nIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2NyY19lcnJvcnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIHBhY2tldCBkcm9wcGVkIGR1ZSB0byBjcmMgZXJyb3IiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfa2V5X2Vycm9ycyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgcGFja2V0IGRyb3BwZWQgZHVlIHRvIGtleSBlcnJvciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9mcmFnbWVudHNfZXJyb3JzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBwYWNrZXQgZHJvcHBlZCBkdWUgdG8gZnJhZ21lbnRhdGlvbiBlcnJvciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9wYWNrZXRzX2Ryb3BwZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkdsb2JhbCBkcm9wcGVkIHBhY2tldHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfZ2VtIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUcmFuc21pdHRlZCBHRU0gZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X3Bsb2FtcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVHJhbnNtaXR0ZWQgUGxvYW1zIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2dlbV9mcmFnbWVudHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRyYW5zbWl0dGVkIEdFTSBmcmFnbWVudHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyODoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfY3B1IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUcmFuc21pdHRlZCBDUFUgcGFja2V0cyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9vbWNpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUcmFuc21pdHRlZCBPTUNJIHBhY2tldHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUcmFuc21pdCBwYWNrZXRzIGRyb3BwZWQgZHVlIHRvIGlsbGVnYWwgbGVuZ3RoIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2Ryb3BwZWRfaWxsZWdhbF9sZW5ndGgiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRyYW5zbWl0dGVkIHBhY2tldCBkcm9wcGVkIGR1ZSB0byBpbGxlZ2FsIGxlbmd0aCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9kcm9wcGVkX3RwaWRfbWlzcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiRHJvcHBlZCBiZWNhdXNlIG9mIFRQSUQgbWlzcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9kcm9wcGVkX3ZpZF9taXNzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJEcm9wcGVkIGJlY2F1c2Ugb2YgVklEIG1pc3MiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9TVEFURV9DSEFOR0VfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0ZV9jaGFuZ2VfY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTdGF0ZSBDaGFuZ2UgQ29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9MT1M6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImxvcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiTE9TIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9TRVJJQUxfTlVNQkVSX0FDUVVJU0lUSU9OX0NZQ0xFX1NUQVJUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZXJpYWwgTnVtYmVyIEFjcXVpc2l0aW9uIEN5Y2xlIFN0YXJ0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlByb3RlY3Rpb24gU3dpdGNoaW5nIFRyYWZmaWMgUmVzdW1lIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19PTlVTX1JBTkdFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkFmdGVyIGEgc3dpdGNob3ZlciBpcyBjb21wbGV0ZSBhbmQgYWxsIE9OVSByYW5naW5nIHRpbWVzIGhhdmUgc3RhYmlsaXplZCwgdGhpcyBpbmRpY2F0aW9uIGlzIHNlbnQgdG8gaW5mb3JtIHRoZSBob3N0IG9mIGFsbCBuZXcgT05VIEVRRHMuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19TV0lUQ0hPVkVSX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlByb3RlY3Rpb24gU3dpdGNoaW5nIFN3aXRjaG92ZXIgQ29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlN0YW5kYnkgUE9OIE1vbml0b3JpbmcgQ3ljbGUgQ29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9PTlVfRElTQ09WRVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAib251X2Rpc2NvdmVyZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIk9OVSBEaXNjb3ZlcmVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9DUFVfUEFDS0VUU19GQUlMVVJFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjcHVfcGFja2V0c19mYWlsdXJlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJBIGZhaWx1cmUgd2FzIGVuY291bnRlcmVkIGR1cmluZyB0aGUgXCJjcHVfcGFja2V0c1wiIHByb3h5IG9wZXJhdGlvbi4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJvZ3VlIGRldGVjdGlvbiBjb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX0RFQUNUSVZBVEVfQUxMX09OVVNfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJkZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiZGVhY3RpdmF0ZSBhbGwgb251cyBjb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX0RJU0FCTEVfQUxMX09OVVNfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJkaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiZGlzYWJsZSBhbGwgb251cyBjb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX0FDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJhY3RpdmF0ZSBhbGwgb251cyBjb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX0VOQUJMRV9BTExfT05VU19DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImVuYWJsZV9hbGxfb251c19jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImVuYWJsZSBhbGwgb251cyBjb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX1RPRF9SRVFVRVNUX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidG9kX3JlcXVlc3RfY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUT0QgcmVxdWVzdCBjb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX09OVV9VUEdSQURFX0NPTVBMRVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJvbnVfdXBncmFkZV9jb21wbGV0ZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiT05VIFVwZ3JhZGUgQ29tcGxldGUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX1JPR1VFX09OVV9TUEVDSUFMX01BUF9DWUNMRV9TVEFSVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSb2d1ZSBPTlUgc3BlY2lhbCBtYXAgY3ljbGUgc3RhcnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaXMgbm8gbG9uZ2VyIG1ldC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImF1dG9fY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9TRVRfUE9OX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzZXRfcG9uX3N0YXRlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZXQgUE9OIFN0YXRlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9SRVNFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicmVzZXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlc2V0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9ESVNBQkxFX1NFUklBTF9OVU1CRVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImRpc2FibGVfc2VyaWFsX251bWJlciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiRGlzYWJsZSBTZXJpYWwgTnVtYmVyIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9TSU5HTEVfUkVRVUVTVF9TVEFOREJZX1BPTl9NT05JVE9SSU5HOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTaW5nbGUgcmVxdWVzdCBmb3IgUE9OIG1vbml0b3JpbmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1NFVF9PTlVfU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInNldF9vbnVfc3RhdGUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNldCB0aGUgb3BlcmF0aW9uIHN0YXRlIG9mIGFsbCBPTlVzLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX09QRVJfSURfUk9HVUVfREVURUNUSU9OX1dJTkRPVzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicm9ndWVfZGV0ZWN0aW9uX3dpbmRvdyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUm9ndWUgRGV0ZWN0aW9uIFdpbmRvdyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX09QRVJfSURfVE9EX1JFUVVFU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInRvZF9yZXF1ZXN0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUT0QgcmVxdWVzdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX09QRVJfSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFlQRV9DX1NFVF9NVUxUSVBMRV9PTlVfU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInByb3RlY3Rpb25fc3dpdGNoaW5nX3R5cGVfY19zZXRfbXVsdGlwbGVfb251X3N0YXRlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJwcm90ZWN0aW9uIHN3aXRjaGluZyB0eXBlIGMgc2V0IG11bHRpcGxlIG9udSBzdGF0ZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX09QRVJfSURfU1RBUlRfT05VX1VQR1JBREU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXJ0X29udV91cGdyYWRlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJPTFQgdG8gT05VIGZpcm13YXJlIHRyYW5zZmVyIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9QUk9YWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9QUk9YWV9JRF9DUFVfUEFDS0VUUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY3B1X3BhY2tldHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkdQT04gQ1BVIFBhY2tldHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9QUk9YWV9JRF9CUk9BRENBU1RfUExPQU1fUEFDS0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJicm9hZGNhc3RfcGxvYW1fcGFja2V0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJCcm9hZGNhc3QgUExPQU0gUGFja2V0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX09OVToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gInN0YXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZlY19jb2Rld29yZHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRvdGFsIHJlY2VpdmVkIEZFQyBjb2Rld29yZHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmZWNfYnl0ZXNfY29ycmVjdGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJGRUMgY29kZXdvcmRzIGNvcnJlY3RlZCBieXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZlY19jb2Rld29yZHNfY29ycmVjdGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJGRUMgY29ycmVjdGVkIGNvZGV3b3JkcyBlcnJvciAiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmZWNfY29kZXdvcmRzX3VuY29ycmVjdGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJGRUMgbm90IGNvcnJlY3RlZCBjb2Rld29yZHMgZXJyb3IiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJiaXA4X2J5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBieXRlcyBmb3IgQklQOCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImJpcDhfZXJyb3JzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJCaXQgZXJyb3IgYWNjb3JkaW5nIHRvIEJJUDgiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9wbG9hbXNfY3JjX2Vycm9yIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBQTE9BTXMgd2l0aCBDUkMgZXJyb3IiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9wbG9hbXNfbm9uX2lkbGUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIG5vbiBpZGxlIFBMT0FNcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInBvc2l0aXZlX2RyaWZ0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJQb3NpdGl2ZSBkcmlmdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm5lZ2F0aXZlX2RyaWZ0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJOZWdhdGl2ZSBkcmlmdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9vbWNpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBPTUNJIHBhY2tldHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfb21jaV9wYWNrZXRzX2NyY19lcnJvciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgT01DSSBwYWNrZXRzIHdpdGggQ1JDIGVycm9ycyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJiZXJfcmVwb3J0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkJFUiByZXBvcnRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ1bnJlY2VpdmVkX2J1cnN0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJVbnJlY2VpdmVkIGJ1cnN0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImxjZGdfZXJyb3JzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJMQ0RHIGVycm9ycyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyZGlfZXJyb3JzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSREkgZXJyb3JzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2J5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJyeCBieXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9wYWNrZXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJyeCBwYWNrZXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2J5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJ0eCBieXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9wYWNrZXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJ0eCBwYWNrZXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX09OVV9BTEFSTToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAib251X2FsYXJtIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJPTlUgQWxhcm0iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9ET1dJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJkb3dpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJEcmlmdCBvZiBXaW5kb3cgb2YgT05VaSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1NGSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic2ZpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTaWduYWwgRmFpbCBvZiBPTlVpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfU0RJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzZGkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNpZ25hbCBEZWdyYWRlZCBvZiBPTlVpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfREZJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJkZmkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmUgRHlpbmctR2FzcCBvZiBPTlVpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfU1VGSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3VmaSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU1VGaSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0xPQUk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImxvYWkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkxPQWkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9ER0k6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImRnaSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZSBEeWluZy1HYXNwIG9mIE9OVWkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9QRUU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInBlZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUEVFIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfUFNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJwc3QiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlBTVCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1RJV0k6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInRpd2kiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRyYW5zbWlzc2lvbiBJbnRlcmZlcmVuY2UgV2FybmluZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0xPS0k6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImxva2kiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkxPa2kiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9NRU1JOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJtZW1pIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJNRU1pIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT01DSV9QT1JUX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJvbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIk9NQ0kgUE9SVCBJRCBDb25maWd1cmF0aW9uIENvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0JFUl9JTlRFUlZBTF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJCRVIgSW50ZXJ2YWwgQ29uZmlndXJhdGlvbiBDb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9FUlI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImVyciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiRVJSIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfUkVJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyZWkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJFSSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1JBTkdJTkdfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyYW5naW5nX2NvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmFuZ2luZyBDb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInBhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUGFzc3dvcmQgQXV0aGVudGljYXRpb24gQ29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT05VX0FDVElWQVRJT05fQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJvbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIk9OVSBBY3RpdmF0aW9uIENvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJvbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiT05VIERlYWN0aXZhdGlvbiBDb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9PTlVfRU5BQkxFX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAib251X2VuYWJsZV9jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIk9OVSBFbmFibGUgQ29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT05VX0RJU0FCTEVfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJvbnVfZGlzYWJsZV9jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIk9OVSBEaXNhYmxlIENvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0lOVkFMSURfREJSVV9SRVBPUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImludmFsaWRfZGJydV9yZXBvcnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkludmFsaWQgREJSdSBSZXBvcnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXlfZXhjaGFuZ2VfY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJLZXkgRXhjaGFuZ2UgQ29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfS0VZX0VYQ0hBTkdFX0tFWV9SRVFVRVNUX1RJTUVPVVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJLZXkgRXhjaGFuZ2UgS2V5IFJlcXVlc3QgVGltZW91dCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0tFWV9FWENIQU5HRV9DWUNMRV9TS0lQUEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiS2V5IEV4Y2hhbmdlIEN5Y2xlIFNraXBwZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENIOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJLZXkgRXhjaGFuZ2UgS2V5IE1pc21hdGNoIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfS0VZX0VYQ0hBTkdFX1VOQ09OU0VDVVRJVkVfSU5ERVg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJLZXkgRXhjaGFuZ2UgVW5jb25zZWN1dGl2ZSBJbmRleCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1JTU0lfTUVBU1VSRU1FTlRfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUlNTSSBNZWFzdXJlbWVudCBDb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfREVDUllQVF9SRVFVSVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5X2V4Y2hhbmdlX2RlY3J5cHRfcmVxdWlyZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIktleSBFeGNoYW5nZSBEZWNyeXB0IFJlcXVpcmVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT1BUSUNBTF9SRUZMRUNUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJvcHRpY2FsX3JlZmxlY3Rpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkFuIG9wdGljYWwgcmVmbGVjdGlvbiBjb25kaXRpb24gd2FzIGRldGVjdGVkLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX09OVV9BQ1RJVkFUSU9OX1NUQU5EQllfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJvbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAib251IGFjdGl2YXRpb24gc3RhbmRieSBjb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2UiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIk5vdGlmaWNhdGlvbiB0aGF0IGFuIE9OVXMgcG93ZXIgbWFuYWdlbWVudCBzdGF0ZSBoYXMgY2hhbmdlZC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9QT1NTSUJMRV9EUklGVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicG9zc2libGVfZHJpZnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkFuIE9OVSBpbiBhIGxvdyBwb3dlciBzdGF0ZSBtYXkgYmUgZXhwZXJpZW5jaW5nIGRyaWZ0IGJleW9uZCB0aGUgY29uZmlndXJlZCB0aHJlc2hvbGQuIFRoZSBlc3RpbWF0ZSBtYXkgYmUgaW5hY2N1cmF0ZSBkZXBlbmRpbmcgb24gT05VIGJlaGF2aW9yLiBBY3R1YWwgZHJpZnQgbWF5IGJlIGxlc3MgdGhhbiBlc3RpbWF0ZWQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaXMgbm8gbG9uZ2VyIG1ldC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImF1dG9fY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX09QRVJfSURfU0VUX09OVV9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic2V0X29udV9zdGF0ZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2V0IE9OVSBTdGF0ZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9PUEVSX0lEX1JTU0lfTUVBU1VSRU1FTlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJzc2lfbWVhc3VyZW1lbnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJTU0kgTWVhc3VyZW1lbnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfT1BFUl9JRF9DSEFOR0VfUE9XRVJfTEVWRUw6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNoYW5nZV9wb3dlcl9sZXZlbCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiQ2hhbmdlIFBvd2VyIExldmVsIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9QUk9YWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfUFJPWFlfSURfQ1BVX1BBQ0tFVFM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNwdV9wYWNrZXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJHUE9OIENQVSBQYWNrZXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1BST1hZX0lEX1BMT0FNX1BBQ0tFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicGxvYW1fcGFja2V0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJQTE9BTSBQYWNrZXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1BST1hZX1JYOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9QUk9YWV9SWF9JRF9DUFVfUEFDS0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjcHVfcGFja2V0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbmRpY2F0ZXMgQ1BVIHBhY2tldCB3YXMgcmVjZWl2ZWQgb24gdGhlIFVTIGZyb20gdGhpcyBPTlUgaWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfUFJPWFlfUlhfSURfT01DSV9QQUNLRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm9tY2lfcGFja2V0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbmRpY2F0ZXMgT01DSSBwYWNrZXQgd2FzIHJlY2VpdmVkIG9uIHRoZSBVUyBmcm9tIHRoaXMgT05VIGlkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX1RSWDoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9MT0dfRU5UUlk6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJzdGF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJtc2dfY291bnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIm1zZyBjb3VudCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImxvc3RfbXNnX2NvdW50IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJsb3N0IG1zZyBjb3VudCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTE9HX0VOVFJZX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dfRU5UUllfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJhdXRvX2NmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9MT0dHRVI6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJzdGF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJsaW5lc19pbl9sb2ciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImxpbmVzIGluIGxvZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTE9HR0VSX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dHRVJfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJhdXRvX2NmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dHRVJfT1BFUl9JRF9DTEVBUl9MT0c6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNsZWFyX2xvZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiY2xlYXIgbG9nIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9OTkk6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJzdGF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9mcmFtZXNfNjQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBjb3VudCBvZiBSWCA2NCBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9mcmFtZXNfNjVfMTI3IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgY291bnQgb2YgUlggNjUgdG8gMTI3IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2ZyYW1lc18xMjhfMjU1IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgY291bnQgb2YgUlggMTI4IHRvIDI1NSBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9mcmFtZXNfMjU2XzUxMSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIGNvdW50IG9mIFJYIDI1NiB0byA1MTEgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfZnJhbWVzXzUxMl8xMDIzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgY291bnQgb2YgUlggNTEyIHRvIDEwMjMgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfZnJhbWVzXzEwMjRfMTUxOCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIGNvdW50IG9mIFJYIDEwMjQgdG8gMTUxOCBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9mcmFtZXNfMTUxOV8yMDQ3IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgY291bnQgb2YgUlggMTUxOSB0byAyMDQ3IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2ZyYW1lc18yMDQ4XzQwOTUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBjb3VudCBvZiBSWCAyMDQ4IHRvIDQwOTUgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfZnJhbWVzXzQwOTZfOTIxNiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIGNvdW50IG9mIFJYIDQwOTYgdG8gOTIxNiBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9mcmFtZXNfOTIxN18xNjM4MyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIGNvdW50IG9mIFJYIDkyMTcgdG8gMTYzODMgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBmcmFtZXMgb24gdGhpcyBOTkkuIFRoaXMgaW5jbHVkZXMgYWxsIGVycm9yZWQgZnJhbWVzIGFzIHdlbGwuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2J5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIGJ5dGVzIG9uIHRoaXMgTk5JLiBUaGlzIGluY2x1ZGVzIGFsbCBlcnJvcmVkIGZyYW1lcyBhcyB3ZWxsLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9nb29kX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBnb29kIGZyYW1lcyBvbiB0aGlzIE5OSS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfdW5pY2FzdF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgdW5pY2FzdCBmcmFtZXMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X211bHRpY2FzdF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgbXVsdGljYXN0IGZyYW1lcyBvbiB0aGlzIE5OSS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfYnJvYWRjYXN0X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBicm9hZGNhc3QgZnJhbWVzIG9uIHRoaXMgTk5JLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9mY3NfZXJyb3JzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIEZDUyBlcnJvcnMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2NvbnRyb2xfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIGNvbnRyb2wgZnJhbWVzIG9uIHRoaXMgTk5JLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9wYXVzZV9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgcGF1c2UgZnJhbWVzIG9uIHRoaXMgTk5JLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9wZmNfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIFBGQyBmcmFtZXMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X3Vuc3VwcG9ydGVkX29wY29kZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBVbnN1cHBvcnRlZCBPcGNvZGUgZnJhbWVzIG9uIHRoaXMgTk5JLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF91bnN1cHBvcnRlZF9kYSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCB1bnN1cHBvcnRlZCBEQSBmcmFtZXMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2FsaWdubWVudF9lcnJvcnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgYWxpZ25tZW50IGVycm9ycyBvbiB0aGlzIE5OSS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfbGVuZ3RoX291dF9vZl9yYW5nZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBsZW5ndGggb3V0IG9mIHJhbmdlIGVycm9ycyBvbiB0aGlzIE5OSS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfY29kZV9lcnJvcnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgY29kZSBlcnJvcnMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X292ZXJzaXplZF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgb3ZlcnNpemVkIGZyYW1lcyBvbiB0aGlzIE5OSS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfamFiYmVyX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBqYWJiZXIgZnJhbWVzIG9uIHRoaXMgTk5JLiB0aGVzZSBhcmUgb3ZlcnNpemVkIGZyYW1lcyB0aGF0IGFsc28gY29udGFpbiBhbiBpbnZhbGlkIENSQywgY29kZSBlcnJvciwgb3IgSUVFRSBsZW5ndGggY2hlY2sgZXJyb3IuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X210dV9jaGVja19lcnJvcnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgTVRVIENoZWNrIEVycm9ycyBvbiB0aGlzIE5OSS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyODoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfcHJvbWlzY3VvdXNfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIGZyYW1lcyBvbiB0aGlzIE5OSSB0aGF0IGFyZSBub3QgY29udHJvbCBwYWNrZXRzIGFuZCBoYXZlIGEgREEgdGhhdCBpcyBub3QgbWF0Y2hpbmcgd2l0aCB0aGUgUlggU0EuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X3ZsYW5fZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIFZMQU4gdGFnZ2VkIGZyYW1lcyBvbiB0aGlzIE5OSSAod2l0aCBUUElEIDgxMDApLiBUaGlzIGNvdW50cyBib3RoIHNpbmdsZSBhbmQgZG91YmxlIHRhZ2dlZCBmcmFtZXMuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2RvdWJsZV92bGFuX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBkb3VibGUgVkxBTiB0YWdnZWQgZnJhbWVzIG9uIHRoaXMgTk5JICh3aXRoIFRQSUQgODEwMCkuICI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF90cnVuY2F0ZWRfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIHRydW5jYXRlZCBmcmFtZXMgb24gdGhpcyBOTkkuIFRoaXMgaXMgbGlrZWx5IGR1ZSB0byBSWCBGSUZPIEZ1bGwuICI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF91bmRlcnNpemVfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHJlY2VpdmVkIHVuZGVyc2l6ZWQgZnJhbWVzIG9uIHRoaXMgTk5JLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9mcmFnbWVudGVkX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiByZWNlaXZlZCBmcmFnbWVudGVkIGZyYW1lcyBvbiB0aGlzIE5OSS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfcnVudF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgcnVudCBmcmFtZXMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2ZyYW1lc182NCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIGNvdW50IG9mIFRYIDY0IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM2OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9mcmFtZXNfNjVfMTI3IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgY291bnQgb2YgVFggNjUgdG8gMTI3IGJ5dGUgZnJhbWVzIG9uIHRoaXMgTk5JLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM3OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9mcmFtZXNfMTI4XzI1NSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIGNvdW50IG9mIFRYIDEyOCB0byAyNTUgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2ZyYW1lc18yNTZfNTExIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgY291bnQgb2YgVFggMjU2IHRvIDUxMSBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfZnJhbWVzXzUxMl8xMDIzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgY291bnQgb2YgVFggNTEyIHRvIDEwMjMgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2ZyYW1lc18xMDI0XzE1MTgiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBjb3VudCBvZiBUWCAxMDI0IHRvIDE1MTggYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2ZyYW1lc18xNTE5XzIwNDciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBjb3VudCBvZiBUWCAxNTE5IHRvIDIwNDcgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2ZyYW1lc18yMDQ4XzQwOTUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBjb3VudCBvZiBUWCAyMDQ4IHRvIDQwOTUgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2ZyYW1lc180MDk2XzkyMTYiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBjb3VudCBvZiBUWCA0MDk2IHRvIDkyMTYgYnl0ZSBmcmFtZXMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2ZyYW1lc185MjE3XzE2MzgzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgY291bnQgb2YgVFggOTIxNyB0byAxNjM4MyBieXRlIGZyYW1lcyBvbiB0aGlzIE5OSS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0NToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIGZyYW1lcyBvbiB0aGlzIE5OSS4gVGhpcyBpbmNsdWRlcyBhbGwgZXJyb3JlZCBmcmFtZXMgYXMgd2VsbC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0NjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgYnl0ZXMgb24gdGhpcyBOTkkuIFRoaXMgaW5jbHVkZXMgYWxsIGVycm9yZWQgZnJhbWVzIGFzIHdlbGwuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2dvb2RfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIGdvb2QgZnJhbWVzIG9uIHRoaXMgTk5JLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ4OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF91bmljYXN0X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCB1bmljYXN0IGZyYW1lcyBvbiB0aGlzIE5OSS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfbXVsdGljYXN0X2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBtdWx0aWNhc3QgZnJhbWVzIG9uIHRoaXMgTk5JLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDUwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9icm9hZGNhc3RfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIGJyb2FkY2FzdCBmcmFtZXMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X3BhdXNlX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBwYXVzZSBmcmFtZXMgb24gdGhpcyBOTkkuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X3BmY19mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgUEZDIGZyYW1lcyBvbiB0aGlzIE5OSS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1MzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfamFiYmVyX2ZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBqYWJiZXIgZnJhbWVzIG9uIHRoaXMgTk5JLiBUaGVzZSBhcmUgb3ZlcnNpemVkIGZyYW1lcyB0aGF0IGFsc28gY29udGFpbiBhbiBpbnZhbGlkIEZDUy4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1NDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfZmNzX2Vycm9ycyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVGhlIG51bWJlciBvZiB0cmFuc21pdHRlZCBGQ1MgZXJyb3JzIG9uIHRoaXMgTk5JLiAiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1NToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfY29udHJvbF9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgY29udHJvbCBmcmFtZXMgb24gdGhpcyBOTkkuICI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU2OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9vdmVyc2l6ZV9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgb3ZlcnNpemVkIGZyYW1lcyBvbiB0aGlzIE5OSS4gIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2ZyYWdtZW50ZWRfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIGZyYWdtZW50ZWQgZnJhbWVzIG9uIHRoaXMgTk5JLiAiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1ODoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfZXJyb3JfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIGVycm9yZWQgZnJhbWVzIG9uIHRoaXMgTk5JLiAiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfdmxhbl9mcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRoZSBudW1iZXIgb2YgdHJhbnNtaXR0ZWQgVkxBTiB0YWdnZWQgZnJhbWVzIG9uIHRoaXMgTk5JICh3aXRoIFRQSUQgODEwMCkuIFRoaXMgY291bnRzIGJvdGggc2luZ2xlIGFuZCBkb3VibGUgdGFnZ2VkIGZyYW1lcy4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2MDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfZG91YmxlX3ZsYW5fZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIGRvdWJsZSBWTEFOIHRhZ2dlZCBmcmFtZXMgb24gdGhpcyBOTkkgKHdpdGggVFBJRCA4MTAwKS4gIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X3J1bnRfZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIHJ1bnQgZnJhbWVzIG9uIHRoaXMgTk5JLiAiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2MjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfdW5kZXJydW5fZnJhbWVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUaGUgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIHVuZGVycnVuIGZyYW1lcyBvbiB0aGlzIE5OSS4gVGh1cyBoYXBwZW5zIHdoZW4gYSBmcmFtZSBlbmNvdW50ZXJzIGEgTUFDIHVuZGVycnVuIChUeCBTeW5jIEZJRk8gcnVucyBvdXQgb2YgZGF0YSBiZWZvcmUgdGhlIGVuZCBvZiBwYWNrZXQpLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX0FVVE9fSURfU1RBVFVTX0NIQU5HRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXR1c19jaGFuZ2VkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJOTkkgTGluayBzdGF0dXMgY2hhbmdlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaXMgbm8gbG9uZ2VyIG1ldC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImF1dG9fY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX05OSV9TRVJERVM6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfU09GVFdBUkVfRVJST1I6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfVFJYX0NBTElCUkFUSU9OOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQVVUT19JRF9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkNhcHR1cmUgd2luZG93IGFuZCBzdGF0aXN0aWMgY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJhdXRvX2NmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fT1BFUl9JRF9TVEFSVF9DQVBUVVJFX1dJTkRPVzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhcnRfY2FwdHVyZV93aW5kb3ciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gInN0YXJ0IGNhcHR1cmUgd2luZG93IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1RSWF9DQUxJQlJBVElPTl9PUEVSX0lEX1NUT1BfQ0FQVFVSRV9XSU5ET1c6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0b3BfY2FwdHVyZV93aW5kb3ciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gInN0b3AgY2FwdHVyZSB3aW5kb3ciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIk51bWJlciBvZiBhbGxvYyBJRCByZWNlaXZlZCBieXRlcy4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNvbmZpZ3VyYXRpb25fY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJDb25maWd1cmF0aW9uIENvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9BTExPQ19BVVRPX0lEX0dFVF9BTExPQ19TVEFUU19DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImdldF9hbGxvY19zdGF0c19jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkNvbGxlY3RlZCBhbGxvYyBJRCBzdGF0aXN0aWNzIGZyb20gZ2V0X3N0YXRzIG9wZXJhdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9BTExPQ19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRfYWxhcm1fY2xlYXJlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGlzIG5vIGxvbmdlciBtZXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJhdXRvX2NmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW5kaWNhdGlvbiBDb25maWd1cmF0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9BTExPQ19PUEVSX0lEX0dFVF9TVEFUUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZ2V0X3N0YXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSdW4gc3RhdGlzdGljcyBjb2xsZWN0aW9uIGZvciBhIGdpdmVuIHBlcmlvZCBvZiB0aW1lIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX0FMTE9DX09QRVJfSURfU0VUX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzZXRfc3RhdGUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNldHMgdGhlIGFsbG9jJ3MgYWN0aXZhdGlvbiBzdGF0ZS4gIFRoaXMgaXMgb25seSB1c2VkIGZvciBwcm90ZWN0aW9uIHN3aXRjaGluZyBvbiBhbiBhY3RpdmUtc3RhbmRieSBQT04uICBJbiBub3JtYWwgb3BlcmF0aW9uLCB0aGlzIGlzbid0IG5lY2Vzc2FyeSBzaW5jZSBhbGxvY3MgYXJlIGFjdGl2YXRlZC9kZWFjdGl2YXRlZCBhdXRvbWF0aWNhbGx5IGFsb25nIHdpdGggdGhlIE9OVS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1hHUE9OX0dFTV9QT1JUOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAic3RhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRYIGJ5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfcGFja2V0cyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVFggcGFja2V0cyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X3BhY2tldHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJYIHBhY2tldHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9ieXRlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUlggYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX0dFTV9QT1JUX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXRfYWxhcm1fcmFpc2VkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdF9hbGFybV9jbGVhcmVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZW50IHdoZW4gYSBjb25maWd1cmVkIHN0YXRpc3RpYyBhbGFybSBjb25kaXRpb24gaXMgbm8gbG9uZ2VyIG1ldC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImF1dG9fY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbmRpY2F0aW9uIENvbmZpZ3VyYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1hHUE9OX0lXRjoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9YR1BPTl9OSToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gInN0YXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZlY19jb2Rld29yZHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmUgRkVDIGNvZGV3b3JkcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImJpcDMyX2J5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBieXRlcyBwcm90ZWN0ZWQgYnkgYmlwMzIiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJiaXAzMl9lcnJvcnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIGJpcDMyIGVycm9ycyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X3hndGNfaGVhZGVycyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgdmFsaWQgWEdUQyBoZWFkZXJzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfeGd0Y19jb3JyZWN0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIGNvcnJlY3RlZCBYR1RDIGhlYWRlcnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF94Z3RjX3VuY29ycmVjdGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCB1bmNvcnJlY3RlZCBYR1RDIGhlYWRlcnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF94Z2VtIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCB2YWxpZCBYR0VNIGZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X3hnZW1fZHJvcHBlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgZHJvcHBlZCBYR0VNIElEIGZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X3hnZW1faWRsZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgaWRsZSBYR0VNIGZyYW1lcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X3hnZW1fY29ycmVjdGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBjb3JyZWN0ZWQgWEdFTSBmcmFtZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfY3JjX2Vycm9yIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBwYWNrZXRzIHdpdGggQ1JDIGVycm9yIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2ZyYWdtZW50X2Vycm9yIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBmcmFnbWVudCBlcnJvcnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfcGFja2V0c19kcm9wcGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJHbG9iYWwgZHJvcHBlZCBwYWNrZXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2Ryb3BwZWRfdG9vX3Nob3J0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBwYWNrZXRzIGRyb3BwZWQgZHVlIHRvIGxlbmd0aCB0b28gc2hvcnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfZHJvcHBlZF90b29fbG9uZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgcGFja2V0IGRyb3BwZWQgZHVlIHRvIGxlbmd0aCB0b28gbG9uZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9rZXlfZXJyb3IiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIGtleSBlcnJvcnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfcGxvYW1zIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUcmFuc21pdHRlZCBQbG9hbXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfcGxvYW1zX2Ryb3BwZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIGRyb3BwZWQgUGxvYW1zIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2FsbG9jYXRpb25zX3ZhbGlkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCB2YWxpZCBhbGxvY2F0aW9ucyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9hbGxvY2F0aW9uc19pbnZhbGlkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBpbnZhbGlkIGFsbG9jYXRpb25zIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X2FsbG9jYXRpb25zX2Rpc2FibGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBkaXNhYmxlZCBhbGxvY2F0aW9ucyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9wbG9hbXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIFBsb2FtcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9wbG9hbXNfbm9uX2lkbGUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIG5vbiBpZGxlIFBsb2FtcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9wbG9hbXNfZXJyb3IiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIGVycm9yIFBsb2FtcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9jcHUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIENQVSBwYWNrZXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X29tY2kiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIE9NQ0kgcGFja2V0cyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI2OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF9vbWNpX3BhY2tldHNfY3JjX2Vycm9yIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlZCBPTUNJIHBhY2tldHMgd2l0aCBDUkMgZXJyb3JzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X3BhY2tldHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRyYW5zbWl0dGVkIHBhY2tldHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyODoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfeGdlbSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVHJhbnNtaXR0ZWQgWEdFTSBmcmFnbWVudHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfY3B1IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUcmFuc21pdHRlZCBDUFUgcGFja2V0cyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0eF9vbWNpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUcmFuc21pdHRlZCBPTUNJIHBhY2tldHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfY3B1X29tY2lfcGFja2V0c19kcm9wcGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUcmFuc21pdCBwYWNrZXRzIGRyb3BwZWQgZHVlIHRvIGlsbGVnYWwgbGVuZ3RoIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2Ryb3BwZWRfaWxsZWdhbF9sZW5ndGgiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRyYW5zbWl0IHBhY2tldHMgZHJvcHBlZCBkdWUgdG8gaWxsZWdhbCBsZW5ndGgiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfZHJvcHBlZF90cGlkX21pc3MiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRyYW5zbWl0IHBhY2tldHMgZHJvcHBlZCBkdWUgdG8gVFBJRCBtaXNzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X2Ryb3BwZWRfdmlkX21pc3MiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRyYW5zbWl0IHBhY2tldHMgZHJvcGVkIGR1ZSB0byBWSUQgbWlzcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9TVEFURV9DSEFOR0VfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0ZV9jaGFuZ2VfY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTdGF0ZSBDaGFuZ2UgQ29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfTE9TOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJsb3MiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkxPUyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1NFUklBTF9OVU1CRVJfQUNRVUlTSVRJT05fQ1lDTEVfU1RBUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInNlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlcmlhbCBOdW1iZXIgQWNxdWlzaXRpb24gQ3ljbGUgU3RhcnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19UUkFGRklDX1JFU1VNRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlByb3RlY3Rpb24gU3dpdGNoaW5nIFRyYWZmaWMgUmVzdW1lIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInByb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJBZnRlciBhIHN3aXRjaG92ZXIgaXMgY29tcGxldGUgYW5kIGFsbCBPTlUgcmFuZ2luZyB0aW1lcyBoYXZlIHN0YWJpbGl6ZWQsIHRoaXMgaW5kaWNhdGlvbiBpcyBzZW50IHRvIGluZm9ybSB0aGUgaG9zdCBvZiBhbGwgbmV3IE9OVSBFUURzLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1NXSVRDSE9WRVJfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJwcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUHJvdGVjdGlvbiBTd2l0Y2hpbmcgU3dpdGNob3ZlciBDb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9TVEFOREJZX1BPTl9NT05JVE9SSU5HX0NZQ0xFX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlN0YW5kYnkgUE9OIE1vbml0b3JpbmcgQ3ljbGUgQ29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfT05VX0RJU0NPVkVSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm9udV9kaXNjb3ZlcmVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJPTlUgRGlzY292ZXJlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX0NQVV9QQUNLRVRTX0ZBSUxVUkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNwdV9wYWNrZXRzX2ZhaWx1cmUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkEgZmFpbHVyZSB3YXMgZW5jb3VudGVyZWQgZHVyaW5nIHRoZSBcImNwdV9wYWNrZXRzXCIgcHJveHkgb3BlcmF0aW9uLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJvZ3VlIGRldGVjdGlvbiBjb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9ERUFDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkluZGljYXRlIHRoZSBkZWFjdGl2YXRpb24gb2YgYWxsIE9OVXMgYXJlIGNvbXBsZXRlZCwgaW4gcmVzcG9uc2UgdG8gJ3NldF9vbnVfc3RhdGUnIG9wZXJhdGlvbi4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9ESVNBQkxFX0FMTF9PTlVTX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkluZGljYXRlIHRoZSBkaXNhYmxpbmcgYWxsIE9OVXMgYXJlIGNvbXBsZXRlZCwgaW4gcmVzcG9uc2UgdG8gJ3NldF9vbnVfc3RhdGUnIG9wZXJhdGlvbi4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9BQ1RJVkFURV9BTExfT05VU19DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW5kaWNhdGUgdGhlIGFjdGl2YXRpb24gb2YgYWxsIE9OVXMgYXJlIGNvbXBsZXRlZCwgaW4gcmVzcG9uc2UgdG8gJ3NldF9vbnVfc3RhdGUnIG9wZXJhdGlvbi4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9FTkFCTEVfQUxMX09OVVNfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJlbmFibGVfYWxsX29udXNfY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbmRpY2F0ZSB0aGUgZW5hYmxpbmcgYWxsIE9OVXMgYXJlIGNvbXBsZXRlZCwgaW4gcmVzcG9uc2UgdG8gJ3NldF9vbnVfc3RhdGUnIG9wZXJhdGlvbi4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9UT0RfUkVRVUVTVF9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInRvZF9yZXF1ZXN0X2NvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVE9EIHJlcXVlc3QgY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfT05VX1VQR1JBREVfQ09NUExFVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm9udV91cGdyYWRlX2NvbXBsZXRlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJPTlUgVXBncmFkZSBDb21wbGV0ZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1JPR1VFX09OVV9TUEVDSUFMX01BUF9DWUNMRV9TVEFSVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSb2d1ZSBPTlUgc3BlY2lhbCBtYXAgY3ljbGUgc3RhcnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3RhdF9hbGFybV9yYWlzZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBpcyBubyBsb25nZXIgbWV0LiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYXV0b19jZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9TRVRfUE9OX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzZXRfcG9uX3N0YXRlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTZXQgUE9OIFN0YXRlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfUkVTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJlc2V0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZXNldCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX0RJU0FCTEVfU0VSSUFMX05VTUJFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZGlzYWJsZV9zZXJpYWxfbnVtYmVyIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJEaXNhYmxlIFNlcmlhbCBOdW1iZXIiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9TSU5HTEVfUkVRVUVTVF9TVEFOREJZX1BPTl9NT05JVE9SSU5HOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzaW5nbGVfcmVxdWVzdF9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJTaW5nbGUgcmVxdWVzdCBzdGFuZGJ5IFBPTiBNb25pdG9yaW5nIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfU0VUX09OVV9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic2V0X29udV9zdGF0ZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2V0IHRoZSBvcGVyYXRpb24gc3RhdGUgb2YgYWxsIE9OVXMuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfUlVOX1NQRUNJQUxfQldfTUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJydW5fc3BlY2lhbF9id19tYXAiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJ1biBTcGVjaWFsIEJXIE1hcCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1JPR1VFX0RFVEVDVElPTl9XSU5ET1c6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJvZ3VlX2RldGVjdGlvbl93aW5kb3ciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJvZ3VlIERldGVjdGlvbiBXaW5kb3ciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9UT0RfUkVRVUVTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidG9kX3JlcXVlc3QiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlRPRCByZXF1ZXN0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfU1RBUlRfT05VX1VQR1JBREU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXJ0X29udV91cGdyYWRlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJPTFQgdG8gT05VIGZpcm13YXJlIHRyYW5zZmVyIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfQURKVVNUX1RYX1dBVkVMRU5HVEg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImFkanVzdF90eF93YXZlbGVuZ3RoIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbnN0cnVjdCBhbiB1bmFzc2lnbmVkIE9OVSB0byBhZGp1c3QgaXRzIHVwc3RyZWFtIHRyYW5zbWl0dGVyIHdhdmVsZW5ndGgiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1BST1hZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9QUk9YWV9JRF9DUFVfUEFDS0VUUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY3B1X3BhY2tldHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlhHUE9OIENQVSBwYWNrZXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX1BST1hZX0lEX0JST0FEQ0FTVF9QTE9BTV9QQUNLRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImJyb2FkY2FzdF9wbG9hbV9wYWNrZXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkJyb2FkY2FzdCBQTE9BTSBQYWNrZXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1hHUE9OX09OVToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJrZXkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNmZyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInN0YXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gInN0YXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInBvc2l0aXZlX2RyaWZ0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJwb3NpdGl2ZSBkcmlmdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm5lZ2F0aXZlX2RyaWZ0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJuZWdhdGl2ZSBkcmlmdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImRlbGltaXRlcl9taXNzX2RldGVjdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiZGVsaW1pdGVyIG1pc3MgZGV0ZWN0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYmlwMzJfZXJyb3JzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJiaXAzMiBlcnJvcnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyeF93b3JkcyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiTnVtYmVyIG9mIDQtYnl0ZSB3b3JkcyByZWNlaXZlZCAod29yZCBzaXplIGlzIDQgYnl0ZXMgcmVnYXJkbGVzcyBvZiB1cHN0cmVhbSBkYXRhIHJhdGUpLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImZlY19jb3JyZWN0ZWRfc3ltYm9scyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiZmVjIGNvcnJlY3RlZCBzeW1ib2xzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZmVjX2NvcnJlY3RlZF9jb2Rld29yZHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gImZlYyBjb3JyZWN0ZWQgY29kZXdvcmRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZmVjX3VuY29ycmVjdGFibGVfY29kZXdvcmRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJmZWMgdW5jb3JyZWN0YWJsZSBjb2Rld29yZHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJmZWNfY29kZXdvcmRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJmZWMgdG90YWwgY29kZXdvcmRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZmVjX2NvcnJlY3RlZF9iaXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJmZWMgY29ycmVjdGVkIGJpdHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAieGdlbV9rZXlfZXJyb3JzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJ4Z2VtIGtleSBlcnJvciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ4Z2VtX2xvc3MiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gInhnZW0gbG9zcyAiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfcGxvYW1zX21pY19lcnJvciI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAibWljIGVycm9yIHBsb2FtIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X3Bsb2Ftc19ub25faWRsZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAibm9uIGlkbGUgcGxvYW0iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfb21jaSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZWQgT01DSSBwYWNrZXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X29tY2lfcGFja2V0c19jcmNfZXJyb3IiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlY2VpdmVkIE9NQ0kgcGFja2V0cyB3aXRoIENSQyBlcnJvcnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicnhfYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gInJ4IGJ5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJ4X3BhY2tldHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gInJ4IHBhY2tldHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxODoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAidHhfYnl0ZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gInR4IGJ5dGVzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR4X3BhY2tldHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gInR4IHBhY2tldHMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09OVV9BTEFSTToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAib251X2FsYXJtIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJPTlUgQWxhcm0iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfRE9XSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZG93aSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiRHJpZnQgb2YgV2luZG93IG9mIE9OVWkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfU0ZJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzZmkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNpZ25hbCBGYWlsIG9mIE9OVWkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfU0RJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzZGkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNpZ25hbCBEZWdyYWRlZCBvZiBPTlVpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX0RGSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZGZpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSZWNlaXZlIER5aW5nLUdhc3Agb2YgT05VaSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9QUVNJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJwcXNpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJwbG9hbSBxdWV1ZSBzdGF0dXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfU1VGSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic3VmaSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU1VGaSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9USVdJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJ0aXdpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJUcmFuc21pc3Npb24gSW50ZXJmZXJlbmNlIFdhcm5pbmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfTE9PQ0k6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImxvb2NpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJMT09DaSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9SQU5HSU5HX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicmFuZ2luZ19jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJhbmdpbmcgQ29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAib251X2FjdGl2YXRpb25fY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJPTlUgQWN0aXZhdGlvbiBDb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm9udV9kZWFjdGl2YXRpb25fY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJPTlUgRGVhY3RpdmF0aW9uIENvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9PTlVfRU5BQkxFX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAib251X2VuYWJsZV9jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIk9OVSBFbmFibGUgQ29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09OVV9ESVNBQkxFX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAib251X2Rpc2FibGVfY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJPTlUgRGlzYWJsZSBDb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInJzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSU1NJIE1lYXN1cmVtZW50IENvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9JTlZBTElEX0RCUlVfUkVQT1JUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJpbnZhbGlkX2RicnVfcmVwb3J0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbnZhbGlkIERCUnUgUmVwb3J0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX0tFWV9FWENIQU5HRV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleV9leGNoYW5nZV9jb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIktleSBFeGNoYW5nZSBDb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfS0VZX0VYQ0hBTkdFX0tFWV9SRVFVRVNUX1RJTUVPVVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJLZXkgRXhjaGFuZ2UgS2V5IFJlcXVlc3QgVGltZW91dCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfQ1lDTEVfU0tJUFBFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAia2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIktleSBFeGNoYW5nZSBDeWNsZSBTa2lwcGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0g6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2giOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIktleSBFeGNoYW5nZSBLZXkgTWlzbWF0Y2giOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT1BUSUNBTF9SRUZMRUNUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJvcHRpY2FsX3JlZmxlY3Rpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkFuIG9wdGljYWwgcmVmbGVjdGlvbiBjb25kaXRpb24gd2FzIGRldGVjdGVkLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9ER0k6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImRnaSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVjZWl2ZSBEeWluZy1HYXNwIG9mIE9OVWkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfUE9XRVJfTUFOQUdFTUVOVF9TVEFURV9DSEFOR0U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInBvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJOb3RpZmljYXRpb24gdGhhdCBhbiBPTlVzIHBvd2VyIG1hbmFnZW1lbnQgc3RhdGUgaGFzIGNoYW5nZWQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1BPU1NJQkxFX0RSSUZUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJwb3NzaWJsZV9kcmlmdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiQW4gT05VIGluIGEgbG93IHBvd2VyIHN0YXRlIG1heSBiZSBleHBlcmllbmNpbmcgZHJpZnQgYmV5b25kIHRoZSBjb25maWd1cmVkIHRocmVzaG9sZC4gVGhlIGVzdGltYXRlIG1heSBiZSBpbmFjY3VyYXRlIGRlcGVuZGluZyBvbiBPTlUgYmVoYXZpb3IuIEFjdHVhbCBkcmlmdCBtYXkgYmUgbGVzcyB0aGFuIGVzdGltYXRlZC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfUkVHSVNUUkFUSU9OX0lEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyZWdpc3RyYXRpb25faWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlJlZ2lzdHJhdGlvbiBJRCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9QT1dFUl9MRVZFTF9SRVBPUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInBvd2VyX2xldmVsX3JlcG9ydCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUG93ZXIgbGV2ZWwgcmVwb3J0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1BPV0VSX0NPTlNVTVBUSU9OX1JFUE9SVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAicG93ZXJfY29uc3VtcHRpb25fcmVwb3J0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJQb3dlciBjb25zdW1wdGlvbiByZXBvcnQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfU0VDVVJFX01VVFVBTF9BVVRIRU5USUNBVElPTl9GQUlMVVJFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmUiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkZhaWx1cmUgb2Ygc2VjdXJlIG11dHVhbCBhdXRoZW50aWNhdGlvbiBkdWUgdG8gTUlDIGVycm9yIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09OVV9UVU5JTkdfT1VUX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAib251X3R1bmluZ19vdXRfY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJPTlUgVHVuaW5nIG91dCBjb21wbGV0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT05VX1RVTklOR19JTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gIm9udV90dW5pbmdfaW5fY29tcGxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJPTlUgVHVuaW5nIGluIGNvbXBsZXRlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9UVU5JTkdfUkVTUE9OU0U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gInR1bmluZ19yZXNwb25zZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiVHVuaW5nIHJlc3BvbnNlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0X2FsYXJtX3JhaXNlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2VudCB3aGVuIGEgY29uZmlndXJlZCBzdGF0aXN0aWMgYWxhcm0gY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzdGF0X2FsYXJtX2NsZWFyZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlNlbnQgd2hlbiBhIGNvbmZpZ3VyZWQgc3RhdGlzdGljIGFsYXJtIGNvbmRpdGlvbiBpcyBubyBsb25nZXIgbWV0LiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiYXV0b19jZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIkluZGljYXRpb24gQ29uZmlndXJhdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfU0VUX09OVV9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAic2V0X29udV9zdGF0ZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiU2V0IE9OVSBTdGF0ZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9SU1NJX01FQVNVUkVNRU5UOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyc3NpX21lYXN1cmVtZW50IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJSU1NJIE1lYXN1cmVtZW50IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX1JFUVVFU1RfUkVHSVNUUkFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJyZXF1ZXN0X3JlZ2lzdHJhdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiUmVxdWVzdCB0aGUgT05VIHRvIHNlbmQgaXRzIFJlZ2lzdHJhdGlvbiBJRCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9DSEFOR0VfUE9XRVJfTEVWRUxMSU5HOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJDaGFuZ2UgcG93ZXIgbGV2ZWxsaW5nIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX0dFVF9QT1dFUl9MRVZFTDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiZ2V0X3Bvd2VyX2xldmVsIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJPTlUgc2hvdWxkIHJlcG9ydCBpdHMgbGF1bmNoIG9wdGljYWwgcG93ZXIgbGV2ZWwgYXMgcGFydCBvZiB0aGUgQWNrbm93bGVkZ21lbnQgUGxvYW0gbWVzc2FnZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9HRVRfUE9XRVJfQ09OU1VNUFRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImdldF9wb3dlcl9jb25zdW1wdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiT05VIHNob3VsZCByZXBvcnQgaXRzIHBvd2VyIGNvbnN1bXB0aW9uIGluZm9ybWF0aW9uIHZpYSB0aGUgUG93ZXIgQ29uc3VtcHRpb24gUmVwb3J0IFBsb2FtIG1lc3NhZ2UiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfQURKVVNUX1RYX1dBVkVMRU5HVEg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImFkanVzdF90eF93YXZlbGVuZ3RoIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbnN0cnVjdCB0aGUgT05VIHRvIGFkanVzdCBpdHMgdXBzdHJlYW0gdHJhbnNtaXR0ZXIgd2F2ZWxlbmd0aCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9TRUNVUkVfTVVUVUFMX0FVVEhFTlRJQ0FUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJzZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJPTUNJIGJhc2Ugc2VjdXJlIG11dHVhbCBhdXRoZW50aWNhdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9PTlVfVFVOSU5HX0lOOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJvbnVfdHVuaW5nX2luIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJPTlUgVHVuaW5nIGluIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX09OVV9UVU5JTkdfT1VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJvbnVfdHVuaW5nX291dCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiT05VIFR1bmluZyBvdXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1BST1hZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfUFJPWFlfSURfUExPQU1fUEFDS0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJwbG9hbV9wYWNrZXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc2NyID0gIlBMT0FNIFBhY2tldCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfUFJPWFlfSURfQ1BVX1BBQ0tFVFM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImNwdV9wYWNrZXRzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJYR1BPTiBDUFUgcGFja2V0cyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFlfUlg6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9QUk9YWV9SWF9JRF9DUFVfUEFDS0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJjcHVfcGFja2V0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJJbmRpY2F0ZXMgQ1BVIHBhY2tldCB3YXMgcmVjZWl2ZWQgb24gdGhlIFVTIGZyb20gdGhpcyBPTlUgaWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1BST1hZX1JYX0lEX09NQ0lfUEFDS0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSA9ICJvbWNpX3BhY2tldCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAiSW5kaWNhdGVzIE9NQ0kgcGFja2V0IHdhcyByZWNlaXZlZCBvbiB0aGUgVVMgZnJvbSB0aGlzIE9OVSBpZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfWEdQT05fVFJYOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lID0gImtleSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzY3IgPSAia2V5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUgPSAiY2ZnIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXNjciA9ICJjZmciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1JBTkdFOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOyAgICAvKio8ICBzaG91bGQgbmV2ZXIgaGFwcGVuLiAqLworfQorCitzdGF0aWMgYmNtY2xpX3Byb3BfZGVzY3IgKipvYmpfZ2V0X3Byb3BfYXJyYXkoYmNtb2x0X29ial9pZCBvYmosIGJjbW9sdF9tZ3RfZ3JvdXAgZ3JvdXAsIHVpbnQxNl90IHN1Ymdyb3VwLCB1aW50MzJfdCAqc2l6ZSkKK3sKKyAgICBzd2l0Y2ggKG9iaikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9BRV9OSToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGFlX25pX2tleV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWVfbmlfa2V5X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoYWVfbmlfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhZV9uaV9jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9OSV9PUEVSX0lEX1NFVF9BRV9OSV9FTl9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihhZV9uaV9zZXRfYWVfbmlfZW5fc3RhdGVfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFlX25pX3NldF9hZV9uaV9lbl9zdGF0ZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0FFX1BBVEhfRFM6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihhZV9wYXRoX2RzX2tleV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWVfcGF0aF9kc19rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoYWVfcGF0aF9kc19zdGF0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhZV9wYXRoX2RzX3N0YXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihhZV9wYXRoX2RzX3N0YXRfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhZV9wYXRoX2RzX3N0YXRfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9EU19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGFlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFlX3BhdGhfZHNfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0FFX1BBVEhfRFNfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFlX3BhdGhfZHNfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihhZV9wYXRoX2RzX2F1dG9fY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhZV9wYXRoX2RzX2F1dG9fY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfQUVfUEFUSF9VUzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGFlX3BhdGhfdXNfa2V5X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhZV9wYXRoX3VzX2tleV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihhZV9wYXRoX3VzX3N0YXRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFlX3BhdGhfdXNfc3RhdF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGFlX3BhdGhfdXNfc3RhdF9jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFlX3BhdGhfdXNfc3RhdF9jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9BRV9QQVRIX1VTX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfQUVfUEFUSF9VU19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihhZV9wYXRoX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWVfcGF0aF91c19zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGFlX3BhdGhfdXNfYXV0b19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFlX3BhdGhfdXNfYXV0b19jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9DSEFOTkVMOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoY2hhbm5lbF9rZXlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoYW5uZWxfa2V5X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoY2hhbm5lbF9jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoYW5uZWxfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfREVCVUc6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihkZWJ1Z19rZXlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlYnVnX2tleV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGRlYnVnX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVidWdfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVCVUdfQVVUT19JRF9DTElfT1VUUFVUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGRlYnVnX2NsaV9vdXRwdXRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlYnVnX2NsaV9vdXRwdXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFQlVHX0FVVE9fSURfRklMRV9BTE1PU1RfRlVMTDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihkZWJ1Z19maWxlX2FsbW9zdF9mdWxsX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWJ1Z19maWxlX2FsbW9zdF9mdWxsX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihkZWJ1Z19hdXRvX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVidWdfYXV0b19jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERUJVR19PUEVSX0lEX0NMSV9JTlBVVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihkZWJ1Z19jbGlfaW5wdXRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlYnVnX2NsaV9pbnB1dF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVCVUdfT1BFUl9JRF9TVEFSVF9BUElfQ0FQVFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihkZWJ1Z19zdGFydF9hcGlfY2FwdHVyZV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVidWdfc3RhcnRfYXBpX2NhcHR1cmVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFQlVHX09QRVJfSURfU1RPUF9BUElfQ0FQVFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihkZWJ1Z19zdG9wX2FwaV9jYXB0dXJlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWJ1Z19zdG9wX2FwaV9jYXB0dXJlX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERUJVR19PUEVSX0lEX1JFU0VUX0FQSV9DQVBUVVJFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGRlYnVnX3Jlc2V0X2FwaV9jYXB0dXJlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWJ1Z19yZXNldF9hcGlfY2FwdHVyZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0RFVklDRToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGRldmljZV9rZXlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRldmljZV9rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihkZXZpY2VfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2VfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0FVVE9fSURfREVWSUNFX1JFQURZOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGRldmljZV9kZXZpY2VfcmVhZHlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRldmljZV9kZXZpY2VfcmVhZHlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9BVVRPX0lEX0NPTk5FQ1RJT05fRVNUQUJMSVNIRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZGV2aWNlX2Nvbm5lY3Rpb25fZXN0YWJsaXNoZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRldmljZV9jb25uZWN0aW9uX2VzdGFibGlzaGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9ERVZJQ0VfS0VFUF9BTElWRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihkZXZpY2VfZGV2aWNlX2tlZXBfYWxpdmVfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRldmljZV9kZXZpY2Vfa2VlcF9hbGl2ZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0FVVE9fSURfQ09OTkVDVElPTl9GQUlMVVJFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGRldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRldmljZV9jb25uZWN0aW9uX2ZhaWx1cmVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9BVVRPX0lEX0NPTk5FQ1RJT05fQ09NUExFVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZGV2aWNlX2Nvbm5lY3Rpb25fY29tcGxldGVfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9ESVNDT05ORUNUSU9OX0NPTVBMRVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGRldmljZV9kaXNjb25uZWN0aW9uX2NvbXBsZXRlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2VfZGlzY29ubmVjdGlvbl9jb21wbGV0ZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0FVVE9fSURfU1dfRVJST1I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZGV2aWNlX3N3X2Vycm9yX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2Vfc3dfZXJyb3JfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9BVVRPX0lEX1NXX0VYQ0VQVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihkZXZpY2Vfc3dfZXhjZXB0aW9uX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2Vfc3dfZXhjZXB0aW9uX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfQVVUT19JRF9JTkRJQ0FUSU9OU19EUk9QUEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGRldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2VfaW5kaWNhdGlvbnNfZHJvcHBlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0FVVE9fSURfSU1BR0VfVFJBTlNGRVJfQ09NUExFVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9BVVRPX0lEX0REUl9URVNUX0NPTVBMRVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGRldmljZV9kZHJfdGVzdF9jb21wbGV0ZV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihkZXZpY2VfYXV0b19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRldmljZV9hdXRvX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9PUEVSX0lEX0NPTk5FQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZGV2aWNlX2Nvbm5lY3RfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRldmljZV9jb25uZWN0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9ESVNDT05ORUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGRldmljZV9kaXNjb25uZWN0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2VfZGlzY29ubmVjdF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX09QRVJfSURfUkVTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZGV2aWNlX3Jlc2V0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2VfcmVzZXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9PUEVSX0lEX0hPU1RfS0VFUF9BTElWRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihkZXZpY2VfaG9zdF9rZWVwX2FsaXZlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2VfaG9zdF9rZWVwX2FsaXZlX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9TV19VUEdSQURFX0FDVElWQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGRldmljZV9zd191cGdyYWRlX2FjdGl2YXRlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2Vfc3dfdXBncmFkZV9hY3RpdmF0ZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX09QRVJfSURfSU1BR0VfVFJBTlNGRVJfU1RBUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0RFVklDRV9PUEVSX0lEX0lNQUdFX1RSQU5TRkVSX0RBVEE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRldmljZV9pbWFnZV90cmFuc2Zlcl9kYXRhX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9SVU5fRERSX1RFU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZGV2aWNlX3J1bl9kZHJfdGVzdF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlX3J1bl9kZHJfdGVzdF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0VQT05fREVOSUVEX0xJTks6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2RlbmllZF9saW5rX2tleV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9kZW5pZWRfbGlua19rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2RlbmllZF9saW5rX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9kZW5pZWRfbGlua19jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fSURfVU5LTk9XTl9MSU5LX1ZJT0xBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2RlbmllZF9saW5rX3Vua25vd25fbGlua192aW9sYXRpb25fcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fZGVuaWVkX2xpbmtfdW5rbm93bl9saW5rX3Zpb2xhdGlvbl9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX09WRVJIRUFEX1BST0ZJTEVfVklPTEFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25fcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25fcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19JRF9MQVNFUl9PTl9PRkZfVklPTEFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fZGVuaWVkX2xpbmtfbGFzZXJfb25fb2ZmX3Zpb2xhdGlvbl9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9kZW5pZWRfbGlua19sYXNlcl9vbl9vZmZfdmlvbGF0aW9uX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fSURfTUFYX0xJTktfVklPTEFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fZGVuaWVkX2xpbmtfbWF4X2xpbmtfdmlvbGF0aW9uX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX0xMSURfUE9PTF9FTVBUWV9WSU9MQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9kZW5pZWRfbGlua19sbGlkX3Bvb2xfZW1wdHlfdmlvbGF0aW9uX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb25fcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19JRF9TWVNURU1fUkVTT1VSQ0VfVklPTEFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fZGVuaWVkX2xpbmtfc3lzdGVtX3Jlc291cmNlX3Zpb2xhdGlvbl9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fSURfUkFOR0VfVklPTEFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fZGVuaWVkX2xpbmtfcmFuZ2VfdmlvbGF0aW9uX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX1RETV9DSEFOTkVMU19FWEhBVVNURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2RlbmllZF9saW5rX3RkbV9jaGFubmVsc19leGhhdXN0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fREVOSUVEX0xJTktfQVVUT19JRF9ST0dVRV9WSU9MQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb25fcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0RFTklFRF9MSU5LX0FVVE9fSURfVVBTVFJFQU1fQkFORFdJRFRIX1ZJT0xBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2RlbmllZF9saW5rX3Vwc3RyZWFtX2JhbmR3aWR0aF92aW9sYXRpb25fcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fZGVuaWVkX2xpbmtfdXBzdHJlYW1fYmFuZHdpZHRoX3Zpb2xhdGlvbl9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0VQT05fTElOSzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbGlua19rZXlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbGlua19rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2xpbmtfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2xpbmtfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbGlua19zdGF0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2xpbmtfc3RhdF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0MToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9saW5rX3N0YXRfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2xpbmtfc3RhdF9jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9LRVlfRVhDSEFOR0VfRkFJTFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX2ZhaWx1cmVfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbGlua19rZXlfZXhjaGFuZ2VfZmFpbHVyZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfRU5DUllQVElPTl9FTkFCTEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbGlua19lbmNyeXB0aW9uX2VuYWJsZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbGlua19lbmNyeXB0aW9uX2VuYWJsZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX01QQ1BfUkVHX0FDS19USU1FT1VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbGlua19tcGNwX3JlZ19hY2tfdGltZW91dF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9saW5rX21wY3BfcmVnX2Fja190aW1lb3V0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9SQU5HRV9WQUxVRV9DSEFOR0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbGlua19yYW5nZV92YWx1ZV9jaGFuZ2VkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2xpbmtfcmFuZ2VfdmFsdWVfY2hhbmdlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfUFJPVEVDVElPTl9TV0lUQ0hfT0NDVVJSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2xpbmtfcHJvdGVjdGlvbl9zd2l0Y2hfb2NjdXJyZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX0RVUExJQ0FURV9NUENQX1JFR0lTVFJBVElPTl9SRVFVRVNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9saW5rX2R1cGxpY2F0ZV9tcGNwX3JlZ2lzdHJhdGlvbl9yZXF1ZXN0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9MSU5LX1NQRUVEX01JU01BVENIOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbGlua19saW5rX3NwZWVkX21pc21hdGNoX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2xpbmtfbGlua19zcGVlZF9taXNtYXRjaF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfTVBDUF9SRVBPUlRfVElNRU9VVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2xpbmtfbXBjcF9yZXBvcnRfdGltZW91dF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX09BTV9LRUVQQUxJVkVfVElNRU9VVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9NUENQX0RJU0NPVkVSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9saW5rX21wY3BfZGlzY292ZXJlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfTVBDUF9ERVJFR0lTVEVSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9saW5rX21wY3BfZGVyZWdpc3RlcmVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2xpbmtfbXBjcF9kZXJlZ2lzdGVyZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX1BSRVBST1ZJU0lPTkVEX0xJTktfQ1JFQVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9PQU1fS0VFUEFMSVZFX1RJTUVSX1NUQVJURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfT0FNX0tFRVBBTElWRV9USU1FUl9TVE9QUEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BwZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BwZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX0tFWV9FWENIQU5HRV9TVEFSVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9LRVlfRVhDSEFOR0VfU1RPUFBFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BwZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcHBlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfU1RBVElDX1JFR0lTVFJBVElPTl9ET05FOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RvbmVfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2RvbmVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX1JFUkFOR0VfRkFJTFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2xpbmtfcmVyYW5nZV9mYWlsdXJlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2xpbmtfcmVyYW5nZV9mYWlsdXJlX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19JRF9MSU5LX0RFTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9saW5rX2xpbmtfZGVsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9saW5rX2xpbmtfZGVsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9saW5rX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2xpbmtfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2xpbmtfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2xpbmtfYXV0b19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbGlua19hdXRvX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19PUEVSX0lEX0ZPUkNFX1JFRElTQ09WRVJZOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbGlua19mb3JjZV9yZWRpc2NvdmVyeV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9saW5rX2ZvcmNlX3JlZGlzY292ZXJ5X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9ERUxFVEVfTElOSzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2xpbmtfZGVsZXRlX2xpbmtfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbGlua19kZWxldGVfbGlua19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX09QRVJfSURfT0FNX0tFRVBBTElWRV9USU1FUl9TVEFSVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19PUEVSX0lEX09BTV9LRUVQQUxJVkVfVElNRVJfU1RPUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdG9wX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfT1BFUl9JRF9LRVlfRVhDSEFOR0VfU1RBUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9MSU5LX09QRVJfSURfS0VZX0VYQ0hBTkdFX1NUT1A6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdG9wX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2xpbmtfa2V5X2V4Y2hhbmdlX3N0b3BfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19PUEVSX0lEX1NUQVRJQ19SRUdJU1RSQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTElOS19QUk9YWV9JRF9JTkpFQ1RfRlJBTUU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9saW5rX2luamVjdF9mcmFtZV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9saW5rX2luamVjdF9mcmFtZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1BST1hZX1JYOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfUFJPWFlfUlhfSURfRlJBTUVfQ0FQVFVSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX05JOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9uaV9rZXlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbmlfa2V5X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9uaV9jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbmlfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9BVVRPX0lEX05PX1JFUE9SVFM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9uaV9ub19yZXBvcnRzX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX25pX25vX3JlcG9ydHNfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfQVVUT19JRF9MTElEX1FVQVJBTlRJTkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbmlfbGxpZF9xdWFyYW50aW5lZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9BVVRPX0lEX1JFUkFOR0VfRkFJTFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX25pX3JlcmFuZ2VfZmFpbHVyZV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9uaV9yZXJhbmdlX2ZhaWx1cmVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfQVVUT19JRF9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfT05VX1VQR1JBREVfQ09NUExFVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9BVVRPX0lEX1JPR1VFX1NDQU5fQ09NUExFVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfQVVUT19JRF9NUENQX1RJTUVTVEFNUF9DSEFOR0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbmlfbXBjcF90aW1lc3RhbXBfY2hhbmdlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX0FVVE9fSURfQVVUT19ST0dVRV9TQ0FOXzFHX0ZBSUxVUkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9BVVRPX0lEX0FVVE9fUk9HVUVfU0NBTl8xMEdfRkFJTFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX25pX2F1dG9fcm9ndWVfc2Nhbl8xMGdfZmFpbHVyZV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMTBnX2ZhaWx1cmVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbmlfYXV0b19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbmlfYXV0b19jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX09QRVJfSURfU0VUX0VQT05fTklfRU5fU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX0lTU1VFX1JTU0lfR1JBTlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9uaV9pc3N1ZV9yc3NpX2dyYW50X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX25pX2lzc3VlX3Jzc2lfZ3JhbnRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9BRERfTElOSzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX25pX2FkZF9saW5rX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX25pX2FkZF9saW5rX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX09QRVJfSURfQUREX01VTFRJQ0FTVF9MSU5LOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbmlfYWRkX211bHRpY2FzdF9saW5rX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX25pX2FkZF9tdWx0aWNhc3RfbGlua19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX0FERF9QUk9URUNURURfU1RBTkRCWV9MSU5LOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbmlfYWRkX3Byb3RlY3RlZF9zdGFuZGJ5X2xpbmtfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfT1BFUl9JRF9QUk9URUNUSU9OX1NXSVRDSElOR19BUFBMWV9SRVJBTkdFX0RFTFRBOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19hcHBseV9yZXJhbmdlX2RlbHRhX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX05JX09QRVJfSURfUk9HVUVfTExJRF9TQ0FOOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbmlfcm9ndWVfbGxpZF9zY2FuX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX25pX3JvZ3VlX2xsaWRfc2Nhbl9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX1NUQVJUX09OVV9VUEdSQURFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX09OVV8xMEdfVVM6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX29udV8xMGdfdXNfa2V5X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX29udV8xMGdfdXNfa2V5X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9vbnVfMTBnX3VzX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9vbnVfMTBnX3VzX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX29udV8xMGdfdXNfc3RhdF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9vbnVfMTBnX3VzX3N0YXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fb251XzEwZ191c19zdGF0X2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9vbnVfMTBnX3VzX3N0YXRfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMTBHX1VTX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT05VXzEwR19VU19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX29udV8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX29udV8xMGdfdXNfYXV0b19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fb251XzEwZ191c19hdXRvX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0VQT05fT05VXzFHX1VTOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9vbnVfMWdfdXNfa2V5X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX29udV8xZ191c19rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX29udV8xZ191c19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fb251XzFnX3VzX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX29udV8xZ191c19zdGF0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX29udV8xZ191c19zdGF0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX29udV8xZ191c19zdGF0X2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9vbnVfMWdfdXNfc3RhdF9jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09OVV8xR19VU19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fb251XzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PTlVfMUdfVVNfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9vbnVfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fb251XzFnX3VzX2F1dG9fY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX29udV8xZ191c19hdXRvX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfRFM6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX3BhdGhfMTBnX2RzX2tleV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9wYXRoXzEwZ19kc19rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX3BhdGhfMTBnX2RzX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9wYXRoXzEwZ19kc19jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9wYXRoXzEwZ19kc19zdGF0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX3BhdGhfMTBnX2RzX3N0YXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9wYXRoXzEwZ19kc19zdGF0X2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfRFNfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX1BBVEhfMTBHX0RTX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xMEdfVVM6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX3BhdGhfMTBnX3VzX2tleV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9wYXRoXzEwZ191c19rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX3BhdGhfMTBnX3VzX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9wYXRoXzEwZ191c19jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9wYXRoXzEwZ191c19zdGF0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX3BhdGhfMTBnX3VzX3N0YXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzEwR19VU19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xMEdfVVNfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9wYXRoXzEwZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX3BhdGhfMTBnX3VzX2F1dG9fY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfRVBPTl9QQVRIXzFHX0RTOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9wYXRoXzFnX2RzX2tleV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9wYXRoXzFnX2RzX2tleV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fcGF0aF8xZ19kc19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fcGF0aF8xZ19kc19jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9wYXRoXzFnX2RzX3N0YXRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fcGF0aF8xZ19kc19zdGF0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fcGF0aF8xZ19kc19zdGF0X2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX0RTX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19EU19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX3BhdGhfMWdfZHNfYXV0b19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fcGF0aF8xZ19kc19hdXRvX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0VQT05fUEFUSF8xR19VUzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fcGF0aF8xZ191c19rZXlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fcGF0aF8xZ191c19rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX3BhdGhfMWdfdXNfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX3BhdGhfMWdfdXNfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fcGF0aF8xZ191c19zdGF0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX3BhdGhfMWdfdXNfc3RhdF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGVwb25fcGF0aF8xZ191c19zdGF0X2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9wYXRoXzFnX3VzX3N0YXRfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9QQVRIXzFHX1VTX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZXBvbl9wYXRoXzFnX3VzX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fUEFUSF8xR19VU19BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwb25fcGF0aF8xZ191c19hdXRvX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0VQT05fUlA6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX3JwX2tleV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9ycF9rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihlcG9uX3JwX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXBvbl9ycF9jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUElPOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bpb19rZXlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwaW9fa2V5X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bpb19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwaW9fY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9BTExPQzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fYWxsb2Nfa2V5X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX2FsbG9jX2tleV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fYWxsb2NfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX2FsbG9jX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX2FsbG9jX3N0YXRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fYWxsb2Nfc3RhdF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9hbGxvY19zdGF0X2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9hbGxvY19zdGF0X2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0FMTE9DX0FVVE9fSURfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fYWxsb2NfZ2V0X2FsbG9jX3N0YXRzX2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9BTExPQ19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX2FsbG9jX2F1dG9fY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX2FsbG9jX2F1dG9fY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9BTExPQ19PUEVSX0lEX1NFVF9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX2FsbG9jX3NldF9zdGF0ZV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9hbGxvY19zZXRfc3RhdGVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fQUxMT0NfT1BFUl9JRF9HRVRfU1RBVFM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9hbGxvY19nZXRfc3RhdHNfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fYWxsb2NfZ2V0X3N0YXRzX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9HRU1fUE9SVDoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fZ2VtX3BvcnRfa2V5X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX2dlbV9wb3J0X2tleV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fZ2VtX3BvcnRfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX2dlbV9wb3J0X2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX2dlbV9wb3J0X3N0YXRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fZ2VtX3BvcnRfc3RhdF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fR0VNX1BPUlRfQVVUT19JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0dFTV9QT1JUX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fZ2VtX3BvcnRfYXV0b19jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0dFTV9QT1JUX09QRVJfSURfU0VUX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fZ2VtX3BvcnRfc2V0X3N0YXRlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX2dlbV9wb3J0X3NldF9zdGF0ZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fSVdGOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9pd2Zfa2V5X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX2l3Zl9rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX2l3Zl9jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25faXdmX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX2l3Zl9zdGF0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX2l3Zl9zdGF0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX2l3Zl9zdGF0X2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9pd2Zfc3RhdF9jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9BVVRPX0lEX0ZMVVNIX01BQ19UQUJMRV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfQVVUT19JRF9TQ0FOX01BQ19UQUJMRV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX2l3Zl9zY2FuX21hY190YWJsZV9jb21wbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25faXdmX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX2l3Zl9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25faXdmX3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9pd2ZfYXV0b19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25faXdmX2F1dG9fY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfT1BFUl9JRF9GTFVTSF9NQUNfVEFCTEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX09QRVJfSURfU0NBTl9NQUNfVEFCTEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9pd2Zfc2Nhbl9tYWNfdGFibGVfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25faXdmX3NjYW5fbWFjX3RhYmxlX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfRFNfRUdSRVNTX0ZMT1c6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25faXdmX2RzX2VncmVzc19mbG93X2tleV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25faXdmX2RzX2VncmVzc19mbG93X2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfRFNfSU5HUkVTU19GTE9XOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2tleV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX0lXRl9NQUNfVEFCTEU6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX2l3Zl9tYWNfdGFibGVfa2V5X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX2l3Zl9tYWNfdGFibGVfa2V5X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0lEX05FV19NQUM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9pd2ZfbWFjX3RhYmxlX25ld19tYWNfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25faXdmX21hY190YWJsZV9uZXdfbWFjX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19JRF9NQUNfQUdFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2FnZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25faXdmX21hY190YWJsZV9tYWNfYWdlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fSURfTUFDX01PVkU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0lEX01BQ19EUk9QUEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25faXdmX21hY190YWJsZV9tYWNfZHJvcHBlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19kcm9wcGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX2l3Zl9tYWNfdGFibGVfYXV0b19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25faXdmX21hY190YWJsZV9hdXRvX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fSVdGX1VTX0ZMT1c6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX2l3Zl91c19mbG93X2tleV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9pd2ZfdXNfZmxvd19rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX2l3Zl91c19mbG93X2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9pd2ZfdXNfZmxvd19jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX05JOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9uaV9rZXlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fbmlfa2V5X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9uaV9jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fbmlfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fbmlfc3RhdF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9uaV9zdGF0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX25pX3N0YXRfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX25pX3N0YXRfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9MT1M6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9uaV9sb3NfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fbmlfbG9zX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfU0VSSUFMX05VTUJFUl9BQ1FVSVNJVElPTl9DWUNMRV9TVEFSVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX25pX3NlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fbmlfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19PTlVTX1JBTkdFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfU1dJVENIT1ZFUl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19zd2l0Y2hvdmVyX2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9PTlVfRElTQ09WRVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX25pX29udV9kaXNjb3ZlcmVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX25pX29udV9kaXNjb3ZlcmVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfQ1BVX1BBQ0tFVFNfRkFJTFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX25pX2NwdV9wYWNrZXRzX2ZhaWx1cmVfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9ERUFDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfRElTQUJMRV9BTExfT05VU19DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX0FDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9FTkFCTEVfQUxMX09OVVNfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfVE9EX1JFUVVFU1RfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX09OVV9VUEdSQURFX0NPTVBMRVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9ST0dVRV9PTlVfU1BFQ0lBTF9NQVBfQ1lDTEVfU1RBUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fbmlfYXV0b19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fbmlfYXV0b19jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX09QRVJfSURfU0VUX1BPTl9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX25pX3NldF9wb25fc3RhdGVfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fbmlfc2V0X3Bvbl9zdGF0ZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1JFU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fbmlfcmVzZXRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fbmlfcmVzZXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9ESVNBQkxFX1NFUklBTF9OVU1CRVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX09QRVJfSURfU0lOR0xFX1JFUVVFU1RfU1RBTkRCWV9QT05fTU9OSVRPUklORzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fbmlfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1NFVF9PTlVfU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9uaV9zZXRfb251X3N0YXRlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX25pX3NldF9vbnVfc3RhdGVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9ST0dVRV9ERVRFQ1RJT05fV0lORE9XOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX3dpbmRvd19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX09QRVJfSURfVE9EX1JFUVVFU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9uaV90b2RfcmVxdWVzdF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9uaV90b2RfcmVxdWVzdF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9PUEVSX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1RZUEVfQ19TRVRfTVVMVElQTEVfT05VX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9jX3NldF9tdWx0aXBsZV9vbnVfc3RhdGVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfT1BFUl9JRF9TVEFSVF9PTlVfVVBHUkFERToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfUFJPWFlfSURfQ1BVX1BBQ0tFVFM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9uaV9jcHVfcGFja2V0c19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9uaV9jcHVfcGFja2V0c19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9QUk9YWV9JRF9CUk9BRENBU1RfUExPQU1fUEFDS0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fbmlfYnJvYWRjYXN0X3Bsb2FtX3BhY2tldF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9uaV9icm9hZGNhc3RfcGxvYW1fcGFja2V0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9PTlU6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9rZXlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X2tleV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fb251X2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9vbnVfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fb251X3N0YXRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X3N0YXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9zdGF0X2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9vbnVfc3RhdF9jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX09OVV9BTEFSTToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9vbnVfYWxhcm1fcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X29udV9hbGFybV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9ET1dJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fb251X2Rvd2lfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X2Rvd2lfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfU0ZJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fb251X3NmaV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9vbnVfc2ZpX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1NESToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9zZGlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X3NkaV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9ERkk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfZGZpX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9kZmlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfU1VGSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9zdWZpX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9zdWZpX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0xPQUk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfbG9haV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9vbnVfbG9haV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9ER0k6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfZGdpX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9kZ2lfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfUEVFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fb251X3BlZV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9vbnVfcGVlX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1BTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9wc3RfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X3BzdF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9USVdJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fb251X3Rpd2lfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X3Rpd2lfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfTE9LSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9sb2tpX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9sb2tpX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX01FTUk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfbWVtaV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9vbnVfbWVtaV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9PTUNJX1BPUlRfSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfb21jaV9wb3J0X2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfQkVSX0lOVEVSVkFMX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fb251X2Jlcl9pbnRlcnZhbF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0VSUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9lcnJfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X2Vycl9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9SRUk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfcmVpX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9yZWlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfUkFOR0lOR19DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1BBU1NXT1JEX0FVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9PTlVfQUNUSVZBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX09OVV9FTkFCTEVfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9PTlVfRElTQUJMRV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfSU5WQUxJRF9EQlJVX1JFUE9SVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0tFWV9FWENIQU5HRV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfS0VZX1JFUVVFU1RfVElNRU9VVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfS0VZX0VYQ0hBTkdFX0NZQ0xFX1NLSVBQRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X2tleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0tFWV9FWENIQU5HRV9LRVlfTUlTTUFUQ0g6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfVU5DT05TRUNVVElWRV9JTkRFWDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9rZXlfZXhjaGFuZ2VfdW5jb25zZWN1dGl2ZV9pbmRleF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX3VuY29uc2VjdXRpdmVfaW5kZXhfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0tFWV9FWENIQU5HRV9ERUNSWVBUX1JFUVVJUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fb251X2tleV9leGNoYW5nZV9kZWNyeXB0X3JlcXVpcmVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9PUFRJQ0FMX1JFRkxFQ1RJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfb3B0aWNhbF9yZWZsZWN0aW9uX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb25fcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT05VX0FDVElWQVRJT05fU1RBTkRCWV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fc3RhbmRieV9jb21wbGV0ZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X29udV9hY3RpdmF0aW9uX3N0YW5kYnlfY29tcGxldGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1BPV0VSX01BTkFHRU1FTlRfU1RBVEVfQ0hBTkdFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9QT1NTSUJMRV9EUklGVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9wb3NzaWJsZV9kcmlmdF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl9vbnVfYXV0b19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X2F1dG9fY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfT1BFUl9JRF9TRVRfT05VX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fb251X3NldF9vbnVfc3RhdGVfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X3NldF9vbnVfc3RhdGVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX09QRVJfSURfUlNTSV9NRUFTVVJFTUVOVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9yc3NpX21lYXN1cmVtZW50X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9yc3NpX21lYXN1cmVtZW50X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9PUEVSX0lEX0NIQU5HRV9QT1dFUl9MRVZFTDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1BST1hZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9QUk9YWV9JRF9DUFVfUEFDS0VUUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9jcHVfcGFja2V0c19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3Bvbl9vbnVfY3B1X3BhY2tldHNfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1BST1hZX0lEX1BMT0FNX1BBQ0tFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX29udV9wbG9hbV9wYWNrZXRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X3Bsb2FtX3BhY2tldF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1BST1hZX1JYOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9QUk9YWV9SWF9JRF9DUFVfUEFDS0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fb251X2NwdV9wYWNrZXRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fb251X2NwdV9wYWNrZXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX1BST1hZX1JYX0lEX09NQ0lfUEFDS0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGdwb25fb251X29tY2lfcGFja2V0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX29udV9vbWNpX3BhY2tldF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fVFJYOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoZ3Bvbl90cnhfa2V5X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncG9uX3RyeF9rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihncG9uX3RyeF9jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdwb25fdHJ4X2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0xPR19FTlRSWToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGxvZ19lbnRyeV9rZXlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvZ19lbnRyeV9rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihsb2dfZW50cnlfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2dfZW50cnlfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGxvZ19lbnRyeV9zdGF0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2dfZW50cnlfc3RhdF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YobG9nX2VudHJ5X3N0YXRfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2dfZW50cnlfc3RhdF9jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dfRU5UUllfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihsb2dfZW50cnlfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvZ19lbnRyeV9zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTE9HX0VOVFJZX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGxvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvZ19lbnRyeV9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGxvZ19lbnRyeV9hdXRvX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9nX2VudHJ5X2F1dG9fY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfTE9HR0VSOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YobG9nZ2VyX2tleV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9nZ2VyX2tleV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGxvZ2dlcl9jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvZ2dlcl9jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YobG9nZ2VyX3N0YXRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvZ2dlcl9zdGF0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihsb2dnZXJfc3RhdF9jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvZ2dlcl9zdGF0X2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0xPR0dFUl9BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKGxvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9nZ2VyX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dHRVJfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YobG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YobG9nZ2VyX2F1dG9fY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2dnZXJfYXV0b19jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9MT0dHRVJfT1BFUl9JRF9DTEVBUl9MT0c6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YobG9nZ2VyX2NsZWFyX2xvZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9nZ2VyX2NsZWFyX2xvZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX05OSToKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKG5uaV9rZXlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5uaV9rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihubmlfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBubmlfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKG5uaV9zdGF0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBubmlfc3RhdF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0MToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0NDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0NzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDg6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1MDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDUyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1MzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1NjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDYxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2MjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihubmlfc3RhdF9jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5uaV9zdGF0X2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX05OSV9BVVRPX0lEX1NUQVRVU19DSEFOR0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKG5uaV9zdGF0dXNfY2hhbmdlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm5pX3N0YXR1c19jaGFuZ2VkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9OTklfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihubmlfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5uaV9zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTk5JX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKG5uaV9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5uaV9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKG5uaV9hdXRvX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm5pX2F1dG9fY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfTk5JX1NFUkRFUzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKG5uaV9zZXJkZXNfa2V5X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBubmlfc2VyZGVzX2tleV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKG5uaV9zZXJkZXNfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBubmlfc2VyZGVzX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1NPRlRXQVJFX0VSUk9SOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2Yoc29mdHdhcmVfZXJyb3Jfa2V5X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzb2Z0d2FyZV9lcnJvcl9rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZihzb2Z0d2FyZV9lcnJvcl9jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNvZnR3YXJlX2Vycm9yX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1RSWF9DQUxJQlJBVElPTjoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHRyeF9jYWxpYnJhdGlvbl9rZXlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyeF9jYWxpYnJhdGlvbl9rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fQVVUT19JRF9DQVBUVVJFX1dJTkRPV19BTkRfU1RBVElTVElDX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih0cnhfY2FsaWJyYXRpb25fY2FwdHVyZV93aW5kb3dfYW5kX3N0YXRpc3RpY19jb21wbGV0ZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YodHJ4X2NhbGlicmF0aW9uX2F1dG9fY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnhfY2FsaWJyYXRpb25fYXV0b19jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9UUlhfQ0FMSUJSQVRJT05fT1BFUl9JRF9TVEFSVF9DQVBUVVJFX1dJTkRPVzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih0cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyeF9jYWxpYnJhdGlvbl9zdGFydF9jYXB0dXJlX3dpbmRvd19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfVFJYX0NBTElCUkFUSU9OX09QRVJfSURfU1RPUF9DQVBUVVJFX1dJTkRPVzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih0cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvd19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ4X2NhbGlicmF0aW9uX3N0b3BfY2FwdHVyZV93aW5kb3dfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9YR1BPTl9BTExPQzoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX2FsbG9jX2tleV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fYWxsb2Nfa2V5X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fYWxsb2NfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9hbGxvY19jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fYWxsb2Nfc3RhdF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fYWxsb2Nfc3RhdF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fYWxsb2Nfc3RhdF9jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX2FsbG9jX3N0YXRfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUTzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fSURfR0VUX0FMTE9DX1NUQVRTX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9hbGxvY19nZXRfYWxsb2Nfc3RhdHNfY29tcGxldGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9BTExPQ19BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX2FsbG9jX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fQUxMT0NfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fYWxsb2Nfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX2FsbG9jX2F1dG9fY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9hbGxvY19hdXRvX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX0FMTE9DX09QRVJfSURfR0VUX1NUQVRTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX2FsbG9jX2dldF9zdGF0c19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fYWxsb2NfZ2V0X3N0YXRzX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9BTExPQ19PUEVSX0lEX1NFVF9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9hbGxvY19zZXRfc3RhdGVfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX2FsbG9jX3NldF9zdGF0ZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1hHUE9OX0dFTV9QT1JUOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fZ2VtX3BvcnRfa2V5X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9nZW1fcG9ydF9rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9nZW1fcG9ydF9jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX2dlbV9wb3J0X2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9nZW1fcG9ydF9zdGF0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9nZW1fcG9ydF9zdGF0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fZ2VtX3BvcnRfc3RhdF9jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9HRU1fUE9SVF9BVVRPX0lEX1NUQVRfQUxBUk1fUkFJU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fR0VNX1BPUlRfQVVUT19JRF9TVEFUX0FMQVJNX0NMRUFSRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9nZW1fcG9ydF9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1hHUE9OX0lXRjoKKyAgICAgICAgICAgIHN3aXRjaCAoZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0tFWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX2l3Zl9rZXlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX2l3Zl9rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9pd2ZfY2ZnX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9pd2ZfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfWEdQT05fTkk6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9uaV9rZXlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX25pX2tleV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX25pX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fbmlfY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX25pX3N0YXRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX25pX3N0YXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjY6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9uaV9zdGF0X2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fbmlfc3RhdF9jZmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9MT1M6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fbmlfbG9zX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9uaV9sb3NfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfU0VSSUFMX05VTUJFUl9BQ1FVSVNJVElPTl9DWUNMRV9TVEFSVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9uaV9zZXJpYWxfbnVtYmVyX2FjcXVpc2l0aW9uX2N5Y2xlX3N0YXJ0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9QUk9URUNUSU9OX1NXSVRDSElOR19PTlVTX1JBTkdFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfb251c19yYW5nZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfU1dJVENIT1ZFUl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1NUQU5EQllfUE9OX01PTklUT1JJTkdfQ1lDTEVfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9uaV9zdGFuZGJ5X3Bvbl9tb25pdG9yaW5nX2N5Y2xlX2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9PTlVfRElTQ09WRVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9uaV9vbnVfZGlzY292ZXJlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fbmlfb251X2Rpc2NvdmVyZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfQ1BVX1BBQ0tFVFNfRkFJTFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1JPR1VFX0RFVEVDVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fbmlfcm9ndWVfZGV0ZWN0aW9uX2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9ERUFDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fbmlfZGVhY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfRElTQUJMRV9BTExfT05VU19DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fbmlfZGlzYWJsZV9hbGxfb251c19jb21wbGV0ZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX0FDVElWQVRFX0FMTF9PTlVTX0NPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9uaV9hY3RpdmF0ZV9hbGxfb251c19jb21wbGV0ZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9FTkFCTEVfQUxMX09OVVNfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX25pX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX25pX2VuYWJsZV9hbGxfb251c19jb21wbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfVE9EX1JFUVVFU1RfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX25pX3RvZF9yZXF1ZXN0X2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX09OVV9VUEdSQURFX0NPTVBMRVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfQVVUT19JRF9ST0dVRV9PTlVfU1BFQ0lBTF9NQVBfQ1lDTEVfU1RBUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9uaV9yb2d1ZV9vbnVfc3BlY2lhbF9tYXBfY3ljbGVfc3RhcnRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfU1RBVF9BTEFSTV9SQUlTRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fbmlfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1NUQVRfQUxBUk1fQ0xFQVJFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX25pX3N0YXRfYWxhcm1fY2xlYXJlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fbmlfYXV0b19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX25pX2F1dG9fY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9TRVRfUE9OX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX25pX3NldF9wb25fc3RhdGVfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX25pX3NldF9wb25fc3RhdGVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfUkVTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fbmlfcmVzZXRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX25pX3Jlc2V0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX0RJU0FCTEVfU0VSSUFMX05VTUJFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9uaV9kaXNhYmxlX3NlcmlhbF9udW1iZXJfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX25pX2Rpc2FibGVfc2VyaWFsX251bWJlcl9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9TSU5HTEVfUkVRVUVTVF9TVEFOREJZX1BPTl9NT05JVE9SSU5HOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX25pX3NpbmdsZV9yZXF1ZXN0X3N0YW5kYnlfcG9uX21vbml0b3JpbmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfU0VUX09OVV9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9uaV9zZXRfb251X3N0YXRlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9uaV9zZXRfb251X3N0YXRlX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1JVTl9TUEVDSUFMX0JXX01BUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9uaV9ydW5fc3BlY2lhbF9id19tYXBfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX25pX3J1bl9zcGVjaWFsX2J3X21hcF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9ST0dVRV9ERVRFQ1RJT05fV0lORE9XOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX09QRVJfSURfVE9EX1JFUVVFU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fbmlfdG9kX3JlcXVlc3RfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX25pX3RvZF9yZXF1ZXN0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9PUEVSX0lEX1NUQVJUX09OVV9VUEdSQURFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9uaV9zdGFydF9vbnVfdXBncmFkZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfT1BFUl9JRF9BREpVU1RfVFhfV0FWRUxFTkdUSDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9uaV9hZGp1c3RfdHhfd2F2ZWxlbmd0aF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9QUk9YWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fTklfUFJPWFlfSURfQ1BVX1BBQ0tFVFM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fbmlfY3B1X3BhY2tldHNfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX25pX2NwdV9wYWNrZXRzX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9QUk9YWV9JRF9CUk9BRENBU1RfUExPQU1fUEFDS0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlU6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfa2V5X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfa2V5X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfc3RhdF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X3N0YXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfc3RhdF9jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX29udV9zdGF0X2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE86CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09OVV9BTEFSTToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfb251X2FsYXJtX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfb251X2FsYXJtX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9ET1dJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV9kb3dpX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfZG93aV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfU0ZJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV9zZmlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX29udV9zZmlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1NESToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfc2RpX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfc2RpX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9ERkk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X2RmaV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X2RmaV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfUFFTSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfcHFzaV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X3Bxc2lfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1NVRkk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X3N1ZmlfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX29udV9zdWZpX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9USVdJOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV90aXdpX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfdGl3aV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfTE9PQ0k6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X2xvb2NpX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfbG9vY2lfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1JBTkdJTkdfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9PTlVfQUNUSVZBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09OVV9FTkFCTEVfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9PTlVfRElTQUJMRV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X29udV9kaXNhYmxlX2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfUlNTSV9NRUFTVVJFTUVOVF9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfcnNzaV9tZWFzdXJlbWVudF9jb21wbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX0lOVkFMSURfREJSVV9SRVBPUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX29udV9pbnZhbGlkX2RicnVfcmVwb3J0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfS0VZX0VYQ0hBTkdFX0tFWV9SRVFVRVNUX1RJTUVPVVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfcmVxdWVzdF90aW1lb3V0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX0tFWV9FWENIQU5HRV9DWUNMRV9TS0lQUEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV9rZXlfZXhjaGFuZ2VfY3ljbGVfc2tpcHBlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X2tleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9LRVlfRVhDSEFOR0VfS0VZX01JU01BVENIOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X21pc21hdGNoX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9taXNtYXRjaF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT1BUSUNBTF9SRUZMRUNUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb25fcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb25fcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX0RHSToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfZGdpX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfZGdpX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9QT1dFUl9NQU5BR0VNRU5UX1NUQVRFX0NIQU5HRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfcG93ZXJfbWFuYWdlbWVudF9zdGF0ZV9jaGFuZ2VfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfUE9TU0lCTEVfRFJJRlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X3Bvc3NpYmxlX2RyaWZ0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1JFR0lTVFJBVElPTl9JRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfcmVnaXN0cmF0aW9uX2lkX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9QT1dFUl9MRVZFTF9SRVBPUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfUE9XRVJfQ09OU1VNUFRJT05fUkVQT1JUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX29udV9wb3dlcl9jb25zdW1wdGlvbl9yZXBvcnRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTFVSRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsdXJlX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9PTlVfVFVOSU5HX09VVF9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X29udV90dW5pbmdfb3V0X2NvbXBsZXRlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT05VX1RVTklOR19JTl9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9jb21wbGV0ZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1RVTklOR19SRVNQT05TRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9TVEFUX0FMQVJNX1JBSVNFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX29udV9zdGF0X2FsYXJtX3JhaXNlZF9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfU1RBVF9BTEFSTV9DTEVBUkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV9hdXRvX2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X2F1dG9fY2ZnX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfT1BFUjoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfU0VUX09OVV9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZV9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X3NldF9vbnVfc3RhdGVfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX1JTU0lfTUVBU1VSRU1FTlQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX29udV9yc3NpX21lYXN1cmVtZW50X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9SRVFVRVNUX1JFR0lTVFJBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfcmVxdWVzdF9yZWdpc3RyYXRpb25fcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfQ0hBTkdFX1BPV0VSX0xFVkVMTElORzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsbGluZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X2NoYW5nZV9wb3dlcl9sZXZlbGxpbmdfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX0dFVF9QT1dFUl9MRVZFTDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2xldmVsX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfZ2V0X3Bvd2VyX2xldmVsX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9HRVRfUE9XRVJfQ09OU1VNUFRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X2dldF9wb3dlcl9jb25zdW1wdGlvbl9wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fb251X2dldF9wb3dlcl9jb25zdW1wdGlvbl9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfQURKVVNUX1RYX1dBVkVMRU5HVEg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfYWRqdXN0X3R4X3dhdmVsZW5ndGhfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9PUEVSX0lEX1NFQ1VSRV9NVVRVQUxfQVVUSEVOVElDQVRJT046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X3NlY3VyZV9tdXR1YWxfYXV0aGVudGljYXRpb25fcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfT1BFUl9JRF9PTlVfVFVOSU5HX0lOOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaXplID0gc2l6ZW9mKHhncG9uX29udV9vbnVfdHVuaW5nX2luX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfb251X3R1bmluZ19pbl9wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX09QRVJfSURfT05VX1RVTklOR19PVVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X29udV90dW5pbmdfb3V0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9QUk9YWToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1BST1hZX0lEX1BMT0FNX1BBQ0tFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfcGxvYW1fcGFja2V0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfUFJPWFlfSURfQ1BVX1BBQ0tFVFM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X2NwdV9wYWNrZXRzX3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfY3B1X3BhY2tldHNfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9QUk9YWV9SWDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJncm91cCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX1BST1hZX1JYX0lEX0NQVV9QQUNLRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X2NwdV9wYWNrZXRfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhncG9uX29udV9jcHVfcGFja2V0X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfUFJPWFlfUlhfSURfT01DSV9QQUNLRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fb251X29tY2lfcGFja2V0X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl9vbnVfb21jaV9wYWNrZXRfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9YR1BPTl9UUlg6CisgICAgICAgICAgICBzd2l0Y2ggKGdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9LRVk6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4Z3Bvbl90cnhfa2V5X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4Z3Bvbl90cnhfa2V5X3Byb3BfYXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeGdwb25fdHJ4X2NmZ19wcm9wX2FycmF5KSAvIHNpemVvZihiY21jbGlfcHJvcF9kZXNjciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGdwb25fdHJ4X2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1hQT05fU0VSREVTOgorICAgICAgICAgICAgc3dpdGNoIChncm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfS0VZOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Ymdyb3VwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzaXplb2YoeHBvbl9zZXJkZXNfa2V5X3Byb3BfYXJyYXkpIC8gc2l6ZW9mKGJjbWNsaV9wcm9wX2Rlc2NyICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4cG9uX3NlcmRlc19rZXlfcHJvcF9hcnJheTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViZ3JvdXApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHNpemVvZih4cG9uX3NlcmRlc19jZmdfcHJvcF9hcnJheSkgLyBzaXplb2YoYmNtY2xpX3Byb3BfZGVzY3IgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhwb25fc2VyZGVzX2NmZ19wcm9wX2FycmF5OworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCitiY21vc19lcnJubyBhcGlfY2xpX29iamVjdF9uYW1lKGJjbW9sdF9vYmpfaWQgb2JqLCBjb25zdCBjaGFyICoqbmFtZSwgY29uc3QgY2hhciAqKmRlc2NyKQoreworICAgIGlmIChvYmogPj0gQkNNT0xUX09CSl9JRF9fTlVNX09GKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgaWYgKG9iamVjdF9uYW1lW29ial0gPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PRU5UOworICAgIH0KKworICAgIGlmIChuYW1lICE9IE5VTEwpCisgICAgeworICAgICAgICAqbmFtZSA9IG9iamVjdF9uYW1lW29ial07CisgICAgfQorCisgICAgaWYgKGRlc2NyICE9IE5VTEwpCisgICAgeworICAgICAgICAqZGVzY3IgPSBvYmplY3RfZGVzY3Jbb2JqXTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYXBpX2NsaV9vYmplY3RfcHJvcGVydHkoYmNtb2x0X29ial9pZCBvYmosIGJjbW9sdF9tZ3RfZ3JvdXAgZ3JvdXAsIHVpbnQxNl90IHN1Ymdyb3VwLCB1aW50MTZfdCBwcm9wLCBjb25zdCBiY21jbGlfcHJvcF9kZXNjciAqKmRlc2NyKQoreworICAgIGJjbWNsaV9wcm9wX2Rlc2NyICoqcHJvcF9hcnJheSA9IE5VTEw7CisgICAgdWludDMyX3QgcHJvcF9hcnJheV9zaXplID0gMDsKKyAgICBpZiAoZGVzY3IgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgcHJvcF9hcnJheSA9IG9ial9nZXRfcHJvcF9hcnJheShvYmosIGdyb3VwLCBzdWJncm91cCwgJnByb3BfYXJyYXlfc2l6ZSk7CisgICAgaWYgKChwcm9wX2FycmF5ID09IE5VTEwpIHx8IChwcm9wID49IHByb3BfYXJyYXlfc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9SQU5HRTsKKyAgICB9CisKKyAgICBpZiAocHJvcF9hcnJheVtwcm9wXSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9FTlQ7CisgICAgfQorCisgICAgKmRlc2NyID0gcHJvcF9hcnJheVtwcm9wXTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfY2xpL2JjbV9hcGlfY2xpX2hlbHBlcnMuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfY2xpL2JjbV9hcGlfY2xpX2hlbHBlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2U3MjM3Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2FwaV9jbGkvYmNtX2FwaV9jbGlfaGVscGVycy5oCkBAIC0wLDAgKzEsNzY4IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworI2lmbmRlZiBNQVBMRV9DTElfSEVMUEVSU19IXworI2RlZmluZSBNQVBMRV9DTElfSEVMUEVSU19IXworCisjaW5jbHVkZSA8YmNtY2xpLmg+CisjaW5jbHVkZSA8YmNtX2FwaV9jbGlfdHlwZXMuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCit7CisjZW5kaWYKKworLyogTWFjIG5hbWUgbGVuZ3RoICovCisjZGVmaW5lIEFQSUNMSV9NQVhfUEFSTV9OQU1FX0xFTkdUSCBCQ01DTElfTUFYX1NFQVJDSF9TVUJTVFJfTEVOR1RICisKKy8qIE1heCBoZWxwIHN0cmluZyBsZW5ndGggKi8KKyNkZWZpbmUgQVBJQ0xJX01BWF9QQVJNX0hFTFBfTEVOR1RIIDEyOAorCit0eXBlZGVmIGVudW0gYmNtY2xpX2ZpZWxkX2Rlc2NyX2ZsYWdzCit7CisgICAgQkNNQ0xJX0ZJRUxEX0RFU0NSX0ZMQUdTX05PTkUgICAgICAgICAgID0gMCwKKyAgICBCQ01DTElfRklFTERfREVTQ1JfRkxBR1NfUFJFU0VOQ0VfTUFTSyAgPSAoMSA8PCAwKSAgLyogZmllbGQgaXMgYSAncHJlc2VuY2UgbWFzaycgZm9yIGEgc3RydWN0dXJlICovCit9IGJjbWNsaV9maWVsZF9kZXNjcl9mbGFnczsKKwordHlwZWRlZiBzdHJ1Y3QgYmNtY2xpX3R5cGVfZGVzY3IgYmNtY2xpX3R5cGVfZGVzY3I7CisKKy8qIFN0cnVjdHVyZSBmaWVsZCBkZXNjcmlwdG9yICovCit0eXBlZGVmIHN0cnVjdCBiY21jbGlfZmllbGRfZGVzY3IKK3sKKyAgICBjb25zdCBjaGFyICpuYW1lOyAgICAgICAgICAgLyogRmllbGQgbmFtZSAqLworICAgIGNvbnN0IGNoYXIgKmRlc2NyOyAgICAgICAgICAvKiBGaWVsZCBkZXNjcmlwdGlvbiAqLworICAgIGNvbnN0IGNoYXIgKmNsaV9uYW1lOyAgICAgICAvKiBTaG9ydCBDTEkgbmFtZS4gY2FuIGJlIG1pc3NpbmcgKi8KKyAgICBiY21jbGlfdHlwZV9kZXNjciAqdHlwZTsgICAgLyogRmllbGQgdHlwZSAqLworICAgIHVpbnQxNl90IG9mZnNldDsgICAgICAgICAgICAvKiBPZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0eXBlIHN0cnVjdHVyZSAqLworICAgIGJjbWNsaV9maWVsZF9kZXNjcl9mbGFncyBmbGFnczsKK30gYmNtY2xpX2ZpZWxkX2Rlc2NyOworCisvKiBEYXRhIHR5cGUgZGVzY3JpcHRvciAqLworc3RydWN0IGJjbWNsaV90eXBlX2Rlc2NyCit7CisgICAgY29uc3QgY2hhciAqbmFtZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUeXBlIG5hbWUgKi8KKyAgICBjb25zdCBjaGFyICpkZXNjcjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFR5cGUgZGVzY3JpcHRpb24uIGNhbiBiZSBtaXNzaW5nICovCisgICAgY29uc3QgY2hhciAqY2xpX25hbWU7ICAgICAgICAgICAgICAgICAgICAgICAvKiBTaG9ydCBDTEkgbmFtZS4gY2FuIGJlIG1pc3NpbmcgKi8KKyAgICBiY21vbHRfYmFzZV90eXBlX2lkIGJhc2VfdHlwZTsgICAgICAgICAgICAgIC8qIEJhc2UgdHlwZTogc251bSwgdW51bSwgc3RyaW5nLCBpcCwgZW51bSwgZXRjLiAqLworICAgIHVpbnQzMl90IG1pbl92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWluIHZhbHVlIGZvciByYW5nZSBjaGVjayAqLworICAgIHVpbnQzMl90IG1heF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWF4IHZhbHVlIGZvciByYW5nZSBjaGVjayAqLworICAgIHVpbnQxNl90IHNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2l6ZSAqLworCisgICAgLyogVGhlIGZvbGxvd2luZyB1bmlvbiBpcyBxdWFsaWZpZWQgYnkgdGhlIGJhc2VfdHlwZSBhbmQgY29udGFpbnMgYWRkaXRpb25hbAorICAgICAqIGluZm8gZm9yIGFycmF5LCBlbnVtLCBzdHJ1Y3QsIHVuaW9uICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIGJjbWNsaV9lbnVtX3ZhbCAqZTsgICAgICAgICAgICAgICAgICAgICAvKiBlbnVtIHZhbHVlIGFycmF5IENvbnRhaW5zIG51bV9lbGVtZW50cysxIHZhbHVlcy4gVGhlIGxhc3QgdmFsdWUgaGFzIG5hbWU9TlVMTCAqLworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgbnVtX2ZpZWxkczsgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlICovCisgICAgICAgICAgICBiY21jbGlfZmllbGRfZGVzY3IgKmZpZWxkczsgICAgICAgICAvKiBTdHJ1Y3R1cmUgZmllbGQgYXJyYXkuIENvbnRhaW5zIG51bV9lbGVtZW50cyB2YWx1ZXMgKi8KKyAgICAgICAgfSBzOworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgbnVtX2NvbW1vbl9maWVsZHM7ICAgICAgICAgLyogbnVtYmVyIG9mIG5vbi11bmlvbiBmaWVsZHMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzdHJ1Y3QgKi8KKyAgICAgICAgICAgIGJjbWNsaV9maWVsZF9kZXNjciAqY29tbW9uX2ZpZWxkczsgIC8qIGNvbW1vbiBmaWVsZCBhcnJheS4gQ29udGFpbnMgbnVtX2VsZW1lbnRzIHZhbHVlcyAqLworICAgICAgICAgICAgdWludDE2X3QgY2xhc3NpZmllcl9pZHg7ICAgICAgICAgICAgLyogaW5kZXggb2YgdGhlIGNsYXNzaWZpZXIgZmllbGQgd2l0aGluIGNvbW1vbl9maWVsZHMgKi8KKyAgICAgICAgICAgIGJjbWNsaV9maWVsZF9kZXNjciAqdW5pb25fZmllbGRzOyAgIC8qIHN1Yi1zdHJ1Y3QgZmllbGRzIHVuZGVyIHRoZSB1bmlvbiAobmFtZSA9PSBOVUxMIGlmIG5vIGZpZWxkcyBwcmVzZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uZSBwZXIgZW51bSBlbnRyeSBpbiB0aGUgY2xhc3NpZmllciB0eXBlLCBwbHVzIG9uZSBmb3IgZGVmYXVsdCkgKi8KKyAgICAgICAgfSB1OworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3R5cGVfZGVzY3IgKmVsZW1fdHlwZTsgICAgICAgLyogQXJyYXkgZWxlbWVudCB0eXBlICovCisgICAgICAgICAgICB1aW50OF90IGxlbl9zaXplOyAgICAgICAgICAgICAgICAgICAvKiBCeXRlIHdpZHRoIG9mIGFycmF5IGxlbmd0aCBmaWVsZCAoYXQgc3RhcnQgb2Ygc3RydWN0KSAqLworICAgICAgICAgICAgdWludDE2X3QgbWF4X3NpemU7ICAgICAgICAgICAgICAgICAgLyogTWF4IGFycmF5IHNpemUgKi8KKyAgICAgICAgfSBhcnJfZHluOworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3R5cGVfZGVzY3IgKmVsZW1fdHlwZTsgICAgICAgLyogQXJyYXkgZWxlbWVudCB0eXBlICovCisgICAgICAgICAgICB1aW50MTZfdCBzaXplOyAgICAgICAgICAgICAgICAgICAgICAvKiBGaXhlZCBhcnJheSBzaXplICovCisgICAgICAgIH0gYXJyX2ZpeGVkOworICAgIH0geDsKK307CisKKy8qIFByb3BlcnR5IGRlc2NyaXB0b3IuCisgKiBUaGUgMXN0IDUgZmllbGRzIGFyZSBleGFjdGx5IHRoZSBzYW1lIGFzIGluIGJjbWNsaV9maWVsZF9kZXNjcgorICogVG9EbzogcmVwbGFjZSB3aXRoIGJjbWNsaV9maWVsZF9kZXNjciBzdWJzdHJ1Y3R1cmUuCisgKiBSZXF1aXJlcyBjaGFuZ2VzIGluIGNvZGUgZ2VuZXJhdG9yCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgY29uc3QgY2hhciAqbmFtZTsgICAgICAgICAgICAgICAvKiBDIG5hbWUgKi8KKyAgICBjb25zdCBjaGFyICpkZXNjcjsgICAgICAgICAgICAgIC8qIFByb3BlcnR5IGRlc2NyaXB0aW9uICovCisgICAgY29uc3QgY2hhciAqY2xpX25hbWU7ICAgICAgICAgICAvKiBDTEkgbmFtZSAqLworICAgIGJjbWNsaV90eXBlX2Rlc2NyICp0eXBlOyAgICAgICAgLyogVHlwZSByZWZlcmVuY2UgKi8KKyAgICB1aW50MTZfdCBvZmZzZXQ7ICAgICAgICAgICAgICAgIC8qIE9mZnNldCBpbiBnZW5lcmF0ZWQgcGVyLWdyb3VwIHN0cnVjdHVyZSAqLworICAgIHVpbnQxNl90IHByb3BlcnR5OyAgICAgICAgICAgICAgLyogUHJvcGVydHkgaWQgaW4gcGVyLW9iamVjdCBtYW5hZ2VtZW50IGdyb3VwICovCisgICAgYmNtb2x0X3Byb3BfYWNjZXNzX2lkIGFjY2VzczsgICAvKiBBY2Nlc3MgKi8KK30gYmNtY2xpX3Byb3BfZGVzY3I7CisKKy8qIEFsbCBBUElzIHJldHVybgorICogQkNNX0VSUl9PSyAtIG9rCisgKiBCQ01fRVJSX05PRU5UIC0gaWYgaWQgaXMgaW4gcmFuZ2UsIGJ1dCBkb2Vzbid0IGNvcnJlc3BvbmQgdG8gYW55IHZhbHVlIChhIGhvbGUpCisgKiBCQ01fRVJSX1JBTkdFIC0gaWQgaXMgb3V0IG9mIHJhbmdlCisgKi8KKworLyogR2V0IG9iamVjdCBuYW1lIGJ5IGlkICovCitiY21vc19lcnJubyBhcGlfY2xpX29iamVjdF9uYW1lKGJjbW9sdF9vYmpfaWQgb2JqLCBjb25zdCBjaGFyICoqbmFtZSwgY29uc3QgY2hhciAqKmRlc2NyKTsKKworLyogR2V0IG9iamVjdCBzdHJ1Y3R1cmUgc2l6ZSAqLworYmNtb3NfZXJybm8gYXBpX2NsaV9vYmplY3Rfc3RydWN0X3NpemUoYmNtb2x0X29ial9pZCBvYmosIGJjbW9sdF9tZ3RfZ3JvdXAgZ3JvdXAsIHVpbnQxNl90IHN1Ymdyb3VwLCB1aW50MzJfdCAqa2V5X3NpemUsIHVpbnQzMl90ICprZXlfb2Zmc2V0LCB1aW50MzJfdCAqZGF0YV9zaXplLCB1aW50MzJfdCAqZGF0YV9vZmZzZXQpOworCisvKiBHZXQgb2JqZWN0IHN1Ymdyb3VwIChzcGVjaWZpYyBvcGVyYXRpb24gb3IgcHJveHkpIG5hbWUgYW5kIGRlc2NyaXB0aW9uICovCitiY21vc19lcnJubyBhcGlfY2xpX29iamVjdF9zdWJncm91cF9uYW1lKGJjbW9sdF9vYmpfaWQgb2JqLCBiY21vbHRfbWd0X2dyb3VwIGdyb3VwLCB1aW50MTZfdCBzdWJncm91cCwgY29uc3QgY2hhciAqKm5hbWUsIGNvbnN0IGNoYXIgKipkZXNjcik7CisKKy8qIEdldCBwcm9wZXJ0eSBieSBvYmplY3QsIG1ndF9ncm91cCwgc3ViZ3JvdXAgKHNwZWNpZmljIG9wZXJhdGlvbiBvciBwcm94eSksIHByb3BlcnR5X2lkICovCitiY21vc19lcnJubyBhcGlfY2xpX29iamVjdF9wcm9wZXJ0eShiY21vbHRfb2JqX2lkIG9iaiwgYmNtb2x0X21ndF9ncm91cCBncm91cCwgdWludDE2X3Qgc3ViZ3JvdXAsIHVpbnQxNl90IHByb3AsIGNvbnN0IGJjbWNsaV9wcm9wX2Rlc2NyICoqZGVzY3IpOworCisvKiBHZXQgdGhlIG51bWJlciBvZiBzdWJncm91cHMgcHJlc2VudCBmb3IgYSBnaXZlbiBncm91cCAqLworc3RhdGljIGlubGluZSB1aW50MTZfdCBhcGlfY2xpX2dldF9zdWJncm91cF9jb3VudChiY21vbHRfb2JqX2lkIG9iaiwgYmNtb2x0X21ndF9ncm91cCBncm91cCkKK3sKKyAgICB1aW50MTZfdCBjb3VudCA9IDA7CisgICAgdWludDMyX3QgZHVtbXk7CisgICAgd2hpbGUgKGFwaV9jbGlfb2JqZWN0X3N0cnVjdF9zaXplKG9iaiwgZ3JvdXAsIGNvdW50LCAmZHVtbXksICZkdW1teSwgJmR1bW15LCAmZHVtbXkpICE9IEJDTV9FUlJfUkFOR0UpCisgICAgeworICAgICAgICArK2NvdW50OworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyogRHVtcCBhIHNpbmdsZSBwcm9wZXJ0eSAqLworYmNtb3NfZXJybm8gYXBpY2xpX2R1bXBfcHJvcChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX3Byb3BfZGVzY3IgKnBkLCB2b2lkICpwcm9wX2RhdGEpOworCisvKiBEdW1wIGEgc2luZ2xlIHByb3BlcnR5IHZhbHVlIGluIEMgaW5pdGlhbGl6ZXIgZm9ybWF0ICovCitiY21vc19lcnJubyBhcGljbGlfZHVtcF9wcm9wX2luaXRpYWxpemVyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfcHJvcF9kZXNjciAqcGQsIHZvaWQgKnByb3BfZGF0YSk7CisKKy8qIER1bXAgYSBkeW5hbWljIGFycmF5IGluIEMgaW5pdGlhbGl6ZXIgZm9ybWF0ICovCitiY21vc19lcnJubyBhcGljbGlfZHVtcF9keW5fYXJyYXkoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV90eXBlX2Rlc2NyICp0ZCwgdm9pZCAqZGF0YSwgY29uc3QgY2hhciAqbmFtZSk7CisKKy8qIER1bXAgcHJvcGVydHkgYXMgQ0xJIHBhcmFtZXRlcnMgKi8KK2JjbW9zX2Vycm5vIGFwaWNsaV9kdW1wX3Byb3BfcGFyYW0oYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9wcm9wX2Rlc2NyICpwZCwgdm9pZCAqcHJvcF9kYXRhLCBjb25zdCBjaGFyICpwcmVmaXgpOworCisvKiBEdW1wIG1lc3NhZ2UgKi8KK2JjbW9zX2Vycm5vIGFwaWNsaV9tc2dfZHVtcChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYmNtb2x0X21zZyAqbXNnKTsKKworLyogTWVzc2FnZSBncm91cCBuYW1lICovCitjb25zdCBjaGFyICphcGljbGlfbWd0X2dyb3VwX3RvX3N0cihiY21vbHRfbWd0X2dyb3VwIGdyb3VwKTsKKworLyogQ29udmVydCBhbiBlbnVtIHZhbHVlIHRvIHRoZSBjb3JyZXNwb25kaW5nIHN0cmluZyAqLworI2RlZmluZSBCQ01PTFRfRU5VTV9TVFJJTkdfVkFMKGVudW1fbmFtZSwgdmFsdWUpICAgIGJjbWNsaV9lbnVtX3N0cmluZ3ZhbChlbnVtX25hbWUgIyMgX3N0cmluZ190YWJsZSwgKHZhbHVlKSkKKworLyogRW51bSBzdHJpbmcgdGFibGVzICovCitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hY3RpdmF0aW9uX2ZhaWxfcmVhc29uX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfYWRkaXRpb25hbF9id19lbGlnaWJpbGl0eV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2FlX25pX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2FlX25pX2VuX3N0YXRlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfYWVfbmlfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfYWVfbmlfc2V0X2FlX25pX2VuX3N0YXRlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfYWVfcGF0aF9kc19hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2FlX3BhdGhfZHNfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hZV9wYXRoX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfYWVfcGF0aF9kc19zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2FlX3BhdGhfZHNfc3RhdF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2FlX3BhdGhfdXNfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hZV9wYXRoX3VzX2tleV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfYWVfcGF0aF91c19zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2FlX3BhdGhfdXNfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hZV9wYXRoX3VzX3N0YXRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hbGxvY19vcGVyYXRpb25fc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hbGxvY19zdGF0ZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2FsbG9jX3R5cGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hbGxvY190eXBlX3RvX3NjYW5fc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfbW9kZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2FwaV9jYXB0dXJlX2xvY2F0aW9uX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfY2FsaWJyYXRpb25fcmVjb3JkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfc2lnbl9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3Vwc3RyZWFtX2xpbmVfcmF0ZV9jYXBhYmlsaXRpZXNfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9saW5rX3R5cGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9jYXB0dXJlX3N0cm9iZV9zaWduYWxfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9jaGFubmVsX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2NoYW5uZWxfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfY29uc29sZV9yZWRpcmVjdGlvbl9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2NvbnRyb2xfc3RhdGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kYmFfbW9kZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2RiYV9yYW1fc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kYmFfdHlwZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Rkcl90ZXN0X3N0YXR1c19zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Rkcl90ZXN0X3Jlc3VsdF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2hvc3RfY29ubmVjdGlvbl9mYWlsX3JlYXNvbl9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2RlYWN0aXZhdGlvbl9yZWFzb25fc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZWJ1Z19hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2RlYnVnX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2RlYnVnX2NsaV9pbnB1dF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2RlYnVnX2NsaV9vdXRwdXRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZWJ1Z19maWxlX2FsbW9zdF9mdWxsX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGVidWdfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGVidWdfcmVzZXRfYXBpX2NhcHR1cmVfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZWJ1Z19zdGFydF9hcGlfY2FwdHVyZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2RlYnVnX3N0b3BfYXBpX2NhcHR1cmVfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2VfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2VfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGV2aWNlX2NoaXBfcmV2aXNpb25fc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2VfY29ubmVjdF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9jb25uZWN0aW9uX2NvbXBsZXRlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGV2aWNlX2Nvbm5lY3Rpb25fZXN0YWJsaXNoZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2VfY29ubmVjdGlvbl9mYWlsdXJlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGV2aWNlX2Rkcl90ZXN0X2NvbXBsZXRlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGV2aWNlX2RldmljZV9rZWVwX2FsaXZlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGV2aWNlX2RldmljZV9yZWFkeV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9kaXNjb25uZWN0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGV2aWNlX2Rpc2Nvbm5lY3Rpb25fY29tcGxldGVfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2VfaG9zdF9rZWVwX2FsaXZlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGFfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfc3RhcnRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHlwZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9pbmRpY2F0aW9uc19kcm9wcGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGV2aWNlX2tleV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X25uaV9zcGVlZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9yZXNldF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9yZXNldF9tb2RlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZGV2aWNlX3J1bl9kZHJfdGVzdF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9zdGF0ZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9zd19lcnJvcl9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2RldmljZV9zd19leGNlcHRpb25faWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kZXZpY2Vfc3dfdXBncmFkZV9hY3RpdmF0ZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Rpc2FibGVfc2VyaWFsX251bWJlcl9jb250cm9sX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZHJ2X2ljZl9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Rydl9zZ2JfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9kc192bGFuX2FjdGlvbl9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3RmYl90cmFwX2JlaGF2aW9yX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfdGZiX21vZGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9saW1fc2VjX21vZGVfdXBfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9saW1fc2VjX21vZGVfZG5fc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94aW1fc2VjX21vZGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9oc2NfcmFtX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbGltX3JhbV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2xreV9yYW1fc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9taWNfcmFtX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeHBjc3JtX3JhbV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2VtYmVkZGVkX2ltYWdlX3RyYW5zZmVyX3N0YXR1c19zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9mb3JtYXRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lbmVyZ3lfZGV0ZWN0X3NvdXJjZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fMWdfdHVyYm9fbW9kZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fY2xvY2tfdHJhbnNwb3J0X21vZGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2RiYV9yZXBvcnRpbmdfbW9kZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19yYXRlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfc3RhdHVzX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19rZXlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xhc2VyX29uX29mZl92aW9sYXRpb25faWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX2xsaWRfcG9vbF9lbXB0eV92aW9sYXRpb25faWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX21heF9saW5rX3Zpb2xhdGlvbl9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfb3ZlcmhlYWRfcHJvZmlsZV92aW9sYXRpb25faWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JhbmdlX3Zpb2xhdGlvbl9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fZGVuaWVkX2xpbmtfcm9ndWVfdmlvbGF0aW9uX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19zeXN0ZW1fcmVzb3VyY2VfdmlvbGF0aW9uX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua190ZG1fY2hhbm5lbHNfZXhoYXVzdGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191bmtub3duX2xpbmtfdmlvbGF0aW9uX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9kZW5pZWRfbGlua191cHN0cmVhbV9iYW5kd2lkdGhfdmlvbGF0aW9uX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX21vZGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2tleV9jaG9pY2Vfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2VuY3J5cHRpb25fZGlyZWN0aW9uX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9mZWNfZW5fc3RhdGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX29hbV90eXBlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19kZWxldGVfbGlua19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19kdXBsaWNhdGVfbXBjcF9yZWdpc3RyYXRpb25fcmVxdWVzdF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19lbmNyeXB0aW9uX2VuYWJsZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfZmVjX3N0YXRlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX2ZvcmNlX3JlZGlzY292ZXJ5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX3N0YXR1c19zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X21wY3BfZGlzY292ZXJ5X2luZm9fc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9mYWlsdXJlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX2tleV9leGNoYW5nZV9zdGFydF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RhcnRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19rZXlfZXhjaGFuZ2Vfc3RvcHBlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19rZXlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfbGlua19kZWxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX2xpbmtfc3BlZWRfbWlzbWF0Y2hfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kZXJlZ2lzdGVyZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX21wY3BfcmVnX2Fja190aW1lb3V0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX21wY3BfcmVwb3J0X3RpbWVvdXRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lb3V0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19vYW1fa2VlcGFsaXZlX3RpbWVyX3N0b3BwZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfcHJlcHJvdmlzaW9uZWRfbGlua19jcmVhdGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX3Byb3RlY3Rpb25fc3dpdGNoX29jY3VycmVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX3JhbmdlX3ZhbHVlX2NoYW5nZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX2xpbmtfcmVyYW5nZV9mYWlsdXJlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19zdGF0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX3N0YXRlX2ZsYWdzX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX3N0YXRpY19yZWdpc3RyYXRpb25fZG9uZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9saW5rX3R5cGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9tcGNwX2dhdGVfbW9kZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X21wY3BfcmVnaXN0cmF0aW9uX2dhdGVfZmxhZ3Nfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX25pX2FkZF9saW5rX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9hZGRfbXVsdGljYXN0X2xpbmtfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX25pX2FkZF9wcm90ZWN0ZWRfc3RhbmRieV9saW5rX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfYXV0b19yb2d1ZV9zY2FuXzEwZ19mYWlsdXJlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9hdXRvX3JvZ3VlX3NjYW5fMWdfZmFpbHVyZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9lbl9zdGF0ZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9sbGlkX3F1YXJhbnRpbmVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9tcGNwX3RpbWVzdGFtcF9jaGFuZ2VkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9ub19yZXBvcnRzX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9vbnVfdXBncmFkZV9jb21wbGV0ZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfYXBwbHlfcmVyYW5nZV9kZWx0YV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfcmVyYW5nZV9mYWlsdXJlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9yb2d1ZV9sbGlkX3NjYW5faWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX25pX3JvZ3VlX3NjYW5fY29tcGxldGVfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX29hbV9leHRlbnNpb25fdHlwZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fb251XzEwZ191c19hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fb251XzEwZ191c19jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX29udV8xMGdfdXNfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9vbnVfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fb251XzEwZ191c19zdGF0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX29udV8xZ191c19jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX29udV8xZ191c19rZXlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX29udV8xZ191c19zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fb251XzFnX3VzX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9vbnVfMWdfdXNfc3RhdF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fb251X3VwZ3JhZGVfb251X3Jlc3BvbnNlX2NvZGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX29udV91cGdyYWRlX3JldHVybl9jb2RlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19rZXlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfZHNfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMTBnX2RzX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzEwZ19kc19zdGF0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19rZXlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcGF0aF8xMGdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMTBnX3VzX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzEwZ191c19zdGF0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcGF0aF8xZ19kc19rZXlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMWdfZHNfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzFnX2RzX3N0YXRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wYXRoXzFnX3VzX2tleV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcGF0aF8xZ191c19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9lcG9uX3BhdGhfMWdfdXNfc3RhdF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zdGF0ZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHlwZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3Byb3RlY3Rpb25fc3dpdGNoaW5nX2RldGVjdGlvbl9vcHRpb25zX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19yZXJhbmdpbmdfb3B0aW9uc19zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwaW9fcGluX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bpb19wb2xhcml0eV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2Vwb25fcnBfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZXBvbl9ycF9rZXlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9leHRfaXJxX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZmx1c2hfbWFjX3RhYmxlX29wdGlvbl9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2ZyZXF1ZW5jeV9hZGp1c3RtZW50X2RpcmVjdGlvbl9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dlbV9wb3J0X2RpcmVjdGlvbl9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dlbV9wb3J0X3R5cGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9nZW1fcG9ydF9vcGVyYXRpb25fc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncGlvX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwaW9fa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bpb19waW5fZGlyX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bpb192YWx1ZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fYWxsb2NfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2FsbG9jX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2FsbG9jX2dldF9zdGF0c19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fYWxsb2Nfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9hbGxvY19zZXRfc3RhdGVfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fYWxsb2Nfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2FsbG9jX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9hbGxvY19zdGF0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fZ2VtX3BvcnRfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGVfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2dlbV9wb3J0X3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zdGF0ZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2ZfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3dfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2ZfZHNfaW5ncmVzc19mbG93X2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX2RzX2luZ3Jlc3NfZmxvd19rZXlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2l3Zl9mbHVzaF9tYWNfdGFibGVfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2ZfZmx1c2hfbWFjX3RhYmxlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2Zfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2FnZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2Ryb3BwZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmVfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbmV3X21hY19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX3NjYW5fbWFjX3RhYmxlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9pd2Zfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2l3Zl9zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX3N0YXRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX2l3Zl91c19mbG93X2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfa2V5X2V4Y2hhbmdlX21vZGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX2FjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfZmFpbHVyZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHNfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX2RlYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9kaXNhYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9lbmFibGVfYWxsX29udXNfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9rZXlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX2xvc19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfb251X2Rpc2NvdmVyZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX29udV91cGdyYWRlX2NvbXBsZXRlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfc3dpdGNob3Zlcl9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190eXBlX2Nfc2V0X211bHRpcGxlX29udV9zdGF0ZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfcmVzZXRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX3JvZ3VlX2RldGVjdGlvbl93aW5kb3dfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX3JvZ3VlX29udV9zcGVjaWFsX21hcF9jeWNsZV9zdGFydF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfc2V0X29udV9zdGF0ZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfc3RhbmRieV9wb25fbW9uaXRvcmluZ19jeWNsZV9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX3N0YXJ0X29udV91cGdyYWRlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX25pX3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV9zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfc3RhdF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fbmlfdG9kX3JlcXVlc3RfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9uaV90b2RfcmVxdWVzdF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfYmVyX2ludGVydmFsX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfY2hhbmdlX3Bvd2VyX2xldmVsX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfY3B1X3BhY2tldF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfZGZpX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfZGdpX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfZG93aV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X2Vycl9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X2ludmFsaWRfZGJydV9yZXBvcnRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2N5Y2xlX3NraXBwZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2VfZGVjcnlwdF9yZXF1aXJlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9rZXlfZXhjaGFuZ2Vfa2V5X3JlcXVlc3RfdGltZW91dF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV91bmNvbnNlY3V0aXZlX2luZGV4X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfbG9haV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X2xva2lfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9tZW1pX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfb21jaV9wYWNrZXRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9vbWNpX3BvcnRfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9vbnVfYWN0aXZhdGlvbl9zdGFuZGJ5X2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X29udV9hbGFybV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9vcHRpY2FsX3JlZmxlY3Rpb25faWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9wZWVfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9wbG9hbV9wYWNrZXRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9wb3NzaWJsZV9kcmlmdF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X3Bvd2VyX21hbmFnZW1lbnRfc3RhdGVfY2hhbmdlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfcHN0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9yZWlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X3Jzc2lfbWVhc3VyZW1lbnRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9zZGlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfc2ZpX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fb251X3N0YXRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ncG9uX29udV9zdWZpX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfdGl3aV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X29tY2lfZGV2aWNlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfZ3Bvbl9vbnVfdXBncmFkZV9yZXR1cm5fY29kZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X29tY2lfcmVzdWx0X2NvZGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9vbnVfc3RhdGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9yc3NpX2xvY2F0aW9uX3NpZ25fc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9vbnVfcG9zdF9kaXNjb3ZlcnlfbW9kZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fdHJ4X2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2dwb25fdHJ4X2tleV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2ltYWdlX3RyYW5zZmVyX3N0YXR1c19zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2l3Zl9tb2RlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbG9nX2VudHJ5X2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbG9nX2VudHJ5X2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2xvZ19lbnRyeV9rZXlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9sb2dfZW50cnlfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfYWxhcm1fcmFpc2VkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbG9nX2VudHJ5X3N0YXRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9sb2dfZmlsZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2xvZ19sZXZlbF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2xvZ19zdHlsZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2xvZ190eXBlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbG9nZ2VyX2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbG9nZ2VyX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2xvZ2dlcl9jbGVhcl9sb2dfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9sb2dnZXJfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbG9nZ2VyX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2xvZ2dlcl9zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2xvZ2dlcl9zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X2xvZ2dlcl9zdGF0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbWFjX3RhYmxlX21pc3NfZmFsbGJhY2tfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9tYWNfdGFibGVfbGVhcm5pbmdfbW9kZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X21hcHBpbmdfdGFnX21ldGhvZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X25uaV9hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X25uaV9jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ubmlfY29ubmVjdGlvbl9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X25uaV9rZXlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF90cml2YWxlbnRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9ubmlfc2VyZGVzX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X25uaV9zZXJkZXNfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbm5pX3N0YXRfYWxhcm1fY2xlYXJlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X25uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X25uaV9zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X25uaV9zdGF0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfbm5pX3N0YXR1c19jaGFuZ2VkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfb2RuX2NsYXNzX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfb21jaV9wb3J0X2lkX29wZXJhdGlvbl9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X29udV9vcGVyYXRpb25fc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9vbnVfcG93ZXJfbGV2ZWxfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF90Y19wcm90b2NvbF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3BhY2tldF9pbmplY3Rpb25fZXJyb3Jfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9wYWNrZXRfdHlwZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2ZhaWxfcmVhc29uX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcG9sYXJpdHlfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9wb2xsaW5nX2ludGVydmFsX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcG9uX29wZXJhdGlvbl9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3Bvbl9wcm90ZWN0aW9uX3N3aXRjaGluZ19vcHRpb25zX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcG9uX3N0YXRlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcG93ZXJfbGV2ZWxsaW5nX2NvbnRyb2xfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9wb3dlcl9tYW5hZ2VtZW50X3RyYW5zaXRpb25fcmVhc29uX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcHJic19wb2x5bm9taWFsX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcHJic19jaGVja2VyX21vZGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9wcmJzX2xvY2tfc3RhdGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9yYW1hbl9taXRpZ2F0aW9uX21vZGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9yYW5naW5nX2ZhaWxfcmVhc29uX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcmVnaXN0cmF0aW9uX2JlaGF2aW9yX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcmVxdWVzdF9yZWdpc3RyYXRpb25fZmFpbF9yZWFzb25fc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9yZXN1bHRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fYWxnb3JpdGhtX3R5cGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcm9ndWVfbWVhc3VyZW1lbnRfcmVzdWx0X3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfcm9ndWVfc2Nhbl9zdGF0dXNfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9yc3NpX21lYXN1cmVtZW50X2ZhaWxfcmVhc29uX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9mYWlsX3JlYXNvbl9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3NlcmRlc19yYW5naW5nX21vZGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9zZXJkZXNfaW5zdGFuY2Vfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9zaGFwZXJfbW9kZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3NvZnR3YXJlX2Vycm9yX2tleV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3N0YXRfY29uZGl0aW9uX3R5cGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF9zd2l0Y2hfb3Zlcl90eXBlX2Nfb251X3N0YXRlX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfc3lzdGVtX21vZGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF91c19vcGVyYXRpbmdfd2F2ZWxlbmd0aF9iYW5kc19zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3RyYWZmaWNfcmVzdW1lX3Jlc3VsdF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9jYXB0dXJlX3dpbmRvd19hbmRfc3RhdGlzdGljX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl9rZXlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RhcnRfY2FwdHVyZV93aW5kb3dfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fc3RvcF9jYXB0dXJlX3dpbmRvd19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3RyeF9jYWxpYnJhdGlvbl90cmlnZ2VyX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfdHJ4X2NhbGlicmF0aW9uX3RyaWdnZXJfcG9zaXRpb25fc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF90cnhfY2FsaWJyYXRpb25fd2luZG93X21vZGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF90cnhfdHlwZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3R1bmVfaW5fZmFpbF9yZWFzb25fc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF90dW5lX291dF9mYWlsX3JlYXNvbl9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3VhcnRfYmF1ZHJhdGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF91c19nZW1fcG9ydF9kZXN0aW5hdGlvbl9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3VzX3ZsYW5fYWN0aW9uX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfdmxhbl90b19mbG93X21hcHBpbmdfbWV0aG9kX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fYWxsb2NfYXV0b19jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9hbGxvY19jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX2FsbG9jX2dldF9hbGxvY19zdGF0c19jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9hbGxvY19nZXRfc3RhdHNfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9hbGxvY19rZXlfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGVfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9hbGxvY19zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX2FsbG9jX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fYWxsb2Nfc3RhdF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX2dlbV9wb3J0X2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9jbGVhcmVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fZ2VtX3BvcnRfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0X2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX2dlbV9wb3J0X3N0YXRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9nZW1fcG9ydF9zdGF0ZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX2l3Zl9jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9pd2Zfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfYWN0aXZhdGVfYWxsX29udXNfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfYWRqdXN0X3R4X3dhdmVsZW5ndGhfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9hdXRvX2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX2Jyb2FkY2FzdF9wbG9hbV9wYWNrZXRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9jcHVfcGFja2V0c19mYWlsdXJlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfY3B1X3BhY2tldHNfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9kZWFjdGl2YXRlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX2Rpc2FibGVfYWxsX29udXNfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfZGlzYWJsZV9zZXJpYWxfbnVtYmVyX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfZW5hYmxlX2FsbF9vbnVzX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX2tleV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX2xvc19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX29udV9kaXNjb3ZlcmVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfb251X3VwZ3JhZGVfY29tcGxldGVfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3N3aXRjaG92ZXJfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWVfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9yZXNldF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX3JvZ3VlX2RldGVjdGlvbl9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9yb2d1ZV9kZXRlY3Rpb25fd2luZG93X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfcm9ndWVfb251X3NwZWNpYWxfbWFwX2N5Y2xlX3N0YXJ0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfcnVuX3NwZWNpYWxfYndfbWFwX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfc2VyaWFsX251bWJlcl9hY3F1aXNpdGlvbl9jeWNsZV9zdGFydF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX3NldF9vbnVfc3RhdGVfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfc2luZ2xlX3JlcXVlc3Rfc3RhbmRieV9wb25fbW9uaXRvcmluZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX3N0YW5kYnlfcG9uX21vbml0b3JpbmdfY3ljbGVfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfc3RhcnRfb251X3VwZ3JhZGVfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV9zdGF0X2FsYXJtX3JhaXNlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX3N0YXRfY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fbmlfc3RhdF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9uaV90b2RfcmVxdWVzdF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX251bV9vZl9vbnVzX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X2FkanVzdF90eF93YXZlbGVuZ3RoX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X2F1dG9fY2ZnX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X2NmZ19pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9jaGFuZ2VfcG93ZXJfbGV2ZWxsaW5nX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfY3B1X3BhY2tldHNfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfZGZpX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X2RnaV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9kb3dpX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X2dldF9wb3dlcl9jb25zdW1wdGlvbl9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9nZXRfcG93ZXJfbGV2ZWxfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfaW52YWxpZF9kYnJ1X3JlcG9ydF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9jeWNsZV9za2lwcGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X2tleV9leGNoYW5nZV9rZXlfbWlzbWF0Y2hfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2tleV9yZXF1ZXN0X3RpbWVvdXRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X2xvb2NpX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X29tY2lfcGFja2V0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X29udV9hY3RpdmF0aW9uX2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm1faWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X29udV9lbmFibGVfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5fY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfaW5faWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXRfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X29wdGljYWxfcmVmbGVjdGlvbl9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9wbG9hbV9wYWNrZXRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfcG9zc2libGVfZHJpZnRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfcG93ZXJfY29uc3VtcHRpb25fcmVwb3J0X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X3Bvd2VyX2xldmVsX3JlcG9ydF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9wb3dlcl9tYW5hZ2VtZW50X3N0YXRlX2NoYW5nZV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9wcXNpX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X3JhbmdpbmdfY29tcGxldGVkX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X3JlZ2lzdHJhdGlvbl9pZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9yZXF1ZXN0X3JlZ2lzdHJhdGlvbl9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9yc3NpX21lYXN1cmVtZW50X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X3NkaV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9zZWN1cmVfbXV0dWFsX2F1dGhlbnRpY2F0aW9uX2ZhaWx1cmVfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfc2VjdXJlX211dHVhbF9hdXRoZW50aWNhdGlvbl9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X3NmaV9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9zdGF0X2FsYXJtX2NsZWFyZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9hbGFybV9yYWlzZWRfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfc3RhdF9pZF9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX29udV9zdWZpX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fb251X3Rpd2lfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlX2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fc2VyZGVzX3JhbmdpbmdfbW9kZV9zdHJpbmdfdGFibGVbXTsKK2V4dGVybiBiY21jbGlfZW51bV92YWwgYmNtb2x0X3hncG9uX3RyeF9jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94Z3Bvbl90cnhfa2V5X2lkX3N0cmluZ190YWJsZVtdOworZXh0ZXJuIGJjbWNsaV9lbnVtX3ZhbCBiY21vbHRfeGdwb25fdHJ4X3R5cGVfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94cG9uX3NlcmRlc19jZmdfaWRfc3RyaW5nX3RhYmxlW107CitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbW9sdF94cG9uX3NlcmRlc19rZXlfaWRfc3RyaW5nX3RhYmxlW107CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogTUFQTEVfQ0xJX0hFTFBFUlNfSF8gKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfY2xpL2JjbV9hcGlfY2xpX3R5cGVzLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvYXBpX2NsaS9iY21fYXBpX2NsaV90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZWQ0MGUKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvYXBpX2NsaS9iY21fYXBpX2NsaV90eXBlcy5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgQkNNX0FQSV9EQVRBX1RZUEVTX0hfCisjZGVmaW5lIEJDTV9BUElfREFUQV9UWVBFU19IXworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtb2x0X21vZGVsX3R5cGVzLmg+CisKKy8qIFByb3BlcnR5IGFjY2VzcyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNT0xUX1BST1BfQUNDRVNTX0lEX1IgPSAweDEsICAgLyogUmVhZCBhY2Nlc3MgKi8KKyAgICBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfVyA9IDB4MiwgICAvKiBXcml0ZSBhY2Nlc3MgKi8KKyAgICBCQ01PTFRfUFJPUF9BQ0NFU1NfSURfUlcgPSAweDMsICAvKiBSZWFkLXdyaXRlICovCit9IGJjbW9sdF9wcm9wX2FjY2Vzc19pZDsKKworLyogQmFzZSBkYXRhIHR5cGVzICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBCQ01PTFRfQkFTRV9UWVBFX0lEX1NOVU0sICAgICAgIC8qIHNpZ25lZCBudW1iZXIgKi8KKyAgICBCQ01PTFRfQkFTRV9UWVBFX0lEX1VOVU0sICAgICAgIC8qIHVuc2lnbmVkIG51bWJlciAqLworICAgIEJDTU9MVF9CQVNFX1RZUEVfSURfVU5VTV9IRVgsICAgLyogdW5zaWduZWQgbnVtYmVyIHByaW50ZWQgaW4gaGV4ICovCisgICAgQkNNT0xUX0JBU0VfVFlQRV9JRF9GTE9BVCwgICAgICAvKiBmbG9hdGluZy1wb2ludCBudW1iZXIgKi8KKyAgICBCQ01PTFRfQkFTRV9UWVBFX0lEX0JPT0wsICAgICAgIC8qIGJvb2xlYW4gKHplcm89bm8sIG5vbnplcm89eWVzKSAqLworICAgIEJDTU9MVF9CQVNFX1RZUEVfSURfU1RSSU5HLCAgICAgLyogc3RyaW5nICovCisgICAgQkNNT0xUX0JBU0VfVFlQRV9JRF9JUFY0LCAgICAgICAvKiBJUHY0IGFkZHJlc3MgKi8KKyAgICBCQ01PTFRfQkFTRV9UWVBFX0lEX01BQywgICAgICAgIC8qIE1BQyBhZGRyZXNzICovCisgICAgQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNLCAgICAgICAvKiBlbnVtICovCisgICAgQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNX01BU0ssICAvKiBiaXRtYXNrIGVudW0gKi8KKyAgICBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCwgICAgIC8qIHN0cnVjdCAqLworICAgIEJDTU9MVF9CQVNFX1RZUEVfSURfVU5JT04sICAgICAgLyogdW5pb24gKi8KKyAgICBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9EWU4sICAgIC8qIGR5bmFtaWNhbGx5LXNpemVkIGFycmF5ICovCisgICAgQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRklYRUQsICAvKiBmaXhlZC1zaXplIGFycmF5ICovCit9IGJjbW9sdF9iYXNlX3R5cGVfaWQ7CisKKyNlbmRpZiAvKiBCQ01fQVBJX0RBVEFfVFlQRVNfSF8gKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfZGV2X2xvZy9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfZGV2X2xvZy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzQyZTlhCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2FwaV9kZXZfbG9nL01ha2VmaWxlCkBAIC0wLDAgKzEsMjIgQEAKKyMgCisjIEFQSS9sb2dnZXIgaW50ZWdyYXRpb24KKyMKK01PRF9OQU1FID0gYXBpX2Rldl9sb2cKK01PRF9UWVBFID0gbGliCitNT0RfREVQUyA9IGRldl9sb2cgCisKK2lmZXEgKCIkKEVOQUJMRV9MT0cpIiwgInkiKQorICAgIGlmZXEgKCIkKEVOQUJMRV9DTEkpIiwgInkiKQorCWlmZXEgKCIkKFJFTEVBU0VfQlVJTEQpIiwgInkiKQorCSAgICBNT0RfREVQUyArPSBhcGlfY2xpCisJZWxzZQorCSAgICBNT0RfREVQUyArPSBhcGlfY2xpX2hlbHBlcnMKKwllbmRpZgorCisJaWZlcSAoIiQoT1NfS0VSTkVMKSIsICJsaW51eCIpCisJICAgTU9EX0RFUFMgKz0gZGV2X2xvZ19saW51eAorCWVuZGlmCisKKwlzcmNzID0gYmNtX2FwaV9kZXZfbG9nLmMKKyAgICBlbmRpZgorZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfZGV2X2xvZy9iY21fYXBpX2Rldl9sb2cuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfZGV2X2xvZy9iY21fYXBpX2Rldl9sb2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWI4NjM4Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2FwaV9kZXZfbG9nL2JjbV9hcGlfZGV2X2xvZy5jCkBAIC0wLDAgKzEsNzc4IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtb2x0X21zZy5oPgorI2luY2x1ZGUgPGJjbV9kZXZfbG9nLmg+CisjaW5jbHVkZSA8YmNtX2FwaV9jbGlfaGVscGVycy5oPgorI2luY2x1ZGUgImJjbV9hcGlfZGV2X2xvZy5oIgorCisvKiBtYXhpbXVtIG51bWJlciBvZiB0YXNrcyB0aGF0IGNhbiB1c2UgdGhlIEFQSS9sb2dnZXIgaW50ZWdyYXRpb24gc2ltdWx0YW5lb3VzbHkgKi8KKyNkZWZpbmUgQVBJX0xPR19OVU1fQkxLUyAxNgorCisvKiBzdHJpbmcgdGhhdCBkZW5vdGVzIHRoYXQgdGhpcyBlbnRyeSBpcyBub3QgY29tcGxldGUgLSB0aGVyZSBpcyBtb3JlIGRhdGEgdG8gY29tZSAqLworI2RlZmluZSBBUElfTE9HX0NPTlRfU1RSICIuLi4iCisKKy8qIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlc2VydmVkIGF0IHRoZSBlbmQgb2YgZWFjaCBsb2cgZW50cnkgKGNvbnRpbnVhdGlvbiBzdHJpbmcgKyBuZXdsaW5lKSAqLworI2RlZmluZSBBUElfTE9HX0VOVFJZX09WRVJIRUFEIHNpemVvZihBUElfTE9HX0NPTlRfU1RSKQorCit0eXBlZGVmIHN0cnVjdAoreworICAgIGRldl9sb2dfaWQgbG9nX2lkOworICAgIGNvbnN0IGJjbW9sdF9tc2cgKm1zZzsKKyAgICBjaGFyICpidWY7CisgICAgdWludDMyX3QgdXNlZDsKK30gYXBpX2xvZ19yZWM7CisKK3N0YXRpYyBiY21vc19ibGtfcG9vbCBhcGlfbG9nX2Jsa19wb29sOworCitzdGF0aWMgYmNtb3NfZXJybm8gYXBpX2xvZ19kdW1wX2RhdGFfdHlwZSgKKyAgICBhcGlfbG9nX3JlYyAqcmVjLAorICAgIGNvbnN0IGJjbWNsaV90eXBlX2Rlc2NyICp0ZCwKKyAgICBjb25zdCB2b2lkICpkYXRhLAorICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgdWludDMyX3QgbnVtX2VudHJpZXMsCisgICAgdWludDMyX3QgZW50cnlfc2l6ZSk7CisKK3N0YXRpYyBiY21vc19ib29sIGFwaV9sb2dfaXNfc2luZ2xldG9uKGJjbW9sdF9tZ3RfZ3JvdXAgZ3JvdXApCit7CisgICAgc3dpdGNoIChncm91cCkKKyAgICB7CisgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHOgorICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGFwaV9sb2dfYnVmX3JlbWFpbmluZyhjb25zdCBhcGlfbG9nX3JlYyAqcmVjKQoreworICAgIHJldHVybiAoTUFYX0RFVl9MT0dfU1RSSU5HX05FVF9TSVpFIC0gQVBJX0xPR19FTlRSWV9PVkVSSEVBRCkgLSByZWMtPnVzZWQ7Cit9CisKK3N0YXRpYyB2b2lkIGFwaV9sb2dfZmx1c2goYXBpX2xvZ19yZWMgKnJlYywgY29uc3QgY2hhciAqZW5kX29mX2xpbmUpCit7CisgICAgaWYgKHJlYy0+dXNlZCAhPSAwKQorICAgIHsKKyAgICAgICAgc3RybmNhdChyZWMtPmJ1ZiwgZW5kX29mX2xpbmUsIE1BWF9ERVZfTE9HX1NUUklOR19ORVRfU0laRSAtIHJlYy0+dXNlZCk7CisgICAgICAgIGJjbV9kZXZfbG9nX2xvZyhyZWMtPmxvZ19pZCwgREVWX0xPR19MRVZFTF9JTkZPLCBCQ01fTE9HX0ZMQUdfQ0FMTEVSX0ZNVCwgIiVzIiwgcmVjLT5idWYpOworICAgICAgICByZWMtPnVzZWQgPSAwOworICAgIH0KK30KKworc3RhdGljIHZvaWQgYXBpX2xvZ19wcmludChhcGlfbG9nX3JlYyAqcmVjLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKyAgICB2YV9saXN0IGFyZ3M7CisgICAgaW50IHJldDsKKworICAgIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisgICAgcmV0ID0gdnNucHJpbnRmKHJlYy0+YnVmICsgcmVjLT51c2VkLCBhcGlfbG9nX2J1Zl9yZW1haW5pbmcocmVjKSwgZm9ybWF0LCBhcmdzKTsKKyAgICB2YV9lbmQoYXJncyk7CisKKyAgICBpZiAocmV0IDwgMCB8fCByZXQgPiBhcGlfbG9nX2J1Zl9yZW1haW5pbmcocmVjKSkKKyAgICB7CisgICAgICAgIC8qIHRoaXMgcHJpbnQgZG9lc24ndCBmaXQgaW4gdGhlIGJ1ZmZlciAtIHNlbmQgdGhlIGN1cnJlbnQgYnVmZmVyIGFuZCBjcmVhdGUgYSBuZXcgY29udGludWF0aW9uIGxvZyBlbnRyeSAqLworICAgICAgICByZWMtPmJ1ZltyZWMtPnVzZWRdID0gJ1wwJzsKKyAgICAgICAgYXBpX2xvZ19mbHVzaChyZWMsIEFQSV9MT0dfQ09OVF9TVFIgIlxuIik7CisKKyAgICAgICAgLyogdGhlIGNvbnRpbnVhdGlvbiBlbnRyeSBjYW4gc2tpcCB0aGUgaGVhZGVyICovCisgICAgICAgIGFwaV9sb2dfcHJpbnQocmVjLCBBUElfTE9HX0NPTlRfU1RSKTsKKworICAgICAgICAvKiB0cnkgYWdhaW4sIHRoaXMgdGltZSBhZ2FpbnN0IHRoZSBjb250aW51YXRpb24gZW50cnkgKi8KKyAgICAgICAgdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKyAgICAgICAgcmV0ID0gdnNucHJpbnRmKHJlYy0+YnVmICsgcmVjLT51c2VkLCBhcGlfbG9nX2J1Zl9yZW1haW5pbmcocmVjKSwgZm9ybWF0LCBhcmdzKTsKKyAgICAgICAgdmFfZW5kKGFyZ3MpOworCisgICAgICAgIGlmIChyZXQgPCAwIHx8IHJldCA+IGFwaV9sb2dfYnVmX3JlbWFpbmluZyhyZWMpKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCByZWMtPmxvZ19pZCwgIkFQSSBtZXNzYWdlIGxvZyBvdmVyZmxvdyBvbiBtc2cgIyV1XG4iLCByZWMtPm1zZy0+Y29ycl90YWcpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmVjLT51c2VkICs9IHJldDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZWMtPnVzZWQgKz0gcmV0OworICAgIH0KK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGFwaV9sb2dfcmVhZF9zbnVtKGNvbnN0IGJjbWNsaV90eXBlX2Rlc2NyICp0ZCwgY29uc3Qgdm9pZCAqZGF0YSwgaW50NjRfdCAqbikKK3sKKyAgICBzd2l0Y2ggKHRkLT5zaXplKQorICAgIHsKKyAgICBjYXNlIDE6CisgICAgeworICAgICAgICBpbnQ4X3QgbjEgPSAqKGNvbnN0IGludDhfdCAqKWRhdGE7CisgICAgICAgICpuID0gbjE7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIDI6CisgICAgeworICAgICAgICBpbnQxNl90IG4yID0gKihjb25zdCBpbnQxNl90ICopZGF0YTsKKyAgICAgICAgKm4gPSBuMjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgNDoKKyAgICB7CisgICAgICAgIGludDMyX3QgbjQgPSAqKGNvbnN0IGludDMyX3QgKilkYXRhOworICAgICAgICAqbiA9IG40OworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSA4OgorICAgIHsKKyAgICAgICAgbWVtY3B5KG4sIGRhdGEsIHNpemVvZigqbikpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9UX1NVUFBPUlRFRDsKKyAgICB9CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBhcGlfbG9nX3JlYWRfdW51bShjb25zdCBiY21jbGlfdHlwZV9kZXNjciAqdGQsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQ2NF90ICpuKQoreworICAgIHN3aXRjaCAodGQtPnNpemUpCisgICAgeworICAgIGNhc2UgMToKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgbjEgPSAqKGNvbnN0IHVpbnQ4X3QgKilkYXRhOworICAgICAgICAqbiA9IG4xOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAyOgorICAgIHsKKyAgICAgICAgdWludDE2X3QgbjIgPSAqKGNvbnN0IHVpbnQxNl90ICopZGF0YTsKKyAgICAgICAgKm4gPSBuMjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgNDoKKyAgICB7CisgICAgICAgIHVpbnQzMl90IG40ID0gKihjb25zdCB1aW50MzJfdCAqKWRhdGE7CisgICAgICAgICpuID0gbjQ7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIDg6CisgICAgeworICAgICAgICBtZW1jcHkobiwgZGF0YSwgc2l6ZW9mKCpuKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworICAgIH0KKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogYnJlYWsgYSBzdHJpbmcgdXAgaW50byBzbWFsbGVyIGNodW5rcyAocHJlZmVyYWJseSBhdCBcbiBib3VuZGFyaWVzKSBzbyB3ZSBkb24ndCBvdmVyZmxvdyB0aGUgc2l6ZSBvZiBhIGxvZyBlbnRyeSAqLworc3RhdGljIHZvaWQgYXBpX2xvZ19wcmludF9sb25nX2xpbmUoYXBpX2xvZ19yZWMgKnJlYywgY29uc3QgY2hhciAqbGluZSwgdWludDMyX3QgbGVuKQoreworICAgIHVpbnQzMl90IGk7CisgICAgdWludDMyX3QgaGFuZGxlZCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKGxpbmVbaV0gPT0gJ1xuJykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGkgPiBoYW5kbGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaV9sb2dfcHJpbnQocmVjLCAiJS4qcyIsIGkgLSBoYW5kbGVkLCAmbGluZVtoYW5kbGVkXSk7CisgICAgICAgICAgICAgICAgYXBpX2xvZ19mbHVzaChyZWMsIEFQSV9MT0dfQ09OVF9TVFIgIlxuIik7CisgICAgICAgICAgICAgICAgYXBpX2xvZ19wcmludChyZWMsIEFQSV9MT0dfQ09OVF9TVFIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaGFuZGxlZCA9IGkgKyAxOworICAgICAgICB9CisgICAgICAgIGlmIChpID4gaGFuZGxlZCAmJiBpIC0gaGFuZGxlZCA9PSAzMikKKyAgICAgICAgeworICAgICAgICAgICAgYXBpX2xvZ19wcmludChyZWMsICIlLipzIiwgMzIsICZsaW5lW2hhbmRsZWRdKTsKKyAgICAgICAgICAgIGhhbmRsZWQgPSBpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChoYW5kbGVkIDwgbGVuKQorICAgIHsKKyAgICAgICAgYXBpX2xvZ19wcmludChyZWMsICIlLipzIiwgbGVuIC0gaGFuZGxlZCwgJmxpbmVbaGFuZGxlZF0pOworICAgIH0KK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGFwaV9sb2dfZHVtcF9zaW1wbGVfZGF0YV90eXBlKAorICAgIGFwaV9sb2dfcmVjICpyZWMsCisgICAgY29uc3QgYmNtY2xpX3R5cGVfZGVzY3IgKnRkLAorICAgIGNvbnN0IHZvaWQgKmRhdGEsCisgICAgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBiY21vc19lcnJubyBlcnIgPSBCQ01fRVJSX09LOworCisgICAgc3dpdGNoICh0ZC0+YmFzZV90eXBlKQorICAgIHsKKyAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfU05VTTogICAgICAgLyogc2lnbmVkIG51bWJlciAqLworICAgIHsKKyAgICAgICAgaW50NjRfdCBuID0gMDsKKyAgICAgICAgZXJyID0gYXBpX2xvZ19yZWFkX3NudW0odGQsIGRhdGEsICZuKTsKKyAgICAgICAgYXBpX2xvZ19wcmludChyZWMsICIlbGxkIiwgKGxvbmcgbG9uZyluKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBCQ01PTFRfQkFTRV9UWVBFX0lEX1VOVU06ICAgICAgIC8qIHVuc2lnbmVkIG51bWJlciAqLworICAgIHsKKyAgICAgICAgdWludDY0X3QgbiA9IDA7CisgICAgICAgIGVyciA9IGFwaV9sb2dfcmVhZF91bnVtKHRkLCBkYXRhLCAmbik7CisgICAgICAgIGFwaV9sb2dfcHJpbnQocmVjLCAiJWxsdSIsICh1bnNpZ25lZCBsb25nIGxvbmcpbik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgQkNNT0xUX0JBU0VfVFlQRV9JRF9VTlVNX0hFWDogICAvKiB1bnNpZ25lZCBudW1iZXIgcHJpbnRlZCBpbiBoZXggKi8KKyAgICB7CisgICAgICAgIHVpbnQ2NF90IG4gPSAwOworICAgICAgICBlcnIgPSBhcGlfbG9nX3JlYWRfdW51bSh0ZCwgZGF0YSwgJm4pOworICAgICAgICBhcGlfbG9nX3ByaW50KHJlYywgIjB4JWxseCIsICh1bnNpZ25lZCBsb25nIGxvbmcpbik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgQkNNT0xUX0JBU0VfVFlQRV9JRF9GTE9BVDogICAgICAvKiBmbG9hdGluZy1wb2ludCBudW1iZXIgKi8KKyAgICB7CisgICAgICAgIGlmICh0ZC0+c2l6ZSA9PSBzaXplb2YoZmxvYXQpKQorICAgICAgICB7CisgICAgICAgICAgICBhcGlfbG9nX3ByaW50KHJlYywgIiVmIiwgKihjb25zdCBmbG9hdCAqKWRhdGEpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHRkLT5zaXplID09IHNpemVvZihkb3VibGUpKQorICAgICAgICB7CisgICAgICAgICAgICBhcGlfbG9nX3ByaW50KHJlYywgIiVmIiwgKihjb25zdCBkb3VibGUgKilkYXRhKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGVyciA9IEJDTV9FUlJfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfQk9PTDoKKyAgICB7CisgICAgICAgIHVpbnQ2NF90IG4gPSAwOworICAgICAgICBlcnIgPSBhcGlfbG9nX3JlYWRfdW51bSh0ZCwgZGF0YSwgJm4pOworICAgICAgICBhcGlfbG9nX3ByaW50KHJlYywgIiVzIiwgbiA9PSAwID8gIm5vIiA6ICJ5ZXMiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUklORzogICAgIC8qIHN0cmluZyAqLworICAgIHsKKyAgICAgICAgdWludDMyX3Qgc2l6ZSA9IHRkLT5zaXplOworICAgICAgICBpZiAoc2l6ZSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBzaXplID0gc3RybGVuKChjb25zdCBjaGFyICopZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgYXBpX2xvZ19wcmludF9sb25nX2xpbmUocmVjLCAoY29uc3QgY2hhciAqKWRhdGEsIHNpemUpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfSVBWNDogICAgICAgLyogSVB2NCBhZGRyZXNzICovCisgICAgeworICAgICAgICB1aW50MzJfdCBpcDsKKyAgICAgICAgbWVtY3B5KCZpcCwgZGF0YSwgc2l6ZW9mKGlwKSk7CisgICAgICAgIGFwaV9sb2dfcHJpbnQocmVjLCAiJWQuJWQuJWQuJWQiLCAoaXA+PjI0KSYweGZmLCAoaXA+PjE2KSYweGZmLCAoaXA+PjgpJjB4ZmYsIGlwICYgMHhmZik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgQkNNT0xUX0JBU0VfVFlQRV9JRF9NQUM6ICAgICAgICAvKiBNQUMgYWRkcmVzcyAqLworICAgIHsKKyAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgbWFjOworICAgICAgICBtZW1jcHkobWFjLnU4LCBkYXRhLCBzaXplb2YobWFjLnU4KSk7CisgICAgICAgIGFwaV9sb2dfcHJpbnQocmVjLCAiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLAorICAgICAgICAgICAgbWFjLnU4WzBdLCBtYWMudThbMV0sIG1hYy51OFsyXSwgbWFjLnU4WzNdLCBtYWMudThbNF0sIG1hYy51OFs1XSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgQkNNT0xUX0JBU0VfVFlQRV9JRF9FTlVNOiAgICAgICAvKiBlbnVtICovCisgICAgeworICAgICAgICB1aW50NjRfdCBuID0gMDsKKyAgICAgICAgZXJyID0gYXBpX2xvZ19yZWFkX3VudW0odGQsIGRhdGEsICZuKTsKKyAgICAgICAgQlVHX09OKHRkLT54LmUgPT0gTlVMTCk7CisgICAgICAgIGFwaV9sb2dfcHJpbnQocmVjLCAiJXMiLCBiY21jbGlfZW51bV9zdHJpbmd2YWwodGQtPnguZSwgbikpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfRU5VTV9NQVNLOgorICAgIHsKKyAgICAgICAgdWludDY0X3QgbiA9IDA7CisgICAgICAgIGJjbWNsaV9lbnVtX3ZhbCAqdmFsdWUgPSB0ZC0+eC5lOworICAgICAgICBiY21vc19ib29sIGZpcnN0ID0gQkNNT1NfVFJVRTsKKyAgICAgICAgQlVHX09OKHZhbHVlID09IE5VTEwpOworICAgICAgICBlcnIgPSBhcGlfbG9nX3JlYWRfdW51bSh0ZCwgZGF0YSwgJm4pOworICAgICAgICB3aGlsZSAodmFsdWUtPm5hbWUgIT0gTlVMTCAmJiBuICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgodmFsdWUtPnZhbCAmIG4pICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpX2xvZ19wcmludChyZWMsICIlcyVzIiwgZmlyc3QgPyAiIiA6ICIrIiwgdmFsdWUtPm5hbWUpOworICAgICAgICAgICAgICAgIGZpcnN0ID0gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuIC09IHZhbHVlLT52YWw7CisgICAgICAgICAgICArK3ZhbHVlOworICAgICAgICB9CisgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgeworICAgICAgICAgICAgYXBpX2xvZ19wcmludChyZWMsICItIik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgICAgZXJyID0gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIHVpbnQxNl90IGFwaV9sb2dfZ2V0X251bV9lbnVtX3ZhbHMoY29uc3QgYmNtY2xpX2VudW1fdmFsICp2YWxzKQoreworICAgIGNvbnN0IGJjbWNsaV9lbnVtX3ZhbCAqdiA9IHZhbHM7CisgICAgd2hpbGUgKHYgIT0gTlVMTCAmJiB2LT5uYW1lICE9IE5VTEwpCisgICAgeworICAgICAgICArK3Y7CisgICAgfQorICAgIHJldHVybiAodWludDE2X3QpKHYgLSB2YWxzKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGFwaV9sb2dfZHVtcF9hcnJheSgKKyAgICBhcGlfbG9nX3JlYyAqcmVjLAorICAgIGNvbnN0IGJjbWNsaV90eXBlX2Rlc2NyICp0ZCwKKyAgICBjb25zdCB2b2lkICpkYXRhLAorICAgIHVpbnQzMl90IHNpemUsCisgICAgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBiY21vc19lcnJubyBlcnIgPSBCQ01fRVJSX09LOworCisgICAgLyogUHJpbnQgYXMgYnVmZmVyIG9yIGVsZW1lbnQgYnkgZWxlbWVudCA/ICovCisgICAgaWYgKCh0ZC0+YmFzZV90eXBlID09IEJDTU9MVF9CQVNFX1RZUEVfSURfVU5VTSB8fCB0ZC0+YmFzZV90eXBlID09IEJDTU9MVF9CQVNFX1RZUEVfSURfVU5VTV9IRVgpICYmIHRkLT5zaXplID09IDEpCisgICAgeworICAgICAgICB1aW50MzJfdCBpOworICAgICAgICBhcGlfbG9nX3ByaW50KHJlYywgIiVzPSIsIG5hbWUpOworICAgICAgICBpZiAoc2l6ZSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBhcGlfbG9nX3ByaW50KHJlYywgIi0iKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXBpX2xvZ19wcmludChyZWMsICIlMDJYIiwgKChjb25zdCB1aW50OF90ICopZGF0YSlbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFwaV9sb2dfcHJpbnQocmVjLCAiICIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBlcnIgPSBhcGlfbG9nX2R1bXBfZGF0YV90eXBlKHJlYywgdGQsIGRhdGEsIG5hbWUsIHNpemUsIHRkLT5zaXplKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGFwaV9sb2dfZHVtcF9kYXRhX3R5cGUoCisgICAgYXBpX2xvZ19yZWMgKnJlYywKKyAgICBjb25zdCBiY21jbGlfdHlwZV9kZXNjciAqdGQsCisgICAgY29uc3Qgdm9pZCAqZGF0YSwKKyAgICBjb25zdCBjaGFyICpuYW1lLAorICAgIHVpbnQzMl90IG51bV9lbnRyaWVzLAorICAgIHVpbnQzMl90IGVudHJ5X3NpemUpCit7CisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKworICAgIHN3aXRjaCAodGQtPmJhc2VfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1Q6CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGY7CisgICAgICAgICAgICBjaGFyIGZ1bGxfbmFtZVtBUElDTElfTUFYX1BBUk1fTkFNRV9MRU5HVEhdOworICAgICAgICAgICAgaWYgKHRkLT54LnMubnVtX2ZpZWxkcyA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQlVHX09OKHRkLT54LnMuZmllbGRzID09IE5VTEwpOworICAgICAgICAgICAgZm9yIChmID0gMDsgZiA8IHRkLT54LnMubnVtX2ZpZWxkczsgZisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IGJjbWNsaV9maWVsZF9kZXNjciAqZmxkID0gJnRkLT54LnMuZmllbGRzW2ZdOworICAgICAgICAgICAgICAgIHZvaWQgKmZkYXRhID0gKHZvaWQgKikoKGxvbmcpZGF0YSArIGZsZC0+b2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBiY21jbGlfc3RybmNweShmdWxsX25hbWUsIG5hbWUsIHNpemVvZihmdWxsX25hbWUpKTsKKyAgICAgICAgICAgICAgICBiY21jbGlfc3RybmNhdChmdWxsX25hbWUsICIuIiwgc2l6ZW9mKGZ1bGxfbmFtZSkpOworICAgICAgICAgICAgICAgIGJjbWNsaV9zdHJuY2F0KGZ1bGxfbmFtZSwgZmxkLT5uYW1lLCBzaXplb2YoZnVsbF9uYW1lKSk7CisgICAgICAgICAgICAgICAgZXJyID0gYXBpX2xvZ19kdW1wX2RhdGFfdHlwZShyZWMsIGZsZC0+dHlwZSwgZmRhdGEsIGZ1bGxfbmFtZSwgbnVtX2VudHJpZXMsIGVudHJ5X3NpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfVU5JT046CisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFByaW50IGZpZWxkcyB1cCB0byBzZWxlY3RvciwgdGhlbiBzZWxlY3RvciwgdGhlbiBzZWxlY3RlZCBzdWItc3RydWN0dXJlICovCisgICAgICAgICAgICB1aW50MTZfdCBmOworICAgICAgICAgICAgY2hhciBmdWxsX25hbWVbQVBJQ0xJX01BWF9QQVJNX05BTUVfTEVOR1RIXTsKKyAgICAgICAgICAgIGNvbnN0IGJjbWNsaV9maWVsZF9kZXNjciAqZmxkOworICAgICAgICAgICAgdm9pZCAqZmRhdGE7CisgICAgICAgICAgICBpbnQ2NF90IHNlbGVjdG9yX3ZhbCA9IDA7CisgICAgICAgICAgICB1aW50MTZfdCBudW1fdW5pb25fdmFsczsKKworICAgICAgICAgICAgaWYgKHRkLT54LnUubnVtX2NvbW1vbl9maWVsZHMgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEJVR19PTih0ZC0+eC51LmNvbW1vbl9maWVsZHMgPT0gTlVMTCk7CisgICAgICAgICAgICAvKiBDb21tb24gZmllbGRzLCBpbmNsdWRpbmcgc2VsZWN0b3IgKi8KKyAgICAgICAgICAgIGZvciAoZiA9IDA7IGYgPD0gdGQtPngudS5jbGFzc2lmaWVyX2lkeCAmJiBlcnIgPT0gQkNNX0VSUl9PSzsgZisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZsZCA9ICZ0ZC0+eC51LmNvbW1vbl9maWVsZHNbZl07CisgICAgICAgICAgICAgICAgZmRhdGEgPSAodm9pZCAqKSgobG9uZylkYXRhICsgZmxkLT5vZmZzZXQpOworCisgICAgICAgICAgICAgICAgYmNtY2xpX3N0cm5jcHkoZnVsbF9uYW1lLCBuYW1lLCBzaXplb2YoZnVsbF9uYW1lKSk7CisgICAgICAgICAgICAgICAgaWYgKGZsZC0+bmFtZSAhPSBOVUxMICYmIHN0cmxlbihmbGQtPm5hbWUpICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21jbGlfc3RybmNhdChmdWxsX25hbWUsICIuIiwgc2l6ZW9mKGZ1bGxfbmFtZSkpOworICAgICAgICAgICAgICAgICAgICBiY21jbGlfc3RybmNhdChmdWxsX25hbWUsIGZsZC0+bmFtZSwgc2l6ZW9mKGZ1bGxfbmFtZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlcnIgPSBhcGlfbG9nX2R1bXBfZGF0YV90eXBlKHJlYywgZmxkLT50eXBlLCBmZGF0YSwgZnVsbF9uYW1lLCBudW1fZW50cmllcywgZW50cnlfc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LICYmIGYgPT0gdGQtPngudS5jbGFzc2lmaWVyX2lkeCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IGFwaV9sb2dfcmVhZF9zbnVtKGZsZC0+dHlwZSwgZmRhdGEsICZzZWxlY3Rvcl92YWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBudW1fdW5pb25fdmFscyA9IGFwaV9sb2dfZ2V0X251bV9lbnVtX3ZhbHModGQtPngudS5jb21tb25fZmllbGRzW3RkLT54LnUuY2xhc3NpZmllcl9pZHhdLnR5cGUtPnguZSk7CisgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKXNlbGVjdG9yX3ZhbCA+PSBudW1fdW5pb25fdmFscykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogU2VsZWN0ZWQgZmllbGQgKi8KKyAgICAgICAgICAgIGZsZCA9ICZ0ZC0+eC51LnVuaW9uX2ZpZWxkc1tzZWxlY3Rvcl92YWxdOworICAgICAgICAgICAgaWYgKGZsZC0+dHlwZSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmRhdGEgPSAodm9pZCAqKSgobG9uZylkYXRhICsgZmxkLT5vZmZzZXQpOworCisgICAgICAgICAgICBiY21jbGlfc3RybmNweShmdWxsX25hbWUsIG5hbWUsIHNpemVvZihmdWxsX25hbWUpKTsKKyAgICAgICAgICAgIGlmIChmbGQtPm5hbWUgIT0gTlVMTCAmJiBzdHJsZW4oZmxkLT5uYW1lKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbWNsaV9zdHJuY2F0KGZ1bGxfbmFtZSwgIi4iLCBzaXplb2YoZnVsbF9uYW1lKSk7CisgICAgICAgICAgICAgICAgYmNtY2xpX3N0cm5jYXQoZnVsbF9uYW1lLCBmbGQtPm5hbWUsIHNpemVvZihmdWxsX25hbWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVyciA9IGFwaV9sb2dfZHVtcF9kYXRhX3R5cGUocmVjLCBmbGQtPnR5cGUsIGZkYXRhLCBmdWxsX25hbWUsIG51bV9lbnRyaWVzLCBlbnRyeV9zaXplKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBDb21tb24gZmllbGRzIGZvbGxvd2luZyBzZWxlY3RvciAqLworICAgICAgICAgICAgZm9yICg7IGYgPCB0ZC0+eC51Lm51bV9jb21tb25fZmllbGRzOyBmKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmxkID0gJnRkLT54LnUuY29tbW9uX2ZpZWxkc1tmXTsKKyAgICAgICAgICAgICAgICBmZGF0YSA9ICh2b2lkICopKChsb25nKWRhdGEgKyBmbGQtPm9mZnNldCk7CisKKyAgICAgICAgICAgICAgICBiY21jbGlfc3RybmNweShmdWxsX25hbWUsIG5hbWUsIHNpemVvZihmdWxsX25hbWUpKTsKKyAgICAgICAgICAgICAgICBpZiAoZmxkLT5uYW1lICE9IE5VTEwgJiYgc3RybGVuKGZsZC0+bmFtZSkgIT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbWNsaV9zdHJuY2F0KGZ1bGxfbmFtZSwgIi4iLCBzaXplb2YoZnVsbF9uYW1lKSk7CisgICAgICAgICAgICAgICAgICAgIGJjbWNsaV9zdHJuY2F0KGZ1bGxfbmFtZSwgZmxkLT5uYW1lLCBzaXplb2YoZnVsbF9uYW1lKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVyciA9IGFwaV9sb2dfZHVtcF9kYXRhX3R5cGUocmVjLCBmbGQtPnR5cGUsIGZkYXRhLCBmdWxsX25hbWUsIG51bV9lbnRyaWVzLCBlbnRyeV9zaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9GSVhFRDoKKyAgICAgICAgeworICAgICAgICAgICAgZXJyID0gYXBpX2xvZ19kdW1wX2FycmF5KHJlYywgdGQtPnguYXJyX2ZpeGVkLmVsZW1fdHlwZSwgZGF0YSwgdGQtPnguYXJyX2ZpeGVkLnNpemUsIG5hbWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0RZTjoKKyAgICAgICAgeworICAgICAgICAgICAgLyogUmVhZCBsZW5ndGggKi8KKyAgICAgICAgICAgIHVpbnQzMl90IGFycmF5X3NpemU7CisgICAgICAgICAgICBsb25nIGJhc2VfcHRyOworCisgICAgICAgICAgICBzd2l0Y2ggKHRkLT54LmFycl9keW4ubGVuX3NpemUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAxOiBhcnJheV9zaXplID0gKihjb25zdCB1aW50OF90ICopZGF0YTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOiBhcnJheV9zaXplID0gKihjb25zdCB1aW50MTZfdCAqKWRhdGE7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNDogYXJyYXlfc2l6ZSA9ICooY29uc3QgdWludDMyX3QgKilkYXRhOyBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYmFzZV9wdHIgPSBCQ01PU19ST1VORF9VUCgobG9uZylkYXRhICsgdGQtPnguYXJyX2R5bi5sZW5fc2l6ZSwgc2l6ZW9mKHZvaWQgKikpOworICAgICAgICAgICAgQlVHX09OKGJhc2VfcHRyID09IDApOworICAgICAgICAgICAgZGF0YSA9ICoodm9pZCAqKiliYXNlX3B0cjsKKyAgICAgICAgICAgIGVyciA9IGFwaV9sb2dfZHVtcF9hcnJheShyZWMsIHRkLT54LmFycl9keW4uZWxlbV90eXBlLCBkYXRhLCBhcnJheV9zaXplLCBuYW1lKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG47CisgICAgICAgICAgICAvKiBGaW5hbGx5ISBTaW1wbGUgdHlwZSB0aGF0IG1hcHMgdG8gYSBzaW5nbGUgbmFtZT12YWx1ZSBwYWlyICovCisgICAgICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFwaV9sb2dfcHJpbnQocmVjLCAiJXM9IiwgbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBEdW1wIHNpbXBsZSB2YWx1ZSBvciBhcnJheSBvZiBzaW1wbGUgdmFsdWVzICovCisgICAgICAgICAgICBpZiAobnVtX2VudHJpZXMgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcGlfbG9nX3ByaW50KHJlYywgIi0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAobiA9IDA7IG4gPCBudW1fZW50cmllczsgbisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChuICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcGlfbG9nX3ByaW50KHJlYywgIiwiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZXJyID0gYXBpX2xvZ19kdW1wX3NpbXBsZV9kYXRhX3R5cGUocmVjLCB0ZCwgZGF0YSwgbmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGF0YSA9IChjb25zdCB2b2lkICopKChsb25nKWRhdGEgKyBlbnRyeV9zaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFwaV9sb2dfcHJpbnQocmVjLCAiICIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGFwaV9sb2dfZHVtcF9wcm9wKGFwaV9sb2dfcmVjICpyZWMsIGNvbnN0IGJjbWNsaV9wcm9wX2Rlc2NyICpwZCwgY29uc3Qgdm9pZCAqcHJvcF9kYXRhKQoreworICAgIHJldHVybiBhcGlfbG9nX2R1bXBfZGF0YV90eXBlKHJlYywgcGQtPnR5cGUsIHByb3BfZGF0YSwgcGQtPm5hbWUsIDEsIDApOworfQorCisvKiBDYWxjdWxhdGUgcHJvcGVydHkgcG9pbnRlciBnaXZlbiB0aGUgZ3JvdXAgZGF0YSBwb2ludGVyIGFuZCBwcm9wZXJ0eSBkZXNjcmlwdGlvbiAqLworc3RhdGljIGlubGluZSBjb25zdCB2b2lkICphcGlfbG9nX3Byb3BfZGF0YV9wdHIoY29uc3Qgdm9pZCAqZ3JvdXBfcHRyLCBjb25zdCBiY21jbGlfcHJvcF9kZXNjciAqcGQpCit7CisgICAgcmV0dXJuIChjb25zdCB2b2lkICopKChsb25nKWdyb3VwX3B0ciArIHBkLT5vZmZzZXQpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYXBpX2xvZ19hcHBlbmRfa2V5KGFwaV9sb2dfcmVjICpyZWMsIGNvbnN0IHZvaWQgKmtleSwgdWludDMyX3Qga2V5X3NpemUpCit7CisgICAgdWludDE2X3QgcHJvcDsKKyAgICBiY21vc19lcnJubyBlcnIgPSBCQ01fRVJSX09LOworICAgIGNvbnN0IGJjbWNsaV9wcm9wX2Rlc2NyICpwZDsKKworICAgIGZvciAocHJvcCA9IDA7CisgICAgICAgICBhcGlfY2xpX29iamVjdF9wcm9wZXJ0eShyZWMtPm1zZy0+b2JqX3R5cGUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBwcm9wLCAmcGQpID09IEJDTV9FUlJfT0s7CisgICAgICAgICArK3Byb3ApCisgICAgeworICAgICAgICBjb25zdCB2b2lkICpwcm9wX2RhdGEgPSBhcGlfbG9nX3Byb3BfZGF0YV9wdHIoa2V5LCBwZCk7CisgICAgICAgIGlmIChwcm9wX2RhdGEgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgQlVHX09OKHBkLT5vZmZzZXQgPiBrZXlfc2l6ZSk7CisgICAgICAgIGVyciA9IGFwaV9sb2dfZHVtcF9wcm9wKHJlYywgcGQsIHByb3BfZGF0YSk7CisgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGFwaV9sb2dfYXBwZW5kX2RhdGEoYXBpX2xvZ19yZWMgKnJlYywgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3QgZGF0YV9zaXplKQoreworICAgIHVpbnQxNl90IHByb3A7CisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKyAgICBjb25zdCBiY21jbGlfcHJvcF9kZXNjciAqcGQ7CisKKyAgICBmb3IgKHByb3AgPSAwOworICAgICAgICAgYXBpX2NsaV9vYmplY3RfcHJvcGVydHkocmVjLT5tc2ctPm9ial90eXBlLCByZWMtPm1zZy0+Z3JvdXAsIHJlYy0+bXNnLT5zdWJncm91cCwgcHJvcCwgJnBkKSA9PSBCQ01fRVJSX09LOworICAgICAgICAgKytwcm9wKQorICAgIHsKKyAgICAgICAgY29uc3Qgdm9pZCAqcHJvcF9kYXRhID0gYXBpX2xvZ19wcm9wX2RhdGFfcHRyKGRhdGEsIHBkKTsKKyAgICAgICAgaWYgKCgocmVjLT5tc2ctPnByZXNlbmNlX21hc2sgJiAoMUxMIDw8IHByb3ApKSA9PSAwKSB8fCAocHJvcF9kYXRhID09IE5VTEwpKQorICAgICAgICB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBCVUdfT04ocGQtPm9mZnNldCA+IGRhdGFfc2l6ZSk7CisgICAgICAgIGVyciA9IGFwaV9sb2dfZHVtcF9wcm9wKHJlYywgcGQsIHByb3BfZGF0YSk7CisgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGFwaV9sb2dfYXBwZW5kX2hkcihhcGlfbG9nX3JlYyAqcmVjKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBjb25zdCBjaGFyICpuYW1lOworICAgIGNvbnN0IGNoYXIgKmRlc2NyOworCisgICAgZXJyID0gYXBpX2NsaV9vYmplY3RfbmFtZShyZWMtPm1zZy0+b2JqX3R5cGUsICZuYW1lLCAmZGVzY3IpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYXBpX2xvZ19wcmludChyZWMsIGFwaWNsaV9tZ3RfZ3JvdXBfdG9fc3RyKHJlYy0+bXNnLT5ncm91cCkpOworICAgIGlmIChhcGlfbG9nX2lzX3NpbmdsZXRvbihyZWMtPm1zZy0+Z3JvdXApKQorICAgIHsKKyAgICAgICAgYXBpX2xvZ19wcmludChyZWMsIChyZWMtPm1zZy0+dHlwZSAmIEJDTU9MVF9NU0dfVFlQRV9TRVQpICE9IDAgPyAiX3NldCIgOiAiX2dldCIpOworICAgICAgICBpZiAoKHJlYy0+bXNnLT50eXBlICYgQkNNT0xUX01TR19UWVBFX01VTFRJKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBhcGlfbG9nX3ByaW50KHJlYywgIl9tdWx0aSIpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHJlYy0+bXNnLT5ncm91cCAhPSBCQ01PTFRfTUdUX0dST1VQX0FVVE8gJiYgcmVjLT5tc2ctPmdyb3VwICE9IEJDTU9MVF9NR1RfR1JPVVBfUFJPWFlfUlgpCisgICAgeworICAgICAgICBpZiAocmVjLT5tc2ctPmRpciA9PSBCQ01PTFRfTVNHX0RJUl9SRVFVRVNUKQorICAgICAgICB7CisgICAgICAgICAgICBhcGlfbG9nX3ByaW50KHJlYywgIiByZXF1ZXN0Iik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhcGlfbG9nX3ByaW50KHJlYywgIiByZXNwb25zZVslZF0iLCByZWMtPm1zZy0+ZXJyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGFwaV9sb2dfcHJpbnQocmVjLCAiPiAlcyIsIG5hbWUpOworICAgIGlmICghYXBpX2xvZ19pc19zaW5nbGV0b24ocmVjLT5tc2ctPmdyb3VwKSkKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIgKnN1Yl9uYW1lOworICAgICAgICBjb25zdCBjaGFyICpzdWJfZDsKKyAgICAgICAgZXJyID0gYXBpX2NsaV9vYmplY3Rfc3ViZ3JvdXBfbmFtZShyZWMtPm1zZy0+b2JqX3R5cGUsIHJlYy0+bXNnLT5ncm91cCwgcmVjLT5tc2ctPnN1Ymdyb3VwLCAmc3ViX25hbWUsICZzdWJfZCk7CisgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBhcGlfbG9nX3ByaW50KHJlYywgIi4lcyIsIHN1Yl9uYW1lKTsKKyAgICB9CisKKyAgICBhcGlfbG9nX3ByaW50KHJlYywgIjogIik7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGFwaV9sb2dfYXBwZW5kX2JvZHkoYXBpX2xvZ19yZWMgKnJlYykKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgdWludDMyX3Qga2V5X3NpemU7CisgICAgdWludDMyX3Qga2V5X29mZnNldDsKKyAgICB1aW50MzJfdCBkYXRhX3NpemU7CisgICAgdWludDMyX3QgZGF0YV9vZmZzZXQ7CisKKyAgICBlcnIgPSBhcGlfY2xpX29iamVjdF9zdHJ1Y3Rfc2l6ZSgKKyAgICAgICAgcmVjLT5tc2ctPm9ial90eXBlLAorICAgICAgICByZWMtPm1zZy0+Z3JvdXAsCisgICAgICAgIHJlYy0+bXNnLT5zdWJncm91cCwKKyAgICAgICAgJmtleV9zaXplLAorICAgICAgICAma2V5X29mZnNldCwKKyAgICAgICAgJmRhdGFfc2l6ZSwKKyAgICAgICAgJmRhdGFfb2Zmc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmICgocmVjLT5tc2ctPnR5cGUgJiBCQ01PTFRfTVNHX1RZUEVfTVVMVEkpICE9IDApCisgICAgeworICAgICAgICAvKiBtZXNzYWdlIHNldCBwcmludGluZyBmb3IgbXVsdGktb2JqZWN0IGNmZyBub3QgaW1wbGVtZW50ZWQgKi8KKyAgICAgICAgYXBpX2xvZ19wcmludChyZWMsICIoZGF0YSBvbWl0dGVkKSIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoKHJlYy0+bXNnLT5ncm91cCAhPSBCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHKSAmJiAoa2V5X3NpemUgIT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IHZvaWQgKmtleSA9IChjb25zdCB2b2lkICopKChsb25nKXJlYy0+bXNnICsga2V5X29mZnNldCk7CisgICAgICAgICAgICBlcnIgPSBhcGlfbG9nX2FwcGVuZF9rZXkocmVjLCBrZXksIGtleV9zaXplKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKChkYXRhX3NpemUgIT0gMCkgJiYKKyAgICAgICAgICAgICgoKHJlYy0+bXNnLT5kaXIgPT0gQkNNT0xUX01TR19ESVJfUkVRVUVTVCkgJiYgKHJlYy0+bXNnLT50eXBlICYgQkNNT0xUX01TR19UWVBFX1NFVCkpICB8fAorICAgICAgICAgICAgICgocmVjLT5tc2ctPmRpciA9PSBCQ01PTFRfTVNHX0RJUl9SRVNQT05TRSkgJiYgKHJlYy0+bXNnLT50eXBlICYgQkNNT0xUX01TR19UWVBFX0dFVCkpIHx8CisgICAgICAgICAgICAgKHJlYy0+bXNnLT5ncm91cCA9PSBCQ01PTFRfTUdUX0dST1VQX0FVVE8pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgICAgICAocmVjLT5tc2ctPmdyb3VwID09IEJDTU9MVF9NR1RfR1JPVVBfUFJPWFlfUlgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSA9IChjb25zdCB2b2lkICopKChsb25nKXJlYy0+bXNnICsgZGF0YV9vZmZzZXQpOworICAgICAgICAgICAgZXJyID0gYXBpX2xvZ19hcHBlbmRfZGF0YShyZWMsIGRhdGEsIGRhdGFfc2l6ZSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19lcnJubyBiY21vbHRfbXNnX2xvZyhkZXZfbG9nX2lkIGxvZ19pZCwgY29uc3QgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGJjbW9zX2Vycm5vIGVyciA9IEJDTV9FUlJfT0s7CisgICAgYXBpX2xvZ19yZWMgcmVjID0geyAubG9nX2lkID0gbG9nX2lkLCAubXNnID0gbXNnLCAudXNlZCA9IDAgfTsKKworICAgIHJlYy5idWYgPSBiY21vc19ibGtfcG9vbF9hbGxvYygmYXBpX2xvZ19ibGtfcG9vbCk7CisgICAgaWYgKHJlYy5idWYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGVyciA9IEJDTV9FUlJfTk9NRU07CisgICAgfQorCisgICAgZXJyID0gKGVyciAhPSBCQ01fRVJSX09LKSA/IGVyciA6IGFwaV9sb2dfYXBwZW5kX2hkcigmcmVjKTsKKyAgICBlcnIgPSAoZXJyICE9IEJDTV9FUlJfT0spID8gZXJyIDogYXBpX2xvZ19hcHBlbmRfYm9keSgmcmVjKTsKKyAgICBhcGlfbG9nX2ZsdXNoKCZyZWMsICJcbiIpOworCisgICAgaWYgKHJlYy5idWYgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jsa19wb29sX2ZyZWUocmVjLmJ1Zik7CisgICAgfQorICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGxvZ19pZCwgIkFQSSBtZXNzYWdlIGxvZyBlcnJvcjogJXMgKCVkKVxuIiwgYmNtb3Nfc3RyZXJyb3IoZXJyKSwgZXJyKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKwordm9pZCBiY21vbHRfbXNnX2xvZ19pbml0KHZvaWQpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9zX2Jsa19wb29sX3Bhcm0gYmxrX3Bvb2xfcGFybSA9CisgICAgeworICAgICAgICAubmFtZSA9ICJhcGlfZGV2X2xvZyIsCisgICAgICAgIC5ibGtfc2l6ZSA9IE1BWF9ERVZfTE9HX1NUUklOR19ORVRfU0laRSwKKyAgICAgICAgLm51bV9ibGtzID0gQVBJX0xPR19OVU1fQkxLUywKKyAgICB9OworCisgICAgZXJyID0gYmNtb3NfYmxrX3Bvb2xfY3JlYXRlKCZhcGlfbG9nX2Jsa19wb29sLCAmYmxrX3Bvb2xfcGFybSk7CisgICAgQlVHX09OKGVyciAhPSBCQ01fRVJSX09LKTsKK30KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2FwaV9kZXZfbG9nL2JjbV9hcGlfZGV2X2xvZy5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2FwaV9kZXZfbG9nL2JjbV9hcGlfZGV2X2xvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NzViNWYKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvYXBpX2Rldl9sb2cvYmNtX2FwaV9kZXZfbG9nLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBCQ01fQVBJX0RFVl9MT0dfSF8KKyNkZWZpbmUgQkNNX0FQSV9ERVZfTE9HX0hfCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21vbHRfbXNnLmg+CisjaW5jbHVkZSA8YmNtX2Rldl9sb2cuaD4KKworLyogUHJpbnQgbWVzc2FnZSBoZWFkZXIvYm9keSB0byBhIGxvZ2dlciBJRCAqLworYmNtb3NfZXJybm8gYmNtb2x0X21zZ19sb2coZGV2X2xvZ19pZCBsb2dfaWQsIGNvbnN0IGJjbW9sdF9tc2cgKm1zZyk7CisKKy8qIEluaXRpYWxpemUgQVBJL2RldmxvZyBpbnRlZ3JhdGlvbiAqLwordm9pZCBiY21vbHRfbXNnX2xvZ19pbml0KHZvaWQpOworCisjZW5kaWYgLyogQkNNX0FQSV9ERVZfTE9HX0hfICovCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvYXBpX3Byb3h5L01ha2VmaWxlIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2FwaV9wcm94eS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDBiODM5Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2FwaV9wcm94eS9NYWtlZmlsZQpAQCAtMCwwICsxLDEyIEBACitpZmVxICgiJChPUykiLCAicG9zaXgiKQorICAgIE1PRF9OQU1FID0gYmNtX2FwaV9wcm94eQorICAgIE1PRF9UWVBFID0gbGliCisgICAgTU9EX0RFUFMgPSB0cmFuc3BvcnQgY2xpCitpZmVxICgiJChSRUxFQVNFX0JVSUxEKSIsICJ5IikKKyAgICBNT0RfREVQUyArPSBjb21tb25fYXBpCitlbHNlCisgICAgTU9EX0RFUFMgKz0gYXBpCitlbmRpZgorCisgICAgc3JjcyA9IGJjbW9sdF9hcGlfcHJveHkuYworZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfcHJveHkvYmNtb2x0X2FwaV9wcm94eS5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2FwaV9wcm94eS9iY21vbHRfYXBpX3Byb3h5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY3MTYzMAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfcHJveHkvYmNtb2x0X2FwaV9wcm94eS5jCkBAIC0wLDAgKzEsNTAxIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtdHJfaW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YmNtdHJfaGVhZGVyLmg+CisjaW5jbHVkZSA8YmNtdHJfdHJhbnNwb3J0X2NsaS5oPgorI2luY2x1ZGUgPGJjbW9sdF9hcGkuaD4KKyNpbmNsdWRlIDxiY210cl9kZWJ1Zy5oPgorI2lmZGVmIEVOQUJMRV9DTEkKKyNpbmNsdWRlIDxiY21jbGkuaD4KKyNlbmRpZgorI2luY2x1ZGUgImJjbW9sdF9hcGlfcHJveHkuaCIKKyNpZmRlZiBFTkFCTEVfTE9HCisjaW5jbHVkZSAiYmNtX2Rldl9sb2cuaCIKKyNlbmRpZgorCisvKiBTdGF0aXN0aWNzICovCit0eXBlZGVmIHN0cnVjdCBwcm94eV9zdGF0cworeworICAgIHVuc2lnbmVkIGxvbmcgcnhfcGFja2V0czsKKyAgICB1bnNpZ25lZCBsb25nIHJ4X2J5dGVzOworICAgIHVuc2lnbmVkIGxvbmcgdHhfcGFja2V0czsKKyAgICB1bnNpZ25lZCBsb25nIHR4X2J5dGVzOworICAgIHVuc2lnbmVkIGxvbmcgcnhfZXJyb3JzOworICAgIHVuc2lnbmVkIGxvbmcgdHhfZXJyb3JzOworICAgIHVuc2lnbmVkIGxvbmcgdW5wYWNrX2Vycm9yczsKKyAgICB1bnNpZ25lZCBsb25nIHBhY2tfZXJyb3JzOworICAgIHVuc2lnbmVkIGxvbmcgbXNnX2Vycm9yczsKK30gcHJveHlfc3RhdHM7CisKK3R5cGVkZWYgc3RydWN0IHByb3h5X2NvbnRyb2xfYmxvY2sKK3sKKyAgICBiY21vc190YXNrIHByb3h5X3J4X3Rhc2s7CisgICAgc3RydWN0IHNvY2thZGRyX2luIGNsaWVudDsKKyAgICB1aW50MzJfdCBwcm94eV9wb3J0OworICAgIGludCBkZXZpY2VfaWQ7CisgICAgaW50IGNsaWVudF9zb2NrZXQ7CisgICAgYmNtb3NfYm9vbCBpc19ydW5uaW5nOworICAgIGNoYXIgKm9uX3JlYWR5X2NtZDsKKworICAgIC8qIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBtZW1vcnkgdGhhdCBjb3VsZCBwb3NzaWJseSBieSB1c2VkIGJ5IGFsbCB2YXJpYWJsZS1zaXplZCBsaXN0cyB3aXRoaW4gYSBHRVQgcmVxdWVzdCAqLworI2RlZmluZSBEWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkUgKDMyICogMTAyNCkKKyAgICB1aW50OF90IGR5bmFtaWNfbGlzdF9idWZmZXJbRFlOQU1JQ19MSVNUX0JVRkZFUl9TSVpFXTsKKworICAgIGRldl9sb2dfaWQgcHJveHlfbG9nOworCisgICAgcHJveHlfc3RhdHMgc3RhdHM7Cit9IHByb3h5X2NvbnRyb2xfYmxvY2s7CisKKy8qIFBlciBkZXZpY2UgcHJveHkgY29udHJvbCBibG9jayAqLworc3RhdGljIHByb3h5X2NvbnRyb2xfYmxvY2sgcHJveHlfZGF0YVtCQ01UUl9NQVhfT0xUU107CitzdGF0aWMgYmNtb3NfYm9vbCBpc19maXJzdF9wcm94eSA9IEJDTU9TX1RSVUU7CisKKyNpZmRlZiBFTkFCTEVfQ0xJCisvKi9wcm94eS9zdGF0cyBjb21tYW5kIGhhbmRsZXIKKyovCitzdGF0aWMgYmNtb3NfZXJybm8gX3Byb3h5X3N0YXRzX2NtZChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIGludCBkZXZpY2UgPSAoaW50KXBhcm1bMF0udmFsdWUubnVtYmVyOworCisgICAgaWYgKGRldmljZSA+PSBCQ01UUl9NQVhfT0xUUykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisKKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiUtMTZzOiAlbHVcbiIsICJyeF9wYWNrZXRzIiwgcHJveHlfZGF0YVtkZXZpY2VdLnN0YXRzLnJ4X3BhY2tldHMpOworICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiJS0xNnM6ICVsdVxuIiwgInJ4X2J5dGVzIiwgcHJveHlfZGF0YVtkZXZpY2VdLnN0YXRzLnJ4X2J5dGVzKTsKKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiUtMTZzOiAlbHVcbiIsICJ0eF9wYWNrZXRzIiwgcHJveHlfZGF0YVtkZXZpY2VdLnN0YXRzLnR4X3BhY2tldHMpOworICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiJS0xNnM6ICVsdVxuIiwgInR4X2J5dGVzIiwgcHJveHlfZGF0YVtkZXZpY2VdLnN0YXRzLnR4X2J5dGVzKTsKKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiUtMTZzOiAlbHVcbiIsICJyeF9lcnJvcnMiLCBwcm94eV9kYXRhW2RldmljZV0uc3RhdHMucnhfZXJyb3JzKTsKKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiUtMTZzOiAlbHVcbiIsICJ0eF9lcnJvcnMiLCBwcm94eV9kYXRhW2RldmljZV0uc3RhdHMudHhfZXJyb3JzKTsKKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiUtMTZzOiAlbHVcbiIsICJ1bnBhY2tfZXJyb3JzIiwgcHJveHlfZGF0YVtkZXZpY2VdLnN0YXRzLnVucGFja19lcnJvcnMpOworICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiJS0xNnM6ICVsdVxuIiwgInBhY2tfZXJyb3JzIiwgcHJveHlfZGF0YVtkZXZpY2VdLnN0YXRzLnBhY2tfZXJyb3JzKTsKKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiUtMTZzOiAlbHVcbiIsICJtc2dfZXJyb3JzIiwgcHJveHlfZGF0YVtkZXZpY2VdLnN0YXRzLm1zZ19lcnJvcnMpOworICAgIG1lbXNldCgmcHJveHlfZGF0YVtkZXZpY2VdLnN0YXRzLCAwLCBzaXplb2YocHJveHlfc3RhdHMpKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorI2VuZGlmIC8qICNpZmRlZiBFTkFCTEVfQ0xJICovCisKK3N0YXRpYyBiY21vc19lcnJubyBfcHJveHlfbXNnX2Vycm9yKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9tc2cgKnByb3h5X21zZykKK3sKKyAgICBwcm94eV9jb250cm9sX2Jsb2NrICpwcm94eSA9ICZwcm94eV9kYXRhW2RldmljZV07CisgICAgKytwcm94eS0+c3RhdHMubXNnX2Vycm9yczsKKyAgICBiY21vbHRfbXNnX2Vycihwcm94eV9tc2csIHByb3h5LT5wcm94eV9sb2csIEJDTV9FUlJfUEFSTSwgQkNNT0xUX0VSUl9GSUVMRF9OT05FLCAiTWVzc2FnZSBpcyBpbnNhbmUiKTsKKyAgICBwcm94eV9tc2ctPmRpciA9IEJDTU9MVF9NU0dfRElSX1JFU1BPTlNFOworICAgIHJldHVybiBCQ01fRVJSX1BBUk07Cit9CisKK3N0YXRpYyB2b2lkIF9wcm94eV9pbnZva2UoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqcHJveHlfbXNnKQoreworICAgIHByb3h5X2NvbnRyb2xfYmxvY2sgKnByb3h5ID0gJnByb3h5X2RhdGFbZGV2aWNlXTsKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBiY21vbHRfc3lzdGVtX21vZGUgc3lzdGVtX21vZGU7CisKKyAgICAvKiBDaGVjayB0aGF0IHRoZSBtZXNzYWdlIHRhcmdldHMgYW4gb2JqZWN0IHRoYXQgaXMgY29tcGF0aWJsZSB3aXRoIG91ciBzeXN0ZW0gbW9kZSAqLworICAgIGJjbW9sdF9zeXN0ZW1fbW9kZV9nZXQoZGV2aWNlLCAmc3lzdGVtX21vZGUpOworICAgIGlmIChzeXN0ZW1fbW9kZSAhPSBCQ01PTFRfU1lTVEVNX01PREVfX05VTV9PRiAmJiAhYmNtb2x0X29iamVjdF9pc19zdXBwb3J0ZWQoc3lzdGVtX21vZGUsIHByb3h5X21zZy0+b2JqX3R5cGUpKQorICAgIHsKKyAgICAgICAgKytwcm94eS0+c3RhdHMubXNnX2Vycm9yczsKKyAgICAgICAgcHJveHlfbXNnLT5kaXIgPSBCQ01PTFRfTVNHX0RJUl9SRVNQT05TRTsKKyAgICAgICAgYmNtb2x0X21zZ19lcnIoCisgICAgICAgICAgICBwcm94eV9tc2csCisgICAgICAgICAgICBwcm94eS0+cHJveHlfbG9nLAorICAgICAgICAgICAgQkNNX0VSUl9OT1RfU1VQUE9SVEVELAorICAgICAgICAgICAgQkNNT0xUX0VSUl9GSUVMRF9OT05FLAorICAgICAgICAgICAgIk9iamVjdCB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBzeXN0ZW0gbW9kZSIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogSW52b2tlIEFQSSAqLworICAgIHN3aXRjaCAocHJveHlfbXNnLT5ncm91cCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9DRkc6CisgICAgICAgICAgICBpZiAoKHByb3h5X21zZy0+dHlwZSAmIEJDTU9MVF9NU0dfVFlQRV9DTEVBUikgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByYyA9IGJjbW9sdF9jZmdfY2xlYXIoZGV2aWNlLCAoYmNtb2x0X2NmZyAqKXByb3h5X21zZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICgocHJveHlfbXNnLT50eXBlICYgQkNNT0xUX01TR19UWVBFX0dFVCkgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHByb3h5X21zZy0+dHlwZSAmIEJDTU9MVF9NU0dfVFlQRV9NVUxUSSkgIT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcm94eV9tc2ctPm1zZ19zZXQgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSBfcHJveHlfbXNnX2Vycm9yKGRldmljZSwgcHJveHlfbXNnKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiY21vbHRfY2ZnICopcHJveHlfbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5X21zZy0+bXNnX3NldC0+ZmlsdGVyX2ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5X21zZy0+bXNnX3NldCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSBiY21vbHRfY2ZnX2dldChkZXZpY2UsIChiY21vbHRfY2ZnICopcHJveHlfbXNnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICgocHJveHlfbXNnLT50eXBlICYgQkNNT0xUX01TR19UWVBFX1NFVCkgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByYyA9IGJjbW9sdF9jZmdfc2V0KGRldmljZSwgKGJjbW9sdF9jZmcgKilwcm94eV9tc2cpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gX3Byb3h5X21zZ19lcnJvcihkZXZpY2UsIHByb3h5X21zZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfc3RhdF9mbGFncyBmbGFnczsKKworICAgICAgICAgICAgICAgIGZsYWdzID0gKChwcm94eV9tc2ctPnR5cGUgJiBCQ01PTFRfTVNHX1RZUEVfQ0xFQVIpICE9IDApID8KKyAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9TVEFUX0ZMQUdTX0NMRUFSX09OX1JFQUQgOiAwOworCisgICAgICAgICAgICAgICAgcmMgPSBiY21vbHRfc3RhdF9nZXQoZGV2aWNlLCAoYmNtb2x0X3N0YXQgKilwcm94eV9tc2csIGZsYWdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgcmMgPSBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlLCAoYmNtb2x0X29wZXIgKilwcm94eV9tc2cpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1BST1hZOgorICAgICAgICAgICAgcmMgPSBiY21vbHRfcHJveHlfc2VuZChkZXZpY2UsIChiY21vbHRfcHJveHkgKilwcm94eV9tc2cpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVRfQ0ZHOgorICAgICAgICAgICAgaWYgKChwcm94eV9tc2ctPnR5cGUgJiBCQ01PTFRfTVNHX1RZUEVfR0VUKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gYmNtb2x0X3N0YXRfY2ZnX2dldChkZXZpY2UsIChiY21vbHRfc3RhdF9jZmcgKilwcm94eV9tc2cpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoKHByb3h5X21zZy0+dHlwZSAmIEJDTU9MVF9NU0dfVFlQRV9TRVQpICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmMgPSBiY21vbHRfc3RhdF9jZmdfc2V0KGRldmljZSwgKGJjbW9sdF9zdGF0X2NmZyAqKXByb3h5X21zZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmMgPSBfcHJveHlfbXNnX2Vycm9yKGRldmljZSwgcHJveHlfbXNnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgIGlmICgocHJveHlfbXNnLT50eXBlICYgQkNNT0xUX01TR19UWVBFX0dFVCkgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByYyA9IGJjbW9sdF9hdXRvX2NmZ19nZXQoZGV2aWNlLCAoYmNtb2x0X2F1dG9fY2ZnICopcHJveHlfbXNnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKChwcm94eV9tc2ctPnR5cGUgJiBCQ01PTFRfTVNHX1RZUEVfU0VUKSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gYmNtb2x0X2F1dG9fY2ZnX3NldChkZXZpY2UsIChiY21vbHRfYXV0b19jZmcgKilwcm94eV9tc2cpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gX3Byb3h5X21zZ19lcnJvcihkZXZpY2UsIHByb3h5X21zZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmMgPSBfcHJveHlfbXNnX2Vycm9yKGRldmljZSwgcHJveHlfbXNnKTsKKyAgICB9CisKKyAgICBwcm94eV9tc2ctPmVyciA9IHJjOworfQorCisvKiBQYWNrIGFuZCBzZW5kIG1lc3NhZ2UgKi8KK3N0YXRpYyB2b2lkIF9wcm94eV9zZW5kKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9tc2cgKm1zZykKK3sKKyAgICBiY210cl9oZHIgaGRyID0ge307CisgICAgaW50MzJfdCBwYWNrZWRfbGVuZ3RoOworICAgIGJjbW9sdF9idWYgdHhiID0ge307CisgICAgaW50IGxlbjsKKworICAgIC8qIEFsbG9jYXRlIGJ1ZmZlciBhbmQgcGFjayAqLworICAgIHBhY2tlZF9sZW5ndGggPSBiY21vbHRfbXNnX2dldF9wYWNrZWRfbGVuZ3RoKG1zZyk7CisgICAgaWYgKHBhY2tlZF9sZW5ndGggPD0gMCkKKyAgICB7CisgICAgICAgICsrcHJveHlfZGF0YVtkZXZpY2VdLnN0YXRzLnBhY2tfZXJyb3JzOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorICAgIHBhY2tlZF9sZW5ndGggKz0gQkNNVFJfSERSX1NJWkU7CisgICAgaWYgKGJjbW9sdF9idWZfYWxsb2MoJnR4YiwgcGFja2VkX2xlbmd0aCwgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICArK3Byb3h5X2RhdGFbZGV2aWNlXS5zdGF0cy5wYWNrX2Vycm9yczsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKyAgICBiY210cl9oZWFkZXJfZmlsbChtc2csICZoZHIpOworICAgIGJjbXRyX2hlYWRlcl9wYWNrKCZoZHIsIHR4Yi5zdGFydCk7CisgICAgYmNtb2x0X2J1Zl9za2lwKCZ0eGIsIEJDTVRSX0hEUl9TSVpFKTsKKyAgICBpZiAoYmNtb2x0X21zZ19wYWNrKG1zZywgJnR4YikgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgICsrcHJveHlfZGF0YVtkZXZpY2VdLnN0YXRzLnBhY2tfZXJyb3JzOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgLyogU2VuZCB0byBjbGllbnQgKi8KKyAgICBsZW4gPSBzZW5kdG8ocHJveHlfZGF0YVtkZXZpY2VdLmNsaWVudF9zb2NrZXQsIHR4Yi5zdGFydCwgYmNtb2x0X2J1Zl9nZXRfdXNlZCgmdHhiKSwgMCwKKyAgICAgICAgICAgICAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSZwcm94eV9kYXRhW2RldmljZV0uY2xpZW50LCBzaXplb2YocHJveHlfZGF0YVtkZXZpY2VdLmNsaWVudCkpOworICAgIGlmIChsZW4gPD0gMCkKKyAgICB7CisgICAgICAgICsrcHJveHlfZGF0YVtkZXZpY2VdLnN0YXRzLnR4X2Vycm9yczsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKytwcm94eV9kYXRhW2RldmljZV0uc3RhdHMudHhfcGFja2V0czsKKyAgICAgICAgcHJveHlfZGF0YVtkZXZpY2VdLnN0YXRzLnR4X2J5dGVzICs9IGxlbjsKKyAgICB9CisKK2RvbmU6CisgICAgYmNtb2x0X2J1Zl9mcmVlKCZ0eGIpOworICAgIHJldHVybjsKK30KKworLyogVGFzayB0aGF0IHdhaXRzIGZvciBtZXNzYWdlcyBmcm9tIE1hcGxlLgorICogT25jZSBtZXNzYWdlIGlzIHJlY2VpdmVkLCBpdCBpcyBmb3J3YXJkZWQgdG8gcmVtb3RlIGFwcGxpY2F0aW9uCisgKiB2aWEgVURQIHNvY2tldC4KKyAqLworc3RhdGljIGludCBfcHJveHlfcnhfaGFuZGxlcihsb25nIGRhdGEpCit7CisgICAgYmNtb2x0X2RldmlkIGRldmljZSA9IChiY21vbHRfZGV2aWQpZGF0YTsKKyAgICBiY21vc190YXNrICpzZWxmID0gYmNtb3NfdGFza19jdXJyZW50KCk7CisgICAgcHJveHlfY29udHJvbF9ibG9jayAqcHJveHkgPSAmcHJveHlfZGF0YVtkZXZpY2VdOworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBzZW5kZXI7CisgICAgc29ja2xlbl90IHNlbmRzaXplID0gc2l6ZW9mKHNlbmRlcik7CisgICAgdWludDhfdCBjbGllbnRfYnVmZmVyW0JDTVRSX01BWF9NVFVfU0laRSArIDEyOF07CisgICAgYmNtb2x0X21zZyAqcHJveHlfbXNnOworICAgIGJjbXRyX2hkciB0cl9oZHI7CisgICAgYmNtb2x0X2J1ZiByeGI7CisgICAgaW50IGxlbjsKKyAgICB1aW50MTZfdCBjb3JyX3RhZzsKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIHdoaWxlICghc2VsZi0+ZGVzdHJveWVkKQorICAgIHsKKyAgICAgICAgbWVtc2V0KCZzZW5kZXIsIDAsIHNpemVvZihzZW5kZXIpKTsKKyAgICAgICAgbGVuID0gcmVjdmZyb20ocHJveHktPmNsaWVudF9zb2NrZXQsIGNsaWVudF9idWZmZXIsIHNpemVvZihjbGllbnRfYnVmZmVyKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSZzZW5kZXIsICZzZW5kc2l6ZSk7CisgICAgICAgIGlmIChsZW4gPCBCQ01UUl9IRFJfU0laRSkKKyAgICAgICAgeworICAgICAgICAgICAgKytwcm94eS0+c3RhdHMucnhfZXJyb3JzOworICAgICAgICAgICAgYmNtb3NfdXNsZWVwKDEwMDAwMDApOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgKytwcm94eS0+c3RhdHMucnhfcGFja2V0czsKKyAgICAgICAgcHJveHktPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKworICAgICAgICBpZiAocHJveHktPmNsaWVudC5zaW5fYWRkci5zX2FkZHIgIT0gc2VuZGVyLnNpbl9hZGRyLnNfYWRkciB8fAorICAgICAgICAgICAgcHJveHktPmNsaWVudC5zaW5fcG9ydCAhPSBzZW5kZXIuc2luX3BvcnQpCisgICAgICAgIHsKKyNpZmRlZiBFTkFCTEVfTE9HCisgICAgICAgICAgICBpbnQgY2xpZW50X2lwID0gbnRvaGwoc2VuZGVyLnNpbl9hZGRyLnNfYWRkcik7CisgICAgICAgICAgICBpbnQgY2xpZW50X3BvcnQgPSBudG9ocyhzZW5kZXIuc2luX3BvcnQpOworICAgICAgICAgICAgQkNNX0xPRyhJTkZPLCBwcm94eS0+cHJveHlfbG9nLCAiYmNtX2FwaV9wcm94eTogZGV2aWNlICVpIGNvbm5lY3RlZCB0byAlZC4lZC4lZC4lZDolZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgKGludClkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgIChjbGllbnRfaXAgPj4gMjQpICYgMHhmZiwgKGNsaWVudF9pcCA+PiAxNikgJiAweGZmLAorICAgICAgICAgICAgICAgICAgICAoY2xpZW50X2lwID4+IDgpICYgMHhmZiwgY2xpZW50X2lwICYgMHhmZiwgY2xpZW50X3BvcnQpOworI2VuZGlmCisgICAgICAgICAgICBwcm94eS0+Y2xpZW50ID0gc2VuZGVyOworICAgICAgICB9CisKKyAgICAgICAgLyogVW5wYWNrIHJlY2VpdmVkIG1lc3NhZ2UgKi8KKyAgICAgICAgYmNtb2x0X2J1Zl9pbml0KCZyeGIsIGxlbiwgY2xpZW50X2J1ZmZlciwgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpOworICAgICAgICBiY210cl9oZWFkZXJfdW5wYWNrKGNsaWVudF9idWZmZXIsICZ0cl9oZHIpOworCisgICAgICAgIC8qIFNraXAgcmVnaXN0cmF0aW9uIG1lc3NhZ2VzIGZvciBub3cuIFRoZSBwcm94eSBoYXMgYWxyZWFkeSByZWdpc3RlcmVkIGZvciBldmVyeXRoaW5nICovCisgICAgICAgIGlmICh0cl9oZHIuYXV0b19wcm94eV9yZWcgfHwgdHJfaGRyLmF1dG9fcHJveHlfdW5yZWcpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBiY21vbHRfYnVmX3NraXAoJnJ4YiwgQkNNVFJfSERSX1NJWkUpOworICAgICAgICBwcm94eV9tc2cgPSBOVUxMOworICAgICAgICByYyA9IGJjbW9sdF9tc2dfdW5wYWNrKCZyeGIsICZwcm94eV9tc2cpOworICAgICAgICBpZiAocmMpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFVucGFjayBlcnJvci4gTm90aGluZyBtdWNoIHdlIGNhbiBkbyAqLworICAgICAgICAgICAgKytwcm94eS0+c3RhdHMudW5wYWNrX2Vycm9yczsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLyogU3RvcmUgY29ycmVsYXRpb24gdGFnIGZvciBsYXRlciAqLworICAgICAgICBwcm94eV9tc2ctPmNvcnJfdGFnID0gdHJfaGRyLmNvcnJfdGFnOworICAgICAgICBjb3JyX3RhZyA9IHByb3h5X21zZy0+Y29ycl90YWc7CisKKyAgICAgICAgLyogUG9pbnQgdGhlIG1lc3NhZ2UgdW5wYWNrZXIgdG8gbG9jYWwgc3RvcmFnZSBmb3IgZHluYW1pY2FsbHktc2l6ZWQgbGlzdHMgKi8KKyAgICAgICAgcHJveHlfbXNnLT5saXN0X2J1ZiA9IHByb3h5LT5keW5hbWljX2xpc3RfYnVmZmVyOworICAgICAgICBwcm94eV9tc2ctPmxpc3RfYnVmX3NpemUgPSBEWU5BTUlDX0xJU1RfQlVGRkVSX1NJWkU7CisKKyAgICAgICAgLyogSW52b2tlIEFQSSAqLworICAgICAgICBfcHJveHlfaW52b2tlKGRldmljZSwgcHJveHlfbXNnKTsKKworICAgICAgICAvKiBQYWNrIGFuZCBzZW5kIGJhY2sgdG8gdGhlIGNsaWVudCAqLworICAgICAgICBwcm94eV9tc2ctPmNvcnJfdGFnID0gY29ycl90YWc7CisgICAgICAgIF9wcm94eV9zZW5kKGRldmljZSwgcHJveHlfbXNnKTsKKyAgICAgICAgYmNtb2x0X21zZ19mcmVlKHByb3h5X21zZyk7CisgICAgfQorCisgICAgc2VsZi0+ZGVzdHJveWVkID0gQkNNT1NfVFJVRTsKKyAgICByZXR1cm4gMDsKK30KKworLyogQXV0byAvIHByb3h5IG1lc3NhZ2UgaGFuZGxlciAqLwordm9pZCBiY21vbHRfYXBpX3Byb3h5X2F1dG9fcnhfY2IoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGlmIChkZXZpY2UgPj0gQkNNVFJfTUFYX09MVFMpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChwcm94eV9kYXRhW2RldmljZV0uaXNfcnVubmluZykKKyAgICB7CisgICAgICAgIGlmIChwcm94eV9kYXRhW2RldmljZV0ub25fcmVhZHlfY21kICYmCisgICAgICAgICAgICBtc2ctPm9ial90eXBlID09IEJDTU9MVF9PQkpfSURfREVWSUNFICYmCisgICAgICAgICAgICBtc2ctPmdyb3VwID09IEJDTU9MVF9NR1RfR1JPVVBfQVVUTyAmJgorICAgICAgICAgICAgbXNnLT5zdWJncm91cCA9PSBCQ01PTFRfREVWSUNFX0FVVE9fSURfQ09OTkVDVElPTl9DT01QTEVURSkKKyAgICAgICAgeworICAgICAgICAgICAgY2hhciBvbl9yZWFkeV9jbWRbNTEyXTsKKyAgICAgICAgICAgIGludCByYzsKKyAgICAgICAgICAgIHNucHJpbnRmKG9uX3JlYWR5X2NtZCwgc2l6ZW9mKG9uX3JlYWR5X2NtZCkgLSAxLCAiJXMgJWQiLCBwcm94eV9kYXRhW2RldmljZV0ub25fcmVhZHlfY21kLCAoaW50KWRldmljZSk7CisgICAgICAgICAgICByYyA9IHN5c3RlbShvbl9yZWFkeV9jbWQpOworI2lmZGVmIEVOQUJMRV9MT0cKKyAgICAgICAgICAgIEJDTV9MT0coSU5GTywgcHJveHlfZGF0YVtkZXZpY2VdLnByb3h5X2xvZywgIkV4ZWN1dGVkIGNvbW1hbmQgJXMuIHJjPSVkXG4iLCBvbl9yZWFkeV9jbWQsIHJjKTsKKyNlbHNlCisgICAgICAgICAgICAodm9pZClyYzsKKyNlbmRpZgorICAgICAgICB9CisgICAgICAgIF9wcm94eV9zZW5kKGRldmljZSwgbXNnKTsKKyAgICB9Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfcHJveHlfc3RhcnQoYmNtb2x0X2RldmlkIGRldmljZSwgdWludDMyX3QgdWRwX3BvcnQsIGNoYXIgKm9uX3JlYWR5KQoreworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGJjbW9zX3Rhc2tfcGFybSBwcm94eV9yeF9wYXJtID0KKyAgICB7CisgICAgICAgIC5uYW1lID0gInByb3h5X3J4IiwKKyAgICAgICAgLmhhbmRsZXIgPSBfcHJveHlfcnhfaGFuZGxlciwKKyAgICAgICAgLnByaW9yaXR5ID0gVEFTS19QUklPUklUWV9UUkFOU1BPUlRfUFJPWFksCisgICAgICAgIC5kYXRhID0gZGV2aWNlCisgICAgfTsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc2EgPSB7fTsKKworICAgIHByb3h5X2RhdGFbZGV2aWNlXS5wcm94eV9wb3J0ID0gdWRwX3BvcnQ7CisgICAgcHJveHlfZGF0YVtkZXZpY2VdLmRldmljZV9pZCA9IGRldmljZTsKKyAgICBwcm94eV9kYXRhW2RldmljZV0ub25fcmVhZHlfY21kID0gb25fcmVhZHk7CisKKyAgICAvKiBTdGFydCBsaXN0ZW5pbmcgb24gcHJveHkgcG9ydCAqLworICAgIHByb3h5X2RhdGFbZGV2aWNlXS5jbGllbnRfc29ja2V0ID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworICAgIGlmIChwcm94eV9kYXRhW2RldmljZV0uY2xpZW50X3NvY2tldCA8IDApCisgICAgeworI2lmZGVmIEVOQUJMRV9MT0cKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgcHJveHlfZGF0YVtkZXZpY2VdLnByb3h5X2xvZywgIkNhbid0IGNyZWF0ZSBVRFAgc29ja2V0XG4iKTsKKyNlbmRpZgorICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICB9CisKKyAgICAvKiBCaW5kIGxvY2FsICovCisgICAgc2Euc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgc2Euc2luX3BvcnQgPSBodG9ucyhwcm94eV9kYXRhW2RldmljZV0ucHJveHlfcG9ydCk7CisgICAgc2Euc2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsKKyAgICBpZiAoYmluZChwcm94eV9kYXRhW2RldmljZV0uY2xpZW50X3NvY2tldCwgKHN0cnVjdCBzb2NrYWRkciopJnNhLCBzaXplb2Yoc2EpICkgPT0gLTEpCisgICAgeworICAgICAgICBwZXJyb3IoImJpbmQiKTsKKyNpZmRlZiBFTkFCTEVfTE9HCisgICAgICAgIEJDTV9MT0coRVJST1IsIHByb3h5X2RhdGFbZGV2aWNlXS5wcm94eV9sb2csICJDYW4ndCBiaW5kIFVEUCBzb2NrZXQgdG8gcG9ydCAldVxuIiwgcHJveHlfZGF0YVtkZXZpY2VdLnByb3h5X3BvcnQpOworI2VuZGlmCisgICAgICAgIGNsb3NlKHByb3h5X2RhdGFbZGV2aWNlXS5jbGllbnRfc29ja2V0KTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7CisgICAgfQorCisgICAgLyogQ3JlYXRlIHRocmVhZCBsaXN0ZW5pbmcgZm9yIGluY29taW5nIEFQSXMgKi8KKyAgICByYyA9IGJjbW9zX3Rhc2tfY3JlYXRlKCZwcm94eV9kYXRhW2RldmljZV0ucHJveHlfcnhfdGFzaywgJnByb3h5X3J4X3Bhcm0pOworICAgIEJVR19PTihCQ01fRVJSX09LICE9IHJjKTsKKworICAgIHByb3h5X2RhdGFbZGV2aWNlXS5pc19ydW5uaW5nID0gQkNNT1NfVFJVRTsKKworI2lmZGVmIEVOQUJMRV9MT0cKKyAgICBCQ01fTE9HKElORk8sIHByb3h5X2RhdGFbZGV2aWNlXS5wcm94eV9sb2csICJCQ002ODYyMCBBUEkgcHJveHkgZm9yIGRldmljZSAlZCBpcyBsaXN0ZW5pbmcgZm9yIHJlcXVlc3RzIG9uIFVEUCBwb3J0ICV1XG4iLAorICAgICAgICAoaW50KWRldmljZSwgcHJveHlfZGF0YVtkZXZpY2VdLnByb3h5X3BvcnQpOworI2VuZGlmCisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtb2x0X2FwaV9wcm94eV9pbml0KGJjbWNsaV9lbnRyeSAqcm9vdCwgYmNtb2x0X2RldmlkIGRldmljZSwgdWludDMyX3QgdWRwX3BvcnQsIGNoYXIgKm9uX3JlYWR5KQoreworI2lmZGVmIEVOQUJMRV9DTEkKKyAgICBiY21jbGlfZW50cnkgKmRpcjsKKyNlbmRpZgorCisgICAgaWYgKGRldmljZSA+PSBCQ01UUl9NQVhfT0xUUykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKworICAgIGlmIChwcm94eV9kYXRhW2RldmljZV0uaXNfcnVubmluZykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfQUxSRUFEWTsKKworI2lmZGVmIEVOQUJMRV9MT0cKKyAgICB7CisgICAgICAgIGNoYXIgbG9nX2lkWzMyXTsKKyAgICAgICAgc25wcmludGYobG9nX2lkLCBzaXplb2YobG9nX2lkKSAtIDEsICJwcm94eV8lZCIsIChpbnQpZGV2aWNlKTsKKyAgICAgICAgcHJveHlfZGF0YVtkZXZpY2VdLnByb3h5X2xvZyA9IGJjbV9kZXZfbG9nX2lkX3JlZ2lzdGVyKGxvZ19pZCwgREVWX0xPR19MRVZFTF9JTkZPLCBERVZfTE9HX0lEX1RZUEVfQk9USCk7CisgICAgfQorI2Vsc2UKKyAgICBwcm94eV9kYXRhW2RldmljZV0ucHJveHlfbG9nID0gREVWX0xPR19JTlZBTElEX0lEOworI2VuZGlmCisKKyAgICBpZiAoaXNfZmlyc3RfcHJveHkpCisgICAgeworI2lmZGVmIEVOQUJMRV9DTEkKKyAgICAgICAgZGlyID0gYmNtY2xpX2Rpcl9hZGQocm9vdCwgInByb3h5IiwgIkFQSSBwcm94eSIsIEJDTUNMSV9BQ0NFU1NfR1VFU1QsIE5VTEwpOworICAgICAgICBpZiAoIWRpcikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgcHJveHlfZGF0YVtkZXZpY2VdLnByb3h5X2xvZywgIkNhbid0IGNyZWF0ZSBwcm94eSBkaXJlY3RvcnlcbiIpOworICAgICAgICAgICAgQlVHKCk7CisgICAgICAgIH0KKworICAgICAgICBCQ01DTElfTUFLRV9DTUQoZGlyLCAic3RhdCIsICJQcm94eSBzdGF0aXN0aWNzIiwgX3Byb3h5X3N0YXRzX2NtZCwKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fUkFOR0UoImRldmljZSIsICJEZXZpY2UgaW5kZXgiLCBCQ01DTElfUEFSTV9OVU1CRVIsIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwsCisgICAgICAgICAgICAgICAgMCwgQkNNVFJfTUFYX09MVFMtMSkpOworCisjZW5kaWYKKyAgICAgICAgaXNfZmlyc3RfcHJveHkgPSBCQ01PU19GQUxTRTsKKyAgICB9CisgICAgcmV0dXJuIF9wcm94eV9zdGFydChkZXZpY2UsIHVkcF9wb3J0LCBvbl9yZWFkeSk7Cit9CisKK3ZvaWQgYmNtb2x0X2FwaV9wcm94eV9zdG9wKHZvaWQpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgQkNNVFJfTUFYX09MVFM7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChwcm94eV9kYXRhW2ldLmlzX3J1bm5pbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3Rhc2tfZGVzdHJveSgmcHJveHlfZGF0YVtpXS5wcm94eV9yeF90YXNrKTsKKyAgICAgICAgICAgIGNsb3NlKHByb3h5X2RhdGFbaV0uY2xpZW50X3NvY2tldCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfcHJveHkvYmNtb2x0X2FwaV9wcm94eS5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2FwaV9wcm94eS9iY21vbHRfYXBpX3Byb3h5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc2YzI1ZQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9hcGlfcHJveHkvYmNtb2x0X2FwaV9wcm94eS5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgX0JDTU9MVF9BUElfUFJPWFlfSF8KKyNkZWZpbmUgX0JDTU9MVF9BUElfUFJPWFlfSF8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbW9sdF9tc2cuaD4KKwordm9pZCBiY21vbHRfYXBpX3Byb3h5X2F1dG9fcnhfY2IoYmNtb2x0X2RldmlkIG9sdCwgYmNtb2x0X21zZyAqbXNnKTsKKworYmNtb3NfZXJybm8gYmNtb2x0X2FwaV9wcm94eV9pbml0KGJjbWNsaV9lbnRyeSAqcm9vdCwgYmNtb2x0X2RldmlkIGRldmljZSwgdWludDMyX3QgdWRwX3BvcnQsIGNoYXIgKm9uX3JlYWR5X2NtZCk7CisKK3ZvaWQgYmNtb2x0X2FwaV9wcm94eV9zdG9wKHZvaWQpOworCisjZW5kaWYKKworCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvY2xpL01ha2VmaWxlIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2NsaS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjk3NGMxCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2NsaS9NYWtlZmlsZQpAQCAtMCwwICsxLDI2IEBACisjIENMSSBlbmdpbmUKKyMKK01PRF9OQU1FID0gY2xpCitNT0RfVFlQRSA9IGxpYgorTU9EX0RFUFMgPSB1dGlscworCitzcmNzID0gYmNtY2xpX3Nlc3Npb24uYworaWZlcSAoIiQoRU5BQkxFX0NMSSkiLCAieSIpCisgICAgc3JjcyArPSBiY21jbGkuYworICAgIE1PRF9ERUZTID0gLURFTkFCTEVfQ0xJCisKKyAgICAjIEVuYWJsZSBsaW5lIGVkaXRpbmcgYnkgZGVmYXVsdC4gQ2FuIGJlIG92ZXJ3cml0dGVuIGluIG1ha2UgY29tbWFuZCBsaW5lCisgICAgQ09ORklHX0xJQkVESVQJPz0gbgorICAgIENPTkZJR19MSU5FTk9JU0UgPz0geQorICAgIAorICAgICMgRXh0cmEgY29uZmlndXJhdGlvbgorICAgIGlmZXEgKCIkKENPTkZJR19MSUJFRElUKSIsICJ5IikKKyAgICAJTU9EX0RFRlMgKz0gLURDT05GSUdfTElCRURJVCAtRENPTkZJR19FRElUTElORQorICAgIAlNT0RfTElCUyArPSAtbGVkaXQgLWx0ZXJtY2FwCisgICAgCUNPTkZJR19MSU5FTk9JU0UgPSBuCisgICAgZW5kaWYKKyAgICBpZmVxICgiJChDT05GSUdfTElORU5PSVNFKSIsICJ5IikKKyAgICAJTU9EX0RFUFMgKz0gbGluZW5vaXNlCisgICAgZW5kaWYKK2VuZGlmCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9jbGkvYmNtY2xpLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvY2xpL2JjbWNsaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxOTBlNWQKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvY2xpL2JjbWNsaS5jCkBAIC0wLDAgKzEsMjgzNSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogYmNtY2xpLmMKKyAqCisgKiBDTEkgZW5naW5lCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjZGVmaW5lIEJDTUNMSV9JTlRFUk5BTAorI2luY2x1ZGUgPGJjbWNsaS5oPgorI2luY2x1ZGUgPGJjbW9zX3R5cGVzLmg+CisKKyNkZWZpbmUgQkNNQ0xJX0lOQlVGX0xFTiAgICAgICAgICAyMDQ4CisjZGVmaW5lIEJDTUNMSV9NQVhfUVVBTF9OQU1FX0xFTkdUSCAyNTYKKyNkZWZpbmUgQkNNQ0xJX01BWF9QQVJNUyAgICAgICAgICAxMjgKKyNkZWZpbmUgQkNNQ0xJX1VQX1NUUiAgICAgICAgICAgICAiLi4iCisjZGVmaW5lIEJDTUNMSV9ST09UX1NUUiAgICAgICAgICAgIi8iCisjZGVmaW5lIEJDTUNMSV9DT01NRU5UX0NIQVIgICAgICAgJyMnCisjZGVmaW5lIEJDTUNMSV9IRUxQX0NIQVIgICAgICAgICAgJz8nCisjZGVmaW5lIEJDTUNMSV9BUlJBWV9ERUxJTV9DSEFSICAgJywnCisjZGVmaW5lIEJDTUNMSV9ST09UX0hFTFAgICAgICAgICAgInJvb3QgZGlyZWN0b3J5IgorI2RlZmluZSBCQ01DTElfTUFYX1BBUk1fVkFMX0xFTiAgIDI1NgorI2RlZmluZSBCQ01DTElfRU5VTV9NQVNLX0RFTF9DSEFSICcrJworI2RlZmluZSBCQ01DTElfSEVMUF9CVUZGRVJfU0laRSAgIDE2Mzg0CisKKyNkZWZpbmUgQkNNQ0xJX0VRVUFMX0NIQVIgICAgICAgICAnPScKKworCit0eXBlZGVmIGVudW0geyBCQ01DTElfRU5UUllfRElSLCBCQ01DTElfRU5UUllfQ01EIH0gYmNtY2xpX2VudHJ5X3NlbGVjdG9yOworCisvKiBFeHRlcm5hbCB0YWJsZSAtIGJvb2xlYW4gdmFsdWVzICovCitiY21jbGlfZW51bV92YWwgYmNtY2xpX2VudW1fYm9vbF90YWJsZVtdID0geworICAgIHsgLm5hbWU9InRydWUiLCAudmFsID0gMSB9LAorICAgIHsgLm5hbWU9InllcyIsIC52YWwgPSAxIH0sCisgICAgeyAubmFtZT0ib24iLCAudmFsID0gMSB9LAorICAgIHsgLm5hbWU9ImZhbHNlIiwgLnZhbCA9IDAgfSwKKyAgICB7IC5uYW1lPSJubyIsIC52YWwgPSAwIH0sCisgICAgeyAubmFtZT0ib2ZmIiwgLnZhbCA9IDAgfSwKKyAgICBCQ01DTElfRU5VTV9MQVNUCit9OworCisvKiBNb25pdG9yIHRva2VuIHN0cnVjdHVyZSAqLworc3RydWN0IGJjbWNsaV9lbnRyeQoreworICAgIHN0cnVjdCBiY21jbGlfZW50cnkgICpuZXh0OworICAgIGNoYXIgKm5hbWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbW1hbmQvZGlyZWN0b3J5IG5hbWUgKi8KKyAgICBjaGFyICpoZWxwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb21tYW5kL2RpcmVjdG9yeSBoZWxwICovCisgICAgYmNtY2xpX2VudHJ5X3NlbGVjdG9yIHNlbDsgICAgICAgICAgICAgICAgICAgLyogRW50cnkgc2VsZWN0b3IgKi8KKyAgICBjaGFyICphbGlhczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBbGlhcyAqLworICAgIHVpbnQxNl90IGFsaWFzX2xlbjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFsaWFzIGxlbmd0aCAqLworICAgIHN0cnVjdCBiY21jbGlfZW50cnkgKnBhcmVudDsgICAgICAgICAgICAgICAgIC8qIFBhcmVudCBkaXJlY3RvcnkgKi8KKyAgICBiY21jbGlfYWNjZXNzX3JpZ2h0IGFjY2Vzc19yaWdodDsKKworICAgIHVuaW9uIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cnVjdCBiY21jbGlfZW50cnkgKmZpcnN0OyAgICAgICAgICAvKiBGaXJzdCBlbnRyeSBpbiBkaXJlY3RvcnkgKi8KKyAgICAgICAgICAgIGJjbWNsaV9kaXJfZXh0cmFfcGFybSBleHRyYXM7ICAgICAgICAvKiBPcHRpb25hbCBleHRyYXMgKi8KKyAgICAgICAgfSBkaXI7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21jbGlfY21kX2NiIGNtZF9jYjsgICAgICAgICAgICAgICAgLyogQ29tbWFuZCBjYWxsYmFjayAqLworICAgICAgICAgICAgYmNtY2xpX2NtZF9wYXJtICpwYXJtczsgICAgICAgICAgICAgIC8qIENvbW1hbmQgcGFyYW1ldGVycyAqLworICAgICAgICAgICAgYmNtY2xpX2NtZF9leHRyYV9wYXJtIGV4dHJhczsgICAgICAgIC8qIE9wdGlvbmFsIGV4dHJhcyAqLworICAgICAgICAgICAgdWludDE2X3QgbnVtX3Bhcm1zOworICAgICAgICB9IGNtZDsKKyAgICB9IHU7Cit9OworCisKKy8qIFRva2VuIHR5cGVzICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBCQ01DTElfVE9LRU5fRU1QVFksCisgICAgQkNNQ0xJX1RPS0VOX1VQLAorICAgIEJDTUNMSV9UT0tFTl9ST09ULAorICAgIEJDTUNMSV9UT0tFTl9CUkVBSywKKyAgICBCQ01DTElfVE9LRU5fSEVMUCwKKyAgICBCQ01DTElfVE9LRU5fTkFNRSwKKyAgICBCQ01DTElfVE9LRU5fVkFMVUUsCit9IGJjbWNsaV90b2tlbl90eXBlOworCisvKiBQYXJhbWV0ZXIgdmFsdWUgc2V0IGRlc2NyaXB0b3IgKi8KK3R5cGVkZWYgdW5pb24gYmNtY2xpX3Bhcm1fdmFsdWVfc3RhdHVzCit7CisgICAgYmNtb3NfYm9vbCAgdmFsdWVfc2V0OworICAgIGJjbW9zX2Jvb2wgKnZhbHVlc19zZXQ7Cit9IGJjbWNsaV9wYXJtX3ZhbHVlX3N0YXR1czsKKworLyogQ0xJIHNlc3Npb24gZGF0YSAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtY2xpX3Nlc3Npb25fZGF0YQoreworICAgIGJjbWNsaV9lbnRyeSAqY3VyZGlyOworICAgIGJjbWNsaV9lbnRyeSAqY3VyY21kOworICAgIGJjbWNsaV9jbWRfcGFybSBjbWRfcGFybXNbQkNNQ0xJX01BWF9QQVJNU107CisgICAgYmNtY2xpX3Bhcm1fdmFsdWVfc3RhdHVzIHZhbHVlX3N0YXR1c1tCQ01DTElfTUFYX1BBUk1TXTsKKyAgICBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbjsKKyAgICB1aW50MTZfdCBudW1fcGFybXM7CisgICAgY2hhciAqcF9pbmJ1ZjsKKyAgICBpbnQgc3RvcF9tb25pdG9yOworICAgIGNoYXIgaW5idWZbQkNNQ0xJX0lOQlVGX0xFTl07Cit9IGJjbWNsaV9zZXNzaW9uX2V4dHJhczsKKworLyogTmFtZSwgdmFsdWUgcGFpcnMgKi8KK3R5cGVkZWYgc3RydWN0IGJjbWNsaV9uYW1lX3ZhbHVlCit7CisgICAgYmNtY2xpX3Rva2VuX3R5cGUgdHlwZTsKKyAgICBjb25zdCBjaGFyICpuYW1lOworICAgIGNvbnN0IGNoYXIgKnZhbHVlOworfSBiY21jbGlfbmFtZV92YWx1ZTsKKworc3RhdGljIGJjbWNsaV9lbnRyeSAgICAgICAgICAgKl9iY21jbGlfcm9vdF9kaXI7CitzdGF0aWMgYmNtY2xpX3Nlc3Npb25fZXh0cmFzICAqX2JjbWNsaV9yb290X3Nlc3Npb247CitzdGF0aWMgYmNtY2xpX2xvZ19tb2RlICAgICAgICAgX2JjbWNsaV9sb2dfbW9kZTsKK3N0YXRpYyBiY21jbGlfc2Vzc2lvbiAgICAgICAgICpfYmNtY2xpX2xvZ19zZXNzaW9uOworCisjZGVmaW5lIEJDTUNMSV9NSU5fTkFNRV9MRU5HVEhfRk9SX0FMSUFTICAgMworI2RlZmluZSBCQ01DTElfUk9PVF9OQU1FICAgICAgICIvIgorCisvKiBJbnRlcm5hbCBmdW5jdGlvbnMgKi8KK3N0YXRpYyB2b2lkICAgICAgICBfYmNtY2xpX2FsbG9jX3Jvb3QoY29uc3QgYmNtY2xpX3Nlc3Npb25fcGFybSAqcGFybSk7CitzdGF0aWMgdm9pZCAgICAgICAgX2JjbWNsaV9kaXNwbGF5X2RpcihiY21jbGlfc2Vzc2lvbl9leHRyYXMgKm1vbl9zZXNzaW9uLCBiY21jbGlfZW50cnkgKnBfZGlyICk7CitzdGF0aWMgYmNtY2xpX3Rva2VuX3R5cGUgX2JjbWNsaV9nZXRfd29yZChiY21jbGlfc2Vzc2lvbl9leHRyYXMgKnNlc3Npb24sIGNoYXIgKippbmJ1ZiwgY2hhciAqKnBfd29yZCk7CitzdGF0aWMgYmNtY2xpX3Rva2VuX3R5cGUgX2JjbWNsaV9hbmFseXplX3Rva2VuKCBjb25zdCBjaGFyICpuYW1lICk7CitzdGF0aWMgaW50ICAgICAgICAgX2JjbWNsaV9wYXJzZV9wYXJtcyggYmNtY2xpX3Nlc3Npb25fZXh0cmFzICptb25fc2Vzc2lvbiwgYmNtY2xpX2VudHJ5ICpwX3Rva2VuLAorICAgIGJjbWNsaV9uYW1lX3ZhbHVlICpwYWlycywgaW50IG5wYWlycyk7CitzdGF0aWMgaW50IF9iY21jbGlfZXh0ZW5kX3Bhcm1zKCBiY21jbGlfc2Vzc2lvbl9leHRyYXMgKm1vbl9zZXNzaW9uLCBiY21jbGlfbmFtZV92YWx1ZSAqcGFpcnMsCisgICAgaW50IG5wYWlycywgYmNtb3NfYm9vbCBsYXN0X2lzX3NwYWNlLCBjaGFyICppbnNlcnRfc3RyLCB1aW50MzJfdCBpbnNlcnRfc2l6ZSk7CitzdGF0aWMgYmNtY2xpX2VudHJ5ICpfYmNtY2xpX3NlYXJjaF90b2tlbiggYmNtY2xpX2VudHJ5ICpwX2RpciwgY29uc3QgY2hhciAqbmFtZSApOworc3RhdGljIHZvaWQgICAgICAgIF9iY21jbGlfaGVscF9kaXIoIGJjbWNsaV9zZXNzaW9uX2V4dHJhcyAqbW9uX3Nlc3Npb24sIGJjbWNsaV9lbnRyeSAqcF9kaXIgKTsKK3N0YXRpYyB2b2lkICAgICAgICBfYmNtY2xpX2hlbHBfZW50cnkoYmNtY2xpX3Nlc3Npb25fZXh0cmFzICptb25fc2Vzc2lvbiwgYmNtY2xpX2VudHJ5ICpwX3Rva2VuLAorICAgIGJjbWNsaV9uYW1lX3ZhbHVlICpwYWlycywgaW50IG5wYWlycywgYmNtb3NfYm9vbCBzdXBwcmVzc19lcnJfcHJpbnQpOworc3RhdGljIHZvaWQgICAgICAgIF9iY21jbGlfaGVscF9wb3B1bGF0ZWRfY21kKGJjbWNsaV9zZXNzaW9uX2V4dHJhcyAqbW9uX3Nlc3Npb24sIGJjbWNsaV9lbnRyeSAqcF90b2tlbiwKKyAgICBjb25zdCBjaGFyICpwYXJ0aWFsX21hdGNoLCBiY21vc19ib29sIHN1cHByZXNzX2Fzc2lnbmVkKTsKK3N0YXRpYyB2b2lkICAgICAgICBfYmNtY2xpX2Nob29zZV9hbGlhcyggYmNtY2xpX2VudHJ5ICpwX2RpciwgYmNtY2xpX2VudHJ5ICpwX25ld190b2tlbiApOworc3RhdGljIGJjbWNsaV9jbWRfcGFybSAqX2JjbWNsaV9maW5kX25hbWVkX3Bhcm0oYmNtY2xpX3Nlc3Npb25fZXh0cmFzICptb25fc2Vzc2lvbiwgY29uc3QgY2hhciAqbmFtZSk7CitzdGF0aWMgY2hhciAgICAgICAqX2JjbWNsaV9zdHJsd3IoIGNoYXIgKnMgKTsKK3N0YXRpYyBpbnQgICAgICAgICBfYmNtY2xpX3N0cmljbXAoIGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgaW50IGxlbiApOworc3RhdGljIGJjbW9zX2Vycm5vIF9iY21jbGlfZGZ0X3NjYW5fY2IoY29uc3QgYmNtY2xpX2NtZF9wYXJtICpwYXJtLCBiY21jbGlfcGFybV92YWx1ZSAqdmFsdWUsIGNvbnN0IGNoYXIgKnN0cmluZ192YWwpOworc3RhdGljIGNvbnN0IGNoYXIgKl9iY21jbGlfZ2V0X3R5cGVfbmFtZShjb25zdCBiY21jbGlfY21kX3Bhcm0gKnBhcm0pOworc3RhdGljIHZvaWQgICAgICAgIF9iY21jbGlfZGZ0X2Zvcm1hdF9jYihjb25zdCBiY21jbGlfY21kX3Bhcm0gKnBhcm0sIGJjbWNsaV9wYXJtX3ZhbHVlIHZhbHVlLCBjaGFyICpidWZmZXIsIGludCBzaXplKTsKK3N0YXRpYyBiY21vc19lcnJubyBfYmNtY2xpX2VudW1fc2Nhbl9jYihjb25zdCBiY21jbGlfY21kX3Bhcm0gKnBhcm0sIGJjbWNsaV9wYXJtX3ZhbHVlICp2YWx1ZSwgY29uc3QgY2hhciAqc3RyaW5nX3ZhbCk7CitzdGF0aWMgdm9pZCAgICAgICAgX2JjbWNsaV9lbnVtX2Zvcm1hdF9jYihjb25zdCBiY21jbGlfY21kX3Bhcm0gKnBhcm0sIGJjbWNsaV9wYXJtX3ZhbHVlIHZhbHVlLCBjaGFyICpidWZmZXIsIGludCBzaXplKTsKK3N0YXRpYyBiY21vc19lcnJubyBfYmNtY2xpX2VudW1fbWFza19zY2FuX2NiKGNvbnN0IGJjbWNsaV9jbWRfcGFybSAqcGFybSwgYmNtY2xpX3Bhcm1fdmFsdWUgKnZhbHVlLCBjb25zdCBjaGFyICpzdHJpbmdfdmFsKTsKK3N0YXRpYyB2b2lkICAgICAgICBfYmNtY2xpX2VudW1fbWFza19mb3JtYXRfY2IoY29uc3QgYmNtY2xpX2NtZF9wYXJtICpwYXJtLCBiY21jbGlfcGFybV92YWx1ZSB2YWx1ZSwgY2hhciAqYnVmZmVyLCBpbnQgc2l6ZSk7CitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbWNsaV9idWZmZXJfc2Nhbl9jYihjb25zdCBiY21jbGlfY21kX3Bhcm0gKnBhcm0sIGJjbWNsaV9wYXJtX3ZhbHVlICp2YWx1ZSwgY29uc3QgY2hhciAqc3RyaW5nX3ZhbCk7CitzdGF0aWMgY29uc3QgY2hhciAqX2JjbWNsaV9xdWFsaWZpZWRfbmFtZSggYmNtY2xpX2VudHJ5ICp0b2tlbiwgY2hhciAqYnVmZmVyLCBpbnQgc2l6ZSk7CitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbWNsaV9zcGxpdChiY21jbGlfc2Vzc2lvbl9leHRyYXMgKm1vbl9zZXNzaW9uLCBiY21jbGlfbmFtZV92YWx1ZSAqKnBhaXJzLCBpbnQgKm5wYWlycyk7CitzdGF0aWMgdm9pZCAgICAgICAgX2JjbWNsaV9hc3NpZ25fY2FsbGJhY2tzKGJjbWNsaV9jbWRfcGFybSAqcGFybSk7CitzdGF0aWMgdm9pZCAgICAgICAgX2JjbWNsaV9sb2dfY21kKGNvbnN0IGNoYXIgKmNtZCk7CitzdGF0aWMgdm9pZCAgICAgICAgX2JjbWNsaV9sb2dfcmMoYmNtb3NfZXJybm8gcmMpOworc3RhdGljIHZvaWQgICAgICAgIF9iY21jbGlfZnJlZV9zZXNzaW9uX3ZhbHVlX3N0YXR1cyhiY21jbGlfc2Vzc2lvbl9leHRyYXMgKm1vbl9zZXNzaW9uKTsKKworc3RhdGljIGlubGluZSBiY21jbGlfc2Vzc2lvbl9leHRyYXMgKl9iY21jbGlfc2Vzc2lvbl9kYXRhKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGlmICghc2Vzc2lvbikKKyAgICAgICAgcmV0dXJuIF9iY21jbGlfcm9vdF9zZXNzaW9uOworICAgIHJldHVybiBiY21jbGlfc2Vzc2lvbl9kYXRhKHNlc3Npb24pOworfQorCisvKiogQWRkIHN1YmRpcmVjdG9yeSB0byB0aGUgcGFyZW50IGRpcmVjdG9yeQorICoKKyAqIFxwYXJhbVtpbl0gICBwYXJlbnQgICAgICAgICAgUGFyZW50IGRpcmVjdG9yeSBoYW5kbGUuIE5VTEw9cm9vdAorICogXHBhcmFtW2luXSAgIG5hbWUgICAgICAgICAgICBEaXJlY3RvcnkgbmFtZQorICogXHBhcmFtW2luXSAgIGhlbHAgICAgICAgICAgICBIZWxwIHN0cmluZworICogXHBhcmFtW2luXSAgIGFjY2Vzc19yaWdodCAgICBBY2Nlc3MgcmlnaHRzCisgKiBccGFyYW1baW5dICAgZXh0cmFzICAgICAgICAgIE9wdGlvbmFsIGRpcmVjdG9yeSBkZXNjcmlwdG9yLiBNdXN0bid0IGJlIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2suCisgKiBccmV0dXJuICAgICAgbmV3IGRpcmVjdG9yeSBoYW5kbGUgb3IgTlVMTCBpbiBjYXNlIG9mIGZhaWx1cmUKKyAqLworYmNtY2xpX2VudHJ5ICpiY21jbGlfZGlyX2FkZChiY21jbGlfZW50cnkgKnBhcmVudCwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaGVscCwgYmNtY2xpX2FjY2Vzc19yaWdodCBhY2Nlc3NfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJjbWNsaV9kaXJfZXh0cmFfcGFybSAqZXh0cmFzKQoreworICAgIGJjbWNsaV9lbnRyeSAqcF9kaXI7CisgICAgYmNtY2xpX2VudHJ5ICoqcF9lOworCisgICAgYXNzZXJ0KG5hbWUpOworICAgIGFzc2VydChoZWxwKTsKKyAgICBpZiAoIW5hbWUgfHwgIWhlbHApCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKCFfYmNtY2xpX3Jvb3RfZGlyKQorICAgIHsKKyAgICAgICAgX2JjbWNsaV9hbGxvY19yb290KE5VTEwpOworICAgICAgICBpZiAoIV9iY21jbGlfcm9vdF9kaXIpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoIXBhcmVudCkKKyAgICAgICAgcGFyZW50ID0gX2JjbWNsaV9yb290X2RpcjsKKworICAgIHBfZGlyPShiY21jbGlfZW50cnkgKiliY21vc19jYWxsb2MoIHNpemVvZihiY21jbGlfZW50cnkpICsgc3RybGVuKG5hbWUpICsgc3RybGVuKGhlbHApICsgMiApOworICAgIGlmICggIXBfZGlyICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBwX2Rpci0+bmFtZSA9IChjaGFyICopKHBfZGlyICsgMSk7CisgICAgc3RyY3B5KCBwX2Rpci0+bmFtZSwgbmFtZSk7CisgICAgcF9kaXItPmhlbHAgPSBwX2Rpci0+bmFtZSArIHN0cmxlbihuYW1lKSArIDE7CisgICAgc3RyY3B5KHBfZGlyLT5oZWxwLCBoZWxwKTsKKyAgICBwX2Rpci0+c2VsID0gQkNNQ0xJX0VOVFJZX0RJUjsKKyAgICBfYmNtY2xpX2Nob29zZV9hbGlhcyggcGFyZW50LCBwX2RpciApOworICAgIHBfZGlyLT5hY2Nlc3NfcmlnaHQgPSBhY2Nlc3NfcmlnaHQ7CisgICAgaWYgKGV4dHJhcykKKyAgICAgICAgcF9kaXItPnUuZGlyLmV4dHJhcyA9ICpleHRyYXM7CisKKyAgICAvKiBBZGQgbmV3IGRpcmVjdG9yeSB0byB0aGUgcGFyZW50J3MgbGlzdCAqLworICAgIHBfZGlyLT5wYXJlbnQgPSBwYXJlbnQ7CisgICAgcF9lID0gJihwYXJlbnQtPnUuZGlyLmZpcnN0KTsKKyAgICB3aGlsZSAoKnBfZSkKKyAgICAgICAgcF9lID0gJigoKnBfZSktPm5leHQpOworICAgICpwX2UgPSBwX2RpcjsKKworICAgIHJldHVybiBwX2RpcjsKK30KKworc3RhdGljIGJjbWNsaV9lbnRyeSAqIGZpbmRfZW50cnlfaW5fZGlyKCBiY21jbGlfZW50cnkgKmRpciwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYmNtY2xpX2VudHJ5X3NlbGVjdG9yIHR5cGUsIHVpbnQxNl90IHJlY3Vyc2l2ZV9zZWFyY2gpCit7CisgICAgYmNtY2xpX2VudHJ5ICpwMSwgKnA7CisKKyAgICBpZiAoICFkaXIgKQorICAgIHsKKyAgICAgICAgZGlyID0gX2JjbWNsaV9yb290X2RpcjsKKyAgICAgICAgaWYgKCFkaXIpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcCA9IGRpci0+dS5kaXIuZmlyc3Q7CisgICAgd2hpbGUgKHApCisgICAgeworICAgICAgICBpZiAoICFfYmNtY2xpX3N0cmljbXAocC0+bmFtZSwgbmFtZSwgLTEpICYmIHR5cGUgPT0gcC0+c2VsICkKKyAgICAgICAgICAgIHJldHVybiBwOworICAgICAgICBpZiAoIHJlY3Vyc2l2ZV9zZWFyY2ggJiYgcC0+c2VsID09IEJDTUNMSV9FTlRSWV9ESVIgKQorICAgICAgICB7CisgICAgICAgICAgICBwMSA9IGZpbmRfZW50cnlfaW5fZGlyKHAsIG5hbWUgLCB0eXBlLCAxICk7CisgICAgICAgICAgICBpZiAoIHAxICkKKyAgICAgICAgICAgICAgICByZXR1cm4gcDE7CisgICAgICAgIH0KKyAgICAgICAgcCA9IHAtPm5leHQ7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCisKKy8qIFNjYW4gZGlyZWN0b3J5IHRyZWUgYW5kIGxvb2sgZm9yIGRpcmVjdG9yeSB3aXRoIG5hbWUgc3RhcnRzIGZyb20KKyAqIHJvb3QgZGlyZWN0b3J5IHdpdGggbmFtZSByb290X25hbWUKKyAqLworYmNtY2xpX2VudHJ5ICpiY21jbGlfZGlyX2ZpbmQoYmNtY2xpX2VudHJ5ICpwYXJlbnQsIGNvbnN0IGNoYXIgICpuYW1lKQoreworICAgIGlmICggIXBhcmVudCApCisgICAgICAgIHBhcmVudCA9IF9iY21jbGlfcm9vdF9kaXI7CisgICAgcmV0dXJuIGZpbmRfZW50cnlfaW5fZGlyKHBhcmVudCwgbmFtZSwgQkNNQ0xJX0VOVFJZX0RJUiwgMCApOworfQorCisKKy8qIFNjYW4gZGlyZWN0b3J5IHRyZWUgYW5kIGxvb2sgZm9yIGNvbW1hbmQgbmFtZWQgIm5hbWUiLiAqLworYmNtY2xpX2VudHJ5ICpiY21jbGlfY21kX2ZpbmQoYmNtY2xpX2VudHJ5ICpwYXJlbnQsIGNvbnN0IGNoYXIgKm5hbWUgKQoreworICAgIGlmICggIXBhcmVudCApCisgICAgICAgIHBhcmVudCA9IF9iY21jbGlfcm9vdF9kaXI7CisgICAgcmV0dXJuIGZpbmRfZW50cnlfaW5fZGlyKHBhcmVudCwgbmFtZSwgQkNNQ0xJX0VOVFJZX0NNRCwgMCApOworfQorCisKKy8qKiBBZGQgQ0xJIGNvbW1hbmQKKyAqCisgKiBccGFyYW1baW5dICAgZGlyICAgICAgICAgICAgIEhhbmRsZSBvZiBkaXJlY3RvcnkgdG8gYWRkIGNvbW1hbmQgdG8uIE5VTEw9cm9vdAorICogXHBhcmFtW2luXSAgIG5hbWUgICAgICAgICAgICBDb21tYW5kIG5hbWUKKyAqIFxwYXJhbVtpbl0gICBjbWRfY2IgICAgICAgICAgQ29tbWFuZCBoYW5kbGVyCisgKiBccGFyYW1baW5dICAgaGVscCAgICAgICAgICAgIEhlbHAgc3RyaW5nCisgKiBccGFyYW1baW5dICAgYWNjZXNzX3JpZ2h0ICAgIEFjY2VzcyByaWdodHMKKyAqIFxwYXJhbVtpbl0gICBleHRyYXMgICAgICAgICAgT3B0aW9uYWwgZXh0cmFzCisgKiBccGFyYW1baW5dICAgcGFybXMgICAgICAgICAgIE9wdGlvbmFsIHBhcmFtZXRlcnMgYXJyYXkuIE11c3Qgbm90IGJlIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2shCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHBhcm1zIT1OVUxMLCB0aGUgbGFzdCBwYXJhbWV0ZXIgaW4gdGhlIGFycmF5IG11c3QgaGF2ZSBuYW1lPT1OVUxMLgorICogXHJldHVybgorICogICAgICAwICAgPU9LXG4KKyAqICAgICAgPDAgID1lcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbWNsaV9jbWRfYWRkKGJjbWNsaV9lbnRyeSAqZGlyLCBjb25zdCBjaGFyICpuYW1lLCBiY21jbGlfY21kX2NiIGNtZF9jYiwKKyAgICBjb25zdCBjaGFyICpoZWxwLCBiY21jbGlfYWNjZXNzX3JpZ2h0IGFjY2Vzc19yaWdodCwKKyAgICBjb25zdCBiY21jbGlfY21kX2V4dHJhX3Bhcm0gKmV4dHJhcywgYmNtY2xpX2NtZF9wYXJtIHBhcm1zW10pCit7CisgICAgYmNtY2xpX2VudHJ5ICpwX3Rva2VuOworICAgIGJjbWNsaV9lbnRyeSAqKnBfZTsKKyAgICB1aW50MTZfdCAgICAgICBpOworICAgIGJjbWNsaV9jbWRfcGFybSAqcGFybSA9IHBhcm1zOworCisgICAgYXNzZXJ0KG5hbWUpOworICAgIGFzc2VydChoZWxwKTsKKyAgICBhc3NlcnQoY21kX2NiKTsKKyAgICBpZiAoIW5hbWUgfHwgIWNtZF9jYiB8fCAhaGVscCkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKworICAgIGlmICghX2JjbWNsaV9yb290X2RpcikKKyAgICB7CisgICAgICAgIF9iY21jbGlfYWxsb2Nfcm9vdChOVUxMKTsKKyAgICAgICAgaWYgKCFfYmNtY2xpX3Jvb3RfZGlyKQorICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorCisgICAgaWYgKCFkaXIpCisgICAgICAgIGRpciA9IF9iY21jbGlfcm9vdF9kaXI7CisKKyAgICBwX3Rva2VuPShiY21jbGlfZW50cnkgKiliY21vc19jYWxsb2MoIHNpemVvZihiY21jbGlfZW50cnkpICsgc3RybGVuKG5hbWUpICsgc3RybGVuKGhlbHApICsgMiApOworICAgIGlmICggIXBfdG9rZW4gKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKworICAgIC8qIENvcHkgbmFtZSAqLworICAgIHBfdG9rZW4tPm5hbWUgPSAoY2hhciAqKShwX3Rva2VuICsgMSk7CisgICAgc3RyY3B5KCBwX3Rva2VuLT5uYW1lLCBuYW1lICk7CisgICAgcF90b2tlbi0+aGVscCA9IHBfdG9rZW4tPm5hbWUgKyBzdHJsZW4obmFtZSkgKyAxOworICAgIHN0cmNweShwX3Rva2VuLT5oZWxwLCBoZWxwKTsKKyAgICBwX3Rva2VuLT5zZWwgPSBCQ01DTElfRU5UUllfQ01EOworICAgIHBfdG9rZW4tPnUuY21kLmNtZF9jYiA9IGNtZF9jYjsKKyAgICBwX3Rva2VuLT51LmNtZC5wYXJtcyA9IHBhcm1zOworICAgIGlmIChleHRyYXMpCisgICAgICAgIHBfdG9rZW4tPnUuY21kLmV4dHJhcyA9ICpleHRyYXM7CisgICAgcF90b2tlbi0+YWNjZXNzX3JpZ2h0ID0gYWNjZXNzX3JpZ2h0OworCisgICAgLyogQ29udmVydCBuYW1lIHRvIGxvd2VyIGNhc2UgYW5kIGNob29zZSBhbGlhcyAqLworICAgIF9iY21jbGlfY2hvb3NlX2FsaWFzKGRpciwgcF90b2tlbiApOworCisKKyAgICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCisgICAgZm9yIChpID0gMDsgaSA8IEJDTUNMSV9NQVhfUEFSTVMgJiYgcGFybXMgJiYgcGFybXNbaV0ubmFtZTsgaSsrKQorICAgIHsKKyAgICAgICAgcGFybSA9ICZwYXJtc1tpXTsKKyAgICAgICAgLyogVXNlci1kZWZpbmVkIHBhcmFtZXRlciBtdXN0IGhhdmUgYSBzY2FuX2NiIGNhbGxiYWNrIGZvciB0ZXh0LT52YWx1ZSBjb252ZXJzaW9uICovCisgICAgICAgIGlmICgocGFybS0+dHlwZT09QkNNQ0xJX1BBUk1fVVNFUkRFRikgJiYgIXBhcm0tPnNjYW5fY2IpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3ByaW50ZigiTU9OOiAlcz4gc2Nhbl9jYiBjYWxsYmFjayBtdXN0IGJlIHNldCBmb3IgdXNlci1kZWZpbmVkIHBhcmFtZXRlciAlc1xuIiwgbmFtZSwgcGFybS0+bmFtZSk7CisgICAgICAgICAgICBnb3RvIGNtZF9hZGRfZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhcm0tPnR5cGU9PUJDTUNMSV9QQVJNX0VOVU0gfHwgcGFybS0+dHlwZT09QkNNQ0xJX1BBUk1fRU5VTV9NQVNLKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIXBhcm0tPmVudW1fdGFibGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb3NfcHJpbnRmKCJNT046ICVzPiB2YWx1ZSB0YWJsZSBtdXN0IGJlIHNldCBpbiBsb3dfdmFsIGZvciBlbnVtIHBhcmFtZXRlciAlc1xuIiwgbmFtZSwgcGFybS0+bmFtZSk7CisgICAgICAgICAgICAgICAgZ290byBjbWRfYWRkX2Vycm9yOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBDaGVjayBkZWZhdWx0IHZhbHVlIGlmIGFueSAqLworICAgICAgICAgICAgaWYgKChwYXJtLT5mbGFncyAmIEJDTUNMSV9QQVJNX0ZMQUdfREVGVkFMKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2JjbWNsaV9lbnVtX21hc2tfc2Nhbl9jYihwYXJtLCAmcGFybS0+dmFsdWUsIHBhcm0tPnZhbHVlLnN0cmluZykgPCAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfcHJpbnRmKCJNT046ICVzPiBkZWZhdWx0IHZhbHVlICVzIGRvZXNuJ3QgbWF0Y2ggYW55IHZhbHVlIG9mIGVudW0gcGFyYW1ldGVyICVzXG4iLCBuYW1lLCBwYXJtLT52YWx1ZS5zdHJpbmcsIHBhcm0tPm5hbWUpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGNtZF9hZGRfZXJyb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoKHBhcm0tPmZsYWdzICYgQkNNQ0xJX1BBUk1fRkxBR19PUFRJT05BTCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogT3B0aW9uYWwgZW51bSBwYXJhbWV0ZXJzIGFyZSBpbml0aWFsaXplZCBieSB0aGVpciAxc3QgdmFsdWUgYnkgZGVmYXVsdC4KKyAgICAgICAgICAgICAgICAgKiBBbGwgb3RoZXIgcGFyYW1ldGVycyBhcmUgaW5pdGlhbGl6ZWQgdG8gMC4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBiY21jbGlfZW51bV92YWwgKnZhbHVlcz1wYXJtLT5lbnVtX3RhYmxlOworICAgICAgICAgICAgICAgIHBhcm0tPnZhbHVlLmVudW1fdmFsID0gdmFsdWVzWzBdLnZhbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogQWxsIHZhbHVlcyBvZiBlbnVtIG1hc2sgcGFyYW1ldGVycyBtYXN0IGJlIGNvbXBsZW1lbnRhcnkgYml0cyAqLworICAgICAgICAgICAgaWYgKHBhcm0tPnR5cGU9PUJDTUNMSV9QQVJNX0VOVU1fTUFTSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb25nIGFsbF9tYXNrID0gMDsKKyAgICAgICAgICAgICAgICBiY21jbGlfZW51bV92YWwgKnZhbHVlczsKKyAgICAgICAgICAgICAgICBmb3IgKHZhbHVlcz1wYXJtLT5lbnVtX3RhYmxlOyB2YWx1ZXMtPm5hbWU7ICsrdmFsdWVzKQorICAgICAgICAgICAgICAgICAgICBhbGxfbWFzayB8PSB2YWx1ZXMtPnZhbDsKKworICAgICAgICAgICAgICAgIGZvciAodmFsdWVzPXBhcm0tPmVudW1fdGFibGU7IHZhbHVlcy0+bmFtZTsgKyt2YWx1ZXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoKGFsbF9tYXNrICYgdmFsdWVzLT52YWwpICE9IHZhbHVlcy0+dmFsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc19wcmludGYoIk1PTjogJXM+IGVudW1fdGFibGUgdmFsdWVzIG9mIGVudW1fbWFzayBwYXJhbWV0ZXJzIG11c3QgYmUgY29tcGxlbWVudGFyeSBiaXRzXG4iLCBuYW1lLCBwYXJtLT5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gY21kX2FkZF9lcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBhbGxfbWFzayAmPSB+dmFsdWVzLT52YWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHBhcm0tPnR5cGU9PUJDTUNMSV9QQVJNX0JVRkZFUikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFwYXJtLT52YWx1ZS5idWZmZXIuc3RhcnQgfHwgIXBhcm0tPnZhbHVlLmJ1ZmZlci5sZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb3NfcHJpbnRmKCJNT046ICVzPiB2YWx1ZS5idWZmZXIuc3RhcnQgaXMgbm90IHNldCBmb3IgQlVGRkVSIHBhcmFtZXRlciAlc1xuIiwgbmFtZSwgcGFybS0+bmFtZSk7CisgICAgICAgICAgICAgICAgZ290byBjbWRfYWRkX2Vycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBhcm0tPm1heF9hcnJheV9zaXplKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9zX3ByaW50ZigiTU9OOiAlcz4gQlVGRkVSIGFycmF5cyBhcmUgbm90IHN1cHBvcnRlZCAlc1xuIiwgbmFtZSwgcGFybS0+bmFtZSk7CisgICAgICAgICAgICAgICAgZ290byBjbWRfYWRkX2Vycm9yOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChwYXJtLT5tYXhfYXJyYXlfc2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFwYXJtLT52YWx1ZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb3NfcHJpbnRmKCJNT046ICVzPiBwYXJtLT52YWx1ZXMgbXVzdCBiZSBzZXQgZm9yIHBhcmFtZXRlci1hcnJheSAlc1xuIiwgbmFtZSwgcGFybS0+bmFtZSk7CisgICAgICAgICAgICAgICAgZ290byBjbWRfYWRkX2Vycm9yOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIF9iY21jbGlfYXNzaWduX2NhbGxiYWNrcyhwYXJtKTsKKyAgICB9CisgICAgaWYgKChpID09IEJDTUNMSV9NQVhfUEFSTVMpICYmIHBhcm1zW2ldLm5hbWVbMF0pCisgICAgeworICAgICAgICBiY21vc19wcmludGYoIk1PTjogJXM+IHRvbyBtYW55IHBhcmFtZXRlcnNcbiIsIG5hbWUpOworICAgICAgICBnb3RvIGNtZF9hZGRfZXJyb3I7CisgICAgfQorICAgIHBfdG9rZW4tPnUuY21kLm51bV9wYXJtcyA9IGk7CisKKyAgICAvKiBBZGQgdG9rZW4gdG8gdGhlIGRpcmVjdG9yeSAqLworICAgIHBfdG9rZW4tPnBhcmVudCA9IGRpcjsKKyAgICBwX2UgPSAmKGRpci0+dS5kaXIuZmlyc3QpOworICAgIHdoaWxlICgqcF9lKQorICAgICAgICBwX2UgPSAmKCgqcF9lKS0+bmV4dCk7CisgICAgKnBfZSA9IHBfdG9rZW47CisKKyAgICByZXR1cm4gMDsKKworY21kX2FkZF9lcnJvcjoKKyAgICBiY21vc19mcmVlKCBwX3Rva2VuICk7CisgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKK30KKworCisvKiogRGVzdHJveSB0b2tlbiAoY29tbWFuZCBvciBkaXJlY3RvcnkpCisgKiBccGFyYW1baW5dICAgdG9rZW4gICAgICAgICAgIERpcmVjdG9yeSBvciBjb21tYW5kIHRva2VuLiBOVUxMPXJvb3QKKyAqLwordm9pZCBiY21jbGlfdG9rZW5fZGVzdHJveShiY21jbGlfZW50cnkgKnRva2VuKQoreworICAgIGlmICghdG9rZW4pCisgICAgeworICAgICAgICBpZiAoIV9iY21jbGlfcm9vdF9kaXIpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHRva2VuID0gX2JjbWNsaV9yb290X2RpcjsKKyAgICB9CisgICAgLyogUmVtb3ZlIGZyb20gcGFyZW50J3MgbGlzdCAqLworICAgIGlmICh0b2tlbi0+cGFyZW50KQorICAgIHsKKyAgICAgICAgYmNtY2xpX2VudHJ5ICoqcF9lOworICAgICAgICBwX2UgPSAmKHRva2VuLT5wYXJlbnQtPnUuZGlyLmZpcnN0KTsKKyAgICAgICAgd2hpbGUgKCpwX2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgqcF9lID09IHRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpwX2UgPSB0b2tlbi0+bmV4dDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBfZSA9ICYoKCpwX2UpLT5uZXh0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFJlbW92ZSBhbGwgZGlyZWN0b3J5IGVudHJpZXMgKi8KKyAgICBpZiAodG9rZW4tPnNlbCA9PSBCQ01DTElfRU5UUllfRElSKQorICAgIHsKKyAgICAgICAgYmNtY2xpX2VudHJ5ICplID0gdG9rZW4tPnUuZGlyLmZpcnN0OworICAgICAgICB3aGlsZSAoKGUgPSB0b2tlbi0+dS5kaXIuZmlyc3QpKQorICAgICAgICAgICAgYmNtY2xpX3Rva2VuX2Rlc3Ryb3koZSk7CisgICAgfQorICAgIGVsc2UgaWYgKHRva2VuLT51LmNtZC5leHRyYXMuZnJlZV9wYXJtcykKKyAgICAgICAgICAgIHRva2VuLT51LmNtZC5leHRyYXMuZnJlZV9wYXJtcyh0b2tlbi0+dS5jbWQucGFybXMpOworCisgICAgLyogUmVsZWFzZSB0aGUgdG9rZW4gKi8KKyAgICBiY21vc19mcmVlKHRva2VuKTsKKworICAgIGlmICh0b2tlbiA9PSBfYmNtY2xpX3Jvb3RfZGlyKQorICAgIHsKKyAgICAgICAgX2JjbWNsaV9yb290X2RpciA9IE5VTEw7CisgICAgICAgIGlmIChfYmNtY2xpX3Jvb3Rfc2Vzc2lvbikKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fY2xvc2UoX2JjbWNsaV9yb290X3Nlc3Npb24tPnNlc3Npb24pOworICAgICAgICAgICAgX2JjbWNsaV9yb290X3Nlc3Npb24gPSBOVUxMOworICAgICAgICB9CisgICAgfQorfQorCisvKiogT3BlbiBtb25pdG9yIHNlc3Npb24KKyAqCisgKiBNb25pdG9yIHN1cHBvcnRzIG11bHRpcGxlIHNpbXVsdGFuZW91cyBzZXNzaW9ucyB3aXRoIGRpZmZlcmVudAorICogYWNjZXNzIHJpZ2h0cy4KKyAqIE5vdGUgdGhhdCB0aGVyZSBhbHJlYWR5IGlzIGEgZGVmYXVsdCBzZXNzaW9uIHdpdGggZnVsbCBhZG1pbmlzdHJhdGl2ZSByaWdodHMsCisgKiB0aGF0IHRha2VzIGlucHV0IGZyb20gc3RkaW4gYW5kIG91dHB1dHMgdG8gc3Rkb3V0LgorICogXHBhcmFtW2luXSAgIHBhcm0gICAgICAgIFNlc3Npb24gcGFyYW1ldGVycy4gTXVzdCBub3QgYmUgYWxsb2NhdGVkIG9uIHRoZSBzdGFjay4KKyAqIFxwYXJhbVtvdXRdICBwX3Nlc3Npb24gICBTZXNzaW9uIGhhbmRsZQorICogXHJldHVybgorICogICAgICAwICAgPU9LXG4KKyAqICAgICAgPDAgID1lcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbWNsaV9zZXNzaW9uX29wZW4oY29uc3QgYmNtY2xpX3Nlc3Npb25fcGFybSAqcGFybSwgYmNtY2xpX3Nlc3Npb24gKipwX3Nlc3Npb24pCit7CisgICAgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb247CisgICAgYmNtY2xpX3Nlc3Npb25fZXh0cmFzICptb25fc2Vzc2lvbjsKKyAgICBiY21jbGlfc2Vzc2lvbl9wYXJtIHNlc3Npb25fcGFybXM7CisgICAgaW50IHJjOworCisgICAgYXNzZXJ0KHBfc2Vzc2lvbik7CisgICAgaWYgKCFwX3Nlc3Npb24pCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisKKyAgICBpZiAoIV9iY21jbGlfcm9vdF9kaXIpCisgICAgeworICAgICAgICBfYmNtY2xpX2FsbG9jX3Jvb3QocGFybSk7CisgICAgICAgIGlmICghX2JjbWNsaV9yb290X2RpcikKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKyAgICBpZiAocGFybSkKKyAgICAgICAgc2Vzc2lvbl9wYXJtcyA9ICpwYXJtOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIG1lbXNldCgmc2Vzc2lvbl9wYXJtcywgMCwgc2l6ZW9mKHNlc3Npb25fcGFybXMpKTsKKyAgICAgICAgc2Vzc2lvbl9wYXJtcy5uYW1lID0gInVubmFtZWQiOworICAgIH0KKworICAgIC8qIE9wZW4gY29tbSBzZXNzaW9uICovCisgICAgc2Vzc2lvbl9wYXJtcy5leHRyYV9zaXplID0gc2l6ZW9mKGJjbWNsaV9zZXNzaW9uX2V4dHJhcyk7CisgICAgcmMgPSBiY21jbGlfc2Vzc2lvbl9vcGVuX3VzZXIoJnNlc3Npb25fcGFybXMsICZzZXNzaW9uKTsKKyAgICBpZiAocmMpCisgICAgICAgIHJldHVybiByYzsKKyAgICBtb25fc2Vzc2lvbiA9IF9iY21jbGlfc2Vzc2lvbl9kYXRhKHNlc3Npb24pOworICAgIG1vbl9zZXNzaW9uLT5jdXJkaXIgPSBfYmNtY2xpX3Jvb3RfZGlyOworICAgIG1vbl9zZXNzaW9uLT5zZXNzaW9uID0gc2Vzc2lvbjsKKworICAgICpwX3Nlc3Npb24gPSBzZXNzaW9uOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgQkNNQ0xJX1BBUlNFX1JFVFVSTihyZXQpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgcmMgPSByZXQ7ICAgXAorICAgICAgICBnb3RvIGJjbWNsaV9wYXJzZV9vdXQ7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBQYXJzZSBhIHNpbmdsZSBjb21tYW5kLiBTdG9wIG9uICc7JyBvciBFT0wgKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY21jbGlfcGFyc2VfY29tbWFuZChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBiY21jbGlfc2Vzc2lvbl9leHRyYXMgKm1vbl9zZXNzaW9uPV9iY21jbGlfc2Vzc2lvbl9kYXRhKHNlc3Npb24pOworICAgIGJjbWNsaV9lbnRyeSAgKnBfdG9rZW47CisgICAgYmNtY2xpX25hbWVfdmFsdWUgKnBhaXJzID0gTlVMTDsKKyAgICBpbnQgc3RvcF9wYXJzaW5nID0gMDsKKyAgICBpbnQgbnBhaXJzOworICAgIGludCBpOworICAgIGNoYXIgKmNtZF9saW5lOworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIHNlc3Npb24gPSBtb25fc2Vzc2lvbi0+c2Vzc2lvbjsKKworICAgIC8qIE1ha2UgYSBjb3B5IG9mIGNvbW1hbmQgbGluZSAtIGZvciBsb2dnaW5nICovCisgICAgY21kX2xpbmUgPSBiY21vc19hbGxvYyhzdHJsZW4obW9uX3Nlc3Npb24tPnBfaW5idWYpICsgMSk7CisgICAgaWYgKCFjbWRfbGluZSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgc3RyY3B5KGNtZF9saW5lLCBtb25fc2Vzc2lvbi0+cF9pbmJ1Zik7CisKKyAgICAvKiBTcGxpdCBzdHJpbmcgdG8gbmFtZS92YWx1ZSBwYWlycyAqLworICAgIHJjID0gX2JjbWNsaV9zcGxpdChtb25fc2Vzc2lvbiwgJnBhaXJzLCAmbnBhaXJzKTsKKyAgICBpZiAocmMpCisgICAgeworICAgICAgICBpZiAocmMgPT0gQkNNX0VSUl9OT0VOVCkKKyAgICAgICAgICAgIHJjID0gQkNNX0VSUl9PSzsKKyAgICAgICAgQkNNQ0xJX1BBUlNFX1JFVFVSTihyYyk7CisgICAgfQorCisgICAgLyogSW50ZXJwcmV0IGVtcHR5IHN0cmluZyBhcyAiZGlzcGxheSBkaXJlY3RvcnkiICovCisgICAgaWYgKCAhbnBhaXJzICkKKyAgICB7CisgICAgICAgIF9iY21jbGlfZGlzcGxheV9kaXIobW9uX3Nlc3Npb24sIG1vbl9zZXNzaW9uLT5jdXJkaXIgKTsKKyAgICAgICAgQkNNQ0xJX1BBUlNFX1JFVFVSTihCQ01fRVJSX09LKTsKKyAgICB9CisKKyAgICAvKiBJZGVudGlmeSBwYXJhbWV0ZXJzICovCisgICAgZm9yIChpPTA7IGk8bnBhaXJzICYmICFyYyAmJiAhc3RvcF9wYXJzaW5nOyBpKyspCisgICAgeworICAgICAgICBzd2l0Y2ggKHBhaXJzW2ldLnR5cGUpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBCQ01DTElfVE9LRU5fTkFNRToKKyAgICAgICAgY2FzZSBCQ01DTElfVE9LRU5fVkFMVUU6CisgICAgICAgICAgICAvKiBJZGVudGlmeSBjb21tYW5kLiBUaGUgMXN0IHBhaXIgY2FuJ3QgY29udGFpbiBuYW1lLCBvbmx5IHZhbHVlICovCisgICAgICAgICAgICBpZiAocGFpcnNbaV0ubmFtZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiKipFUlI6ICVzIGlzIHVuZXhwZWN0ZWRcbiIsIHBhaXJzW2ldLm5hbWUpOworICAgICAgICAgICAgICAgIEJDTUNMSV9QQVJTRV9SRVRVUk4oQkNNX0VSUl9QQVJNKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBfdG9rZW4gPSBfYmNtY2xpX3NlYXJjaF90b2tlbihtb25fc2Vzc2lvbi0+Y3VyZGlyLCBwYWlyc1tpXS52YWx1ZSk7CisgICAgICAgICAgICBpZiAocF90b2tlbiA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIqKkVSUjogJXMgaXMgdW5leHBlY3RlZFxuIiwgcGFpcnNbaV0udmFsdWUpOworICAgICAgICAgICAgICAgIEJDTUNMSV9QQVJTRV9SRVRVUk4oQkNNX0VSUl9QQVJNKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIERpcmVjdG9yeSBvciBjb21tYW5kID8gKi8KKyAgICAgICAgICAgIGlmIChwX3Rva2VuLT5zZWwgPT0gQkNNQ0xJX0VOVFJZX0RJUikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtb25fc2Vzc2lvbi0+Y3VyZGlyID0gcF90b2tlbjsKKyAgICAgICAgICAgICAgICBfYmNtY2xpX2Rpc3BsYXlfZGlyKG1vbl9zZXNzaW9uLCBtb25fc2Vzc2lvbi0+Y3VyZGlyICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogRnVuY3Rpb24gdG9rZW4gKi8KKyAgICAgICAgICAgICAgICBtb25fc2Vzc2lvbi0+Y3VyY21kID0gcF90b2tlbjsKKyAgICAgICAgICAgICAgICBpZiAoX2JjbWNsaV9wYXJzZV9wYXJtcyhtb25fc2Vzc2lvbiwgcF90b2tlbiwgJnBhaXJzW2krMV0sIG5wYWlycy1pLTEpIDwgMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9iY21jbGlfaGVscF9lbnRyeShtb25fc2Vzc2lvbiwgcF90b2tlbiwgJnBhaXJzW2krMV0sIG5wYWlycy1pLTEsIEJDTU9TX1RSVUUpOworICAgICAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2JjbWNsaV9sb2dfY21kKGNtZF9saW5lKTsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSBwX3Rva2VuLT51LmNtZC5jbWRfY2Ioc2Vzc2lvbiwgbW9uX3Nlc3Npb24tPmNtZF9wYXJtcywgbnBhaXJzLWktMSApOworICAgICAgICAgICAgICAgICAgICBpZiAocmMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgYnVmZmVyW0JDTUNMSV9NQVhfUVVBTF9OQU1FX0xFTkdUSF07CisgICAgICAgICAgICAgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiTU9OOiAlcz4gZmFpbGVkIHdpdGggZXJyb3IgY29kZSAlcyglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JjbWNsaV9xdWFsaWZpZWRfbmFtZShwX3Rva2VuLCBidWZmZXIsIHNpemVvZihidWZmZXIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3Nfc3RyZXJyb3IocmMpLCByYyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgX2JjbWNsaV9sb2dfcmMocmMpOworICAgICAgICAgICAgICAgICAgICBfYmNtY2xpX2ZyZWVfc2Vzc2lvbl92YWx1ZV9zdGF0dXMobW9uX3Nlc3Npb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdG9wX3BhcnNpbmcgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBCQ01DTElfVE9LRU5fVVA6IC8qIEdvIHRvIHVwcGVyIGRpcmVjdG9yeSAqLworICAgICAgICAgICAgaWYgKG1vbl9zZXNzaW9uLT5jdXJkaXItPnBhcmVudCkKKyAgICAgICAgICAgICAgICBtb25fc2Vzc2lvbi0+Y3VyZGlyID0gbW9uX3Nlc3Npb24tPmN1cmRpci0+cGFyZW50OworICAgICAgICAgICAgX2JjbWNsaV9kaXNwbGF5X2Rpcihtb25fc2Vzc2lvbiwgbW9uX3Nlc3Npb24tPmN1cmRpciApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBCQ01DTElfVE9LRU5fUk9PVDogLyogR28gdG8gdGhlIHJvb3QgZGlyZWN0b3J5ICovCisgICAgICAgICAgICBtb25fc2Vzc2lvbi0+Y3VyZGlyID0gX2JjbWNsaV9yb290X2RpcjsKKyAgICAgICAgICAgIF9iY21jbGlfZGlzcGxheV9kaXIobW9uX3Nlc3Npb24sIG1vbl9zZXNzaW9uLT5jdXJkaXIgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQkNNQ0xJX1RPS0VOX0hFTFA6IC8qIERpc3BsYXkgaGVscCAqLworICAgICAgICAgICAgaWYgKGkgPCBucGFpcnMtMSAmJgorICAgICAgICAgICAgICAgICgocF90b2tlbiA9IF9iY21jbGlfc2VhcmNoX3Rva2VuKCBtb25fc2Vzc2lvbi0+Y3VyZGlyLCBwYWlyc1tpKzFdLnZhbHVlKSkgIT0gTlVMTCApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9iY21jbGlfaGVscF9lbnRyeShtb25fc2Vzc2lvbiwgcF90b2tlbiwgJnBhaXJzW2krMl0sIG5wYWlycy1pLTIsIEJDTU9TX0ZBTFNFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfYmNtY2xpX2hlbHBfZGlyKG1vbl9zZXNzaW9uLCBtb25fc2Vzc2lvbi0+Y3VyZGlyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0b3BfcGFyc2luZyA9IDE7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc3RvcF9wYXJzaW5nID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCitiY21jbGlfcGFyc2Vfb3V0OgorICAgIGlmIChwYWlycykKKyAgICAgICAgYmNtb3NfZnJlZShwYWlycyk7CisgICAgaWYgKGNtZF9saW5lKQorICAgICAgICBiY21vc19mcmVlKGNtZF9saW5lKTsKKyAgICByZXR1cm4gcmM7CisKK30KKworLyoqIENvbnRleHQgZXh0ZW5zaW9uICovCitiY21vc19lcnJubyBiY21jbGlfZXh0ZW5kKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjaGFyICppbnB1dF9zdHIsIGNoYXIgKmluc2VydF9zdHIsIHVpbnQzMl90IGluc2VydF9zaXplKQoreworICAgIGJjbWNsaV9zZXNzaW9uX2V4dHJhcyAqbW9uX3Nlc3Npb249X2JjbWNsaV9zZXNzaW9uX2RhdGEoc2Vzc2lvbik7CisgICAgYmNtY2xpX2VudHJ5ICAqcF90b2tlbjsKKyAgICBiY21jbGlfbmFtZV92YWx1ZSAqcGFpcnM7CisgICAgYmNtb3NfYm9vbCBsYXN0X2lzX3NwYWNlOworICAgIGludCBucGFpcnM7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworCisgICAgaWYgKCFtb25fc2Vzc2lvbiB8fCAhbW9uX3Nlc3Npb24tPmN1cmRpciB8fCAhaW5wdXRfc3RyKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworCisgICAgaW5zZXJ0X3N0clswXSA9IDA7CisgICAgbW9uX3Nlc3Npb24tPnBfaW5idWYgPSBpbnB1dF9zdHI7CisKKyAgICBsYXN0X2lzX3NwYWNlID0gc3RybGVuKGlucHV0X3N0cikgJiYgKGlucHV0X3N0cltzdHJsZW4oaW5wdXRfc3RyKSAtIDFdID09ICcgJyk7CisKKyAgICAvKiBTcGxpdCBzdHJpbmcgdG8gbmFtZS92YWx1ZSBwYWlycyAqLworICAgIHJjID0gX2JjbWNsaV9zcGxpdChtb25fc2Vzc2lvbiwgJnBhaXJzLCAmbnBhaXJzKTsKKyAgICBpZiAocmMpCisgICAgICAgIHJldHVybiByYzsKKworICAgIC8qIGVtcHR5IGxpc3QgLSBkaXNwbGF5IGxpc3Qgb2YgY29tbWFuZHMgKi8KKyAgICBpZiAoICFucGFpcnMgKQorICAgIHsKKyAgICAgICAgX2JjbWNsaV9kaXNwbGF5X2Rpcihtb25fc2Vzc2lvbiwgbW9uX3Nlc3Npb24tPmN1cmRpciApOworICAgICAgICBCQ01DTElfUEFSU0VfUkVUVVJOKDApOworICAgIH0KKworICAgIC8qIElkZW50aWZ5IHBhcmFtZXRlcnMgKi8KKyAgICBzd2l0Y2ggKHBhaXJzWzBdLnR5cGUpCisgICAgeworICAgIGNhc2UgQkNNQ0xJX1RPS0VOX05BTUU6CisgICAgY2FzZSBCQ01DTElfVE9LRU5fVkFMVUU6CisgICAgICAgIC8qIElkZW50aWZ5IGNvbW1hbmQuIFRoZSAxc3QgcGFpciBjYW4ndCBjb250YWluIG5hbWUsIG9ubHkgdmFsdWUgKi8KKyAgICAgICAgaWYgKHBhaXJzWzBdLm5hbWUgfHwKKyAgICAgICAgICAgICEocF90b2tlbiA9IF9iY21jbGlfc2VhcmNoX3Rva2VuKG1vbl9zZXNzaW9uLT5jdXJkaXIsIHBhaXJzWzBdLnZhbHVlKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9iY21jbGlfZGlzcGxheV9kaXIobW9uX3Nlc3Npb24sIG1vbl9zZXNzaW9uLT5jdXJkaXIgKTsKKyAgICAgICAgICAgIEJDTUNMSV9QQVJTRV9SRVRVUk4oQkNNX0VSUl9QQVJNKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIERpcmVjdG9yeSBvciBjb21tYW5kID8gKi8KKyAgICAgICAgaWYgKHBfdG9rZW4tPnNlbCAhPSBCQ01DTElfRU5UUllfQ01EKQorICAgICAgICAgICAgQkNNQ0xJX1BBUlNFX1JFVFVSTihCQ01fRVJSX09LKTsKKworICAgICAgICAvKiBGdW5jdGlvbiB0b2tlbiAqLworICAgICAgICBtb25fc2Vzc2lvbi0+Y3VyY21kID0gcF90b2tlbjsKKyAgICAgICAgcmMgPSBfYmNtY2xpX2V4dGVuZF9wYXJtcyhtb25fc2Vzc2lvbiwgJnBhaXJzWzFdLCBucGFpcnMtMSwgbGFzdF9pc19zcGFjZSwgaW5zZXJ0X3N0ciwgaW5zZXJ0X3NpemUpOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworYmNtY2xpX3BhcnNlX291dDoKKyAgICBiY21vc19mcmVlKHBhaXJzKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKiBQYXJzZSBhbmQgZXhlY3V0ZSBpbnB1dCBzdHJpbmcuCisgKiBpbnB1dF9zdHJpbmcgY2FuIGNvbnRhaW4gbXVsdGlwbGUgY29tbWFuZHMgZGVsaW1pdGVkIGJ5ICc7JworICoKKyAqIFxwYXJhbVtpbl0gICBzZXNzaW9uICAgICAgICAgU2Vzc2lvbiBoYW5kbGUKKyAqIFxwYXJhbVtpbl0gICBpbnB1dF9zdHJpbmcgICAgU3RyaW5nIHRvIGJlIHBhcnNlZC4gTWF5IGNvbnNpc3Qgb2YgbXVsdGlwbGUgJzsnLWRlbGltaXRlZCBjb21tYW5kcworICogXHJldHVybgorICogICAgICA9MCAgLSBPSyBcbgorICogICAgICBCQ01fRVJSX1BBUk0gLSBwYXJzaW5nIGVycm9yXG4KKyAqICAgICAgb3RoZXIgLSByZXR1cm4gY29kZSAtIGFzIHJldHVybmVkIGZyb20gY29tbWFuZCBoYW5kbGVyLgorICogICAgICAgICAgICBJdCBpcyByZWNvbW1lbmRlZCB0byByZXR1cm4gLUVJTlRSIHRvIGludGVycnVwdCBtb25pdG9yIGxvb3AuCisgKi8KK2JjbW9zX2Vycm5vIGJjbWNsaV9wYXJzZShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY2hhciogaW5wdXRfc3RyaW5nKQoreworICAgIGJjbWNsaV9zZXNzaW9uX2V4dHJhcyAqbW9uX3Nlc3Npb249X2JjbWNsaV9zZXNzaW9uX2RhdGEoc2Vzc2lvbik7CisgICAgdWludDMyX3QgaW5wdXRfbGVuOworICAgIGludCByYyA9IDA7CisKKyAgICBpZiAoIW1vbl9zZXNzaW9uIHx8ICFtb25fc2Vzc2lvbi0+Y3VyZGlyIHx8ICFpbnB1dF9zdHJpbmcpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgaW5wdXRfbGVuID0gc3RybGVuKGlucHV0X3N0cmluZyk7CisgICAgaWYgKCFpbnB1dF9sZW4pCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogY3V0IENSLCBMRiBpZiBhbnkgKi8KKyAgICB3aGlsZSAoaW5wdXRfbGVuICYmIChpbnB1dF9zdHJpbmdbaW5wdXRfbGVuLTFdPT0nXG4nIHx8IGlucHV0X3N0cmluZ1tpbnB1dF9sZW4tMV09PSdccicpKQorICAgICAgICBpbnB1dF9zdHJpbmdbLS1pbnB1dF9sZW5dPTA7CisKKyAgICBtb25fc2Vzc2lvbi0+cF9pbmJ1ZiA9IGlucHV0X3N0cmluZzsKKyAgICBtb25fc2Vzc2lvbi0+c3RvcF9tb25pdG9yID0gMDsKKworICAgIGRvIHsKKyAgICAgICAgcmMgPSBiY21jbGlfcGFyc2VfY29tbWFuZChzZXNzaW9uKTsKKyAgICB9IHdoaWxlIChtb25fc2Vzc2lvbi0+cF9pbmJ1ZiAmJiBtb25fc2Vzc2lvbi0+cF9pbmJ1ZlswXSAmJiAhbW9uX3Nlc3Npb24tPnN0b3BfbW9uaXRvciAmJiAhcmMpOworCisgICAgcmV0dXJuIHJjOworfQorCisvKiogUmVhZCBpbnB1dCBhbmQgcGFyc2UgaXRlcmF0aXZlbHkgdW50aWwgRU9GIG9yIGJjbWNsaV9pc19zdG9wcGVkKCkKKyAqCisgKiBccGFyYW1baW5dICAgc2Vzc2lvbiAgICAgICAgIFNlc3Npb24gaGFuZGxlCisgKiBccmV0dXJuCisgKiAgICAgID0wICAtIE9LIFxuCisgKi8KK2JjbW9zX2Vycm5vIGJjbWNsaV9kcml2ZXIoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX3Nlc3Npb25fZXh0cmFzICptb25fc2Vzc2lvbj1fYmNtY2xpX3Nlc3Npb25fZGF0YShzZXNzaW9uKTsKKworICAgIHNlc3Npb24gPSBtb25fc2Vzc2lvbi0+c2Vzc2lvbjsKKyAgICBtb25fc2Vzc2lvbi0+c3RvcF9tb25pdG9yID0gMDsKKyAgICB3aGlsZSAoIWJjbWNsaV9pc19zdG9wcGVkKHNlc3Npb24pICYmCisgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fZ2V0cyhzZXNzaW9uLCBtb25fc2Vzc2lvbi0+aW5idWYsIHNpemVvZihtb25fc2Vzc2lvbi0+aW5idWYpLTEpKQorICAgIHsKKyAgICAgICAgLyogU2Vzc2lvbiBjb3VsZCd2ZSBiZWVuIHN0b3BwZWQgd2hpbGUgaW4gImdldHMiLiBDaGVjayBhZ2FpbiBhbmQgcHJvY2VlZCBpZiBhY3RpdmUgKi8KKyAgICAgICAgaWYgKCFiY21jbGlfaXNfc3RvcHBlZChzZXNzaW9uKSkKKyAgICAgICAgICAgIGJjbWNsaV9wYXJzZShzZXNzaW9uLCBtb25fc2Vzc2lvbi0+aW5idWYpOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisKKy8qIFN0b3AgbW9uaXRvciBkcml2ZXIgKi8KK3ZvaWQgYmNtY2xpX3N0b3AoIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uICkKK3sKKyAgICBiY21jbGlfc2Vzc2lvbl9leHRyYXMgKm1vbl9zZXNzaW9uPV9iY21jbGlfc2Vzc2lvbl9kYXRhKHNlc3Npb24pOworICAgIGFzc2VydChtb25fc2Vzc2lvbik7CisgICAgbW9uX3Nlc3Npb24tPnN0b3BfbW9uaXRvciA9IDE7Cit9CisKKy8qKiBSZXR1cm5zIDEgaWYgbW9uaXRvciBzZXNzaW9uIGlzIHN0b3BwZWQKKyAqIFxwYXJhbVtpbl0gICBzZXNzaW9uICAgICAgICAgU2Vzc2lvbiBoYW5kbGUKKyAqIFxyZXR1cm5zIDEgaWYgbW9uaXRvciBzZXNzaW9uIHN0b3BwZWQgYnkgYmNtY2xpX3N0b3AoKVxuCisgKiAwIG90aGVyd2lzZQorICovCitiY21vc19ib29sIGJjbWNsaV9pc19zdG9wcGVkKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGJjbWNsaV9zZXNzaW9uX2V4dHJhcyAqbW9uX3Nlc3Npb249X2JjbWNsaV9zZXNzaW9uX2RhdGEoc2Vzc2lvbik7CisgICAgcmV0dXJuIG1vbl9zZXNzaW9uLT5zdG9wX21vbml0b3I7Cit9CisKKworLyoqIEdldCBwYXJhbWV0ZXIgbnVtYmVyIGdpdmVuIGl0cyBuYW1lLgorICogVGhlIGZ1bmN0aW9uIGlzIGludGVuZGVkIGZvciB1c2UgYnkgY29tbWFuZCBoYW5kbGVycworICogXHBhcmFtW2luXSAgICAgICBzZXNzaW9uICAgICAgICAgU2Vzc2lvbiBoYW5kbGUKKyAqIFxwYXJhbVtpbixvdXRdICAgcGFybV9uYW1lICAgICAgIFBhcmFtZXRlciBuYW1lCisgKiBccmV0dXJuCisgKiAgPj0wIC0gcGFyYW1ldGVyIG51bWJlclxuCisgKiAgPDAgIC0gcGFyYW1ldGVyIHdpdGggdGhpcyBuYW1lIGRvZXNuJ3QgZXhpc3QKKyAqLworaW50IGJjbWNsaV9wYXJtX251bWJlcihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqcGFybV9uYW1lKQoreworICAgIGJjbWNsaV9zZXNzaW9uX2V4dHJhcyAqbW9uX3Nlc3Npb249X2JjbWNsaV9zZXNzaW9uX2RhdGEoc2Vzc2lvbik7CisgICAgaW50IGk7CisgICAgaWYgKCFwYXJtX25hbWUgfHwgIW1vbl9zZXNzaW9uIHx8ICFtb25fc2Vzc2lvbi0+Y3VyY21kKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIGZvcihpPTA7CisgICAgICAgIG1vbl9zZXNzaW9uLT5jbWRfcGFybXNbaV0ubmFtZSAmJgorICAgICAgICAgICAgX2JjbWNsaV9zdHJpY21wKCBwYXJtX25hbWUsIG1vbl9zZXNzaW9uLT5jbWRfcGFybXNbaV0ubmFtZSwgLTEpOworICAgICAgICBpKyspCisgICAgICAgIDsKKyAgICBpZiAoIW1vbl9zZXNzaW9uLT5jbWRfcGFybXNbaV0ubmFtZSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICByZXR1cm4gaTsKK30KKworCisvKiogR2V0IHBhcmFtZXRlciBieSBuYW1lCisgKiBUaGUgZnVuY3Rpb24gaXMgaW50ZW5kZWQgZm9yIHVzZSBieSBjb21tYW5kIGhhbmRsZXJzCisgKiBccGFyYW1baW5dICAgICAgIHNlc3Npb24gICAgICAgICBTZXNzaW9uIGhhbmRsZQorICogXHBhcmFtW2luXSAgICAgICBwYXJtX25hbWUgICAgICAgUGFyYW1ldGVyIG5hbWUKKyAqIFxyZXR1cm4KKyAqIHBhcmFtZXRlciBwb2ludGVyIG9yIE5VTEwgaWYgbm90IGZvdW5kCisgKi8KK2JjbWNsaV9jbWRfcGFybSAqYmNtY2xpX3Bhcm1fZ2V0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBjaGFyICpwYXJtX25hbWUpCit7CisgICAgYmNtY2xpX3Nlc3Npb25fZXh0cmFzICptb25fc2Vzc2lvbj1fYmNtY2xpX3Nlc3Npb25fZGF0YShzZXNzaW9uKTsKKyAgICBpbnQgbnBhcm0gPSBiY21jbGlfcGFybV9udW1iZXIoc2Vzc2lvbiwgcGFybV9uYW1lKTsKKyAgICBpZiAobnBhcm0gPCAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAmbW9uX3Nlc3Npb24tPmNtZF9wYXJtc1tucGFybV07Cit9CisKKworLyoqIENoZWNrIGlmIHBhcmFtZXRlciBpcyBzZXQKKyAqIFxwYXJhbVtpbl0gICAgICAgc2Vzc2lvbiAgICAgICAgIFNlc3Npb24gaGFuZGxlCisgKiBccGFyYW1baW5dICAgICAgIHBhcm1fbnVtYmVyICAgICBQYXJhbWV0ZXIgbnVtYmVyCisgKiBccmV0dXJuCisgKiAgMSBpZiBwYXJhbWV0ZXIgaXMgc2V0XG4KKyAqICAwIGlmIHBhcmFtZXRlciBpcyBub3Qgc2V0IG9yIHBhcm1fbnVtYmVyIGlzIGludmFsaWQKKyAqLworYmNtb3NfZXJybm8gYmNtY2xpX3Bhcm1fY2hlY2soYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGludCBwYXJtX251bWJlcikKK3sKKyAgICBiY21jbGlfc2Vzc2lvbl9leHRyYXMgKm1vbl9zZXNzaW9uPV9iY21jbGlfc2Vzc2lvbl9kYXRhKHNlc3Npb24pOworCisgICAgaWYgKHBhcm1fbnVtYmVyIDwgMCB8fCAhbW9uX3Nlc3Npb24gfHwgIW1vbl9zZXNzaW9uLT5jdXJjbWQpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgaWYgKHBhcm1fbnVtYmVyID49IG1vbl9zZXNzaW9uLT5udW1fcGFybXMpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgaWYgKCEobW9uX3Nlc3Npb24tPmNtZF9wYXJtc1twYXJtX251bWJlcl0uZmxhZ3MgJiBCQ01DTElfUEFSTV9GTEFHX0FTU0lHTkVEKSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9FTlQ7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKworLyoqIEdldCBlbnVtJ3Mgc3RyaW5nIHZhbHVlIGdpdmVuIGl0cyBpbnRlcm5hbCB2YWx1ZQorICogXHBhcmFtW2luXSAgICAgICBzZXNzaW9uICAgICAgICAgU2Vzc2lvbiBoYW5kbGUKKyAqIFxwYXJhbVtpbl0gICAgICAgcGFybV9udW1iZXIgICAgIFBhcmFtZXRlciBudW1iZXIKKyAqIFxwYXJhbVtpbl0gICAgICAgdmFsdWUgICAgICAgICAgIEludGVybmFsIHZhbHVlCisgKiBccmV0dXJuCisgKiAgICAgIGVudW0gc3RyaW5nIHZhbHVlIG9yIE5VTEwgaWYgcGFyYW1ldGVyIGlzIG5vdCBlbnVtIG9yCisgKiAgICAgIGludGVybmFsIHZhbHVlIGlzIGludmFsaWQKKyAqLworY29uc3QgY2hhciAqYmNtY2xpX2VudW1fcGFybV9zdHJpbmd2YWwoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGludCBwYXJtX251bWJlciwgbG9uZyB2YWx1ZSkKK3sKKyAgICBiY21jbGlfc2Vzc2lvbl9leHRyYXMgKm1vbl9zZXNzaW9uPV9iY21jbGlfc2Vzc2lvbl9kYXRhKHNlc3Npb24pOworICAgIGludCBpOworICAgIGJjbWNsaV9lbnVtX3ZhbCAqdmFsdWVzOworICAgIGlmIChwYXJtX251bWJlciA8IDAgfHwgIW1vbl9zZXNzaW9uIHx8ICFtb25fc2Vzc2lvbi0+Y3VyY21kKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3IoaT0wOyBpPHBhcm1fbnVtYmVyICYmIG1vbl9zZXNzaW9uLT5jbWRfcGFybXNbaV0ubmFtZTsgaSsrKQorICAgICAgICA7CisgICAgaWYgKGkgPCBwYXJtX251bWJlcikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKG1vbl9zZXNzaW9uLT5jbWRfcGFybXNbcGFybV9udW1iZXJdLnR5cGUgIT0gQkNNQ0xJX1BBUk1fRU5VTSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdmFsdWVzID0gbW9uX3Nlc3Npb24tPmNtZF9wYXJtc1twYXJtX251bWJlcl0uZW51bV90YWJsZTsKKyAgICByZXR1cm4gYmNtY2xpX2VudW1fc3RyaW5ndmFsKHZhbHVlcywgdmFsdWUpOworfQorCisKKy8qIEdldCBjdXJyZW50IGRpcmVjdG9yeSBoYW5kbGUgKi8KK2JjbWNsaV9lbnRyeSAqYmNtY2xpX2Rpcl9nZXQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgYmNtY2xpX3Nlc3Npb25fZXh0cmFzICptb25fc2Vzc2lvbj1fYmNtY2xpX3Nlc3Npb25fZGF0YShzZXNzaW9uKTsKKyAgICBpZiAoIW1vbl9zZXNzaW9uKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gbW9uX3Nlc3Npb24tPmN1cmRpcjsKK30KKworLyogU2V0IGN1cnJlbnQgZGlyZWN0b3J5ICovCitiY21vc19lcnJubyBiY21jbGlfZGlyX3NldChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYmNtY2xpX2VudHJ5ICpkaXIpCit7CisgICAgYmNtY2xpX3Nlc3Npb25fZXh0cmFzICptb25fc2Vzc2lvbj1fYmNtY2xpX3Nlc3Npb25fZGF0YShzZXNzaW9uKTsKKyAgICBhc3NlcnQobW9uX3Nlc3Npb24pOworICAgIGlmICghbW9uX3Nlc3Npb24pCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgLyogQ2hlY2sgYWNjZXNzIHJpZ2h0cyAqLworICAgIGlmICghZGlyKQorICAgICAgICBkaXIgPSBfYmNtY2xpX3Jvb3RfZGlyOworICAgIGlmIChkaXItPmFjY2Vzc19yaWdodCA+IGJjbWNsaV9zZXNzaW9uX2FjY2Vzc19yaWdodChtb25fc2Vzc2lvbi0+c2Vzc2lvbikpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BFUk07CisgICAgbW9uX3Nlc3Npb24tPmN1cmRpciA9IGRpcjsKKyAgICByZXR1cm4gMDsKK30KKworLyoqIEdldCB0b2tlbiBuYW1lCisgKiBccGFyYW1baW5dICAgdG9rZW4gICAgICAgICAgIERpcmVjdG9yeSBvciBjb21tYW5kIHRva2VuCisgKiBccmV0dXJuICAgICAgZGlyZWN0b3J5IHRva2VuIG5hbWUKKyAqLworY29uc3QgY2hhciAqYmNtY2xpX3Rva2VuX25hbWUoYmNtY2xpX2VudHJ5ICp0b2tlbikKK3sKKyAgICBpZiAoIXRva2VuKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gdG9rZW4tPm5hbWU7Cit9CisKK2JjbWNsaV9jbWRfcGFybSAqYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKiBjbWRfcGFybTsKKworICAgIGlmICggIXNlc3Npb24gfHwgIW5hbWUgfHwgKm5hbWU9PSdcMCcpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgY21kX3Bhcm0gPSBfYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShfYmNtY2xpX3Nlc3Npb25fZGF0YShzZXNzaW9uKSwgbmFtZSk7CisgICAgaWYoY21kX3Bhcm0gJiYgKGNtZF9wYXJtLT5mbGFncyAmIEJDTUNMSV9QQVJNX0ZMQUdfQVNTSUdORUQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNtZF9wYXJtOworICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCisvKiBSZXR1cm4gVFJVRSBpZiBwYXJhbWV0ZXIgdmFsdWUgaXMgc2V0ICovCitiY21vc19ib29sIGJjbWNsaV9wYXJtX3ZhbHVlX2lzX3NldChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYmNtY2xpX2NtZF9wYXJtICpwYXJtLCB1aW50MzJfdCB2YWx1ZV9pbmRleCkKK3sKKyAgICBiY21jbGlfc2Vzc2lvbl9leHRyYXMgKm1vbl9zZXNzaW9uPV9iY21jbGlfc2Vzc2lvbl9kYXRhKHNlc3Npb24pOworICAgIHVpbnQzMl90IHBhcm1faW5kZXggPSBwYXJtIC0gbW9uX3Nlc3Npb24tPmNtZF9wYXJtczsKKworICAgIGlmICghbW9uX3Nlc3Npb24pCisgICAgeworICAgICAgICBiY21jbGlfcHJpbnQoTlVMTCwgIk1PTj4gU2Vzc2lvbiAlcCBpcyBpbnZhbGlkXG4iLCBzZXNzaW9uKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHBhcm1faW5kZXggPSBwYXJtIC0gbW9uX3Nlc3Npb24tPmNtZF9wYXJtczsKKyAgICBpZiAocGFybV9pbmRleCA+PSBCQ01DTElfTUFYX1BBUk1TKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICJNT04+IFBhcmFtZXRlciAlcCBpcyBpbnZhbGlkXG4iLCBwYXJtKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghcGFybS0+YXJyYXlfc2l6ZSkKKyAgICAgICAgcmV0dXJuIG1vbl9zZXNzaW9uLT52YWx1ZV9zdGF0dXNbcGFybV9pbmRleF0udmFsdWVfc2V0OworCisgICAgaWYgKHZhbHVlX2luZGV4ID49IHBhcm0tPmFycmF5X3NpemUpCisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKworICAgIHJldHVybiBtb25fc2Vzc2lvbi0+dmFsdWVfc3RhdHVzW3Bhcm1faW5kZXhdLnZhbHVlc19zZXRbdmFsdWVfaW5kZXhdOworfQorCitiY21jbGlfY21kX3Bhcm0gKmJjbWNsaV9maW5kX3Bhcm1fYnlfcHJlZml4KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbWRfcGFybTsKKworICAgIGlmIChzZXNzaW9uID09IE5VTEwgfHwgcHJlZml4ID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBjbWRfcGFybSA9IF9iY21jbGlfc2Vzc2lvbl9kYXRhKHNlc3Npb24pLT5jbWRfcGFybXM7CisgICAgd2hpbGUgKGNtZF9wYXJtLT5uYW1lICE9IE5VTEwpCisgICAgeworICAgICAgICBpZiAoKF9iY21jbGlfc3RyaWNtcChwcmVmaXgsIGNtZF9wYXJtLT5uYW1lLCBzdHJsZW4ocHJlZml4KSkgPT0gMCkgJiYKKyAgICAgICAgICAgICgoY21kX3Bhcm0tPmZsYWdzICYgQkNNQ0xJX1BBUk1fRkxBR19BU1NJR05FRCkgIT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjbWRfcGFybTsKKyAgICAgICAgfQorICAgICAgICArK2NtZF9wYXJtOworICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCisvKiogUHJpbnQgQ0xJIHBhcmFtZXRlcgorICogXHBhcmFtW2luXSAgICAgICBzZXNzaW9uICAgICAgICAgU2Vzc2lvbiBoYW5kbGUKKyAqIFxwYXJhbVtpbl0gICAgICAgcGFybSAgICAgICAgICAgIFBhcmFtZXRlcgorICovCit2b2lkIGJjbWNsaV9wYXJtX3ByaW50KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gKnBhcm0pCit7CisgICAgY2hhciBidWZbQkNNQ0xJX01BWF9QQVJNX1ZBTF9MRU5dID0gIiI7CisgICAgaWYgKHBhcm0tPnR5cGUgIT0gQkNNQ0xJX1BBUk1fQlVGRkVSKQorICAgIHsKKyAgICAgICAgcGFybS0+Zm9ybWF0X2NiKHBhcm0sIHBhcm0tPnZhbHVlLCBidWYsIHNpemVvZihidWYpKTsKKyAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIlc1xuIiwgYnVmKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKHBhcm0tPnZhbHVlLmJ1ZmZlci5sZW4gPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICItXG4iKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiXG4iKTsKKyAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX2hleGR1bXAoc2Vzc2lvbiwgcGFybS0+dmFsdWUuYnVmZmVyLnN0YXJ0LCAwLAorICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfZ2V0X3VzZWQoJnBhcm0tPnZhbHVlLmJ1ZmZlciksIE5VTEwpOworICAgICAgICB9CisgICAgfQorfQorCisvKiogRW5hYmxlIC8gZGlzYWJsZSBDTEkgY29tbWFuZCBsb2dnaW5nCisgKiBccGFyYW1baW5dICAgbW9kZSAgICBMb2dnaW5nIGZsYWdzCisgKiBccGFyYW1baW5dICAgbG9nICAgICBMb2cgc2Vzc2lvbi4gTXVzdCBiZSBzZXQgaWYgbW9kZSAhPSBCQ01DTElfQ01EX0xPR19OT05FCisgKiBccmV0dXJuIDA9T0sgb3IgZXJyb3IgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtY2xpX2xvZ19zZXQoYmNtY2xpX2xvZ19tb2RlIG1vZGUsIGJjbWNsaV9zZXNzaW9uICpsb2cpCit7CisgICAgaWYgKG1vZGUgIT0gQkNNQ0xJX0xPR19OT05FICYmIGxvZyA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJsb2cgc2Vzc2lvbiBtdXN0IGJlIHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorICAgIGlmIChtb2RlID09IEJDTUNMSV9MT0dfTk9ORSkKKyAgICB7CisgICAgICAgIF9iY21jbGlfbG9nX3Nlc3Npb24gPSBOVUxMOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBfYmNtY2xpX2xvZ19zZXNzaW9uID0gbG9nOworICAgIH0KKyAgICBfYmNtY2xpX2xvZ19tb2RlID0gbW9kZTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqIFdyaXRlIHN0cmluZyB0byBDTEkgbG9nLgorICogVGhlIGZ1bmN0aW9uIGlzIGlnbm9yZWQgaWYgQ0xJIGxvZ2dpbmcgaXMgbm90IGVuYWJsZWQgdXNpbmcgYmNtY2xpX2xvZ19zZXQoKQorICogXHBhcmFtW2luXSAgIGZvcm1hdCAgcHJpbnRmLWxpa2UgZm9ybWF0IGZvbGxvd2VkIGJ5IGFyZ3VtZW50cworICovCit2b2lkIGJjbWNsaV9sb2coY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgICAgdmFfbGlzdCBhcDsKKyAgICBpZiAoIV9iY21jbGlfbG9nX3Nlc3Npb24pCisgICAgICAgIHJldHVybjsKKyAgICB2YV9zdGFydChhcCwgZm9ybWF0KTsKKyAgICBiY21jbGlfc2Vzc2lvbl92cHJpbnQoX2JjbWNsaV9sb2dfc2Vzc2lvbiwgZm9ybWF0LCBhcCk7CisgICAgdmFfZW5kKGFwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEludGVybmFsIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBfYmNtY2xpX2xvZ19jbWQoY29uc3QgY2hhciAqY21kKQoreworICAgIHN3aXRjaCAoX2JjbWNsaV9sb2dfbW9kZSkKKyAgICB7CisgICAgY2FzZSBCQ01DTElfTE9HX0NMSToKKyAgICAgICAgYmNtY2xpX2xvZygiJXNcbiIsIGNtZCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkNNQ0xJX0xPR19DX0NPTU1FTlQ6CisgICAgICAgIGJjbWNsaV9sb2coIi8qICVzICovXG4iLCBjbWQpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIF9iY21jbGlfbG9nX3JjKGJjbW9zX2Vycm5vIHJjKQoreworICAgIHN3aXRjaCAoX2JjbWNsaV9sb2dfbW9kZSkKKyAgICB7CisgICAgY2FzZSBCQ01DTElfTE9HX0NMSToKKyAgICAgICAgYmNtY2xpX2xvZygiIyBDTEkgY29tbWFuZCBjb21wbGV0ZWQ6ICVzICglZClcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSwgcmMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTUNMSV9MT0dfQ19DT01NRU5UOgorICAgICAgICBiY21jbGlfbG9nKCIvKiBDTEkgY29tbWFuZCBjb21wbGV0ZWQ6ICVzICglZCkgKi9cbiIsIGJjbW9zX3N0cmVycm9yKHJjKSwgcmMpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKK30KKworc3RhdGljIGJjbWNsaV9zZXNzaW9uICpfYmNtY2xpX2hlbHBfc2Vzc2lvbl9vcGVuKGJjbWNsaV9zZXNzaW9uICptYWluX3Nlc3Npb24pCit7CisgICAgYmNtb2x0X3N0cmluZyAqaGVscF9zY3JhdGNoOworICAgIGJjbWNsaV9zZXNzaW9uICpoZWxwX3Nlc3Npb247CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgYmNtb2x0X3N0cmluZ19jcmVhdGUoJmhlbHBfc2NyYXRjaCwgQkNNQ0xJX0hFTFBfQlVGRkVSX1NJWkUpOworICAgIGVyciA9IGJjbWNsaV9zZXNzaW9uX29wZW5fc3RyaW5nKCZoZWxwX3Nlc3Npb24sIGhlbHBfc2NyYXRjaCk7CisgICAgaWYgKGVycikKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KG1haW5fc2Vzc2lvbiwgIkNMSTogY2FuJ3QgY3JlYXRlIGhlbHAgc2Vzc2lvbi4gRXJyb3IgJXNcbiIsIGJjbW9zX3N0cmVycm9yKGVycikpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gaGVscF9zZXNzaW9uOworfQorCitzdGF0aWMgdm9pZCBfYmNtY2xpX2hlbHBfc2Vzc2lvbl9wcmludF9hbmRfY2xvc2UoYmNtY2xpX3Nlc3Npb24gKm1haW5fc2Vzc2lvbiwgYmNtY2xpX3Nlc3Npb24gKmhlbHBfc2Vzc2lvbikKK3sKKyAgICBiY21vbHRfc3RyaW5nICpzdHIgPSBiY21jbGlfc2Vzc2lvbl91c2VyX3ByaXYoaGVscF9zZXNzaW9uKTsKKworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KG1haW5fc2Vzc2lvbiwgIiVzIiwgYmNtb2x0X3N0cmluZ19nZXQoc3RyKSk7CisgICAgYmNtY2xpX3Nlc3Npb25fY2xvc2UoaGVscF9zZXNzaW9uKTsKKyAgICBiY21vbHRfc3RyaW5nX2Rlc3Ryb3koc3RyKTsKK30KKworI2lmZGVmIENPTkZJR19MSU5FTk9JU0UKK3N0YXRpYyBiY21vc19lcnJubyBfYmNtY2xpX2xpbmVfZWRpdF9jbWQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgaWYgKG5fcGFybXMgPiAwKQorICAgIHsKKyAgICAgICAgaWYgKChwYXJtWzBdLmZsYWdzICYgQkNNQ0xJX1BBUk1fRkxBR19BU1NJR05FRCkpCisgICAgICAgICAgICBsaW5lbm9pc2VTZXREdW1iVGVybWluYWwoc2Vzc2lvbi0+bG5fc2Vzc2lvbiwgISBwYXJtWzBdLnZhbHVlLm51bWJlcik7CisgICAgICAgIGlmICgocGFybVsxXS5mbGFncyAmIEJDTUNMSV9QQVJNX0ZMQUdfQVNTSUdORUQpKQorICAgICAgICAgICAgbGluZW5vaXNlU2V0TXVsdGlMaW5lKHNlc3Npb24tPmxuX3Nlc3Npb24sIHBhcm1bMV0udmFsdWUubnVtYmVyKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaW50IGR1bWIgPSBsaW5lbm9pc2VHZXREdW1iVGVybWluYWwoc2Vzc2lvbi0+bG5fc2Vzc2lvbik7CisgICAgICAgIGludCBtdWx0aWxpbmUgPSBsaW5lbm9pc2VHZXRNdWx0aUxpbmUoc2Vzc2lvbi0+bG5fc2Vzc2lvbik7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJMaW5lIGVkaXRpbmc6ICVzICBNdWx0aWxpbmU6ICVzXG4iLAorICAgICAgICAgICAgZHVtYiA/ICJvZmYiIDogIm9uIiwgbXVsdGlsaW5lID8gIm9uIiA6ICJvZmYiKTsKKyAgICB9CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisjZW5kaWYKKworLyogQWxsb2NhdGUgcm9vdCBkaXJlY3RvcnkgYW5kIGRlZmF1bHQgc2Vzc2lvbiAqLworc3RhdGljIHZvaWQgX2JjbWNsaV9hbGxvY19yb290KGNvbnN0IGJjbWNsaV9zZXNzaW9uX3Bhcm0gKmZpcnN0X3Nlc3Npb25fcGFybSkKK3sKKyAgICBiY21jbGlfc2Vzc2lvbl9wYXJtIHNlc3Npb25fcGFybXM7CisgICAgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb247CisgICAgaW50IHJjOworCisgICAgLyogVGhlIHZlcnkgZmlyc3QgY2FsbC4gQWxsb2NhdGUgcm9vdCBzdHJ1Y3R1cmUgKi8KKyAgICBpZiAoKF9iY21jbGlfcm9vdF9kaXI9KGJjbWNsaV9lbnRyeSAqKWJjbW9zX2NhbGxvYyhzaXplb2YoYmNtY2xpX2VudHJ5KSArIHN0cmxlbihCQ01DTElfUk9PVF9IRUxQKSArIDIgKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIF9iY21jbGlfcm9vdF9kaXItPm5hbWUgPSAoY2hhciAqKShfYmNtY2xpX3Jvb3RfZGlyICsgMSk7CisgICAgX2JjbWNsaV9yb290X2Rpci0+aGVscCA9IChjaGFyICopKF9iY21jbGlfcm9vdF9kaXItPm5hbWUgKyAxKTsKKyAgICBzdHJjcHkoX2JjbWNsaV9yb290X2Rpci0+aGVscCwgQkNNQ0xJX1JPT1RfSEVMUCk7CisgICAgX2JjbWNsaV9yb290X2Rpci0+c2VsID0gQkNNQ0xJX0VOVFJZX0RJUjsKKyAgICBfYmNtY2xpX3Jvb3RfZGlyLT5hY2Nlc3NfcmlnaHQgPSBCQ01DTElfQUNDRVNTX0dVRVNUOworCisgICAgbWVtc2V0KCZzZXNzaW9uX3Bhcm1zLCAwLCBzaXplb2Yoc2Vzc2lvbl9wYXJtcykpOworICAgIHNlc3Npb25fcGFybXMuYWNjZXNzX3JpZ2h0ID0gQkNNQ0xJX0FDQ0VTU19BRE1JTjsKKyAgICBzZXNzaW9uX3Bhcm1zLmV4dHJhX3NpemUgPSBzaXplb2YoYmNtY2xpX3Nlc3Npb25fZXh0cmFzKTsKKyAgICBzZXNzaW9uX3Bhcm1zLm5hbWUgPSAibW9ucm9vdCI7CisgICAgaWYgKGZpcnN0X3Nlc3Npb25fcGFybSkKKyAgICB7CisgICAgICAgIHNlc3Npb25fcGFybXMubGluZV9lZGl0X21vZGUgPSBmaXJzdF9zZXNzaW9uX3Bhcm0tPmxpbmVfZWRpdF9tb2RlOworICAgIH0KKyAgICByYyA9IGJjbWNsaV9zZXNzaW9uX29wZW4oJnNlc3Npb25fcGFybXMsICZzZXNzaW9uKTsKKyAgICBpZiAocmMpCisgICAgeworICAgICAgICBiY21vc19mcmVlKF9iY21jbGlfcm9vdF9kaXIpOworICAgICAgICBfYmNtY2xpX3Jvb3RfZGlyID0gTlVMTDsKKyAgICAgICAgX2JjbWNsaV9yb290X3Nlc3Npb24gPSBOVUxMOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIF9iY21jbGlfcm9vdF9zZXNzaW9uID0gX2JjbWNsaV9zZXNzaW9uX2RhdGEoc2Vzc2lvbik7CisgICAgX2JjbWNsaV9yb290X3Nlc3Npb24tPnNlc3Npb24gPSBzZXNzaW9uOworICAgIF9iY21jbGlfcm9vdF9zZXNzaW9uLT5jdXJkaXIgPSBfYmNtY2xpX3Jvb3RfZGlyOworCisgICAgLyogQWRkIGNvbW1hbmQgdG8gZGlzYWJsZS9lbmFibGUgbGluZSBlZGl0aW5nICovCisjaWZkZWYgQ09ORklHX0xJTkVOT0lTRQorICAgIGlmIChzZXNzaW9uX3Bhcm1zLmxpbmVfZWRpdF9tb2RlICE9IEJDTUNMSV9MSU5FX0VESVRfRElTQUJMRSkKKyAgICB7CisgICAgICAgIEJDTUNMSV9NQUtFX0NNRChOVUxMLCAifiIsICJFbmFibGUvZGlzYWJsZS9xdWVyeSBsaW5lIGVkaXRpbmciLCBfYmNtY2xpX2xpbmVfZWRpdF9jbWQsCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oImVuYWJsZSIsICJFbmFibGUgbGluZSBlZGl0aW5nIiwgYmNtY2xpX2VudW1fYm9vbF90YWJsZSwgQkNNQ0xJX1BBUk1fRkxBR19PUFRJT05BTCksCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oIm11bHRpbGluZSIsICJFbmFibGUgbXVsdGlsaW5lIG1vZGUiLCBiY21jbGlfZW51bV9ib29sX3RhYmxlLAorICAgICAgICAgICAgICAgIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwpKTsKKyAgICB9CisjZW5kaWYKK30KKworLyogRGlzcGxheSBkaXJlY3RvcnkgKi8KK3N0YXRpYyB2b2lkIF9iY21jbGlfZGlzcGxheV9kaXIoYmNtY2xpX3Nlc3Npb25fZXh0cmFzICptb25fc2Vzc2lvbiwgYmNtY2xpX2VudHJ5ICpwX2RpcikKK3sKKyAgICBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiA9IG1vbl9zZXNzaW9uLT5zZXNzaW9uOworICAgIGJjbWNsaV9lbnRyeSAqcF90b2tlbjsKKyAgICBiY21jbGlfZW50cnkgKnByZXY9TlVMTDsKKyAgICBiY21jbGlfc2Vzc2lvbiAqaGVscF9zZXNzaW9uID0gX2JjbWNsaV9oZWxwX3Nlc3Npb25fb3BlbihzZXNzaW9uKTsKKworICAgIGlmICghaGVscF9zZXNzaW9uKQorICAgICAgICByZXR1cm47CisKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChoZWxwX3Nlc3Npb24sICIlcyVzPiAiLCAocF9kaXI9PV9iY21jbGlfcm9vdF9kaXIpPyIiOiIuLi4vIiwgcF9kaXItPm5hbWUgKTsKKyAgICBwX3Rva2VuID0gcF9kaXItPnUuZGlyLmZpcnN0OworICAgIHdoaWxlICggcF90b2tlbiApCisgICAgeworICAgICAgICBpZiAocF90b2tlbi0+YWNjZXNzX3JpZ2h0IDw9IGJjbWNsaV9zZXNzaW9uX2FjY2Vzc19yaWdodChzZXNzaW9uKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHByZXYpCisgICAgICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoaGVscF9zZXNzaW9uLCAiLCAiKTsKKyAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KGhlbHBfc2Vzc2lvbiwgIiVzIiwgcF90b2tlbi0+bmFtZSApOworICAgICAgICAgICAgaWYgKHBfdG9rZW4tPnNlbCA9PSBCQ01DTElfRU5UUllfRElSICkKKyAgICAgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChoZWxwX3Nlc3Npb24sICIvIik7CisgICAgICAgICAgICBwcmV2ID0gcF90b2tlbjsKKyAgICAgICAgfQorICAgICAgICBwX3Rva2VuID0gcF90b2tlbi0+bmV4dDsKKyAgICB9CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoaGVscF9zZXNzaW9uLCAiXG4iKTsKKyAgICBfYmNtY2xpX2hlbHBfc2Vzc2lvbl9wcmludF9hbmRfY2xvc2Uoc2Vzc2lvbiwgaGVscF9zZXNzaW9uKTsKK30KKworCisvKiBJcyBjaGFyYWN0ZXIgdGhhdCBjYW4gYmUgdXNlZCBpbiBhIHNpbmdsZSB0b2tlbiA/ICovCitzdGF0aWMgaW5saW5lIGludCBfYmNtY2xpX2lzX3NwZWNpYWxfY2hhcihjaGFyIGMpCit7CisgICAgaWYgKCFjKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gKGMgPT0gQkNNQ0xJX0hFTFBfQ0hBUiB8fCBjID09IEJDTUNMSV9DT01NRU5UX0NIQVIgfHwgYyA9PSBCQ01DTElfRVFVQUxfQ0hBUik7Cit9CisKKy8qIE1ha2UgYSBwcmVsaW1pbmFyeSBhbmFsaXppcyBvZiA8bmFtZT4gdG9rZW4uCisgKiAgIFJldHVybnMgYSB0b2tlbiB0eXBlIChFbXB0eSwgVXAsIFJvb3QsIEJyZWFrLCBOYW1lKQorICovCitzdGF0aWMgYmNtY2xpX3Rva2VuX3R5cGUgX2JjbWNsaV9hbmFseXplX3Rva2VuKCBjb25zdCBjaGFyICpuYW1lICkKK3sKKyAgICBpZiAoIW5hbWVbMF0gfHwgbmFtZVswXT09JzsnKQorICAgICAgICByZXR1cm4gQkNNQ0xJX1RPS0VOX0VNUFRZOworCisgICAgaWYgKCpuYW1lID09IEJDTUNMSV9DT01NRU5UX0NIQVIpCisgICAgICAgIHJldHVybiBCQ01DTElfVE9LRU5fQlJFQUs7CisKKyAgICBpZiAoIXN0cmNtcChuYW1lLCBCQ01DTElfVVBfU1RSKSkKKyAgICAgICAgcmV0dXJuIEJDTUNMSV9UT0tFTl9VUDsKKworICAgIGlmICghc3RyY21wKG5hbWUsIEJDTUNMSV9ST09UX1NUUikpCisgICAgICAgIHJldHVybiBCQ01DTElfVE9LRU5fUk9PVDsKKworICAgIGlmICgqbmFtZSA9PSBCQ01DTElfSEVMUF9DSEFSKQorICAgICAgICByZXR1cm4gQkNNQ0xJX1RPS0VOX0hFTFA7CisKKyAgICByZXR1cm4gQkNNQ0xJX1RPS0VOX1ZBTFVFOworCit9CisKKworLyogaXNzcGFjZSB3cmFwcGVyICovCitzdGF0aWMgaW5saW5lIGludCBfYmNtY2xpX2lzc3BhY2UoY2hhciBjKQoreworICAgIHJldHVybiBpc3NwYWNlKChpbnQpYyk7Cit9CisKKy8qIEN1dCB0aGUgZmlyc3Qgd29yZCBmcm9tIDxwX2luYnVmPi4KKyAqIC0gUmV0dXJuIHBvaW50ZXIgdG8gc3RhcnQgb2YgdGhlIHdvcmQgaW4gcF93b3JkCisgKiAtIDAgdGVybWluYXRvciBpcyBpbnNlcnRlZCBpbiB0aGUgZW5kIG9mIHRoZSB3b3JkCisgKiAtIHNlc3Npb24tPnBfaW5idWYgaXMgdXBkYXRlZCB0byBwb2ludCBhZnRlciB0aGUgd29yZAorICogUmV0dXJucyB0b2tlbiB0eXBlCisgKi8KK3N0YXRpYyBiY21jbGlfdG9rZW5fdHlwZSBfYmNtY2xpX2dldF93b3JkKGJjbWNsaV9zZXNzaW9uX2V4dHJhcyAqbW9uX3Nlc3Npb24sIGNoYXIgKipidWYsIGNoYXIgKipwX3dvcmQpCit7CisgICAgYmNtY2xpX3Rva2VuX3R5cGUgdG9rZW5fdHlwZTsKKyAgICBjaGFyICpwX2luYnVmID0gKmJ1ZjsKKyAgICBjaGFyIG5leHRfY2hhciA9IDA7CisgICAgYmNtb3NfYm9vbCBxdW90ZWRfc3RyaW5nID0gQkNNT1NfRkFMU0U7CisKKyAgICAvKiBTa2lwIGxlYWRpbmcgYmxhbmtzICovCisgICAgd2hpbGUgKCpwX2luYnVmICYmIChfYmNtY2xpX2lzc3BhY2UoKnBfaW5idWYpIHx8ICgqcF9pbmJ1Zj09JywnKSkpCisgICAgICAgICsrcF9pbmJ1ZjsKKworICAgICpidWYgPSBwX2luYnVmOworICAgIGlmICghICpwX2luYnVmKQorICAgICAgICByZXR1cm4gQkNNQ0xJX1RPS0VOX0VNUFRZOworICAgIGlmICgqcF9pbmJ1ZiA9PSAnOycpCisgICAgeworICAgICAgICAqcF9pbmJ1ZiA9IDA7CisgICAgICAgICpidWYgPSArK3BfaW5idWY7CisgICAgICAgIHJldHVybiBCQ01DTElfVE9LRU5fRU1QVFk7CisgICAgfQorCisgICAgLyogUXVvdGVkIHN0cmluZyA/ICovCisgICAgaWYgKCpwX2luYnVmID09ICciJykKKyAgICB7CisgICAgICAgIHF1b3RlZF9zdHJpbmcgPSBCQ01PU19UUlVFOworICAgICAgICAqcF93b3JkID0gKytwX2luYnVmOworICAgICAgICB3aGlsZSAoICpwX2luYnVmICYmICpwX2luYnVmIT0nIicgKQorICAgICAgICAgICAgKytwX2luYnVmOworICAgICAgICBpZiAoKnBfaW5idWYgIT0gJyInKQorICAgICAgICB7CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChtb25fc2Vzc2lvbi0+c2Vzc2lvbiwgIk1PTjogdW50ZXJtaW5hdGVkIHN0cmluZyAlc1xuIiwgKnBfd29yZCk7CisgICAgICAgICAgICByZXR1cm4gQkNNQ0xJX1RPS0VOX0VNUFRZOworICAgICAgICB9CisgICAgICAgIGlmICgqcF9pbmJ1ZikKKyAgICAgICAgICAgICoocF9pbmJ1ZisrKSA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICpwX3dvcmQgPSBwX2luYnVmOworICAgICAgICBpZiAoIV9iY21jbGlfaXNfc3BlY2lhbF9jaGFyKCpwX2luYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgZG8gKytwX2luYnVmOworICAgICAgICAgICAgd2hpbGUgKCpwX2luYnVmICYmICFfYmNtY2xpX2lzc3BhY2UoKnBfaW5idWYpICYmICpwX2luYnVmIT0nOycgJiYgIV9iY21jbGlfaXNfc3BlY2lhbF9jaGFyKCpwX2luYnVmKSk7CisgICAgICAgICAgICAvKiBTa2lwIHRyYWlsaW5nIHNwYWNlcyAqLworICAgICAgICAgICAgd2hpbGUgKCpwX2luYnVmICYmIF9iY21jbGlfaXNzcGFjZSgqcF9pbmJ1ZikpCisgICAgICAgICAgICAgICAgKihwX2luYnVmKyspID0gMDsKKyAgICAgICAgICAgIG5leHRfY2hhciA9ICpwX2luYnVmOworICAgICAgICAgICAgaWYgKG5leHRfY2hhciA9PSBCQ01DTElfRVFVQUxfQ0hBUikKKyAgICAgICAgICAgICAgICAqKHBfaW5idWYrKykgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgKytwX2luYnVmOworICAgICAgICB9CisgICAgfQorICAgICpidWYgPSBwX2luYnVmOworICAgIHRva2VuX3R5cGUgICA9IF9iY21jbGlfYW5hbHl6ZV90b2tlbiggKnBfd29yZCApOworICAgIGlmICh0b2tlbl90eXBlID09IEJDTUNMSV9UT0tFTl9WQUxVRSAmJiBuZXh0X2NoYXIgPT0gQkNNQ0xJX0VRVUFMX0NIQVIpCisgICAgICAgIHRva2VuX3R5cGUgPSBCQ01DTElfVE9LRU5fTkFNRTsKKyAgICBpZiAoKHRva2VuX3R5cGUgPT0gQkNNQ0xJX1RPS0VOX0VNUFRZKSAmJiBxdW90ZWRfc3RyaW5nKQorICAgICAgICB0b2tlbl90eXBlID0gQkNNQ0xJX1RPS0VOX1ZBTFVFOworICAgIHJldHVybiB0b2tlbl90eXBlOworfQorCisvKiBTcGxpdCBzdHJpbmcgdG8gW25hbWU9XXZhbHVlIHBhaXJzICovCitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbWNsaV9zcGxpdChiY21jbGlfc2Vzc2lvbl9leHRyYXMgKm1vbl9zZXNzaW9uLCBiY21jbGlfbmFtZV92YWx1ZSAqKnBfcGFpcnMsIGludCAqcF9ucGFpcnMpCit7CisgICAgYmNtY2xpX25hbWVfdmFsdWUgKnBhaXJzOworICAgIGNoYXIgKnRtcF9idWYsICp0bXBfYnVmX29yZzsKKyAgICBjaGFyICp3b3JkOworICAgIGJjbWNsaV90b2tlbl90eXBlIHRva2VuX3R5cGUsIHByZXZfdHlwZT1CQ01DTElfVE9LRU5fRU1QVFk7CisgICAgaW50IG4gPSAwOworCisgICAgLyogTWFrZSBhIGNvcHkgb2YgaW5wdXQgYnVmZmVyICovCisgICAgdG1wX2J1Zl9vcmcgPSB0bXBfYnVmID0gYmNtb3NfYWxsb2Moc3RybGVuKG1vbl9zZXNzaW9uLT5wX2luYnVmKSArIDEpOworICAgIGlmICghdG1wX2J1ZikKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgc3RyY3B5KHRtcF9idWYsIG1vbl9zZXNzaW9uLT5wX2luYnVmKTsKKworICAgIC8qIENhbGN1bGF0ZSBudW1iZXIgb2YgcGFpcnMgZmlyc3QgKi8KKyAgICB0b2tlbl90eXBlID0gX2JjbWNsaV9nZXRfd29yZChtb25fc2Vzc2lvbiwgJnRtcF9idWYsICZ3b3JkKTsKKyAgICB3aGlsZSAodG9rZW5fdHlwZSAhPSBCQ01DTElfVE9LRU5fRU1QVFkgJiYgdG9rZW5fdHlwZSAhPSBCQ01DTElfVE9LRU5fQlJFQUspCisgICAgeworICAgICAgICAvKiBTa2lwID12YWx1ZSAqLworICAgICAgICBpZiAoIShwcmV2X3R5cGUgPT0gQkNNQ0xJX1RPS0VOX05BTUUgJiYgdG9rZW5fdHlwZSA9PSBCQ01DTElfVE9LRU5fVkFMVUUpKQorICAgICAgICAgICAgKytuOworICAgICAgICBwcmV2X3R5cGUgPSB0b2tlbl90eXBlOworICAgICAgICB0b2tlbl90eXBlID0gX2JjbWNsaV9nZXRfd29yZChtb25fc2Vzc2lvbiwgJnRtcF9idWYsICZ3b3JkKTsKKyAgICB9CisgICAgYmNtb3NfZnJlZSh0bXBfYnVmX29yZyk7CisgICAgKnBfbnBhaXJzID0gbjsKKyAgICBpZiAoIW4pCisgICAgeworICAgICAgICAqcF9wYWlycyA9IE5VTEw7CisgICAgICAgIC8qIEN1dCBpbnB1dCBzdHJpbmcgaW4gb3JkZXIgdG8gcHJldmVudCBpbmZpbml0ZSBsb29wIGluIHRoZSBwYXJzZXIgaWYgdGhlIHN0cmluZworICAgICAgICAgKiBpcyBub3QgZW1wdHkgKGUuZy4sIGNvbnRhaW5zIHNwYWNlcykgKi8KKyAgICAgICAgKm1vbl9zZXNzaW9uLT5wX2luYnVmID0gMDsKKyAgICAgICAgaWYgKHRva2VuX3R5cGUgPT0gQkNNQ0xJX1RPS0VOX0JSRUFLKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9OT0VOVDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAqcF9wYWlycyA9IHBhaXJzID0gYmNtb3NfY2FsbG9jKG4gKiBzaXplb2YoYmNtY2xpX25hbWVfdmFsdWUpKTsKKyAgICBpZiAoISBwYWlycykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisKKyAgICAvKiBOb3cgc2NhbiB0aGUgb3JpZ2luYWwgc3RyaW5nIGFuZCBzZXQgbmFtZXMgYW5kIHZhbHVlcyAqLworICAgIHRva2VuX3R5cGUgPSBfYmNtY2xpX2dldF93b3JkKG1vbl9zZXNzaW9uLCAmbW9uX3Nlc3Npb24tPnBfaW5idWYsICZ3b3JkKTsKKyAgICBwcmV2X3R5cGU9QkNNQ0xJX1RPS0VOX0VNUFRZOworICAgIC0tcGFpcnM7IC8qIGl0IGlzIGdvaW5nIHRvIGJlIHByZS1pbmNyZW1lbnRlZCAqLworICAgIHdoaWxlICh0b2tlbl90eXBlICE9IEJDTUNMSV9UT0tFTl9FTVBUWSAmJiB0b2tlbl90eXBlICE9IEJDTUNMSV9UT0tFTl9CUkVBSykKKyAgICB7CisgICAgICAgIGlmICghKHByZXZfdHlwZSA9PSBCQ01DTElfVE9LRU5fTkFNRSAmJiB0b2tlbl90eXBlID09IEJDTUNMSV9UT0tFTl9WQUxVRSkpCisgICAgICAgICAgICArK3BhaXJzOworICAgICAgICBwYWlycy0+dHlwZSA9IHRva2VuX3R5cGU7CisgICAgICAgIGlmICh0b2tlbl90eXBlID09IEJDTUNMSV9UT0tFTl9OQU1FKQorICAgICAgICB7CisgICAgICAgICAgICBwYWlycy0+bmFtZSA9IHdvcmQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwYWlycy0+dmFsdWUgPSB3b3JkOworICAgICAgICB9CisgICAgICAgIHByZXZfdHlwZSA9IHRva2VuX3R5cGU7CisgICAgICAgIHRva2VuX3R5cGUgPSBfYmNtY2xpX2dldF93b3JkKG1vbl9zZXNzaW9uLCAmbW9uX3Nlc3Npb24tPnBfaW5idWYsICZ3b3JkKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIEZpbmQgcGFyYW1ldGVyIGJ5IG5hbWUgKi8KK3N0YXRpYyBiY21jbGlfY21kX3Bhcm0gKl9iY21jbGlfZmluZF9uYW1lZF9wYXJtKGJjbWNsaV9zZXNzaW9uX2V4dHJhcyAqbW9uX3Nlc3Npb24sIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpjbWRfcGFybSA9IG1vbl9zZXNzaW9uLT5jbWRfcGFybXM7CisKKyAgICB3aGlsZSAoY21kX3Bhcm0tPm5hbWUpCisgICAgeworICAgICAgICBpZiAoIV9iY21jbGlfc3RyaWNtcChuYW1lLCBjbWRfcGFybS0+bmFtZSwgLTEpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICsrY21kX3Bhcm07CisgICAgfQorCisgICAgaWYgKCFjbWRfcGFybS0+bmFtZSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXR1cm4gY21kX3Bhcm07Cit9CisKKy8qIEV4dGVuZCBzZXNzaW9uIHBhcmFtZXRlciB0YWJsZSBiYXNlZCBvbiBzZWxlY3RvciB2YWx1ZSAqLworc3RhdGljIGJjbW9zX2Vycm5vIF9iY21jbGlfZXh0ZW5kX3Bhcm1fdGFibGUoYmNtY2xpX3Nlc3Npb25fZXh0cmFzICptb25fc2Vzc2lvbiwKKyAgICBiY21jbGlfY21kX3Bhcm0gKnNlbGVjdG9yLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKyAgICBiY21jbGlfZW51bV92YWwgKnZhbHVlcz1zZWxlY3Rvci0+ZW51bV90YWJsZTsKKyAgICBiY21jbGlfY21kX3Bhcm0gKnBhcm1zOworICAgIGJjbWNsaV9jbWRfcGFybSAqc2Vzc2lvbl9wYXJtOworICAgIGludCBuc2VsID0gc2VsZWN0b3IgLSBtb25fc2Vzc2lvbi0+Y21kX3Bhcm1zOworICAgIGJjbWNsaV9wYXJtX3ZhbHVlX3N0YXR1cyAqdmFsX3N0YXR1czsKKyAgICBpbnQgbnBhcm1zOworCisgICAgd2hpbGUgKHZhbHVlcy0+bmFtZSkKKyAgICB7CisgICAgICAgIGlmICghX2JjbWNsaV9zdHJpY21wKHZhbHVlcy0+bmFtZSwgdmFsdWUsIC0xKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICArK3ZhbHVlczsKKyAgICB9CisgICAgaWYgKCF2YWx1ZXMtPm5hbWUpCisgICAgICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOworCisgICAgLyogQ2FsY3VsYXRlIG51bWJlciBvZiBwYXJhbWV0ZXJzIGluIHNlbGVjdGVkIHRhYmxlICovCisgICAgcGFybXMgPSB2YWx1ZXMtPnBhcm1zOworICAgIHdoaWxlIChwYXJtcyAmJiBwYXJtcy0+bmFtZSkKKyAgICB7CisgICAgICAgICsrcGFybXM7CisgICAgfQorICAgIG5wYXJtcyA9IHBhcm1zIC0gdmFsdWVzLT5wYXJtczsKKworICAgIGlmIChtb25fc2Vzc2lvbi0+bnVtX3Bhcm1zICsgbnBhcm1zID49IEJDTUNMSV9NQVhfUEFSTVMpCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChtb25fc2Vzc2lvbi0+c2Vzc2lvbiwgIk1PTjogJXM+IENhbidzIHByb2Nlc3Mgc2VsZWN0b3IgJXMuIFRvbyBtYW55IHBhcmFtZXRlcnNcbiIsCisgICAgICAgICAgICBtb25fc2Vzc2lvbi0+Y3VyY21kLT5uYW1lLCBzZWxlY3Rvci0+bmFtZSk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09WRVJGTE9XOworICAgIH0KKworICAgIC8qIFNoaWZ0IHNlc3Npb24gcGFyYW1ldGVycyBtYWtpbmcgcm9vbSBmb3IgdGhlIG5ldyB0YWJsZSAqLworICAgIGlmIChzZWxlY3RvciAhPSAmbW9uX3Nlc3Npb24tPmNtZF9wYXJtc1ttb25fc2Vzc2lvbi0+bnVtX3Bhcm1zLTFdKQorICAgIHsKKyAgICAgICAgbWVtbW92ZShzZWxlY3RvciArIG5wYXJtcyArIDEsIHNlbGVjdG9yICsgMSwKKyAgICAgICAgICAgICgmbW9uX3Nlc3Npb24tPmNtZF9wYXJtc1ttb25fc2Vzc2lvbi0+bnVtX3Bhcm1zLTFdIC0gc2VsZWN0b3IpICogc2l6ZW9mKGJjbWNsaV9jbWRfcGFybSkpOworICAgICAgICBtZW1tb3ZlKCZtb25fc2Vzc2lvbi0+dmFsdWVfc3RhdHVzW25zZWwgKyBucGFybXMgKyAxXSwgJm1vbl9zZXNzaW9uLT52YWx1ZV9zdGF0dXNbbnNlbCArIDFdLAorICAgICAgICAgICAgKG1vbl9zZXNzaW9uLT5udW1fcGFybXMgLSBuc2VsKSAqIHNpemVvZihiY21jbGlfcGFybV92YWx1ZV9zdGF0dXMpKTsKKyAgICB9CisKKyAgICAvKiBGaW5hbGx5IGluc2VydCBzZWxlY3RvcidzIHRhYmxlICovCisgICAgcGFybXMgPSB2YWx1ZXMtPnBhcm1zOworICAgIHNlc3Npb25fcGFybSA9IHNlbGVjdG9yKzE7CisgICAgdmFsX3N0YXR1cyA9ICZtb25fc2Vzc2lvbi0+dmFsdWVfc3RhdHVzW25zZWwgKyAxXTsKKyAgICB3aGlsZSAocGFybXMgJiYgcGFybXMtPm5hbWUpCisgICAgeworICAgICAgICAqc2Vzc2lvbl9wYXJtID0gKnBhcm1zOworICAgICAgICBfYmNtY2xpX2Fzc2lnbl9jYWxsYmFja3Moc2Vzc2lvbl9wYXJtKTsKKworICAgICAgICBpZiAocGFybXMtPm1heF9hcnJheV9zaXplKQorICAgICAgICB7CisgICAgICAgICAgICB2YWxfc3RhdHVzLT52YWx1ZXNfc2V0ID0gYmNtb3NfY2FsbG9jKHNpemVvZihiY21vc19ib29sKSAqIHBhcm1zLT5tYXhfYXJyYXlfc2l6ZSk7CisgICAgICAgICAgICBpZiAoIXZhbF9zdGF0dXMtPnZhbHVlc19zZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQobW9uX3Nlc3Npb24tPnNlc3Npb24sICJNT046ID4gQ291bGRuJ3QgYWxsb2NhdGUgdmFsdWUgc3RhdHVzIGFycmF5IGZvciAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgcGFybXMtPm5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdmFsX3N0YXR1cy0+dmFsdWVfc2V0ID0gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKworCisgICAgICAgICsrcGFybXM7CisgICAgICAgICsrc2Vzc2lvbl9wYXJtOworICAgICAgICArK3ZhbF9zdGF0dXM7CisgICAgfQorICAgIG1vbl9zZXNzaW9uLT5udW1fcGFybXMgKz0gbnBhcm1zOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIFBhcnNlIGEgc2luZ2xlIHBhcmFtZXRlciB2YWx1ZSAoc2NhbGFyIHZhbHVlIG9yIGFycmF5IGVsZW1lbnQpICovCitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbWNsaV9wYXJzZV8xdmFsdWUoYmNtY2xpX3Nlc3Npb25fZXh0cmFzICptb25fc2Vzc2lvbiwgYmNtY2xpX2VudHJ5ICpjbWQsCisgICAgYmNtY2xpX2NtZF9wYXJtICpwYXJtLCBiY21jbGlfcGFybV92YWx1ZSAqdmFsdWUsIGNvbnN0IGNoYXIgKnN0cmluZ192YWx1ZSwKKyAgICBpbnQgdmFsX2xlbiwgYmNtb3NfYm9vbCBzdXBwcmVzc19lcnJfcHJpbnQpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICBpZiAodmFsX2xlbiA+PSAwKQorICAgIHsKKyAgICAgICAgLyogV2UgYXJlIGRlYWxpbmcgd2l0aCBhcnJheSBlbGVtZW50LiBzdHJpbmdfdmFsdWUgaXMgY29tbWEgcmF0aGVyIHRoYW4KKyAgICAgICAgICogMC10ZXJtaW5hdGVkLiBDb3B5IGl0IGFzaWRlLgorICAgICAgICAgKi8KKyAgICAgICAgY2hhciB2YWxfY29weVt2YWxfbGVuICsgMV07CisgICAgICAgIHN0cm5jcHkodmFsX2NvcHksIHN0cmluZ192YWx1ZSwgdmFsX2xlbik7CisgICAgICAgIHZhbF9jb3B5W3ZhbF9sZW5dID0gMDsKKyAgICAgICAgcmMgPSBwYXJtLT5zY2FuX2NiKHBhcm0sIHZhbHVlLCB2YWxfY29weSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJjID0gcGFybS0+c2Nhbl9jYihwYXJtLCB2YWx1ZSwgc3RyaW5nX3ZhbHVlKTsKKyAgICB9CisgICAgaWYgKHJjKQorICAgIHsKKyAgICAgICAgaWYgKCFzdXBwcmVzc19lcnJfcHJpbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KG1vbl9zZXNzaW9uLT5zZXNzaW9uLCAiTU9OOiAlcz4gPCVzPjogdmFsdWUgJXMgaXMgaW52YWxpZFxuIiwKKyAgICAgICAgICAgICAgICBjbWQtPm5hbWUsIHBhcm0tPm5hbWUsIHN0cmluZ192YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisKKy8qIFBhcnNlIHBhcmFtZXRlciB2YWx1ZSwgaW5jbHVkaW5nIGFycmF5IHZhbHVlIChjb21tYS1kZWxpbWl0ZWQgbGlzdCBvZiBlbGVtZW50IHZhbHVlcykgKi8KK3N0YXRpYyBiY21vc19lcnJubyBfYmNtY2xpX3BhcnNlX3ZhbHVlKGJjbWNsaV9zZXNzaW9uX2V4dHJhcyAqbW9uX3Nlc3Npb24sIGJjbWNsaV9lbnRyeSAqY21kLAorICAgIGJjbWNsaV9jbWRfcGFybSAqcGFybSwgY29uc3QgY2hhciAqc3RyaW5nX3ZhbHVlLCBiY21vc19ib29sIHN1cHByZXNzX2Vycl9wcmludCkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgdWludDMyX3QgcGFybV9pbmRleCA9IHBhcm0gLSBtb25fc2Vzc2lvbi0+Y21kX3Bhcm1zOworCisgICAgQlVHX09OKHBhcm1faW5kZXggPj0gQkNNQ0xJX01BWF9QQVJNUyk7CisKKyAgICBpZiAocGFybS0+bWF4X2FycmF5X3NpemUpCisgICAgeworICAgICAgICB1aW50MzJfdCBpID0gMDsKKworICAgICAgICAvKiBFbXB0eSBhcnJheT8gKi8KKyAgICAgICAgaWYgKF9iY21jbGlfc3RyaWNtcChzdHJpbmdfdmFsdWUsIEJDTUNMSV9BUlJBWV9FTVBUWSwgLTEpKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBhcnJheSBlbGVtZW50IHZhbHVlcyBhcmUgY29tbWEtZGVsaW1pdGVkICovCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGFybS0+bWF4X2FycmF5X3NpemUgJiYgc3RyaW5nX3ZhbHVlICYmICpzdHJpbmdfdmFsdWUgJiYgIXJjOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcGNvbW1hOworICAgICAgICAgICAgICAgIGludCB2YWxfbGVuOworCisgICAgICAgICAgICAgICAgcGNvbW1hID0gc3RyY2hyKHN0cmluZ192YWx1ZSwgQkNNQ0xJX0FSUkFZX0RFTElNX0NIQVIpOworICAgICAgICAgICAgICAgIGlmIChwY29tbWEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWxfbGVuID0gcGNvbW1hIC0gc3RyaW5nX3ZhbHVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWxfbGVuID0gLTE7IC8qIHRvIHRoZSBlbmQgb2Ygc3RyaW5nICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIE5vIHZhbHVlID8gKi8KKyAgICAgICAgICAgICAgICBpZiAoX2JjbWNsaV9zdHJpY21wKHN0cmluZ192YWx1ZSwgQkNNQ0xJX1BBUk1fTk9fVkFMVUUsIHZhbF9sZW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSBfYmNtY2xpX3BhcnNlXzF2YWx1ZShtb25fc2Vzc2lvbiwgY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgcGFybSwgJnBhcm0tPnZhbHVlc1tpXSwgc3RyaW5nX3ZhbHVlLCB2YWxfbGVuLCBzdXBwcmVzc19lcnJfcHJpbnQpOworICAgICAgICAgICAgICAgICAgICBtb25fc2Vzc2lvbi0+dmFsdWVfc3RhdHVzW3Bhcm1faW5kZXhdLnZhbHVlc19zZXRbaV0gPSAocmMgPT0gQkNNX0VSUl9PSyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0cmluZ192YWx1ZSA9IHBjb21tYSA/IHBjb21tYSArIDEgOiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogSWYgYWxsIHBhcnNlZCB2YWx1ZXMgd2VyZSBvaywgYnV0IHdlIGhhdmUgbW9yZSB2YWx1ZXMgdGhhbiBhcnJheSBzaXplIC0gaXQgaXMgYW4gZXJyb3IgKi8KKyAgICAgICAgICAgIGlmIChzdHJpbmdfdmFsdWUgJiYgKnN0cmluZ192YWx1ZSAmJiAhcmMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX1RPT19NQU5ZOworICAgICAgICAgICAgICAgIGlmICghc3VwcHJlc3NfZXJyX3ByaW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQobW9uX3Nlc3Npb24tPnNlc3Npb24sICJNT046ICVzPiA8JXM+OiB0b28gbWFueSB2YWx1ZXMuICVzIGlzIGludmFsaWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBjbWQtPm5hbWUsIHBhcm0tPm5hbWUsIHN0cmluZ192YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcGFybS0+YXJyYXlfc2l6ZSA9IGk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChfYmNtY2xpX3N0cmljbXAoc3RyaW5nX3ZhbHVlLCBCQ01DTElfUEFSTV9OT19WQUxVRSwgc3RybGVuKHN0cmluZ192YWx1ZSkpKQorICAgICAgICB7CisgICAgICAgICAgICByYyA9IF9iY21jbGlfcGFyc2VfMXZhbHVlKG1vbl9zZXNzaW9uLCBjbWQsCisgICAgICAgICAgICAgICAgcGFybSwgJnBhcm0tPnZhbHVlLCBzdHJpbmdfdmFsdWUsIC0xLCBzdXBwcmVzc19lcnJfcHJpbnQpOworICAgICAgICAgICAgbW9uX3Nlc3Npb24tPnZhbHVlX3N0YXR1c1twYXJtX2luZGV4XS52YWx1ZV9zZXQgPSAocmMgPT0gQkNNX0VSUl9PSyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qIFJlbGVhc2UgdmFsdWUgc3RhdHVzIGFycmF5cyAqLworc3RhdGljIHZvaWQgX2JjbWNsaV9mcmVlX3Nlc3Npb25fdmFsdWVfc3RhdHVzKGJjbWNsaV9zZXNzaW9uX2V4dHJhcyAqbW9uX3Nlc3Npb24pCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpwYXJtcz1tb25fc2Vzc2lvbi0+Y21kX3Bhcm1zOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IEJDTUNMSV9NQVhfUEFSTVM7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChwYXJtc1tpXS5tYXhfYXJyYXlfc2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1vbl9zZXNzaW9uLT52YWx1ZV9zdGF0dXNbaV0udmFsdWVzX3NldCAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9zX2ZyZWUobW9uX3Nlc3Npb24tPnZhbHVlX3N0YXR1c1tpXS52YWx1ZXNfc2V0KTsKKyAgICAgICAgICAgICAgICBtb25fc2Vzc2lvbi0+dmFsdWVfc3RhdHVzW2ldLnZhbHVlc19zZXQgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbW9uX3Nlc3Npb24tPnZhbHVlX3N0YXR1c1tpXS52YWx1ZV9zZXQgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogUG9wdWxhdGUgc2Vzc2lvbiBwYXJhbWV0ZXJzLiBBcHBseSBzZWxlY3RvcnMgKi8KK3N0YXRpYyBiY21vc19lcnJubyBfYmNtY2xpX3BvcHVsYXRlX3Bhcm1zKGJjbWNsaV9zZXNzaW9uX2V4dHJhcyAqbW9uX3Nlc3Npb24sIGJjbWNsaV9lbnRyeSAqY21kLAorICAgIGJjbWNsaV9uYW1lX3ZhbHVlICpwYWlycywgaW50IG5wYWlycywgYmNtb3NfYm9vbCBzdXBwcmVzc19lcnJfcHJpbnQsIGludCAqbGFzdCkKK3sKKyAgICBjb25zdCBjaGFyICpwYXJtX3ZhbHVlOworICAgIGludCBwb3NpdGlvbmFsPTE7CisgICAgYmNtY2xpX2NtZF9wYXJtICpwYXJtcz1tb25fc2Vzc2lvbi0+Y21kX3Bhcm1zOworICAgIGJjbWNsaV9jbWRfcGFybSAqY3VyX3Bhcm07CisgICAgaW50IHJjOworICAgIGludCBpOworCisgICAgLyogTWFyayBhbGwgcGFyYW1ldGVycyBhcyBkb24ndCBoYXZpbmcgYW4gZXhwbGljaXQgdmFsdWUgKi8KKyAgICBtZW1zZXQoJnBhcm1zWzBdLCAwLCBzaXplb2YobW9uX3Nlc3Npb24tPmNtZF9wYXJtcykpOworICAgIG1lbWNweSgmcGFybXNbMF0sIGNtZC0+dS5jbWQucGFybXMsIHNpemVvZihiY21jbGlfY21kX3Bhcm0pKmNtZC0+dS5jbWQubnVtX3Bhcm1zKTsKKyAgICAvKiBDbGVhciBhcnJheSBidWZmZXJzICovCisgICAgZm9yIChpID0gMDsgaSA8IGNtZC0+dS5jbWQubnVtX3Bhcm1zOyBpKyspCisgICAgeworICAgICAgICBpZiAocGFybXNbaV0ubWF4X2FycmF5X3NpemUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJVR19PTighcGFybXNbaV0udmFsdWVzKTsKKyAgICAgICAgICAgIG1lbXNldChwYXJtc1tpXS52YWx1ZXMsIDAsIHNpemVvZihiY21jbGlfcGFybV92YWx1ZSkgKiBwYXJtc1tpXS5tYXhfYXJyYXlfc2l6ZSk7CisgICAgICAgICAgICBtb25fc2Vzc2lvbi0+dmFsdWVfc3RhdHVzW2ldLnZhbHVlc19zZXQgPSBiY21vc19jYWxsb2Moc2l6ZW9mKGJjbW9zX2Jvb2wpICogcGFybXNbaV0ubWF4X2FycmF5X3NpemUpOworICAgICAgICAgICAgaWYgKCFtb25fc2Vzc2lvbi0+dmFsdWVfc3RhdHVzW2ldLnZhbHVlc19zZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQobW9uX3Nlc3Npb24tPnNlc3Npb24sICJNT046ICVzPiBDb3VsZG4ndCBhbGxvY2F0ZSB2YWx1ZSBzdGF0dXMgYXJyYXkgZm9yICVzXG4iLAorICAgICAgICAgICAgICAgICAgICBjbWQtPm5hbWUsIHBhaXJzW2ldLm5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbW9uX3Nlc3Npb24tPnZhbHVlX3N0YXR1c1tpXS52YWx1ZV9zZXQgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtb25fc2Vzc2lvbi0+Y3VyY21kID0gY21kOworICAgIG1vbl9zZXNzaW9uLT5udW1fcGFybXMgPSBjbWQtPnUuY21kLm51bV9wYXJtczsKKyAgICBpZiAobGFzdCkKKyAgICAgICAgKmxhc3QgPSAwOworICAgIC8qIEJ1aWxkIGEgZm9ybWF0IHN0cmluZyAqLworICAgIGZvciAoaT0wOyBpPG5wYWlycyAmJiBwYWlyc1tpXS50eXBlICE9IEJDTUNMSV9UT0tFTl9CUkVBSzsgaSsrKQorICAgIHsKKyAgICAgICAgcGFybV92YWx1ZSA9IHBhaXJzW2ldLnZhbHVlOworICAgICAgICBpZiAobGFzdCkKKyAgICAgICAgICAgICpsYXN0ID0gaTsKKyAgICAgICAgY3VyX3Bhcm0gPSBOVUxMOworICAgICAgICAvKiBOYW1lZCBwYXJhbWV0ZXIgPyAqLworICAgICAgICBpZiAocGFpcnNbaV0ubmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCAoY21kLT51LmNtZC5leHRyYXMuZmxhZ3MgJiBCQ01DTElfQ01EX0ZMQUdfTk9fTkFNRV9QQVJNUykgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghc3VwcHJlc3NfZXJyX3ByaW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQobW9uX3Nlc3Npb24tPnNlc3Npb24sICJNT046ICVzPiBEb2Vzbid0IHN1cHBvcnQgbmFtZWQgcGFyYW1ldGVycy4gJXMgaXMgdW5leHBlY3RlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+bmFtZSwgcGFpcnNbaV0ubmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwb3NpdGlvbmFsID0gMDsgLyogTm8gbW9yZSBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgICAgIC8qIENoZWNrIG5hbWUgKi8KKyAgICAgICAgICAgIGN1cl9wYXJtID0gX2JjbWNsaV9maW5kX25hbWVkX3Bhcm0obW9uX3Nlc3Npb24sIHBhaXJzW2ldLm5hbWUpOworICAgICAgICAgICAgaWYgKCFjdXJfcGFybSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIXN1cHByZXNzX2Vycl9wcmludCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KG1vbl9zZXNzaW9uLT5zZXNzaW9uLCAiTU9OOiAlcz4gcGFyYW1ldGVyIDwlcz4gZG9lc24ndCBleGlzdFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+bmFtZSwgcGFpcnNbaV0ubmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXBhcm1fdmFsdWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFzdXBwcmVzc19lcnJfcHJpbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChtb25fc2Vzc2lvbi0+c2Vzc2lvbiwgIk1PTjogJXM+IDwlcz46IHZhbHVlIGlzIG1pc3NpbmdcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBjbWQtPm5hbWUsIGN1cl9wYXJtLT5uYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGl0IGNhbiBzdGlsbCBiZSBuYW1lZCBFTlVNIHBhcmFtZXRlciAod2l0aG91dCA9dmFsdWUpLiBJbiB0aGlzIGNhc2UgdGhlIDFzdAorICAgICAgICAgICAgICogZW51bSB2YWx1ZSBpcyBhc3N1bWVkLiBDaGVjayBpdAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAocGFybV92YWx1ZSAmJiAoY3VyX3Bhcm0gPSBfYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShtb25fc2Vzc2lvbiwgcGFybV92YWx1ZSkpICYmCisgICAgICAgICAgICAgICAgKGN1cl9wYXJtLT50eXBlID09IEJDTUNMSV9QQVJNX0VOVU0pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhaXJzW2ldLm5hbWUgPSBwYXJtX3ZhbHVlOworICAgICAgICAgICAgICAgIHBhaXJzW2ldLnZhbHVlID0gcGFybV92YWx1ZSA9IGN1cl9wYXJtLT5lbnVtX3RhYmxlLT5uYW1lOworICAgICAgICAgICAgICAgIHBvc2l0aW9uYWwgPSAwOyAvKiBObyBtb3JlIHBvc2l0aW9uYWwgcGFyYW1ldGVycyAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghcG9zaXRpb25hbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghc3VwcHJlc3NfZXJyX3ByaW50KQorICAgICAgICAgICAgICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQobW9uX3Nlc3Npb24tPnNlc3Npb24sICJNT046ICVzPiBFeHBlY3RlZCBuYW1lZCBwYXJhbWV0ZXIuIEdvdCAlc1xuIiwgY21kLT5uYW1lLCBwYXJtX3ZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY3VyX3Bhcm0gPSAmcGFybXNbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWN1cl9wYXJtLT5uYW1lKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghc3VwcHJlc3NfZXJyX3ByaW50KQorICAgICAgICAgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChtb25fc2Vzc2lvbi0+c2Vzc2lvbiwgIk1PTjogJXM+IFRvbyBtYW55IHBhcmFtZXRlcnMuICVzIGlzIHVuZXhwZWN0ZWRcbiIsIGNtZC0+bmFtZSwgcGFybV92YWx1ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChjdXJfcGFybS0+ZmxhZ3MgJiBCQ01DTElfUEFSTV9GTEFHX0FTU0lHTkVEKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIXN1cHByZXNzX2Vycl9wcmludCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChtb25fc2Vzc2lvbi0+c2Vzc2lvbiwgIk1PTjogJXM+IEF0dGVtcHQgdG8gYXNzaWduIHBhcmFtZXRlciAlcyBtb3JlIHRoYW4gb25jZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgY21kLT5uYW1lLCBjdXJfcGFybS0+bmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBhcm1fdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjdXJfcGFybS0+dHlwZSA9PSBCQ01DTElfUEFSTV9TVFJJTkcpCisgICAgICAgICAgICAgICAgY3VyX3Bhcm0tPnZhbHVlLnN0cmluZyA9IHBhcm1fdmFsdWU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmMgPSBfYmNtY2xpX3BhcnNlX3ZhbHVlKG1vbl9zZXNzaW9uLCBjbWQsIGN1cl9wYXJtLCBwYXJtX3ZhbHVlLCBzdXBwcmVzc19lcnJfcHJpbnQpOworICAgICAgICAgICAgICAgIGlmIChyYykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJjOworCisgICAgICAgICAgICAgICAgLyogRm9yIHBhcmFtZXRlci1zZWxlY3RvciBleHRlbmQgbGlzdCBvZiBwYXJhbWV0ZXJzIGFjY29yZGluZ2x5ICovCisgICAgICAgICAgICAgICAgaWYgKGN1cl9wYXJtLT5mbGFncyAmIEJDTUNMSV9QQVJNX0ZMQUdfU0VMRUNUT1IpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByYyA9IF9iY21jbGlfZXh0ZW5kX3Bhcm1fdGFibGUobW9uX3Nlc3Npb24sIGN1cl9wYXJtLCBwYXJtX3ZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJjKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGN1cl9wYXJtLT5mbGFncyB8PSBCQ01DTElfUEFSTV9GTEFHX0FTU0lHTkVEOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBQYXJzZSBwX2luYnVmIHN0cmluZyBiYXNlZCBvbiBwYXJhbWV0ZXIgZGVzY3JpcHRpb25zIGluIDxwX3Rva2VuPi4KKyAqICAgRmlsbCBwYXJhbWV0ZXIgdmFsdWVzIGluIDxwX3Rva2VuPi4KKyAqICAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMgZmlsbGVkIG9yIEJDTV9FUlJfUEFSTQorICogICBUbyBEbzogYWRkIGEgb3B0aW9uIG9mIG9uZS1ieS1vbmUgdXNlciBpbnB1dCBvZiBtaXNzaW5nIHBhcmFtZXRlcnMuCisgKi8KK3N0YXRpYyBpbnQgX2JjbWNsaV9wYXJzZV9wYXJtcyggYmNtY2xpX3Nlc3Npb25fZXh0cmFzICptb25fc2Vzc2lvbiwgYmNtY2xpX2VudHJ5ICpjbWQsIGJjbWNsaV9uYW1lX3ZhbHVlICpwYWlycywgaW50IG5wYWlycykKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKnBhcm1zPW1vbl9zZXNzaW9uLT5jbWRfcGFybXM7CisgICAgaW50IHJjOworICAgIGludCBpOworCisgICAgLyogUG9wdWxhdGUgcGFyYW1ldGVyIHRhYmxlICovCisgICAgcmMgPSBfYmNtY2xpX3BvcHVsYXRlX3Bhcm1zKG1vbl9zZXNzaW9uLCBjbWQsIHBhaXJzLCBucGFpcnMsIEJDTU9TX0ZBTFNFLCBOVUxMKTsKKyAgICBpZiAocmMpCisgICAgICAgIGdvdG8gZXJyX3JldHVybjsKKworCisgICAgcmMgPSBCQ01fRVJSX1BBUk07CisKKyAgICAvKiBNYWtlIHN1cmUgdGhhdCBwYXJhbWV0ZXJzIGFyZSBPSy4gQ2hlY2sgcmFuZ2UsIHByb2Nlc3MgZGVmYXVsdCB2YWx1ZXMgKi8KKyAgICBmb3IgKGk9MDsgaTxtb25fc2Vzc2lvbi0+bnVtX3Bhcm1zOyBpKyspCisgICAgeworICAgICAgICBiY21jbGlfY21kX3Bhcm0gKmN1cl9wYXJtID0gJnBhcm1zW2ldOworCisgICAgICAgIGlmICghKGN1cl9wYXJtLT5mbGFncyAmIEJDTUNMSV9QQVJNX0ZMQUdfQVNTSUdORUQpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKGN1cl9wYXJtLT5mbGFncyAmIEJDTUNMSV9QQVJNX0ZMQUdfREVGVkFMKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdXJfcGFybS0+ZmxhZ3MgfD0gQkNNQ0xJX1BBUk1fRkxBR19BU1NJR05FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCEoY3VyX3Bhcm0tPmZsYWdzICYgQkNNQ0xJX1BBUk1fRkxBR19PUFRJT05BTCkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIE1hbmRhdG9yeSBwYXJhbWV0ZXIgbWlzc2luZyAqLworICAgICAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KG1vbl9zZXNzaW9uLT5zZXNzaW9uLCAiTU9OOiAlcz4gTWFuZGF0b3J5IHBhcmFtZXRlciA8JXM+IGlzIG1pc3NpbmdcbiIsIGNtZC0+bmFtZSwgcGFybXNbaV0ubmFtZSk7CisgICAgICAgICAgICAgICAgZ290byBlcnJfcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogQ2hlY2sgdmFsdWUgKi8KKyAgICAgICAgaWYgKChjdXJfcGFybS0+ZmxhZ3MgJiBCQ01DTElfUEFSTV9GTEFHX1JBTkdFKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChjdXJfcGFybS0+ZmxhZ3MgJiBCQ01DTElfUEFSTV9GTEFHX0FTU0lHTkVEKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY3VyX3Bhcm0tPmFycmF5X3NpemUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBqOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjdXJfcGFybS0+YXJyYXlfc2l6ZTsgaisrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKChjdXJfcGFybS0+dmFsdWVzW2pdLm51bWJlciA8IGN1cl9wYXJtLT5sb3dfdmFsKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjdXJfcGFybS0+dmFsdWVzW2pdLm51bWJlciA+IGN1cl9wYXJtLT5oaV92YWwpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChtb25fc2Vzc2lvbi0+c2Vzc2lvbiwgIk1PTjogJXM+IDwlcz46ICVsZCBvdXQgb2YgcmFuZ2UgKCVsZCwgJWxkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLT5uYW1lLCBjdXJfcGFybS0+bmFtZSwgY3VyX3Bhcm0tPnZhbHVlc1tqXS5udW1iZXIsIGN1cl9wYXJtLT5sb3dfdmFsLCBjdXJfcGFybS0+aGlfdmFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycl9yZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoKChjdXJfcGFybS0+dmFsdWUubnVtYmVyIDwgY3VyX3Bhcm0tPmxvd192YWwpIHx8CisgICAgICAgICAgICAgICAgICAgIChjdXJfcGFybS0+dmFsdWUubnVtYmVyID4gY3VyX3Bhcm0tPmhpX3ZhbCkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQobW9uX3Nlc3Npb24tPnNlc3Npb24sICJNT046ICVzPiA8JXM+OiAlbGQgb3V0IG9mIHJhbmdlICglbGQsICVsZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBjbWQtPm5hbWUsIGN1cl9wYXJtLT5uYW1lLCBjdXJfcGFybS0+dmFsdWUubnVtYmVyLCBjdXJfcGFybS0+bG93X3ZhbCwgY3VyX3Bhcm0tPmhpX3ZhbCk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyX3JldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKKworZXJyX3JldHVybjoKKyAgICBfYmNtY2xpX2ZyZWVfc2Vzc2lvbl92YWx1ZV9zdGF0dXMobW9uX3Nlc3Npb24pOworICAgIHJldHVybiByYzsKK30KKworLyogaW5zZXJ0IHZhbHVlIHNraXBwaW5nIHBhcnRpYWwgbWF0Y2ggdHJoYXQgaXMgYWxyZWFkeSBwcmVzZW50ICovCitzdGF0aWMgdm9pZCBfYmNtY2xpX2luc2VydChjb25zdCBjaGFyICpwYXJ0aWFsX21hdGNoLCBjb25zdCBjaGFyICppbnNlcnRfdmFsMSwKKyAgICBjb25zdCBjaGFyICppbnNlcnRfdmFsMiwgY2hhciAqaW5zZXJ0X3N0ciwgdWludDMyX3QgaW5zZXJ0X3NpemUpCit7CisgICAgaWYgKHBhcnRpYWxfbWF0Y2gpCisgICAgICAgIGluc2VydF92YWwxICs9IHN0cmxlbihwYXJ0aWFsX21hdGNoKTsKKyAgICBiY21jbGlfc3RybmNweShpbnNlcnRfc3RyLCBpbnNlcnRfdmFsMSwgaW5zZXJ0X3NpemUpOworICAgIGlmIChpbnNlcnRfdmFsMikKKyAgICAgICAgYmNtY2xpX3N0cm5jYXQoaW5zZXJ0X3N0ciwgaW5zZXJ0X3ZhbDIsIGluc2VydF9zaXplKTsKK30KKworc3RhdGljIHZvaWQgX2JjbWNsaV91cGRhdGVfbG9uZ2VzdF9tYXRjaChjaGFyICpsb25nZXN0X21hdGNoLCBjb25zdCBjaGFyICpuYW1lKQoreworICAgIHVpbnQzMl90IG5sZW4gPSBzdHJsZW4obmFtZSk7CisgICAgdWludDMyX3QgbG1sZW4gPSBzdHJsZW4obG9uZ2VzdF9tYXRjaCk7CisKKyAgICBpZiAobmxlbiA8IGxtbGVuKQorICAgIHsKKyAgICAgICAgbG1sZW4gPSBubGVuOworICAgIH0KKyAgICB3aGlsZSAobG1sZW4gJiYgbWVtY21wKGxvbmdlc3RfbWF0Y2gsIG5hbWUsIGxtbGVuKSkKKyAgICB7CisgICAgICAgIC0tbG1sZW47CisgICAgfQorICAgIGxvbmdlc3RfbWF0Y2hbbG1sZW5dID0gMDsKK30KKworCisvKiBleHRlbmQgdmFsdWUuCisgKiBJZiAhZW51bSAtIGRvIG5vdGhpbmcKKyAqIElmIG1vcmUgdGhhbiAxIG1hdGNoaW5nIHZhbHVlIC0gZGlzcGxheSB0aGVtCisgKiBJZiBubyBtYXRjaGluZyB2YWx1ZSAtIGRvIG5vdGhpbmcKKyAqIElmIDEgbWF0Y2hpbmcgdmFsdWUgLSBpbnNlcnQKKyAqLworc3RhdGljIHZvaWQgX2JjbWNsaV9leHRlbmRfdmFsdWUoYmNtY2xpX3Nlc3Npb25fZXh0cmFzICptb25fc2Vzc2lvbiwgYmNtY2xpX2NtZF9wYXJtICpwYXJtLAorICAgIGNvbnN0IGNoYXIgKnBhcnRpYWxfdmFsdWUsIGNoYXIgKmluc2VydF9zdHIsIHVpbnQzMl90IGluc2VydF9zaXplKQoreworICAgIGludCBubWF0Y2ggPSAwOworICAgIGJjbWNsaV9lbnVtX3ZhbCAqdmFscyA9IHBhcm0tPmVudW1fdGFibGU7CisgICAgY2hhciBsb25nZXN0X21hdGNoW0JDTUNMSV9NQVhfU0VBUkNIX1NVQlNUUl9MRU5HVEhdPSIiOworCisgICAgaWYgKChwYXJtLT50eXBlICE9IEJDTUNMSV9QQVJNX0VOVU0gJiYgcGFybS0+dHlwZSAhPSBCQ01DTElfUEFSTV9FTlVNX01BU0spIHx8ICF2YWxzKQorICAgICAgICByZXR1cm47CisKKyAgICAvKiBJZiBlbnVtIG1hc2ssIHBhcnRpYWwgdmFsdWUgY2FuIGJlIGEgc3VtIG9mIHZhbHVlcy4gU2tpcCBwYXN0IHRoZSBsYXN0ICcrJyBzaWduICovCisgICAgaWYgKHBhcm0tPnR5cGUgPT0gQkNNQ0xJX1BBUk1fRU5VTV9NQVNLICYmIHBhcnRpYWxfdmFsdWUpCisgICAgeworICAgICAgICBjaGFyICpwZGVsID0gc3RycmNocihwYXJ0aWFsX3ZhbHVlLCBCQ01DTElfRU5VTV9NQVNLX0RFTF9DSEFSKTsKKyAgICAgICAgaWYgKHBkZWwpCisgICAgICAgICAgICBwYXJ0aWFsX3ZhbHVlID0gcGRlbCArIDE7CisgICAgfQorCisgICAgd2hpbGUgKHZhbHMtPm5hbWUpCisgICAgeworICAgICAgICBpZiAoIXBhcnRpYWxfdmFsdWUgfHwgIXN0cm5jbXAodmFscy0+bmFtZSwgcGFydGlhbF92YWx1ZSwgc3RybGVuKHBhcnRpYWxfdmFsdWUpKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFubWF0Y2gpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtY2xpX3N0cm5jcHkobG9uZ2VzdF9tYXRjaCwgdmFscy0+bmFtZSwgc2l6ZW9mKGxvbmdlc3RfbWF0Y2gpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfYmNtY2xpX3VwZGF0ZV9sb25nZXN0X21hdGNoKGxvbmdlc3RfbWF0Y2gsIHZhbHMtPm5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKytubWF0Y2g7CisgICAgICAgIH0KKyAgICAgICAgKyt2YWxzOworICAgIH0KKyAgICBpZiAoIW5tYXRjaCkKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChubWF0Y2ggPT0gMSkKKyAgICB7CisgICAgICAgIF9iY21jbGlfaW5zZXJ0KHBhcnRpYWxfdmFsdWUsIGxvbmdlc3RfbWF0Y2gsICIgIiwgaW5zZXJ0X3N0ciwgaW5zZXJ0X3NpemUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8qIGRpc3BsYXkgYWxsIG1hdGNoaW5nIHZhbHVlcyAqLworICAgIF9iY21jbGlfaW5zZXJ0KHBhcnRpYWxfdmFsdWUsIGxvbmdlc3RfbWF0Y2gsICIiLCBpbnNlcnRfc3RyLCBpbnNlcnRfc2l6ZSk7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQobW9uX3Nlc3Npb24tPnNlc3Npb24sICJcbiIpOworICAgIHZhbHMgPSBwYXJtLT5lbnVtX3RhYmxlOworICAgIHdoaWxlICh2YWxzLT5uYW1lKQorICAgIHsKKyAgICAgICAgaWYgKCFwYXJ0aWFsX3ZhbHVlIHx8ICFzdHJuY21wKHZhbHMtPm5hbWUsIHBhcnRpYWxfdmFsdWUsIHN0cmxlbihwYXJ0aWFsX3ZhbHVlKSkpCisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChtb25fc2Vzc2lvbi0+c2Vzc2lvbiwgIiAlcyIsIHZhbHMtPm5hbWUpOworICAgICAgICArK3ZhbHM7CisgICAgfQorICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KG1vbl9zZXNzaW9uLT5zZXNzaW9uLCAiXG4iKTsKK30KKworLyogY2FsY3VsYXRlIG51bWJlciBvZiBtYXRjaGluZyBwYXJhbWV0ZXIgbmFtZXMgKi8KK3N0YXRpYyBpbnQgX2JjbWNsaV9udW1fbWF0Y2hpbmdfbmFtZXMoYmNtY2xpX3Nlc3Npb25fZXh0cmFzICptb25fc2Vzc2lvbiwgY29uc3QgY2hhciAqcGFydGlhbF92YWx1ZSwgaW50ICpmaXJzdF9tYXRjaCkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgbm1hdGNoID0gMDsKKworICAgICpmaXJzdF9tYXRjaCA9IC0xOworICAgIGZvciAoaSA9IDA7IGkgPCBtb25fc2Vzc2lvbi0+bnVtX3Bhcm1zOyBpKyspCisgICAgeworICAgICAgICB1aW50MzJfdCBmbGFncyA9IG1vbl9zZXNzaW9uLT5jbWRfcGFybXNbaV0uZmxhZ3M7CisgICAgICAgIGlmICgoZmxhZ3MgJiBCQ01DTElfUEFSTV9GTEFHX0FTU0lHTkVEKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAocGFydGlhbF92YWx1ZSAmJiBzdHJuY21wKG1vbl9zZXNzaW9uLT5jbWRfcGFybXNbaV0ubmFtZSwgcGFydGlhbF92YWx1ZSwgc3RybGVuKHBhcnRpYWxfdmFsdWUpKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoKmZpcnN0X21hdGNoID09IC0xKQorICAgICAgICAgICAgKmZpcnN0X21hdGNoID0gaTsKKyAgICAgICAgKytubWF0Y2g7CisgICAgfQorICAgIHJldHVybiBubWF0Y2g7Cit9CisKKy8qIGNhbGN1bGF0ZSBsb25nZXN0IG1hdGNoaW5nIHN0cmluZy4KKyAqIHJldHVybnMgbnVtYmVyIG9mIG1hdGNoaW5nIHBhcmFtZXRlcnMKKyAqLworc3RhdGljIGludCBfYmNtY2xpX2xvbmdlc3RfbWF0Y2goYmNtY2xpX3Nlc3Npb25fZXh0cmFzICptb25fc2Vzc2lvbiwgY29uc3QgY2hhciAqcGFydGlhbF92YWx1ZSwKKyAgICBjaGFyICpsb25nZXN0X21hdGNoLCB1aW50MzJfdCBsb25nZXN0X21hdGNoX3NpemUsIGludCAqZmlyc3RfbWF0Y2gpCit7CisgICAgaW50IG5tYXRjaDAgPSBfYmNtY2xpX251bV9tYXRjaGluZ19uYW1lcyhtb25fc2Vzc2lvbiwgcGFydGlhbF92YWx1ZSwgZmlyc3RfbWF0Y2gpOworICAgIGludCBubWF0Y2g7CisgICAgY29uc3QgY2hhciAqbWF0Y2hfbmFtZTsKKworICAgIGlmICghbm1hdGNoMCkKKyAgICAgICAgcmV0dXJuIG5tYXRjaDA7CisgICAgbWF0Y2hfbmFtZSA9IG1vbl9zZXNzaW9uLT5jbWRfcGFybXNbKmZpcnN0X21hdGNoXS5uYW1lOworICAgIGlmIChubWF0Y2gwID09IDEpCisgICAgeworICAgICAgICBiY21jbGlfc3RybmNweShsb25nZXN0X21hdGNoLCBtYXRjaF9uYW1lLCBsb25nZXN0X21hdGNoX3NpemUpOworICAgICAgICByZXR1cm4gbm1hdGNoMDsKKyAgICB9CisgICAgYmNtY2xpX3N0cm5jcHkobG9uZ2VzdF9tYXRjaCwgbWF0Y2hfbmFtZSwgbG9uZ2VzdF9tYXRjaF9zaXplKTsKKyAgICBubWF0Y2ggPSBfYmNtY2xpX251bV9tYXRjaGluZ19uYW1lcyhtb25fc2Vzc2lvbiwgbG9uZ2VzdF9tYXRjaCwgZmlyc3RfbWF0Y2gpOworICAgIHdoaWxlIChubWF0Y2ggIT0gbm1hdGNoMCkKKyAgICB7CisgICAgICAgIGxvbmdlc3RfbWF0Y2hbc3RybGVuKGxvbmdlc3RfbWF0Y2gpLTFdID0gMDsKKyAgICAgICAgbm1hdGNoID0gX2JjbWNsaV9udW1fbWF0Y2hpbmdfbmFtZXMobW9uX3Nlc3Npb24sIGxvbmdlc3RfbWF0Y2gsIGZpcnN0X21hdGNoKTsKKyAgICB9CisgICAgcmV0dXJuIG5tYXRjaDA7Cit9CisKKy8qIGRpc3BsYXkvaW5zZXJ0IHVuc2V0IG1hdGNoaW5nIG5hbWVzCisgKiBJZiBtb3JlIHRoYW4gMSBtYXRjaGluZyB2YWx1ZSAtIGRpc3BsYXkgdGhlbQorICogSWYgbm8gbWF0Y2hpbmcgdmFsdWUgLSBkbyBub3RoaW5nCisgKiBJZiAxIG1hdGNoaW5nIHZhbHVlIC0gaW5zZXJ0CisgKi8KK3N0YXRpYyB2b2lkIF9iY21jbGlfZXh0ZW5kX25hbWUoYmNtY2xpX3Nlc3Npb25fZXh0cmFzICptb25fc2Vzc2lvbiwgY29uc3QgY2hhciAqcGFydGlhbF92YWx1ZSwKKyAgICBjaGFyICppbnNlcnRfc3RyLCB1aW50MzJfdCBpbnNlcnRfc2l6ZSkKK3sKKyAgICBjaGFyIGxvbmdlc3RfbWF0Y2hbQkNNQ0xJX01BWF9TRUFSQ0hfU1VCU1RSX0xFTkdUSF09IiI7CisgICAgaW50IGZpcnN0X21hdGNoOworICAgIGludCBubWF0Y2ggPSBfYmNtY2xpX2xvbmdlc3RfbWF0Y2gobW9uX3Nlc3Npb24sIHBhcnRpYWxfdmFsdWUsIGxvbmdlc3RfbWF0Y2gsCisgICAgICAgIHNpemVvZihsb25nZXN0X21hdGNoKSwgJmZpcnN0X21hdGNoKTsKKworICAgIGlmICghbm1hdGNoKQorICAgICAgICByZXR1cm47CisgICAgaWYgKCFwYXJ0aWFsX3ZhbHVlIHx8IHN0cmNtcChwYXJ0aWFsX3ZhbHVlLCBsb25nZXN0X21hdGNoKSkKKyAgICAgICAgX2JjbWNsaV9pbnNlcnQocGFydGlhbF92YWx1ZSwgbG9uZ2VzdF9tYXRjaCwgKG5tYXRjaCA9PSAxKSA/ICI9IiA6ICIiLCBpbnNlcnRfc3RyLCBpbnNlcnRfc2l6ZSk7CisgICAgZWxzZQorICAgICAgICBfYmNtY2xpX2hlbHBfcG9wdWxhdGVkX2NtZChtb25fc2Vzc2lvbiwgbW9uX3Nlc3Npb24tPmN1cmNtZCwgcGFydGlhbF92YWx1ZSwgQkNNT1NfVFJVRSk7Cit9CisKK3N0YXRpYyBpbnQgX2JjbWNsaV9leHRlbmRfcGFybXMoIGJjbWNsaV9zZXNzaW9uX2V4dHJhcyAqbW9uX3Nlc3Npb24sIGJjbWNsaV9uYW1lX3ZhbHVlICpwYWlycywKKyAgICBpbnQgbnBhaXJzLCBiY21vc19ib29sIGxhc3RfaXNfc3BhY2UsIGNoYXIgKmluc2VydF9zdHIsIHVpbnQzMl90IGluc2VydF9zaXplKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGludCBsYXN0ID0gMDsKKyAgICBiY21jbGlfY21kX3Bhcm0gKmhlbHBfcGFybSA9IE5VTEw7CisgICAgaW50IGk7CisKKyAgICByYyA9IF9iY21jbGlfcG9wdWxhdGVfcGFybXMobW9uX3Nlc3Npb24sIG1vbl9zZXNzaW9uLT5jdXJjbWQsIHBhaXJzLCBucGFpcnMsIEJDTU9TX1RSVUUsICZsYXN0KTsKKyAgICBpZiAoIXJjKQorICAgIHsKKyAgICAgICAgLyogU28gZmFyIHNvIGdvb2QgKi8KKyAgICAgICAgLyogSWYgdGhlcmUgaXMgdW5zZXQgbWFuZGF0b3J5IHBhcmFtZXRlciAtIGluc2VydCBpdHMgbmFtZS4KKyAgICAgICAgICogT3RoZXJ3aXNlLCBkaXNwbGF5IGxpc3Qgb2YgdW5zZXQgcGFyYW1ldGVycworICAgICAgICAgKi8KKyAgICAgICAgLyogRmluZCBtYW5kYXRvcnkgcGFyYW1ldGVyIHRoYXQgaXMgc3RpbGwgdW5hc3NpZ25lZCAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbW9uX3Nlc3Npb24tPm51bV9wYXJtczsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IG1vbl9zZXNzaW9uLT5jbWRfcGFybXNbaV0uZmxhZ3M7CisgICAgICAgICAgICBpZiAoIShmbGFncyAmIChCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMIHwgQkNNQ0xJX1BBUk1fRkxBR19ERUZWQUwgfCBCQ01DTElfUEFSTV9GTEFHX0FTU0lHTkVEKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGVscF9wYXJtID0gJm1vbl9zZXNzaW9uLT5jbWRfcGFybXNbaV07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhlbHBfcGFybSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFsYXN0X2lzX3NwYWNlKQorICAgICAgICAgICAgICAgIGJjbWNsaV9zdHJuY3B5KGluc2VydF9zdHIsICIgIiwgaW5zZXJ0X3NpemUpOworICAgICAgICAgICAgYmNtY2xpX3N0cm5jYXQoaW5zZXJ0X3N0ciwgaGVscF9wYXJtLT5uYW1lLCBpbnNlcnRfc2l6ZSk7CisgICAgICAgICAgICBiY21jbGlfc3RybmNhdChpbnNlcnRfc3RyLCAiPSIsIGluc2VydF9zaXplKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChsYXN0IDwgbW9uX3Nlc3Npb24tPm51bV9wYXJtcykKKyAgICAgICAgICAgIF9iY21jbGlfaGVscF9wb3B1bGF0ZWRfY21kKG1vbl9zZXNzaW9uLCBtb25fc2Vzc2lvbi0+Y3VyY21kLCBOVUxMLCBCQ01PU19UUlVFKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogUGFyc2luZyBmYWlsZWQuIFNlZSB3aGF0IHN0b3BwZWQgYXQgKi8KKyAgICAgICAgaWYgKGxhc3QgPCBtb25fc2Vzc2lvbi0+bnVtX3Bhcm1zKQorICAgICAgICB7CisgICAgICAgICAgICBiY21jbGlfbmFtZV92YWx1ZSAqbGFzdF9wYWlyOworCisgICAgICAgICAgICBsYXN0X3BhaXIgPSAmcGFpcnNbbGFzdF07CisgICAgICAgICAgICBpZiAobGFzdF9wYWlyLT5uYW1lKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFRyeSB0byBpZGVudGlmeSBieSBuYW1lICovCisgICAgICAgICAgICAgICAgaGVscF9wYXJtID0gX2JjbWNsaV9maW5kX25hbWVkX3Bhcm0obW9uX3Nlc3Npb24sIGxhc3RfcGFpci0+bmFtZSA/IGxhc3RfcGFpci0+bmFtZSA6IGxhc3RfcGFpci0+dmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGhlbHBfcGFybSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBMb29raW5nIGZvciB2YWx1ZXMgKi8KKyAgICAgICAgICAgICAgICBfYmNtY2xpX2V4dGVuZF92YWx1ZShtb25fc2Vzc2lvbiwgaGVscF9wYXJtLCBsYXN0X3BhaXItPnZhbHVlLCBpbnNlcnRfc3RyLCBpbnNlcnRfc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogTG9va2luZyBmb3IgcGFydGlhbCBuYW1lICovCisgICAgICAgICAgICAgICAgX2JjbWNsaV9leHRlbmRfbmFtZShtb25fc2Vzc2lvbiwgbGFzdF9wYWlyLT5uYW1lID8gbGFzdF9wYWlyLT5uYW1lIDogbGFzdF9wYWlyLT52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgaW5zZXJ0X3N0ciwgaW5zZXJ0X3NpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIF9iY21jbGlfZnJlZV9zZXNzaW9uX3ZhbHVlX3N0YXR1cyhtb25fc2Vzc2lvbik7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogSWRlbnRpZnkgdG9rZW4gaW4gdGhlIGdpdmVuIGRpcmVjdG9yeSAqLworc3RhdGljIGJjbWNsaV9lbnRyeSAqX2JjbWNsaV9zZWFyY2hfdG9rZW4xKCBiY21jbGlfZW50cnkgKnBfZGlyLCBjb25zdCBjaGFyICoqcF9uYW1lLCBpbnQgbmFtZV9sZW4gKQoreworICAgIGJjbWNsaV9lbnRyeSAqcF90b2tlbiA9IE5VTEw7CisgICAgY29uc3QgY2hhciAqbmFtZSA9ICpwX25hbWU7CisgICAgYmNtY2xpX3Rva2VuX3R5cGUgdHlwZT1fYmNtY2xpX2FuYWx5emVfdG9rZW4obmFtZSk7CisKKyAgICAvKiBOYW1lIGNhbiBiZSBxdWFsaWZpZWQgKi8KKyAgICBpZiAodHlwZSA9PSBCQ01DTElfVE9LRU5fVkFMVUUgJiYgIXN0cm5jbXAobmFtZSwgQkNNQ0xJX1VQX1NUUiwgbmFtZV9sZW4pKQorICAgICAgICB0eXBlID0gQkNNQ0xJX1RPS0VOX1VQOworCisgICAgc3dpdGNoKHR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTUNMSV9UT0tFTl9ST09UOgorICAgICAgICAgICAgcF90b2tlbiA9IF9iY21jbGlfcm9vdF9kaXI7CisgICAgICAgICAgICAqcF9uYW1lID0gbmFtZSArIHN0cmxlbihCQ01DTElfUk9PVF9TVFIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNQ0xJX1RPS0VOX1VQOgorICAgICAgICAgICAgaWYgKHBfZGlyLT5wYXJlbnQpCisgICAgICAgICAgICAgICAgcF90b2tlbiA9IHBfZGlyLT5wYXJlbnQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcF90b2tlbiA9IHBfZGlyOworICAgICAgICAgICAgKnBfbmFtZSA9IG5hbWUgKyBzdHJsZW4oQkNNQ0xJX1VQX1NUUikgKyAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNQ0xJX1RPS0VOX05BTUU6CisgICAgICAgIGNhc2UgQkNNQ0xJX1RPS0VOX1ZBTFVFOgorICAgICAgICAgICAgLyogQ2hlY2sgYWxpYXMgKi8KKyAgICAgICAgICAgIHBfdG9rZW4gPSBwX2Rpci0+dS5kaXIuZmlyc3Q7CisgICAgICAgICAgICB3aGlsZSAoIHBfdG9rZW4gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwX3Rva2VuLT5hbGlhcyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKG5hbWVfbGVuID09IHBfdG9rZW4tPmFsaWFzX2xlbikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICFfYmNtY2xpX3N0cmljbXAocF90b2tlbi0+YWxpYXMsIG5hbWUsIHBfdG9rZW4tPmFsaWFzX2xlbikpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHBfdG9rZW4gPSBwX3Rva2VuLT5uZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFwX3Rva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbWNsaV9lbnRyeSAqcGFydGlhbF9tYXRjaCA9IE5VTEw7CisgICAgICAgICAgICAgICAgLyogQ2hlY2sgbmFtZSAqLworICAgICAgICAgICAgICAgIHBfdG9rZW4gPSBwX2Rpci0+dS5kaXIuZmlyc3Q7CisgICAgICAgICAgICAgICAgd2hpbGUoIHBfdG9rZW4gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFfYmNtY2xpX3N0cmljbXAocF90b2tlbi0+bmFtZSwgbmFtZSwgbmFtZV9sZW4pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZV9sZW4gPT0gc3RybGVuKHBfdG9rZW4tPm5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJ0aWFsX21hdGNoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpYWxfbWF0Y2ggPSBwX3Rva2VuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBfdG9rZW4gPSBwX3Rva2VuLT5uZXh0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIXBfdG9rZW4pCisgICAgICAgICAgICAgICAgICAgIHBfdG9rZW4gPSBwYXJ0aWFsX21hdGNoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnBfbmFtZSA9IG5hbWUgKyBuYW1lX2xlbiArIDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBwX3Rva2VuOworfQorCisKKy8qIFNlYXJjaCBhIHRva2VuIGJ5IG5hbWUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgorICogVGhlIG5hbWUgY2FuIGJlIHF1YWxpZmllZCAoY29udGFpbiBwYXRoKQorICovCitzdGF0aWMgYmNtY2xpX2VudHJ5ICpfYmNtY2xpX3NlYXJjaF90b2tlbiggYmNtY2xpX2VudHJ5ICpwX2RpciwgY29uc3QgY2hhciAqbmFtZSApCit7CisgICAgYmNtY2xpX2VudHJ5ICpwX3Rva2VuOworICAgIGNvbnN0IGNoYXIgKm5hbWUwID0gbmFtZTsKKyAgICBjb25zdCBjaGFyICpwX3NsYXNoOworCisgICAgaWYgKCFuYW1lWzBdKQorICAgICAgICByZXR1cm4gcF9kaXI7CisKKyAgICAvKiBDaGVjayBpZiBuYW1lIGlzIHF1YWxpZmllZCAqLworICAgIGRvCisgICAgeworICAgICAgICBwX3NsYXNoID0gc3RyY2hyKG5hbWUsICcvJyk7CisgICAgICAgIGlmIChwX3NsYXNoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocF9zbGFzaCA9PSBuYW1lMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwX2RpciA9IHBfdG9rZW4gPSBfYmNtY2xpX3Jvb3RfZGlyOworICAgICAgICAgICAgICAgIG5hbWUgPSBwX3NsYXNoICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwX3Rva2VuID0gX2JjbWNsaV9zZWFyY2hfdG9rZW4xKHBfZGlyLCAmbmFtZSwgcF9zbGFzaCAtIG5hbWUpOworICAgICAgICAgICAgICAgIGlmIChwX3Rva2VuICYmIChwX3Rva2VuLT5zZWwgPT0gQkNNQ0xJX0VOVFJZX0RJUikpCisgICAgICAgICAgICAgICAgICAgIHBfZGlyID0gcF90b2tlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBfdG9rZW4gPSBfYmNtY2xpX3NlYXJjaF90b2tlbjEocF9kaXIsICZuYW1lLCBzdHJsZW4obmFtZSkpOworICAgICAgICB9CisgICAgfSB3aGlsZSAocF9zbGFzaCAmJiBwX3Rva2VuICYmICpuYW1lKTsKKworICAgIHJldHVybiBwX3Rva2VuOworfQorCisKKworLyogRGlzcGxheSBoZWxwIGZvciBlYWNoIGVudHJ5IGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSAqLworc3RhdGljIHZvaWQgIF9iY21jbGlfaGVscF9kaXIoYmNtY2xpX3Nlc3Npb25fZXh0cmFzICptb25fc2Vzc2lvbiwgYmNtY2xpX2VudHJ5ICpwX2RpcikKK3sKKyAgICBiY21jbGlfc2Vzc2lvbiAqaGVscF9zZXNzaW9uID0gX2JjbWNsaV9oZWxwX3Nlc3Npb25fb3Blbihtb25fc2Vzc2lvbi0+c2Vzc2lvbik7CisgICAgYmNtY2xpX2VudHJ5ICpwX3Rva2VuOworICAgIGNoYXIgYnVmZmVyW0JDTUNMSV9NQVhfUVVBTF9OQU1FX0xFTkdUSF07CisKKyAgICBfYmNtY2xpX3F1YWxpZmllZF9uYW1lKHBfZGlyLCBidWZmZXIsIHNpemVvZihidWZmZXIpKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChoZWxwX3Nlc3Npb24sICJEaXJlY3RvcnkgJXMvIC0gJXNcbiIsIGJ1ZmZlciwgcF9kaXItPmhlbHApOworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KGhlbHBfc2Vzc2lvbiwgIkNvbW1hbmRzOlxuIik7CisKKyAgICBwX3Rva2VuID0gcF9kaXItPnUuZGlyLmZpcnN0OworICAgIHdoaWxlICggcF90b2tlbiApCisgICAgeworICAgICAgICBpZiAoYmNtY2xpX3Nlc3Npb25fYWNjZXNzX3JpZ2h0KGhlbHBfc2Vzc2lvbikgPj0gcF90b2tlbi0+YWNjZXNzX3JpZ2h0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocF90b2tlbi0+c2VsID09IEJDTUNMSV9FTlRSWV9ESVIpCisgICAgICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoaGVscF9zZXNzaW9uLCAiXHQlcy86ICAlcyBkaXJlY3RvcnlcbiIsIHBfdG9rZW4tPm5hbWUsIHBfdG9rZW4tPmhlbHAgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFyICpwZW9sID0gc3RyY2hyKHBfdG9rZW4tPmhlbHAsICdcbicpOworICAgICAgICAgICAgICAgIGludCBoZWxwX2xlbiA9IHBlb2wgPyBwZW9sIC0gcF90b2tlbi0+aGVscCA6IChpbnQpc3RybGVuKHBfdG9rZW4tPmhlbHApOworICAgICAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KGhlbHBfc2Vzc2lvbiwgIlx0JXMoJWQgcGFybXMpOiAlLipzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfdG9rZW4tPm5hbWUsIHBfdG9rZW4tPnUuY21kLm51bV9wYXJtcywgaGVscF9sZW4sIHBfdG9rZW4tPmhlbHAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwX3Rva2VuID0gcF90b2tlbi0+bmV4dDsKKyAgICB9CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoaGVscF9zZXNzaW9uLCAiVHlwZSA/IDxuYW1lPiBmb3IgY29tbWFuZCBoZWxwLCBcIi9cIi1yb290LCBcIi4uXCItdXBwZXJcbiIgKTsKKyAgICBfYmNtY2xpX2hlbHBfc2Vzc2lvbl9wcmludF9hbmRfY2xvc2UobW9uX3Nlc3Npb24tPnNlc3Npb24sIGhlbHBfc2Vzc2lvbik7Cit9CisKKworLyogRGlzcGxheSBoZWxwIGEgdG9rZW4gKi8KK3N0YXRpYyB2b2lkIF9iY21jbGlfaGVscF9wb3B1bGF0ZWRfY21kKGJjbWNsaV9zZXNzaW9uX2V4dHJhcyAqbW9uX3Nlc3Npb24sIGJjbWNsaV9lbnRyeSAqcF90b2tlbiwKKyAgICBjb25zdCBjaGFyICpwYXJ0aWFsX21hdGNoLCBiY21vc19ib29sIHN1cHByZXNzX2Fzc2lnbmVkKQoreworICAgIGNoYXIgdG1wWzgwXTsKKyAgICBjaGFyIGJyYSwga2V0OworICAgIHVpbnQxNl90IGk7CisKKyAgICBpZiAoc3VwcHJlc3NfYXNzaWduZWQpCisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KG1vbl9zZXNzaW9uLT5zZXNzaW9uLCAiXG4iKTsKKyAgICBmb3IgKCBpPTA7IGk8bW9uX3Nlc3Npb24tPm51bV9wYXJtczsgaSsrICkKKyAgICB7CisgICAgICAgIGJjbWNsaV9jbWRfcGFybSAqY3VyX3Bhcm0gPSAmbW9uX3Nlc3Npb24tPmNtZF9wYXJtc1tpXTsKKyAgICAgICAgaWYgKHN1cHByZXNzX2Fzc2lnbmVkICYmIChjdXJfcGFybS0+ZmxhZ3MgJiBCQ01DTElfUEFSTV9GTEFHX0FTU0lHTkVEKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAocGFydGlhbF9tYXRjaCAmJiBtZW1jbXAocGFydGlhbF9tYXRjaCwgY3VyX3Bhcm0tPm5hbWUsIHN0cmxlbihwYXJ0aWFsX21hdGNoKSkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAoKGN1cl9wYXJtLT5mbGFncyAmIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwpKQorICAgICAgICB7CisgICAgICAgICAgICBicmEgPSAnWyc7CisgICAgICAgICAgICBrZXQ9J10nOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYnJhID0gJzwnOworICAgICAgICAgICAga2V0PSc+JzsKKyAgICAgICAgfQorICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChtb25fc2Vzc2lvbi0+c2Vzc2lvbiwgIlx0JWMlcyglcykiLCBicmEsIGN1cl9wYXJtLT5uYW1lLCBfYmNtY2xpX2dldF90eXBlX25hbWUoY3VyX3Bhcm0pICk7CisgICAgICAgIGlmIChjdXJfcGFybS0+bWF4X2FycmF5X3NpemUgfHwgY3VyX3Bhcm0tPnR5cGUgPT0gQkNNQ0xJX1BBUk1fQlVGRkVSKQorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBudW1fZW50cmllcyA9IChjdXJfcGFybS0+dHlwZSA9PSBCQ01DTElfUEFSTV9CVUZGRVIpID8gY3VyX3Bhcm0tPnZhbHVlLmJ1ZmZlci5sZW4gOiBjdXJfcGFybS0+bWF4X2FycmF5X3NpemU7CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChtb25fc2Vzc2lvbi0+c2Vzc2lvbiwgIlsldV0iLCBudW1fZW50cmllcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGN1cl9wYXJtLT50eXBlID09IEJDTUNMSV9QQVJNX0VOVU0gfHwgY3VyX3Bhcm0tPnR5cGUgPT0gQkNNQ0xJX1BBUk1fRU5VTV9NQVNLKQorICAgICAgICB7CisgICAgICAgICAgICBiY21jbGlfZW51bV92YWwgKnZhbHVlcz1jdXJfcGFybS0+ZW51bV90YWJsZTsKKyAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KG1vbl9zZXNzaW9uLT5zZXNzaW9uLCAiIHsiKTsKKyAgICAgICAgICAgIHdoaWxlICh2YWx1ZXMtPm5hbWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlcyE9Y3VyX3Bhcm0tPmVudW1fdGFibGUpCisgICAgICAgICAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KG1vbl9zZXNzaW9uLT5zZXNzaW9uLCAiLCAiKTsKKyAgICAgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChtb25fc2Vzc2lvbi0+c2Vzc2lvbiwgIiVzIiwgdmFsdWVzLT5uYW1lKTsKKyAgICAgICAgICAgICAgICArK3ZhbHVlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KG1vbl9zZXNzaW9uLT5zZXNzaW9uLCAifSIpOworICAgICAgICB9CisgICAgICAgIGlmICgoY3VyX3Bhcm0tPmZsYWdzICYgQkNNQ0xJX1BBUk1fRkxBR19ERUZWQUwpKQorICAgICAgICB7CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChtb25fc2Vzc2lvbi0+c2Vzc2lvbiwgIj0iKTsKKyAgICAgICAgICAgIGN1cl9wYXJtLT5mb3JtYXRfY2IoY3VyX3Bhcm0sIGN1cl9wYXJtLT52YWx1ZSwgdG1wLCBzaXplb2YodG1wKSk7CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChtb25fc2Vzc2lvbi0+c2Vzc2lvbiwgIiVzIiwgdG1wKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGN1cl9wYXJtLT5mbGFncyAmIEJDTUNMSV9QQVJNX0ZMQUdfUkFOR0UpKQorICAgICAgICB7CisgICAgICAgICAgICBiY21jbGlfcGFybV92YWx1ZSBsb3dfdmFsID0geyAubnVtYmVyID0gY3VyX3Bhcm0tPmxvd192YWwgfTsKKyAgICAgICAgICAgIGJjbWNsaV9wYXJtX3ZhbHVlIGhpX3ZhbCA9IHsgLm51bWJlciA9IGN1cl9wYXJtLT5oaV92YWwgfTsKKworICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQobW9uX3Nlc3Npb24tPnNlc3Npb24sICIgKCIpOworICAgICAgICAgICAgY3VyX3Bhcm0tPmZvcm1hdF9jYihjdXJfcGFybSwgbG93X3ZhbCwgdG1wLCBzaXplb2YodG1wKSk7CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChtb25fc2Vzc2lvbi0+c2Vzc2lvbiwgIiVzLi4iLCB0bXApOworICAgICAgICAgICAgY3VyX3Bhcm0tPmZvcm1hdF9jYihjdXJfcGFybSwgaGlfdmFsLCB0bXAsIHNpemVvZih0bXApKTsKKyAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KG1vbl9zZXNzaW9uLT5zZXNzaW9uLCAiJXMpIiwgdG1wKTsKKyAgICAgICAgfQorICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChtb25fc2Vzc2lvbi0+c2Vzc2lvbiwgIiVjICIsIGtldCk7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KG1vbl9zZXNzaW9uLT5zZXNzaW9uLCAiLSAlc1xuIiwgY3VyX3Bhcm0tPmRlc2NyaXB0aW9uKTsKKyAgICB9CisKKyAgICAvKiBQcmludCBleHRyYSBoZWxwIGlmIGNvbW1hbmQgaGFzIHVucmVzb2x2ZWQgc2VsZWN0b3IgKi8KKyAgICBpZiAobW9uX3Nlc3Npb24tPm51bV9wYXJtcyAmJgorICAgICAgICAobW9uX3Nlc3Npb24tPmNtZF9wYXJtc1ttb25fc2Vzc2lvbi0+bnVtX3Bhcm1zLTFdLmZsYWdzICYgQkNNQ0xJX1BBUk1fRkxBR19TRUxFQ1RPUikgJiYKKyAgICAgICAgIShtb25fc2Vzc2lvbi0+Y21kX3Bhcm1zW21vbl9zZXNzaW9uLT5udW1fcGFybXMtMV0uZmxhZ3MgJiBCQ01DTElfUEFSTV9GTEFHX0FTU0lHTkVEKSkKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIgKnNlbF9uYW1lID0gbW9uX3Nlc3Npb24tPmNtZF9wYXJtc1ttb25fc2Vzc2lvbi0+bnVtX3Bhcm1zLTFdLm5hbWU7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KG1vbl9zZXNzaW9uLT5zZXNzaW9uLCAiQWRkICVzPSVzX3ZhbHVlIHRvIHNlZSAlcy1zcGVjaWZpYyBwYXJhbWV0ZXJzXG4iLAorICAgICAgICAgICAgc2VsX25hbWUsIHNlbF9uYW1lLCBzZWxfbmFtZSk7CisgICAgfQorICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KG1vbl9zZXNzaW9uLT5zZXNzaW9uLCAiXG4iKTsKK30KKworCisvKiBEaXNwbGF5IGhlbHAgYSB0b2tlbiAqLworc3RhdGljIHZvaWQgX2JjbWNsaV9oZWxwX2VudHJ5KGJjbWNsaV9zZXNzaW9uX2V4dHJhcyAqbW9uX3Nlc3Npb24sIGJjbWNsaV9lbnRyeSAqcF90b2tlbiwKKyAgICBiY21jbGlfbmFtZV92YWx1ZSAqcGFpcnMsIGludCBucGFpcnMsIGJjbW9zX2Jvb2wgc3VwcHJlc3NfZXJyX3ByaW50KQoreworICAgIGNoYXIgYnVmZmVyW0JDTUNMSV9NQVhfUVVBTF9OQU1FX0xFTkdUSF07CisKKyAgICBpZiAocF90b2tlbi0+c2VsID09IEJDTUNMSV9FTlRSWV9ESVIpCisgICAgeworICAgICAgICBfYmNtY2xpX2hlbHBfZGlyKG1vbl9zZXNzaW9uLCBwX3Rva2VuKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIFBvcHVsYXRlIHBhcmFtZXRlciB0YWJsZSAqLworICAgIF9iY21jbGlfcG9wdWxhdGVfcGFybXMobW9uX3Nlc3Npb24sIHBfdG9rZW4sIHBhaXJzLCBucGFpcnMsIHN1cHByZXNzX2Vycl9wcmludCwgTlVMTCk7CisKKyAgICBfYmNtY2xpX3F1YWxpZmllZF9uYW1lKHBfdG9rZW4sIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KG1vbl9zZXNzaW9uLT5zZXNzaW9uLCAiJXM6IFx0JXNcbiIsIGJ1ZmZlciwgcF90b2tlbi0+aGVscCApOworICAgIGlmIChwX3Rva2VuLT51LmNtZC5udW1fcGFybXMpCisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KG1vbl9zZXNzaW9uLT5zZXNzaW9uLCAiUGFyYW1ldGVyczpcbiIpOworICAgIF9iY21jbGlfaGVscF9wb3B1bGF0ZWRfY21kKG1vbl9zZXNzaW9uLCBwX3Rva2VuLCBOVUxMLCBCQ01PU19GQUxTRSk7CisgICAgX2JjbWNsaV9mcmVlX3Nlc3Npb25fdmFsdWVfc3RhdHVzKG1vbl9zZXNzaW9uKTsKK30KKworCisvKiBDaG9vc2UgdW5pcXVlIGFsaWFzIGZvciA8bmFtZT4gaW4gPHBfZGlyPiAqLworLyogQ3VycmVudGx5IG9ubHkgc2luZ2xlLWNoYXJhY3RlciBhbGlhc2VzIGFyZSBzdXBwb3J0ZWQgKi8KK3N0YXRpYyB2b2lkIF9fYmNtY2xpX2Nob29zZUFsaWFzKGJjbWNsaV9lbnRyeSAqcF9kaXIsIGJjbWNsaV9lbnRyeSAqcF9uZXdfdG9rZW4sIGludCBmcm9tKQoreworICAgIGJjbWNsaV9lbnRyeSAqcF90b2tlbjsKKyAgICBpbnQgICAgICAgICBpOworICAgIGNoYXIgICAgICAgIGM7CisKKyAgICBfYmNtY2xpX3N0cmx3ciggcF9uZXdfdG9rZW4tPm5hbWUgKTsKKyAgICBpID0gZnJvbTsKKyAgICB3aGlsZSAoIHBfbmV3X3Rva2VuLT5uYW1lW2ldICkKKyAgICB7CisgICAgICAgIGMgPSBwX25ld190b2tlbi0+bmFtZVtpXTsKKyAgICAgICAgcF90b2tlbiA9IHBfZGlyLT51LmRpci5maXJzdDsKKworICAgICAgICB3aGlsZSAoIHBfdG9rZW4gKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocF90b2tlbi0+YWxpYXMgJiYKKyAgICAgICAgICAgICAgICAgICAgKHRvbG93ZXIoICpwX3Rva2VuLT5hbGlhcyApID09IGMpICkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmIChzdHJsZW4ocF90b2tlbi0+bmFtZSk8PTIgJiYgdG9sb3dlcihwX3Rva2VuLT5uYW1lWzBdKT09YykKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHBfdG9rZW4gPSBwX3Rva2VuLT5uZXh0OworICAgICAgICB9CisgICAgICAgIGlmIChwX3Rva2VuKQorICAgICAgICAgICAgKytpOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBfbmV3X3Rva2VuLT5uYW1lW2ldID0gdG91cHBlciggYyApOworICAgICAgICAgICAgcF9uZXdfdG9rZW4tPmFsaWFzICAgPSAmcF9uZXdfdG9rZW4tPm5hbWVbaV07CisgICAgICAgICAgICBwX25ld190b2tlbi0+YWxpYXNfbGVuID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCisvKiBpc3VwcGVyIHdyYXBwZXIgKi8KK3N0YXRpYyBpbmxpbmUgaW50IF9iY21jbGlfaXN1cHBlcihjaGFyIGMpCit7CisgICAgcmV0dXJuIGlzdXBwZXIoKGludCljKTsKK30KKworc3RhdGljIHZvaWQgX2JjbWNsaV9jaG9vc2VfYWxpYXMoYmNtY2xpX2VudHJ5ICpwX2RpciwgYmNtY2xpX2VudHJ5ICpwX25ld190b2tlbikKK3sKKyAgICBpbnQgaT0wOworICAgIHBfbmV3X3Rva2VuLT5hbGlhc19sZW4gPSAwOworICAgIHBfbmV3X3Rva2VuLT5hbGlhcyA9IE5VTEw7CisgICAgLyogRG9uJ3QgdHJ5IHRvIGFsaWFzIHNvbWV0aGluZyBzaG9ydCAqLworICAgIGlmIChzdHJsZW4ocF9uZXdfdG9rZW4tPm5hbWUpIDwgQkNNQ0xJX01JTl9OQU1FX0xFTkdUSF9GT1JfQUxJQVMpCisgICAgICAgIHJldHVybjsKKyAgICAvKiBUcnkgcHJlLXNldCBhbGlhcyAxc3QgKi8KKyAgICB3aGlsZSAoIHBfbmV3X3Rva2VuLT5uYW1lW2ldICkKKyAgICB7CisgICAgICAgIGlmIChfYmNtY2xpX2lzdXBwZXIocF9uZXdfdG9rZW4tPm5hbWVbaV0pKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGkrKzsKKyAgICB9CisgICAgaWYgKHBfbmV3X3Rva2VuLT5uYW1lW2ldKQorICAgICAgICBfX2JjbWNsaV9jaG9vc2VBbGlhcyhwX2RpciwgcF9uZXdfdG9rZW4sIGkpOworICAgIGlmIChwX25ld190b2tlbi0+YWxpYXMgIT0gJnBfbmV3X3Rva2VuLT5uYW1lW2ldKQorICAgICAgICBfX2JjbWNsaV9jaG9vc2VBbGlhcyhwX2RpciwgcF9uZXdfdG9rZW4sIDApOworfQorCisKKy8qIENvbnZlcnQgc3RyaW5nIHMgdG8gbG93ZXIgY2FzZS4gUmV0dXJuIHBvaW50ZXIgdG8gcyAqLworc3RhdGljIGNoYXIgICogX2JjbWNsaV9zdHJsd3IoIGNoYXIgKnMgKQoreworICAgIGNoYXIgICpzMD1zOworCisgICAgd2hpbGUgKCAqcyApCisgICAgeworICAgICAgICAqcyA9IHRvbG93ZXIoICpzICk7CisgICAgICAgICsrczsKKyAgICB9CisKKyAgICByZXR1cm4gczA7Cit9CisKKworLyogQ29tcGFyZSBzdHJpbmdzIGNhc2UgaW5jZW5zaXRpdmUgKi8KK3N0YXRpYyBpbnQgX2JjbWNsaV9zdHJpY21wKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgaW50IGxlbikKK3sKKyAgICBpbnQgIGk7CisKKyAgICBmb3IgKCBpPTA7IChpPGxlbiB8fCBsZW48MCk7IGkrKyApCisgICAgeworICAgICAgICBpZiAodG9sb3dlciggczFbaV0pICAhPSB0b2xvd2VyKCBzMltpXSApKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGlmICghczFbaV0pCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKl9iY21jbGlfZ2V0X3R5cGVfbmFtZShjb25zdCBiY21jbGlfY21kX3Bhcm0gKnBhcm0pCit7CisgICAgYmNtY2xpX3Bhcm1fdHlwZSB0eXBlID0gcGFybS0+dHlwZTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqdHlwZV9uYW1lW10gPSB7CisgICAgICAgIFtCQ01DTElfUEFSTV9ERUNJTUFMXSAgICA9ICJkZWNpbWFsIiwKKyAgICAgICAgW0JDTUNMSV9QQVJNX0RFQ0lNQUw2NF0gID0gImRlY2ltYWw2NCIsCisgICAgICAgIFtCQ01DTElfUEFSTV9VREVDSU1BTF0gICA9ICJ1ZGVjaW1hbCIsCisgICAgICAgIFtCQ01DTElfUEFSTV9VREVDSU1BTDY0XSA9ICJ1ZGVjaW1hbDY0IiwKKyAgICAgICAgW0JDTUNMSV9QQVJNX0hFWF0gICAgICAgID0gImhleCIsCisgICAgICAgIFtCQ01DTElfUEFSTV9IRVg2NF0gICAgICA9ICJoZXg2NCIsCisgICAgICAgIFtCQ01DTElfUEFSTV9OVU1CRVJdICAgICA9ICJudW1iZXIiLAorICAgICAgICBbQkNNQ0xJX1BBUk1fTlVNQkVSNjRdICAgPSAibnVtYmVyNjQiLAorICAgICAgICBbQkNNQ0xJX1BBUk1fVU5VTUJFUl0gICAgPSAidW51bWJlciIsCisgICAgICAgIFtCQ01DTElfUEFSTV9VTlVNQkVSNjRdICA9ICJ1bnVtYmVyNjQiLAorICAgICAgICBbQkNNQ0xJX1BBUk1fRkxPQVRdICAgICAgPSAiZmxvYXQiLAorICAgICAgICBbQkNNQ0xJX1BBUk1fRE9VQkxFXSAgICAgPSAiZG91YmxlIiwKKyAgICAgICAgW0JDTUNMSV9QQVJNX0VOVU1dICAgICAgID0gImVudW0iLAorICAgICAgICBbQkNNQ0xJX1BBUk1fRU5VTV9NQVNLXSAgPSAiZW51bV9tYXNrIiwKKyAgICAgICAgW0JDTUNMSV9QQVJNX1NUUklOR10gICAgID0gInN0cmluZyIsCisgICAgICAgIFtCQ01DTElfUEFSTV9JUF0gICAgICAgICA9ICJJUCIsCisgICAgICAgIFtCQ01DTElfUEFSTV9JUFY2XSAgICAgICA9ICJJUHY2IiwKKyAgICAgICAgW0JDTUNMSV9QQVJNX01BQ10gICAgICAgID0gIk1BQyIsCisgICAgICAgIFtCQ01DTElfUEFSTV9CVUZGRVJdICAgICA9ICJidWZmZXIiLAorICAgICAgICBbQkNNQ0xJX1BBUk1fVVNFUkRFRl0gICAgPSAidXNlcmRlZiIsCisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqdW5kZWZpbmVkID0gInVuZGVmaW5lZCI7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKnNlbGVjdG9yID0gInNlbGVjdG9yIjsKKyAgICBpZiAodHlwZSA+IEJDTUNMSV9QQVJNX1VTRVJERUYgfHwgIXR5cGVfbmFtZVt0eXBlXSkKKyAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKKyAgICBpZiAodHlwZSA9PSBCQ01DTElfUEFSTV9FTlVNICYmIChwYXJtLT5mbGFncyAmIEJDTUNMSV9QQVJNX0ZMQUdfU0VMRUNUT1IpKQorICAgICAgICByZXR1cm4gc2VsZWN0b3I7CisgICAgcmV0dXJuIHR5cGVfbmFtZVt0eXBlXTsKK30KKworLyogQXNzaWduIGRlZmF1bHQgY2FsbGJhY2tzICovCitzdGF0aWMgdm9pZCBfYmNtY2xpX2Fzc2lnbl9jYWxsYmFja3MoYmNtY2xpX2NtZF9wYXJtICpwYXJtKQoreworICAgIGlmIChwYXJtLT50eXBlID09IEJDTUNMSV9QQVJNX0VOVU0pCisgICAgeworICAgICAgICBwYXJtLT5zY2FuX2NiID0gX2JjbWNsaV9lbnVtX3NjYW5fY2I7CisgICAgICAgIHBhcm0tPmZvcm1hdF9jYiA9IF9iY21jbGlfZW51bV9mb3JtYXRfY2I7CisgICAgfQorICAgIGVsc2UgaWYgKHBhcm0tPnR5cGUgPT0gQkNNQ0xJX1BBUk1fRU5VTV9NQVNLKQorICAgIHsKKyAgICAgICAgcGFybS0+c2Nhbl9jYiA9IF9iY21jbGlfZW51bV9tYXNrX3NjYW5fY2I7CisgICAgICAgIHBhcm0tPmZvcm1hdF9jYiA9IF9iY21jbGlfZW51bV9tYXNrX2Zvcm1hdF9jYjsKKyAgICB9CisgICAgZWxzZSBpZiAocGFybS0+dHlwZSA9PSBCQ01DTElfUEFSTV9CVUZGRVIpCisgICAgeworICAgICAgICBpZiAoIXBhcm0tPnNjYW5fY2IpCisgICAgICAgICAgICBwYXJtLT5zY2FuX2NiID0gX2JjbWNsaV9idWZmZXJfc2Nhbl9jYjsKKyAgICAgICAgaWYgKCFwYXJtLT5mb3JtYXRfY2IpCisgICAgICAgICAgICBwYXJtLT5mb3JtYXRfY2IgPSBfYmNtY2xpX2RmdF9mb3JtYXRfY2I7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmICghcGFybS0+c2Nhbl9jYikKKyAgICAgICAgICAgIHBhcm0tPnNjYW5fY2IgPSBfYmNtY2xpX2RmdF9zY2FuX2NiOworICAgICAgICBpZiAoIXBhcm0tPmZvcm1hdF9jYikKKyAgICAgICAgICAgIHBhcm0tPmZvcm1hdF9jYiA9IF9iY21jbGlfZGZ0X2Zvcm1hdF9jYjsKKyAgICB9Cit9CisKKworLyogQ29udmVydCBoZXgtc3RyaW5nIHRvIGJpbmFyeSBkYXRhLgorICogUmV0dXJuczogY29udmVydGVkIGxlbmd0aCA+PTAgb3IgZXJyb3IgPCAwCisgKi8KK3N0YXRpYyBpbnQgX2JjbWNsaV9zdHJoZXgoY29uc3QgY2hhciAqc3JjLCB1aW50OF90ICpkc3QsIHVpbnQxNl90IGRzdF9sZW4pCit7CisgICAgdWludDE2X3Qgc3JjX2xlbiA9ICh1aW50MTZfdClzdHJsZW4oIHNyYyApOworICAgIHVpbnQxNl90IGkgPSBzcmNfbGVuLCBqLCBzaGlmdCA9IDA7CisKKyAgICBpZiAoICFkc3QgfHwgIWRzdF9sZW4gfHwgKHNyY19sZW4gPiAyKmRzdF9sZW4pIHx8IChzcmNfbGVuJTIpICkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogQ2FsY3VsYXRlIGhleCBidWZmZXIgbGVuZ3RoIGFuZCBmaWxsIGl0IHVwIGZyb20gcmlnaHQtdG8tbGVmdAorICAgICAqIGluIG9yZGVyIHRvIHN0YXJ0IHRoZSBwcm9jZXNzIGZyb20gTFMgbmliYmxlCisgICAgICovCisgICAgZHN0X2xlbiA9IHNyY19sZW4gLyAyOworICAgIG1lbXNldChkc3QsIDAsIGRzdF9sZW4pOworICAgIGogPSBkc3RfbGVuLTE7CisgICAgZG8KKyAgICB7CisgICAgICAgIGludCBjID0gc3JjWy0taV07CisKKyAgICAgICAgaWYgKCAoYz49JzAnKSAmJiAoYzw9JzknKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGMgPSBjIC0gJzAnOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCAoYz49J2EnKSAmJiAoYzw9J2YnKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGMgPSAweEEgKyBjIC0gJ2EnOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCAoYz49J0EnKSAmJiAoYzw9J0YnKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGMgPSAweEEgKyBjIC0gJ0EnOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorCisgICAgICAgIGRzdFtqXSB8PSAodWludDhfdCkoYzw8c2hpZnQpOyAvKiBzaGlmdCBjYW4gaGF2ZSAxIG9mIDIgdmFsdWVzOiAwIGFuZCA0ICovCisKKyAgICAgICAgaiAgICAgLT0gc2hpZnQ+PjI7ICAgICAgICAgICAgICAvKiBtb3ZlIHRvIHRoZSBuZXh0IGJ5dGUgaWYgd2UndmUganVzdCBmaWxsZWQgdGhlIG1zIG5pYmJsZSAqLworICAgICAgICBzaGlmdCBePSA0OyAgICAgICAgICAgICAgICAgICAgIC8qIGFsdGVybmF0ZSBuaWJibGVzICovCisKKyAgICB9IHdoaWxlICggaSApOworCisgICAgcmV0dXJuIGRzdF9sZW47Cit9CisKKy8qIERlZmF1bHQgZnVuY3Rpb24gZm9yIHN0cmluZy0+dmFsdWUgY29udmVyc2lvbi4KKyAqIFJldHVybnMgMCBpZiBPSworICovCitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbWNsaV9kZnRfc2Nhbl9jYihjb25zdCBiY21jbGlfY21kX3Bhcm0gKnBhcm0sIGJjbWNsaV9wYXJtX3ZhbHVlICp2YWx1ZSwgY29uc3QgY2hhciAqc3RyaW5nX3ZhbCkKK3sKKyAgICBjaGFyICpwX2VuZCA9IE5VTEw7CisgICAgaW50IG47CisKKyAgICBpZiAocGFybS0+dHlwZSA9PSBCQ01DTElfUEFSTV9VREVDSU1BTCB8fAorICAgICAgICBwYXJtLT50eXBlID09IEJDTUNMSV9QQVJNX1VERUNJTUFMNjQgfHwKKyAgICAgICAgcGFybS0+dHlwZSA9PSBCQ01DTElfUEFSTV9VTlVNQkVSIHx8CisgICAgICAgIHBhcm0tPnR5cGUgPT0gQkNNQ0xJX1BBUk1fVU5VTUJFUjY0KQorICAgIHsKKyAgICAgICAgLyogc3RydG91bCByZXR1cm5zIE9LIGV2ZW4gd2hlbiBwYXJzaW5nIGEgbmVnYXRpdmUgbnVtYmVyICovCisgICAgICAgIGlmIChzdHJpbmdfdmFsWzBdID09ICctJykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN3aXRjaChwYXJtLT50eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01DTElfUEFSTV9ERUNJTUFMOgorICAgICAgICAgICAgdmFsdWUtPm51bWJlciA9IHN0cnRvbChzdHJpbmdfdmFsLCAmcF9lbmQsIDEwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUNMSV9QQVJNX1VERUNJTUFMOgorICAgICAgICAgICAgdmFsdWUtPnVudW1iZXIgPSBzdHJ0b3VsKHN0cmluZ192YWwsICZwX2VuZCwgMTApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNQ0xJX1BBUk1fREVDSU1BTDY0OgorICAgICAgICAgICAgdmFsdWUtPm51bWJlcjY0ID0gc3RydG9sbChzdHJpbmdfdmFsLCAmcF9lbmQsIDEwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUNMSV9QQVJNX1VERUNJTUFMNjQ6CisgICAgICAgICAgICB2YWx1ZS0+dW51bWJlcjY0ID0gc3RydG91bGwoc3RyaW5nX3ZhbCwgJnBfZW5kLCAxMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01DTElfUEFSTV9IRVg6CisgICAgICAgICAgICB2YWx1ZS0+dW51bWJlciA9IHN0cnRvdWwoc3RyaW5nX3ZhbCwgJnBfZW5kLCAxNik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01DTElfUEFSTV9IRVg2NDoKKyAgICAgICAgICAgIHZhbHVlLT51bnVtYmVyNjQgPSBzdHJ0b3VsbChzdHJpbmdfdmFsLCAmcF9lbmQsIDE2KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUNMSV9QQVJNX05VTUJFUjoKKyAgICAgICAgICAgIHZhbHVlLT5udW1iZXIgPSBzdHJ0b2woc3RyaW5nX3ZhbCwgJnBfZW5kLCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUNMSV9QQVJNX1VOVU1CRVI6CisgICAgICAgICAgICB2YWx1ZS0+dW51bWJlciA9IHN0cnRvdWwoc3RyaW5nX3ZhbCwgJnBfZW5kLCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUNMSV9QQVJNX05VTUJFUjY0OgorICAgICAgICAgICAgdmFsdWUtPm51bWJlcjY0ID0gc3RydG9sbChzdHJpbmdfdmFsLCAmcF9lbmQsIDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNQ0xJX1BBUk1fVU5VTUJFUjY0OgorICAgICAgICAgICAgdmFsdWUtPnVudW1iZXI2NCA9IHN0cnRvdWxsKHN0cmluZ192YWwsICZwX2VuZCwgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01DTElfUEFSTV9GTE9BVDoKKyAgICAgICAgY2FzZSBCQ01DTElfUEFSTV9ET1VCTEU6CisgICAgICAgICAgICB2YWx1ZS0+ZCA9IHN0cnRvZChzdHJpbmdfdmFsLCAmcF9lbmQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNQ0xJX1BBUk1fTUFDOgorICAgICAgICB7CisgICAgICAgICAgICB1bnNpZ25lZCBtMCwgbTEsIG0yLCBtMywgbTQsIG01OworICAgICAgICAgICAgbiA9IHNzY2FuZihzdHJpbmdfdmFsLCAiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLAorICAgICAgICAgICAgICAgICZtMCwgJm0xLCAmbTIsICZtMywgJm00LCAmbTUpOworICAgICAgICAgICAgaWYgKG4gIT0gNikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuID0gc3NjYW5mKHN0cmluZ192YWwsICIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMngiLAorICAgICAgICAgICAgICAgICAgICAmbTAsICZtMSwgJm0yLCAmbTMsICZtNCwgJm01KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuICE9IDYpCisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgIGlmIChtMCA+IDI1NSB8fCBtMSA+IDI1NSB8fCBtMiA+IDI1NSB8fCBtMyA+IDI1NSB8fCBtNCA+IDI1NSB8fCBtNSA+IDI1NSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgdmFsdWUtPm1hYy51OFswXSA9IG0wOworICAgICAgICAgICAgdmFsdWUtPm1hYy51OFsxXSA9IG0xOworICAgICAgICAgICAgdmFsdWUtPm1hYy51OFsyXSA9IG0yOworICAgICAgICAgICAgdmFsdWUtPm1hYy51OFszXSA9IG0zOworICAgICAgICAgICAgdmFsdWUtPm1hYy51OFs0XSA9IG00OworICAgICAgICAgICAgdmFsdWUtPm1hYy51OFs1XSA9IG01OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBCQ01DTElfUEFSTV9JUDoKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG4xLCBuMiwgbjMsIG40OworICAgICAgICAgICAgbiA9IHNzY2FuZihzdHJpbmdfdmFsLCAiJWQuJWQuJWQuJWQiLCAmbjEsICZuMiwgJm4zLCAmbjQpOworICAgICAgICAgICAgaWYgKG4gIT0gNCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCluMSA+IDI1NSB8fCAodW5zaWduZWQpbjIgPiAyNTUgfHwgKHVuc2lnbmVkKW4zID4gMjU1IHx8ICh1bnNpZ25lZCluNCA+IDI1NSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgdmFsdWUtPnVudW1iZXIgPSAobjEgPDwgMjQpIHwgKG4yIDw8IDE2KSB8IChuMyA8PCA4KSB8IG40OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgaWYgKHBfZW5kICYmICpwX2VuZCkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIHZvaWQgX2JjbWNsaV9kZnRfZm9ybWF0X2NiKGNvbnN0IGJjbWNsaV9jbWRfcGFybSAqcGFybSwgYmNtY2xpX3Bhcm1fdmFsdWUgdmFsdWUsIGNoYXIgKmJ1ZmZlciwgaW50IHNpemUpCit7CisgICAgc3dpdGNoKHBhcm0tPnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTUNMSV9QQVJNX0RFQ0lNQUw6CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICIlbGQiLCB2YWx1ZS5udW1iZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNQ0xJX1BBUk1fVURFQ0lNQUw6CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICIlbHUiLCB2YWx1ZS51bnVtYmVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUNMSV9QQVJNX0RFQ0lNQUw2NDoKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIiVsbGQiLCB2YWx1ZS5udW1iZXI2NCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01DTElfUEFSTV9VREVDSU1BTDY0OgorICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiJWxsdSIsIHZhbHVlLnVudW1iZXI2NCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01DTElfUEFSTV9IRVg6CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICIweCVseCIsIHZhbHVlLnVudW1iZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNQ0xJX1BBUk1fSEVYNjQ6CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICIweCVsbHgiLCB2YWx1ZS51bnVtYmVyNjQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNQ0xJX1BBUk1fTlVNQkVSOgorICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiJWxkIiwgdmFsdWUubnVtYmVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUNMSV9QQVJNX05VTUJFUjY0OgorICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiJWxsZCIsIHZhbHVlLm51bWJlcjY0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUNMSV9QQVJNX1VOVU1CRVI6CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICIlbHUiLCB2YWx1ZS51bnVtYmVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUNMSV9QQVJNX1VOVU1CRVI2NDoKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIiVsbHUiLCB2YWx1ZS51bnVtYmVyNjQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNQ0xJX1BBUk1fRkxPQVQ6CisgICAgICAgIGNhc2UgQkNNQ0xJX1BBUk1fRE9VQkxFOgorICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiJWYiLCB2YWx1ZS5kKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUNMSV9QQVJNX1NUUklORzoKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIiVzIiwgdmFsdWUuc3RyaW5nKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTUNMSV9QQVJNX01BQzoKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IiwKKyAgICAgICAgICAgICAgICBwYXJtLT52YWx1ZS5tYWMudThbMF0sIHBhcm0tPnZhbHVlLm1hYy51OFsxXSwgcGFybS0+dmFsdWUubWFjLnU4WzJdLAorICAgICAgICAgICAgICAgIHBhcm0tPnZhbHVlLm1hYy51OFszXSwgcGFybS0+dmFsdWUubWFjLnU4WzRdLCBwYXJtLT52YWx1ZS5tYWMudThbNV0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNQ0xJX1BBUk1fSVA6CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICIlZC4lZC4lZC4lZCIsCisgICAgICAgICAgICAgICAgKGludCkoKHBhcm0tPnZhbHVlLnVudW1iZXIgPj4gMjQpICYgMHhmZiksIChpbnQpKChwYXJtLT52YWx1ZS51bnVtYmVyID4+IDE2KSAmIDB4ZmYpLAorICAgICAgICAgICAgICAgIChpbnQpKChwYXJtLT52YWx1ZS51bnVtYmVyID4+IDgpICYgMHhmZiksIChpbnQpKHBhcm0tPnZhbHVlLnVudW1iZXIgJiAweGZmKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYmNtY2xpX3N0cm5jcHkoYnVmZmVyLCAiKnVua25vd24qIiwgc2l6ZSk7CisgICAgfQorfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2JjbWNsaV9lbnVtX3NjYW5fY2IoY29uc3QgYmNtY2xpX2NtZF9wYXJtICpwYXJtLCBiY21jbGlfcGFybV92YWx1ZSAqdmFsdWUsIGNvbnN0IGNoYXIgKnN0cmluZ192YWwpCit7CisgICAgYmNtY2xpX2VudW1fdmFsICp2YWx1ZXM9cGFybS0+ZW51bV90YWJsZTsKKyAgICB3aGlsZSAodmFsdWVzLT5uYW1lKQorICAgIHsKKyAgICAgICAgaWYgKCFfYmNtY2xpX3N0cmljbXAodmFsdWVzLT5uYW1lLCBzdHJpbmdfdmFsLCAtMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbHVlLT5lbnVtX3ZhbCA9IHZhbHVlcy0+dmFsOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgIH0KKyAgICAgICAgKyt2YWx1ZXM7CisgICAgfQorICAgIHJldHVybiBCQ01fRVJSX1BBUk07Cit9CisKK3N0YXRpYyB2b2lkIF9iY21jbGlfZW51bV9mb3JtYXRfY2IoY29uc3QgYmNtY2xpX2NtZF9wYXJtICpwYXJtLCBiY21jbGlfcGFybV92YWx1ZSB2YWx1ZSwgY2hhciAqYnVmZmVyLCBpbnQgc2l6ZSkKK3sKKyAgICBiY21jbGlfZW51bV92YWwgKnZhbHVlcz1wYXJtLT5lbnVtX3RhYmxlOworICAgIHdoaWxlICh2YWx1ZXMtPm5hbWUpCisgICAgeworICAgICAgICBpZiAodmFsdWVzLT52YWwgPT0gdmFsdWUuZW51bV92YWwpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgKyt2YWx1ZXM7CisgICAgfQorICAgIGlmICh2YWx1ZXMtPm5hbWUpCisgICAgICAgIHN0cm5jcHkoYnVmZmVyLCB2YWx1ZXMtPm5hbWUsIHNpemUpOworICAgIGVsc2UKKyAgICAgICAgc3RybmNweShidWZmZXIsICIqaW52YWxpZCoiLCBzaXplKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9iY21jbGlfZW51bV9tYXNrX3NjYW5fY2IoY29uc3QgYmNtY2xpX2NtZF9wYXJtICpwYXJtLCBiY21jbGlfcGFybV92YWx1ZSAqdmFsdWUsIGNvbnN0IGNoYXIgKnN0cmluZ192YWwpCit7CisgICAgYmNtY2xpX3Bhcm1fdmFsdWUgdmFsMTsKKyAgICBjaGFyICpkZWw7CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgdmFsdWUtPm51bWJlciA9IDA7CisKKyAgICAvKiBzdHJpbmdfdmFsIGlzIGEgY29tYmluYXRpb24gb2YgZW51bSB2YWx1ZXMgc2VwYXJhdGVkIGJ5IEJDTUNMSV9FTlVNX01BU0tfREVMX1NUUiAqLworICAgIGRlbCA9IHN0cmNocihzdHJpbmdfdmFsLCBCQ01DTElfRU5VTV9NQVNLX0RFTF9DSEFSKTsKKyAgICB3aGlsZSAoZGVsKQorICAgIHsKKyAgICAgICAgY2hhciBzaW5nbGVfdmFsWzY0XTsKKyAgICAgICAgaWYgKGRlbCAtIHN0cmluZ192YWwgPj0gc2l6ZW9mKHNpbmdsZV92YWwpKQorICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT1ZFUkZMT1c7CisgICAgICAgIG1lbWNweShzaW5nbGVfdmFsLCBzdHJpbmdfdmFsLCBkZWwgLSBzdHJpbmdfdmFsKTsKKyAgICAgICAgc2luZ2xlX3ZhbFtkZWwgLSBzdHJpbmdfdmFsXSA9IDA7CisgICAgICAgIGVyciA9IF9iY21jbGlfZW51bV9zY2FuX2NiKHBhcm0sICZ2YWwxLCBzaW5nbGVfdmFsKTsKKyAgICAgICAgaWYgKGVycikKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIHZhbHVlLT5lbnVtX3ZhbCB8PSB2YWwxLmVudW1fdmFsOworICAgICAgICBzdHJpbmdfdmFsID0gZGVsKzE7CisgICAgICAgIGRlbCA9IHN0cmNocihzdHJpbmdfdmFsLCBCQ01DTElfRU5VTV9NQVNLX0RFTF9DSEFSKTsKKyAgICB9CisgICAgZXJyID0gX2JjbWNsaV9lbnVtX3NjYW5fY2IocGFybSwgJnZhbDEsIHN0cmluZ192YWwpOworICAgIGlmIChlcnIpCisgICAgICAgIHJldHVybiBlcnI7CisgICAgdmFsdWUtPm51bWJlciB8PSB2YWwxLmVudW1fdmFsOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgdm9pZCBfYmNtY2xpX2VudW1fbWFza19mb3JtYXRfY2IoY29uc3QgYmNtY2xpX2NtZF9wYXJtICpwYXJtLCBiY21jbGlfcGFybV92YWx1ZSB2YWx1ZSwgY2hhciAqYnVmZmVyLCBpbnQgc2l6ZSkKK3sKKyAgICBiY21jbGlfZW51bV92YWwgKnZhbHVlcz1wYXJtLT5lbnVtX3RhYmxlOworICAgIGNvbnN0IGNoYXIgKm5vbmUgPSBOVUxMOworICAgICpidWZmZXIgPSAwOworICAgIHdoaWxlICh2YWx1ZXMtPm5hbWUpCisgICAgeworICAgICAgICBpZiAodmFsdWVzLT52YWwgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgbm9uZSA9IHZhbHVlcy0+bmFtZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHZhbHVlcy0+dmFsICYgdmFsdWUuZW51bV92YWwpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgqYnVmZmVyKQorICAgICAgICAgICAgICAgIHN0cm5jYXQoYnVmZmVyLCBCQ01DTElfRU5VTV9NQVNLX0RFTF9TVFIsIHNpemUgLSBzdHJsZW4oYnVmZmVyKSk7CisgICAgICAgICAgICBzdHJuY2F0KGJ1ZmZlciwgdmFsdWVzLT5uYW1lLCBzaXplIC0gc3RybGVuKGJ1ZmZlcikpOworICAgICAgICB9CisgICAgICAgICsrdmFsdWVzOworICAgIH0KKyAgICBpZiAoISAqYnVmZmVyKQorICAgICAgICBzdHJuY3B5KGJ1ZmZlciwgTlVMTCAhPSBub25lID8gbm9uZSA6ICIwIiwgc2l6ZSk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfYmNtY2xpX2J1ZmZlcl9zY2FuX2NiKGNvbnN0IGJjbWNsaV9jbWRfcGFybSAqcGFybSwgYmNtY2xpX3Bhcm1fdmFsdWUgKnZhbHVlLCBjb25zdCBjaGFyICpzdHJpbmdfdmFsKQoreworICAgIGludCBuOworCisgICAgaWYgKCF2YWx1ZS0+YnVmZmVyLnN0YXJ0KQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIHZhbHVlLT5idWZmZXIuY3VyciA9IHZhbHVlLT5idWZmZXIuc3RhcnQ7CisgICAgaWYgKHN0cmNtcChzdHJpbmdfdmFsLCAiLSIpID09IDApCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisgICAgbiA9IF9iY21jbGlfc3RyaGV4KHN0cmluZ192YWwsIHZhbHVlLT5idWZmZXIuc3RhcnQsIHZhbHVlLT5idWZmZXIubGVuKTsKKyAgICBpZiAobiA8IDApCisgICAgICAgIHJldHVybiBuOworICAgIGJjbW9sdF9idWZfc2tpcCgmdmFsdWUtPmJ1ZmZlciwgbik7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKl9iY21jbGlfcXVhbGlmaWVkX25hbWUoYmNtY2xpX2VudHJ5ICp0b2tlbiwgY2hhciAqYnVmZmVyLCBpbnQgc2l6ZSApCit7CisgICAgYmNtY2xpX2VudHJ5ICpwYXJlbnQgPSB0b2tlbi0+cGFyZW50OworICAgIGNoYXIgcXVhbF9uYW1lW0JDTUNMSV9NQVhfUVVBTF9OQU1FX0xFTkdUSF07CisgICAgKmJ1ZmZlcj0wOworICAgIHdoaWxlIChwYXJlbnQpCisgICAgeworICAgICAgICBiY21jbGlfc3RybmNweShxdWFsX25hbWUsIHBhcmVudC0+bmFtZSwgc2l6ZW9mKHF1YWxfbmFtZSkpOworICAgICAgICBpZiAocGFyZW50LT5wYXJlbnQpCisgICAgICAgICAgICBiY21jbGlfc3RybmNhdChxdWFsX25hbWUsICIvIiwgc2l6ZW9mKHF1YWxfbmFtZSkpOworICAgICAgICBiY21jbGlfc3RybmNhdChxdWFsX25hbWUsIGJ1ZmZlciwgc2l6ZW9mKHF1YWxfbmFtZSkpOworICAgICAgICBiY21jbGlfc3RybmNweShidWZmZXIsIHF1YWxfbmFtZSwgc2l6ZSk7CisgICAgICAgIHBhcmVudCA9IHBhcmVudC0+cGFyZW50OworICAgIH0KKyAgICBzaXplIC09IHN0cmxlbihidWZmZXIpOworICAgIGJjbWNsaV9zdHJuY2F0KGJ1ZmZlciwgdG9rZW4tPm5hbWUsIHNpemUpOworICAgIHJldHVybiBidWZmZXI7Cit9CisKKy8qCisgKiBFeHBvcnRzCisgKi8KK0VYUE9SVF9TWU1CT0woYmNtY2xpX2Rpcl9hZGQpOworRVhQT1JUX1NZTUJPTChiY21jbGlfZGlyX2ZpbmQpOworRVhQT1JUX1NZTUJPTChiY21jbGlfdG9rZW5fbmFtZSk7CitFWFBPUlRfU1lNQk9MKGJjbWNsaV9jbWRfYWRkKTsKK0VYUE9SVF9TWU1CT0woYmNtY2xpX3Nlc3Npb25fb3Blbik7CitFWFBPUlRfU1lNQk9MKGJjbWNsaV9zZXNzaW9uX2Nsb3NlKTsKK0VYUE9SVF9TWU1CT0woYmNtY2xpX3BhcnNlKTsKK0VYUE9SVF9TWU1CT0woYmNtY2xpX3N0b3ApOworRVhQT1JUX1NZTUJPTChiY21jbGlfaXNfc3RvcHBlZCk7CitFWFBPUlRfU1lNQk9MKGJjbWNsaV9kaXJfZ2V0KTsKK0VYUE9SVF9TWU1CT0woYmNtY2xpX2Rpcl9zZXQpOworRVhQT1JUX1NZTUJPTChiY21jbGlfcGFybV9udW1iZXIpOworRVhQT1JUX1NZTUJPTChiY21jbGlfcGFybV9pc19zZXQpOworRVhQT1JUX1NZTUJPTChiY21jbGlfZW51bV9wYXJtX3N0cmluZ3ZhbCk7CitFWFBPUlRfU1lNQk9MKGJjbWNsaV90b2tlbl9kZXN0cm95KTsKK0VYUE9SVF9TWU1CT0woYmNtY2xpX2VudW1fYm9vbF90YWJsZSk7CmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvY2xpL2JjbWNsaS5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2NsaS9iY21jbGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzRlMjdjCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2NsaS9iY21jbGkuaApAQCAtMCwwICsxLDY3NyBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogYmNtY2xpLmgKKyAqCisgKiBDTEkgZW5naW5lCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgQkNNQ0xJX0gKKworI2RlZmluZSBCQ01DTElfSAorCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtY2xpX3Nlc3Npb24uaD4KKyNpbmNsdWRlIDxiY21vbHRfYnVmLmg+CisKKy8qKiBcZGVmZ3JvdXAgYmNtX2NsaSBCcm9hZGNvbSBDTEkgRW5naW5lCisgKiBCcm9hZGNvbSBDTEkgZW5naW5lIGlzIHVzZWQgZm9yIGFsbCBjb25maWd1cmF0aW9uIGFuZCBzdGF0dXMgbW9uaXRvcmluZy5cbgorICogSXQgZG9lc24ndCBoYXZlIGJ1aWx0LWluIHNjcmlwdGluZyBjYXBhYmlsaXRpZXMgKGxvZ2ljYWwgZXhwcmVzc2lvbnMsIGxvb3BzKSwKKyAqIGJ1dCBjYW4gYmUgdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIGFueSBhdmFpbGFibGUgc2NyaXB0aW5nIGxhbmd1YWdlLlxuCisgKiBCcm9hZGNvbSBDTEkgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBmZWF0dXJlczpcbgorICogLSBwYXJhbWV0ZXIgbnVtYmVyIGFuZCB0eXBlIHZhbGlkYXRpb24gKHNpbXBsaWZpZXMgY29tbWFuZCBoYW5kbGVycyBkZXZlbG9wbWVudCkKKyAqIC0gcGFyYW1ldGVyIHZhbHVlIHJhbmdlIGNoZWNraW5nCisgKiAtIG1hbmRhdG9yeSBhbmQgb3B0aW9uYWwgcGFyYW1ldGVycworICogLSBwb3NpdGlvbmFsIGFuZCBuYW1lZCBwYXJhbWV0ZXJzCisgKiAtIHBhcmFtZXRlcnMgd2l0aCBkZWZhdWx0IHZhbHVlcworICogLSBlbnVtIHBhcmFtZXRlcnMgY2FuIGhhdmUgYXJiaXRyYXJ5IHZhbHVlcworICogLSBhdXRvbWF0aWMgY29tbWFuZCBoZWxwIGdlbmVyYXRpb24KKyAqIC0gYXV0b21hdGljIG9yIHVzZXItZGVmaW5lZCBjb21tYW5kIHNob3J0Y3V0cworICogLSBjb21tYW5kIGhhbmRsZXJzIHJldHVybiBjb21wbGV0aW9uIHN0YXR1cyB0byBlbmFibGUgc2NyaXB0aW5nCisgKiAtIG11bHRpcGxlIHNlc3Npb25zCisgKiAtIHNlc3Npb24gYWNjZXNzIHJpZ2h0cworICogLSBleHRlbmRpYmxlLiBTdXBwb3J0cyB1c2VyLWRlZmluZWQgcGFyYW1ldGVyIHR5cGVzCisgKiAtIHJlbGF0aXZlbHkgbG93IHN0YWNrIHVzYWdlCisgKiBAeworICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2RlZmluZSBCQ01DTElfTUFYX1NFQVJDSF9TVUJTVFJfTEVOR1RIIDgwCisKKyNkZWZpbmUgQkNNQ0xJX0FSUkFZX0VNUFRZICAgICAgICAiLSIKKyNkZWZpbmUgQkNNQ0xJX1BBUk1fTk9fVkFMVUUgICAgICAiXyIKKyNkZWZpbmUgQkNNQ0xJX0VOVU1fTUFTS19ERUxfU1RSICAiKyIKKworLyoqIE1vbml0b3IgZW50cnkgaGFuZGxlCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbWNsaV9lbnRyeSBiY21jbGlfZW50cnk7CisKKy8qIGlmIEJDTUNMSV9QQVJNX1VTRVJJTyBmbGFnIGlzIHNldDoKKyAgIGxvd192YWw6IHRfdXNlcnNjYW5mX2YgZnVuY3Rpb24KKyAgIGhpZ2hfdmFsOiB0X3VzZXJwcmludGZfZiBmdW5jdGlvbgorKi8KKworLyoqIEZ1bmN0aW9uIHBhcmFtZXRlciBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IGJjbWNsaV9jbWRfcGFybSBiY21jbGlfY21kX3Bhcm07CisKKy8qKiBQYXJhbWV0ZXIgdHlwZSAqLwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNQ0xJX1BBUk1fTk9ORSwKKyAgICBCQ01DTElfUEFSTV9ERUNJTUFMLCAgICAgICAgIC8qKjwgRGVjaW1hbCBudW1iZXIgKi8KKyAgICBCQ01DTElfUEFSTV9ERUNJTUFMNjQsICAgICAgIC8qKjwgU2lnbmVkIDY0LWJpdCBkZWNpbWFsICovCisgICAgQkNNQ0xJX1BBUk1fVURFQ0lNQUwsICAgICAgICAvKio8IFVuc2lnbmVkIGRlY2ltYWwgbnVtYmVyICovCisgICAgQkNNQ0xJX1BBUk1fVURFQ0lNQUw2NCwgICAgICAvKio8IFVuc2lnbmVkIDY0LWJpdCBkZWNpbWFsIG51bWJlciAqLworICAgIEJDTUNMSV9QQVJNX0hFWCwgICAgICAgICAgICAgLyoqPCBIZXhhZGVjaW1hbCBudW1iZXIgKi8KKyAgICBCQ01DTElfUEFSTV9IRVg2NCwgICAgICAgICAgIC8qKjwgNjQtYml0IGhleGFkZWNpbWFsIG51bWJlciAqLworICAgIEJDTUNMSV9QQVJNX05VTUJFUiwgICAgICAgICAgLyoqPCBEZWNpbWFsIG51bWJlciBvciBoZXggbnVtYmVyIHByZWZpeGVkIGJ5IDB4ICovCisgICAgQkNNQ0xJX1BBUk1fTlVNQkVSNjQsICAgICAgICAvKio8IDY0Yml0IGRlY2ltYWwgbnVtYmVyIG9yIGhleCBudW1iZXIgcHJlZml4ZWQgYnkgMHggKi8KKyAgICBCQ01DTElfUEFSTV9VTlVNQkVSLCAgICAgICAgIC8qKjwgVW5zaWduZWQgZGVjaW1hbCBudW1iZXIgb3IgaGV4IG51bWJlciBwcmVmaXhlZCBieSAweCAqLworICAgIEJDTUNMSV9QQVJNX1VOVU1CRVI2NCwgICAgICAgLyoqPCBVbnNpZ25lZCA2NGJpdCBkZWNpbWFsIG51bWJlciBvciBoZXggbnVtYmVyIHByZWZpeGVkIGJ5IDB4ICovCisgICAgQkNNQ0xJX1BBUk1fRkxPQVQsICAgICAgICAgICAvKio8IElFRUUgMzItYml0IGZsb2F0aW5nLXBvaW50IG51bWJlciAqLworICAgIEJDTUNMSV9QQVJNX0RPVUJMRSwgICAgICAgICAgLyoqPCBJRUVFIDY0LWJpdCBmbG9hdGluZyBwb2ludCBudW1iZXIgKi8KKyAgICBCQ01DTElfUEFSTV9TVFJJTkcsICAgICAgICAgIC8qKjwgU3RyaW5nICovCisgICAgQkNNQ0xJX1BBUk1fRU5VTSwgICAgICAgICAgICAvKio8IEVudW1lcmF0aW9uICovCisgICAgQkNNQ0xJX1BBUk1fRU5VTV9NQVNLLCAgICAgICAvKio8IEJpdG1hc2sgY3JlYXRlZCBmcm9tIGVudW1lcmF0aW9uIHZhbHVlcyAqLworICAgIEJDTUNMSV9QQVJNX0lQLCAgICAgICAgICAgICAgLyoqPCBJUCBhZGRyZXNzIG4ubi5uLm4gKi8KKyAgICBCQ01DTElfUEFSTV9JUFY2LCAgICAgICAgICAgIC8qKjwgSVB2NiBhZGRyZXNzICovCisgICAgQkNNQ0xJX1BBUk1fTUFDLCAgICAgICAgICAgICAvKio8IE1BQyBhZGRyZXNzIHh4Onh4Onh4Onh4Onh4Onh4ICovCisgICAgQkNNQ0xJX1BBUk1fQlVGRkVSLCAgICAgICAgICAvKio8IEJ5dGUgYXJyYXkgKi8KKworICAgIEJDTUNMSV9QQVJNX1VTRVJERUYgICAgICAgICAgLyoqPCBVc2VyLWRlZmluZWQgcGFyYW1ldGVyLiBVc2VyIG11c3QgcHJvdmlkZSBzY2FuX2NiICovCit9IGJjbWNsaV9wYXJtX3R5cGU7CisKKy8qKiBOdW1lcmljIHR5cGUgdXNlZCBmb3Igc3RvcmluZyBlbnVtIHZhbHVlcy4gKi8KK3R5cGVkZWYgbG9uZyBiY21jbGlfZW51bV9udW1iZXI7CisKKy8qKiBFbnVtIGF0dHJpYnV0ZSB2YWx1ZS4KKyAqCisgKiAgRW51bSB2YWx1ZXMgaXMgYW4gYXJyYXkgb2YgYmNtY2xpX2VudW1fdmFsIHRlcm1pbmF0ZWQgYnkgZWxlbWVudCB3aXRoIG5hbWU9PU5VTEwKKyAqCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbWNsaV9lbnVtX3ZhbAoreworICAgIGNvbnN0IGNoYXIgKm5hbWU7ICAgICAgICAgICAvKio8IEVudW0gc3ltYm9saWMgbmFtZSAqLworICAgIGJjbWNsaV9lbnVtX251bWJlciB2YWw7ICAgICAvKio8IEVudW0gaW50ZXJuYWwgdmFsdWUgKi8KKyAgICBiY21jbGlfY21kX3Bhcm0gKnBhcm1zOyAgICAgLyoqPCBFeHRlbnNpb24gcGFyYW1ldGVyIHRhYmxlIGZvciBlbnVtLXNlbGVjdG9yICovCit9IGJjbWNsaV9lbnVtX3ZhbDsKKyNkZWZpbmUgQkNNQ0xJX01BWF9FTlVNX1ZBTFVFUyAgIDEyOCAgICAgLyoqPCBNYXggbnVtYmVyIG9mIGVudW0gdmFsdWVzICovCisjZGVmaW5lIEJDTUNMSV9FTlVNX0xBU1QgICAgIHsgTlVMTCwgMH0gIC8qKjwgTGFzdCBlbnRyeSBpbiBlbnVtIHRhYmxlICovCisKKy8qKiBCb29sZWFuIHZhbHVlcyAodHJ1ZS9mYWxzZSwgeWVzL25vLCBvbi9vZmYpCisgKgorICovCitleHRlcm4gYmNtY2xpX2VudW1fdmFsIGJjbWNsaV9lbnVtX2Jvb2xfdGFibGVbXTsKKworLyogTW9uaXRvciBkYXRhIHR5cGVzICovCit0eXBlZGVmIGxvbmcgYmNtY2xpX251bWJlcjsgICAgICAvKio8IFR5cGUgdW5kZXJseWluZyBCQ01DTElfUEFSTV9OVU1CRVIsIEJDTUNMSV9QQVJNX0RFQ0lNQUwgKi8KK3R5cGVkZWYgbG9uZyBiY21jbGlfdW51bWJlcjsgICAgIC8qKjwgVHlwZSB1bmRlcmx5aW5nIEJDTUNMSV9QQVJNX0hFWCwgQkNNQ0xJX1BBUk1fVURFQ0lNQUwgKi8KK3R5cGVkZWYgbG9uZyBiY21jbGlfbnVtYmVyNjQ7ICAgIC8qKjwgVHlwZSB1bmRlcmx5aW5nIEJDTUNMSV9QQVJNX05VTUJFUjY0LCBCQ01DTElfUEFSTV9ERUNJTUFMNjQgKi8KK3R5cGVkZWYgbG9uZyBiY21jbGlfdW51bWJlcjY0OyAgIC8qKjwgVHlwZSB1bmRlcmx5aW5nIEJDTUNMSV9QQVJNX0hFWDY0LCBCQ01DTElfUEFSTV9VREVDSU1BTDY0ICovCisKKy8qKiBQYXJhbWV0ZXIgdmFsdWUgKi8KK3R5cGVkZWYgdW5pb24gYmNtY2xpX3Bhcm1fdmFsdWUKK3sKKyAgICBsb25nIG51bWJlcjsgICAgICAgICAgICAgICAgICAgIC8qKjwgU2lnbmVkIG51bWJlciAqLworICAgIHVuc2lnbmVkIGxvbmcgdW51bWJlcjsgICAgICAgICAgLyoqPCBVbnNpZ25lZCBudW1iZXIgKi8KKyAgICBsb25nIGxvbmcgbnVtYmVyNjQ7ICAgICAgICAgICAgIC8qKjwgU2lnbmVkIDY0LWJpdCBudW1iZXIgKi8KKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgdW51bWJlcjY0OyAgIC8qKjwgVW5zaWduZWQgNjQtYml0IG51bWJlciAqLworICAgIGNvbnN0IGNoYXIgKnN0cmluZzsgICAgICAgICAgICAgLyoqPCAwLXRlcm1pbmF0ZWQgc3RyaW5nICovCisgICAgZG91YmxlIGQ7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IERvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgbnVtYmVyICovCisgICAgYmNtb3NfbWFjX2FkZHJlc3MgbWFjOyAgICAgICAgICAvKio8IE1BQyBhZGRyZXNzICovCisgICAgYmNtb2x0X2J1ZiBidWZmZXI7ICAgICAgICAgICAgICAvKio8IEJ1ZmZlcjogdXNlZCBmb3IgQkNNQ0xJX1BBUk1fQlVGRkVSICovCisgICAgYmNtY2xpX2VudW1fbnVtYmVyIGVudW1fdmFsOyAgICAvKio8IEVudW0gdmFsdWUgKG51bWJlcikgKi8KK30gIGJjbWNsaV9wYXJtX3ZhbHVlOworCisvKiogVXNlci1kZWZpbmVkIHNjYW4gZnVuY3Rpb24uCisgKiBUaGUgZnVuY3Rpb24gaXMgdXNlZCBmb3IgcGFyc2luZyB1c2VyLWRlZmluZWQgcGFyYW1ldGVyIHR5cGVzCisgKiBSZXR1cm5zOiAwLW9rLCA8PWVycm9yCisgKgorICovCit0eXBlZGVmIGJjbW9zX2Vycm5vICgqYmNtY2xpX3NjYW5fY2IpKGNvbnN0IGJjbWNsaV9jbWRfcGFybSAqcGFybSwgYmNtY2xpX3Bhcm1fdmFsdWUgKnZhbHVlLAorICAgIGNvbnN0IGNoYXIgKnN0cmluZ192YWwpOworCisvKiogVXNlci1kZWZpbmVkIHByaW50IGZ1bmN0aW9uLgorICogVGhlIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIHByaW50aW5nIHVzZXItZGVmaW5lZCBwYXJhbWV0ZXIgdHlwZXMKKyAqCisgKi8KK3R5cGVkZWYgdm9pZCAoKmJjbWNsaV9mb3JtYXRfY2IpKGNvbnN0IGJjbWNsaV9jbWRfcGFybSAqcGFybSwgYmNtY2xpX3Bhcm1fdmFsdWUgdmFsdWUsCisgICAgY2hhciAqYnVmZmVyLCBpbnQgc2l6ZSk7CisKKworLyoqIEZ1bmN0aW9uIHBhcmFtZXRlciBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBiY21jbGlfY21kX3Bhcm0KK3sKKyAgIGNvbnN0IGNoYXIgKm5hbWU7ICAgICAgICAgICAgLyoqPCBQYXJhbWV0ZXIgbmFtZS4gU2hvdWxkbid0IGJlIGFsbG9jYXRlZCBvbiBzdGFjayEgKi8KKyAgIGNvbnN0IGNoYXIgKmRlc2NyaXB0aW9uOyAgICAgLyoqPCBQYXJhbWV0ZXIgZGVzY3JpcHRpb24uIFNob3VsZG4ndCBiZSBhbGxvY2F0ZWQgb24gc3RhY2shICovCisgICBiY21jbGlfcGFybV90eXBlIHR5cGU7ICAgICAgIC8qKjwgUGFyYW1ldGVyIHR5cGUgKi8KKyAgIHVpbnQ4X3QgZmxhZ3M7ICAgICAgICAgICAgICAgLyoqPCBDb21iaW5hdGlvbiBvZiBCQ01DTElfUEFSTV94eCBmbGFncyAqLworI2RlZmluZSBCQ01DTElfUEFSTV9GTEFHX05PTkUgICAgICAgMHgwMCAvKio8IEZvciB1c2UgaW5zdGVhZCBvZiBtYWdpYyBudW1iZXIgMCB3aGVuIG5vIGZsYWdzIGFwcGx5ICovCisjZGVmaW5lIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwgICAweDAxIC8qKjwgUGFyYW1ldGVyIGlzIG9wdGlvbmFsICovCisjZGVmaW5lIEJDTUNMSV9QQVJNX0ZMQUdfREVGVkFMICAgICAweDAyIC8qKjwgRGVmYXVsdCB2YWx1ZSBpcyBzZXQgKi8KKyNkZWZpbmUgQkNNQ0xJX1BBUk1fRkxBR19SQU5HRSAgICAgIDB4MDQgLyoqPCBSYW5nZSBpcyBzZXQgKi8KKyNkZWZpbmUgQkNNQ0xJX1BBUk1fRkxBR19FT0wgICAgICAgIDB4MjAgLyoqPCBTdHJpbmcgZnJvbSB0aGUgY3VycmVudCBwYXJzZXIgcG9zaXRpb24gdGlsbCBFT0wgKi8KKyNkZWZpbmUgQkNNQ0xJX1BBUk1fRkxBR19TRUxFQ1RPUiAgIDB4NDAgLyoqPCBQYXJhbWV0ZXIgc2VsZWN0cyBvdGhlciBwYXJhbWV0ZXJzICovCisjZGVmaW5lIEJDTUNMSV9QQVJNX0ZMQUdfQVNTSUdORUQgICAweDgwIC8qKjwgSW50ZXJuYWwgZmxhZzogcGFyYW1ldGVyIGlzIGFzc2lnbmVkICovCisKKyAgIGJjbWNsaV9udW1iZXIgbG93X3ZhbDsgICAgICAgLyoqPCBMb3cgdmFsIGZvciByYW5nZSBjaGVja2luZyAqLworICAgYmNtY2xpX251bWJlciBoaV92YWw7ICAgICAgICAvKio8IEhpIHZhbCBmb3IgcmFuZ2UgY2hlY2tpbmcgKi8KKyAgIGJjbWNsaV9wYXJtX3ZhbHVlIHZhbHVlOyAgICAgLyoqPCBWYWx1ZSAqLworICAgYmNtY2xpX2VudW1fdmFsICplbnVtX3RhYmxlOyAvKio8IFRhYmxlIGNvbnRhaW5pbmcgeyBlbnVtX25hbWUsIGVudW1fdmFsdWUgfSBwYWlycyAqLworICAgYmNtY2xpX3NjYW5fY2Igc2Nhbl9jYjsgICAgICAvKio8IFVzZXItZGVmaW5lZCBzY2FuIGZ1bmN0aW9uIGZvciBCQ01DTElfUEFSTV9VU0VSREVGIHBhcmFtZXRlciB0eXBlICovCisgICBiY21jbGlfZm9ybWF0X2NiIGZvcm1hdF9jYjsgIC8qKjwgVXNlci1kZWZpbmVkIGZvcm1hdCBmdW5jdGlvbiBmb3IgQkNNQ0xJX1BBUk1fVVNFUkRFRiBwYXJhbWV0ZXIgdHlwZSAqLworICAgdWludDMyX3QgbWF4X2FycmF5X3NpemU7ICAgICAvKio8IE1heCBhcnJheSBzaXplIGZvciBhcnJheS1wYXJhbWV0ZXIgKi8KKyAgIHVpbnQzMl90IGFycmF5X3NpemU7ICAgICAgICAgLyoqPCBBY3R1YWwgYXJyYXkgc2l6ZSBmb3IgYXJyYXktcGFyYW1ldGVyICovCisgICBiY21jbGlfcGFybV92YWx1ZSAqdmFsdWVzOyAgIC8qKjwgQXJyYXkgdmFsdWVzICovCisgICB2b2lkICp1c2VyX2RhdGE7ICAgICAgICAgICAgIC8qKjwgVXNlciBkYXRhIC0gcGFzc2VkIHRyYW5zcGFyZW50bHkgdG8gY29tbWFuZCBoYW5kbGVyICovCit9OworCisvKiogQ29tbWFuZCBwYXJhbWV0ZXIgbGlzdCB0ZXJtaW5hdG9yICovCisjZGVmaW5lIEJDTUNMSV9QQVJNX0xJU1RfVEVSTUlOQVRPUiAgeyAubmFtZT1OVUxMLCAudHlwZT1CQ01DTElfUEFSTV9OT05FIH0KKworLyoqIEhlbHBlciBtYWNybzogbWFrZSBzaW1wbGUgcGFyYW1ldGVyCisgKiBccGFyYW1baW5dIF9uYW1lICAgICBQYXJhbWV0ZXIgbmFtZQorICogXHBhcmFtW2luXSBfZGVzY3IgICAgUGFyYW1ldGVyIGRlc2NyaXB0aW9uCisgKiBccGFyYW1baW5dIF90eXBlICAgICBQYXJhbWV0ZXIgdHlwZQorICogXHBhcmFtW2luXSBfZmxhZ3MgICAgUGFyYW1ldGVyIGZsYWdzCisgKi8KKyNkZWZpbmUgQkNNQ0xJX01BS0VfUEFSTShfbmFtZSwgX2Rlc2NyLCBfdHlwZSwgX2ZsYWdzKSBcCisgICAgeyAubmFtZT0oX25hbWUpLCAuZGVzY3JpcHRpb249KF9kZXNjciksIC50eXBlPShfdHlwZSksIC5mbGFncz0oX2ZsYWdzKSB9CisKKy8qKiBIZWxwZXIgbWFjcm86IG1ha2Ugc2ltcGxlIHBhcmFtZXRlcgorICogXHBhcmFtW2luXSBfbmFtZSAgICAgICBQYXJhbWV0ZXIgbmFtZQorICogXHBhcmFtW2luXSBfZGVzY3IgICAgICBQYXJhbWV0ZXIgZGVzY3JpcHRpb24KKyAqIFxwYXJhbVtpbl0gX3R5cGUgICAgICAgUGFyYW1ldGVyIHR5cGUKKyAqIFxwYXJhbVtpbl0gX2ZsYWdzICAgICAgUGFyYW1ldGVyIGZsYWdzCisgKiBccGFyYW1baW5dIF9zaXplICAgICAgIE1heCBhcnJheSBzaXplCisgKiBccGFyYW1baW5dIF92YWx1ZXMgICAgIEFycmF5IHZhbHVlcyBidWZmZXIKKyAqLworI2RlZmluZSBCQ01DTElfTUFLRV9QQVJNX0FSUkFZKF9uYW1lLCBfZGVzY3IsIF90eXBlLCBfZmxhZ3MsIF9zaXplLCBfdmFsdWVzKSBcCisgICAgeyAubmFtZT0oX25hbWUpLCAuZGVzY3JpcHRpb249KF9kZXNjciksIC50eXBlPShfdHlwZSksIC5mbGFncz0oX2ZsYWdzKSxcCisgICAgICAgIC5tYXhfYXJyYXlfc2l6ZT0oX3NpemUpLCAudmFsdWVzPShfdmFsdWVzKSB9CisKKy8qKiBIZWxwZXIgbWFjcm86IG1ha2Ugc2ltcGxlIHBhcmFtZXRlciBmb3IgYXJyYXlzIG9mIGVudW1zCisgKiBccGFyYW1baW5dIF9uYW1lICAgICAgIFBhcmFtZXRlciBuYW1lCisgKiBccGFyYW1baW5dIF9kZXNjciAgICAgIFBhcmFtZXRlciBkZXNjcmlwdGlvbgorICogXHBhcmFtW2luXSBfdHlwZSAgICAgICBQYXJhbWV0ZXIgdHlwZQorICogXHBhcmFtW2luXSBfZmxhZ3MgICAgICBQYXJhbWV0ZXIgZmxhZ3MKKyAqIFxwYXJhbVtpbl0gX3NpemUgICAgICAgTWF4IGFycmF5IHNpemUKKyAqIFxwYXJhbVtpbl0gX3ZhbHVlcyAgICAgQXJyYXkgdmFsdWVzIGJ1ZmZlcgorICogXHBhcmFtW2luXSBfZW51bV90YWJsZSBBbiBhcnJheSBvZiBlbnVtcyB0aGF0IG1heSBiZSBpbiB0aGUgYXJyYXkKKyAqLworI2RlZmluZSBCQ01DTElfTUFLRV9QQVJNX0VOVU1fQVJSQVkoX25hbWUsIF9kZXNjciwgX3R5cGUsIF9mbGFncywgX3NpemUsIF92YWx1ZXMsIF9lbnVtX3RhYmxlKSBcCisgICAgeyAubmFtZT0oX25hbWUpLCAuZGVzY3JpcHRpb249KF9kZXNjciksIC50eXBlPShfdHlwZSksIC5mbGFncz0oX2ZsYWdzKSxcCisgICAgICAgIC5tYXhfYXJyYXlfc2l6ZT0oX3NpemUpLCAudmFsdWVzPShfdmFsdWVzKSwgLmVudW1fdGFibGU9KF9lbnVtX3RhYmxlKSB9CisKKy8qKiBIZWxwZXIgbWFjcm86IG1ha2UgcmFuZ2UgcGFyYW1ldGVyCisgKiBccGFyYW1baW5dIF9uYW1lICAgICBQYXJhbWV0ZXIgbmFtZQorICogXHBhcmFtW2luXSBfZGVzY3IgICAgUGFyYW1ldGVyIGRlc2NyaXB0aW9uCisgKiBccGFyYW1baW5dIF90eXBlICAgICBQYXJhbWV0ZXIgdHlwZQorICogXHBhcmFtW2luXSBfZmxhZ3MgICAgUGFyYW1ldGVyIGZsYWdzCisgKiBccGFyYW1baW5dIF9taW4gICAgICBNaW4gdmFsdWUKKyAqIFxwYXJhbVtpbl0gX21heCAgICAgIE1heCB2YWx1ZQorICovCisjZGVmaW5lIEJDTUNMSV9NQUtFX1BBUk1fUkFOR0UoX25hbWUsIF9kZXNjciwgX3R5cGUsIF9mbGFncywgX21pbiwgX21heCkgXAorICAgIHsgLm5hbWU9KF9uYW1lKSwgLmRlc2NyaXB0aW9uPShfZGVzY3IpLCAudHlwZT0oX3R5cGUpLCAuZmxhZ3M9KF9mbGFncykgfCBCQ01DTElfUEFSTV9GTEFHX1JBTkdFLCBcCisgICAgICAgIC5sb3dfdmFsPShfbWluKSwgLmhpX3ZhbD0oX21heCkgfQorCisvKiogSGVscGVyIG1hY3JvOiBtYWtlIHJhbmdlIHBhcmFtZXRlciBmb3IgYXJyYXlzIHdpdGggcmFuZ2UKKyAqIFxwYXJhbVtpbl0gX25hbWUgICAgIFBhcmFtZXRlciBuYW1lCisgKiBccGFyYW1baW5dIF9kZXNjciAgICBQYXJhbWV0ZXIgZGVzY3JpcHRpb24KKyAqIFxwYXJhbVtpbl0gX3R5cGUgICAgIFBhcmFtZXRlciB0eXBlCisgKiBccGFyYW1baW5dIF9mbGFncyAgICBQYXJhbWV0ZXIgZmxhZ3MKKyAqIFxwYXJhbVtpbl0gX3NpemUgICAgIE1heCBhcnJheSBzaXplCisgKiBccGFyYW1baW5dIF92YWx1ZXMgICBBcnJheSB2YWx1ZXMgYnVmZmVyCisgKiBccGFyYW1baW5dIF9taW4gICAgICBNaW4gdmFsdWUKKyAqIFxwYXJhbVtpbl0gX21heCAgICAgIE1heCB2YWx1ZQorICovCisjZGVmaW5lIEJDTUNMSV9NQUtFX1BBUk1fQVJSQVlfUkFOR0UoX25hbWUsIF9kZXNjciwgX3R5cGUsIF9mbGFncywgX3NpemUsIF92YWx1ZXMsIF9taW4sIF9tYXgpIFwKKyAgICB7IC5uYW1lPShfbmFtZSksIC5kZXNjcmlwdGlvbj0oX2Rlc2NyKSwgLnR5cGU9KF90eXBlKSwgLmZsYWdzPShfZmxhZ3MpIHwgQkNNQ0xJX1BBUk1fRkxBR19SQU5HRSxcCisgICAgICAgICAubWF4X2FycmF5X3NpemU9KF9zaXplKSwgLnZhbHVlcz0oX3ZhbHVlcyksIC5sb3dfdmFsPShfbWluKSwgLmhpX3ZhbD0oX21heCkgfQorCisvKiogSGVscGVyIG1hY3JvOiBtYWtlIHBhcmFtZXRlciB3aXRoIGRlZmF1bHQgdmFsdWUKKyAqIFxwYXJhbVtpbl0gX25hbWUgICAgIFBhcmFtZXRlciBuYW1lCisgKiBccGFyYW1baW5dIF9kZXNjciAgICBQYXJhbWV0ZXIgZGVzY3JpcHRpb24KKyAqIFxwYXJhbVtpbl0gX3R5cGUgICAgIFBhcmFtZXRlciB0eXBlCisgKiBccGFyYW1baW5dIF9mbGFncyAgICBQYXJhbWV0ZXIgZmxhZ3MKKyAqIFxwYXJhbVtpbl0gX2RmdCAgICAgIERlZmF1bHQgdmFsdWUKKyAqLworI2RlZmluZSBCQ01DTElfTUFLRV9QQVJNX0RFRlZBTChfbmFtZSwgX2Rlc2NyLCBfdHlwZSwgX2ZsYWdzLCBfZGZ0KSBcCisgICAgeyAubmFtZT0oX25hbWUpLCAuZGVzY3JpcHRpb249KF9kZXNjciksIC50eXBlPShfdHlwZSksIC5mbGFncz0oX2ZsYWdzKSB8IEJDTUNMSV9QQVJNX0ZMQUdfREVGVkFMLCBcCisgICAgICAgIC52YWx1ZSA9IHtfZGZ0fSB9CisKKy8qKiBIZWxwZXIgbWFjcm86IG1ha2UgcmFuZ2UgcGFyYW1ldGVyIHdpdGggZGVmYXVsdCB2YWx1ZQorICogXHBhcmFtW2luXSBfbmFtZSAgICAgUGFyYW1ldGVyIG5hbWUKKyAqIFxwYXJhbVtpbl0gX2Rlc2NyICAgIFBhcmFtZXRlciBkZXNjcmlwdGlvbgorICogXHBhcmFtW2luXSBfdHlwZSAgICAgUGFyYW1ldGVyIHR5cGUKKyAqIFxwYXJhbVtpbl0gX2ZsYWdzICAgIFBhcmFtZXRlciBmbGFncworICogXHBhcmFtW2luXSBfbWluICAgICAgTWluIHZhbHVlCisgKiBccGFyYW1baW5dIF9tYXggICAgICBNYXggdmFsdWUKKyAqIFxwYXJhbVtpbl0gX2RmdCAgICAgIERlZmF1bHQgdmFsdWUKKyAqLworI2RlZmluZSBCQ01DTElfTUFLRV9QQVJNX1JBTkdFX0RFRlZBTChfbmFtZSwgX2Rlc2NyLCBfdHlwZSwgX2ZsYWdzLCBfbWluLCBfbWF4LCBfZGZ0KSBcCisgICAgeyAubmFtZT0oX25hbWUpLCAuZGVzY3JpcHRpb249KF9kZXNjciksIC50eXBlPShfdHlwZSksIFwKKyAgICAgICAgLmZsYWdzPShfZmxhZ3MpIHwgQkNNQ0xJX1BBUk1fRkxBR19SQU5HRSB8IEJDTUNMSV9QQVJNX0ZMQUdfREVGVkFMLCBcCisgICAgICAgIC5sb3dfdmFsPShfbWluKSwgLmhpX3ZhbD0oX21heCksIC52YWx1ZSA9IHtfZGZ0fSB9CisKKy8qKiBIZWxwZXIgbWFjcm86IG1ha2UgZW51bSBwYXJhbWV0ZXIKKyAqIFxwYXJhbVtpbl0gX25hbWUgICAgIFBhcmFtZXRlciBuYW1lCisgKiBccGFyYW1baW5dIF9kZXNjciAgICBQYXJhbWV0ZXIgZGVzY3JpcHRpb24KKyAqIFxwYXJhbVtpbl0gX3ZhbHVlcyAgIEVudW0gdmFsdWVzIHRhYmxlCisgKiBccGFyYW1baW5dIF9mbGFncyAgICBQYXJhbWV0ZXIgZmxhZ3MKKyAqLworI2RlZmluZSBCQ01DTElfTUFLRV9QQVJNX0VOVU0oX25hbWUsIF9kZXNjciwgX3ZhbHVlcywgX2ZsYWdzKSBcCisgICAgeyAubmFtZT0oX25hbWUpLCAuZGVzY3JpcHRpb249KF9kZXNjciksIC50eXBlPUJDTUNMSV9QQVJNX0VOVU0sIC5mbGFncz0oX2ZsYWdzKSwgLmVudW1fdGFibGU9KF92YWx1ZXMpfQorCisvKiogSGVscGVyIG1hY3JvOiBtYWtlIGVudW0gcGFyYW1ldGVyIHdpdGggZGVmYXVsdCB2YWx1ZQorICogXHBhcmFtW2luXSBfbmFtZSAgICAgUGFyYW1ldGVyIG5hbWUKKyAqIFxwYXJhbVtpbl0gX2Rlc2NyICAgIFBhcmFtZXRlciBkZXNjcmlwdGlvbgorICogXHBhcmFtW2luXSBfdmFsdWVzICAgRW51bSB2YWx1ZXMgdGFibGUKKyAqIFxwYXJhbVtpbl0gX2ZsYWdzICAgIFBhcmFtZXRlciBmbGFncworICogXHBhcmFtW2luXSBfZGZ0ICAgICAgRGVmYXVsdCB2YWx1ZQorICovCisjZGVmaW5lIEJDTUNMSV9NQUtFX1BBUk1fRU5VTV9ERUZWQUwoX25hbWUsIF9kZXNjciwgX3ZhbHVlcywgX2ZsYWdzLCBfZGZ0KSBcCisgICAgeyAubmFtZT0oX25hbWUpLCAuZGVzY3JpcHRpb249KF9kZXNjciksIC50eXBlPUJDTUNMSV9QQVJNX0VOVU0sIC5mbGFncz0oX2ZsYWdzKSB8IEJDTUNMSV9QQVJNX0ZMQUdfREVGVkFMLFwKKyAgICAgICAgLmVudW1fdGFibGU9KF92YWx1ZXMpLCAudmFsdWU9ey5zdHJpbmc9X2RmdH0gfQorCisvKiogSGVscGVyIG1hY3JvOiBtYWtlIGVudW0gbWFzayBwYXJhbWV0ZXIKKyAqIFxwYXJhbVtpbl0gX25hbWUgICAgIFBhcmFtZXRlciBuYW1lCisgKiBccGFyYW1baW5dIF9kZXNjciAgICBQYXJhbWV0ZXIgZGVzY3JpcHRpb24KKyAqIFxwYXJhbVtpbl0gX3ZhbHVlcyAgIEVudW0gdmFsdWVzIHRhYmxlCisgKiBccGFyYW1baW5dIF9mbGFncyAgICBQYXJhbWV0ZXIgZmxhZ3MKKyAqLworI2RlZmluZSBCQ01DTElfTUFLRV9QQVJNX0VOVU1fTUFTSyhfbmFtZSwgX2Rlc2NyLCBfdmFsdWVzLCBfZmxhZ3MpIFwKKyAgICB7IC5uYW1lPShfbmFtZSksIC5kZXNjcmlwdGlvbj0oX2Rlc2NyKSwgLnR5cGU9QkNNQ0xJX1BBUk1fRU5VTV9NQVNLLCAuZmxhZ3M9KF9mbGFncyksIC5lbnVtX3RhYmxlPShfdmFsdWVzKX0KKworLyoqIEhlbHBlciBtYWNybzogbWFrZSBlbnVtX21hc2sgcGFyYW1ldGVyIHdpdGggZGVmYXVsdCB2YWx1ZQorICogXHBhcmFtW2luXSBfbmFtZSAgICAgUGFyYW1ldGVyIG5hbWUKKyAqIFxwYXJhbVtpbl0gX2Rlc2NyICAgIFBhcmFtZXRlciBkZXNjcmlwdGlvbgorICogXHBhcmFtW2luXSBfdmFsdWVzICAgRW51bSB2YWx1ZXMgdGFibGUKKyAqIFxwYXJhbVtpbl0gX2ZsYWdzICAgIFBhcmFtZXRlciBmbGFncworICogXHBhcmFtW2luXSBfZGZ0ICAgICAgRGVmYXVsdCB2YWx1ZQorICovCisjZGVmaW5lIEJDTUNMSV9NQUtFX1BBUk1fRU5VTV9NQVNLX0RFRlZBTChfbmFtZSwgX2Rlc2NyLCBfdmFsdWVzLCBfZmxhZ3MsIF9kZnQpIFwKKyAgICB7IC5uYW1lPShfbmFtZSksIC5kZXNjcmlwdGlvbj0oX2Rlc2NyKSwgLnR5cGU9QkNNQ0xJX1BBUk1fRU5VTV9NQVNLLCAuZmxhZ3M9KF9mbGFncykgfCBCQ01DTElfUEFSTV9GTEFHX0RFRlZBTCxcCisgICAgICAgIC5lbnVtX3RhYmxlPShfdmFsdWVzKSwgLnZhbHVlPXsuc3RyaW5nPV9kZnR9IH0KKworLyoqIEhlbHBlciBtYWNybzogbWFrZSBlbnVtLXNlbGVjdG9yIHBhcmFtZXRlcgorICogXHBhcmFtW2luXSBfbmFtZSAgICAgUGFyYW1ldGVyIG5hbWUKKyAqIFxwYXJhbVtpbl0gX2Rlc2NyICAgIFBhcmFtZXRlciBkZXNjcmlwdGlvbgorICogXHBhcmFtW2luXSBfdmFsdWVzICAgU2VsZWN0b3IgdmFsdWVzIHRhYmxlCisgKiBccGFyYW1baW5dIF9mbGFncyAgICBQYXJhbWV0ZXIgZmxhZ3MKKyAqLworI2RlZmluZSBCQ01DTElfTUFLRV9QQVJNX1NFTEVDVE9SKF9uYW1lLCBfZGVzY3IsIF92YWx1ZXMsIF9mbGFncykgXAorICAgIHsgLm5hbWU9KF9uYW1lKSwgLmRlc2NyaXB0aW9uPShfZGVzY3IpLCAudHlwZT1CQ01DTElfUEFSTV9FTlVNLCAuZmxhZ3M9KF9mbGFncykgfCBCQ01DTElfUEFSTV9GTEFHX1NFTEVDVE9SLFwKKyAgICAgICAgLmVudW1fdGFibGU9KF92YWx1ZXMpIH0KKworLyoqIEhlbHBlciBtYWNybzogbWFrZSBidWZmZXIgcGFyYW1ldGVyCisgKiBccGFyYW1baW5dIF9uYW1lICAgICBQYXJhbWV0ZXIgbmFtZQorICogXHBhcmFtW2luXSBfZGVzY3IgICAgUGFyYW1ldGVyIGRlc2NyaXB0aW9uCisgKiBccGFyYW1baW5dIF9mbGFncyAgICBQYXJhbWV0ZXIgZmxhZ3MKKyAqIFxwYXJhbVtpbl0gX2J1ZiAgICAgIE1lbW9yeSBidWZmZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXJhbWV0ZXIKKyAqIFxwYXJhbVtpbl0gX3NpemUgICAgIEJ1ZmZlciBzaXplCisgKi8KKyNkZWZpbmUgQkNNQ0xJX01BS0VfUEFSTV9CVUZGRVIoX25hbWUsIF9kZXNjciwgX2ZsYWdzLCBfYnVmLCBfc2l6ZSkgXAorICAgIHsgLm5hbWU9KF9uYW1lKSwgLmRlc2NyaXB0aW9uPShfZGVzY3IpLCAudHlwZT1CQ01DTElfUEFSTV9CVUZGRVIsIFwKKyAgICAgICAgLmZsYWdzPShfZmxhZ3MpLCAudmFsdWUuYnVmZmVyID0gey5zdGFydCA9IF9idWYsIC5jdXJyID0gX2J1ZiwgLmxlbiA9IF9zaXplfSB9CisKKy8qKiBSZWdpc3RlciBjb21tYW5kIHdpdGhvdXQgcGFyYW1ldGVycyBoZWxwZXIgKi8KKyNkZWZpbmUgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsIGNtZCwgaGVscCwgY2IpIFwKK3tcCisgICAgYmNtb3NfZXJybm8gYmNtY2xpX2NtZF9hZGRfZXJyID0gYmNtY2xpX2NtZF9hZGQoZGlyLCBjbWQsIGNiLCBoZWxwLCBCQ01DTElfQUNDRVNTX0FETUlOLCBOVUxMLCBOVUxMKTtcCisgICAgQlVHX09OKEJDTV9FUlJfT0sgIT0gYmNtY2xpX2NtZF9hZGRfZXJyKTtcCit9CisKKy8qKiBSZWdpc3RlciBjb21tYW5kIGhlbHBlciAqLworI2RlZmluZSBCQ01DTElfTUFLRV9DTUQoZGlyLCBjbWQsIGhlbHAsIGNiLCBwYXJtcy4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgYmNtY2xpX2NtZF9wYXJtIGNtZF9wYXJtc1tdPXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwYXJtcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJDTUNMSV9QQVJNX0xJU1RfVEVSTUlOQVRPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJjbW9zX2Vycm5vIGJjbWNsaV9jbWRfYWRkX2VyciA9IGJjbWNsaV9jbWRfYWRkKGRpciwgY21kLCBjYiwgaGVscCwgQkNNQ0xJX0FDQ0VTU19BRE1JTiwgTlVMTCwgY21kX3Bhcm1zKTsgICBcCisgICAgQlVHX09OKEJDTV9FUlJfT0sgIT0gYmNtY2xpX2NtZF9hZGRfZXJyKTtcCit9CisKKy8qKiBPcHRpb25hbCBjdXN0b20gZGlyZWN0b3J5IGhhbmRsZXJzICovCit0eXBlZGVmIHZvaWQgKCpiY21jbGlfZGlyX2VudGVyX2xlYXZlX2NiKShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYmNtY2xpX2VudHJ5ICpkaXIsIGludCBpc19lbnRlcik7CisKKy8qKiBPcHRpb25hbCBjb21tYW5kIG9yIGRpcmVjdG9yeSBoZWxwIGNhbGxiYWNrCisgKiBccGFyYW1baW5dICAgc2Vzc2lvbiAgICAgU2Vzc2lvbiBoYW5kbGUKKyAqIFxwYXJhbVtpbl0gICBoICAgICAgICAgICBDb21tYW5kIG9yIGRpcmVjdG9yeSBoYW5kbGUKKyAqIFxwYXJhbVtpbl0gICBwYXJtcyAgICAgICBQYXJhbWV0ZXIocykgLSB0aGUgcmVzdCBvZiB0aGUgY29tbWFuZCBzdHJpbmcuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuIGJlIHVzZWQgZm9yIGV4YW1wbGUgdG8gZ2V0IGhlbHAgb24gaW5kaXZpZHVhbCBwYXJhbWV0ZXJzCisgKi8KK3R5cGVkZWYgdm9pZCAoKmJjbWNsaV9oZWxwX2NiKShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYmNtY2xpX2VudHJ5ICpoLCBjb25zdCBjaGFyICpwYXJtcyk7CisKKworLyoqIEV4dHJhIHBhcmFtZXRlcnMgb2YgbW9uaXRvciBkaXJlY3RvcnkuCisgKiBTZWUgXHJlZiBiY21jbGlfZGlyX2FkZAorICoKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtY2xpX2Rpcl9leHRyYV9wYXJtCit7CisgICAgdm9pZCAqdXNlcl9wcml2OyAgICAgICAgICAgIC8qKjwgcHJpdmF0ZSBkYXRhIHBhc3NlZCB0byBlbnRlcl9sZWF2ZV9jYiAqLworICAgIGJjbWNsaV9kaXJfZW50ZXJfbGVhdmVfY2IgZW50ZXJfbGVhdmVfY2I7IC8qKjwgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gc2Vzc2lvbiBlbnRlcnMvbGVhdnMgdGhlIGRpcmVjdG9yeSAqLworICAgIGJjbWNsaV9oZWxwX2NiIGhlbHBfY2I7ICAgICAvKio8IEhlbHAgZnVuY3Rpb24gY2FsbGVkIHRvIHByaW50IGRpcmVjdG9yeSBoZWxwIGluc3RlYWQgb2YgdGhlIGF1dG9tYXRpYyBoZWxwICovCit9IGJjbWNsaV9kaXJfZXh0cmFfcGFybTsKKworCisvKiogRXh0cmEgcGFyYW1ldGVycyBvZiBtb25pdG9yIGNvbW1hbmQuCisgKiBTZWUgXHJlZiBiY21jbGlfY21kX2FkZAorICoKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtY2xpX2NtZF9leHRyYV9wYXJtCit7CisgICAgYmNtY2xpX2hlbHBfY2IgaGVscF9jYjsgICAgIC8qKjwgT3B0aW9uYWwgaGVscCBjYWxsYmFjay4gQ2FuIGJlIHVzZWQgZm9yIG1vcmUgc29waGlzdGljYXRlZCBoZWxwLCBlLmcuLCBoZWxwIGZvciBzcGVjaWZpYyBwYXJhbWV0ZXJzICovCisgICAgdWludDMyX3QgZmxhZ3M7ICAgICAgICAgICAgIC8qKjwgQ29tbWFuZCBmbGFncyAqLworI2RlZmluZSBCQ01DTElfQ01EX0ZMQUdfTk9fTkFNRV9QQVJNUyAgIDB4MDAwMDAwMDEgLyoqPCBObyBuYW1lZCBwYXJtcy4gUG9zaXRpb25hbCBvbmx5LiBDYW4gYmUgdXNlZnVsIGlmIHBhcmFtZXRlciB2YWx1ZSBjYW4gY29udGFpbiAnLCcgKi8KKyAgICB2b2lkICgqZnJlZV9wYXJtcykoYmNtY2xpX2NtZF9wYXJtICpwYXJtcyk7ICAgIC8qIE9wdGlvbmFsIHVzZXItZGVmaW5lZCBmcmVlICovCit9IGJjbWNsaV9jbWRfZXh0cmFfcGFybTsKKworCisvKiogTW9uaXRvciBjb21tYW5kIGhhbmRsZXIgcHJvdG90eXBlICovCit0eXBlZGVmIGJjbW9zX2Vycm5vICgqYmNtY2xpX2NtZF9jYikoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpOworCisvKiogQ0xJIGNvbW1hbmQgbG9nZ2luZyBtb2RlICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBCQ01DTElfTE9HX05PTkUsICAgICAgICAgICAgICAgIC8qKjwgRGlzYWJsZSBsb2dnaW5nICovCisgICAgQkNNQ0xJX0xPR19DTEksICAgICAgICAgICAgICAgICAvKio8IExvZyBjb21tYW5kcyBhcyBpcyBhbmQgcmMgYXMgQ0xJIGNvbW1lbnQqLworICAgIEJDTUNMSV9MT0dfQ19DT01NRU5UICAgICAgICAgICAgLyoqPCBMb2cgYXMgQyBjb21tZW50cyAqLworfSBiY21jbGlfbG9nX21vZGU7CisKKy8qKiBBZGQgc3ViZGlyZWN0b3J5IHRvIHRoZSBwYXJlbnQgZGlyZWN0b3J5CisgKgorICogXHBhcmFtW2luXSAgIHBhcmVudCAgICAgICAgICBQYXJlbnQgZGlyZWN0b3J5IGhhbmRsZS4gTlVMTD1yb290CisgKiBccGFyYW1baW5dICAgbmFtZSAgICAgICAgICAgIERpcmVjdG9yeSBuYW1lCisgKiBccGFyYW1baW5dICAgaGVscCAgICAgICAgICAgIEhlbHAgc3RyaW5nCisgKiBccGFyYW1baW5dICAgYWNjZXNzX3JpZ2h0ICAgIEFjY2VzcyByaWdodHMKKyAqIFxwYXJhbVtpbl0gICBleHRyYXMgICAgICAgICAgT3B0aW9uYWwgZGlyZWN0b3J5IGRlc2NyaXB0b3IuIE11c3RuJ3QgYmUgYWxsb2NhdGVkIG9uIHRoZSBzdGFjay4KKyAqIFxyZXR1cm4gICAgICBuZXcgZGlyZWN0b3J5IGhhbmRsZSBvciBOVUxMIGluIGNhc2Ugb2YgZmFpbHVyZQorICovCitiY21jbGlfZW50cnkgKmJjbWNsaV9kaXJfYWRkKGJjbWNsaV9lbnRyeSAqcGFyZW50LCBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpoZWxwLCBiY21jbGlfYWNjZXNzX3JpZ2h0IGFjY2Vzc19yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmNtY2xpX2Rpcl9leHRyYV9wYXJtICpleHRyYXMpOworCisKKy8qKiBTY2FuIGRpcmVjdG9yeSB0cmVlIGFuZCBsb29rIGZvciBkaXJlY3RvcnkgbmFtZWQgIm5hbWUiLgorICoKKyAqIFxwYXJhbVtpbl0gICBwYXJlbnQgICAgICAgICAgRGlyZWN0b3J5IHN1Yi10cmVlIHJvb3QuIE5VTEw9cm9vdAorICogXHBhcmFtW2luXSAgIG5hbWUgICAgICAgICAgICBOYW1lIG9mIGRpcmVjdG9yeSB0byBiZSBmb3VuZAorICogXHJldHVybiAgICAgIGRpcmVjdG9yeSBoYW5kbGUgaWYgZm91bmQgb3IgTlVMTCBpZiBub3QgZm91bmQKKyAqLworYmNtY2xpX2VudHJ5ICpiY21jbGlfZGlyX2ZpbmQoYmNtY2xpX2VudHJ5ICpwYXJlbnQsIGNvbnN0IGNoYXIgKm5hbWUgKTsKKworCisvKiogU2NhbiBkaXJlY3RvcnkgdHJlZSBhbmQgbG9vayBmb3IgY29tbWFuZCBuYW1lZCAibmFtZSIuCisgKgorICogXHBhcmFtW2luXSAgIHBhcmVudCAgICAgICAgICBEaXJlY3Rvcnkgc3ViLXRyZWUgcm9vdC4gTlVMTD1yb290CisgKiBccGFyYW1baW5dICAgbmFtZSAgICAgICAgICAgIE5hbWUgb2YgY29tbWFuZCB0byBiZSBmb3VuZAorICogXHJldHVybiAgICAgIGNvbW1hbmQgaGFuZGxlIGlmIGZvdW5kIG9yIE5VTEwgaWYgbm90IGZvdW5kCisgKi8KK2JjbWNsaV9lbnRyeSAqYmNtY2xpX2NtZF9maW5kKGJjbWNsaV9lbnRyeSAqcGFyZW50LCBjb25zdCBjaGFyICpuYW1lICk7CisKKworLyoqIEdldCB0b2tlbiBuYW1lCisgKiBccGFyYW1baW5dICAgdG9rZW4gICAgICAgICAgIERpcmVjdG9yeSBvciBjb21tYW5kIHRva2VuCisgKiBccmV0dXJuICAgICAgZGlyZWN0b3J5IHRva2VuIG5hbWUKKyAqLworY29uc3QgY2hhciAqYmNtY2xpX3Rva2VuX25hbWUoYmNtY2xpX2VudHJ5ICp0b2tlbik7CisKKy8qKiBGaW5kIHRoZSBDTEkgcGFyYW1ldGVyIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIChjYXNlIGluc2Vuc2l0aXZlKS4KKyAqIFxwYXJhbVtpbl0gICBzZXNzaW9uICBDTEkgc2Vzc2lvbgorICogXHBhcmFtW2luXSAgIG5hbWUgICAgIFBhcmFtZXRlciBuYW1lCisgKiBccmV0dXJuICAgICAgVGhlIENMSSBwYXJhbWV0ZXIgdGhhdCB3YXMgZm91bmQsIG9yIE5VTEwgaWYgbm90IGZvdW5kCisgKi8KK2JjbWNsaV9jbWRfcGFybSAqYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqbmFtZSk7CisKKy8qKiBGaW5kIHRoZSBmaXJzdCBDTEkgcGFyYW1ldGVyIHdob3NlIG5hbWUgc3RhcnRzIHdpdGggdGhlIHNwZWNpZmllZCBzdHJpbmcgKGNhc2UgaW5zZW5zaXRpdmUpLgorICogXHBhcmFtW2luXSAgIHNlc3Npb24gIENMSSBzZXNzaW9uCisgKiBccGFyYW1baW5dICAgcHJlZml4ICAgUGFyYW1ldGVyIG5hbWUgcHJlZml4CisgKiBccmV0dXJuICAgICAgVGhlIENMSSBwYXJhbWV0ZXIgdGhhdCB3YXMgZm91bmQsIG9yIE5VTEwgaWYgbm90IGZvdW5kCisgKi8KK2JjbWNsaV9jbWRfcGFybSAqYmNtY2xpX2ZpbmRfcGFybV9ieV9wcmVmaXgoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGNoYXIgKnByZWZpeCk7CisKKy8qKiBRdWVyeSBwYXJhbWV0ZXIgdmFsdWUgc3RhdHVzLgorICogVGhlIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGZvciBzY2FsYXIgYW5kIGFycmF5IHBhcmFtZXRlcnMKKyAqIFxwYXJhbVtpbl0gICBzZXNzaW9uICAgICAgICAgQ0xJIHNlc3Npb24KKyAqIFxwYXJhbVtpbl0gICBwYXJtICAgICAgICAgICAgUGFyYW1ldGVyIGZyb20gdGhlIGFycmF5IHBhc3NlZCB0byB0aGUgQ0xJIGNvbW1hbmQgaGFuZGxlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciByZXR1cm5lZCBieSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKCkKKyAqIFxwYXJhbVtpbl0gICB2YWx1ZV9pbmRleCAgICAgdmFsdWVfaW5kZXggLSBmb3IgYXJyYXkgcGFyYW1ldGVycworICogXHJldHVybiAgICAgIEJDTU9TX1RSVUUgaWYgdGhlIHBhcmFtZXRlciB2YWx1ZSBpcyBzZXQsIEJDTU9TX0ZBTFNFIG90aGVyd2lzZQorICovCitiY21vc19ib29sIGJjbWNsaV9wYXJtX3ZhbHVlX2lzX3NldChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYmNtY2xpX2NtZF9wYXJtICpwYXJtLCB1aW50MzJfdCB2YWx1ZV9pbmRleCk7CisKKy8qKiBBZGQgQ0xJIGNvbW1hbmQKKyAqCisgKiBccGFyYW1baW5dICAgZGlyICAgICAgICAgICAgIEhhbmRsZSBvZiBkaXJlY3RvcnkgdG8gYWRkIGNvbW1hbmQgdG8uIE5VTEw9cm9vdAorICogXHBhcmFtW2luXSAgIG5hbWUgICAgICAgICAgICBDb21tYW5kIG5hbWUKKyAqIFxwYXJhbVtpbl0gICBjbWRfY2IgICAgICAgICAgQ29tbWFuZCBoYW5kbGVyCisgKiBccGFyYW1baW5dICAgaGVscCAgICAgICAgICAgIEhlbHAgc3RyaW5nCisgKiBccGFyYW1baW5dICAgYWNjZXNzX3JpZ2h0ICAgIEFjY2VzcyByaWdodHMKKyAqIFxwYXJhbVtpbl0gICBleHRyYXMgICAgICAgICAgT3B0aW9uYWwgZXh0cmFzCisgKiBccGFyYW1baW5dICAgcGFybXMgICAgICAgICAgIE9wdGlvbmFsIHBhcmFtZXRlcnMgYXJyYXkuIE11c3Qgbm90IGJlIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2shCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHBhcm1zIT1OVUxMLCB0aGUgbGFzdCBwYXJhbWV0ZXIgaW4gdGhlIGFycmF5IG11c3QgaGF2ZSBuYW1lPT1OVUxMLgorICogXHJldHVybgorICogICAgICAwICAgPU9LXG4KKyAqICAgICAgPDAgID1lcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbWNsaV9jbWRfYWRkKGJjbWNsaV9lbnRyeSAqZGlyLCBjb25zdCBjaGFyICpuYW1lLCBiY21jbGlfY21kX2NiIGNtZF9jYiwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhlbHAsIGJjbWNsaV9hY2Nlc3NfcmlnaHQgYWNjZXNzX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgY29uc3QgYmNtY2xpX2NtZF9leHRyYV9wYXJtICpleHRyYXMsIGJjbWNsaV9jbWRfcGFybSBwYXJtc1tdKTsKKworCisvKiogRGVzdHJveSB0b2tlbiAoY29tbWFuZCBvciBkaXJlY3RvcnkpCisgKiBccGFyYW1baW5dICAgdG9rZW4gICAgICAgICAgIERpcmVjdG9yeSBvciBjb21tYW5kIHRva2VuLiBOVUxMPXJvb3QKKyAqLwordm9pZCBiY21jbGlfdG9rZW5fZGVzdHJveShiY21jbGlfZW50cnkgKnRva2VuKTsKKworLyoqIFBhcnNlIGFuZCBleGVjdXRlIGlucHV0IHN0cmluZy4KKyAqIGlucHV0X3N0cmluZyBjYW4gY29udGFpbiBtdWx0aXBsZSBjb21tYW5kcyBkZWxpbWl0ZWQgYnkgJzsnCisgKgorICogXHBhcmFtW2luXSAgIHNlc3Npb24gICAgICAgICBTZXNzaW9uIGhhbmRsZQorICogXHBhcmFtW2luXSAgIGlucHV0X3N0cmluZyAgICBTdHJpbmcgdG8gYmUgcGFyc2VkCisgKiBccmV0dXJuCisgKiAgICAgID0wICAtIE9LIFxuCisgKiAgICAgIC1FSU5WQUwgLSBwYXJzaW5nIGVycm9yXG4KKyAqICAgICAgb3RoZXIgLSByZXR1cm4gY29kZSAtIGFzIHJldHVybmVkIGZyb20gY29tbWFuZCBoYW5kbGVyLgorICogICAgICAgICAgICBJdCBpcyByZWNvbW1lbmRlZCB0byByZXR1cm4gLUVJTlRSIHRvIGludGVycnVwdCBtb25pdG9yIGxvb3AuCisgKi8KK2JjbW9zX2Vycm5vIGJjbWNsaV9wYXJzZShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY2hhciAqaW5wdXRfc3RyaW5nKTsKKworLyoqIFJlYWQgaW5wdXQgYW5kIHBhcnNlIGl0ZXJhdGl2ZWx5IHVudGlsIEVPRiBvciBiY21jbGlfaXNfc3RvcHBlZCgpCisgKgorICogXHBhcmFtW2luXSAgIHNlc3Npb24gICAgICAgICBTZXNzaW9uIGhhbmRsZQorICogXHJldHVybgorICogICAgICA9MCAgLSBPSyBcbgorICovCitiY21vc19lcnJubyBiY21jbGlfZHJpdmVyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKTsKKworLyoqIFN0b3AgbW9uaXRvciBkcml2ZXIuCisgKiBUaGUgZnVuY3Rpb24gc3RvcHMgXHJlZiBiY21jbGlfZHJpdmVyCisgKiBccGFyYW1baW5dICAgc2Vzc2lvbiAgICAgICAgIFNlc3Npb24gaGFuZGxlCisgKi8KK3ZvaWQgYmNtY2xpX3N0b3AoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pOworCisvKiogUmV0dXJucyAxIGlmIG1vbml0b3Igc2Vzc2lvbiBpcyBzdG9wcGVkCisgKiBccGFyYW1baW5dICAgc2Vzc2lvbiAgICAgICAgIFNlc3Npb24gaGFuZGxlCisgKiBccmV0dXJucyAxIGlmIG1vbml0b3Igc2Vzc2lvbiBzdG9wcGVkIGJ5IGJjbWNsaV9zdG9wKClcbgorICogMCBvdGhlcndpc2UKKyAqLworYmNtb3NfYm9vbCBiY21jbGlfaXNfc3RvcHBlZChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbik7CisKKy8qKiBHZXQgY3VycmVudCBkaXJlY3RvcnkgZm9yIHRoZSBzZXNzaW9uLAorICogXHBhcmFtW2luXSAgIHNlc3Npb24gICAgICAgICBTZXNzaW9uIGhhbmRsZQorICogXHJldHVybiAgICAgIFRoZSBjdXJyZW50IGRpcmVjdG9yeSBoYW5kbGUKKyAqLworYmNtY2xpX2VudHJ5ICpiY21jbGlfZGlyX2dldChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiApOworCisvKiogU2V0IGN1cnJlbnQgZGlyZWN0b3J5IGZvciB0aGUgc2Vzc2lvbi4KKyAqIFxwYXJhbVtpbl0gICBzZXNzaW9uICAgICAgICAgU2Vzc2lvbiBoYW5kbGUKKyAqIFxwYXJhbVtpbl0gICBkaXIgICAgICAgICAgICAgRGlyZWN0b3J5IHRoYXQgc2hvdWxkIGJlY29tZSBjdXJyZW50CisgKiBccmV0dXJuCisgKiAgICAgID0wICAtIE9LCisgKiAgICAgIDwwICAtIGVycm9yCisgKi8KK2JjbW9zX2Vycm5vIGJjbWNsaV9kaXJfc2V0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBiY21jbGlfZW50cnkgKmRpcik7CisKKy8qKiBHZXQgcGFyYW1ldGVyIG51bWJlciBnaXZlbiBpdHMgbmFtZS4KKyAqIFRoZSBmdW5jdGlvbiBpcyBpbnRlbmRlZCBmb3IgdXNlIGJ5IGNvbW1hbmQgaGFuZGxlcnMKKyAqIFxwYXJhbVtpbl0gICAgICAgc2Vzc2lvbiAgICAgICAgIFNlc3Npb24gaGFuZGxlCisgKiBccGFyYW1baW5dICAgICAgIHBhcm1fbmFtZSAgICAgICBQYXJhbWV0ZXIgbmFtZQorICogXHJldHVybgorICogID49MCAtIHBhcmFtZXRlciBudW1iZXJcbgorICogIDwwICAtIHBhcmFtZXRlciB3aXRoIHRoaXMgbmFtZSBkb2Vzbid0IGV4aXN0CisgKi8KK2ludCBiY21jbGlfcGFybV9udW1iZXIoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGNoYXIgKnBhcm1fbmFtZSk7CisKKy8qKiBHZXQgcGFyYW1ldGVyIGJ5IG5hbWUKKyAqIFRoZSBmdW5jdGlvbiBpcyBpbnRlbmRlZCBmb3IgdXNlIGJ5IGNvbW1hbmQgaGFuZGxlcnMKKyAqIFxwYXJhbVtpbl0gICAgICAgc2Vzc2lvbiAgICAgICAgIFNlc3Npb24gaGFuZGxlCisgKiBccGFyYW1baW5dICAgICAgIHBhcm1fbmFtZSAgICAgICBQYXJhbWV0ZXIgbmFtZQorICogXHJldHVybgorICogcGFyYW1ldGVyIHBvaW50ZXIgb3IgTlVMTCBpZiBub3QgZm91bmQKKyAqLworYmNtY2xpX2NtZF9wYXJtICpiY21jbGlfcGFybV9nZXQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGNoYXIgKnBhcm1fbmFtZSk7CisKKy8qKiBDaGVjayBpZiBwYXJhbWV0ZXIgaXMgc2V0CisgKiBUaGUgZnVuY3Rpb24gaXMgaW50ZW5kZWQgZm9yIHVzZSBieSBjb21tYW5kIGhhbmRsZXJzCisgKiBccGFyYW1baW5dICAgICAgIHNlc3Npb24gICAgICAgICBTZXNzaW9uIGhhbmRsZQorICogXHBhcmFtW2luXSAgICAgICBwYXJtICAgICAgICAgICAgUGFyYW1ldGVyIG5hbWUKKyAqIFxyZXR1cm4KKyAqIFRSVUUgaWYgcGFyYW1ldGVyIGlzIHNldCwgRkFMU0Ugb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfYm9vbCBiY21jbGlfcGFybV9pc19zZXQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSAqcGFybSkKK3sKKyAgICByZXR1cm4gKHBhcm0tPmZsYWdzICYgQkNNQ0xJX1BBUk1fRkxBR19BU1NJR05FRCkgPyBCQ01PU19UUlVFIDogQkNNT1NfRkFMU0U7Cit9CisKKy8qKiBDaGVjayBpZiBwYXJhbWV0ZXIgaXMgc2V0CisgKiBccGFyYW1baW5dICAgICAgIHNlc3Npb24gICAgICAgICBTZXNzaW9uIGhhbmRsZQorICogXHBhcmFtW2luXSAgICAgICBwYXJtX251bWJlciAgICAgUGFyYW1ldGVyIG51bWJlcgorICogXHJldHVybgorICogIDAgaWYgcGFyYW1ldGVyIGlzIHNldFxuCisgKiAgQkNNX0VSUl9OT0VOVCBpZiBwYXJhbWV0ZXIgaXMgbm90IHNldAorICogIEJDTV9FUlJfUEFSTSBpZiBwYXJtX251bWJlciBpcyBpbnZhbGlkCisgKi8KK2JjbW9zX2Vycm5vIGJjbWNsaV9wYXJtX2NoZWNrKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBpbnQgcGFybV9udW1iZXIpOworCisKKy8qKiBHZXQgZW51bSdzIHN0cmluZyB2YWx1ZSBnaXZlbiBpdHMgaW50ZXJuYWwgdmFsdWUKKyAqIFxwYXJhbVtpbl0gICAgICAgdGFibGUgICAgICAgICAgIEVudW0gdGFibGUKKyAqIFxwYXJhbVtpbl0gICAgICAgdmFsdWUgICAgICAgICAgIEludGVybmFsIHZhbHVlCisgKiBccmV0dXJuCisgKiAgICAgIGVudW0gc3RyaW5nIHZhbHVlIG9yIE5VTEwgaWYgaW50ZXJuYWwgdmFsdWUgaXMgaW52YWxpZAorICovCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmJjbWNsaV9lbnVtX3N0cmluZ3ZhbChjb25zdCBiY21jbGlfZW51bV92YWwgdGFibGVbXSwgbG9uZyB2YWx1ZSkKK3sKKyAgICB3aGlsZSh0YWJsZS0+bmFtZSkKKyAgICB7CisgICAgICAgIGlmICh0YWJsZS0+dmFsPT12YWx1ZSkKKyAgICAgICAgICAgIHJldHVybiB0YWJsZS0+bmFtZTsKKyAgICAgICAgKyt0YWJsZTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKworLyoqIEdldCBlbnVtJ3MgcGFyYW1ldGVyIHN0cmluZyB2YWx1ZSBnaXZlbiBpdHMgaW50ZXJuYWwgdmFsdWUKKyAqIFxwYXJhbVtpbl0gICAgICAgc2Vzc2lvbiAgICAgICAgIFNlc3Npb24gaGFuZGxlCisgKiBccGFyYW1baW5dICAgICAgIHBhcm1fbnVtYmVyICAgICBQYXJhbWV0ZXIgbnVtYmVyCisgKiBccGFyYW1baW5dICAgICAgIHZhbHVlICAgICAgICAgICBJbnRlcm5hbCB2YWx1ZQorICogXHJldHVybgorICogICAgICBlbnVtIHN0cmluZyB2YWx1ZSBvciBOVUxMIGlmIHBhcmFtZXRlciBpcyBub3QgZW51bSBvcgorICogICAgICBpbnRlcm5hbCB2YWx1ZSBpcyBpbnZhbGlkCisgKi8KK2NvbnN0IGNoYXIgKmJjbWNsaV9lbnVtX3Bhcm1fc3RyaW5ndmFsKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBpbnQgcGFybV9udW1iZXIsIGxvbmcgdmFsdWUpOworCisKKy8qKiBQcmludCBDTEkgcGFyYW1ldGVyIHZhbHVlCisgKiBccGFyYW1baW5dICAgICAgIHNlc3Npb24gICAgICAgICBTZXNzaW9uIGhhbmRsZQorICogXHBhcmFtW2luXSAgICAgICBwYXJtICAgICAgICAgICAgUGFyYW1ldGVyCisgKi8KK3ZvaWQgYmNtY2xpX3Bhcm1fcHJpbnQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSAqcGFybSk7CisKKworLyoqIHN0cm5jcHkgZmxhdm91ciB0aGF0IGFsd2F5cyBhZGQgMCB0ZXJtaW5hdG9yCisgKiBccGFyYW1baW5dICAgICAgIGRzdCAgICAgICAgICAgICBEZXN0aW5hdGlvbiBzdHJpbmcKKyAqIFxwYXJhbVtpbl0gICAgICAgc3JjICAgICAgICAgICAgIFNvdXJjZSBzdHJpbmcKKyAqIFxwYXJhbVtpbl0gICAgICAgZHN0X3NpemUgICAgICAgIERlc3RpbmF0aW9uIGJ1ZmZlciBzaXplCisgKiBccmV0dXJuIGRzdAorICovCitzdGF0aWMgaW5saW5lIGNoYXIgKmJjbWNsaV9zdHJuY3B5KGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCB1aW50MzJfdCBkc3Rfc2l6ZSkKK3sKKyAgICBzdHJuY3B5KGRzdCwgc3JjLCBkc3Rfc2l6ZS0xKTsKKyAgICBkc3RbZHN0X3NpemUtMV0gPSAwOworICAgIHJldHVybiBkc3Q7Cit9CisKKworLyoqIHN0cm5jYXQgZmxhdm91ciB0aGF0IGxpbWl0cyBzaXplIG9mIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICogXHBhcmFtW2luXSAgICAgICBkc3QgICAgICAgICAgICAgRGVzdGluYXRpb24gc3RyaW5nCisgKiBccGFyYW1baW5dICAgICAgIHNyYyAgICAgICAgICAgICBTb3VyY2Ugc3RyaW5nCisgKiBccGFyYW1baW5dICAgICAgIGRzdF9zaXplICAgICAgICBEZXN0aW5hdGlvbiBidWZmZXIgc2l6ZQorICogXHJldHVybiBkc3QKKyAqLworc3RhdGljIGlubGluZSBjaGFyICpiY21jbGlfc3RybmNhdChjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgdWludDMyX3QgZHN0X3NpemUpCit7CisgICAgdWludDMyX3QgZHN0X2xlbiA9IHN0cmxlbihkc3QpOworICAgIHJldHVybiBzdHJuY2F0KGRzdCwgc3JjLCBkc3Rfc2l6ZS1kc3RfbGVuLTEpOworfQorCisvKiBSZWRlZmluZSBiY21jbGlfc2Vzc2lvbl9wcmludCAtLT4gYmNtY2xpX3ByaW50ICovCisjZGVmaW5lIGJjbWNsaV9wcmludCBiY21jbGlfc2Vzc2lvbl9wcmludAorCisvKiogRW5hYmxlIC8gZGlzYWJsZSBDTEkgY29tbWFuZCBsb2dnaW5nCisgKiBccGFyYW1baW5dICAgbW9kZSAgICBMb2dnaW5nIGZsYWdzCisgKiBccGFyYW1baW5dICAgbG9nICAgICBMb2cgc2Vzc2lvbi4gTXVzdCBiZSBzZXQgaWYgbW9kZSAhPSBCQ01DTElfQ01EX0xPR19OT05FCisgKiBccmV0dXJuIDA9T0sgb3IgZXJyb3IgPDAKKyAqLworYmNtb3NfZXJybm8gYmNtY2xpX2xvZ19zZXQoYmNtY2xpX2xvZ19tb2RlIG1vZGUsIGJjbWNsaV9zZXNzaW9uICpsb2cpOworCisvKiogV3JpdGUgc3RyaW5nIHRvIENMSSBsb2cuCisgKiBUaGUgZnVuY3Rpb24gaXMgaWdub3JlZCBpZiBDTEkgbG9nZ2luZyBpcyBub3QgZW5hYmxlZCB1c2luZyBiY21jbGlfbG9nX3NldCgpCisgKiBccGFyYW1baW5dICAgZm9ybWF0ICBwcmludGYtbGlrZSBmb3JtYXQgZm9sbG93ZWQgYnkgYXJndW1lbnRzCisgKi8KK3ZvaWQgYmNtY2xpX2xvZyhjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKy8qKiBAfSBlbmQgYmNtX2NsaSBncm91cCAqLworCisjZW5kaWYgLyogI2lmbmRlZiBCQ01fQ0xJX0ggKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9jbGkvYmNtY2xpX3NlcnZlci5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2NsaS9iY21jbGlfc2VydmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYwZDk4ZAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9jbGkvYmNtY2xpX3NlcnZlci5jCkBAIC0wLDAgKzEsNTQ2IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBiY21jbGlfc2VydmVyLmMKKyAqCisgKiBDTEkgZW5naW5lIC0gcmVtb3RlIHNoZWxsIHN1cHBvcnQKKyAqCisgKiBUaGlzIG1vZHVsZSBpcyBhIGJhY2stZW5kIG9mIHJlbW90ZSBzaGVsbCBzdXBwb3J0LgorICogLSBtdWx0aXBsZSBzZXJ2ZXJzCisgKiAtIGRvbWFpbiBhbmQgVENQLWJhc2VkIGNvbm5lY3Rpb25zCisgKiAtIHNlc3Npb24gYWNjZXNzIGxldmVsIC0gcGVyIHNlcnZlcgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxiY21jbGlfc2VydmVyLmg+CisKK3R5cGVkZWYgc3RydWN0IGJjbWNsaXNfc2VydmVyIGJjbWNsaXNfc2VydmVyX3Q7CisKKy8qIFNlcnZlciBjb25uZWN0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbWNsaXNfY29ubgoreworICAgIHN0cnVjdCBiY21jbGlzX2Nvbm4gKm5leHQ7CisgICAgYmNtY2xpc19zZXJ2ZXJfdCAqc2VydmVyOworICAgIGNvbnN0IGNoYXIgKmFkZHJlc3M7IC8qIGNsaWVudCBhZGRyZXNzICovCisgICAgaW50IHNvY2s7ICAgICAgICAgICAgIC8qIHRyYW5zcG9ydCBzb2NrZXQgKi8KKyAgICBiZG1mX3Rhc2sgcnhfdGhyZWFkOworICAgIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uOworICAgIHVpbnQzMl90IGJ5dGVzX3NlbnQ7CisgICAgdWludDMyX3QgYnl0ZXNfcmVjZWl2ZWQ7CisgICAgYmRtZl90YXNrIGNvbm5fdGhyZWFkOworfSBiY21jbGlzX2Nvbm5fdDsKKworLyogU2VydmVyIGNvbnRyb2wgYmRtZm9jaworICovCitzdHJ1Y3QgYmNtY2xpc19zZXJ2ZXIKK3sKKyAgICBiY21jbGlzX3NlcnZlcl90ICpuZXh0OworICAgIGJjbWNsaXNfY29ubl90ICpjb25uX2xpc3Q7CisgICAgaW50IHNvY2s7ICAgICAgICAgICAgIC8qIGxpc3RlbmluZyBzb2NrZXQgKi8KKyAgICBiY21jbGlzX3Bhcm1fdCBwYXJtczsKKyAgICBpbnQgaWQ7CisgICAgaW50IG5jb25uczsKKyAgICBiY21vc19mYXN0bG9jayBsb2NrOworICAgIGJkbWZfdGFzayBsaXN0ZW5fdGhyZWFkOworfTsKKworLyogc29jYWRkciB2YXJpYW50cyAqLwordHlwZWRlZiB1bmlvbgoreworICAgIHN0cnVjdCBzb2NrYWRkciBzYTsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfdW4gZG9tYWluX3NhOworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiB0Y3Bfc2E7Cit9IHNvY2thZGRyX2FueTsKKworc3RhdGljIGJjbWNsaXNfc2VydmVyX3QgKmJjbWNsaXNfc2VydmVyczsKK3N0YXRpYyBpbnQgYmNtY2xpc19zZXJ2ZXJfaWQ7CisKK3N0YXRpYyBiY21jbGlzX3NlcnZlcl90ICpiY21jbGlzX2lkX3RvX3NlcnZlcihpbnQgaHMsIGJjbWNsaXNfc2VydmVyX3QgKipwcmV2KQoreworICAgIGJjbWNsaXNfc2VydmVyX3QgKnM9YmNtY2xpc19zZXJ2ZXJzOworICAgIGlmIChwcmV2KQorICAgICAgICAqcHJldiA9IE5VTEw7CisgICAgd2hpbGUocykKKyAgICB7CisgICAgICAgIGlmIChzLT5pZCA9PSBocykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAocHJldikKKyAgICAgICAgICAgICpwcmV2ID0gczsKKyAgICAgICAgcyA9IHMtPm5leHQ7CisgICAgfQorICAgIHJldHVybiBzOworfQorCisvKiBQYXJzZSBhZGRyZXNzIGhlbHBlciAqLworc3RhdGljIGludCBiY21jbGlzX3BhcnNlX2FkZHJlc3MoY29uc3QgYmNtY2xpc19wYXJtX3QgKnBhcm1zLCBpbnQgKnByb3RvY29sLCBzb2NrYWRkcl9hbnkgKnNhLCBpbnQgKmxlbikKK3sKKyAgICBzd2l0Y2gocGFybXMtPnRyYW5zcG9ydCkKKyAgICB7CisgICAgY2FzZSBCQ01DTElfVFJBTlNQT1JUX0RPTUFJTl9TT0NLRVQ6CisgICAgeworICAgICAgICAqcHJvdG9jb2wgPSBBRl9VTklYOworICAgICAgICBzYS0+ZG9tYWluX3NhLnN1bl9mYW1pbHkgPSBBRl9VTklYOyAgLyogbG9jYWwgaXMgZGVjbGFyZWQgYmVmb3JlIHNvY2tldCgpIF4gKi8KKyAgICAgICAgc3RyY3B5KHNhLT5kb21haW5fc2Euc3VuX3BhdGgsIHBhcm1zLT5hZGRyZXNzKTsKKyAgICAgICAgKmxlbiA9IHN0cmxlbihzYS0+ZG9tYWluX3NhLnN1bl9wYXRoKSArIHNpemVvZihzYS0+ZG9tYWluX3NhLnN1bl9mYW1pbHkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBCQ01DTElfVFJBTlNQT1JUX1RDUF9TT0NLRVQ6CisgICAgeworICAgICAgICAqcHJvdG9jb2wgPSBBRl9JTkVUOworICAgICAgICBzYS0+dGNwX3NhLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgICAgICBzYS0+dGNwX3NhLnNpbl9wb3J0ID0gaHRvbnMoYXRvaShwYXJtcy0+YWRkcmVzcykpOworICAgICAgICBzYS0+dGNwX3NhLnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9BTlk7CisgICAgICAgICpsZW4gPSBzaXplb2Yoc2EtPnRjcF9zYSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCisvKiBkaXNjb25uZWN0IGNsaWVudCBhbmQgY2xlYXIgcmVzb3VyY2VzICovCitzdGF0aWMgdm9pZCBiY21jbGlzX2Rpc2Nvbm5lY3QoYmNtY2xpc19jb25uX3QgKmNvbm4pCit7CisgICAgYmNtY2xpc19zZXJ2ZXJfdCAqcz1jb25uLT5zZXJ2ZXI7CisgICAgYmNtY2xpc19jb25uX3QgKmM9cy0+Y29ubl9saXN0LCAqcHJldj1OVUxMOworCisgICAgYmNtb3NfZmFzdGxvY2tfbG9jaygmcy0+bG9jayk7CisgICAgd2hpbGUoYyAmJiBjIT1jb25uKQorICAgIHsKKyAgICAgICAgcHJldiA9IGM7CisgICAgICAgIGMgPSBjLT5uZXh0OworICAgIH0KKyAgICBCVUdfT04oIWMpOworICAgIGlmIChwcmV2KQorICAgICAgICBwcmV2LT5uZXh0ID0gYy0+bmV4dDsKKyAgICBlbHNlCisgICAgICAgIHMtPmNvbm5fbGlzdCA9IGMtPm5leHQ7CisgICAgLS1zLT5uY29ubnM7CisgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZzLT5sb2NrKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9jbG9zZShjLT5zZXNzaW9uKTsKKyAgICBjbG9zZShjLT5zb2NrKTsKKyAgICBiZG1mX3Rhc2tfZGVzdHJveShjLT5yeF90aHJlYWQpOworICAgIGJjbW9zX2ZyZWUoYyk7Cit9CisKKy8qCisgKiBTZXNzaW9uIGNhbGxiYWNrcworICovCisKKy8qKiBTZXNzaW9uJ3Mgb3V0cHV0IGZ1bmN0aW9uLgorICogcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gb3IgPDAgaWYgZXJyb3IKKyAqLworc3RhdGljIGludCBiY21jbGlzX2NiX3Nlc3Nfd3JpdGUodm9pZCAqdXNlcl9wcml2LCBjb25zdCB2b2lkICpidWYsIHVpbnQzMl90IHNpemUpCit7CisgICAgYmNtY2xpc19jb25uX3QgKmM9dXNlcl9wcml2OworICAgIGludCByYzsKKworICAgIHJjID0gc2VuZChjLT5zb2NrLCBidWYsIHNpemUsIDApOworICAgIC8qIGRpc2Nvbm5lY3QgaWYgSU8gZXJyb3IgKi8KKyAgICBpZiAocmMgPCBzaXplKQorICAgICAgICBiY21jbGlzX2Rpc2Nvbm5lY3QoYyk7CisgICAgZWxzZQorICAgICAgICBjLT5ieXRlc19zZW50ICs9IHJjOworICAgIHJldHVybiByYzsKK30KKworI2RlZmluZSBDSEFSX0VPVCAweDA0CisKKy8qKiBTZXNzaW9uJ3MgaW5wdXQgZnVuY3Rpb24uCisgKiByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBvciA8MCBpZiBlcnJvcgorICovCitzdGF0aWMgY2hhciAqYmNtY2xpc19yZWFkX2xpbmUoYmNtY2xpc19jb25uX3QgKmMsIGNoYXIgKmJ1ZiwgdWludDMyX3Qgc2l6ZSkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgcmM7CisgICAgaW50IGxlbj0wOworCisgICAgZm9yKGk9MDsgaTxzaXplLTE7IGkrKykKKyAgICB7CisgICAgICAgIGNoYXIgY2g7CisgICAgICAgIHJjID0gcmVjdihjLT5zb2NrLCAmY2gsIDEsIE1TR19XQUlUQUxMKTsKKyAgICAgICAgaWYgKHJjIDw9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKGNoID09ICdccicpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKGNoID09IENIQVJfRU9UKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGJ1ZltsZW4rK10gPSBjaDsKKyAgICAgICAgaWYgKGNoID09ICdcbicpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgYy0+Ynl0ZXNfcmVjZWl2ZWQgKz0gaTsKKyAgICBidWZbbGVuXSA9IDA7CisgICAgcmV0dXJuIChsZW4gPyBidWYgOiBOVUxMKTsKK30KKworLyogUmVjZWl2ZSBoYW5kbGVyICovCitzdGF0aWMgaW50IGJjbWNsaXNfcnhfdGhyZWFkX2hhbmRsZXIodm9pZCAqYXJnKQoreworICAgIGNoYXIgYnVmWzUxMl07CisgICAgYmNtY2xpc19jb25uX3QgKmM9YXJnOworCisgICAgd2hpbGUoIWJjbWNsaV9pc19zdG9wcGVkKGMtPnNlc3Npb24pICYmCisgICAgICAgICAgYmNtY2xpc19yZWFkX2xpbmUoYywgYnVmLCBzaXplb2YoYnVmKSkpCisgICAgeworICAgICAgICBiY21jbGlfcGFyc2UoYy0+c2Vzc2lvbiwgYnVmKTsKKyAgICB9CisgICAgYmNtY2xpc19kaXNjb25uZWN0KGMpOworICAgIHJldHVybiAwOworfQorCisvKiBOZXcgY2xpZW50IGNvbm5lY3Rpb24gaW5kaWNhdGlvbiAqLworc3RhdGljIHZvaWQgYmNtY2xpc19jb25uZWN0KGJjbWNsaXNfc2VydmVyX3QgKnMsIGNoYXIgKmFkZHIsIGludCBzb2NrKQoreworICAgIGJjbWNsaXNfY29ubl90ICpjOworICAgIGJjbWNsaV9zZXNzaW9uX3Bhcm0gc2Vzc19wYXJtOworICAgIGludCByYzsKKworICAgIGlmIChzLT5wYXJtcy5tYXhfY2xpZW50cyAmJiBzLT5uY29ubnMgPj0gcy0+cGFybXMubWF4X2NsaWVudHMpCisgICAgeworICAgICAgICBiY21vc19wcmludGYoImJkbWZtb25zOiBzZXJ2ZXIgJXM6IHJlZnVzZWQgY29ubmVjdGlvbiBiZWNhdXNlIG1heCBudW1iZXIgaGFzIGJlZW4gcmVhY2hlZFxuIiwgcy0+cGFybXMuYWRkcmVzcyk7CisgICAgICAgIGNsb3NlKHNvY2spOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYyA9IGJjbW9zX2NhbGxvYyhzaXplb2YoKmMpICsgc3RybGVuKGFkZHIpICsgMSk7CisgICAgaWYgKCFjKQorICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgYy0+YWRkcmVzcyA9IChjaGFyICopYyArIHNpemVvZigqYyk7CisgICAgc3RyY3B5KChjaGFyICopYy0+YWRkcmVzcywgYWRkcik7CisgICAgYy0+c2VydmVyID0gczsKKyAgICBjLT5zb2NrID0gc29jazsKKworICAgIC8qIGNyZWF0ZSBuZXcgbWFuYWdlbWVudCBzZXNzaW9uICovCisgICAgbWVtc2V0KCZzZXNzX3Bhcm0sIDAsIHNpemVvZihzZXNzX3Bhcm0pKTsKKyAgICBzZXNzX3Bhcm0uYWNjZXNzX3JpZ2h0ID0gcy0+cGFybXMuYWNjZXNzOworICAgIHNlc3NfcGFybS53cml0ZSA9IGJjbWNsaXNfY2Jfc2Vzc193cml0ZTsKKyAgICBzZXNzX3Bhcm0udXNlcl9wcml2ID0gYzsKKyAgICByYyA9IGJjbWNsaV9zZXNzaW9uX29wZW4oJnNlc3NfcGFybSwgJmMtPnNlc3Npb24pOworICAgIGlmIChyYykKKyAgICAgICAgZ290byBjbGVhbnVwOworCisgICAgLyogd2FpdCBmb3IgcmVjZWl2ZSBpbiBhIHNlcGFyYXRlIHRocmVhZCAqLworICAgIHJjID0gYmRtZl90YXNrX2NyZWF0ZSgiYmNtY2xpc19yeCIsCisgICAgICAgICAgICAgICAgICAgIEJETUZTWVNfREVGQVVMVF9UQVNLX1BSSU9SSVRZLAorICAgICAgICAgICAgICAgICAgICBCRE1GU1lTX0RFRkFVTFRfVEFTS19TVEFDSywKKyAgICAgICAgICAgICAgICAgICAgYmNtY2xpc19yeF90aHJlYWRfaGFuZGxlciwgYywKKyAgICAgICAgICAgICAgICAgICAgJmMtPnJ4X3RocmVhZCk7CisgICAgaWYgKHJjKQorICAgICAgICBnb3RvIGNsZWFudXA7CisKKyAgICBiY21vc19mYXN0bG9ja19sb2NrKCZzLT5sb2NrKTsKKyAgICBjLT5uZXh0ID0gcy0+Y29ubl9saXN0OworICAgIHMtPmNvbm5fbGlzdCA9IGM7CisgICAgKytzLT5uY29ubnM7CisgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZzLT5sb2NrKTsKKworICAgIHJldHVybjsKKworY2xlYW51cDoKKyAgICBjbG9zZShzb2NrKTsKKyAgICBpZiAoYy0+c2Vzc2lvbikKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fY2xvc2UoYy0+c2Vzc2lvbik7CisgICAgaWYgKGMpCisgICAgICAgIGJjbW9zX2ZyZWUoYyk7Cit9CisKKy8qIFJlY2VpdmUgaGFuZGxlciAqLworc3RhdGljIGludCBiY21jbGlzX2xpc3Rlbl90aHJlYWRfaGFuZGxlcih2b2lkICphcmcpCit7CisgICAgYmNtY2xpc19zZXJ2ZXJfdCAqcz1hcmc7CisgICAgc29ja2FkZHJfYW55IGFkZHI7CisgICAgc29ja2xlbl90IGxlbjsKKyAgICBpbnQgc29jazsKKworICAgIHdoaWxlKDEpCisgICAgeworICAgICAgICBjaGFyIGNhZGRyWzY0XTsKKyAgICAgICAgbGVuID0gc2l6ZW9mKGFkZHIpOworICAgICAgICBzb2NrID0gYWNjZXB0KHMtPnNvY2ssICZhZGRyLnNhLCAmbGVuKTsKKyAgICAgICAgaWYgKHNvY2sgPCAwKQorICAgICAgICB7CisgICAgICAgICAgICBwZXJyb3IoImFjY2VwdCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHMtPnBhcm1zLnRyYW5zcG9ydD09QkNNQ0xJX1RSQU5TUE9SVF9ET01BSU5fU09DS0VUKQorICAgICAgICAgICAgc3RybmNweShjYWRkciwgcy0+cGFybXMuYWRkcmVzcywgc2l6ZW9mKGNhZGRyKS0xKTsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzbnByaW50ZihjYWRkciwgc2l6ZW9mKGNhZGRyKS0xLCAiJXM6JWQiLAorICAgICAgICAgICAgICAgIGluZXRfbnRvYShhZGRyLnRjcF9zYS5zaW5fYWRkciksIG50b2hzKGFkZHIudGNwX3NhLnNpbl9wb3J0KSk7CisgICAgICAgIH0KKyAgICAgICAgYmNtY2xpc19jb25uZWN0KHMsIGNhZGRyLCBzb2NrKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBFeHRlcm5hbCBBUEkKKyAqLworCisvKiogQ3JlYXRlIHNoZWxsIHNlcnZlci4KKyAqIEltbWVkaWF0ZWx5IGFmdGVyIGNyZWF0aW9uIHNlcnZlciBpcyByZWFkeSB0byBhY2NlcHQgY2xpZW50IGNvbm5lY3Rpb25zCisgKiBccGFyYW1baW5dICAgcGFybXMgICBTZXJ2ZXIgcGFyYW1ldGVycworICogXHBhcmFtW291dF0gIGhzICAgICAgU2VydmVyIGhhbmRsZQorICogXHJldHVybiAgMCAtIE9LXG4KKyAqICAgICAgICAgPDAgLSBlcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbWNsaXNfc2VydmVyX2NyZWF0ZShjb25zdCBiY21jbGlzX3Bhcm1fdCAqcGFybXMsIGludCAqaHMpCit7CisgICAgYmNtY2xpc19zZXJ2ZXJfdCAqczsKKyAgICBpbnQgcHJvdG9jb2w7CisgICAgc29ja2FkZHJfYW55IHNhOworICAgIGludCBsZW47CisgICAgaW50IHJjOworCisgICAgaWYgKCFwYXJtcyB8fCAhaHMgfHwgIXBhcm1zLT5hZGRyZXNzKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworCisgICAgLyogcGFyc2UgYWRkcmVzcyAqLworICAgIGlmIChiY21jbGlzX3BhcnNlX2FkZHJlc3MocGFybXMsICZwcm90b2NvbCwgJnNhLCAmbGVuKSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKworICAgIC8qIGFsbG9jYXRlIHNlcnZlciBzdHJ1Y3R1cmUgKi8KKyAgICBzID0gYmNtb3NfY2FsbG9jKHNpemVvZihiY21jbGlzX3NlcnZlcl90KStzdHJsZW4ocGFybXMtPmFkZHJlc3MpKzEpOworICAgIGlmICghcykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgcy0+cGFybXMgPSAqcGFybXM7CisgICAgcy0+cGFybXMuYWRkcmVzcyA9IChjaGFyICopcyArIHNpemVvZigqcyk7CisgICAgc3RyY3B5KHMtPnBhcm1zLmFkZHJlc3MsIHBhcm1zLT5hZGRyZXNzKTsKKyAgICBzLT5pZCA9ICsrYmNtY2xpc19zZXJ2ZXJfaWQ7CisgICAgYmNtb3NfZmFzdGxvY2tfaW5pdCgmcy0+bG9jayk7CisKKyAgICAvKiBjcmVhdGUgc29ja2V0IGFuZCBzdGFydCBsaXN0ZW5pbmcgKi8KKyAgICBzLT5zb2NrID0gc29ja2V0KHByb3RvY29sLCBTT0NLX1NUUkVBTSwgMCk7CisgICAgaWYgKChzLT5zb2NrIDwgMCkgfHwKKyAgICAgICAgKGJpbmQocy0+c29jaywgJnNhLnNhLCBsZW4pIDwgMCkgfHwKKyAgICAgICAgKGxpc3RlbihzLT5zb2NrLCAxKSA8IDApKQorICAgIHsKKyAgICAgICAgcGVycm9yKCJzb2NrZXQvYmluZC9saXN0ZW4iKTsKKyAgICAgICAgY2xvc2Uocy0+c29jayk7CisgICAgICAgIGJjbW9zX2ZyZWUocyk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogd2FpdCBmb3IgY29ubmVjdGlvbihzKSBpbiBhIHNlcGFyYXRlIHRocmVhZCAqLworICAgIHJjID0gYmRtZl90YXNrX2NyZWF0ZSgiYmNtY2xpc19saXN0ZW4iLAorICAgICAgICAgICAgICAgICAgICBCRE1GU1lTX0RFRkFVTFRfVEFTS19QUklPUklUWSwKKyAgICAgICAgICAgICAgICAgICAgQkRNRlNZU19ERUZBVUxUX1RBU0tfU1RBQ0ssCisgICAgICAgICAgICAgICAgICAgIGJjbWNsaXNfbGlzdGVuX3RocmVhZF9oYW5kbGVyLCBzLAorICAgICAgICAgICAgICAgICAgICAmcy0+bGlzdGVuX3RocmVhZCk7CisgICAgaWYgKHJjKQorICAgIHsKKyAgICAgICAgY2xvc2Uocy0+c29jayk7CisgICAgICAgIGJjbW9zX2ZyZWUocyk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICAvKiBhbGwgZ29vZCAqLworICAgIHMtPm5leHQgPSBiY21jbGlzX3NlcnZlcnM7CisgICAgYmNtY2xpc19zZXJ2ZXJzID0gczsKKyAgICAqaHMgPSBzLT5pZDsKKworICAgIHJldHVybiAwOworfQorCisvKiogRGVzdHJveSBzaGVsbCBzZXJ2ZXIuCisgKiBBbGwgY2xpZW50IGNvbm5lY3Rpb25zIGlmIGFueSBhcmUgY2xvc2VkCisgKiBccGFyYW1baW5dICAgaHMgICAgICBTZXJ2ZXIgaGFuZGxlCisgKiBccmV0dXJuICAwIC0gT0tcbgorICogICAgICAgICA8MCAtIGVycm9yIGNvZGUKKyAqLworYmNtb3NfZXJybm8gYmNtY2xpc19zZXJ2ZXJfZGVzdHJveShpbnQgaHMpCit7CisgICAgYmNtY2xpc19zZXJ2ZXJfdCAqcHJldjsKKyAgICBiY21jbGlzX3NlcnZlcl90ICpzID0gYmNtY2xpc19pZF90b19zZXJ2ZXIoaHMsICZwcmV2KTsKKyAgICBiY21jbGlzX2Nvbm5fdCAqYzsKKyAgICBpZiAoIXMpCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PRU5UOworCisgICAgYmRtZl90YXNrX2Rlc3Ryb3kocy0+bGlzdGVuX3RocmVhZCk7CisgICAgY2xvc2Uocy0+c29jayk7CisKKyAgICAvKiBkaXNjb25uZWN0IGFsbCBjbGllbnRzICovCisgICAgd2hpbGUoKGMgPSBzLT5jb25uX2xpc3QpKQorICAgICAgICBiY21jbGlzX2Rpc2Nvbm5lY3QoYyk7CisKKyAgICAvKiBkZXN0cm95IHNlcnZlciAqLworICAgIGJjbW9zX2Zhc3Rsb2NrX2xvY2soJnMtPmxvY2spOworICAgIGlmIChwcmV2KQorICAgICAgICBwcmV2LT5uZXh0ID0gcy0+bmV4dDsKKyAgICBlbHNlCisgICAgICAgIGJjbWNsaXNfc2VydmVycyA9IHMtPm5leHQ7CisgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZzLT5sb2NrKTsKKworICAgIGJjbW9zX2ZyZWUocyk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTaGVsbCBjb21tYW5kIGhhbmRsZXJzCisgKi8KKworc3RhdGljIGJjbWNsaV9lbnVtX3ZhbCB0cmFuc3BvcnRfdHlwZV9lbnVtX3RhYmRtZmVbXSA9IHsKKyAgICB7IC5uYW1lPSJkb21haW5fc29ja2V0IiwgLnZhbD1CQ01DTElfVFJBTlNQT1JUX0RPTUFJTl9TT0NLRVR9LAorICAgIHsgLm5hbWU9InRjcF9zb2NrZXQiLCAudmFsPUJDTUNMSV9UUkFOU1BPUlRfVENQX1NPQ0tFVH0sCisgICAgQkNNQ0xJX0VOVU1fTEFTVAorfTsKKworc3RhdGljIGJjbWNsaV9lbnVtX3ZhbCBhY2Nlc3NfdHlwZV9lbnVtX3RhYmRtZmVbXSA9IHsKKyAgICB7IC5uYW1lPSJndWVzdCIsIC52YWw9QkNNQ0xJX0FDQ0VTU19HVUVTVH0sCisgICAgeyAubmFtZT0iYWRtaW4iLCAudmFsPUJDTUNMSV9BQ0NFU1NfQURNSU59LAorICAgIHsgLm5hbWU9ImRlYnVnIiwgLnZhbD1CQ01DTElfQUNDRVNTX0RFQlVHfSwKKyAgICBCQ01DTElfRU5VTV9MQVNUCit9OworCisvKiBDcmVhdGUgcmVtb3RlIHNoZWxsIHNlcnZlcgorICAgIEJDTUNMSV9NQUtFX1BBUk1fRU5VTSgidHJhbnNwb3J0IiwgIlRyYW5zcG9ydCB0eXBlIiwgdHJhbnNwb3J0X3R5cGVfZW51bV90YWJkbWZlLCAwKSwKKyAgICBCQ01DTElfTUFLRV9QQVJNKCJhZGRyZXNzIiwgIkJpbmQgYWRkcmVzcyIsIEJDTUNMSV9QQVJNX1NUUklORywgMCksCisgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNKCJhY2Nlc3MiLCAiQWNjZXNzIGxldmVsIiwgYWNjZXNzX3R5cGVfZW51bV90YWJkbWZlLCAwKSwKKyAgICBCQ01DTElfTUFLRV9QQVJNX0RFRlZBTCgibWF4X2NsaWVudHMiLCAiTWF4IGNsaWVudHMuIDA9ZGVmYXVsdCIsIEJDTUNMSV9QQVJNX05VTUJFUiwgMCwgMCksCisqLworc3RhdGljIGludCBiY21jbGlzX21vbl9jcmVhdGUoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sICB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGJjbWNsaXNfdHJhbnNwb3J0X3R5cGVfdCB0cmFuc3BvcnQgPSAoYmNtY2xpc190cmFuc3BvcnRfdHlwZV90KXBhcm1bMF0udmFsdWUubnVtYmVyOworICAgIGNoYXIgKmFkZHJlc3MgPSAoY2hhciAqKXBhcm1bMV0udmFsdWUubnVtYmVyOworICAgIGJjbWNsaV9hY2Nlc3NfcmlnaHQgYWNjZXNzID0gKGJjbWNsaV9hY2Nlc3NfcmlnaHQpcGFybVsyXS52YWx1ZS5udW1iZXI7CisgICAgaW50IG1heF9jbGllbnRzID0gKGludClwYXJtWzNdLnZhbHVlLm51bWJlcjsKKyAgICBiY21jbGlzX3Bhcm1fdCBwYXJtczsKKyAgICBpbnQgaHM7CisgICAgaW50IHJjOworCisgICAgbWVtc2V0KCZwYXJtcywgMCwgc2l6ZW9mKHBhcm1zKSk7CisgICAgcGFybXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0OworICAgIHBhcm1zLmFjY2VzcyA9IGFjY2VzczsKKyAgICBwYXJtcy5hZGRyZXNzID0gYWRkcmVzczsKKyAgICBwYXJtcy5tYXhfY2xpZW50cyA9IG1heF9jbGllbnRzOworICAgIHJjID0gYmNtY2xpc19zZXJ2ZXJfY3JlYXRlKCZwYXJtcywgJmhzKTsKKyAgICBpZiAocmMpCisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJiY21jbGlzX3NlcnZlcl9jcmVhdGUoKSBmYWlsZWQgd2l0aCByYz0lZCAtICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcmMsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgZWxzZQorICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiUmVtb3RlIHNoZWxsIHNlcnZlciBjcmVhdGVkLiBTZXJ2ZXIgaWQgJWRcbiIsIGhzKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qIERlc3Ryb3kgcmVtb3RlIHNoZWxsIHNlcnZlcgorICAgIEJDTUNMSV9NQUtFX1BBUk0oInNlcnZlcl9pZCIsICJTZXJ2ZXIgaWQiLCBCQ01DTElfUEFSTV9OVU1CRVIsIDApLAorKi8KK3N0YXRpYyBpbnQgYmNtY2xpc19tb25fZGVzdHJveShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgaW50IGhzID0gKGludClwYXJtWzBdLnZhbHVlLm51bWJlcjsKKyAgICBpbnQgcmM7CisgICAgcmMgPSBiY21jbGlzX3NlcnZlcl9kZXN0cm95KGhzKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiUmVtb3RlIHNoZWxsIHNlcnZlciAlZCBkZXN0cm95ZWQuIHJjPSVkIC0gJXNcbiIsCisgICAgICAgIGhzLCByYywgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qIFNob3cgcmVtb3RlIHNoZWxsIHNlcnZlcnMKKyovCitzdGF0aWMgaW50IGJjbWNsaXNfbW9uX3Nob3coYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sICB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGJjbWNsaXNfc2VydmVyX3QgKnM9YmNtY2xpc19zZXJ2ZXJzOworICAgIGJjbWNsaXNfY29ubl90ICpjOworICAgIHdoaWxlKHMpCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiUmVtb3RlIHNlcnZlciAlZCBhdCAlc1xuIiwgcy0+aWQsIHMtPnBhcm1zLmFkZHJlc3MpOworICAgICAgICBjID0gcy0+Y29ubl9saXN0OworICAgICAgICB3aGlsZShjKQorICAgICAgICB7CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiXHQgLSAlcy4gYnl0ZXMgc2VudDolZCByZWNlaXZlZDolZFxuIiwKKyAgICAgICAgICAgICAgICBjLT5hZGRyZXNzLCBjLT5ieXRlc19zZW50LCBjLT5ieXRlc19yZWNlaXZlZCk7CisgICAgICAgICAgICBjID0gYy0+bmV4dDsKKyAgICAgICAgfQorICAgICAgICBzID0gcy0+bmV4dDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIENyZWF0ZSBzaGVsbF9zZXJ2ZXIgZGlyZWN0b3J5IGluIHJvb3RfZGlyCisgICBSZXR1cm5zIHRoZSAic2hlbGxfc2VydmVyIiBkaXJlY3RvcnkgaGFuZGxlCisqLworYmNtY2xpX2VudHJ5ICpiY21jbGlzX3NlcnZlcl9tb25faW5pdChiY21jbGlfZW50cnkgKnJvb3RfZGlyKQoreworICAgIGJjbWNsaV9lbnRyeSAqc2hlbGxfZGlyOworCisgICAgaWYgKChzaGVsbF9kaXI9YmNtY2xpX2Rpcl9maW5kKE5VTEwsICJzaGVsbF9zZXJ2ZXIiKSkhPU5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgc2hlbGxfZGlyID0gYmNtY2xpX2Rpcl9hZGQocm9vdF9kaXIsICJzaGVsbF9zZXJ2ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVtb3RlIFNoZWxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX0FDQ0VTU19HVUVTVCwgTlVMTCk7CisKKyAgICB7CisgICAgICAgIHN0YXRpYyBiY21jbGlfY21kX3Bhcm0gcGFybXNbXT17CisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oInRyYW5zcG9ydCIsICJUcmFuc3BvcnQgdHlwZSIsIHRyYW5zcG9ydF90eXBlX2VudW1fdGFiZG1mZSwgMCksCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJhZGRyZXNzIiwgIkJpbmQgYWRkcmVzczogZG9tYWluX3NvY2tldCBhZGRyZXNzIG9yIFRDUCBwb3J0IiwgQkNNQ0xJX1BBUk1fU1RSSU5HLCAwKSwKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fRU5VTSgiYWNjZXNzIiwgIkFjY2VzcyBsZXZlbCIsIGFjY2Vzc190eXBlX2VudW1fdGFiZG1mZSwgMCksCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0RFRlZBTCgibWF4X2NsaWVudHMiLCAiTWF4IGNsaWVudHMuIDA9ZGVmYXVsdCIsIEJDTUNMSV9QQVJNX05VTUJFUiwgMCwgMCksCisgICAgICAgICAgICBCQ01DTElfUEFSTV9MSVNUX1RFUk1JTkFUT1IKKyAgICAgICAgfTsKKyAgICAgICAgYmNtY2xpX2NtZF9hZGQoc2hlbGxfZGlyLCAiY3JlYXRlIiwgYmNtY2xpc19tb25fY3JlYXRlLAorICAgICAgICAgICAgICAgICAgICAgICJDcmVhdGUgcmVtb3RlIHNoZWxsIHNlcnZlciIsCisgICAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX0FDQ0VTU19BRE1JTiwgTlVMTCwgcGFybXMpOworICAgIH0KKworICAgIHsKKyAgICAgICAgc3RhdGljIGJjbWNsaV9jbWRfcGFybSBwYXJtc1tdPXsKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oInNlcnZlcl9pZCIsICJTZXJ2ZXIgaWQiLCBCQ01DTElfUEFSTV9OVU1CRVIsIDApLAorICAgICAgICAgICAgQkNNQ0xJX1BBUk1fTElTVF9URVJNSU5BVE9SCisgICAgICAgIH07CisgICAgICAgIGJjbWNsaV9jbWRfYWRkKHNoZWxsX2RpciwgImRlc3Ryb3kiLCBiY21jbGlzX21vbl9kZXN0cm95LAorICAgICAgICAgICAgICAgICAgICAgICJEZXN0cm95IHJlbW90ZSBzaGVsbCBzZXJ2ZXIiLAorICAgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9BQ0NFU1NfQURNSU4sIE5VTEwsIHBhcm1zKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIGJjbWNsaV9jbWRfYWRkKHNoZWxsX2RpciwgInNob3ciLCBiY21jbGlzX21vbl9zaG93LAorICAgICAgICAgICAgICAgICAgICAgICJTaG93IHJlbW90ZSBzaGVsbCBzZXJ2ZXJzIiwKKyAgICAgICAgICAgICAgICAgICAgICBCQ01DTElfQUNDRVNTX0dVRVNULCBOVUxMLCBOVUxMKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2hlbGxfZGlyOworfQorCisvKiBEZXN0cm95IHNoZWxsX3NlcnZlciBkaXJlY3RvcnkKKyovCit2b2lkIGJjbWNsaXNfc2VydmVyX21vbl9kZXN0cm95KHZvaWQpCit7CisgICAgYmNtY2xpX2VudHJ5ICpzaGVsbF9kaXI7CisgICAgc2hlbGxfZGlyPWJjbWNsaV9kaXJfZmluZChOVUxMLCAic2hlbGxfc2VydmVyIik7CisgICAgaWYgKHNoZWxsX2RpcikKKyAgICAgICAgYmNtY2xpX3Rva2VuX2Rlc3Ryb3koc2hlbGxfZGlyKTsKK30KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2NsaS9iY21jbGlfc2VydmVyLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvY2xpL2JjbWNsaV9zZXJ2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmU3NGU1Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2NsaS9iY21jbGlfc2VydmVyLmgKQEAgLTAsMCArMSw5NyBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogLW1vbl9zZXJ2ZXIuaAorICoKKyAqIEJMIGZyYW1ld29yayAtIHJlbW90ZSBzaGVsbCBzdXBwb3J0CisgKgorICogVGhpcyBtb2R1bGUgaXMgYSBiYWNrLWVuZCBvZiByZW1vdGUgc2hlbGwgc3VwcG9ydC4KKyAqIC0gbXVsdGlwbGUgc2VydmVycworICogLSBkb21haW4gYW5kIFRDUC1iYXNlZCBjb25uZWN0aW9ucworICogLSBzZXNzaW9uIGFjY2VzcyBsZXZlbCAtIHBlciBzZXJ2ZXIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEJDTUNMSV9TRVJWRVJfSF8KKyNkZWZpbmUgQkNNQ0xJX1NFUlZFUl9IXworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtY2xpX3Nlc3Npb24uaD4KKyNpbmNsdWRlIDxiY21jbGkuaD4KKworLyoqIFNoZWxsIHNlcnZlciB0cmFuc3BvcnQgdHlwZQorICovCit0eXBlZGVmIGVudW0geworICAgIEJDTUNMSV9UUkFOU1BPUlRfRE9NQUlOX1NPQ0tFVCwKKyAgICBCQ01DTElfVFJBTlNQT1JUX1RDUF9TT0NLRVQsCisKKyAgICBCQ01DTElfVFJBTlNQT1JUX19OVU1CRVJfT0YKK30gYmNtY2xpc190cmFuc3BvcnRfdHlwZV90OworCisvKiogU2hlbGwgc2VydmVyIHBhcmFtZXRlcnMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtY2xpc19wYXJtCit7CisgICAgYmNtY2xpX2FjY2Vzc19yaWdodCBhY2Nlc3M7ICAgICAgICAgLyoqPCBBY2Nlc3MgcmlnaHRzICovCisgICAgYmNtY2xpc190cmFuc3BvcnRfdHlwZV90IHRyYW5zcG9ydDsgLyoqPCBUcmFuc3BvcnQgdHlwZSAqLworICAgIGNoYXIgKmFkZHJlc3M7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQWRkcmVzcyBpbiBzdHJpbmcgZm9ybTogZG9tYWluIHNvY2tldCBmaWxlIGluIGxvY2FsIEZTOyBwb3J0IGZvciBUQ1Agc29ja2V0ICovCisgICAgaW50IG1heF9jbGllbnRzOyAgICAgICAgICAgICAgICAgICAgLyoqPCBNYXggbnVtYmVyIG9mIGNsaWVudHMgKi8KK30gYmNtY2xpc19wYXJtX3Q7CisKKworLyoqIENyZWF0ZSBzaGVsbCBzZXJ2ZXIuCisgKiBJbW1lZGlhdGVseSBhZnRlciBjcmVhdGlvbiBzZXJ2ZXIgaXMgcmVhZHkgdG8gYWNjZXB0IGNsaWVudCBjb25uZWN0aW9ucworICogXHBhcmFtW2luXSAgIHBhcm1zICAgU2VydmVyIHBhcmFtZXRlcnMKKyAqIFxwYXJhbVtvdXRdICBocyAgICAgIFNlcnZlciBoYW5kbGUKKyAqIFxyZXR1cm4gIDAgLSBPS1xuCisgKiAgICAgICAgIDwwIC0gZXJyb3IgY29kZQorICovCitiY21vc19lcnJubyBiY21jbGlzX3NlcnZlcl9jcmVhdGUoY29uc3QgYmNtY2xpc19wYXJtX3QgKnBhcm1zLCBpbnQgKmhzKTsKKworLyoqIERlc3Ryb3kgc2hlbGwgc2VydmVyLgorICogQWxsIGNsaWVudCBjb25uZWN0aW9ucyBpZiBhbnkgYXJlIGNsb3NlZAorICogXHBhcmFtW2luXSAgIGhzICAgICAgU2VydmVyIGhhbmRsZQorICogXHJldHVybiAgMCAtIE9LXG4KKyAqICAgICAgICAgPDAgLSBlcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbWNsaXNfc2VydmVyX2Rlc3Ryb3koaW50IGhzKTsKKworCisvKiBDcmVhdGUgc2hlbGxfc2VydmVyIGRpcmVjdG9yeSBpbiByb290X2RpcgorICAgUmV0dXJucyB0aGUgInNoZWxsX3NlcnZlciIgZGlyZWN0b3J5IGhhbmRsZQorKi8KK2JjbWNsaV9lbnRyeSAqYmNtY2xpc19zZXJ2ZXJfbW9uX2luaXQoYmNtY2xpX2VudHJ5ICpyb290X2Rpcik7CisKKworLyogRGVzdHJveSBzaGVsbF9zZXJ2ZXIgZGlyZWN0b3J5CisqLwordm9pZCBiY21jbGlzX3NlcnZlcl9tb25fZGVzdHJveSh2b2lkKTsKKworI2VuZGlmIC8qIEJDTUNMSV9TRVJWRVJfSF8gKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9jbGkvYmNtY2xpX3Nlc3Npb24uYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9jbGkvYmNtY2xpX3Nlc3Npb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTllYWE4Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2NsaS9iY21jbGlfc2Vzc2lvbi5jCkBAIC0wLDAgKzEsNTg3IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBiY21jbGlfc2Vzc2lvbi5jCisgKgorICogQ0xJIGVuZ2luZSAtIHNlc3Npb24gbWFuYWdlbWVudAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtb2x0X3V0aWxzLmg+CisKKyNkZWZpbmUgQkNNQ0xJX0lOVEVSTkFMCisjaW5jbHVkZSA8YmNtY2xpX3Nlc3Npb24uaD4KKworc3RhdGljIGJjbW9zX2Zhc3Rsb2NrIHNlc3Npb25fbG9jazsKK3N0YXRpYyBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbl9saXN0Oworc3RhdGljIGludCBzZXNzaW9uX21vZHVsZV9pbml0aWFsaXplZDsKKworLyoKKyAqIEludGVybmFsIGZ1bmN0aW9ucworICovCisKK3N0YXRpYyB2b2lkIF9iY21jbGlfc2Vzc2lvbl91cGRhdGVfcHJvbXB0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGlmICghc2Vzc2lvbikKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKHNlc3Npb24tPnBhcm1zLmdldF9wcm9tcHQpCisgICAgeworICAgICAgICBzZXNzaW9uLT5wYXJtcy5nZXRfcHJvbXB0KHNlc3Npb24sIHNlc3Npb24tPnByb21wdF9idWYsIEJDTUNMSV9NQVhfUFJPTVBUX0xFTik7CisgICAgICAgIHNlc3Npb24tPnByb21wdF9idWZbQkNNQ0xJX01BWF9QUk9NUFRfTEVOIC0gMV0gPSAnXDAnOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzZXNzaW9uLT5wcm9tcHRfYnVmWzBdID0gJ1wwJzsKKyAgICB9Cit9CisKK3N0YXRpYyBjaGFyICpfYmNtY2xpX3Nlc3Npb25fZ2V0cyhiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY2hhciAqYnVmZmVyLCB1aW50MzJfdCBzaXplKQoreworICAgIGNvbnN0IGNoYXIgKmxpbmUgPSBOVUxMOworICAgIF9iY21jbGlfc2Vzc2lvbl91cGRhdGVfcHJvbXB0KHNlc3Npb24pOworI2lmZGVmIENPTkZJR19MSUJFRElUCisgICAgaWYgKHNlc3Npb24gJiYgc2Vzc2lvbi0+ZWwgJiYgc2Vzc2lvbi0+aGlzdG9yeSkKKyAgICB7CisgICAgICAgIGludCBsaW5lX2xlbjsKKyAgICAgICAgbGluZSA9IChlbF9nZXRzKHNlc3Npb24tPmVsLCAmbGluZV9sZW4pKTsKKyAgICAgICAgaWYgKCFsaW5lKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChsaW5lX2xlbiA+IHNpemUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3ByaW50ZigiJXM6IGJ1ZmZlciBpcyB0b28gc2hvcnQgJXUgLSBnb3QgJWQuIFRydW5jYXRlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc2l6ZSwgbGluZV9sZW4pOworICAgICAgICB9CisgICAgICAgIHN0cm5jcHkoYnVmZmVyLCBsaW5lLCBzaXplKTsKKyAgICAgICAgaWYgKCpsaW5lICYmICpsaW5lICE9ICdcbicgJiYgKmxpbmUgIT0gJyMnKQorICAgICAgICAgICAgaGlzdG9yeShzZXNzaW9uLT5oaXN0b3J5LCAmc2Vzc2lvbi0+aGlzdGV2ZW50LCBIX0VOVEVSLCBsaW5lKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisjaWZkZWYgQ09ORklHX0xJTkVOT0lTRQorICAgIGlmIChzZXNzaW9uICYmIHNlc3Npb24tPmxuX3Nlc3Npb24pCisgICAgeworICAgICAgICBjaGFyICpsbl9saW5lID0gbGluZW5vaXNlKHNlc3Npb24tPmxuX3Nlc3Npb24sIHNlc3Npb24tPnByb21wdF9idWYsIGJ1ZmZlciwgc2l6ZSk7CisgICAgICAgIGlmIChsbl9saW5lKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3RybGVuKGxuX2xpbmUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpbmVub2lzZUhpc3RvcnlBZGQoc2Vzc2lvbi0+bG5fc2Vzc2lvbiwgbG5fbGluZSk7IC8qIEFkZCB0byB0aGUgaGlzdG9yeS4gKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJuY3B5KGJ1ZmZlciwgIlxuIiwgc2l6ZS0xKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1ZmZlcltzaXplLTFdID0gMDsKKyAgICAgICAgICAgIGxpbmUgPSBidWZmZXI7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiJXMiLCBzZXNzaW9uLT5wcm9tcHRfYnVmKTsKKyAgICAgICAgaWYgKHNlc3Npb24gJiYgc2Vzc2lvbi0+cGFybXMuZ2V0cykKKyAgICAgICAgICAgIGxpbmUgPSBzZXNzaW9uLT5wYXJtcy5nZXRzKHNlc3Npb24sIGJ1ZmZlciwgc2l6ZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGxpbmUgPSBmZ2V0cyhidWZmZXIsIHNpemUsIHN0ZGluKTsKKyAgICB9CisgICAgcmV0dXJuIGxpbmUgPyBidWZmZXIgOiBOVUxMOworfQorCisjaWZkZWYgQ09ORklHX0xJQkVESVQKKworc3RhdGljIGNoYXIgKl9iY21jbGlfZWRpdGxpbmVfcHJvbXB0KEVkaXRMaW5lICplKQoreworICAgIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uID0gTlVMTDsKKyAgICBlbF9nZXQoZSwgRUxfQ0xJRU5UREFUQSwgJnNlc3Npb24pOworICAgIEJVR19PTihzZXNzaW9uID09IE5VTEwgfHwgc2Vzc2lvbi0+bWFnaWMgIT0gQkNNQ0xJX1NFU1NJT05fTUFHSUMpOworICAgIF9iY21jbGlfc2Vzc2lvbl91cGRhdGVfcHJvbXB0KHNlc3Npb24pOworICAgIHJldHVybiBzZXNzaW9uLT5wcm9tcHRfYnVmOworfQorCitzdGF0aWMgaW50IF9iY21jbGlfZWRpdGxpbmVfY2ZuKEVkaXRMaW5lICplbCwgY2hhciAqYykKK3sKKyAgICBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiA9IE5VTEw7CisgICAgY2hhciBpbnNlcnRfYnVmWzgwXTsKKyAgICBpbnQgYzE7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICBlbF9nZXQoZWwsIEVMX0NMSUVOVERBVEEsICZzZXNzaW9uKTsKKyAgICBCVUdfT04oc2Vzc2lvbiA9PSBOVUxMIHx8IHNlc3Npb24tPm1hZ2ljICE9IEJDTUNMSV9TRVNTSU9OX01BR0lDKTsKKyAgICBjMSA9IHNlc3Npb24tPnBhcm1zLmdldF9jaGFyKHNlc3Npb24pOworCisgICAgLyogVG9EbzogaGFuZGxlIFx0IHBhcmFtZXRlciBleHRlbnNpb24gKi8KKyAgICB3aGlsZSAoYzEgPiAwICYmIGMxID09ICdcdCcpCisgICAgeworCisgICAgICAgIGNvbnN0IExpbmVJbmZvICpsaSA9IGVsX2xpbmUoZWwpOworICAgICAgICBjaGFyICpsaW5lID0gYmNtb3NfYWxsb2MobGktPmN1cnNvciAtIGxpLT5idWZmZXIgKyAxKTsKKyAgICAgICAgaWYgKCFsaW5lKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIG1lbWNweShsaW5lLCBsaS0+YnVmZmVyLCBsaS0+Y3Vyc29yIC0gbGktPmJ1ZmZlcik7CisgICAgICAgIGxpbmVbbGktPmN1cnNvciAtIGxpLT5idWZmZXJdID0gMDsKKyAgICAgICAgcmMgPSBiY21jbGlfZXh0ZW5kKHNlc3Npb24sIGxpbmUsIGluc2VydF9idWYsIHNpemVvZihpbnNlcnRfYnVmKSk7CisgICAgICAgIGJjbW9zX2ZyZWUobGluZSk7CisgICAgICAgIGlmIChyYykKKyAgICAgICAgeworICAgICAgICAgICAgYzEgPSBzZXNzaW9uLT5wYXJtcy5nZXRfY2hhcihzZXNzaW9uKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGVsX2luc2VydHN0cihlbCwgaW5zZXJ0X2J1Zik7CisgICAgICAgIHByaW50ZigiXHIiKTsKKyAgICAgICAgZWxfc2V0KGVsLCBFTF9SRUZSRVNILCBOVUxMKTsKKyAgICAgICAgYzEgPSBzZXNzaW9uLT5wYXJtcy5nZXRfY2hhcihzZXNzaW9uKTsKKyAgICB9CisgICAgaWYgKGMxIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgICpjID0gYzE7CisgICAgcmV0dXJuIDE7Cit9CisjZW5kaWYKKworLyogbGluZW5vaXNlIGxpbmUgZWRpdGluZyBsaWJyYXJ5OiBjb21wbGV0aW9uIHN1cHBvcnQgKi8KKyNpZmRlZiBDT05GSUdfTElORU5PSVNFCisKK3N0YXRpYyBpbnQgX2JjbWNsaV9saW5lbm9pc2VfcmVhZF9jaGFyKGxvbmcgZmRfaW4sIGNoYXIgKmMpCit7CisgICAgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24gPSAoYmNtY2xpX3Nlc3Npb24gKilmZF9pbjsKKyAgICBpbnQgYzE7CisgICAgYzEgPSBzZXNzaW9uLT5wYXJtcy5nZXRfY2hhcihzZXNzaW9uKTsKKyAgICBpZiAoYzEgPCAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAqYyA9IGMxOworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9iY21jbGlfbGluZW5vaXNlX3dyaXRlKGxvbmcgZmRfb3V0LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisgICAgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24gPSAoYmNtY2xpX3Nlc3Npb24gKilmZF9vdXQ7CisgICAgLyogVXNlIGEgc2hvcnRjdXQgZm9yIGxlbj09MSAtIHdoaWNoIGlzIGNoYXItYnktY2hhciBpbnB1dC4KKyAgICAgICBiY21vc19wcmludGYoIiUqcyIsIGJ1ZiwgMSkgbWlzYmVoYXZlcyBvbiB2eHcgcGxhdGZvcm0sCisgICAgICAgcG9zc2libHkgYmVjYXVzZSBpdCBpcyB0b28gc2xvdy4KKyAgICAqLworICAgIGlmIChsZW4gPT0gMSAmJiAhc2Vzc2lvbi0+cGFybXMud3JpdGUpCisgICAgeworICAgICAgICBiY21vc19wdXRjaGFyKGJ1ZlswXSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gYmNtY2xpX3Nlc3Npb25fd3JpdGUoc2Vzc2lvbiwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgaW50IF9iY21jbGlfbGluZW5vaXNlX3RhYihsaW5lbm9pc2VTZXNzaW9uICpsbl9zZXNzaW9uLCBjb25zdCBjaGFyICpidWYsIGludCBwb3MpCit7CisgICAgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24gPSBOVUxMOworICAgIGNoYXIgKmxpbmU7CisgICAgY2hhciBpbnNlcnRfYnVmWzgwXT0iIjsKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBpbnQgbGVuOworCisgICAgc2Vzc2lvbiA9IGxpbmVub2lzZVNlc3Npb25EYXRhKGxuX3Nlc3Npb24pOworICAgIEJVR19PTihzZXNzaW9uID09IE5VTEwgfHwgc2Vzc2lvbi0+bWFnaWMgIT0gQkNNQ0xJX1NFU1NJT05fTUFHSUMpOworICAgIGxpbmUgPSBiY21vc19hbGxvYyhzdHJsZW4oYnVmKSsxKTsKKyAgICBpZiAoIWxpbmUpCisgICAgICAgIHJldHVybiAwOworICAgIHN0cmNweShsaW5lLCBidWYpOworICAgIHJjID0gYmNtY2xpX2V4dGVuZChzZXNzaW9uLCBsaW5lLCBpbnNlcnRfYnVmLCBzaXplb2YoaW5zZXJ0X2J1ZikpOworICAgIGJjbW9zX2ZyZWUobGluZSk7CisgICAgaWYgKHJjIHx8ICFzdHJsZW4oaW5zZXJ0X2J1ZikpCisgICAgICAgIHJldHVybiAwOworCisgICAgbGVuID0gc3RybGVuKGJ1Zik7CisgICAgbGluZSA9IGJjbW9zX2FsbG9jKHN0cmxlbihidWYpK3N0cmxlbihpbnNlcnRfYnVmKSsxKTsKKyAgICBpZiAoIWxpbmUpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChwb3MgPj0wICYmIHBvcyA8IGxlbikKKyAgICB7CisgICAgICAgIHN0cm5jcHkobGluZSwgYnVmLCBwb3MpOworICAgICAgICBsaW5lW3Bvc10gPSAwOworICAgICAgICBzdHJjYXQobGluZSwgaW5zZXJ0X2J1Zik7CisgICAgICAgIHN0cmNhdChsaW5lLCAmYnVmW3Bvc10pOworICAgICAgICBwb3MgKz0gc3RybGVuKGluc2VydF9idWYpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzdHJjcHkobGluZSwgYnVmKTsKKyAgICAgICAgc3RyY2F0KGxpbmUsIGluc2VydF9idWYpOworICAgICAgICBwb3MgPSBzdHJsZW4obGluZSk7CisgICAgfQorICAgIGxpbmVub2lzZVNldEJ1ZmZlcihsbl9zZXNzaW9uLCBsaW5lLCBwb3MpOworICAgIGJjbW9zX2ZyZWUobGluZSk7CisgICAgcmV0dXJuIDE7Cit9CisKKyNlbmRpZgorCisvKiBEZWZhdWx0IGdldGMgZnVuY3Rpb24gKi8KK3N0YXRpYyBpbnQgX2JjbWNsaV9zZXNzaW9uX2dldF9jaGFyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIHJldHVybiBiY21vc19nZXRjaGFyKCk7Cit9CisKKy8qKiBJbml0aWFsaXplIHNlc3Npb24gbWFuYWdlbWVudCBtb2R1bGUKKyAqIFxyZXR1cm4KKyAqICAgICAgMCAgID1PS1xuCisgKiAgICAgIDwwICA9ZXJyb3IgY29kZQorICovCitzdGF0aWMgdm9pZCBiY21jbGlfc2Vzc2lvbl9tb2R1bGVfaW5pdCh2b2lkKQoreworICAgIGJjbW9zX2Zhc3Rsb2NrX2luaXQoJnNlc3Npb25fbG9jaywgMCk7CisgICAgc2Vzc2lvbl9tb2R1bGVfaW5pdGlhbGl6ZWQgPSAxOworfQorCisvKiogT3BlbiBtYW5hZ2VtZW50IHNlc3Npb24gKi8KK2ludCBiY21jbGlfc2Vzc2lvbl9vcGVuX3VzZXIoY29uc3QgYmNtY2xpX3Nlc3Npb25fcGFybSAqcGFybSwgYmNtY2xpX3Nlc3Npb24gKipwX3Nlc3Npb24pCit7CisgICAgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb247CisgICAgYmNtY2xpX3Nlc3Npb24gKipwX2xhc3RfbmV4dDsKKyAgICBjb25zdCBjaGFyICpuYW1lOworICAgIGNoYXIgKm5hbWVfY2xvbmU7CisgICAgbG9uZyBmbGFnczsKKyAgICBpbnQgc2l6ZTsKKworICAgIGlmICghcF9zZXNzaW9uIHx8ICFwYXJtKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworI2lmbmRlZiBDT05GSUdfRURJVExJTkUKKyAgICBpZiAocGFybS0+bGluZV9lZGl0X21vZGUgPT0gQkNNQ0xJX0xJTkVfRURJVF9FTkFCTEUpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkxpbmUgZWRpdGluZyBmZWF0dXJlIGlzIG5vdCBjb21waWxlZCBpbi4gZGVmaW5lIENPTkZJR19FRElUTElORVxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisgICAgfQorI2VuZGlmCisgICAgaWYgKCFzZXNzaW9uX21vZHVsZV9pbml0aWFsaXplZCkKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fbW9kdWxlX2luaXQoKTsKKyAgICBuYW1lID0gcGFybS0+bmFtZTsKKyAgICBpZiAoIW5hbWUpCisgICAgICAgIG5hbWUgPSAiKnVubmFtZWQqIjsKKyAgICBzaXplID0gc2l6ZW9mKGJjbWNsaV9zZXNzaW9uKSArIHN0cmxlbihuYW1lKSArIDEgKyBwYXJtLT5leHRyYV9zaXplOworICAgIHNlc3Npb249YmNtb3NfY2FsbG9jKHNpemUpOworICAgIGlmICghc2Vzc2lvbikKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgc2Vzc2lvbi0+cGFybXMgPSAqcGFybTsKKyAgICBuYW1lX2Nsb25lID0gKGNoYXIgKilzZXNzaW9uICsgc2l6ZW9mKGJjbWNsaV9zZXNzaW9uKSArIHBhcm0tPmV4dHJhX3NpemU7CisgICAgc3RyY3B5KG5hbWVfY2xvbmUsIG5hbWUpOworICAgIHNlc3Npb24tPnBhcm1zLm5hbWUgPSBuYW1lX2Nsb25lOworICAgIGlmICghc2Vzc2lvbi0+cGFybXMuZ2V0X2NoYXIpCisgICAgICAgIHNlc3Npb24tPnBhcm1zLmdldF9jaGFyID0gX2JjbWNsaV9zZXNzaW9uX2dldF9jaGFyOworCisjaWZkZWYgQ09ORklHX0xJQkVESVQKKyAgICBpZiAoIXBhcm0tPmdldHMgJiYgKHBhcm0tPmxpbmVfZWRpdF9tb2RlID09IEJDTUNMSV9MSU5FX0VESVRfRU5BQkxFIHx8CisgICAgICAgIHBhcm0tPmxpbmVfZWRpdF9tb2RlID09IEJDTUNMSV9MSU5FX0VESVRfREVGQVVMVCkpCisgICAgeworICAgICAgICAvKiBJbml0aWFsaXplIGVkaXRsaW5lIGxpYnJhcnkgKi8KKyAgICAgICAgc2Vzc2lvbi0+ZWwgPSBlbF9pbml0KHNlc3Npb24tPnBhcm1zLm5hbWUsIHN0ZGluLCBzdGRvdXQsIHN0ZGVycik7CisgICAgICAgIHNlc3Npb24tPmhpc3RvcnkgPSBoaXN0b3J5X2luaXQoKTsKKyAgICAgICAgaWYgKHNlc3Npb24tPmVsICYmIHNlc3Npb24tPmhpc3RvcnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVsX3NldChzZXNzaW9uLT5lbCwgRUxfRURJVE9SLCAiZW1hY3MiKTsKKyAgICAgICAgICAgIGVsX3NldChzZXNzaW9uLT5lbCwgRUxfUFJPTVBULCAmX2JjbWNsaV9lZGl0bGluZV9wcm9tcHQpOworICAgICAgICAgICAgZWxfc2V0KHNlc3Npb24tPmVsLCBFTF9URVJNSU5BTCwgInh0ZXJtIik7CisgICAgICAgICAgICBlbF9zZXQoc2Vzc2lvbi0+ZWwsIEVMX0dFVENGTiwgX2JjbWNsaV9lZGl0bGluZV9jZm4pOworICAgICAgICAgICAgZWxfc2V0KHNlc3Npb24tPmVsLCBFTF9DTElFTlREQVRBLCBzZXNzaW9uKTsKKyAgICAgICAgICAgIGhpc3Rvcnkoc2Vzc2lvbi0+aGlzdG9yeSwgJnNlc3Npb24tPmhpc3RldmVudCwgSF9TRVRTSVpFLCA4MDApOworICAgICAgICAgICAgZWxfc2V0KHNlc3Npb24tPmVsLCBFTF9ISVNULCBoaXN0b3J5LCBzZXNzaW9uLT5oaXN0b3J5KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiQ2FuJ3QgaW5pdGlhbGl6ZSBlZGl0bGluZSBsaWJyYXJ5XG4iKTsKKyAgICAgICAgICAgIGJjbW9zX2ZyZWUoc2Vzc2lvbik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0xJTkVOT0lTRQorICAgIC8qIFNldCB0aGUgY29tcGxldGlvbiBjYWxsYmFjay4gVGhpcyB3aWxsIGJlIGNhbGxlZCBldmVyeSB0aW1lIHRoZQorICAgICAqIHVzZXIgdXNlcyB0aGUgPHRhYj4ga2V5LiAqLworICAgIGlmICghcGFybS0+Z2V0cyAmJiAocGFybS0+bGluZV9lZGl0X21vZGUgPT0gQkNNQ0xJX0xJTkVfRURJVF9FTkFCTEUgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcm0tPmxpbmVfZWRpdF9tb2RlID09IEJDTUNMSV9MSU5FX0VESVRfREVGQVVMVCkpCisgICAgeworICAgICAgICBsaW5lbm9pc2VTZXNzaW9uSU8gaW89ey5mZF9pbj0obG9uZylzZXNzaW9uLCAuZmRfb3V0PShsb25nKXNlc3Npb24sCisgICAgICAgICAgICAucmVhZF9jaGFyPV9iY21jbGlfbGluZW5vaXNlX3JlYWRfY2hhciwKKyAgICAgICAgICAgIC53cml0ZT1fYmNtY2xpX2xpbmVub2lzZV93cml0ZQorICAgICAgICB9OworICAgICAgICBpZiAobGluZW5vaXNlU2Vzc2lvbk9wZW4oJmlvLCBzZXNzaW9uLCAmc2Vzc2lvbi0+bG5fc2Vzc2lvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiQ2FuJ3QgY3JlYXRlIGxpbmVub2lzZSBzZXNzaW9uXG4iKTsKKyAgICAgICAgICAgIGJjbW9zX2ZyZWUoc2Vzc2lvbik7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgfQorICAgICAgICBsaW5lbm9pc2VTZXRDb21wbGV0aW9uQ2FsbGJhY2soc2Vzc2lvbi0+bG5fc2Vzc2lvbiwgX2JjbWNsaV9saW5lbm9pc2VfdGFiKTsKKyAgICB9CisjZW5kaWYKKworICAgIHNlc3Npb24tPm1hZ2ljID0gQkNNQ0xJX1NFU1NJT05fTUFHSUM7CisKKyAgICBmbGFncyA9IGJjbW9zX2Zhc3Rsb2NrX2xvY2soJnNlc3Npb25fbG9jayk7CisgICAgcF9sYXN0X25leHQgPSAmc2Vzc2lvbl9saXN0OworICAgIHdoaWxlKCpwX2xhc3RfbmV4dCkKKyAgICAgICAgcF9sYXN0X25leHQgPSAmKCgqcF9sYXN0X25leHQpLT5uZXh0KTsKKyAgICAqcF9sYXN0X25leHQgPSBzZXNzaW9uOworICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmc2Vzc2lvbl9sb2NrLCBmbGFncyk7CisKKyAgICAqcF9zZXNzaW9uID0gc2Vzc2lvbjsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJjbWNsaV9zZXNzaW9uX3N0cmluZ193cml0ZShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqYnVmLCB1aW50MzJfdCBzaXplKQoreworICAgIGJjbW9sdF9zdHJpbmcgKnN0ciA9IGJjbWNsaV9zZXNzaW9uX3VzZXJfcHJpdihzZXNzaW9uKTsKKyAgICByZXR1cm4gYmNtb2x0X3N0cmluZ19jb3B5KHN0ciwgYnVmLCBzaXplKTsKK30KKworYmNtb3NfZXJybm8gYmNtY2xpX3Nlc3Npb25fb3Blbl9zdHJpbmcoYmNtY2xpX3Nlc3Npb24gKipzZXNzaW9uLCBiY21vbHRfc3RyaW5nICpzdHIpCit7CisgICAgYmNtY2xpX3Nlc3Npb25fcGFybSBzcCA9IHsgLnVzZXJfcHJpdiA9IHN0ciwgLndyaXRlID0gYmNtY2xpX3Nlc3Npb25fc3RyaW5nX3dyaXRlIH07CisKKyAgICByZXR1cm4gYmNtY2xpX3Nlc3Npb25fb3Blbl91c2VyKCZzcCwgc2Vzc2lvbik7Cit9CisKKy8qKiBDbG9zZSBtYW5hZ2VtZW50IHNlc3Npb24uCisgKiBccGFyYW1baW5dICAgc2Vzc2lvbiAgICAgICAgIFNlc3Npb24gaGFuZGxlCisgKi8KK3ZvaWQgYmNtY2xpX3Nlc3Npb25fY2xvc2UoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgbG9uZyBmbGFnczsKKworICAgIEJVR19PTihzZXNzaW9uLT5tYWdpYyAhPSBCQ01DTElfU0VTU0lPTl9NQUdJQyk7CisgICAgZmxhZ3MgPSBiY21vc19mYXN0bG9ja19sb2NrKCZzZXNzaW9uX2xvY2spOworICAgIGlmIChzZXNzaW9uPT1zZXNzaW9uX2xpc3QpCisgICAgICAgIHNlc3Npb25fbGlzdCA9IHNlc3Npb24tPm5leHQ7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb24gKnByZXYgPSBzZXNzaW9uX2xpc3Q7CisgICAgICAgIHdoaWxlIChwcmV2ICYmIHByZXYtPm5leHQgIT0gc2Vzc2lvbikKKyAgICAgICAgICAgIHByZXYgPSBwcmV2LT5uZXh0OworICAgICAgICBpZiAoIXByZXYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmc2Vzc2lvbl9sb2NrLCBmbGFncyk7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIiVzOiBjYW4ndCBmaW5kIHNlc3Npb25cbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcHJldi0+bmV4dCA9IHNlc3Npb24tPm5leHQ7CisgICAgfQorICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmc2Vzc2lvbl9sb2NrLCBmbGFncyk7CisKKyNpZmRlZiBDT05GSUdfTElCRURJVAorICAgIGlmIChzZXNzaW9uLT5oaXN0b3J5KQorICAgICAgICBoaXN0b3J5X2VuZChzZXNzaW9uLT5oaXN0b3J5KTsKKyAgICBpZiAoc2Vzc2lvbi0+ZWwpCisgICAgICAgIGVsX2VuZChzZXNzaW9uLT5lbCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTElORU5PSVNFCisgICAgaWYgKHNlc3Npb24tPmxuX3Nlc3Npb24pCisgICAgICAgIGxpbmVub2lzZVNlc3Npb25DbG9zZShzZXNzaW9uLT5sbl9zZXNzaW9uKTsKKyNlbmRpZgorICAgIHNlc3Npb24tPm1hZ2ljID0gQkNNQ0xJX1NFU1NJT05fTUFHSUNfREVMOworICAgIGJjbW9zX2ZyZWUoc2Vzc2lvbik7CisKK30KKworLyoqIENvbmZpZ3VyZSBSQVcgaW5wdXQgbW9kZQorICoKKyAqIFxwYXJhbVtpbl0gICAgICAgc2Vzc2lvbiAgICAgICAgIFNlc3Npb24gaGFuZGxlCisgKiBccGFyYW1baW5dICAgICAgIGlzX3JhdyAgICAgICAgICBUUlVFPWVuYWJsZSByYXcgbW9kZSwgRkFMU0U9ZGlzYWJsZSByYXcgbW9kZQorICogXHJldHVybgorICogICAgICA9MCAgLSBPSyBcbgorICogICAgICBCQ01fRVJSX05PVF9TVVBQT1JURUQgLSByYXcgbW9kZSBpcyBub3Qgc3VwcG9ydGVkXG4KKyAqLworYmNtb3NfZXJybm8gYmNtY2xpX3Nlc3Npb25fcmF3X21vZGVfc2V0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBiY21vc19ib29sIGlzX3JhdykKK3sKKyNpZmRlZiBDT05GSUdfTElORU5PSVNFCisgICAgaW50IHJjOworICAgIGlmIChzZXNzaW9uLT5wYXJtcy5nZXRzKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworICAgIHJjID0gbGluZW5vaXNlU2V0UmF3KHNlc3Npb24tPmxuX3Nlc3Npb24sIGlzX3Jhdyk7CisgICAgcmV0dXJuIChyYyA9PSAwKSA/IEJDTV9FUlJfT0sgOiBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisjZWxzZQorICAgIHJldHVybiBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisjZW5kaWYKK30KKworLyoqIERlZmF1bHQgd3JpdGUgY2FsbGJhY2sgZnVuY3Rpb24KKyAqIHdyaXRlIHRvIHN0ZG91dAorICovCitzdGF0aWMgaW50IF9iY21jbGlfc2Vzc2lvbl93cml0ZShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqYnVmLCB1aW50MzJfdCBzaXplKQoreworICAgIHJldHVybiBiY21vc19wcmludGYoIiUuKnMiLCBzaXplLCBidWYpOworfQorCisKKy8qKiBXcml0ZSBmdW5jdGlvbi4KKyAqIFdyaXRlIGJ1ZmZlciB0byB0aGUgY3VycmVudCBzZXNzaW9uLgorICogXHBhcmFtW2luXSAgIHNlc3Npb24gICAgICAgICBTZXNzaW9uIGhhbmRsZS4gTlVMTD11c2Ugc3Rkb3V0CisgKiBccGFyYW1baW5dICAgYnVmZmVyICAgICAgICAgIG91dHB1dCBidWZmZXIKKyAqIFxwYXJhbVtpbl0gICBzaXplICAgICAgICAgICAgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHdyaXR0ZW4KKyAqIFxyZXR1cm4KKyAqICA+PTAgLSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlblxuCisgKiAgPDAgIC0gb3V0cHV0IGVycm9yCisgKi8KK2ludCBiY21jbGlfc2Vzc2lvbl93cml0ZShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqYnVmLCB1aW50MzJfdCBzaXplKQoreworICAgIGludCAoKndyaXRlX2NiKShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqYnVmLCB1aW50MzJfdCBzaXplKTsKKyAgICBpZiAoc2Vzc2lvbiAmJiBzZXNzaW9uLT5wYXJtcy53cml0ZSkKKyAgICB7CisgICAgICAgIEJVR19PTihzZXNzaW9uLT5tYWdpYyAhPSBCQ01DTElfU0VTU0lPTl9NQUdJQyk7CisgICAgICAgIHdyaXRlX2NiID0gc2Vzc2lvbi0+cGFybXMud3JpdGU7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgd3JpdGVfY2IgPSBfYmNtY2xpX3Nlc3Npb25fd3JpdGU7CisgICAgcmV0dXJuIHdyaXRlX2NiKHNlc3Npb24sIGJ1Ziwgc2l6ZSk7Cit9CisKKworLyoqIFJlYWQgbGluZQorICogXHBhcmFtW2luXSAgICAgICBzZXNzaW9uICAgICAgICAgU2Vzc2lvbiBoYW5kbGUuIE5VTEw9dXNlIGRlZmF1bHQKKyAqIFxwYXJhbVtpbixvdXRdICAgYnVmICAgICAgICAgICAgIGlucHV0IGJ1ZmZlcgorICogXHBhcmFtW2luXSAgICAgICBzaXplICAgICAgICAgICAgYnVmIHNpemUKKyAqIFxyZXR1cm4KKyAqICAgICAgYnVmIGlmIHN1Y2Nlc3NmdWwKKyAqICAgICAgTlVMTCBpZiBFT0Ygb3IgZXJyb3IKKyAqLworY2hhciAqYmNtY2xpX3Nlc3Npb25fZ2V0cyhiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY2hhciAqYnVmLCB1aW50MzJfdCBzaXplKQoreworICAgIHJldHVybiBfYmNtY2xpX3Nlc3Npb25fZ2V0cyhzZXNzaW9uLCBidWYsIHNpemUpOworfQorCisKKy8qKiBQcmludCBmdW5jdGlvbi4KKyAqIFByaW50cyBpbiB0aGUgY29udGV4dCBvZiBjdXJyZW50IHNlc3Npb24uCisgKiBccGFyYW1baW5dICAgc2Vzc2lvbiAgICAgICAgIFNlc3Npb24gaGFuZGxlLiBOVUxMPXVzZSBzdGRvdXQKKyAqIFxwYXJhbVtpbl0gICBmb3JtYXQgICAgICAgICAgcHJpbnQgZm9ybWF0IC0gYXMgaW4gcHJpbnRmCisgKiBccGFyYW1baW5dICAgYXAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgbGlzdC4gVW5kZWZpbmVkIGFmdGVyIHRoZSBjYWxsCisgKi8KK3ZvaWQgYmNtY2xpX3Nlc3Npb25fdnByaW50KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXApCit7CisgICAgaWYgKHNlc3Npb24gJiYgc2Vzc2lvbi0+cGFybXMud3JpdGUpCisgICAgeworICAgICAgICBCVUdfT04oc2Vzc2lvbi0+bWFnaWMgIT0gQkNNQ0xJX1NFU1NJT05fTUFHSUMpOworICAgICAgICB2c25wcmludGYoc2Vzc2lvbi0+b3V0YnVmLCBzaXplb2Yoc2Vzc2lvbi0+b3V0YnVmKSwgZm9ybWF0LCBhcCk7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3dyaXRlKHNlc3Npb24sIHNlc3Npb24tPm91dGJ1Ziwgc3RybGVuKHNlc3Npb24tPm91dGJ1ZikpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGJjbW9zX3ZwcmludGYoZm9ybWF0LCBhcCk7Cit9CisKKworLyoqIFByaW50IGZ1bmN0aW9uLgorICogUHJpbnRzIGluIHRoZSBjb250ZXh0IG9mIGN1cnJlbnQgc2Vzc2lvbi4KKyAqIFxwYXJhbVtpbl0gICBzZXNzaW9uICAgICAgICAgU2Vzc2lvbiBoYW5kbGUuIE5VTEw9dXNlIHN0ZG91dAorICogXHBhcmFtW2luXSAgIGZvcm1hdCAgICAgICAgICBwcmludCBmb3JtYXQgLSBhcyBpbiBwcmludGYKKyAqLwordm9pZCBiY21jbGlfc2Vzc2lvbl9wcmludChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgICAgdmFfbGlzdCBhcDsKKyAgICB2YV9zdGFydChhcCwgZm9ybWF0KTsKKyAgICBiY21jbGlfc2Vzc2lvbl92cHJpbnQoc2Vzc2lvbiwgZm9ybWF0LCBhcCk7CisgICAgdmFfZW5kKGFwKTsKK30KKworLyoqIEdldCB1c2VyX3ByaXYgcHJvdm9kZWQgaW4gc2Vzc2lvbiBwYXJ0YW1ldGVycyB3aGVuIGl0IHdhcyByZWdpc3RlcmVkCisgKiBccGFyYW1baW5dICAgICAgIHNlc3Npb24gICAgICAgICBTZXNzaW9uIGhhbmRsZS4gTlVMTD11c2Ugc3RkaW4KKyAqIFxyZXR1cm4gdXNyX3ByaXYgdmFsdWUKKyAqLwordm9pZCAqYmNtY2xpX3Nlc3Npb25fdXNlcl9wcml2KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGlmICghc2Vzc2lvbikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQlVHX09OKHNlc3Npb24tPm1hZ2ljICE9IEJDTUNMSV9TRVNTSU9OX01BR0lDKTsKKyAgICByZXR1cm4gc2Vzc2lvbi0+cGFybXMudXNlcl9wcml2OworfQorCisKKy8qKiBHZXQgZXh0cmEgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlc3Npb24KKyAqIFxwYXJhbVtpbl0gICAgICAgc2Vzc2lvbiAgICAgICAgIFNlc3Npb24gaGFuZGxlLiBOVUxMPWRlZmF1bHQgc2Vzc2lvbgorICogXHJldHVybiBleHRyYV9kYXRhIHBvaW50ZXIgb3IgTlVMTCBpZiB0aGVyZSBpcyBubyBleHRyYSBkYXRhCisgKi8KK3ZvaWQgKmJjbWNsaV9zZXNzaW9uX2RhdGEoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pCit7CisgICAgaWYgKCFzZXNzaW9uKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBCVUdfT04oc2Vzc2lvbi0+bWFnaWMgIT0gQkNNQ0xJX1NFU1NJT05fTUFHSUMpOworICAgIGlmIChzZXNzaW9uLT5wYXJtcy5leHRyYV9zaXplIDw9IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiAoY2hhciAqKXNlc3Npb24gKyBzaXplb2YoKnNlc3Npb24pOworfQorCisKKy8qKiBHZXQgc2Vzc2lvbiBuYW1lZGF0YQorICogXHBhcmFtW2luXSAgICAgICBzZXNzaW9uICAgICAgICAgU2Vzc2lvbiBoYW5kbGUuIE5VTEw9ZGVmYXVsdCBzZXNzaW9uCisgKiBccmV0dXJuIHNlc3Npb24gbmFtZQorICovCitjb25zdCBjaGFyICpiY21jbGlfc2Vzc2lvbl9uYW1lKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGlmICghc2Vzc2lvbikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQlVHX09OKHNlc3Npb24tPm1hZ2ljICE9IEJDTUNMSV9TRVNTSU9OX01BR0lDKTsKKyAgICByZXR1cm4gc2Vzc2lvbi0+cGFybXMubmFtZTsKK30KKworCisvKiogR2V0IHNlc3Npb24gYWNjZXNzIHJpZ2h0ZQorICogXHBhcmFtW2luXSAgICAgICBzZXNzaW9uICAgICAgICAgU2Vzc2lvbiBoYW5kbGUuIE5VTEw9ZGVmYXVsdCBkZWJ1ZyBzZXNzaW9uCisgKiBccmV0dXJuIHNlc3Npb24gYWNjZXNzIHJpZ2h0CisgKi8KK2JjbWNsaV9hY2Nlc3NfcmlnaHQgYmNtY2xpX3Nlc3Npb25fYWNjZXNzX3JpZ2h0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKQoreworICAgIGlmICghc2Vzc2lvbikKKyAgICAgICAgcmV0dXJuIEJDTUNMSV9BQ0NFU1NfREVCVUc7CisgICAgQlVHX09OKHNlc3Npb24tPm1hZ2ljICE9IEJDTUNMSV9TRVNTSU9OX01BR0lDKTsKKyAgICByZXR1cm4gc2Vzc2lvbi0+cGFybXMuYWNjZXNzX3JpZ2h0OworfQorCisvKiogUHJpbnQgYnVmZmVyIGluIGhleGFkZWNpbWFsIGZvcm1hdAorICogXHBhcmFtW2luXSAgIHNlc3Npb24gICAgICAgICBTZXNzaW9uIGhhbmRsZS4gTlVMTD11c2Ugc3Rkb3V0CisgKiBccGFyYW1baW5dICAgYnVmZmVyICAgICAgICAgIEJ1ZmZlciBhZGRyZXNzCisgKiBccGFyYW1baW5dICAgb2Zmc2V0ICAgICAgICAgIFN0YXJ0IG9mZnNldCBpbiB0aGUgYnVmZmVyCisgKiBccGFyYW1baW5dICAgY291bnQgICAgICAgICAgIE51bWJlciBvZiBieXRlcyB0byBkdW1wCisgKiBccGFyYW1baW5dICAgaW5kZW50ICAgICAgICAgIE9wdGlvbmFsIGluZGVudGF0aW9uIHN0cmluZworICovCit2b2lkIGJjbWNsaV9zZXNzaW9uX2hleGR1bXAoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IHZvaWQgKmJ1ZmZlciwgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBjb3VudCwgY29uc3QgY2hhciAqaW5kZW50KQoreworICAgIGJjbW9zX2hleGR1bXAoKGJjbW9zX21zZ19wcmludF9jYiliY21jbGlfc2Vzc2lvbl9wcmludCwgc2Vzc2lvbiwgYnVmZmVyLCBvZmZzZXQsIGNvdW50LCBpbmRlbnQpOworfQorCisvKgorICogRXhwb3J0cworICovCitFWFBPUlRfU1lNQk9MKGJjbWNsaV9zZXNzaW9uX29wZW4pOworRVhQT1JUX1NZTUJPTChiY21jbGlfc2Vzc2lvbl9jbG9zZSk7CitFWFBPUlRfU1lNQk9MKGJjbWNsaV9zZXNzaW9uX3dyaXRlKTsKK0VYUE9SVF9TWU1CT0woYmNtY2xpX3Nlc3Npb25fdnByaW50KTsKK0VYUE9SVF9TWU1CT0woYmNtY2xpX3Nlc3Npb25fcHJpbnQpOworRVhQT1JUX1NZTUJPTChiY21jbGlfc2Vzc2lvbl9hY2Nlc3NfcmlnaHQpOworRVhQT1JUX1NZTUJPTChiY21jbGlfc2Vzc2lvbl9kYXRhKTsKK0VYUE9SVF9TWU1CT0woYmNtY2xpX3Nlc3Npb25fbmFtZSk7CitFWFBPUlRfU1lNQk9MKGJjbWNsaV9zZXNzaW9uX2hleGR1bXApOwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2NsaS9iY21jbGlfc2Vzc2lvbi5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2NsaS9iY21jbGlfc2Vzc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZDg3M2QKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvY2xpL2JjbWNsaV9zZXNzaW9uLmgKQEAgLTAsMCArMSwzMDkgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGJjbWNsaV9zZXNzaW9uLmgKKyAqCisgKiBCQ00gQ0xJIGVuZ2luZSAtIHNlc3Npb24gbWFuYWdlbWVudAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEJDTUNMSV9TRVNTSU9OX0gKKworI2RlZmluZSBCQ01DTElfU0VTU0lPTl9ICisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlICJiY21vbHRfc3RyaW5nLmgiCisKKy8qKiBcZGVmZ3JvdXAgYmNtY2xpX3Nlc3Npb24gTWFuYWdlbWVudCBTZXNzaW9uIENvbnRyb2wKKyAqCisgKiBBUElzIGluIHRoaXMgaGVhZGVyIGZpbGUgYWxsb3cgdG8gY3JlYXRlL2Rlc3Ryb3kgbWFuYWdlbWVudCBzZXNzaW9ucy4KKyAqIE1hbmFnZW1lbnQgc2Vzc2lvbiBpcyBjaGFyYWN0ZXJpemVkIGJ5IGl0cyBhY2Nlc3MgbGV2ZWwgYW5kIGFsc28KKyAqIGlucHV0L291dHB1dCBmdW5jdGlvbnMuCisgKiBNYW5hZ2VtZW50IHNlc3Npb25zIGFsbG93IG1hbmFnZWQgZW50aXRpZXMgaW4gdGhlIHN5c3RlbSB0byBjb21tdW5pY2F0ZQorICogd2l0aCBsb2NhbCBvciByZW1vdGUgbWFuYWdlcnMgKGUuZy4sIGxvY2FsIG9yIHJlbW90ZSBzaGVsbCBvciBOTVMpCisgKiBAeworICovCisKKy8qKiBBY2Nlc3MgcmlnaHRzICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBCQ01DTElfQUNDRVNTX0dVRVNULCAgICAgLyoqPCBHdWVzdC4gRG9lc24ndCBoYXZlIGFjY2VzcyB0byBjb21tYW5kcyBhbmQgZGlyZWN0b3JpZXMgcmVnaXN0ZXJlZCB3aXRoIEFETUlOIHJpZ2h0cyAqLworICAgIEJDTUNMSV9BQ0NFU1NfQURNSU4sICAgICAvKio8IEFkbWluaXN0cmF0b3I6IGZ1bGwgYWNjZXNzICovCisgICAgQkNNQ0xJX0FDQ0VTU19ERUJVRywgICAgIC8qKjwgQWRtaW5pc3RyYXRvcjogZnVsbCBhY2Nlc3MgKyBleHRlbmRlZCBkZWJ1ZyBmZWF0dXJlcyAqLworfSBiY21jbGlfYWNjZXNzX3JpZ2h0OworCisvKiogTGluZSBlZGl0IG1vZGUgKi8KK3R5cGVkZWYgZW51bQoreworICAgIEJDTUNMSV9MSU5FX0VESVRfREVGQVVMVCwvKio8IEVuYWJsZSBsaW5lIGVkaXRpbmcgYW5kIGhpc3RvcnkgaWYgQ09ORklHX0VESVRMSU5FIGlzIGRlZmluZWQsIGRpc2FibGUgb3RoZXJ3aXNlICovCisgICAgQkNNQ0xJX0xJTkVfRURJVF9FTkFCTEUsIC8qKjwgRW5hYmxlIGxpbmUgZWRpdGluZy4gUmVxdWlyZXMgQ09ORklHX0VESVRMSU5FIGRlZmluZSBhbmQgbGliZWRpdC1kZXYgbGlicmFyeSAqLworICAgIEJDTUNMSV9MSU5FX0VESVRfRElTQUJMRSwvKio8IERpc2FibGUgbGluZSBlZGl0aW5nIGFuZCBoaXN0b3J5ICovCit9IGJjbWNsaV9saW5lX2VkaXRfbW9kZTsKKworCisvKiogTWFuYWdlbWVudCBzZXNzaW9uIGhhbmRsZQorICovCit0eXBlZGVmIHN0cnVjdCBiY21jbGlfc2Vzc2lvbiBiY21jbGlfc2Vzc2lvbjsKKworCisvKiogU2Vzc2lvbiBwYXJhbWV0ZXJzIHN0cnVjdHVyZS4KKyAqIFNlZSBccmVmIGJjbWNsaV9zZXNzaW9uX29wZW4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtY2xpX3Nlc3Npb25fcGFybQoreworICAgIGNvbnN0IGNoYXIgKm5hbWU7ICAgICAgIC8qKjwgU2Vzc2lvbiBuYW1lICovCisgICAgdm9pZCAqdXNlcl9wcml2OyAgICAgICAgLyoqPCBQcml2YXRlIHVzZXIncyBkYXRhICovCisKKyAgICAvKiogU2Vzc2lvbidzIG91dHB1dCBmdW5jdGlvbi4gTlVMTD11c2Ugd3JpdGUoc3Rkb3V0KQorICAgICAqIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIG9yIDwwIGlmIGVycm9yCisgICAgICovCisgICAgaW50ICgqd3JpdGUpKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBjaGFyICpidWYsIHVpbnQzMl90IHNpemUpOworCisgICAgLyoqIFNlc3Npb24gbGluZSBpbnB1dCBmdW5jdGlvbi4gTlVMTD11c2UgZGVmYXVsdChzdGRpblsrbGluZSBlZGl0KSAqLworICAgIGNoYXIgKigqZ2V0cykoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNoYXIgKmJ1ZiwgdWludDMyX3Qgc2l6ZSk7CisKKyAgICAvKiogU2Vzc2lvbiBjaGFyIGlucHV0IGZ1bmN0aW9uLiBOVUxMPXVzZSBiY21vc19nZXRjaGFyKCkgKi8KKyAgICBpbnQgKCpnZXRfY2hhcikoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pOworCisgICAgLyoqIEZpbGwgdGhlIHNwZWNpZmllZCBidWZmZXIgd2l0aCB0aGUgcHJvbXB0IGZvciB0aGlzIHNlc3Npb24gKE5VTEwtdGVybWluYXRlZCkuIE5VTEwgPSBubyBwcm9tcHQuICovCisgICAgdm9pZCAoKmdldF9wcm9tcHQpKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjaGFyICpidWYsIHVpbnQzMl90IG1heF9sZW4pOworCisgICAgLyoqIEFjY2VzcyByaWdodHMgKi8KKyAgICBiY21jbGlfYWNjZXNzX3JpZ2h0IGFjY2Vzc19yaWdodDsKKworICAgIC8qKiBMaW5lIGVkaXRpbmcgbW9kZSAqLworICAgIGJjbWNsaV9saW5lX2VkaXRfbW9kZSBsaW5lX2VkaXRfbW9kZTsKKworICAgIC8qKiBFeHRyYSBkYXRhIHNpemUgdG8gYmUgYWxsb2NhdGVkIGFsb25nIHdpdGggc2Vzc2lvbiBjb250cm9sIGJsb2NrLgorICAgICAqIFRoZSBleHRyYSBkYXRhIGlzIGFjY2Vzc2libGUgdXNpbmcgYmNtY2xpX3Nlc3Npb25fZGF0YSgpLgorICAgICAqIFBsZWFzZSBub3RlIHRoYXQgaWYgc2Vzc2lvbiBpcyBjcmVhdGVkIHVzaW5nIGJjbWNsaV9zZXNzaW9uX29wZW4oKSwKKyAgICAgKiBleHRyYV9zaXplIGlzIHJlc2VydmVkLgorICAgICAqIEl0IGNhbiBvbmx5IGJlIHVzZWQgZm9yIHVzZXIgY29udGV4dCBhbGxvY2F0aW9uIGlmIHNlc3Npb24gaXMgY3JlYXRlZAorICAgICAqIHVzaW5nIGJjbWNsaV9zZXNzaW9uX29wZW5fdXNlcigpCisgICAgICovCisgICAgdWludDMyX3QgZXh0cmFfc2l6ZTsKK30gYmNtY2xpX3Nlc3Npb25fcGFybTsKKworCisvKiogT3BlbiBtb25pdG9yIHNlc3Npb24KKyAqCisgKiBNb25pdG9yIHN1cHBvcnRzIG11bHRpcGxlIHNpbXVsdGFuZW91cyBzZXNzaW9ucyB3aXRoIGRpZmZlcmVudAorICogYWNjZXNzIHJpZ2h0cy4KKyAqIE5vdGUgdGhhdCB0aGVyZSBhbHJlYWR5IGlzIGEgZGVmYXVsdCBzZXNzaW9uIHdpdGggZnVsbCBhZG1pbmlzdHJhdGl2ZSByaWdodHMsCisgKiB0aGF0IHRha2VzIGlucHV0IGZyb20gc3RkaW4gYW5kIG91dHB1dHMgdG8gc3Rkb3V0LgorICoKKyAqIFBsZWFzZSBkb24ndCB1c2UgcGFybS5leHRyYV9zaXplLiBUaGlzIGZpZWxkIGlzIHJlc2VydmVkLgorICoKKyAqIFxwYXJhbVtpbl0gICBwYXJtICAgICAgICBTZXNzaW9uIHBhcmFtZXRlcnMuIE11c3Qgbm90IGJlIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2suCisgKiBccGFyYW1bb3V0XSAgcF9zZXNzaW9uICAgU2Vzc2lvbiBoYW5kbGUKKyAqIFxyZXR1cm4KKyAqICAgICAgMCAgID1PS1xuCisgKiAgICAgIDwwICA9ZXJyb3IgY29kZQorICovCitiY21vc19lcnJubyBiY21jbGlfc2Vzc2lvbl9vcGVuKGNvbnN0IGJjbWNsaV9zZXNzaW9uX3Bhcm0gKnBhcm0sIGJjbWNsaV9zZXNzaW9uICoqcF9zZXNzaW9uKTsKKworCisvKiogQ2xvc2UgbW9uaXRvciBzZXNzaW9uLgorICogXHBhcmFtW2luXSAgIHNlc3Npb24gICAgICAgICBTZXNzaW9uIGhhbmRsZQorICovCit2b2lkIGJjbWNsaV9zZXNzaW9uX2Nsb3NlKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uICk7CisKKworLyoqIFdyaXRlIGZ1bmN0aW9uLgorICogV3JpdGUgYnVmZmVyIHRvIHRoZSBjdXJyZW50IHNlc3Npb24uCisgKiBccGFyYW1baW5dICAgc2Vzc2lvbiAgICAgICAgIFNlc3Npb24gaGFuZGxlLiBOVUxMPXVzZSBzdGRvdXQKKyAqIFxwYXJhbVtpbl0gICBidWYgICAgICAgICAgICAgb3V0cHV0IGJ1ZmZlcgorICogXHBhcmFtW2luXSAgIHNpemUgICAgICAgICAgICBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgd3JpdHRlbgorICogXHJldHVybgorICogID49MCAtIG51bWJlciBvZiBieXRlcyB3cml0dGVuXG4KKyAqICA8MCAgLSBvdXRwdXQgZXJyb3IKKyAqLworaW50IGJjbWNsaV9zZXNzaW9uX3dyaXRlKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBjaGFyICpidWYsIHVpbnQzMl90IHNpemUpOworCisKKy8qKiBSZWFkIGxpbmUKKyAqIFxwYXJhbVtpbl0gICAgICAgc2Vzc2lvbiAgICAgICAgIFNlc3Npb24gaGFuZGxlLiBOVUxMPXVzZSBkZWZhdWx0CisgKiBccGFyYW1baW4sb3V0XSAgIGJ1ZiAgICAgICAgICAgICBpbnB1dCBidWZmZXIKKyAqIFxwYXJhbVtpbl0gICAgICAgc2l6ZSAgICAgICAgICAgIGJ1ZiBzaXplCisgKiBccmV0dXJuCisgKiAgICAgIGJ1ZiBpZiBzdWNjZXNzZnVsCisgKiAgICAgIE5VTEwgaWYgRU9GIG9yIGVycm9yCisgKi8KK2NoYXIgKmJjbWNsaV9zZXNzaW9uX2dldHMoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNoYXIgKmJ1ZiwgdWludDMyX3Qgc2l6ZSk7CisKKworLyoqIFByaW50IGZ1bmN0aW9uLgorICogUHJpbnRzIGluIHRoZSBjb250ZXh0IG9mIGN1cnJlbnQgc2Vzc2lvbi4KKyAqIFxwYXJhbVtpbl0gICBzZXNzaW9uICAgICAgICAgU2Vzc2lvbiBoYW5kbGUuIE5VTEw9dXNlIHN0ZG91dAorICogXHBhcmFtW2luXSAgIGZvcm1hdCAgICAgICAgICBwcmludCBmb3JtYXQgLSBhcyBpbiBwcmludGYKKyAqLwordm9pZCBiY21jbGlfc2Vzc2lvbl9wcmludChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCisjaWZuZGVmIEJDTUNMSV9TRVNTSU9OX0RJU0FCTEVfRk9STUFUX0NIRUNLCitfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAyLCAzKSkpCisjZW5kaWYKKzsKKworCisvKiogUHJpbnQgZnVuY3Rpb24uCisgKiBQcmludHMgaW4gdGhlIGNvbnRleHQgb2YgY3VycmVudCBzZXNzaW9uLgorICogXHBhcmFtW2luXSAgIHNlc3Npb24gICAgICAgICBTZXNzaW9uIGhhbmRsZS4gTlVMTD11c2Ugc3Rkb3V0CisgKiBccGFyYW1baW5dICAgZm9ybWF0ICAgICAgICAgIHByaW50IGZvcm1hdCAtIGFzIGluIHByaW50ZgorICogXHBhcmFtW2luXSAgIGFwICAgICAgICAgICAgICBwYXJhbWV0ZXJzIGxpc3QuIFVuZGVmaW5lZCBhZnRlciB0aGUgY2FsbAorICovCit2b2lkIGJjbWNsaV9zZXNzaW9uX3ZwcmludChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFwKTsKKworLyoqIFByaW50IGJ1ZmZlciBpbiBoZXhhZGVjaW1hbCBmb3JtYXQKKyAqIFxwYXJhbVtpbl0gICBzZXNzaW9uICAgICAgICAgU2Vzc2lvbiBoYW5kbGUuIE5VTEw9dXNlIHN0ZG91dAorICogXHBhcmFtW2luXSAgIGJ1ZmZlciAgICAgICAgICBCdWZmZXIgYWRkcmVzcworICogXHBhcmFtW2luXSAgIG9mZnNldCAgICAgICAgICBTdGFydCBvZmZzZXQgaW4gdGhlIGJ1ZmZlcgorICogXHBhcmFtW2luXSAgIGNvdW50ICAgICAgICAgICBOdW1iZXIgb2YgYnl0ZXMgdG8gZHVtcAorICogXHBhcmFtW2luXSAgIGluZGVudCAgICAgICAgICBPcHRpb25hbCBpbmRlbnRhdGlvbiBzdHJpbmcKKyAqLwordm9pZCBiY21jbGlfc2Vzc2lvbl9oZXhkdW1wKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCB2b2lkICpidWZmZXIsIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3QgY291bnQsIGNvbnN0IGNoYXIgKmluZGVudCk7CisKKy8qKiBHZXQgZXh0cmEgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlc3Npb24KKyAqIFxwYXJhbVtpbl0gICAgICAgc2Vzc2lvbiAgICAgICAgIFNlc3Npb24gaGFuZGxlLiBOVUxMPWRlZmF1bHQgc2Vzc2lvbgorICogXHJldHVybiBleHRyYV9kYXRhIHBvaW50ZXIgb3IgTlVMTCBpZiB0aGVyZSBpcyBubyBleHRyYSBkYXRhCisgKi8KK3ZvaWQgKmJjbWNsaV9zZXNzaW9uX2RhdGEoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24pOworCisKKy8qKiBHZXQgdXNlcl9wcml2IHByb3ZpZGVkIGluIHNlc3Npb24gcGFyYW1ldGVycyB3aGVuIGl0IHdhcyByZWdpc3RlcmVkCisgKiBccGFyYW1baW5dICAgICAgIHNlc3Npb24gICAgICAgICBTZXNzaW9uIGhhbmRsZS4gTlVMTD1kZWZhdWx0IHNlc3Npb24KKyAqIFxyZXR1cm4gdXNyX3ByaXYgdmFsdWUKKyAqLwordm9pZCAqYmNtY2xpX3Nlc3Npb25fdXNlcl9wcml2KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKTsKKworCisvKiogR2V0IHNlc3Npb24gbmFtZQorICogXHBhcmFtW2luXSAgICAgICBzZXNzaW9uICAgICAgICAgU2Vzc2lvbiBoYW5kbGUuIE5VTEw9dXNlIHN0ZGluCisgKiBccmV0dXJuIHNlc3Npb24gbmFtZQorICovCitjb25zdCBjaGFyICpiY21jbGlfc2Vzc2lvbl9uYW1lKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKTsKKworCisvKiogR2V0IHNlc3Npb24gYWNjZXNzIHJpZ2h0cworICogXHBhcmFtW2luXSAgICAgICBzZXNzaW9uICAgICAgICAgU2Vzc2lvbiBoYW5kbGUuIE5VTEw9ZGVmYXVsdCBkZWJ1ZyBzZXNzaW9uCisgKiBccmV0dXJuIHNlc3Npb24gYWNjZXNzIHJpZ2h0CisgKi8KK2JjbWNsaV9hY2Nlc3NfcmlnaHQgYmNtY2xpX3Nlc3Npb25fYWNjZXNzX3JpZ2h0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uKTsKKworLyoqIEB9IGVuZCBvZiBiY21jbGlfc2Vzc2lvbiBncm91cCAqLworCisvKiogTG93LWxldmVsIGludGVyZmFjZSBmb3Igd2hlbiBzZXNzaW9uIGlzIHVzZWQgb3V0c2lkZSBDTEkKKyAqCisgKiBccGFyYW1baW5dICAgcGFybSAgICAgICAgU2Vzc2lvbiBwYXJhbWV0ZXJzLiBNdXN0IG5vdCBiZSBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrLgorICogXHBhcmFtW291dF0gIHBfc2Vzc2lvbiAgIFNlc3Npb24gaGFuZGxlCisgKiBccmV0dXJuCisgKiAgICAgIDAgICA9T0tcbgorICogICAgICA8MCAgPWVycm9yIGNvZGUKKyAqLworaW50IGJjbWNsaV9zZXNzaW9uX29wZW5fdXNlcihjb25zdCBiY21jbGlfc2Vzc2lvbl9wYXJtICpwYXJtLCBiY21jbGlfc2Vzc2lvbiAqKnBfc2Vzc2lvbik7CisKKy8qKiBPcGVuIGEgc2Vzc2lvbiB0aGF0IHByaW50cyB0byB0aGUgc3BlY2lmaWVkIHN0cmluZworICovCitiY21vc19lcnJubyBiY21jbGlfc2Vzc2lvbl9vcGVuX3N0cmluZyhiY21jbGlfc2Vzc2lvbiAqKnNlc3Npb24sIGJjbW9sdF9zdHJpbmcgKnN0cik7CisKKy8qKiBDb25maWd1cmUgUkFXIGlucHV0IG1vZGUKKyAqCisgKiBccGFyYW1baW5dICAgICAgIHNlc3Npb24gICAgICAgICBTZXNzaW9uIGhhbmRsZQorICogXHBhcmFtW2luXSAgICAgICBpc19yYXcgICAgICAgICAgVFJVRT1lbmFibGUgcmF3IG1vZGUsIEZBTFNFPWRpc2FibGUgcmF3IG1vZGUKKyAqIFxyZXR1cm4KKyAqICAgICAgPTAgIC0gT0sgXG4KKyAqICAgICAgQkNNX0VSUl9OT1RfU1VQUE9SVEVEIC0gcmF3IG1vZGUgaXMgbm90IHN1cHBvcnRlZFxuCisgKi8KK2JjbW9zX2Vycm5vIGJjbWNsaV9zZXNzaW9uX3Jhd19tb2RlX3NldChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYmNtb3NfYm9vbCBpc19yYXcpOworCisvKiogQ29udGV4dCBleHRlbnNpb24KKyAqCisgKiAtIGlmIG5vIGNvbW1hbmQgLSBkaXNwbGF5IGxpc3Qgb2YgY29tbWFuZCBvciBleHRlbmQgY29tbWFuZAorICogLSBpZiBwcmV2IGNoYXIgaXMgIiAiCisgKiAgICAgIC0gaWYgcG9zaXRpb25hbCBhbmQgbmV4dCBwYXJtIGlzIGVudW0gLSBzaG93L2V4dGVuZHMgbGlzdCBvZiBtYXRjaGluZyB2YWx1ZXMKKyAqICAgICAgLSBlbHNlIC0gc2hvdy9leHRlbmQgbGlzdCBvZiB1bnVzZWQgcGFyYW1ldGVycworICogICBlbHNlCisgKiAgICAgIC0gaWYgZW50ZXJpbmcgdmFsdWUgYW5kIGVudW0gLSBzaG93L2V4dGVuZHMgbGlzdCBvZiBtYXRjaGluZyB2YWx1ZXMKKyAqICAgICAgLSBlbHNlIC0gc2hvdy9leHRlbmQgbGlzdCBvZiBtYXRjaGluZyB1bnVzZWQgcGFyYW1ldGVycworICoKKyAqIFxwYXJhbVtpbl0gICAgICAgc2Vzc2lvbiAgICAgICAgIFNlc3Npb24gaGFuZGxlCisgKiBccGFyYW1baW5dICAgICAgIGlucHV0X3N0cmluZyAgICBTdHJpbmcgdG8gYmUgcGFyc2VkCisgKiBccGFyYW1bb3V0XSAgICAgIGluc2VydF9zdHIgICAgICBTdHJpbmcgdG8gaW5zZXJ0IGF0IGN1cnNvciBwb3NpdGlvbgorICogXHBhcmFtW2luXSAgICAgICBpbnNlcnRfc2l6ZSAgICAgSW5zZXJ0IGJ1ZmZlciBzaXplCisgKiBccmV0dXJuCisgKiAgICAgID0wICAtIE9LIFxuCisgKiAgICAgIEJDTV9FUlJfUEFSTSAtIHBhcnNpbmcgZXJyb3JcbgorICovCitiY21vc19lcnJubyBiY21jbGlfZXh0ZW5kKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjaGFyICppbnB1dF9zdHJpbmcsCisgICAgY2hhciAqaW5zZXJ0X3N0ciwgdWludDMyX3QgaW5zZXJ0X3NpemUpOworCisKKyNpZmRlZiBCQ01DTElfSU5URVJOQUwKKworI2RlZmluZSBCQ01DTElfU0VTU0lPTl9PVVRCVUZfTEVOIDIwNDgKKyNkZWZpbmUgQkNNQ0xJX01BWF9QUk9NUFRfTEVOIDgKKworLyogZWRpdGxpbmUgZnVuY3Rpb25hbGl0eSAqLworLyogSWYgbGliZWRpdCBpcyBpbmNsdWRlZCAtIGl0IHRha2VzIHByZWNlZGVuY2UgKi8KKyNpZmRlZiBDT05GSUdfTElCRURJVAorI2luY2x1ZGUgPGhpc3RlZGl0Lmg+CisjdW5kZWYgQ09ORklHX0xJTkVOT0lTRQorI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfTElCRURJVCAqLworCisjaWZkZWYgQ09ORklHX0xJTkVOT0lTRQorI2luY2x1ZGUgPGxpbmVub2lzZS5oPgorI2VuZGlmCisKKy8qIE1hbmFnZW1lbnQgc2Vzc2lvbiBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBiY21jbGlfc2Vzc2lvbgoreworICAgIGJjbWNsaV9zZXNzaW9uICpuZXh0OworICAgIGJjbWNsaV9zZXNzaW9uX3Bhcm0gcGFybXM7CisgICAgdWludDMyX3QgbWFnaWM7CisjZGVmaW5lIEJDTUNMSV9TRVNTSU9OX01BR0lDICAgICAgICAgICAgKCgncyc8PDI0KXwoJ2UnPDwxNil8KCdzJzw8OCl8J3MnKQorI2RlZmluZSBCQ01DTElfU0VTU0lPTl9NQUdJQ19ERUwgICAgICAgICgoJ3MnPDwyNCl8KCdlJzw8MTYpfCgncyc8PDgpfCd+JykKKworICAgIC8qIExpbmUgZWRpdGluZyBhbmQgaGlzdG9yeSBzdXBwb3J0ICovCisjaWZkZWYgQ09ORklHX0xJQkVESVQKKyAgICBFZGl0TGluZSAqZWw7CisgICAgSGlzdG9yeSAqaGlzdG9yeTsKKyAgICBIaXN0RXZlbnQgaGlzdGV2ZW50OworI2VuZGlmCisjaWZkZWYgQ09ORklHX0xJTkVOT0lTRQorICAgIGxpbmVub2lzZVNlc3Npb24gKmxuX3Nlc3Npb247CisjZW5kaWYKKyAgICBjaGFyIG91dGJ1ZltCQ01DTElfU0VTU0lPTl9PVVRCVUZfTEVOXTsKKyAgICBjaGFyIHByb21wdF9idWZbQkNNQ0xJX01BWF9QUk9NUFRfTEVOXTsKKworICAgIC8qIEZvbGxvd2VkIGJ5IHNlc3Npb24gZGF0YSAqLworfTsKKyNlbmRpZgorCisjZW5kaWYgLyogI2lmbmRlZiBCQ01DTElfU0VTU0lPTl9IICovCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvY29tbW9uX2Vwb25fb2FtL01ha2VmaWxlIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2NvbW1vbl9lcG9uX29hbS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDYxNDhlCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2NvbW1vbl9lcG9uX29hbS9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKKyMgQ29tbW9uIEFQSQorIworTU9EX05BTUUgPSBjb21tb25fZXBvbl9vYW0KK01PRF9UWVBFID0gbGliCitNT0RfREVQUyA9IHV0aWxzIGRldl9sb2cKKworc3JjcyA9IGJjbW9sdF9lcG9uX29hbV90eXBlcy5jCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvY29tbW9uX2Vwb25fb2FtL2JjbW9sdF9lcG9uX29hbV90eXBlcy5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2NvbW1vbl9lcG9uX29hbS9iY21vbHRfZXBvbl9vYW1fdHlwZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWFkMjJlCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2NvbW1vbl9lcG9uX29hbS9iY21vbHRfZXBvbl9vYW1fdHlwZXMuYwpAQCAtMCwwICsxLDgyNjM1IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OnByb3ByaWV0YXJ5OnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVGhpcyBwcm9ncmFtIGlzIHRoZSBwcm9wcmlldGFyeSBzb2Z0d2FyZSBvZiBCcm9hZGNvbSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzCitsaWNlbnNvcnMsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBkdXBsaWNhdGVkLCBtb2RpZmllZCBvciBkaXN0cmlidXRlZCBwdXJzdWFudAordG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIGEgc2VwYXJhdGUsIHdyaXR0ZW4gbGljZW5zZSBhZ3JlZW1lbnQgZXhlY3V0ZWQKK2JldHdlZW4geW91IGFuZCBCcm9hZGNvbSAoYW4gIkF1dGhvcml6ZWQgTGljZW5zZSIpLiAgRXhjZXB0IGFzIHNldCBmb3J0aCBpbgorYW4gQXV0aG9yaXplZCBMaWNlbnNlLCBCcm9hZGNvbSBncmFudHMgbm8gbGljZW5zZSAoZXhwcmVzcyBvciBpbXBsaWVkKSwgcmlnaHQKK3RvIHVzZSwgb3Igd2FpdmVyIG9mIGFueSBraW5kIHdpdGggcmVzcGVjdCB0byB0aGUgU29mdHdhcmUsIGFuZCBCcm9hZGNvbQorZXhwcmVzc2x5IHJlc2VydmVzIGFsbCByaWdodHMgaW4gYW5kIHRvIHRoZSBTb2Z0d2FyZSBhbmQgYWxsIGludGVsbGVjdHVhbAorcHJvcGVydHkgcmlnaHRzIHRoZXJlaW4uICBJRiBZT1UgSEFWRSBOTyBBVVRIT1JJWkVEIExJQ0VOU0UsIFRIRU4gWU9VIEhBVkUKK05PIFJJR0hUIFRPIFVTRSBUSElTIFNPRlRXQVJFIElOIEFOWSBXQVksIEFORCBTSE9VTEQgSU1NRURJQVRFTFkgTk9USUZZCitCUk9BRENPTSBBTkQgRElTQ09OVElOVUUgQUxMIFVTRSBPRiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBleHByZXNzbHkgc2V0IGZvcnRoIGluIHRoZSBBdXRob3JpemVkIExpY2Vuc2UsCisKKzEuIFRoaXMgcHJvZ3JhbSwgaW5jbHVkaW5nIGl0cyBzdHJ1Y3R1cmUsIHNlcXVlbmNlIGFuZCBvcmdhbml6YXRpb24sCisgICAgY29uc3RpdHV0ZXMgdGhlIHZhbHVhYmxlIHRyYWRlIHNlY3JldHMgb2YgQnJvYWRjb20sIGFuZCB5b3Ugc2hhbGwgdXNlCisgICAgYWxsIHJlYXNvbmFibGUgZWZmb3J0cyB0byBwcm90ZWN0IHRoZSBjb25maWRlbnRpYWxpdHkgdGhlcmVvZiwgYW5kIHRvCisgICAgdXNlIHRoaXMgaW5mb3JtYXRpb24gb25seSBpbiBjb25uZWN0aW9uIHdpdGggeW91ciB1c2Ugb2YgQnJvYWRjb20KKyAgICBpbnRlZ3JhdGVkIGNpcmN1aXQgcHJvZHVjdHMuCisKKzIuIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIgorICAgIEFORCBXSVRIIEFMTCBGQVVMVFMgQU5EIEJST0FEQ09NIE1BS0VTIE5PIFBST01JU0VTLCBSRVBSRVNFTlRBVElPTlMgT1IKKyAgICBXQVJSQU5USUVTLCBFSVRIRVIgRVhQUkVTUywgSU1QTElFRCwgU1RBVFVUT1JZLCBPUiBPVEhFUldJU0UsIFdJVEgKKyAgICBSRVNQRUNUIFRPIFRIRSBTT0ZUV0FSRS4gIEJST0FEQ09NIFNQRUNJRklDQUxMWSBESVNDTEFJTVMgQU5ZIEFORAorICAgIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgVElUTEUsIE1FUkNIQU5UQUJJTElUWSwgTk9OSU5GUklOR0VNRU5ULAorICAgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBMQUNLIE9GIFZJUlVTRVMsIEFDQ1VSQUNZIE9SCisgICAgQ09NUExFVEVORVNTLCBRVUlFVCBFTkpPWU1FTlQsIFFVSUVUIFBPU1NFU1NJT04gT1IgQ09SUkVTUE9OREVOQ0UKKyAgICBUTyBERVNDUklQVElPTi4gWU9VIEFTU1VNRSBUSEUgRU5USVJFIFJJU0sgQVJJU0lORyBPVVQgT0YgVVNFIE9SCisgICAgUEVSRk9STUFOQ0UgT0YgVEhFIFNPRlRXQVJFLgorCiszLiBUTyBUSEUgTUFYSU1VTSBFWFRFTlQgUEVSTUlUVEVEIEJZIExBVywgSU4gTk8gRVZFTlQgU0hBTEwgQlJPQURDT00gT1IKKyAgICBJVFMgTElDRU5TT1JTIEJFIExJQUJMRSBGT1IgKGkpIENPTlNFUVVFTlRJQUwsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgICAgSU5ESVJFQ1QsIE9SIEVYRU1QTEFSWSBEQU1BR0VTIFdIQVRTT0VWRVIgQVJJU0lORyBPVVQgT0YgT1IgSU4gQU5ZCisgICAgV0FZIFJFTEFUSU5HIFRPIFlPVVIgVVNFIE9GIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFNPRlRXQVJFIEVWRU4KKyAgICBJRiBCUk9BRENPTSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVM7CisgICAgT1IgKGlpKSBBTlkgQU1PVU5UIElOIEVYQ0VTUyBPRiBUSEUgQU1PVU5UIEFDVFVBTExZIFBBSUQgRk9SIFRIRQorICAgIFNPRlRXQVJFIElUU0VMRiBPUiBVLlMuICQxLCBXSElDSEVWRVIgSVMgR1JFQVRFUi4gVEhFU0UgTElNSVRBVElPTlMKKyAgICBTSEFMTCBBUFBMWSBOT1RXSVRIU1RBTkRJTkcgQU5ZIEZBSUxVUkUgT0YgRVNTRU5USUFMIFBVUlBPU0UgT0YgQU5ZCisgICAgTElNSVRFRCBSRU1FRFkuCis6PgorKi8KKyNpbmNsdWRlICJiY21vbHRfZXBvbl9vYW1fdHlwZXMuaCIKKworI2RlZmluZSBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoYnVmLCBzaXplLCBzdGFydCkgIGJjbW9sdF9idWZfaW5pdChidWYsIHNpemUsIHN0YXJ0LCBCQ01PTFRfQlVGX0VORElBTl9GSVhFRCkKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwICAgICAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3NraXAKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zICAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3NldF9wb3MKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZCAgICAgICAgICAgICAgICBiY21vbHRfYnVmX2dldF91c2VkCisjZGVmaW5lIGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplICAgICAgYmNtb2x0X2J1Zl9nZXRfcmVtYWluaW5nX3NpemUKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZSAgICAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3dyaXRlCisjZGVmaW5lIGJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkCisjZGVmaW5lIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTggICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91OAorI2RlZmluZSBiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTggICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZF91OAorI2RlZmluZSBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNiAgICAgICAgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTE2CisjZGVmaW5lIGJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkX3UxNgorI2RlZmluZSBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UyNCAgICAgICAgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTI0CisjZGVmaW5lIGJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MjQgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkX3UyNAorI2RlZmluZSBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMiAgICAgICAgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTMyCisjZGVmaW5lIGJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkX3UzMgorI2RlZmluZSBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3MzMiAgICAgICAgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfczMyCisjZGVmaW5lIGJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9zMzIgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkX3MzMgorI2RlZmluZSBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NCAgICAgICAgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTY0CisjZGVmaW5lIGJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkX3U2NAorI2RlZmluZSBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2wgICAgICAgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfYm9vbAorI2RlZmluZSBiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbCAgICAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZF9ib29sCisjZGVmaW5lIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfbWFjX2FkZHJlc3MgICAgICAgYmNtb2x0X2J1Zl93cml0ZV9tYWNfYWRkcmVzcworI2RlZmluZSBiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfbWFjX2FkZHJlc3MgICAgICAgIGJjbW9sdF9idWZfcmVhZF9tYWNfYWRkcmVzcworI2RlZmluZSBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2lwdjRfYWRkcmVzcyAgICAgIGJjbW9sdF9idWZfd3JpdGVfaXB2NF9hZGRyZXNzCisjZGVmaW5lIGJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9pcHY0X2FkZHJlc3MgICAgICAgYmNtb2x0X2J1Zl9yZWFkX2lwdjRfYWRkcmVzcworI2RlZmluZSBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2lwdjZfYWRkcmVzcyAgICAgIGJjbW9sdF9idWZfd3JpdGVfaXB2Nl9hZGRyZXNzCisjZGVmaW5lIGJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9pcHY2X2FkZHJlc3MgICAgICAgYmNtb2x0X2J1Zl9yZWFkX2lwdjZfYWRkcmVzcworI2RlZmluZSBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3ZsYW5fdGFnICAgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdmxhbl90YWcKKyNkZWZpbmUgYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3ZsYW5fdGFnICAgICAgICAgICBiY21vbHRfYnVmX3JlYWRfdmxhbl90YWcKKworc3RhdGljIHVpbnQyNF90IHVpbnQzMl90X3RvX3VpbnQyNF90KHVpbnQzMl90IHUzMikKK3sKKyAgICB1aW50MjRfdCB1MjQ7CisKKyAgICB1MjQudThbMF0gPSAodTMyID4+IDE2KSAmIDB4ZmY7CisgICAgdTI0LnU4WzFdID0gKHUzMiA+PiA4KSAmIDB4ZmY7CisgICAgdTI0LnU4WzJdID0gKHUzMiA+PiAwKSAmIDB4ZmY7CisKKyAgICByZXR1cm4gdTI0OworfQorCitzdGF0aWMgdWludDMyX3QgdWludDI0X3RfdG9fdWludDMyX3QodWludDI0X3QgdTI0KQoreworICAgIHVpbnQzMl90IHUzMiA9IDA7CisKKyAgICB1MzIgfD0gdTI0LnU4WzBdIDw8IDE2OworICAgIHUzMiB8PSB1MjQudThbMV0gPDwgODsKKyAgICB1MzIgfD0gdTI0LnU4WzJdIDw8IDA7CisKKyAgICByZXR1cm4gdTMyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYWxhcm1fY29uZmlnX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fYWxhcm1fY29uZmlnX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYWxhcm1fY29uZmlnX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9hbGFybV9jb25maWdfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9hdXRvbmVnb3RpYXRlX2FkbWluX3N0YXRlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2F1dG9uZWdvdGlhdGVfYWRtaW5fc3RhdGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYXV0b25lZ290aWF0ZV9hZG1pbl9zdGF0ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2F1dG9uZWdvdGlhdGVfYWRtaW5fc3RhdGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYXV0b19uZWdvdGlhdGlvbl9hdXRvX2NvbmZpZ19wYWNrKGJjbW9sdF9lcG9uX29hbV9hdXRvX25lZ290aWF0aW9uX2F1dG9fY29uZmlnIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2F1dG9fbmVnb3RpYXRpb25fYXV0b19jb25maWdfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9hdXRvX25lZ290aWF0aW9uX2F1dG9fY29uZmlnICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2F1dG9fbmVnb3RpYXRpb25fY2FwYWJpbGl0eV9wYWNrKGJjbW9sdF9lcG9uX29hbV9hdXRvX25lZ290aWF0aW9uX2NhcGFiaWxpdHkgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9hdXRvX25lZ290aWF0aW9uX2NhcGFiaWxpdHlfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9hdXRvX25lZ290aWF0aW9uX2NhcGFiaWxpdHkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9hdXRvX3JlbW90ZV9zaWdfcGFjayhiY21vbHRfZXBvbl9vYW1fYXV0b19yZW1vdGVfc2lnIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2F1dG9fcmVtb3RlX3NpZ191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2F1dG9fcmVtb3RlX3NpZyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9hdXRvX3NlbGVjdG9yX3BhY2soYmNtb2x0X2Vwb25fb2FtX2F1dG9fc2VsZWN0b3IgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYXV0b19zZWxlY3Rvcl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2F1dG9fc2VsZWN0b3IgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2ZpZWxkX3NlbGVjdF90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9maWVsZF9zZWxlY3RfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZmllbGRfc2VsZWN0X3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZmllbGRfc2VsZWN0X3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVxdWVzdF9vcHRpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVxdWVzdF9vcHRpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVxdWVzdF9vcHRpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXF1ZXN0X29wdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXN1bHRfY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXN1bHRfY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXN1bHRfY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3Jlc3VsdF9jb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2FubmV4X3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2FubmV4IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2FubmV4X3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfYW5uZXggKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50Zl90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGZfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRmX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRmX3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX3N0YXR1c19wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2Vfc3RhdHVzIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9zdGF0dXNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2Vfc3RhdHVzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVybGVhdmVyX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVybGVhdmVyIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVybGVhdmVyX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJsZWF2ZXIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfbG9hZF9iYWxhbmNlX21ldGhvZF9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19sb2FkX2JhbGFuY2VfbWV0aG9kIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2xvYWRfYmFsYW5jZV9tZXRob2RfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19sb2FkX2JhbGFuY2VfbWV0aG9kICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX21vZHVsYXRpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfbW9kdWxhdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19tb2R1bGF0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfbW9kdWxhdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY191c19tb2R1bGF0aW9uX3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfdXNfbW9kdWxhdGlvbl90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3VzX21vZHVsYXRpb25fdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3VzX21vZHVsYXRpb25fdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY191c19wcm9maWxlX3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfdXNfcHJvZmlsZV90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3VzX3Byb2ZpbGVfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3VzX3Byb2ZpbGVfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9jb25uZWN0aXZpdHlfc3RhdGVfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfY29ubmVjdGl2aXR5X3N0YXRlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X2Nvbm5lY3Rpdml0eV9zdGF0ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X2Nvbm5lY3Rpdml0eV9zdGF0ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9kb2NzaXNfdmVyc2lvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9kb2NzaXNfdmVyc2lvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9kb2NzaXNfdmVyc2lvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X2RvY3Npc192ZXJzaW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X2lwYWRkcl90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X2lwYWRkcl90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X2lwYWRkcl90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfaXBhZGRyX3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X29wY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfb3Bjb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X29wY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9vcGNvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jbG9ja190cmFuc3BvcnRfa2V5X3BhY2soYmNtb2x0X2Vwb25fb2FtX2Nsb2NrX3RyYW5zcG9ydF9rZXkgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY2xvY2tfdHJhbnNwb3J0X2tleV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Nsb2NrX3RyYW5zcG9ydF9rZXkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2FjdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2FjdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2FjdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19lbmFibGVkX3N0YXRlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19lbmFibGVkX3N0YXRlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2VuYWJsZWRfc3RhdGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZW5hYmxlZF9zdGF0ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19hY3RpdmF0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19hY3RpdmF0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2FjdGl2YXRpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfYWN0aXZhdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX21hbmFnZW1lbnRfb2JqZWN0X3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX21hbmFnZW1lbnRfb2JqZWN0IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfbWFuYWdlbWVudF9vYmplY3RfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9tYW5hZ2VtZW50X29iamVjdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfYWxhcm1faWRfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9hbGFybV9pZCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfYWxhcm1faWRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2FsYXJtX2lkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3Bvd2VyX2FsYXJtX2NvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3Bvd2VyX2FsYXJtX2NvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfcG93ZXJfYWxhcm1fY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19wb3dlcl9hbGFybV9jb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3Bvbl9pZl9zd2l0Y2hfY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfcG9uX2lmX3N3aXRjaF9jb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3Bvbl9pZl9zd2l0Y2hfY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19wb25faWZfc3dpdGNoX2NvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hdHRyaWJ1dGVfcGFjayhiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2ZlY19zdXBwb3J0X3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19mZWNfc3VwcG9ydCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19mZWNfc3VwcG9ydF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19mZWNfc3VwcG9ydCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19mZWNfc3RhdGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2ZlY19zdGF0ZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19mZWNfc3RhdGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZmVjX3N0YXRlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2NodXJuaW5nX29wX2NvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2NodXJuaW5nX29wX2NvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2NodXJuaW5nX29wX2NvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfY2h1cm5pbmdfb3BfY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfY2xhc3NpZmljYXRpb25fb3BlcmF0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19jbGFzc2lmaWNhdGlvbl9vcGVyYXRpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2NsYXNzaWZpY2F0aW9uX29wZXJhdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19jbGFzc2lmaWNhdGlvbl9vcGVyYXRpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9hY2tfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9hY2sgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9hY2tfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2FjayAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX29wY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX29wY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2Vfb3Bjb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9vcGNvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2ZsYWdfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9mbGFnIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfZmxhZ191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfZmxhZyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX29wX2NvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9vcF9jb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfb3BfY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfb3BfY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZWFybHlfd2FrZV91cF9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19lYXJseV93YWtlX3VwX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2Vhcmx5X3dha2VfdXBfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19lYXJseV93YWtlX3VwX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2JyYW5jaF9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfYnJhbmNoIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19icmFuY2hfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfYnJhbmNoICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9lcnJvcl9jb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9lcnJvcl9jb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9lcnJvcl9jb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX2Vycm9yX2NvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfb2xkX21hbmFnZW1lbnRfb2JqZWN0X3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX29sZF9tYW5hZ2VtZW50X29iamVjdCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX29sZF9tYW5hZ2VtZW50X29iamVjdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX29sZF9tYW5hZ2VtZW50X29iamVjdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19wb3J0X3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3BvcnRfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfcG9ydF90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3BvcnRfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYXR0cmlidXRlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hdHRyaWJ1dGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYXR0cmlidXRlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfZXh0X2F0dHJpYnV0ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hY3Rpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfZXh0X2FjdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hY3Rpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYWN0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2F0dHJpYnV0ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYXR0cmlidXRlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2F0dHJpYnV0ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hdHRyaWJ1dGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfZW5hYmxlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19lbmFibGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V0aF9wb3J0X3BvbGljaW5nX2VuYWJsZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19lbmFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N1Yl90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdWJfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3ViX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3ViX3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N0YXR1c19wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3RhdHVzIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N0YXR1c191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NsZWVwX2ZsYWdfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zbGVlcF9mbGFnIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2xlZXBfZmxhZ191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2xlZXBfZmxhZyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NsZWVwX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zbGVlcF9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2xlZXBfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2xlZXBfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9wcHBvX2V0ZXN0X3N0YXR1c19wYWNrKGJjbW9sdF9lcG9uX29hbV9wcHBvX2V0ZXN0X3N0YXR1cyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9wcHBvX2V0ZXN0X3N0YXR1c191bnBhY2soYmNtb2x0X2Vwb25fb2FtX3BwcG9fZXRlc3Rfc3RhdHVzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3BwcG9fZXRlc3RfZmFpbF9yZWFzb25fcGFjayhiY21vbHRfZXBvbl9vYW1fcHBwb19ldGVzdF9mYWlsX3JlYXNvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9wcHBvX2V0ZXN0X2ZhaWxfcmVhc29uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fcHBwb19ldGVzdF9mYWlsX3JlYXNvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zdGFydF9vcl9zdG9wX2luZGljYXRpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fc3RhcnRfb3Jfc3RvcF9pbmRpY2F0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3N0YXJ0X29yX3N0b3BfaW5kaWNhdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3N0YXJ0X29yX3N0b3BfaW5kaWNhdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9wcHBvX2VhdXRoX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fcHBwb19lYXV0aF9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3BwcG9fZWF1dGhfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3BwcG9fZWF1dGhfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfc3VwcG9ydGVkX3NlcnZpY2VzX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19zdXBwb3J0ZWRfc2VydmljZXMgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3N1cHBvcnRlZF9zZXJ2aWNlc191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19zdXBwb3J0ZWRfc2VydmljZXMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3NlcnZpY2Vfc2xhX29wZXJhdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfc2VydmljZV9zbGFfb3BlcmF0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19zZXJ2aWNlX3NsYV9vcGVyYXRpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfc2VydmljZV9zbGFfb3BlcmF0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfZGJhX3NjaGVkdWxpbmdfc2NoZW1lX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfZGJhX3NjaGVkdWxpbmdfc2NoZW1lIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfZGJhX3NjaGVkdWxpbmdfc2NoZW1lX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9kYmFfc2NoZWR1bGluZ19zY2hlbWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfcHJvdGVjdGlvbl90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfcHJvdGVjdGlvbl90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfcHJvdGVjdGlvbl90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9wcm90ZWN0aW9uX3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9pbnRlcmZhY2VfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2ludGVyZmFjZV90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9pbnRlcmZhY2VfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfaW50ZXJmYWNlX3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X2dsb2JhbF9wYXJhbXNfd2lkdGhfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX214dV9nbG9iYWxfcGFyYW1zX3dpZHRoIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfZ2xvYmFsX3BhcmFtc193aWR0aF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfZ2xvYmFsX3BhcmFtc193aWR0aCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X3NubXBfcGFyYW1zX3dpZHRoX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfc25tcF9wYXJhbXNfd2lkdGggdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9zbm1wX3BhcmFtc193aWR0aF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfc25tcF9wYXJhbXNfd2lkdGggKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9wb3dlcl9zdXBwbHlfY29udHJvbF90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfcG93ZXJfc3VwcGx5X2NvbnRyb2xfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3Bvd2VyX3N1cHBseV9jb250cm9sX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3Bvd2VyX3N1cHBseV9jb250cm9sX3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9maWVsZF9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfZmllbGQgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX2ZpZWxkX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX2ZpZWxkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcl9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3IgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9vcGVyYXRpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX29wZXJhdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fb3BlcmF0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX29wZXJhdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfdGFnX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF90YWdfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfdGFnX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9zd2l0Y2hfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3N3aXRjaF9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfc3dpdGNoX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3N3aXRjaF9tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9hY3Rpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2FjdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfYWN0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2FjdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192b2lwX3Byb3RvY29sX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y192b2lwX3Byb3RvY29sIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192b2lwX3Byb3RvY29sX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaXBfcHJvdG9jb2wgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX2lwbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfaXBtb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV9pcG1vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfaXBtb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19wcHBvZV9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19wcHBvZV9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19wcHBvZV9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3BwcG9lX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX3RhZ2dpbmdfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfdGFnZ2luZ19tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV90YWdnaW5nX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfdGFnZ2luZ19tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19oMjQ4cmVnX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2gyNDhyZWdfbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfaDI0OHJlZ19tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2gyNDhyZWdfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfaDI0OGhlYXJ0YmVhdF9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19oMjQ4aGVhcnRiZWF0X21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2gyNDhoZWFydGJlYXRfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19oMjQ4aGVhcnRiZWF0X21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3J0cF90aWRfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfcnRwX3RpZF9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ydHBfdGlkX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfcnRwX3RpZF9tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV90Mzhtb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV90Mzhtb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV90Mzhtb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX3QzOG1vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX2ZheF9tb2RlbV9jb250cm9sX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX2ZheF9tb2RlbV9jb250cm9sX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX2ZheF9tb2RlbV9jb250cm9sX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfZmF4X21vZGVtX2NvbnRyb2xfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX29wZXJhdGlvbl9zdGF0dXNfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9vcGVyYXRpb25fc3RhdHVzIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9vcGVyYXRpb25fc3RhdHVzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9vcGVyYXRpb25fc3RhdHVzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9wb3J0X3N0YXR1c19wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX3BvcnRfc3RhdHVzIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9wb3J0X3N0YXR1c191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9zdGF0dXMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX3BvcnRfc2VydmljZV9zdGF0ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX3BvcnRfc2VydmljZV9zdGF0ZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9zZXJ2aWNlX3N0YXRlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9wb3J0X3NlcnZpY2Vfc3RhdGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX3BvcnRfY29kZWNfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX3BvcnRfY29kZWNfbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9jb2RlY19tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9wb3J0X2NvZGVjX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX29wZXJhdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX29wZXJhdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfb3BlcmF0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9vcGVyYXRpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV96dGVfb251X3BvcnRfbWFjX29wZXJhdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV96dGVfb251X3BvcnRfbWFjX29wZXJhdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV96dGVfb251X3BvcnRfbWFjX29wZXJhdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3p0ZV9vbnVfcG9ydF9tYWNfb3BlcmF0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3p0ZV9pc29sYXRlX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fenRlX2lzb2xhdGVfbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV96dGVfaXNvbGF0ZV9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fenRlX2lzb2xhdGVfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV96dGVfYnVmZmVyX21hbmFnZV9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3p0ZV9idWZmZXJfbWFuYWdlX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fenRlX2J1ZmZlcl9tYW5hZ2VfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3p0ZV9idWZmZXJfbWFuYWdlX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fenRlX2RzYnVmX2RpcmVjdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV96dGVfZHNidWZfZGlyZWN0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3p0ZV9kc2J1Zl9kaXJlY3Rpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV96dGVfZHNidWZfZGlyZWN0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3p0ZV9zdGF0aXN0aWNzX2FjdGlvbl9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3p0ZV9zdGF0aXN0aWNzX2FjdGlvbl9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3p0ZV9zdGF0aXN0aWNzX2FjdGlvbl9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fenRlX3N0YXRpc3RpY3NfYWN0aW9uX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fenRlX3N0YXRpc3RpY3NfcmVzZXRfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV96dGVfc3RhdGlzdGljc19yZXNldF9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3p0ZV9zdGF0aXN0aWNzX3Jlc2V0X21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV96dGVfc3RhdGlzdGljc19yZXNldF9tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3VuaV9mbG93X3N0YXRpc3RpY3NfY29sbGVjdF9jb250cm9sX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fdW5pX2Zsb3dfc3RhdGlzdGljc19jb2xsZWN0X2NvbnRyb2xfbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV91bmlfZmxvd19zdGF0aXN0aWNzX2NvbGxlY3RfY29udHJvbF9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdW5pX2Zsb3dfc3RhdGlzdGljc19jb2xsZWN0X2NvbnRyb2xfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9saWdodF9pbmRpY2F0aW9uX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fbGlnaHRfaW5kaWNhdGlvbl9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2xpZ2h0X2luZGljYXRpb25fbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2xpZ2h0X2luZGljYXRpb25fbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tYXRjaF9tYWNfYWRkcmVzc19tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX21hdGNoX21hY19hZGRyZXNzX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWF0Y2hfbWFjX2FkZHJlc3NfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX21hdGNoX21hY19hZGRyZXNzX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fenRlX2xpZ2h0X2NvbnRyb2xfYWN0aW9uX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fenRlX2xpZ2h0X2NvbnRyb2xfYWN0aW9uX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fenRlX2xpZ2h0X2NvbnRyb2xfYWN0aW9uX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV96dGVfbGlnaHRfY29udHJvbF9hY3Rpb25fbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfZXhjbF9hYmlsaXR5X3BhY2soYmNtb2x0X2Vwb25fb2FtX29udV9leGNsX2FiaWxpdHkgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X2V4Y2xfYWJpbGl0eV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29udV9leGNsX2FiaWxpdHkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9lYXJseV93YWtlX2NhcGFiaWxpdHlfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9lYXJseV93YWtlX2NhcGFiaWxpdHkgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9lYXJseV93YWtlX2NhcGFiaWxpdHlfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2Vhcmx5X3dha2VfY2FwYWJpbGl0eSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfcG9ydF9kaXNhYmxlX29uX2xvb3BfZGV0ZWN0ZWRfc3RhdGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3BvcnRfZGlzYWJsZV9vbl9sb29wX2RldGVjdGVkX3N0YXRlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3BvcnRfZGlzYWJsZV9vbl9sb29wX2RldGVjdGVkX3N0YXRlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3BvcnRfZGlzYWJsZV9vbl9sb29wX2RldGVjdGVkX3N0YXRlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX21vbml0b3Jpbmdfc3RhdHVzX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tb25pdG9yaW5nX3N0YXR1cyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tb25pdG9yaW5nX3N0YXR1c191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tb25pdG9yaW5nX3N0YXR1cyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19maWxlX2NoZWNrX29wY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19vcGNvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19vcGNvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19vcGNvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfcnBzX2NvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3Jwc19jb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ycHNfY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ycHNfY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2F1dGhfY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2F1dGhfY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2F1dGhfY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfYXV0aF9jb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpX3BhY2soYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MjQoYnVmLCB1aW50MzJfdF90b191aW50MjRfdCgodWludDMyX3QpIHRoaXMpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpX3VucGFjayhiY21vbHRfZXBvbl9vYW1fd2VsbF9rbm93bl9vdWkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MjRfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UyNChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IHVpbnQyNF90X3RvX3VpbnQzMl90KG51bV92YWwpOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGVfb3BlcmF0b3JfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGVfb3BlcmF0b3IgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGVfb3BlcmF0b3JfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfcnVsZV9vcGVyYXRvciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfZGF0YV90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19zb2Z0d2FyZV9kb3dubG9hZF9kYXRhX3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3NvZnR3YXJlX2Rvd25sb2FkX2RhdGFfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19zb2Z0d2FyZV9kb3dubG9hZF9kYXRhX3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfb3BfY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9vcF9jb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfb3BfY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX29wX2NvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3Jfb3Bjb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9vcGNvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3Jfb3Bjb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX29wY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9hY3RpdmF0ZV9pbWFnZV9mbGFnX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9hY3RpdmF0ZV9pbWFnZV9mbGFnIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9hY3RpdmF0ZV9pbWFnZV9mbGFnX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2FjdGl2YXRlX2ltYWdlX2ZsYWcgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2Fja19wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYWNrIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9hY2tfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYWNrICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0b3B0aWNhbF9wb3dlcl9hbGFybV9zdGF0dXNfcGFjayhiY21vbHRfZXBvbl9vYW1fa3RvcHRpY2FsX3Bvd2VyX2FsYXJtX3N0YXR1cyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdG9wdGljYWxfcG93ZXJfYWxhcm1fc3RhdHVzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fa3RvcHRpY2FsX3Bvd2VyX2FsYXJtX3N0YXR1cyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYWN0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hY3Rpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYWN0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2FjdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vcGNvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29wY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb3Bjb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29wY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdG9udV9ldmVudF90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2t0b251X2V2ZW50X3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2t0b251X2V2ZW50X3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fa3Rsb29wX2RldGVjdF9ldmVudF9wYWNrKGJjbW9sdF9lcG9uX29hbV9rdGxvb3BfZGV0ZWN0X2V2ZW50IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0bG9vcF9kZXRlY3RfZXZlbnRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9rdGxvb3BfZGV0ZWN0X2V2ZW50ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0b3B0aWNhbF9wb3dlcl9hbGFybV9ldmVudF9wYWNrKGJjbW9sdF9lcG9uX29hbV9rdG9wdGljYWxfcG93ZXJfYWxhcm1fZXZlbnQgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fa3RvcHRpY2FsX3Bvd2VyX2FsYXJtX2V2ZW50X3VucGFjayhiY21vbHRfZXBvbl9vYW1fa3RvcHRpY2FsX3Bvd2VyX2FsYXJtX2V2ZW50ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NsYXNzaWZpZXJfY29tbWFuZF9wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jbGFzc2lmaWVyX2NvbW1hbmQgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jbGFzc2lmaWVyX2NvbW1hbmRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jbGFzc2lmaWVyX2NvbW1hbmQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9kaXJlY3Rpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fZGlyZWN0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fZGlyZWN0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fZGlyZWN0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fZmlsdGVyX2ZpZWxkX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2ZpbHRlcl9maWVsZCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2ZpbHRlcl9maWVsZF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2ZpbHRlcl9maWVsZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2ZpbHRlcl9hY3Rpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fZmlsdGVyX2FjdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgKHVpbnQzMl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2ZpbHRlcl9hY3Rpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9maWx0ZXJfYWN0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcHJpX3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fcHJpX3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wcmlfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ByaV90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fb3Bjb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX29wY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX29wY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX29wY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdF9pZF9wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0X2lkIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdF9pZF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRfaWQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kaXJlY3Rpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fZGlyZWN0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2RpcmVjdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2RpcmVjdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kb21haW5fb3B0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2RvbWFpbl9vcHRpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kb21haW5fb3B0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZG9tYWluX29wdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hY3Rpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFmX2FjdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hY3Rpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYWN0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9sb29wYmFja19sb2NhdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2xvb3BiYWNrX2xvY2F0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbG9vcGJhY2tfbG9jYXRpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2xvb3BiYWNrX2xvY2F0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGxpZF9hY3Rpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9sbGlkX2FjdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xsaWRfYWN0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9sbGlkX2FjdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2FsYXJtX2NvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9hbGFybV9jb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYWxhcm1fY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYWxhcm1fY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYXR0cmlidXRlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hdHRyaWJ1dGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYXR0cmlidXRlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFmX2F0dHJpYnV0ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGlua19zdGF0ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2xpbmtfc3RhdGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9saW5rX3N0YXRlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9saW5rX3N0YXRlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhcm5pbmdfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYXJuaW5nX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFybmluZ19tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFybmluZ19tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYnJhbmNoX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYnJhbmNoIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYnJhbmNoX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9icmFuY2ggKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2VuY3J5cHRpb25fbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2VuY3J5cHRpb25fbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2VuY3J5cHRpb25fbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZW5jcnlwdGlvbl9tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3J1bGVfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9ydWxlX3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcnVsZV90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fcnVsZV90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmllbGRfY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpZWxkX2NvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWVsZF9jb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9maWVsZF9jb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3J1bGVfb3BlcmF0b3JfcGFjayhiY21vbHRfZXBvbl9vYW1fcnVsZV9vcGVyYXRvciB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9ydWxlX29wZXJhdG9yX3VucGFjayhiY21vbHRfZXBvbl9vYW1fcnVsZV9vcGVyYXRvciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Jlc3VsdF9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3Jlc3VsdCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Jlc3VsdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmVzdWx0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGF5ZXJfc2VsZWN0X3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGF5ZXJfc2VsZWN0IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGF5ZXJfc2VsZWN0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9sYXllcl9zZWxlY3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdHJhZmZpY19iaXRtYXBfcGFjayhiY21vbHRfZXBvbl9vYW1fdHJhZmZpY19iaXRtYXAgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdHJhZmZpY19iaXRtYXBfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90cmFmZmljX2JpdG1hcCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9yYXRlX3VuaXRzX3BhY2soYmNtb2x0X2Vwb25fb2FtX3JhdGVfdW5pdHMgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcmF0ZV91bml0c191bnBhY2soYmNtb2x0X2Vwb25fb2FtX3JhdGVfdW5pdHMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9mZWNfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZlY19tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmVjX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZlY19tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcG9ydF90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcG9ydF90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcG9ydF90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9wb3J0X3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9pcG1jX2ZvcndhcmRpbmdfZmxhZ3NfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9pcG1jX2ZvcndhcmRpbmdfZmxhZ3MgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2lwbWNfZm9yd2FyZGluZ19mbGFnc191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaXBtY19mb3J3YXJkaW5nX2ZsYWdzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9wb3dlcl9zYXZpbmdfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3Bvd2VyX3NhdmluZ19tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcG93ZXJfc2F2aW5nX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3Bvd2VyX3NhdmluZ19tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXJyb3JfY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2Vycm9yX2NvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9lcnJvcl9jb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9lcnJvcl9jb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9vcGNvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX29wY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfb3Bjb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX29wY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9lcnJvcl9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfZXJyb3IgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Vycm9yX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Vycm9yICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaW5mb190bHZfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2luZm9fdGx2X3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9pbmZvX3Rsdl90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9pbmZvX3Rsdl90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfY3RybF9hY3Rpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9jdHJsX2FjdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X2N0cmxfYWN0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9jdHJsX2FjdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X2N0cmxfcmVzcF9jb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfY3RybF9yZXNwX2NvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9jdHJsX3Jlc3BfY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfY3RybF9yZXNwX2NvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9yZWdfY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X3JlZ19jb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfcmVnX2NvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X3JlZ19jb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3N0ZF9waHlfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9zdGRfcGh5X3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc3RkX3BoeV90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fc3RkX3BoeV90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9zdGF0ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fc3RhdGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fc3RhdGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fc3RhdGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tYXVfbWVkaWFfYXZhaWxhYmxlX3BhY2soYmNtb2x0X2Vwb25fb2FtX21hdV9tZWRpYV9hdmFpbGFibGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWF1X21lZGlhX2F2YWlsYWJsZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX21hdV9tZWRpYV9hdmFpbGFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc3RkX2F1dG9fbmVnb2l0YXRpb25fY2FwYWJpbGl0eV9wYWNrKGJjbW9sdF9lcG9uX29hbV9zdGRfYXV0b19uZWdvaXRhdGlvbl9jYXBhYmlsaXR5IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc3RkX2F1dG9fbmVnb2l0YXRpb25fY2FwYWJpbGl0eV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdXRvX25lZ29pdGF0aW9uX2NhcGFiaWxpdHkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tYWNfZHVwbGV4X3N0YXR1c19wYWNrKGJjbW9sdF9lcG9uX29hbV9tYWNfZHVwbGV4X3N0YXR1cyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tYWNfZHVwbGV4X3N0YXR1c191bnBhY2soYmNtb2x0X2Vwb25fb2FtX21hY19kdXBsZXhfc3RhdHVzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2ZlY19zdXBwb3J0X3BhY2soYmNtb2x0X2Vwb25fb2FtX2ZlY19zdXBwb3J0IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCAodWludDMyX3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZmVjX3N1cHBvcnRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9mZWNfc3VwcG9ydCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3N0ZF9mZWNfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9zdGRfZmVjX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zdGRfZmVjX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9zdGRfZmVjX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX29wY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX29wY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX29wY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb3Bjb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVyc2lvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlcnNpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZXJzaW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV92ZXJzaW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2VhcF9jb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2VhcF9jb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2VhcF9jb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZWFwX2NvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3N1YnR5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX3N1YnR5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3N1YnR5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfc3VidHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfZmxhZ3NfcGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2ZsYWdzIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19mbGFnc191bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19mbGFncyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY29udGVudF90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19jb250ZW50X3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2NvbnRlbnRfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19jb250ZW50X3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZV90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2VfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlX3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9tZXRob2RfcGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX21ldGhvZCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY29tcHJlc3Npb25fbWV0aG9kX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX21ldGhvZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZWFwb2xfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lYXBvbF90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZWFwb2xfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lYXBvbF92ZXJzaW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3ZlcnNpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZWFwb2xfdmVyc2lvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3ZlcnNpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZXBvY19jbWNfc3RhdF9pbmRleF9wYWNrKGJjbW9sdF9lcG9uX29hbV9lcG9jX2NtY19zdGF0X2luZGV4IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Vwb2NfY21jX3N0YXRfaW5kZXhfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9lcG9jX2NtY19zdGF0X2luZGV4ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Vwb2NfY251X3N0YXRfaW5kZXhfcGFjayhiY21vbHRfZXBvbl9vYW1fZXBvY19jbnVfc3RhdF9pbmRleCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lcG9jX2NudV9zdGF0X2luZGV4X3VucGFjayhiY21vbHRfZXBvbl9vYW1fZXBvY19jbnVfc3RhdF9pbmRleCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lcG9jX3NkbTI1MHN0YXRfaW5kZXhfcGFjayhiY21vbHRfZXBvbl9vYW1fZXBvY19zZG0yNTBzdGF0X2luZGV4IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Vwb2Nfc2RtMjUwc3RhdF9pbmRleF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Vwb2Nfc2RtMjUwc3RhdF9pbmRleCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lcG9jX3N0YXRfZ2F0aGVyX21vZGVzX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Vwb2Nfc3RhdF9nYXRoZXJfbW9kZXMgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZXBvY19zdGF0X2dhdGhlcl9tb2Rlc191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Vwb2Nfc3RhdF9nYXRoZXJfbW9kZXMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcHJvdG9jb2xfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9wcm90b2NvbF90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcHJvdG9jb2xfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Byb3RvY29sX3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zbG93X3Byb3RvY29sX3N1YnR5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbF9zdWJ0eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Nsb3dfcHJvdG9jb2xfc3VidHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Nsb3dfcHJvdG9jb2xfc3VidHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fZmxhZ3NfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX2ZsYWdzIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX2ZsYWdzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX2ZsYWdzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX29wY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fb3Bjb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9vcGNvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fb3Bjb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1faW5mb190bHZfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1faW5mb190bHZfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHZfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHZfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHZfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19pbmZvX3Rsdl90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19yZXBvcnRfbW9kZXNfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3JlcG9ydF9tb2RlcyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfcmVwb3J0X21vZGVzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3JlcG9ydF9tb2RlcyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mb19zdGF0ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mb19zdGF0ZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mb19zdGF0ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvX3N0YXRlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvX2NvbmZpZ19wYWNrKGJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mb19jb25maWcgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm9fY29uZmlnX3VucGFjayhiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm9fY29uZmlnICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19hbGFybV9jb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19hbGFybV9jb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19hbGFybV9jb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2FsYXJtX2NvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2FsYXJtX2NvbnRleHRfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2FsYXJtX2NvbnRleHQgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2FsYXJtX2NvbnRleHRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29udGV4dCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV92YXJfYnJhbmNoX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Zhcl9icmFuY2ggdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmFyX2JyYW5jaF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Zhcl9icmFuY2ggKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfb2JqZWN0X3BhY2soYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX29iamVjdCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX29iamVjdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX29iamVjdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX3BhY2thZ2VfcGFjayhiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfcGFja2FnZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX3BhY2thZ2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9wYWNrYWdlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfbmFtZV9iaW5kaW5nX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX25hbWVfYmluZGluZyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX25hbWVfYmluZGluZ191bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX25hbWVfYmluZGluZyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3JlbW90ZV9sb29wYmFja19jb21tYW5kX3BhY2soYmNtb2x0X2Vwb25fb2FtX3JlbW90ZV9sb29wYmFja19jb21tYW5kIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3JlbW90ZV9sb29wYmFja19jb21tYW5kX3VucGFjayhiY21vbHRfZXBvbl9vYW1fcmVtb3RlX2xvb3BiYWNrX2NvbW1hbmQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29wY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfb3Bjb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vcGNvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfb3Bjb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19icmFuY2hfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2JyYW5jaCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfYnJhbmNoX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2JyYW5jaCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZmxvd19kaXJlY3Rpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fZmxvd19kaXJlY3Rpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZmxvd19kaXJlY3Rpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9mbG93X2RpcmVjdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hdHRyaWJ1dGVfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYXR0cmlidXRlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYXR0cmlidXRlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYXR0cmlidXRlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYWN0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2FjdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2FjdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2FjdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9mbGFnc19wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfZmxhZ3MgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2ZsYWdzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2ZsYWdzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9hY3Rpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2FjdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfYWN0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2FjdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X2ZpZWxkX3NlbGVjdF9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X2ZpZWxkX3NlbGVjdCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X2ZpZWxkX3NlbGVjdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfZmllbGRfc2VsZWN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9vcGVyYXRvcl9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfb3BlcmF0b3IgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX29wZXJhdG9yX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX29wZXJhdG9yICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9wc3N0YXRlX3BhY2soYmNtb2x0X2Vwb25fb2FtX29udV9wc3N0YXRlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X3Bzc3RhdGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfcHNzdGF0ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFybl90YWJsZV9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFybl90YWJsZV9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFybl90YWJsZV9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2xlYXJuX3RhYmxlX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3ZsYW5fZGVzdGluYXRpb25fbWF0Y2hfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9tYXRjaF9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX21hdGNoX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9tYXRjaF9tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX2ZsYWdzX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX2ZsYWdzIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX2ZsYWdzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3ZsYW5fZGVzdGluYXRpb25fZmxhZ3MgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2VuY3J5cHRpb25fbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfZW5jcnlwdGlvbl9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19lbmNyeXB0aW9uX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfZW5jcnlwdGlvbl9tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19lbmNyeXB0aW9uX29wdGlvbnNfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2VuY3J5cHRpb25fb3B0aW9ucyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19lbmNyeXB0aW9uX29wdGlvbnNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfZW5jcnlwdGlvbl9vcHRpb25zICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcnVsZV9maWVsZF9zZWxlY3RfcGFjayhiY21vbHRfZXBvbl9vYW1fcnVsZV9maWVsZF9zZWxlY3QgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcnVsZV9maWVsZF9zZWxlY3RfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9ydWxlX2ZpZWxkX3NlbGVjdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9ydWxlX2FjdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9ydWxlX2FjdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9ydWxlX2FjdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3J1bGVfYWN0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19tYXR1cml0eV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfbWF0dXJpdHkgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX21hdHVyaXR5X3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX21hdHVyaXR5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2ZpbGVfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9maWxlX3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZmlsZV90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZmlsZV90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX252c19zdGF0ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9udnNfc3RhdGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbnZzX3N0YXRlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fbnZzX3N0YXRlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJzdWJ0eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJzdWJ0eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJzdWJ0eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnN1YnR5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3JlcG9ydF9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19yZXBvcnRfbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfcmVwb3J0X21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfcmVwb3J0X21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2ZlYXR1cmVfc2V0X3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19mZWF0dXJlX3NldCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgKHVpbnQxNl90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19mZWF0dXJlX3NldF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19mZWF0dXJlX3NldCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX21jYXN0X3Nub29wX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fbWNhc3Rfc25vb3BfbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tY2FzdF9zbm9vcF9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fbWNhc3Rfc25vb3BfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9pcG1jX2dsb2JhbF9vcHRpb25zX3BhY2soYmNtb2x0X2Vwb25fb2FtX2lwbWNfZ2xvYmFsX29wdGlvbnMgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9pcG1jX2dsb2JhbF9vcHRpb25zX3VucGFjayhiY21vbHRfZXBvbl9vYW1faXBtY19nbG9iYWxfb3B0aW9ucyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2ZvcndhcmRfcXVhbGlmaWVyX3BhY2soYmNtb2x0X2Vwb25fb2FtX2ZvcndhcmRfcXVhbGlmaWVyIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2ZvcndhcmRfcXVhbGlmaWVyX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZm9yd2FyZF9xdWFsaWZpZXIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2hvbGRvdmVyX2ZsYWdzX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19ob2xkb3Zlcl9mbGFncyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfaG9sZG92ZXJfZmxhZ3NfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfaG9sZG92ZXJfZmxhZ3MgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWRpX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fbWRpX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWRpX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9tZGlfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9mb3J3YXJkaW5nX3F1YWxpZmVyX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX2ZvcndhcmRpbmdfcXVhbGlmZXIgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9mb3J3YXJkaW5nX3F1YWxpZmVyX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfZm9yd2FyZGluZ19xdWFsaWZlciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQxNl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX29wdGlvbnNfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfc25vb3Bpbmdfb3B0aW9ucyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9zbm9vcGluZ19vcHRpb25zX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfc25vb3Bpbmdfb3B0aW9ucyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zbGVlcF9vcHRpb25zX3BhY2soYmNtb2x0X2Vwb25fb2FtX3NsZWVwX29wdGlvbnMgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsICh1aW50MzJfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zbGVlcF9vcHRpb25zX3VucGFjayhiY21vbHRfZXBvbl9vYW1fc2xlZXBfb3B0aW9ucyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2llZWVfcmVnaXN0ZXJfZmxhZ3NfcGFjayhiY21vbHRfZXBvbl9vYW1faWVlZV9yZWdpc3Rlcl9mbGFncyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9pZWVlX3JlZ2lzdGVyX2ZsYWdzX3VucGFjayhiY21vbHRfZXBvbl9vYW1faWVlZV9yZWdpc3Rlcl9mbGFncyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9pZWVlX3JlZ2lzdGVyX2Fja19mbGFnc19wYWNrKGJjbW9sdF9lcG9uX29hbV9pZWVlX3JlZ2lzdGVyX2Fja19mbGFncyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9pZWVlX3JlZ2lzdGVyX2Fja19mbGFnc191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2llZWVfcmVnaXN0ZXJfYWNrX2ZsYWdzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19maWxlX3RyYW5zZmVyX2Vycm9yX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19maWxlX3RyYW5zZmVyX2Vycm9yIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19maWxlX3RyYW5zZmVyX2Vycm9yX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2ZpbGVfdHJhbnNmZXJfZXJyb3IgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2ZpbGVfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfZmlsZV90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19maWxlX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfZmlsZV90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3BtY19vcF9jb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3BtY19vcF9jb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3BtY19vcF9jb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fcG1jX29wX2NvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfb3BfcGFjayhiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfb3AgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9vcF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX29wICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcG1jX2Vycm9yX2NvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fcG1jX2Vycm9yX2NvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsICh1aW50MTZfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9wbWNfZXJyb3JfY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3BtY19lcnJvcl9jb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9wcm90b2NvbF9wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3Byb3RvY29sIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9wcm90b2NvbF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcHJvdG9jb2wgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3BpbmdfZmxhZ3NfcGFjayhiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9waW5nX2ZsYWdzIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9waW5nX2ZsYWdzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9waW5nX2ZsYWdzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2VuZF9wb2ludF90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9lbmRfcG9pbnRfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfZW5kX3BvaW50X3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfZW5kX3BvaW50X3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tdW5pY2F0aW9uX3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tdW5pY2F0aW9uX3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tdW5pY2F0aW9uX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW11bmljYXRpb25fdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmRfaWRfcGFjayhiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kX2lkIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCAodWludDE2X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kX2lkX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kX2lkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb190eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdmVyc2lvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdmVyc2lvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdmVyc2lvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y192ZXJzaW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcmVzcG9uc2VfY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3Jlc3BvbnNlX2NvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9yZXNwb25zZV9jb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9yZXNwb25zZV9jb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9zdGF0ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfc3RhdGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X3N0YXRlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb251X3N0YXRlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX21kaV9jcm9zc292ZXJfcGFjayhiY21vbHRfZXBvbl9vYW1fbWRpX2Nyb3Nzb3ZlciB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tZGlfY3Jvc3NvdmVyX3VucGFjayhiY21vbHRfZXBvbl9vYW1fbWRpX2Nyb3Nzb3ZlciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgbnVtX3ZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZudW1fdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqdGhpcyA9IG51bV92YWw7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zZG1fc3RhdF9wYWNrKGJjbW9sdF9lcG9uX29hbV9zZG1fc3RhdCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAodWludDhfdCkgdGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zZG1fc3RhdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3NkbV9zdGF0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19oYXNoX2FsZ29yaXRobV9wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfaGFzaF9hbGdvcml0aG0gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKHVpbnQ4X3QpIHRoaXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2hhc2hfYWxnb3JpdGhtX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2hhc2hfYWxnb3JpdGhtICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBudW1fdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJm51bV92YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICp0aGlzID0gbnVtX3ZhbDsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYWxnb3JpdGhtX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYWxnb3JpdGhtIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSB0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYWxnb3JpdGhtX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbGdvcml0aG0gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IG51bV92YWw7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbnVtX3ZhbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKnRoaXMgPSBudW1fdmFsOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X2N2aWRfcGFjayhiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X2N2aWQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+Y3ZpZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfY3ZpZF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9jdmlkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmN2aWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X2N2aWRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9tYWNfcGFjayhiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X21hYyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5zd2l0Y2hpbmdfZG9tYWluKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT5tYWMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmxpbmtfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X21hY191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9tYWMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+c3dpdGNoaW5nX2RvbWFpbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+bWFjKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5saW5rX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9tYWNfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA5KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9wcm9ncmFtbWFibGVfcGFjayhiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3Byb2dyYW1tYWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5wcm9ncmFtbWFibGVfZmllbGQwKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+cHJvZ3JhbW1hYmxlX2ZpZWxkMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfcHJvZ3JhbW1hYmxlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3Byb2dyYW1tYWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5wcm9ncmFtbWFibGVfZmllbGQwKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+cHJvZ3JhbW1hYmxlX2ZpZWxkMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfcHJvZ3JhbW1hYmxlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgOCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfc3NtX2lwX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9zc21faXAgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+c3dpdGNoaW5nX2RvbWFpbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnNzbV9zb3VyY2VfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9pcHY0X2FkZHJlc3MoYnVmLCB0aGlzLT5pcGFkZHJlc3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3NzbV9pcF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9zc21faXAgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+c3dpdGNoaW5nX2RvbWFpbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnNzbV9zb3VyY2VfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2lwdjRfYWRkcmVzcyhidWYsICZ0aGlzLT5pcGFkZHJlc3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3NzbV9pcF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3N2bGFuX3BsdXNfY3ZsYW5fcGFjayhiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3N2bGFuX3BsdXNfY3ZsYW4gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+c3ZpZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmN2aWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3N2bGFuX3BsdXNfY3ZsYW5fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfc3ZsYW5fcGx1c19jdmxhbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5zdmlkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+Y3ZpZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfc3ZsYW5fcGx1c19jdmxhbl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX29wdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfb3B0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+Y2hhbm5lbF9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVxdWVzdF9vcHRpb25fcGFjayh0aGlzLT5vcHRpb25fY29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9vcHRpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfb3B0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+Y2hhbm5lbF9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVxdWVzdF9vcHRpb25fdW5wYWNrKCZ0aGlzLT5vcHRpb25fY29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9vcHRpb25fc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9yZXN1bHRfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmNoYW5uZWxfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3Jlc3VsdF9jb2RlX3BhY2sodGhpcy0+cmVzdWx0X2NvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfcmVzdWx0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmNoYW5uZWxfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3Jlc3VsdF9jb2RlX3VucGFjaygmdGhpcy0+cmVzdWx0X2NvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfcmVzdWx0X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19jbGFzc2lmaWVyX2NvbmZpZ19kYXRhX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2NsYXNzaWZpZXJfY29uZmlnX2RhdGEgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+c3ZjX2Zsb3dfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5jbGFzc2lmaWVyX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5kaXJlY3Rpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnN0YXRlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+cHJpb3JpdHkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmlwdG9zX2xvdykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+aXB0b3NfaGlnaCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+aXB0b3NfbWFzaykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmlwcHJvdG8pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmlwYWRkcl90eXBlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5pcHNyY19hZGRyX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5pcHNyY19hZGRyX2xlbmd0aCA+IDApICYmICh0aGlzLT5pcHNyY19hZGRyID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImlwc3JjX2FkZHJcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfY2xhc3NpZmllcl9jb25maWdfZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT5pcHNyY19hZGRyLCB0aGlzLT5pcHNyY19hZGRyX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+aXBzcmNfbWFza19sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+aXBzcmNfbWFza19sZW5ndGggPiAwKSAmJiAodGhpcy0+aXBzcmNfbWFzayA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJpcHNyY19tYXNrXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2NsYXNzaWZpZXJfY29uZmlnX2RhdGFcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+aXBzcmNfbWFzaywgdGhpcy0+aXBzcmNfbWFza19sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmlwZHN0X2FkZHJfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmlwZHN0X2FkZHJfbGVuZ3RoID4gMCkgJiYgKHRoaXMtPmlwZHN0X2FkZHIgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiaXBkc3RfYWRkclwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19jbGFzc2lmaWVyX2NvbmZpZ19kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPmlwZHN0X2FkZHIsIHRoaXMtPmlwZHN0X2FkZHJfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5pcGRzdF9tYXNrX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5pcGRzdF9tYXNrX2xlbmd0aCA+IDApICYmICh0aGlzLT5pcGRzdF9tYXNrID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImlwZHN0X21hc2tcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfY2xhc3NpZmllcl9jb25maWdfZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT5pcGRzdF9tYXNrLCB0aGlzLT5pcGRzdF9tYXNrX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnNyY19wb3J0X3N0YXJ0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+c3JjX3BvcnRfZW5kKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+ZHN0X3BvcnRfc3RhcnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5kc3RfcG9ydF9lbmQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPmRzdF9tYWNfYWRkcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+ZHN0X21hY19tYXNrKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT5zcmNfbWFjX2FkZHIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmwycHJvdG9fdHlwZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmwycHJvdG9fdmFsdWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51c2VyX3ByaW9yaXR5X2xvdykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnVzZXJfcHJpb3JpdHlfaGlnaCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnZsYW5faWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MjQoYnVmLCB0aGlzLT5iaXRtYXApKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5mbG93X2xhYmVsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+Y21pbSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnBrdF9tYXRjaGVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19jbGFzc2lmaWVyX2NvbmZpZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19jbGFzc2lmaWVyX2NvbmZpZ19kYXRhICp0aGlzKQoreworICAgIHJldHVybiA5NiArIHRoaXMtPmlwc3JjX2FkZHJfbGVuZ3RoICsgdGhpcy0+aXBzcmNfbWFza19sZW5ndGggKyB0aGlzLT5pcGRzdF9hZGRyX2xlbmd0aCArIHRoaXMtPmlwZHN0X21hc2tfbGVuZ3RoOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfY2xhc3NpZmllcl9jb25maWdfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2NsYXNzaWZpZXJfY29uZmlnX2RhdGEgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+c3ZjX2Zsb3dfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5jbGFzc2lmaWVyX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5kaXJlY3Rpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnN0YXRlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+cHJpb3JpdHkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmlwdG9zX2xvdykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+aXB0b3NfaGlnaCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+aXB0b3NfbWFzaykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmlwcHJvdG8pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmlwYWRkcl90eXBlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5pcHNyY19hZGRyX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5pcHNyY19hZGRyX2xlbmd0aCA+IDApICYmICh0aGlzLT5pcHNyY19hZGRyID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiaXBzcmNfYWRkclwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19jbGFzc2lmaWVyX2NvbmZpZ19kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPmlwc3JjX2FkZHIgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+aXBzcmNfYWRkcl9sZW5ndGggKiBzaXplb2YodWludDhfdCkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT5pcHNyY19hZGRyLCB0aGlzLT5pcHNyY19hZGRyX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+aXBzcmNfbWFza19sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+aXBzcmNfbWFza19sZW5ndGggPiAwKSAmJiAodGhpcy0+aXBzcmNfbWFzayA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImlwc3JjX21hc2tcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfY2xhc3NpZmllcl9jb25maWdfZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT5pcHNyY19tYXNrID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPmlwc3JjX21hc2tfbGVuZ3RoICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+aXBzcmNfbWFzaywgdGhpcy0+aXBzcmNfbWFza19sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmlwZHN0X2FkZHJfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmlwZHN0X2FkZHJfbGVuZ3RoID4gMCkgJiYgKHRoaXMtPmlwZHN0X2FkZHIgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJpcGRzdF9hZGRyXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2NsYXNzaWZpZXJfY29uZmlnX2RhdGFcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+aXBkc3RfYWRkciA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5pcGRzdF9hZGRyX2xlbmd0aCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPmlwZHN0X2FkZHIsIHRoaXMtPmlwZHN0X2FkZHJfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5pcGRzdF9tYXNrX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5pcGRzdF9tYXNrX2xlbmd0aCA+IDApICYmICh0aGlzLT5pcGRzdF9tYXNrID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiaXBkc3RfbWFza1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19jbGFzc2lmaWVyX2NvbmZpZ19kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPmlwZHN0X21hc2sgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+aXBkc3RfbWFza19sZW5ndGggKiBzaXplb2YodWludDhfdCkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT5pcGRzdF9tYXNrLCB0aGlzLT5pcGRzdF9tYXNrX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnNyY19wb3J0X3N0YXJ0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+c3JjX3BvcnRfZW5kKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+ZHN0X3BvcnRfc3RhcnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5kc3RfcG9ydF9lbmQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX21hY19hZGRyZXNzKGJ1ZiwgJnRoaXMtPmRzdF9tYWNfYWRkcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+ZHN0X21hY19tYXNrKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9tYWNfYWRkcmVzcyhidWYsICZ0aGlzLT5zcmNfbWFjX2FkZHIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmwycHJvdG9fdHlwZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmwycHJvdG9fdmFsdWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT51c2VyX3ByaW9yaXR5X2xvdykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnVzZXJfcHJpb3JpdHlfaGlnaCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnZsYW5faWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UyNChidWYsICZ0aGlzLT5iaXRtYXApKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5mbG93X2xhYmVsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+Y21pbSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnBrdF9tYXRjaGVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2NsYXNzaWZpZXJfY29uZmlnX2RhdGFfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBpcHNyY19hZGRyX2xlbmd0aDsKKyAgICB1aW50OF90IGlwc3JjX21hc2tfbGVuZ3RoOworICAgIHVpbnQ4X3QgaXBkc3RfYWRkcl9sZW5ndGg7CisgICAgdWludDhfdCBpcGRzdF9tYXNrX2xlbmd0aDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmlwc3JjX2FkZHJfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogaXBzcmNfYWRkcl9sZW5ndGgpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgaXBzcmNfYWRkcl9sZW5ndGggKiAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZpcHNyY19tYXNrX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50OF90KSAqIGlwc3JjX21hc2tfbGVuZ3RoKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGlwc3JjX21hc2tfbGVuZ3RoICogMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmaXBkc3RfYWRkcl9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiBpcGRzdF9hZGRyX2xlbmd0aCk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBpcGRzdF9hZGRyX2xlbmd0aCAqIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmlwZHN0X21hc2tfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogaXBkc3RfbWFza19sZW5ndGgpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgaXBkc3RfbWFza19sZW5ndGggKiAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA2KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX2RhdGFfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX2RhdGEgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+aW50Zl9pbmRleCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+aW50Zl9kZXNjcmlwdGlvbl9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+aW50Zl9kZXNjcmlwdGlvbl9sZW5ndGggPiAwKSAmJiAodGhpcy0+aW50Zl9kZXNjcmlwdGlvbiA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJpbnRmX2Rlc2NyaXB0aW9uXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPmludGZfZGVzY3JpcHRpb24sIHRoaXMtPmludGZfZGVzY3JpcHRpb25fbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRmX3R5cGVfcGFjayh0aGlzLT5pbnRmX3R5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+aW50Zl9waHlfYWRkcl9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+aW50Zl9waHlfYWRkcl9sZW5ndGggPiAwKSAmJiAodGhpcy0+aW50Zl9waHlfYWRkciA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJpbnRmX3BoeV9hZGRyXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPmludGZfcGh5X2FkZHIsIHRoaXMtPmludGZfcGh5X2FkZHJfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5pbnRmX2FsaWFzX25hbWVfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmludGZfYWxpYXNfbmFtZV9sZW5ndGggPiAwKSAmJiAodGhpcy0+aW50Zl9hbGlhc19uYW1lID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImludGZfYWxpYXNfbmFtZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2VfZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT5pbnRmX2FsaWFzX25hbWUsIHRoaXMtPmludGZfYWxpYXNfbmFtZV9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2VfZGF0YSAqdGhpcykKK3sKKyAgICByZXR1cm4gNiArIHRoaXMtPmludGZfZGVzY3JpcHRpb25fbGVuZ3RoICsgdGhpcy0+aW50Zl9waHlfYWRkcl9sZW5ndGggKyB0aGlzLT5pbnRmX2FsaWFzX25hbWVfbGVuZ3RoOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2VfZGF0YSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5pbnRmX2luZGV4KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5pbnRmX2Rlc2NyaXB0aW9uX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5pbnRmX2Rlc2NyaXB0aW9uX2xlbmd0aCA+IDApICYmICh0aGlzLT5pbnRmX2Rlc2NyaXB0aW9uID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiaW50Zl9kZXNjcmlwdGlvblwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2VfZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT5pbnRmX2Rlc2NyaXB0aW9uID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPmludGZfZGVzY3JpcHRpb25fbGVuZ3RoICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+aW50Zl9kZXNjcmlwdGlvbiwgdGhpcy0+aW50Zl9kZXNjcmlwdGlvbl9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGZfdHlwZV91bnBhY2soJnRoaXMtPmludGZfdHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5pbnRmX3BoeV9hZGRyX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5pbnRmX3BoeV9hZGRyX2xlbmd0aCA+IDApICYmICh0aGlzLT5pbnRmX3BoeV9hZGRyID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiaW50Zl9waHlfYWRkclwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2VfZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT5pbnRmX3BoeV9hZGRyID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPmludGZfcGh5X2FkZHJfbGVuZ3RoICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+aW50Zl9waHlfYWRkciwgdGhpcy0+aW50Zl9waHlfYWRkcl9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmludGZfYWxpYXNfbmFtZV9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+aW50Zl9hbGlhc19uYW1lX2xlbmd0aCA+IDApICYmICh0aGlzLT5pbnRmX2FsaWFzX25hbWUgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJpbnRmX2FsaWFzX25hbWVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX2RhdGFcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+aW50Zl9hbGlhc19uYW1lID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPmludGZfYWxpYXNfbmFtZV9sZW5ndGggKiBzaXplb2YodWludDhfdCkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT5pbnRmX2FsaWFzX25hbWUsIHRoaXMtPmludGZfYWxpYXNfbmFtZV9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX2RhdGFfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBpbnRmX2Rlc2NyaXB0aW9uX2xlbmd0aDsKKyAgICB1aW50OF90IGludGZfcGh5X2FkZHJfbGVuZ3RoOworICAgIHVpbnQ4X3QgaW50Zl9hbGlhc19uYW1lX2xlbmd0aDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmludGZfZGVzY3JpcHRpb25fbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogaW50Zl9kZXNjcmlwdGlvbl9sZW5ndGgpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgaW50Zl9kZXNjcmlwdGlvbl9sZW5ndGggKiAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmludGZfcGh5X2FkZHJfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogaW50Zl9waHlfYWRkcl9sZW5ndGgpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgaW50Zl9waHlfYWRkcl9sZW5ndGggKiAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZpbnRmX2FsaWFzX25hbWVfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogaW50Zl9hbGlhc19uYW1lX2xlbmd0aCk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBpbnRmX2FsaWFzX25hbWVfbGVuZ3RoICogMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRmX3N0YXRzX2RhdGFfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50Zl9zdGF0c19kYXRhICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmlmX2luZGV4KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+aWZfbXR1KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+aWZfc3BlZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9zdGF0dXNfcGFjayh0aGlzLT5pZl9hZG1pbl9zdGF0dXMsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX3N0YXR1c19wYWNrKHRoaXMtPmlmX29wZXJfc3RhdHVzLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5pZl9sYXN0X2NoYW5nZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmlmX2hjaW5fb2N0ZXRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+aWZfaGNpbl91Y2FzdF9wa3RzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+aWZfaGNpbl9tdWx0aWNhc3RfcGt0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmlmX2hjaW5fYnJvYWRjYXN0X3BrdHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5pZl9pbl9kaXNjYXJkcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmlmX2luX2Vycm9ycykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmlmX2luX3Vua25vd25fcHJvdG9zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+aWZfaGNvdXRfb2N0ZXRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+aWZfaGNvdXRfdWNhc3RfcGt0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmlmX2hjb3V0X211bHRpY2FzdF9wa3RzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+aWZfaGNvdXRfYnJvYWRjYXN0X3BrdHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5pZl9vdXRfZGlzY2FyZHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5pZl9vdXRfZXJyb3JzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5pZl9saW5rX3VwX2Rvd25fdHJhcF9lbmFibGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmlmX3Byb21pc2N1b3VzX21vZGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmlmX2Nvbm5lY3Rvcl9wcmVzZW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+aWZfY291bnRlcl9kaXNjb250aW51aXR5X3RpbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50Zl9zdGF0c19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50Zl9zdGF0c19kYXRhICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmlmX2luZGV4KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+aWZfbXR1KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+aWZfc3BlZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5pZl9hZG1pbl9zdGF0dXMsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX3N0YXR1c191bnBhY2soJnRoaXMtPmlmX29wZXJfc3RhdHVzLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5pZl9sYXN0X2NoYW5nZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmlmX2hjaW5fb2N0ZXRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+aWZfaGNpbl91Y2FzdF9wa3RzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+aWZfaGNpbl9tdWx0aWNhc3RfcGt0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmlmX2hjaW5fYnJvYWRjYXN0X3BrdHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5pZl9pbl9kaXNjYXJkcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmlmX2luX2Vycm9ycykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmlmX2luX3Vua25vd25fcHJvdG9zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+aWZfaGNvdXRfb2N0ZXRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+aWZfaGNvdXRfdWNhc3RfcGt0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmlmX2hjb3V0X211bHRpY2FzdF9wa3RzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+aWZfaGNvdXRfYnJvYWRjYXN0X3BrdHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5pZl9vdXRfZGlzY2FyZHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5pZl9vdXRfZXJyb3JzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5pZl9saW5rX3VwX2Rvd25fdHJhcF9lbmFibGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmlmX3Byb21pc2N1b3VzX21vZGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmlmX2Nvbm5lY3Rvcl9wcmVzZW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+aWZfY291bnRlcl9kaXNjb250aW51aXR5X3RpbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50Zl9zdGF0c19kYXRhX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTA1KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX2NvbmZpZ19kYXRhX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX2NvbmZpZ19kYXRhICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnN2Y19mbG93X2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+c2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5kaXJlY3Rpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmZsb3dfdHlwZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cW9zX3R5cGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5jaGFubmVsX3NldF9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UyNChidWYsIHRoaXMtPmRzaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPm1heF9yZXF1ZXN0c19wZXJfc2lkX2NsdXN0ZXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5tYXhfYnl0ZXNfcGVyX3NpZF9jbHVzdGVyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dG90YWxfYnl0ZXNfcGVyX3NpZF9jbHVzdGVyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bWF4X3RpbWVfcGVyX3NpZF9jbHVzdGVyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5zZXJ2aWNlX2NsYXNzX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5zZXJ2aWNlX2NsYXNzX2xlbmd0aCA+IDApICYmICh0aGlzLT5zZXJ2aWNlX2NsYXNzID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInNlcnZpY2VfY2xhc3NcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2ZfY29uZmlnX2RhdGFcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+c2VydmljZV9jbGFzcywgdGhpcy0+c2VydmljZV9jbGFzc19sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnByaW9yaXR5KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5yZXNlcV9kc2lkX3N1cHBvcnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5tYXhfcmF0ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPm1heF9idXJzdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPm1pbl9yYXRlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bWluX3BrdF9zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+YWN0aXZlX3RpbWVvdXQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5hZG1pdHRlZF90aW1lb3V0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bWF4X2NvbmNhdF9idXJzdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+c2NoZWR1bGluZ190eXBlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+bm9tX3BvbGxfaW50dmwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT50b2xfcG9sbF9qaXR0ZXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51bnNvbF9ncmFudF9zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+bm9tX2dyYW50X2ludHZsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dG9sX2dyYW50X2ppdHRlcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dG9zX2FuZF9tYXNrX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT50b3NfYW5kX21hc2tfbGVuZ3RoID4gMCkgJiYgKHRoaXMtPnRvc19hbmRfbWFzayA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ0b3NfYW5kX21hc2tcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2ZfY29uZmlnX2RhdGFcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dG9zX2FuZF9tYXNrLCB0aGlzLT50b3NfYW5kX21hc2tfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT50b3Nfb3JfbWFza19sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+dG9zX29yX21hc2tfbGVuZ3RoID4gMCkgJiYgKHRoaXMtPnRvc19vcl9tYXNrID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInRvc19vcl9tYXNrXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX2NvbmZpZ19kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnRvc19vcl9tYXNrLCB0aGlzLT50b3Nfb3JfbWFza19sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5tYXhfbGF0ZW5jeSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cmVxX3RyYW5zX3BvbGljeV9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+cmVxX3RyYW5zX3BvbGljeV9sZW5ndGggPiAwKSAmJiAodGhpcy0+cmVxX3RyYW5zX3BvbGljeSA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJyZXFfdHJhbnNfcG9saWN5XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX2NvbmZpZ19kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnJlcV90cmFuc19wb2xpY3ksIHRoaXMtPnJlcV90cmFuc19wb2xpY3lfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+Yml0bWFwKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+cmVxZF9hdHRyaWJfbWFzaykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmZvcmJpZF9hdHRyaWJfbWFzaykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmF0dHJpYl9hZ2dyX21hc2spKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmF0dHJpYl9tYXNrX3N1Y2Nlc3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmFwcGxpY2F0aW9uX2lkbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmFwcGxpY2F0aW9uX2lkbGVuZ3RoID4gMCkgJiYgKHRoaXMtPmFwcGxpY2F0aW9uX2lkID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImFwcGxpY2F0aW9uX2lkXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX2NvbmZpZ19kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPmFwcGxpY2F0aW9uX2lkLCB0aGlzLT5hcHBsaWNhdGlvbl9pZGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+Y29udF9yZXFfd2luZG93X211bHRpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5id19yZXFfbXVsdGkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5wZWFrX3JhdGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5jcmVhdGVfdGltZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2ZfY29uZmlnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX2NvbmZpZ19kYXRhICp0aGlzKQoreworICAgIHJldHVybiAxMDQgKyB0aGlzLT5zZXJ2aWNlX2NsYXNzX2xlbmd0aCArIHRoaXMtPnRvc19hbmRfbWFza19sZW5ndGggKyB0aGlzLT50b3Nfb3JfbWFza19sZW5ndGggKyB0aGlzLT5yZXFfdHJhbnNfcG9saWN5X2xlbmd0aCArIHRoaXMtPmFwcGxpY2F0aW9uX2lkbGVuZ3RoOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2ZfY29uZmlnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9jb25maWdfZGF0YSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5zdmNfZmxvd19pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnNpZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+ZGlyZWN0aW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5mbG93X3R5cGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnFvc190eXBlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+Y2hhbm5lbF9zZXRfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UyNChidWYsICZ0aGlzLT5kc2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5tYXhfcmVxdWVzdHNfcGVyX3NpZF9jbHVzdGVyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+bWF4X2J5dGVzX3Blcl9zaWRfY2x1c3RlcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnRvdGFsX2J5dGVzX3Blcl9zaWRfY2x1c3RlcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPm1heF90aW1lX3Blcl9zaWRfY2x1c3RlcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+c2VydmljZV9jbGFzc19sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+c2VydmljZV9jbGFzc19sZW5ndGggPiAwKSAmJiAodGhpcy0+c2VydmljZV9jbGFzcyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInNlcnZpY2VfY2xhc3NcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2ZfY29uZmlnX2RhdGFcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+c2VydmljZV9jbGFzcyA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5zZXJ2aWNlX2NsYXNzX2xlbmd0aCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnNlcnZpY2VfY2xhc3MsIHRoaXMtPnNlcnZpY2VfY2xhc3NfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5wcmlvcml0eSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+cmVzZXFfZHNpZF9zdXBwb3J0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+bWF4X3JhdGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5tYXhfYnVyc3QpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5taW5fcmF0ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPm1pbl9wa3Rfc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmFjdGl2ZV90aW1lb3V0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+YWRtaXR0ZWRfdGltZW91dCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPm1heF9jb25jYXRfYnVyc3QpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnNjaGVkdWxpbmdfdHlwZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPm5vbV9wb2xsX2ludHZsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dG9sX3BvbGxfaml0dGVyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dW5zb2xfZ3JhbnRfc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPm5vbV9ncmFudF9pbnR2bCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnRvbF9ncmFudF9qaXR0ZXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnRvc19hbmRfbWFza19sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+dG9zX2FuZF9tYXNrX2xlbmd0aCA+IDApICYmICh0aGlzLT50b3NfYW5kX21hc2sgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ0b3NfYW5kX21hc2tcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2ZfY29uZmlnX2RhdGFcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+dG9zX2FuZF9tYXNrID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnRvc19hbmRfbWFza19sZW5ndGggKiBzaXplb2YodWludDhfdCkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT50b3NfYW5kX21hc2ssIHRoaXMtPnRvc19hbmRfbWFza19sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnRvc19vcl9tYXNrX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT50b3Nfb3JfbWFza19sZW5ndGggPiAwKSAmJiAodGhpcy0+dG9zX29yX21hc2sgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ0b3Nfb3JfbWFza1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9jb25maWdfZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT50b3Nfb3JfbWFzayA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT50b3Nfb3JfbWFza19sZW5ndGggKiBzaXplb2YodWludDhfdCkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT50b3Nfb3JfbWFzaywgdGhpcy0+dG9zX29yX21hc2tfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+bWF4X2xhdGVuY3kpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnJlcV90cmFuc19wb2xpY3lfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPnJlcV90cmFuc19wb2xpY3lfbGVuZ3RoID4gMCkgJiYgKHRoaXMtPnJlcV90cmFuc19wb2xpY3kgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJyZXFfdHJhbnNfcG9saWN5XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX2NvbmZpZ19kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnJlcV90cmFuc19wb2xpY3kgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+cmVxX3RyYW5zX3BvbGljeV9sZW5ndGggKiBzaXplb2YodWludDhfdCkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT5yZXFfdHJhbnNfcG9saWN5LCB0aGlzLT5yZXFfdHJhbnNfcG9saWN5X2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmJpdG1hcCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnJlcWRfYXR0cmliX21hc2spKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5mb3JiaWRfYXR0cmliX21hc2spKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5hdHRyaWJfYWdncl9tYXNrKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5hdHRyaWJfbWFza19zdWNjZXNzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5hcHBsaWNhdGlvbl9pZGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5hcHBsaWNhdGlvbl9pZGxlbmd0aCA+IDApICYmICh0aGlzLT5hcHBsaWNhdGlvbl9pZCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImFwcGxpY2F0aW9uX2lkXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX2NvbmZpZ19kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPmFwcGxpY2F0aW9uX2lkID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPmFwcGxpY2F0aW9uX2lkbGVuZ3RoICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+YXBwbGljYXRpb25faWQsIHRoaXMtPmFwcGxpY2F0aW9uX2lkbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5jb250X3JlcV93aW5kb3dfbXVsdGkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmJ3X3JlcV9tdWx0aSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnBlYWtfcmF0ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmNyZWF0ZV90aW1lKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX2NvbmZpZ19kYXRhX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3Qgc2VydmljZV9jbGFzc19sZW5ndGg7CisgICAgdWludDhfdCB0b3NfYW5kX21hc2tfbGVuZ3RoOworICAgIHVpbnQ4X3QgdG9zX29yX21hc2tfbGVuZ3RoOworICAgIHVpbnQ4X3QgcmVxX3RyYW5zX3BvbGljeV9sZW5ndGg7CisgICAgdWludDhfdCBhcHBsaWNhdGlvbl9pZGxlbmd0aDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmc2VydmljZV9jbGFzc19sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiBzZXJ2aWNlX2NsYXNzX2xlbmd0aCk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBzZXJ2aWNlX2NsYXNzX2xlbmd0aCAqIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJnRvc19hbmRfbWFza19sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiB0b3NfYW5kX21hc2tfbGVuZ3RoKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIHRvc19hbmRfbWFza19sZW5ndGggKiAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZ0b3Nfb3JfbWFza19sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiB0b3Nfb3JfbWFza19sZW5ndGgpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgdG9zX29yX21hc2tfbGVuZ3RoICogMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZyZXFfdHJhbnNfcG9saWN5X2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50OF90KSAqIHJlcV90cmFuc19wb2xpY3lfbGVuZ3RoKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIHJlcV90cmFuc19wb2xpY3lfbGVuZ3RoICogMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmFwcGxpY2F0aW9uX2lkbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogYXBwbGljYXRpb25faWRsZW5ndGgpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgYXBwbGljYXRpb25faWRsZW5ndGggKiAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2Zfc3RhdHNfZGF0YV9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9zdGF0c19kYXRhICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnN2Y19mbG93X2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dG90YWxfcGt0X2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dG90YWxfYnl0ZV9jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmFjdGl2ZV90aW1lKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+aW52YWxpZF9waHNfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5wa3RzX2Ryb3BwZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5wa3RzX2RlbGF5ZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2Zfc3RhdHNfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX3N0YXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+c3ZjX2Zsb3dfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50b3RhbF9wa3RfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT50b3RhbF9ieXRlX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+YWN0aXZlX3RpbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5pbnZhbGlkX3Boc19jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnBrdHNfZHJvcHBlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnBrdHNfZGVsYXllZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9zdGF0c19kYXRhX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMzYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfbWFjX2FkZHJfcmFuZ2VfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfbWFjX2FkZHJfcmFuZ2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT5jbnVfbWFjX2FkZHJlc3Nfc3RhcnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPmNudV9tYWNfYWRkcmVzc19lbmQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfbWFjX2FkZHJfcmFuZ2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9tYWNfYWRkcl9yYW5nZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX21hY19hZGRyZXNzKGJ1ZiwgJnRoaXMtPmNudV9tYWNfYWRkcmVzc19zdGFydCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+Y251X21hY19hZGRyZXNzX2VuZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9tYWNfYWRkcl9yYW5nZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3VzX2NoYW5fZGF0YV9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV91c19jaGFuX2RhdGEgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5jaGFubmVsX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+cG93ZXJfbGV2ZWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5oaWdoX3Jlc190aW1pbmdfb2Zmc2V0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5lcXVhbGl6YXRpb25fZGF0YV9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+ZXF1YWxpemF0aW9uX2RhdGFfbGVuZ3RoID4gMCkgJiYgKHRoaXMtPmVxdWFsaXphdGlvbl9kYXRhID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImVxdWFsaXphdGlvbl9kYXRhXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3VzX2NoYW5fZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT5lcXVhbGl6YXRpb25fZGF0YSwgdGhpcy0+ZXF1YWxpemF0aW9uX2RhdGFfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dW5lcnJvcmVkcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmNvcnJlY3RlZHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51bmNvcnJlY3RhYmxlcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnNucikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bWljcm9fcmVmbGVjdGlvbnMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3VzX2NoYW5fZGF0YV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfdXNfY2hhbl9kYXRhICp0aGlzKQoreworICAgIHJldHVybiAzNyArIHRoaXMtPmVxdWFsaXphdGlvbl9kYXRhX2xlbmd0aDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3VzX2NoYW5fZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3VzX2NoYW5fZGF0YSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmNoYW5uZWxfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5wb3dlcl9sZXZlbCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmhpZ2hfcmVzX3RpbWluZ19vZmZzZXQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmVxdWFsaXphdGlvbl9kYXRhX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5lcXVhbGl6YXRpb25fZGF0YV9sZW5ndGggPiAwKSAmJiAodGhpcy0+ZXF1YWxpemF0aW9uX2RhdGEgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJlcXVhbGl6YXRpb25fZGF0YVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX2NudV91c19jaGFuX2RhdGFcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+ZXF1YWxpemF0aW9uX2RhdGEgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+ZXF1YWxpemF0aW9uX2RhdGFfbGVuZ3RoICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+ZXF1YWxpemF0aW9uX2RhdGEsIHRoaXMtPmVxdWFsaXphdGlvbl9kYXRhX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnVuZXJyb3JlZHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5jb3JyZWN0ZWRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dW5jb3JyZWN0YWJsZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5zbnIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPm1pY3JvX3JlZmxlY3Rpb25zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3VzX2NoYW5fZGF0YV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IGVxdWFsaXphdGlvbl9kYXRhX2xlbmd0aDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZlcXVhbGl6YXRpb25fZGF0YV9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiBlcXVhbGl6YXRpb25fZGF0YV9sZW5ndGgpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgZXF1YWxpemF0aW9uX2RhdGFfbGVuZ3RoICogMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgOCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfc3RhdHVzX2RhdGFfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfc3RhdHVzX2RhdGEgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IGkwOworICAgIHVpbnQ4X3QgaTE7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmlkeCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+bWFjX2FkZHJlc3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnVzY2hhbl9jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT51c2NoYW5fY291bnQgPiAwKSAmJiAodGhpcy0+dXNjaGFuX2RhdGEgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidXNjaGFuX2RhdGFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfc3RhdHVzX2RhdGFcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dXNjaGFuX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfdXNfY2hhbl9kYXRhX3BhY2soJnRoaXMtPnVzY2hhbl9kYXRhW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfY29ubmVjdGl2aXR5X3N0YXRlX3BhY2sodGhpcy0+Y29ubmVjdGl2aXR5X3N0YXRlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X2RvY3Npc192ZXJzaW9uX3BhY2sodGhpcy0+ZG9jc2lzX3ZlcnNpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfaXBhZGRyX3R5cGVfcGFjayh0aGlzLT5pcGFkZHJfdHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5pcGFkZHJfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmlwYWRkcl9sZW5ndGggPiAwKSAmJiAodGhpcy0+aXBhZGRyX3ZhbHVlID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImlwYWRkcl92YWx1ZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9zdGF0dXNfZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT5pcGFkZHJfdmFsdWUsIHRoaXMtPmlwYWRkcl9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT50aW1lc3RhbXApKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnNmbG93X2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPnNmbG93X2NvdW50ID4gMCkgJiYgKHRoaXMtPnNmbG93X2lkID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInNmbG93X2lkXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3N0YXR1c19kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTEgPSAwOyBpMSA8IHRoaXMtPnNmbG93X2NvdW50OyBpMSsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnNmbG93X2lkW2kxXSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmxpbmtfbG9jYWxfYWRkcl9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bGlua19sb2NhbF9hZGRyX2xlbmd0aCA+IDApICYmICh0aGlzLT5saW5rX2xvY2FsX2FkZHIgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibGlua19sb2NhbF9hZGRyXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3N0YXR1c19kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPmxpbmtfbG9jYWxfYWRkciwgdGhpcy0+bGlua19sb2NhbF9hZGRyX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPm1hY19kb21haW5faW5kZXgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5zZXJ2aWNlX2dyb3VwX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5yY3BfaWRsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+cmNwX2lkbGVuZ3RoID4gMCkgJiYgKHRoaXMtPnJjcF9pZCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJyY3BfaWRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfc3RhdHVzX2RhdGFcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+cmNwX2lkLCB0aGlzLT5yY3BfaWRsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5yY2NfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5yY3NfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT50Y3NfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5sYXN0X3JlZ2lzdGVyX3RpbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5hZGRyX3Jlc29sdmVfcmVxdWVzdHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3N0YXR1c19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9zdGF0dXNfZGF0YSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9ICg0OCArIHRoaXMtPmlwYWRkcl9sZW5ndGgpICsgKDQgKiB0aGlzLT5zZmxvd19jb3VudCkgKyB0aGlzLT5saW5rX2xvY2FsX2FkZHJfbGVuZ3RoICsgdGhpcy0+cmNwX2lkbGVuZ3RoOworICAgIHVpbnQzMl90IGkwOworICAgIGlmICgodGhpcy0+dXNjaGFuX2NvdW50ID4gMCkgJiYgKHRoaXMtPnVzY2hhbl9kYXRhID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVzY2hhbl9jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9zdGF0dXNfZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnVzY2hhbl9jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV91c19jaGFuX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnVzY2hhbl9kYXRhW2kwXSk7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfc3RhdHVzX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9zdGF0dXNfZGF0YSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgaTA7CisgICAgdWludDhfdCBpMTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+aWR4KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9tYWNfYWRkcmVzcyhidWYsICZ0aGlzLT5tYWNfYWRkcmVzcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dXNjaGFuX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPnVzY2hhbl9jb3VudCA+IDApICYmICh0aGlzLT51c2NoYW5fZGF0YSA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVzY2hhbl9kYXRhXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3N0YXR1c19kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnVzY2hhbl9kYXRhID0gKGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV91c19jaGFuX2RhdGEgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnVzY2hhbl9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfdXNfY2hhbl9kYXRhKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51c2NoYW5fY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NudV91c19jaGFuX2RhdGFfdW5wYWNrKCZ0aGlzLT51c2NoYW5fZGF0YVtpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfY29ubmVjdGl2aXR5X3N0YXRlX3VucGFjaygmdGhpcy0+Y29ubmVjdGl2aXR5X3N0YXRlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X2RvY3Npc192ZXJzaW9uX3VucGFjaygmdGhpcy0+ZG9jc2lzX3ZlcnNpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfaXBhZGRyX3R5cGVfdW5wYWNrKCZ0aGlzLT5pcGFkZHJfdHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5pcGFkZHJfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmlwYWRkcl9sZW5ndGggPiAwKSAmJiAodGhpcy0+aXBhZGRyX3ZhbHVlID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiaXBhZGRyX3ZhbHVlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3N0YXR1c19kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPmlwYWRkcl92YWx1ZSA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5pcGFkZHJfbGVuZ3RoICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+aXBhZGRyX3ZhbHVlLCB0aGlzLT5pcGFkZHJfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dGltZXN0YW1wKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5zZmxvd19jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5zZmxvd19jb3VudCA+IDApICYmICh0aGlzLT5zZmxvd19pZCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInNmbG93X2lkXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3N0YXR1c19kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnNmbG93X2lkID0gKHVpbnQzMl90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5zZmxvd19jb3VudCAqIHNpemVvZih1aW50MzJfdCkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+c2Zsb3dfY291bnQ7IGkxKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+c2Zsb3dfaWRbaTFdKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bGlua19sb2NhbF9hZGRyX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5saW5rX2xvY2FsX2FkZHJfbGVuZ3RoID4gMCkgJiYgKHRoaXMtPmxpbmtfbG9jYWxfYWRkciA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImxpbmtfbG9jYWxfYWRkclwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9zdGF0dXNfZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT5saW5rX2xvY2FsX2FkZHIgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+bGlua19sb2NhbF9hZGRyX2xlbmd0aCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPmxpbmtfbG9jYWxfYWRkciwgdGhpcy0+bGlua19sb2NhbF9hZGRyX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPm1hY19kb21haW5faW5kZXgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5zZXJ2aWNlX2dyb3VwX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5yY3BfaWRsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+cmNwX2lkbGVuZ3RoID4gMCkgJiYgKHRoaXMtPnJjcF9pZCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJjcF9pZFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9zdGF0dXNfZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT5yY3BfaWQgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+cmNwX2lkbGVuZ3RoICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+cmNwX2lkLCB0aGlzLT5yY3BfaWRsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5yY2NfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5yY3NfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT50Y3NfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5sYXN0X3JlZ2lzdGVyX3RpbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5hZGRyX3Jlc29sdmVfcmVxdWVzdHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfc3RhdHVzX2RhdGFfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDhfdCB1c2NoYW5fY291bnQ7CisgICAgdWludDhfdCBpMDsKKyAgICB1aW50OF90IGlwYWRkcl9sZW5ndGg7CisgICAgdWludDhfdCBzZmxvd19jb3VudDsKKyAgICB1aW50OF90IGxpbmtfbG9jYWxfYWRkcl9sZW5ndGg7CisgICAgdWludDhfdCByY3BfaWRsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJnVzY2hhbl9jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfdXNfY2hhbl9kYXRhKSAqIHVzY2hhbl9jb3VudCk7CisgICAgZm9yIChpMCA9IDA7IGkwIDwgdXNjaGFuX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfdXNfY2hhbl9kYXRhX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZpcGFkZHJfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogaXBhZGRyX2xlbmd0aCk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBpcGFkZHJfbGVuZ3RoICogMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZzZmxvd19jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50MzJfdCkgKiBzZmxvd19jb3VudCk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBzZmxvd19jb3VudCAqIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxpbmtfbG9jYWxfYWRkcl9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiBsaW5rX2xvY2FsX2FkZHJfbGVuZ3RoKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxpbmtfbG9jYWxfYWRkcl9sZW5ndGggKiAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmcmNwX2lkbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogcmNwX2lkbGVuZ3RoKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIHJjcF9pZGxlbmd0aCAqIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fZG93bnN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXNfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9kb3duc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllcyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmNoYW5uZWxfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+aXNfZW5hYmxlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmNlbnRlcl9mcmVxdWVuY3kpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX21vZHVsYXRpb25fcGFjayh0aGlzLT5tb2R1bGF0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2FubmV4X3BhY2sodGhpcy0+YW5uZXgsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJsZWF2ZXJfcGFjayh0aGlzLT5pbnRlcmxlYXZlciwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+cG93ZXJfbGV2ZWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5pbnRlcmZhY2VfaW5kZXgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9kb3duc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllc191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fZG93bnN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5jaGFubmVsX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPmlzX2VuYWJsZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5jZW50ZXJfZnJlcXVlbmN5KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19tb2R1bGF0aW9uX3VucGFjaygmdGhpcy0+bW9kdWxhdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19hbm5leF91bnBhY2soJnRoaXMtPmFubmV4LCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVybGVhdmVyX3VucGFjaygmdGhpcy0+aW50ZXJsZWF2ZXIsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnBvd2VyX2xldmVsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+aW50ZXJmYWNlX2luZGV4KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fZG93bnN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXNfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxMyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllc19wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllcyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmNoYW5uZWxfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+aXNfZW5hYmxlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmNlbnRlcl9mcmVxdWVuY3kpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5jaGFubmVsX3dpZHRoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY191c19wcm9maWxlX3R5cGVfcGFjayh0aGlzLT5jaGFubmVsX3Byb2ZpbGVfdHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmlzX3NhYzJzaW5jMmVuYWJsZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5taW5pc2xvdF9zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dHJhbnNtaXRfdGltaW5nX29mZnNldCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+aW5pdGlhbF9yYW5naW5nX2JhY2tvZmYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmZpbmFsX3JhbmdpbmdfYmFja29mZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+aW5pdGlhbF9kYXRhX2JhY2tvZmYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmZpbmFsX2RhdGFfYmFja29mZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+YWN0aXZlX3NjZG1hX2NvZGVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5jb2Rlc19wZXJfc2xvdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+c2NkbWFfZnJhbWVfc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmhvcHBpbmdfc2VlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfdXNfbW9kdWxhdGlvbl90eXBlX3BhY2sodGhpcy0+bW9kdWxhdGlvbl90eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnByZV9lcXVhbGl6YXRpb25fc2V0dGluZykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmludGVyZmFjZV9pbmRleCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllc191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+Y2hhbm5lbF9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5pc19lbmFibGVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+Y2VudGVyX2ZyZXF1ZW5jeSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmNoYW5uZWxfd2lkdGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3VzX3Byb2ZpbGVfdHlwZV91bnBhY2soJnRoaXMtPmNoYW5uZWxfcHJvZmlsZV90eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+aXNfc2FjMnNpbmMyZW5hYmxlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPm1pbmlzbG90X3NpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT50cmFuc21pdF90aW1pbmdfb2Zmc2V0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5pbml0aWFsX3JhbmdpbmdfYmFja29mZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+ZmluYWxfcmFuZ2luZ19iYWNrb2ZmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5pbml0aWFsX2RhdGFfYmFja29mZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+ZmluYWxfZGF0YV9iYWNrb2ZmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5hY3RpdmVfc2NkbWFfY29kZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmNvZGVzX3Blcl9zbG90KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5zY2RtYV9mcmFtZV9zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+aG9wcGluZ19zZWVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY191c19tb2R1bGF0aW9uX3R5cGVfdW5wYWNrKCZ0aGlzLT5tb2R1bGF0aW9uX3R5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+cHJlX2VxdWFsaXphdGlvbl9zZXR0aW5nKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+aW50ZXJmYWNlX2luZGV4KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMzMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9zaWduYWxfcXVhbGl0eV9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX3NpZ25hbF9xdWFsaXR5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmludGVyZmFjZV9pbmRleCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+Y29udGVudGlvbl9pbnRlcnZhbHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51bmVycm9yZWRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+Y29ycmVjdGVkcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnVuY29ycmVjdGFibGVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+c25yKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5taWNyb19yZWZsZWN0aW9ucykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX3NpZ25hbF9xdWFsaXR5X3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9zaWduYWxfcXVhbGl0eSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5pbnRlcmZhY2VfaW5kZXgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmNvbnRlbnRpb25faW50ZXJ2YWxzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dW5lcnJvcmVkcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmNvcnJlY3RlZHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT51bmNvcnJlY3RhYmxlcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnNucikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bWljcm9fcmVmbGVjdGlvbnMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9zaWduYWxfcXVhbGl0eV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDMyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wb3dlcl9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcG93ZXIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5jaGFubmVsX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+aW5wdXRfcG93ZXJfbGV2ZWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Bvd2VyX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Bvd2VyICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+Y2hhbm5lbF9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmlucHV0X3Bvd2VyX2xldmVsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wb3dlcl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT52ZXJzaW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+cGFja2V0X2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfb3Bjb2RlX3BhY2sodGhpcy0+b3Bjb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b3Bjb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfRE9XTlNUUkVBTV9DT05GSUdfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuc2V0X2Rvd25zdHJlYW1fY29uZmlnX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF9kb3duc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfZG93bnN0cmVhbV9jb25maWdfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImRvd25zdHJlYW1fY2hhbm5lbHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2Vfc2V0X2Rvd25zdHJlYW1fY29uZmlnX3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5zZXRfZG93bnN0cmVhbV9jb25maWdfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9kb3duc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllc19wYWNrKCZ0aGlzLT51LnNldF9kb3duc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LmRvd25zdHJlYW1fY2hhbm5lbHNbaTBdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfRE9XTlNUUkVBTV9DT05GSUdfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNldF9kb3duc3RyZWFtX2NvbmZpZ19yZXNwb25zZS5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X2Rvd25zdHJlYW1fY29uZmlnX3Jlc3BvbnNlLmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfZG93bnN0cmVhbV9jb25maWdfcmVzcG9uc2UuZG93bnN0cmVhbV9jaGFubmVscyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJkb3duc3RyZWFtX2NoYW5uZWxzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX3NldF9kb3duc3RyZWFtX2NvbmZpZ19yZXNwb25zZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LnNldF9kb3duc3RyZWFtX2NvbmZpZ19yZXNwb25zZS5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdF9wYWNrKCZ0aGlzLT51LnNldF9kb3duc3RyZWFtX2NvbmZpZ19yZXNwb25zZS5kb3duc3RyZWFtX2NoYW5uZWxzW2kxXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0RPV05TVFJFQU1fQ09ORklHX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5nZXRfZG93bnN0cmVhbV9jb25maWdfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X2Rvd25zdHJlYW1fY29uZmlnX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9kb3duc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LmRvd25zdHJlYW1fY2hhbm5lbHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZG93bnN0cmVhbV9jaGFubmVsc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9nZXRfZG93bnN0cmVhbV9jb25maWdfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmdldF9kb3duc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LmRvd25zdHJlYW1fY2hhbm5lbHMsIHRoaXMtPnUuZ2V0X2Rvd25zdHJlYW1fY29uZmlnX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0RPV05TVFJFQU1fQ09ORklHX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTI7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5nZXRfZG93bnN0cmVhbV9jb25maWdfcmVzcG9uc2UuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9kb3duc3RyZWFtX2NvbmZpZ19yZXNwb25zZS5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X2Rvd25zdHJlYW1fY29uZmlnX3Jlc3BvbnNlLmRvd25zdHJlYW1fY2hhbm5lbHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZG93bnN0cmVhbV9jaGFubmVsc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9nZXRfZG93bnN0cmVhbV9jb25maWdfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMiA9IDA7IGkyIDwgdGhpcy0+dS5nZXRfZG93bnN0cmVhbV9jb25maWdfcmVzcG9uc2UuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudDsgaTIrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fZG93bnN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXNfcGFjaygmdGhpcy0+dS5nZXRfZG93bnN0cmVhbV9jb25maWdfcmVzcG9uc2UuZG93bnN0cmVhbV9jaGFubmVsc1tpMl0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9VUFNUUkVBTV9DT05GSUdfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkzOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuc2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVwc3RyZWFtX2NoYW5uZWxzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX3NldF91cHN0cmVhbV9jb25maWdfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkzID0gMDsgaTMgPCB0aGlzLT51LnNldF91cHN0cmVhbV9jb25maWdfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc19jb3VudDsgaTMrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzX3BhY2soJnRoaXMtPnUuc2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzW2kzXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX1VQU1RSRUFNX0NPTkZJR19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGk0OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuc2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF91cHN0cmVhbV9jb25maWdfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfdXBzdHJlYW1fY29uZmlnX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVwc3RyZWFtX2NoYW5uZWxzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX3NldF91cHN0cmVhbV9jb25maWdfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNCA9IDA7IGk0IDwgdGhpcy0+dS5zZXRfdXBzdHJlYW1fY29uZmlnX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50OyBpNCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdF9wYWNrKCZ0aGlzLT51LnNldF91cHN0cmVhbV9jb25maWdfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHNbaTRdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfVVBTVFJFQU1fQ09ORklHX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5nZXRfdXBzdHJlYW1fY29uZmlnX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfdXBzdHJlYW1fY29uZmlnX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfdXBzdHJlYW1fY29uZmlnX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidXBzdHJlYW1fY2hhbm5lbHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzLCB0aGlzLT51LmdldF91cHN0cmVhbV9jb25maWdfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1VQU1RSRUFNX0NPTkZJR19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGk1OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF91cHN0cmVhbV9jb25maWdfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfdXBzdHJlYW1fY29uZmlnX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVwc3RyZWFtX2NoYW5uZWxzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX2dldF91cHN0cmVhbV9jb25maWdfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNSA9IDA7IGk1IDwgdGhpcy0+dS5nZXRfdXBzdHJlYW1fY29uZmlnX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50OyBpNSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXNfcGFjaygmdGhpcy0+dS5nZXRfdXBzdHJlYW1fY29uZmlnX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzW2k1XSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0NSRUFURV9MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuc2V0X2NyZWF0ZV9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0Lmdyb3VwX2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19sb2FkX2JhbGFuY2VfbWV0aG9kX3BhY2sodGhpcy0+dS5zZXRfY3JlYXRlX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QubWV0aG9kLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3JlcXVlc3Rfb3B0aW9uX3BhY2sodGhpcy0+dS5zZXRfY3JlYXRlX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QucmVxdWVzdF9vcHRpb24sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0NSRUFURV9MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNldF9jcmVhdGVfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2UuZ3JvdXBfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3Jlc3VsdF9jb2RlX3BhY2sodGhpcy0+dS5zZXRfY3JlYXRlX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlLnJlc3VsdF9jb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9BRERfRE9XTlNUUkVBTVNfVE9fTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGk2OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuc2V0X2FkZF9kb3duc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0Lmdyb3VwX2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNldF9hZGRfZG93bnN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X2FkZF9kb3duc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfYWRkX2Rvd25zdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVscyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJkb3duc3RyZWFtX2NoYW5uZWxzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX3NldF9hZGRfZG93bnN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk2ID0gMDsgaTYgPCB0aGlzLT51LnNldF9hZGRfZG93bnN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50OyBpNisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX29wdGlvbl9wYWNrKCZ0aGlzLT51LnNldF9hZGRfZG93bnN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzW2k2XSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0FERF9ET1dOU1RSRUFNU19UT19MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGk3OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuc2V0X2FkZF9kb3duc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXNwb25zZS5ncm91cF9pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5zZXRfYWRkX2Rvd25zdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlLmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfYWRkX2Rvd25zdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlLmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfYWRkX2Rvd25zdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlLmRvd25zdHJlYW1fY2hhbm5lbHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZG93bnN0cmVhbV9jaGFubmVsc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9zZXRfYWRkX2Rvd25zdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTcgPSAwOyBpNyA8IHRoaXMtPnUuc2V0X2FkZF9kb3duc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXNwb25zZS5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50OyBpNysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdF9wYWNrKCZ0aGlzLT51LnNldF9hZGRfZG93bnN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2UuZG93bnN0cmVhbV9jaGFubmVsc1tpN10sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9BRERfVVBTVFJFQU1TX1RPX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpODsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNldF9hZGRfdXBzdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QuZ3JvdXBfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuc2V0X2FkZF91cHN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF9hZGRfdXBzdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfYWRkX3Vwc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVwc3RyZWFtX2NoYW5uZWxzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX3NldF9hZGRfdXBzdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpOCA9IDA7IGk4IDwgdGhpcy0+dS5zZXRfYWRkX3Vwc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50OyBpOCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX29wdGlvbl9wYWNrKCZ0aGlzLT51LnNldF9hZGRfdXBzdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNbaThdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfQUREX1VQU1RSRUFNU19UT19MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGk5OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuc2V0X2FkZF91cHN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2UuZ3JvdXBfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuc2V0X2FkZF91cHN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfYWRkX3Vwc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9hZGRfdXBzdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVwc3RyZWFtX2NoYW5uZWxzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX3NldF9hZGRfdXBzdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTkgPSAwOyBpOSA8IHRoaXMtPnUuc2V0X2FkZF91cHN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHNfY291bnQ7IGk5KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfcmVzdWx0X3BhY2soJnRoaXMtPnUuc2V0X2FkZF91cHN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHNbaTldLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfU0lHTkFMX1FVQUxJVFlfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkxMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmdldF9zaWduYWxfcXVhbGl0eV9yZXF1ZXN0LnVwc3RyZWFtX2ludGVyZmFjZXNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfc2lnbmFsX3F1YWxpdHlfcmVxdWVzdC51cHN0cmVhbV9pbnRlcmZhY2VzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3NpZ25hbF9xdWFsaXR5X3JlcXVlc3QudXBzdHJlYW1faW50ZXJmYWNlcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1cHN0cmVhbV9pbnRlcmZhY2VzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX2dldF9zaWduYWxfcXVhbGl0eV9yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEwID0gMDsgaTEwIDwgdGhpcy0+dS5nZXRfc2lnbmFsX3F1YWxpdHlfcmVxdWVzdC51cHN0cmVhbV9pbnRlcmZhY2VzX2NvdW50OyBpMTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmdldF9zaWduYWxfcXVhbGl0eV9yZXF1ZXN0LnVwc3RyZWFtX2ludGVyZmFjZXNbaTEwXSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9TSUdOQUxfUVVBTElUWV9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkxMTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmdldF9zaWduYWxfcXVhbGl0eV9yZXNwb25zZS51cHN0cmVhbV9pbnRlcmZhY2VzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3NpZ25hbF9xdWFsaXR5X3Jlc3BvbnNlLnVwc3RyZWFtX2ludGVyZmFjZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfc2lnbmFsX3F1YWxpdHlfcmVzcG9uc2UudXBzdHJlYW1faW50ZXJmYWNlcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1cHN0cmVhbV9pbnRlcmZhY2VzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX2dldF9zaWduYWxfcXVhbGl0eV9yZXNwb25zZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxMSA9IDA7IGkxMSA8IHRoaXMtPnUuZ2V0X3NpZ25hbF9xdWFsaXR5X3Jlc3BvbnNlLnVwc3RyZWFtX2ludGVyZmFjZXNfY291bnQ7IGkxMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9zaWduYWxfcXVhbGl0eV9wYWNrKCZ0aGlzLT51LmdldF9zaWduYWxfcXVhbGl0eV9yZXNwb25zZS51cHN0cmVhbV9pbnRlcmZhY2VzW2kxMV0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9DTlVfU1RBVFVTX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgaTEyOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmdldF9jbnVfc3RhdHVzX3JlcXVlc3QuY251X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X2NudV9zdGF0dXNfcmVxdWVzdC5jbnVfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfY251X3N0YXR1c19yZXF1ZXN0LmNudV9tYWNfYWRkcmVzcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjbnVfbWFjX2FkZHJlc3NcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X2NudV9zdGF0dXNfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxMiA9IDA7IGkxMiA8IHRoaXMtPnUuZ2V0X2NudV9zdGF0dXNfcmVxdWVzdC5jbnVfY291bnQ7IGkxMisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5nZXRfY251X3N0YXR1c19yZXF1ZXN0LmNudV9tYWNfYWRkcmVzc1tpMTJdKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0NOVV9TVEFUVVNfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgaTEzOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmdldF9jbnVfc3RhdHVzX3Jlc3BvbnNlLmNudV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9jbnVfc3RhdHVzX3Jlc3BvbnNlLmNudV9jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9jbnVfc3RhdHVzX3Jlc3BvbnNlLmNudV9zdGF0dXNfZGF0YSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjbnVfc3RhdHVzX2RhdGFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X2NudV9zdGF0dXNfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMTMgPSAwOyBpMTMgPCB0aGlzLT51LmdldF9jbnVfc3RhdHVzX3Jlc3BvbnNlLmNudV9jb3VudDsgaTEzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9zdGF0dXNfZGF0YV9wYWNrKCZ0aGlzLT51LmdldF9jbnVfc3RhdHVzX3Jlc3BvbnNlLmNudV9zdGF0dXNfZGF0YVtpMTNdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfUU9TX1NFUlZJQ0VfRkxPV19TVEFUSVNUSUNTX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMTQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19zdGF0aXN0aWNzX3JlcXVlc3Quc3ZjX2Zsb3dfaWRjb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X3N0YXRpc3RpY3NfcmVxdWVzdC5zdmNfZmxvd19pZGNvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfc3RhdGlzdGljc19yZXF1ZXN0LnN2Y19mbG93X2lkcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJzdmNfZmxvd19pZHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfc3RhdGlzdGljc19yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTE0ID0gMDsgaTE0IDwgdGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19zdGF0aXN0aWNzX3JlcXVlc3Quc3ZjX2Zsb3dfaWRjb3VudDsgaTE0KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19zdGF0aXN0aWNzX3JlcXVlc3Quc3ZjX2Zsb3dfaWRzW2kxNF0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfUU9TX1NFUlZJQ0VfRkxPV19TVEFUSVNUSUNTX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTE1OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfc3RhdGlzdGljc19yZXNwb25zZS5zdmNfZmxvd19pZGNvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfc3RhdGlzdGljc19yZXNwb25zZS5zdmNfZmxvd19pZGNvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfc3RhdGlzdGljc19yZXNwb25zZS5zdmNfZmxvd19kYXRhID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInN2Y19mbG93X2RhdGFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfc3RhdGlzdGljc19yZXNwb25zZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxNSA9IDA7IGkxNSA8IHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfc3RhdGlzdGljc19yZXNwb25zZS5zdmNfZmxvd19pZGNvdW50OyBpMTUrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX3N0YXRzX2RhdGFfcGFjaygmdGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19zdGF0aXN0aWNzX3Jlc3BvbnNlLnN2Y19mbG93X2RhdGFbaTE1XSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0NNQ19JTlRFUkZBQ0VTX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfQ01DX0lOVEVSRkFDRVNfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgaTE2OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19yZXNwb25zZS5pbnRmX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5nZXRfY21jX2ludGVyZmFjZXNfcmVzcG9uc2UudGltZXN0YW1wKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3Jlc3BvbnNlLmludGZfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfY21jX2ludGVyZmFjZXNfcmVzcG9uc2UuY21jX2ludGVyZmFjZV9kYXRhID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImNtY19pbnRlcmZhY2VfZGF0YVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9nZXRfY21jX2ludGVyZmFjZXNfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMTYgPSAwOyBpMTYgPCB0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19yZXNwb25zZS5pbnRmX2NvdW50OyBpMTYrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9kYXRhX3BhY2soJnRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3Jlc3BvbnNlLmNtY19pbnRlcmZhY2VfZGF0YVtpMTZdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfQ01DX01BQ19TVEFUSVNUSUNTX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfQ01DX01BQ19TVEFUSVNUSUNTX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmdldF9jbWNfbWFjX3N0YXRpc3RpY3NfcmVzcG9uc2UuaW50ZXJmYWNlX2luZGV4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5nZXRfY21jX21hY19zdGF0aXN0aWNzX3Jlc3BvbnNlLmludmFsaWRfcm5nX3JlcXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmdldF9jbWNfbWFjX3N0YXRpc3RpY3NfcmVzcG9uc2Uucm5nX2Fib3J0cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuZ2V0X2NtY19tYWNfc3RhdGlzdGljc19yZXNwb25zZS5pbnZhbGlkX3JlZ19yZXFzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5nZXRfY21jX21hY19zdGF0aXN0aWNzX3Jlc3BvbnNlLmZhaWxlZF9yZWdfcmVxcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuZ2V0X2NtY19tYWNfc3RhdGlzdGljc19yZXNwb25zZS5pbnZhbGlkX2RhdGFfcmVxcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuZ2V0X2NtY19tYWNfc3RhdGlzdGljc19yZXNwb25zZS50NXRpbWVvdXRzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfQ01DX0lOVEVSRkFDRVNfU1RBVElTVElDU19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTE3OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3N0YXRpc3RpY3NfcmVxdWVzdC5pbnRmX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3N0YXRpc3RpY3NfcmVxdWVzdC5pbnRmX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3N0YXRpc3RpY3NfcmVxdWVzdC5pbnRmX2luZGV4ID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImludGZfaW5kZXhcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X2NtY19pbnRlcmZhY2VzX3N0YXRpc3RpY3NfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxNyA9IDA7IGkxNyA8IHRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3N0YXRpc3RpY3NfcmVxdWVzdC5pbnRmX2NvdW50OyBpMTcrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19zdGF0aXN0aWNzX3JlcXVlc3QuaW50Zl9pbmRleFtpMTddKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0NNQ19JTlRFUkZBQ0VTX1NUQVRJU1RJQ1NfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMTg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5nZXRfY21jX2ludGVyZmFjZXNfc3RhdGlzdGljc19yZXNwb25zZS5pbnRlcmZhY2VzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3N0YXRpc3RpY3NfcmVzcG9uc2UuaW50ZXJmYWNlc19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19zdGF0aXN0aWNzX3Jlc3BvbnNlLm5ldHdvcmtfaW50ZXJmYWNlcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJuZXR3b3JrX2ludGVyZmFjZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X2NtY19pbnRlcmZhY2VzX3N0YXRpc3RpY3NfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMTggPSAwOyBpMTggPCB0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19zdGF0aXN0aWNzX3Jlc3BvbnNlLmludGVyZmFjZXNfY291bnQ7IGkxOCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50Zl9zdGF0c19kYXRhX3BhY2soJnRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3N0YXRpc3RpY3NfcmVzcG9uc2UubmV0d29ya19pbnRlcmZhY2VzW2kxOF0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9RT1NfU0VSVklDRV9GTE9XX0NPTkZJR19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTE5OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfY29uZmlnX3JlcXVlc3Quc3ZjX2Zsb3dfaWRjb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X2NvbmZpZ19yZXF1ZXN0LnN2Y19mbG93X2lkY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19jb25maWdfcmVxdWVzdC5zdmNfZmxvd19pZHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwic3ZjX2Zsb3dfaWRzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX2dldF9xb3Nfc2VydmljZV9mbG93X2NvbmZpZ19yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTE5ID0gMDsgaTE5IDwgdGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19jb25maWdfcmVxdWVzdC5zdmNfZmxvd19pZGNvdW50OyBpMTkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X2NvbmZpZ19yZXF1ZXN0LnN2Y19mbG93X2lkc1tpMTldKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1FPU19TRVJWSUNFX0ZMT1dfQ09ORklHX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTIwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfY29uZmlnX3Jlc3BvbnNlLnN2Y19mbG93X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfY29uZmlnX3Jlc3BvbnNlLnN2Y19mbG93X2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfY29uZmlnX3Jlc3BvbnNlLnN2Y19mbG93X2RhdGEgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwic3ZjX2Zsb3dfZGF0YVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9nZXRfcW9zX3NlcnZpY2VfZmxvd19jb25maWdfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMjAgPSAwOyBpMjAgPCB0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X2NvbmZpZ19yZXNwb25zZS5zdmNfZmxvd19jb3VudDsgaTIwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9jb25maWdfZGF0YV9wYWNrKCZ0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X2NvbmZpZ19yZXNwb25zZS5zdmNfZmxvd19kYXRhW2kyMF0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9RT1NfUEFDS0VUX0NMQVNTSUZJRVJfQ09ORklHX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMjE7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5nZXRfcW9zX3BhY2tldF9jbGFzc2lmaWVyX2NvbmZpZ19yZXF1ZXN0LnN2Y19mbG93X2lkY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfcW9zX3BhY2tldF9jbGFzc2lmaWVyX2NvbmZpZ19yZXF1ZXN0LnN2Y19mbG93X2lkY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfcW9zX3BhY2tldF9jbGFzc2lmaWVyX2NvbmZpZ19yZXF1ZXN0LnN2Y19mbG93X2lkcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJzdmNfZmxvd19pZHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X3Fvc19wYWNrZXRfY2xhc3NpZmllcl9jb25maWdfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyMSA9IDA7IGkyMSA8IHRoaXMtPnUuZ2V0X3Fvc19wYWNrZXRfY2xhc3NpZmllcl9jb25maWdfcmVxdWVzdC5zdmNfZmxvd19pZGNvdW50OyBpMjErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmdldF9xb3NfcGFja2V0X2NsYXNzaWZpZXJfY29uZmlnX3JlcXVlc3Quc3ZjX2Zsb3dfaWRzW2kyMV0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfUU9TX1BBQ0tFVF9DTEFTU0lGSUVSX0NPTkZJR19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkyMjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmdldF9xb3NfcGFja2V0X2NsYXNzaWZpZXJfY29uZmlnX3Jlc3BvbnNlLmNsYXNzaWZpZXJfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfcW9zX3BhY2tldF9jbGFzc2lmaWVyX2NvbmZpZ19yZXNwb25zZS5jbGFzc2lmaWVyX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3Fvc19wYWNrZXRfY2xhc3NpZmllcl9jb25maWdfcmVzcG9uc2UuY2xhc3NpZmllcl9kYXRhID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImNsYXNzaWZpZXJfZGF0YVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9nZXRfcW9zX3BhY2tldF9jbGFzc2lmaWVyX2NvbmZpZ19yZXNwb25zZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyMiA9IDA7IGkyMiA8IHRoaXMtPnUuZ2V0X3Fvc19wYWNrZXRfY2xhc3NpZmllcl9jb25maWdfcmVzcG9uc2UuY2xhc3NpZmllcl9jb3VudDsgaTIyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19jbGFzc2lmaWVyX2NvbmZpZ19kYXRhX3BhY2soJnRoaXMtPnUuZ2V0X3Fvc19wYWNrZXRfY2xhc3NpZmllcl9jb25maWdfcmVzcG9uc2UuY2xhc3NpZmllcl9kYXRhW2kyMl0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9VUFNUUkVBTV9JTlBVVF9QT1dFUl9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVwc3RyZWFtX2NoYW5uZWxzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX2dldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHMsIHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9VUFNUUkVBTV9JTlBVVF9QT1dFUl9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkyMzsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmdldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXNwb25zZS51cHN0cmVhbV9jaGFubmVscyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1cHN0cmVhbV9jaGFubmVsc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9nZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMjMgPSAwOyBpMjMgPCB0aGlzLT51LmdldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc19jb3VudDsgaTIzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcG93ZXJfcGFjaygmdGhpcy0+dS5nZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHNbaTIzXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX1VQU1RSRUFNX0lOUFVUX1BPV0VSX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMjQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5zZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidXBzdHJlYW1fY2hhbm5lbHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2Vfc2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMjQgPSAwOyBpMjQgPCB0aGlzLT51LnNldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50OyBpMjQrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wb3dlcl9wYWNrKCZ0aGlzLT51LnNldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzW2kyNF0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9VUFNUUkVBTV9JTlBVVF9QT1dFUl9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXN1bHRfY29kZV9wYWNrKHRoaXMtPnUuc2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3Jlc3BvbnNlLnJlc3VsdF9jb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnNldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXNwb25zZS5jaGFubmVsX29uZV9wb3dlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuc2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3Jlc3BvbnNlLmNoYW5uZWxfdHdvX3Bvd2VyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5zZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVzcG9uc2UuY2hhbm5lbF90aHJlZV9wb3dlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuc2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3Jlc3BvbnNlLmNoYW5uZWxfZm91cl9wb3dlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0FERF9DTlVTX1RPX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5zZXRfYWRkX2NudXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5ncm91cF9pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVxdWVzdF9vcHRpb25fcGFjayh0aGlzLT51LnNldF9hZGRfY251c190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LnJlcXVlc3Rfb3B0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X21hY19hZGRyX3JhbmdlX3BhY2soJnRoaXMtPnUuc2V0X2FkZF9jbnVzX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QuY251X21hY19yYW5nZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfQUREX0NOVVNfVE9fTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5zZXRfYWRkX2NudXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2UuZ3JvdXBfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3Jlc3VsdF9jb2RlX3BhY2sodGhpcy0+dS5zZXRfYWRkX2NudXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2UucmVzdWx0X2NvZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0VYQ0xVREVfQ05VU19GUk9NX0xPQURfQkFMQU5DSU5HX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVxdWVzdF9vcHRpb25fcGFjayh0aGlzLT51LnNldF9leGNsdWRlX2NudXNfZnJvbV9sb2FkX2JhbGFuY2luZ19yZXF1ZXN0LnJlcXVlc3Rfb3B0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPnUuc2V0X2V4Y2x1ZGVfY251c19mcm9tX2xvYWRfYmFsYW5jaW5nX3JlcXVlc3QuY251X21hY19hZGRyZXNzX3N0YXJ0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT51LnNldF9leGNsdWRlX2NudXNfZnJvbV9sb2FkX2JhbGFuY2luZ19yZXF1ZXN0LmNudV9tYWNfYWRkcmVzc19lbmQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9FWENMVURFX0NOVVNfRlJPTV9MT0FEX0JBTEFOQ0lOR19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXN1bHRfY29kZV9wYWNrKHRoaXMtPnUuc2V0X2V4Y2x1ZGVfY251c19mcm9tX2xvYWRfYmFsYW5jaW5nX3Jlc3BvbnNlLnJlc3VsdF9jb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9GVUxMX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMjU7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0Lmdyb3VwX2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19sb2FkX2JhbGFuY2VfbWV0aG9kX3BhY2sodGhpcy0+dS5zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0Lm1ldGhvZCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVscyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJkb3duc3RyZWFtX2NoYW5uZWxzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX3NldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LmRvd25zdHJlYW1fY2hhbm5lbHMsIHRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVscyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1cHN0cmVhbV9jaGFubmVsc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVscywgdGhpcy0+dS5zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QucmVzdHJpY3Rpb25zX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5yZXN0cmljdGlvbnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LnJlc3RyaWN0aW9ucyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJyZXN0cmljdGlvbnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2Vfc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyNSA9IDA7IGkyNSA8IHRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5yZXN0cmljdGlvbnNfY291bnQ7IGkyNSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfbWFjX2FkZHJfcmFuZ2VfcGFjaygmdGhpcy0+dS5zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LnJlc3RyaWN0aW9uc1tpMjVdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfRlVMTF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlLmdyb3VwX2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXN1bHRfY29kZV9wYWNrKHRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2UucmVzdWx0X2NvZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfQ01DX1NZU1RFTV9FVkVOVF9NRVNTQUdFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9ET1dOU1RSRUFNX0JPTkRJTkdfR1JPVVBfU1RBVFVTX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0RPV05TVFJFQU1fQk9ORElOR19HUk9VUF9TVEFUVVNfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0VYQ0xVREVEX0FDVElWRV9DTlVTX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0VYQ0xVREVEX0FDVElWRV9DTlVTX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9FWENMVURFRF9DTlVfQ09ORklHVVJBVElPTl9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRVhDTFVERURfQ05VU19DT05GSUdVUkFUSU9OX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0ZVTExfTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRlVMTF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBfQUNUSVZFX0NOVVNfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBfQUNUSVZFX0NOVVNfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQX0NOVV9DT05GSUdVUkFUSU9OX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQX0NOVV9DT05GSUdVUkFUSU9OX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9ET1dOU1RSRUFNU19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9ET1dOU1RSRUFNU19SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBfVVBTVFJFQU1TX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQX1VQU1RSRUFNU19SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBTX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQU19SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTUFYX1VQU1RSRUFNX1JGQVRURU5VQVRJT05fUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTUFYX1VQU1RSRUFNX1JGQVRURU5VQVRJT05fUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX01PVkVfQ05VX0RPV05TVFJFQU1fUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTU9WRV9DTlVfRE9XTlNUUkVBTV9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTU9WRV9DTlVfVVBTVFJFQU1fUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTU9WRV9DTlVfVVBTVFJFQU1fUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1NFUlZJQ0VTX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1NFUlZJQ0VTX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9VUFNUUkVBTV9CT05ESU5HX0dST1VQX1NUQVRVU19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9VUFNUUkVBTV9CT05ESU5HX0dST1VQX1NUQVRVU19SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9SRUdfUlNQX0VWRU5UX01FU1NBR0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX01BWF9VUFNUUkVBTV9SRkFUVEVOVUFUSU9OX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX01BWF9VUFNUUkVBTV9SRkFUVEVOVUFUSU9OX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9NT1ZFX0NOVV9ET1dOU1RSRUFNX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX01PVkVfQ05VX0RPV05TVFJFQU1fUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX01PVkVfQ05VX1VQU1RSRUFNX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX01PVkVfQ05VX1VQU1RSRUFNX1JFU1BPTlNFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gNTsKKyAgICBzd2l0Y2ggKHRoaXMtPm9wY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0RPV05TVFJFQU1fQ09ORklHX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMSArICgxMyAqIHRoaXMtPnUuc2V0X2Rvd25zdHJlYW1fY29uZmlnX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfRE9XTlNUUkVBTV9DT05GSUdfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMSArICgyICogdGhpcy0+dS5zZXRfZG93bnN0cmVhbV9jb25maWdfcmVzcG9uc2UuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRE9XTlNUUkVBTV9DT05GSUdfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgdGhpcy0+dS5nZXRfZG93bnN0cmVhbV9jb25maWdfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0RPV05TVFJFQU1fQ09ORklHX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyAoMTMgKiB0aGlzLT51LmdldF9kb3duc3RyZWFtX2NvbmZpZ19yZXNwb25zZS5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9VUFNUUkVBTV9DT05GSUdfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgKDMzICogdGhpcy0+dS5zZXRfdXBzdHJlYW1fY29uZmlnX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX1VQU1RSRUFNX0NPTkZJR19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgKDIgKiB0aGlzLT51LnNldF91cHN0cmVhbV9jb25maWdfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHNfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1VQU1RSRUFNX0NPTkZJR19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyB0aGlzLT51LmdldF91cHN0cmVhbV9jb25maWdfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc19jb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9VUFNUUkVBTV9DT05GSUdfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMSArICgzMyAqIHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc19jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfQ1JFQVRFX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9DUkVBVEVfTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9BRERfRE9XTlNUUkVBTVNfVE9fTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyICsgKDIgKiB0aGlzLT51LnNldF9hZGRfZG93bnN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9BRERfRE9XTlNUUkVBTVNfVE9fTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMiArICgyICogdGhpcy0+dS5zZXRfYWRkX2Rvd25zdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlLmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0FERF9VUFNUUkVBTVNfVE9fTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyICsgKDIgKiB0aGlzLT51LnNldF9hZGRfdXBzdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0FERF9VUFNUUkVBTVNfVE9fTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMiArICgyICogdGhpcy0+dS5zZXRfYWRkX3Vwc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc19jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfU0lHTkFMX1FVQUxJVFlfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgKDIgKiB0aGlzLT51LmdldF9zaWduYWxfcXVhbGl0eV9yZXF1ZXN0LnVwc3RyZWFtX2ludGVyZmFjZXNfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1NJR05BTF9RVUFMSVRZX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyAoMzIgKiB0aGlzLT51LmdldF9zaWduYWxfcXVhbGl0eV9yZXNwb25zZS51cHN0cmVhbV9pbnRlcmZhY2VzX2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9DTlVfU1RBVFVTX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMiArICg2ICogdGhpcy0+dS5nZXRfY251X3N0YXR1c19yZXF1ZXN0LmNudV9jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfQ05VX1NUQVRVU19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMDsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfY251X3N0YXR1c19yZXNwb25zZS5jbnVfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfY251X3N0YXR1c19yZXNwb25zZS5jbnVfc3RhdHVzX2RhdGEgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY251X2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5nZXRfY251X3N0YXR1c19yZXNwb25zZS5jbnVfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfc3RhdHVzX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZ2V0X2NudV9zdGF0dXNfcmVzcG9uc2UuY251X3N0YXR1c19kYXRhW2kwXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1FPU19TRVJWSUNFX0ZMT1dfU1RBVElTVElDU19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyAoMiAqIHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfc3RhdGlzdGljc19yZXF1ZXN0LnN2Y19mbG93X2lkY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1FPU19TRVJWSUNFX0ZMT1dfU1RBVElTVElDU19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgKDM2ICogdGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19zdGF0aXN0aWNzX3Jlc3BvbnNlLnN2Y19mbG93X2lkY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0NNQ19JTlRFUkZBQ0VTX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfQ01DX0lOVEVSRkFDRVNfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTE7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNjsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3Jlc3BvbnNlLmludGZfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfY21jX2ludGVyZmFjZXNfcmVzcG9uc2UuY21jX2ludGVyZmFjZV9kYXRhID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImludGZfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19yZXNwb25zZS5pbnRmX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19yZXNwb25zZS5jbWNfaW50ZXJmYWNlX2RhdGFbaTFdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfQ01DX01BQ19TVEFUSVNUSUNTX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfQ01DX01BQ19TVEFUSVNUSUNTX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0NNQ19JTlRFUkZBQ0VTX1NUQVRJU1RJQ1NfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgKDIgKiB0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19zdGF0aXN0aWNzX3JlcXVlc3QuaW50Zl9jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfQ01DX0lOVEVSRkFDRVNfU1RBVElTVElDU19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgKDEwNSAqIHRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3N0YXRpc3RpY3NfcmVzcG9uc2UuaW50ZXJmYWNlc19jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfUU9TX1NFUlZJQ0VfRkxPV19DT05GSUdfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgKDIgKiB0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X2NvbmZpZ19yZXF1ZXN0LnN2Y19mbG93X2lkY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1FPU19TRVJWSUNFX0ZMT1dfQ09ORklHX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkyOworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X2NvbmZpZ19yZXNwb25zZS5zdmNfZmxvd19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X2NvbmZpZ19yZXNwb25zZS5zdmNfZmxvd19kYXRhID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInN2Y19mbG93X2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMiA9IDA7IGkyIDwgdGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19jb25maWdfcmVzcG9uc2Uuc3ZjX2Zsb3dfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2ZfY29uZmlnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfY29uZmlnX3Jlc3BvbnNlLnN2Y19mbG93X2RhdGFbaTJdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfUU9TX1BBQ0tFVF9DTEFTU0lGSUVSX0NPTkZJR19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyAoMiAqIHRoaXMtPnUuZ2V0X3Fvc19wYWNrZXRfY2xhc3NpZmllcl9jb25maWdfcmVxdWVzdC5zdmNfZmxvd19pZGNvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9RT1NfUEFDS0VUX0NMQVNTSUZJRVJfQ09ORklHX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkzOworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9xb3NfcGFja2V0X2NsYXNzaWZpZXJfY29uZmlnX3Jlc3BvbnNlLmNsYXNzaWZpZXJfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfcW9zX3BhY2tldF9jbGFzc2lmaWVyX2NvbmZpZ19yZXNwb25zZS5jbGFzc2lmaWVyX2RhdGEgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY2xhc3NpZmllcl9jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IHRoaXMtPnUuZ2V0X3Fvc19wYWNrZXRfY2xhc3NpZmllcl9jb25maWdfcmVzcG9uc2UuY2xhc3NpZmllcl9jb3VudDsgaTMrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19jbGFzc2lmaWVyX2NvbmZpZ19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmdldF9xb3NfcGFja2V0X2NsYXNzaWZpZXJfY29uZmlnX3Jlc3BvbnNlLmNsYXNzaWZpZXJfZGF0YVtpM10pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9VUFNUUkVBTV9JTlBVVF9QT1dFUl9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyB0aGlzLT51LmdldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1VQU1RSRUFNX0lOUFVUX1BPV0VSX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyAoMyAqIHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9VUFNUUkVBTV9JTlBVVF9QT1dFUl9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyAoMyAqIHRoaXMtPnUuc2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX1VQU1RSRUFNX0lOUFVUX1BPV0VSX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfQUREX0NOVVNfVE9fTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9BRERfQ05VU19UT19MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0VYQ0xVREVfQ05VU19GUk9NX0xPQURfQkFMQU5DSU5HX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfRVhDTFVERV9DTlVTX0ZST01fTE9BRF9CQUxBTkNJTkdfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9GVUxMX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gKDUgKyB0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCArIHRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc19jb3VudCkgKyAoMTIgKiB0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QucmVzdHJpY3Rpb25zX2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9GVUxMX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9DTUNfU1lTVEVNX0VWRU5UX01FU1NBR0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0RPV05TVFJFQU1fQk9ORElOR19HUk9VUF9TVEFUVVNfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRE9XTlNUUkVBTV9CT05ESU5HX0dST1VQX1NUQVRVU19SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRVhDTFVERURfQUNUSVZFX0NOVVNfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRVhDTFVERURfQUNUSVZFX0NOVVNfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0VYQ0xVREVEX0NOVV9DT05GSUdVUkFUSU9OX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9FWENMVURFRF9DTlVTX0NPTkZJR1VSQVRJT05fUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRlVMTF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9GVUxMX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9BQ1RJVkVfQ05VU19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9BQ1RJVkVfQ05VU19SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBfQ05VX0NPTkZJR1VSQVRJT05fUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBfQ05VX0NPTkZJR1VSQVRJT05fUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQX0RPV05TVFJFQU1TX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQX0RPV05TVFJFQU1TX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9VUFNUUkVBTVNfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBfVVBTVFJFQU1TX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9MT0FEX0JBTEFOQ0lOR19HUk9VUFNfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBTX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9NQVhfVVBTVFJFQU1fUkZBVFRFTlVBVElPTl9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9NQVhfVVBTVFJFQU1fUkZBVFRFTlVBVElPTl9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTU9WRV9DTlVfRE9XTlNUUkVBTV9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9NT1ZFX0NOVV9ET1dOU1RSRUFNX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9NT1ZFX0NOVV9VUFNUUkVBTV9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9NT1ZFX0NOVV9VUFNUUkVBTV9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfU0VSVklDRVNfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfU0VSVklDRVNfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1VQU1RSRUFNX0JPTkRJTkdfR1JPVVBfU1RBVFVTX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1VQU1RSRUFNX0JPTkRJTkdfR1JPVVBfU1RBVFVTX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1JFR19SU1BfRVZFTlRfTUVTU0FHRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfTUFYX1VQU1RSRUFNX1JGQVRURU5VQVRJT05fUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfTUFYX1VQU1RSRUFNX1JGQVRURU5VQVRJT05fUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX01PVkVfQ05VX0RPV05TVFJFQU1fUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfTU9WRV9DTlVfRE9XTlNUUkVBTV9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfTU9WRV9DTlVfVVBTVFJFQU1fUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfTU9WRV9DTlVfVVBTVFJFQU1fUkVTUE9OU0U6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dmVyc2lvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnBhY2tldF9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X29wY29kZV91bnBhY2soJnRoaXMtPm9wY29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm9wY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0RPV05TVFJFQU1fQ09ORklHX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnNldF9kb3duc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfZG93bnN0cmVhbV9jb25maWdfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X2Rvd25zdHJlYW1fY29uZmlnX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVscyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImRvd25zdHJlYW1fY2hhbm5lbHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2Vfc2V0X2Rvd25zdHJlYW1fY29uZmlnX3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5zZXRfZG93bnN0cmVhbV9jb25maWdfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzID0gKGJjbW9sdF9lcG9uX29hbV9icmNtX2Rvd25zdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnNldF9kb3duc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2JyY21fZG93bnN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXMpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUuc2V0X2Rvd25zdHJlYW1fY29uZmlnX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fZG93bnN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXNfdW5wYWNrKCZ0aGlzLT51LnNldF9kb3duc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LmRvd25zdHJlYW1fY2hhbm5lbHNbaTBdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9ET1dOU1RSRUFNX0NPTkZJR19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkxOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuc2V0X2Rvd25zdHJlYW1fY29uZmlnX3Jlc3BvbnNlLmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfZG93bnN0cmVhbV9jb25maWdfcmVzcG9uc2UuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9kb3duc3RyZWFtX2NvbmZpZ19yZXNwb25zZS5kb3duc3RyZWFtX2NoYW5uZWxzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZG93bnN0cmVhbV9jaGFubmVsc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9zZXRfZG93bnN0cmVhbV9jb25maWdfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5zZXRfZG93bnN0cmVhbV9jb25maWdfcmVzcG9uc2UuZG93bnN0cmVhbV9jaGFubmVscyA9IChiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5zZXRfZG93bnN0cmVhbV9jb25maWdfcmVzcG9uc2UuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5zZXRfZG93bnN0cmVhbV9jb25maWdfcmVzcG9uc2UuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9yZXN1bHRfdW5wYWNrKCZ0aGlzLT51LnNldF9kb3duc3RyZWFtX2NvbmZpZ19yZXNwb25zZS5kb3duc3RyZWFtX2NoYW5uZWxzW2kxXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRE9XTlNUUkVBTV9DT05GSUdfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmdldF9kb3duc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfZG93bnN0cmVhbV9jb25maWdfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X2Rvd25zdHJlYW1fY29uZmlnX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVscyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImRvd25zdHJlYW1fY2hhbm5lbHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X2Rvd25zdHJlYW1fY29uZmlnX3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfZG93bnN0cmVhbV9jb25maWdfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2V0X2Rvd25zdHJlYW1fY29uZmlnX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuZ2V0X2Rvd25zdHJlYW1fY29uZmlnX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVscywgdGhpcy0+dS5nZXRfZG93bnN0cmVhbV9jb25maWdfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRE9XTlNUUkVBTV9DT05GSUdfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmdldF9kb3duc3RyZWFtX2NvbmZpZ19yZXNwb25zZS5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X2Rvd25zdHJlYW1fY29uZmlnX3Jlc3BvbnNlLmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfZG93bnN0cmVhbV9jb25maWdfcmVzcG9uc2UuZG93bnN0cmVhbV9jaGFubmVscyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImRvd25zdHJlYW1fY2hhbm5lbHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X2Rvd25zdHJlYW1fY29uZmlnX3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2V0X2Rvd25zdHJlYW1fY29uZmlnX3Jlc3BvbnNlLmRvd25zdHJlYW1fY2hhbm5lbHMgPSAoYmNtb2x0X2Vwb25fb2FtX2JyY21fZG93bnN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXMgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2V0X2Rvd25zdHJlYW1fY29uZmlnX3Jlc3BvbnNlLmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2JyY21fZG93bnN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXMpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUuZ2V0X2Rvd25zdHJlYW1fY29uZmlnX3Jlc3BvbnNlLmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2Rvd25zdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzX3VucGFjaygmdGhpcy0+dS5nZXRfZG93bnN0cmVhbV9jb25maWdfcmVzcG9uc2UuZG93bnN0cmVhbV9jaGFubmVsc1tpMl0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX1VQU1RSRUFNX0NPTkZJR19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTM7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5zZXRfdXBzdHJlYW1fY29uZmlnX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfdXBzdHJlYW1fY29uZmlnX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfdXBzdHJlYW1fY29uZmlnX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1cHN0cmVhbV9jaGFubmVsc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9zZXRfdXBzdHJlYW1fY29uZmlnX3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5zZXRfdXBzdHJlYW1fY29uZmlnX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHMgPSAoYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnNldF91cHN0cmVhbV9jb25maWdfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXMpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IHRoaXMtPnUuc2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50OyBpMysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXNfdW5wYWNrKCZ0aGlzLT51LnNldF91cHN0cmVhbV9jb25maWdfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc1tpM10sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX1VQU1RSRUFNX0NPTkZJR19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGk0OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuc2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF91cHN0cmVhbV9jb25maWdfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfdXBzdHJlYW1fY29uZmlnX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidXBzdHJlYW1fY2hhbm5lbHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2Vfc2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXNwb25zZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnNldF91cHN0cmVhbV9jb25maWdfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHMgPSAoYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9yZXN1bHQgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuc2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNCA9IDA7IGk0IDwgdGhpcy0+dS5zZXRfdXBzdHJlYW1fY29uZmlnX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50OyBpNCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdF91bnBhY2soJnRoaXMtPnUuc2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc1tpNF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1VQU1RSRUFNX0NPTkZJR19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidXBzdHJlYW1fY2hhbm5lbHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5nZXRfdXBzdHJlYW1fY29uZmlnX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHMsIHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfVVBTVFJFQU1fQ09ORklHX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTU7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5nZXRfdXBzdHJlYW1fY29uZmlnX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF91cHN0cmVhbV9jb25maWdfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1cHN0cmVhbV9jaGFubmVsc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9nZXRfdXBzdHJlYW1fY29uZmlnX3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXNwb25zZS51cHN0cmVhbV9jaGFubmVscyA9IChiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXMgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXMpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTUgPSAwOyBpNSA8IHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2NvbmZpZ19yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc19jb3VudDsgaTUrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzX3VucGFjaygmdGhpcy0+dS5nZXRfdXBzdHJlYW1fY29uZmlnX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzW2k1XSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfQ1JFQVRFX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5zZXRfY3JlYXRlX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QuZ3JvdXBfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2xvYWRfYmFsYW5jZV9tZXRob2RfdW5wYWNrKCZ0aGlzLT51LnNldF9jcmVhdGVfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5tZXRob2QsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVxdWVzdF9vcHRpb25fdW5wYWNrKCZ0aGlzLT51LnNldF9jcmVhdGVfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5yZXF1ZXN0X29wdGlvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfQ1JFQVRFX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuc2V0X2NyZWF0ZV9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXNwb25zZS5ncm91cF9pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVzdWx0X2NvZGVfdW5wYWNrKCZ0aGlzLT51LnNldF9jcmVhdGVfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2UucmVzdWx0X2NvZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0FERF9ET1dOU1RSRUFNU19UT19MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5zZXRfYWRkX2Rvd25zdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QuZ3JvdXBfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuc2V0X2FkZF9kb3duc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfYWRkX2Rvd25zdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9hZGRfZG93bnN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZG93bnN0cmVhbV9jaGFubmVsc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9zZXRfYWRkX2Rvd25zdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5zZXRfYWRkX2Rvd25zdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVscyA9IChiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX29wdGlvbiAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5zZXRfYWRkX2Rvd25zdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX29wdGlvbikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNiA9IDA7IGk2IDwgdGhpcy0+dS5zZXRfYWRkX2Rvd25zdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudDsgaTYrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9vcHRpb25fdW5wYWNrKCZ0aGlzLT51LnNldF9hZGRfZG93bnN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzW2k2XSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfQUREX0RPV05TVFJFQU1TX1RPX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTc7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5zZXRfYWRkX2Rvd25zdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlLmdyb3VwX2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnNldF9hZGRfZG93bnN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2UuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF9hZGRfZG93bnN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2UuZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9hZGRfZG93bnN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2UuZG93bnN0cmVhbV9jaGFubmVscyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImRvd25zdHJlYW1fY2hhbm5lbHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2Vfc2V0X2FkZF9kb3duc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXNwb25zZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnNldF9hZGRfZG93bnN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2UuZG93bnN0cmVhbV9jaGFubmVscyA9IChiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5zZXRfYWRkX2Rvd25zdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlLmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9yZXN1bHQpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTcgPSAwOyBpNyA8IHRoaXMtPnUuc2V0X2FkZF9kb3duc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXNwb25zZS5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50OyBpNysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdF91bnBhY2soJnRoaXMtPnUuc2V0X2FkZF9kb3duc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXNwb25zZS5kb3duc3RyZWFtX2NoYW5uZWxzW2k3XSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfQUREX1VQU1RSRUFNU19UT19MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5zZXRfYWRkX3Vwc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0Lmdyb3VwX2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnNldF9hZGRfdXBzdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfYWRkX3Vwc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X2FkZF91cHN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVscyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVwc3RyZWFtX2NoYW5uZWxzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX3NldF9hZGRfdXBzdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5zZXRfYWRkX3Vwc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzID0gKGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfb3B0aW9uICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnNldF9hZGRfdXBzdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9vcHRpb24pKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTggPSAwOyBpOCA8IHRoaXMtPnUuc2V0X2FkZF91cHN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc19jb3VudDsgaTgrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9vcHRpb25fdW5wYWNrKCZ0aGlzLT51LnNldF9hZGRfdXBzdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNbaThdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9BRERfVVBTVFJFQU1TX1RPX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5zZXRfYWRkX3Vwc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXNwb25zZS5ncm91cF9pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5zZXRfYWRkX3Vwc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF9hZGRfdXBzdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X2FkZF91cHN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1cHN0cmVhbV9jaGFubmVsc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9zZXRfYWRkX3Vwc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXNwb25zZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnNldF9hZGRfdXBzdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzID0gKGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfcmVzdWx0ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnNldF9hZGRfdXBzdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfcmVzdWx0KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk5ID0gMDsgaTkgPCB0aGlzLT51LnNldF9hZGRfdXBzdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50OyBpOSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdF91bnBhY2soJnRoaXMtPnUuc2V0X2FkZF91cHN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2UudXBzdHJlYW1fY2hhbm5lbHNbaTldLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9TSUdOQUxfUVVBTElUWV9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTEwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZ2V0X3NpZ25hbF9xdWFsaXR5X3JlcXVlc3QudXBzdHJlYW1faW50ZXJmYWNlc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9zaWduYWxfcXVhbGl0eV9yZXF1ZXN0LnVwc3RyZWFtX2ludGVyZmFjZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfc2lnbmFsX3F1YWxpdHlfcmVxdWVzdC51cHN0cmVhbV9pbnRlcmZhY2VzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidXBzdHJlYW1faW50ZXJmYWNlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9nZXRfc2lnbmFsX3F1YWxpdHlfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmdldF9zaWduYWxfcXVhbGl0eV9yZXF1ZXN0LnVwc3RyZWFtX2ludGVyZmFjZXMgPSAodWludDE2X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2V0X3NpZ25hbF9xdWFsaXR5X3JlcXVlc3QudXBzdHJlYW1faW50ZXJmYWNlc19jb3VudCAqIHNpemVvZih1aW50MTZfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMTAgPSAwOyBpMTAgPCB0aGlzLT51LmdldF9zaWduYWxfcXVhbGl0eV9yZXF1ZXN0LnVwc3RyZWFtX2ludGVyZmFjZXNfY291bnQ7IGkxMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZ2V0X3NpZ25hbF9xdWFsaXR5X3JlcXVlc3QudXBzdHJlYW1faW50ZXJmYWNlc1tpMTBdKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1NJR05BTF9RVUFMSVRZX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTExOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZ2V0X3NpZ25hbF9xdWFsaXR5X3Jlc3BvbnNlLnVwc3RyZWFtX2ludGVyZmFjZXNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfc2lnbmFsX3F1YWxpdHlfcmVzcG9uc2UudXBzdHJlYW1faW50ZXJmYWNlc19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9zaWduYWxfcXVhbGl0eV9yZXNwb25zZS51cHN0cmVhbV9pbnRlcmZhY2VzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidXBzdHJlYW1faW50ZXJmYWNlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9nZXRfc2lnbmFsX3F1YWxpdHlfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfc2lnbmFsX3F1YWxpdHlfcmVzcG9uc2UudXBzdHJlYW1faW50ZXJmYWNlcyA9IChiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9zaWduYWxfcXVhbGl0eSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZXRfc2lnbmFsX3F1YWxpdHlfcmVzcG9uc2UudXBzdHJlYW1faW50ZXJmYWNlc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9zaWduYWxfcXVhbGl0eSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMTEgPSAwOyBpMTEgPCB0aGlzLT51LmdldF9zaWduYWxfcXVhbGl0eV9yZXNwb25zZS51cHN0cmVhbV9pbnRlcmZhY2VzX2NvdW50OyBpMTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fc2lnbmFsX3F1YWxpdHlfdW5wYWNrKCZ0aGlzLT51LmdldF9zaWduYWxfcXVhbGl0eV9yZXNwb25zZS51cHN0cmVhbV9pbnRlcmZhY2VzW2kxMV0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0NOVV9TVEFUVVNfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBpMTI7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZ2V0X2NudV9zdGF0dXNfcmVxdWVzdC5jbnVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfY251X3N0YXR1c19yZXF1ZXN0LmNudV9jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9jbnVfc3RhdHVzX3JlcXVlc3QuY251X21hY19hZGRyZXNzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY251X21hY19hZGRyZXNzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX2dldF9jbnVfc3RhdHVzX3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfY251X3N0YXR1c19yZXF1ZXN0LmNudV9tYWNfYWRkcmVzcyA9IChiY21vc19tYWNfYWRkcmVzcyAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZXRfY251X3N0YXR1c19yZXF1ZXN0LmNudV9jb3VudCAqIHNpemVvZihiY21vc19tYWNfYWRkcmVzcykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMTIgPSAwOyBpMTIgPCB0aGlzLT51LmdldF9jbnVfc3RhdHVzX3JlcXVlc3QuY251X2NvdW50OyBpMTIrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX21hY19hZGRyZXNzKGJ1ZiwgJnRoaXMtPnUuZ2V0X2NudV9zdGF0dXNfcmVxdWVzdC5jbnVfbWFjX2FkZHJlc3NbaTEyXSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9DTlVfU1RBVFVTX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IGkxMzsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5nZXRfY251X3N0YXR1c19yZXNwb25zZS5jbnVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfY251X3N0YXR1c19yZXNwb25zZS5jbnVfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfY251X3N0YXR1c19yZXNwb25zZS5jbnVfc3RhdHVzX2RhdGEgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjbnVfc3RhdHVzX2RhdGFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X2NudV9zdGF0dXNfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfY251X3N0YXR1c19yZXNwb25zZS5jbnVfc3RhdHVzX2RhdGEgPSAoYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3N0YXR1c19kYXRhICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmdldF9jbnVfc3RhdHVzX3Jlc3BvbnNlLmNudV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfc3RhdHVzX2RhdGEpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEzID0gMDsgaTEzIDwgdGhpcy0+dS5nZXRfY251X3N0YXR1c19yZXNwb25zZS5jbnVfY291bnQ7IGkxMysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfc3RhdHVzX2RhdGFfdW5wYWNrKCZ0aGlzLT51LmdldF9jbnVfc3RhdHVzX3Jlc3BvbnNlLmNudV9zdGF0dXNfZGF0YVtpMTNdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9RT1NfU0VSVklDRV9GTE9XX1NUQVRJU1RJQ1NfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkxNDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X3N0YXRpc3RpY3NfcmVxdWVzdC5zdmNfZmxvd19pZGNvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfc3RhdGlzdGljc19yZXF1ZXN0LnN2Y19mbG93X2lkY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19zdGF0aXN0aWNzX3JlcXVlc3Quc3ZjX2Zsb3dfaWRzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwic3ZjX2Zsb3dfaWRzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX2dldF9xb3Nfc2VydmljZV9mbG93X3N0YXRpc3RpY3NfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X3N0YXRpc3RpY3NfcmVxdWVzdC5zdmNfZmxvd19pZHMgPSAodWludDE2X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfc3RhdGlzdGljc19yZXF1ZXN0LnN2Y19mbG93X2lkY291bnQgKiBzaXplb2YodWludDE2X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTE0ID0gMDsgaTE0IDwgdGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19zdGF0aXN0aWNzX3JlcXVlc3Quc3ZjX2Zsb3dfaWRjb3VudDsgaTE0KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19zdGF0aXN0aWNzX3JlcXVlc3Quc3ZjX2Zsb3dfaWRzW2kxNF0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfUU9TX1NFUlZJQ0VfRkxPV19TVEFUSVNUSUNTX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTE1OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfc3RhdGlzdGljc19yZXNwb25zZS5zdmNfZmxvd19pZGNvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfc3RhdGlzdGljc19yZXNwb25zZS5zdmNfZmxvd19pZGNvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfc3RhdGlzdGljc19yZXNwb25zZS5zdmNfZmxvd19kYXRhID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwic3ZjX2Zsb3dfZGF0YVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9nZXRfcW9zX3NlcnZpY2VfZmxvd19zdGF0aXN0aWNzX3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfc3RhdGlzdGljc19yZXNwb25zZS5zdmNfZmxvd19kYXRhID0gKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9zdGF0c19kYXRhICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X3N0YXRpc3RpY3NfcmVzcG9uc2Uuc3ZjX2Zsb3dfaWRjb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2Zfc3RhdHNfZGF0YSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMTUgPSAwOyBpMTUgPCB0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X3N0YXRpc3RpY3NfcmVzcG9uc2Uuc3ZjX2Zsb3dfaWRjb3VudDsgaTE1KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9zdGF0c19kYXRhX3VucGFjaygmdGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19zdGF0aXN0aWNzX3Jlc3BvbnNlLnN2Y19mbG93X2RhdGFbaTE1XSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfQ01DX0lOVEVSRkFDRVNfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9DTUNfSU5URVJGQUNFU19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBpMTY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3Jlc3BvbnNlLmludGZfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19yZXNwb25zZS50aW1lc3RhbXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfY21jX2ludGVyZmFjZXNfcmVzcG9uc2UuaW50Zl9jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19yZXNwb25zZS5jbWNfaW50ZXJmYWNlX2RhdGEgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjbWNfaW50ZXJmYWNlX2RhdGFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X2NtY19pbnRlcmZhY2VzX3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3Jlc3BvbnNlLmNtY19pbnRlcmZhY2VfZGF0YSA9IChiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX2RhdGEgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3Jlc3BvbnNlLmludGZfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9kYXRhKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxNiA9IDA7IGkxNiA8IHRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3Jlc3BvbnNlLmludGZfY291bnQ7IGkxNisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX2RhdGFfdW5wYWNrKCZ0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19yZXNwb25zZS5jbWNfaW50ZXJmYWNlX2RhdGFbaTE2XSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfQ01DX01BQ19TVEFUSVNUSUNTX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfQ01DX01BQ19TVEFUSVNUSUNTX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmdldF9jbWNfbWFjX3N0YXRpc3RpY3NfcmVzcG9uc2UuaW50ZXJmYWNlX2luZGV4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dS5nZXRfY21jX21hY19zdGF0aXN0aWNzX3Jlc3BvbnNlLmludmFsaWRfcm5nX3JlcXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT51LmdldF9jbWNfbWFjX3N0YXRpc3RpY3NfcmVzcG9uc2Uucm5nX2Fib3J0cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnUuZ2V0X2NtY19tYWNfc3RhdGlzdGljc19yZXNwb25zZS5pbnZhbGlkX3JlZ19yZXFzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dS5nZXRfY21jX21hY19zdGF0aXN0aWNzX3Jlc3BvbnNlLmZhaWxlZF9yZWdfcmVxcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnUuZ2V0X2NtY19tYWNfc3RhdGlzdGljc19yZXNwb25zZS5pbnZhbGlkX2RhdGFfcmVxcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnUuZ2V0X2NtY19tYWNfc3RhdGlzdGljc19yZXNwb25zZS50NXRpbWVvdXRzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfQ01DX0lOVEVSRkFDRVNfU1RBVElTVElDU19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTE3OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3N0YXRpc3RpY3NfcmVxdWVzdC5pbnRmX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3N0YXRpc3RpY3NfcmVxdWVzdC5pbnRmX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3N0YXRpc3RpY3NfcmVxdWVzdC5pbnRmX2luZGV4ID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiaW50Zl9pbmRleFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9nZXRfY21jX2ludGVyZmFjZXNfc3RhdGlzdGljc19yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3N0YXRpc3RpY3NfcmVxdWVzdC5pbnRmX2luZGV4ID0gKHVpbnQxNl90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19zdGF0aXN0aWNzX3JlcXVlc3QuaW50Zl9jb3VudCAqIHNpemVvZih1aW50MTZfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMTcgPSAwOyBpMTcgPCB0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19zdGF0aXN0aWNzX3JlcXVlc3QuaW50Zl9jb3VudDsgaTE3KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5nZXRfY21jX2ludGVyZmFjZXNfc3RhdGlzdGljc19yZXF1ZXN0LmludGZfaW5kZXhbaTE3XSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9DTUNfSU5URVJGQUNFU19TVEFUSVNUSUNTX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTE4OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3N0YXRpc3RpY3NfcmVzcG9uc2UuaW50ZXJmYWNlc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9jbWNfaW50ZXJmYWNlc19zdGF0aXN0aWNzX3Jlc3BvbnNlLmludGVyZmFjZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfY21jX2ludGVyZmFjZXNfc3RhdGlzdGljc19yZXNwb25zZS5uZXR3b3JrX2ludGVyZmFjZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJuZXR3b3JrX2ludGVyZmFjZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X2NtY19pbnRlcmZhY2VzX3N0YXRpc3RpY3NfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfY21jX2ludGVyZmFjZXNfc3RhdGlzdGljc19yZXNwb25zZS5uZXR3b3JrX2ludGVyZmFjZXMgPSAoYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGZfc3RhdHNfZGF0YSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZXRfY21jX2ludGVyZmFjZXNfc3RhdGlzdGljc19yZXNwb25zZS5pbnRlcmZhY2VzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRmX3N0YXRzX2RhdGEpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTE4ID0gMDsgaTE4IDwgdGhpcy0+dS5nZXRfY21jX2ludGVyZmFjZXNfc3RhdGlzdGljc19yZXNwb25zZS5pbnRlcmZhY2VzX2NvdW50OyBpMTgrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGZfc3RhdHNfZGF0YV91bnBhY2soJnRoaXMtPnUuZ2V0X2NtY19pbnRlcmZhY2VzX3N0YXRpc3RpY3NfcmVzcG9uc2UubmV0d29ya19pbnRlcmZhY2VzW2kxOF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1FPU19TRVJWSUNFX0ZMT1dfQ09ORklHX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMTk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19jb25maWdfcmVxdWVzdC5zdmNfZmxvd19pZGNvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfY29uZmlnX3JlcXVlc3Quc3ZjX2Zsb3dfaWRjb3VudCA+IDApICYmICh0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X2NvbmZpZ19yZXF1ZXN0LnN2Y19mbG93X2lkcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInN2Y19mbG93X2lkc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9nZXRfcW9zX3NlcnZpY2VfZmxvd19jb25maWdfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X2NvbmZpZ19yZXF1ZXN0LnN2Y19mbG93X2lkcyA9ICh1aW50MTZfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19jb25maWdfcmVxdWVzdC5zdmNfZmxvd19pZGNvdW50ICogc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxOSA9IDA7IGkxOSA8IHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfY29uZmlnX3JlcXVlc3Quc3ZjX2Zsb3dfaWRjb3VudDsgaTE5KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19jb25maWdfcmVxdWVzdC5zdmNfZmxvd19pZHNbaTE5XSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9RT1NfU0VSVklDRV9GTE9XX0NPTkZJR19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkyMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X2NvbmZpZ19yZXNwb25zZS5zdmNfZmxvd19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X2NvbmZpZ19yZXNwb25zZS5zdmNfZmxvd19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X2NvbmZpZ19yZXNwb25zZS5zdmNfZmxvd19kYXRhID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwic3ZjX2Zsb3dfZGF0YVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9nZXRfcW9zX3NlcnZpY2VfZmxvd19jb25maWdfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfcW9zX3NlcnZpY2VfZmxvd19jb25maWdfcmVzcG9uc2Uuc3ZjX2Zsb3dfZGF0YSA9IChiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2ZfY29uZmlnX2RhdGEgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfY29uZmlnX3Jlc3BvbnNlLnN2Y19mbG93X2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9jb25maWdfZGF0YSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMjAgPSAwOyBpMjAgPCB0aGlzLT51LmdldF9xb3Nfc2VydmljZV9mbG93X2NvbmZpZ19yZXNwb25zZS5zdmNfZmxvd19jb3VudDsgaTIwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9jb25maWdfZGF0YV91bnBhY2soJnRoaXMtPnUuZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfY29uZmlnX3Jlc3BvbnNlLnN2Y19mbG93X2RhdGFbaTIwXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfUU9TX1BBQ0tFVF9DTEFTU0lGSUVSX0NPTkZJR19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTIxOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZ2V0X3Fvc19wYWNrZXRfY2xhc3NpZmllcl9jb25maWdfcmVxdWVzdC5zdmNfZmxvd19pZGNvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3Fvc19wYWNrZXRfY2xhc3NpZmllcl9jb25maWdfcmVxdWVzdC5zdmNfZmxvd19pZGNvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3Fvc19wYWNrZXRfY2xhc3NpZmllcl9jb25maWdfcmVxdWVzdC5zdmNfZmxvd19pZHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJzdmNfZmxvd19pZHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X3Fvc19wYWNrZXRfY2xhc3NpZmllcl9jb25maWdfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmdldF9xb3NfcGFja2V0X2NsYXNzaWZpZXJfY29uZmlnX3JlcXVlc3Quc3ZjX2Zsb3dfaWRzID0gKHVpbnQxNl90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmdldF9xb3NfcGFja2V0X2NsYXNzaWZpZXJfY29uZmlnX3JlcXVlc3Quc3ZjX2Zsb3dfaWRjb3VudCAqIHNpemVvZih1aW50MTZfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMjEgPSAwOyBpMjEgPCB0aGlzLT51LmdldF9xb3NfcGFja2V0X2NsYXNzaWZpZXJfY29uZmlnX3JlcXVlc3Quc3ZjX2Zsb3dfaWRjb3VudDsgaTIxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5nZXRfcW9zX3BhY2tldF9jbGFzc2lmaWVyX2NvbmZpZ19yZXF1ZXN0LnN2Y19mbG93X2lkc1tpMjFdKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1FPU19QQUNLRVRfQ0xBU1NJRklFUl9DT05GSUdfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMjI7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5nZXRfcW9zX3BhY2tldF9jbGFzc2lmaWVyX2NvbmZpZ19yZXNwb25zZS5jbGFzc2lmaWVyX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3Fvc19wYWNrZXRfY2xhc3NpZmllcl9jb25maWdfcmVzcG9uc2UuY2xhc3NpZmllcl9jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9xb3NfcGFja2V0X2NsYXNzaWZpZXJfY29uZmlnX3Jlc3BvbnNlLmNsYXNzaWZpZXJfZGF0YSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImNsYXNzaWZpZXJfZGF0YVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9nZXRfcW9zX3BhY2tldF9jbGFzc2lmaWVyX2NvbmZpZ19yZXNwb25zZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmdldF9xb3NfcGFja2V0X2NsYXNzaWZpZXJfY29uZmlnX3Jlc3BvbnNlLmNsYXNzaWZpZXJfZGF0YSA9IChiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfY2xhc3NpZmllcl9jb25maWdfZGF0YSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZXRfcW9zX3BhY2tldF9jbGFzc2lmaWVyX2NvbmZpZ19yZXNwb25zZS5jbGFzc2lmaWVyX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19jbGFzc2lmaWVyX2NvbmZpZ19kYXRhKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyMiA9IDA7IGkyMiA8IHRoaXMtPnUuZ2V0X3Fvc19wYWNrZXRfY2xhc3NpZmllcl9jb25maWdfcmVzcG9uc2UuY2xhc3NpZmllcl9jb3VudDsgaTIyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19jbGFzc2lmaWVyX2NvbmZpZ19kYXRhX3VucGFjaygmdGhpcy0+dS5nZXRfcW9zX3BhY2tldF9jbGFzc2lmaWVyX2NvbmZpZ19yZXNwb25zZS5jbGFzc2lmaWVyX2RhdGFbaTIyXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfVVBTVFJFQU1fSU5QVVRfUE9XRVJfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmdldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVscyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVwc3RyZWFtX2NoYW5uZWxzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX2dldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHMgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc19jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHMsIHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9VUFNUUkVBTV9JTlBVVF9QT1dFUl9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkyMzsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmdldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXNwb25zZS51cHN0cmVhbV9jaGFubmVscyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVwc3RyZWFtX2NoYW5uZWxzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX2dldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXNwb25zZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmdldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXNwb25zZS51cHN0cmVhbV9jaGFubmVscyA9IChiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Bvd2VyICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmdldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXNwb25zZS51cHN0cmVhbV9jaGFubmVsc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Bvd2VyKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyMyA9IDA7IGkyMyA8IHRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50OyBpMjMrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wb3dlcl91bnBhY2soJnRoaXMtPnUuZ2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3Jlc3BvbnNlLnVwc3RyZWFtX2NoYW5uZWxzW2kyM10sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX1VQU1RSRUFNX0lOUFVUX1BPV0VSX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMjQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5zZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1cHN0cmVhbV9jaGFubmVsc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9zZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnNldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzID0gKGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcG93ZXIgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuc2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wb3dlcikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMjQgPSAwOyBpMjQgPCB0aGlzLT51LnNldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50OyBpMjQrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wb3dlcl91bnBhY2soJnRoaXMtPnUuc2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNbaTI0XSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfVVBTVFJFQU1fSU5QVVRfUE9XRVJfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVzdWx0X2NvZGVfdW5wYWNrKCZ0aGlzLT51LnNldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXNwb25zZS5yZXN1bHRfY29kZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5zZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVzcG9uc2UuY2hhbm5lbF9vbmVfcG93ZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LnNldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXNwb25zZS5jaGFubmVsX3R3b19wb3dlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuc2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3Jlc3BvbnNlLmNoYW5uZWxfdGhyZWVfcG93ZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LnNldF91cHN0cmVhbV9pbnB1dF9wb3dlcl9yZXNwb25zZS5jaGFubmVsX2ZvdXJfcG93ZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9BRERfQ05VU19UT19MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuc2V0X2FkZF9jbnVzX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QuZ3JvdXBfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3JlcXVlc3Rfb3B0aW9uX3VucGFjaygmdGhpcy0+dS5zZXRfYWRkX2NudXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5yZXF1ZXN0X29wdGlvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9tYWNfYWRkcl9yYW5nZV91bnBhY2soJnRoaXMtPnUuc2V0X2FkZF9jbnVzX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QuY251X21hY19yYW5nZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9BRERfQ05VU19UT19MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnNldF9hZGRfY251c190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXNwb25zZS5ncm91cF9pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVzdWx0X2NvZGVfdW5wYWNrKCZ0aGlzLT51LnNldF9hZGRfY251c190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXNwb25zZS5yZXN1bHRfY29kZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfRVhDTFVERV9DTlVTX0ZST01fTE9BRF9CQUxBTkNJTkdfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXF1ZXN0X29wdGlvbl91bnBhY2soJnRoaXMtPnUuc2V0X2V4Y2x1ZGVfY251c19mcm9tX2xvYWRfYmFsYW5jaW5nX3JlcXVlc3QucmVxdWVzdF9vcHRpb24sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+dS5zZXRfZXhjbHVkZV9jbnVzX2Zyb21fbG9hZF9iYWxhbmNpbmdfcmVxdWVzdC5jbnVfbWFjX2FkZHJlc3Nfc3RhcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX21hY19hZGRyZXNzKGJ1ZiwgJnRoaXMtPnUuc2V0X2V4Y2x1ZGVfY251c19mcm9tX2xvYWRfYmFsYW5jaW5nX3JlcXVlc3QuY251X21hY19hZGRyZXNzX2VuZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0VYQ0xVREVfQ05VU19GUk9NX0xPQURfQkFMQU5DSU5HX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3Jlc3VsdF9jb2RlX3VucGFjaygmdGhpcy0+dS5zZXRfZXhjbHVkZV9jbnVzX2Zyb21fbG9hZF9iYWxhbmNpbmdfcmVzcG9uc2UucmVzdWx0X2NvZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0ZVTExfTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkyNTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QuZ3JvdXBfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2xvYWRfYmFsYW5jZV9tZXRob2RfdW5wYWNrKCZ0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QubWV0aG9kLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZG93bnN0cmVhbV9jaGFubmVsc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LmRvd25zdHJlYW1fY2hhbm5lbHMsIHRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5kb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QudXBzdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVscyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVwc3RyZWFtX2NoYW5uZWxzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX3NldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVsc19jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC51cHN0cmVhbV9jaGFubmVscywgdGhpcy0+dS5zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QucmVzdHJpY3Rpb25zX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5yZXN0cmljdGlvbnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LnJlc3RyaWN0aW9ucyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJlc3RyaWN0aW9uc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVxdWVzdC5yZXN0cmljdGlvbnMgPSAoYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X21hY19hZGRyX3JhbmdlICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QucmVzdHJpY3Rpb25zX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9tYWNfYWRkcl9yYW5nZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMjUgPSAwOyBpMjUgPCB0aGlzLT51LnNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3QucmVzdHJpY3Rpb25zX2NvdW50OyBpMjUrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X21hY19hZGRyX3JhbmdlX3VucGFjaygmdGhpcy0+dS5zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0LnJlc3RyaWN0aW9uc1tpMjVdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9GVUxMX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuc2V0X2Z1bGxfbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2UuZ3JvdXBfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3Jlc3VsdF9jb2RlX3VucGFjaygmdGhpcy0+dS5zZXRfZnVsbF9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXNwb25zZS5yZXN1bHRfY29kZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9DTUNfU1lTVEVNX0VWRU5UX01FU1NBR0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0RPV05TVFJFQU1fQk9ORElOR19HUk9VUF9TVEFUVVNfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRE9XTlNUUkVBTV9CT05ESU5HX0dST1VQX1NUQVRVU19SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRVhDTFVERURfQUNUSVZFX0NOVVNfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRVhDTFVERURfQUNUSVZFX0NOVVNfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0VYQ0xVREVEX0NOVV9DT05GSUdVUkFUSU9OX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9FWENMVURFRF9DTlVTX0NPTkZJR1VSQVRJT05fUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRlVMTF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9GVUxMX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9BQ1RJVkVfQ05VU19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9BQ1RJVkVfQ05VU19SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBfQ05VX0NPTkZJR1VSQVRJT05fUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBfQ05VX0NPTkZJR1VSQVRJT05fUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQX0RPV05TVFJFQU1TX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQX0RPV05TVFJFQU1TX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9VUFNUUkVBTVNfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBfVVBTVFJFQU1TX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9MT0FEX0JBTEFOQ0lOR19HUk9VUFNfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBTX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9NQVhfVVBTVFJFQU1fUkZBVFRFTlVBVElPTl9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9NQVhfVVBTVFJFQU1fUkZBVFRFTlVBVElPTl9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTU9WRV9DTlVfRE9XTlNUUkVBTV9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9NT1ZFX0NOVV9ET1dOU1RSRUFNX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9NT1ZFX0NOVV9VUFNUUkVBTV9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9NT1ZFX0NOVV9VUFNUUkVBTV9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfU0VSVklDRVNfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfU0VSVklDRVNfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1VQU1RSRUFNX0JPTkRJTkdfR1JPVVBfU1RBVFVTX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1VQU1RSRUFNX0JPTkRJTkdfR1JPVVBfU1RBVFVTX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1JFR19SU1BfRVZFTlRfTUVTU0FHRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfTUFYX1VQU1RSRUFNX1JGQVRURU5VQVRJT05fUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfTUFYX1VQU1RSRUFNX1JGQVRURU5VQVRJT05fUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX01PVkVfQ05VX0RPV05TVFJFQU1fUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfTU9WRV9DTlVfRE9XTlNUUkVBTV9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfTU9WRV9DTlVfVVBTVFJFQU1fUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfTU9WRV9DTlVfVVBTVFJFQU1fUkVTUE9OU0U6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfb3Bjb2RlIG9wY29kZTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X29wY29kZV91bnBhY2soJm9wY29kZSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG9wY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0RPV05TVFJFQU1fQ09ORklHX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBkb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2JyY21fZG93bnN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXMpICogZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBkb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50ICogMTMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9ET1dOU1RSRUFNX0NPTkZJR19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdCkgKiBkb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQgKiAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRE9XTlNUUkVBTV9DT05GSUdfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50OF90KSAqIGRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCAqIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9ET1dOU1RSRUFNX0NPTkZJR19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV9kb3duc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllcykgKiBkb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQgKiAxMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX1VQU1RSRUFNX0NPTkZJR19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgdXBzdHJlYW1fY2hhbm5lbHNfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmdXBzdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzKSAqIHVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIHVwc3RyZWFtX2NoYW5uZWxzX2NvdW50ICogMzMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9VUFNUUkVBTV9DT05GSUdfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCB1cHN0cmVhbV9jaGFubmVsc19jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZ1cHN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdCkgKiB1cHN0cmVhbV9jaGFubmVsc19jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCB1cHN0cmVhbV9jaGFubmVsc19jb3VudCAqIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9VUFNUUkVBTV9DT05GSUdfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IHVwc3RyZWFtX2NoYW5uZWxzX2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogdXBzdHJlYW1fY2hhbm5lbHNfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgdXBzdHJlYW1fY2hhbm5lbHNfY291bnQgKiAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfVVBTVFJFQU1fQ09ORklHX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgdXBzdHJlYW1fY2hhbm5lbHNfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmdXBzdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzKSAqIHVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIHVwc3RyZWFtX2NoYW5uZWxzX2NvdW50ICogMzMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9DUkVBVEVfTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfQ1JFQVRFX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfQUREX0RPV05TVFJFQU1TX1RPX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBkb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX29wdGlvbikgKiBkb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQgKiAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfQUREX0RPV05TVFJFQU1TX1RPX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgZG93bnN0cmVhbV9jaGFubmVsc19jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9yZXN1bHQpICogZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBkb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50ICogMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0FERF9VUFNUUkVBTVNfVE9fTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IHVwc3RyZWFtX2NoYW5uZWxzX2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmdXBzdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9vcHRpb24pICogdXBzdHJlYW1fY2hhbm5lbHNfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgdXBzdHJlYW1fY2hhbm5lbHNfY291bnQgKiAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfQUREX1VQU1RSRUFNU19UT19MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IHVwc3RyZWFtX2NoYW5uZWxzX2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmdXBzdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9yZXN1bHQpICogdXBzdHJlYW1fY2hhbm5lbHNfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgdXBzdHJlYW1fY2hhbm5lbHNfY291bnQgKiAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfU0lHTkFMX1FVQUxJVFlfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IHVwc3RyZWFtX2ludGVyZmFjZXNfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmdXBzdHJlYW1faW50ZXJmYWNlc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50MTZfdCkgKiB1cHN0cmVhbV9pbnRlcmZhY2VzX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIHVwc3RyZWFtX2ludGVyZmFjZXNfY291bnQgKiAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfU0lHTkFMX1FVQUxJVFlfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCB1cHN0cmVhbV9pbnRlcmZhY2VzX2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJnVwc3RyZWFtX2ludGVyZmFjZXNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fc2lnbmFsX3F1YWxpdHkpICogdXBzdHJlYW1faW50ZXJmYWNlc19jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCB1cHN0cmVhbV9pbnRlcmZhY2VzX2NvdW50ICogMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9DTlVfU1RBVFVTX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgY251X2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZjbnVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb3NfbWFjX2FkZHJlc3MpICogY251X2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGNudV9jb3VudCAqIDYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9DTlVfU1RBVFVTX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IGNudV9jb3VudDsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYocGFja2VkLCAmY251X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9zdGF0dXNfZGF0YSkgKiBjbnVfY291bnQpOworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IGNudV9jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3N0YXR1c19kYXRhX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfUU9TX1NFUlZJQ0VfRkxPV19TVEFUSVNUSUNTX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBzdmNfZmxvd19pZGNvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJnN2Y19mbG93X2lkY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDE2X3QpICogc3ZjX2Zsb3dfaWRjb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBzdmNfZmxvd19pZGNvdW50ICogMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1FPU19TRVJWSUNFX0ZMT1dfU1RBVElTVElDU19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IHN2Y19mbG93X2lkY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmc3ZjX2Zsb3dfaWRjb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2Zfc3RhdHNfZGF0YSkgKiBzdmNfZmxvd19pZGNvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIHN2Y19mbG93X2lkY291bnQgKiAzNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0NNQ19JTlRFUkZBQ0VTX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfQ01DX0lOVEVSRkFDRVNfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgaW50Zl9jb3VudDsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYocGFja2VkLCAmaW50Zl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2VfZGF0YSkgKiBpbnRmX2NvdW50KTsKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCBpbnRmX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX2RhdGFfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9DTUNfTUFDX1NUQVRJU1RJQ1NfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9DTUNfTUFDX1NUQVRJU1RJQ1NfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfQ01DX0lOVEVSRkFDRVNfU1RBVElTVElDU19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaW50Zl9jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZpbnRmX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQxNl90KSAqIGludGZfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgaW50Zl9jb3VudCAqIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9DTUNfSU5URVJGQUNFU19TVEFUSVNUSUNTX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaW50ZXJmYWNlc19jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZpbnRlcmZhY2VzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRmX3N0YXRzX2RhdGEpICogaW50ZXJmYWNlc19jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBpbnRlcmZhY2VzX2NvdW50ICogMTA1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfUU9TX1NFUlZJQ0VfRkxPV19DT05GSUdfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IHN2Y19mbG93X2lkY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmc3ZjX2Zsb3dfaWRjb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50MTZfdCkgKiBzdmNfZmxvd19pZGNvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIHN2Y19mbG93X2lkY291bnQgKiAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfUU9TX1NFUlZJQ0VfRkxPV19DT05GSUdfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBzdmNfZmxvd19jb3VudDsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkyOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJnN2Y19mbG93X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9jb25maWdfZGF0YSkgKiBzdmNfZmxvd19jb3VudCk7CisgICAgICAgICAgICAgICAgZm9yIChpMiA9IDA7IGkyIDwgc3ZjX2Zsb3dfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9jb25maWdfZGF0YV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1FPU19QQUNLRVRfQ0xBU1NJRklFUl9DT05GSUdfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IHN2Y19mbG93X2lkY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmc3ZjX2Zsb3dfaWRjb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50MTZfdCkgKiBzdmNfZmxvd19pZGNvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIHN2Y19mbG93X2lkY291bnQgKiAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfUU9TX1BBQ0tFVF9DTEFTU0lGSUVSX0NPTkZJR19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGNsYXNzaWZpZXJfY291bnQ7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMzsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZjbGFzc2lmaWVyX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19jbGFzc2lmaWVyX2NvbmZpZ19kYXRhKSAqIGNsYXNzaWZpZXJfY291bnQpOworICAgICAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IGNsYXNzaWZpZXJfY291bnQ7IGkzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19jbGFzc2lmaWVyX2NvbmZpZ19kYXRhX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfVVBTVFJFQU1fSU5QVVRfUE9XRVJfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IHVwc3RyZWFtX2NoYW5uZWxzX2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJnVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogdXBzdHJlYW1fY2hhbm5lbHNfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgdXBzdHJlYW1fY2hhbm5lbHNfY291bnQgKiAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfVVBTVFJFQU1fSU5QVVRfUE9XRVJfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCB1cHN0cmVhbV9jaGFubmVsc19jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZ1cHN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Bvd2VyKSAqIHVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIHVwc3RyZWFtX2NoYW5uZWxzX2NvdW50ICogMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX1VQU1RSRUFNX0lOUFVUX1BPV0VSX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCB1cHN0cmVhbV9jaGFubmVsc19jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZ1cHN0cmVhbV9jaGFubmVsc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Bvd2VyKSAqIHVwc3RyZWFtX2NoYW5uZWxzX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIHVwc3RyZWFtX2NoYW5uZWxzX2NvdW50ICogMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX1VQU1RSRUFNX0lOUFVUX1BPV0VSX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfQUREX0NOVVNfVE9fTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0FERF9DTlVTX1RPX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfRVhDTFVERV9DTlVTX0ZST01fTE9BRF9CQUxBTkNJTkdfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfRVhDTFVERV9DTlVTX0ZST01fTE9BRF9CQUxBTkNJTkdfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfRlVMTF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgZG93bnN0cmVhbV9jaGFubmVsc19jb3VudDsKKyAgICAgICAgICAgICAgICB1aW50OF90IHVwc3RyZWFtX2NoYW5uZWxzX2NvdW50OworICAgICAgICAgICAgICAgIHVpbnQ4X3QgcmVzdHJpY3Rpb25zX2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZkb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogZG93bnN0cmVhbV9jaGFubmVsc19jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBkb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50ICogMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmdXBzdHJlYW1fY2hhbm5lbHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiB1cHN0cmVhbV9jaGFubmVsc19jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCB1cHN0cmVhbV9jaGFubmVsc19jb3VudCAqIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJnJlc3RyaWN0aW9uc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfbWFjX2FkZHJfcmFuZ2UpICogcmVzdHJpY3Rpb25zX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIHJlc3RyaWN0aW9uc19jb3VudCAqIDEyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfRlVMTF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfQ01DX1NZU1RFTV9FVkVOVF9NRVNTQUdFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9ET1dOU1RSRUFNX0JPTkRJTkdfR1JPVVBfU1RBVFVTX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0RPV05TVFJFQU1fQk9ORElOR19HUk9VUF9TVEFUVVNfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0VYQ0xVREVEX0FDVElWRV9DTlVTX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0VYQ0xVREVEX0FDVElWRV9DTlVTX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9FWENMVURFRF9DTlVfQ09ORklHVVJBVElPTl9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRVhDTFVERURfQ05VU19DT05GSUdVUkFUSU9OX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0ZVTExfTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRlVMTF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBfQUNUSVZFX0NOVVNfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBfQUNUSVZFX0NOVVNfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQX0NOVV9DT05GSUdVUkFUSU9OX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQX0NOVV9DT05GSUdVUkFUSU9OX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9ET1dOU1RSRUFNU19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9ET1dOU1RSRUFNU19SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBfVVBTVFJFQU1TX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQX1VQU1RSRUFNU19SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBTX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQU19SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTUFYX1VQU1RSRUFNX1JGQVRURU5VQVRJT05fUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTUFYX1VQU1RSRUFNX1JGQVRURU5VQVRJT05fUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX01PVkVfQ05VX0RPV05TVFJFQU1fUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTU9WRV9DTlVfRE9XTlNUUkVBTV9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTU9WRV9DTlVfVVBTVFJFQU1fUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTU9WRV9DTlVfVVBTVFJFQU1fUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1NFUlZJQ0VTX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1NFUlZJQ0VTX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9VUFNUUkVBTV9CT05ESU5HX0dST1VQX1NUQVRVU19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9VUFNUUkVBTV9CT05ESU5HX0dST1VQX1NUQVRVU19SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9SRUdfUlNQX0VWRU5UX01FU1NBR0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX01BWF9VUFNUUkVBTV9SRkFUVEVOVUFUSU9OX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX01BWF9VUFNUUkVBTV9SRkFUVEVOVUFUSU9OX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9NT1ZFX0NOVV9ET1dOU1RSRUFNX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX01PVkVfQ05VX0RPV05TVFJFQU1fUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX01PVkVfQ05VX1VQU1RSRUFNX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX01PVkVfQ05VX1VQU1RSRUFNX1JFU1BPTlNFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jZXJ0aWZpY2F0ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jZXJ0aWZpY2F0ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MjQoYnVmLCB0aGlzLT5zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHVpbnQyNF90X3RvX3VpbnQzMl90KHRoaXMtPnNpemUpID4gMCkgJiYgKHRoaXMtPmNlcnRpZmljYXRlX2RhdGEgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY2VydGlmaWNhdGVfZGF0YVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jZXJ0aWZpY2F0ZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT5jZXJ0aWZpY2F0ZV9kYXRhLCB1aW50MjRfdF90b191aW50MzJfdCh0aGlzLT5zaXplKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY2VydGlmaWNhdGVfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2NlcnRpZmljYXRlICp0aGlzKQoreworICAgIHJldHVybiAzICsgdWludDI0X3RfdG9fdWludDMyX3QodGhpcy0+c2l6ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jZXJ0aWZpY2F0ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2NlcnRpZmljYXRlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTI0KGJ1ZiwgJnRoaXMtPnNpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodWludDI0X3RfdG9fdWludDMyX3QodGhpcy0+c2l6ZSkgPiAwKSAmJiAodGhpcy0+Y2VydGlmaWNhdGVfZGF0YSA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImNlcnRpZmljYXRlX2RhdGFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY2VydGlmaWNhdGVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+Y2VydGlmaWNhdGVfZGF0YSA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh1aW50MjRfdF90b191aW50MzJfdCh0aGlzLT5zaXplKSAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPmNlcnRpZmljYXRlX2RhdGEsIHVpbnQyNF90X3RvX3VpbnQzMl90KHRoaXMtPnNpemUpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2NlcnRpZmljYXRlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQyNF90IHNpemU7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTI0KHBhY2tlZCwgJnNpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiB1aW50MjRfdF90b191aW50MzJfdChzaXplKSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCB1aW50MjRfdF90b191aW50MzJfdChzaXplKSAqIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2FjdGlvbl92YWx1ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfYWN0aW9uX3ZhbHVlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uX3BhY2sodGhpcy0+bGVhZiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fUEhZX0FETUlOX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnBoeV9hZG1pbl9jb250cm9sLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnBoeV9hZG1pbl9jb250cm9sLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2VuYWJsZWRfc3RhdGVfcGFjayh0aGlzLT51LnBoeV9hZG1pbl9jb250cm9sLnN0YXRlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9BVVRPX1JFTkVHT1RJQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9BVVRPX0FETUlOX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmF1dG9fYWRtaW5fY29udHJvbC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5hdXRvX2FkbWluX2NvbnRyb2wud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZW5hYmxlZF9zdGF0ZV9wYWNrKHRoaXMtPnUuYXV0b19hZG1pbl9jb250cm9sLnN0YXRlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9NQUNfQUREX0dST1VQX0FERFJFU1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9NQUNfREVMX0dST1VQX0FERFJFU1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9NQUNfSU5JVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BQ19TRUxGX1RFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9NQVVfQURNSU5fQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BVV9SRVNFVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX1BPUlRfQURNSU5fQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX1JQVF9JTl9TRVJWSUNFX1RFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9SUFRfUkVTRVQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfYWN0aW9uX3ZhbHVlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfYWN0aW9uX3ZhbHVlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMjsKKyAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fUEhZX0FETUlOX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fQVVUT19SRU5FR09USUFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fQVVUT19BRE1JTl9DT05UUk9MOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BQ19BRERfR1JPVVBfQUREUkVTUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BQ19ERUxfR1JPVVBfQUREUkVTUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BQ19JTklUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fTUFDX1NFTEZfVEVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BVV9BRE1JTl9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fTUFVX1JFU0VUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fUE9SVF9BRE1JTl9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fUlBUX0lOX1NFUlZJQ0VfVEVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX1JQVF9SRVNFVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19hY3Rpb25fdmFsdWVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfYWN0aW9uX3ZhbHVlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uX3VucGFjaygmdGhpcy0+bGVhZiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fUEhZX0FETUlOX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUucGh5X2FkbWluX2NvbnRyb2wud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnBoeV9hZG1pbl9jb250cm9sLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUucGh5X2FkbWluX2NvbnRyb2wud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LnBoeV9hZG1pbl9jb250cm9sLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19lbmFibGVkX3N0YXRlX3VucGFjaygmdGhpcy0+dS5waHlfYWRtaW5fY29udHJvbC5zdGF0ZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUucGh5X2FkbWluX2NvbnRyb2wud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LnBoeV9hZG1pbl9jb250cm9sLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX0FVVE9fUkVORUdPVElBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX0FVVE9fQURNSU5fQ09OVFJPTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5hdXRvX2FkbWluX2NvbnRyb2wud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmF1dG9fYWRtaW5fY29udHJvbC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LmF1dG9fYWRtaW5fY29udHJvbC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuYXV0b19hZG1pbl9jb250cm9sLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19lbmFibGVkX3N0YXRlX3VucGFjaygmdGhpcy0+dS5hdXRvX2FkbWluX2NvbnRyb2wuc3RhdGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LmF1dG9fYWRtaW5fY29udHJvbC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuYXV0b19hZG1pbl9jb250cm9sLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BQ19BRERfR1JPVVBfQUREUkVTUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BQ19ERUxfR1JPVVBfQUREUkVTUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BQ19JTklUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fTUFDX1NFTEZfVEVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BVV9BRE1JTl9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fTUFVX1JFU0VUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fUE9SVF9BRE1JTl9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fUlBUX0lOX1NFUlZJQ0VfVEVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX1JQVF9SRVNFVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2FjdGlvbl92YWx1ZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uIGxlYWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uX3VucGFjaygmbGVhZiwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fUEhZX0FETUlOX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9BVVRPX1JFTkVHT1RJQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9BVVRPX0FETUlOX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9NQUNfQUREX0dST1VQX0FERFJFU1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9NQUNfREVMX0dST1VQX0FERFJFU1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9NQUNfSU5JVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BQ19TRUxGX1RFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9NQVVfQURNSU5fQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BVV9SRVNFVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX1BPUlRfQURNSU5fQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX1JQVF9JTl9TRVJWSUNFX1RFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9SUFRfUkVTRVQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19hbGFybV9lbnRyeV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfYWxhcm1fZW50cnkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9tYW5hZ2VtZW50X29iamVjdF9wYWNrKHRoaXMtPm9iamVjdF90eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5vYmplY3RfaW5zdGFuY2UpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfYWxhcm1faWRfcGFjayh0aGlzLT5hbGFybV9pZCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmFsYXJtX2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfUE9XRVJfQUxBUk06CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUub251X3Bvd2VyX2FsYXJtLnRpbWVfc3RhbXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X3Bvd2VyX2FsYXJtLnN0YXRlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfcG93ZXJfYWxhcm1fY29kZV9wYWNrKHRoaXMtPnUub251X3Bvd2VyX2FsYXJtLmFsYXJtX2NvZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX1BPTl9JRl9TV0lUQ0g6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUub251X3Bvbl9pZl9zd2l0Y2gudGltZV9zdGFtcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfcG9uX2lmX3N3aXRjaC5zdGF0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3Bvbl9pZl9zd2l0Y2hfY29kZV9wYWNrKHRoaXMtPnUub251X3Bvbl9pZl9zd2l0Y2guYWxhcm1fY29kZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9DQVJEX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0NBUkRfU0VMRl9URVNUX0ZBSUxVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfRTFMT1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfRTFQT1JUX0ZBSUxVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfRTFUSU1JTkdfVU5MT0NLOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0VUSF9QT1JUX0FVVE9fTkVHX0ZBSUxVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfRVRIX1BPUlRfQ09OR0VTVElPTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9FVEhfUE9SVF9GQUlMVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0VUSF9QT1JUX0xPT1BCQUNLOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0VUSF9QT1JUX0xPUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfQkFUVEVSWV9GQUlMVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9CQVRURVJZX01JU1NJTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX0JBVFRFUllfVk9MVF9MT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX0VRVUlQTUVOVF9BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfSUFEX0NPTk5FQ1RJT05fRkFJTFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfUEhZU0lDQUxfSU5TVFJVQ1RJT05fQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX1NFTEZfVEVTVF9GQUlMVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9TTEVFUF9TVEFUVVNfVVBEQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9URU1QX0hJR0hfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX1RFTVBfTE9XX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fQ1JDX0VSUk9SX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0RJU0NBUkRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0RJU0NBUkRTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fRFJPUF9FVkVOVFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fRFJPUF9FVkVSTlRTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fRVJST1JTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0VSUk9SU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0ZSQUdNRU5UU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9GUkFHTUVOVFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9KQUJCRVJTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0pBQkJFUlNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9PVkVSU0laRV9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fT1ZFUlNJWkVfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fVU5ERVJTSVpFX0ZSQU1FU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1JYX1BPV0VSX0hJR0hfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1JYX1BPV0VSX0hJR0hfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfUlhfUE9XRVJfTE9XX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9SWF9QT1dFUl9MT1dfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVEVNUF9ISUdIX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9URU1QX0hJR0hfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVEVNUF9MT1dfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RFTVBfTE9XX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RYX0JJQVNfSElHSF9BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVFhfQklBU19ISUdIX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RYX0JJQVNfTE9XX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9UWF9CSUFTX0xPV19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9UWF9QT1dFUl9ISUdIX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9UWF9QT1dFUl9ISUdIX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RYX1BPV0VSX0xPV19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVFhfUE9XRVJfTE9XX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fRElTQ0FSRFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0RJU0NBUkRTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0RST1BfRVZFTlRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9EUk9QX0VWRU5UU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9FUlJPU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fRVJST1NfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fRlJBR01FTlRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9GUkFHTUVOVFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fSkFCQkVSU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fSkFCQkVSU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9PVkVSU0laRV9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX09WRVJTSVpFX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1ZDQ19ISUdIX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9WQ0NfSElHSF9XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9WQ0NfTE9XX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9WQ0NfTE9XX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fRElTQ0FSRFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0RJU0NBUkRTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0RST1BfRVZFTlRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9EUk9QX0VWRU5UU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9FUlJPUlNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0VSUk9SU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9GUkFHTUVOVFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0ZSQUdNRU5UU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9KQUJCRVJTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9KQUJCRVJTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX09WRVJTSVpFX0ZSQU1FU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fT1ZFUlNJWkVfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX1VOREVSU0laRV9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX1VOREVSU0laRV9GUkFNRVNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1NUQVRVU19DSEFOR0VfVElNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9TVEFUVVNfQ0hBTkdFX1RJTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9DUkNfRVJST1JfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fQ1JDX0VSUk9SX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRElTQ0FSRFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9ESVNDQVJEU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRFJPUF9FVkVOVFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9EUk9QX0VWRU5UU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRVJST1JTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRVJST1JTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9GUkFHTUVOVFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9GUkFHTUVOVFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0pBQkJFUlNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9KQUJCRVJTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9PVkVSU0laRV9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9PVkVSU0laRV9GUkFNRVNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX1VOREVSU0laRV9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9UU19QT1JUX0ZBSUxVUkU6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZGVmLnRpbWVfc3RhbXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZGVmLnN0YXRlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfYWxhcm1fZW50cnlfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19hbGFybV9lbnRyeSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDg7CisgICAgc3dpdGNoICh0aGlzLT5hbGFybV9pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX1BPV0VSX0FMQVJNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfUE9OX0lGX1NXSVRDSDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfQ0FSRF9BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9DQVJEX1NFTEZfVEVTVF9GQUlMVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0UxTE9TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0UxUE9SVF9GQUlMVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0UxVElNSU5HX1VOTE9DSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9FVEhfUE9SVF9BVVRPX05FR19GQUlMVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0VUSF9QT1JUX0NPTkdFU1RJT046CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfRVRIX1BPUlRfRkFJTFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9FVEhfUE9SVF9MT09QQkFDSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9FVEhfUE9SVF9MT1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX0JBVFRFUllfRkFJTFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfQkFUVEVSWV9NSVNTSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9CQVRURVJZX1ZPTFRfTE9XOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9FUVVJUE1FTlRfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX0lBRF9DT05ORUNUSU9OX0ZBSUxVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX1BIWVNJQ0FMX0lOU1RSVUNUSU9OX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9TRUxGX1RFU1RfRkFJTFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfU0xFRVBfU1RBVFVTX1VQREFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfVEVNUF9ISUdIX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9URU1QX0xPV19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9DUkNfRVJST1JfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9ESVNDQVJEU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9ESVNDQVJEU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0RST1BfRVZFTlRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0RST1BfRVZFUk5UU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0VSUk9SU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9FUlJPUlNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9GUkFHTUVOVFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fRlJBR01FTlRTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fSkFCQkVSU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9KQUJCRVJTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fT1ZFUlNJWkVfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX09WRVJTSVpFX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX1VOREVSU0laRV9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fVU5ERVJTSVpFX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9SWF9QT1dFUl9ISUdIX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9SWF9QT1dFUl9ISUdIX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1JYX1BPV0VSX0xPV19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfUlhfUE9XRVJfTE9XX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RFTVBfSElHSF9BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVEVNUF9ISUdIX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RFTVBfTE9XX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9URU1QX0xPV19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9UWF9CSUFTX0hJR0hfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RYX0JJQVNfSElHSF9XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9UWF9CSUFTX0xPV19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVFhfQklBU19MT1dfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVFhfUE9XRVJfSElHSF9BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVFhfUE9XRVJfSElHSF9XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9UWF9QT1dFUl9MT1dfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RYX1BPV0VSX0xPV19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9DUkNfRVJST1JfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9DUkNfRVJST1JfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0RJU0NBUkRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9ESVNDQVJEU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9EUk9QX0VWRU5UU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fRFJPUF9FVkVOVFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fRVJST1NfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0VSUk9TX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0ZSQUdNRU5UU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fRlJBR01FTlRTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0pBQkJFUlNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0pBQkJFUlNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fT1ZFUlNJWkVfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9PVkVSU0laRV9GUkFNRVNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fVU5ERVJTSVpFX0ZSQU1FU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fVU5ERVJTSVpFX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9WQ0NfSElHSF9BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVkNDX0hJR0hfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVkNDX0xPV19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVkNDX0xPV19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9DUkNfRVJST1JfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9DUkNfRVJST1JfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0RJU0NBUkRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9ESVNDQVJEU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9EUk9QX0VWRU5UU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fRFJPUF9FVkVOVFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fRVJST1JTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9FUlJPUlNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fRlJBR01FTlRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9GUkFHTUVOVFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fSkFCQkVSU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fSkFCQkVSU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9PVkVSU0laRV9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX09WRVJTSVpFX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9TVEFUVVNfQ0hBTkdFX1RJTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfU1RBVFVTX0NIQU5HRV9USU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fQ1JDX0VSUk9SX0ZSQU1FU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0RJU0NBUkRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRElTQ0FSRFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0RST1BfRVZFTlRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRFJPUF9FVkVOVFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0VSUk9SU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0VSUk9SU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRlJBR01FTlRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRlJBR01FTlRTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9KQUJCRVJTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fSkFCQkVSU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fT1ZFUlNJWkVfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fT1ZFUlNJWkVfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fVU5ERVJTSVpFX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPVFNfUE9SVF9GQUlMVVJFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfYWxhcm1fZW50cnlfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfYWxhcm1fZW50cnkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9tYW5hZ2VtZW50X29iamVjdF91bnBhY2soJnRoaXMtPm9iamVjdF90eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5vYmplY3RfaW5zdGFuY2UpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfYWxhcm1faWRfdW5wYWNrKCZ0aGlzLT5hbGFybV9pZCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmFsYXJtX2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfUE9XRVJfQUxBUk06CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUub251X3Bvd2VyX2FsYXJtLnRpbWVfc3RhbXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUub251X3Bvd2VyX2FsYXJtLnN0YXRlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfcG93ZXJfYWxhcm1fY29kZV91bnBhY2soJnRoaXMtPnUub251X3Bvd2VyX2FsYXJtLmFsYXJtX2NvZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX1BPTl9JRl9TV0lUQ0g6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUub251X3Bvbl9pZl9zd2l0Y2gudGltZV9zdGFtcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5vbnVfcG9uX2lmX3N3aXRjaC5zdGF0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3Bvbl9pZl9zd2l0Y2hfY29kZV91bnBhY2soJnRoaXMtPnUub251X3Bvbl9pZl9zd2l0Y2guYWxhcm1fY29kZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9DQVJEX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0NBUkRfU0VMRl9URVNUX0ZBSUxVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfRTFMT1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfRTFQT1JUX0ZBSUxVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfRTFUSU1JTkdfVU5MT0NLOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0VUSF9QT1JUX0FVVE9fTkVHX0ZBSUxVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfRVRIX1BPUlRfQ09OR0VTVElPTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9FVEhfUE9SVF9GQUlMVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0VUSF9QT1JUX0xPT1BCQUNLOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0VUSF9QT1JUX0xPUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfQkFUVEVSWV9GQUlMVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9CQVRURVJZX01JU1NJTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX0JBVFRFUllfVk9MVF9MT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX0VRVUlQTUVOVF9BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfSUFEX0NPTk5FQ1RJT05fRkFJTFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfUEhZU0lDQUxfSU5TVFJVQ1RJT05fQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX1NFTEZfVEVTVF9GQUlMVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9TTEVFUF9TVEFUVVNfVVBEQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9URU1QX0hJR0hfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX1RFTVBfTE9XX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fQ1JDX0VSUk9SX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0RJU0NBUkRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0RJU0NBUkRTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fRFJPUF9FVkVOVFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fRFJPUF9FVkVSTlRTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fRVJST1JTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0VSUk9SU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0ZSQUdNRU5UU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9GUkFHTUVOVFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9KQUJCRVJTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0pBQkJFUlNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9PVkVSU0laRV9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fT1ZFUlNJWkVfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fVU5ERVJTSVpFX0ZSQU1FU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1JYX1BPV0VSX0hJR0hfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1JYX1BPV0VSX0hJR0hfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfUlhfUE9XRVJfTE9XX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9SWF9QT1dFUl9MT1dfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVEVNUF9ISUdIX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9URU1QX0hJR0hfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVEVNUF9MT1dfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RFTVBfTE9XX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RYX0JJQVNfSElHSF9BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVFhfQklBU19ISUdIX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RYX0JJQVNfTE9XX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9UWF9CSUFTX0xPV19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9UWF9QT1dFUl9ISUdIX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9UWF9QT1dFUl9ISUdIX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RYX1BPV0VSX0xPV19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVFhfUE9XRVJfTE9XX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fRElTQ0FSRFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0RJU0NBUkRTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0RST1BfRVZFTlRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9EUk9QX0VWRU5UU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9FUlJPU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fRVJST1NfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fRlJBR01FTlRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9GUkFHTUVOVFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fSkFCQkVSU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fSkFCQkVSU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9PVkVSU0laRV9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX09WRVJTSVpFX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1ZDQ19ISUdIX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9WQ0NfSElHSF9XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9WQ0NfTE9XX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9WQ0NfTE9XX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fRElTQ0FSRFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0RJU0NBUkRTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0RST1BfRVZFTlRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9EUk9QX0VWRU5UU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9FUlJPUlNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0VSUk9SU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9GUkFHTUVOVFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0ZSQUdNRU5UU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9KQUJCRVJTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9KQUJCRVJTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX09WRVJTSVpFX0ZSQU1FU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fT1ZFUlNJWkVfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX1VOREVSU0laRV9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX1VOREVSU0laRV9GUkFNRVNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1NUQVRVU19DSEFOR0VfVElNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9TVEFUVVNfQ0hBTkdFX1RJTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9DUkNfRVJST1JfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fQ1JDX0VSUk9SX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRElTQ0FSRFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9ESVNDQVJEU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRFJPUF9FVkVOVFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9EUk9QX0VWRU5UU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRVJST1JTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRVJST1JTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9GUkFHTUVOVFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9GUkFHTUVOVFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0pBQkJFUlNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9KQUJCRVJTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9PVkVSU0laRV9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9PVkVSU0laRV9GUkFNRVNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX1VOREVSU0laRV9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9UU19QT1JUX0ZBSUxVUkU6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZGVmLnRpbWVfc3RhbXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZGVmLnN0YXRlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19hbGFybV9lbnRyeV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9hbGFybV9pZCBhbGFybV9pZDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9hbGFybV9pZF91bnBhY2soJmFsYXJtX2lkLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAoYWxhcm1faWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9QT1dFUl9BTEFSTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfUE9OX0lGX1NXSVRDSDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9DQVJEX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0NBUkRfU0VMRl9URVNUX0ZBSUxVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfRTFMT1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfRTFQT1JUX0ZBSUxVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfRTFUSU1JTkdfVU5MT0NLOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0VUSF9QT1JUX0FVVE9fTkVHX0ZBSUxVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfRVRIX1BPUlRfQ09OR0VTVElPTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9FVEhfUE9SVF9GQUlMVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0VUSF9QT1JUX0xPT1BCQUNLOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0VUSF9QT1JUX0xPUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfQkFUVEVSWV9GQUlMVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9CQVRURVJZX01JU1NJTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX0JBVFRFUllfVk9MVF9MT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX0VRVUlQTUVOVF9BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfSUFEX0NPTk5FQ1RJT05fRkFJTFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfUEhZU0lDQUxfSU5TVFJVQ1RJT05fQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX1NFTEZfVEVTVF9GQUlMVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9TTEVFUF9TVEFUVVNfVVBEQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9URU1QX0hJR0hfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX1RFTVBfTE9XX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fQ1JDX0VSUk9SX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0RJU0NBUkRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0RJU0NBUkRTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fRFJPUF9FVkVOVFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fRFJPUF9FVkVSTlRTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fRVJST1JTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0VSUk9SU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0ZSQUdNRU5UU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9GUkFHTUVOVFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9KQUJCRVJTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0pBQkJFUlNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9PVkVSU0laRV9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fT1ZFUlNJWkVfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fVU5ERVJTSVpFX0ZSQU1FU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1JYX1BPV0VSX0hJR0hfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1JYX1BPV0VSX0hJR0hfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfUlhfUE9XRVJfTE9XX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9SWF9QT1dFUl9MT1dfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVEVNUF9ISUdIX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9URU1QX0hJR0hfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVEVNUF9MT1dfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RFTVBfTE9XX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RYX0JJQVNfSElHSF9BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVFhfQklBU19ISUdIX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RYX0JJQVNfTE9XX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9UWF9CSUFTX0xPV19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9UWF9QT1dFUl9ISUdIX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9UWF9QT1dFUl9ISUdIX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RYX1BPV0VSX0xPV19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVFhfUE9XRVJfTE9XX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fRElTQ0FSRFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0RJU0NBUkRTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0RST1BfRVZFTlRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9EUk9QX0VWRU5UU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9FUlJPU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fRVJST1NfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fRlJBR01FTlRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9GUkFHTUVOVFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fSkFCQkVSU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fSkFCQkVSU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9PVkVSU0laRV9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX09WRVJTSVpFX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1ZDQ19ISUdIX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9WQ0NfSElHSF9XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9WQ0NfTE9XX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9WQ0NfTE9XX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fRElTQ0FSRFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0RJU0NBUkRTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0RST1BfRVZFTlRTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9EUk9QX0VWRU5UU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9FUlJPUlNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0VSUk9SU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9GUkFHTUVOVFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0ZSQUdNRU5UU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9KQUJCRVJTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9KQUJCRVJTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX09WRVJTSVpFX0ZSQU1FU19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fT1ZFUlNJWkVfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX1VOREVSU0laRV9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX1VOREVSU0laRV9GUkFNRVNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1NUQVRVU19DSEFOR0VfVElNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9TVEFUVVNfQ0hBTkdFX1RJTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9DUkNfRVJST1JfRlJBTUVTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fQ1JDX0VSUk9SX0ZSQU1FU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRElTQ0FSRFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9ESVNDQVJEU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRFJPUF9FVkVOVFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9EUk9QX0VWRU5UU19XQVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRVJST1JTX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRVJST1JTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9GUkFHTUVOVFNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9GUkFHTUVOVFNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0pBQkJFUlNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9KQUJCRVJTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9PVkVSU0laRV9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9PVkVSU0laRV9GUkFNRVNfV0FSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX1VOREVSU0laRV9GUkFNRVNfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX1dBUk5JTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9UU19QT1JUX0ZBSUxVUkU6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19hdHRyaWJ1dGVfdmFsdWVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hdHRyaWJ1dGVfcGFjayh0aGlzLT5sZWFmLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT53aWR0aCA+PSAweDAwODApCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+d2lkdGgpOworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX0FETUlOX1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19lbmFibGVkX3N0YXRlX3BhY2sodGhpcy0+dS5waHlfYWRtaW5fc3RhdGUuc3RhdGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19BRE1JTl9TVEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZW5hYmxlZF9zdGF0ZV9wYWNrKHRoaXMtPnUuYXV0b19uZWdfYWRtaW5fc3RhdGUuc3RhdGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19MT0NBTF9URUNIX0FCSUxJVFk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuYXV0b19uZWdfbG9jYWxfdGVjaF9hYmlsaXR5LnRlY2hub2xvZ2llc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmF1dG9fbmVnX2xvY2FsX3RlY2hfYWJpbGl0eS50ZWNobm9sb2dpZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5hdXRvX25lZ19sb2NhbF90ZWNoX2FiaWxpdHkudGVjaG5vbG9naWVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInRlY2hub2xvZ2llc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfYXV0b19uZWdfbG9jYWxfdGVjaF9hYmlsaXR5XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUuYXV0b19uZWdfbG9jYWxfdGVjaF9hYmlsaXR5LnRlY2hub2xvZ2llc19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmF1dG9fbmVnX2xvY2FsX3RlY2hfYWJpbGl0eS50ZWNobm9sb2dpZXNbaTBdKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19BRFZFUlRJU0VEX1RFQ0hfQUJJTElUWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5hdXRvX25lZ19hZHZlcnRpc2VkX3RlY2hfYWJpbGl0eS50ZWNobm9sb2dpZXNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5hdXRvX25lZ19hZHZlcnRpc2VkX3RlY2hfYWJpbGl0eS50ZWNobm9sb2dpZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5hdXRvX25lZ19hZHZlcnRpc2VkX3RlY2hfYWJpbGl0eS50ZWNobm9sb2dpZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidGVjaG5vbG9naWVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19hdHRyaWJ1dGVfdmFsdWVfYmFzZV9hdXRvX25lZ19hZHZlcnRpc2VkX3RlY2hfYWJpbGl0eVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LmF1dG9fbmVnX2FkdmVydGlzZWRfdGVjaF9hYmlsaXR5LnRlY2hub2xvZ2llc19jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmF1dG9fbmVnX2FkdmVydGlzZWRfdGVjaF9hYmlsaXR5LnRlY2hub2xvZ2llc1tpMV0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0ZFQ19BQklMSVRZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19mZWNfc3VwcG9ydF9wYWNrKHRoaXMtPnUuZmVjX2FiaWxpdHkuc3VwcG9ydCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0ZFQ19NT0RFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19mZWNfc3RhdGVfcGFjayh0aGlzLT51LmZlY19tb2RlLnN0YXRlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FDVE9SX0FETUlOX0tFWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BQ1RPUl9PUEVSX0tFWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BQ1RPUl9TWVNfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQUNUT1JfU1lTX1BSSToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BRE1JTl9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BR0dfT1JfSU5ESVZJRFVBTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19CQ0FTVF9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19CQ0FTVF9UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19DT0xMRUNUT1JfTUFYX0RFTEFZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0RBVEFfUkFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19ERVNDOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0ZSQU1FU19SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19GUkFNRVNfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfTElOS19VUF9ET1dOX05PVElGWV9FTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19NQUNfQUREUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19NQ0FTVF9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19NQ0FTVF9UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19OQU1FOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX09QRVJfU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUEFSVE5FUl9PUEVSX0tFWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19QQVJUTkVSX1NZU19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19QQVJUTkVSX1NZU19QUkk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUE9SVF9MSVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1JYX0RJU0NBUkQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUlhfRVJSX0ZSQU1FUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19SWF9PQ1RFVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfVElNRV9PRl9MQVNUX09QRVJfQ0hBTkdFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1RYX0RJU0NBUkQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfVFhfRVJSX0ZSQU1FUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19UWF9PQ1RFVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfVU5LX1BST1RPQ09MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfQURfU0VMRUNUX0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19BVVRPX0NGRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfTE9DQUxfU0VMRUNUX0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19SRU1PVEVfU0lHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfUlhfU0VMRUNUX0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19SWF9URUNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfRkVDX0NPUlJFQ1RFRF9CTE9DS1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9GRUNfVU5DT1JSRUNUQUJMRV9CTE9DS1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9HUk9VUF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0dST1VQX1BPUlRfQ0FQQUNJVFk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9HUk9VUF9QT1JUX01BUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19BRERSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0FMSUdOX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19CQ0FTVF9GUkFNRVNfUlhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQkNBU1RfRlJBTUVTX1RYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NBUEFCSUxJVElFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DQVJSSUVSX1NFTlNFX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DT0xMSVNJT05fRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfRlJBTUVTX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfRlJBTUVTX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfRlVOQ1NfU1VQUE9SVEVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9QQVVTRV9ERUxBWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX1BBVVNFX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfUEFVU0VfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9VTlNVUFBPUlRFRF9PUF9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19EVVBMRVhfU1RBVFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0VOQUJMRV9TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRVhDRVNTSVZFX0NPTExJU0lPTlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRkNTX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUl9FWENFU1NJVkVfREVGRVJSQUw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVfVE9PX0xPTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX0RFRkVSUkVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FU19MT1NUX01BQ19SWF9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX0xPU1RfTUFDX1RYX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUkFNRVNfUlhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX1RYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0lOX1JBTkdFX0xFTl9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTEFURV9DT0xMSVNJT05TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX01DQVNUX0FERFJfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NQ0FTVF9GUkFNRVNfUlhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTUNBU1RfRlJBTUVTX1RYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX01DQVNUX1JYX1NUQVRVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NVUxUSVBMRV9DT0xMX0ZSQU1FUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19PQ1RFVFNfUlhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfT0NURVRTX1RYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX09VVF9PRl9SQU5HRV9MRU5fRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX1BST01JU0NVT1VTX1NUQVRVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19TSU5HTEVfQ09MTF9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfVFhfRU5BQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0FETUlOX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0JBTkRfU1BMSVRfRlJFUToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9CQU5EX1NQTElUX1RZUEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfRkFMU0VfQ0FSUklFUlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfSURMRV9FUlJPUl9DT1VOVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9KQUJCRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfTE9TRV9NRURJQV9DVFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfTUVESUFfQVZBSUw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfVFlQRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9UWVBFX0xJU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX0RJU0NPVkVSWV9USU1FT1VUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9ESVNDT1ZFUllfV0lORE9XX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9NQUNfQ1RSTF9GUkFNRVNfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX01BQ19DVFJMX0ZSQU1FU19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfUlhfR0FURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfUlhfUkVHX0FDSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfUlhfUkVHX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX1JFR0lTVEVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9SWF9SRVBPUlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1RYX0dBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1RYX1JFR19BQ0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1RYX1JFR19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9SRUdJU1RFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfVFhfUkVQT1JUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0FETUlOX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0RVUF9FVkVOVF9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9FTVVMX0JBRF9MTElEX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9FTVVMX0NSQzhFUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRU1VTF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9FTVVMX1NQRF9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRVZFTlRfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRlJBTUVTX0xPU1RfT0FNX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9JTkZPX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0lORk9fVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSX1NFQ19TVU1fRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSX1NFQ19TVU1fVEhSRVNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUl9TRUNfU1VNX1dJTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfUEVSSU9EX0VWRU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9QRVJJT0RfVEhSRVNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9QRVJJT0RfV0lOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9TRUNTX0VWRU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9TRUNTX1RIUkVTSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfU0VDU19XSU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX1NZTV9QRVJJT0RfRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX1NZTV9QRVJJT0RfVEhSRVNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9TWU1fUEVSSU9EX1dJTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9GTEFHUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT09QX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPT1BfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTU9ERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9PUkdfU1BFQ0lGSUNfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fT1JHX1NQRUNJRklDX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1BEVV9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9QRFVfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0NPTkZJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1BFUklPRF9FVkVOVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1BFUklPRF9USFJFU0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9QRVJJT0RfV0lOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfU0VDU19FVkVOVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1NFQ1NfVEhSRVNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfU0VDU19XSU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0ZMQUdTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9NQUNfQUREUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfUERVX0NPTkZJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX1ZFTkRPUl9ERVZJQ0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX1ZFTkRPUl9PVUk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX1ZFTkRPUl9WRVJTSU9OOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1VOSVFVRV9FVkVOVF9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9VTlNVUFBPUlRFRF9PUENPREVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1ZBUl9SRVFfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVkFSX1JFUV9UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9WQVJfUkVTUF9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9WQVJfUkVTUF9UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9NSUlfREVURUNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX1NRRV9URVNUX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9TWU1CT0xfRVJSX0RVUklOR19DQVJSSUVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX1RZUEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfVFlQRV9MSVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9BRE1JTl9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQUxJR05fRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9BVVRPX1BBUlRfU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0FVVE9fUEFSVElUSU9OUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQlVSU1RTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9DT0xMSVNJT05TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9EQVRBX1JBVEVfTUlTTUFUQ0hFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfRkNTX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfRlJBTUVTX1RPT19MT05HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfSVNPTEFURVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0xBU1RfU09VUkNFX0FERFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0xBVEVfRVZFTlRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9SRUFEQUJMRV9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1JFQURBQkxFX09DVEVUUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfUlVOVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1NIT1JUX0VWRU5UUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfU09VUkNFX0FERFJfQ0hBTkdFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfU1lNX0VSUl9EVVJJTkdfUEtUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9WRVJZX0xPTkdfRVZFTlRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0dST1VQX0NBUEFDSVRZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0dST1VQX01BUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9IRUFMVEhfREFUQToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9IRUFMVEhfU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfSEVBTFRIX1RFWFQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfVFhfQ09MTElTSU9OUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9UWVBFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19hdHRyaWJ1dGVfdmFsdWVfYmFzZSAqdGhpcykKK3sKKyAgICBpZiAodGhpcy0+d2lkdGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMtPndpZHRoOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB1aW50MzJfdCBjb3VudCA9IDM7CisgICAgICAgIHN3aXRjaCAodGhpcy0+bGVhZikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9BRE1JTl9TVEFURToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0FETUlOX1NUQVRFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfTE9DQUxfVEVDSF9BQklMSVRZOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNCArICg0ICogdGhpcy0+dS5hdXRvX25lZ19sb2NhbF90ZWNoX2FiaWxpdHkudGVjaG5vbG9naWVzX2NvdW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfQURWRVJUSVNFRF9URUNIX0FCSUxJVFk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA0ICsgKDQgKiB0aGlzLT51LmF1dG9fbmVnX2FkdmVydGlzZWRfdGVjaF9hYmlsaXR5LnRlY2hub2xvZ2llc19jb3VudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0ZFQ19BQklMSVRZOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfRkVDX01PREU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQUNUT1JfQURNSU5fS0VZOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BQ1RPUl9PUEVSX0tFWToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQUNUT1JfU1lTX0lEOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BQ1RPUl9TWVNfUFJJOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BRE1JTl9TVEFURToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQUdHX09SX0lORElWSURVQUw6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0JDQVNUX1JYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19CQ0FTVF9UWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQ09MTEVDVE9SX01BWF9ERUxBWToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfREFUQV9SQVRFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19ERVNDOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19GUkFNRVNfUlg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0ZSQU1FU19UWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfSUQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0xJTktfVVBfRE9XTl9OT1RJRllfRU46CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX01BQ19BRERSOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19NQ0FTVF9SWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfTUNBU1RfVFg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX05BTUU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX09QRVJfU1RBVEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1BBUlRORVJfT1BFUl9LRVk6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1BBUlRORVJfU1lTX0lEOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19QQVJUTkVSX1NZU19QUkk6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1BPUlRfTElTVDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUlhfRElTQ0FSRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUlhfRVJSX0ZSQU1FUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUlhfT0NURVRTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19USU1FX09GX0xBU1RfT1BFUl9DSEFOR0U6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1RYX0RJU0NBUkQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1RYX0VSUl9GUkFNRVM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1RYX09DVEVUUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfVU5LX1BST1RPQ09MOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0FEX1NFTEVDVF9BQkxFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0FVVE9fQ0ZHOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0lEOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0xPQ0FMX1NFTEVDVF9BQkxFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX1JFTU9URV9TSUc6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfUlhfU0VMRUNUX0FCTEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfUlhfVEVDSDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9GRUNfQ09SUkVDVEVEX0JMT0NLUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9GRUNfVU5DT1JSRUNUQUJMRV9CTE9DS1M6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfR1JPVVBfSUQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfR1JPVVBfUE9SVF9DQVBBQ0lUWToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9HUk9VUF9QT1JUX01BUDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQUREUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQUxJR05fRVJSOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19CQ0FTVF9GUkFNRVNfUlhfT0s6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0JDQVNUX0ZSQU1FU19UWF9PSzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ0FQQUJJTElUSUVTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DQVJSSUVSX1NFTlNFX0VSUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ09MTElTSU9OX0ZSQU1FUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9GUkFNRVNfUlg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfRlJBTUVTX1RYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX0ZVTkNTX1NVUFBPUlRFRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9JRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9QQVVTRV9ERUxBWToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9QQVVTRV9SWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9QQVVTRV9UWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9VTlNVUFBPUlRFRF9PUF9SWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRFVQTEVYX1NUQVRVUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRU5BQkxFX1NUQVRVUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRVhDRVNTSVZFX0NPTExJU0lPTlM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZDU19FUlI6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSX0VYQ0VTU0lWRV9ERUZFUlJBTDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVfVE9PX0xPTkc6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FU19ERUZFUlJFRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX0xPU1RfTUFDX1JYX0VSUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX0xPU1RfTUFDX1RYX0VSUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX1JYX09LOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUkFNRVNfVFhfT0s6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0lEOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19JTl9SQU5HRV9MRU5fRVJSOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19MQVRFX0NPTExJU0lPTlM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX01DQVNUX0FERFJfTElTVDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTUNBU1RfRlJBTUVTX1JYX09LOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NQ0FTVF9GUkFNRVNfVFhfT0s6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX01DQVNUX1JYX1NUQVRVUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTVVMVElQTEVfQ09MTF9GUkFNRVM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX09DVEVUU19SWF9PSzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfT0NURVRTX1RYX09LOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19PVVRfT0ZfUkFOR0VfTEVOX0VSUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfUFJPTUlTQ1VPVVNfU1RBVFVTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19TSU5HTEVfQ09MTF9GUkFNRVM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX1RYX0VOQUJMRToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfQURNSU5fU1RBVEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0JBTkRfU1BMSVRfRlJFUToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfQkFORF9TUExJVF9UWVBFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9GQUxTRV9DQVJSSUVSUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfSUQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0lETEVfRVJST1JfQ09VTlQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0pBQkJFUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfTE9TRV9NRURJQV9DVFI6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX01FRElBX0FWQUlMOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9UWVBFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9UWVBFX0xJU1Q6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9ESVNDT1ZFUllfVElNRU9VVDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX0RJU0NPVkVSWV9XSU5ET1dfVFg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9NQUNfQ1RSTF9GUkFNRVNfUlg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9NQUNfQ1RSTF9GUkFNRVNfVFg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9SWF9HQVRFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfUlhfUkVHX0FDSzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX1JFR19SRVFVRVNUOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfUlhfUkVHSVNURVI6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9SWF9SRVBPUlQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9HQVRFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfVFhfUkVHX0FDSzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1RYX1JFR19SRVFVRVNUOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfVFhfUkVHSVNURVI6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9SRVBPUlQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0FETUlOX1NUQVRFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9EVVBfRVZFTlRfUlg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0VNVUxfQkFEX0xMSURfRVJSOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9FTVVMX0NSQzhFUlI6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0VNVUxfSUQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0VNVUxfU1BEX0VSUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRVZFTlRfVFg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0ZSQU1FU19MT1NUX09BTV9FUlI6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0lEOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9JTkZPX1JYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9JTkZPX1RYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJfU0VDX1NVTV9FVkVOVDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSX1NFQ19TVU1fVEhSRVNIOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJfU0VDX1NVTV9XSU46CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9QRVJJT0RfRVZFTlQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9QRVJJT0RfVEhSRVNIOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfUEVSSU9EX1dJTjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1NFQ1NfRVZFTlQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9TRUNTX1RIUkVTSDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1NFQ1NfV0lOOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfU1lNX1BFUklPRF9FVkVOVDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX1NZTV9QRVJJT0RfVEhSRVNIOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfU1lNX1BFUklPRF9XSU46CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0ZMQUdTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT09QX1JYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT09QX1RYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9NT0RFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9PUkdfU1BFQ0lGSUNfUlg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX09SR19TUEVDSUZJQ19UWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUERVX1JYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9QRFVfVFg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9DT05GSUc6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfUEVSSU9EX0VWRU5UOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1BFUklPRF9USFJFU0g6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfUEVSSU9EX1dJTjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9TRUNTX0VWRU5UOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1NFQ1NfVEhSRVNIOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1NFQ1NfV0lOOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRkxBR1M6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9NQUNfQUREUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX1BEVV9DT05GSUc6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9TVEFURToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX1ZFTkRPUl9ERVZJQ0U6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9WRU5ET1JfT1VJOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfVkVORE9SX1ZFUlNJT046CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1VOSVFVRV9FVkVOVF9SWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVU5TVVBQT1JURURfT1BDT0RFUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVkFSX1JFUV9SWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVkFSX1JFUV9UWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVkFSX1JFU1BfUlg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1ZBUl9SRVNQX1RYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9JRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfTUlJX0RFVEVDVDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfU1FFX1RFU1RfRVJSOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9TWU1CT0xfRVJSX0RVUklOR19DQVJSSUVSOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9UWVBFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9UWVBFX0xJU1Q6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9BRE1JTl9TVEFURToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0FMSUdOX0VSUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0FVVE9fUEFSVF9TVEFURToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0FVVE9fUEFSVElUSU9OUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0JVUlNUUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0NPTExJU0lPTlM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9EQVRBX1JBVEVfTUlTTUFUQ0hFUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0ZDU19FUlI6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9GUkFNRVNfVE9PX0xPTkc6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9JRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0lTT0xBVEVTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfTEFTVF9TT1VSQ0VfQUREUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0xBVEVfRVZFTlRTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfUkVBREFCTEVfRlJBTUVTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfUkVBREFCTEVfT0NURVRTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfUlVOVFM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9TSE9SVF9FVkVOVFM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9TT1VSQ0VfQUREUl9DSEFOR0VTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfU1lNX0VSUl9EVVJJTkdfUEtUOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfVkVSWV9MT05HX0VWRU5UUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfR1JPVVBfQ0FQQUNJVFk6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0dST1VQX01BUDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfSEVBTFRIX0RBVEE6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0hFQUxUSF9TVEFURToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfSEVBTFRIX1RFWFQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0lEOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9UWF9DT0xMSVNJT05TOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9UWVBFOgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNvdW50OworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19hdHRyaWJ1dGVfdmFsdWVfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19hdHRyaWJ1dGVfdmFsdWVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hdHRyaWJ1dGVfdW5wYWNrKCZ0aGlzLT5sZWFmLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPndpZHRoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+d2lkdGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+d2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX0FETUlOX1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19lbmFibGVkX3N0YXRlX3VucGFjaygmdGhpcy0+dS5waHlfYWRtaW5fc3RhdGUuc3RhdGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0FETUlOX1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19lbmFibGVkX3N0YXRlX3VucGFjaygmdGhpcy0+dS5hdXRvX25lZ19hZG1pbl9zdGF0ZS5zdGF0ZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfTE9DQUxfVEVDSF9BQklMSVRZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuYXV0b19uZWdfbG9jYWxfdGVjaF9hYmlsaXR5LnRlY2hub2xvZ2llc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmF1dG9fbmVnX2xvY2FsX3RlY2hfYWJpbGl0eS50ZWNobm9sb2dpZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5hdXRvX25lZ19sb2NhbF90ZWNoX2FiaWxpdHkudGVjaG5vbG9naWVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidGVjaG5vbG9naWVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19hdHRyaWJ1dGVfdmFsdWVfYmFzZV9hdXRvX25lZ19sb2NhbF90ZWNoX2FiaWxpdHlcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5hdXRvX25lZ19sb2NhbF90ZWNoX2FiaWxpdHkudGVjaG5vbG9naWVzID0gKHVpbnQzMl90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmF1dG9fbmVnX2xvY2FsX3RlY2hfYWJpbGl0eS50ZWNobm9sb2dpZXNfY291bnQgKiBzaXplb2YodWludDMyX3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUuYXV0b19uZWdfbG9jYWxfdGVjaF9hYmlsaXR5LnRlY2hub2xvZ2llc19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuYXV0b19uZWdfbG9jYWxfdGVjaF9hYmlsaXR5LnRlY2hub2xvZ2llc1tpMF0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0FEVkVSVElTRURfVEVDSF9BQklMSVRZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuYXV0b19uZWdfYWR2ZXJ0aXNlZF90ZWNoX2FiaWxpdHkudGVjaG5vbG9naWVzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuYXV0b19uZWdfYWR2ZXJ0aXNlZF90ZWNoX2FiaWxpdHkudGVjaG5vbG9naWVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuYXV0b19uZWdfYWR2ZXJ0aXNlZF90ZWNoX2FiaWxpdHkudGVjaG5vbG9naWVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidGVjaG5vbG9naWVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19hdHRyaWJ1dGVfdmFsdWVfYmFzZV9hdXRvX25lZ19hZHZlcnRpc2VkX3RlY2hfYWJpbGl0eVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmF1dG9fbmVnX2FkdmVydGlzZWRfdGVjaF9hYmlsaXR5LnRlY2hub2xvZ2llcyA9ICh1aW50MzJfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5hdXRvX25lZ19hZHZlcnRpc2VkX3RlY2hfYWJpbGl0eS50ZWNobm9sb2dpZXNfY291bnQgKiBzaXplb2YodWludDMyX3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHRoaXMtPnUuYXV0b19uZWdfYWR2ZXJ0aXNlZF90ZWNoX2FiaWxpdHkudGVjaG5vbG9naWVzX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5hdXRvX25lZ19hZHZlcnRpc2VkX3RlY2hfYWJpbGl0eS50ZWNobm9sb2dpZXNbaTFdKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9GRUNfQUJJTElUWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZmVjX3N1cHBvcnRfdW5wYWNrKCZ0aGlzLT51LmZlY19hYmlsaXR5LnN1cHBvcnQsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0ZFQ19NT0RFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19mZWNfc3RhdGVfdW5wYWNrKCZ0aGlzLT51LmZlY19tb2RlLnN0YXRlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQUNUT1JfQURNSU5fS0VZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FDVE9SX09QRVJfS0VZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FDVE9SX1NZU19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BQ1RPUl9TWVNfUFJJOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FETUlOX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FHR19PUl9JTkRJVklEVUFMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0JDQVNUX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0JDQVNUX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0NPTExFQ1RPUl9NQVhfREVMQVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfREFUQV9SQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0RFU0M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfRlJBTUVTX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0ZSQU1FU19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19MSU5LX1VQX0RPV05fTk9USUZZX0VOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX01BQ19BRERSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX01DQVNUX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX01DQVNUX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX05BTUU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfT1BFUl9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19QQVJUTkVSX09QRVJfS0VZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1BBUlRORVJfU1lTX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1BBUlRORVJfU1lTX1BSSToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19QT1JUX0xJU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUlhfRElTQ0FSRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19SWF9FUlJfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1JYX09DVEVUUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19USU1FX09GX0xBU1RfT1BFUl9DSEFOR0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfVFhfRElTQ0FSRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19UWF9FUlJfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1RYX09DVEVUUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19VTktfUFJPVE9DT0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19BRF9TRUxFQ1RfQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0FVVE9fQ0ZHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19MT0NBTF9TRUxFQ1RfQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX1JFTU9URV9TSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19SWF9TRUxFQ1RfQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX1JYX1RFQ0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9GRUNfQ09SUkVDVEVEX0JMT0NLUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0ZFQ19VTkNPUlJFQ1RBQkxFX0JMT0NLUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0dST1VQX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfR1JPVVBfUE9SVF9DQVBBQ0lUWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0dST1VQX1BPUlRfTUFQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0FERFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQUxJR05fRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0JDQVNUX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19CQ0FTVF9GUkFNRVNfVFhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ0FQQUJJTElUSUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NBUlJJRVJfU0VOU0VfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NPTExJU0lPTl9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9GUkFNRVNfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9GUkFNRVNfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9GVU5DU19TVVBQT1JURUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX1BBVVNFX0RFTEFZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfUEFVU0VfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9QQVVTRV9UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX1VOU1VQUE9SVEVEX09QX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0RVUExFWF9TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRU5BQkxFX1NUQVRVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19FWENFU1NJVkVfQ09MTElTSU9OUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GQ1NfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSX0VYQ0VTU0lWRV9ERUZFUlJBTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUkFNRV9UT09fTE9ORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUkFNRVNfREVGRVJSRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX0xPU1RfTUFDX1JYX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUkFNRVNfTE9TVF9NQUNfVFhfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUkFNRVNfVFhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfSU5fUkFOR0VfTEVOX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19MQVRFX0NPTExJU0lPTlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTUNBU1RfQUREUl9MSVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX01DQVNUX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NQ0FTVF9GUkFNRVNfVFhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTUNBU1RfUlhfU1RBVFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX01VTFRJUExFX0NPTExfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX09DVEVUU19SWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19PQ1RFVFNfVFhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfT1VUX09GX1JBTkdFX0xFTl9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfUFJPTUlTQ1VPVVNfU1RBVFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX1NJTkdMRV9DT0xMX0ZSQU1FUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19UWF9FTkFCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfQURNSU5fU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfQkFORF9TUExJVF9GUkVROgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0JBTkRfU1BMSVRfVFlQRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9GQUxTRV9DQVJSSUVSUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9JRExFX0VSUk9SX0NPVU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0pBQkJFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9MT1NFX01FRElBX0NUUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9NRURJQV9BVkFJTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9UWVBFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX1RZUEVfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfRElTQ09WRVJZX1RJTUVPVVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX0RJU0NPVkVSWV9XSU5ET1dfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX01BQ19DVFJMX0ZSQU1FU19SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfTUFDX0NUUkxfRlJBTUVTX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9SWF9HQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9SWF9SRUdfQUNLOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9SWF9SRUdfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfUlhfUkVHSVNURVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX1JFUE9SVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfVFhfR0FURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfVFhfUkVHX0FDSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfVFhfUkVHX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1RYX1JFR0lTVEVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9SRVBPUlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fQURNSU5fU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRFVQX0VWRU5UX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0VNVUxfQkFEX0xMSURfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0VNVUxfQ1JDOEVSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9FTVVMX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0VNVUxfU1BEX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9FVkVOVF9UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9GUkFNRVNfTE9TVF9PQU1fRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0lORk9fUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fSU5GT19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJfU0VDX1NVTV9FVkVOVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJfU0VDX1NVTV9USFJFU0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSX1NFQ19TVU1fV0lOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9QRVJJT0RfRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1BFUklPRF9USFJFU0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1BFUklPRF9XSU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1NFQ1NfRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1NFQ1NfVEhSRVNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9TRUNTX1dJTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfU1lNX1BFUklPRF9FVkVOVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfU1lNX1BFUklPRF9USFJFU0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX1NZTV9QRVJJT0RfV0lOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0ZMQUdTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPT1BfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9PUF9UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9NT0RFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX09SR19TUEVDSUZJQ19SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9PUkdfU1BFQ0lGSUNfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUERVX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1BEVV9UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfUEVSSU9EX0VWRU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfUEVSSU9EX1RIUkVTSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1BFUklPRF9XSU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9TRUNTX0VWRU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfU0VDU19USFJFU0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9TRUNTX1dJTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRkxBR1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX01BQ19BRERSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9QRFVfQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfVkVORE9SX0RFVklDRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfVkVORE9SX09VSToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfVkVORE9SX1ZFUlNJT046CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVU5JUVVFX0VWRU5UX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1VOU1VQUE9SVEVEX09QQ09ERVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVkFSX1JFUV9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9WQVJfUkVRX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1ZBUl9SRVNQX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1ZBUl9SRVNQX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX01JSV9ERVRFQ1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfU1FFX1RFU1RfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX1NZTUJPTF9FUlJfRFVSSU5HX0NBUlJJRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfVFlQRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9UWVBFX0xJU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0FETUlOX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9BTElHTl9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0FVVE9fUEFSVF9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQVVUT19QQVJUSVRJT05TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9CVVJTVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0NPTExJU0lPTlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0RBVEFfUkFURV9NSVNNQVRDSEVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9GQ1NfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9GUkFNRVNfVE9PX0xPTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9JU09MQVRFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfTEFTVF9TT1VSQ0VfQUREUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfTEFURV9FVkVOVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1JFQURBQkxFX0ZSQU1FUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfUkVBREFCTEVfT0NURVRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9SVU5UUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfU0hPUlRfRVZFTlRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9TT1VSQ0VfQUREUl9DSEFOR0VTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9TWU1fRVJSX0RVUklOR19QS1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1ZFUllfTE9OR19FVkVOVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfR1JPVVBfQ0FQQUNJVFk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfR1JPVVBfTUFQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0hFQUxUSF9EQVRBOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0hFQUxUSF9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9IRUFMVEhfVEVYVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9UWF9DT0xMSVNJT05TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX1RZUEU6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPndpZHRoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19hdHRyaWJ1dGVfdmFsdWVfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlIGxlYWY7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2F0dHJpYnV0ZV91bnBhY2soJmxlYWYsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICBzd2l0Y2ggKGxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX0FETUlOX1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0FETUlOX1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0xPQ0FMX1RFQ0hfQUJJTElUWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB0ZWNobm9sb2dpZXNfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGVjaG5vbG9naWVzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQzMl90KSAqIHRlY2hub2xvZ2llc19jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIHRlY2hub2xvZ2llc19jb3VudCAqIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfQURWRVJUSVNFRF9URUNIX0FCSUxJVFk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdGVjaG5vbG9naWVzX2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRlY2hub2xvZ2llc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50MzJfdCkgKiB0ZWNobm9sb2dpZXNfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCB0ZWNobm9sb2dpZXNfY291bnQgKiA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0ZFQ19BQklMSVRZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0ZFQ19NT0RFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BQ1RPUl9BRE1JTl9LRVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQUNUT1JfT1BFUl9LRVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQUNUT1JfU1lTX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FDVE9SX1NZU19QUkk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQURNSU5fU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQUdHX09SX0lORElWSURVQUw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQkNBU1RfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQkNBU1RfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQ09MTEVDVE9SX01BWF9ERUxBWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19EQVRBX1JBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfREVTQzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19GUkFNRVNfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfRlJBTUVTX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0xJTktfVVBfRE9XTl9OT1RJRllfRU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfTUFDX0FERFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfTUNBU1RfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfTUNBU1RfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfTkFNRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19PUEVSX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1BBUlRORVJfT1BFUl9LRVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUEFSVE5FUl9TWVNfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUEFSVE5FUl9TWVNfUFJJOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1BPUlRfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19SWF9ESVNDQVJEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1JYX0VSUl9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUlhfT0NURVRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1RJTUVfT0ZfTEFTVF9PUEVSX0NIQU5HRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19UWF9ESVNDQVJEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1RYX0VSUl9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfVFhfT0NURVRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1VOS19QUk9UT0NPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0FEX1NFTEVDVF9BQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfQVVUT19DRkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0xPQ0FMX1NFTEVDVF9BQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfUkVNT1RFX1NJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX1JYX1NFTEVDVF9BQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfUlhfVEVDSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0ZFQ19DT1JSRUNURURfQkxPQ0tTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfRkVDX1VOQ09SUkVDVEFCTEVfQkxPQ0tTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfR1JPVVBfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9HUk9VUF9QT1JUX0NBUEFDSVRZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfR1JPVVBfUE9SVF9NQVA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQUREUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19BTElHTl9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQkNBU1RfRlJBTUVTX1JYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0JDQVNUX0ZSQU1FU19UWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DQVBBQklMSVRJRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ0FSUklFUl9TRU5TRV9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ09MTElTSU9OX0ZSQU1FUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX0ZSQU1FU19SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX0ZSQU1FU19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX0ZVTkNTX1NVUFBPUlRFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfUEFVU0VfREVMQVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9QQVVTRV9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX1BBVVNFX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfVU5TVVBQT1JURURfT1BfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRFVQTEVYX1NUQVRVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19FTkFCTEVfU1RBVFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0VYQ0VTU0lWRV9DT0xMSVNJT05TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZDU19FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJfRVhDRVNTSVZFX0RFRkVSUkFMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FX1RPT19MT05HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FU19ERUZFUlJFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUkFNRVNfTE9TVF9NQUNfUlhfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FU19MT1NUX01BQ19UWF9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX1JYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FU19UWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19JTl9SQU5HRV9MRU5fRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0xBVEVfQ09MTElTSU9OUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NQ0FTVF9BRERSX0xJU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTUNBU1RfRlJBTUVTX1JYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX01DQVNUX0ZSQU1FU19UWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NQ0FTVF9SWF9TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTVVMVElQTEVfQ09MTF9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfT0NURVRTX1JYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX09DVEVUU19UWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19PVVRfT0ZfUkFOR0VfTEVOX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19QUk9NSVNDVU9VU19TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfU0lOR0xFX0NPTExfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX1RYX0VOQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9BRE1JTl9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9CQU5EX1NQTElUX0ZSRVE6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfQkFORF9TUExJVF9UWVBFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0ZBTFNFX0NBUlJJRVJTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0lETEVfRVJST1JfQ09VTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfSkFCQkVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0xPU0VfTUVESUFfQ1RSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX01FRElBX0FWQUlMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX1RZUEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfVFlQRV9MSVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9ESVNDT1ZFUllfVElNRU9VVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfRElTQ09WRVJZX1dJTkRPV19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfTUFDX0NUUkxfRlJBTUVTX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9NQUNfQ1RSTF9GUkFNRVNfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX0dBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX1JFR19BQ0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX1JFR19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9SWF9SRUdJU1RFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfUlhfUkVQT1JUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9HQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9SRUdfQUNLOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9SRUdfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfVFhfUkVHSVNURVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1RYX1JFUE9SVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9BRE1JTl9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9EVVBfRVZFTlRfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRU1VTF9CQURfTExJRF9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRU1VTF9DUkM4RVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0VNVUxfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRU1VTF9TUERfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0VWRU5UX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0ZSQU1FU19MT1NUX09BTV9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fSU5GT19SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9JTkZPX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUl9TRUNfU1VNX0VWRU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUl9TRUNfU1VNX1RIUkVTSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJfU0VDX1NVTV9XSU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1BFUklPRF9FVkVOVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfUEVSSU9EX1RIUkVTSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfUEVSSU9EX1dJTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfU0VDU19FVkVOVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfU0VDU19USFJFU0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1NFQ1NfV0lOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9TWU1fUEVSSU9EX0VWRU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9TWU1fUEVSSU9EX1RIUkVTSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfU1lNX1BFUklPRF9XSU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRkxBR1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9PUF9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT09QX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX01PREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fT1JHX1NQRUNJRklDX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX09SR19TUEVDSUZJQ19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9QRFVfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUERVX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9QRVJJT0RfRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9QRVJJT0RfVEhSRVNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfUEVSSU9EX1dJTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1NFQ1NfRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9TRUNTX1RIUkVTSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1NFQ1NfV0lOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9GTEFHUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfTUFDX0FERFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX1BEVV9DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9WRU5ET1JfREVWSUNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9WRU5ET1JfT1VJOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9WRU5ET1JfVkVSU0lPTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9VTklRVUVfRVZFTlRfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVU5TVVBQT1JURURfT1BDT0RFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9WQVJfUkVRX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1ZBUl9SRVFfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVkFSX1JFU1BfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVkFSX1JFU1BfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfTUlJX0RFVEVDVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9TUUVfVEVTVF9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfU1lNQk9MX0VSUl9EVVJJTkdfQ0FSUklFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9UWVBFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX1RZUEVfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQURNSU5fU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0FMSUdOX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQVVUT19QQVJUX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9BVVRPX1BBUlRJVElPTlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0JVUlNUUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQ09MTElTSU9OUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfREFUQV9SQVRFX01JU01BVENIRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0ZDU19FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0ZSQU1FU19UT09fTE9ORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0lTT0xBVEVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9MQVNUX1NPVVJDRV9BRERSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9MQVRFX0VWRU5UUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfUkVBREFCTEVfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9SRUFEQUJMRV9PQ1RFVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1JVTlRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9TSE9SVF9FVkVOVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1NPVVJDRV9BRERSX0NIQU5HRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1NZTV9FUlJfRFVSSU5HX1BLVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfVkVSWV9MT05HX0VWRU5UUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9HUk9VUF9DQVBBQ0lUWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9HUk9VUF9NQVA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfSEVBTFRIX0RBVEE6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfSEVBTFRIX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0hFQUxUSF9URVhUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX1RYX0NPTExJU0lPTlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfVFlQRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfY2h1cm5pbmdfcHJvdl9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19wcm92X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfY2h1cm5pbmdfb3BfY29kZV9wYWNrKHRoaXMtPmNvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5jb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0NIVVJOSU5HX09QX0NPREVfTkVXX0tFWV9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUubmV3X2tleV9yZXF1ZXN0LmluX3VzZV9rZXlfaW5kZXgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQ0hVUk5JTkdfT1BfQ09ERV9ORVdfQ0hVUk5JTkdfS0VZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUubmV3X2NodXJuaW5nX2tleS5uZXdfa2V5X2luZGV4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51Lm5ld19jaHVybmluZ19rZXkuY2h1cm5pbmdfa2V5MCwgMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5uZXdfY2h1cm5pbmdfa2V5LmNodXJuaW5nX2tleTEsIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUubmV3X2NodXJuaW5nX2tleS5jaHVybmluZ19rZXkyLCAzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19wcm92X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19wcm92X2Jhc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+Y29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19DSFVSTklOR19PUF9DT0RFX05FV19LRVlfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19DSFVSTklOR19PUF9DT0RFX05FV19DSFVSTklOR19LRVk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19wcm92X2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfY2h1cm5pbmdfcHJvdl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2NodXJuaW5nX29wX2NvZGVfdW5wYWNrKCZ0aGlzLT5jb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+Y29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19DSFVSTklOR19PUF9DT0RFX05FV19LRVlfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51Lm5ld19rZXlfcmVxdWVzdC5pbl91c2Vfa2V5X2luZGV4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0NIVVJOSU5HX09QX0NPREVfTkVXX0NIVVJOSU5HX0tFWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51Lm5ld19jaHVybmluZ19rZXkubmV3X2tleV9pbmRleCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51Lm5ld19jaHVybmluZ19rZXkuY2h1cm5pbmdfa2V5MCwgMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51Lm5ld19jaHVybmluZ19rZXkuY2h1cm5pbmdfa2V5MSwgMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51Lm5ld19jaHVybmluZ19rZXkuY2h1cm5pbmdfa2V5MiwgMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19wcm92X2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19vcF9jb2RlIGNvZGU7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2NodXJuaW5nX29wX2NvZGVfdW5wYWNrKCZjb2RlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAoY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19DSFVSTklOR19PUF9DT0RFX05FV19LRVlfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQ0hVUk5JTkdfT1BfQ09ERV9ORVdfQ0hVUk5JTkdfS0VZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX29wY29kZV9wYWNrKHRoaXMtPm9wY29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm9wY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19DT01NSVRfSU1BR0VfT1BDT0RFX0NPTU1JVF9JTUFHRV9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfZmxhZ19wYWNrKHRoaXMtPnUuY29tbWl0X2ltYWdlX3JlcXVlc3QuZmxhZywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0NPTU1JVF9JTUFHRV9PUENPREVfQ09NTUlUX0lNQUdFX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfYWNrX3BhY2sodGhpcy0+dS5jb21taXRfaW1hZ2VfcmVzcG9uc2UuYWNrLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2Jhc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAyOworICAgIHN3aXRjaCAodGhpcy0+b3Bjb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0NPTU1JVF9JTUFHRV9PUENPREVfQ09NTUlUX0lNQUdFX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQ09NTUlUX0lNQUdFX09QQ09ERV9DT01NSVRfSU1BR0VfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9vcGNvZGVfdW5wYWNrKCZ0aGlzLT5vcGNvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQ09NTUlUX0lNQUdFX09QQ09ERV9DT01NSVRfSU1BR0VfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2ZsYWdfdW5wYWNrKCZ0aGlzLT51LmNvbW1pdF9pbWFnZV9yZXF1ZXN0LmZsYWcsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19DT01NSVRfSU1BR0VfT1BDT0RFX0NPTU1JVF9JTUFHRV9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2Fja191bnBhY2soJnRoaXMtPnUuY29tbWl0X2ltYWdlX3Jlc3BvbnNlLmFjaywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX29wY29kZSBvcGNvZGU7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9vcGNvZGVfdW5wYWNrKCZvcGNvZGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChvcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQ09NTUlUX0lNQUdFX09QQ09ERV9DT01NSVRfSU1BR0VfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQ09NTUlUX0lNQUdFX09QQ09ERV9DT01NSVRfSU1BR0VfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9xdWV1ZV9zZXRfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9xdWV1ZV9zZXQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5yZXBvcnRfYml0bWFwKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnJlcG9ydF9iaXRtYXAgJiAweDAwMDEpID09IDB4MDAwMSkpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+cXVldWUwKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5yZXBvcnRfYml0bWFwICYgMHgwMDAyKSA9PSAweDAwMDIpKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnF1ZXVlMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cmVwb3J0X2JpdG1hcCAmIDB4MDAwNCkgPT0gMHgwMDA0KSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5xdWV1ZTIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnJlcG9ydF9iaXRtYXAgJiAweDAwMDgpID09IDB4MDAwOCkpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+cXVldWUzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5yZXBvcnRfYml0bWFwICYgMHgwMDEwKSA9PSAweDAwMTApKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnF1ZXVlNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cmVwb3J0X2JpdG1hcCAmIDB4MDAyMCkgPT0gMHgwMDIwKSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5xdWV1ZTUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnJlcG9ydF9iaXRtYXAgJiAweDAwNDApID09IDB4MDA0MCkpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+cXVldWU2KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5yZXBvcnRfYml0bWFwICYgMHgwMDgwKSA9PSAweDAwODApKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnF1ZXVlNykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9xdWV1ZV9zZXRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3F1ZXVlX3NldCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnJlcG9ydF9iaXRtYXApKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cmVwb3J0X2JpdG1hcCAmIDB4MDAwMSkgPT0gMHgwMDAxKSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5xdWV1ZTApKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnJlcG9ydF9iaXRtYXAgJiAweDAwMDIpID09IDB4MDAwMikpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+cXVldWUxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5yZXBvcnRfYml0bWFwICYgMHgwMDA0KSA9PSAweDAwMDQpKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnF1ZXVlMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cmVwb3J0X2JpdG1hcCAmIDB4MDAwOCkgPT0gMHgwMDA4KSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5xdWV1ZTMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnJlcG9ydF9iaXRtYXAgJiAweDAwMTApID09IDB4MDAxMCkpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+cXVldWU0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5yZXBvcnRfYml0bWFwICYgMHgwMDIwKSA9PSAweDAwMjApKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnF1ZXVlNSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+cmVwb3J0X2JpdG1hcCAmIDB4MDA0MCkgPT0gMHgwMDQwKSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5xdWV1ZTYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKCgodWludDY0X3QpIHRoaXMtPnJlcG9ydF9iaXRtYXAgJiAweDAwODApID09IDB4MDA4MCkpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+cXVldWU3KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3F1ZXVlX3NldF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDE3KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcHJvdl9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcHJvdl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9vcF9jb2RlX3BhY2sodGhpcy0+ZGJhX2NvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5kYmFfY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19EQkFfT1BfQ09ERV9HRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfREJBX09QX0NPREVfR0VUX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5nZXRfcmVzcG9uc2UucXVldWVfc2V0c19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9yZXNwb25zZS5xdWV1ZV9zZXRzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnF1ZXVlX3NldHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicXVldWVfc2V0c1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3Byb3ZfYmFzZV9nZXRfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5nZXRfcmVzcG9uc2UucXVldWVfc2V0c19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcXVldWVfc2V0X3BhY2soJnRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnF1ZXVlX3NldHNbaTBdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0RCQV9PUF9DT0RFX1NFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTE7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5zZXRfcmVxdWVzdC5xdWV1ZV9zZXRzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X3JlcXVlc3QucXVldWVfc2V0c19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9yZXF1ZXN0LnF1ZXVlX3NldHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicXVldWVfc2V0c1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3Byb3ZfYmFzZV9zZXRfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LnNldF9yZXF1ZXN0LnF1ZXVlX3NldHNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3F1ZXVlX3NldF9wYWNrKCZ0aGlzLT51LnNldF9yZXF1ZXN0LnF1ZXVlX3NldHNbaTFdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0RCQV9PUF9DT0RFX1NFVF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkyOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnF1ZXVlX3NldHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfcmVzcG9uc2UucXVldWVfc2V0c19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9yZXNwb25zZS5xdWV1ZV9zZXRzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInF1ZXVlX3NldHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9wcm92X2Jhc2Vfc2V0X3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnF1ZXVlX3NldHNfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3F1ZXVlX3NldF9wYWNrKCZ0aGlzLT51LnNldF9yZXNwb25zZS5xdWV1ZV9zZXRzW2kyXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3Byb3ZfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9wcm92X2Jhc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+ZGJhX2NvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfREJBX09QX0NPREVfR0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0RCQV9PUF9DT0RFX0dFVF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMDsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfcmVzcG9uc2UucXVldWVfc2V0c19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9yZXNwb25zZS5xdWV1ZV9zZXRzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInF1ZXVlX3NldHNfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9wcm92X2Jhc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmdldF9yZXNwb25zZS5xdWV1ZV9zZXRzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19EQkFfT1BfQ09ERV9TRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMTsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfcmVxdWVzdC5xdWV1ZV9zZXRzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X3JlcXVlc3QucXVldWVfc2V0cyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJxdWV1ZV9zZXRzX2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcHJvdl9iYXNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5zZXRfcmVxdWVzdC5xdWV1ZV9zZXRzX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19EQkFfT1BfQ09ERV9TRVRfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTI7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnF1ZXVlX3NldHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfcmVzcG9uc2UucXVldWVfc2V0cyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJxdWV1ZV9zZXRzX2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcHJvdl9iYXNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMiA9IDA7IGkyIDwgdGhpcy0+dS5zZXRfcmVzcG9uc2UucXVldWVfc2V0c19jb3VudDsgaTIrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE3OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9wcm92X2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3Byb3ZfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfb3BfY29kZV91bnBhY2soJnRoaXMtPmRiYV9jb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+ZGJhX2NvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfREJBX09QX0NPREVfR0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0RCQV9PUF9DT0RFX0dFVF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnF1ZXVlX3NldHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfcmVzcG9uc2UucXVldWVfc2V0c19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9yZXNwb25zZS5xdWV1ZV9zZXRzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicXVldWVfc2V0c1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3Byb3ZfYmFzZV9nZXRfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfcmVzcG9uc2UucXVldWVfc2V0cyA9IChiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9xdWV1ZV9zZXQgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnF1ZXVlX3NldHNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcXVldWVfc2V0KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmdldF9yZXNwb25zZS5xdWV1ZV9zZXRzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9xdWV1ZV9zZXRfdW5wYWNrKCZ0aGlzLT51LmdldF9yZXNwb25zZS5xdWV1ZV9zZXRzW2kwXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0RCQV9PUF9DT0RFX1NFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTE7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5zZXRfcmVxdWVzdC5xdWV1ZV9zZXRzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X3JlcXVlc3QucXVldWVfc2V0c19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9yZXF1ZXN0LnF1ZXVlX3NldHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJxdWV1ZV9zZXRzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcHJvdl9iYXNlX3NldF9yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuc2V0X3JlcXVlc3QucXVldWVfc2V0cyA9IChiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9xdWV1ZV9zZXQgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuc2V0X3JlcXVlc3QucXVldWVfc2V0c19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9xdWV1ZV9zZXQpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHRoaXMtPnUuc2V0X3JlcXVlc3QucXVldWVfc2V0c19jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcXVldWVfc2V0X3VucGFjaygmdGhpcy0+dS5zZXRfcmVxdWVzdC5xdWV1ZV9zZXRzW2kxXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0RCQV9PUF9DT0RFX1NFVF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkyOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuc2V0X3Jlc3BvbnNlLnF1ZXVlX3NldHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfcmVzcG9uc2UucXVldWVfc2V0c19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9yZXNwb25zZS5xdWV1ZV9zZXRzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicXVldWVfc2V0c1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3Byb3ZfYmFzZV9zZXRfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5zZXRfcmVzcG9uc2UucXVldWVfc2V0cyA9IChiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9xdWV1ZV9zZXQgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnF1ZXVlX3NldHNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcXVldWVfc2V0KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCB0aGlzLT51LnNldF9yZXNwb25zZS5xdWV1ZV9zZXRzX2NvdW50OyBpMisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9xdWV1ZV9zZXRfdW5wYWNrKCZ0aGlzLT51LnNldF9yZXNwb25zZS5xdWV1ZV9zZXRzW2kyXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9wcm92X2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfb3BfY29kZSBkYmFfY29kZTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX29wX2NvZGVfdW5wYWNrKCZkYmFfY29kZSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGRiYV9jb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0RCQV9PUF9DT0RFX0dFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19EQkFfT1BfQ09ERV9HRVRfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBxdWV1ZV9zZXRzX2NvdW50OworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmcXVldWVfc2V0c19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9xdWV1ZV9zZXQpICogcXVldWVfc2V0c19jb3VudCk7CisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgcXVldWVfc2V0c19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcXVldWVfc2V0X3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0RCQV9PUF9DT0RFX1NFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgcXVldWVfc2V0c19jb3VudDsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkxOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJnF1ZXVlX3NldHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcXVldWVfc2V0KSAqIHF1ZXVlX3NldHNfY291bnQpOworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHF1ZXVlX3NldHNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3F1ZXVlX3NldF9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19EQkFfT1BfQ09ERV9TRVRfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBxdWV1ZV9zZXRzX2NvdW50OworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTI7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmcXVldWVfc2V0c19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9xdWV1ZV9zZXQpICogcXVldWVfc2V0c19jb3VudCk7CisgICAgICAgICAgICAgICAgZm9yIChpMiA9IDA7IGkyIDwgcXVldWVfc2V0c19jb3VudDsgaTIrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcXVldWVfc2V0X3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29sZF9tYW5hZ2VtZW50X29iamVjdF9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbGRfbWFuYWdlbWVudF9vYmplY3RfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9vbGRfbWFuYWdlbWVudF9vYmplY3RfcGFjayh0aGlzLT5sZWFmLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5sZW5ndGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmxlbmd0aCk7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+bGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX09MRF9NQU5BR0VNRU5UX09CSkVDVF9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUucG9ydC5wb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX29sZF9tYW5hZ2VtZW50X29iamVjdF9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfb2xkX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2UgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPmxlbmd0aCA+PSAweDAwODApCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy0+bGVuZ3RoOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB1aW50MzJfdCBjb3VudCA9IDM7CisgICAgICAgIHN3aXRjaCAodGhpcy0+bGVhZikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfT0xEX01BTkFHRU1FTlRfT0JKRUNUX1BPUlQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb2xkX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb2xkX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfb2xkX21hbmFnZW1lbnRfb2JqZWN0X3VucGFjaygmdGhpcy0+bGVhZiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5sZW5ndGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+bGVuZ3RoID09IDApID8gMHgwMDgwIDogdGhpcy0+bGVuZ3RoLCBidWYtPmN1cnIpOworICAgIHN3aXRjaCAodGhpcy0+bGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX09MRF9NQU5BR0VNRU5UX09CSkVDVF9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wb3J0LnBvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+bGVuZ3RoID09IDApID8gMHgwMDgwIDogdGhpcy0+bGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbGRfbWFuYWdlbWVudF9vYmplY3RfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfb2xkX21hbmFnZW1lbnRfb2JqZWN0IGxlYWY7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX29sZF9tYW5hZ2VtZW50X29iamVjdF91bnBhY2soJmxlYWYsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICBzd2l0Y2ggKGxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9PTERfTUFOQUdFTUVOVF9PQkpFQ1RfUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfbWFuYWdlbWVudF9vYmplY3RfcGFjayh0aGlzLT5sZWFmLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5sZW5ndGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmxlbmd0aCk7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+bGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX01BTkFHRU1FTlRfT0JKRUNUX1BPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3BvcnRfdHlwZV9wYWNrKHRoaXMtPnUucG9ydC5wb3J0X3R5cGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5wb3J0LmNhc2NhZGVfc2xvdF9udW1iZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnBvcnQucG9ydF9udW1iZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9NQU5BR0VNRU5UX09CSkVDVF9DQVJEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmNhcmQuY2FyZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX01BTkFHRU1FTlRfT0JKRUNUX0xMSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUubGxpZC5sbGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfTUFOQUdFTUVOVF9PQkpFQ1RfUE9OX0lGOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LnBvbl9pZi5wb25faWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9NQU5BR0VNRU5UX09CSkVDVF9PTlU6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19tYW5hZ2VtZW50X29iamVjdF9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfbWFuYWdlbWVudF9vYmplY3RfYmFzZSAqdGhpcykKK3sKKyAgICBpZiAodGhpcy0+bGVuZ3RoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLT5sZW5ndGg7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHVpbnQzMl90IGNvdW50ID0gMzsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5sZWFmKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9NQU5BR0VNRU5UX09CSkVDVF9QT1JUOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9NQU5BR0VNRU5UX09CSkVDVF9DQVJEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9NQU5BR0VNRU5UX09CSkVDVF9MTElEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9NQU5BR0VNRU5UX09CSkVDVF9QT05fSUY6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX01BTkFHRU1FTlRfT0JKRUNUX09OVToKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbWFuYWdlbWVudF9vYmplY3RfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tYW5hZ2VtZW50X29iamVjdF9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX21hbmFnZW1lbnRfb2JqZWN0X3VucGFjaygmdGhpcy0+bGVhZiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5sZW5ndGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+bGVuZ3RoID09IDApID8gMHgwMDgwIDogdGhpcy0+bGVuZ3RoLCBidWYtPmN1cnIpOworICAgIHN3aXRjaCAodGhpcy0+bGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX01BTkFHRU1FTlRfT0JKRUNUX1BPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3BvcnRfdHlwZV91bnBhY2soJnRoaXMtPnUucG9ydC5wb3J0X3R5cGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucG9ydC5jYXNjYWRlX3Nsb3RfbnVtYmVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBvcnQucG9ydF9udW1iZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9NQU5BR0VNRU5UX09CSkVDVF9DQVJEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuY2FyZC5jYXJkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfTUFOQUdFTUVOVF9PQkpFQ1RfTExJRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmxsaWQubGxpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX01BTkFHRU1FTlRfT0JKRUNUX1BPTl9JRjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBvbl9pZi5wb25faWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9NQU5BR0VNRU5UX09CSkVDVF9PTlU6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT5sZW5ndGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT5sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX21hbmFnZW1lbnRfb2JqZWN0IGxlYWY7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX21hbmFnZW1lbnRfb2JqZWN0X3VucGFjaygmbGVhZiwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAobGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX01BTkFHRU1FTlRfT0JKRUNUX1BPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX01BTkFHRU1FTlRfT0JKRUNUX0NBUkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9NQU5BR0VNRU5UX09CSkVDVF9MTElEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfTUFOQUdFTUVOVF9PQkpFQ1RfUE9OX0lGOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfTUFOQUdFTUVOVF9PQkpFQ1RfT05VOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19lbXB0eV92YXJfY29udGFpbmVyX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2VtcHR5X3Zhcl9jb250YWluZXJfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19icmFuY2hfcGFjayh0aGlzLT5icmFuY2gsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5icmFuY2gpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5lbmQudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmtub3duXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19lbXB0eV92YXJfY29udGFpbmVyX2Jhc2VfZW5kXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZW5kLnVua25vd24sIHRoaXMtPnUuZW5kLnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hdHRyaWJ1dGVfcGFjayh0aGlzLT51LmF0dHJpYnV0ZS5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9lcnJvcl9jb2RlX3BhY2sodGhpcy0+dS5hdHRyaWJ1dGUuZXJyb3IsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2FjdGlvbl9wYWNrKHRoaXMtPnUuYWN0aW9uLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX2Vycm9yX2NvZGVfcGFjayh0aGlzLT51LmFjdGlvbi5lcnJvciwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9PTERfTUFOQUdFTUVOVF9PQkpFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29sZF9tYW5hZ2VtZW50X29iamVjdF9iYXNlX3BhY2soJnRoaXMtPnUub2xkX21hbmFnZW1lbnRfb2JqZWN0Lm9iamVjdCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9NQU5BR0VNRU5UX09CSkVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbWFuYWdlbWVudF9vYmplY3RfYmFzZV9wYWNrKCZ0aGlzLT51Lm1hbmFnZW1lbnRfb2JqZWN0Lm9iamVjdCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FWFRfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hdHRyaWJ1dGVfcGFjayh0aGlzLT51LmV4dF9hdHRyaWJ1dGUubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZXJyb3JfY29kZV9wYWNrKHRoaXMtPnUuZXh0X2F0dHJpYnV0ZS5lcnJvciwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FWFRfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hY3Rpb25fcGFjayh0aGlzLT51LmV4dF9hY3Rpb24ubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZXJyb3JfY29kZV9wYWNrKHRoaXMtPnUuZXh0X2FjdGlvbi5lcnJvciwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9LVEFUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYXR0cmlidXRlX3BhY2sodGhpcy0+dS5rdGF0dHJpYnV0ZS5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9lcnJvcl9jb2RlX3BhY2sodGhpcy0+dS5rdGF0dHJpYnV0ZS5lcnJvciwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9LVEFDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYXR0cmlidXRlX3BhY2sodGhpcy0+dS5rdGFjdGlvbi5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9lcnJvcl9jb2RlX3BhY2sodGhpcy0+dS5rdGFjdGlvbi5lcnJvciwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5kZWYubGVhZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX2Vycm9yX2NvZGVfcGFjayh0aGlzLT51LmRlZi5lcnJvciwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfZW1wdHlfdmFyX2NvbnRhaW5lcl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfZW1wdHlfdmFyX2NvbnRhaW5lcl9iYXNlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICBzd2l0Y2ggKHRoaXMtPmJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IHRoaXMtPnUuZW5kLnVua25vd25fY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfT0xEX01BTkFHRU1FTlRfT0JKRUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9jdGNfb2xkX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUub2xkX21hbmFnZW1lbnRfb2JqZWN0Lm9iamVjdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9NQU5BR0VNRU5UX09CSkVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fY3RjX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUubWFuYWdlbWVudF9vYmplY3Qub2JqZWN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0VYVF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0VYVF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0tUQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9LVEFDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19lbXB0eV92YXJfY29udGFpbmVyX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZW1wdHlfdmFyX2NvbnRhaW5lcl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2JyYW5jaF91bnBhY2soJnRoaXMtPmJyYW5jaCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgPSBiY21vbHRfZXBvbl9vYW1fY3RjX2VtcHR5X3Zhcl9jb250YWluZXJfYmFzZV9lbmRfY291bnRfdW5rbm93bihidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCA+IDApICYmICh0aGlzLT51LmVuZC51bmtub3duID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidW5rbm93blwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfZW1wdHlfdmFyX2NvbnRhaW5lcl9iYXNlX2VuZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmVuZC51bmtub3duID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LmVuZC51bmtub3duLCB0aGlzLT51LmVuZC51bmtub3duX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlX3VucGFjaygmdGhpcy0+dS5hdHRyaWJ1dGUubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZXJyb3JfY29kZV91bnBhY2soJnRoaXMtPnUuYXR0cmlidXRlLmVycm9yLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hY3Rpb25fdW5wYWNrKCZ0aGlzLT51LmFjdGlvbi5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9lcnJvcl9jb2RlX3VucGFjaygmdGhpcy0+dS5hY3Rpb24uZXJyb3IsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfT0xEX01BTkFHRU1FTlRfT0JKRUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbGRfbWFuYWdlbWVudF9vYmplY3RfYmFzZV91bnBhY2soJnRoaXMtPnUub2xkX21hbmFnZW1lbnRfb2JqZWN0Lm9iamVjdCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX01BTkFHRU1FTlRfT0JKRUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19tYW5hZ2VtZW50X29iamVjdF9iYXNlX3VucGFjaygmdGhpcy0+dS5tYW5hZ2VtZW50X29iamVjdC5vYmplY3QsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FWFRfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hdHRyaWJ1dGVfdW5wYWNrKCZ0aGlzLT51LmV4dF9hdHRyaWJ1dGUubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZXJyb3JfY29kZV91bnBhY2soJnRoaXMtPnUuZXh0X2F0dHJpYnV0ZS5lcnJvciwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FWFRfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hY3Rpb25fdW5wYWNrKCZ0aGlzLT51LmV4dF9hY3Rpb24ubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZXJyb3JfY29kZV91bnBhY2soJnRoaXMtPnUuZXh0X2FjdGlvbi5lcnJvciwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9LVEFUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYXR0cmlidXRlX3VucGFjaygmdGhpcy0+dS5rdGF0dHJpYnV0ZS5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9lcnJvcl9jb2RlX3VucGFjaygmdGhpcy0+dS5rdGF0dHJpYnV0ZS5lcnJvciwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9LVEFDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYXR0cmlidXRlX3VucGFjaygmdGhpcy0+dS5rdGFjdGlvbi5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9lcnJvcl9jb2RlX3VucGFjaygmdGhpcy0+dS5rdGFjdGlvbi5lcnJvciwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5kZWYubGVhZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX2Vycm9yX2NvZGVfdW5wYWNrKCZ0aGlzLT51LmRlZi5lcnJvciwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19lbXB0eV92YXJfY29udGFpbmVyX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19icmFuY2ggYnJhbmNoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19icmFuY2hfdW5wYWNrKCZicmFuY2gsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChicmFuY2gpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB1bmtub3duX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB1bmtub3duX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodW5rbm93bl9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9PTERfTUFOQUdFTUVOVF9PQkpFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29sZF9tYW5hZ2VtZW50X29iamVjdF9iYXNlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX01BTkFHRU1FTlRfT0JKRUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19tYW5hZ2VtZW50X29iamVjdF9iYXNlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0VYVF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0VYVF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0tUQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9LVEFDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19lbXB0eV92YXJfY29udGFpbmVyX2Jhc2VfZW5kX2NvdW50X3Vua25vd24oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V0aF9wb3J0X3BvbGljaW5nX2NvbmZpZ19iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19jb25maWdfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19lbmFibGVfcGFjayh0aGlzLT5zdGF0ZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnN0YXRlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VUSF9QT1JUX1BPTElDSU5HX0VOQUJMRV9ESVNBQkxFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfRVRIX1BPUlRfUE9MSUNJTkdfRU5BQkxFX0VOQUJMRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UyNChidWYsIHRoaXMtPnUuZW5hYmxlZC5jaXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MjQoYnVmLCB0aGlzLT51LmVuYWJsZWQuYnVja2V0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTI0KGJ1ZiwgdGhpcy0+dS5lbmFibGVkLmV4dHJhX2J1cnN0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZGVmLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5kZWYudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmtub3duXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19jb25maWdfYmFzZV9kZWZcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5kZWYudW5rbm93biwgdGhpcy0+dS5kZWYudW5rbm93bl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX2V0aF9wb3J0X3BvbGljaW5nX2NvbmZpZ19iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfY29uZmlnX2Jhc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+c3RhdGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfRVRIX1BPUlRfUE9MSUNJTkdfRU5BQkxFX0RJU0FCTEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19FVEhfUE9SVF9QT0xJQ0lOR19FTkFCTEVfRU5BQkxFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gdGhpcy0+dS5kZWYudW5rbm93bl9jb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19jb25maWdfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19jb25maWdfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19lbmFibGVfdW5wYWNrKCZ0aGlzLT5zdGF0ZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnN0YXRlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VUSF9QT1JUX1BPTElDSU5HX0VOQUJMRV9ESVNBQkxFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfRVRIX1BPUlRfUE9MSUNJTkdfRU5BQkxFX0VOQUJMRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTI0KGJ1ZiwgJnRoaXMtPnUuZW5hYmxlZC5jaXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UyNChidWYsICZ0aGlzLT51LmVuYWJsZWQuYnVja2V0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MjQoYnVmLCAmdGhpcy0+dS5lbmFibGVkLmV4dHJhX2J1cnN0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLT51LmRlZi51bmtub3duX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19jb25maWdfYmFzZV9kZWZfY291bnRfdW5rbm93bihidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5kZWYudW5rbm93bl9jb3VudCA+IDApICYmICh0aGlzLT51LmRlZi51bmtub3duID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidW5rbm93blwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfY29uZmlnX2Jhc2VfZGVmXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZGVmLnVua25vd24gPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5kZWYudW5rbm93bl9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuZGVmLnVua25vd24sIHRoaXMtPnUuZGVmLnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V0aF9wb3J0X3BvbGljaW5nX2NvbmZpZ19iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfZW5hYmxlIHN0YXRlOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19lbmFibGVfdW5wYWNrKCZzdGF0ZSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHN0YXRlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VUSF9QT1JUX1BPTElDSU5HX0VOQUJMRV9ESVNBQkxFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfRVRIX1BPUlRfUE9MSUNJTkdfRU5BQkxFX0VOQUJMRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdW5rbm93bl9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bl9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHVua25vd25fZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfY29uZmlnX2Jhc2VfZGVmX2NvdW50X3Vua25vd24oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2VudHJ5X3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9lbnRyeSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX21hbmFnZW1lbnRfb2JqZWN0X3BhY2sodGhpcy0+b2JqZWN0X3R5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPm9iamVjdF9pbnN0YW5jZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9hbGFybV9pZF9wYWNrKHRoaXMtPmFsYXJtX2lkLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2VudHJ5X3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2VudHJ5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfbWFuYWdlbWVudF9vYmplY3RfdW5wYWNrKCZ0aGlzLT5vYmplY3RfdHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+b2JqZWN0X2luc3RhbmNlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2FsYXJtX2lkX3VucGFjaygmdGhpcy0+YWxhcm1faWQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfZW50cnlfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA4KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXNfZW50cnlfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N0YXR1c19lbnRyeSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9lbnRyeV9wYWNrKCZ0aGlzLT5ldmVudF9lbnRyeSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3RhdHVzX3BhY2sodGhpcy0+ZXZlbnRfc3RhdHVzLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N0YXR1c19lbnRyeV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXNfZW50cnkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfZW50cnlfdW5wYWNrKCZ0aGlzLT5ldmVudF9lbnRyeSwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT5ldmVudF9zdGF0dXMsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3RhdHVzX2VudHJ5X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3RocmVzaG9sZF9lbnRyeV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfdGhyZXNob2xkX2VudHJ5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2VudHJ5X3BhY2soJnRoaXMtPmV2ZW50X2VudHJ5LCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5zZXRfdGhyZXNob2xkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+Y2xlYXJfdGhyZXNob2xkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF90aHJlc2hvbGRfZW50cnlfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfdGhyZXNob2xkX2VudHJ5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2VudHJ5X3VucGFjaygmdGhpcy0+ZXZlbnRfZW50cnksIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+c2V0X3RocmVzaG9sZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmNsZWFyX3RocmVzaG9sZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfdGhyZXNob2xkX2VudHJ5X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3ViX3R5cGVfcGFjayh0aGlzLT5zdWJfdHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnN1Yl90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VWRU5UX1NVQl9UWVBFX1NUQVRVU19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IGkwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnN0YXR1c19yZXF1ZXN0LmVudHJ5X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc3RhdHVzX3JlcXVlc3QuZW50cnlfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zdGF0dXNfcmVxdWVzdC5lbnRyaWVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImVudHJpZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2Jhc2Vfc3RhdHVzX3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5zdGF0dXNfcmVxdWVzdC5lbnRyeV9jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9lbnRyeV9wYWNrKCZ0aGlzLT51LnN0YXR1c19yZXF1ZXN0LmVudHJpZXNbaTBdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VWRU5UX1NVQl9UWVBFX1NUQVRVU19TRVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgaTE7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuc3RhdHVzX3NldC5lbnRyeV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnN0YXR1c19zZXQuZW50cnlfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zdGF0dXNfc2V0LmVudHJpZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZW50cmllc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfYmFzZV9zdGF0dXNfc2V0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHRoaXMtPnUuc3RhdHVzX3NldC5lbnRyeV9jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXNfZW50cnlfcGFjaygmdGhpcy0+dS5zdGF0dXNfc2V0LmVudHJpZXNbaTFdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VWRU5UX1NVQl9UWVBFX1NUQVRVU19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBpMjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5zdGF0dXNfcmVzcG9uc2UuZW50cnlfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zdGF0dXNfcmVzcG9uc2UuZW50cnlfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zdGF0dXNfcmVzcG9uc2UuZW50cmllcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJlbnRyaWVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9iYXNlX3N0YXR1c19yZXNwb25zZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCB0aGlzLT51LnN0YXR1c19yZXNwb25zZS5lbnRyeV9jb3VudDsgaTIrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXNfZW50cnlfcGFjaygmdGhpcy0+dS5zdGF0dXNfcmVzcG9uc2UuZW50cmllc1tpMl0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfRVZFTlRfU1VCX1RZUEVfVEhSRVNIT0xEX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgaTM7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUudGhyZXNob2xkX3JlcXVlc3QuZW50cnlfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS50aHJlc2hvbGRfcmVxdWVzdC5lbnRyeV9jb3VudCA+IDApICYmICh0aGlzLT51LnRocmVzaG9sZF9yZXF1ZXN0LmVudHJpZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZW50cmllc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfYmFzZV90aHJlc2hvbGRfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkzID0gMDsgaTMgPCB0aGlzLT51LnRocmVzaG9sZF9yZXF1ZXN0LmVudHJ5X2NvdW50OyBpMysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2VudHJ5X3BhY2soJnRoaXMtPnUudGhyZXNob2xkX3JlcXVlc3QuZW50cmllc1tpM10sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfRVZFTlRfU1VCX1RZUEVfVEhSRVNIT0xEX1NFVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBpNDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS50aHJlc2hvbGRfc2V0LmVudHJ5X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUudGhyZXNob2xkX3NldC5lbnRyeV9jb3VudCA+IDApICYmICh0aGlzLT51LnRocmVzaG9sZF9zZXQuZW50cmllcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJlbnRyaWVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9iYXNlX3RocmVzaG9sZF9zZXRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNCA9IDA7IGk0IDwgdGhpcy0+dS50aHJlc2hvbGRfc2V0LmVudHJ5X2NvdW50OyBpNCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3RocmVzaG9sZF9lbnRyeV9wYWNrKCZ0aGlzLT51LnRocmVzaG9sZF9zZXQuZW50cmllc1tpNF0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfRVZFTlRfU1VCX1RZUEVfVEhSRVNIT0xEX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IGk1OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnRocmVzaG9sZF9yZXNwb25zZS5lbnRyeV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnRocmVzaG9sZF9yZXNwb25zZS5lbnRyeV9jb3VudCA+IDApICYmICh0aGlzLT51LnRocmVzaG9sZF9yZXNwb25zZS5lbnRyaWVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImVudHJpZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2Jhc2VfdGhyZXNob2xkX3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTUgPSAwOyBpNSA8IHRoaXMtPnUudGhyZXNob2xkX3Jlc3BvbnNlLmVudHJ5X2NvdW50OyBpNSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3RocmVzaG9sZF9lbnRyeV9wYWNrKCZ0aGlzLT51LnRocmVzaG9sZF9yZXNwb25zZS5lbnRyaWVzW2k1XSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2Jhc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+c3ViX3R5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfRVZFTlRfU1VCX1RZUEVfU1RBVFVTX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMiArICg4ICogdGhpcy0+dS5zdGF0dXNfcmVxdWVzdC5lbnRyeV9jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VWRU5UX1NVQl9UWVBFX1NUQVRVU19TRVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMiArICgxMiAqIHRoaXMtPnUuc3RhdHVzX3NldC5lbnRyeV9jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VWRU5UX1NVQl9UWVBFX1NUQVRVU19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyICsgKDEyICogdGhpcy0+dS5zdGF0dXNfcmVzcG9uc2UuZW50cnlfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19FVkVOVF9TVUJfVFlQRV9USFJFU0hPTERfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyICsgKDggKiB0aGlzLT51LnRocmVzaG9sZF9yZXF1ZXN0LmVudHJ5X2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfRVZFTlRfU1VCX1RZUEVfVEhSRVNIT0xEX1NFVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyICsgKDE2ICogdGhpcy0+dS50aHJlc2hvbGRfc2V0LmVudHJ5X2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfRVZFTlRfU1VCX1RZUEVfVEhSRVNIT0xEX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDIgKyAoMTYgKiB0aGlzLT51LnRocmVzaG9sZF9yZXNwb25zZS5lbnRyeV9jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3ViX3R5cGVfdW5wYWNrKCZ0aGlzLT5zdWJfdHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnN1Yl90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VWRU5UX1NVQl9UWVBFX1NUQVRVU19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IGkwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LnN0YXR1c19yZXF1ZXN0LmVudHJ5X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc3RhdHVzX3JlcXVlc3QuZW50cnlfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zdGF0dXNfcmVxdWVzdC5lbnRyaWVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZW50cmllc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfYmFzZV9zdGF0dXNfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnN0YXR1c19yZXF1ZXN0LmVudHJpZXMgPSAoYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9lbnRyeSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5zdGF0dXNfcmVxdWVzdC5lbnRyeV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2VudHJ5KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LnN0YXR1c19yZXF1ZXN0LmVudHJ5X2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2VudHJ5X3VucGFjaygmdGhpcy0+dS5zdGF0dXNfcmVxdWVzdC5lbnRyaWVzW2kwXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VWRU5UX1NVQl9UWVBFX1NUQVRVU19TRVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgaTE7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuc3RhdHVzX3NldC5lbnRyeV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnN0YXR1c19zZXQuZW50cnlfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zdGF0dXNfc2V0LmVudHJpZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJlbnRyaWVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9iYXNlX3N0YXR1c19zZXRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5zdGF0dXNfc2V0LmVudHJpZXMgPSAoYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXNfZW50cnkgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuc3RhdHVzX3NldC5lbnRyeV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N0YXR1c19lbnRyeSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5zdGF0dXNfc2V0LmVudHJ5X2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N0YXR1c19lbnRyeV91bnBhY2soJnRoaXMtPnUuc3RhdHVzX3NldC5lbnRyaWVzW2kxXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VWRU5UX1NVQl9UWVBFX1NUQVRVU19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBpMjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5zdGF0dXNfcmVzcG9uc2UuZW50cnlfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zdGF0dXNfcmVzcG9uc2UuZW50cnlfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zdGF0dXNfcmVzcG9uc2UuZW50cmllcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImVudHJpZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2Jhc2Vfc3RhdHVzX3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuc3RhdHVzX3Jlc3BvbnNlLmVudHJpZXMgPSAoYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXNfZW50cnkgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuc3RhdHVzX3Jlc3BvbnNlLmVudHJ5X2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3RhdHVzX2VudHJ5KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCB0aGlzLT51LnN0YXR1c19yZXNwb25zZS5lbnRyeV9jb3VudDsgaTIrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXNfZW50cnlfdW5wYWNrKCZ0aGlzLT51LnN0YXR1c19yZXNwb25zZS5lbnRyaWVzW2kyXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VWRU5UX1NVQl9UWVBFX1RIUkVTSE9MRF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IGkzOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LnRocmVzaG9sZF9yZXF1ZXN0LmVudHJ5X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUudGhyZXNob2xkX3JlcXVlc3QuZW50cnlfY291bnQgPiAwKSAmJiAodGhpcy0+dS50aHJlc2hvbGRfcmVxdWVzdC5lbnRyaWVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZW50cmllc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfYmFzZV90aHJlc2hvbGRfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnRocmVzaG9sZF9yZXF1ZXN0LmVudHJpZXMgPSAoYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9lbnRyeSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS50aHJlc2hvbGRfcmVxdWVzdC5lbnRyeV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2VudHJ5KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkzID0gMDsgaTMgPCB0aGlzLT51LnRocmVzaG9sZF9yZXF1ZXN0LmVudHJ5X2NvdW50OyBpMysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2VudHJ5X3VucGFjaygmdGhpcy0+dS50aHJlc2hvbGRfcmVxdWVzdC5lbnRyaWVzW2kzXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VWRU5UX1NVQl9UWVBFX1RIUkVTSE9MRF9TRVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgaTQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUudGhyZXNob2xkX3NldC5lbnRyeV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnRocmVzaG9sZF9zZXQuZW50cnlfY291bnQgPiAwKSAmJiAodGhpcy0+dS50aHJlc2hvbGRfc2V0LmVudHJpZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJlbnRyaWVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9iYXNlX3RocmVzaG9sZF9zZXRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS50aHJlc2hvbGRfc2V0LmVudHJpZXMgPSAoYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF90aHJlc2hvbGRfZW50cnkgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUudGhyZXNob2xkX3NldC5lbnRyeV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3RocmVzaG9sZF9lbnRyeSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNCA9IDA7IGk0IDwgdGhpcy0+dS50aHJlc2hvbGRfc2V0LmVudHJ5X2NvdW50OyBpNCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3RocmVzaG9sZF9lbnRyeV91bnBhY2soJnRoaXMtPnUudGhyZXNob2xkX3NldC5lbnRyaWVzW2k0XSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VWRU5UX1NVQl9UWVBFX1RIUkVTSE9MRF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBpNTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS50aHJlc2hvbGRfcmVzcG9uc2UuZW50cnlfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS50aHJlc2hvbGRfcmVzcG9uc2UuZW50cnlfY291bnQgPiAwKSAmJiAodGhpcy0+dS50aHJlc2hvbGRfcmVzcG9uc2UuZW50cmllcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImVudHJpZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2Jhc2VfdGhyZXNob2xkX3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUudGhyZXNob2xkX3Jlc3BvbnNlLmVudHJpZXMgPSAoYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF90aHJlc2hvbGRfZW50cnkgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUudGhyZXNob2xkX3Jlc3BvbnNlLmVudHJ5X2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfdGhyZXNob2xkX2VudHJ5KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk1ID0gMDsgaTUgPCB0aGlzLT51LnRocmVzaG9sZF9yZXNwb25zZS5lbnRyeV9jb3VudDsgaTUrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF90aHJlc2hvbGRfZW50cnlfdW5wYWNrKCZ0aGlzLT51LnRocmVzaG9sZF9yZXNwb25zZS5lbnRyaWVzW2k1XSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdWJfdHlwZSBzdWJfdHlwZTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3ViX3R5cGVfdW5wYWNrKCZzdWJfdHlwZSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHN1Yl90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VWRU5UX1NVQl9UWVBFX1NUQVRVU19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IGVudHJ5X2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZlbnRyeV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2VudHJ5KSAqIGVudHJ5X2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGVudHJ5X2NvdW50ICogOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19FVkVOVF9TVUJfVFlQRV9TVEFUVVNfU0VUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IGVudHJ5X2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZlbnRyeV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N0YXR1c19lbnRyeSkgKiBlbnRyeV9jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBlbnRyeV9jb3VudCAqIDEyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VWRU5UX1NVQl9UWVBFX1NUQVRVU19SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBlbnRyeV9jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYocGFja2VkLCAmZW50cnlfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXNfZW50cnkpICogZW50cnlfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgZW50cnlfY291bnQgKiAxMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19FVkVOVF9TVUJfVFlQRV9USFJFU0hPTERfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBlbnRyeV9jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYocGFja2VkLCAmZW50cnlfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9lbnRyeSkgKiBlbnRyeV9jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBlbnRyeV9jb3VudCAqIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfRVZFTlRfU1VCX1RZUEVfVEhSRVNIT0xEX1NFVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBlbnRyeV9jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYocGFja2VkLCAmZW50cnlfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF90aHJlc2hvbGRfZW50cnkpICogZW50cnlfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgZW50cnlfY291bnQgKiAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19FVkVOVF9TVUJfVFlQRV9USFJFU0hPTERfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgZW50cnlfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmVudHJ5X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfdGhyZXNob2xkX2VudHJ5KSAqIGVudHJ5X2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGVudHJ5X2NvdW50ICogMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2FjdGlvbl92YWx1ZV9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYWN0aW9uX3ZhbHVlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYWN0aW9uX3BhY2sodGhpcy0+bGVhZiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQUNUSU9OX1JFU0VUX09OVToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQUNUSU9OX0ZBU1RfTEVBVkVfQURNSU5fQ09OVFJPTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuZmFzdF9sZWF2ZV9hZG1pbl9jb250cm9sLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmZhc3RfbGVhdmVfYWRtaW5fY29udHJvbC53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19hY3RpdmF0aW9uX3BhY2sodGhpcy0+dS5mYXN0X2xlYXZlX2FkbWluX2NvbnRyb2wuYWN0aXZhdGVfZmFzdF9sZWF2ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQUNUSU9OX01VTFRJX0xMSURfQURNSU5fQ09OVFJPTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUubXVsdGlfbGxpZF9hZG1pbl9jb250cm9sLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm11bHRpX2xsaWRfYWRtaW5fY29udHJvbC53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51Lm11bHRpX2xsaWRfYWRtaW5fY29udHJvbC5udW1fbGxpZHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BQ1RJT05fUkVTRVRfQ0FSRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQUNUSU9OX1NMRUVQX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnNsZWVwX2NvbnRyb2wud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuc2xlZXBfY29udHJvbC53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LnNsZWVwX2NvbnRyb2wuc2xlZXBfZHVyYXRpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LnNsZWVwX2NvbnRyb2wud2FrZV9kdXJhdGlvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zbGVlcF9mbGFnX3BhY2sodGhpcy0+dS5zbGVlcF9jb250cm9sLnNsZWVwX2ZsYWcsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zbGVlcF9tb2RlX3BhY2sodGhpcy0+dS5zbGVlcF9jb250cm9sLnNsZWVwX21vZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuZGVmLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmRlZi53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hY3Rpb25fdmFsdWVfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hY3Rpb25fdmFsdWVfYmFzZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDI7CisgICAgc3dpdGNoICh0aGlzLT5sZWFmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FDVElPTl9SRVNFVF9PTlU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FDVElPTl9GQVNUX0xFQVZFX0FETUlOX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQUNUSU9OX01VTFRJX0xMSURfQURNSU5fQ09OVFJPTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BQ1RJT05fUkVTRVRfQ0FSRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQUNUSU9OX1NMRUVQX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hY3Rpb25fdmFsdWVfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYWN0aW9uX3ZhbHVlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYWN0aW9uX3VucGFjaygmdGhpcy0+bGVhZiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQUNUSU9OX1JFU0VUX09OVToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQUNUSU9OX0ZBU1RfTEVBVkVfQURNSU5fQ09OVFJPTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5mYXN0X2xlYXZlX2FkbWluX2NvbnRyb2wud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmZhc3RfbGVhdmVfYWRtaW5fY29udHJvbC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LmZhc3RfbGVhdmVfYWRtaW5fY29udHJvbC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuZmFzdF9sZWF2ZV9hZG1pbl9jb250cm9sLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19hY3RpdmF0aW9uX3VucGFjaygmdGhpcy0+dS5mYXN0X2xlYXZlX2FkbWluX2NvbnRyb2wuYWN0aXZhdGVfZmFzdF9sZWF2ZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUuZmFzdF9sZWF2ZV9hZG1pbl9jb250cm9sLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5mYXN0X2xlYXZlX2FkbWluX2NvbnRyb2wud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQUNUSU9OX01VTFRJX0xMSURfQURNSU5fQ09OVFJPTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5tdWx0aV9sbGlkX2FkbWluX2NvbnRyb2wud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm11bHRpX2xsaWRfYWRtaW5fY29udHJvbC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51Lm11bHRpX2xsaWRfYWRtaW5fY29udHJvbC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUubXVsdGlfbGxpZF9hZG1pbl9jb250cm9sLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUubXVsdGlfbGxpZF9hZG1pbl9jb250cm9sLm51bV9sbGlkcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5tdWx0aV9sbGlkX2FkbWluX2NvbnRyb2wud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm11bHRpX2xsaWRfYWRtaW5fY29udHJvbC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BQ1RJT05fUkVTRVRfQ0FSRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQUNUSU9OX1NMRUVQX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuc2xlZXBfY29udHJvbC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuc2xlZXBfY29udHJvbC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LnNsZWVwX2NvbnRyb2wud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LnNsZWVwX2NvbnRyb2wud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zbGVlcF9jb250cm9sLnNsZWVwX2R1cmF0aW9uKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnNsZWVwX2NvbnRyb2wud2FrZV9kdXJhdGlvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zbGVlcF9mbGFnX3VucGFjaygmdGhpcy0+dS5zbGVlcF9jb250cm9sLnNsZWVwX2ZsYWcsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NsZWVwX21vZGVfdW5wYWNrKCZ0aGlzLT51LnNsZWVwX2NvbnRyb2wuc2xlZXBfbW9kZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUuc2xlZXBfY29udHJvbC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuc2xlZXBfY29udHJvbC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZGVmLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5kZWYud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5kZWYud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmRlZi53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LmRlZi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuZGVmLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYWN0aW9uX3ZhbHVlX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hY3Rpb24gbGVhZjsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYWN0aW9uX3VucGFjaygmbGVhZiwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQUNUSU9OX1JFU0VUX09OVToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQUNUSU9OX0ZBU1RfTEVBVkVfQURNSU5fQ09OVFJPTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FDVElPTl9NVUxUSV9MTElEX0FETUlOX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BQ1RJT05fUkVTRVRfQ0FSRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQUNUSU9OX1NMRUVQX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfdGFibGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV90YWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnF1ZXVlX251bWJlcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmZpeGVkX3BhY2tldF9zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+Zml4ZWRfYmFuZHdpZHRoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+Z3VhcmFudGVlZF9iYW5kd2lkdGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5iZXN0X2VmZm9ydF9iYW5kd2lkdGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPndycl93ZWlnaHQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV90YWJsZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfdGFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5xdWV1ZV9udW1iZXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5maXhlZF9wYWNrZXRfc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmZpeGVkX2JhbmR3aWR0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmd1YXJhbnRlZWRfYmFuZHdpZHRoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+YmVzdF9lZmZvcnRfYmFuZHdpZHRoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT53cnJfd2VpZ2h0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfdGFibGVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3NlcnZpY2Vfc2xhX29wZXJhdGlvbl9wYWNrKHRoaXMtPm9wZXJhdGlvbl9vZl9zZXJ2aWNlX2RiYSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm9wZXJhdGlvbl9vZl9zZXJ2aWNlX2RiYSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19TRVJWSUNFX1NMQV9PUEVSQVRJT05fREVBQ1RJVkFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfU0VSVklDRV9TTEFfT1BFUkFUSU9OX0FDVElWQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9kYmFfc2NoZWR1bGluZ19zY2hlbWVfcGFjayh0aGlzLT51LmFjdGl2YXRlLnNjaGVtZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmFjdGl2YXRlLnByaW9yaXR5KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5hY3RpdmF0ZS5jeWNsZV9sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuYWN0aXZhdGUuc2VydmljZXNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5hY3RpdmF0ZS5zZXJ2aWNlc19jb3VudCA+IDApICYmICh0aGlzLT51LmFjdGl2YXRlLnNlcnZpY2VzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInNlcnZpY2VzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfYmFzZV9hY3RpdmF0ZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmFjdGl2YXRlLnNlcnZpY2VzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV90YWJsZV9wYWNrKCZ0aGlzLT51LmFjdGl2YXRlLnNlcnZpY2VzW2kwXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmRlZi5zZXJ2aWNlc19jb3VudCA+IDApICYmICh0aGlzLT51LmRlZi5zZXJ2aWNlcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJzZXJ2aWNlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX2Jhc2VfZGVmXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZGVmLnNlcnZpY2VzLCB0aGlzLT51LmRlZi5zZXJ2aWNlc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX2Jhc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+b3BlcmF0aW9uX29mX3NlcnZpY2VfZGJhKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NFUlZJQ0VfU0xBX09QRVJBVElPTl9ERUFDVElWQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19TRVJWSUNFX1NMQV9PUEVSQVRJT05fQUNUSVZBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNyArICgxMCAqIHRoaXMtPnUuYWN0aXZhdGUuc2VydmljZXNfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gdGhpcy0+dS5kZWYuc2VydmljZXNfY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfc2VydmljZV9zbGFfb3BlcmF0aW9uX3VucGFjaygmdGhpcy0+b3BlcmF0aW9uX29mX3NlcnZpY2VfZGJhLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b3BlcmF0aW9uX29mX3NlcnZpY2VfZGJhKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NFUlZJQ0VfU0xBX09QRVJBVElPTl9ERUFDVElWQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19TRVJWSUNFX1NMQV9PUEVSQVRJT05fQUNUSVZBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2RiYV9zY2hlZHVsaW5nX3NjaGVtZV91bnBhY2soJnRoaXMtPnUuYWN0aXZhdGUuc2NoZW1lLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuYWN0aXZhdGUucHJpb3JpdHkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT51LmFjdGl2YXRlLmN5Y2xlX2xlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5hY3RpdmF0ZS5zZXJ2aWNlc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmFjdGl2YXRlLnNlcnZpY2VzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuYWN0aXZhdGUuc2VydmljZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJzZXJ2aWNlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX2Jhc2VfYWN0aXZhdGVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5hY3RpdmF0ZS5zZXJ2aWNlcyA9IChiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV90YWJsZSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5hY3RpdmF0ZS5zZXJ2aWNlc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV90YWJsZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5hY3RpdmF0ZS5zZXJ2aWNlc19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfdGFibGVfdW5wYWNrKCZ0aGlzLT51LmFjdGl2YXRlLnNlcnZpY2VzW2kwXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLT51LmRlZi5zZXJ2aWNlc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX2Jhc2VfZGVmX2NvdW50X3NlcnZpY2VzKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmRlZi5zZXJ2aWNlc19jb3VudCA+IDApICYmICh0aGlzLT51LmRlZi5zZXJ2aWNlcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInNlcnZpY2VzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfYmFzZV9kZWZcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5kZWYuc2VydmljZXMgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5kZWYuc2VydmljZXNfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LmRlZi5zZXJ2aWNlcywgdGhpcy0+dS5kZWYuc2VydmljZXNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfc2VydmljZV9zbGFfb3BlcmF0aW9uIG9wZXJhdGlvbl9vZl9zZXJ2aWNlX2RiYTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfc2VydmljZV9zbGFfb3BlcmF0aW9uX3VucGFjaygmb3BlcmF0aW9uX29mX3NlcnZpY2VfZGJhLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAob3BlcmF0aW9uX29mX3NlcnZpY2VfZGJhKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NFUlZJQ0VfU0xBX09QRVJBVElPTl9ERUFDVElWQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19TRVJWSUNFX1NMQV9PUEVSQVRJT05fQUNUSVZBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBzZXJ2aWNlc19jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZzZXJ2aWNlc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV90YWJsZSkgKiBzZXJ2aWNlc19jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBzZXJ2aWNlc19jb3VudCAqIDEwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzZXJ2aWNlc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgc2VydmljZXNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzZXJ2aWNlc19lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfYmFzZV9kZWZfY291bnRfc2VydmljZXMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9pbnRlcmZhY2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9pbnRlcmZhY2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2ludGVyZmFjZV90eXBlX3BhY2sodGhpcy0+dHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bnVtX3BvcnRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfaW50ZXJmYWNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9pbnRlcmZhY2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2ludGVyZmFjZV90eXBlX3VucGFjaygmdGhpcy0+dHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bnVtX3BvcnRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfaW50ZXJmYWNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X2dsb2JhbF9wYXJhbXNfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X2dsb2JhbF9wYXJhbXNfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfZ2xvYmFsX3BhcmFtc193aWR0aF9wYWNrKHRoaXMtPndpZHRoLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+d2lkdGgpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVhVX0dMT0JBTF9QQVJBTVNfV0lEVEhfSVBWNDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfaXB2NF9hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5pcHY0Lm9udV9pcGFkZHJlc3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9pcHY0X2FkZHJlc3MoYnVmLCB0aGlzLT51LmlwdjQub251X25ldHdvcmtfbWFzaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2lwdjRfYWRkcmVzcyhidWYsIHRoaXMtPnUuaXB2NC5vbnVfZGVmYXVsdF9ndykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuaXB2NC5kYXRhX2N2bGFuKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5pcHY0LmRhdGFfc3ZsYW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuaXB2NC5kYXRhX3ByaW9yaXR5KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01YVV9HTE9CQUxfUEFSQU1TX1dJRFRIX0lQVjY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2lwdjZfYWRkcmVzcyhidWYsIHRoaXMtPnUuaXB2Ni5vbnVfaXBhZGRyZXNzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5pcHY2LmlwdjZwcmVmaXhfbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfaXB2Nl9hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5pcHY2Lm9udV9kZWZhdWx0X2d3KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5pcHY2LmRhdGFfY3ZsYW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmlwdjYuZGF0YV9zdmxhbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5pcHY2LmRhdGFfcHJpb3JpdHkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9nbG9iYWxfcGFyYW1zX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfZ2xvYmFsX3BhcmFtc19iYXNlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICBzd2l0Y2ggKHRoaXMtPndpZHRoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01YVV9HTE9CQUxfUEFSQU1TX1dJRFRIX0lQVjQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01YVV9HTE9CQUxfUEFSQU1TX1dJRFRIX0lQVjY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfZ2xvYmFsX3BhcmFtc19iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX214dV9nbG9iYWxfcGFyYW1zX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X2dsb2JhbF9wYXJhbXNfd2lkdGhfdW5wYWNrKCZ0aGlzLT53aWR0aCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPndpZHRoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01YVV9HTE9CQUxfUEFSQU1TX1dJRFRIX0lQVjQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfaXB2NF9hZGRyZXNzKGJ1ZiwgJnRoaXMtPnUuaXB2NC5vbnVfaXBhZGRyZXNzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9pcHY0X2FkZHJlc3MoYnVmLCAmdGhpcy0+dS5pcHY0Lm9udV9uZXR3b3JrX21hc2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2lwdjRfYWRkcmVzcyhidWYsICZ0aGlzLT51LmlwdjQub251X2RlZmF1bHRfZ3cpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmlwdjQuZGF0YV9jdmxhbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuaXB2NC5kYXRhX3N2bGFuKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmlwdjQuZGF0YV9wcmlvcml0eSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NWFVfR0xPQkFMX1BBUkFNU19XSURUSF9JUFY2OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2lwdjZfYWRkcmVzcyhidWYsICZ0aGlzLT51LmlwdjYub251X2lwYWRkcmVzcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnUuaXB2Ni5pcHY2cHJlZml4X2xlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfaXB2Nl9hZGRyZXNzKGJ1ZiwgJnRoaXMtPnUuaXB2Ni5vbnVfZGVmYXVsdF9ndykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuaXB2Ni5kYXRhX2N2bGFuKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5pcHY2LmRhdGFfc3ZsYW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuaXB2Ni5kYXRhX3ByaW9yaXR5KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9nbG9iYWxfcGFyYW1zX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfZ2xvYmFsX3BhcmFtc193aWR0aCB3aWR0aDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X2dsb2JhbF9wYXJhbXNfd2lkdGhfdW5wYWNrKCZ3aWR0aCwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHdpZHRoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01YVV9HTE9CQUxfUEFSQU1TX1dJRFRIX0lQVjQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NWFVfR0xPQkFMX1BBUkFNU19XSURUSF9JUFY2OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfc25tcF9wYXJhbXNfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X3NubXBfcGFyYW1zX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X3NubXBfcGFyYW1zX3dpZHRoX3BhY2sodGhpcy0+d2lkdGgsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT53aWR0aCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NWFVfU05NUF9QQVJBTVNfV0lEVEhfSVBWNDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmlwdjQuc25tcF92ZXJzaW9uKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfaXB2NF9hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5pcHY0LnRyYXBfaG9zdF9pcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuaXB2NC50cmFwX3BvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmlwdjQuc25tcF9wb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmlwdjQuc2VjdXJpdHlfbmFtZSwgMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuaXB2NC5jb21tdW5pdHlfZm9yX3JlYWQsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmlwdjQuY29tbXVuaXR5X2Zvcl93cml0ZSwgMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVhVX1NOTVBfUEFSQU1TX1dJRFRIX0lQVjY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5pcHY2LnNubXBfdmVyc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2lwdjZfYWRkcmVzcyhidWYsIHRoaXMtPnUuaXB2Ni50cmFwX2hvc3RfaXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmlwdjYudHJhcF9wb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5pcHY2LnNubXBfcG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5pcHY2LnNlY3VyaXR5X25hbWUsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmlwdjYuY29tbXVuaXR5X2Zvcl9yZWFkLCAzMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5pcHY2LmNvbW11bml0eV9mb3Jfd3JpdGUsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfc25tcF9wYXJhbXNfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX214dV9zbm1wX3BhcmFtc19iYXNlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICBzd2l0Y2ggKHRoaXMtPndpZHRoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01YVV9TTk1QX1BBUkFNU19XSURUSF9JUFY0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEwNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVhVX1NOTVBfUEFSQU1TX1dJRFRIX0lQVjY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTE3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X3NubXBfcGFyYW1zX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X3NubXBfcGFyYW1zX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X3NubXBfcGFyYW1zX3dpZHRoX3VucGFjaygmdGhpcy0+d2lkdGgsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT53aWR0aCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NWFVfU05NUF9QQVJBTVNfV0lEVEhfSVBWNDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmlwdjQuc25tcF92ZXJzaW9uKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9pcHY0X2FkZHJlc3MoYnVmLCAmdGhpcy0+dS5pcHY0LnRyYXBfaG9zdF9pcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuaXB2NC50cmFwX3BvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmlwdjQuc25tcF9wb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuaXB2NC5zZWN1cml0eV9uYW1lLCAzMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LmlwdjQuY29tbXVuaXR5X2Zvcl9yZWFkLCAzMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LmlwdjQuY29tbXVuaXR5X2Zvcl93cml0ZSwgMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVhVX1NOTVBfUEFSQU1TX1dJRFRIX0lQVjY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5pcHY2LnNubXBfdmVyc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfaXB2Nl9hZGRyZXNzKGJ1ZiwgJnRoaXMtPnUuaXB2Ni50cmFwX2hvc3RfaXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmlwdjYudHJhcF9wb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5pcHY2LnNubXBfcG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LmlwdjYuc2VjdXJpdHlfbmFtZSwgMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5pcHY2LmNvbW11bml0eV9mb3JfcmVhZCwgMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5pcHY2LmNvbW11bml0eV9mb3Jfd3JpdGUsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9zbm1wX3BhcmFtc19iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X3NubXBfcGFyYW1zX3dpZHRoIHdpZHRoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfc25tcF9wYXJhbXNfd2lkdGhfdW5wYWNrKCZ3aWR0aCwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHdpZHRoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01YVV9TTk1QX1BBUkFNU19XSURUSF9JUFY0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAzMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAzMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAzMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NWFVfU05NUF9QQVJBTVNfV0lEVEhfSVBWNjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudF9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmV0aGVyX3R5cGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV92bGFuX3RhZyhidWYsIHRoaXMtPnZsYW5fdGFnKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmV0aGVyX3R5cGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3ZsYW5fdGFnKGJ1ZiwgJnRoaXMtPnZsYW5fdGFnKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3RyYW5zbGF0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3RyYW5zbGF0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudF9wYWNrKCZ0aGlzLT5vbGRfdmxhbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50X3BhY2soJnRoaXMtPm5ld192bGFuLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fdHJhbnNsYXRpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl90cmFuc2xhdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnRfdW5wYWNrKCZ0aGlzLT5vbGRfdmxhbiwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnRfdW5wYWNrKCZ0aGlzLT5uZXdfdmxhbiwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fdHJhbnNsYXRpb25fc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA4KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2FnZ3JlZ2F0ZV90YWJsZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9hZ2dyZWdhdGVfdGFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dmxhbnNfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnRfcGFjaygmdGhpcy0+c3ZsYW4sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT52bGFuc19jb3VudCA+IDApICYmICh0aGlzLT52bGFucyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2bGFuc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9hZ2dyZWdhdGVfdGFibGVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dmxhbnNfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50X3BhY2soJnRoaXMtPnZsYW5zW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fYWdncmVnYXRlX3RhYmxlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9hZ2dyZWdhdGVfdGFibGUgKnRoaXMpCit7CisgICAgcmV0dXJuIDYgKyAoNCAqIHRoaXMtPnZsYW5zX2NvdW50KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2FnZ3JlZ2F0ZV90YWJsZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2FnZ3JlZ2F0ZV90YWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT52bGFuc19jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudF91bnBhY2soJnRoaXMtPnN2bGFuLCBidWYsIGV4dHJhX21lbSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT52bGFuc19jb3VudCA+IDApICYmICh0aGlzLT52bGFucyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZsYW5zXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2FnZ3JlZ2F0ZV90YWJsZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT52bGFucyA9IChiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dmxhbnNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnZsYW5zX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudF91bnBhY2soJnRoaXMtPnZsYW5zW2kwXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2FnZ3JlZ2F0ZV90YWJsZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MTZfdCB2bGFuc19jb3VudDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYocGFja2VkLCAmdmxhbnNfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudCkgKiB2bGFuc19jb3VudCk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCB2bGFuc19jb3VudCAqIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3Byb3ZfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX21vZGVfcGFjayh0aGlzLT5tb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+bW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19WTEFOX01PREVfVFJBTlNQQVJFTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZMQU5fTU9ERV9UQUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudF9wYWNrKCZ0aGlzLT51LnRhZy52bGFuLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfVkxBTl9NT0RFX1RSQU5TTEFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnRfcGFjaygmdGhpcy0+dS50cmFuc2xhdGlvbi5kZWZhdWx0X3ZsYW4sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnRyYW5zbGF0aW9uLnRyYW5zbGF0aW9uc19jb3VudCA+IDApICYmICh0aGlzLT51LnRyYW5zbGF0aW9uLnRyYW5zbGF0aW9ucyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ0cmFuc2xhdGlvbnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlX3RyYW5zbGF0aW9uXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUudHJhbnNsYXRpb24udHJhbnNsYXRpb25zX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fdHJhbnNsYXRpb25fcGFjaygmdGhpcy0+dS50cmFuc2xhdGlvbi50cmFuc2xhdGlvbnNbaTBdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZMQU5fTU9ERV9UUlVOSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50X3BhY2soJnRoaXMtPnUudHJ1bmsuZGVmYXVsdF92bGFuLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS50cnVuay5wZXJtaXR0ZWRfdmxhbnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS50cnVuay5wZXJtaXR0ZWRfdmxhbnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicGVybWl0dGVkX3ZsYW5zXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3Byb3ZfYmFzZV90cnVua1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LnRydW5rLnBlcm1pdHRlZF92bGFuc19jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnRfcGFjaygmdGhpcy0+dS50cnVuay5wZXJtaXR0ZWRfdmxhbnNbaTFdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZMQU5fTU9ERV9BR0dSRUdBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgaTI7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudF9wYWNrKCZ0aGlzLT51LmFnZ3JlZ2F0ZS5kZWZhdWx0X3ZsYW4sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuYWdncmVnYXRlLnRhYmxlc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmFnZ3JlZ2F0ZS50YWJsZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5hZ2dyZWdhdGUudGFibGVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInRhYmxlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2VfYWdncmVnYXRlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUuYWdncmVnYXRlLnRhYmxlc19jb3VudDsgaTIrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2FnZ3JlZ2F0ZV90YWJsZV9wYWNrKCZ0aGlzLT51LmFnZ3JlZ2F0ZS50YWJsZXNbaTJdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZMQU5fTU9ERV9UUlVOS19NRFU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTM7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnRydW5rX21kdS5wZXJtaXR0ZWRfdmxhbnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS50cnVua19tZHUucGVybWl0dGVkX3ZsYW5zID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInBlcm1pdHRlZF92bGFuc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2VfdHJ1bmtfbWR1XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IHRoaXMtPnUudHJ1bmtfbWR1LnBlcm1pdHRlZF92bGFuc19jb3VudDsgaTMrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnRfcGFjaygmdGhpcy0+dS50cnVua19tZHUucGVybWl0dGVkX3ZsYW5zW2kzXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19WTEFOX01PREVfSFlCUklEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGk0OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnRfcGFjaygmdGhpcy0+dS5oeWJyaWQuZGVmYXVsdF92bGFuLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5oeWJyaWQucGVybWl0dGVkX3ZsYW5zX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuaHlicmlkLnBlcm1pdHRlZF92bGFucyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwZXJtaXR0ZWRfdmxhbnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlX2h5YnJpZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk0ID0gMDsgaTQgPCB0aGlzLT51Lmh5YnJpZC5wZXJtaXR0ZWRfdmxhbnNfY291bnQ7IGk0KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50X3BhY2soJnRoaXMtPnUuaHlicmlkLnBlcm1pdHRlZF92bGFuc1tpNF0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfVkxBTl9NT0RFX1NQRUNJQUxfVFJBTlNQQVJFTlQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3Byb3ZfYmFzZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgc3dpdGNoICh0aGlzLT5tb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZMQU5fTU9ERV9UUkFOU1BBUkVOVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfVkxBTl9NT0RFX1RBRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19WTEFOX01PREVfVFJBTlNMQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNCArICg4ICogdGhpcy0+dS50cmFuc2xhdGlvbi50cmFuc2xhdGlvbnNfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19WTEFOX01PREVfVFJVTks6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNCArICg0ICogdGhpcy0+dS50cnVuay5wZXJtaXR0ZWRfdmxhbnNfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19WTEFOX01PREVfQUdHUkVHQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgIGNvdW50ICs9IDY7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmFnZ3JlZ2F0ZS50YWJsZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5hZ2dyZWdhdGUudGFibGVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInRhYmxlc19jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmFnZ3JlZ2F0ZS50YWJsZXNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fYWdncmVnYXRlX3RhYmxlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmFnZ3JlZ2F0ZS50YWJsZXNbaTBdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZMQU5fTU9ERV9UUlVOS19NRFU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gKDQgKiB0aGlzLT51LnRydW5rX21kdS5wZXJtaXR0ZWRfdmxhbnNfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19WTEFOX01PREVfSFlCUklEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDQgKyAoNCAqIHRoaXMtPnUuaHlicmlkLnBlcm1pdHRlZF92bGFuc19jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZMQU5fTU9ERV9TUEVDSUFMX1RSQU5TUEFSRU5UOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fbW9kZV91bnBhY2soJnRoaXMtPm1vZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5tb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZMQU5fTU9ERV9UUkFOU1BBUkVOVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfVkxBTl9NT0RFX1RBRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50X3VucGFjaygmdGhpcy0+dS50YWcudmxhbiwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfVkxBTl9NT0RFX1RSQU5TTEFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnRfdW5wYWNrKCZ0aGlzLT51LnRyYW5zbGF0aW9uLmRlZmF1bHRfdmxhbiwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRoaXMtPnUudHJhbnNsYXRpb24udHJhbnNsYXRpb25zX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3Byb3ZfYmFzZV90cmFuc2xhdGlvbl9jb3VudF90cmFuc2xhdGlvbnMoYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUudHJhbnNsYXRpb24udHJhbnNsYXRpb25zX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUudHJhbnNsYXRpb24udHJhbnNsYXRpb25zID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidHJhbnNsYXRpb25zXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3Byb3ZfYmFzZV90cmFuc2xhdGlvblwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnRyYW5zbGF0aW9uLnRyYW5zbGF0aW9ucyA9IChiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fdHJhbnNsYXRpb24gKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUudHJhbnNsYXRpb24udHJhbnNsYXRpb25zX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl90cmFuc2xhdGlvbikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS50cmFuc2xhdGlvbi50cmFuc2xhdGlvbnNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl90cmFuc2xhdGlvbl91bnBhY2soJnRoaXMtPnUudHJhbnNsYXRpb24udHJhbnNsYXRpb25zW2kwXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZMQU5fTU9ERV9UUlVOSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50X3VucGFjaygmdGhpcy0+dS50cnVuay5kZWZhdWx0X3ZsYW4sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0aGlzLT51LnRydW5rLnBlcm1pdHRlZF92bGFuc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2VfdHJ1bmtfY291bnRfcGVybWl0dGVkX3ZsYW5zKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnRydW5rLnBlcm1pdHRlZF92bGFuc19jb3VudCA+IDApICYmICh0aGlzLT51LnRydW5rLnBlcm1pdHRlZF92bGFucyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInBlcm1pdHRlZF92bGFuc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2VfdHJ1bmtcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS50cnVuay5wZXJtaXR0ZWRfdmxhbnMgPSAoYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnQgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUudHJ1bmsucGVybWl0dGVkX3ZsYW5zX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LnRydW5rLnBlcm1pdHRlZF92bGFuc19jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnRfdW5wYWNrKCZ0aGlzLT51LnRydW5rLnBlcm1pdHRlZF92bGFuc1tpMV0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19WTEFOX01PREVfQUdHUkVHQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IGkyOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnRfdW5wYWNrKCZ0aGlzLT51LmFnZ3JlZ2F0ZS5kZWZhdWx0X3ZsYW4sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5hZ2dyZWdhdGUudGFibGVzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuYWdncmVnYXRlLnRhYmxlc19jb3VudCA+IDApICYmICh0aGlzLT51LmFnZ3JlZ2F0ZS50YWJsZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ0YWJsZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlX2FnZ3JlZ2F0ZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmFnZ3JlZ2F0ZS50YWJsZXMgPSAoYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2FnZ3JlZ2F0ZV90YWJsZSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5hZ2dyZWdhdGUudGFibGVzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9hZ2dyZWdhdGVfdGFibGUpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUuYWdncmVnYXRlLnRhYmxlc19jb3VudDsgaTIrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2FnZ3JlZ2F0ZV90YWJsZV91bnBhY2soJnRoaXMtPnUuYWdncmVnYXRlLnRhYmxlc1tpMl0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19WTEFOX01PREVfVFJVTktfTURVOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkzOworICAgICAgICAgICAgICAgIHRoaXMtPnUudHJ1bmtfbWR1LnBlcm1pdHRlZF92bGFuc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2VfdHJ1bmtfbWR1X2NvdW50X3Blcm1pdHRlZF92bGFucyhidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS50cnVua19tZHUucGVybWl0dGVkX3ZsYW5zX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUudHJ1bmtfbWR1LnBlcm1pdHRlZF92bGFucyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInBlcm1pdHRlZF92bGFuc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2VfdHJ1bmtfbWR1XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUudHJ1bmtfbWR1LnBlcm1pdHRlZF92bGFucyA9IChiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS50cnVua19tZHUucGVybWl0dGVkX3ZsYW5zX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkzID0gMDsgaTMgPCB0aGlzLT51LnRydW5rX21kdS5wZXJtaXR0ZWRfdmxhbnNfY291bnQ7IGkzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50X3VucGFjaygmdGhpcy0+dS50cnVua19tZHUucGVybWl0dGVkX3ZsYW5zW2kzXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZMQU5fTU9ERV9IWUJSSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudF91bnBhY2soJnRoaXMtPnUuaHlicmlkLmRlZmF1bHRfdmxhbiwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRoaXMtPnUuaHlicmlkLnBlcm1pdHRlZF92bGFuc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2VfaHlicmlkX2NvdW50X3Blcm1pdHRlZF92bGFucyhidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5oeWJyaWQucGVybWl0dGVkX3ZsYW5zX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuaHlicmlkLnBlcm1pdHRlZF92bGFucyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInBlcm1pdHRlZF92bGFuc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2VfaHlicmlkXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuaHlicmlkLnBlcm1pdHRlZF92bGFucyA9IChiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5oeWJyaWQucGVybWl0dGVkX3ZsYW5zX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk0ID0gMDsgaTQgPCB0aGlzLT51Lmh5YnJpZC5wZXJtaXR0ZWRfdmxhbnNfY291bnQ7IGk0KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50X3VucGFjaygmdGhpcy0+dS5oeWJyaWQucGVybWl0dGVkX3ZsYW5zW2k0XSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZMQU5fTU9ERV9TUEVDSUFMX1RSQU5TUEFSRU5UOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX21vZGUgbW9kZTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9tb2RlX3VucGFjaygmbW9kZSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1vZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfVkxBTl9NT0RFX1RSQU5TUEFSRU5UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19WTEFOX01PREVfVEFHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19WTEFOX01PREVfVFJBTlNMQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdHJhbnNsYXRpb25zX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9uc19lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHRyYW5zbGF0aW9uc19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl90cmFuc2xhdGlvbikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19WTEFOX01PREVfVFJVTks6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcGVybWl0dGVkX3ZsYW5zX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHBlcm1pdHRlZF92bGFuc19lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHBlcm1pdHRlZF92bGFuc19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZMQU5fTU9ERV9BR0dSRUdBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgdGFibGVzX2NvdW50OworICAgICAgICAgICAgICAgIHVpbnQxNl90IGkwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJnRhYmxlc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fYWdncmVnYXRlX3RhYmxlKSAqIHRhYmxlc19jb3VudCk7CisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGFibGVzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fYWdncmVnYXRlX3RhYmxlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZMQU5fTU9ERV9UUlVOS19NRFU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcGVybWl0dGVkX3ZsYW5zX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwZXJtaXR0ZWRfdmxhbnNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChwZXJtaXR0ZWRfdmxhbnNfZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19WTEFOX01PREVfSFlCUklEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHBlcm1pdHRlZF92bGFuc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwZXJtaXR0ZWRfdmxhbnNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChwZXJtaXR0ZWRfdmxhbnNfZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19WTEFOX01PREVfU1BFQ0lBTF9UUkFOU1BBUkVOVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3Byb3ZfYmFzZV90cmFuc2xhdGlvbl9jb3VudF90cmFuc2xhdGlvbnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3Byb3ZfYmFzZV90cnVua19jb3VudF9wZXJtaXR0ZWRfdmxhbnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3Byb3ZfYmFzZV90cnVua19tZHVfY291bnRfcGVybWl0dGVkX3ZsYW5zKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyA0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2VfaHlicmlkX2NvdW50X3Blcm1pdHRlZF92bGFucyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gNCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfY2xhdXNlX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX2NsYXVzZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX2ZpZWxkX3BhY2sodGhpcy0+ZmllbGQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5maWVsZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9EQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT51LmRhLnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yX3BhY2sodGhpcy0+dS5kYS5vcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX1NBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPnUuc2EudmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3JfcGFjayh0aGlzLT51LnNhLm9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfVkxBTl9QUkk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS52bGFuX3ByaS5yZXNlcnZlZCwgNSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS52bGFuX3ByaS52YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcl9wYWNrKHRoaXMtPnUudmxhbl9wcmkub3AsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9WTEFOX0lEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUudmxhbl9pZC5yZXNlcnZlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUudmxhbl9pZC52YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcl9wYWNrKHRoaXMtPnUudmxhbl9pZC5vcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0VUSF9UWVBFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZXRoX3R5cGUucmVzZXJ2ZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmV0aF90eXBlLnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yX3BhY2sodGhpcy0+dS5ldGhfdHlwZS5vcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0RFU1RfSVA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5kZXN0X2lwLnJlc2VydmVkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfaXB2NF9hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5kZXN0X2lwLnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yX3BhY2sodGhpcy0+dS5kZXN0X2lwLm9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfU09VUkNFX0lQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuc291cmNlX2lwLnJlc2VydmVkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfaXB2NF9hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5zb3VyY2VfaXAudmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3JfcGFjayh0aGlzLT51LnNvdXJjZV9pcC5vcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0lQX1RZUEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5pcF90eXBlLnJlc2VydmVkLCA1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmlwX3R5cGUudmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3JfcGFjayh0aGlzLT51LmlwX3R5cGUub3AsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9JUF9UT1M6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5pcF90b3MucmVzZXJ2ZWQsIDUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuaXBfdG9zLnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yX3BhY2sodGhpcy0+dS5pcF90b3Mub3AsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9JUF9QUkVDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuaXBfcHJlYy5yZXNlcnZlZCwgNSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5pcF9wcmVjLnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yX3BhY2sodGhpcy0+dS5pcF9wcmVjLm9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfU09VUkNFX1BPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5zb3VyY2VfcG9ydC5yZXNlcnZlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuc291cmNlX3BvcnQudmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3JfcGFjayh0aGlzLT51LnNvdXJjZV9wb3J0Lm9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfREVTVF9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZGVzdF9wb3J0LnJlc2VydmVkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5kZXN0X3BvcnQudmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3JfcGFjayh0aGlzLT51LmRlc3RfcG9ydC5vcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0lQX1ZFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmlwX3Zlci5yZXNlcnZlZCwgMTUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuaXBfdmVyLnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yX3BhY2sodGhpcy0+dS5pcF92ZXIub3AsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9JUF9GTE9XX0xBQkVMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuaXBfZmxvd19sYWJlbC5yZXNlcnZlZCwgMTIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmlwX2Zsb3dfbGFiZWwudmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3JfcGFjayh0aGlzLT51LmlwX2Zsb3dfbGFiZWwub3AsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9EU1RfSVBWNjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfaXB2Nl9hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5kc3RfaXB2Ni52YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcl9wYWNrKHRoaXMtPnUuZHN0X2lwdjYub3AsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9TUkNfSVBWNjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfaXB2Nl9hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5zcmNfaXB2Ni52YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcl9wYWNrKHRoaXMtPnUuc3JjX2lwdjYub3AsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9EU1RfSVBWNlBSRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfaXB2Nl9hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5kc3RfaXB2NnByZS52YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcl9wYWNrKHRoaXMtPnUuZHN0X2lwdjZwcmUub3AsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9TUkNfSVBWNlBSRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfaXB2Nl9hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5zcmNfaXB2NnByZS52YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcl9wYWNrKHRoaXMtPnUuc3JjX2lwdjZwcmUub3AsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9OWFRfSERSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUubnh0X2hkci5yZXNlcnZlZCwgMTUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUubnh0X2hkci52YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcl9wYWNrKHRoaXMtPnUubnh0X2hkci5vcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmRlZi52YWwsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3JfcGFjayh0aGlzLT51LmRlZi5vcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfY2xhdXNlX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9jbGF1c2VfYmFzZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgc3dpdGNoICh0aGlzLT5maWVsZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9EQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9TQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9WTEFOX1BSSToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9WTEFOX0lEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0VUSF9UWVBFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0RFU1RfSVA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfU09VUkNFX0lQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0lQX1RZUEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfSVBfVE9TOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0lQX1BSRUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfU09VUkNFX1BPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfREVTVF9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0lQX1ZFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfSVBfRkxPV19MQUJFTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfRFNUX0lQVjY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX1NSQ19JUFY2OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9EU1RfSVBWNlBSRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfU1JDX0lQVjZQUkU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX05YVF9IRFI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9jbGF1c2VfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9jbGF1c2VfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9maWVsZF91bnBhY2soJnRoaXMtPmZpZWxkLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+ZmllbGQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfREE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+dS5kYS52YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcl91bnBhY2soJnRoaXMtPnUuZGEub3AsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9TQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9tYWNfYWRkcmVzcyhidWYsICZ0aGlzLT51LnNhLnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yX3VucGFjaygmdGhpcy0+dS5zYS5vcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX1ZMQU5fUFJJOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS52bGFuX3ByaS5yZXNlcnZlZCwgNSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS52bGFuX3ByaS52YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcl91bnBhY2soJnRoaXMtPnUudmxhbl9wcmkub3AsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9WTEFOX0lEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS52bGFuX2lkLnJlc2VydmVkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS52bGFuX2lkLnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yX3VucGFjaygmdGhpcy0+dS52bGFuX2lkLm9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfRVRIX1RZUEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LmV0aF90eXBlLnJlc2VydmVkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5ldGhfdHlwZS52YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcl91bnBhY2soJnRoaXMtPnUuZXRoX3R5cGUub3AsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9ERVNUX0lQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5kZXN0X2lwLnJlc2VydmVkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9pcHY0X2FkZHJlc3MoYnVmLCAmdGhpcy0+dS5kZXN0X2lwLnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yX3VucGFjaygmdGhpcy0+dS5kZXN0X2lwLm9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfU09VUkNFX0lQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5zb3VyY2VfaXAucmVzZXJ2ZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2lwdjRfYWRkcmVzcyhidWYsICZ0aGlzLT51LnNvdXJjZV9pcC52YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcl91bnBhY2soJnRoaXMtPnUuc291cmNlX2lwLm9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfSVBfVFlQRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuaXBfdHlwZS5yZXNlcnZlZCwgNSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5pcF90eXBlLnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yX3VucGFjaygmdGhpcy0+dS5pcF90eXBlLm9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfSVBfVE9TOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5pcF90b3MucmVzZXJ2ZWQsIDUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuaXBfdG9zLnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yX3VucGFjaygmdGhpcy0+dS5pcF90b3Mub3AsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9JUF9QUkVDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5pcF9wcmVjLnJlc2VydmVkLCA1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmlwX3ByZWMudmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3JfdW5wYWNrKCZ0aGlzLT51LmlwX3ByZWMub3AsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9TT1VSQ0VfUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuc291cmNlX3BvcnQucmVzZXJ2ZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LnNvdXJjZV9wb3J0LnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yX3VucGFjaygmdGhpcy0+dS5zb3VyY2VfcG9ydC5vcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0RFU1RfUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuZGVzdF9wb3J0LnJlc2VydmVkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5kZXN0X3BvcnQudmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3JfdW5wYWNrKCZ0aGlzLT51LmRlc3RfcG9ydC5vcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0lQX1ZFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuaXBfdmVyLnJlc2VydmVkLCAxNSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5pcF92ZXIudmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3JfdW5wYWNrKCZ0aGlzLT51LmlwX3Zlci5vcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0lQX0ZMT1dfTEFCRUw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LmlwX2Zsb3dfbGFiZWwucmVzZXJ2ZWQsIDEyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dS5pcF9mbG93X2xhYmVsLnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yX3VucGFjaygmdGhpcy0+dS5pcF9mbG93X2xhYmVsLm9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfRFNUX0lQVjY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfaXB2Nl9hZGRyZXNzKGJ1ZiwgJnRoaXMtPnUuZHN0X2lwdjYudmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3JfdW5wYWNrKCZ0aGlzLT51LmRzdF9pcHY2Lm9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfU1JDX0lQVjY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfaXB2Nl9hZGRyZXNzKGJ1ZiwgJnRoaXMtPnUuc3JjX2lwdjYudmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3JfdW5wYWNrKCZ0aGlzLT51LnNyY19pcHY2Lm9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfRFNUX0lQVjZQUkU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfaXB2Nl9hZGRyZXNzKGJ1ZiwgJnRoaXMtPnUuZHN0X2lwdjZwcmUudmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3JfdW5wYWNrKCZ0aGlzLT51LmRzdF9pcHY2cHJlLm9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfU1JDX0lQVjZQUkU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfaXB2Nl9hZGRyZXNzKGJ1ZiwgJnRoaXMtPnUuc3JjX2lwdjZwcmUudmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3JfdW5wYWNrKCZ0aGlzLT51LnNyY19pcHY2cHJlLm9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfTlhUX0hEUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUubnh0X2hkci5yZXNlcnZlZCwgMTUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUubnh0X2hkci52YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcl91bnBhY2soJnRoaXMtPnUubnh0X2hkci5vcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuZGVmLnZhbCwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcl91bnBhY2soJnRoaXMtPnUuZGVmLm9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX2NsYXVzZV9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfZmllbGQgZmllbGQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX2ZpZWxkX3VucGFjaygmZmllbGQsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChmaWVsZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9EQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9TQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9WTEFOX1BSSToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX1ZMQU5fSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9FVEhfVFlQRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0RFU1RfSVA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9TT1VSQ0VfSVA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9JUF9UWVBFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfSVBfVE9TOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfSVBfUFJFQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX1NPVVJDRV9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfREVTVF9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfSVBfVkVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0lQX0ZMT1dfTEFCRUw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfRFNUX0lQVjY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX1NSQ19JUFY2OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9EU1RfSVBWNlBSRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfU1JDX0lQVjZQUkU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX05YVF9IRFI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxNSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfcnVsZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfcnVsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnByZWNlZGVuY2UpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnF1ZXVlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5wcmlfbWFya2luZykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+Y2xhdXNlc19jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5jbGF1c2VzX2NvdW50ID4gMCkgJiYgKHRoaXMtPmNsYXVzZXMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY2xhdXNlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfcnVsZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5jbGF1c2VzX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX2NsYXVzZV9iYXNlX3BhY2soJnRoaXMtPmNsYXVzZXNbaTBdLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfcnVsZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGUgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSA1OworICAgIHVpbnQzMl90IGkwOworICAgIGlmICgodGhpcy0+Y2xhdXNlc19jb3VudCA+IDApICYmICh0aGlzLT5jbGF1c2VzID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImNsYXVzZXNfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5jbGF1c2VzX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9jbGF1c2VfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+Y2xhdXNlc1tpMF0pOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ydWxlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IGxlbmd0aCA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+cHJlY2VkZW5jZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCwgYnVmLT5jdXJyKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnF1ZXVlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnByaV9tYXJraW5nKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPmNsYXVzZXNfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+Y2xhdXNlc19jb3VudCA+IDApICYmICh0aGlzLT5jbGF1c2VzID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY2xhdXNlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfcnVsZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT5jbGF1c2VzID0gKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfY2xhdXNlX2Jhc2UgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPmNsYXVzZXNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9jbGF1c2VfYmFzZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+Y2xhdXNlc19jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9jbGF1c2VfYmFzZV91bnBhY2soJnRoaXMtPmNsYXVzZXNbaTBdLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgIHVpbnQ4X3QgY2xhdXNlc19jb3VudDsKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmY2xhdXNlc19jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX2NsYXVzZV9iYXNlKSAqIGNsYXVzZXNfY291bnQpOworICAgIGZvciAoaTAgPSAwOyBpMCA8IGNsYXVzZXNfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfY2xhdXNlX2Jhc2Vfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX3Byb3ZfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX3Byb3YgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fb3BlcmF0aW9uX3BhY2sodGhpcy0+b3BlcmF0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b3BlcmF0aW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9WTEFOX09QRVJBVElPTl9ERUxFVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmRlbGV0ZS5tdWx0aWNhc3RfdmxhbnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5kZWxldGUubXVsdGljYXN0X3ZsYW5zID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm11bHRpY2FzdF92bGFuc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fcHJvdl9kZWxldGVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5kZWxldGUubXVsdGljYXN0X3ZsYW5zX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3ZsYW5fdGFnKGJ1ZiwgdGhpcy0+dS5kZWxldGUubXVsdGljYXN0X3ZsYW5zW2kwXSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX1ZMQU5fT1BFUkFUSU9OX0FERDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuYWRkLm11bHRpY2FzdF92bGFuc19jb3VudCA+IDApICYmICh0aGlzLT51LmFkZC5tdWx0aWNhc3RfdmxhbnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibXVsdGljYXN0X3ZsYW5zXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9wcm92X2FkZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LmFkZC5tdWx0aWNhc3RfdmxhbnNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdmxhbl90YWcoYnVmLCB0aGlzLT51LmFkZC5tdWx0aWNhc3RfdmxhbnNbaTFdKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfVkxBTl9PUEVSQVRJT05fQ0xFQVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9WTEFOX09QRVJBVElPTl9MSVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkyOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5saXN0Lm11bHRpY2FzdF92bGFuc19jb3VudCA+IDApICYmICh0aGlzLT51Lmxpc3QubXVsdGljYXN0X3ZsYW5zID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm11bHRpY2FzdF92bGFuc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fcHJvdl9saXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUubGlzdC5tdWx0aWNhc3RfdmxhbnNfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdmxhbl90YWcoYnVmLCB0aGlzLT51Lmxpc3QubXVsdGljYXN0X3ZsYW5zW2kyXSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX3Byb3ZfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9wcm92ICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICBzd2l0Y2ggKHRoaXMtPm9wZXJhdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfVkxBTl9PUEVSQVRJT05fREVMRVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9ICgyICogdGhpcy0+dS5kZWxldGUubXVsdGljYXN0X3ZsYW5zX2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX1ZMQU5fT1BFUkFUSU9OX0FERDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAoMiAqIHRoaXMtPnUuYWRkLm11bHRpY2FzdF92bGFuc19jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9WTEFOX09QRVJBVElPTl9DTEVBUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX1ZMQU5fT1BFUkFUSU9OX0xJU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gKDIgKiB0aGlzLT51Lmxpc3QubXVsdGljYXN0X3ZsYW5zX2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX3Byb3ZfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fcHJvdiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9vcGVyYXRpb25fdW5wYWNrKCZ0aGlzLT5vcGVyYXRpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vcGVyYXRpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX1ZMQU5fT1BFUkFUSU9OX0RFTEVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMDsKKyAgICAgICAgICAgICAgICB0aGlzLT51LmRlbGV0ZS5tdWx0aWNhc3RfdmxhbnNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX3Byb3ZfZGVsZXRlX2NvdW50X211bHRpY2FzdF92bGFucyhidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5kZWxldGUubXVsdGljYXN0X3ZsYW5zX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZGVsZXRlLm11bHRpY2FzdF92bGFucyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm11bHRpY2FzdF92bGFuc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fcHJvdl9kZWxldGVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5kZWxldGUubXVsdGljYXN0X3ZsYW5zID0gKGJjbW9zX3ZsYW5fdGFnICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmRlbGV0ZS5tdWx0aWNhc3RfdmxhbnNfY291bnQgKiBzaXplb2YoYmNtb3Nfdmxhbl90YWcpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUuZGVsZXRlLm11bHRpY2FzdF92bGFuc19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3ZsYW5fdGFnKGJ1ZiwgJnRoaXMtPnUuZGVsZXRlLm11bHRpY2FzdF92bGFuc1tpMF0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9WTEFOX09QRVJBVElPTl9BREQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTE7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5hZGQubXVsdGljYXN0X3ZsYW5zX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9wcm92X2FkZF9jb3VudF9tdWx0aWNhc3RfdmxhbnMoYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuYWRkLm11bHRpY2FzdF92bGFuc19jb3VudCA+IDApICYmICh0aGlzLT51LmFkZC5tdWx0aWNhc3RfdmxhbnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJtdWx0aWNhc3RfdmxhbnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX3Byb3ZfYWRkXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuYWRkLm11bHRpY2FzdF92bGFucyA9IChiY21vc192bGFuX3RhZyAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5hZGQubXVsdGljYXN0X3ZsYW5zX2NvdW50ICogc2l6ZW9mKGJjbW9zX3ZsYW5fdGFnKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LmFkZC5tdWx0aWNhc3RfdmxhbnNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF92bGFuX3RhZyhidWYsICZ0aGlzLT51LmFkZC5tdWx0aWNhc3RfdmxhbnNbaTFdKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfVkxBTl9PUEVSQVRJT05fQ0xFQVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9WTEFOX09QRVJBVElPTl9MSVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkyOworICAgICAgICAgICAgICAgIHRoaXMtPnUubGlzdC5tdWx0aWNhc3RfdmxhbnNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX3Byb3ZfbGlzdF9jb3VudF9tdWx0aWNhc3RfdmxhbnMoYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUubGlzdC5tdWx0aWNhc3RfdmxhbnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5saXN0Lm11bHRpY2FzdF92bGFucyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm11bHRpY2FzdF92bGFuc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fcHJvdl9saXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUubGlzdC5tdWx0aWNhc3RfdmxhbnMgPSAoYmNtb3Nfdmxhbl90YWcgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUubGlzdC5tdWx0aWNhc3RfdmxhbnNfY291bnQgKiBzaXplb2YoYmNtb3Nfdmxhbl90YWcpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUubGlzdC5tdWx0aWNhc3RfdmxhbnNfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF92bGFuX3RhZyhidWYsICZ0aGlzLT51Lmxpc3QubXVsdGljYXN0X3ZsYW5zW2kyXSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fcHJvdl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX29wZXJhdGlvbiBvcGVyYXRpb247CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX29wZXJhdGlvbl91bnBhY2soJm9wZXJhdGlvbiwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG9wZXJhdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfVkxBTl9PUEVSQVRJT05fREVMRVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IG11bHRpY2FzdF92bGFuc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbXVsdGljYXN0X3ZsYW5zX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQobXVsdGljYXN0X3ZsYW5zX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb3Nfdmxhbl90YWcpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX1ZMQU5fT1BFUkFUSU9OX0FERDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBtdWx0aWNhc3RfdmxhbnNfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG11bHRpY2FzdF92bGFuc19lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKG11bHRpY2FzdF92bGFuc19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9zX3ZsYW5fdGFnKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9WTEFOX09QRVJBVElPTl9DTEVBUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX1ZMQU5fT1BFUkFUSU9OX0xJU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgbXVsdGljYXN0X3ZsYW5zX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBtdWx0aWNhc3RfdmxhbnNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChtdWx0aWNhc3RfdmxhbnNfZWxlbV9jb3VudCAqIHNpemVvZihiY21vc192bGFuX3RhZykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fcHJvdl9kZWxldGVfY291bnRfbXVsdGljYXN0X3ZsYW5zKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fcHJvdl9hZGRfY291bnRfbXVsdGljYXN0X3ZsYW5zKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fcHJvdl9saXN0X2NvdW50X211bHRpY2FzdF92bGFucyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfaXB0dl92bGFuX2VudHJ5X3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19pcHR2X3ZsYW5fZW50cnkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdmxhbl90YWcoYnVmLCB0aGlzLT5tdWx0aWNhc3RfdmxhbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3ZsYW5fdGFnKGJ1ZiwgdGhpcy0+aXB0dl91c2VyX3ZsYW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2lwdHZfdmxhbl9lbnRyeV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19pcHR2X3ZsYW5fZW50cnkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF92bGFuX3RhZyhidWYsICZ0aGlzLT5tdWx0aWNhc3RfdmxhbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdmxhbl90YWcoYnVmLCAmdGhpcy0+aXB0dl91c2VyX3ZsYW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2lwdHZfdmxhbl9lbnRyeV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF90YWdfb3BlcmF0aW9uX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF90YWdfb3BlcmF0aW9uX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19tb2RlX3BhY2sodGhpcy0+dGFnX21vZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT50YWdfbW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfVEFHX01PREVfRE9fTk9UX1NUUklQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfVEFHX01PREVfU1RSSVBfREFUQV9RVUVSWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX1RBR19NT0RFX1NUUklQX0RBVEFfUVVFUllfSVBUVjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuc3RyaXBfZGF0YV9xdWVyeV9pcHR2Lm11bHRpY2FzdF92bGFuc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnN0cmlwX2RhdGFfcXVlcnlfaXB0di5tdWx0aWNhc3RfdmxhbnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zdHJpcF9kYXRhX3F1ZXJ5X2lwdHYubXVsdGljYXN0X3ZsYW5zID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm11bHRpY2FzdF92bGFuc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19vcGVyYXRpb25fYmFzZV9zdHJpcF9kYXRhX3F1ZXJ5X2lwdHZcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5zdHJpcF9kYXRhX3F1ZXJ5X2lwdHYubXVsdGljYXN0X3ZsYW5zX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2lwdHZfdmxhbl9lbnRyeV9wYWNrKCZ0aGlzLT51LnN0cmlwX2RhdGFfcXVlcnlfaXB0di5tdWx0aWNhc3RfdmxhbnNbaTBdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfdGFnX29wZXJhdGlvbl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19vcGVyYXRpb25fYmFzZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgc3dpdGNoICh0aGlzLT50YWdfbW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfVEFHX01PREVfRE9fTk9UX1NUUklQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfVEFHX01PREVfU1RSSVBfREFUQV9RVUVSWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX1RBR19NT0RFX1NUUklQX0RBVEFfUVVFUllfSVBUVjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgKDQgKiB0aGlzLT51LnN0cmlwX2RhdGFfcXVlcnlfaXB0di5tdWx0aWNhc3RfdmxhbnNfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19vcGVyYXRpb25fYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfdGFnX29wZXJhdGlvbl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF90YWdfbW9kZV91bnBhY2soJnRoaXMtPnRhZ19tb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+dGFnX21vZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX1RBR19NT0RFX0RPX05PVF9TVFJJUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX1RBR19NT0RFX1NUUklQX0RBVEFfUVVFUlk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9UQUdfTU9ERV9TVFJJUF9EQVRBX1FVRVJZX0lQVFY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnN0cmlwX2RhdGFfcXVlcnlfaXB0di5tdWx0aWNhc3RfdmxhbnNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zdHJpcF9kYXRhX3F1ZXJ5X2lwdHYubXVsdGljYXN0X3ZsYW5zX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc3RyaXBfZGF0YV9xdWVyeV9pcHR2Lm11bHRpY2FzdF92bGFucyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm11bHRpY2FzdF92bGFuc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19vcGVyYXRpb25fYmFzZV9zdHJpcF9kYXRhX3F1ZXJ5X2lwdHZcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5zdHJpcF9kYXRhX3F1ZXJ5X2lwdHYubXVsdGljYXN0X3ZsYW5zID0gKGJjbW9sdF9lcG9uX29hbV9jdGNfaXB0dl92bGFuX2VudHJ5ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnN0cmlwX2RhdGFfcXVlcnlfaXB0di5tdWx0aWNhc3RfdmxhbnNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19pcHR2X3ZsYW5fZW50cnkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUuc3RyaXBfZGF0YV9xdWVyeV9pcHR2Lm11bHRpY2FzdF92bGFuc19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19pcHR2X3ZsYW5fZW50cnlfdW5wYWNrKCZ0aGlzLT51LnN0cmlwX2RhdGFfcXVlcnlfaXB0di5tdWx0aWNhc3RfdmxhbnNbaTBdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19vcGVyYXRpb25fYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF90YWdfbW9kZSB0YWdfbW9kZTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19tb2RlX3VucGFjaygmdGFnX21vZGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0YWdfbW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfVEFHX01PREVfRE9fTk9UX1NUUklQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfVEFHX01PREVfU1RSSVBfREFUQV9RVUVSWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX1RBR19NT0RFX1NUUklQX0RBVEFfUVVFUllfSVBUVjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IG11bHRpY2FzdF92bGFuc19jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZtdWx0aWNhc3RfdmxhbnNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19pcHR2X3ZsYW5fZW50cnkpICogbXVsdGljYXN0X3ZsYW5zX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIG11bHRpY2FzdF92bGFuc19jb3VudCAqIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19vbmx5X3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX29ubHkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dXNlcl9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnJlc2VydmVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT5ncm91cF9tYWNfYWRkcmVzcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19vbmx5X3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfb25seSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51c2VyX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+cmVzZXJ2ZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX21hY19hZGRyZXNzKGJ1ZiwgJnRoaXMtPmdyb3VwX21hY19hZGRyZXNzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX29ubHlfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19wbHVzX3ZsYW5faWRfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c192bGFuX2lkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnVzZXJfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5tdWx0aWNhc3RfdmxhbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+Z3JvdXBfbWFjX2FkZHJlc3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c192bGFuX2lkX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c192bGFuX2lkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnVzZXJfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5tdWx0aWNhc3RfdmxhbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+Z3JvdXBfbWFjX2FkZHJlc3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c192bGFuX2lkX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY0c2FfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY0c2EgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dXNlcl9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+Z3JvdXBfbWFjX2FkZHJlc3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9pcHY0X2FkZHJlc3MoYnVmLCB0aGlzLT5pcHNvdXJjZV9hZGRyZXNzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfaXB2NHNhX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY0c2EgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dXNlcl9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+Z3JvdXBfbWFjX2FkZHJlc3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2lwdjRfYWRkcmVzcyhidWYsICZ0aGlzLT5pcHNvdXJjZV9hZGRyZXNzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfaXB2NHNhX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9pcHBsdXNfbWNhc3Rfdmxhbl9pZF9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX2lwcGx1c19tY2FzdF92bGFuX2lkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnVzZXJfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5tdWx0aWNhc3RfdmxhbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnJlc2VydmVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfaXB2NF9hZGRyZXNzKGJ1ZiwgdGhpcy0+aXBtdWx0aWNhc3RfYWRkcmVzcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX2lwcGx1c19tY2FzdF92bGFuX2lkX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9pcHBsdXNfbWNhc3Rfdmxhbl9pZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51c2VyX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bXVsdGljYXN0X3ZsYW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5yZXNlcnZlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfaXB2NF9hZGRyZXNzKGJ1ZiwgJnRoaXMtPmlwbXVsdGljYXN0X2FkZHJlc3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9pcHBsdXNfbWNhc3Rfdmxhbl9pZF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfaXB2NnBsdXNfbWNhc3Rfdmxhbl9pZF9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX2lwdjZwbHVzX21jYXN0X3ZsYW5faWQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dXNlcl9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPm11bHRpY2FzdF92bGFuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfaXB2Nl9hZGRyZXNzKGJ1ZiwgdGhpcy0+aXB2Nm11bHRpY2FzdF9hZGRyZXNzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfaXB2NnBsdXNfbWNhc3Rfdmxhbl9pZF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfaXB2NnBsdXNfbWNhc3Rfdmxhbl9pZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51c2VyX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bXVsdGljYXN0X3ZsYW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2lwdjZfYWRkcmVzcyhidWYsICZ0aGlzLT5pcHY2bXVsdGljYXN0X2FkZHJlc3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9pcHY2cGx1c19tY2FzdF92bGFuX2lkX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMjApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY2c2FfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY2c2EgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dXNlcl9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+Z3JvdXBfbWFjX2FkZHJlc3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9pcHY2X2FkZHJlc3MoYnVmLCB0aGlzLT5pcHNvdXJjZV9hZGRyZXNzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfaXB2NnNhX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY2c2EgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dXNlcl9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+Z3JvdXBfbWFjX2FkZHJlc3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2lwdjZfYWRkcmVzcyhidWYsICZ0aGlzLT5pcHNvdXJjZV9hZGRyZXNzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfaXB2NnNhX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMjQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9hY3Rpb25fcGFjayh0aGlzLT5hY3Rpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX3R5cGVfcGFjayh0aGlzLT50eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfQ09OVFJPTF9UWVBFX0dEQV9NQUNfT05MWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmdkYV9tYWNfb25seS50b3RhbF9lbnRyaWVzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2RhX21hY19vbmx5LmVudHJpZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZGFfbWFjX29ubHkuZW50cmllcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJlbnRyaWVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9nZGFfbWFjX29ubHlcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5nZGFfbWFjX29ubHkuZW50cmllc19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX29ubHlfcGFjaygmdGhpcy0+dS5nZGFfbWFjX29ubHkuZW50cmllc1tpMF0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX0NPTlRST0xfVFlQRV9HREFfTUFDX1BMVVNfVkxBTl9JRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmdkYV9tYWNfcGx1c192bGFuX2lkLnRvdGFsX2VudHJpZXNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZGFfbWFjX3BsdXNfdmxhbl9pZC5lbnRyaWVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2RhX21hY19wbHVzX3ZsYW5faWQuZW50cmllcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJlbnRyaWVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9nZGFfbWFjX3BsdXNfdmxhbl9pZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LmdkYV9tYWNfcGx1c192bGFuX2lkLmVudHJpZXNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19wbHVzX3ZsYW5faWRfcGFjaygmdGhpcy0+dS5nZGFfbWFjX3BsdXNfdmxhbl9pZC5lbnRyaWVzW2kxXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfQ09OVFJPTF9UWVBFX0dEQV9NQUNfUExVU19JUFY0U0E6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTI7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5nZGFfbWFjX3BsdXNfaXB2NHNhLnRvdGFsX2VudHJpZXNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZGFfbWFjX3BsdXNfaXB2NHNhLmVudHJpZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZGFfbWFjX3BsdXNfaXB2NHNhLmVudHJpZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZW50cmllc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZ2RhX21hY19wbHVzX2lwdjRzYVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCB0aGlzLT51LmdkYV9tYWNfcGx1c19pcHY0c2EuZW50cmllc19jb3VudDsgaTIrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfaXB2NHNhX3BhY2soJnRoaXMtPnUuZ2RhX21hY19wbHVzX2lwdjRzYS5lbnRyaWVzW2kyXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfQ09OVFJPTF9UWVBFX0dEQV9JUFBMVVNfTUNBU1RfVkxBTl9JRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMzsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmdkYV9pcHBsdXNfbWNhc3Rfdmxhbl9pZC50b3RhbF9lbnRyaWVzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2RhX2lwcGx1c19tY2FzdF92bGFuX2lkLmVudHJpZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZGFfaXBwbHVzX21jYXN0X3ZsYW5faWQuZW50cmllcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJlbnRyaWVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9nZGFfaXBwbHVzX21jYXN0X3ZsYW5faWRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMyA9IDA7IGkzIDwgdGhpcy0+dS5nZGFfaXBwbHVzX21jYXN0X3ZsYW5faWQuZW50cmllc19jb3VudDsgaTMrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfaXBwbHVzX21jYXN0X3ZsYW5faWRfcGFjaygmdGhpcy0+dS5nZGFfaXBwbHVzX21jYXN0X3ZsYW5faWQuZW50cmllc1tpM10sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX0NPTlRST0xfVFlQRV9HREFfSVBWNlBMVVNfTUNBU1RfVkxBTl9JRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpNDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmdkYV9pcHY2cGx1c19tY2FzdF92bGFuX2lkLnRvdGFsX2VudHJpZXNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZGFfaXB2NnBsdXNfbWNhc3Rfdmxhbl9pZC5lbnRyaWVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2RhX2lwdjZwbHVzX21jYXN0X3ZsYW5faWQuZW50cmllcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJlbnRyaWVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9nZGFfaXB2NnBsdXNfbWNhc3Rfdmxhbl9pZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk0ID0gMDsgaTQgPCB0aGlzLT51LmdkYV9pcHY2cGx1c19tY2FzdF92bGFuX2lkLmVudHJpZXNfY291bnQ7IGk0KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX2lwdjZwbHVzX21jYXN0X3ZsYW5faWRfcGFjaygmdGhpcy0+dS5nZGFfaXB2NnBsdXNfbWNhc3Rfdmxhbl9pZC5lbnRyaWVzW2k0XSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfQ09OVFJPTF9UWVBFX0dEQV9NQUNfUExVU19JUFY2U0E6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTU7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5nZGFfbWFjX3BsdXNfaXB2NnNhLnRvdGFsX2VudHJpZXNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZGFfbWFjX3BsdXNfaXB2NnNhLmVudHJpZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZGFfbWFjX3BsdXNfaXB2NnNhLmVudHJpZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZW50cmllc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZ2RhX21hY19wbHVzX2lwdjZzYVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk1ID0gMDsgaTUgPCB0aGlzLT51LmdkYV9tYWNfcGx1c19pcHY2c2EuZW50cmllc19jb3VudDsgaTUrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfaXB2NnNhX3BhY2soJnRoaXMtPnUuZ2RhX21hY19wbHVzX2lwdjZzYS5lbnRyaWVzW2k1XSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbCAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDI7CisgICAgc3dpdGNoICh0aGlzLT50eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9DT05UUk9MX1RZUEVfR0RBX01BQ19PTkxZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyAoMTAgKiB0aGlzLT51LmdkYV9tYWNfb25seS5lbnRyaWVzX2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX0NPTlRST0xfVFlQRV9HREFfTUFDX1BMVVNfVkxBTl9JRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgKDEwICogdGhpcy0+dS5nZGFfbWFjX3BsdXNfdmxhbl9pZC5lbnRyaWVzX2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX0NPTlRST0xfVFlQRV9HREFfTUFDX1BMVVNfSVBWNFNBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyAoMTIgKiB0aGlzLT51LmdkYV9tYWNfcGx1c19pcHY0c2EuZW50cmllc19jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9DT05UUk9MX1RZUEVfR0RBX0lQUExVU19NQ0FTVF9WTEFOX0lEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyAoMTAgKiB0aGlzLT51LmdkYV9pcHBsdXNfbWNhc3Rfdmxhbl9pZC5lbnRyaWVzX2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX0NPTlRST0xfVFlQRV9HREFfSVBWNlBMVVNfTUNBU1RfVkxBTl9JRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgKDIwICogdGhpcy0+dS5nZGFfaXB2NnBsdXNfbWNhc3Rfdmxhbl9pZC5lbnRyaWVzX2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX0NPTlRST0xfVFlQRV9HREFfTUFDX1BMVVNfSVBWNlNBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyAoMjQgKiB0aGlzLT51LmdkYV9tYWNfcGx1c19pcHY2c2EuZW50cmllc19jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9hY3Rpb25fdW5wYWNrKCZ0aGlzLT5hY3Rpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX3R5cGVfdW5wYWNrKCZ0aGlzLT50eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfQ09OVFJPTF9UWVBFX0dEQV9NQUNfT05MWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmdkYV9tYWNfb25seS50b3RhbF9lbnRyaWVzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0aGlzLT51LmdkYV9tYWNfb25seS5lbnRyaWVzX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9nZGFfbWFjX29ubHlfY291bnRfZW50cmllcyhidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZGFfbWFjX29ubHkuZW50cmllc19jb3VudCA+IDApICYmICh0aGlzLT51LmdkYV9tYWNfb25seS5lbnRyaWVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZW50cmllc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZ2RhX21hY19vbmx5XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2RhX21hY19vbmx5LmVudHJpZXMgPSAoYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX29ubHkgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2RhX21hY19vbmx5LmVudHJpZXNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX29ubHkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUuZ2RhX21hY19vbmx5LmVudHJpZXNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19vbmx5X3VucGFjaygmdGhpcy0+dS5nZGFfbWFjX29ubHkuZW50cmllc1tpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfQ09OVFJPTF9UWVBFX0dEQV9NQUNfUExVU19WTEFOX0lEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZ2RhX21hY19wbHVzX3ZsYW5faWQudG90YWxfZW50cmllc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGhpcy0+dS5nZGFfbWFjX3BsdXNfdmxhbl9pZC5lbnRyaWVzX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9nZGFfbWFjX3BsdXNfdmxhbl9pZF9jb3VudF9lbnRyaWVzKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdkYV9tYWNfcGx1c192bGFuX2lkLmVudHJpZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZGFfbWFjX3BsdXNfdmxhbl9pZC5lbnRyaWVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZW50cmllc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZ2RhX21hY19wbHVzX3ZsYW5faWRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZGFfbWFjX3BsdXNfdmxhbl9pZC5lbnRyaWVzID0gKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19wbHVzX3ZsYW5faWQgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2RhX21hY19wbHVzX3ZsYW5faWQuZW50cmllc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c192bGFuX2lkKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LmdkYV9tYWNfcGx1c192bGFuX2lkLmVudHJpZXNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19wbHVzX3ZsYW5faWRfdW5wYWNrKCZ0aGlzLT51LmdkYV9tYWNfcGx1c192bGFuX2lkLmVudHJpZXNbaTFdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX0NPTlRST0xfVFlQRV9HREFfTUFDX1BMVVNfSVBWNFNBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkyOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZ2RhX21hY19wbHVzX2lwdjRzYS50b3RhbF9lbnRyaWVzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0aGlzLT51LmdkYV9tYWNfcGx1c19pcHY0c2EuZW50cmllc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZ2RhX21hY19wbHVzX2lwdjRzYV9jb3VudF9lbnRyaWVzKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdkYV9tYWNfcGx1c19pcHY0c2EuZW50cmllc19jb3VudCA+IDApICYmICh0aGlzLT51LmdkYV9tYWNfcGx1c19pcHY0c2EuZW50cmllcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImVudHJpZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2dkYV9tYWNfcGx1c19pcHY0c2FcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZGFfbWFjX3BsdXNfaXB2NHNhLmVudHJpZXMgPSAoYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfaXB2NHNhICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmdkYV9tYWNfcGx1c19pcHY0c2EuZW50cmllc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY0c2EpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUuZ2RhX21hY19wbHVzX2lwdjRzYS5lbnRyaWVzX2NvdW50OyBpMisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY0c2FfdW5wYWNrKCZ0aGlzLT51LmdkYV9tYWNfcGx1c19pcHY0c2EuZW50cmllc1tpMl0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfQ09OVFJPTF9UWVBFX0dEQV9JUFBMVVNfTUNBU1RfVkxBTl9JRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMzsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmdkYV9pcHBsdXNfbWNhc3Rfdmxhbl9pZC50b3RhbF9lbnRyaWVzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0aGlzLT51LmdkYV9pcHBsdXNfbWNhc3Rfdmxhbl9pZC5lbnRyaWVzX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9nZGFfaXBwbHVzX21jYXN0X3ZsYW5faWRfY291bnRfZW50cmllcyhidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZGFfaXBwbHVzX21jYXN0X3ZsYW5faWQuZW50cmllc19jb3VudCA+IDApICYmICh0aGlzLT51LmdkYV9pcHBsdXNfbWNhc3Rfdmxhbl9pZC5lbnRyaWVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZW50cmllc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZ2RhX2lwcGx1c19tY2FzdF92bGFuX2lkXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2RhX2lwcGx1c19tY2FzdF92bGFuX2lkLmVudHJpZXMgPSAoYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfaXBwbHVzX21jYXN0X3ZsYW5faWQgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2RhX2lwcGx1c19tY2FzdF92bGFuX2lkLmVudHJpZXNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfaXBwbHVzX21jYXN0X3ZsYW5faWQpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IHRoaXMtPnUuZ2RhX2lwcGx1c19tY2FzdF92bGFuX2lkLmVudHJpZXNfY291bnQ7IGkzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX2lwcGx1c19tY2FzdF92bGFuX2lkX3VucGFjaygmdGhpcy0+dS5nZGFfaXBwbHVzX21jYXN0X3ZsYW5faWQuZW50cmllc1tpM10sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfQ09OVFJPTF9UWVBFX0dEQV9JUFY2UExVU19NQ0FTVF9WTEFOX0lEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGk0OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZ2RhX2lwdjZwbHVzX21jYXN0X3ZsYW5faWQudG90YWxfZW50cmllc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGhpcy0+dS5nZGFfaXB2NnBsdXNfbWNhc3Rfdmxhbl9pZC5lbnRyaWVzX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9nZGFfaXB2NnBsdXNfbWNhc3Rfdmxhbl9pZF9jb3VudF9lbnRyaWVzKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdkYV9pcHY2cGx1c19tY2FzdF92bGFuX2lkLmVudHJpZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZGFfaXB2NnBsdXNfbWNhc3Rfdmxhbl9pZC5lbnRyaWVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZW50cmllc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZ2RhX2lwdjZwbHVzX21jYXN0X3ZsYW5faWRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZGFfaXB2NnBsdXNfbWNhc3Rfdmxhbl9pZC5lbnRyaWVzID0gKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX2lwdjZwbHVzX21jYXN0X3ZsYW5faWQgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2RhX2lwdjZwbHVzX21jYXN0X3ZsYW5faWQuZW50cmllc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9pcHY2cGx1c19tY2FzdF92bGFuX2lkKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk0ID0gMDsgaTQgPCB0aGlzLT51LmdkYV9pcHY2cGx1c19tY2FzdF92bGFuX2lkLmVudHJpZXNfY291bnQ7IGk0KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX2lwdjZwbHVzX21jYXN0X3ZsYW5faWRfdW5wYWNrKCZ0aGlzLT51LmdkYV9pcHY2cGx1c19tY2FzdF92bGFuX2lkLmVudHJpZXNbaTRdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX0NPTlRST0xfVFlQRV9HREFfTUFDX1BMVVNfSVBWNlNBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGk1OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZ2RhX21hY19wbHVzX2lwdjZzYS50b3RhbF9lbnRyaWVzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0aGlzLT51LmdkYV9tYWNfcGx1c19pcHY2c2EuZW50cmllc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZ2RhX21hY19wbHVzX2lwdjZzYV9jb3VudF9lbnRyaWVzKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdkYV9tYWNfcGx1c19pcHY2c2EuZW50cmllc19jb3VudCA+IDApICYmICh0aGlzLT51LmdkYV9tYWNfcGx1c19pcHY2c2EuZW50cmllcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImVudHJpZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2dkYV9tYWNfcGx1c19pcHY2c2FcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZGFfbWFjX3BsdXNfaXB2NnNhLmVudHJpZXMgPSAoYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfaXB2NnNhICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmdkYV9tYWNfcGx1c19pcHY2c2EuZW50cmllc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY2c2EpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTUgPSAwOyBpNSA8IHRoaXMtPnUuZ2RhX21hY19wbHVzX2lwdjZzYS5lbnRyaWVzX2NvdW50OyBpNSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY2c2FfdW5wYWNrKCZ0aGlzLT51LmdkYV9tYWNfcGx1c19pcHY2c2EuZW50cmllc1tpNV0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX3R5cGUgdHlwZTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF90eXBlX3VucGFjaygmdHlwZSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX0NPTlRST0xfVFlQRV9HREFfTUFDX09OTFk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgZW50cmllc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxMCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZW50cmllc19lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKGVudHJpZXNfZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfb25seSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfQ09OVFJPTF9UWVBFX0dEQV9NQUNfUExVU19WTEFOX0lEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGVudHJpZXNfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTApKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGVudHJpZXNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChlbnRyaWVzX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfdmxhbl9pZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfQ09OVFJPTF9UWVBFX0dEQV9NQUNfUExVU19JUFY0U0E6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgZW50cmllc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxMikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZW50cmllc19lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKGVudHJpZXNfZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY0c2EpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX0NPTlRST0xfVFlQRV9HREFfSVBQTFVTX01DQVNUX1ZMQU5fSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgZW50cmllc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxMCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZW50cmllc19lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKGVudHJpZXNfZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9pcHBsdXNfbWNhc3Rfdmxhbl9pZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfQ09OVFJPTF9UWVBFX0dEQV9JUFY2UExVU19NQ0FTVF9WTEFOX0lEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGVudHJpZXNfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMjApKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGVudHJpZXNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChlbnRyaWVzX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfaXB2NnBsdXNfbWNhc3Rfdmxhbl9pZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfQ09OVFJPTF9UWVBFX0dEQV9NQUNfUExVU19JUFY2U0E6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgZW50cmllc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyNCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZW50cmllc19lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKGVudHJpZXNfZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY2c2EpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2dkYV9tYWNfb25seV9jb3VudF9lbnRyaWVzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2dkYV9tYWNfcGx1c192bGFuX2lkX2NvdW50X2VudHJpZXMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZ2RhX21hY19wbHVzX2lwdjRzYV9jb3VudF9lbnRyaWVzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2dkYV9pcHBsdXNfbWNhc3Rfdmxhbl9pZF9jb3VudF9lbnRyaWVzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2dkYV9pcHY2cGx1c19tY2FzdF92bGFuX2lkX2NvdW50X2VudHJpZXMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDIwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZ2RhX21hY19wbHVzX2lwdjZzYV9jb3VudF9lbnRyaWVzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAyNCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2xsaWRfcXVldWVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9sbGlkX3F1ZXVlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnF1ZXVlX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+d3JyX3dlaWdodCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2xsaWRfcXVldWVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2xsaWRfcXVldWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+cXVldWVfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT53cnJfd2VpZ2h0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfbGxpZF9xdWV1ZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fenRlX3ZsYW5fbWFjX3BhY2soYmNtb2x0X2Vwb25fb2FtX3p0ZV92bGFuX21hYyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV92bGFuX3RhZyhidWYsIHRoaXMtPnZsYW5faWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPm1hY19maWx0ZXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fenRlX3ZsYW5fbWFjX3VucGFjayhiY21vbHRfZXBvbl9vYW1fenRlX3ZsYW5fbWFjICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdmxhbl90YWcoYnVmLCAmdGhpcy0+dmxhbl9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+bWFjX2ZpbHRlcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV96dGVfdmxhbl9tYWNfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA4KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hdHRyaWJ1dGVfcGFjayh0aGlzLT5sZWFmLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+bGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUFBQT19FVEVTVF9SRVNVTFQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnBwcG9fZXRlc3RfcmVzdWx0LndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnBwcG9fZXRlc3RfcmVzdWx0LndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcHBwb19ldGVzdF9zdGF0dXNfcGFjayh0aGlzLT51LnBwcG9fZXRlc3RfcmVzdWx0LnN0YXR1cywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9wcHBvX2V0ZXN0X2ZhaWxfcmVhc29uX3BhY2sodGhpcy0+dS5wcHBvX2V0ZXN0X3Jlc3VsdC5yZWFzb24sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9QUFBPX0VURVNUX0NPTkZJR1VSQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnBwcG9fZXRlc3RfY29uZmlndXJhdGlvbi53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5wcHBvX2V0ZXN0X2NvbmZpZ3VyYXRpb24ud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9zdGFydF9vcl9zdG9wX2luZGljYXRpb25fcGFjayh0aGlzLT51LnBwcG9fZXRlc3RfY29uZmlndXJhdGlvbi5zdGFydF9vcl9zdG9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUucHBwb19ldGVzdF9jb25maWd1cmF0aW9uLnVzZXJfbmFtZSwgNjQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUucHBwb19ldGVzdF9jb25maWd1cmF0aW9uLnBhc3N3b3JkLCAzMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcHBwb19lYXV0aF9tb2RlX3BhY2sodGhpcy0+dS5wcHBvX2V0ZXN0X2NvbmZpZ3VyYXRpb24ubW9kZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5wcHBvX2V0ZXN0X2NvbmZpZ3VyYXRpb24udmxhbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmVuZC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5lbmQud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5lbmQudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmtub3duXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfZW5kXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZW5kLnVua25vd24sIHRoaXMtPnUuZW5kLnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1NFUklBTF9OVU1CRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9zZXJpYWxfbnVtYmVyLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9zZXJpYWxfbnVtYmVyLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5vbnVfc2VyaWFsX251bWJlci52ZW5kb3JfaWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51Lm9udV9zZXJpYWxfbnVtYmVyLm9udV9tb2RlbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5vbnVfc2VyaWFsX251bWJlci5vbnVfbWFjKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51Lm9udV9zZXJpYWxfbnVtYmVyLmh3dmVyc2lvbiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5vbnVfc2VyaWFsX251bWJlci5zd3ZlcnNpb24sIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51Lm9udV9zZXJpYWxfbnVtYmVyLmV4dF9vbnVfbW9kZWwsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0ZJUk1XQVJFX1ZFUlNJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmZpcm13YXJlX3ZlcnNpb24ud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZmlybXdhcmVfdmVyc2lvbi53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5maXJtd2FyZV92ZXJzaW9uLmZpcm13YXJlX3ZlcnNpb25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5maXJtd2FyZV92ZXJzaW9uLmZpcm13YXJlX3ZlcnNpb24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZmlybXdhcmVfdmVyc2lvblwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2Zpcm13YXJlX3ZlcnNpb25cIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5maXJtd2FyZV92ZXJzaW9uLmZpcm13YXJlX3ZlcnNpb24sIHRoaXMtPnUuZmlybXdhcmVfdmVyc2lvbi5maXJtd2FyZV92ZXJzaW9uX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0NISVBTRVRfSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmNoaXBzZXRfaWQud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuY2hpcHNldF9pZC53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmNoaXBzZXRfaWQudmVuZG9yX2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5jaGlwc2V0X2lkLmNoaXBfbW9kZWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuY2hpcHNldF9pZC5yZXZpc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5jaGlwc2V0X2lkLmRlc2lnbl9kYXRlLCAzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9DQVBBQklMSVRJRVMxOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMS53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMS53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19zdXBwb3J0ZWRfc2VydmljZXNfcGFjayh0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMxLnNlcnZpY2VzLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X2NhcGFiaWxpdGllczEubnVtX2dlcG9ydHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMxLmdlYml0bWFwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMxLm51bV9mZXBvcnRzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMS5mZWJpdG1hcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMS5udW1fcG90c19wb3J0cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMS5udW1fZTFwb3J0cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMS5udW1fdXBzdHJlYW1fcXVldWVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMxLm1heF9xdWV1ZXNfcGVyX3BvcnRfdXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X2NhcGFiaWxpdGllczEubnVtX2Rvd25zdHJlYW1fcXVldWVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMxLm1heF9xdWV1ZXNfcGVyX3BvcnRfZG93bikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMS5iYXR0ZXJ5X2JhY2t1cCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PUFRJQ0FMX1RSQU5TQ0VJVkVSX0RJQUdOT1NJUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub3B0aWNhbF90cmFuc2NlaXZlcl9kaWFnbm9zaXMud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub3B0aWNhbF90cmFuc2NlaXZlcl9kaWFnbm9zaXMud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5vcHRpY2FsX3RyYW5zY2VpdmVyX2RpYWdub3Npcy50cmFuc2NlaXZlcl90ZW1wZXJhdHVyZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUub3B0aWNhbF90cmFuc2NlaXZlcl9kaWFnbm9zaXMuc3VwcGx5X3ZjYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUub3B0aWNhbF90cmFuc2NlaXZlcl9kaWFnbm9zaXMudHhfYmlhc19jdXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lm9wdGljYWxfdHJhbnNjZWl2ZXJfZGlhZ25vc2lzLnR4X3Bvd2VyX291dCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUub3B0aWNhbF90cmFuc2NlaXZlcl9kaWFnbm9zaXMucnhfcG93ZXJfaW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfU0VSVklDRV9TTEE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnNlcnZpY2Vfc2xhLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNlcnZpY2Vfc2xhLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV9iYXNlX3BhY2soJnRoaXMtPnUuc2VydmljZV9zbGEuc2VydmljZV9zbGEsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfQ0FQQUJJTElUSUVTMjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMi53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMi53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfdHlwZV9wYWNrKHRoaXMtPnUub251X2NhcGFiaWxpdGllczIub251X3R5cGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMi5udW1fbGlua3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfcHJvdGVjdGlvbl90eXBlX3BhY2sodGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMi5wcm90ZWN0aW9uX3R5cGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMi5udW1fcG9uX2lmcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMi5udW1fc2xvdHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X2NhcGFiaWxpdGllczIuaW50ZXJmYWNlc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMyLmludGVyZmFjZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMi5pbnRlcmZhY2VzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImludGVyZmFjZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9vbnVfY2FwYWJpbGl0aWVzMlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMyLmludGVyZmFjZXNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2ludGVyZmFjZV9wYWNrKCZ0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMyLmludGVyZmFjZXNbaTBdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUub251X2NhcGFiaWxpdGllczIuYmF0dGVyeV9iYWNrdXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSE9MRE9WRVJfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5ob2xkb3Zlcl9jb25maWcud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuaG9sZG92ZXJfY29uZmlnLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2VuYWJsZWRfc3RhdGVfcGFjayh0aGlzLT51LmhvbGRvdmVyX2NvbmZpZy5ob2xkb3Zlcl9zdGF0ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5ob2xkb3Zlcl9jb25maWcuaG9sZG92ZXJfdGltZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9NWFVfTUFOQUdFX0dMT0JBTF9QQVJBTUVURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX214dV9nbG9iYWxfcGFyYW1zX2Jhc2VfcGFjaygmdGhpcy0+dS5teHVfbWFuYWdlX2dsb2JhbF9wYXJhbWV0ZXIucGFyYW1zLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX01YVV9NQU5BR0VfU05NUF9QQVJBTUVURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX214dV9zbm1wX3BhcmFtc19iYXNlX3BhY2soJnRoaXMtPnUubXh1X21hbmFnZV9zbm1wX3BhcmFtZXRlci5wYXJhbXMsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfQUNUSVZFX1BPTl9JRkFETUlOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5hY3RpdmVfcG9uX2lmYWRtaW4ud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuYWN0aXZlX3Bvbl9pZmFkbWluLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5hY3RpdmVfcG9uX2lmYWRtaW4ucG9uX251bWJlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfQ0FQQUJJTElUSUVTMzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub251X2NhcGFiaWxpdGllczMud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X2NhcGFiaWxpdGllczMud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUub251X2NhcGFiaWxpdGllczMuaXNfaXB2NmF3YXJlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X3Bvd2VyX3N1cHBseV9jb250cm9sX3R5cGVfcGFjayh0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMzLnBvd2VyX2NvbnRyb2xfdHlwZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMzLnNlcnZpY2Vfc2xhKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0VUSF9MSU5LX1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5ldGhfbGlua19zdGF0ZS53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5ldGhfbGlua19zdGF0ZS53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS5ldGhfbGlua19zdGF0ZS5saW5rX3N0YXRlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0VUSF9QT1JUX1BBVVNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5ldGhfcG9ydF9wYXVzZS53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5ldGhfcG9ydF9wYXVzZS53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS5ldGhfcG9ydF9wYXVzZS5lbmFibGVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0VUSF9QT1JUX1BPTElDSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5ldGhfcG9ydF9wb2xpY2luZy53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5ldGhfcG9ydF9wb2xpY2luZy53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19jb25maWdfYmFzZV9wYWNrKCZ0aGlzLT51LmV0aF9wb3J0X3BvbGljaW5nLmNvbmZpZywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1ZPSVBfUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUudm9pcF9wb3J0LndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnZvaXBfcG9ydC53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS52b2lwX3BvcnQucG9ydF9zdGF0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9FMVBPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmUxcG9ydC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5lMXBvcnQud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUuZTFwb3J0LnBvcnRfc3RhdGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRVRIX1BPUlRfRE9XTl9SQVRFX0xJTUlUSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5ldGhfcG9ydF9kb3duX3JhdGVfbGltaXRpbmcud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZXRoX3BvcnRfZG93bl9yYXRlX2xpbWl0aW5nLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT51LmV0aF9wb3J0X2Rvd25fcmF0ZV9saW1pdGluZy5yYXRlX2xpbWl0aW5nX2VuYWJsZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MjQoYnVmLCB0aGlzLT51LmV0aF9wb3J0X2Rvd25fcmF0ZV9saW1pdGluZy5jaXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MjQoYnVmLCB0aGlzLT51LmV0aF9wb3J0X2Rvd25fcmF0ZV9saW1pdGluZy5waXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUE9SVF9MT09QX0RFVEVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUucG9ydF9sb29wX2RldGVjdC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5wb3J0X2xvb3BfZGV0ZWN0LndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2VuYWJsZWRfc3RhdGVfcGFjayh0aGlzLT51LnBvcnRfbG9vcF9kZXRlY3Quc3RhdGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9WTEFOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS52bGFuLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnZsYW4ud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2VfcGFjaygmdGhpcy0+dS52bGFuLnZsYW5faW5mbywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0NMQVNTSUZJQ0FUSU9OX0FORF9NQVJLSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkxOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmNsYXNzaWZpY2F0aW9uX2FuZF9tYXJraW5nLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmNsYXNzaWZpY2F0aW9uX2FuZF9tYXJraW5nLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2NsYXNzaWZpY2F0aW9uX29wZXJhdGlvbl9wYWNrKHRoaXMtPnUuY2xhc3NpZmljYXRpb25fYW5kX21hcmtpbmcub3AsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5jbGFzc2lmaWNhdGlvbl9hbmRfbWFya2luZy5ydWxlc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmNsYXNzaWZpY2F0aW9uX2FuZF9tYXJraW5nLnJ1bGVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuY2xhc3NpZmljYXRpb25fYW5kX21hcmtpbmcucnVsZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicnVsZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9jbGFzc2lmaWNhdGlvbl9hbmRfbWFya2luZ1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LmNsYXNzaWZpY2F0aW9uX2FuZF9tYXJraW5nLnJ1bGVzX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGVfcGFjaygmdGhpcy0+dS5jbGFzc2lmaWNhdGlvbl9hbmRfbWFya2luZy5ydWxlc1tpMV0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfTVVMVElDQVNUX1ZMQU46CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm11bHRpY2FzdF92bGFuLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm11bHRpY2FzdF92bGFuLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX3Byb3ZfcGFjaygmdGhpcy0+dS5tdWx0aWNhc3Rfdmxhbi52bGFuX2luZm8sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9NVUxUSUNBU1RfVEFHX09QRVJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUubXVsdGljYXN0X3RhZ19vcGVyYXRpb24ud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUubXVsdGljYXN0X3RhZ19vcGVyYXRpb24ud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19vcGVyYXRpb25fYmFzZV9wYWNrKCZ0aGlzLT51Lm11bHRpY2FzdF90YWdfb3BlcmF0aW9uLnRhZ19vcGVyYXRpb24sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9NVUxUSUNBU1RfU1dJVENIOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5tdWx0aWNhc3Rfc3dpdGNoLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm11bHRpY2FzdF9zd2l0Y2gud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3N3aXRjaF9tb2RlX3BhY2sodGhpcy0+dS5tdWx0aWNhc3Rfc3dpdGNoLm1vZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9NVUxUSUNBU1RfQ09OVFJPTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUubXVsdGljYXN0X2NvbnRyb2wud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUubXVsdGljYXN0X2NvbnRyb2wud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfcGFjaygmdGhpcy0+dS5tdWx0aWNhc3RfY29udHJvbC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0dST1VQX01BWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuZ3JvdXBfbWF4LndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lmdyb3VwX21heC53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZ3JvdXBfbWF4Lm1heF9ncm91cHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRkFTVF9MRUFWRV9BQklMSVRZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMjsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5mYXN0X2xlYXZlX2FiaWxpdHkud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZmFzdF9sZWF2ZV9hYmlsaXR5LndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuZmFzdF9sZWF2ZV9hYmlsaXR5LmZhc3RfbGVhdmVfbW9kZXNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5mYXN0X2xlYXZlX2FiaWxpdHkuZmFzdF9sZWF2ZV9tb2Rlc19jb3VudCA+IDApICYmICh0aGlzLT51LmZhc3RfbGVhdmVfYWJpbGl0eS5mYXN0X2xlYXZlX21vZGVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImZhc3RfbGVhdmVfbW9kZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9mYXN0X2xlYXZlX2FiaWxpdHlcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMiA9IDA7IGkyIDwgdGhpcy0+dS5mYXN0X2xlYXZlX2FiaWxpdHkuZmFzdF9sZWF2ZV9tb2Rlc19jb3VudDsgaTIrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmZhc3RfbGVhdmVfYWJpbGl0eS5mYXN0X2xlYXZlX21vZGVzW2kyXSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRkFTVF9MRUFWRV9BRE1JTl9TVEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuZmFzdF9sZWF2ZV9hZG1pbl9zdGF0ZS53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5mYXN0X2xlYXZlX2FkbWluX3N0YXRlLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2VuYWJsZWRfc3RhdGVfcGFjayh0aGlzLT51LmZhc3RfbGVhdmVfYWRtaW5fc3RhdGUuc3RhdGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9MTElEX1FVRVVFX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMzsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5sbGlkX3F1ZXVlX2NvbmZpZy53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5sbGlkX3F1ZXVlX2NvbmZpZy53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUubGxpZF9xdWV1ZV9jb25maWcubGxpZF9xdWV1ZV90YWJsZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmxsaWRfcXVldWVfY29uZmlnLmxsaWRfcXVldWVfdGFibGVfY291bnQgPiAwKSAmJiAodGhpcy0+dS5sbGlkX3F1ZXVlX2NvbmZpZy5sbGlkX3F1ZXVlX3RhYmxlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImxsaWRfcXVldWVfdGFibGVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9sbGlkX3F1ZXVlX2NvbmZpZ1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkzID0gMDsgaTMgPCB0aGlzLT51LmxsaWRfcXVldWVfY29uZmlnLmxsaWRfcXVldWVfdGFibGVfY291bnQ7IGkzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2xsaWRfcXVldWVfcGFjaygmdGhpcy0+dS5sbGlkX3F1ZXVlX2NvbmZpZy5sbGlkX3F1ZXVlX3RhYmxlW2kzXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9JQURfSU5GT1JNQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmlhZF9pbmZvcm1hdGlvbi53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5pYWRfaW5mb3JtYXRpb24ud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT51LmlhZF9pbmZvcm1hdGlvbi5pYWRfbWFjKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdm9pcF9wcm90b2NvbF9wYWNrKHRoaXMtPnUuaWFkX2luZm9ybWF0aW9uLnByb3RvY29sX3N1cHBvcnQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5pYWRfaW5mb3JtYXRpb24uaWFkX3NvZnR3YXJlX3ZlciwgMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuaWFkX2luZm9ybWF0aW9uLmlhZF9zb2Z0d2FyZV90aW1lLCAzMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5pYWRfaW5mb3JtYXRpb24udm9pcF91c2VyX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1ZPSVBfR0xPQkFMX1BBUkFNRVRFUlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnZvaXBfZ2xvYmFsX3BhcmFtZXRlcnMud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUudm9pcF9nbG9iYWxfcGFyYW1ldGVycy53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV9pcG1vZGVfcGFjayh0aGlzLT51LnZvaXBfZ2xvYmFsX3BhcmFtZXRlcnMudm9pY2VfaXBtb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9pcHY0X2FkZHJlc3MoYnVmLCB0aGlzLT51LnZvaXBfZ2xvYmFsX3BhcmFtZXRlcnMuaWFkX2lwYWRkcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2lwdjRfYWRkcmVzcyhidWYsIHRoaXMtPnUudm9pcF9nbG9iYWxfcGFyYW1ldGVycy5pYWRfbmV0X21hc2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9pcHY0X2FkZHJlc3MoYnVmLCB0aGlzLT51LnZvaXBfZ2xvYmFsX3BhcmFtZXRlcnMuaWFkX2RlZmF1bHRfZ3cpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19wcHBvZV9tb2RlX3BhY2sodGhpcy0+dS52b2lwX2dsb2JhbF9wYXJhbWV0ZXJzLnBwcG9lX21vZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS52b2lwX2dsb2JhbF9wYXJhbWV0ZXJzLnBwcG9lX3VzZXJuYW1lLCAzMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS52b2lwX2dsb2JhbF9wYXJhbWV0ZXJzLnBwcG9lX3Bhc3N3b3JkLCAzMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX3RhZ2dpbmdfbW9kZV9wYWNrKHRoaXMtPnUudm9pcF9nbG9iYWxfcGFyYW1ldGVycy50YWdnaW5nX21vZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUudm9pcF9nbG9iYWxfcGFyYW1ldGVycy52b2ljZV9jdmxhbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUudm9pcF9nbG9iYWxfcGFyYW1ldGVycy52b2ljZV9zdmxhbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS52b2lwX2dsb2JhbF9wYXJhbWV0ZXJzLnZvaWNlX3ByaSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9IMjQ4UEFSQU1FVEVSUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuaDI0OHBhcmFtZXRlcnMud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuaDI0OHBhcmFtZXRlcnMud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5oMjQ4cGFyYW1ldGVycy5tZ3BvcnRfbnVtYmVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfaXB2NF9hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5oMjQ4cGFyYW1ldGVycy5tZ2NfaXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmgyNDhwYXJhbWV0ZXJzLm1nY19jb21fcG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2lwdjRfYWRkcmVzcyhidWYsIHRoaXMtPnUuaDI0OHBhcmFtZXRlcnMuYmFja3VwX21nY19pcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuaDI0OHBhcmFtZXRlcnMuYmFja3VwX21nY19jb21fcG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT51LmgyNDhwYXJhbWV0ZXJzLnVzZV9hY3RpdmVfbWdjKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfaDI0OHJlZ19tb2RlX3BhY2sodGhpcy0+dS5oMjQ4cGFyYW1ldGVycy5yZWdfbW9kZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmgyNDhwYXJhbWV0ZXJzLm1pZCwgNjQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19oMjQ4aGVhcnRiZWF0X21vZGVfcGFjayh0aGlzLT51LmgyNDhwYXJhbWV0ZXJzLmhlYXJ0YmVhdF9tb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmgyNDhwYXJhbWV0ZXJzLmhlYXJ0YmVhdF9jeWNsZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5oMjQ4cGFyYW1ldGVycy5oZWFydGJlYXRfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSDI0OFVTRVJfVElEX0lORk9STUFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5oMjQ4dXNlcl90aWRfaW5mb3JtYXRpb24ud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuaDI0OHVzZXJfdGlkX2luZm9ybWF0aW9uLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5oMjQ4dXNlcl90aWRfaW5mb3JtYXRpb24ubmFtZSwgMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSDI0OFJUUF9USURfQ09ORklHVVJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuaDI0OHJ0cF90aWRfY29uZmlndXJhdGlvbi53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5oMjQ4cnRwX3RpZF9jb25maWd1cmF0aW9uLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5oMjQ4cnRwX3RpZF9jb25maWd1cmF0aW9uLm51bV9ydHBfdGlkcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5oMjQ4cnRwX3RpZF9jb25maWd1cmF0aW9uLnByZWZpeCwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LmgyNDhydHBfdGlkX2NvbmZpZ3VyYXRpb24uZGlnaXRfYmVnaW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19ydHBfdGlkX21vZGVfcGFjayh0aGlzLT51LmgyNDhydHBfdGlkX2NvbmZpZ3VyYXRpb24ucnRwX3RpZF9tb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuaDI0OHJ0cF90aWRfY29uZmlndXJhdGlvbi5ydHBfdGlkX2xlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9IMjQ4UlRQX1RJRF9JTkZPUk1BVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuaDI0OHJ0cF90aWRfaW5mb3JtYXRpb24ud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuaDI0OHJ0cF90aWRfaW5mb3JtYXRpb24ud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmgyNDhydHBfdGlkX2luZm9ybWF0aW9uLm51bV9ydHBfdGlkcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5oMjQ4cnRwX3RpZF9pbmZvcm1hdGlvbi5maXJzdF9ydHBfdGlkX25hbWUsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1NJUF9QQVJBTUVURVJTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5zaXBfcGFyYW1ldGVycy53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5zaXBfcGFyYW1ldGVycy53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnNpcF9wYXJhbWV0ZXJzLm1ncG9ydF9udW1iZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9pcHY0X2FkZHJlc3MoYnVmLCB0aGlzLT51LnNpcF9wYXJhbWV0ZXJzLmFjdGl2ZV9zaXBfaXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnNpcF9wYXJhbWV0ZXJzLmFjdGl2ZV9zaXBfY29tX3BvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9pcHY0X2FkZHJlc3MoYnVmLCB0aGlzLT51LnNpcF9wYXJhbWV0ZXJzLmJhY2t1cF9zaXBfaXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnNpcF9wYXJhbWV0ZXJzLmJhY2t1cF9zaXBfY29tX3BvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9pcHY0X2FkZHJlc3MoYnVmLCB0aGlzLT51LnNpcF9wYXJhbWV0ZXJzLmFjdGl2ZV9zaXBfcHJveHlfc2VydmVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfaXB2NF9hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5zaXBfcGFyYW1ldGVycy5hY3RpdmVfc2lwX3JlZ2lzdHJhdGlvbl9zZXJ2ZXJfaXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnNpcF9wYXJhbWV0ZXJzLmFjdGl2ZV9zaXBfcmVnaXN0cmF0aW9uX3NlcnZlcl9jb21fcG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2lwdjRfYWRkcmVzcyhidWYsIHRoaXMtPnUuc2lwX3BhcmFtZXRlcnMuYmFja3VwX3NpcF9yZWdfaXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnNpcF9wYXJhbWV0ZXJzLmJhY2t1cF9zaXBfcmVnX2NvbV9wb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfaXB2NF9hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5zaXBfcGFyYW1ldGVycy5vdXRib3VuZF9zZXJ2ZXJfaXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnNpcF9wYXJhbWV0ZXJzLm91dGJvdW5kX3NlcnZlcl9wb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5zaXBfcGFyYW1ldGVycy5zaXBfcmVnaXN0cmF0aW9uX2ludGVydmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUuc2lwX3BhcmFtZXRlcnMuZGlzYWJsZV9oZWFydGJlYXRfc3dpdGNoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5zaXBfcGFyYW1ldGVycy5oZWFydGJlYXRfY3ljbGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnNpcF9wYXJhbWV0ZXJzLmhlYXJ0YmVhdF9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9TSVBfVVNFUl9QQVJBTUVURVJTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5zaXBfdXNlcl9wYXJhbWV0ZXJzLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNpcF91c2VyX3BhcmFtZXRlcnMud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LnNpcF91c2VyX3BhcmFtZXRlcnMuYWNjb3VudCwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuc2lwX3VzZXJfcGFyYW1ldGVycy5uYW1lLCAzMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5zaXBfdXNlcl9wYXJhbWV0ZXJzLnBhc3N3b3JkLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9GQVhfTU9ERU1fQ09ORklHVVJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuZmF4X21vZGVtX2NvbmZpZ3VyYXRpb24ud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZmF4X21vZGVtX2NvbmZpZ3VyYXRpb24ud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfdDM4bW9kZV9wYWNrKHRoaXMtPnUuZmF4X21vZGVtX2NvbmZpZ3VyYXRpb24udm9pY2VfdDM4ZW5hYmxlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV9mYXhfbW9kZW1fY29udHJvbF9tb2RlX3BhY2sodGhpcy0+dS5mYXhfbW9kZW1fY29uZmlndXJhdGlvbi52b2ljZV9mYXhfbW9kZW1fY29udHJvbCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0gyNDhJQURfT1BFUkFUSU9OX1NUQVRVUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuaDI0OGlhZF9vcGVyYXRpb25fc3RhdHVzLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmgyNDhpYWRfb3BlcmF0aW9uX3N0YXR1cy53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfb3BlcmF0aW9uX3N0YXR1c19wYWNrKHRoaXMtPnUuaDI0OGlhZF9vcGVyYXRpb25fc3RhdHVzLmlhZF9vcGVyYXRpb25fc3RhdHVzLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUE9UU19TVEFUVVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnBvdHNfc3RhdHVzLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnBvdHNfc3RhdHVzLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9wb3J0X3N0YXR1c19wYWNrKHRoaXMtPnUucG90c19zdGF0dXMuaWFkX3BvcnRfc3RhdHVzLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9zZXJ2aWNlX3N0YXRlX3BhY2sodGhpcy0+dS5wb3RzX3N0YXR1cy5pYWRfcG9ydF9zZXJ2aWNlX3N0YXRlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9jb2RlY19tb2RlX3BhY2sodGhpcy0+dS5wb3RzX3N0YXR1cy5pYWRfcG9ydF9jb2RlY19tb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSUFEX09QRVJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuaWFkX29wZXJhdGlvbi53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5pYWRfb3BlcmF0aW9uLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9vcGVyYXRpb25fcGFjayh0aGlzLT51LmlhZF9vcGVyYXRpb24uaWFkX29wZXJhdGlvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1NJUF9ESUdJVF9NQVA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnNpcF9kaWdpdF9tYXAud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuc2lwX2RpZ2l0X21hcC53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnNpcF9kaWdpdF9tYXAuc2lwX2RpZ2l0YWxfbWFwX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2lwX2RpZ2l0X21hcC5zaXBfZGlnaXRhbF9tYXBfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zaXBfZGlnaXRfbWFwLnNpcF9kaWdpdGFsX21hcCA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJzaXBfZGlnaXRhbF9tYXBcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9zaXBfZGlnaXRfbWFwXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuc2lwX2RpZ2l0X21hcC5zaXBfZGlnaXRhbF9tYXAsIHRoaXMtPnUuc2lwX2RpZ2l0X21hcC5zaXBfZGlnaXRhbF9tYXBfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfQUxBUk1fQURNSU5fU1RBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmFsYXJtX2FkbWluX3N0YXRlLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmFsYXJtX2FkbWluX3N0YXRlLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9hbGFybV9pZF9wYWNrKHRoaXMtPnUuYWxhcm1fYWRtaW5fc3RhdGUuaWQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2VuYWJsZWRfc3RhdGVfcGFjayh0aGlzLT51LmFsYXJtX2FkbWluX3N0YXRlLmNvbmZpZywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0FMQVJNX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuYWxhcm1fdGhyZXNob2xkLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmFsYXJtX3RocmVzaG9sZC53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfYWxhcm1faWRfcGFjayh0aGlzLT51LmFsYXJtX3RocmVzaG9sZC5pZCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5hbGFybV90aHJlc2hvbGQudGhyZXNob2xkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5hbGFybV90aHJlc2hvbGQuY2xlYXJpbmdfdGhyZXNob2xkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1ZFUlNJT05fU0VSVkVSX1BBUkE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnZlcnNpb25fc2VydmVyX3BhcmEud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUudmVyc2lvbl9zZXJ2ZXJfcGFyYS53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9pcHY0X2FkZHJlc3MoYnVmLCB0aGlzLT51LnZlcnNpb25fc2VydmVyX3BhcmEuaXBhZGRyZXNzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfaXB2NF9hZGRyZXNzKGJ1ZiwgdGhpcy0+dS52ZXJzaW9uX3NlcnZlcl9wYXJhLmlwbWFzaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2lwdjRfYWRkcmVzcyhidWYsIHRoaXMtPnUudmVyc2lvbl9zZXJ2ZXJfcGFyYS5nYXRld2F5KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdmxhbl90YWcoYnVmLCB0aGlzLT51LnZlcnNpb25fc2VydmVyX3BhcmEudmxhbl9pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS52ZXJzaW9uX3NlcnZlcl9wYXJhLnVzZXJfbmFtZSwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS52ZXJzaW9uX3NlcnZlcl9wYXJhLnBhc3N3b3JkLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnZlcnNpb25fc2VydmVyX3BhcmEuYWN0aW9uKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnZlcnNpb25fc2VydmVyX3BhcmEudmVyc2lvbl9udW1iZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUudmVyc2lvbl9zZXJ2ZXJfcGFyYS52ZXIxbmFtZSwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUudmVyc2lvbl9zZXJ2ZXJfcGFyYS52ZXIybmFtZSwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUudmVyc2lvbl9zZXJ2ZXJfcGFyYS52ZXIzbmFtZSwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX01BQ19MSU1JVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub251X21hY19saW1pdC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfbWFjX2xpbWl0LndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUub251X21hY19saW1pdC5tYWNfbGltaXRfbnVtYmVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9NQUNfQUdJTkdfVElNRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub251X21hY19hZ2luZ190aW1lLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9tYWNfYWdpbmdfdGltZS53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51Lm9udV9tYWNfYWdpbmdfdGltZS5tYWNfYWdpbmdfdGltZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9SVF9NQUNfRklMVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICB1aW50OF90IGk0OworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9wb3J0X21hY19maWx0ZXIud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X3BvcnRfbWFjX2ZpbHRlci53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3p0ZV9vbnVfcG9ydF9tYWNfb3BlcmF0aW9uX3BhY2sodGhpcy0+dS5vbnVfcG9ydF9tYWNfZmlsdGVyLm9wLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X3BvcnRfbWFjX2ZpbHRlci5udW1iZXJfb2ZfZW50cmllcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm9udV9wb3J0X21hY19maWx0ZXIubnVtYmVyX29mX2VudHJpZXMgPiAwKSAmJiAodGhpcy0+dS5vbnVfcG9ydF9tYWNfZmlsdGVyLmNsYXVzZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjbGF1c2VcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9vbnVfcG9ydF9tYWNfZmlsdGVyXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTQgPSAwOyBpNCA8IHRoaXMtPnUub251X3BvcnRfbWFjX2ZpbHRlci5udW1iZXJfb2ZfZW50cmllczsgaTQrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3p0ZV92bGFuX21hY19wYWNrKCZ0aGlzLT51Lm9udV9wb3J0X21hY19maWx0ZXIuY2xhdXNlW2k0XSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9SVF9NQUNfQklORElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgdWludDhfdCBpNTsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vbnVfcG9ydF9tYWNfYmluZGluZy53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfcG9ydF9tYWNfYmluZGluZy53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3p0ZV9vbnVfcG9ydF9tYWNfb3BlcmF0aW9uX3BhY2sodGhpcy0+dS5vbnVfcG9ydF9tYWNfYmluZGluZy5vcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9wb3J0X21hY19iaW5kaW5nLm51bWJlcl9vZl9lbnRyaWVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUub251X3BvcnRfbWFjX2JpbmRpbmcubnVtYmVyX29mX2VudHJpZXMgPiAwKSAmJiAodGhpcy0+dS5vbnVfcG9ydF9tYWNfYmluZGluZy5jbGF1c2UgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY2xhdXNlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfb251X3BvcnRfbWFjX2JpbmRpbmdcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNSA9IDA7IGk1IDwgdGhpcy0+dS5vbnVfcG9ydF9tYWNfYmluZGluZy5udW1iZXJfb2ZfZW50cmllczsgaTUrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3p0ZV92bGFuX21hY19wYWNrKCZ0aGlzLT51Lm9udV9wb3J0X21hY19iaW5kaW5nLmNsYXVzZVtpNV0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPUlRfTUFDX1NUQVRJQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgdWludDhfdCBpNjsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vbnVfcG9ydF9tYWNfc3RhdGljLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9wb3J0X21hY19zdGF0aWMud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV96dGVfb251X3BvcnRfbWFjX29wZXJhdGlvbl9wYWNrKHRoaXMtPnUub251X3BvcnRfbWFjX3N0YXRpYy5vcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9wb3J0X21hY19zdGF0aWMubnVtYmVyX29mX2VudHJpZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5vbnVfcG9ydF9tYWNfc3RhdGljLm51bWJlcl9vZl9lbnRyaWVzID4gMCkgJiYgKHRoaXMtPnUub251X3BvcnRfbWFjX3N0YXRpYy5jbGF1c2UgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY2xhdXNlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfb251X3BvcnRfbWFjX3N0YXRpY1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk2ID0gMDsgaTYgPCB0aGlzLT51Lm9udV9wb3J0X21hY19zdGF0aWMubnVtYmVyX29mX2VudHJpZXM7IGk2KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV96dGVfdmxhbl9tYWNfcGFjaygmdGhpcy0+dS5vbnVfcG9ydF9tYWNfc3RhdGljLmNsYXVzZVtpNl0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BFUkZPUk1BTkNFX1NUQVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9wZXJmb3JtYW5jZV9zdGF0LndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9wZXJmb3JtYW5jZV9zdGF0LndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUub251X3BlcmZvcm1hbmNlX3N0YXQuaWZpbm9jdGV0cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUub251X3BlcmZvcm1hbmNlX3N0YXQuaWZpbnVjYXN0cGt0cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUub251X3BlcmZvcm1hbmNlX3N0YXQuaWZpbm51Y2FzdHBrdHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9wZXJmb3JtYW5jZV9zdGF0LmlmaW5kaXNjYXJkcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUub251X3BlcmZvcm1hbmNlX3N0YXQuaWZpbmVycm9ycykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUub251X3BlcmZvcm1hbmNlX3N0YXQuaWZvdXRvY3RldHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9wZXJmb3JtYW5jZV9zdGF0Lmlmb3V0dWNhc3Rwa3RzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfcGVyZm9ybWFuY2Vfc3RhdC5pZm91dG51Y2FzdHBrdHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9wZXJmb3JtYW5jZV9zdGF0Lmlmb3V0ZGlzY2FyZHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9wZXJmb3JtYW5jZV9zdGF0Lmlmb3V0ZXJyb3JzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfcGVyZm9ybWFuY2Vfc3RhdC5yZXNlcnZlZDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9wZXJmb3JtYW5jZV9zdGF0LnJlc2VydmVkMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUub251X3BlcmZvcm1hbmNlX3N0YXQucmVzZXJ2ZWQzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfcGVyZm9ybWFuY2Vfc3RhdC5yZXNlcnZlZDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPUlRfSVNPTEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9wb3J0X2lzb2xhdGUud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3p0ZV9pc29sYXRlX21vZGVfcGFjayh0aGlzLT51Lm9udV9wb3J0X2lzb2xhdGUucG9ydF9pc29sYXRlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9NQUNfQUREUkVTU19UQUJMRV9RVUVSWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub251X21hY19hZGRyZXNzX3RhYmxlX3F1ZXJ5LndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9tYWNfYWRkcmVzc190YWJsZV9xdWVyeS53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPTl9NQUNfRE9XTlNUUkVBTV9TSEFQSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vbnVfcG9uX21hY19kb3duc3RyZWFtX3NoYXBpbmcud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X3Bvbl9tYWNfZG93bnN0cmVhbV9zaGFwaW5nLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT51Lm9udV9wb25fbWFjX2Rvd25zdHJlYW1fc2hhcGluZy5wb25tYWNkc3JhdGVsaW1pdGluZ2VuYWJsZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UyNChidWYsIHRoaXMtPnUub251X3Bvbl9tYWNfZG93bnN0cmVhbV9zaGFwaW5nLmNpcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UyNChidWYsIHRoaXMtPnUub251X3Bvbl9tYWNfZG93bnN0cmVhbV9zaGFwaW5nLmNicykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9OX01BQ19VU0RTQlVGRkVSX0NBUEFCSUxJVFlfUVVFUlk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9wb25fbWFjX3VzZHNidWZmZXJfY2FwYWJpbGl0eV9xdWVyeS53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfcG9uX21hY191c2RzYnVmZmVyX2NhcGFiaWxpdHlfcXVlcnkud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV96dGVfYnVmZmVyX21hbmFnZV9tb2RlX3BhY2sodGhpcy0+dS5vbnVfcG9uX21hY191c2RzYnVmZmVyX2NhcGFiaWxpdHlfcXVlcnkuYnVmZmVyX21hbmFnZW1lbnRfY2FwYWJpbGl0eSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTI0KGJ1ZiwgdGhpcy0+dS5vbnVfcG9uX21hY191c2RzYnVmZmVyX2NhcGFiaWxpdHlfcXVlcnkuZHNidWZmZXJfc2l6ZV9taW5pbXVtX3ZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTI0KGJ1ZiwgdGhpcy0+dS5vbnVfcG9uX21hY191c2RzYnVmZmVyX2NhcGFiaWxpdHlfcXVlcnkuZHNidWZmZXJfc2l6ZV9tYXhpbXVtX3ZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTI0KGJ1ZiwgdGhpcy0+dS5vbnVfcG9uX21hY191c2RzYnVmZmVyX2NhcGFiaWxpdHlfcXVlcnkudXNidWZmZXJfc2l6ZV9taW5pbXVtX3ZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTI0KGJ1ZiwgdGhpcy0+dS5vbnVfcG9uX21hY191c2RzYnVmZmVyX2NhcGFiaWxpdHlfcXVlcnkudXNidWZmZXJfc2l6ZV9tYXhpbXVtX3ZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT05fTUFDX1VTRFNCVUZGRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9wb25fbWFjX3VzZHNidWZmZXIud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X3Bvbl9tYWNfdXNkc2J1ZmZlci53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS5vbnVfcG9uX21hY191c2RzYnVmZmVyLmJ1ZmZlcl9tYW5hZ2VtZW50X2luZGljYXRpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3p0ZV9kc2J1Zl9kaXJlY3Rpb25fcGFjayh0aGlzLT51Lm9udV9wb25fbWFjX3VzZHNidWZmZXIuZGlyZWN0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MjQoYnVmLCB0aGlzLT51Lm9udV9wb25fbWFjX3VzZHNidWZmZXIuYnVmZmVyX3NpemUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPUlRfU1RBVElTVElDU19DT0xMRUNUX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9wb3J0X3N0YXRpc3RpY3NfY29sbGVjdF9jb250cm9sLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9wb3J0X3N0YXRpc3RpY3NfY29sbGVjdF9jb250cm9sLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fenRlX3N0YXRpc3RpY3NfYWN0aW9uX21vZGVfcGFjayh0aGlzLT51Lm9udV9wb3J0X3N0YXRpc3RpY3NfY29sbGVjdF9jb250cm9sLnN0YXRpc3RpY3NfYWN0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MjQoYnVmLCB0aGlzLT51Lm9udV9wb3J0X3N0YXRpc3RpY3NfY29sbGVjdF9jb250cm9sLnN0YXRpc3RpY3NfaW50ZXJ2YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51Lm9udV9wb3J0X3N0YXRpc3RpY3NfY29sbGVjdF9jb250cm9sLnN0YXRpc3RpY3NfZHVyYXRpb25fdGltZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9SVF9TVEFUSVNUSUNTX0NPVU5URVJfUkVTRVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9wb3J0X3N0YXRpc3RpY3NfY291bnRlcl9yZXNldC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfcG9ydF9zdGF0aXN0aWNzX2NvdW50ZXJfcmVzZXQud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV96dGVfc3RhdGlzdGljc19yZXNldF9tb2RlX3BhY2sodGhpcy0+dS5vbnVfcG9ydF9zdGF0aXN0aWNzX2NvdW50ZXJfcmVzZXQuc3RhdGlzdGljc19yZXNldCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT1JUX0ZMVVhfU1RBVElTVElDU19DT1VOVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vbnVfcG9ydF9mbHV4X3N0YXRpc3RpY3NfY291bnRlci53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfcG9ydF9mbHV4X3N0YXRpc3RpY3NfY291bnRlci53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3VuaV9mbG93X3N0YXRpc3RpY3NfY29sbGVjdF9jb250cm9sX21vZGVfcGFjayh0aGlzLT51Lm9udV9wb3J0X2ZsdXhfc3RhdGlzdGljc19jb3VudGVyLnVuaWZsb3dzdGF0aXN0aWNzY29sbGVjdGNvbnRyb2xpbmRpY2F0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9wb3J0X2ZsdXhfc3RhdGlzdGljc19jb3VudGVyLmlmaW5vY3RldHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9wb3J0X2ZsdXhfc3RhdGlzdGljc19jb3VudGVyLmlmaW51Y2FzdHBrdHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9wb3J0X2ZsdXhfc3RhdGlzdGljc19jb3VudGVyLmlmaW5udWNhc3Rwa3RzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfcG9ydF9mbHV4X3N0YXRpc3RpY3NfY291bnRlci5pZmluZGlzY2FyZHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9wb3J0X2ZsdXhfc3RhdGlzdGljc19jb3VudGVyLmlmaW5lcnJvcnMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9wb3J0X2ZsdXhfc3RhdGlzdGljc19jb3VudGVyLmlmb3V0b2N0ZXRzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfcG9ydF9mbHV4X3N0YXRpc3RpY3NfY291bnRlci5pZm91dHVjYXN0cGt0cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUub251X3BvcnRfZmx1eF9zdGF0aXN0aWNzX2NvdW50ZXIuaWZvdXRudWNhc3Rwa3RzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfcG9ydF9mbHV4X3N0YXRpc3RpY3NfY291bnRlci5pZm91dGRpc2NhcmRzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfcG9ydF9mbHV4X3N0YXRpc3RpY3NfY291bnRlci5pZm91dGVycm9ycykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfTElHSFRfRVhDRVBUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vbnVfbGlnaHRfZXhjZXB0aW9uLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9saWdodF9leGNlcHRpb24ud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9saWdodF9leGNlcHRpb24ucG9ucG9ydG51bWJlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbGlnaHRfaW5kaWNhdGlvbl9tb2RlX3BhY2sodGhpcy0+dS5vbnVfbGlnaHRfZXhjZXB0aW9uLm1haW5fbGlnaHRfaW5kaWNhdGlvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9saWdodF9pbmRpY2F0aW9uX21vZGVfcGFjayh0aGlzLT51Lm9udV9saWdodF9leGNlcHRpb24ucmVzZXJ2ZV9saWdodF9pbmRpY2F0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX0xJR0hUX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9saWdodF9jb250cm9sLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9saWdodF9jb250cm9sLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbWF0Y2hfbWFjX2FkZHJlc3NfbW9kZV9wYWNrKHRoaXMtPnUub251X2xpZ2h0X2NvbnRyb2wubWF0Y2hfbWFjX2FkZHJlc3MsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5vbnVfbGlnaHRfY29udHJvbC5wb25fbWFjX2FkZHJlc3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3p0ZV9saWdodF9jb250cm9sX2FjdGlvbl9tb2RlX3BhY2sodGhpcy0+dS5vbnVfbGlnaHRfY29udHJvbC5hY3Rpb24sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUub251X2xpZ2h0X2NvbnRyb2wuZHVyYXRpb25fdGltZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9OX1BPUlRfU1RBVElTVElDU19HRVQxOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQxLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDEud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQxLmZyYW1lc190cmFuc21pdHRlZG9rKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQxLm9jdGV0c190cmFuc21pdHRlZG9rKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQxLm11bHRpY2FzdF9mcmFtZXN4bWl0dGVkX29rKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQxLmJyb2FkY2FzdF9mcmFtZXN4bWl0dGVkX29rKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQxLmZyYW1lc19yZWNlaXZlZF9vaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0MS5vY3RldHNfcmVjZWl2ZWRfb2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDEubXVsdGljYXN0X2ZyYW1lc19yZWNlaXZlZF9vaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0MS5icm9hZGNhc3RfZnJhbWVzX3JlY2VpdmVkX29rKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT05fUE9SVF9TVEFUSVNUSUNTX0dFVDI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDIud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0Mi53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDIuY3JjOGVycm9ycykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0Mi5mZWNfY29ycmVjdGVkX2Jsb2NrcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0Mi5mZWNfdW5jb3JyZWN0YWJsZV9ibG9ja3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDIubXBjcF9tYWNfY3RybF9mcmFtZXNfdHJhbnNtaXR0ZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDIubXBjcF9tYWNfY3RybF9mcmFtZXNfcmVjZWl2ZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDIubXBjcF90eF9yZWdpc3RlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0Mi5tcGNwX3R4X3JlZ3JlcXVlc3QpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDIubXBjcF90eF9yZXBvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDIubXBjcF9yeF9nYXRlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQyLm1wY3BfcnhfcmVnaXN0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9BTEFSTV9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmFsYXJtX2NvbmZpZy53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5hbGFybV9jb25maWcud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9hbGFybV9jb25maWdfbW9kZV9wYWNrKHRoaXMtPnUuYWxhcm1fY29uZmlnLmFsYXJtX2NvbmZpZywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1JPVUdVRV9PTlVfRVhDTF9BQklMSVRZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5yb3VndWVfb251X2V4Y2xfYWJpbGl0eS53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5yb3VndWVfb251X2V4Y2xfYWJpbGl0eS53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9leGNsX2FiaWxpdHlfcGFjayh0aGlzLT51LnJvdWd1ZV9vbnVfZXhjbF9hYmlsaXR5LmFiaWxpdHksIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9XRVJfU0FWSU5HX0NBUEFCSUxJVElFUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub251X3Bvd2VyX3NhdmluZ19jYXBhYmlsaXRpZXMud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X3Bvd2VyX3NhdmluZ19jYXBhYmlsaXRpZXMud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NsZWVwX21vZGVfcGFjayh0aGlzLT51Lm9udV9wb3dlcl9zYXZpbmdfY2FwYWJpbGl0aWVzLnNsZWVwX21vZGVfY2FwYWJpbGl0eSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2Vhcmx5X3dha2VfY2FwYWJpbGl0eV9wYWNrKHRoaXMtPnUub251X3Bvd2VyX3NhdmluZ19jYXBhYmlsaXRpZXMuZWFybHlfd2FrZV91cF9jYXBhYmlsaXR5LCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPV0VSX1NBVklOR19DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9wb3dlcl9zYXZpbmdfY29uZmlnLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9wb3dlcl9zYXZpbmdfY29uZmlnLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2Vhcmx5X3dha2VfdXBfbW9kZV9wYWNrKHRoaXMtPnUub251X3Bvd2VyX3NhdmluZ19jb25maWcuZWFybHlfd2FrZV91cCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51Lm9udV9wb3dlcl9zYXZpbmdfY29uZmlnLnNsZWVwX2R1cmF0aW9uX21heCwgNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUFJPVEVDVElPTl9QQVJBTUVURVJTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vbnVfcHJvdGVjdGlvbl9wYXJhbWV0ZXJzLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9wcm90ZWN0aW9uX3BhcmFtZXRlcnMud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5vbnVfcHJvdGVjdGlvbl9wYXJhbWV0ZXJzLm9wdGljYWxfbG9zX3RpbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lm9udV9wcm90ZWN0aW9uX3BhcmFtZXRlcnMubWFjX2xvc190aW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1BPUlRfRElTQUJMRV9PTl9MT09QX0RFVEVDVEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5wb3J0X2Rpc2FibGVfb25fbG9vcF9kZXRlY3RlZC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5wb3J0X2Rpc2FibGVfb25fbG9vcF9kZXRlY3RlZC53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19wb3J0X2Rpc2FibGVfb25fbG9vcF9kZXRlY3RlZF9zdGF0ZV9wYWNrKHRoaXMtPnUucG9ydF9kaXNhYmxlX29uX2xvb3BfZGV0ZWN0ZWQuc3RhdGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9NQUNfQUdJTkdfVElNRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUubWFjX2FnaW5nX3RpbWUud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUubWFjX2FnaW5nX3RpbWUud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5tYWNfYWdpbmdfdGltZS5hZ2luZ190aW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1BFUkZPUk1BTkNFX01PTklUT1JJTkdfU1RBVFVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX3N0YXR1cy53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX3N0YXR1cy53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19tb25pdG9yaW5nX3N0YXR1c19wYWNrKHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19zdGF0dXMubW9uaXRvcmluZ19zdGF0dXMsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19zdGF0dXMubW9uaXRvcmluZ19wZXJpb2QpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUEVSRk9STUFOQ0VfTU9OSVRPUklOR19DVVJSRU5UX0RBVEE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfY3VycmVudF9kYXRhLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfY3VycmVudF9kYXRhLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19jdXJyZW50X2RhdGEuc3RhdHNfZmllbGQxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2N1cnJlbnRfZGF0YS5zdGF0c19maWVsZDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfY3VycmVudF9kYXRhLnN0YXRzX2ZpZWxkMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19jdXJyZW50X2RhdGEuc3RhdHNfZmllbGQ0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2N1cnJlbnRfZGF0YS5zdGF0c19maWVsZDUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfY3VycmVudF9kYXRhLnN0YXRzX2ZpZWxkNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19jdXJyZW50X2RhdGEuc3RhdHNfZmllbGQ3KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2N1cnJlbnRfZGF0YS5zdGF0c19maWVsZDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfY3VycmVudF9kYXRhLnN0YXRzX2ZpZWxkOSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19jdXJyZW50X2RhdGEuc3RhdHNfZmllbGQxMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19jdXJyZW50X2RhdGEuc3RhdHNfZmllbGQxMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19jdXJyZW50X2RhdGEuc3RhdHNfZmllbGQxMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19jdXJyZW50X2RhdGEuc3RhdHNfZmllbGQxMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19jdXJyZW50X2RhdGEuc3RhdHNfZmllbGQxNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19jdXJyZW50X2RhdGEuc3RhdHNfZmllbGQxNSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19jdXJyZW50X2RhdGEuc3RhdHNfZmllbGQxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9QRVJGT1JNQU5DRV9NT05JVE9SSU5HX0hJU1RPUllfREFUQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19oaXN0b3J5X2RhdGEud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19oaXN0b3J5X2RhdGEud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS5zdGF0c19maWVsZDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfaGlzdG9yeV9kYXRhLnN0YXRzX2ZpZWxkMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19oaXN0b3J5X2RhdGEuc3RhdHNfZmllbGQzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS5zdGF0c19maWVsZDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfaGlzdG9yeV9kYXRhLnN0YXRzX2ZpZWxkNSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19oaXN0b3J5X2RhdGEuc3RhdHNfZmllbGQ2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS5zdGF0c19maWVsZDcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfaGlzdG9yeV9kYXRhLnN0YXRzX2ZpZWxkOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19oaXN0b3J5X2RhdGEuc3RhdHNfZmllbGQ5KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS5zdGF0c19maWVsZDEwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS5zdGF0c19maWVsZDExKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS5zdGF0c19maWVsZDEyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS5zdGF0c19maWVsZDEzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS5zdGF0c19maWVsZDE0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS5zdGF0c19maWVsZDE1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS5zdGF0c19maWVsZDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9UWF9QT1dFUl9TVVBQTFlfQ09OVFJPTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUub251X3R4X3Bvd2VyX3N1cHBseV9jb250cm9sLmFjdGlvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5vbnVfdHhfcG93ZXJfc3VwcGx5X2NvbnRyb2wub251X2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5vbnVfdHhfcG93ZXJfc3VwcGx5X2NvbnRyb2wub3B0X2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuZGVmLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmRlZi53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5kZWYudW5rbm93bl9jb3VudCA+IDApICYmICh0aGlzLT51LmRlZi51bmtub3duID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVua25vd25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9kZWZcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5kZWYudW5rbm93biwgdGhpcy0+dS5kZWYudW5rbm93bl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2F0dHJpYnV0ZV92YWx1ZV9iYXNlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMjsKKyAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1BQUE9fRVRFU1RfUkVTVUxUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9QUFBPX0VURVNUX0NPTkZJR1VSQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyB0aGlzLT51LmVuZC51bmtub3duX2NvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1NFUklBTF9OVU1CRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNTU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9GSVJNV0FSRV9WRVJTSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyB0aGlzLT51LmZpcm13YXJlX3ZlcnNpb24uZmlybXdhcmVfdmVyc2lvbl9jb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0NISVBTRVRfSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gOTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9DQVBBQklMSVRJRVMxOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT1BUSUNBTF9UUkFOU0NFSVZFUl9ESUFHTk9TSVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9TRVJWSUNFX1NMQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5zZXJ2aWNlX3NsYS5zZXJ2aWNlX3NsYSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfQ0FQQUJJTElUSUVTMjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxMSArICg2ICogdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMi5pbnRlcmZhY2VzX2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0hPTERPVkVSX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfTVhVX01BTkFHRV9HTE9CQUxfUEFSQU1FVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X2dsb2JhbF9wYXJhbXNfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5teHVfbWFuYWdlX2dsb2JhbF9wYXJhbWV0ZXIucGFyYW1zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX01YVV9NQU5BR0VfU05NUF9QQVJBTUVURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfc25tcF9wYXJhbXNfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5teHVfbWFuYWdlX3NubXBfcGFyYW1ldGVyLnBhcmFtcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9BQ1RJVkVfUE9OX0lGQURNSU46CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9DQVBBQklMSVRJRVMzOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9FVEhfTElOS19TVEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRVRIX1BPUlRfUEFVU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0VUSF9QT1JUX1BPTElDSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyBiY21vbHRfZXBvbl9vYW1fY3RjX2V0aF9wb3J0X3BvbGljaW5nX2NvbmZpZ19iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmV0aF9wb3J0X3BvbGljaW5nLmNvbmZpZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9WT0lQX1BPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0UxUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRVRIX1BPUlRfRE9XTl9SQVRFX0xJTUlUSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9QT1JUX0xPT1BfREVURUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9WTEFOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnZsYW4udmxhbl9pbmZvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0NMQVNTSUZJQ0FUSU9OX0FORF9NQVJLSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgIGNvdW50ICs9IDM7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmNsYXNzaWZpY2F0aW9uX2FuZF9tYXJraW5nLnJ1bGVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuY2xhc3NpZmljYXRpb25fYW5kX21hcmtpbmcucnVsZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicnVsZXNfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUuY2xhc3NpZmljYXRpb25fYW5kX21hcmtpbmcucnVsZXNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGVfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuY2xhc3NpZmljYXRpb25fYW5kX21hcmtpbmcucnVsZXNbaTBdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9NVUxUSUNBU1RfVkxBTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9wcm92X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51Lm11bHRpY2FzdF92bGFuLnZsYW5faW5mbyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9NVUxUSUNBU1RfVEFHX09QRVJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfdGFnX29wZXJhdGlvbl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51Lm11bHRpY2FzdF90YWdfb3BlcmF0aW9uLnRhZ19vcGVyYXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfTVVMVElDQVNUX1NXSVRDSDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfTVVMVElDQVNUX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMSArIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUubXVsdGljYXN0X2NvbnRyb2wudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfR1JPVVBfTUFYOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9GQVNUX0xFQVZFX0FCSUxJVFk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNSArICg0ICogdGhpcy0+dS5mYXN0X2xlYXZlX2FiaWxpdHkuZmFzdF9sZWF2ZV9tb2Rlc19jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9GQVNUX0xFQVZFX0FETUlOX1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9MTElEX1FVRVVFX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyICsgKDQgKiB0aGlzLT51LmxsaWRfcXVldWVfY29uZmlnLmxsaWRfcXVldWVfdGFibGVfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSUFEX0lORk9STUFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDczOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfVk9JUF9HTE9CQUxfUEFSQU1FVEVSUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA4NTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0gyNDhQQVJBTUVURVJTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDg1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSDI0OFVTRVJfVElEX0lORk9STUFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDMzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSDI0OFJUUF9USURfQ09ORklHVVJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0gyNDhSVFBfVElEX0lORk9STUFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDM0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfU0lQX1BBUkFNRVRFUlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNDY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9TSVBfVVNFUl9QQVJBTUVURVJTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDY1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRkFYX01PREVNX0NPTkZJR1VSQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0gyNDhJQURfT1BFUkFUSU9OX1NUQVRVUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUE9UU19TVEFUVVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9JQURfT1BFUkFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9TSVBfRElHSVRfTUFQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDMgKyB0aGlzLT51LnNpcF9kaWdpdF9tYXAuc2lwX2RpZ2l0YWxfbWFwX2NvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfQUxBUk1fQURNSU5fU1RBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0FMQVJNX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1ZFUlNJT05fU0VSVkVSX1BBUkE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gODE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfTUFDX0xJTUlUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfTUFDX0FHSU5HX1RJTUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT1JUX01BQ19GSUxURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMyArICg4ICogdGhpcy0+dS5vbnVfcG9ydF9tYWNfZmlsdGVyLm51bWJlcl9vZl9lbnRyaWVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT1JUX01BQ19CSU5ESU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDMgKyAoOCAqIHRoaXMtPnUub251X3BvcnRfbWFjX2JpbmRpbmcubnVtYmVyX29mX2VudHJpZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPUlRfTUFDX1NUQVRJQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzICsgKDggKiB0aGlzLT51Lm9udV9wb3J0X21hY19zdGF0aWMubnVtYmVyX29mX2VudHJpZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BFUkZPUk1BTkNFX1NUQVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTEzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPUlRfSVNPTEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX01BQ19BRERSRVNTX1RBQkxFX1FVRVJZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9OX01BQ19ET1dOU1RSRUFNX1NIQVBJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT05fTUFDX1VTRFNCVUZGRVJfQ0FQQUJJTElUWV9RVUVSWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT05fTUFDX1VTRFNCVUZGRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT1JUX1NUQVRJU1RJQ1NfQ09MTEVDVF9DT05UUk9MOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9SVF9TVEFUSVNUSUNTX0NPVU5URVJfUkVTRVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT1JUX0ZMVVhfU1RBVElTVElDU19DT1VOVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDgyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX0xJR0hUX0VYQ0VQVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX0xJR0hUX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9OX1BPUlRfU1RBVElTVElDU19HRVQxOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDY1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPTl9QT1JUX1NUQVRJU1RJQ1NfR0VUMjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA4MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0FMQVJNX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUk9VR1VFX09OVV9FWENMX0FCSUxJVFk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT1dFUl9TQVZJTkdfQ0FQQUJJTElUSUVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9XRVJfU0FWSU5HX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BST1RFQ1RJT05fUEFSQU1FVEVSUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUE9SVF9ESVNBQkxFX09OX0xPT1BfREVURUNURUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX01BQ19BR0lOR19USU1FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9QRVJGT1JNQU5DRV9NT05JVE9SSU5HX1NUQVRVUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUEVSRk9STUFOQ0VfTU9OSVRPUklOR19DVVJSRU5UX0RBVEE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTI5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUEVSRk9STUFOQ0VfTU9OSVRPUklOR19ISVNUT1JZX0RBVEE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTI5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1RYX1BPV0VSX1NVUFBMWV9DT05UUk9MOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMSArIHRoaXMtPnUuZGVmLnVua25vd25fY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2F0dHJpYnV0ZV92YWx1ZV9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hdHRyaWJ1dGVfdW5wYWNrKCZ0aGlzLT5sZWFmLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+bGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUFBQT19FVEVTVF9SRVNVTFQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUucHBwb19ldGVzdF9yZXN1bHQud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnBwcG9fZXRlc3RfcmVzdWx0LndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUucHBwb19ldGVzdF9yZXN1bHQud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LnBwcG9fZXRlc3RfcmVzdWx0LndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3BwcG9fZXRlc3Rfc3RhdHVzX3VucGFjaygmdGhpcy0+dS5wcHBvX2V0ZXN0X3Jlc3VsdC5zdGF0dXMsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9wcHBvX2V0ZXN0X2ZhaWxfcmVhc29uX3VucGFjaygmdGhpcy0+dS5wcHBvX2V0ZXN0X3Jlc3VsdC5yZWFzb24sICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LnBwcG9fZXRlc3RfcmVzdWx0LndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5wcHBvX2V0ZXN0X3Jlc3VsdC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUFBQT19FVEVTVF9DT05GSUdVUkFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnBwcG9fZXRlc3RfY29uZmlndXJhdGlvbi53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUucHBwb19ldGVzdF9jb25maWd1cmF0aW9uLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUucHBwb19ldGVzdF9jb25maWd1cmF0aW9uLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5wcHBvX2V0ZXN0X2NvbmZpZ3VyYXRpb24ud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fc3RhcnRfb3Jfc3RvcF9pbmRpY2F0aW9uX3VucGFjaygmdGhpcy0+dS5wcHBvX2V0ZXN0X2NvbmZpZ3VyYXRpb24uc3RhcnRfb3Jfc3RvcCwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LnBwcG9fZXRlc3RfY29uZmlndXJhdGlvbi51c2VyX25hbWUsIDY0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5wcHBvX2V0ZXN0X2NvbmZpZ3VyYXRpb24ucGFzc3dvcmQsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9wcHBvX2VhdXRoX21vZGVfdW5wYWNrKCZ0aGlzLT51LnBwcG9fZXRlc3RfY29uZmlndXJhdGlvbi5tb2RlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wcHBvX2V0ZXN0X2NvbmZpZ3VyYXRpb24udmxhbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5wcHBvX2V0ZXN0X2NvbmZpZ3VyYXRpb24ud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LnBwcG9fZXRlc3RfY29uZmlndXJhdGlvbi53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmVuZC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuZW5kLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUuZW5kLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5lbmQud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2VuZF9jb3VudF91bmtub3duKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5lbmQudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVua25vd25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9lbmRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5lbmQudW5rbm93biA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmVuZC51bmtub3duX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LmVuZC51bmtub3duLCB0aGlzLT51LmVuZC51bmtub3duX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LmVuZC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuZW5kLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfU0VSSUFMX05VTUJFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5vbnVfc2VyaWFsX251bWJlci53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub251X3NlcmlhbF9udW1iZXIud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5vbnVfc2VyaWFsX251bWJlci53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUub251X3NlcmlhbF9udW1iZXIud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUub251X3NlcmlhbF9udW1iZXIudmVuZG9yX2lkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9zZXJpYWxfbnVtYmVyLm9udV9tb2RlbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfbWFjX2FkZHJlc3MoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9zZXJpYWxfbnVtYmVyLm9udV9tYWMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51Lm9udV9zZXJpYWxfbnVtYmVyLmh3dmVyc2lvbiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUub251X3NlcmlhbF9udW1iZXIuc3d2ZXJzaW9uLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUub251X3NlcmlhbF9udW1iZXIuZXh0X29udV9tb2RlbCwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUub251X3NlcmlhbF9udW1iZXIud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9zZXJpYWxfbnVtYmVyLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9GSVJNV0FSRV9WRVJTSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmZpcm13YXJlX3ZlcnNpb24ud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmZpcm13YXJlX3ZlcnNpb24ud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5maXJtd2FyZV92ZXJzaW9uLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5maXJtd2FyZV92ZXJzaW9uLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIHRoaXMtPnUuZmlybXdhcmVfdmVyc2lvbi5maXJtd2FyZV92ZXJzaW9uX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfZmlybXdhcmVfdmVyc2lvbl9jb3VudF9maXJtd2FyZV92ZXJzaW9uKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZmlybXdhcmVfdmVyc2lvbi5maXJtd2FyZV92ZXJzaW9uX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZmlybXdhcmVfdmVyc2lvbi5maXJtd2FyZV92ZXJzaW9uID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZmlybXdhcmVfdmVyc2lvblwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2Zpcm13YXJlX3ZlcnNpb25cIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5maXJtd2FyZV92ZXJzaW9uLmZpcm13YXJlX3ZlcnNpb24gPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5maXJtd2FyZV92ZXJzaW9uLmZpcm13YXJlX3ZlcnNpb25fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUuZmlybXdhcmVfdmVyc2lvbi5maXJtd2FyZV92ZXJzaW9uLCB0aGlzLT51LmZpcm13YXJlX3ZlcnNpb24uZmlybXdhcmVfdmVyc2lvbl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5maXJtd2FyZV92ZXJzaW9uLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5maXJtd2FyZV92ZXJzaW9uLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9DSElQU0VUX0lEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmNoaXBzZXRfaWQud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmNoaXBzZXRfaWQud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5jaGlwc2V0X2lkLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5jaGlwc2V0X2lkLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuY2hpcHNldF9pZC52ZW5kb3JfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuY2hpcHNldF9pZC5jaGlwX21vZGVsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuY2hpcHNldF9pZC5yZXZpc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUuY2hpcHNldF9pZC5kZXNpZ25fZGF0ZSwgMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5jaGlwc2V0X2lkLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5jaGlwc2V0X2lkLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfQ0FQQUJJTElUSUVTMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMS53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub251X2NhcGFiaWxpdGllczEud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMS53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUub251X2NhcGFiaWxpdGllczEud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3N1cHBvcnRlZF9zZXJ2aWNlc191bnBhY2soJnRoaXMtPnUub251X2NhcGFiaWxpdGllczEuc2VydmljZXMsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X2NhcGFiaWxpdGllczEubnVtX2dlcG9ydHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X2NhcGFiaWxpdGllczEuZ2ViaXRtYXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMS5udW1fZmVwb3J0cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMS5mZWJpdG1hcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMxLm51bV9wb3RzX3BvcnRzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X2NhcGFiaWxpdGllczEubnVtX2UxcG9ydHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMS5udW1fdXBzdHJlYW1fcXVldWVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X2NhcGFiaWxpdGllczEubWF4X3F1ZXVlc19wZXJfcG9ydF91cCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMxLm51bV9kb3duc3RyZWFtX3F1ZXVlcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMxLm1heF9xdWV1ZXNfcGVyX3BvcnRfZG93bikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMxLmJhdHRlcnlfYmFja3VwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMxLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMS53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT1BUSUNBTF9UUkFOU0NFSVZFUl9ESUFHTk9TSVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUub3B0aWNhbF90cmFuc2NlaXZlcl9kaWFnbm9zaXMud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9wdGljYWxfdHJhbnNjZWl2ZXJfZGlhZ25vc2lzLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUub3B0aWNhbF90cmFuc2NlaXZlcl9kaWFnbm9zaXMud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9wdGljYWxfdHJhbnNjZWl2ZXJfZGlhZ25vc2lzLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub3B0aWNhbF90cmFuc2NlaXZlcl9kaWFnbm9zaXMudHJhbnNjZWl2ZXJfdGVtcGVyYXR1cmUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub3B0aWNhbF90cmFuc2NlaXZlcl9kaWFnbm9zaXMuc3VwcGx5X3ZjYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vcHRpY2FsX3RyYW5zY2VpdmVyX2RpYWdub3Npcy50eF9iaWFzX2N1cikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vcHRpY2FsX3RyYW5zY2VpdmVyX2RpYWdub3Npcy50eF9wb3dlcl9vdXQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub3B0aWNhbF90cmFuc2NlaXZlcl9kaWFnbm9zaXMucnhfcG93ZXJfaW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUub3B0aWNhbF90cmFuc2NlaXZlcl9kaWFnbm9zaXMud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9wdGljYWxfdHJhbnNjZWl2ZXJfZGlhZ25vc2lzLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9TRVJWSUNFX1NMQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5zZXJ2aWNlX3NsYS53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuc2VydmljZV9zbGEud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5zZXJ2aWNlX3NsYS53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuc2VydmljZV9zbGEud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV9iYXNlX3VucGFjaygmdGhpcy0+dS5zZXJ2aWNlX3NsYS5zZXJ2aWNlX3NsYSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5zZXJ2aWNlX3NsYS53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuc2VydmljZV9zbGEud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9DQVBBQklMSVRJRVMyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUub251X2NhcGFiaWxpdGllczIud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMyLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUub251X2NhcGFiaWxpdGllczIud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMyLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfdHlwZV91bnBhY2soJnRoaXMtPnUub251X2NhcGFiaWxpdGllczIub251X3R5cGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X2NhcGFiaWxpdGllczIubnVtX2xpbmtzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X3Byb3RlY3Rpb25fdHlwZV91bnBhY2soJnRoaXMtPnUub251X2NhcGFiaWxpdGllczIucHJvdGVjdGlvbl90eXBlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMyLm51bV9wb25faWZzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X2NhcGFiaWxpdGllczIubnVtX3Nsb3RzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X2NhcGFiaWxpdGllczIuaW50ZXJmYWNlc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMyLmludGVyZmFjZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMi5pbnRlcmZhY2VzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiaW50ZXJmYWNlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2F0dHJpYnV0ZV92YWx1ZV9iYXNlX29udV9jYXBhYmlsaXRpZXMyXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUub251X2NhcGFiaWxpdGllczIuaW50ZXJmYWNlcyA9IChiY21vbHRfZXBvbl9vYW1fY3RjX29udV9pbnRlcmZhY2UgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUub251X2NhcGFiaWxpdGllczIuaW50ZXJmYWNlc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX29udV9pbnRlcmZhY2UpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUub251X2NhcGFiaWxpdGllczIuaW50ZXJmYWNlc19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfaW50ZXJmYWNlX3VucGFjaygmdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMi5pbnRlcmZhY2VzW2kwXSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMyLmJhdHRlcnlfYmFja3VwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMyLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMi53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSE9MRE9WRVJfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmhvbGRvdmVyX2NvbmZpZy53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuaG9sZG92ZXJfY29uZmlnLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUuaG9sZG92ZXJfY29uZmlnLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5ob2xkb3Zlcl9jb25maWcud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2VuYWJsZWRfc3RhdGVfdW5wYWNrKCZ0aGlzLT51LmhvbGRvdmVyX2NvbmZpZy5ob2xkb3Zlcl9zdGF0ZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuaG9sZG92ZXJfY29uZmlnLmhvbGRvdmVyX3RpbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUuaG9sZG92ZXJfY29uZmlnLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5ob2xkb3Zlcl9jb25maWcud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX01YVV9NQU5BR0VfR0xPQkFMX1BBUkFNRVRFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X2dsb2JhbF9wYXJhbXNfYmFzZV91bnBhY2soJnRoaXMtPnUubXh1X21hbmFnZV9nbG9iYWxfcGFyYW1ldGVyLnBhcmFtcywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX01YVV9NQU5BR0VfU05NUF9QQVJBTUVURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX214dV9zbm1wX3BhcmFtc19iYXNlX3VucGFjaygmdGhpcy0+dS5teHVfbWFuYWdlX3NubXBfcGFyYW1ldGVyLnBhcmFtcywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0FDVElWRV9QT05fSUZBRE1JTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5hY3RpdmVfcG9uX2lmYWRtaW4ud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmFjdGl2ZV9wb25faWZhZG1pbi53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LmFjdGl2ZV9wb25faWZhZG1pbi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuYWN0aXZlX3Bvbl9pZmFkbWluLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5hY3RpdmVfcG9uX2lmYWRtaW4ucG9uX251bWJlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5hY3RpdmVfcG9uX2lmYWRtaW4ud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmFjdGl2ZV9wb25faWZhZG1pbi53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX0NBUEFCSUxJVElFUzM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUub251X2NhcGFiaWxpdGllczMud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMzLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUub251X2NhcGFiaWxpdGllczMud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMzLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMzLmlzX2lwdjZhd2FyZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9wb3dlcl9zdXBwbHlfY29udHJvbF90eXBlX3VucGFjaygmdGhpcy0+dS5vbnVfY2FwYWJpbGl0aWVzMy5wb3dlcl9jb250cm9sX3R5cGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X2NhcGFiaWxpdGllczMuc2VydmljZV9zbGEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUub251X2NhcGFiaWxpdGllczMud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9jYXBhYmlsaXRpZXMzLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9FVEhfTElOS19TVEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5ldGhfbGlua19zdGF0ZS53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuZXRoX2xpbmtfc3RhdGUud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5ldGhfbGlua19zdGF0ZS53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuZXRoX2xpbmtfc3RhdGUud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZXRoX2xpbmtfc3RhdGUubGlua19zdGF0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5ldGhfbGlua19zdGF0ZS53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuZXRoX2xpbmtfc3RhdGUud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0VUSF9QT1JUX1BBVVNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmV0aF9wb3J0X3BhdXNlLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5ldGhfcG9ydF9wYXVzZS53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LmV0aF9wb3J0X3BhdXNlLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5ldGhfcG9ydF9wYXVzZS53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5ldGhfcG9ydF9wYXVzZS5lbmFibGVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LmV0aF9wb3J0X3BhdXNlLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5ldGhfcG9ydF9wYXVzZS53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRVRIX1BPUlRfUE9MSUNJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZXRoX3BvcnRfcG9saWNpbmcud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmV0aF9wb3J0X3BvbGljaW5nLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUuZXRoX3BvcnRfcG9saWNpbmcud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmV0aF9wb3J0X3BvbGljaW5nLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19jb25maWdfYmFzZV91bnBhY2soJnRoaXMtPnUuZXRoX3BvcnRfcG9saWNpbmcuY29uZmlnLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LmV0aF9wb3J0X3BvbGljaW5nLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5ldGhfcG9ydF9wb2xpY2luZy53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfVk9JUF9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnZvaXBfcG9ydC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUudm9pcF9wb3J0LndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUudm9pcF9wb3J0LndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS52b2lwX3BvcnQud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudm9pcF9wb3J0LnBvcnRfc3RhdGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUudm9pcF9wb3J0LndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS52b2lwX3BvcnQud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0UxUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5lMXBvcnQud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmUxcG9ydC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LmUxcG9ydC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuZTFwb3J0LndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51LmUxcG9ydC5wb3J0X3N0YXRlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LmUxcG9ydC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuZTFwb3J0LndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9FVEhfUE9SVF9ET1dOX1JBVEVfTElNSVRJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZXRoX3BvcnRfZG93bl9yYXRlX2xpbWl0aW5nLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5ldGhfcG9ydF9kb3duX3JhdGVfbGltaXRpbmcud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5ldGhfcG9ydF9kb3duX3JhdGVfbGltaXRpbmcud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmV0aF9wb3J0X2Rvd25fcmF0ZV9saW1pdGluZy53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5ldGhfcG9ydF9kb3duX3JhdGVfbGltaXRpbmcucmF0ZV9saW1pdGluZ19lbmFibGVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmV0aF9wb3J0X2Rvd25fcmF0ZV9saW1pdGluZy5jaXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UyNCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZXRoX3BvcnRfZG93bl9yYXRlX2xpbWl0aW5nLnBpcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5ldGhfcG9ydF9kb3duX3JhdGVfbGltaXRpbmcud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmV0aF9wb3J0X2Rvd25fcmF0ZV9saW1pdGluZy53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUE9SVF9MT09QX0RFVEVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5wb3J0X2xvb3BfZGV0ZWN0LndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5wb3J0X2xvb3BfZGV0ZWN0LndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUucG9ydF9sb29wX2RldGVjdC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUucG9ydF9sb29wX2RldGVjdC53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZW5hYmxlZF9zdGF0ZV91bnBhY2soJnRoaXMtPnUucG9ydF9sb29wX2RldGVjdC5zdGF0ZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUucG9ydF9sb29wX2RldGVjdC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUucG9ydF9sb29wX2RldGVjdC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfVkxBTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS52bGFuLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS52bGFuLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUudmxhbi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUudmxhbi53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2VfdW5wYWNrKCZ0aGlzLT51LnZsYW4udmxhbl9pbmZvLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LnZsYW4ud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LnZsYW4ud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0NMQVNTSUZJQ0FUSU9OX0FORF9NQVJLSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkxOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuY2xhc3NpZmljYXRpb25fYW5kX21hcmtpbmcud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmNsYXNzaWZpY2F0aW9uX2FuZF9tYXJraW5nLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUuY2xhc3NpZmljYXRpb25fYW5kX21hcmtpbmcud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmNsYXNzaWZpY2F0aW9uX2FuZF9tYXJraW5nLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19jbGFzc2lmaWNhdGlvbl9vcGVyYXRpb25fdW5wYWNrKCZ0aGlzLT51LmNsYXNzaWZpY2F0aW9uX2FuZF9tYXJraW5nLm9wLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmNsYXNzaWZpY2F0aW9uX2FuZF9tYXJraW5nLnJ1bGVzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuY2xhc3NpZmljYXRpb25fYW5kX21hcmtpbmcucnVsZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5jbGFzc2lmaWNhdGlvbl9hbmRfbWFya2luZy5ydWxlcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJ1bGVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfY2xhc3NpZmljYXRpb25fYW5kX21hcmtpbmdcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5jbGFzc2lmaWNhdGlvbl9hbmRfbWFya2luZy5ydWxlcyA9IChiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGUgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuY2xhc3NpZmljYXRpb25fYW5kX21hcmtpbmcucnVsZXNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19ydWxlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LmNsYXNzaWZpY2F0aW9uX2FuZF9tYXJraW5nLnJ1bGVzX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGVfdW5wYWNrKCZ0aGlzLT51LmNsYXNzaWZpY2F0aW9uX2FuZF9tYXJraW5nLnJ1bGVzW2kxXSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUuY2xhc3NpZmljYXRpb25fYW5kX21hcmtpbmcud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmNsYXNzaWZpY2F0aW9uX2FuZF9tYXJraW5nLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9NVUxUSUNBU1RfVkxBTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5tdWx0aWNhc3Rfdmxhbi53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUubXVsdGljYXN0X3ZsYW4ud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5tdWx0aWNhc3Rfdmxhbi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUubXVsdGljYXN0X3ZsYW4ud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX3Byb3ZfdW5wYWNrKCZ0aGlzLT51Lm11bHRpY2FzdF92bGFuLnZsYW5faW5mbywgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5tdWx0aWNhc3Rfdmxhbi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUubXVsdGljYXN0X3ZsYW4ud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX01VTFRJQ0FTVF9UQUdfT1BFUkFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51Lm11bHRpY2FzdF90YWdfb3BlcmF0aW9uLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5tdWx0aWNhc3RfdGFnX29wZXJhdGlvbi53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51Lm11bHRpY2FzdF90YWdfb3BlcmF0aW9uLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5tdWx0aWNhc3RfdGFnX29wZXJhdGlvbi53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19vcGVyYXRpb25fYmFzZV91bnBhY2soJnRoaXMtPnUubXVsdGljYXN0X3RhZ19vcGVyYXRpb24udGFnX29wZXJhdGlvbiwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5tdWx0aWNhc3RfdGFnX29wZXJhdGlvbi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUubXVsdGljYXN0X3RhZ19vcGVyYXRpb24ud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX01VTFRJQ0FTVF9TV0lUQ0g6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUubXVsdGljYXN0X3N3aXRjaC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUubXVsdGljYXN0X3N3aXRjaC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51Lm11bHRpY2FzdF9zd2l0Y2gud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm11bHRpY2FzdF9zd2l0Y2gud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9zd2l0Y2hfbW9kZV91bnBhY2soJnRoaXMtPnUubXVsdGljYXN0X3N3aXRjaC5tb2RlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5tdWx0aWNhc3Rfc3dpdGNoLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5tdWx0aWNhc3Rfc3dpdGNoLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9NVUxUSUNBU1RfQ09OVFJPTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5tdWx0aWNhc3RfY29udHJvbC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUubXVsdGljYXN0X2NvbnRyb2wud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5tdWx0aWNhc3RfY29udHJvbC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUubXVsdGljYXN0X2NvbnRyb2wud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX3VucGFjaygmdGhpcy0+dS5tdWx0aWNhc3RfY29udHJvbC52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5tdWx0aWNhc3RfY29udHJvbC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUubXVsdGljYXN0X2NvbnRyb2wud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0dST1VQX01BWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5ncm91cF9tYXgud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lmdyb3VwX21heC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51Lmdyb3VwX21heC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuZ3JvdXBfbWF4LndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5ncm91cF9tYXgubWF4X2dyb3VwcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5ncm91cF9tYXgud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lmdyb3VwX21heC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRkFTVF9MRUFWRV9BQklMSVRZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmZhc3RfbGVhdmVfYWJpbGl0eS53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuZmFzdF9sZWF2ZV9hYmlsaXR5LndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUuZmFzdF9sZWF2ZV9hYmlsaXR5LndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5mYXN0X2xlYXZlX2FiaWxpdHkud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5mYXN0X2xlYXZlX2FiaWxpdHkuZmFzdF9sZWF2ZV9tb2Rlc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmZhc3RfbGVhdmVfYWJpbGl0eS5mYXN0X2xlYXZlX21vZGVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZmFzdF9sZWF2ZV9hYmlsaXR5LmZhc3RfbGVhdmVfbW9kZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJmYXN0X2xlYXZlX21vZGVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfZmFzdF9sZWF2ZV9hYmlsaXR5XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZmFzdF9sZWF2ZV9hYmlsaXR5LmZhc3RfbGVhdmVfbW9kZXMgPSAodWludDMyX3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZmFzdF9sZWF2ZV9hYmlsaXR5LmZhc3RfbGVhdmVfbW9kZXNfY291bnQgKiBzaXplb2YodWludDMyX3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUuZmFzdF9sZWF2ZV9hYmlsaXR5LmZhc3RfbGVhdmVfbW9kZXNfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmZhc3RfbGVhdmVfYWJpbGl0eS5mYXN0X2xlYXZlX21vZGVzW2kyXSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUuZmFzdF9sZWF2ZV9hYmlsaXR5LndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5mYXN0X2xlYXZlX2FiaWxpdHkud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0ZBU1RfTEVBVkVfQURNSU5fU1RBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZmFzdF9sZWF2ZV9hZG1pbl9zdGF0ZS53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuZmFzdF9sZWF2ZV9hZG1pbl9zdGF0ZS53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LmZhc3RfbGVhdmVfYWRtaW5fc3RhdGUud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmZhc3RfbGVhdmVfYWRtaW5fc3RhdGUud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2VuYWJsZWRfc3RhdGVfdW5wYWNrKCZ0aGlzLT51LmZhc3RfbGVhdmVfYWRtaW5fc3RhdGUuc3RhdGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LmZhc3RfbGVhdmVfYWRtaW5fc3RhdGUud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmZhc3RfbGVhdmVfYWRtaW5fc3RhdGUud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0xMSURfUVVFVUVfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkzOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUubGxpZF9xdWV1ZV9jb25maWcud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmxsaWRfcXVldWVfY29uZmlnLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUubGxpZF9xdWV1ZV9jb25maWcud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmxsaWRfcXVldWVfY29uZmlnLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5sbGlkX3F1ZXVlX2NvbmZpZy5sbGlkX3F1ZXVlX3RhYmxlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUubGxpZF9xdWV1ZV9jb25maWcubGxpZF9xdWV1ZV90YWJsZV9jb3VudCA+IDApICYmICh0aGlzLT51LmxsaWRfcXVldWVfY29uZmlnLmxsaWRfcXVldWVfdGFibGUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJsbGlkX3F1ZXVlX3RhYmxlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfbGxpZF9xdWV1ZV9jb25maWdcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5sbGlkX3F1ZXVlX2NvbmZpZy5sbGlkX3F1ZXVlX3RhYmxlID0gKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2xsaWRfcXVldWUgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUubGxpZF9xdWV1ZV9jb25maWcubGxpZF9xdWV1ZV90YWJsZV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX29udV9sbGlkX3F1ZXVlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkzID0gMDsgaTMgPCB0aGlzLT51LmxsaWRfcXVldWVfY29uZmlnLmxsaWRfcXVldWVfdGFibGVfY291bnQ7IGkzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2xsaWRfcXVldWVfdW5wYWNrKCZ0aGlzLT51LmxsaWRfcXVldWVfY29uZmlnLmxsaWRfcXVldWVfdGFibGVbaTNdLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5sbGlkX3F1ZXVlX2NvbmZpZy53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUubGxpZF9xdWV1ZV9jb25maWcud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0lBRF9JTkZPUk1BVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5pYWRfaW5mb3JtYXRpb24ud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmlhZF9pbmZvcm1hdGlvbi53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LmlhZF9pbmZvcm1hdGlvbi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuaWFkX2luZm9ybWF0aW9uLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX21hY19hZGRyZXNzKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5pYWRfaW5mb3JtYXRpb24uaWFkX21hYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaXBfcHJvdG9jb2xfdW5wYWNrKCZ0aGlzLT51LmlhZF9pbmZvcm1hdGlvbi5wcm90b2NvbF9zdXBwb3J0LCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUuaWFkX2luZm9ybWF0aW9uLmlhZF9zb2Z0d2FyZV92ZXIsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5pYWRfaW5mb3JtYXRpb24uaWFkX3NvZnR3YXJlX3RpbWUsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuaWFkX2luZm9ybWF0aW9uLnZvaXBfdXNlcl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5pYWRfaW5mb3JtYXRpb24ud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmlhZF9pbmZvcm1hdGlvbi53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfVk9JUF9HTE9CQUxfUEFSQU1FVEVSUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS52b2lwX2dsb2JhbF9wYXJhbWV0ZXJzLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS52b2lwX2dsb2JhbF9wYXJhbWV0ZXJzLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUudm9pcF9nbG9iYWxfcGFyYW1ldGVycy53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUudm9pcF9nbG9iYWxfcGFyYW1ldGVycy53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfaXBtb2RlX3VucGFjaygmdGhpcy0+dS52b2lwX2dsb2JhbF9wYXJhbWV0ZXJzLnZvaWNlX2lwbW9kZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2lwdjRfYWRkcmVzcygmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudm9pcF9nbG9iYWxfcGFyYW1ldGVycy5pYWRfaXBhZGRyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9pcHY0X2FkZHJlc3MoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnZvaXBfZ2xvYmFsX3BhcmFtZXRlcnMuaWFkX25ldF9tYXNrKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9pcHY0X2FkZHJlc3MoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnZvaXBfZ2xvYmFsX3BhcmFtZXRlcnMuaWFkX2RlZmF1bHRfZ3cpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19wcHBvZV9tb2RlX3VucGFjaygmdGhpcy0+dS52b2lwX2dsb2JhbF9wYXJhbWV0ZXJzLnBwcG9lX21vZGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS52b2lwX2dsb2JhbF9wYXJhbWV0ZXJzLnBwcG9lX3VzZXJuYW1lLCAzMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUudm9pcF9nbG9iYWxfcGFyYW1ldGVycy5wcHBvZV9wYXNzd29yZCwgMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV90YWdnaW5nX21vZGVfdW5wYWNrKCZ0aGlzLT51LnZvaXBfZ2xvYmFsX3BhcmFtZXRlcnMudGFnZ2luZ19tb2RlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS52b2lwX2dsb2JhbF9wYXJhbWV0ZXJzLnZvaWNlX2N2bGFuKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnZvaXBfZ2xvYmFsX3BhcmFtZXRlcnMudm9pY2Vfc3ZsYW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS52b2lwX2dsb2JhbF9wYXJhbWV0ZXJzLnZvaWNlX3ByaSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS52b2lwX2dsb2JhbF9wYXJhbWV0ZXJzLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS52b2lwX2dsb2JhbF9wYXJhbWV0ZXJzLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9IMjQ4UEFSQU1FVEVSUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5oMjQ4cGFyYW1ldGVycy53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuaDI0OHBhcmFtZXRlcnMud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5oMjQ4cGFyYW1ldGVycy53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuaDI0OHBhcmFtZXRlcnMud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5oMjQ4cGFyYW1ldGVycy5tZ3BvcnRfbnVtYmVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9pcHY0X2FkZHJlc3MoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmgyNDhwYXJhbWV0ZXJzLm1nY19pcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5oMjQ4cGFyYW1ldGVycy5tZ2NfY29tX3BvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2lwdjRfYWRkcmVzcygmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuaDI0OHBhcmFtZXRlcnMuYmFja3VwX21nY19pcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5oMjQ4cGFyYW1ldGVycy5iYWNrdXBfbWdjX2NvbV9wb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5oMjQ4cGFyYW1ldGVycy51c2VfYWN0aXZlX21nYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2gyNDhyZWdfbW9kZV91bnBhY2soJnRoaXMtPnUuaDI0OHBhcmFtZXRlcnMucmVnX21vZGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5oMjQ4cGFyYW1ldGVycy5taWQsIDY0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfaDI0OGhlYXJ0YmVhdF9tb2RlX3VucGFjaygmdGhpcy0+dS5oMjQ4cGFyYW1ldGVycy5oZWFydGJlYXRfbW9kZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuaDI0OHBhcmFtZXRlcnMuaGVhcnRiZWF0X2N5Y2xlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuaDI0OHBhcmFtZXRlcnMuaGVhcnRiZWF0X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LmgyNDhwYXJhbWV0ZXJzLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5oMjQ4cGFyYW1ldGVycy53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSDI0OFVTRVJfVElEX0lORk9STUFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmgyNDh1c2VyX3RpZF9pbmZvcm1hdGlvbi53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuaDI0OHVzZXJfdGlkX2luZm9ybWF0aW9uLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUuaDI0OHVzZXJfdGlkX2luZm9ybWF0aW9uLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5oMjQ4dXNlcl90aWRfaW5mb3JtYXRpb24ud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUuaDI0OHVzZXJfdGlkX2luZm9ybWF0aW9uLm5hbWUsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LmgyNDh1c2VyX3RpZF9pbmZvcm1hdGlvbi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuaDI0OHVzZXJfdGlkX2luZm9ybWF0aW9uLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9IMjQ4UlRQX1RJRF9DT05GSUdVUkFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmgyNDhydHBfdGlkX2NvbmZpZ3VyYXRpb24ud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmgyNDhydHBfdGlkX2NvbmZpZ3VyYXRpb24ud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5oMjQ4cnRwX3RpZF9jb25maWd1cmF0aW9uLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5oMjQ4cnRwX3RpZF9jb25maWd1cmF0aW9uLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5oMjQ4cnRwX3RpZF9jb25maWd1cmF0aW9uLm51bV9ydHBfdGlkcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUuaDI0OHJ0cF90aWRfY29uZmlndXJhdGlvbi5wcmVmaXgsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmgyNDhydHBfdGlkX2NvbmZpZ3VyYXRpb24uZGlnaXRfYmVnaW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19ydHBfdGlkX21vZGVfdW5wYWNrKCZ0aGlzLT51LmgyNDhydHBfdGlkX2NvbmZpZ3VyYXRpb24ucnRwX3RpZF9tb2RlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmgyNDhydHBfdGlkX2NvbmZpZ3VyYXRpb24ucnRwX3RpZF9sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUuaDI0OHJ0cF90aWRfY29uZmlndXJhdGlvbi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuaDI0OHJ0cF90aWRfY29uZmlndXJhdGlvbi53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSDI0OFJUUF9USURfSU5GT1JNQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuaDI0OHJ0cF90aWRfaW5mb3JtYXRpb24ud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmgyNDhydHBfdGlkX2luZm9ybWF0aW9uLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUuaDI0OHJ0cF90aWRfaW5mb3JtYXRpb24ud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmgyNDhydHBfdGlkX2luZm9ybWF0aW9uLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5oMjQ4cnRwX3RpZF9pbmZvcm1hdGlvbi5udW1fcnRwX3RpZHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LmgyNDhydHBfdGlkX2luZm9ybWF0aW9uLmZpcnN0X3J0cF90aWRfbmFtZSwgMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUuaDI0OHJ0cF90aWRfaW5mb3JtYXRpb24ud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmgyNDhydHBfdGlkX2luZm9ybWF0aW9uLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9TSVBfUEFSQU1FVEVSUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5zaXBfcGFyYW1ldGVycy53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuc2lwX3BhcmFtZXRlcnMud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5zaXBfcGFyYW1ldGVycy53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuc2lwX3BhcmFtZXRlcnMud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zaXBfcGFyYW1ldGVycy5tZ3BvcnRfbnVtYmVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9pcHY0X2FkZHJlc3MoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnNpcF9wYXJhbWV0ZXJzLmFjdGl2ZV9zaXBfaXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc2lwX3BhcmFtZXRlcnMuYWN0aXZlX3NpcF9jb21fcG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfaXB2NF9hZGRyZXNzKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zaXBfcGFyYW1ldGVycy5iYWNrdXBfc2lwX2lwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnNpcF9wYXJhbWV0ZXJzLmJhY2t1cF9zaXBfY29tX3BvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2lwdjRfYWRkcmVzcygmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc2lwX3BhcmFtZXRlcnMuYWN0aXZlX3NpcF9wcm94eV9zZXJ2ZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2lwdjRfYWRkcmVzcygmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc2lwX3BhcmFtZXRlcnMuYWN0aXZlX3NpcF9yZWdpc3RyYXRpb25fc2VydmVyX2lwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnNpcF9wYXJhbWV0ZXJzLmFjdGl2ZV9zaXBfcmVnaXN0cmF0aW9uX3NlcnZlcl9jb21fcG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfaXB2NF9hZGRyZXNzKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zaXBfcGFyYW1ldGVycy5iYWNrdXBfc2lwX3JlZ19pcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zaXBfcGFyYW1ldGVycy5iYWNrdXBfc2lwX3JlZ19jb21fcG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfaXB2NF9hZGRyZXNzKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zaXBfcGFyYW1ldGVycy5vdXRib3VuZF9zZXJ2ZXJfaXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc2lwX3BhcmFtZXRlcnMub3V0Ym91bmRfc2VydmVyX3BvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc2lwX3BhcmFtZXRlcnMuc2lwX3JlZ2lzdHJhdGlvbl9pbnRlcnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc2lwX3BhcmFtZXRlcnMuZGlzYWJsZV9oZWFydGJlYXRfc3dpdGNoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnNpcF9wYXJhbWV0ZXJzLmhlYXJ0YmVhdF9jeWNsZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zaXBfcGFyYW1ldGVycy5oZWFydGJlYXRfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUuc2lwX3BhcmFtZXRlcnMud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LnNpcF9wYXJhbWV0ZXJzLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9TSVBfVVNFUl9QQVJBTUVURVJTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnNpcF91c2VyX3BhcmFtZXRlcnMud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnNpcF91c2VyX3BhcmFtZXRlcnMud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5zaXBfdXNlcl9wYXJhbWV0ZXJzLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5zaXBfdXNlcl9wYXJhbWV0ZXJzLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LnNpcF91c2VyX3BhcmFtZXRlcnMuYWNjb3VudCwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LnNpcF91c2VyX3BhcmFtZXRlcnMubmFtZSwgMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LnNpcF91c2VyX3BhcmFtZXRlcnMucGFzc3dvcmQsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LnNpcF91c2VyX3BhcmFtZXRlcnMud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LnNpcF91c2VyX3BhcmFtZXRlcnMud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0ZBWF9NT0RFTV9DT05GSUdVUkFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmZheF9tb2RlbV9jb25maWd1cmF0aW9uLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5mYXhfbW9kZW1fY29uZmlndXJhdGlvbi53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LmZheF9tb2RlbV9jb25maWd1cmF0aW9uLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5mYXhfbW9kZW1fY29uZmlndXJhdGlvbi53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfdDM4bW9kZV91bnBhY2soJnRoaXMtPnUuZmF4X21vZGVtX2NvbmZpZ3VyYXRpb24udm9pY2VfdDM4ZW5hYmxlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX2ZheF9tb2RlbV9jb250cm9sX21vZGVfdW5wYWNrKCZ0aGlzLT51LmZheF9tb2RlbV9jb25maWd1cmF0aW9uLnZvaWNlX2ZheF9tb2RlbV9jb250cm9sLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5mYXhfbW9kZW1fY29uZmlndXJhdGlvbi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuZmF4X21vZGVtX2NvbmZpZ3VyYXRpb24ud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0gyNDhJQURfT1BFUkFUSU9OX1NUQVRVUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5oMjQ4aWFkX29wZXJhdGlvbl9zdGF0dXMud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmgyNDhpYWRfb3BlcmF0aW9uX3N0YXR1cy53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LmgyNDhpYWRfb3BlcmF0aW9uX3N0YXR1cy53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuaDI0OGlhZF9vcGVyYXRpb25fc3RhdHVzLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfb3BlcmF0aW9uX3N0YXR1c191bnBhY2soJnRoaXMtPnUuaDI0OGlhZF9vcGVyYXRpb25fc3RhdHVzLmlhZF9vcGVyYXRpb25fc3RhdHVzLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5oMjQ4aWFkX29wZXJhdGlvbl9zdGF0dXMud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmgyNDhpYWRfb3BlcmF0aW9uX3N0YXR1cy53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUE9UU19TVEFUVVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUucG90c19zdGF0dXMud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnBvdHNfc3RhdHVzLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUucG90c19zdGF0dXMud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LnBvdHNfc3RhdHVzLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT51LnBvdHNfc3RhdHVzLmlhZF9wb3J0X3N0YXR1cywgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9zZXJ2aWNlX3N0YXRlX3VucGFjaygmdGhpcy0+dS5wb3RzX3N0YXR1cy5pYWRfcG9ydF9zZXJ2aWNlX3N0YXRlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9wb3J0X2NvZGVjX21vZGVfdW5wYWNrKCZ0aGlzLT51LnBvdHNfc3RhdHVzLmlhZF9wb3J0X2NvZGVjX21vZGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LnBvdHNfc3RhdHVzLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5wb3RzX3N0YXR1cy53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSUFEX09QRVJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5pYWRfb3BlcmF0aW9uLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5pYWRfb3BlcmF0aW9uLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUuaWFkX29wZXJhdGlvbi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuaWFkX29wZXJhdGlvbi53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX29wZXJhdGlvbl91bnBhY2soJnRoaXMtPnUuaWFkX29wZXJhdGlvbi5pYWRfb3BlcmF0aW9uLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5pYWRfb3BlcmF0aW9uLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5pYWRfb3BlcmF0aW9uLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9TSVBfRElHSVRfTUFQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnNpcF9kaWdpdF9tYXAud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnNpcF9kaWdpdF9tYXAud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5zaXBfZGlnaXRfbWFwLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5zaXBfZGlnaXRfbWFwLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc2lwX2RpZ2l0X21hcC5zaXBfZGlnaXRhbF9tYXBfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zaXBfZGlnaXRfbWFwLnNpcF9kaWdpdGFsX21hcF9jb3VudCA+IDApICYmICh0aGlzLT51LnNpcF9kaWdpdF9tYXAuc2lwX2RpZ2l0YWxfbWFwID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwic2lwX2RpZ2l0YWxfbWFwXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfc2lwX2RpZ2l0X21hcFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnNpcF9kaWdpdF9tYXAuc2lwX2RpZ2l0YWxfbWFwID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuc2lwX2RpZ2l0X21hcC5zaXBfZGlnaXRhbF9tYXBfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUuc2lwX2RpZ2l0X21hcC5zaXBfZGlnaXRhbF9tYXAsIHRoaXMtPnUuc2lwX2RpZ2l0X21hcC5zaXBfZGlnaXRhbF9tYXBfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUuc2lwX2RpZ2l0X21hcC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuc2lwX2RpZ2l0X21hcC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfQUxBUk1fQURNSU5fU1RBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuYWxhcm1fYWRtaW5fc3RhdGUud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmFsYXJtX2FkbWluX3N0YXRlLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUuYWxhcm1fYWRtaW5fc3RhdGUud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmFsYXJtX2FkbWluX3N0YXRlLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfYWxhcm1faWRfdW5wYWNrKCZ0aGlzLT51LmFsYXJtX2FkbWluX3N0YXRlLmlkLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2VuYWJsZWRfc3RhdGVfdW5wYWNrKCZ0aGlzLT51LmFsYXJtX2FkbWluX3N0YXRlLmNvbmZpZywgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUuYWxhcm1fYWRtaW5fc3RhdGUud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmFsYXJtX2FkbWluX3N0YXRlLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9BTEFSTV9USFJFU0hPTEQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuYWxhcm1fdGhyZXNob2xkLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5hbGFybV90aHJlc2hvbGQud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5hbGFybV90aHJlc2hvbGQud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmFsYXJtX3RocmVzaG9sZC53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2FsYXJtX2lkX3VucGFjaygmdGhpcy0+dS5hbGFybV90aHJlc2hvbGQuaWQsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmFsYXJtX3RocmVzaG9sZC50aHJlc2hvbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuYWxhcm1fdGhyZXNob2xkLmNsZWFyaW5nX3RocmVzaG9sZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5hbGFybV90aHJlc2hvbGQud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmFsYXJtX3RocmVzaG9sZC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfVkVSU0lPTl9TRVJWRVJfUEFSQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS52ZXJzaW9uX3NlcnZlcl9wYXJhLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS52ZXJzaW9uX3NlcnZlcl9wYXJhLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUudmVyc2lvbl9zZXJ2ZXJfcGFyYS53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUudmVyc2lvbl9zZXJ2ZXJfcGFyYS53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9pcHY0X2FkZHJlc3MoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnZlcnNpb25fc2VydmVyX3BhcmEuaXBhZGRyZXNzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9pcHY0X2FkZHJlc3MoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnZlcnNpb25fc2VydmVyX3BhcmEuaXBtYXNrKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9pcHY0X2FkZHJlc3MoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnZlcnNpb25fc2VydmVyX3BhcmEuZ2F0ZXdheSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdmxhbl90YWcoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnZlcnNpb25fc2VydmVyX3BhcmEudmxhbl9pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUudmVyc2lvbl9zZXJ2ZXJfcGFyYS51c2VyX25hbWUsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LnZlcnNpb25fc2VydmVyX3BhcmEucGFzc3dvcmQsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS52ZXJzaW9uX3NlcnZlcl9wYXJhLmFjdGlvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnZlcnNpb25fc2VydmVyX3BhcmEudmVyc2lvbl9udW1iZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LnZlcnNpb25fc2VydmVyX3BhcmEudmVyMW5hbWUsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS52ZXJzaW9uX3NlcnZlcl9wYXJhLnZlcjJuYW1lLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUudmVyc2lvbl9zZXJ2ZXJfcGFyYS52ZXIzbmFtZSwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUudmVyc2lvbl9zZXJ2ZXJfcGFyYS53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUudmVyc2lvbl9zZXJ2ZXJfcGFyYS53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX01BQ19MSU1JVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5vbnVfbWFjX2xpbWl0LndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vbnVfbWFjX2xpbWl0LndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUub251X21hY19saW1pdC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUub251X21hY19saW1pdC53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9tYWNfbGltaXQubWFjX2xpbWl0X251bWJlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5vbnVfbWFjX2xpbWl0LndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfbWFjX2xpbWl0LndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfTUFDX0FHSU5HX1RJTUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUub251X21hY19hZ2luZ190aW1lLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vbnVfbWFjX2FnaW5nX3RpbWUud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5vbnVfbWFjX2FnaW5nX3RpbWUud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9tYWNfYWdpbmdfdGltZS53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9tYWNfYWdpbmdfdGltZS5tYWNfYWdpbmdfdGltZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5vbnVfbWFjX2FnaW5nX3RpbWUud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9tYWNfYWdpbmdfdGltZS53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPUlRfTUFDX0ZJTFRFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBpNDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51Lm9udV9wb3J0X21hY19maWx0ZXIud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9wb3J0X21hY19maWx0ZXIud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5vbnVfcG9ydF9tYWNfZmlsdGVyLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfcG9ydF9tYWNfZmlsdGVyLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3p0ZV9vbnVfcG9ydF9tYWNfb3BlcmF0aW9uX3VucGFjaygmdGhpcy0+dS5vbnVfcG9ydF9tYWNfZmlsdGVyLm9wLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb3J0X21hY19maWx0ZXIubnVtYmVyX29mX2VudHJpZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5vbnVfcG9ydF9tYWNfZmlsdGVyLm51bWJlcl9vZl9lbnRyaWVzID4gMCkgJiYgKHRoaXMtPnUub251X3BvcnRfbWFjX2ZpbHRlci5jbGF1c2UgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjbGF1c2VcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9vbnVfcG9ydF9tYWNfZmlsdGVyXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUub251X3BvcnRfbWFjX2ZpbHRlci5jbGF1c2UgPSAoYmNtb2x0X2Vwb25fb2FtX3p0ZV92bGFuX21hYyAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5vbnVfcG9ydF9tYWNfZmlsdGVyLm51bWJlcl9vZl9lbnRyaWVzICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV96dGVfdmxhbl9tYWMpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTQgPSAwOyBpNCA8IHRoaXMtPnUub251X3BvcnRfbWFjX2ZpbHRlci5udW1iZXJfb2ZfZW50cmllczsgaTQrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3p0ZV92bGFuX21hY191bnBhY2soJnRoaXMtPnUub251X3BvcnRfbWFjX2ZpbHRlci5jbGF1c2VbaTRdLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5vbnVfcG9ydF9tYWNfZmlsdGVyLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfcG9ydF9tYWNfZmlsdGVyLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9SVF9NQUNfQklORElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBpNTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51Lm9udV9wb3J0X21hY19iaW5kaW5nLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vbnVfcG9ydF9tYWNfYmluZGluZy53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51Lm9udV9wb3J0X21hY19iaW5kaW5nLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfcG9ydF9tYWNfYmluZGluZy53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV96dGVfb251X3BvcnRfbWFjX29wZXJhdGlvbl91bnBhY2soJnRoaXMtPnUub251X3BvcnRfbWFjX2JpbmRpbmcub3AsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3BvcnRfbWFjX2JpbmRpbmcubnVtYmVyX29mX2VudHJpZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5vbnVfcG9ydF9tYWNfYmluZGluZy5udW1iZXJfb2ZfZW50cmllcyA+IDApICYmICh0aGlzLT51Lm9udV9wb3J0X21hY19iaW5kaW5nLmNsYXVzZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImNsYXVzZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2F0dHJpYnV0ZV92YWx1ZV9iYXNlX29udV9wb3J0X21hY19iaW5kaW5nXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUub251X3BvcnRfbWFjX2JpbmRpbmcuY2xhdXNlID0gKGJjbW9sdF9lcG9uX29hbV96dGVfdmxhbl9tYWMgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUub251X3BvcnRfbWFjX2JpbmRpbmcubnVtYmVyX29mX2VudHJpZXMgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3p0ZV92bGFuX21hYykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNSA9IDA7IGk1IDwgdGhpcy0+dS5vbnVfcG9ydF9tYWNfYmluZGluZy5udW1iZXJfb2ZfZW50cmllczsgaTUrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3p0ZV92bGFuX21hY191bnBhY2soJnRoaXMtPnUub251X3BvcnRfbWFjX2JpbmRpbmcuY2xhdXNlW2k1XSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUub251X3BvcnRfbWFjX2JpbmRpbmcud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9wb3J0X21hY19iaW5kaW5nLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9SVF9NQUNfU1RBVElDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGk2OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUub251X3BvcnRfbWFjX3N0YXRpYy53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub251X3BvcnRfbWFjX3N0YXRpYy53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51Lm9udV9wb3J0X21hY19zdGF0aWMud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9wb3J0X21hY19zdGF0aWMud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fenRlX29udV9wb3J0X21hY19vcGVyYXRpb25fdW5wYWNrKCZ0aGlzLT51Lm9udV9wb3J0X21hY19zdGF0aWMub3AsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3BvcnRfbWFjX3N0YXRpYy5udW1iZXJfb2ZfZW50cmllcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm9udV9wb3J0X21hY19zdGF0aWMubnVtYmVyX29mX2VudHJpZXMgPiAwKSAmJiAodGhpcy0+dS5vbnVfcG9ydF9tYWNfc3RhdGljLmNsYXVzZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImNsYXVzZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2F0dHJpYnV0ZV92YWx1ZV9iYXNlX29udV9wb3J0X21hY19zdGF0aWNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5vbnVfcG9ydF9tYWNfc3RhdGljLmNsYXVzZSA9IChiY21vbHRfZXBvbl9vYW1fenRlX3ZsYW5fbWFjICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51Lm9udV9wb3J0X21hY19zdGF0aWMubnVtYmVyX29mX2VudHJpZXMgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3p0ZV92bGFuX21hYykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNiA9IDA7IGk2IDwgdGhpcy0+dS5vbnVfcG9ydF9tYWNfc3RhdGljLm51bWJlcl9vZl9lbnRyaWVzOyBpNisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fenRlX3ZsYW5fbWFjX3VucGFjaygmdGhpcy0+dS5vbnVfcG9ydF9tYWNfc3RhdGljLmNsYXVzZVtpNl0sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51Lm9udV9wb3J0X21hY19zdGF0aWMud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9wb3J0X21hY19zdGF0aWMud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QRVJGT1JNQU5DRV9TVEFUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51Lm9udV9wZXJmb3JtYW5jZV9zdGF0LndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vbnVfcGVyZm9ybWFuY2Vfc3RhdC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51Lm9udV9wZXJmb3JtYW5jZV9zdGF0LndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfcGVyZm9ybWFuY2Vfc3RhdC53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wZXJmb3JtYW5jZV9zdGF0LmlmaW5vY3RldHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3BlcmZvcm1hbmNlX3N0YXQuaWZpbnVjYXN0cGt0cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcGVyZm9ybWFuY2Vfc3RhdC5pZmlubnVjYXN0cGt0cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcGVyZm9ybWFuY2Vfc3RhdC5pZmluZGlzY2FyZHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3BlcmZvcm1hbmNlX3N0YXQuaWZpbmVycm9ycykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcGVyZm9ybWFuY2Vfc3RhdC5pZm91dG9jdGV0cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcGVyZm9ybWFuY2Vfc3RhdC5pZm91dHVjYXN0cGt0cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcGVyZm9ybWFuY2Vfc3RhdC5pZm91dG51Y2FzdHBrdHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3BlcmZvcm1hbmNlX3N0YXQuaWZvdXRkaXNjYXJkcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcGVyZm9ybWFuY2Vfc3RhdC5pZm91dGVycm9ycykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcGVyZm9ybWFuY2Vfc3RhdC5yZXNlcnZlZDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3BlcmZvcm1hbmNlX3N0YXQucmVzZXJ2ZWQyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wZXJmb3JtYW5jZV9zdGF0LnJlc2VydmVkMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcGVyZm9ybWFuY2Vfc3RhdC5yZXNlcnZlZDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUub251X3BlcmZvcm1hbmNlX3N0YXQud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9wZXJmb3JtYW5jZV9zdGF0LndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9SVF9JU09MQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUub251X3BvcnRfaXNvbGF0ZS53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fenRlX2lzb2xhdGVfbW9kZV91bnBhY2soJnRoaXMtPnUub251X3BvcnRfaXNvbGF0ZS5wb3J0X2lzb2xhdGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX01BQ19BRERSRVNTX1RBQkxFX1FVRVJZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51Lm9udV9tYWNfYWRkcmVzc190YWJsZV9xdWVyeS53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub251X21hY19hZGRyZXNzX3RhYmxlX3F1ZXJ5LndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUub251X21hY19hZGRyZXNzX3RhYmxlX3F1ZXJ5LndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfbWFjX2FkZHJlc3NfdGFibGVfcXVlcnkud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5vbnVfbWFjX2FkZHJlc3NfdGFibGVfcXVlcnkud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9tYWNfYWRkcmVzc190YWJsZV9xdWVyeS53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPTl9NQUNfRE9XTlNUUkVBTV9TSEFQSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51Lm9udV9wb25fbWFjX2Rvd25zdHJlYW1fc2hhcGluZy53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub251X3Bvbl9tYWNfZG93bnN0cmVhbV9zaGFwaW5nLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUub251X3Bvbl9tYWNfZG93bnN0cmVhbV9zaGFwaW5nLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfcG9uX21hY19kb3duc3RyZWFtX3NoYXBpbmcud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3Bvbl9tYWNfZG93bnN0cmVhbV9zaGFwaW5nLnBvbm1hY2RzcmF0ZWxpbWl0aW5nZW5hYmxlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb25fbWFjX2Rvd25zdHJlYW1fc2hhcGluZy5jaXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UyNCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3Bvbl9tYWNfZG93bnN0cmVhbV9zaGFwaW5nLmNicykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5vbnVfcG9uX21hY19kb3duc3RyZWFtX3NoYXBpbmcud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9wb25fbWFjX2Rvd25zdHJlYW1fc2hhcGluZy53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPTl9NQUNfVVNEU0JVRkZFUl9DQVBBQklMSVRZX1FVRVJZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51Lm9udV9wb25fbWFjX3VzZHNidWZmZXJfY2FwYWJpbGl0eV9xdWVyeS53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub251X3Bvbl9tYWNfdXNkc2J1ZmZlcl9jYXBhYmlsaXR5X3F1ZXJ5LndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUub251X3Bvbl9tYWNfdXNkc2J1ZmZlcl9jYXBhYmlsaXR5X3F1ZXJ5LndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfcG9uX21hY191c2RzYnVmZmVyX2NhcGFiaWxpdHlfcXVlcnkud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fenRlX2J1ZmZlcl9tYW5hZ2VfbW9kZV91bnBhY2soJnRoaXMtPnUub251X3Bvbl9tYWNfdXNkc2J1ZmZlcl9jYXBhYmlsaXR5X3F1ZXJ5LmJ1ZmZlcl9tYW5hZ2VtZW50X2NhcGFiaWxpdHksICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb25fbWFjX3VzZHNidWZmZXJfY2FwYWJpbGl0eV9xdWVyeS5kc2J1ZmZlcl9zaXplX21pbmltdW1fdmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UyNCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3Bvbl9tYWNfdXNkc2J1ZmZlcl9jYXBhYmlsaXR5X3F1ZXJ5LmRzYnVmZmVyX3NpemVfbWF4aW11bV92YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTI0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcG9uX21hY191c2RzYnVmZmVyX2NhcGFiaWxpdHlfcXVlcnkudXNidWZmZXJfc2l6ZV9taW5pbXVtX3ZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb25fbWFjX3VzZHNidWZmZXJfY2FwYWJpbGl0eV9xdWVyeS51c2J1ZmZlcl9zaXplX21heGltdW1fdmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUub251X3Bvbl9tYWNfdXNkc2J1ZmZlcl9jYXBhYmlsaXR5X3F1ZXJ5LndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfcG9uX21hY191c2RzYnVmZmVyX2NhcGFiaWxpdHlfcXVlcnkud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT05fTUFDX1VTRFNCVUZGRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUub251X3Bvbl9tYWNfdXNkc2J1ZmZlci53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub251X3Bvbl9tYWNfdXNkc2J1ZmZlci53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51Lm9udV9wb25fbWFjX3VzZHNidWZmZXIud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9wb25fbWFjX3VzZHNidWZmZXIud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3Bvbl9tYWNfdXNkc2J1ZmZlci5idWZmZXJfbWFuYWdlbWVudF9pbmRpY2F0aW9uKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV96dGVfZHNidWZfZGlyZWN0aW9uX3VucGFjaygmdGhpcy0+dS5vbnVfcG9uX21hY191c2RzYnVmZmVyLmRpcmVjdGlvbiwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UyNCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3Bvbl9tYWNfdXNkc2J1ZmZlci5idWZmZXJfc2l6ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5vbnVfcG9uX21hY191c2RzYnVmZmVyLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfcG9uX21hY191c2RzYnVmZmVyLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9SVF9TVEFUSVNUSUNTX0NPTExFQ1RfQ09OVFJPTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5vbnVfcG9ydF9zdGF0aXN0aWNzX2NvbGxlY3RfY29udHJvbC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub251X3BvcnRfc3RhdGlzdGljc19jb2xsZWN0X2NvbnRyb2wud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5vbnVfcG9ydF9zdGF0aXN0aWNzX2NvbGxlY3RfY29udHJvbC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUub251X3BvcnRfc3RhdGlzdGljc19jb2xsZWN0X2NvbnRyb2wud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fenRlX3N0YXRpc3RpY3NfYWN0aW9uX21vZGVfdW5wYWNrKCZ0aGlzLT51Lm9udV9wb3J0X3N0YXRpc3RpY3NfY29sbGVjdF9jb250cm9sLnN0YXRpc3RpY3NfYWN0aW9uLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTI0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcG9ydF9zdGF0aXN0aWNzX2NvbGxlY3RfY29udHJvbC5zdGF0aXN0aWNzX2ludGVydmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb3J0X3N0YXRpc3RpY3NfY29sbGVjdF9jb250cm9sLnN0YXRpc3RpY3NfZHVyYXRpb25fdGltZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5vbnVfcG9ydF9zdGF0aXN0aWNzX2NvbGxlY3RfY29udHJvbC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUub251X3BvcnRfc3RhdGlzdGljc19jb2xsZWN0X2NvbnRyb2wud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT1JUX1NUQVRJU1RJQ1NfQ09VTlRFUl9SRVNFVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5vbnVfcG9ydF9zdGF0aXN0aWNzX2NvdW50ZXJfcmVzZXQud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9wb3J0X3N0YXRpc3RpY3NfY291bnRlcl9yZXNldC53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51Lm9udV9wb3J0X3N0YXRpc3RpY3NfY291bnRlcl9yZXNldC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUub251X3BvcnRfc3RhdGlzdGljc19jb3VudGVyX3Jlc2V0LndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3p0ZV9zdGF0aXN0aWNzX3Jlc2V0X21vZGVfdW5wYWNrKCZ0aGlzLT51Lm9udV9wb3J0X3N0YXRpc3RpY3NfY291bnRlcl9yZXNldC5zdGF0aXN0aWNzX3Jlc2V0LCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5vbnVfcG9ydF9zdGF0aXN0aWNzX2NvdW50ZXJfcmVzZXQud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9wb3J0X3N0YXRpc3RpY3NfY291bnRlcl9yZXNldC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPUlRfRkxVWF9TVEFUSVNUSUNTX0NPVU5URVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUub251X3BvcnRfZmx1eF9zdGF0aXN0aWNzX2NvdW50ZXIud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9wb3J0X2ZsdXhfc3RhdGlzdGljc19jb3VudGVyLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUub251X3BvcnRfZmx1eF9zdGF0aXN0aWNzX2NvdW50ZXIud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9wb3J0X2ZsdXhfc3RhdGlzdGljc19jb3VudGVyLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3VuaV9mbG93X3N0YXRpc3RpY3NfY29sbGVjdF9jb250cm9sX21vZGVfdW5wYWNrKCZ0aGlzLT51Lm9udV9wb3J0X2ZsdXhfc3RhdGlzdGljc19jb3VudGVyLnVuaWZsb3dzdGF0aXN0aWNzY29sbGVjdGNvbnRyb2xpbmRpY2F0aW9uLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcG9ydF9mbHV4X3N0YXRpc3RpY3NfY291bnRlci5pZmlub2N0ZXRzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb3J0X2ZsdXhfc3RhdGlzdGljc19jb3VudGVyLmlmaW51Y2FzdHBrdHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3BvcnRfZmx1eF9zdGF0aXN0aWNzX2NvdW50ZXIuaWZpbm51Y2FzdHBrdHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3BvcnRfZmx1eF9zdGF0aXN0aWNzX2NvdW50ZXIuaWZpbmRpc2NhcmRzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb3J0X2ZsdXhfc3RhdGlzdGljc19jb3VudGVyLmlmaW5lcnJvcnMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3BvcnRfZmx1eF9zdGF0aXN0aWNzX2NvdW50ZXIuaWZvdXRvY3RldHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3BvcnRfZmx1eF9zdGF0aXN0aWNzX2NvdW50ZXIuaWZvdXR1Y2FzdHBrdHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3BvcnRfZmx1eF9zdGF0aXN0aWNzX2NvdW50ZXIuaWZvdXRudWNhc3Rwa3RzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb3J0X2ZsdXhfc3RhdGlzdGljc19jb3VudGVyLmlmb3V0ZGlzY2FyZHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3BvcnRfZmx1eF9zdGF0aXN0aWNzX2NvdW50ZXIuaWZvdXRlcnJvcnMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUub251X3BvcnRfZmx1eF9zdGF0aXN0aWNzX2NvdW50ZXIud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9wb3J0X2ZsdXhfc3RhdGlzdGljc19jb3VudGVyLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfTElHSFRfRVhDRVBUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51Lm9udV9saWdodF9leGNlcHRpb24ud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9saWdodF9leGNlcHRpb24ud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5vbnVfbGlnaHRfZXhjZXB0aW9uLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfbGlnaHRfZXhjZXB0aW9uLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfbGlnaHRfZXhjZXB0aW9uLnBvbnBvcnRudW1iZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2xpZ2h0X2luZGljYXRpb25fbW9kZV91bnBhY2soJnRoaXMtPnUub251X2xpZ2h0X2V4Y2VwdGlvbi5tYWluX2xpZ2h0X2luZGljYXRpb24sICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9saWdodF9pbmRpY2F0aW9uX21vZGVfdW5wYWNrKCZ0aGlzLT51Lm9udV9saWdodF9leGNlcHRpb24ucmVzZXJ2ZV9saWdodF9pbmRpY2F0aW9uLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5vbnVfbGlnaHRfZXhjZXB0aW9uLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfbGlnaHRfZXhjZXB0aW9uLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfTElHSFRfQ09OVFJPTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5vbnVfbGlnaHRfY29udHJvbC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub251X2xpZ2h0X2NvbnRyb2wud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5vbnVfbGlnaHRfY29udHJvbC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUub251X2xpZ2h0X2NvbnRyb2wud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbWF0Y2hfbWFjX2FkZHJlc3NfbW9kZV91bnBhY2soJnRoaXMtPnUub251X2xpZ2h0X2NvbnRyb2wubWF0Y2hfbWFjX2FkZHJlc3MsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9tYWNfYWRkcmVzcygmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X2xpZ2h0X2NvbnRyb2wucG9uX21hY19hZGRyZXNzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV96dGVfbGlnaHRfY29udHJvbF9hY3Rpb25fbW9kZV91bnBhY2soJnRoaXMtPnUub251X2xpZ2h0X2NvbnRyb2wuYWN0aW9uLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfbGlnaHRfY29udHJvbC5kdXJhdGlvbl90aW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51Lm9udV9saWdodF9jb250cm9sLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfbGlnaHRfY29udHJvbC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPTl9QT1JUX1NUQVRJU1RJQ1NfR0VUMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQxLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQxLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0MS53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0MS53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDEuZnJhbWVzX3RyYW5zbWl0dGVkb2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0MS5vY3RldHNfdHJhbnNtaXR0ZWRvaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQxLm11bHRpY2FzdF9mcmFtZXN4bWl0dGVkX29rKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDEuYnJvYWRjYXN0X2ZyYW1lc3htaXR0ZWRfb2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0MS5mcmFtZXNfcmVjZWl2ZWRfb2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0MS5vY3RldHNfcmVjZWl2ZWRfb2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0MS5tdWx0aWNhc3RfZnJhbWVzX3JlY2VpdmVkX29rKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDEuYnJvYWRjYXN0X2ZyYW1lc19yZWNlaXZlZF9vaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQxLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQxLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9OX1BPUlRfU1RBVElTVElDU19HRVQyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDIud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDIud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQyLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQyLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0Mi5jcmM4ZXJyb3JzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDIuZmVjX2NvcnJlY3RlZF9ibG9ja3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0Mi5mZWNfdW5jb3JyZWN0YWJsZV9ibG9ja3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0Mi5tcGNwX21hY19jdHJsX2ZyYW1lc190cmFuc21pdHRlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQyLm1wY3BfbWFjX2N0cmxfZnJhbWVzX3JlY2VpdmVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDIubXBjcF90eF9yZWdpc3RlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQyLm1wY3BfdHhfcmVncmVxdWVzdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcG9uX3BvcnRfc3RhdGlzdGljc19nZXQyLm1wY3BfdHhfcmVwb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDIubXBjcF9yeF9nYXRlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDIubXBjcF9yeF9yZWdpc3RlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDIud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDIud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0FMQVJNX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5hbGFybV9jb25maWcud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmFsYXJtX2NvbmZpZy53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LmFsYXJtX2NvbmZpZy53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuYWxhcm1fY29uZmlnLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2FsYXJtX2NvbmZpZ19tb2RlX3VucGFjaygmdGhpcy0+dS5hbGFybV9jb25maWcuYWxhcm1fY29uZmlnLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5hbGFybV9jb25maWcud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmFsYXJtX2NvbmZpZy53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUk9VR1VFX09OVV9FWENMX0FCSUxJVFk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUucm91Z3VlX29udV9leGNsX2FiaWxpdHkud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnJvdWd1ZV9vbnVfZXhjbF9hYmlsaXR5LndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUucm91Z3VlX29udV9leGNsX2FiaWxpdHkud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LnJvdWd1ZV9vbnVfZXhjbF9hYmlsaXR5LndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9leGNsX2FiaWxpdHlfdW5wYWNrKCZ0aGlzLT51LnJvdWd1ZV9vbnVfZXhjbF9hYmlsaXR5LmFiaWxpdHksICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LnJvdWd1ZV9vbnVfZXhjbF9hYmlsaXR5LndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5yb3VndWVfb251X2V4Y2xfYWJpbGl0eS53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPV0VSX1NBVklOR19DQVBBQklMSVRJRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUub251X3Bvd2VyX3NhdmluZ19jYXBhYmlsaXRpZXMud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9udV9wb3dlcl9zYXZpbmdfY2FwYWJpbGl0aWVzLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUub251X3Bvd2VyX3NhdmluZ19jYXBhYmlsaXRpZXMud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9wb3dlcl9zYXZpbmdfY2FwYWJpbGl0aWVzLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2xlZXBfbW9kZV91bnBhY2soJnRoaXMtPnUub251X3Bvd2VyX3NhdmluZ19jYXBhYmlsaXRpZXMuc2xlZXBfbW9kZV9jYXBhYmlsaXR5LCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9lYXJseV93YWtlX2NhcGFiaWxpdHlfdW5wYWNrKCZ0aGlzLT51Lm9udV9wb3dlcl9zYXZpbmdfY2FwYWJpbGl0aWVzLmVhcmx5X3dha2VfdXBfY2FwYWJpbGl0eSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUub251X3Bvd2VyX3NhdmluZ19jYXBhYmlsaXRpZXMud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9wb3dlcl9zYXZpbmdfY2FwYWJpbGl0aWVzLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9XRVJfU0FWSU5HX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5vbnVfcG93ZXJfc2F2aW5nX2NvbmZpZy53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub251X3Bvd2VyX3NhdmluZ19jb25maWcud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5vbnVfcG93ZXJfc2F2aW5nX2NvbmZpZy53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUub251X3Bvd2VyX3NhdmluZ19jb25maWcud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2Vhcmx5X3dha2VfdXBfbW9kZV91bnBhY2soJnRoaXMtPnUub251X3Bvd2VyX3NhdmluZ19jb25maWcuZWFybHlfd2FrZV91cCwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51Lm9udV9wb3dlcl9zYXZpbmdfY29uZmlnLnNsZWVwX2R1cmF0aW9uX21heCwgNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5vbnVfcG93ZXJfc2F2aW5nX2NvbmZpZy53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUub251X3Bvd2VyX3NhdmluZ19jb25maWcud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QUk9URUNUSU9OX1BBUkFNRVRFUlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUub251X3Byb3RlY3Rpb25fcGFyYW1ldGVycy53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub251X3Byb3RlY3Rpb25fcGFyYW1ldGVycy53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51Lm9udV9wcm90ZWN0aW9uX3BhcmFtZXRlcnMud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9udV9wcm90ZWN0aW9uX3BhcmFtZXRlcnMud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcHJvdGVjdGlvbl9wYXJhbWV0ZXJzLm9wdGljYWxfbG9zX3RpbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X3Byb3RlY3Rpb25fcGFyYW1ldGVycy5tYWNfbG9zX3RpbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUub251X3Byb3RlY3Rpb25fcGFyYW1ldGVycy53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUub251X3Byb3RlY3Rpb25fcGFyYW1ldGVycy53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUE9SVF9ESVNBQkxFX09OX0xPT1BfREVURUNURUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUucG9ydF9kaXNhYmxlX29uX2xvb3BfZGV0ZWN0ZWQud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnBvcnRfZGlzYWJsZV9vbl9sb29wX2RldGVjdGVkLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUucG9ydF9kaXNhYmxlX29uX2xvb3BfZGV0ZWN0ZWQud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LnBvcnRfZGlzYWJsZV9vbl9sb29wX2RldGVjdGVkLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19wb3J0X2Rpc2FibGVfb25fbG9vcF9kZXRlY3RlZF9zdGF0ZV91bnBhY2soJnRoaXMtPnUucG9ydF9kaXNhYmxlX29uX2xvb3BfZGV0ZWN0ZWQuc3RhdGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LnBvcnRfZGlzYWJsZV9vbl9sb29wX2RldGVjdGVkLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5wb3J0X2Rpc2FibGVfb25fbG9vcF9kZXRlY3RlZC53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfTUFDX0FHSU5HX1RJTUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUubWFjX2FnaW5nX3RpbWUud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm1hY19hZ2luZ190aW1lLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUubWFjX2FnaW5nX3RpbWUud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm1hY19hZ2luZ190aW1lLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUubWFjX2FnaW5nX3RpbWUuYWdpbmdfdGltZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5tYWNfYWdpbmdfdGltZS53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUubWFjX2FnaW5nX3RpbWUud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1BFUkZPUk1BTkNFX01PTklUT1JJTkdfU1RBVFVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3Jpbmdfc3RhdHVzLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX3N0YXR1cy53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3Jpbmdfc3RhdHVzLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX3N0YXR1cy53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbW9uaXRvcmluZ19zdGF0dXNfdW5wYWNrKCZ0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3Jpbmdfc3RhdHVzLm1vbml0b3Jpbmdfc3RhdHVzLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX3N0YXR1cy5tb25pdG9yaW5nX3BlcmlvZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX3N0YXR1cy53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19zdGF0dXMud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1BFUkZPUk1BTkNFX01PTklUT1JJTkdfQ1VSUkVOVF9EQVRBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfY3VycmVudF9kYXRhLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2N1cnJlbnRfZGF0YS53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfY3VycmVudF9kYXRhLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2N1cnJlbnRfZGF0YS53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfY3VycmVudF9kYXRhLnN0YXRzX2ZpZWxkMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2N1cnJlbnRfZGF0YS5zdGF0c19maWVsZDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19jdXJyZW50X2RhdGEuc3RhdHNfZmllbGQzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfY3VycmVudF9kYXRhLnN0YXRzX2ZpZWxkNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2N1cnJlbnRfZGF0YS5zdGF0c19maWVsZDUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19jdXJyZW50X2RhdGEuc3RhdHNfZmllbGQ2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfY3VycmVudF9kYXRhLnN0YXRzX2ZpZWxkNykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2N1cnJlbnRfZGF0YS5zdGF0c19maWVsZDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19jdXJyZW50X2RhdGEuc3RhdHNfZmllbGQ5KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfY3VycmVudF9kYXRhLnN0YXRzX2ZpZWxkMTApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19jdXJyZW50X2RhdGEuc3RhdHNfZmllbGQxMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2N1cnJlbnRfZGF0YS5zdGF0c19maWVsZDEyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfY3VycmVudF9kYXRhLnN0YXRzX2ZpZWxkMTMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19jdXJyZW50X2RhdGEuc3RhdHNfZmllbGQxNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2N1cnJlbnRfZGF0YS5zdGF0c19maWVsZDE1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfY3VycmVudF9kYXRhLnN0YXRzX2ZpZWxkMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19jdXJyZW50X2RhdGEud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfY3VycmVudF9kYXRhLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9QRVJGT1JNQU5DRV9NT05JVE9SSU5HX0hJU1RPUllfREFUQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19oaXN0b3J5X2RhdGEud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19oaXN0b3J5X2RhdGEud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS5zdGF0c19maWVsZDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19oaXN0b3J5X2RhdGEuc3RhdHNfZmllbGQyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfaGlzdG9yeV9kYXRhLnN0YXRzX2ZpZWxkMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS5zdGF0c19maWVsZDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19oaXN0b3J5X2RhdGEuc3RhdHNfZmllbGQ1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfaGlzdG9yeV9kYXRhLnN0YXRzX2ZpZWxkNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS5zdGF0c19maWVsZDcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19oaXN0b3J5X2RhdGEuc3RhdHNfZmllbGQ4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfaGlzdG9yeV9kYXRhLnN0YXRzX2ZpZWxkOSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS5zdGF0c19maWVsZDEwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfaGlzdG9yeV9kYXRhLnN0YXRzX2ZpZWxkMTEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19oaXN0b3J5X2RhdGEuc3RhdHNfZmllbGQxMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS5zdGF0c19maWVsZDEzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfaGlzdG9yeV9kYXRhLnN0YXRzX2ZpZWxkMTQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucGVyZm9ybWFuY2VfbW9uaXRvcmluZ19oaXN0b3J5X2RhdGEuc3RhdHNfZmllbGQxNSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS5zdGF0c19maWVsZDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LnBlcmZvcm1hbmNlX21vbml0b3JpbmdfaGlzdG9yeV9kYXRhLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2hpc3RvcnlfZGF0YS53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1RYX1BPV0VSX1NVUFBMWV9DT05UUk9MOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGggPSAwOworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ3aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCB3aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV90eF9wb3dlcl9zdXBwbHlfY29udHJvbC5hY3Rpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX21hY19hZGRyZXNzKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfdHhfcG93ZXJfc3VwcGx5X2NvbnRyb2wub251X2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV90eF9wb3dlcl9zdXBwbHlfY29udHJvbC5vcHRfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1Ziwgd2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmRlZi53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuZGVmLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUuZGVmLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5kZWYud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5kZWYudW5rbm93bl9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2RlZl9jb3VudF91bmtub3duKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZGVmLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5kZWYudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVua25vd25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9kZWZcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5kZWYudW5rbm93biA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmRlZi51bmtub3duX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LmRlZi51bmtub3duLCB0aGlzLT51LmRlZi51bmtub3duX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LmRlZi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuZGVmLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hdHRyaWJ1dGUgbGVhZjsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYXR0cmlidXRlX3VucGFjaygmbGVhZiwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1BQUE9fRVRFU1RfUkVTVUxUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9QUFBPX0VURVNUX0NPTkZJR1VSQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA2NCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB1bmtub3duX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bl9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHVua25vd25fZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfU0VSSUFMX05VTUJFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRklSTVdBUkVfVkVSU0lPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgdWludDMyX3QgZmlybXdhcmVfdmVyc2lvbl9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZpcm13YXJlX3ZlcnNpb25fZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChmaXJtd2FyZV92ZXJzaW9uX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfQ0hJUFNFVF9JRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfQ0FQQUJJTElUSUVTMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09QVElDQUxfVFJBTlNDRUlWRVJfRElBR05PU0lTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9TRVJWSUNFX1NMQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX2Jhc2Vfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9DQVBBQklMSVRJRVMyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICB1aW50OF90IGludGVyZmFjZXNfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmaW50ZXJmYWNlc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX29udV9pbnRlcmZhY2UpICogaW50ZXJmYWNlc19jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIGludGVyZmFjZXNfY291bnQgKiA2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9IT0xET1ZFUl9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX01YVV9NQU5BR0VfR0xPQkFMX1BBUkFNRVRFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X2dsb2JhbF9wYXJhbXNfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9NWFVfTUFOQUdFX1NOTVBfUEFSQU1FVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfc25tcF9wYXJhbXNfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9BQ1RJVkVfUE9OX0lGQURNSU46CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX0NBUEFCSUxJVElFUzM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9FVEhfTElOS19TVEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9FVEhfUE9SVF9QQVVTRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9FVEhfUE9SVF9QT0xJQ0lORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfY29uZmlnX2Jhc2Vfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1ZPSVBfUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9FMVBPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRVRIX1BPUlRfRE9XTl9SQVRFX0xJTUlUSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUE9SVF9MT09QX0RFVEVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9WTEFOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3Byb3ZfYmFzZV9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfQ0xBU1NJRklDQVRJT05fQU5EX01BUktJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgcnVsZXNfY291bnQ7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnJ1bGVzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfcnVsZSkgKiBydWxlc19jb3VudCk7CisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgcnVsZXNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfcnVsZV9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX01VTFRJQ0FTVF9WTEFOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9wcm92X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9NVUxUSUNBU1RfVEFHX09QRVJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19vcGVyYXRpb25fYmFzZV9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfTVVMVElDQVNUX1NXSVRDSDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9NVUxUSUNBU1RfQ09OVFJPTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0dST1VQX01BWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9GQVNUX0xFQVZFX0FCSUxJVFk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGZhc3RfbGVhdmVfbW9kZXNfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZmYXN0X2xlYXZlX21vZGVzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQzMl90KSAqIGZhc3RfbGVhdmVfbW9kZXNfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCBmYXN0X2xlYXZlX21vZGVzX2NvdW50ICogNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9GQVNUX0xFQVZFX0FETUlOX1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0xMSURfUVVFVUVfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxsaWRfcXVldWVfdGFibGVfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJmxsaWRfcXVldWVfdGFibGVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfbGxpZF9xdWV1ZSkgKiBsbGlkX3F1ZXVlX3RhYmxlX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgbGxpZF9xdWV1ZV90YWJsZV9jb3VudCAqIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSUFEX0lORk9STUFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1ZPSVBfR0xPQkFMX1BBUkFNRVRFUlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAzMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSDI0OFBBUkFNRVRFUlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA2NCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9IMjQ4VVNFUl9USURfSU5GT1JNQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0gyNDhSVFBfVElEX0NPTkZJR1VSQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9IMjQ4UlRQX1RJRF9JTkZPUk1BVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1NJUF9QQVJBTUVURVJTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1NJUF9VU0VSX1BBUkFNRVRFUlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9GQVhfTU9ERU1fQ09ORklHVVJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSDI0OElBRF9PUEVSQVRJT05fU1RBVFVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1BPVFNfU1RBVFVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSUFEX09QRVJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9TSVBfRElHSVRfTUFQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBzaXBfZGlnaXRhbF9tYXBfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZzaXBfZGlnaXRhbF9tYXBfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiBzaXBfZGlnaXRhbF9tYXBfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCBzaXBfZGlnaXRhbF9tYXBfY291bnQgKiAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0FMQVJNX0FETUlOX1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9BTEFSTV9USFJFU0hPTEQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9WRVJTSU9OX1NFUlZFUl9QQVJBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfTUFDX0xJTUlUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9NQUNfQUdJTkdfVElNRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9SVF9NQUNfRklMVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICB1aW50OF90IG51bWJlcl9vZl9lbnRyaWVzOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmbnVtYmVyX29mX2VudHJpZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3p0ZV92bGFuX21hYykgKiBudW1iZXJfb2ZfZW50cmllcyk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIG51bWJlcl9vZl9lbnRyaWVzICogOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9SVF9NQUNfQklORElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgdWludDhfdCBudW1iZXJfb2ZfZW50cmllczsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJm51bWJlcl9vZl9lbnRyaWVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV96dGVfdmxhbl9tYWMpICogbnVtYmVyX29mX2VudHJpZXMpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCBudW1iZXJfb2ZfZW50cmllcyAqIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPUlRfTUFDX1NUQVRJQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgdWludDhfdCBudW1iZXJfb2ZfZW50cmllczsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJm51bWJlcl9vZl9lbnRyaWVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV96dGVfdmxhbl9tYWMpICogbnVtYmVyX29mX2VudHJpZXMpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCBudW1iZXJfb2ZfZW50cmllcyAqIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BFUkZPUk1BTkNFX1NUQVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT1JUX0lTT0xBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9NQUNfQUREUkVTU19UQUJMRV9RVUVSWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT05fTUFDX0RPV05TVFJFQU1fU0hBUElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT05fTUFDX1VTRFNCVUZGRVJfQ0FQQUJJTElUWV9RVUVSWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPTl9NQUNfVVNEU0JVRkZFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT1JUX1NUQVRJU1RJQ1NfQ09MTEVDVF9DT05UUk9MOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPUlRfU1RBVElTVElDU19DT1VOVEVSX1JFU0VUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT1JUX0ZMVVhfU1RBVElTVElDU19DT1VOVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfTElHSFRfRVhDRVBUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX0xJR0hUX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPTl9QT1JUX1NUQVRJU1RJQ1NfR0VUMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPTl9QT1JUX1NUQVRJU1RJQ1NfR0VUMjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9BTEFSTV9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUk9VR1VFX09OVV9FWENMX0FCSUxJVFk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPV0VSX1NBVklOR19DQVBBQklMSVRJRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT1dFUl9TQVZJTkdfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUFJPVEVDVElPTl9QQVJBTUVURVJTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9QT1JUX0RJU0FCTEVfT05fTE9PUF9ERVRFQ1RFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9NQUNfQUdJTkdfVElNRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9QRVJGT1JNQU5DRV9NT05JVE9SSU5HX1NUQVRVUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUEVSRk9STUFOQ0VfTU9OSVRPUklOR19DVVJSRU5UX0RBVEE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUEVSRk9STUFOQ0VfTU9OSVRPUklOR19ISVNUT1JZX0RBVEE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1RYX1BPV0VSX1NVUFBMWV9DT05UUk9MOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdW5rbm93bl9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHVua25vd25fZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh1bmtub3duX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9kZWZfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9lbmRfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9maXJtd2FyZV92ZXJzaW9uX2NvdW50X2Zpcm13YXJlX3ZlcnNpb24oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2ZpbGVfY2hlY2tfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2ZpbGVfY2hlY2tfb3Bjb2RlX3BhY2sodGhpcy0+b3Bjb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b3Bjb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0ZJTEVfQ0hFQ0tfT1BDT0RFX0VORF9ET1dOTE9BRF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmVuZF9kb3dubG9hZF9yZXF1ZXN0LmZpbGVfc2l6ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19GSUxFX0NIRUNLX09QQ09ERV9FTkRfRE9XTkxPQURfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3Jwc19jb2RlX3BhY2sodGhpcy0+dS5lbmRfZG93bmxvYWRfcmVzcG9uc2UucnBzX2NvZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19iYXNlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMjsKKyAgICBzd2l0Y2ggKHRoaXMtPm9wY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19GSUxFX0NIRUNLX09QQ09ERV9FTkRfRE9XTkxPQURfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19GSUxFX0NIRUNLX09QQ09ERV9FTkRfRE9XTkxPQURfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2ZpbGVfY2hlY2tfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19maWxlX2NoZWNrX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19vcGNvZGVfdW5wYWNrKCZ0aGlzLT5vcGNvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfRklMRV9DSEVDS19PUENPREVfRU5EX0RPV05MT0FEX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnUuZW5kX2Rvd25sb2FkX3JlcXVlc3QuZmlsZV9zaXplKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0ZJTEVfQ0hFQ0tfT1BDT0RFX0VORF9ET1dOTE9BRF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfcnBzX2NvZGVfdW5wYWNrKCZ0aGlzLT51LmVuZF9kb3dubG9hZF9yZXNwb25zZS5ycHNfY29kZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2ZpbGVfY2hlY2tfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2ZpbGVfY2hlY2tfb3Bjb2RlIG9wY29kZTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19vcGNvZGVfdW5wYWNrKCZvcGNvZGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChvcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfRklMRV9DSEVDS19PUENPREVfRU5EX0RPV05MT0FEX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0ZJTEVfQ0hFQ0tfT1BDT0RFX0VORF9ET1dOTE9BRF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb3VpX3ZlcnNpb25fcGFpcl9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb3VpX3ZlcnNpb25fcGFpciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpX3BhY2sodGhpcy0+b3VpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnZlcnNpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX291aV92ZXJzaW9uX3BhaXJfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb3VpX3ZlcnNpb25fcGFpciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpX3VucGFjaygmdGhpcy0+b3VpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnZlcnNpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX291aV92ZXJzaW9uX3BhaXJfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2RhdGFfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3BlcmZvcm1hbmNlX21vbml0b3JpbmdfZGF0YSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5kb3duc3RyZWFtX2Ryb3BfZXZlbnRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dXBzdHJlYW1fZHJvcF9ldmVudHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5kb3duc3RyZWFtX29jdGV0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnVwc3RyZWFtX29jdGV0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmRvd25zdHJlYW1fZnJhbWVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dXBzdHJlYW1fZnJhbWVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZG93bnN0cmVhbV9icm9hZGNhc3RfZnJhbWVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dXBzdHJlYW1fYnJvYWRjYXN0X2ZyYW1lcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmRvd25zdHJlYW1fbXVsdGljYXN0X2ZyYW1lcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnVwc3RyZWFtX211bHRpY2FzdF9mcmFtZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5kb3duc3RyZWFtX2NyY19lcnJvcmVkX2ZyYW1lcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnVwc3RyZWFtX2NyY19lcnJvcmVkX2ZyYW1lcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmRvd25zdHJlYW1fdW5kZXJzaXplX2ZyYW1lcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnVwc3RyZWFtX3VuZGVyc2l6ZV9mcmFtZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5kb3duc3RyZWFtX292ZXJzaXplX2ZyYW1lcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnVwc3RyZWFtX292ZXJzaXplX2ZyYW1lcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmRvd25zdHJlYW1fZnJhZ21lbnRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dXBzdHJlYW1fZnJhZ21lbnRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZG93bnN0cmVhbV9qYWJiZXJzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dXBzdHJlYW1famFiYmVycykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmRvd25zdHJlYW1fZnJhbWVzNjRvY3RldHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5kb3duc3RyZWFtX2ZyYW1lczY1dG8xMjdvY3RldHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5kb3duc3RyZWFtX2ZyYW1lczEyOHRvMjU1b2N0ZXRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZG93bnN0cmVhbV9mcmFtZXMyNTZ0bzUxMW9jdGV0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmRvd25zdHJlYW1fZnJhbWVzNTEydG8xMDIzb2N0ZXRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+ZG93bnN0cmVhbV9mcmFtZXMxMDI0dG8xNTE4b2N0ZXRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dXBzdHJlYW1fZnJhbWVzNjRvY3RldHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51cHN0cmVhbV9mcmFtZXM2NXRvMTI3b2N0ZXRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dXBzdHJlYW1fZnJhbWVzMTI4dG8yNTVvY3RldHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51cHN0cmVhbV9mcmFtZXMyNTZ0bzUxMW9jdGV0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnVwc3RyZWFtX2ZyYW1lczUxMnRvMTAyM29jdGV0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnVwc3RyZWFtX2ZyYW1lczEwMjR0bzE1MThvY3RldHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5kb3duc3RyZWFtX2Rpc2NhcmRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dXBzdHJlYW1fZGlzY2FyZHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5kb3duc3RyZWFtX2Vycm9ycykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnVwc3RyZWFtX2Vycm9ycykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnN0YXR1c19jaGFuZ2VfdGltZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3BlcmZvcm1hbmNlX21vbml0b3JpbmdfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2RhdGEgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZG93bnN0cmVhbV9kcm9wX2V2ZW50cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnVwc3RyZWFtX2Ryb3BfZXZlbnRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZG93bnN0cmVhbV9vY3RldHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT51cHN0cmVhbV9vY3RldHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5kb3duc3RyZWFtX2ZyYW1lcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnVwc3RyZWFtX2ZyYW1lcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmRvd25zdHJlYW1fYnJvYWRjYXN0X2ZyYW1lcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnVwc3RyZWFtX2Jyb2FkY2FzdF9mcmFtZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5kb3duc3RyZWFtX211bHRpY2FzdF9mcmFtZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT51cHN0cmVhbV9tdWx0aWNhc3RfZnJhbWVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZG93bnN0cmVhbV9jcmNfZXJyb3JlZF9mcmFtZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT51cHN0cmVhbV9jcmNfZXJyb3JlZF9mcmFtZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5kb3duc3RyZWFtX3VuZGVyc2l6ZV9mcmFtZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT51cHN0cmVhbV91bmRlcnNpemVfZnJhbWVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZG93bnN0cmVhbV9vdmVyc2l6ZV9mcmFtZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT51cHN0cmVhbV9vdmVyc2l6ZV9mcmFtZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5kb3duc3RyZWFtX2ZyYWdtZW50cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnVwc3RyZWFtX2ZyYWdtZW50cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmRvd25zdHJlYW1famFiYmVycykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnVwc3RyZWFtX2phYmJlcnMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5kb3duc3RyZWFtX2ZyYW1lczY0b2N0ZXRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZG93bnN0cmVhbV9mcmFtZXM2NXRvMTI3b2N0ZXRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZG93bnN0cmVhbV9mcmFtZXMxMjh0bzI1NW9jdGV0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmRvd25zdHJlYW1fZnJhbWVzMjU2dG81MTFvY3RldHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5kb3duc3RyZWFtX2ZyYW1lczUxMnRvMTAyM29jdGV0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmRvd25zdHJlYW1fZnJhbWVzMTAyNHRvMTUxOG9jdGV0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnVwc3RyZWFtX2ZyYW1lczY0b2N0ZXRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dXBzdHJlYW1fZnJhbWVzNjV0bzEyN29jdGV0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnVwc3RyZWFtX2ZyYW1lczEyOHRvMjU1b2N0ZXRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dXBzdHJlYW1fZnJhbWVzMjU2dG81MTFvY3RldHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT51cHN0cmVhbV9mcmFtZXM1MTJ0bzEwMjNvY3RldHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT51cHN0cmVhbV9mcmFtZXMxMDI0dG8xNTE4b2N0ZXRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZG93bnN0cmVhbV9kaXNjYXJkcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnVwc3RyZWFtX2Rpc2NhcmRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+ZG93bnN0cmVhbV9lcnJvcnMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT51cHN0cmVhbV9lcnJvcnMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5zdGF0dXNfY2hhbmdlX3RpbWVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2RhdGFfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyOTYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfb3BfY29kZV9wYWNrKHRoaXMtPm9wY29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm9wY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19URlRQX09QX0NPREVfV1JJVEVfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUud3JpdGVfcmVxdWVzdC5maWxlbmFtZV9jb3VudCA+IDApICYmICh0aGlzLT51LndyaXRlX3JlcXVlc3QuZmlsZW5hbWUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZmlsZW5hbWVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZV93cml0ZV9yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUud3JpdGVfcmVxdWVzdC5maWxlbmFtZSwgdGhpcy0+dS53cml0ZV9yZXF1ZXN0LmZpbGVuYW1lX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUud3JpdGVfcmVxdWVzdC5tb2RlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUud3JpdGVfcmVxdWVzdC5tb2RlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm1vZGVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZV93cml0ZV9yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUud3JpdGVfcmVxdWVzdC5tb2RlLCB0aGlzLT51LndyaXRlX3JlcXVlc3QubW9kZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19URlRQX09QX0NPREVfREFUQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5kYXRhLmJsb2NrX251bWJlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmRhdGEuZGF0YV9jb3VudCA+IDApICYmICh0aGlzLT51LmRhdGEuZGF0YSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJkYXRhXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2VfZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmRhdGEuZGF0YSwgdGhpcy0+dS5kYXRhLmRhdGFfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfVEZUUF9PUF9DT0RFX0FDSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5hY2suYmxvY2tfbnVtYmVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1RGVFBfT1BfQ09ERV9FUlJPUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5lcnJvci5jb2RlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZXJyb3IubWVzc2FnZV9jb3VudCA+IDApICYmICh0aGlzLT51LmVycm9yLm1lc3NhZ2UgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibWVzc2FnZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9iYXNlX2Vycm9yXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZXJyb3IubWVzc2FnZSwgdGhpcy0+dS5lcnJvci5tZXNzYWdlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAyOworICAgIHN3aXRjaCAodGhpcy0+b3Bjb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1RGVFBfT1BfQ09ERV9XUklURV9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9ICh0aGlzLT51LndyaXRlX3JlcXVlc3QuZmlsZW5hbWVfY291bnQgKyAxKSArICh0aGlzLT51LndyaXRlX3JlcXVlc3QubW9kZV9jb3VudCArIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19URlRQX09QX0NPREVfREFUQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyICsgdGhpcy0+dS5kYXRhLmRhdGFfY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1RGVFBfT1BfQ09ERV9BQ0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfVEZUUF9PUF9DT0RFX0VSUk9SOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDIgKyAodGhpcy0+dS5lcnJvci5tZXNzYWdlX2NvdW50ICsgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfb3BfY29kZV91bnBhY2soJnRoaXMtPm9wY29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm9wY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19URlRQX09QX0NPREVfV1JJVEVfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLT51LndyaXRlX3JlcXVlc3QuZmlsZW5hbWVfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZV93cml0ZV9yZXF1ZXN0X2NvdW50X2ZpbGVuYW1lKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LndyaXRlX3JlcXVlc3QuZmlsZW5hbWVfY291bnQgPiAwKSAmJiAodGhpcy0+dS53cml0ZV9yZXF1ZXN0LmZpbGVuYW1lID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZmlsZW5hbWVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZV93cml0ZV9yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUud3JpdGVfcmVxdWVzdC5maWxlbmFtZSA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LndyaXRlX3JlcXVlc3QuZmlsZW5hbWVfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LndyaXRlX3JlcXVlc3QuZmlsZW5hbWUsIHRoaXMtPnUud3JpdGVfcmVxdWVzdC5maWxlbmFtZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGhpcy0+dS53cml0ZV9yZXF1ZXN0Lm1vZGVfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZV93cml0ZV9yZXF1ZXN0X2NvdW50X21vZGUoYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUud3JpdGVfcmVxdWVzdC5tb2RlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUud3JpdGVfcmVxdWVzdC5tb2RlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibW9kZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9iYXNlX3dyaXRlX3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS53cml0ZV9yZXF1ZXN0Lm1vZGUgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS53cml0ZV9yZXF1ZXN0Lm1vZGVfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LndyaXRlX3JlcXVlc3QubW9kZSwgdGhpcy0+dS53cml0ZV9yZXF1ZXN0Lm1vZGVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfVEZUUF9PUF9DT0RFX0RBVEE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZGF0YS5ibG9ja19udW1iZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRoaXMtPnUuZGF0YS5kYXRhX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2VfZGF0YV9jb3VudF9kYXRhKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmRhdGEuZGF0YV9jb3VudCA+IDApICYmICh0aGlzLT51LmRhdGEuZGF0YSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImRhdGFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZV9kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZGF0YS5kYXRhID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZGF0YS5kYXRhX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5kYXRhLmRhdGEsIHRoaXMtPnUuZGF0YS5kYXRhX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1RGVFBfT1BfQ09ERV9BQ0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuYWNrLmJsb2NrX251bWJlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19URlRQX09QX0NPREVfRVJST1I6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZXJyb3IuY29kZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGhpcy0+dS5lcnJvci5tZXNzYWdlX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2VfZXJyb3JfY291bnRfbWVzc2FnZShidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5lcnJvci5tZXNzYWdlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZXJyb3IubWVzc2FnZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm1lc3NhZ2VcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZV9lcnJvclwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmVycm9yLm1lc3NhZ2UgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5lcnJvci5tZXNzYWdlX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5lcnJvci5tZXNzYWdlLCB0aGlzLT51LmVycm9yLm1lc3NhZ2VfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9vcF9jb2RlIG9wY29kZTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9vcF9jb2RlX3VucGFjaygmb3Bjb2RlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAob3Bjb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1RGVFBfT1BfQ09ERV9XUklURV9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGZpbGVuYW1lX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHVpbnQzMl90IG1vZGVfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1aW50OF90IGR1bW15OworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZkdW1teSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGR1bW15ID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChmaWxlbmFtZV9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZHVtbXk7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmR1bW15KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoZHVtbXkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBtb2RlX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQobW9kZV9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfVEZUUF9PUF9DT0RFX0RBVEE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgZGF0YV9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBkYXRhX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoZGF0YV9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfVEZUUF9PUF9DT0RFX0FDSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfVEZUUF9PUF9DT0RFX0VSUk9SOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IG1lc3NhZ2VfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZHVtbXk7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmR1bW15KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoZHVtbXkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQobWVzc2FnZV9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZV93cml0ZV9yZXF1ZXN0X2NvdW50X2ZpbGVuYW1lKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgdWludDhfdCBkdW1teTsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIGJ1ZkNsb25lID0gKmJ1ZjsKKyAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZidWZDbG9uZSwgJmR1bW15KSkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZHVtbXkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9iYXNlX3dyaXRlX3JlcXVlc3RfY291bnRfbW9kZShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIHVpbnQ4X3QgZHVtbXk7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBidWZDbG9uZSA9ICpidWY7CisgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmYnVmQ2xvbmUsICZkdW1teSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGR1bW15ID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZV9kYXRhX2NvdW50X2RhdGEoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2VfZXJyb3JfY291bnRfbWVzc2FnZShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIHVpbnQ4X3QgZHVtbXk7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBidWZDbG9uZSA9ICpidWY7CisgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmYnVmQ2xvbmUsICZkdW1teSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGR1bW15ID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9vcGNvZGVfcGFjayh0aGlzLT5vcGNvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfU1dNSVJST1JfT1BDT0RFX0FDVElWQVRFX0lNQUdFX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2FjdGl2YXRlX2ltYWdlX2ZsYWdfcGFjayh0aGlzLT51LmFjdGl2YXRlX2ltYWdlX3JlcXVlc3QuZmxhZywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NXTUlSUk9SX09QQ09ERV9BQ1RJVkFURV9JTUFHRV9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYWNrX3BhY2sodGhpcy0+dS5hY3RpdmF0ZV9pbWFnZV9yZXNwb25zZS5hY2ssIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2Jhc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAyOworICAgIHN3aXRjaCAodGhpcy0+b3Bjb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NXTUlSUk9SX09QQ09ERV9BQ1RJVkFURV9JTUFHRV9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NXTUlSUk9SX09QQ09ERV9BQ1RJVkFURV9JTUFHRV9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX29wY29kZV91bnBhY2soJnRoaXMtPm9wY29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm9wY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19TV01JUlJPUl9PUENPREVfQUNUSVZBVEVfSU1BR0VfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYWN0aXZhdGVfaW1hZ2VfZmxhZ191bnBhY2soJnRoaXMtPnUuYWN0aXZhdGVfaW1hZ2VfcmVxdWVzdC5mbGFnLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfU1dNSVJST1JfT1BDT0RFX0FDVElWQVRFX0lNQUdFX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9hY2tfdW5wYWNrKCZ0aGlzLT51LmFjdGl2YXRlX2ltYWdlX3Jlc3BvbnNlLmFjaywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9vcGNvZGUgb3Bjb2RlOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9vcGNvZGVfdW5wYWNrKCZvcGNvZGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChvcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfU1dNSVJST1JfT1BDT0RFX0FDVElWQVRFX0lNQUdFX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NXTUlSUk9SX09QQ09ERV9BQ1RJVkFURV9JTUFHRV9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfcHJvdl9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19zb2Z0d2FyZV9kb3dubG9hZF9wcm92X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfZGF0YV90eXBlX3BhY2sodGhpcy0+ZGF0YV90eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+ZGF0YV90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NPRlRXQVJFX0RPV05MT0FEX0RBVEFfVFlQRV9URlRQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS50ZnRwLnRpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZV9wYWNrKCZ0aGlzLT51LnRmdHAudGZ0cCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19TT0ZUV0FSRV9ET1dOTE9BRF9EQVRBX1RZUEVfREFUQV9DSEVDS0lORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZGF0YV9jaGVja2luZy50aWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19maWxlX2NoZWNrX2Jhc2VfcGFjaygmdGhpcy0+dS5kYXRhX2NoZWNraW5nLmZpbGVfY2hlY2ssIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfU09GVFdBUkVfRE9XTkxPQURfREFUQV9UWVBFX1NXTUlSUk9SSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5zd21pcnJvcmluZy50aWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9iYXNlX3BhY2soJnRoaXMtPnUuc3dtaXJyb3Jpbmcuc3dtaXJyb3IsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfU09GVFdBUkVfRE9XTkxPQURfREFUQV9UWVBFX0NPTU1JVF9JTUFHRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuY29tbWl0X2ltYWdlLnRpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9iYXNlX3BhY2soJnRoaXMtPnUuY29tbWl0X2ltYWdlLmNvbW1pdF9pbWFnZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfcHJvdl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfcHJvdl9iYXNlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICBzd2l0Y2ggKHRoaXMtPmRhdGFfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19TT0ZUV0FSRV9ET1dOTE9BRF9EQVRBX1RZUEVfVEZUUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA0ICsgYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUudGZ0cC50ZnRwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfU09GVFdBUkVfRE9XTkxPQURfREFUQV9UWVBFX0RBVEFfQ0hFQ0tJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNCArIGJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmRhdGFfY2hlY2tpbmcuZmlsZV9jaGVjayk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NPRlRXQVJFX0RPV05MT0FEX0RBVEFfVFlQRV9TV01JUlJPUklORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA0ICsgYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnN3bWlycm9yaW5nLnN3bWlycm9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfU09GVFdBUkVfRE9XTkxPQURfREFUQV9UWVBFX0NPTU1JVF9JTUFHRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA0ICsgYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5jb21taXRfaW1hZ2UuY29tbWl0X2ltYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3NvZnR3YXJlX2Rvd25sb2FkX3Byb3ZfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19zb2Z0d2FyZV9kb3dubG9hZF9wcm92X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfZGF0YV90eXBlX3VucGFjaygmdGhpcy0+ZGF0YV90eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+ZGF0YV90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NPRlRXQVJFX0RPV05MT0FEX0RBVEFfVFlQRV9URlRQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IGxlbmd0aCA9IDA7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoIC0gMywgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnRmdHAudGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9iYXNlX3VucGFjaygmdGhpcy0+dS50ZnRwLnRmdHAsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgbGVuZ3RoIC0gMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19TT0ZUV0FSRV9ET1dOTE9BRF9EQVRBX1RZUEVfREFUQV9DSEVDS0lORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW5ndGggPSAwOworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCAtIDMsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5kYXRhX2NoZWNraW5nLnRpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2ZpbGVfY2hlY2tfYmFzZV91bnBhY2soJnRoaXMtPnUuZGF0YV9jaGVja2luZy5maWxlX2NoZWNrLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIGxlbmd0aCAtIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfU09GVFdBUkVfRE9XTkxPQURfREFUQV9UWVBFX1NXTUlSUk9SSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IGxlbmd0aCA9IDA7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoIC0gMywgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnN3bWlycm9yaW5nLnRpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2Jhc2VfdW5wYWNrKCZ0aGlzLT51LnN3bWlycm9yaW5nLnN3bWlycm9yLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIGxlbmd0aCAtIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfU09GVFdBUkVfRE9XTkxPQURfREFUQV9UWVBFX0NPTU1JVF9JTUFHRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW5ndGggPSAwOworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCAtIDMsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5jb21taXRfaW1hZ2UudGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2Jhc2VfdW5wYWNrKCZ0aGlzLT51LmNvbW1pdF9pbWFnZS5jb21taXRfaW1hZ2UsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgbGVuZ3RoIC0gMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19zb2Z0d2FyZV9kb3dubG9hZF9wcm92X2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19zb2Z0d2FyZV9kb3dubG9hZF9kYXRhX3R5cGUgZGF0YV90eXBlOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19zb2Z0d2FyZV9kb3dubG9hZF9kYXRhX3R5cGVfdW5wYWNrKCZkYXRhX3R5cGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChkYXRhX3R5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfU09GVFdBUkVfRE9XTkxPQURfREFUQV9UWVBFX1RGVFA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQxNl90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCAtIDMsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2Vfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCAtIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfU09GVFdBUkVfRE9XTkxPQURfREFUQV9UWVBFX0RBVEFfQ0hFQ0tJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQxNl90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCAtIDMsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19maWxlX2NoZWNrX2Jhc2Vfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCAtIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfU09GVFdBUkVfRE9XTkxPQURfREFUQV9UWVBFX1NXTUlSUk9SSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGggLSAzLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYmFzZV9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuZ3RoIC0gMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19TT0ZUV0FSRV9ET1dOTE9BRF9EQVRBX1RZUEVfQ09NTUlUX0lNQUdFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGggLSAzLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2Jhc2Vfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCAtIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdHF1ZXVlX2Ryb3BfY291bnRlcl9wYWNrKGJjbW9sdF9lcG9uX29hbV9rdHF1ZXVlX2Ryb3BfY291bnRlciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT50eGJ5dGVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+ZHJvcHBlZF9mcmFtZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fa3RxdWV1ZV9kcm9wX2NvdW50ZXJfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9rdHF1ZXVlX2Ryb3BfY291bnRlciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT50eGJ5dGVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+ZHJvcHBlZF9mcmFtZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fa3RxdWV1ZV9kcm9wX2NvdW50ZXJfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA4KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0YXR0cmlidXRlX3ZhbHVlX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fa3RhdHRyaWJ1dGVfdmFsdWVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYXR0cmlidXRlX3BhY2sodGhpcy0+bGVhZiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+d2lkdGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPndpZHRoKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5sZWFmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9QT1JUX0RPV05TVFJFQU1fUkFURV9TSEFQSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS5wb3J0X2Rvd25zdHJlYW1fcmF0ZV9zaGFwaW5nLmlzX2FjdGl2YXRlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UyNChidWYsIHRoaXMtPnUucG9ydF9kb3duc3RyZWFtX3JhdGVfc2hhcGluZy5yYXRlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9PTlVfTUFDX0xJTUlUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS5vbnVfbWFjX2xpbWl0LmlzX2FjdGl2YXRlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfbWFjX2xpbWl0LmxpbWl0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9CTE9DS19VTkJMT0NLX09OVV9UUkFGRklDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS5ibG9ja191bmJsb2NrX29udV90cmFmZmljLmJsb2NrKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9PTlVfRElBR05PU1RJQ1M6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUub251X2RpYWdub3N0aWNzLm9wdGljc19tb2R1bGVfdGVtcGVyYXR1cmUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lm9udV9kaWFnbm9zdGljcy50eG9wdGljc19wb3dlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUub251X2RpYWdub3N0aWNzLnJ4b3B0aWNzX3Bvd2VyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9PTlVfUVVFVUVfRFJPUF9DT1VOVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfcXVldWVfZHJvcF9jb3VudGVyLnVwc3RyZWFtX3F1ZXVlc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm9udV9xdWV1ZV9kcm9wX2NvdW50ZXIudXBzdHJlYW1fcXVldWVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUub251X3F1ZXVlX2Ryb3BfY291bnRlci51cHN0cmVhbV9xdWV1ZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidXBzdHJlYW1fcXVldWVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2t0YXR0cmlidXRlX3ZhbHVlX2Jhc2Vfb251X3F1ZXVlX2Ryb3BfY291bnRlclwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51Lm9udV9xdWV1ZV9kcm9wX2NvdW50ZXIudXBzdHJlYW1fcXVldWVzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fa3RxdWV1ZV9kcm9wX2NvdW50ZXJfcGFjaygmdGhpcy0+dS5vbnVfcXVldWVfZHJvcF9jb3VudGVyLnVwc3RyZWFtX3F1ZXVlc1tpMF0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX0VUSEVSTkVUX1BPUlRfQ09VTlRFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5ldGhlcm5ldF9wb3J0X2NvdW50ZXIuY291bnRlcl9iaXRfbWFzaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUuZXRoZXJuZXRfcG9ydF9jb3VudGVyLnR4ZnJhbWVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5ldGhlcm5ldF9wb3J0X2NvdW50ZXIudHhieXRlcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUuZXRoZXJuZXRfcG9ydF9jb3VudGVyLnR4bXVsdGljYXN0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5ldGhlcm5ldF9wb3J0X2NvdW50ZXIudHhicm9hZGNhc3QpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LmV0aGVybmV0X3BvcnRfY291bnRlci50eGRyb3BwZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LmV0aGVybmV0X3BvcnRfY291bnRlci5yeGZyYW1lcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUuZXRoZXJuZXRfcG9ydF9jb3VudGVyLnJ4Ynl0ZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LmV0aGVybmV0X3BvcnRfY291bnRlci5yeG11bHRpY2FzdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUuZXRoZXJuZXRfcG9ydF9jb3VudGVyLnJ4YnJvYWRjYXN0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5ldGhlcm5ldF9wb3J0X2NvdW50ZXIucnhvdmVyc2l6ZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LmV0aGVybmV0X3BvcnRfY291bnRlci5yeHVuZGVyc2l6ZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LmV0aGVybmV0X3BvcnRfY291bnRlci5yeGNyY19lcnJvcnMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX0VUSEVSTkVUX1BPUlRfUlNUUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUuZXRoZXJuZXRfcG9ydF9yc3RwLmVuYWJsZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX0xPT1BfREVURUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS5sb29wX2RldGVjdC5lbmFibGVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lmxvb3BfZGV0ZWN0LmludGVydmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lmxvb3BfZGV0ZWN0LmJsb2NrX3RpbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX09OVV9NUENQX0NPVU5URVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUub251X21wY3BfY291bnRlci5jb3VudGVyX2JpdF9tYXNrKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfbXBjcF9jb3VudGVyLnJ4aGVjX2Vycm9ycykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUub251X21wY3BfY291bnRlci5yeHJlZ2lzdGVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfbXBjcF9jb3VudGVyLnR4cmVnaXN0ZXJfYWNrKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfbXBjcF9jb3VudGVyLnJ4Z2F0ZV9mcmFtZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm9udV9tcGNwX2NvdW50ZXIudHhyZXBvcnRfZnJhbWVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9PUFRJQ0FMX1BPV0VSX0FMQVJNX1NUQVRVUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUub3B0aWNhbF9wb3dlcl9hbGFybV9zdGF0dXMuZW5hYmxlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fa3RvcHRpY2FsX3Bvd2VyX2FsYXJtX3N0YXR1c19wYWNrKHRoaXMtPnUub3B0aWNhbF9wb3dlcl9hbGFybV9zdGF0dXMuYWxhcm1fc3RhdHVzLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX1NUQVRJQ19NQUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnN0YXRpY19tYWMubWFjc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnN0YXRpY19tYWMubWFjc19jb3VudCA+IDApICYmICh0aGlzLT51LnN0YXRpY19tYWMubWFjcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJtYWNzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2t0YXR0cmlidXRlX3ZhbHVlX2Jhc2Vfc3RhdGljX21hY1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LnN0YXRpY19tYWMubWFjc19jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPnUuc3RhdGljX21hYy5tYWNzW2kxXSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9rdGF0dHJpYnV0ZV92YWx1ZV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9rdGF0dHJpYnV0ZV92YWx1ZV9iYXNlICp0aGlzKQoreworICAgIGlmICh0aGlzLT53aWR0aCA+PSAweDAwODApCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy0+d2lkdGg7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHVpbnQzMl90IGNvdW50ID0gMzsKKyAgICAgICAgc3dpdGNoICh0aGlzLT5sZWFmKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX1BPUlRfRE9XTlNUUkVBTV9SQVRFX1NIQVBJTkc6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfT05VX01BQ19MSU1JVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9CTE9DS19VTkJMT0NLX09OVV9UUkFGRklDOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX09OVV9ESUFHTk9TVElDUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9PTlVfUVVFVUVfRFJPUF9DT1VOVEVSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMSArICg4ICogdGhpcy0+dS5vbnVfcXVldWVfZHJvcF9jb3VudGVyLnVwc3RyZWFtX3F1ZXVlc19jb3VudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9FVEhFUk5FVF9QT1JUX0NPVU5URVI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA5ODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX0VUSEVSTkVUX1BPUlRfUlNUUDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9MT09QX0RFVEVDVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9PTlVfTVBDUF9DT1VOVEVSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9PUFRJQ0FMX1BPV0VSX0FMQVJNX1NUQVRVUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9TVEFUSUNfTUFDOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMSArICg2ICogdGhpcy0+dS5zdGF0aWNfbWFjLm1hY3NfY291bnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdGF0dHJpYnV0ZV92YWx1ZV9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fa3RhdHRyaWJ1dGVfdmFsdWVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYXR0cmlidXRlX3VucGFjaygmdGhpcy0+bGVhZiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT53aWR0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPndpZHRoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+d2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT5sZWFmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9QT1JUX0RPV05TVFJFQU1fUkFURV9TSEFQSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBvcnRfZG93bnN0cmVhbV9yYXRlX3NoYXBpbmcuaXNfYWN0aXZhdGVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBvcnRfZG93bnN0cmVhbV9yYXRlX3NoYXBpbmcucmF0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfT05VX01BQ19MSU1JVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfbWFjX2xpbWl0LmlzX2FjdGl2YXRlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9tYWNfbGltaXQubGltaXQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX0JMT0NLX1VOQkxPQ0tfT05VX1RSQUZGSUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuYmxvY2tfdW5ibG9ja19vbnVfdHJhZmZpYy5ibG9jaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfT05VX0RJQUdOT1NUSUNTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X2RpYWdub3N0aWNzLm9wdGljc19tb2R1bGVfdGVtcGVyYXR1cmUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X2RpYWdub3N0aWNzLnR4b3B0aWNzX3Bvd2VyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9kaWFnbm9zdGljcy5yeG9wdGljc19wb3dlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfT05VX1FVRVVFX0RST1BfQ09VTlRFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcXVldWVfZHJvcF9jb3VudGVyLnVwc3RyZWFtX3F1ZXVlc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm9udV9xdWV1ZV9kcm9wX2NvdW50ZXIudXBzdHJlYW1fcXVldWVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUub251X3F1ZXVlX2Ryb3BfY291bnRlci51cHN0cmVhbV9xdWV1ZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1cHN0cmVhbV9xdWV1ZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fa3RhdHRyaWJ1dGVfdmFsdWVfYmFzZV9vbnVfcXVldWVfZHJvcF9jb3VudGVyXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUub251X3F1ZXVlX2Ryb3BfY291bnRlci51cHN0cmVhbV9xdWV1ZXMgPSAoYmNtb2x0X2Vwb25fb2FtX2t0cXVldWVfZHJvcF9jb3VudGVyICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51Lm9udV9xdWV1ZV9kcm9wX2NvdW50ZXIudXBzdHJlYW1fcXVldWVzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9rdHF1ZXVlX2Ryb3BfY291bnRlcikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5vbnVfcXVldWVfZHJvcF9jb3VudGVyLnVwc3RyZWFtX3F1ZXVlc19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2t0cXVldWVfZHJvcF9jb3VudGVyX3VucGFjaygmdGhpcy0+dS5vbnVfcXVldWVfZHJvcF9jb3VudGVyLnVwc3RyZWFtX3F1ZXVlc1tpMF0sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9FVEhFUk5FVF9QT1JUX0NPVU5URVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5ldGhlcm5ldF9wb3J0X2NvdW50ZXIuY291bnRlcl9iaXRfbWFzaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5ldGhlcm5ldF9wb3J0X2NvdW50ZXIudHhmcmFtZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZXRoZXJuZXRfcG9ydF9jb3VudGVyLnR4Ynl0ZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZXRoZXJuZXRfcG9ydF9jb3VudGVyLnR4bXVsdGljYXN0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmV0aGVybmV0X3BvcnRfY291bnRlci50eGJyb2FkY2FzdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5ldGhlcm5ldF9wb3J0X2NvdW50ZXIudHhkcm9wcGVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmV0aGVybmV0X3BvcnRfY291bnRlci5yeGZyYW1lcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5ldGhlcm5ldF9wb3J0X2NvdW50ZXIucnhieXRlcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5ldGhlcm5ldF9wb3J0X2NvdW50ZXIucnhtdWx0aWNhc3QpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZXRoZXJuZXRfcG9ydF9jb3VudGVyLnJ4YnJvYWRjYXN0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmV0aGVybmV0X3BvcnRfY291bnRlci5yeG92ZXJzaXplZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5ldGhlcm5ldF9wb3J0X2NvdW50ZXIucnh1bmRlcnNpemVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmV0aGVybmV0X3BvcnRfY291bnRlci5yeGNyY19lcnJvcnMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX0VUSEVSTkVUX1BPUlRfUlNUUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5ldGhlcm5ldF9wb3J0X3JzdHAuZW5hYmxlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfTE9PUF9ERVRFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUubG9vcF9kZXRlY3QuZW5hYmxlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lmxvb3BfZGV0ZWN0LmludGVydmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUubG9vcF9kZXRlY3QuYmxvY2tfdGltZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfT05VX01QQ1BfQ09VTlRFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9tcGNwX2NvdW50ZXIuY291bnRlcl9iaXRfbWFzaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfbXBjcF9jb3VudGVyLnJ4aGVjX2Vycm9ycykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfbXBjcF9jb3VudGVyLnJ4cmVnaXN0ZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X21wY3BfY291bnRlci50eHJlZ2lzdGVyX2FjaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfbXBjcF9jb3VudGVyLnJ4Z2F0ZV9mcmFtZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X21wY3BfY291bnRlci50eHJlcG9ydF9mcmFtZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX09QVElDQUxfUE9XRVJfQUxBUk1fU1RBVFVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9wdGljYWxfcG93ZXJfYWxhcm1fc3RhdHVzLmVuYWJsZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2t0b3B0aWNhbF9wb3dlcl9hbGFybV9zdGF0dXNfdW5wYWNrKCZ0aGlzLT51Lm9wdGljYWxfcG93ZXJfYWxhcm1fc3RhdHVzLmFsYXJtX3N0YXR1cywgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX1NUQVRJQ19NQUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc3RhdGljX21hYy5tYWNzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc3RhdGljX21hYy5tYWNzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc3RhdGljX21hYy5tYWNzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibWFjc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9rdGF0dHJpYnV0ZV92YWx1ZV9iYXNlX3N0YXRpY19tYWNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5zdGF0aWNfbWFjLm1hY3MgPSAoYmNtb3NfbWFjX2FkZHJlc3MgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuc3RhdGljX21hYy5tYWNzX2NvdW50ICogc2l6ZW9mKGJjbW9zX21hY19hZGRyZXNzKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LnN0YXRpY19tYWMubWFjc19jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX21hY19hZGRyZXNzKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zdGF0aWNfbWFjLm1hY3NbaTFdKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPndpZHRoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0YXR0cmlidXRlX3ZhbHVlX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hdHRyaWJ1dGUgbGVhZjsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDhfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2F0dHJpYnV0ZV91bnBhY2soJmxlYWYsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICBzd2l0Y2ggKGxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX1BPUlRfRE9XTlNUUkVBTV9SQVRFX1NIQVBJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9PTlVfTUFDX0xJTUlUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfQkxPQ0tfVU5CTE9DS19PTlVfVFJBRkZJQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfT05VX0RJQUdOT1NUSUNTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX09OVV9RVUVVRV9EUk9QX0NPVU5URVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCB1cHN0cmVhbV9xdWV1ZXNfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ1cHN0cmVhbV9xdWV1ZXNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2t0cXVldWVfZHJvcF9jb3VudGVyKSAqIHVwc3RyZWFtX3F1ZXVlc19jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIHVwc3RyZWFtX3F1ZXVlc19jb3VudCAqIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX0VUSEVSTkVUX1BPUlRfQ09VTlRFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfRVRIRVJORVRfUE9SVF9SU1RQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9MT09QX0RFVEVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9PTlVfTVBDUF9DT1VOVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX09QVElDQUxfUE9XRVJfQUxBUk1fU1RBVFVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfU1RBVElDX01BQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IG1hY3NfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZtYWNzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9zX21hY19hZGRyZXNzKSAqIG1hY3NfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCBtYWNzX2NvdW50ICogNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fa3RhY3Rpb25fdmFsdWVfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9rdGFjdGlvbl92YWx1ZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2FjdGlvbl9wYWNrKHRoaXMtPmxlYWYsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5sZWFmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FDVElPTl9PTlVfQ09VTlRFUl9DTEVBUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQUNUSU9OX1JFU1RPUkVfT05VOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5yZXN0b3JlX29udS51bmtub3duX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUucmVzdG9yZV9vbnUudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmtub3duXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2t0YWN0aW9uX3ZhbHVlX2Jhc2VfcmVzdG9yZV9vbnVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5yZXN0b3JlX29udS51bmtub3duLCB0aGlzLT51LnJlc3RvcmVfb251LnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQUNUSU9OX1RYUE9XRVJfT0ZGOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS50eHBvd2VyX29mZi5sZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUudHhwb3dlcl9vZmYubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT51LnR4cG93ZXJfb2ZmLmlzX3Bvd2VyX29mZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS50eHBvd2VyX29mZi5kdXJhdGlvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FDVElPTl9FTkQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9rdGFjdGlvbl92YWx1ZV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9rdGFjdGlvbl92YWx1ZV9iYXNlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMjsKKyAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQUNUSU9OX09OVV9DT1VOVEVSX0NMRUFSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BQ1RJT05fUkVTVE9SRV9PTlU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gdGhpcy0+dS5yZXN0b3JlX29udS51bmtub3duX2NvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BQ1RJT05fVFhQT1dFUl9PRkY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQUNUSU9OX0VORDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0YWN0aW9uX3ZhbHVlX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9rdGFjdGlvbl92YWx1ZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2FjdGlvbl91bnBhY2soJnRoaXMtPmxlYWYsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5sZWFmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FDVElPTl9PTlVfQ09VTlRFUl9DTEVBUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQUNUSU9OX1JFU1RPUkVfT05VOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMtPnUucmVzdG9yZV9vbnUudW5rbm93bl9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9rdGFjdGlvbl92YWx1ZV9iYXNlX3Jlc3RvcmVfb251X2NvdW50X3Vua25vd24oYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUucmVzdG9yZV9vbnUudW5rbm93bl9jb3VudCA+IDApICYmICh0aGlzLT51LnJlc3RvcmVfb251LnVua25vd24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmtub3duXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2t0YWN0aW9uX3ZhbHVlX2Jhc2VfcmVzdG9yZV9vbnVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5yZXN0b3JlX29udS51bmtub3duID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUucmVzdG9yZV9vbnUudW5rbm93bl9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUucmVzdG9yZV9vbnUudW5rbm93biwgdGhpcy0+dS5yZXN0b3JlX29udS51bmtub3duX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FDVElPTl9UWFBPV0VSX09GRjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS50eHBvd2VyX29mZi5sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LnR4cG93ZXJfb2ZmLmxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LnR4cG93ZXJfb2ZmLmxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUudHhwb3dlcl9vZmYubGVuZ3RoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51LnR4cG93ZXJfb2ZmLmlzX3Bvd2VyX29mZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnR4cG93ZXJfb2ZmLmR1cmF0aW9uKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LnR4cG93ZXJfb2ZmLmxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUudHhwb3dlcl9vZmYubGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FDVElPTl9FTkQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0YWN0aW9uX3ZhbHVlX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hY3Rpb24gbGVhZjsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYWN0aW9uX3VucGFjaygmbGVhZiwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQUNUSU9OX09OVV9DT1VOVEVSX0NMRUFSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BQ1RJT05fUkVTVE9SRV9PTlU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdW5rbm93bl9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bl9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHVua25vd25fZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FDVElPTl9UWFBPV0VSX09GRjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BQ1RJT05fRU5EOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fa3RhY3Rpb25fdmFsdWVfYmFzZV9yZXN0b3JlX29udV9jb3VudF91bmtub3duKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfY29udGFpbmVyX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9jb250YWluZXJfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19icmFuY2hfcGFjayh0aGlzLT5icmFuY2gsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5icmFuY2gpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5lbmQudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmtub3duXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfY29udGFpbmVyX2Jhc2VfZW5kXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZW5kLnVua25vd24sIHRoaXMtPnUuZW5kLnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfcGFjaygmdGhpcy0+dS5hdHRyaWJ1dGUuYXR0cmlidXRlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfYWN0aW9uX3ZhbHVlX3BhY2soJnRoaXMtPnUuYWN0aW9uLmFjdGlvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9PTERfTUFOQUdFTUVOVF9PQkpFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29sZF9tYW5hZ2VtZW50X29iamVjdF9iYXNlX3BhY2soJnRoaXMtPnUub2xkX21hbmFnZW1lbnRfb2JqZWN0Lm9iamVjdCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9NQU5BR0VNRU5UX09CSkVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbWFuYWdlbWVudF9vYmplY3RfYmFzZV9wYWNrKCZ0aGlzLT51Lm1hbmFnZW1lbnRfb2JqZWN0Lm9iamVjdCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FWFRfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfcGFjaygmdGhpcy0+dS5leHRfYXR0cmlidXRlLmF0dHJpYnV0ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FWFRfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYWN0aW9uX3ZhbHVlX2Jhc2VfcGFjaygmdGhpcy0+dS5leHRfYWN0aW9uLmF0dHJpYnV0ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9LVEFUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9rdGF0dHJpYnV0ZV92YWx1ZV9iYXNlX3BhY2soJnRoaXMtPnUua3RhdHRyaWJ1dGUuYXR0cmlidXRlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0tUQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2t0YWN0aW9uX3ZhbHVlX2Jhc2VfcGFjaygmdGhpcy0+dS5rdGFjdGlvbi5hdHRyaWJ1dGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmRlZi5sZWFmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5kZWYubGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmRlZi5sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfY29udGFpbmVyX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfY29udGFpbmVyX2Jhc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+YnJhbmNoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fY3RjX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmF0dHJpYnV0ZS5hdHRyaWJ1dGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9jdGNfYWN0aW9uX3ZhbHVlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmFjdGlvbi5hY3Rpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfT0xEX01BTkFHRU1FTlRfT0JKRUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9jdGNfb2xkX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUub2xkX21hbmFnZW1lbnRfb2JqZWN0Lm9iamVjdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9NQU5BR0VNRU5UX09CSkVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fY3RjX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUubWFuYWdlbWVudF9vYmplY3Qub2JqZWN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0VYVF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZXh0X2F0dHJpYnV0ZS5hdHRyaWJ1dGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfRVhUX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hY3Rpb25fdmFsdWVfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5leHRfYWN0aW9uLmF0dHJpYnV0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9LVEFUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fa3RhdHRyaWJ1dGVfdmFsdWVfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5rdGF0dHJpYnV0ZS5hdHRyaWJ1dGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfS1RBQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2t0YWN0aW9uX3ZhbHVlX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUua3RhY3Rpb24uYXR0cmlidXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2NvbnRhaW5lcl9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9jb250YWluZXJfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19icmFuY2hfdW5wYWNrKCZ0aGlzLT5icmFuY2gsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5icmFuY2gpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLT51LmVuZC51bmtub3duX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfY29udGFpbmVyX2Jhc2VfZW5kX2NvdW50X3Vua25vd24oYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5lbmQudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVua25vd25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9jb250YWluZXJfYmFzZV9lbmRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5lbmQudW5rbm93biA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmVuZC51bmtub3duX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5lbmQudW5rbm93biwgdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19hdHRyaWJ1dGVfdmFsdWVfYmFzZV91bnBhY2soJnRoaXMtPnUuYXR0cmlidXRlLmF0dHJpYnV0ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfYWN0aW9uX3ZhbHVlX3VucGFjaygmdGhpcy0+dS5hY3Rpb24uYWN0aW9uLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfT0xEX01BTkFHRU1FTlRfT0JKRUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vbGRfbWFuYWdlbWVudF9vYmplY3RfYmFzZV91bnBhY2soJnRoaXMtPnUub2xkX21hbmFnZW1lbnRfb2JqZWN0Lm9iamVjdCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX01BTkFHRU1FTlRfT0JKRUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19tYW5hZ2VtZW50X29iamVjdF9iYXNlX3VucGFjaygmdGhpcy0+dS5tYW5hZ2VtZW50X29iamVjdC5vYmplY3QsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FWFRfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfdW5wYWNrKCZ0aGlzLT51LmV4dF9hdHRyaWJ1dGUuYXR0cmlidXRlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfRVhUX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2FjdGlvbl92YWx1ZV9iYXNlX3VucGFjaygmdGhpcy0+dS5leHRfYWN0aW9uLmF0dHJpYnV0ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0tUQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2t0YXR0cmlidXRlX3ZhbHVlX2Jhc2VfdW5wYWNrKCZ0aGlzLT51Lmt0YXR0cmlidXRlLmF0dHJpYnV0ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0tUQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2t0YWN0aW9uX3ZhbHVlX2Jhc2VfdW5wYWNrKCZ0aGlzLT51Lmt0YWN0aW9uLmF0dHJpYnV0ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5kZWYubGVhZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5kZWYubGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5kZWYubGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUuZGVmLmxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuZGVmLmxlbmd0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LmRlZi5sZW5ndGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmRlZi5sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9jb250YWluZXJfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2JyYW5jaCBicmFuY2g7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2JyYW5jaF91bnBhY2soJmJyYW5jaCwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHVua25vd25fZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHVua25vd25fZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh1bmtub3duX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19hdHRyaWJ1dGVfdmFsdWVfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2FjdGlvbl92YWx1ZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9PTERfTUFOQUdFTUVOVF9PQkpFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29sZF9tYW5hZ2VtZW50X29iamVjdF9iYXNlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX01BTkFHRU1FTlRfT0JKRUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19tYW5hZ2VtZW50X29iamVjdF9iYXNlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0VYVF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FWFRfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYWN0aW9uX3ZhbHVlX2Jhc2Vfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfS1RBVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fa3RhdHRyaWJ1dGVfdmFsdWVfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9LVEFDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9rdGFjdGlvbl92YWx1ZV9iYXNlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2NvbnRhaW5lcl9iYXNlX2VuZF9jb3VudF91bmtub3duKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfZGVzY3JpcHRvcl9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2Rlc2NyaXB0b3IgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfYnJhbmNoX3BhY2sodGhpcy0+YnJhbmNoLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+YnJhbmNoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmVuZC51bmtub3duX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZW5kLnVua25vd24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidW5rbm93blwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2Rlc2NyaXB0b3JfZW5kXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZW5kLnVua25vd24sIHRoaXMtPnUuZW5kLnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hdHRyaWJ1dGVfcGFjayh0aGlzLT51LmF0dHJpYnV0ZS5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hY3Rpb25fcGFjayh0aGlzLT51LmFjdGlvbi5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX09MRF9NQU5BR0VNRU5UX09CSkVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb2xkX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2VfcGFjaygmdGhpcy0+dS5vbGRfbWFuYWdlbWVudF9vYmplY3QudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfTUFOQUdFTUVOVF9PQkpFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2VfcGFjaygmdGhpcy0+dS5tYW5hZ2VtZW50X29iamVjdC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FWFRfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hdHRyaWJ1dGVfcGFjayh0aGlzLT51LmV4dF9hdHRyaWJ1dGUubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FWFRfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hY3Rpb25fcGFjayh0aGlzLT51LmV4dF9hY3Rpb24ubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9LVEFUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYXR0cmlidXRlX3BhY2sodGhpcy0+dS5rdGF0dHJpYnV0ZS5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0tUQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hY3Rpb25fcGFjayh0aGlzLT51Lmt0YWN0aW9uLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZGVmLmxlYWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfZGVzY3JpcHRvcl9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9kZXNjcmlwdG9yICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICBzd2l0Y2ggKHRoaXMtPmJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IHRoaXMtPnUuZW5kLnVua25vd25fY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfT0xEX01BTkFHRU1FTlRfT0JKRUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9jdGNfb2xkX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUub2xkX21hbmFnZW1lbnRfb2JqZWN0LnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX01BTkFHRU1FTlRfT0JKRUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9jdGNfbWFuYWdlbWVudF9vYmplY3RfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5tYW5hZ2VtZW50X29iamVjdC52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FWFRfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FWFRfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9LVEFUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfS1RBQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2Rlc2NyaXB0b3JfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2Rlc2NyaXB0b3IgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfYnJhbmNoX3VucGFjaygmdGhpcy0+YnJhbmNoLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+YnJhbmNoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2Rlc2NyaXB0b3JfZW5kX2NvdW50X3Vua25vd24oYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5lbmQudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVua25vd25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9kZXNjcmlwdG9yX2VuZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmVuZC51bmtub3duID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LmVuZC51bmtub3duLCB0aGlzLT51LmVuZC51bmtub3duX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlX3VucGFjaygmdGhpcy0+dS5hdHRyaWJ1dGUubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uX3VucGFjaygmdGhpcy0+dS5hY3Rpb24ubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9PTERfTUFOQUdFTUVOVF9PQkpFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29sZF9tYW5hZ2VtZW50X29iamVjdF9iYXNlX3VucGFjaygmdGhpcy0+dS5vbGRfbWFuYWdlbWVudF9vYmplY3QudmFsdWUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9NQU5BR0VNRU5UX09CSkVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfbWFuYWdlbWVudF9vYmplY3RfYmFzZV91bnBhY2soJnRoaXMtPnUubWFuYWdlbWVudF9vYmplY3QudmFsdWUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FWFRfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hdHRyaWJ1dGVfdW5wYWNrKCZ0aGlzLT51LmV4dF9hdHRyaWJ1dGUubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FWFRfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hY3Rpb25fdW5wYWNrKCZ0aGlzLT51LmV4dF9hY3Rpb24ubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9LVEFUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYXR0cmlidXRlX3VucGFjaygmdGhpcy0+dS5rdGF0dHJpYnV0ZS5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0tUQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hY3Rpb25fdW5wYWNrKCZ0aGlzLT51Lmt0YWN0aW9uLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZGVmLmxlYWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9kZXNjcmlwdG9yX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfYnJhbmNoIGJyYW5jaDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfYnJhbmNoX3VucGFjaygmYnJhbmNoLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAoYnJhbmNoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdW5rbm93bl9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bl9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHVua25vd25fZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9PTERfTUFOQUdFTUVOVF9PQkpFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29sZF9tYW5hZ2VtZW50X29iamVjdF9iYXNlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX01BTkFHRU1FTlRfT0JKRUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19tYW5hZ2VtZW50X29iamVjdF9iYXNlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0VYVF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FWFRfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfS1RBVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9LVEFDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9kZXNjcmlwdG9yX2VuZF9jb3VudF91bmtub3duKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0b251X2V2ZW50X2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9rdG9udV9ldmVudF90eXBlX3BhY2sodGhpcy0+dHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVE9OVV9FVkVOVF9UWVBFX0xPT1BfREVURUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2t0bG9vcF9kZXRlY3RfZXZlbnRfcGFjayh0aGlzLT51Lmxvb3BfZGV0ZWN0LmV2ZW50LCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVE9OVV9FVkVOVF9UWVBFX09QVElDQUxfUE9XRVJfQUxBUk06CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fa3RvcHRpY2FsX3Bvd2VyX2FsYXJtX2V2ZW50X3BhY2sodGhpcy0+dS5vcHRpY2FsX3Bvd2VyX2FsYXJtLmV2ZW50LCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVE9OVV9FVkVOVF9UWVBFX0VORDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9rdG9udV9ldmVudF9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9rdG9udV9ldmVudF9iYXNlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMjsKKyAgICBzd2l0Y2ggKHRoaXMtPnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVE9OVV9FVkVOVF9UWVBFX0xPT1BfREVURUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RPTlVfRVZFTlRfVFlQRV9PUFRJQ0FMX1BPV0VSX0FMQVJNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RPTlVfRVZFTlRfVFlQRV9FTkQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdG9udV9ldmVudF9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgbGVuZ3RoID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfdHlwZV91bnBhY2soJnRoaXMtPnR5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCAtIDIsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT50eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RPTlVfRVZFTlRfVFlQRV9MT09QX0RFVEVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9rdGxvb3BfZGV0ZWN0X2V2ZW50X3VucGFjaygmdGhpcy0+dS5sb29wX2RldGVjdC5ldmVudCwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9LVE9OVV9FVkVOVF9UWVBFX09QVElDQUxfUE9XRVJfQUxBUk06CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fa3RvcHRpY2FsX3Bvd2VyX2FsYXJtX2V2ZW50X3VucGFjaygmdGhpcy0+dS5vcHRpY2FsX3Bvd2VyX2FsYXJtLmV2ZW50LCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUT05VX0VWRU5UX1RZUEVfRU5EOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCBsZW5ndGggLSAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0b251X2V2ZW50X2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2t0b251X2V2ZW50X3R5cGUgdHlwZTsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDhfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfdHlwZV91bnBhY2soJnR5cGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCAtIDIsIHBhY2tlZC0+Y3Vycik7CisgICAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fS1RPTlVfRVZFTlRfVFlQRV9MT09QX0RFVEVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUT05VX0VWRU5UX1RZUEVfT1BUSUNBTF9QT1dFUl9BTEFSTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0tUT05VX0VWRU5UX1RZUEVfRU5EOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBsZW5ndGggLSAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb3Bjb2RlX3BhY2sodGhpcy0+b3AsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vcCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfR0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9yZXF1ZXN0LnZhcnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX2dldF9yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUuZ2V0X3JlcXVlc3QudmFyc19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfZGVzY3JpcHRvcl9wYWNrKCZ0aGlzLT51LmdldF9yZXF1ZXN0LnZhcnNbaTBdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9HRVRfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTE7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9yZXNwb25zZS52YXJzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfZ2V0X3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2NvbnRhaW5lcl9iYXNlX3BhY2soJnRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNbaTFdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9TRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMjsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X3JlcXVlc3QudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2Vfc2V0X3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMiA9IDA7IGkyIDwgdGhpcy0+dS5zZXRfcmVxdWVzdC52YXJzX2NvdW50OyBpMisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9jb250YWluZXJfYmFzZV9wYWNrKCZ0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnNbaTJdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9TRVRfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTM7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF9yZXNwb25zZS52YXJzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnZhcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2Vfc2V0X3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnZhcnNfY291bnQ7IGkzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZW1wdHlfdmFyX2NvbnRhaW5lcl9iYXNlX3BhY2soJnRoaXMtPnUuc2V0X3Jlc3BvbnNlLnZhcnNbaTNdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9TT0ZUV0FSRV9ET1dOTE9BRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpNDsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc29mdHdhcmVfZG93bmxvYWQubWVzc2FnZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zb2Z0d2FyZV9kb3dubG9hZC5tZXNzYWdlcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJtZXNzYWdlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2Vfc29mdHdhcmVfZG93bmxvYWRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNCA9IDA7IGk0IDwgdGhpcy0+dS5zb2Z0d2FyZV9kb3dubG9hZC5tZXNzYWdlc19jb3VudDsgaTQrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19zb2Z0d2FyZV9kb3dubG9hZF9wcm92X2Jhc2VfcGFjaygmdGhpcy0+dS5zb2Z0d2FyZV9kb3dubG9hZC5tZXNzYWdlc1tpNF0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX09OVV9BVVRIRU5USUNBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb251X2F1dGhfY29kZV9wYWNrKHRoaXMtPnUub251X2F1dGhlbnRpY2F0aW9uLmNvZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUub251X2F1dGhlbnRpY2F0aW9uLmF1dGhlbnRpY2F0aW9uX2RhdGFfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5vbnVfYXV0aGVudGljYXRpb24uYXV0aGVudGljYXRpb25fZGF0YV9jb3VudCA+IDApICYmICh0aGlzLT51Lm9udV9hdXRoZW50aWNhdGlvbi5hdXRoZW50aWNhdGlvbl9kYXRhID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImF1dGhlbnRpY2F0aW9uX2RhdGFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX29udV9hdXRoZW50aWNhdGlvblwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51Lm9udV9hdXRoZW50aWNhdGlvbi5hdXRoZW50aWNhdGlvbl9kYXRhLCB0aGlzLT51Lm9udV9hdXRoZW50aWNhdGlvbi5hdXRoZW50aWNhdGlvbl9kYXRhX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9DSFVSTklORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfY2h1cm5pbmdfcHJvdl9iYXNlX3BhY2soJnRoaXMtPnUuY2h1cm5pbmcudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfREJBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcHJvdl9iYXNlX3BhY2soJnRoaXMtPnUuZGJhLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX0tUT05VX0VWRU5UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGk1OworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5rdG9udV9ldmVudC5ldmVudHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5rdG9udV9ldmVudC5ldmVudHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZXZlbnRzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9rdG9udV9ldmVudFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk1ID0gMDsgaTUgPCB0aGlzLT51Lmt0b251X2V2ZW50LmV2ZW50c19jb3VudDsgaTUrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2t0b251X2V2ZW50X2Jhc2VfcGFjaygmdGhpcy0+dS5rdG9udV9ldmVudC5ldmVudHNbaTVdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9FVkVOVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfYmFzZV9wYWNrKCZ0aGlzLT51LmV2ZW50LmV2ZW50cywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICBzd2l0Y2ggKHRoaXMtPm9wKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9HRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3JlcXVlc3QudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9yZXF1ZXN0LnZhcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc19jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmdldF9yZXF1ZXN0LnZhcnNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9kZXNjcmlwdG9yX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmdldF9yZXF1ZXN0LnZhcnNbaTBdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9HRVRfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTE7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9yZXNwb25zZS52YXJzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc19jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LmdldF9yZXNwb25zZS52YXJzX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfY29udGFpbmVyX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNbaTFdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9TRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMjsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X3JlcXVlc3QudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc19jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCB0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnNfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9jb250YWluZXJfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5zZXRfcmVxdWVzdC52YXJzW2kyXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfU0VUX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkzOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfcmVzcG9uc2UudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9yZXNwb25zZS52YXJzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMyA9IDA7IGkzIDwgdGhpcy0+dS5zZXRfcmVzcG9uc2UudmFyc19jb3VudDsgaTMrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9jdGNfZW1wdHlfdmFyX2NvbnRhaW5lcl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnNldF9yZXNwb25zZS52YXJzW2kzXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfU09GVFdBUkVfRE9XTkxPQUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTQ7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNvZnR3YXJlX2Rvd25sb2FkLm1lc3NhZ2VzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc29mdHdhcmVfZG93bmxvYWQubWVzc2FnZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibWVzc2FnZXNfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNCA9IDA7IGk0IDwgdGhpcy0+dS5zb2Z0d2FyZV9kb3dubG9hZC5tZXNzYWdlc19jb3VudDsgaTQrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfcHJvdl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnNvZnR3YXJlX2Rvd25sb2FkLm1lc3NhZ2VzW2k0XSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfT05VX0FVVEhFTlRJQ0FUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDMgKyB0aGlzLT51Lm9udV9hdXRoZW50aWNhdGlvbi5hdXRoZW50aWNhdGlvbl9kYXRhX2NvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfQ0hVUk5JTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19wcm92X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuY2h1cm5pbmcudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfREJBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3Byb3ZfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5kYmEudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfS1RPTlVfRVZFTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTU7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lmt0b251X2V2ZW50LmV2ZW50c19jb3VudCA+IDApICYmICh0aGlzLT51Lmt0b251X2V2ZW50LmV2ZW50cyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJldmVudHNfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNSA9IDA7IGk1IDwgdGhpcy0+dS5rdG9udV9ldmVudC5ldmVudHNfY291bnQ7IGk1KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5rdG9udV9ldmVudC5ldmVudHNbaTVdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9FVkVOVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZXZlbnQuZXZlbnRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29wY29kZV91bnBhY2soJnRoaXMtPm9wLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b3ApCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX0dFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2V0X3JlcXVlc3QudmFyc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfZ2V0X3JlcXVlc3RfY291bnRfdmFycyhidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3JlcXVlc3QudmFycyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX2dldF9yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2V0X3JlcXVlc3QudmFycyA9IChiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9kZXNjcmlwdG9yICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmdldF9yZXF1ZXN0LnZhcnNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfZGVzY3JpcHRvcikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9kZXNjcmlwdG9yX3VucGFjaygmdGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzW2kwXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9HRVRfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTE7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfcmVzcG9uc2UudmFyc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfZ2V0X3Jlc3BvbnNlX2NvdW50X3ZhcnMoYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfcmVzcG9uc2UudmFycyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX2dldF9yZXNwb25zZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmdldF9yZXNwb25zZS52YXJzID0gKGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2NvbnRhaW5lcl9iYXNlICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmdldF9yZXNwb25zZS52YXJzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2NvbnRhaW5lcl9iYXNlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LmdldF9yZXNwb25zZS52YXJzX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9jb250YWluZXJfYmFzZV91bnBhY2soJnRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNbaTFdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX1NFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkyOworICAgICAgICAgICAgICAgIHRoaXMtPnUuc2V0X3JlcXVlc3QudmFyc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2Vfc2V0X3JlcXVlc3RfY291bnRfdmFycyhidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfcmVxdWVzdC52YXJzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X3JlcXVlc3QudmFycyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3NldF9yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuc2V0X3JlcXVlc3QudmFycyA9IChiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9jb250YWluZXJfYmFzZSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5zZXRfcmVxdWVzdC52YXJzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2NvbnRhaW5lcl9iYXNlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCB0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnNfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2NvbnRhaW5lcl9iYXNlX3VucGFjaygmdGhpcy0+dS5zZXRfcmVxdWVzdC52YXJzW2kyXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9TRVRfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTM7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5zZXRfcmVzcG9uc2UudmFyc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2Vfc2V0X3Jlc3BvbnNlX2NvdW50X3ZhcnMoYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnZhcnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfcmVzcG9uc2UudmFycyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3NldF9yZXNwb25zZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnNldF9yZXNwb25zZS52YXJzID0gKGJjbW9sdF9lcG9uX29hbV9jdGNfZW1wdHlfdmFyX2NvbnRhaW5lcl9iYXNlICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnNldF9yZXNwb25zZS52YXJzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfZW1wdHlfdmFyX2NvbnRhaW5lcl9iYXNlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkzID0gMDsgaTMgPCB0aGlzLT51LnNldF9yZXNwb25zZS52YXJzX2NvdW50OyBpMysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2VtcHR5X3Zhcl9jb250YWluZXJfYmFzZV91bnBhY2soJnRoaXMtPnUuc2V0X3Jlc3BvbnNlLnZhcnNbaTNdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX1NPRlRXQVJFX0RPV05MT0FEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGk0OworICAgICAgICAgICAgICAgIHRoaXMtPnUuc29mdHdhcmVfZG93bmxvYWQubWVzc2FnZXNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3NvZnR3YXJlX2Rvd25sb2FkX2NvdW50X21lc3NhZ2VzKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNvZnR3YXJlX2Rvd25sb2FkLm1lc3NhZ2VzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc29mdHdhcmVfZG93bmxvYWQubWVzc2FnZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJtZXNzYWdlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2Vfc29mdHdhcmVfZG93bmxvYWRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5zb2Z0d2FyZV9kb3dubG9hZC5tZXNzYWdlcyA9IChiY21vbHRfZXBvbl9vYW1fY3RjX3NvZnR3YXJlX2Rvd25sb2FkX3Byb3ZfYmFzZSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5zb2Z0d2FyZV9kb3dubG9hZC5tZXNzYWdlc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX3NvZnR3YXJlX2Rvd25sb2FkX3Byb3ZfYmFzZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNCA9IDA7IGk0IDwgdGhpcy0+dS5zb2Z0d2FyZV9kb3dubG9hZC5tZXNzYWdlc19jb3VudDsgaTQrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19zb2Z0d2FyZV9kb3dubG9hZF9wcm92X2Jhc2VfdW5wYWNrKCZ0aGlzLT51LnNvZnR3YXJlX2Rvd25sb2FkLm1lc3NhZ2VzW2k0XSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9PTlVfQVVUSEVOVElDQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29udV9hdXRoX2NvZGVfdW5wYWNrKCZ0aGlzLT51Lm9udV9hdXRoZW50aWNhdGlvbi5jb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51Lm9udV9hdXRoZW50aWNhdGlvbi5hdXRoZW50aWNhdGlvbl9kYXRhX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUub251X2F1dGhlbnRpY2F0aW9uLmF1dGhlbnRpY2F0aW9uX2RhdGFfY291bnQgPiAwKSAmJiAodGhpcy0+dS5vbnVfYXV0aGVudGljYXRpb24uYXV0aGVudGljYXRpb25fZGF0YSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImF1dGhlbnRpY2F0aW9uX2RhdGFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX29udV9hdXRoZW50aWNhdGlvblwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51Lm9udV9hdXRoZW50aWNhdGlvbi5hdXRoZW50aWNhdGlvbl9kYXRhID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUub251X2F1dGhlbnRpY2F0aW9uLmF1dGhlbnRpY2F0aW9uX2RhdGFfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51Lm9udV9hdXRoZW50aWNhdGlvbi5hdXRoZW50aWNhdGlvbl9kYXRhLCB0aGlzLT51Lm9udV9hdXRoZW50aWNhdGlvbi5hdXRoZW50aWNhdGlvbl9kYXRhX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9DSFVSTklORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfY2h1cm5pbmdfcHJvdl9iYXNlX3VucGFjaygmdGhpcy0+dS5jaHVybmluZy52YWx1ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX0RCQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3Byb3ZfYmFzZV91bnBhY2soJnRoaXMtPnUuZGJhLnZhbHVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfS1RPTlVfRVZFTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTU7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5rdG9udV9ldmVudC5ldmVudHNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX2t0b251X2V2ZW50X2NvdW50X2V2ZW50cyhidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5rdG9udV9ldmVudC5ldmVudHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5rdG9udV9ldmVudC5ldmVudHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJldmVudHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX2t0b251X2V2ZW50XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUua3RvbnVfZXZlbnQuZXZlbnRzID0gKGJjbW9sdF9lcG9uX29hbV9rdG9udV9ldmVudF9iYXNlICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51Lmt0b251X2V2ZW50LmV2ZW50c19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfYmFzZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNSA9IDA7IGk1IDwgdGhpcy0+dS5rdG9udV9ldmVudC5ldmVudHNfY291bnQ7IGk1KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9rdG9udV9ldmVudF9iYXNlX3VucGFjaygmdGhpcy0+dS5rdG9udV9ldmVudC5ldmVudHNbaTVdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX0VWRU5UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9iYXNlX3VucGFjaygmdGhpcy0+dS5ldmVudC5ldmVudHMsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb3Bjb2RlIG9wOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vcGNvZGVfdW5wYWNrKCZvcCwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG9wKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9HRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB2YXJzX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9kZXNjcmlwdG9yX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHZhcnNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh2YXJzX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfZGVzY3JpcHRvcikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfR0VUX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhcnNfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2NvbnRhaW5lcl9iYXNlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHZhcnNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh2YXJzX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfY29udGFpbmVyX2Jhc2UpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX1NFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhcnNfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2NvbnRhaW5lcl9iYXNlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHZhcnNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh2YXJzX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfY29udGFpbmVyX2Jhc2UpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX1NFVF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB2YXJzX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2VtcHR5X3Zhcl9jb250YWluZXJfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB2YXJzX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodmFyc19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfZW1wdHlfdmFyX2NvbnRhaW5lcl9iYXNlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9TT0ZUV0FSRV9ET1dOTE9BRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBtZXNzYWdlc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19zb2Z0d2FyZV9kb3dubG9hZF9wcm92X2Jhc2Vfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChtZXNzYWdlc19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfcHJvdl9iYXNlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9PTlVfQVVUSEVOVElDQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgYXV0aGVudGljYXRpb25fZGF0YV9jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZhdXRoZW50aWNhdGlvbl9kYXRhX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogYXV0aGVudGljYXRpb25fZGF0YV9jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBhdXRoZW50aWNhdGlvbl9kYXRhX2NvdW50ICogMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfQ0hVUk5JTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2NodXJuaW5nX3Byb3ZfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9EQkE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9wcm92X2Jhc2Vfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfS1RPTlVfRVZFTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgZXZlbnRzX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBldmVudHNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChldmVudHNfZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfYmFzZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfRVZFTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2Jhc2Vfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfZ2V0X3JlcXVlc3RfY291bnRfdmFycyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIHVpbnQzMl90IGR1bW15ID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIGJ1ZkNsb25lID0gKmJ1ZjsKKyAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfZGVzY3JpcHRvcl9zY2FuKCZidWZDbG9uZSwgJmR1bW15KSkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfZ2V0X3Jlc3BvbnNlX2NvdW50X3ZhcnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICB1aW50MzJfdCBkdW1teSA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBidWZDbG9uZSA9ICpidWY7CisgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2NvbnRhaW5lcl9iYXNlX3NjYW4oJmJ1ZkNsb25lLCAmZHVtbXkpKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9zZXRfcmVxdWVzdF9jb3VudF92YXJzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgdWludDMyX3QgZHVtbXkgPSAwOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgYnVmQ2xvbmUgPSAqYnVmOworICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9jb250YWluZXJfYmFzZV9zY2FuKCZidWZDbG9uZSwgJmR1bW15KSkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2Vfc2V0X3Jlc3BvbnNlX2NvdW50X3ZhcnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICB1aW50MzJfdCBkdW1teSA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBidWZDbG9uZSA9ICpidWY7CisgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfZW1wdHlfdmFyX2NvbnRhaW5lcl9iYXNlX3NjYW4oJmJ1ZkNsb25lLCAmZHVtbXkpKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9zb2Z0d2FyZV9kb3dubG9hZF9jb3VudF9tZXNzYWdlcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIHVpbnQzMl90IGR1bW15ID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIGJ1ZkNsb25lID0gKmJ1ZjsKKyAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19zb2Z0d2FyZV9kb3dubG9hZF9wcm92X2Jhc2Vfc2NhbigmYnVmQ2xvbmUsICZkdW1teSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX2t0b251X2V2ZW50X2NvdW50X2V2ZW50cyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIHVpbnQzMl90IGR1bW15ID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIGJ1ZkNsb25lID0gKmJ1ZjsKKyAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2t0b251X2V2ZW50X2Jhc2Vfc2NhbigmYnVmQ2xvbmUsICZkdW1teSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jbGFzc2lmaWVyX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fY2xhc3NpZmllcl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fY2xhc3NpZmllcl9jb21tYW5kX3BhY2sodGhpcy0+Y29tbWFuZCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9kaXJlY3Rpb25fcGFjayh0aGlzLT5kaXJlY3Rpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5jb21tYW5kKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fQ0xBU1NJRklFUl9DT01NQU5EX0FERF9GSUxURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fZmlsdGVyX2ZpZWxkX3BhY2sodGhpcy0+dS5hZGRfZmlsdGVyLmZpZWxkLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmFkZF9maWx0ZXIudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2ZpbHRlcl9hY3Rpb25fcGFjayh0aGlzLT51LmFkZF9maWx0ZXIuYWN0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9DTEFTU0lGSUVSX0NPTU1BTkRfUkVNT1ZFX0ZJTFRFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9maWx0ZXJfZmllbGRfcGFjayh0aGlzLT51LnJlbW92ZV9maWx0ZXIuZmllbGQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUucmVtb3ZlX2ZpbHRlci52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fZmlsdGVyX2FjdGlvbl9wYWNrKHRoaXMtPnUucmVtb3ZlX2ZpbHRlci5hY3Rpb24sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX0NMQVNTSUZJRVJfQ09NTUFORF9RVUVVRV9NQVA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fcHJpX3R5cGVfcGFjayh0aGlzLT51LnF1ZXVlX21hcC5wcmlfdHlwZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnF1ZXVlX21hcC5pbl9wcmlvcml0eSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5xdWV1ZV9tYXAub3V0X3ByaW9yaXR5KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fQ0xBU1NJRklFUl9DT01NQU5EX0FERF9QUklPUklUWV9GT1JfVkxBTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9maWx0ZXJfZmllbGRfcGFjayh0aGlzLT51LmFkZF9wcmlvcml0eV9mb3Jfdmxhbi5maWVsZCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5hZGRfcHJpb3JpdHlfZm9yX3ZsYW4udmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuYWRkX3ByaW9yaXR5X2Zvcl92bGFuLnByaV92bGFuKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmFkZF9wcmlvcml0eV9mb3Jfdmxhbi5wcmlfcXVldWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY2xhc3NpZmllcl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jbGFzc2lmaWVyX2Jhc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSA2OworICAgIHN3aXRjaCAodGhpcy0+Y29tbWFuZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX0NMQVNTSUZJRVJfQ09NTUFORF9BRERfRklMVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX0NMQVNTSUZJRVJfQ09NTUFORF9SRU1PVkVfRklMVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX0NMQVNTSUZJRVJfQ09NTUFORF9RVUVVRV9NQVA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9DTEFTU0lGSUVSX0NPTU1BTkRfQUREX1BSSU9SSVRZX0ZPUl9WTEFOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NsYXNzaWZpZXJfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NsYXNzaWZpZXJfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NsYXNzaWZpZXJfY29tbWFuZF91bnBhY2soJnRoaXMtPmNvbW1hbmQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fZGlyZWN0aW9uX3VucGFjaygmdGhpcy0+ZGlyZWN0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+Y29tbWFuZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX0NMQVNTSUZJRVJfQ09NTUFORF9BRERfRklMVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2ZpbHRlcl9maWVsZF91bnBhY2soJnRoaXMtPnUuYWRkX2ZpbHRlci5maWVsZCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5hZGRfZmlsdGVyLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9maWx0ZXJfYWN0aW9uX3VucGFjaygmdGhpcy0+dS5hZGRfZmlsdGVyLmFjdGlvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fQ0xBU1NJRklFUl9DT01NQU5EX1JFTU9WRV9GSUxURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fZmlsdGVyX2ZpZWxkX3VucGFjaygmdGhpcy0+dS5yZW1vdmVfZmlsdGVyLmZpZWxkLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LnJlbW92ZV9maWx0ZXIudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2ZpbHRlcl9hY3Rpb25fdW5wYWNrKCZ0aGlzLT51LnJlbW92ZV9maWx0ZXIuYWN0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9DTEFTU0lGSUVSX0NPTU1BTkRfUVVFVUVfTUFQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ByaV90eXBlX3VucGFjaygmdGhpcy0+dS5xdWV1ZV9tYXAucHJpX3R5cGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5xdWV1ZV9tYXAuaW5fcHJpb3JpdHkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUucXVldWVfbWFwLm91dF9wcmlvcml0eSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX0NMQVNTSUZJRVJfQ09NTUFORF9BRERfUFJJT1JJVFlfRk9SX1ZMQU46CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fZmlsdGVyX2ZpZWxkX3VucGFjaygmdGhpcy0+dS5hZGRfcHJpb3JpdHlfZm9yX3ZsYW4uZmllbGQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuYWRkX3ByaW9yaXR5X2Zvcl92bGFuLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmFkZF9wcmlvcml0eV9mb3Jfdmxhbi5wcmlfdmxhbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5hZGRfcHJpb3JpdHlfZm9yX3ZsYW4ucHJpX3F1ZXVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY2xhc3NpZmllcl9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jbGFzc2lmaWVyX2NvbW1hbmQgY29tbWFuZDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9jbGFzc2lmaWVyX2NvbW1hbmRfdW5wYWNrKCZjb21tYW5kLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChjb21tYW5kKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fQ0xBU1NJRklFUl9DT01NQU5EX0FERF9GSUxURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX0NMQVNTSUZJRVJfQ09NTUFORF9SRU1PVkVfRklMVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9DTEFTU0lGSUVSX0NPTU1BTkRfUVVFVUVfTUFQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9DTEFTU0lGSUVSX0NPTU1BTkRfQUREX1BSSU9SSVRZX0ZPUl9WTEFOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfcGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5wb3J0X251bWJlcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5lbmFibGVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPmF1dG9fbmVnb3RpYXRpb25fZW5hYmxlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnNwZWVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5yZXNlcnZlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5pc19mdWxsX2R1cGxleCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmxlYXJuaW5nX3RhYmxlX3NpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+cG9ydF9udW1iZXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+ZW5hYmxlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5hdXRvX25lZ290aWF0aW9uX2VuYWJsZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5zcGVlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+cmVzZXJ2ZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+aXNfZnVsbF9kdXBsZXgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5sZWFybmluZ190YWJsZV9zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW4gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5yZXNlcnZlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5pc190YWdnZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT52bGFuX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW5fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+cmVzZXJ2ZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+aXNfdGFnZ2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dmxhbl9pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuX3BvcnRfcGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fdmxhbl9wb3J0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnBvcnRfbnVtYmVyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dmxhbnNfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+dmxhbnNfY291bnQgPiAwKSAmJiAodGhpcy0+dmxhbnMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmxhbnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZGFzYW5fdmxhbl9wb3J0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnZsYW5zX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fdmxhbl9wYWNrKCZ0aGlzLT52bGFuc1tpMF0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5wdmlkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuX3BvcnRfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW5fcG9ydCAqdGhpcykKK3sKKyAgICByZXR1cm4gNiArICg0ICogdGhpcy0+dmxhbnNfY291bnQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fdmxhbl9wb3J0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fdmxhbl9wb3J0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnBvcnRfbnVtYmVyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dmxhbnNfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+dmxhbnNfY291bnQgPiAwKSAmJiAodGhpcy0+dmxhbnMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2bGFuc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuX3BvcnRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+dmxhbnMgPSAoYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW4gKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnZsYW5zX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT52bGFuc19jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW5fdW5wYWNrKCZ0aGlzLT52bGFuc1tpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnB2aWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fdmxhbl9wb3J0X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IHZsYW5zX2NvdW50OworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJnZsYW5zX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuKSAqIHZsYW5zX2NvdW50KTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIHZsYW5zX2NvdW50ICogNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfY29uZmlnX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfY29uZmlnICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cG9ydF9udW1iZXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+aXNfbGlua2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5zcGVlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT5pc19mdWxsX2R1cGxleCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2NvbmZpZ191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfY29uZmlnICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+cG9ydF9udW1iZXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+aXNfbGlua2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5zcGVlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5pc19mdWxsX2R1cGxleCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2NvbmZpZ19zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9zdGF0c19wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X3N0YXRzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPmluX2dvb2Rfb2N0ZXRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+aW5fZ29vZF9mcmFtZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5pbl9icm9hZGNhc3QpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5pbl9tdWx0aWNhc3QpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5vdXRfZ29vZF9vY3RldHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5vdXRfZ29vZF9mcmFtZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5vdXRfYnJvYWRjYXN0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+b3V0X211bHRpY2FzdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X3N0YXRzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9zdGF0cyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT5pbl9nb29kX29jdGV0cykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmluX2dvb2RfZnJhbWVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+aW5fYnJvYWRjYXN0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+aW5fbXVsdGljYXN0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+b3V0X2dvb2Rfb2N0ZXRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+b3V0X2dvb2RfZnJhbWVzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+b3V0X2Jyb2FkY2FzdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPm91dF9tdWx0aWNhc3QpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9zdGF0c19zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfZXJyb3Jfc3RhdHNfcGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9lcnJvcl9zdGF0cyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51bmRlcnNpemVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+b3ZlcnNpemVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+amFiYmVyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+aW5fbWFjX3JlY2VpdmVfZXJyb3IpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5pbl9mY3NfZXJyb3IpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9lcnJvcl9zdGF0c191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfZXJyb3Jfc3RhdHMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dW5kZXJzaXplZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPm92ZXJzaXplZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmphYmJlcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmluX21hY19yZWNlaXZlX2Vycm9yKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+aW5fZmNzX2Vycm9yKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfZXJyb3Jfc3RhdHNfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0c19zZXFfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0c19zZXFfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV90eXBlX3BhY2sodGhpcy0+dHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9TVEFUU19TRVFfVFlQRV9QT1JUMEFORDE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9zdGF0c19wYWNrKCZ0aGlzLT51LnBvcnQwYW5kMS5wb3J0MCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X3N0YXRzX3BhY2soJnRoaXMtPnUucG9ydDBhbmQxLnBvcnQxLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9TVEFUU19TRVFfVFlQRV9QT1JUMkFORDM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9zdGF0c19wYWNrKCZ0aGlzLT51LnBvcnQyYW5kMy5wb3J0MiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X3N0YXRzX3BhY2soJnRoaXMtPnUucG9ydDJhbmQzLnBvcnQzLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9TVEFUU19TRVFfVFlQRV9FUlJPUlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9lcnJvcl9zdGF0c19wYWNrKCZ0aGlzLT51LmVycm9ycy5wb3J0MCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2Vycm9yX3N0YXRzX3BhY2soJnRoaXMtPnUuZXJyb3JzLnBvcnQxLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfZXJyb3Jfc3RhdHNfcGFjaygmdGhpcy0+dS5lcnJvcnMucG9ydDIsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9lcnJvcl9zdGF0c19wYWNrKCZ0aGlzLT51LmVycm9ycy5wb3J0MywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0c19zZXFfYmFzZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgc3dpdGNoICh0aGlzLT50eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fU1RBVFNfU0VRX1RZUEVfUE9SVDBBTkQxOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDgwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX1NUQVRTX1NFUV9UWVBFX1BPUlQyQU5EMzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA4MDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9TVEFUU19TRVFfVFlQRV9FUlJPUlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gODA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0c19zZXFfdHlwZV91bnBhY2soJnRoaXMtPnR5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT50eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fU1RBVFNfU0VRX1RZUEVfUE9SVDBBTkQxOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfc3RhdHNfdW5wYWNrKCZ0aGlzLT51LnBvcnQwYW5kMS5wb3J0MCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfc3RhdHNfdW5wYWNrKCZ0aGlzLT51LnBvcnQwYW5kMS5wb3J0MSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9TVEFUU19TRVFfVFlQRV9QT1JUMkFORDM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9zdGF0c191bnBhY2soJnRoaXMtPnUucG9ydDJhbmQzLnBvcnQyLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9zdGF0c191bnBhY2soJnRoaXMtPnUucG9ydDJhbmQzLnBvcnQzLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX1NUQVRTX1NFUV9UWVBFX0VSUk9SUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2Vycm9yX3N0YXRzX3VucGFjaygmdGhpcy0+dS5lcnJvcnMucG9ydDAsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2Vycm9yX3N0YXRzX3VucGFjaygmdGhpcy0+dS5lcnJvcnMucG9ydDEsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2Vycm9yX3N0YXRzX3VucGFjaygmdGhpcy0+dS5lcnJvcnMucG9ydDIsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2Vycm9yX3N0YXRzX3VucGFjaygmdGhpcy0+dS5lcnJvcnMucG9ydDMsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV90eXBlIHR5cGU7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX3R5cGVfdW5wYWNrKCZ0eXBlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX1NUQVRTX1NFUV9UWVBFX1BPUlQwQU5EMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fU1RBVFNfU0VRX1RZUEVfUE9SVDJBTkQzOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNDApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNDApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9TVEFUU19TRVFfVFlQRV9FUlJPUlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRfdmFsdWVfcGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdF92YWx1ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRfaWRfcGFjayh0aGlzLT5pZCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dmFsdWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdF92YWx1ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRfdmFsdWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0X2lkX3VucGFjaygmdGhpcy0+aWQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnZhbHVlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRfdmFsdWVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NvbmZpZ19iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NvbmZpZ19iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fb3Bjb2RlX3BhY2sodGhpcy0+b3Bjb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b3Bjb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX1BPUlRfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IGkwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnBvcnRfY29uZmlnLnBvcnRzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUucG9ydF9jb25maWcucG9ydHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5wb3J0X2NvbmZpZy5wb3J0cyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwb3J0c1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kYXNhbl9jb25maWdfYmFzZV9wb3J0X2NvbmZpZ1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LnBvcnRfY29uZmlnLnBvcnRzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9wYWNrKCZ0aGlzLT51LnBvcnRfY29uZmlnLnBvcnRzW2kwXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9TRVRfVkxBTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5zZXRfdmxhbi5wb3J0c19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF92bGFuLnBvcnRzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X3ZsYW4ucG9ydHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicG9ydHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZGFzYW5fY29uZmlnX2Jhc2Vfc2V0X3ZsYW5cIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5zZXRfdmxhbi5wb3J0c19jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW5fcG9ydF9wYWNrKCZ0aGlzLT51LnNldF92bGFuLnBvcnRzW2kxXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9HRVRfT05VX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkyOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmdldF9vbnVfY29uZmlnLmxsaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LmdldF9vbnVfY29uZmlnLm9wKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5nZXRfb251X2NvbmZpZy5wcm9maWxlX29wKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5nZXRfb251X2NvbmZpZy52YWx1ZV9zaXplKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmdldF9vbnVfY29uZmlnLnBvcnRzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X29udV9jb25maWcucG9ydHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfb251X2NvbmZpZy5wb3J0cyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwb3J0c1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kYXNhbl9jb25maWdfYmFzZV9nZXRfb251X2NvbmZpZ1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCB0aGlzLT51LmdldF9vbnVfY29uZmlnLnBvcnRzX2NvdW50OyBpMisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9jb25maWdfcGFjaygmdGhpcy0+dS5nZXRfb251X2NvbmZpZy5wb3J0c1tpMl0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfU0VUX1NUUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNldF9zdHAucmVzZXJ2ZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS5zZXRfc3RwLmVuYWJsZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuc2V0X3N0cC5tYXhfYWdlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5zZXRfc3RwLmZvcndhcmRfZGVsYXkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnNldF9zdHAuaGVsbG9fdGltZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9TRVRfVFhQT1dFUl9PRkY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuc2V0X3R4cG93ZXJfb2ZmLmVuYWJsZV90aW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX1NFVF9MT09QX0RFVEVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5zZXRfbG9vcF9kZXRlY3QubGxpZF9iaXRtYXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS5zZXRfbG9vcF9kZXRlY3QuZW5hYmxlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNldF9sb29wX2RldGVjdC5ibG9ja19jYXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuc2V0X2xvb3BfZGV0ZWN0LnNlbmRfY2FwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNldF9sb29wX2RldGVjdC5vbHRfbWFjX2NhcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuc2V0X2xvb3BfZGV0ZWN0LnNlbmRfcGVyaW9kKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5zZXRfbG9vcF9kZXRlY3QuYmxvY2tfdGltZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5zZXRfbG9vcF9kZXRlY3Qub2x0X21hYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9TRVRfTE9PUF9ERVRFQ1RfVU5CTE9DSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5zZXRfbG9vcF9kZXRlY3RfdW5ibG9jay5sbGlkX2JpdG1hcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9DTEFTU0lGSUVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NsYXNzaWZpZXJfYmFzZV9wYWNrKCZ0aGlzLT51LmNsYXNzaWZpZXIuY2xhc3NpZmllciwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9WRVJTSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lm9udV92ZXJzaW9uLmxsaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51Lm9udV92ZXJzaW9uLm9wKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5vbnVfdmVyc2lvbi5pbmZvX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUub251X3ZlcnNpb24uaW5mb19jb3VudCA+IDApICYmICh0aGlzLT51Lm9udV92ZXJzaW9uLmluZm8gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiaW5mb1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kYXNhbl9jb25maWdfYmFzZV9vbnVfdmVyc2lvblwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51Lm9udV92ZXJzaW9uLmluZm8sIHRoaXMtPnUub251X3ZlcnNpb24uaW5mb19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9PTlVfRkxBU0hfRklSTVdBUkVfVkVSU0lPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5vbnVfZmxhc2hfZmlybXdhcmVfdmVyc2lvbi5sbGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9mbGFzaF9maXJtd2FyZV92ZXJzaW9uLmJvb3RfbW9kZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfZmxhc2hfZmlybXdhcmVfdmVyc2lvbi5hY3RpdmUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUub251X2ZsYXNoX2Zpcm13YXJlX3ZlcnNpb24uaW1hZ2Uxc3RyaW5nLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5vbnVfZmxhc2hfZmlybXdhcmVfdmVyc2lvbi5pbWFnZTJzdHJpbmcsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9BQ1RJVkVfSU1BR0VfVElNRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5vbnVfYWN0aXZlX2ltYWdlX3RpbWUubGxpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfYWN0aXZlX2ltYWdlX3RpbWUuYWN0aXZlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5vbnVfYWN0aXZlX2ltYWdlX3RpbWUuYnVpbGRfdGltZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9PTlVfU1RBVElTVElDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkzOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lm9udV9zdGF0aXN0aWMubGxpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUub251X3N0YXRpc3RpYy5vcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm9udV9zdGF0aXN0aWMuc2VxdWVuY2VzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUub251X3N0YXRpc3RpYy5zZXF1ZW5jZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwic2VxdWVuY2VzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NvbmZpZ19iYXNlX29udV9zdGF0aXN0aWNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMyA9IDA7IGkzIDwgdGhpcy0+dS5vbnVfc3RhdGlzdGljLnNlcXVlbmNlc19jb3VudDsgaTMrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV9iYXNlX3BhY2soJnRoaXMtPnUub251X3N0YXRpc3RpYy5zZXF1ZW5jZXNbaTNdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9TVEFUSVNUSUNfQ0xFQVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9TVEFUSVNUSUNfR0VUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUub251X3N0YXRpc3RpY19nZXQubGxpZF9iaXRtYXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X3N0YXRpc3RpY19nZXQuc3RhdGlzdGljc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm9udV9zdGF0aXN0aWNfZ2V0LnN0YXRpc3RpY3NfY291bnQgPiAwKSAmJiAodGhpcy0+dS5vbnVfc3RhdGlzdGljX2dldC5zdGF0aXN0aWNzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInN0YXRpc3RpY3NcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZGFzYW5fY29uZmlnX2Jhc2Vfb251X3N0YXRpc3RpY19nZXRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNCA9IDA7IGk0IDwgdGhpcy0+dS5vbnVfc3RhdGlzdGljX2dldC5zdGF0aXN0aWNzX2NvdW50OyBpNCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdF92YWx1ZV9wYWNrKCZ0aGlzLT51Lm9udV9zdGF0aXN0aWNfZ2V0LnN0YXRpc3RpY3NbaTRdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9JR01QX1NFVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUub251X2lnbXBfc2V0LmVuYWJsZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfaWdtcF9zZXQubWF4X2dyb3VwcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9PTlVfUE9SVF9JR01QX0ZJTFRFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUub251X3BvcnRfaWdtcF9maWx0ZXIuZW5hYmxlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9TSEFQSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X3NoYXBpbmcucmVzZXJ2ZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS5vbnVfc2hhcGluZy5lbmFibGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51Lm9udV9zaGFwaW5nLnJhdGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY29uZmlnX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NvbmZpZ19iYXNlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMjsKKyAgICBzd2l0Y2ggKHRoaXMtPm9wY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9QT1JUX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyICsgKDEwICogdGhpcy0+dS5wb3J0X2NvbmZpZy5wb3J0c19jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX1NFVF9WTEFOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF92bGFuLnBvcnRzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X3ZsYW4ucG9ydHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicG9ydHNfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZGFzYW5fY29uZmlnX2Jhc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LnNldF92bGFuLnBvcnRzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW5fcG9ydF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5zZXRfdmxhbi5wb3J0c1tpMF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfR0VUX09OVV9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTUgKyAoNCAqIHRoaXMtPnUuZ2V0X29udV9jb25maWcucG9ydHNfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9TRVRfU1RQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX1NFVF9UWFBPV0VSX09GRjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9TRVRfTE9PUF9ERVRFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX1NFVF9MT09QX0RFVEVDVF9VTkJMT0NLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX0NMQVNTSUZJRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NsYXNzaWZpZXJfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5jbGFzc2lmaWVyLmNsYXNzaWZpZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9PTlVfVkVSU0lPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA4ICsgdGhpcy0+dS5vbnVfdmVyc2lvbi5pbmZvX2NvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9PTlVfRkxBU0hfRklSTVdBUkVfVkVSU0lPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfT05VX0FDVElWRV9JTUFHRV9USU1FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDExOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9PTlVfU1RBVElTVElDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxOworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEwOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5vbnVfc3RhdGlzdGljLnNlcXVlbmNlc19jb3VudCA+IDApICYmICh0aGlzLT51Lm9udV9zdGF0aXN0aWMuc2VxdWVuY2VzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInNlcXVlbmNlc19jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kYXNhbl9jb25maWdfYmFzZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHRoaXMtPnUub251X3N0YXRpc3RpYy5zZXF1ZW5jZXNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUub251X3N0YXRpc3RpYy5zZXF1ZW5jZXNbaTFdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9TVEFUSVNUSUNfQ0xFQVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9TVEFUSVNUSUNfR0VUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDMgKyAoNiAqIHRoaXMtPnUub251X3N0YXRpc3RpY19nZXQuc3RhdGlzdGljc19jb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9JR01QX1NFVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9PTlVfUE9SVF9JR01QX0ZJTFRFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9PTlVfU0hBUElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jb25maWdfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NvbmZpZ19iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fb3Bjb2RlX3VucGFjaygmdGhpcy0+b3Bjb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b3Bjb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX1BPUlRfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IGkwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LnBvcnRfY29uZmlnLnBvcnRzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUucG9ydF9jb25maWcucG9ydHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5wb3J0X2NvbmZpZy5wb3J0cyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInBvcnRzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NvbmZpZ19iYXNlX3BvcnRfY29uZmlnXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUucG9ydF9jb25maWcucG9ydHMgPSAoYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnQgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUucG9ydF9jb25maWcucG9ydHNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnQpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUucG9ydF9jb25maWcucG9ydHNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X3VucGFjaygmdGhpcy0+dS5wb3J0X2NvbmZpZy5wb3J0c1tpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9TRVRfVkxBTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5zZXRfdmxhbi5wb3J0c19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF92bGFuLnBvcnRzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X3ZsYW4ucG9ydHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwb3J0c1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kYXNhbl9jb25maWdfYmFzZV9zZXRfdmxhblwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnNldF92bGFuLnBvcnRzID0gKGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuX3BvcnQgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuc2V0X3ZsYW4ucG9ydHNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW5fcG9ydCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5zZXRfdmxhbi5wb3J0c19jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW5fcG9ydF91bnBhY2soJnRoaXMtPnUuc2V0X3ZsYW4ucG9ydHNbaTFdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfR0VUX09OVV9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5nZXRfb251X2NvbmZpZy5sbGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dS5nZXRfb251X2NvbmZpZy5vcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZ2V0X29udV9jb25maWcucHJvZmlsZV9vcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZ2V0X29udV9jb25maWcudmFsdWVfc2l6ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5nZXRfb251X2NvbmZpZy5wb3J0c19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9vbnVfY29uZmlnLnBvcnRzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X29udV9jb25maWcucG9ydHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwb3J0c1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kYXNhbl9jb25maWdfYmFzZV9nZXRfb251X2NvbmZpZ1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmdldF9vbnVfY29uZmlnLnBvcnRzID0gKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2NvbmZpZyAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZXRfb251X2NvbmZpZy5wb3J0c19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9jb25maWcpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUuZ2V0X29udV9jb25maWcucG9ydHNfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2NvbmZpZ191bnBhY2soJnRoaXMtPnUuZ2V0X29udV9jb25maWcucG9ydHNbaTJdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfU0VUX1NUUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnNldF9zdHAucmVzZXJ2ZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+dS5zZXRfc3RwLmVuYWJsZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuc2V0X3N0cC5tYXhfYWdlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5zZXRfc3RwLmZvcndhcmRfZGVsYXkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LnNldF9zdHAuaGVsbG9fdGltZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9TRVRfVFhQT1dFUl9PRkY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuc2V0X3R4cG93ZXJfb2ZmLmVuYWJsZV90aW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX1NFVF9MT09QX0RFVEVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dS5zZXRfbG9vcF9kZXRlY3QubGxpZF9iaXRtYXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+dS5zZXRfbG9vcF9kZXRlY3QuZW5hYmxlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnNldF9sb29wX2RldGVjdC5ibG9ja19jYXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuc2V0X2xvb3BfZGV0ZWN0LnNlbmRfY2FwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnNldF9sb29wX2RldGVjdC5vbHRfbWFjX2NhcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnUuc2V0X2xvb3BfZGV0ZWN0LnNlbmRfcGVyaW9kKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dS5zZXRfbG9vcF9kZXRlY3QuYmxvY2tfdGltZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+dS5zZXRfbG9vcF9kZXRlY3Qub2x0X21hYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9TRVRfTE9PUF9ERVRFQ1RfVU5CTE9DSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dS5zZXRfbG9vcF9kZXRlY3RfdW5ibG9jay5sbGlkX2JpdG1hcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9DTEFTU0lGSUVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NsYXNzaWZpZXJfYmFzZV91bnBhY2soJnRoaXMtPnUuY2xhc3NpZmllci5jbGFzc2lmaWVyLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9PTlVfVkVSU0lPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5vbnVfdmVyc2lvbi5sbGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dS5vbnVfdmVyc2lvbi5vcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUub251X3ZlcnNpb24uaW5mb19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm9udV92ZXJzaW9uLmluZm9fY291bnQgPiAwKSAmJiAodGhpcy0+dS5vbnVfdmVyc2lvbi5pbmZvID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiaW5mb1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kYXNhbl9jb25maWdfYmFzZV9vbnVfdmVyc2lvblwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51Lm9udV92ZXJzaW9uLmluZm8gPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5vbnVfdmVyc2lvbi5pbmZvX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5vbnVfdmVyc2lvbi5pbmZvLCB0aGlzLT51Lm9udV92ZXJzaW9uLmluZm9fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfT05VX0ZMQVNIX0ZJUk1XQVJFX1ZFUlNJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUub251X2ZsYXNoX2Zpcm13YXJlX3ZlcnNpb24ubGxpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5vbnVfZmxhc2hfZmlybXdhcmVfdmVyc2lvbi5ib290X21vZGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUub251X2ZsYXNoX2Zpcm13YXJlX3ZlcnNpb24uYWN0aXZlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUub251X2ZsYXNoX2Zpcm13YXJlX3ZlcnNpb24uaW1hZ2Uxc3RyaW5nLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51Lm9udV9mbGFzaF9maXJtd2FyZV92ZXJzaW9uLmltYWdlMnN0cmluZywgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfT05VX0FDVElWRV9JTUFHRV9USU1FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51Lm9udV9hY3RpdmVfaW1hZ2VfdGltZS5sbGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51Lm9udV9hY3RpdmVfaW1hZ2VfdGltZS5hY3RpdmUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NChidWYsICZ0aGlzLT51Lm9udV9hY3RpdmVfaW1hZ2VfdGltZS5idWlsZF90aW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9TVEFUSVNUSUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTM7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUub251X3N0YXRpc3RpYy5sbGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+dS5vbnVfc3RhdGlzdGljLm9wKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0aGlzLT51Lm9udV9zdGF0aXN0aWMuc2VxdWVuY2VzX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NvbmZpZ19iYXNlX29udV9zdGF0aXN0aWNfY291bnRfc2VxdWVuY2VzKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm9udV9zdGF0aXN0aWMuc2VxdWVuY2VzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUub251X3N0YXRpc3RpYy5zZXF1ZW5jZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJzZXF1ZW5jZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZGFzYW5fY29uZmlnX2Jhc2Vfb251X3N0YXRpc3RpY1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51Lm9udV9zdGF0aXN0aWMuc2VxdWVuY2VzID0gKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0c19zZXFfYmFzZSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5vbnVfc3RhdGlzdGljLnNlcXVlbmNlc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX2Jhc2UpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IHRoaXMtPnUub251X3N0YXRpc3RpYy5zZXF1ZW5jZXNfY291bnQ7IGkzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0c19zZXFfYmFzZV91bnBhY2soJnRoaXMtPnUub251X3N0YXRpc3RpYy5zZXF1ZW5jZXNbaTNdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfT05VX1NUQVRJU1RJQ19DTEVBUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfT05VX1NUQVRJU1RJQ19HRVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpNDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5vbnVfc3RhdGlzdGljX2dldC5sbGlkX2JpdG1hcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5vbnVfc3RhdGlzdGljX2dldC5zdGF0aXN0aWNzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUub251X3N0YXRpc3RpY19nZXQuc3RhdGlzdGljc19jb3VudCA+IDApICYmICh0aGlzLT51Lm9udV9zdGF0aXN0aWNfZ2V0LnN0YXRpc3RpY3MgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJzdGF0aXN0aWNzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NvbmZpZ19iYXNlX29udV9zdGF0aXN0aWNfZ2V0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUub251X3N0YXRpc3RpY19nZXQuc3RhdGlzdGljcyA9IChiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdF92YWx1ZSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5vbnVfc3RhdGlzdGljX2dldC5zdGF0aXN0aWNzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0X3ZhbHVlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk0ID0gMDsgaTQgPCB0aGlzLT51Lm9udV9zdGF0aXN0aWNfZ2V0LnN0YXRpc3RpY3NfY291bnQ7IGk0KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0X3ZhbHVlX3VucGFjaygmdGhpcy0+dS5vbnVfc3RhdGlzdGljX2dldC5zdGF0aXN0aWNzW2k0XSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9JR01QX1NFVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnUub251X2lnbXBfc2V0LmVuYWJsZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5vbnVfaWdtcF9zZXQubWF4X2dyb3VwcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9PTlVfUE9SVF9JR01QX0ZJTFRFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnUub251X3BvcnRfaWdtcF9maWx0ZXIuZW5hYmxlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9TSEFQSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUub251X3NoYXBpbmcucmVzZXJ2ZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+dS5vbnVfc2hhcGluZy5lbmFibGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT51Lm9udV9zaGFwaW5nLnJhdGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jb25maWdfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZGFzYW5fb3Bjb2RlIG9wY29kZTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9vcGNvZGVfdW5wYWNrKCZvcGNvZGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChvcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfUE9SVF9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgcG9ydHNfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJnBvcnRzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0KSAqIHBvcnRzX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIHBvcnRzX2NvdW50ICogMTApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfU0VUX1ZMQU46CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgcG9ydHNfY291bnQ7CisgICAgICAgICAgICAgICAgdWludDE2X3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJnBvcnRzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuX3BvcnQpICogcG9ydHNfY291bnQpOworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHBvcnRzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fdmxhbl9wb3J0X3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX0dFVF9PTlVfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgcG9ydHNfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZwb3J0c19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9jb25maWcpICogcG9ydHNfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgcG9ydHNfY291bnQgKiA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX1NFVF9TVFA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfU0VUX1RYUE9XRVJfT0ZGOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9TRVRfTE9PUF9ERVRFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfU0VUX0xPT1BfREVURUNUX1VOQkxPQ0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX0NMQVNTSUZJRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fY2xhc3NpZmllcl9iYXNlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfT05VX1ZFUlNJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgaW5mb19jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmluZm9fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiBpbmZvX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGluZm9fY291bnQgKiAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9GTEFTSF9GSVJNV0FSRV9WRVJTSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfT05VX0FDVElWRV9JTUFHRV9USU1FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfT05VX1NUQVRJU1RJQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzZXF1ZW5jZXNfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX2Jhc2Vfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VzX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2VxdWVuY2VzX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV9iYXNlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9TVEFUSVNUSUNfQ0xFQVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9TVEFUSVNUSUNfR0VUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3RhdGlzdGljc19jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJnN0YXRpc3RpY3NfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRfdmFsdWUpICogc3RhdGlzdGljc19jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBzdGF0aXN0aWNzX2NvdW50ICogNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9PTlVfSUdNUF9TRVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfT05VX1BPUlRfSUdNUF9GSUxURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9TSEFQSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY29uZmlnX2Jhc2Vfb251X3N0YXRpc3RpY19jb3VudF9zZXF1ZW5jZXMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICB1aW50MzJfdCBkdW1teSA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBidWZDbG9uZSA9ICpidWY7CisgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0c19zZXFfYmFzZV9zY2FuKCZidWZDbG9uZSwgJmR1bW15KSkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bGVuZ3RoID4gMCkgJiYgKHRoaXMtPm5hbWUgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibmFtZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+bmFtZSwgdGhpcy0+bGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZSAqdGhpcykKK3sKKyAgICByZXR1cm4gMSArIHRoaXMtPmxlbmd0aDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW5ndGggPiAwKSAmJiAodGhpcy0+bmFtZSA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm5hbWVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPm5hbWUgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+bGVuZ3RoICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+bmFtZSwgdGhpcy0+bGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IGxlbmd0aDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiBsZW5ndGgpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuZ3RoICogMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfbGlzdF9wYWNrKGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfbGlzdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICB1aW50MzJfdCBpMDsKKyAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPm5hbWVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPm5hbWVzID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm5hbWVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZV9saXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5uYW1lc19jb3VudCA+IDY1NTM1TCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5uYW1lc19jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZV9wYWNrKCZ0aGlzLT5uYW1lc1tpMF0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZV9saXN0X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfbGlzdCAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDI7CisgICAgdWludDMyX3QgaTA7CisgICAgaWYgKCh0aGlzLT5uYW1lc19jb3VudCA+IDApICYmICh0aGlzLT5uYW1lcyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJuYW1lc19jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfbGlzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPm5hbWVzX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+bmFtZXNbaTBdKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfbGlzdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZV9saXN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgbGVuZ3RoID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDMyX3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIGJ1Zi0+Y3Vycik7CisgICAgdGhpcy0+bmFtZXNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lX2xpc3RfY291bnRfbmFtZXMoJnBvc3RMZW5CdWYpOworICAgIGlmICgodGhpcy0+bmFtZXNfY291bnQgPiAwKSAmJiAodGhpcy0+bmFtZXMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJuYW1lc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfbGlzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT5uYW1lcyA9IChiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5uYW1lc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodGhpcy0+bmFtZXNfY291bnQgPiA2NTUzNUwpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bmFtZXNfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfdW5wYWNrKCZ0aGlzLT5uYW1lc1tpMF0sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfbGlzdF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDE2X3QgbGVuZ3RoOworICAgIHVpbnQzMl90IG5hbWVzX2VsZW1fY291bnQgPSAwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgbmFtZXNfZWxlbV9jb3VudCArPSAxOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChuYW1lc19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWUpKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lX2xpc3RfY291bnRfbmFtZXMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICB1aW50MzJfdCBkdW1teSA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBidWZDbG9uZSA9ICpidWY7CisgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfc2NhbigmYnVmQ2xvbmUsICZkdW1teSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGkwOworICAgIGlmICgodGhpcy0+bWFjX2FkZHJlc3NfY291bnQgPiAwKSAmJiAodGhpcy0+bWFjX2FkZHJlc3MgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibWFjX2FkZHJlc3NcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bWFjX2FkZHJlc3NfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT5tYWNfYWRkcmVzc1tpMF0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGUgKnRoaXMpCit7CisgICAgcmV0dXJuICg2ICogdGhpcy0+bWFjX2FkZHJlc3NfY291bnQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQzMl90IGkwOworICAgIHRoaXMtPm1hY19hZGRyZXNzX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlX2NvdW50X21hY19hZGRyZXNzKGJ1Zik7CisgICAgaWYgKCh0aGlzLT5tYWNfYWRkcmVzc19jb3VudCA+IDApICYmICh0aGlzLT5tYWNfYWRkcmVzcyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm1hY19hZGRyZXNzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPm1hY19hZGRyZXNzID0gKGJjbW9zX21hY19hZGRyZXNzICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5tYWNfYWRkcmVzc19jb3VudCAqIHNpemVvZihiY21vc19tYWNfYWRkcmVzcykpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bWFjX2FkZHJlc3NfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9tYWNfYWRkcmVzcyhidWYsICZ0aGlzLT5tYWNfYWRkcmVzc1tpMF0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQzMl90IG1hY19hZGRyZXNzX2VsZW1fY291bnQgPSAwOworICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA2KSkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBtYWNfYWRkcmVzc19lbGVtX2NvdW50ICs9IDE7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKG1hY19hZGRyZXNzX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb3NfbWFjX2FkZHJlc3MpKTsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZV9jb3VudF9tYWNfYWRkcmVzcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gNik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2FjdGlvbl92YWx1ZV9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYWN0aW9uX3ZhbHVlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFmX2FjdGlvbl9wYWNrKHRoaXMtPmxlYWYsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPndpZHRoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT53aWR0aCk7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+bGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fUkVTRVRfT05VOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fQUREX0RZTl9NQUNfQUREUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZV9wYWNrKCZ0aGlzLT51LmFkZF9keW5fbWFjX2FkZHIubWFjX2FkZGVzcywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9ERUxfRFlOX01BQ19BRERSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlX3BhY2soJnRoaXMtPnUuZGVsX2R5bl9tYWNfYWRkci5tYWNfYWRkcmVzcywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9BRERfU1RBVElDX01BQ19BRERSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlX3BhY2soJnRoaXMtPnUuYWRkX3N0YXRpY19tYWNfYWRkci5tYWNfYWRkcmVzcywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9ERUxfU1RBVElDX01BQ19BRERSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlX3BhY2soJnRoaXMtPnUuZGVsX3N0YXRpY19tYWNfYWRkci5tYWNfYWRkcmVzcywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9MT09QQkFDS19FTkFCTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9sb29wYmFja19sb2NhdGlvbl9wYWNrKHRoaXMtPnUubG9vcGJhY2tfZW5hYmxlLmxvY2F0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0xPT1BCQUNLX0RJU0FCTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9sb29wYmFja19sb2NhdGlvbl9wYWNrKHRoaXMtPnUubG9vcGJhY2tfZGlzYWJsZS5sb2NhdGlvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9MQVNFUl9UWF9QT1dFUl9PRkY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUubGFzZXJfdHhfcG93ZXJfb2ZmLmRpc2FibGVfdGltZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fQ0xFQVJfSU5HUkVTU19SVUxFUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0FERF9JTkdSRVNTX1JVTEVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fREVMX0lOR1JFU1NfUlVMRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9FTkFCTEVfVVNFUl9UUkFGRklDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fRElTQUJMRV9VU0VSX1RSQUZGSUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9DTEVBUl9EWU5fTEVBUk5fVEFCTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9DTEVBUl9TVEFUSUNfTEVBUk5fVEFCTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9DTEVBUl9TVEFUUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0NPTkZJR1VSRV9NQ0FTVF9MTElEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGxpZF9hY3Rpb25fcGFjayh0aGlzLT51LmNvbmZpZ3VyZV9tY2FzdF9sbGlkLmxsaWRfYWN0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmNvbmZpZ3VyZV9tY2FzdF9sbGlkLmxsaWRfdmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX1JFVFJJRVZFX0NVUlJFTlRfQUxBUk1fU1VNTUFSWToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hY3Rpb25fdmFsdWVfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZHBvZV9hY3Rpb25fdmFsdWVfYmFzZSAqdGhpcykKK3sKKyAgICBpZiAodGhpcy0+d2lkdGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMtPndpZHRoOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB1aW50MzJfdCBjb3VudCA9IDM7CisgICAgICAgIHN3aXRjaCAodGhpcy0+bGVhZikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9SRVNFVF9PTlU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fQUREX0RZTl9NQUNfQUREUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5hZGRfZHluX21hY19hZGRyLm1hY19hZGRlc3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fREVMX0RZTl9NQUNfQUREUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5kZWxfZHluX21hY19hZGRyLm1hY19hZGRyZXNzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0FERF9TVEFUSUNfTUFDX0FERFI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGVfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuYWRkX3N0YXRpY19tYWNfYWRkci5tYWNfYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9ERUxfU1RBVElDX01BQ19BRERSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmRlbF9zdGF0aWNfbWFjX2FkZHIubWFjX2FkZHJlc3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fTE9PUEJBQ0tfRU5BQkxFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0xPT1BCQUNLX0RJU0FCTEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fTEFTRVJfVFhfUE9XRVJfT0ZGOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0NMRUFSX0lOR1JFU1NfUlVMRVM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fQUREX0lOR1JFU1NfUlVMRVM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fREVMX0lOR1JFU1NfUlVMRVM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fRU5BQkxFX1VTRVJfVFJBRkZJQzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9ESVNBQkxFX1VTRVJfVFJBRkZJQzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9DTEVBUl9EWU5fTEVBUk5fVEFCTEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fQ0xFQVJfU1RBVElDX0xFQVJOX1RBQkxFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0NMRUFSX1NUQVRTOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0NPTkZJR1VSRV9NQ0FTVF9MTElEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX1JFVFJJRVZFX0NVUlJFTlRfQUxBUk1fU1VNTUFSWToKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2FjdGlvbl92YWx1ZV9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9hY3Rpb25fdmFsdWVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYWN0aW9uX3VucGFjaygmdGhpcy0+bGVhZiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT53aWR0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPndpZHRoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+d2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT5sZWFmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9SRVNFVF9PTlU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9BRERfRFlOX01BQ19BRERSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlX3VucGFjaygmdGhpcy0+dS5hZGRfZHluX21hY19hZGRyLm1hY19hZGRlc3MsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0RFTF9EWU5fTUFDX0FERFI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGVfdW5wYWNrKCZ0aGlzLT51LmRlbF9keW5fbWFjX2FkZHIubWFjX2FkZHJlc3MsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0FERF9TVEFUSUNfTUFDX0FERFI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGVfdW5wYWNrKCZ0aGlzLT51LmFkZF9zdGF0aWNfbWFjX2FkZHIubWFjX2FkZHJlc3MsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0RFTF9TVEFUSUNfTUFDX0FERFI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGVfdW5wYWNrKCZ0aGlzLT51LmRlbF9zdGF0aWNfbWFjX2FkZHIubWFjX2FkZHJlc3MsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0xPT1BCQUNLX0VOQUJMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2xvb3BiYWNrX2xvY2F0aW9uX3VucGFjaygmdGhpcy0+dS5sb29wYmFja19lbmFibGUubG9jYXRpb24sICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9MT09QQkFDS19ESVNBQkxFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbG9vcGJhY2tfbG9jYXRpb25fdW5wYWNrKCZ0aGlzLT51Lmxvb3BiYWNrX2Rpc2FibGUubG9jYXRpb24sICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9MQVNFUl9UWF9QT1dFUl9PRkY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5sYXNlcl90eF9wb3dlcl9vZmYuZGlzYWJsZV90aW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9DTEVBUl9JTkdSRVNTX1JVTEVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fQUREX0lOR1JFU1NfUlVMRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9ERUxfSU5HUkVTU19SVUxFUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0VOQUJMRV9VU0VSX1RSQUZGSUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9ESVNBQkxFX1VTRVJfVFJBRkZJQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0NMRUFSX0RZTl9MRUFSTl9UQUJMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0NMRUFSX1NUQVRJQ19MRUFSTl9UQUJMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0NMRUFSX1NUQVRTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fQ09ORklHVVJFX01DQVNUX0xMSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9sbGlkX2FjdGlvbl91bnBhY2soJnRoaXMtPnUuY29uZmlndXJlX21jYXN0X2xsaWQubGxpZF9hY3Rpb24sICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmNvbmZpZ3VyZV9tY2FzdF9sbGlkLmxsaWRfdmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX1JFVFJJRVZFX0NVUlJFTlRfQUxBUk1fU1VNTUFSWToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+d2lkdGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hY3Rpb25fdmFsdWVfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFmX2FjdGlvbiBsZWFmOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50OF90IGxlbmd0aDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYWN0aW9uX3VucGFjaygmbGVhZiwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAobGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fUkVTRVRfT05VOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fQUREX0RZTl9NQUNfQUREUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZV9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0RFTF9EWU5fTUFDX0FERFI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGVfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9BRERfU1RBVElDX01BQ19BRERSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fREVMX1NUQVRJQ19NQUNfQUREUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZV9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0xPT1BCQUNLX0VOQUJMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fTE9PUEJBQ0tfRElTQUJMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fTEFTRVJfVFhfUE9XRVJfT0ZGOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9DTEVBUl9JTkdSRVNTX1JVTEVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fQUREX0lOR1JFU1NfUlVMRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9ERUxfSU5HUkVTU19SVUxFUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0VOQUJMRV9VU0VSX1RSQUZGSUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9ESVNBQkxFX1VTRVJfVFJBRkZJQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0NMRUFSX0RZTl9MRUFSTl9UQUJMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0NMRUFSX1NUQVRJQ19MRUFSTl9UQUJMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0NMRUFSX1NUQVRTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fQ09ORklHVVJFX01DQVNUX0xMSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9SRVRSSUVWRV9DVVJSRU5UX0FMQVJNX1NVTU1BUlk6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9zZXRfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9zZXQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5xdWV1ZV9jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5xdWV1ZV9jb3VudCA+IDApICYmICh0aGlzLT5xdWV1ZV9zaXplcyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJxdWV1ZV9zaXplc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3NldFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT5xdWV1ZV9zaXplcywgdGhpcy0+cXVldWVfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfc2V0X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3NldCAqdGhpcykKK3sKKyAgICByZXR1cm4gMSArIHRoaXMtPnF1ZXVlX2NvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9zZXRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3NldCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnF1ZXVlX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPnF1ZXVlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnF1ZXVlX3NpemVzID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicXVldWVfc2l6ZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9zZXRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+cXVldWVfc2l6ZXMgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+cXVldWVfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT5xdWV1ZV9zaXplcywgdGhpcy0+cXVldWVfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9zZXRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBxdWV1ZV9jb3VudDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZxdWV1ZV9jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50OF90KSAqIHF1ZXVlX2NvdW50KTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIHF1ZXVlX2NvdW50ICogMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF90eXBlX3BhY2sodGhpcy0+dHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5pbnN0YW5jZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cXVldWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF90eXBlX3VucGFjaygmdGhpcy0+dHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5pbnN0YW5jZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+cXVldWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF90eXBlX3BhY2sodGhpcy0+b2JqZWN0X3R5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmxlbmd0aCA+PSAweDAwODApCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vYmplY3RfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfT05VOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251Lmluc3RhbmNlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9ORVRXT1JLX1BPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUubmV0d29ya19wb24ucG9uX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUubmV0d29ya19wb24ucG9uID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInBvblwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2VfbmV0d29ya19wb25cIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5uZXR3b3JrX3Bvbi5wb24sIHRoaXMtPnUubmV0d29ya19wb24ucG9uX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9MSU5LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5saW5rLmxpbmtfY291bnQgPiAwKSAmJiAodGhpcy0+dS5saW5rLmxpbmsgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibGlua1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2VfbGlua1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmxpbmsubGluaywgdGhpcy0+dS5saW5rLmxpbmtfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX1VTRVJfUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUudXNlcl9wb3J0LnBvcnRfY291bnQgPiAwKSAmJiAodGhpcy0+dS51c2VyX3BvcnQucG9ydCA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwb3J0XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZV91c2VyX3BvcnRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS51c2VyX3BvcnQucG9ydCwgdGhpcy0+dS51c2VyX3BvcnQucG9ydF9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfUVVFVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9wYWNrKCZ0aGlzLT51LnF1ZXVlLnF1ZXVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX01DQVNUX0xJTks6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUubWNhc3RfbGluay5tY2FzdF9sbGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9CUklER0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmJyaWRnZS5icmlkZ2VfY291bnQgPiAwKSAmJiAodGhpcy0+dS5icmlkZ2UuYnJpZGdlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImJyaWRnZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2VfYnJpZGdlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuYnJpZGdlLmJyaWRnZSwgdGhpcy0+dS5icmlkZ2UuYnJpZGdlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9CUklER0VfUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuYnJpZGdlX3BvcnQucG9ydF9jb3VudCA+IDApICYmICh0aGlzLT51LmJyaWRnZV9wb3J0LnBvcnQgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicG9ydFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2VfYnJpZGdlX3BvcnRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5icmlkZ2VfcG9ydC5wb3J0LCB0aGlzLT51LmJyaWRnZV9wb3J0LnBvcnRfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX01FUDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2UgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPmxlbmd0aCA+PSAweDAwODApCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy0+bGVuZ3RoOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB1aW50MzJfdCBjb3VudCA9IDM7CisgICAgICAgIHN3aXRjaCAodGhpcy0+b2JqZWN0X3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfT05VOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX05FVFdPUktfUE9OOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gdGhpcy0+dS5uZXR3b3JrX3Bvbi5wb25fY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9MSU5LOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gdGhpcy0+dS5saW5rLmxpbmtfY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9VU0VSX1BPUlQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSB0aGlzLT51LnVzZXJfcG9ydC5wb3J0X2NvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfUVVFVUU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfTUNBU1RfTElOSzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9CUklER0U6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSB0aGlzLT51LmJyaWRnZS5icmlkZ2VfY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9CUklER0VfUE9SVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IHRoaXMtPnUuYnJpZGdlX3BvcnQucG9ydF9jb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX01FUDoKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfdHlwZV91bnBhY2soJnRoaXMtPm9iamVjdF90eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPmxlbmd0aCA+PSAweDAwODApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT5sZW5ndGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT5sZW5ndGgsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT5vYmplY3RfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfT05VOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnUuaW5zdGFuY2UpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX05FVFdPUktfUE9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMtPnUubmV0d29ya19wb24ucG9uX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZV9uZXR3b3JrX3Bvbl9jb3VudF9wb24oJnBvc3RMZW5CdWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5uZXR3b3JrX3Bvbi5wb25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5uZXR3b3JrX3Bvbi5wb24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwb25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlX25ldHdvcmtfcG9uXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUubmV0d29ya19wb24ucG9uID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUubmV0d29ya19wb24ucG9uX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51Lm5ldHdvcmtfcG9uLnBvbiwgdGhpcy0+dS5uZXR3b3JrX3Bvbi5wb25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX0xJTks6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5saW5rLmxpbmtfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlX2xpbmtfY291bnRfbGluaygmcG9zdExlbkJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmxpbmsubGlua19jb3VudCA+IDApICYmICh0aGlzLT51LmxpbmsubGluayA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImxpbmtcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlX2xpbmtcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5saW5rLmxpbmsgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5saW5rLmxpbmtfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUubGluay5saW5rLCB0aGlzLT51LmxpbmsubGlua19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfVVNFUl9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMtPnUudXNlcl9wb3J0LnBvcnRfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlX3VzZXJfcG9ydF9jb3VudF9wb3J0KCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUudXNlcl9wb3J0LnBvcnRfY291bnQgPiAwKSAmJiAodGhpcy0+dS51c2VyX3BvcnQucG9ydCA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInBvcnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlX3VzZXJfcG9ydFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnVzZXJfcG9ydC5wb3J0ID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUudXNlcl9wb3J0LnBvcnRfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUudXNlcl9wb3J0LnBvcnQsIHRoaXMtPnUudXNlcl9wb3J0LnBvcnRfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX1FVRVVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfdW5wYWNrKCZ0aGlzLT51LnF1ZXVlLnF1ZXVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9NQ0FTVF9MSU5LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUubWNhc3RfbGluay5tY2FzdF9sbGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9CUklER0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5icmlkZ2UuYnJpZGdlX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZV9icmlkZ2VfY291bnRfYnJpZGdlKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuYnJpZGdlLmJyaWRnZV9jb3VudCA+IDApICYmICh0aGlzLT51LmJyaWRnZS5icmlkZ2UgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJicmlkZ2VcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlX2JyaWRnZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmJyaWRnZS5icmlkZ2UgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5icmlkZ2UuYnJpZGdlX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LmJyaWRnZS5icmlkZ2UsIHRoaXMtPnUuYnJpZGdlLmJyaWRnZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfQlJJREdFX1BPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5icmlkZ2VfcG9ydC5wb3J0X2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZV9icmlkZ2VfcG9ydF9jb3VudF9wb3J0KCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuYnJpZGdlX3BvcnQucG9ydF9jb3VudCA+IDApICYmICh0aGlzLT51LmJyaWRnZV9wb3J0LnBvcnQgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwb3J0XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZV9icmlkZ2VfcG9ydFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmJyaWRnZV9wb3J0LnBvcnQgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5icmlkZ2VfcG9ydC5wb3J0X2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LmJyaWRnZV9wb3J0LnBvcnQsIHRoaXMtPnUuYnJpZGdlX3BvcnQucG9ydF9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfTUVQOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+bGVuZ3RoID09IDApID8gMHgwMDgwIDogdGhpcy0+bGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfdHlwZSBvYmplY3RfdHlwZTsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDhfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfdHlwZV91bnBhY2soJm9iamVjdF90eXBlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgc3dpdGNoIChvYmplY3RfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfT05VOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9ORVRXT1JLX1BPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwb25fZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcG9uX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQocG9uX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfTElOSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBsaW5rX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGxpbmtfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChsaW5rX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfVVNFUl9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHBvcnRfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcG9ydF9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHBvcnRfZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9RVUVVRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfTUNBU1RfTElOSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfQlJJREdFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJyaWRnZV9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBicmlkZ2VfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChicmlkZ2VfZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9CUklER0VfUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwb3J0X2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHBvcnRfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChwb3J0X2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfTUVQOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2VfbmV0d29ya19wb25fY291bnRfcG9uKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2VfbGlua19jb3VudF9saW5rKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2VfdXNlcl9wb3J0X2NvdW50X3BvcnQoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZV9icmlkZ2VfY291bnRfYnJpZGdlKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2VfYnJpZGdlX3BvcnRfY291bnRfcG9ydChiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9kZXNjcmlwdG9yX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2Rlc2NyaXB0b3IgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2JyYW5jaF9wYWNrKHRoaXMtPmJyYW5jaCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5lbmQudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmtub3duXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2Rlc2NyaXB0b3JfZW5kXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZW5kLnVua25vd24sIHRoaXMtPnUuZW5kLnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9TVEFOREFSRF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlX3BhY2sodGhpcy0+dS5zdGFuZGFyZF9hdHRyaWJ1dGUubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfU1RBTkRBUkRfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2FjdGlvbl9wYWNrKHRoaXMtPnUuc3RhbmRhcmRfYWN0aW9uLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX09CSkVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2VfcGFjaygmdGhpcy0+dS5vYmplY3Qub2JqZWN0X2NvbnRleHQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VYVEVOREVEX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYXR0cmlidXRlX3BhY2sodGhpcy0+dS5leHRlbmRlZF9hdHRyaWJ1dGUubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRVhURU5ERURfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hY3Rpb25fcGFjayh0aGlzLT51LmV4dGVuZGVkX2FjdGlvbi5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9QUk9HUkFNTUFCTEVfQ09VTlRFUjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5kZWYubGVhZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvcl9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvciAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgc3dpdGNoICh0aGlzLT5icmFuY2gpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9TVEFOREFSRF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9TVEFOREFSRF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9PQkpFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5vYmplY3Qub2JqZWN0X2NvbnRleHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VYVEVOREVEX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VYVEVOREVEX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX1BST0dSQU1NQUJMRV9DT1VOVEVSOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9kZXNjcmlwdG9yX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYnJhbmNoX3VucGFjaygmdGhpcy0+YnJhbmNoLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+YnJhbmNoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgPSBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvcl9lbmRfY291bnRfdW5rbm93bihidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCA+IDApICYmICh0aGlzLT51LmVuZC51bmtub3duID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidW5rbm93blwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9kZXNjcmlwdG9yX2VuZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmVuZC51bmtub3duID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LmVuZC51bmtub3duLCB0aGlzLT51LmVuZC51bmtub3duX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfU1RBTkRBUkRfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2F0dHJpYnV0ZV91bnBhY2soJnRoaXMtPnUuc3RhbmRhcmRfYXR0cmlidXRlLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX1NUQU5EQVJEX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hY3Rpb25fdW5wYWNrKCZ0aGlzLT51LnN0YW5kYXJkX2FjdGlvbi5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9PQkpFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlX3VucGFjaygmdGhpcy0+dS5vYmplY3Qub2JqZWN0X2NvbnRleHQsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRVhURU5ERURfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hdHRyaWJ1dGVfdW5wYWNrKCZ0aGlzLT51LmV4dGVuZGVkX2F0dHJpYnV0ZS5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFmX2FjdGlvbl91bnBhY2soJnRoaXMtPnUuZXh0ZW5kZWRfYWN0aW9uLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX1BST0dSQU1NQUJMRV9DT1VOVEVSOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmRlZi5sZWFmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2Rlc2NyaXB0b3Jfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYnJhbmNoIGJyYW5jaDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2JyYW5jaF91bnBhY2soJmJyYW5jaCwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB1bmtub3duX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB1bmtub3duX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodW5rbm93bl9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9TVEFOREFSRF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfU1RBTkRBUkRfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX09CSkVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2Vfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VYVEVOREVEX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfUFJPR1JBTU1BQkxFX0NPVU5URVI6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9kZXNjcmlwdG9yX2VuZF9jb3VudF91bmtub3duKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc3RhdGlzdGljX3RocmVzaG9sZF9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3N0YXRpc3RpY190aHJlc2hvbGQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9kZXNjcmlwdG9yX3BhY2soJnRoaXMtPnN0YXRpc3RpYywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+cmlzaW5nX3RocmVzaG9sZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmZhbGxpbmdfdGhyZXNob2xkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX3N0YXRpc3RpY190aHJlc2hvbGRfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc3RhdGlzdGljX3RocmVzaG9sZCAqdGhpcykKK3sKKyAgICByZXR1cm4gOCArIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9kZXNjcmlwdG9yX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5zdGF0aXN0aWMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9zdGF0aXN0aWNfdGhyZXNob2xkX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9zdGF0aXN0aWNfdGhyZXNob2xkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvcl91bnBhY2soJnRoaXMtPnN0YXRpc3RpYywgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5yaXNpbmdfdGhyZXNob2xkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+ZmFsbGluZ190aHJlc2hvbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9zdGF0aXN0aWNfdGhyZXNob2xkX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2Rlc2NyaXB0b3Jfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWVsZF9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpZWxkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9maWVsZF9jb2RlX3BhY2sodGhpcy0+Y29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5pbnN0YW5jZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpZWxkX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9maWVsZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmllbGRfY29kZV91bnBhY2soJnRoaXMtPmNvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+aW5zdGFuY2UpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWVsZF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZF92Ml9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X2ZpZWxkX3YyICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9maWVsZF9wYWNrKCZ0aGlzLT5maWVsZCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5tc2JfbWFzaykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bHNiX21hc2spKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZF92Ml91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGRfdjIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpZWxkX3VucGFjaygmdGhpcy0+ZmllbGQsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5tc2JfbWFzaykpCisgICAgeworICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bHNiX21hc2spKQorICAgIHsKKyAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZF92Ml9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZF9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X2ZpZWxkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9maWVsZF9wYWNrKCZ0aGlzLT5maWVsZCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X2ZpZWxkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9maWVsZF91bnBhY2soJnRoaXMtPmZpZWxkLCBidWYsIGV4dHJhX21lbSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X2ZpZWxkX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3Jlc3VsdF9wYWNrKHRoaXMtPnJlc3VsdCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnJlc3VsdCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX05PUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBubyBkYXRhIHRvIHBhY2sgZm9yIGVtcHR5ICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfRElTQ0FSRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBubyBkYXRhIHRvIHBhY2sgZm9yIGVtcHR5ICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfRk9SV0FSRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBubyBkYXRhIHRvIHBhY2sgZm9yIGVtcHR5ICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfUVVFVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9wYWNrKCZ0aGlzLT51LnF1ZXVlLnF1ZXVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9TRVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZF92Ml9wYWNrKCZ0aGlzLT51LnNldC5maWVsZCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0LnZhbHVlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0LnZhbHVlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbHVlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfc2V0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuc2V0LnZhbHVlLCB0aGlzLT51LnNldC52YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX0NPUFk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZF92Ml9wYWNrKCZ0aGlzLT51LmNvcHkuZmllbGQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX0RFTEVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X2ZpZWxkX3BhY2soJnRoaXMtPnUuZGVsZXRlLmZpZWxkLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9JTlNFUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZF9wYWNrKCZ0aGlzLT51Lmluc2VydC5maWVsZCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfUkVQTEFDRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X2ZpZWxkX3BhY2soJnRoaXMtPnUucmVwbGFjZS5maWVsZCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfQ0xFQVJfREVMRVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGRfcGFjaygmdGhpcy0+dS5jbGVhcl9kZWxldGUuZmllbGQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX0NMRUFSX0lOU0VSVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X2ZpZWxkX3BhY2soJnRoaXMtPnUuY2xlYXJfaW5zZXJ0LmZpZWxkLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdCAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgc3dpdGNoICh0aGlzLT5yZXN1bHQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9OT1A6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfRElTQ0FSRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9GT1JXQVJEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX1FVRVVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfU0VUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDQgKyB0aGlzLT51LnNldC52YWx1ZV9jb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9DT1BZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfREVMRVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfSU5TRVJUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfUkVQTEFDRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX0NMRUFSX0RFTEVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX0NMRUFSX0lOU0VSVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmVzdWx0X3VucGFjaygmdGhpcy0+cmVzdWx0LCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+cmVzdWx0KQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfTk9QOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIG5vIGRhdGEgdG8gdW5wYWNrICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfRElTQ0FSRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBubyBkYXRhIHRvIHVucGFjayAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX0ZPUldBUkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogbm8gZGF0YSB0byB1bnBhY2sgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9RVUVVRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3VucGFjaygmdGhpcy0+dS5xdWV1ZS5xdWV1ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9TRVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZF92Ml91bnBhY2soJnRoaXMtPnUuc2V0LmZpZWxkLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGhpcy0+dS5zZXQudmFsdWVfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9zZXRfY291bnRfdmFsdWUoYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0LnZhbHVlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0LnZhbHVlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsdWVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9zZXRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5zZXQudmFsdWUgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5zZXQudmFsdWVfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LnNldC52YWx1ZSwgdGhpcy0+dS5zZXQudmFsdWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9DT1BZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGRfdjJfdW5wYWNrKCZ0aGlzLT51LmNvcHkuZmllbGQsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfREVMRVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGRfdW5wYWNrKCZ0aGlzLT51LmRlbGV0ZS5maWVsZCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9JTlNFUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZF91bnBhY2soJnRoaXMtPnUuaW5zZXJ0LmZpZWxkLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX1JFUExBQ0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZF91bnBhY2soJnRoaXMtPnUucmVwbGFjZS5maWVsZCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9DTEVBUl9ERUxFVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZF91bnBhY2soJnRoaXMtPnUuY2xlYXJfZGVsZXRlLmZpZWxkLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX0NMRUFSX0lOU0VSVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X2ZpZWxkX3VucGFjaygmdGhpcy0+dS5jbGVhcl9pbnNlcnQuZmllbGQsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9yZXN1bHQgcmVzdWx0OworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmVzdWx0X3VucGFjaygmcmVzdWx0LCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAocmVzdWx0KQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfTk9QOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX0RJU0NBUkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfRk9SV0FSRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9RVUVVRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9TRVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsdWVfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZF92Ml9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh2YWx1ZV9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9DT1BZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGRfdjJfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX0RFTEVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9JTlNFUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfUkVQTEFDRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9DTEVBUl9ERUxFVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfQ0xFQVJfSU5TRVJUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X3NldF9jb3VudF92YWx1ZShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcnVsZV90eXBlX3BhY2sodGhpcy0+c3VidHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnN1YnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfVEVSTUlOQVRPUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfSEVBREVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuaGVhZGVyLnByZWNlZGVuY2UpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfQ0xBVVNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmllbGRfcGFjaygmdGhpcy0+dS5jbGF1c2UuZmllbGRfY29kZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmNsYXVzZS5tc2JfbWFzaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5jbGF1c2UubHNiX21hc2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3J1bGVfb3BlcmF0b3JfcGFjayh0aGlzLT51LmNsYXVzZS5vcGVyYXRvciwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmNsYXVzZS5tYXRjaF92YWx1ZV9sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5jbGF1c2UubWF0Y2hfdmFsdWVfbGVuZ3RoID4gMCkgJiYgKHRoaXMtPnUuY2xhdXNlLm1hdGNoX3ZhbHVlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm1hdGNoX3ZhbHVlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9jbGF1c2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5jbGF1c2UubWF0Y2hfdmFsdWUsIHRoaXMtPnUuY2xhdXNlLm1hdGNoX3ZhbHVlX2xlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9SRVNVTFQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9wYWNrKCZ0aGlzLT51LnJlc3VsdC5yZXN1bHQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9FTlRSWToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICBzd2l0Y2ggKHRoaXMtPnN1YnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfVEVSTUlOQVRPUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfSEVBREVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUlVMRV9UWVBFX0NMQVVTRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA2ICsgdGhpcy0+dS5jbGF1c2UubWF0Y2hfdmFsdWVfbGVuZ3RoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9SRVNVTFQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUucmVzdWx0LnJlc3VsdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUlVMRV9UWVBFX0VOVFJZOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcnVsZV90eXBlX3VucGFjaygmdGhpcy0+c3VidHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnN1YnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfVEVSTUlOQVRPUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfSEVBREVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuaGVhZGVyLnByZWNlZGVuY2UpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfQ0xBVVNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmllbGRfdW5wYWNrKCZ0aGlzLT51LmNsYXVzZS5maWVsZF9jb2RlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5jbGF1c2UubXNiX21hc2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuY2xhdXNlLmxzYl9tYXNrKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9ydWxlX29wZXJhdG9yX3VucGFjaygmdGhpcy0+dS5jbGF1c2Uub3BlcmF0b3IsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5jbGF1c2UubWF0Y2hfdmFsdWVfbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuY2xhdXNlLm1hdGNoX3ZhbHVlX2xlbmd0aCA+IDApICYmICh0aGlzLT51LmNsYXVzZS5tYXRjaF92YWx1ZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm1hdGNoX3ZhbHVlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9jbGF1c2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5jbGF1c2UubWF0Y2hfdmFsdWUgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5jbGF1c2UubWF0Y2hfdmFsdWVfbGVuZ3RoICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5jbGF1c2UubWF0Y2hfdmFsdWUsIHRoaXMtPnUuY2xhdXNlLm1hdGNoX3ZhbHVlX2xlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9SRVNVTFQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF91bnBhY2soJnRoaXMtPnUucmVzdWx0LnJlc3VsdCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfRU5UUlk6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fcnVsZV90eXBlIHN1YnR5cGU7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcnVsZV90eXBlX3VucGFjaygmc3VidHlwZSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHN1YnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfVEVSTUlOQVRPUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfSEVBREVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9DTEFVU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBtYXRjaF92YWx1ZV9sZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZtYXRjaF92YWx1ZV9sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiBtYXRjaF92YWx1ZV9sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbWF0Y2hfdmFsdWVfbGVuZ3RoICogMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9SRVNVTFQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUlVMRV9UWVBFX0VOVFJZOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3NoYXBlcl9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3NoYXBlciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnF1ZXVlX2JpdG1hcCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPm1heGltdW1fcmF0ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmJ1cnN0X3NpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9zaGFwZXJfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3NoYXBlciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnF1ZXVlX2JpdG1hcCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPm1heGltdW1fcmF0ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmJ1cnN0X3NpemUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9zaGFwZXJfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA3KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmF0ZV9sZXZlbF9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3JhdGVfbGV2ZWwgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90cmFmZmljX2JpdG1hcF9wYWNrKHRoaXMtPnRyYWZmaWNfdHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+bWF4aW11bV9yYXRlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmF0ZV9sZXZlbF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmF0ZV9sZXZlbCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3RyYWZmaWNfYml0bWFwX3VucGFjaygmdGhpcy0+dHJhZmZpY190eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5tYXhpbXVtX3JhdGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9yYXRlX2xldmVsX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X29wdGlvbnNfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9ldmVudF9vcHRpb25zICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+ZXZlbnRfY29kZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+ZW5hYmxlZF9kaXNhYmxlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X29wdGlvbnNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X29wdGlvbnMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5ldmVudF9jb2RlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5lbmFibGVkX2Rpc2FibGVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXZlbnRfb3B0aW9uc19zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdTE2X2xpc3RfdThfcGFjayhiY21vbHRfZXBvbl9vYW1fdTE2X2xpc3RfdTggKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV91MTZfbGlzdF91OFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5sZW47IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dmFsW2kwXSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3UxNl9saXN0X3U4X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV91MTZfbGlzdF91OCAqdGhpcykKK3sKKyAgICByZXR1cm4gMSArICgyICogdGhpcy0+bGVuKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3UxNl9saXN0X3U4X3VucGFjayhiY21vbHRfZXBvbl9vYW1fdTE2X2xpc3RfdTggKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmxlbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW4gPiAwKSAmJiAodGhpcy0+dmFsID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3UxNl9saXN0X3U4XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnZhbCA9ICh1aW50MTZfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+bGVuICogc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5sZW47IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dmFsW2kwXSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdTE2X2xpc3RfdThfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBsZW47CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQxNl90KSAqIGxlbik7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBsZW4gKiAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYXR0cmlidXRlX3BhY2sodGhpcy0+bGVhZiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+d2lkdGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPndpZHRoKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5sZWFmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9TRVFVRU5DRV9OVU1CRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuc2VxdWVuY2VfbnVtYmVyLnNlcXVuY2VfbnVtYmVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PTlVfSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5vbnVfaWQuaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0ZJUk1XQVJFX0lORk86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZmlybXdhcmVfaW5mby5ib290X3ZlcnNpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmZpcm13YXJlX2luZm8uYm9vdF9jcmMzMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZmlybXdhcmVfaW5mby5hcHBsaWNhdGlvbl92ZXJzaW9uKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5maXJtd2FyZV9pbmZvLmFwcGxpY2F0aW9uX2NyYzMyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9DSElQX0lORk86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuY2hpcF9pbmZvLmplZGVjX2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5jaGlwX2luZm8uY2hpcF9tb2RlbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuY2hpcF9pbmZvLmNoaXBfdmVyc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfREFURV9PRl9NQU5VRkFDVFVSRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5kYXRlX29mX21hbnVmYWN0dXJlLnllYXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZGF0ZV9vZl9tYW51ZmFjdHVyZS5tb250aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5kYXRlX29mX21hbnVmYWN0dXJlLmRheSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTUFOVUZBQ1RVUkVSX0lORk86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm1hbnVmYWN0dXJlcl9pbmZvLmRlZl9jb3VudCA+IDApICYmICh0aGlzLT51Lm1hbnVmYWN0dXJlcl9pbmZvLmRlZiA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJkZWZcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9tYW51ZmFjdHVyZXJfaW5mb1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51Lm1hbnVmYWN0dXJlcl9pbmZvLmRlZiwgdGhpcy0+dS5tYW51ZmFjdHVyZXJfaW5mby5kZWZfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX01BWF9MT0dJQ0FMX0xJTktTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lm1heF9sb2dpY2FsX2xpbmtzLmJpZGlyZWN0aW9uYWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lm1heF9sb2dpY2FsX2xpbmtzLmRvd25zdHJlYW1fb25seSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTlVNX0VQT05fUE9SVFM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUubnVtX2Vwb25fcG9ydHMucG9ydF9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTlVNX1VOSV9QT1JUUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5udW1fdW5pX3BvcnRzLnBvcnRfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BBQ0tFVF9CVUZGRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5wYWNrZXRfYnVmZmVyLnVwc3RyZWFtX3F1ZXVlcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5wYWNrZXRfYnVmZmVyLnVwX3F1ZXVlc19tYXhfcGVyX2xpbmspKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUucGFja2V0X2J1ZmZlci51cF9xdWV1ZV9pbmNyZW1lbnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUucGFja2V0X2J1ZmZlci5kb3duc3RyZWFtX3F1ZXVlcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5wYWNrZXRfYnVmZmVyLmRuX3F1ZXVlc19tYXhfcGVyX3BvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUucGFja2V0X2J1ZmZlci5kbl9xdWV1ZV9pbmNyZW1lbnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnBhY2tldF9idWZmZXIudG90YWxfcGFja2V0X2J1ZmZlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUucGFja2V0X2J1ZmZlci51cHN0cmVhbV9wYWNrZXRfYnVmZmVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5wYWNrZXRfYnVmZmVyLmRvd25zcmVhbV9wYWNrZXRfYnVmZmVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SRVBPUlRfVEhSRVNIT0xEUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMubnVtYmVyX29mX3F1ZXVlX3NldHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0ID4gMCkgJiYgKHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucXVldWVfc2V0MCA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJxdWV1ZV9zZXQwXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfcmVwb3J0X3RocmVzaG9sZHNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy5yZXBvcnRfdmFsdWVzX3Blcl9xdWV1ZV9zZXQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy5xdWV1ZV9zZXQwW2kwXSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgoKHVpbnQ2NF90KSB0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLm51bWJlcl9vZl9xdWV1ZV9zZXRzID4gMHgwMDAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy5yZXBvcnRfdmFsdWVzX3Blcl9xdWV1ZV9zZXQgPiAwKSAmJiAodGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy5xdWV1ZV9zZXQxID09IE5VTEwpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicXVldWVfc2V0MVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX3JlcG9ydF90aHJlc2hvbGRzXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTE7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0OyBpMSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy5xdWV1ZV9zZXQxW2kxXSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCgodWludDY0X3QpIHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMubnVtYmVyX29mX3F1ZXVlX3NldHMgPiAweDAwMDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnJlcG9ydF92YWx1ZXNfcGVyX3F1ZXVlX3NldCA+IDApICYmICh0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnF1ZXVlX3NldDIgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJxdWV1ZV9zZXQyXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfcmVwb3J0X3RocmVzaG9sZHNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCBpMjsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpMiA9IDA7IGkyIDwgdGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy5yZXBvcnRfdmFsdWVzX3Blcl9xdWV1ZV9zZXQ7IGkyKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnF1ZXVlX3NldDJbaTJdKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKCh1aW50NjRfdCkgdGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy5udW1iZXJfb2ZfcXVldWVfc2V0cyA+IDB4MDAwMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0ID4gMCkgJiYgKHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucXVldWVfc2V0MyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInF1ZXVlX3NldDNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9yZXBvcnRfdGhyZXNob2xkc1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB1aW50OF90IGkzOworICAgICAgICAgICAgICAgICAgICBmb3IgKGkzID0gMDsgaTMgPCB0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnJlcG9ydF92YWx1ZXNfcGVyX3F1ZXVlX3NldDsgaTMrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucXVldWVfc2V0M1tpM10pKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0xJTktfU1RBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9saW5rX3N0YXRlX3BhY2sodGhpcy0+dS5saW5rX3N0YXRlLmxpbmtfc3RhdGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT0FNX1JBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vYW1fcmF0ZS5tYXhpbXVtX29hbV9yYXRlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9hbV9yYXRlLm1pbmltdW1fb2FtX3JhdGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RZTl9MRUFSTl9UQUJMRV9TSVpFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmR5bl9sZWFybl90YWJsZV9zaXplLm1heF9tYWNfYWxsb3dlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRFlOX0xFQVJOX0FHRV9MSU1JVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5keW5fbGVhcm5fYWdlX2xpbWl0LmR5bmFtaWNfYWRkcmVzc19hZ2VfbGltaXQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RZTl9NQUNfVEFCTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGVfcGFjaygmdGhpcy0+dS5keW5fbWFjX3RhYmxlLm1hY19hZGRyZXNzLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1NUQVRJQ19NQUNfVEFCTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGVfcGFjaygmdGhpcy0+dS5zdGF0aWNfbWFjX3RhYmxlLm1hY19hZGRyZXNzLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BPUlRfQ0FQQUJJTElUWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9hdXRvX25lZ290aWF0aW9uX2NhcGFiaWxpdHlfcGFjayh0aGlzLT51LnBvcnRfY2FwYWJpbGl0eS5tYXhpbXVtX2NhcGFiaWxpdGllcywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9hdXRvX25lZ290aWF0aW9uX2NhcGFiaWxpdHlfcGFjayh0aGlzLT51LnBvcnRfY2FwYWJpbGl0eS5jdXJyZW50X2NhcGFiaWxpdGllcywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EWU5fTEVBUk5fTU9ERToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYXJuaW5nX21vZGVfcGFjayh0aGlzLT51LmR5bl9sZWFybl9tb2RlLmxlYXJuaW5nX21vZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTUlOX01BQ19MSU1JVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5taW5fbWFjX2xpbWl0Lm1pbmltdW1fZ3VhcmFudGVlZF9saW1pdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTUFYX01BQ19BTExPV0VEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lm1heF9tYWNfYWxsb3dlZC5tYXhfYWxsb3dlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQUdHX01BQ19MSU1JVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5hZ2dfbWFjX2xpbWl0LmFnZ3JlZ2F0ZV9tYWNfbGltaXQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0xFTl9FUlJfRElTQ0FSRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUubGVuX2Vycl9kaXNjYXJkLmxlbl9lcnJvcl9kaXNjYXJkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9GTE9PRF9VTktOT1dOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS5mbG9vZF91bmtub3duLmZsb29kX3Vua25vd24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0xPQ0FMX1NXSVRDSElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUubG9jYWxfc3dpdGNoaW5nLmxvY2FsX3N3aXRjaGluZykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUVVFVUVfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTQ7CisgICAgICAgICAgICAgICAgdWludDhfdCBpNTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnF1ZXVlX2NvbmZpZy5udW1iZXJfb2ZfbGlua3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5xdWV1ZV9jb25maWcubnVtYmVyX29mX2xpbmtzID4gMCkgJiYgKHRoaXMtPnUucXVldWVfY29uZmlnLmxpbmtfY29uZmlndXJhdGlvbiA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJsaW5rX2NvbmZpZ3VyYXRpb25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9xdWV1ZV9jb25maWdcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNCA9IDA7IGk0IDwgdGhpcy0+dS5xdWV1ZV9jb25maWcubnVtYmVyX29mX2xpbmtzOyBpNCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9zZXRfcGFjaygmdGhpcy0+dS5xdWV1ZV9jb25maWcubGlua19jb25maWd1cmF0aW9uW2k0XSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5xdWV1ZV9jb25maWcubnVtYmVyX29mX3BvcnRzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUucXVldWVfY29uZmlnLm51bWJlcl9vZl9wb3J0cyA+IDApICYmICh0aGlzLT51LnF1ZXVlX2NvbmZpZy5wb3J0X2NvbmZpZ3VyYXRpb24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicG9ydF9jb25maWd1cmF0aW9uXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfcXVldWVfY29uZmlnXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTUgPSAwOyBpNSA8IHRoaXMtPnUucXVldWVfY29uZmlnLm51bWJlcl9vZl9wb3J0czsgaTUrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfc2V0X3BhY2soJnRoaXMtPnUucXVldWVfY29uZmlnLnBvcnRfY29uZmlndXJhdGlvbltpNV0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0ZJUk1XQVJFX0ZJTEVOQU1FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5maXJtd2FyZV9maWxlbmFtZS5maXJtd2FyZV9maWxlbmFtZV9jb3VudCA+IDApICYmICh0aGlzLT51LmZpcm13YXJlX2ZpbGVuYW1lLmZpcm13YXJlX2ZpbGVuYW1lID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImZpcm13YXJlX2ZpbGVuYW1lXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfZmlybXdhcmVfZmlsZW5hbWVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5maXJtd2FyZV9maWxlbmFtZS5maXJtd2FyZV9maWxlbmFtZSwgdGhpcy0+dS5maXJtd2FyZV9maWxlbmFtZS5maXJtd2FyZV9maWxlbmFtZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUE9SVF9TVEFUX1RIUkVTSDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3N0YXRpc3RpY190aHJlc2hvbGRfcGFjaygmdGhpcy0+dS5wb3J0X3N0YXRfdGhyZXNoLnN0YXRfdGhyZXNob2xkLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0xJTktfU1RBVF9USFJFU0g6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9zdGF0aXN0aWNfdGhyZXNob2xkX3BhY2soJnRoaXMtPnUubGlua19zdGF0X3RocmVzaC5zdGF0X3RocmVzaG9sZCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9LRVlfRVhQSVJZX1RJTUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUua2V5X2V4cGlyeV90aW1lLnRpbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0VOQ1JZUFRfTU9ERToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2VuY3J5cHRpb25fbW9kZV9wYWNrKHRoaXMtPnUuZW5jcnlwdF9tb2RlLmVuY3J5cHRpb25fbWV0aG9kLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BPUlRfSU5HUkVTU19SVUxFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9wYWNrKCZ0aGlzLT51LnBvcnRfaW5ncmVzc19ydWxlLnJ1bGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTFVFX0ZJRUxEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmllbGRfY29kZV9wYWNrKHRoaXMtPnUubHVlX2ZpZWxkLmZpZWxkX2NvZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9sYXllcl9zZWxlY3RfcGFjayh0aGlzLT51Lmx1ZV9maWVsZC5sYXllcl9zZWxlY3QsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5sdWVfZmllbGQuYml0X3dvcmRfb2Zmc2V0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lmx1ZV9maWVsZC5iaXRfb2Zmc2V0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lmx1ZV9maWVsZC5iaXRfd2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUubHVlX2ZpZWxkLnJlZmVyZW5jZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQUxUX0NWTEFOX0VUSEVSVFlQRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5hbHRfY3ZsYW5fZXRoZXJ0eXBlLnRwaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS5hbHRfY3ZsYW5fZXRoZXJ0eXBlLmluc2VydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQUxUX1NWTEFOX0VUSEVSVFlQRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5hbHRfc3ZsYW5fZXRoZXJ0eXBlLnRwaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS5hbHRfc3ZsYW5fZXRoZXJ0eXBlLmluc2VydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQkNfUkFURV9MSU1JVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5iY19yYXRlX2xpbWl0LmxpbWl0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9FR1JFU1NfU0hBUElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGk2OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3RyYWZmaWNfYml0bWFwX3BhY2sodGhpcy0+dS5lZ3Jlc3Nfc2hhcGluZy50cmFmZmljX3R5cGVzLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3JhdGVfdW5pdHNfcGFjayh0aGlzLT51LmVncmVzc19zaGFwaW5nLnJhdGVfdW5pdHMsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5lZ3Jlc3Nfc2hhcGluZy5udW1iZXJfb2Zfc2hhcGVycykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmVncmVzc19zaGFwaW5nLm51bWJlcl9vZl9zaGFwZXJzID4gMCkgJiYgKHRoaXMtPnUuZWdyZXNzX3NoYXBpbmcuc2hhcGVycyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJzaGFwZXJzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfZWdyZXNzX3NoYXBpbmdcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNiA9IDA7IGk2IDwgdGhpcy0+dS5lZ3Jlc3Nfc2hhcGluZy5udW1iZXJfb2Zfc2hhcGVyczsgaTYrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc2hhcGVyX3BhY2soJnRoaXMtPnUuZWdyZXNzX3NoYXBpbmcuc2hhcGVyc1tpNl0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0lOR1JFU1NfUE9MSUNJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpNzsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9yYXRlX3VuaXRzX3BhY2sodGhpcy0+dS5pbmdyZXNzX3BvbGljaW5nLnJhdGVfdW5pdHMsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5pbmdyZXNzX3BvbGljaW5nLm51bWJlcl9vZl9yYXRlX2xldmVscykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmluZ3Jlc3NfcG9saWNpbmcubnVtYmVyX29mX3JhdGVfbGV2ZWxzID4gMCkgJiYgKHRoaXMtPnUuaW5ncmVzc19wb2xpY2luZy5yYXRlX2xldmVscyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJyYXRlX2xldmVsc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2luZ3Jlc3NfcG9saWNpbmdcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNyA9IDA7IGk3IDwgdGhpcy0+dS5pbmdyZXNzX3BvbGljaW5nLm51bWJlcl9vZl9yYXRlX2xldmVsczsgaTcrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmF0ZV9sZXZlbF9wYWNrKCZ0aGlzLT51LmluZ3Jlc3NfcG9saWNpbmcucmF0ZV9sZXZlbHNbaTddLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9GRUNfTU9ERToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2ZlY19tb2RlX3BhY2sodGhpcy0+dS5mZWNfbW9kZS5yeF9kb3duLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmVjX21vZGVfcGFjayh0aGlzLT51LmZlY19tb2RlLnR4X3VwLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX01GUl9OQU1FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5tZnJfbmFtZS5tYW5fbmFtZV9jb3VudCA+IDApICYmICh0aGlzLT51Lm1mcl9uYW1lLm1hbl9uYW1lID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm1hbl9uYW1lXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfbWZyX25hbWVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5tZnJfbmFtZS5tYW5fbmFtZSwgdGhpcy0+dS5tZnJfbmFtZS5tYW5fbmFtZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRldBUkVfTUZHX1RJTUVfVkFSX0NUUkw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5md2FyZV9tZmdfdGltZV92YXJfY3RybC5jb2RlX2FjY2Vzc19zdGFydCwgMTMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZndhcmVfbWZnX3RpbWVfdmFyX2N0cmwuY3ZjX2FjY2Vzc19zdGFydCwgMTMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1ZFTkRPUl9OQU1FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS52ZW5kb3JfbmFtZS52ZW5kb3JfbmFtZV9jb3VudCA+IDApICYmICh0aGlzLT51LnZlbmRvcl9uYW1lLnZlbmRvcl9uYW1lID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZlbmRvcl9uYW1lXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfdmVuZG9yX25hbWVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUudmVuZG9yX25hbWUudmVuZG9yX25hbWVfY291bnQgPiAzMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LnZlbmRvcl9uYW1lLnZlbmRvcl9uYW1lLCB0aGlzLT51LnZlbmRvcl9uYW1lLnZlbmRvcl9uYW1lX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9NT0RFTF9OVU1CRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm1vZGVsX251bWJlci5tb2RlbF9udW1iZXJfY291bnQgPiAwKSAmJiAodGhpcy0+dS5tb2RlbF9udW1iZXIubW9kZWxfbnVtYmVyID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm1vZGVsX251bWJlclwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX21vZGVsX251bWJlclwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5tb2RlbF9udW1iZXIubW9kZWxfbnVtYmVyX2NvdW50ID4gMzEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5tb2RlbF9udW1iZXIubW9kZWxfbnVtYmVyLCB0aGlzLT51Lm1vZGVsX251bWJlci5tb2RlbF9udW1iZXJfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0hXX1ZFUlNJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lmh3X3ZlcnNpb24uaHdfdmVyc2lvbl9jb3VudCA+IDApICYmICh0aGlzLT51Lmh3X3ZlcnNpb24uaHdfdmVyc2lvbiA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJod192ZXJzaW9uXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfaHdfdmVyc2lvblwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5od192ZXJzaW9uLmh3X3ZlcnNpb25fY291bnQgPiAzMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51Lmh3X3ZlcnNpb24uaHdfdmVyc2lvbiwgdGhpcy0+dS5od192ZXJzaW9uLmh3X3ZlcnNpb25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09QVF9NT05fVEVNUEVSQVRVUkU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTg7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm9wdF9tb25fdGVtcGVyYXR1cmUuY3VycmVudF90ZW1wZXJhdHVyZV9jb3VudCA+IDApICYmICh0aGlzLT51Lm9wdF9tb25fdGVtcGVyYXR1cmUuY3VycmVudF90ZW1wZXJhdHVyZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjdXJyZW50X3RlbXBlcmF0dXJlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfb3B0X21vbl90ZW1wZXJhdHVyZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vcHRfbW9uX3RlbXBlcmF0dXJlLmN1cnJlbnRfdGVtcGVyYXR1cmVfY291bnQgPiA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTggPSAwOyBpOCA8IHRoaXMtPnUub3B0X21vbl90ZW1wZXJhdHVyZS5jdXJyZW50X3RlbXBlcmF0dXJlX2NvdW50OyBpOCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUub3B0X21vbl90ZW1wZXJhdHVyZS5jdXJyZW50X3RlbXBlcmF0dXJlW2k4XSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09QVF9NT05fVkNDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGk5OworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5vcHRfbW9uX3ZjYy5jdXJyZW50X3ZjY19jb3VudCA+IDApICYmICh0aGlzLT51Lm9wdF9tb25fdmNjLmN1cnJlbnRfdmNjID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImN1cnJlbnRfdmNjXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfb3B0X21vbl92Y2NcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub3B0X21vbl92Y2MuY3VycmVudF92Y2NfY291bnQgPiA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTkgPSAwOyBpOSA8IHRoaXMtPnUub3B0X21vbl92Y2MuY3VycmVudF92Y2NfY291bnQ7IGk5KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5vcHRfbW9uX3ZjYy5jdXJyZW50X3ZjY1tpOV0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PUFRfTU9OX1RYX0JJQVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTEwOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5vcHRfbW9uX3R4X2JpYXMuY3VycmVudF90eF9iaWFzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUub3B0X21vbl90eF9iaWFzLmN1cnJlbnRfdHhfYmlhcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjdXJyZW50X3R4X2JpYXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9vcHRfbW9uX3R4X2JpYXNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUub3B0X21vbl90eF9iaWFzLmN1cnJlbnRfdHhfYmlhc19jb3VudCA+IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMTAgPSAwOyBpMTAgPCB0aGlzLT51Lm9wdF9tb25fdHhfYmlhcy5jdXJyZW50X3R4X2JpYXNfY291bnQ7IGkxMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUub3B0X21vbl90eF9iaWFzLmN1cnJlbnRfdHhfYmlhc1tpMTBdKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT1BUX01PTl9UWF9QT1dFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMTE7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm9wdF9tb25fdHhfcG93ZXIuY3VycmVudF90eF9wb3dlcl9jb3VudCA+IDApICYmICh0aGlzLT51Lm9wdF9tb25fdHhfcG93ZXIuY3VycmVudF90eF9wb3dlciA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjdXJyZW50X3R4X3Bvd2VyXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfb3B0X21vbl90eF9wb3dlclwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vcHRfbW9uX3R4X3Bvd2VyLmN1cnJlbnRfdHhfcG93ZXJfY291bnQgPiA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTExID0gMDsgaTExIDwgdGhpcy0+dS5vcHRfbW9uX3R4X3Bvd2VyLmN1cnJlbnRfdHhfcG93ZXJfY291bnQ7IGkxMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUub3B0X21vbl90eF9wb3dlci5jdXJyZW50X3R4X3Bvd2VyW2kxMV0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PUFRfTU9OX1JYX1BPV0VSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxMjsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUub3B0X21vbl9yeF9wb3dlci5jdXJyZW50X3J4X3Bvd2VyX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUub3B0X21vbl9yeF9wb3dlci5jdXJyZW50X3J4X3Bvd2VyID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImN1cnJlbnRfcnhfcG93ZXJcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9vcHRfbW9uX3J4X3Bvd2VyXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9wdF9tb25fcnhfcG93ZXIuY3VycmVudF9yeF9wb3dlcl9jb3VudCA+IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMTIgPSAwOyBpMTIgPCB0aGlzLT51Lm9wdF9tb25fcnhfcG93ZXIuY3VycmVudF9yeF9wb3dlcl9jb3VudDsgaTEyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5vcHRfbW9uX3J4X3Bvd2VyLmN1cnJlbnRfcnhfcG93ZXJbaTEyXSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnJ4X3VuaWNhc3RfZnJhbWVzLnJ4X3VuaWNhc3RfZnJhbWVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS50eF91bmljYXN0X2ZyYW1lcy50eF91bmljYXN0X2ZyYW1lcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVfVE9PX1NIT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnJ4X2ZyYW1lX3Rvb19zaG9ydC5yeF9mcmFtZXNfdG9vX3Nob3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTY0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnJ4X2ZyYW1lNjQucnhfZnJhbWVzNjQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FNjUxMjc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucnhfZnJhbWU2NTEyNy5yeF9mcmFtZXM2NTEyNykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxMjgyNTU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucnhfZnJhbWUxMjgyNTUucnhfZnJhbWVzMTI4MjU1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTI1NjUxMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5yeF9mcmFtZTI1NjUxMS5yeF9mcmFtZXMyNTY1MTEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FNTEyMTAyMzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5yeF9mcmFtZTUxMjEwMjMucnhfZnJhbWVzNTEyMTAyMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxMDI0MTUxODoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5yeF9mcmFtZTEwMjQxNTE4LnJ4X2ZyYW1lczEwMjQxNTE4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTE1MTlQTFVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnJ4X2ZyYW1lMTUxOXBsdXMucnhfZnJhbWVzMTUxOXBsdXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FNjQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUudHhfZnJhbWU2NC50eF9mcmFtZXM2NCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUU2NTEyNzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS50eF9mcmFtZTY1MTI3LnR4X2ZyYW1lczY1MTI3KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTEyODI1NToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS50eF9mcmFtZTEyODI1NS50eF9mcmFtZXMxMjgyNTUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMjU2NTExOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnR4X2ZyYW1lMjU2NTExLnR4X2ZyYW1lczI1NjUxMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUU1MTIxMDIzOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnR4X2ZyYW1lNTEyMTAyMy50eF9mcmFtZXM1MTIxMDIzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTEwMjQxNTE4OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnR4X2ZyYW1lMTAyNDE1MTgudHhfZnJhbWVzMTAyNDE1MTgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMTUxOVBMVVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUudHhfZnJhbWUxNTE5cGx1cy50eF9mcmFtZXMxNTE5cGx1cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUVVFVUVfREVMQVlfVEhSRVNIOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUucXVldWVfZGVsYXlfdGhyZXNoLnF1ZXVlX2RlbGF5X3RocmVzaG9sZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUVVFVUVfREVMQVk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucXVldWVfZGVsYXkucXVldWVfZGVsYXkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0ZSQU1FU19EUk9QUEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LmZyYW1lc19kcm9wcGVkLmZyYW1lc19kcm9wcGVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9CWVRFU19EUk9QUEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LmJ5dGVzX2Ryb3BwZWQuYnl0ZXNfZHJvcHBlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQllURVNfREVMQVlFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5ieXRlc19kZWxheWVkLmJ5dGVzX2RlbGF5ZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX1VOVVNFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS50eF9ieXRlc191bnVzZWQudHhfYnl0ZXNfdW51c2VkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9ET05VX1BPUlRfVFlQRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMTM7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmRvbnVfcG9ydF90eXBlLnBvcnRfdHlwZV9jb3VudCA+IDApICYmICh0aGlzLT51LmRvbnVfcG9ydF90eXBlLnBvcnRfdHlwZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwb3J0X3R5cGVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9kb251X3BvcnRfdHlwZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxMyA9IDA7IGkxMyA8IHRoaXMtPnUuZG9udV9wb3J0X3R5cGUucG9ydF90eXBlX2NvdW50OyBpMTMrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcG9ydF90eXBlX3BhY2sodGhpcy0+dS5kb251X3BvcnRfdHlwZS5wb3J0X3R5cGVbaTEzXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfU1VTUEVORF9SRVNVTUVfQUxBUk1fUkVQT1JUSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxNDsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc3VzcGVuZF9yZXN1bWVfYWxhcm1fcmVwb3J0aW5nLmRlZl9jb3VudCA+IDApICYmICh0aGlzLT51LnN1c3BlbmRfcmVzdW1lX2FsYXJtX3JlcG9ydGluZy5kZWYgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZGVmXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfc3VzcGVuZF9yZXN1bWVfYWxhcm1fcmVwb3J0aW5nXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTE0ID0gMDsgaTE0IDwgdGhpcy0+dS5zdXNwZW5kX3Jlc3VtZV9hbGFybV9yZXBvcnRpbmcuZGVmX2NvdW50OyBpMTQrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXZlbnRfb3B0aW9uc19wYWNrKCZ0aGlzLT51LnN1c3BlbmRfcmVzdW1lX2FsYXJtX3JlcG9ydGluZy5kZWZbaTE0XSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfSVBNQ19GT1JXQVJESU5HX1JVTEVfQ09ORklHVVJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2lwbWNfZm9yd2FyZGluZ19mbGFnc19wYWNrKHRoaXMtPnUuaXBtY19mb3J3YXJkaW5nX3J1bGVfY29uZmlndXJhdGlvbi5maWVsZF9iaXRtYXAsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfSVRQSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuaXRwaWQuYWx0ZXJuYXRlX2l0cGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUuaXRwaWQuaW5zZXJ0X3RoaXNfdHBpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQlRQSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuYnRwaWQuYWx0ZXJuYXRlX2J0cGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUuYnRwaWQuaW5zZXJ0X3RoaXNfdHBpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUVVFVUVfQ0lSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnF1ZXVlX2Npci5jb21taXRlZF9idXJzdF9zaXplKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5xdWV1ZV9jaXIuY29tbWl0ZWRfaW5mb3JtYXRpb25fcmF0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUVVFVUVfRUlSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnF1ZXVlX2Vpci5leGNlc3NfYnVyc3Rfc2l6ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUucXVldWVfZWlyLnF1ZXVlX2VpcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUVVFVUVfQ09MT1JfTUFSS0lORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUucXVldWVfY29sb3JfbWFya2luZy5lbmFibGVfY29sb3JfbWFya2luZykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5xdWV1ZV9jb2xvcl9tYXJraW5nLmZpZWxkX2NvZGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUucXVldWVfY29sb3JfbWFya2luZy5maWVsZF9pbnN0YW5jZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5xdWV1ZV9jb2xvcl9tYXJraW5nLm1zYl9tYXNrKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnF1ZXVlX2NvbG9yX21hcmtpbmcubHNiX21hc2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUucXVldWVfY29sb3JfbWFya2luZy5ncmVlbl92YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5xdWV1ZV9jb2xvcl9tYXJraW5nLnllbGxvd192YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUVVFVUVfUkFURV9MSU1JVEVSX0NBUEFCSUxJVElFUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5xdWV1ZV9yYXRlX2xpbWl0ZXJfY2FwYWJpbGl0aWVzLm51bWJlcl9vZl9yYXRlX2xpbWl0ZXJzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5xdWV1ZV9yYXRlX2xpbWl0ZXJfY2FwYWJpbGl0aWVzLmNic19taW5faW5jcmVtZW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5xdWV1ZV9yYXRlX2xpbWl0ZXJfY2FwYWJpbGl0aWVzLmNpcl9taW5faW5jcmVtZW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5xdWV1ZV9yYXRlX2xpbWl0ZXJfY2FwYWJpbGl0aWVzLmVic19taW5faW5jcmVtZW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5xdWV1ZV9yYXRlX2xpbWl0ZXJfY2FwYWJpbGl0aWVzLmVpcl9taW5faW5jcmVtZW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnF1ZXVlX3JhdGVfbGltaXRlcl9jYXBhYmlsaXRpZXMuY29sb3JfYXdhcmUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUucXVldWVfcmF0ZV9saW1pdGVyX2NhcGFiaWxpdGllcy5jb3VwbGluZ19jb25maWd1cmFibGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUucXVldWVfcmF0ZV9saW1pdGVyX2NhcGFiaWxpdGllcy5jb3VwbGluZ19iZWhhdmlyb19kZWZhdWx0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnF1ZXVlX3JhdGVfbGltaXRlcl9jYXBhYmlsaXRpZXMuY29sb3JfbWFya2luZ19zdXBwb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnF1ZXVlX3JhdGVfbGltaXRlcl9jYXBhYmlsaXRpZXMuc21hcnRfY29sb3JfZHJvcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQ09VUExJTkdfRkxBRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmNvdXBsaW5nX2ZsYWcuY291cGxpbmdfZmxhZykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQ0xPQ0tfVFJBTlNQT1JUX0NBUEFCSUxJVElFUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUuY2xvY2tfdHJhbnNwb3J0X2NhcGFiaWxpdGllcy5wcHNfcHVsc2Vfc3VwcG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT51LmNsb2NrX3RyYW5zcG9ydF9jYXBhYmlsaXRpZXMudG9kX3N0cmluZ19zdXBwb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUuY2xvY2tfdHJhbnNwb3J0X2NhcGFiaWxpdGllcy52MmZyYW1lX3N1cHBvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0VOQUJMRV9DTE9DS19UUkFOU1BPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT51LmVuYWJsZV9jbG9ja190cmFuc3BvcnQucHBzX3B1bHNlX291dHB1dCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT51LmVuYWJsZV9jbG9ja190cmFuc3BvcnQudG9kX3N0cmluZ19vdXRwdXQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS5lbmFibGVfY2xvY2tfdHJhbnNwb3J0LnYyZnJhbWVfb3V0cHV0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9USU1FX1RSQU5TRkVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LnRpbWVfdHJhbnNmZXIubXBjcF9yZWZlcmVuY2VfcG9pbnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS50aW1lX3RyYW5zZmVyLnRvZF9zdHJpbmdfY291bnQgPiAwKSAmJiAodGhpcy0+dS50aW1lX3RyYW5zZmVyLnRvZF9zdHJpbmcgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidG9kX3N0cmluZ1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX3RpbWVfdHJhbnNmZXJcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS50aW1lX3RyYW5zZmVyLnRvZF9zdHJpbmcsIHRoaXMtPnUudGltZV90cmFuc2Zlci50b2Rfc3RyaW5nX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9QUk9QQUdBVElPTl9QQVJBTUVURVJTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LnByb3BhZ2F0aW9uX3BhcmFtZXRlcnMubmRvd24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LnByb3BhZ2F0aW9uX3BhcmFtZXRlcnMubnVwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SVFQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUucnR0LnJ0dCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfREFDX0NPTkZJR1VSQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuZGFjX2NvbmZpZ3VyYXRpb24uc3RhZykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuZGFjX2NvbmZpZ3VyYXRpb24uY3RhZykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfREFDX0NPTkZJR1VSQVRJT05fRU5BQkxFX0RJU0FCTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT51LmRhY19jb25maWd1cmF0aW9uX2VuYWJsZV9kaXNhYmxlLmxsZHBfaW5zdGFuY2Vfc3RhdHVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRV9CUk9BRENBU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucnhfZnJhbWVfYnJvYWRjYXN0LnJ4X2Jyb2FkY2FzdF9mcmFtZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FU19CUk9BRENBU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUudHhfZnJhbWVzX2Jyb2FkY2FzdC50eF9icm9hZGNhc3RfZnJhbWVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRVNfTVVMVElDQVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnR4X2ZyYW1lc19tdWx0aWNhc3QudHhfbXVsdGljYXN0X2ZyYW1lcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVTX01VTFRJQ0FTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5yeF9mcmFtZXNfbXVsdGljYXN0LnJ4X211bHRpY2FzdF9mcmFtZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX0dSRUVOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnR4X2J5dGVzX2dyZWVuLnR4X2J5dGVzX2dyZWVuKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9CWVRFU19HUkVFTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5yeF9ieXRlc19ncmVlbi5yeF9ieXRlc19ncmVlbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT05VX01DQVNUX0xMSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTE2X2xpc3RfdThfcGFjaygmdGhpcy0+dS5vbnVfbWNhc3RfbGxpZC5sbGlkX3ZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1VOSV9NQUNfTEVBUk5FRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT51LnVuaV9tYWNfbGVhcm5lZC5tYWNfYWRkcmVzcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS51bmlfbWFjX2xlYXJuZWQudW5pX3BvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1VOSV9NQUNfVEFCTEVfRlVMTF9CRUhBVklPUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUudW5pX21hY190YWJsZV9mdWxsX2JlaGF2aW9yLm92ZXJfd3JpdGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09OVV9QV1JfU0FWSU5HX0NBUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3Bvd2VyX3NhdmluZ19tb2RlX3BhY2sodGhpcy0+dS5vbnVfcHdyX3NhdmluZ19jYXAucHdyX3NhdmluZ19tb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS5vbnVfcHdyX3NhdmluZ19jYXAuZWFybHlfd2FrZV91cF9zdXBwb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9wd3Jfc2F2aW5nX2NhcC52ZW5fc3BlY19maWVsZF9zaXplKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUub251X3B3cl9zYXZpbmdfY2FwLnZlbl9zcGVjX2ZpZWxkX3NpemUgPiAwKSAmJiAodGhpcy0+dS5vbnVfcHdyX3NhdmluZ19jYXAudmVuX3NwZWNfZmllbGQgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmVuX3NwZWNfZmllbGRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9vbnVfcHdyX3NhdmluZ19jYXBcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5vbnVfcHdyX3NhdmluZ19jYXAudmVuX3NwZWNfZmllbGQsIHRoaXMtPnUub251X3B3cl9zYXZpbmdfY2FwLnZlbl9zcGVjX2ZpZWxkX3NpemUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RBQ19DT05GSUdVUkFUSU9OX0ZMQUdTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RBQ19QQVNTV09SRF9DSEFMTEVOR0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRU5FUkdZX0VGRklDSUVOVF9FVEhFUk5FVF9TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTDJDUF9GUkFNRVNfRElTQ0FSREVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0wyQ1BfRlJBTUVTX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0wyQ1BfRlJBTUVTX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0wyQ1BfT0NURVRTX0RJU0NBUkRFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MMkNQX09DVEVUU19SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MMkNQX09DVEVUU19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MSU5FX1JBVEVfTU9ERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9NRURJQV9UWVBFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX05VTUJFUl9PRl9QUk9HUkFNTUFCTEVfQ09VTlRFUlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT05VX01BWF9GUkFNRV9TSVpFX0NBUEFCSUxJVFk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUFdSX09WRVJfRVRIRVJORVRfU1RBVFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0JZVEVTX1lFTExPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRVNfVU5JQ0FTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRVNfWUVMTE9XOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0wyRVJST1JTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX1lFTExPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRVNfVU5JQ0FTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRVNfWUVMTE9XOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0wyRVJST1JTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1VOSV9NQVhfRlJBTUVfU0laRV9MSU1JVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZGVmLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5kZWYudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmtub3duXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfZGVmXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZGVmLnVua25vd24sIHRoaXMtPnUuZGVmLnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZSAqdGhpcykKK3sKKyAgICBpZiAodGhpcy0+d2lkdGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMtPndpZHRoOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB1aW50MzJfdCBjb3VudCA9IDM7CisgICAgICAgIHN3aXRjaCAodGhpcy0+bGVhZikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9TRVFVRU5DRV9OVU1CRVI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT05VX0lEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0ZJUk1XQVJFX0lORk86CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0NISVBfSU5GTzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDEwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfREFURV9PRl9NQU5VRkFDVFVSRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9NQU5VRkFDVFVSRVJfSU5GTzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IHRoaXMtPnUubWFudWZhY3R1cmVyX2luZm8uZGVmX2NvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTUFYX0xPR0lDQUxfTElOS1M6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTlVNX0VQT05fUE9SVFM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTlVNX1VOSV9QT1JUUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9QQUNLRVRfQlVGRkVSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SRVBPUlRfVEhSRVNIT0xEUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9ICgoKDIgKyAoMiAqIHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0KSkgKyAoMiAqIHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0KSkgKyAoMiAqIHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0KSkgKyAoMiAqIHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0xJTktfU1RBVEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT0FNX1JBVEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRFlOX0xFQVJOX1RBQkxFX1NJWkU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRFlOX0xFQVJOX0FHRV9MSU1JVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EWU5fTUFDX1RBQkxFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmR5bl9tYWNfdGFibGUubWFjX2FkZHJlc3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfU1RBVElDX01BQ19UQUJMRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5zdGF0aWNfbWFjX3RhYmxlLm1hY19hZGRyZXNzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BPUlRfQ0FQQUJJTElUWToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EWU5fTEVBUk5fTU9ERToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9NSU5fTUFDX0xJTUlUOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX01BWF9NQUNfQUxMT1dFRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9BR0dfTUFDX0xJTUlUOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0xFTl9FUlJfRElTQ0FSRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9GTE9PRF9VTktOT1dOOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0xPQ0FMX1NXSVRDSElORzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9RVUVVRV9DT05GSUc6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpMDsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaTE7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5xdWV1ZV9jb25maWcubnVtYmVyX29mX2xpbmtzID4gMCkgJiYgKHRoaXMtPnUucXVldWVfY29uZmlnLmxpbmtfY29uZmlndXJhdGlvbiA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm51bWJlcl9vZl9saW5rc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5xdWV1ZV9jb25maWcubnVtYmVyX29mX2xpbmtzOyBpMCsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9zZXRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUucXVldWVfY29uZmlnLmxpbmtfY29uZmlndXJhdGlvbltpMF0pOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnF1ZXVlX2NvbmZpZy5udW1iZXJfb2ZfcG9ydHMgPiAwKSAmJiAodGhpcy0+dS5xdWV1ZV9jb25maWcucG9ydF9jb25maWd1cmF0aW9uID09IE5VTEwpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibnVtYmVyX29mX3BvcnRzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LnF1ZXVlX2NvbmZpZy5udW1iZXJfb2ZfcG9ydHM7IGkxKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3NldF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5xdWV1ZV9jb25maWcucG9ydF9jb25maWd1cmF0aW9uW2kxXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0ZJUk1XQVJFX0ZJTEVOQU1FOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gKHRoaXMtPnUuZmlybXdhcmVfZmlsZW5hbWUuZmlybXdhcmVfZmlsZW5hbWVfY291bnQgKyAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BPUlRfU1RBVF9USFJFU0g6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fZHBvZV9zdGF0aXN0aWNfdGhyZXNob2xkX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnBvcnRfc3RhdF90aHJlc2guc3RhdF90aHJlc2hvbGQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTElOS19TVEFUX1RIUkVTSDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9kcG9lX3N0YXRpc3RpY190aHJlc2hvbGRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUubGlua19zdGF0X3RocmVzaC5zdGF0X3RocmVzaG9sZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9LRVlfRVhQSVJZX1RJTUU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRU5DUllQVF9NT0RFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BPUlRfSU5HUkVTU19SVUxFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5wb3J0X2luZ3Jlc3NfcnVsZS5ydWxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0xVRV9GSUVMRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9BTFRfQ1ZMQU5fRVRIRVJUWVBFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0FMVF9TVkxBTl9FVEhFUlRZUEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQkNfUkFURV9MSU1JVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9FR1JFU1NfU0hBUElORzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDMgKyAoNyAqIHRoaXMtPnUuZWdyZXNzX3NoYXBpbmcubnVtYmVyX29mX3NoYXBlcnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfSU5HUkVTU19QT0xJQ0lORzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDIgKyAoNSAqIHRoaXMtPnUuaW5ncmVzc19wb2xpY2luZy5udW1iZXJfb2ZfcmF0ZV9sZXZlbHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRkVDX01PREU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTUZSX05BTUU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSB0aGlzLT51Lm1mcl9uYW1lLm1hbl9uYW1lX2NvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRldBUkVfTUZHX1RJTUVfVkFSX0NUUkw6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyNjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1ZFTkRPUl9OQU1FOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gdGhpcy0+dS52ZW5kb3JfbmFtZS52ZW5kb3JfbmFtZV9jb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX01PREVMX05VTUJFUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IHRoaXMtPnUubW9kZWxfbnVtYmVyLm1vZGVsX251bWJlcl9jb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0hXX1ZFUlNJT046CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSB0aGlzLT51Lmh3X3ZlcnNpb24uaHdfdmVyc2lvbl9jb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09QVF9NT05fVEVNUEVSQVRVUkU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAoMiAqIHRoaXMtPnUub3B0X21vbl90ZW1wZXJhdHVyZS5jdXJyZW50X3RlbXBlcmF0dXJlX2NvdW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09QVF9NT05fVkNDOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gKDIgKiB0aGlzLT51Lm9wdF9tb25fdmNjLmN1cnJlbnRfdmNjX2NvdW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09QVF9NT05fVFhfQklBUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9ICgyICogdGhpcy0+dS5vcHRfbW9uX3R4X2JpYXMuY3VycmVudF90eF9iaWFzX2NvdW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09QVF9NT05fVFhfUE9XRVI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAoMiAqIHRoaXMtPnUub3B0X21vbl90eF9wb3dlci5jdXJyZW50X3R4X3Bvd2VyX2NvdW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09QVF9NT05fUlhfUE9XRVI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAoMiAqIHRoaXMtPnUub3B0X21vbl9yeF9wb3dlci5jdXJyZW50X3J4X3Bvd2VyX2NvdW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FX1RPT19TSE9SVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTY0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FNjUxMjc6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxMjgyNTU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUyNTY1MTE6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUU1MTIxMDIzOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMTAyNDE1MTg6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxNTE5UExVUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTY0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FNjUxMjc6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUUxMjgyNTU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUUyNTY1MTE6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUU1MTIxMDIzOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMTAyNDE1MTg6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUUxNTE5UExVUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9RVUVVRV9ERUxBWV9USFJFU0g6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUVVFVUVfREVMQVk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRlJBTUVTX0RST1BQRUQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQllURVNfRFJPUFBFRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9CWVRFU19ERUxBWUVEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX1VOVVNFRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9ET05VX1BPUlRfVFlQRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IHRoaXMtPnUuZG9udV9wb3J0X3R5cGUucG9ydF90eXBlX2NvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfU1VTUEVORF9SRVNVTUVfQUxBUk1fUkVQT1JUSU5HOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gKDIgKiB0aGlzLT51LnN1c3BlbmRfcmVzdW1lX2FsYXJtX3JlcG9ydGluZy5kZWZfY291bnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfSVBNQ19GT1JXQVJESU5HX1JVTEVfQ09ORklHVVJBVElPTjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9JVFBJRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9CVFBJRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9RVUVVRV9DSVI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUVVFVUVfRUlSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1FVRVVFX0NPTE9SX01BUktJTkc6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA3OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUVVFVUVfUkFURV9MSU1JVEVSX0NBUEFCSUxJVElFUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE1OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQ09VUExJTkdfRkxBRzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9DTE9DS19UUkFOU1BPUlRfQ0FQQUJJTElUSUVTOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0VOQUJMRV9DTE9DS19UUkFOU1BPUlQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVElNRV9UUkFOU0ZFUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDQgKyB0aGlzLT51LnRpbWVfdHJhbnNmZXIudG9kX3N0cmluZ19jb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BST1BBR0FUSU9OX1BBUkFNRVRFUlM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlRUOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RBQ19DT05GSUdVUkFUSU9OOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RBQ19DT05GSUdVUkFUSU9OX0VOQUJMRV9ESVNBQkxFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FX0JST0FEQ0FTVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRVNfQlJPQURDQVNUOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FU19NVUxUSUNBU1Q6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVTX01VTFRJQ0FTVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19HUkVFTjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9CWVRFU19HUkVFTjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PTlVfTUNBU1RfTExJRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV91MTZfbGlzdF91OF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5vbnVfbWNhc3RfbGxpZC5sbGlkX3ZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1VOSV9NQUNfTEVBUk5FRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9VTklfTUFDX1RBQkxFX0ZVTExfQkVIQVZJT1I6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT05VX1BXUl9TQVZJTkdfQ0FQOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMyArIHRoaXMtPnUub251X3B3cl9zYXZpbmdfY2FwLnZlbl9zcGVjX2ZpZWxkX3NpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EQUNfQ09ORklHVVJBVElPTl9GTEFHUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfREFDX1BBU1NXT1JEX0NIQUxMRU5HRToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRU5FUkdZX0VGRklDSUVOVF9FVEhFUk5FVF9TVEFUVVM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0wyQ1BfRlJBTUVTX0RJU0NBUkRFRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTDJDUF9GUkFNRVNfUlg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0wyQ1BfRlJBTUVTX1RYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MMkNQX09DVEVUU19ESVNDQVJERUQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0wyQ1BfT0NURVRTX1JYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MMkNQX09DVEVUU19UWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTElORV9SQVRFX01PREU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX01FRElBX1RZUEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX05VTUJFUl9PRl9QUk9HUkFNTUFCTEVfQ09VTlRFUlM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09OVV9NQVhfRlJBTUVfU0laRV9DQVBBQklMSVRZOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9QV1JfT1ZFUl9FVEhFUk5FVF9TVEFUVVM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0JZVEVTX1lFTExPVzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVTX1VOSUNBU1Q6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FU19ZRUxMT1c6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0wyRVJST1JTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19ZRUxMT1c6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FU19VTklDQVNUOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRVNfWUVMTE9XOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9MMkVSUk9SUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVU5JX01BWF9GUkFNRV9TSVpFX0xJTUlUOgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IHRoaXMtPnUuZGVmLnVua25vd25fY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNvdW50OworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hdHRyaWJ1dGVfdW5wYWNrKCZ0aGlzLT5sZWFmLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPndpZHRoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+d2lkdGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+d2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1NFUVVFTkNFX05VTUJFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnNlcXVlbmNlX251bWJlci5zZXF1bmNlX251bWJlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT05VX0lEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX21hY19hZGRyZXNzKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfaWQuaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0ZJUk1XQVJFX0lORk86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5maXJtd2FyZV9pbmZvLmJvb3RfdmVyc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5maXJtd2FyZV9pbmZvLmJvb3RfY3JjMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZmlybXdhcmVfaW5mby5hcHBsaWNhdGlvbl92ZXJzaW9uKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmZpcm13YXJlX2luZm8uYXBwbGljYXRpb25fY3JjMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0NISVBfSU5GTzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmNoaXBfaW5mby5qZWRlY19pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5jaGlwX2luZm8uY2hpcF9tb2RlbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5jaGlwX2luZm8uY2hpcF92ZXJzaW9uKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EQVRFX09GX01BTlVGQUNUVVJFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZGF0ZV9vZl9tYW51ZmFjdHVyZS55ZWFyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZGF0ZV9vZl9tYW51ZmFjdHVyZS5tb250aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmRhdGVfb2ZfbWFudWZhY3R1cmUuZGF5KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9NQU5VRkFDVFVSRVJfSU5GTzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLT51Lm1hbnVmYWN0dXJlcl9pbmZvLmRlZl9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX21hbnVmYWN0dXJlcl9pbmZvX2NvdW50X2RlZigmcG9zdExlbkJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm1hbnVmYWN0dXJlcl9pbmZvLmRlZl9jb3VudCA+IDApICYmICh0aGlzLT51Lm1hbnVmYWN0dXJlcl9pbmZvLmRlZiA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImRlZlwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX21hbnVmYWN0dXJlcl9pbmZvXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUubWFudWZhY3R1cmVyX2luZm8uZGVmID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUubWFudWZhY3R1cmVyX2luZm8uZGVmX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51Lm1hbnVmYWN0dXJlcl9pbmZvLmRlZiwgdGhpcy0+dS5tYW51ZmFjdHVyZXJfaW5mby5kZWZfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX01BWF9MT0dJQ0FMX0xJTktTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUubWF4X2xvZ2ljYWxfbGlua3MuYmlkaXJlY3Rpb25hbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5tYXhfbG9naWNhbF9saW5rcy5kb3duc3RyZWFtX29ubHkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX05VTV9FUE9OX1BPUlRTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUubnVtX2Vwb25fcG9ydHMucG9ydF9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTlVNX1VOSV9QT1JUUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm51bV91bmlfcG9ydHMucG9ydF9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUEFDS0VUX0JVRkZFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucGFja2V0X2J1ZmZlci51cHN0cmVhbV9xdWV1ZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wYWNrZXRfYnVmZmVyLnVwX3F1ZXVlc19tYXhfcGVyX2xpbmspKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wYWNrZXRfYnVmZmVyLnVwX3F1ZXVlX2luY3JlbWVudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBhY2tldF9idWZmZXIuZG93bnN0cmVhbV9xdWV1ZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wYWNrZXRfYnVmZmVyLmRuX3F1ZXVlc19tYXhfcGVyX3BvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wYWNrZXRfYnVmZmVyLmRuX3F1ZXVlX2luY3JlbWVudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wYWNrZXRfYnVmZmVyLnRvdGFsX3BhY2tldF9idWZmZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucGFja2V0X2J1ZmZlci51cHN0cmVhbV9wYWNrZXRfYnVmZmVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBhY2tldF9idWZmZXIuZG93bnNyZWFtX3BhY2tldF9idWZmZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JFUE9SVF9USFJFU0hPTERTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLm51bWJlcl9vZl9xdWV1ZV9zZXRzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0ID4gMCkgJiYgKHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucXVldWVfc2V0MCA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInF1ZXVlX3NldDBcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9yZXBvcnRfdGhyZXNob2xkc1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnF1ZXVlX3NldDAgPSAodWludDE2X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0ICogc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnJlcG9ydF92YWx1ZXNfcGVyX3F1ZXVlX3NldDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucXVldWVfc2V0MFtpMF0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKCh1aW50NjRfdCkgdGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy5udW1iZXJfb2ZfcXVldWVfc2V0cyA+IDB4MDAwMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0ID4gMCkgJiYgKHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucXVldWVfc2V0MSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJxdWV1ZV9zZXQxXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfcmVwb3J0X3RocmVzaG9sZHNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnF1ZXVlX3NldDEgPSAodWludDE2X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnJlcG9ydF92YWx1ZXNfcGVyX3F1ZXVlX3NldCAqIHNpemVvZih1aW50MTZfdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCBpMTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy5yZXBvcnRfdmFsdWVzX3Blcl9xdWV1ZV9zZXQ7IGkxKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucXVldWVfc2V0MVtpMV0pKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgoKHVpbnQ2NF90KSB0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLm51bWJlcl9vZl9xdWV1ZV9zZXRzID4gMHgwMDAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy5yZXBvcnRfdmFsdWVzX3Blcl9xdWV1ZV9zZXQgPiAwKSAmJiAodGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy5xdWV1ZV9zZXQyID09IE5VTEwpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInF1ZXVlX3NldDJcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9yZXBvcnRfdGhyZXNob2xkc1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucXVldWVfc2V0MiA9ICh1aW50MTZfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0ICogc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB1aW50OF90IGkyOworICAgICAgICAgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCB0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnJlcG9ydF92YWx1ZXNfcGVyX3F1ZXVlX3NldDsgaTIrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy5xdWV1ZV9zZXQyW2kyXSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCgodWludDY0X3QpIHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMubnVtYmVyX29mX3F1ZXVlX3NldHMgPiAweDAwMDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnJlcG9ydF92YWx1ZXNfcGVyX3F1ZXVlX3NldCA+IDApICYmICh0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnF1ZXVlX3NldDMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicXVldWVfc2V0M1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX3JlcG9ydF90aHJlc2hvbGRzXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy5xdWV1ZV9zZXQzID0gKHVpbnQxNl90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy5yZXBvcnRfdmFsdWVzX3Blcl9xdWV1ZV9zZXQgKiBzaXplb2YodWludDE2X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTM7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMucmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0OyBpMysrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnF1ZXVlX3NldDNbaTNdKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MSU5LX1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGlua19zdGF0ZV91bnBhY2soJnRoaXMtPnUubGlua19zdGF0ZS5saW5rX3N0YXRlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT0FNX1JBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9hbV9yYXRlLm1heGltdW1fb2FtX3JhdGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vYW1fcmF0ZS5taW5pbXVtX29hbV9yYXRlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EWU5fTEVBUk5fVEFCTEVfU0laRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmR5bl9sZWFybl90YWJsZV9zaXplLm1heF9tYWNfYWxsb3dlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRFlOX0xFQVJOX0FHRV9MSU1JVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmR5bl9sZWFybl9hZ2VfbGltaXQuZHluYW1pY19hZGRyZXNzX2FnZV9saW1pdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRFlOX01BQ19UQUJMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZV91bnBhY2soJnRoaXMtPnUuZHluX21hY190YWJsZS5tYWNfYWRkcmVzcywgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfU1RBVElDX01BQ19UQUJMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZV91bnBhY2soJnRoaXMtPnUuc3RhdGljX21hY190YWJsZS5tYWNfYWRkcmVzcywgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUE9SVF9DQVBBQklMSVRZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2F1dG9fbmVnb3RpYXRpb25fY2FwYWJpbGl0eV91bnBhY2soJnRoaXMtPnUucG9ydF9jYXBhYmlsaXR5Lm1heGltdW1fY2FwYWJpbGl0aWVzLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYXV0b19uZWdvdGlhdGlvbl9jYXBhYmlsaXR5X3VucGFjaygmdGhpcy0+dS5wb3J0X2NhcGFiaWxpdHkuY3VycmVudF9jYXBhYmlsaXRpZXMsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EWU5fTEVBUk5fTU9ERToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYXJuaW5nX21vZGVfdW5wYWNrKCZ0aGlzLT51LmR5bl9sZWFybl9tb2RlLmxlYXJuaW5nX21vZGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9NSU5fTUFDX0xJTUlUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUubWluX21hY19saW1pdC5taW5pbXVtX2d1YXJhbnRlZWRfbGltaXQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX01BWF9NQUNfQUxMT1dFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm1heF9tYWNfYWxsb3dlZC5tYXhfYWxsb3dlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQUdHX01BQ19MSU1JVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmFnZ19tYWNfbGltaXQuYWdncmVnYXRlX21hY19saW1pdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTEVOX0VSUl9ESVNDQVJEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51Lmxlbl9lcnJfZGlzY2FyZC5sZW5fZXJyb3JfZGlzY2FyZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRkxPT0RfVU5LTk9XTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5mbG9vZF91bmtub3duLmZsb29kX3Vua25vd24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0xPQ0FMX1NXSVRDSElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5sb2NhbF9zd2l0Y2hpbmcubG9jYWxfc3dpdGNoaW5nKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9RVUVVRV9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpNDsKKyAgICAgICAgICAgICAgICB1aW50OF90IGk1OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5xdWV1ZV9jb25maWcubnVtYmVyX29mX2xpbmtzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUucXVldWVfY29uZmlnLm51bWJlcl9vZl9saW5rcyA+IDApICYmICh0aGlzLT51LnF1ZXVlX2NvbmZpZy5saW5rX2NvbmZpZ3VyYXRpb24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJsaW5rX2NvbmZpZ3VyYXRpb25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9xdWV1ZV9jb25maWdcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5xdWV1ZV9jb25maWcubGlua19jb25maWd1cmF0aW9uID0gKGJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3NldCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5xdWV1ZV9jb25maWcubnVtYmVyX29mX2xpbmtzICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3NldCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNCA9IDA7IGk0IDwgdGhpcy0+dS5xdWV1ZV9jb25maWcubnVtYmVyX29mX2xpbmtzOyBpNCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9zZXRfdW5wYWNrKCZ0aGlzLT51LnF1ZXVlX2NvbmZpZy5saW5rX2NvbmZpZ3VyYXRpb25baTRdLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnF1ZXVlX2NvbmZpZy5udW1iZXJfb2ZfcG9ydHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5xdWV1ZV9jb25maWcubnVtYmVyX29mX3BvcnRzID4gMCkgJiYgKHRoaXMtPnUucXVldWVfY29uZmlnLnBvcnRfY29uZmlndXJhdGlvbiA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInBvcnRfY29uZmlndXJhdGlvblwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX3F1ZXVlX2NvbmZpZ1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnF1ZXVlX2NvbmZpZy5wb3J0X2NvbmZpZ3VyYXRpb24gPSAoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfc2V0ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnF1ZXVlX2NvbmZpZy5udW1iZXJfb2ZfcG9ydHMgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfc2V0KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk1ID0gMDsgaTUgPCB0aGlzLT51LnF1ZXVlX2NvbmZpZy5udW1iZXJfb2ZfcG9ydHM7IGk1KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3NldF91bnBhY2soJnRoaXMtPnUucXVldWVfY29uZmlnLnBvcnRfY29uZmlndXJhdGlvbltpNV0sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9GSVJNV0FSRV9GSUxFTkFNRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLT51LmZpcm13YXJlX2ZpbGVuYW1lLmZpcm13YXJlX2ZpbGVuYW1lX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfZmlybXdhcmVfZmlsZW5hbWVfY291bnRfZmlybXdhcmVfZmlsZW5hbWUoJnBvc3RMZW5CdWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5maXJtd2FyZV9maWxlbmFtZS5maXJtd2FyZV9maWxlbmFtZV9jb3VudCA+IDApICYmICh0aGlzLT51LmZpcm13YXJlX2ZpbGVuYW1lLmZpcm13YXJlX2ZpbGVuYW1lID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZmlybXdhcmVfZmlsZW5hbWVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9maXJtd2FyZV9maWxlbmFtZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmZpcm13YXJlX2ZpbGVuYW1lLmZpcm13YXJlX2ZpbGVuYW1lID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZmlybXdhcmVfZmlsZW5hbWUuZmlybXdhcmVfZmlsZW5hbWVfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUuZmlybXdhcmVfZmlsZW5hbWUuZmlybXdhcmVfZmlsZW5hbWUsIHRoaXMtPnUuZmlybXdhcmVfZmlsZW5hbWUuZmlybXdhcmVfZmlsZW5hbWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BPUlRfU1RBVF9USFJFU0g6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9zdGF0aXN0aWNfdGhyZXNob2xkX3VucGFjaygmdGhpcy0+dS5wb3J0X3N0YXRfdGhyZXNoLnN0YXRfdGhyZXNob2xkLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MSU5LX1NUQVRfVEhSRVNIOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc3RhdGlzdGljX3RocmVzaG9sZF91bnBhY2soJnRoaXMtPnUubGlua19zdGF0X3RocmVzaC5zdGF0X3RocmVzaG9sZCwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfS0VZX0VYUElSWV9USU1FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUua2V5X2V4cGlyeV90aW1lLnRpbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0VOQ1JZUFRfTU9ERToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2VuY3J5cHRpb25fbW9kZV91bnBhY2soJnRoaXMtPnUuZW5jcnlwdF9tb2RlLmVuY3J5cHRpb25fbWV0aG9kLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUE9SVF9JTkdSRVNTX1JVTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3VucGFjaygmdGhpcy0+dS5wb3J0X2luZ3Jlc3NfcnVsZS5ydWxlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MVUVfRklFTEQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9maWVsZF9jb2RlX3VucGFjaygmdGhpcy0+dS5sdWVfZmllbGQuZmllbGRfY29kZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGF5ZXJfc2VsZWN0X3VucGFjaygmdGhpcy0+dS5sdWVfZmllbGQubGF5ZXJfc2VsZWN0LCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lmx1ZV9maWVsZC5iaXRfd29yZF9vZmZzZXQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5sdWVfZmllbGQuYml0X29mZnNldCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lmx1ZV9maWVsZC5iaXRfd2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5sdWVfZmllbGQucmVmZXJlbmNlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9BTFRfQ1ZMQU5fRVRIRVJUWVBFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuYWx0X2N2bGFuX2V0aGVydHlwZS50cGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5hbHRfY3ZsYW5fZXRoZXJ0eXBlLmluc2VydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQUxUX1NWTEFOX0VUSEVSVFlQRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmFsdF9zdmxhbl9ldGhlcnR5cGUudHBpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuYWx0X3N2bGFuX2V0aGVydHlwZS5pbnNlcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0JDX1JBVEVfTElNSVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5iY19yYXRlX2xpbWl0LmxpbWl0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9FR1JFU1NfU0hBUElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGk2OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3RyYWZmaWNfYml0bWFwX3VucGFjaygmdGhpcy0+dS5lZ3Jlc3Nfc2hhcGluZy50cmFmZmljX3R5cGVzLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcmF0ZV91bml0c191bnBhY2soJnRoaXMtPnUuZWdyZXNzX3NoYXBpbmcucmF0ZV91bml0cywgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5lZ3Jlc3Nfc2hhcGluZy5udW1iZXJfb2Zfc2hhcGVycykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmVncmVzc19zaGFwaW5nLm51bWJlcl9vZl9zaGFwZXJzID4gMCkgJiYgKHRoaXMtPnUuZWdyZXNzX3NoYXBpbmcuc2hhcGVycyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInNoYXBlcnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9lZ3Jlc3Nfc2hhcGluZ1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmVncmVzc19zaGFwaW5nLnNoYXBlcnMgPSAoYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc2hhcGVyICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmVncmVzc19zaGFwaW5nLm51bWJlcl9vZl9zaGFwZXJzICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9kcG9lX3NoYXBlcikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNiA9IDA7IGk2IDwgdGhpcy0+dS5lZ3Jlc3Nfc2hhcGluZy5udW1iZXJfb2Zfc2hhcGVyczsgaTYrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc2hhcGVyX3VucGFjaygmdGhpcy0+dS5lZ3Jlc3Nfc2hhcGluZy5zaGFwZXJzW2k2XSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0lOR1JFU1NfUE9MSUNJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpNzsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9yYXRlX3VuaXRzX3VucGFjaygmdGhpcy0+dS5pbmdyZXNzX3BvbGljaW5nLnJhdGVfdW5pdHMsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuaW5ncmVzc19wb2xpY2luZy5udW1iZXJfb2ZfcmF0ZV9sZXZlbHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5pbmdyZXNzX3BvbGljaW5nLm51bWJlcl9vZl9yYXRlX2xldmVscyA+IDApICYmICh0aGlzLT51LmluZ3Jlc3NfcG9saWNpbmcucmF0ZV9sZXZlbHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJyYXRlX2xldmVsc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2luZ3Jlc3NfcG9saWNpbmdcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5pbmdyZXNzX3BvbGljaW5nLnJhdGVfbGV2ZWxzID0gKGJjbW9sdF9lcG9uX29hbV9kcG9lX3JhdGVfbGV2ZWwgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuaW5ncmVzc19wb2xpY2luZy5udW1iZXJfb2ZfcmF0ZV9sZXZlbHMgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmF0ZV9sZXZlbCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNyA9IDA7IGk3IDwgdGhpcy0+dS5pbmdyZXNzX3BvbGljaW5nLm51bWJlcl9vZl9yYXRlX2xldmVsczsgaTcrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmF0ZV9sZXZlbF91bnBhY2soJnRoaXMtPnUuaW5ncmVzc19wb2xpY2luZy5yYXRlX2xldmVsc1tpN10sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9GRUNfTU9ERToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2ZlY19tb2RlX3VucGFjaygmdGhpcy0+dS5mZWNfbW9kZS5yeF9kb3duLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9mZWNfbW9kZV91bnBhY2soJnRoaXMtPnUuZmVjX21vZGUudHhfdXAsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9NRlJfTkFNRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLT51Lm1mcl9uYW1lLm1hbl9uYW1lX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfbWZyX25hbWVfY291bnRfbWFuX25hbWUoJnBvc3RMZW5CdWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5tZnJfbmFtZS5tYW5fbmFtZV9jb3VudCA+IDApICYmICh0aGlzLT51Lm1mcl9uYW1lLm1hbl9uYW1lID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibWFuX25hbWVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9tZnJfbmFtZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51Lm1mcl9uYW1lLm1hbl9uYW1lID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUubWZyX25hbWUubWFuX25hbWVfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUubWZyX25hbWUubWFuX25hbWUsIHRoaXMtPnUubWZyX25hbWUubWFuX25hbWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0ZXQVJFX01GR19USU1FX1ZBUl9DVFJMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LmZ3YXJlX21mZ190aW1lX3Zhcl9jdHJsLmNvZGVfYWNjZXNzX3N0YXJ0LCAxMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUuZndhcmVfbWZnX3RpbWVfdmFyX2N0cmwuY3ZjX2FjY2Vzc19zdGFydCwgMTMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1ZFTkRPUl9OQU1FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMtPnUudmVuZG9yX25hbWUudmVuZG9yX25hbWVfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV92ZW5kb3JfbmFtZV9jb3VudF92ZW5kb3JfbmFtZSgmcG9zdExlbkJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnZlbmRvcl9uYW1lLnZlbmRvcl9uYW1lX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUudmVuZG9yX25hbWUudmVuZG9yX25hbWUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2ZW5kb3JfbmFtZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX3ZlbmRvcl9uYW1lXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUudmVuZG9yX25hbWUudmVuZG9yX25hbWUgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS52ZW5kb3JfbmFtZS52ZW5kb3JfbmFtZV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS52ZW5kb3JfbmFtZS52ZW5kb3JfbmFtZV9jb3VudCA+IDMxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LnZlbmRvcl9uYW1lLnZlbmRvcl9uYW1lLCB0aGlzLT51LnZlbmRvcl9uYW1lLnZlbmRvcl9uYW1lX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9NT0RFTF9OVU1CRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5tb2RlbF9udW1iZXIubW9kZWxfbnVtYmVyX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfbW9kZWxfbnVtYmVyX2NvdW50X21vZGVsX251bWJlcigmcG9zdExlbkJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm1vZGVsX251bWJlci5tb2RlbF9udW1iZXJfY291bnQgPiAwKSAmJiAodGhpcy0+dS5tb2RlbF9udW1iZXIubW9kZWxfbnVtYmVyID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibW9kZWxfbnVtYmVyXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfbW9kZWxfbnVtYmVyXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUubW9kZWxfbnVtYmVyLm1vZGVsX251bWJlciA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51Lm1vZGVsX251bWJlci5tb2RlbF9udW1iZXJfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUubW9kZWxfbnVtYmVyLm1vZGVsX251bWJlcl9jb3VudCA+IDMxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51Lm1vZGVsX251bWJlci5tb2RlbF9udW1iZXIsIHRoaXMtPnUubW9kZWxfbnVtYmVyLm1vZGVsX251bWJlcl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfSFdfVkVSU0lPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLT51Lmh3X3ZlcnNpb24uaHdfdmVyc2lvbl9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2h3X3ZlcnNpb25fY291bnRfaHdfdmVyc2lvbigmcG9zdExlbkJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lmh3X3ZlcnNpb24uaHdfdmVyc2lvbl9jb3VudCA+IDApICYmICh0aGlzLT51Lmh3X3ZlcnNpb24uaHdfdmVyc2lvbiA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImh3X3ZlcnNpb25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9od192ZXJzaW9uXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuaHdfdmVyc2lvbi5od192ZXJzaW9uID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuaHdfdmVyc2lvbi5od192ZXJzaW9uX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lmh3X3ZlcnNpb24uaHdfdmVyc2lvbl9jb3VudCA+IDMxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51Lmh3X3ZlcnNpb24uaHdfdmVyc2lvbiwgdGhpcy0+dS5od192ZXJzaW9uLmh3X3ZlcnNpb25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09QVF9NT05fVEVNUEVSQVRVUkU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTg7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5vcHRfbW9uX3RlbXBlcmF0dXJlLmN1cnJlbnRfdGVtcGVyYXR1cmVfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9vcHRfbW9uX3RlbXBlcmF0dXJlX2NvdW50X2N1cnJlbnRfdGVtcGVyYXR1cmUoJnBvc3RMZW5CdWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5vcHRfbW9uX3RlbXBlcmF0dXJlLmN1cnJlbnRfdGVtcGVyYXR1cmVfY291bnQgPiAwKSAmJiAodGhpcy0+dS5vcHRfbW9uX3RlbXBlcmF0dXJlLmN1cnJlbnRfdGVtcGVyYXR1cmUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjdXJyZW50X3RlbXBlcmF0dXJlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfb3B0X21vbl90ZW1wZXJhdHVyZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51Lm9wdF9tb25fdGVtcGVyYXR1cmUuY3VycmVudF90ZW1wZXJhdHVyZSA9ICh1aW50MTZfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5vcHRfbW9uX3RlbXBlcmF0dXJlLmN1cnJlbnRfdGVtcGVyYXR1cmVfY291bnQgKiBzaXplb2YodWludDE2X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9wdF9tb25fdGVtcGVyYXR1cmUuY3VycmVudF90ZW1wZXJhdHVyZV9jb3VudCA+IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpOCA9IDA7IGk4IDwgdGhpcy0+dS5vcHRfbW9uX3RlbXBlcmF0dXJlLmN1cnJlbnRfdGVtcGVyYXR1cmVfY291bnQ7IGk4KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9wdF9tb25fdGVtcGVyYXR1cmUuY3VycmVudF90ZW1wZXJhdHVyZVtpOF0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PUFRfTU9OX1ZDQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpOTsKKyAgICAgICAgICAgICAgICB0aGlzLT51Lm9wdF9tb25fdmNjLmN1cnJlbnRfdmNjX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfb3B0X21vbl92Y2NfY291bnRfY3VycmVudF92Y2MoJnBvc3RMZW5CdWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5vcHRfbW9uX3ZjYy5jdXJyZW50X3ZjY19jb3VudCA+IDApICYmICh0aGlzLT51Lm9wdF9tb25fdmNjLmN1cnJlbnRfdmNjID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY3VycmVudF92Y2NcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9vcHRfbW9uX3ZjY1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51Lm9wdF9tb25fdmNjLmN1cnJlbnRfdmNjID0gKHVpbnQxNl90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51Lm9wdF9tb25fdmNjLmN1cnJlbnRfdmNjX2NvdW50ICogc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vcHRfbW9uX3ZjYy5jdXJyZW50X3ZjY19jb3VudCA+IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpOSA9IDA7IGk5IDwgdGhpcy0+dS5vcHRfbW9uX3ZjYy5jdXJyZW50X3ZjY19jb3VudDsgaTkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub3B0X21vbl92Y2MuY3VycmVudF92Y2NbaTldKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT1BUX01PTl9UWF9CSUFTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxMDsKKyAgICAgICAgICAgICAgICB0aGlzLT51Lm9wdF9tb25fdHhfYmlhcy5jdXJyZW50X3R4X2JpYXNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9vcHRfbW9uX3R4X2JpYXNfY291bnRfY3VycmVudF90eF9iaWFzKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUub3B0X21vbl90eF9iaWFzLmN1cnJlbnRfdHhfYmlhc19jb3VudCA+IDApICYmICh0aGlzLT51Lm9wdF9tb25fdHhfYmlhcy5jdXJyZW50X3R4X2JpYXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjdXJyZW50X3R4X2JpYXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9vcHRfbW9uX3R4X2JpYXNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5vcHRfbW9uX3R4X2JpYXMuY3VycmVudF90eF9iaWFzID0gKHVpbnQxNl90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51Lm9wdF9tb25fdHhfYmlhcy5jdXJyZW50X3R4X2JpYXNfY291bnQgKiBzaXplb2YodWludDE2X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9wdF9tb25fdHhfYmlhcy5jdXJyZW50X3R4X2JpYXNfY291bnQgPiA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEwID0gMDsgaTEwIDwgdGhpcy0+dS5vcHRfbW9uX3R4X2JpYXMuY3VycmVudF90eF9iaWFzX2NvdW50OyBpMTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub3B0X21vbl90eF9iaWFzLmN1cnJlbnRfdHhfYmlhc1tpMTBdKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT1BUX01PTl9UWF9QT1dFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMTE7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5vcHRfbW9uX3R4X3Bvd2VyLmN1cnJlbnRfdHhfcG93ZXJfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9vcHRfbW9uX3R4X3Bvd2VyX2NvdW50X2N1cnJlbnRfdHhfcG93ZXIoJnBvc3RMZW5CdWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5vcHRfbW9uX3R4X3Bvd2VyLmN1cnJlbnRfdHhfcG93ZXJfY291bnQgPiAwKSAmJiAodGhpcy0+dS5vcHRfbW9uX3R4X3Bvd2VyLmN1cnJlbnRfdHhfcG93ZXIgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjdXJyZW50X3R4X3Bvd2VyXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfb3B0X21vbl90eF9wb3dlclwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51Lm9wdF9tb25fdHhfcG93ZXIuY3VycmVudF90eF9wb3dlciA9ICh1aW50MTZfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5vcHRfbW9uX3R4X3Bvd2VyLmN1cnJlbnRfdHhfcG93ZXJfY291bnQgKiBzaXplb2YodWludDE2X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9wdF9tb25fdHhfcG93ZXIuY3VycmVudF90eF9wb3dlcl9jb3VudCA+IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMTEgPSAwOyBpMTEgPCB0aGlzLT51Lm9wdF9tb25fdHhfcG93ZXIuY3VycmVudF90eF9wb3dlcl9jb3VudDsgaTExKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9wdF9tb25fdHhfcG93ZXIuY3VycmVudF90eF9wb3dlcltpMTFdKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT1BUX01PTl9SWF9QT1dFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMTI7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5vcHRfbW9uX3J4X3Bvd2VyLmN1cnJlbnRfcnhfcG93ZXJfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9vcHRfbW9uX3J4X3Bvd2VyX2NvdW50X2N1cnJlbnRfcnhfcG93ZXIoJnBvc3RMZW5CdWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5vcHRfbW9uX3J4X3Bvd2VyLmN1cnJlbnRfcnhfcG93ZXJfY291bnQgPiAwKSAmJiAodGhpcy0+dS5vcHRfbW9uX3J4X3Bvd2VyLmN1cnJlbnRfcnhfcG93ZXIgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjdXJyZW50X3J4X3Bvd2VyXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfb3B0X21vbl9yeF9wb3dlclwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51Lm9wdF9tb25fcnhfcG93ZXIuY3VycmVudF9yeF9wb3dlciA9ICh1aW50MTZfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5vcHRfbW9uX3J4X3Bvd2VyLmN1cnJlbnRfcnhfcG93ZXJfY291bnQgKiBzaXplb2YodWludDE2X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51Lm9wdF9tb25fcnhfcG93ZXIuY3VycmVudF9yeF9wb3dlcl9jb3VudCA+IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMTIgPSAwOyBpMTIgPCB0aGlzLT51Lm9wdF9tb25fcnhfcG93ZXIuY3VycmVudF9yeF9wb3dlcl9jb3VudDsgaTEyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9wdF9tb25fcnhfcG93ZXIuY3VycmVudF9yeF9wb3dlcltpMTJdKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5yeF91bmljYXN0X2ZyYW1lcy5yeF91bmljYXN0X2ZyYW1lcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS50eF91bmljYXN0X2ZyYW1lcy50eF91bmljYXN0X2ZyYW1lcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVfVE9PX1NIT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucnhfZnJhbWVfdG9vX3Nob3J0LnJ4X2ZyYW1lc190b29fc2hvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FNjQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5yeF9mcmFtZTY0LnJ4X2ZyYW1lczY0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTY1MTI3OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucnhfZnJhbWU2NTEyNy5yeF9mcmFtZXM2NTEyNykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxMjgyNTU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5yeF9mcmFtZTEyODI1NS5yeF9mcmFtZXMxMjgyNTUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMjU2NTExOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucnhfZnJhbWUyNTY1MTEucnhfZnJhbWVzMjU2NTExKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTUxMjEwMjM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5yeF9mcmFtZTUxMjEwMjMucnhfZnJhbWVzNTEyMTAyMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxMDI0MTUxODoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnJ4X2ZyYW1lMTAyNDE1MTgucnhfZnJhbWVzMTAyNDE1MTgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMTUxOVBMVVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5yeF9mcmFtZTE1MTlwbHVzLnJ4X2ZyYW1lczE1MTlwbHVzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTY0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudHhfZnJhbWU2NC50eF9mcmFtZXM2NCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUU2NTEyNzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnR4X2ZyYW1lNjUxMjcudHhfZnJhbWVzNjUxMjcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMTI4MjU1OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudHhfZnJhbWUxMjgyNTUudHhfZnJhbWVzMTI4MjU1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTI1NjUxMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnR4X2ZyYW1lMjU2NTExLnR4X2ZyYW1lczI1NjUxMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUU1MTIxMDIzOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudHhfZnJhbWU1MTIxMDIzLnR4X2ZyYW1lczUxMjEwMjMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMTAyNDE1MTg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS50eF9mcmFtZTEwMjQxNTE4LnR4X2ZyYW1lczEwMjQxNTE4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTE1MTlQTFVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudHhfZnJhbWUxNTE5cGx1cy50eF9mcmFtZXMxNTE5cGx1cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUVVFVUVfREVMQVlfVEhSRVNIOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5xdWV1ZV9kZWxheV90aHJlc2gucXVldWVfZGVsYXlfdGhyZXNob2xkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9RVUVVRV9ERUxBWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnF1ZXVlX2RlbGF5LnF1ZXVlX2RlbGF5KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9GUkFNRVNfRFJPUFBFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmZyYW1lc19kcm9wcGVkLmZyYW1lc19kcm9wcGVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9CWVRFU19EUk9QUEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuYnl0ZXNfZHJvcHBlZC5ieXRlc19kcm9wcGVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9CWVRFU19ERUxBWUVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuYnl0ZXNfZGVsYXllZC5ieXRlc19kZWxheWVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19VTlVTRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS50eF9ieXRlc191bnVzZWQudHhfYnl0ZXNfdW51c2VkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9ET05VX1BPUlRfVFlQRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMTM7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5kb251X3BvcnRfdHlwZS5wb3J0X3R5cGVfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9kb251X3BvcnRfdHlwZV9jb3VudF9wb3J0X3R5cGUoJnBvc3RMZW5CdWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5kb251X3BvcnRfdHlwZS5wb3J0X3R5cGVfY291bnQgPiAwKSAmJiAodGhpcy0+dS5kb251X3BvcnRfdHlwZS5wb3J0X3R5cGUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwb3J0X3R5cGVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9kb251X3BvcnRfdHlwZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmRvbnVfcG9ydF90eXBlLnBvcnRfdHlwZSA9IChiY21vbHRfZXBvbl9vYW1fZHBvZV9wb3J0X3R5cGUgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZG9udV9wb3J0X3R5cGUucG9ydF90eXBlX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9kcG9lX3BvcnRfdHlwZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMTMgPSAwOyBpMTMgPCB0aGlzLT51LmRvbnVfcG9ydF90eXBlLnBvcnRfdHlwZV9jb3VudDsgaTEzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3BvcnRfdHlwZV91bnBhY2soJnRoaXMtPnUuZG9udV9wb3J0X3R5cGUucG9ydF90eXBlW2kxM10sICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfU1VTUEVORF9SRVNVTUVfQUxBUk1fUkVQT1JUSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxNDsKKyAgICAgICAgICAgICAgICB0aGlzLT51LnN1c3BlbmRfcmVzdW1lX2FsYXJtX3JlcG9ydGluZy5kZWZfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9zdXNwZW5kX3Jlc3VtZV9hbGFybV9yZXBvcnRpbmdfY291bnRfZGVmKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc3VzcGVuZF9yZXN1bWVfYWxhcm1fcmVwb3J0aW5nLmRlZl9jb3VudCA+IDApICYmICh0aGlzLT51LnN1c3BlbmRfcmVzdW1lX2FsYXJtX3JlcG9ydGluZy5kZWYgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJkZWZcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9zdXNwZW5kX3Jlc3VtZV9hbGFybV9yZXBvcnRpbmdcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5zdXNwZW5kX3Jlc3VtZV9hbGFybV9yZXBvcnRpbmcuZGVmID0gKGJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X29wdGlvbnMgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuc3VzcGVuZF9yZXN1bWVfYWxhcm1fcmVwb3J0aW5nLmRlZl9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fZHBvZV9ldmVudF9vcHRpb25zKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxNCA9IDA7IGkxNCA8IHRoaXMtPnUuc3VzcGVuZF9yZXN1bWVfYWxhcm1fcmVwb3J0aW5nLmRlZl9jb3VudDsgaTE0KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X29wdGlvbnNfdW5wYWNrKCZ0aGlzLT51LnN1c3BlbmRfcmVzdW1lX2FsYXJtX3JlcG9ydGluZy5kZWZbaTE0XSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0lQTUNfRk9SV0FSRElOR19SVUxFX0NPTkZJR1VSQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9pcG1jX2ZvcndhcmRpbmdfZmxhZ3NfdW5wYWNrKCZ0aGlzLT51LmlwbWNfZm9yd2FyZGluZ19ydWxlX2NvbmZpZ3VyYXRpb24uZmllbGRfYml0bWFwLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfSVRQSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5pdHBpZC5hbHRlcm5hdGVfaXRwaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51Lml0cGlkLmluc2VydF90aGlzX3RwaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0JUUElEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuYnRwaWQuYWx0ZXJuYXRlX2J0cGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5idHBpZC5pbnNlcnRfdGhpc190cGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9RVUVVRV9DSVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5xdWV1ZV9jaXIuY29tbWl0ZWRfYnVyc3Rfc2l6ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5xdWV1ZV9jaXIuY29tbWl0ZWRfaW5mb3JtYXRpb25fcmF0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUVVFVUVfRUlSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucXVldWVfZWlyLmV4Y2Vzc19idXJzdF9zaXplKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnF1ZXVlX2Vpci5xdWV1ZV9laXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1FVRVVFX0NPTE9SX01BUktJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucXVldWVfY29sb3JfbWFya2luZy5lbmFibGVfY29sb3JfbWFya2luZykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnF1ZXVlX2NvbG9yX21hcmtpbmcuZmllbGRfY29kZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnF1ZXVlX2NvbG9yX21hcmtpbmcuZmllbGRfaW5zdGFuY2UpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5xdWV1ZV9jb2xvcl9tYXJraW5nLm1zYl9tYXNrKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucXVldWVfY29sb3JfbWFya2luZy5sc2JfbWFzaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnF1ZXVlX2NvbG9yX21hcmtpbmcuZ3JlZW5fdmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5xdWV1ZV9jb2xvcl9tYXJraW5nLnllbGxvd192YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUVVFVUVfUkFURV9MSU1JVEVSX0NBUEFCSUxJVElFUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnF1ZXVlX3JhdGVfbGltaXRlcl9jYXBhYmlsaXRpZXMubnVtYmVyX29mX3JhdGVfbGltaXRlcnMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucXVldWVfcmF0ZV9saW1pdGVyX2NhcGFiaWxpdGllcy5jYnNfbWluX2luY3JlbWVudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5xdWV1ZV9yYXRlX2xpbWl0ZXJfY2FwYWJpbGl0aWVzLmNpcl9taW5faW5jcmVtZW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnF1ZXVlX3JhdGVfbGltaXRlcl9jYXBhYmlsaXRpZXMuZWJzX21pbl9pbmNyZW1lbnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucXVldWVfcmF0ZV9saW1pdGVyX2NhcGFiaWxpdGllcy5laXJfbWluX2luY3JlbWVudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnF1ZXVlX3JhdGVfbGltaXRlcl9jYXBhYmlsaXRpZXMuY29sb3JfYXdhcmUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5xdWV1ZV9yYXRlX2xpbWl0ZXJfY2FwYWJpbGl0aWVzLmNvdXBsaW5nX2NvbmZpZ3VyYWJsZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnF1ZXVlX3JhdGVfbGltaXRlcl9jYXBhYmlsaXRpZXMuY291cGxpbmdfYmVoYXZpcm9fZGVmYXVsdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnF1ZXVlX3JhdGVfbGltaXRlcl9jYXBhYmlsaXRpZXMuY29sb3JfbWFya2luZ19zdXBwb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucXVldWVfcmF0ZV9saW1pdGVyX2NhcGFiaWxpdGllcy5zbWFydF9jb2xvcl9kcm9wKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9DT1VQTElOR19GTEFHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5jb3VwbGluZ19mbGFnLmNvdXBsaW5nX2ZsYWcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0NMT0NLX1RSQU5TUE9SVF9DQVBBQklMSVRJRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuY2xvY2tfdHJhbnNwb3J0X2NhcGFiaWxpdGllcy5wcHNfcHVsc2Vfc3VwcG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuY2xvY2tfdHJhbnNwb3J0X2NhcGFiaWxpdGllcy50b2Rfc3RyaW5nX3N1cHBvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51LmNsb2NrX3RyYW5zcG9ydF9jYXBhYmlsaXRpZXMudjJmcmFtZV9zdXBwb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9FTkFCTEVfQ0xPQ0tfVFJBTlNQT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51LmVuYWJsZV9jbG9ja190cmFuc3BvcnQucHBzX3B1bHNlX291dHB1dCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZW5hYmxlX2Nsb2NrX3RyYW5zcG9ydC50b2Rfc3RyaW5nX291dHB1dCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZW5hYmxlX2Nsb2NrX3RyYW5zcG9ydC52MmZyYW1lX291dHB1dCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVElNRV9UUkFOU0ZFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnRpbWVfdHJhbnNmZXIubXBjcF9yZWZlcmVuY2VfcG9pbnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRoaXMtPnUudGltZV90cmFuc2Zlci50b2Rfc3RyaW5nX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfdGltZV90cmFuc2Zlcl9jb3VudF90b2Rfc3RyaW5nKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUudGltZV90cmFuc2Zlci50b2Rfc3RyaW5nX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUudGltZV90cmFuc2Zlci50b2Rfc3RyaW5nID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidG9kX3N0cmluZ1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX3RpbWVfdHJhbnNmZXJcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS50aW1lX3RyYW5zZmVyLnRvZF9zdHJpbmcgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS50aW1lX3RyYW5zZmVyLnRvZF9zdHJpbmdfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUudGltZV90cmFuc2Zlci50b2Rfc3RyaW5nLCB0aGlzLT51LnRpbWVfdHJhbnNmZXIudG9kX3N0cmluZ19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUFJPUEFHQVRJT05fUEFSQU1FVEVSUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnByb3BhZ2F0aW9uX3BhcmFtZXRlcnMubmRvd24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucHJvcGFnYXRpb25fcGFyYW1ldGVycy5udXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JUVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnJ0dC5ydHQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RBQ19DT05GSUdVUkFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZGFjX2NvbmZpZ3VyYXRpb24uc3RhZykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5kYWNfY29uZmlndXJhdGlvbi5jdGFnKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EQUNfQ09ORklHVVJBVElPTl9FTkFCTEVfRElTQUJMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5kYWNfY29uZmlndXJhdGlvbl9lbmFibGVfZGlzYWJsZS5sbGRwX2luc3RhbmNlX3N0YXR1cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVfQlJPQURDQVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucnhfZnJhbWVfYnJvYWRjYXN0LnJ4X2Jyb2FkY2FzdF9mcmFtZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FU19CUk9BRENBU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS50eF9mcmFtZXNfYnJvYWRjYXN0LnR4X2Jyb2FkY2FzdF9mcmFtZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FU19NVUxUSUNBU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS50eF9mcmFtZXNfbXVsdGljYXN0LnR4X211bHRpY2FzdF9mcmFtZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FU19NVUxUSUNBU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5yeF9mcmFtZXNfbXVsdGljYXN0LnJ4X211bHRpY2FzdF9mcmFtZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX0dSRUVOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudHhfYnl0ZXNfZ3JlZW4udHhfYnl0ZXNfZ3JlZW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0JZVEVTX0dSRUVOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucnhfYnl0ZXNfZ3JlZW4ucnhfYnl0ZXNfZ3JlZW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09OVV9NQ0FTVF9MTElEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3UxNl9saXN0X3U4X3VucGFjaygmdGhpcy0+dS5vbnVfbWNhc3RfbGxpZC5sbGlkX3ZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9VTklfTUFDX0xFQVJORUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfbWFjX2FkZHJlc3MoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnVuaV9tYWNfbGVhcm5lZC5tYWNfYWRkcmVzcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnVuaV9tYWNfbGVhcm5lZC51bmlfcG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVU5JX01BQ19UQUJMRV9GVUxMX0JFSEFWSU9SOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51LnVuaV9tYWNfdGFibGVfZnVsbF9iZWhhdmlvci5vdmVyX3dyaXRlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PTlVfUFdSX1NBVklOR19DQVA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9wb3dlcl9zYXZpbmdfbW9kZV91bnBhY2soJnRoaXMtPnUub251X3B3cl9zYXZpbmdfY2FwLnB3cl9zYXZpbmdfbW9kZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9wd3Jfc2F2aW5nX2NhcC5lYXJseV93YWtlX3VwX3N1cHBvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5vbnVfcHdyX3NhdmluZ19jYXAudmVuX3NwZWNfZmllbGRfc2l6ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm9udV9wd3Jfc2F2aW5nX2NhcC52ZW5fc3BlY19maWVsZF9zaXplID4gMCkgJiYgKHRoaXMtPnUub251X3B3cl9zYXZpbmdfY2FwLnZlbl9zcGVjX2ZpZWxkID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmVuX3NwZWNfZmllbGRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9vbnVfcHdyX3NhdmluZ19jYXBcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5vbnVfcHdyX3NhdmluZ19jYXAudmVuX3NwZWNfZmllbGQgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5vbnVfcHdyX3NhdmluZ19jYXAudmVuX3NwZWNfZmllbGRfc2l6ZSAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5vbnVfcHdyX3NhdmluZ19jYXAudmVuX3NwZWNfZmllbGQsIHRoaXMtPnUub251X3B3cl9zYXZpbmdfY2FwLnZlbl9zcGVjX2ZpZWxkX3NpemUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RBQ19DT05GSUdVUkFUSU9OX0ZMQUdTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RBQ19QQVNTV09SRF9DSEFMTEVOR0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRU5FUkdZX0VGRklDSUVOVF9FVEhFUk5FVF9TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTDJDUF9GUkFNRVNfRElTQ0FSREVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0wyQ1BfRlJBTUVTX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0wyQ1BfRlJBTUVTX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0wyQ1BfT0NURVRTX0RJU0NBUkRFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MMkNQX09DVEVUU19SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MMkNQX09DVEVUU19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MSU5FX1JBVEVfTU9ERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9NRURJQV9UWVBFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX05VTUJFUl9PRl9QUk9HUkFNTUFCTEVfQ09VTlRFUlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT05VX01BWF9GUkFNRV9TSVpFX0NBUEFCSUxJVFk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUFdSX09WRVJfRVRIRVJORVRfU1RBVFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0JZVEVTX1lFTExPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRVNfVU5JQ0FTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRVNfWUVMTE9XOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0wyRVJST1JTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX1lFTExPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRVNfVU5JQ0FTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRVNfWUVMTE9XOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0wyRVJST1JTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1VOSV9NQVhfRlJBTUVfU0laRV9MSU1JVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLT51LmRlZi51bmtub3duX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfZGVmX2NvdW50X3Vua25vd24oJnBvc3RMZW5CdWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5kZWYudW5rbm93bl9jb3VudCA+IDApICYmICh0aGlzLT51LmRlZi51bmtub3duID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidW5rbm93blwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2RlZlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmRlZi51bmtub3duID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZGVmLnVua25vd25fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUuZGVmLnVua25vd24sIHRoaXMtPnUuZGVmLnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+d2lkdGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFmX2F0dHJpYnV0ZSBsZWFmOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50OF90IGxlbmd0aDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYXR0cmlidXRlX3VucGFjaygmbGVhZiwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAobGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfU0VRVUVOQ0VfTlVNQkVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PTlVfSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0ZJUk1XQVJFX0lORk86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0NISVBfSU5GTzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EQVRFX09GX01BTlVGQUNUVVJFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX01BTlVGQUNUVVJFUl9JTkZPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlZmF1bHRfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKGRlZmF1bHRfZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9NQVhfTE9HSUNBTF9MSU5LUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX05VTV9FUE9OX1BPUlRTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9OVU1fVU5JX1BPUlRTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9QQUNLRVRfQlVGRkVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JFUE9SVF9USFJFU0hPTERTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgcmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnJlcG9ydF92YWx1ZXNfcGVyX3F1ZXVlX3NldCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50MTZfdCkgKiByZXBvcnRfdmFsdWVzX3Blcl9xdWV1ZV9zZXQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCByZXBvcnRfdmFsdWVzX3Blcl9xdWV1ZV9zZXQgKiAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQxNl90KSAqIHJlcG9ydF92YWx1ZXNfcGVyX3F1ZXVlX3NldCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIHJlcG9ydF92YWx1ZXNfcGVyX3F1ZXVlX3NldCAqIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDE2X3QpICogcmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgcmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0ICogMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50MTZfdCkgKiByZXBvcnRfdmFsdWVzX3Blcl9xdWV1ZV9zZXQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCByZXBvcnRfdmFsdWVzX3Blcl9xdWV1ZV9zZXQgKiAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MSU5LX1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PQU1fUkFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RZTl9MRUFSTl9UQUJMRV9TSVpFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EWU5fTEVBUk5fQUdFX0xJTUlUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EWU5fTUFDX1RBQkxFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfU1RBVElDX01BQ19UQUJMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZV9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BPUlRfQ0FQQUJJTElUWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RZTl9MRUFSTl9NT0RFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9NSU5fTUFDX0xJTUlUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9NQVhfTUFDX0FMTE9XRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0FHR19NQUNfTElNSVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0xFTl9FUlJfRElTQ0FSRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRkxPT0RfVU5LTk9XTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTE9DQUxfU1dJVENISU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9RVUVVRV9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBudW1iZXJfb2ZfbGlua3M7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMDsKKyAgICAgICAgICAgICAgICB1aW50OF90IG51bWJlcl9vZl9wb3J0czsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkxOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmbnVtYmVyX29mX2xpbmtzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3NldCkgKiBudW1iZXJfb2ZfbGlua3MpOworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IG51bWJlcl9vZl9saW5rczsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfc2V0X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmbnVtYmVyX29mX3BvcnRzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3NldCkgKiBudW1iZXJfb2ZfcG9ydHMpOworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IG51bWJlcl9vZl9wb3J0czsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfc2V0X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0ZJUk1XQVJFX0ZJTEVOQU1FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGZpcm13YXJlX2ZpbGVuYW1lX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkdW1teTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZkdW1teSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGR1bW15ID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZmlybXdhcmVfZmlsZW5hbWVfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChmaXJtd2FyZV9maWxlbmFtZV9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BPUlRfU1RBVF9USFJFU0g6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9zdGF0aXN0aWNfdGhyZXNob2xkX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTElOS19TVEFUX1RIUkVTSDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3N0YXRpc3RpY190aHJlc2hvbGRfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9LRVlfRVhQSVJZX1RJTUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0VOQ1JZUFRfTU9ERToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUE9SVF9JTkdSRVNTX1JVTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTFVFX0ZJRUxEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0FMVF9DVkxBTl9FVEhFUlRZUEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9BTFRfU1ZMQU5fRVRIRVJUWVBFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQkNfUkFURV9MSU1JVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRUdSRVNTX1NIQVBJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBudW1iZXJfb2Zfc2hhcGVyczsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmbnVtYmVyX29mX3NoYXBlcnMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc2hhcGVyKSAqIG51bWJlcl9vZl9zaGFwZXJzKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgbnVtYmVyX29mX3NoYXBlcnMgKiA3KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9JTkdSRVNTX1BPTElDSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbnVtYmVyX29mX3JhdGVfbGV2ZWxzOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJm51bWJlcl9vZl9yYXRlX2xldmVscykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fZHBvZV9yYXRlX2xldmVsKSAqIG51bWJlcl9vZl9yYXRlX2xldmVscyk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIG51bWJlcl9vZl9yYXRlX2xldmVscyAqIDUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0ZFQ19NT0RFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTUZSX05BTUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgbWFuX25hbWVfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbWFuX25hbWVfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChtYW5fbmFtZV9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0ZXQVJFX01GR19USU1FX1ZBUl9DVFJMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9WRU5ET1JfTkFNRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB2ZW5kb3JfbmFtZV9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB2ZW5kb3JfbmFtZV9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHZlbmRvcl9uYW1lX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTU9ERUxfTlVNQkVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IG1vZGVsX251bWJlcl9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBtb2RlbF9udW1iZXJfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChtb2RlbF9udW1iZXJfZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9IV19WRVJTSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGh3X3ZlcnNpb25fZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaHdfdmVyc2lvbl9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKGh3X3ZlcnNpb25fZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PUFRfTU9OX1RFTVBFUkFUVVJFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGN1cnJlbnRfdGVtcGVyYXR1cmVfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudF90ZW1wZXJhdHVyZV9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKGN1cnJlbnRfdGVtcGVyYXR1cmVfZWxlbV9jb3VudCAqIHNpemVvZih1aW50MTZfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT1BUX01PTl9WQ0M6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgY3VycmVudF92Y2NfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudF92Y2NfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChjdXJyZW50X3ZjY19lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PUFRfTU9OX1RYX0JJQVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgY3VycmVudF90eF9iaWFzX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdHhfYmlhc19lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKGN1cnJlbnRfdHhfYmlhc19lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PUFRfTU9OX1RYX1BPV0VSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGN1cnJlbnRfdHhfcG93ZXJfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudF90eF9wb3dlcl9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKGN1cnJlbnRfdHhfcG93ZXJfZWxlbV9jb3VudCAqIHNpemVvZih1aW50MTZfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT1BUX01PTl9SWF9QT1dFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBjdXJyZW50X3J4X3Bvd2VyX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfcnhfcG93ZXJfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChjdXJyZW50X3J4X3Bvd2VyX2VsZW1fY291bnQgKiBzaXplb2YodWludDE2X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVfVE9PX1NIT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTY0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTY1MTI3OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTEyODI1NToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUyNTY1MTE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FNTEyMTAyMzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxMDI0MTUxODoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxNTE5UExVUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUU2NDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUU2NTEyNzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUUxMjgyNTU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMjU2NTExOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTUxMjEwMjM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMTAyNDE1MTg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMTUxOVBMVVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1FVRVVFX0RFTEFZX1RIUkVTSDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUVVFVUVfREVMQVk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0ZSQU1FU19EUk9QUEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9CWVRFU19EUk9QUEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9CWVRFU19ERUxBWUVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19VTlVTRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RPTlVfUE9SVF9UWVBFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHBvcnRfdHlwZV9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwb3J0X3R5cGVfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChwb3J0X3R5cGVfZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fZHBvZV9wb3J0X3R5cGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1NVU1BFTkRfUkVTVU1FX0FMQVJNX1JFUE9SVElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWZhdWx0X2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChkZWZhdWx0X2VsZW1fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXZlbnRfb3B0aW9ucykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfSVBNQ19GT1JXQVJESU5HX1JVTEVfQ09ORklHVVJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfSVRQSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9CVFBJRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1FVRVVFX0NJUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1FVRVVFX0VJUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1FVRVVFX0NPTE9SX01BUktJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1FVRVVFX1JBVEVfTElNSVRFUl9DQVBBQklMSVRJRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0NPVVBMSU5HX0ZMQUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0NMT0NLX1RSQU5TUE9SVF9DQVBBQklMSVRJRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRU5BQkxFX0NMT0NLX1RSQU5TUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9USU1FX1RSQU5TRkVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHRvZF9zdHJpbmdfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHRvZF9zdHJpbmdfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh0b2Rfc3RyaW5nX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUFJPUEFHQVRJT05fUEFSQU1FVEVSUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JUVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfREFDX0NPTkZJR1VSQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EQUNfQ09ORklHVVJBVElPTl9FTkFCTEVfRElTQUJMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVfQlJPQURDQVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRVNfQlJPQURDQVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRVNfTVVMVElDQVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRVNfTVVMVElDQVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19HUkVFTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfQllURVNfR1JFRU46CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09OVV9NQ0FTVF9MTElEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3UxNl9saXN0X3U4X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVU5JX01BQ19MRUFSTkVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVU5JX01BQ19UQUJMRV9GVUxMX0JFSEFWSU9SOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PTlVfUFdSX1NBVklOR19DQVA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCB2ZW5fc3BlY19maWVsZF9zaXplOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ2ZW5fc3BlY19maWVsZF9zaXplKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogdmVuX3NwZWNfZmllbGRfc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIHZlbl9zcGVjX2ZpZWxkX3NpemUgKiAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EQUNfQ09ORklHVVJBVElPTl9GTEFHUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EQUNfUEFTU1dPUkRfQ0hBTExFTkdFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0VORVJHWV9FRkZJQ0lFTlRfRVRIRVJORVRfU1RBVFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0wyQ1BfRlJBTUVTX0RJU0NBUkRFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MMkNQX0ZSQU1FU19SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MMkNQX0ZSQU1FU19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MMkNQX09DVEVUU19ESVNDQVJERUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTDJDUF9PQ1RFVFNfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTDJDUF9PQ1RFVFNfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTElORV9SQVRFX01PREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTUVESUFfVFlQRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9OVU1CRVJfT0ZfUFJPR1JBTU1BQkxFX0NPVU5URVJTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09OVV9NQVhfRlJBTUVfU0laRV9DQVBBQklMSVRZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BXUl9PVkVSX0VUSEVSTkVUX1NUQVRVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9CWVRFU19ZRUxMT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVTX1VOSUNBU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVTX1lFTExPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9MMkVSUk9SUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19ZRUxMT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUVTX1VOSUNBU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUVTX1lFTExPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9MMkVSUk9SUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9VTklfTUFYX0ZSQU1FX1NJWkVfTElNSVQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdW5rbm93bl9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB1bmtub3duX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodW5rbm93bl9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9kZWZfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9tYW51ZmFjdHVyZXJfaW5mb19jb3VudF9kZWYoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfZmlybXdhcmVfZmlsZW5hbWVfY291bnRfZmlybXdhcmVfZmlsZW5hbWUoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICB1aW50OF90IGR1bW15OworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgYnVmQ2xvbmUgPSAqYnVmOworICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJmJ1ZkNsb25lLCAmZHVtbXkpKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkdW1teSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfbWZyX25hbWVfY291bnRfbWFuX25hbWUoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfdmVuZG9yX25hbWVfY291bnRfdmVuZG9yX25hbWUoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfbW9kZWxfbnVtYmVyX2NvdW50X21vZGVsX251bWJlcihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9od192ZXJzaW9uX2NvdW50X2h3X3ZlcnNpb24oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfb3B0X21vbl90ZW1wZXJhdHVyZV9jb3VudF9jdXJyZW50X3RlbXBlcmF0dXJlKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX29wdF9tb25fdmNjX2NvdW50X2N1cnJlbnRfdmNjKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX29wdF9tb25fdHhfYmlhc19jb3VudF9jdXJyZW50X3R4X2JpYXMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfb3B0X21vbl90eF9wb3dlcl9jb3VudF9jdXJyZW50X3R4X3Bvd2VyKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX29wdF9tb25fcnhfcG93ZXJfY291bnRfY3VycmVudF9yeF9wb3dlcihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9kb251X3BvcnRfdHlwZV9jb3VudF9wb3J0X3R5cGUoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfc3VzcGVuZF9yZXN1bWVfYWxhcm1fcmVwb3J0aW5nX2NvdW50X2RlZihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV90aW1lX3RyYW5zZmVyX2NvdW50X3RvZF9zdHJpbmcoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfbWFjX3RhYmxlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX21hY190YWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGkwOworICAgIGlmICgodGhpcy0+bWFjX2FkZHJlc3NfY291bnQgPiAwKSAmJiAodGhpcy0+bWFjX2FkZHJlc3MgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibWFjX2FkZHJlc3NcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfbWFjX3RhYmxlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPm1hY19hZGRyZXNzX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+bWFjX2FkZHJlc3NbaTBdKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfbWFjX3RhYmxlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9tYWNfdGFibGUgKnRoaXMpCit7CisgICAgcmV0dXJuICg2ICogdGhpcy0+bWFjX2FkZHJlc3NfY291bnQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfbWFjX3RhYmxlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfbWFjX3RhYmxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDMyX3QgaTA7CisgICAgdGhpcy0+bWFjX2FkZHJlc3NfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfbWFjX3RhYmxlX2NvdW50X21hY19hZGRyZXNzKGJ1Zik7CisgICAgaWYgKCh0aGlzLT5tYWNfYWRkcmVzc19jb3VudCA+IDApICYmICh0aGlzLT5tYWNfYWRkcmVzcyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm1hY19hZGRyZXNzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX21hY190YWJsZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT5tYWNfYWRkcmVzcyA9IChiY21vc19tYWNfYWRkcmVzcyAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+bWFjX2FkZHJlc3NfY291bnQgKiBzaXplb2YoYmNtb3NfbWFjX2FkZHJlc3MpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPm1hY19hZGRyZXNzX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+bWFjX2FkZHJlc3NbaTBdKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9tYWNfdGFibGVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDMyX3QgbWFjX2FkZHJlc3NfZWxlbV9jb3VudCA9IDA7CisgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDYpKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIG1hY19hZGRyZXNzX2VsZW1fY291bnQgKz0gMTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQobWFjX2FkZHJlc3NfZWxlbV9jb3VudCAqIHNpemVvZihiY21vc19tYWNfYWRkcmVzcykpOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX21hY190YWJsZV9jb3VudF9tYWNfYWRkcmVzcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gNik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9ldmVudF9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9hbGFybV9jb2RlX3BhY2sodGhpcy0+ZXZlbnRfY29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmV2ZW50X2NvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0FMQVJNX0NPREVfU1RBVElTVElDU19BTEFSTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUuc3RhdGlzdGljc19hbGFybS5yYWlzZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X3R5cGVfcGFjayh0aGlzLT51LnN0YXRpc3RpY3NfYWxhcm0ub2JqZWN0X3R5cGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuc3RhdGlzdGljc19hbGFybS5vYmplY3RfaW5zdGFuY2UpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuc3RhdGlzdGljc19hbGFybS5zdGF0X2JyYW5jaCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuc3RhdGlzdGljc19hbGFybS5zdGF0X2xlYWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0FMQVJNX0NPREVfS0VZRVhDSEFOR0VfRkFJTFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9BTEFSTV9DT0RFX0xPUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9BTEFSTV9DT0RFX01BQ19UQUJMRV9PVkVSRkxPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9BTEFSTV9DT0RFX09OVV9CVVNZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0FMQVJNX0NPREVfUE9SVF9ESVNBQkxFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9BTEFSTV9DT0RFX1BPV0VSX0ZBSUxVUkU6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT51LmRlZi5yYWlzZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X3R5cGVfcGFjayh0aGlzLT51LmRlZi5vYmplY3RfdHlwZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5kZWYub2JqZWN0X2luc3RhbmNlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXZlbnRfYmFzZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgc3dpdGNoICh0aGlzLT5ldmVudF9jb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9BTEFSTV9DT0RFX1NUQVRJU1RJQ1NfQUxBUk06CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0FMQVJNX0NPREVfS0VZRVhDSEFOR0VfRkFJTFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9BTEFSTV9DT0RFX0xPUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9BTEFSTV9DT0RFX01BQ19UQUJMRV9PVkVSRkxPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9BTEFSTV9DT0RFX09OVV9CVVNZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0FMQVJNX0NPREVfUE9SVF9ESVNBQkxFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9BTEFSTV9DT0RFX1BPV0VSX0ZBSUxVUkU6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXZlbnRfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXZlbnRfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYWxhcm1fY29kZV91bnBhY2soJnRoaXMtPmV2ZW50X2NvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5ldmVudF9jb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9BTEFSTV9DT0RFX1NUQVRJU1RJQ1NfQUxBUk06CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT51LnN0YXRpc3RpY3NfYWxhcm0ucmFpc2VkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF90eXBlX3VucGFjaygmdGhpcy0+dS5zdGF0aXN0aWNzX2FsYXJtLm9iamVjdF90eXBlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LnN0YXRpc3RpY3NfYWxhcm0ub2JqZWN0X2luc3RhbmNlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LnN0YXRpc3RpY3NfYWxhcm0uc3RhdF9icmFuY2gpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LnN0YXRpc3RpY3NfYWxhcm0uc3RhdF9sZWFmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9BTEFSTV9DT0RFX0tFWUVYQ0hBTkdFX0ZBSUxVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQUxBUk1fQ09ERV9MT1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQUxBUk1fQ09ERV9NQUNfVEFCTEVfT1ZFUkZMT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQUxBUk1fQ09ERV9PTlVfQlVTWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9BTEFSTV9DT0RFX1BPUlRfRElTQUJMRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQUxBUk1fQ09ERV9QT1dFUl9GQUlMVVJFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+dS5kZWYucmFpc2VkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF90eXBlX3VucGFjaygmdGhpcy0+dS5kZWYub2JqZWN0X3R5cGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZGVmLm9iamVjdF9pbnN0YW5jZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYWxhcm1fY29kZSBldmVudF9jb2RlOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYWxhcm1fY29kZV91bnBhY2soJmV2ZW50X2NvZGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChldmVudF9jb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9BTEFSTV9DT0RFX1NUQVRJU1RJQ1NfQUxBUk06CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0FMQVJNX0NPREVfS0VZRVhDSEFOR0VfRkFJTFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9BTEFSTV9DT0RFX0xPUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9BTEFSTV9DT0RFX01BQ19UQUJMRV9PVkVSRkxPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9BTEFSTV9DT0RFX09OVV9CVVNZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0FMQVJNX0NPREVfUE9SVF9ESVNBQkxFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9BTEFSTV9DT0RFX1BPV0VSX0ZBSUxVUkU6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9vcGNvZGVfcGFjayh0aGlzLT5vcGNvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFJBTlNGRVJfT1BDT0RFX0ZJTEVfUkVBRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHlwZV9wYWNrKHRoaXMtPnUuZmlsZV9yZWFkLmZpbGVfdHlwZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX09QQ09ERV9GSUxFX1dSSVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5maWxlX3dyaXRlLmZpbGVuYW1lX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZmlsZV93cml0ZS5maWxlbmFtZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJmaWxlbmFtZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfYmFzZV9maWxlX3dyaXRlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmZpbGVfd3JpdGUuZmlsZW5hbWVfY291bnQgPiAxMjgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5maWxlX3dyaXRlLmZpbGVuYW1lLCB0aGlzLT51LmZpbGVfd3JpdGUuZmlsZW5hbWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFJBTlNGRVJfT1BDT0RFX0ZJTEVfREFUQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5maWxlX2RhdGEuYmxvY2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmZpbGVfZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5maWxlX2RhdGEubGVuZ3RoID4gMCkgJiYgKHRoaXMtPnUuZmlsZV9kYXRhLmRhdGEgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZGF0YVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfYmFzZV9maWxlX2RhdGFcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5maWxlX2RhdGEuZGF0YSwgdGhpcy0+dS5maWxlX2RhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX09QQ09ERV9GSUxFX0FDSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5maWxlX2Fjay5ibG9jaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Vycm9yX3BhY2sodGhpcy0+dS5maWxlX2Fjay5lcnJvciwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfYmFzZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgc3dpdGNoICh0aGlzLT5vcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFJBTlNGRVJfT1BDT0RFX0ZJTEVfUkVBRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UUkFOU0ZFUl9PUENPREVfRklMRV9XUklURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSB0aGlzLT51LmZpbGVfd3JpdGUuZmlsZW5hbWVfY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX09QQ09ERV9GSUxFX0RBVEE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNCArIHRoaXMtPnUuZmlsZV9kYXRhLmxlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFJBTlNGRVJfT1BDT0RFX0ZJTEVfQUNLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfb3Bjb2RlX3VucGFjaygmdGhpcy0+b3Bjb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b3Bjb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX09QQ09ERV9GSUxFX1JFQUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3R5cGVfdW5wYWNrKCZ0aGlzLT51LmZpbGVfcmVhZC5maWxlX3R5cGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UUkFOU0ZFUl9PUENPREVfRklMRV9XUklURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLT51LmZpbGVfd3JpdGUuZmlsZW5hbWVfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Jhc2VfZmlsZV93cml0ZV9jb3VudF9maWxlbmFtZShidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5maWxlX3dyaXRlLmZpbGVuYW1lX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZmlsZV93cml0ZS5maWxlbmFtZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImZpbGVuYW1lXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9iYXNlX2ZpbGVfd3JpdGVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5maWxlX3dyaXRlLmZpbGVuYW1lID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZmlsZV93cml0ZS5maWxlbmFtZV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5maWxlX3dyaXRlLmZpbGVuYW1lX2NvdW50ID4gMTI4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5maWxlX3dyaXRlLmZpbGVuYW1lLCB0aGlzLT51LmZpbGVfd3JpdGUuZmlsZW5hbWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFJBTlNGRVJfT1BDT0RFX0ZJTEVfREFUQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5maWxlX2RhdGEuYmxvY2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmZpbGVfZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5maWxlX2RhdGEubGVuZ3RoID4gMCkgJiYgKHRoaXMtPnUuZmlsZV9kYXRhLmRhdGEgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJkYXRhXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9iYXNlX2ZpbGVfZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmZpbGVfZGF0YS5kYXRhID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZmlsZV9kYXRhLmxlbmd0aCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuZmlsZV9kYXRhLmRhdGEsIHRoaXMtPnUuZmlsZV9kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UUkFOU0ZFUl9PUENPREVfRklMRV9BQ0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZmlsZV9hY2suYmxvY2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9lcnJvcl91bnBhY2soJnRoaXMtPnUuZmlsZV9hY2suZXJyb3IsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfb3Bjb2RlIG9wY29kZTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfb3Bjb2RlX3VucGFjaygmb3Bjb2RlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAob3Bjb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX09QQ09ERV9GSUxFX1JFQUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX09QQ09ERV9GSUxFX1dSSVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGZpbGVuYW1lX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZV9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKGZpbGVuYW1lX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UUkFOU0ZFUl9PUENPREVfRklMRV9EQVRBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiBsZW5ndGgpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuZ3RoICogMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UUkFOU0ZFUl9PUENPREVfRklMRV9BQ0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Jhc2VfZmlsZV93cml0ZV9jb3VudF9maWxlbmFtZShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2luZm9fdGx2X3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaW5mb190bHYgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2luZm9fdGx2X3R5cGVfcGFjayh0aGlzLT50eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfSU5GT19UTFZfVFlQRV9EUE9FX09BTV9TVVBQT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZHBvZV9vYW1fc3VwcG9ydC5kcG9lX29hbV92ZXJzaW9uKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaW5mb190bHZfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaW5mb190bHYgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfSU5GT19UTFZfVFlQRV9EUE9FX09BTV9TVVBQT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaW5mb190bHZfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2luZm9fdGx2ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9pbmZvX3Rsdl90eXBlX3VucGFjaygmdGhpcy0+dHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0lORk9fVExWX1RZUEVfRFBPRV9PQU1fU1VQUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmRwb2Vfb2FtX3N1cHBvcnQuZHBvZV9vYW1fdmVyc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaW5mb190bHZfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaW5mb190bHZfdHlwZSB0eXBlOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaW5mb190bHZfdHlwZV91bnBhY2soJnR5cGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9JTkZPX1RMVl9UWVBFX0RQT0VfT0FNX1NVUFBPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdTh2YWx1ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV91OHZhbHVlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dmFsdWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdTh2YWx1ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3U4dmFsdWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT52YWx1ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV91OHZhbHVlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT52YWx1ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPnZhbHVlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgOCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zdGRfYXR0cmlidXRlX3ZhbHVlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdHRyaWJ1dGVfdmFsdWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlX3BhY2sodGhpcy0+bGVhZiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+d2lkdGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPndpZHRoKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5sZWFmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19JRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91OHZhbHVlX3BhY2soJnRoaXMtPnUubWFjX2lkLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FU19UWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKCZ0aGlzLT51Lm1hY19mcmFtZXNfdHhfb2sudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfU0lOR0xFX0NPTExfRlJBTUVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3BhY2soJnRoaXMtPnUubWFjX3NpbmdsZV9jb2xsX2ZyYW1lcy52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NVUxUSVBMRV9DT0xMX0ZSQU1FUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKCZ0aGlzLT51Lm1hY19tdWx0aXBsZV9jb2xsX2ZyYW1lcy52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUkFNRVNfUlhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfcGFjaygmdGhpcy0+dS5tYWNfZnJhbWVzX3J4X29rLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZDU19FUlI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfcGFjaygmdGhpcy0+dS5tYWNfZmNzX2Vyci52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19BTElHTl9FUlI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfcGFjaygmdGhpcy0+dS5tYWNfYWxpZ25fZXJyLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX09DVEVUU19UWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKCZ0aGlzLT51Lm1hY19vY3RldHNfdHhfb2sudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX0RFRkVSUkVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U4dmFsdWVfcGFjaygmdGhpcy0+dS5tYWNfZnJhbWVzX2RlZmVycmVkLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0xBVEVfQ09MTElTSU9OUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKCZ0aGlzLT51Lm1hY19sYXRlX2NvbGxpc2lvbnMudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRVhDRVNTSVZFX0NPTExJU0lPTlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfcGFjaygmdGhpcy0+dS5tYWNfZXhjZXNzaXZlX2NvbGxpc2lvbnMudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX0xPU1RfTUFDX1RYX0VSUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKCZ0aGlzLT51Lm1hY19mcmFtZXNfbG9zdF9tYWNfdHhfZXJyLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NBUlJJRVJfU0VOU0VfRVJSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U4dmFsdWVfcGFjaygmdGhpcy0+dS5tYWNfY2Fycmllcl9zZW5zZV9lcnIudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfT0NURVRTX1JYX09LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3BhY2soJnRoaXMtPnUubWFjX29jdGV0c19yeF9vay52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUkFNRVNfTE9TVF9NQUNfUlhfRVJSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3BhY2soJnRoaXMtPnUubWFjX2ZyYW1lc19sb3N0X21hY19yeF9lcnIudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTUNBU1RfRlJBTUVTX1RYX09LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3BhY2soJnRoaXMtPnUubWFjX21jYXN0X2ZyYW1lc190eF9vay52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19CQ0FTVF9GUkFNRVNfVFhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfcGFjaygmdGhpcy0+dS5tYWNfYmNhc3RfZnJhbWVzX3R4X29rLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSX0VYQ0VTU0lWRV9ERUZFUlJBTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91OHZhbHVlX3BhY2soJnRoaXMtPnUubWFjX2ZyX2V4Y2Vzc2l2ZV9kZWZlcnJhbC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NQ0FTVF9GUkFNRVNfUlhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfcGFjaygmdGhpcy0+dS5tYWNfbWNhc3RfZnJhbWVzX3J4X29rLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0JDQVNUX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKCZ0aGlzLT51Lm1hY19iY2FzdF9mcmFtZXNfcnhfb2sudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfSU5fUkFOR0VfTEVOX0VSUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKCZ0aGlzLT51Lm1hY19pbl9yYW5nZV9sZW5fZXJyLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX09VVF9PRl9SQU5HRV9MRU5fRVJSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3BhY2soJnRoaXMtPnUubWFjX291dF9vZl9yYW5nZV9sZW5fZXJyLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FX1RPT19MT05HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3BhY2soJnRoaXMtPnUubWFjX2ZyYW1lX3Rvb19sb25nLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0VOQUJMRV9TVEFUVVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT51Lm1hY19lbmFibGVfc3RhdHVzLnN0YXR1cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQUREUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT51Lm1hY19hZGRyLm1hY19hZGRyZXNzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9UWVBFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3N0ZF9waHlfdHlwZV9wYWNrKHRoaXMtPnUucGh5X3R5cGUudHlwZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9TWU1CT0xfRVJSX0RVUklOR19DQVJSSUVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3BhY2soJnRoaXMtPnUucGh5X3N5bWJvbF9lcnJfZHVyaW5nX2NhcnJpZXIudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfQURNSU5fU1RBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3N0YXRlX3BhY2sodGhpcy0+dS5waHlfYWRtaW5fc3RhdGUuc3RhdGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfTUVESUFfQVZBSUw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbWF1X21lZGlhX2F2YWlsYWJsZV9wYWNrKHRoaXMtPnUubWF1X21lZGlhX2F2YWlsLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTh2YWx1ZV9wYWNrKCZ0aGlzLT51LmF1dG9fbmVnX2lkLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfQURNSU5fU1RBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYXV0b25lZ290aWF0ZV9hZG1pbl9zdGF0ZV9wYWNrKHRoaXMtPnUuYXV0b19uZWdfYWRtaW5fc3RhdGUudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19SRU1PVEVfU0lHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2F1dG9fcmVtb3RlX3NpZ19wYWNrKHRoaXMtPnUuYXV0b19uZWdfcmVtb3RlX3NpZy52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0FVVE9fQ0ZHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2F1dG9fbmVnb3RpYXRpb25fYXV0b19jb25maWdfcGFjayh0aGlzLT51LmF1dG9fbmVnX2F1dG9fY2ZnLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfTE9DQUxfVEVDSF9BQklMSVRZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5hdXRvX25lZ19sb2NhbF90ZWNoX2FiaWxpdHkuY2FwYWJpbGl0aWVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuYXV0b19uZWdfbG9jYWxfdGVjaF9hYmlsaXR5LmNhcGFiaWxpdGllcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjYXBhYmlsaXRpZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fc3RkX2F0dHJpYnV0ZV92YWx1ZV9hdXRvX25lZ19sb2NhbF90ZWNoX2FiaWxpdHlcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5hdXRvX25lZ19sb2NhbF90ZWNoX2FiaWxpdHkuY2FwYWJpbGl0aWVzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fc3RkX2F1dG9fbmVnb2l0YXRpb25fY2FwYWJpbGl0eV9wYWNrKHRoaXMtPnUuYXV0b19uZWdfbG9jYWxfdGVjaF9hYmlsaXR5LmNhcGFiaWxpdGllc1tpMF0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfQURWRVJUSVNFRF9URUNIX0FCSUxJVFk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTE7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmF1dG9fbmVnX2FkdmVydGlzZWRfdGVjaF9hYmlsaXR5LmNhcGFiaWxpdGllc19jb3VudCA+IDApICYmICh0aGlzLT51LmF1dG9fbmVnX2FkdmVydGlzZWRfdGVjaF9hYmlsaXR5LmNhcGFiaWxpdGllcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjYXBhYmlsaXRpZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fc3RkX2F0dHJpYnV0ZV92YWx1ZV9hdXRvX25lZ19hZHZlcnRpc2VkX3RlY2hfYWJpbGl0eVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LmF1dG9fbmVnX2FkdmVydGlzZWRfdGVjaF9hYmlsaXR5LmNhcGFiaWxpdGllc19jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdXRvX25lZ29pdGF0aW9uX2NhcGFiaWxpdHlfcGFjayh0aGlzLT51LmF1dG9fbmVnX2FkdmVydGlzZWRfdGVjaF9hYmlsaXR5LmNhcGFiaWxpdGllc1tpMV0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfUlhfVEVDSDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMjsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuYXV0b19uZWdfcnhfdGVjaC5jYXBhYmlsaXRpZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5hdXRvX25lZ19yeF90ZWNoLmNhcGFiaWxpdGllcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjYXBhYmlsaXRpZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fc3RkX2F0dHJpYnV0ZV92YWx1ZV9hdXRvX25lZ19yeF90ZWNoXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUuYXV0b19uZWdfcnhfdGVjaC5jYXBhYmlsaXRpZXNfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9zdGRfYXV0b19uZWdvaXRhdGlvbl9jYXBhYmlsaXR5X3BhY2sodGhpcy0+dS5hdXRvX25lZ19yeF90ZWNoLmNhcGFiaWxpdGllc1tpMl0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfTE9DQUxfU0VMRUNUX0FCTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYXV0b19zZWxlY3Rvcl9wYWNrKHRoaXMtPnUuYXV0b19uZWdfbG9jYWxfc2VsZWN0X2FibGUudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19BRF9TRUxFQ1RfQUJMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9hdXRvX3NlbGVjdG9yX3BhY2sodGhpcy0+dS5hdXRvX25lZ19hZF9zZWxlY3RfYWJsZS52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX1JYX1NFTEVDVF9BQkxFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2F1dG9fc2VsZWN0b3JfcGFjayh0aGlzLT51LmF1dG9fbmVnX3J4X3NlbGVjdF9hYmxlLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0RVUExFWF9TVEFUVVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbWFjX2R1cGxleF9zdGF0dXNfcGFjayh0aGlzLT51Lm1hY19kdXBsZXhfc3RhdHVzLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfRlVOQ1NfU1VQUE9SVEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkzOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5tYWNfY3RybF9mdW5jc19zdXBwb3J0ZWQuZnVuY3Rpb25zX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUubWFjX2N0cmxfZnVuY3Nfc3VwcG9ydGVkLmZ1bmN0aW9ucyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJmdW5jdGlvbnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fc3RkX2F0dHJpYnV0ZV92YWx1ZV9tYWNfY3RybF9mdW5jc19zdXBwb3J0ZWRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMyA9IDA7IGkzIDwgdGhpcy0+dS5tYWNfY3RybF9mdW5jc19zdXBwb3J0ZWQuZnVuY3Rpb25zX2NvdW50OyBpMysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUubWFjX2N0cmxfZnVuY3Nfc3VwcG9ydGVkLmZ1bmN0aW9uc1tpM10pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX0ZSQU1FU19UWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKCZ0aGlzLT51Lm1hY19jdHJsX2ZyYW1lc190eC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX0ZSQU1FU19SWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKCZ0aGlzLT51Lm1hY19jdHJsX2ZyYW1lc19yeC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX1VOU1VQUE9SVEVEX09QX1JYOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3BhY2soJnRoaXMtPnUubWFjX2N0cmxfdW5zdXBwb3J0ZWRfb3BfcngudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9QQVVTRV9ERUxBWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKCZ0aGlzLT51Lm1hY19jdHJsX3BhdXNlX2RlbGF5LnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfUEFVU0VfVFg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfcGFjaygmdGhpcy0+dS5tYWNfY3RybF9wYXVzZV90eC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX1BBVVNFX1JYOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3BhY2soJnRoaXMtPnUubWFjX2N0cmxfcGF1c2VfcngudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1NFQ1NfRVZFTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfcGFjaygmdGhpcy0+dS5vYW1fbG9jYWxfZXJyX2ZyYW1lX3NlY3NfZXZlbnQudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1BFUklPRF9FVkVOVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKCZ0aGlzLT51Lm9hbV9sb2NhbF9lcnJfZnJhbWVfcGVyaW9kX2V2ZW50LnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUl9TRUNfU1VNX0VWRU5UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3BhY2soJnRoaXMtPnUub2FtX2xvY2FsX2Vycl9mcl9zZWNfc3VtX2V2ZW50LnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0VNVUxfQ1JDOEVSUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKCZ0aGlzLT51Lm9hbV9lbXVsX2NyYzhlcnIudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX01BQ19DVFJMX0ZSQU1FU19UWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKCZ0aGlzLT51Lm1wY3BfbWFjX2N0cmxfZnJhbWVzX3R4LnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9NQUNfQ1RSTF9GUkFNRVNfUlg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfcGFjaygmdGhpcy0+dS5tcGNwX21hY19jdHJsX2ZyYW1lc19yeC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfRElTQ09WRVJZX1dJTkRPV19UWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKCZ0aGlzLT51Lm1wY3BfZGlzY292ZXJ5X3dpbmRvd190eC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfRElTQ09WRVJZX1RJTUVPVVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfcGFjaygmdGhpcy0+dS5tcGNwX2Rpc2NvdmVyeV90aW1lb3V0LnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfRkVDX0NPUlJFQ1RFRF9CTE9DS1M6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuZmVjX2NvcnJlY3RlZF9ibG9ja3MudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfRkVDX1VOQ09SUkVDVEFCTEVfQkxPQ0tTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmZlY191bmNvcnJlY3RhYmxlX2Jsb2Nrcy52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9GRUNfQUJJTElUWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9mZWNfc3VwcG9ydF9wYWNrKHRoaXMtPnUuZmVjX2FiaWxpdHkudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9GRUNfTU9ERToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9zdGRfZmVjX21vZGVfcGFjayh0aGlzLT51LmZlY19tb2RlLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9HQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3BhY2soJnRoaXMtPnUubXBjcF90eF9nYXRlLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9SRUdfQUNLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3BhY2soJnRoaXMtPnUubXBjcF90eF9yZWdfYWNrLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9SRUdJU1RFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKCZ0aGlzLT51Lm1wY3BfdHhfcmVnaXN0ZXIudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1RYX1JFR19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3BhY2soJnRoaXMtPnUubXBjcF90eF9yZWdfcmVxdWVzdC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfVFhfUkVQT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3BhY2soJnRoaXMtPnUubXBjcF90eF9yZXBvcnQudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX0dBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfcGFjaygmdGhpcy0+dS5tcGNwX3J4X2dhdGUudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX1JFR19BQ0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfcGFjaygmdGhpcy0+dS5tcGNwX3J4X3JlZ19hY2sudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX1JFR0lTVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3BhY2soJnRoaXMtPnUubXBjcF9yeF9yZWdpc3Rlci52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfUlhfUkVHX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfcGFjaygmdGhpcy0+dS5tcGNwX3J4X3JlZ19yZXF1ZXN0LnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9SWF9SRVBPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfcGFjaygmdGhpcy0+dS5tcGNwX3J4X3JlcG9ydC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DT0xMSVNJT05fRlJBTUVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51Lm1hY19jb2xsaXNpb25fZnJhbWVzLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BQ1RPUl9BRE1JTl9LRVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQUNUT1JfT1BFUl9LRVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQUNUT1JfU1lTX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FDVE9SX1NZU19QUkk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQURNSU5fU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQUdHX09SX0lORElWSURVQUw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQkNBU1RfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQkNBU1RfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQ09MTEVDVE9SX01BWF9ERUxBWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19EQVRBX1JBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfREVTQzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19GUkFNRVNfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfRlJBTUVTX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0xJTktfVVBfRE9XTl9OT1RJRllfRU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfTUFDX0FERFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfTUNBU1RfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfTUNBU1RfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfTkFNRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19PUEVSX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1BBUlRORVJfT1BFUl9LRVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUEFSVE5FUl9TWVNfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUEFSVE5FUl9TWVNfUFJJOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1BPUlRfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19SWF9ESVNDQVJEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1JYX0VSUl9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUlhfT0NURVRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1RJTUVfT0ZfTEFTVF9PUEVSX0NIQU5HRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19UWF9ESVNDQVJEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1RYX0VSUl9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfVFhfT0NURVRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1VOS19QUk9UT0NPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0dST1VQX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfR1JPVVBfUE9SVF9DQVBBQ0lUWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0dST1VQX1BPUlRfTUFQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NBUEFCSUxJVElFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX01DQVNUX0FERFJfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NQ0FTVF9SWF9TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfUFJPTUlTQ1VPVVNfU1RBVFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX1RYX0VOQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9BRE1JTl9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9CQU5EX1NQTElUX0ZSRVE6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfQkFORF9TUExJVF9UWVBFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0ZBTFNFX0NBUlJJRVJTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0lETEVfRVJST1JfQ09VTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfSkFCQkVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0xPU0VfTUVESUFfQ1RSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX1RZUEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfVFlQRV9MSVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0FETUlOX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0RVUF9FVkVOVF9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9FTVVMX0JBRF9MTElEX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9FTVVMX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0VNVUxfU1BEX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9FVkVOVF9UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9GUkFNRVNfTE9TVF9PQU1fRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0lORk9fUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fSU5GT19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJfU0VDX1NVTV9USFJFU0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSX1NFQ19TVU1fV0lOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9QRVJJT0RfVEhSRVNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9QRVJJT0RfV0lOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9TRUNTX1RIUkVTSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfU0VDU19XSU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX1NZTV9QRVJJT0RfRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX1NZTV9QRVJJT0RfVEhSRVNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9TWU1fUEVSSU9EX1dJTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9GTEFHUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT09QX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPT1BfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTU9ERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9PUkdfU1BFQ0lGSUNfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fT1JHX1NQRUNJRklDX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1BEVV9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9QRFVfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0NPTkZJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1BFUklPRF9FVkVOVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1BFUklPRF9USFJFU0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9QRVJJT0RfV0lOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfU0VDU19FVkVOVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1NFQ1NfVEhSRVNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfU0VDU19XSU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0ZMQUdTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9NQUNfQUREUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfUERVX0NPTkZJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX1ZFTkRPUl9ERVZJQ0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX1ZFTkRPUl9PVUk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX1ZFTkRPUl9WRVJTSU9OOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1VOSVFVRV9FVkVOVF9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9VTlNVUFBPUlRFRF9PUENPREVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1ZBUl9SRVFfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVkFSX1JFUV9UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9WQVJfUkVTUF9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9WQVJfUkVTUF9UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9NSUlfREVURUNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX1NRRV9URVNUX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9UWVBFX0xJU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0FETUlOX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9BTElHTl9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0FVVE9fUEFSVF9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQVVUT19QQVJUSVRJT05TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9CVVJTVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0NPTExJU0lPTlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0RBVEFfUkFURV9NSVNNQVRDSEVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9GQ1NfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9GUkFNRVNfVE9PX0xPTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9JU09MQVRFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfTEFTVF9TT1VSQ0VfQUREUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfTEFURV9FVkVOVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1JFQURBQkxFX0ZSQU1FUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfUkVBREFCTEVfT0NURVRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9SVU5UUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfU0hPUlRfRVZFTlRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9TT1VSQ0VfQUREUl9DSEFOR0VTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9TWU1fRVJSX0RVUklOR19QS1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1ZFUllfTE9OR19FVkVOVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfR1JPVVBfQ0FQQUNJVFk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfR1JPVVBfTUFQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0hFQUxUSF9EQVRBOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0hFQUxUSF9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9IRUFMVEhfVEVYVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9UWF9DT0xMSVNJT05TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX1RZUEU6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdHRyaWJ1dGVfdmFsdWVfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdHRyaWJ1dGVfdmFsdWUgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPndpZHRoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLT53aWR0aDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdWludDMyX3QgY291bnQgPSAzOworICAgICAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfSUQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX1RYX09LOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX1NJTkdMRV9DT0xMX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NVUxUSVBMRV9DT0xMX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUkFNRVNfUlhfT0s6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRkNTX0VSUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19BTElHTl9FUlI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfT0NURVRTX1RYX09LOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FU19ERUZFUlJFRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19MQVRFX0NPTExJU0lPTlM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRVhDRVNTSVZFX0NPTExJU0lPTlM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX0xPU1RfTUFDX1RYX0VSUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DQVJSSUVSX1NFTlNFX0VSUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19PQ1RFVFNfUlhfT0s6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX0xPU1RfTUFDX1JYX0VSUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NQ0FTVF9GUkFNRVNfVFhfT0s6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQkNBU1RfRlJBTUVTX1RYX09LOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSX0VYQ0VTU0lWRV9ERUZFUlJBTDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NQ0FTVF9GUkFNRVNfUlhfT0s6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQkNBU1RfRlJBTUVTX1JYX09LOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0lOX1JBTkdFX0xFTl9FUlI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfT1VUX09GX1JBTkdFX0xFTl9FUlI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVfVE9PX0xPTkc6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRU5BQkxFX1NUQVRVUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19BRERSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX1RZUEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfU1lNQk9MX0VSUl9EVVJJTkdfQ0FSUklFUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9BRE1JTl9TVEFURToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9NRURJQV9BVkFJTDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0lEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfQURNSU5fU1RBVEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19SRU1PVEVfU0lHOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfQVVUT19DRkc6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19MT0NBTF9URUNIX0FCSUxJVFk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAoMiAqIHRoaXMtPnUuYXV0b19uZWdfbG9jYWxfdGVjaF9hYmlsaXR5LmNhcGFiaWxpdGllc19jb3VudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0FEVkVSVElTRURfVEVDSF9BQklMSVRZOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gKDIgKiB0aGlzLT51LmF1dG9fbmVnX2FkdmVydGlzZWRfdGVjaF9hYmlsaXR5LmNhcGFiaWxpdGllc19jb3VudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX1JYX1RFQ0g6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAoMiAqIHRoaXMtPnUuYXV0b19uZWdfcnhfdGVjaC5jYXBhYmlsaXRpZXNfY291bnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19MT0NBTF9TRUxFQ1RfQUJMRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0FEX1NFTEVDVF9BQkxFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfUlhfU0VMRUNUX0FCTEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRFVQTEVYX1NUQVRVUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX0ZVTkNTX1NVUFBPUlRFRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9ICgyICogdGhpcy0+dS5tYWNfY3RybF9mdW5jc19zdXBwb3J0ZWQuZnVuY3Rpb25zX2NvdW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfRlJBTUVTX1RYOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfRlJBTUVTX1JYOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfVU5TVVBQT1JURURfT1BfUlg6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9QQVVTRV9ERUxBWToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX1BBVVNFX1RYOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfUEFVU0VfUlg6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1NFQ1NfRVZFTlQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1BFUklPRF9FVkVOVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJfU0VDX1NVTV9FVkVOVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9FTVVMX0NSQzhFUlI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX01BQ19DVFJMX0ZSQU1FU19UWDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfTUFDX0NUUkxfRlJBTUVTX1JYOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9ESVNDT1ZFUllfV0lORE9XX1RYOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9ESVNDT1ZFUllfVElNRU9VVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0ZFQ19DT1JSRUNURURfQkxPQ0tTOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfRkVDX1VOQ09SUkVDVEFCTEVfQkxPQ0tTOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfRkVDX0FCSUxJVFk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9GRUNfTU9ERToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfVFhfR0FURToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfVFhfUkVHX0FDSzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfVFhfUkVHSVNURVI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1RYX1JFR19SRVFVRVNUOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9SRVBPUlQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX0dBVEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX1JFR19BQ0s6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX1JFR0lTVEVSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9SWF9SRUdfUkVRVUVTVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfUlhfUkVQT1JUOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NPTExJU0lPTl9GUkFNRVM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQUNUT1JfQURNSU5fS0VZOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BQ1RPUl9PUEVSX0tFWToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQUNUT1JfU1lTX0lEOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BQ1RPUl9TWVNfUFJJOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BRE1JTl9TVEFURToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQUdHX09SX0lORElWSURVQUw6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0JDQVNUX1JYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19CQ0FTVF9UWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQ09MTEVDVE9SX01BWF9ERUxBWToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfREFUQV9SQVRFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19ERVNDOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19GUkFNRVNfUlg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0ZSQU1FU19UWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfSUQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0xJTktfVVBfRE9XTl9OT1RJRllfRU46CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX01BQ19BRERSOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19NQ0FTVF9SWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfTUNBU1RfVFg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX05BTUU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX09QRVJfU1RBVEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1BBUlRORVJfT1BFUl9LRVk6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1BBUlRORVJfU1lTX0lEOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19QQVJUTkVSX1NZU19QUkk6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1BPUlRfTElTVDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUlhfRElTQ0FSRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUlhfRVJSX0ZSQU1FUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUlhfT0NURVRTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19USU1FX09GX0xBU1RfT1BFUl9DSEFOR0U6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1RYX0RJU0NBUkQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1RYX0VSUl9GUkFNRVM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1RYX09DVEVUUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfVU5LX1BST1RPQ09MOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0dST1VQX0lEOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0dST1VQX1BPUlRfQ0FQQUNJVFk6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfR1JPVVBfUE9SVF9NQVA6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NBUEFCSUxJVElFUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9JRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTUNBU1RfQUREUl9MSVNUOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NQ0FTVF9SWF9TVEFUVVM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX1BST01JU0NVT1VTX1NUQVRVUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfVFhfRU5BQkxFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9BRE1JTl9TVEFURToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfQkFORF9TUExJVF9GUkVROgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9CQU5EX1NQTElUX1RZUEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0ZBTFNFX0NBUlJJRVJTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9JRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfSURMRV9FUlJPUl9DT1VOVDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfSkFCQkVSOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9MT1NFX01FRElBX0NUUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfVFlQRToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfVFlQRV9MSVNUOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9BRE1JTl9TVEFURToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRFVQX0VWRU5UX1JYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9FTVVMX0JBRF9MTElEX0VSUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRU1VTF9JRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRU1VTF9TUERfRVJSOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9FVkVOVF9UWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRlJBTUVTX0xPU1RfT0FNX0VSUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fSUQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0lORk9fUlg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0lORk9fVFg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUl9TRUNfU1VNX1RIUkVTSDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSX1NFQ19TVU1fV0lOOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfUEVSSU9EX1RIUkVTSDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1BFUklPRF9XSU46CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9TRUNTX1RIUkVTSDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1NFQ1NfV0lOOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfU1lNX1BFUklPRF9FVkVOVDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX1NZTV9QRVJJT0RfVEhSRVNIOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfU1lNX1BFUklPRF9XSU46CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0ZMQUdTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT09QX1JYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT09QX1RYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9NT0RFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9PUkdfU1BFQ0lGSUNfUlg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX09SR19TUEVDSUZJQ19UWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUERVX1JYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9QRFVfVFg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9DT05GSUc6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfUEVSSU9EX0VWRU5UOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1BFUklPRF9USFJFU0g6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfUEVSSU9EX1dJTjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9TRUNTX0VWRU5UOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1NFQ1NfVEhSRVNIOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1NFQ1NfV0lOOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRkxBR1M6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9NQUNfQUREUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX1BEVV9DT05GSUc6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9TVEFURToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX1ZFTkRPUl9ERVZJQ0U6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9WRU5ET1JfT1VJOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfVkVORE9SX1ZFUlNJT046CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1VOSVFVRV9FVkVOVF9SWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVU5TVVBQT1JURURfT1BDT0RFUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVkFSX1JFUV9SWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVkFSX1JFUV9UWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVkFSX1JFU1BfUlg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1ZBUl9SRVNQX1RYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9JRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfTUlJX0RFVEVDVDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfU1FFX1RFU1RfRVJSOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9UWVBFX0xJU1Q6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9BRE1JTl9TVEFURToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0FMSUdOX0VSUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0FVVE9fUEFSVF9TVEFURToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0FVVE9fUEFSVElUSU9OUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0JVUlNUUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0NPTExJU0lPTlM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9EQVRBX1JBVEVfTUlTTUFUQ0hFUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0ZDU19FUlI6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9GUkFNRVNfVE9PX0xPTkc6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9JRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0lTT0xBVEVTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfTEFTVF9TT1VSQ0VfQUREUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0xBVEVfRVZFTlRTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfUkVBREFCTEVfRlJBTUVTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfUkVBREFCTEVfT0NURVRTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfUlVOVFM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9TSE9SVF9FVkVOVFM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9TT1VSQ0VfQUREUl9DSEFOR0VTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfU1lNX0VSUl9EVVJJTkdfUEtUOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfVkVSWV9MT05HX0VWRU5UUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfR1JPVVBfQ0FQQUNJVFk6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0dST1VQX01BUDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfSEVBTFRIX0RBVEE6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0hFQUxUSF9TVEFURToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfSEVBTFRIX1RFWFQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0lEOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9UWF9DT0xMSVNJT05TOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9UWVBFOgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNvdW50OworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdHRyaWJ1dGVfdmFsdWVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9zdGRfYXR0cmlidXRlX3ZhbHVlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2F0dHJpYnV0ZV91bnBhY2soJnRoaXMtPmxlYWYsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+d2lkdGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT53aWR0aCA+PSAweDAwODApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPndpZHRoLCBidWYtPmN1cnIpOworICAgIHN3aXRjaCAodGhpcy0+bGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTh2YWx1ZV91bnBhY2soJnRoaXMtPnUubWFjX2lkLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUkFNRVNfVFhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1hY19mcmFtZXNfdHhfb2sudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX1NJTkdMRV9DT0xMX0ZSQU1FUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soJnRoaXMtPnUubWFjX3NpbmdsZV9jb2xsX2ZyYW1lcy52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTVVMVElQTEVfQ09MTF9GUkFNRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1hY19tdWx0aXBsZV9jb2xsX2ZyYW1lcy52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX1JYX09LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3VucGFjaygmdGhpcy0+dS5tYWNfZnJhbWVzX3J4X29rLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GQ1NfRVJSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3VucGFjaygmdGhpcy0+dS5tYWNfZmNzX2Vyci52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQUxJR05fRVJSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3VucGFjaygmdGhpcy0+dS5tYWNfYWxpZ25fZXJyLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19PQ1RFVFNfVFhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1hY19vY3RldHNfdHhfb2sudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FU19ERUZFUlJFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91OHZhbHVlX3VucGFjaygmdGhpcy0+dS5tYWNfZnJhbWVzX2RlZmVycmVkLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19MQVRFX0NPTExJU0lPTlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1hY19sYXRlX2NvbGxpc2lvbnMudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0VYQ0VTU0lWRV9DT0xMSVNJT05TOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3VucGFjaygmdGhpcy0+dS5tYWNfZXhjZXNzaXZlX2NvbGxpc2lvbnMudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FU19MT1NUX01BQ19UWF9FUlI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1hY19mcmFtZXNfbG9zdF9tYWNfdHhfZXJyLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DQVJSSUVSX1NFTlNFX0VSUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91OHZhbHVlX3VucGFjaygmdGhpcy0+dS5tYWNfY2Fycmllcl9zZW5zZV9lcnIudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX09DVEVUU19SWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soJnRoaXMtPnUubWFjX29jdGV0c19yeF9vay52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX0xPU1RfTUFDX1JYX0VSUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soJnRoaXMtPnUubWFjX2ZyYW1lc19sb3N0X21hY19yeF9lcnIudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX01DQVNUX0ZSQU1FU19UWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soJnRoaXMtPnUubWFjX21jYXN0X2ZyYW1lc190eF9vay52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQkNBU1RfRlJBTUVTX1RYX09LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3VucGFjaygmdGhpcy0+dS5tYWNfYmNhc3RfZnJhbWVzX3R4X29rLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUl9FWENFU1NJVkVfREVGRVJSQUw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTh2YWx1ZV91bnBhY2soJnRoaXMtPnUubWFjX2ZyX2V4Y2Vzc2l2ZV9kZWZlcnJhbC52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTUNBU1RfRlJBTUVTX1JYX09LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3VucGFjaygmdGhpcy0+dS5tYWNfbWNhc3RfZnJhbWVzX3J4X29rLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19CQ0FTVF9GUkFNRVNfUlhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1hY19iY2FzdF9mcmFtZXNfcnhfb2sudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0lOX1JBTkdFX0xFTl9FUlI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1hY19pbl9yYW5nZV9sZW5fZXJyLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19PVVRfT0ZfUkFOR0VfTEVOX0VSUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soJnRoaXMtPnUubWFjX291dF9vZl9yYW5nZV9sZW5fZXJyLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUkFNRV9UT09fTE9ORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soJnRoaXMtPnUubWFjX2ZyYW1lX3Rvb19sb25nLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19FTkFCTEVfU1RBVFVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm1hY19lbmFibGVfc3RhdHVzLnN0YXR1cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQUREUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9tYWNfYWRkcmVzcygmcG9zdExlbkJ1ZiwgJnRoaXMtPnUubWFjX2FkZHIubWFjX2FkZHJlc3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX1RZUEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fc3RkX3BoeV90eXBlX3VucGFjaygmdGhpcy0+dS5waHlfdHlwZS50eXBlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfU1lNQk9MX0VSUl9EVVJJTkdfQ0FSUklFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soJnRoaXMtPnUucGh5X3N5bWJvbF9lcnJfZHVyaW5nX2NhcnJpZXIudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX0FETUlOX1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9zdGF0ZV91bnBhY2soJnRoaXMtPnUucGh5X2FkbWluX3N0YXRlLnN0YXRlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfTUVESUFfQVZBSUw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbWF1X21lZGlhX2F2YWlsYWJsZV91bnBhY2soJnRoaXMtPnUubWF1X21lZGlhX2F2YWlsLnZhbHVlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19JRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91OHZhbHVlX3VucGFjaygmdGhpcy0+dS5hdXRvX25lZ19pZC52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19BRE1JTl9TVEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9hdXRvbmVnb3RpYXRlX2FkbWluX3N0YXRlX3VucGFjaygmdGhpcy0+dS5hdXRvX25lZ19hZG1pbl9zdGF0ZS52YWx1ZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfUkVNT1RFX1NJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9hdXRvX3JlbW90ZV9zaWdfdW5wYWNrKCZ0aGlzLT51LmF1dG9fbmVnX3JlbW90ZV9zaWcudmFsdWUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0FVVE9fQ0ZHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2F1dG9fbmVnb3RpYXRpb25fYXV0b19jb25maWdfdW5wYWNrKCZ0aGlzLT51LmF1dG9fbmVnX2F1dG9fY2ZnLnZhbHVlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19MT0NBTF9URUNIX0FCSUxJVFk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTA7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5hdXRvX25lZ19sb2NhbF90ZWNoX2FiaWxpdHkuY2FwYWJpbGl0aWVzX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdHRyaWJ1dGVfdmFsdWVfYXV0b19uZWdfbG9jYWxfdGVjaF9hYmlsaXR5X2NvdW50X2NhcGFiaWxpdGllcygmcG9zdExlbkJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmF1dG9fbmVnX2xvY2FsX3RlY2hfYWJpbGl0eS5jYXBhYmlsaXRpZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5hdXRvX25lZ19sb2NhbF90ZWNoX2FiaWxpdHkuY2FwYWJpbGl0aWVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY2FwYWJpbGl0aWVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdHRyaWJ1dGVfdmFsdWVfYXV0b19uZWdfbG9jYWxfdGVjaF9hYmlsaXR5XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuYXV0b19uZWdfbG9jYWxfdGVjaF9hYmlsaXR5LmNhcGFiaWxpdGllcyA9IChiY21vbHRfZXBvbl9vYW1fc3RkX2F1dG9fbmVnb2l0YXRpb25fY2FwYWJpbGl0eSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5hdXRvX25lZ19sb2NhbF90ZWNoX2FiaWxpdHkuY2FwYWJpbGl0aWVzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9zdGRfYXV0b19uZWdvaXRhdGlvbl9jYXBhYmlsaXR5KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmF1dG9fbmVnX2xvY2FsX3RlY2hfYWJpbGl0eS5jYXBhYmlsaXRpZXNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9zdGRfYXV0b19uZWdvaXRhdGlvbl9jYXBhYmlsaXR5X3VucGFjaygmdGhpcy0+dS5hdXRvX25lZ19sb2NhbF90ZWNoX2FiaWxpdHkuY2FwYWJpbGl0aWVzW2kwXSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0FEVkVSVElTRURfVEVDSF9BQklMSVRZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxOworICAgICAgICAgICAgICAgIHRoaXMtPnUuYXV0b19uZWdfYWR2ZXJ0aXNlZF90ZWNoX2FiaWxpdHkuY2FwYWJpbGl0aWVzX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdHRyaWJ1dGVfdmFsdWVfYXV0b19uZWdfYWR2ZXJ0aXNlZF90ZWNoX2FiaWxpdHlfY291bnRfY2FwYWJpbGl0aWVzKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuYXV0b19uZWdfYWR2ZXJ0aXNlZF90ZWNoX2FiaWxpdHkuY2FwYWJpbGl0aWVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuYXV0b19uZWdfYWR2ZXJ0aXNlZF90ZWNoX2FiaWxpdHkuY2FwYWJpbGl0aWVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY2FwYWJpbGl0aWVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdHRyaWJ1dGVfdmFsdWVfYXV0b19uZWdfYWR2ZXJ0aXNlZF90ZWNoX2FiaWxpdHlcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5hdXRvX25lZ19hZHZlcnRpc2VkX3RlY2hfYWJpbGl0eS5jYXBhYmlsaXRpZXMgPSAoYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdXRvX25lZ29pdGF0aW9uX2NhcGFiaWxpdHkgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuYXV0b19uZWdfYWR2ZXJ0aXNlZF90ZWNoX2FiaWxpdHkuY2FwYWJpbGl0aWVzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9zdGRfYXV0b19uZWdvaXRhdGlvbl9jYXBhYmlsaXR5KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LmF1dG9fbmVnX2FkdmVydGlzZWRfdGVjaF9hYmlsaXR5LmNhcGFiaWxpdGllc19jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdXRvX25lZ29pdGF0aW9uX2NhcGFiaWxpdHlfdW5wYWNrKCZ0aGlzLT51LmF1dG9fbmVnX2FkdmVydGlzZWRfdGVjaF9hYmlsaXR5LmNhcGFiaWxpdGllc1tpMV0sICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19SWF9URUNIOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkyOworICAgICAgICAgICAgICAgIHRoaXMtPnUuYXV0b19uZWdfcnhfdGVjaC5jYXBhYmlsaXRpZXNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fc3RkX2F0dHJpYnV0ZV92YWx1ZV9hdXRvX25lZ19yeF90ZWNoX2NvdW50X2NhcGFiaWxpdGllcygmcG9zdExlbkJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmF1dG9fbmVnX3J4X3RlY2guY2FwYWJpbGl0aWVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuYXV0b19uZWdfcnhfdGVjaC5jYXBhYmlsaXRpZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjYXBhYmlsaXRpZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fc3RkX2F0dHJpYnV0ZV92YWx1ZV9hdXRvX25lZ19yeF90ZWNoXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuYXV0b19uZWdfcnhfdGVjaC5jYXBhYmlsaXRpZXMgPSAoYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdXRvX25lZ29pdGF0aW9uX2NhcGFiaWxpdHkgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuYXV0b19uZWdfcnhfdGVjaC5jYXBhYmlsaXRpZXNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdXRvX25lZ29pdGF0aW9uX2NhcGFiaWxpdHkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUuYXV0b19uZWdfcnhfdGVjaC5jYXBhYmlsaXRpZXNfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9zdGRfYXV0b19uZWdvaXRhdGlvbl9jYXBhYmlsaXR5X3VucGFjaygmdGhpcy0+dS5hdXRvX25lZ19yeF90ZWNoLmNhcGFiaWxpdGllc1tpMl0sICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19MT0NBTF9TRUxFQ1RfQUJMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9hdXRvX3NlbGVjdG9yX3VucGFjaygmdGhpcy0+dS5hdXRvX25lZ19sb2NhbF9zZWxlY3RfYWJsZS52YWx1ZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfQURfU0VMRUNUX0FCTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYXV0b19zZWxlY3Rvcl91bnBhY2soJnRoaXMtPnUuYXV0b19uZWdfYWRfc2VsZWN0X2FibGUudmFsdWUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX1JYX1NFTEVDVF9BQkxFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2F1dG9fc2VsZWN0b3JfdW5wYWNrKCZ0aGlzLT51LmF1dG9fbmVnX3J4X3NlbGVjdF9hYmxlLnZhbHVlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRFVQTEVYX1NUQVRVUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9tYWNfZHVwbGV4X3N0YXR1c191bnBhY2soJnRoaXMtPnUubWFjX2R1cGxleF9zdGF0dXMudmFsdWUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX0ZVTkNTX1NVUFBPUlRFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMzsKKyAgICAgICAgICAgICAgICB0aGlzLT51Lm1hY19jdHJsX2Z1bmNzX3N1cHBvcnRlZC5mdW5jdGlvbnNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fc3RkX2F0dHJpYnV0ZV92YWx1ZV9tYWNfY3RybF9mdW5jc19zdXBwb3J0ZWRfY291bnRfZnVuY3Rpb25zKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUubWFjX2N0cmxfZnVuY3Nfc3VwcG9ydGVkLmZ1bmN0aW9uc19jb3VudCA+IDApICYmICh0aGlzLT51Lm1hY19jdHJsX2Z1bmNzX3N1cHBvcnRlZC5mdW5jdGlvbnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJmdW5jdGlvbnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fc3RkX2F0dHJpYnV0ZV92YWx1ZV9tYWNfY3RybF9mdW5jc19zdXBwb3J0ZWRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5tYWNfY3RybF9mdW5jc19zdXBwb3J0ZWQuZnVuY3Rpb25zID0gKHVpbnQxNl90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51Lm1hY19jdHJsX2Z1bmNzX3N1cHBvcnRlZC5mdW5jdGlvbnNfY291bnQgKiBzaXplb2YodWludDE2X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IHRoaXMtPnUubWFjX2N0cmxfZnVuY3Nfc3VwcG9ydGVkLmZ1bmN0aW9uc19jb3VudDsgaTMrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUubWFjX2N0cmxfZnVuY3Nfc3VwcG9ydGVkLmZ1bmN0aW9uc1tpM10pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX0ZSQU1FU19UWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soJnRoaXMtPnUubWFjX2N0cmxfZnJhbWVzX3R4LnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX0ZSQU1FU19SWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soJnRoaXMtPnUubWFjX2N0cmxfZnJhbWVzX3J4LnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX1VOU1VQUE9SVEVEX09QX1JYOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3VucGFjaygmdGhpcy0+dS5tYWNfY3RybF91bnN1cHBvcnRlZF9vcF9yeC52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9QQVVTRV9ERUxBWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soJnRoaXMtPnUubWFjX2N0cmxfcGF1c2VfZGVsYXkudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfUEFVU0VfVFg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1hY19jdHJsX3BhdXNlX3R4LnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX1BBVVNFX1JYOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3VucGFjaygmdGhpcy0+dS5tYWNfY3RybF9wYXVzZV9yeC52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1NFQ1NfRVZFTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm9hbV9sb2NhbF9lcnJfZnJhbWVfc2Vjc19ldmVudC52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1BFUklPRF9FVkVOVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soJnRoaXMtPnUub2FtX2xvY2FsX2Vycl9mcmFtZV9wZXJpb2RfZXZlbnQudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUl9TRUNfU1VNX0VWRU5UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3VucGFjaygmdGhpcy0+dS5vYW1fbG9jYWxfZXJyX2ZyX3NlY19zdW1fZXZlbnQudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0VNVUxfQ1JDOEVSUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soJnRoaXMtPnUub2FtX2VtdWxfY3JjOGVyci52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX01BQ19DVFJMX0ZSQU1FU19UWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soJnRoaXMtPnUubXBjcF9tYWNfY3RybF9mcmFtZXNfdHgudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9NQUNfQ1RSTF9GUkFNRVNfUlg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1wY3BfbWFjX2N0cmxfZnJhbWVzX3J4LnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfRElTQ09WRVJZX1dJTkRPV19UWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soJnRoaXMtPnUubXBjcF9kaXNjb3Zlcnlfd2luZG93X3R4LnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfRElTQ09WRVJZX1RJTUVPVVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1wY3BfZGlzY292ZXJ5X3RpbWVvdXQudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfRkVDX0NPUlJFQ1RFRF9CTE9DS1M6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5mZWNfY29ycmVjdGVkX2Jsb2Nrcy52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9GRUNfVU5DT1JSRUNUQUJMRV9CTE9DS1M6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5mZWNfdW5jb3JyZWN0YWJsZV9ibG9ja3MudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfRkVDX0FCSUxJVFk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZmVjX3N1cHBvcnRfdW5wYWNrKCZ0aGlzLT51LmZlY19hYmlsaXR5LnZhbHVlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9GRUNfTU9ERToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9zdGRfZmVjX21vZGVfdW5wYWNrKCZ0aGlzLT51LmZlY19tb2RlLnZhbHVlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1RYX0dBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1wY3BfdHhfZ2F0ZS52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1RYX1JFR19BQ0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1wY3BfdHhfcmVnX2Fjay52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1RYX1JFR0lTVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3VucGFjaygmdGhpcy0+dS5tcGNwX3R4X3JlZ2lzdGVyLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfVFhfUkVHX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1wY3BfdHhfcmVnX3JlcXVlc3QudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9SRVBPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1wY3BfdHhfcmVwb3J0LnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfUlhfR0FURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soJnRoaXMtPnUubXBjcF9yeF9nYXRlLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfUlhfUkVHX0FDSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soJnRoaXMtPnUubXBjcF9yeF9yZWdfYWNrLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfUlhfUkVHSVNURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWVfdW5wYWNrKCZ0aGlzLT51Lm1wY3BfcnhfcmVnaXN0ZXIudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9SWF9SRUdfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soJnRoaXMtPnUubXBjcF9yeF9yZWdfcmVxdWVzdC52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX1JFUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV91bnBhY2soJnRoaXMtPnUubXBjcF9yeF9yZXBvcnQudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NPTExJU0lPTl9GUkFNRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5tYWNfY29sbGlzaW9uX2ZyYW1lcy52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQUNUT1JfQURNSU5fS0VZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FDVE9SX09QRVJfS0VZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FDVE9SX1NZU19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BQ1RPUl9TWVNfUFJJOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FETUlOX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FHR19PUl9JTkRJVklEVUFMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0JDQVNUX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0JDQVNUX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0NPTExFQ1RPUl9NQVhfREVMQVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfREFUQV9SQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0RFU0M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfRlJBTUVTX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0ZSQU1FU19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19MSU5LX1VQX0RPV05fTk9USUZZX0VOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX01BQ19BRERSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX01DQVNUX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX01DQVNUX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX05BTUU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfT1BFUl9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19QQVJUTkVSX09QRVJfS0VZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1BBUlRORVJfU1lTX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1BBUlRORVJfU1lTX1BSSToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19QT1JUX0xJU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUlhfRElTQ0FSRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19SWF9FUlJfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1JYX09DVEVUUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19USU1FX09GX0xBU1RfT1BFUl9DSEFOR0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfVFhfRElTQ0FSRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19UWF9FUlJfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1RYX09DVEVUUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19VTktfUFJPVE9DT0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9HUk9VUF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0dST1VQX1BPUlRfQ0FQQUNJVFk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9HUk9VUF9QT1JUX01BUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DQVBBQklMSVRJRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NQ0FTVF9BRERSX0xJU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTUNBU1RfUlhfU1RBVFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX1BST01JU0NVT1VTX1NUQVRVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19UWF9FTkFCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfQURNSU5fU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfQkFORF9TUExJVF9GUkVROgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0JBTkRfU1BMSVRfVFlQRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9GQUxTRV9DQVJSSUVSUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9JRExFX0VSUk9SX0NPVU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0pBQkJFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9MT1NFX01FRElBX0NUUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9UWVBFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX1RZUEVfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9BRE1JTl9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9EVVBfRVZFTlRfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRU1VTF9CQURfTExJRF9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRU1VTF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9FTVVMX1NQRF9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRVZFTlRfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRlJBTUVTX0xPU1RfT0FNX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9JTkZPX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0lORk9fVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSX1NFQ19TVU1fVEhSRVNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUl9TRUNfU1VNX1dJTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfUEVSSU9EX1RIUkVTSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfUEVSSU9EX1dJTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfU0VDU19USFJFU0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1NFQ1NfV0lOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9TWU1fUEVSSU9EX0VWRU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9TWU1fUEVSSU9EX1RIUkVTSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfU1lNX1BFUklPRF9XSU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRkxBR1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9PUF9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT09QX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX01PREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fT1JHX1NQRUNJRklDX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX09SR19TUEVDSUZJQ19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9QRFVfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUERVX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9QRVJJT0RfRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9QRVJJT0RfVEhSRVNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfUEVSSU9EX1dJTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1NFQ1NfRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9TRUNTX1RIUkVTSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1NFQ1NfV0lOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9GTEFHUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfTUFDX0FERFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX1BEVV9DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9WRU5ET1JfREVWSUNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9WRU5ET1JfT1VJOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9WRU5ET1JfVkVSU0lPTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9VTklRVUVfRVZFTlRfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVU5TVVBQT1JURURfT1BDT0RFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9WQVJfUkVRX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1ZBUl9SRVFfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVkFSX1JFU1BfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVkFSX1JFU1BfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfTUlJX0RFVEVDVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9TUUVfVEVTVF9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfVFlQRV9MSVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9BRE1JTl9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQUxJR05fRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9BVVRPX1BBUlRfU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0FVVE9fUEFSVElUSU9OUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQlVSU1RTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9DT0xMSVNJT05TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9EQVRBX1JBVEVfTUlTTUFUQ0hFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfRkNTX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfRlJBTUVTX1RPT19MT05HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfSVNPTEFURVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0xBU1RfU09VUkNFX0FERFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0xBVEVfRVZFTlRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9SRUFEQUJMRV9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1JFQURBQkxFX09DVEVUUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfUlVOVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1NIT1JUX0VWRU5UUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfU09VUkNFX0FERFJfQ0hBTkdFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfU1lNX0VSUl9EVVJJTkdfUEtUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9WRVJZX0xPTkdfRVZFTlRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0dST1VQX0NBUEFDSVRZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0dST1VQX01BUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9IRUFMVEhfREFUQToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9IRUFMVEhfU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfSEVBTFRIX1RFWFQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfVFhfQ09MTElTSU9OUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9UWVBFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+d2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT53aWR0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zdGRfYXR0cmlidXRlX3ZhbHVlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hdHRyaWJ1dGUgbGVhZjsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDhfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlX3VucGFjaygmbGVhZiwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAobGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FU19UWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfU0lOR0xFX0NPTExfRlJBTUVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NVUxUSVBMRV9DT0xMX0ZSQU1FUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX1JYX09LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GQ1NfRVJSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19BTElHTl9FUlI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX09DVEVUU19UWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX0RFRkVSUkVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19MQVRFX0NPTExJU0lPTlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0VYQ0VTU0lWRV9DT0xMSVNJT05TOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUkFNRVNfTE9TVF9NQUNfVFhfRVJSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DQVJSSUVSX1NFTlNFX0VSUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfT0NURVRTX1JYX09LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUkFNRVNfTE9TVF9NQUNfUlhfRVJSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NQ0FTVF9GUkFNRVNfVFhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0JDQVNUX0ZSQU1FU19UWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJfRVhDRVNTSVZFX0RFRkVSUkFMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NQ0FTVF9GUkFNRVNfUlhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0JDQVNUX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfSU5fUkFOR0VfTEVOX0VSUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfT1VUX09GX1JBTkdFX0xFTl9FUlI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FX1RPT19MT05HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19FTkFCTEVfU1RBVFVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19BRERSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9UWVBFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9TWU1CT0xfRVJSX0RVUklOR19DQVJSSUVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9BRE1JTl9TVEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfTUVESUFfQVZBSUw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfQURNSU5fU1RBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQVVUT19ORUdfUkVNT1RFX1NJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19BVVRPX0NGRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19MT0NBTF9URUNIX0FCSUxJVFk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgY2FwYWJpbGl0aWVzX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdGllc19lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKGNhcGFiaWxpdGllc19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9zdGRfYXV0b19uZWdvaXRhdGlvbl9jYXBhYmlsaXR5KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0FEVkVSVElTRURfVEVDSF9BQklMSVRZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGNhcGFiaWxpdGllc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjYXBhYmlsaXRpZXNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChjYXBhYmlsaXRpZXNfZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fc3RkX2F1dG9fbmVnb2l0YXRpb25fY2FwYWJpbGl0eSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19SWF9URUNIOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGNhcGFiaWxpdGllc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjYXBhYmlsaXRpZXNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChjYXBhYmlsaXRpZXNfZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fc3RkX2F1dG9fbmVnb2l0YXRpb25fY2FwYWJpbGl0eSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19MT0NBTF9TRUxFQ1RfQUJMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19BRF9TRUxFQ1RfQUJMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19SWF9TRUxFQ1RfQUJMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRFVQTEVYX1NUQVRVUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9GVU5DU19TVVBQT1JURUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgZnVuY3Rpb25zX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uc19lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKGZ1bmN0aW9uc19lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX0ZSQU1FU19UWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9GUkFNRVNfUlg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfVU5TVVBQT1JURURfT1BfUlg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfUEFVU0VfREVMQVk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfUEFVU0VfVFg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfUEFVU0VfUlg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9TRUNTX0VWRU5UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfUEVSSU9EX0VWRU5UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJfU0VDX1NVTV9FVkVOVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRU1VTF9DUkM4RVJSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfTUFDX0NUUkxfRlJBTUVTX1RYOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfTUFDX0NUUkxfRlJBTUVTX1JYOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfRElTQ09WRVJZX1dJTkRPV19UWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX0RJU0NPVkVSWV9USU1FT1VUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0ZFQ19DT1JSRUNURURfQkxPQ0tTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0ZFQ19VTkNPUlJFQ1RBQkxFX0JMT0NLUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9GRUNfQUJJTElUWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9GRUNfTU9ERToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1RYX0dBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9SRUdfQUNLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfVFhfUkVHSVNURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9SRUdfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1RYX1JFUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX0dBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9SWF9SRUdfQUNLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfUlhfUkVHSVNURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9SWF9SRUdfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX1JFUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ09MTElTSU9OX0ZSQU1FUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQUNUT1JfQURNSU5fS0VZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FDVE9SX09QRVJfS0VZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FDVE9SX1NZU19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BQ1RPUl9TWVNfUFJJOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FETUlOX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FHR19PUl9JTkRJVklEVUFMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0JDQVNUX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0JDQVNUX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0NPTExFQ1RPUl9NQVhfREVMQVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfREFUQV9SQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0RFU0M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfRlJBTUVTX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0ZSQU1FU19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19MSU5LX1VQX0RPV05fTk9USUZZX0VOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX01BQ19BRERSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX01DQVNUX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX01DQVNUX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX05BTUU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfT1BFUl9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19QQVJUTkVSX09QRVJfS0VZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1BBUlRORVJfU1lTX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1BBUlRORVJfU1lTX1BSSToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19QT1JUX0xJU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUlhfRElTQ0FSRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19SWF9FUlJfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1JYX09DVEVUUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19USU1FX09GX0xBU1RfT1BFUl9DSEFOR0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfVFhfRElTQ0FSRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19UWF9FUlJfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1RYX09DVEVUUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19VTktfUFJPVE9DT0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9HUk9VUF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0dST1VQX1BPUlRfQ0FQQUNJVFk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9HUk9VUF9QT1JUX01BUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DQVBBQklMSVRJRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NQ0FTVF9BRERSX0xJU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTUNBU1RfUlhfU1RBVFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX1BST01JU0NVT1VTX1NUQVRVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19UWF9FTkFCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfQURNSU5fU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfQkFORF9TUExJVF9GUkVROgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0JBTkRfU1BMSVRfVFlQRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9GQUxTRV9DQVJSSUVSUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9JRExFX0VSUk9SX0NPVU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0pBQkJFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9MT1NFX01FRElBX0NUUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9UWVBFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX1RZUEVfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9BRE1JTl9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9EVVBfRVZFTlRfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRU1VTF9CQURfTExJRF9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRU1VTF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9FTVVMX1NQRF9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRVZFTlRfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRlJBTUVTX0xPU1RfT0FNX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9JTkZPX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0lORk9fVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSX1NFQ19TVU1fVEhSRVNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUl9TRUNfU1VNX1dJTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfUEVSSU9EX1RIUkVTSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfUEVSSU9EX1dJTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfU0VDU19USFJFU0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1NFQ1NfV0lOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9TWU1fUEVSSU9EX0VWRU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9TWU1fUEVSSU9EX1RIUkVTSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfU1lNX1BFUklPRF9XSU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRkxBR1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9PUF9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT09QX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX01PREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fT1JHX1NQRUNJRklDX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX09SR19TUEVDSUZJQ19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9QRFVfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUERVX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9QRVJJT0RfRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9QRVJJT0RfVEhSRVNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfUEVSSU9EX1dJTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1NFQ1NfRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9TRUNTX1RIUkVTSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1NFQ1NfV0lOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9GTEFHUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfTUFDX0FERFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX1BEVV9DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9WRU5ET1JfREVWSUNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9WRU5ET1JfT1VJOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9WRU5ET1JfVkVSU0lPTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9VTklRVUVfRVZFTlRfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVU5TVVBQT1JURURfT1BDT0RFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9WQVJfUkVRX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1ZBUl9SRVFfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVkFSX1JFU1BfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVkFSX1JFU1BfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfTUlJX0RFVEVDVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9TUUVfVEVTVF9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfVFlQRV9MSVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9BRE1JTl9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQUxJR05fRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9BVVRPX1BBUlRfU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0FVVE9fUEFSVElUSU9OUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQlVSU1RTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9DT0xMSVNJT05TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9EQVRBX1JBVEVfTUlTTUFUQ0hFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfRkNTX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfRlJBTUVTX1RPT19MT05HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfSVNPTEFURVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0xBU1RfU09VUkNFX0FERFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0xBVEVfRVZFTlRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9SRUFEQUJMRV9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1JFQURBQkxFX09DVEVUUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfUlVOVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1NIT1JUX0VWRU5UUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfU09VUkNFX0FERFJfQ0hBTkdFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfU1lNX0VSUl9EVVJJTkdfUEtUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9WRVJZX0xPTkdfRVZFTlRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0dST1VQX0NBUEFDSVRZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0dST1VQX01BUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9IRUFMVEhfREFUQToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9IRUFMVEhfU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfSEVBTFRIX1RFWFQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfVFhfQ09MTElTSU9OUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9UWVBFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9zdGRfYXR0cmlidXRlX3ZhbHVlX2F1dG9fbmVnX2xvY2FsX3RlY2hfYWJpbGl0eV9jb3VudF9jYXBhYmlsaXRpZXMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdHRyaWJ1dGVfdmFsdWVfYXV0b19uZWdfYWR2ZXJ0aXNlZF90ZWNoX2FiaWxpdHlfY291bnRfY2FwYWJpbGl0aWVzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9zdGRfYXR0cmlidXRlX3ZhbHVlX2F1dG9fbmVnX3J4X3RlY2hfY291bnRfY2FwYWJpbGl0aWVzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9zdGRfYXR0cmlidXRlX3ZhbHVlX21hY19jdHJsX2Z1bmNzX3N1cHBvcnRlZF9jb3VudF9mdW5jdGlvbnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc3RkX2FjdGlvbl92YWx1ZV9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3N0ZF9hY3Rpb25fdmFsdWVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hY3Rpb25fcGFjayh0aGlzLT5sZWFmLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT53aWR0aCA+PSAweDAwODApCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+d2lkdGgpOworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fQVVUT19BRE1JTl9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fQVVUT19SRU5FR09USUFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BQ19BRERfR1JPVVBfQUREUkVTUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BQ19ERUxfR1JPVVBfQUREUkVTUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BQ19JTklUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fTUFDX1NFTEZfVEVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BVV9BRE1JTl9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fTUFVX1JFU0VUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fUEhZX0FETUlOX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9QT1JUX0FETUlOX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9SUFRfSU5fU0VSVklDRV9URVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fUlBUX1JFU0VUOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3N0ZF9hY3Rpb25fdmFsdWVfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3N0ZF9hY3Rpb25fdmFsdWVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hY3Rpb25fdW5wYWNrKCZ0aGlzLT5sZWFmLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPndpZHRoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+d2lkdGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+d2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fQVVUT19BRE1JTl9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fQVVUT19SRU5FR09USUFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BQ19BRERfR1JPVVBfQUREUkVTUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BQ19ERUxfR1JPVVBfQUREUkVTUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BQ19JTklUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fTUFDX1NFTEZfVEVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BVV9BRE1JTl9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fTUFVX1JFU0VUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fUEhZX0FETUlOX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9QT1JUX0FETUlOX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9SUFRfSU5fU0VSVklDRV9URVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fUlBUX1JFU0VUOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+d2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT53aWR0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zdGRfYWN0aW9uX3ZhbHVlX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9icmFuY2hfcGFjayh0aGlzLT5icmFuY2gsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5icmFuY2gpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9PQkpFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlX3BhY2soJnRoaXMtPnUub2JqZWN0Lm9iamVjdF9jb250ZXh0LCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9TVEFOREFSRF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fc3RkX2F0dHJpYnV0ZV92YWx1ZV9wYWNrKCZ0aGlzLT51LnN0YW5kYXJkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX1NUQU5EQVJEX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9zdGRfYWN0aW9uX3ZhbHVlX2Jhc2VfcGFjaygmdGhpcy0+dS5zdGFuZGFyZF9hY3Rpb24uYWN0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9wYWNrKCZ0aGlzLT51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VYVEVOREVEX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2FjdGlvbl92YWx1ZV9iYXNlX3BhY2soJnRoaXMtPnUuZXh0ZW5kZWRfYWN0aW9uLmFjdGlvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCA+IDApICYmICh0aGlzLT51LmVuZC51bmtub3duID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVua25vd25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2VfZW5kXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZW5kLnVua25vd24sIHRoaXMtPnUuZW5kLnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9QUk9HUkFNTUFCTEVfQ09VTlRFUjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZGVmLmxlYWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmRlZi53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5kZWYud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgc3dpdGNoICh0aGlzLT5icmFuY2gpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9PQkpFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5vYmplY3Qub2JqZWN0X2NvbnRleHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX1NUQU5EQVJEX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fc3RkX2F0dHJpYnV0ZV92YWx1ZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5zdGFuZGFyZF9hdHRyaWJ1dGUuYXR0cmlidXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9TVEFOREFSRF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRVhURU5ERURfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9kcG9lX2FjdGlvbl92YWx1ZV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmV4dGVuZGVkX2FjdGlvbi5hY3Rpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSB0aGlzLT51LmVuZC51bmtub3duX2NvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX1BST0dSQU1NQUJMRV9DT1VOVEVSOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9icmFuY2hfdW5wYWNrKCZ0aGlzLT5icmFuY2gsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5icmFuY2gpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9PQkpFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlX3VucGFjaygmdGhpcy0+dS5vYmplY3Qub2JqZWN0X2NvbnRleHQsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfU1RBTkRBUkRfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdHRyaWJ1dGVfdmFsdWVfdW5wYWNrKCZ0aGlzLT51LnN0YW5kYXJkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfU1RBTkRBUkRfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3N0ZF9hY3Rpb25fdmFsdWVfYmFzZV91bnBhY2soJnRoaXMtPnUuc3RhbmRhcmRfYWN0aW9uLmFjdGlvbiwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV91bnBhY2soJnRoaXMtPnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9hY3Rpb25fdmFsdWVfYmFzZV91bnBhY2soJnRoaXMtPnUuZXh0ZW5kZWRfYWN0aW9uLmFjdGlvbiwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZV9lbmRfY291bnRfdW5rbm93bihidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCA+IDApICYmICh0aGlzLT51LmVuZC51bmtub3duID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidW5rbm93blwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZV9lbmRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5lbmQudW5rbm93biA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmVuZC51bmtub3duX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5lbmQudW5rbm93biwgdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX1BST0dSQU1NQUJMRV9DT1VOVEVSOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5kZWYubGVhZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5kZWYud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmRlZi53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LmRlZi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuZGVmLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUuZGVmLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5kZWYud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYnJhbmNoIGJyYW5jaDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2JyYW5jaF91bnBhY2soJmJyYW5jaCwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX09CSkVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2Vfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX1NUQU5EQVJEX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9zdGRfYXR0cmlidXRlX3ZhbHVlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9TVEFOREFSRF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRVhURU5ERURfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VYVEVOREVEX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2FjdGlvbl92YWx1ZV9iYXNlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdW5rbm93bl9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bl9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHVua25vd25fZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfUFJPR1JBTU1BQkxFX0NPVU5URVI6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlX2VuZF9jb3VudF91bmtub3duKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb3Bjb2RlX3BhY2sodGhpcy0+b3AsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vcCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0dFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3JlcXVlc3QudmFycyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YXJzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfZ2V0X3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvcl9wYWNrKCZ0aGlzLT51LmdldF9yZXF1ZXN0LnZhcnNbaTBdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfR0VUX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfcmVzcG9uc2UudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9yZXNwb25zZS52YXJzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV9nZXRfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5nZXRfcmVzcG9uc2UudmFyc19jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlX3BhY2soJnRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNbaTFdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTI7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfcmVxdWVzdC52YXJzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV9zZXRfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCB0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnNfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZV9wYWNrKCZ0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnNbaTJdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU0VUX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkzOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfcmVzcG9uc2UudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9yZXNwb25zZS52YXJzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV9zZXRfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMyA9IDA7IGkzIDwgdGhpcy0+dS5zZXRfcmVzcG9uc2UudmFyc19jb3VudDsgaTMrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlX3BhY2soJnRoaXMtPnUuc2V0X3Jlc3BvbnNlLnZhcnNbaTNdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfTUNBU1RfUkVHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfcmVnX2NvZGVfcGFjayh0aGlzLT51Lm1jYXN0X3JlZy5hY3Rpb25fY29kZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5tY2FzdF9yZWcubXVsdGljYXN0X2xsaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9NQ0FTVF9SRUdfUkVTUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X2N0cmxfcmVzcF9jb2RlX3BhY2sodGhpcy0+dS5tY2FzdF9yZWdfcmVzcC5zdGF0dXMsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUubWNhc3RfcmVnX3Jlc3AubXVsdGljYXN0X2xsaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9LRVlfRVhDSEFOR0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5rZXlfZXhjaGFuZ2Uua2V5X251bWJlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5rZXlfZXhjaGFuZ2Uua2V5X2xlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmtleV9leGNoYW5nZS5rZXlfbGVuZ3RoID4gMCkgJiYgKHRoaXMtPnUua2V5X2V4Y2hhbmdlLmtleV9kYXRhID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImtleV9kYXRhXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2Vfa2V5X2V4Y2hhbmdlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUua2V5X2V4Y2hhbmdlLmtleV9kYXRhLCB0aGlzLT51LmtleV9leGNoYW5nZS5rZXlfbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfRklMRV9UUkFOU0ZFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfYmFzZV9wYWNrKCZ0aGlzLT51LmZpbGVfdHJhbnNmZXIuZmlsZV90cmFuc2ZlciwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfRFlOQU1JQ19JUE1DQVNUX0NUUkw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9jdHJsX2FjdGlvbl9wYWNrKHRoaXMtPnUuZHluYW1pY19pcG1jYXN0X2N0cmwuYWN0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmR5bmFtaWNfaXBtY2FzdF9jdHJsLmxsaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZHluYW1pY19pcG1jYXN0X2N0cmwuaXBzYSwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZHluYW1pY19pcG1jYXN0X2N0cmwuaXBkYSwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPnUuZHluYW1pY19pcG1jYXN0X2N0cmwuY2xpZW50X21hYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0RZTkFNSUNfSVBNQ0FTVF9DVFJMX1JFU1A6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9jdHJsX3Jlc3BfY29kZV9wYWNrKHRoaXMtPnUuZHluYW1pY19pcG1jYXN0X2N0cmxfcmVzcC5yZXN1bHRfY29kZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU1RBVElDX0lQTUNBU1RfQ1RSTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X2N0cmxfYWN0aW9uX3BhY2sodGhpcy0+dS5zdGF0aWNfaXBtY2FzdF9jdHJsLmFjdGlvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5zdGF0aWNfaXBtY2FzdF9jdHJsLmxsaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuc3RhdGljX2lwbWNhc3RfY3RybC5pcHNhLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5zdGF0aWNfaXBtY2FzdF9jdHJsLmlwZGEsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnN0YXRpY19pcG1jYXN0X2N0cmwucG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1NUQVRJQ19JUE1DQVNUX0NUUkxfUkVTUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X2N0cmxfcmVzcF9jb2RlX3BhY2sodGhpcy0+dS5zdGF0aWNfaXBtY2FzdF9jdHJsX3Jlc3AucmVzdWx0X2NvZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1JFU0VSVkVEOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgc3dpdGNoICh0aGlzLT5vcCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0dFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3JlcXVlc3QudmFycyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YXJzX2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmdldF9yZXF1ZXN0LnZhcnNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvcl9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzW2kwXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0dFVF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfcmVzcG9uc2UudmFycyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YXJzX2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LmdldF9yZXNwb25zZS52YXJzX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmdldF9yZXNwb25zZS52YXJzW2kxXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1NFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkyOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfcmVxdWVzdC52YXJzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X3JlcXVlc3QudmFycyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YXJzX2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCB0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnNfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuc2V0X3JlcXVlc3QudmFyc1tpMl0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9TRVRfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTM7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF9yZXNwb25zZS52YXJzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnZhcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc19jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMyA9IDA7IGkzIDwgdGhpcy0+dS5zZXRfcmVzcG9uc2UudmFyc19jb3VudDsgaTMrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5zZXRfcmVzcG9uc2UudmFyc1tpM10pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9NQ0FTVF9SRUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9NQ0FTVF9SRUdfUkVTUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0tFWV9FWENIQU5HRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyICsgdGhpcy0+dS5rZXlfZXhjaGFuZ2Uua2V5X2xlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9GSUxFX1RSQU5TRkVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5maWxlX3RyYW5zZmVyLmZpbGVfdHJhbnNmZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0RZTkFNSUNfSVBNQ0FTVF9DVFJMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDQxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0RZTkFNSUNfSVBNQ0FTVF9DVFJMX1JFU1A6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9TVEFUSUNfSVBNQ0FTVF9DVFJMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDM2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1NUQVRJQ19JUE1DQVNUX0NUUkxfUkVTUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1JFU0VSVkVEOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX29wY29kZV91bnBhY2soJnRoaXMtPm9wLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b3ApCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9HRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMDsKKyAgICAgICAgICAgICAgICB0aGlzLT51LmdldF9yZXF1ZXN0LnZhcnNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV9nZXRfcmVxdWVzdF9jb3VudF92YXJzKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9yZXF1ZXN0LnZhcnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlX2dldF9yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2V0X3JlcXVlc3QudmFycyA9IChiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvciAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9kZXNjcmlwdG9yKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmdldF9yZXF1ZXN0LnZhcnNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9kZXNjcmlwdG9yX3VucGFjaygmdGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzW2kwXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfR0VUX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxOworICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV9nZXRfcmVzcG9uc2VfY291bnRfdmFycyhidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfcmVzcG9uc2UudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9yZXNwb25zZS52YXJzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlX2dldF9yZXNwb25zZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmdldF9yZXNwb25zZS52YXJzID0gKGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZXRfcmVzcG9uc2UudmFyc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2UpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZV91bnBhY2soJnRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNbaTFdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9TRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMjsKKyAgICAgICAgICAgICAgICB0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV9zZXRfcmVxdWVzdF9jb3VudF92YXJzKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfcmVxdWVzdC52YXJzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3NldF9yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuc2V0X3JlcXVlc3QudmFycyA9IChiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2UgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuc2V0X3JlcXVlc3QudmFyc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2UpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUuc2V0X3JlcXVlc3QudmFyc19jb3VudDsgaTIrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlX3VucGFjaygmdGhpcy0+dS5zZXRfcmVxdWVzdC52YXJzW2kyXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU0VUX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkzOworICAgICAgICAgICAgICAgIHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnZhcnNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV9zZXRfcmVzcG9uc2VfY291bnRfdmFycyhidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfcmVzcG9uc2UudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9yZXNwb25zZS52YXJzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3NldF9yZXNwb25zZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnNldF9yZXNwb25zZS52YXJzID0gKGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5zZXRfcmVzcG9uc2UudmFyc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2UpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnZhcnNfY291bnQ7IGkzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZV91bnBhY2soJnRoaXMtPnUuc2V0X3Jlc3BvbnNlLnZhcnNbaTNdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9NQ0FTVF9SRUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9yZWdfY29kZV91bnBhY2soJnRoaXMtPnUubWNhc3RfcmVnLmFjdGlvbl9jb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51Lm1jYXN0X3JlZy5tdWx0aWNhc3RfbGxpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX01DQVNUX1JFR19SRVNQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfY3RybF9yZXNwX2NvZGVfdW5wYWNrKCZ0aGlzLT51Lm1jYXN0X3JlZ19yZXNwLnN0YXR1cywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5tY2FzdF9yZWdfcmVzcC5tdWx0aWNhc3RfbGxpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0tFWV9FWENIQU5HRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmtleV9leGNoYW5nZS5rZXlfbnVtYmVyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmtleV9leGNoYW5nZS5rZXlfbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUua2V5X2V4Y2hhbmdlLmtleV9sZW5ndGggPiAwKSAmJiAodGhpcy0+dS5rZXlfZXhjaGFuZ2Uua2V5X2RhdGEgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJrZXlfZGF0YVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlX2tleV9leGNoYW5nZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmtleV9leGNoYW5nZS5rZXlfZGF0YSA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmtleV9leGNoYW5nZS5rZXlfbGVuZ3RoICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5rZXlfZXhjaGFuZ2Uua2V5X2RhdGEsIHRoaXMtPnUua2V5X2V4Y2hhbmdlLmtleV9sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9GSUxFX1RSQU5TRkVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9iYXNlX3VucGFjaygmdGhpcy0+dS5maWxlX3RyYW5zZmVyLmZpbGVfdHJhbnNmZXIsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfRFlOQU1JQ19JUE1DQVNUX0NUUkw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9jdHJsX2FjdGlvbl91bnBhY2soJnRoaXMtPnUuZHluYW1pY19pcG1jYXN0X2N0cmwuYWN0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmR5bmFtaWNfaXBtY2FzdF9jdHJsLmxsaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5keW5hbWljX2lwbWNhc3RfY3RybC5pcHNhLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LmR5bmFtaWNfaXBtY2FzdF9jdHJsLmlwZGEsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9tYWNfYWRkcmVzcyhidWYsICZ0aGlzLT51LmR5bmFtaWNfaXBtY2FzdF9jdHJsLmNsaWVudF9tYWMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9EWU5BTUlDX0lQTUNBU1RfQ1RSTF9SRVNQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfY3RybF9yZXNwX2NvZGVfdW5wYWNrKCZ0aGlzLT51LmR5bmFtaWNfaXBtY2FzdF9jdHJsX3Jlc3AucmVzdWx0X2NvZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1NUQVRJQ19JUE1DQVNUX0NUUkw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9jdHJsX2FjdGlvbl91bnBhY2soJnRoaXMtPnUuc3RhdGljX2lwbWNhc3RfY3RybC5hY3Rpb24sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuc3RhdGljX2lwbWNhc3RfY3RybC5sbGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuc3RhdGljX2lwbWNhc3RfY3RybC5pcHNhLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LnN0YXRpY19pcG1jYXN0X2N0cmwuaXBkYSwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuc3RhdGljX2lwbWNhc3RfY3RybC5wb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU1RBVElDX0lQTUNBU1RfQ1RSTF9SRVNQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfY3RybF9yZXNwX2NvZGVfdW5wYWNrKCZ0aGlzLT51LnN0YXRpY19pcG1jYXN0X2N0cmxfcmVzcC5yZXN1bHRfY29kZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfUkVTRVJWRUQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb3Bjb2RlIG9wOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb3Bjb2RlX3VucGFjaygmb3AsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChvcCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0dFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhcnNfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9kZXNjcmlwdG9yX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHZhcnNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh2YXJzX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2Rlc2NyaXB0b3IpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9HRVRfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdmFyc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHZhcnNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh2YXJzX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdmFyc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHZhcnNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh2YXJzX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU0VUX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhcnNfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB2YXJzX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodmFyc19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX01DQVNUX1JFRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX01DQVNUX1JFR19SRVNQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfS0VZX0VYQ0hBTkdFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3Qga2V5X2xlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmtleV9sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiBrZXlfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGtleV9sZW5ndGggKiAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfRklMRV9UUkFOU0ZFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfRFlOQU1JQ19JUE1DQVNUX0NUUkw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0RZTkFNSUNfSVBNQ0FTVF9DVFJMX1JFU1A6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU1RBVElDX0lQTUNBU1RfQ1RSTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU1RBVElDX0lQTUNBU1RfQ1RSTF9SRVNQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1JFU0VSVkVEOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV9nZXRfcmVxdWVzdF9jb3VudF92YXJzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgdWludDMyX3QgZHVtbXkgPSAwOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgYnVmQ2xvbmUgPSAqYnVmOworICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvcl9zY2FuKCZidWZDbG9uZSwgJmR1bW15KSkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlX2dldF9yZXNwb25zZV9jb3VudF92YXJzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgdWludDMyX3QgZHVtbXkgPSAwOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgYnVmQ2xvbmUgPSAqYnVmOworICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2Vfc2NhbigmYnVmQ2xvbmUsICZkdW1teSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV9zZXRfcmVxdWVzdF9jb3VudF92YXJzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgdWludDMyX3QgZHVtbXkgPSAwOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgYnVmQ2xvbmUgPSAqYnVmOworICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2Vfc2NhbigmYnVmQ2xvbmUsICZkdW1teSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV9zZXRfcmVzcG9uc2VfY291bnRfdmFycyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIHVpbnQzMl90IGR1bW15ID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIGJ1ZkNsb25lID0gKmJ1ZjsKKyAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlX3NjYW4oJmJ1ZkNsb25lLCAmZHVtbXkpKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3ZlcnNpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX3ZlcnNpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5tYWpvcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bWlub3IpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3ZlcnNpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfdmVyc2lvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPm1ham9yKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5taW5vcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfdmVyc2lvbl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3JhbmRvbV9wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfcmFuZG9tICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnVuaXhfdGltZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+cmFuZG9tLCAyOCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfcmFuZG9tX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX3JhbmRvbSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT51bml4X3RpbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+cmFuZG9tLCAyOCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfcmFuZG9tX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMzIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3Nlc3Npb25faWRfcGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX3Nlc3Npb25faWQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bGVuZ3RoID4gMCkgJiYgKHRoaXMtPnNlc3Npb25faWQgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwic2Vzc2lvbl9pZFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90bHNfc2Vzc2lvbl9pZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+bGVuZ3RoID4gMzIpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+c2Vzc2lvbl9pZCwgdGhpcy0+bGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90bHNfc2Vzc2lvbl9pZF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGxzX3Nlc3Npb25faWQgKnRoaXMpCit7CisgICAgcmV0dXJuIDEgKyB0aGlzLT5sZW5ndGg7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfc2Vzc2lvbl9pZF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19zZXNzaW9uX2lkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbmd0aCA+IDApICYmICh0aGlzLT5zZXNzaW9uX2lkID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwic2Vzc2lvbl9pZFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90bHNfc2Vzc2lvbl9pZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT5zZXNzaW9uX2lkID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPmxlbmd0aCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodGhpcy0+bGVuZ3RoID4gMzIpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT5zZXNzaW9uX2lkLCB0aGlzLT5sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3Nlc3Npb25faWRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogbGVuZ3RoKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCAqIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlX2xpc3RfcGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbmd0aCA+IDApICYmICh0aGlzLT5jaXBoZXJzdWl0ZXMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY2lwaGVyc3VpdGVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZV9saXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmxlbmd0aDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZV9wYWNrKHRoaXMtPmNpcGhlcnN1aXRlc1tpMF0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZV9saXN0X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV90bHNfY2lwaGVyc3VpdGVfbGlzdCAqdGhpcykKK3sKKyAgICByZXR1cm4gMiArICgyICogdGhpcy0+bGVuZ3RoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZV9saXN0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MTZfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbmd0aCA+IDApICYmICh0aGlzLT5jaXBoZXJzdWl0ZXMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjaXBoZXJzdWl0ZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlX2xpc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+Y2lwaGVyc3VpdGVzID0gKGJjbW9sdF9lcG9uX29hbV90bHNfY2lwaGVyc3VpdGUgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPmxlbmd0aCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5sZW5ndGg7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfY2lwaGVyc3VpdGVfdW5wYWNrKCZ0aGlzLT5jaXBoZXJzdWl0ZXNbaTBdLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZV9saXN0X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IGxlbmd0aDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYocGFja2VkLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90bHNfY2lwaGVyc3VpdGUpICogbGVuZ3RoKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCAqIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX2xpc3RfcGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5sZW5ndGggPiAwKSAmJiAodGhpcy0+bWV0aG9kcyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJtZXRob2RzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9saXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmxlbmd0aDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9tZXRob2RfcGFjayh0aGlzLT5tZXRob2RzW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX2xpc3RfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9saXN0ICp0aGlzKQoreworICAgIHJldHVybiAxICsgdGhpcy0+bGVuZ3RoOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX2xpc3RfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfY29tcHJlc3Npb25fbGlzdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbmd0aCA+IDApICYmICh0aGlzLT5tZXRob2RzID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibWV0aG9kc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90bHNfY29tcHJlc3Npb25fbGlzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT5tZXRob2RzID0gKGJjbW9sdF9lcG9uX29hbV90bHNfY29tcHJlc3Npb25fbWV0aG9kICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5sZW5ndGggKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9tZXRob2QpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmxlbmd0aDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9tZXRob2RfdW5wYWNrKCZ0aGlzLT5tZXRob2RzW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY29tcHJlc3Npb25fbGlzdF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IGxlbmd0aDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9tZXRob2QpICogbGVuZ3RoKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCAqIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX2xpc3RfcGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgdWludDMyX3QgaTA7CisgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5jZXJ0aWZpY2F0ZV9saXN0X2NvdW50ID4gMCkgJiYgKHRoaXMtPmNlcnRpZmljYXRlX2xpc3QgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY2VydGlmaWNhdGVfbGlzdFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfbGlzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5jZXJ0aWZpY2F0ZV9saXN0X2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY2VydGlmaWNhdGVfcGFjaygmdGhpcy0+Y2VydGlmaWNhdGVfbGlzdFtpMF0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MjRfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MjQoYnVmLCB1aW50MzJfdF90b191aW50MjRfdChieXRlc0FmdGVyTGVuRmllbGQpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MjRfdCkpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfbGlzdF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX2xpc3QgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAzOworICAgIHVpbnQzMl90IGkwOworICAgIGlmICgodGhpcy0+Y2VydGlmaWNhdGVfbGlzdF9jb3VudCA+IDApICYmICh0aGlzLT5jZXJ0aWZpY2F0ZV9saXN0ID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImNlcnRpZmljYXRlX2xpc3RfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX2xpc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5jZXJ0aWZpY2F0ZV9saXN0X2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2NlcnRpZmljYXRlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5jZXJ0aWZpY2F0ZV9saXN0W2kwXSk7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX2xpc3RfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfbGlzdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQyNF90IGNlcnRpZmljYXRlX2xpc3Rfc2l6ZSA9IHVpbnQzMl90X3RvX3VpbnQyNF90KDApOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50MzJfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MjQoYnVmLCAmY2VydGlmaWNhdGVfbGlzdF9zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIHVpbnQyNF90X3RvX3VpbnQzMl90KGNlcnRpZmljYXRlX2xpc3Rfc2l6ZSksIGJ1Zi0+Y3Vycik7CisgICAgdGhpcy0+Y2VydGlmaWNhdGVfbGlzdF9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfbGlzdF9jb3VudF9jZXJ0aWZpY2F0ZV9saXN0KCZwb3N0TGVuQnVmKTsKKyAgICBpZiAoKHRoaXMtPmNlcnRpZmljYXRlX2xpc3RfY291bnQgPiAwKSAmJiAodGhpcy0+Y2VydGlmaWNhdGVfbGlzdCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImNlcnRpZmljYXRlX2xpc3RcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX2xpc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+Y2VydGlmaWNhdGVfbGlzdCA9IChiY21vbHRfZXBvbl9vYW1fY2VydGlmaWNhdGUgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPmNlcnRpZmljYXRlX2xpc3RfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2NlcnRpZmljYXRlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5jZXJ0aWZpY2F0ZV9saXN0X2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY2VydGlmaWNhdGVfdW5wYWNrKCZ0aGlzLT5jZXJ0aWZpY2F0ZV9saXN0W2kwXSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgdWludDI0X3RfdG9fdWludDMyX3QoY2VydGlmaWNhdGVfbGlzdF9zaXplKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfbGlzdF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDI0X3QgbGVuZ3RoOworICAgIHVpbnQzMl90IGNlcnRpZmljYXRlX2xpc3RfZWxlbV9jb3VudCA9IDA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTI0KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCB1aW50MjRfdF90b191aW50MzJfdChsZW5ndGgpLCBwYWNrZWQtPmN1cnIpOworICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY2VydGlmaWNhdGVfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjZXJ0aWZpY2F0ZV9saXN0X2VsZW1fY291bnQgKz0gMTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoY2VydGlmaWNhdGVfbGlzdF9lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jZXJ0aWZpY2F0ZSkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgdWludDI0X3RfdG9fdWludDMyX3QobGVuZ3RoKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX2xpc3RfY291bnRfY2VydGlmaWNhdGVfbGlzdChiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIHVpbnQzMl90IGR1bW15ID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIGJ1ZkNsb25lID0gKmJ1ZjsKKyAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2NlcnRpZmljYXRlX3NjYW4oJmJ1ZkNsb25lLCAmZHVtbXkpKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX3R5cGVfbGlzdF9wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZV9saXN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bGVuZ3RoID4gMCkgJiYgKHRoaXMtPmNlcnRpZmljYXRlX3R5cGVzID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImNlcnRpZmljYXRlX3R5cGVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV90eXBlX2xpc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bGVuZ3RoOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX3R5cGVfcGFjayh0aGlzLT5jZXJ0aWZpY2F0ZV90eXBlc1tpMF0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV90eXBlX2xpc3RfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV90eXBlX2xpc3QgKnRoaXMpCit7CisgICAgcmV0dXJuIDEgKyB0aGlzLT5sZW5ndGg7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZV9saXN0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX3R5cGVfbGlzdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmxlbmd0aCA+IDApICYmICh0aGlzLT5jZXJ0aWZpY2F0ZV90eXBlcyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImNlcnRpZmljYXRlX3R5cGVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV90eXBlX2xpc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+Y2VydGlmaWNhdGVfdHlwZXMgPSAoYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV90eXBlICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5sZW5ndGggKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV90eXBlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5sZW5ndGg7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZV91bnBhY2soJnRoaXMtPmNlcnRpZmljYXRlX3R5cGVzW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZV9saXN0X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX3R5cGUpICogbGVuZ3RoKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCAqIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2VfdHlwZV9wYWNrKHRoaXMtPmlkLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+aWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfQ0xJRU5UX0hFTExPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc192ZXJzaW9uX3BhY2soJnRoaXMtPnUuY2xpZW50X2hlbGxvLnZlcnNpb24sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX3JhbmRvbV9wYWNrKCZ0aGlzLT51LmNsaWVudF9oZWxsby5yYW5kb20sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX3Nlc3Npb25faWRfcGFjaygmdGhpcy0+dS5jbGllbnRfaGVsbG8uc2Vzc2lvbl9pZCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfY2lwaGVyc3VpdGVfbGlzdF9wYWNrKCZ0aGlzLT51LmNsaWVudF9oZWxsby5jaXBoZXJfc3VpdGVzLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9saXN0X3BhY2soJnRoaXMtPnUuY2xpZW50X2hlbGxvLmNvbXByZXNzaW9uX21ldGhvZHMsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19IQU5EU0hBS0VfVFlQRV9TRVJWRVJfSEVMTE86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX3ZlcnNpb25fcGFjaygmdGhpcy0+dS5zZXJ2ZXJfaGVsbG8udmVyc2lvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfcmFuZG9tX3BhY2soJnRoaXMtPnUuc2VydmVyX2hlbGxvLnJhbmRvbSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfc2Vzc2lvbl9pZF9wYWNrKCZ0aGlzLT51LnNlcnZlcl9oZWxsby5zZXNzaW9uX2lkLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZV9wYWNrKHRoaXMtPnUuc2VydmVyX2hlbGxvLmNpcGhlcnN1aXRlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9tZXRob2RfcGFjayh0aGlzLT51LnNlcnZlcl9oZWxsby5jb21wcmVzc2lvbl9tZXRob2QsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19IQU5EU0hBS0VfVFlQRV9DRVJUSUZJQ0FURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfbGlzdF9wYWNrKCZ0aGlzLT51LmNlcnRpZmljYXRlLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfQ0VSVElGSUNBVEVfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZV9saXN0X3BhY2soJnRoaXMtPnUuY2VydGlmaWNhdGVfcmVxdWVzdC5jZXJ0aWZpY2F0ZV90eXBlcywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfbGlzdF9wYWNrKCZ0aGlzLT51LmNlcnRpZmljYXRlX3JlcXVlc3QuY2VydGlmaWNhdGVfYXV0aG9yaXRpZXMsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19IQU5EU0hBS0VfVFlQRV9TRVJWRVJfSEVMTE9fRE9ORToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfQ0VSVElGSUNBVEVfVkVSSUZZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmNlcnRpZmljYXRlX3ZlcmlmeS5oYXNoX3NpemUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5jZXJ0aWZpY2F0ZV92ZXJpZnkuaGFzaF9zaXplID4gMCkgJiYgKHRoaXMtPnUuY2VydGlmaWNhdGVfdmVyaWZ5LmVuY3J5cHRlZF9oYXNoID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImVuY3J5cHRlZF9oYXNoXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2VfY2VydGlmaWNhdGVfdmVyaWZ5XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuY2VydGlmaWNhdGVfdmVyaWZ5LmVuY3J5cHRlZF9oYXNoLCB0aGlzLT51LmNlcnRpZmljYXRlX3ZlcmlmeS5oYXNoX3NpemUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfQ0xJRU5UX0tFWV9FWENIQU5HRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5jbGllbnRfa2V5X2V4Y2hhbmdlLnNpemUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5jbGllbnRfa2V5X2V4Y2hhbmdlLnNpemUgPiAwKSAmJiAodGhpcy0+dS5jbGllbnRfa2V5X2V4Y2hhbmdlLmVuY3J5cHRlZF9wcmVfbWFzdGVyX3NlY3JldCA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJlbmNyeXB0ZWRfcHJlX21hc3Rlcl9zZWNyZXRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZV9jbGllbnRfa2V5X2V4Y2hhbmdlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuY2xpZW50X2tleV9leGNoYW5nZS5lbmNyeXB0ZWRfcHJlX21hc3Rlcl9zZWNyZXQsIHRoaXMtPnUuY2xpZW50X2tleV9leGNoYW5nZS5zaXplKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX0ZJTklTSEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5maW5pc2hlZC52ZXJpZnlfZGF0YV9jb3VudCA+IDApICYmICh0aGlzLT51LmZpbmlzaGVkLnZlcmlmeV9kYXRhID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZlcmlmeV9kYXRhXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2VfZmluaXNoZWRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5maW5pc2hlZC52ZXJpZnlfZGF0YSwgdGhpcy0+dS5maW5pc2hlZC52ZXJpZnlfZGF0YV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19IQU5EU0hBS0VfVFlQRV9IRUxMT19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfU0VSVkVSX0tFWV9FWENIQU5HRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MjRfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MjQoYnVmLCB1aW50MzJfdF90b191aW50MjRfdChieXRlc0FmdGVyTGVuRmllbGQpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MjRfdCkpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gNDsKKyAgICBzd2l0Y2ggKHRoaXMtPmlkKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX0NMSUVOVF9IRUxMTzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzNCArIGJjbW9sdF9lcG9uX29hbV90bHNfc2Vzc2lvbl9pZF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5jbGllbnRfaGVsbG8uc2Vzc2lvbl9pZCkgKyBiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlX2xpc3RfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuY2xpZW50X2hlbGxvLmNpcGhlcl9zdWl0ZXMpICsgYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9saXN0X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmNsaWVudF9oZWxsby5jb21wcmVzc2lvbl9tZXRob2RzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfU0VSVkVSX0hFTExPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDM3ICsgYmNtb2x0X2Vwb25fb2FtX3Rsc19zZXNzaW9uX2lkX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnNlcnZlcl9oZWxsby5zZXNzaW9uX2lkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfQ0VSVElGSUNBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV9saXN0X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmNlcnRpZmljYXRlLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfQ0VSVElGSUNBVEVfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX3R5cGVfbGlzdF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5jZXJ0aWZpY2F0ZV9yZXF1ZXN0LmNlcnRpZmljYXRlX3R5cGVzKSArIGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfbGlzdF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5jZXJ0aWZpY2F0ZV9yZXF1ZXN0LmNlcnRpZmljYXRlX2F1dGhvcml0aWVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfU0VSVkVSX0hFTExPX0RPTkU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX0NFUlRJRklDQVRFX1ZFUklGWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyICsgdGhpcy0+dS5jZXJ0aWZpY2F0ZV92ZXJpZnkuaGFzaF9zaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19IQU5EU0hBS0VfVFlQRV9DTElFTlRfS0VZX0VYQ0hBTkdFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDIgKyB0aGlzLT51LmNsaWVudF9rZXlfZXhjaGFuZ2Uuc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfRklOSVNIRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gdGhpcy0+dS5maW5pc2hlZC52ZXJpZnlfZGF0YV9jb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfSEVMTE9fUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX1NFUlZFUl9LRVlfRVhDSEFOR0U6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQyNF90IGxlbmd0aCA9IHVpbnQzMl90X3RvX3VpbnQyNF90KDApOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlX3R5cGVfdW5wYWNrKCZ0aGlzLT5pZCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MjQoYnVmLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIHVpbnQyNF90X3RvX3VpbnQzMl90KGxlbmd0aCksIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT5pZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19IQU5EU0hBS0VfVFlQRV9DTElFTlRfSEVMTE86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX3ZlcnNpb25fdW5wYWNrKCZ0aGlzLT51LmNsaWVudF9oZWxsby52ZXJzaW9uLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfcmFuZG9tX3VucGFjaygmdGhpcy0+dS5jbGllbnRfaGVsbG8ucmFuZG9tLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfc2Vzc2lvbl9pZF91bnBhY2soJnRoaXMtPnUuY2xpZW50X2hlbGxvLnNlc3Npb25faWQsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZV9saXN0X3VucGFjaygmdGhpcy0+dS5jbGllbnRfaGVsbG8uY2lwaGVyX3N1aXRlcywgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX2xpc3RfdW5wYWNrKCZ0aGlzLT51LmNsaWVudF9oZWxsby5jb21wcmVzc2lvbl9tZXRob2RzLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX1NFUlZFUl9IRUxMTzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfdmVyc2lvbl91bnBhY2soJnRoaXMtPnUuc2VydmVyX2hlbGxvLnZlcnNpb24sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19yYW5kb21fdW5wYWNrKCZ0aGlzLT51LnNlcnZlcl9oZWxsby5yYW5kb20sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19zZXNzaW9uX2lkX3VucGFjaygmdGhpcy0+dS5zZXJ2ZXJfaGVsbG8uc2Vzc2lvbl9pZCwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlX3VucGFjaygmdGhpcy0+dS5zZXJ2ZXJfaGVsbG8uY2lwaGVyc3VpdGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfY29tcHJlc3Npb25fbWV0aG9kX3VucGFjaygmdGhpcy0+dS5zZXJ2ZXJfaGVsbG8uY29tcHJlc3Npb25fbWV0aG9kLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19IQU5EU0hBS0VfVFlQRV9DRVJUSUZJQ0FURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfbGlzdF91bnBhY2soJnRoaXMtPnUuY2VydGlmaWNhdGUudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfQ0VSVElGSUNBVEVfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZV9saXN0X3VucGFjaygmdGhpcy0+dS5jZXJ0aWZpY2F0ZV9yZXF1ZXN0LmNlcnRpZmljYXRlX3R5cGVzLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfbGlzdF91bnBhY2soJnRoaXMtPnUuY2VydGlmaWNhdGVfcmVxdWVzdC5jZXJ0aWZpY2F0ZV9hdXRob3JpdGllcywgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19IQU5EU0hBS0VfVFlQRV9TRVJWRVJfSEVMTE9fRE9ORToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfQ0VSVElGSUNBVEVfVkVSSUZZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuY2VydGlmaWNhdGVfdmVyaWZ5Lmhhc2hfc2l6ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmNlcnRpZmljYXRlX3ZlcmlmeS5oYXNoX3NpemUgPiAwKSAmJiAodGhpcy0+dS5jZXJ0aWZpY2F0ZV92ZXJpZnkuZW5jcnlwdGVkX2hhc2ggPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJlbmNyeXB0ZWRfaGFzaFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlX2NlcnRpZmljYXRlX3ZlcmlmeVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmNlcnRpZmljYXRlX3ZlcmlmeS5lbmNyeXB0ZWRfaGFzaCA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmNlcnRpZmljYXRlX3ZlcmlmeS5oYXNoX3NpemUgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUuY2VydGlmaWNhdGVfdmVyaWZ5LmVuY3J5cHRlZF9oYXNoLCB0aGlzLT51LmNlcnRpZmljYXRlX3ZlcmlmeS5oYXNoX3NpemUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfQ0xJRU5UX0tFWV9FWENIQU5HRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmNsaWVudF9rZXlfZXhjaGFuZ2Uuc2l6ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmNsaWVudF9rZXlfZXhjaGFuZ2Uuc2l6ZSA+IDApICYmICh0aGlzLT51LmNsaWVudF9rZXlfZXhjaGFuZ2UuZW5jcnlwdGVkX3ByZV9tYXN0ZXJfc2VjcmV0ID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZW5jcnlwdGVkX3ByZV9tYXN0ZXJfc2VjcmV0XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2VfY2xpZW50X2tleV9leGNoYW5nZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmNsaWVudF9rZXlfZXhjaGFuZ2UuZW5jcnlwdGVkX3ByZV9tYXN0ZXJfc2VjcmV0ID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuY2xpZW50X2tleV9leGNoYW5nZS5zaXplICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LmNsaWVudF9rZXlfZXhjaGFuZ2UuZW5jcnlwdGVkX3ByZV9tYXN0ZXJfc2VjcmV0LCB0aGlzLT51LmNsaWVudF9rZXlfZXhjaGFuZ2Uuc2l6ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19IQU5EU0hBS0VfVFlQRV9GSU5JU0hFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLT51LmZpbmlzaGVkLnZlcmlmeV9kYXRhX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2VfZmluaXNoZWRfY291bnRfdmVyaWZ5X2RhdGEoJnBvc3RMZW5CdWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5maW5pc2hlZC52ZXJpZnlfZGF0YV9jb3VudCA+IDApICYmICh0aGlzLT51LmZpbmlzaGVkLnZlcmlmeV9kYXRhID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmVyaWZ5X2RhdGFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZV9maW5pc2hlZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmZpbmlzaGVkLnZlcmlmeV9kYXRhID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZmluaXNoZWQudmVyaWZ5X2RhdGFfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUuZmluaXNoZWQudmVyaWZ5X2RhdGEsIHRoaXMtPnUuZmluaXNoZWQudmVyaWZ5X2RhdGFfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfSEVMTE9fUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX1NFUlZFUl9LRVlfRVhDSEFOR0U6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIHVpbnQyNF90X3RvX3VpbnQzMl90KGxlbmd0aCkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZV90eXBlIGlkOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50MjRfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZV90eXBlX3VucGFjaygmaWQsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTI0KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCB1aW50MjRfdF90b191aW50MzJfdChsZW5ndGgpLCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAoaWQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfQ0xJRU5UX0hFTExPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19zZXNzaW9uX2lkX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlX2xpc3Rfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfY29tcHJlc3Npb25fbGlzdF9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfU0VSVkVSX0hFTExPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMzIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19zZXNzaW9uX2lkX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX0NFUlRJRklDQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV9saXN0X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19IQU5EU0hBS0VfVFlQRV9DRVJUSUZJQ0FURV9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV90eXBlX2xpc3Rfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfbGlzdF9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfU0VSVkVSX0hFTExPX0RPTkU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX0NFUlRJRklDQVRFX1ZFUklGWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBoYXNoX3NpemU7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmaGFzaF9zaXplKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogaGFzaF9zaXplKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgaGFzaF9zaXplICogMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19IQU5EU0hBS0VfVFlQRV9DTElFTlRfS0VZX0VYQ0hBTkdFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IHNpemU7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmc2l6ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50OF90KSAqIHNpemUpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCBzaXplICogMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19IQU5EU0hBS0VfVFlQRV9GSU5JU0hFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB2ZXJpZnlfZGF0YV9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB2ZXJpZnlfZGF0YV9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHZlcmlmeV9kYXRhX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19IQU5EU0hBS0VfVFlQRV9IRUxMT19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfU0VSVkVSX0tFWV9FWENIQU5HRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgdWludDI0X3RfdG9fdWludDMyX3QobGVuZ3RoKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZV9maW5pc2hlZF9jb3VudF92ZXJpZnlfZGF0YShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX2NvbnRlbnRfdHlwZV9wYWNrKHRoaXMtPmNvbnRlbnRfdHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfdmVyc2lvbl9wYWNrKCZ0aGlzLT52ZXJzaW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+Y29udGVudF90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9IQU5EU0hBS0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmhhbmRzaGFrZS5oYW5kc2hha2VfcmVjb3Jkc19jb3VudCA+IDApICYmICh0aGlzLT51LmhhbmRzaGFrZS5oYW5kc2hha2VfcmVjb3JkcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJoYW5kc2hha2VfcmVjb3Jkc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX2hhbmRzaGFrZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmhhbmRzaGFrZS5oYW5kc2hha2VfcmVjb3Jkc19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2VfcGFjaygmdGhpcy0+dS5oYW5kc2hha2UuaGFuZHNoYWtlX3JlY29yZHNbaTBdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9BTEVSVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9BUFBMSUNBVElPTl9EQVRBOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfQ09OVEVOVF9UWVBFX0NIQU5HRV9DSVBIRVJfU1BFQzoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmRfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmQgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSA1OworICAgIHN3aXRjaCAodGhpcy0+Y29udGVudF90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9IQU5EU0hBS0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmhhbmRzaGFrZS5oYW5kc2hha2VfcmVjb3Jkc19jb3VudCA+IDApICYmICh0aGlzLT51LmhhbmRzaGFrZS5oYW5kc2hha2VfcmVjb3JkcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJoYW5kc2hha2VfcmVjb3Jkc19jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5oYW5kc2hha2UuaGFuZHNoYWtlX3JlY29yZHNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5oYW5kc2hha2UuaGFuZHNoYWtlX3JlY29yZHNbaTBdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9BTEVSVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9BUFBMSUNBVElPTl9EQVRBOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfQ09OVEVOVF9UWVBFX0NIQU5HRV9DSVBIRVJfU1BFQzoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgbGVuZ3RoID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX2NvbnRlbnRfdHlwZV91bnBhY2soJnRoaXMtPmNvbnRlbnRfdHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfdmVyc2lvbl91bnBhY2soJnRoaXMtPnZlcnNpb24sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCwgYnVmLT5jdXJyKTsKKyAgICBzd2l0Y2ggKHRoaXMtPmNvbnRlbnRfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19DT05URU5UX1RZUEVfSEFORFNIQUtFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgIHRoaXMtPnUuaGFuZHNoYWtlLmhhbmRzaGFrZV9yZWNvcmRzX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmRfaGFuZHNoYWtlX2NvdW50X2hhbmRzaGFrZV9yZWNvcmRzKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuaGFuZHNoYWtlLmhhbmRzaGFrZV9yZWNvcmRzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuaGFuZHNoYWtlLmhhbmRzaGFrZV9yZWNvcmRzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiaGFuZHNoYWtlX3JlY29yZHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZF9oYW5kc2hha2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5oYW5kc2hha2UuaGFuZHNoYWtlX3JlY29yZHMgPSAoYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2UgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuaGFuZHNoYWtlLmhhbmRzaGFrZV9yZWNvcmRzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmhhbmRzaGFrZS5oYW5kc2hha2VfcmVjb3Jkc19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2VfdW5wYWNrKCZ0aGlzLT51LmhhbmRzaGFrZS5oYW5kc2hha2VfcmVjb3Jkc1tpMF0sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9BTEVSVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9BUFBMSUNBVElPTl9EQVRBOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfQ09OVEVOVF9UWVBFX0NIQU5HRV9DSVBIRVJfU1BFQzoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Rsc19jb250ZW50X3R5cGUgY29udGVudF90eXBlOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50MTZfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX2NvbnRlbnRfdHlwZV91bnBhY2soJmNvbnRlbnRfdHlwZSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAoY29udGVudF90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9IQU5EU0hBS0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaGFuZHNoYWtlX3JlY29yZHNfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaGFuZHNoYWtlX3JlY29yZHNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChoYW5kc2hha2VfcmVjb3Jkc19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9BTEVSVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9BUFBMSUNBVElPTl9EQVRBOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfQ09OVEVOVF9UWVBFX0NIQU5HRV9DSVBIRVJfU1BFQzoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX2hhbmRzaGFrZV9jb3VudF9oYW5kc2hha2VfcmVjb3JkcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIHVpbnQzMl90IGR1bW15ID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIGJ1ZkNsb25lID0gKmJ1ZjsKKyAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2Vfc2NhbigmYnVmQ2xvbmUsICZkdW1teSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX21lc3NhZ2VfcGFjayhiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19tZXNzYWdlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX2ZsYWdzX3BhY2sodGhpcy0+ZmxhZ3MsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCgoKHVpbnQ2NF90KSB0aGlzLT5mbGFncyAmIDB4MDA4MCkgPT0gMHgwMDgwKSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5sZW5ndGgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKCgoKHVpbnQ2NF90KSB0aGlzLT5mbGFncyAmIDB4MDA4MCkgPT0gMHgwMDgwKSAmJiAoKCh1aW50NjRfdCkgdGhpcy0+ZmxhZ3MgJiAweDAwNDApID09IDApKSkKKyAgICB7CisgICAgICAgIGlmICgodGhpcy0+dGxzX3JlY29yZHNfY291bnQgPiAwKSAmJiAodGhpcy0+dGxzX3JlY29yZHMgPT0gTlVMTCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ0bHNfcmVjb3Jkc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX21lc3NhZ2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgdWludDMyX3QgaTA7CisgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnRsc19yZWNvcmRzX2NvdW50OyBpMCsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX3BhY2soJnRoaXMtPnRsc19yZWNvcmRzW2kwXSwgYnVmKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX21lc3NhZ2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfbWVzc2FnZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDU7CisgICAgdWludDMyX3QgaTA7CisgICAgaWYgKCh0aGlzLT50bHNfcmVjb3Jkc19jb3VudCA+IDApICYmICh0aGlzLT50bHNfcmVjb3JkcyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ0bHNfcmVjb3Jkc19jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX21lc3NhZ2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT50bHNfcmVjb3Jkc19jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT50bHNfcmVjb3Jkc1tpMF0pOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfbWVzc2FnZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfbWVzc2FnZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19mbGFnc191bnBhY2soJnRoaXMtPmZsYWdzLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoKCh1aW50NjRfdCkgdGhpcy0+ZmxhZ3MgJiAweDAwODApID09IDB4MDA4MCkpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+bGVuZ3RoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCgoKCh1aW50NjRfdCkgdGhpcy0+ZmxhZ3MgJiAweDAwODApID09IDB4MDA4MCkgJiYgKCgodWludDY0X3QpIHRoaXMtPmZsYWdzICYgMHgwMDQwKSA9PSAwKSkpCisgICAgeworICAgICAgICB0aGlzLT50bHNfcmVjb3Jkc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX21lc3NhZ2VfY291bnRfdGxzX3JlY29yZHMoYnVmKTsKKyAgICAgICAgaWYgKCh0aGlzLT50bHNfcmVjb3Jkc19jb3VudCA+IDApICYmICh0aGlzLT50bHNfcmVjb3JkcyA9PSBOVUxMKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ0bHNfcmVjb3Jkc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX21lc3NhZ2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLT50bHNfcmVjb3JkcyA9IChiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnRsc19yZWNvcmRzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB1aW50MzJfdCBpMDsKKyAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dGxzX3JlY29yZHNfY291bnQ7IGkwKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmRfdW5wYWNrKCZ0aGlzLT50bHNfcmVjb3Jkc1tpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfbWVzc2FnZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MzJfdCB0bHNfcmVjb3Jkc19lbGVtX2NvdW50ID0gMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHRsc19yZWNvcmRzX2VsZW1fY291bnQgKz0gMTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodGxzX3JlY29yZHNfZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZCkpOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfbWVzc2FnZV9jb3VudF90bHNfcmVjb3JkcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIHVpbnQzMl90IGR1bW15ID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIGJ1ZkNsb25lID0gKmJ1ZjsKKyAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmRfc2NhbigmYnVmQ2xvbmUsICZkdW1teSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX2hlYWRlcl9wYWNrKGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX2hlYWRlciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19zdWJ0eXBlX3BhY2sodGhpcy0+c3ViX3R5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5zdWJfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19TVUJUWVBFX0FVVEhFTlRJQ0FUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfbWVzc2FnZV9wYWNrKCZ0aGlzLT51LmF1dGhlbnRpY2F0aW9uLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19oZWFkZXJfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfaGVhZGVyICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICBzd2l0Y2ggKHRoaXMtPnN1Yl90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX1NVQlRZUEVfQVVUSEVOVElDQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfbWVzc2FnZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5hdXRoZW50aWNhdGlvbi52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfaGVhZGVyX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19oZWFkZXIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfc3VidHlwZV91bnBhY2soJnRoaXMtPnN1Yl90eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+c3ViX3R5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfU1VCVFlQRV9BVVRIRU5USUNBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX21lc3NhZ2VfdW5wYWNrKCZ0aGlzLT51LmF1dGhlbnRpY2F0aW9uLnZhbHVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfaGVhZGVyX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV90bHNfc3VidHlwZSBzdWJfdHlwZTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfc3VidHlwZV91bnBhY2soJnN1Yl90eXBlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAoc3ViX3R5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfU1VCVFlQRV9BVVRIRU5USUNBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX21lc3NhZ2Vfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2VhcF9mcmFtZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9lYXBfZnJhbWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZWFwX2NvZGVfcGFjayh0aGlzLT5jb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmlkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FQVBfQ09ERV9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfaGVhZGVyX3BhY2soJnRoaXMtPnUucmVxdWVzdC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQX0NPREVfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19oZWFkZXJfcGFjaygmdGhpcy0+dS5yZXNwb25zZS52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQX0NPREVfRkFJTFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQX0NPREVfU1VDQ0VTUzoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9lYXBfZnJhbWVfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2VhcF9mcmFtZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDQ7CisgICAgc3dpdGNoICh0aGlzLT5jb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQX0NPREVfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19oZWFkZXJfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUucmVxdWVzdC52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQX0NPREVfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfaGVhZGVyX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnJlc3BvbnNlLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FQVBfQ09ERV9GQUlMVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FQVBfQ09ERV9TVUNDRVNTOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZWFwX2ZyYW1lX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZWFwX2ZyYW1lICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgbGVuZ3RoID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZWFwX2NvZGVfdW5wYWNrKCZ0aGlzLT5jb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmlkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCAtIDQsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT5jb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQX0NPREVfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX2hlYWRlcl91bnBhY2soJnRoaXMtPnUucmVxdWVzdC52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUF9DT0RFX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfaGVhZGVyX3VucGFjaygmdGhpcy0+dS5yZXNwb25zZS52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUF9DT0RFX0ZBSUxVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUF9DT0RFX1NVQ0NFU1M6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIGxlbmd0aCAtIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZWFwX2ZyYW1lX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9lYXBfY29kZSBjb2RlOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50MTZfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZWFwX2NvZGVfdW5wYWNrKCZjb2RlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGggLSA0LCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAoY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUF9DT0RFX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19oZWFkZXJfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQX0NPREVfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19oZWFkZXJfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQX0NPREVfRkFJTFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQX0NPREVfU1VDQ0VTUzoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuZ3RoIC0gNCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lYXBvbF9wZHVfcGFjayhiY21vbHRfZXBvbl9vYW1fZWFwb2xfcGR1ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3R5cGVfcGFjayh0aGlzLT50eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUE9MX1RZUEVfUEFDS0VUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2VhcF9mcmFtZV9wYWNrKCZ0aGlzLT51LnBhY2tldC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQT0xfVFlQRV9BU0ZfQUxFUlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUE9MX1RZUEVfS0VZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FQVBPTF9UWVBFX0xPR09GRjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQT0xfVFlQRV9NS0E6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUE9MX1RZUEVfU1RBUlQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9lYXBvbF9wZHVfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3BkdSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDM7CisgICAgc3dpdGNoICh0aGlzLT50eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQT0xfVFlQRV9QQUNLRVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2VhcF9mcmFtZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5wYWNrZXQudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUE9MX1RZUEVfQVNGX0FMRVJUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FQVBPTF9UWVBFX0tFWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQT0xfVFlQRV9MT0dPRkY6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUE9MX1RZUEVfTUtBOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FQVBPTF9UWVBFX1NUQVJUOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZWFwb2xfcGR1X3VucGFjayhiY21vbHRfZXBvbl9vYW1fZWFwb2xfcGR1ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgbGVuZ3RoID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZWFwb2xfdHlwZV91bnBhY2soJnRoaXMtPnR5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT50eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQT0xfVFlQRV9QQUNLRVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZWFwX2ZyYW1lX3VucGFjaygmdGhpcy0+dS5wYWNrZXQudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FQVBPTF9UWVBFX0FTRl9BTEVSVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQT0xfVFlQRV9LRVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUE9MX1RZUEVfTE9HT0ZGOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FQVBPTF9UWVBFX01LQToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQT0xfVFlQRV9TVEFSVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3BkdV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZWFwb2xfdHlwZSB0eXBlOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50MTZfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZWFwb2xfdHlwZV91bnBhY2soJnR5cGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQT0xfVFlQRV9QQUNLRVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZWFwX2ZyYW1lX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUE9MX1RZUEVfQVNGX0FMRVJUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FQVBPTF9UWVBFX0tFWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQT0xfVFlQRV9MT0dPRkY6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUE9MX1RZUEVfTUtBOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FQVBPTF9UWVBFX1NUQVJUOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZWFwb2xfcHJvdG9jb2xfcGFjayhiY21vbHRfZXBvbl9vYW1fZWFwb2xfcHJvdG9jb2wgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9lYXBvbF92ZXJzaW9uX3BhY2sodGhpcy0+dmVyc2lvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnZlcnNpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9FQVBPTF9WRVJTSU9OX1ZFUlNJT04yOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3BkdV9wYWNrKCZ0aGlzLT51LmRlZi52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9lYXBvbF9wcm90b2NvbF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZWFwb2xfcHJvdG9jb2wgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+dmVyc2lvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUE9MX1ZFUlNJT05fVkVSU0lPTjI6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3BkdV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5kZWYudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZWFwb2xfcHJvdG9jb2xfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9lYXBvbF9wcm90b2NvbCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3ZlcnNpb25fdW5wYWNrKCZ0aGlzLT52ZXJzaW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+dmVyc2lvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0VBUE9MX1ZFUlNJT05fVkVSU0lPTjI6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZWFwb2xfcGR1X3VucGFjaygmdGhpcy0+dS5kZWYudmFsdWUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3Byb3RvY29sX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9lYXBvbF92ZXJzaW9uIHZlcnNpb247CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZWFwb2xfdmVyc2lvbl91bnBhY2soJnZlcnNpb24sIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRUFQT0xfVkVSU0lPTl9WRVJTSU9OMjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9lYXBvbF9wZHVfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV92bGFuX3ZhbHVlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3ZsYW5fdmFsdWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MTZfdCByZXQgPSAwOworICAgIHJldCB8PSAoKHRoaXMtPnBjcCAmIDB4MDAwNykgPDwgMTMpOworICAgIHJldCB8PSAoKHRoaXMtPmNmaSAmIDB4MDAwMSkgPDwgMTIpOworICAgIHJldCB8PSAodGhpcy0+dmlkICYgMHgwRkZGKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgcmV0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3ZsYW5fdmFsdWVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV92bGFuX3ZhbHVlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ2YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHRoaXMtPnBjcCA9ICgodmFsID4+IDEzKSAmIDB4MDAwNyk7CisgICAgdGhpcy0+Y2ZpID0gKCh2YWwgPj4gMTIpICYgMHgwMDAxKTsKKyAgICB0aGlzLT52aWQgPSAodmFsICYgMHgwRkZGKTsKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3ZsYW5fdmFsdWVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2l0YWdfdmFsdWVfcGFjayhiY21vbHRfZXBvbl9vYW1faXRhZ192YWx1ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHJldCA9IDA7CisgICAgcmV0IHw9ICgodGhpcy0+cGNwICYgMHgwMDA3KSA8PCAyOSk7CisgICAgcmV0IHw9ICgodGhpcy0+ZGVpICYgMHgwMDAxKSA8PCAyOCk7CisgICAgcmV0IHw9ICgodGhpcy0+dWNhICYgMHgwMDAxKSA8PCAyNyk7CisgICAgcmV0IHw9ICgodGhpcy0+cmVzICYgMHgwMDA3KSA8PCAyNCk7CisgICAgcmV0IHw9ICh0aGlzLT5pc2lkICYgMHgwMEZGRkZGRlVMKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgcmV0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2l0YWdfdmFsdWVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9pdGFnX3ZhbHVlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDMyX3QgdmFsOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ2YWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHRoaXMtPnBjcCA9ICgodmFsID4+IDI5KSAmIDB4MDAwNyk7CisgICAgdGhpcy0+ZGVpID0gKCh2YWwgPj4gMjgpICYgMHgwMDAxKTsKKyAgICB0aGlzLT51Y2EgPSAoKHZhbCA+PiAyNykgJiAweDAwMDEpOworICAgIHRoaXMtPnJlcyA9ICgodmFsID4+IDI0KSAmIDB4MDAwNyk7CisgICAgdGhpcy0+aXNpZCA9ICh2YWwgJiAweDAwRkZGRkZGVUwpOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1faXRhZ192YWx1ZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2luZm9fdGx2X3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19pbmZvX3RsdiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19pbmZvX3Rsdl90eXBlX3BhY2sodGhpcy0+dHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfSU5GT19UTFZfVFlQRV9BTEFSTV9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19JTkZPX1RMVl9UWVBFX0VYVEVOU0lPTl9TVVBQT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZXh0ZW5zaW9uX3N1cHBvcnQudmVyc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3JlcG9ydF9tb2Rlc19wYWNrKHRoaXMtPnUuZXh0ZW5zaW9uX3N1cHBvcnQucmVwb3J0X21vZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3JlcG9ydF9tb2Rlc19wYWNrKHRoaXMtPnUuZXh0ZW5zaW9uX3N1cHBvcnQucHJlZmVycmVkX3JlcG9ydF9tb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfSU5GT19UTFZfVFlQRV9LRVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19JTkZPX1RMVl9UWVBFX0xJTks6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHZfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Rla19pbmZvX3RsdiAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgc3dpdGNoICh0aGlzLT50eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0lORk9fVExWX1RZUEVfQUxBUk1fUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfSU5GT19UTFZfVFlQRV9FWFRFTlNJT05fU1VQUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19JTkZPX1RMVl9UWVBFX0tFWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0lORk9fVExWX1RZUEVfTElOSzoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19pbmZvX3Rsdl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19pbmZvX3RsdiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19pbmZvX3Rsdl90eXBlX3VucGFjaygmdGhpcy0+dHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfSU5GT19UTFZfVFlQRV9BTEFSTV9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19JTkZPX1RMVl9UWVBFX0VYVEVOU0lPTl9TVVBQT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuZXh0ZW5zaW9uX3N1cHBvcnQudmVyc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3JlcG9ydF9tb2Rlc191bnBhY2soJnRoaXMtPnUuZXh0ZW5zaW9uX3N1cHBvcnQucmVwb3J0X21vZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3JlcG9ydF9tb2Rlc191bnBhY2soJnRoaXMtPnUuZXh0ZW5zaW9uX3N1cHBvcnQucHJlZmVycmVkX3JlcG9ydF9tb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfSU5GT19UTFZfVFlQRV9LRVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19JTkZPX1RMVl9UWVBFX0xJTks6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19pbmZvX3Rsdl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2luZm9fdGx2X3R5cGUgdHlwZTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHZfdHlwZV91bnBhY2soJnR5cGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0lORk9fVExWX1RZUEVfQUxBUk1fUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfSU5GT19UTFZfVFlQRV9FWFRFTlNJT05fU1VQUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0lORk9fVExWX1RZUEVfS0VZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfSU5GT19UTFZfVFlQRV9MSU5LOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mb19wYWNrKGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mbyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV93ZWxsX2tub3duX291aV9wYWNrKHRoaXMtPm91aSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm91aSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1RFSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHZfcGFjaygmdGhpcy0+dS50ZWsudGx2cywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQ1RDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuY3RjLmV4dGVuc2lvbl9zdXBwb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmN0Yy52ZXJzaW9uKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuY3RjLnN1cHBfdmVyc2lvbl9jb3VudCA+IDApICYmICh0aGlzLT51LmN0Yy5zdXBwX3ZlcnNpb24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwic3VwcF92ZXJzaW9uXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19pbmZvX2N0Y1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmN0Yy5zdXBwX3ZlcnNpb25fY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfb3VpX3ZlcnNpb25fcGFpcl9wYWNrKCZ0aGlzLT51LmN0Yy5zdXBwX3ZlcnNpb25baTBdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfRFBPRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2luZm9fdGx2X3BhY2soJnRoaXMtPnUuZHBvZS5kcG9lX2luZm9fdGx2LCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9CUkNNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EQVNBTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfS1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1BNQzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfU0lFUE9OX0E6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2luZm9fZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19pbmZvICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gNDsKKyAgICBzd2l0Y2ggKHRoaXMtPm91aSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1RFSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fdGVrX2luZm9fdGx2X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnRlay50bHZzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9DVEM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMiArICg0ICogdGhpcy0+dS5jdGMuc3VwcF92ZXJzaW9uX2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EUE9FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9kcG9lX2luZm9fdGx2X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmRwb2UuZHBvZV9pbmZvX3Rsdik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQlJDTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfREFTQU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0tUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9QTUM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1NJRVBPTl9BOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2luZm9fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mbyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgbGVuZ3RoID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCAtIDIsIGJ1Zi0+Y3Vycik7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fd2VsbF9rbm93bl9vdWlfdW5wYWNrKCZ0aGlzLT5vdWksICZwb3N0TGVuQnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm91aSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1RFSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHZfdW5wYWNrKCZ0aGlzLT51LnRlay50bHZzLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQ1RDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5jdGMuZXh0ZW5zaW9uX3N1cHBvcnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5jdGMudmVyc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGhpcy0+dS5jdGMuc3VwcF92ZXJzaW9uX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19pbmZvX2N0Y19jb3VudF9zdXBwX3ZlcnNpb24oJnBvc3RMZW5CdWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5jdGMuc3VwcF92ZXJzaW9uX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuY3RjLnN1cHBfdmVyc2lvbiA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInN1cHBfdmVyc2lvblwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mb19jdGNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5jdGMuc3VwcF92ZXJzaW9uID0gKGJjbW9sdF9lcG9uX29hbV9jdGNfb3VpX3ZlcnNpb25fcGFpciAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5jdGMuc3VwcF92ZXJzaW9uX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9jdGNfb3VpX3ZlcnNpb25fcGFpcikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5jdGMuc3VwcF92ZXJzaW9uX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX291aV92ZXJzaW9uX3BhaXJfdW5wYWNrKCZ0aGlzLT51LmN0Yy5zdXBwX3ZlcnNpb25baTBdLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RQT0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9pbmZvX3Rsdl91bnBhY2soJnRoaXMtPnUuZHBvZS5kcG9lX2luZm9fdGx2LCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQlJDTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfREFTQU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0tUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9QTUM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1NJRVBPTl9BOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCBsZW5ndGggLSAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19pbmZvX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50OF90IGxlbmd0aDsKKyAgICBiY21vbHRfZXBvbl9vYW1fd2VsbF9rbm93bl9vdWkgb3VpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGggLSAyLCBwYWNrZWQtPmN1cnIpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpX3VucGFjaygmb3VpLCAmcG9zdExlbkJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChvdWkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9URUs6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2luZm9fdGx2X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0NUQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzdXBwX3ZlcnNpb25fZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBzdXBwX3ZlcnNpb25fZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzdXBwX3ZlcnNpb25fZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fY3RjX291aV92ZXJzaW9uX3BhaXIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EUE9FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaW5mb190bHZfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQlJDTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfREFTQU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0tUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9QTUM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1NJRVBPTl9BOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBsZW5ndGggLSAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mb19jdGNfY291bnRfc3VwcF92ZXJzaW9uKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyA0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvX3BhY2soYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPm9hbV92ZXJzaW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+cmV2aXNpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvX3N0YXRlX3BhY2sodGhpcy0+c3RhdGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm9fY29uZmlnX3BhY2sodGhpcy0+b2FtX2NvbmZpZywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bWF4X3BkdV9zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV93ZWxsX2tub3duX291aV9wYWNrKHRoaXMtPm91aSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT52ZW5kb3Jfc3BlY2lmaWNfaW5mb3JtYXRpb24sIDQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvX3VucGFjayhiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm8gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IGxlbmd0aCA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGggLSAyLCBidWYtPmN1cnIpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+b2FtX3ZlcnNpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnJldmlzaW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mb19zdGF0ZV91bnBhY2soJnRoaXMtPnN0YXRlLCAmcG9zdExlbkJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm9fY29uZmlnX3VucGFjaygmdGhpcy0+b2FtX2NvbmZpZywgJnBvc3RMZW5CdWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPm1heF9wZHVfc2l6ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fd2VsbF9rbm93bl9vdWlfdW5wYWNrKCZ0aGlzLT5vdWksICZwb3N0TGVuQnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dmVuZG9yX3NwZWNpZmljX2luZm9ybWF0aW9uLCA0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIGxlbmd0aCAtIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm9fc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxNSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl90eXBlX3BhY2sodGhpcy0+dHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9JTkZPX1RMVl9UWVBFX09SR0FOSVpBVElPTl9TUEVDSUZJQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mb19wYWNrKCZ0aGlzLT51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fSU5GT19UTFZfVFlQRV9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmVuZC51bmtub3duX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZW5kLnVua25vd24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidW5rbm93blwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl9iYXNlX2VuZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmVuZC51bmtub3duLCB0aGlzLT51LmVuZC51bmtub3duX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fSU5GT19UTFZfVFlQRV9SRU1PVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm9fcGFjaygmdGhpcy0+dS5yZW1vdGUuaW5mbywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fSU5GT19UTFZfVFlQRV9MT0NBTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mb19wYWNrKCZ0aGlzLT51LmxvY2FsLmluZm8sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X2Jhc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0lORk9fVExWX1RZUEVfT1JHQU5JWkFUSU9OX1NQRUNJRklDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mb19nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0lORk9fVExWX1RZUEVfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IHRoaXMtPnUuZW5kLnVua25vd25fY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fSU5GT19UTFZfVFlQRV9SRU1PVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fSU5GT19UTFZfVFlQRV9MT0NBTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1faW5mb190bHZfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X3R5cGVfdW5wYWNrKCZ0aGlzLT50eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0lORk9fVExWX1RZUEVfT1JHQU5JWkFUSU9OX1NQRUNJRklDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19pbmZvX3VucGFjaygmdGhpcy0+dS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fSU5GT19UTFZfVFlQRV9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl9iYXNlX2VuZF9jb3VudF91bmtub3duKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmVuZC51bmtub3duX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZW5kLnVua25vd24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmtub3duXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X2Jhc2VfZW5kXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZW5kLnVua25vd24gPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuZW5kLnVua25vd24sIHRoaXMtPnUuZW5kLnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9JTkZPX1RMVl9UWVBFX1JFTU9URToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mb191bnBhY2soJnRoaXMtPnUucmVtb3RlLmluZm8sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fSU5GT19UTFZfVFlQRV9MT0NBTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mb191bnBhY2soJnRoaXMtPnUubG9jYWwuaW5mbywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl90eXBlIHR5cGU7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1faW5mb190bHZfdHlwZV91bnBhY2soJnR5cGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fSU5GT19UTFZfVFlQRV9PUkdBTklaQVRJT05fU1BFQ0lGSUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2luZm9fc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0lORk9fVExWX1RZUEVfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHVua25vd25fZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHVua25vd25fZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh1bmtub3duX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0lORk9fVExWX1RZUEVfUkVNT1RFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9JTkZPX1RMVl9UWVBFX0xPQ0FMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl9iYXNlX2VuZF9jb3VudF91bmtub3duKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19saW5rX2V2ZW50X2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2xpbmtfZXZlbnRfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV93ZWxsX2tub3duX291aV9wYWNrKHRoaXMtPm91aSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm91aSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1RFSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29kZV9wYWNrKHRoaXMtPnUudGVrLmFsYXJtX2NvZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT51LnRlay5yYWlzZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnRlay5wb3J0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS50ZWsubGluaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUudGVrLnF1ZXVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29udGV4dF9wYWNrKHRoaXMtPnUudGVrLmFsYXJtX2NvbnRleHQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RQT0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9ldmVudF9iYXNlX3BhY2soJnRoaXMtPnUuZHBvZS52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQ1RDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19hbGFybV9lbnRyeV9wYWNrKCZ0aGlzLT51LmN0Yy52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQlJDTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfREFTQU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0tUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9QTUM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1NJRVBPTl9BOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19saW5rX2V2ZW50X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19saW5rX2V2ZW50X2Jhc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSA0OworICAgIHN3aXRjaCAodGhpcy0+b3VpKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfVEVLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfRFBPRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fZHBvZV9ldmVudF9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmRwb2UudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0NUQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fY3RjX2FsYXJtX2VudHJ5X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmN0Yy52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQlJDTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfREFTQU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0tUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9QTUM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1NJRVBPTl9BOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2xpbmtfZXZlbnRfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19saW5rX2V2ZW50X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IGxlbmd0aCA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGggLSAyLCBidWYtPmN1cnIpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpX3VucGFjaygmdGhpcy0+b3VpLCAmcG9zdExlbkJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vdWkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9URUs6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2FsYXJtX2NvZGVfdW5wYWNrKCZ0aGlzLT51LnRlay5hbGFybV9jb2RlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudGVrLnJhaXNlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS50ZWsucG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS50ZWsubGluaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS50ZWsucXVldWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19hbGFybV9jb250ZXh0X3VucGFjaygmdGhpcy0+dS50ZWsuYWxhcm1fY29udGV4dCwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EUE9FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXZlbnRfYmFzZV91bnBhY2soJnRoaXMtPnUuZHBvZS52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0NUQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfYWxhcm1fZW50cnlfdW5wYWNrKCZ0aGlzLT51LmN0Yy52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0JSQ006CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RBU0FOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9LVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfUE1DOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9TSUVQT05fQToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgbGVuZ3RoIC0gMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfbGlua19ldmVudF9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50OF90IGxlbmd0aDsKKyAgICBiY21vbHRfZXBvbl9vYW1fd2VsbF9rbm93bl9vdWkgb3VpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGggLSAyLCBwYWNrZWQtPmN1cnIpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpX3VucGFjaygmb3VpLCAmcG9zdExlbkJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChvdWkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9URUs6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RQT0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9ldmVudF9iYXNlX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0NUQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfYWxhcm1fZW50cnlfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQlJDTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfREFTQU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0tUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9QTUM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1NJRVBPTl9BOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBsZW5ndGggLSAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdGx2X2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90bHZfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdHlwZV9wYWNrKHRoaXMtPnR5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT50eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fTElOS19FVkVOVF9UWVBFX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5lbmQudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmtub3duXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdGx2X2Jhc2VfZW5kXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZW5kLnVua25vd24sIHRoaXMtPnUuZW5kLnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9MSU5LX0VWRU5UX1RZUEVfT1JHQU5JWkFUSU9OX1NQRUNJRklDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19saW5rX2V2ZW50X2Jhc2VfcGFjaygmdGhpcy0+dS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0xJTktfRVZFTlRfVFlQRV9FUlJPUkVEX0ZSQU1FOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9MSU5LX0VWRU5UX1RZUEVfRVJST1JFRF9GUkFNRV9QRVJJT0Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0xJTktfRVZFTlRfVFlQRV9FUlJPUkVEX0ZSQU1FX1NFQ09ORFNfU1VNTUFSWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fTElOS19FVkVOVF9UWVBFX0VSUk9SRURfU1lNQk9MX1BFUklPRDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdGx2X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdGx2X2Jhc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0xJTktfRVZFTlRfVFlQRV9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9MSU5LX0VWRU5UX1RZUEVfT1JHQU5JWkFUSU9OX1NQRUNJRklDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfbGlua19ldmVudF9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fTElOS19FVkVOVF9UWVBFX0VSUk9SRURfRlJBTUU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0xJTktfRVZFTlRfVFlQRV9FUlJPUkVEX0ZSQU1FX1BFUklPRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fTElOS19FVkVOVF9UWVBFX0VSUk9SRURfRlJBTUVfU0VDT05EU19TVU1NQVJZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9MSU5LX0VWRU5UX1RZUEVfRVJST1JFRF9TWU1CT0xfUEVSSU9EOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90bHZfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdGx2X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3R5cGVfdW5wYWNrKCZ0aGlzLT50eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0xJTktfRVZFTlRfVFlQRV9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3Rsdl9iYXNlX2VuZF9jb3VudF91bmtub3duKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmVuZC51bmtub3duX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZW5kLnVua25vd24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmtub3duXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdGx2X2Jhc2VfZW5kXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZW5kLnVua25vd24gPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuZW5kLnVua25vd24sIHRoaXMtPnUuZW5kLnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9MSU5LX0VWRU5UX1RZUEVfT1JHQU5JWkFUSU9OX1NQRUNJRklDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19saW5rX2V2ZW50X2Jhc2VfdW5wYWNrKCZ0aGlzLT51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9MSU5LX0VWRU5UX1RZUEVfRVJST1JFRF9GUkFNRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fTElOS19FVkVOVF9UWVBFX0VSUk9SRURfRlJBTUVfUEVSSU9EOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9MSU5LX0VWRU5UX1RZUEVfRVJST1JFRF9GUkFNRV9TRUNPTkRTX1NVTU1BUlk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0xJTktfRVZFTlRfVFlQRV9FUlJPUkVEX1NZTUJPTF9QRVJJT0Q6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdGx2X2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdHlwZSB0eXBlOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdHlwZV91bnBhY2soJnR5cGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fTElOS19FVkVOVF9UWVBFX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB1bmtub3duX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB1bmtub3duX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodW5rbm93bl9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9MSU5LX0VWRU5UX1RZUEVfT1JHQU5JWkFUSU9OX1NQRUNJRklDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19saW5rX2V2ZW50X2Jhc2Vfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0xJTktfRVZFTlRfVFlQRV9FUlJPUkVEX0ZSQU1FOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9MSU5LX0VWRU5UX1RZUEVfRVJST1JFRF9GUkFNRV9QRVJJT0Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0xJTktfRVZFTlRfVFlQRV9FUlJPUkVEX0ZSQU1FX1NFQ09ORFNfU1VNTUFSWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fTElOS19FVkVOVF9UWVBFX0VSUk9SRURfU1lNQk9MX1BFUklPRDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdGx2X2Jhc2VfZW5kX2NvdW50X3Vua25vd24oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmFyX2Rlc2NyaXB0b3JfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV92YXJfZGVzY3JpcHRvcl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2JyYW5jaF9wYWNrKHRoaXMtPmJyYW5jaCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCA+IDApICYmICh0aGlzLT51LmVuZC51bmtub3duID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVua25vd25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdmFyX2Rlc2NyaXB0b3JfYmFzZV9lbmRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5lbmQudW5rbm93biwgdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfT0JKRUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX29iamVjdF9wYWNrKHRoaXMtPnUub2JqZWN0LmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfUEFDS0FHRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9wYWNrYWdlX3BhY2sodGhpcy0+dS5wYWNrYWdlLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfTkFNRV9CSU5ESU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX25hbWVfYmluZGluZ19wYWNrKHRoaXMtPnUubmFtZV9iaW5kaW5nLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2F0dHJpYnV0ZV9wYWNrKHRoaXMtPnUuYXR0cmlidXRlLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2FjdGlvbl9wYWNrKHRoaXMtPnUuYWN0aW9uLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZGVmLmxlYWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Zhcl9kZXNjcmlwdG9yX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Zhcl9kZXNjcmlwdG9yX2Jhc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+YnJhbmNoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfQlJBTkNIX09CSkVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfUEFDS0FHRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfTkFNRV9CSU5ESU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfQlJBTkNIX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Zhcl9kZXNjcmlwdG9yX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV92YXJfZGVzY3JpcHRvcl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2JyYW5jaF91bnBhY2soJnRoaXMtPmJyYW5jaCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgPSBiY21vbHRfZXBvbl9vYW1fdmFyX2Rlc2NyaXB0b3JfYmFzZV9lbmRfY291bnRfdW5rbm93bihidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCA+IDApICYmICh0aGlzLT51LmVuZC51bmtub3duID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidW5rbm93blwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV92YXJfZGVzY3JpcHRvcl9iYXNlX2VuZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmVuZC51bmtub3duID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LmVuZC51bmtub3duLCB0aGlzLT51LmVuZC51bmtub3duX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9PQkpFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfb2JqZWN0X3VucGFjaygmdGhpcy0+dS5vYmplY3QubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9QQUNLQUdFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX3BhY2thZ2VfdW5wYWNrKCZ0aGlzLT51LnBhY2thZ2UubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9OQU1FX0JJTkRJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfbmFtZV9iaW5kaW5nX3VucGFjaygmdGhpcy0+dS5uYW1lX2JpbmRpbmcubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlX3VucGFjaygmdGhpcy0+dS5hdHRyaWJ1dGUubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uX3VucGFjaygmdGhpcy0+dS5hY3Rpb24ubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5kZWYubGVhZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV92YXJfZGVzY3JpcHRvcl9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV92YXJfYnJhbmNoIGJyYW5jaDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfYnJhbmNoX3VucGFjaygmYnJhbmNoLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAoYnJhbmNoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdW5rbm93bl9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bl9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHVua25vd25fZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9PQkpFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9QQUNLQUdFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfTkFNRV9CSU5ESU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV92YXJfZGVzY3JpcHRvcl9iYXNlX2VuZF9jb3VudF91bmtub3duKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfYnJhbmNoX3BhY2sodGhpcy0+YnJhbmNoLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+YnJhbmNoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmVuZC51bmtub3duX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZW5kLnVua25vd24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidW5rbm93blwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2VfZW5kXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZW5kLnVua25vd24sIHRoaXMtPnUuZW5kLnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfQlJBTkNIX09CSkVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfb2JqZWN0X3BhY2sodGhpcy0+dS5vYmplY3QubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vYmplY3Qud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub2JqZWN0LndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm9iamVjdC52YWx1ZV9jb3VudCA+IDApICYmICh0aGlzLT51Lm9iamVjdC52YWx1ZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWx1ZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2Vfb2JqZWN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUub2JqZWN0LnZhbHVlLCB0aGlzLT51Lm9iamVjdC52YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9QQUNLQUdFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9wYWNrYWdlX3BhY2sodGhpcy0+dS5wYWNrYWdlLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUucGFja2FnZS53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5wYWNrYWdlLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnBhY2thZ2UudmFsdWVfY291bnQgPiAwKSAmJiAodGhpcy0+dS5wYWNrYWdlLnZhbHVlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbHVlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZV9wYWNrYWdlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUucGFja2FnZS52YWx1ZSwgdGhpcy0+dS5wYWNrYWdlLnZhbHVlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfQlJBTkNIX05BTUVfQklORElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfbmFtZV9iaW5kaW5nX3BhY2sodGhpcy0+dS5uYW1lX2JpbmRpbmcubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5uYW1lX2JpbmRpbmcud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUubmFtZV9iaW5kaW5nLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm5hbWVfYmluZGluZy52YWx1ZV9jb3VudCA+IDApICYmICh0aGlzLT51Lm5hbWVfYmluZGluZy52YWx1ZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWx1ZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2VfbmFtZV9iaW5kaW5nXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUubmFtZV9iaW5kaW5nLnZhbHVlLCB0aGlzLT51Lm5hbWVfYmluZGluZy52YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2F0dHJpYnV0ZV9wYWNrKHRoaXMtPnUuYXR0cmlidXRlLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuYXR0cmlidXRlLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmF0dHJpYnV0ZS53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5hdHRyaWJ1dGUudmFsdWVfY291bnQgPiAwKSAmJiAodGhpcy0+dS5hdHRyaWJ1dGUudmFsdWUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsdWVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX2F0dHJpYnV0ZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmF0dHJpYnV0ZS52YWx1ZSwgdGhpcy0+dS5hdHRyaWJ1dGUudmFsdWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hY3Rpb25fcGFjayh0aGlzLT51LmFjdGlvbi5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmFjdGlvbi53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5hY3Rpb24ud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuYWN0aW9uLnZhbHVlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuYWN0aW9uLnZhbHVlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbHVlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZV9hY3Rpb25cIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5hY3Rpb24udmFsdWUsIHRoaXMtPnUuYWN0aW9uLnZhbHVlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5kZWYubGVhZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuZGVmLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmRlZi53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgICAgICAgICAgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+YnJhbmNoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfQlJBTkNIX09CSkVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzICsgdGhpcy0+dS5vYmplY3QudmFsdWVfY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9QQUNLQUdFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDMgKyB0aGlzLT51LnBhY2thZ2UudmFsdWVfY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9OQU1FX0JJTkRJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMyArIHRoaXMtPnUubmFtZV9iaW5kaW5nLnZhbHVlX2NvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDMgKyB0aGlzLT51LmF0dHJpYnV0ZS52YWx1ZV9jb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfQlJBTkNIX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzICsgdGhpcy0+dS5hY3Rpb24udmFsdWVfY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2JyYW5jaF91bnBhY2soJnRoaXMtPmJyYW5jaCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgPSBiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX2VuZF9jb3VudF91bmtub3duKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmVuZC51bmtub3duX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZW5kLnVua25vd24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmtub3duXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZV9lbmRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5lbmQudW5rbm93biA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmVuZC51bmtub3duX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5lbmQudW5rbm93biwgdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfT0JKRUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9vYmplY3RfdW5wYWNrKCZ0aGlzLT51Lm9iamVjdC5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUub2JqZWN0LndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5vYmplY3Qud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5vYmplY3Qud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm9iamVjdC53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICB0aGlzLT51Lm9iamVjdC52YWx1ZV9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2Vfb2JqZWN0X2NvdW50X3ZhbHVlKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUub2JqZWN0LnZhbHVlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUub2JqZWN0LnZhbHVlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsdWVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX29iamVjdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51Lm9iamVjdC52YWx1ZSA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51Lm9iamVjdC52YWx1ZV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5vYmplY3QudmFsdWUsIHRoaXMtPnUub2JqZWN0LnZhbHVlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51Lm9iamVjdC53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUub2JqZWN0LndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9QQUNLQUdFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9wYWNrYWdlX3VucGFjaygmdGhpcy0+dS5wYWNrYWdlLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5wYWNrYWdlLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5wYWNrYWdlLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUucGFja2FnZS53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUucGFja2FnZS53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICB0aGlzLT51LnBhY2thZ2UudmFsdWVfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX3BhY2thZ2VfY291bnRfdmFsdWUoJnBvc3RMZW5CdWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5wYWNrYWdlLnZhbHVlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUucGFja2FnZS52YWx1ZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbHVlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZV9wYWNrYWdlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUucGFja2FnZS52YWx1ZSA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnBhY2thZ2UudmFsdWVfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUucGFja2FnZS52YWx1ZSwgdGhpcy0+dS5wYWNrYWdlLnZhbHVlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LnBhY2thZ2Uud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LnBhY2thZ2Uud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfQlJBTkNIX05BTUVfQklORElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfbmFtZV9iaW5kaW5nX3VucGFjaygmdGhpcy0+dS5uYW1lX2JpbmRpbmcubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51Lm5hbWVfYmluZGluZy53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUubmFtZV9iaW5kaW5nLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUubmFtZV9iaW5kaW5nLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5uYW1lX2JpbmRpbmcud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5uYW1lX2JpbmRpbmcudmFsdWVfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX25hbWVfYmluZGluZ19jb3VudF92YWx1ZSgmcG9zdExlbkJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm5hbWVfYmluZGluZy52YWx1ZV9jb3VudCA+IDApICYmICh0aGlzLT51Lm5hbWVfYmluZGluZy52YWx1ZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbHVlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZV9uYW1lX2JpbmRpbmdcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5uYW1lX2JpbmRpbmcudmFsdWUgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5uYW1lX2JpbmRpbmcudmFsdWVfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUubmFtZV9iaW5kaW5nLnZhbHVlLCB0aGlzLT51Lm5hbWVfYmluZGluZy52YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5uYW1lX2JpbmRpbmcud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51Lm5hbWVfYmluZGluZy53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hdHRyaWJ1dGVfdW5wYWNrKCZ0aGlzLT51LmF0dHJpYnV0ZS5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuYXR0cmlidXRlLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5hdHRyaWJ1dGUud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+dS5hdHRyaWJ1dGUud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmF0dHJpYnV0ZS53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICB0aGlzLT51LmF0dHJpYnV0ZS52YWx1ZV9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2VfYXR0cmlidXRlX2NvdW50X3ZhbHVlKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuYXR0cmlidXRlLnZhbHVlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuYXR0cmlidXRlLnZhbHVlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFsdWVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX2F0dHJpYnV0ZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmF0dHJpYnV0ZS52YWx1ZSA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmF0dHJpYnV0ZS52YWx1ZV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5hdHRyaWJ1dGUudmFsdWUsIHRoaXMtPnUuYXR0cmlidXRlLnZhbHVlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT51LmF0dHJpYnV0ZS53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuYXR0cmlidXRlLndpZHRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2FjdGlvbl91bnBhY2soJnRoaXMtPnUuYWN0aW9uLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5hY3Rpb24ud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmFjdGlvbi53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LmFjdGlvbi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuYWN0aW9uLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIHRoaXMtPnUuYWN0aW9uLnZhbHVlX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZV9hY3Rpb25fY291bnRfdmFsdWUoJnBvc3RMZW5CdWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5hY3Rpb24udmFsdWVfY291bnQgPiAwKSAmJiAodGhpcy0+dS5hY3Rpb24udmFsdWUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWx1ZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2VfYWN0aW9uXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuYWN0aW9uLnZhbHVlID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuYWN0aW9uLnZhbHVlX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LmFjdGlvbi52YWx1ZSwgdGhpcy0+dS5hY3Rpb24udmFsdWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUuYWN0aW9uLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5hY3Rpb24ud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5kZWYubGVhZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5kZWYud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmRlZi53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LmRlZi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuZGVmLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUuZGVmLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5kZWYud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV92YXJfYnJhbmNoIGJyYW5jaDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfYnJhbmNoX3VucGFjaygmYnJhbmNoLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAoYnJhbmNoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdW5rbm93bl9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bl9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHVua25vd25fZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9PQkpFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB2YWx1ZV9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHZhbHVlX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfUEFDS0FHRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsdWVfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHZhbHVlX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodmFsdWVfZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9OQU1FX0JJTkRJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB2YWx1ZV9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHZhbHVlX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZV9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh2YWx1ZV9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9WQVJfQlJBTkNIX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsdWVfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHZhbHVlX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodmFsdWVfZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX2VuZF9jb3VudF91bmtub3duKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2Vfb2JqZWN0X2NvdW50X3ZhbHVlKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2VfcGFja2FnZV9jb3VudF92YWx1ZShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX25hbWVfYmluZGluZ19jb3VudF92YWx1ZShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX2F0dHJpYnV0ZV9jb3VudF92YWx1ZShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX2FjdGlvbl9jb3VudF92YWx1ZShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X3F1ZXVlX25hbWVfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9xdWV1ZV9uYW1lICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnBvcnRfbnVtYmVyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bGlua19udW1iZXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5xdWV1ZV9udW1iZXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9xdWV1ZV9uYW1lX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9xdWV1ZV9uYW1lICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnBvcnRfbnVtYmVyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bGlua19udW1iZXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5xdWV1ZV9udW1iZXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9xdWV1ZV9uYW1lX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHRfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfdHlwZV9wYWNrKHRoaXMtPm9iamVjdF90eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5sZW5ndGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmxlbmd0aCk7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b2JqZWN0X3R5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfTE9HSUNBTF9MSU5LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5sb2dpY2FsX2xpbmsubGlua19udW1iZXJfY291bnQgPiAwKSAmJiAodGhpcy0+dS5sb2dpY2FsX2xpbmsubGlua19udW1iZXIgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibGlua19udW1iZXJcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X2xvZ2ljYWxfbGlua1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmxvZ2ljYWxfbGluay5saW5rX251bWJlciwgdGhpcy0+dS5sb2dpY2FsX2xpbmsubGlua19udW1iZXJfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfUVVFVUVfTkFNRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X3F1ZXVlX25hbWVfcGFjaygmdGhpcy0+dS5xdWV1ZV9uYW1lLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUucG9ydC5wb3J0X251bWJlcl9jb3VudCA+IDApICYmICh0aGlzLT51LnBvcnQucG9ydF9udW1iZXIgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicG9ydF9udW1iZXJcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X3BvcnRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5wb3J0LnBvcnRfbnVtYmVyLCB0aGlzLT51LnBvcnQucG9ydF9udW1iZXJfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfQUxMX1FVRVVFUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X3F1ZXVlX25hbWVfcGFjaygmdGhpcy0+dS5hbGxfcXVldWVzLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfTkVUV09SS19QT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm5ldHdvcmtfcG9uLnBvbl9udW1iZXJfY291bnQgPiAwKSAmJiAodGhpcy0+dS5uZXR3b3JrX3Bvbi5wb25fbnVtYmVyID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInBvbl9udW1iZXJcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X25ldHdvcmtfcG9uXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUubmV0d29ya19wb24ucG9uX251bWJlciwgdGhpcy0+dS5uZXR3b3JrX3Bvbi5wb25fbnVtYmVyX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX1VTRVJfUE9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS51c2VyX3Bvbi5wb25fbnVtYmVyX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUudXNlcl9wb24ucG9uX251bWJlciA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwb25fbnVtYmVyXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF91c2VyX3BvblwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LnVzZXJfcG9uLnBvbl9udW1iZXIsIHRoaXMtPnUudXNlcl9wb24ucG9uX251bWJlcl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PQkpFQ1RfVFlQRV9GTE9XX0RJUkVDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9mbG93X2RpcmVjdGlvbl9wYWNrKHRoaXMtPnUuZmxvd19kaXJlY3Rpb24uZGlyZWN0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfQlJJREdFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5icmlkZ2UuYnJpZGdlX251bWJlcl9jb3VudCA+IDApICYmICh0aGlzLT51LmJyaWRnZS5icmlkZ2VfbnVtYmVyID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImJyaWRnZV9udW1iZXJcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X2JyaWRnZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmJyaWRnZS5icmlkZ2VfbnVtYmVyLCB0aGlzLT51LmJyaWRnZS5icmlkZ2VfbnVtYmVyX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX0JSSURHRV9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5icmlkZ2VfcG9ydC5wb3J0X251bWJlcl9jb3VudCA+IDApICYmICh0aGlzLT51LmJyaWRnZV9wb3J0LnBvcnRfbnVtYmVyID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInBvcnRfbnVtYmVyXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF9icmlkZ2VfcG9ydFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmJyaWRnZV9wb3J0LnBvcnRfbnVtYmVyLCB0aGlzLT51LmJyaWRnZV9wb3J0LnBvcnRfbnVtYmVyX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHQgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPmxlbmd0aCA+PSAweDAwODApCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy0+bGVuZ3RoOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB1aW50MzJfdCBjb3VudCA9IDM7CisgICAgICAgIHN3aXRjaCAodGhpcy0+b2JqZWN0X3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PQkpFQ1RfVFlQRV9MT0dJQ0FMX0xJTks6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSB0aGlzLT51LmxvZ2ljYWxfbGluay5saW5rX251bWJlcl9jb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfUVVFVUVfTkFNRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX1BPUlQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSB0aGlzLT51LnBvcnQucG9ydF9udW1iZXJfY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX0FMTF9RVUVVRVM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PQkpFQ1RfVFlQRV9ORVRXT1JLX1BPTjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IHRoaXMtPnUubmV0d29ya19wb24ucG9uX251bWJlcl9jb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfVVNFUl9QT046CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSB0aGlzLT51LnVzZXJfcG9uLnBvbl9udW1iZXJfY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX0ZMT1dfRElSRUNUSU9OOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfQlJJREdFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gdGhpcy0+dS5icmlkZ2UuYnJpZGdlX251bWJlcl9jb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfQlJJREdFX1BPUlQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSB0aGlzLT51LmJyaWRnZV9wb3J0LnBvcnRfbnVtYmVyX2NvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF90eXBlX3VucGFjaygmdGhpcy0+b2JqZWN0X3R5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+bGVuZ3RoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPmxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPmxlbmd0aCwgYnVmLT5jdXJyKTsKKyAgICBzd2l0Y2ggKHRoaXMtPm9iamVjdF90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX0xPR0lDQUxfTElOSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLT51LmxvZ2ljYWxfbGluay5saW5rX251bWJlcl9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHRfbG9naWNhbF9saW5rX2NvdW50X2xpbmtfbnVtYmVyKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUubG9naWNhbF9saW5rLmxpbmtfbnVtYmVyX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUubG9naWNhbF9saW5rLmxpbmtfbnVtYmVyID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibGlua19udW1iZXJcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X2xvZ2ljYWxfbGlua1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmxvZ2ljYWxfbGluay5saW5rX251bWJlciA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmxvZ2ljYWxfbGluay5saW5rX251bWJlcl9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5sb2dpY2FsX2xpbmsubGlua19udW1iZXIsIHRoaXMtPnUubG9naWNhbF9saW5rLmxpbmtfbnVtYmVyX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX1FVRVVFX05BTUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9xdWV1ZV9uYW1lX3VucGFjaygmdGhpcy0+dS5xdWV1ZV9uYW1lLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX1BPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5wb3J0LnBvcnRfbnVtYmVyX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF9wb3J0X2NvdW50X3BvcnRfbnVtYmVyKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUucG9ydC5wb3J0X251bWJlcl9jb3VudCA+IDApICYmICh0aGlzLT51LnBvcnQucG9ydF9udW1iZXIgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwb3J0X251bWJlclwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHRfcG9ydFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnBvcnQucG9ydF9udW1iZXIgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5wb3J0LnBvcnRfbnVtYmVyX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LnBvcnQucG9ydF9udW1iZXIsIHRoaXMtPnUucG9ydC5wb3J0X251bWJlcl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PQkpFQ1RfVFlQRV9BTExfUVVFVUVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfcXVldWVfbmFtZV91bnBhY2soJnRoaXMtPnUuYWxsX3F1ZXVlcy52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PQkpFQ1RfVFlQRV9ORVRXT1JLX1BPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLT51Lm5ldHdvcmtfcG9uLnBvbl9udW1iZXJfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X25ldHdvcmtfcG9uX2NvdW50X3Bvbl9udW1iZXIoJnBvc3RMZW5CdWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5uZXR3b3JrX3Bvbi5wb25fbnVtYmVyX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUubmV0d29ya19wb24ucG9uX251bWJlciA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInBvbl9udW1iZXJcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X25ldHdvcmtfcG9uXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUubmV0d29ya19wb24ucG9uX251bWJlciA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51Lm5ldHdvcmtfcG9uLnBvbl9udW1iZXJfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUubmV0d29ya19wb24ucG9uX251bWJlciwgdGhpcy0+dS5uZXR3b3JrX3Bvbi5wb25fbnVtYmVyX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX1VTRVJfUE9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMtPnUudXNlcl9wb24ucG9uX251bWJlcl9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHRfdXNlcl9wb25fY291bnRfcG9uX251bWJlcigmcG9zdExlbkJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnVzZXJfcG9uLnBvbl9udW1iZXJfY291bnQgPiAwKSAmJiAodGhpcy0+dS51c2VyX3Bvbi5wb25fbnVtYmVyID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicG9uX251bWJlclwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHRfdXNlcl9wb25cIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS51c2VyX3Bvbi5wb25fbnVtYmVyID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUudXNlcl9wb24ucG9uX251bWJlcl9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS51c2VyX3Bvbi5wb25fbnVtYmVyLCB0aGlzLT51LnVzZXJfcG9uLnBvbl9udW1iZXJfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfRkxPV19ESVJFQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZmxvd19kaXJlY3Rpb25fdW5wYWNrKCZ0aGlzLT51LmZsb3dfZGlyZWN0aW9uLmRpcmVjdGlvbiwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfQlJJREdFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMtPnUuYnJpZGdlLmJyaWRnZV9udW1iZXJfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X2JyaWRnZV9jb3VudF9icmlkZ2VfbnVtYmVyKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuYnJpZGdlLmJyaWRnZV9udW1iZXJfY291bnQgPiAwKSAmJiAodGhpcy0+dS5icmlkZ2UuYnJpZGdlX251bWJlciA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImJyaWRnZV9udW1iZXJcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X2JyaWRnZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmJyaWRnZS5icmlkZ2VfbnVtYmVyID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuYnJpZGdlLmJyaWRnZV9udW1iZXJfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUuYnJpZGdlLmJyaWRnZV9udW1iZXIsIHRoaXMtPnUuYnJpZGdlLmJyaWRnZV9udW1iZXJfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfQlJJREdFX1BPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5icmlkZ2VfcG9ydC5wb3J0X251bWJlcl9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHRfYnJpZGdlX3BvcnRfY291bnRfcG9ydF9udW1iZXIoJnBvc3RMZW5CdWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5icmlkZ2VfcG9ydC5wb3J0X251bWJlcl9jb3VudCA+IDApICYmICh0aGlzLT51LmJyaWRnZV9wb3J0LnBvcnRfbnVtYmVyID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicG9ydF9udW1iZXJcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X2JyaWRnZV9wb3J0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuYnJpZGdlX3BvcnQucG9ydF9udW1iZXIgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5icmlkZ2VfcG9ydC5wb3J0X251bWJlcl9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5icmlkZ2VfcG9ydC5wb3J0X251bWJlciwgdGhpcy0+dS5icmlkZ2VfcG9ydC5wb3J0X251bWJlcl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT5sZW5ndGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT5sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X3R5cGUgb2JqZWN0X3R5cGU7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfdHlwZV91bnBhY2soJm9iamVjdF90eXBlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgc3dpdGNoIChvYmplY3RfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PQkpFQ1RfVFlQRV9MT0dJQ0FMX0xJTks6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgbGlua19udW1iZXJfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbGlua19udW1iZXJfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChsaW5rX251bWJlcl9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfUVVFVUVfTkFNRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PQkpFQ1RfVFlQRV9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHBvcnRfbnVtYmVyX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHBvcnRfbnVtYmVyX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQocG9ydF9udW1iZXJfZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX0FMTF9RVUVVRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfTkVUV09SS19QT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcG9uX251bWJlcl9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwb25fbnVtYmVyX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQocG9uX251bWJlcl9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfVVNFUl9QT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcG9uX251bWJlcl9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwb25fbnVtYmVyX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQocG9uX251bWJlcl9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfRkxPV19ESVJFQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfQlJJREdFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJyaWRnZV9udW1iZXJfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgYnJpZGdlX251bWJlcl9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKGJyaWRnZV9udW1iZXJfZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX0JSSURHRV9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHBvcnRfbnVtYmVyX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHBvcnRfbnVtYmVyX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQocG9ydF9udW1iZXJfZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X2xvZ2ljYWxfbGlua19jb3VudF9saW5rX251bWJlcihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X3BvcnRfY291bnRfcG9ydF9udW1iZXIoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF9uZXR3b3JrX3Bvbl9jb3VudF9wb25fbnVtYmVyKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHRfdXNlcl9wb25fY291bnRfcG9uX251bWJlcihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X2JyaWRnZV9jb3VudF9icmlkZ2VfbnVtYmVyKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHRfYnJpZGdlX3BvcnRfY291bnRfcG9ydF9udW1iZXIoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjcmlwdG9yX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY3JpcHRvciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19icmFuY2hfcGFjayh0aGlzLT5icmFuY2gsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5icmFuY2gpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5lbmQudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmtub3duXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY3JpcHRvcl9lbmRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5lbmQudW5rbm93biwgdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfTkFNRV9CSU5ESU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF9wYWNrKCZ0aGlzLT51Lm5hbWVfYmluZGluZy5vYmplY3RfY29udGV4dCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2F0dHJpYnV0ZV9wYWNrKHRoaXMtPnUuYXR0cmlidXRlLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCgodWludDY0X3QpIHRoaXMtPnUuYXR0cmlidXRlLmxlYWYgPT0gMHg3RkU1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19hbGFybV9jb2RlX3BhY2sodGhpcy0+dS5hdHRyaWJ1dGUuYWxhcm1fY29kZSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2FjdGlvbl9wYWNrKHRoaXMtPnUuYWN0aW9uLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfT0JKRUNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX1BBQ0tBR0U6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZGVmLmxlYWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY3JpcHRvcl9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjcmlwdG9yICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICBzd2l0Y2ggKHRoaXMtPmJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IHRoaXMtPnUuZW5kLnVua25vd25fY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9OQU1FX0JJTkRJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5uYW1lX2JpbmRpbmcub2JqZWN0X2NvbnRleHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX09CSkVDVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9QQUNLQUdFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NyaXB0b3JfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NyaXB0b3IgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfYnJhbmNoX3VucGFjaygmdGhpcy0+YnJhbmNoLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+YnJhbmNoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NyaXB0b3JfZW5kX2NvdW50X3Vua25vd24oYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5lbmQudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVua25vd25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjcmlwdG9yX2VuZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmVuZC51bmtub3duID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LmVuZC51bmtub3duLCB0aGlzLT51LmVuZC51bmtub3duX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9OQU1FX0JJTkRJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X3VucGFjaygmdGhpcy0+dS5uYW1lX2JpbmRpbmcub2JqZWN0X2NvbnRleHQsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCB3aWR0aCA9IDA7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2F0dHJpYnV0ZV91bnBhY2soJnRoaXMtPnUuYXR0cmlidXRlLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCgodWludDY0X3QpIHRoaXMtPnUuYXR0cmlidXRlLmxlYWYgPT0gMHg3RkU1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJndpZHRoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCB3aWR0aCwgYnVmLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoKCh1aW50NjRfdCkgdGhpcy0+dS5hdHRyaWJ1dGUubGVhZiA9PSAweDdGRTUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2FsYXJtX2NvZGVfdW5wYWNrKCZ0aGlzLT51LmF0dHJpYnV0ZS5hbGFybV9jb2RlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1Ziwgd2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hY3Rpb25fdW5wYWNrKCZ0aGlzLT51LmFjdGlvbi5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX09CSkVDVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9QQUNLQUdFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmRlZi5sZWFmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY3JpcHRvcl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2JyYW5jaCBicmFuY2g7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2JyYW5jaF91bnBhY2soJmJyYW5jaCwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHVua25vd25fZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHVua25vd25fZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh1bmtub3duX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfTkFNRV9CSU5ESU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBsZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX09CSkVDVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9QQUNLQUdFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjcmlwdG9yX2VuZF9jb3VudF91bmtub3duKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2x1ZV9maWVsZF9zZWxlY3RfZW50cnlfcGFjayhiY21vbHRfZXBvbl9vYW1fbHVlX2ZpZWxkX3NlbGVjdF9lbnRyeSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmxheWVyX3NlbGVjdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+ZHdvcmRfb2Zmc2V0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5maWVsZF9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmJpdF9vZmZzZXQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbHVlX2ZpZWxkX3NlbGVjdF9lbnRyeV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2x1ZV9maWVsZF9zZWxlY3RfZW50cnkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5sYXllcl9zZWxlY3QpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmR3b3JkX29mZnNldCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+ZmllbGRfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5iaXRfb2Zmc2V0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2x1ZV9maWVsZF9zZWxlY3RfZW50cnlfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9jbGF1c2VfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2NsYXVzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfZmllbGRfc2VsZWN0X3BhY2sodGhpcy0+ZmllbGRfc2VsZWN0LCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5sb29rdXBfdmFsdWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9vcGVyYXRvcl9wYWNrKHRoaXMtPm9wLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2NsYXVzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9jbGF1c2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X2ZpZWxkX3NlbGVjdF91bnBhY2soJnRoaXMtPmZpZWxkX3NlbGVjdCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoYnVmLCAmdGhpcy0+bG9va3VwX3ZhbHVlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfb3BlcmF0b3JfdW5wYWNrKCZ0aGlzLT5vcCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9jbGF1c2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5kaXJlY3Rpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9mbGFnc19wYWNrKHRoaXMtPmZsYWdzLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnBvcnRfbGluaykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cXVldWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT52aWRfY29zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5yZXNlcnZlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cHJlY2VkZW5jZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2FjdGlvbl9wYWNrKHRoaXMtPmFjdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5jbGF1c2VzX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPmNsYXVzZXNfY291bnQgPiAwKSAmJiAodGhpcy0+Y2xhdXNlcyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjbGF1c2VzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5jbGF1c2VzX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2NsYXVzZV9wYWNrKCZ0aGlzLT5jbGF1c2VzW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGUgKnRoaXMpCit7CisgICAgcmV0dXJuIDEwICsgKDEwICogdGhpcy0+Y2xhdXNlc19jb3VudCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmRpcmVjdGlvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2ZsYWdzX3VucGFjaygmdGhpcy0+ZmxhZ3MsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+cG9ydF9saW5rKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5xdWV1ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnZpZF9jb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnJlc2VydmVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5wcmVjZWRlbmNlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfYWN0aW9uX3VucGFjaygmdGhpcy0+YWN0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmNsYXVzZXNfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+Y2xhdXNlc19jb3VudCA+IDApICYmICh0aGlzLT5jbGF1c2VzID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY2xhdXNlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+Y2xhdXNlcyA9IChiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2NsYXVzZSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+Y2xhdXNlc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2NsYXVzZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+Y2xhdXNlc19jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9jbGF1c2VfdW5wYWNrKCZ0aGlzLT5jbGF1c2VzW2kwXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IGNsYXVzZXNfY291bnQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmNsYXVzZXNfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9jbGF1c2UpICogY2xhdXNlc19jb3VudCk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBjbGF1c2VzX2NvdW50ICogMTApKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX3ZsYW5fcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX3ZsYW4gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdmxhbl90YWcoYnVmLCB0aGlzLT5lcG9uX3ZsYW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV92bGFuX3RhZyhidWYsIHRoaXMtPnVzZXJfdmxhbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bWF4X2FsbG93ZWRfZ3JvdXBzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF92bGFuX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX3ZsYW4gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF92bGFuX3RhZyhidWYsICZ0aGlzLT5lcG9uX3ZsYW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3ZsYW5fdGFnKGJ1ZiwgJnRoaXMtPnVzZXJfdmxhbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bWF4X2FsbG93ZWRfZ3JvdXBzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF92bGFuX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9tYXBwaW5nX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX21hcHBpbmcgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdmxhbl90YWcoYnVmLCB0aGlzLT52bGFuX3RhZykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bGlua19pbmRleCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cXVldWVfaW5kZXgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3ZsYW5fZGVzdGluYXRpb25fbWFwcGluZ191bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX21hcHBpbmcgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF92bGFuX3RhZyhidWYsICZ0aGlzLT52bGFuX3RhZykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bGlua19pbmRleCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+cXVldWVfaW5kZXgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3ZsYW5fZGVzdGluYXRpb25fbWFwcGluZ19zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2Zpcm13YXJlX3RpbWVzdGFtcF9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfZmlybXdhcmVfdGltZXN0YW1wICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnllYXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPm1vbnRoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5kYXkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmhvdXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPm1pbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+c2VjKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19maXJtd2FyZV90aW1lc3RhbXBfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfZmlybXdhcmVfdGltZXN0YW1wICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnllYXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPm1vbnRoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5kYXkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmhvdXIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPm1pbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+c2VjKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19maXJtd2FyZV90aW1lc3RhbXBfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA3KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3J1bGVfZW50cnlfcGFjayhiY21vbHRfZXBvbl9vYW1fcnVsZV9lbnRyeSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5sZWFybmluZ19kb21haW4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnN0YXQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnJpZ2h0X21hc2spKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9maWVsZF9zZWxlY3RfdHlwZV9wYWNrKHRoaXMtPmJpbnNlbGVjdCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmJpbnNlbGVjdCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JJTkFSWV9GSUVMRF9TRUxFQ1RfVFlQRV9TQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfbWFjX3BhY2soJnRoaXMtPnUuc2EudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JJTkFSWV9GSUVMRF9TRUxFQ1RfVFlQRV9EQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfbWFjX3BhY2soJnRoaXMtPnUuZGEudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JJTkFSWV9GSUVMRF9TRUxFQ1RfVFlQRV9TU01fUExVU19JUERBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9zc21faXBfcGFjaygmdGhpcy0+dS5zc21fcGx1c19pcGRhLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CSU5BUllfRklFTERfU0VMRUNUX1RZUEVfUFJPR19GSUVMRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfcHJvZ3JhbW1hYmxlX3BhY2soJnRoaXMtPnUucHJvZ19maWVsZC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQklOQVJZX0ZJRUxEX1NFTEVDVF9UWVBFX0NWTEFOX1ZJRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfY3ZpZF9wYWNrKCZ0aGlzLT51LmN2bGFuX3ZpZC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQklOQVJZX0ZJRUxEX1NFTEVDVF9UWVBFX1NWTEFOX1ZJRF9DVkxBTl9WSUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3N2bGFuX3BsdXNfY3ZsYW5fcGFjaygmdGhpcy0+dS5zdmxhbl92aWRfY3ZsYW5fdmlkLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fcnVsZV9lbnRyeV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fcnVsZV9lbnRyeSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDU7CisgICAgc3dpdGNoICh0aGlzLT5iaW5zZWxlY3QpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CSU5BUllfRklFTERfU0VMRUNUX1RZUEVfU0E6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gOTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CSU5BUllfRklFTERfU0VMRUNUX1RZUEVfREE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gOTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CSU5BUllfRklFTERfU0VMRUNUX1RZUEVfU1NNX1BMVVNfSVBEQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JJTkFSWV9GSUVMRF9TRUxFQ1RfVFlQRV9QUk9HX0ZJRUxEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQklOQVJZX0ZJRUxEX1NFTEVDVF9UWVBFX0NWTEFOX1ZJRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JJTkFSWV9GSUVMRF9TRUxFQ1RfVFlQRV9TVkxBTl9WSURfQ1ZMQU5fVklEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3J1bGVfZW50cnlfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9ydWxlX2VudHJ5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPmxlYXJuaW5nX2RvbWFpbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+c3RhdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+cmlnaHRfbWFzaykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2ZpZWxkX3NlbGVjdF90eXBlX3VucGFjaygmdGhpcy0+Ymluc2VsZWN0LCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+Ymluc2VsZWN0KQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQklOQVJZX0ZJRUxEX1NFTEVDVF9UWVBFX1NBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9tYWNfdW5wYWNrKCZ0aGlzLT51LnNhLnZhbHVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JJTkFSWV9GSUVMRF9TRUxFQ1RfVFlQRV9EQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfbWFjX3VucGFjaygmdGhpcy0+dS5kYS52YWx1ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CSU5BUllfRklFTERfU0VMRUNUX1RZUEVfU1NNX1BMVVNfSVBEQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfc3NtX2lwX3VucGFjaygmdGhpcy0+dS5zc21fcGx1c19pcGRhLnZhbHVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JJTkFSWV9GSUVMRF9TRUxFQ1RfVFlQRV9QUk9HX0ZJRUxEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9wcm9ncmFtbWFibGVfdW5wYWNrKCZ0aGlzLT51LnByb2dfZmllbGQudmFsdWUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQklOQVJZX0ZJRUxEX1NFTEVDVF9UWVBFX0NWTEFOX1ZJRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfY3ZpZF91bnBhY2soJnRoaXMtPnUuY3ZsYW5fdmlkLnZhbHVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JJTkFSWV9GSUVMRF9TRUxFQ1RfVFlQRV9TVkxBTl9WSURfQ1ZMQU5fVklEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9zdmxhbl9wbHVzX2N2bGFuX3VucGFjaygmdGhpcy0+dS5zdmxhbl92aWRfY3ZsYW5fdmlkLnZhbHVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3J1bGVfZW50cnlfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9maWVsZF9zZWxlY3RfdHlwZSBiaW5zZWxlY3Q7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2ZpZWxkX3NlbGVjdF90eXBlX3VucGFjaygmYmluc2VsZWN0LCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAoYmluc2VsZWN0KQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQklOQVJZX0ZJRUxEX1NFTEVDVF9UWVBFX1NBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgOSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JJTkFSWV9GSUVMRF9TRUxFQ1RfVFlQRV9EQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CSU5BUllfRklFTERfU0VMRUNUX1RZUEVfU1NNX1BMVVNfSVBEQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CSU5BUllfRklFTERfU0VMRUNUX1RZUEVfUFJPR19GSUVMRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9CSU5BUllfRklFTERfU0VMRUNUX1RZUEVfQ1ZMQU5fVklEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0JJTkFSWV9GSUVMRF9TRUxFQ1RfVFlQRV9TVkxBTl9WSURfQ1ZMQU5fVklEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfcnVsZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3J1bGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9ydWxlX3R5cGVfcGFjayh0aGlzLT5sZWFmLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+bGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9URVJNSU5BVE9SOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9IRUFERVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5oZWFkZXIucHJpb3JpdHkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfQ0xBVVNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3J1bGVfZmllbGRfc2VsZWN0X3BhY2sodGhpcy0+dS5jbGF1c2UuZmllbGRfc2VsZWN0LCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuY2xhdXNlLmZpZWxkX2luc3RhbmNlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmNsYXVzZS5tc2JfbWFzaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5jbGF1c2UubHNiX21hc2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3J1bGVfb3BlcmF0b3JfcGFjayh0aGlzLT51LmNsYXVzZS5vcGVyYXRvciwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuY2xhdXNlLm1hdGNoX3ZhbHVlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuY2xhdXNlLm1hdGNoX3ZhbHVlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm1hdGNoX3ZhbHVlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfcnVsZV9jbGF1c2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5jbGF1c2UubWF0Y2hfdmFsdWUsIHRoaXMtPnUuY2xhdXNlLm1hdGNoX3ZhbHVlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUlVMRV9UWVBFX1JFU1VMVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9ydWxlX2FjdGlvbl9wYWNrKHRoaXMtPnUucmVzdWx0LnJlc3VsdCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUucmVzdWx0LnBhcmFtZXRlcl9jb3VudCA+IDApICYmICh0aGlzLT51LnJlc3VsdC5wYXJhbWV0ZXIgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicGFyYW1ldGVyXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfcnVsZV9yZXN1bHRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5yZXN1bHQucGFyYW1ldGVyLCB0aGlzLT51LnJlc3VsdC5wYXJhbWV0ZXJfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfRU5UUlk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcnVsZV9lbnRyeV9wYWNrKCZ0aGlzLT51LmVudHJ5LnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9ydWxlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3J1bGUgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+bGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9URVJNSU5BVE9SOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9IRUFERVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfQ0xBVVNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDUgKyB0aGlzLT51LmNsYXVzZS5tYXRjaF92YWx1ZV9jb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfUkVTVUxUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyB0aGlzLT51LnJlc3VsdC5wYXJhbWV0ZXJfY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUlVMRV9UWVBFX0VOVFJZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9ydWxlX2VudHJ5X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmVudHJ5LnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9ydWxlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9ydWxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcnVsZV90eXBlX3VucGFjaygmdGhpcy0+bGVhZiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfVEVSTUlOQVRPUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfSEVBREVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuaGVhZGVyLnByaW9yaXR5KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUlVMRV9UWVBFX0NMQVVTRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9ydWxlX2ZpZWxkX3NlbGVjdF91bnBhY2soJnRoaXMtPnUuY2xhdXNlLmZpZWxkX3NlbGVjdCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmNsYXVzZS5maWVsZF9pbnN0YW5jZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5jbGF1c2UubXNiX21hc2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuY2xhdXNlLmxzYl9tYXNrKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9ydWxlX29wZXJhdG9yX3VucGFjaygmdGhpcy0+dS5jbGF1c2Uub3BlcmF0b3IsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGhpcy0+dS5jbGF1c2UubWF0Y2hfdmFsdWVfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9ydWxlX2NsYXVzZV9jb3VudF9tYXRjaF92YWx1ZShidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5jbGF1c2UubWF0Y2hfdmFsdWVfY291bnQgPiAwKSAmJiAodGhpcy0+dS5jbGF1c2UubWF0Y2hfdmFsdWUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJtYXRjaF92YWx1ZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3J1bGVfY2xhdXNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuY2xhdXNlLm1hdGNoX3ZhbHVlID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuY2xhdXNlLm1hdGNoX3ZhbHVlX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5jbGF1c2UubWF0Y2hfdmFsdWUsIHRoaXMtPnUuY2xhdXNlLm1hdGNoX3ZhbHVlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUlVMRV9UWVBFX1JFU1VMVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9ydWxlX2FjdGlvbl91bnBhY2soJnRoaXMtPnUucmVzdWx0LnJlc3VsdCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0aGlzLT51LnJlc3VsdC5wYXJhbWV0ZXJfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9ydWxlX3Jlc3VsdF9jb3VudF9wYXJhbWV0ZXIoYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUucmVzdWx0LnBhcmFtZXRlcl9jb3VudCA+IDApICYmICh0aGlzLT51LnJlc3VsdC5wYXJhbWV0ZXIgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwYXJhbWV0ZXJcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9ydWxlX3Jlc3VsdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnJlc3VsdC5wYXJhbWV0ZXIgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5yZXN1bHQucGFyYW1ldGVyX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5yZXN1bHQucGFyYW1ldGVyLCB0aGlzLT51LnJlc3VsdC5wYXJhbWV0ZXJfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfRU5UUlk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcnVsZV9lbnRyeV91bnBhY2soJnRoaXMtPnUuZW50cnkudmFsdWUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9ydWxlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9ydWxlX3R5cGUgbGVhZjsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9ydWxlX3R5cGVfdW5wYWNrKCZsZWFmLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAobGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9URVJNSU5BVE9SOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9IRUFERVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUlVMRV9UWVBFX0NMQVVTRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXRjaF92YWx1ZV9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG1hdGNoX3ZhbHVlX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQobWF0Y2hfdmFsdWVfZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUlVMRV9UWVBFX1JFU1VMVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwYXJhbWV0ZXJfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQocGFyYW1ldGVyX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9FTlRSWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9ydWxlX2VudHJ5X3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9ydWxlX2NsYXVzZV9jb3VudF9tYXRjaF92YWx1ZShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9ydWxlX3Jlc3VsdF9jb3VudF9wYXJhbWV0ZXIoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdW5pX3NoYXBlcl9wYWNrKGJjbW9sdF9lcG9uX29hbV91bmlfc2hhcGVyICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnF1ZXVlX2JpdG1hcCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnNoYXBlX3JhdGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5idXJzdF9zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3VuaV9zaGFwZXJfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV91bmlfc2hhcGVyICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnF1ZXVlX2JpdG1hcCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPnNoYXBlX3JhdGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5idXJzdF9zaXplKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3VuaV9zaGFwZXJfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF92ZXJzaW9uX251bWJlcl9wYWNrKGJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF92ZXJzaW9uX251bWJlciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPm1ham9yKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5taW5vcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnBhdGNoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2V4dGVuZGVkX3ZlcnNpb25fbnVtYmVyX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZXh0ZW5kZWRfdmVyc2lvbl9udW1iZXIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5tYWpvcikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bWlub3IpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5wYXRjaCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF92ZXJzaW9uX251bWJlcl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZXh0ZW5kZWRfbG9hZF9sYWJlbF9wYWNrKGJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF9sb2FkX2xhYmVsICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX21hdHVyaXR5X3BhY2sodGhpcy0+bWF0dXJpdHksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZXh0ZW5kZWRfdmVyc2lvbl9udW1iZXJfcGFjaygmdGhpcy0+dmVyc2lvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2V4dGVuZGVkX2xvYWRfbGFiZWxfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF9sb2FkX2xhYmVsICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX21hdHVyaXR5X3VucGFjaygmdGhpcy0+bWF0dXJpdHksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZXh0ZW5kZWRfdmVyc2lvbl9udW1iZXJfdW5wYWNrKCZ0aGlzLT52ZXJzaW9uLCBidWYsIGV4dHJhX21lbSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF9sb2FkX2xhYmVsX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fZmlybXdhcmVfcGFjayhiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Zpcm13YXJlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmxlZ2FjeV92ZXJzaW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF9sb2FkX2xhYmVsX3BhY2soJnRoaXMtPm5ld192ZXJzaW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5zdHJlYW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5yZXZpc2lvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPmNyYykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2Zpcm13YXJlX3RpbWVzdGFtcF9wYWNrKCZ0aGlzLT50aW1lc3RhbXAsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fZmlybXdhcmVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fZmlybXdhcmUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bGVnYWN5X3ZlcnNpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2V4dGVuZGVkX2xvYWRfbGFiZWxfdW5wYWNrKCZ0aGlzLT5uZXdfdmVyc2lvbiwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5zdHJlYW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5yZXZpc2lvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmNyYykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2Zpcm13YXJlX3RpbWVzdGFtcF91bnBhY2soJnRoaXMtPnRpbWVzdGFtcCwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Zpcm13YXJlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMjYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9maWxlX3R5cGVfcGFjayh0aGlzLT5maWxlX3R5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5maWxlX3R5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9GSUxFX1RZUEVfQk9PVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fZmlybXdhcmVfcGFjaygmdGhpcy0+dS5ib290LmluZm8sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0ZJTEVfVFlQRV9BUFBfTUFJTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fZmlybXdhcmVfcGFjaygmdGhpcy0+dS5hcHBfbWFpbi5pbmZvLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9GSUxFX1RZUEVfQVBQX0JBQ0tVUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fZmlybXdhcmVfcGFjaygmdGhpcy0+dS5hcHBfYmFja3VwLmluZm8sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Jhc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+ZmlsZV90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRklMRV9UWVBFX0JPT1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRklMRV9UWVBFX0FQUF9NQUlOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0ZJTEVfVFlQRV9BUFBfQkFDS1VQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2ZpbGVfaW5mb19iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZmlsZV90eXBlX3VucGFjaygmdGhpcy0+ZmlsZV90eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+ZmlsZV90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRklMRV9UWVBFX0JPT1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Zpcm13YXJlX3VucGFjaygmdGhpcy0+dS5ib290LmluZm8sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRklMRV9UWVBFX0FQUF9NQUlOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2ZpbGVfaW5mb19maXJtd2FyZV91bnBhY2soJnRoaXMtPnUuYXBwX21haW4uaW5mbywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9GSUxFX1RZUEVfQVBQX0JBQ0tVUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fZmlybXdhcmVfdW5wYWNrKCZ0aGlzLT51LmFwcF9iYWNrdXAuaW5mbywgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZmlsZV90eXBlIGZpbGVfdHlwZTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9maWxlX3R5cGVfdW5wYWNrKCZmaWxlX3R5cGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChmaWxlX3R5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9GSUxFX1RZUEVfQk9PVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDI2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRklMRV9UWVBFX0FQUF9NQUlOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMjYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9GSUxFX1RZUEVfQVBQX0JBQ0tVUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDI2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2NfYml0X2xvYWRfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2NfYml0X2xvYWQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5pZHgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnZhbHVlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX2JpdF9sb2FkX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2NfYml0X2xvYWQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5pZHgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnZhbHVlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX2JpdF9sb2FkX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19iaXRfbG9hZGluZ19wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19iaXRfbG9hZGluZyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGkwOworICAgIGZvciAoaTAgPSAwOyBpMCA8IDMyOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2NfYml0X2xvYWRfcGFjaygmdGhpcy0+bG9hZFtpMF0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2NfYml0X2xvYWRpbmdfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19iaXRfbG9hZGluZyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQzMl90IGkwOworICAgIGZvciAoaTAgPSAwOyBpMCA8IDMyOyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2NfYml0X2xvYWRfdW5wYWNrKCZ0aGlzLT5sb2FkW2kwXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX2JpdF9sb2FkaW5nX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNjQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19zdGF0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmlkeCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT52YWx1ZV9jb3VudCA+IDApICYmICh0aGlzLT52YWx1ZSA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YWx1ZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19zdGF0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnZhbHVlLCB0aGlzLT52YWx1ZV9jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdCAqdGhpcykKK3sKKyAgICByZXR1cm4gMiArIHRoaXMtPnZhbHVlX2NvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+aWR4KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICB0aGlzLT52YWx1ZV9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19zdGF0X2NvdW50X3ZhbHVlKGJ1Zik7CisgICAgaWYgKCh0aGlzLT52YWx1ZV9jb3VudCA+IDApICYmICh0aGlzLT52YWx1ZSA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhbHVlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+dmFsdWUgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dmFsdWVfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT52YWx1ZSwgdGhpcy0+dmFsdWVfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MzJfdCB2YWx1ZV9lbGVtX2NvdW50ID0gMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZV9lbGVtX2NvdW50ICs9IDE7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHZhbHVlX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfY291bnRfdmFsdWUoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5X3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJwcmlvcml0eSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+bGV2ZWwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPndlaWdodCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cXVldWVfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+cXVldWVfY291bnQgPiAwKSAmJiAodGhpcy0+cXVldWVfc2l6ZXMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicXVldWVfc2l6ZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnF1ZXVlX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnF1ZXVlX3NpemVzW2kwXSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJwcmlvcml0eV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5ICp0aGlzKQoreworICAgIHJldHVybiAzICsgKDIgKiB0aGlzLT5xdWV1ZV9jb3VudCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YycHJpb3JpdHlfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YycHJpb3JpdHkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmxldmVsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT53ZWlnaHQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnF1ZXVlX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPnF1ZXVlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnF1ZXVlX3NpemVzID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicXVldWVfc2l6ZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnF1ZXVlX3NpemVzID0gKHVpbnQxNl90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5xdWV1ZV9jb3VudCAqIHNpemVvZih1aW50MTZfdCkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+cXVldWVfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+cXVldWVfc2l6ZXNbaTBdKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YycHJpb3JpdHlfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBxdWV1ZV9jb3VudDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmcXVldWVfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDE2X3QpICogcXVldWVfY291bnQpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgcXVldWVfY291bnQgKiAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJiYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJiYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnN1YnR5cGVfcGFjayh0aGlzLT5zdWJ0eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+c3VidHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19RVUVVRV9DT05GSUdfVjJTVUJUWVBFX0hFQURFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfcmVwb3J0X21vZGVfcGFjayh0aGlzLT51LmhlYWRlci5yZXBvcnRfY29uZmlnLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfUVVFVUVfQ09ORklHX1YyU1VCVFlQRV9MSU5LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5saW5rLnByaW9yaXR5X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUubGluay5wcmlvcml0eV9jb3VudCA+IDApICYmICh0aGlzLT51LmxpbmsucHJpb3JpdGllcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwcmlvcml0aWVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJiYXNlX2xpbmtcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5saW5rLnByaW9yaXR5X2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5X3BhY2soJnRoaXMtPnUubGluay5wcmlvcml0aWVzW2kwXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19RVUVVRV9DT05GSUdfVjJTVUJUWVBFX1BPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnBvcnQucHJpb3JpdHlfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5wb3J0LnByaW9yaXR5X2NvdW50ID4gMCkgJiYgKHRoaXMtPnUucG9ydC5wcmlvcml0aWVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInByaW9yaXRpZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MmJhc2VfcG9ydFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LnBvcnQucHJpb3JpdHlfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YycHJpb3JpdHlfcGFjaygmdGhpcy0+dS5wb3J0LnByaW9yaXRpZXNbaTFdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX1FVRVVFX0NPTkZJR19WMlNVQlRZUEVfVEVSTUlOQVRPUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MmJhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJiYXNlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICBzd2l0Y2ggKHRoaXMtPnN1YnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfUVVFVUVfQ09ORklHX1YyU1VCVFlQRV9IRUFERVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfUVVFVUVfQ09ORklHX1YyU1VCVFlQRV9MSU5LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmxpbmsucHJpb3JpdHlfY291bnQgPiAwKSAmJiAodGhpcy0+dS5saW5rLnByaW9yaXRpZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicHJpb3JpdHlfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MmJhc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmxpbmsucHJpb3JpdHlfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmxpbmsucHJpb3JpdGllc1tpMF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfUVVFVUVfQ09ORklHX1YyU1VCVFlQRV9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxOworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnBvcnQucHJpb3JpdHlfY291bnQgPiAwKSAmJiAodGhpcy0+dS5wb3J0LnByaW9yaXRpZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicHJpb3JpdHlfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MmJhc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LnBvcnQucHJpb3JpdHlfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnBvcnQucHJpb3JpdGllc1tpMV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfUVVFVUVfQ09ORklHX1YyU1VCVFlQRV9URVJNSU5BVE9SOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YyYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJiYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnN1YnR5cGVfdW5wYWNrKCZ0aGlzLT5zdWJ0eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+c3VidHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19RVUVVRV9DT05GSUdfVjJTVUJUWVBFX0hFQURFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfcmVwb3J0X21vZGVfdW5wYWNrKCZ0aGlzLT51LmhlYWRlci5yZXBvcnRfY29uZmlnLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfUVVFVUVfQ09ORklHX1YyU1VCVFlQRV9MSU5LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5saW5rLnByaW9yaXR5X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUubGluay5wcmlvcml0eV9jb3VudCA+IDApICYmICh0aGlzLT51LmxpbmsucHJpb3JpdGllcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInByaW9yaXRpZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MmJhc2VfbGlua1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmxpbmsucHJpb3JpdGllcyA9IChiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmxpbmsucHJpb3JpdHlfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJwcmlvcml0eSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5saW5rLnByaW9yaXR5X2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5X3VucGFjaygmdGhpcy0+dS5saW5rLnByaW9yaXRpZXNbaTBdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfUVVFVUVfQ09ORklHX1YyU1VCVFlQRV9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTE7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5wb3J0LnByaW9yaXR5X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUucG9ydC5wcmlvcml0eV9jb3VudCA+IDApICYmICh0aGlzLT51LnBvcnQucHJpb3JpdGllcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInByaW9yaXRpZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MmJhc2VfcG9ydFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnBvcnQucHJpb3JpdGllcyA9IChiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnBvcnQucHJpb3JpdHlfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJwcmlvcml0eSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5wb3J0LnByaW9yaXR5X2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5X3VucGFjaygmdGhpcy0+dS5wb3J0LnByaW9yaXRpZXNbaTFdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfUVVFVUVfQ09ORklHX1YyU1VCVFlQRV9URVJNSU5BVE9SOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJiYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3Yyc3VidHlwZSBzdWJ0eXBlOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJzdWJ0eXBlX3VucGFjaygmc3VidHlwZSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHN1YnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfUVVFVUVfQ09ORklHX1YyU1VCVFlQRV9IRUFERVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX1FVRVVFX0NPTkZJR19WMlNVQlRZUEVfTElOSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IHByaW9yaXR5X2NvdW50OworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmcHJpb3JpdHlfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJwcmlvcml0eSkgKiBwcmlvcml0eV9jb3VudCk7CisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgcHJpb3JpdHlfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YycHJpb3JpdHlfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfUVVFVUVfQ09ORklHX1YyU1VCVFlQRV9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgcHJpb3JpdHlfY291bnQ7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZwcmlvcml0eV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5KSAqIHByaW9yaXR5X2NvdW50KTsKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCBwcmlvcml0eV9jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJwcmlvcml0eV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19RVUVVRV9DT05GSUdfVjJTVUJUWVBFX1RFUk1JTkFUT1I6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3NlcXVlbmNlX251bWJlcl9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfc2VxdWVuY2VfbnVtYmVyICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDE2X3QgcmV0ID0gMDsKKyAgICByZXQgfD0gKCh0aGlzLT5lbmRfb2Zfc2VxdWVuY2UgJiAweDAwMDEpIDw8IDE1KTsKKyAgICByZXQgfD0gKHRoaXMtPnNlcXVlbmNlX251bWJlciAmIDB4N0ZGRik7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHJldCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfc2VxdWVuY2VfbnVtYmVyX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3NlcXVlbmNlX251bWJlciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IHZhbDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdmFsKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICB0aGlzLT5lbmRfb2Zfc2VxdWVuY2UgPSAoKHZhbCA+PiAxNSkgJiAweDAwMDEpOworICAgIHRoaXMtPnNlcXVlbmNlX251bWJlciA9ICh2YWwgJiAweDdGRkYpOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3NlcXVlbmNlX251bWJlcl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X2Nsb2NrX3RyYW5zcG9ydF9jb25maWdfcGFjayhiY21vbHRfZXBvbl9vYW1fb251X2Nsb2NrX3RyYW5zcG9ydF9jb25maWcgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jbG9ja190cmFuc3BvcnRfa2V5X3BhY2sodGhpcy0+a2V5LCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+cmVfaW5pdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT50b2RfZW5hYmxlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPm9uZV9wcHNfZW5hYmxlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfczMyKGJ1ZiwgdGhpcy0+b25lX3Bwc19vZmZzZXQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5yb3VuZF90cmlwX3RpbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5vbmVfcHBzX2hhbGZfcGVyaW9kKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9jbG9ja190cmFuc3BvcnRfY29uZmlnX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb251X2Nsb2NrX3RyYW5zcG9ydF9jb25maWcgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jbG9ja190cmFuc3BvcnRfa2V5X3VucGFjaygmdGhpcy0+a2V5LCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woYnVmLCAmdGhpcy0+cmVfaW5pdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT50b2RfZW5hYmxlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPm9uZV9wcHNfZW5hYmxlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9zMzIoYnVmLCAmdGhpcy0+b25lX3Bwc19vZmZzZXQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5yb3VuZF90cmlwX3RpbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5vbmVfcHBzX2hhbGZfcGVyaW9kKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9jbG9ja190cmFuc3BvcnRfY29uZmlnX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9wb3J0X2luZm9fcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9wb3J0X2luZm8gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5wb3J0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5ncm91cF9saW1pdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+ZmNfbGltaXQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmFjdGlvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnVwX2Vwb25fdmlkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dXBfdW5pX3ZpZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dXBfbGluaykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+ZG5xKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51cHEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9wb3J0X2luZm9fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3BvcnRfaW5mbyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnBvcnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPmdyb3VwX2xpbWl0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5mY19saW1pdCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+YWN0aW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dXBfZXBvbl92aWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51cF91bmlfdmlkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51cF9saW5rKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5kbnEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnVwcSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3BvcnRfaW5mb19zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDExKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5faW5mb19wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX2luZm8gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPmlkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5kbl9saW5rKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kb21haW5fb3B0aW9uX3BhY2sodGhpcy0+b3B0aW9ucywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9mb3J3YXJkX3F1YWxpZmllcl9wYWNrKHRoaXMtPmZ3ZF9xdWFsLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnJlc2VydmVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5hY3Rpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5kbl9lcG9uX3ZpZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmRuX3VuaV92aWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPm51bV9wb3J0KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPm51bV9wb3J0ID4gMCkgJiYgKHRoaXMtPnBvcnRfaW5mbyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwb3J0X2luZm9cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9pbmZvXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPm51bV9wb3J0OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9wb3J0X2luZm9fcGFjaygmdGhpcy0+cG9ydF9pbmZvW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9pbmZvX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX2luZm8gKnRoaXMpCit7CisgICAgcmV0dXJuIDEyICsgKDExICogdGhpcy0+bnVtX3BvcnQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9pbmZvX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9pbmZvICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+ZG5fbGluaykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZG9tYWluX29wdGlvbl91bnBhY2soJnRoaXMtPm9wdGlvbnMsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZm9yd2FyZF9xdWFsaWZpZXJfdW5wYWNrKCZ0aGlzLT5md2RfcXVhbCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5yZXNlcnZlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+YWN0aW9uKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+ZG5fZXBvbl92aWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5kbl91bmlfdmlkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5udW1fcG9ydCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5udW1fcG9ydCA+IDApICYmICh0aGlzLT5wb3J0X2luZm8gPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwb3J0X2luZm9cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9pbmZvXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnBvcnRfaW5mbyA9IChiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9wb3J0X2luZm8gKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPm51bV9wb3J0ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3BvcnRfaW5mbykpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bnVtX3BvcnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3BvcnRfaW5mb191bnBhY2soJnRoaXMtPnBvcnRfaW5mb1tpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX2luZm9fc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBudW1fcG9ydDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbnVtX3BvcnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5fcG9ydF9pbmZvKSAqIG51bV9wb3J0KTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIG51bV9wb3J0ICogMTEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9yZWNvcmRfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9yZWNvcmQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPm51bV9kb21haW5zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPm51bV9kb21haW5zID4gMCkgJiYgKHRoaXMtPmRvbWFpbiA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJkb21haW5cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9yZWNvcmRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+bnVtX2RvbWFpbnM7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX2luZm9fcGFjaygmdGhpcy0+ZG9tYWluW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9yZWNvcmRfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5fcmVjb3JkICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICB1aW50MzJfdCBpMDsKKyAgICBpZiAoKHRoaXMtPm51bV9kb21haW5zID4gMCkgJiYgKHRoaXMtPmRvbWFpbiA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJudW1fZG9tYWluc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3JlY29yZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPm51bV9kb21haW5zOyBpMCsrKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5faW5mb19nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+ZG9tYWluW2kwXSk7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9yZWNvcmRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3JlY29yZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bnVtX2RvbWFpbnMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+bnVtX2RvbWFpbnMgPiAwKSAmJiAodGhpcy0+ZG9tYWluID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZG9tYWluXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5fcmVjb3JkXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPmRvbWFpbiA9IChiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9pbmZvICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5udW1fZG9tYWlucyAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9pbmZvKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5udW1fZG9tYWluczsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5faW5mb191bnBhY2soJnRoaXMtPmRvbWFpbltpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3JlY29yZF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IG51bV9kb21haW5zOworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbnVtX2RvbWFpbnMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5faW5mbykgKiBudW1fZG9tYWlucyk7CisgICAgZm9yIChpMCA9IDA7IGkwIDwgbnVtX2RvbWFpbnM7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX2luZm9fc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2F0dHJpYnV0ZV9wYWNrKHRoaXMtPmxlYWYsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPndpZHRoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT53aWR0aCk7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+bGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MVUVfRklFTERfU0VMRUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUubHVlX2ZpZWxkX3NlbGVjdC5pZHgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2x1ZV9maWVsZF9zZWxlY3RfZW50cnlfcGFjaygmdGhpcy0+dS5sdWVfZmllbGRfc2VsZWN0LmRlZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVTX1RYX09LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnN0ZF9tYWNfZnJhbWVzX3R4X29rLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfU0lOR0xFX0NPTExfRlJBTUVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnN0ZF9tYWNfc2luZ2xlX2NvbGxfZnJhbWVzLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTVVMVElQTEVfQ09MTF9GUkFNRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUuc3RkX21hY19tdWx0aXBsZV9jb2xsX2ZyYW1lcy52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5zdGRfbWFjX2ZyYW1lc19yeF9vay52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZDU19FUlI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUuc3RkX21hY19mY3NfZXJyLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQUxJR05fRVJSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnN0ZF9tYWNfYWxpZ25fZXJyLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfT0NURVRTX1RYX09LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnN0ZF9tYWNfb2N0ZXRzX3R4X29rLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTEFURV9DT0xMSVNJT05TOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnN0ZF9tYWNfbGF0ZV9jb2xsaXNpb25zLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRVhDRVNTSVZFX0NPTExJU0lPTlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUuc3RkX21hY19leGNlc3NpdmVfY29sbGlzaW9ucy52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX09DVEVUU19SWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5zdGRfbWFjX29jdGV0c19yeF9vay52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX01DQVNUX0ZSQU1FU19UWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5zdGRfbWFjX21jYXN0X2ZyYW1lc190eF9vay52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0JDQVNUX0ZSQU1FU19UWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5zdGRfbWFjX2JjYXN0X2ZyYW1lc190eF9vay52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX01DQVNUX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5zdGRfbWFjX21jYXN0X2ZyYW1lc19yeF9vay52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0JDQVNUX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5zdGRfbWFjX2JjYXN0X2ZyYW1lc19yeF9vay52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0lOX1JBTkdFX0xFTl9FUlI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUuc3RkX21hY19pbl9yYW5nZV9sZW5fZXJyLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVfVE9PX0xPTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUuc3RkX21hY19mcmFtZV90b29fbG9uZy52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0VOQUJMRV9TVEFUVVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5zdGRfbWFjX2VuYWJsZV9zdGF0dXMuZW5hYmxlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfUEhZX1NZTUJPTF9FUlJfRFVSSU5HX0NBUlJJRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUuc3RkX3BoeV9zeW1ib2xfZXJyX2R1cmluZ19jYXJyaWVyLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9QQVVTRV9UWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5zdGRfbWFjX2N0cmxfcGF1c2VfdHgudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX1BBVVNFX1JYOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnN0ZF9tYWNfY3RybF9wYXVzZV9yeC52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfT0FNX0xPQ0FMX0VSUl9GUkFNRV9TRUNTX0VWRU5UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnN0ZF9vYW1fbG9jYWxfZXJyX2ZyYW1lX3NlY3NfZXZlbnQudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX09BTV9FTVVMX0NSQzhFUlI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUuc3RkX29hbV9lbXVsX2NyYzhlcnIudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfTUFDX0NUUkxfRlJBTUVTX1RYOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnN0ZF9tcGNwX21hY19jdHJsX2ZyYW1lc190eC52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9NQUNfQ1RSTF9GUkFNRVNfUlg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUuc3RkX21wY3BfbWFjX2N0cmxfZnJhbWVzX3J4LnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX1JFR19BQ0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUuc3RkX21wY3BfdHhfcmVnX2Fjay52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9SRUdfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5zdGRfbXBjcF90eF9yZWdfcmVxdWVzdC52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9SRVBPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUuc3RkX21wY3BfdHhfcmVwb3J0LnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX0dBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUuc3RkX21wY3BfcnhfZ2F0ZS52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9SRUdJU1RFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5zdGRfbXBjcF9yeF9yZWdpc3Rlci52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9EWU5fTEVBUk5fVEJMX1NJWkU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZHluX2xlYXJuX3RibF9zaXplLnRhYmxlX3NpemUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRFlOX0xFQVJOX0FHRV9MSU1JVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5keW5fbGVhcm5fYWdlX2xpbWl0LmFnZV9saW1pdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5yeF91bmljYXN0X2ZyYW1lcy52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS50eF91bmljYXN0X2ZyYW1lcy52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRV9UT09fU0hPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucnhfZnJhbWVfdG9vX3Nob3J0LnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FNjQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucnhfZnJhbWU2NC52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTY1VE8xMjc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucnhfZnJhbWU2NXRvMTI3LnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMTI4VE8yNTU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucnhfZnJhbWUxMjh0bzI1NS52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTI1NlRPNTExOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnJ4X2ZyYW1lMjU2dG81MTEudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUU1MTJUTzEwMjM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucnhfZnJhbWU1MTJ0bzEwMjMudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxMDI0VE8xNTE4OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnJ4X2ZyYW1lMTAyNHRvMTUxOC52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTE1MTlQTFVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnJ4X2ZyYW1lMTUxOXBsdXMudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUU2NDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS50eF9mcmFtZTY0LnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FNjVUTzEyNzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS50eF9mcmFtZTY1dG8xMjcudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUUxMjhUTzI1NToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS50eF9mcmFtZTEyOHRvMjU1LnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMjU2VE81MTE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUudHhfZnJhbWUyNTZ0bzUxMS52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTUxMlRPMTAyMzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS50eF9mcmFtZTUxMnRvMTAyMy52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTEwMjRUTzE1MTg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUudHhfZnJhbWUxMDI0dG8xNTE4LnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMTUxOVBMVVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUudHhfZnJhbWUxNTE5cGx1cy52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9ERUxBWV9USFJFU0hPTEQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS50eF9kZWxheV90aHJlc2hvbGQuZGVsYXlfdGhyZXNob2xkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0RFTEFZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnR4X2RlbGF5LmRlbGF5KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FU19EUk9QUEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnR4X2ZyYW1lc19kcm9wcGVkLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX0RST1BQRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUudHhfYnl0ZXNfZHJvcHBlZC52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19ERUxBWUVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnR4X2J5dGVzX2RlbGF5ZWQudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfQllURVNfVU5VU0VEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnR4X2J5dGVzX3VudXNlZC52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9ERUxBWV9USFJFU0hPTEQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5yeF9kZWxheV90aHJlc2hvbGQuZGVsYXlfdGhyZXNob2xkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0RFTEFZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnJ4X2RlbGF5LmRlbGF5KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FU19EUk9QUEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnJ4X2ZyYW1lc19kcm9wcGVkLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0JZVEVTX0RST1BQRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U2NChidWYsIHRoaXMtPnUucnhfYnl0ZXNfZHJvcHBlZC52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9CWVRFU19ERUxBWUVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnJ4X2J5dGVzX2RlbGF5ZWQudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9TVEFUX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5wb3J0X3N0YXRfdGhyZXNob2xkLnN0YXRpc3RpY19pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUucG9ydF9zdGF0X3RocmVzaG9sZC5yaXNpbmdfdGhyZXNob2xkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5wb3J0X3N0YXRfdGhyZXNob2xkLmZhbGxpbmdfdGhyZXNob2xkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xJTktfU1RBVF9USFJFU0hPTEQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUubGlua19zdGF0X3RocmVzaG9sZC5zdGF0aXN0aWNfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51Lmxpbmtfc3RhdF90aHJlc2hvbGQucmlzaW5nX3RocmVzaG9sZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUubGlua19zdGF0X3RocmVzaG9sZC5mYWxsaW5nX3RocmVzaG9sZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FTkNSWVBUX0tFWV9FWFBJUllfVElNRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5lbmNyeXB0X2tleV9leHBpcnlfdGltZS50aW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xFTl9FUlJPUl9ESVNDQVJEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUubGVuX2Vycm9yX2Rpc2NhcmQubGVuX2Vycm9yX2Rpc2NhcmQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRFlOX01BQ19UQkw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JFUE9SVF9USFJFU0hPTERTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy50aHJlc2hvbGRzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMudGhyZXNob2xkcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ0aHJlc2hvbGRzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfcmVwb3J0X3RocmVzaG9sZHNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy50aHJlc2hvbGRzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMudGhyZXNob2xkc1tpMF0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1ZMQU5fRVRIRVJUWVBFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnZsYW5fZXRoZXJ0eXBlLnZsYW5fZXRoZXJfdHlwZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT51LnZsYW5fZXRoZXJ0eXBlLnVzZV9mb3JfdXBzdHJlYW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS52bGFuX2V0aGVydHlwZS51c2VfZm9yX2Rvd25zdHJlYW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9DQVBBQklMSVRZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnBvcnRfY2FwYWJpbGl0eS5jdXJyZW50X2NhcHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnBvcnRfY2FwYWJpbGl0eS5waHlzaWNhbF9jYXBzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX05FV19ETl9GSUxURVJfVEJMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5uZXdfZG5fZmlsdGVyX3RibC5ydWxlc19jb3VudCA+IDApICYmICh0aGlzLT51Lm5ld19kbl9maWx0ZXJfdGJsLnJ1bGVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJ1bGVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfbmV3X2RuX2ZpbHRlcl90YmxcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5uZXdfZG5fZmlsdGVyX3RibC5ydWxlc19jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9wYWNrKCZ0aGlzLT51Lm5ld19kbl9maWx0ZXJfdGJsLnJ1bGVzW2kxXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ORVdfVVBfRklMVEVSX1RCTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMjsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUubmV3X3VwX2ZpbHRlcl90YmwucnVsZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5uZXdfdXBfZmlsdGVyX3RibC5ydWxlcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJydWxlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX25ld191cF9maWx0ZXJfdGJsXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUubmV3X3VwX2ZpbHRlcl90YmwucnVsZXNfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfcGFjaygmdGhpcy0+dS5uZXdfdXBfZmlsdGVyX3RibC5ydWxlc1tpMl0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQVJQX1JFUExJQ0FURV9ERVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmFycF9yZXBsaWNhdGVfZGVzdC5kZXN0aW5hdGlvbl9iaXRtYXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTEFDUF9ERVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmxhY3BfZGVzdC5kZXN0aW5hdGlvbl9iaXRtYXApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfT05VX0lHTVBfVkxBTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkzOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X2lnbXBfdmxhbi5hY3Rpb25fZm9yX3VubWFuX2dycCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5vbnVfaWdtcF92bGFuLnZsYW5zX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUub251X2lnbXBfdmxhbi52bGFuc19jb3VudCA+IDApICYmICh0aGlzLT51Lm9udV9pZ21wX3ZsYW4udmxhbnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmxhbnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9vbnVfaWdtcF92bGFuXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IHRoaXMtPnUub251X2lnbXBfdmxhbi52bGFuc19jb3VudDsgaTMrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF92bGFuX3BhY2soJnRoaXMtPnUub251X2lnbXBfdmxhbi52bGFuc1tpM10sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRFlOX0xFQVJOSU5HX01PREU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5keW5fbGVhcm5pbmdfbW9kZS5sZWFybmluZ19tb2RlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01JTl9NQUNfTElNSVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUubWluX21hY19saW1pdC5saW1pdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9PTlVfQUdHUkVHQVRFX0xJTUlUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUub251X2FnZ3JlZ2F0ZV9saW1pdC5saW1pdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9OVlNfU0NSQVRDSFBBRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUubnZzX3NjcmF0Y2hwYWQuZGF0YV9jb3VudCA+IDApICYmICh0aGlzLT51Lm52c19zY3JhdGNocGFkLmRhdGEgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZGF0YVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX252c19zY3JhdGNocGFkXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUubnZzX3NjcmF0Y2hwYWQuZGF0YSwgdGhpcy0+dS5udnNfc2NyYXRjaHBhZC5kYXRhX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZMT09EX1VOS05PV046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5mbG9vZF91bmtub3duLmZsb29kX3Vua25vd25fb3B0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xPQ0FMX1NXSVRDSElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmxvY2FsX3N3aXRjaGluZy5sb2NhbF9zd2l0Y2hfb3B0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0RPV05fQlVSU1RfVE9MTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmRvd25fYnVyc3RfdG9sbC5kb3duX2J1cnN0X3RvbGxfb3B0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZFQ19NT0RFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZmVjX21vZGUuZG93bnN0cmVhbV9mZWMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZmVjX21vZGUudXBzdHJlYW1fZmVjKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9URU1QRVJBVFVSRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5wb3dlcl9tb25fdGVtcGVyYXR1cmUudGVtcGVyYXR1cmUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1ZDQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5wb3dlcl9tb25fdmNjLnZjYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1dFUl9NT05fVFhfQklBUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5wb3dlcl9tb25fdHhfYmlhcy5iaWFzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9UWF9QT1dFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTY0KGJ1ZiwgdGhpcy0+dS5wb3dlcl9tb25fdHhfcG93ZXIucG93ZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1JYX1BPV0VSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT51LnBvd2VyX21vbl9yeF9wb3dlci5wb3dlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ORVRXT1JLX1BPTl9NQVA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5uZXR3b3JrX3Bvbl9tYXAubmV0d29ya19lcG9uX3BvcnRzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUubmV0d29ya19wb25fbWFwLm5ldHdvcmtfZXBvbl9wb3J0c19jb3VudCA+IDApICYmICh0aGlzLT51Lm5ldHdvcmtfcG9uX21hcC5uZXR3b3JrX2Vwb25fcG9ydHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibmV0d29ya19lcG9uX3BvcnRzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfbmV0d29ya19wb25fbWFwXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUubmV0d29ya19wb25fbWFwLm5ldHdvcmtfZXBvbl9wb3J0cywgdGhpcy0+dS5uZXR3b3JrX3Bvbl9tYXAubmV0d29ya19lcG9uX3BvcnRzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BTU1RBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb251X3Bzc3RhdGVfcGFjayh0aGlzLT51LnBzc3RhdGUuc3RhdGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TTEVfTU9ERToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNsZV9tb2RlLmZpZWxkX3NlbGVjdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MRUFSTl9UQUJMRV9NT0RFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFybl90YWJsZV9tb2RlX3BhY2sodGhpcy0+dS5sZWFybl90YWJsZV9tb2RlLmxlYXJuX3RhYmxlX21vZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UUkFOU0NFSVZFUl9TSUdOQUxfREVURUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS50cmFuc2NlaXZlcl9zaWduYWxfZGV0ZWN0LnNpZ25hbF9kZXRlY3QpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ1JPU1NCQVJfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuY3Jvc3NiYXJfY29uZmlnLnVzZXJfcG9ydF90b19uZXR3b3JrX3BvcnRfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5jcm9zc2Jhcl9jb25maWcudXNlcl9wb3J0X3RvX25ldHdvcmtfcG9ydF9jb3VudCA+IDApICYmICh0aGlzLT51LmNyb3NzYmFyX2NvbmZpZy51c2VyX3BvcnRfdG9fbmV0d29ya19wb3J0ID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVzZXJfcG9ydF90b19uZXR3b3JrX3BvcnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9jcm9zc2Jhcl9jb25maWdcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5jcm9zc2Jhcl9jb25maWcudXNlcl9wb3J0X3RvX25ldHdvcmtfcG9ydCwgdGhpcy0+dS5jcm9zc2Jhcl9jb25maWcudXNlcl9wb3J0X3RvX25ldHdvcmtfcG9ydF9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UUkFOU0NFSVZFUl9CVVJTVF9BQ1RJVklUWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPnUudHJhbnNjZWl2ZXJfYnVyc3RfYWN0aXZpdHkuYnVyc3RfYWN0aXZpdHkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ09OVFJPTF9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuY29udHJvbF9wb3J0Lm5ldHdvcmtfcG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9WTEFOX0RFU1RJTkFUSU9OUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGk0OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX21hdGNoX21vZGVfcGFjayh0aGlzLT51LnZsYW5fZGVzdGluYXRpb25zLm1hdGNoX21vZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3ZsYW5fZGVzdGluYXRpb25fZmxhZ3NfcGFjayh0aGlzLT51LnZsYW5fZGVzdGluYXRpb25zLmZsYWdzLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUudmxhbl9kZXN0aW5hdGlvbnMuZGVmYXVsdF9saW5rX2luZGV4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnZsYW5fZGVzdGluYXRpb25zLmRlZmF1bHRfcXVldWVfaW5kZXgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUudmxhbl9kZXN0aW5hdGlvbnMubWFwcGluZ3NfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS52bGFuX2Rlc3RpbmF0aW9ucy5tYXBwaW5nc19jb3VudCA+IDApICYmICh0aGlzLT51LnZsYW5fZGVzdGluYXRpb25zLm1hcHBpbmdzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm1hcHBpbmdzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfdmxhbl9kZXN0aW5hdGlvbnNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUudmxhbl9kZXN0aW5hdGlvbnMubWFwcGluZ3NfY291bnQgPiAxNikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk0ID0gMDsgaTQgPCB0aGlzLT51LnZsYW5fZGVzdGluYXRpb25zLm1hcHBpbmdzX2NvdW50OyBpNCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3ZsYW5fZGVzdGluYXRpb25fbWFwcGluZ19wYWNrKCZ0aGlzLT51LnZsYW5fZGVzdGluYXRpb25zLm1hcHBpbmdzW2k0XSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FTkNSWVBUSU9OX01PREU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2VuY3J5cHRpb25fbW9kZV9wYWNrKHRoaXMtPnUuZW5jcnlwdGlvbl9tb2RlLm1vZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2VuY3J5cHRpb25fb3B0aW9uc19wYWNrKHRoaXMtPnUuZW5jcnlwdGlvbl9tb2RlLm9wdGlvbnMsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9JTlRFUk5BTF9WRVJTSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmludGVybmFsX3ZlcnNpb24uc3RyZWFtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5pbnRlcm5hbF92ZXJzaW9uLnJldmlzaW9uKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZJUk1XQVJFX1RJTUVTVEFNUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfZmlybXdhcmVfdGltZXN0YW1wX3BhY2soJnRoaXMtPnUuZmlybXdhcmVfdGltZXN0YW1wLnRpbWVzdGFtcCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX09OVV9SVUxFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfcnVsZV9wYWNrKCZ0aGlzLT51Lm9udV9ydWxlLnJ1bGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT0xJQ0VSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Zsb3dfZGlyZWN0aW9uX3BhY2sodGhpcy0+dS5wb2xpY2VyLmRpcmVjdGlvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnBvbGljZXIucG9saWNlcl9pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUucG9saWNlci5idXJzdF9zaXplKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5wb2xpY2VyLnRyYWZmaWNfcmF0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9VTklfU0hBUEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTU7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS51bmlfc2hhcGVyLm51bWJlcl9vZl9zaGFwZXJzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUudW5pX3NoYXBlci5udW1iZXJfb2Zfc2hhcGVycyA+IDApICYmICh0aGlzLT51LnVuaV9zaGFwZXIudW5pX3NoYXBlciA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmlfc2hhcGVyXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfdW5pX3NoYXBlclwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk1ID0gMDsgaTUgPCB0aGlzLT51LnVuaV9zaGFwZXIubnVtYmVyX29mX3NoYXBlcnM7IGk1KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV91bmlfc2hhcGVyX3BhY2soJnRoaXMtPnUudW5pX3NoYXBlci51bmlfc2hhcGVyW2k1XSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FWFRfRklSTVdBUkVfVkVSU0lPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF9sb2FkX2xhYmVsX3BhY2soJnRoaXMtPnUuZXh0X2Zpcm13YXJlX3ZlcnNpb24udmVyc2lvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VOQ1JZUFRJT05fS0VZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2RpcmVjdGlvbl9wYWNrKHRoaXMtPnUuZW5jcnlwdGlvbl9rZXkuZGlyZWN0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZW5jcnlwdGlvbl9rZXkua2V5X2luZGV4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmVuY3J5cHRpb25fa2V5LmtleV9sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5lbmNyeXB0aW9uX2tleS5rZXlfbGVuZ3RoID4gMCkgJiYgKHRoaXMtPnUuZW5jcnlwdGlvbl9rZXkua2V5X2RhdGEgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwia2V5X2RhdGFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9lbmNyeXB0aW9uX2tleVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmVuY3J5cHRpb25fa2V5LmtleV9kYXRhLCB0aGlzLT51LmVuY3J5cHRpb25fa2V5LmtleV9sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRklMRV9JTkZPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2ZpbGVfaW5mb19iYXNlX3BhY2soJnRoaXMtPnUuZmlsZV9pbmZvLmZpbGVfaW5mbywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NZU1RFTV9SVUxFX09QVElPTlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5zeXN0ZW1fcnVsZV9vcHRpb25zLnN5c3RlbV9ydWxlX29wdGlvbnMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTVRVOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lm10dS5tdHUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTlZTX1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX252c19zdGF0ZV9wYWNrKHRoaXMtPnUubnZzX3N0YXRlLnN0YXRlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUVVFVUVQUklNQVA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5xdWV1ZXByaW1hcC5wcmlvcml0eV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnF1ZXVlcHJpbWFwLnByaW9yaXR5X2NvdW50ID4gMCkgJiYgKHRoaXMtPnUucXVldWVwcmltYXAucHJpb3JpdHlfbWFwID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInByaW9yaXR5X21hcFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3F1ZXVlcHJpbWFwXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUucXVldWVwcmltYXAucHJpb3JpdHlfbWFwLCB0aGlzLT51LnF1ZXVlcHJpbWFwLnByaW9yaXR5X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfRE9XTl9CSVRfTE9BRElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19iaXRfbG9hZGluZ19wYWNrKCZ0aGlzLT51LmVwb2NfZG93bl9iaXRfbG9hZGluZy52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVVBfQklUX0xPQURJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2NfYml0X2xvYWRpbmdfcGFjaygmdGhpcy0+dS5lcG9jX3VwX2JpdF9sb2FkaW5nLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19TRE1fUEhBU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF9wYWNrKCZ0aGlzLT51LmVwb2Nfc2RtX3BoYXNlLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19TRE1fQU1QTElUVURFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfcGFjaygmdGhpcy0+dS5lcG9jX3NkbV9hbXBsaXR1ZGUudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1NETV9RVUFOVElaRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF9wYWNrKCZ0aGlzLT51LmVwb2Nfc2RtX3F1YW50aXplci52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVU5VU0VEMDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19zdGF0X3BhY2soJnRoaXMtPnUuZXBvY191bnVzZWQwLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQxOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfcGFjaygmdGhpcy0+dS5lcG9jX3VudXNlZDEudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF9wYWNrKCZ0aGlzLT51LmVwb2NfdW51c2VkMi52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVU5VU0VEMzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19zdGF0X3BhY2soJnRoaXMtPnUuZXBvY191bnVzZWQzLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQ0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfcGFjaygmdGhpcy0+dS5lcG9jX3VudXNlZDQudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9RVUVVRV9DT05GSUdfVjI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MmJhc2VfcGFjaygmdGhpcy0+dS5xdWV1ZV9jb25maWdfdjIucXVldWVfY29uZmlnLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRkVBVFVSRV9TRVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2ZlYXR1cmVfc2V0X3BhY2sodGhpcy0+dS5mZWF0dXJlX3NldC5mZWF0dXJlX3NldCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9QSFlfVFlQRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9zdGRfcGh5X3R5cGVfcGFjayh0aGlzLT51LnN0ZF9waHlfdHlwZS52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NFUVVFTkNFX05VTUJFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfc2VxdWVuY2VfbnVtYmVyX3BhY2soJnRoaXMtPnUuc2VxdWVuY2VfbnVtYmVyLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTVBDUF9DTE9DSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5tcGNwX2Nsb2NrLnB1bHNlX3RpbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTVBDUF9DTE9DS19DT01QRU5TQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9jbG9ja190cmFuc3BvcnRfY29uZmlnX3BhY2soJnRoaXMtPnUubXBjcF9jbG9ja19jb21wZW5zYXRlLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTUNBU1RfR0xPQkFMX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm1jYXN0X2dsb2JhbF9jb25maWcucm9idXN0bmVzc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5tY2FzdF9nbG9iYWxfY29uZmlnLmxtcV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX2Jvb2woYnVmLCB0aGlzLT51Lm1jYXN0X2dsb2JhbF9jb25maWcuZmFzdF9sZWF2ZV9lbmFibGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX21jYXN0X3Nub29wX21vZGVfcGFjayh0aGlzLT51Lm1jYXN0X2dsb2JhbF9jb25maWcubW9kZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9pcG1jX2dsb2JhbF9vcHRpb25zX3BhY2sodGhpcy0+dS5tY2FzdF9nbG9iYWxfY29uZmlnLm9wdGlvbnMsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NQ0FTVF9ET01BSU5fQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5fcmVjb3JkX3BhY2soJnRoaXMtPnUubWNhc3RfZG9tYWluX2NvbmZpZy52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX09OVV9IT0xET1ZFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51Lm9udV9ob2xkb3Zlci50aW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfaG9sZG92ZXJfZmxhZ3NfcGFjayh0aGlzLT51Lm9udV9ob2xkb3Zlci5mbGFncywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0FMQVJNX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29kZV9wYWNrKHRoaXMtPnUuYWxhcm1fdGhyZXNob2xkLmFsYXJtX2NvZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuYWxhcm1fdGhyZXNob2xkLnJhaXNlX3RocmVzaG9sZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuYWxhcm1fdGhyZXNob2xkLmNsZWFyX3RocmVzaG9sZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GQUlMU0FGRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmZhaWxzYWZlLmNvdW50X29mX2ZhaWxzYWZlX21lY2gpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+dS5mYWlsc2FmZS5mYWlsc2FmZV9zdGF0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX1NUQVRTX1RIUkVTSE9MRF9JTlRFUlZBTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5wb3J0X3N0YXRzX3RocmVzaG9sZF9pbnRlcnZhbC5zdGF0aXN0aWNfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnBvcnRfc3RhdHNfdGhyZXNob2xkX2ludGVydmFsLmludGVydmFsKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xJTktfU1RBVFNfVEhSRVNIT0xEX0lOVEVSVkFMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lmxpbmtfc3RhdHNfdGhyZXNob2xkX2ludGVydmFsLnN0YXRpc3RpY19pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUubGlua19zdGF0c190aHJlc2hvbGRfaW50ZXJ2YWwuaW50ZXJ2YWwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19EVVBMRVhfU1RBVFVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX21hY19kdXBsZXhfc3RhdHVzX3BhY2sodGhpcy0+dS5zdGRfbWFjX2R1cGxleF9zdGF0dXMuc3RhdHVzLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0FETUlOX1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2F1dG9uZWdvdGlhdGVfYWRtaW5fc3RhdGVfcGFjayh0aGlzLT51LnN0ZF9hdXRvX25lZ19hZG1pbl9zdGF0ZS5zdGF0ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQVVfTUVESUFfQVZBSUw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbWF1X21lZGlhX2F2YWlsYWJsZV9wYWNrKHRoaXMtPnUuc3RkX21hdV9tZWRpYV9hdmFpbC5zdGF0dXMsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NRElfQ1JPU1NPVkVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX21kaV9tb2RlX3BhY2sodGhpcy0+dS5tZGlfY3Jvc3NvdmVyLm1vZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0FERFI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5zdGRfbWFjX2FkZHIuYWRkcmVzcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9CQ0FTVF9SQVRFX0xJTUlUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQllQQVNTX1NPRlRfTEVBUk46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DSElQX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ0hJUF9WRVJTSU9OOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ09TX1RSQU5TTEFUSU9OOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ1RMX1ZMQU5fSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ETl9GSUxURVJfVEJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRUdSRVNTX1NIQVBJTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FWFRFTkRFRF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZJUk1XQVJFX1ZFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0lHTVBfRlJBTUVfUkFURV9MSU1JVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0lOR1JFU1NfUE9MSUNJTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9JUE1DX1VOS05PV05fTEVBVkVfRldEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfSkVERUNfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MRUFSTl9NT0RFX1JVTEVfVVBEQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTElOS19TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xVRV9GSUVMRF9TRUxFQ1RfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01DQVNUX0dST1VQX0lORk86CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX0RZTkFNSUNfRU5UUklFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfVkxBTl9NRU1CRVJTSElQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9WTEFOX1BPTElDWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BSSV9FTlFVRVVJTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TRUFSQ0hfQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1RBVElDX01BQ19UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfQURfU0VMRUNUX0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfQURfVEVDSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19BVVRPX0NGRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19MT0NBTF9TRUxFQ1RfQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19MT0NBTF9URUNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX1JFTU9URV9TSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfUlhfU0VMRUNUX0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfUlhfVEVDSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfQUJJTElUWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfQ09SUkVDVEVEX0JMT0NLUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfTU9ERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfVU5DT1JSRUNUQUJMRV9CTE9DS1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NBUEFCSUxJVElFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ0FSUklFUl9TRU5TRV9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NPTExJU0lPTl9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfRlJBTUVTX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX0ZSQU1FU19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9GVU5DU19TVVBQT1JURUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfUEFVU0VfREVMQVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfVU5TVVBQT1JURURfT1BfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSX0VYQ0VTU0lWRV9ERUZFUlJBTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVTX0RFRkVSUkVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRVNfTE9TVF9NQUNfUlhfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRVNfTE9TVF9NQUNfVFhfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTUNBU1RfQUREUl9MSVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19NQ0FTVF9SWF9TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX09VVF9PRl9SQU5HRV9MRU5fRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19QUk9NSVNDVU9VU19TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX1RYX0VOQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX0RJU0NPVkVSWV9USU1FT1VUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfRElTQ09WRVJZX1dJTkRPV19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX1JFR19BQ0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9SRUdfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX1JFUE9SVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX0dBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9SRUdJU1RFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9QSFlfQURNSU5fU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfUEhZX1RZUEVfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1VQX0ZJTFRFUl9UQkw6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWUgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPndpZHRoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLT53aWR0aDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdWludDMyX3QgY291bnQgPSAzOworICAgICAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MVUVfRklFTERfU0VMRUNUOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRVNfVFhfT0s6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX1NJTkdMRV9DT0xMX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTVVMVElQTEVfQ09MTF9GUkFNRVM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRkNTX0VSUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQUxJR05fRVJSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19PQ1RFVFNfVFhfT0s6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0xBVEVfQ09MTElTSU9OUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRVhDRVNTSVZFX0NPTExJU0lPTlM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX09DVEVUU19SWF9PSzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTUNBU1RfRlJBTUVTX1RYX09LOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19CQ0FTVF9GUkFNRVNfVFhfT0s6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX01DQVNUX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQkNBU1RfRlJBTUVTX1JYX09LOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19JTl9SQU5HRV9MRU5fRVJSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRV9UT09fTE9ORzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRU5BQkxFX1NUQVRVUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9QSFlfU1lNQk9MX0VSUl9EVVJJTkdfQ0FSUklFUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9QQVVTRV9UWDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9QQVVTRV9SWDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9PQU1fTE9DQUxfRVJSX0ZSQU1FX1NFQ1NfRVZFTlQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfT0FNX0VNVUxfQ1JDOEVSUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX01BQ19DVFJMX0ZSQU1FU19UWDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX01BQ19DVFJMX0ZSQU1FU19SWDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX1JFR19BQ0s6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9SRUdfUkVRVUVTVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX1JFUE9SVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX0dBVEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9SRUdJU1RFUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0RZTl9MRUFSTl9UQkxfU0laRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0RZTl9MRUFSTl9BR0VfTElNSVQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVfVE9PX1NIT1JUOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUU2NDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FNjVUTzEyNzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMTI4VE8yNTU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTI1NlRPNTExOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUU1MTJUTzEwMjM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTEwMjRUTzE1MTg6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTE1MTlQTFVTOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUU2NDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FNjVUTzEyNzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMTI4VE8yNTU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTI1NlRPNTExOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUU1MTJUTzEwMjM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTEwMjRUTzE1MTg6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTE1MTlQTFVTOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfREVMQVlfVEhSRVNIT0xEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfREVMQVk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRVNfRFJPUFBFRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX0RST1BQRUQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19ERUxBWUVEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfQllURVNfVU5VU0VEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfREVMQVlfVEhSRVNIT0xEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfREVMQVk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRVNfRFJPUFBFRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0JZVEVTX0RST1BQRUQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9CWVRFU19ERUxBWUVEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9TVEFUX1RIUkVTSE9MRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDEwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MSU5LX1NUQVRfVEhSRVNIT0xEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VOQ1JZUFRfS0VZX0VYUElSWV9USU1FOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTEVOX0VSUk9SX0RJU0NBUkQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9EWU5fTUFDX1RCTDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JFUE9SVF9USFJFU0hPTERTOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gKDIgKiB0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnRocmVzaG9sZHNfY291bnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9WTEFOX0VUSEVSVFlQRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfQ0FQQUJJTElUWToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX05FV19ETl9GSUxURVJfVEJMOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaTA7CisgICAgICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5uZXdfZG5fZmlsdGVyX3RibC5ydWxlc19jb3VudCA+IDApICYmICh0aGlzLT51Lm5ld19kbl9maWx0ZXJfdGJsLnJ1bGVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicnVsZXNfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUubmV3X2RuX2ZpbHRlcl90YmwucnVsZXNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUubmV3X2RuX2ZpbHRlcl90YmwucnVsZXNbaTBdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ORVdfVVBfRklMVEVSX1RCTDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxOworICAgICAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUubmV3X3VwX2ZpbHRlcl90YmwucnVsZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5uZXdfdXBfZmlsdGVyX3RibC5ydWxlcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJ1bGVzX2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51Lm5ld191cF9maWx0ZXJfdGJsLnJ1bGVzX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51Lm5ld191cF9maWx0ZXJfdGJsLnJ1bGVzW2kxXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQVJQX1JFUExJQ0FURV9ERVNUOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTEFDUF9ERVNUOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfT05VX0lHTVBfVkxBTjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDIgKyAoNSAqIHRoaXMtPnUub251X2lnbXBfdmxhbi52bGFuc19jb3VudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0RZTl9MRUFSTklOR19NT0RFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTUlOX01BQ19MSU1JVDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX09OVV9BR0dSRUdBVEVfTElNSVQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9OVlNfU0NSQVRDSFBBRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IHRoaXMtPnUubnZzX3NjcmF0Y2hwYWQuZGF0YV9jb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRkxPT0RfVU5LTk9XTjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xPQ0FMX1NXSVRDSElORzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0RPV05fQlVSU1RfVE9MTDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZFQ19NT0RFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1RFTVBFUkFUVVJFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1ZDQzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9UWF9CSUFTOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1RYX1BPV0VSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1JYX1BPV0VSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTkVUV09SS19QT05fTUFQOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMSArIHRoaXMtPnUubmV0d29ya19wb25fbWFwLm5ldHdvcmtfZXBvbl9wb3J0c19jb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUFNTVEFURToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NMRV9NT0RFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTEVBUk5fVEFCTEVfTU9ERToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RSQU5TQ0VJVkVSX1NJR05BTF9ERVRFQ1Q6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DUk9TU0JBUl9DT05GSUc6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgdGhpcy0+dS5jcm9zc2Jhcl9jb25maWcudXNlcl9wb3J0X3RvX25ldHdvcmtfcG9ydF9jb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFJBTlNDRUlWRVJfQlVSU1RfQUNUSVZJVFk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DT05UUk9MX1BPUlQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9WTEFOX0RFU1RJTkFUSU9OUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDUgKyAoNCAqIHRoaXMtPnUudmxhbl9kZXN0aW5hdGlvbnMubWFwcGluZ3NfY291bnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FTkNSWVBUSU9OX01PREU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9JTlRFUk5BTF9WRVJTSU9OOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRklSTVdBUkVfVElNRVNUQU1QOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfT05VX1JVTEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9ydWxlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51Lm9udV9ydWxlLnJ1bGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT0xJQ0VSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1VOSV9TSEFQRVI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgKDEwICogdGhpcy0+dS51bmlfc2hhcGVyLm51bWJlcl9vZl9zaGFwZXJzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVhUX0ZJUk1XQVJFX1ZFUlNJT046CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA1OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FTkNSWVBUSU9OX0tFWToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDMgKyB0aGlzLT51LmVuY3J5cHRpb25fa2V5LmtleV9sZW5ndGg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZJTEVfSU5GTzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5maWxlX2luZm8uZmlsZV9pbmZvKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1lTVEVNX1JVTEVfT1BUSU9OUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01UVToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX05WU19TVEFURToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1FVRVVFUFJJTUFQOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMSArIHRoaXMtPnUucXVldWVwcmltYXAucHJpb3JpdHlfY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfRE9XTl9CSVRfTE9BRElORzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDY0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VQX0JJVF9MT0FESU5HOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNjQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfU0RNX1BIQVNFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZXBvY19zZG1fcGhhc2UudmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1NETV9BTVBMSVRVREU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5lcG9jX3NkbV9hbXBsaXR1ZGUudmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1NETV9RVUFOVElaRVI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5lcG9jX3NkbV9xdWFudGl6ZXIudmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDA6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5lcG9jX3VudXNlZDAudmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDE6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5lcG9jX3VudXNlZDEudmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5lcG9jX3VudXNlZDIudmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5lcG9jX3VudXNlZDMudmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5lcG9jX3VudXNlZDQudmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9RVUVVRV9DT05GSUdfVjI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MmJhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUucXVldWVfY29uZmlnX3YyLnF1ZXVlX2NvbmZpZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZFQVRVUkVfU0VUOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX1BIWV9UWVBFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU0VRVUVOQ0VfTlVNQkVSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTVBDUF9DTE9DSzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01QQ1BfQ0xPQ0tfQ09NUEVOU0FURToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NQ0FTVF9HTE9CQUxfQ09ORklHOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTUNBU1RfRE9NQUlOX0NPTkZJRzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3JlY29yZF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5tY2FzdF9kb21haW5fY29uZmlnLnZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfT05VX0hPTERPVkVSOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQUxBUk1fVEhSRVNIT0xEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gOTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRkFJTFNBRkU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX1NUQVRTX1RIUkVTSE9MRF9JTlRFUlZBTDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xJTktfU1RBVFNfVEhSRVNIT0xEX0lOVEVSVkFMOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19EVVBMRVhfU1RBVFVTOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0FETUlOX1NUQVRFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BVV9NRURJQV9BVkFJTDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01ESV9DUk9TU09WRVI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0FERFI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9CQ0FTVF9SQVRFX0xJTUlUOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0JZUEFTU19TT0ZUX0xFQVJOOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0NISVBfSUQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ0hJUF9WRVJTSU9OOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0NPU19UUkFOU0xBVElPTjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DVExfVkxBTl9JRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ETl9GSUxURVJfVEJMOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VHUkVTU19TSEFQSU5HOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VYVEVOREVEX0lEOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZJUk1XQVJFX1ZFUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9JR01QX0ZSQU1FX1JBVEVfTElNSVQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfSU5HUkVTU19QT0xJQ0lORzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9JUE1DX1VOS05PV05fTEVBVkVfRldEOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0pFREVDX0lEOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xFQVJOX01PREVfUlVMRV9VUERBVEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTElOS19TVEFURToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MVUVfRklFTERfU0VMRUNUX0xJU1Q6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTUNBU1RfR1JPVVBfSU5GTzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX0RZTkFNSUNfRU5UUklFUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX1ZMQU5fTUVNQkVSU0hJUDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX1ZMQU5fUE9MSUNZOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BSSV9FTlFVRVVJTkc6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU0VBUkNIX0NPTkZJRzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVEFUSUNfTUFDX1RCTDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfQURfU0VMRUNUX0FCTEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0FEX1RFQ0g6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0FVVE9fQ0ZHOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19JRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfTE9DQUxfU0VMRUNUX0FCTEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0xPQ0FMX1RFQ0g6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX1JFTU9URV9TSUc6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX1JYX1NFTEVDVF9BQkxFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19SWF9URUNIOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfQUJJTElUWToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfRkVDX0NPUlJFQ1RFRF9CTE9DS1M6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0ZFQ19NT0RFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfVU5DT1JSRUNUQUJMRV9CTE9DS1M6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DQVBBQklMSVRJRVM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DQVJSSUVSX1NFTlNFX0VSUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NPTExJU0lPTl9GUkFNRVM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX0ZSQU1FU19SWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfRlJBTUVTX1RYOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9GVU5DU19TVVBQT1JURUQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX0lEOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9QQVVTRV9ERUxBWToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfVU5TVVBQT1JURURfT1BfUlg6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUl9FWENFU1NJVkVfREVGRVJSQUw6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRVNfREVGRVJSRUQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRVNfTE9TVF9NQUNfUlhfRVJSOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVTX0xPU1RfTUFDX1RYX0VSUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0lEOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTUNBU1RfQUREUl9MSVNUOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTUNBU1RfUlhfU1RBVFVTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfT1VUX09GX1JBTkdFX0xFTl9FUlI6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19QUk9NSVNDVU9VU19TVEFUVVM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19UWF9FTkFCTEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfRElTQ09WRVJZX1RJTUVPVVQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfRElTQ09WRVJZX1dJTkRPV19UWDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9SRUdfQUNLOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX1JFR19SRVFVRVNUOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX1JFUE9SVDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9HQVRFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX1JFR0lTVEVSOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9QSFlfQURNSU5fU1RBVEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX1BIWV9UWVBFX0xJU1Q6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVVBfRklMVEVSX1RCTDoKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hdHRyaWJ1dGVfdW5wYWNrKCZ0aGlzLT5sZWFmLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPndpZHRoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+d2lkdGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAodGhpcy0+d2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT53aWR0aCwgYnVmLT5jdXJyKTsKKyAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTFVFX0ZJRUxEX1NFTEVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUubHVlX2ZpZWxkX3NlbGVjdC5pZHgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2x1ZV9maWVsZF9zZWxlY3RfZW50cnlfdW5wYWNrKCZ0aGlzLT51Lmx1ZV9maWVsZF9zZWxlY3QuZGVmLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVTX1RYX09LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc3RkX21hY19mcmFtZXNfdHhfb2sudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19TSU5HTEVfQ09MTF9GUkFNRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zdGRfbWFjX3NpbmdsZV9jb2xsX2ZyYW1lcy52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX01VTFRJUExFX0NPTExfRlJBTUVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc3RkX21hY19tdWx0aXBsZV9jb2xsX2ZyYW1lcy52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnN0ZF9tYWNfZnJhbWVzX3J4X29rLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRkNTX0VSUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnN0ZF9tYWNfZmNzX2Vyci52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0FMSUdOX0VSUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnN0ZF9tYWNfYWxpZ25fZXJyLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfT0NURVRTX1RYX09LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc3RkX21hY19vY3RldHNfdHhfb2sudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19MQVRFX0NPTExJU0lPTlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zdGRfbWFjX2xhdGVfY29sbGlzaW9ucy52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0VYQ0VTU0lWRV9DT0xMSVNJT05TOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc3RkX21hY19leGNlc3NpdmVfY29sbGlzaW9ucy52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX09DVEVUU19SWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnN0ZF9tYWNfb2N0ZXRzX3J4X29rLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTUNBU1RfRlJBTUVTX1RYX09LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc3RkX21hY19tY2FzdF9mcmFtZXNfdHhfb2sudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19CQ0FTVF9GUkFNRVNfVFhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zdGRfbWFjX2JjYXN0X2ZyYW1lc190eF9vay52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX01DQVNUX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnN0ZF9tYWNfbWNhc3RfZnJhbWVzX3J4X29rLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQkNBU1RfRlJBTUVTX1JYX09LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc3RkX21hY19iY2FzdF9mcmFtZXNfcnhfb2sudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19JTl9SQU5HRV9MRU5fRVJSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc3RkX21hY19pbl9yYW5nZV9sZW5fZXJyLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVfVE9PX0xPTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zdGRfbWFjX2ZyYW1lX3Rvb19sb25nLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRU5BQkxFX1NUQVRVUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc3RkX21hY19lbmFibGVfc3RhdHVzLmVuYWJsZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX1BIWV9TWU1CT0xfRVJSX0RVUklOR19DQVJSSUVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc3RkX3BoeV9zeW1ib2xfZXJyX2R1cmluZ19jYXJyaWVyLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9QQVVTRV9UWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnN0ZF9tYWNfY3RybF9wYXVzZV90eC52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfUEFVU0VfUlg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zdGRfbWFjX2N0cmxfcGF1c2VfcngudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX09BTV9MT0NBTF9FUlJfRlJBTUVfU0VDU19FVkVOVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnN0ZF9vYW1fbG9jYWxfZXJyX2ZyYW1lX3NlY3NfZXZlbnQudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX09BTV9FTVVMX0NSQzhFUlI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zdGRfb2FtX2VtdWxfY3JjOGVyci52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9NQUNfQ1RSTF9GUkFNRVNfVFg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zdGRfbXBjcF9tYWNfY3RybF9mcmFtZXNfdHgudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfTUFDX0NUUkxfRlJBTUVTX1JYOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc3RkX21wY3BfbWFjX2N0cmxfZnJhbWVzX3J4LnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX1JFR19BQ0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zdGRfbXBjcF90eF9yZWdfYWNrLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX1JFR19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc3RkX21wY3BfdHhfcmVnX3JlcXVlc3QudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfVFhfUkVQT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc3RkX21wY3BfdHhfcmVwb3J0LnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX0dBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zdGRfbXBjcF9yeF9nYXRlLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX1JFR0lTVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc3RkX21wY3BfcnhfcmVnaXN0ZXIudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRFlOX0xFQVJOX1RCTF9TSVpFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZHluX2xlYXJuX3RibF9zaXplLnRhYmxlX3NpemUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRFlOX0xFQVJOX0FHRV9MSU1JVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmR5bl9sZWFybl9hZ2VfbGltaXQuYWdlX2xpbWl0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucnhfdW5pY2FzdF9mcmFtZXMudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS50eF91bmljYXN0X2ZyYW1lcy52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRV9UT09fU0hPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5yeF9mcmFtZV90b29fc2hvcnQudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUU2NDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnJ4X2ZyYW1lNjQudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUU2NVRPMTI3OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucnhfZnJhbWU2NXRvMTI3LnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMTI4VE8yNTU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5yeF9mcmFtZTEyOHRvMjU1LnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMjU2VE81MTE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5yeF9mcmFtZTI1NnRvNTExLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FNTEyVE8xMDIzOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucnhfZnJhbWU1MTJ0bzEwMjMudmFsdWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxMDI0VE8xNTE4OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucnhfZnJhbWUxMDI0dG8xNTE4LnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMTUxOVBMVVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5yeF9mcmFtZTE1MTlwbHVzLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FNjQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS50eF9mcmFtZTY0LnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FNjVUTzEyNzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnR4X2ZyYW1lNjV0bzEyNy52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTEyOFRPMjU1OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudHhfZnJhbWUxMjh0bzI1NS52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTI1NlRPNTExOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudHhfZnJhbWUyNTZ0bzUxMS52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTUxMlRPMTAyMzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnR4X2ZyYW1lNTEydG8xMDIzLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMTAyNFRPMTUxODoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnR4X2ZyYW1lMTAyNHRvMTUxOC52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTE1MTlQTFVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudHhfZnJhbWUxNTE5cGx1cy52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9ERUxBWV9USFJFU0hPTEQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnR4X2RlbGF5X3RocmVzaG9sZC5kZWxheV90aHJlc2hvbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfREVMQVk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS50eF9kZWxheS5kZWxheSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRVNfRFJPUFBFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnR4X2ZyYW1lc19kcm9wcGVkLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX0RST1BQRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS50eF9ieXRlc19kcm9wcGVkLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX0RFTEFZRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS50eF9ieXRlc19kZWxheWVkLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX1VOVVNFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnR4X2J5dGVzX3VudXNlZC52YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9ERUxBWV9USFJFU0hPTEQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnJ4X2RlbGF5X3RocmVzaG9sZC5kZWxheV90aHJlc2hvbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfREVMQVk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5yeF9kZWxheS5kZWxheSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRVNfRFJPUFBFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnJ4X2ZyYW1lc19kcm9wcGVkLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0JZVEVTX0RST1BQRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5yeF9ieXRlc19kcm9wcGVkLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0JZVEVTX0RFTEFZRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5yeF9ieXRlc19kZWxheWVkLnZhbHVlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfU1RBVF9USFJFU0hPTEQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wb3J0X3N0YXRfdGhyZXNob2xkLnN0YXRpc3RpY19pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wb3J0X3N0YXRfdGhyZXNob2xkLnJpc2luZ190aHJlc2hvbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucG9ydF9zdGF0X3RocmVzaG9sZC5mYWxsaW5nX3RocmVzaG9sZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MSU5LX1NUQVRfVEhSRVNIT0xEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUubGlua19zdGF0X3RocmVzaG9sZC5zdGF0aXN0aWNfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUubGlua19zdGF0X3RocmVzaG9sZC5yaXNpbmdfdGhyZXNob2xkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lmxpbmtfc3RhdF90aHJlc2hvbGQuZmFsbGluZ190aHJlc2hvbGQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRU5DUllQVF9LRVlfRVhQSVJZX1RJTUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5lbmNyeXB0X2tleV9leHBpcnlfdGltZS50aW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xFTl9FUlJPUl9ESVNDQVJEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5sZW5fZXJyb3JfZGlzY2FyZC5sZW5fZXJyb3JfZGlzY2FyZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9EWU5fTUFDX1RCTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUkVQT1JUX1RIUkVTSE9MRFM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTA7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy50aHJlc2hvbGRzX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfcmVwb3J0X3RocmVzaG9sZHNfY291bnRfdGhyZXNob2xkcygmcG9zdExlbkJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnRocmVzaG9sZHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy50aHJlc2hvbGRzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidGhyZXNob2xkc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3JlcG9ydF90aHJlc2hvbGRzXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUucmVwb3J0X3RocmVzaG9sZHMudGhyZXNob2xkcyA9ICh1aW50MTZfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5yZXBvcnRfdGhyZXNob2xkcy50aHJlc2hvbGRzX2NvdW50ICogc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnRocmVzaG9sZHNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnJlcG9ydF90aHJlc2hvbGRzLnRocmVzaG9sZHNbaTBdKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9WTEFOX0VUSEVSVFlQRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnZsYW5fZXRoZXJ0eXBlLnZsYW5fZXRoZXJfdHlwZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudmxhbl9ldGhlcnR5cGUudXNlX2Zvcl91cHN0cmVhbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudmxhbl9ldGhlcnR5cGUudXNlX2Zvcl9kb3duc3RyZWFtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfQ0FQQUJJTElUWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBvcnRfY2FwYWJpbGl0eS5jdXJyZW50X2NhcHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucG9ydF9jYXBhYmlsaXR5LnBoeXNpY2FsX2NhcHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTkVXX0ROX0ZJTFRFUl9UQkw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTE7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5uZXdfZG5fZmlsdGVyX3RibC5ydWxlc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX25ld19kbl9maWx0ZXJfdGJsX2NvdW50X3J1bGVzKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUubmV3X2RuX2ZpbHRlcl90YmwucnVsZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5uZXdfZG5fZmlsdGVyX3RibC5ydWxlcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJ1bGVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfbmV3X2RuX2ZpbHRlcl90YmxcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5uZXdfZG5fZmlsdGVyX3RibC5ydWxlcyA9IChiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51Lm5ld19kbl9maWx0ZXJfdGJsLnJ1bGVzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGUpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHRoaXMtPnUubmV3X2RuX2ZpbHRlcl90YmwucnVsZXNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfdW5wYWNrKCZ0aGlzLT51Lm5ld19kbl9maWx0ZXJfdGJsLnJ1bGVzW2kxXSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTkVXX1VQX0ZJTFRFUl9UQkw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTI7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5uZXdfdXBfZmlsdGVyX3RibC5ydWxlc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX25ld191cF9maWx0ZXJfdGJsX2NvdW50X3J1bGVzKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUubmV3X3VwX2ZpbHRlcl90YmwucnVsZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5uZXdfdXBfZmlsdGVyX3RibC5ydWxlcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJ1bGVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfbmV3X3VwX2ZpbHRlcl90YmxcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5uZXdfdXBfZmlsdGVyX3RibC5ydWxlcyA9IChiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51Lm5ld191cF9maWx0ZXJfdGJsLnJ1bGVzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGUpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUubmV3X3VwX2ZpbHRlcl90YmwucnVsZXNfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfdW5wYWNrKCZ0aGlzLT51Lm5ld191cF9maWx0ZXJfdGJsLnJ1bGVzW2kyXSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQVJQX1JFUExJQ0FURV9ERVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuYXJwX3JlcGxpY2F0ZV9kZXN0LmRlc3RpbmF0aW9uX2JpdG1hcCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MQUNQX0RFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5sYWNwX2Rlc3QuZGVzdGluYXRpb25fYml0bWFwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX09OVV9JR01QX1ZMQU46CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMzsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUub251X2lnbXBfdmxhbi5hY3Rpb25fZm9yX3VubWFuX2dycCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9pZ21wX3ZsYW4udmxhbnNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5vbnVfaWdtcF92bGFuLnZsYW5zX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUub251X2lnbXBfdmxhbi52bGFucyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZsYW5zXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfb251X2lnbXBfdmxhblwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51Lm9udV9pZ21wX3ZsYW4udmxhbnMgPSAoYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF92bGFuICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51Lm9udV9pZ21wX3ZsYW4udmxhbnNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF92bGFuKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkzID0gMDsgaTMgPCB0aGlzLT51Lm9udV9pZ21wX3ZsYW4udmxhbnNfY291bnQ7IGkzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X2lnbXBfdmxhbl91bnBhY2soJnRoaXMtPnUub251X2lnbXBfdmxhbi52bGFuc1tpM10sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0RZTl9MRUFSTklOR19NT0RFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5keW5fbGVhcm5pbmdfbW9kZS5sZWFybmluZ19tb2RlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01JTl9NQUNfTElNSVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5taW5fbWFjX2xpbWl0LmxpbWl0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX09OVV9BR0dSRUdBVEVfTElNSVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9hZ2dyZWdhdGVfbGltaXQubGltaXQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTlZTX1NDUkFUQ0hQQUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5udnNfc2NyYXRjaHBhZC5kYXRhX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfbnZzX3NjcmF0Y2hwYWRfY291bnRfZGF0YSgmcG9zdExlbkJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm52c19zY3JhdGNocGFkLmRhdGFfY291bnQgPiAwKSAmJiAodGhpcy0+dS5udnNfc2NyYXRjaHBhZC5kYXRhID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZGF0YVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX252c19zY3JhdGNocGFkXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUubnZzX3NjcmF0Y2hwYWQuZGF0YSA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51Lm52c19zY3JhdGNocGFkLmRhdGFfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUubnZzX3NjcmF0Y2hwYWQuZGF0YSwgdGhpcy0+dS5udnNfc2NyYXRjaHBhZC5kYXRhX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZMT09EX1VOS05PV046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmZsb29kX3Vua25vd24uZmxvb2RfdW5rbm93bl9vcHQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTE9DQUxfU1dJVENISU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5sb2NhbF9zd2l0Y2hpbmcubG9jYWxfc3dpdGNoX29wdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ET1dOX0JVUlNUX1RPTEw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmRvd25fYnVyc3RfdG9sbC5kb3duX2J1cnN0X3RvbGxfb3B0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZFQ19NT0RFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5mZWNfbW9kZS5kb3duc3RyZWFtX2ZlYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmZlY19tb2RlLnVwc3RyZWFtX2ZlYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1dFUl9NT05fVEVNUEVSQVRVUkU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wb3dlcl9tb25fdGVtcGVyYXR1cmUudGVtcGVyYXR1cmUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1ZDQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91NjQoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBvd2VyX21vbl92Y2MudmNjKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9UWF9CSUFTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucG93ZXJfbW9uX3R4X2JpYXMuYmlhcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1dFUl9NT05fVFhfUE9XRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wb3dlcl9tb25fdHhfcG93ZXIucG93ZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1JYX1BPV0VSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U2NCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucG93ZXJfbW9uX3J4X3Bvd2VyLnBvd2VyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX05FVFdPUktfUE9OX01BUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUubmV0d29ya19wb25fbWFwLm5ldHdvcmtfZXBvbl9wb3J0c19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51Lm5ldHdvcmtfcG9uX21hcC5uZXR3b3JrX2Vwb25fcG9ydHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5uZXR3b3JrX3Bvbl9tYXAubmV0d29ya19lcG9uX3BvcnRzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibmV0d29ya19lcG9uX3BvcnRzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfbmV0d29ya19wb25fbWFwXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUubmV0d29ya19wb25fbWFwLm5ldHdvcmtfZXBvbl9wb3J0cyA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51Lm5ldHdvcmtfcG9uX21hcC5uZXR3b3JrX2Vwb25fcG9ydHNfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUubmV0d29ya19wb25fbWFwLm5ldHdvcmtfZXBvbl9wb3J0cywgdGhpcy0+dS5uZXR3b3JrX3Bvbl9tYXAubmV0d29ya19lcG9uX3BvcnRzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BTU1RBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb251X3Bzc3RhdGVfdW5wYWNrKCZ0aGlzLT51LnBzc3RhdGUuc3RhdGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NMRV9NT0RFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zbGVfbW9kZS5maWVsZF9zZWxlY3QpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTEVBUk5fVEFCTEVfTU9ERToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfbGVhcm5fdGFibGVfbW9kZV91bnBhY2soJnRoaXMtPnUubGVhcm5fdGFibGVfbW9kZS5sZWFybl90YWJsZV9tb2RlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UUkFOU0NFSVZFUl9TSUdOQUxfREVURUNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51LnRyYW5zY2VpdmVyX3NpZ25hbF9kZXRlY3Quc2lnbmFsX2RldGVjdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DUk9TU0JBUl9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmNyb3NzYmFyX2NvbmZpZy51c2VyX3BvcnRfdG9fbmV0d29ya19wb3J0X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuY3Jvc3NiYXJfY29uZmlnLnVzZXJfcG9ydF90b19uZXR3b3JrX3BvcnRfY291bnQgPiAwKSAmJiAodGhpcy0+dS5jcm9zc2Jhcl9jb25maWcudXNlcl9wb3J0X3RvX25ldHdvcmtfcG9ydCA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVzZXJfcG9ydF90b19uZXR3b3JrX3BvcnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9jcm9zc2Jhcl9jb25maWdcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5jcm9zc2Jhcl9jb25maWcudXNlcl9wb3J0X3RvX25ldHdvcmtfcG9ydCA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmNyb3NzYmFyX2NvbmZpZy51c2VyX3BvcnRfdG9fbmV0d29ya19wb3J0X2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LmNyb3NzYmFyX2NvbmZpZy51c2VyX3BvcnRfdG9fbmV0d29ya19wb3J0LCB0aGlzLT51LmNyb3NzYmFyX2NvbmZpZy51c2VyX3BvcnRfdG9fbmV0d29ya19wb3J0X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RSQU5TQ0VJVkVSX0JVUlNUX0FDVElWSVRZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51LnRyYW5zY2VpdmVyX2J1cnN0X2FjdGl2aXR5LmJ1cnN0X2FjdGl2aXR5KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0NPTlRST0xfUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuY29udHJvbF9wb3J0Lm5ldHdvcmtfcG9ydCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9WTEFOX0RFU1RJTkFUSU9OUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGk0OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX21hdGNoX21vZGVfdW5wYWNrKCZ0aGlzLT51LnZsYW5fZGVzdGluYXRpb25zLm1hdGNoX21vZGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9mbGFnc191bnBhY2soJnRoaXMtPnUudmxhbl9kZXN0aW5hdGlvbnMuZmxhZ3MsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudmxhbl9kZXN0aW5hdGlvbnMuZGVmYXVsdF9saW5rX2luZGV4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUudmxhbl9kZXN0aW5hdGlvbnMuZGVmYXVsdF9xdWV1ZV9pbmRleCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnZsYW5fZGVzdGluYXRpb25zLm1hcHBpbmdzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUudmxhbl9kZXN0aW5hdGlvbnMubWFwcGluZ3NfY291bnQgPiAwKSAmJiAodGhpcy0+dS52bGFuX2Rlc3RpbmF0aW9ucy5tYXBwaW5ncyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm1hcHBpbmdzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfdmxhbl9kZXN0aW5hdGlvbnNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS52bGFuX2Rlc3RpbmF0aW9ucy5tYXBwaW5ncyA9IChiY21vbHRfZXBvbl9vYW1fdGVrX3ZsYW5fZGVzdGluYXRpb25fbWFwcGluZyAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS52bGFuX2Rlc3RpbmF0aW9ucy5tYXBwaW5nc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGVrX3ZsYW5fZGVzdGluYXRpb25fbWFwcGluZykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUudmxhbl9kZXN0aW5hdGlvbnMubWFwcGluZ3NfY291bnQgPiAxNikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk0ID0gMDsgaTQgPCB0aGlzLT51LnZsYW5fZGVzdGluYXRpb25zLm1hcHBpbmdzX2NvdW50OyBpNCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3ZsYW5fZGVzdGluYXRpb25fbWFwcGluZ191bnBhY2soJnRoaXMtPnUudmxhbl9kZXN0aW5hdGlvbnMubWFwcGluZ3NbaTRdLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FTkNSWVBUSU9OX01PREU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2VuY3J5cHRpb25fbW9kZV91bnBhY2soJnRoaXMtPnUuZW5jcnlwdGlvbl9tb2RlLm1vZGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfZW5jcnlwdGlvbl9vcHRpb25zX3VucGFjaygmdGhpcy0+dS5lbmNyeXB0aW9uX21vZGUub3B0aW9ucywgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfSU5URVJOQUxfVkVSU0lPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmludGVybmFsX3ZlcnNpb24uc3RyZWFtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmludGVybmFsX3ZlcnNpb24ucmV2aXNpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRklSTVdBUkVfVElNRVNUQU1QOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19maXJtd2FyZV90aW1lc3RhbXBfdW5wYWNrKCZ0aGlzLT51LmZpcm13YXJlX3RpbWVzdGFtcC50aW1lc3RhbXAsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfT05VX1JVTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9ydWxlX3VucGFjaygmdGhpcy0+dS5vbnVfcnVsZS5ydWxlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPTElDRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZmxvd19kaXJlY3Rpb25fdW5wYWNrKCZ0aGlzLT51LnBvbGljZXIuZGlyZWN0aW9uLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBvbGljZXIucG9saWNlcl9pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wb2xpY2VyLmJ1cnN0X3NpemUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucG9saWNlci50cmFmZmljX3JhdGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVU5JX1NIQVBFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGk1OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS51bmlfc2hhcGVyLm51bWJlcl9vZl9zaGFwZXJzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUudW5pX3NoYXBlci5udW1iZXJfb2Zfc2hhcGVycyA+IDApICYmICh0aGlzLT51LnVuaV9zaGFwZXIudW5pX3NoYXBlciA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVuaV9zaGFwZXJcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV91bmlfc2hhcGVyXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUudW5pX3NoYXBlci51bmlfc2hhcGVyID0gKGJjbW9sdF9lcG9uX29hbV91bmlfc2hhcGVyICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnVuaV9zaGFwZXIubnVtYmVyX29mX3NoYXBlcnMgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3VuaV9zaGFwZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTUgPSAwOyBpNSA8IHRoaXMtPnUudW5pX3NoYXBlci5udW1iZXJfb2Zfc2hhcGVyczsgaTUrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3VuaV9zaGFwZXJfdW5wYWNrKCZ0aGlzLT51LnVuaV9zaGFwZXIudW5pX3NoYXBlcltpNV0sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VYVF9GSVJNV0FSRV9WRVJTSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2V4dGVuZGVkX2xvYWRfbGFiZWxfdW5wYWNrKCZ0aGlzLT51LmV4dF9maXJtd2FyZV92ZXJzaW9uLnZlcnNpb24sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRU5DUllQVElPTl9LRVk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGlyZWN0aW9uX3VucGFjaygmdGhpcy0+dS5lbmNyeXB0aW9uX2tleS5kaXJlY3Rpb24sICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZW5jcnlwdGlvbl9rZXkua2V5X2luZGV4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZW5jcnlwdGlvbl9rZXkua2V5X2xlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmVuY3J5cHRpb25fa2V5LmtleV9sZW5ndGggPiAwKSAmJiAodGhpcy0+dS5lbmNyeXB0aW9uX2tleS5rZXlfZGF0YSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImtleV9kYXRhXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfZW5jcnlwdGlvbl9rZXlcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5lbmNyeXB0aW9uX2tleS5rZXlfZGF0YSA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmVuY3J5cHRpb25fa2V5LmtleV9sZW5ndGggKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUuZW5jcnlwdGlvbl9rZXkua2V5X2RhdGEsIHRoaXMtPnUuZW5jcnlwdGlvbl9rZXkua2V5X2xlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GSUxFX0lORk86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Jhc2VfdW5wYWNrKCZ0aGlzLT51LmZpbGVfaW5mby5maWxlX2luZm8sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1lTVEVNX1JVTEVfT1BUSU9OUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc3lzdGVtX3J1bGVfb3B0aW9ucy5zeXN0ZW1fcnVsZV9vcHRpb25zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01UVToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm10dS5tdHUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTlZTX1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX252c19zdGF0ZV91bnBhY2soJnRoaXMtPnUubnZzX3N0YXRlLnN0YXRlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9RVUVVRVBSSU1BUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUucXVldWVwcmltYXAucHJpb3JpdHlfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5xdWV1ZXByaW1hcC5wcmlvcml0eV9jb3VudCA+IDApICYmICh0aGlzLT51LnF1ZXVlcHJpbWFwLnByaW9yaXR5X21hcCA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInByaW9yaXR5X21hcFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3F1ZXVlcHJpbWFwXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUucXVldWVwcmltYXAucHJpb3JpdHlfbWFwID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUucXVldWVwcmltYXAucHJpb3JpdHlfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUucXVldWVwcmltYXAucHJpb3JpdHlfbWFwLCB0aGlzLT51LnF1ZXVlcHJpbWFwLnByaW9yaXR5X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfRE9XTl9CSVRfTE9BRElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19iaXRfbG9hZGluZ191bnBhY2soJnRoaXMtPnUuZXBvY19kb3duX2JpdF9sb2FkaW5nLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVVBfQklUX0xPQURJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2NfYml0X2xvYWRpbmdfdW5wYWNrKCZ0aGlzLT51LmVwb2NfdXBfYml0X2xvYWRpbmcudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19TRE1fUEhBU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF91bnBhY2soJnRoaXMtPnUuZXBvY19zZG1fcGhhc2UudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19TRE1fQU1QTElUVURFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfdW5wYWNrKCZ0aGlzLT51LmVwb2Nfc2RtX2FtcGxpdHVkZS52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1NETV9RVUFOVElaRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF91bnBhY2soJnRoaXMtPnUuZXBvY19zZG1fcXVhbnRpemVyLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVU5VU0VEMDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19zdGF0X3VucGFjaygmdGhpcy0+dS5lcG9jX3VudXNlZDAudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQxOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfdW5wYWNrKCZ0aGlzLT51LmVwb2NfdW51c2VkMS52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF91bnBhY2soJnRoaXMtPnUuZXBvY191bnVzZWQyLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVU5VU0VEMzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19zdGF0X3VucGFjaygmdGhpcy0+dS5lcG9jX3VudXNlZDMudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQ0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfdW5wYWNrKCZ0aGlzLT51LmVwb2NfdW51c2VkNC52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9RVUVVRV9DT05GSUdfVjI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MmJhc2VfdW5wYWNrKCZ0aGlzLT51LnF1ZXVlX2NvbmZpZ192Mi5xdWV1ZV9jb25maWcsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRkVBVFVSRV9TRVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2ZlYXR1cmVfc2V0X3VucGFjaygmdGhpcy0+dS5mZWF0dXJlX3NldC5mZWF0dXJlX3NldCwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX1BIWV9UWVBFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3N0ZF9waHlfdHlwZV91bnBhY2soJnRoaXMtPnUuc3RkX3BoeV90eXBlLnZhbHVlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TRVFVRU5DRV9OVU1CRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3NlcXVlbmNlX251bWJlcl91bnBhY2soJnRoaXMtPnUuc2VxdWVuY2VfbnVtYmVyLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01QQ1BfQ0xPQ0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5tcGNwX2Nsb2NrLnB1bHNlX3RpbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTVBDUF9DTE9DS19DT01QRU5TQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9jbG9ja190cmFuc3BvcnRfY29uZmlnX3VucGFjaygmdGhpcy0+dS5tcGNwX2Nsb2NrX2NvbXBlbnNhdGUudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTUNBU1RfR0xPQkFMX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUubWNhc3RfZ2xvYmFsX2NvbmZpZy5yb2J1c3RuZXNzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUubWNhc3RfZ2xvYmFsX2NvbmZpZy5sbXFfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX2Jvb2woJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm1jYXN0X2dsb2JhbF9jb25maWcuZmFzdF9sZWF2ZV9lbmFibGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX21jYXN0X3Nub29wX21vZGVfdW5wYWNrKCZ0aGlzLT51Lm1jYXN0X2dsb2JhbF9jb25maWcubW9kZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2lwbWNfZ2xvYmFsX29wdGlvbnNfdW5wYWNrKCZ0aGlzLT51Lm1jYXN0X2dsb2JhbF9jb25maWcub3B0aW9ucywgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTUNBU1RfRE9NQUlOX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3JlY29yZF91bnBhY2soJnRoaXMtPnUubWNhc3RfZG9tYWluX2NvbmZpZy52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9PTlVfSE9MRE9WRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lm9udV9ob2xkb3Zlci50aW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfaG9sZG92ZXJfZmxhZ3NfdW5wYWNrKCZ0aGlzLT51Lm9udV9ob2xkb3Zlci5mbGFncywgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQUxBUk1fVEhSRVNIT0xEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19hbGFybV9jb2RlX3VucGFjaygmdGhpcy0+dS5hbGFybV90aHJlc2hvbGQuYWxhcm1fY29kZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuYWxhcm1fdGhyZXNob2xkLnJhaXNlX3RocmVzaG9sZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5hbGFybV90aHJlc2hvbGQuY2xlYXJfdGhyZXNob2xkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZBSUxTQUZFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5mYWlsc2FmZS5jb3VudF9vZl9mYWlsc2FmZV9tZWNoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5mYWlsc2FmZS5mYWlsc2FmZV9zdGF0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX1NUQVRTX1RIUkVTSE9MRF9JTlRFUlZBTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnBvcnRfc3RhdHNfdGhyZXNob2xkX2ludGVydmFsLnN0YXRpc3RpY19pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5wb3J0X3N0YXRzX3RocmVzaG9sZF9pbnRlcnZhbC5pbnRlcnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MSU5LX1NUQVRTX1RIUkVTSE9MRF9JTlRFUlZBTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51Lmxpbmtfc3RhdHNfdGhyZXNob2xkX2ludGVydmFsLnN0YXRpc3RpY19pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5saW5rX3N0YXRzX3RocmVzaG9sZF9pbnRlcnZhbC5pbnRlcnZhbCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0RVUExFWF9TVEFUVVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbWFjX2R1cGxleF9zdGF0dXNfdW5wYWNrKCZ0aGlzLT51LnN0ZF9tYWNfZHVwbGV4X3N0YXR1cy5zdGF0dXMsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19BRE1JTl9TVEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9hdXRvbmVnb3RpYXRlX2FkbWluX3N0YXRlX3VucGFjaygmdGhpcy0+dS5zdGRfYXV0b19uZWdfYWRtaW5fc3RhdGUuc3RhdGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQVVfTUVESUFfQVZBSUw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbWF1X21lZGlhX2F2YWlsYWJsZV91bnBhY2soJnRoaXMtPnUuc3RkX21hdV9tZWRpYV9hdmFpbC5zdGF0dXMsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01ESV9DUk9TU09WRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbWRpX21vZGVfdW5wYWNrKCZ0aGlzLT51Lm1kaV9jcm9zc292ZXIubW9kZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19BRERSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX21hY19hZGRyZXNzKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zdGRfbWFjX2FkZHIuYWRkcmVzcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9CQ0FTVF9SQVRFX0xJTUlUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQllQQVNTX1NPRlRfTEVBUk46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DSElQX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ0hJUF9WRVJTSU9OOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ09TX1RSQU5TTEFUSU9OOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ1RMX1ZMQU5fSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ETl9GSUxURVJfVEJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRUdSRVNTX1NIQVBJTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FWFRFTkRFRF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZJUk1XQVJFX1ZFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0lHTVBfRlJBTUVfUkFURV9MSU1JVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0lOR1JFU1NfUE9MSUNJTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9JUE1DX1VOS05PV05fTEVBVkVfRldEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfSkVERUNfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MRUFSTl9NT0RFX1JVTEVfVVBEQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTElOS19TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xVRV9GSUVMRF9TRUxFQ1RfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01DQVNUX0dST1VQX0lORk86CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX0RZTkFNSUNfRU5UUklFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfVkxBTl9NRU1CRVJTSElQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9WTEFOX1BPTElDWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BSSV9FTlFVRVVJTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TRUFSQ0hfQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1RBVElDX01BQ19UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfQURfU0VMRUNUX0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfQURfVEVDSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19BVVRPX0NGRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19MT0NBTF9TRUxFQ1RfQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19MT0NBTF9URUNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX1JFTU9URV9TSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfUlhfU0VMRUNUX0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfUlhfVEVDSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfQUJJTElUWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfQ09SUkVDVEVEX0JMT0NLUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfTU9ERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfVU5DT1JSRUNUQUJMRV9CTE9DS1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NBUEFCSUxJVElFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ0FSUklFUl9TRU5TRV9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NPTExJU0lPTl9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfRlJBTUVTX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX0ZSQU1FU19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9GVU5DU19TVVBQT1JURUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfUEFVU0VfREVMQVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfVU5TVVBQT1JURURfT1BfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSX0VYQ0VTU0lWRV9ERUZFUlJBTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVTX0RFRkVSUkVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRVNfTE9TVF9NQUNfUlhfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRVNfTE9TVF9NQUNfVFhfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTUNBU1RfQUREUl9MSVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19NQ0FTVF9SWF9TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX09VVF9PRl9SQU5HRV9MRU5fRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19QUk9NSVNDVU9VU19TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX1RYX0VOQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX0RJU0NPVkVSWV9USU1FT1VUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfRElTQ09WRVJZX1dJTkRPV19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX1JFR19BQ0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9SRUdfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX1JFUE9SVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX0dBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9SRUdJU1RFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9QSFlfQURNSU5fU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfUEhZX1RZUEVfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1VQX0ZJTFRFUl9UQkw6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsICh0aGlzLT53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPndpZHRoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2F0dHJpYnV0ZSBsZWFmOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50OF90IGxlbmd0aDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hdHRyaWJ1dGVfdW5wYWNrKCZsZWFmLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgc3dpdGNoIChsZWFmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xVRV9GSUVMRF9TRUxFQ1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVTX1RYX09LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfU0lOR0xFX0NPTExfRlJBTUVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTVVMVElQTEVfQ09MTF9GUkFNRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRVNfUlhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GQ1NfRVJSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQUxJR05fRVJSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfT0NURVRTX1RYX09LOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTEFURV9DT0xMSVNJT05TOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRVhDRVNTSVZFX0NPTExJU0lPTlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19PQ1RFVFNfUlhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19NQ0FTVF9GUkFNRVNfVFhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19CQ0FTVF9GUkFNRVNfVFhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19NQ0FTVF9GUkFNRVNfUlhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19CQ0FTVF9GUkFNRVNfUlhfT0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19JTl9SQU5HRV9MRU5fRVJSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVfVE9PX0xPTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19FTkFCTEVfU1RBVFVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9QSFlfU1lNQk9MX0VSUl9EVVJJTkdfQ0FSUklFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfUEFVU0VfVFg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX1BBVVNFX1JYOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9PQU1fTE9DQUxfRVJSX0ZSQU1FX1NFQ1NfRVZFTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX09BTV9FTVVMX0NSQzhFUlI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfTUFDX0NUUkxfRlJBTUVTX1RYOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX01BQ19DVFJMX0ZSQU1FU19SWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9SRUdfQUNLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX1JFR19SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX1JFUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9HQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX1JFR0lTVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0RZTl9MRUFSTl9UQkxfU0laRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9EWU5fTEVBUk5fQUdFX0xJTUlUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FX1RPT19TSE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTY0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FNjVUTzEyNzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTEyOFRPMjU1OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMjU2VE81MTE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUU1MTJUTzEwMjM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxMDI0VE8xNTE4OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMTUxOVBMVVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUU2NDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTY1VE8xMjc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUUxMjhUTzI1NToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTI1NlRPNTExOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FNTEyVE8xMDIzOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMTAyNFRPMTUxODoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTE1MTlQTFVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0RFTEFZX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9ERUxBWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRVNfRFJPUFBFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19EUk9QUEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX0RFTEFZRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfQllURVNfVU5VU0VEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0RFTEFZX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9ERUxBWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRVNfRFJPUFBFRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9CWVRFU19EUk9QUEVEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0JZVEVTX0RFTEFZRUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9TVEFUX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xJTktfU1RBVF9USFJFU0hPTEQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FTkNSWVBUX0tFWV9FWFBJUllfVElNRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MRU5fRVJST1JfRElTQ0FSRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9EWU5fTUFDX1RCTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUkVQT1JUX1RIUkVTSE9MRFM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdGhyZXNob2xkc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB0aHJlc2hvbGRzX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodGhyZXNob2xkc19lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1ZMQU5fRVRIRVJUWVBFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9DQVBBQklMSVRZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ORVdfRE5fRklMVEVSX1RCTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBydWxlc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJ1bGVzX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQocnVsZXNfZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX05FV19VUF9GSUxURVJfVEJMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHJ1bGVzX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcnVsZXNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChydWxlc19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQVJQX1JFUExJQ0FURV9ERVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xBQ1BfREVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9PTlVfSUdNUF9WTEFOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgdmxhbnNfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdmxhbnNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF92bGFuKSAqIHZsYW5zX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgdmxhbnNfY291bnQgKiA1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0RZTl9MRUFSTklOR19NT0RFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01JTl9NQUNfTElNSVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfT05VX0FHR1JFR0FURV9MSU1JVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9OVlNfU0NSQVRDSFBBRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBkYXRhX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGRhdGFfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChkYXRhX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GTE9PRF9VTktOT1dOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xPQ0FMX1NXSVRDSElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ET1dOX0JVUlNUX1RPTEw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRkVDX01PREU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9URU1QRVJBVFVSRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1dFUl9NT05fVkNDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9UWF9CSUFTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9UWF9QT1dFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgOCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1dFUl9NT05fUlhfUE9XRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTkVUV09SS19QT05fTUFQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbmV0d29ya19lcG9uX3BvcnRzX2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmbmV0d29ya19lcG9uX3BvcnRzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogbmV0d29ya19lcG9uX3BvcnRzX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgbmV0d29ya19lcG9uX3BvcnRzX2NvdW50ICogMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QU1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NMRV9NT0RFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xFQVJOX1RBQkxFX01PREU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFJBTlNDRUlWRVJfU0lHTkFMX0RFVEVDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DUk9TU0JBUl9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCB1c2VyX3BvcnRfdG9fbmV0d29ya19wb3J0X2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdXNlcl9wb3J0X3RvX25ldHdvcmtfcG9ydF9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50OF90KSAqIHVzZXJfcG9ydF90b19uZXR3b3JrX3BvcnRfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCB1c2VyX3BvcnRfdG9fbmV0d29ya19wb3J0X2NvdW50ICogMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UUkFOU0NFSVZFUl9CVVJTVF9BQ1RJVklUWToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DT05UUk9MX1BPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVkxBTl9ERVNUSU5BVElPTlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBtYXBwaW5nc19jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZtYXBwaW5nc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGVrX3ZsYW5fZGVzdGluYXRpb25fbWFwcGluZykgKiBtYXBwaW5nc19jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIG1hcHBpbmdzX2NvdW50ICogNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FTkNSWVBUSU9OX01PREU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0lOVEVSTkFMX1ZFUlNJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZJUk1XQVJFX1RJTUVTVEFNUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9PTlVfUlVMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3J1bGVfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPTElDRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVU5JX1NIQVBFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IG51bWJlcl9vZl9zaGFwZXJzOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmbnVtYmVyX29mX3NoYXBlcnMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3VuaV9zaGFwZXIpICogbnVtYmVyX29mX3NoYXBlcnMpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCBudW1iZXJfb2Zfc2hhcGVycyAqIDEwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VYVF9GSVJNV0FSRV9WRVJTSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VOQ1JZUFRJT05fS0VZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3Qga2V5X2xlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAma2V5X2xlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50OF90KSAqIGtleV9sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCBrZXlfbGVuZ3RoICogMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GSUxFX0lORk86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Jhc2Vfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NZU1RFTV9SVUxFX09QVElPTlM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTVRVOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX05WU19TVEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9RVUVVRVBSSU1BUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IHByaW9yaXR5X2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmcHJpb3JpdHlfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiBwcmlvcml0eV9jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIHByaW9yaXR5X2NvdW50ICogMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX0RPV05fQklUX0xPQURJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDY0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVVBfQklUX0xPQURJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDY0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfU0RNX1BIQVNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfU0RNX0FNUExJVFVERToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19zdGF0X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1NETV9RVUFOVElaRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQwOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVU5VU0VEMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19zdGF0X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQzOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVU5VU0VENDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19zdGF0X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9RVUVVRV9DT05GSUdfVjI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MmJhc2Vfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZFQVRVUkVfU0VUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9QSFlfVFlQRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TRVFVRU5DRV9OVU1CRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTVBDUF9DTE9DSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NUENQX0NMT0NLX0NPTVBFTlNBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDE2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01DQVNUX0dMT0JBTF9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01DQVNUX0RPTUFJTl9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9yZWNvcmRfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX09OVV9IT0xET1ZFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQUxBUk1fVEhSRVNIT0xEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRkFJTFNBRkU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfU1RBVFNfVEhSRVNIT0xEX0lOVEVSVkFMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MSU5LX1NUQVRTX1RIUkVTSE9MRF9JTlRFUlZBTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19EVVBMRVhfU1RBVFVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19BRE1JTl9TVEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFVX01FRElBX0FWQUlMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01ESV9DUk9TU09WRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19BRERSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0JDQVNUX1JBVEVfTElNSVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9CWVBBU1NfU09GVF9MRUFSTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0NISVBfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DSElQX1ZFUlNJT046CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DT1NfVFJBTlNMQVRJT046CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DVExfVkxBTl9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ROX0ZJTFRFUl9UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FR1JFU1NfU0hBUElORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VYVEVOREVEX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRklSTVdBUkVfVkVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfSUdNUF9GUkFNRV9SQVRFX0xJTUlUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfSU5HUkVTU19QT0xJQ0lORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0lQTUNfVU5LTk9XTl9MRUFWRV9GV0Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9KRURFQ19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xFQVJOX01PREVfUlVMRV9VUERBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MSU5LX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTFVFX0ZJRUxEX1NFTEVDVF9MSVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTUNBU1RfR1JPVVBfSU5GTzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfRFlOQU1JQ19FTlRSSUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9WTEFOX01FTUJFUlNISVA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX1ZMQU5fUE9MSUNZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUFJJX0VOUVVFVUlORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NFQVJDSF9DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVEFUSUNfTUFDX1RCTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19BRF9TRUxFQ1RfQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19BRF9URUNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0FVVE9fQ0ZHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0xPQ0FMX1NFTEVDVF9BQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0xPQ0FMX1RFQ0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfUkVNT1RFX1NJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19SWF9TRUxFQ1RfQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19SWF9URUNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0ZFQ19BQklMSVRZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0ZFQ19DT1JSRUNURURfQkxPQ0tTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0ZFQ19NT0RFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0ZFQ19VTkNPUlJFQ1RBQkxFX0JMT0NLUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ0FQQUJJTElUSUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DQVJSSUVSX1NFTlNFX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ09MTElTSU9OX0ZSQU1FUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9GUkFNRVNfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfRlJBTUVTX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX0ZVTkNTX1NVUFBPUlRFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9QQVVTRV9ERUxBWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9VTlNVUFBPUlRFRF9PUF9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJfRVhDRVNTSVZFX0RFRkVSUkFMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRVNfREVGRVJSRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FU19MT1NUX01BQ19SWF9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FU19MT1NUX01BQ19UWF9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19NQ0FTVF9BRERSX0xJU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX01DQVNUX1JYX1NUQVRVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfT1VUX09GX1JBTkdFX0xFTl9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX1BST01JU0NVT1VTX1NUQVRVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfVFhfRU5BQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfRElTQ09WRVJZX1RJTUVPVVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9ESVNDT1ZFUllfV0lORE9XX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfUlhfUkVHX0FDSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX1JFR19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfUlhfUkVQT1JUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfVFhfR0FURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX1JFR0lTVEVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX1BIWV9BRE1JTl9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9QSFlfVFlQRV9MSVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVVBfRklMVEVSX1RCTDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgKGxlbmd0aCA9PSAwKSA/IDB4MDA4MCA6IGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9yZXBvcnRfdGhyZXNob2xkc19jb3VudF90aHJlc2hvbGRzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX25ld19kbl9maWx0ZXJfdGJsX2NvdW50X3J1bGVzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgdWludDMyX3QgZHVtbXkgPSAwOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgYnVmQ2xvbmUgPSAqYnVmOworICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX3NjYW4oJmJ1ZkNsb25lLCAmZHVtbXkpKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfbmV3X3VwX2ZpbHRlcl90YmxfY291bnRfcnVsZXMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICB1aW50MzJfdCBkdW1teSA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBidWZDbG9uZSA9ICpidWY7CisgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfc2NhbigmYnVmQ2xvbmUsICZkdW1teSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9udnNfc2NyYXRjaHBhZF9jb3VudF9kYXRhKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cXVldWVfc2l6ZXNfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+cXVldWVfc2l6ZXNfY291bnQgPiAwKSAmJiAodGhpcy0+cXVldWVfc2l6ZXMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicXVldWVfc2l6ZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWdcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+cXVldWVfc2l6ZXMsIHRoaXMtPnF1ZXVlX3NpemVzX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZ19nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWcgKnRoaXMpCit7CisgICAgcmV0dXJuIDEgKyB0aGlzLT5xdWV1ZV9zaXplc19jb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWcgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5xdWV1ZV9zaXplc19jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5xdWV1ZV9zaXplc19jb3VudCA+IDApICYmICh0aGlzLT5xdWV1ZV9zaXplcyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInF1ZXVlX3NpemVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnF1ZXVlX3NpemVzID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnF1ZXVlX3NpemVzX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+cXVldWVfc2l6ZXMsIHRoaXMtPnF1ZXVlX3NpemVzX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgcXVldWVfc2l6ZXNfY291bnQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmcXVldWVfc2l6ZXNfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiBxdWV1ZV9zaXplc19jb3VudCk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBxdWV1ZV9zaXplc19jb3VudCAqIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfc25vb3BpbmdfcG9ydF9jb25maWdfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfc25vb3BpbmdfcG9ydF9jb25maWcgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5udW1iZXJfb2ZfaWdtcF9ncm91cHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnJlbGF0aXZlX3F1ZXVlX2Zvcl9jbGFzc2lmaWNhdGlvbikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9zbm9vcGluZ19wb3J0X2NvbmZpZ191bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX3BvcnRfY29uZmlnICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bnVtYmVyX29mX2lnbXBfZ3JvdXBzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5yZWxhdGl2ZV9xdWV1ZV9mb3JfY2xhc3NpZmljYXRpb24pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfc25vb3BpbmdfcG9ydF9jb25maWdfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF9ncm91cF9ub192aWRfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX2dyb3VwX25vX3ZpZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9pcHY0X2FkZHJlc3MoYnVmLCB0aGlzLT5ncm91cCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+cG9ydHMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX2dyb3VwX25vX3ZpZF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF9ncm91cF9ub192aWQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9pcHY0X2FkZHJlc3MoYnVmLCAmdGhpcy0+Z3JvdXApKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnBvcnRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF9ncm91cF9ub192aWRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA1KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYWN0aW9uX3BhY2sodGhpcy0+bGVhZiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGhpcy0+d2lkdGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPndpZHRoKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5sZWFmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0FERF9TVEFUSUNfRU5UUlk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+dS5hZGRfc3RhdGljX2VudHJ5Lm1hYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxfU1RBVElDX0VOVFJZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPnUuZGVsX3N0YXRpY19lbnRyeS5tYWMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQUREX1JVTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmFkZF9ydWxlLnJ1bGVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuYWRkX3J1bGUucnVsZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicnVsZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlX2FkZF9ydWxlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUuYWRkX3J1bGUucnVsZXNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfcGFjaygmdGhpcy0+dS5hZGRfcnVsZS5ydWxlc1tpMF0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTkVXX0FERF9SVUxFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9wYWNrKCZ0aGlzLT51Lm5ld19hZGRfcnVsZS5ydWxlcywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX05FV19ERUxfUlVMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUubmV3X2RlbF9ydWxlLnJ1bGVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUubmV3X2RlbF9ydWxlLnJ1bGVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJ1bGVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZV9uZXdfZGVsX3J1bGVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5uZXdfZGVsX3J1bGUucnVsZXNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfcGFjaygmdGhpcy0+dS5uZXdfZGVsX3J1bGUucnVsZXNbaTFdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTEVURV9SVUxFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkyOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5kZWxldGVfcnVsZS5ydWxlc19jb3VudCA+IDApICYmICh0aGlzLT51LmRlbGV0ZV9ydWxlLnJ1bGVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJ1bGVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZV9kZWxldGVfcnVsZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkyID0gMDsgaTIgPCB0aGlzLT51LmRlbGV0ZV9ydWxlLnJ1bGVzX2NvdW50OyBpMisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX3BhY2soJnRoaXMtPnUuZGVsZXRlX3J1bGUucnVsZXNbaTJdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1JFU0VUX09OVToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfU1RBVFM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9HUElPX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX0dQSU9fQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LnNldF9ncGlvX2NvbmZpZy5ncGlvX2NvbmZpZykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfUVVFVUVfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTM7CisgICAgICAgICAgICAgICAgdWludDhfdCBpNDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNldF9xdWV1ZV9jb25maWcubGlua3NfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfcXVldWVfY29uZmlnLmxpbmtzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X3F1ZXVlX2NvbmZpZy5saW5rcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJsaW5rc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2Vfc2V0X3F1ZXVlX2NvbmZpZ1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkzID0gMDsgaTMgPCB0aGlzLT51LnNldF9xdWV1ZV9jb25maWcubGlua3NfY291bnQ7IGkzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZ19wYWNrKCZ0aGlzLT51LnNldF9xdWV1ZV9jb25maWcubGlua3NbaTNdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNldF9xdWV1ZV9jb25maWcucG9ydHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfcXVldWVfY29uZmlnLnBvcnRzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X3F1ZXVlX2NvbmZpZy5wb3J0cyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwb3J0c1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2Vfc2V0X3F1ZXVlX2NvbmZpZ1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk0ID0gMDsgaTQgPCB0aGlzLT51LnNldF9xdWV1ZV9jb25maWcucG9ydHNfY291bnQ7IGk0KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZ19wYWNrKCZ0aGlzLT51LnNldF9xdWV1ZV9jb25maWcucG9ydHNbaTRdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZ19wYWNrKCZ0aGlzLT51LnNldF9xdWV1ZV9jb25maWcubXVsdGljYXN0LCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX1FVRVVFX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRVJBU0VfTlZTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfSUdNUF9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpNTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNldF9pZ21wX2NvbmZpZy5yb2J1c3RuZXNzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNldF9pZ21wX2NvbmZpZy5sYXN0X21lbWJlcl9xdWVyeV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5zZXRfaWdtcF9jb25maWcucG9ydHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfaWdtcF9jb25maWcucG9ydHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfaWdtcF9jb25maWcucG9ydHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicG9ydHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlX3NldF9pZ21wX2NvbmZpZ1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk1ID0gMDsgaTUgPCB0aGlzLT51LnNldF9pZ21wX2NvbmZpZy5wb3J0c19jb3VudDsgaTUrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX3BvcnRfY29uZmlnX3BhY2soJnRoaXMtPnUuc2V0X2lnbXBfY29uZmlnLnBvcnRzW2k1XSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfZm9yd2FyZGluZ19xdWFsaWZlcl9wYWNrKHRoaXMtPnUuc2V0X2lnbXBfY29uZmlnLmdycF9mb3J3YXJkLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX29wdGlvbnNfcGFjayh0aGlzLT51LnNldF9pZ21wX2NvbmZpZy5vcHRpb25zLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0lHTVBfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfSUdNUF9HUk9VUF9JTkZPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9BRERfSUdNUF9HUk9VUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGk2OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuYWRkX2lnbXBfZ3JvdXAuZ3JvdXBzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuYWRkX2lnbXBfZ3JvdXAuZ3JvdXBzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuYWRkX2lnbXBfZ3JvdXAuZ3JvdXBzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImdyb3Vwc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2VfYWRkX2lnbXBfZ3JvdXBcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpNiA9IDA7IGk2IDwgdGhpcy0+dS5hZGRfaWdtcF9ncm91cC5ncm91cHNfY291bnQ7IGk2KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X2lnbXBfZ3JvdXBfbm9fdmlkX3BhY2soJnRoaXMtPnUuYWRkX2lnbXBfZ3JvdXAuZ3JvdXBzW2k2XSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfT0FNX1JBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9PQU1fUkFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNldF9vYW1fcmF0ZS5tYXhfb2FtX3JhdGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuc2V0X29hbV9yYXRlLm1pbl9vYW1fcmF0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfTE9BRF9JTkZPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9CQ19MQVNFUl9QT1dFUl9PRkY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuYmNfbGFzZXJfcG93ZXJfb2ZmLm9mZl90aW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NMRUVQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LnNsZWVwLnRpbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3NsZWVwX29wdGlvbnNfcGFjayh0aGlzLT51LnNsZWVwLm9wdGlvbnMsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9BRERfTFVFX1JVTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTF9MVUVfUlVMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRU5BQkxFX1BPTElDRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZmxvd19kaXJlY3Rpb25fcGFjayh0aGlzLT51LmVuYWJsZV9wb2xpY2VyLmRpcmVjdGlvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmVuYWJsZV9wb2xpY2VyLnBvbGljZXJfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmVuYWJsZV9wb2xpY2VyLmJ1cnN0X3NpemUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmVuYWJsZV9wb2xpY2VyLnRyYWZmaWNfcmF0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ESVNBQkxFX1BPTElDRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZmxvd19kaXJlY3Rpb25fcGFjayh0aGlzLT51LmRpc2FibGVfcG9saWNlci5kaXJlY3Rpb24sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5kaXNhYmxlX3BvbGljZXIucG9saWNlcl9pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfRVBPQ19TRE1fU1RBVFM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZXBvY19zdGF0X2dhdGhlcl9tb2Rlc19wYWNrKHRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLm1vZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZXBvY19zZG0yNTBzdGF0X2luZGV4X3BhY2sodGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMuc3RhdF9pbmRleCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9FUE9DX0NNQ19TVEFUUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9lcG9jX3N0YXRfZ2F0aGVyX21vZGVzX3BhY2sodGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMubW9kZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9lcG9jX2NtY19zdGF0X2luZGV4X3BhY2sodGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMuc3RhdF9pbmRleCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9FUE9DX0NOVV9TVEFUUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9lcG9jX3N0YXRfZ2F0aGVyX21vZGVzX3BhY2sodGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMubW9kZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9lcG9jX2NudV9zdGF0X2luZGV4X3BhY2sodGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMuc3RhdF9pbmRleCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9ETl9CQ0FTVF9RVUVVRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LnNldF9kbl9iY2FzdF9xdWV1ZS5wb3J0X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X2RuX2JjYXN0X3F1ZXVlLnBvcnRfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfZG5fYmNhc3RfcXVldWUucXVldWVfcGVyX3BvcnQgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicXVldWVfcGVyX3BvcnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlX3NldF9kbl9iY2FzdF9xdWV1ZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LnNldF9kbl9iY2FzdF9xdWV1ZS5xdWV1ZV9wZXJfcG9ydCwgdGhpcy0+dS5zZXRfZG5fYmNhc3RfcXVldWUucG9ydF9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfRE5fQkNBU1RfUVVFVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX0ROX0ZJTFRFUl9UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9ETl9VU0VSX1JVTEVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfRFlOX0xFQVJOX1RCTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX0xVRV9SVUxFX1RBQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfVVBfRklMVEVSX1RCTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX1VQX1VTRVJfUlVMRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTFJfRE5fQ0xBU1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTFJfVVBfQ0xBU1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxfSUdNUF9HUk9VUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTEVURV9NQ0FTVF9ET01BSU5fQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMRVRFX01DQVNUX0dST1VQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRVBPQ19VTlVTRUQwOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRVBPQ19VTlVTRUQxOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRklORF9MVUVfUlVMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9HUElPX1ZBTFVFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0xVRV9GSUVMRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9NRElPOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX1BIWV9BRERSX01ESU86CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfUE9SVF9SQVRFX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfUVVFVUVfUkFURV9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTEFTRVJfVFhfUE9XRVJfT0ZGOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTE9PUEJBQ0tfRElTQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0xPT1BCQUNLX0VOQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX09OVV9ESVNBQkxFX1VTRVJfVFJBRkZJQzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX09OVV9FTkFCTEVfVVNFUl9UUkFGRklDOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fUFJPVEVDVElPTl9TV0lUQ0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfR1BJT19WQUxVRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9MVUVfRklFTEQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfTURJTzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9QSFlfQUREUl9NRElPOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX1BPUlRfUkFURV9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX1FVRVVFX1JBVEVfQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9BVVRPX0FETUlOX0NUUkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfQVVUT19SRU5FR09USUFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQUNfQUREX0dST1VQX0FERFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFDX0RFTF9HUk9VUF9BRERSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BQ19JTklUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BQ19TRUxGX1RFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFVX0FETUlOX0NUUkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFVX1JFU0VUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1BIWV9BRE1JTl9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1BPUlRfQURNSU5fQ1RSTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9SUFRfSU5fU0VSVklDRV9URVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1JQVF9SRVNFVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2UgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPndpZHRoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLT53aWR0aDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdWludDMyX3QgY291bnQgPSAzOworICAgICAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9BRERfU1RBVElDX0VOVFJZOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gNjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMX1NUQVRJQ19FTlRSWToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0FERF9SVUxFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaTA7CisgICAgICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5hZGRfcnVsZS5ydWxlc19jb3VudCA+IDApICYmICh0aGlzLT51LmFkZF9ydWxlLnJ1bGVzID09IE5VTEwpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicnVsZXNfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5hZGRfcnVsZS5ydWxlc19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5hZGRfcnVsZS5ydWxlc1tpMF0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX05FV19BRERfUlVMRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUubmV3X2FkZF9ydWxlLnJ1bGVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTkVXX0RFTF9SVUxFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaTE7CisgICAgICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5uZXdfZGVsX3J1bGUucnVsZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5uZXdfZGVsX3J1bGUucnVsZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJydWxlc19jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51Lm5ld19kZWxfcnVsZS5ydWxlc19jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5uZXdfZGVsX3J1bGUucnVsZXNbaTFdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxFVEVfUlVMRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGkyOworICAgICAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZGVsZXRlX3J1bGUucnVsZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5kZWxldGVfcnVsZS5ydWxlcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJ1bGVzX2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUuZGVsZXRlX3J1bGUucnVsZXNfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZGVsZXRlX3J1bGUucnVsZXNbaTJdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9SRVNFVF9PTlU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9TVEFUUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9HUElPX0NPTkZJRzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9HUElPX0NPTkZJRzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9RVUVVRV9DT05GSUc6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpMzsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaTQ7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDIgKyBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWdfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuc2V0X3F1ZXVlX2NvbmZpZy5tdWx0aWNhc3QpOworICAgICAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X3F1ZXVlX2NvbmZpZy5saW5rc19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9xdWV1ZV9jb25maWcubGlua3MgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJsaW5rc19jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3IgKGkzID0gMDsgaTMgPCB0aGlzLT51LnNldF9xdWV1ZV9jb25maWcubGlua3NfY291bnQ7IGkzKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZ19nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5zZXRfcXVldWVfY29uZmlnLmxpbmtzW2kzXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X3F1ZXVlX2NvbmZpZy5wb3J0c19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9xdWV1ZV9jb25maWcucG9ydHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwb3J0c19jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3IgKGk0ID0gMDsgaTQgPCB0aGlzLT51LnNldF9xdWV1ZV9jb25maWcucG9ydHNfY291bnQ7IGk0KyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZ19nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5zZXRfcXVldWVfY29uZmlnLnBvcnRzW2k0XSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX1FVRVVFX0NPTkZJRzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0VSQVNFX05WUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9JR01QX0NPTkZJRzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDYgKyAoMiAqIHRoaXMtPnUuc2V0X2lnbXBfY29uZmlnLnBvcnRzX2NvdW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0lHTVBfQ09ORklHOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0lHTVBfR1JPVVBfSU5GTzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0FERF9JR01QX0dST1VQOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMSArICg1ICogdGhpcy0+dS5hZGRfaWdtcF9ncm91cC5ncm91cHNfY291bnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfT0FNX1JBVEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfT0FNX1JBVEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfTE9BRF9JTkZPOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQkNfTEFTRVJfUE9XRVJfT0ZGOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0xFRVA6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSA2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9BRERfTFVFX1JVTEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxfTFVFX1JVTEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9FTkFCTEVfUE9MSUNFUjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDEwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ESVNBQkxFX1BPTElDRVI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfRVBPQ19TRE1fU1RBVFM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfRVBPQ19DTUNfU1RBVFM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfRVBPQ19DTlVfU1RBVFM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfRE5fQkNBU1RfUVVFVUU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgdGhpcy0+dS5zZXRfZG5fYmNhc3RfcXVldWUucG9ydF9jb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0ROX0JDQVNUX1FVRVVFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfRE5fRklMVEVSX1RCTDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9ETl9VU0VSX1JVTEVTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX0RZTl9MRUFSTl9UQkw6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfTFVFX1JVTEVfVEFCTEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfVVBfRklMVEVSX1RCTDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9VUF9VU0VSX1JVTEVTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMUl9ETl9DTEFTUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTFJfVVBfQ0xBU1M6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMX0lHTVBfR1JPVVA6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMRVRFX01DQVNUX0RPTUFJTl9DT05GSUc6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMRVRFX01DQVNUX0dST1VQOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0VQT0NfVU5VU0VEMDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9FUE9DX1VOVVNFRDE6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRklORF9MVUVfUlVMRToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfR1BJT19WQUxVRToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfTFVFX0ZJRUxEOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9NRElPOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9QSFlfQUREUl9NRElPOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9QT1JUX1JBVEVfQ09OVFJPTDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfUVVFVUVfUkFURV9DT05UUk9MOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0xBU0VSX1RYX1BPV0VSX09GRjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9MT09QQkFDS19ESVNBQkxFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0xPT1BCQUNLX0VOQUJMRToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9PTlVfRElTQUJMRV9VU0VSX1RSQUZGSUM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fT05VX0VOQUJMRV9VU0VSX1RSQUZGSUM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fUFJPVEVDVElPTl9TV0lUQ0g6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX0dQSU9fVkFMVUU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX0xVRV9GSUVMRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfTURJTzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfUEhZX0FERFJfTURJTzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfUE9SVF9SQVRFX0NPTlRST0w6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX1FVRVVFX1JBVEVfQ09OVFJPTDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfQVVUT19BRE1JTl9DVFJMOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9BVVRPX1JFTkVHT1RJQVRFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQUNfQUREX0dST1VQX0FERFI6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BQ19ERUxfR1JPVVBfQUREUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFDX0lOSVQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BQ19TRUxGX1RFU1Q6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BVV9BRE1JTl9DVFJMOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQVVfUkVTRVQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1BIWV9BRE1JTl9DT05UUk9MOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9QT1JUX0FETUlOX0NUUkw6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1JQVF9JTl9TRVJWSUNFX1RFU1Q6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1JQVF9SRVNFVDoKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYWN0aW9uX3VucGFjaygmdGhpcy0+bGVhZiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT53aWR0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPndpZHRoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+d2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT5sZWFmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0FERF9TVEFUSUNfRU5UUlk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfbWFjX2FkZHJlc3MoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmFkZF9zdGF0aWNfZW50cnkubWFjKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTF9TVEFUSUNfRU5UUlk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfbWFjX2FkZHJlc3MoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmRlbF9zdGF0aWNfZW50cnkubWFjKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0FERF9SVUxFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgIHRoaXMtPnUuYWRkX3J1bGUucnVsZXNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlX2FkZF9ydWxlX2NvdW50X3J1bGVzKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuYWRkX3J1bGUucnVsZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5hZGRfcnVsZS5ydWxlcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJ1bGVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZV9hZGRfcnVsZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmFkZF9ydWxlLnJ1bGVzID0gKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGUgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuYWRkX3J1bGUucnVsZXNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5hZGRfcnVsZS5ydWxlc19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV91bnBhY2soJnRoaXMtPnUuYWRkX3J1bGUucnVsZXNbaTBdLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ORVdfQUREX1JVTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX3VucGFjaygmdGhpcy0+dS5uZXdfYWRkX3J1bGUucnVsZXMsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTkVXX0RFTF9SVUxFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxOworICAgICAgICAgICAgICAgIHRoaXMtPnUubmV3X2RlbF9ydWxlLnJ1bGVzX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZV9uZXdfZGVsX3J1bGVfY291bnRfcnVsZXMoJnBvc3RMZW5CdWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5uZXdfZGVsX3J1bGUucnVsZXNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5uZXdfZGVsX3J1bGUucnVsZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJydWxlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2VfbmV3X2RlbF9ydWxlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUubmV3X2RlbF9ydWxlLnJ1bGVzID0gKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGUgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUubmV3X2RlbF9ydWxlLnJ1bGVzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGUpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHRoaXMtPnUubmV3X2RlbF9ydWxlLnJ1bGVzX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX3VucGFjaygmdGhpcy0+dS5uZXdfZGVsX3J1bGUucnVsZXNbaTFdLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxFVEVfUlVMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMjsKKyAgICAgICAgICAgICAgICB0aGlzLT51LmRlbGV0ZV9ydWxlLnJ1bGVzX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZV9kZWxldGVfcnVsZV9jb3VudF9ydWxlcygmcG9zdExlbkJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmRlbGV0ZV9ydWxlLnJ1bGVzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZGVsZXRlX3J1bGUucnVsZXMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJydWxlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2VfZGVsZXRlX3J1bGVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5kZWxldGVfcnVsZS5ydWxlcyA9IChiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmRlbGV0ZV9ydWxlLnJ1bGVzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGUpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUuZGVsZXRlX3J1bGUucnVsZXNfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfdW5wYWNrKCZ0aGlzLT51LmRlbGV0ZV9ydWxlLnJ1bGVzW2kyXSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fUkVTRVRfT05VOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9TVEFUUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0dQSU9fQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfR1BJT19DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zZXRfZ3Bpb19jb25maWcuZ3Bpb19jb25maWcpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX1FVRVVFX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkzOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnNldF9xdWV1ZV9jb25maWcubGlua3NfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfcXVldWVfY29uZmlnLmxpbmtzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X3F1ZXVlX2NvbmZpZy5saW5rcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImxpbmtzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZV9zZXRfcXVldWVfY29uZmlnXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuc2V0X3F1ZXVlX2NvbmZpZy5saW5rcyA9IChiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWcgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuc2V0X3F1ZXVlX2NvbmZpZy5saW5rc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWcpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IHRoaXMtPnUuc2V0X3F1ZXVlX2NvbmZpZy5saW5rc19jb3VudDsgaTMrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnX3VucGFjaygmdGhpcy0+dS5zZXRfcXVldWVfY29uZmlnLmxpbmtzW2kzXSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zZXRfcXVldWVfY29uZmlnLnBvcnRzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X3F1ZXVlX2NvbmZpZy5wb3J0c19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9xdWV1ZV9jb25maWcucG9ydHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwb3J0c1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2Vfc2V0X3F1ZXVlX2NvbmZpZ1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnNldF9xdWV1ZV9jb25maWcucG9ydHMgPSAoYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnNldF9xdWV1ZV9jb25maWcucG9ydHNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk0ID0gMDsgaTQgPCB0aGlzLT51LnNldF9xdWV1ZV9jb25maWcucG9ydHNfY291bnQ7IGk0KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZ191bnBhY2soJnRoaXMtPnUuc2V0X3F1ZXVlX2NvbmZpZy5wb3J0c1tpNF0sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZ191bnBhY2soJnRoaXMtPnUuc2V0X3F1ZXVlX2NvbmZpZy5tdWx0aWNhc3QsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX1FVRVVFX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRVJBU0VfTlZTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfSUdNUF9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpNTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuc2V0X2lnbXBfY29uZmlnLnJvYnVzdG5lc3NfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zZXRfaWdtcF9jb25maWcubGFzdF9tZW1iZXJfcXVlcnlfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zZXRfaWdtcF9jb25maWcucG9ydHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5zZXRfaWdtcF9jb25maWcucG9ydHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfaWdtcF9jb25maWcucG9ydHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwb3J0c1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2Vfc2V0X2lnbXBfY29uZmlnXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuc2V0X2lnbXBfY29uZmlnLnBvcnRzID0gKGJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9zbm9vcGluZ19wb3J0X2NvbmZpZyAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5zZXRfaWdtcF9jb25maWcucG9ydHNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX3BvcnRfY29uZmlnKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk1ID0gMDsgaTUgPCB0aGlzLT51LnNldF9pZ21wX2NvbmZpZy5wb3J0c19jb3VudDsgaTUrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX3BvcnRfY29uZmlnX3VucGFjaygmdGhpcy0+dS5zZXRfaWdtcF9jb25maWcucG9ydHNbaTVdLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfZm9yd2FyZGluZ19xdWFsaWZlcl91bnBhY2soJnRoaXMtPnUuc2V0X2lnbXBfY29uZmlnLmdycF9mb3J3YXJkLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfc25vb3Bpbmdfb3B0aW9uc191bnBhY2soJnRoaXMtPnUuc2V0X2lnbXBfY29uZmlnLm9wdGlvbnMsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9JR01QX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0lHTVBfR1JPVVBfSU5GTzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQUREX0lHTVBfR1JPVVA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpNjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuYWRkX2lnbXBfZ3JvdXAuZ3JvdXBzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuYWRkX2lnbXBfZ3JvdXAuZ3JvdXBzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuYWRkX2lnbXBfZ3JvdXAuZ3JvdXBzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZ3JvdXBzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZV9hZGRfaWdtcF9ncm91cFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmFkZF9pZ21wX2dyb3VwLmdyb3VwcyA9IChiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX2dyb3VwX25vX3ZpZCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5hZGRfaWdtcF9ncm91cC5ncm91cHNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF9ncm91cF9ub192aWQpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTYgPSAwOyBpNiA8IHRoaXMtPnUuYWRkX2lnbXBfZ3JvdXAuZ3JvdXBzX2NvdW50OyBpNisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX2dyb3VwX25vX3ZpZF91bnBhY2soJnRoaXMtPnUuYWRkX2lnbXBfZ3JvdXAuZ3JvdXBzW2k2XSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX09BTV9SQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfT0FNX1JBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnNldF9vYW1fcmF0ZS5tYXhfb2FtX3JhdGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zZXRfb2FtX3JhdGUubWluX29hbV9yYXRlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9MT0FEX0lORk86CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0JDX0xBU0VSX1BPV0VSX09GRjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmJjX2xhc2VyX3Bvd2VyX29mZi5vZmZfdGltZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TTEVFUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LnNsZWVwLnRpbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3NsZWVwX29wdGlvbnNfdW5wYWNrKCZ0aGlzLT51LnNsZWVwLm9wdGlvbnMsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0FERF9MVUVfUlVMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMX0xVRV9SVUxFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9FTkFCTEVfUE9MSUNFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9mbG93X2RpcmVjdGlvbl91bnBhY2soJnRoaXMtPnUuZW5hYmxlX3BvbGljZXIuZGlyZWN0aW9uLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmVuYWJsZV9wb2xpY2VyLnBvbGljZXJfaWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZW5hYmxlX3BvbGljZXIuYnVyc3Rfc2l6ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5lbmFibGVfcG9saWNlci50cmFmZmljX3JhdGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRElTQUJMRV9QT0xJQ0VSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Zsb3dfZGlyZWN0aW9uX3VucGFjaygmdGhpcy0+dS5kaXNhYmxlX3BvbGljZXIuZGlyZWN0aW9uLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmRpc2FibGVfcG9saWNlci5wb2xpY2VyX2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9FUE9DX1NETV9TVEFUUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9lcG9jX3N0YXRfZ2F0aGVyX21vZGVzX3VucGFjaygmdGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMubW9kZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Vwb2Nfc2RtMjUwc3RhdF9pbmRleF91bnBhY2soJnRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLnN0YXRfaW5kZXgsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9FUE9DX0NNQ19TVEFUUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9lcG9jX3N0YXRfZ2F0aGVyX21vZGVzX3VucGFjaygmdGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMubW9kZSwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Vwb2NfY21jX3N0YXRfaW5kZXhfdW5wYWNrKCZ0aGlzLT51LmdldF9lcG9jX2NtY19zdGF0cy5zdGF0X2luZGV4LCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfRVBPQ19DTlVfU1RBVFM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZXBvY19zdGF0X2dhdGhlcl9tb2Rlc191bnBhY2soJnRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLm1vZGUsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9lcG9jX2NudV9zdGF0X2luZGV4X3VucGFjaygmdGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMuc3RhdF9pbmRleCwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX0ROX0JDQVNUX1FVRVVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5zZXRfZG5fYmNhc3RfcXVldWUucG9ydF9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF9kbl9iY2FzdF9xdWV1ZS5wb3J0X2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X2RuX2JjYXN0X3F1ZXVlLnF1ZXVlX3Blcl9wb3J0ID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicXVldWVfcGVyX3BvcnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlX3NldF9kbl9iY2FzdF9xdWV1ZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnNldF9kbl9iY2FzdF9xdWV1ZS5xdWV1ZV9wZXJfcG9ydCA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnNldF9kbl9iY2FzdF9xdWV1ZS5wb3J0X2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LnNldF9kbl9iY2FzdF9xdWV1ZS5xdWV1ZV9wZXJfcG9ydCwgdGhpcy0+dS5zZXRfZG5fYmNhc3RfcXVldWUucG9ydF9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfRE5fQkNBU1RfUVVFVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX0ROX0ZJTFRFUl9UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9ETl9VU0VSX1JVTEVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfRFlOX0xFQVJOX1RCTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX0xVRV9SVUxFX1RBQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfVVBfRklMVEVSX1RCTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX1VQX1VTRVJfUlVMRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTFJfRE5fQ0xBU1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTFJfVVBfQ0xBU1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxfSUdNUF9HUk9VUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTEVURV9NQ0FTVF9ET01BSU5fQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMRVRFX01DQVNUX0dST1VQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRVBPQ19VTlVTRUQwOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRVBPQ19VTlVTRUQxOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRklORF9MVUVfUlVMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9HUElPX1ZBTFVFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0xVRV9GSUVMRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9NRElPOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX1BIWV9BRERSX01ESU86CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfUE9SVF9SQVRFX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfUVVFVUVfUkFURV9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTEFTRVJfVFhfUE9XRVJfT0ZGOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTE9PUEJBQ0tfRElTQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0xPT1BCQUNLX0VOQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX09OVV9ESVNBQkxFX1VTRVJfVFJBRkZJQzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX09OVV9FTkFCTEVfVVNFUl9UUkFGRklDOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fUFJPVEVDVElPTl9TV0lUQ0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfR1BJT19WQUxVRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9MVUVfRklFTEQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfTURJTzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9QSFlfQUREUl9NRElPOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX1BPUlRfUkFURV9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX1FVRVVFX1JBVEVfQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9BVVRPX0FETUlOX0NUUkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfQVVUT19SRU5FR09USUFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQUNfQUREX0dST1VQX0FERFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFDX0RFTF9HUk9VUF9BRERSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BQ19JTklUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BQ19TRUxGX1RFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFVX0FETUlOX0NUUkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFVX1JFU0VUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1BIWV9BRE1JTl9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1BPUlRfQURNSU5fQ1RSTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9SUFRfSU5fU0VSVklDRV9URVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1JQVF9SRVNFVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+d2lkdGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hY3Rpb24gbGVhZjsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDhfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYWN0aW9uX3VucGFjaygmbGVhZiwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAobGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9BRERfU1RBVElDX0VOVFJZOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTF9TVEFUSUNfRU5UUlk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQUREX1JVTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcnVsZXNfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBydWxlc19lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHJ1bGVzX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ORVdfQUREX1JVTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ORVdfREVMX1JVTEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcnVsZXNfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBydWxlc19lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHJ1bGVzX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxFVEVfUlVMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBydWxlc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJ1bGVzX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQocnVsZXNfZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1JFU0VUX09OVToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfU1RBVFM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9HUElPX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX0dQSU9fQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9RVUVVRV9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBsaW5rc19jb3VudDsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkwOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgcG9ydHNfY291bnQ7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJmxpbmtzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZykgKiBsaW5rc19jb3VudCk7CisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgbGlua3NfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZ19zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnBvcnRzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZykgKiBwb3J0c19jb3VudCk7CisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgcG9ydHNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZ19zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZ19zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX1FVRVVFX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRVJBU0VfTlZTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfSUdNUF9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBwb3J0c19jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmcG9ydHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX3BvcnRfY29uZmlnKSAqIHBvcnRzX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgcG9ydHNfY291bnQgKiAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0lHTVBfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfSUdNUF9HUk9VUF9JTkZPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9BRERfSUdNUF9HUk9VUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGdyb3Vwc19jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJmdyb3Vwc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX2dyb3VwX25vX3ZpZCkgKiBncm91cHNfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCBncm91cHNfY291bnQgKiA1KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9PQU1fUkFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX09BTV9SQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfTE9BRF9JTkZPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9CQ19MQVNFUl9QT1dFUl9PRkY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0xFRVA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0FERF9MVUVfUlVMRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMX0xVRV9SVUxFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9FTkFCTEVfUE9MSUNFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ESVNBQkxFX1BPTElDRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9FUE9DX1NETV9TVEFUUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0VQT0NfQ01DX1NUQVRTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfRVBPQ19DTlVfU1RBVFM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9ETl9CQ0FTVF9RVUVVRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IHBvcnRfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZwb3J0X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogcG9ydF9jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIHBvcnRfY291bnQgKiAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9ETl9CQ0FTVF9RVUVVRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfRE5fRklMVEVSX1RCTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX0ROX1VTRVJfUlVMRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9EWU5fTEVBUk5fVEJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfTFVFX1JVTEVfVEFCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9VUF9GSUxURVJfVEJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfVVBfVVNFUl9SVUxFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMUl9ETl9DTEFTUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMUl9VUF9DTEFTUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTF9JR01QX0dST1VQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMRVRFX01DQVNUX0RPTUFJTl9DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxFVEVfTUNBU1RfR1JPVVA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9FUE9DX1VOVVNFRDA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9FUE9DX1VOVVNFRDE6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9GSU5EX0xVRV9SVUxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0dQSU9fVkFMVUU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfTFVFX0ZJRUxEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX01ESU86CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfUEhZX0FERFJfTURJTzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9QT1JUX1JBVEVfQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9RVUVVRV9SQVRFX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9MQVNFUl9UWF9QT1dFUl9PRkY6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9MT09QQkFDS19ESVNBQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTE9PUEJBQ0tfRU5BQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fT05VX0RJU0FCTEVfVVNFUl9UUkFGRklDOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fT05VX0VOQUJMRV9VU0VSX1RSQUZGSUM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9QUk9URUNUSU9OX1NXSVRDSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9HUElPX1ZBTFVFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX0xVRV9GSUVMRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9NRElPOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX1BIWV9BRERSX01ESU86CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfUE9SVF9SQVRFX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfUVVFVUVfUkFURV9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX0FVVE9fQURNSU5fQ1RSTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9BVVRPX1JFTkVHT1RJQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BQ19BRERfR1JPVVBfQUREUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQUNfREVMX0dST1VQX0FERFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFDX0lOSVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFDX1NFTEZfVEVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQVVfQURNSU5fQ1RSTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQVVfUkVTRVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfUEhZX0FETUlOX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfUE9SVF9BRE1JTl9DVFJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1JQVF9JTl9TRVJWSUNFX1RFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfUlBUX1JFU0VUOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2VfYWRkX3J1bGVfY291bnRfcnVsZXMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICB1aW50MzJfdCBkdW1teSA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBidWZDbG9uZSA9ICpidWY7CisgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfc2NhbigmYnVmQ2xvbmUsICZkdW1teSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlX25ld19kZWxfcnVsZV9jb3VudF9ydWxlcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIHVpbnQzMl90IGR1bW15ID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIGJ1ZkNsb25lID0gKmJ1ZjsKKyAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9zY2FuKCZidWZDbG9uZSwgJmR1bW15KSkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2VfZGVsZXRlX3J1bGVfY291bnRfcnVsZXMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICB1aW50MzJfdCBkdW1teSA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBidWZDbG9uZSA9ICpidWY7CisgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfc2NhbigmYnVmQ2xvbmUsICZkdW1teSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lcl9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19icmFuY2hfcGFjayh0aGlzLT5icmFuY2gsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5icmFuY2gpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZW5kLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5lbmQudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmtub3duXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyX2VuZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmVuZC51bmtub3duLCB0aGlzLT51LmVuZC51bmtub3duX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9OQU1FX0JJTkRJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X3BhY2soJnRoaXMtPnUubmFtZV9iaW5kaW5nLm9iamVjdF9jb250ZXh0LCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3BhY2soJnRoaXMtPnUuYXR0cmlidXRlLmF0dHJpYnV0ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlX3BhY2soJnRoaXMtPnUuYWN0aW9uLmFjdGlvbiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9PQkpFQ1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfUEFDS0FHRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZGVmLmxlYWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmRlZi53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5kZWYud2lkdGgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgICAgICAgICAgICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIChieXRlc0FmdGVyTGVuRmllbGQgPT0gMCkgPyAweDAwODAgOiAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDB4MDA4MCkgPyAwIDogYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lciAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgc3dpdGNoICh0aGlzLT5icmFuY2gpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSB0aGlzLT51LmVuZC51bmtub3duX2NvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfTkFNRV9CSU5ESU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUubmFtZV9iaW5kaW5nLm9iamVjdF9jb250ZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5hdHRyaWJ1dGUuYXR0cmlidXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmFjdGlvbi5hY3Rpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfT0JKRUNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX1BBQ0tBR0U6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9jb250YWluZXIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfYnJhbmNoX3VucGFjaygmdGhpcy0+YnJhbmNoLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+YnJhbmNoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lcl9lbmRfY291bnRfdW5rbm93bihidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCA+IDApICYmICh0aGlzLT51LmVuZC51bmtub3duID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidW5rbm93blwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lcl9lbmRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5lbmQudW5rbm93biA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmVuZC51bmtub3duX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5lbmQudW5rbm93biwgdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfTkFNRV9CSU5ESU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF91bnBhY2soJnRoaXMtPnUubmFtZV9iaW5kaW5nLm9iamVjdF9jb250ZXh0LCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfdW5wYWNrKCZ0aGlzLT51LmF0dHJpYnV0ZS5hdHRyaWJ1dGUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlX3VucGFjaygmdGhpcy0+dS5hY3Rpb24uYWN0aW9uLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfT0JKRUNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX1BBQ0tBR0U6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmRlZi5sZWFmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmRlZi53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRoaXMtPnUuZGVmLndpZHRoID49IDB4MDA4MCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPnUuZGVmLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5kZWYud2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAodGhpcy0+dS5kZWYud2lkdGggPT0gMCkgPyAweDAwODAgOiB0aGlzLT51LmRlZi53aWR0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lcl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2JyYW5jaCBicmFuY2g7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2JyYW5jaF91bnBhY2soJmJyYW5jaCwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHVua25vd25fZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHVua25vd25fZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh1bmtub3duX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfTkFNRV9CSU5ESU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX09CSkVDVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9QQUNLQUdFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lcl9lbmRfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2FjdGlvbl9wYWNrKHRoaXMtPmxlYWYsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPndpZHRoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT53aWR0aCk7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+bGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfUVVFVUVfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTA7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmdldF9xdWV1ZV9jb25maWcubGlua3NfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfcXVldWVfY29uZmlnLmxpbmtzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3F1ZXVlX2NvbmZpZy5saW5rcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJsaW5rc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2VfZ2V0X3F1ZXVlX2NvbmZpZ1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmdldF9xdWV1ZV9jb25maWcubGlua3NfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZ19wYWNrKCZ0aGlzLT51LmdldF9xdWV1ZV9jb25maWcubGlua3NbaTBdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmdldF9xdWV1ZV9jb25maWcucG9ydHNfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfcXVldWVfY29uZmlnLnBvcnRzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3F1ZXVlX2NvbmZpZy5wb3J0cyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwb3J0c1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2VfZ2V0X3F1ZXVlX2NvbmZpZ1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCB0aGlzLT51LmdldF9xdWV1ZV9jb25maWcucG9ydHNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZ19wYWNrKCZ0aGlzLT51LmdldF9xdWV1ZV9jb25maWcucG9ydHNbaTFdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZ19wYWNrKCZ0aGlzLT51LmdldF9xdWV1ZV9jb25maWcubXVsdGljYXN0LCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0lHTVBfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTI7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5nZXRfaWdtcF9jb25maWcucm9idXN0bmVzc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5nZXRfaWdtcF9jb25maWcubGFzdF9tZW1iZXJfcXVlcnlfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZ2V0X2lnbXBfY29uZmlnLnBvcnRzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X2lnbXBfY29uZmlnLnBvcnRzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X2lnbXBfY29uZmlnLnBvcnRzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInBvcnRzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZV9nZXRfaWdtcF9jb25maWdcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMiA9IDA7IGkyIDwgdGhpcy0+dS5nZXRfaWdtcF9jb25maWcucG9ydHNfY291bnQ7IGkyKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9zbm9vcGluZ19wb3J0X2NvbmZpZ19wYWNrKCZ0aGlzLT51LmdldF9pZ21wX2NvbmZpZy5wb3J0c1tpMl0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX2ZvcndhcmRpbmdfcXVhbGlmZXJfcGFjayh0aGlzLT51LmdldF9pZ21wX2NvbmZpZy5ncnBfZm9yd2FyZCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9zbm9vcGluZ19vcHRpb25zX3BhY2sodGhpcy0+dS5nZXRfaWdtcF9jb25maWcub3B0aW9ucywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9JR01QX0dST1VQX0lORk86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMzsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmdldF9pZ21wX2dyb3VwX2luZm8uZ3JvdXBzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X2lnbXBfZ3JvdXBfaW5mby5ncm91cHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfaWdtcF9ncm91cF9pbmZvLmdyb3VwcyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJncm91cHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX2dldF9pZ21wX2dyb3VwX2luZm9cIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMyA9IDA7IGkzIDwgdGhpcy0+dS5nZXRfaWdtcF9ncm91cF9pbmZvLmdyb3Vwc19jb3VudDsgaTMrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF9ncm91cF9ub192aWRfcGFjaygmdGhpcy0+dS5nZXRfaWdtcF9ncm91cF9pbmZvLmdyb3Vwc1tpM10sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX09BTV9SQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZ2V0X29hbV9yYXRlLm1heF9vYW1fcmF0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5nZXRfb2FtX3JhdGUubWluX29hbV9yYXRlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9MT0FEX0lORk86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZ2V0X2xvYWRfaW5mby5ib290X3ZlcnNpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmdldF9sb2FkX2luZm8uYm9vdF9jcmMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmdldF9sb2FkX2luZm8ucGVyc29uYWxpdHlfdmVyc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuZ2V0X2xvYWRfaW5mby5wZXJzb25hbGl0eV9jcmMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmdldF9sb2FkX2luZm8uYXBwMHZlcnNpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT51LmdldF9sb2FkX2luZm8uYXBwMGNyYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZ2V0X2xvYWRfaW5mby5hcHAxdmVyc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuZ2V0X2xvYWRfaW5mby5hcHAxY3JjKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5nZXRfbG9hZF9pbmZvLmRpYWdub3N0aWNfdmVyc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuZ2V0X2xvYWRfaW5mby5kaWFnbm9zdGljX2NyYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfRVBPQ19TRE1fU1RBVFM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZXBvY19zZG0yNTBzdGF0X2luZGV4X3BhY2sodGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMuc3RhdF9pbmRleCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmdldF9lcG9jX3NkbV9zdGF0cy5jb3VudGVyX3ZhbHVlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLmNvdW50ZXJfdmFsdWVfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMuY291bnRlcl92YWx1ZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjb3VudGVyX3ZhbHVlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZV9nZXRfZXBvY19zZG1fc3RhdHNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMuY291bnRlcl92YWx1ZSwgdGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMuY291bnRlcl92YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMucmF0ZV92YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9lcG9jX3NkbV9zdGF0cy5yYXRlX3ZhbHVlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLnJhdGVfdmFsdWUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicmF0ZV92YWx1ZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2VfZ2V0X2Vwb2Nfc2RtX3N0YXRzXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLnJhdGVfdmFsdWUsIHRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLnJhdGVfdmFsdWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLnJhdGVfaW50ZXJ2YWxfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMucmF0ZV9pbnRlcnZhbF9jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9lcG9jX3NkbV9zdGF0cy5yYXRlX2ludGVydmFsID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJhdGVfaW50ZXJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX2dldF9lcG9jX3NkbV9zdGF0c1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmdldF9lcG9jX3NkbV9zdGF0cy5yYXRlX2ludGVydmFsLCB0aGlzLT51LmdldF9lcG9jX3NkbV9zdGF0cy5yYXRlX2ludGVydmFsX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9FUE9DX0NNQ19TVEFUUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9lcG9jX2NtY19zdGF0X2luZGV4X3BhY2sodGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMuc3RhdF9pbmRleCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmdldF9lcG9jX2NtY19zdGF0cy5jb3VudGVyX3ZhbHVlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X2Vwb2NfY21jX3N0YXRzLmNvdW50ZXJfdmFsdWVfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMuY291bnRlcl92YWx1ZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjb3VudGVyX3ZhbHVlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZV9nZXRfZXBvY19jbWNfc3RhdHNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMuY291bnRlcl92YWx1ZSwgdGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMuY291bnRlcl92YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMucmF0ZV92YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9lcG9jX2NtY19zdGF0cy5yYXRlX3ZhbHVlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X2Vwb2NfY21jX3N0YXRzLnJhdGVfdmFsdWUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicmF0ZV92YWx1ZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2VfZ2V0X2Vwb2NfY21jX3N0YXRzXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZ2V0X2Vwb2NfY21jX3N0YXRzLnJhdGVfdmFsdWUsIHRoaXMtPnUuZ2V0X2Vwb2NfY21jX3N0YXRzLnJhdGVfdmFsdWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZ2V0X2Vwb2NfY21jX3N0YXRzLnJhdGVfaW50ZXJ2YWxfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMucmF0ZV9pbnRlcnZhbF9jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9lcG9jX2NtY19zdGF0cy5yYXRlX2ludGVydmFsID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJhdGVfaW50ZXJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX2dldF9lcG9jX2NtY19zdGF0c1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmdldF9lcG9jX2NtY19zdGF0cy5yYXRlX2ludGVydmFsLCB0aGlzLT51LmdldF9lcG9jX2NtY19zdGF0cy5yYXRlX2ludGVydmFsX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9FUE9DX0NOVV9TVEFUUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9lcG9jX2NudV9zdGF0X2luZGV4X3BhY2sodGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMuc3RhdF9pbmRleCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmdldF9lcG9jX2NudV9zdGF0cy5jb3VudGVyX3ZhbHVlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLmNvdW50ZXJfdmFsdWVfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMuY291bnRlcl92YWx1ZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjb3VudGVyX3ZhbHVlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZV9nZXRfZXBvY19jbnVfc3RhdHNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMuY291bnRlcl92YWx1ZSwgdGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMuY291bnRlcl92YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMucmF0ZV92YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9lcG9jX2NudV9zdGF0cy5yYXRlX3ZhbHVlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLnJhdGVfdmFsdWUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicmF0ZV92YWx1ZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2VfZ2V0X2Vwb2NfY251X3N0YXRzXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLnJhdGVfdmFsdWUsIHRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLnJhdGVfdmFsdWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLnJhdGVfaW50ZXJ2YWxfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMucmF0ZV9pbnRlcnZhbF9jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9lcG9jX2NudV9zdGF0cy5yYXRlX2ludGVydmFsID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJhdGVfaW50ZXJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX2dldF9lcG9jX2NudV9zdGF0c1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmdldF9lcG9jX2NudV9zdGF0cy5yYXRlX2ludGVydmFsLCB0aGlzLT51LmdldF9lcG9jX2NudV9zdGF0cy5yYXRlX2ludGVydmFsX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9ETl9CQ0FTVF9RVUVVRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmdldF9kbl9iY2FzdF9xdWV1ZS5wb3J0X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X2RuX2JjYXN0X3F1ZXVlLnBvcnRfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfZG5fYmNhc3RfcXVldWUucXVldWVfcGVyX3BvcnQgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicXVldWVfcGVyX3BvcnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX2dldF9kbl9iY2FzdF9xdWV1ZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmdldF9kbl9iY2FzdF9xdWV1ZS5xdWV1ZV9wZXJfcG9ydCwgdGhpcy0+dS5nZXRfZG5fYmNhc3RfcXVldWUucG9ydF9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9BRERfSUdNUF9HUk9VUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0FERF9MVUVfUlVMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0FERF9SVUxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQUREX1NUQVRJQ19FTlRSWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0JDX0xBU0VSX1BPV0VSX09GRjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX0ROX0ZJTFRFUl9UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9ETl9VU0VSX1JVTEVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfRFlOX0xFQVJOX1RCTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX0xVRV9SVUxFX1RBQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfU1RBVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9VUF9GSUxURVJfVEJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfVVBfVVNFUl9SVUxFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMUl9ETl9DTEFTUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMUl9VUF9DTEFTUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTF9JR01QX0dST1VQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMX0xVRV9SVUxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMX1NUQVRJQ19FTlRSWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTEVURV9NQ0FTVF9ET01BSU5fQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMRVRFX01DQVNUX0dST1VQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMRVRFX1JVTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ESVNBQkxFX1BPTElDRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9FTkFCTEVfUE9MSUNFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0VQT0NfVU5VU0VEMDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0VQT0NfVU5VU0VEMToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0VSQVNFX05WUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0ZJTkRfTFVFX1JVTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfR1BJT19DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfR1BJT19WQUxVRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9MVUVfRklFTEQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfTURJTzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9QSFlfQUREUl9NRElPOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX1BPUlRfUkFURV9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX1FVRVVFX1JBVEVfQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0xBU0VSX1RYX1BPV0VSX09GRjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0xPT1BCQUNLX0RJU0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9MT09QQkFDS19FTkFCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ORVdfQUREX1JVTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ORVdfREVMX1JVTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9PTlVfRElTQUJMRV9VU0VSX1RSQUZGSUM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9PTlVfRU5BQkxFX1VTRVJfVFJBRkZJQzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1BST1RFQ1RJT05fU1dJVENIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fUkVTRVRfT05VOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX0ROX0JDQVNUX1FVRVVFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX0dQSU9fQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX0dQSU9fVkFMVUU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfSUdNUF9DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfTFVFX0ZJRUxEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX01ESU86CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfT0FNX1JBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfUEhZX0FERFJfTURJTzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9QT1JUX1JBVEVfQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9RVUVVRV9DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfUVVFVUVfUkFURV9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0xFRVA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfQVVUT19BRE1JTl9DVFJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX0FVVE9fUkVORUdPVElBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFDX0FERF9HUk9VUF9BRERSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BQ19ERUxfR1JPVVBfQUREUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQUNfSU5JVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQUNfU0VMRl9URVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BVV9BRE1JTl9DVFJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BVV9SRVNFVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9QSFlfQURNSU5fQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9QT1JUX0FETUlOX0NUUkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfUlBUX0lOX1NFUlZJQ0VfVEVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9SUFRfUkVTRVQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmRlZi51bmtub3duX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZGVmLnVua25vd24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidW5rbm93blwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2VfZGVmXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZGVmLnVua25vd24sIHRoaXMtPnUuZGVmLnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAwKSA/IDB4MDA4MCA6IChieXRlc0FmdGVyTGVuRmllbGQgPT0gMHgwMDgwKSA/IDAgOiBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2UgKnRoaXMpCit7CisgICAgaWYgKHRoaXMtPndpZHRoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLT53aWR0aDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdWludDMyX3QgY291bnQgPSAzOworICAgICAgICBzd2l0Y2ggKHRoaXMtPmxlYWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfUVVFVUVfQ09ORklHOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaTA7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxOworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyICsgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmdldF9xdWV1ZV9jb25maWcubXVsdGljYXN0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9xdWV1ZV9jb25maWcubGlua3NfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfcXVldWVfY29uZmlnLmxpbmtzID09IE5VTEwpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibGlua3NfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5nZXRfcXVldWVfY29uZmlnLmxpbmtzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWdfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZ2V0X3F1ZXVlX2NvbmZpZy5saW5rc1tpMF0pOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9xdWV1ZV9jb25maWcucG9ydHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfcXVldWVfY29uZmlnLnBvcnRzID09IE5VTEwpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicG9ydHNfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5nZXRfcXVldWVfY29uZmlnLnBvcnRzX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWdfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZ2V0X3F1ZXVlX2NvbmZpZy5wb3J0c1tpMV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9JR01QX0NPTkZJRzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDYgKyAoMiAqIHRoaXMtPnUuZ2V0X2lnbXBfY29uZmlnLnBvcnRzX2NvdW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0lHTVBfR1JPVVBfSU5GTzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyAoNSAqIHRoaXMtPnUuZ2V0X2lnbXBfZ3JvdXBfaW5mby5ncm91cHNfY291bnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfT0FNX1JBVEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfTE9BRF9JTkZPOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMzA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9FUE9DX1NETV9TVEFUUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDQgKyB0aGlzLT51LmdldF9lcG9jX3NkbV9zdGF0cy5jb3VudGVyX3ZhbHVlX2NvdW50ICsgdGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMucmF0ZV92YWx1ZV9jb3VudCArIHRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLnJhdGVfaW50ZXJ2YWxfY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9FUE9DX0NNQ19TVEFUUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDQgKyB0aGlzLT51LmdldF9lcG9jX2NtY19zdGF0cy5jb3VudGVyX3ZhbHVlX2NvdW50ICsgdGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMucmF0ZV92YWx1ZV9jb3VudCArIHRoaXMtPnUuZ2V0X2Vwb2NfY21jX3N0YXRzLnJhdGVfaW50ZXJ2YWxfY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9FUE9DX0NOVV9TVEFUUzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDQgKyB0aGlzLT51LmdldF9lcG9jX2NudV9zdGF0cy5jb3VudGVyX3ZhbHVlX2NvdW50ICsgdGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMucmF0ZV92YWx1ZV9jb3VudCArIHRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLnJhdGVfaW50ZXJ2YWxfY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9ETl9CQ0FTVF9RVUVVRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgKyB0aGlzLT51LmdldF9kbl9iY2FzdF9xdWV1ZS5wb3J0X2NvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9BRERfSUdNUF9HUk9VUDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9BRERfTFVFX1JVTEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQUREX1JVTEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQUREX1NUQVRJQ19FTlRSWToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9CQ19MQVNFUl9QT1dFUl9PRkY6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfRE5fRklMVEVSX1RCTDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9ETl9VU0VSX1JVTEVTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX0RZTl9MRUFSTl9UQkw6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfTFVFX1JVTEVfVEFCTEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfU1RBVFM6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfVVBfRklMVEVSX1RCTDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9VUF9VU0VSX1JVTEVTOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMUl9ETl9DTEFTUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTFJfVVBfQ0xBU1M6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMX0lHTVBfR1JPVVA6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMX0xVRV9SVUxFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTF9TVEFUSUNfRU5UUlk6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMRVRFX01DQVNUX0RPTUFJTl9DT05GSUc6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMRVRFX01DQVNUX0dST1VQOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTEVURV9SVUxFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RJU0FCTEVfUE9MSUNFUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9FTkFCTEVfUE9MSUNFUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9FUE9DX1VOVVNFRDA6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRVBPQ19VTlVTRUQxOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0VSQVNFX05WUzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9GSU5EX0xVRV9SVUxFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9HUElPX0NPTkZJRzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfR1BJT19WQUxVRToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfTFVFX0ZJRUxEOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9NRElPOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9QSFlfQUREUl9NRElPOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9QT1JUX1JBVEVfQ09OVFJPTDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfUVVFVUVfUkFURV9DT05UUk9MOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0xBU0VSX1RYX1BPV0VSX09GRjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9MT09QQkFDS19ESVNBQkxFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0xPT1BCQUNLX0VOQUJMRToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ORVdfQUREX1JVTEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTkVXX0RFTF9SVUxFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX09OVV9ESVNBQkxFX1VTRVJfVFJBRkZJQzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9PTlVfRU5BQkxFX1VTRVJfVFJBRkZJQzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9QUk9URUNUSU9OX1NXSVRDSDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9SRVNFVF9PTlU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX0ROX0JDQVNUX1FVRVVFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9HUElPX0NPTkZJRzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfR1BJT19WQUxVRToKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfSUdNUF9DT05GSUc6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX0xVRV9GSUVMRDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfTURJTzoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfT0FNX1JBVEU6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX1BIWV9BRERSX01ESU86CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX1BPUlRfUkFURV9DT05UUk9MOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9RVUVVRV9DT05GSUc6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX1FVRVVFX1JBVEVfQ09OVFJPTDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TTEVFUDoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfQVVUT19BRE1JTl9DVFJMOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9BVVRPX1JFTkVHT1RJQVRFOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQUNfQUREX0dST1VQX0FERFI6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BQ19ERUxfR1JPVVBfQUREUjoKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFDX0lOSVQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BQ19TRUxGX1RFU1Q6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BVV9BRE1JTl9DVFJMOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQVVfUkVTRVQ6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1BIWV9BRE1JTl9DT05UUk9MOgorICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9QT1JUX0FETUlOX0NUUkw6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1JQVF9JTl9TRVJWSUNFX1RFU1Q6CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1JQVF9SRVNFVDoKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSB0aGlzLT51LmRlZi51bmtub3duX2NvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYWN0aW9uX3VucGFjaygmdGhpcy0+bGVhZiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT53aWR0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHRoaXMtPndpZHRoID49IDB4MDA4MCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgKHRoaXMtPndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+d2lkdGgsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT5sZWFmKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9RVUVVRV9DT05GSUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMDsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkxOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5nZXRfcXVldWVfY29uZmlnLmxpbmtzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3F1ZXVlX2NvbmZpZy5saW5rc19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9xdWV1ZV9jb25maWcubGlua3MgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJsaW5rc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2VfZ2V0X3F1ZXVlX2NvbmZpZ1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmdldF9xdWV1ZV9jb25maWcubGlua3MgPSAoYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmdldF9xdWV1ZV9jb25maWcubGlua3NfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmdldF9xdWV1ZV9jb25maWcubGlua3NfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZ191bnBhY2soJnRoaXMtPnUuZ2V0X3F1ZXVlX2NvbmZpZy5saW5rc1tpMF0sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZ2V0X3F1ZXVlX2NvbmZpZy5wb3J0c19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9xdWV1ZV9jb25maWcucG9ydHNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfcXVldWVfY29uZmlnLnBvcnRzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicG9ydHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX2dldF9xdWV1ZV9jb25maWdcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfcXVldWVfY29uZmlnLnBvcnRzID0gKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZyAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZXRfcXVldWVfY29uZmlnLnBvcnRzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5nZXRfcXVldWVfY29uZmlnLnBvcnRzX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWdfdW5wYWNrKCZ0aGlzLT51LmdldF9xdWV1ZV9jb25maWcucG9ydHNbaTFdLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWdfdW5wYWNrKCZ0aGlzLT51LmdldF9xdWV1ZV9jb25maWcubXVsdGljYXN0LCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9JR01QX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkyOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5nZXRfaWdtcF9jb25maWcucm9idXN0bmVzc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmdldF9pZ21wX2NvbmZpZy5sYXN0X21lbWJlcl9xdWVyeV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmdldF9pZ21wX2NvbmZpZy5wb3J0c19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9pZ21wX2NvbmZpZy5wb3J0c19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9pZ21wX2NvbmZpZy5wb3J0cyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInBvcnRzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZV9nZXRfaWdtcF9jb25maWdcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfaWdtcF9jb25maWcucG9ydHMgPSAoYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX3BvcnRfY29uZmlnICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmdldF9pZ21wX2NvbmZpZy5wb3J0c19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfc25vb3BpbmdfcG9ydF9jb25maWcpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUuZ2V0X2lnbXBfY29uZmlnLnBvcnRzX2NvdW50OyBpMisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfc25vb3BpbmdfcG9ydF9jb25maWdfdW5wYWNrKCZ0aGlzLT51LmdldF9pZ21wX2NvbmZpZy5wb3J0c1tpMl0sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9mb3J3YXJkaW5nX3F1YWxpZmVyX3VucGFjaygmdGhpcy0+dS5nZXRfaWdtcF9jb25maWcuZ3JwX2ZvcndhcmQsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9zbm9vcGluZ19vcHRpb25zX3VucGFjaygmdGhpcy0+dS5nZXRfaWdtcF9jb25maWcub3B0aW9ucywgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0lHTVBfR1JPVVBfSU5GTzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkzOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5nZXRfaWdtcF9ncm91cF9pbmZvLmdyb3Vwc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9pZ21wX2dyb3VwX2luZm8uZ3JvdXBzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X2lnbXBfZ3JvdXBfaW5mby5ncm91cHMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJncm91cHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX2dldF9pZ21wX2dyb3VwX2luZm9cIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfaWdtcF9ncm91cF9pbmZvLmdyb3VwcyA9IChiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX2dyb3VwX25vX3ZpZCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZXRfaWdtcF9ncm91cF9pbmZvLmdyb3Vwc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX2dyb3VwX25vX3ZpZCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMyA9IDA7IGkzIDwgdGhpcy0+dS5nZXRfaWdtcF9ncm91cF9pbmZvLmdyb3Vwc19jb3VudDsgaTMrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF9ncm91cF9ub192aWRfdW5wYWNrKCZ0aGlzLT51LmdldF9pZ21wX2dyb3VwX2luZm8uZ3JvdXBzW2kzXSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX09BTV9SQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5nZXRfb2FtX3JhdGUubWF4X29hbV9yYXRlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZ2V0X29hbV9yYXRlLm1pbl9vYW1fcmF0ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfTE9BRF9JTkZPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZ2V0X2xvYWRfaW5mby5ib290X3ZlcnNpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZ2V0X2xvYWRfaW5mby5ib290X2NyYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5nZXRfbG9hZF9pbmZvLnBlcnNvbmFsaXR5X3ZlcnNpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZ2V0X2xvYWRfaW5mby5wZXJzb25hbGl0eV9jcmMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZ2V0X2xvYWRfaW5mby5hcHAwdmVyc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5nZXRfbG9hZF9pbmZvLmFwcDBjcmMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZ2V0X2xvYWRfaW5mby5hcHAxdmVyc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5nZXRfbG9hZF9pbmZvLmFwcDFjcmMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZ2V0X2xvYWRfaW5mby5kaWFnbm9zdGljX3ZlcnNpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZ2V0X2xvYWRfaW5mby5kaWFnbm9zdGljX2NyYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfRVBPQ19TRE1fU1RBVFM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZXBvY19zZG0yNTBzdGF0X2luZGV4X3VucGFjaygmdGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMuc3RhdF9pbmRleCwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMuY291bnRlcl92YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9lcG9jX3NkbV9zdGF0cy5jb3VudGVyX3ZhbHVlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLmNvdW50ZXJfdmFsdWUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJjb3VudGVyX3ZhbHVlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZV9nZXRfZXBvY19zZG1fc3RhdHNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMuY291bnRlcl92YWx1ZSA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmdldF9lcG9jX3NkbV9zdGF0cy5jb3VudGVyX3ZhbHVlX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LmdldF9lcG9jX3NkbV9zdGF0cy5jb3VudGVyX3ZhbHVlLCB0aGlzLT51LmdldF9lcG9jX3NkbV9zdGF0cy5jb3VudGVyX3ZhbHVlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLnJhdGVfdmFsdWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMucmF0ZV92YWx1ZV9jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9lcG9jX3NkbV9zdGF0cy5yYXRlX3ZhbHVlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicmF0ZV92YWx1ZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2VfZ2V0X2Vwb2Nfc2RtX3N0YXRzXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLnJhdGVfdmFsdWUgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMucmF0ZV92YWx1ZV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMucmF0ZV92YWx1ZSwgdGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMucmF0ZV92YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmdldF9lcG9jX3NkbV9zdGF0cy5yYXRlX2ludGVydmFsX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLnJhdGVfaW50ZXJ2YWxfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfZXBvY19zZG1fc3RhdHMucmF0ZV9pbnRlcnZhbCA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJhdGVfaW50ZXJ2YWxcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX2dldF9lcG9jX3NkbV9zdGF0c1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmdldF9lcG9jX3NkbV9zdGF0cy5yYXRlX2ludGVydmFsID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLnJhdGVfaW50ZXJ2YWxfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLnJhdGVfaW50ZXJ2YWwsIHRoaXMtPnUuZ2V0X2Vwb2Nfc2RtX3N0YXRzLnJhdGVfaW50ZXJ2YWxfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0VQT0NfQ01DX1NUQVRTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Vwb2NfY21jX3N0YXRfaW5kZXhfdW5wYWNrKCZ0aGlzLT51LmdldF9lcG9jX2NtY19zdGF0cy5zdGF0X2luZGV4LCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmdldF9lcG9jX2NtY19zdGF0cy5jb3VudGVyX3ZhbHVlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X2Vwb2NfY21jX3N0YXRzLmNvdW50ZXJfdmFsdWVfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMuY291bnRlcl92YWx1ZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImNvdW50ZXJfdmFsdWVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX2dldF9lcG9jX2NtY19zdGF0c1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmdldF9lcG9jX2NtY19zdGF0cy5jb3VudGVyX3ZhbHVlID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2V0X2Vwb2NfY21jX3N0YXRzLmNvdW50ZXJfdmFsdWVfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUuZ2V0X2Vwb2NfY21jX3N0YXRzLmNvdW50ZXJfdmFsdWUsIHRoaXMtPnUuZ2V0X2Vwb2NfY21jX3N0YXRzLmNvdW50ZXJfdmFsdWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMucmF0ZV92YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9lcG9jX2NtY19zdGF0cy5yYXRlX3ZhbHVlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X2Vwb2NfY21jX3N0YXRzLnJhdGVfdmFsdWUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJyYXRlX3ZhbHVlXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZV9nZXRfZXBvY19jbWNfc3RhdHNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMucmF0ZV92YWx1ZSA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmdldF9lcG9jX2NtY19zdGF0cy5yYXRlX3ZhbHVlX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LmdldF9lcG9jX2NtY19zdGF0cy5yYXRlX3ZhbHVlLCB0aGlzLT51LmdldF9lcG9jX2NtY19zdGF0cy5yYXRlX3ZhbHVlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZ2V0X2Vwb2NfY21jX3N0YXRzLnJhdGVfaW50ZXJ2YWxfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMucmF0ZV9pbnRlcnZhbF9jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9lcG9jX2NtY19zdGF0cy5yYXRlX2ludGVydmFsID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicmF0ZV9pbnRlcnZhbFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2VfZ2V0X2Vwb2NfY21jX3N0YXRzXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2V0X2Vwb2NfY21jX3N0YXRzLnJhdGVfaW50ZXJ2YWwgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMucmF0ZV9pbnRlcnZhbF9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMucmF0ZV9pbnRlcnZhbCwgdGhpcy0+dS5nZXRfZXBvY19jbWNfc3RhdHMucmF0ZV9pbnRlcnZhbF9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfRVBPQ19DTlVfU1RBVFM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZXBvY19jbnVfc3RhdF9pbmRleF91bnBhY2soJnRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLnN0YXRfaW5kZXgsICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLmNvdW50ZXJfdmFsdWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMuY291bnRlcl92YWx1ZV9jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9lcG9jX2NudV9zdGF0cy5jb3VudGVyX3ZhbHVlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY291bnRlcl92YWx1ZVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2VfZ2V0X2Vwb2NfY251X3N0YXRzXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLmNvdW50ZXJfdmFsdWUgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMuY291bnRlcl92YWx1ZV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMuY291bnRlcl92YWx1ZSwgdGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMuY291bnRlcl92YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmdldF9lcG9jX2NudV9zdGF0cy5yYXRlX3ZhbHVlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLnJhdGVfdmFsdWVfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMucmF0ZV92YWx1ZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJhdGVfdmFsdWVcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX2dldF9lcG9jX2NudV9zdGF0c1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmdldF9lcG9jX2NudV9zdGF0cy5yYXRlX3ZhbHVlID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLnJhdGVfdmFsdWVfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLnJhdGVfdmFsdWUsIHRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLnJhdGVfdmFsdWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMucmF0ZV9pbnRlcnZhbF9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9lcG9jX2NudV9zdGF0cy5yYXRlX2ludGVydmFsX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X2Vwb2NfY251X3N0YXRzLnJhdGVfaW50ZXJ2YWwgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJyYXRlX2ludGVydmFsXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZV9nZXRfZXBvY19jbnVfc3RhdHNcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfZXBvY19jbnVfc3RhdHMucmF0ZV9pbnRlcnZhbCA9ICh1aW50OF90ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmdldF9lcG9jX2NudV9zdGF0cy5yYXRlX2ludGVydmFsX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LmdldF9lcG9jX2NudV9zdGF0cy5yYXRlX2ludGVydmFsLCB0aGlzLT51LmdldF9lcG9jX2NudV9zdGF0cy5yYXRlX2ludGVydmFsX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9ETl9CQ0FTVF9RVUVVRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZ2V0X2RuX2JjYXN0X3F1ZXVlLnBvcnRfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfZG5fYmNhc3RfcXVldWUucG9ydF9jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9kbl9iY2FzdF9xdWV1ZS5xdWV1ZV9wZXJfcG9ydCA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInF1ZXVlX3Blcl9wb3J0XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZV9nZXRfZG5fYmNhc3RfcXVldWVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfZG5fYmNhc3RfcXVldWUucXVldWVfcGVyX3BvcnQgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZXRfZG5fYmNhc3RfcXVldWUucG9ydF9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5nZXRfZG5fYmNhc3RfcXVldWUucXVldWVfcGVyX3BvcnQsIHRoaXMtPnUuZ2V0X2RuX2JjYXN0X3F1ZXVlLnBvcnRfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQUREX0lHTVBfR1JPVVA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9BRERfTFVFX1JVTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9BRERfUlVMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0FERF9TVEFUSUNfRU5UUlk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9CQ19MQVNFUl9QT1dFUl9PRkY6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9ETl9GSUxURVJfVEJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfRE5fVVNFUl9SVUxFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX0RZTl9MRUFSTl9UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9MVUVfUlVMRV9UQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX1NUQVRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfVVBfRklMVEVSX1RCTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX1VQX1VTRVJfUlVMRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTFJfRE5fQ0xBU1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTFJfVVBfQ0xBU1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxfSUdNUF9HUk9VUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTF9MVUVfUlVMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTF9TVEFUSUNfRU5UUlk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxFVEVfTUNBU1RfRE9NQUlOX0NPTkZJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTEVURV9NQ0FTVF9HUk9VUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTEVURV9SVUxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRElTQUJMRV9QT0xJQ0VSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRU5BQkxFX1BPTElDRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9FUE9DX1VOVVNFRDA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9FUE9DX1VOVVNFRDE6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9FUkFTRV9OVlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9GSU5EX0xVRV9SVUxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0dQSU9fQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0dQSU9fVkFMVUU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfTFVFX0ZJRUxEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX01ESU86CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfUEhZX0FERFJfTURJTzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9QT1JUX1JBVEVfQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9RVUVVRV9SQVRFX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9MQVNFUl9UWF9QT1dFUl9PRkY6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9MT09QQkFDS19ESVNBQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTE9PUEJBQ0tfRU5BQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTkVXX0FERF9SVUxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTkVXX0RFTF9SVUxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fT05VX0RJU0FCTEVfVVNFUl9UUkFGRklDOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fT05VX0VOQUJMRV9VU0VSX1RSQUZGSUM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9QUk9URUNUSU9OX1NXSVRDSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1JFU0VUX09OVToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9ETl9CQ0FTVF9RVUVVRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9HUElPX0NPTkZJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9HUElPX1ZBTFVFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX0lHTVBfQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX0xVRV9GSUVMRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9NRElPOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX09BTV9SQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX1BIWV9BRERSX01ESU86CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfUE9SVF9SQVRFX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfUVVFVUVfQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX1FVRVVFX1JBVEVfQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NMRUVQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX0FVVE9fQURNSU5fQ1RSTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9BVVRPX1JFTkVHT1RJQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BQ19BRERfR1JPVVBfQUREUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQUNfREVMX0dST1VQX0FERFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFDX0lOSVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFDX1NFTEZfVEVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQVVfQURNSU5fQ1RSTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQVVfUkVTRVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfUEhZX0FETUlOX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfUE9SVF9BRE1JTl9DVFJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1JQVF9JTl9TRVJWSUNFX1RFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfUlBUX1JFU0VUOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMtPnUuZGVmLnVua25vd25fY291bnQgPSBiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX2RlZl9jb3VudF91bmtub3duKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZGVmLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5kZWYudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVua25vd25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX2RlZlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmRlZi51bmtub3duID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZGVmLnVua25vd25fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoJnBvc3RMZW5CdWYsIHRoaXMtPnUuZGVmLnVua25vd24sIHRoaXMtPnUuZGVmLnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+d2lkdGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hY3Rpb24gbGVhZjsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDhfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYWN0aW9uX3VucGFjaygmbGVhZiwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmIChsZW5ndGggPj0gMHgwMDgwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAobGVhZikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfUVVFVUVfQ09ORklHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGlua3NfY291bnQ7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMDsKKyAgICAgICAgICAgICAgICB1aW50OF90IHBvcnRzX2NvdW50OworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTE7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZsaW5rc19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWcpICogbGlua3NfY291bnQpOworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IGxpbmtzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWdfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZwb3J0c19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWcpICogcG9ydHNfY291bnQpOworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHBvcnRzX2NvdW50OyBpMSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWdfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWdfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9JR01QX0NPTkZJRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IHBvcnRzX2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZwb3J0c19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfc25vb3BpbmdfcG9ydF9jb25maWcpICogcG9ydHNfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCBwb3J0c19jb3VudCAqIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfSUdNUF9HUk9VUF9JTkZPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgZ3JvdXBzX2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmZ3JvdXBzX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X2lnbXBfZ3JvdXBfbm9fdmlkKSAqIGdyb3Vwc19jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIGdyb3Vwc19jb3VudCAqIDUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX09BTV9SQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfTE9BRF9JTkZPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCA0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9FUE9DX1NETV9TVEFUUzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGNvdW50ZXJfdmFsdWVfY291bnQ7CisgICAgICAgICAgICAgICAgdWludDhfdCByYXRlX3ZhbHVlX2NvdW50OworICAgICAgICAgICAgICAgIHVpbnQ4X3QgcmF0ZV9pbnRlcnZhbF9jb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZjb3VudGVyX3ZhbHVlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogY291bnRlcl92YWx1ZV9jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIGNvdW50ZXJfdmFsdWVfY291bnQgKiAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnJhdGVfdmFsdWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiByYXRlX3ZhbHVlX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgcmF0ZV92YWx1ZV9jb3VudCAqIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmcmF0ZV9pbnRlcnZhbF9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50OF90KSAqIHJhdGVfaW50ZXJ2YWxfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCByYXRlX2ludGVydmFsX2NvdW50ICogMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfRVBPQ19DTUNfU1RBVFM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBjb3VudGVyX3ZhbHVlX2NvdW50OworICAgICAgICAgICAgICAgIHVpbnQ4X3QgcmF0ZV92YWx1ZV9jb3VudDsKKyAgICAgICAgICAgICAgICB1aW50OF90IHJhdGVfaW50ZXJ2YWxfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmY291bnRlcl92YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50OF90KSAqIGNvdW50ZXJfdmFsdWVfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCBjb3VudGVyX3ZhbHVlX2NvdW50ICogMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZyYXRlX3ZhbHVlX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogcmF0ZV92YWx1ZV9jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIHJhdGVfdmFsdWVfY291bnQgKiAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnJhdGVfaW50ZXJ2YWxfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiByYXRlX2ludGVydmFsX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgcmF0ZV9pbnRlcnZhbF9jb3VudCAqIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0VQT0NfQ05VX1NUQVRTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgY291bnRlcl92YWx1ZV9jb3VudDsKKyAgICAgICAgICAgICAgICB1aW50OF90IHJhdGVfdmFsdWVfY291bnQ7CisgICAgICAgICAgICAgICAgdWludDhfdCByYXRlX2ludGVydmFsX2NvdW50OworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJmNvdW50ZXJfdmFsdWVfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YodWludDhfdCkgKiBjb3VudGVyX3ZhbHVlX2NvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgY291bnRlcl92YWx1ZV9jb3VudCAqIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KCZwb3N0TGVuQnVmLCAmcmF0ZV92YWx1ZV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50OF90KSAqIHJhdGVfdmFsdWVfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCByYXRlX3ZhbHVlX2NvdW50ICogMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZyYXRlX2ludGVydmFsX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogcmF0ZV9pbnRlcnZhbF9jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIHJhdGVfaW50ZXJ2YWxfY291bnQgKiAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9ETl9CQ0FTVF9RVUVVRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IHBvcnRfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZwb3J0X2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogcG9ydF9jb3VudCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIHBvcnRfY291bnQgKiAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0FERF9JR01QX0dST1VQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQUREX0xVRV9SVUxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQUREX1JVTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9BRERfU1RBVElDX0VOVFJZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQkNfTEFTRVJfUE9XRVJfT0ZGOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfRE5fRklMVEVSX1RCTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX0ROX1VTRVJfUlVMRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9EWU5fTEVBUk5fVEJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfTFVFX1JVTEVfVEFCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9TVEFUUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX1VQX0ZJTFRFUl9UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTEVBUl9VUF9VU0VSX1JVTEVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xSX0ROX0NMQVNTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xSX1VQX0NMQVNTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMX0lHTVBfR1JPVVA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxfTFVFX1JVTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxfU1RBVElDX0VOVFJZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMRVRFX01DQVNUX0RPTUFJTl9DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxFVEVfTUNBU1RfR1JPVVA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxFVEVfUlVMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RJU0FCTEVfUE9MSUNFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0VOQUJMRV9QT0xJQ0VSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRVBPQ19VTlVTRUQwOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRVBPQ19VTlVTRUQxOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRVJBU0VfTlZTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fRklORF9MVUVfUlVMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9HUElPX0NPTkZJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9HUElPX1ZBTFVFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0xVRV9GSUVMRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9NRElPOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX1BIWV9BRERSX01ESU86CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfUE9SVF9SQVRFX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfUVVFVUVfUkFURV9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTEFTRVJfVFhfUE9XRVJfT0ZGOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTE9PUEJBQ0tfRElTQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0xPT1BCQUNLX0VOQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX05FV19BRERfUlVMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX05FV19ERUxfUlVMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX09OVV9ESVNBQkxFX1VTRVJfVFJBRkZJQzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX09OVV9FTkFCTEVfVVNFUl9UUkFGRklDOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fUFJPVEVDVElPTl9TV0lUQ0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9SRVNFVF9PTlU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfRE5fQkNBU1RfUVVFVUU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfR1BJT19DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfR1BJT19WQUxVRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9JR01QX0NPTkZJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9MVUVfRklFTEQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfTURJTzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9PQU1fUkFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9QSFlfQUREUl9NRElPOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX1BPUlRfUkFURV9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX1FVRVVFX0NPTkZJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9RVUVVRV9SQVRFX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TTEVFUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9BVVRPX0FETUlOX0NUUkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfQVVUT19SRU5FR09USUFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9NQUNfQUREX0dST1VQX0FERFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFDX0RFTF9HUk9VUF9BRERSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BQ19JTklUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BQ19TRUxGX1RFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFVX0FETUlOX0NUUkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFVX1JFU0VUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1BIWV9BRE1JTl9DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1BPUlRfQURNSU5fQ1RSTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NURF9SUFRfSU5fU0VSVklDRV9URVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1JQVF9SRVNFVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB1bmtub3duX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHVua25vd25fZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh1bmtub3duX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2VfZGVmX2NvdW50X3Vua25vd24oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHJldHVybiAoYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAvIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX3Zhcl9jb250YWluZXJfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfdmFyX2NvbnRhaW5lcl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2JyYW5jaF9wYWNrKHRoaXMtPmJyYW5jaCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCA+IDApICYmICh0aGlzLT51LmVuZC51bmtub3duID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVua25vd25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX3Zhcl9jb250YWluZXJfYmFzZV9lbmRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5lbmQudW5rbm93biwgdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfTkFNRV9CSU5ESU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF9wYWNrKCZ0aGlzLT51Lm5hbWVfYmluZGluZy5vYmplY3RfY29udGV4dCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9wYWNrKCZ0aGlzLT51LmF0dHJpYnV0ZS5hdHRyaWJ1dGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZV9wYWNrKCZ0aGlzLT51LmFjdGlvbi5hY3Rpb24sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfT0JKRUNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX1BBQ0tBR0U6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmRlZi5sZWFmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+dS5kZWYud2lkdGggPj0gMHgwMDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuZGVmLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCAoYnl0ZXNBZnRlckxlbkZpZWxkID09IDApID8gMHgwMDgwIDogKGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9PSAweDAwODApID8gMCA6IGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfdmFyX2NvbnRhaW5lcl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfdmFyX2NvbnRhaW5lcl9iYXNlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICBzd2l0Y2ggKHRoaXMtPmJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IHRoaXMtPnUuZW5kLnVua25vd25fY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9OQU1FX0JJTkRJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5uYW1lX2JpbmRpbmcub2JqZWN0X2NvbnRleHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmF0dHJpYnV0ZS5hdHRyaWJ1dGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuYWN0aW9uLmFjdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9PQkpFQ1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfUEFDS0FHRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX3Zhcl9jb250YWluZXJfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF92YXJfY29udGFpbmVyX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfYnJhbmNoX3VucGFjaygmdGhpcy0+YnJhbmNoLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+YnJhbmNoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfdmFyX2NvbnRhaW5lcl9iYXNlX2VuZF9jb3VudF91bmtub3duKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmVuZC51bmtub3duX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZW5kLnVua25vd24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ1bmtub3duXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF92YXJfY29udGFpbmVyX2Jhc2VfZW5kXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZW5kLnVua25vd24gPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5lbmQudW5rbm93bl9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuZW5kLnVua25vd24sIHRoaXMtPnUuZW5kLnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX05BTUVfQklORElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHRfdW5wYWNrKCZ0aGlzLT51Lm5hbWVfYmluZGluZy5vYmplY3RfY29udGV4dCwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3VucGFjaygmdGhpcy0+dS5hdHRyaWJ1dGUuYXR0cmlidXRlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZV91bnBhY2soJnRoaXMtPnUuYWN0aW9uLmFjdGlvbiwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX09CSkVDVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9QQUNLQUdFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5kZWYubGVhZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5kZWYud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh0aGlzLT51LmRlZi53aWR0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsICh0aGlzLT51LmRlZi53aWR0aCA9PSAwKSA/IDB4MDA4MCA6IHRoaXMtPnUuZGVmLndpZHRoLCBidWYtPmN1cnIpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgKHRoaXMtPnUuZGVmLndpZHRoID09IDApID8gMHgwMDgwIDogdGhpcy0+dS5kZWYud2lkdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX3Zhcl9jb250YWluZXJfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2JyYW5jaCBicmFuY2g7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2JyYW5jaF91bnBhY2soJmJyYW5jaCwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHVua25vd25fZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHVua25vd25fZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh1bmtub3duX2VsZW1fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfTkFNRV9CSU5ESU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX09CSkVDVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9QQUNLQUdFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAweDAwODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIChsZW5ndGggPT0gMCkgPyAweDAwODAgOiBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAobGVuZ3RoID09IDApID8gMHgwMDgwIDogbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfdmFyX2NvbnRhaW5lcl9iYXNlX2VuZF9jb3VudF91bmtub3duKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vcGNvZGVfcGFjayh0aGlzLT5vcCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm9wKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JTkZPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmluZm8uZmlybXdhcmVfdmVyc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5pbmZvLm91aSwgMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuaW5mby5wcm9kdWN0X2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5pbmZvLnZlcnNpb24pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuaW5mby5leHRlbmRlZF9pZCwgNjQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPnUuaW5mby5iYXNlX21hYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5pbmZvLm1heF9saW5rcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5pbmZvLm51bV9wb3J0cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5pbmZvLm51bV9hc3NpZ25hYmxlX3Vwc3RyZWFtX3F1ZXVlcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5pbmZvLm1heF9xdWV1ZXNfcGVyX2xpbmtfdXBzdHJlYW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuaW5mby5xdWV1ZV9pbmNyZW1lbnRfdXBzdHJlYW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuaW5mby5udW1fYXNzaWduYWJsZV9kb3duc3RyZWFtX3F1ZXVlcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5pbmZvLm1heF9xdWV1ZXNfcGVyX2xpbmtfZG93bnN0cmVhbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5pbmZvLnF1ZXVlX2luY3JlbWVudF9kb3duc3RyZWFtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5pbmZvLnVwc3RyZWFtX2J1ZmZlcl9hdmFpbGFibGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmluZm8uZG93bnN0cmVhbV9idWZmZXJfYXZhaWxhYmxlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5pbmZvLmplZGVjX21hbnVmYWN0dXJlcl9pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuaW5mby5jaGlwX2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5pbmZvLmNoaXBfdmVyc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfR0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmdldF9yZXF1ZXN0LnZhcnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZF9nZXRfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmdldF9yZXF1ZXN0LnZhcnNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NyaXB0b3JfcGFjaygmdGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzW2kwXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfR0VUX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfcmVzcG9uc2UudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9yZXNwb25zZS52YXJzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZF9nZXRfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5nZXRfcmVzcG9uc2UudmFyc19jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyX3BhY2soJnRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNbaTFdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9TRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMjsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X3JlcXVlc3QudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkX3NldF9yZXF1ZXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUuc2V0X3JlcXVlc3QudmFyc19jb3VudDsgaTIrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyX3BhY2soJnRoaXMtPnUuc2V0X3JlcXVlc3QudmFyc1tpMl0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX1NFVF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMzsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnZhcnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfcmVzcG9uc2UudmFycyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YXJzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfc2V0X3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnZhcnNfY291bnQ7IGkzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfdmFyX2NvbnRhaW5lcl9iYXNlX3BhY2soJnRoaXMtPnUuc2V0X3Jlc3BvbnNlLnZhcnNbaTNdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9NVUxUSUNBU1RfUkVHSVNURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1faWVlZV9yZWdpc3Rlcl9mbGFnc19wYWNrKHRoaXMtPnUubXVsdGljYXN0X3JlZ2lzdGVyLmZsYWdzLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51Lm11bHRpY2FzdF9yZWdpc3Rlci5tdWx0aWNhc3RfbGxpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUubXVsdGljYXN0X3JlZ2lzdGVyLnVuaWNhc3RfbGxpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfTVVMVElDQVNUX1JFR0lTVEVSX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2llZWVfcmVnaXN0ZXJfYWNrX2ZsYWdzX3BhY2sodGhpcy0+dS5tdWx0aWNhc3RfcmVnaXN0ZXJfcmVzcG9uc2UuZmxhZ3MsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUubXVsdGljYXN0X3JlZ2lzdGVyX3Jlc3BvbnNlLm11bHRpY2FzdF9sbGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5tdWx0aWNhc3RfcmVnaXN0ZXJfcmVzcG9uc2UudW5pY2FzdF9sbGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9LRVlfRVhDSEFOR0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5rZXlfZXhjaGFuZ2Uua2V5X251bWJlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dS5rZXlfZXhjaGFuZ2Uua2V5X2xlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmtleV9leGNoYW5nZS5rZXlfbGVuZ3RoID4gMCkgJiYgKHRoaXMtPnUua2V5X2V4Y2hhbmdlLmtleV9kYXRhID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImtleV9kYXRhXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfa2V5X2V4Y2hhbmdlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUua2V5X2V4Y2hhbmdlLmtleV9kYXRhLCB0aGlzLT51LmtleV9leGNoYW5nZS5rZXlfbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9GSUxFX0FDSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5maWxlX2Fjay5ibG9jaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2ZpbGVfdHJhbnNmZXJfZXJyb3JfcGFjayh0aGlzLT51LmZpbGVfYWNrLmVycm9yLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0ZJTEVfREFUQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5maWxlX2RhdGEuYmxvY2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmZpbGVfZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5maWxlX2RhdGEubGVuZ3RoID4gMCkgJiYgKHRoaXMtPnUuZmlsZV9kYXRhLmRhdGEgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZGF0YVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkX2ZpbGVfZGF0YVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmZpbGVfZGF0YS5kYXRhLCB0aGlzLT51LmZpbGVfZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0ZJTEVfUkVBRF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19maWxlX3R5cGVfcGFjayh0aGlzLT51LmZpbGVfcmVhZF9yZXF1ZXN0LmZpbGVfdHlwZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9GSUxFX1dSSVRFX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2ZpbGVfdHlwZV9wYWNrKHRoaXMtPnUuZmlsZV93cml0ZV9yZXF1ZXN0LmZpbGVfdHlwZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9VTkFDS0VEX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpNDsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUudW5hY2tlZF9hY3Rpb24udmFyaWFibGVfY29udGFpbmVyc19jb3VudCA+IDApICYmICh0aGlzLT51LnVuYWNrZWRfYWN0aW9uLnZhcmlhYmxlX2NvbnRhaW5lcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyaWFibGVfY29udGFpbmVyc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkX3VuYWNrZWRfYWN0aW9uXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTQgPSAwOyBpNCA8IHRoaXMtPnUudW5hY2tlZF9hY3Rpb24udmFyaWFibGVfY29udGFpbmVyc19jb3VudDsgaTQrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyX3BhY2soJnRoaXMtPnUudW5hY2tlZF9hY3Rpb24udmFyaWFibGVfY29udGFpbmVyc1tpNF0sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0kyQ19CU0NfUkVBRF9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0kyQ19CU0NfUkVBRF9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JMkNfQlNDX1dSSVRFX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfSTJDX0JTQ19XUklURV9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9MT09QX0RFVEVDVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9NVUxUSUNBU1RfUkVRVUVTVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWQgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+b3ApCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0lORk86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gOTk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9HRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZ2V0X3JlcXVlc3QudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9yZXF1ZXN0LnZhcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc19jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY3JpcHRvcl9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzW2kwXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfR0VUX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfcmVzcG9uc2UudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9yZXNwb25zZS52YXJzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9jb250YWluZXJfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNbaTFdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9TRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMjsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X3JlcXVlc3QudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc19jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMiA9IDA7IGkyIDwgdGhpcy0+dS5zZXRfcmVxdWVzdC52YXJzX2NvdW50OyBpMisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnNbaTJdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9TRVRfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTM7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnNldF9yZXNwb25zZS52YXJzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnZhcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc19jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMyA9IDA7IGkzIDwgdGhpcy0+dS5zZXRfcmVzcG9uc2UudmFyc19jb3VudDsgaTMrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfdmFyX2NvbnRhaW5lcl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnNldF9yZXNwb25zZS52YXJzW2kzXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfTVVMVElDQVNUX1JFR0lTVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9NVUxUSUNBU1RfUkVHSVNURVJfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0tFWV9FWENIQU5HRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyICsgdGhpcy0+dS5rZXlfZXhjaGFuZ2Uua2V5X2xlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0ZJTEVfQUNLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9GSUxFX0RBVEE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNCArIHRoaXMtPnUuZmlsZV9kYXRhLmxlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0ZJTEVfUkVBRF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9GSUxFX1dSSVRFX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX1VOQUNLRURfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGk0OworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS51bmFja2VkX2FjdGlvbi52YXJpYWJsZV9jb250YWluZXJzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUudW5hY2tlZF9hY3Rpb24udmFyaWFibGVfY29udGFpbmVycyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YXJpYWJsZV9jb250YWluZXJzX2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk0ID0gMDsgaTQgPCB0aGlzLT51LnVuYWNrZWRfYWN0aW9uLnZhcmlhYmxlX2NvbnRhaW5lcnNfY291bnQ7IGk0KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9jb250YWluZXJfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUudW5hY2tlZF9hY3Rpb24udmFyaWFibGVfY29udGFpbmVyc1tpNF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0kyQ19CU0NfUkVBRF9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0kyQ19CU0NfUkVBRF9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JMkNfQlNDX1dSSVRFX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfSTJDX0JTQ19XUklURV9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9MT09QX0RFVEVDVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9NVUxUSUNBU1RfUkVRVUVTVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29wY29kZV91bnBhY2soJnRoaXMtPm9wLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b3ApCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0lORk86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuaW5mby5maXJtd2FyZV92ZXJzaW9uKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuaW5mby5vdWksIDMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmluZm8ucHJvZHVjdF9pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuaW5mby52ZXJzaW9uKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuaW5mby5leHRlbmRlZF9pZCwgNjQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX21hY19hZGRyZXNzKGJ1ZiwgJnRoaXMtPnUuaW5mby5iYXNlX21hYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5pbmZvLm1heF9saW5rcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5pbmZvLm51bV9wb3J0cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5pbmZvLm51bV9hc3NpZ25hYmxlX3Vwc3RyZWFtX3F1ZXVlcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5pbmZvLm1heF9xdWV1ZXNfcGVyX2xpbmtfdXBzdHJlYW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuaW5mby5xdWV1ZV9pbmNyZW1lbnRfdXBzdHJlYW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUuaW5mby5udW1fYXNzaWduYWJsZV9kb3duc3RyZWFtX3F1ZXVlcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5pbmZvLm1heF9xdWV1ZXNfcGVyX2xpbmtfZG93bnN0cmVhbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5pbmZvLnF1ZXVlX2luY3JlbWVudF9kb3duc3RyZWFtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5pbmZvLnVwc3RyZWFtX2J1ZmZlcl9hdmFpbGFibGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmluZm8uZG93bnN0cmVhbV9idWZmZXJfYXZhaWxhYmxlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5pbmZvLmplZGVjX21hbnVmYWN0dXJlcl9pZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuaW5mby5jaGlwX2lkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dS5pbmZvLmNoaXBfdmVyc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfR0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTA7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfZ2V0X3JlcXVlc3RfY291bnRfdmFycyhidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZ2V0X3JlcXVlc3QudmFycyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZF9nZXRfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmdldF9yZXF1ZXN0LnZhcnMgPSAoYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY3JpcHRvciAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZXRfcmVxdWVzdC52YXJzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NyaXB0b3IpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUuZ2V0X3JlcXVlc3QudmFyc19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY3JpcHRvcl91bnBhY2soJnRoaXMtPnUuZ2V0X3JlcXVlc3QudmFyc1tpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfR0VUX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxOworICAgICAgICAgICAgICAgIHRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZF9nZXRfcmVzcG9uc2VfY291bnRfdmFycyhidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5nZXRfcmVzcG9uc2UudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LmdldF9yZXNwb25zZS52YXJzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkX2dldF9yZXNwb25zZVwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmdldF9yZXNwb25zZS52YXJzID0gKGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lciAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5nZXRfcmVzcG9uc2UudmFyc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9jb250YWluZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lcl91bnBhY2soJnRoaXMtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNbaTFdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX1NFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkyOworICAgICAgICAgICAgICAgIHRoaXMtPnUuc2V0X3JlcXVlc3QudmFyc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkX3NldF9yZXF1ZXN0X2NvdW50X3ZhcnMoYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X3JlcXVlc3QudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YXJzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfc2V0X3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5zZXRfcmVxdWVzdC52YXJzID0gKGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lciAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5zZXRfcmVxdWVzdC52YXJzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lcikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMiA9IDA7IGkyIDwgdGhpcy0+dS5zZXRfcmVxdWVzdC52YXJzX2NvdW50OyBpMisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9jb250YWluZXJfdW5wYWNrKCZ0aGlzLT51LnNldF9yZXF1ZXN0LnZhcnNbaTJdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX1NFVF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMzsKKyAgICAgICAgICAgICAgICB0aGlzLT51LnNldF9yZXNwb25zZS52YXJzX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfc2V0X3Jlc3BvbnNlX2NvdW50X3ZhcnMoYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuc2V0X3Jlc3BvbnNlLnZhcnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5zZXRfcmVzcG9uc2UudmFycyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZF9zZXRfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5zZXRfcmVzcG9uc2UudmFycyA9IChiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX3Zhcl9jb250YWluZXJfYmFzZSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5zZXRfcmVzcG9uc2UudmFyc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX3Zhcl9jb250YWluZXJfYmFzZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMyA9IDA7IGkzIDwgdGhpcy0+dS5zZXRfcmVzcG9uc2UudmFyc19jb3VudDsgaTMrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF92YXJfY29udGFpbmVyX2Jhc2VfdW5wYWNrKCZ0aGlzLT51LnNldF9yZXNwb25zZS52YXJzW2kzXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9NVUxUSUNBU1RfUkVHSVNURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1faWVlZV9yZWdpc3Rlcl9mbGFnc191bnBhY2soJnRoaXMtPnUubXVsdGljYXN0X3JlZ2lzdGVyLmZsYWdzLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51Lm11bHRpY2FzdF9yZWdpc3Rlci5tdWx0aWNhc3RfbGxpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUubXVsdGljYXN0X3JlZ2lzdGVyLnVuaWNhc3RfbGxpZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfTVVMVElDQVNUX1JFR0lTVEVSX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2llZWVfcmVnaXN0ZXJfYWNrX2ZsYWdzX3VucGFjaygmdGhpcy0+dS5tdWx0aWNhc3RfcmVnaXN0ZXJfcmVzcG9uc2UuZmxhZ3MsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUubXVsdGljYXN0X3JlZ2lzdGVyX3Jlc3BvbnNlLm11bHRpY2FzdF9sbGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5tdWx0aWNhc3RfcmVnaXN0ZXJfcmVzcG9uc2UudW5pY2FzdF9sbGlkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9LRVlfRVhDSEFOR0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5rZXlfZXhjaGFuZ2Uua2V5X251bWJlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dS5rZXlfZXhjaGFuZ2Uua2V5X2xlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmtleV9leGNoYW5nZS5rZXlfbGVuZ3RoID4gMCkgJiYgKHRoaXMtPnUua2V5X2V4Y2hhbmdlLmtleV9kYXRhID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwia2V5X2RhdGFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZF9rZXlfZXhjaGFuZ2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5rZXlfZXhjaGFuZ2Uua2V5X2RhdGEgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5rZXlfZXhjaGFuZ2Uua2V5X2xlbmd0aCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUua2V5X2V4Y2hhbmdlLmtleV9kYXRhLCB0aGlzLT51LmtleV9leGNoYW5nZS5rZXlfbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9GSUxFX0FDSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5maWxlX2Fjay5ibG9jaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2ZpbGVfdHJhbnNmZXJfZXJyb3JfdW5wYWNrKCZ0aGlzLT51LmZpbGVfYWNrLmVycm9yLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0ZJTEVfREFUQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5maWxlX2RhdGEuYmxvY2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmZpbGVfZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5maWxlX2RhdGEubGVuZ3RoID4gMCkgJiYgKHRoaXMtPnUuZmlsZV9kYXRhLmRhdGEgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJkYXRhXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfZmlsZV9kYXRhXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZmlsZV9kYXRhLmRhdGEgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5maWxlX2RhdGEubGVuZ3RoICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS5maWxlX2RhdGEuZGF0YSwgdGhpcy0+dS5maWxlX2RhdGEubGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9GSUxFX1JFQURfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfZmlsZV90eXBlX3VucGFjaygmdGhpcy0+dS5maWxlX3JlYWRfcmVxdWVzdC5maWxlX3R5cGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfRklMRV9XUklURV9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19maWxlX3R5cGVfdW5wYWNrKCZ0aGlzLT51LmZpbGVfd3JpdGVfcmVxdWVzdC5maWxlX3R5cGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfVU5BQ0tFRF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTQ7CisgICAgICAgICAgICAgICAgdGhpcy0+dS51bmFja2VkX2FjdGlvbi52YXJpYWJsZV9jb250YWluZXJzX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfdW5hY2tlZF9hY3Rpb25fY291bnRfdmFyaWFibGVfY29udGFpbmVycyhidWYpOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS51bmFja2VkX2FjdGlvbi52YXJpYWJsZV9jb250YWluZXJzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUudW5hY2tlZF9hY3Rpb24udmFyaWFibGVfY29udGFpbmVycyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcmlhYmxlX2NvbnRhaW5lcnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZF91bmFja2VkX2FjdGlvblwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnVuYWNrZWRfYWN0aW9uLnZhcmlhYmxlX2NvbnRhaW5lcnMgPSAoYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnVuYWNrZWRfYWN0aW9uLnZhcmlhYmxlX2NvbnRhaW5lcnNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk0ID0gMDsgaTQgPCB0aGlzLT51LnVuYWNrZWRfYWN0aW9uLnZhcmlhYmxlX2NvbnRhaW5lcnNfY291bnQ7IGk0KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lcl91bnBhY2soJnRoaXMtPnUudW5hY2tlZF9hY3Rpb24udmFyaWFibGVfY29udGFpbmVyc1tpNF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfSTJDX0JTQ19SRUFEX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfSTJDX0JTQ19SRUFEX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0kyQ19CU0NfV1JJVEVfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JMkNfQlNDX1dSSVRFX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0xPT1BfREVURUNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX01VTFRJQ0FTVF9SRVFVRVNUOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfb3Bjb2RlIG9wOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vcGNvZGVfdW5wYWNrKCZvcCwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG9wKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JTkZPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA2NCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA2KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKk9wdGlvbmFsIHVucGFjayBmYWlscyBkbyBub3QgY2F1c2UgZXJyb3JzICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qT3B0aW9uYWwgdW5wYWNrIGZhaWxzIGRvIG5vdCBjYXVzZSBlcnJvcnMgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0dFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhcnNfZWxlbV9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NyaXB0b3Jfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdmFyc19lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHZhcnNfZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjcmlwdG9yKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9HRVRfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdmFyc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHZhcnNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh2YXJzX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9TRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB2YXJzX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9jb250YWluZXJfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdmFyc19lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHZhcnNfZWxlbV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9jb250YWluZXIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX1NFVF9SRVNQT05TRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB2YXJzX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX3Zhcl9jb250YWluZXJfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB2YXJzX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodmFyc19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfdmFyX2NvbnRhaW5lcl9iYXNlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9NVUxUSUNBU1RfUkVHSVNURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfTVVMVElDQVNUX1JFR0lTVEVSX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0tFWV9FWENIQU5HRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGtleV9sZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZrZXlfbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICoga2V5X2xlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBrZXlfbGVuZ3RoICogMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfRklMRV9BQ0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0ZJTEVfREFUQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKHVpbnQ4X3QpICogbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCAqIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0ZJTEVfUkVBRF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfRklMRV9XUklURV9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfVU5BQ0tFRF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdmFyaWFibGVfY29udGFpbmVyc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlX2NvbnRhaW5lcnNfZWxlbV9jb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRCh2YXJpYWJsZV9jb250YWluZXJzX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JMkNfQlNDX1JFQURfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JMkNfQlNDX1JFQURfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfSTJDX0JTQ19XUklURV9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0kyQ19CU0NfV1JJVEVfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfTE9PUF9ERVRFQ1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfTVVMVElDQVNUX1JFUVVFU1Q6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkX2dldF9yZXF1ZXN0X2NvdW50X3ZhcnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICB1aW50MzJfdCBkdW1teSA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBidWZDbG9uZSA9ICpidWY7CisgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NyaXB0b3Jfc2NhbigmYnVmQ2xvbmUsICZkdW1teSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZF9nZXRfcmVzcG9uc2VfY291bnRfdmFycyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIHVpbnQzMl90IGR1bW15ID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIGJ1ZkNsb25lID0gKmJ1ZjsKKyAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyX3NjYW4oJmJ1ZkNsb25lLCAmZHVtbXkpKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfc2V0X3JlcXVlc3RfY291bnRfdmFycyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIHVpbnQzMl90IGR1bW15ID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIGJ1ZkNsb25lID0gKmJ1ZjsKKyAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyX3NjYW4oJmJ1ZkNsb25lLCAmZHVtbXkpKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfc2V0X3Jlc3BvbnNlX2NvdW50X3ZhcnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKyAgICB1aW50MzJfdCBkdW1teSA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBidWZDbG9uZSA9ICpidWY7CisgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfdmFyX2NvbnRhaW5lcl9iYXNlX3NjYW4oJmJ1ZkNsb25lLCAmZHVtbXkpKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfdW5hY2tlZF9hY3Rpb25fY291bnRfdmFyaWFibGVfY29udGFpbmVycyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIHVpbnQzMl90IGR1bW15ID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIGJ1ZkNsb25lID0gKmJ1ZjsKKyAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyX3NjYW4oJmJ1ZkNsb25lLCAmZHVtbXkpKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfb3BfcGFjayh0aGlzLT5maWxlX29wLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+ZmlsZV9vcCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19GSUxFX09QX0hFQUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UzMihidWYsIHRoaXMtPnUuaGVhZC5maWxlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+dS5oZWFkLm5vdF9maWxlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5oZWFkLmNyYykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19GSUxFX09QX0RBVEE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZGF0YS5sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmRhdGEuYmxvY2spKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5kYXRhLmRhdGFfY291bnQgPiAwKSAmJiAodGhpcy0+dS5kYXRhLmRhdGEgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZGF0YVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9iYXNlX2RhdGFcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5kYXRhLmRhdGEsIHRoaXMtPnUuZGF0YS5kYXRhX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX0ZJTEVfT1BfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19GSUxFX09QX0lEWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5pZHguaWR4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX0ZJTEVfT1BfQUNLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX29wX3BhY2sodGhpcy0+dS5hY2suZnJhbWVfdHlwZV9hY2ssIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcG1jX2Vycm9yX2NvZGVfcGFjayh0aGlzLT51LmFjay5lcnJvcl9jb2RlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmFjay5ibG9ja19yeCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9iYXNlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMjsKKyAgICBzd2l0Y2ggKHRoaXMtPmZpbGVfb3ApCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfRklMRV9PUF9IRUFEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDEwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19GSUxFX09QX0RBVEE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNCArIHRoaXMtPnUuZGF0YS5kYXRhX2NvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19GSUxFX09QX0VORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfRklMRV9PUF9JRFg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfRklMRV9PUF9BQ0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9vcF91bnBhY2soJnRoaXMtPmZpbGVfb3AsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5maWxlX29wKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX0ZJTEVfT1BfSEVBRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MzIoYnVmLCAmdGhpcy0+dS5oZWFkLmZpbGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT51LmhlYWQubm90X2ZpbGUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmhlYWQuY3JjKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX0ZJTEVfT1BfREFUQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5kYXRhLmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZGF0YS5ibG9jaykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGhpcy0+dS5kYXRhLmRhdGFfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfYmFzZV9kYXRhX2NvdW50X2RhdGEoYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZGF0YS5kYXRhX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZGF0YS5kYXRhID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZGF0YVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9iYXNlX2RhdGFcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5kYXRhLmRhdGEgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5kYXRhLmRhdGFfY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LmRhdGEuZGF0YSwgdGhpcy0+dS5kYXRhLmRhdGFfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfRklMRV9PUF9FTkQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX0ZJTEVfT1BfSURYOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmlkeC5pZHgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfRklMRV9PUF9BQ0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfb3BfdW5wYWNrKCZ0aGlzLT51LmFjay5mcmFtZV90eXBlX2FjaywgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9wbWNfZXJyb3JfY29kZV91bnBhY2soJnRoaXMtPnUuYWNrLmVycm9yX2NvZGUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuYWNrLmJsb2NrX3J4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfb3AgZmlsZV9vcDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9vcF91bnBhY2soJmZpbGVfb3AsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChmaWxlX29wKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX0ZJTEVfT1BfSEVBRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX0ZJTEVfT1BfREFUQToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBkYXRhX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZGF0YV9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKGRhdGFfZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX0ZJTEVfT1BfRU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19GSUxFX09QX0lEWDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfRklMRV9PUF9BQ0s6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9iYXNlX2RhdGFfY291bnRfZGF0YShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9wbWNfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fcG1jX3ZlbmRvcl9leHRlbmRlZF9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcG1jX29wX2NvZGVfcGFjayh0aGlzLT5vcCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm9wKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfRklSTVdBUkVfVVBEQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX2Jhc2VfcGFjaygmdGhpcy0+dS5maXJtd2FyZV91cGRhdGUuZmlsZV9pbmZvLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9BQ0tOT1dMRURHRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfQVVUSEVOVElDQVRFX09OVToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfRU5DUllQVElPTl9FTkFCTEVfRElTQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfRU5DUllQVElPTl9LRVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX0dFVF9PTlVfVkVSU0lPTlNfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfR0VUX09OVV9WRVJTSU9OU19SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfSUdNUF9TTk9PUElOR19QQUNLRVRTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9NQUdJQ19OVU1CRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1BIWV9MT09QX0JBQ0tfQ09OVFJPTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfUElOR19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9QSU5HX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9SRV9SRUdJU1RFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfUkVNT1RFX0FDQ0VTUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfU0VUX0FMQVJNX1RIUkVTSE9MRFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1RIUkVTSE9MRF9SRVBPUlRfVkFMVUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9UVVJOX09OVV9JTl9UT19PRkZfTU9ERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfVU5JX1BPUlRfQ09ORklHVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9VTklfUE9SVF9TVEFUVVNfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfVU5JX1BPUlRfU1RBVFVTX1JFU1BPTlNFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fcG1jX3ZlbmRvcl9leHRlbmRlZF9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9wbWNfdmVuZG9yX2V4dGVuZGVkX2Jhc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+b3ApCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9GSVJNV0FSRV9VUERBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZmlybXdhcmVfdXBkYXRlLmZpbGVfaW5mbyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfQUNLTk9XTEVER0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX0FVVEhFTlRJQ0FURV9PTlU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX0VOQ1JZUFRJT05fRU5BQkxFX0RJU0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX0VOQ1JZUFRJT05fS0VZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9HRVRfT05VX1ZFUlNJT05TX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX0dFVF9PTlVfVkVSU0lPTlNfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX0lHTVBfU05PT1BJTkdfUEFDS0VUUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfTUFHSUNfTlVNQkVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9QSFlfTE9PUF9CQUNLX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1BJTkdfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfUElOR19SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfUkVfUkVHSVNURVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1JFTU9URV9BQ0NFU1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1NFVF9BTEFSTV9USFJFU0hPTERTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9USFJFU0hPTERfUkVQT1JUX1ZBTFVFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfVFVSTl9PTlVfSU5fVE9fT0ZGX01PREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1VOSV9QT1JUX0NPTkZJR1VSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfVU5JX1BPUlRfU1RBVFVTX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1VOSV9QT1JUX1NUQVRVU19SRVNQT05TRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3BtY192ZW5kb3JfZXh0ZW5kZWRfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3BtY192ZW5kb3JfZXh0ZW5kZWRfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3BtY19vcF9jb2RlX3VucGFjaygmdGhpcy0+b3AsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vcCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX0ZJUk1XQVJFX1VQREFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9iYXNlX3VucGFjaygmdGhpcy0+dS5maXJtd2FyZV91cGRhdGUuZmlsZV9pbmZvLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX0FDS05PV0xFREdFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9BVVRIRU5USUNBVEVfT05VOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9FTkNSWVBUSU9OX0VOQUJMRV9ESVNBQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9FTkNSWVBUSU9OX0tFWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfR0VUX09OVV9WRVJTSU9OU19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9HRVRfT05VX1ZFUlNJT05TX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9JR01QX1NOT09QSU5HX1BBQ0tFVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX01BR0lDX05VTUJFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfUEhZX0xPT1BfQkFDS19DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9QSU5HX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1BJTkdfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1JFX1JFR0lTVEVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9SRU1PVEVfQUNDRVNTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9TRVRfQUxBUk1fVEhSRVNIT0xEUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfVEhSRVNIT0xEX1JFUE9SVF9WQUxVRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1RVUk5fT05VX0lOX1RPX09GRl9NT0RFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9VTklfUE9SVF9DT05GSUdVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1VOSV9QT1JUX1NUQVRVU19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9VTklfUE9SVF9TVEFUVVNfUkVTUE9OU0U6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3BtY192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fcG1jX29wX2NvZGUgb3A7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcG1jX29wX2NvZGVfdW5wYWNrKCZvcCwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG9wKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfRklSTVdBUkVfVVBEQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX2Jhc2Vfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX0FDS05PV0xFREdFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9BVVRIRU5USUNBVEVfT05VOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9FTkNSWVBUSU9OX0VOQUJMRV9ESVNBQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9FTkNSWVBUSU9OX0tFWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfR0VUX09OVV9WRVJTSU9OU19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9HRVRfT05VX1ZFUlNJT05TX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9JR01QX1NOT09QSU5HX1BBQ0tFVFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX01BR0lDX05VTUJFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfUEhZX0xPT1BfQkFDS19DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9QSU5HX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1BJTkdfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1JFX1JFR0lTVEVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9SRU1PVEVfQUNDRVNTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9TRVRfQUxBUk1fVEhSRVNIT0xEUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfVEhSRVNIT0xEX1JFUE9SVF9WQUxVRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1RVUk5fT05VX0lOX1RPX09GRl9NT0RFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9VTklfUE9SVF9DT05GSUdVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1VOSV9QT1JUX1NUQVRVU19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9VTklfUE9SVF9TVEFUVVNfUkVTUE9OU0U6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3ZlbmRvcl9leHRlbmRlZF9vYW1fYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV92ZW5kb3JfZXh0ZW5kZWRfb2FtX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV93ZWxsX2tub3duX291aV9wYWNrKHRoaXMtPm91aSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm91aSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0NUQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfcGFjaygmdGhpcy0+dS5jdGMudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1RFSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkX3BhY2soJnRoaXMtPnUudGVrLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9QTUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcG1jX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3BhY2soJnRoaXMtPnUucG1jLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EUE9FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfcGFjaygmdGhpcy0+dS5kcG9lLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9LVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfcGFjaygmdGhpcy0+dS5rdC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfREFTQU46CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZGFzYW5fY29uZmlnX2Jhc2VfcGFjaygmdGhpcy0+dS5kYXNhbi5jb25maWcsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0JSQ006CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuYnJjbS52ZXJzaW9uKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5icmNtLnNlcXVlbmNlX251bWJlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuYnJjbS5udW1fdG90YWxfZXhwZWN0ZWRfcGFja2V0cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfcGFjaygmdGhpcy0+dS5icmNtLnBkdSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDhfdCkpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfU0lFUE9OX0E6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV9wYWNrKCZ0aGlzLT51LnNpZXBvbl9hLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5kZWYudW5rbm93bl9jb3VudCA+IDApICYmICh0aGlzLT51LmRlZi51bmtub3duID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVua25vd25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdmVuZG9yX2V4dGVuZGVkX29hbV9iYXNlX2RlZlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51LmRlZi51bmtub3duLCB0aGlzLT51LmRlZi51bmtub3duX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV92ZW5kb3JfZXh0ZW5kZWRfb2FtX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3ZlbmRvcl9leHRlbmRlZF9vYW1fYmFzZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDM7CisgICAgc3dpdGNoICh0aGlzLT5vdWkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9DVEM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5jdGMudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1RFSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS50ZWsudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1BNQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fcG1jX3ZlbmRvcl9leHRlbmRlZF9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnBtYy52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfRFBPRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5kcG9lLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9LVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51Lmt0LnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EQVNBTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY29uZmlnX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZGFzYW4uY29uZmlnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9CUkNNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDYgKyBiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuYnJjbS5wZHUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1NJRVBPTl9BOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnNpZXBvbl9hLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IHRoaXMtPnUuZGVmLnVua25vd25fY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV92ZW5kb3JfZXh0ZW5kZWRfb2FtX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV92ZW5kb3JfZXh0ZW5kZWRfb2FtX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV93ZWxsX2tub3duX291aV91bnBhY2soJnRoaXMtPm91aSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm91aSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0NUQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfdW5wYWNrKCZ0aGlzLT51LmN0Yy52YWx1ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9URUs6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZF91bnBhY2soJnRoaXMtPnUudGVrLnZhbHVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1BNQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9wbWNfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfdW5wYWNrKCZ0aGlzLT51LnBtYy52YWx1ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EUE9FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfdW5wYWNrKCZ0aGlzLT51LmRwb2UudmFsdWUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfS1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3VucGFjaygmdGhpcy0+dS5rdC52YWx1ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EQVNBTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9jb25maWdfYmFzZV91bnBhY2soJnRoaXMtPnUuZGFzYW4uY29uZmlnLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0JSQ006CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGggPSAwOworICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmJyY20udmVyc2lvbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuYnJjbS5zZXF1ZW5jZV9udW1iZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmJyY20ubnVtX3RvdGFsX2V4cGVjdGVkX3BhY2tldHMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIGJ1Zi0+Y3Vycik7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfdW5wYWNrKCZ0aGlzLT51LmJyY20ucGR1LCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIGxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1NJRVBPTl9BOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfdW5wYWNrKCZ0aGlzLT51LnNpZXBvbl9hLnZhbHVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy0+dS5kZWYudW5rbm93bl9jb3VudCA9IGJjbW9sdF9lcG9uX29hbV92ZW5kb3JfZXh0ZW5kZWRfb2FtX2Jhc2VfZGVmX2NvdW50X3Vua25vd24oYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZGVmLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5kZWYudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVua25vd25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdmVuZG9yX2V4dGVuZGVkX29hbV9iYXNlX2RlZlwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmRlZi51bmtub3duID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuZGVmLnVua25vd25fY291bnQgKiBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWQoYnVmLCB0aGlzLT51LmRlZi51bmtub3duLCB0aGlzLT51LmRlZi51bmtub3duX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3ZlbmRvcl9leHRlbmRlZF9vYW1fYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fd2VsbF9rbm93bl9vdWkgb3VpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpX3VucGFjaygmb3VpLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAob3VpKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQ1RDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfVEVLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1BNQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9wbWNfdmVuZG9yX2V4dGVuZGVkX2Jhc2Vfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RQT0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfS1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EQVNBTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kYXNhbl9jb25maWdfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQlJDTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgICAgICAgICAgICAgdWludDhfdCBsZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfU0lFUE9OX0E6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB1bmtub3duX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB1bmtub3duX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodW5rbm93bl9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3ZlbmRvcl9leHRlbmRlZF9vYW1fYmFzZV9kZWZfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnRfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX29wY29kZV9wYWNrKHRoaXMtPmNvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5jb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9JTkZPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5pbmZvLnRsdnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5pbmZvLnRsdnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidGx2c1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnRfaW5mb1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmluZm8udGx2c19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X2Jhc2VfcGFjaygmdGhpcy0+dS5pbmZvLnRsdnNbaTBdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9FVkVOVF9OT1RJRklDQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTE7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZXZlbnRfbm90aWZpY2F0aW9uLnNlcXVlbmNlX251bWJlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmV2ZW50X25vdGlmaWNhdGlvbi50bHZzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZXZlbnRfbm90aWZpY2F0aW9uLnRsdnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidGx2c1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnRfZXZlbnRfbm90aWZpY2F0aW9uXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHRoaXMtPnUuZXZlbnRfbm90aWZpY2F0aW9uLnRsdnNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3Rsdl9iYXNlX3BhY2soJnRoaXMtPnUuZXZlbnRfbm90aWZpY2F0aW9uLnRsdnNbaTFdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9WQVJfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMjsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUudmFyX3JlcXVlc3QudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LnZhcl9yZXF1ZXN0LnZhcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnRfdmFyX3JlcXVlc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMiA9IDA7IGkyIDwgdGhpcy0+dS52YXJfcmVxdWVzdC52YXJzX2NvdW50OyBpMisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2Rlc2NyaXB0b3JfYmFzZV9wYWNrKCZ0aGlzLT51LnZhcl9yZXF1ZXN0LnZhcnNbaTJdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9WQVJfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTM7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnZhcl9yZXNwb25zZS52YXJzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUudmFyX3Jlc3BvbnNlLnZhcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnRfdmFyX3Jlc3BvbnNlXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IHRoaXMtPnUudmFyX3Jlc3BvbnNlLnZhcnNfY291bnQ7IGkzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2VfcGFjaygmdGhpcy0+dS52YXJfcmVzcG9uc2UudmFyc1tpM10sIGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX0xPT1BCQUNLX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcmVtb3RlX2xvb3BiYWNrX2NvbW1hbmRfcGFjayh0aGlzLT51Lmxvb3BiYWNrX2NvbnRyb2wuY29tbWFuZCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9PUkdBTklaQVRJT05fU1BFQ0lGSUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmVuZG9yX2V4dGVuZGVkX29hbV9iYXNlX3BhY2soJnRoaXMtPnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnQgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+Y29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfSU5GTzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuaW5mby50bHZzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuaW5mby50bHZzID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInRsdnNfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5pbmZvLnRsdnNfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1faW5mb190bHZfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5pbmZvLnRsdnNbaTBdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9FVkVOVF9OT1RJRklDQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTE7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZXZlbnRfbm90aWZpY2F0aW9uLnRsdnNfY291bnQgPiAwKSAmJiAodGhpcy0+dS5ldmVudF9ub3RpZmljYXRpb24udGx2cyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ0bHZzX2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHRoaXMtPnUuZXZlbnRfbm90aWZpY2F0aW9uLnRsdnNfY291bnQ7IGkxKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90bHZfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5ldmVudF9ub3RpZmljYXRpb24udGx2c1tpMV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX1ZBUl9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkyOworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS52YXJfcmVxdWVzdC52YXJzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUudmFyX3JlcXVlc3QudmFycyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YXJzX2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTIgPSAwOyBpMiA8IHRoaXMtPnUudmFyX3JlcXVlc3QudmFyc19jb3VudDsgaTIrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV92YXJfZGVzY3JpcHRvcl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnZhcl9yZXF1ZXN0LnZhcnNbaTJdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9WQVJfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaTM7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnZhcl9yZXNwb25zZS52YXJzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUudmFyX3Jlc3BvbnNlLnZhcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmFyc19jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkzID0gMDsgaTMgPCB0aGlzLT51LnZhcl9yZXNwb25zZS52YXJzX2NvdW50OyBpMysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS52YXJfcmVzcG9uc2UudmFyc1tpM10pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX0xPT1BCQUNLX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX09SR0FOSVpBVElPTl9TUEVDSUZJQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fdmVuZG9yX2V4dGVuZGVkX29hbV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9vcGNvZGVfdW5wYWNrKCZ0aGlzLT5jb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+Y29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfSU5GTzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMDsKKyAgICAgICAgICAgICAgICB0aGlzLT51LmluZm8udGx2c19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnRfaW5mb19jb3VudF90bHZzKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmluZm8udGx2c19jb3VudCA+IDApICYmICh0aGlzLT51LmluZm8udGx2cyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInRsdnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50X2luZm9cIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5pbmZvLnRsdnMgPSAoYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X2Jhc2UgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuaW5mby50bHZzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl9iYXNlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmluZm8udGx2c19jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X2Jhc2VfdW5wYWNrKCZ0aGlzLT51LmluZm8udGx2c1tpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfRVZFTlRfTk9USUZJQ0FUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkxOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT51LmV2ZW50X25vdGlmaWNhdGlvbi5zZXF1ZW5jZV9udW1iZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRoaXMtPnUuZXZlbnRfbm90aWZpY2F0aW9uLnRsdnNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50X2V2ZW50X25vdGlmaWNhdGlvbl9jb3VudF90bHZzKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmV2ZW50X25vdGlmaWNhdGlvbi50bHZzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuZXZlbnRfbm90aWZpY2F0aW9uLnRsdnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ0bHZzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudF9ldmVudF9ub3RpZmljYXRpb25cIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS5ldmVudF9ub3RpZmljYXRpb24udGx2cyA9IChiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90bHZfYmFzZSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5ldmVudF9ub3RpZmljYXRpb24udGx2c19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90bHZfYmFzZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgdGhpcy0+dS5ldmVudF9ub3RpZmljYXRpb24udGx2c19jb3VudDsgaTErKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdGx2X2Jhc2VfdW5wYWNrKCZ0aGlzLT51LmV2ZW50X25vdGlmaWNhdGlvbi50bHZzW2kxXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9WQVJfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpMjsKKyAgICAgICAgICAgICAgICB0aGlzLT51LnZhcl9yZXF1ZXN0LnZhcnNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50X3Zhcl9yZXF1ZXN0X2NvdW50X3ZhcnMoYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUudmFyX3JlcXVlc3QudmFyc19jb3VudCA+IDApICYmICh0aGlzLT51LnZhcl9yZXF1ZXN0LnZhcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YXJzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudF92YXJfcmVxdWVzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LnZhcl9yZXF1ZXN0LnZhcnMgPSAoYmNtb2x0X2Vwb25fb2FtX3Zhcl9kZXNjcmlwdG9yX2Jhc2UgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUudmFyX3JlcXVlc3QudmFyc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fdmFyX2Rlc2NyaXB0b3JfYmFzZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMiA9IDA7IGkyIDwgdGhpcy0+dS52YXJfcmVxdWVzdC52YXJzX2NvdW50OyBpMisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2Rlc2NyaXB0b3JfYmFzZV91bnBhY2soJnRoaXMtPnUudmFyX3JlcXVlc3QudmFyc1tpMl0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfVkFSX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkzOworICAgICAgICAgICAgICAgIHRoaXMtPnUudmFyX3Jlc3BvbnNlLnZhcnNfY291bnQgPSBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50X3Zhcl9yZXNwb25zZV9jb3VudF92YXJzKGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LnZhcl9yZXNwb25zZS52YXJzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUudmFyX3Jlc3BvbnNlLnZhcnMgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YXJzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudF92YXJfcmVzcG9uc2VcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dS52YXJfcmVzcG9uc2UudmFycyA9IChiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LnZhcl9yZXNwb25zZS52YXJzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2UpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTMgPSAwOyBpMyA8IHRoaXMtPnUudmFyX3Jlc3BvbnNlLnZhcnNfY291bnQ7IGkzKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2VfdW5wYWNrKCZ0aGlzLT51LnZhcl9yZXNwb25zZS52YXJzW2kzXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9MT09QQkFDS19DT05UUk9MOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3JlbW90ZV9sb29wYmFja19jb21tYW5kX3VucGFjaygmdGhpcy0+dS5sb29wYmFja19jb250cm9sLmNvbW1hbmQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfT1JHQU5JWkFUSU9OX1NQRUNJRklDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3ZlbmRvcl9leHRlbmRlZF9vYW1fYmFzZV91bnBhY2soJnRoaXMtPnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX29wY29kZSBjb2RlOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9vcGNvZGVfdW5wYWNrKCZjb2RlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAoY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfSU5GTzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB0bHZzX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1faW5mb190bHZfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB0bHZzX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodGx2c19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl9iYXNlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9FVkVOVF9OT1RJRklDQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdGx2c19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90bHZfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB0bHZzX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodGx2c19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3Rsdl9iYXNlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9WQVJfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB2YXJzX2VsZW1fY291bnQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2Rlc2NyaXB0b3JfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB2YXJzX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodmFyc19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV92YXJfZGVzY3JpcHRvcl9iYXNlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9WQVJfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdmFyc19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB2YXJzX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQodmFyc19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2UpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX0xPT1BCQUNLX0NPTlRST0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9PUkdBTklaQVRJT05fU1BFQ0lGSUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmVuZG9yX2V4dGVuZGVkX29hbV9iYXNlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50X2luZm9fY291bnRfdGx2cyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIHVpbnQzMl90IGR1bW15ID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIGJ1ZkNsb25lID0gKmJ1ZjsKKyAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X2Jhc2Vfc2NhbigmYnVmQ2xvbmUsICZkdW1teSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50X2V2ZW50X25vdGlmaWNhdGlvbl9jb3VudF90bHZzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgdWludDMyX3QgZHVtbXkgPSAwOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgYnVmQ2xvbmUgPSAqYnVmOworICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90bHZfYmFzZV9zY2FuKCZidWZDbG9uZSwgJmR1bW15KSkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjb3VudCArPSAxOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnRfdmFyX3JlcXVlc3RfY291bnRfdmFycyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIHVpbnQzMl90IGR1bW15ID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIGJ1ZkNsb25lID0gKmJ1ZjsKKyAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Zhcl9kZXNjcmlwdG9yX2Jhc2Vfc2NhbigmYnVmQ2xvbmUsICZkdW1teSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50X3Zhcl9yZXNwb25zZV9jb3VudF92YXJzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisgICAgdWludDMyX3QgZHVtbXkgPSAwOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgYnVmQ2xvbmUgPSAqYnVmOworICAgIHdoaWxlIChCQ01PU19UUlVFKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX3NjYW4oJmJ1ZkNsb25lLCAmZHVtbXkpKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2VuZF9wb2ludF9wYWNrKGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfZW5kX3BvaW50ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2VuZF9wb2ludF90eXBlX3BhY2sodGhpcy0+dHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5pZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfZW5kX3BvaW50X3VucGFjayhiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2VuZF9wb2ludCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9lbmRfcG9pbnRfdHlwZV91bnBhY2soJnRoaXMtPnR5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+aWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2VuZF9wb2ludF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9vYW1fY29udGVudF9wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX29hbV9jb250ZW50ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmxpbmspKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudF9wYWNrKCZ0aGlzLT5vYW1fY29udGVudCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX29hbV9jb250ZW50X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX29hbV9jb250ZW50ICp0aGlzKQoreworICAgIHJldHVybiAyICsgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+b2FtX2NvbnRlbnQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9vYW1fY29udGVudF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfb2FtX2NvbnRlbnQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bGluaykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50X3VucGFjaygmdGhpcy0+b2FtX2NvbnRlbnQsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfb2FtX2NvbnRlbnRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnRfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdmVuZG9yX291aV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdmVuZG9yX291aSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MjQoYnVmLCB0aGlzLT5vdWkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3BhY2sodGhpcy0+YWN0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5sZW5ndGhfcmVzZXJ2ZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvcl9vdWlfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdmVuZG9yX291aSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UyNChidWYsICZ0aGlzLT5vdWkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3VucGFjaygmdGhpcy0+YWN0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5sZW5ndGhfcmVzZXJ2ZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvcl9vdWlfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3JfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbl9wYWNrKHRoaXMtPmFjdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmFjdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX0NPTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmNvbnQudmVuZG9yX291aV9yZWdfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5jb250LnZlbmRvcl9vdWlfcmVnX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuY29udC52ZW5kb3Jfb3VpX3JlZyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2ZW5kb3Jfb3VpX3JlZ1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdmVuZG9yX2NvbnRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5jb250LnZlbmRvcl9vdWlfcmVnX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvcl9vdWlfcGFjaygmdGhpcy0+dS5jb250LnZlbmRvcl9vdWlfcmVnW2kwXSwgYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3JfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3IgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAzOworICAgIHN3aXRjaCAodGhpcy0+YWN0aW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fQ09OVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxICsgKDYgKiB0aGlzLT51LmNvbnQudmVuZG9yX291aV9yZWdfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3JfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdmVuZG9yICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgbGVuZ3RoID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fdW5wYWNrKCZ0aGlzLT5hY3Rpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT5hY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmNvbnQudmVuZG9yX291aV9yZWdfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5jb250LnZlbmRvcl9vdWlfcmVnX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuY29udC52ZW5kb3Jfb3VpX3JlZyA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZlbmRvcl9vdWlfcmVnXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3JfY29udFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmNvbnQudmVuZG9yX291aV9yZWcgPSAoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3Jfb3VpICopICpleHRyYV9tZW07CisgICAgICAgICAgICAgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT51LmNvbnQudmVuZG9yX291aV9yZWdfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3Jfb3VpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmNvbnQudmVuZG9yX291aV9yZWdfY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdmVuZG9yX291aV91bnBhY2soJnRoaXMtPnUuY29udC52ZW5kb3Jfb3VpX3JlZ1tpMF0sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvcl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb24gYWN0aW9uOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50MTZfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fdW5wYWNrKCZhY3Rpb24sIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgc3dpdGNoIChhY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgdmVuZG9yX291aV9yZWdfY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZ2ZW5kb3Jfb3VpX3JlZ19jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZihiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvcl9vdWkpICogdmVuZG9yX291aV9yZWdfY291bnQpOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCB2ZW5kb3Jfb3VpX3JlZ19jb3VudCAqIDYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdGx2X3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb190bHYgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3R5cGVfcGFjayh0aGlzLT50eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdfSU5GT19UWVBFX1ZFTkRPUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdmVuZG9yX3BhY2soJnRoaXMtPnUudmVuZG9yLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3BhY2sodGhpcy0+dS5kZWYuYWN0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmRlZi5sZW5ndGhfcmVzZXJ2ZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb190bHZfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb190bHYgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAzOworICAgIHN3aXRjaCAodGhpcy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdfSU5GT19UWVBFX1ZFTkRPUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvcl9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS52ZW5kb3IudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb190bHZfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdGx2ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgbGVuZ3RoID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3R5cGVfdW5wYWNrKCZ0aGlzLT50eXBlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBidWYtPmN1cnIpOworICAgIHN3aXRjaCAodGhpcy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdfSU5GT19UWVBFX1ZFTkRPUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdmVuZG9yX3VucGFjaygmdGhpcy0+dS52ZW5kb3IudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3VucGFjaygmdGhpcy0+dS5kZWYuYWN0aW9uLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5kZWYubGVuZ3RoX3Jlc2VydmVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdGx2X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdHlwZSB0eXBlOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50MTZfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3R5cGVfdW5wYWNrKCZ0eXBlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAodHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdfSU5GT19UWVBFX1ZFTkRPUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdmVuZG9yX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fY29udF9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fY29udCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+aW5mb19yZWdfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+aW5mb19yZWdfY291bnQgPiAwKSAmJiAodGhpcy0+aW5mb19yZWcgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiaW5mb19yZWdcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX2NvbnRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+aW5mb19yZWdfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdGx2X3BhY2soJnRoaXMtPmluZm9fcmVnW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX2NvbnRfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19jb250ICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICB1aW50MzJfdCBpMDsKKyAgICBpZiAoKHRoaXMtPmluZm9fcmVnX2NvdW50ID4gMCkgJiYgKHRoaXMtPmluZm9fcmVnID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImluZm9fcmVnX2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19jb250XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+aW5mb19yZWdfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3Rsdl9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+aW5mb19yZWdbaTBdKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fY29udF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19jb250ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5pbmZvX3JlZ19jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5pbmZvX3JlZ19jb3VudCA+IDApICYmICh0aGlzLT5pbmZvX3JlZyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImluZm9fcmVnXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19jb250XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPmluZm9fcmVnID0gKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdGx2ICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5pbmZvX3JlZ19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3RsdikpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+aW5mb19yZWdfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdGx2X3VucGFjaygmdGhpcy0+aW5mb19yZWdbaTBdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX2NvbnRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBpbmZvX3JlZ19jb3VudDsKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmluZm9fcmVnX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdGx2KSAqIGluZm9fcmVnX2NvdW50KTsKKyAgICBmb3IgKGkwID0gMDsgaTAgPCBpbmZvX3JlZ19jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb190bHZfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mbyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbl9wYWNrKHRoaXMtPmFjdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmFjdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX0NPTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX2NvbnRfcGFjaygmdGhpcy0+dS5jb250LnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX2NvbnRfcGFjaygmdGhpcy0+dS5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19jb250X3BhY2soJnRoaXMtPnUudW5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mbyAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDM7CisgICAgc3dpdGNoICh0aGlzLT5hY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fY29udF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5jb250LnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19jb250X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnJlZ2lzdGVyX2FuZF9jb250aW51ZS52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19jb250X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnVucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgbGVuZ3RoID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fdW5wYWNrKCZ0aGlzLT5hY3Rpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT5hY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19jb250X3VucGFjaygmdGhpcy0+dS5jb250LnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19jb250X3VucGFjaygmdGhpcy0+dS5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fY29udF91bnBhY2soJnRoaXMtPnUudW5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbiBhY3Rpb247CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIHVpbnQxNl90IGxlbmd0aDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbl91bnBhY2soJmFjdGlvbiwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYocGFja2VkLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICBzd2l0Y2ggKGFjdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX0NPTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX2NvbnRfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19jb250X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19jb250X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJfZGVzY19wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJfZGVzYyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19icmFuY2hfcGFjayh0aGlzLT5icmFuY2gsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5icmFuY2gpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hdHRyaWJ1dGVfcGFjayh0aGlzLT51LmF0dHJpYnV0ZS5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0FDVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hY3Rpb25fcGFjayh0aGlzLT51LmFjdGlvbi5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0VYVF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfZXh0X2F0dHJpYnV0ZV9wYWNrKHRoaXMtPnUuZXh0X2F0dHJpYnV0ZS5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0VYVF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfZXh0X2FjdGlvbl9wYWNrKHRoaXMtPnUuZXh0X2FjdGlvbi5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0tUQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hdHRyaWJ1dGVfcGFjayh0aGlzLT51Lmt0YXR0cmlidXRlLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfS1RBQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2FjdGlvbl9wYWNrKHRoaXMtPnUua3RhY3Rpb24ubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FTkQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfTUFOQUdFTUVOVF9PQkpFQ1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfT0xEX01BTkFHRU1FTlRfT0JKRUNUOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmRlZi5sZWFmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3Zhcl9kZXNjX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyX2Rlc2MgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfYnJhbmNoX3VucGFjaygmdGhpcy0+YnJhbmNoLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+YnJhbmNoKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9BVFRSSUJVVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlX3VucGFjaygmdGhpcy0+dS5hdHRyaWJ1dGUubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uX3VucGFjaygmdGhpcy0+dS5hY3Rpb24ubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FWFRfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hdHRyaWJ1dGVfdW5wYWNrKCZ0aGlzLT51LmV4dF9hdHRyaWJ1dGUubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FWFRfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hY3Rpb25fdW5wYWNrKCZ0aGlzLT51LmV4dF9hY3Rpb24ubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9LVEFUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYXR0cmlidXRlX3VucGFjaygmdGhpcy0+dS5rdGF0dHJpYnV0ZS5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0tUQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hY3Rpb25fdW5wYWNrKCZ0aGlzLT51Lmt0YWN0aW9uLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfRU5EOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX01BTkFHRU1FTlRfT0JKRUNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX09MRF9NQU5BR0VNRU5UX09CSkVDVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5kZWYubGVhZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJfZGVzY19zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJfZGVzY19wYWNrKCZ0aGlzLT5kZXNjcmlwdG9yLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3BhY2sodGhpcy0+YWN0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5sZW5ndGhfcmVzZXJ2ZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3Zhcl9kZXNjX3VucGFjaygmdGhpcy0+ZGVzY3JpcHRvciwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3VucGFjaygmdGhpcy0+YWN0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5sZW5ndGhfcmVzZXJ2ZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlX2xpc3RfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfbGlzdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dmFyaWFibGVfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+dmFyaWFibGVfY291bnQgPiAwKSAmJiAodGhpcy0+dmFyaWFibGVzID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcmlhYmxlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZV9saXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnZhcmlhYmxlX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfcGFjaygmdGhpcy0+dmFyaWFibGVzW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfbGlzdF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfbGlzdCAqdGhpcykKK3sKKyAgICByZXR1cm4gMSArICg2ICogdGhpcy0+dmFyaWFibGVfY291bnQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfbGlzdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnZhcmlhYmxlX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPnZhcmlhYmxlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnZhcmlhYmxlcyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcmlhYmxlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZV9saXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnZhcmlhYmxlcyA9IChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGUgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnZhcmlhYmxlX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dmFyaWFibGVfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZV91bnBhY2soJnRoaXMtPnZhcmlhYmxlc1tpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZV9saXN0X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgdmFyaWFibGVfY291bnQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmdmFyaWFibGVfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlKSAqIHZhcmlhYmxlX2NvdW50KTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIHZhcmlhYmxlX2NvdW50ICogNikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcF92YXJpYWJsZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcF92YXJpYWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbl9wYWNrKHRoaXMtPmFjdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmFjdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX0NPTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfbGlzdF9wYWNrKCZ0aGlzLT51LmNvbnQudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZV9saXN0X3BhY2soJnRoaXMtPnUucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZV9saXN0X3BhY2soJnRoaXMtPnUudW5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wX3ZhcmlhYmxlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcF92YXJpYWJsZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDM7CisgICAgc3dpdGNoICh0aGlzLT5hY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZV9saXN0X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmNvbnQudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfbGlzdF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZV9saXN0X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnVucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVI6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcF92YXJpYWJsZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wX3ZhcmlhYmxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgbGVuZ3RoID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fdW5wYWNrKCZ0aGlzLT5hY3Rpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT5hY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlX2xpc3RfdW5wYWNrKCZ0aGlzLT51LmNvbnQudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfbGlzdF91bnBhY2soJnRoaXMtPnUucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfbGlzdF91bnBhY2soJnRoaXMtPnUudW5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVI6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcF92YXJpYWJsZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb24gYWN0aW9uOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50MTZfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fdW5wYWNrKCZhY3Rpb24sIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgc3dpdGNoIChhY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlX2xpc3Rfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlX2xpc3Rfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfbGlzdF9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVI6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcGNvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3Bjb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vcGNvZGVfcGFjayh0aGlzLT5vcGNvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX0dFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wX3ZhcmlhYmxlX3BhY2soJnRoaXMtPnUuZ2V0X3JlcXVlc3QudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfU0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3BfdmFyaWFibGVfcGFjaygmdGhpcy0+dS5zZXRfcmVxdWVzdC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9DSFVSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9EQkE6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfR0VUX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX0tUT05VX0VWRU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX09OVV9BVVRIRU5USUNBVElPTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9TRVRfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfU09GVFdBUkVfRE9XTkxPQUQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fcGFjayh0aGlzLT51LmRlZi5hY3Rpb24sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZGVmLmxlbmd0aF9yZXNlcnZlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3Bjb2RlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcGNvZGUgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAzOworICAgIHN3aXRjaCAodGhpcy0+b3Bjb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9HRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3BfdmFyaWFibGVfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZ2V0X3JlcXVlc3QudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfU0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wX3ZhcmlhYmxlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnNldF9yZXF1ZXN0LnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX0NIVVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX0RCQToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9FVkVOVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9HRVRfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfS1RPTlVfRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfT05VX0FVVEhFTlRJQ0FUSU9OOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX1NFVF9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9TT0ZUV0FSRV9ET1dOTE9BRDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3Bjb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3Bjb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgbGVuZ3RoID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX29wY29kZV91bnBhY2soJnRoaXMtPm9wY29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCwgYnVmLT5jdXJyKTsKKyAgICBzd2l0Y2ggKHRoaXMtPm9wY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfR0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3BfdmFyaWFibGVfdW5wYWNrKCZ0aGlzLT51LmdldF9yZXF1ZXN0LnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9TRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcF92YXJpYWJsZV91bnBhY2soJnRoaXMtPnUuc2V0X3JlcXVlc3QudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX0NIVVJOSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX0RCQToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9FVkVOVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9HRVRfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfS1RPTlVfRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfT05VX0FVVEhFTlRJQ0FUSU9OOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX1NFVF9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9TT0ZUV0FSRV9ET1dOTE9BRDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbl91bnBhY2soJnRoaXMtPnUuZGVmLmFjdGlvbiwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZGVmLmxlbmd0aF9yZXNlcnZlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3Bjb2RlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb3Bjb2RlIG9wY29kZTsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDE2X3QgbGVuZ3RoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2N0Y19vcGNvZGVfdW5wYWNrKCZvcGNvZGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgc3dpdGNoIChvcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX0dFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wX3ZhcmlhYmxlX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfU0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3BfdmFyaWFibGVfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9DSFVSTklORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9EQkE6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfR0VUX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX0tUT05VX0VWRU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX09OVV9BVVRIRU5USUNBVElPTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9TRVRfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfU09GVFdBUkVfRE9XTkxPQUQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19jb250X3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX2NvbnQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPm9wY29kZV9jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5vcGNvZGVfY291bnQgPiAwKSAmJiAodGhpcy0+b3Bjb2RlcyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJvcGNvZGVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX2NvbnRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+b3Bjb2RlX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3Bjb2RlX3BhY2soJnRoaXMtPm9wY29kZXNbaTBdLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19jb250X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19jb250ICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICB1aW50MzJfdCBpMDsKKyAgICBpZiAoKHRoaXMtPm9wY29kZV9jb3VudCA+IDApICYmICh0aGlzLT5vcGNvZGVzID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm9wY29kZV9jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19jb250XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+b3Bjb2RlX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wY29kZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+b3Bjb2Rlc1tpMF0pOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX2NvbnRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19jb250ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5vcGNvZGVfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+b3Bjb2RlX2NvdW50ID4gMCkgJiYgKHRoaXMtPm9wY29kZXMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJvcGNvZGVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX2NvbnRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+b3Bjb2RlcyA9IChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3Bjb2RlICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5vcGNvZGVfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wY29kZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+b3Bjb2RlX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3Bjb2RlX3VucGFjaygmdGhpcy0+b3Bjb2Rlc1tpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19jb250X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3Qgb3Bjb2RlX2NvdW50OworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmb3Bjb2RlX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcGNvZGUpICogb3Bjb2RlX2NvdW50KTsKKyAgICBmb3IgKGkwID0gMDsgaTAgPCBvcGNvZGVfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcGNvZGVfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fcGFjayh0aGlzLT5hY3Rpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5hY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX2NvbnRfcGFjaygmdGhpcy0+dS5jb250LnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfY29udF9wYWNrKCZ0aGlzLT51LnJlZ2lzdGVyX2FuZF9jb250aW51ZS52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfY29udF9wYWNrKCZ0aGlzLT51LnVucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMzsKKyAgICBzd2l0Y2ggKHRoaXMtPmFjdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX0NPTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX2NvbnRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuY29udC52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19jb250X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnJlZ2lzdGVyX2FuZF9jb250aW51ZS52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX2NvbnRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUudW5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y191bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgbGVuZ3RoID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fdW5wYWNrKCZ0aGlzLT5hY3Rpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT5hY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX2NvbnRfdW5wYWNrKCZ0aGlzLT51LmNvbnQudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfY29udF91bnBhY2soJnRoaXMtPnUucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfY29udF91bnBhY2soJnRoaXMtPnUudW5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uIGFjdGlvbjsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDE2X3QgbGVuZ3RoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3VucGFjaygmYWN0aW9uLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAoYWN0aW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fQ09OVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19jb250X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19jb250X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX2NvbnRfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3Zhcl9kZXNjX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3Zhcl9kZXNjICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2JyYW5jaF9wYWNrKHRoaXMtPmJyYW5jaCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2F0dHJpYnV0ZV9wYWNrKHRoaXMtPnUuYXR0cmlidXRlLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2FjdGlvbl9wYWNrKHRoaXMtPnUuYWN0aW9uLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfRU5EOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX05BTUVfQklORElORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9PQkpFQ1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfUEFDS0FHRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5kZWYubGVhZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJfZGVzY191bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3Zhcl9kZXNjICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2JyYW5jaF91bnBhY2soJnRoaXMtPmJyYW5jaCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2F0dHJpYnV0ZV91bnBhY2soJnRoaXMtPnUuYXR0cmlidXRlLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfQUNUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2FjdGlvbl91bnBhY2soJnRoaXMtPnUuYWN0aW9uLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfRU5EOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX05BTUVfQklORElORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9PQkpFQ1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfUEFDS0FHRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5kZWYubGVhZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJfZGVzY19zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJfZGVzY19wYWNrKCZ0aGlzLT5kZXNjcmlwdG9yLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3BhY2sodGhpcy0+YWN0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5sZW5ndGhfcmVzZXJ2ZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3Zhcl9kZXNjX3VucGFjaygmdGhpcy0+ZGVzY3JpcHRvciwgYnVmLCBleHRyYV9tZW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3VucGFjaygmdGhpcy0+YWN0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5sZW5ndGhfcmVzZXJ2ZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlX2xpc3RfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfbGlzdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dmFyaWFibGVfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+dmFyaWFibGVfY291bnQgPiAwKSAmJiAodGhpcy0+dmFyaWFibGVzID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcmlhYmxlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZV9saXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnZhcmlhYmxlX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfcGFjaygmdGhpcy0+dmFyaWFibGVzW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfbGlzdF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfbGlzdCAqdGhpcykKK3sKKyAgICByZXR1cm4gMSArICg2ICogdGhpcy0+dmFyaWFibGVfY291bnQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfbGlzdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnZhcmlhYmxlX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPnZhcmlhYmxlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnZhcmlhYmxlcyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInZhcmlhYmxlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZV9saXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnZhcmlhYmxlcyA9IChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGUgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnZhcmlhYmxlX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dmFyaWFibGVfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZV91bnBhY2soJnRoaXMtPnZhcmlhYmxlc1tpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZV9saXN0X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgdmFyaWFibGVfY291bnQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmdmFyaWFibGVfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlKSAqIHZhcmlhYmxlX2NvdW50KTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIHZhcmlhYmxlX2NvdW50ICogNikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcF92YXJpYWJsZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcF92YXJpYWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbl9wYWNrKHRoaXMtPmFjdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmFjdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX0NPTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfbGlzdF9wYWNrKCZ0aGlzLT51LmNvbnQudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZV9saXN0X3BhY2soJnRoaXMtPnUucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZV9saXN0X3BhY2soJnRoaXMtPnUudW5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wX3ZhcmlhYmxlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcF92YXJpYWJsZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDM7CisgICAgc3dpdGNoICh0aGlzLT5hY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZV9saXN0X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmNvbnQudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfbGlzdF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZV9saXN0X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnVucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVI6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcF92YXJpYWJsZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wX3ZhcmlhYmxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgbGVuZ3RoID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fdW5wYWNrKCZ0aGlzLT5hY3Rpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT5hY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlX2xpc3RfdW5wYWNrKCZ0aGlzLT51LmNvbnQudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfbGlzdF91bnBhY2soJnRoaXMtPnUucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfbGlzdF91bnBhY2soJnRoaXMtPnUudW5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVI6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcF92YXJpYWJsZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb24gYWN0aW9uOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50MTZfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fdW5wYWNrKCZhY3Rpb24sIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgc3dpdGNoIChhY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlX2xpc3Rfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlX2xpc3Rfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfbGlzdF9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVI6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcGNvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3Bjb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vcGNvZGVfcGFjayh0aGlzLT5vcGNvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0dFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wX3ZhcmlhYmxlX3BhY2soJnRoaXMtPnUuZ2V0X3JlcXVlc3QudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfU0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3BfdmFyaWFibGVfcGFjaygmdGhpcy0+dS5zZXRfcmVxdWVzdC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9GSUxFX0FDSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9GSUxFX0RBVEE6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfRklMRV9SRUFEX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfRklMRV9XUklURV9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0dFVF9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JMkNfQlNDX1JFQURfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JMkNfQlNDX1JFQURfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfSTJDX0JTQ19XUklURV9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0kyQ19CU0NfV1JJVEVfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfSU5GTzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9LRVlfRVhDSEFOR0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfTE9PUF9ERVRFQ1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfTVVMVElDQVNUX1JFR0lTVEVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX01VTFRJQ0FTVF9SRUdJU1RFUl9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9NVUxUSUNBU1RfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9TRVRfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfVU5BQ0tFRF9BQ1RJT046CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fcGFjayh0aGlzLT51LmRlZi5hY3Rpb24sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZGVmLmxlbmd0aF9yZXNlcnZlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3Bjb2RlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcGNvZGUgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAzOworICAgIHN3aXRjaCAodGhpcy0+b3Bjb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9HRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3BfdmFyaWFibGVfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZ2V0X3JlcXVlc3QudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfU0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wX3ZhcmlhYmxlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnNldF9yZXF1ZXN0LnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0ZJTEVfQUNLOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0ZJTEVfREFUQToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9GSUxFX1JFQURfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9GSUxFX1dSSVRFX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfR0VUX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0kyQ19CU0NfUkVBRF9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0kyQ19CU0NfUkVBRF9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JMkNfQlNDX1dSSVRFX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfSTJDX0JTQ19XUklURV9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JTkZPOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0tFWV9FWENIQU5HRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9MT09QX0RFVEVDVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9NVUxUSUNBU1RfUkVHSVNURVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfTVVMVElDQVNUX1JFR0lTVEVSX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX01VTFRJQ0FTVF9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX1NFVF9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9VTkFDS0VEX0FDVElPTjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3Bjb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3Bjb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgbGVuZ3RoID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX29wY29kZV91bnBhY2soJnRoaXMtPm9wY29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCwgYnVmLT5jdXJyKTsKKyAgICBzd2l0Y2ggKHRoaXMtPm9wY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfR0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3BfdmFyaWFibGVfdW5wYWNrKCZ0aGlzLT51LmdldF9yZXF1ZXN0LnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9TRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcF92YXJpYWJsZV91bnBhY2soJnRoaXMtPnUuc2V0X3JlcXVlc3QudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0ZJTEVfQUNLOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0ZJTEVfREFUQToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9GSUxFX1JFQURfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9GSUxFX1dSSVRFX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfR0VUX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0kyQ19CU0NfUkVBRF9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0kyQ19CU0NfUkVBRF9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JMkNfQlNDX1dSSVRFX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfSTJDX0JTQ19XUklURV9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JTkZPOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0tFWV9FWENIQU5HRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9MT09QX0RFVEVDVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9NVUxUSUNBU1RfUkVHSVNURVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfTVVMVElDQVNUX1JFR0lTVEVSX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX01VTFRJQ0FTVF9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX1NFVF9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9VTkFDS0VEX0FDVElPTjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbl91bnBhY2soJnRoaXMtPnUuZGVmLmFjdGlvbiwgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZGVmLmxlbmd0aF9yZXNlcnZlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3Bjb2RlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfb3Bjb2RlIG9wY29kZTsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDE2X3QgbGVuZ3RoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19vcGNvZGVfdW5wYWNrKCZvcGNvZGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgc3dpdGNoIChvcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0dFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wX3ZhcmlhYmxlX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfU0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3BfdmFyaWFibGVfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9GSUxFX0FDSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9GSUxFX0RBVEE6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfRklMRV9SRUFEX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfRklMRV9XUklURV9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0dFVF9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JMkNfQlNDX1JFQURfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JMkNfQlNDX1JFQURfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfSTJDX0JTQ19XUklURV9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0kyQ19CU0NfV1JJVEVfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfSU5GTzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9LRVlfRVhDSEFOR0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfTE9PUF9ERVRFQ1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfTVVMVElDQVNUX1JFR0lTVEVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX01VTFRJQ0FTVF9SRUdJU1RFUl9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9NVUxUSUNBU1RfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9TRVRfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfVU5BQ0tFRF9BQ1RJT046CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19jb250X3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX2NvbnQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPm9wY29kZV9jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5vcGNvZGVfY291bnQgPiAwKSAmJiAodGhpcy0+b3Bjb2RlcyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJvcGNvZGVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX2NvbnRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+b3Bjb2RlX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3Bjb2RlX3BhY2soJnRoaXMtPm9wY29kZXNbaTBdLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19jb250X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19jb250ICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICB1aW50MzJfdCBpMDsKKyAgICBpZiAoKHRoaXMtPm9wY29kZV9jb3VudCA+IDApICYmICh0aGlzLT5vcGNvZGVzID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm9wY29kZV9jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19jb250XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+b3Bjb2RlX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wY29kZV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+b3Bjb2Rlc1tpMF0pOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX2NvbnRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19jb250ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5vcGNvZGVfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+b3Bjb2RlX2NvdW50ID4gMCkgJiYgKHRoaXMtPm9wY29kZXMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJvcGNvZGVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX2NvbnRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+b3Bjb2RlcyA9IChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3Bjb2RlICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5vcGNvZGVfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wY29kZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+b3Bjb2RlX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3Bjb2RlX3VucGFjaygmdGhpcy0+b3Bjb2Rlc1tpMF0sIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19jb250X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3Qgb3Bjb2RlX2NvdW50OworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmb3Bjb2RlX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcGNvZGUpICogb3Bjb2RlX2NvdW50KTsKKyAgICBmb3IgKGkwID0gMDsgaTAgPCBvcGNvZGVfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcGNvZGVfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWsgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fcGFjayh0aGlzLT5hY3Rpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5hY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX2NvbnRfcGFjaygmdGhpcy0+dS5jb250LnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfY29udF9wYWNrKCZ0aGlzLT51LnJlZ2lzdGVyX2FuZF9jb250aW51ZS52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfY29udF9wYWNrKCZ0aGlzLT51LnVucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMzsKKyAgICBzd2l0Y2ggKHRoaXMtPmFjdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX0NPTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX2NvbnRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuY29udC52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19jb250X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnJlZ2lzdGVyX2FuZF9jb250aW51ZS52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX2NvbnRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUudW5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla191bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgbGVuZ3RoID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fdW5wYWNrKCZ0aGlzLT5hY3Rpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT5hY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX2NvbnRfdW5wYWNrKCZ0aGlzLT51LmNvbnQudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfY29udF91bnBhY2soJnRoaXMtPnUucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfY29udF91bnBhY2soJnRoaXMtPnUudW5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uIGFjdGlvbjsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDE2X3QgbGVuZ3RoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3VucGFjaygmYWN0aW9uLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAoYWN0aW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fQ09OVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19jb250X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19jb250X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX2NvbnRfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJfZGVzY19wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyX2Rlc2MgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2JyYW5jaF9wYWNrKHRoaXMtPmJyYW5jaCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX1NUQU5EQVJEX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hdHRyaWJ1dGVfcGFjayh0aGlzLT51LnN0YW5kYXJkX2F0dHJpYnV0ZS5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9TVEFOREFSRF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uX3BhY2sodGhpcy0+dS5zdGFuZGFyZF9hY3Rpb24ubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRVhURU5ERURfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hdHRyaWJ1dGVfcGFjayh0aGlzLT51LmV4dGVuZGVkX2F0dHJpYnV0ZS5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFmX2FjdGlvbl9wYWNrKHRoaXMtPnUuZXh0ZW5kZWRfYWN0aW9uLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VORDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfT0JKRUNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9QUk9HUkFNTUFCTEVfQ09VTlRFUjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+dS5kZWYubGVhZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyX2Rlc2NfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyX2Rlc2MgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX2JyYW5jaF91bnBhY2soJnRoaXMtPmJyYW5jaCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmJyYW5jaCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX1NUQU5EQVJEX0FUVFJJQlVURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hdHRyaWJ1dGVfdW5wYWNrKCZ0aGlzLT51LnN0YW5kYXJkX2F0dHJpYnV0ZS5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9TVEFOREFSRF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uX3VucGFjaygmdGhpcy0+dS5zdGFuZGFyZF9hY3Rpb24ubGVhZiwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRVhURU5ERURfQVRUUklCVVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hdHRyaWJ1dGVfdW5wYWNrKCZ0aGlzLT51LmV4dGVuZGVkX2F0dHJpYnV0ZS5sZWFmLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BQ1RJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFmX2FjdGlvbl91bnBhY2soJnRoaXMtPnUuZXh0ZW5kZWRfYWN0aW9uLmxlYWYsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VORDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfT0JKRUNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9QUk9HUkFNTUFCTEVfQ09VTlRFUjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+dS5kZWYubGVhZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyX2Rlc2Nfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyX2Rlc2NfcGFjaygmdGhpcy0+ZGVzY3JpcHRvciwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbl9wYWNrKHRoaXMtPmFjdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+bGVuZ3RoX3Jlc2VydmVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJfZGVzY191bnBhY2soJnRoaXMtPmRlc2NyaXB0b3IsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbl91bnBhY2soJnRoaXMtPmFjdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+bGVuZ3RoX3Jlc2VydmVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICAodm9pZClleHRyYV9tZW07CisgICAgcmV0dXJuIGJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlX2xpc3RfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnZhcmlhYmxlX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPnZhcmlhYmxlX2NvdW50ID4gMCkgJiYgKHRoaXMtPnZhcmlhYmxlcyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YXJpYWJsZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlX2xpc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dmFyaWFibGVfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGVfcGFjaygmdGhpcy0+dmFyaWFibGVzW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlX2xpc3RfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9saXN0ICp0aGlzKQoreworICAgIHJldHVybiAxICsgKDYgKiB0aGlzLT52YXJpYWJsZV9jb3VudCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGVfbGlzdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9saXN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT52YXJpYWJsZV9jb3VudCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT52YXJpYWJsZV9jb3VudCA+IDApICYmICh0aGlzLT52YXJpYWJsZXMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2YXJpYWJsZXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlX2xpc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+dmFyaWFibGVzID0gKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGUgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnZhcmlhYmxlX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnZhcmlhYmxlX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlX3VucGFjaygmdGhpcy0+dmFyaWFibGVzW2kwXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9saXN0X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgdmFyaWFibGVfY291bnQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmdmFyaWFibGVfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZSkgKiB2YXJpYWJsZV9jb3VudCk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCB2YXJpYWJsZV9jb3VudCAqIDYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wX3ZhcmlhYmxlX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcF92YXJpYWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbl9wYWNrKHRoaXMtPmFjdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmFjdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX0NPTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlX2xpc3RfcGFjaygmdGhpcy0+dS5jb250LnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlX2xpc3RfcGFjaygmdGhpcy0+dS5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9saXN0X3BhY2soJnRoaXMtPnUudW5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcF92YXJpYWJsZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wX3ZhcmlhYmxlICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMzsKKyAgICBzd2l0Y2ggKHRoaXMtPmFjdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX0NPTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9saXN0X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmNvbnQudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlX2xpc3RfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlX2xpc3RfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUudW5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcF92YXJpYWJsZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcF92YXJpYWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IGxlbmd0aCA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3VucGFjaygmdGhpcy0+YWN0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBidWYtPmN1cnIpOworICAgIHN3aXRjaCAodGhpcy0+YWN0aW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fQ09OVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGVfbGlzdF91bnBhY2soJnRoaXMtPnUuY29udC52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGVfbGlzdF91bnBhY2soJnRoaXMtPnUucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlX2xpc3RfdW5wYWNrKCZ0aGlzLT51LnVucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wX3ZhcmlhYmxlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbiBhY3Rpb247CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIHVpbnQxNl90IGxlbmd0aDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbl91bnBhY2soJmFjdGlvbiwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYocGFja2VkLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICBzd2l0Y2ggKGFjdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX0NPTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlX2xpc3Rfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9saXN0X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9saXN0X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcGNvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX29wY29kZV9wYWNrKHRoaXMtPm9wY29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm9wY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0dFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcF92YXJpYWJsZV9wYWNrKCZ0aGlzLT51LmdldF9yZXF1ZXN0LnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9TRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3BfdmFyaWFibGVfcGFjaygmdGhpcy0+dS5zZXRfcmVxdWVzdC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfRFlOQU1JQ19JUE1DQVNUX0NUUkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0RZTkFNSUNfSVBNQ0FTVF9DVFJMX1JFU1A6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0ZJTEVfVFJBTlNGRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0dFVF9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfS0VZX0VYQ0hBTkdFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9NQ0FTVF9SRUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX01DQVNUX1JFR19SRVNQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9SRVNFUlZFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU0VUX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9TVEFUSUNfSVBNQ0FTVF9DVFJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9TVEFUSUNfSVBNQ0FTVF9DVFJMX1JFU1A6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fcGFjayh0aGlzLT51LmRlZi5hY3Rpb24sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPnUuZGVmLmxlbmd0aF9yZXNlcnZlZCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wY29kZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wY29kZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDM7CisgICAgc3dpdGNoICh0aGlzLT5vcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9HRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wX3ZhcmlhYmxlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmdldF9yZXF1ZXN0LnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9TRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wX3ZhcmlhYmxlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnNldF9yZXF1ZXN0LnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9EWU5BTUlDX0lQTUNBU1RfQ1RSTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfRFlOQU1JQ19JUE1DQVNUX0NUUkxfUkVTUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfRklMRV9UUkFOU0ZFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfR0VUX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9LRVlfRVhDSEFOR0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX01DQVNUX1JFRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfTUNBU1RfUkVHX1JFU1A6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1JFU0VSVkVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9TRVRfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1NUQVRJQ19JUE1DQVNUX0NUUkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1NUQVRJQ19JUE1DQVNUX0NUUkxfUkVTUDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcGNvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MTZfdCBsZW5ndGggPSAwOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9kcG9lX29wY29kZV91bnBhY2soJnRoaXMtPm9wY29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCwgYnVmLT5jdXJyKTsKKyAgICBzd2l0Y2ggKHRoaXMtPm9wY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0dFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcF92YXJpYWJsZV91bnBhY2soJnRoaXMtPnUuZ2V0X3JlcXVlc3QudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9TRVRfUkVRVUVTVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3BfdmFyaWFibGVfdW5wYWNrKCZ0aGlzLT51LnNldF9yZXF1ZXN0LnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfRFlOQU1JQ19JUE1DQVNUX0NUUkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0RZTkFNSUNfSVBNQ0FTVF9DVFJMX1JFU1A6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0ZJTEVfVFJBTlNGRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0dFVF9SRVNQT05TRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfS0VZX0VYQ0hBTkdFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9NQ0FTVF9SRUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX01DQVNUX1JFR19SRVNQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9SRVNFUlZFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU0VUX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9TVEFUSUNfSVBNQ0FTVF9DVFJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9TVEFUSUNfSVBNQ0FTVF9DVFJMX1JFU1A6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fdW5wYWNrKCZ0aGlzLT51LmRlZi5hY3Rpb24sICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoJnBvc3RMZW5CdWYsICZ0aGlzLT51LmRlZi5sZW5ndGhfcmVzZXJ2ZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcGNvZGVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb3Bjb2RlIG9wY29kZTsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDE2X3QgbGVuZ3RoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb3Bjb2RlX3VucGFjaygmb3Bjb2RlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAob3Bjb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfR0VUX1JFUVVFU1Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wX3ZhcmlhYmxlX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1NFVF9SRVFVRVNUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcF92YXJpYWJsZV9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9EWU5BTUlDX0lQTUNBU1RfQ1RSTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfRFlOQU1JQ19JUE1DQVNUX0NUUkxfUkVTUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfRklMRV9UUkFOU0ZFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfR0VUX1JFU1BPTlNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9LRVlfRVhDSEFOR0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX01DQVNUX1JFRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfTUNBU1RfUkVHX1JFU1A6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1JFU0VSVkVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9TRVRfUkVTUE9OU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1NUQVRJQ19JUE1DQVNUX0NUUkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1NUQVRJQ19JUE1DQVNUX0NUUkxfUkVTUDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9jb250X3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9jb250ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDhfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5vcGNvZGVfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+b3Bjb2RlX2NvdW50ID4gMCkgJiYgKHRoaXMtPm9wY29kZXMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwib3Bjb2Rlc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfY29udFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5vcGNvZGVfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3Bjb2RlX3BhY2soJnRoaXMtPm9wY29kZXNbaTBdLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfY29udF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX2NvbnQgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHVpbnQzMl90IGkwOworICAgIGlmICgodGhpcy0+b3Bjb2RlX2NvdW50ID4gMCkgJiYgKHRoaXMtPm9wY29kZXMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwib3Bjb2RlX2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9jb250XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+b3Bjb2RlX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcGNvZGVfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPm9wY29kZXNbaTBdKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfY29udF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9jb250ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT5vcGNvZGVfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+b3Bjb2RlX2NvdW50ID4gMCkgJiYgKHRoaXMtPm9wY29kZXMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJvcGNvZGVzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9jb250XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPm9wY29kZXMgPSAoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcGNvZGUgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPm9wY29kZV9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wY29kZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+b3Bjb2RlX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wY29kZV91bnBhY2soJnRoaXMtPm9wY29kZXNbaTBdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX2NvbnRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBvcGNvZGVfY291bnQ7CisgICAgdWludDhfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZvcGNvZGVfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcGNvZGUpICogb3Bjb2RlX2NvdW50KTsKKyAgICBmb3IgKGkwID0gMDsgaTAgPCBvcGNvZGVfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3Bjb2RlX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fcGFjayh0aGlzLT5hY3Rpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5hY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9jb250X3BhY2soJnRoaXMtPnUuY29udC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9jb250X3BhY2soJnRoaXMtPnUucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfY29udF9wYWNrKCZ0aGlzLT51LnVucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAzOworICAgIHN3aXRjaCAodGhpcy0+YWN0aW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fQ09OVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX2NvbnRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuY29udC52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfY29udF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfY29udF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS51bnJlZ2lzdGVyX2FuZF9jb250aW51ZS52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IGxlbmd0aCA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3VucGFjaygmdGhpcy0+YWN0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBidWYtPmN1cnIpOworICAgIHN3aXRjaCAodGhpcy0+YWN0aW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fQ09OVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfY29udF91bnBhY2soJnRoaXMtPnUuY29udC52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfY29udF91bnBhY2soJnRoaXMtPnUucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX2NvbnRfdW5wYWNrKCZ0aGlzLT51LnVucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb24gYWN0aW9uOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50MTZfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fdW5wYWNrKCZhY3Rpb24sIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgc3dpdGNoIChhY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9jb250X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfY29udF9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfY29udF9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3Jfb3VpX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX291aSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpX3BhY2sodGhpcy0+b3VpLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b3VpKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQ1RDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3BhY2soJnRoaXMtPnUuY3RjLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9URUs6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfcGFjaygmdGhpcy0+dS50ZWsudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RQT0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3BhY2soJnRoaXMtPnUuZHBvZS52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQlJDTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfREFTQU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0tUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9QTUM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1NJRVBPTl9BOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3BhY2sodGhpcy0+dS5kZWYuYWN0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmRlZi5sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX291aV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3Jfb3VpICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMzsKKyAgICBzd2l0Y2ggKHRoaXMtPm91aSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0NUQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuY3RjLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9URUs6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnRlay52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfRFBPRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmRwb2UudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0JSQ006CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RBU0FOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9LVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfUE1DOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9TSUVQT05fQToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3Jfb3VpX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3Jfb3VpICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fd2VsbF9rbm93bl9vdWlfdW5wYWNrKCZ0aGlzLT5vdWksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vdWkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9DVEM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdW5wYWNrKCZ0aGlzLT51LmN0Yy52YWx1ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9URUs6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdW5wYWNrKCZ0aGlzLT51LnRlay52YWx1ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EUE9FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV91bnBhY2soJnRoaXMtPnUuZHBvZS52YWx1ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9CUkNNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EQVNBTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfS1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1BNQzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfU0lFUE9OX0E6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fdW5wYWNrKCZ0aGlzLT51LmRlZi5hY3Rpb24sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnUuZGVmLmxlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9vdWlfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpIG91aTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV93ZWxsX2tub3duX291aV91bnBhY2soJm91aSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG91aSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0NUQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfVEVLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EUE9FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQlJDTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfREFTQU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0tUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9QTUM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1NJRVBPTl9BOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX2NvbnRfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfY29udCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+dmVuZG9yX291aV9yZWdfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+dmVuZG9yX291aV9yZWdfY291bnQgPiAwKSAmJiAodGhpcy0+dmVuZG9yX291aV9yZWcgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmVuZG9yX291aV9yZWdcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfY29udFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT52ZW5kb3Jfb3VpX3JlZ19jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX291aV9wYWNrKCZ0aGlzLT52ZW5kb3Jfb3VpX3JlZ1tpMF0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX2NvbnRfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX2NvbnQgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHVpbnQzMl90IGkwOworICAgIGlmICgodGhpcy0+dmVuZG9yX291aV9yZWdfY291bnQgPiAwKSAmJiAodGhpcy0+dmVuZG9yX291aV9yZWcgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwidmVuZG9yX291aV9yZWdfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfY29udFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnZlbmRvcl9vdWlfcmVnX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX291aV9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dmVuZG9yX291aV9yZWdbaTBdKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9jb250X3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfY29udCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+dmVuZG9yX291aV9yZWdfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+dmVuZG9yX291aV9yZWdfY291bnQgPiAwKSAmJiAodGhpcy0+dmVuZG9yX291aV9yZWcgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJ2ZW5kb3Jfb3VpX3JlZ1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9jb250XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMtPnZlbmRvcl9vdWlfcmVnID0gKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9vdWkgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnZlbmRvcl9vdWlfcmVnX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9vdWkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnZlbmRvcl9vdWlfcmVnX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3Jfb3VpX3VucGFjaygmdGhpcy0+dmVuZG9yX291aV9yZWdbaTBdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfY29udF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IHZlbmRvcl9vdWlfcmVnX2NvdW50OworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgocGFja2VkLCAmdmVuZG9yX291aV9yZWdfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX291aSkgKiB2ZW5kb3Jfb3VpX3JlZ19jb3VudCk7CisgICAgZm9yIChpMCA9IDA7IGkwIDwgdmVuZG9yX291aV9yZWdfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9vdWlfc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3IgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fcGFjayh0aGlzLT5hY3Rpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5hY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX2NvbnRfcGFjaygmdGhpcy0+dS5jb250LnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfY29udF9wYWNrKCZ0aGlzLT51LnJlZ2lzdGVyX2FuZF9jb250aW51ZS52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfY29udF9wYWNrKCZ0aGlzLT51LnVucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMzsKKyAgICBzd2l0Y2ggKHRoaXMtPmFjdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX0NPTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX2NvbnRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuY29udC52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9jb250X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LnJlZ2lzdGVyX2FuZF9jb250aW51ZS52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX2NvbnRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUudW5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgbGVuZ3RoID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fdW5wYWNrKCZ0aGlzLT5hY3Rpb24sIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT5hY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX2NvbnRfdW5wYWNrKCZ0aGlzLT51LmNvbnQudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfY29udF91bnBhY2soJnRoaXMtPnUucmVnaXN0ZXJfYW5kX2NvbnRpbnVlLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfY29udF91bnBhY2soJnRoaXMtPnUudW5yZWdpc3Rlcl9hbmRfY29udGludWUudmFsdWUsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3Jfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uIGFjdGlvbjsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDE2X3QgbGVuZ3RoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3VucGFjaygmYWN0aW9uLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAoYWN0aW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fQ09OVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9jb250X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9jb250X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX2NvbnRfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfb3Bjb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfb3Bjb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9vcGNvZGVfcGFjayh0aGlzLT5vcGNvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX0lORk86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3BhY2soJnRoaXMtPnUuaW5mby52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9PUkdBTklaQVRJT05fU1BFQ0lGSUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfcGFjaygmdGhpcy0+dS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfRVZFTlRfTk9USUZJQ0FUSU9OOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX0xPT1BCQUNLX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfVkFSX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfVkFSX1JFU1BPTlNFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3BhY2sodGhpcy0+dS5kZWYuYWN0aW9uLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmRlZi5sZW5ndGhfcmVzZXJ2ZWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfb3Bjb2RlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX29wY29kZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDM7CisgICAgc3dpdGNoICh0aGlzLT5vcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX0lORk86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5pbmZvLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX09SR0FOSVpBVElPTl9TUEVDSUZJQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX0VWRU5UX05PVElGSUNBVElPTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9MT09QQkFDS19DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX1ZBUl9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX1ZBUl9SRVNQT05TRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19vcGNvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX29wY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IGxlbmd0aCA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9vcGNvZGVfdW5wYWNrKCZ0aGlzLT5vcGNvZGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT5vcGNvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX0lORk86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3VucGFjaygmdGhpcy0+dS5pbmZvLnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9PUkdBTklaQVRJT05fU1BFQ0lGSUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfdW5wYWNrKCZ0aGlzLT51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfRVZFTlRfTk9USUZJQ0FUSU9OOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX0xPT1BCQUNLX0NPTlRST0w6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfVkFSX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfVkFSX1JFU1BPTlNFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3VucGFjaygmdGhpcy0+dS5kZWYuYWN0aW9uLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KCZwb3N0TGVuQnVmLCAmdGhpcy0+dS5kZWYubGVuZ3RoX3Jlc2VydmVkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX29wY29kZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX29wY29kZSBvcGNvZGU7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIHVpbnQxNl90IGxlbmd0aDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fb3Bjb2RlX3VucGFjaygmb3Bjb2RlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAob3Bjb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9JTkZPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX09SR0FOSVpBVElPTl9TUEVDSUZJQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX0VWRU5UX05PVElGSUNBVElPTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9MT09QQkFDS19DT05UUk9MOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX1ZBUl9SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX1ZBUl9SRVNQT05TRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT5tYXN0ZXJfaWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uX3BhY2sodGhpcy0+YWN0aW9uLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+YWN0aW9uKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fQ09OVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGkwOworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUuY29udC5yZWdpc3RyYXRpb25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5jb250LnJlZ2lzdHJhdGlvbl9jb3VudCA+IDApICYmICh0aGlzLT51LmNvbnQucmVnaXN0cmF0aW9uID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJlZ2lzdHJhdGlvblwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2NvbnRcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+dS5jb250LnJlZ2lzdHJhdGlvbl9jb3VudDsgaTArKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfb3Bjb2RlX3BhY2soJnRoaXMtPnUuY29udC5yZWdpc3RyYXRpb25baTBdLCBidWYpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9SRUdJU1RFUl9BTkRfQ09OVElOVUU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1VOUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbiAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDQ7CisgICAgc3dpdGNoICh0aGlzLT5hY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGkwOworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmNvbnQucmVnaXN0cmF0aW9uX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuY29udC5yZWdpc3RyYXRpb24gPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicmVnaXN0cmF0aW9uX2NvdW50XCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25cIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT51LmNvbnQucmVnaXN0cmF0aW9uX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfb3Bjb2RlX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmNvbnQucmVnaXN0cmF0aW9uW2kwXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgbGVuZ3RoID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+bWFzdGVyX2lkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbl91bnBhY2soJnRoaXMtPmFjdGlvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCwgYnVmLT5jdXJyKTsKKyAgICBzd2l0Y2ggKHRoaXMtPmFjdGlvbikKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX0NPTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCBpMDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OCgmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuY29udC5yZWdpc3RyYXRpb25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5jb250LnJlZ2lzdHJhdGlvbl9jb3VudCA+IDApICYmICh0aGlzLT51LmNvbnQucmVnaXN0cmF0aW9uID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicmVnaXN0cmF0aW9uXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fY29udFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51LmNvbnQucmVnaXN0cmF0aW9uID0gKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX29wY29kZSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5jb250LnJlZ2lzdHJhdGlvbl9jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19vcGNvZGUpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnUuY29udC5yZWdpc3RyYXRpb25fY291bnQ7IGkwKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX29wY29kZV91bnBhY2soJnRoaXMtPnUuY29udC5yZWdpc3RyYXRpb25baTBdLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uIGFjdGlvbjsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDE2X3QgbGVuZ3RoOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fdW5wYWNrKCZhY3Rpb24sIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgc3dpdGNoIChhY3Rpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9DT05UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgcmVnaXN0cmF0aW9uX2NvdW50OworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaTA7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoJnBvc3RMZW5CdWYsICZyZWdpc3RyYXRpb25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpleHRyYV9tZW0gKz0gQkNNT1NfUk9VTkRfVE9fV09SRChzaXplb2YoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfb3Bjb2RlKSAqIHJlZ2lzdHJhdGlvbl9jb3VudCk7CisgICAgICAgICAgICAgICAgZm9yIChpMCA9IDA7IGkwIDwgcmVnaXN0cmF0aW9uX2NvdW50OyBpMCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19vcGNvZGVfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHSVNURVJfQU5EX0NPTlRJTlVFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSX0FORF9DT05USU5VRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fbGlzdF9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnJlZ2lzdHJhdGlvbnNfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+cmVnaXN0cmF0aW9uc19jb3VudCA+IDApICYmICh0aGlzLT5yZWdpc3RyYXRpb25zID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInJlZ2lzdHJhdGlvbnNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9saXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnJlZ2lzdHJhdGlvbnNfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX3BhY2soJnRoaXMtPnJlZ2lzdHJhdGlvbnNbaTBdLCBidWYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2xpc3RfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fbGlzdCAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgdWludDMyX3QgaTA7CisgICAgaWYgKCh0aGlzLT5yZWdpc3RyYXRpb25zX2NvdW50ID4gMCkgJiYgKHRoaXMtPnJlZ2lzdHJhdGlvbnMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicmVnaXN0cmF0aW9uc19jb3VudFwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2xpc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5yZWdpc3RyYXRpb25zX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnJlZ2lzdHJhdGlvbnNbaTBdKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2xpc3RfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnJlZ2lzdHJhdGlvbnNfY291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+cmVnaXN0cmF0aW9uc19jb3VudCA+IDApICYmICh0aGlzLT5yZWdpc3RyYXRpb25zID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicmVnaXN0cmF0aW9uc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2xpc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+cmVnaXN0cmF0aW9ucyA9IChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbiAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+cmVnaXN0cmF0aW9uc19jb3VudCAqIHNpemVvZihiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbikpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+cmVnaXN0cmF0aW9uc19jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fdW5wYWNrKCZ0aGlzLT5yZWdpc3RyYXRpb25zW2kwXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fbGlzdF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IHJlZ2lzdHJhdGlvbnNfY291bnQ7CisgICAgdWludDhfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChwYWNrZWQsICZyZWdpc3RyYXRpb25zX2NvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uKSAqIHJlZ2lzdHJhdGlvbnNfY291bnQpOworICAgIGZvciAoaTAgPSAwOyBpMCA8IHJlZ2lzdHJhdGlvbnNfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3Rsdl9wYWNrKGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHYgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90eXBlX3BhY2sodGhpcy0+dHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9NQVNURVJfQ09OVEVYVF9UWVBFX09OVToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9NQVNURVJfQ09OVEVYVF9UWVBFX05FVFdPUktfUE9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUubmV0d29ya19wb24ucG9ydF9pbmRleCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX01BU1RFUl9DT05URVhUX1RZUEVfTElOSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTgoYnVmLCB0aGlzLT51LmxpbmsubGlua19pbmRleCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX01BU1RFUl9DT05URVhUX1RZUEVfVVNFUl9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91OChidWYsIHRoaXMtPnUudXNlcl9wb3J0LnBvcnRfaW5kZXgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdGx2X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHYgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSAxOworICAgIHN3aXRjaCAodGhpcy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX01BU1RFUl9DT05URVhUX1RZUEVfT05VOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX01BU1RFUl9DT05URVhUX1RZUEVfTkVUV09SS19QT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9NQVNURVJfQ09OVEVYVF9UWVBFX0xJTks6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9NQVNURVJfQ09OVEVYVF9UWVBFX1VTRVJfUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHZfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHYgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90eXBlX3VucGFjaygmdGhpcy0+dHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9NQVNURVJfQ09OVEVYVF9UWVBFX09OVToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9NQVNURVJfQ09OVEVYVF9UWVBFX05FVFdPUktfUE9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUubmV0d29ya19wb24ucG9ydF9pbmRleCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX01BU1RFUl9DT05URVhUX1RZUEVfTElOSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ0aGlzLT51LmxpbmsubGlua19pbmRleCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX01BU1RFUl9DT05URVhUX1RZUEVfVVNFUl9QT1JUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KGJ1ZiwgJnRoaXMtPnUudXNlcl9wb3J0LnBvcnRfaW5kZXgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHZfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3R5cGUgdHlwZTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90eXBlX3VucGFjaygmdHlwZSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9NQVNURVJfQ09OVEVYVF9UWVBFX09OVToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9NQVNURVJfQ09OVEVYVF9UWVBFX05FVFdPUktfUE9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX01BU1RFUl9DT05URVhUX1RZUEVfTElOSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9NQVNURVJfQ09OVEVYVF9UWVBFX1VTRVJfUE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbV9wYWNrKGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQzMl90IHByZUxlbkZpZWxkUG9zOworICAgIHVpbnQzMl90IGJ5dGVzQWZ0ZXJMZW5GaWVsZDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV93ZWxsX2tub3duX291aV9wYWNrKHRoaXMtPm91aSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfYm9vbChidWYsIHRoaXMtPm5lZ290aWF0ZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+b3VpKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfVEVLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0NUQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9jdGNfdmVyc2lvbl9wYWNrKHRoaXMtPnUuY3RjLnZlcnNpb24sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RQT0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV92ZXJzaW9uX3BhY2sodGhpcy0+dS5kcG9lLnZlcnNpb24sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0JSQ006CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RBU0FOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9LVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfUE1DOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9TSUVQT05fQToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50OF90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDU7CisgICAgc3dpdGNoICh0aGlzLT5vdWkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9URUs6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQ1RDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfRFBPRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0JSQ006CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RBU0FOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9LVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfUE1DOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9TSUVQT05fQToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtX3VucGFjayhiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW0gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50OF90IHZlcnNpb25fbGVuZ3RoID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fd2VsbF9rbm93bl9vdWlfdW5wYWNrKCZ0aGlzLT5vdWksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfYm9vbChidWYsICZ0aGlzLT5uZWdvdGlhdGVkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91OChidWYsICZ2ZXJzaW9uX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCB2ZXJzaW9uX2xlbmd0aCwgYnVmLT5jdXJyKTsKKyAgICBzd2l0Y2ggKHRoaXMtPm91aSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1RFSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9DVEM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fY3RjX3ZlcnNpb25fdW5wYWNrKCZ0aGlzLT51LmN0Yy52ZXJzaW9uLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RQT0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZHBvZV92ZXJzaW9uX3VucGFjaygmdGhpcy0+dS5kcG9lLnZlcnNpb24sICZwb3N0TGVuQnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQlJDTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfREFTQU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0tUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9QTUM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1NJRVBPTl9BOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCB2ZXJzaW9uX2xlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fd2VsbF9rbm93bl9vdWkgb3VpOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50OF90IGxlbmd0aDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV93ZWxsX2tub3duX291aV91bnBhY2soJm91aSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgc3dpdGNoIChvdWkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9URUs6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQ1RDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfRFBPRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0JSQ006CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RBU0FOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9LVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfUE1DOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9TSUVQT05fQToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtX2xpc3RfcGFjayhiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fbGlzdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3U4KGJ1ZiwgdGhpcy0+Y291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+Y291bnQgPiAwKSAmJiAodGhpcy0+bmVnb3RpYXRlZF9vYW1zID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcIm5lZ290aWF0ZWRfb2Ftc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbV9saXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmNvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fcGFjaygmdGhpcy0+bmVnb3RpYXRlZF9vYW1zW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fbGlzdF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fbGlzdCAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgdWludDMyX3QgaTA7CisgICAgaWYgKCh0aGlzLT5jb3VudCA+IDApICYmICh0aGlzLT5uZWdvdGlhdGVkX29hbXMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fbGlzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPmNvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtX2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5uZWdvdGlhdGVkX29hbXNbaTBdKTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbV9saXN0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fbGlzdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQ4X3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTgoYnVmLCAmdGhpcy0+Y291bnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgodGhpcy0+Y291bnQgPiAwKSAmJiAodGhpcy0+bmVnb3RpYXRlZF9vYW1zID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwibmVnb3RpYXRlZF9vYW1zXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtX2xpc3RcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+bmVnb3RpYXRlZF9vYW1zID0gKGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbSAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+Y291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtX3VucGFjaygmdGhpcy0+bmVnb3RpYXRlZF9vYW1zW2kwXSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtX2xpc3Rfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDhfdCBjb3VudDsKKyAgICB1aW50OF90IGkwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3U4KHBhY2tlZCwgJmNvdW50KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbSkgKiBjb3VudCk7CisgICAgZm9yIChpMCA9IDA7IGkwIDwgY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmRfcGFjayhiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbWFuZF9pZF9wYWNrKHRoaXMtPmNvbW1hbmQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5jb21tYW5kKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0VOQUJMRV9PTlU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0RJU0FCTEVfT05VOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9HRVRfT05VX1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9HRVRfT0FNX1JFR0lTVFJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfU0VUX09BTV9SRUdJU1RSQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9saXN0X3BhY2soJnRoaXMtPnUuc2V0X29hbV9yZWdpc3RyYXRpb24ub2FtX3JlZ2lzdHJhdGlvbnMsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9HRVRfTkVHT1RJQVRFRF9PQU06CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdGx2X3BhY2soJnRoaXMtPnUuZ2V0X25lZ290aWF0ZWRfb2FtLmxpbmtfY29udGV4dCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX1NFVF9ORUdPVElBVEVEX09BTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHZfcGFjaygmdGhpcy0+dS5zZXRfbmVnb3RpYXRlZF9vYW0ubGlua19jb250ZXh0LCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtX2xpc3RfcGFjaygmdGhpcy0+dS5zZXRfbmVnb3RpYXRlZF9vYW0ubmVnb3RpYXRlZF9vYW0sIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9URVJNSU5BVE9SOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmQgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSA0OworICAgIHN3aXRjaCAodGhpcy0+Y29tbWFuZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9FTkFCTEVfT05VOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9ESVNBQkxFX09OVToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfR0VUX09OVV9TVEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfR0VUX09BTV9SRUdJU1RSQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX1NFVF9PQU1fUkVHSVNUUkFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2xpc3RfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuc2V0X29hbV9yZWdpc3RyYXRpb24ub2FtX3JlZ2lzdHJhdGlvbnMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9HRVRfTkVHT1RJQVRFRF9PQU06CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3Rsdl9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5nZXRfbmVnb3RpYXRlZF9vYW0ubGlua19jb250ZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfU0VUX05FR09USUFURURfT0FNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHZfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuc2V0X25lZ290aWF0ZWRfb2FtLmxpbmtfY29udGV4dCkgKyBiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fbGlzdF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5zZXRfbmVnb3RpYXRlZF9vYW0ubmVnb3RpYXRlZF9vYW0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9URVJNSU5BVE9SOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgbGVuZ3RoID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kX2lkX3VucGFjaygmdGhpcy0+Y29tbWFuZCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCwgYnVmLT5jdXJyKTsKKyAgICBzd2l0Y2ggKHRoaXMtPmNvbW1hbmQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfRU5BQkxFX09OVToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfRElTQUJMRV9PTlU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0dFVF9PTlVfU1RBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0dFVF9PQU1fUkVHSVNUUkFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9TRVRfT0FNX1JFR0lTVFJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2xpc3RfdW5wYWNrKCZ0aGlzLT51LnNldF9vYW1fcmVnaXN0cmF0aW9uLm9hbV9yZWdpc3RyYXRpb25zLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0dFVF9ORUdPVElBVEVEX09BTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHZfdW5wYWNrKCZ0aGlzLT51LmdldF9uZWdvdGlhdGVkX29hbS5saW5rX2NvbnRleHQsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfU0VUX05FR09USUFURURfT0FNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3Rsdl91bnBhY2soJnRoaXMtPnUuc2V0X25lZ290aWF0ZWRfb2FtLmxpbmtfY29udGV4dCwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fbGlzdF91bnBhY2soJnRoaXMtPnUuc2V0X25lZ290aWF0ZWRfb2FtLm5lZ290aWF0ZWRfb2FtLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX1RFUk1JTkFUT1I6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIGxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbWFuZF9pZCBjb21tYW5kOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50MTZfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kX2lkX3VucGFjaygmY29tbWFuZCwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYocGFja2VkLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCwgcGFja2VkLT5jdXJyKTsKKyAgICBzd2l0Y2ggKGNvbW1hbmQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfRU5BQkxFX09OVToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfRElTQUJMRV9PTlU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0dFVF9PTlVfU1RBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0dFVF9PQU1fUkVHSVNUUkFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9TRVRfT0FNX1JFR0lTVFJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2xpc3Rfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0dFVF9ORUdPVElBVEVEX09BTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHZfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX1NFVF9ORUdPVElBVEVEX09BTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHZfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbV9saXN0X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9URVJNSU5BVE9SOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9yZXNwb25zZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3Jlc3BvbnNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbWFuZF9pZF9wYWNrKHRoaXMtPmNvbW1hbmQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9yZXNwb25zZV9jb2RlX3BhY2sodGhpcy0+cmVzcG9uc2VfY29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmNvbW1hbmQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfRU5BQkxFX09OVToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfRElTQUJMRV9PTlU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0dFVF9PTlVfU1RBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb251X3N0YXRlX3BhY2sodGhpcy0+dS5nZXRfb251X3N0YXRlLnN0YXRlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfR0VUX09BTV9SRUdJU1RSQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9saXN0X3BhY2soJnRoaXMtPnUuZ2V0X29hbV9yZWdpc3RyYXRpb24ub2FtX3JlZ2lzdHJhdGlvbnMsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9TRVRfT0FNX1JFR0lTVFJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfR0VUX05FR09USUFURURfT0FNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3Rsdl9wYWNrKCZ0aGlzLT51LmdldF9uZWdvdGlhdGVkX29hbS5saW5rX2NvbnRleHQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fbGlzdF9wYWNrKCZ0aGlzLT51LmdldF9uZWdvdGlhdGVkX29hbS5uZWdvdGlhdGVkX29hbSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX1NFVF9ORUdPVElBVEVEX09BTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHZfcGFjaygmdGhpcy0+dS5zZXRfbmVnb3RpYXRlZF9vYW0ubGlua19jb250ZXh0LCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfVEVSTUlOQVRPUjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcmVzcG9uc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcmVzcG9uc2UgKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSA1OworICAgIHN3aXRjaCAodGhpcy0+Y29tbWFuZCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9FTkFCTEVfT05VOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9ESVNBQkxFX09OVToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfR0VUX09OVV9TVEFURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9HRVRfT0FNX1JFR0lTVFJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9saXN0X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmdldF9vYW1fcmVnaXN0cmF0aW9uLm9hbV9yZWdpc3RyYXRpb25zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfU0VUX09BTV9SRUdJU1RSQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0dFVF9ORUdPVElBVEVEX09BTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdGx2X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51LmdldF9uZWdvdGlhdGVkX29hbS5saW5rX2NvbnRleHQpICsgYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtX2xpc3RfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZ2V0X25lZ290aWF0ZWRfb2FtLm5lZ290aWF0ZWRfb2FtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfU0VUX05FR09USUFURURfT0FNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHZfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuc2V0X25lZ290aWF0ZWRfb2FtLmxpbmtfY29udGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX1RFUk1JTkFUT1I6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3Jlc3BvbnNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9yZXNwb25zZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IGxlbmd0aCA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbWFuZF9pZF91bnBhY2soJnRoaXMtPmNvbW1hbmQsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9yZXNwb25zZV9jb2RlX3VucGFjaygmdGhpcy0+cmVzcG9uc2VfY29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCwgYnVmLT5jdXJyKTsKKyAgICBzd2l0Y2ggKHRoaXMtPmNvbW1hbmQpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfRU5BQkxFX09OVToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfRElTQUJMRV9PTlU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0dFVF9PTlVfU1RBVEU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb251X3N0YXRlX3VucGFjaygmdGhpcy0+dS5nZXRfb251X3N0YXRlLnN0YXRlLCAmcG9zdExlbkJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9HRVRfT0FNX1JFR0lTVFJBVElPTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2xpc3RfdW5wYWNrKCZ0aGlzLT51LmdldF9vYW1fcmVnaXN0cmF0aW9uLm9hbV9yZWdpc3RyYXRpb25zLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX1NFVF9PQU1fUkVHSVNUUkFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9HRVRfTkVHT1RJQVRFRF9PQU06CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdGx2X3VucGFjaygmdGhpcy0+dS5nZXRfbmVnb3RpYXRlZF9vYW0ubGlua19jb250ZXh0LCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbV9saXN0X3VucGFjaygmdGhpcy0+dS5nZXRfbmVnb3RpYXRlZF9vYW0ubmVnb3RpYXRlZF9vYW0sICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfU0VUX05FR09USUFURURfT0FNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3Rsdl91bnBhY2soJnRoaXMtPnUuc2V0X25lZ290aWF0ZWRfb2FtLmxpbmtfY29udGV4dCwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9URVJNSU5BVE9SOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9yZXNwb25zZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kX2lkIGNvbW1hbmQ7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIHVpbnQxNl90IGxlbmd0aDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmRfaWRfdW5wYWNrKCZjb21tYW5kLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgc3dpdGNoIChjb21tYW5kKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0VOQUJMRV9PTlU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0RJU0FCTEVfT05VOgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9HRVRfT05VX1NUQVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0dFVF9PQU1fUkVHSVNUUkFUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fbGlzdF9zY2FuKCZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfU0VUX09BTV9SRUdJU1RSQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0dFVF9ORUdPVElBVEVEX09BTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHZfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbV9saXN0X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9TRVRfTkVHT1RJQVRFRF9PQU06CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdGx2X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9URVJNSU5BVE9SOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tdW5pY2F0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbXVuaWNhdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbXVuaWNhdGlvbl90eXBlX3BhY2sodGhpcy0+dHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1VTklDQVRJT05fVFlQRV9DT01NQU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbWFuZF9wYWNrKCZ0aGlzLT51LmNvbW1hbmQudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTVVOSUNBVElPTl9UWVBFX1JFU1BPTlNFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcmVzcG9uc2VfcGFjaygmdGhpcy0+dS5yZXNwb25zZS52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbXVuaWNhdGlvbl9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tdW5pY2F0aW9uICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICBzd2l0Y2ggKHRoaXMtPnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1VTklDQVRJT05fVFlQRV9DT01NQU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuY29tbWFuZC52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NVU5JQ0FUSU9OX1RZUEVfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcmVzcG9uc2VfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUucmVzcG9uc2UudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW11bmljYXRpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW11bmljYXRpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW11bmljYXRpb25fdHlwZV91bnBhY2soJnRoaXMtPnR5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT50eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NVU5JQ0FUSU9OX1RZUEVfQ09NTUFORDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmRfdW5wYWNrKCZ0aGlzLT51LmNvbW1hbmQudmFsdWUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NVU5JQ0FUSU9OX1RZUEVfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9yZXNwb25zZV91bnBhY2soJnRoaXMtPnUucmVzcG9uc2UudmFsdWUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tdW5pY2F0aW9uX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW11bmljYXRpb25fdHlwZSB0eXBlOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbXVuaWNhdGlvbl90eXBlX3VucGFjaygmdHlwZSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1VTklDQVRJT05fVFlQRV9DT01NQU5EOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbWFuZF9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NVU5JQ0FUSU9OX1RZUEVfUkVTUE9OU0U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9yZXNwb25zZV9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX3BkdV9jb21tb25fcGFjayhiY21vbHRfZXBvbl9vYW1fbWFzdGVyX3BkdV9jb21tb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9wcm90b2NvbF9wYWNrKHRoaXMtPnByb3RvY29sLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5jb3JyZWxhdGlvbl90YWcpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHByZUxlbkZpZWxkUG9zID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpOworCisgICAgLyogc2tpcCBvdmVyIGxlbmd0aCBmaWVsZCAod2UnbGwgZmlsbCBpdCBpbiBsYXRlcikgKi8KKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChidWYsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+cHJvdG9jb2wpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX1BST1RPQ09MX1BJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9waW5nX2ZsYWdzX3BhY2sodGhpcy0+dS5waW5nLmZsYWdzLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX1BST1RPQ09MX0VOQ0FQU1VMQVRFRF9GUkFNRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfZW5kX3BvaW50X3BhY2soJnRoaXMtPnUuZW5jYXBzdWxhdGVkX2ZyYW1lLmRtZXAsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2VuZF9wb2ludF9wYWNrKCZ0aGlzLT51LmVuY2Fwc3VsYXRlZF9mcmFtZS5zbWVwLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT51LmVuY2Fwc3VsYXRlZF9mcmFtZS5mcmFtZV9sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5lbmNhcHN1bGF0ZWRfZnJhbWUuZnJhbWVfbGVuZ3RoID4gMCkgJiYgKHRoaXMtPnUuZW5jYXBzdWxhdGVkX2ZyYW1lLmZyYW1lX2RhdGEgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwiZnJhbWVfZGF0YVwiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfcGR1X2NvbW1vbl9lbmNhcHN1bGF0ZWRfZnJhbWVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlKGJ1ZiwgdGhpcy0+dS5lbmNhcHN1bGF0ZWRfZnJhbWUuZnJhbWVfZGF0YSwgdGhpcy0+dS5lbmNhcHN1bGF0ZWRfZnJhbWUuZnJhbWVfbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9QUk9UT0NPTF9PQU1fQ09OVEVOVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX29hbV9jb250ZW50X3BhY2soJnRoaXMtPnUub2FtX2NvbnRlbnQudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfUFJPVE9DT0xfUkVHSVNURVJFRF9PQU06CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9vYW1fY29udGVudF9wYWNrKCZ0aGlzLT51LnJlZ2lzdGVyZWRfb2FtLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX1BST1RPQ09MX01BU1RFUl9DT01NVU5JQ0FUSU9OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbXVuaWNhdGlvbl9wYWNrKCZ0aGlzLT51Lm1hc3Rlcl9jb21tdW5pY2F0aW9uLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX1BST1RPQ09MX0JST0FEQ09NX1NESzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9QUk9UT0NPTF9NQVNURVJfUFJPVE9DT0xfVEVLX1VOS05PV046CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBieXRlc0FmdGVyTGVuRmllbGQgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1ZikgLSAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIHByZUxlbkZpZWxkUG9zKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2V0X3BvcyhidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCArIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfcGR1X2NvbW1vbl9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fbWFzdGVyX3BkdV9jb21tb24gKnRoaXMpCit7CisgICAgdWludDMyX3QgY291bnQgPSA2OworICAgIHN3aXRjaCAodGhpcy0+cHJvdG9jb2wpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX1BST1RPQ09MX1BJTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX1BST1RPQ09MX0VOQ0FQU1VMQVRFRF9GUkFNRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSA2ICsgdGhpcy0+dS5lbmNhcHN1bGF0ZWRfZnJhbWUuZnJhbWVfbGVuZ3RoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfUFJPVE9DT0xfT0FNX0NPTlRFTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfb2FtX2NvbnRlbnRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUub2FtX2NvbnRlbnQudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfUFJPVE9DT0xfUkVHSVNURVJFRF9PQU06CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfb2FtX2NvbnRlbnRfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUucmVnaXN0ZXJlZF9vYW0udmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfUFJPVE9DT0xfTUFTVEVSX0NPTU1VTklDQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbXVuaWNhdGlvbl9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5tYXN0ZXJfY29tbXVuaWNhdGlvbi52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9QUk9UT0NPTF9CUk9BRENPTV9TREs6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfUFJPVE9DT0xfTUFTVEVSX1BST1RPQ09MX1RFS19VTktOT1dOOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX3BkdV9jb21tb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfcGR1X2NvbW1vbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IGxlbmd0aCA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcHJvdG9jb2xfdW5wYWNrKCZ0aGlzLT5wcm90b2NvbCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+Y29ycmVsYXRpb25fdGFnKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmX2luaXQoJnBvc3RMZW5CdWYsIGxlbmd0aCwgYnVmLT5jdXJyKTsKKyAgICBzd2l0Y2ggKHRoaXMtPnByb3RvY29sKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9QUk9UT0NPTF9QSU5HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcGluZ19mbGFnc191bnBhY2soJnRoaXMtPnUucGluZy5mbGFncywgJnBvc3RMZW5CdWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX1BST1RPQ09MX0VOQ0FQU1VMQVRFRF9GUkFNRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfZW5kX3BvaW50X3VucGFjaygmdGhpcy0+dS5lbmNhcHN1bGF0ZWRfZnJhbWUuZG1lcCwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2VuZF9wb2ludF91bnBhY2soJnRoaXMtPnUuZW5jYXBzdWxhdGVkX2ZyYW1lLnNtZXAsICZwb3N0TGVuQnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJnRoaXMtPnUuZW5jYXBzdWxhdGVkX2ZyYW1lLmZyYW1lX2xlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT51LmVuY2Fwc3VsYXRlZF9mcmFtZS5mcmFtZV9sZW5ndGggPiAwKSAmJiAodGhpcy0+dS5lbmNhcHN1bGF0ZWRfZnJhbWUuZnJhbWVfZGF0YSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImZyYW1lX2RhdGFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fbWFzdGVyX3BkdV9jb21tb25fZW5jYXBzdWxhdGVkX2ZyYW1lXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZW5jYXBzdWxhdGVkX2ZyYW1lLmZyYW1lX2RhdGEgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5lbmNhcHN1bGF0ZWRfZnJhbWUuZnJhbWVfbGVuZ3RoICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKCZwb3N0TGVuQnVmLCB0aGlzLT51LmVuY2Fwc3VsYXRlZF9mcmFtZS5mcmFtZV9kYXRhLCB0aGlzLT51LmVuY2Fwc3VsYXRlZF9mcmFtZS5mcmFtZV9sZW5ndGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX1BST1RPQ09MX09BTV9DT05URU5UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfb2FtX2NvbnRlbnRfdW5wYWNrKCZ0aGlzLT51Lm9hbV9jb250ZW50LnZhbHVlLCAmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9QUk9UT0NPTF9SRUdJU1RFUkVEX09BTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX29hbV9jb250ZW50X3VucGFjaygmdGhpcy0+dS5yZWdpc3RlcmVkX29hbS52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfUFJPVE9DT0xfTUFTVEVSX0NPTU1VTklDQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tdW5pY2F0aW9uX3VucGFjaygmdGhpcy0+dS5tYXN0ZXJfY29tbXVuaWNhdGlvbi52YWx1ZSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfUFJPVE9DT0xfQlJPQURDT01fU0RLOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX1BST1RPQ09MX01BU1RFUl9QUk9UT0NPTF9URUtfVU5LTk9XTjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9wZHVfY29tbW9uX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3Byb3RvY29sIHByb3RvY29sOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50MTZfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9wcm90b2NvbF91bnBhY2soJnByb3RvY29sLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgc3dpdGNoIChwcm90b2NvbCkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfUFJPVE9DT0xfUElORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfUFJPVE9DT0xfRU5DQVBTVUxBVEVEX0ZSQU1FOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQxNl90IGZyYW1lX2xlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNigmcG9zdExlbkJ1ZiwgJmZyYW1lX2xlbmd0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHNpemVvZih1aW50OF90KSAqIGZyYW1lX2xlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoJnBvc3RMZW5CdWYsIGZyYW1lX2xlbmd0aCAqIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX1BST1RPQ09MX09BTV9DT05URU5UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfb2FtX2NvbnRlbnRfc2NhbigmcG9zdExlbkJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9QUk9UT0NPTF9SRUdJU1RFUkVEX09BTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX29hbV9jb250ZW50X3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfUFJPVE9DT0xfTUFTVEVSX0NPTU1VTklDQVRJT046CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tdW5pY2F0aW9uX3NjYW4oJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfUFJPVE9DT0xfQlJPQURDT01fU0RLOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX1BST1RPQ09MX01BU1RFUl9QUk9UT0NPTF9URUtfVU5LTk9XTjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19zbG93X3Byb3RvY29sX3BhY2soYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19zbG93X3Byb3RvY29sICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fd2VsbF9rbm93bl9vdWlfcGFjayh0aGlzLT5vdWksIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5vdWkpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9URUs6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fbWFzdGVyX3BkdV9jb21tb25fcGFjaygmdGhpcy0+dS50ZWsudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0JSQ006CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0NUQzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfREFTQU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RQT0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0tUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9QTUM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1NJRVBPTl9BOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX3Nsb3dfcHJvdG9jb2xfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19zbG93X3Byb3RvY29sICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMzsKKyAgICBzd2l0Y2ggKHRoaXMtPm91aSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1RFSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX3BkdV9jb21tb25fZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUudGVrLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9CUkNNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9DVEM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RBU0FOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EUE9FOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9LVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfUE1DOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9TSUVQT05fQToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19zbG93X3Byb3RvY29sX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX3Nsb3dfcHJvdG9jb2wgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV93ZWxsX2tub3duX291aV91bnBhY2soJnRoaXMtPm91aSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPm91aSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1RFSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfcGR1X2NvbW1vbl91bnBhY2soJnRoaXMtPnUudGVrLnZhbHVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0JSQ006CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0NUQzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfREFTQU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RQT0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0tUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9QTUM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1NJRVBPTl9BOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfc2xvd19wcm90b2NvbF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fd2VsbF9rbm93bl9vdWkgb3VpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpX3VucGFjaygmb3VpLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAob3VpKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfVEVLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9wZHVfY29tbW9uX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9CUkNNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9DVEM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RBU0FOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EUE9FOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9LVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfUE1DOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9TSUVQT05fQToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbF9wYWNrKGJjbW9sdF9lcG9uX29hbV9zbG93X3Byb3RvY29sICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbF9zdWJ0eXBlX3BhY2sodGhpcy0+c3VidHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnN1YnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9TTE9XX1BST1RPQ09MX1NVQlRZUEVfT0FNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9mbGFnc19wYWNrKHRoaXMtPnUub2FtLmZsYWdzLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudF9wYWNrKCZ0aGlzLT51Lm9hbS5jb250ZW50LCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9TTE9XX1BST1RPQ09MX1NVQlRZUEVfT1JHQU5JWkFUSU9OX1NQRUNJRklDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19zbG93X3Byb3RvY29sX3BhY2soJnRoaXMtPnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9TTE9XX1BST1RPQ09MX1NVQlRZUEVfTEFDUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fU0xPV19QUk9UT0NPTF9TVUJUWVBFX0xBTVA6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9zbG93X3Byb3RvY29sX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9zbG93X3Byb3RvY29sICp0aGlzKQoreworICAgIHVpbnQzMl90IGNvdW50ID0gMTsKKyAgICBzd2l0Y2ggKHRoaXMtPnN1YnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9TTE9XX1BST1RPQ09MX1NVQlRZUEVfT0FNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDIgKyBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT51Lm9hbS5jb250ZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9TTE9XX1BST1RPQ09MX1NVQlRZUEVfT1JHQU5JWkFUSU9OX1NQRUNJRklDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfc2xvd19wcm90b2NvbF9nZXRfcGFja2VkX2xlbmd0aCgmdGhpcy0+dS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1NMT1dfUFJPVE9DT0xfU1VCVFlQRV9MQUNQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9TTE9XX1BST1RPQ09MX1NVQlRZUEVfTEFNUDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Nsb3dfcHJvdG9jb2xfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9zbG93X3Byb3RvY29sICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbF9zdWJ0eXBlX3VucGFjaygmdGhpcy0+c3VidHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPnN1YnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9TTE9XX1BST1RPQ09MX1NVQlRZUEVfT0FNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9mbGFnc191bnBhY2soJnRoaXMtPnUub2FtLmZsYWdzLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudF91bnBhY2soJnRoaXMtPnUub2FtLmNvbnRlbnQsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fU0xPV19QUk9UT0NPTF9TVUJUWVBFX09SR0FOSVpBVElPTl9TUEVDSUZJQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfc2xvd19wcm90b2NvbF91bnBhY2soJnRoaXMtPnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1NMT1dfUFJPVE9DT0xfU1VCVFlQRV9MQUNQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9TTE9XX1BST1RPQ09MX1NVQlRZUEVfTEFNUDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbF9zdWJ0eXBlIHN1YnR5cGU7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbF9zdWJ0eXBlX3VucGFjaygmc3VidHlwZSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHN1YnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9TTE9XX1BST1RPQ09MX1NVQlRZUEVfT0FNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50X3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9TTE9XX1BST1RPQ09MX1NVQlRZUEVfT1JHQU5JWkFUSU9OX1NQRUNJRklDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19zbG93X3Byb3RvY29sX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9TTE9XX1BST1RPQ09MX1NVQlRZUEVfTEFDUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fU0xPV19QUk9UT0NPTF9TVUJUWVBFX0xBTVA6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sX3BhY2soYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcHJvdG9jb2xfdHlwZV9wYWNrKHRoaXMtPmV0aGVydHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmV0aGVydHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfWkVSTzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuemVyby5wYWRkaW5nX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuemVyby5wYWRkaW5nID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInBhZGRpbmdcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2xfemVyb1wiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGUoYnVmLCB0aGlzLT51Lnplcm8ucGFkZGluZywgdGhpcy0+dS56ZXJvLnBhZGRpbmdfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX0NWTEFOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3ZsYW5fdmFsdWVfcGFjaygmdGhpcy0+dS5jdmxhbi52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9TVkxBTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92bGFuX3ZhbHVlX3BhY2soJnRoaXMtPnUuc3ZsYW4udmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfSVRBRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9pdGFnX3ZhbHVlX3BhY2soJnRoaXMtPnUuaXRhZy52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9TTE9XX1BST1RPQ09MOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Nsb3dfcHJvdG9jb2xfcGFjaygmdGhpcy0+dS5zbG93X3Byb3RvY29sLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX0VBUE9MOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3Byb3RvY29sX3BhY2soJnRoaXMtPnUuZWFwb2wudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfQVJQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX0lQVjQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfSVBWNjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9MT09QQkFDSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9NUENQOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5kZWYudW5rbm93bl9jb3VudCA+IDApICYmICh0aGlzLT51LmRlZi51bmtub3duID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVua25vd25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2xfZGVmXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZGVmLnVua25vd24sIHRoaXMtPnUuZGVmLnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbCAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDI7CisgICAgc3dpdGNoICh0aGlzLT5ldGhlcnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX1pFUk86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gdGhpcy0+dS56ZXJvLnBhZGRpbmdfY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9DVkxBTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfU1ZMQU46CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX0lUQUc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX1NMT1dfUFJPVE9DT0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gYmNtb2x0X2Vwb25fb2FtX3Nsb3dfcHJvdG9jb2xfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuc2xvd19wcm90b2NvbC52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9FQVBPTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fZWFwb2xfcHJvdG9jb2xfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnUuZWFwb2wudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfQVJQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX0lQVjQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfSVBWNjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9MT09QQkFDSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9NUENQOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IHRoaXMtPnUuZGVmLnVua25vd25fY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcHJvdG9jb2xfdHlwZV91bnBhY2soJnRoaXMtPmV0aGVydHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmV0aGVydHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfWkVSTzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLT51Lnplcm8ucGFkZGluZ19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbF96ZXJvX2NvdW50X3BhZGRpbmcoYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuemVyby5wYWRkaW5nX2NvdW50ID4gMCkgJiYgKHRoaXMtPnUuemVyby5wYWRkaW5nID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhX21lbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicGFkZGluZ1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbF96ZXJvXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuemVyby5wYWRkaW5nID0gKHVpbnQ4X3QgKikgKmV4dHJhX21lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpleHRyYV9tZW0gPSAoKHVpbnQ4X3QgKikgKmV4dHJhX21lbSkgKyBCQ01PU19ST1VORF9UT19XT1JEKHRoaXMtPnUuemVyby5wYWRkaW5nX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkKGJ1ZiwgdGhpcy0+dS56ZXJvLnBhZGRpbmcsIHRoaXMtPnUuemVyby5wYWRkaW5nX2NvdW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9DVkxBTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV92bGFuX3ZhbHVlX3VucGFjaygmdGhpcy0+dS5jdmxhbi52YWx1ZSwgYnVmLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX1NWTEFOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3ZsYW5fdmFsdWVfdW5wYWNrKCZ0aGlzLT51LnN2bGFuLnZhbHVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfSVRBRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9pdGFnX3ZhbHVlX3VucGFjaygmdGhpcy0+dS5pdGFnLnZhbHVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfU0xPV19QUk9UT0NPTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9zbG93X3Byb3RvY29sX3VucGFjaygmdGhpcy0+dS5zbG93X3Byb3RvY29sLnZhbHVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfRUFQT0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZWFwb2xfcHJvdG9jb2xfdW5wYWNrKCZ0aGlzLT51LmVhcG9sLnZhbHVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfQVJQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX0lQVjQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfSVBWNjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9MT09QQkFDSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9NUENQOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMtPnUuZGVmLnVua25vd25fY291bnQgPSBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2xfZGVmX2NvdW50X3Vua25vd24oYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZGVmLnVua25vd25fY291bnQgPiAwKSAmJiAodGhpcy0+dS5kZWYudW5rbm93biA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInVua25vd25cIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2xfZGVmXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZGVmLnVua25vd24gPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5kZWYudW5rbm93bl9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZChidWYsIHRoaXMtPnUuZGVmLnVua25vd24sIHRoaXMtPnUuZGVmLnVua25vd25fY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2xfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Byb3RvY29sX3R5cGUgZXRoZXJ0eXBlOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Byb3RvY29sX3R5cGVfdW5wYWNrKCZldGhlcnR5cGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChldGhlcnR5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX1pFUk86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcGFkZGluZ19lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcGFkZGluZ19lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHBhZGRpbmdfZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9DVkxBTjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX1NWTEFOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfSVRBRzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX1NMT1dfUFJPVE9DT0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbF9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9FQVBPTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9lYXBvbF9wcm90b2NvbF9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9BUlA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfSVBWNDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9JUFY2OgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX0xPT1BCQUNLOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX01QQ1A6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdW5rbm93bl9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdW5rbm93bl9lbGVtX2NvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHVua25vd25fZWxlbV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbF9kZWZfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2xfemVyb19jb3VudF9wYWRkaW5nKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lX3BhY2soYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX21hY19hZGRyZXNzKGJ1ZiwgdGhpcy0+ZGEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPnNhKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHRoaXMtPnByb3RvY29sc19jb3VudCA+IDApICYmICh0aGlzLT5wcm90b2NvbHMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBiY21vc190cmFjZShCQ01PU19UUkFDRV9MRVZFTF9FUlJPUiwgIkVycm9yOiBsaXN0IGZpZWxkIFwicHJvdG9jb2xzXCIgb2Ygc3RydWN0IFwiYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnByb3RvY29sc19jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sX3BhY2soJnRoaXMtPnByb3RvY29sc1tpMF0sIGJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDEyOworICAgIHVpbnQzMl90IGkwOworICAgIGlmICgodGhpcy0+cHJvdG9jb2xzX2NvdW50ID4gMCkgJiYgKHRoaXMtPnByb3RvY29scyA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwcm90b2NvbHNfY291bnRcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBmb3IgKGkwID0gMDsgaTAgPCB0aGlzLT5wcm90b2NvbHNfY291bnQ7IGkwKyspCisgICAgeworICAgICAgICBjb3VudCArPSBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2xfZ2V0X3BhY2tlZF9sZW5ndGgoJnRoaXMtPnByb3RvY29sc1tpMF0pOworICAgIH0KKworICAgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICB1aW50MzJfdCBpMDsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9tYWNfYWRkcmVzcyhidWYsICZ0aGlzLT5kYSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+c2EpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHRoaXMtPnByb3RvY29sc19jb3VudCA9IGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZV9jb3VudF9wcm90b2NvbHMoYnVmKTsKKyAgICBpZiAoKHRoaXMtPnByb3RvY29sc19jb3VudCA+IDApICYmICh0aGlzLT5wcm90b2NvbHMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJwcm90b2NvbHNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWVcIiBpcyB1bmluaXRpYWxpemVkIChOVUxMKS4gIFlvdSBtdXN0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyBwb2ludGVyIGJlZm9yZSBzZW5kaW5nL3JlY2VpdmluZyB0aGUgbWVzc2FnZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy0+cHJvdG9jb2xzID0gKGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+cHJvdG9jb2xzX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbCkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+cHJvdG9jb2xzX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2xfdW5wYWNrKCZ0aGlzLT5wcm90b2NvbHNbaTBdLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgdWludDMyX3QgcHJvdG9jb2xzX2VsZW1fY291bnQgPSAwOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgNikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA2KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RvY29sc19lbGVtX2NvdW50ICs9IDE7CisgICAgfQorCisgICAgKmV4dHJhX21lbSArPSBCQ01PU19ST1VORF9UT19XT1JEKHByb3RvY29sc19lbGVtX2NvdW50ICogc2l6ZW9mKGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbCkpOworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lX2NvdW50X3Byb3RvY29scyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIHVpbnQzMl90IGR1bW15ID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIGJ1ZkNsb25lID0gKmJ1ZjsKKyAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sX3NjYW4oJmJ1ZkNsb25lLCAmZHVtbXkpKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPmRhKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCB0aGlzLT5zYSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcHJvdG9jb2xfdHlwZV9wYWNrKHRoaXMtPnByb3RvY29sX3R5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbF9zdWJ0eXBlX3BhY2sodGhpcy0+c3VidHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZmxhZ3NfcGFjayh0aGlzLT5mbGFncywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnRfcGFjaygmdGhpcy0+Y29udGVudCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfYmFzZSAqdGhpcykKK3sKKyAgICByZXR1cm4gMTcgKyBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50X2dldF9wYWNrZWRfbGVuZ3RoKCZ0aGlzLT5jb250ZW50KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX21hY19hZGRyZXNzKGJ1ZiwgJnRoaXMtPmRhKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9tYWNfYWRkcmVzcyhidWYsICZ0aGlzLT5zYSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fcHJvdG9jb2xfdHlwZV91bnBhY2soJnRoaXMtPnByb3RvY29sX3R5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbF9zdWJ0eXBlX3VucGFjaygmdGhpcy0+c3VidHlwZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fZmxhZ3NfdW5wYWNrKCZ0aGlzLT5mbGFncywgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnRfdW5wYWNrKCZ0aGlzLT5jb250ZW50LCBidWYsIGV4dHJhX21lbSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA2KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudF9zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnRfZ3Bpb19wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fdGVrX2V2ZW50X2dwaW8gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTMyKGJ1ZiwgdGhpcy0+cmVzZXJ2ZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MzIoYnVmLCB0aGlzLT5ncGlvX3N0YXRlMWcpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91NjQoYnVmLCB0aGlzLT5ncGlvX3N0YXRlMTBnKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnRfZ3Bpb191bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnRfZ3BpbyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UzMihidWYsICZ0aGlzLT5yZXNlcnZlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTMyKGJ1ZiwgJnRoaXMtPmdwaW9fc3RhdGUxZykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTY0KGJ1ZiwgJnRoaXMtPmdwaW9fc3RhdGUxMGcpKQorICAgIHsKKyAgICAgICAgLypPcHRpb25hbCB1bnBhY2sgZmFpbHMgZG8gbm90IGNhdXNlIGVycm9ycyAqLworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudF9ncGlvX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMTYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudF9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fdGVrX2V2ZW50ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2FsYXJtX2NvZGVfcGFjayh0aGlzLT5hbGFybV9jb2RlLCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9ib29sKGJ1ZiwgdGhpcy0+cmFpc2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfd3JpdGVfdTE2KGJ1ZiwgdGhpcy0+cG9ydCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIHRoaXMtPmxpbmspKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCB0aGlzLT5xdWV1ZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2FsYXJtX2NvbnRleHRfcGFjayh0aGlzLT5hbGFybV9jb250ZXh0LCBidWYpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAodGhpcy0+YWxhcm1fY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1NUQVRfQUxBUk06CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYXR0cmlidXRlX3BhY2sodGhpcy0+dS5zdGF0X2FsYXJtLnN0YXRfaWQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0dQSU9fTElOS19GQVVMVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fdGVrX2V2ZW50X2dwaW9fcGFjaygmdGhpcy0+dS5ncGlvX2xpbmtfZmF1bHQudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0dQSU9fRFlJTkdfR0FTUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fdGVrX2V2ZW50X2dwaW9fcGFjaygmdGhpcy0+dS5ncGlvX2R5aW5nX2dhc3AudmFsdWUsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0dQSU9fQ1JJVElDQUxfRVZFTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudF9ncGlvX3BhY2soJnRoaXMtPnUuZ3Bpb19jcml0aWNhbF9ldmVudC52YWx1ZSwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfR1BJT19PVEhFUjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fdGVrX2V2ZW50X2dwaW9fcGFjaygmdGhpcy0+dS5ncGlvX290aGVyLnZhbHVlLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9BVVRIX1VOQVZBSUw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0FVVE9fTkVHX0ZBSUxVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0JPT1RfSU5WQUxJRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfQ1JJVElDQUxfRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0NUQ19BTEFSTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfQ1RDX0RJU0NPVkVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9ESUFHX0xPQUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0RZSU5HX0dBU1A6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0ZBTl9GQVVMVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfRkxBU0hfQlVTWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfRkxPV19DT05UUk9MX1RJTUVPVVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0dBVEVfVElNRU9VVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfSVBOX0xPUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfS0VZX0VYQ0hBTkdFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MQVNFUl9BTFdBWVNfT046CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0xFQVJOX1RBQkxFX09WRVJGTE9XOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MSU5LX0ZBVUxUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MSU5LX09BTV9ESVNDX0NPTVBMRVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MSU5LX1JFR19GQUlMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MSU5LX1JFR19TVEFSVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfTElOS19SRUdfU1VDQ0VTUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfTE9PUEJBQ0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0xPU1NfT0ZfU0lHTkFMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9PQU1fVElNRU9VVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfT05VX1BPTl9ESVNBQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9PTlVfUkVBRFk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPUlRfRElTQUJMRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fUlhfUE9XRVJfSElHSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1JYX1BPV0VSX0xPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1RFTVBfSElHSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1RFTVBfTE9XOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fVFhfQklBU19ISUdIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fVFhfQklBU19MT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9UWF9QT1dFUl9ISUdIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fVFhfUE9XRVJfTE9XOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fVkNDX0hJR0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9WQ0NfTE9XOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QUk9UX1NXSVRDSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUVVFVUVfT1ZFUkZMT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1JFRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUkVQT1JUX0ZBSUw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1NUQU5EQllfTE9TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9TWVNURU06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1RFTVBFUkFUVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9UUkFOU01JVF9ERUdSQURFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9UWF9GQUlMOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudCAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDk7CisgICAgc3dpdGNoICh0aGlzLT5hbGFybV9jb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfU1RBVF9BTEFSTToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0dQSU9fTElOS19GQVVMVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9HUElPX0RZSU5HX0dBU1A6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQgKz0gMTY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfR1BJT19DUklUSUNBTF9FVkVOVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9HUElPX09USEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDE2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0FVVEhfVU5BVkFJTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfQVVUT19ORUdfRkFJTFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfQk9PVF9JTlZBTElEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9DUklUSUNBTF9FVkVOVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfQ1RDX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9DVENfRElTQ09WRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0RJQUdfTE9BRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfRFlJTkdfR0FTUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfRkFOX0ZBVUxUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9GTEFTSF9CVVNZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9GTE9XX0NPTlRST0xfVElNRU9VVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfR0FURV9USU1FT1VUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9JUE5fTE9TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9LRVlfRVhDSEFOR0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0xBU0VSX0FMV0FZU19PTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfTEVBUk5fVEFCTEVfT1ZFUkZMT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0xJTktfRkFVTFQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0xJTktfT0FNX0RJU0NfQ09NUExFVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0xJTktfUkVHX0ZBSUw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0xJTktfUkVHX1NUQVJUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MSU5LX1JFR19TVUNDRVNTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MT09QQkFDSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfTE9TU19PRl9TSUdOQUw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX09BTV9USU1FT1VUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9PTlVfUE9OX0RJU0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX09OVV9SRUFEWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9SVF9ESVNBQkxFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9SWF9QT1dFUl9ISUdIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fUlhfUE9XRVJfTE9XOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fVEVNUF9ISUdIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fVEVNUF9MT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9UWF9CSUFTX0hJR0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9UWF9CSUFTX0xPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1RYX1BPV0VSX0hJR0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9UWF9QT1dFUl9MT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9WQ0NfSElHSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1ZDQ19MT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BST1RfU1dJVENIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9RVUVVRV9PVkVSRkxPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUkVHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9SRVBPUlRfRkFJTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfU1RBTkRCWV9MT1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1NZU1RFTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfVEVNUEVSQVRVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1RSQU5TTUlUX0RFR1JBREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1RYX0ZBSUw6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fdGVrX2V2ZW50X3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19hbGFybV9jb2RlX3VucGFjaygmdGhpcy0+YWxhcm1fY29kZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF9ib29sKGJ1ZiwgJnRoaXMtPnJhaXNlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJnRoaXMtPnBvcnQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihidWYsICZ0aGlzLT5saW5rKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZF91MTYoYnVmLCAmdGhpcy0+cXVldWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19hbGFybV9jb250ZXh0X3VucGFjaygmdGhpcy0+YWxhcm1fY29udGV4dCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmFsYXJtX2NvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9TVEFUX0FMQVJNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2F0dHJpYnV0ZV91bnBhY2soJnRoaXMtPnUuc3RhdF9hbGFybS5zdGF0X2lkLCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9HUElPX0xJTktfRkFVTFQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudF9ncGlvX3VucGFjaygmdGhpcy0+dS5ncGlvX2xpbmtfZmF1bHQudmFsdWUsIGJ1ZiwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfR1BJT19EWUlOR19HQVNQOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnRfZ3Bpb191bnBhY2soJnRoaXMtPnUuZ3Bpb19keWluZ19nYXNwLnZhbHVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0dQSU9fQ1JJVElDQUxfRVZFTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudF9ncGlvX3VucGFjaygmdGhpcy0+dS5ncGlvX2NyaXRpY2FsX2V2ZW50LnZhbHVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0dQSU9fT1RIRVI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudF9ncGlvX3VucGFjaygmdGhpcy0+dS5ncGlvX290aGVyLnZhbHVlLCBidWYsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0FVVEhfVU5BVkFJTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfQVVUT19ORUdfRkFJTFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfQk9PVF9JTlZBTElEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9DUklUSUNBTF9FVkVOVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfQ1RDX0FMQVJNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9DVENfRElTQ09WRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0RJQUdfTE9BRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfRFlJTkdfR0FTUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfRkFOX0ZBVUxUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9GTEFTSF9CVVNZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9GTE9XX0NPTlRST0xfVElNRU9VVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfR0FURV9USU1FT1VUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9JUE5fTE9TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9LRVlfRVhDSEFOR0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0xBU0VSX0FMV0FZU19PTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfTEVBUk5fVEFCTEVfT1ZFUkZMT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0xJTktfRkFVTFQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0xJTktfT0FNX0RJU0NfQ09NUExFVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0xJTktfUkVHX0ZBSUw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0xJTktfUkVHX1NUQVJUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MSU5LX1JFR19TVUNDRVNTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MT09QQkFDSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfTE9TU19PRl9TSUdOQUw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX09BTV9USU1FT1VUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9PTlVfUE9OX0RJU0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX09OVV9SRUFEWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9SVF9ESVNBQkxFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9SWF9QT1dFUl9ISUdIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fUlhfUE9XRVJfTE9XOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fVEVNUF9ISUdIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fVEVNUF9MT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9UWF9CSUFTX0hJR0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9UWF9CSUFTX0xPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1RYX1BPV0VSX0hJR0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9UWF9QT1dFUl9MT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9WQ0NfSElHSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1ZDQ19MT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BST1RfU1dJVENIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9RVUVVRV9PVkVSRkxPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUkVHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9SRVBPUlRfRkFJTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfU1RBTkRCWV9MT1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1NZU1RFTToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfVEVNUEVSQVRVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1RSQU5TTUlUX0RFR1JBREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1RYX0ZBSUw6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19hbGFybV9jb2RlIGFsYXJtX2NvZGU7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2FsYXJtX2NvZGVfdW5wYWNrKCZhbGFybV9jb2RlLCBwYWNrZWQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCAxKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGFsYXJtX2NvZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9TVEFUX0FMQVJNOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0dQSU9fTElOS19GQVVMVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fdGVrX2V2ZW50X2dwaW9fc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0dQSU9fRFlJTkdfR0FTUDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9vYW1fdGVrX2V2ZW50X2dwaW9fc2NhbihwYWNrZWQsIGV4dHJhX21lbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0dQSU9fQ1JJVElDQUxfRVZFTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudF9ncGlvX3NjYW4ocGFja2VkLCBleHRyYV9tZW0pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9HUElPX09USEVSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnRfZ3Bpb19zY2FuKHBhY2tlZCwgZXh0cmFfbWVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfQVVUSF9VTkFWQUlMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9BVVRPX05FR19GQUlMVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9CT09UX0lOVkFMSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0NSSVRJQ0FMX0VWRU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9DVENfQUxBUk06CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0NUQ19ESVNDT1ZFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfRElBR19MT0FEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9EWUlOR19HQVNQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9GQU5fRkFVTFQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0ZMQVNIX0JVU1k6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0ZMT1dfQ09OVFJPTF9USU1FT1VUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9HQVRFX1RJTUVPVVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0lQTl9MT1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0tFWV9FWENIQU5HRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfTEFTRVJfQUxXQVlTX09OOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MRUFSTl9UQUJMRV9PVkVSRkxPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfTElOS19GQVVMVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfTElOS19PQU1fRElTQ19DT01QTEVURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfTElOS19SRUdfRkFJTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfTElOS19SRUdfU1RBUlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0xJTktfUkVHX1NVQ0NFU1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0xPT1BCQUNLOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MT1NTX09GX1NJR05BTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfT0FNX1RJTUVPVVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX09OVV9QT05fRElTQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfT05VX1JFQURZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1JUX0RJU0FCTEVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1JYX1BPV0VSX0hJR0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9SWF9QT1dFUl9MT1c6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9URU1QX0hJR0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9URU1QX0xPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1RYX0JJQVNfSElHSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1RYX0JJQVNfTE9XOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fVFhfUE9XRVJfSElHSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1RYX1BPV0VSX0xPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1ZDQ19ISUdIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fVkNDX0xPVzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUFJPVF9TV0lUQ0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1FVRVVFX09WRVJGTE9XOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9SRUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1JFUE9SVF9GQUlMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9TVEFOREJZX0xPUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfU1lTVEVNOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9URU1QRVJBVFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfVFJBTlNNSVRfREVHUkFERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfVFhfRkFJTDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc3RkX21hY19hZGRyZXNzX3BhY2soYmNtb2x0X2Vwb25fb2FtX3N0ZF9tYWNfYWRkcmVzcyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIHRoaXMtPmFkZHJlc3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc3RkX21hY19hZGRyZXNzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fc3RkX21hY19hZGRyZXNzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmdGhpcy0+YWRkcmVzcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zdGRfbWFjX2FkZHJlc3Nfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgKHZvaWQpZXh0cmFfbWVtOworICAgIHJldHVybiBiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCA2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY19hdHRyX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjX2F0dHJfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2F0dHJpYnV0ZV9wYWNrKHRoaXMtPmF0dHJpYnV0ZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmF0dHJpYnV0ZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX1NUQVRfVEhSRVNIT0xEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2F0dHJpYnV0ZV9wYWNrKHRoaXMtPnUucG9ydF9zdGF0X3RocmVzaG9sZC5zdGF0LCBidWYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTElOS19TVEFUX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hdHRyaWJ1dGVfcGFjayh0aGlzLT51Lmxpbmtfc3RhdF90aHJlc2hvbGQuc3RhdCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0FMQVJNX1RIUkVTSE9MRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0FSUF9SRVBMSUNBVEVfREVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0JDQVNUX1JBVEVfTElNSVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9CWVBBU1NfU09GVF9MRUFSTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0NISVBfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DSElQX1ZFUlNJT046CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DT05UUk9MX1BPUlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DT1NfVFJBTlNMQVRJT046CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DUk9TU0JBUl9DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DVExfVkxBTl9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ROX0ZJTFRFUl9UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ET1dOX0JVUlNUX1RPTEw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9EWU5fTEVBUk5fQUdFX0xJTUlUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRFlOX0xFQVJOX1RCTF9TSVpFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRFlOX0xFQVJOSU5HX01PREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9EWU5fTUFDX1RCTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VHUkVTU19TSEFQSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRU5DUllQVF9LRVlfRVhQSVJZX1RJTUU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FTkNSWVBUSU9OX0tFWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VOQ1JZUFRJT05fTU9ERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfRE9XTl9CSVRfTE9BRElORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfU0RNX0FNUExJVFVERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfU0RNX1BIQVNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19TRE1fUVVBTlRJWkVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQwOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQxOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQyOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQzOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQ0OgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VUF9CSVRfTE9BRElORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VYVF9GSVJNV0FSRV9WRVJTSU9OOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVhURU5ERURfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GQUlMU0FGRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZFQVRVUkVfU0VUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRkVDX01PREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GSUxFX0lORk86CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GSVJNV0FSRV9USU1FU1RBTVA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GSVJNV0FSRV9WRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GTE9PRF9VTktOT1dOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfSUdNUF9GUkFNRV9SQVRFX0xJTUlUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfSU5HUkVTU19QT0xJQ0lORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0lOVEVSTkFMX1ZFUlNJT046CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9JUE1DX1VOS05PV05fTEVBVkVfRldEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfSkVERUNfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MQUNQX0RFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MRUFSTl9NT0RFX1JVTEVfVVBEQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTEVBUk5fVEFCTEVfTU9ERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xFTl9FUlJPUl9ESVNDQVJEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTElOS19TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xJTktfU1RBVFNfVEhSRVNIT0xEX0lOVEVSVkFMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTE9DQUxfU1dJVENISU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTFVFX0ZJRUxEX1NFTEVDVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xVRV9GSUVMRF9TRUxFQ1RfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01DQVNUX0RPTUFJTl9DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NQ0FTVF9HTE9CQUxfQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTUNBU1RfR1JPVVBfSU5GTzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01ESV9DUk9TU09WRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NSU5fTUFDX0xJTUlUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTVBDUF9DTE9DSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01QQ1BfQ0xPQ0tfQ09NUEVOU0FURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01UVToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX05FVFdPUktfUE9OX01BUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX05FV19ETl9GSUxURVJfVEJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTkVXX1VQX0ZJTFRFUl9UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9OVlNfU0NSQVRDSFBBRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX05WU19TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX09OVV9BR0dSRUdBVEVfTElNSVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9PTlVfSE9MRE9WRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9PTlVfSUdNUF9WTEFOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfT05VX1JVTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT0xJQ0VSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9DQVBBQklMSVRZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9EWU5BTUlDX0VOVFJJRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX1NUQVRTX1RIUkVTSE9MRF9JTlRFUlZBTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfVkxBTl9NRU1CRVJTSElQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9WTEFOX1BPTElDWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9SWF9QT1dFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9URU1QRVJBVFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9UWF9CSUFTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1RYX1BPV0VSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1ZDQzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BSSV9FTlFVRVVJTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QU1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUVVFVUVfQ09ORklHX1YyOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUVVFVUVQUklNQVA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SRVBPUlRfVEhSRVNIT0xEUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0JZVEVTX0RFTEFZRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9CWVRFU19EUk9QUEVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfREVMQVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9ERUxBWV9USFJFU0hPTEQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRV9UT09fU0hPUlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTEwMjRUTzE1MTg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTEyOFRPMjU1OgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxNTE5UExVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMjU2VE81MTE6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTUxMlRPMTAyMzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FNjQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTY1VE8xMjc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRVNfRFJPUFBFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU0VBUkNIX0NPTkZJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NFUVVFTkNFX05VTUJFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NMRV9NT0RFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1RBVElDX01BQ19UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfQURfU0VMRUNUX0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfQURfVEVDSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19BRE1JTl9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19BVVRPX0NGRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19MT0NBTF9TRUxFQ1RfQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19MT0NBTF9URUNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX1JFTU9URV9TSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfUlhfU0VMRUNUX0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfUlhfVEVDSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfQUJJTElUWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfQ09SUkVDVEVEX0JMT0NLUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfTU9ERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfVU5DT1JSRUNUQUJMRV9CTE9DS1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0FERFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0FMSUdOX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQkNBU1RfRlJBTUVTX1JYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19CQ0FTVF9GUkFNRVNfVFhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NBUEFCSUxJVElFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ0FSUklFUl9TRU5TRV9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NPTExJU0lPTl9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfRlJBTUVTX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX0ZSQU1FU19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9GVU5DU19TVVBQT1JURUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfUEFVU0VfREVMQVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfUEFVU0VfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfUEFVU0VfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfVU5TVVBQT1JURURfT1BfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0RVUExFWF9TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0VOQUJMRV9TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0VYQ0VTU0lWRV9DT0xMSVNJT05TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GQ1NfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUl9FWENFU1NJVkVfREVGRVJSQUw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FX1RPT19MT05HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRVNfREVGRVJSRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FU19MT1NUX01BQ19SWF9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FU19MT1NUX01BQ19UWF9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVTX1RYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfSU5fUkFOR0VfTEVOX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTEFURV9DT0xMSVNJT05TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19NQ0FTVF9BRERSX0xJU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX01DQVNUX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTUNBU1RfRlJBTUVTX1RYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19NQ0FTVF9SWF9TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX01VTFRJUExFX0NPTExfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19PQ1RFVFNfUlhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX09DVEVUU19UWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfT1VUX09GX1JBTkdFX0xFTl9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX1BST01JU0NVT1VTX1NUQVRVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfU0lOR0xFX0NPTExfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19UWF9FTkFCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFVX01FRElBX0FWQUlMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfRElTQ09WRVJZX1RJTUVPVVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9ESVNDT1ZFUllfV0lORE9XX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfTUFDX0NUUkxfRlJBTUVTX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfTUFDX0NUUkxfRlJBTUVTX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfUlhfR0FURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX1JFR19BQ0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9SRUdfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX1JFR0lTVEVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfUlhfUkVQT1JUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfVFhfR0FURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX1JFR19BQ0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9SRUdfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX1JFR0lTVEVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfVFhfUkVQT1JUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX09BTV9FTVVMX0NSQzhFUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfT0FNX0xPQ0FMX0VSUl9GUkFNRV9TRUNTX0VWRU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX1BIWV9BRE1JTl9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9QSFlfU1lNQk9MX0VSUl9EVVJJTkdfQ0FSUklFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9QSFlfVFlQRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9QSFlfVFlQRV9MSVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1lTVEVNX1JVTEVfT1BUSU9OUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RSQU5TQ0VJVkVSX0JVUlNUX0FDVElWSVRZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFJBTlNDRUlWRVJfU0lHTkFMX0RFVEVDVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX0RFTEFZRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19EUk9QUEVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfQllURVNfVU5VU0VEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfREVMQVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9ERUxBWV9USFJFU0hPTEQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTEwMjRUTzE1MTg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTEyOFRPMjU1OgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUUxNTE5UExVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMjU2VE81MTE6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTUxMlRPMTAyMzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FNjQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTY1VE8xMjc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRVNfRFJPUFBFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVU5JX1NIQVBFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1VQX0ZJTFRFUl9UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9WTEFOX0RFU1RJTkFUSU9OUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1ZMQU5fRVRIRVJUWVBFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjX2F0dHJfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjX2F0dHJfYmFzZSAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDI7CisgICAgc3dpdGNoICh0aGlzLT5hdHRyaWJ1dGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9TVEFUX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MSU5LX1NUQVRfVEhSRVNIT0xEOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0FMQVJNX1RIUkVTSE9MRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0FSUF9SRVBMSUNBVEVfREVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0JDQVNUX1JBVEVfTElNSVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9CWVBBU1NfU09GVF9MRUFSTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0NISVBfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DSElQX1ZFUlNJT046CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DT05UUk9MX1BPUlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DT1NfVFJBTlNMQVRJT046CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DUk9TU0JBUl9DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DVExfVkxBTl9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ROX0ZJTFRFUl9UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ET1dOX0JVUlNUX1RPTEw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9EWU5fTEVBUk5fQUdFX0xJTUlUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRFlOX0xFQVJOX1RCTF9TSVpFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRFlOX0xFQVJOSU5HX01PREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9EWU5fTUFDX1RCTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VHUkVTU19TSEFQSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRU5DUllQVF9LRVlfRVhQSVJZX1RJTUU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FTkNSWVBUSU9OX0tFWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VOQ1JZUFRJT05fTU9ERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfRE9XTl9CSVRfTE9BRElORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfU0RNX0FNUExJVFVERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfU0RNX1BIQVNFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19TRE1fUVVBTlRJWkVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQwOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQxOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQyOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQzOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VTlVTRUQ0OgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19VUF9CSVRfTE9BRElORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VYVF9GSVJNV0FSRV9WRVJTSU9OOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVhURU5ERURfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GQUlMU0FGRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZFQVRVUkVfU0VUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRkVDX01PREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GSUxFX0lORk86CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GSVJNV0FSRV9USU1FU1RBTVA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GSVJNV0FSRV9WRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GTE9PRF9VTktOT1dOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfSUdNUF9GUkFNRV9SQVRFX0xJTUlUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfSU5HUkVTU19QT0xJQ0lORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0lOVEVSTkFMX1ZFUlNJT046CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9JUE1DX1VOS05PV05fTEVBVkVfRldEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfSkVERUNfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MQUNQX0RFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MRUFSTl9NT0RFX1JVTEVfVVBEQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTEVBUk5fVEFCTEVfTU9ERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xFTl9FUlJPUl9ESVNDQVJEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTElOS19TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xJTktfU1RBVFNfVEhSRVNIT0xEX0lOVEVSVkFMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTE9DQUxfU1dJVENISU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTFVFX0ZJRUxEX1NFTEVDVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xVRV9GSUVMRF9TRUxFQ1RfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01DQVNUX0RPTUFJTl9DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NQ0FTVF9HTE9CQUxfQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTUNBU1RfR1JPVVBfSU5GTzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01ESV9DUk9TU09WRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NSU5fTUFDX0xJTUlUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTVBDUF9DTE9DSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01QQ1BfQ0xPQ0tfQ09NUEVOU0FURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01UVToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX05FVFdPUktfUE9OX01BUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX05FV19ETl9GSUxURVJfVEJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTkVXX1VQX0ZJTFRFUl9UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9OVlNfU0NSQVRDSFBBRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX05WU19TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX09OVV9BR0dSRUdBVEVfTElNSVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9PTlVfSE9MRE9WRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9PTlVfSUdNUF9WTEFOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfT05VX1JVTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT0xJQ0VSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9DQVBBQklMSVRZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9EWU5BTUlDX0VOVFJJRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX1NUQVRTX1RIUkVTSE9MRF9JTlRFUlZBTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfVkxBTl9NRU1CRVJTSElQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9WTEFOX1BPTElDWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9SWF9QT1dFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9URU1QRVJBVFVSRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9UWF9CSUFTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1RYX1BPV0VSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1ZDQzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BSSV9FTlFVRVVJTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QU1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUVVFVUVfQ09ORklHX1YyOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUVVFVUVQUklNQVA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SRVBPUlRfVEhSRVNIT0xEUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0JZVEVTX0RFTEFZRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9CWVRFU19EUk9QUEVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfREVMQVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9ERUxBWV9USFJFU0hPTEQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRV9UT09fU0hPUlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTEwMjRUTzE1MTg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTEyOFRPMjU1OgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxNTE5UExVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMjU2VE81MTE6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTUxMlRPMTAyMzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FNjQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTY1VE8xMjc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRVNfRFJPUFBFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU0VBUkNIX0NPTkZJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NFUVVFTkNFX05VTUJFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NMRV9NT0RFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1RBVElDX01BQ19UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfQURfU0VMRUNUX0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfQURfVEVDSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19BRE1JTl9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19BVVRPX0NGRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19MT0NBTF9TRUxFQ1RfQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19MT0NBTF9URUNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX1JFTU9URV9TSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfUlhfU0VMRUNUX0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfUlhfVEVDSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfQUJJTElUWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfQ09SUkVDVEVEX0JMT0NLUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfTU9ERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfVU5DT1JSRUNUQUJMRV9CTE9DS1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0FERFI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0FMSUdOX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQkNBU1RfRlJBTUVTX1JYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19CQ0FTVF9GUkFNRVNfVFhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NBUEFCSUxJVElFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ0FSUklFUl9TRU5TRV9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NPTExJU0lPTl9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfRlJBTUVTX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX0ZSQU1FU19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9GVU5DU19TVVBQT1JURUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfUEFVU0VfREVMQVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfUEFVU0VfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfUEFVU0VfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfVU5TVVBQT1JURURfT1BfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0RVUExFWF9TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0VOQUJMRV9TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0VYQ0VTU0lWRV9DT0xMSVNJT05TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GQ1NfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUl9FWENFU1NJVkVfREVGRVJSQUw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FX1RPT19MT05HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRVNfREVGRVJSRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FU19MT1NUX01BQ19SWF9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FU19MT1NUX01BQ19UWF9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVTX1RYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfSU5fUkFOR0VfTEVOX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTEFURV9DT0xMSVNJT05TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19NQ0FTVF9BRERSX0xJU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX01DQVNUX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTUNBU1RfRlJBTUVTX1RYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19NQ0FTVF9SWF9TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX01VTFRJUExFX0NPTExfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19PQ1RFVFNfUlhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX09DVEVUU19UWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfT1VUX09GX1JBTkdFX0xFTl9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX1BST01JU0NVT1VTX1NUQVRVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfU0lOR0xFX0NPTExfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19UWF9FTkFCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFVX01FRElBX0FWQUlMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfRElTQ09WRVJZX1RJTUVPVVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9ESVNDT1ZFUllfV0lORE9XX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfTUFDX0NUUkxfRlJBTUVTX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfTUFDX0NUUkxfRlJBTUVTX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfUlhfR0FURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX1JFR19BQ0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9SRUdfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX1JFR0lTVEVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfUlhfUkVQT1JUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfVFhfR0FURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX1JFR19BQ0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9SRUdfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX1JFR0lTVEVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfVFhfUkVQT1JUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX09BTV9FTVVMX0NSQzhFUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfT0FNX0xPQ0FMX0VSUl9GUkFNRV9TRUNTX0VWRU5UOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX1BIWV9BRE1JTl9TVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9QSFlfU1lNQk9MX0VSUl9EVVJJTkdfQ0FSUklFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9QSFlfVFlQRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9QSFlfVFlQRV9MSVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1lTVEVNX1JVTEVfT1BUSU9OUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RSQU5TQ0VJVkVSX0JVUlNUX0FDVElWSVRZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFJBTlNDRUlWRVJfU0lHTkFMX0RFVEVDVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX0RFTEFZRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19EUk9QUEVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfQllURVNfVU5VU0VEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfREVMQVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9ERUxBWV9USFJFU0hPTEQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTEwMjRUTzE1MTg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTEyOFRPMjU1OgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUUxNTE5UExVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMjU2VE81MTE6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTUxMlRPMTAyMzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FNjQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTY1VE8xMjc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRVNfRFJPUFBFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX1VOSUNBU1RfRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVU5JX1NIQVBFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1VQX0ZJTFRFUl9UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9WTEFOX0RFU1RJTkFUSU9OUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1ZMQU5fRVRIRVJUWVBFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjX2F0dHJfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY19hdHRyX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSkKK3sKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hdHRyaWJ1dGVfdW5wYWNrKCZ0aGlzLT5hdHRyaWJ1dGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoICh0aGlzLT5hdHRyaWJ1dGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9TVEFUX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hdHRyaWJ1dGVfdW5wYWNrKCZ0aGlzLT51LnBvcnRfc3RhdF90aHJlc2hvbGQuc3RhdCwgYnVmKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xJTktfU1RBVF9USFJFU0hPTEQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYXR0cmlidXRlX3VucGFjaygmdGhpcy0+dS5saW5rX3N0YXRfdGhyZXNob2xkLnN0YXQsIGJ1ZikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9BTEFSTV9USFJFU0hPTEQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9BUlBfUkVQTElDQVRFX0RFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9CQ0FTVF9SQVRFX0xJTUlUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQllQQVNTX1NPRlRfTEVBUk46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DSElQX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ0hJUF9WRVJTSU9OOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ09OVFJPTF9QT1JUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ09TX1RSQU5TTEFUSU9OOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ1JPU1NCQVJfQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ1RMX1ZMQU5fSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ETl9GSUxURVJfVEJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRE9XTl9CVVJTVF9UT0xMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRFlOX0xFQVJOX0FHRV9MSU1JVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0RZTl9MRUFSTl9UQkxfU0laRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0RZTl9MRUFSTklOR19NT0RFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRFlOX01BQ19UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FR1JFU1NfU0hBUElORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VOQ1JZUFRfS0VZX0VYUElSWV9USU1FOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRU5DUllQVElPTl9LRVk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FTkNSWVBUSU9OX01PREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX0RPV05fQklUX0xPQURJTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1NETV9BTVBMSVRVREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1NETV9QSEFTRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfU0RNX1FVQU5USVpFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVU5VU0VEMDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVU5VU0VEMToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVU5VU0VEMjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVU5VU0VEMzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVU5VU0VENDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfVVBfQklUX0xPQURJTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FWFRfRklSTVdBUkVfVkVSU0lPTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VYVEVOREVEX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRkFJTFNBRkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GRUFUVVJFX1NFVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZFQ19NT0RFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRklMRV9JTkZPOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRklSTVdBUkVfVElNRVNUQU1QOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRklSTVdBUkVfVkVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRkxPT0RfVU5LTk9XTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0lHTVBfRlJBTUVfUkFURV9MSU1JVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0lOR1JFU1NfUE9MSUNJTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9JTlRFUk5BTF9WRVJTSU9OOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfSVBNQ19VTktOT1dOX0xFQVZFX0ZXRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0pFREVDX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTEFDUF9ERVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTEVBUk5fTU9ERV9SVUxFX1VQREFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xFQVJOX1RBQkxFX01PREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MRU5fRVJST1JfRElTQ0FSRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xJTktfU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MSU5LX1NUQVRTX1RIUkVTSE9MRF9JTlRFUlZBTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xPQ0FMX1NXSVRDSElORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xVRV9GSUVMRF9TRUxFQ1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MVUVfRklFTERfU0VMRUNUX0xJU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NQ0FTVF9ET01BSU5fQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTUNBU1RfR0xPQkFMX0NPTkZJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01DQVNUX0dST1VQX0lORk86CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NRElfQ1JPU1NPVkVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTUlOX01BQ19MSU1JVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01QQ1BfQ0xPQ0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NUENQX0NMT0NLX0NPTVBFTlNBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NVFU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ORVRXT1JLX1BPTl9NQVA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ORVdfRE5fRklMVEVSX1RCTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX05FV19VUF9GSUxURVJfVEJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTlZTX1NDUkFUQ0hQQUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9OVlNfU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9PTlVfQUdHUkVHQVRFX0xJTUlUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfT05VX0hPTERPVkVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfT05VX0lHTVBfVkxBTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX09OVV9SVUxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9MSUNFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfQ0FQQUJJTElUWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfRFlOQU1JQ19FTlRSSUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9TVEFUU19USFJFU0hPTERfSU5URVJWQUw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX1ZMQU5fTUVNQkVSU0hJUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfVkxBTl9QT0xJQ1k6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1dFUl9NT05fUlhfUE9XRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1dFUl9NT05fVEVNUEVSQVRVUkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1dFUl9NT05fVFhfQklBUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9UWF9QT1dFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPV0VSX01PTl9WQ0M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QUklfRU5RVUVVSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUFNTVEFURToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1FVRVVFX0NPTkZJR19WMjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1FVRVVFUFJJTUFQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUkVQT1JUX1RIUkVTSE9MRFM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9CWVRFU19ERUxBWUVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfQllURVNfRFJPUFBFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0RFTEFZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfREVMQVlfVEhSRVNIT0xEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVfVE9PX1NIT1JUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxMDI0VE8xNTE4OgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxMjhUTzI1NToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMTUxOVBMVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTI1NlRPNTExOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUU1MTJUTzEwMjM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTY0OgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUU2NVRPMTI3OgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVTX0RST1BQRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NFQVJDSF9DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TRVFVRU5DRV9OVU1CRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TTEVfTU9ERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NUQVRJQ19NQUNfVEJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0FEX1NFTEVDVF9BQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0FEX1RFQ0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfQURNSU5fU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfQVVUT19DRkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfTE9DQUxfU0VMRUNUX0FCTEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfTE9DQUxfVEVDSDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19SRU1PVEVfU0lHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX1JYX1NFTEVDVF9BQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX1JYX1RFQ0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfRkVDX0FCSUxJVFk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfRkVDX0NPUlJFQ1RFRF9CTE9DS1M6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfRkVDX01PREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfRkVDX1VOQ09SUkVDVEFCTEVfQkxPQ0tTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19BRERSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19BTElHTl9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0JDQVNUX0ZSQU1FU19SWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQkNBU1RfRlJBTUVTX1RYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DQVBBQklMSVRJRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NBUlJJRVJfU0VOU0VfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DT0xMSVNJT05fRlJBTUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX0ZSQU1FU19SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9GUkFNRVNfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfRlVOQ1NfU1VQUE9SVEVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX1BBVVNFX0RFTEFZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX1BBVVNFX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX1BBVVNFX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX1VOU1VQUE9SVEVEX09QX1JYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19EVVBMRVhfU1RBVFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19FTkFCTEVfU1RBVFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19FWENFU1NJVkVfQ09MTElTSU9OUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRkNTX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJfRVhDRVNTSVZFX0RFRkVSUkFMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRV9UT09fTE9ORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVTX0RFRkVSUkVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRVNfTE9TVF9NQUNfUlhfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRVNfTE9TVF9NQUNfVFhfRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRVNfUlhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FU19UWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfSUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0lOX1JBTkdFX0xFTl9FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0xBVEVfQ09MTElTSU9OUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTUNBU1RfQUREUl9MSVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19NQ0FTVF9GUkFNRVNfUlhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX01DQVNUX0ZSQU1FU19UWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTUNBU1RfUlhfU1RBVFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19NVUxUSVBMRV9DT0xMX0ZSQU1FUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfT0NURVRTX1JYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19PQ1RFVFNfVFhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX09VVF9PRl9SQU5HRV9MRU5fRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19QUk9NSVNDVU9VU19TVEFUVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX1NJTkdMRV9DT0xMX0ZSQU1FUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfVFhfRU5BQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BVV9NRURJQV9BVkFJTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX0RJU0NPVkVSWV9USU1FT1VUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfRElTQ09WRVJZX1dJTkRPV19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX01BQ19DVFJMX0ZSQU1FU19SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX01BQ19DVFJMX0ZSQU1FU19UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX0dBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9SRUdfQUNLOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfUlhfUkVHX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9SRUdJU1RFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX1JFUE9SVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX0dBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9SRUdfQUNLOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfVFhfUkVHX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9SRUdJU1RFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX1JFUE9SVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9PQU1fRU1VTF9DUkM4RVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX09BTV9MT0NBTF9FUlJfRlJBTUVfU0VDU19FVkVOVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9QSFlfQURNSU5fU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfUEhZX1NZTUJPTF9FUlJfRFVSSU5HX0NBUlJJRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfUEhZX1RZUEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfUEhZX1RZUEVfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NZU1RFTV9SVUxFX09QVElPTlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UUkFOU0NFSVZFUl9CVVJTVF9BQ1RJVklUWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RSQU5TQ0VJVkVSX1NJR05BTF9ERVRFQ1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19ERUxBWUVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfQllURVNfRFJPUFBFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX1VOVVNFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0RFTEFZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfREVMQVlfVEhSRVNIT0xEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUUxMDI0VE8xNTE4OgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUUxMjhUTzI1NToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMTUxOVBMVVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTI1NlRPNTExOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUU1MTJUTzEwMjM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTY0OgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUU2NVRPMTI3OgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUVTX0RST1BQRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9VTklDQVNUX0ZSQU1FUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1VOSV9TSEFQRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9VUF9GSUxURVJfVEJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVkxBTl9ERVNUSU5BVElPTlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9WTEFOX0VUSEVSVFlQRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjX2F0dHJfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYXR0cmlidXRlIGF0dHJpYnV0ZTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hdHRyaWJ1dGVfdW5wYWNrKCZhdHRyaWJ1dGUsIHBhY2tlZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgc3dpdGNoIChhdHRyaWJ1dGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9TVEFUX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTElOS19TVEFUX1RIUkVTSE9MRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQUxBUk1fVEhSRVNIT0xEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQVJQX1JFUExJQ0FURV9ERVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQkNBU1RfUkFURV9MSU1JVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0JZUEFTU19TT0ZUX0xFQVJOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ0hJUF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0NISVBfVkVSU0lPTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0NPTlRST0xfUE9SVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0NPU19UUkFOU0xBVElPTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0NST1NTQkFSX0NPTkZJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0NUTF9WTEFOX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRE5fRklMVEVSX1RCTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0RPV05fQlVSU1RfVE9MTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0RZTl9MRUFSTl9BR0VfTElNSVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9EWU5fTEVBUk5fVEJMX1NJWkU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9EWU5fTEVBUk5JTkdfTU9ERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0RZTl9NQUNfVEJMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRUdSRVNTX1NIQVBJTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FTkNSWVBUX0tFWV9FWFBJUllfVElNRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VOQ1JZUFRJT05fS0VZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRU5DUllQVElPTl9NT0RFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19ET1dOX0JJVF9MT0FESU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19TRE1fQU1QTElUVURFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19TRE1fUEhBU0U6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1NETV9RVUFOVElaRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDE6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VQX0JJVF9MT0FESU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVhUX0ZJUk1XQVJFX1ZFUlNJT046CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FWFRFTkRFRF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZBSUxTQUZFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRkVBVFVSRV9TRVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GRUNfTU9ERToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZJTEVfSU5GTzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZJUk1XQVJFX1RJTUVTVEFNUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZJUk1XQVJFX1ZFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZMT09EX1VOS05PV046CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9JR01QX0ZSQU1FX1JBVEVfTElNSVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9JTkdSRVNTX1BPTElDSU5HOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfSU5URVJOQUxfVkVSU0lPTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0lQTUNfVU5LTk9XTl9MRUFWRV9GV0Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9KRURFQ19JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xBQ1BfREVTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xFQVJOX01PREVfUlVMRV9VUERBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MRUFSTl9UQUJMRV9NT0RFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTEVOX0VSUk9SX0RJU0NBUkQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MSU5LX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTElOS19TVEFUU19USFJFU0hPTERfSU5URVJWQUw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MT0NBTF9TV0lUQ0hJTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MVUVfRklFTERfU0VMRUNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTFVFX0ZJRUxEX1NFTEVDVF9MSVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTUNBU1RfRE9NQUlOX0NPTkZJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01DQVNUX0dMT0JBTF9DT05GSUc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NQ0FTVF9HUk9VUF9JTkZPOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTURJX0NST1NTT1ZFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01JTl9NQUNfTElNSVQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NUENQX0NMT0NLOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTVBDUF9DTE9DS19DT01QRU5TQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTVRVOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTkVUV09SS19QT05fTUFQOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTkVXX0ROX0ZJTFRFUl9UQkw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ORVdfVVBfRklMVEVSX1RCTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX05WU19TQ1JBVENIUEFEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTlZTX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfT05VX0FHR1JFR0FURV9MSU1JVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX09OVV9IT0xET1ZFUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX09OVV9JR01QX1ZMQU46CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9PTlVfUlVMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPTElDRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX0NBUEFCSUxJVFk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX0RZTkFNSUNfRU5UUklFUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfU1RBVFNfVEhSRVNIT0xEX0lOVEVSVkFMOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9WTEFOX01FTUJFUlNISVA6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX1ZMQU5fUE9MSUNZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1JYX1BPV0VSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1RFTVBFUkFUVVJFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1RYX0JJQVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1dFUl9NT05fVFhfUE9XRVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1dFUl9NT05fVkNDOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUFJJX0VOUVVFVUlORzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BTU1RBVEU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9RVUVVRV9DT05GSUdfVjI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9RVUVVRVBSSU1BUDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JFUE9SVF9USFJFU0hPTERTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfQllURVNfREVMQVlFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0JZVEVTX0RST1BQRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9ERUxBWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0RFTEFZX1RIUkVTSE9MRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FX1RPT19TSE9SVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMTAyNFRPMTUxODoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMTI4VE8yNTU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTE1MTlQTFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUyNTZUTzUxMToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FNTEyVE8xMDIzOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUU2NDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FNjVUTzEyNzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FU19EUk9QUEVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TRUFSQ0hfQ09ORklHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU0VRVUVOQ0VfTlVNQkVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU0xFX01PREU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVEFUSUNfTUFDX1RCTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19BRF9TRUxFQ1RfQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19BRF9URUNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0FETUlOX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0FVVE9fQ0ZHOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0xPQ0FMX1NFTEVDVF9BQkxFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0xPQ0FMX1RFQ0g6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfUkVNT1RFX1NJRzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19SWF9TRUxFQ1RfQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19SWF9URUNIOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0ZFQ19BQklMSVRZOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0ZFQ19DT1JSRUNURURfQkxPQ0tTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0ZFQ19NT0RFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0ZFQ19VTkNPUlJFQ1RBQkxFX0JMT0NLUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQUREUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQUxJR05fRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19CQ0FTVF9GUkFNRVNfUlhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0JDQVNUX0ZSQU1FU19UWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ0FQQUJJTElUSUVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DQVJSSUVSX1NFTlNFX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ09MTElTSU9OX0ZSQU1FUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9GUkFNRVNfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfRlJBTUVTX1RYOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX0ZVTkNTX1NVUFBPUlRFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9JRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9QQVVTRV9ERUxBWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9QQVVTRV9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9QQVVTRV9UWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9VTlNVUFBPUlRFRF9PUF9SWDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRFVQTEVYX1NUQVRVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRU5BQkxFX1NUQVRVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRVhDRVNTSVZFX0NPTExJU0lPTlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZDU19FUlI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSX0VYQ0VTU0lWRV9ERUZFUlJBTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVfVE9PX0xPTkc6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FU19ERUZFUlJFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVTX0xPU1RfTUFDX1JYX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVTX0xPU1RfTUFDX1RYX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVTX1JYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRVNfVFhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0lEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19JTl9SQU5HRV9MRU5fRVJSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19MQVRFX0NPTExJU0lPTlM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX01DQVNUX0FERFJfTElTVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTUNBU1RfRlJBTUVTX1JYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19NQ0FTVF9GUkFNRVNfVFhfT0s6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX01DQVNUX1JYX1NUQVRVUzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTVVMVElQTEVfQ09MTF9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX09DVEVUU19SWF9PSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfT0NURVRTX1RYX09LOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19PVVRfT0ZfUkFOR0VfTEVOX0VSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfUFJPTUlTQ1VPVVNfU1RBVFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19TSU5HTEVfQ09MTF9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX1RYX0VOQUJMRToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQVVfTUVESUFfQVZBSUw6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9ESVNDT1ZFUllfVElNRU9VVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX0RJU0NPVkVSWV9XSU5ET1dfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9NQUNfQ1RSTF9GUkFNRVNfUlg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9NQUNfQ1RSTF9GUkFNRVNfVFg6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9HQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfUlhfUkVHX0FDSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX1JFR19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfUlhfUkVHSVNURVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9SRVBPUlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9HQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfVFhfUkVHX0FDSzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX1JFR19SRVFVRVNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfVFhfUkVHSVNURVI6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9SRVBPUlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfT0FNX0VNVUxfQ1JDOEVSUjoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9PQU1fTE9DQUxfRVJSX0ZSQU1FX1NFQ1NfRVZFTlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfUEhZX0FETUlOX1NUQVRFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX1BIWV9TWU1CT0xfRVJSX0RVUklOR19DQVJSSUVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX1BIWV9UWVBFOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX1BIWV9UWVBFX0xJU1Q6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TWVNURU1fUlVMRV9PUFRJT05TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFJBTlNDRUlWRVJfQlVSU1RfQUNUSVZJVFk6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UUkFOU0NFSVZFUl9TSUdOQUxfREVURUNUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfQllURVNfREVMQVlFRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX0RST1BQRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9CWVRFU19VTlVTRUQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9ERUxBWToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0RFTEFZX1RIUkVTSE9MRDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMTAyNFRPMTUxODoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMTI4VE8yNTU6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTE1MTlQTFVTOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUUyNTZUTzUxMToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FNTEyVE8xMDIzOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUU2NDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FNjVUTzEyNzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FU19EUk9QUEVEOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfVU5JQ0FTVF9GUkFNRVM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9VTklfU0hBUEVSOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVVBfRklMVEVSX1RCTDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1ZMQU5fREVTVElOQVRJT05TOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVkxBTl9FVEhFUlRZUEU6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmRfY29udGludWVkX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmRfY29udGludWVkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgdWludDMyX3QgcHJlTGVuRmllbGRQb3M7CisgICAgdWludDMyX3QgYnl0ZXNBZnRlckxlbkZpZWxkOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19jb250ZW50X3R5cGVfcGFjayh0aGlzLT5jb250ZW50X3R5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX3ZlcnNpb25fcGFjaygmdGhpcy0+dmVyc2lvbiwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBwcmVMZW5GaWVsZFBvcyA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKTsKKworICAgIC8qIHNraXAgb3ZlciBsZW5ndGggZmllbGQgKHdlJ2xsIGZpbGwgaXQgaW4gbGF0ZXIpICovCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCAyKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoaXMtPmNvbnRlbnRfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19DT05URU5UX1RZUEVfQUxFUlQ6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19DT05URU5UX1RZUEVfQVBQTElDQVRJT05fREFUQToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9DSEFOR0VfQ0lQSEVSX1NQRUM6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19DT05URU5UX1RZUEVfSEFORFNIQUtFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgodGhpcy0+dS5kZWYuZGF0YV9jb3VudCA+IDApICYmICh0aGlzLT51LmRlZi5kYXRhID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImRhdGFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZF9jb250aW51ZWRfZGVmXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZShidWYsIHRoaXMtPnUuZGVmLmRhdGEsIHRoaXMtPnUuZGVmLmRhdGFfY291bnQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ5dGVzQWZ0ZXJMZW5GaWVsZCA9IGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3VzZWQoYnVmKSAtIChwcmVMZW5GaWVsZFBvcyArIHNpemVvZih1aW50MTZfdCkpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgcHJlTGVuRmllbGRQb3MpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl93cml0ZV91MTYoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9zZXRfcG9zKGJ1ZiwgYnl0ZXNBZnRlckxlbkZpZWxkICsgKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmRfY29udGludWVkX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX2NvbnRpbnVlZCAqdGhpcykKK3sKKyAgICB1aW50MzJfdCBjb3VudCA9IDU7CisgICAgc3dpdGNoICh0aGlzLT5jb250ZW50X3R5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfQ09OVEVOVF9UWVBFX0FMRVJUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfQ09OVEVOVF9UWVBFX0FQUExJQ0FUSU9OX0RBVEE6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19DT05URU5UX1RZUEVfQ0hBTkdFX0NJUEhFUl9TUEVDOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfQ09OVEVOVF9UWVBFX0hBTkRTSEFLRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSB0aGlzLT51LmRlZi5kYXRhX2NvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZF9jb250aW51ZWRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX2NvbnRpbnVlZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKQoreworICAgIHVpbnQxNl90IGxlbmd0aCA9IDA7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19jb250ZW50X3R5cGVfdW5wYWNrKCZ0aGlzLT5jb250ZW50X3R5cGUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX3ZlcnNpb25fdW5wYWNrKCZ0aGlzLT52ZXJzaW9uLCBidWYsIGV4dHJhX21lbSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIGJ1Zi0+Y3Vycik7CisgICAgc3dpdGNoICh0aGlzLT5jb250ZW50X3R5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfQ09OVEVOVF9UWVBFX0FMRVJUOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfQ09OVEVOVF9UWVBFX0FQUExJQ0FUSU9OX0RBVEE6CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1RMU19DT05URU5UX1RZUEVfQ0hBTkdFX0NJUEhFUl9TUEVDOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfQ09OVEVOVF9UWVBFX0hBTkRTSEFLRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLT51LmRlZi5kYXRhX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmRfY29udGludWVkX2RlZl9jb3VudF9kYXRhKCZwb3N0TGVuQnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPnUuZGVmLmRhdGFfY291bnQgPiAwKSAmJiAodGhpcy0+dS5kZWYuZGF0YSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRyYV9tZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcImRhdGFcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZF9jb250aW51ZWRfZGVmXCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnUuZGVmLmRhdGEgPSAodWludDhfdCAqKSAqZXh0cmFfbWVtOworICAgICAgICAgICAgICAgICAgICAgICAgKmV4dHJhX21lbSA9ICgodWludDhfdCAqKSAqZXh0cmFfbWVtKSArIEJDTU9TX1JPVU5EX1RPX1dPUkQodGhpcy0+dS5kZWYuZGF0YV9jb3VudCAqIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfcmVhZCgmcG9zdExlbkJ1ZiwgdGhpcy0+dS5kZWYuZGF0YSwgdGhpcy0+dS5kZWYuZGF0YV9jb3VudCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAoYnVmLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZF9jb250aW51ZWRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Rsc19jb250ZW50X3R5cGUgY29udGVudF90eXBlOworICAgIGJjbW9sdF9lcG9uX29hbV9idWYgcG9zdExlbkJ1ZjsKKyAgICB1aW50MTZfdCBsZW5ndGg7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX2NvbnRlbnRfdHlwZV91bnBhY2soJmNvbnRlbnRfdHlwZSwgcGFja2VkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcChwYWNrZWQsIDIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9yZWFkX3UxNihwYWNrZWQsICZsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX29hbV9idWZfaW5pdCgmcG9zdExlbkJ1ZiwgbGVuZ3RoLCBwYWNrZWQtPmN1cnIpOworICAgIHN3aXRjaCAoY29udGVudF90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9BTEVSVDoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9BUFBMSUNBVElPTl9EQVRBOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9UTFNfQ09OVEVOVF9UWVBFX0NIQU5HRV9DSVBIRVJfU1BFQzoKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9IQU5EU0hBS0U6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgZGF0YV9lbGVtX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoQkNNT1NfVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKCZwb3N0TGVuQnVmLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBkYXRhX2VsZW1fY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoZGF0YV9lbGVtX2NvdW50ICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX2NvbnRpbnVlZF9kZWZfY291bnRfZGF0YShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpCit7CisgICAgcmV0dXJuIChiY21vbHRfZXBvbl9vYW1fYnVmX2dldF9yZW1haW5pbmdfc2l6ZShidWYpIC8gMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobV9wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKQoreworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19oYXNoX2FsZ29yaXRobV9wYWNrKHRoaXMtPmhhc2gsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbGdvcml0aG1fcGFjayh0aGlzLT5zaWduYXR1cmUsIGJ1ZikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX2hhc2hfYWxnb3JpdGhtX3VucGFjaygmdGhpcy0+aGFzaCwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FsZ29yaXRobV91bnBhY2soJnRoaXMtPnNpZ25hdHVyZSwgYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKQoreworICAgICh2b2lkKWV4dHJhX21lbTsKKyAgICByZXR1cm4gYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKHBhY2tlZCwgMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobV9saXN0X3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBwcmVMZW5GaWVsZFBvczsKKyAgICB1aW50MzJfdCBieXRlc0FmdGVyTGVuRmllbGQ7CisgICAgdWludDMyX3QgaTA7CisgICAgcHJlTGVuRmllbGRQb3MgPSBiY21vbHRfZXBvbl9vYW1fYnVmX2dldF91c2VkKGJ1Zik7CisKKyAgICAvKiBza2lwIG92ZXIgbGVuZ3RoIGZpZWxkICh3ZSdsbCBmaWxsIGl0IGluIGxhdGVyKSAqLworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgMikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCh0aGlzLT5zdXBwb3J0ZWRfc2lnbmF0dXJlX2FsZ29yaXRobXNfY291bnQgPiAwKSAmJiAodGhpcy0+c3VwcG9ydGVkX3NpZ25hdHVyZV9hbGdvcml0aG1zID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb3NfdHJhY2UoQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1IsICJFcnJvcjogbGlzdCBmaWVsZCBcInN1cHBvcnRlZF9zaWduYXR1cmVfYWxnb3JpdGhtc1wiIG9mIHN0cnVjdCBcImJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobV9saXN0XCIgaXMgdW5pbml0aWFsaXplZCAoTlVMTCkuICBZb3UgbXVzdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoaXMgcG9pbnRlciBiZWZvcmUgc2VuZGluZy9yZWNlaXZpbmcgdGhlIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICh0aGlzLT5zdXBwb3J0ZWRfc2lnbmF0dXJlX2FsZ29yaXRobXNfY291bnQgPiA2NTUzNEwpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgZm9yIChpMCA9IDA7IGkwIDwgdGhpcy0+c3VwcG9ydGVkX3NpZ25hdHVyZV9hbGdvcml0aG1zX2NvdW50OyBpMCsrKQorICAgIHsKKyAgICAgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbmRfaGFzaF9hbGdvcml0aG1fcGFjaygmdGhpcy0+c3VwcG9ydGVkX3NpZ25hdHVyZV9hbGdvcml0aG1zW2kwXSwgYnVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgYnl0ZXNBZnRlckxlbkZpZWxkID0gYmNtb2x0X2Vwb25fb2FtX2J1Zl9nZXRfdXNlZChidWYpIC0gKHByZUxlbkZpZWxkUG9zICsgc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBwcmVMZW5GaWVsZFBvcykpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3dyaXRlX3UxNihidWYsIGJ5dGVzQWZ0ZXJMZW5GaWVsZCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NldF9wb3MoYnVmLCBieXRlc0FmdGVyTGVuRmllbGQgKyAocHJlTGVuRmllbGRQb3MgKyBzaXplb2YodWludDE2X3QpKSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbmRfaGFzaF9hbGdvcml0aG1fbGlzdF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbmRfaGFzaF9hbGdvcml0aG1fbGlzdCAqdGhpcykKK3sKKyAgICByZXR1cm4gMiArICgyICogdGhpcy0+c3VwcG9ydGVkX3NpZ25hdHVyZV9hbGdvcml0aG1zX2NvdW50KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtX2xpc3RfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobV9saXN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pCit7CisgICAgdWludDE2X3QgbGVuZ3RoID0gMDsKKyAgICBiY21vbHRfZXBvbl9vYW1fYnVmIHBvc3RMZW5CdWY7CisgICAgdWludDMyX3QgaTA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KGJ1ZiwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIGJ1Zi0+Y3Vycik7CisgICAgdGhpcy0+c3VwcG9ydGVkX3NpZ25hdHVyZV9hbGdvcml0aG1zX2NvdW50ID0gYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtX2xpc3RfY291bnRfc3VwcG9ydGVkX3NpZ25hdHVyZV9hbGdvcml0aG1zKCZwb3N0TGVuQnVmKTsKKyAgICBpZiAoKHRoaXMtPnN1cHBvcnRlZF9zaWduYXR1cmVfYWxnb3JpdGhtc19jb3VudCA+IDApICYmICh0aGlzLT5zdXBwb3J0ZWRfc2lnbmF0dXJlX2FsZ29yaXRobXMgPT0gTlVMTCkpCisgICAgeworICAgICAgICBpZiAoZXh0cmFfbWVtID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RyYWNlKEJDTU9TX1RSQUNFX0xFVkVMX0VSUk9SLCAiRXJyb3I6IGxpc3QgZmllbGQgXCJzdXBwb3J0ZWRfc2lnbmF0dXJlX2FsZ29yaXRobXNcIiBvZiBzdHJ1Y3QgXCJiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbmRfaGFzaF9hbGdvcml0aG1fbGlzdFwiIGlzIHVuaW5pdGlhbGl6ZWQgKE5VTEwpLiAgWW91IG11c3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIHBvaW50ZXIgYmVmb3JlIHNlbmRpbmcvcmVjZWl2aW5nIHRoZSBtZXNzYWdlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLT5zdXBwb3J0ZWRfc2lnbmF0dXJlX2FsZ29yaXRobXMgPSAoYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtICopICpleHRyYV9tZW07CisgICAgICAgICAgICAqZXh0cmFfbWVtID0gKCh1aW50OF90ICopICpleHRyYV9tZW0pICsgQkNNT1NfUk9VTkRfVE9fV09SRCh0aGlzLT5zdXBwb3J0ZWRfc2lnbmF0dXJlX2FsZ29yaXRobXNfY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodGhpcy0+c3VwcG9ydGVkX3NpZ25hdHVyZV9hbGdvcml0aG1zX2NvdW50ID4gNjU1MzRMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaTAgPSAwOyBpMCA8IHRoaXMtPnN1cHBvcnRlZF9zaWduYXR1cmVfYWxnb3JpdGhtc19jb3VudDsgaTArKykKKyAgICB7CisgICAgICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtX3VucGFjaygmdGhpcy0+c3VwcG9ydGVkX3NpZ25hdHVyZV9hbGdvcml0aG1zW2kwXSwgJnBvc3RMZW5CdWYsIGV4dHJhX21lbSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2J1Zl9za2lwKGJ1ZiwgbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtX2xpc3Rfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2J1ZiBwb3N0TGVuQnVmOworICAgIHVpbnQxNl90IGxlbmd0aDsKKyAgICB1aW50MzJfdCBzdXBwb3J0ZWRfc2lnbmF0dXJlX2FsZ29yaXRobXNfZWxlbV9jb3VudCA9IDA7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3JlYWRfdTE2KHBhY2tlZCwgJmxlbmd0aCkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgYmNtb2x0X2Vwb25fb2FtX2J1Zl9pbml0KCZwb3N0TGVuQnVmLCBsZW5ndGgsIHBhY2tlZC0+Y3Vycik7CisgICAgd2hpbGUgKEJDTU9TX1RSVUUpCisgICAgeworICAgICAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9idWZfc2tpcCgmcG9zdExlbkJ1ZiwgMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc3VwcG9ydGVkX3NpZ25hdHVyZV9hbGdvcml0aG1zX2VsZW1fY291bnQgKz0gMTsKKyAgICB9CisKKyAgICAqZXh0cmFfbWVtICs9IEJDTU9TX1JPVU5EX1RPX1dPUkQoc3VwcG9ydGVkX3NpZ25hdHVyZV9hbGdvcml0aG1zX2VsZW1fY291bnQgKiBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtKSk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fYnVmX3NraXAocGFja2VkLCBsZW5ndGgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtX2xpc3RfY291bnRfc3VwcG9ydGVkX3NpZ25hdHVyZV9hbGdvcml0aG1zKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1ZikKK3sKKyAgICByZXR1cm4gKGJjbW9sdF9lcG9uX29hbV9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgLyAyKTsKK30KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9jb21tb25fZXBvbl9vYW0vYmNtb2x0X2Vwb25fb2FtX3R5cGVzLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvY29tbW9uX2Vwb25fb2FtL2JjbW9sdF9lcG9uX29hbV90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0Mjk0MmUKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvY29tbW9uX2Vwb25fb2FtL2JjbW9sdF9lcG9uX29hbV90eXBlcy5oCkBAIC0wLDAgKzEsMjM5MDYgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6cHJvcHJpZXRhcnk6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitUaGlzIHByb2dyYW0gaXMgdGhlIHByb3ByaWV0YXJ5IHNvZnR3YXJlIG9mIEJyb2FkY29tIENvcnBvcmF0aW9uIGFuZC9vciBpdHMKK2xpY2Vuc29ycywgYW5kIG1heSBvbmx5IGJlIHVzZWQsIGR1cGxpY2F0ZWQsIG1vZGlmaWVkIG9yIGRpc3RyaWJ1dGVkIHB1cnN1YW50Cit0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgYSBzZXBhcmF0ZSwgd3JpdHRlbiBsaWNlbnNlIGFncmVlbWVudCBleGVjdXRlZAorYmV0d2VlbiB5b3UgYW5kIEJyb2FkY29tIChhbiAiQXV0aG9yaXplZCBMaWNlbnNlIikuICBFeGNlcHQgYXMgc2V0IGZvcnRoIGluCithbiBBdXRob3JpemVkIExpY2Vuc2UsIEJyb2FkY29tIGdyYW50cyBubyBsaWNlbnNlIChleHByZXNzIG9yIGltcGxpZWQpLCByaWdodAordG8gdXNlLCBvciB3YWl2ZXIgb2YgYW55IGtpbmQgd2l0aCByZXNwZWN0IHRvIHRoZSBTb2Z0d2FyZSwgYW5kIEJyb2FkY29tCitleHByZXNzbHkgcmVzZXJ2ZXMgYWxsIHJpZ2h0cyBpbiBhbmQgdG8gdGhlIFNvZnR3YXJlIGFuZCBhbGwgaW50ZWxsZWN0dWFsCitwcm9wZXJ0eSByaWdodHMgdGhlcmVpbi4gIElGIFlPVSBIQVZFIE5PIEFVVEhPUklaRUQgTElDRU5TRSwgVEhFTiBZT1UgSEFWRQorTk8gUklHSFQgVE8gVVNFIFRISVMgU09GVFdBUkUgSU4gQU5ZIFdBWSwgQU5EIFNIT1VMRCBJTU1FRElBVEVMWSBOT1RJRlkKK0JST0FEQ09NIEFORCBESVNDT05USU5VRSBBTEwgVVNFIE9GIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGV4cHJlc3NseSBzZXQgZm9ydGggaW4gdGhlIEF1dGhvcml6ZWQgTGljZW5zZSwKKworMS4gVGhpcyBwcm9ncmFtLCBpbmNsdWRpbmcgaXRzIHN0cnVjdHVyZSwgc2VxdWVuY2UgYW5kIG9yZ2FuaXphdGlvbiwKKyAgICBjb25zdGl0dXRlcyB0aGUgdmFsdWFibGUgdHJhZGUgc2VjcmV0cyBvZiBCcm9hZGNvbSwgYW5kIHlvdSBzaGFsbCB1c2UKKyAgICBhbGwgcmVhc29uYWJsZSBlZmZvcnRzIHRvIHByb3RlY3QgdGhlIGNvbmZpZGVudGlhbGl0eSB0aGVyZW9mLCBhbmQgdG8KKyAgICB1c2UgdGhpcyBpbmZvcm1hdGlvbiBvbmx5IGluIGNvbm5lY3Rpb24gd2l0aCB5b3VyIHVzZSBvZiBCcm9hZGNvbQorICAgIGludGVncmF0ZWQgY2lyY3VpdCBwcm9kdWN0cy4KKworMi4gVE8gVEhFIE1BWElNVU0gRVhURU5UIFBFUk1JVFRFRCBCWSBMQVcsIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiCisgICAgQU5EIFdJVEggQUxMIEZBVUxUUyBBTkQgQlJPQURDT00gTUFLRVMgTk8gUFJPTUlTRVMsIFJFUFJFU0VOVEFUSU9OUyBPUgorICAgIFdBUlJBTlRJRVMsIEVJVEhFUiBFWFBSRVNTLCBJTVBMSUVELCBTVEFUVVRPUlksIE9SIE9USEVSV0lTRSwgV0lUSAorICAgIFJFU1BFQ1QgVE8gVEhFIFNPRlRXQVJFLiAgQlJPQURDT00gU1BFQ0lGSUNBTExZIERJU0NMQUlNUyBBTlkgQU5ECisgICAgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBUSVRMRSwgTUVSQ0hBTlRBQklMSVRZLCBOT05JTkZSSU5HRU1FTlQsCisgICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIExBQ0sgT0YgVklSVVNFUywgQUNDVVJBQ1kgT1IKKyAgICBDT01QTEVURU5FU1MsIFFVSUVUIEVOSk9ZTUVOVCwgUVVJRVQgUE9TU0VTU0lPTiBPUiBDT1JSRVNQT05ERU5DRQorICAgIFRPIERFU0NSSVBUSU9OLiBZT1UgQVNTVU1FIFRIRSBFTlRJUkUgUklTSyBBUklTSU5HIE9VVCBPRiBVU0UgT1IKKyAgICBQRVJGT1JNQU5DRSBPRiBUSEUgU09GVFdBUkUuCisKKzMuIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBJTiBOTyBFVkVOVCBTSEFMTCBCUk9BRENPTSBPUgorICAgIElUUyBMSUNFTlNPUlMgQkUgTElBQkxFIEZPUiAoaSkgQ09OU0VRVUVOVElBTCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAgICBJTkRJUkVDVCwgT1IgRVhFTVBMQVJZIERBTUFHRVMgV0hBVFNPRVZFUiBBUklTSU5HIE9VVCBPRiBPUiBJTiBBTlkKKyAgICBXQVkgUkVMQVRJTkcgVE8gWU9VUiBVU0UgT0YgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgU09GVFdBUkUgRVZFTgorICAgIElGIEJST0FEQ09NIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUzsKKyAgICBPUiAoaWkpIEFOWSBBTU9VTlQgSU4gRVhDRVNTIE9GIFRIRSBBTU9VTlQgQUNUVUFMTFkgUEFJRCBGT1IgVEhFCisgICAgU09GVFdBUkUgSVRTRUxGIE9SIFUuUy4gJDEsIFdISUNIRVZFUiBJUyBHUkVBVEVSLiBUSEVTRSBMSU1JVEFUSU9OUworICAgIFNIQUxMIEFQUExZIE5PVFdJVEhTVEFORElORyBBTlkgRkFJTFVSRSBPRiBFU1NFTlRJQUwgUFVSUE9TRSBPRiBBTlkKKyAgICBMSU1JVEVEIFJFTUVEWS4KKzo+CisqLworI2lmbmRlZiBCQ01PTFRfRVBPTl9PQU1fVFlQRVNfSF8KKyNkZWZpbmUgQkNNT0xUX0VQT05fT0FNX1RZUEVTX0hfCisKKyNpbmNsdWRlICJiY21vc19zeXN0ZW0uaCIKKyNpbmNsdWRlICJiY21vc19jb21tb24uaCIKKyNpbmNsdWRlICJiY21vc19lcnJuby5oIgorI2luY2x1ZGUgImJjbW9sdF9idWYuaCIKKwordHlwZWRlZiBiY21vbHRfYnVmIGJjbW9sdF9lcG9uX29hbV9idWY7CisKKy8qKiBcYWRkdG9ncm91cCBlcG9uX29hbQorICogQHsKKyAqLworCisvKiogQWxhcm0gQ29uZmlnIE1vZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2FsYXJtX2NvbmZpZ19tb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0FMQVJNX0NPTkZJR19NT0RFX0NMT1NFID0gMCwgICAgLyoqPCBDbG9zZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQUxBUk1fQ09ORklHX01PREVfT1BFTiAgPSAxICAgICAvKio8IE9wZW4uICovCit9IGJjbW9sdF9lcG9uX29hbV9hbGFybV9jb25maWdfbW9kZTsKKworLyoqIEF1dG9uZWdvdGlhdGUgQWRtaW4gU3RhdGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2F1dG9uZWdvdGlhdGVfYWRtaW5fc3RhdGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQVVUT05FR09USUFURV9BRE1JTl9TVEFURV9PQU1fQVVUT19BRE1JTl9ESVNBQkxFRCAgID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBPQU0gQXV0byBBZG1pbiBEaXNhYmxlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQVVUT05FR09USUFURV9BRE1JTl9TVEFURV9PQU1fQVVUT19BRE1JTl9FTkFCTEVEICAgID0gMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBPQU0gQXV0byBBZG1pbiBFbmFibGVkLiAqLworfSBiY21vbHRfZXBvbl9vYW1fYXV0b25lZ290aWF0ZV9hZG1pbl9zdGF0ZTsKKworLyoqIEF1dG8gTmVnb3RpYXRpb24gQXV0byBDb25maWcuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2F1dG9fbmVnb3RpYXRpb25fYXV0b19jb25maWcKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQVVUT19ORUdPVElBVElPTl9BVVRPX0NPTkZJR19PVEhFUiAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBPdGhlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQVVUT19ORUdPVElBVElPTl9BVVRPX0NPTkZJR19DT05GSUdVUklORyAgICAgICAgICAgID0gMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBDb25maWd1cmluZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQVVUT19ORUdPVElBVElPTl9BVVRPX0NPTkZJR19DT01QTEVURSAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBDb21wbGV0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQVVUT19ORUdPVElBVElPTl9BVVRPX0NPTkZJR19ESVNBQkxFRCAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBEaXNhYmxlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQVVUT19ORUdPVElBVElPTl9BVVRPX0NPTkZJR19QQVJBTExFTF9GQUlMICAgICAgICAgID0gNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBQYXJhbGxlbCBGYWlsLiAqLworfSBiY21vbHRfZXBvbl9vYW1fYXV0b19uZWdvdGlhdGlvbl9hdXRvX2NvbmZpZzsKKworLyoqIEF1dG8tTmVnb3RpYXRpb24gQ2FwYWJpbGl0eS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fYXV0b19uZWdvdGlhdGlvbl9jYXBhYmlsaXR5Cit7CisgICAgQkNNT0xUX0VQT05fT0FNX0FVVE9fTkVHT1RJQVRJT05fQ0FQQUJJTElUWV9OT05FICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fT0FNX0FVVE9fTkVHT1RJQVRJT05fQ0FQQUJJTElUWV9IQUxGX0RVUExFWCAgICAgICAgICAgICA9IDB4MDAwMSwgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgSGFsZiBEdXBsZXguICovCisgICAgQkNNT0xUX0VQT05fT0FNX0FVVE9fTkVHT1RJQVRJT05fQ0FQQUJJTElUWV9GVUxMX0RVUExFWCAgICAgICAgICAgICA9IDB4MDAwMiwgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRnVsbCBEdXBsZXguICovCisgICAgQkNNT0xUX0VQT05fT0FNX0FVVE9fTkVHT1RJQVRJT05fQ0FQQUJJTElUWV9URU5fTUJQUyAgICAgICAgICAgICAgICA9IDB4MDAwNCwgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgMTAgTWJwcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQVVUT19ORUdPVElBVElPTl9DQVBBQklMSVRZX0hVTkRSRURfTUJQUyAgICAgICAgICAgID0gMHgwMDA4LCAgICAgICAgICAgICAgICAgICAgICAgLyoqPCAxMDAgTWJwcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQVVUT19ORUdPVElBVElPTl9DQVBBQklMSVRZX1RIT1VTQU5EX01CUFMgICAgICAgICAgID0gMHgwMDEwLCAgICAgICAgICAgICAgICAgICAgICAgLyoqPCAxMDAwIE1icHMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0FVVE9fTkVHT1RJQVRJT05fQ0FQQUJJTElUWV9URU5fR0JQUyAgICAgICAgICAgICAgICA9IDB4MDAyMCwgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgMTAgR2Jwcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQVVUT19ORUdPVElBVElPTl9DQVBBQklMSVRZX0ZMT1dfQ09OVFJPTCAgICAgICAgICAgID0gMHgwMDQwLCAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBGbG93IENvbnRyb2wuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0FVVE9fTkVHT1RJQVRJT05fQ0FQQUJJTElUWV9BVVRPX01ESV9NRElfWCAgICAgICAgICA9IDB4MDA4MCAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQXV0byBNREkvTURJLVguICovCit9IGJjbW9sdF9lcG9uX29hbV9hdXRvX25lZ290aWF0aW9uX2NhcGFiaWxpdHk7CisKKy8qKiBBdXRvIFJlbW90ZSBTaWcuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2F1dG9fcmVtb3RlX3NpZworeworICAgIEJDTU9MVF9FUE9OX09BTV9BVVRPX1JFTU9URV9TSUdfREVURUNURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IERldGVjdGVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9BVVRPX1JFTU9URV9TSUdfTk9UX0RFVEVDVEVEICAgICAgICAgICAgICAgICAgICAgICAgPSAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE5vdCBEZXRlY3RlZC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2F1dG9fcmVtb3RlX3NpZzsKKworLyoqIEF1dG8gU2VsZWN0b3IuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2F1dG9fc2VsZWN0b3IKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQVVUT19TRUxFQ1RPUl9PVEhFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBPdGhlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQVVUT19TRUxFQ1RPUl9FVEhFUk5FVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBFdGhlcm5ldC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQVVUT19TRUxFQ1RPUl9JU09fRVRIRVJORVQgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBJU08gRXRoZXJuZXQuICovCit9IGJjbW9sdF9lcG9uX29hbV9hdXRvX3NlbGVjdG9yOworCisvKiogQmluYXJ5IEZpZWxkIFNlbGVjdCBUeXBlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZmllbGRfc2VsZWN0X3R5cGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQklOQVJZX0ZJRUxEX1NFTEVDVF9UWVBFX0RBICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBEQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQklOQVJZX0ZJRUxEX1NFTEVDVF9UWVBFX1NBICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBTQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQklOQVJZX0ZJRUxEX1NFTEVDVF9UWVBFX1NTTV9QTFVTX0lQREEgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBTU00gKyBJUCBEQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQklOQVJZX0ZJRUxEX1NFTEVDVF9UWVBFX1BST0dfRklFTEQgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBQcm9nIEZpZWxkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CSU5BUllfRklFTERfU0VMRUNUX1RZUEVfQ1ZMQU5fVklEICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IENWTEFOIFZJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQklOQVJZX0ZJRUxEX1NFTEVDVF9UWVBFX1NWTEFOX1ZJRF9DVkxBTl9WSUQgICAgICAgID0gNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBTVkxBTiBWSUQgJiBDVkxBTiBWSUQuICovCit9IGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZmllbGRfc2VsZWN0X3R5cGU7CisKKy8qKiBDTUMgT0FNIFJlcXVlc3QgT3B0aW9uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3JlcXVlc3Rfb3B0aW9uCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX1JFUVVFU1RfT1BUSU9OX0FERCAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQWRkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NNQ19SRVFVRVNUX09QVElPTl9SRU1PVkUgICAgICAgICAgICAgICAgICAgICAgPSAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFJlbW92ZS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3JlcXVlc3Rfb3B0aW9uOworCisvKiogQ01DIE9BTSByZXN1bHQgY29kZXMgCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVzdWx0X2NvZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfUkVTVUxUX0NPREVfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBTdWNjZXNzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NNQ19SRVNVTFRfQ09ERV9GQUlMICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEZhaWwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX1JFU1VMVF9DT0RFX0lOVkFMSURfUEFSQU1FVEVSUyAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgSW52YWxpZCBQYXJhbWV0ZXJzLiAqLworfSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVzdWx0X2NvZGU7CisKKy8qKiBDTUMgT0FNIGFubmV4IG1vZGVzIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2FubmV4Cit7CisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX0FOTkVYX0FOTkVYX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQW5uZXggQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfQU5ORVhfQU5ORVhfQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBBbm5leCBCLiAqLworfSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfYW5uZXg7CisKKy8qKiBUeXBlIG9mIENNQyBJbnRlcmZhY2UgCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50Zl90eXBlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX0lOVEZfVFlQRV9FVEhFUk5FVF9DU01BQ0QgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRXRoZXJuZXQgQ3NtYWNkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NNQ19JTlRGX1RZUEVfU09GVFdBUkVfTE9PUEJBQ0sgICAgICAgICAgICAgICAgPSAyNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFNvZnR3YXJlIExvb3BiYWNrLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NNQ19JTlRGX1RZUEVfRE9DU19DQUJMRV9NQUNfTEFZRVIgICAgICAgICAgICAgPSAxMjcsICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IERvY3MgQ2FibGUgTWFjIExheWVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NNQ19JTlRGX1RZUEVfRE9DU19DQUJMRV9ET1dOU1RSRUFNICAgICAgICAgICAgPSAxMjgsICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IERvY3MgQ2FibGUgRG93bnN0cmVhbS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfSU5URl9UWVBFX0RPQ1NfQ0FCTEVfVVBTVFJFQU0gICAgICAgICAgICAgID0gMTI5ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBEb2NzIENhYmxlIFVwc3RyZWFtLiAqLworfSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50Zl90eXBlOworCisvKiogSW50ZXJmYWNlIHN0YXR1cywgdXNlZCBmb3IgaWZBZG1pblN0YXR1cyBhbmQgaWZPcGVyU3RhdHVzIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9zdGF0dXMKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfSU5URVJGQUNFX1NUQVRVU19VUCAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCB1cC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfSU5URVJGQUNFX1NUQVRVU19ET1dOICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBkb3duLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NNQ19JTlRFUkZBQ0VfU1RBVFVTX1RFU1RJTkcgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IHRlc3RpbmcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX0lOVEVSRkFDRV9TVEFUVVNfVU5LTk9XTiAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgdW5rbm93bi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfSU5URVJGQUNFX1NUQVRVU19ET1JNQU5UICAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBkb3JtYW50LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NNQ19JTlRFUkZBQ0VfU1RBVFVTX05PVF9QUkVTRU5UICAgICAgICAgICAgICAgPSA2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IG5vdCBwcmVzZW50LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NNQ19JTlRFUkZBQ0VfU1RBVFVTX0xPV0VSX0xBWUVSX0RPV04gICAgICAgICAgPSA3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IGxvd2VyIGxheWVyIGRvd24uICovCit9IGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2Vfc3RhdHVzOworCisvKiogQ01DIE9BTSBpbnRlcmxlYXZlciBtb2RlcyAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmxlYXZlcgoreworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NNQ19JTlRFUkxFQVZFUl9JMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IHsxMjgsMX0uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX0lOVEVSTEVBVkVSX0kxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgezEyOCwyfS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfSU5URVJMRUFWRVJfSTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCB7NjQsMn0uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX0lOVEVSTEVBVkVSX0kzICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgezEyOCwzfS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfSU5URVJMRUFWRVJfSTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCB7MzIsNH0uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX0lOVEVSTEVBVkVSX0k1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgezEyOCw0fS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfSU5URVJMRUFWRVJfSTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCB7MTYsOH0uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX0lOVEVSTEVBVkVSX0k3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgezEyOCw1fS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfSU5URVJMRUFWRVJfSTggICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCB7OCwxNn0uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX0lOVEVSTEVBVkVSX0k5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgezEyOCw2fS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfSU5URVJMRUFWRVJfSTEwICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCB7NCwzMn0uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX0lOVEVSTEVBVkVSX0kxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgezEyOCw3fS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfSU5URVJMRUFWRVJfSTEyICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCB7Miw2NH0uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX0lOVEVSTEVBVkVSX0kxMyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgezEyOCw4fS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfSU5URVJMRUFWRVJfSTE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCB7MSwxMjh9LiAqLworfSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJsZWF2ZXI7CisKKy8qKiBDTUMgT0FNIExvYWQgQmFsYW5jaW5nIE1ldGhvZHMgCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfbG9hZF9iYWxhbmNlX21ldGhvZAoreworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NNQ19MT0FEX0JBTEFOQ0VfTUVUSE9EX1NUQVQgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEJhc2VkIG9uIHN1bXMgb2YgTWluIEd1YXJhbnRlZWQgUmF0ZXMgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfTE9BRF9CQUxBTkNFX01FVEhPRF9EWU5BTUlDICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBCYXNlZCBvbiBjaGFubmVsIHV0aWxpemF0aW9uICovCit9IGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19sb2FkX2JhbGFuY2VfbWV0aG9kOworCisvKiogQ01DIE9BTSBtb2R1bGF0aW9uIG1vZGVzIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX21vZHVsYXRpb24KK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfTU9EVUxBVElPTl9RQU02NCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBRQU02NC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfTU9EVUxBVElPTl9RQU0yNTYgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBRQU0yNTYuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX01PRFVMQVRJT05fUUFNMTAyNCAgICAgICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUUFNMTAyNC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX21vZHVsYXRpb247CisKKy8qKiBDTUMgT0FNIFVTIG1vZHVsYXRpb24gdHlwZXMgCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfdXNfbW9kdWxhdGlvbl90eXBlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX1VTX01PRFVMQVRJT05fVFlQRV9VTktOT1dOICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVW5rbm93bi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfVVNfTU9EVUxBVElPTl9UWVBFX1RETUEgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBURE1BLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NNQ19VU19NT0RVTEFUSU9OX1RZUEVfQVRETUEgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEFURE1BLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NNQ19VU19NT0RVTEFUSU9OX1RZUEVfU0NETUEgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFNDRE1BLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NNQ19VU19NT0RVTEFUSU9OX1RZUEVfVERNQV9BVERNQSAgICAgICAgICAgICAgPSA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRETUEtQVRETUEuICovCit9IGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY191c19tb2R1bGF0aW9uX3R5cGU7CisKKy8qKiBDTUMgT0FNIFVTIHByb2ZpbGUgdHlwZXMgCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfdXNfcHJvZmlsZV90eXBlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ01DX1VTX1BST0ZJTEVfVFlQRV9GQUlSICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRmFpci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTUNfVVNfUFJPRklMRV9UWVBFX0dPT0QgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBHb29kLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NNQ19VU19QUk9GSUxFX1RZUEVfQkVTVCAgICAgICAgICAgICAgICAgICAgICAgPSAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEJlc3QuICovCit9IGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY191c19wcm9maWxlX3R5cGU7CisKKy8qKiBDTlUgQ29ubmVjdGl2aXR5IFN0YXRlIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X2Nvbm5lY3Rpdml0eV9zdGF0ZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NOVV9DT05ORUNUSVZJVFlfU1RBVEVfT1RIRVIgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgICAgICAgICAvKio8IE90aGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NOVV9DT05ORUNUSVZJVFlfU1RBVEVfSU5JVElBTF9SQU5HSU5HICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgICAgICAgICAvKio8IEluaXRpYWwgUmFuZ2luZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTlVfQ09OTkVDVElWSVRZX1NUQVRFX1JBTkdJTkdfQVVUT19BREpfQ09NUExFVEUgICAgICAgPSA0LCAgICAgICAgICAgICAgICAgICAgLyoqPCBSYW5naW5nIEF1dG8gQWRqIENvbXBsZXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NOVV9DT05ORUNUSVZJVFlfU1RBVEVfREhDUF9WNENPTVBMRVRFICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgICAgICAgICAvKio8IERoY3AgVjQgQ29tcGxldGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ05VX0NPTk5FQ1RJVklUWV9TVEFURV9SRUdJU1RSQVRJT05fQ09NUExFVEUgICAgICAgICAgID0gNiwgICAgICAgICAgICAgICAgICAgIC8qKjwgUmVnaXN0cmF0aW9uIENvbXBsZXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NOVV9DT05ORUNUSVZJVFlfU1RBVEVfT1BFUkFUSU9OQUwgICAgICAgICAgICAgICAgICAgICA9IDgsICAgICAgICAgICAgICAgICAgICAvKio8IE9wZXJhdGlvbmFsLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NOVV9DT05ORUNUSVZJVFlfU1RBVEVfQlBJX0lOSVQgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgICAgICAgICAgICAgICAgICAvKio8IEJwaSBJbml0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NOVV9DT05ORUNUSVZJVFlfU1RBVEVfU1RBUlRfRUFFICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgICAgICAgICAgICAgICAgICAvKio8IFN0YXJ0IEVBRS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTlVfQ09OTkVDVElWSVRZX1NUQVRFX1NUQVJUX0RIQ1BfVjQgICAgICAgICAgICAgICAgICAgPSAxMSwgICAgICAgICAgICAgICAgICAgLyoqPCBTdGFydCBEaGNwIFY0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NOVV9DT05ORUNUSVZJVFlfU1RBVEVfU1RBUlRfREhDUF9WNiAgICAgICAgICAgICAgICAgICA9IDEyLCAgICAgICAgICAgICAgICAgICAvKio8IFN0YXJ0IERoY3AgVjYuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ05VX0NPTk5FQ1RJVklUWV9TVEFURV9ESENQX1Y2Q09NUExFVEUgICAgICAgICAgICAgICAgID0gMTMsICAgICAgICAgICAgICAgICAgIC8qKjwgRGhjcCBWNiBDb21wbGV0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTlVfQ09OTkVDVElWSVRZX1NUQVRFX1NUQVJUX0NPTkZJR19GSUxFX0RPV05MT0FEICAgICAgPSAxNCwgICAgICAgICAgICAgICAgICAgLyoqPCBTdGFydCBDb25maWcgRmlsZSBEb3dubG9hZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTlVfQ09OTkVDVElWSVRZX1NUQVRFX0NPTkZJR19GSUxFX0RPV05MT0FEX0NPTVBMRVRFICAgPSAxNSwgICAgICAgICAgICAgICAgICAgLyoqPCBDb25maWcgRmlsZSBEb3dubG9hZCBDb21wbGV0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTlVfQ09OTkVDVElWSVRZX1NUQVRFX1NUQVJUX1JFR0lTVFJBVElPTiAgICAgICAgICAgICAgPSAxNiwgICAgICAgICAgICAgICAgICAgLyoqPCBTdGFydCBSZWdpc3RyYXRpb24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ05VX0NPTk5FQ1RJVklUWV9TVEFURV9GT1JXQVJESU5HX0RJU0FCTEVEICAgICAgICAgICAgID0gMTcsICAgICAgICAgICAgICAgICAgIC8qKjwgRm9yd2FyZGluZyBEaXNhYmxlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTlVfQ09OTkVDVElWSVRZX1NUQVRFX1JGX01VVEVfQUxMICAgICAgICAgICAgICAgICAgICAgPSAxOCAgICAgICAgICAgICAgICAgICAgLyoqPCBSZiBNdXRlIEFsbC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X2Nvbm5lY3Rpdml0eV9zdGF0ZTsKKworLyoqIFZlcnNpb24gb2YgRE9DU0lTIHRoYXQgQ05VIGlzIG9wZXJhdGluZyBpbiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9kb2NzaXNfdmVyc2lvbgoreworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NOVV9ET0NTSVNfVkVSU0lPTl9ET0NTSVMxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgICAgICAgICAvKio8IERvY3NpczEwLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NOVV9ET0NTSVNfVkVSU0lPTl9ET0NTSVMxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgICAgICAgICAvKio8IERvY3NpczExLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NOVV9ET0NTSVNfVkVSU0lPTl9ET0NTSVMyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgICAgICAgICAvKio8IERvY3NpczIwLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NOVV9ET0NTSVNfVkVSU0lPTl9ET0NTSVMzMCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQgICAgICAgICAgICAgICAgICAgICAvKio8IERvY3NpczMwLiAqLworfSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfZG9jc2lzX3ZlcnNpb247CisKKy8qKiBDTlUgSVAgQWRkcmVzcyBUeXBlcyAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9pcGFkZHJfdHlwZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NOVV9JUEFERFJfVFlQRV9VTktOT1dOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgICAgICAgICAvKio8IFVua25vd24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fQ05VX0lQQUREUl9UWVBFX0lQVjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAgICAgICAgIC8qKjwgSVB2NC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9DTlVfSVBBRERSX1RZUEVfSVBWNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgICAgICAgICAgLyoqPCBJUHY2LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NOVV9JUEFERFJfVFlQRV9JUFY0WiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgICAgICAgICAvKio8IElQdjR6LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NOVV9JUEFERFJfVFlQRV9JUFY2WiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgICAgICAgICAvKio8IElQdjZ6LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX0NOVV9JUEFERFJfVFlQRV9ETlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2ICAgICAgICAgICAgICAgICAgICAvKio8IEROUy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X2lwYWRkcl90eXBlOworCisvKiogQ01DIE9BTSBQRFUgb3Bjb2RlcyAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfb3Bjb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0RPV05TVFJFQU1fQ09ORklHX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgIC8qKjwgUmVxdWVzdCB0byBjb25maWd1cmUgZG93bnN0cmVhbSBjaGFubmVsKHMpICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0RPV05TVFJFQU1fQ09ORklHX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgIC8qKjwgUmVzcG9uc2UgdG8gY29uZmlndXJlIGRvd25zdHJlYW0gY2hhbm5lbChzKSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9ET1dOU1RSRUFNX0NPTkZJR19SRVFVRVNUICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAvKio8IFJlcXVlc3QgdG8gcmV0cmlldmUgY3VycmVudCBkb3duc3RyZWFtIGNoYW5uZWwocykgY29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9ET1dOU1RSRUFNX0NPTkZJR19SRVNQT05TRSAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAvKio8IFJlc3BvbnNlIHRvIHJldHJpZXZlIGN1cnJlbnQgZG93bnN0cmVhbSBjaGFubmVsKHMpIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfVVBTVFJFQU1fQ09ORklHX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgLyoqPCBSZXF1ZXN0IHRvIGNvbmZpZ3VyZSB1cHN0cmVhbSBjaGFubmVsKHMpICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX1VQU1RSRUFNX0NPTkZJR19SRVNQT05TRSAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgIC8qKjwgUmVzcG9uc2UgdG8gY29uZmlndXJlIHVwc3RyZWFtIGNoYW5uZWwocykgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfVVBTVFJFQU1fQ09ORklHX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAgICAgLyoqPCBSZXF1ZXN0IHRvIHJldHJpZXZlIGN1cnJlbnQgdXBzdHJlYW0gY2hhbm5lbChzKSBjb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1VQU1RSRUFNX0NPTkZJR19SRVNQT05TRSAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgICAgIC8qKjwgUmVzcG9uc2UgdG8gcmV0cmlldmUgY3VycmVudCB1cHN0cmVhbSBjaGFubmVsKHMpIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfTU9WRV9DTlVfRE9XTlNUUkVBTV9SRVFVRVNUICAgICAgICAgICAgICAgICAgICAgPSA5LCAgICAgICAgLyoqPCBSZXF1ZXN0IHRvIGNvbmZpZ3VyZSBDTlUgd2l0aCBhIHBhcnRpY3VsYXIgcHJpbWFyeSBkb3duc3RyZWFtIGNoYW5uZWwgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfTU9WRV9DTlVfRE9XTlNUUkVBTV9SRVNQT05TRSAgICAgICAgICAgICAgICAgICAgPSAxMCwgICAgICAgLyoqPCBSZXNwb25zZSB0byBjb25maWd1cmUgQ05VIHdpdGggYSBwYXJ0aWN1bGFyIHByaW1hcnkgZG93bnN0cmVhbSBjaGFubmVsICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX01PVkVfQ05VX0RPV05TVFJFQU1fUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgID0gMTEsICAgICAgIC8qKjwgUmVxdWVzdCB0byByZXRyaWV2ZSBDTlXigJlzIGN1cnJlbnQgcHJpbWFyeSBkb3duc3RyZWFtIGNoYW5uZWwgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTU9WRV9DTlVfRE9XTlNUUkVBTV9SRVNQT05TRSAgICAgICAgICAgICAgICAgICAgPSAxMiwgICAgICAgLyoqPCBSZXNwb25zZSB0byByZXRyaWV2ZSBDTlXigJlzIGN1cnJlbnQgcHJpbWFyeSBkb3duc3RyZWFtIGNoYW5uZWwgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfTU9WRV9DTlVfVVBTVFJFQU1fUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgPSAxMywgICAgICAgLyoqPCBSZXF1ZXN0IHRvIGNvbmZpZ3VyZSBDTlUgd2l0aCBhIHBhcnRpY3VsYXIgcHJpbWFyeSB1cHN0cmVhbSBjaGFubmVsICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX01PVkVfQ05VX1VQU1RSRUFNX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgID0gMTQsICAgICAgIC8qKjwgUmVzcG9uc2UgdG8gY29uZmlndXJlIENOVSB3aXRoIGEgcGFydGljdWxhciBwcmltYXJ5IHVwc3RyZWFtIGNoYW5uZWwgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTU9WRV9DTlVfVVBTVFJFQU1fUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgPSAxNSwgICAgICAgLyoqPCBSZXF1ZXN0IHRvIHJldHJpZXZlIENOVeKAmXMgY3VycmVudCBwcmltYXJ5IHVwc3RyZWFtIGNoYW5uZWwgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTU9WRV9DTlVfVVBTVFJFQU1fUkVTUE9OU0UgICAgICAgICAgICAgICAgICAgICAgPSAxNiwgICAgICAgLyoqPCBSZXNwb25zZSB0byByZXRyaWV2ZSBDTlXigJlzIGN1cnJlbnQgcHJpbWFyeSB1cHN0cmVhbSBjaGFubmVsICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX01BWF9VUFNUUkVBTV9SRkFUVEVOVUFUSU9OX1JFUVVFU1QgICAgICAgICAgICAgID0gMTcsICAgICAgIC8qKjwgUmVxdWVzdCB0byBzZXQgbWF4aW11bSBSRiBhdHRlbnVhdGlvbiBsZXZlbCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9NQVhfVVBTVFJFQU1fUkZBVFRFTlVBVElPTl9SRVNQT05TRSAgICAgICAgICAgICA9IDE4LCAgICAgICAvKio8IFJlc3BvbnNlIHRvIHNldCBtYXhpbXVtIFJGIGF0dGVudWF0aW9uIGxldmVsICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX01BWF9VUFNUUkVBTV9SRkFUVEVOVUFUSU9OX1JFUVVFU1QgICAgICAgICAgICAgID0gMTksICAgICAgIC8qKjwgUmVxdWVzdCB0byBnZXQgbWF4aW11bSBSRiBhdHRlbnVhdGlvbiBsZXZlbCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9NQVhfVVBTVFJFQU1fUkZBVFRFTlVBVElPTl9SRVNQT05TRSAgICAgICAgICAgICA9IDIwLCAgICAgICAvKio8IFJlc3BvbnNlIHRvIGdldCBtYXhpbXVtIFJGIGF0dGVudWF0aW9uIGxldmVsICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0NSRUFURV9MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVFVRVNUICAgICAgICAgICAgID0gMjEsICAgICAgIC8qKjwgUmVxdWVzdCBmb3IgY3JlYXRpbmcgYSBsb2FkIGJhbGFuY2luZyBncm91cCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9DUkVBVEVfTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVTUE9OU0UgICAgICAgICAgICA9IDIyLCAgICAgICAvKio8IFJlc3BvbnNlIGZvciBjcmVhdGluZyBhIGxvYWQgYmFsYW5jaW5nIGdyb3VwIHJlcXVlc3QgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBTX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgPSAyMywgICAgICAgLyoqPCBSZXF1ZXN0IHRvIGdldCBhIGxpc3Qgb2YgbG9hZCBiYWxhbmNpbmcgZ3JvdXBzICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQU19SRVNQT05TRSAgICAgICAgICAgICAgICAgID0gMjQsICAgICAgIC8qKjwgUmVzcG9uc2UgdG8gZ2V0IGxvYWQgYmFsYW5jaW5nIGdyb3VwcyByZXF1ZXN0ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0FERF9ET1dOU1RSRUFNU19UT19MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVFVRVNUID0gMjUsICAgICAgIC8qKjwgUmVxdWVzdCB0byBhZGQgZG93bnN0cmVhbXMgdG8gYSBsb2FkIGJhbGFuY2luZyBncm91cCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9BRERfRE9XTlNUUkVBTVNfVE9fTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVTUE9OU0U9IDI2LCAgICAgICAvKio8IFJlc3BvbnNlIHRvIGFkZCBkb3duc3RyZWFtcyB0byBhIGxvYWQgYmFsYW5jaW5nIGdyb3VwIHJlcXVlc3QgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBfRE9XTlNUUkVBTVNfUkVRVUVTVCAgICAgICAgPSAyNywgICAgICAgLyoqPCBSZXF1ZXN0IHRvIGdldCBsaXN0IG9mIGRvd25zdHJlYW1zIGluIGEgbG9hZCBiYWxhbmNpbmcgZ3JvdXAgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBfRE9XTlNUUkVBTVNfUkVTUE9OU0UgICAgICAgPSAyOCwgICAgICAgLyoqPCBSZXNwb25zZSB0byBnZXQgbGlzdCBvZiBkb3duc3RyZWFtcyBpbiBhIGxvYWQgYmFsYW5jaW5nIGdyb3VwIHJlcXVlc3QgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfQUREX1VQU1RSRUFNU19UT19MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVFVRVNUICAgPSAyOSwgICAgICAgLyoqPCBSZXF1ZXN0IHRvIGFkZCB1cHN0cmVhbXMgdG8gYSBsb2FkIGJhbGFuY2luZyBncm91cCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9BRERfVVBTVFJFQU1TX1RPX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFU1BPTlNFICA9IDMwLCAgICAgICAvKio8IFJlc3BvbnNlIHRvIGFkZCB1cHN0cmVhbXMgdG8gYSBsb2FkIGJhbGFuY2luZyBncm91cCByZXF1ZXN0ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQX1VQU1RSRUFNU19SRVFVRVNUICAgICAgICAgID0gMzEsICAgICAgIC8qKjwgUmVxdWVzdCB0byBnZXQgbGlzdCBvZiB1cHN0cmVhbXMgaW4gYSBsb2FkIGJhbGFuY2luZyBncm91cCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9VUFNUUkVBTVNfUkVTUE9OU0UgICAgICAgICA9IDMyLCAgICAgICAvKio8IFJlc3BvbnNlIHRvIGdldCBsaXN0IG9mIHVwc3RyZWFtcyBpbiBhIGxvYWQgYmFsYW5jaW5nIGdyb3VwIHJlcXVlc3QgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfQUREX0NOVVNfVE9fTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVRVUVTVCAgICAgICAgPSAzMywgICAgICAgLyoqPCBSZXF1ZXN0IHRvIGFkZCBDTlVzIHRvIGEgbG9hZCBiYWxhbmNpbmcgZ3JvdXAgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfQUREX0NOVVNfVE9fTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVTUE9OU0UgICAgICAgPSAzNCwgICAgICAgLyoqPCBSZXNwb25zZSB0byBhZGQgQ05VcyB0byBhIGxvYWQgYmFsYW5jaW5nIGdyb3VwIHJlcXVlc3QgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBfQ05VX0NPTkZJR1VSQVRJT05fUkVRVUVTVCAgPSAzNSwgICAgICAgLyoqPCBSZXF1ZXN0IHRvIGdldCBsb2FkIGJhbGFuY2luZyBncm91cCBDTlUgY29uZmlndXJhdGlvbiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9DTlVfQ09ORklHVVJBVElPTl9SRVNQT05TRSA9IDM2LCAgICAgICAvKio8IFJlc3BvbnNlIHRvIGdldCBsb2FkIGJhbGFuY2luZyBncm91cCBDTlUgY29uZmlndXJhdGlvbiByZXF1ZXN0ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0xPQURfQkFMQU5DSU5HX0dST1VQX0FDVElWRV9DTlVTX1JFUVVFU1QgICAgICAgID0gMzcsICAgICAgIC8qKjwgUmVxdWVzdCB0byBnZXQgdGhlIGFjdGl2ZSBsaXN0IG9mIENOVXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgbG9hZCBiYWxhbmNpbmcgZ3JvdXAgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfTE9BRF9CQUxBTkNJTkdfR1JPVVBfQUNUSVZFX0NOVVNfUkVTUE9OU0UgICAgICAgPSAzOCwgICAgICAgLyoqPCBSZXNwb25zZSB0byB0aGUgZ2V0IGFjdGl2ZSBsaXN0IG9mIENOVXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgbG9hZCBiYWxhbmNpbmcgZ3JvdXAgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9TRVRfRVhDTFVERV9DTlVTX0ZST01fTE9BRF9CQUxBTkNJTkdfUkVRVUVTVCAgICAgICAgPSAzOSwgICAgICAgLyoqPCBSZXF1ZXN0IHRvIGV4Y2x1ZGUgQ05VcyBmcm9tIGxvYWQgYmFsYW5jaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0VYQ0xVREVfQ05VU19GUk9NX0xPQURfQkFMQU5DSU5HX1JFU1BPTlNFICAgICAgID0gNDAsICAgICAgIC8qKjwgUmVzcG9uc2UgdG8gZXhjbHVkZSBDTlVzIGZyb20gbG9hZCBiYWxhbmNpbmcgcmVxdWVzdCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9FWENMVURFRF9DTlVTX0NPTkZJR1VSQVRJT05fUkVRVUVTVCAgICAgICAgICAgICA9IDQxLCAgICAgICAvKio8IFJlcXVlc3QgdG8gZ2V0IGV4Y2x1ZGVkIENOVXMgZnJvbSBsb2FkIGJhbGFuY2luZyBjb25maWd1cmF0aW9uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0VYQ0xVREVEX0NOVV9DT05GSUdVUkFUSU9OX1JFU1BPTlNFICAgICAgICAgICAgID0gNDIsICAgICAgIC8qKjwgUmVzcG9uc2UgdG8gZ2V0IGV4Y2x1ZGVkIENOVXMgZnJvbSBsb2FkIGJhbGFuY2luZyBjb25maWd1cmF0aW9uIHJlcXVlc3QgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRVhDTFVERURfQUNUSVZFX0NOVVNfUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgPSA0MywgICAgICAgLyoqPCBSZXF1ZXN0IHRvIGdldCB0aGUgYWN0aXZlIGV4Y2x1ZGVkIENOVXMgZnJvbSBsb2FkIGJhbGFuY2luZyBsaXN0ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0VYQ0xVREVEX0FDVElWRV9DTlVTX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgID0gNDQsICAgICAgIC8qKjwgUmVzcG9uc2UgdG8gZ2V0IGFjdGl2ZSBleGNsdWRlZCBDTlVzIGZyb20gbG9hZCBiYWxhbmNpbmcgcmVxdWVzdCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9GVUxMX0xPQURfQkFMQU5DSU5HX0dST1VQX1JFUVVFU1QgICAgICAgICAgICAgICA9IDQ1LCAgICAgICAvKio8IFJlcXVlc3QgdG8gY29uZmlndXJlIHRoZSBzcGVjaWZpZWQgTG9hZCBCYWxhbmNpbmcgZ3JvdXBzICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX0ZVTExfTE9BRF9CQUxBTkNJTkdfR1JPVVBfUkVTUE9OU0UgICAgICAgICAgICAgID0gNDYsICAgICAgIC8qKjwgUmVzcG9uc2UgdG8gY29uZmlndXJhdGlvbiByZXF1ZXN0IGZvciBMb2FkIEJhbGFuY2luZyBncm91cHMgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRlVMTF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVFVRVNUICAgICAgICAgICAgICAgPSA0NywgICAgICAgLyoqPCBSZXF1ZXN0IHRvIHJldHJpZXZlIGRldGFpbGVkIGFjdGl2ZSBMb2FkIEJhbGFuY2luZyBHcm91cHMgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfRlVMTF9MT0FEX0JBTEFOQ0lOR19HUk9VUF9SRVNQT05TRSAgICAgICAgICAgICAgPSA0OCwgICAgICAgLyoqPCBSZXNwb25zZSB0byByZXRyaWV2ZSBkZXRhaWxlZCBhY3RpdmUgTG9hZCBCYWxhbmNpbmcgR3JvdXBzICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfU0VUX1VQU1RSRUFNX0lOUFVUX1BPV0VSX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgID0gNDksICAgICAgIC8qKjwgUmVxdWVzdCB0byBjb25maWd1cmUgdXBzdHJlYW0gY2hhbm5lbCBpbnB1dCBwb3dlciBsZXZlbCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1NFVF9VUFNUUkVBTV9JTlBVVF9QT1dFUl9SRVNQT05TRSAgICAgICAgICAgICAgICAgICA9IDUwLCAgICAgICAvKio8IFJlc3BvbnNlIHRvIGNvbmZpZ3VyZSB1cHN0cmVhbSBjaGFubmVsIGlucHV0IHBvd2VyIGxldmVsICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1VQU1RSRUFNX0lOUFVUX1BPV0VSX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgID0gNTEsICAgICAgIC8qKjwgUmVxdWVzdCB0byByZXRyaWV2ZSB1cHN0cmVhbSBpbnB1dCBwb3dlciBsZXZlbCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9VUFNUUkVBTV9JTlBVVF9QT1dFUl9SRVNQT05TRSAgICAgICAgICAgICAgICAgICA9IDUyLCAgICAgICAvKio8IFJlc3BvbnNlIHRvIHJldHJpZXZlIHVwc3RyZWFtIGlucHV0IHBvd2VyIGxldmVsICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0NOVV9TVEFUVVNfUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTc5MywgICAgIC8qKjwgUmVxdWVzdCB0byByZXRyaWV2ZSBDTlUgc3RhdHVzIGluZm9ybWF0aW9uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0NOVV9TVEFUVVNfUkVTUE9OU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTc5NCwgICAgIC8qKjwgUmVzcG9uc2UgdG8gcmV0cmlldmUgQ05VIHN0YXR1cyBpbmZvcm1hdGlvbiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9DTUNfSU5URVJGQUNFU19SRVFVRVNUICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3OTUsICAgICAvKio8IFJlcXVlc3QgdG8gcmV0cmlldmUgQ01DIGludGVyZmFjZSBhdHRyaWJ1dGVzICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0NNQ19JTlRFUkZBQ0VTX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgICAgID0gMTc5NiwgICAgIC8qKjwgUmVzcG9uc2UgdG8gcmV0cmlldmUgQ01DIGludGVyZmFjZSBhdHRyaWJ1dGVzICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0NNQ19NQUNfU1RBVElTVElDU19SRVFVRVNUICAgICAgICAgICAgICAgICAgICAgID0gMTc5NywgICAgIC8qKjwgUmVxdWVzdCB0byByZXRyaWV2ZSBDTUMgTUFDIHN0YXRpc3RpY3MgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfQ01DX01BQ19TVEFUSVNUSUNTX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgPSAxNzk4LCAgICAgLyoqPCBSZXNwb25zZSB0byByZXRyaWV2ZSBDTUMgTUFDIHN0YXRpc3RpY3MgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfU0VSVklDRVNfUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNzk5LCAgICAgLyoqPCBSZXF1ZXN0IHRvIHJldHJpZXZlIFVwc3RyZWFtIHNlcnZpY2UgYXR0cmlidXRlcyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9TRVJWSUNFU19SRVNQT05TRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4MDAsICAgICAvKio8IFJlc3BvbnNlIHRvIHJldHJpZXZlIFVwc3RyZWFtIHNlcnZpY2UgYXR0cmlidXRlcyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9TSUdOQUxfUVVBTElUWV9SRVFVRVNUICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4MDEsICAgICAvKio8IFJlcXVlc3QgdG8gcmV0cmlldmUgVXBzdHJlYW0gUEhZIFNpZ25hbCBRdWFsaXR5IGRhdGEgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfU0lHTkFMX1FVQUxJVFlfUkVTUE9OU0UgICAgICAgICAgICAgICAgICAgICAgICAgPSAxODAyLCAgICAgLyoqPCBSZXNwb25zZSB0byByZXRyaWV2ZSBVcHN0cmVhbSBQSFkgU2lnbmFsIFF1YWxpdHkgZGF0YSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9DTUNfSU5URVJGQUNFU19TVEFUSVNUSUNTX1JFUVVFU1QgICAgICAgICAgICAgICA9IDE4MDMsICAgICAvKio8IFJlcXVlc3QgdG8gcmV0cmlldmUgQ01DIGludGVyZmFjZSBzdGF0aXN0aWNzICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0NNQ19JTlRFUkZBQ0VTX1NUQVRJU1RJQ1NfUkVTUE9OU0UgICAgICAgICAgICAgID0gMTgwNCwgICAgIC8qKjwgUmVzcG9uc2UgdG8gcmV0cmlldmUgQ01DIGludGVyZmFjZSBzdGF0aXN0aWNzICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0RPV05TVFJFQU1fQk9ORElOR19HUk9VUF9TVEFUVVNfUkVRVUVTVCAgICAgICAgID0gMTgwNSwgICAgIC8qKjwgUmVxdWVzdCB0byByZXRyaWV2ZSBEb3duc3RyZWFtIEJvbmRpbmcgR3JvdXAgc3RhdHVzIGluZm9ybWF0aW9uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX0RPV05TVFJFQU1fQk9ORElOR19HUk9VUF9TVEFUVVNfUkVTUE9OU0UgICAgICAgID0gMTgwNiwgICAgIC8qKjwgUmVzcG9uc2UgdG8gcmV0cmlldmUgRG93bnN0cmVhbSBCb25kaW5nIEdyb3VwIHN0YXR1cyBpbmZvcm1hdGlvbiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9VUFNUUkVBTV9CT05ESU5HX0dST1VQX1NUQVRVU19SRVFVRVNUICAgICAgICAgICA9IDE4MDcsICAgICAvKio8IFJlcXVlc3QgdG8gcmV0cmlldmUgVXBzdHJlYW0gQm9uZGluZyBHcm91cCBzdGF0dXMgaW5mb3JtYXRpb24gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfVVBTVFJFQU1fQk9ORElOR19HUk9VUF9TVEFUVVNfUkVTUE9OU0UgICAgICAgICAgPSAxODA4LCAgICAgLyoqPCBSZXNwb25zZSB0byByZXRyaWV2ZSBVcHN0cmVhbSBCb25kaW5nIEdyb3VwIHN0YXR1cyBpbmZvcm1hdGlvbiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9RT1NfU0VSVklDRV9GTE9XX0NPTkZJR19SRVFVRVNUICAgICAgICAgICAgICAgICA9IDE4MDksICAgICAvKio8IFJlcXVlc3QgdG8gcmV0cmlldmUgZGF0YSBmb3IgY29uZmlndXJlZCBRb1Mgc2VydmljZSBmbG93cyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9RT1NfU0VSVklDRV9GTE9XX0NPTkZJR19SRVNQT05TRSAgICAgICAgICAgICAgICA9IDE4MTAsICAgICAvKio8IFJlc3BvbnNlIHRvIHJldHJpZXZlIGRhdGEgZm9yIGNvbmZpZ3VyZWQgUW9TIHNlcnZpY2UgZmxvd3MgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfUU9TX1NFUlZJQ0VfRkxPV19TVEFUSVNUSUNTX1JFUVVFU1QgICAgICAgICAgICAgPSAxODExLCAgICAgLyoqPCBSZXF1ZXN0IHRvIHJldHJpZXZlIHNlcnZpY2UgZmxvdyBzdGF0aXN0aWNzICovCisgICAgQkNNT0xUX0VQT05fT0FNX0JSQ01fT0FNX1BEVV9PUENPREVfR0VUX1FPU19TRVJWSUNFX0ZMT1dfU1RBVElTVElDU19SRVNQT05TRSAgICAgICAgICAgID0gMTgxMiwgICAgIC8qKjwgUmVzcG9uc2UgdG8gcmV0cmlldmUgc2VydmljZSBmbG93IHN0YXRpc3RpY3MgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9HRVRfUU9TX1BBQ0tFVF9DTEFTU0lGSUVSX0NPTkZJR19SRVFVRVNUICAgICAgICAgICAgPSAxODEzLCAgICAgLyoqPCBSZXF1ZXN0IHRvIHJldHJpZXZlIGRhdGEgZm9yIHBhY2tldCBjbGFzc2lmaWNhdGlvbiBydWxlcyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX0dFVF9RT1NfUEFDS0VUX0NMQVNTSUZJRVJfQ09ORklHX1JFU1BPTlNFICAgICAgICAgICA9IDE4MTQsICAgICAvKio8IFJlc3BvbnNlIHRvIHJldHJpZXZlIGRhdGEgZm9yIHBhY2tldCBjbGFzc2lmaWNhdGlvbiBydWxlcyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9CUkNNX09BTV9QRFVfT1BDT0RFX1JFR19SU1BfRVZFTlRfTUVTU0FHRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQwOTYsICAgICAvKio8IEF1dG9ub21vdXMgZXZlbnQgdG8gcmVwb3J0IGEgUkVHLVJTUCBhc3NvY2lhdGVkIHdpdGggYSBDTlUgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQlJDTV9PQU1fUERVX09QQ09ERV9DTUNfU1lTVEVNX0VWRU5UX01FU1NBR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MDk3ICAgICAgLyoqPCBBdXRvbm9tb3VzIGV2ZW50IHRvIHJlcG9ydCBhIENNQyBTeXN0ZW0gbWVzc2FnZSAqLworfSBiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X29wY29kZTsKKworLyoqIENsb2NrIFRyYW5zcG9ydCBLZXkuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2Nsb2NrX3RyYW5zcG9ydF9rZXkKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ0xPQ0tfVFJBTlNQT1JUX0tFWV9BTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgLyoqPCBBbGwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NMT0NLX1RSQU5TUE9SVF9LRVlfSU5JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgIC8qKjwgSW5pdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ0xPQ0tfVFJBTlNQT1JUX0tFWV9UT0RfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgLyoqPCBUT0QgRW5hYmxlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DTE9DS19UUkFOU1BPUlRfS0VZX1BQU19FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAvKio8IDFQUFMgRW5hYmxlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DTE9DS19UUkFOU1BPUlRfS0VZX0FESlVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAvKio8IEFkanVzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ0xPQ0tfVFJBTlNQT1JUX0tFWV9QT05fUkFOR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgLyoqPCBQT04gUmFuZ2UuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NMT0NLX1RSQU5TUE9SVF9LRVlfRkFLRV9NUENQX0pVTVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgIC8qKjwgRmFrZSBNUENQIEp1bXAuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NMT0NLX1RSQU5TUE9SVF9LRVlfSEFMRl9QRVJJT0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNyAgICAgICAgIC8qKjwgSGFsZiBQZXJpb2QuICovCit9IGJjbW9sdF9lcG9uX29hbV9jbG9ja190cmFuc3BvcnRfa2V5OworCisvKiogVmFyIExlYWYgQWN0aW9uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hY3Rpb24KK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BQ19JTklUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgLyoqPCBNQUMgSW5pdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BQ19BRERfR1JPVVBfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgLyoqPCBNQUMgQWRkIEdyb3VwIEFkZHJlc3MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9NQUNfREVMX0dST1VQX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgIC8qKjwgTUFDIERlbCBHcm91cCBBZGRyZXNzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fTUFDX1NFTEZfVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAvKio8IE1BQyBTZWxmIFRlc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9QSFlfQURNSU5fQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgIC8qKjwgUEhZIEFkbWluIENvbnRyb2wuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9SUFRfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgIC8qKjwgUmVwb3J0IFJlc2V0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fUlBUX0lOX1NFUlZJQ0VfVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAvKio8IFJlcG9ydCBJbiBTZXJ2aWNlIFRlc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FDVElPTl9QT1JUX0FETUlOX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgICAgIC8qKjwgUG9ydCBBZG1pbiBDb250cm9sLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fTUFVX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgICAgICAvKio8IE1BVSBSZXNldC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX01BVV9BRE1JTl9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwgICAgICAgLyoqPCBNQVUgQWRtaW4gQ29udHJvbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQUNUSU9OX0FVVE9fUkVORUdPVElBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAgICAgLyoqPCBBdXRvIFJlbmVnb3RpYXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BQ1RJT05fQVVUT19BRE1JTl9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyICAgICAgICAvKio8IEF1dG8gQWRtaW4gQ29udHJvbC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2FjdGlvbjsKKworLyoqIENUQyBFbmFibGVkIFN0YXRlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfZW5hYmxlZF9zdGF0ZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfRU5BQkxFRF9TVEFURV9ESVNBQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAvKio8IERpc2FibGVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfRU5BQkxFRF9TVEFURV9FTkFCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAvKio8IEVuYWJsZWQuICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfZW5hYmxlZF9zdGF0ZTsKKworLyoqIENUQyBBY3RpdmF0aW9uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfYWN0aXZhdGlvbgoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfQUNUSVZBVElPTl9ERUFDVElWQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAvKio8IERlYWN0aXZhdGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19BQ1RJVkFUSU9OX0FDVElWQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgIC8qKjwgQWN0aXZhdGUuICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfYWN0aXZhdGlvbjsKKworLyoqIENUQyBMZWFmIE1hbmFnZW1lbnQgT2JqZWN0LiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9tYW5hZ2VtZW50X29iamVjdAoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9NQU5BR0VNRU5UX09CSkVDVF9QT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAvKio8IFBvcnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX01BTkFHRU1FTlRfT0JKRUNUX0NBUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgIC8qKjwgQ2FyZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfTUFOQUdFTUVOVF9PQkpFQ1RfTExJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgLyoqPCBMTElELiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9NQU5BR0VNRU5UX09CSkVDVF9QT05fSUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAvKio8IFBPTiBJL0YuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX01BTkFHRU1FTlRfT0JKRUNUX09OVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjU1MzVVICAgIC8qKjwgT05VLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfbWFuYWdlbWVudF9vYmplY3Q7CisKKy8qKiBDVEMgT05VIEFsYXJtIElEIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfYWxhcm1faWQKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfRVFVSVBNRU5UX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgLyoqPCBPTlUgRXF1aXBtZW50IEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX1BPV0VSX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgIC8qKjwgT05VIFBvd2VyIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX0JBVFRFUllfTUlTU0lORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgIC8qKjwgT05VIEJhdHRlcnkgTWlzc2luZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9CQVRURVJZX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAvKio8IE9OVSBCYXR0ZXJ5IEZhaWx1cmUgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfQkFUVEVSWV9WT0xUX0xPVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgLyoqPCBPTlUgQmF0dGVyeSBWb2x0IExvdyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9QSFlTSUNBTF9JTlNUUlVDVElPTl9BTEFSTSAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAvKio8IE9udSBQaHlzaWNhbCBJbnN0cnVjdGlvbiBBbGFybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9TRUxGX1RFU1RfRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAvKio8IE9udSBTZWxmIFRlc3QgRmFpbHVyZSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9URU1QX0hJR0hfQUxBUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgICAgICAvKio8IE9udSBUZW1wIEhpZ2ggQWxhcm0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfVEVNUF9MT1dfQUxBUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwgICAgICAgLyoqPCBPbnUgVGVtcCBMb3cgQWxhcm0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9PTlVfSUFEX0NPTk5FQ1RJT05fRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAgICAgLyoqPCBPbnUgSWFkIENvbm5lY3Rpb24gRmFpbHVyZSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX09OVV9QT05fSUZfU1dJVENIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyLCAgICAgICAvKio8IE9udSBQb24gSWYgU3dpdGNoICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfT05VX1NMRUVQX1NUQVRVU19VUERBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMsICAgICAgIC8qKjwgT251IFNsZWVwIFN0YXR1cyBVcGRhdGUgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfUlhfUE9XRVJfSElHSF9BTEFSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTcsICAgICAgLyoqPCBQb24gSWYgUnggUG93ZXIgSGlnaCBBbGFybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9SWF9QT1dFUl9MT1dfQUxBUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1OCwgICAgICAvKio8IFBvbiBJZiBSeCBQb3dlciBMb3cgQWxhcm0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVFhfUE9XRVJfSElHSF9BTEFSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTksICAgICAgLyoqPCBQb24gSWYgVHggUG93ZXIgSGlnaCBBbGFybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9UWF9QT1dFUl9MT1dfQUxBUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2MCwgICAgICAvKio8IFBvbiBJZiBUeCBQb3dlciBMb3cgQWxhcm0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVFhfQklBU19ISUdIX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNjEsICAgICAgLyoqPCBQb24gSWYgVHggQmlhcyBIaWdoIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RYX0JJQVNfTE9XX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjYyLCAgICAgIC8qKjwgUG9uIElmIFR4IEJpYXMgTG93IEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1ZDQ19ISUdIX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjYzLCAgICAgIC8qKjwgUG9uIElmIFZjYyBIaWdoIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1ZDQ19MT1dfQUxBUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjY0LCAgICAgIC8qKjwgUG9uIElmIFZjYyBMb3cgQWxhcm0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVEVNUF9ISUdIX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNjUsICAgICAgLyoqPCBQb24gSWYgVGVtcCBIaWdoIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1RFTVBfTE9XX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjY2LCAgICAgIC8qKjwgUG9uIElmIFRlbXAgTG93IEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1JYX1BPV0VSX0hJR0hfV0FSTklORyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjY3LCAgICAgIC8qKjwgUG9uIElmIFJ4IFBvd2VyIEhpZ2ggV2FybmluZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9SWF9QT1dFUl9MT1dfV0FSTklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2OCwgICAgICAvKio8IFBvbiBJZiBSeCBQb3dlciBMb3cgV2FybmluZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9UWF9QT1dFUl9ISUdIX1dBUk5JTkcgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2OSwgICAgICAvKio8IFBvbiBJZiBUeCBQb3dlciBIaWdoIFdhcm5pbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVFhfUE9XRVJfTE9XX1dBUk5JTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNzAsICAgICAgLyoqPCBQb24gSWYgVHggUG93ZXIgTG93IFdhcm5pbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVFhfQklBU19ISUdIX1dBUk5JTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNzEsICAgICAgLyoqPCBQb24gSWYgVHggQmlhcyBIaWdoIFdhcm5pbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVFhfQklBU19MT1dfV0FSTklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNzIsICAgICAgLyoqPCBQb24gSWYgVHggQmlhcyBMb3cgV2FybmluZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9WQ0NfSElHSF9XQVJOSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI3MywgICAgICAvKio8IFBvbiBJZiBWY2MgSGlnaCBXYXJuaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1ZDQ19MT1dfV0FSTklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjc0LCAgICAgIC8qKjwgUG9uIElmIFZjYyBMb3cgV2FybmluZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9URU1QX0hJR0hfV0FSTklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI3NSwgICAgICAvKio8IFBvbiBJZiBUZW1wIEhpZ2ggV2FybmluZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9URU1QX0xPV19XQVJOSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI3NiwgICAgICAvKio8IFBvbiBJZiBUZW1wIExvdyBXYXJuaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fRFJPUF9FVkVOVFNfQUxBUk0gICAgICAgICAgICAgICAgICAgID0gMjc3LCAgICAgIC8qKjwgUG9uIElmIERvd25zdHJlYW0gRHJvcCBFdmVudHMgQWxhcm0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fRFJPUF9FVkVOVFNfQUxBUk0gICAgICAgICAgICAgICAgICAgICAgPSAyNzgsICAgICAgLyoqPCBQb24gSWYgVXBzdHJlYW0gRHJvcCBFdmVudHMgQWxhcm0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9DUkNfRVJST1JfRlJBTUVTX0FMQVJNICAgICAgICAgICAgICAgPSAyNzksICAgICAgLyoqPCBQb24gSWYgRG93bnN0cmVhbSBDUkMgRXJyb3IgRnJhbWVzIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfQUxBUk0gICAgICAgICAgICAgICAgID0gMjgwLCAgICAgIC8qKjwgUG9uIElmIFVwc3RyZWFtIENSQyBFcnJvciBGcmFtZXMgQWxhcm0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX0FMQVJNICAgICAgICAgICAgICAgPSAyODEsICAgICAgLyoqPCBQb24gSWYgRG93bnN0cmVhbSBVbmRlcnNpemUgRnJhbWVzIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX1VOREVSU0laRV9GUkFNRVNfQUxBUk0gICAgICAgICAgICAgICAgID0gMjgyLCAgICAgIC8qKjwgUG9uIElmIFVwc3RyZWFtIFVuZGVyc2l6ZSBGcmFtZXMgQWxhcm0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9PVkVSU0laRV9GUkFNRVNfQUxBUk0gICAgICAgICAgICAgICAgPSAyODMsICAgICAgLyoqPCBQb24gSWYgRG93bnN0cmVhbSBPdmVyc2l6ZSBGcmFtZXMgQWxhcm0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fT1ZFUlNJWkVfRlJBTUVTX0FMQVJNICAgICAgICAgICAgICAgICAgPSAyODQsICAgICAgLyoqPCBQb24gSWYgVXBzdHJlYW0gT3ZlcnNpemUgRnJhbWVzIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fRlJBR01FTlRTX0FMQVJNICAgICAgICAgICAgICAgICAgICAgID0gMjg1LCAgICAgIC8qKjwgUG9uIElmIERvd25zdHJlYW0gRnJhZ21lbnRzIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0ZSQUdNRU5UU19BTEFSTSAgICAgICAgICAgICAgICAgICAgICAgID0gMjg2LCAgICAgIC8qKjwgUG9uIElmIFVwc3RyZWFtIEZyYWdtZW50cyBBbGFybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0pBQkJFUlNfQUxBUk0gICAgICAgICAgICAgICAgICAgICAgICA9IDI4NywgICAgICAvKio8IFBvbiBJZiBEb3duc3RyZWFtIEphYmJlcnMgQWxhcm0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fSkFCQkVSU19BTEFSTSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyODgsICAgICAgLyoqPCBQb24gSWYgVXBzdHJlYW0gSmFiYmVycyBBbGFybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0RJU0NBUkRTX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICA9IDI4OSwgICAgICAvKio8IFBvbiBJZiBEb3duc3RyZWFtIERpc2NhcmRzIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0RJU0NBUkRTX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgID0gMjkwLCAgICAgIC8qKjwgUG9uIElmIFVwc3RyZWFtIERpc2NhcmRzIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fRVJST1JTX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgID0gMjkxLCAgICAgIC8qKjwgUG9uIElmIERvd25zdHJlYW0gRXJyb3JzIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0VSUk9TX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjkyLCAgICAgIC8qKjwgUG9uIElmIFVwc3RyZWFtIEVycm9zIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fRFJPUF9FVkVSTlRTX1dBUk5JTkcgICAgICAgICAgICAgICAgID0gMjkzLCAgICAgIC8qKjwgUG9uIElmIERvd25zdHJlYW0gRHJvcCBFdmVybnRzIFdhcm5pbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fRFJPUF9FVkVOVFNfV0FSTklORyAgICAgICAgICAgICAgICAgICAgPSAyOTQsICAgICAgLyoqPCBQb24gSWYgVXBzdHJlYW0gRHJvcCBFdmVudHMgV2FybmluZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0NSQ19FUlJPUl9GUkFNRVNfV0FSTklORyAgICAgICAgICAgICA9IDI5NSwgICAgICAvKio8IFBvbiBJZiBEb3duc3RyZWFtIENSQyBFcnJvciBGcmFtZXMgV2FybmluZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9DUkNfRVJST1JfRlJBTUVTX1dBUk5JTkcgICAgICAgICAgICAgICA9IDI5NiwgICAgICAvKio8IFBvbiBJZiBVcHN0cmVhbSBDUkMgRXJyb3IgRnJhbWVzIFdhcm5pbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX1dBUk5JTkcgICAgICAgICAgICAgPSAyOTcsICAgICAgLyoqPCBQb24gSWYgRG93bnN0cmVhbSBVbmRlcnNpemUgRnJhbWVzIFdhcm5pbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fVU5ERVJTSVpFX0ZSQU1FU19XQVJOSU5HICAgICAgICAgICAgICAgPSAyOTgsICAgICAgLyoqPCBQb24gSWYgVXBzdHJlYW0gVW5kZXJzaXplIEZyYW1lcyBXYXJuaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX0RPV05TVFJFQU1fT1ZFUlNJWkVfRlJBTUVTX1dBUk5JTkcgICAgICAgICAgICAgID0gMjk5LCAgICAgIC8qKjwgUG9uIElmIERvd25zdHJlYW0gT3ZlcnNpemUgRnJhbWVzIFdhcm5pbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfVVBTVFJFQU1fT1ZFUlNJWkVfRlJBTUVTX1dBUk5JTkcgICAgICAgICAgICAgICAgPSAzMDAsICAgICAgLyoqPCBQb24gSWYgVXBzdHJlYW0gT3ZlcnNpemUgRnJhbWVzIFdhcm5pbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9GUkFHTUVOVFNfV0FSTklORyAgICAgICAgICAgICAgICAgICAgPSAzMDEsICAgICAgLyoqPCBQb24gSWYgRG93bnN0cmVhbSBGcmFnbWVudHMgV2FybmluZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9GUkFHTUVOVFNfV0FSTklORyAgICAgICAgICAgICAgICAgICAgICA9IDMwMiwgICAgICAvKio8IFBvbiBJZiBVcHN0cmVhbSBGcmFnbWVudHMgV2FybmluZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9ET1dOU1RSRUFNX0pBQkJFUlNfV0FSTklORyAgICAgICAgICAgICAgICAgICAgICA9IDMwMywgICAgICAvKio8IFBvbiBJZiBEb3duc3RyZWFtIEphYmJlcnMgV2FybmluZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9KQUJCRVJTX1dBUk5JTkcgICAgICAgICAgICAgICAgICAgICAgICA9IDMwNCwgICAgICAvKio8IFBvbiBJZiBVcHN0cmVhbSBKYWJiZXJzIFdhcm5pbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9ESVNDQVJEU19XQVJOSU5HICAgICAgICAgICAgICAgICAgICAgPSAzMDUsICAgICAgLyoqPCBQb24gSWYgRG93bnN0cmVhbSBEaXNjYXJkcyBXYXJuaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9OX0lGX1VQU1RSRUFNX0RJU0NBUkRTX1dBUk5JTkcgICAgICAgICAgICAgICAgICAgICAgID0gMzA2LCAgICAgIC8qKjwgUG9uIElmIFVwc3RyZWFtIERpc2NhcmRzIFdhcm5pbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT05fSUZfRE9XTlNUUkVBTV9FUlJPUlNfV0FSTklORyAgICAgICAgICAgICAgICAgICAgICAgPSAzMDcsICAgICAgLyoqPCBQb24gSWYgRG93bnN0cmVhbSBFcnJvcnMgV2FybmluZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPTl9JRl9VUFNUUkVBTV9FUlJPU19XQVJOSU5HICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMwOCwgICAgICAvKio8IFBvbiBJZiBVcHN0cmVhbSBFcnJvcyBXYXJuaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfQ0FSRF9BTEFSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTEzLCAgICAgIC8qKjwgQ2FyZCBBbGFybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0NBUkRfU0VMRl9URVNUX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUxNCwgICAgICAvKio8IENhcmQgU2VsZiBUZXN0IEZhaWx1cmUgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9FVEhfUE9SVF9BVVRPX05FR19GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3NjksICAgICAgLyoqPCBFdGggUG9ydCBBdXRvIE5lZyBGYWlsdXJlICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfRVRIX1BPUlRfTE9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzcwLCAgICAgIC8qKjwgRXRoIFBvcnQgTG9zICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfRVRIX1BPUlRfRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzcxLCAgICAgIC8qKjwgRXRoIFBvcnQgRmFpbHVyZSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX0VUSF9QT1JUX0xPT1BCQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc3MiwgICAgICAvKio8IEV0aCBQb3J0IExvb3BiYWNrICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfRVRIX1BPUlRfQ09OR0VTVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzczLCAgICAgIC8qKjwgRXRoIFBvcnQgQ29uZ2VzdGlvbiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9EUk9QX0VWRU5UU19BTEFSTSAgICAgICAgICAgICAgICAgICAgICA9IDc3NCwgICAgICAvKio8IFBvcnQgRG93bnN0cmVhbSBEcm9wIEV2ZW50cyBBbGFybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRFJPUF9FVkVOVFNfQUxBUk0gICAgICAgICAgICAgICAgICAgICAgICA9IDc3NSwgICAgICAvKio8IFBvcnQgVXBzdHJlYW0gRHJvcCBFdmVudHMgQWxhcm0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fQ1JDX0VSUk9SX0ZSQU1FU19BTEFSTSAgICAgICAgICAgICAgICAgPSA3NzYsICAgICAgLyoqPCBQb3J0IERvd25zdHJlYW0gQ1JDIEVycm9yIEZyYW1lcyBBbGFybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fQ1JDX0VSUk9SX0ZSQU1FU19BTEFSTSAgICAgICAgICAgICAgICAgICA9IDc3NywgICAgICAvKio8IFBvcnQgVXBzdHJlYW0gQ1JDIEVycm9yIEZyYW1lcyBBbGFybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX0FMQVJNICAgICAgICAgICAgICAgICA9IDc3OCwgICAgICAvKio8IFBvcnQgRG93bnN0cmVhbSBVbmRlcnNpemUgRnJhbWVzIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX0FMQVJNICAgICAgICAgICAgICAgICAgID0gNzc5LCAgICAgIC8qKjwgUG9ydCBVcHN0cmVhbSBVbmRlcnNpemUgRnJhbWVzIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX09WRVJTSVpFX0ZSQU1FU19BTEFSTSAgICAgICAgICAgICAgICAgID0gNzgwLCAgICAgIC8qKjwgUG9ydCBEb3duc3RyZWFtIE92ZXJzaXplIEZyYW1lcyBBbGFybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fT1ZFUlNJWkVfRlJBTUVTX0FMQVJNICAgICAgICAgICAgICAgICAgICA9IDc4MSwgICAgICAvKio8IFBvcnQgVXBzdHJlYW0gT3ZlcnNpemUgRnJhbWVzIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0ZSQUdNRU5UU19BTEFSTSAgICAgICAgICAgICAgICAgICAgICAgID0gNzgyLCAgICAgIC8qKjwgUG9ydCBEb3duc3RyZWFtIEZyYWdtZW50cyBBbGFybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRlJBR01FTlRTX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc4MywgICAgICAvKio8IFBvcnQgVXBzdHJlYW0gRnJhZ21lbnRzIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0pBQkJFUlNfQUxBUk0gICAgICAgICAgICAgICAgICAgICAgICAgID0gNzg0LCAgICAgIC8qKjwgUG9ydCBEb3duc3RyZWFtIEphYmJlcnMgQWxhcm0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0pBQkJFUlNfQUxBUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3ODUsICAgICAgLyoqPCBQb3J0IFVwc3RyZWFtIEphYmJlcnMgQWxhcm0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fRElTQ0FSRFNfQUxBUk0gICAgICAgICAgICAgICAgICAgICAgICAgPSA3ODYsICAgICAgLyoqPCBQb3J0IERvd25zdHJlYW0gRGlzY2FyZHMgQWxhcm0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0RJU0NBUkRTX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3ODcsICAgICAgLyoqPCBQb3J0IFVwc3RyZWFtIERpc2NhcmRzIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0VSUk9SU19BTEFSTSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzg4LCAgICAgIC8qKjwgUG9ydCBEb3duc3RyZWFtIEVycm9ycyBBbGFybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfVVBTVFJFQU1fRVJST1JTX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc4OSwgICAgICAvKio8IFBvcnQgVXBzdHJlYW0gRXJyb3JzIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9TVEFUVVNfQ0hBTkdFX1RJTUVTX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgID0gNzkwLCAgICAgIC8qKjwgUG9ydCBTdGF0dXMgQ2hhbmdlIFRpbWVzIEFsYXJtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0RST1BfRVZFTlRTX1dBUk5JTkcgICAgICAgICAgICAgICAgICAgID0gNzkxLCAgICAgIC8qKjwgUG9ydCBEb3duc3RyZWFtIERyb3AgRXZlbnRzIFdhcm5pbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0RST1BfRVZFTlRTX1dBUk5JTkcgICAgICAgICAgICAgICAgICAgICAgPSA3OTIsICAgICAgLyoqPCBQb3J0IFVwc3RyZWFtIERyb3AgRXZlbnRzIFdhcm5pbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fQ1JDX0VSUk9SX0ZSQU1FU19XQVJOSU5HICAgICAgICAgICAgICAgPSA3OTMsICAgICAgLyoqPCBQb3J0IERvd25zdHJlYW0gQ1JDIEVycm9yIEZyYW1lcyBXYXJuaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9DUkNfRVJST1JfRlJBTUVTX1dBUk5JTkcgICAgICAgICAgICAgICAgID0gNzk0LCAgICAgIC8qKjwgUG9ydCBVcHN0cmVhbSBDUkMgRXJyb3IgRnJhbWVzIFdhcm5pbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fVU5ERVJTSVpFX0ZSQU1FU19XQVJOSU5HICAgICAgICAgICAgICAgPSA3OTUsICAgICAgLyoqPCBQb3J0IERvd25zdHJlYW0gVW5kZXJzaXplIEZyYW1lcyBXYXJuaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9VTkRFUlNJWkVfRlJBTUVTX1dBUk5JTkcgICAgICAgICAgICAgICAgID0gNzk2LCAgICAgIC8qKjwgUG9ydCBVcHN0cmVhbSBVbmRlcnNpemUgRnJhbWVzIFdhcm5pbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX0RPV05TVFJFQU1fT1ZFUlNJWkVfRlJBTUVTX1dBUk5JTkcgICAgICAgICAgICAgICAgPSA3OTcsICAgICAgLyoqPCBQb3J0IERvd25zdHJlYW0gT3ZlcnNpemUgRnJhbWVzIFdhcm5pbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX09WRVJTSVpFX0ZSQU1FU19XQVJOSU5HICAgICAgICAgICAgICAgICAgPSA3OTgsICAgICAgLyoqPCBQb3J0IFVwc3RyZWFtIE92ZXJzaXplIEZyYW1lcyBXYXJuaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0ZSQUdNRU5UU19XQVJOSU5HICAgICAgICAgICAgICAgICAgICAgID0gNzk5LCAgICAgIC8qKjwgUG9ydCBEb3duc3RyZWFtIEZyYWdtZW50cyBXYXJuaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9GUkFHTUVOVFNfV0FSTklORyAgICAgICAgICAgICAgICAgICAgICAgID0gODAwLCAgICAgIC8qKjwgUG9ydCBVcHN0cmVhbSBGcmFnbWVudHMgV2FybmluZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9KQUJCRVJTX1dBUk5JTkcgICAgICAgICAgICAgICAgICAgICAgICA9IDgwMSwgICAgICAvKio8IFBvcnQgRG93bnN0cmVhbSBKYWJiZXJzIFdhcm5pbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9QT1JUX1VQU1RSRUFNX0pBQkJFUlNfV0FSTklORyAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4MDIsICAgICAgLyoqPCBQb3J0IFVwc3RyZWFtIEphYmJlcnMgV2FybmluZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfRE9XTlNUUkVBTV9ESVNDQVJEU19XQVJOSU5HICAgICAgICAgICAgICAgICAgICAgICA9IDgwMywgICAgICAvKio8IFBvcnQgRG93bnN0cmVhbSBEaXNjYXJkcyBXYXJuaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9ESVNDQVJEU19XQVJOSU5HICAgICAgICAgICAgICAgICAgICAgICAgID0gODA0LCAgICAgIC8qKjwgUG9ydCBVcHN0cmVhbSBEaXNjYXJkcyBXYXJuaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9ET1dOU1RSRUFNX0VSUk9SU19XQVJOSU5HICAgICAgICAgICAgICAgICAgICAgICAgID0gODA1LCAgICAgIC8qKjwgUG9ydCBEb3duc3RyZWFtIEVycm9ycyBXYXJuaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9SVF9VUFNUUkVBTV9FUlJPUlNfV0FSTklORyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gODA2LCAgICAgIC8qKjwgUG9ydCBVcHN0cmVhbSBFcnJvcnMgV2FybmluZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FMQVJNX0lEX1BPUlRfU1RBVFVTX0NIQU5HRV9USU1FU19XQVJOSU5HICAgICAgICAgICAgICAgICAgICAgICA9IDgwNywgICAgICAvKio8IFBvcnQgU3RhdHVzIENoYW5nZSBUaW1lcyBXYXJuaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfUE9UU19QT1JUX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAyNSwgICAgIC8qKjwgUCBPIFQgUyBQb3J0IEZhaWx1cmUgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9FMVBPUlRfRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjgxLCAgICAgLyoqPCBFMSBQb3J0IEZhaWx1cmUgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BTEFSTV9JRF9FMVRJTUlOR19VTkxPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjgyLCAgICAgLyoqPCBFMSBUaW1pbmcgVW5sb2NrICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQUxBUk1fSURfRTFMT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTI4MyAgICAgIC8qKjwgRTEgTG9zICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2FsYXJtX2lkOworCisvKiogQ1RDIE9OVSBQb3dlciBBbGFybSBDb2RlIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19wb3dlcl9hbGFybV9jb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19QT1dFUl9BTEFSTV9DT0RFX05FVkVSX01BVENIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgIC8qKjwgTmV2ZXIgbWF0Y2ggKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1BPV0VSX0FMQVJNX0NPREVfUE9XRVJfRE9XTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgLyoqPCBQb3dlciBkb3duICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19QT1dFUl9BTEFSTV9DT0RFX1BPV0VSX1ZPTFRfT1ZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgIC8qKjwgUG93ZXIgVm9sdGFnZSBPdmVyICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19QT1dFUl9BTEFSTV9DT0RFX1BPV0VSX1ZPTFRfTEVTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgIC8qKjwgUG93ZXIgVm9sdGFnZSBMZXNzICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfcG93ZXJfYWxhcm1fY29kZTsKKworLyoqIENUQyBQT04gSUYgU3dpdGNoIENvZGUgCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX3Bvbl9pZl9zd2l0Y2hfY29kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfUE9OX0lGX1NXSVRDSF9DT0RFX05FVkVSX01BVENIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAvKio8IE5ldmVyIG1hdGNoICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19QT05fSUZfU1dJVENIX0NPREVfU0lHTkFMX0xPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgIC8qKjwgU2lnbmFsIExvcyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfUE9OX0lGX1NXSVRDSF9DT0RFX1NJR05BTF9ERUdSQURFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAvKio8IFNpZ25hbCBEZWdyYWRlICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19QT05fSUZfU1dJVENIX0NPREVfSEFSRFdBUkVfRkFVTFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgIC8qKjwgSGFyZHdhcmUgRmF1bHQgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19wb25faWZfc3dpdGNoX2NvZGU7CisKKy8qKiBWYXIgTGVhZiBBdHRyaWJ1dGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2F0dHJpYnV0ZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAvKio8IE1BQyBJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUkFNRVNfVFhfT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgLyoqPCBNQUMgRnJhbWVzIFR4IE9rLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX1NJTkdMRV9DT0xMX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAvKio8IE1BQyBTaW5nbGUgQ29sbCBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTVVMVElQTEVfQ09MTF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgIC8qKjwgTUFDIE11bHRpcGxlIENvbGwgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FU19SWF9PSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAvKio8IE1BQyBGcmFtZXMgUnggT2suICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRkNTX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgIC8qKjwgTUFDIEZDUyBFcnIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQUxJR05fRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgICAgIC8qKjwgTUFDIEFsaWduIEVyci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19PQ1RFVFNfVFhfT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAgICAgLyoqPCBNQUMgT2N0ZXRzIFR4IE9rLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0ZSQU1FU19ERUZFUlJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgICAgICAvKio8IE1BQyBGcmFtZXMgRGVmZXJyZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTEFURV9DT0xMSVNJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgICAgIC8qKjwgTUFDIExhdGUgQ29sbGlzaW9ucy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19FWENFU1NJVkVfQ09MTElTSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAgICAgLyoqPCBNQUMgRXhjZXNzaXZlIENvbGxpc2lvbnMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX0xPU1RfTUFDX1RYX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIsICAgICAgIC8qKjwgTUFDIEZyYW1lcyBMb3N0IE1BQyBUeCBFcnIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ0FSUklFUl9TRU5TRV9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMsICAgICAgIC8qKjwgTUFDIENhcnJpZXIgU2Vuc2UgRXJyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX09DVEVUU19SWF9PSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0LCAgICAgICAvKio8IE1BQyBPY3RldHMgUnggT2suICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVTX0xPU1RfTUFDX1JYX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUsICAgICAgIC8qKjwgTUFDIEZyYW1lcyBMb3N0IE1BQyBSeCBFcnIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfUFJPTUlTQ1VPVVNfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYsICAgICAgIC8qKjwgTUFDIFByb21pc2N1b3VzIFN0YXR1cy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19NQ0FTVF9BRERSX0xJU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNywgICAgICAgLyoqPCBNQUMgTWNhc3QgQWRkciBMaXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX01DQVNUX0ZSQU1FU19UWF9PSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4LCAgICAgICAvKio8IE1BQyBNY2FzdCBGcmFtZXMgVHggT2suICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQkNBU1RfRlJBTUVTX1RYX09LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTksICAgICAgIC8qKjwgTUFDIEJjYXN0IEZyYW1lcyBUeCBPay4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19GUl9FWENFU1NJVkVfREVGRVJSQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMCwgICAgICAgLyoqPCBNQUMgRnIgRXhjZXNzaXZlIERlZmVycmFsLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX01DQVNUX0ZSQU1FU19SWF9PSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxLCAgICAgICAvKio8IE1BQyBNY2FzdCBGcmFtZXMgUnggT2suICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQkNBU1RfRlJBTUVTX1JYX09LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjIsICAgICAgIC8qKjwgTUFDIEJjYXN0IEZyYW1lcyBSeCBPay4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19JTl9SQU5HRV9MRU5fRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMywgICAgICAgLyoqPCBNQUMgSW4gUmFuZ2UgTGVuIEVyci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19PVVRfT0ZfUkFOR0VfTEVOX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNCwgICAgICAgLyoqPCBNQUMgT3V0IE9mIFJhbmdlIExlbiBFcnIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfRlJBTUVfVE9PX0xPTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjUsICAgICAgIC8qKjwgTUFDIEZyYW1lIFRvbyBMb25nLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0VOQUJMRV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2LCAgICAgICAvKio8IE1BQyBFbmFibGUgU3RhdHVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX1RYX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI3LCAgICAgICAvKio8IE1BQyBUeCBFbmFibGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfTUNBU1RfUlhfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjgsICAgICAgIC8qKjwgTUFDIE1jYXN0IFJ4IFN0YXR1cy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19BRERSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOSwgICAgICAgLyoqPCBNQUMgQWRkci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DT0xMSVNJT05fRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMCwgICAgICAgLyoqPCBNQUMgQ29sbGlzaW9uIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMSwgICAgICAgLyoqPCBQSFkgSUQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzIsICAgICAgIC8qKjwgUEhZIFR5cGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QSFlfVFlQRV9MSVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzMsICAgICAgIC8qKjwgUEhZIFR5cGUgTGlzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BIWV9TUUVfVEVTVF9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNCwgICAgICAgLyoqPCBQSFkgU1FFIFRlc3QgRXJyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX1NZTUJPTF9FUlJfRFVSSU5HX0NBUlJJRVIgICAgICAgICAgICAgICAgICAgICAgICA9IDM1LCAgICAgICAvKio8IFBIWSBTeW1ib2wgRXJyIER1cmluZyBDYXJyaWVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX01JSV9ERVRFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM2LCAgICAgICAvKio8IFBIWSBNSUkgRGV0ZWN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUEhZX0FETUlOX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM3LCAgICAgICAvKio8IFBIWSBBZG1pbiBTdGF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzOCwgICAgICAgLyoqPCBSZXBvcnQgSUQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzksICAgICAgIC8qKjwgUmVwb3J0IFR5cGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfR1JPVVBfQ0FQQUNJVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDAsICAgICAgIC8qKjwgUmVwb3J0IEdyb3VwIENhcGFjaXR5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX0dST1VQX01BUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQxLCAgICAgICAvKio8IFJlcG9ydCBHcm91cCBNYXAuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfSEVBTFRIX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDIsICAgICAgIC8qKjwgUmVwb3J0IEhlYWx0aCBTdGF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1JQVF9IRUFMVEhfVEVYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MywgICAgICAgLyoqPCBSZXBvcnQgSGVhbHRoIFRleHQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9SUFRfSEVBTFRIX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDQsICAgICAgIC8qKjwgUmVwb3J0IEhlYWx0aCBEYXRhLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUlBUX1RYX0NPTExJU0lPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ1LCAgICAgICAvKio8IFJlcG9ydCBUeCBDb2xsaXNpb25zLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfR1JPVVBfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ2LCAgICAgICAvKio8IEdyb3VwIElELiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfR1JPVVBfUE9SVF9DQVBBQ0lUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ3LCAgICAgICAvKio8IEdyb3VwIFBvcnQgQ2FwYWNpdHkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9HUk9VUF9QT1JUX01BUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDgsICAgICAgIC8qKjwgR3JvdXAgUG9ydCBNYXAuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDksICAgICAgIC8qKjwgUG9ydCBJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQURNSU5fU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MCwgICAgICAgLyoqPCBQb3J0IEFkbWluIFN0YXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9BVVRPX1BBUlRfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUxLCAgICAgICAvKio8IFBvcnQgQXV0byBQYXJ0IFN0YXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9SRUFEQUJMRV9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUyLCAgICAgICAvKio8IFBvcnQgUmVhZGFibGUgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9SRUFEQUJMRV9PQ1RFVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUzLCAgICAgICAvKio8IFBvcnQgUmVhZGFibGUgT2N0ZXRzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9GQ1NfRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU0LCAgICAgICAvKio8IFBvcnQgRkNTIEVyci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQUxJR05fRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NSwgICAgICAgLyoqPCBQb3J0IEFsaWduIEVyci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfRlJBTUVTX1RPT19MT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NiwgICAgICAgLyoqPCBQb3J0IEZyYW1lcyBUb28gTG9uZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfU0hPUlRfRVZFTlRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NywgICAgICAgLyoqPCBQb3J0IFNob3J0IEV2ZW50cy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfUlVOVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1OCwgICAgICAgLyoqPCBQb3J0IFJ1bnRzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9DT0xMSVNJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU5LCAgICAgICAvKio8IFBvcnQgQ29sbGlzaW9ucy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfTEFURV9FVkVOVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MCwgICAgICAgLyoqPCBQb3J0IExhdGUgRXZlbnRzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9WRVJZX0xPTkdfRVZFTlRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYxLCAgICAgICAvKio8IFBvcnQgVmVyeSBMb25nIEV2ZW50cy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfREFUQV9SQVRFX01JU01BVENIRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MiwgICAgICAgLyoqPCBQb3J0IERhdGEgUmF0ZSBNaXNtYXRjaGVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9BVVRPX1BBUlRJVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYzLCAgICAgICAvKio8IFBvcnQgQXV0byBQYXJ0aXRpb25zLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9JU09MQVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDY0LCAgICAgICAvKio8IFBvcnQgSXNvbGF0ZXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX1NZTV9FUlJfRFVSSU5HX1BLVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjUsICAgICAgIC8qKjwgUG9ydCBTeW0gRXJyIER1cmluZyBQa3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9QT1JUX0xBU1RfU09VUkNFX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjYsICAgICAgIC8qKjwgUG9ydCBMYXN0IFNvdXJjZSBBZGRyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfUE9SVF9TT1VSQ0VfQUREUl9DSEFOR0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDY3LCAgICAgICAvKio8IFBvcnQgU291cmNlIEFkZHIgQ2hhbmdlcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX1BPUlRfQlVSU1RTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDAsICAgICAgLyoqPCBQb3J0IEJ1cnN0cy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2OCwgICAgICAgLyoqPCBNQVUgSUQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjksICAgICAgIC8qKjwgTUFVIFR5cGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfVFlQRV9MSVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzAsICAgICAgIC8qKjwgTUFVIFR5cGUgTGlzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9NRURJQV9BVkFJTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3MSwgICAgICAgLyoqPCBNQVUgTWVkaWEgQXZhaWwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfTE9TRV9NRURJQV9DVFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzIsICAgICAgIC8qKjwgTUFVIExvc2UgTWVkaWEgQ3RyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0pBQkJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDczLCAgICAgICAvKio8IE1BVSBKYWJiZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfQURNSU5fU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzQsICAgICAgIC8qKjwgTUFVIEFkbWluIFN0YXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0JBTkRfU1BMSVRfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc1LCAgICAgICAvKio8IE1BVSBCYW5kIFNwbGl0IFR5cGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQVVfQkFORF9TUExJVF9GUkVRICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzYsICAgICAgIC8qKjwgTUFVIEJhbmQgU3BsaXQgRnJlcS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BVV9GQUxTRV9DQVJSSUVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3NywgICAgICAgLyoqPCBNQVUgRmFsc2UgQ2FycmllcnMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzgsICAgICAgIC8qKjwgQXV0byBOZWcgSUQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19BRE1JTl9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzksICAgICAgIC8qKjwgQXV0byBOZWcgQWRtaW4gU3RhdGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19SRU1PVEVfU0lHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gODAsICAgICAgIC8qKjwgQXV0byBOZWcgUmVtb3RlIFNpZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0FVVE9fQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4MSwgICAgICAgLyoqPCBBdXRvIE5lZyBBdXRvIENmZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0xPQ0FMX1RFQ0hfQUJJTElUWSAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4MiwgICAgICAgLyoqPCBBdXRvIE5lZyBMb2NhbCBUZWNoIEFiaWxpdHkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19BRFZFUlRJU0VEX1RFQ0hfQUJJTElUWSAgICAgICAgICAgICAgICAgICAgID0gODMsICAgICAgIC8qKjwgQXV0byBOZWcgQWR2ZXJ0aXNlZCBUZWNoIEFiaWxpdHkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BVVRPX05FR19SWF9URUNIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gODQsICAgICAgIC8qKjwgQXV0byBOZWcgUnggVGVjaC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0xPQ0FMX1NFTEVDVF9BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4NSwgICAgICAgLyoqPCBBdXRvIE5lZyBMb2NhbCBTZWxlY3QgQWJsZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX0FEX1NFTEVDVF9BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4NiwgICAgICAgLyoqPCBBdXRvIE5lZyBBZCBTZWxlY3QgQWJsZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FVVE9fTkVHX1JYX1NFTEVDVF9BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4NywgICAgICAgLyoqPCBBdXRvIE5lZyBSeCBTZWxlY3QgQWJsZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DQVBBQklMSVRJRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4OSwgICAgICAgLyoqPCBNQUMgQ2FwYWJpbGl0aWVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0RVUExFWF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDkwLCAgICAgICAvKio8IE1BQyBEdXBsZXggU3RhdHVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFVX0lETEVfRVJST1JfQ09VTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDkxLCAgICAgICAvKio8IE1BVSBJZGxlIEVycm9yIENvdW50LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDkyLCAgICAgICAvKio8IE1BQyBDdHJsIElELiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfRlVOQ1NfU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDkzLCAgICAgICAvKio8IE1BQyBDdHJsIEZ1bmNzIFN1cHBvcnRlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01BQ19DVFJMX0ZSQU1FU19UWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5NCwgICAgICAgLyoqPCBNQUMgQ3RybCBGcmFtZXMgVHguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NQUNfQ1RSTF9GUkFNRVNfUlggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOTUsICAgICAgIC8qKjwgTUFDIEN0cmwgRnJhbWVzIFJ4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfVU5TVVBQT1JURURfT1BfUlggICAgICAgICAgICAgICAgICAgICAgICAgICA9IDk2LCAgICAgICAvKio8IE1BQyBDdHJsIFVuc3VwcG9ydGVkIE9wIFJ4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfUEFVU0VfREVMQVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDk3LCAgICAgICAvKio8IE1BQyBDdHJsIFBhdXNlIERlbGF5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfUEFVU0VfVFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDk4LCAgICAgICAvKio8IE1BQyBDdHJsIFBhdXNlIFR4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTUFDX0NUUkxfUEFVU0VfUlggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDk5LCAgICAgICAvKio8IE1BQyBDdHJsIFBhdXNlIFJ4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwMSwgICAgICAvKio8IEFnZyBJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19ERVNDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDIsICAgICAgLyoqPCBBZ2cgRGVzYy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDMsICAgICAgLyoqPCBBZ2cgTmFtZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BQ1RPUl9TWVNfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDQsICAgICAgLyoqPCBBZ2cgQWN0b3IgU3lzIElELiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FDVE9SX1NZU19QUkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwNSwgICAgICAvKio8IEFnZyBBY3RvciBTeXMgUHJpLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FHR19PUl9JTkRJVklEVUFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwNiwgICAgICAvKio8IEFnZyBBZ2cgT3IgSW5kaXZpZHVhbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19BQ1RPUl9BRE1JTl9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDcsICAgICAgLyoqPCBBZ2cgQWN0b3IgQWRtaW4gS2V5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0FDVE9SX09QRVJfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwOCwgICAgICAvKio8IEFnZyBBY3RvciBPcGVyIEtleS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19NQUNfQUREUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDksICAgICAgLyoqPCBBZ2cgTUFDIEFkZHIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUEFSVE5FUl9TWVNfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEwLCAgICAgIC8qKjwgQWdnIFBhcnRuZXIgU3lzIElELiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1BBUlRORVJfU1lTX1BSSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExMSwgICAgICAvKio8IEFnZyBQYXJ0bmVyIFN5cyBQcmkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfUEFSVE5FUl9PUEVSX0tFWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEyLCAgICAgIC8qKjwgQWdnIFBhcnRuZXIgT3BlciBLZXkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQURNSU5fU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEzLCAgICAgIC8qKjwgQWdnIEFkbWluIFN0YXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX09QRVJfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExNCwgICAgICAvKio8IEFnZyBPcGVyIFN0YXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1RJTUVfT0ZfTEFTVF9PUEVSX0NIQU5HRSAgICAgICAgICAgICAgICAgICAgICAgICA9IDExNSwgICAgICAvKio8IEFnZyBUaW1lIE9mIExhc3QgT3BlciBDaGFuZ2UuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfREFUQV9SQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTE2LCAgICAgIC8qKjwgQWdnIERhdGEgUmF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19UWF9PQ1RFVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMTcsICAgICAgLyoqPCBBZ2cgVHggT2N0ZXRzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1JYX09DVEVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExOCwgICAgICAvKio8IEFnZyBSeCBPY3RldHMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfRlJBTUVTX1RYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTE5LCAgICAgIC8qKjwgQWdnIEZyYW1lcyBUeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19GUkFNRVNfUlggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjAsICAgICAgLyoqPCBBZ2cgRnJhbWVzIFJ4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX01DQVNUX1RYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyMSwgICAgICAvKio8IEFnZyBNY2FzdCBUeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19NQ0FTVF9SWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjIsICAgICAgLyoqPCBBZ2cgTWNhc3QgUnguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQkNBU1RfVFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIzLCAgICAgIC8qKjwgQWdnIEJjYXN0IFR4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0JDQVNUX1JYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyNCwgICAgICAvKio8IEFnZyBCY2FzdCBSeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19UWF9ESVNDQVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjUsICAgICAgLyoqPCBBZ2cgVHggRGlzY2FyZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19SWF9ESVNDQVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjYsICAgICAgLyoqPCBBZ2cgUnggRGlzY2FyZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19UWF9FUlJfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjcsICAgICAgLyoqPCBBZ2cgVHggRXJyIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19SWF9FUlJfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjgsICAgICAgLyoqPCBBZ2cgUnggRXJyIEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0FHR19VTktfUFJPVE9DT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjksICAgICAgLyoqPCBBZ2cgVW5rIFByb3RvY29sLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX0xJTktfVVBfRE9XTl9OT1RJRllfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzMCwgICAgICAvKio8IEFnZyBMaW5rIFVwIERvd24gTm90aWZ5IEVuLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfQUdHX1BPUlRfTElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzMSwgICAgICAvKio8IEFnZyBQb3J0IExpc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9BR0dfQ09MTEVDVE9SX01BWF9ERUxBWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMyLCAgICAgIC8qKjwgQWdnIENvbGxlY3RvciBNYXggRGVsYXkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjAwLCAgICAgIC8qKjwgT0FNIElELiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0FETUlOX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwMSwgICAgICAvKio8IE9BTSBBZG1pbiBTdGF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMDIsICAgICAgLyoqPCBPQU0gTW9kZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfTUFDX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMDMsICAgICAgLyoqPCBPQU0gUmVtb3RlIE1BQyBBZGRyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwNCwgICAgICAvKio8IE9BTSBSZW1vdGUgQ29uZmlnLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9QRFVfQ09ORklHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwNSwgICAgICAvKio8IE9BTSBSZW1vdGUgUERVIENvbmZpZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9GTEFHUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMDYsICAgICAgLyoqPCBPQU0gTG9jYWwgRmxhZ3MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0ZMQUdTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA3LCAgICAgIC8qKjwgT0FNIFJlbW90ZSBGbGFncy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMDgsICAgICAgLyoqPCBPQU0gUmVtb3RlIFN0YXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9WRU5ET1JfT1VJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwOSwgICAgICAvKio8IE9BTSBSZW1vdGUgVmVuZG9yIE9VSS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfVkVORE9SX0RFVklDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMTAsICAgICAgLyoqPCBPQU0gUmVtb3RlIFZlbmRvciBEZXZpY2UuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX1ZFTkRPUl9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjExLCAgICAgIC8qKjwgT0FNIFJlbW90ZSBWZW5kb3IgVmVyc2lvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9QRFVfVFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMTIsICAgICAgLyoqPCBPQU0gUERVIFR4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1BEVV9SWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxMywgICAgICAvKio8IE9BTSBQRFUgUnguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVU5TVVBQT1JURURfT1BDT0RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjE0LCAgICAgIC8qKjwgT0FNIFVuc3VwcG9ydGVkIE9wY29kZXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fSU5GT19UWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjE1LCAgICAgIC8qKjwgT0FNIEluZm8gVHguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fSU5GT19SWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjE2LCAgICAgIC8qKjwgT0FNIEluZm8gUnguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRVZFTlRfVFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjE3LCAgICAgIC8qKjwgT0FNIEV2ZW50IFR4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1VOSVFVRV9FVkVOVF9SWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxOCwgICAgICAvKio8IE9BTSBVbmlxdWUgRXZlbnQgUnguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fRFVQX0VWRU5UX1JYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjE5LCAgICAgIC8qKjwgT0FNIER1cCBFdmVudCBSeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT09QX1RYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMjAsICAgICAgLyoqPCBPQU0gTG9vcCBUeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT09QX1JYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMjEsICAgICAgLyoqPCBPQU0gTG9vcCBSeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9WQVJfUkVRX1RYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMjIsICAgICAgLyoqPCBPQU0gVmFyIFJlcSBUeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9WQVJfUkVRX1JYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMjMsICAgICAgLyoqPCBPQU0gVmFyIFJlcSBSeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9WQVJfUkVTUF9UWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMjQsICAgICAgLyoqPCBPQU0gVmFyIFJlc3AgVHguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fVkFSX1JFU1BfUlggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjI1LCAgICAgIC8qKjwgT0FNIFZhciBSZXNwIFJ4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX09SR19TUEVDSUZJQ19UWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIyNiwgICAgICAvKio8IE9BTSBPcmcgU3BlY2lmaWMgVHguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fT1JHX1NQRUNJRklDX1JYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjI3LCAgICAgIC8qKjwgT0FNIE9yZyBTcGVjaWZpYyBSeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfU1lNX1BFUklPRF9XSU4gICAgICAgICAgICAgICAgICAgICAgICAgPSAyMjgsICAgICAgLyoqPCBPQU0gTG9jYWwgRXJyIFN5bSBQZXJpb2QgV2luLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9TWU1fUEVSSU9EX1RIUkVTSCAgICAgICAgICAgICAgICAgICAgICA9IDIyOSwgICAgICAvKio8IE9BTSBMb2NhbCBFcnIgU3ltIFBlcmlvZCBUaHJlc2guICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX1NZTV9QRVJJT0RfRVZFTlQgICAgICAgICAgICAgICAgICAgICAgID0gMjMwLCAgICAgIC8qKjwgT0FNIExvY2FsIEVyciBTeW0gUGVyaW9kIEV2ZW50LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9TRUNTX1dJTiAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzMSwgICAgICAvKio8IE9BTSBMb2NhbCBFcnIgRnJhbWUgU2VjcyBXaW4uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1NFQ1NfVEhSRVNIICAgICAgICAgICAgICAgICAgICAgID0gMjMyLCAgICAgIC8qKjwgT0FNIExvY2FsIEVyciBGcmFtZSBTZWNzIFRocmVzaC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfU0VDU19FVkVOVCAgICAgICAgICAgICAgICAgICAgICAgPSAyMzMsICAgICAgLyoqPCBPQU0gTG9jYWwgRXJyIEZyYW1lIFNlY3MgRXZlbnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSQU1FX1BFUklPRF9XSU4gICAgICAgICAgICAgICAgICAgICAgID0gMjM0LCAgICAgIC8qKjwgT0FNIExvY2FsIEVyciBGcmFtZSBQZXJpb2QgV2luLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUkFNRV9QRVJJT0RfVEhSRVNIICAgICAgICAgICAgICAgICAgICA9IDIzNSwgICAgICAvKio8IE9BTSBMb2NhbCBFcnIgRnJhbWUgUGVyaW9kIFRocmVzaC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJBTUVfUEVSSU9EX0VWRU5UICAgICAgICAgICAgICAgICAgICAgPSAyMzYsICAgICAgLyoqPCBPQU0gTG9jYWwgRXJyIEZyYW1lIFBlcmlvZCBFdmVudC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9MT0NBTF9FUlJfRlJfU0VDX1NVTV9XSU4gICAgICAgICAgICAgICAgICAgICAgICAgPSAyMzcsICAgICAgLyoqPCBPQU0gTG9jYWwgRXJyIEZyIFNlYyBTdW0gV2luLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0xPQ0FMX0VSUl9GUl9TRUNfU1VNX1RIUkVTSCAgICAgICAgICAgICAgICAgICAgICA9IDIzOCwgICAgICAvKio8IE9BTSBMb2NhbCBFcnIgRnIgU2VjIFN1bSBUaHJlc2guICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fTE9DQUxfRVJSX0ZSX1NFQ19TVU1fRVZFTlQgICAgICAgICAgICAgICAgICAgICAgID0gMjM5LCAgICAgIC8qKjwgT0FNIExvY2FsIEVyciBGciBTZWMgU3VtIEV2ZW50LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfU0VDU19XSU4gICAgICAgICAgICAgICAgICAgICAgICA9IDI0MCwgICAgICAvKio8IE9BTSBSZW1vdGUgRXJyIEZyYW1lIFNlY3MgV2luLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfU0VDU19USFJFU0ggICAgICAgICAgICAgICAgICAgICA9IDI0MSwgICAgICAvKio8IE9BTSBSZW1vdGUgRXJyIEZyYW1lIFNlY3MgVGhyZXNoLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfU0VDU19FVkVOVCAgICAgICAgICAgICAgICAgICAgICA9IDI0MiwgICAgICAvKio8IE9BTSBSZW1vdGUgRXJyIEZyYW1lIFNlY3MgRXZlbnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9PQU1fUkVNT1RFX0VSUl9GUkFNRV9QRVJJT0RfV0lOICAgICAgICAgICAgICAgICAgICAgID0gMjQzLCAgICAgIC8qKjwgT0FNIFJlbW90ZSBFcnIgRnJhbWUgUGVyaW9kIFdpbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9SRU1PVEVfRVJSX0ZSQU1FX1BFUklPRF9USFJFU0ggICAgICAgICAgICAgICAgICAgPSAyNDQsICAgICAgLyoqPCBPQU0gUmVtb3RlIEVyciBGcmFtZSBQZXJpb2QgVGhyZXNoLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX1JFTU9URV9FUlJfRlJBTUVfUEVSSU9EX0VWRU5UICAgICAgICAgICAgICAgICAgICA9IDI0NSwgICAgICAvKio8IE9BTSBSZW1vdGUgRXJyIEZyYW1lIFBlcmlvZCBFdmVudC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9GUkFNRVNfTE9TVF9PQU1fRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNDYsICAgICAgLyoqPCBPQU0gRnJhbWVzIExvc3QgT0FNIEVyci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9FTVVMX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNDcsICAgICAgLyoqPCBPQU0gRW11bCBJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX09BTV9FTVVMX1NQRF9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNDgsICAgICAgLyoqPCBPQU0gRW11bCBTcGQgRXJyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0VNVUxfQ1JDOEVSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0OSwgICAgICAvKio8IE9BTSBFbXVsIENSQzggRXJyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfT0FNX0VNVUxfQkFEX0xMSURfRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1MCwgICAgICAvKio8IE9BTSBFbXVsIEJhZCBMTElEIEVyci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfTUFDX0NUUkxfRlJBTUVTX1RYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyODAsICAgICAgLyoqPCBNUENQIE1BQyBDdHJsIEZyYW1lcyBUeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfTUFDX0NUUkxfRlJBTUVTX1JYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyODEsICAgICAgLyoqPCBNUENQIE1BQyBDdHJsIEZyYW1lcyBSeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfRElTQ09WRVJZX1dJTkRPV19UWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyODgsICAgICAgLyoqPCBNUENQIERpc2NvdmVyeSBXaW5kb3cgVHguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX0RJU0NPVkVSWV9USU1FT1VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjkwLCAgICAgIC8qKjwgTVBDUCBEaXNjb3ZlcnkgVGltZW91dC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0ZFQ19DT1JSRUNURURfQkxPQ0tTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOTIsICAgICAgLyoqPCBGRUMgQ29ycmVjdGVkIEJsb2Nrcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX0ZFQ19VTkNPUlJFQ1RBQkxFX0JMT0NLUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOTMsICAgICAgLyoqPCBGRUMgVW5jb3JyZWN0YWJsZSBCbG9ja3MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9GRUNfQUJJTElUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzEzLCAgICAgIC8qKjwgRkVDIEFiaWxpdHkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9GRUNfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzE0LCAgICAgIC8qKjwgRkVDIE1vZGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1RYX0dBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzE1LCAgICAgIC8qKjwgTVBDUCBUeCBHYXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9SRUdfQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMxNiwgICAgICAvKio8IE1QQ1AgVHggUmVnIEFjay4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfVFhfUkVHSVNURVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMTcsICAgICAgLyoqPCBNUENQIFR4IFJlZ2lzdGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9UWF9SRUdfUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMxOCwgICAgICAvKio8IE1QQ1AgVHggUmVnIFJlcXVlc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1RYX1JFUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzE5LCAgICAgIC8qKjwgTVBDUCBUeCBSZXBvcnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX0dBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzIwLCAgICAgIC8qKjwgTVBDUCBSeCBHYXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9SWF9SRUdfQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyMSwgICAgICAvKio8IE1QQ1AgUnggUmVnIEFjay4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfQVRUUklCVVRFX01QQ1BfUlhfUkVHSVNURVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMjIsICAgICAgLyoqPCBNUENQIFJ4IFJlZ2lzdGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9BVFRSSUJVVEVfTVBDUF9SWF9SRUdfUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyMywgICAgICAvKio8IE1QQ1AgUnggUmVnIFJlcXVlc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX0FUVFJJQlVURV9NUENQX1JYX1JFUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzI0ICAgICAgIC8qKjwgTVBDUCBSeCBSZXBvcnQuICovCit9IGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hdHRyaWJ1dGU7CisKKy8qKiBDVEMgRkVDIFN1cHBvcnQuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19mZWNfc3VwcG9ydAoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfRkVDX1NVUFBPUlRfVU5LTk9XTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAvKio8IFVua25vd24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19GRUNfU1VQUE9SVF9TVVBQT1JURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgIC8qKjwgU3VwcG9ydGVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfRkVDX1NVUFBPUlRfTk9UX1NVUFBPUlRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMgICAgICAgICAvKio8IE5vdCBTdXBwb3J0ZWQuICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfZmVjX3N1cHBvcnQ7CisKKy8qKiBDVEMgRkVDIFN0YXRlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfZmVjX3N0YXRlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19GRUNfU1RBVEVfVU5LTk9XTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgIC8qKjwgVW5rbm93bi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0ZFQ19TVEFURV9FTkFCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgLyoqPCBFbmFibGVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfRkVDX1NUQVRFX0RJU0FCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMgICAgICAgICAvKio8IERpc2FibGVkLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2ZlY19zdGF0ZTsKKworLyoqIENUQyBDaHVybmluZyBPcCBDb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfY2h1cm5pbmdfb3BfY29kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfQ0hVUk5JTkdfT1BfQ09ERV9ORVdfS0VZX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAvKio8IE5ldyBLZXkgUmVxdWVzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0NIVVJOSU5HX09QX0NPREVfTkVXX0NIVVJOSU5HX0tFWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxICAgICAgICAgLyoqPCBOZXcgQ2h1cm5pbmcgS2V5LiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2NodXJuaW5nX29wX2NvZGU7CisKKy8qKiBDVEMgQ2xhc3NpZmljYXRpb24gT3BlcmF0aW9uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfY2xhc3NpZmljYXRpb25fb3BlcmF0aW9uCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19DTEFTU0lGSUNBVElPTl9PUEVSQVRJT05fREVMRVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgIC8qKjwgRGVsZXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfQ0xBU1NJRklDQVRJT05fT1BFUkFUSU9OX0FERCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAvKio8IEFkZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0NMQVNTSUZJQ0FUSU9OX09QRVJBVElPTl9DTEVBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgLyoqPCBDbGVhci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0NMQVNTSUZJQ0FUSU9OX09QRVJBVElPTl9MSVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzICAgICAgICAgLyoqPCBMaXN0LiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2NsYXNzaWZpY2F0aW9uX29wZXJhdGlvbjsKKworLyoqIENUQyBDb21taXQgSW1hZ2UgQWNrLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2FjaworeworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfQ09NTUlUX0lNQUdFX0FDS19TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAvKio8IFN1Y2Nlc3MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19DT01NSVRfSU1BR0VfQUNLX1BBUkFNRVRFUl9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgIC8qKjwgUGFyYW1ldGVyIEVycm9yLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfQ09NTUlUX0lNQUdFX0FDS19OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAvKio8IE5vdCBTdXBwb3J0ZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19DT01NSVRfSU1BR0VfQUNLX0xPQURJTkdfRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgIC8qKjwgTG9hZGluZyBGYWlsdXJlLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9hY2s7CisKKy8qKiBDVEMgQ29tbWl0IEltYWdlIE9wY29kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9vcGNvZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0NPTU1JVF9JTUFHRV9PUENPREVfQ09NTUlUX0lNQUdFX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwgICAgICAgLyoqPCBDb21taXQgSW1hZ2UgUmVxdWVzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0NPTU1JVF9JTUFHRV9PUENPREVfQ09NTUlUX0lNQUdFX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSAgICAgICAgLyoqPCBDb21taXQgSW1hZ2UgUmVzcG9uc2UuICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX29wY29kZTsKKworLyoqIENUQyBDb21taXQgSW1hZ2UgRmxhZy4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9mbGFnCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19DT01NSVRfSU1BR0VfRkxBR19TV0FQX0FDVElWRV9CQUNLVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCAgICAgICAgIC8qKjwgU3dhcCBBY3RpdmUvQmFja3VwLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9mbGFnOworCisvKiogQ1RDIERCQSBPcCBDb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX29wX2NvZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0RCQV9PUF9DT0RFX0dFVF9SRVFVRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgLyoqPCBHZXQgUmVxdWVzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0RCQV9PUF9DT0RFX0dFVF9SRVNQT05TRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgLyoqPCBHZXQgUmVzcG9uc2UuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19EQkFfT1BfQ09ERV9TRVRfUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgIC8qKjwgU2V0IFJlcXVlc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19EQkFfT1BfQ09ERV9TRVRfUkVTUE9OU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgIC8qKjwgU2V0IFJlc3BvbnNlLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9vcF9jb2RlOworCisvKiogQ1RDIEVhcmx5IFdha2UgVXAgTW9kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX2Vhcmx5X3dha2VfdXBfbW9kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfRUFSTFlfV0FLRV9VUF9NT0RFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAvKio8IEVuYWJsZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0VBUkxZX1dBS0VfVVBfTU9ERV9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgLyoqPCBEaXNhYmxlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfRUFSTFlfV0FLRV9VUF9NT0RFX05PVF9TVVBQT1JURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1NSAgICAgICAvKio8IE5vdCBTdXBwb3J0ZWQuICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfZWFybHlfd2FrZV91cF9tb2RlOworCisvKiogQ1RDIEJyYW5jaC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX2JyYW5jaAoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAvKio8IEVuZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9BVFRSSUJVVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAgICAgLyoqPCBBdHRyaWJ1dGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfQUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgICAgIC8qKjwgQWN0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX09MRF9NQU5BR0VNRU5UX09CSkVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU0LCAgICAgICAvKio8IE9sZCBNYW5hZ2VtZW50IE9iamVjdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9NQU5BR0VNRU5UX09CSkVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NSwgICAgICAgLyoqPCBNYW5hZ2VtZW50IE9iamVjdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0JSQU5DSF9FWFRfQVRUUklCVVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOTksICAgICAgLyoqPCBFeHQgQXR0cmlidXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0VYVF9BQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwMSwgICAgICAvKio8IEV4dCBBY3Rpb24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19CUkFOQ0hfS1RBVFRSSUJVVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTY3LCAgICAgIC8qKjwgS1QgQXR0cmlidXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfQlJBTkNIX0tUQUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2OSAgICAgICAvKio8IEtUIEFjdGlvbi4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19icmFuY2g7CisKKy8qKiBPQU0gRXJyb3IgQ29kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fb2FtX2Vycm9yX2NvZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fT0FNX0VSUk9SX0NPREVfTk9fRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjgsICAgICAgLyoqPCBObyBFcnJvci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT0FNX0VSUk9SX0NPREVfVU5ERVRFUk1JTkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjksICAgICAgLyoqPCBVbmRldGVybWluZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09BTV9FUlJPUl9DT0RFX1VOU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMwLCAgICAgIC8qKjwgVW5zdXBwb3J0ZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09BTV9FUlJPUl9DT0RFX09WRVJGTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMxLCAgICAgIC8qKjwgT3ZlcmZsb3cuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09BTV9FUlJPUl9DT0RFX1RPT19MT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMyLCAgICAgIC8qKjwgVG9vIExvbmcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09BTV9FUlJPUl9DT0RFX1RPX0JFX0NPTlRJTlVFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMzLCAgICAgIC8qKjwgVG8gQmUgQ29udGludWVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PQU1fRVJST1JfQ09ERV9CQURfUEFSQU1FVEVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzNCwgICAgICAvKio8IEJhZCBQYXJhbWV0ZXJzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PQU1fRVJST1JfQ09ERV9OT19SRVNPVVJDRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzNSwgICAgICAvKio8IE5vIFJlc291cmNlcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT0FNX0VSUk9SX0NPREVfU1lTVEVNX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzYsICAgICAgLyoqPCBTeXN0ZW0gQnVzeS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT0FNX0VSUk9SX0NPREVfU1REX09BTV9BVFRSX1VOREVURVJNSU5FRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNjAsICAgICAgLyoqPCBTVEQgT2FtIEF0dHIgVW5kZXRlcm1pbmVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PQU1fRVJST1JfQ09ERV9TVERfT0FNX0FUVFJfTUFZX0JFX0NPUlJVUFRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2MSwgICAgICAvKio8IFNURCBPYW0gQXR0ciBNYXkgQmUgQ29ycnVwdGVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PQU1fRVJST1JfQ09ERV9TVERfT0FNX0FUVFJfVU5TVVBQT1JURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2MiwgICAgICAvKio8IFNURCBPYW0gQXR0ciBVbnN1cHBvcnRlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT0FNX0VSUk9SX0NPREVfU1REX09BTV9BVFRSX0hXX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNjMsICAgICAgLyoqPCBTVEQgT2FtIEF0dHIgSHcgRmFpbHVyZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT0FNX0VSUk9SX0NPREVfU1REX09BTV9BVFRSX09WRVJGTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNjQsICAgICAgLyoqPCBTVEQgT2FtIEF0dHIgT3ZlcmZsb3cuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09BTV9FUlJPUl9DT0RFX1NURF9PQU1fT0JKX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTkyLCAgICAgIC8qKjwgU1REIE9hbSBPYmplY3QgRW5kLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PQU1fRVJST1JfQ09ERV9TVERfT0FNX09CSl9VTkRFUlRFUk1JTkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5MywgICAgICAvKio8IFNURCBPYW0gT2JqZWN0IFVuZGVydGVybWluZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09BTV9FUlJPUl9DT0RFX1NURF9PQU1fT0JKX1VOU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTk0LCAgICAgIC8qKjwgU1REIE9hbSBPYmplY3QgVW5zdXBwb3J0ZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09BTV9FUlJPUl9DT0RFX1NURF9PQU1fT0JKX01BWV9CRV9DT1JSVVBURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTk1LCAgICAgIC8qKjwgU1REIE9hbSBPYmplY3QgTWF5IEJlIENvcnJ1cHRlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT0FNX0VSUk9SX0NPREVfU1REX09BTV9PQkpfSFdfRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOTYgICAgICAgLyoqPCBTVEQgT2FtIE9iamVjdCBIdyBGYWlsdXJlLiAqLworfSBiY21vbHRfZXBvbl9vYW1fb2FtX2Vycm9yX2NvZGU7CisKKy8qKiBDVEMgTGVhZiBPbGQgTWFuYWdlbWVudCBPYmplY3QuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX29sZF9tYW5hZ2VtZW50X29iamVjdAoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9PTERfTUFOQUdFTUVOVF9PQkpFQ1RfUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgICAgICAgICAvKio8IFBvcnQuICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9vbGRfbWFuYWdlbWVudF9vYmplY3Q7CisKKy8qKiBDVEMgUG9ydCBUeXBlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfcG9ydF90eXBlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19QT1JUX1RZUEVfRVRIRVJORVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgIC8qKjwgRXRoZXJuZXQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19QT1JUX1RZUEVfVk9JUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgIC8qKjwgVm9JUC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1BPUlRfVFlQRV9BRFNMMlBMVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgLyoqPCBBRFNMMisuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19QT1JUX1RZUEVfVkRTTDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgIC8qKjwgVkRTTDIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19QT1JUX1RZUEVfRTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSAgICAgICAgIC8qKjwgRTEuICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfcG9ydF90eXBlOworCisvKiogQ1RDIExlYWYgRXh0IEF0dHJpYnV0ZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfZXh0X2F0dHJpYnV0ZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAvKio8IEVuZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfU0VSSUFMX05VTUJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgLyoqPCBPTlUgU2VyaWFsIE51bWJlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9GSVJNV0FSRV9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgLyoqPCBGaXJtd2FyZSBWZXJzaW9uLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0NISVBTRVRfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAvKio8IENoaXBzZXQgSUQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX0NBUEFCSUxJVElFUzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgIC8qKjwgT05VIENhcGFiaWxpdGllcy0xLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09QVElDQUxfVFJBTlNDRUlWRVJfRElBR05PU0lTICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAvKio8IE9wdGljYWwgVHJhbnNjZWl2ZXIgRGlhZ25vc2lzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1NFUlZJQ0VfU0xBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAvKio8IFNlcnZpY2UgU0xBLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9DQVBBQklMSVRJRVMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAvKio8IE9OVSBDYXBhYmlsaXRpZXMtMi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9IT0xET1ZFUl9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAgICAgLyoqPCBIb2xkb3ZlciBDb25maWcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfTVhVX01BTkFHRV9HTE9CQUxfUEFSQU1FVEVSICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgICAgIC8qKjwgTXhVIE1hbmFnZSBHbG9iYWwgUGFyYW1ldGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX01YVV9NQU5BR0VfU05NUF9QQVJBTUVURVIgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgICAgICAvKio8IE14VSBNYW5hZ2UgU05NUCBQYXJhbWV0ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfQUNUSVZFX1BPTl9JRkFETUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEsICAgICAgIC8qKjwgQWN0aXZlIFBPTiBJL0YgQWRtaW4uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX0NBUEFCSUxJVElFUzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIsICAgICAgIC8qKjwgT05VIENhcGFiaWxpdGllcy0zLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT1dFUl9TQVZJTkdfQ0FQQUJJTElUSUVTICAgICAgICAgICAgICAgICAgICA9IDEzLCAgICAgICAvKio8IE9OVSBQb3dlciBTYXZpbmcgQ2FwYWJpbGl0aWVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT1dFUl9TQVZJTkdfQ09ORklHICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0LCAgICAgICAvKio8IE9OVSBQb3dlciBTYXZpbmcgQ29uZmlnLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QUk9URUNUSU9OX1BBUkFNRVRFUlMgICAgICAgICAgICAgICAgICAgICAgICA9IDE1LCAgICAgICAvKio8IE9OVSBQcm90ZWN0aW9uIFBhcmFtZXRlcnMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRVRIX0xJTktfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTcsICAgICAgIC8qKjwgRXRoIExpbmsgU3RhdGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRVRIX1BPUlRfUEFVU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgsICAgICAgIC8qKjwgRXRoIFBvcnQgUGF1c2UuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRVRIX1BPUlRfUE9MSUNJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTksICAgICAgIC8qKjwgRXRoIFBvcnQgUG9saWNpbmcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfVk9JUF9QT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjAsICAgICAgIC8qKjwgVm9JUCBQb3J0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0UxUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxLCAgICAgICAvKio8IEUxIFBvcnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRVRIX1BPUlRfRE9XTl9SQVRFX0xJTUlUSU5HICAgICAgICAgICAgICAgICAgICAgID0gMjIsICAgICAgIC8qKjwgRXRoIFBvcnQgRG93biBSYXRlIExpbWl0aW5nLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1BPUlRfTE9PUF9ERVRFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzLCAgICAgICAvKio8IFBvcnQgTG9vcCBEZXRlY3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUE9SVF9ESVNBQkxFX09OX0xPT1BfREVURUNURUQgICAgICAgICAgICAgICAgICAgID0gMjQsICAgICAgIC8qKjwgUG9ydCBEaXNhYmxlIE9uIExvb3AgRGV0ZWN0ZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfVkxBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzMsICAgICAgIC8qKjwgVkxBTi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9DTEFTU0lGSUNBVElPTl9BTkRfTUFSS0lORyAgICAgICAgICAgICAgICAgICAgICAgPSA0OSwgICAgICAgLyoqPCBDbGFzc2lmaWNhdGlvbiBBbmQgTWFya2luZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9NVUxUSUNBU1RfVkxBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NSwgICAgICAgLyoqPCBNdWx0aWNhc3QgVkxBTi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9NVUxUSUNBU1RfVEFHX09QRVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NiwgICAgICAgLyoqPCBNdWx0aWNhc3QgVGFnIE9wZXJhdGlvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9NVUxUSUNBU1RfU1dJVENIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NywgICAgICAgLyoqPCBNdWx0aWNhc3QgU3dpdGNoLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX01VTFRJQ0FTVF9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDY4LCAgICAgICAvKio8IE11bHRpY2FzdCBDb250cm9sLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0dST1VQX01BWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDY5LCAgICAgICAvKio8IEdyb3VwIE1heC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9GQVNUX0xFQVZFX0FCSUxJVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3MCwgICAgICAgLyoqPCBGYXN0IExlYXZlIEFiaWxpdHkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRkFTVF9MRUFWRV9BRE1JTl9TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzEsICAgICAgIC8qKjwgRmFzdCBMZWF2ZSBBZG1pbiBTdGF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9MTElEX1FVRVVFX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4MSwgICAgICAgLyoqPCBMTElEL1F1ZXVlIENvbmZpZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9JQURfSU5GT1JNQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5NywgICAgICAgLyoqPCBJQUQgSW5mb3JtYXRpb24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfVk9JUF9HTE9CQUxfUEFSQU1FVEVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOTgsICAgICAgIC8qKjwgVm9JUCBHbG9iYWwgUGFyYW1ldGVycy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9IMjQ4UEFSQU1FVEVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5OSwgICAgICAgLyoqPCBILjI0OCBQYXJhbWV0ZXJzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0gyNDhVU0VSX1RJRF9JTkZPUk1BVElPTiAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwMCwgICAgICAvKio8IEguMjQ4IFVzZXIgVElEIEluZm9ybWF0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0gyNDhSVFBfVElEX0NPTkZJR1VSQVRJT04gICAgICAgICAgICAgICAgICAgICAgICA9IDEwMSwgICAgICAvKio8IEguMjQ4IFJUUCBUSUQgQ29uZmlndXJhdGlvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9IMjQ4UlRQX1RJRF9JTkZPUk1BVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDIsICAgICAgLyoqPCBILjI0OCBSVFAgVElEIEluZm9ybWF0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1NJUF9QQVJBTUVURVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwMywgICAgICAvKio8IFNJUCBQYXJhbWV0ZXJzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1NJUF9VU0VSX1BBUkFNRVRFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwNCwgICAgICAvKio8IFNJUCBVc2VyIFBhcmFtZXRlcnMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfRkFYX01PREVNX0NPTkZJR1VSQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgID0gMTA1LCAgICAgIC8qKjwgRmF4L01vZGVtIENvbmZpZ3VyYXRpb24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSDI0OElBRF9PUEVSQVRJT05fU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgID0gMTA2LCAgICAgIC8qKjwgSC4yNDggSUFEIE9wZXJhdGlvbiBTdGF0dXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUE9UU19TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTA3LCAgICAgIC8qKjwgUE9UUyBTdGF0dXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfSUFEX09QRVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTA4LCAgICAgIC8qKjwgSUFEIE9wZXJhdGlvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9TSVBfRElHSVRfTUFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDksICAgICAgLyoqPCBTSVAgRGlnaXQgTWFwLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0FMQVJNX0FETUlOX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyOSwgICAgICAvKio8IEFsYXJtIEFkbWluIFN0YXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX0FMQVJNX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzMCwgICAgICAvKio8IEFsYXJtIFRocmVzaG9sZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfVFhfUE9XRVJfU1VQUExZX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgPSAxNjEsICAgICAgLyoqPCBPbnUgVHggUG93ZXIgU3VwcGx5IENvbnRyb2wuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfTUFDX0FHSU5HX1RJTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTY0LCAgICAgIC8qKjwgTUFDIEFnaW5nIFRpbWUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUEVSRk9STUFOQ0VfTU9OSVRPUklOR19TVEFUVVMgICAgICAgICAgICAgICAgICAgID0gMTc3LCAgICAgIC8qKjwgUGVyZm9ybWFuY2UgTW9uaXRvcmluZyBTdGF0dXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUEVSRk9STUFOQ0VfTU9OSVRPUklOR19DVVJSRU5UX0RBVEEgICAgICAgICAgICAgID0gMTc4LCAgICAgIC8qKjwgUGVyZm9ybWFuY2UgTW9uaXRvcmluZyBDdXJyZW50IERhdGEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUEVSRk9STUFOQ0VfTU9OSVRPUklOR19ISVNUT1JZX0RBVEEgICAgICAgICAgICAgID0gMTc5LCAgICAgIC8qKjwgUGVyZm9ybWFuY2UgTW9uaXRvcmluZyBIaXN0b3J5IERhdGEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfVkVSU0lPTl9TRVJWRVJfUEFSQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzI3NzBVLCAgIC8qKjwgVmVyc2lvbiBTZXJ2ZXIgUGFyYS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfTUFDX0xJTUlUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMjc3MVUsICAgLyoqPCBPTlUgTUFDIExpbWl0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9NQUNfQUdJTkdfVElNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyNzcyVSwgICAvKio8IE9OVSBNQUMgQWdpbmcgVGltZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9SVF9NQUNfRklMVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMjc3M1UsICAgLyoqPCBPTlUgUG9ydCBNQUMgRmlsdGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT1JUX01BQ19CSU5ESU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyNzc0VSwgICAvKio8IE9OVSBQb3J0IE1BQyBCaW5kaW5nLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT1JUX01BQ19TVEFUSUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyNzc1VSwgICAvKio8IE9OVSBQb3J0IE1BQyBTdGF0aWMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BFUkZPUk1BTkNFX1NUQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzI3ODRVLCAgIC8qKjwgT05VIFBlcmZvcm1hbmNlIFN0YXQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPUlRfSVNPTEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzI3NzZVLCAgIC8qKjwgT05VIFBvcnQgSXNvbGF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfTUFDX0FERFJFU1NfVEFCTEVfUVVFUlkgICAgICAgICAgICAgICAgICAgICAgPSAzMjc4NlUsICAgLyoqPCBPTlUgTUFDIEFkZHJlc3MgVGFibGUgUXVlcnkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPTl9NQUNfRE9XTlNUUkVBTV9TSEFQSU5HICAgICAgICAgICAgICAgICAgID0gMzI3ODdVLCAgIC8qKjwgT05VIFBPTiBNQUMgRG93bnN0cmVhbSBTaGFwaW5nLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT05fTUFDX1VTRFNCVUZGRVIgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyNzg4VSwgICAvKio8IE9OVSBQT04gTUFDIFVTL0RTIEJ1ZmZlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9OX01BQ19VU0RTQlVGRkVSX0NBUEFCSUxJVFlfUVVFUlkgICAgICAgICAgPSAzMjc4OVUsICAgLyoqPCBPTlUgUE9OIE1BQyBVUy9EUyBCdWZmZXIgQ2FwYWJpbGl0eSBRdWVyeS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9SVF9TVEFUSVNUSUNTX0NPTExFQ1RfQ09OVFJPTCAgICAgICAgICAgICAgPSAzMjc5MFUsICAgLyoqPCBPTlUgUG9ydCBTdGF0aXN0aWNzIENvbGxlY3QgQ29udHJvbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9SVF9TVEFUSVNUSUNTX0NPVU5URVJfUkVTRVQgICAgICAgICAgICAgICAgPSAzMjc5MVUsICAgLyoqPCBPTlUgUG9ydCBTdGF0aXN0aWNzIENvdW50ZXIgUmVzZXQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX1BPUlRfRkxVWF9TVEFUSVNUSUNTX0NPVU5URVIgICAgICAgICAgICAgICAgID0gMzI3OTJVLCAgIC8qKjwgT05VIFBvcnQgRmx1eCBTdGF0aXN0aWNzIENvdW50ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfT05VX0xJR0hUX0VYQ0VQVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzI3OTNVLCAgIC8qKjwgT05VIExpZ2h0IEV4Y2VwdGlvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfTElHSFRfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMjc5NFUsICAgLyoqPCBPTlUgTGlnaHQgQ29udHJvbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FUVFJJQlVURV9PTlVfUE9OX1BPUlRfU1RBVElTVElDU19HRVQxICAgICAgICAgICAgICAgICAgICAgPSAzMjc5NVUsICAgLyoqPCBPTlUgUE9OIFBvcnQgU3RhdGlzdGljcyBHZXQxLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX09OVV9QT05fUE9SVF9TVEFUSVNUSUNTX0dFVDIgICAgICAgICAgICAgICAgICAgICA9IDMyNzk2VSwgICAvKio8IE9OVSBQT04gUG9ydCBTdGF0aXN0aWNzIEdldDIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfQUxBUk1fQ09ORklHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzI3NjlVLCAgIC8qKjwgQWxhcm0gQ29uZmlnLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1JPVUdVRV9PTlVfRVhDTF9BQklMSVRZICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyNzk3VSwgICAvKio8IFJvdWd1ZU9udUV4Y2xBYmlsaXR5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQVRUUklCVVRFX1BQUE9fRVRFU1RfQ09ORklHVVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyOTMxVSwgICAvKio8IFBQUG9FVGVzdENvbmZpZ3VyYXRpb24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BVFRSSUJVVEVfUFBQT19FVEVTVF9SRVNVTFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzI5MzJVICAgIC8qKjwgUFBQb0VUZXN0UmVzdWx0LiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfZXh0X2F0dHJpYnV0ZTsKKworLyoqIENUQyBMZWFmIEV4dCBBY3Rpb24uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hY3Rpb24KK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FDVElPTl9SRVNFVF9PTlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgLyoqPCBSZXNldCBPTlUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BQ1RJT05fU0xFRVBfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgIC8qKjwgU2xlZXAgQ29udHJvbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0xFQUZfRVhUX0FDVElPTl9GQVNUX0xFQVZFX0FETUlOX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3MiwgICAgICAgLyoqPCBGYXN0IExlYXZlIEFkbWluIENvbnRyb2wuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19MRUFGX0VYVF9BQ1RJT05fTVVMVElfTExJRF9BRE1JTl9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTE0LCAgICAgIC8qKjwgTXVsdGktTExJRCBBZG1pbiBDb250cm9sLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTEVBRl9FWFRfQUNUSU9OX1JFU0VUX0NBUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwMjUgICAgICAvKio8IFJlc2V0IENhcmQuICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYWN0aW9uOworCisvKiogS1QgTGVhZiBBdHRyaWJ1dGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hdHRyaWJ1dGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9QT1JUX0RPV05TVFJFQU1fUkFURV9TSEFQSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgLyoqPCBQb3J0IERvd25zdHJlYW0gUmF0ZSBTaGFwaW5nLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX09OVV9NQUNfTElNSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAvKio8IE9OVSBNQUMgTGltaXQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfQkxPQ0tfVU5CTE9DS19PTlVfVFJBRkZJQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgIC8qKjwgQmxvY2svVW5ibG9jayBPTlUgVHJhZmZpYy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9PTlVfRElBR05PU1RJQ1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgLyoqPCBPTlUgRGlhZ25vc3RpY3MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfT05VX1FVRVVFX0RST1BfQ09VTlRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgIC8qKjwgT05VIFF1ZXVlIERyb3AgQ291bnRlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9FVEhFUk5FVF9QT1JUX0NPVU5URVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNywgICAgICAgLyoqPCBFdGhlcm5ldCBQb3J0IENvdW50ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfRVRIRVJORVRfUE9SVF9SU1RQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgsICAgICAgIC8qKjwgRXRoZXJuZXQgUG9ydCBSU1RQLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX0xPT1BfREVURUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5LCAgICAgICAvKio8IExvb3AgRGV0ZWN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQVRUUklCVVRFX09OVV9NUENQX0NPVU5URVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwLCAgICAgICAvKio8IE9OVSBNUENQIENvdW50ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BVFRSSUJVVEVfU1RBVElDX01BQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjEsICAgICAgIC8qKjwgU3RhdGljIE1BQy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FUVFJJQlVURV9PUFRJQ0FMX1BPV0VSX0FMQVJNX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMiAgICAgICAgLyoqPCBPcHRpY2FsIFBvd2VyIEFsYXJtIFN0YXR1cy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hdHRyaWJ1dGU7CisKKy8qKiBDVEMgRXRoIFBvcnQgUG9saWNpbmcgRW5hYmxlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfZW5hYmxlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19FVEhfUE9SVF9QT0xJQ0lOR19FTkFCTEVfRElTQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgIC8qKjwgRGlzYWJsZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19FVEhfUE9SVF9QT0xJQ0lOR19FTkFCTEVfRU5BQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSAgICAgICAgIC8qKjwgRW5hYmxlZC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19lbmFibGU7CisKKy8qKiBDVEMgRXZlbnQgU3ViIFR5cGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdWJfdHlwZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfRVZFTlRfU1VCX1RZUEVfU1RBVFVTX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAvKio8IFN0YXR1cyBSZXF1ZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfRVZFTlRfU1VCX1RZUEVfU1RBVFVTX1NFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAvKio8IFN0YXR1cyBTZXQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19FVkVOVF9TVUJfVFlQRV9TVEFUVVNfUkVTUE9OU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgIC8qKjwgU3RhdHVzIFJlc3BvbnNlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfRVZFTlRfU1VCX1RZUEVfVEhSRVNIT0xEX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAvKio8IFRocmVzaG9sZCBSZXF1ZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfRVZFTlRfU1VCX1RZUEVfVEhSRVNIT0xEX1NFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAvKio8IFRocmVzaG9sZCBTZXQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19FVkVOVF9TVUJfVFlQRV9USFJFU0hPTERfUkVTUE9OU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiAgICAgICAgIC8qKjwgVGhyZXNob2xkIFJlc3BvbnNlLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N1Yl90eXBlOworCisvKiogQ1RDIEV2ZW50IFN0YXR1cy4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N0YXR1cworeworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfRVZFTlRfU1RBVFVTX0RJU0FCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAvKio8IERpc2FibGVkICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19FVkVOVF9TVEFUVVNfRU5BQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgIC8qKjwgRW5hYmxlZCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfRVZFTlRfU1RBVFVTX05PVF9GT1VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQyOTQ5NjcyOTVVTCAgLyoqPCBOb3QgRm91bmQgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXM7CisKKy8qKiBDVEMgT05VIFNsZWVwIEZsYWcuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2xlZXBfZmxhZworeworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX1NMRUVQX0ZMQUdfTEVBVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBPTlUgbGVhdmVzIGZyb20gcG93ZXIgc2F2aW5nIHN0YXRlICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfU0xFRVBfRkxBR19FTlRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IE9OVSBlbnRlcnMgcG93ZXIgc2F2aW5nIHN0YXRlICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfU0xFRVBfRkxBR19DSEFOR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAvKio8IENoYW5nZSBPTlUgcG93ZXIgc2F2aW5nIG1vZGUsIHNsZWVwIHRpbWUgYW5kIHdha2UgdGltZSAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zbGVlcF9mbGFnOworCisvKiogQ3RjIE9udSBTbGVlcCBNb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NsZWVwX21vZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9TTEVFUF9NT0RFX05PVF9TVVBQT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgRG9uJ3Qgc3VwcG9ydCBzbGVlcCBtb2RlICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfU0xFRVBfTU9ERV9UWF9PTkxZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IEluIHRoaXMgY2FzZSwgb25seSBzdXBwb3J0IFR4IHNsZWVwIG1vZGUgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9TTEVFUF9NT0RFX1RSWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgSW4gdGhpcyBjYXNlLCBUeCBhbmQgUnggY2FuIG9ubHkgc2xlZXAgYXQgdGhlIHNhbWUgdGltZSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX1NMRUVQX01PREVfVFhfQU5EX1RSWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMgICAgICAgICAgICAgLyoqPCBJbiB0aGlzIGNhc2UsIGJvdGggc3VwcG9ydCBUeCBzbGVlcCBhbmQgVHggUnggYm90aCBzbGVlcCAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zbGVlcF9tb2RlOworCisvKiogUFAgUG8gRSBUZXN0IFN0YXR1cy4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fcHBwb19ldGVzdF9zdGF0dXMKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fUFBQT19FVEVTVF9TVEFUVVNfVU5fU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgVW5TdGFydC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUFBQT19FVEVTVF9TVEFUVVNfVEVTVElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgVGVzdGluZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUFBQT19FVEVTVF9TVEFUVVNfVEVTVF9PVkVSX0FORF9QQVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgVGVzdE92ZXJBbmRQYXNzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QUFBPX0VURVNUX1NUQVRVU19URVNUX09WRVJfQU5EX0ZBSUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMgICAgICAgICAgICAgLyoqPCBUZXN0T3ZlckFuZEZhaWwuICovCit9IGJjbW9sdF9lcG9uX29hbV9wcHBvX2V0ZXN0X3N0YXR1czsKKworLyoqIFBQIFBvIEUgVGVzdCBGYWlsIFJlYXNvbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fcHBwb19ldGVzdF9mYWlsX3JlYXNvbgoreworICAgIEJDTU9MVF9FUE9OX09BTV9QUFBPX0VURVNUX0ZBSUxfUkVBU09OX05VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBOdWxsLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QUFBPX0VURVNUX0ZBSUxfUkVBU09OX1VOS05PV04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBVbmtub3duLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QUFBPX0VURVNUX0ZBSUxfUkVBU09OX0hBUkRXQVJFX05PVF9TVVBQT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBIYXJkd2FyZU5vdFN1cHBvcnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1BQUE9fRVRFU1RfRkFJTF9SRUFTT05fVkxBTl9OT1RfQ09ORklHVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IFZsYW5Ob3RDb25maWd1cmUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1BQUE9fRVRFU1RfRkFJTF9SRUFTT05fVElNRU9VVF9GT1JfUEFESSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IFRpbWVvdXRGb3JQQURJLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QUFBPX0VURVNUX0ZBSUxfUkVBU09OX1RJTUVPVVRfRk9SX1BBRFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgLyoqPCBUaW1lb3V0Rm9yUEFEUi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUFBQT19FVEVTVF9GQUlMX1JFQVNPTl9MQ1BORUdfRkFJTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAgICAgICAgIC8qKjwgTENQTmVnRmFpbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUFBQT19FVEVTVF9GQUlMX1JFQVNPTl9BVVRIX0ZBSUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAgICAgICAgIC8qKjwgQXV0aEZhaWwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1BQUE9fRVRFU1RfRkFJTF9SRUFTT05fSVBORUdfRkFJTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCAgICAgICAgICAgICAvKio8IElQTmVnRmFpbC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3BwcG9fZXRlc3RfZmFpbF9yZWFzb247CisKKy8qKiBTdGFydCBPciBTdG9wIEluZGljYXRpb24uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3N0YXJ0X29yX3N0b3BfaW5kaWNhdGlvbgoreworICAgIEJDTU9MVF9FUE9OX09BTV9TVEFSVF9PUl9TVE9QX0lORElDQVRJT05fU1RPUF9URVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBTdG9wVGVzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU1RBUlRfT1JfU1RPUF9JTkRJQ0FUSU9OX1NUQVJUX1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxICAgICAgICAgICAgIC8qKjwgU3RhcnRUZXN0LiAqLworfSBiY21vbHRfZXBvbl9vYW1fc3RhcnRfb3Jfc3RvcF9pbmRpY2F0aW9uOworCisvKiogUFAgUG8gRSBBdXRoIE1vZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3BwcG9fZWF1dGhfbW9kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9QUFBPX0VBVVRIX01PREVfQVVUTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBBdXRvLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QUFBPX0VBVVRIX01PREVfUEFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBQYXAuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1BQUE9fRUFVVEhfTU9ERV9DSEFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAvKio8IENoYXAuICovCit9IGJjbW9sdF9lcG9uX29hbV9wcHBvX2VhdXRoX21vZGU7CisKKy8qKiBDVEMgU3VwcG9ydGVkIFNlcnZpY2VzLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfc3VwcG9ydGVkX3NlcnZpY2VzCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19TVVBQT1JURURfU0VSVklDRVNfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NVUFBPUlRFRF9TRVJWSUNFU19HRVBPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDEsICAgICAgIC8qKjwgR0UgUG9ydC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NVUFBPUlRFRF9TRVJWSUNFU19GRVBPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDIsICAgICAgIC8qKjwgRkUgUG9ydC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NVUFBPUlRFRF9TRVJWSUNFU19WT0lQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDQsICAgICAgIC8qKjwgVm9JUC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NVUFBPUlRFRF9TRVJWSUNFU19URE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDggICAgICAgIC8qKjwgVERNLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX3N1cHBvcnRlZF9zZXJ2aWNlczsKKworLyoqIENUQyBTZXJ2aWNlIFNMQSBPcGVyYXRpb24uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19zZXJ2aWNlX3NsYV9vcGVyYXRpb24KK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NFUlZJQ0VfU0xBX09QRVJBVElPTl9ERUFDVElWQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgRGVhY3RpdmF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NFUlZJQ0VfU0xBX09QRVJBVElPTl9BQ1RJVkFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxICAgICAgICAgICAgIC8qKjwgQWN0aXZhdGUuICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfc2VydmljZV9zbGFfb3BlcmF0aW9uOworCisvKiogQ1RDIDIuMSBPTlUgREJBIFNjaGVkdWxpbmcgU2NoZW1lIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfZGJhX3NjaGVkdWxpbmdfc2NoZW1lCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfREJBX1NDSEVEVUxJTkdfU0NIRU1FX1NUUklDVF9QUklPUklUWSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IFN0cmljdCBQcmlvcml0eSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0RCQV9TQ0hFRFVMSU5HX1NDSEVNRV9XRUlHSFRFRF9ST1VORF9ST0JJTiAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBXZWlnaHRlZCBSb3VuZC1Sb2JpbiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0RCQV9TQ0hFRFVMSU5HX1NDSEVNRV9TUFBMVVNfV1JSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgLyoqPCBTUCtXUlIgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfZGJhX3NjaGVkdWxpbmdfc2NoZW1lOworCisvKiogQ1RDIE9OVSBUeXBlIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfdHlwZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX1RZUEVfU0ZVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBTRlUgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9UWVBFX0hHVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgSEdVICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfVFlQRV9TQlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IFNCVSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX1RZUEVfQk9YX01EVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBCb3ggTURVIChFdGhlcm5ldCBQb3J0KSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX1RZUEVfU01BTExfTENNRFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBTbWFsbCBMQyBNRFUgKEV0aGVybmV0IFBvcnQpICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfVFlQRV9CT1hfTENNRFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgICAvKio8IEJveCBMQyBNRFUgKERTTCBQb3J0KSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX1RZUEVfQ0hBU1NJU19MQ01EVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBDaGFzc2lzIExDIE1EVSAoRFNMIFBvcnQpICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfVFlQRV9MQ01EVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgICAgICAgICAvKio8IEwvQyBNRFUgKHN1cHBvcnQgbWl4aW5nIGluc2VydGlvbiBvZiBFdGhlcm5ldCBwb3J0IEwvQyBhbmQgRFNMIFBvcnQgTC9DKSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX1RZUEVfQ01DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDkgICAgICAgICAgICAgLyoqPCBDTUMgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfdHlwZTsKKworLyoqIENUQyBPTlUgUHJvdGVjdGlvbiBUeXBlIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfcHJvdGVjdGlvbl90eXBlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfUFJPVEVDVElPTl9UWVBFX05PVF9TVVBQT1JURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IE5vdCBTdXBwb3J0ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfUFJPVEVDVElPTl9UWVBFX1RZUEVfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IFR5cGUgQyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX1BST1RFQ1RJT05fVFlQRV9UWVBFX0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgLyoqPCBUeXBlIEQgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfcHJvdGVjdGlvbl90eXBlOworCisvKiogQ1RDIDIuMSBPTlUgSW50ZXJmYWNlIFR5cGUgCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9pbnRlcmZhY2VfdHlwZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0lOVEVSRkFDRV9UWVBFX0dFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBHYWdhYml0IEV0aGVybmV0ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfSU5URVJGQUNFX1RZUEVfRkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IEZhc3QgRXRoZXJuZXQgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9JTlRFUkZBQ0VfVFlQRV9WT0lQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgVm9JUCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0lOVEVSRkFDRV9UWVBFX1RETSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBURE0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9JTlRFUkZBQ0VfVFlQRV9BRFNMMlBMVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgQURTTDIrICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfSU5URVJGQUNFX1RZUEVfVkRTTDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgICAvKio8IFZEU0wyICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfSU5URVJGQUNFX1RZUEVfV0xBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgICAvKio8IFdMQU4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9JTlRFUkZBQ0VfVFlQRV9VU0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAgICAgICAgIC8qKjwgVVNCICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfSU5URVJGQUNFX1RZUEVfQ0FUVl9SRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCAgICAgICAgICAgICAvKio8IENBVFYgUkYgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfaW50ZXJmYWNlX3R5cGU7CisKKy8qKiBDVEMgTXhVIEdsb2JhbCBQYXJhbXMgV2lkdGguIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfZ2xvYmFsX3BhcmFtc193aWR0aAoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTVhVX0dMT0JBTF9QQVJBTVNfV0lEVEhfSVBWNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3LCAgICAgICAgICAgLyoqPCBJUHY0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTVhVX0dMT0JBTF9QQVJBTVNfV0lEVEhfSVBWNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQxICAgICAgICAgICAgLyoqPCBJUHY2LiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9nbG9iYWxfcGFyYW1zX3dpZHRoOworCisvKiogQ1RDIE14VSBTTk1QIFBhcmFtcyBXaWR0aC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9zbm1wX3BhcmFtc193aWR0aAoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTVhVX1NOTVBfUEFSQU1TX1dJRFRIX0lQVjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwNSwgICAgICAgICAgLyoqPCBJUHY0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTVhVX1NOTVBfUEFSQU1TX1dJRFRIX0lQVjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExNyAgICAgICAgICAgLyoqPCBJUHY2LiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9zbm1wX3BhcmFtc193aWR0aDsKKworLyoqIENUQyBPTlUgUG93ZXIgU3VwcGx5IENvbnRyb2wgCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9wb3dlcl9zdXBwbHlfY29udHJvbF90eXBlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfUE9XRVJfU1VQUExZX0NPTlRST0xfVFlQRV9OT1RfU1VQUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IERvbid0IFN1cHBvcnQgT05VIFBvd2VyIFN1cHBseSBDb250cm9sICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfUE9XRVJfU1VQUExZX0NPTlRST0xfVFlQRV9UWF9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IEluIHRoaXMgY2FzZSwgVHggYW5kIFJ4IHBvd2VyIHN1cHBseSBjYW4gb25seSBiZSBjb250cm9sbGVkIHRvZ2V0aGVyIHdoZXJlYnkgcG93ZXIgZm9yIFJ4IGlzIGFsc28gc2h1dGRvd24gd2hlbiB0aGUgcG93ZXIgdG8gVHggaXMgc2h1dGRvd24gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9QT1dFUl9TVVBQTFlfQ09OVFJPTF9UWVBFX1RYX1JYX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyICAgICAgICAgICAgIC8qKjwgSW4gdGhpcyBjYXNlLCB0eCBhbmQgcnggY2FuIGJlIGNvbnRyb2xsZWQgc2VwYXJhdGVseSB3aGVyZWJ5IHBvd2VyIHRvIFJ4IGlzIHN0aWxsIG9uIHdoaWxlIHRoZSBwb3dlciB0byBUeCBpcyBzaHV0ZG93biAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9wb3dlcl9zdXBwbHlfY29udHJvbF90eXBlOworCisvKiogQ1RDIFZsYW4gTW9kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fbW9kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfVkxBTl9NT0RFX1RSQU5TUEFSRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBUcmFuc3BhcmVudC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZMQU5fTU9ERV9UQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgVGFnLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfVkxBTl9NT0RFX1RSQU5TTEFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBUcmFuc2xhdGlvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZMQU5fTU9ERV9BR0dSRUdBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgQWdncmVnYXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfVkxBTl9NT0RFX1RSVU5LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBUcnVuay4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZMQU5fTU9ERV9TUEVDSUFMX1RSQU5TUEFSRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTUsICAgICAgICAgIC8qKjwgU3BlY2lhbCBUcmFuc3BhcmVudC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZMQU5fTU9ERV9UUlVOS19NRFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOSwgICAgICAgICAgIC8qKjwgVHJ1bmsgTURVLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfVkxBTl9NT0RFX0hZQlJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwICAgICAgICAgICAgLyoqPCBIeWJyaWQuICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9tb2RlOworCisvKiogQ1RDIGNsYXNzaWZpY2F0aW9uIGZpZWxkIHNlbGVjdG9ycyAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfZmllbGQKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0RBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgTUFDIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX1NBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgTUFDIHNvdXJjZSBhZGRyZXNzICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9WTEFOX1BSSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IFZMQU4gcHJpb3JpdHkgKENvUykgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX1ZMQU5fSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgVkxBTiBJRCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfRVRIX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBFdGhlclR5cGUgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0RFU1RfSVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgSVAgZGVzdGluYXRpb24gYWRkcmVzcyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfU09VUkNFX0lQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBJUCBzb3VyY2UgYWRkcmVzcyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfSVBfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAgICAgLyoqPCBJUCBwcm90b2NvbCB0eXBlICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9JUF9UT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgICAgICAgICAvKio8IElQIFRvUyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfSVBfUFJFQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgICAgICAgICAgLyoqPCBJUCBwcmVjZWRlbmNlICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9GSUVMRF9TT1VSQ0VfUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgICAgICAgICAvKio8IFVEUCBzb3VyY2UgcG9ydCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfREVTVF9QT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExLCAgICAgICAgICAgLyoqPCBVRFAgZGVzaW50YXRpb24gcG9ydCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfSVBfVkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyLCAgICAgICAgICAgLyoqPCBJUCBWZXJzaW9uICh2NCBvciB2NikgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0lQX0ZMT1dfTEFCRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMywgICAgICAgICAgIC8qKjwgSVAgRmxvdyBMYWJlbCAoSVB2NikgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX0RTVF9JUFY2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNCwgICAgICAgICAgIC8qKjwgRGVzdGluYXRpb24gSVB2NiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfU1JDX0lQVjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1LCAgICAgICAgICAgLyoqPCBTb3VyY2UgSXB2NiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfRFNUX0lQVjZQUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2LCAgICAgICAgICAgLyoqPCBEZXN0aW5hdGlvbiBJUHY2IFByZWZpeCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfRklFTERfU1JDX0lQVjZQUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3LCAgICAgICAgICAgLyoqPCBTb3VyY2UgSVB2NiBQcmVmaXggKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX0ZJRUxEX05YVF9IRFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOCAgICAgICAgICAgIC8qKjwgTmV4dCBIZWFkZXIgKElQdjYpKHN1Y2ggYXMgVENQL0lQL0lDTVB2NC9JR01QLGV0YykgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9maWVsZDsKKworLyoqIENUQyBjbGFzc2lmaWNhdGlvbiBvcGVyYXRvcnMgCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9PUEVSQVRPUl9ORVZFUl9NQVRDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IE5ldmVyIG1hdGNoICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9PUEVSQVRPUl9FUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IExIUyA9PSBSSFMgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX09QRVJBVE9SX05PVF9FUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgTEhTICE9IFJIUyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfT1BFUkFUT1JfTFRFUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBMSFMgPD0gUkhTICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQ0xBU1NJRl9PUEVSQVRPUl9HVEVRICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IExIUyA+PSBSSFMgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX09QRVJBVE9SX0VYSVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgTWF0Y2ggaWYgdGhlIGZpZWxkIGV4aXN0cyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0NMQVNTSUZfT1BFUkFUT1JfTk9UX0VYSVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBNYXRjaCBpZiB0aGUgZmllbGQgZG9lcyBub3QgZXhpc3QgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9DTEFTU0lGX09QRVJBVE9SX0FMV0FZU19NQVRDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3ICAgICAgICAgICAgIC8qKjwgQWx3YXlzIG1hdGNoICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3I7CisKKy8qKiBDVEMgTXVsdGljYXN0IFZMQU4gT3BlcmF0aW9uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fb3BlcmF0aW9uCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfVkxBTl9PUEVSQVRJT05fREVMRVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IERlbGV0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9WTEFOX09QRVJBVElPTl9BREQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgQWRkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX1ZMQU5fT1BFUkFUSU9OX0NMRUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBDbGVhci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9WTEFOX09QRVJBVElPTl9MSVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzICAgICAgICAgICAgIC8qKjwgTGlzdC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9vcGVyYXRpb247CisKKy8qKiBDVEMgTXVsdGljYXN0IFRhZyBNb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19tb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfVEFHX01PREVfRE9fTk9UX1NUUklQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IERvIE5vdCBTdHJpcC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9UQUdfTU9ERV9TVFJJUF9EQVRBX1FVRVJZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgU3RyaXAgRGF0YS9RdWVyeS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9UQUdfTU9ERV9TVFJJUF9EQVRBX1FVRVJZX0lQVFYgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyICAgICAgICAgICAgIC8qKjwgU3RyaXAgRGF0YS9RdWVyeS9JUFRWLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF90YWdfbW9kZTsKKworLyoqIENUQyBNdWx0aWNhc3QgU3dpdGNoIE1vZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfc3dpdGNoX21vZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9TV0lUQ0hfTU9ERV9JR01QX01MRF9TTk9PUElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgSUdNUC9NTEQgU25vb3BpbmcgZHVhbCBzdGFjayBtb2RlICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfU1dJVENIX01PREVfQ1RDX0NPTlRST0xMQUJMRV9JR01QX01MRCAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IENUQyBjb250cm9sbGFibGUgSUdNUC9NTEQgbW9kZSwgc25vb3BpbmcgZGlzYWJsZWQgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9TV0lUQ0hfTU9ERV9JR01QX1NOT09QSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgSUdNUCBzbm9vcGluZyBtb2RlICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfU1dJVENIX01PREVfQ1RDX0NPTlRST0xMQUJMRV9JR01QICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IENUQyBjb250cm9sbGFibGUgSUdNUCBtb2RlLCBzbm9vcGluZyBkaXNhYmxlZCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX1NXSVRDSF9NT0RFX1VOREVGSU5FRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyNyAgICAgICAgICAgLyoqPCBVbmRlZmluZWQgbW9kZSwgaGFzIG5vdCBiZWVuIHNldCB5ZXQgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfc3dpdGNoX21vZGU7CisKKy8qKiBDVEMgTXVsdGljYXN0IENvbnRyb2wgQWN0aW9uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfYWN0aW9uCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfQ09OVFJPTF9BQ1RJT05fREVMRVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IERlbGV0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9DT05UUk9MX0FDVElPTl9BREQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgQWRkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX0NPTlRST0xfQUNUSU9OX0NMRUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBDbGVhci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9DT05UUk9MX0FDVElPTl9MSVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzICAgICAgICAgICAgIC8qKjwgTGlzdC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9hY3Rpb247CisKKy8qKiBDVEMgTXVsdGljYXN0IENvbnRyb2wgVHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX3R5cGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9DT05UUk9MX1RZUEVfR0RBX01BQ19PTkxZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgR0RBIE1BQyBPbmx5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfTVVMVElDQVNUX0NPTlRST0xfVFlQRV9HREFfTUFDX1BMVVNfVkxBTl9JRCAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBHREEgTUFDICsgVkxBTiBJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9DT05UUk9MX1RZUEVfR0RBX01BQ19QTFVTX0lQVjRTQSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgR0RBIE1BQyArIElQdjQgU0EuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfQ09OVFJPTF9UWVBFX0dEQV9JUFBMVVNfTUNBU1RfVkxBTl9JRCAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IEdEQSBJUCArIE1jYXN0IFZMQU4gSUQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19NVUxUSUNBU1RfQ09OVFJPTF9UWVBFX0dEQV9JUFY2UExVU19NQ0FTVF9WTEFOX0lEICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IEdEQSBJUHY2ICsgTWNhc3QgVkxBTiBJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX01VTFRJQ0FTVF9DT05UUk9MX1RZUEVfR0RBX01BQ19QTFVTX0lQVjZTQSAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1ICAgICAgICAgICAgIC8qKjwgR0RBIE1BQyArIElQdjYgU0EuICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfdHlwZTsKKworLyoqIENUQyAyLjEgcG9zc2libGUgVm9JUCBwcm90b2NvbHMgCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaXBfcHJvdG9jb2wKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZPSVBfUFJPVE9DT0xfSDI0OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgSDI0OCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfVk9JUF9QUk9UT0NPTF9TSVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgICAgICAgICAgICAgLyoqPCBTSVAgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y192b2lwX3Byb3RvY29sOworCisvKiogQ1RDIDIuMSBWb2ljZSBJUCBNb2RlIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV9pcG1vZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZPSUNFX0lQTU9ERV9TVEFUSUNfSVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgU3RhdGljIElQIGFkZHJlc3MgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZPSUNFX0lQTU9ERV9ESENQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgREhDUCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfVk9JQ0VfSVBNT0RFX1BQUE9FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgLyoqPCBQUFBvRS9QUFBvRSsgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV9pcG1vZGU7CisKKy8qKiBDVEMgUFBQb0UgTW9kZSAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfcHBwb2VfbW9kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfUFBQT0VfTU9ERV9BVVRPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBBdXRvICAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfUFBQT0VfTU9ERV9DSEFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBDaGFsbGVuZ2UgSGFuZHNoYWtlIEF1dGhlbnRpY2F0aW9uIFByb3RvY29sICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19QUFBPRV9NT0RFX1BBUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAvKio8IFBhc3N3b3JkIEF1dGhlbnRpY2F0aW9uIFByb3RvY29sICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfcHBwb2VfbW9kZTsKKworLyoqIENUQyAyLjEgVm9pY2UgVGFnZ2luZyBNb2RlIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV90YWdnaW5nX21vZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZPSUNFX1RBR0dJTkdfTU9ERV9QQVNTX1RIUk9VR0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgUGFzcyBUaHJvdWdoICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19WT0lDRV9UQUdHSU5HX01PREVfVEFHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IFRhZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfVk9JQ0VfVEFHR0lOR19NT0RFX1ZMQU5fU1RBQ0tJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgLyoqPCBWTEFOIFN0YWNraW5nICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfdGFnZ2luZ19tb2RlOworCisvKiogQ1RDIDIuMSBIMjQ4IFJlZ2lzdHJhdGlvbiBNb2RlIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19oMjQ4cmVnX21vZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0gyNDhSRUdfTU9ERV9JUEFERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgSVAgYWRkcmVzcyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfSDI0OFJFR19NT0RFX0RPTUFJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBEb21haW4gbmFtZSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfSDI0OFJFR19NT0RFX0RFVklDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgLyoqPCBEZXZpY2UgbmFtZSAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2gyNDhyZWdfbW9kZTsKKworLyoqIENUQyAyLjEgSDI0OCBIZWFydGJlYXQgTW9kZSAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfaDI0OGhlYXJ0YmVhdF9tb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19IMjQ4SEVBUlRCRUFUX01PREVfQ0xPU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IENsb3NlICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19IMjQ4SEVBUlRCRUFUX01PREVfSDI0OENUQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSAgICAgICAgICAgICAvKio8IEguMjQ4LUNUQyBzdGFuZGFyZCBOb3RpZnkgY29tbWFuZCAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2gyNDhoZWFydGJlYXRfbW9kZTsKKworLyoqIFBvc3NpYmxlIENUQyAyLjEgUlRQIFRJRCBjb25maWd1cmF0aW9uIG1vZGVzIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19ydHBfdGlkX21vZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1JUUF9USURfTU9ERV9BTElHTk1FTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgQWxpZ25tZW50LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfUlRQX1RJRF9NT0RFX05PTl9BTElHTk1FTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgICAgICAgICAgICAgLyoqPCBOb24tQWxpZ25tZW50LiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX3J0cF90aWRfbW9kZTsKKworLyoqIENUQyAyLjEgVm9pY2UgVDM4IE1vZGUgCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX3QzOG1vZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZPSUNFX1QzOE1PREVfUEFTU1RIUk9VR0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgVm9pY2UgcGFzc3Rocm91Z2ggbW9kZSAoVDMwKSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfVk9JQ0VfVDM4TU9ERV9UMzhNT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgICAgICAgICAgICAgLyoqPCBUMzggTW9kZSAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX3QzOG1vZGU7CisKKy8qKiBDVEMgMi4xIFZvaWNlL0ZheCBNb2RlbSBDb250cm9sIE1vZGUgCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX2ZheF9tb2RlbV9jb250cm9sX21vZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZPSUNFX0ZBWF9NT0RFTV9DT05UUk9MX01PREVfTkVHT1RJQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgTmVnb3RpYXRpb24gTW9kZSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfVk9JQ0VfRkFYX01PREVNX0NPTlRST0xfTU9ERV9BVVRPX0JWRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgICAgICAgICAgICAgLyoqPCBBdXRvIEJWRCAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX2ZheF9tb2RlbV9jb250cm9sX21vZGU7CisKKy8qKiBDVEMgMi4xIElBRCBPcGVyYXRpb24gU3RhdHVzIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfb3BlcmF0aW9uX3N0YXR1cworeworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfSUFEX09QRVJBVElPTl9TVEFUVVNfUkVHSVNURVJJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBSZWdpc3RlcmluZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfSUFEX09QRVJBVElPTl9TVEFUVVNfUkVHX1NVQ0NFU1NGVUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBSZWdpc3RyYXRpb24gU3VjY2Vzc2Z1bCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfSUFEX09QRVJBVElPTl9TVEFUVVNfSUFEX0ZBVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBJQUQgRmF1bHQgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0lBRF9PUEVSQVRJT05fU1RBVFVTX0xPR09VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgTG9nb3V0ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19JQURfT1BFUkFUSU9OX1NUQVRVU19JQURfUkVTVEFSVElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCAgICAgICAgICAgICAvKio8IElBRCBSZXN0YXJ0aW5nICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX29wZXJhdGlvbl9zdGF0dXM7CisKKy8qKiBDVEMgMi4xIElBRCBQb3J0IFN0YXR1cyAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX3BvcnRfc3RhdHVzCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19JQURfUE9SVF9TVEFUVVNfUkVHSVNUUklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IFBvcnQgaXMgcmVnaXN0cmluZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfSUFEX1BPUlRfU1RBVFVTX0lETEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBQb3J0IGlzIGlkbGUgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0lBRF9QT1JUX1NUQVRVU19QSUNLVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgUGljayB1cCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfSUFEX1BPUlRfU1RBVFVTX0RJQUxJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBEaWFsaW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19JQURfUE9SVF9TVEFUVVNfUklOR0lORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IFJpbmdpbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0lBRF9QT1JUX1NUQVRVU19SSU5HQkFDSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgUmluZ2luZyBiYWNrICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19JQURfUE9SVF9TVEFUVVNfQ09OTkVDVElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgICAvKio8IENvbm5lY3RpbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0lBRF9QT1JUX1NUQVRVU19DT05ORUNURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAgICAgICAgIC8qKjwgQ29ubmVjdGVkICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19JQURfUE9SVF9TVEFUVVNfUkVMRUFTSU5HX0NPTk5FQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgICAgICAgICAvKio8IFJlbGVhc2luZyBDb25uZWN0aW9uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19JQURfUE9SVF9TVEFUVVNfUkVHSVNUUkFUSU9OX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgICAgICAgICAvKio8IFBvcnQgUmVnaXN0cmF0aW9uIEZhaWx1cmUgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0lBRF9QT1JUX1NUQVRVU19OT1RfQUNUSVZBVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCAgICAgICAgICAgIC8qKjwgUG9ydCBpcyBub3QgYWN0aXZhdGVkICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX3BvcnRfc3RhdHVzOworCisvKiogQ1RDIDIuMSBJQUQgUG9ydCBTZXJ2aWNlIFN0YXRlIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9zZXJ2aWNlX3N0YXRlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19JQURfUE9SVF9TRVJWSUNFX1NUQVRFX0VORF9MT0NBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IExvY2FsIGVuZCB0ZXJtaW5hdGVzIHNlcnZpY2UsIGNhdXNlZCBieSAndXNlciBkaXNhYmxlIHBvcnQnICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19JQURfUE9SVF9TRVJWSUNFX1NUQVRFX0VORF9SRU1PVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IFJlbW90ZSBhbmQgdGVybWluYXRlcyBzZXJ2aWNlLCBjYXVzZWQgYnkgJ01HQyBzZW5kcyBkb3duIGNvbW1hbmQnICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19JQURfUE9SVF9TRVJWSUNFX1NUQVRFX0VORF9BVVRPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IEF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHNlcnZpY2UsIGNhdXNlZCBieSBNR0MgZmF1bHQgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0lBRF9QT1JUX1NFUlZJQ0VfU1RBVEVfTk9STUFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzICAgICAgICAgICAgIC8qKjwgTm9ybWFsIHNlcnZpY2Ugbm9ybWFsICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX3BvcnRfc2VydmljZV9zdGF0ZTsKKworLyoqIENUQyAyLjEgSUFEIFBvcnQgQ29kZWMgTW9kZSAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX3BvcnRfY29kZWNfbW9kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfSUFEX1BPUlRfQ09ERUNfTU9ERV9HNzExQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBHLjcxMSBBICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19JQURfUE9SVF9DT0RFQ19NT0RFX0c3MjkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IEcuNzI5ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19JQURfUE9SVF9DT0RFQ19NT0RFX0c3MTFVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IEcuNzExIFUgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0lBRF9QT1JUX0NPREVDX01PREVfRzcyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgRy43MjMgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0lBRF9QT1JUX0NPREVDX01PREVfRzcyNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgRy43MjYgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0lBRF9QT1JUX0NPREVDX01PREVfVDM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1ICAgICAgICAgICAgIC8qKjwgVC4zOCAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9wb3J0X2NvZGVjX21vZGU7CisKKy8qKiBDVEMgMi4xIElBRCBPcGVyYXRpb24gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9vcGVyYXRpb24KK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0lBRF9PUEVSQVRJT05fUkVfUkVHSVNURVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgUmUtUmVnaXN0ZXIgZm9yIHNvZnRzd2l0Y2ggcGxhdGZvcm0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0lBRF9PUEVSQVRJT05fTE9HT1VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgTG9nb3V0IGZyb20gc29mdHN3aXRjaCBwbGF0Zm9ybSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfSUFEX09QRVJBVElPTl9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgLyoqPCBSZXNldCwgb25seSBmb3Igdm9pY2UgbW9kdWxlICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX29wZXJhdGlvbjsKKworLyoqIFp0ZSBPbnUgUG9ydCBNYWMgT3BlcmF0aW9uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV96dGVfb251X3BvcnRfbWFjX29wZXJhdGlvbgoreworICAgIEJDTU9MVF9FUE9OX09BTV9aVEVfT05VX1BPUlRfTUFDX09QRVJBVElPTl9ERUxFVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBEZWxldGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1pURV9PTlVfUE9SVF9NQUNfT1BFUkFUSU9OX0FERCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IEFkZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fWlRFX09OVV9QT1JUX01BQ19PUEVSQVRJT05fQ0xFQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgQ2xlYXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1pURV9PTlVfUE9SVF9NQUNfT1BFUkFUSU9OX0xJU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgICAgICAvKio8IExpc3QuICovCit9IGJjbW9sdF9lcG9uX29hbV96dGVfb251X3BvcnRfbWFjX29wZXJhdGlvbjsKKworLyoqIFp0ZSBJc29sYXRlIE1vZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3p0ZV9pc29sYXRlX21vZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fWlRFX0lTT0xBVEVfTU9ERV9OT1RfSVNPTEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgRXRoZXJuZXQgcG9ydCBkbyBub3QgaXNvbGF0ZSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9aVEVfSVNPTEFURV9NT0RFX0lTT0xBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgICAgICAgICAgICAgLyoqPCBFdGhlcm5ldCBwb3J0IGlzb2xhdGUgKi8KK30gYmNtb2x0X2Vwb25fb2FtX3p0ZV9pc29sYXRlX21vZGU7CisKKy8qKiBadGUgQnVmZmVyIE1hbmFnZSBNb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV96dGVfYnVmZmVyX21hbmFnZV9tb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1pURV9CVUZGRVJfTUFOQUdFX01PREVfTk9UU1VQUE9SVEJVRkZFUk1BTkFHRSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IE5vdFN1cHBvcnRCdWZmZXJNYW5hZ2UuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1pURV9CVUZGRVJfTUFOQUdFX01PREVfU1VQUE9SVEJVRkZFUk1BTkFHRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSAgICAgICAgICAgICAvKio8IFN1cHBvcnRCdWZmZXJNYW5hZ2UuICovCit9IGJjbW9sdF9lcG9uX29hbV96dGVfYnVmZmVyX21hbmFnZV9tb2RlOworCisvKiogWnRlIERTIEJ1ZiBEaXJlY3Rpb24uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3p0ZV9kc2J1Zl9kaXJlY3Rpb24KK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fWlRFX0RTQlVGX0RJUkVDVElPTl9VUFNUUkVBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgVXBzdHJlYW0uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1pURV9EU0JVRl9ESVJFQ1RJT05fRE9XTlNUUkVBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IERvd25zdHJlYW0uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1pURV9EU0JVRl9ESVJFQ1RJT05fQk9USF9VUFNUUkVBTV9BTkRfRE9XTlNUUkVBTSAgICAgICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAvKio8IEJvdGggVXBzdHJlYW0gQW5kIERvd25zdHJlYW0uICovCit9IGJjbW9sdF9lcG9uX29hbV96dGVfZHNidWZfZGlyZWN0aW9uOworCisvKiogWnRlIFN0YXRpc3RpY3MgQWN0aW9uIE1vZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3p0ZV9zdGF0aXN0aWNzX2FjdGlvbl9tb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1pURV9TVEFUSVNUSUNTX0FDVElPTl9NT0RFX09OVV9VTklfU1RPUF9TVEFUSVNUSUNTICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IE9udVVOSVN0b3BTdGF0aXN0aWNzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9aVEVfU1RBVElTVElDU19BQ1RJT05fTU9ERV9PTlVfVU5JX1NUQVJUX1NUQVRJU1RJQ1MgICAgICAgICAgICAgICAgICAgICA9IDEgICAgICAgICAgICAgLyoqPCBPbnVVTklTdGFydFN0YXRpc3RpY3MuICovCit9IGJjbW9sdF9lcG9uX29hbV96dGVfc3RhdGlzdGljc19hY3Rpb25fbW9kZTsKKworLyoqIFp0ZSBTdGF0aXN0aWNzIFJlc2V0IE1vZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3p0ZV9zdGF0aXN0aWNzX3Jlc2V0X21vZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fWlRFX1NUQVRJU1RJQ1NfUkVTRVRfTU9ERV9PTlVfUkVTRVRfU1RBVElTVElDU19DT1VOVEVSICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgT251IFJlc2V0IFN0YXRpc3RpY3MgQ291bnRlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fWlRFX1NUQVRJU1RJQ1NfUkVTRVRfTU9ERV9LRUVQX1NUQVRJU1RJQ1NfQ09VTlRFUiAgICAgICAgICAgICAgICAgICAgICAgPSAxICAgICAgICAgICAgIC8qKjwgS2VlcCBTdGF0aXN0aWNzIENvdW50ZXIuICovCit9IGJjbW9sdF9lcG9uX29hbV96dGVfc3RhdGlzdGljc19yZXNldF9tb2RlOworCisvKiogVW5pIEZsb3cgU3RhdGlzdGljcyBDb2xsZWN0IENvbnRyb2wgTW9kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fdW5pX2Zsb3dfc3RhdGlzdGljc19jb2xsZWN0X2NvbnRyb2xfbW9kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9VTklfRkxPV19TVEFUSVNUSUNTX0NPTExFQ1RfQ09OVFJPTF9NT0RFX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBEaXNhYmxlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9VTklfRkxPV19TVEFUSVNUSUNTX0NPTExFQ1RfQ09OVFJPTF9NT0RFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgICAgICAgICAgICAgLyoqPCBFbmFibGUuICovCit9IGJjbW9sdF9lcG9uX29hbV91bmlfZmxvd19zdGF0aXN0aWNzX2NvbGxlY3RfY29udHJvbF9tb2RlOworCisvKiogTGlnaHQgSW5kaWNhdGlvbiBNb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9saWdodF9pbmRpY2F0aW9uX21vZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fTElHSFRfSU5ESUNBVElPTl9NT0RFX05PUk1BTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgTm9ybWFsLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9MSUdIVF9JTkRJQ0FUSU9OX01PREVfRVhDRVBUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgICAgICAgICAgICAgLyoqPCBFeGNlcHRpb24uICovCit9IGJjbW9sdF9lcG9uX29hbV9saWdodF9pbmRpY2F0aW9uX21vZGU7CisKKy8qKiBNYXRjaCBNYWMgQWRkcmVzcy4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fbWF0Y2hfbWFjX2FkZHJlc3NfbW9kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9NQVRDSF9NQUNfQUREUkVTU19NT0RFX0lHTk9SRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBJZ25vcmUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX01BVENIX01BQ19BRERSRVNTX01PREVfRVhDVVRFX01BVENIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSAgICAgICAgICAgICAvKio8IEV4Y3V0ZSBNYXRjaC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX21hdGNoX21hY19hZGRyZXNzX21vZGU7CisKKy8qKiBadGUgTGlnaHQgQ29udHJvbCBBY3Rpb24gTW9kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fenRlX2xpZ2h0X2NvbnRyb2xfYWN0aW9uX21vZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fWlRFX0xJR0hUX0NPTlRST0xfQUNUSU9OX01PREVfT1BFTl9UUkFOU0ZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgT3BlbiBUcmFuc2Zlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fWlRFX0xJR0hUX0NPTlRST0xfQUNUSU9OX01PREVfQ0xPU0VfVFJBTlNGRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgQ2xvc2UgVHJhbnNmZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1pURV9MSUdIVF9DT05UUk9MX0FDVElPTl9NT0RFX0NMT1NFX09QVElDQUxfTU9ERUwgICAgICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAvKio8IENsb3NlIE9wdGljYWwgTW9kZWwuICovCit9IGJjbW9sdF9lcG9uX29hbV96dGVfbGlnaHRfY29udHJvbF9hY3Rpb25fbW9kZTsKKworLyoqIE9OVSBFeGNsIEFiaWxpdHkuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX29udV9leGNsX2FiaWxpdHkKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fT05VX0VYQ0xfQUJJTElUWV9OT1RTVVBQT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgTm90U3VwcG9ydC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT05VX0VYQ0xfQUJJTElUWV9TVVBQT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxICAgICAgICAgICAgIC8qKjwgU3VwcG9ydC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX29udV9leGNsX2FiaWxpdHk7CisKKy8qKiBDVEMgT05VIEVhcmx5IFdha2UgQ2FwYWJpbGl0eS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9lYXJseV93YWtlX2NhcGFiaWxpdHkKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9FQVJMWV9XQUtFX0NBUEFCSUxJVFlfU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgU3VwcG9ydGVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0VBUkxZX1dBS0VfQ0FQQUJJTElUWV9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgICAgICAgICAgICAgLyoqPCBOb3QgU3VwcG9ydGVkLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9lYXJseV93YWtlX2NhcGFiaWxpdHk7CisKKy8qKiBDVEMgUG9ydCBEaXNhYmxlIE9uIExvb3AgRGV0ZWN0ZWQgU3RhdGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19wb3J0X2Rpc2FibGVfb25fbG9vcF9kZXRlY3RlZF9zdGF0ZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfUE9SVF9ESVNBQkxFX09OX0xPT1BfREVURUNURURfU1RBVEVfRElTQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBXaGVuIHBvcnQgbG9vcGJhY2sgaXMgZGV0ZWN0ZWQsIGRvIG5vdCBkaXNhYmxlIHRoaXMgcG9ydCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfUE9SVF9ESVNBQkxFX09OX0xPT1BfREVURUNURURfU1RBVEVfRU5BQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgICAgICAgICAgICAgLyoqPCBXaGVuIHBvcnQgbG9vcGJhY2sgaXMgZGV0ZWN0ZWQsIGRpc2FibGUgdGhpcyBwb3J0IGF1dG9tYXRpY2FsbHkgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19wb3J0X2Rpc2FibGVfb25fbG9vcF9kZXRlY3RlZF9zdGF0ZTsKKworLyoqIENUQyBNb25pdG9yaW5nIFN0YXR1cy4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX21vbml0b3Jpbmdfc3RhdHVzCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19NT05JVE9SSU5HX1NUQVRVU19ESVNBQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IERpc2FibGUgT05VIHBlcmZvcm1hbmNlIG1vbml0b3JpbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX01PTklUT1JJTkdfU1RBVFVTX0VOQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyICAgICAgICAgICAgIC8qKjwgRW5hYmxlIE9OVSBwZXJmb3JtYW5jZSBtb25pdG9yaW5nICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfbW9uaXRvcmluZ19zdGF0dXM7CisKKy8qKiBDVEMgRmlsZSBDaGVjayBPcGNvZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19maWxlX2NoZWNrX29wY29kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfRklMRV9DSEVDS19PUENPREVfRU5EX0RPV05MT0FEX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBFbmQgRG93bmxvYWQgUmVxdWVzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX0ZJTEVfQ0hFQ0tfT1BDT0RFX0VORF9ET1dOTE9BRF9SRVNQT05TRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3ICAgICAgICAgICAgIC8qKjwgRW5kIERvd25sb2FkIFJlc3BvbnNlLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2ZpbGVfY2hlY2tfb3Bjb2RlOworCisvKiogQ1RDIFJQUyBDb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfcnBzX2NvZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1JQU19DT0RFX0NIRUNLX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgQ2hlY2sgU3VjY2Vzcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1JQU19DT0RFX1dSSVRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgV3JpdGluZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1JQU19DT0RFX0NIRUNLX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgQ2hlY2sgRXJyb3IuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19SUFNfQ09ERV9QQVJBTUVURVJfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IFBhcmFtZXRlciBFcnJvci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1JQU19DT0RFX05PVF9TVVBQT1JURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0ICAgICAgICAgICAgIC8qKjwgTm90IFN1cHBvcnRlZC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19ycHNfY29kZTsKKworLyoqIENUQyBPTlUgQXV0aCBDb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2F1dGhfY29kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT05VX0FVVEhfQ09ERV9BVVRIX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBBdXRoIFJlcXVlc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQVVUSF9DT0RFX0FVVEhfUkVTUE9OU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IEF1dGggUmVzcG9uc2UuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PTlVfQVVUSF9DT0RFX0FVVEhfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IEF1dGggU3VjY2Vzcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09OVV9BVVRIX0NPREVfQVVUSF9GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0ICAgICAgICAgICAgIC8qKjwgQXV0aCBGYWlsdXJlLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9hdXRoX2NvZGU7CisKKy8qKiBXZWxsLWtub3duIGNvbXBhbnkgT1VJcy4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fd2VsbF9rbm93bl9vdWkKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfRFBPRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MDk2LCAgICAgICAgIC8qKjwgRFBvRSBPVUkgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQ1RDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMTE4NDgxVUwsICAgIC8qKjwgQ1RDJ3MgT1VJICovCisgICAgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1RFSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzUxMCwgICAgICAgICAvKio8IFRlaydzIE9VSSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9LVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExMTg0ODEwVUwsICAgLyoqPCBLVCdzIE9VSSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EQVNBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUzNDUxVUwsICAgICAgLyoqPCBEYXNhbidzIE9VSSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9QTUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyODUsICAgICAgICAgLyoqPCBQTUMncyBPVUkgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQlJDTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0MTIwLCAgICAgICAgIC8qKjwgQnJvYWRjb20ncyBPVUkgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfU0lFUE9OX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1ODIwNTU5VUwgICAgIC8qKjwgU0lFUE9OIE9VSV9BICovCit9IGJjbW9sdF9lcG9uX29hbV93ZWxsX2tub3duX291aTsKKworLyoqIENUQyBjbGFzc2lmaWNhdGlvbiBvcGVyYXRvcnMgCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGVfb3BlcmF0b3IKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1JVTEVfT1BFUkFUT1JfTkVWRVJfTUFUQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgTmV2ZXIgbWF0Y2ggKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1JVTEVfT1BFUkFUT1JfRVFVQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgTEhTID09IFJIUyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfUlVMRV9PUEVSQVRPUl9OT1RfRVFVQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBMSFMgIT0gUkhTICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19SVUxFX09QRVJBVE9SX0xURVEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IExIUyA8PSBSSFMgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1JVTEVfT1BFUkFUT1JfR1RFUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgTEhTID49IFJIUyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfUlVMRV9PUEVSQVRPUl9FWElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgLyoqPCBNYXRjaCBpZiB0aGUgZmllbGQgZXhpc3RzICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19SVUxFX09QRVJBVE9SX05PVF9FWElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgICAvKio8IE1hdGNoIGlmIHRoZSBmaWVsZCBkb2VzIG5vdCBleGlzdCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfUlVMRV9PUEVSQVRPUl9BTFdBWVNfTUFUQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcgICAgICAgICAgICAgLyoqPCBBbHdheXMgbWF0Y2ggKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19ydWxlX29wZXJhdG9yOworCisvKiogQ1RDIFNvZnR3YXJlIERvd25sb2FkIERhdGEgVHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX3NvZnR3YXJlX2Rvd25sb2FkX2RhdGFfdHlwZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfU09GVFdBUkVfRE9XTkxPQURfREFUQV9UWVBFX1RGVFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBURlRQLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfU09GVFdBUkVfRE9XTkxPQURfREFUQV9UWVBFX0RBVEFfQ0hFQ0tJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBEYXRhIENoZWNraW5nLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfU09GVFdBUkVfRE9XTkxPQURfREFUQV9UWVBFX1NXTUlSUk9SSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBTL1cgTWlycm9yaW5nLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfU09GVFdBUkVfRE9XTkxPQURfREFUQV9UWVBFX0NPTU1JVF9JTUFHRSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQgICAgICAgICAgICAgLyoqPCBDb21taXQgSW1hZ2UuICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfZGF0YV90eXBlOworCisvKiogQ1RDIFRGVFAgT3AgQ29kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfb3BfY29kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfVEZUUF9PUF9DT0RFX1dSSVRFX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBXcml0ZSBSZXF1ZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfVEZUUF9PUF9DT0RFX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBEYXRhLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfVEZUUF9PUF9DT0RFX0FDSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBBY2suICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19URlRQX09QX0NPREVfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSAgICAgICAgICAgICAvKio8IEVycm9yLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfb3BfY29kZTsKKworLyoqIENUQyBTL1cgTWlycm9yIE9wY29kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX29wY29kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfU1dNSVJST1JfT1BDT0RFX0FDVElWQVRFX0lNQUdFX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgICAgICAgICAgLyoqPCBBY3RpdmF0ZSBJbWFnZSBSZXF1ZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfU1dNSVJST1JfT1BDT0RFX0FDVElWQVRFX0lNQUdFX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDkgICAgICAgICAgICAgLyoqPCBBY3RpdmF0ZSBJbWFnZSBSZXNwb25zZS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9vcGNvZGU7CisKKy8qKiBDVEMgUy9XIE1pcnJvciBBY3RpdmF0ZSBJbWFnZSBGbGFnLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYWN0aXZhdGVfaW1hZ2VfZmxhZworeworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfU1dNSVJST1JfQUNUSVZBVEVfSU1BR0VfRkxBR19SVU5fQkFDS1VQICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAgICAgICAgICAgICAgLyoqPCBSdW4gQmFja3VwLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2FjdGl2YXRlX2ltYWdlX2ZsYWc7CisKKy8qKiBDVEMgUy9XIE1pcnJvciBBY2suIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9hY2sKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NXTUlSUk9SX0FDS19TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgU3VjY2Vzcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1NXTUlSUk9SX0FDS19QQVJBTUVURVJfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgUGFyYW1ldGVyIEVycm9yLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfU1dNSVJST1JfQUNLX05PVF9TVVBQT1JURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBOb3QgU3VwcG9ydGVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfU1dNSVJST1JfQUNLX0xPQURJTkdfRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMgICAgICAgICAgICAgLyoqPCBMb2FkaW5nIEZhaWx1cmUuICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYWNrOworCisvKiogS1QgT3B0aWNhbCBQb3dlciBBbGFybSBTdGF0dXMuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2t0b3B0aWNhbF9wb3dlcl9hbGFybV9zdGF0dXMKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fS1RPUFRJQ0FMX1BPV0VSX0FMQVJNX1NUQVRVU19BTEFSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgQWxhcm0gaXMgYWN0aXZlIChsaW5lIExFRCBpcyBvcmFuZ2UpICovCisgICAgQkNNT0xUX0VQT05fT0FNX0tUT1BUSUNBTF9QT1dFUl9BTEFSTV9TVEFUVVNfQ0xFQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAvKio8IEFsYXJtIGlzIGNsZWFyIChsaW5lIExFRCBpcyBncmVlbikgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2t0b3B0aWNhbF9wb3dlcl9hbGFybV9zdGF0dXM7CisKKy8qKiBLVCBMZWFmIEFjdGlvbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2FjdGlvbgoreworICAgIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQUNUSU9OX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBFbmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0tUTEVBRl9BQ1RJT05fT05VX0NPVU5URVJfQ0xFQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IE9OVSBDb3VudGVyIENsZWFyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9LVExFQUZfQUNUSU9OX1JFU1RPUkVfT05VICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBSZXN0b3JlIE9OVS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fS1RMRUFGX0FDVElPTl9UWFBPV0VSX09GRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzICAgICAgICAgICAgIC8qKjwgVFggUG93ZXIgT2ZmLiAqLworfSBiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2FjdGlvbjsKKworLyoqIENUQyBPcGNvZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y19vcGNvZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9HRVRfUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgR2V0IFJlcXVlc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfR0VUX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IEdldCBSZXNwb25zZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9TRVRfUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgU2V0IFJlcXVlc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfU0VUX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IFNldCBSZXNwb25zZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9PTlVfQVVUSEVOVElDQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgT05VIEF1dGhlbnRpY2F0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX1NPRlRXQVJFX0RPV05MT0FEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBTb2Z0d2FyZSBEb3dubG9hZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9DSFVSTklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5LCAgICAgICAgICAgIC8qKjwgQ2h1cm5pbmcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19PUENPREVfREJBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgICAgICAgICAvKio8IERCQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX09QQ09ERV9LVE9OVV9FVkVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNSwgICAgICAgICAgIC8qKjwgS1QgT05VIEV2ZW50LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfT1BDT0RFX0VWRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1NSAgICAgICAgICAgLyoqPCBFdmVudC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19vcGNvZGU7CisKKy8qKiBLVCBPTlUgRXZlbnQgVHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfdHlwZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9LVE9OVV9FVkVOVF9UWVBFX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBFbmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0tUT05VX0VWRU5UX1RZUEVfTE9PUF9ERVRFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IExvb3AgRGV0ZWN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9LVE9OVV9FVkVOVF9UWVBFX09QVElDQUxfUE9XRVJfQUxBUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgLyoqPCBPcHRpY2FsIFBvd2VyIEFsYXJtLiAqLworfSBiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfdHlwZTsKKworLyoqIEtUIExvb3AgRGV0ZWN0IEV2ZW50LiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9rdGxvb3BfZGV0ZWN0X2V2ZW50Cit7CisgICAgQkNNT0xUX0VQT05fT0FNX0tUTE9PUF9ERVRFQ1RfRVZFTlRfREVURUNURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IExvb3AgZGV0ZWN0IGRldGVjdGVkICovCisgICAgQkNNT0xUX0VQT05fT0FNX0tUTE9PUF9ERVRFQ1RfRVZFTlRfUkVQQUlSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAvKio8IExvb3AgZGV0ZWN0IHJlcGFpcmVkICovCit9IGJjbW9sdF9lcG9uX29hbV9rdGxvb3BfZGV0ZWN0X2V2ZW50OworCisvKiogS1QgT3B0aWNhbCBQb3dlciBBbGFybSBFdmVudC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fa3RvcHRpY2FsX3Bvd2VyX2FsYXJtX2V2ZW50Cit7CisgICAgQkNNT0xUX0VQT05fT0FNX0tUT1BUSUNBTF9QT1dFUl9BTEFSTV9FVkVOVF9SQUlTRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IE9wdGljYWwgcG93ZXIgYWxhcm0gcmFpc2VkICovCisgICAgQkNNT0xUX0VQT05fT0FNX0tUT1BUSUNBTF9QT1dFUl9BTEFSTV9FVkVOVF9SRUxFQVNFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAvKio8IE9wdGljYWwgcG93ZXIgYWxhcm0gcmVsZWFzZWQgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2t0b3B0aWNhbF9wb3dlcl9hbGFybV9ldmVudDsKKworLyoqIERhc2FuIENsYXNzaWZpZXIgQ29tbWFuZC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY2xhc3NpZmllcl9jb21tYW5kCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0RBU0FOX0NMQVNTSUZJRVJfQ09NTUFORF9BRERfRklMVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA1MiwgICAgICAgICAvKio8IEFkZCBGaWx0ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RBU0FOX0NMQVNTSUZJRVJfQ09NTUFORF9SRU1PVkVfRklMVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA1MywgICAgICAgICAvKio8IFJlbW92ZSBGaWx0ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RBU0FOX0NMQVNTSUZJRVJfQ09NTUFORF9RVUVVRV9NQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA1NCwgICAgICAgICAvKio8IFF1ZXVlIE1hcC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fREFTQU5fQ0xBU1NJRklFUl9DT01NQU5EX0FERF9QUklPUklUWV9GT1JfVkxBTiAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMDU1ICAgICAgICAgIC8qKjwgQWRkIFByaW9yaXR5IGZvciBWTEFOLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY2xhc3NpZmllcl9jb21tYW5kOworCisvKiogRGFzYW4gRGlyZWN0aW9uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9kaXJlY3Rpb24KK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fREFTQU5fRElSRUNUSU9OX1VQU1RSRUFNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgVXBzdHJlYW0uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RBU0FOX0RJUkVDVElPTl9ET1dOU1RSRUFNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSAgICAgICAgICAgICAvKio8IERvd25zdHJlYW0uICovCit9IGJjbW9sdF9lcG9uX29hbV9kYXNhbl9kaXJlY3Rpb247CisKKy8qKiBEYXNhbiBGaWx0ZXIgRmllbGQuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2ZpbHRlcl9maWVsZAoreworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9GSUxURVJfRklFTERfRVRIRVJfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBFdGhlclR5cGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RBU0FOX0ZJTFRFUl9GSUVMRF9WTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IFZMQU4uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RBU0FOX0ZJTFRFUl9GSUVMRF9JUFBST1RPQ09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAvKio8IElQIFByb3RvY29sLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fZmlsdGVyX2ZpZWxkOworCisvKiogRGFzYW4gRmlsdGVyIEFjdGlvbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fZmlsdGVyX2FjdGlvbgoreworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9GSUxURVJfQUNUSU9OX0RPX05PVF9QQVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBEbyBOb3QgUGFzcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fREFTQU5fRklMVEVSX0FDVElPTl9QQVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxICAgICAgICAgICAgIC8qKjwgUGFzcy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2ZpbHRlcl9hY3Rpb247CisKKy8qKiBEYXNhbiBQcmkgVHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcHJpX3R5cGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fREFTQU5fUFJJX1RZUEVfQ09TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgQ29TLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9QUklfVFlQRV9UT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgICAgICAgICAgICAgLyoqPCBUb1MuICovCit9IGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wcmlfdHlwZTsKKworLyoqIERhc2FuIE9wY29kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fb3Bjb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9QT1JUX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IFBvcnQgQ29uZmlnLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfU0VUX1ZMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBTZXQgVkxBTi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX0dFVF9PTlVfQ09ORklHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MTMsICAgICAgICAgIC8qKjwgR2V0IE9OVSBDb25maWcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9TRVRfU1RQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTcsICAgICAgICAgICAvKio8IFNldCBTVFAuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9TRVRfVFhQT1dFUl9PRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgsICAgICAgICAgICAvKio8IFNldCBUWCBQb3dlciBPZmYuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9TRVRfTE9PUF9ERVRFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTksICAgICAgICAgICAvKio8IFNldCBMb29wIERldGVjdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX1NFVF9MT09QX0RFVEVDVF9VTkJMT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMCwgICAgICAgICAgIC8qKjwgU2V0IExvb3AgRGV0ZWN0IFVuYmxvY2suICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9DTEFTU0lGSUVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA0OCwgICAgICAgICAvKio8IENsYXNzaWZpZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RBU0FOX09QQ09ERV9PTlVfVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjMwNCwgICAgICAgICAvKio8IE9OVSBWZXJzaW9uLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfT05VX0ZMQVNIX0ZJUk1XQVJFX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzMTEsICAgICAgICAgLyoqPCBPTlUgRmxhc2ggRmlybXdhcmUgVmVyc2lvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9BQ1RJVkVfSU1BR0VfVElNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMzE0LCAgICAgICAgIC8qKjwgT05VIEFjdGl2ZSBJbWFnZSBUaW1lLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfT05VX1NUQVRJU1RJQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzMDUsICAgICAgICAgLyoqPCBPTlUgU3RhdGlzdGljLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfT05VX1NUQVRJU1RJQ19DTEVBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzMDYsICAgICAgICAgLyoqPCBPTlUgU3RhdGlzdGljIENsZWFyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfT05VX1NUQVRJU1RJQ19HRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzMTksICAgICAgICAgLyoqPCBPTlUgU3RhdGlzdGljIEdldC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9JR01QX1NFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMzA3LCAgICAgICAgIC8qKjwgT05VIElHTVAgU2V0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9PUENPREVfT05VX1BPUlRfSUdNUF9GSUxURVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzMDgsICAgICAgICAgLyoqPCBPTlUgUG9ydCBJZ21wIEZpbHRlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fREFTQU5fT1BDT0RFX09OVV9TSEFQSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMzE3ICAgICAgICAgIC8qKjwgT05VIFNoYXBpbmcuICovCit9IGJjbW9sdF9lcG9uX29hbV9kYXNhbl9vcGNvZGU7CisKKy8qKiBEYXNhbiBTdGF0cyBTZXEgVHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX3R5cGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fREFTQU5fU1RBVFNfU0VRX1RZUEVfUE9SVDBBTkQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgUG9ydCAwIGFuZCAxLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9TVEFUU19TRVFfVFlQRV9QT1JUMkFORDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBQb3J0IDIgYW5kIDMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RBU0FOX1NUQVRTX1NFUV9UWVBFX0VSUk9SUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgICAgICAvKio8IEVycm9ycy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV90eXBlOworCisvKiogRGFzYW4gU3RhdCBJRC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdF9pZAoreworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVNfVFhPSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBNdWx0aWNhc3QgRnJhbWVzIFRYIE9LLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVNfVFhPSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBCcm9hZGNhc3QgRnJhbWVzIFRYIE9LLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9TVEFUX0lEX01VTFRJQ0FTVF9GUkFNRVNfUlhPSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBNdWx0aWNhc3QgRnJhbWVzIFJYIE9LLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9TVEFUX0lEX0JST0FEQ0FTVF9GUkFNRVNfUlhPSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBCcm9hZGNhc3QgRnJhbWVzIFJYIE9LLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9TVEFUX0lEX1NZU1RFTV9GUkFNRVNfUlhPSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBTeXN0ZW0gRnJhbWVzIFJYIE9LLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9TVEFUX0lEX1NZU1RFTV9GUkFNRVNfUlhFUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgLyoqPCBTeXN0ZW0gRnJhbWVzIFJYIEVycm9yLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9TVEFUX0lEX1NZU1RFTV9PQ1RFVFNfUlhFUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBTeXN0ZW0gT2N0ZXRzIFJYIEVycm9yLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9TVEFUX0lEX1NZU1RFTV9PQ1RFVFNfUlhPSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAgICAgLyoqPCBTeXN0ZW0gT2N0ZXRzIFJYIE9LLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9TVEFUX0lEX1NZU1RFTV9GUkFNRV9UT09fTE9OR19FUlJPUlNfUlggICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgICAgICAgICAgLyoqPCBTeXN0ZW0gRnJhbWUgVG9vIExvbmcgRXJyb3JzIFJYLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EQVNBTl9TVEFUX0lEX1BPTl9GQ1NfRVJST1JTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgICAgICAgICAgLyoqPCBQT04gRkNTIEVycm9ycy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fREFTQU5fU1RBVF9JRF9QT05fRVJST1JfT0NURVRTX1JYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCAgICAgICAgICAgIC8qKjwgUE9OIEVycm9yIE9jdGV0cyBSWC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRfaWQ7CisKKy8qKiBTdGFuZGFyZCBkaXJlY3Rpb24gZW51bSAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9kaXJlY3Rpb24KK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fRElSRUNUSU9OX1VQU1RSRUFNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgVXBzdHJlYW0uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RJUkVDVElPTl9ET1dOU1RSRUFNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSAgICAgICAgICAgICAvKio8IERvd25zdHJlYW0uICovCit9IGJjbW9sdF9lcG9uX29hbV9kaXJlY3Rpb247CisKKy8qKiBEb21haW4gT3B0aW9uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9kb21haW5fb3B0aW9uCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0RPTUFJTl9PUFRJT05fREVGQVVMVF9TTk9PUElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IERlZmF1bHQgU25vb3BpbmcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RPTUFJTl9PUFRJT05fRElTQUJMRV9ETl9BVVRPX1NOT09QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IERpc2FibGUgRG4gQXV0byBTbm9vcC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRE9NQUlOX09QVElPTl9ESVNBQkxFX1VQX0FVVE9fU05PT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgRGlzYWJsZSBVcCBBdXRvIFNub29wLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9ET01BSU5fT1BUSU9OX1VOQkxPQ0tfTUxEX0lGX0xJTUlUX0VYQ0VFREVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBVbmJsb2NrIE1sZCBJZiBMaW1pdCBFeGNlZWRlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRE9NQUlOX09QVElPTl9QUk9YWV9KT0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAgICAgICAgIC8qKjwgUHJveHkgSm9pbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRE9NQUlOX09QVElPTl9QUk9YWV9MRUFWRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNiAgICAgICAgICAgIC8qKjwgUHJveHkgTGVhdmUuICovCit9IGJjbW9sdF9lcG9uX29hbV9kb21haW5fb3B0aW9uOworCisvKiogRFBvRSBMZWFmIEFjdGlvbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFmX2FjdGlvbgoreworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX1JFU0VUX09OVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBUaGlzIGF0dHJpYnV0ZSByZXNldHMgdGhlIE9OVSwgYXMgaWYgZnJvbSBwb3dlciBvbi4gICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fQ0xFQVJfRFlOX0xFQVJOX1RBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjU3LCAgICAgICAgICAvKio8IENsZWFyIER5biBMZWFybiBUYWJsZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9BRERfRFlOX01BQ19BRERSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTgsICAgICAgICAgIC8qKjwgQWRkIER5biBNQUMgQWRkci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9ERUxfRFlOX01BQ19BRERSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTksICAgICAgICAgIC8qKjwgRGVsIER5biBNQUMgQWRkci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9DTEVBUl9TVEFUSUNfTEVBUk5fVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNjAsICAgICAgICAgIC8qKjwgQ2xlYXIgU3RhdGljIExlYXJuIFRhYmxlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0FERF9TVEFUSUNfTUFDX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2MSwgICAgICAgICAgLyoqPCBBZGQgU3RhdGljIE1BQyBBZGRyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0RFTF9TVEFUSUNfTUFDX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2MiwgICAgICAgICAgLyoqPCBEZWwgU3RhdGljIE1BQyBBZGRyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0NPTkZJR1VSRV9NQ0FTVF9MTElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2MywgICAgICAgICAgLyoqPCBDb25maWd1cmUgTWNhc3QgTExJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9DTEVBUl9TVEFUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MTMsICAgICAgICAgIC8qKjwgQ2xlYXIgU3RhdHMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fUkVUUklFVkVfQ1VSUkVOVF9BTEFSTV9TVU1NQVJZICAgICAgICAgICAgICAgICAgICAgICAgID0gNzY5LCAgICAgICAgICAvKio8IFJldHJpZXZlIEN1cnJlbnQgQWxhcm0gU3VtbWFyeS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9DTEVBUl9JTkdSRVNTX1JVTEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjgxLCAgICAgICAgIC8qKjwgQ2xlYXIgSW5ncmVzcyBSdWxlcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9BRERfSU5HUkVTU19SVUxFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjgyLCAgICAgICAgIC8qKjwgQWRkIEluZ3Jlc3MgUnVsZXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fREVMX0lOR1JFU1NfUlVMRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTI4MywgICAgICAgICAvKio8IERlbCBJbmdyZXNzIFJ1bGVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0VOQUJMRV9VU0VSX1RSQUZGSUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1MzcsICAgICAgICAgLyoqPCBFbmFibGUgVXNlciBUcmFmZmljLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0RJU0FCTEVfVVNFUl9UUkFGRklDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1MzgsICAgICAgICAgLyoqPCBEaXNhYmxlIFVzZXIgVHJhZmZpYy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FDVElPTl9MT09QQkFDS19FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNTM5LCAgICAgICAgIC8qKjwgTG9vcGJhY2sgRW5hYmxlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0xPT1BCQUNLX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1NDAsICAgICAgICAgLyoqPCBMb29wYmFjayBEaXNhYmxlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0xBU0VSX1RYX1BPV0VSX09GRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1NDEgICAgICAgICAgLyoqPCBMYXNlciBUeCBQb3dlciBPZmYuICovCit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYWN0aW9uOworCisvKiogRFBvRSBMb29wYmFjayBMb2NhdGlvbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZHBvZV9sb29wYmFja19sb2NhdGlvbgoreworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xPT1BCQUNLX0xPQ0FUSU9OX1BIWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBQSFkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTE9PUEJBQ0tfTE9DQVRJT05fTUFDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IE1BQy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MT09QQkFDS19MT0NBVElPTl9MSU5LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyICAgICAgICAgICAgIC8qKjwgTGluay4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbG9vcGJhY2tfbG9jYXRpb247CisKKy8qKiBEUG9FIExsaWQgQWN0aW9uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xsaWRfYWN0aW9uCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTExJRF9BQ1RJT05fQUREX0xMSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IEFkZCBMbGlkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xMSURfQUNUSU9OX0RFTEVURV9MTElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBEZWxldGUgTGxpZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MTElEX0FDVElPTl9ERUxFVEVfQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyICAgICAgICAgICAgIC8qKjwgRGVsZXRlIEFsbC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGxpZF9hY3Rpb247CisKKy8qKiBEUG9FIEFsYXJtIENvZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYWxhcm1fY29kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0FMQVJNX0NPREVfTE9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3LCAgICAgICAgICAgLyoqPCBMT1MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfQUxBUk1fQ09ERV9LRVlFWENIQU5HRV9GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgsICAgICAgICAgICAvKio8IEtleUV4Y2hhbmdlIEZhaWx1cmUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfQUxBUk1fQ09ERV9QT1JUX0RJU0FCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzMsICAgICAgICAgICAvKio8IFBvcnQgRGlzYWJsZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfQUxBUk1fQ09ERV9QT1dFUl9GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjUsICAgICAgICAgICAvKio8IFBvd2VyIEZhaWx1cmUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfQUxBUk1fQ09ERV9TVEFUSVNUSUNTX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTI5LCAgICAgICAgICAvKio8IFN0YXRpc3RpY3MgQWxhcm0uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfQUxBUk1fQ09ERV9PTlVfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMwLCAgICAgICAgICAvKio8IE9OVSBCdXN5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0FMQVJNX0NPREVfTUFDX1RBQkxFX09WRVJGTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzMSAgICAgICAgICAgLyoqPCBNYWMgVGFibGUgT3ZlcmZsb3cuICovCit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX2FsYXJtX2NvZGU7CisKKy8qKiBEUG9FIExlYWYgQXR0cmlidXRlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYXR0cmlidXRlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfU0VRVUVOQ0VfTlVNQkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IFNlcXVlbmNlIE51bWJlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PTlVfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgT05VIElELiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0ZJUk1XQVJFX0lORk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBGaXJtd2FyZSBJbmZvLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0NISVBfSU5GTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBDaGlwIEluZm8uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfREFURV9PRl9NQU5VRkFDVFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgICAvKio8IERhdGUgT2YgTWFudWZhY3R1cmUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTUFOVUZBQ1RVUkVSX0lORk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgICAvKio8IE1hbnVmYWN0dXJlciBJbmZvLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX01BWF9MT0dJQ0FMX0xJTktTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAgICAgLyoqPCBNYXggTG9naWNhbCBMaW5rcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9OVU1fRVBPTl9QT1JUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAgICAgICAgIC8qKjwgTnVtIEVQT04gUG9ydHMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTlVNX1VOSV9QT1JUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgICAgICAgICAvKio8IE51bSBVTkkgUG9ydHMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUEFDS0VUX0JVRkZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgICAgICAgICAvKio8IFBhY2tldCBCdWZmZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUkVQT1JUX1RIUkVTSE9MRFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEsICAgICAgICAgICAvKio8IFJlcG9ydCBUaHJlc2hvbGRzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0xJTktfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyLCAgICAgICAgICAgLyoqPCBMaW5rIFN0YXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09BTV9SQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgICAgICAgICAgLyoqPCBPQU0gUmF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9NRlJfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNCwgICAgICAgICAgIC8qKjwgTWZyIE5hbWUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRldBUkVfTUZHX1RJTUVfVkFSX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUsICAgICAgICAgICAvKio8IEZ3YXJlIE1mZyBUaW1lIFZhciBDdHJsLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RPTlVfUE9SVF9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2LCAgICAgICAgICAgLyoqPCBELU9OVSBQb3J0IFR5cGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVkVORE9SX05BTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTcsICAgICAgICAgICAvKio8IFZlbmRvciBOYW1lLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX01PREVMX05VTUJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4LCAgICAgICAgICAgLyoqPCBNb2RlbCBOdW1iZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfSFdfVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTksICAgICAgICAgICAvKio8IEh3IFZlcnNpb24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTElORV9SQVRFX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjAsICAgICAgICAgICAvKio8IExpbmUgUmF0ZSBNb2RlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RZTl9MRUFSTl9UQUJMRV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1NywgICAgICAgICAgLyoqPCBEeW4gTGVhcm4gVGFibGUgU2l6ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EWU5fTEVBUk5fQUdFX0xJTUlUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTgsICAgICAgICAgIC8qKjwgRHluIExlYXJuIEFnZSBMaW1pdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EWU5fTUFDX1RBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTksICAgICAgICAgIC8qKjwgVGhpcyBhdHRyaWJ1dGUgcmVwcmVzZW50cyB0aGUgZHluYW1pY2FsbHkgbGVhcm5lZCBNQUMgYWRkcmVzcyBydWxlcyBvZiBvbmUgRXRoZXJuZXQgcG9ydC4gTUFDIGFkZHJlc3MgYXJlIHJlcGVhdGVkIHdpdGhpbiBhIHNpbmdsZSBhdHRyaWJ1dGUgdW50aWwgdGhhdCBhdHRyaWJ1dGUgaXMgZnVsbCAoMjEgYWRkcmVzc2VzID0gMTI2IGJ5dGVzKS4gSWYgbmVjZXNzYXJ5LCBzdWNoIGF0dHJpYnV0ZXMgYXJlIHJlcGVhdGVkIGFzIGFuIGF0dHJpYnV0ZSBsaXN0IHVudGlsIHRoZSBlbnRpcmUgdGFibGUgaGFzIGJlZW4gcmVwb3J0ZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfU1RBVElDX01BQ19UQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjYwLCAgICAgICAgICAvKio8IFRoaXMgYXR0cmlidXRlIHJlcHJlc2VudHMgdGhlIHN0YXRpY2FsbHkgcHJvdmlzaW9uZWQgTUFDIGFkZHJlc3MgdGFibGUuIFRoZSBkYXRhIHN0cnVjdHVyZSBpcyB0aGUgc2FtZSBhcyB0aGUgR2V0IER5bmFtaWMgTUFDIFRhYmxlIGF0dHJpYnV0ZSBhYm92ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9QT1JUX0NBUEFCSUxJVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNjEsICAgICAgICAgIC8qKjwgUG9ydCBDYXBhYmlsaXR5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RZTl9MRUFSTl9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2MiwgICAgICAgICAgLyoqPCBEeW4gTGVhcm4gTW9kZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9NSU5fTUFDX0xJTUlUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNjMsICAgICAgICAgIC8qKjwgTWluIE1BQyBMaW1pdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9NQVhfTUFDX0FMTE9XRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNjQsICAgICAgICAgIC8qKjwgTWF4IE1BQyBBbGxvd2VkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0FHR19NQUNfTElNSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2NSwgICAgICAgICAgLyoqPCBBZ2cgTUFDIExpbWl0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0xFTl9FUlJfRElTQ0FSRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2NiwgICAgICAgICAgLyoqPCBMZW4gRXJyIERpc2NhcmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRkxPT0RfVU5LTk9XTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjY3LCAgICAgICAgICAvKio8IEZsb29kIFVua25vd24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTE9DQUxfU1dJVENISU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjY4LCAgICAgICAgICAvKio8IExvY2FsIFN3aXRjaGluZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9RVUVVRV9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNjksICAgICAgICAgIC8qKjwgUXVldWUgQ29uZmlnLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0ZJUk1XQVJFX0ZJTEVOQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI3MCwgICAgICAgICAgLyoqPCBGaXJtd2FyZSBGaWxlbmFtZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9VTklfTUFDX1RBQkxFX0ZVTExfQkVIQVZJT1IgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNzEsICAgICAgICAgIC8qKjwgVW5pIE1hYyBUYWJsZSBGdWxsIEJlaGF2aW9yLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09OVV9NQ0FTVF9MTElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI3MiwgICAgICAgICAgLyoqPCBPbnUgTWNhc3QgTExJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9VTklfTUFDX0xFQVJORUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNzMsICAgICAgICAgIC8qKjwgVW5pIE1hYyBMZWFybmVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09OVV9NQVhfRlJBTUVfU0laRV9DQVBBQklMSVRZICAgICAgICAgICAgICAgICAgICAgICA9IDI3NCwgICAgICAgICAgLyoqPCBPbnUgTWF4IEZyYW1lIFNpemUgQ2FwYWJpbGl0eS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9VTklfTUFYX0ZSQU1FX1NJWkVfTElNSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNzUsICAgICAgICAgIC8qKjwgVW5pIE1heCBGcmFtZSBTaXplIExpbWl0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX1VOSUNBU1RfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUxMywgICAgICAgICAgLyoqPCBSeCBVbmljYXN0IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9VTklDQVNUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MTQsICAgICAgICAgIC8qKjwgVHggVW5pY2FzdCBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVfVE9PX1NIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTE1LCAgICAgICAgICAvKio8IFJ4IEZyYW1lIFRvbyBTaG9ydC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MTYsICAgICAgICAgIC8qKjwgUnggRnJhbWUgNjQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUU2NTEyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTE3LCAgICAgICAgICAvKio8IFJ4IEZyYW1lIDY1XzEyNy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTEyODI1NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MTgsICAgICAgICAgIC8qKjwgUnggRnJhbWUgMTI4XzI1NS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTI1NjUxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MTksICAgICAgICAgIC8qKjwgUnggRnJhbWUgMjU2XzUxMS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTUxMjEwMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MjAsICAgICAgICAgIC8qKjwgUnggRnJhbWUgNTEyXzEwMjMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxMDI0MTUxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTIxLCAgICAgICAgICAvKio8IFJ4IEZyYW1lIDEwMjRfMTUxOC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTE1MTlQTFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MjIsICAgICAgICAgIC8qKjwgUnggRnJhbWUgMTUxOSBQbHVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUyMywgICAgICAgICAgLyoqPCBUeCBGcmFtZSA2NC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTY1MTI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MjQsICAgICAgICAgIC8qKjwgVHggRnJhbWUgNjVfMTI3LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMTI4MjU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUyNSwgICAgICAgICAgLyoqPCBUeCBGcmFtZSAxMjhfMjU1LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMjU2NTExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUyNiwgICAgICAgICAgLyoqPCBUeCBGcmFtZSAyNTZfNTExLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FNTEyMTAyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUyNywgICAgICAgICAgLyoqPCBUeCBGcmFtZSA1MTJfMTAyMy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTEwMjQxNTE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MjgsICAgICAgICAgIC8qKjwgVHggRnJhbWUgMTAyNF8xNTE4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMTUxOVBMVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUyOSwgICAgICAgICAgLyoqPCBUeCBGcmFtZSAxNTE5IFBsdXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUVVFVUVfREVMQVlfVEhSRVNIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTMwLCAgICAgICAgICAvKio8IFF1ZXVlIERlbGF5IFRocmVzaC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9RVUVVRV9ERUxBWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MzEsICAgICAgICAgIC8qKjwgUXVldWUgRGVsYXkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRlJBTUVTX0RST1BQRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTMyLCAgICAgICAgICAvKio8IEZyYW1lcyBEcm9wcGVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0JZVEVTX0RST1BQRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUzMywgICAgICAgICAgLyoqPCBCeXRlcyBEcm9wcGVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0JZVEVTX0RFTEFZRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUzNCwgICAgICAgICAgLyoqPCBCeXRlcyBEZWxheWVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX1VOVVNFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUzNSwgICAgICAgICAgLyoqPCBUeCBCeXRlcyBVbnVzZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT1BUX01PTl9URU1QRVJBVFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTQxLCAgICAgICAgICAvKio8IE9wdCBNb24gVGVtcGVyYXR1cmUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT1BUX01PTl9WQ0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTQyLCAgICAgICAgICAvKio8IE9wdCBNb24gVmNjLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX09QVF9NT05fVFhfQklBUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU0MywgICAgICAgICAgLyoqPCBPcHQgTW9uIFR4IEJpYXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT1BUX01PTl9UWF9QT1dFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTQ0LCAgICAgICAgICAvKio8IE9wdCBNb24gVHggUG93ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT1BUX01PTl9SWF9QT1dFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTQ1LCAgICAgICAgICAvKio8IE9wdCBNb24gUnggUG93ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVTX1lFTExPVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTQ2LCAgICAgICAgICAvKio8IFJ4IEZyYW1lcyBZZWxsb3cuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUVTX1lFTExPVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTQ3LCAgICAgICAgICAvKio8IFR4IEZyYW1lcyBZZWxsb3cuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfQllURVNfR1JFRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTQ4LCAgICAgICAgICAvKio8IFR4IEJ5dGVzIEdyZWVuLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0JZVEVTX1lFTExPVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU0OSwgICAgICAgICAgLyoqPCBSeCBCeXRlcyBZZWxsb3cuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlhfQllURVNfR1JFRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTUwLCAgICAgICAgICAvKio8IFJ4IEJ5dGVzIEdyZWVuLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX1lFTExPVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU1MSwgICAgICAgICAgLyoqPCBUeCBCeXRlcyBZZWxsb3cuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUVTX1VOSUNBU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTUyLCAgICAgICAgICAvKio8IFR4IEZyYW1lcyBVbmljYXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FU19NVUxUSUNBU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU1MywgICAgICAgICAgLyoqPCBUeCBGcmFtZXMgTXVsdGljYXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FU19CUk9BRENBU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU1NCwgICAgICAgICAgLyoqPCBUeCBGcmFtZXMgQnJvYWRjYXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FU19VTklDQVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU1NSwgICAgICAgICAgLyoqPCBSeCBGcmFtZXMgVW5pY2FzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRVNfTVVMVElDQVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NTYsICAgICAgICAgIC8qKjwgUnggRnJhbWVzIE11bHRpY2FzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9GUkFNRV9CUk9BRENBU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NTcsICAgICAgICAgIC8qKjwgUnggRnJhbWUgQnJvYWRjYXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX05VTUJFUl9PRl9QUk9HUkFNTUFCTEVfQ09VTlRFUlMgICAgICAgICAgICAgICAgICAgICA9IDU1OCwgICAgICAgICAgLyoqPCBOdW1iZXIgT2YgUHJvZ3JhbW1hYmxlIENvdW50ZXJzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0wyQ1BfRlJBTUVTX1JYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU1OSwgICAgICAgICAgLyoqPCBMMkNQIEZyYW1lcyBSeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MMkNQX09DVEVUU19SWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NjAsICAgICAgICAgIC8qKjwgTDJDUCBPY3RldHMgUnguICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTDJDUF9GUkFNRVNfVFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTYxLCAgICAgICAgICAvKio8IEwyQ1AgRnJhbWVzIFR4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0wyQ1BfT0NURVRTX1RYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU2MiwgICAgICAgICAgLyoqPCBMMkNQIE9jdGV0cyBUeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9MMkNQX0ZSQU1FU19ESVNDQVJERUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NjMsICAgICAgICAgIC8qKjwgTDJDUCBGcmFtZXMgRGlzY2FyZGVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0wyQ1BfT0NURVRTX0RJU0NBUkRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU2NCwgICAgICAgICAgLyoqPCBMMkNQIE9jdGV0cyBEaXNjYXJkZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVFhfTDJFUlJPUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTY1LCAgICAgICAgICAvKio8IFR4IEwyIEVycm9ycy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SWF9MMkVSUk9SUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NjYsICAgICAgICAgIC8qKjwgUnggTDIgRXJyb3JzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BPUlRfU1RBVF9USFJFU0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc2OSwgICAgICAgICAgLyoqPCBQb3J0IFN0YXQgVGhyZXNoLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0xJTktfU1RBVF9USFJFU0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc3MCwgICAgICAgICAgLyoqPCBMaW5rIFN0YXQgVGhyZXNoLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1NVU1BFTkRfUkVTVU1FX0FMQVJNX1JFUE9SVElORyAgICAgICAgICAgICAgICAgICAgICA9IDc3MSwgICAgICAgICAgLyoqPCBTdXNwZW5kIC8gUmVzdW1lIEFsYXJtIFJlcG9ydGluZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9LRVlfRVhQSVJZX1RJTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMDI1LCAgICAgICAgIC8qKjwgS2V5IEV4cGlyeSBUaW1lLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0VOQ1JZUFRfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwMjYsICAgICAgICAgLyoqPCBFbmNyeXB0IE1vZGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUE9SVF9JTkdSRVNTX1JVTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTI4MSwgICAgICAgICAvKio8IFBvcnQgSW5ncmVzcyBSdWxlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0xVRV9GSUVMRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyODIsICAgICAgICAgLyoqPCBMVUUgRmllbGQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQUxUX0NWTEFOX0VUSEVSVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTI4MywgICAgICAgICAvKio8IEFsdCBDIFZMQU4gRXRoZXJ0eXBlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0FMVF9TVkxBTl9FVEhFUlRZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyODQsICAgICAgICAgLyoqPCBBbHQgUyBWTEFOIEV0aGVydHlwZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9JUE1DX0ZPUldBUkRJTkdfUlVMRV9DT05GSUdVUkFUSU9OICAgICAgICAgICAgICAgICAgPSAxMjg1LCAgICAgICAgIC8qKjwgSVBNQyBGb3J3YXJkaW5nIFJ1bGUgQ29uZmlndXJhdGlvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9JVFBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjg2LCAgICAgICAgIC8qKjwgSS1UUElELiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0JUUElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyODcsICAgICAgICAgLyoqPCBCLVRQSUQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQkNfUkFURV9MSU1JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUzNywgICAgICAgICAvKio8IEJjIFJhdGUgTGltaXQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRUdSRVNTX1NIQVBJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUzOCwgICAgICAgICAvKio8IEVncmVzcyBTaGFwaW5nLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0lOR1JFU1NfUE9MSUNJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1MzksICAgICAgICAgLyoqPCBJbmdyZXNzIFBvbGljaW5nLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1FVRVVFX0NJUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1NDAsICAgICAgICAgLyoqPCBRdWV1ZSBDSVIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRkVDX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTU0MSwgICAgICAgICAvKio8IEZFQyBNb2RlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1FVRVVFX0VJUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1NDIsICAgICAgICAgLyoqPCBRdWV1ZSBFSVIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUVVFVUVfQ09MT1JfTUFSS0lORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTU0MywgICAgICAgICAvKio8IFF1ZXVlIENvbG9yIE1hcmtpbmcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUVVFVUVfUkFURV9MSU1JVEVSX0NBUEFCSUxJVElFUyAgICAgICAgICAgICAgICAgICAgID0gMTU0NCwgICAgICAgICAvKio8IFF1ZXVlIFJhdGUgTGltaXRlciBDYXBhYmlsaXRpZXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQ09VUExJTkdfRkxBRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTU0NSwgICAgICAgICAvKio8IENvdXBsaW5nIEZsYWcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfQ0xPQ0tfVFJBTlNQT1JUX0NBUEFCSUxJVElFUyAgICAgICAgICAgICAgICAgICAgICAgID0gMTc5MywgICAgICAgICAvKio8IENsb2NrIFRyYW5zcG9ydCBDYXBhYmlsaXRpZXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfRU5BQkxFX0NMT0NLX1RSQU5TUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTc5NCwgICAgICAgICAvKio8IEVuYWJsZSBDbG9jayBUcmFuc3BvcnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfVElNRV9UUkFOU0ZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTc5NSwgICAgICAgICAvKio8IFRpbWUgVHJhbnNmZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUFJPUEFHQVRJT05fUEFSQU1FVEVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTc5NiwgICAgICAgICAvKio8IFByb3BhZ2F0aW9uIFBhcmFtZXRlcnMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUlRUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTc5NywgICAgICAgICAvKio8IFJUVC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9EQUNfQ09ORklHVVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMDQ4LCAgICAgICAgIC8qKjwgREFDIENvbmZpZ3VyYXRpb24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfREFDX0NPTkZJR1VSQVRJT05fRkxBR1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA0OSwgICAgICAgICAvKio8IERBQyBDb25maWd1cmF0aW9uIEZsYWdzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RBQ19QQVNTV09SRF9DSEFMTEVOR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwNTAsICAgICAgICAgLyoqPCBEQUMgUGFzc3dvcmQgQ2hhbGxlbmdlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0RBQ19DT05GSUdVUkFUSU9OX0VOQUJMRV9ESVNBQkxFICAgICAgICAgICAgICAgICAgICA9IDIwNTEsICAgICAgICAgLyoqPCBEQUMgQ29uZmlndXJhdGlvbiBFbmFibGUgLyBEaXNhYmxlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0VORVJHWV9FRkZJQ0lFTlRfRVRIRVJORVRfU1RBVFVTICAgICAgICAgICAgICAgICAgICA9IDIwODAsICAgICAgICAgLyoqPCBFbmVyZ3kgRWZmaWNpZW50IEV0aGVybmV0IFN0YXR1cy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9QV1JfT1ZFUl9FVEhFUk5FVF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMDgxLCAgICAgICAgIC8qKjwgUG93ZXIgT3ZlciBFdGhlcm5ldCBTdGF0dXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfTUVESUFfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA4MiwgICAgICAgICAvKio8IE1lZGlhIFR5cGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT05VX1BXUl9TQVZJTkdfQ0FQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjU1MzVVICAgICAgICAvKio8IE9udSBQb3dlciBTYXZpbmcgQ2FwYWJpbGl0aWVzLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFmX2F0dHJpYnV0ZTsKKworLyoqIERQb0UgTGluayBTdGF0ZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZHBvZV9saW5rX3N0YXRlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTElOS19TVEFURV9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IERpc2FibGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTElOS19TVEFURV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSAgICAgICAgICAgICAvKio8IEVuYWJsZS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGlua19zdGF0ZTsKKworLyoqIERQb0UgTGVhcm5pbmcgTW9kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFybmluZ19tb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBUk5JTkdfTU9ERV9ETU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IDgwMi4xZCBNb2RlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQVJOSU5HX01PREVfTUFDX0FDQ0VTU19DT05UUk9MX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgICAgICAgICAgICAgLyoqPCBNQUMgQWNjZXNzIENvbnRyb2wgTW9kZS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhcm5pbmdfbW9kZTsKKworLyoqIERQb0UgQnJhbmNoLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9kcG9lX2JyYW5jaAoreworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBFbmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX1NUQU5EQVJEX0FUVFJJQlVURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgICAgICAgICAvKio8IFN0YW5kYXJkIEF0dHJpYnV0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfU1RBTkRBUkRfQUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5LCAgICAgICAgICAgIC8qKjwgU3RhbmRhcmQgQWN0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9PQkpFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxNCwgICAgICAgICAgLyoqPCBPYmplY3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VYVEVOREVEX0FUVFJJQlVURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjE1LCAgICAgICAgICAvKio8IEV4dGVuZGVkIEF0dHJpYnV0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfUFJPR1JBTU1BQkxFX0NPVU5URVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMTYsICAgICAgICAgIC8qKjwgUHJvZ3JhbW1hYmxlIENvdW50ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VYVEVOREVEX0FDVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjE3ICAgICAgICAgICAvKio8IEV4dGVuZGVkIEFjdGlvbi4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYnJhbmNoOworCisvKiogRFBvRSBPYmplY3QgVHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfdHlwZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX09OVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBPTlUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfTkVUV09SS19QT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IE5ldHdvcmsgUE9OLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX0xJTksgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBMaW5rLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX1VTRVJfUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBVc2VyIFBvcnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfUVVFVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IFF1ZXVlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX01FUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgLyoqPCBNRVAuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfTUNBU1RfTElOSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgICAvKio8IE11bHRpY2FzdCBMb2dpY2FsIExpbmsuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfQlJJREdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMwLCAgICAgICAgICAvKio8IEJyaWRnZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9CUklER0VfUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzEgICAgICAgICAgIC8qKjwgQnJpZGdlIFBvcnQuICovCit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF90eXBlOworCisvKiogRFBvRSBFbmNyeXB0aW9uIE1vZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZW5jcnlwdGlvbl9tb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRU5DUllQVElPTl9NT0RFX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IE5vbmUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRU5DUllQVElPTl9NT0RFX09ORV9ET1dOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IDFEb3duLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0VOQ1JZUFRJT05fTU9ERV9URU5fRE9XTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCAxMERvd24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRU5DUllQVElPTl9NT0RFX1RFTl9CSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgICAgICAvKio8IDEwQmkuICovCit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX2VuY3J5cHRpb25fbW9kZTsKKworLyoqIFJ1bGUgVHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fcnVsZV90eXBlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9URVJNSU5BVE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IFRlcm1pbmF0b3IuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9IRUFERVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IEhlYWRlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9UWVBFX0NMQVVTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgQ2xhdXNlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfUkVTVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBSZXN1bHQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9FTlRSWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCAgICAgICAgICAgICAvKio8IEVudHJ5LiAqLworfSBiY21vbHRfZXBvbl9vYW1fcnVsZV90eXBlOworCisvKiogRFBvRSBPQU0gZmllbGQgY29kZXMgCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWVsZF9jb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklFTERfQ09ERV9MT0dJQ0FMX0xJTktfSU5ERVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IExvZ2ljYWwgTGluayBJbmRleC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUVMRF9DT0RFX0wyREEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgTDIgREEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklFTERfQ09ERV9MMlNBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IEwyIFNBLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJRUxEX0NPREVfTDJUWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBMMiBUeXBlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJRUxEX0NPREVfQkRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBCLURBLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJRUxEX0NPREVfQlNBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgLyoqPCBCLVNBLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJRUxEX0NPREVfSVRBRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBJLVRhZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUVMRF9DT0RFX1NWTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAgICAgICAgIC8qKjwgUy1WTEFOLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJRUxEX0NPREVfQ1ZMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgICAgICAgICAgLyoqPCBDLVZMQU4uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklFTERfQ09ERV9NUExTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgICAgICAgICAvKio8IE1QTFMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklFTERfQ09ERV9JUFY0VE9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgICAgICAgICAvKio8IElQdjQgVE9TLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJRUxEX0NPREVfSVBWNFRUTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExLCAgICAgICAgICAgLyoqPCBJUHY0IFRUTC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUVMRF9DT0RFX0lQX1BST1RPQ09MX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMiwgICAgICAgICAgIC8qKjwgSVAgUHJvdG9jb2wgVHlwZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUVMRF9DT0RFX0lQVjRTQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMywgICAgICAgICAgIC8qKjwgSVB2NCBTQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUVMRF9DT0RFX0lQVjZTQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNCwgICAgICAgICAgIC8qKjwgSVB2NiBTQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUVMRF9DT0RFX0lQVjREQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNSwgICAgICAgICAgIC8qKjwgSVB2NCBEQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUVMRF9DT0RFX0lQVjZEQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNiwgICAgICAgICAgIC8qKjwgSVB2NiBEQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUVMRF9DT0RFX0lQVjZORVhUX0hFQURFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNywgICAgICAgICAgIC8qKjwgSVB2IDYgTmV4dCBIZWFkZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklFTERfQ09ERV9JUFY2RkxPV19MQUJFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgsICAgICAgICAgICAvKio8IElQdiA2IEZsb3cgTGFiZWwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklFTERfQ09ERV9UQ1BfVURQX1NPVVJDRV9QT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTksICAgICAgICAgICAvKio8IFRDUC9VRFAgU291cmNlIFBvcnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklFTERfQ09ERV9UQ1BfVURQX0RFU1RfUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjAsICAgICAgICAgICAvKio8IFRDUC9VRFAgRGVzdCBQb3J0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJRUxEX0NPREVfQlRBRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxLCAgICAgICAgICAgLyoqPCBCLSBUYWcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklFTERfQ09ERV9DVVNUT00wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjQsICAgICAgICAgICAvKio8IEN1c3RvbSAwLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJRUxEX0NPREVfQ1VTVE9NMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1LCAgICAgICAgICAgLyoqPCBDdXN0b20gMS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUVMRF9DT0RFX0NVU1RPTTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNiwgICAgICAgICAgIC8qKjwgQ3VzdG9tIDIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklFTERfQ09ERV9DVVNUT00zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjcsICAgICAgICAgICAvKio8IEN1c3RvbSAzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJRUxEX0NPREVfQ1VTVE9NNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI4LCAgICAgICAgICAgLyoqPCBDdXN0b20gNC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUVMRF9DT0RFX0NVU1RPTTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOSwgICAgICAgICAgIC8qKjwgQ3VzdG9tIDUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklFTERfQ09ERV9DVVNUT002ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzAsICAgICAgICAgICAvKio8IEN1c3RvbSA2LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJRUxEX0NPREVfQ1VTVE9NNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMxLCAgICAgICAgICAgLyoqPCBDdXN0b20gNy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUVMRF9DT0RFX1JFU0VSVkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMiwgICAgICAgICAgIC8qKjwgUmVzZXJ2ZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklFTERfQ09ERV9MTElEX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzMgICAgICAgICAgICAvKio8IExMSUQgVmFsdWUuICovCit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpZWxkX2NvZGU7CisKKy8qKiBSdWxlIE9wZXJhdG9yLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9ydWxlX29wZXJhdG9yCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfT1BFUkFUT1JfTkVWRVJfTUFUQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IE5ldmVyIE1hdGNoLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX09QRVJBVE9SX0VRVUFMX1RPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBFcXVhbCBUby4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9PUEVSQVRPUl9OT1RfRVFVQUxfVE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgTm90IEVxdWFsIFRvLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX09QRVJBVE9SX0xFU1NfVEhBTl9PUl9FUVVBTF9UTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBMZXNzIFRoYW4gT3IgRXF1YWwgVG8uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfT1BFUkFUT1JfR1JFQVRFUl9USEFOX09SX0VRVUFMX1RPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IEdyZWF0ZXIgVGhhbiBPciBFcXVhbCBUby4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9PUEVSQVRPUl9FWElTVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgRXhpc3RzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX09QRVJBVE9SX05PVF9FWElTVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBOb3QgRXhpc3RzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX09QRVJBVE9SX0FMV0FZU19NQVRDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcgICAgICAgICAgICAgLyoqPCBBbHdheXMgTWF0Y2guICovCit9IGJjbW9sdF9lcG9uX29hbV9ydWxlX29wZXJhdG9yOworCisvKiogRFBvRSBPQU0gcnVsZSByZXN1bHQgCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZHBvZV9yZXN1bHQKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfTk9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgTk9QLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9ESVNDQVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBEaXNjYXJkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9GT1JXQVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBGb3J3YXJkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBRdWV1ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgU2V0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9DT1BZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgLyoqPCBDb3B5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9ERUxFVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBEZWxldGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfUkVTVUxUX0lOU0VSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgICAgICAgICAvKio8IEluc2VydC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfUkVQTEFDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAgICAgICAgIC8qKjwgUmVwbGFjZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfQ0xFQVJfREVMRVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5LCAgICAgICAgICAgIC8qKjwgQ2xlYXIgRGVsZXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9DTEVBUl9JTlNFUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwICAgICAgICAgICAgLyoqPCBDbGVhciBJbnNlcnQuICovCit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX3Jlc3VsdDsKKworLyoqIERQb0UgTGF5ZXIgU2VsZWN0LiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xheWVyX3NlbGVjdAoreworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xBWUVSX1NFTEVDVF9QUkVBTUJMRV9MMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBQcmVhbWJsZS9MMi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MQVlFUl9TRUxFQ1RfUFJFQU1CTEU4MDIxQUggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgUHJlYW1ibGUvODAyLjFhaC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MQVlFUl9TRUxFQ1RfRVRIRVJUWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgRXRoZXJUeXBlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xBWUVSX1NFTEVDVF9TVkxBTl9UQUdTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBTLVZMQU4gVGFncy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MQVlFUl9TRUxFQ1RfQ1ZMQU5fVEFHUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgQy1WTEFOIFRhZ3MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEFZRVJfU0VMRUNUX01QTFNfVEFHUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgICAvKio8IE1QTFMgVGFncy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MQVlFUl9TRUxFQ1RfSVBWNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAgICAgICAgIC8qKjwgSVB2NC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MQVlFUl9TRUxFQ1RfSVBWNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAgICAgICAgIC8qKjwgSVB2Ni4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MQVlFUl9TRUxFQ1RfR0VORVJJQ19MMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAgICAgICAgIC8qKjwgR2VuZXJpYyBMMy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MQVlFUl9TRUxFQ1RfVENQX1VEUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5LCAgICAgICAgICAgIC8qKjwgVENQL1VEUC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MQVlFUl9TRUxFQ1RfR0VORVJJQ19MNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCAgICAgICAgICAgIC8qKjwgR2VuZXJpYyBMNC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGF5ZXJfc2VsZWN0OworCisvKiogVHJhZmZpYyBCaXRtYXAuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3RyYWZmaWNfYml0bWFwCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1RSQUZGSUNfQklUTUFQX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9PQU1fVFJBRkZJQ19CSVRNQVBfQlJPQURDQVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDEsICAgICAgIC8qKjwgQnJvYWRjYXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9UUkFGRklDX0JJVE1BUF9NVUxUSUNBU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMiwgICAgICAgLyoqPCBNdWx0aWNhc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RSQUZGSUNfQklUTUFQX0RSRVNFUlZFRF9HUk9VUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDA0LCAgICAgICAvKio8IDgwMi4xZCBSZXNlcnZlZCBHcm91cC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVFJBRkZJQ19CSVRNQVBfVU5JQ0FTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDgsICAgICAgIC8qKjwgVW5pY2FzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVFJBRkZJQ19CSVRNQVBfRkxPT0RFRF9VTklDQVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMTAgICAgICAgIC8qKjwgRmxvb2RlZCBVbmljYXN0LiAqLworfSBiY21vbHRfZXBvbl9vYW1fdHJhZmZpY19iaXRtYXA7CisKKy8qKiBSYXRlIFVuaXRzLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9yYXRlX3VuaXRzCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1JBVEVfVU5JVFNfS0JQUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IEticHMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JBVEVfVU5JVFNfRlJBTUVTX1NFQ09ORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSAgICAgICAgICAgICAvKio8IEZyYW1lcy9zZWNvbmQuICovCit9IGJjbW9sdF9lcG9uX29hbV9yYXRlX3VuaXRzOworCisvKiogRFBvRSBGRUMgTW9kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZHBvZV9mZWNfbW9kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZFQ19NT0RFX09GRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBObyBGRUMgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GRUNfTU9ERV9PTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgRkVDIGlzIE9OIGZvciBhbGwgbGlua3MgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GRUNfTU9ERV9QRVJfTElOSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyICAgICAgICAgICAgIC8qKjwgRkVDIGlzIHNldHRhYmxlIHBlciBsaW5rICh3aXRoIHRoZSBQZXIgTGluayBtZXNzYWdlKSAqLworfSBiY21vbHRfZXBvbl9vYW1fZHBvZV9mZWNfbW9kZTsKKworLyoqIERQb0UgUG9ydCBUeXBlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9kcG9lX3BvcnRfdHlwZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX1BPUlRfVFlQRV9VTlNQRUNJRklFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBVbnNwZWNpZmllZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9QT1JUX1RZUEVfRU1UQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgRU1UQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9QT1JUX1RZUEVfRVNUQl9JUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgRVNUQi1JUC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9QT1JUX1RZUEVfRVNUQl9EU0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgRVNUQi1EU0cuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfUE9SVF9UWVBFX0VURUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IEVURUEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfUE9SVF9UWVBFX0VTRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgICAvKio8IEVTRy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9QT1JUX1RZUEVfRVJPVVRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAgICAgICAgIC8qKjwgRSBSb3V0ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfUE9SVF9UWVBFX0VEVkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNyAgICAgICAgICAgICAvKio8IEVEVkEuICovCit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX3BvcnRfdHlwZTsKKworLyoqIERwb2UgSXBtYyBGb3J3YXJkaW5nIEZsYWdzLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9kcG9lX2lwbWNfZm9yd2FyZGluZ19mbGFncworeworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0lQTUNfRk9SV0FSRElOR19GTEFHU19OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfSVBNQ19GT1JXQVJESU5HX0ZMQUdTX0xMSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAxLCAgICAgICAvKio8IExMSUQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfSVBNQ19GT1JXQVJESU5HX0ZMQUdTX0wyREEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAyLCAgICAgICAvKio8IEwyIERBLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0lQTUNfRk9SV0FSRElOR19GTEFHU19MMlNBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwNCwgICAgICAgLyoqPCBMMiBTQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9JUE1DX0ZPUldBUkRJTkdfRkxBR1NfSVBEQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDgsICAgICAgIC8qKjwgSVAgREEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfSVBNQ19GT1JXQVJESU5HX0ZMQUdTX0lQU0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDEwICAgICAgICAvKio8IElQIFNBLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZHBvZV9pcG1jX2ZvcndhcmRpbmdfZmxhZ3M7CisKKy8qKiBEUG9FIFBvd2VyIFNhdmluZyBNb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Bvd2VyX3NhdmluZ19tb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfUE9XRVJfU0FWSU5HX01PREVfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IE5vbmUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfUE9XRVJfU0FWSU5HX01PREVfVFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IFR4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX1BPV0VSX1NBVklOR19NT0RFX1RSWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBUcnguICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfUE9XRVJfU0FWSU5HX01PREVfVFhfVFJYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgICAgICAvKio8IFR4X1RyeC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcG93ZXJfc2F2aW5nX21vZGU7CisKKy8qKiBEUG9FIEVycm9yIENvZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXJyb3JfY29kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0VSUk9SX0NPREVfTk9fRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyOCwgICAgICAgICAgLyoqPCBObyBFcnJvci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9FUlJPUl9DT0RFX1RPT19MT05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjksICAgICAgICAgIC8qKjwgVG9vIExvbmcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRVJST1JfQ09ERV9CQURfUEFSQU1TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTM0LCAgICAgICAgICAvKio8IEJhZCBQYXJhbXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRVJST1JfQ09ERV9OT19SRVNPVVJDRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTM1LCAgICAgICAgICAvKio8IE5vIFJlc291cmNlcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9FUlJPUl9DT0RFX1NZU1RFTV9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzYsICAgICAgICAgIC8qKjwgU3lzdGVtIEJ1c3kuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRVJST1JfQ09ERV9VTkRFVEVSTUlORUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYwLCAgICAgICAgICAvKio8IFVuZGV0ZXJtaW5lZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9FUlJPUl9DT0RFX1VOU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNjEsICAgICAgICAgIC8qKjwgVW5zdXBwb3J0ZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRVJST1JfQ09ERV9DT1JSVVBURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYyLCAgICAgICAgICAvKio8IENvcnJ1cHRlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9FUlJPUl9DT0RFX0hXX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNjMsICAgICAgICAgIC8qKjwgSHcgRmFpbHVyZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9FUlJPUl9DT0RFX09WRVJGTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNjQgICAgICAgICAgIC8qKjwgT3ZlcmZsb3cuICovCit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX2Vycm9yX2NvZGU7CisKKy8qKiBEUG9FIEZpbGUgVHJhbnNmZXIgT3Bjb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfb3Bjb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UUkFOU0ZFUl9PUENPREVfRklMRV9SRUFEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IEZpbGUgUmVhZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX09QQ09ERV9GSUxFX1dSSVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgRmlsZSBXcml0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX09QQ09ERV9GSUxFX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgRmlsZSBEYXRhLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFJBTlNGRVJfT1BDT0RFX0ZJTEVfQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMgICAgICAgICAgICAgLyoqPCBGaWxlIEFjay4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9vcGNvZGU7CisKKy8qKiBEUG9FIEZpbGUgVHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3R5cGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RZUEVfQk9PVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgQm9vdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RZUEVfQVBQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgQXBwLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFlQRV9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBDb25maWcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UWVBFX0RJQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgICAgICAvKio8IERpYWcuICovCit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHlwZTsKKworLyoqIERQb0UgRmlsZSBUcmFuc2ZlciBFcnJvci4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Vycm9yCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UUkFOU0ZFUl9FUlJPUl9PSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IE9rLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFJBTlNGRVJfRVJST1JfVU5ERUZJTkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBVbmRlZmluZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UUkFOU0ZFUl9FUlJPUl9OT1RfRk9VTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IE5vdCBGb3VuZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX0VSUk9SX05PX0FDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgTm8gQWNjZXNzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFJBTlNGRVJfRVJST1JfRlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBGdWxsLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFJBTlNGRVJfRVJST1JfSUxMRUdBTF9PUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgLyoqPCBJbGxlZ2FsIE9wLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFJBTlNGRVJfRVJST1JfVU5LTk9XTl9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBVbmtub3duIElELiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFJBTlNGRVJfRVJST1JfQkFEX0JMT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAgICAgLyoqPCBCYWQgQmxvY2suICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UUkFOU0ZFUl9FUlJPUl9USU1FT1VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgICAgICAgICAvKio8IFRpbWVvdXQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UUkFOU0ZFUl9FUlJPUl9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgICAgICAgICAvKio8IEJ1c3kuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UUkFOU0ZFUl9FUlJPUl9JTkNPTVBBVElCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgICAgICAgICAvKio8IEluY29tcGF0aWJsZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX0VSUk9SX0NPUlJVUFRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSAgICAgICAgICAgIC8qKjwgQ29ycnVwdGVkLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Vycm9yOworCisvKiogRFBvRSBJbmZvIFRMViBUeXBlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9kcG9lX2luZm9fdGx2X3R5cGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9JTkZPX1RMVl9UWVBFX0RQT0VfT0FNX1NVUFBPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwICAgICAgICAgICAgIC8qKjwgRFBvRSBPQU0gU3VwcG9ydC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaW5mb190bHZfdHlwZTsKKworLyoqIERQb0UgTWNhc3QgQ3RybCBBY3Rpb24uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfY3RybF9hY3Rpb24KK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9NQ0FTVF9DVFJMX0FDVElPTl9BREQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgQWRkIG9uZSBlbnRyeSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX01DQVNUX0NUUkxfQUNUSU9OX1JFTU9WRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBEZWxldGUgb25lIGVudHJ5ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTUNBU1RfQ1RSTF9BQ1RJT05fQ0xFQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAvKio8IFJlbW92ZSBhbGwgZW50cmllcyAqLworfSBiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9jdHJsX2FjdGlvbjsKKworLyoqIERwb2UgTWNhc3QgQ3RybCBSZXNwIENvZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfY3RybF9yZXNwX2NvZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9NQ0FTVF9DVFJMX1JFU1BfQ09ERV9GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgRmFpbHVyZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9NQ0FTVF9DVFJMX1JFU1BfQ09ERV9TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxICAgICAgICAgICAgIC8qKjwgU3VjY2Vzcy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfY3RybF9yZXNwX2NvZGU7CisKKy8qKiBEUG9FIE1jYXN0IFJlZyBDb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X3JlZ19jb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTUNBU1RfUkVHX0NPREVfREVSRUdJU1RFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IERlcmVnaXN0ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTUNBU1RfUkVHX0NPREVfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgICAgICAvKio8IFJlZ2lzdGVyLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9yZWdfY29kZTsKKworLyoqIFBoeSB0eXBlIC0tIGNvcnJlc3BvbmRzIHRvIE9hbVBoeVR5cGUgaW4gT2FtLmggCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fc3RkX3BoeV90eXBlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9QSFlfVFlQRV9PVEhFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IE90aGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfUEhZX1RZUEVfVU5LTk9XTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBVbmtub3duLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfUEhZX1RZUEVfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBOb25lLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfUEhZX1RZUEVfVEVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAgICAgLyoqPCAxMC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU1REX1BIWV9UWVBFX09ORV9IVU5EUkVEX1Q0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMywgICAgICAgICAgIC8qKjwgMTAwIFQ0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfUEhZX1RZUEVfT05FX0hVTkRSRURfWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0LCAgICAgICAgICAgLyoqPCAxMDAgWC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU1REX1BIWV9UWVBFX09ORV9IVU5EUkVEX1QyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMiwgICAgICAgICAgIC8qKjwgMTAwIFQyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfUEhZX1RZUEVfT05FX1RIT1VTQU5EX1ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM2LCAgICAgICAgICAgLyoqPCAxMDAwIFguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9QSFlfVFlQRV9PTkVfVEhPVVNBTkRfVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDAsICAgICAgICAgICAvKio8IDEwMDAgVC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU1REX1BIWV9UWVBFX1RFTl9HWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0OCwgICAgICAgICAgIC8qKjwgMTBHIFguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9QSFlfVFlQRV9URU5fR1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDksICAgICAgICAgICAvKio8IDEwRyBSLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfUEhZX1RZUEVfVEVOX1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUwLCAgICAgICAgICAgLyoqPCAxMCBXLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfUEhZX1RZUEVfVEVOX0dUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDU1ICAgICAgICAgICAgLyoqPCAxMEcgVC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3N0ZF9waHlfdHlwZTsKKworLyoqIE9BTSBTdGF0ZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fb2FtX3N0YXRlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX09BTV9TVEFURV9ESVNBQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IERpc2FibGVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PQU1fU1RBVEVfRU5BQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgLyoqPCBFbmFibGVkLiAqLworfSBiY21vbHRfZXBvbl9vYW1fb2FtX3N0YXRlOworCisvKiogTWF1IE1lZGlhIEF2YWlsYWJsZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fbWF1X21lZGlhX2F2YWlsYWJsZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9NQVVfTUVESUFfQVZBSUxBQkxFX09USEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBPdGhlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fTUFVX01FRElBX0FWQUlMQUJMRV9VTktOT1dOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgVW5rbm93bi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fTUFVX01FRElBX0FWQUlMQUJMRV9BVkFJTEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgQXZhaWxhYmxlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9NQVVfTUVESUFfQVZBSUxBQkxFX05PVF9BVkFJTEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBOb3QgQXZhaWxhYmxlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9NQVVfTUVESUFfQVZBSUxBQkxFX1JFTU9URV9GQVVMVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgLyoqPCBSZW1vdGUgRmF1bHQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX01BVV9NRURJQV9BVkFJTEFCTEVfSU5WX1NJR05BTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgICAvKio8IEludiBTaWduYWwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX01BVV9NRURJQV9BVkFJTEFCTEVfUkVNT1RFX0pBQkJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgICAgICAgICAvKio8IFJlbW90ZSBKYWJiZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX01BVV9NRURJQV9BVkFJTEFCTEVfUkVNT1RFX0xJTktfTE9TUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgICAgICAgICAvKio8IFJlbW90ZSBMaW5rIExvc3MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX01BVV9NRURJQV9BVkFJTEFCTEVfUkVNT1RFX1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgICAgICAgICAvKio8IFJlbW90ZSBUZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9NQVVfTUVESUFfQVZBSUxBQkxFX09GRkxJTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgICAgICAgICAgLyoqPCBPZmZsaW5lLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9NQVVfTUVESUFfQVZBSUxBQkxFX0FVVE9fTkVHX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExICAgICAgICAgICAgLyoqPCBBdXRvIE5lZyBFcnJvci4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX21hdV9tZWRpYV9hdmFpbGFibGU7CisKKy8qKiBTdGQgQXV0byBOZWdvaXRhdGlvbiBDYXBhYmlsaXR5LiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9zdGRfYXV0b19uZWdvaXRhdGlvbl9jYXBhYmlsaXR5Cit7CisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9BVVRPX05FR09JVEFUSU9OX0NBUEFCSUxJVFlfR0xPQkFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IEdsb2JhbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU1REX0FVVE9fTkVHT0lUQVRJT05fQ0FQQUJJTElUWV9PVEhFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgT3RoZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9BVVRPX05FR09JVEFUSU9OX0NBUEFCSUxJVFlfVU5LTk9XTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IFVua25vd24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9BVVRPX05FR09JVEFUSU9OX0NBUEFCSUxJVFlfVEVOX1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQsICAgICAgICAgICAvKio8IDEwIFQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9BVVRPX05FR09JVEFUSU9OX0NBUEFCSUxJVFlfVEVOX1RGRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQyLCAgICAgICAgICAvKio8IDEwIFRGRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU1REX0FVVE9fTkVHT0lUQVRJT05fQ0FQQUJJTElUWV9PTkVfSFVORFJFRF9UNCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMywgICAgICAgICAgIC8qKjwgMTAwIFQ0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfQVVUT19ORUdPSVRBVElPTl9DQVBBQklMSVRZX09ORV9IVU5EUkVEX1RYICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1LCAgICAgICAgICAgLyoqPCAxMDAgVFguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9BVVRPX05FR09JVEFUSU9OX0NBUEFCSUxJVFlfT05FX0hVTkRSRURfVFhGRCAgICAgICAgICAgICAgICAgICAgICAgID0gMjUyLCAgICAgICAgICAvKio8IDEwMCBUWEZELiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfQVVUT19ORUdPSVRBVElPTl9DQVBBQklMSVRZX0ZEWF9QQVVTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMxMiwgICAgICAgICAgLyoqPCBGZHggUGF1c2UuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9BVVRPX05FR09JVEFUSU9OX0NBUEFCSUxJVFlfRkRYX0FQQVVTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzEzLCAgICAgICAgICAvKio8IEZkeCBBIFBhdXNlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfQVVUT19ORUdPSVRBVElPTl9DQVBBQklMSVRZX0ZEWF9TUEFVU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMxNCwgICAgICAgICAgLyoqPCBGZHggUyBQYXVzZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU1REX0FVVE9fTkVHT0lUQVRJT05fQ0FQQUJJTElUWV9GRFhfQlBBVVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMTUsICAgICAgICAgIC8qKjwgRmR4IEIgUGF1c2UuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9BVVRPX05FR09JVEFUSU9OX0NBUEFCSUxJVFlfT05FX0hVTkRSRURfVDIgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzIsICAgICAgICAgICAvKio8IDEwMCBUMi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU1REX0FVVE9fTkVHT0lUQVRJT05fQ0FQQUJJTElUWV9PTkVfSFVORFJFRF9UMkZEICAgICAgICAgICAgICAgICAgICAgICAgPSAzMjIsICAgICAgICAgIC8qKjwgMTAwIFQyIEZELiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfQVVUT19ORUdPSVRBVElPTl9DQVBBQklMSVRZX09ORV9USE9VU0FORF9YICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM2LCAgICAgICAgICAgLyoqPCAxMDAwIFguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9BVVRPX05FR09JVEFUSU9OX0NBUEFCSUxJVFlfT05FX1RIT1VTQU5EX1hGRCAgICAgICAgICAgICAgICAgICAgICAgID0gMzYyLCAgICAgICAgICAvKio8IDEwMDAgWEZELiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfQVVUT19ORUdPSVRBVElPTl9DQVBBQklMSVRZX09ORV9USE9VU0FORF9UICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQwLCAgICAgICAgICAgLyoqPCAxMDAwIFQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9BVVRPX05FR09JVEFUSU9OX0NBUEFCSUxJVFlfT05FX1RIT1VTQU5EX1RGRCAgICAgICAgICAgICAgICAgICAgICAgID0gNDAyLCAgICAgICAgICAvKio8IDEwMDAgVEZELiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfQVVUT19ORUdPSVRBVElPTl9DQVBBQklMSVRZX1JFTV9GQVVMVDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM3LCAgICAgICAgICAgLyoqPCBSZW0gRmF1bHQgMS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU1REX0FVVE9fTkVHT0lUQVRJT05fQ0FQQUJJTElUWV9SRU1fRkFVTFQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNzIsICAgICAgICAgIC8qKjwgUmVtIEZhdWx0IDIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9BVVRPX05FR09JVEFUSU9OX0NBUEFCSUxJVFlfVEVOX0dCQVNFX1ggICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDgsICAgICAgICAgICAvKio8IDEwIEcgQmFzZSBYLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfQVVUT19ORUdPSVRBVElPTl9DQVBBQklMSVRZX1RFTl9HQkFTRV9MWDQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ4MSwgICAgICAgICAgLyoqPCAxMCBHIEJhc2UgTCBYNC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU1REX0FVVE9fTkVHT0lUQVRJT05fQ0FQQUJJTElUWV9URU5fR0JBU0VfUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0OSwgICAgICAgICAgIC8qKjwgMTAgRyBCYXNlIFIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9BVVRPX05FR09JVEFUSU9OX0NBUEFCSUxJVFlfVEVOX0dCQVNFX0VSICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDkxLCAgICAgICAgICAvKio8IDEwIEcgQmFzZSBFUi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU1REX0FVVE9fTkVHT0lUQVRJT05fQ0FQQUJJTElUWV9URU5fR0JBU0VfTFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0OTIsICAgICAgICAgIC8qKjwgMTAgRyBCYXNlIExSLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfQVVUT19ORUdPSVRBVElPTl9DQVBBQklMSVRZX1RFTl9HQkFTRV9TUiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ5MywgICAgICAgICAgLyoqPCAxMCBHIEJhc2UgU1IuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9BVVRPX05FR09JVEFUSU9OX0NBUEFCSUxJVFlfVEVOX0dCQVNFX1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTAsICAgICAgICAgICAvKio8IDEwIEcgQmFzZSBXLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfQVVUT19ORUdPSVRBVElPTl9DQVBBQklMSVRZX1RFTl9HQkFTRV9FVyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUwMSwgICAgICAgICAgLyoqPCAxMCBHIEJhc2UgRVcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9BVVRPX05FR09JVEFUSU9OX0NBUEFCSUxJVFlfVEVOX0dCQVNFX0xXICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTAyLCAgICAgICAgICAvKio8IDEwIEcgQmFzZSBMVy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU1REX0FVVE9fTkVHT0lUQVRJT05fQ0FQQUJJTElUWV9URU5fR0JBU0VfU1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MDMsICAgICAgICAgIC8qKjwgMTAgRyBCYXNlIFNXLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TVERfQVVUT19ORUdPSVRBVElPTl9DQVBBQklMSVRZX0lTT19FVEhFUk5FVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgwMjkgICAgICAgICAgLyoqPCBJc28gRXRoZXJuZXQuICovCit9IGJjbW9sdF9lcG9uX29hbV9zdGRfYXV0b19uZWdvaXRhdGlvbl9jYXBhYmlsaXR5OworCisvKiogTUFDIER1cGxleCBTdGF0dXMuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX21hY19kdXBsZXhfc3RhdHVzCit7CisgICAgQkNNT0xUX0VQT05fT0FNX01BQ19EVVBMRVhfU1RBVFVTX09BTV9NQUNfRFVQTEVYX0hBTEYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IE9BTSBNQUMgRHVwbGV4IEhhbGYuICovCisgICAgQkNNT0xUX0VQT05fT0FNX01BQ19EVVBMRVhfU1RBVFVTX09BTV9NQUNfRFVQTEVYX0ZVTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IE9BTSBNQUMgRHVwbGV4IEZ1bGwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX01BQ19EVVBMRVhfU1RBVFVTX09BTV9NQUNfRFVQTEVYX1VOS05PV04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgICAgICAvKio8IE9BTSBNQUMgRHVwbGV4IFVua25vd24uICovCit9IGJjbW9sdF9lcG9uX29hbV9tYWNfZHVwbGV4X3N0YXR1czsKKworLyoqIEZFQyBTdXBwb3J0LiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9mZWNfc3VwcG9ydAoreworICAgIEJDTU9MVF9FUE9OX09BTV9GRUNfU1VQUE9SVF9VTktOT1dOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBVbmtub3duLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9GRUNfU1VQUE9SVF9TVVBQT1JURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBTdXBwb3J0ZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0ZFQ19TVVBQT1JUX05PVF9TVVBQT1JURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgICAgICAvKio8IE5vdCBTdXBwb3J0ZWQuICovCit9IGJjbW9sdF9lcG9uX29hbV9mZWNfc3VwcG9ydDsKKworLyoqIFN0ZCBGRUMgTW9kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fc3RkX2ZlY19tb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9GRUNfTU9ERV9VTktOT1dOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IFVua25vd24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9GRUNfTU9ERV9FTkFCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IEVuYWJsZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NURF9GRUNfTU9ERV9ESVNBQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgICAgICAvKio8IERpc2FibGVkLiAqLworfSBiY21vbHRfZXBvbl9vYW1fc3RkX2ZlY19tb2RlOworCisvKiogRFBvRSBPcGNvZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb3Bjb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1JFU0VSVkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IFJlc2VydmVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9HRVRfUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBHZXQgUmVxdWVzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfR0VUX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgR2V0IFJlc3BvbnNlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9TRVRfUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBTZXQgUmVxdWVzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU0VUX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgU2V0IFJlc3BvbnNlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9EWU5BTUlDX0lQTUNBU1RfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgLyoqPCBEeW5hbWljIElQIE11bHRpY2FzdCBDb250cm9sLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9NQ0FTVF9SRUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBNY2FzdCBSZWcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX01DQVNUX1JFR19SRVNQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgICAgICAgICAvKio8IE1jYXN0IFJlZyBSZXNwLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9LRVlfRVhDSEFOR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgICAgICAgICAgLyoqPCBLZXkgRXhjaGFuZ2UuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0ZJTEVfVFJBTlNGRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgICAgICAgICAvKio8IEZpbGUgVHJhbnNmZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0RZTkFNSUNfSVBNQ0FTVF9DVFJMX1JFU1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgICAgICAgICAvKio8IER5bmFtaWMgSVAgTXVsdGljYXN0IENvbnRyb2wgUmVzcG9uc2UuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1NUQVRJQ19JUE1DQVNUX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEsICAgICAgICAgICAvKio8IFN0YXRpYyBJUCBNdWx0aWNhc3QgQ29udHJvbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU1RBVElDX0lQTUNBU1RfQ1RSTF9SRVNQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMiAgICAgICAgICAgIC8qKjwgU3RhdGljIElQIE11bHRpY2FzdCBDb250cm9sIFJlc3BvbnNlLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZHBvZV9vcGNvZGU7CisKKy8qKiBEUG9FIFZlcnNpb24uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVyc2lvbgoreworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX1ZFUlNJT05fRFBPRTEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBEUG9FIDEuMC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9WRVJTSU9OX1BSRV9EUE9FX1dJVEhPVVRfQ0VSVElGSUNBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgUHJlLURQb0UgV2l0aG91dCBDZXJ0aWZpY2F0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9WRVJTSU9OX1BSRV9EUE9FX1dJVEhfQ0VSVElGSUNBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgUHJlLURQb0UgV2l0aCBDZXJ0aWZpY2F0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9WRVJTSU9OX0RQT0UxMEkwNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNiwgICAgICAgICAgIC8qKjwgRFBvRSAxLjAgSTA0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX1ZFUlNJT05fRFBPRTEwSTA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3LCAgICAgICAgICAgLyoqPCBEUG9FIDEuMCBJMDUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfVkVSU0lPTl9EUE9FMjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzIgICAgICAgICAgICAvKio8IERQb0UgMi4wLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZXJzaW9uOworCisvKiogRUFQIENvZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2VhcF9jb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0VBUF9DT0RFX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IFJlcXVlc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VBUF9DT0RFX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IFJlc3BvbnNlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FQVBfQ09ERV9TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBTdWNjZXNzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FQVBfQ09ERV9GQUlMVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQgICAgICAgICAgICAgLyoqPCBGYWlsdXJlLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZWFwX2NvZGU7CisKKy8qKiBUTFMgU3VidHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fdGxzX3N1YnR5cGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX1NVQlRZUEVfQVVUSEVOVElDQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMyAgICAgICAgICAgIC8qKjwgQXV0aGVudGljYXRpb24uICovCit9IGJjbW9sdF9lcG9uX29hbV90bHNfc3VidHlwZTsKKworLyoqIFRMUyBGbGFncy4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fdGxzX2ZsYWdzCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1RMU19GTEFHU19OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX0ZMQUdTX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMjAsICAgICAgIC8qKjwgU3RhcnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RMU19GTEFHU19NT1JFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDQwLCAgICAgICAvKio8IE1vcmUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RMU19GTEFHU19MRU5HVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDgwICAgICAgICAvKio8IExlbmd0aC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rsc19mbGFnczsKKworLyoqIFRMUyBDb250ZW50IFR5cGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3Rsc19jb250ZW50X3R5cGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9DSEFOR0VfQ0lQSEVSX1NQRUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMCwgICAgICAgICAgIC8qKjwgQ2hhbmdlIENpcGhlciBTcGVjLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9UTFNfQ09OVEVOVF9UWVBFX0FMRVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxLCAgICAgICAgICAgLyoqPCBBbGVydC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX0NPTlRFTlRfVFlQRV9IQU5EU0hBS0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMiwgICAgICAgICAgIC8qKjwgSGFuZHNoYWtlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9UTFNfQ09OVEVOVF9UWVBFX0FQUExJQ0FUSU9OX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzICAgICAgICAgICAgLyoqPCBBcHBsaWNhdGlvbiBEYXRhLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGxzX2NvbnRlbnRfdHlwZTsKKworLyoqIFRMUyBIYW5kc2hha2UgVHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZV90eXBlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1RMU19IQU5EU0hBS0VfVFlQRV9IRUxMT19SRVFVRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IEhlbGxvIFJlcXVlc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RMU19IQU5EU0hBS0VfVFlQRV9DTElFTlRfSEVMTE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IENsaWVudCBIZWxsby4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX1NFUlZFUl9IRUxMTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgU2VydmVyIEhlbGxvLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFORFNIQUtFX1RZUEVfQ0VSVElGSUNBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExLCAgICAgICAgICAgLyoqPCBDZXJ0aWZpY2F0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX1NFUlZFUl9LRVlfRVhDSEFOR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMiwgICAgICAgICAgIC8qKjwgU2VydmVyIEtleSBFeGNoYW5nZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX0NFUlRJRklDQVRFX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMywgICAgICAgICAgIC8qKjwgQ2VydGlmaWNhdGUgUmVxdWVzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX1NFUlZFUl9IRUxMT19ET05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNCwgICAgICAgICAgIC8qKjwgU2VydmVyIEhlbGxvIERvbmUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RMU19IQU5EU0hBS0VfVFlQRV9DRVJUSUZJQ0FURV9WRVJJRlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUsICAgICAgICAgICAvKio8IENlcnRpZmljYXRlIFZlcmlmeS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX0NMSUVOVF9LRVlfRVhDSEFOR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNiwgICAgICAgICAgIC8qKjwgQ2xpZW50IEtleSBFeGNoYW5nZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX0hBTkRTSEFLRV9UWVBFX0ZJTklTSEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMCAgICAgICAgICAgIC8qKjwgRmluaXNoZWQuICovCit9IGJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlX3R5cGU7CisKKy8qKiBUTFMgQ2lwaGVyc3VpdGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9UTFNfQ0lQSEVSU1VJVEVfVExTX05VTExfV0lUSF9OVUxMX05VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBUTFMgTnVsbCBXaXRoIE51bGwgTnVsbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX0NJUEhFUlNVSVRFX1RMU19SU0FfV0lUSF9OVUxMX01ENSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgVExTIFJTQSBXaXRoIE51bGwgTUQ1LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9UTFNfQ0lQSEVSU1VJVEVfVExTX1JTQV9XSVRIX05VTExfU0hBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBUTFMgUlNBIFdpdGggTnVsbCBTSEEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RMU19DSVBIRVJTVUlURV9UTFNfUlNBX1dJVEhfUkM0MTI4TUQ1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IFRMUyBSU0EgV2l0aCBSQzQgMTI4IE1ENS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX0NJUEhFUlNVSVRFX1RMU19SU0FfV0lUSF9SQzQxMjhTSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgVExTIFJTQSBXaXRoIFJDNCAxMjggU0hBLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9UTFNfQ0lQSEVSU1VJVEVfVExTX1JTQV9XSVRIX0lERUFfQ0JDX1NIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAgICAgLyoqPCBUTFMgUlNBIFdpdGggSURFQSBDQkMgU0hBLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9UTFNfQ0lQSEVSU1VJVEVfVExTX1JTQV9XSVRIX0RFU19DQkNfU0hBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgICAgICAgICAgLyoqPCBUTFMgUlNBIFdpdGggREVTIENCQyBTSEEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RMU19DSVBIRVJTVUlURV9UTFNfUlNBX1dJVEgzREVTX0VERV9DQkNfU0hBICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAgICAgICAgICAgICAvKio8IFRMUyBSU0EgV2l0aCAzREVTIEVERSBDQkMgU0hBLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlOworCisvKiogVExTIENvbXByZXNzaW9uIE1ldGhvZC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX21ldGhvZAoreworICAgIEJDTU9MVF9FUE9OX09BTV9UTFNfQ09NUFJFU1NJT05fTUVUSE9EX05VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAgICAgICAgICAgICAgLyoqPCBOdWxsLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX21ldGhvZDsKKworLyoqIFRMUyBDZXJ0aWZpY2F0ZSBUeXBlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9UTFNfQ0VSVElGSUNBVEVfVFlQRV9SU0FfU0lHTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBSU0EgU2lnbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX0NFUlRJRklDQVRFX1RZUEVfRFNTX1NJR04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgRFNTIFNpZ24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RMU19DRVJUSUZJQ0FURV9UWVBFX1JTQV9GSVhFRF9ESCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IFJTQSBGaXhlZCBESC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX0NFUlRJRklDQVRFX1RZUEVfRFNTX0ZJWEVEX0RIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgRFNTIEZpeGVkIERILiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9UTFNfQ0VSVElGSUNBVEVfVFlQRV9SU0FfRVBIRU1FUkFMX0RIUkVTRVJWRUQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgLyoqPCBSU0EgRXBoZW1lcmFsIERIIChSRVNFUlZFRCkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RMU19DRVJUSUZJQ0FURV9UWVBFX0RTU19FUEVIRU1FUkFMX0RIUkVTRVJWRUQgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgICAvKio8IERTUyBFcGVoZW1lcmFsIERIIChSRVNFUlZFRCkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RMU19DRVJUSUZJQ0FURV9UWVBFX0ZPUlRFWlpBX0RNU19SRVNFUlZFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjAgICAgICAgICAgICAvKio8IEZvcnRlenphIERNUyAoUkVTRVJWRUQpLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX3R5cGU7CisKKy8qKiBFQVBPTCBUeXBlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9lYXBvbF90eXBlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0VBUE9MX1RZUEVfUEFDS0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IFBhY2tldC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRUFQT0xfVFlQRV9TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgU3RhcnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VBUE9MX1RZUEVfTE9HT0ZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IExvZ29mZi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRUFQT0xfVFlQRV9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgS2V5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FQVBPTF9UWVBFX0FTRl9BTEVSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBBU0YgQWxlcnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VBUE9MX1RZUEVfTUtBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSAgICAgICAgICAgICAvKio8IE1LQS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3R5cGU7CisKKy8qKiBFQVBPTCBWZXJzaW9uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9lYXBvbF92ZXJzaW9uCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0VBUE9MX1ZFUlNJT05fVkVSU0lPTjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAvKio8IFZlcnNpb24gMi4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3ZlcnNpb247CisKKy8qKiBFUE9DIENNQyBTdGF0IEluZGV4LiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9lcG9jX2NtY19zdGF0X2luZGV4Cit7CisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfVEJNX1VQX09LX1NETV9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IFRyYW5zbWl0IHBhY2tldCBmcm9tIFNETSB1cHN0cmVhbSB3aXRoIGdvb2QgdGltZXN0YW1wPFN0YXRJbmZvPiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NNQ19TVEFUX0lOREVYX1RCTV9VUF9PS19DTUlfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBUcmFuc21pdCBwYWNrZXQgZnJvbSBDTUkgdXBzdHJlYW0gd2l0aCBnb29kIHRpbWVzdGFtcDxTdGF0SW5mbz4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTUNfU1RBVF9JTkRFWF9UQk1fVVBfRFJPUFBFRF9TRE1fRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgU3RhdGlzdGljIGZvciBkcm9wcGluZyBmcmFtZSBkdWUgdG8gdGltZXN0YW1wIGVycm9yICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfVEJNX1VQX0RST1BQRURfQ01JX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IFN0YXRpc3RpYyBmb3IgZHJvcHBpbmcgZnJhbWUgZHVlIHRvIHRpbWVzdGFtcCBlcnJvciAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NNQ19TVEFUX0lOREVYX1RCTV9ET1dOX09LX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBTdGF0aXN0aWMgcmVjaWV2aW5nIGZyYW1lIGRvd25zdHJlYW0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTUNfU1RBVF9JTkRFWF9UQk1fRE9XTl9EUk9QUEVEX0NSQzhGUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgRHJvcCBmcmFtZSBiZWNhdXNlIG9mIENSQyA4IGVycm9yICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfVEJNX0RPV05fRFJPUFBFRF9MSU5FQ09ERV9GUkFNRVMgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgICAvKio8IERyb3AgZnJhbWUgYmVjYXVzZSBvZiBsaW5lIGNvZGluZyBlcnJvciAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NNQ19TVEFUX0lOREVYX1RCTV9ET1dOX0RST1BQRURfTUFYU0laRV9GUkFNRVMgICAgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAgICAgLyoqPCBEcm9wIGZyYW1lIGZvciBiZWluZyB0b28gbG9uZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NNQ19TVEFUX0lOREVYX0dGSV9ET1dOX1RJTUVfVVBEQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgICAgICAgICAgLyoqPCBWYWxpZCBUaW1lc3RhbXAgVXBkYXRlICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfR0ZJX0RPV05fR1JBTlRfUkVDRUlWRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgICAgICAgICAvKio8IFZhbGlkIEdyYW50IFJlY2VpdmVkICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfR0ZJX0RPV05fRFJPUFBFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgICAgICAgICAvKio8IDxTdGF0SW5mbz4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTUNfU1RBVF9JTkRFWF9HRklfR0FURV9ESUZfUEVBSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAgICAgICAgIC8qKjwgICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfR0ZJX0dSVF9QSFlfRElTQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIsICAgICAgICAgICAvKio8IDxTdGF0SW5mbz4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTUNfU1RBVF9JTkRFWF9HRklfR1JUX0RJU0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMywgICAgICAgICAgIC8qKjwgPFN0YXRJbmZvPiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NNQ19TVEFUX0lOREVYX0dGSV9HUlRfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0LCAgICAgICAgICAgLyoqPCA8U3RhdEluZm8+ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfR0ZJX0dSVF9UVU5JTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUsICAgICAgICAgICAvKio8IFN0YXRpc3RpYyB0aGF0IGNvdW50cyBkaXNjb3ZlcnkgZ2F0ZXMgY29udmVydGVkIHRvIHR1bmluZyBncmFudHMgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTUNfU1RBVF9JTkRFWF9TRElfUlhfUEFDS0VUX09WRVJfRFJPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNiwgICAgICAgICAgIC8qKjwgVGhpcyBpbmRpY2F0ZXMgYW4gZG93biBidXJzdCBoZWFkZXIgd2l0aCBhIGdvb2QgQ1JDIDMyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NNQ19TVEFUX0lOREVYX1NESV9ET1dOX0NSQzMyRFJPUFBFRF9IRUFERVJTICAgICAgICAgICAgICAgICAgICAgICA9IDE3LCAgICAgICAgICAgLyoqPCBUaGlzIGluZGljYXRlcyBhbiBkb3duIGJ1cnN0IGhlYWRlciB3aXRoIGEgZ29vZCBDUkMgMzIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfU0RJX0RPV05fT0tfSEVBREVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgsICAgICAgICAgICAvKio8IENvdW50IGdvb2QgYnVyc3QgaGVhZGVycyA8U3RhdEluZm8gIElzTWlycm9yPSJUcnVlIj4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTUNfU1RBVF9JTkRFWF9GRUNfVVBfQkFEX0JMT0NLUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOSwgICAgICAgICAgIC8qKjwgPFN0YXRJbmZvIElzTWlycm9yPSJUcnVlIiBJc1JhdGU9IlRydWUiPiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NNQ19TVEFUX0lOREVYX0ZFQ19VUF9DT1JSRUNURURfQkxPQ0tTICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwLCAgICAgICAgICAgLyoqPCA8U3RhdEluZm8gSXNNaXJyb3I9IlRydWUiIElzUmF0ZT0iVHJ1ZSI+ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfRkVDX1VQX09LX0JMT0NLUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjEsICAgICAgICAgICAvKio8IDxTdGF0SW5mbyBJc01pcnJvcj0iVHJ1ZSIgSXNSYXRlPSJUcnVlIj4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTUNfU1RBVF9JTkRFWF9GRUNfVVBfRVJSX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMiwgICAgICAgICAgIC8qKjwgPFN0YXRJbmZvIElzTWlycm9yPSJUcnVlIiBJc1JhdGU9IlRydWUiPiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NNQ19TVEFUX0lOREVYX0ZFQ19VUF9FUlJfQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzLCAgICAgICAgICAgLyoqPCA8U3RhdEluZm8gSXNNaXJyb3I9IlRydWUiIElzUmF0ZT0iVHJ1ZSI+ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfREVGX1VQX0NSQzMyRlJBTUVTX0RST1BQRUQgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjQsICAgICAgICAgICAvKio8IFdlIGNoZWNrIHRoZSBDUkMgMzIgb24gdXBzdHJlYW0gZnJhbWVzLiBUaGlzIGluZGljYXRlcyBhIGZyYW1lIGRpc2NhcmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfREVGX1VQX09LX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjUsICAgICAgICAgICAvKio8IE51bWJlciBvZiBnb29kIHBhY2tldHMgaW4gdGhlIHVwc3RyZWFtIHJ4ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfREVGX1VQX0NSQzhGUkFNRVNfRFJPUFBFRCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjYsICAgICAgICAgICAvKio8IE51bWJlciBvZiBjcmMtOCBlcnJvcnMgaW4gdGhlIHVwc3RyZWFtIHJ4ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfQ01JX1VQX0RST1BQRURfTUFYU0laRV9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgID0gMjcsICAgICAgICAgICAvKio8IERyb3AgZnJhbWUgZm9yIGJlaW5nIHRvbyBsb25nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfQ01JX1VQX09LX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjgsICAgICAgICAgICAvKio8IFN0YXRpc3RpYyByZWNpZXZpbmcgZnJhbWUgdXBzdHJlYW0gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTUNfU1RBVF9JTkRFWF9DTUlfVVBfRFJPUFBFRF9DUkM4RlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOSwgICAgICAgICAgIC8qKjwgRHJvcCBmcmFtZSBiZWNhdXNlIG9mIENSQyA4IGVycm9yICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfQ01JX1VQX0RST1BQRURfTElORUNPREVfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgID0gMzAsICAgICAgICAgICAvKio8IERyb3AgZnJhbWUgYmVjYXVzZSBvZiBsaW5lIGNvZGluZyBlcnJvciAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NNQ19TVEFUX0lOREVYX0RGSV9ET1dOX09LX01QQ1BfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMxLCAgICAgICAgICAgLyoqPCBFbnF1ZXVlZCBNUENQIGZyYW1lICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfREZJX0RPV05fT0tfT0FNX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzIsICAgICAgICAgICAvKio8IEVucXVldWVkIE9hbSBGcmFtZSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NNQ19TVEFUX0lOREVYX0RGSV9ET1dOX09LX0RBVEFfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMzLCAgICAgICAgICAgLyoqPCBFbnF1ZXVlZCBEYXRhIGZyYW1lICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfREZJX0RPV05fRFJPUFBFRF9NUENQX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgID0gMzQsICAgICAgICAgICAvKio8IE92ZXJydW4gTVBDUCBmaWZvICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfREZJX0RPV05fRFJPUFBFRF9PQU1fRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgID0gMzUsICAgICAgICAgICAvKio8IE92ZXJydW4gT2FtIGZpZm8gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTUNfU1RBVF9JTkRFWF9ERklfRE9XTl9EUk9QUEVEX0RBVEFfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgPSAzNiwgICAgICAgICAgIC8qKjwgT3ZlcnJ1biBkYXRhIGZpZm8gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTUNfU1RBVF9JTkRFWF9TRE1fRE9XTl9TWU1CT0xfQ09VTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNywgICAgICAgICAgIC8qKjwgSG93IG1hbnkgc3ltYm9scyBoYXZlIGdvbmUgYnkgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTUNfU1RBVF9JTkRFWF9TRVNfRE9XTl9TWU1CT0xfQ09MTEVDVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzOCwgICAgICAgICAgIC8qKjwgSG93IG1hbnkgc3ltYm9scyBoYXZlIHdlIGNvbGxlY3RlZCBzdGF0cyBvbiA/ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfU0VTX0RPV05fU1lNQk9MX0JJVF9FUlJPUlMgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzksICAgICAgICAgICAvKio8IENvdW50IG9mIGJpdCBlcnJvcnMgaW4gY29sbGVjdGVkIHN5bWJvbHMuIFVzZWQgdG8gdmVyaWZ5IGNvbGxlY3RvciB3b3JraW5nICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ01DX1NUQVRfSU5ERVhfRlJBX0dSQU5UX0RST1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDAsICAgICAgICAgICAvKio8IDxTdGF0SW5mbyBJc01pcnJvcj0iRmFsc2UiIElzUmF0ZT0iRmFsc2UiPiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NNQ19TVEFUX0lOREVYX0ZSQV9QS1RfRFJPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQxICAgICAgICAgICAgLyoqPCA8U3RhdEluZm8gSXNNaXJyb3I9IkZhbHNlIiBJc1JhdGU9IkZhbHNlIj4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Vwb2NfY21jX3N0YXRfaW5kZXg7CisKKy8qKiBFUE9DIENOVSBTdGF0IEluZGV4LiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9lcG9jX2NudV9zdGF0X2luZGV4Cit7CisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ05VX1NUQVRfSU5ERVhfRU1JX1VQX0RST1BQRURfTElORUNPREVfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IERyb3AgZnJhbWUgYmVjYXVzZSBvZiBsaW5lIGNvZGluZyBlcnJvciAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NOVV9TVEFUX0lOREVYX0VNSV9VUF9EUk9QUEVEX0NSQzhGUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBEcm9wIGZyYW1lIGJlY2F1c2Ugb2YgQ1JDIDggZXJyb3IgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTlVfU1RBVF9JTkRFWF9FTUlfVVBfT0tfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgVXBzdHJlYW0gZ29vZCBwYWNrZXQgY291bnQgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTlVfU1RBVF9JTkRFWF9FTUlfVVBfRFJPUFBFRF9NQVhTSVpFX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgTWF4IEZyYW1lIFNpemUgUGFja2V0IERyb3AgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTlVfU1RBVF9JTkRFWF9HUFJfRE9XTl9PQU1fVElNRV9QRUFLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgR3ByIE9hbSBUaW1lIFBlYWsgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTlVfU1RBVF9JTkRFWF9HUFJfRE9XTl9NUENQX1RJTUVfUEVBSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgR3ByIE1wY3AgVGltZSBQZWFrICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ05VX1NUQVRfSU5ERVhfR1BSX0RPV05fREFUQV9USU1FX1BFQUsgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgICAvKio8IEdwciBEYXRhIFRpbWUgUGVhayAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NOVV9TVEFUX0lOREVYX0dQUl9HUlRfUEhZX0RJU0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAgICAgLyoqPCA8U3RhdEluZm8+ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ05VX1NUQVRfSU5ERVhfR1BSX0dSVF9UVU5JTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgICAgICAgICAvKio8IDxTdGF0SW5mbz4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTlVfU1RBVF9JTkRFWF9HUFJfR1JUX0RJU0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5LCAgICAgICAgICAgIC8qKjwgPFN0YXRJbmZvPiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NOVV9TVEFUX0lOREVYX0dQUl9HUlRfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgICAgICAgICAgLyoqPCA8U3RhdEluZm8+ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ05VX1NUQVRfSU5ERVhfR1BSX01QQ1BfUEVBSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEsICAgICAgICAgICAvKio8IERpZmZlcmVuY2UgYmV0d2VlbiBsb2NhbCBNUENQIHRpbWUgcmVmZXJlbmNlIGFuZCB1cGRhdGUgdG8gdGhlIE9OVSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NOVV9TVEFUX0lOREVYX0dQUl9HQVRFX0RJRkZfUEVBSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyLCAgICAgICAgICAgLyoqPCBEaWZmZXJlbmNlIGJldHdlZW4gbG9jYWwgTVBDUCB0aW1lIHJlZmVyZW5jZSBhbmQgdXBkYXRlIHRvIHRoZSBPTlUgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTlVfU1RBVF9JTkRFWF9TRElfUlhfTk9fVkxEX0NOVF9QRUFLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMywgICAgICAgICAgIC8qKjwgU2RpUnhOb1ZsZENudFBlYWsuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ05VX1NUQVRfSU5ERVhfU0RJX1JYX1BBQ0tFVF9PVkVSX0RST1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQsICAgICAgICAgICAvKio8IDxTdGF0SW5mbz4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTlVfU1RBVF9JTkRFWF9TRElfRE9XTl9DUkMzMkRST1BQRURfSEVBREVSUyAgICAgICAgICAgICAgICAgICAgICAgPSAxNSwgICAgICAgICAgIC8qKjwgVGhpcyBpbmRpY2F0ZXMgYW4gZG93biBidXJzdCBoZWFkZXIgd2l0aCBhIGdvb2QgQ1JDIDMyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NOVV9TVEFUX0lOREVYX1NESV9ET1dOX09LX0hFQURFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2LCAgICAgICAgICAgLyoqPCBDb3VudCBnb29kIGJ1cnN0IGhlYWRlcnMgPFN0YXRJbmZvICBJc01pcnJvcj0iVHJ1ZSI+ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ05VX1NUQVRfSU5ERVhfRkVDX0RPV05fQkFEX0JMT0NLUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTcsICAgICAgICAgICAvKio8IDxTdGF0SW5mbyBJc01pcnJvcj0iVHJ1ZSIgSXNSYXRlPSJUcnVlIj4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTlVfU1RBVF9JTkRFWF9GRUNfRE9XTl9DT1JSRUNURURfQkxPQ0tTICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOCwgICAgICAgICAgIC8qKjwgPFN0YXRJbmZvIElzTWlycm9yPSJUcnVlIiBJc1JhdGU9IlRydWUiPiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NOVV9TVEFUX0lOREVYX0ZFQ19ET1dOX09LX0JMT0NLUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5LCAgICAgICAgICAgLyoqPCA8U3RhdEluZm8gSXNNaXJyb3I9IlRydWUiIElzUmF0ZT0iVHJ1ZSI+ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ05VX1NUQVRfSU5ERVhfRkVDX0RPV05fRVJSX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjAsICAgICAgICAgICAvKio8IDxTdGF0SW5mbyBJc01pcnJvcj0iVHJ1ZSIgSXNSYXRlPSJUcnVlIj4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTlVfU1RBVF9JTkRFWF9GRUNfRE9XTl9FUlJfQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMSwgICAgICAgICAgIC8qKjwgPFN0YXRJbmZvIElzTWlycm9yPSJUcnVlIiBJc1JhdGU9IlRydWUiPiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NOVV9TVEFUX0lOREVYX0RFRl9ET1dOX09LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIyLCAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZ29vZCBwYWNrZXRzIGluIHRoZSB1cHN0cmVhbSByeCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NOVV9TVEFUX0lOREVYX0RFRl9ET1dOX0NSQzhGUkFNRVNfRFJPUFBFRCAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzLCAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY3JjLTggZXJyb3JzIGluIHRoZSB1cHN0cmVhbSByeCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NOVV9TVEFUX0lOREVYX0RFRl9ET1dOX0NSQzMyRlJBTUVTX0RST1BQRUQgICAgICAgICAgICAgICAgICAgICAgICA9IDI0LCAgICAgICAgICAgLyoqPCBDUkMgMzIgRXJyb3IgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTlVfU1RBVF9JTkRFWF9SUFJfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNSwgICAgICAgICAgIC8qKjwgUnByRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NOVV9TVEFUX0lOREVYX1NETV9ET1dOX1NZTUJPTF9DT1VOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2LCAgICAgICAgICAgLyoqPCBIb3cgbWFueSBzeW1ib2xzIGhhdmUgZ29uZSBieSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NOVV9TVEFUX0lOREVYX1NFU19ET1dOX1NZTUJPTF9DT0xMRUNURUQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI3LCAgICAgICAgICAgLyoqPCBIb3cgbWFueSBzeW1ib2xzIGhhdmUgd2UgY29sbGVjdGVkIHN0YXRzIG9uID8gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTlVfU1RBVF9JTkRFWF9TRVNfRE9XTl9TWU1CT0xfQklUX0VSUk9SUyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOCwgICAgICAgICAgIC8qKjwgQ291bnQgb2YgYml0IGVycm9ycyBpbiBjb2xsZWN0ZWQgc3ltYm9scy4gVXNlZCB0byB2ZXJpZnkgY29sbGVjdG9yIHdvcmtpbmcgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTlVfU1RBVF9JTkRFWF9ERk9fRE9XTl9PS19NUENQX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOSwgICAgICAgICAgIC8qKjwgRW5xdWV1ZWQgTVBDUCBmcmFtZSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NOVV9TVEFUX0lOREVYX0RGT19ET1dOX09LX09BTV9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMwLCAgICAgICAgICAgLyoqPCBFbnF1ZXVlZCBPYW0gZnJhbWUgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTlVfU1RBVF9JTkRFWF9ERk9fRE9XTl9PS19EQVRBX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMSwgICAgICAgICAgIC8qKjwgRW5xdWV1ZWQgZGF0YSBmcmFtZSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NOVV9TVEFUX0lOREVYX0RGT19ET1dOX0RST1BQRURfTVBDUF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICA9IDMyLCAgICAgICAgICAgLyoqPCBPdmVycnVuIE1QQ1AgZmlmbyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NOVV9TVEFUX0lOREVYX0RGT19ET1dOX0RST1BQRURfT0FNX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICA9IDMzLCAgICAgICAgICAgLyoqPCBPdmVycnVuIE9hbSBmaWZvICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ05VX1NUQVRfSU5ERVhfREZPX0RPV05fRFJPUFBFRF9EQVRBX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgID0gMzQsICAgICAgICAgICAvKio8IE92ZXJydW4gZGF0YSBmaWZvICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ05VX1NUQVRfSU5ERVhfRlJBX0dSQU5UX0RST1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzUsICAgICAgICAgICAvKio8IDxTdGF0SW5mbyBJc01pcnJvcj0iRmFsc2UiIElzUmF0ZT0iRmFsc2UiPiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX0NOVV9TVEFUX0lOREVYX0ZSQV9QS1RfRFJPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM2LCAgICAgICAgICAgLyoqPCA8U3RhdEluZm8gSXNNaXJyb3I9IkZhbHNlIiBJc1JhdGU9IkZhbHNlIj4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19DTlVfU1RBVF9JTkRFWF9VRk9fVVBfRFJPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNywgICAgICAgICAgIC8qKjwgPFN0YXRJbmZvIElzTWlycm9yPSJGYWxzZSIgSXNSYXRlPSJGYWxzZSI+ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfQ05VX1NUQVRfSU5ERVhfVUZPX1VQX0ZSQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzggICAgICAgICAgICAvKio8IDxTdGF0SW5mbyBJc01pcnJvcj0iRmFsc2UiIElzUmF0ZT0iRmFsc2UiPiAqLworfSBiY21vbHRfZXBvbl9vYW1fZXBvY19jbnVfc3RhdF9pbmRleDsKKworLyoqIEVQT0MgU0RNIDI1MCBTdGF0IEluZGV4LiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9lcG9jX3NkbTI1MHN0YXRfaW5kZXgKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19TRE0yNTBTVEFUX0lOREVYX1NMSURFX0RJRkZfQ05UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgU2xpZGVEaWZmQ250LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX1NETTI1MFNUQVRfSU5ERVhfREFDX0NMSVBfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBEYWNDbGlwSS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19TRE0yNTBTVEFUX0lOREVYX0RBQ19DTElQX1EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgRGFjQ2xpcFEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfU0RNMjUwU1RBVF9JTkRFWF9EMkFfQ0xLX0VSUl9BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IEQyYUNsa0VyckEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfU0RNMjUwU1RBVF9JTkRFWF9EMkFfQ0xLX0VSUl9CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IEQyYUNsa0VyckIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfU0RNMjUwU1RBVF9JTkRFWF9SWF9ERU1fU1lOQ19ERVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgICAvKio8IEluY3JlbWVudHMgd2hlbiB0aGUgU0RNIHNlZXMgYSBzeW5jIHB1bHNlICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfU0RNMjUwU1RBVF9JTkRFWF9SWF9ERU1fTk9UNFNZTkNfREVUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgICAvKio8IEluY3JlbWVudHMgd2hlbiB0aGUgU0RNIHNlZXMgYSBzeW5jLCBidXQgaXQgaXMgbm90IGZvbGxvd2VkIGJ5IDQgb3RoZXIgc3luY3Mgd2l0aGluIDMyIHVzICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfU0RNMjUwU1RBVF9JTkRFWF9KQ1BMTF9VTkxPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgICAgICAgICAvKio8IFRoZSBKQyBQTEwgbG9jayBzaWduYWwgdHJhbnNpdGlvbmVkIGZyb20gaGlnaCB0byBsb3cgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19TRE0yNTBTVEFUX0lOREVYX1JGUExMX1VOTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAgICAgICAgIC8qKjwgVGhlIFJGIFBMTCBsb2NrIHNpZ25hbCB0cmFuc2l0aW9uZWQgZnJvbSBoaWdoIHRvIGxvdyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX1NETTI1MFNUQVRfSU5ERVhfU0RNX1JYX0JVUlNUX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgICAgICAgICAgLyoqPCBUaGUgUkYgUExMIGxvY2sgc2lnbmFsIHRyYW5zaXRpb25lZCBmcm9tIGhpZ2ggdG8gbG93ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfU0RNMjUwU1RBVF9JTkRFWF9TRE1fVFhfQlVSU1RfRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgICAgICAgICAvKio8IFRoZSBSRiBQTEwgbG9jayBzaWduYWwgdHJhbnNpdGlvbmVkIGZyb20gaGlnaCB0byBsb3cgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19TRE0yNTBTVEFUX0lOREVYX0EyRF9NSU5fUEVBSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAgICAgICAgIC8qKjwgPFN0YXRJbmZvPiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX1NETTI1MFNUQVRfSU5ERVhfQTJEX01BWF9QRUFLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyLCAgICAgICAgICAgLyoqPCA8U3RhdEluZm8+ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfU0RNMjUwU1RBVF9JTkRFWF9EMkFfSU1BWF9QRUFLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMsICAgICAgICAgICAvKio8IDxTdGF0SW5mbz4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19TRE0yNTBTVEFUX0lOREVYX0QyQV9JTUlOX1BFQUsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNCwgICAgICAgICAgIC8qKjwgPFN0YXRJbmZvPiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX1NETTI1MFNUQVRfSU5ERVhfRDJBX1FNQVhfUEVBSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1LCAgICAgICAgICAgLyoqPCA8U3RhdEluZm8+ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfU0RNMjUwU1RBVF9JTkRFWF9EMkFfUU1JTl9QRUFLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYsICAgICAgICAgICAvKio8IDxTdGF0SW5mbz4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19TRE0yNTBTVEFUX0lOREVYX1FFU19ET1dOX1NZTUJPTF9DT0xMRUNURUQgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNywgICAgICAgICAgIC8qKjwgSG93IG1hbnkgc3ltYm9scyBoYXZlIHdlIGNvbGxlY3RlZCBzdGF0cyBvbiA/ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfU0RNMjUwU1RBVF9JTkRFWF9NSUZfVFhfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgsICAgICAgICAgICAvKio8IDxTdGF0SW5mbz4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19TRE0yNTBTVEFUX0lOREVYX01JRl9SWF9TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOSwgICAgICAgICAgIC8qKjwgPFN0YXRJbmZvPiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX1NETTI1MFNUQVRfSU5ERVhfTUlGX0JVUlNUX1RZUEVfTk9STUFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwLCAgICAgICAgICAgLyoqPCA8U3RhdEluZm8+ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfU0RNMjUwU1RBVF9JTkRFWF9NSUZfQlVSU1RfVFlQRV9ESVNDT1ZFUlkgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjEsICAgICAgICAgICAvKio8IDxTdGF0SW5mbz4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19TRE0yNTBTVEFUX0lOREVYX01JRl9CVVJTVF9UWVBFX1RVTklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMiwgICAgICAgICAgIC8qKjwgPFN0YXRJbmZvPiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX1NETTI1MFNUQVRfSU5ERVhfTUlGX0JVUlNUX1RZUEVfUkVTRVJWRUQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzLCAgICAgICAgICAgLyoqPCA8U3RhdEluZm8+ICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfU0RNMjUwU1RBVF9JTkRFWF9NSUZfQlVSU1RfTEVOR1RIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjQsICAgICAgICAgICAvKio8IDxTdGF0SW5mbz4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRVBPQ19TRE0yNTBTVEFUX0lOREVYX1NMSURFX0xPU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNSwgICAgICAgICAgIC8qKjwgU2xpZGUgd2FzIGdvb2QsIGJ1dCB0aGVuIHByZWFtYmxlIGJhZCBoYXBwZW5lZCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX1NETTI1MFNUQVRfSU5ERVhfU0xJREVfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2LCAgICAgICAgICAgLyoqPCBXaGlsZSB3YWl0aW5nIGZvciBzeW5jcyBvbiB0aGUgbmV4dCBTRiwgZGlkbid0IHNlZSB0aGVtICovCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfU0RNMjUwU1RBVF9JTkRFWF9TTElERV9TVEVBRFlfRkFJTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjcsICAgICAgICAgICAvKio8IHdhc24ndCBhYmxlIHRvIGdldCByeCBzbGlkZSBnb29kIGluIHJ4IHNsaWRlIHdhaXQgdGltZSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX1NETTI1MFNUQVRfSU5ERVhfU0xJREVfU1lOQ19XQUlUX0ZBSUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI4ICAgICAgICAgICAgLyoqPCBXaGVuIHdhaXRpbmcgZm9yIHRoZSBuZXh0IHN5bmMgcHVsc2UgKHdpdGhpbiBhIGZldyBzeW1ib2xzKSB3ZSBkaWRuJ3Qgc2VlIGl0LiAqLworfSBiY21vbHRfZXBvbl9vYW1fZXBvY19zZG0yNTBzdGF0X2luZGV4OworCisvKiogRVBPQyBTdGF0IEdhdGhlciBNb2Rlcy4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZXBvY19zdGF0X2dhdGhlcl9tb2RlcworeworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX1NUQVRfR0FUSEVSX01PREVTX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fT0FNX0VQT0NfU1RBVF9HQVRIRVJfTU9ERVNfR0VUX0NPVU5URVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAxLCAgICAgICAvKio8IEdldCBDb3VudGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX1NUQVRfR0FUSEVSX01PREVTX0NMRUFSX0NPVU5URVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMiwgICAgICAgLyoqPCBDbGVhciBDb3VudGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9FUE9DX1NUQVRfR0FUSEVSX01PREVTX0dFVF9SQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwNCAgICAgICAgLyoqPCBHZXQgUmF0ZS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Vwb2Nfc3RhdF9nYXRoZXJfbW9kZXM7CisKKy8qKiBQcm90b2NvbCBUeXBlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9wcm90b2NvbF90eXBlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfWkVSTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IFplcm8uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfSVBWNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA0OCwgICAgICAgICAvKio8IElQdjQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfQVJQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA1NCwgICAgICAgICAvKio8IEFSUC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9DVkxBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMzAyNFUsICAgICAgIC8qKjwgQy1WTEFOLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX0lQVjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM0NTI1VSwgICAgICAgLyoqPCBJUHY2LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX01QQ1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM0ODI0VSwgICAgICAgLyoqPCBNUENQLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX1NMT1dfUFJPVE9DT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM0ODI1VSwgICAgICAgLyoqPCBTbG93IFByb3RvY29sLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX1NWTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM0OTg0VSwgICAgICAgLyoqPCBTLVZMQU4uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfRUFQT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzQ5NThVLCAgICAgICAvKio8IEVBUE9MLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX0lUQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM1MDQ3VSwgICAgICAgLyoqPCBJLVRhZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9MT09QQkFDSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNjg2NFUgICAgICAgIC8qKjwgTG9vcGJhY2suICovCit9IGJjbW9sdF9lcG9uX29hbV9wcm90b2NvbF90eXBlOworCisvKiogU2xvdyBQcm90b2NvbCBTdWJ0eXBlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9zbG93X3Byb3RvY29sX3N1YnR5cGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fU0xPV19QUk9UT0NPTF9TVUJUWVBFX0xBQ1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgTEFDUC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU0xPV19QUk9UT0NPTF9TVUJUWVBFX0xBTVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgTEFNUC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU0xPV19QUk9UT0NPTF9TVUJUWVBFX09BTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgT0FNLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TTE9XX1BST1RPQ09MX1NVQlRZUEVfT1JHQU5JWkFUSU9OX1NQRUNJRklDICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwICAgICAgICAgICAgLyoqPCBPcmdhbml6YXRpb24gU3BlY2lmaWMuICovCit9IGJjbW9sdF9lcG9uX29hbV9zbG93X3Byb3RvY29sX3N1YnR5cGU7CisKKy8qKiBPQU0gRmxhZ3MuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX29hbV9mbGFncworeworICAgIEJDTU9MVF9FUE9OX09BTV9PQU1fRkxBR1NfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fT0FNX09BTV9GTEFHU19MSU5LX0ZBVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAxLCAgICAgICAvKio8IExpbmsgRmF1bHQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09BTV9GTEFHU19EWUlOR19HQVNQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAyLCAgICAgICAvKio8IER5aW5nIEdhc3AuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09BTV9GTEFHU19DUklUSUNBTF9FVkVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDA0LCAgICAgICAvKio8IENyaXRpY2FsIEV2ZW50LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PQU1fRkxBR1NfTE9DQUxfRVZBTFVBVElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwOCwgICAgICAgLyoqPCBMb2NhbCBFdmFsdWF0aW5nLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PQU1fRkxBR1NfTE9DQUxfU1RBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAxMCwgICAgICAgLyoqPCBMb2NhbCBTdGFibGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09BTV9GTEFHU19SRU1PVEVfRVZBTFVBVElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDIwLCAgICAgICAvKio8IFJlbW90ZSBFdmFsdWF0aW5nLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PQU1fRkxBR1NfUkVNT1RFX1NUQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDA0MCAgICAgICAgLyoqPCBSZW1vdGUgU3RhYmxlLiAqLworfSBiY21vbHRfZXBvbl9vYW1fb2FtX2ZsYWdzOworCisvKiogT0FNIE9wY29kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fb2FtX29wY29kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX0lORk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBJbmZvcm1hdGlvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9FVkVOVF9OT1RJRklDQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgRXZlbnQgTm90aWZpY2F0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX1ZBUl9SRVFVRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBWYXJpYWJsZSBSZXF1ZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX1ZBUl9SRVNQT05TRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBWYXJpYWJsZSBSZXNwb25zZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9MT09QQkFDS19DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgTG9vcGJhY2sgQ29udHJvbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9PUkdBTklaQVRJT05fU1BFQ0lGSUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTQgICAgICAgICAgIC8qKjwgT3JnYW5pemF0aW9uIFNwZWNpZmljLiAqLworfSBiY21vbHRfZXBvbl9vYW1fb2FtX29wY29kZTsKKworLyoqIEluZm9ybWF0aW9uIFRMViBUeXBlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl90eXBlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0lORk9fVExWX1RZUEVfRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IEVuZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fSU5GT19UTFZfVFlQRV9MT0NBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgTG9jYWwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0lORk9fVExWX1RZUEVfUkVNT1RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IFJlbW90ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fSU5GT19UTFZfVFlQRV9PUkdBTklaQVRJT05fU1BFQ0lGSUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTQgICAgICAgICAgIC8qKjwgT3JnYW5pemF0aW9uIFNwZWNpZmljLiAqLworfSBiY21vbHRfZXBvbl9vYW1faW5mb190bHZfdHlwZTsKKworLyoqIFRlayBJbmZvIFRMViBUeXBlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHZfdHlwZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfSU5GT19UTFZfVFlQRV9MSU5LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBMaW5rLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfSU5GT19UTFZfVFlQRV9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBLZXkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19JTkZPX1RMVl9UWVBFX0FMQVJNX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IEFsYXJtIFJlcXVlc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19JTkZPX1RMVl9UWVBFX0VYVEVOU0lPTl9TVVBQT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgICAgICAvKio8IEV4dGVuc2lvbiBTdXBwb3J0LiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX2luZm9fdGx2X3R5cGU7CisKKy8qKiBUZWsgUmVwb3J0IE1vZGVzLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV90ZWtfcmVwb3J0X21vZGVzCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19SRVBPUlRfTU9ERVNfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX1JFUE9SVF9NT0RFU19TSU1QTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAsICAgICAgIC8qKjwgVXAgdG8gNCBxdWV1ZSBzZXRzLCAxIHByaW9yaXR5IHZhbHVlICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19SRVBPUlRfTU9ERVNfVEVLTk9WVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAxLCAgICAgICAvKio8IFVwIHRvIDQgcXVldWUgc2V0cywgMSBwcmlvcml0eSB2YWx1ZSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfUkVQT1JUX01PREVTX0NUQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMiwgICAgICAgLyoqPCAxIHF1ZXVlIHNldCwgOCBwcmlvcml0eSB2YWx1ZXMgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX1JFUE9SVF9NT0RFU19OVFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDQsICAgICAgIC8qKjwgTlRUICgyIHF1ZXVlIHNldHMsIHJldmVyc2VkLCBzdWJ0cmFjdCBncmFudGVkIGRhdGEpICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19SRVBPUlRfTU9ERVNfTUFOVUFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDA4LCAgICAgICAvKio8IEFzIHNwZWNpZmllZCBpbiBPTlUgcGVyc29uYWxpdHkgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX1JFUE9SVF9NT0RFU19URE1fTk9fRk9SQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMTAgICAgICAgIC8qKjwgVERNIE5vIEZvcmNlLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX3JlcG9ydF9tb2RlczsKKworLyoqIExvY2FsL1JlbW90ZSBJbmZvIFN0YXRlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mb19zdGF0ZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9MT0NBTF9SRU1PVEVfSU5GT19TVEFURV9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fT0FNX0xPQ0FMX1JFTU9URV9JTkZPX1NUQVRFX1BBUlNFUl9BQ1RJT04wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAxLCAgICAgICAvKio8IFBhcnNlciBBY3Rpb24gMC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fTE9DQUxfUkVNT1RFX0lORk9fU1RBVEVfUEFSU0VSX0FDVElPTjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDIsICAgICAgIC8qKjwgUGFyc2VyIEFjdGlvbiAxLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9MT0NBTF9SRU1PVEVfSU5GT19TVEFURV9NVUxUSVBMRVhFUl9BQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwNCAgICAgICAgLyoqPCBNdWx0aXBsZXhlciBBY3Rpb24uICovCit9IGJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mb19zdGF0ZTsKKworLyoqIExvY2FsL1JlbW90ZSBJbmZvIENvbmZpZy4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm9fY29uZmlnCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0xPQ0FMX1JFTU9URV9JTkZPX0NPTkZJR19OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9PQU1fTE9DQUxfUkVNT1RFX0lORk9fQ09ORklHX09BTV9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDEsICAgICAgIC8qKjwgT0FNIE1vZGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0xPQ0FMX1JFTU9URV9JTkZPX0NPTkZJR19VTklESVJFQ1RJT05BTF9TVVBQT1JUICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAyLCAgICAgICAvKio8IFVuaWRpcmVjdGlvbmFsIFN1cHBvcnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0xPQ0FMX1JFTU9URV9JTkZPX0NPTkZJR19PQU1fUkVNT1RFX0xPT1BCQUNLX1NVUFBPUlQgICAgICAgICAgICAgICAgICAgID0gMHgwMDA0LCAgICAgICAvKio8IE9BTSBSZW1vdGUgTG9vcGJhY2sgU3VwcG9ydC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fTE9DQUxfUkVNT1RFX0lORk9fQ09ORklHX0xJTktfRVZFTlRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDgsICAgICAgIC8qKjwgTGluayBFdmVudHMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0xPQ0FMX1JFTU9URV9JTkZPX0NPTkZJR19WQVJJQUJMRV9SRVRSSUVWQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDEwICAgICAgICAvKio8IFZhcmlhYmxlIFJldHJpZXZhbC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvX2NvbmZpZzsKKworLyoqIExpbmsgRXZlbnQgVHlwZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90eXBlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0xJTktfRVZFTlRfVFlQRV9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IEVuZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fTElOS19FVkVOVF9UWVBFX0VSUk9SRURfU1lNQk9MX1BFUklPRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgRXJyb3JlZCBTeW1ib2wgUGVyaW9kLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9MSU5LX0VWRU5UX1RZUEVfRVJST1JFRF9GUkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBFcnJvcmVkIEZyYW1lLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9MSU5LX0VWRU5UX1RZUEVfRVJST1JFRF9GUkFNRV9QRVJJT0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBFcnJvcmVkIEZyYW1lIFBlcmlvZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fTElOS19FVkVOVF9UWVBFX0VSUk9SRURfRlJBTUVfU0VDT05EU19TVU1NQVJZICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgRXJyb3JlZCBGcmFtZSBTZWNvbmRzIFN1bW1hcnkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0xJTktfRVZFTlRfVFlQRV9PUkdBTklaQVRJT05fU1BFQ0lGSUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjU0ICAgICAgICAgICAvKio8IE9yZ2FuaXphdGlvbiBTcGVjaWZpYy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdHlwZTsKKworLyoqIFRlayBBbGFybSBDb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MSU5LX0ZBVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2LCAgICAgICAgICAgLyoqPCBMaW5rIEZhdWx0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MT1NTX09GX1NJR05BTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3LCAgICAgICAgICAgLyoqPCBMb3NzIG9mIFNpZ25hbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfVFhfRkFJTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOCwgICAgICAgICAgIC8qKjwgVHggRmFpbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfVFJBTlNNSVRfREVHUkFERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOSwgICAgICAgICAgIC8qKjwgVHJhbnNtaXQgRGVncmFkZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUVVFVUVfT1ZFUkZMT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMCwgICAgICAgICAgIC8qKjwgUXVldWUgT3ZlcmZsb3cuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0xFQVJOX1RBQkxFX09WRVJGTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjEsICAgICAgICAgICAvKio8IExlYXJuIFRhYmxlIE92ZXJmbG93LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9GTE9XX0NPTlRST0xfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIyLCAgICAgICAgICAgLyoqPCBGbG93IENvbnRyb2wgVGltZW91dC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUkVQT1JUX0ZBSUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMywgICAgICAgICAgIC8qKjwgUmVwb3J0IEZhaWwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0dBVEVfVElNRU9VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjQsICAgICAgICAgICAvKio8IEdhdGUgVGltZW91dC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfT0FNX1RJTUVPVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNSwgICAgICAgICAgIC8qKjwgT0FNIFRpbWVvdXQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0tFWV9FWENIQU5HRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjYsICAgICAgICAgICAvKio8IEtleSBFeGNoYW5nZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfQVVUT19ORUdfRkFJTFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNywgICAgICAgICAgIC8qKjwgQXV0byBOZWcgRmFpbHVyZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfR1BJT19MSU5LX0ZBVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOCwgICAgICAgICAgIC8qKjwgR3BpbyBMaW5rIEZhdWx0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MT09QQkFDSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyLCAgICAgICAgICAgLyoqPCBMb29wYmFjay4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9SVF9ESVNBQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMywgICAgICAgICAgIC8qKjwgUG9ydCBEaXNhYmxlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfRFlJTkdfR0FTUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NCwgICAgICAgICAgIC8qKjwgRHlpbmcgR2FzcC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NSwgICAgICAgICAgIC8qKjwgUG93ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0dQSU9fRFlJTkdfR0FTUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjYsICAgICAgICAgICAvKio8IEdwaW8gRHlpbmcgR2FzcC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfQ1JJVElDQUxfRVZFTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5NiwgICAgICAgICAgIC8qKjwgQ3JpdGljYWwgRXZlbnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOTcsICAgICAgICAgICAvKio8IFJlZ2lzdGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9HUElPX0NSSVRJQ0FMX0VWRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDk4LCAgICAgICAgICAgLyoqPCBHcGlvIENyaXRpY2FsIEV2ZW50LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9TWVNURU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyOCwgICAgICAgICAgLyoqPCBTeXN0ZW0uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1RFTVBFUkFUVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTI5LCAgICAgICAgICAvKio8IFRlbXBlcmF0dXJlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9HUElPX09USEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzMCwgICAgICAgICAgLyoqPCBHcGlvIE90aGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9BVVRIX1VOQVZBSUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzMSwgICAgICAgICAgLyoqPCBBdXRoIFVuYXZhaWwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1NUQVRfQUxBUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTM0LCAgICAgICAgICAvKio8IFN0YXQgQWxhcm0uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0ZMQVNIX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTM1LCAgICAgICAgICAvKio8IEZsYXNoIEJ1c3kuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1NUQU5EQllfTE9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTM2LCAgICAgICAgICAvKio8IFN0YW5kYnkgTG9zLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QUk9UX1NXSVRDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzNywgICAgICAgICAgLyoqPCBQcm90IFN3aXRjaC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfQ1RDX0FMQVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNDQsICAgICAgICAgIC8qKjwgQ3RjIEFsYXJtLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MSU5LX09BTV9ESVNDX0NPTVBMRVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0NSwgICAgICAgICAgLyoqPCBMaW5rIE9BTSBEaXNjIENvbXBsZXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9JUE5fTE9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0NiwgICAgICAgICAgLyoqPCBJcG4gTG9zLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9ESUFHX0xPQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0NywgICAgICAgICAgLyoqPCBEaWFnIExvYWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0JPT1RfSU5WQUxJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYwLCAgICAgICAgICAvKio8IEJvb3QgSW52YWxpZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfT05VX1JFQURZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNzYsICAgICAgICAgIC8qKjwgT05VIFJlYWR5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9PTlVfUE9OX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3NywgICAgICAgICAgLyoqPCBPTlUgUG9uIERpc2FibGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX0NUQ19ESVNDT1ZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTc4LCAgICAgICAgICAvKio8IEN0YyBEaXNjb3Zlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfTEFTRVJfQUxXQVlTX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNzksICAgICAgICAgIC8qKjwgTGFzZXIgQWx3YXlzIE9uLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9MSU5LX1JFR19TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4NCwgICAgICAgICAgLyoqPCBMaW5rIFJlZyBTdGFydC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfTElOS19SRUdfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxODUsICAgICAgICAgIC8qKjwgTGluayBSZWcgU3VjY2Vzcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfTElOS19SRUdfRkFJTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxODYsICAgICAgICAgIC8qKjwgTGluayBSZWcgRmFpbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfRkFOX0ZBVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxODksICAgICAgICAgIC8qKjwgRmFuIEZhdWx0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fVEVNUF9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5MCwgICAgICAgICAgLyoqPCBQb3dlciBNb24gVGVtcGVyYXR1cmUgSGlnaC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1RFTVBfTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOTEsICAgICAgICAgIC8qKjwgUG93ZXIgTW9uIFRlbXBlcmF0dXJlIExvdy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1ZDQ19ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOTIsICAgICAgICAgIC8qKjwgUG93ZXIgTW9uIFZjYyBIaWdoLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fVkNDX0xPVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5MywgICAgICAgICAgLyoqPCBQb3dlciBNb24gVmNjIExvdy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1RYX0JJQVNfSElHSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOTQsICAgICAgICAgIC8qKjwgUG93ZXIgTW9uIFR4IEJpYXMgSGlnaC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1RYX0JJQVNfTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOTUsICAgICAgICAgIC8qKjwgUG93ZXIgTW9uIFR4IEJpYXMgTG93LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09ERV9QT1dFUl9NT05fVFhfUE9XRVJfSElHSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5NiwgICAgICAgICAgLyoqPCBQb3dlciBNb24gVHggUG93ZXIgSGlnaC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1RYX1BPV0VSX0xPVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOTcsICAgICAgICAgIC8qKjwgUG93ZXIgTW9uIFR4IFBvd2VyIExvdy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0FMQVJNX0NPREVfUE9XRVJfTU9OX1JYX1BPV0VSX0hJR0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOTgsICAgICAgICAgIC8qKjwgUG93ZXIgTW9uIFJ4IFBvd2VyIEhpZ2guICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT0RFX1BPV0VSX01PTl9SWF9QT1dFUl9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTk5ICAgICAgICAgICAvKio8IFBvd2VyIE1vbiBSeCBQb3dlciBMb3cuICovCit9IGJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29kZTsKKworLyoqIFRlayBBbGFybSBDb250ZXh0LiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29udGV4dAoreworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQUxBUk1fQ09OVEVYVF9PTlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBPTlUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT05URVhUX1BPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IFBvcnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT05URVhUX0xJTksgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IExpbmsuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19BTEFSTV9DT05URVhUX1FVRVVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgICAgICAvKio8IFF1ZXVlLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX2FsYXJtX2NvbnRleHQ7CisKKy8qKiBWYXIgQnJhbmNoLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV92YXJfYnJhbmNoCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IEVuZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9PQkpFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgT2JqZWN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfQlJBTkNIX1BBQ0tBR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBQYWNrYWdlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfQlJBTkNIX05BTUVfQklORElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBOYW1lIEJpbmRpbmcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9CUkFOQ0hfQVRUUklCVVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgICAgICAgICAvKio8IEF0dHJpYnV0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0JSQU5DSF9BQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5ICAgICAgICAgICAgIC8qKjwgQWN0aW9uLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdmFyX2JyYW5jaDsKKworLyoqIFZhciBMZWFmIE9iamVjdC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfb2JqZWN0Cit7CisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX09CSkVDVF9NQUNfRU5USVRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IE1BQyBFbnRpdHkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX09CSkVDVF9QSFlfRU5USVRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IFBIWSBFbnRpdHkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX09CSkVDVF9NQUNfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCAgICAgICAgICAgICAvKio8IE1BQyBDdHJsLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfb2JqZWN0OworCisvKiogVmFyIExlYWYgUGFja2FnZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfcGFja2FnZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9QQUNLQUdFX0lMTEVHQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBJbGxlZ2FsLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9QQUNLQUdFX01BQ19NQU5EQVRPUlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBNQUMgTWFuZGF0b3J5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9QQUNLQUdFX01BQ19SRUNPTU1FTkRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBNQUMgUmVjb21tZW5kZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX1BBQ0tBR0VfTUFDX09QVElPTkFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IE1BQyBPcHRpb25hbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfUEFDS0FHRV9NQUNfQVJSQVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgTUFDIEFycmF5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9QQUNLQUdFX01BQ19FWENFU1NJVkVfREVGRVJSQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgLyoqPCBNQUMgRXhjZXNzaXZlIERlZmVycmFsLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9QQUNLQUdFX1BIWV9SRUNPTU1FTkRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBQSFkgUmVjb21tZW5kZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX1BBQ0tBR0VfUEhZX01VTFRJUExFX1BIWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgICAgICAgICAvKio8IFBIWSBNdWx0aXBsZSBQSFkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX1BBQ0tBR0VfUEhZMTAwTVBCU19NT05JVE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgICAgICAgICAvKio8IFBIWSAxMDAgTXBicyBNb25pdG9yLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9QQUNLQUdFX1JFUEVBVEVSX1BFUkZfTU9OSVRPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgICAgICAgICAgLyoqPCBSZXBlYXRlciBQZXJmIE1vbml0b3IuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX1BBQ0tBR0VfUE9SVF9QRVJGX01PTklUT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgICAgICAgICAvKio8IFBvcnQgUGVyZiBNb25pdG9yLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9QQUNLQUdFX1BPUlRfQUREUl9UUkFDSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExLCAgICAgICAgICAgLyoqPCBQb3J0IEFkZHIgVHJhY2suICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX1BBQ0tBR0VfTUFVX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMsICAgICAgICAgICAvKio8IE1BVSBDb250cm9sLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9QQUNLQUdFX01FRElBX0xPV19UUkFDS0lORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0LCAgICAgICAgICAgLyoqPCBNZWRpYSBMb3cgVHJhY2tpbmcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX1BBQ0tBR0VfQlJPQURCQU5EX01BVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUsICAgICAgICAgICAvKio8IEJyb2FkYmFuZCBNQVUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX1BBQ0tBR0VfTUFDX0NPTlRST0xfUkVDT01NRU5ERUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTcgICAgICAgICAgICAvKio8IE1BQyBDb250cm9sIFJlY29tbWVuZGVkLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfcGFja2FnZTsKKworLyoqIFZhciBMZWFmIE5hbWUgQmluZGluZy4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfbmFtZV9iaW5kaW5nCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX05BTUVfQklORElOR19NQUNfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IE1BQyBOYW1lLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9OQU1FX0JJTkRJTkdfTUFDX01PTklUT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBNQUMgTW9uaXRvci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfTkFNRV9CSU5ESU5HX1BIWV9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgUEhZIE5hbWUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX05BTUVfQklORElOR19QSFlfTU9OSVRPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IFBIWSBNb25pdG9yLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9OQU1FX0JJTkRJTkdfTUFDX0NUUkxfU1lTVEVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4LCAgICAgICAgICAgLyoqPCBNQUMgQ3RybCBTeXN0ZW0uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX05BTUVfQklORElOR19NQUNfQ1RSTF9NT05JVE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUsICAgICAgICAgICAvKio8IE1BQyBDdHJsIE1vbml0b3IuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX05BTUVfQklORElOR19SRVBFQVRFUl9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgICAvKio8IFJlcGVhdGVyIE5hbWUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX05BTUVfQklORElOR19SRVBFQVRFUl9NT05JVE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgICAvKio8IFJlcGVhdGVyIE1vbml0b3IuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX05BTUVfQklORElOR19HUk9VUF9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgICAgICAgICAvKio8IEdyb3VwIE5hbWUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX05BTUVfQklORElOR19QT1JUX05BTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgICAgICAgICAvKio8IFBvcnQgTmFtZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVkFSX0xFQUZfTkFNRV9CSU5ESU5HX01BVV9SUFRfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5LCAgICAgICAgICAgIC8qKjwgTUFVIFJlcG9ydCBOYW1lLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9OQU1FX0JJTkRJTkdfTUFVX0RURV9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgICAgICAgICAgLyoqPCBNQVUgRFRFIE5hbWUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1ZBUl9MRUFGX05BTUVfQklORElOR19SU1JDX01BQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIsICAgICAgICAgICAvKio8IFJTUkMgTUFDLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9OQU1FX0JJTkRJTkdfUlNSQ19SRVBFQVRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgICAgICAgICAgLyoqPCBSU1JDIFJlcGVhdGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9WQVJfTEVBRl9OQU1FX0JJTkRJTkdfUlNSQ19NQVUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0ICAgICAgICAgICAgLyoqPCBSU1JDIE1BVS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX25hbWVfYmluZGluZzsKKworLyoqIFJlbW90ZSBMb29wYmFjayBDb21tYW5kLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9yZW1vdGVfbG9vcGJhY2tfY29tbWFuZAoreworICAgIEJDTU9MVF9FUE9OX09BTV9SRU1PVEVfTE9PUEJBQ0tfQ09NTUFORF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBFbmFibGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JFTU9URV9MT09QQkFDS19DT01NQU5EX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAvKio8IERpc2FibGUuICovCit9IGJjbW9sdF9lcG9uX29hbV9yZW1vdGVfbG9vcGJhY2tfY29tbWFuZDsKKworLyoqIFRlayBPcGNvZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3Rla19vcGNvZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JTkZPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgSW5mby4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9HRVRfUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgR2V0IFJlcXVlc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfR0VUX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IEdldCBSZXNwb25zZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9TRVRfUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgU2V0IFJlcXVlc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfU0VUX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IFNldCBSZXNwb25zZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9NVUxUSUNBU1RfUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgTXVsdGljYXN0IFJlcXVlc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfTVVMVElDQVNUX1JFR0lTVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgICAvKio8IE11bHRpY2FzdCBSZWdpc3Rlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9NVUxUSUNBU1RfUkVHSVNURVJfUkVTUE9OU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAgICAgICAgIC8qKjwgTXVsdGljYXN0IFJlZ2lzdGVyIFJlc3BvbnNlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0tFWV9FWENIQU5HRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgICAgICAgICAgLyoqPCBLZXkgRXhjaGFuZ2UuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfRklMRV9SRUFEX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgICAgICAgICAvKio8IEZpbGUgUmVhZCBSZXF1ZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0ZJTEVfV1JJVEVfUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgICAgICAgICAgLyoqPCBGaWxlIFdyaXRlIFJlcXVlc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfRklMRV9EQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEsICAgICAgICAgICAvKio8IEZpbGUgRGF0YS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9GSUxFX0FDSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMiwgICAgICAgICAgIC8qKjwgRmlsZSBBY2suICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfSTJDX0JTQ19SRUFEX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMsICAgICAgICAgICAvKio8IEnCskMgKEJTQykgUmVhZCBSZXF1ZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT1BDT0RFX0kyQ19CU0NfUkVBRF9SRVNQT05TRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0LCAgICAgICAgICAgLyoqPCBJwrJDIChCU0MpIFJlYWQgUmVzcG9uc2UuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfSTJDX0JTQ19XUklURV9SRVFVRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUsICAgICAgICAgICAvKio8IEnCskMgKEJTQykgV3JpdGUgUmVxdWVzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9JMkNfQlNDX1dSSVRFX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNiwgICAgICAgICAgIC8qKjwgScKyQyAoQlNDKSBXcml0ZSBSZXNwb25zZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09QQ09ERV9VTkFDS0VEX0FDVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNywgICAgICAgICAgIC8qKjwgVW5BY2tlZCBBY3Rpb24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PUENPREVfTE9PUF9ERVRFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTggICAgICAgICAgICAvKio8IExvb3AgRGV0ZWN0LiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX29wY29kZTsKKworLyoqIFRlayBCcmFuY2guIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3Rla19icmFuY2gKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgRW5kLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX09CSkVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBPYmplY3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfUEFDS0FHRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IFBhY2thZ2UuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19CUkFOQ0hfTkFNRV9CSU5ESU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgICAvKio8IE5hbWUgQmluZGluZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0JSQU5DSF9BVFRSSUJVVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAgICAgICAgIC8qKjwgQXR0cmlidXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfQlJBTkNIX0FDVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDkgICAgICAgICAgICAgLyoqPCBBY3Rpb24uICovCit9IGJjbW9sdF9lcG9uX29hbV90ZWtfYnJhbmNoOworCisvKiogVGVrIE9iamVjdCBUeXBlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X3R5cGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX0xPR0lDQUxfTElOSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgTG9naWNhbCBMaW5rLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfUVVFVUVfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBRdWV1ZSBOYW1lLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBQb3J0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfQUxMX1FVRVVFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBBbGwgUXVldWVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfTkVUV09SS19QT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgLyoqPCBOZXR3b3JrIFBPTi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09CSkVDVF9UWVBFX1VTRVJfUE9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAgICAgICAgIC8qKjwgVXNlciBQT04uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PQkpFQ1RfVFlQRV9GTE9XX0RJUkVDVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgICAgICAgICAvKio8IEZsb3cgRGlyZWN0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT0JKRUNUX1RZUEVfQlJJREdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzMCwgICAgICAgICAgLyoqPCBCcmlkZ2UuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PQkpFQ1RfVFlQRV9CUklER0VfUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMxICAgICAgICAgICAvKio8IEJyaWRnZSBQb3J0LiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF90eXBlOworCisvKiogRmxvdyBEaXJlY3Rpb24uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2Zsb3dfZGlyZWN0aW9uCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0ZMT1dfRElSRUNUSU9OX0lOR1JFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IEluZ3Jlc3MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0ZMT1dfRElSRUNUSU9OX0VHUkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IEVncmVzcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRkxPV19ESVJFQ1RJT05fVVBTVFJFQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgVXBzdHJlYW0uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0ZMT1dfRElSRUNUSU9OX0RPV05TVFJFQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IERvd25zdHJlYW0uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0ZMT1dfRElSRUNUSU9OX0VHUkVTU19MT0NBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCAgICAgICAgICAgICAvKio8IEVncmVzcyBMb2NhbC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Zsb3dfZGlyZWN0aW9uOworCisvKiogVGVrIExlYWYgQXR0cmlidXRlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hdHRyaWJ1dGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xVRV9GSUVMRF9TRUxFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMjc0NiwgICAgICAgIC8qKjwgTFVFIEZpZWxkIFNlbGVjdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgU3RkIE1BQyBJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVTX1RYX09LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgU3RkIE1BQyBGcmFtZXMgVHggT2suICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX1NJTkdMRV9DT0xMX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IFN0ZCBNQUMgU2luZ2xlIENvbGwgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19NVUxUSVBMRV9DT0xMX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBTdGQgTUFDIE11bHRpcGxlIENvbGwgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRVNfUlhfT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgLyoqPCBTdGQgTUFDIEZyYW1lcyBSeCBPay4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRkNTX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAgICAgICAgIC8qKjwgU3RkIE1BQyBGQ1MgRXJyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19BTElHTl9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAgICAgLyoqPCBTdGQgTUFDIEFsaWduIEVyci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfT0NURVRTX1RYX09LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAgICAgICAgIC8qKjwgU3RkIE1BQyBPY3RldHMgVHggT2suICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0ZSQU1FU19ERUZFUlJFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgICAgICAgICAvKio8IFN0ZCBNQUMgRnJhbWVzIERlZmVycmVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19MQVRFX0NPTExJU0lPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgICAgICAgICAgLyoqPCBTdGQgTUFDIExhdGUgQ29sbGlzaW9ucy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRVhDRVNTSVZFX0NPTExJU0lPTlMgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAgICAgICAgIC8qKjwgU3RkIE1BQyBFeGNlc3NpdmUgQ29sbGlzaW9ucy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVTX0xPU1RfTUFDX1RYX0VSUiAgICAgICAgICAgICAgICAgICAgICAgPSAxMiwgICAgICAgICAgIC8qKjwgU3RkIE1BQyBGcmFtZXMgTG9zdCBNQUMgVHggRXJyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DQVJSSUVSX1NFTlNFX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgICAgICAgICAgLyoqPCBTdGQgTUFDIENhcnJpZXIgU2Vuc2UgRXJyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19PQ1RFVFNfUlhfT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0LCAgICAgICAgICAgLyoqPCBTdGQgTUFDIE9jdGV0cyBSeCBPay4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJBTUVTX0xPU1RfTUFDX1JYX0VSUiAgICAgICAgICAgICAgICAgICAgICAgPSAxNSwgICAgICAgICAgIC8qKjwgU3RkIE1BQyBGcmFtZXMgTG9zdCBNQUMgUnggRXJyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19QUk9NSVNDVU9VU19TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2LCAgICAgICAgICAgLyoqPCBTdGQgTUFDIFByb21pc2N1b3VzIFN0YXR1cy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfTUNBU1RfQUREUl9MSVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNywgICAgICAgICAgIC8qKjwgU3RkIE1BQyBNY2FzdCBBZGRyIExpc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX01DQVNUX0ZSQU1FU19UWF9PSyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgsICAgICAgICAgICAvKio8IFN0ZCBNQUMgTWNhc3QgRnJhbWVzIFR4IE9rLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19CQ0FTVF9GUkFNRVNfVFhfT0sgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5LCAgICAgICAgICAgLyoqPCBTdGQgTUFDIEJjYXN0IEZyYW1lcyBUeCBPay4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfRlJfRVhDRVNTSVZFX0RFRkVSUkFMICAgICAgICAgICAgICAgICAgICAgICAgPSAyMCwgICAgICAgICAgIC8qKjwgU3RkIE1BQyBGciBFeGNlc3NpdmUgRGVmZXJyYWwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX01DQVNUX0ZSQU1FU19SWF9PSyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjEsICAgICAgICAgICAvKio8IFN0ZCBNQUMgTWNhc3QgRnJhbWVzIFJ4IE9rLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19CQ0FTVF9GUkFNRVNfUlhfT0sgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIyLCAgICAgICAgICAgLyoqPCBTdGQgTUFDIEJjYXN0IEZyYW1lcyBSeCBPay4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfSU5fUkFOR0VfTEVOX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMywgICAgICAgICAgIC8qKjwgU3RkIE1BQyBJbiBSYW5nZSBMZW4gRXJyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19PVVRfT0ZfUkFOR0VfTEVOX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0LCAgICAgICAgICAgLyoqPCBTdGQgTUFDIE91dCBPZiBSYW5nZSBMZW4gRXJyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19GUkFNRV9UT09fTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1LCAgICAgICAgICAgLyoqPCBTdGQgTUFDIEZyYW1lIFRvbyBMb25nLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19FTkFCTEVfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2LCAgICAgICAgICAgLyoqPCBTdGQgTUFDIEVuYWJsZSBTdGF0dXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX1RYX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjcsICAgICAgICAgICAvKio8IFN0ZCBNQUMgVHggRW5hYmxlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19NQ0FTVF9SWF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI4LCAgICAgICAgICAgLyoqPCBTdGQgTUFDIE1jYXN0IFJ4IFN0YXR1cy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQUREUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOSwgICAgICAgICAgIC8qKjwgU3RkIE1BQyBBZGRyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DT0xMSVNJT05fRlJBTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMwLCAgICAgICAgICAgLyoqPCBTdGQgTUFDIENvbGxpc2lvbiBGcmFtZXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfUEhZX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzIsICAgICAgICAgICAvKio8IFN0ZCBQSFkgVHlwZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9QSFlfVFlQRV9MSVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMywgICAgICAgICAgIC8qKjwgU3RkIFBIWSBUeXBlIExpc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfUEhZX1NZTUJPTF9FUlJfRFVSSU5HX0NBUlJJRVIgICAgICAgICAgICAgICAgICAgID0gMzUsICAgICAgICAgICAvKio8IFN0ZCBQSFkgU3ltYm9sIEVyciBEdXJpbmcgQ2Fycmllci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9QSFlfQURNSU5fU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNywgICAgICAgICAgIC8qKjwgU3RkIFBIWSBBZG1pbiBTdGF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQVVfTUVESUFfQVZBSUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3MSwgICAgICAgICAgIC8qKjwgU3RkIE1BVSBNZWRpYSBBdmFpbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3OCwgICAgICAgICAgIC8qKjwgU3RkIEF1dG8gTmVnIElELiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0FETUlOX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDc5LCAgICAgICAgICAgLyoqPCBTdGQgQXV0byBOZWcgQWRtaW4gU3RhdGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfUkVNT1RFX1NJRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gODAsICAgICAgICAgICAvKio8IFN0ZCBBdXRvIE5lZyBSZW1vdGUgU2lnLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0FVVE9fQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgxLCAgICAgICAgICAgLyoqPCBTdGQgQXV0byBOZWcgQXV0byBDZmcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfTE9DQUxfVEVDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gODIsICAgICAgICAgICAvKio8IFN0ZCBBdXRvIE5lZyBMb2NhbCBUZWNoLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX0FEX1RFQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgzLCAgICAgICAgICAgLyoqPCBTdGQgQXV0byBOZWcgQWQgVGVjaC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19SWF9URUNIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4NCwgICAgICAgICAgIC8qKjwgU3RkIEF1dG8gTmVnIFJ4IFRlY2guICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfQVVUT19ORUdfTE9DQUxfU0VMRUNUX0FCTEUgICAgICAgICAgICAgICAgICAgICAgID0gODUsICAgICAgICAgICAvKio8IFN0ZCBBdXRvIE5lZyBMb2NhbCBTZWxlY3QgQWJsZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9BVVRPX05FR19BRF9TRUxFQ1RfQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4NiwgICAgICAgICAgIC8qKjwgU3RkIEF1dG8gTmVnIEFkIFNlbGVjdCBBYmxlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0FVVE9fTkVHX1JYX1NFTEVDVF9BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICA9IDg3LCAgICAgICAgICAgLyoqPCBTdGQgQXV0byBOZWcgUnggU2VsZWN0IEFibGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NBUEFCSUxJVElFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gODksICAgICAgICAgICAvKio8IFN0ZCBNQUMgQ2FwYWJpbGl0aWVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19EVVBMRVhfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDkwLCAgICAgICAgICAgLyoqPCBTdGQgTUFDIER1cGxleCBTdGF0dXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOTIsICAgICAgICAgICAvKio8IFN0ZCBNQUMgQ3RybCBJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9GVU5DU19TVVBQT1JURUQgICAgICAgICAgICAgICAgICAgICAgICAgPSA5MywgICAgICAgICAgIC8qKjwgU3RkIE1BQyBDdHJsIEZ1bmNzIFN1cHBvcnRlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9GUkFNRVNfVFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5NCwgICAgICAgICAgIC8qKjwgU3RkIE1BQyBDdHJsIEZyYW1lcyBUeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9GUkFNRVNfUlggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5NSwgICAgICAgICAgIC8qKjwgU3RkIE1BQyBDdHJsIEZyYW1lcyBSeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9VTlNVUFBPUlRFRF9PUF9SWCAgICAgICAgICAgICAgICAgICAgICAgPSA5NiwgICAgICAgICAgIC8qKjwgU3RkIE1BQyBDdHJsIFVuc3VwcG9ydGVkIE9wIFJ4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01BQ19DVFJMX1BBVVNFX0RFTEFZICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDk3LCAgICAgICAgICAgLyoqPCBTdGQgTUFDIEN0cmwgUGF1c2UgRGVsYXkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTUFDX0NUUkxfUEFVU0VfVFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOTgsICAgICAgICAgICAvKio8IFN0ZCBNQUMgQ3RybCBQYXVzZSBUeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NQUNfQ1RSTF9QQVVTRV9SWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5OSwgICAgICAgICAgIC8qKjwgU3RkIE1BQyBDdHJsIFBhdXNlIFJ4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX09BTV9MT0NBTF9FUlJfRlJBTUVfU0VDU19FVkVOVCAgICAgICAgICAgICAgICAgICA9IDIzMywgICAgICAgICAgLyoqPCBTdGQgT0FNIExvY2FsIEVyciBGcmFtZSBTZWNzIEV2ZW50LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX09BTV9FTVVMX0NSQzhFUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0OSwgICAgICAgICAgLyoqPCBTdGQgT0FNIEVtdWwgQ3JjOCBFcnIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9NQUNfQ1RSTF9GUkFNRVNfVFggICAgICAgICAgICAgICAgICAgICAgICAgID0gMjgwLCAgICAgICAgICAvKio8IFN0ZCBNUENQIE1BQyBDdHJsIEZyYW1lcyBUeC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX01BQ19DVFJMX0ZSQU1FU19SWCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyODEsICAgICAgICAgIC8qKjwgU3RkIE1QQ1AgTUFDIEN0cmwgRnJhbWVzIFJ4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfRElTQ09WRVJZX1dJTkRPV19UWCAgICAgICAgICAgICAgICAgICAgICAgICA9IDI4OCwgICAgICAgICAgLyoqPCBTdGQgTVBDUCBEaXNjb3ZlcnkgV2luZG93IFR4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfRElTQ09WRVJZX1RJTUVPVVQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI5MCwgICAgICAgICAgLyoqPCBTdGQgTVBDUCBEaXNjb3ZlcnkgVGltZW91dC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9GRUNfQ09SUkVDVEVEX0JMT0NLUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOTIsICAgICAgICAgIC8qKjwgU3RkIEZFQyBDb3JyZWN0ZWQgQmxvY2tzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0ZFQ19VTkNPUlJFQ1RBQkxFX0JMT0NLUyAgICAgICAgICAgICAgICAgICAgICAgICA9IDI5MywgICAgICAgICAgLyoqPCBTdGQgRkVDIFVuY29ycmVjdGFibGUgQmxvY2tzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX0ZFQ19BQklMSVRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMxMywgICAgICAgICAgLyoqPCBTdGQgRkVDIEFiaWxpdHkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfRkVDX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzE0LCAgICAgICAgICAvKio8IFN0ZCBGRUMgTW9kZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX0dBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMTUsICAgICAgICAgIC8qKjwgU3RkIE1QQ1AgVHggR2F0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX1JFR19BQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMTYsICAgICAgICAgIC8qKjwgU3RkIE1QQ1AgVHggUmVnIEFjay4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1RYX1JFR0lTVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMTcsICAgICAgICAgIC8qKjwgU3RkIE1QQ1AgVHggUmVnaXN0ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9UWF9SRUdfUkVRVUVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzE4LCAgICAgICAgICAvKio8IFN0ZCBNUENQIFR4IFJlZyBSZXF1ZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfVFhfUkVQT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMxOSwgICAgICAgICAgLyoqPCBTdGQgTVBDUCBUeCBSZXBvcnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9HQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzIwLCAgICAgICAgICAvKio8IFN0ZCBNUENQIFJ4IEdhdGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9SRUdfQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzIxLCAgICAgICAgICAvKio8IFN0ZCBNUENQIFJ4IFJlZyBBY2suICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TVERfTVBDUF9SWF9SRUdJU1RFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzIyLCAgICAgICAgICAvKio8IFN0ZCBNUENQIFJ4IFJlZ2lzdGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfU1REX01QQ1BfUlhfUkVHX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyMywgICAgICAgICAgLyoqPCBTdGQgTVBDUCBSeCBSZWcgUmVxdWVzdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NURF9NUENQX1JYX1JFUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMjQsICAgICAgICAgIC8qKjwgU3RkIE1QQ1AgUnggUmVwb3J0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRklSTVdBUkVfVkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyOCwgICAgICAgICAgLyoqPCBGaXJtd2FyZSBWZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FWFRFTkRFRF9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTI5LCAgICAgICAgICAvKio8IEV4dGVuZGVkIElELiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRFlOX0xFQVJOX1RCTF9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzMCwgICAgICAgICAgLyoqPCBEeW4gTGVhcm4gVGJsIFNpemUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9EWU5fTEVBUk5fQUdFX0xJTUlUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMxLCAgICAgICAgICAvKio8IER5biBMZWFybiBBZ2UgTGltaXQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9VTklDQVNUX0ZSQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMyLCAgICAgICAgICAvKio8IFJ4IFVuaWNhc3QgRnJhbWVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfVU5JQ0FTVF9GUkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzMywgICAgICAgICAgLyoqPCBUeCBVbmljYXN0IEZyYW1lcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FX1RPT19TSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzQsICAgICAgICAgIC8qKjwgUnggRnJhbWUgVG9vIFNob3J0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUU2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzNSwgICAgICAgICAgLyoqPCBSeCBGcmFtZSA2NC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FNjVUTzEyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzYsICAgICAgICAgIC8qKjwgUnggRnJhbWUgNjXigJMxMjcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9GUkFNRTEyOFRPMjU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTM3LCAgICAgICAgICAvKio8IFJ4IEZyYW1lIDEyOOKAkzI1NS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMjU2VE81MTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzgsICAgICAgICAgIC8qKjwgUnggRnJhbWUgMjU24oCTNTExLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUU1MTJUTzEwMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzOSwgICAgICAgICAgLyoqPCBSeCBGcmFtZSA1MTLigJMxMDIzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUUxMDI0VE8xNTE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0MCwgICAgICAgICAgLyoqPCBSeCBGcmFtZSAxMDI04oCTMTUxOC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0ZSQU1FMTUxOVBMVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNDEsICAgICAgICAgIC8qKjwgUnggRnJhbWUgMTUxOSBQbHVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUU2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0MiwgICAgICAgICAgLyoqPCBUeCBGcmFtZSA2NC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FNjVUTzEyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNDMsICAgICAgICAgIC8qKjwgVHggRnJhbWUgNjXigJMxMjcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9GUkFNRTEyOFRPMjU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQ0LCAgICAgICAgICAvKio8IFR4IEZyYW1lIDEyOOKAkzI1NS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMjU2VE81MTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNDUsICAgICAgICAgIC8qKjwgVHggRnJhbWUgMjU24oCTNTExLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUU1MTJUTzEwMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0NiwgICAgICAgICAgLyoqPCBUeCBGcmFtZSA1MTLigJMxMDIzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUUxMDI0VE8xNTE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0NywgICAgICAgICAgLyoqPCBUeCBGcmFtZSAxMDI04oCTMTUxOC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0ZSQU1FMTUxOVBMVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNDgsICAgICAgICAgIC8qKjwgVHggRnJhbWUgMTUxOSBQbHVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfREVMQVlfVEhSRVNIT0xEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0OSwgICAgICAgICAgLyoqPCBUeCBEZWxheSBUaHJlc2hvbGQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9UWF9ERUxBWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUwLCAgICAgICAgICAvKio8IFR4IERlbGF5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFhfRlJBTUVTX0RST1BQRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1MSwgICAgICAgICAgLyoqPCBUeCBGcmFtZXMgRHJvcHBlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX0RST1BQRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNTIsICAgICAgICAgIC8qKjwgVHggQnl0ZXMgRHJvcHBlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX0RFTEFZRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNTMsICAgICAgICAgIC8qKjwgVHggQnl0ZXMgRGVsYXllZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RYX0JZVEVTX1VOVVNFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNTQsICAgICAgICAgIC8qKjwgVHggQnl0ZXMgVW51c2VkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfREVMQVlfVEhSRVNIT0xEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1NSwgICAgICAgICAgLyoqPCBSeCBEZWxheSBUaHJlc2hvbGQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SWF9ERUxBWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTU2LCAgICAgICAgICAvKio8IFJ4IERlbGF5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUlhfRlJBTUVTX0RST1BQRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1NywgICAgICAgICAgLyoqPCBSeCBGcmFtZXMgRHJvcHBlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0JZVEVTX0RST1BQRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNTgsICAgICAgICAgIC8qKjwgUnggQnl0ZXMgRHJvcHBlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1JYX0JZVEVTX0RFTEFZRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNTksICAgICAgICAgIC8qKjwgUnggQnl0ZXMgRGVsYXllZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfU1RBVF9USFJFU0hPTEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNjAsICAgICAgICAgIC8qKjwgUG9ydCBTdGF0IFRocmVzaG9sZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xJTktfU1RBVF9USFJFU0hPTEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNjEsICAgICAgICAgIC8qKjwgTGluayBTdGF0IFRocmVzaG9sZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VOQ1JZUFRfS0VZX0VYUElSWV9USU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNjIsICAgICAgICAgIC8qKjwgRW5jcnlwdCBLZXkgRXhwaXJ5IFRpbWUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9MRU5fRVJST1JfRElTQ0FSRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYzLCAgICAgICAgICAvKio8IExlbiBFcnJvciBEaXNjYXJkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRFlOX01BQ19UQkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2NCwgICAgICAgICAgLyoqPCBEeW4gTUFDIFRibC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1NUQVRJQ19NQUNfVEJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNjUsICAgICAgICAgIC8qKjwgU3RhdGljIE1BQyBUYmwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9VUF9GSUxURVJfVEJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTY2LCAgICAgICAgICAvKio8IFVwIEZpbHRlciBUYmwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ETl9GSUxURVJfVEJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTY3LCAgICAgICAgICAvKio8IERuIEZpbHRlciBUYmwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9SRVBPUlRfVEhSRVNIT0xEUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTY4LCAgICAgICAgICAvKio8IFJlcG9ydCBUaHJlc2hvbGRzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQkNBU1RfUkFURV9MSU1JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2OSwgICAgICAgICAgLyoqPCBCY2FzdCBSYXRlIExpbWl0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVkxBTl9FVEhFUlRZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3MiwgICAgICAgICAgLyoqPCBWTEFOIEV0aGVydHlwZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BPUlRfQ0FQQUJJTElUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNzQsICAgICAgICAgIC8qKjwgUG9ydCBDYXBhYmlsaXR5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQ1RMX1ZMQU5fSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3NSwgICAgICAgICAgLyoqPCBDdGwgVkxBTiBJIEQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NRElfQ1JPU1NPVkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTc2LCAgICAgICAgICAvKio8IE1ESSBDcm9zc292ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ORVdfRE5fRklMVEVSX1RCTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTc3LCAgICAgICAgICAvKio8IE5ldyBEbiBGaWx0ZXIgVGJsLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTkVXX1VQX0ZJTFRFUl9UQkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3OCwgICAgICAgICAgLyoqPCBOZXcgVXAgRmlsdGVyIFRibC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0pFREVDX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNzksICAgICAgICAgIC8qKjwgSkVERUMgSUQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DSElQX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgwLCAgICAgICAgICAvKio8IENoaXAgSUQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9DSElQX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgxLCAgICAgICAgICAvKio8IENoaXAgVmVyc2lvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01QQ1BfQ0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxODIsICAgICAgICAgIC8qKjwgTVBDUCBDbG9jay4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01QQ1BfQ0xPQ0tfQ09NUEVOU0FURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxODMsICAgICAgICAgIC8qKjwgTVBDUCBDbG9jayBDb21wZW5zYXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRUdSRVNTX1NIQVBJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4NCwgICAgICAgICAgLyoqPCBFZ3Jlc3MgU2hhcGluZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0lOR1JFU1NfUE9MSUNJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxODUsICAgICAgICAgIC8qKjwgSW5ncmVzcyBQb2xpY2luZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0NPU19UUkFOU0xBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxODYsICAgICAgICAgIC8qKjwgQ29TIFRyYW5zbGF0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUFJJX0VOUVVFVUlORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4NywgICAgICAgICAgLyoqPCBQcmkgRW5xdWV1aW5nLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9WTEFOX1BPTElDWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4OCwgICAgICAgICAgLyoqPCBQb3J0IFZMQU4gUG9saWN5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9WTEFOX01FTUJFUlNISVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4OSwgICAgICAgICAgLyoqPCBQb3J0IFZMQU4gTWVtYmVyc2hpcC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0FSUF9SRVBMSUNBVEVfREVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOTAsICAgICAgICAgIC8qKjwgQVJQIFJlcGxpY2F0ZSBEZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTEFDUF9ERVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5MSwgICAgICAgICAgLyoqPCBMQUNQIERlc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9PTlVfSUdNUF9WTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTk2LCAgICAgICAgICAvKio8IE9OVSBJR01QIFZMQU4uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9EWU5fTEVBUk5JTkdfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA4LCAgICAgICAgICAvKio8IER5biBMZWFybmluZyBNb2RlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTUlOX01BQ19MSU1JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIwOSwgICAgICAgICAgLyoqPCBNaW4gTUFDIExpbWl0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfT05VX0FHR1JFR0FURV9MSU1JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxMCwgICAgICAgICAgLyoqPCBPTlUgQWdncmVnYXRlIExpbWl0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTlZTX1NDUkFUQ0hQQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxMSwgICAgICAgICAgLyoqPCBOVlMgU2NyYXRjaHBhZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZMT09EX1VOS05PV04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMTIsICAgICAgICAgIC8qKjwgRmxvb2QgVW5rbm93bi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xPQ0FMX1NXSVRDSElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMTMsICAgICAgICAgIC8qKjwgTG9jYWwgU3dpdGNoaW5nLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRE9XTl9CVVJTVF9UT0xMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxNCwgICAgICAgICAgLyoqPCBEb3duIEJ1cnN0IFRvbGwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GRUNfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjE1LCAgICAgICAgICAvKio8IEZFQyBNb2RlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTEVBUk5fTU9ERV9SVUxFX1VQREFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxOCwgICAgICAgICAgLyoqPCBMZWFybiBNb2RlIFJ1bGUgVXBkYXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1RFTVBFUkFUVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxOSwgICAgICAgICAgLyoqPCBQb3dlciBNb24gVGVtcGVyYXR1cmUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1dFUl9NT05fVkNDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjIwLCAgICAgICAgICAvKio8IFBvd2VyIE1vbiBWY2MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1dFUl9NT05fVFhfQklBUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjIxLCAgICAgICAgICAvKio8IFBvd2VyIE1vbiBUeCBCaWFzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9XRVJfTU9OX1RYX1BPV0VSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIyMiwgICAgICAgICAgLyoqPCBQb3dlciBNb24gVHggUG93ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1dFUl9NT05fUlhfUE9XRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjIzLCAgICAgICAgICAvKio8IFBvd2VyIE1vbiBSeCBQb3dlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01DQVNUX0RPTUFJTl9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMjQsICAgICAgICAgIC8qKjwgTWNhc3QgRG9tYWluIENvbmZpZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01DQVNUX0dMT0JBTF9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMjUsICAgICAgICAgIC8qKjwgTWNhc3QgR2xvYmFsIENvbmZpZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX01DQVNUX0dST1VQX0lORk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMjYsICAgICAgICAgIC8qKjwgTWNhc3QgR3JvdXAgSW5mby4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xJTktfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMjcsICAgICAgICAgIC8qKjwgTGluayBTdGF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0lHTVBfRlJBTUVfUkFURV9MSU1JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMjgsICAgICAgICAgIC8qKjwgSUdNUCBGcmFtZSBSYXRlIExpbWl0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfT05VX0hPTERPVkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzMCwgICAgICAgICAgLyoqPCBPTlUgSG9sZG92ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9JUE1DX1VOS05PV05fTEVBVkVfRldEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjMxLCAgICAgICAgICAvKio8IElQTUMgVW5rbm93biBMZWF2ZSBGd2QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9ORVRXT1JLX1BPTl9NQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjM0LCAgICAgICAgICAvKio8IE5ldHdvcmsgUE9OIE1hcC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1BTU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMzUsICAgICAgICAgIC8qKjwgUFMgU3RhdGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TTEVfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjM2LCAgICAgICAgICAvKio8IFNMRSBNb2RlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTEVBUk5fVEFCTEVfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzNywgICAgICAgICAgLyoqPCBMZWFybiBUYWJsZSBNb2RlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVkxBTl9ERVNUSU5BVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0MCwgICAgICAgICAgLyoqPCBWTEFOIERlc3RpbmF0aW9ucy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1RSQU5TQ0VJVkVSX1NJR05BTF9ERVRFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNDIsICAgICAgICAgIC8qKjwgVHJhbnNjZWl2ZXIgU2lnbmFsIERldGVjdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0NST1NTQkFSX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNDMsICAgICAgICAgIC8qKjwgQ3Jvc3NiYXIgQ29uZmlnLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfVFJBTlNDRUlWRVJfQlVSU1RfQUNUSVZJVFkgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0NCwgICAgICAgICAgLyoqPCBUcmFuc2NlaXZlciBCdXJzdCBBY3Rpdml0eS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0NPTlRST0xfUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNDUsICAgICAgICAgIC8qKjwgQ29udHJvbCBQb3J0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRU5DUllQVElPTl9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0OCwgICAgICAgICAgLyoqPCBFbmNyeXB0aW9uIE1vZGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9VTklfU0hBUEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzI3NjQsICAgICAgICAvKio8IFVOSSBTaGFwZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9QT1JUX0RZTkFNSUNfRU5UUklFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzI3NDcsICAgICAgICAvKio8IFBvcnQgRHluYW1pYyBFbnRyaWVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9MSUNFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyNzY1LCAgICAgICAgLyoqPCBQb2xpY2VyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfT05VX1JVTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyNzY2LCAgICAgICAgLyoqPCBPTlUgUnVsZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0lOVEVSTkFMX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTEsICAgICAgICAgIC8qKjwgSW50ZXJuYWwgVmVyc2lvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0ZJUk1XQVJFX1RJTUVTVEFNUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTIsICAgICAgICAgIC8qKjwgRmlybXdhcmUgVGltZXN0YW1wLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQllQQVNTX1NPRlRfTEVBUk4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyNSwgICAgICAgICAgLyoqPCBCeXBhc3MgU29mdCBMZWFybi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VYVF9GSVJNV0FSRV9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMjc2MSwgICAgICAgIC8qKjwgRXh0IEZpcm13YXJlIFZlcnNpb24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FTkNSWVBUSU9OX0tFWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzI3NjAsICAgICAgICAvKio8IEVuY3J5cHRpb24gS2V5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRklMRV9JTkZPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyNzU5LCAgICAgICAgLyoqPCBGaWxlIEluZm8uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TWVNURU1fUlVMRV9PUFRJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjM4LCAgICAgICAgICAvKio8IFN5c3RlbSBSdWxlIE9wdGlvbnMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9NVFUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzI3NTgsICAgICAgICAvKio8IE1UVS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX05WU19TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMjc1NywgICAgICAgIC8qKjwgTlZTIFN0YXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUVVFVUVQUklNQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyNzU2LCAgICAgICAgLyoqPCBRdWV1ZXByaW1hcC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0VQT0NfU0RNX0FNUExJVFVERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTAsICAgICAgICAgIC8qKjwgRVBvQyBTRE0gQW1wbGl0dWRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19ET1dOX0JJVF9MT0FESU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1MywgICAgICAgICAgLyoqPCBFUG9DIERvd24gQml0IExvYWRpbmcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VQX0JJVF9MT0FESU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjU0LCAgICAgICAgICAvKio8IEVQb0MgVXAgQml0IExvYWRpbmcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1NETV9QSEFTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjU1LCAgICAgICAgICAvKio8IEVQb0MgU0RNIFBoYXNlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfRVBPQ19TRE1fUVVBTlRJWkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIzOSwgICAgICAgICAgLyoqPCBFUG9DIFNETSBRdWFudGl6ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjI5LCAgICAgICAgICAvKio8IEVQb0MgVW51c2VkIDAuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA0LCAgICAgICAgICAvKio8IEVQb0MgVW51c2VkIDEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA1LCAgICAgICAgICAvKio8IEVQb0MgVW51c2VkIDIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA2LCAgICAgICAgICAvKio8IEVQb0MgVW51c2VkIDMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9FUE9DX1VOVVNFRDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA3LCAgICAgICAgICAvKio8IEVQb0MgVW51c2VkIDQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GRUFUVVJFX1NFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzI3NjIsICAgICAgICAvKio8IEZlYXR1cmUgU2V0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfTFVFX0ZJRUxEX1NFTEVDVF9MSVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyNzQ1LCAgICAgICAgLyoqPCBMVUUgRmllbGQgU2VsZWN0IExpc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TRUFSQ0hfQ09ORklHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzI3NTIsICAgICAgICAvKio8IFNlYXJjaCBDb25maWcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9TRVFVRU5DRV9OVU1CRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjE2LCAgICAgICAgICAvKio8IFNlcXVlbmNlIE51bWJlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX1FVRVVFX0NPTkZJR19WMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMjc1MywgICAgICAgIC8qKjwgUXVldWUgQ29uZmlnIFYyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfQUxBUk1fVEhSRVNIT0xEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMyNzQxLCAgICAgICAgLyoqPCBBbGFybSBUaHJlc2hvbGQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FUVFJJQlVURV9GQUlMU0FGRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjQ2LCAgICAgICAgICAvKio8IEZhaWxzYWZlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BVFRSSUJVVEVfUE9SVF9TVEFUU19USFJFU0hPTERfSU5URVJWQUwgICAgICAgICAgICAgICAgICAgICAgICA9IDQxNiwgICAgICAgICAgLyoqPCBQb3J0IFN0YXRzIFRocmVzaG9sZCBJbnRlcnZhbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQVRUUklCVVRFX0xJTktfU1RBVFNfVEhSRVNIT0xEX0lOVEVSVkFMICAgICAgICAgICAgICAgICAgICAgICAgPSA0MTcgICAgICAgICAgIC8qKjwgTGluayBTdGF0cyBUaHJlc2hvbGQgSW50ZXJ2YWwuICovCit9IGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hdHRyaWJ1dGU7CisKKy8qKiBUZWsgTGVhZiBBY3Rpb24uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2FjdGlvbgoreworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BQ19JTklUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBTdGQgTUFDIEluaXQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFDX0FERF9HUk9VUF9BRERSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IFN0ZCBNQUMgQWRkIEdyb3VwIEFkZHIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFDX0RFTF9HUk9VUF9BRERSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IFN0ZCBNQUMgRGVsIEdyb3VwIEFkZHIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfTUFDX1NFTEZfVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IFN0ZCBNQUMgU2VsZiBUZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1BIWV9BRE1JTl9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgLyoqPCBTdGQgUEhZIEFkbWluIENvbnRyb2wuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfUlBUX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgICAvKio8IFN0ZCBSZXBvcnQgUmVzZXQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfUlBUX0lOX1NFUlZJQ0VfVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgICAgICAgICAvKio8IFN0ZCBSZXBvcnQgSW4gU2VydmljZSBUZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX1BPUlRfQURNSU5fQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgICAgICAgICAgLyoqPCBTdGQgUG9ydCBBZG1pbiBDdHJsLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BVV9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksICAgICAgICAgICAgLyoqPCBTdGQgTUFVIFJlc2V0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX01BVV9BRE1JTl9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLCAgICAgICAgICAgLyoqPCBTdGQgTUFVIEFkbWluIEN0cmwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TVERfQVVUT19SRU5FR09USUFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEsICAgICAgICAgICAvKio8IFN0ZCBBdXRvIFJlbmVnb3RpYXRlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU1REX0FVVE9fQURNSU5fQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyLCAgICAgICAgICAgLyoqPCBTdGQgQXV0byBBZG1pbiBDdHJsLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfRFlOX0xFQVJOX1RCTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyOCwgICAgICAgICAgLyoqPCBDbGVhciBEeW4gTGVhcm4gVGJsLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQUREX1NUQVRJQ19FTlRSWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyOSwgICAgICAgICAgLyoqPCBBZGQgU3RhdGljIEVudHJ5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMX1NUQVRJQ19FTlRSWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzMCwgICAgICAgICAgLyoqPCBEZWwgU3RhdGljIEVudHJ5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfVVBfRklMVEVSX1RCTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzMSwgICAgICAgICAgLyoqPCBDbGVhciBVcCBGaWx0ZXIgVGJsLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfRE5fRklMVEVSX1RCTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzMiwgICAgICAgICAgLyoqPCBDbGVhciBEbiBGaWx0ZXIgVGJsLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQUREX1JVTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzMywgICAgICAgICAgLyoqPCBBZGQgUnVsZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTEVURV9SVUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzQsICAgICAgICAgIC8qKjwgRGVsZXRlIFJ1bGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9SRVNFVF9PTlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTM1LCAgICAgICAgICAvKio8IFJlc2V0IE9OVS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX1NUQVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzYsICAgICAgICAgIC8qKjwgQ2xlYXIgU3RhdHMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfR1BJT19DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTM3LCAgICAgICAgICAvKio8IEdldCBHUElPIENvbmZpZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9HUElPX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzgsICAgICAgICAgIC8qKjwgU2V0IEdQSU8gQ29uZmlnLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0dQSU9fVkFMVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzOSwgICAgICAgICAgLyoqPCBHZXQgR1BJTyBWYWx1ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9HUElPX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNDAsICAgICAgICAgIC8qKjwgU2V0IEdQSU8gVmFsdWUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfTURJTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQxLCAgICAgICAgICAvKio8IEdldCBNRElPLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX01ESU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0MiwgICAgICAgICAgLyoqPCBTZXQgTURJTy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0xPT1BCQUNLX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNDMsICAgICAgICAgIC8qKjwgTG9vcGJhY2sgRW5hYmxlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTE9PUEJBQ0tfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0NCwgICAgICAgICAgLyoqPCBMb29wYmFjayBEaXNhYmxlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xSX1VQX0NMQVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0NSwgICAgICAgICAgLyoqPCBDbHIgVXAgQ2xhc3MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9DTFJfRE5fQ0xBU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQ2LCAgICAgICAgICAvKio8IENsciBEbiBDbGFzcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9RVUVVRV9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNDcsICAgICAgICAgIC8qKjwgU2V0IFF1ZXVlIENvbmZpZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9RVUVVRV9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNDgsICAgICAgICAgIC8qKjwgR2V0IFF1ZXVlIENvbmZpZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0VSQVNFX05WUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNDksICAgICAgICAgIC8qKjwgRXJhc2UgTlZTLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX0lHTVBfQ09ORklHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1MCwgICAgICAgICAgLyoqPCBTZXQgSUdNUCBDb25maWcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfSUdNUF9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUxLCAgICAgICAgICAvKio8IEdldCBJR01QIENvbmZpZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9JR01QX0dST1VQX0lORk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNTIsICAgICAgICAgIC8qKjwgR2V0IElHTVAgR3JvdXAgSW5mby4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTF9JR01QX0dST1VQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNTMsICAgICAgICAgIC8qKjwgRGVsIElHTVAgR3JvdXAuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9BRERfSUdNUF9HUk9VUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTU0LCAgICAgICAgICAvKio8IEFkZCBJR01QIEdyb3VwLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX1FVRVVFX1JBVEVfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1NSwgICAgICAgICAgLyoqPCBTZXQgUXVldWUgUmF0ZSBDb250cm9sLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX1FVRVVFX1JBVEVfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1NiwgICAgICAgICAgLyoqPCBHZXQgUXVldWUgUmF0ZSBDb250cm9sLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX1BPUlRfUkFURV9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE1NywgICAgICAgICAgLyoqPCBTZXQgUG9ydCBSYXRlIENvbnRyb2wuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfUE9SVF9SQVRFX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTU4LCAgICAgICAgICAvKio8IEdldCBQb3J0IFJhdGUgQ29udHJvbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9QSFlfQUREUl9NRElPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNTksICAgICAgICAgIC8qKjwgU2V0IFBIWSBBZGRyIE1ESU8uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfUEhZX0FERFJfTURJTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYwLCAgICAgICAgICAvKio8IEdldCBQSFkgQWRkciBNRElPLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTkVXX0FERF9SVUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2MSwgICAgICAgICAgLyoqPCBOZXcgQWRkIFJ1bGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9PTlVfRU5BQkxFX1VTRVJfVFJBRkZJQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYyLCAgICAgICAgICAvKio8IE9OVSBFbmFibGUgVXNlciBUcmFmZmljLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fT05VX0RJU0FCTEVfVVNFUl9UUkFGRklDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2MywgICAgICAgICAgLyoqPCBPTlUgRGlzYWJsZSBVc2VyIFRyYWZmaWMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9TRVRfRE5fQkNBU1RfUVVFVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTY0LCAgICAgICAgICAvKio8IFNldCBEbiBCY2FzdCBRdWV1ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9ETl9CQ0FTVF9RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNjUsICAgICAgICAgIC8qKjwgR2V0IERuIEJjYXN0IFF1ZXVlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fU0VUX09BTV9SQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2NiwgICAgICAgICAgLyoqPCBTZXQgT0FNIFJhdGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfT0FNX1JBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTY3LCAgICAgICAgICAvKio8IEdldCBPQU0gUmF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NFVF9MVUVfRklFTEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNjgsICAgICAgICAgIC8qKjwgU2V0IExVRSBGaWVsZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9MVUVfRklFTEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNjksICAgICAgICAgIC8qKjwgR2V0IExVRSBGaWVsZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9MT0FEX0lORk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNzAsICAgICAgICAgIC8qKjwgR2V0IExvYWQgSW5mby4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX05FV19ERUxfUlVMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNzEsICAgICAgICAgIC8qKjwgTmV3IERlbCBSdWxlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfVVBfVVNFUl9SVUxFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3MiwgICAgICAgICAgLyoqPCBDbGVhciBVcCBVc2VyIFJ1bGVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQ0xFQVJfRE5fVVNFUl9SVUxFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3MywgICAgICAgICAgLyoqPCBDbGVhciBEbiBVc2VyIFJ1bGVzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fREVMRVRFX01DQVNUX0RPTUFJTl9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3NCwgICAgICAgICAgLyoqPCBEZWxldGUgTWNhc3QgRG9tYWluIENvbmZpZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0RFTEVURV9NQ0FTVF9HUk9VUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNzUsICAgICAgICAgIC8qKjwgRGVsZXRlIE1jYXN0IEdyb3VwLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fTEFTRVJfVFhfUE9XRVJfT0ZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE3NiwgICAgICAgICAgLyoqPCBMYXNlciBUeCBQb3dlciBPZmYuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9CQ19MQVNFUl9QT1dFUl9PRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTc3LCAgICAgICAgICAvKio8IEJjIExhc2VyIFBvd2VyIE9mZi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX1NMRUVQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNzgsICAgICAgICAgIC8qKjwgU2xlZXAuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9QUk9URUNUSU9OX1NXSVRDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTc5LCAgICAgICAgICAvKio8IFByb3RlY3Rpb24gU3dpdGNoLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fQUREX0xVRV9SVUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4MSwgICAgICAgICAgLyoqPCBBZGQgTFVFIFJ1bGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ERUxfTFVFX1JVTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgyLCAgICAgICAgICAvKio8IERlbCBMVUUgUnVsZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0VOQUJMRV9QT0xJQ0VSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxODMsICAgICAgICAgIC8qKjwgRW5hYmxlIFBvbGljZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9ESVNBQkxFX1BPTElDRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTg0LCAgICAgICAgICAvKio8IERpc2FibGUgUG9saWNlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0VQT0NfVU5VU0VEMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMDIsICAgICAgICAgIC8qKjwgRXBvYyBVbnVzZWQgMC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0VQT0NfVU5VU0VEMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMDMsICAgICAgICAgIC8qKjwgRXBvYyBVbnVzZWQgMS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0ZJTkRfTFVFX1JVTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMDcsICAgICAgICAgIC8qKjwgRmluZCBMVUUgUnVsZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0NMRUFSX0xVRV9SVUxFX1RBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMDgsICAgICAgICAgIC8qKjwgQ2xlYXIgTFVFIFJ1bGUgVGFibGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFGX0FDVElPTl9HRVRfRVBPQ19TRE1fU1RBVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA5LCAgICAgICAgICAvKio8IEdldCBFUG9DIFNETSBTdGF0cy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQUZfQUNUSU9OX0dFVF9FUE9DX0NNQ19TVEFUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMTAsICAgICAgICAgIC8qKjwgR2V0IEVQb0MgQ01DIFN0YXRzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTEVBRl9BQ1RJT05fR0VUX0VQT0NfQ05VX1NUQVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxMSAgICAgICAgICAgLyoqPCBHZXQgRVBvQyBDTlUgU3RhdHMuICovCit9IGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hY3Rpb247CisKKy8qKiBUZWsgT05VIFJ1bGUgRmxhZ3MuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9mbGFncworeworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX1JVTEVfRkxBR1NfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfUlVMRV9GTEFHU19WT0xBVElMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAxICAgICAgICAvKio8IFZvbGF0aWxlLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2ZsYWdzOworCisvKiogVGVrIE9OVSBSdWxlIEFjdGlvbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2FjdGlvbgoreworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX1JVTEVfQUNUSU9OX0ZPUldBUkRfVU5BRkZFQ1RFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBGb3J3YXJkIFVuYWZmZWN0ZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfUlVMRV9BQ1RJT05fUkVTRVJWRUQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IFJlc2VydmVkMS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9SVUxFX0FDVElPTl9TRVRfREVTVElOQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgU2V0IERlc3RpbmF0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX1JVTEVfQUNUSU9OX0FERF9WTEFOX1RBRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBBZGQgVkxBTiBUYWcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfUlVMRV9BQ1RJT05fREVMRVRFX1ZMQU5fVEFHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IERlbGV0ZSBWTEFOIFRhZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9SVUxFX0FDVElPTl9TRVRfVklEX0FERF9WTEFOX1RBRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgU2V0IFZJRCBBZGQgVkxBTiBUYWcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfUlVMRV9BQ1RJT05fU0VUX0NPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgICAvKio8IFNldCBDb1MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfUlVMRV9BQ1RJT05fREVMRVRFX1RBR19BRERfVEFHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNywgICAgICAgICAgICAvKio8IERlbGV0ZSBUYWcgQWRkIFRhZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9SVUxFX0FDVElPTl9ERUxFVEVfVEFHX0FERF9UQUdfU0VUX1ZJRCAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAgICAgICAgIC8qKjwgRGVsZXRlIFRhZyBBZGQgVGFnIFNldCBWSUQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfUlVMRV9BQ1RJT05fQ0xFQVJfQUREX1RBRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgICAgICAgICAvKio8IENsZWFyIEFkZCBUYWcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfUlVMRV9BQ1RJT05fQ0xFQVJfREVMX1RBRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgICAgICAgICAvKio8IENsZWFyIERlbCBUYWcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfUlVMRV9BQ1RJT05fQ0xFQVJfREVMX1RBR19BTkRfQUREX1RBRyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEsICAgICAgICAgICAvKio8IENsZWFyIERlbCBUYWcgQW5kIEFkZCBUYWcuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfUlVMRV9BQ1RJT05fQ09QWV9GSUVMRF9UT19DT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTIsICAgICAgICAgICAvKio8IENvcHkgRmllbGQgVG8gQ29TLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX1JVTEVfQUNUSU9OX0NPUFlfRklFTERfVE9fVklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgICAgICAgICAgLyoqPCBDb3B5IEZpZWxkIFRvIFZJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9SVUxFX0FDVElPTl9ESVNDQVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNCwgICAgICAgICAgIC8qKjwgRGlzY2FyZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9SVUxFX0FDVElPTl9SRVNFUlZFRDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNSwgICAgICAgICAgIC8qKjwgUmVzZXJ2ZWQyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX1JVTEVfQUNUSU9OX0ZPUldBUkRfQ0xFQVJfRElTQ0FSRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2LCAgICAgICAgICAgLyoqPCBGb3J3YXJkIENsZWFyIERpc2NhcmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfUlVMRV9BQ1RJT05fUkVTRVJWRUQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTcsICAgICAgICAgICAvKio8IFJlc2VydmVkMy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9SVUxFX0FDVElPTl9TRVRfREVTVElOQVRJT05fRk9SV0FSRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOCwgICAgICAgICAgIC8qKjwgU2V0IERlc3RpbmF0aW9uIEZvcndhcmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfUlVMRV9BQ1RJT05fQUREX1RBR19GT1JXQVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTksICAgICAgICAgICAvKio8IEFkZCBUYWcgRm9yd2FyZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9SVUxFX0FDVElPTl9ERUxFVEVfVEFHX0ZPUldBUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMCwgICAgICAgICAgIC8qKjwgRGVsZXRlIFRhZyBGb3J3YXJkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX1JVTEVfQUNUSU9OX1NFVF9WSURfQUREX1RBR19GT1JXQVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIxLCAgICAgICAgICAgLyoqPCBTZXQgVklEIEFkZCBUYWcgRm9yd2FyZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9SVUxFX0FDVElPTl9TRVRfQ09TX0ZPUldBUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMiwgICAgICAgICAgIC8qKjwgU2V0IENvUyBGb3J3YXJkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX1JVTEVfQUNUSU9OX0RFTEVURV9UQUdfQUREX1RBR19SRVBMQUNFX1RBR19GT1JXQVJEICAgICAgICAgICAgICA9IDIzLCAgICAgICAgICAgLyoqPCBEZWxldGUgVGFnIEFkZCBUYWcgUmVwbGFjZSBUYWcgRm9yd2FyZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9SVUxFX0FDVElPTl9ERUxFVEVfVEFHX0FERF9UQUdfU0VUX1ZJRF9GT1JXQVJEICAgICAgICAgICAgICAgICAgPSAyNCwgICAgICAgICAgIC8qKjwgRGVsZXRlIFRhZyBBZGQgVGFnIFNldCBWSUQgRm9yd2FyZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9SVUxFX0FDVElPTl9DTEVBUl9BRERfVEFHX0ZPUldBUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNSwgICAgICAgICAgIC8qKjwgQ2xlYXIgQWRkIFRhZyBGb3J3YXJkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX1JVTEVfQUNUSU9OX0NMRUFSX0RFTF9UQUdfRk9SV0FSRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2LCAgICAgICAgICAgLyoqPCBDbGVhciBEZWwgVGFnIEZvcndhcmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfUlVMRV9BQ1RJT05fQ0xFQVJfREVMX1RBR19BTkRfQUREX1RBR19GT1JXQVJEICAgICAgICAgICAgICAgICAgID0gMjcsICAgICAgICAgICAvKio8IENsZWFyIERlbCBUYWcgQW5kIEFkZCBUYWcgRm9yd2FyZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9SVUxFX0FDVElPTl9DT1BZX0ZJRUxEX1RPX0NPU19GT1JXQVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOCwgICAgICAgICAgIC8qKjwgQ29weSBGaWVsZCBUbyBDb1MgRm9yd2FyZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9SVUxFX0FDVElPTl9DT1BZX0ZJRUxEX1RPX1ZJRF9GT1JXQVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOSwgICAgICAgICAgIC8qKjwgQ29weSBGaWVsZCBUbyBWSUQgRm9yd2FyZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9SVUxFX0FDVElPTl9SRVNFUlZFRDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMCwgICAgICAgICAgIC8qKjwgUmVzZXJ2ZWQ0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX1JVTEVfQUNUSU9OX1JFU0VSVkVENSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMxICAgICAgICAgICAgLyoqPCBSZXNlcnZlZDUuICovCit9IGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfYWN0aW9uOworCisvKiogVGVrIE9OVSBGaWVsZCBTZWxlY3QuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfZmllbGRfc2VsZWN0Cit7CisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfRklFTERfU0VMRUNUX0RBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IERBLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX0ZJRUxEX1NFTEVDVF9TQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBTQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9GSUVMRF9TRUxFQ1RfTExJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgTExJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9GSUVMRF9TRUxFQ1RfRVRIRVJfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgRXRoZXJUeXBlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX0ZJRUxEX1NFTEVDVF9WTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBWTEFOLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX0ZJRUxEX1NFTEVDVF9VU0VSX0ZTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgLyoqPCBVc2VyIEZTLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX0ZJRUxEX1NFTEVDVF9JUFBST1RPQ09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBJUCBQcm90b2NvbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9GSUVMRF9TRUxFQ1RfQ1RDX0VUSF9DT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMCwgICAgICAgICAgIC8qKjwgQ1RDIEV0aCBDb1MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfRklFTERfU0VMRUNUX0wzUFJPVE9DT0xfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEgICAgICAgICAgICAvKio8IEwzIFByb3RvY29sIFR5cGUuICovCit9IGJjbW9sdF9lcG9uX29hbV90ZWtfb251X2ZpZWxkX3NlbGVjdDsKKworLyoqIFRlayBPTlUgUnVsZSBPcGVyYXRvci4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX29wZXJhdG9yCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfUlVMRV9PUEVSQVRPUl9ORVZFUl9NQVRDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IE5ldmVyIE1hdGNoLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX1JVTEVfT1BFUkFUT1JfRVFVQUxfVE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBFcXVhbCBUby4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9SVUxFX09QRVJBVE9SX05PVF9FUVVBTF9UTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgTm90IEVxdWFsIFRvLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX1JVTEVfT1BFUkFUT1JfTEVTU19USEFOX09SX0VRVUFMX1RPICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBMZXNzIFRoYW4gT3IgRXF1YWwgVG8uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19PTlVfUlVMRV9PUEVSQVRPUl9HUkVBVEVSX1RIQU5fT1JfRVFVQUxfVE8gICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IEdyZWF0ZXIgVGhhbiBPciBFcXVhbCBUby4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX09OVV9SVUxFX09QRVJBVE9SX0VYSVNUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgRXhpc3RzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX1JVTEVfT1BFUkFUT1JfTk9UX0VYSVNUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBOb3QgRXhpc3RzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfT05VX1JVTEVfT1BFUkFUT1JfQUxXQVlTX01BVENIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcgICAgICAgICAgICAgLyoqPCBBbHdheXMgTWF0Y2guICovCit9IGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfb3BlcmF0b3I7CisKKy8qKiBPTlUgUFMgU3RhdGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX29udV9wc3N0YXRlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX09OVV9QU1NUQVRFX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9PQU1fT05VX1BTU1RBVEVfU1dJVENIRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDEsICAgICAgIC8qKjwgU3dpdGNoZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09OVV9QU1NUQVRFX1NJR05BTF9ERVRFQ1RfQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAyLCAgICAgICAvKio8IFNpZ25hbCBEZXRlY3QgQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT05VX1BTU1RBVEVfU0lHTkFMX0RFVEVDVF9CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDQgICAgICAgIC8qKjwgU2lnbmFsIERldGVjdCBCLiAqLworfSBiY21vbHRfZXBvbl9vYW1fb251X3Bzc3RhdGU7CisKKy8qKiBUZWsgTGVhcm4gVGFibGUgTW9kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fdGVrX2xlYXJuX3RhYmxlX21vZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0xFQVJOX1RBQkxFX01PREVfT1ZFUkZMT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgT3ZlcmZsb3cuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19MRUFSTl9UQUJMRV9NT0RFX09WRVJXUklURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSAgICAgICAgICAgICAvKio8IE92ZXJ3cml0ZS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFybl90YWJsZV9tb2RlOworCisvKiogVGVrIFZMQU4gRGVzdGluYXRpb24gTWF0Y2ggTW9kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fdGVrX3ZsYW5fZGVzdGluYXRpb25fbWF0Y2hfbW9kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfVkxBTl9ERVNUSU5BVElPTl9NQVRDSF9NT0RFX0RBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBEQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX1ZMQU5fREVTVElOQVRJT05fTUFUQ0hfTU9ERV9WSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgVklELiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfVkxBTl9ERVNUSU5BVElPTl9NQVRDSF9NT0RFX0NPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBDb1MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19WTEFOX0RFU1RJTkFUSU9OX01BVENIX01PREVfVklEX0NPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgICAgICAvKio8IFZJRC9Db1MuICovCit9IGJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9tYXRjaF9tb2RlOworCisvKiogVGVrIFZMQU4gRGVzdGluYXRpb24gRmxhZ3MuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX2ZsYWdzCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19WTEFOX0RFU1RJTkFUSU9OX0ZMQUdTX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX1ZMQU5fREVTVElOQVRJT05fRkxBR1NfRFJPUF9VTlRBR0dFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDEsICAgICAgIC8qKjwgRHJvcCBVbnRhZ2dlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX1ZMQU5fREVTVElOQVRJT05fRkxBR1NfU1RSSVBfVkxBTl9UQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDIgICAgICAgIC8qKjwgU3RyaXAgVkxBTiBUYWcuICovCit9IGJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9mbGFnczsKKworLyoqIFRlayBFbmNyeXB0aW9uIE1vZGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3Rla19lbmNyeXB0aW9uX21vZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0VOQ1JZUFRJT05fTU9ERV9ESVNBQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgRGlzYWJsZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19FTkNSWVBUSU9OX01PREVfQUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IEFFUy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0VOQ1JZUFRJT05fTU9ERV9aT0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgWk9ILiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfRU5DUllQVElPTl9NT0RFX0NUQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMgICAgICAgICAgICAgLyoqPCBDVEMuICovCit9IGJjbW9sdF9lcG9uX29hbV90ZWtfZW5jcnlwdGlvbl9tb2RlOworCisvKiogVGVrIEVuY3J5cHRpb24gT3B0aW9ucy4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fdGVrX2VuY3J5cHRpb25fb3B0aW9ucworeworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfRU5DUllQVElPTl9PUFRJT05TX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19FTkNSWVBUSU9OX09QVElPTlNfQklfRElSRUNUSU9OQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAxICAgICAgICAvKio8IEJpLURpcmVjdGlvbmFsLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX2VuY3J5cHRpb25fb3B0aW9uczsKKworLyoqIFJ1bGUgRmllbGQgU2VsZWN0LiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9ydWxlX2ZpZWxkX3NlbGVjdAoreworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0ZJRUxEX1NFTEVDVF9MMkRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBMMiBEQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9GSUVMRF9TRUxFQ1RfTDJTQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgTDIgU0EuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfRklFTERfU0VMRUNUX0wyVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IEwyIFR5cGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfRklFTERfU0VMRUNUX0wyU1ZMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IEwyIFNWbGFuLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0ZJRUxEX1NFTEVDVF9MMkNWTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBMMiBDVmxhbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9GSUVMRF9TRUxFQ1RfVURQX1RDUF9TT1VSQ0VfUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgVWRwIFRjcCBTb3VyY2UgUG9ydC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9GSUVMRF9TRUxFQ1RfVURQX1RDUF9ERVNUSU5BVElPTl9QT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAgICAgICAgIC8qKjwgVWRwIFRjcCBEZXN0aW5hdGlvbiBQb3J0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0ZJRUxEX1NFTEVDVF9JUF9QUk9UT0NPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAgICAgLyoqPCBJcCBQcm90b2NvbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9GSUVMRF9TRUxFQ1RfSVBWNFRUTF9JUFY2SE9QX0xJTUlUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4LCAgICAgICAgICAgIC8qKjwgSVBWNCBUdGwgSVBWNiBIb3AgTGltaXQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfRklFTERfU0VMRUNUX0lQVjRUT1NfSVBWNkNMQVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgICAgICAgICAvKio8IElQVjQgVG9zIElQVjYgQ2xhc3MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfRklFTERfU0VMRUNUX0lQVjRJUFY2REEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgICAgICAgICAvKio8IElQVjQgSVBWNiBEQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9GSUVMRF9TRUxFQ1RfSVBWNkRBSEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSwgICAgICAgICAgIC8qKjwgSVBWNiBEQSBIaS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9GSUVMRF9TRUxFQ1RfSVBWNElQVjZTQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMiwgICAgICAgICAgIC8qKjwgSVBWNCBJUFY2IFNBLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0ZJRUxEX1NFTEVDVF9JUFY2U0FISSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzLCAgICAgICAgICAgLyoqPCBJUFY2IFNBIEhpLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0ZJRUxEX1NFTEVDVF9JUFY2TkVYVF9IRUFERVJfQklUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0LCAgICAgICAgICAgLyoqPCBJUFY2IE5leHQgSGVhZGVyIEJpdC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9GSUVMRF9TRUxFQ1RfTExJRF9NQUNfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNSwgICAgICAgICAgIC8qKjwgTExJRCBNYWMgSWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfRklFTERfU0VMRUNUX1VTRVIxNkJJVF9GSUVMRDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYsICAgICAgICAgICAvKio8IFVzZXIgMTYgQml0IEZpZWxkIDAuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfRklFTERfU0VMRUNUX1VTRVIxNkJJVF9GSUVMRDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTcsICAgICAgICAgICAvKio8IFVzZXIgMTYgQml0IEZpZWxkIDEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfRklFTERfU0VMRUNUX1VTRVIxNkJJVF9GSUVMRDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTgsICAgICAgICAgICAvKio8IFVzZXIgMTYgQml0IEZpZWxkIDIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfRklFTERfU0VMRUNUX1VTRVIxNkJJVF9GSUVMRDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTksICAgICAgICAgICAvKio8IFVzZXIgMTYgQml0IEZpZWxkIDMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfRklFTERfU0VMRUNUX1VTRVIxNkJJVF9GSUVMRDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjAsICAgICAgICAgICAvKio8IFVzZXIgMTYgQml0IEZpZWxkIDQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfRklFTERfU0VMRUNUX1VTRVIzMkJJVF9GSUVMRDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjEsICAgICAgICAgICAvKio8IFVzZXIgMzIgQml0IEZpZWxkIDUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfRklFTERfU0VMRUNUX1VTRVIzMkJJVF9GSUVMRDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjIsICAgICAgICAgICAvKio8IFVzZXIgMzIgQml0IEZpZWxkIDYuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfRklFTERfU0VMRUNUX1BUUF9USU1FX1NUQU1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjMsICAgICAgICAgICAvKio8IFBUUCBUaW1lIFN0YW1wLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0ZJRUxEX1NFTEVDVF9QT0xJQ0VSX0VMRU1FTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0LCAgICAgICAgICAgLyoqPCBQb2xpY2VyIEVsZW1lbnQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfRklFTERfU0VMRUNUX1ZBUl9RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjUsICAgICAgICAgICAvKio8IFZhciBRdWV1ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9GSUVMRF9TRUxFQ1RfVkFSX0xFQVJOSU5HX0RPTUFJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNiwgICAgICAgICAgIC8qKjwgVmFyIExlYXJuaW5nIERvbWFpbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9GSUVMRF9TRUxFQ1RfVkFSX1BPUlRfRElTQ0FSRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNywgICAgICAgICAgIC8qKjwgVmFyIFBvcnQgRGlzY2FyZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9GSUVMRF9TRUxFQ1RfVkFSX1NUQVRJU1RJQ19QT0lOVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOCwgICAgICAgICAgIC8qKjwgVmFyIFN0YXRpc3RpYyBQb2ludGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0ZJRUxEX1NFTEVDVF9WQVJfU1dJVENISU5HX0RPTUFJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI5LCAgICAgICAgICAgLyoqPCBWYXIgU3dpdGNoaW5nIERvbWFpbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9GSUVMRF9TRUxFQ1RfVkFSX1BPTElDRVIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMCwgICAgICAgICAgIC8qKjwgVmFyIFBvbGljZXIgMS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9GSUVMRF9TRUxFQ1RfVkFSX1BPTElDRVIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMSwgICAgICAgICAgIC8qKjwgVmFyIFBvbGljZXIgMi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9GSUVMRF9TRUxFQ1RfVkFSX1BPTElDRVIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMiwgICAgICAgICAgIC8qKjwgVmFyIFBvbGljZXIgMy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9GSUVMRF9TRUxFQ1RfVkFSX1BPTElDRVI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMywgICAgICAgICAgIC8qKjwgVmFyIFBvbGljZXIgNC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9GSUVMRF9TRUxFQ1RfVkFSX1NTTV9TT1VSQ0VfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNCwgICAgICAgICAgIC8qKjwgVmFyIFNzbSBTb3VyY2UgSWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfRklFTERfU0VMRUNUX1ZBUl9JTkRFWF9UQUJMRV9QT0lOVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzUsICAgICAgICAgICAvKio8IFZhciBJbmRleCBUYWJsZSBQb2ludGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0ZJRUxEX1NFTEVDVF9GUkFNRV9MRU5HVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM2LCAgICAgICAgICAgLyoqPCBGcmFtZSBMZW5ndGguICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfRklFTERfU0VMRUNUX0ZSQU1FX0RJU0NBUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzcgICAgICAgICAgICAvKio8IEZyYW1lIERpc2NhcmQuICovCit9IGJjbW9sdF9lcG9uX29hbV9ydWxlX2ZpZWxkX3NlbGVjdDsKKworLyoqIFJ1bGUgQWN0aW9uLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9ydWxlX2FjdGlvbgoreworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9TVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBTdG9wLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9OT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBOb3AuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX1ZMQU5fQUREX1NFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IFZsYW4gQWRkIFNldC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fVkxBTl9BRERfQ0xFQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgVmxhbiBBZGQgQ2xlYXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX1ZMQU5fREVMX1NFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IFZsYW4gRGVsIFNldC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fVkxBTl9ERUxfQ0xFQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgVmxhbiBEZWwgQ2xlYXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX0RJU0NBUkRfU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiwgICAgICAgICAgICAvKio8IERpc2NhcmQgU2V0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9ESVNDQVJEX0NMRUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcsICAgICAgICAgICAgLyoqPCBEaXNjYXJkIENsZWFyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9TRVRfUVVFVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgICAgICAgICAgLyoqPCBTZXQgUXVldWUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX1NFVF9MRUFSTklOR19ET01BSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwgICAgICAgICAgICAvKio8IFNldCBMZWFybmluZyBEb21haW4uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX1NFVF9QT1JUX0RJU0NBUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTAsICAgICAgICAgICAvKio8IFNldCBQb3J0IERpc2NhcmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX1NFVF9TVEFUSVNUSUNfUE9JTlRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTEsICAgICAgICAgICAvKio8IFNldCBTdGF0aXN0aWMgUG9pbnRlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fU0VUX1NXSVRDSElOR19ET01BSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMiwgICAgICAgICAgIC8qKjwgU2V0IFN3aXRjaGluZyBEb21haW4uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX1NFVF9QT0xJQ0VSMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMsICAgICAgICAgICAvKio8IFNldCBQb2xpY2VyIDEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX1NFVF9QT0xJQ0VSMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTQsICAgICAgICAgICAvKio8IFNldCBQb2xpY2VyIDIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX1NFVF9QT0xJQ0VSMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTUsICAgICAgICAgICAvKio8IFNldCBQb2xpY2VyIDMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX1NFVF9QT0xJQ0VSNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYsICAgICAgICAgICAvKio8IFNldCBQb2xpY2VyIDQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX1NFVF9TU01fU09VUkNFX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTcsICAgICAgICAgICAvKio8IFNldCBTc20gU291cmNlIElkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9TRVRfSU5ERVhfVEFCTEVfUE9JTlRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE4LCAgICAgICAgICAgLyoqPCBTZXQgSW5kZXggVGFibGUgUG9pbnRlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fU0VUX1ZJRF9DRkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOSwgICAgICAgICAgIC8qKjwgU2V0IFZpZCBDZmkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX1NFVF9DT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjAsICAgICAgICAgICAvKio8IFNldCBDb3MuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX1NFVF9UUElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjEsICAgICAgICAgICAvKio8IFNldCBUcGlkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9PUl9RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIyLCAgICAgICAgICAgLyoqPCBPciBRdWV1ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fT1JfTEVBUk5JTkdfRE9NQUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMywgICAgICAgICAgIC8qKjwgT3IgTGVhcm5pbmcgRG9tYWluLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9PUl9QT1JUX0RJU0NBUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI0LCAgICAgICAgICAgLyoqPCBPciBQb3J0IERpc2NhcmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX09SX1NUQVRJU1RJQ19QT0lOVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjUsICAgICAgICAgICAvKio8IE9yIFN0YXRpc3RpYyBQb2ludGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9PUl9TV0lUQ0hJTkdfRE9NQUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2LCAgICAgICAgICAgLyoqPCBPciBTd2l0Y2hpbmcgRG9tYWluLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9PUl9QT0xJQ0VSMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI3LCAgICAgICAgICAgLyoqPCBPciBQb2xpY2VyIDEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX09SX1BPTElDRVIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjgsICAgICAgICAgICAvKio8IE9yIFBvbGljZXIgMi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fT1JfUE9MSUNFUjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyOSwgICAgICAgICAgIC8qKjwgT3IgUG9saWNlciAzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9PUl9QT0xJQ0VSNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMwLCAgICAgICAgICAgLyoqPCBPciBQb2xpY2VyIDQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX09SX1NTTV9TT1VSQ0VfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzEsICAgICAgICAgICAvKio8IE9yIFNzbSBTb3VyY2UgSWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX09SX0lOREVYX1RBQkxFX1BPSU5URVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzIsICAgICAgICAgICAvKio8IE9yIEluZGV4IFRhYmxlIFBvaW50ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX09SX1ZJRF9DRkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzMsICAgICAgICAgICAvKio8IE9yIFZpZCBDZmkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX09SX0NPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMzQsICAgICAgICAgICAvKio8IE9yIENvcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fT1JfVFBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNSwgICAgICAgICAgIC8qKjwgT3IgVHBpZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fQU5EX1FVRVVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNiwgICAgICAgICAgIC8qKjwgQW5kIFF1ZXVlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9BTkRfTEVBUk5JTkdfRE9NQUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM3LCAgICAgICAgICAgLyoqPCBBbmQgTGVhcm5pbmcgRG9tYWluLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9BTkRfUE9SVF9ESVNDQVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM4LCAgICAgICAgICAgLyoqPCBBbmQgUG9ydCBEaXNjYXJkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9BTkRfU1RBVElTVElDX1BPSU5URVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDM5LCAgICAgICAgICAgLyoqPCBBbmQgU3RhdGlzdGljIFBvaW50ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX0FORF9TV0lUQ0hJTkdfRE9NQUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDAsICAgICAgICAgICAvKio8IEFuZCBTd2l0Y2hpbmcgRG9tYWluLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9BTkRfUE9MSUNFUjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQxLCAgICAgICAgICAgLyoqPCBBbmQgUG9saWNlciAxLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9BTkRfUE9MSUNFUjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQyLCAgICAgICAgICAgLyoqPCBBbmQgUG9saWNlciAyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9BTkRfUE9MSUNFUjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQzLCAgICAgICAgICAgLyoqPCBBbmQgUG9saWNlciAzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9BTkRfUE9MSUNFUjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ0LCAgICAgICAgICAgLyoqPCBBbmQgUG9saWNlciA0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9BTkRfU1NNX1NPVVJDRV9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ1LCAgICAgICAgICAgLyoqPCBBbmQgU3NtIFNvdXJjZSBJZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fQU5EX0lOREVYX1RBQkxFX1BPSU5URVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NiwgICAgICAgICAgIC8qKjwgQW5kIEluZGV4IFRhYmxlIFBvaW50ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX0FORF9WSURfQ0ZJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDcsICAgICAgICAgICAvKio8IEFuZCBWaWQgQ2ZpLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9BTkRfQ09TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ4LCAgICAgICAgICAgLyoqPCBBbmQgQ29zLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9BTkRfVFBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ5LCAgICAgICAgICAgLyoqPCBBbmQgVHBpZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fQUREUVVFVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1MCwgICAgICAgICAgIC8qKjwgQWRkUXVldWUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX0FERF9MRUFSTklOR19ET01BSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTEsICAgICAgICAgICAvKio8IEFkZCBMZWFybmluZyBEb21haW4uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX0FERF9QT1JUX0RJU0NBUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTIsICAgICAgICAgICAvKio8IEFkZCBQb3J0IERpc2NhcmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX0FERF9TVEFUSVNUSUNfUE9JTlRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTMsICAgICAgICAgICAvKio8IEFkZCBTdGF0aXN0aWMgUG9pbnRlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fQUREX1NXSVRDSElOR19ET01BSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1NCwgICAgICAgICAgIC8qKjwgQWRkIFN3aXRjaGluZyBEb21haW4uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX0FERF9QT0xJQ0VSMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTUsICAgICAgICAgICAvKio8IEFkZCBQb2xpY2VyIDEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX0FERF9QT0xJQ0VSMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTYsICAgICAgICAgICAvKio8IEFkZCBQb2xpY2VyIDIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX0FERF9QT0xJQ0VSMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTcsICAgICAgICAgICAvKio8IEFkZCBQb2xpY2VyIDMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX0FERF9QT0xJQ0VSNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTgsICAgICAgICAgICAvKio8IEFkZCBQb2xpY2VyIDQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX0FERF9TU01fU09VUkNFX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNTksICAgICAgICAgICAvKio8IEFkZCBTc20gU291cmNlIElkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9BRERfSU5ERVhfVEFCTEVfUE9JTlRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYwLCAgICAgICAgICAgLyoqPCBBZGQgSW5kZXggVGFibGUgUG9pbnRlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fQUREX1ZJRF9DRkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2MSwgICAgICAgICAgIC8qKjwgQWRkIFZpZCBDZmkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX0FERF9DT0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjIsICAgICAgICAgICAvKio8IEFkZCBDb2QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX0FERF9UUElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjMsICAgICAgICAgICAvKio8IEFkZCBUcGlkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9TSElGVF9RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDY0LCAgICAgICAgICAgLyoqPCBTaGlmdCBRdWV1ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fU0hJRlRfTEVBUk5JTkdfRE9NQUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2NSwgICAgICAgICAgIC8qKjwgU2hpZnQgTGVhcm5pbmcgRG9tYWluLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9TSElGVF9QT1JUX0RJU0NBUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDY2LCAgICAgICAgICAgLyoqPCBTaGlmdCBQb3J0IERpc2NhcmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX1NISUZUX1NUQVRJU1RJQ19QT0lOVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjcsICAgICAgICAgICAvKio8IFNoaWZ0IFN0YXRpc3RpYyBQb2ludGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9TSElGVF9TV0lUQ0hJTkdfRE9NQUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDY4LCAgICAgICAgICAgLyoqPCBTaGlmdCBTd2l0Y2hpbmcgRG9tYWluLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9TSElGVF9QT0xJQ0VSMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDY5LCAgICAgICAgICAgLyoqPCBTaGlmdCBQb2xpY2VyIDEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX1NISUZUX1BPTElDRVIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzAsICAgICAgICAgICAvKio8IFNoaWZ0IFBvbGljZXIgMi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fU0hJRlRfUE9MSUNFUjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3MSwgICAgICAgICAgIC8qKjwgU2hpZnQgUG9saWNlciAzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9TSElGVF9QT0xJQ0VSNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDcyLCAgICAgICAgICAgLyoqPCBTaGlmdCBQb2xpY2VyIDQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX1NISUZUX1NTTV9TT1VSQ0VfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzMsICAgICAgICAgICAvKio8IFNoaWZ0IFNzbSBTb3VyY2UgSWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX1NISUZUX0lOREVYX1RBQkxFX1BPSU5URVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzQsICAgICAgICAgICAvKio8IFNoaWZ0IEluZGV4IFRhYmxlIFBvaW50ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX1NISUZUX1ZJRF9DRkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzUsICAgICAgICAgICAvKio8IFNoaWZ0IFZpZCBDZmkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX1NISUZUX0NPRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzYsICAgICAgICAgICAvKio8IFNoaWZ0IENvZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fU0hJRlRfVFBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3NywgICAgICAgICAgIC8qKjwgU2hpZnQgVHBpZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fQ09QWV9RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3OCwgICAgICAgICAgIC8qKjwgQ29weSBRdWV1ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fQ09QWV9MRUFSTklOR19ET01BSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3OSwgICAgICAgICAgIC8qKjwgQ29weSBMZWFybmluZyBEb21haW4uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX0NPUFlfUE9SVF9ESVNDQVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gODAsICAgICAgICAgICAvKio8IENvcHkgUG9ydCBEaXNjYXJkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9DT1BZX1NUQVRJU1RJQ19QT0lOVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgxLCAgICAgICAgICAgLyoqPCBDb3B5IFN0YXRpc3RpYyBQb2ludGVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9DT1BZX1NXSVRDSElOR19ET01BSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgyLCAgICAgICAgICAgLyoqPCBDb3B5IFN3aXRjaGluZyBEb21haW4uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX0NPUFlfUE9MSUNFUjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gODMsICAgICAgICAgICAvKio8IENvcHkgUG9saWNlciAxLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9DT1BZX1BPTElDRVIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDg0LCAgICAgICAgICAgLyoqPCBDb3B5IFBvbGljZXIgMi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fQ09QWV9QT0xJQ0VSMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4NSwgICAgICAgICAgIC8qKjwgQ29weSBQb2xpY2VyIDMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX0NPUFlfUE9MSUNFUjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gODYsICAgICAgICAgICAvKio8IENvcHkgUG9saWNlciA0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9DT1BZX1NTTV9TT1VSQ0VfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDg3LCAgICAgICAgICAgLyoqPCBDb3B5IFNzbSBTb3VyY2UgSWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1JVTEVfQUNUSU9OX0NPUFlfSU5ERVhfVEFCTEVfUE9JTlRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gODgsICAgICAgICAgICAvKio8IENvcHkgSW5kZXggVGFibGUgUG9pbnRlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fQ09QWV9WSURfQ0ZJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4OSwgICAgICAgICAgIC8qKjwgQ29weSBWaWQgQ2ZpLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX0FDVElPTl9DT1BZX0NPRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDkwLCAgICAgICAgICAgLyoqPCBDb3B5IENvZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUlVMRV9BQ1RJT05fQ09QWV9UUElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA5MSAgICAgICAgICAgIC8qKjwgQ29weSBUcGlkLiAqLworfSBiY21vbHRfZXBvbl9vYW1fcnVsZV9hY3Rpb247CisKKy8qKiBWZXJzaW9uIG1hdHVyaXR5IAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3Rla19tYXR1cml0eQoreworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTUFUVVJJVFlfUkVMRUFTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgyLCAgICAgICAgICAgLyoqPCBSZWxlYXNlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTUFUVVJJVFlfQ1VTVE9NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDY3LCAgICAgICAgICAgLyoqPCBDdXN0b20uICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19NQVRVUklUWV9CRVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjYsICAgICAgICAgICAvKio8IEJldGEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19NQVRVUklUWV9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNjUsICAgICAgICAgICAvKio8IEFscGhhLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfTUFUVVJJVFlfRU5HSU5FRVJJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDY5LCAgICAgICAgICAgLyoqPCBFbmdpbmVlcmluZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX01BVFVSSVRZX0RFVkVMT1BNRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2OCAgICAgICAgICAgIC8qKjwgRGV2ZWxvcG1lbnQuICovCit9IGJjbW9sdF9lcG9uX29hbV90ZWtfbWF0dXJpdHk7CisKKy8qKiBGaWxlIFR5cGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2ZpbGVfdHlwZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9GSUxFX1RZUEVfQk9PVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBCb290LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9GSUxFX1RZUEVfQVBQX01BSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBBcHAgTWFpbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRklMRV9UWVBFX0FQUF9CQUNLVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyICAgICAgICAgICAgIC8qKjwgQXBwIEJhY2t1cC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2ZpbGVfdHlwZTsKKworLyoqIE5WUyBTdGF0ZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fbnZzX3N0YXRlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX05WU19TVEFURV9FTkFCTEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IEVuYWJsZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX05WU19TVEFURV9ESVNBQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSAgICAgICAgICAgICAvKio8IERpc2FibGVkLiAqLworfSBiY21vbHRfZXBvbl9vYW1fbnZzX3N0YXRlOworCisvKiogVGVrIFF1ZXVlIENvbmZpZyBWMiBTdWJ0eXBlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3Yyc3VidHlwZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfUVVFVUVfQ09ORklHX1YyU1VCVFlQRV9URVJNSU5BVE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBVc2VkIHRvIGVuZCBhIHF1ZXVlIGNvbmZpZyBjb250YWluZXIgY2hhaW4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX1FVRVVFX0NPTkZJR19WMlNVQlRZUEVfSEVBREVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgVXNlZCB0byBzdGFydCBhIHF1ZXVlIGNvbmZpZyBjb250YWluZXIgY2hhaW4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX1FVRVVFX0NPTkZJR19WMlNVQlRZUEVfTElOSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgVXNlZCB0byBkZWZpbmUgYSBsaW5rIHF1ZXVlIGNvbmZpZyAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfUVVFVUVfQ09ORklHX1YyU1VCVFlQRV9QT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMgICAgICAgICAgICAgLyoqPCBVc2VkIHRvIGRlZmluZSBhIHBvcnQgcXVldWUgY29uZmlnICovCit9IGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3Yyc3VidHlwZTsKKworLyoqIFRlayBSZXBvcnQgTW9kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fdGVrX3JlcG9ydF9tb2RlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19SRVBPUlRfTU9ERV9GUkFNRV9BTElHTkVEX1NJTkdMRV9QUklPUklUWSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IEZyYW1lIEFsaWduZWQgKFNpbmdsZSBQcmlvcml0eSkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19SRVBPUlRfTU9ERV9NVUxUSV9QUklPUklUWTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTksICAgICAgICAgICAvKio8IE11bHRpLXByaW9yaXR5IDMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19SRVBPUlRfTU9ERV9NVUxUSV9QUklPUklUWTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjAsICAgICAgICAgICAvKio8IE11bHRpLXByaW9yaXR5IDQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19SRVBPUlRfTU9ERV9NVUxUSV9QUklPUklUWTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjQgICAgICAgICAgICAvKio8IE11bHRpLXByaW9yaXR5IDguICovCit9IGJjbW9sdF9lcG9uX29hbV90ZWtfcmVwb3J0X21vZGU7CisKKy8qKiBUZWsgRmVhdHVyZSBTZXQuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3Rla19mZWF0dXJlX3NldAoreworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfRkVBVFVSRV9TRVRfU1RBTkRBUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBTdGFuZGFyZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0ZFQVRVUkVfU0VUX0RQT0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgRFBvRS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0ZFQVRVUkVfU0VUX1NESyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgU0RLLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfRkVBVFVSRV9TRVRfWlRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsICAgICAgICAgICAgLyoqPCBaVEUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19GRUFUVVJFX1NFVF9LT1JFQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCAgICAgICAgICAgICAvKio8IEtvcmVhLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX2ZlYXR1cmVfc2V0OworCisvKiogTWNhc3QgU25vb3AgTW9kZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fbWNhc3Rfc25vb3BfbW9kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9NQ0FTVF9TTk9PUF9NT0RFX0lHTVBfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBJR01QIE1vZGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX01DQVNUX1NOT09QX01PREVfSUdNUF9WM01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IElHTVAgVjMgTW9kZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fTUNBU1RfU05PT1BfTU9ERV9JR01QX0NPTVBBVF9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgSUdNUCBDb21wYXQgTW9kZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fTUNBU1RfU05PT1BfTU9ERV9JR01QX01MRF9DT01QQVRfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgSUdNUCBNbGQgQ29tcGF0IE1vZGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX01DQVNUX1NOT09QX01PREVfTUxEX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNSwgICAgICAgICAgICAvKio8IE1sZCBNb2RlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9NQ0FTVF9TTk9PUF9NT0RFX01MRF9WMk1PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsICAgICAgICAgICAgLyoqPCBNbGQgVjIgTW9kZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fTUNBU1RfU05PT1BfTU9ERV9NTERfQ09NUEFUX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAgICAgICAgIC8qKjwgTWxkIENvbXBhdCBNb2RlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9NQ0FTVF9TTk9PUF9NT0RFX1NOT09QX01PREVfRElTQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgICAgICAgICAgLyoqPCBTbm9vcCBNb2RlIERpc2FibGVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9NQ0FTVF9TTk9PUF9NT0RFX1NOT09QX01PREVfSU5WQUxJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1NSAgICAgICAgICAgLyoqPCBTbm9vcCBNb2RlIEludmFsaWQuICovCit9IGJjbW9sdF9lcG9uX29hbV9tY2FzdF9zbm9vcF9tb2RlOworCisvKiogSVBNQyBHbG9iYWwgT3B0aW9ucy4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1faXBtY19nbG9iYWxfb3B0aW9ucworeworICAgIEJDTU9MVF9FUE9OX09BTV9JUE1DX0dMT0JBTF9PUFRJT05TX0lQTUNfT1BUSU9OX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBJcG1jIE9wdGlvbiBOb25lLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9JUE1DX0dMT0JBTF9PUFRJT05TX0lQTUNfT1BUSU9OX0RJU0NBUkRfVU5LTk9XTiAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBJcG1jIE9wdGlvbiBEaXNjYXJkIFVua25vd24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX0lQTUNfR0xPQkFMX09QVElPTlNfSVBNQ19PUFRJT05fQUxMT1dfTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IElwbWMgT3B0aW9uIEFsbG93IE51bGwuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0lQTUNfR0xPQkFMX09QVElPTlNfSVBNQ19PUFRJT05fQUxMT1dfQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMyAgICAgICAgICAgICAvKio8IElwbWMgT3B0aW9uIEFsbG93IEFsbC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2lwbWNfZ2xvYmFsX29wdGlvbnM7CisKKy8qKiBGb3J3YXJkIFF1YWxpZmllci4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fZm9yd2FyZF9xdWFsaWZpZXIKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fRk9SV0FSRF9RVUFMSUZJRVJfUVVBTF9CWV9MMkRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgUXVhbCBCeSBMMiBEYS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fRk9SV0FSRF9RVUFMSUZJRVJfUVVBTF9CWV9WSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgUXVhbCBCeSBWaWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0ZPUldBUkRfUVVBTElGSUVSX1FVQUxfQllfSVBfREEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwgICAgICAgICAgICAvKio8IFF1YWwgQnkgSVAgRGEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0ZPUldBUkRfUVVBTElGSUVSX1FVQUxfQllfSVBfU0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOCwgICAgICAgICAgICAvKio8IFF1YWwgQnkgSVAgU2EuICovCisgICAgQkNNT0xUX0VQT05fT0FNX0ZPUldBUkRfUVVBTElGSUVSX1FVQUxfQllfTExJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTYgICAgICAgICAgICAvKio8IFF1YWwgQnkgTExJRC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2ZvcndhcmRfcXVhbGlmaWVyOworCisvKiogVGVrIEhvbGRvdmVyIEZsYWdzLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV90ZWtfaG9sZG92ZXJfZmxhZ3MKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0hPTERPVkVSX0ZMQUdTX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX09BTV9URUtfSE9MRE9WRVJfRkxBR1NfUkVfUkFOR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMSAgICAgICAgLyoqPCBTZW5kIHJlZ2lzdGVyIHJlcXVlc3QgdG8gcmUtcmFuZ2UgT05VLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX2hvbGRvdmVyX2ZsYWdzOworCisvKiogTURJIE1vZGUgCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fbWRpX21vZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fTURJX01PREVfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgTm9uZSAqLworICAgIEJDTU9MVF9FUE9OX09BTV9NRElfTU9ERV9BVVRPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBBdXRvICovCisgICAgQkNNT0xUX0VQT05fT0FNX01ESV9NT0RFX01BTlVBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IE1hbnVhbCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9NRElfTU9ERV9DUk9TU09WRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMgICAgICAgICAgICAgLyoqPCBDcm9zc292ZXIgKi8KK30gYmNtb2x0X2Vwb25fb2FtX21kaV9tb2RlOworCisvKiogVGVrIElHTVAgRm9yd2FyZGluZyBRdWFsaWZlci4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfZm9yd2FyZGluZ19xdWFsaWZlcgoreworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfSUdNUF9GT1JXQVJESU5HX1FVQUxJRkVSX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19JR01QX0ZPUldBUkRJTkdfUVVBTElGRVJfTDJEQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAxLCAgICAgICAvKio8IEwyIERBLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfSUdNUF9GT1JXQVJESU5HX1FVQUxJRkVSX1ZJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMiwgICAgICAgLyoqPCBWaWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19JR01QX0ZPUldBUkRJTkdfUVVBTElGRVJfSVBfREEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDA0LCAgICAgICAvKio8IElQIERBLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfSUdNUF9GT1JXQVJESU5HX1FVQUxJRkVSX0lQX1NBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwOCwgICAgICAgLyoqPCBJUCBTQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0lHTVBfRk9SV0FSRElOR19RVUFMSUZFUl9MT0dJQ0FMX0xJTksgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMTAgICAgICAgIC8qKjwgTG9naWNhbCBMaW5rLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfZm9yd2FyZGluZ19xdWFsaWZlcjsKKworLyoqIFRlayBJR01QIFNub29waW5nIE9wdGlvbnMuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX29wdGlvbnMKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0lHTVBfU05PT1BJTkdfT1BUSU9OU19ESVNBQkxFX0RPV05TVFJFQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgRGlzYWJsZSBEb3duc3RyZWFtLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfSUdNUF9TTk9PUElOR19PUFRJT05TX0RJU0FCTEVfVVBTVFJFQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIgICAgICAgICAgICAgLyoqPCBEaXNhYmxlIFVwc3RyZWFtLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfc25vb3Bpbmdfb3B0aW9uczsKKworLyoqIFNsZWVwIE9wdGlvbnMuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3NsZWVwX29wdGlvbnMKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fU0xFRVBfT1BUSU9OU19OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIEJDTU9MVF9FUE9OX09BTV9TTEVFUF9PUFRJT05TX1RYX09OTFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMSwgICAgICAgLyoqPCBUeCBPbmx5LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TTEVFUF9PUFRJT05TX1JYX0xBU0VSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMiwgICAgICAgLyoqPCBSeCBMYXNlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fU0xFRVBfT1BUSU9OU19TRVJERVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDQgICAgICAgIC8qKjwgU2VyRGVzLiAqLworfSBiY21vbHRfZXBvbl9vYW1fc2xlZXBfb3B0aW9uczsKKworLyoqIEllZWUgUmVnaXN0ZXIgRmxhZ3MuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2llZWVfcmVnaXN0ZXJfZmxhZ3MKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fSUVFRV9SRUdJU1RFUl9GTEFHU19SRVJFR0lTVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgUmVyZWdpc3Rlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fSUVFRV9SRUdJU1RFUl9GTEFHU19ERVJFR0lTVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgRGVyZWdpc3Rlci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fSUVFRV9SRUdJU1RFUl9GTEFHU19BQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgQWNrLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9JRUVFX1JFR0lTVEVSX0ZMQUdTX05BQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQgICAgICAgICAgICAgLyoqPCBOYWNrLiAqLworfSBiY21vbHRfZXBvbl9vYW1faWVlZV9yZWdpc3Rlcl9mbGFnczsKKworLyoqIEllZWUgUmVnaXN0ZXIgQWNrIEZsYWdzLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9pZWVlX3JlZ2lzdGVyX2Fja19mbGFncworeworICAgIEJDTU9MVF9FUE9OX09BTV9JRUVFX1JFR0lTVEVSX0FDS19GTEFHU19OQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBOYWNrLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9JRUVFX1JFR0lTVEVSX0FDS19GTEFHU19BQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgICAgICAgICAgICAgLyoqPCBBY2suICovCit9IGJjbW9sdF9lcG9uX29hbV9pZWVlX3JlZ2lzdGVyX2Fja19mbGFnczsKKworLyoqIFRlayBGaWxlIFRyYW5zZmVyIEVycm9yLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV90ZWtfZmlsZV90cmFuc2Zlcl9lcnJvcgoreworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfRklMRV9UUkFOU0ZFUl9FUlJPUl9PSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBPay4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0ZJTEVfVFJBTlNGRVJfRVJST1JfVU5ERUZJTkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgVW5kZWZpbmVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfRklMRV9UUkFOU0ZFUl9FUlJPUl9OT1RfRk9VTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBOb3QgRm91bmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19GSUxFX1RSQU5TRkVSX0VSUk9SX05PX0FDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IE5vIEFjY2Vzcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0ZJTEVfVFJBTlNGRVJfRVJST1JfRlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgRnVsbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0ZJTEVfVFJBTlNGRVJfRVJST1JfSUxMRUdBTF9PUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgSWxsZWdhbCBPcC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0ZJTEVfVFJBTlNGRVJfRVJST1JfVU5LTk9XTl9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA2LCAgICAgICAgICAgIC8qKjwgVW5rbm93biBJRC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0ZJTEVfVFJBTlNGRVJfRVJST1JfQkFEX0JMT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA3LCAgICAgICAgICAgIC8qKjwgQmFkIEJsb2NrLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfRklMRV9UUkFOU0ZFUl9FUlJPUl9USU1FT1VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgsICAgICAgICAgICAgLyoqPCBUaW1lb3V0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfRklMRV9UUkFOU0ZFUl9FUlJPUl9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDkgICAgICAgICAgICAgLyoqPCBCdXN5LiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX2ZpbGVfdHJhbnNmZXJfZXJyb3I7CisKKy8qKiBUZWsgRmlsZSBUeXBlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV90ZWtfZmlsZV90eXBlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19GSUxFX1RZUEVfQk9PVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IEJvb3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RFS19GSUxFX1RZUEVfQVBQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IEFwcC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVEVLX0ZJTEVfVFlQRV9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgQ29uZmlnLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9URUtfRklMRV9UWVBFX0RJQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMgICAgICAgICAgICAgLyoqPCBEaWFnLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX2ZpbGVfdHlwZTsKKworLyoqIFBNQyBPcCBDb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9wbWNfb3BfY29kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9TRVRfQUxBUk1fVEhSRVNIT0xEUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExMiwgICAgICAgICAgLyoqPCBTZXQgQWxhcm0gVGhyZXNob2xkcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfUkVfUkVHSVNURVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMTMsICAgICAgICAgIC8qKjwgUmUgUmVnaXN0ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX0ZJUk1XQVJFX1VQREFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTE0LCAgICAgICAgICAvKio8IEZpcm13YXJlIFVwZGF0ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfR0VUX09OVV9WRVJTSU9OU19SRVFVRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMTUsICAgICAgICAgIC8qKjwgR2V0IE9OVSBWZXJzaW9ucyBSZXF1ZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9HRVRfT05VX1ZFUlNJT05TX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExNiwgICAgICAgICAgLyoqPCBHZXQgT05VIFZlcnNpb25zIFJlc3BvbnNlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9SRU1PVEVfQUNDRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDExNywgICAgICAgICAgLyoqPCBSZW1vdGUgQWNjZXNzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9BQ0tOT1dMRURHRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyOCwgICAgICAgICAgLyoqPCBBY2tub3dsZWRnZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfQVVUSEVOVElDQVRFX09OVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMjksICAgICAgICAgIC8qKjwgQXV0aGVudGljYXRlIE9OVS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfVFVSTl9PTlVfSU5fVE9fT0ZGX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzAsICAgICAgICAgIC8qKjwgVHVybiBPTlUgSW4gVG8gT2ZmIE1vZGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX0lHTVBfU05PT1BJTkdfUEFDS0VUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMxLCAgICAgICAgICAvKio8IElHTVAgU25vb3BpbmcgUGFja2V0cy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfVU5JX1BPUlRfU1RBVFVTX1JFUVVFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzIsICAgICAgICAgIC8qKjwgVU5JIFBvcnQgU3RhdHVzIFJlcXVlc3QuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1VOSV9QT1JUX1NUQVRVU19SRVNQT05TRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTMzLCAgICAgICAgICAvKio8IFVOSSBQb3J0IFN0YXR1cyBSZXNwb25zZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfVU5JX1BPUlRfQ09ORklHVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzQsICAgICAgICAgIC8qKjwgVU5JIFBvcnQgQ29uZmlndXJlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9FTkNSWVBUSU9OX0VOQUJMRV9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzNSwgICAgICAgICAgLyoqPCBFbmNyeXB0aW9uIEVuYWJsZSBEaXNhYmxlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9FTkNSWVBUSU9OX0tFWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzNiwgICAgICAgICAgLyoqPCBFbmNyeXB0aW9uIEtleS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfVEhSRVNIT0xEX1JFUE9SVF9WQUxVRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzcsICAgICAgICAgIC8qKjwgVGhyZXNob2xkIFJlcG9ydCBWYWx1ZXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1BNQ19PUF9DT0RFX1BIWV9MT09QX0JBQ0tfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTM4LCAgICAgICAgICAvKio8IFBIWSBMb29wIEJhY2sgQ29udHJvbC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUE1DX09QX0NPREVfUElOR19SRVFVRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzksICAgICAgICAgIC8qKjwgUGluZyBSZXF1ZXN0LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9QSU5HX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0MCwgICAgICAgICAgLyoqPCBQaW5nIFJlc3BvbnNlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QTUNfT1BfQ09ERV9NQUdJQ19OVU1CRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1NSAgICAgICAgICAgLyoqPCBNYWdpYyBOdW1iZXIuICovCit9IGJjbW9sdF9lcG9uX29hbV9wbWNfb3BfY29kZTsKKworLyoqIFBNQyBGaWxlIE9wLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9vcAoreworICAgIEJDTU9MVF9FUE9OX09BTV9QTUNfRklMRV9PUF9IRUFEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBIZWFkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QTUNfRklMRV9PUF9EQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1NiwgICAgICAgICAgLyoqPCBEYXRhLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QTUNfRklMRV9PUF9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUxMiwgICAgICAgICAgLyoqPCBFbmQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1BNQ19GSUxFX09QX0lEWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzY4LCAgICAgICAgICAvKio8IEluZGV4LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QTUNfRklMRV9PUF9BQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI5MTg0ICAgICAgICAgLyoqPCBBY2suICovCit9IGJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9vcDsKKworLyoqIFBNQyBFcnJvciBDb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9wbWNfZXJyb3JfY29kZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9QTUNfRVJST1JfQ09ERV9PSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBPSy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUE1DX0VSUk9SX0NPREVfQkFEX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNTM2LCAgICAgICAgIC8qKjwgQmFkIFNpemUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1BNQ19FUlJPUl9DT0RFX0JBRF9CTE9DS19JTkRFWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjA0OCwgICAgICAgICAvKio8IEJhZCBCbG9jayBJbmRleC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUE1DX0VSUk9SX0NPREVfQkFEX0NSQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMzA0LCAgICAgICAgIC8qKjwgQmFkIENSQy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUE1DX0VSUk9SX0NPREVfVU5LTk9XTl9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzNTg0LCAgICAgICAgIC8qKjwgVW5rbm93biBUeXBlLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9QTUNfRVJST1JfQ09ERV9OT19IRUFERVJfUkVDRUlWRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQzNTIsICAgICAgICAgLyoqPCBObyBIZWFkZXIgUmVjZWl2ZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fUE1DX0VSUk9SX0NPREVfTk9UX1NUQVJURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0NjA4ICAgICAgICAgIC8qKjwgTm90IFN0YXJ0ZWQuICovCit9IGJjbW9sdF9lcG9uX29hbV9wbWNfZXJyb3JfY29kZTsKKworLyoqIE9OVSBNYXN0ZXIgUHJvdG9jb2wuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcHJvdG9jb2wKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9QUk9UT0NPTF9QSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgUGluZy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9QUk9UT0NPTF9FTkNBUFNVTEFURURfRlJBTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgRW5jYXBzdWxhdGVkIEZyYW1lLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX1BST1RPQ09MX09BTV9DT05URU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIsICAgICAgICAgICAgLyoqPCBPQU0gQ29udGVudC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9QUk9UT0NPTF9CUk9BRENPTV9TREsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzLCAgICAgICAgICAgIC8qKjwgQnJvYWRjb20gU0RLLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX1BST1RPQ09MX1JFR0lTVEVSRURfT0FNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQsICAgICAgICAgICAgLyoqPCBSZWdpc3RlcmVkIE9BTS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9QUk9UT0NPTF9NQVNURVJfQ09NTVVOSUNBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgTWFzdGVyIENvbW11bmljYXRpb24uICovCisgICAgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfUFJPVE9DT0xfTUFTVEVSX1BST1RPQ09MX1RFS19VTktOT1dOICAgICAgICAgICAgICAgICAgICAgICAgID0gMzI3NjYgICAgICAgICAvKio8IE1hc3RlciBQcm90b2NvbCBUZWsgVW5rbm93bi4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcHJvdG9jb2w7CisKKy8qKiBPTlUgTWFzdGVyIFBpbmcgRmxhZ3MuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcGluZ19mbGFncworeworICAgIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX1BJTkdfRkxBR1NfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisgICAgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfUElOR19GTEFHU19TQVRJU0ZJRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAxLCAgICAgICAvKio8IFNhdGlzZmllZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9QSU5HX0ZMQUdTX1BBVVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwMDBVICAgICAgIC8qKjwgUGF1c2UuICovCit9IGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3BpbmdfZmxhZ3M7CisKKy8qKiBNYXN0ZXIgRW5kIFBvaW50IFR5cGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9lbmRfcG9pbnRfdHlwZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9NQVNURVJfRU5EX1BPSU5UX1RZUEVfT05VICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBPTlUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX01BU1RFUl9FTkRfUE9JTlRfVFlQRV9PTlVfTUFTVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IE9OVSBNYXN0ZXIuICovCisgICAgQkNNT0xUX0VQT05fT0FNX01BU1RFUl9FTkRfUE9JTlRfVFlQRV9PTFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAvKio8IE9MVC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9lbmRfcG9pbnRfdHlwZTsKKworLyoqIE9OVSBNYXN0ZXIgQ29tbXVuaWNhdGlvbiBUeXBlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW11bmljYXRpb25fdHlwZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1VTklDQVRJT05fVFlQRV9DT01NQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBDb21tYW5kLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1VTklDQVRJT05fVFlQRV9SRVNQT05TRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEyOCAgICAgICAgICAgLyoqPCBSZXNwb25zZS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbXVuaWNhdGlvbl90eXBlOworCisvKiogT05VIE1hc3RlciBDb21tYW5kIElELiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmRfaWQKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX1RFUk1JTkFUT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgVGVybWluYXRvci4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0VOQUJMRV9PTlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgRW5hYmxlIE9OVS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0RJU0FCTEVfT05VICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgRGlzYWJsZSBPTlUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9HRVRfT05VX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IEdldCBPTlUgU3RhdGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfQ09NTUFORF9JRF9HRVRfT0FNX1JFR0lTVFJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMjU3LCAgICAgICAgICAvKio8IEdldCBPQU0gUmVnaXN0cmF0aW9uLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfU0VUX09BTV9SRUdJU1RSQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1OCwgICAgICAgICAgLyoqPCBTZXQgT0FNIFJlZ2lzdHJhdGlvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9DT01NQU5EX0lEX0dFVF9ORUdPVElBVEVEX09BTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyNTksICAgICAgICAgIC8qKjwgR2V0IE5lZ290aWF0ZWQgT0FNLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX0NPTU1BTkRfSURfU0VUX05FR09USUFURURfT0FNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI2MCAgICAgICAgICAgLyoqPCBTZXQgTmVnb3RpYXRlZCBPQU0uICovCit9IGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmRfaWQ7CisKKy8qKiBPQU0gUmVnaXN0cmF0aW9uIEFjdGlvbi4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb24KK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fQ09OVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgRG8gbm90IG1vZGlmeSB0aGUgcmVnaXN0cmF0aW9uIHN0YXRlOyBwcm92aWRlIG1vcmUgcXVhbGlmaWVycy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgU2V0IHRoZSByZWdpc3RyYXRpb24gc3RhdGUgdG8gcmVnaXN0ZXJlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT0FNX1JFR0lTVFJBVElPTl9BQ1RJT05fVU5SRUdJU1RFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgU2V0IHRoZSByZWdpc3RyYXRpb24gc3RhdGUgdG8gbm90IHJlZ2lzdGVyZWQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09BTV9SRUdJU1RSQVRJT05fQUNUSU9OX1JFR0lTVEVSX0FORF9DT05USU5VRSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTI5LCAgICAgICAgICAvKio8IFNldCB0aGUgcmVnaXN0cmF0aW9uIHN0YXRlIHRvIHJlZ2lzdGVyZWQsIGJ1dCBhbGxvdyBmb3IgZnVydGhlciBxdWFsaWZpZXJzLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHSVNUUkFUSU9OX0FDVElPTl9VTlJFR0lTVEVSX0FORF9DT05USU5VRSAgICAgICAgICAgICAgICAgICAgICAgICA9IDEzMCAgICAgICAgICAgLyoqPCBTZXQgdGhlIHJlZ2lzdHJhdGlvbiBzdGF0ZSB0byBub3QgcmVnaXN0ZXJlZCwgYnV0IGFsbG93IGZvciBmdXJ0aGVyIHF1YWxpZmllcnMuICovCit9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbjsKKworLyoqIE9BTSBSZWcgSW5mbyBUeXBlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdHlwZQoreworICAgIEJDTU9MVF9FUE9OX09BTV9PQU1fUkVHX0lORk9fVFlQRV9WRU5ET1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDI1NCAgICAgICAgICAgLyoqPCBWZW5kb3IuICovCit9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdHlwZTsKKworLyoqIE1hc3RlciBDb250ZXh0IFR5cGUuIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3R5cGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fTUFTVEVSX0NPTlRFWFRfVFlQRV9PTlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgT05VLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9NQVNURVJfQ09OVEVYVF9UWVBFX05FVFdPUktfUE9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBOZXR3b3JrIFBvbi4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fTUFTVEVSX0NPTlRFWFRfVFlQRV9MSU5LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgTGluay4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fTUFTVEVSX0NPTlRFWFRfVFlQRV9VU0VSX1BPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzICAgICAgICAgICAgIC8qKjwgVXNlciBQb3J0LiAqLworfSBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdHlwZTsKKworLyoqIENUQyBWZXJzaW9uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX2N0Y192ZXJzaW9uCit7CisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19WRVJTSU9OX0xBVEVTVF9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IExhdGVzdCBTdXBwb3J0ZWQgVmVyc2lvbiwgY3VycmVudGx5LCAgSXQncyBDVEMgMi4xLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfVkVSU0lPTl9DVEMxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBDVEMgMS4wICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19WRVJTSU9OX0NUQzEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTksICAgICAgICAgICAvKio8IENUQyAxLjMgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZFUlNJT05fQ1RDMjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAzMiwgICAgICAgICAgIC8qKjwgQ1RDIDIuMCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfVkVSU0lPTl9DVEMyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMzLCAgICAgICAgICAgLyoqPCBDVEMgMi4xICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19WRVJTSU9OX0NUQzMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNDgsICAgICAgICAgICAvKio8IENUQyAzLjAgKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fQ1RDX1ZFUlNJT05fQ1VDMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOTMsICAgICAgICAgIC8qKjwgQ1VDIDEuMCAqLworICAgIEJDTU9MVF9FUE9OX09BTV9DVENfVkVSU0lPTl9DVUMyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5NCwgICAgICAgICAgLyoqPCBDVUMgMi4wICovCisgICAgQkNNT0xUX0VQT05fT0FNX0NUQ19WRVJTSU9OX0NVQzMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTk1ICAgICAgICAgICAvKio8IENVQyAzLjAgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y192ZXJzaW9uOworCisvKiogT05VIE1hc3RlciBSZXNwb25zZSBDb2RlLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3Jlc3BvbnNlX2NvZGUKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9SRVNQT05TRV9DT0RFX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgU3VjY2Vzcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9SRVNQT05TRV9DT0RFX05PVF9TVVBQT1JURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8qKjwgTm90IFN1cHBvcnRlZC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9SRVNQT05TRV9DT0RFX0JBRF9QQVJBTUVURVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgQmFkIFBhcmFtZXRlcnMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX09OVV9NQVNURVJfUkVTUE9OU0VfQ09ERV9OT19SRVNPVVJDRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IE5vIFJlc291cmNlcy4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9SRVNQT05TRV9DT0RFX0hBUkRXQVJFX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgSGFyZHdhcmUgRmFpbHVyZS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fT05VX01BU1RFUl9SRVNQT05TRV9DT0RFX0JBRF9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA1LCAgICAgICAgICAgIC8qKjwgQmFkIElELiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PTlVfTUFTVEVSX1JFU1BPTlNFX0NPREVfU1lTVEVNX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDYgICAgICAgICAgICAgLyoqPCBTeXN0ZW0gQnVzeS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcmVzcG9uc2VfY29kZTsKKworLyoqIE9OVSBzdGF0ZS4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fb251X3N0YXRlCit7CisgICAgQkNNT0xUX0VQT05fT0FNX09OVV9TVEFURV9ESVNBQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwgICAgICAgICAgICAvKio8IERpc2FibGVkLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9PTlVfU1RBVEVfRU5BQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEgICAgICAgICAgICAgLyoqPCBFbmFibGVkLiAqLworfSBiY21vbHRfZXBvbl9vYW1fb251X3N0YXRlOworCisvKiogTWRpIENyb3Nzb3Zlci4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fbWRpX2Nyb3Nzb3ZlcgoreworICAgIEJDTU9MVF9FUE9OX09BTV9NRElfQ1JPU1NPVkVSX09BTV9NRElfQVVUTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBPQU0gTWRpIEF1dG8uICovCisgICAgQkNNT0xUX0VQT05fT0FNX01ESV9DUk9TU09WRVJfT0FNX01ESSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IE9BTSBNZGkuICovCisgICAgQkNNT0xUX0VQT05fT0FNX01ESV9DUk9TU09WRVJfT0FNX01ESV9YICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAvKio8IE9BTSBNZGkgWC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX21kaV9jcm9zc292ZXI7CisKKy8qKiBTZG0gU3RhdC4gCisgKi8KK3R5cGVkZWYgZW51bSBiY21vbHRfZXBvbl9vYW1fc2RtX3N0YXQKK3sKKyAgICBCQ01PTFRfRVBPTl9PQU1fU0RNX1NUQVRfUVVBTlRJWkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLCAgICAgICAgICAgIC8qKjwgUXVhbnRpemVyLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9TRE1fU1RBVF9BTVBMSVRVREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBBbXBsaXR1ZGUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1NETV9TVEFUX1BIQVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiAgICAgICAgICAgICAvKio8IFBoYXNlLiAqLworfSBiY21vbHRfZXBvbl9vYW1fc2RtX3N0YXQ7CisKKy8qKiBUTFMgSGFzaCBBbGdvcml0aG0uIAorICovCit0eXBlZGVmIGVudW0gYmNtb2x0X2Vwb25fb2FtX3Rsc19oYXNoX2FsZ29yaXRobQoreworICAgIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFTSF9BTEdPUklUSE1fTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBOb25lLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFTSF9BTEdPUklUSE1fTUQ1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsICAgICAgICAgICAgLyoqPCBNRDUuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RMU19IQVNIX0FMR09SSVRITV9TSEExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwgICAgICAgICAgICAvKio8IFNIQTEuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RMU19IQVNIX0FMR09SSVRITV9TSEEyMjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMywgICAgICAgICAgICAvKio8IFNIQTIyNC4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX0hBU0hfQUxHT1JJVEhNX1NIQTI1NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0LCAgICAgICAgICAgIC8qKjwgU0hBMjU2LiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9UTFNfSEFTSF9BTEdPUklUSE1fU0hBMzg0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDUsICAgICAgICAgICAgLyoqPCBTSEEzODQuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RMU19IQVNIX0FMR09SSVRITV9TSEE1MTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNiAgICAgICAgICAgICAvKio8IFNIQTUxMi4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rsc19oYXNoX2FsZ29yaXRobTsKKworLyoqIFRMUyBTaWduYXR1cmUgQWxnb3JpdGhtLiAKKyAqLwordHlwZWRlZiBlbnVtIGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FsZ29yaXRobQoreworICAgIEJDTU9MVF9FUE9OX09BTV9UTFNfU0lHTkFUVVJFX0FMR09SSVRITV9BTk9OWU1PVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsICAgICAgICAgICAgLyoqPCBBbm9ueW1vdXMuICovCisgICAgQkNNT0xUX0VQT05fT0FNX1RMU19TSUdOQVRVUkVfQUxHT1JJVEhNX1JTQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgICAgICAgICAgICAvKio8IFJTQS4gKi8KKyAgICBCQ01PTFRfRVBPTl9PQU1fVExTX1NJR05BVFVSRV9BTEdPUklUSE1fRFNBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8qKjwgRFNBLiAqLworICAgIEJDTU9MVF9FUE9OX09BTV9UTFNfU0lHTkFUVVJFX0FMR09SSVRITV9FQ0RTQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMgICAgICAgICAgICAgLyoqPCBFQ0RTQS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYWxnb3JpdGhtOworCisvKiogQmluYXJ5IEVudHJ5IENWSUQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X2N2aWQKK3sKKyAgICB1aW50MTZfdCBjdmlkOyAgLyoqPCBDVklELiAqLworfSBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X2N2aWQ7CisKKy8qKiBCaW5hcnkgRW50cnkgTUFDLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9tYWMKK3sKKyAgICB1aW50MTZfdCBzd2l0Y2hpbmdfZG9tYWluOyAgLyoqPCBTd2l0Y2hpbmcgRG9tYWluLiAqLworICAgIGJjbW9zX21hY19hZGRyZXNzIG1hYzsgICAgICAvKio8IE1BQy4gKi8KKyAgICB1aW50OF90IGxpbmtfaWQ7ICAgICAgICAgICAgLyoqPCBMaW5rIElkLiAqLworfSBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X21hYzsKKworLyoqIEJpbmFyeSBFbnRyeSBQcm9ncmFtbWFibGUuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3Byb2dyYW1tYWJsZQoreworICAgIHVpbnQzMl90IHByb2dyYW1tYWJsZV9maWVsZDA7ICAgLyoqPCBQcm9ncmFtbWFibGUgRmllbGQgMC4gKi8KKyAgICB1aW50MzJfdCBwcm9ncmFtbWFibGVfZmllbGQxOyAgIC8qKjwgUHJvZ3JhbW1hYmxlIEZpZWxkIDEuICovCit9IGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfcHJvZ3JhbW1hYmxlOworCisvKiogQmluYXJ5IEVudHJ5IFNTTSBJUC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfc3NtX2lwCit7CisgICAgdWludDE2X3Qgc3dpdGNoaW5nX2RvbWFpbjsgICAgICAvKio8IFN3aXRjaGluZyBEb21haW4uICovCisgICAgdWludDE2X3Qgc3NtX3NvdXJjZV9pZDsgICAgICAgICAvKio8IFNTTSBTb3VyY2UgSUQuICovCisgICAgYmNtb3NfaXB2NF9hZGRyZXNzIGlwYWRkcmVzczsgICAvKio8IElQIEFkZHJlc3MuICovCit9IGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfc3NtX2lwOworCisvKiogQmluYXJ5IEVudHJ5IFNWTEFOICsgQ1ZMQU4uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3N2bGFuX3BsdXNfY3ZsYW4KK3sKKyAgICB1aW50MTZfdCBzdmlkOyAgLyoqPCBTVklELiAqLworICAgIHVpbnQxNl90IGN2aWQ7ICAvKio8IENWSUQuICovCit9IGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfc3ZsYW5fcGx1c19jdmxhbjsKKworLyoqIFBlci1jaGFubmVsIGNvbW1hbmQgb3B0aW9uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX29wdGlvbgoreworICAgIHVpbnQ4X3QgY2hhbm5lbF9pZDsgLyoqPCBDaGFubmVsIGluZGV4ICovCisgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3JlcXVlc3Rfb3B0aW9uIG9wdGlvbl9jb2RlOyAgICAvKio8IE9wZXJhdGlvbiBjb2RlICovCit9IGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfb3B0aW9uOworCisvKiogUGVyLWNoYW5uZWwgcmVzdWx0cyAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9yZXN1bHQKK3sKKyAgICB1aW50OF90IGNoYW5uZWxfaWQ7IC8qKjwgQ2hhbm5lbCBpbmRleCAqLworICAgIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXN1bHRfY29kZSByZXN1bHRfY29kZTsgICAvKio8IE9wZXJhdGlvbiByZXN1bHQgY29kZSAqLworfSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdDsKKworLyoqIENNQyBDbGFzc2lmaWVyIGNvbmZpZ3VyYXRpb24gZGF0YSBmb3JtYXQgCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19jbGFzc2lmaWVyX2NvbmZpZ19kYXRhCit7CisgICAgdWludDMyX3Qgc3ZjX2Zsb3dfaWQ7ICAgICAgICAgICAvKio8IFNlcnZpY2UgRmxvdyBJRCAqLworICAgIHVpbnQzMl90IGNsYXNzaWZpZXJfaWQ7ICAgICAgICAgLyoqPCBDbGFzc2lmaWVyIElEICovCisgICAgdWludDhfdCBkaXJlY3Rpb247ICAgICAgICAgICAgICAvKio8IENsYXNzaWZpZXIgRGlyZWN0aW9uICgxID0gRG93bnN0cmVhbSwgMiA9IFVwc3RyZWFtKSAqLworICAgIHVpbnQ4X3Qgc3RhdGU7ICAgICAgICAgICAgICAgICAgLyoqPCBDbGFzc2lmaWVyIFN0YXRlICgxID0gQWN0aXZlLCAyID0gSW5hY3RpdmUpICovCisgICAgdWludDMyX3QgcHJpb3JpdHk7ICAgICAgICAgICAgICAvKio8IFJ1bGUgUHJpb3JpdHkgKDEuLjI1NSkgKi8KKyAgICB1aW50OF90IGlwdG9zX2xvdzsgICAgICAgICAgICAgIC8qKjwgTG93IHZhbHVlIG9mIElQIFRvUyByYW5nZSAqLworICAgIHVpbnQ4X3QgaXB0b3NfaGlnaDsgICAgICAgICAgICAgLyoqPCBIaWdoIHZhbHVlIG9mIElQIFRvUyByYW5nZSAqLworICAgIHVpbnQ4X3QgaXB0b3NfbWFzazsgICAgICAgICAgICAgLyoqPCBJUCBUb1MgTWFzayB2YWx1ZSAqLworICAgIHVpbnQzMl90IGlwcHJvdG87ICAgICAgICAgICAgICAgLyoqPCBJUCBQcm90b2NvbCB2YWx1ZSAqLworICAgIHVpbnQ4X3QgaXBhZGRyX3R5cGU7ICAgICAgICAgICAgLyoqPCBJUCBBZGRyZXNzIFR5cGUgKDAgPSBVbmtub3duLCAxID0gSVB2NCwgMiA9IElQdjYsIDMgPSBJUHY0eiwgNCA9IElQdjZ6LCAxNiA9IEROUykgKi8KKyAgICB1aW50OF90IGlwc3JjX2FkZHJfbGVuZ3RoOyAgICAgIC8qKjwgTGVuZ3RoIG9mIElQIFNvdXJjZSBBZGRyZXNzIGZpZWxkICovCisgICAgdWludDhfdCAqaXBzcmNfYWRkcjsgICAgICAgICAgICAvKio8IElQIFNvdXJjZSBBZGRyZXNzICovCisgICAgdWludDhfdCBpcHNyY19tYXNrX2xlbmd0aDsgICAgICAvKio8IExlbmd0aCBvZiBJUCBTb3VyY2UgTWFzayBmaWVsZCAqLworICAgIHVpbnQ4X3QgKmlwc3JjX21hc2s7ICAgICAgICAgICAgLyoqPCBJUCBTb3VyY2UgTWFzayAqLworICAgIHVpbnQ4X3QgaXBkc3RfYWRkcl9sZW5ndGg7ICAgICAgLyoqPCBMZW5ndGggb2YgSVAgRGVzdGluYXRpb24gQWRkcmVzcyBmaWVsZCAqLworICAgIHVpbnQ4X3QgKmlwZHN0X2FkZHI7ICAgICAgICAgICAgLyoqPCBJUCBEZXN0aW5hdGlvbiBBZGRyZXNzICovCisgICAgdWludDhfdCBpcGRzdF9tYXNrX2xlbmd0aDsgICAgICAvKio8IExlbmd0aCBvZiBJUCBEZXN0aW5hdGlvbiBNYXNrIGZpZWxkICovCisgICAgdWludDhfdCAqaXBkc3RfbWFzazsgICAgICAgICAgICAvKio8IElQIERlc3RpbmF0aW9uIE1hc2sgKi8KKyAgICB1aW50MzJfdCBzcmNfcG9ydF9zdGFydDsgICAgICAgIC8qKjwgVENQL1VEUCBTb3VyY2UgUG9ydCByYW5nZSBzdGFydCAqLworICAgIHVpbnQzMl90IHNyY19wb3J0X2VuZDsgICAgICAgICAgLyoqPCBUQ1AvVURQIFNvdXJjZSBQb3J0IHJhbmdlIGVuZCAqLworICAgIHVpbnQzMl90IGRzdF9wb3J0X3N0YXJ0OyAgICAgICAgLyoqPCBUQ1AvVURQIERlc3RpbmF0aW9uIFBvcnQgcmFuZ2Ugc3RhcnQgKi8KKyAgICB1aW50MzJfdCBkc3RfcG9ydF9lbmQ7ICAgICAgICAgIC8qKjwgVENQL1VEUCBEZXN0aW5hdGlvbiBQb3J0IHJhbmdlIGVuZCAqLworICAgIGJjbW9zX21hY19hZGRyZXNzIGRzdF9tYWNfYWRkcjsgLyoqPCBEZXN0aW5hdGlvbiBNQUMgQWRkcmVzcyAqLworICAgIGJjbW9zX21hY19hZGRyZXNzIGRzdF9tYWNfbWFzazsgLyoqPCBEZXN0aW5hdGlvbiBNQUMgTWFzayAqLworICAgIGJjbW9zX21hY19hZGRyZXNzIHNyY19tYWNfYWRkcjsgLyoqPCBTb3VyY2UgTUFDIEFkZHJlc3MgKi8KKyAgICB1aW50OF90IGwycHJvdG9fdHlwZTsgICAgICAgICAgIC8qKjwgVHlwZSBvZiBMMiBQcm90b2NvbCB0byBjbGFzc2lmeSBvbiAoMCA9IE5vbmUsIDEgPSBFdGhlcnR5cGUsIDIgPSBEU0FQLCAzID0gTUFDLCA0ID0gQWxsKSAqLworICAgIHVpbnQzMl90IGwycHJvdG9fdmFsdWU7ICAgICAgICAgLyoqPCBMMiBQcm90b2NvbCBWYWx1ZSAqLworICAgIHVpbnQzMl90IHVzZXJfcHJpb3JpdHlfbG93OyAgICAgLyoqPCA4MDIuMXEgQ09TIHJhbmdlLCBsb3cgdmFsdWUgKi8KKyAgICB1aW50MzJfdCB1c2VyX3ByaW9yaXR5X2hpZ2g7ICAgIC8qKjwgODAyLjFxIENPUyByYW5nZSwgaGlnaCB2YWx1ZSAqLworICAgIHVpbnQzMl90IHZsYW5faWQ7ICAgICAgICAgICAgICAgLyoqPCA4MDIuMXEgVkxBTiBJRCAqLworICAgIHVpbnQyNF90IGJpdG1hcDsgICAgICAgICAgICAgICAgLyoqPCBCaXRtYXAgaW5kaWNhdGluZyBleHBsaWNpdGx5IGNvbmZpZ3VyZWQgZmllbGRzICovCisgICAgdWludDMyX3QgZmxvd19sYWJlbDsgICAgICAgICAgICAvKio8IElQdjYgRmxvdyBMYWJlbCAgKi8KKyAgICB1aW50MzJfdCBjbWltOyAgICAgICAgICAgICAgICAgIC8qKjwgQ2FibGUgTW9kZW0gSW50ZXJmYWNlIE1hc2sgKi8KKyAgICB1aW50NjRfdCBwa3RfbWF0Y2hlczsgICAgICAgICAgIC8qKjwgQ291bnQgb2YgcGFja2V0cyBtYXRjaGluZyB0aGlzIGNsYXNzaWZpZXIgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2NsYXNzaWZpZXJfY29uZmlnX2RhdGE7CisKKy8qKiBDTUMgSW50ZXJmYWNlIFJlc3BvbnNlIGZvcm1hdCAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9kYXRhCit7CisgICAgdWludDE2X3QgaW50Zl9pbmRleDsgICAgICAgICAgICAgICAgLyoqPCBVbmlxdWUgaW50ZXJmYWNlIGluZGV4IHdpdGhpbiBDTUMgKi8KKyAgICB1aW50OF90IGludGZfZGVzY3JpcHRpb25fbGVuZ3RoOyAgICAvKio8IExlbmd0aCBvZiBJbnRlcmZhY2UgRGVzY3JpcHRpb24gZmllbGQgKi8KKyAgICB1aW50OF90ICppbnRmX2Rlc2NyaXB0aW9uOyAgICAgICAgICAvKio8IEludGVyZmFjZSBEZXNjcmlwdGlvbiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRmX3R5cGUgaW50Zl90eXBlOyAgIC8qKjwgSW50ZXJmYWNlIFR5cGUgKi8KKyAgICB1aW50OF90IGludGZfcGh5X2FkZHJfbGVuZ3RoOyAgICAgICAgICAgICAgICAgICAvKio8IExlbmd0aCBvZiBJbnRlcmZhY2UgUGh5c2ljYWwgQWRkcmVzcyBmaWVsZCAqLworICAgIHVpbnQ4X3QgKmludGZfcGh5X2FkZHI7ICAgICAgICAgLyoqPCBJbnRlcmZhY2UgUGh5c2ljYWwgQWRkcmVzcyBmaWVsZCAqLworICAgIHVpbnQ4X3QgaW50Zl9hbGlhc19uYW1lX2xlbmd0aDsgLyoqPCBMZW5ndGggb2YgSW50ZXJmYWNlIEFsaWFzIE5hbWUgKi8KKyAgICB1aW50OF90ICppbnRmX2FsaWFzX25hbWU7ICAgICAgIC8qKjwgSW50ZXJmYWNlIEFsaWFzIE5hbWUgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9kYXRhOworCisvKiogQ01DIGludGVyZmFjZSBzdGF0aXN0aWNzIGRhdGEgZm9ybWF0IAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50Zl9zdGF0c19kYXRhCit7CisgICAgdWludDE2X3QgaWZfaW5kZXg7ICAvKio8IGlmSW5kZXggb2YgbmV0d29yayBpbnRlcmZhY2UgKi8KKyAgICB1aW50MTZfdCBpZl9tdHU7ICAgIC8qKjwgaWZNdHUgb2YgbmV0d29yayBpbnRlcmZhY2UgKi8KKyAgICB1aW50MzJfdCBpZl9zcGVlZDsgIC8qKjwgaWZTcGVlZCBvZiBuZXR3b3JrIGludGVyZmFjZSAoaW4gTWJwcykgKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX3N0YXR1cyBpZl9hZG1pbl9zdGF0dXM7ICAvKio8IGlmQWRtaW5TdGF0dXMgb2YgbmV0d29yayBpbnRlcmZhY2UgKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX3N0YXR1cyBpZl9vcGVyX3N0YXR1czsgICAvKio8IGlmT3BlclN0YXR1cyBvZiBuZXR3b3JrIGludGVyZmFjZSAqLworICAgIHVpbnQzMl90IGlmX2xhc3RfY2hhbmdlOyAgICAgICAgICAgICAgICAvKio8IGlmTGFzdENoYW5nZSBvZiBuZXR3b3JrIGludGVyZmFjZSAqLworICAgIHVpbnQ2NF90IGlmX2hjaW5fb2N0ZXRzOyAgICAgICAgICAgICAgICAvKio8IENvdW50IG9mIFVTIEJ5dGVzIFJlY2VpdmVkICovCisgICAgdWludDY0X3QgaWZfaGNpbl91Y2FzdF9wa3RzOyAgICAgICAgICAgIC8qKjwgQ291bnQgb2YgVVMgVW5pY2FzdCBQa3RzIFJlY2VpdmVkICovCisgICAgdWludDY0X3QgaWZfaGNpbl9tdWx0aWNhc3RfcGt0czsgICAgICAgIC8qKjwgQ291bnQgb2YgVVMgTXVsdGljYXN0IFBrdHMgUmVjZWl2ZWQgKi8KKyAgICB1aW50NjRfdCBpZl9oY2luX2Jyb2FkY2FzdF9wa3RzOyAgICAgICAgLyoqPCBDb3VudCBvZiBVUyBCcm9hZGNhc3QgUGt0cyBSZWNlaXZlZCAqLworICAgIHVpbnQzMl90IGlmX2luX2Rpc2NhcmRzOyAgICAgICAgICAgICAgICAvKio8IENvdW50IG9mIFVTIFBrdHMgRGlzY2FyZGVkICovCisgICAgdWludDMyX3QgaWZfaW5fZXJyb3JzOyAgICAgICAgICAgICAgICAgIC8qKjwgQ291bnQgb2YgVVMgUGt0cyBSZWNlaXZlZCB3aXRoIEVycm9ycyAqLworICAgIHVpbnQzMl90IGlmX2luX3Vua25vd25fcHJvdG9zOyAgICAgICAgICAvKio8IENvdW50IG9mIFVTIFBrdHMgUmVjZWl2ZWQgb2YgVW5rbm93biBQcm90b2NvbCBUeXBlICovCisgICAgdWludDY0X3QgaWZfaGNvdXRfb2N0ZXRzOyAgICAgICAgICAgICAgIC8qKjwgQ291bnQgb2YgRFMgQnl0ZXMgVHJhbnNtaXR0ZWQgKi8KKyAgICB1aW50NjRfdCBpZl9oY291dF91Y2FzdF9wa3RzOyAgICAgICAgICAgLyoqPCBDb3VudCBvZiBEUyBVbmljYXN0IFBrdHMgVHJhbnNtaXR0ZWQgKi8KKyAgICB1aW50NjRfdCBpZl9oY291dF9tdWx0aWNhc3RfcGt0czsgICAgICAgLyoqPCBDb3VudCBvZiBEUyBNdWx0aWNhc3QgUGt0cyBUcmFuc21pdHRlZCAqLworICAgIHVpbnQ2NF90IGlmX2hjb3V0X2Jyb2FkY2FzdF9wa3RzOyAgICAgICAvKio8IENvdW50IG9mIERTIEJyb2FkY2FzdCBQa3RzIFRyYW5zbWl0dGVkICovCisgICAgdWludDMyX3QgaWZfb3V0X2Rpc2NhcmRzOyAgICAgICAgICAgICAgIC8qKjwgQ291bnQgb2YgRFMgUGt0cyBEaXNjYXJkZWQgKi8KKyAgICB1aW50MzJfdCBpZl9vdXRfZXJyb3JzOyAgICAgICAgICAgICAgICAgLyoqPCBDb3VudCBvZiBEUyBQa3RzIG5vdCB0cmFuc21pdHRlZCBkdWUgdG8gRXJyb3JzICovCisgICAgdWludDhfdCBpZl9saW5rX3VwX2Rvd25fdHJhcF9lbmFibGU7ICAgIC8qKjwgV2hldGhlciBsaW5rIHVwL2Rvd24gdHJhcHMgc2hvdWxkIGJlIGdlbmVyYXRlZCAqLworICAgIHVpbnQ4X3QgaWZfcHJvbWlzY3VvdXNfbW9kZTsgICAgICAgICAgICAvKio8IFdoZXRoZXIgaW50ZXJmYWNlIGlzIGluIHByb21pc2N1b3VzIG1vZGUgb3Igbm90ICovCisgICAgdWludDhfdCBpZl9jb25uZWN0b3JfcHJlc2VudDsgICAgICAgICAgIC8qKjwgV2hldGhlciBwaHlzaWNhbCBjb25uZWN0b3IgZXhpc3RzIG9uIGludGVyZmFjZSAqLworICAgIHVpbnQzMl90IGlmX2NvdW50ZXJfZGlzY29udGludWl0eV90aW1lOyAvKio8IFRpbWUgd2hlbiBhbnkgY291bnRlciBzdWZmZXJlZCBhIGRpc2NvbnRpbnVpdHkgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGZfc3RhdHNfZGF0YTsKKworLyoqIENNQyBTZXJ2aWNlIEZsb3cgY29uZmlndXJhdGlvbiBkYXRhIGZvcm1hdCAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX2NvbmZpZ19kYXRhCit7CisgICAgdWludDMyX3Qgc3ZjX2Zsb3dfaWQ7ICAgICAgICAgICAgICAgICAgIC8qKjwgU2VydmljZSBGbG93IElEICovCisgICAgdWludDE2X3Qgc2lkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgU2VydmljZSBJZGVudGlmaWVyIChTSUQpICovCisgICAgdWludDhfdCBkaXJlY3Rpb247ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRmxvdyBEaXJlY3Rpb24gKDEgPSBEb3duc3RyZWFtLCAyID0gVXBzdHJlYW0pICovCisgICAgdWludDhfdCBmbG93X3R5cGU7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRmxvdyBUeXBlICgxID0gUHJpbWFyeSwgMiA9IFNlY29uZGFyeSkgKi8KKyAgICB1aW50OF90IHFvc190eXBlOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBRb3MgU2V0IFR5cGUgKDAgPSBBY3RpdmUsIDEgPSBBZG1pdHRlZCwgMiA9IFByb3Zpc2lvbmVkKSAqLworICAgIHVpbnQzMl90IGNoYW5uZWxfc2V0X2lkOyAgICAgICAgICAgICAgICAvKio8IENoYW5uZWwgc2V0IGFzc29jaWF0ZWQgd2l0aCB0aGUgU2VydmljZSBGbG93ICovCisgICAgdWludDI0X3QgZHNpZDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRFNJRCBhc3NvY2lhdGVkIHdpdGggdGhlIFNlcnZpY2UgRmxvdyAqLworICAgIHVpbnQ4X3QgbWF4X3JlcXVlc3RzX3Blcl9zaWRfY2x1c3RlcjsgICAvKio8IE1heCByZXF1ZXN0cyBiZWZvcmUgU0lEIGNsdXN0ZXIgbXVzdCBzd2l0Y2ggKi8KKyAgICB1aW50MzJfdCBtYXhfYnl0ZXNfcGVyX3NpZF9jbHVzdGVyOyAgICAgLyoqPCBNYXggYnl0ZXMgdGhhdCBjYW4gYmUgb3V0c3RhbmRpbmcgZm9yIFNJRCBjbHVzdGVyICovCisgICAgdWludDMyX3QgdG90YWxfYnl0ZXNfcGVyX3NpZF9jbHVzdGVyOyAgIC8qKjwgVG90YWwgYnl0ZXMgdGhhdCBjYW4gYmUgcmVxdWVzdGVkIGZvciBTSUQgY2x1c3RlciAqLworICAgIHVpbnQxNl90IG1heF90aW1lX3Blcl9zaWRfY2x1c3RlcjsgICAgICAvKio8IE1heCB0aW1lIChpbiBtc2VjKSB0aGF0IGNhbiBiZSB1c2VkIGZvciBTSUQgY2x1c3RlciAqLworICAgIHVpbnQ4X3Qgc2VydmljZV9jbGFzc19sZW5ndGg7ICAgICAgICAgICAvKio8IExlbmd0aCBvZiBTZXJ2aWNlIENsYXNzIE5hbWUgKi8KKyAgICB1aW50OF90ICpzZXJ2aWNlX2NsYXNzOyAgICAgICAgICAgICAgICAgLyoqPCBTZXJ2aWNlIENsYXNzIE5hbWUgKi8KKyAgICB1aW50OF90IHByaW9yaXR5OyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFmZmljIFByaW9yaXR5ICgwLi43KSAqLworICAgIHVpbnQ4X3QgcmVzZXFfZHNpZF9zdXBwb3J0OyAgICAgICAgICAgICAvKio8IERTSUQgU3VwcG9ydCAoMSA9IFRydWUsIDIgPSBGYWxzZSwgMyA9IE4vQSkgKi8KKyAgICB1aW50MzJfdCBtYXhfcmF0ZTsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBNYXhpbXVtIFN1c3RhaW5lZCBUcmFmZmljIFJhdGUgaW4gYnBzICovCisgICAgdWludDMyX3QgbWF4X2J1cnN0OyAgICAgICAgICAgICAgICAgICAgIC8qKjwgTWF4aW11bSBUcmFmZmljIEJ1cnN0IGluIGJ5dGVzICovCisgICAgdWludDMyX3QgbWluX3JhdGU7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTWluaW11bSBHdWFyYW50ZWVkIFJhdGUgaW4gYnBzICovCisgICAgdWludDE2X3QgbWluX3BrdF9zaXplOyAgICAgICAgICAgICAgICAgIC8qKjwgQXNzdW1lZCBNaW5pbXVtIFBhY2tldCBzaXplIGluIGJ5dGVzICovCisgICAgdWludDE2X3QgYWN0aXZlX3RpbWVvdXQ7ICAgICAgICAgICAgICAgIC8qKjwgQWN0aXZlIFBhcmFtZXRlciBTZXQgdGltZW91dCBpbiBzZWNvbmRzICovCisgICAgdWludDE2X3QgYWRtaXR0ZWRfdGltZW91dDsgICAgICAgICAgICAgIC8qKjwgQWRtaXR0ZWQgUGFyYW1ldGVyIFNldCB0aW1lb3V0IGluIHNlY29uZHMgKi8KKyAgICB1aW50MTZfdCBtYXhfY29uY2F0X2J1cnN0OyAgICAgICAgICAgICAgLyoqPCBNYXhpbXVtIENvbmNhdGVuYXRlZCBCdXJzdCBpbiBieXRlcyAqLworICAgIHVpbnQ4X3Qgc2NoZWR1bGluZ190eXBlOyAgICAgICAgICAgICAgICAvKio8IFVwc3RyZWFtIFNjaGVkdWxpbmcgVHlwZSAqLworICAgIHVpbnQzMl90IG5vbV9wb2xsX2ludHZsOyAgICAgICAgICAgICAgICAvKio8IE5vbWluYWwgUG9sbGluZyBJbnRlcnZhbCBpbiB1c2VjICovCisgICAgdWludDMyX3QgdG9sX3BvbGxfaml0dGVyOyAgICAgICAgICAgICAgIC8qKjwgVG9sZXJhdGVkIFBvbGwgSml0dGVyIGluIHVzZWMgKi8KKyAgICB1aW50MTZfdCB1bnNvbF9ncmFudF9zaXplOyAgICAgICAgICAgICAgLyoqPCBVbnNvbGljaXRlZCBHcmFudCBTaXplIGluIGJ5dGVzICovCisgICAgdWludDMyX3Qgbm9tX2dyYW50X2ludHZsOyAgICAgICAgICAgICAgIC8qKjwgTm9taW5hbCBHcmFudCBJbnRlcnZhbCBpbiB1c2VjICovCisgICAgdWludDMyX3QgdG9sX2dyYW50X2ppdHRlcjsgICAgICAgICAgICAgIC8qKjwgVG9sZXJhdGVkIEdyYW50IEppdHRlciBpbiB1c2VjICovCisgICAgdWludDhfdCB0b3NfYW5kX21hc2tfbGVuZ3RoOyAgICAgICAgICAgIC8qKjwgTGVuZ3RoIG9mIFRvUyBBTkQgTWFzayAqLworICAgIHVpbnQ4X3QgKnRvc19hbmRfbWFzazsgICAgICAgICAgICAgICAgICAvKio8IFRvUyBBTkQgTWFzayAqLworICAgIHVpbnQ4X3QgdG9zX29yX21hc2tfbGVuZ3RoOyAgICAgICAgICAgICAvKio8IExlbmd0aCBvZiBUb1MgT1IgTWFzayAqLworICAgIHVpbnQ4X3QgKnRvc19vcl9tYXNrOyAgICAgICAgICAgICAgICAgICAvKio8IFRvUyBPUiBNYXNrICovCisgICAgdWludDMyX3QgbWF4X2xhdGVuY3k7ICAgICAgICAgICAgICAgICAgIC8qKjwgTWF4aW11bSBMYXRlbmN5IGluIHVzZWMgKi8KKyAgICB1aW50OF90IHJlcV90cmFuc19wb2xpY3lfbGVuZ3RoOyAgICAgICAgLyoqPCBMZW5ndGggb2YgUmVxdWVzdC9UcmFuc21pc3Npb24gUG9saWN5ICovCisgICAgdWludDhfdCAqcmVxX3RyYW5zX3BvbGljeTsgICAgICAgICAgICAgIC8qKjwgUmVxdWVzdC9UcmFuc21pc3Npb24gUG9saWN5ICovCisgICAgdWludDMyX3QgYml0bWFwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQml0bWFwIGluZGljYXRpbmcgZXhwbGljaXRseSBjb25maWd1cmVkIGZpZWxkcyAqLworICAgIHVpbnQzMl90IHJlcWRfYXR0cmliX21hc2s7ICAgICAgICAgICAgICAvKio8IFJlcXVpcmVkIGF0dHJpYnV0ZSBtYXNrICovCisgICAgdWludDMyX3QgZm9yYmlkX2F0dHJpYl9tYXNrOyAgICAgICAgICAgIC8qKjwgRm9yYmlkZGVuIGF0dHJpYnV0ZSBtYXNrICovCisgICAgdWludDMyX3QgYXR0cmliX2FnZ3JfbWFzazsgICAgICAgICAgICAgIC8qKjwgQXR0cmlidXRlIGFnZ3JlZ2F0aW9uIG1hc2sgKi8KKyAgICB1aW50OF90IGF0dHJpYl9tYXNrX3N1Y2Nlc3M7ICAgICAgICAgICAgLyoqPCBJbmRpY2F0ZXMgaWYgY2hhbm5lbCBhZGhlcmVzIHRvIG1hc2tzICgxID0gVHJ1ZSwgMiA9IEZhbHNlKSAqLworICAgIHVpbnQ4X3QgYXBwbGljYXRpb25faWRsZW5ndGg7ICAgICAgICAgICAvKio8IExlbmd0aCBvZiBBcHBsaWNhdGlvbiBJZGVudGlmaWVyICovCisgICAgdWludDhfdCAqYXBwbGljYXRpb25faWQ7ICAgICAgICAgICAgICAgIC8qKjwgQXBwbGljYXRpb24gSWRlbnRpZmllciAqLworICAgIHVpbnQ4X3QgY29udF9yZXFfd2luZG93X211bHRpOyAgICAgICAgICAvKio8IE11bHRpcGxpZXIgZm9yIGRhdGEgY29udGVudGlvbiByZXF1ZXN0IGJhY2tvZmYgKi8KKyAgICB1aW50OF90IGJ3X3JlcV9tdWx0aTsgICAgICAgICAgICAgICAgICAgLyoqPCBNdWx0aXBsaWVyIGZvciBiYW5kd2lkdGggcmVxdWVzdCAqLworICAgIHVpbnQzMl90IHBlYWtfcmF0ZTsgICAgICAgICAgICAgICAgICAgICAvKio8IFBlYWsgVHJhZmZpYyBSYXRlIGluIGJwcyAqLworICAgIHVpbnQzMl90IGNyZWF0ZV90aW1lOyAgICAgICAgICAgICAgICAgICAvKio8IFRpbWVzdGFtcCBpbiB0aWNrcyB3aGVuIFNlcnZpY2UgRmxvdyB3YXMgY3JlYXRlZCAqLworfSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2ZfY29uZmlnX2RhdGE7CisKKy8qKiBDTlUgU2VydmljZSBGbG93IHN0YXRpc3RpY3MgZGF0YSBmb3JtYXQgCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9zdGF0c19kYXRhCit7CisgICAgdWludDMyX3Qgc3ZjX2Zsb3dfaWQ7ICAgICAgIC8qKjwgU2VydmljZSBGbG93IElEICovCisgICAgdWludDY0X3QgdG90YWxfcGt0X2NvdW50OyAgIC8qKjwgVG90YWwgRGF0YSBQa3RzIFJ4L1R4ICovCisgICAgdWludDY0X3QgdG90YWxfYnl0ZV9jb3VudDsgIC8qKjwgQ291bnQgb2YgYWxsIHBvc3QtSENTIGJ5dGVzIFJ4L1R4ICovCisgICAgdWludDMyX3QgYWN0aXZlX3RpbWU7ICAgICAgIC8qKjwgVGltZSB0aGF0IGZsb3cncyBiZWVuIGFjdGl2ZSwgaW4gc2Vjb25kcyAqLworICAgIHVpbnQzMl90IGludmFsaWRfcGhzX2NvdW50OyAvKio8IFBrdHMgUnggd2l0aCBpbnZhbGlkIFBIU0kgKHVwc3RyZWFtIG9ubHkpICovCisgICAgdWludDMyX3QgcGt0c19kcm9wcGVkOyAgICAgIC8qKjwgQ291bnQgb2YgRFMgUGt0cyBkcm9wcGVkICovCisgICAgdWludDMyX3QgcGt0c19kZWxheWVkOyAgICAgIC8qKjwgQ291bnQgb2YgRFMgUGt0cyBkZWxheWVkIGR1ZSB0byBSYXRlIExpbWl0aW5nICovCit9IGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9zdGF0c19kYXRhOworCisvKiogQ05VIE1BQyBBZGRyZXNzIFJhbmdlIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfbWFjX2FkZHJfcmFuZ2UKK3sKKyAgICBiY21vc19tYWNfYWRkcmVzcyBjbnVfbWFjX2FkZHJlc3Nfc3RhcnQ7ICAgIC8qKjwgU3RhcnQgb2YgQ05VIE1hYyBBZGRyZXNzIFJhbmdlICovCisgICAgYmNtb3NfbWFjX2FkZHJlc3MgY251X21hY19hZGRyZXNzX2VuZDsgICAgICAvKio8IEVuZCBvZiBDTlUgTWFjIEFkZHJlc3MgUmFuZ2UgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X21hY19hZGRyX3JhbmdlOworCisvKiogQ05VIFVTIENoYW4gZGF0YSBmb3JtYXQgCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV91c19jaGFuX2RhdGEKK3sKKyAgICB1aW50OF90IGNoYW5uZWxfaWQ7ICAgICAgICAgICAgICAgICAvKio8IENOVSdzIDFzdCBVcHN0cmVhbSBDaGFubmVsIElEICovCisgICAgdWludDE2X3QgcG93ZXJfbGV2ZWw7ICAgICAgICAgICAgICAgLyoqPCBQb3dlciBMZXZlbCBpbiAxLzEwdGggZEJtViAqLworICAgIHVpbnQzMl90IGhpZ2hfcmVzX3RpbWluZ19vZmZzZXQ7ICAgIC8qKjwgQ05VIHRpbWluZyBvZmZzZXQgaW4gKDYuMjUgdXNlYyAvICg2NCAqIDI1NikpICovCisgICAgdWludDhfdCBlcXVhbGl6YXRpb25fZGF0YV9sZW5ndGg7ICAgLyoqPCBMZW5ndGggb2YgRXF1YWxpemF0aW9uIERhdGEgRmllbGQgKi8KKyAgICB1aW50OF90ICplcXVhbGl6YXRpb25fZGF0YTsgICAgICAgICAvKio8IEVxdWFsaXphdGlvbiBEYXRhICovCisgICAgdWludDY0X3QgdW5lcnJvcmVkczsgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgdW5lcnJvcmVkIGNvZGV3b3JkcyAqLworICAgIHVpbnQ2NF90IGNvcnJlY3RlZHM7ICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNvcnJlY3RlZCBjb2Rld29yZHMgKi8KKyAgICB1aW50NjRfdCB1bmNvcnJlY3RhYmxlczsgICAgICAgICAgICAvKio8IE51bWJlciBvZiB1bmNvcnJlY3RhYmxlIGNvZGV3b3JkcyAqLworICAgIHVpbnQzMl90IHNucjsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgU2lnbmFsIHRvIE5vaXNlIFJhdGlvIGluIHVuaXRzIG9mIDEvMTAgZEIgKi8KKyAgICB1aW50OF90IG1pY3JvX3JlZmxlY3Rpb25zOyAgICAgICAgICAvKio8IE1lYXN1cmVkIG1pY3JvcmVmbGVjdGlvbnMgaW4gdW5pdHMgb2YgZEJjICovCit9IGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV91c19jaGFuX2RhdGE7CisKKy8qKiBDTlUgU3RhdHVzIFJlc3BvbnNlIGZvcm1hdCAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3N0YXR1c19kYXRhCit7CisgICAgdWludDMyX3QgaWR4OyAgICAgICAgICAgICAgICAgICAvKio8IFVuaXF1ZSBDTlUgaW5kZXggd2l0aGluIENNQyAqLworICAgIGJjbW9zX21hY19hZGRyZXNzIG1hY19hZGRyZXNzOyAgLyoqPCBNQUMgQWRkcmVzcyBvZiBDTlUgKi8KKyAgICB1aW50OF90IHVzY2hhbl9jb3VudDsgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIENOVXMgYWN0aXZlIFVTIENoYW5zICovCisgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3VzX2NoYW5fZGF0YSAqdXNjaGFuX2RhdGE7ICAgICAgICAgICAgIC8qKjwgQ05VIFBlci1VUyBjaGFubmVsIGRhdGEgKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfY29ubmVjdGl2aXR5X3N0YXRlIGNvbm5lY3Rpdml0eV9zdGF0ZTsgLyoqPCBDb25uZWN0aXZpdHkgU3RhdGUgKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfZG9jc2lzX3ZlcnNpb24gZG9jc2lzX3ZlcnNpb247ICAgICAgICAgLyoqPCBWZXJzaW9uIG9mIERPQ1NJUyB0aGF0IENOVSBpcyBvcGVyYXRpbmcgaW4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfaXBhZGRyX3R5cGUgaXBhZGRyX3R5cGU7ICAgICAgICAgICAgICAgLyoqPCBUeXBlIG9mIElQIEFkZHIgKi8KKyAgICB1aW50OF90IGlwYWRkcl9sZW5ndGg7ICAgICAgICAgIC8qKjwgTGVuZ3RoIG9mIElQIEFkZHIgdmFsdWUgZmllbGQgKi8KKyAgICB1aW50OF90ICppcGFkZHJfdmFsdWU7ICAgICAgICAgIC8qKjwgSVB2NCBvciBJUHY2IEFkZHJlc3MgKi8KKyAgICB1aW50MzJfdCB0aW1lc3RhbXA7ICAgICAgICAgICAgIC8qKjwgVmFsdWUgb2Ygc3lzVXB0aW1lIHdoZW4gbGFzdCB1cGRhdGVkICovCisgICAgdWludDhfdCBzZmxvd19jb3VudDsgICAgICAgICAgICAvKio8IE51bWJlciBvZiBTZXJ2aWNlIEZsb3dzIG9uIENOVSAqLworICAgIHVpbnQzMl90ICpzZmxvd19pZDsgICAgICAgICAgICAgLyoqPCBMaXN0IG9mIFNlcnZpY2UgRmxvdyBJRHMgKi8KKyAgICB1aW50OF90IGxpbmtfbG9jYWxfYWRkcl9sZW5ndGg7IC8qKjwgTGVuZ3RoIG9mIExpbmsgTG9jYWwgQWRkcmVzcyAqLworICAgIHVpbnQ4X3QgKmxpbmtfbG9jYWxfYWRkcjsgICAgICAgLyoqPCBMaW5rIExvY2FsIEFkZHJlc3MgKi8KKyAgICB1aW50MTZfdCBtYWNfZG9tYWluX2luZGV4OyAgICAgIC8qKjwgQ01DIE1BQyBpbmRleCB3aGVyZSBDTlUgaXMgcmVnaXN0ZXJlZCAqLworICAgIHVpbnQzMl90IHNlcnZpY2VfZ3JvdXBfaWQ7ICAgICAgLyoqPCBDTUMgTUFDIERvbWFpbiBTZXJ2aWNlIEdyb3VwIElkICovCisgICAgdWludDhfdCByY3BfaWRsZW5ndGg7ICAgICAgICAgICAvKio8IExlbmd0aCBvZiBSQ1AtSUQgKi8KKyAgICB1aW50OF90ICpyY3BfaWQ7ICAgICAgICAgICAgICAgIC8qKjwgUkNQLUlEIFZhbHVlICovCisgICAgdWludDMyX3QgcmNjX2lkOyAgICAgICAgICAgICAgICAvKio8IFJDQy1JRCAqLworICAgIHVpbnQzMl90IHJjc19pZDsgICAgICAgICAgICAgICAgLyoqPCBSQ1MtSUQgKi8KKyAgICB1aW50MzJfdCB0Y3NfaWQ7ICAgICAgICAgICAgICAgIC8qKjwgVENTLUlEICovCisgICAgdWludDMyX3QgbGFzdF9yZWdpc3Rlcl90aW1lOyAgICAvKio8IFRpbWVzdGFtcCB3aGVuIENOVSBsYXN0IHJlZ2lzdGVyZWQgKi8KKyAgICB1aW50MzJfdCBhZGRyX3Jlc29sdmVfcmVxdWVzdHM7IC8qKjwgTnVtYmVyIG9mIHJlcXVlc3RzIHJlY2VpdmVkIHJlbGF0aW5nIHRvIElQIHJlc29sdXRpb24gZm9yIENOVSAqLworfSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfc3RhdHVzX2RhdGE7CisKKy8qKiBQZXItZG93bnN0cmVhbSBjaGFubmVsIHByb3BlcnRpZXMgCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9icmNtX2Rvd25zdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzCit7CisgICAgdWludDhfdCBjaGFubmVsX2lkOyAgICAgICAgIC8qKjwgRG93bnN0cmVhbSBjaGFubmVsIGluZGV4ICovCisgICAgYmNtb3NfYm9vbCBpc19lbmFibGVkOyAgICAgIC8qKjwgV2hldGhlciBvciBub3QgdGhlIGNoYW5uZWwgaXMgZW5hYmxlZCAqLworICAgIHVpbnQzMl90IGNlbnRlcl9mcmVxdWVuY3k7ICAvKio8IENlbnRlciBmcmVxdWVuY3kgaW4gSHogKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfbW9kdWxhdGlvbiBtb2R1bGF0aW9uOyAgICAgLyoqPCBDaGFubmVsIG1vZHVsYXRpb24gdHlwZSAqLworICAgIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19hbm5leCBhbm5leDsgICAgICAgICAgICAgICAvKio8IENoYW5uZWwgYW5uZXggdHlwZSAqLworICAgIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmxlYXZlciBpbnRlcmxlYXZlcjsgICAvKio8IENoYW5uZWwgaW50ZXJsZWF2ZXIgZGVwdGggdmFsdWUgKi8KKyAgICB1aW50MTZfdCBwb3dlcl9sZXZlbDsgICAgICAgLyoqPCBQb3dlciBsZXZlbCBmb3IgY2hhbm5lbCBpbiB0ZW50aHMgZEJtViAqLworICAgIHVpbnQxNl90IGludGVyZmFjZV9pbmRleDsgICAvKio8IEludGVyZmFjZSBpbmRleCBvbiBhIGdldCAvIHJlc2VydmVkIG9uIGEgc2V0ICovCit9IGJjbW9sdF9lcG9uX29hbV9icmNtX2Rvd25zdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzOworCisvKiogUGVyLXVwc3RyZWFtIGNoYW5uZWwgcHJvcGVydGllcyAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzCit7CisgICAgdWludDhfdCBjaGFubmVsX2lkOyAgICAgICAgIC8qKjwgVXBzdHJlYW0gY2hhbm5lbCBpbmRleCAqLworICAgIGJjbW9zX2Jvb2wgaXNfZW5hYmxlZDsgICAgICAvKio8IFdoZXRoZXIgb3Igbm90IHRoZSBjaGFubmVsIGlzIGVuYWJsZWQgKi8KKyAgICB1aW50MzJfdCBjZW50ZXJfZnJlcXVlbmN5OyAgLyoqPCBDZW50ZXIgZnJlcXVlbmN5IGluIEh6ICovCisgICAgdWludDMyX3QgY2hhbm5lbF93aWR0aDsgICAgIC8qKjwgV2lkdGggb2YgY2hhbm5lbCBpbiBIeiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY191c19wcm9maWxlX3R5cGUgY2hhbm5lbF9wcm9maWxlX3R5cGU7ICAvKio8IENoYW5uZWwgcHJvZmlsZSB0eXBlICovCisgICAgYmNtb3NfYm9vbCBpc19zYWMyc2luYzJlbmFibGVkOyAgICAgLyoqPCBXaGV0aGVyIG9yIG5vdCBTYWMyU2luYzIgbW9kZSBpcyBlbmFibGVkICovCisgICAgdWludDMyX3QgbWluaXNsb3Rfc2l6ZTsgICAgICAgICAgICAgLyoqPCBDaGFubmVsIE1pbmlzbG90IFNpemUgaW4gNi4yNSB1c2VjIHRpY2sgdW5pdHMgKi8KKyAgICB1aW50MzJfdCB0cmFuc21pdF90aW1pbmdfb2Zmc2V0OyAgICAvKio8IFRpbWluZyBvZmZzZXQgaW4gMS82NHRoIG9mIDYuMjUgdXNlYyB0aWNrIHVuaXRzICovCisgICAgdWludDhfdCBpbml0aWFsX3JhbmdpbmdfYmFja29mZjsgICAgLyoqPCBSYW5naW5nIEJhY2tvZmYgV2luZG93IFN0YXJ0ICovCisgICAgdWludDhfdCBmaW5hbF9yYW5naW5nX2JhY2tvZmY7ICAgICAgLyoqPCBSYW5naW5nIEJhY2tvZmYgV2luZG93IEVuZCAqLworICAgIHVpbnQ4X3QgaW5pdGlhbF9kYXRhX2JhY2tvZmY7ICAgICAgIC8qKjwgRGF0YSBCYWNrb2ZmIFdpbmRvdyBTdGFydCAqLworICAgIHVpbnQ4X3QgZmluYWxfZGF0YV9iYWNrb2ZmOyAgICAgICAgIC8qKjwgRGF0YSBCYWNrb2ZmIFdpbmRvdyBFbmQgKi8KKyAgICB1aW50OF90IGFjdGl2ZV9zY2RtYV9jb2RlczsgICAgICAgICAvKio8IEFjdGl2ZSBTQ0RNQSBDb2RlcyAqLworICAgIHVpbnQ4X3QgY29kZXNfcGVyX3Nsb3Q7ICAgICAgICAgICAgIC8qKjwgU0NETUEgQ29kZXMgcGVyIE1pbmlzbG90ICovCisgICAgdWludDhfdCBzY2RtYV9mcmFtZV9zaXplOyAgICAgICAgICAgLyoqPCBTQ0RNQSBGcmFtZSBTaXplIGluIHVuaXRzIG9mIHNwcmVhZGluZyBpbnRlcnZhbHMgKi8KKyAgICB1aW50MTZfdCBob3BwaW5nX3NlZWQ7ICAgICAgICAgICAgICAvKio8IFNDRE1BIENvZGUgSG9wcGluZyBTZWVkICovCisgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3VzX21vZHVsYXRpb25fdHlwZSBtb2R1bGF0aW9uX3R5cGU7ICAgIC8qKjwgQ2hhbm5lbCBtb2R1bGF0aW9uIHR5cGUgKi8KKyAgICB1aW50OF90IHByZV9lcXVhbGl6YXRpb25fc2V0dGluZzsgICAvKio8IFByZS1FcXVhbGl6YXRpb24gU2V0dGluZyAoMS1vbiwgMi1vZmYpICovCisgICAgdWludDE2X3QgaW50ZXJmYWNlX2luZGV4OyAgICAgICAgICAgLyoqPCBJbnRlcmZhY2UgaW5kZXggb24gYSBnZXQgLyByZXNlcnZlZCBvbiBhIHNldCAqLworfSBiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXM7CisKKy8qKiBQZXItdXBzdHJlYW0gY2hhbm5lbCBzaWduYWwgcXVhbGl0eSBpbmZvIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9zaWduYWxfcXVhbGl0eQoreworICAgIHVpbnQxNl90IGludGVyZmFjZV9pbmRleDsgICAgICAgLyoqPCBVcHN0cmVhbSBjaGFubmVsIGlmSW5kZXggKi8KKyAgICB1aW50OF90IGNvbnRlbnRpb25faW50ZXJ2YWxzOyAgIC8qKjwgQXJlIGNvbnRlbnRpb24gaW50ZXJ2YWxzIGluY2x1ZGVkIGluIGNvdW50cyAoMT15ZXMsIDI9bm8pICovCisgICAgdWludDY0X3QgdW5lcnJvcmVkczsgICAgICAgICAgICAvKio8IE51bWJlciBvZiB1bmVycm9yZWQgY29kZXdvcmRzICovCisgICAgdWludDY0X3QgY29ycmVjdGVkczsgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjb3JyZWN0ZWQgY29kZXdvcmRzICovCisgICAgdWludDY0X3QgdW5jb3JyZWN0YWJsZXM7ICAgICAgICAvKio8IE51bWJlciBvZiB1bmNvcnJlY3RhYmxlIGNvZGV3b3JkcyAqLworICAgIHVpbnQzMl90IHNucjsgICAgICAgICAgICAgICAgICAgLyoqPCBTaWduYWwgdG8gTm9pc2UgUmF0aW8gaW4gdW5pdHMgb2YgMS8xMCBkQiAqLworICAgIHVpbnQ4X3QgbWljcm9fcmVmbGVjdGlvbnM7ICAgICAgLyoqPCBNZWFzdXJlZCBtaWNyb3JlZmxlY3Rpb25zIGluIHVuaXRzIG9mIGRCYyAqLworfSBiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9zaWduYWxfcXVhbGl0eTsKKworLyoqIFBlci11cHN0cmVhbSBjaGFubmVsIHBvd2VyIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Bvd2VyCit7CisgICAgdWludDhfdCBjaGFubmVsX2lkOyAgICAgICAgIC8qKjwgVXBzdHJlYW0gY2hhbm5lbCBpbmRleCAqLworICAgIHVpbnQxNl90IGlucHV0X3Bvd2VyX2xldmVsOyAvKio8IElucHV0IFBvd2VyIExldmVsIChpbiB0ZW50aHMgZEIpICovCit9IGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcG93ZXI7CisKKy8qKiBDTUMgT0FNIFBEVSBiYXNlIHN0cnVjdHVyZSAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlCit7CisgICAgdWludDhfdCB2ZXJzaW9uOyAgICAvKio8IFZlcnNpb24gbnVtYmVyICovCisgICAgdWludDE2X3QgcGFja2V0X2lkOyAvKio8IEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBzcGVjaWZpYyBCUkNNIE9BTSB0cmFuc2FjdGlvbi4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X29wY29kZSBvcGNvZGU7IC8qKjwgVGhlIGFjdHVhbCBjb21tYW5kXGZ1bmN0aW9uIGJlaW5nIHJlZmVyZW5jZWQgYnkgdGhlIE9BTSBtZXNzYWdlICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQ7ICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBEb3duc3RyZWFtIENoYW5uZWxzICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnJjbV9kb3duc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllcyAqZG93bnN0cmVhbV9jaGFubmVsczsgICAgLyoqPCBQZXIgZG93bnN0cmVhbSBjaGFubmVsIHByb3BlcnRpZXMgKi8KKyAgICAgICAgfSBzZXRfZG93bnN0cmVhbV9jb25maWdfcmVxdWVzdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBkb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50OyAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gRG93bnN0cmVhbSBDaGFubmVscyAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9yZXN1bHQgKmRvd25zdHJlYW1fY2hhbm5lbHM7ICAgLyoqPCBQZXIgZG93bnN0cmVhbSBjaGFubmVsIHJlc3VsdHMgKi8KKyAgICAgICAgfSBzZXRfZG93bnN0cmVhbV9jb25maWdfcmVzcG9uc2U7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgZG93bnN0cmVhbV9jaGFubmVsc19jb3VudDsgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIERvd25zdHJlYW0gQ2hhbm5lbHMgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKmRvd25zdHJlYW1fY2hhbm5lbHM7ICAgICAgIC8qKjwgUGVyIGRvd25zdHJlYW0gY2hhbm5lbCBJRHMgdG8gZ2V0ICovCisgICAgICAgIH0gZ2V0X2Rvd25zdHJlYW1fY29uZmlnX3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgZG93bnN0cmVhbV9jaGFubmVsc19jb3VudDsgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIERvd25zdHJlYW0gQ2hhbm5lbHMgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9icmNtX2Rvd25zdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzICpkb3duc3RyZWFtX2NoYW5uZWxzOyAgICAvKio8IFBlciBkb3duc3RyZWFtIGNoYW5uZWwgcmVzdWx0cyAqLworICAgICAgICB9IGdldF9kb3duc3RyZWFtX2NvbmZpZ19yZXNwb25zZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB1cHN0cmVhbV9jaGFubmVsc19jb3VudDsgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gVXBzdHJlYW0gQ2hhbm5lbHMgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllcyAqdXBzdHJlYW1fY2hhbm5lbHM7ICAgIC8qKjwgUGVyIHVwc3RyZWFtIGNoYW5uZWwgcHJvcGVydGllcyAqLworICAgICAgICB9IHNldF91cHN0cmVhbV9jb25maWdfcmVxdWVzdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB1cHN0cmVhbV9jaGFubmVsc19jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBVcHN0cmVhbSBDaGFubmVscyAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9yZXN1bHQgKnVwc3RyZWFtX2NoYW5uZWxzOyAvKio8IFBlciB1cHN0cmVhbSBjaGFubmVsIHJlc3VsdHMgKi8KKyAgICAgICAgfSBzZXRfdXBzdHJlYW1fY29uZmlnX3Jlc3BvbnNlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHVwc3RyZWFtX2NoYW5uZWxzX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIFVwc3RyZWFtIENoYW5uZWxzICovCisgICAgICAgICAgICB1aW50OF90ICp1cHN0cmVhbV9jaGFubmVsczsgICAgICAgICAvKio8IFBlciB1cHN0cmVhbSBjaGFubmVsIElEcyB0byBnZXQgKi8KKyAgICAgICAgfSBnZXRfdXBzdHJlYW1fY29uZmlnX3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdXBzdHJlYW1fY2hhbm5lbHNfY291bnQ7ICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIFVwc3RyZWFtIENoYW5uZWxzICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXMgKnVwc3RyZWFtX2NoYW5uZWxzOyAgICAvKio8IFBlciB1cHN0cmVhbSBjaGFubmVsIHJlc3VsdHMgKi8KKyAgICAgICAgfSBnZXRfdXBzdHJlYW1fY29uZmlnX3Jlc3BvbnNlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGdyb3VwX2lkOyAgIC8qKjwgR3JvdXAgSWRlbnRpZmllciAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2xvYWRfYmFsYW5jZV9tZXRob2QgbWV0aG9kOyAgICAvKio8IExvYWQgQmFsYW5jaW5nIE1ldGhvZCAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3JlcXVlc3Rfb3B0aW9uIHJlcXVlc3Rfb3B0aW9uOyAvKio8IFJlcXVlc3QgT3B0aW9uICovCisgICAgICAgIH0gc2V0X2NyZWF0ZV9sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGdyb3VwX2lkOyAgIC8qKjwgR3JvdXAgSWRlbnRpZmllciAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3Jlc3VsdF9jb2RlIHJlc3VsdF9jb2RlOyAgIC8qKjwgUmVzdWx0IENvZGUgKi8KKyAgICAgICAgfSBzZXRfY3JlYXRlX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGdyb3VwX2lkOyAgICAgICAgICAgICAgICAgICAvKio8IEdyb3VwIElELiAqLworICAgICAgICAgICAgdWludDhfdCBkb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50OyAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gRG93bnN0cmVhbSBDaGFubmVscyAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9vcHRpb24gKmRvd25zdHJlYW1fY2hhbm5lbHM7ICAgLyoqPCBQZXIgZG93bnN0cmVhbSBjaGFubmVsIG9wdGlvbnMgKi8KKyAgICAgICAgfSBzZXRfYWRkX2Rvd25zdHJlYW1zX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgZ3JvdXBfaWQ7ICAgICAgICAgICAgICAgICAgIC8qKjwgR3JvdXAgSUQuICovCisgICAgICAgICAgICB1aW50OF90IGRvd25zdHJlYW1fY2hhbm5lbHNfY291bnQ7ICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBEb3duc3RyZWFtIENoYW5uZWxzICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdCAqZG93bnN0cmVhbV9jaGFubmVsczsgICAvKio8IFBlciBkb3duc3RyZWFtIGNoYW5uZWwgcmVzdWx0cyAqLworICAgICAgICB9IHNldF9hZGRfZG93bnN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2U7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgZ3JvdXBfaWQ7ICAgICAgICAgICAgICAgICAgIC8qKjwgR3JvdXAgSUQuICovCisgICAgICAgICAgICB1aW50OF90IHVwc3RyZWFtX2NoYW5uZWxzX2NvdW50OyAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBVcHN0cmVhbSBDaGFubmVscyAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9vcHRpb24gKnVwc3RyZWFtX2NoYW5uZWxzOyAvKio8IFBlciB1cHN0cmVhbSBjaGFubmVsIG9wdGlvbnMgKi8KKyAgICAgICAgfSBzZXRfYWRkX3Vwc3RyZWFtc190b19sb2FkX2JhbGFuY2luZ19ncm91cF9yZXF1ZXN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGdyb3VwX2lkOyAgICAgICAgICAgICAgICAgICAvKio8IEdyb3VwIElELiAqLworICAgICAgICAgICAgdWludDhfdCB1cHN0cmVhbV9jaGFubmVsc19jb3VudDsgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gVXBzdHJlYW0gQ2hhbm5lbHMgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfcmVzdWx0ICp1cHN0cmVhbV9jaGFubmVsczsgLyoqPCBQZXIgdXBzdHJlYW0gY2hhbm5lbCByZXN1bHRzICovCisgICAgICAgIH0gc2V0X2FkZF91cHN0cmVhbXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2U7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdXBzdHJlYW1faW50ZXJmYWNlc19jb3VudDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gVXBzdHJlYW0gSW50ZXJmYWNlcyAqLworICAgICAgICAgICAgdWludDE2X3QgKnVwc3RyZWFtX2ludGVyZmFjZXM7ICAgICAgLyoqPCBQZXIgdXBzdHJlYW0gaWZJbmRpY2VzIHRvIGdldCAqLworICAgICAgICB9IGdldF9zaWduYWxfcXVhbGl0eV9yZXF1ZXN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHVwc3RyZWFtX2ludGVyZmFjZXNfY291bnQ7ICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBVcHN0cmVhbSBJbnRlcmZhY2VzICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9zaWduYWxfcXVhbGl0eSAqdXBzdHJlYW1faW50ZXJmYWNlczsgIC8qKjwgUGVyIHVwc3RyZWFtIGlmSW5kaWNlcyB0byBnZXQgKi8KKyAgICAgICAgfSBnZXRfc2lnbmFsX3F1YWxpdHlfcmVzcG9uc2U7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGNudV9jb3VudDsgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIENOVXMgdG8gcmV0cmlldmUgc3RhdHVzIGZyb20gKi8KKyAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzICpjbnVfbWFjX2FkZHJlc3M7IC8qKjwgTGlzdCBvZiBDTlUgTUFDIEFkZHJlc3NlcyAqLworICAgICAgICB9IGdldF9jbnVfc3RhdHVzX3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGNudV9jb3VudDsgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIENOVXMgd2l0aCBpbmZvIGluIHRoZSByZXNwb25zZSAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3N0YXR1c19kYXRhICpjbnVfc3RhdHVzX2RhdGE7ICAvKio8IExpc3Qgb2YgQ05VIFN0YXR1cyBEYXRhIHN0cnVjdHVyZXMgKi8KKyAgICAgICAgfSBnZXRfY251X3N0YXR1c19yZXNwb25zZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBzdmNfZmxvd19pZGNvdW50OyAgIC8qKjwgTnVtYmVyIG9mIFNlcnZpY2UgRmxvdyBJRHMgaW4gcmVxdWVzdCAqLworICAgICAgICAgICAgdWludDE2X3QgKnN2Y19mbG93X2lkczsgICAgIC8qKjwgU2VydmljZSBGbG93IElEIExpc3QgKi8KKyAgICAgICAgfSBnZXRfcW9zX3NlcnZpY2VfZmxvd19zdGF0aXN0aWNzX3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgc3ZjX2Zsb3dfaWRjb3VudDsgICAvKio8IE51bWJlciBvZiBTZXJ2aWNlIEZsb3dzIGluIHJlc3BvbnNlICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2Zfc3RhdHNfZGF0YSAqc3ZjX2Zsb3dfZGF0YTsgIC8qKjwgU2VydmljZSBGbG93IGRhdGEgbGlzdCAqLworICAgICAgICB9IGdldF9xb3Nfc2VydmljZV9mbG93X3N0YXRpc3RpY3NfcmVzcG9uc2U7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGludGZfY291bnQ7ICAgIC8qKjwgTnVtYmVyIG9mIENNQyBJbnRlcmZhY2VzIHdpdGggaW5mbyBpbiB0aGUgcmVzcG9uc2UgKi8KKyAgICAgICAgICAgIHVpbnQzMl90IHRpbWVzdGFtcDsgICAgIC8qKjwgVGltZXN0YW1wIHdoZW4gaW50ZXJmYWNlcyB0YWJsZSB3YXMgbGFzdCBtb2RpZmllZCAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9kYXRhICpjbWNfaW50ZXJmYWNlX2RhdGE7ICAgIC8qKjwgTGlzdCBvZiBDTUMgSW50ZXJmYWNlIERhdGEgc3RydWN0dXJlcyAqLworICAgICAgICB9IGdldF9jbWNfaW50ZXJmYWNlc19yZXNwb25zZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgaW50ZXJmYWNlX2luZGV4OyAgIC8qKjwgTUFDIERvbWFpbiBpZkluZGV4ICovCisgICAgICAgICAgICB1aW50MzJfdCBpbnZhbGlkX3JuZ19yZXFzOyAgLyoqPCBDb3VudCBvZiBpbnZhbGlkIHJhbmdlIHJlcXVlc3RzIHJlY2VpdmVkICovCisgICAgICAgICAgICB1aW50MzJfdCBybmdfYWJvcnRzOyAgICAgICAgLyoqPCBDb3VudCBvZiByYW5naW5nIGF0dGVtcHRzIGFib3J0ZWQgKi8KKyAgICAgICAgICAgIHVpbnQzMl90IGludmFsaWRfcmVnX3JlcXM7ICAvKio8IENvdW50IG9mIGludmFsaWQgUkVHLVJFUSBtZXNzYWdlcyByZWNlaXZlZCAqLworICAgICAgICAgICAgdWludDMyX3QgZmFpbGVkX3JlZ19yZXFzOyAgIC8qKjwgQ291bnQgb2YgZmFpbGVkIHJlZ2lzdHJhdGlvbiBhdHRlbXB0cyAqLworICAgICAgICAgICAgdWludDMyX3QgaW52YWxpZF9kYXRhX3JlcXM7IC8qKjwgQ291bnQgb2YgaW52YWxpZCBkYXRhIHJlcXVlc3QgbWVzc2FnZXMgcmVjZWl2ZWQgKi8KKyAgICAgICAgICAgIHVpbnQzMl90IHQ1dGltZW91dHM7ICAgICAgICAvKio8IENvdW50IG9mIFQ1IFRpbWVyIGV4cGlyYXRpb25zICovCisgICAgICAgIH0gZ2V0X2NtY19tYWNfc3RhdGlzdGljc19yZXNwb25zZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBpbnRmX2NvdW50OyAgICAgICAgIC8qKjwgTnVtYmVyIG9mIENNQyBpbnRlcmZhY2VzIHRvIHJldHJpZXZlIHN0YXR1cyBmcm9tICovCisgICAgICAgICAgICB1aW50MTZfdCAqaW50Zl9pbmRleDsgICAgICAgLyoqPCBMaXN0IG9mIENNQyBpbnRlcmZhY2UgaWZJbmRpY2VzICovCisgICAgICAgIH0gZ2V0X2NtY19pbnRlcmZhY2VzX3N0YXRpc3RpY3NfcmVxdWVzdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBpbnRlcmZhY2VzX2NvdW50OyAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIE5ldHdvcmsgSW50ZXJmYWNlcyAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGZfc3RhdHNfZGF0YSAqbmV0d29ya19pbnRlcmZhY2VzOyAgIC8qKjwgUGVyIG5ldHdvcmsgaW50ZXJmYWNlIHN0YXRzIGRhdGEgKi8KKyAgICAgICAgfSBnZXRfY21jX2ludGVyZmFjZXNfc3RhdGlzdGljc19yZXNwb25zZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBzdmNfZmxvd19pZGNvdW50OyAgIC8qKjwgTnVtYmVyIG9mIFNlcnZpY2UgRmxvdyBJRHMgaW4gcmVxdWVzdCAqLworICAgICAgICAgICAgdWludDE2X3QgKnN2Y19mbG93X2lkczsgICAgIC8qKjwgU2VydmljZSBGbG93IElEIExpc3QgKi8KKyAgICAgICAgfSBnZXRfcW9zX3NlcnZpY2VfZmxvd19jb25maWdfcmVxdWVzdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBzdmNfZmxvd19jb3VudDsgICAgIC8qKjwgTnVtYmVyIG9mIFNlcnZpY2UgRmxvd3MgaW4gcmVzcG9uc2UgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9jb25maWdfZGF0YSAqc3ZjX2Zsb3dfZGF0YTsgLyoqPCBTZXJ2aWNlIEZsb3cgY29uZmlpZ3VyYXRpb24gZGF0YSBsaXN0ICovCisgICAgICAgIH0gZ2V0X3Fvc19zZXJ2aWNlX2Zsb3dfY29uZmlnX3Jlc3BvbnNlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHN2Y19mbG93X2lkY291bnQ7ICAgLyoqPCBOdW1iZXIgb2YgU2VydmljZSBGbG93IElEcyBpbiByZXF1ZXN0ICovCisgICAgICAgICAgICB1aW50MTZfdCAqc3ZjX2Zsb3dfaWRzOyAgICAgLyoqPCBTZXJ2aWNlIEZsb3cgSUQgTGlzdCAqLworICAgICAgICB9IGdldF9xb3NfcGFja2V0X2NsYXNzaWZpZXJfY29uZmlnX3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgY2xhc3NpZmllcl9jb3VudDsgICAvKio8IE51bWJlciBvZiBTZXJ2aWNlIEZsb3cvQ2xhc3NpZmllciBwYWlycyBpbiByZXNwb25zZSAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2NsYXNzaWZpZXJfY29uZmlnX2RhdGEgKmNsYXNzaWZpZXJfZGF0YTsgICAvKio8IFNlcnZpY2UgRmxvdy9DbGFzc2lmaWVyIHBhaXIgZGF0YSBsaXN0ICovCisgICAgICAgIH0gZ2V0X3Fvc19wYWNrZXRfY2xhc3NpZmllcl9jb25maWdfcmVzcG9uc2U7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdXBzdHJlYW1fY2hhbm5lbHNfY291bnQ7ICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIFVwc3RyZWFtIENoYW5uZWxzICovCisgICAgICAgICAgICB1aW50OF90ICp1cHN0cmVhbV9jaGFubmVsczsgICAgICAgICAvKio8IFBlciB1cHN0cmVhbSBjaGFubmVsIElEcyB0byBnZXQgKi8KKyAgICAgICAgfSBnZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVxdWVzdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB1cHN0cmVhbV9jaGFubmVsc19jb3VudDsgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gVXBzdHJlYW0gQ2hhbm5lbHMgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcG93ZXIgKnVwc3RyZWFtX2NoYW5uZWxzOyAvKio8IFBlciB1cHN0cmVhbSBjaGFubmVsIHJlc3VsdHMgKi8KKyAgICAgICAgfSBnZXRfdXBzdHJlYW1faW5wdXRfcG93ZXJfcmVzcG9uc2U7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdXBzdHJlYW1fY2hhbm5lbHNfY291bnQ7ICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIFVwc3RyZWFtIENoYW5uZWxzICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Bvd2VyICp1cHN0cmVhbV9jaGFubmVsczsgLyoqPCBQZXIgdXBzdHJlYW0gY2hhbm5lbCByZXN1bHRzICovCisgICAgICAgIH0gc2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXN1bHRfY29kZSByZXN1bHRfY29kZTsgICAgICAgICAgICAgICAvKio8IFJlc3VsdCBvZiBvcGVyYXRpb24gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGNoYW5uZWxfb25lX3Bvd2VyOyAgICAgLyoqPCBJbnB1dCBwb3dlciBsZXZlbCBmb3IgVVMgQ2hhbm5lbCAxICovCisgICAgICAgICAgICB1aW50MTZfdCBjaGFubmVsX3R3b19wb3dlcjsgICAgIC8qKjwgSW5wdXQgcG93ZXIgbGV2ZWwgZm9yIFVTIENoYW5uZWwgMiAqLworICAgICAgICAgICAgdWludDE2X3QgY2hhbm5lbF90aHJlZV9wb3dlcjsgICAvKio8IElucHV0IHBvd2VyIGxldmVsIGZvciBVUyBDaGFubmVsIDMgKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGNoYW5uZWxfZm91cl9wb3dlcjsgICAgLyoqPCBJbnB1dCBwb3dlciBsZXZlbCBmb3IgVVMgQ2hhbm5lbCA0ICovCisgICAgICAgIH0gc2V0X3Vwc3RyZWFtX2lucHV0X3Bvd2VyX3Jlc3BvbnNlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGdyb3VwX2lkOyAgICAgICAgICAgICAgIC8qKjwgR3JvdXAgSWRlbnRpZmllciAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3JlcXVlc3Rfb3B0aW9uIHJlcXVlc3Rfb3B0aW9uOyAvKio8IFJlcXVlc3QgT3B0aW9uICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfbWFjX2FkZHJfcmFuZ2UgY251X21hY19yYW5nZTsgIC8qKjwgQ05VIE1hYyBBZGRyZXNzIFJhbmdlICovCisgICAgICAgIH0gc2V0X2FkZF9jbnVzX3RvX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgZ3JvdXBfaWQ7ICAgLyoqPCBHcm91cCBJZGVudGlmaWVyICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVzdWx0X2NvZGUgcmVzdWx0X2NvZGU7ICAgICAgIC8qKjwgUmVzdWx0IENvZGUgKi8KKyAgICAgICAgfSBzZXRfYWRkX2NudXNfdG9fbG9hZF9iYWxhbmNpbmdfZ3JvdXBfcmVzcG9uc2U7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXF1ZXN0X29wdGlvbiByZXF1ZXN0X29wdGlvbjsgLyoqPCBSZXF1ZXN0IE9wdGlvbiAqLworICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgY251X21hY19hZGRyZXNzX3N0YXJ0OyAgICAgICAgICAgICAgICAvKio8IFN0YXJ0IG9mIENOVSBNYWMgQWRkcmVzcyBSYW5nZSAqLworICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgY251X21hY19hZGRyZXNzX2VuZDsgICAgICAgICAgICAgICAgICAvKio8IEVuZCBvZiBDTlUgTWFjIEFkZHJlc3MgUmFuZ2UgKi8KKyAgICAgICAgfSBzZXRfZXhjbHVkZV9jbnVzX2Zyb21fbG9hZF9iYWxhbmNpbmdfcmVxdWVzdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3Jlc3VsdF9jb2RlIHJlc3VsdF9jb2RlOyAgICAgICAvKio8IFJlc3VsdCBDb2RlICovCisgICAgICAgIH0gc2V0X2V4Y2x1ZGVfY251c19mcm9tX2xvYWRfYmFsYW5jaW5nX3Jlc3BvbnNlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGdyb3VwX2lkOyAgIC8qKjwgR3JvdXAgSWRlbnRpZmllciAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2xvYWRfYmFsYW5jZV9tZXRob2QgbWV0aG9kOyAgICAvKio8IExvYWQgQmFsYW5jaW5nIE1ldGhvZCAqLworICAgICAgICAgICAgdWludDhfdCBkb3duc3RyZWFtX2NoYW5uZWxzX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBEb3duc3RyZWFtIENoYW5uZWxzICovCisgICAgICAgICAgICB1aW50OF90ICpkb3duc3RyZWFtX2NoYW5uZWxzOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTGlzdCBvZiBEb3duc3RyZWFtIENoYW5uZWwgSURzICovCisgICAgICAgICAgICB1aW50OF90IHVwc3RyZWFtX2NoYW5uZWxzX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIFVwc3RyZWFtIENoYW5uZWxzICovCisgICAgICAgICAgICB1aW50OF90ICp1cHN0cmVhbV9jaGFubmVsczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTGlzdCBvZiBVcHN0cmVhbSBDaGFubmVsIElEcyAqLworICAgICAgICAgICAgdWludDhfdCByZXN0cmljdGlvbnNfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBSZXN0cmljdGlvbnMgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9tYWNfYWRkcl9yYW5nZSAqcmVzdHJpY3Rpb25zOyAgLyoqPCBMaXN0IG9mIFJlc3RyaWN0aW9uIHJhbmdlcyAqLworICAgICAgICB9IHNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgZ3JvdXBfaWQ7ICAgLyoqPCBHcm91cCBJZGVudGlmaWVyICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVzdWx0X2NvZGUgcmVzdWx0X2NvZGU7ICAgLyoqPCBSZXN1bHQgQ29kZSAqLworICAgICAgICB9IHNldF9mdWxsX2xvYWRfYmFsYW5jaW5nX2dyb3VwX3Jlc3BvbnNlOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlOworCisvKiogQ2VydGlmaWNhdGUuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY2VydGlmaWNhdGUKK3sKKyAgICB1aW50MjRfdCBzaXplOyAgICAgICAgICAgICAgLyoqPCBTaXplLiAqLworICAgIHVpbnQ4X3QgKmNlcnRpZmljYXRlX2RhdGE7ICAvKio8IENlcnRpZmljYXRlIERhdGEuICovCit9IGJjbW9sdF9lcG9uX29hbV9jZXJ0aWZpY2F0ZTsKKworLyoqIENUQyBBY3Rpb24gVmFsdWUuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX2FjdGlvbl92YWx1ZQoreworICAgIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hY3Rpb24gbGVhZjsgICAgICAgICAgICAgICAvKio8IExlYWYuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2VuYWJsZWRfc3RhdGUgc3RhdGU7ICAgIC8qKjwgU3RhdGUuICovCisgICAgICAgIH0gcGh5X2FkbWluX2NvbnRyb2w7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19lbmFibGVkX3N0YXRlIHN0YXRlOyAgICAvKio8IFN0YXRlLiAqLworICAgICAgICB9IGF1dG9fYWRtaW5fY29udHJvbDsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9jdGNfYWN0aW9uX3ZhbHVlOworCisvKiogQ3RjIEFsYXJtIEVudHJ5LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19hbGFybV9lbnRyeQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9tYW5hZ2VtZW50X29iamVjdCBvYmplY3RfdHlwZTsgLyoqPCBPYmplY3QgVHlwZS4gKi8KKyAgICB1aW50MzJfdCBvYmplY3RfaW5zdGFuY2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE9iamVjdCBJbnN0YW5jZS4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9hbGFybV9pZCBhbGFybV9pZDsgICAgICAgICAgICAgICAgICAvKio8IEFsYXJtIElELiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgdGltZV9zdGFtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVGltZSBTdGFtcC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3Qgc3RhdGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IDB4MDAgOiBSZXBvcnRpbmcgQWxhcm0gKi8KKyAgICAgICAgfSBkZWY7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IHRpbWVfc3RhbXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRpbWUgU3RhbXAuICovCisgICAgICAgICAgICB1aW50OF90IHN0YXRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCAweDAwIDogUmVwb3J0aW5nIEFsYXJtICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX3Bvd2VyX2FsYXJtX2NvZGUgYWxhcm1fY29kZTsgICAgLyoqPCBBbGFybSBDb2RlLiAqLworICAgICAgICB9IG9udV9wb3dlcl9hbGFybTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgdGltZV9zdGFtcDsgICAgLyoqPCBUaW1lIFN0YW1wLiAqLworICAgICAgICAgICAgdWludDhfdCBzdGF0ZTsgICAgICAgICAgLyoqPCAweDAwIDogUmVwb3J0aW5nIEFsYXJtICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX3Bvbl9pZl9zd2l0Y2hfY29kZSBhbGFybV9jb2RlOyAgLyoqPCBBbGFybSBDb2RlLiAqLworICAgICAgICB9IG9udV9wb25faWZfc3dpdGNoOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19hbGFybV9lbnRyeTsKKworLyoqIENUQyBBdHRyaWJ1dGUgVmFsdWUgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9jdGNfYXR0cmlidXRlX3ZhbHVlX2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlIGxlYWY7ICAgIC8qKjwgTGVhZi4gKi8KKyAgICB1aW50OF90IHdpZHRoOyAgLyoqPCBXaWR0aC4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfZW5hYmxlZF9zdGF0ZSBzdGF0ZTsgICAgLyoqPCBTdGF0ZS4gKi8KKyAgICAgICAgfSBwaHlfYWRtaW5fc3RhdGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfZW5hYmxlZF9zdGF0ZSBzdGF0ZTsgICAgLyoqPCBTdGF0ZS4gKi8KKyAgICAgICAgfSBhdXRvX25lZ19hZG1pbl9zdGF0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdGVjaG5vbG9naWVzX2NvdW50OyAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBUZWNobm9sb2dpZXMgKi8KKyAgICAgICAgICAgIHVpbnQzMl90ICp0ZWNobm9sb2dpZXM7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBBdXRvLW5lZ290aWF0aW9uIHRlY2hub2xvZ3kgYml0bWFwcyAoSUVFRSA4MDIuMy0yMDA1IGNsYXVzZSA0MCkgKi8KKyAgICAgICAgfSBhdXRvX25lZ19sb2NhbF90ZWNoX2FiaWxpdHk7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHRlY2hub2xvZ2llc19jb3VudDsgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gVGVjaG5vbG9naWVzICovCisgICAgICAgICAgICB1aW50MzJfdCAqdGVjaG5vbG9naWVzOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgQXV0by1uZWdvdGlhdGlvbiB0ZWNobm9sb2d5IGJpdG1hcHMgKElFRUUgODAyLjMtMjAwNSBjbGF1c2UgNDApICovCisgICAgICAgIH0gYXV0b19uZWdfYWR2ZXJ0aXNlZF90ZWNoX2FiaWxpdHk7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfZmVjX3N1cHBvcnQgc3VwcG9ydDsgICAgLyoqPCBTdXBwb3J0LiAqLworICAgICAgICB9IGZlY19hYmlsaXR5OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2ZlY19zdGF0ZSBzdGF0ZTsgICAgICAgIC8qKjwgU3RhdGUuICovCisgICAgICAgIH0gZmVjX21vZGU7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2F0dHJpYnV0ZV92YWx1ZV9iYXNlOworCisvKiogQ1RDIENodXJuaW5nIFByb3YgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9jdGNfY2h1cm5pbmdfcHJvdl9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19vcF9jb2RlIGNvZGU7ICAvKio8IENvZGUuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGluX3VzZV9rZXlfaW5kZXg7ICAgICAgICAgICAvKio8IEluLVVzZSBLZXkgSW5kZXguICovCisgICAgICAgIH0gbmV3X2tleV9yZXF1ZXN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IG5ld19rZXlfaW5kZXg7ICAgICAgICAgICAgICAvKio8IE5ldyBLZXkgSW5kZXguICovCisgICAgICAgICAgICB1aW50OF90IGNodXJuaW5nX2tleTBbM107ICAgICAgICAgICAvKio8IDMtYnl0ZSBjaHVybmluZyBrZXkgMC4gIEZvciAxRywgdGhpcyBpcyB0aGUgb25seSBrZXkuICBGb3IgMTBHLCB0aGlzIGlzIHRoZSBmaXJzdCBvZiAzIDMtYnl0ZSBrZXlzLiAqLworICAgICAgICAgICAgdWludDhfdCBjaHVybmluZ19rZXkxWzNdOyAgICAgICAgICAgLyoqPCAzLWJ5dGUgY2h1cm5pbmcga2V5IDEuICBPbmx5IHByZXNlbnQgaW4gMTBHLiAqLworICAgICAgICAgICAgdWludDhfdCBjaHVybmluZ19rZXkyWzNdOyAgICAgICAgICAgLyoqPCAzLWJ5dGUgY2h1cm5pbmcga2V5IDIuICBPbmx5IHByZXNlbnQgaW4gMTBHLiAqLworICAgICAgICB9IG5ld19jaHVybmluZ19rZXk7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2NodXJuaW5nX3Byb3ZfYmFzZTsKKworLyoqIENUQyBDb21taXQgSW1hZ2UgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9vcGNvZGUgb3Bjb2RlOyAgICAgLyoqPCBPcGNvZGUuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9mbGFnIGZsYWc7IC8qKjwgRmxhZy4gKi8KKyAgICAgICAgfSBjb21taXRfaW1hZ2VfcmVxdWVzdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfYWNrIGFjazsgICAvKio8IEFjay4gKi8KKyAgICAgICAgfSBjb21taXRfaW1hZ2VfcmVzcG9uc2U7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9iYXNlOworCisvKiogQ1RDIERCQSByZXBvcnRpbmcgcXVldWUgc2V0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcXVldWVfc2V0Cit7CisgICAgdWludDhfdCByZXBvcnRfYml0bWFwOyAgLyoqPCBCaXRtYXAgb2Ygd2hpY2ggcXVldWVzIGFyZSBwcmVzZW50IGluIHRoZSBxdWV1ZSBzZXQuICovCisgICAgdWludDE2X3QgcXVldWUwOyAgICAgICAgLyoqPCBRdWV1ZSAwLiAqLworICAgIHVpbnQxNl90IHF1ZXVlMTsgICAgICAgIC8qKjwgUXVldWUgMS4gKi8KKyAgICB1aW50MTZfdCBxdWV1ZTI7ICAgICAgICAvKio8IFF1ZXVlIDIuICovCisgICAgdWludDE2X3QgcXVldWUzOyAgICAgICAgLyoqPCBRdWV1ZSAzLiAqLworICAgIHVpbnQxNl90IHF1ZXVlNDsgICAgICAgIC8qKjwgUXVldWUgNC4gKi8KKyAgICB1aW50MTZfdCBxdWV1ZTU7ICAgICAgICAvKio8IFF1ZXVlIDUuICovCisgICAgdWludDE2X3QgcXVldWU2OyAgICAgICAgLyoqPCBRdWV1ZSA2LiAqLworICAgIHVpbnQxNl90IHF1ZXVlNzsgICAgICAgIC8qKjwgUXVldWUgNy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcXVldWVfc2V0OworCisvKiogQ1RDIERiYSBQcm92IEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9wcm92X2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9vcF9jb2RlIGRiYV9jb2RlOyAgIC8qKjwgREJBIENvZGUuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHF1ZXVlX3NldHNfY291bnQ7ICAgICAgICAgICAvKio8IFF1ZXVlIFNldHMgQ291bnQuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9xdWV1ZV9zZXQgKnF1ZXVlX3NldHM7ICAvKio8IFF1ZXVlIFNldHMuICovCisgICAgICAgIH0gZ2V0X3Jlc3BvbnNlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHF1ZXVlX3NldHNfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFF1ZXVlIFNldHMgQ291bnQuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9xdWV1ZV9zZXQgKnF1ZXVlX3NldHM7ICAvKio8IFF1ZXVlIFNldHMuICovCisgICAgICAgIH0gc2V0X3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgcXVldWVfc2V0c19jb3VudDsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUXVldWUgU2V0cyBDb3VudC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3F1ZXVlX3NldCAqcXVldWVfc2V0czsgIC8qKjwgUXVldWUgU2V0cy4gKi8KKyAgICAgICAgfSBzZXRfcmVzcG9uc2U7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9wcm92X2Jhc2U7CisKKy8qKiBDVEMgT2xkIE1hbmFnZW1lbnQgT2JqZWN0IEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX29sZF9tYW5hZ2VtZW50X29iamVjdF9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX29sZF9tYW5hZ2VtZW50X29iamVjdCBsZWFmOyAgICAvKio8IExlYWYuICovCisgICAgdWludDhfdCBsZW5ndGg7ICAgICAgICAgLyoqPCBMZW5ndGguICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHBvcnQ7ICAgLyoqPCBQb3J0LiAqLworICAgICAgICB9IHBvcnQ7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fY3RjX29sZF9tYW5hZ2VtZW50X29iamVjdF9iYXNlOworCisvKiogQ1RDIE1hbmFnZW1lbnQgT2JqZWN0IEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfbWFuYWdlbWVudF9vYmplY3QgbGVhZjsgICAgLyoqPCBMZWFmLiAqLworICAgIHVpbnQ4X3QgbGVuZ3RoOyAvKio8IExlbmd0aC4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfcG9ydF90eXBlIHBvcnRfdHlwZTsgICAgLyoqPCBQb3J0IFR5cGUuICovCisgICAgICAgICAgICB1aW50OF90IGNhc2NhZGVfc2xvdF9udW1iZXI7ICAgICAgICAgICAgICAgIC8qKjwgQ2FzY2FkZSAvIFNsb3QgTnVtYmVyLiAqLworICAgICAgICAgICAgdWludDE2X3QgcG9ydF9udW1iZXI7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFBvcnQgTnVtYmVyLiAqLworICAgICAgICB9IHBvcnQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGNhcmQ7ICAgICAgLyoqPCBDYXJkLiAqLworICAgICAgICB9IGNhcmQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGxsaWQ7ICAgICAgLyoqPCBMTElELiAqLworICAgICAgICB9IGxsaWQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHBvbl9pZjsgICAgLyoqPCBQT04gSS9GLiAqLworICAgICAgICB9IHBvbl9pZjsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9jdGNfbWFuYWdlbWVudF9vYmplY3RfYmFzZTsKKworLyoqIENUQyBFbXB0eSBWYXIgQ29udGFpbmVyIEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX2VtcHR5X3Zhcl9jb250YWluZXJfYmFzZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfYnJhbmNoIGJyYW5jaDsgIC8qKjwgQnJhbmNoLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgbGVhZjsgICAgICAgICAgICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fZXJyb3JfY29kZSBlcnJvcjsgICAgICAgICAgICAgICAgICAgLyoqPCBFcnJvci4gKi8KKyAgICAgICAgfSBkZWY7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHVua25vd25fY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdW5rbm93bi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnVua25vd247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBVbmtub3duLiAqLworICAgICAgICB9IGVuZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2F0dHJpYnV0ZSBsZWFmOyAgICAgICAgICAgICAgICAvKio8IExlYWYuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX2Vycm9yX2NvZGUgZXJyb3I7ICAgICAgICAgICAgICAgICAgIC8qKjwgRXJyb3IuICovCisgICAgICAgIH0gYXR0cmlidXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uIGxlYWY7ICAgICAgICAgICAgICAgICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fZXJyb3JfY29kZSBlcnJvcjsgICAgICAgICAgICAgICAgICAgLyoqPCBFcnJvci4gKi8KKyAgICAgICAgfSBhY3Rpb247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb2xkX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2Ugb2JqZWN0OyAgLyoqPCBPYmplY3QuICovCisgICAgICAgIH0gb2xkX21hbmFnZW1lbnRfb2JqZWN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2Ugb2JqZWN0OyAgICAgIC8qKjwgT2JqZWN0LiAqLworICAgICAgICB9IG1hbmFnZW1lbnRfb2JqZWN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfZXh0X2F0dHJpYnV0ZSBsZWFmOyAgICAgICAgICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fZXJyb3JfY29kZSBlcnJvcjsgICAgICAgICAgICAgICAgICAgLyoqPCBFcnJvci4gKi8KKyAgICAgICAgfSBleHRfYXR0cmlidXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfZXh0X2FjdGlvbiBsZWFmOyAgICAgICAgICAgICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fZXJyb3JfY29kZSBlcnJvcjsgICAgICAgICAgICAgICAgICAgLyoqPCBFcnJvci4gKi8KKyAgICAgICAgfSBleHRfYWN0aW9uOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2F0dHJpYnV0ZSBsZWFmOyAgICAgICAgICAgICAgICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fZXJyb3JfY29kZSBlcnJvcjsgICAgICAgICAgICAgICAgICAgLyoqPCBFcnJvci4gKi8KKyAgICAgICAgfSBrdGF0dHJpYnV0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hdHRyaWJ1dGUgbGVhZjsgICAgICAgICAgICAgICAgICAvKio8IExlYWYuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX2Vycm9yX2NvZGUgZXJyb3I7ICAgICAgICAgICAgICAgICAgIC8qKjwgRXJyb3IuICovCisgICAgICAgIH0ga3RhY3Rpb247CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2VtcHR5X3Zhcl9jb250YWluZXJfYmFzZTsKKworLyoqIENUQyBFdGggUG9ydCBQb2xpY2luZyBDb25maWcgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfY29uZmlnX2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2V0aF9wb3J0X3BvbGljaW5nX2VuYWJsZSBzdGF0ZTsgLyoqPCBTdGF0ZS4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHVua25vd25fY291bnQ7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdW5rbm93bi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnVua25vd247ICAgICAgIC8qKjwgVW5rbm93bi4gKi8KKyAgICAgICAgfSBkZWY7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQyNF90IGNpcjsgICAgICAgICAgIC8qKjwgQ0lSLiAqLworICAgICAgICAgICAgdWludDI0X3QgYnVja2V0OyAgICAgICAgLyoqPCBCdWNrZXQuICovCisgICAgICAgICAgICB1aW50MjRfdCBleHRyYV9idXJzdDsgICAvKio8IEV4dHJhIEJ1cnN0LiAqLworICAgICAgICB9IGVuYWJsZWQ7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fY3RjX2V0aF9wb3J0X3BvbGljaW5nX2NvbmZpZ19iYXNlOworCisvKiogQ1RDIEV2ZW50IEVudHJ5LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9lbnRyeQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9tYW5hZ2VtZW50X29iamVjdCBvYmplY3RfdHlwZTsgLyoqPCBPYmplY3QgVHlwZS4gKi8KKyAgICB1aW50MzJfdCBvYmplY3RfaW5zdGFuY2U7ICAgICAgICAgICAgICAgICAgIC8qKjwgT2JqZWN0IEluc3RhbmNlLiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2FsYXJtX2lkIGFsYXJtX2lkOyAgLyoqPCBBbGFybSBJRC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9lbnRyeTsKKworLyoqIENUQyBFdmVudCBTdGF0dXMgRW50cnkuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N0YXR1c19lbnRyeQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfZW50cnkgZXZlbnRfZW50cnk7ICAgIC8qKjwgRXZlbnQgRW50cnkuICovCisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXMgZXZlbnRfc3RhdHVzOyAgLyoqPCBFdmVudCBTdGF0dXMuICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3RhdHVzX2VudHJ5OworCisvKiogQ1RDIEV2ZW50IFRocmVzaG9sZCBFbnRyeS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfdGhyZXNob2xkX2VudHJ5Cit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9lbnRyeSBldmVudF9lbnRyeTsgICAgLyoqPCBFdmVudCBFbnRyeS4gKi8KKyAgICB1aW50MzJfdCBzZXRfdGhyZXNob2xkOyAgICAgLyoqPCBTZXQgVGhyZXNob2xkLiAqLworICAgIHVpbnQzMl90IGNsZWFyX3RocmVzaG9sZDsgICAvKio8IENsZWFyIFRocmVzaG9sZC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF90aHJlc2hvbGRfZW50cnk7CisKKy8qKiBDVEMgRXZlbnQgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfYmFzZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3ViX3R5cGUgc3ViX3R5cGU7ICAgICAgICAgICAgICAgIC8qKjwgU3ViIFR5cGUuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBlbnRyeV9jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBFbnRyeSBDb3VudC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfZW50cnkgKmVudHJpZXM7ICAgICAgICAgICAvKio8IEVudHJpZXMuICovCisgICAgICAgIH0gc3RhdHVzX3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGVudHJ5X2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEVudHJ5IENvdW50LiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXNfZW50cnkgKmVudHJpZXM7ICAgIC8qKjwgRW50cmllcy4gKi8KKyAgICAgICAgfSBzdGF0dXNfc2V0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBlbnRyeV9jb3VudDsgICAvKio8IEVudHJ5IENvdW50LiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXNfZW50cnkgKmVudHJpZXM7ICAgIC8qKjwgRW50cmllcy4gKi8KKyAgICAgICAgfSBzdGF0dXNfcmVzcG9uc2U7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGVudHJ5X2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBFbnRyeSBDb3VudC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfZW50cnkgKmVudHJpZXM7ICAgLyoqPCBFbnRyaWVzLiAqLworICAgICAgICB9IHRocmVzaG9sZF9yZXF1ZXN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBlbnRyeV9jb3VudDsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRW50cnkgQ291bnQuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3RocmVzaG9sZF9lbnRyeSAqZW50cmllczsgLyoqPCBFbnRyaWVzLiAqLworICAgICAgICB9IHRocmVzaG9sZF9zZXQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGVudHJ5X2NvdW50OyAgIC8qKjwgRW50cnkgQ291bnQuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3RocmVzaG9sZF9lbnRyeSAqZW50cmllczsgLyoqPCBFbnRyaWVzLiAqLworICAgICAgICB9IHRocmVzaG9sZF9yZXNwb25zZTsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfYmFzZTsKKworLyoqIENUQyBFeHQgQWN0aW9uIFZhbHVlIEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hY3Rpb25fdmFsdWVfYmFzZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYWN0aW9uIGxlYWY7ICAgICAgICAgICAgICAgICAgIC8qKjwgTGVhZi4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICB9IGRlZjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2FjdGl2YXRpb24gYWN0aXZhdGVfZmFzdF9sZWF2ZTsgLyoqPCBBY3RpdmF0ZSBGYXN0IExlYXZlLiAqLworICAgICAgICB9IGZhc3RfbGVhdmVfYWRtaW5fY29udHJvbDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICB1aW50MzJfdCBudW1fbGxpZHM7ICAgICAgICAgLyoqPCBOdW1iZXIgb2YgTExJRHMgdG8gQWN0aXZhdGUgKi8KKyAgICAgICAgfSBtdWx0aV9sbGlkX2FkbWluX2NvbnRyb2w7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgdWludDMyX3Qgc2xlZXBfZHVyYXRpb247ICAgIC8qKjwgU2xlZXAgRHVyYXRpb24gKFVuaXQ6IFRRKSAqLworICAgICAgICAgICAgdWludDMyX3Qgd2FrZV9kdXJhdGlvbjsgICAgIC8qKjwgV2FrZSBEdXJhdGlvbiAoVW5pdDogVFEpICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zbGVlcF9mbGFnIHNsZWVwX2ZsYWc7ICAvKio8IFNsZWVwIEZsYWcuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zbGVlcF9tb2RlIHNsZWVwX21vZGU7ICAvKio8IFNsZWVwIE1vZGUuICovCisgICAgICAgIH0gc2xlZXBfY29udHJvbDsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2FjdGlvbl92YWx1ZV9iYXNlOworCisvKiogQ1RDIDIuMSBPTlUgU2VydmljZSBTTEEgVGFibGUgCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX3RhYmxlCit7CisgICAgdWludDhfdCBxdWV1ZV9udW1iZXI7ICAgICAgICAgICAvKio8IFF1ZXVlIG51bWJlciBvZiBzZXJ2aWNlICovCisgICAgdWludDE2X3QgZml4ZWRfcGFja2V0X3NpemU7ICAgICAvKio8IEZpeGVkIFBhY2tldCBzaXplIG9mIHNlcnZpY2UgKi8KKyAgICB1aW50MTZfdCBmaXhlZF9iYW5kd2lkdGg7ICAgICAgIC8qKjwgRml4ZWQgYmFuZHdpZHRoIG9mIHNlcnZpY2UgKi8KKyAgICB1aW50MTZfdCBndWFyYW50ZWVkX2JhbmR3aWR0aDsgIC8qKjwgR3VhcmFudGVlZCBiYW5kd2lkdGggb2Ygc2VydmljZSAqLworICAgIHVpbnQxNl90IGJlc3RfZWZmb3J0X2JhbmR3aWR0aDsgLyoqPCBCZXN0IGVmZm9ydCBiYW5kd2lkdGggb2Ygc2VydmljZSAqLworICAgIHVpbnQ4X3Qgd3JyX3dlaWdodDsgICAgICAgICAgICAgLyoqPCBXUlIgd2VpZ2h0IG9mIHNlcnZpY2UgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfdGFibGU7CisKKy8qKiBDVEMgT05VIFNlcnZpY2UgU0xBIEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19zZXJ2aWNlX3NsYV9vcGVyYXRpb24gb3BlcmF0aW9uX29mX3NlcnZpY2VfZGJhOyAvKio8IE9wZXJhdGlvbiBvZiBTZXJ2aWNlIERCQSAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3Qgc2VydmljZXNfY291bnQ7ICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHNlcnZpY2VzLiAqLworICAgICAgICAgICAgdWludDhfdCAqc2VydmljZXM7ICAgICAgICAgIC8qKjwgU2VydmljZXMuICovCisgICAgICAgIH0gZGVmOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9kYmFfc2NoZWR1bGluZ19zY2hlbWUgc2NoZW1lOyAgIC8qKjwgQmVzdCBlZmZvcnQgc2NoZWR1bGluZyBzY2hlbWUgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgcHJpb3JpdHk7ICAgICAgIC8qKjwgSGlnaCBwcmlvcml0eSBib3VuZGFyeSAqLworICAgICAgICAgICAgdWludDMyX3QgY3ljbGVfbGVuZ3RoOyAgLyoqPCBDeWNsZSBMZW5ndGggKi8KKyAgICAgICAgICAgIHVpbnQ4X3Qgc2VydmljZXNfY291bnQ7IC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIFNlcnZpY2VzICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV90YWJsZSAqc2VydmljZXM7ICAgIC8qKjwgQ3RjIE9udSBTTEEgVGFibGUgKi8KKyAgICAgICAgfSBhY3RpdmF0ZTsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX2Jhc2U7CisKKy8qKiBDVEMgMi4xIE9OVSBJbnRlcmZhY2UgCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2ludGVyZmFjZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2ludGVyZmFjZV90eXBlIHR5cGU7ICAgIC8qKjwgQ1RDIE9OVSBJbnRlcmZhY2UgVHlwZSAqLworICAgIHVpbnQxNl90IG51bV9wb3J0czsgLyoqPCBOdW1iZXIgb2YgUG9ydHMgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfaW50ZXJmYWNlOworCisvKiogQ1RDIE14VSBHbG9iYWwgUGFyYW1zIEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9nbG9iYWxfcGFyYW1zX2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9nbG9iYWxfcGFyYW1zX3dpZHRoIHdpZHRoOyAgLyoqPCBXaWR0aC4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX2lwdjRfYWRkcmVzcyBvbnVfaXBhZGRyZXNzOyAgICAgICAgICAgLyoqPCBNYW5hZ2VtZW50IE9OVSBJUCBBZGRyZXNzICovCisgICAgICAgICAgICBiY21vc19pcHY0X2FkZHJlc3Mgb251X25ldHdvcmtfbWFzazsgICAgICAgIC8qKjwgTWFuYWdlbWVudCBPTlUgTWFzayBBZGRyZXNzICovCisgICAgICAgICAgICBiY21vc19pcHY0X2FkZHJlc3Mgb251X2RlZmF1bHRfZ3c7ICAgICAgICAgIC8qKjwgTWFuYWdlbWVudCBPTlUgZGVmYXVsdCBHYXRld2F5ICovCisgICAgICAgICAgICB1aW50MTZfdCBkYXRhX2N2bGFuOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTWFuYWdlbWVudCBEYXRhIEN1c3RvbWVyIFZMQU4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGRhdGFfc3ZsYW47ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBNYW5hZ2VtZW50IERhdGEgU2VydmljZSBWTEFOICovCisgICAgICAgICAgICB1aW50OF90IGRhdGFfcHJpb3JpdHk7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTWFuYWdlbWVudCBEYXRhIFByaW9yaXR5ICovCisgICAgICAgIH0gaXB2NDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfaXB2Nl9hZGRyZXNzIG9udV9pcGFkZHJlc3M7ICAgICAgICAgICAvKio8IE1hbmFnZW1lbnQgT05VIElQIEFkZHJlc3MgKi8KKyAgICAgICAgICAgIHVpbnQzMl90IGlwdjZwcmVmaXhfbGVuZ3RoOyAgICAgICAgICAgICAgICAgLyoqPCBNYW5hZ2VtZW50IE9OVSBJUHY2IHByZWZpeCBsZW5ndGggKi8KKyAgICAgICAgICAgIGJjbW9zX2lwdjZfYWRkcmVzcyBvbnVfZGVmYXVsdF9ndzsgICAgICAgICAgLyoqPCBNYW5hZ2VtZW50IE9OVSBkZWZhdWx0IEdhdGV3YXkgKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGRhdGFfY3ZsYW47ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBNYW5hZ2VtZW50IERhdGEgQ3VzdG9tZXIgVkxBTiAqLworICAgICAgICAgICAgdWludDE2X3QgZGF0YV9zdmxhbjsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE1hbmFnZW1lbnQgRGF0YSBTZXJ2aWNlIFZMQU4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgZGF0YV9wcmlvcml0eTsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBNYW5hZ2VtZW50IERhdGEgUHJpb3JpdHkgKi8KKyAgICAgICAgfSBpcHY2OworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfZ2xvYmFsX3BhcmFtc19iYXNlOworCisvKiogQ1RDIE14VSBTTk1QIFBhcmFtcyBCYXNlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfc25tcF9wYXJhbXNfYmFzZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X3NubXBfcGFyYW1zX3dpZHRoIHdpZHRoOyAgICAvKio8IFdpZHRoLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBzbm1wX3ZlcnNpb247ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFNOTVAgVmVyc2lvbiAqLworICAgICAgICAgICAgYmNtb3NfaXB2NF9hZGRyZXNzIHRyYXBfaG9zdF9pcDsgICAgICAgICAgICAvKio8IFRyYXAgSG9zdCBJUCBBZGRyZXNzICovCisgICAgICAgICAgICB1aW50MTZfdCB0cmFwX3BvcnQ7ICAgICAgICAgICAgICAgICAvKio8IFRyYXAgUG9ydCAqLworICAgICAgICAgICAgdWludDE2X3Qgc25tcF9wb3J0OyAgICAgICAgICAgICAgICAgLyoqPCBTTk1QIFBvcnQgKi8KKyAgICAgICAgICAgIHVpbnQ4X3Qgc2VjdXJpdHlfbmFtZVszMl07ICAgICAgICAgIC8qKjwgU2VjdXJpdHkgTmFtZSAqLworICAgICAgICAgICAgdWludDhfdCBjb21tdW5pdHlfZm9yX3JlYWRbMzJdOyAgICAgLyoqPCBDb21tdW5pdHkgRm9yIFJlYWQgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgY29tbXVuaXR5X2Zvcl93cml0ZVszMl07ICAgIC8qKjwgQ29tbXVuaXR5IEZvciBXcml0ZSAqLworICAgICAgICB9IGlwdjQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgc25tcF92ZXJzaW9uOyAgICAgICAgICAgICAgIC8qKjwgU05NUCBWZXJzaW9uICovCisgICAgICAgICAgICBiY21vc19pcHY2X2FkZHJlc3MgdHJhcF9ob3N0X2lwOyAgICAvKio8IFRyYXAgSG9zdCBJUCBBZGRyZXNzICovCisgICAgICAgICAgICB1aW50MTZfdCB0cmFwX3BvcnQ7ICAgICAgICAgICAgICAgICAvKio8IFRyYXAgUG9ydCAqLworICAgICAgICAgICAgdWludDE2X3Qgc25tcF9wb3J0OyAgICAgICAgICAgICAgICAgLyoqPCBTTk1QIFBvcnQgKi8KKyAgICAgICAgICAgIHVpbnQ4X3Qgc2VjdXJpdHlfbmFtZVszMl07ICAgICAgICAgIC8qKjwgU2VjdXJpdHkgTmFtZSAqLworICAgICAgICAgICAgdWludDhfdCBjb21tdW5pdHlfZm9yX3JlYWRbMzJdOyAgICAgLyoqPCBDb21tdW5pdHkgRm9yIFJlYWQgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgY29tbXVuaXR5X2Zvcl93cml0ZVszMl07ICAgIC8qKjwgQ29tbXVuaXR5IEZvciBXcml0ZSAqLworICAgICAgICB9IGlwdjY7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9zbm1wX3BhcmFtc19iYXNlOworCisvKiogQ1RDIFZMQU4gRWxlbWVudC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50Cit7CisgICAgdWludDE2X3QgZXRoZXJfdHlwZTsgICAgICAgIC8qKjwgRXRoZXJUeXBlLiAqLworICAgIGJjbW9zX3ZsYW5fdGFnIHZsYW5fdGFnOyAgICAvKio8IFZMQU4gVGFnLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudDsKKworLyoqIENUQyBWTEFOIFRyYW5zbGF0aW9uLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3RyYW5zbGF0aW9uCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnQgb2xkX3ZsYW47ICAvKio8IE9sZCBWTEFOLiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50IG5ld192bGFuOyAgLyoqPCBOZXcgVkxBTi4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3RyYW5zbGF0aW9uOworCisvKiogQ1RDIFZMQU4gQWdncmVnYXRlIFRhYmxlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2FnZ3JlZ2F0ZV90YWJsZQoreworICAgIHVpbnQxNl90IHZsYW5zX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBWTEFOcyBDb3VudC4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudCBzdmxhbjsgICAgIC8qKjwgUy1WTEFOLiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50ICp2bGFuczsgICAgLyoqPCBWTEFOcy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2FnZ3JlZ2F0ZV90YWJsZTsKKworLyoqIENUQyBWbGFuIFByb3YgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fbW9kZSBtb2RlOyAvKio8IE1vZGUuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudCB2bGFuOyAgICAgICAgICAgICAgLyoqPCBWTEFOLiAqLworICAgICAgICB9IHRhZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnQgZGVmYXVsdF92bGFuOyAgICAgIC8qKjwgRGVmYXVsdCBWTEFOLiAqLworICAgICAgICAgICAgdWludDMyX3QgdHJhbnNsYXRpb25zX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRyYW5zbGF0aW9ucy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl90cmFuc2xhdGlvbiAqdHJhbnNsYXRpb25zOyAvKio8IFRyYW5zbGF0aW9ucy4gKi8KKyAgICAgICAgfSB0cmFuc2xhdGlvbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnQgZGVmYXVsdF92bGFuOyAgICAgIC8qKjwgRGVmYXVsdCBWTEFOLiAqLworICAgICAgICAgICAgdWludDMyX3QgcGVybWl0dGVkX3ZsYW5zX2NvdW50OyAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHBlcm1pdHRlZF92bGFucy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50ICpwZXJtaXR0ZWRfdmxhbnM7ICAvKio8IFBlcm1pdHRlZCBWTEFOcy4gKi8KKyAgICAgICAgfSB0cnVuazsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnQgZGVmYXVsdF92bGFuOyAgICAgIC8qKjwgRGVmYXVsdCBWTEFOLiAqLworICAgICAgICAgICAgdWludDE2X3QgdGFibGVzX2NvdW50OyAgLyoqPCBUYWJsZXMgQ291bnQuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fYWdncmVnYXRlX3RhYmxlICp0YWJsZXM7ICAgLyoqPCBUYWJsZXMuICovCisgICAgICAgIH0gYWdncmVnYXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBwZXJtaXR0ZWRfdmxhbnNfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gcGVybWl0dGVkX3ZsYW5zLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnQgKnBlcm1pdHRlZF92bGFuczsgIC8qKjwgUGVybWl0dGVkIFZMQU5zLiAqLworICAgICAgICB9IHRydW5rX21kdTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnQgZGVmYXVsdF92bGFuOyAgICAgIC8qKjwgRGVmYXVsdCBWTEFOLiAqLworICAgICAgICAgICAgdWludDMyX3QgcGVybWl0dGVkX3ZsYW5zX2NvdW50OyAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHBlcm1pdHRlZF92bGFucy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50ICpwZXJtaXR0ZWRfdmxhbnM7ICAvKio8IFBlcm1pdHRlZCBWTEFOcy4gKi8KKyAgICAgICAgfSBoeWJyaWQ7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlOworCisvKiogQ3RjIE9OVSBjbGFzc2lmaWNhdGlvbiBGaWVsZCAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9jbGF1c2VfYmFzZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfZmllbGQgZmllbGQ7ICAgICAgICAgICAgLyoqPCBDVEMgT05VIENsYXNzaWZpY2F0aW9uIEZpZWxkICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHZhbFsxNl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRoZSB2YWx1ZSB0byBtYXRjaCAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvciBvcDsgICAgLyoqPCBUaGUgb3BlcmF0aW9uIHRvIHBlcmZvcm0gaWYgbWF0Y2hlZCAqLworICAgICAgICB9IGRlZjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgdmFsOyAgLyoqPCBUaGUgdmFsdWUgdG8gbWF0Y2ggKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3Igb3A7ICAgIC8qKjwgVGhlIG9wZXJhdGlvbiB0byBwZXJmb3JtIGlmIG1hdGNoZWQgKi8KKyAgICAgICAgfSBkYTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgdmFsOyAgLyoqPCBUaGUgdmFsdWUgdG8gbWF0Y2ggKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3Igb3A7ICAgIC8qKjwgVGhlIG9wZXJhdGlvbiB0byBwZXJmb3JtIGlmIG1hdGNoZWQgKi8KKyAgICAgICAgfSBzYTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCByZXNlcnZlZFs1XTsgICAgLyoqPCBSZXNlcnZlZCBieXRlcyAoc2V0IHRvIDApICovCisgICAgICAgICAgICB1aW50OF90IHZhbDsgICAgICAgICAgICAvKio8IFRoZSB2YWx1ZSB0byBtYXRjaCAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvciBvcDsgICAgLyoqPCBUaGUgb3BlcmF0aW9uIHRvIHBlcmZvcm0gaWYgbWF0Y2hlZCAqLworICAgICAgICB9IHZsYW5fcHJpOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHJlc2VydmVkWzRdOyAgICAvKio8IFJlc2VydmVkIGJ5dGVzIChzZXQgdG8gMCkgKi8KKyAgICAgICAgICAgIHVpbnQxNl90IHZhbDsgICAgICAgICAgIC8qKjwgVGhlIHZhbHVlIHRvIG1hdGNoICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yIG9wOyAgICAvKio8IFRoZSBvcGVyYXRpb24gdG8gcGVyZm9ybSBpZiBtYXRjaGVkICovCisgICAgICAgIH0gdmxhbl9pZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCByZXNlcnZlZFs0XTsgICAgLyoqPCBSZXNlcnZlZCBieXRlcyAoc2V0IHRvIDApICovCisgICAgICAgICAgICB1aW50MTZfdCB2YWw7ICAgICAgICAgICAvKio8IFRoZSB2YWx1ZSB0byBtYXRjaCAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvciBvcDsgICAgLyoqPCBUaGUgb3BlcmF0aW9uIHRvIHBlcmZvcm0gaWYgbWF0Y2hlZCAqLworICAgICAgICB9IGV0aF90eXBlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHJlc2VydmVkWzJdOyAgICAvKio8IFJlc2VydmVkIGJ5dGVzIChzZXQgdG8gMCkgKi8KKyAgICAgICAgICAgIGJjbW9zX2lwdjRfYWRkcmVzcyB2YWw7IC8qKjwgVGhlIHZhbHVlIHRvIG1hdGNoICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yIG9wOyAgICAvKio8IFRoZSBvcGVyYXRpb24gdG8gcGVyZm9ybSBpZiBtYXRjaGVkICovCisgICAgICAgIH0gZGVzdF9pcDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCByZXNlcnZlZFsyXTsgICAgLyoqPCBSZXNlcnZlZCBieXRlcyAoc2V0IHRvIDApICovCisgICAgICAgICAgICBiY21vc19pcHY0X2FkZHJlc3MgdmFsOyAvKio8IFRoZSB2YWx1ZSB0byBtYXRjaCAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvciBvcDsgICAgLyoqPCBUaGUgb3BlcmF0aW9uIHRvIHBlcmZvcm0gaWYgbWF0Y2hlZCAqLworICAgICAgICB9IHNvdXJjZV9pcDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCByZXNlcnZlZFs1XTsgICAgLyoqPCBSZXNlcnZlZCBieXRlcyAoc2V0IHRvIDApICovCisgICAgICAgICAgICB1aW50OF90IHZhbDsgICAgICAgICAgICAvKio8IFRoZSB2YWx1ZSB0byBtYXRjaCAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvciBvcDsgICAgLyoqPCBUaGUgb3BlcmF0aW9uIHRvIHBlcmZvcm0gaWYgbWF0Y2hlZCAqLworICAgICAgICB9IGlwX3R5cGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgcmVzZXJ2ZWRbNV07ICAgIC8qKjwgUmVzZXJ2ZWQgYnl0ZXMgKHNldCB0byAwKSAqLworICAgICAgICAgICAgdWludDhfdCB2YWw7ICAgICAgICAgICAgLyoqPCBUaGUgdmFsdWUgdG8gbWF0Y2ggKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3Igb3A7ICAgIC8qKjwgVGhlIG9wZXJhdGlvbiB0byBwZXJmb3JtIGlmIG1hdGNoZWQgKi8KKyAgICAgICAgfSBpcF90b3M7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgcmVzZXJ2ZWRbNV07ICAgIC8qKjwgUmVzZXJ2ZWQgYnl0ZXMgKHNldCB0byAwKSAqLworICAgICAgICAgICAgdWludDhfdCB2YWw7ICAgICAgICAgICAgLyoqPCBUaGUgdmFsdWUgdG8gbWF0Y2ggKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3Igb3A7ICAgIC8qKjwgVGhlIG9wZXJhdGlvbiB0byBwZXJmb3JtIGlmIG1hdGNoZWQgKi8KKyAgICAgICAgfSBpcF9wcmVjOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHJlc2VydmVkWzRdOyAgICAvKio8IFJlc2VydmVkIGJ5dGVzIChzZXQgdG8gMCkgKi8KKyAgICAgICAgICAgIHVpbnQxNl90IHZhbDsgICAgICAgICAgIC8qKjwgVGhlIHZhbHVlIHRvIG1hdGNoICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yIG9wOyAgICAvKio8IFRoZSBvcGVyYXRpb24gdG8gcGVyZm9ybSBpZiBtYXRjaGVkICovCisgICAgICAgIH0gc291cmNlX3BvcnQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgcmVzZXJ2ZWRbNF07ICAgIC8qKjwgUmVzZXJ2ZWQgYnl0ZXMgKHNldCB0byAwKSAqLworICAgICAgICAgICAgdWludDE2X3QgdmFsOyAgICAgICAgICAgLyoqPCBUaGUgdmFsdWUgdG8gbWF0Y2ggKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3Igb3A7ICAgIC8qKjwgVGhlIG9wZXJhdGlvbiB0byBwZXJmb3JtIGlmIG1hdGNoZWQgKi8KKyAgICAgICAgfSBkZXN0X3BvcnQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgcmVzZXJ2ZWRbMTVdOyAgIC8qKjwgUmVzZXJ2ZWQgYnl0ZXMgKHNldCB0byAwKSAqLworICAgICAgICAgICAgdWludDhfdCB2YWw7ICAgICAgICAgICAgLyoqPCBUaGUgdmFsdWUgdG8gbWF0Y2ggKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3Igb3A7ICAgIC8qKjwgVGhlIG9wZXJhdGlvbiB0byBwZXJmb3JtIGlmIG1hdGNoZWQgKi8KKyAgICAgICAgfSBpcF92ZXI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgcmVzZXJ2ZWRbMTJdOyAgIC8qKjwgUmVzZXJ2ZWQgYnl0ZXMgKHNldCB0byAwKSAqLworICAgICAgICAgICAgdWludDMyX3QgdmFsOyAgICAgICAgICAgLyoqPCBUaGUgdmFsdWUgdG8gbWF0Y2ggKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3Igb3A7ICAgIC8qKjwgVGhlIG9wZXJhdGlvbiB0byBwZXJmb3JtIGlmIG1hdGNoZWQgKi8KKyAgICAgICAgfSBpcF9mbG93X2xhYmVsOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19pcHY2X2FkZHJlc3MgdmFsOyAvKio8IFRoZSB2YWx1ZSB0byBtYXRjaCAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvciBvcDsgICAgLyoqPCBUaGUgb3BlcmF0aW9uIHRvIHBlcmZvcm0gaWYgbWF0Y2hlZCAqLworICAgICAgICB9IGRzdF9pcHY2OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19pcHY2X2FkZHJlc3MgdmFsOyAvKio8IFRoZSB2YWx1ZSB0byBtYXRjaCAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvciBvcDsgICAgLyoqPCBUaGUgb3BlcmF0aW9uIHRvIHBlcmZvcm0gaWYgbWF0Y2hlZCAqLworICAgICAgICB9IHNyY19pcHY2OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19pcHY2X2FkZHJlc3MgdmFsOyAvKio8IFRoZSB2YWx1ZSB0byBtYXRjaCAodGhlIHByZWZpeCBsZW5ndGggbXVzdCBiZSBwYWNrZWQgaW50byB0aGUgTFNCKSAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvciBvcDsgICAgLyoqPCBUaGUgb3BlcmF0aW9uIHRvIHBlcmZvcm0gaWYgbWF0Y2hlZCAqLworICAgICAgICB9IGRzdF9pcHY2cHJlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19pcHY2X2FkZHJlc3MgdmFsOyAvKio8IFRoZSB2YWx1ZSB0byBtYXRjaCAodGhlIHByZWZpeCBsZW5ndGggbXVzdCBiZSBwYWNrZWQgaW50byB0aGUgTFNCKSAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvciBvcDsgICAgLyoqPCBUaGUgb3BlcmF0aW9uIHRvIHBlcmZvcm0gaWYgbWF0Y2hlZCAqLworICAgICAgICB9IHNyY19pcHY2cHJlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHJlc2VydmVkWzE1XTsgICAvKio8IFJlc2VydmVkIGJ5dGVzIChzZXQgdG8gMCkgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgdmFsOyAgICAgICAgICAgIC8qKjwgVGhlIHZhbHVlIHRvIG1hdGNoICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yIG9wOyAgICAvKio8IFRoZSBvcGVyYXRpb24gdG8gcGVyZm9ybSBpZiBtYXRjaGVkICovCisgICAgICAgIH0gbnh0X2hkcjsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfY2xhdXNlX2Jhc2U7CisKKy8qKiBDVEMgUnVsZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9jdGNfcnVsZQoreworICAgIHVpbnQ4X3QgcHJlY2VkZW5jZTsgICAgIC8qKjwgUHJlY2VkZW5jZS4gKi8KKyAgICB1aW50OF90IHF1ZXVlOyAgICAgICAgICAvKio8IFF1ZXVlLiAqLworICAgIHVpbnQ4X3QgcHJpX21hcmtpbmc7ICAgIC8qKjwgUHJpIE1hcmtpbmcuICovCisgICAgdWludDhfdCBjbGF1c2VzX2NvdW50OyAgLyoqPCBDbGF1c2VzIENvdW50LiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfY2xhdXNlX2Jhc2UgKmNsYXVzZXM7ICAgLyoqPCBDbGF1c2VzLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGU7CisKKy8qKiBDVEMgTXVsdGljYXN0IFZMQU4gUHJvdi4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fcHJvdgoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fb3BlcmF0aW9uIG9wZXJhdGlvbjsgLyoqPCBPcGVyYXRpb24uICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBtdWx0aWNhc3RfdmxhbnNfY291bnQ7ICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBtdWx0aWNhc3RfdmxhbnMuICovCisgICAgICAgICAgICBiY21vc192bGFuX3RhZyAqbXVsdGljYXN0X3ZsYW5zOyAgICAgICAgICAgICAgICAvKio8IE11bHRpY2FzdCBWTEFOcy4gKi8KKyAgICAgICAgfQorICAgICAgICBkZWxldGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IG11bHRpY2FzdF92bGFuc19jb3VudDsgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIG11bHRpY2FzdF92bGFucy4gKi8KKyAgICAgICAgICAgIGJjbW9zX3ZsYW5fdGFnICptdWx0aWNhc3RfdmxhbnM7ICAgICAgICAgICAgICAgIC8qKjwgTXVsdGljYXN0IFZMQU5zLiAqLworICAgICAgICB9IGFkZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgbXVsdGljYXN0X3ZsYW5zX2NvdW50OyAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gbXVsdGljYXN0X3ZsYW5zLiAqLworICAgICAgICAgICAgYmNtb3Nfdmxhbl90YWcgKm11bHRpY2FzdF92bGFuczsgICAgICAgICAgICAgICAgLyoqPCBNdWx0aWNhc3QgVkxBTnMuICovCisgICAgICAgIH0gbGlzdDsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fcHJvdjsKKworLyoqIENUQyBJUFRWIFZMQU4gRW50cnkuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX2lwdHZfdmxhbl9lbnRyeQoreworICAgIGJjbW9zX3ZsYW5fdGFnIG11bHRpY2FzdF92bGFuOyAgLyoqPCBNdWx0aWNhc3QgVkxBTi4gKi8KKyAgICBiY21vc192bGFuX3RhZyBpcHR2X3VzZXJfdmxhbjsgIC8qKjwgSVBUViBVc2VyIFZMQU4uICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfaXB0dl92bGFuX2VudHJ5OworCisvKiogQ1RDIE11bHRpY2FzdCBUYWcgT3BlcmF0aW9uIEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF90YWdfb3BlcmF0aW9uX2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF90YWdfbW9kZSB0YWdfbW9kZTsgICAgLyoqPCBUYWcgTW9kZS4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgbXVsdGljYXN0X3ZsYW5zX2NvdW50OyAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gTXVsdGljYXN0IFZMQU5zICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2lwdHZfdmxhbl9lbnRyeSAqbXVsdGljYXN0X3ZsYW5zOyAgIC8qKjwgTXVsdGljYXN0IFZMQU5zLiAqLworICAgICAgICB9IHN0cmlwX2RhdGFfcXVlcnlfaXB0djsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19vcGVyYXRpb25fYmFzZTsKKworLyoqIENUQyBNdWx0aWNhc3QgQ29udHJvbCBFbnRyeSBHREEgTUFDIE9ubHkuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfb25seQoreworICAgIHVpbnQxNl90IHVzZXJfaWQ7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFVzZXIgSUQuICovCisgICAgdWludDE2X3QgcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUmVzZXJ2ZWQuICovCisgICAgYmNtb3NfbWFjX2FkZHJlc3MgZ3JvdXBfbWFjX2FkZHJlc3M7ICAgIC8qKjwgR3JvdXAgTUFDIEFkZHJlc3MuICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19vbmx5OworCisvKiogQ1RDIE11bHRpY2FzdCBDb250cm9sIEVudHJ5IEdEQSBNQUMgKyBWTEFOIElELiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfdmxhbl9pZAoreworICAgIHVpbnQxNl90IHVzZXJfaWQ7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFVzZXIgSUQuICovCisgICAgdWludDE2X3QgbXVsdGljYXN0X3ZsYW47ICAgICAgICAgICAgICAgIC8qKjwgTXVsdGljYXN0IFZMQU4uICovCisgICAgYmNtb3NfbWFjX2FkZHJlc3MgZ3JvdXBfbWFjX2FkZHJlc3M7ICAgIC8qKjwgR3JvdXAgTUFDIEFkZHJlc3MuICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19wbHVzX3ZsYW5faWQ7CisKKy8qKiBDVEMgTXVsdGljYXN0IENvbnRyb2wgRW50cnkgR0RBIE1BQyArIElQdjQgU0EuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY0c2EKK3sKKyAgICB1aW50MTZfdCB1c2VyX2lkOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBVc2VyIElELiAqLworICAgIGJjbW9zX21hY19hZGRyZXNzIGdyb3VwX21hY19hZGRyZXNzOyAgICAvKio8IEdyb3VwIE1BQyBBZGRyZXNzLiAqLworICAgIGJjbW9zX2lwdjRfYWRkcmVzcyBpcHNvdXJjZV9hZGRyZXNzOyAgICAvKio8IElQIFNvdXJjZSBBZGRyZXNzLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY0c2E7CisKKy8qKiBDVEMgTXVsdGljYXN0IENvbnRyb2wgRW50cnkgR0RBIElQICsgTWNhc3QgVkxBTiBJRC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX2lwcGx1c19tY2FzdF92bGFuX2lkCit7CisgICAgdWludDE2X3QgdXNlcl9pZDsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVXNlciBJRC4gKi8KKyAgICB1aW50MTZfdCBtdWx0aWNhc3RfdmxhbjsgICAgICAgICAgICAgICAgLyoqPCBNdWx0aWNhc3QgVkxBTi4gKi8KKyAgICB1aW50MTZfdCByZXNlcnZlZDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBSZXNlcnZlZC4gKi8KKyAgICBiY21vc19pcHY0X2FkZHJlc3MgaXBtdWx0aWNhc3RfYWRkcmVzczsgLyoqPCBJUCBNdWx0aWNhc3QgQWRkcmVzcy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfaXBwbHVzX21jYXN0X3ZsYW5faWQ7CisKKy8qKiBDVEMgTXVsdGljYXN0IENvbnRyb2wgRW50cnkgR0RBIElQdjYgKyBNY2FzdCBWTEFOIElELiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfaXB2NnBsdXNfbWNhc3Rfdmxhbl9pZAoreworICAgIHVpbnQxNl90IHVzZXJfaWQ7ICAgICAgICAgICAvKio8IFVzZXIgSUQuICovCisgICAgdWludDE2X3QgbXVsdGljYXN0X3ZsYW47ICAgIC8qKjwgTXVsdGljYXN0IFZMQU4uICovCisgICAgYmNtb3NfaXB2Nl9hZGRyZXNzIGlwdjZtdWx0aWNhc3RfYWRkcmVzczsgICAvKio8IElQdjYgTXVsdGljYXN0IEFkZHJlc3MuICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX2lwdjZwbHVzX21jYXN0X3ZsYW5faWQ7CisKKy8qKiBDVEMgTXVsdGljYXN0IENvbnRyb2wgRW50cnkgR0RBIE1BQyArIElQdjYgU0EuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY2c2EKK3sKKyAgICB1aW50MTZfdCB1c2VyX2lkOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBVc2VyIElELiAqLworICAgIGJjbW9zX21hY19hZGRyZXNzIGdyb3VwX21hY19hZGRyZXNzOyAgICAvKio8IEdyb3VwIE1BQyBBZGRyZXNzLiAqLworICAgIGJjbW9zX2lwdjZfYWRkcmVzcyBpcHNvdXJjZV9hZGRyZXNzOyAgICAvKio8IElQIFNvdXJjZSBBZGRyZXNzLiAqLworfSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY2c2E7CisKKy8qKiBDVEMgTXVsdGljYXN0IENvbnRyb2wuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9hY3Rpb24gYWN0aW9uOyAgICAvKio8IEFjdGlvbi4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX3R5cGUgdHlwZTsgICAgICAgIC8qKjwgVHlwZS4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdG90YWxfZW50cmllc19jb3VudDsgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIHJlbWFpbmluZyBsaXN0IGVsZW1lbnRzIGluIGFsbCByZW1haW5pbmcgdmFyaWFibGUgY29udGFpbmVycyAqLworICAgICAgICAgICAgdWludDMyX3QgZW50cmllc19jb3VudDsgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gZW50cmllcy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19vbmx5ICplbnRyaWVzOyAgLyoqPCBFbnRyaWVzLiAqLworICAgICAgICB9IGdkYV9tYWNfb25seTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB0b3RhbF9lbnRyaWVzX2NvdW50OyAgICAvKio8IE51bWJlciBvZiByZW1haW5pbmcgbGlzdCBlbGVtZW50cyBpbiBhbGwgcmVtYWluaW5nIHZhcmlhYmxlIGNvbnRhaW5lcnMgKi8KKyAgICAgICAgICAgIHVpbnQzMl90IGVudHJpZXNfY291bnQ7ICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gZW50cmllcy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19wbHVzX3ZsYW5faWQgKmVudHJpZXM7ICAvKio8IEVudHJpZXMuICovCisgICAgICAgIH0gZ2RhX21hY19wbHVzX3ZsYW5faWQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdG90YWxfZW50cmllc19jb3VudDsgICAgLyoqPCBOdW1iZXIgb2YgcmVtYWluaW5nIGxpc3QgZWxlbWVudHMgaW4gYWxsIHJlbWFpbmluZyB2YXJpYWJsZSBjb250YWluZXJzICovCisgICAgICAgICAgICB1aW50MzJfdCBlbnRyaWVzX2NvdW50OyAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIGVudHJpZXMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY0c2EgKmVudHJpZXM7ICAgLyoqPCBFbnRyaWVzLiAqLworICAgICAgICB9IGdkYV9tYWNfcGx1c19pcHY0c2E7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdG90YWxfZW50cmllc19jb3VudDsgICAgLyoqPCBOdW1iZXIgb2YgcmVtYWluaW5nIGxpc3QgZWxlbWVudHMgaW4gYWxsIHJlbWFpbmluZyB2YXJpYWJsZSBjb250YWluZXJzICovCisgICAgICAgICAgICB1aW50MzJfdCBlbnRyaWVzX2NvdW50OyAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIGVudHJpZXMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9pcHBsdXNfbWNhc3Rfdmxhbl9pZCAqZW50cmllczsgIC8qKjwgRW50cmllcy4gKi8KKyAgICAgICAgfSBnZGFfaXBwbHVzX21jYXN0X3ZsYW5faWQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdG90YWxfZW50cmllc19jb3VudDsgICAgLyoqPCBOdW1iZXIgb2YgcmVtYWluaW5nIGxpc3QgZWxlbWVudHMgaW4gYWxsIHJlbWFpbmluZyB2YXJpYWJsZSBjb250YWluZXJzICovCisgICAgICAgICAgICB1aW50MzJfdCBlbnRyaWVzX2NvdW50OyAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIGVudHJpZXMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9pcHY2cGx1c19tY2FzdF92bGFuX2lkICplbnRyaWVzOyAgICAvKio8IEVudHJpZXMuICovCisgICAgICAgIH0gZ2RhX2lwdjZwbHVzX21jYXN0X3ZsYW5faWQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdG90YWxfZW50cmllc19jb3VudDsgICAgLyoqPCBOdW1iZXIgb2YgcmVtYWluaW5nIGxpc3QgZWxlbWVudHMgaW4gYWxsIHJlbWFpbmluZyB2YXJpYWJsZSBjb250YWluZXJzICovCisgICAgICAgICAgICB1aW50MzJfdCBlbnRyaWVzX2NvdW50OyAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIGVudHJpZXMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY2c2EgKmVudHJpZXM7ICAgLyoqPCBFbnRyaWVzLiAqLworICAgICAgICB9IGdkYV9tYWNfcGx1c19pcHY2c2E7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sOworCisvKiogQ1RDIDIuMSBPTlUgTExJRC9RdWV1ZSAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfbGxpZF9xdWV1ZQoreworICAgIHVpbnQxNl90IHF1ZXVlX2lkOyAgICAgIC8qKjwgSUQgb2YgcXVldWUgbnVtYmVyIGZvciB0aGUgTExJRCAqLworICAgIHVpbnQxNl90IHdycl93ZWlnaHQ7ICAgIC8qKjwgV1JSIFdlaWdodCBvZiBxdWV1ZSBudW1iZXIgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfbGxpZF9xdWV1ZTsKKworLyoqIFp0ZSBWbGFuIE1hYy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV96dGVfdmxhbl9tYWMKK3sKKyAgICBiY21vc192bGFuX3RhZyB2bGFuX2lkOyAgICAgICAgIC8qKjwgVmxhbiBJRC4gKi8KKyAgICBiY21vc19tYWNfYWRkcmVzcyBtYWNfZmlsdGVyOyAgIC8qKjwgTWFjIEZpbHRlci4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3p0ZV92bGFuX21hYzsKKworLyoqIENUQyBFeHQgQXR0cmlidXRlIFZhbHVlIEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYXR0cmlidXRlIGxlYWY7ICAgIC8qKjwgTGVhZi4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3BwcG9fZXRlc3Rfc3RhdHVzIHN0YXR1czsgICAgICAgLyoqPCBTdGF0dXMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fcHBwb19ldGVzdF9mYWlsX3JlYXNvbiByZWFzb247ICAvKio8IFJlYXNvbi4gKi8KKyAgICAgICAgfSBwcHBvX2V0ZXN0X3Jlc3VsdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fc3RhcnRfb3Jfc3RvcF9pbmRpY2F0aW9uIHN0YXJ0X29yX3N0b3A7IC8qKjwgU3RhcnRPclN0b3AuICovCisgICAgICAgICAgICB1aW50OF90IHVzZXJfbmFtZVs2NF07ICAgICAgICAgICAgICAgICAgLyoqPCBVc2VyTmFtZS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgcGFzc3dvcmRbMzJdOyAgICAgICAgICAgICAgICAgICAvKio8IFBhc3N3b3JkLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3BwcG9fZWF1dGhfbW9kZSBtb2RlOyAgIC8qKjwgTW9kZS4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IHZsYW47ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmxhbi4gKi8KKyAgICAgICAgfSBwcHBvX2V0ZXN0X2NvbmZpZ3VyYXRpb247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICB1aW50MzJfdCB1bmtub3duX2NvdW50OyAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB1bmtub3duLiAqLworICAgICAgICAgICAgdWludDhfdCAqdW5rbm93bjsgICAgICAgICAgICAgICAgICAgLyoqPCBVbmtub3duLiAqLworICAgICAgICB9IGRlZjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IHVua25vd25fY291bnQ7ICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHVua25vd24uICovCisgICAgICAgICAgICB1aW50OF90ICp1bmtub3duOyAgICAgICAgICAgICAgICAgICAvKio8IFVua25vd24uICovCisgICAgICAgIH0gZW5kOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgdWludDhfdCB2ZW5kb3JfaWRbNF07ICAgICAgICAgICAgICAgLyoqPCBWZW5kb3IgSUQuICovCisgICAgICAgICAgICB1aW50MzJfdCBvbnVfbW9kZWw7ICAgICAgICAgICAgICAgICAvKio8IE9OVSBNb2RlbC4gKi8KKyAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzIG9udV9tYWM7ICAgICAgICAgIC8qKjwgT05VIE1BQy4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgaHd2ZXJzaW9uWzhdOyAgICAgICAgICAgICAgIC8qKjwgSFcgVmVyc2lvbi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3Qgc3d2ZXJzaW9uWzE2XTsgICAgICAgICAgICAgIC8qKjwgU1cgVmVyc2lvbi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgZXh0X29udV9tb2RlbFsxNl07ICAgICAgICAgIC8qKjwgRXh0IE9OVSBNb2RlbC4gKi8KKyAgICAgICAgfSBvbnVfc2VyaWFsX251bWJlcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IGZpcm13YXJlX3ZlcnNpb25fY291bnQ7ICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIGZpcm13YXJlX3ZlcnNpb24uICovCisgICAgICAgICAgICB1aW50OF90ICpmaXJtd2FyZV92ZXJzaW9uOyAgICAgICAgICAvKio8IEZpcm13YXJlIFZlcnNpb24uICovCisgICAgICAgIH0gZmlybXdhcmVfdmVyc2lvbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IHZlbmRvcl9pZDsgICAgICAgICAgICAgICAgIC8qKjwgVmVuZG9yIElELiAqLworICAgICAgICAgICAgdWludDE2X3QgY2hpcF9tb2RlbDsgICAgICAgICAgICAgICAgLyoqPCBDaGlwIE1vZGVsLiAqLworICAgICAgICAgICAgdWludDhfdCByZXZpc2lvbjsgICAgICAgICAgICAgICAgICAgLyoqPCBSZXZpc2lvbi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgZGVzaWduX2RhdGVbM107ICAgICAgICAgICAgIC8qKjwgRGVzaWduIERhdGUuICovCisgICAgICAgIH0gY2hpcHNldF9pZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfc3VwcG9ydGVkX3NlcnZpY2VzIHNlcnZpY2VzOyAgICAvKio8IFNlcnZpY2VzLiAqLworICAgICAgICAgICAgdWludDhfdCBudW1fZ2Vwb3J0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bSBHRSBQb3J0cy4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IGdlYml0bWFwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBHRSBCaXRtYXAuICovCisgICAgICAgICAgICB1aW50OF90IG51bV9mZXBvcnRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtIEZFIFBvcnRzLiAqLworICAgICAgICAgICAgdWludDY0X3QgZmViaXRtYXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEZFIEJpdG1hcC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbnVtX3BvdHNfcG9ydHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW0gUE9UUyBQb3J0cy4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbnVtX2UxcG9ydHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW0gRTEgUG9ydHMuICovCisgICAgICAgICAgICB1aW50OF90IG51bV91cHN0cmVhbV9xdWV1ZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtIFVwc3RyZWFtIFF1ZXVlcy4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbWF4X3F1ZXVlc19wZXJfcG9ydF91cDsgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBNYXggUXVldWVzIFBlciBQb3J0IFVwLiAqLworICAgICAgICAgICAgdWludDhfdCBudW1fZG93bnN0cmVhbV9xdWV1ZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bSBEb3duc3RyZWFtIFF1ZXVlcy4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbWF4X3F1ZXVlc19wZXJfcG9ydF9kb3duOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBNYXggUXVldWVzIFBlciBQb3J0IERvd24uICovCisgICAgICAgICAgICB1aW50OF90IGJhdHRlcnlfYmFja3VwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQmF0dGVyeSBCYWNrdXAuICovCisgICAgICAgIH0gb251X2NhcGFiaWxpdGllczE7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IHRyYW5zY2VpdmVyX3RlbXBlcmF0dXJlOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUcmFuc2NlaXZlciBUZW1wZXJhdHVyZSAqLworICAgICAgICAgICAgdWludDE2X3Qgc3VwcGx5X3ZjYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFN1cHBseSBWb2x0YWdlIChWY2MpICovCisgICAgICAgICAgICB1aW50MTZfdCB0eF9iaWFzX2N1cjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVHggQmlhcyBDdXJyZW50ICovCisgICAgICAgICAgICB1aW50MTZfdCB0eF9wb3dlcl9vdXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVHggUG93ZXIgT3V0cHV0ICovCisgICAgICAgICAgICB1aW50MTZfdCByeF9wb3dlcl9pbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUnggUG93ZXIgSW5wdXQgKi8KKyAgICAgICAgfSBvcHRpY2FsX3RyYW5zY2VpdmVyX2RpYWdub3NpczsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfYmFzZSBzZXJ2aWNlX3NsYTsgICAvKio8IFNlcnZpY2UgU0xBICovCisgICAgICAgIH0gc2VydmljZV9zbGE7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfdHlwZSBvbnVfdHlwZTsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBDVEMgT05VIFR5cGUgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbnVtX2xpbmtzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGxpbmtzIHRoZSBPTlUgc3VwcG9ydHMgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3Byb3RlY3Rpb25fdHlwZSBwcm90ZWN0aW9uX3R5cGU7ICAgIC8qKjwgQ1RDIE9OVSBQcm90ZWN0aW9uIFR5cGUgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbnVtX3Bvbl9pZnM7ICAgICAgICAvKio8IE51bWJlciBvZiBQT04gSW50ZXJmYWNlcyAqLworICAgICAgICAgICAgdWludDhfdCBudW1fc2xvdHM7ICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIFNsb3QgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgaW50ZXJmYWNlc19jb3VudDsgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBJbnRlcmZhY2VzICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9pbnRlcmZhY2UgKmludGVyZmFjZXM7ICAvKio8IExpc3Qgb2YgaW50ZXJmYWNlcyAqLworICAgICAgICAgICAgYmNtb3NfYm9vbCBiYXR0ZXJ5X2JhY2t1cDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBCYXR0ZXJ5IEJhY2t1cCAqLworICAgICAgICB9IG9udV9jYXBhYmlsaXRpZXMyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfZW5hYmxlZF9zdGF0ZSBob2xkb3Zlcl9zdGF0ZTsgICAvKio8IEN1cnJlbnQgc3RhdGUgb2YgT05VIGhvbGRvdmVyICovCisgICAgICAgICAgICB1aW50MzJfdCBob2xkb3Zlcl90aW1lOyAvKio8IE9OVSBzdGF0ZSBob2xkb3ZlciB0aW1lLCBpbiBtcyAqLworICAgICAgICB9IGhvbGRvdmVyX2NvbmZpZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfZ2xvYmFsX3BhcmFtc19iYXNlIHBhcmFtczsgIC8qKjwgUGFyYW1ldGVycyAqLworICAgICAgICB9IG14dV9tYW5hZ2VfZ2xvYmFsX3BhcmFtZXRlcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfc25tcF9wYXJhbXNfYmFzZSBwYXJhbXM7ICAgIC8qKjwgUGFyYW1ldGVycyAqLworICAgICAgICB9IG14dV9tYW5hZ2Vfc25tcF9wYXJhbWV0ZXI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgdWludDhfdCBwb25fbnVtYmVyOyAgICAgICAgIC8qKjwgQWN0aXZlIFBPTiBQb3J0IE51bWJlciAqLworICAgICAgICB9IGFjdGl2ZV9wb25faWZhZG1pbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vc19ib29sIGlzX2lwdjZhd2FyZTsgICAgLyoqPCBJZiB0aGlzIGlzIHNldCwgSVB2NiBhd2FyZSBpcyBzdXBwb3J0ZWQgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3Bvd2VyX3N1cHBseV9jb250cm9sX3R5cGUgcG93ZXJfY29udHJvbF90eXBlOyAgIC8qKjwgT05VIFBvd2VyIFN1cHBseSBDb250cm9sICovCisgICAgICAgICAgICB1aW50OF90IHNlcnZpY2Vfc2xhOyAgICAvKio8IDB4MDE6IE5vdCBzdXBwb3J0IFNlcnZpY2UgU0xBLiAweDAyLTB4MDg6IFRoZSBudW1iZXIgb2Ygc2VydmljZSBzdXBwb3J0ZWQgKi8KKyAgICAgICAgfSBvbnVfY2FwYWJpbGl0aWVzMzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIGJjbW9zX2Jvb2wgbGlua19zdGF0ZTsgIC8qKjwgTGluayBTdGF0ZS4gKi8KKyAgICAgICAgfSBldGhfbGlua19zdGF0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIGJjbW9zX2Jvb2wgZW5hYmxlZDsgICAgIC8qKjwgRW5hYmxlZC4gKi8KKyAgICAgICAgfSBldGhfcG9ydF9wYXVzZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfY29uZmlnX2Jhc2UgY29uZmlnOyAgIC8qKjwgQ29uZmlnLiAqLworICAgICAgICB9IGV0aF9wb3J0X3BvbGljaW5nOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb3NfYm9vbCBwb3J0X3N0YXRlOyAgICAgICAgICAgICAgLyoqPCBQb3J0IFN0YXRlLiAqLworICAgICAgICB9IHZvaXBfcG9ydDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIGJjbW9zX2Jvb2wgcG9ydF9zdGF0ZTsgICAgICAgICAgICAgIC8qKjwgUG9ydCBTdGF0ZS4gKi8KKyAgICAgICAgfSBlMXBvcnQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vc19ib29sIHJhdGVfbGltaXRpbmdfZW5hYmxlZDsgICAvKio8IFJhdGUgTGltaXRpbmcgRW5hYmxlZC4gKi8KKyAgICAgICAgICAgIHVpbnQyNF90IGNpcjsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRG93bnN0cmVhbSBDb21taXR0ZWQgSW5mb3JtYXRpb24gUmF0ZSBpbiBLYnBzICovCisgICAgICAgICAgICB1aW50MjRfdCBwaXI7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IERvd25zdHJlYW0gUGVhayBJbmZvcm1hdGlvbiBSYXRlIGluIEticHMgKi8KKyAgICAgICAgfSBldGhfcG9ydF9kb3duX3JhdGVfbGltaXRpbmc7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2VuYWJsZWRfc3RhdGUgc3RhdGU7ICAgIC8qKjwgU3RhdGUgb2YgdGhlIGxvb3BiYWNrIGRldGVjdGlvbiBmZWF0dXJlICovCisgICAgICAgIH0gcG9ydF9sb29wX2RldGVjdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlIHZsYW5faW5mbzsgICAvKio8IFZMQU4gSW5mby4gKi8KKyAgICAgICAgfSB2bGFuOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfY2xhc3NpZmljYXRpb25fb3BlcmF0aW9uIG9wOyAgICAvKio8IE9wLiAqLworICAgICAgICAgICAgdWludDhfdCBydWxlc19jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUnVsZXMgQ291bnQuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGUgKnJ1bGVzOyAgICAgICAgICAgICAgICAgICAgLyoqPCBSdWxlcy4gKi8KKyAgICAgICAgfSBjbGFzc2lmaWNhdGlvbl9hbmRfbWFya2luZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX3Byb3Ygdmxhbl9pbmZvOyAgLyoqPCBWTEFOIEluZm8uICovCisgICAgICAgIH0gbXVsdGljYXN0X3ZsYW47CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfdGFnX29wZXJhdGlvbl9iYXNlIHRhZ19vcGVyYXRpb247IC8qKjwgVGFnIE9wZXJhdGlvbi4gKi8KKyAgICAgICAgfSBtdWx0aWNhc3RfdGFnX29wZXJhdGlvbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9zd2l0Y2hfbW9kZSBtb2RlOyAvKio8IE1vZGUuICovCisgICAgICAgIH0gbXVsdGljYXN0X3N3aXRjaDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sIHZhbHVlOyAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG11bHRpY2FzdF9jb250cm9sOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgdWludDhfdCBtYXhfZ3JvdXBzOyAgICAgICAgICAgICAgICAgLyoqPCBNYXggR3JvdXBzLiAqLworICAgICAgICB9IGdyb3VwX21heDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IGZhc3RfbGVhdmVfbW9kZXNfY291bnQ7ICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIEZhc3QgTGVhdmUgTW9kZXMgKi8KKyAgICAgICAgICAgIHVpbnQzMl90ICpmYXN0X2xlYXZlX21vZGVzOyAgICAgICAgIC8qKjwgQml0bWFwcyBmb3IgZWFjaCBlbnVtZXJhdGVkIGZhc3QgbGVhdmUgbW9kZSAqLworICAgICAgICB9IGZhc3RfbGVhdmVfYWJpbGl0eTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfZW5hYmxlZF9zdGF0ZSBzdGF0ZTsgICAgLyoqPCBTdGF0ZS4gKi8KKyAgICAgICAgfSBmYXN0X2xlYXZlX2FkbWluX3N0YXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICB1aW50OF90IGxsaWRfcXVldWVfdGFibGVfY291bnQ7IC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIExMSUQvUXVldWUgVGFibGUgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2xsaWRfcXVldWUgKmxsaWRfcXVldWVfdGFibGU7ICAgLyoqPCBDVEMgMi4xIE9OVSBMTElEIFF1ZXVlIENvbmZpZ3VyYXRpb24gVGFibGUgKi8KKyAgICAgICAgfSBsbGlkX3F1ZXVlX2NvbmZpZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vc19tYWNfYWRkcmVzcyBpYWRfbWFjOyAgLyoqPCBJQUQgTUFDIEFkZHJlc3MgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pcF9wcm90b2NvbCBwcm90b2NvbF9zdXBwb3J0OyAvKio8IFByb3RvY29sIFN1cHBvcnQgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgaWFkX3NvZnR3YXJlX3ZlclszMl07ICAgICAgICAgICAgICAgICAgICAgICAvKio8IElBRCBTb2Z0d2FyZSB2ZXJzaW9uICovCisgICAgICAgICAgICB1aW50OF90IGlhZF9zb2Z0d2FyZV90aW1lWzMyXTsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBJQUQgc29mdHdhcmUgdGltZSwgdmVyc2lvbiB0aW1lIGZvcm1hdCB1c2VzOllZWVlNTURESEhNTVNTICovCisgICAgICAgICAgICB1aW50OF90IHZvaXBfdXNlcl9jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEluZGljYXRlIFBPVFMgbnVtYmVyIG9mIElBRCBtb2R1bGUgKi8KKyAgICAgICAgfSBpYWRfaW5mb3JtYXRpb247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX2lwbW9kZSB2b2ljZV9pcG1vZGU7ICAvKio8IENUQyBWb2ljZSBJUCBNb2RlICovCisgICAgICAgICAgICBiY21vc19pcHY0X2FkZHJlc3MgaWFkX2lwYWRkcjsgICAgICAgICAgICAgICAgICAvKio8IElBRCBJUCBBZGRyZXNzICovCisgICAgICAgICAgICBiY21vc19pcHY0X2FkZHJlc3MgaWFkX25ldF9tYXNrOyAgICAgICAgICAgICAgICAvKio8IElBRCBOZXQgTWFzayBBZGRyZXNzICovCisgICAgICAgICAgICBiY21vc19pcHY0X2FkZHJlc3MgaWFkX2RlZmF1bHRfZ3c7ICAgICAgICAgICAgICAvKio8IElBRCBEZWZhdWx0IEdhdGV3YXkgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfcHBwb2VfbW9kZSBwcHBvZV9tb2RlOyAgICAgIC8qKjwgUFBQb0UgTW9kZSAqLworICAgICAgICAgICAgdWludDhfdCBwcHBvZV91c2VybmFtZVszMl07ICAgICAgICAgICAgICAgICAgICAgLyoqPCBQUFBvRSBVc2VybmFtZSAqLworICAgICAgICAgICAgdWludDhfdCBwcHBvZV9wYXNzd29yZFszMl07ICAgICAgICAgICAgICAgICAgICAgLyoqPCBQUFBvRSBQYXNzd29yZCAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV90YWdnaW5nX21vZGUgdGFnZ2luZ19tb2RlOyAgICAvKio8IFRhZ2dpbmcgTW9kZSAqLworICAgICAgICAgICAgdWludDE2X3Qgdm9pY2VfY3ZsYW47ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFZvaWNlIENWTEFOICovCisgICAgICAgICAgICB1aW50MTZfdCB2b2ljZV9zdmxhbjsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVm9pY2UgU1ZMQU4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3Qgdm9pY2VfcHJpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBWb2ljZSBQcmlvcml0eSAqLworICAgICAgICB9IHZvaXBfZ2xvYmFsX3BhcmFtZXRlcnM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IG1ncG9ydF9udW1iZXI7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBNRyBQb3J0IE51bWJlciAqLworICAgICAgICAgICAgYmNtb3NfaXB2NF9hZGRyZXNzIG1nY19pcDsgICAgICAgICAgICAgICAgICAvKio8IEFjdGl2YXRlIHNvZnRzd2l0Y2ggcGxhdGZvcm0gSVAgYWRkcmVzcyAqLworICAgICAgICAgICAgdWludDE2X3QgbWdjX2NvbV9wb3J0OyAgICAgICAgICAgICAgICAgICAgICAvKio8IEFjdGl2YXRlIHNvZnRzd2l0Y2ggcGxhdGZvcm0gQ09NIHBvcnQgbnVtYmVyICovCisgICAgICAgICAgICBiY21vc19pcHY0X2FkZHJlc3MgYmFja3VwX21nY19pcDsgICAgICAgICAgIC8qKjwgQmFja3VwIHNvZnRzd2l0Y2ggcGxhdGZvcm0gSVAgYWRkcmVzcy4gSWYgaXQgaXMgMHgwMDAwMDAwMCwgZHVhbCBob21pbmcgaXMgbm90IGVuYWJsZSAqLworICAgICAgICAgICAgdWludDE2X3QgYmFja3VwX21nY19jb21fcG9ydDsgICAgICAgICAgICAgICAvKio8IEJhY2t1cCBzb2Z0c3dpdGNoIHBsYXRmb3JtIENPTSBwb3J0IG51bWJlciwgaWYgaXQgaXMgMCwgZHVhbCBob21pbmcgaXMgbm90IGVuYWJsZWQgKi8KKyAgICAgICAgICAgIGJjbW9zX2Jvb2wgdXNlX2FjdGl2ZV9tZ2M7ICAgICAgICAgICAgICAgICAgLyoqPCBTaG91bGQgd2UgdXNlIHRoZSBhY3RpdmUgc29mdHN3aXRjaCBwbGF0Zm9ybSBpbnN0ZWFkIG9mIHRoZSBiYWNrdXA/ICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2gyNDhyZWdfbW9kZSByZWdfbW9kZTsgIC8qKjwgSDI0OCBSZWcgTW9kZSAqLworICAgICAgICAgICAgdWludDhfdCBtaWRbNjRdOyAgICAvKio8IE1JRCAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19oMjQ4aGVhcnRiZWF0X21vZGUgaGVhcnRiZWF0X21vZGU7ICAvKio8IEhlYXJ0YmVhdCBNb2RlICovCisgICAgICAgICAgICB1aW50MTZfdCBoZWFydGJlYXRfY3ljbGU7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IEhlYXJ0YmVhdCBDeWNsZSAqLworICAgICAgICAgICAgdWludDhfdCBoZWFydGJlYXRfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBIZWFydGJlYXQgQ291bnQgKi8KKyAgICAgICAgfSBoMjQ4cGFyYW1ldGVyczsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbmFtZVszMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVXNlciBUSUQgTmFtZSAqLworICAgICAgICB9IGgyNDh1c2VyX3RpZF9pbmZvcm1hdGlvbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbnVtX3J0cF90aWRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIFJUUCBUSURzICovCisgICAgICAgICAgICB1aW50OF90IHByZWZpeFsxNl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFByZWZpeCBpbiBBU0NJSSAqLworICAgICAgICAgICAgdWludDY0X3QgZGlnaXRfYmVnaW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBSVFAgVElEIGRpZ2l0YWwgcG9ydGlvbiBzdGFydCB2YWx1ZSAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19ydHBfdGlkX21vZGUgcnRwX3RpZF9tb2RlOyAgLyoqPCBSVFAgVElEIE1vZGUgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgcnRwX3RpZF9sZW5ndGg7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBSVFAgVElEIERpZ2l0IExlbmd0aCAqLworICAgICAgICB9IGgyNDhydHBfdGlkX2NvbmZpZ3VyYXRpb247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbnVtX3J0cF90aWRzOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgUlRQIFRJRHMgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgZmlyc3RfcnRwX3RpZF9uYW1lWzMyXTsgICAgICAgICAgICAgLyoqPCBGcmlzdCBSVFAgVElEIE5hbWUgKi8KKyAgICAgICAgfSBoMjQ4cnRwX3RpZF9pbmZvcm1hdGlvbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgdWludDE2X3QgbWdwb3J0X251bWJlcjsgICAgICAgICAgICAgICAgICAgICAvKio8IE1HIFBvcnQgTnVtYmVyICovCisgICAgICAgICAgICBiY21vc19pcHY0X2FkZHJlc3MgYWN0aXZlX3NpcF9pcDsgICAgICAgICAgIC8qKjwgQWN0aXZlIFNJUCBhZ2VudCBzZXJ2ZXIgSVAgYWRkcmVzcyAqLworICAgICAgICAgICAgdWludDE2X3QgYWN0aXZlX3NpcF9jb21fcG9ydDsgICAgICAgICAgICAgICAvKio8IEFjdGl2ZSBTSVAgYWdlbnQgc2VydmVyIHBvcnQgbnVtYmVyICovCisgICAgICAgICAgICBiY21vc19pcHY0X2FkZHJlc3MgYmFja3VwX3NpcF9pcDsgICAgICAgICAgIC8qKjwgQmFja3VwIFNJUCBhZ2VudCBzZXJ2ZXIgSVAgYWRkcmVzcyAqLworICAgICAgICAgICAgdWludDE2X3QgYmFja3VwX3NpcF9jb21fcG9ydDsgICAgICAgICAgICAgICAvKio8IEJhY2t1cCBTSVAgUHJveHkgU2VydmVyIENvbSBQb3J0IE51bWJlciAqLworICAgICAgICAgICAgYmNtb3NfaXB2NF9hZGRyZXNzIGFjdGl2ZV9zaXBfcHJveHlfc2VydmVyOyAvKio8IEFjdGl2ZSBTSVAgUHJveHkgU2VydmVyICovCisgICAgICAgICAgICBiY21vc19pcHY0X2FkZHJlc3MgYWN0aXZlX3NpcF9yZWdpc3RyYXRpb25fc2VydmVyX2lwOyAgIC8qKjwgU0lQIFJlZ2lzdGVyIFNlcnZlciBJUCAqLworICAgICAgICAgICAgdWludDE2X3QgYWN0aXZlX3NpcF9yZWdpc3RyYXRpb25fc2VydmVyX2NvbV9wb3J0OyAgICAgICAvKio8IEFjdGl2ZSBTSVAgcmVnaXN0cmF0aW9uIHNlcnZlciBwb3J0IG51bWJlciAqLworICAgICAgICAgICAgYmNtb3NfaXB2NF9hZGRyZXNzIGJhY2t1cF9zaXBfcmVnX2lwOyAgICAgICAgICAgICAgICAgICAvKio8IEJhY2t1cCBTSVAgUmVnaXN0cmF0aW9uIFNlcnZlciBJUCAqLworICAgICAgICAgICAgdWludDE2X3QgYmFja3VwX3NpcF9yZWdfY29tX3BvcnQ7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IEJhY2t1cCBTSVAgUmVnaXN0cmF0aW9uIFNlcnZlciBDb20gUG9ydCBOdW1iZXIgKi8KKyAgICAgICAgICAgIGJjbW9zX2lwdjRfYWRkcmVzcyBvdXRib3VuZF9zZXJ2ZXJfaXA7ICAgICAgICAgICAgICAgICAgLyoqPCBPdXQgQm91bmQgU2VydmVyIElQICovCisgICAgICAgICAgICB1aW50MTZfdCBvdXRib3VuZF9zZXJ2ZXJfcG9ydDsgICAgICAgICAgLyoqPCBPdXQgQm91bmQgU2VydmVyIFBvcnQgTnVtYmVyICovCisgICAgICAgICAgICB1aW50MzJfdCBzaXBfcmVnaXN0cmF0aW9uX2ludGVydmFsOyAgICAgLyoqPCBSZWdpc3RyYXRpb24gcmVmcmVzaCBjeWNsZSwgdW5pdCBpcyBzZWNvbmQsIGFuZCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyAzNjAwcyAqLworICAgICAgICAgICAgYmNtb3NfYm9vbCBkaXNhYmxlX2hlYXJ0YmVhdF9zd2l0Y2g7ICAgIC8qKjwgRGlzYWJsZSBIZWFydGJlYXQgU3dpdGNoIEZlYXR1cmUgKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGhlYXJ0YmVhdF9jeWNsZTsgICAgICAgICAgICAgICAvKio8IEhlYXJ0YmVhdCBDeWNsZSAqLworICAgICAgICAgICAgdWludDE2X3QgaGVhcnRiZWF0X2NvdW50OyAgICAgICAgICAgICAgIC8qKjwgSGVhcnRiZWF0IENvdW50ICovCisgICAgICAgIH0gc2lwX3BhcmFtZXRlcnM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICB1aW50OF90IGFjY291bnRbMTZdOyAgICAvKio8IFVzZXIgYWNjb3VudCwgVXNlciBwaG9uZSBudW1iZXIsIGFuZCBzaG91bGQgdXNlIEFTQ0lJIGNvZGUgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbmFtZVszMl07ICAgICAgIC8qKjwgVXNlciBuYW1lLCBTSVAgcG9ydCB1c2VybmFtZSwgYW5kIHNob3VsZCB1c2UgQVNDSUkgY29kZSAqLworICAgICAgICAgICAgdWludDhfdCBwYXNzd29yZFsxNl07ICAgLyoqPCBVc2VyIHBhc3N3b3JkLCBTSVAgcG9ydCBwYXNzd29yZCwgYW5kIHNob3VsZCB1c2UgQVNDSUkgY29kZS4gKi8KKyAgICAgICAgfSBzaXBfdXNlcl9wYXJhbWV0ZXJzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV90Mzhtb2RlIHZvaWNlX3QzOGVuYWJsZTsgIC8qKjwgQ3RjIFZvaWNlIFQzOCBFbmFibGUgTW9kZSAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV9mYXhfbW9kZW1fY29udHJvbF9tb2RlIHZvaWNlX2ZheF9tb2RlbV9jb250cm9sOyAgIC8qKjwgQ1RDIFZvaWNlIEZheCBNb2RlbSBDb250cm9sIE1vZGUgKi8KKyAgICAgICAgfSBmYXhfbW9kZW1fY29uZmlndXJhdGlvbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9vcGVyYXRpb25fc3RhdHVzIGlhZF9vcGVyYXRpb25fc3RhdHVzOyAgLyoqPCBDVEMgSUFEIE9wZXJhdGlvbiBTdGF0dXMgKi8KKyAgICAgICAgfSBoMjQ4aWFkX29wZXJhdGlvbl9zdGF0dXM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9zdGF0dXMgaWFkX3BvcnRfc3RhdHVzOyAgICAgICAgICAgICAgICAvKio8IENUQyBJQUQgUG9ydCBTdGF0dXMgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX3BvcnRfc2VydmljZV9zdGF0ZSBpYWRfcG9ydF9zZXJ2aWNlX3N0YXRlOyAgLyoqPCBDVEMgSUFEIFBvcnQgU2VydmljZSBTdGF0ZSAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9jb2RlY19tb2RlIGlhZF9wb3J0X2NvZGVjX21vZGU7ICAgICAgICAvKio8IENUQyBJQUQgUG9ydCBDb2RlYyBNb2RlICovCisgICAgICAgIH0gcG90c19zdGF0dXM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfb3BlcmF0aW9uIGlhZF9vcGVyYXRpb247ICAgIC8qKjwgQ1RDIElBRCBPcGVyYXRpb24gKi8KKyAgICAgICAgfSBpYWRfb3BlcmF0aW9uOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICB1aW50MTZfdCBzaXBfZGlnaXRhbF9tYXBfY291bnQ7IC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIFNJUCBEaWdpdGFsIE1hcCAqLworICAgICAgICAgICAgdWludDhfdCAqc2lwX2RpZ2l0YWxfbWFwOyAgICAgICAvKio8IFNJUCBQcm90b2NvbCBEaWdpdGFsIE1hcCwgQVNDSUkgY29kZSB0eXBlICovCisgICAgICAgIH0gc2lwX2RpZ2l0X21hcDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfYWxhcm1faWQgaWQ7ICAgICAgICAvKio8IEFsYXJtIElEICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2VuYWJsZWRfc3RhdGUgY29uZmlnOyAgIC8qKjwgQWxhcm0gY29uZmlndXJhdGlvbiBzdGF0ZSAqLworICAgICAgICB9IGFsYXJtX2FkbWluX3N0YXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2FsYXJtX2lkIGlkOyAgICAvKio8IEFsYXJtIElEICovCisgICAgICAgICAgICB1aW50MzJfdCB0aHJlc2hvbGQ7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBBbGFybSBUaHJlc2hvbGQgKi8KKyAgICAgICAgICAgIHVpbnQzMl90IGNsZWFyaW5nX3RocmVzaG9sZDsgICAgICAgICAgICAvKio8IENsZWFyaW5nIEFsYXJtIFRocmVzaG9sZCAqLworICAgICAgICB9IGFsYXJtX3RocmVzaG9sZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb3NfaXB2NF9hZGRyZXNzIGlwYWRkcmVzczsgICAvKio8IElQIEFkZHJlc3MuICovCisgICAgICAgICAgICBiY21vc19pcHY0X2FkZHJlc3MgaXBtYXNrOyAgICAgIC8qKjwgSVAgTWFzay4gKi8KKyAgICAgICAgICAgIGJjbW9zX2lwdjRfYWRkcmVzcyBnYXRld2F5OyAgICAgLyoqPCBHYXRlV2F5LiAqLworICAgICAgICAgICAgYmNtb3Nfdmxhbl90YWcgdmxhbl9pZDsgICAgICAgICAvKio8IFZsYW4gSUQuICovCisgICAgICAgICAgICB1aW50OF90IHVzZXJfbmFtZVs4XTsgICAgICAgICAgIC8qKjwgVXNlciBOYW1lLiAqLworICAgICAgICAgICAgdWludDhfdCBwYXNzd29yZFs4XTsgICAgICAgICAgICAvKio8IFBhc3N3b3JkLiAqLworICAgICAgICAgICAgdWludDhfdCBhY3Rpb247ICAgICAgICAgICAgICAgICAvKio8IEFjdGlvbi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgdmVyc2lvbl9udW1iZXI7ICAgICAgICAgLyoqPCBWZXJzaW9uIE51bWJlci4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgdmVyMW5hbWVbMTZdOyAgICAgICAgICAgLyoqPCBWZXIxIE5hbWUuICovCisgICAgICAgICAgICB1aW50OF90IHZlcjJuYW1lWzE2XTsgICAgICAgICAgIC8qKjwgVmVyMiBOYW1lLiAqLworICAgICAgICAgICAgdWludDhfdCB2ZXIzbmFtZVsxNl07ICAgICAgICAgICAvKio8IFZlcjMgTmFtZS4gKi8KKyAgICAgICAgfSB2ZXJzaW9uX3NlcnZlcl9wYXJhOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICB1aW50MTZfdCBtYWNfbGltaXRfbnVtYmVyOyAgICAgIC8qKjwgTWFjIExpbWl0IE51bWJlci4gKi8KKyAgICAgICAgfSBvbnVfbWFjX2xpbWl0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICB1aW50MzJfdCBtYWNfYWdpbmdfdGltZTsgICAgICAgIC8qKjwgTWFjIEFnaW5nIFRpbWUuICovCisgICAgICAgIH0gb251X21hY19hZ2luZ190aW1lOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fenRlX29udV9wb3J0X21hY19vcGVyYXRpb24gb3A7ICAvKio8IE9wLiAqLworICAgICAgICAgICAgdWludDhfdCBudW1iZXJfb2ZfZW50cmllczsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgT2YgRW50cmllcy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV96dGVfdmxhbl9tYWMgKmNsYXVzZTsgICAgICAgICAgIC8qKjwgQ2xhdXNlLiAqLworICAgICAgICB9IG9udV9wb3J0X21hY19maWx0ZXI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3p0ZV9vbnVfcG9ydF9tYWNfb3BlcmF0aW9uIG9wOyAgLyoqPCBPcC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbnVtYmVyX29mX2VudHJpZXM7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIE9mIEVudHJpZXMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fenRlX3ZsYW5fbWFjICpjbGF1c2U7ICAgICAgICAgICAvKio8IENsYXVzZS4gKi8KKyAgICAgICAgfSBvbnVfcG9ydF9tYWNfYmluZGluZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fenRlX29udV9wb3J0X21hY19vcGVyYXRpb24gb3A7ICAvKio8IE9wLiAqLworICAgICAgICAgICAgdWludDhfdCBudW1iZXJfb2ZfZW50cmllczsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgT2YgRW50cmllcy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV96dGVfdmxhbl9tYWMgKmNsYXVzZTsgICAgICAgICAgIC8qKjwgQ2xhdXNlLiAqLworICAgICAgICB9IG9udV9wb3J0X21hY19zdGF0aWM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgdWludDY0X3QgaWZpbm9jdGV0czsgICAgICAgIC8qKjwgSWZJbk9jdGV0cy4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IGlmaW51Y2FzdHBrdHM7ICAgICAvKio8IElmSW5VY2FzdFBrdHMuICovCisgICAgICAgICAgICB1aW50NjRfdCBpZmlubnVjYXN0cGt0czsgICAgLyoqPCBJZkluTlVjYXN0UGt0cy4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IGlmaW5kaXNjYXJkczsgICAgICAvKio8IElmSW5EaXNjYXJkcy4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IGlmaW5lcnJvcnM7ICAgICAgICAvKio8IElmSW5FcnJvcnMuICovCisgICAgICAgICAgICB1aW50NjRfdCBpZm91dG9jdGV0czsgICAgICAgLyoqPCBJZk91dE9jdGV0cy4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IGlmb3V0dWNhc3Rwa3RzOyAgICAvKio8IElmT3V0VWNhc3RQa3RzLiAqLworICAgICAgICAgICAgdWludDY0X3QgaWZvdXRudWNhc3Rwa3RzOyAgIC8qKjwgSWZPdXROVWNhc3RQa3RzLiAqLworICAgICAgICAgICAgdWludDY0X3QgaWZvdXRkaXNjYXJkczsgICAgIC8qKjwgSWZPdXREaXNjYXJkcy4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IGlmb3V0ZXJyb3JzOyAgICAgICAvKio8IElmT3V0RXJyb3JzLiAqLworICAgICAgICAgICAgdWludDY0X3QgcmVzZXJ2ZWQxOyAgICAgICAgIC8qKjwgUmVzZXJ2ZWQxLiAqLworICAgICAgICAgICAgdWludDY0X3QgcmVzZXJ2ZWQyOyAgICAgICAgIC8qKjwgUmVzZXJ2ZWQyLiAqLworICAgICAgICAgICAgdWludDY0X3QgcmVzZXJ2ZWQzOyAgICAgICAgIC8qKjwgUmVzZXJ2ZWQzLiAqLworICAgICAgICAgICAgdWludDY0X3QgcmVzZXJ2ZWQ0OyAgICAgICAgIC8qKjwgUmVzZXJ2ZWQ0LiAqLworICAgICAgICB9IG9udV9wZXJmb3JtYW5jZV9zdGF0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV96dGVfaXNvbGF0ZV9tb2RlIHBvcnRfaXNvbGF0ZTsgIC8qKjwgUG9ydCBJc29sYXRlLiAqLworICAgICAgICB9IG9udV9wb3J0X2lzb2xhdGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAvKio8IFdpZHRoLiAqLworICAgICAgICB9IG9udV9tYWNfYWRkcmVzc190YWJsZV9xdWVyeTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vc19ib29sIHBvbm1hY2RzcmF0ZWxpbWl0aW5nZW5hYmxlOyAgLyoqPCBQb25NYWNEU3JhdGVMaW1pdGluZ0VuYWJsZS4gKi8KKyAgICAgICAgICAgIHVpbnQyNF90IGNpcjsgICAvKio8IENJUi4gKi8KKyAgICAgICAgICAgIHVpbnQyNF90IGNiczsgICAvKio8IENCUy4gKi8KKyAgICAgICAgfSBvbnVfcG9uX21hY19kb3duc3RyZWFtX3NoYXBpbmc7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3p0ZV9idWZmZXJfbWFuYWdlX21vZGUgYnVmZmVyX21hbmFnZW1lbnRfY2FwYWJpbGl0eTsgICAgLyoqPCBCdWZmZXIgTWFuYWdlbWVudCBDYXBhYmlsaXR5LiAqLworICAgICAgICAgICAgdWludDI0X3QgZHNidWZmZXJfc2l6ZV9taW5pbXVtX3ZhbHVlOyAgIC8qKjwgRFMgQnVmZmVyIFNpemUgTWluaW11bSBWYWx1ZS4gKi8KKyAgICAgICAgICAgIHVpbnQyNF90IGRzYnVmZmVyX3NpemVfbWF4aW11bV92YWx1ZTsgICAvKio8IERTIEJ1ZmZlciBTaXplIE1heGltdW0gVmFsdWUuICovCisgICAgICAgICAgICB1aW50MjRfdCB1c2J1ZmZlcl9zaXplX21pbmltdW1fdmFsdWU7ICAgLyoqPCBVUyBCdWZmZXIgU2l6ZSBNaW5pbXVtIFZhbHVlLiAqLworICAgICAgICAgICAgdWludDI0X3QgdXNidWZmZXJfc2l6ZV9tYXhpbXVtX3ZhbHVlOyAgIC8qKjwgVVMgQnVmZmVyIFNpemUgTWF4aW11bSBWYWx1ZS4gKi8KKyAgICAgICAgfSBvbnVfcG9uX21hY191c2RzYnVmZmVyX2NhcGFiaWxpdHlfcXVlcnk7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb3NfYm9vbCBidWZmZXJfbWFuYWdlbWVudF9pbmRpY2F0aW9uOyAgICAgICAgLyoqPCBCdWZmZXIgTWFuYWdlbWVudCBJbmRpY2F0aW9uLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3p0ZV9kc2J1Zl9kaXJlY3Rpb24gZGlyZWN0aW9uOyAgLyoqPCBEaXJlY3Rpb24uICovCisgICAgICAgICAgICB1aW50MjRfdCBidWZmZXJfc2l6ZTsgICAvKio8IEJ1ZmZlciBTaXplLiAqLworICAgICAgICB9IG9udV9wb25fbWFjX3VzZHNidWZmZXI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fenRlX3N0YXRpc3RpY3NfYWN0aW9uX21vZGUgc3RhdGlzdGljc19hY3Rpb247ICAgLyoqPCBTdGF0aXN0aWNzIEFjdGlvbi4gKi8KKyAgICAgICAgICAgIHVpbnQyNF90IHN0YXRpc3RpY3NfaW50ZXJ2YWw7ICAgICAgIC8qKjwgU3RhdGlzdGljcyBJbnRlcnZhbC4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IHN0YXRpc3RpY3NfZHVyYXRpb25fdGltZTsgIC8qKjwgU3RhdGlzdGljcyBEdXJhdGlvbiBUaW1lLiAqLworICAgICAgICB9IG9udV9wb3J0X3N0YXRpc3RpY3NfY29sbGVjdF9jb250cm9sOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3p0ZV9zdGF0aXN0aWNzX3Jlc2V0X21vZGUgc3RhdGlzdGljc19yZXNldDsgLyoqPCBTdGF0aXN0aWNzIFJlc2V0LiAqLworICAgICAgICB9IG9udV9wb3J0X3N0YXRpc3RpY3NfY291bnRlcl9yZXNldDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdW5pX2Zsb3dfc3RhdGlzdGljc19jb2xsZWN0X2NvbnRyb2xfbW9kZSB1bmlmbG93c3RhdGlzdGljc2NvbGxlY3Rjb250cm9saW5kaWNhdGlvbjsgLyoqPCBVbmlGbG93U3RhdGlzdGljc0NvbGxlY3RDb250cm9sSW5kaWNhdGlvbi4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IGlmaW5vY3RldHM7ICAgICAgICAvKio8IElmSW5PY3RldHMuICovCisgICAgICAgICAgICB1aW50NjRfdCBpZmludWNhc3Rwa3RzOyAgICAgLyoqPCBJZkluVWNhc3RQa3RzLiAqLworICAgICAgICAgICAgdWludDY0X3QgaWZpbm51Y2FzdHBrdHM7ICAgIC8qKjwgSWZJbk5VY2FzdFBrdHMuICovCisgICAgICAgICAgICB1aW50NjRfdCBpZmluZGlzY2FyZHM7ICAgICAgLyoqPCBJZkluRGlzY2FyZHMuICovCisgICAgICAgICAgICB1aW50NjRfdCBpZmluZXJyb3JzOyAgICAgICAgLyoqPCBJZkluRXJyb3JzLiAqLworICAgICAgICAgICAgdWludDY0X3QgaWZvdXRvY3RldHM7ICAgICAgIC8qKjwgSWZPdXRPY3RldHMuICovCisgICAgICAgICAgICB1aW50NjRfdCBpZm91dHVjYXN0cGt0czsgICAgLyoqPCBJZk91dFVjYXN0UGt0cy4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IGlmb3V0bnVjYXN0cGt0czsgICAvKio8IElmT3V0TlVjYXN0UGt0cy4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IGlmb3V0ZGlzY2FyZHM7ICAgICAvKio8IElmT3V0RGlzY2FyZHMuICovCisgICAgICAgICAgICB1aW50NjRfdCBpZm91dGVycm9yczsgICAgICAgLyoqPCBJZk91dEVycm9ycy4gKi8KKyAgICAgICAgfSBvbnVfcG9ydF9mbHV4X3N0YXRpc3RpY3NfY291bnRlcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICB1aW50OF90IHBvbnBvcnRudW1iZXI7ICAgICAgLyoqPCBQb25Qb3J0TnVtYmVyLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2xpZ2h0X2luZGljYXRpb25fbW9kZSBtYWluX2xpZ2h0X2luZGljYXRpb247ICAgIC8qKjwgTWFpbiBMaWdodCBJbmRpY2F0aW9uLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2xpZ2h0X2luZGljYXRpb25fbW9kZSByZXNlcnZlX2xpZ2h0X2luZGljYXRpb247IC8qKjwgUmVzZXJ2ZSBMaWdodCBJbmRpY2F0aW9uLiAqLworICAgICAgICB9IG9udV9saWdodF9leGNlcHRpb247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX21hdGNoX21hY19hZGRyZXNzX21vZGUgbWF0Y2hfbWFjX2FkZHJlc3M7ICAgLyoqPCBNYXRjaCBNQUMgQWRkcmVzcy4gKi8KKyAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzIHBvbl9tYWNfYWRkcmVzczsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBQb24gTUFDIEFkZHJlc3MuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fenRlX2xpZ2h0X2NvbnRyb2xfYWN0aW9uX21vZGUgYWN0aW9uOyAgIC8qKjwgQWN0aW9uLiAqLworICAgICAgICAgICAgdWludDE2X3QgZHVyYXRpb25fdGltZTsgICAgICAgICAgICAgICAgIC8qKjwgRHVyYXRpb24gVGltZS4gKi8KKyAgICAgICAgfSBvbnVfbGlnaHRfY29udHJvbDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICB1aW50NjRfdCBmcmFtZXNfdHJhbnNtaXR0ZWRvazsgICAgICAgICAgLyoqPCBGcmFtZXMgVHJhbnNtaXR0ZWRPSy4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IG9jdGV0c190cmFuc21pdHRlZG9rOyAgICAgICAgICAvKio8IE9jdGV0cyBUcmFuc21pdHRlZE9LLiAqLworICAgICAgICAgICAgdWludDY0X3QgbXVsdGljYXN0X2ZyYW1lc3htaXR0ZWRfb2s7ICAgIC8qKjwgTXVsdGljYXN0IEZyYW1lc1htaXR0ZWQgT0suICovCisgICAgICAgICAgICB1aW50NjRfdCBicm9hZGNhc3RfZnJhbWVzeG1pdHRlZF9vazsgICAgLyoqPCBCcm9hZGNhc3QgRnJhbWVzWG1pdHRlZCBPSy4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IGZyYW1lc19yZWNlaXZlZF9vazsgICAgICAgICAgICAvKio8IEZyYW1lcyBSZWNlaXZlZCBPSy4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IG9jdGV0c19yZWNlaXZlZF9vazsgICAgICAgICAgICAvKio8IE9jdGV0cyBSZWNlaXZlZCBPSy4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IG11bHRpY2FzdF9mcmFtZXNfcmVjZWl2ZWRfb2s7ICAvKio8IE11bHRpY2FzdCBGcmFtZXMgUmVjZWl2ZWQgT0suICovCisgICAgICAgICAgICB1aW50NjRfdCBicm9hZGNhc3RfZnJhbWVzX3JlY2VpdmVkX29rOyAgLyoqPCBCcm9hZGNhc3QgRnJhbWVzIFJlY2VpdmVkIE9LLiAqLworICAgICAgICB9IG9udV9wb25fcG9ydF9zdGF0aXN0aWNzX2dldDE7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICB1aW50NjRfdCBjcmM4ZXJyb3JzOyAgICAgICAgICAgICAgICAvKio8IENSQzggRXJyb3JzLiAqLworICAgICAgICAgICAgdWludDY0X3QgZmVjX2NvcnJlY3RlZF9ibG9ja3M7ICAgICAgLyoqPCBGRUMgQ29ycmVjdGVkIEJsb2Nrcy4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IGZlY191bmNvcnJlY3RhYmxlX2Jsb2NrczsgIC8qKjwgRkVDIFVuY29ycmVjdGFibGUgQmxvY2tzLiAqLworICAgICAgICAgICAgdWludDY0X3QgbXBjcF9tYWNfY3RybF9mcmFtZXNfdHJhbnNtaXR0ZWQ7ICAvKio8IE1wY3AgTWFjIEN0cmwgRnJhbWVzIFRyYW5zbWl0dGVkLiAqLworICAgICAgICAgICAgdWludDY0X3QgbXBjcF9tYWNfY3RybF9mcmFtZXNfcmVjZWl2ZWQ7ICAgICAvKio8IE1wY3AgTWFjIEN0cmwgRnJhbWVzIFJlY2VpdmVkLiAqLworICAgICAgICAgICAgdWludDY0X3QgbXBjcF90eF9yZWdpc3RlcjsgICAgICAgICAgICAgICAgICAvKio8IE1wY3AgVHggUmVnaXN0ZXIuICovCisgICAgICAgICAgICB1aW50NjRfdCBtcGNwX3R4X3JlZ3JlcXVlc3Q7ICAgICAgICAgICAgICAgIC8qKjwgTXBjcCBUeCBSZWdSZXF1ZXN0LiAqLworICAgICAgICAgICAgdWludDY0X3QgbXBjcF90eF9yZXBvcnQ7ICAgICAgICAgICAgICAgICAgICAvKio8IE1wY3AgVHggUmVwb3J0LiAqLworICAgICAgICAgICAgdWludDY0X3QgbXBjcF9yeF9nYXRlOyAgICAgICAgICAgICAgICAgICAgICAvKio8IE1wY3AgUnggR2F0ZS4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IG1wY3BfcnhfcmVnaXN0ZTsgICAgICAgICAgICAgICAgICAgLyoqPCBNcGNwIFJ4IFJlZ2lzdGUuICovCisgICAgICAgIH0gb251X3Bvbl9wb3J0X3N0YXRpc3RpY3NfZ2V0MjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYWxhcm1fY29uZmlnX21vZGUgYWxhcm1fY29uZmlnOyAvKio8IEFsYXJtIENvbmZpZy4gKi8KKyAgICAgICAgfSBhbGFybV9jb25maWc7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29udV9leGNsX2FiaWxpdHkgYWJpbGl0eTsgICAvKio8IEFiaWxpdHkuICovCisgICAgICAgIH0gcm91Z3VlX29udV9leGNsX2FiaWxpdHk7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2xlZXBfbW9kZSBzbGVlcF9tb2RlX2NhcGFiaWxpdHk7ICAgICAgICAgICAgICAgLyoqPCBPTlUgU2xlZXAgTW9kZSBDYXBhYmlsaXR5ICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9lYXJseV93YWtlX2NhcGFiaWxpdHkgZWFybHlfd2FrZV91cF9jYXBhYmlsaXR5OyAvKio8IE9OVSBFYXJseSBXYWtlLVVwIENhcGFiaWxpdHkgKi8KKyAgICAgICAgfSBvbnVfcG93ZXJfc2F2aW5nX2NhcGFiaWxpdGllczsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2Vhcmx5X3dha2VfdXBfbW9kZSBlYXJseV93YWtlX3VwOyAgIC8qKjwgMHgwMDogRW5hYmxlOyAweDAxOiBEaXNhYmxlOyAweEZGOiBOb3QgU3VwcG9ydGVkOyBPdGhlcnM6IFJlc2VydmVkICovCisgICAgICAgICAgICB1aW50OF90IHNsZWVwX2R1cmF0aW9uX21heFs2XTsgIC8qKjwgTWF4aW11bSByZWZyZXNoIHRpbWUgaW4gcG93ZXIgc2F2aW5nIChVbml0OiBUUSkgKi8KKyAgICAgICAgfSBvbnVfcG93ZXJfc2F2aW5nX2NvbmZpZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgdWludDE2X3Qgb3B0aWNhbF9sb3NfdGltZTsgICAgICAvKio8IFRpbWUgb2YgT3B0aWNhbCBMb1MgaW4gUHJvdGVjdGlvbiBTd2l0Y2hpbmcgKFVuaXQ6IG1zKSAqLworICAgICAgICAgICAgdWludDE2X3QgbWFjX2xvc190aW1lOyAgICAgICAgICAvKio8IFRpbWUgb2YgTUFDIExvUyBpbiBQcm90ZWN0aW9uIFN3aXRjaGluZyAoVW5pdDogbXMpICovCisgICAgICAgIH0gb251X3Byb3RlY3Rpb25fcGFyYW1ldGVyczsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19wb3J0X2Rpc2FibGVfb25fbG9vcF9kZXRlY3RlZF9zdGF0ZSBzdGF0ZTsgIC8qKjwgSW5kaWNhdGVzIHdoZXRoZXIgZGlzYWJsZSBwb3J0IGF1dG9tYXRpY2FsbHkgd2hlbiBkZXRlY3RpbmcgdGhlIHBvcnQgbG9vcGJhY2sgKi8KKyAgICAgICAgfSBwb3J0X2Rpc2FibGVfb25fbG9vcF9kZXRlY3RlZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IGFnaW5nX3RpbWU7ICAgIC8qKjwgTUFDIEFnaW5nIFRpbWUgKFVuaXQ6IHMpICovCisgICAgICAgIH0gbWFjX2FnaW5nX3RpbWU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX21vbml0b3Jpbmdfc3RhdHVzIG1vbml0b3Jpbmdfc3RhdHVzOyAgICAvKio8IE1vbml0b3JpbmcgU3RhdHVzLiAqLworICAgICAgICAgICAgdWludDMyX3QgbW9uaXRvcmluZ19wZXJpb2Q7IC8qKjwgUGVyZm9ybWFuY2UgTW9uaXRvcmluZyBQZXJpb2QgKFVuaXQ6IHMpICovCisgICAgICAgIH0gcGVyZm9ybWFuY2VfbW9uaXRvcmluZ19zdGF0dXM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICAgICAgdWludDY0X3Qgc3RhdHNfZmllbGQxOyAgICAgIC8qKjwgRG93bnN0cmVhbSBEcm9wRXZlbnRzLCBEb3duc3RyZWFtIEZyYWdtZW50cywgRG93bnN0cmVhbSBEaXNjYXJkcyAqLworICAgICAgICAgICAgdWludDY0X3Qgc3RhdHNfZmllbGQyOyAgICAgIC8qKjwgVXBzdHJlYW0gRHJvcEV2ZW50cywgVXBzdHJlYW0gRnJhZ21lbnRzLCBVcHN0cmVhbSBEaXNjYXJkcyAqLworICAgICAgICAgICAgdWludDY0X3Qgc3RhdHNfZmllbGQzOyAgICAgIC8qKjwgRG93bnN0cmVhbSBPY3RldHMsIERvd25zdHJlYW0gSmFiYmVycywgRG93bnN0cmVhbSBFcnJvcyAqLworICAgICAgICAgICAgdWludDY0X3Qgc3RhdHNfZmllbGQ0OyAgICAgIC8qKjwgVXBzdHJlYW0gT2N0ZXRzLCBVcHN0cmVhbSBKYWJiZXJzLCBVcHN0cmVhbSBFcnJvcnMgKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHN0YXRzX2ZpZWxkNTsgICAgICAvKio8IERvd25zdHJlYW0gRnJhbWVzLCBEb3duc3RyZWFtIEZyYW1lcyA2NCBPY3RldHMsIFN0YXR1cyBDaGFuZ2UgVGltZXMgKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHN0YXRzX2ZpZWxkNjsgICAgICAvKio8IFVwc3RyZWFtIEZyYW1lcywgRG93bnN0cmVhbSBGcmFtZXMgNjUgdG8gMTI3IE9jdGV0cyAqLworICAgICAgICAgICAgdWludDY0X3Qgc3RhdHNfZmllbGQ3OyAgICAgIC8qKjwgRG93bnN0cmVhbSBCcm9hZGNhc3QgRnJhbWVzLCBEb3duc3RyZWFtIEZyYW1lcyAxMjggdG8gMjU1IE9jdGV0cyAqLworICAgICAgICAgICAgdWludDY0X3Qgc3RhdHNfZmllbGQ4OyAgICAgIC8qKjwgVXBzdHJlYW0gQnJvYWRjYXN0IEZyYW1lcywgRG93bnN0cmVhbSBGcmFtZXMgMjU2IHRvIDUxMSBPY3RldHMgKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHN0YXRzX2ZpZWxkOTsgICAgICAvKio8IERvd25zdHJlYW0gTXVsdGljYXN0IEZyYW1lcywgRG93bnN0cmVhbSBGcmFtZXMgNTEyIHRvIDEwMjMgT2N0ZXRzICovCisgICAgICAgICAgICB1aW50NjRfdCBzdGF0c19maWVsZDEwOyAgICAgLyoqPCBVcHN0cmVhbSBNdWx0aWNhc3QgRnJhbWVzLCBEb3duc3RyZWFtIEZyYW1lcyAxMDI0IHRvIDE1MTggT2N0ZXRzICovCisgICAgICAgICAgICB1aW50NjRfdCBzdGF0c19maWVsZDExOyAgICAgLyoqPCBEb3duc3RyZWFtIENSQyBFcnJvcmVkIEZyYW1lcywgVXBzdHJlYW0gRnJhbWVzIDY0IE9jdGV0cyAqLworICAgICAgICAgICAgdWludDY0X3Qgc3RhdHNfZmllbGQxMjsgICAgIC8qKjwgVXBzdHJlYW0gQ1JDIEVycm9yZWQgRnJhbWVzLCBVcHN0cmVhbSBGcmFtZXMgNjUgdG8gMTI3IE9jdGV0cyAqLworICAgICAgICAgICAgdWludDY0X3Qgc3RhdHNfZmllbGQxMzsgICAgIC8qKjwgRG93bnN0cmVhbSBVbmRlcnNpemUgRnJhbWVzLCBVcHN0cmVhbSBGcmFtZXMgMTI4IHRvIDI1NSBPY3RldHMgKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHN0YXRzX2ZpZWxkMTQ7ICAgICAvKio8IFVwc3RyZWFtIFVuZGVyc2l6ZSBGcmFtZXMsIFVwc3RyZWFtIEZyYW1lcyAyNTYgdG8gNTExIE9jdGV0cyAqLworICAgICAgICAgICAgdWludDY0X3Qgc3RhdHNfZmllbGQxNTsgICAgIC8qKjwgRG93bnN0cmVhbSBPdmVyc2l6ZSBGcmFtZXMsIFVwc3RyZWFtIEZyYW1lcyA1MTIgdG8gMTAyMyBPY3RldHMgKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHN0YXRzX2ZpZWxkMTY7ICAgICAvKio8IFVwc3RyZWFtIE92ZXJzaXplIEZyYW1lcywgVXBzdHJlYW0gRnJhbWVzIDEwMjQgdG8gMTUxOCBPY3RldHMgKi8KKyAgICAgICAgfSBwZXJmb3JtYW5jZV9tb25pdG9yaW5nX2N1cnJlbnRfZGF0YTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICB1aW50NjRfdCBzdGF0c19maWVsZDE7ICAgICAgLyoqPCBEb3duc3RyZWFtIERyb3BFdmVudHMsIERvd25zdHJlYW0gRnJhZ21lbnRzLCBEb3duc3RyZWFtIERpc2NhcmRzICovCisgICAgICAgICAgICB1aW50NjRfdCBzdGF0c19maWVsZDI7ICAgICAgLyoqPCBVcHN0cmVhbSBEcm9wRXZlbnRzLCBVcHN0cmVhbSBGcmFnbWVudHMsIFVwc3RyZWFtIERpc2NhcmRzICovCisgICAgICAgICAgICB1aW50NjRfdCBzdGF0c19maWVsZDM7ICAgICAgLyoqPCBEb3duc3RyZWFtIE9jdGV0cywgRG93bnN0cmVhbSBKYWJiZXJzLCBEb3duc3RyZWFtIEVycm9zICovCisgICAgICAgICAgICB1aW50NjRfdCBzdGF0c19maWVsZDQ7ICAgICAgLyoqPCBVcHN0cmVhbSBPY3RldHMsIFVwc3RyZWFtIEphYmJlcnMsIFVwc3RyZWFtIEVycm9ycyAqLworICAgICAgICAgICAgdWludDY0X3Qgc3RhdHNfZmllbGQ1OyAgICAgIC8qKjwgRG93bnN0cmVhbSBGcmFtZXMsIERvd25zdHJlYW0gRnJhbWVzIDY0IE9jdGV0cywgU3RhdHVzIENoYW5nZSBUaW1lcyAqLworICAgICAgICAgICAgdWludDY0X3Qgc3RhdHNfZmllbGQ2OyAgICAgIC8qKjwgVXBzdHJlYW0gRnJhbWVzLCBEb3duc3RyZWFtIEZyYW1lcyA2NSB0byAxMjcgT2N0ZXRzICovCisgICAgICAgICAgICB1aW50NjRfdCBzdGF0c19maWVsZDc7ICAgICAgLyoqPCBEb3duc3RyZWFtIEJyb2FkY2FzdCBGcmFtZXMsIERvd25zdHJlYW0gRnJhbWVzIDEyOCB0byAyNTUgT2N0ZXRzICovCisgICAgICAgICAgICB1aW50NjRfdCBzdGF0c19maWVsZDg7ICAgICAgLyoqPCBVcHN0cmVhbSBCcm9hZGNhc3QgRnJhbWVzLCBEb3duc3RyZWFtIEZyYW1lcyAyNTYgdG8gNTExIE9jdGV0cyAqLworICAgICAgICAgICAgdWludDY0X3Qgc3RhdHNfZmllbGQ5OyAgICAgIC8qKjwgRG93bnN0cmVhbSBNdWx0aWNhc3QgRnJhbWVzLCBEb3duc3RyZWFtIEZyYW1lcyA1MTIgdG8gMTAyMyBPY3RldHMgKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHN0YXRzX2ZpZWxkMTA7ICAgICAvKio8IFVwc3RyZWFtIE11bHRpY2FzdCBGcmFtZXMsIERvd25zdHJlYW0gRnJhbWVzIDEwMjQgdG8gMTUxOCBPY3RldHMgKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHN0YXRzX2ZpZWxkMTE7ICAgICAvKio8IERvd25zdHJlYW0gQ1JDIEVycm9yZWQgRnJhbWVzLCBVcHN0cmVhbSBGcmFtZXMgNjQgT2N0ZXRzICovCisgICAgICAgICAgICB1aW50NjRfdCBzdGF0c19maWVsZDEyOyAgICAgLyoqPCBVcHN0cmVhbSBDUkMgRXJyb3JlZCBGcmFtZXMsIFVwc3RyZWFtIEZyYW1lcyA2NSB0byAxMjcgT2N0ZXRzICovCisgICAgICAgICAgICB1aW50NjRfdCBzdGF0c19maWVsZDEzOyAgICAgLyoqPCBEb3duc3RyZWFtIFVuZGVyc2l6ZSBGcmFtZXMsIFVwc3RyZWFtIEZyYW1lcyAxMjggdG8gMjU1IE9jdGV0cyAqLworICAgICAgICAgICAgdWludDY0X3Qgc3RhdHNfZmllbGQxNDsgICAgIC8qKjwgVXBzdHJlYW0gVW5kZXJzaXplIEZyYW1lcywgVXBzdHJlYW0gRnJhbWVzIDI1NiB0byA1MTEgT2N0ZXRzICovCisgICAgICAgICAgICB1aW50NjRfdCBzdGF0c19maWVsZDE1OyAgICAgLyoqPCBEb3duc3RyZWFtIE92ZXJzaXplIEZyYW1lcywgVXBzdHJlYW0gRnJhbWVzIDUxMiB0byAxMDIzIE9jdGV0cyAqLworICAgICAgICAgICAgdWludDY0X3Qgc3RhdHNfZmllbGQxNjsgICAgIC8qKjwgVXBzdHJlYW0gT3ZlcnNpemUgRnJhbWVzLCBVcHN0cmVhbSBGcmFtZXMgMTAyNCB0byAxNTE4IE9jdGV0cyAqLworICAgICAgICB9IHBlcmZvcm1hbmNlX21vbml0b3JpbmdfaGlzdG9yeV9kYXRhOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBhY3Rpb247ICAgICAgICAgICAgLyoqPCBBY3Rpb24uICovCisgICAgICAgICAgICBiY21vc19tYWNfYWRkcmVzcyBvbnVfaWQ7ICAgLyoqPCBPbnUgSWQuICovCisgICAgICAgICAgICB1aW50MzJfdCBvcHRfaWQ7ICAgICAgICAgICAgLyoqPCBPcHRpY2FsIFRyYW5zbWl0dGVyIElkLiAqLworICAgICAgICB9IG9udV90eF9wb3dlcl9zdXBwbHlfY29udHJvbDsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2F0dHJpYnV0ZV92YWx1ZV9iYXNlOworCisvKiogQ1RDIEZpbGUgQ2hlY2sgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19maWxlX2NoZWNrX29wY29kZSBvcGNvZGU7ICAgLyoqPCBPcGNvZGUuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBmaWxlX3NpemU7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBGaWxlIFNpemUuICovCisgICAgICAgIH0gZW5kX2Rvd25sb2FkX3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfcnBzX2NvZGUgcnBzX2NvZGU7ICAvKio8IFJQUyBDb2RlLiAqLworICAgICAgICB9IGVuZF9kb3dubG9hZF9yZXNwb25zZTsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19iYXNlOworCisvKiogQ1RDIE9VSSBWZXJzaW9uIFBhaXIuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX291aV92ZXJzaW9uX3BhaXIKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fd2VsbF9rbm93bl9vdWkgb3VpOyAvKio8IE9VSS4gKi8KKyAgICB1aW50OF90IHZlcnNpb247ICAgICAgICAgICAgICAgICAgICAvKio8IFZlcnNpb24uICovCit9IGJjbW9sdF9lcG9uX29hbV9jdGNfb3VpX3ZlcnNpb25fcGFpcjsKKworLyoqIENUQyBQZXJmb3JtYW5jZSBNb25pdG9yaW5nIERhdGEuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX3BlcmZvcm1hbmNlX21vbml0b3JpbmdfZGF0YQoreworICAgIHVpbnQ2NF90IGRvd25zdHJlYW1fZHJvcF9ldmVudHM7ICAgICAgICAgICAgLyoqPCBEb3duc3RyZWFtIERyb3AgRXZlbnRzLiAqLworICAgIHVpbnQ2NF90IHVwc3RyZWFtX2Ryb3BfZXZlbnRzOyAgICAgICAgICAgICAgLyoqPCBVcHN0cmVhbSBEcm9wIEV2ZW50cy4gKi8KKyAgICB1aW50NjRfdCBkb3duc3RyZWFtX29jdGV0czsgICAgICAgICAgICAgICAgIC8qKjwgRG93bnN0cmVhbSBPY3RldHMuICovCisgICAgdWludDY0X3QgdXBzdHJlYW1fb2N0ZXRzOyAgICAgICAgICAgICAgICAgICAvKio8IFVwc3RyZWFtIE9jdGV0cy4gKi8KKyAgICB1aW50NjRfdCBkb3duc3RyZWFtX2ZyYW1lczsgICAgICAgICAgICAgICAgIC8qKjwgRG93bnN0cmVhbSBGcmFtZXMuICovCisgICAgdWludDY0X3QgdXBzdHJlYW1fZnJhbWVzOyAgICAgICAgICAgICAgICAgICAvKio8IFVwc3RyZWFtIEZyYW1lcy4gKi8KKyAgICB1aW50NjRfdCBkb3duc3RyZWFtX2Jyb2FkY2FzdF9mcmFtZXM7ICAgICAgIC8qKjwgRG93bnN0cmVhbSBCcm9hZGNhc3QgRnJhbWVzLiAqLworICAgIHVpbnQ2NF90IHVwc3RyZWFtX2Jyb2FkY2FzdF9mcmFtZXM7ICAgICAgICAgLyoqPCBVcHN0cmVhbSBCcm9hZGNhc3QgRnJhbWVzLiAqLworICAgIHVpbnQ2NF90IGRvd25zdHJlYW1fbXVsdGljYXN0X2ZyYW1lczsgICAgICAgLyoqPCBEb3duc3RyZWFtIE11bHRpY2FzdCBGcmFtZXMuICovCisgICAgdWludDY0X3QgdXBzdHJlYW1fbXVsdGljYXN0X2ZyYW1lczsgICAgICAgICAvKio8IFVwc3RyZWFtIE11bHRpY2FzdCBGcmFtZXMuICovCisgICAgdWludDY0X3QgZG93bnN0cmVhbV9jcmNfZXJyb3JlZF9mcmFtZXM7ICAgICAvKio8IERvd25zdHJlYW0gQ1JDIEVycm9yZWQgRnJhbWVzLiAqLworICAgIHVpbnQ2NF90IHVwc3RyZWFtX2NyY19lcnJvcmVkX2ZyYW1lczsgICAgICAgLyoqPCBVcHN0cmVhbSBDUkMgRXJyb3JlZCBGcmFtZXMuICovCisgICAgdWludDY0X3QgZG93bnN0cmVhbV91bmRlcnNpemVfZnJhbWVzOyAgICAgICAvKio8IERvd25zdHJlYW0gVW5kZXJzaXplIEZyYW1lcy4gKi8KKyAgICB1aW50NjRfdCB1cHN0cmVhbV91bmRlcnNpemVfZnJhbWVzOyAgICAgICAgIC8qKjwgVXBzdHJlYW0gVW5kZXJzaXplIEZyYW1lcy4gKi8KKyAgICB1aW50NjRfdCBkb3duc3RyZWFtX292ZXJzaXplX2ZyYW1lczsgICAgICAgIC8qKjwgRG93bnN0cmVhbSBPdmVyc2l6ZSBGcmFtZXMuICovCisgICAgdWludDY0X3QgdXBzdHJlYW1fb3ZlcnNpemVfZnJhbWVzOyAgICAgICAgICAvKio8IFVwc3RyZWFtIE92ZXJzaXplIEZyYW1lcy4gKi8KKyAgICB1aW50NjRfdCBkb3duc3RyZWFtX2ZyYWdtZW50czsgICAgICAgICAgICAgIC8qKjwgRG93bnN0cmVhbSBGcmFnbWVudHMuICovCisgICAgdWludDY0X3QgdXBzdHJlYW1fZnJhZ21lbnRzOyAgICAgICAgICAgICAgICAvKio8IFVwc3RyZWFtIEZyYWdtZW50cy4gKi8KKyAgICB1aW50NjRfdCBkb3duc3RyZWFtX2phYmJlcnM7ICAgICAgICAgICAgICAgIC8qKjwgRG93bnN0cmVhbSBKYWJiZXJzLiAqLworICAgIHVpbnQ2NF90IHVwc3RyZWFtX2phYmJlcnM7ICAgICAgICAgICAgICAgICAgLyoqPCBVcHN0cmVhbSBKYWJiZXJzLiAqLworICAgIHVpbnQ2NF90IGRvd25zdHJlYW1fZnJhbWVzNjRvY3RldHM7ICAgICAgICAgLyoqPCBEb3duc3RyZWFtIEZyYW1lcyA2NCBPY3RldHMuICovCisgICAgdWludDY0X3QgZG93bnN0cmVhbV9mcmFtZXM2NXRvMTI3b2N0ZXRzOyAgICAvKio8IERvd25zdHJlYW0gRnJhbWVzIDY1IHRvIDEyNyBPY3RldHMuICovCisgICAgdWludDY0X3QgZG93bnN0cmVhbV9mcmFtZXMxMjh0bzI1NW9jdGV0czsgICAvKio8IERvd25zdHJlYW0gRnJhbWVzIDEyOCB0byAyNTUgT2N0ZXRzLiAqLworICAgIHVpbnQ2NF90IGRvd25zdHJlYW1fZnJhbWVzMjU2dG81MTFvY3RldHM7ICAgLyoqPCBEb3duc3RyZWFtIEZyYW1lcyAyNTYgdG8gNTExIE9jdGV0cy4gKi8KKyAgICB1aW50NjRfdCBkb3duc3RyZWFtX2ZyYW1lczUxMnRvMTAyM29jdGV0czsgIC8qKjwgRG93bnN0cmVhbSBGcmFtZXMgNTEyIHRvIDEwMjMgT2N0ZXRzLiAqLworICAgIHVpbnQ2NF90IGRvd25zdHJlYW1fZnJhbWVzMTAyNHRvMTUxOG9jdGV0czsgLyoqPCBEb3duc3RyZWFtIEZyYW1lcyAxMDI0IHRvIDE1MTggT2N0ZXRzLiAqLworICAgIHVpbnQ2NF90IHVwc3RyZWFtX2ZyYW1lczY0b2N0ZXRzOyAgICAgICAgICAgLyoqPCBVcHN0cmVhbSBGcmFtZXMgNjQgT2N0ZXRzLiAqLworICAgIHVpbnQ2NF90IHVwc3RyZWFtX2ZyYW1lczY1dG8xMjdvY3RldHM7ICAgICAgLyoqPCBVcHN0cmVhbSBGcmFtZXMgNjUgdG8gMTI3IE9jdGV0cy4gKi8KKyAgICB1aW50NjRfdCB1cHN0cmVhbV9mcmFtZXMxMjh0bzI1NW9jdGV0czsgICAgIC8qKjwgVXBzdHJlYW0gRnJhbWVzIDEyOCB0byAyNTUgT2N0ZXRzLiAqLworICAgIHVpbnQ2NF90IHVwc3RyZWFtX2ZyYW1lczI1NnRvNTExb2N0ZXRzOyAgICAgLyoqPCBVcHN0cmVhbSBGcmFtZXMgMjU2IHRvIDUxMSBPY3RldHMuICovCisgICAgdWludDY0X3QgdXBzdHJlYW1fZnJhbWVzNTEydG8xMDIzb2N0ZXRzOyAgICAvKio8IFVwc3RyZWFtIEZyYW1lcyA1MTIgdG8gMTAyMyBPY3RldHMuICovCisgICAgdWludDY0X3QgdXBzdHJlYW1fZnJhbWVzMTAyNHRvMTUxOG9jdGV0czsgICAvKio8IFVwc3RyZWFtIEZyYW1lcyAxMDI0IHRvIDE1MTggT2N0ZXRzLiAqLworICAgIHVpbnQ2NF90IGRvd25zdHJlYW1fZGlzY2FyZHM7ICAgICAgICAgICAgICAgLyoqPCBEb3duc3RyZWFtIERpc2NhcmRzLiAqLworICAgIHVpbnQ2NF90IHVwc3RyZWFtX2Rpc2NhcmRzOyAgICAgICAgICAgICAgICAgLyoqPCBVcHN0cmVhbSBEaXNjYXJkcy4gKi8KKyAgICB1aW50NjRfdCBkb3duc3RyZWFtX2Vycm9yczsgICAgICAgICAgICAgICAgIC8qKjwgRG93bnN0cmVhbSBFcnJvcnMuICovCisgICAgdWludDY0X3QgdXBzdHJlYW1fZXJyb3JzOyAgICAgICAgICAgICAgICAgICAvKio8IFVwc3RyZWFtIEVycm9ycy4gKi8KKyAgICB1aW50NjRfdCBzdGF0dXNfY2hhbmdlX3RpbWVzOyAgICAgICAgICAgICAgIC8qKjwgU3RhdHVzIENoYW5nZSBUaW1lcy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2N0Y19wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2RhdGE7CisKKy8qKiBDVEMgVEZUUCBCYXNlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfb3BfY29kZSBvcGNvZGU7ICAgIC8qKjwgT3Bjb2RlLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgZmlsZW5hbWVfY291bnQ7ICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gZmlsZW5hbWUuICovCisgICAgICAgICAgICB1aW50OF90ICpmaWxlbmFtZTsgICAgICAgICAgICAgICAgICAvKio8IEZpbGVuYW1lLiAqLworICAgICAgICAgICAgdWludDMyX3QgbW9kZV9jb3VudDsgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gbW9kZS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKm1vZGU7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTW9kZS4gKi8KKyAgICAgICAgfSB3cml0ZV9yZXF1ZXN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBibG9ja19udW1iZXI7ICAgICAgICAgICAgICAvKio8IEJsb2NrIE51bWJlci4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IGRhdGFfY291bnQ7ICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIGRhdGEuICovCisgICAgICAgICAgICB1aW50OF90ICpkYXRhOyAgICAgICAgICAgICAgICAgICAgICAvKio8IERhdGEuICovCisgICAgICAgIH0gZGF0YTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgYmxvY2tfbnVtYmVyOyAgICAgICAgICAgICAgLyoqPCBCbG9jayBOdW1iZXIuICovCisgICAgICAgIH0gYWNrOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBjb2RlOyAgICAgICAgICAgICAgICAgICAgICAvKio8IENvZGUuICovCisgICAgICAgICAgICB1aW50MzJfdCBtZXNzYWdlX2NvdW50OyAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBtZXNzYWdlLiAqLworICAgICAgICAgICAgdWludDhfdCAqbWVzc2FnZTsgICAgICAgICAgICAgICAgICAgLyoqPCBNZXNzYWdlLiAqLworICAgICAgICB9IGVycm9yOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2U7CisKKy8qKiBDVEMgUy9XIE1pcnJvciBCYXNlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9vcGNvZGUgb3Bjb2RlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgT3Bjb2RlLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9hY3RpdmF0ZV9pbWFnZV9mbGFnIGZsYWc7ICAvKio8IEZsYWcuICovCisgICAgICAgIH0gYWN0aXZhdGVfaW1hZ2VfcmVxdWVzdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9hY2sgYWNrOyAgICAgICAgICAgICAgICAgICAvKio8IEFjay4gKi8KKyAgICAgICAgfSBhY3RpdmF0ZV9pbWFnZV9yZXNwb25zZTsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYmFzZTsKKworLyoqIENUQyBTb2Z0d2FyZSBEb3dubG9hZCBQcm92IEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX3NvZnR3YXJlX2Rvd25sb2FkX3Byb3ZfYmFzZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfZGF0YV90eXBlIGRhdGFfdHlwZTsgIC8qKjwgRGF0YSBUeXBlLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgdGlkOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUSUQuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZSB0ZnRwOyAvKio8IFRGVFAuICovCisgICAgICAgIH0gdGZ0cDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgdGlkOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUSUQuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2ZpbGVfY2hlY2tfYmFzZSBmaWxlX2NoZWNrOyAvKio8IEZpbGUgQ2hlY2suICovCisgICAgICAgIH0gZGF0YV9jaGVja2luZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgdGlkOyAgIC8qKjwgVElELiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9iYXNlIHN3bWlycm9yOyAvKio8IFMvVyBNaXJyb3IuICovCisgICAgICAgIH0gc3dtaXJyb3Jpbmc7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IHRpZDsgICAvKio8IFRJRC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2Jhc2UgY29tbWl0X2ltYWdlOyAvKio8IENvbW1pdCBJbWFnZS4gKi8KKyAgICAgICAgfSBjb21taXRfaW1hZ2U7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fY3RjX3NvZnR3YXJlX2Rvd25sb2FkX3Byb3ZfYmFzZTsKKworLyoqIEtUIFF1ZXVlIERyb3AgQ291bnRlci4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9rdHF1ZXVlX2Ryb3BfY291bnRlcgoreworICAgIHVpbnQzMl90IHR4Ynl0ZXM7ICAgICAgICAgICAvKio8IFRYIEJ5dGVzLiAqLworICAgIHVpbnQzMl90IGRyb3BwZWRfZnJhbWVzOyAgICAvKio8IERyb3BwZWQgRnJhbWVzLiAqLworfSBiY21vbHRfZXBvbl9vYW1fa3RxdWV1ZV9kcm9wX2NvdW50ZXI7CisKKy8qKiBLVCBBdHRyaWJ1dGUgVmFsdWUgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9rdGF0dHJpYnV0ZV92YWx1ZV9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hdHRyaWJ1dGUgbGVhZjsgIC8qKjwgTGVhZi4gKi8KKyAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfYm9vbCBpc19hY3RpdmF0ZWQ7ICAgIC8qKjwgV2hldGhlciBvciBub3Qgc2hhcGluZyBpcyBlbmFibGVkICovCisgICAgICAgICAgICB1aW50MjRfdCByYXRlOyAgICAgICAgICAgICAgLyoqPCBEb3duc3RyZWFtIHNoYXBpbmcgcmF0ZSBvZiB0aGUgcG9ydCBpbiBLYnBzICovCisgICAgICAgIH0gcG9ydF9kb3duc3RyZWFtX3JhdGVfc2hhcGluZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfYm9vbCBpc19hY3RpdmF0ZWQ7ICAgIC8qKjwgV2hldGhlciBvciBub3QgdGhpcyBmZWF0dXJlIGlzIGVuYWJsZWQgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbGltaXQ7ICAgICAgICAgICAgICAvKio8IE1heCBudW1iZXIgb2YgbGVhcm5lZCBNQUNzICovCisgICAgICAgIH0gb251X21hY19saW1pdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfYm9vbCBibG9jazsgICAgICAgICAgIC8qKjwgV2hldGhlciBvciBub3QgdG8gYmxvY2sgdXNlciB0cmFmZmljICovCisgICAgICAgIH0gYmxvY2tfdW5ibG9ja19vbnVfdHJhZmZpYzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3Qgb3B0aWNzX21vZHVsZV90ZW1wZXJhdHVyZTsgICAgICAgICAgICAgICAgICAgICAvKio8IE9wdGljcyBNb2R1bGUgVGVtcGVyYXR1cmUuICovCisgICAgICAgICAgICB1aW50MTZfdCB0eG9wdGljc19wb3dlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVFggT3B0aWNzIFBvd2VyLiAqLworICAgICAgICAgICAgdWludDE2X3QgcnhvcHRpY3NfcG93ZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFJYIE9wdGljcyBQb3dlci4gKi8KKyAgICAgICAgfSBvbnVfZGlhZ25vc3RpY3M7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdXBzdHJlYW1fcXVldWVzX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gVXBzdHJlYW0gUXVldWVzICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fa3RxdWV1ZV9kcm9wX2NvdW50ZXIgKnVwc3RyZWFtX3F1ZXVlczsgIC8qKjwgVXBzdHJlYW0gUXVldWVzLiAqLworICAgICAgICB9IG9udV9xdWV1ZV9kcm9wX2NvdW50ZXI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGNvdW50ZXJfYml0X21hc2s7ICAvKio8IENvdW50ZXIgQml0IE1hc2suICovCisgICAgICAgICAgICB1aW50NjRfdCB0eGZyYW1lczsgICAgICAgICAgLyoqPCBUWCBGcmFtZXMuICovCisgICAgICAgICAgICB1aW50NjRfdCB0eGJ5dGVzOyAgICAgICAgICAgLyoqPCBUWCBCeXRlcy4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHR4bXVsdGljYXN0OyAgICAgICAvKio8IFRYIE11bHRpY2FzdC4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHR4YnJvYWRjYXN0OyAgICAgICAvKio8IFRYIEJyb2FkY2FzdC4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHR4ZHJvcHBlZDsgICAgICAgICAvKio8IFRYIERyb3BwZWQuICovCisgICAgICAgICAgICB1aW50NjRfdCByeGZyYW1lczsgICAgICAgICAgLyoqPCBSWCBGcmFtZXMuICovCisgICAgICAgICAgICB1aW50NjRfdCByeGJ5dGVzOyAgICAgICAgICAgLyoqPCBSWCBCeXRlcy4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHJ4bXVsdGljYXN0OyAgICAgICAvKio8IFJYIE11bHRpY2FzdC4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHJ4YnJvYWRjYXN0OyAgICAgICAvKio8IFJYIEJyb2FkY2FzdC4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHJ4b3ZlcnNpemVkOyAgICAgICAvKio8IFJYIE92ZXJzaXplZC4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHJ4dW5kZXJzaXplZDsgICAgICAvKio8IFJYIFVuZGVyc2l6ZWQuICovCisgICAgICAgICAgICB1aW50NjRfdCByeGNyY19lcnJvcnM7ICAgICAgLyoqPCBSWCBDUkMgRXJyb3JzLiAqLworICAgICAgICB9IGV0aGVybmV0X3BvcnRfY291bnRlcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfYm9vbCBlbmFibGVkOyAgICAgICAgIC8qKjwgV2hldGhlciBvciBub3QgUlNUUCBpcyBlbmFibGVkICovCisgICAgICAgIH0gZXRoZXJuZXRfcG9ydF9yc3RwOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19ib29sIGVuYWJsZWQ7ICAgICAgICAgLyoqPCBXaGV0aGVyIG9yIG5vdCBsb29wIGRldGVjdCBpcyBlbmFibGVkICovCisgICAgICAgICAgICB1aW50OF90IGludGVydmFsOyAgICAgICAgICAgLyoqPCBUaGUgc2VuZGluZyBpbnRlcnZhbCBvZiBoZWxsbyBwYWNrZXQgaW4gc2Vjb25kcyAqLworICAgICAgICAgICAgdWludDhfdCBibG9ja190aW1lOyAgICAgICAgIC8qKjwgVGhlIGJsb2NrIHRpbWUgb2YgdGhlIGxvb3BlZCBwb3J0IGluIHNlY29uZHMgKDAgZm9yIHBlcm1hbmVudCkgKi8KKyAgICAgICAgfSBsb29wX2RldGVjdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgY291bnRlcl9iaXRfbWFzazsgIC8qKjwgQ291bnRlciBCaXQgTWFzay4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHJ4aGVjX2Vycm9yczsgICAgICAvKio8IFJYIEhFQyBFcnJvcnMuICovCisgICAgICAgICAgICB1aW50NjRfdCByeHJlZ2lzdGVyOyAgICAgICAgLyoqPCBSWCBSZWdpc3Rlci4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHR4cmVnaXN0ZXJfYWNrOyAgICAvKio8IFRYIFJlZ2lzdGVyIEFDSy4gKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IHJ4Z2F0ZV9mcmFtZXM7ICAgICAvKio8IFJYIEdhdGUgRnJhbWVzLiAqLworICAgICAgICAgICAgdWludDY0X3QgdHhyZXBvcnRfZnJhbWVzOyAgIC8qKjwgVFggUmVwb3J0IEZyYW1lcy4gKi8KKyAgICAgICAgfSBvbnVfbXBjcF9jb3VudGVyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19ib29sIGVuYWJsZWQ7ICAgICAgICAgLyoqPCBXaGV0aGVyIG9yIG5vdCBvcHRpY2FsIHBvd2VyIGFsYXJtIGlzIGVuYWJsZWQgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9rdG9wdGljYWxfcG93ZXJfYWxhcm1fc3RhdHVzIGFsYXJtX3N0YXR1czsgIC8qKjwgQWxhcm0gU3RhdHVzLiAqLworICAgICAgICB9IG9wdGljYWxfcG93ZXJfYWxhcm1fc3RhdHVzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IG1hY3NfY291bnQ7ICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gTWFjcyAqLworICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgKm1hY3M7ICAgIC8qKjwgTWFjcy4gKi8KKyAgICAgICAgfSBzdGF0aWNfbWFjOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2t0YXR0cmlidXRlX3ZhbHVlX2Jhc2U7CisKKy8qKiBLVCBBY3Rpb24gVmFsdWUgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9rdGFjdGlvbl92YWx1ZV9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hY3Rpb24gbGVhZjsgLyoqPCBMZWFmLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdW5rbm93bl9jb3VudDsgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHVua25vd24uICovCisgICAgICAgICAgICB1aW50OF90ICp1bmtub3duOyAgICAgICAgICAgLyoqPCBVbmtub3duLiAqLworICAgICAgICB9IHJlc3RvcmVfb251OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsgICAgICAgICAgICAgLyoqPCBUaGUgbGVuZ3RoIG9mIHRoaXMgc3RydWN0dXJlICovCisgICAgICAgICAgICBiY21vc19ib29sIGlzX3Bvd2VyX29mZjsgICAgLyoqPCBXaGV0aGVyIG9yIG5vdCB0aGUgcG93ZXIgc2hvdWxkIGJlIG9mZiAqLworICAgICAgICAgICAgdWludDhfdCBkdXJhdGlvbjsgICAgICAgICAgIC8qKjwgVGhlIGxlbmd0aCBvZiB0aW1lIHRvIHBvd2VyIG9mZiBmb3IgaW4gc2Vjb25kcyAoMHhGRiBmb3IgcGVybWFuZW50KSAqLworICAgICAgICB9IHR4cG93ZXJfb2ZmOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2t0YWN0aW9uX3ZhbHVlX2Jhc2U7CisKKy8qKiBDVEMgVmFyIENvbnRhaW5lciBCYXNlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfY29udGFpbmVyX2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2JyYW5jaCBicmFuY2g7ICAvKio8IEJyYW5jaC4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGxlYWY7ICAgICAgICAgICAgICAvKio8IExlYWYuICovCisgICAgICAgICAgICB1aW50OF90IGxlbmd0aDsgICAgICAgICAgICAgLyoqPCBMZW5ndGguICovCisgICAgICAgIH0gZGVmOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCB1bmtub3duX2NvdW50OyAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdW5rbm93bi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnVua25vd247ICAgICAgICAgICAvKio8IFVua25vd24uICovCisgICAgICAgIH0gZW5kOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2F0dHJpYnV0ZV92YWx1ZV9iYXNlIGF0dHJpYnV0ZTsgICAgIC8qKjwgQXR0cmlidXRlLiAqLworICAgICAgICB9IGF0dHJpYnV0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19hY3Rpb25fdmFsdWUgYWN0aW9uOyAgICAgICAgICAgICAgICAvKio8IEFjdGlvbi4gKi8KKyAgICAgICAgfSBhY3Rpb247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb2xkX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2Ugb2JqZWN0OyAgLyoqPCBPYmplY3QuICovCisgICAgICAgIH0gb2xkX21hbmFnZW1lbnRfb2JqZWN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2Ugb2JqZWN0OyAgICAgIC8qKjwgT2JqZWN0LiAqLworICAgICAgICB9IG1hbmFnZW1lbnRfb2JqZWN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZSBhdHRyaWJ1dGU7IC8qKjwgQXR0cmlidXRlLiAqLworICAgICAgICB9IGV4dF9hdHRyaWJ1dGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2FjdGlvbl92YWx1ZV9iYXNlIGF0dHJpYnV0ZTsgICAgLyoqPCBBdHRyaWJ1dGUuICovCisgICAgICAgIH0gZXh0X2FjdGlvbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2t0YXR0cmlidXRlX3ZhbHVlX2Jhc2UgYXR0cmlidXRlOyAgICAgICAvKio8IEF0dHJpYnV0ZS4gKi8KKyAgICAgICAgfSBrdGF0dHJpYnV0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2t0YWN0aW9uX3ZhbHVlX2Jhc2UgYXR0cmlidXRlOyAgICAgICAgICAvKio8IEF0dHJpYnV0ZS4gKi8KKyAgICAgICAgfSBrdGFjdGlvbjsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2NvbnRhaW5lcl9iYXNlOworCisvKiogQ1RDIFZhciBEZXNjcmlwdG9yLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfZGVzY3JpcHRvcgoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfYnJhbmNoIGJyYW5jaDsgICAgICAgICAgICAgICAgICAvKio8IEJyYW5jaC4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGxlYWY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMZWFmLiAqLworICAgICAgICB9IGRlZjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdW5rbm93bl9jb3VudDsgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB1bmtub3duLiAqLworICAgICAgICAgICAgdWludDhfdCAqdW5rbm93bjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFVua25vd24uICovCisgICAgICAgIH0gZW5kOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlIGxlYWY7ICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgfSBhdHRyaWJ1dGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hY3Rpb24gbGVhZjsgICAgICAgLyoqPCBMZWFmLiAqLworICAgICAgICB9IGFjdGlvbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbGRfbWFuYWdlbWVudF9vYmplY3RfYmFzZSB2YWx1ZTsgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG9sZF9tYW5hZ2VtZW50X29iamVjdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19tYW5hZ2VtZW50X29iamVjdF9iYXNlIHZhbHVlOyAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1hbmFnZW1lbnRfb2JqZWN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfZXh0X2F0dHJpYnV0ZSBsZWFmOyAgICAgICAgICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgfSBleHRfYXR0cmlidXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfZXh0X2FjdGlvbiBsZWFmOyAgICAgICAgICAgICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgfSBleHRfYWN0aW9uOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2F0dHJpYnV0ZSBsZWFmOyAgICAgICAgICAgICAgICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgfSBrdGF0dHJpYnV0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hY3Rpb24gbGVhZjsgICAgICAgICAgICAgICAgICAgICAvKio8IExlYWYuICovCisgICAgICAgIH0ga3RhY3Rpb247CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9kZXNjcmlwdG9yOworCisvKiogS1QgT05VIEV2ZW50IEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfYmFzZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9rdG9udV9ldmVudF90eXBlIHR5cGU7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVHlwZS4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9rdGxvb3BfZGV0ZWN0X2V2ZW50IGV2ZW50OyAgICAgICAgICAvKio8IEV2ZW50LiAqLworICAgICAgICB9IGxvb3BfZGV0ZWN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fa3RvcHRpY2FsX3Bvd2VyX2FsYXJtX2V2ZW50IGV2ZW50OyAgLyoqPCBFdmVudC4gKi8KKyAgICAgICAgfSBvcHRpY2FsX3Bvd2VyX2FsYXJtOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2t0b251X2V2ZW50X2Jhc2U7CisKKy8qKiBDVEMgVmVuZG9yIEV4dGVuZGVkIEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19vcGNvZGUgb3A7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgT3AuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCB2YXJzX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHZhcnMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9kZXNjcmlwdG9yICp2YXJzOyAgIC8qKjwgVmFycy4gKi8KKyAgICAgICAgfSBnZXRfcmVxdWVzdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdmFyc19jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB2YXJzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfY29udGFpbmVyX2Jhc2UgKnZhcnM7ICAgLyoqPCBWYXJzLiAqLworICAgICAgICB9IGdldF9yZXNwb25zZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdmFyc19jb3VudDsgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdmFycy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2NvbnRhaW5lcl9iYXNlICp2YXJzOyAgIC8qKjwgVmFycy4gKi8KKyAgICAgICAgfSBzZXRfcmVxdWVzdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdmFyc19jb3VudDsgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdmFycy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfZW1wdHlfdmFyX2NvbnRhaW5lcl9iYXNlICp2YXJzOyAvKio8IFZhcnMuICovCisgICAgICAgIH0gc2V0X3Jlc3BvbnNlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBtZXNzYWdlc19jb3VudDsgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gbWVzc2FnZXMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX3NvZnR3YXJlX2Rvd25sb2FkX3Byb3ZfYmFzZSAqbWVzc2FnZXM7ICAvKio8IE1lc3NhZ2VzLiAqLworICAgICAgICB9IHNvZnR3YXJlX2Rvd25sb2FkOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9hdXRoX2NvZGUgY29kZTsgICAgICAgICAgICAgICAgICAgICAvKio8IENvZGUuICovCisgICAgICAgICAgICB1aW50MTZfdCBhdXRoZW50aWNhdGlvbl9kYXRhX2NvdW50OyAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBBdXRoZW50aWNhdGlvbiBEYXRhICovCisgICAgICAgICAgICB1aW50OF90ICphdXRoZW50aWNhdGlvbl9kYXRhOyAgICAgICAgICAgICAgICAgICAvKio8IEF1dGhlbnRpY2F0aW9uIERhdGEuICovCisgICAgICAgIH0gb251X2F1dGhlbnRpY2F0aW9uOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2NodXJuaW5nX3Byb3ZfYmFzZSB2YWx1ZTsgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGNodXJuaW5nOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9wcm92X2Jhc2UgdmFsdWU7ICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGRiYTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgZXZlbnRzX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBldmVudHMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfYmFzZSAqZXZlbnRzOyAgIC8qKjwgRXZlbnRzLiAqLworICAgICAgICB9IGt0b251X2V2ZW50OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2Jhc2UgZXZlbnRzOyAgICAgIC8qKjwgRXZlbnRzLiAqLworICAgICAgICB9IGV2ZW50OworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZTsKKworLyoqIERhc2FuIENsYXNzaWZpZXIgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jbGFzc2lmaWVyX2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY2xhc3NpZmllcl9jb21tYW5kIGNvbW1hbmQ7ICAgLyoqPCBDb21tYW5kLiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9kaXJlY3Rpb24gZGlyZWN0aW9uOyAgICAgICAgICAvKio8IERpcmVjdGlvbi4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9maWx0ZXJfZmllbGQgZmllbGQ7ICAgLyoqPCBGaWVsZC4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IHZhbHVlOyAvKio8IFZhbHVlLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2ZpbHRlcl9hY3Rpb24gYWN0aW9uOyAvKio8IEFjdGlvbi4gKi8KKyAgICAgICAgfSBhZGRfZmlsdGVyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZGFzYW5fZmlsdGVyX2ZpZWxkIGZpZWxkOyAgIC8qKjwgRmllbGQuICovCisgICAgICAgICAgICB1aW50MTZfdCB2YWx1ZTsgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9maWx0ZXJfYWN0aW9uIGFjdGlvbjsgLyoqPCBBY3Rpb24uICovCisgICAgICAgIH0gcmVtb3ZlX2ZpbHRlcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ByaV90eXBlIHByaV90eXBlOyAgICAvKio8IFByaSBUeXBlLiAqLworICAgICAgICAgICAgdWludDhfdCBpbl9wcmlvcml0eTsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEluIFByaW9yaXR5LiAqLworICAgICAgICAgICAgdWludDhfdCBvdXRfcHJpb3JpdHk7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IE91dCBQcmlvcml0eS4gKi8KKyAgICAgICAgfSBxdWV1ZV9tYXA7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9maWx0ZXJfZmllbGQgZmllbGQ7ICAgLyoqPCBGaWVsZC4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IHZhbHVlOyAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgcHJpX3ZsYW47ICAgLyoqPCBQcmkgVkxBTi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgcHJpX3F1ZXVlOyAgLyoqPCBUaGUgcXVldWUgaWQgdGhlIGZyYW1lIHdpbGwgYmUgdG8gKi8KKyAgICAgICAgfSBhZGRfcHJpb3JpdHlfZm9yX3ZsYW47CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY2xhc3NpZmllcl9iYXNlOworCisvKiogRGFzYW4gUG9ydC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0Cit7CisgICAgdWludDE2X3QgcG9ydF9udW1iZXI7ICAgICAgICAgICAgICAgICAgIC8qKjwgUG9ydCBOdW1iZXIuICovCisgICAgYmNtb3NfYm9vbCBlbmFibGVkOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgRW5hYmxlZC4gKi8KKyAgICBiY21vc19ib29sIGF1dG9fbmVnb3RpYXRpb25fZW5hYmxlZDsgICAgLyoqPCBBdXRvLU5lZ290aWF0aW9uIEVuYWJsZWQuICovCisgICAgdWludDE2X3Qgc3BlZWQ7ICAgICAgICAgICAgICAgICAvKio8IFNwZWVkLiAqLworICAgIHVpbnQ4X3QgcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgLyoqPCBSZXNlcnZlZC4gKi8KKyAgICBiY21vc19ib29sIGlzX2Z1bGxfZHVwbGV4OyAgICAgIC8qKjwgSXMgRnVsbCBEdXBsZXguICovCisgICAgdWludDE2X3QgbGVhcm5pbmdfdGFibGVfc2l6ZTsgICAvKio8IExlYXJuaW5nIFRhYmxlIFNpemUuICovCit9IGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0OworCisvKiogRGFzYW4gVkxBTi4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuCit7CisgICAgdWludDhfdCByZXNlcnZlZDsgICAgICAgLyoqPCBSZXNlcnZlZC4gKi8KKyAgICBiY21vc19ib29sIGlzX3RhZ2dlZDsgICAvKio8IElzIFRhZ2dlZC4gKi8KKyAgICB1aW50MTZfdCB2bGFuX2lkOyAgICAgICAvKio8IFZMQU4gSUQuICovCit9IGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuOworCisvKiogRGFzYW4gVkxBTiBQb3J0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW5fcG9ydAoreworICAgIHVpbnQxNl90IHBvcnRfbnVtYmVyOyAgICAgICAgICAgICAgIC8qKjwgUG9ydCBOdW1iZXIuICovCisgICAgdWludDE2X3QgdmxhbnNfY291bnQ7ICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gVkxBTnMgKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fZGFzYW5fdmxhbiAqdmxhbnM7ICAvKio8IFZMQU5zLiAqLworICAgIHVpbnQxNl90IHB2aWQ7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUFZJRC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW5fcG9ydDsKKworLyoqIERhc2FuIFBvcnQgQ29uZmlnLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfY29uZmlnCit7CisgICAgdWludDhfdCBwb3J0X251bWJlcjsgICAgICAgIC8qKjwgUG9ydCBOdW1iZXIuICovCisgICAgYmNtb3NfYm9vbCBpc19saW5rZWQ7ICAgICAgIC8qKjwgSXMgTGlua2VkLiAqLworICAgIHVpbnQ4X3Qgc3BlZWQ7ICAgICAgICAgICAgICAvKio8IFNwZWVkIGluIE1icHMgKi8KKyAgICBiY21vc19ib29sIGlzX2Z1bGxfZHVwbGV4OyAgLyoqPCBJcyBGdWxsIER1cGxleC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfY29uZmlnOworCisvKiogRGFzYW4gUG9ydCBTdGF0cy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X3N0YXRzCit7CisgICAgdWludDY0X3QgaW5fZ29vZF9vY3RldHM7ICAgIC8qKjwgSW4gR29vZCBPY3RldHMuICovCisgICAgdWludDMyX3QgaW5fZ29vZF9mcmFtZXM7ICAgIC8qKjwgSW4gR29vZCBGcmFtZXMuICovCisgICAgdWludDMyX3QgaW5fYnJvYWRjYXN0OyAgICAgIC8qKjwgSW4gQnJvYWRjYXN0LiAqLworICAgIHVpbnQzMl90IGluX211bHRpY2FzdDsgICAgICAvKio8IEluIE11bHRpY2FzdC4gKi8KKyAgICB1aW50NjRfdCBvdXRfZ29vZF9vY3RldHM7ICAgLyoqPCBPdXQgR29vZCBPY3RldHMuICovCisgICAgdWludDMyX3Qgb3V0X2dvb2RfZnJhbWVzOyAgIC8qKjwgT3V0IEdvb2QgRnJhbWVzLiAqLworICAgIHVpbnQzMl90IG91dF9icm9hZGNhc3Q7ICAgICAvKio8IE91dCBCcm9hZGNhc3QuICovCisgICAgdWludDMyX3Qgb3V0X211bHRpY2FzdDsgICAgIC8qKjwgT3V0IE11bHRpY2FzdC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfc3RhdHM7CisKKy8qKiBEYXNhbiBQb3J0IEVycm9yIFN0YXRzLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfZXJyb3Jfc3RhdHMKK3sKKyAgICB1aW50MzJfdCB1bmRlcnNpemVkOyAgICAgICAgICAgIC8qKjwgVW5kZXJzaXplZC4gKi8KKyAgICB1aW50MzJfdCBvdmVyc2l6ZWQ7ICAgICAgICAgICAgIC8qKjwgT3ZlcnNpemVkLiAqLworICAgIHVpbnQzMl90IGphYmJlcjsgICAgICAgICAgICAgICAgLyoqPCBKYWJiZXIuICovCisgICAgdWludDMyX3QgaW5fbWFjX3JlY2VpdmVfZXJyb3I7ICAvKio8IEluIE1BQyBSZWNlaXZlIEVycm9yLiAqLworICAgIHVpbnQzMl90IGluX2Zjc19lcnJvcjsgICAgICAgICAgLyoqPCBJbiBGQ1MgRXJyb3IuICovCit9IGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2Vycm9yX3N0YXRzOworCisvKiogRGFzYW4gU3RhdHMgU2VxIEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX3R5cGUgdHlwZTsgICAgICAgICAgICAgIC8qKjwgVHlwZS4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X3N0YXRzIHBvcnQwOyAgICAgICAgIC8qKjwgUG9ydCAwLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfc3RhdHMgcG9ydDE7ICAgICAgICAgLyoqPCBQb3J0IDEuICovCisgICAgICAgIH0gcG9ydDBhbmQxOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9zdGF0cyBwb3J0MjsgICAgICAgICAvKio8IFBvcnQgMi4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X3N0YXRzIHBvcnQzOyAgICAgICAgIC8qKjwgUG9ydCAzLiAqLworICAgICAgICB9IHBvcnQyYW5kMzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfZXJyb3Jfc3RhdHMgcG9ydDA7ICAgLyoqPCBQb3J0IDAuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9lcnJvcl9zdGF0cyBwb3J0MTsgICAvKio8IFBvcnQgMS4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2Vycm9yX3N0YXRzIHBvcnQyOyAgIC8qKjwgUG9ydCAyLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfZXJyb3Jfc3RhdHMgcG9ydDM7ICAgLyoqPCBQb3J0IDMuICovCisgICAgICAgIH0gZXJyb3JzOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV9iYXNlOworCisvKiogRGFzYW4gU3RhdCBWYWx1ZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0X3ZhbHVlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRfaWQgaWQ7ICAgLyoqPCBJRC4gKi8KKyAgICB1aW50MzJfdCB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdF92YWx1ZTsKKworLyoqIERhc2FuIENvbmZpZyBCYXNlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NvbmZpZ19iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX29wY29kZSBvcGNvZGU7ICAgICAgICAgICAgLyoqPCBPcGNvZGUuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBwb3J0c19jb3VudDsgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gUG9ydHMgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0ICpwb3J0czsgICAgICAvKio8IFBvcnRzLiAqLworICAgICAgICB9IHBvcnRfY29uZmlnOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBwb3J0c19jb3VudDsgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gUG9ydHMgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuX3BvcnQgKnBvcnRzOyAvKio8IFBvcnRzLiAqLworICAgICAgICB9IHNldF92bGFuOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBsbGlkOyAgICAgICAgICAvKio8IExMSUQuICovCisgICAgICAgICAgICB1aW50NjRfdCBvcDsgICAgICAgICAgICAvKio8IE9wLiAqLworICAgICAgICAgICAgdWludDE2X3QgcHJvZmlsZV9vcDsgICAgLyoqPCBQcm9maWxlIE9wLiAqLworICAgICAgICAgICAgdWludDE2X3QgdmFsdWVfc2l6ZTsgICAgLyoqPCBWYWx1ZSBTaXplLiAqLworICAgICAgICAgICAgdWludDhfdCBwb3J0c19jb3VudDsgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gUG9ydHMgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2NvbmZpZyAqcG9ydHM7ICAgLyoqPCBQb3J0cy4gKi8KKyAgICAgICAgfSBnZXRfb251X2NvbmZpZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCByZXNlcnZlZDsgICAgICAgICAgIC8qKjwgUmVzZXJ2ZWQuICovCisgICAgICAgICAgICBiY21vc19ib29sIGVuYWJsZTsgICAgICAgICAgLyoqPCBFbmFibGUuICovCisgICAgICAgICAgICB1aW50MTZfdCBtYXhfYWdlOyAgICAgICAgICAgLyoqPCBUaGUgYW1vdW50IG9mIHRpbWUgaW4gc2Vjb25kcyB0aGF0IHRoZSBicmlkZ2Ugc3BlbmRzIGluIHRoZSBCbG9ja2luZyBzdGF0ZSB3aXRob3V0IHJlY2VpdmluZyBhIEJQRFUgYmVmb3JlIGl0IHRyYW5zaXRpb25zIHRvIHRoZSBMaXN0ZW5pbmcgc3RhdGUgKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGZvcndhcmRfZGVsYXk7ICAgICAvKio8IFRoZSBhbW91bnQgb2YgdGltZSBpbiBzZWNvbmRzIHRoZSBicmlkZ2Ugc3BlbmRzIGluIHRoZSBMaXN0ZW5pbmcgYW5kIExlYXJuaW5nIHN0YXRlcyBiZWZvcmUgZm9yd2FyZGluZyBwYWNrZXRzICovCisgICAgICAgICAgICB1aW50MTZfdCBoZWxsb190aW1lOyAgICAgICAgLyoqPCBUaGUgYW1vdW50IG9mIHRpbWUgaW4gc2Vjb25kcyB0aGUgUm9vdCBCcmlkZ2Ugd2FpdHMgYmV0d2VlbiBzZW5kaW5nIEJQRFVzICovCisgICAgICAgIH0gc2V0X3N0cDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgZW5hYmxlX3RpbWU7ICAgICAgIC8qKjwgVGltZSBpbiBzZWNvbmRzIHRvIHJlLWVuYWJsZSB0aGUgVFggKi8KKyAgICAgICAgfSBzZXRfdHhwb3dlcl9vZmY7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IGxsaWRfYml0bWFwOyAgICAgICAvKio8IExMSUQgQml0bWFwLiAqLworICAgICAgICAgICAgYmNtb3NfYm9vbCBlbmFibGU7ICAgICAgICAgIC8qKjwgRW5hYmxlLiAqLworICAgICAgICAgICAgdWludDhfdCBibG9ja19jYXA7ICAgICAgICAgIC8qKjwgQmxvY2sgQ2FwLiAqLworICAgICAgICAgICAgdWludDhfdCBzZW5kX2NhcDsgICAgICAgICAgIC8qKjwgU2VuZCBDYXAuICovCisgICAgICAgICAgICB1aW50OF90IG9sdF9tYWNfY2FwOyAgICAgICAgLyoqPCBPTFQgTUFDIENhcC4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IHNlbmRfcGVyaW9kOyAgICAgICAvKio8IEhlbGxvIHRpbWUgaW4gUlNUUCB0ZXJtcyAqLworICAgICAgICAgICAgdWludDMyX3QgYmxvY2tfdGltZTsgICAgICAgIC8qKjwgVGltZSB0byBkaXNhYmxlIHBvcnQgaWYgbG9vcGVkICovCisgICAgICAgICAgICBiY21vc19tYWNfYWRkcmVzcyBvbHRfbWFjOyAgLyoqPCBPTFQgTUFDLiAqLworICAgICAgICB9IHNldF9sb29wX2RldGVjdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgbGxpZF9iaXRtYXA7ICAgICAgIC8qKjwgTExJRCBCaXRtYXAuICovCisgICAgICAgIH0gc2V0X2xvb3BfZGV0ZWN0X3VuYmxvY2s7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jbGFzc2lmaWVyX2Jhc2UgY2xhc3NpZmllcjsgICAvKio8IENsYXNzaWZpZXIuICovCisgICAgICAgIH0gY2xhc3NpZmllcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgbGxpZDsgICAgICAgICAgICAgIC8qKjwgTExJRC4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IG9wOyAgICAgICAgICAgICAgICAvKio8IE9wLiAqLworICAgICAgICAgICAgdWludDE2X3QgaW5mb19jb3VudDsgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIEluZm8gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKmluZm87ICAgICAgICAgICAgICAvKio8IEluZm8uICovCisgICAgICAgIH0gb251X3ZlcnNpb247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGxsaWQ7ICAgICAgICAgICAgICAvKio8IExMSUQuICovCisgICAgICAgICAgICB1aW50OF90IGJvb3RfbW9kZTsgICAgICAgICAgLyoqPCBCb290IE1vZGUuICovCisgICAgICAgICAgICB1aW50OF90IGFjdGl2ZTsgICAgICAgICAgICAgLyoqPCBBY3RpdmUuICovCisgICAgICAgICAgICB1aW50OF90IGltYWdlMXN0cmluZ1sxNl07ICAgLyoqPCBJbWFnZSAxIFN0cmluZy4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgaW1hZ2Uyc3RyaW5nWzE2XTsgICAvKio8IEltYWdlIDIgU3RyaW5nLiAqLworICAgICAgICB9IG9udV9mbGFzaF9maXJtd2FyZV92ZXJzaW9uOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBsbGlkOyAgICAgICAgICAgICAgLyoqPCBMTElELiAqLworICAgICAgICAgICAgdWludDhfdCBhY3RpdmU7ICAgICAgICAgICAgIC8qKjwgQWN0aXZlLiAqLworICAgICAgICAgICAgdWludDY0X3QgYnVpbGRfdGltZTsgICAgICAgIC8qKjwgQnVpbGQgVGltZS4gKi8KKyAgICAgICAgfSBvbnVfYWN0aXZlX2ltYWdlX3RpbWU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGxsaWQ7ICAgICAgICAgICAgICAvKio8IExMSUQuICovCisgICAgICAgICAgICB1aW50NjRfdCBvcDsgICAgICAgICAgICAgICAgLyoqPCBPcC4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IHNlcXVlbmNlc19jb3VudDsgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBzZXF1ZW5jZXMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX2Jhc2UgKnNlcXVlbmNlczsgICAgLyoqPCBTZXF1ZW5jZXMuICovCisgICAgICAgIH0gb251X3N0YXRpc3RpYzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgbGxpZF9iaXRtYXA7ICAgICAgIC8qKjwgTExJRCBCaXRtYXAuICovCisgICAgICAgICAgICB1aW50OF90IHN0YXRpc3RpY3NfY291bnQ7ICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gU3RhdGlzdGljcyAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRfdmFsdWUgKnN0YXRpc3RpY3M7ICAgLyoqPCBTdGF0aXN0aWNzLiAqLworICAgICAgICB9IG9udV9zdGF0aXN0aWNfZ2V0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19ib29sIGVuYWJsZTsgIC8qKjwgRW5hYmxlLiAqLworICAgICAgICAgICAgdWludDhfdCBtYXhfZ3JvdXBzOyAvKio8IE1heCBHcm91cHMuICovCisgICAgICAgIH0gb251X2lnbXBfc2V0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19ib29sIGVuYWJsZTsgIC8qKjwgRW5hYmxlLiAqLworICAgICAgICB9IG9udV9wb3J0X2lnbXBfZmlsdGVyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHJlc2VydmVkOyAgIC8qKjwgUmVzZXJ2ZWQuICovCisgICAgICAgICAgICBiY21vc19ib29sIGVuYWJsZTsgIC8qKjwgRW5hYmxlLiAqLworICAgICAgICAgICAgdWludDMyX3QgcmF0ZTsgICAgICAvKio8IERhdGEgcmF0ZSBpbiBrYnBzICovCisgICAgICAgIH0gb251X3NoYXBpbmc7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY29uZmlnX2Jhc2U7CisKKy8qKiBEaXN0aW5ndWlzaGVkIE5hbWUuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lCit7CisgICAgdWludDhfdCBsZW5ndGg7IC8qKjwgTGVuZ3RoLiAqLworICAgIHVpbnQ4X3QgKm5hbWU7ICAvKio8IE5hbWUuICovCit9IGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWU7CisKKy8qKiBEaXN0aW5ndWlzaGVkIE5hbWUgTGlzdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfbGlzdAoreworICAgIHVpbnQzMl90IG5hbWVzX2NvdW50OyAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIG5hbWVzLiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWUgKm5hbWVzOyAgLyoqPCBOYW1lcy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZV9saXN0OworCisvKiogQSBsaXN0IG9mIE1BQyBhZGRyZXNzZXMgaW4gRFBvRSBPQU0gZm9ybWF0IAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGUKK3sKKyAgICB1aW50MzJfdCBtYWNfYWRkcmVzc19jb3VudDsgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIG1hY19hZGRyZXNzLiAqLworICAgIGJjbW9zX21hY19hZGRyZXNzICptYWNfYWRkcmVzczsgLyoqPCBMaXN0IG9mIE1BQyBhZGRyZXNzZXMgKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlOworCisvKiogRFBvRSBBY3Rpb24gVmFsdWUgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9kcG9lX2FjdGlvbl92YWx1ZV9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hY3Rpb24gbGVhZjsgIC8qKjwgTGVhZi4gKi8KKyAgICB1aW50OF90IHdpZHRoOyAgLyoqPCBXaWR0aC4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZSBtYWNfYWRkZXNzOyAgICAgICAgICAvKio8IE1BQyBBZGRlc3MuICovCisgICAgICAgIH0gYWRkX2R5bl9tYWNfYWRkcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlIG1hY19hZGRyZXNzOyAgICAgICAgIC8qKjwgTUFDIEFkZHJlc3MuICovCisgICAgICAgIH0gZGVsX2R5bl9tYWNfYWRkcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlIG1hY19hZGRyZXNzOyAgICAgICAgIC8qKjwgTUFDIEFkZHJlc3MuICovCisgICAgICAgIH0gYWRkX3N0YXRpY19tYWNfYWRkcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlIG1hY19hZGRyZXNzOyAgICAgICAgIC8qKjwgTUFDIEFkZHJlc3MuICovCisgICAgICAgIH0gZGVsX3N0YXRpY19tYWNfYWRkcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbG9vcGJhY2tfbG9jYXRpb24gbG9jYXRpb247ICAgIC8qKjwgTG9jYXRpb24uICovCisgICAgICAgIH0gbG9vcGJhY2tfZW5hYmxlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9sb29wYmFja19sb2NhdGlvbiBsb2NhdGlvbjsgICAgLyoqPCBMb2NhdGlvbi4gKi8KKyAgICAgICAgfSBsb29wYmFja19kaXNhYmxlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBkaXNhYmxlX3RpbWU7ICAvKio8IFVuaXRzOiBzZWNvbmRzICovCisgICAgICAgIH0gbGFzZXJfdHhfcG93ZXJfb2ZmOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9sbGlkX2FjdGlvbiBsbGlkX2FjdGlvbjsgICAvKio8IExMSUQgQWN0aW9uLiAqLworICAgICAgICAgICAgdWludDE2X3QgbGxpZF92YWx1ZTsgICAgLyoqPCBMTElEIFZhbHVlLiAqLworICAgICAgICB9IGNvbmZpZ3VyZV9tY2FzdF9sbGlkOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYWN0aW9uX3ZhbHVlX2Jhc2U7CisKKy8qKiBEUG9FIFF1ZXVlIFNldC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3NldAoreworICAgIHVpbnQ4X3QgcXVldWVfY291bnQ7ICAgIC8qKjwgUXVldWUgQ291bnQuICovCisgICAgdWludDhfdCAqcXVldWVfc2l6ZXM7ICAgLyoqPCBRdWV1ZSBTaXplcy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfc2V0OworCisvKiogRFBvRSBRdWV1ZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X3R5cGUgdHlwZTsgIC8qKjwgVHlwZS4gKi8KKyAgICB1aW50OF90IGluc3RhbmNlOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBJbnN0YW5jZS4gKi8KKyAgICB1aW50OF90IHF1ZXVlOyAgLyoqPCBRdWV1ZS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWU7CisKKy8qKiBEUG9FIE9iamVjdCBDb250ZXh0IEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X3R5cGUgb2JqZWN0X3R5cGU7ICAgLyoqPCBPYmplY3QgVHlwZS4gKi8KKyAgICB1aW50OF90IGxlbmd0aDsgICAgICAgICAgICAgICAgIC8qKjwgTGVuZ3RoLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBpbnN0YW5jZTsgICAgICAgLyoqPCBJbnN0YW5jZS4gKi8KKyAgICAgICAgfSBvbnU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHBvbl9jb3VudDsgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHBvbi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnBvbjsgICAgICAgICAgIC8qKjwgUE9OLiAqLworICAgICAgICB9IG5ldHdvcmtfcG9uOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBsaW5rX2NvdW50OyAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBsaW5rLiAqLworICAgICAgICAgICAgdWludDhfdCAqbGluazsgICAgICAgICAgLyoqPCBMaW5rLiAqLworICAgICAgICB9IGxpbms7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHBvcnRfY291bnQ7ICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHBvcnQuICovCisgICAgICAgICAgICB1aW50OF90ICpwb3J0OyAgICAgICAgICAvKio8IFBvcnQuICovCisgICAgICAgIH0gdXNlcl9wb3J0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZSBxdWV1ZTsgICAvKio8IFF1ZXVlLiAqLworICAgICAgICB9IHF1ZXVlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBtY2FzdF9sbGlkOyAgICAgICAgICAgICAgICAvKio8IE1jYXN0IExMSUQuICovCisgICAgICAgIH0gbWNhc3RfbGluazsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgYnJpZGdlX2NvdW50OyAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gYnJpZGdlLiAqLworICAgICAgICAgICAgdWludDhfdCAqYnJpZGdlOyAgICAgICAgICAgICAgICAgICAgLyoqPCBCcmlkZ2UuICovCisgICAgICAgIH0gYnJpZGdlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBwb3J0X2NvdW50OyAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBwb3J0LiAqLworICAgICAgICAgICAgdWludDhfdCAqcG9ydDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBQb3J0LiAqLworICAgICAgICB9IGJyaWRnZV9wb3J0OworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZTsKKworLyoqIERQb0UgVmFyIERlc2NyaXB0b3IuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvcgoreworICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX2JyYW5jaCBicmFuY2g7ICAgICAgICAgICAgICAgICAvKio8IEJyYW5jaC4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGxlYWY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMZWFmLiAqLworICAgICAgICB9IGRlZjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdW5rbm93bl9jb3VudDsgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB1bmtub3duLiAqLworICAgICAgICAgICAgdWludDhfdCAqdW5rbm93bjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFVua25vd24uICovCisgICAgICAgIH0gZW5kOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlIGxlYWY7ICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgfSBzdGFuZGFyZF9hdHRyaWJ1dGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hY3Rpb24gbGVhZjsgICAgICAgLyoqPCBMZWFmLiAqLworICAgICAgICB9IHN0YW5kYXJkX2FjdGlvbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZSBvYmplY3RfY29udGV4dDsgICAgLyoqPCBPYmplY3QgQ29udGV4dC4gKi8KKyAgICAgICAgfSBvYmplY3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYXR0cmlidXRlIGxlYWY7ICAgICAgICAgICAgICAgICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgfSBleHRlbmRlZF9hdHRyaWJ1dGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYWN0aW9uIGxlYWY7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgfSBleHRlbmRlZF9hY3Rpb247CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvcjsKKworLyoqIERQb0UgU3RhdGlzdGljIFRocmVzaG9sZC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9kcG9lX3N0YXRpc3RpY190aHJlc2hvbGQKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvciBzdGF0aXN0aWM7ICAvKio8IFN0YXRpc3RpYy4gKi8KKyAgICB1aW50MzJfdCByaXNpbmdfdGhyZXNob2xkOyAgICAgICAgICAgICAgICAgICAgICAvKio8IFRocmVzaG9sZCBhdCB3aGljaCB0byBzZXQgYWxhcm0gKDAgdG8gZGlzYWJsZSkgKi8KKyAgICB1aW50MzJfdCBmYWxsaW5nX3RocmVzaG9sZDsgICAgICAgICAgICAgICAgICAgICAvKio8IFRocmVzaG9sZCBhdCB3aGljaCB0byBjbGVhciBhbGFybSAqLworfSBiY21vbHRfZXBvbl9vYW1fZHBvZV9zdGF0aXN0aWNfdGhyZXNob2xkOworCisvKiogRFBvRSBGaWVsZC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpZWxkCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmllbGRfY29kZSBjb2RlOyAgIC8qKjwgQ29kZS4gKi8KKyAgICB1aW50OF90IGluc3RhbmNlOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBJbnN0YW5jZS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmllbGQ7CisKKy8qKiBEUG9FIFJ1bGUgUmVzdWx0IEZpZWxkIFYyLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGRfdjIKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWVsZCBmaWVsZDsgICAvKio8IEZpZWxkLiAqLworICAgIHVpbnQ4X3QgbXNiX21hc2s7ICAgICAgICAgICAgICAgICAgIC8qKjwgTVNCIE1hc2suICovCisgICAgdWludDhfdCBsc2JfbWFzazsgICAgICAgICAgICAgICAgICAgLyoqPCBMU0IgTWFzay4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGRfdjI7CisKKy8qKiBEUG9FIFJ1bGUgUmVzdWx0IEZpZWxkLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGQKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWVsZCBmaWVsZDsgICAvKio8IEZpZWxkLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZDsKKworLyoqIEEgc2luZ2xlIHJlc3VsdCBvZiB0aGUgcnVsZSAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHQKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9yZXN1bHQgcmVzdWx0OyAgICAgICAgIC8qKjwgUmVzdWx0IG9mIHRoZSBydWxlICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZSBxdWV1ZTsgICAvKio8IFRhcmdldCBxdWV1ZSAqLworICAgICAgICB9IHF1ZXVlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZF92MiBmaWVsZDsgICAgLyoqPCBGaWVsZCB0byBzZXQgKi8KKyAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlX2NvdW50OyAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHZhbHVlLiAqLworICAgICAgICAgICAgdWludDhfdCAqdmFsdWU7ICAgICAgICAgLyoqPCBWYWx1ZSB0byBzZXQgKi8KKyAgICAgICAgfSBzZXQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X2ZpZWxkX3YyIGZpZWxkOyAgICAvKio8IEZpZWxkLiAqLworICAgICAgICB9IGNvcHk7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X2ZpZWxkIGZpZWxkOyAgICAgICAvKio8IEZpZWxkLiAqLworICAgICAgICB9CisgICAgICAgIGRlbGV0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGQgZmllbGQ7ICAgICAgIC8qKjwgRmllbGQuICovCisgICAgICAgIH0gaW5zZXJ0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZCBmaWVsZDsgICAgICAgLyoqPCBGaWVsZC4gKi8KKyAgICAgICAgfSByZXBsYWNlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZCBmaWVsZDsgICAgICAgLyoqPCBGaWVsZC4gKi8KKyAgICAgICAgfSBjbGVhcl9kZWxldGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X2ZpZWxkIGZpZWxkOyAgICAgICAvKio8IEZpZWxkLiAqLworICAgICAgICB9IGNsZWFyX2luc2VydDsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0OworCisvKiogUGFydCBvZiBhIERQb0UgT0FNIHJ1bGUgCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGUKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fcnVsZV90eXBlIHN1YnR5cGU7ICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgU3VidHlwZSBvZiB0aGlzIHBpZWNlIG9mIHRoZSBydWxlICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHByZWNlZGVuY2U7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUHJlY2VkZW5jZSBvZiB0aGUgcnVsZSAqLworICAgICAgICB9IGhlYWRlcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmllbGQgZmllbGRfY29kZTsgICAgICAvKio8IFRoZSBmaWVsZCB0byBtYXRjaCAqLworICAgICAgICAgICAgdWludDhfdCBtc2JfbWFzazsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IExlZnQgbWFzayAqLworICAgICAgICAgICAgdWludDhfdCBsc2JfbWFzazsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFJpZ2h0IG1hc2sgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9ydWxlX29wZXJhdG9yIG9wZXJhdG9yOyAgICAgLyoqPCBNYXRjaCBvcGVyYXRpb24gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbWF0Y2hfdmFsdWVfbGVuZ3RoOyAgICAgICAgICAgICAgICAgLyoqPCBCeXRlcyBpbiBtYXRjaCB2YWx1ZSAqLworICAgICAgICAgICAgdWludDhfdCAqbWF0Y2hfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFZhbHVlIHRvIG1hdGNoICovCisgICAgICAgIH0gY2xhdXNlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdCByZXN1bHQ7ICAgIC8qKjwgUmVzdWx0LiAqLworICAgICAgICB9IHJlc3VsdDsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGU7CisKKy8qKiBEUG9FIFNoYXBlci4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9kcG9lX3NoYXBlcgoreworICAgIHVpbnQ4X3QgcXVldWVfYml0bWFwOyAgIC8qKjwgUXVldWUgQml0bWFwLiAqLworICAgIHVpbnQzMl90IG1heGltdW1fcmF0ZTsgIC8qKjwgTWF4aW11bSBSYXRlLiAqLworICAgIHVpbnQxNl90IGJ1cnN0X3NpemU7ICAgIC8qKjwgQnVyc3QgU2l6ZS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc2hhcGVyOworCisvKiogRFBvRSBSYXRlIExldmVsLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmF0ZV9sZXZlbAoreworICAgIGJjbW9sdF9lcG9uX29hbV90cmFmZmljX2JpdG1hcCB0cmFmZmljX3R5cGU7ICAgIC8qKjwgVHJhZmZpYyBUeXBlLiAqLworICAgIHVpbnQzMl90IG1heGltdW1fcmF0ZTsgIC8qKjwgTWF4aW11bSBSYXRlLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZHBvZV9yYXRlX2xldmVsOworCisvKiogRFBvRSBFdmVudCBPcHRpb25zLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXZlbnRfb3B0aW9ucworeworICAgIHVpbnQ4X3QgZXZlbnRfY29kZTsgICAgICAgICAvKio8IEV2ZW50IENvZGUuICovCisgICAgdWludDhfdCBlbmFibGVkX2Rpc2FibGVkOyAgIC8qKjwgRW5hYmxlZCAvIERpc2FibGVkLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZHBvZV9ldmVudF9vcHRpb25zOworCisvKiogVmFyaWFibGUtbGVuZ3RoIGxpc3Qgb2YgVTE2LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX3UxNl9saXN0X3U4Cit7CisgICAgdWludDhfdCBsZW47ICAgIC8qKjwgTGlzdCBsZW5ndGguICovCisgICAgdWludDE2X3QgKnZhbDsgIC8qKjwgTGlzdCBjb250ZW50cy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3UxNl9saXN0X3U4OworCisvKiogRFBvRSBBdHRyaWJ1dGUgVmFsdWUgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hdHRyaWJ1dGUgbGVhZjsgICAvKio8IExlYWYuICovCisgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHVua25vd25fY291bnQ7ICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB1bmtub3duLiAqLworICAgICAgICAgICAgdWludDhfdCAqdW5rbm93bjsgICAgICAgICAgIC8qKjwgVW5rbm93bi4gKi8KKyAgICAgICAgfSBkZWY7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IHNlcXVuY2VfbnVtYmVyOyAgICAvKio8IEJpdCAxNSwgd2hlbiBzZXQsIGluZGljYXRlcyB0aGF0IHRoaXMgaXMgdGhlIGxhc3QgbWVzc2FnZSBvZiBpdHMgc2VxdWVuY2UuICAqLworICAgICAgICB9IHNlcXVlbmNlX251bWJlcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgaWQ7ICAgICAgIC8qKjwgVGhlIGxvd2VzdCAobnVtZXJpY2FsbHkgc21hbGxlc3QpIE1BQyBhZGRyZXNzIGFtb25nIGFsbCBNQUMgYWRkcmVzc2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgVFUgaW50ZXJmYWNlIHBvcnQgb2YgYSBEUG9FIE9OVSAqLworICAgICAgICB9IG9udV9pZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgYm9vdF92ZXJzaW9uOyAgICAgIC8qKjwgVmVyc2lvbiBvZiBib290c3RyYXAgbG9hZGVyIChpZiBhbnkpICovCisgICAgICAgICAgICB1aW50MzJfdCBib290X2NyYzMyOyAgICAgICAgLyoqPCBDUkMtMzIgb2YgYm9vdCBsb2FkZXIgc2VydmVzIGFzIGFkZGl0aW9uYWwgdW5pcXVlIGlkZW50aWZpZXIgYW5kIHZlcmlmaWNhdGlvbiAqLworICAgICAgICAgICAgdWludDE2X3QgYXBwbGljYXRpb25fdmVyc2lvbjsgICAgICAgICAgICAgICAvKio8IFZlcnNpb24gb2YgbWFpbiBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBydW5uaW5nIG9uIHRoZSBEUG9FIE9OVSAqLworICAgICAgICAgICAgdWludDMyX3QgYXBwbGljYXRpb25fY3JjMzI7ICAgICAgICAgICAgICAgICAvKio8IENSQy0zMiBvZiBhcHBsaWNhdGlvbiBzb2Z0d2FyZSBzZXJ2ZXMgYXMgdW5pcXVlIElEIGFuZCB2ZXJpZmljYXRpb24gKi8KKyAgICAgICAgfSBmaXJtd2FyZV9pbmZvOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBqZWRlY19pZDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgMTYtYml0IGNoaXAgbWFudWZhY3R1cmVyIElEIGNvZGUgYXMgYXNzaWduZWQgYnkgSkVERUMgKi8KKyAgICAgICAgICAgIHVpbnQzMl90IGNoaXBfbW9kZWw7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBJZGVudGlmaWVzIHRoZSBwYXJ0aWN1bGFyIGtpbmQgb2YgRVBOIGNoaXAuIEZvcm1hdCBkZWZpbmVkIGJ5IGNoaXBzZXQgdmVuZG9yICovCisgICAgICAgICAgICB1aW50MzJfdCBjaGlwX3ZlcnNpb247ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgSWRlbnRpZmllcyB0aGUgdmVyc2lvbiBvciBzdGVwcGluZyBvZiB0aGUgY2hpcCBtb2RlbC4gRm9ybWF0IGRlZmluZWQgYnkgY2hpcHNldCB2ZW5kb3IgKi8KKyAgICAgICAgfSBjaGlwX2luZm87CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IHllYXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBCQ0QgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbW9udGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBCQ0QgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgZGF5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBCQ0QgKi8KKyAgICAgICAgfSBkYXRlX29mX21hbnVmYWN0dXJlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBkZWZfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIGRlZi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKmRlZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBGb3JtYXQgaXMgZGVmaW5lZCBieSB0aGUgT05VIHZlbmRvci4gKi8KKyAgICAgICAgfSBtYW51ZmFjdHVyZXJfaW5mbzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgYmlkaXJlY3Rpb25hbDsgICAgICAgICAgICAgICAgICAgICAvKio8IE1heGltdW0gbnVtYmVyIG9mIGxpbmtzIHdoaWNoIGNhbiBib3RoIHRyYW5zbWl0IGFuZCByZWNlaXZlLiAqLworICAgICAgICAgICAgdWludDE2X3QgZG93bnN0cmVhbV9vbmx5OyAgICAgICAgICAgICAgICAgICAvKio8IEluIGFkZGl0aW9uIHRvIHRoZSBiaWRpcmVjdGlvbmFsIGxpbmtzLCB0aGUgbWF4aW11bSBudW1iZXIgb2YgTExJRHMgd2hpY2ggY2FuIHJlY2VpdmUgZGF0YSwgYnV0IG5vdCB0cmFuc21pdCAodW5pZGlyZWN0aW9uYWwsIGRvd25zdHJlYW0gb25seSkgKi8KKyAgICAgICAgfSBtYXhfbG9naWNhbF9saW5rczsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgcG9ydF9jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRoZSB0b3RhbCBudW1iZXIgb2YgVFUgaW50ZXJmYWNlIHBvcnRzIG9uIHRoZSBPTlUuICovCisgICAgICAgIH0gbnVtX2Vwb25fcG9ydHM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IHBvcnRfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIFMxIGludGVyZmFjZXMgb24gdGhlIERQb0UgT05VLiAqLworICAgICAgICB9IG51bV91bmlfcG9ydHM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdXBzdHJlYW1fcXVldWVzOyAgICAgICAgICAgICAgICAgICAgLyoqPCBUb3RhbCBudW1iZXIgb2YgcXVldWVzIGF2YWlsYWJsZSB0byBiZSBhc3NpZ25lZCB0byBsb2dpY2FsIGxpbmtzIGluIHRoZSB1cHN0cmVhbSBkaXJlY3Rpb24gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgdXBfcXVldWVzX21heF9wZXJfbGluazsgICAgICAgICAgICAgLyoqPCBNYXhpbXVtIG51bWJlciBvZiBxdWV1ZXMgd2hpY2ggY2FuIGJlIGFzc2lnbmVkIHRvIGEgc2luZ2xlIGxvZ2ljYWwgbGluayBpbiB0aGUgdXBzdHJlYW0gZGlyZWN0aW9uICovCisgICAgICAgICAgICB1aW50OF90IHVwX3F1ZXVlX2luY3JlbWVudDsgICAgICAgICAgICAgICAgIC8qKjwgVGhlIHNtYWxsZXN0IGFsbG9jYXRhYmxlIGluY3JlbWVudCBvZiBwYWNrZXQgYnVmZmVyIG1lbW9yeSBpbiB0aGUgdXBzdHJlYW0gZGlyZWN0aW9uLCBpbiBraWxvYnl0ZXMuICovCisgICAgICAgICAgICB1aW50OF90IGRvd25zdHJlYW1fcXVldWVzOyAgICAgICAgICAgICAgICAgIC8qKjwgVG90YWwgbnVtYmVyIG9mIHF1ZXVlcyBhdmFpbGFibGUgdG8gYmUgYXNzaWduZWQgdG8gbG9naWNhbCBsaW5rcyBpbiB0aGUgZG93bnN0cmVhbSBkaXJlY3Rpb24gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgZG5fcXVldWVzX21heF9wZXJfcG9ydDsgICAgICAgICAgICAgLyoqPCBNYXhpbXVtIG51bWJlciBvZiBxdWV1ZXMgd2hpY2ggY2FuIGJlIGFzc2lnbmVkIHRvIGEgc2luZ2xlIFVOSSBwb3J0IGluIHRoZSBkb3duc3RyZWFtIGRpcmVjdGlvbiAqLworICAgICAgICAgICAgdWludDhfdCBkbl9xdWV1ZV9pbmNyZW1lbnQ7ICAgICAgICAgICAgICAgICAvKio8IFRoZSBzbWFsbGVzdCBhbGxvY2F0YWJsZSBpbmNyZW1lbnQgb2YgcGFja2V0IGJ1ZmZlciBtZW1vcnkgaW4gdGhlIGRvd25zdHJlYW0gZGlyZWN0aW9uLCBpbiBraWxvYnl0ZXMuICovCisgICAgICAgICAgICB1aW50MTZfdCB0b3RhbF9wYWNrZXRfYnVmZmVyOyAgICAgICAgICAgICAgIC8qKjwgVG90YWwgcGFja2V0IGJ1ZmZlciBtZW1vcnkgb24gdGhlIE9OVSAoS0IpICovCisgICAgICAgICAgICB1aW50MTZfdCB1cHN0cmVhbV9wYWNrZXRfYnVmZmVyOyAgICAgICAgICAgIC8qKjwgTWF4aW11bSBhbW91bnQgb2YgcGFja2V0IGJ1ZmZlciBtZW1vcnkgd2hpY2ggY2FuIGJlIGFsbG9jYXRlZCB0byB1cHN0cmVhbSBxdWV1ZXMgKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGRvd25zcmVhbV9wYWNrZXRfYnVmZmVyOyAgICAgICAgICAgLyoqPCBNYXhpbXVtIGFtb3VudCBvZiBwYWNrZXQgYnVmZmVyIG1lbW9yeSB3aGljaCBjYW4gYmUgYWxsb2NhdGVkIHRvIGRvd25zdHJlYW0gcXVldWVzICovCisgICAgICAgIH0gcGFja2V0X2J1ZmZlcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBudW1iZXJfb2ZfcXVldWVfc2V0czsgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBRdWV1ZSBTZXRzICovCisgICAgICAgICAgICB1aW50OF90IHJlcG9ydF92YWx1ZXNfcGVyX3F1ZXVlX3NldDsgICAgICAgIC8qKjwgUmVwb3J0IFZhbHVlcyBQZXIgUXVldWUgU2V0ICovCisgICAgICAgICAgICB1aW50MTZfdCAqcXVldWVfc2V0MDsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUmVwb3J0IFRocmVzaG9sZHMgZm9yIFF1ZXVlIFNldCAwICovCisgICAgICAgICAgICB1aW50MTZfdCAqcXVldWVfc2V0MTsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUmVwb3J0IFRocmVzaG9sZHMgZm9yIFF1ZXVlIFNldCAxICovCisgICAgICAgICAgICB1aW50MTZfdCAqcXVldWVfc2V0MjsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUmVwb3J0IFRocmVzaG9sZHMgZm9yIFF1ZXVlIFNldCAyICovCisgICAgICAgICAgICB1aW50MTZfdCAqcXVldWVfc2V0MzsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUmVwb3J0IFRocmVzaG9sZHMgZm9yIFF1ZXVlIFNldCAzICovCisgICAgICAgIH0gcmVwb3J0X3RocmVzaG9sZHM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xpbmtfc3RhdGUgbGlua19zdGF0ZTsgLyoqPCBMaW5rIFN0YXRlLiAqLworICAgICAgICB9IGxpbmtfc3RhdGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgbWF4aW11bV9vYW1fcmF0ZTsgICAgICAgICAgICAgICAgICAgLyoqPCBNYXhpbXVtIE9BTSBSYXRlLiAqLworICAgICAgICAgICAgdWludDhfdCBtaW5pbXVtX29hbV9yYXRlOyAgICAgICAgICAgICAgICAgICAvKio8IE1pbmltdW0gT0FNIFJhdGUuICovCisgICAgICAgIH0gb2FtX3JhdGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IG1heF9tYWNfYWxsb3dlZDsgICAgICAgICAgICAgICAgICAgLyoqPCBNYXhpbXVtIGFsbG93ZWQgbGltaXQgKi8KKyAgICAgICAgfSBkeW5fbGVhcm5fdGFibGVfc2l6ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgZHluYW1pY19hZGRyZXNzX2FnZV9saW1pdDsgICAgICAgICAvKio8IFVuaXRzIDguNzUgbXMgKi8KKyAgICAgICAgfSBkeW5fbGVhcm5fYWdlX2xpbWl0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGUgbWFjX2FkZHJlc3M7IC8qKjwgTUFDIEFkZHJlc3MuICovCisgICAgICAgIH0gZHluX21hY190YWJsZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlIG1hY19hZGRyZXNzOyAvKio8IE1BQyBBZGRyZXNzLiAqLworICAgICAgICB9IHN0YXRpY19tYWNfdGFibGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9hdXRvX25lZ290aWF0aW9uX2NhcGFiaWxpdHkgbWF4aW11bV9jYXBhYmlsaXRpZXM7ICAgLyoqPCBNYXhpbXVtIENhcGFiaWxpdGllcy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9hdXRvX25lZ290aWF0aW9uX2NhcGFiaWxpdHkgY3VycmVudF9jYXBhYmlsaXRpZXM7ICAgLyoqPCBDdXJyZW50IENhcGFiaWxpdGllcy4gKi8KKyAgICAgICAgfSBwb3J0X2NhcGFiaWxpdHk7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYXJuaW5nX21vZGUgbGVhcm5pbmdfbW9kZTsgICAgICAgICAgICAgICAgICAgLyoqPCA4MDIuMSBsZWFybmluZyBtb2RlIGFsd2F5cyBmb3J3YXJkcyBmcmFtZXMuIE1BQyBhY2Nlc3MgY29udHJvbCBtb2RlIGZvcndhcmRzIGZyYW1lcyBvbmx5IGlmIHRoZSBTQSBvZiB0aGUgZnJhbWUgaXMgaW4gdGhlIE1BQyBhZGRyZXNzIHRhYmxlIGZvciB0aGF0IHBvcnQ7IHRoYXQgaXMsIHRoZSBhZGRyZXNzIGhhcyBiZWVuIGxlYXJuZWQgb24gdGhhdCBwb3J0LCBvciBwcm92aXNpb25lZCBvbiB0aGF0IHBvcnQgYnkgbWFuYWdlbWVudC4gQSBmcmFtZSB3aXRoIHRoZSBzYW1lIFNBIGF0dGVtcHRpbmcgdG8gaW5ncmVzcyBzb21lIG90aGVyIHBvcnQgd291bGQgYmUgZGlzY2FyZGVkLiAqLworICAgICAgICB9IGR5bl9sZWFybl9tb2RlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBtaW5pbXVtX2d1YXJhbnRlZWRfbGltaXQ7ICAgICAgICAgICAgICAgICAgLyoqPCBNaW5pbXVtIEd1YXJhbnRlZWQgTGltaXQuICovCisgICAgICAgIH0gbWluX21hY19saW1pdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgbWF4X2FsbG93ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTWF4IEFsbG93ZWQuICovCisgICAgICAgIH0gbWF4X21hY19hbGxvd2VkOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBhZ2dyZWdhdGVfbWFjX2xpbWl0OyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgT05VIGFnZ3JlZ2F0ZSBkeW5hbWljIE1BQyBhZGRyZXNzIGxpbWl0ICovCisgICAgICAgIH0gYWdnX21hY19saW1pdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfYm9vbCBsZW5fZXJyb3JfZGlzY2FyZDsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgSWYgTGVuZ3RoIEVycm9yIERpc2NhcmQgRW5hYmxlICovCisgICAgICAgIH0gbGVuX2Vycl9kaXNjYXJkOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19ib29sIGZsb29kX3Vua25vd247ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBGbG9vZCBVbmtub3duIERBIG9wdGlvbiAqLworICAgICAgICB9IGZsb29kX3Vua25vd247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX2Jvb2wgbG9jYWxfc3dpdGNoaW5nOyAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IExvY2FsIFN3aXRjaGluZyBvcHRpb24gKi8KKyAgICAgICAgfSBsb2NhbF9zd2l0Y2hpbmc7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgbnVtYmVyX29mX2xpbmtzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgbGlua3MgdG8gY29uZmlndXJlLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfc2V0ICpsaW5rX2NvbmZpZ3VyYXRpb247IC8qKjwgTGluayBDb25maWd1cmF0aW9uLiAqLworICAgICAgICAgICAgdWludDhfdCBudW1iZXJfb2ZfcG9ydHM7ICAgIC8qKjwgVGhlIG51bWJlciBvZiBQb3J0cyB0byBjb25maWd1cmUuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9zZXQgKnBvcnRfY29uZmlndXJhdGlvbjsgLyoqPCBQb3J0IENvbmZpZ3VyYXRpb24uICovCisgICAgICAgIH0gcXVldWVfY29uZmlnOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBmaXJtd2FyZV9maWxlbmFtZV9jb3VudDsgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gZmlybXdhcmVfZmlsZW5hbWUuICovCisgICAgICAgICAgICB1aW50OF90ICpmaXJtd2FyZV9maWxlbmFtZTsgLyoqPCBUaGUgZmlsZW5hbWUgaXMgYSBudWxsLXRlcm1pbmF0ZWQgQVNDSUkgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgbmFtZSBvZiB0aGUgZmlsZSBhcyByZWNlaXZlZCBmcm9tIHRoZSBPU1MgYnkgdGhlIHZDTS4gKi8KKyAgICAgICAgfSBmaXJtd2FyZV9maWxlbmFtZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc3RhdGlzdGljX3RocmVzaG9sZCBzdGF0X3RocmVzaG9sZDsgICAgLyoqPCBTdGF0IFRocmVzaG9sZC4gKi8KKyAgICAgICAgfSBwb3J0X3N0YXRfdGhyZXNoOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9zdGF0aXN0aWNfdGhyZXNob2xkIHN0YXRfdGhyZXNob2xkOyAgICAvKio8IFN0YXQgVGhyZXNob2xkLiAqLworICAgICAgICB9IGxpbmtfc3RhdF90aHJlc2g7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IHRpbWU7ICAvKio8IFRpbWVvdXQgdmFsdWUgaW4gc2VjICovCisgICAgICAgIH0ga2V5X2V4cGlyeV90aW1lOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9lbmNyeXB0aW9uX21vZGUgZW5jcnlwdGlvbl9tZXRob2Q7IC8qKjwgRW5jcnlwdGlvbiBNZXRob2QuICovCisgICAgICAgIH0gZW5jcnlwdF9tb2RlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlIHJ1bGU7ICAgICAgICAgICAgICAgICAvKio8IFJ1bGUuICovCisgICAgICAgIH0gcG9ydF9pbmdyZXNzX3J1bGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpZWxkX2NvZGUgZmllbGRfY29kZTsgICAgIC8qKjwgRmllbGQgQ29kZS4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xheWVyX3NlbGVjdCBsYXllcl9zZWxlY3Q7IC8qKjwgTGF5ZXIgU2VsZWN0LiAqLworICAgICAgICAgICAgdWludDhfdCBiaXRfd29yZF9vZmZzZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCAzMi1iaXQgV29yZCBPZmZzZXQuICovCisgICAgICAgICAgICB1aW50OF90IGJpdF9vZmZzZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEJpdCBPZmZzZXQuICovCisgICAgICAgICAgICB1aW50OF90IGJpdF93aWR0aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEJpdCBXaWR0aC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgcmVmZXJlbmNlX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUmVmZXJlbmNlIENvdW50LiAqLworICAgICAgICB9IGx1ZV9maWVsZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgdHBpZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBBbHRlcm5hdGUgQy1WTEFOIFRQSUQgKi8KKyAgICAgICAgICAgIGJjbW9zX2Jvb2wgaW5zZXJ0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVXNlIHRoaXMgVFBJRCB3aGVuIGluc2VydGluZyBDLVZMQU4gdGFncyAqLworICAgICAgICB9IGFsdF9jdmxhbl9ldGhlcnR5cGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IHRwaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQWx0ZXJuYXRlIFMtVkxBTiBUUElEICovCisgICAgICAgICAgICBiY21vc19ib29sIGluc2VydDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFVzZSB0aGlzIFRQSUQgd2hlbiBpbnNlcnRpbmcgUy1WTEFOIHRhZ3MgKi8KKyAgICAgICAgfSBhbHRfc3ZsYW5fZXRoZXJ0eXBlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBsaW1pdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRoZSBtYXhpbXVtIG51bWJlciBvZiBicm9hZGNhc3QgcGFja2V0cyBhbGxvd2VkIGZyb20gRXRoZXJuZXQgcG9ydCAxIGluIDEgc2Vjb25kLiAqLworICAgICAgICB9IGJjX3JhdGVfbGltaXQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90cmFmZmljX2JpdG1hcCB0cmFmZmljX3R5cGVzOyAgIC8qKjwgVHJhZmZpYyBUeXBlcy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9yYXRlX3VuaXRzIHJhdGVfdW5pdHM7ICAgICAgICAgIC8qKjwgUmF0ZSBVbml0cy4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbnVtYmVyX29mX3NoYXBlcnM7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIFNoYXBlcnMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9zaGFwZXIgKnNoYXBlcnM7ICAgICAgICAgICAvKio8IFNoYXBlcnMuICovCisgICAgICAgIH0gZWdyZXNzX3NoYXBpbmc7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9yYXRlX3VuaXRzIHJhdGVfdW5pdHM7ICAgICAgICAgIC8qKjwgUmF0ZSBVbml0cy4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbnVtYmVyX29mX3JhdGVfbGV2ZWxzOyAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIFJhdGUgTGV2ZWxzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmF0ZV9sZXZlbCAqcmF0ZV9sZXZlbHM7ICAgLyoqPCBSYXRlIExldmVscy4gKi8KKyAgICAgICAgfSBpbmdyZXNzX3BvbGljaW5nOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9mZWNfbW9kZSByeF9kb3duOyAgICAgICAgICAvKio8IFJ4L0Rvd24uICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9mZWNfbW9kZSB0eF91cDsgICAgICAgICAgICAvKio8IFR4L1VwLiAqLworICAgICAgICB9IGZlY19tb2RlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBtYW5fbmFtZV9jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBtYW5fbmFtZS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKm1hbl9uYW1lOyAgICAgICAgICAgICAgICAgIC8qKjwgTWFuIE5hbWUuICovCisgICAgICAgIH0gbWZyX25hbWU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgY29kZV9hY2Nlc3Nfc3RhcnRbMTNdOyAgICAgIC8qKjwgQ29kZSBBY2Nlc3MgU3RhcnQuICovCisgICAgICAgICAgICB1aW50OF90IGN2Y19hY2Nlc3Nfc3RhcnRbMTNdOyAgICAgICAvKio8IENWQyBBY2Nlc3MgU3RhcnQuICovCisgICAgICAgIH0gZndhcmVfbWZnX3RpbWVfdmFyX2N0cmw7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHZlbmRvcl9uYW1lX2NvdW50OyAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHZlbmRvcl9uYW1lLiAqLworICAgICAgICAgICAgdWludDhfdCAqdmVuZG9yX25hbWU7ICAgICAgICAgICAgICAgLyoqPCBPTlUgVmVuZG9yIE5hbWUgKi8KKyAgICAgICAgfSB2ZW5kb3JfbmFtZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgbW9kZWxfbnVtYmVyX2NvdW50OyAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gbW9kZWxfbnVtYmVyLiAqLworICAgICAgICAgICAgdWludDhfdCAqbW9kZWxfbnVtYmVyOyAgICAgICAgICAgICAgLyoqPCBPTlUgTW9kZWwgTnVtYmVyICovCisgICAgICAgIH0gbW9kZWxfbnVtYmVyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBod192ZXJzaW9uX2NvdW50OyAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBod192ZXJzaW9uLiAqLworICAgICAgICAgICAgdWludDhfdCAqaHdfdmVyc2lvbjsgICAgICAgICAgICAgICAgLyoqPCBPTlUgSGFyZHdhcmUgVmVyc2lvbiAqLworICAgICAgICB9IGh3X3ZlcnNpb247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGN1cnJlbnRfdGVtcGVyYXR1cmVfY291bnQ7IC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIGN1cnJlbnRfdGVtcGVyYXR1cmUuICovCisgICAgICAgICAgICB1aW50MTZfdCAqY3VycmVudF90ZW1wZXJhdHVyZTsgICAgICAvKio8IEN1cnJlbnQgVGVtcGVyYXR1cmUuICovCisgICAgICAgIH0gb3B0X21vbl90ZW1wZXJhdHVyZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgY3VycmVudF92Y2NfY291bnQ7ICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gY3VycmVudF92Y2MuICovCisgICAgICAgICAgICB1aW50MTZfdCAqY3VycmVudF92Y2M7ICAgICAgICAgICAgICAvKio8IEN1cnJlbnQgVmNjLiAqLworICAgICAgICB9IG9wdF9tb25fdmNjOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBjdXJyZW50X3R4X2JpYXNfY291bnQ7ICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBjdXJyZW50X3R4X2JpYXMuICovCisgICAgICAgICAgICB1aW50MTZfdCAqY3VycmVudF90eF9iaWFzOyAgICAgICAgICAvKio8IEN1cnJlbnQgVHggQmlhcy4gKi8KKyAgICAgICAgfSBvcHRfbW9uX3R4X2JpYXM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGN1cnJlbnRfdHhfcG93ZXJfY291bnQ7ICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIGN1cnJlbnRfdHhfcG93ZXIuICovCisgICAgICAgICAgICB1aW50MTZfdCAqY3VycmVudF90eF9wb3dlcjsgICAgICAgICAvKio8IEN1cnJlbnQgVHggUG93ZXIuICovCisgICAgICAgIH0gb3B0X21vbl90eF9wb3dlcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgY3VycmVudF9yeF9wb3dlcl9jb3VudDsgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gY3VycmVudF9yeF9wb3dlci4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90ICpjdXJyZW50X3J4X3Bvd2VyOyAgICAgICAgIC8qKjwgQ3VycmVudCBSeCBQb3dlci4gKi8KKyAgICAgICAgfSBvcHRfbW9uX3J4X3Bvd2VyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCByeF91bmljYXN0X2ZyYW1lczsgICAgICAgICAvKio8IFJ4IFVuaWNhc3QgRnJhbWVzLiAqLworICAgICAgICB9IHJ4X3VuaWNhc3RfZnJhbWVzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB0eF91bmljYXN0X2ZyYW1lczsgICAgICAgICAvKio8IFR4IFVuaWNhc3QgRnJhbWVzLiAqLworICAgICAgICB9IHR4X3VuaWNhc3RfZnJhbWVzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCByeF9mcmFtZXNfdG9vX3Nob3J0OyAgICAgICAvKio8IFJ4IEZyYW1lcyBUb28gU2hvcnQuICovCisgICAgICAgIH0gcnhfZnJhbWVfdG9vX3Nob3J0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCByeF9mcmFtZXM2NDsgICAgICAgICAgICAgICAvKio8IFJ4IEZyYW1lcyA2NC4gKi8KKyAgICAgICAgfSByeF9mcmFtZTY0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCByeF9mcmFtZXM2NTEyNzsgICAgICAgICAgICAvKio8IFJ4IEZyYW1lcyA2NV8xMjcuICovCisgICAgICAgIH0gcnhfZnJhbWU2NTEyNzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgcnhfZnJhbWVzMTI4MjU1OyAgICAgICAgICAgLyoqPCBSeCBGcmFtZXMgMTI4XzI1NS4gKi8KKyAgICAgICAgfSByeF9mcmFtZTEyODI1NTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgcnhfZnJhbWVzMjU2NTExOyAgICAgICAgICAgLyoqPCBSeCBGcmFtZXMgMjU2XzUxMS4gKi8KKyAgICAgICAgfSByeF9mcmFtZTI1NjUxMTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgcnhfZnJhbWVzNTEyMTAyMzsgICAgICAgICAgLyoqPCBSeCBGcmFtZXMgNTEyXzEwMjMuICovCisgICAgICAgIH0gcnhfZnJhbWU1MTIxMDIzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCByeF9mcmFtZXMxMDI0MTUxODsgICAgICAgICAvKio8IFJ4IEZyYW1lcyAxMDI0XzE1MTguICovCisgICAgICAgIH0gcnhfZnJhbWUxMDI0MTUxODsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgcnhfZnJhbWVzMTUxOXBsdXM7ICAgICAgICAgLyoqPCBSeCBGcmFtZXMgMTUxOSBQbHVzLiAqLworICAgICAgICB9IHJ4X2ZyYW1lMTUxOXBsdXM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHR4X2ZyYW1lczY0OyAgICAgICAgICAgICAgIC8qKjwgVHggRnJhbWVzIDY0LiAqLworICAgICAgICB9IHR4X2ZyYW1lNjQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHR4X2ZyYW1lczY1MTI3OyAgICAgICAgICAgIC8qKjwgVHggRnJhbWVzIDY1XzEyNy4gKi8KKyAgICAgICAgfSB0eF9mcmFtZTY1MTI3OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB0eF9mcmFtZXMxMjgyNTU7ICAgICAgICAgICAvKio8IFR4IEZyYW1lcyAxMjhfMjU1LiAqLworICAgICAgICB9IHR4X2ZyYW1lMTI4MjU1OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB0eF9mcmFtZXMyNTY1MTE7ICAgICAgICAgICAvKio8IFR4IEZyYW1lcyAyNTZfNTExLiAqLworICAgICAgICB9IHR4X2ZyYW1lMjU2NTExOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB0eF9mcmFtZXM1MTIxMDIzOyAgICAgICAgICAvKio8IFR4IEZyYW1lcyA1MTJfMTAyMy4gKi8KKyAgICAgICAgfSB0eF9mcmFtZTUxMjEwMjM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHR4X2ZyYW1lczEwMjQxNTE4OyAgICAgICAgIC8qKjwgVHggRnJhbWVzIDEwMjRfMTUxOC4gKi8KKyAgICAgICAgfSB0eF9mcmFtZTEwMjQxNTE4OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB0eF9mcmFtZXMxNTE5cGx1czsgICAgICAgICAvKio8IFR4IEZyYW1lcyAxNTE5IFBsdXMuICovCisgICAgICAgIH0gdHhfZnJhbWUxNTE5cGx1czsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBxdWV1ZV9kZWxheV90aHJlc2hvbGQ7ICAgICAgLyoqPCBRdWV1ZSBEZWxheSBUaHJlc2hvbGQuICovCisgICAgICAgIH0gcXVldWVfZGVsYXlfdGhyZXNoOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCBxdWV1ZV9kZWxheTsgICAgICAgICAgICAgICAvKio8IFF1ZXVlIERlbGF5IC4gKi8KKyAgICAgICAgfSBxdWV1ZV9kZWxheTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgZnJhbWVzX2Ryb3BwZWQ7ICAgICAgICAgICAgLyoqPCBGcmFtZXMgRHJvcHBlZC4gKi8KKyAgICAgICAgfSBmcmFtZXNfZHJvcHBlZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgYnl0ZXNfZHJvcHBlZDsgICAgICAgICAgICAgLyoqPCBCeXRlcyBEcm9wcGVkLiAqLworICAgICAgICB9IGJ5dGVzX2Ryb3BwZWQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IGJ5dGVzX2RlbGF5ZWQ7ICAgICAgICAgICAgIC8qKjwgQnl0ZXMgRGVsYXllZC4gKi8KKyAgICAgICAgfSBieXRlc19kZWxheWVkOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB0eF9ieXRlc191bnVzZWQ7ICAgICAgICAgICAvKio8IFR4IEJ5dGVzIFVudXNlZC4gKi8KKyAgICAgICAgfSB0eF9ieXRlc191bnVzZWQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHBvcnRfdHlwZV9jb3VudDsgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHBvcnRfdHlwZS4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX3BvcnRfdHlwZSAqcG9ydF90eXBlOyAgLyoqPCBQb3J0IFR5cGUuICovCisgICAgICAgIH0gZG9udV9wb3J0X3R5cGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGRlZl9jb3VudDsgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gZGVmLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXZlbnRfb3B0aW9ucyAqZGVmOyAgICAgICAgICAgICAgICAgICAgLyoqPCBEZWZhdWx0LiAqLworICAgICAgICB9IHN1c3BlbmRfcmVzdW1lX2FsYXJtX3JlcG9ydGluZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaXBtY19mb3J3YXJkaW5nX2ZsYWdzIGZpZWxkX2JpdG1hcDsgICAgLyoqPCBGaWVsZCBCaXRtYXAuICovCisgICAgICAgIH0gaXBtY19mb3J3YXJkaW5nX3J1bGVfY29uZmlndXJhdGlvbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgYWx0ZXJuYXRlX2l0cGlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEFsdGVybmF0ZSBJLVRQSUQuICovCisgICAgICAgICAgICBiY21vc19ib29sIGluc2VydF90aGlzX3RwaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgSW5zZXJ0IFRoaXMgVFBJRC4gKi8KKyAgICAgICAgfSBpdHBpZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgYWx0ZXJuYXRlX2J0cGlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEFsdGVybmF0ZSBCLVRQSUQuICovCisgICAgICAgICAgICBiY21vc19ib29sIGluc2VydF90aGlzX3RwaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgSW5zZXJ0IFRoaXMgVFBJRC4gKi8KKyAgICAgICAgfSBidHBpZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgY29tbWl0ZWRfYnVyc3Rfc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IDI1NiBCeXRlcyAqLworICAgICAgICAgICAgdWludDMyX3QgY29tbWl0ZWRfaW5mb3JtYXRpb25fcmF0ZTsgICAgICAgICAgICAgICAgICAgICAvKio8IDEgS2JwcyAqLworICAgICAgICB9IHF1ZXVlX2NpcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgZXhjZXNzX2J1cnN0X3NpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IDI1NiBCeXRlcyAqLworICAgICAgICAgICAgdWludDMyX3QgcXVldWVfZWlyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IDEgS2JwcyAqLworICAgICAgICB9IHF1ZXVlX2VpcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfYm9vbCBlbmFibGVfY29sb3JfbWFya2luZzsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEVuYWJsZSBDb2xvciBNYXJraW5nLiAqLworICAgICAgICAgICAgdWludDhfdCBmaWVsZF9jb2RlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEZpZWxkIENvZGUuICovCisgICAgICAgICAgICB1aW50OF90IGZpZWxkX2luc3RhbmNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRmllbGQgSW5zdGFuY2UuICovCisgICAgICAgICAgICB1aW50OF90IG1zYl9tYXNrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTVNCIE1hc2suICovCisgICAgICAgICAgICB1aW50OF90IGxzYl9tYXNrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTFNCIE1hc2suICovCisgICAgICAgICAgICB1aW50OF90IGdyZWVuX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgR3JlZW4gVmFsdWUuICovCisgICAgICAgICAgICB1aW50OF90IHllbGxvd192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgWWVsbG93IFZhbHVlLiAqLworICAgICAgICB9IHF1ZXVlX2NvbG9yX21hcmtpbmc7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IG51bWJlcl9vZl9yYXRlX2xpbWl0ZXJzOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgT2YgUmF0ZSBMaW1pdGVycy4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGNic19taW5faW5jcmVtZW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBDQlMgTWluIEluY3JlbWVudC4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGNpcl9taW5faW5jcmVtZW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBDSVIgTWluIEluY3JlbWVudC4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGVic19taW5faW5jcmVtZW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBFQlMgTWluIEluY3JlbWVudC4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGVpcl9taW5faW5jcmVtZW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBFSVIgTWluIEluY3JlbWVudC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgY29sb3JfYXdhcmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBDb2xvciBBd2FyZS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgY291cGxpbmdfY29uZmlndXJhYmxlOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBDb3VwbGluZyBDb25maWd1cmFibGUuICovCisgICAgICAgICAgICB1aW50OF90IGNvdXBsaW5nX2JlaGF2aXJvX2RlZmF1bHQ7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQ291cGxpbmcgQmVoYXZpcm8gRGVmYXVsdC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgY29sb3JfbWFya2luZ19zdXBwb3J0OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBDb2xvciBNYXJraW5nIFN1cHBvcnQuICovCisgICAgICAgICAgICB1aW50OF90IHNtYXJ0X2NvbG9yX2Ryb3A7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgU21hcnQgQ29sb3IgRHJvcC4gKi8KKyAgICAgICAgfSBxdWV1ZV9yYXRlX2xpbWl0ZXJfY2FwYWJpbGl0aWVzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGNvdXBsaW5nX2ZsYWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQ291cGxpbmcgRmxhZy4gKi8KKyAgICAgICAgfSBjb3VwbGluZ19mbGFnOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19ib29sIHBwc19wdWxzZV9zdXBwb3J0OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgMVBQUyBQdWxzZSBTdXBwb3J0LiAqLworICAgICAgICAgICAgYmNtb3NfYm9vbCB0b2Rfc3RyaW5nX3N1cHBvcnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRPRCBTdHJpbmcgU3VwcG9ydC4gKi8KKyAgICAgICAgICAgIGJjbW9zX2Jvb2wgdjJmcmFtZV9zdXBwb3J0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBbMTU4OHYyXSBGcmFtZSBTdXBwb3J0LiAqLworICAgICAgICB9IGNsb2NrX3RyYW5zcG9ydF9jYXBhYmlsaXRpZXM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX2Jvb2wgcHBzX3B1bHNlX291dHB1dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCAxIFBQUyBQdWxzZSBPdXRwdXQuICovCisgICAgICAgICAgICBiY21vc19ib29sIHRvZF9zdHJpbmdfb3V0cHV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVE9EIFN0cmluZyBPdXRwdXQuICovCisgICAgICAgICAgICBiY21vc19ib29sIHYyZnJhbWVfb3V0cHV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgWzE1ODh2Ml0gRnJhbWUgT3V0cHV0LiAqLworICAgICAgICB9IGVuYWJsZV9jbG9ja190cmFuc3BvcnQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IG1wY3BfcmVmZXJlbmNlX3BvaW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBNUENQIFJlZmVyZW5jZSBQb2ludC4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IHRvZF9zdHJpbmdfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdG9kX3N0cmluZy4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnRvZF9zdHJpbmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUT0QgU3RyaW5nLiAqLworICAgICAgICB9IHRpbWVfdHJhbnNmZXI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IG5kb3duOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOZG93bi4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IG51cDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdXAuICovCisgICAgICAgIH0gcHJvcGFnYXRpb25fcGFyYW1ldGVyczsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgcnR0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFJUVC4gKi8KKyAgICAgICAgfSBydHQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHN0YWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBTLVRBRy4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IGN0YWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBDLVRBRy4gKi8KKyAgICAgICAgfSBkYWNfY29uZmlndXJhdGlvbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfYm9vbCBsbGRwX2luc3RhbmNlX3N0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IExMRFAgSW5zdGFuY2UgU3RhdHVzLiAqLworICAgICAgICB9IGRhY19jb25maWd1cmF0aW9uX2VuYWJsZV9kaXNhYmxlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCByeF9icm9hZGNhc3RfZnJhbWVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUnggQnJvYWRjYXN0IEZyYW1lcy4gKi8KKyAgICAgICAgfSByeF9mcmFtZV9icm9hZGNhc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHR4X2Jyb2FkY2FzdF9mcmFtZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUeCBCcm9hZGNhc3QgRnJhbWVzLiAqLworICAgICAgICB9IHR4X2ZyYW1lc19icm9hZGNhc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHR4X211bHRpY2FzdF9mcmFtZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUeCBNdWx0aWNhc3QgRnJhbWVzLiAqLworICAgICAgICB9IHR4X2ZyYW1lc19tdWx0aWNhc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHJ4X211bHRpY2FzdF9mcmFtZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBSeCBNdWx0aWNhc3QgRnJhbWVzLiAqLworICAgICAgICB9IHJ4X2ZyYW1lc19tdWx0aWNhc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHR4X2J5dGVzX2dyZWVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUeCBCeXRlcyBHcmVlbi4gKi8KKyAgICAgICAgfSB0eF9ieXRlc19ncmVlbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgcnhfYnl0ZXNfZ3JlZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFJ4IEJ5dGVzIEdyZWVuLiAqLworICAgICAgICB9IHJ4X2J5dGVzX2dyZWVuOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdTE2X2xpc3RfdTggbGxpZF92YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgTExJRCBWYWx1ZS4gKi8KKyAgICAgICAgfSBvbnVfbWNhc3RfbGxpZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgbWFjX2FkZHJlc3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE1hYyBBZGRyZXNzLiAqLworICAgICAgICAgICAgdWludDhfdCB1bmlfcG9ydDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFVuaSBQb3J0LiAqLworICAgICAgICB9IHVuaV9tYWNfbGVhcm5lZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfYm9vbCBvdmVyX3dyaXRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IDA6IERpc2NhcmQ7IDE6IE92ZXJ3cml0ZSAqLworICAgICAgICB9IHVuaV9tYWNfdGFibGVfZnVsbF9iZWhhdmlvcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcG93ZXJfc2F2aW5nX21vZGUgcHdyX3NhdmluZ19tb2RlOyAvKio8IFB3ciBTYXZpbmcgTW9kZS4gKi8KKyAgICAgICAgICAgIGJjbW9zX2Jvb2wgZWFybHlfd2FrZV91cF9zdXBwb3J0OyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBFYXJseSBXYWtlIFVwIFN1cHBvcnQuICovCisgICAgICAgICAgICB1aW50OF90IHZlbl9zcGVjX2ZpZWxkX3NpemU7ICAgIC8qKjwgVmVuIFNwZWMgRmllbGQgU2l6ZS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnZlbl9zcGVjX2ZpZWxkOyAgICAgICAgLyoqPCBWZW4gU3BlYyBGaWVsZCAuICovCisgICAgICAgIH0gb251X3B3cl9zYXZpbmdfY2FwOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2U7CisKKy8qKiBEUG9FIEF0dHJpYnV0ZSBWYWx1ZSBNQUMgVGFibGUuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfbWFjX3RhYmxlCit7CisgICAgdWludDMyX3QgbWFjX2FkZHJlc3NfY291bnQ7ICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBtYWNfYWRkcmVzcy4gKi8KKyAgICBiY21vc19tYWNfYWRkcmVzcyAqbWFjX2FkZHJlc3M7IC8qKjwgTUFDIEFkZHJlc3MuICovCit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9tYWNfdGFibGU7CisKKy8qKiBEUG9FIEV2ZW50IEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ldmVudF9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYWxhcm1fY29kZSBldmVudF9jb2RlOyAvKio8IEV2ZW50IENvZGUuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19ib29sIHJhaXNlZDsgICAgICAgICAgICAgICAgICAvKio8IFJhaXNlZC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF90eXBlIG9iamVjdF90eXBlOyAgIC8qKjwgT2JqZWN0IFR5cGUuICovCisgICAgICAgICAgICB1aW50MTZfdCBvYmplY3RfaW5zdGFuY2U7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IE9iamVjdCBJbnN0YW5jZS4gKi8KKyAgICAgICAgfSBkZWY7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX2Jvb2wgcmFpc2VkOyAgLyoqPCBSYWlzZWQuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfdHlwZSBvYmplY3RfdHlwZTsgICAvKio8IE9iamVjdCBUeXBlLiAqLworICAgICAgICAgICAgdWludDE2X3Qgb2JqZWN0X2luc3RhbmNlOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBPYmplY3QgSW5zdGFuY2UuICovCisgICAgICAgICAgICB1aW50OF90IHN0YXRfYnJhbmNoOyAgICAvKio8IFN0YXQgQnJhbmNoLiAqLworICAgICAgICAgICAgdWludDE2X3Qgc3RhdF9sZWFmOyAgICAgLyoqPCBTdGF0IExlYWYuICovCisgICAgICAgIH0gc3RhdGlzdGljc19hbGFybTsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X2Jhc2U7CisKKy8qKiBEUG9FIEZpbGUgVHJhbnNmZXIgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfYmFzZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfb3Bjb2RlIG9wY29kZTsgICAvKio8IE9wY29kZS4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHlwZSBmaWxlX3R5cGU7ICAgLyoqPCBGaWxlIFR5cGUuICovCisgICAgICAgIH0gZmlsZV9yZWFkOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBmaWxlbmFtZV9jb3VudDsgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIGZpbGVuYW1lLiAqLworICAgICAgICAgICAgdWludDhfdCAqZmlsZW5hbWU7ICAvKio8IEZpbGVuYW1lLiAqLworICAgICAgICB9IGZpbGVfd3JpdGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGJsb2NrOyAgICAgLyoqPCBCbG9jay4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGxlbmd0aDsgICAgLyoqPCBMZW5ndGguICovCisgICAgICAgICAgICB1aW50OF90ICpkYXRhOyAgICAgIC8qKjwgRGF0YS4gKi8KKyAgICAgICAgfSBmaWxlX2RhdGE7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGJsb2NrOyAgICAgLyoqPCBCbG9jay4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfZXJyb3IgZXJyb3I7IC8qKjwgRXJyb3IuICovCisgICAgICAgIH0gZmlsZV9hY2s7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Jhc2U7CisKKy8qKiBEUG9FIEluZm8gVExWLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaW5mb190bHYKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9pbmZvX3Rsdl90eXBlIHR5cGU7ICAgIC8qKjwgVHlwZS4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgZHBvZV9vYW1fdmVyc2lvbjsgICAgICAgICAgIC8qKjwgRFBvRSBPQU0gVmVyc2lvbi4gKi8KKyAgICAgICAgfSBkcG9lX29hbV9zdXBwb3J0OworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaW5mb190bHY7CisKKy8qKiBBIHN0cnVjdHVyZSBjb250YWluaW5nIGEgbnVtZXJpYyA4LWJpdCB2YWx1ZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV91OHZhbHVlCit7CisgICAgdWludDhfdCB2YWx1ZTsgIC8qKjwgQW4gOC1iaXQgbnVtZXJpYyB2YWx1ZS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3U4dmFsdWU7CisKKy8qKiBBIHN0cnVjdHVyZSBjb250YWluaW5nIGEgbnVtZXJpYyA2NC1iaXQgdmFsdWUuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUKK3sKKyAgICB1aW50NjRfdCB2YWx1ZTsgLyoqPCBBIDY0LWJpdCBudW1lcmljIHZhbHVlLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWU7CisKKy8qKiBTdGQgQXR0cmlidXRlIFZhbHVlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdHRyaWJ1dGVfdmFsdWUKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlIGxlYWY7ICAgIC8qKjwgTGVhZi4gKi8KKyAgICB1aW50OF90IHdpZHRoOyAgLyoqPCBXaWR0aC4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV91OHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1hY19pZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX2ZyYW1lc190eF9vazsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX3NpbmdsZV9jb2xsX2ZyYW1lczsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX211bHRpcGxlX2NvbGxfZnJhbWVzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBtYWNfZnJhbWVzX3J4X29rOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBtYWNfZmNzX2VycjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX2FsaWduX2VycjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX29jdGV0c190eF9vazsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U4dmFsdWUgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX2ZyYW1lc19kZWZlcnJlZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX2xhdGVfY29sbGlzaW9uczsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX2V4Y2Vzc2l2ZV9jb2xsaXNpb25zOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBtYWNfZnJhbWVzX2xvc3RfbWFjX3R4X2VycjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U4dmFsdWUgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX2NhcnJpZXJfc2Vuc2VfZXJyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBtYWNfb2N0ZXRzX3J4X29rOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBtYWNfZnJhbWVzX2xvc3RfbWFjX3J4X2VycjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX21jYXN0X2ZyYW1lc190eF9vazsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX2JjYXN0X2ZyYW1lc190eF9vazsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U4dmFsdWUgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX2ZyX2V4Y2Vzc2l2ZV9kZWZlcnJhbDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX21jYXN0X2ZyYW1lc19yeF9vazsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX2JjYXN0X2ZyYW1lc19yeF9vazsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX2luX3JhbmdlX2xlbl9lcnI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZSB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1hY19vdXRfb2ZfcmFuZ2VfbGVuX2VycjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX2ZyYW1lX3Rvb19sb25nOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19ib29sIHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBTdGF0dXMuICovCisgICAgICAgIH0gbWFjX2VuYWJsZV9zdGF0dXM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzIG1hY19hZGRyZXNzOyAgICAgICAgICAgICAgICAgICAgICAvKio8IE1BQyBBZGRyZXNzLiAqLworICAgICAgICB9IG1hY19hZGRyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fc3RkX3BoeV90eXBlIHR5cGU7ICAgICAgICAgICAgICAgICAgLyoqPCBUeXBlLiAqLworICAgICAgICB9IHBoeV90eXBlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBwaHlfc3ltYm9sX2Vycl9kdXJpbmdfY2FycmllcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9zdGF0ZSBzdGF0ZTsgICAgICAgICAgICAgICAgICAgIC8qKjwgU3RhdGUuICovCisgICAgICAgIH0gcGh5X2FkbWluX3N0YXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fbWF1X21lZGlhX2F2YWlsYWJsZSB2YWx1ZTsgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBtYXVfbWVkaWFfYXZhaWw7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV91OHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGF1dG9fbmVnX2lkOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYXV0b25lZ290aWF0ZV9hZG1pbl9zdGF0ZSB2YWx1ZTsgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBhdXRvX25lZ19hZG1pbl9zdGF0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2F1dG9fcmVtb3RlX3NpZyB2YWx1ZTsgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gYXV0b19uZWdfcmVtb3RlX3NpZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2F1dG9fbmVnb3RpYXRpb25fYXV0b19jb25maWcgdmFsdWU7IC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gYXV0b19uZWdfYXV0b19jZmc7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGNhcGFiaWxpdGllc19jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBjYXBhYmlsaXRpZXMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fc3RkX2F1dG9fbmVnb2l0YXRpb25fY2FwYWJpbGl0eSAqY2FwYWJpbGl0aWVzOyAgLyoqPCBDYXBhYmlsaXRpZXMuICovCisgICAgICAgIH0gYXV0b19uZWdfbG9jYWxfdGVjaF9hYmlsaXR5OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBjYXBhYmlsaXRpZXNfY291bnQ7ICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIGNhcGFiaWxpdGllcy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9zdGRfYXV0b19uZWdvaXRhdGlvbl9jYXBhYmlsaXR5ICpjYXBhYmlsaXRpZXM7ICAvKio8IENhcGFiaWxpdGllcy4gKi8KKyAgICAgICAgfSBhdXRvX25lZ19hZHZlcnRpc2VkX3RlY2hfYWJpbGl0eTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgY2FwYWJpbGl0aWVzX2NvdW50OyAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBjYXBhYmlsaXRpZXMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fc3RkX2F1dG9fbmVnb2l0YXRpb25fY2FwYWJpbGl0eSAqY2FwYWJpbGl0aWVzOyAgLyoqPCBDYXBhYmlsaXRpZXMuICovCisgICAgICAgIH0gYXV0b19uZWdfcnhfdGVjaDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2F1dG9fc2VsZWN0b3IgdmFsdWU7ICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGF1dG9fbmVnX2xvY2FsX3NlbGVjdF9hYmxlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYXV0b19zZWxlY3RvciB2YWx1ZTsgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gYXV0b19uZWdfYWRfc2VsZWN0X2FibGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9hdXRvX3NlbGVjdG9yIHZhbHVlOyAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBhdXRvX25lZ19yeF9zZWxlY3RfYWJsZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX21hY19kdXBsZXhfc3RhdHVzIHZhbHVlOyAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1hY19kdXBsZXhfc3RhdHVzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBmdW5jdGlvbnNfY291bnQ7ICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIGZ1bmN0aW9ucy4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90ICpmdW5jdGlvbnM7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBGdW5jdGlvbnMuICovCisgICAgICAgIH0gbWFjX2N0cmxfZnVuY3Nfc3VwcG9ydGVkOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgdmFsdWU7ICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX2N0cmxfZnJhbWVzX3R4OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgdmFsdWU7ICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX2N0cmxfZnJhbWVzX3J4OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgdmFsdWU7ICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX2N0cmxfdW5zdXBwb3J0ZWRfb3Bfcng7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZSB2YWx1ZTsgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBtYWNfY3RybF9wYXVzZV9kZWxheTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1hY19jdHJsX3BhdXNlX3R4OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgdmFsdWU7ICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX2N0cmxfcGF1c2Vfcng7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZSB2YWx1ZTsgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBvYW1fbG9jYWxfZXJyX2ZyYW1lX3NlY3NfZXZlbnQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZSB2YWx1ZTsgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBvYW1fbG9jYWxfZXJyX2ZyYW1lX3BlcmlvZF9ldmVudDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG9hbV9sb2NhbF9lcnJfZnJfc2VjX3N1bV9ldmVudDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG9hbV9lbXVsX2NyYzhlcnI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZSB2YWx1ZTsgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBtcGNwX21hY19jdHJsX2ZyYW1lc190eDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1wY3BfbWFjX2N0cmxfZnJhbWVzX3J4OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgdmFsdWU7ICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbXBjcF9kaXNjb3Zlcnlfd2luZG93X3R4OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgdmFsdWU7ICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbXBjcF9kaXNjb3ZlcnlfdGltZW91dDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBmZWNfY29ycmVjdGVkX2Jsb2NrczsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBmZWNfdW5jb3JyZWN0YWJsZV9ibG9ja3M7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9mZWNfc3VwcG9ydCB2YWx1ZTsgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gZmVjX2FiaWxpdHk7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9zdGRfZmVjX21vZGUgdmFsdWU7IC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gZmVjX21vZGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZSB2YWx1ZTsgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbXBjcF90eF9nYXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgdmFsdWU7ICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1wY3BfdHhfcmVnX2FjazsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBtcGNwX3R4X3JlZ2lzdGVyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgdmFsdWU7ICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1wY3BfdHhfcmVnX3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZSB2YWx1ZTsgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbXBjcF90eF9yZXBvcnQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZSB2YWx1ZTsgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbXBjcF9yeF9nYXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgdmFsdWU7ICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1wY3BfcnhfcmVnX2FjazsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlIHZhbHVlOyAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBtcGNwX3J4X3JlZ2lzdGVyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgdmFsdWU7ICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1wY3BfcnhfcmVnX3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZSB2YWx1ZTsgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbXBjcF9yeF9yZXBvcnQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbWFjX2NvbGxpc2lvbl9mcmFtZXM7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fc3RkX2F0dHJpYnV0ZV92YWx1ZTsKKworLyoqIFN0ZCBBY3Rpb24gVmFsdWUgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9zdGRfYWN0aW9uX3ZhbHVlX2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uIGxlYWY7ICAgLyoqPCBMZWFmLiAqLworICAgIHVpbnQ4X3Qgd2lkdGg7ICAvKio8IFdpZHRoLiAqLworfSBiY21vbHRfZXBvbl9vYW1fc3RkX2FjdGlvbl92YWx1ZV9iYXNlOworCisvKiogRFBvRSBWYXIgQ29udGFpbmVyIEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9icmFuY2ggYnJhbmNoOyAvKio8IEJyYW5jaC4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGxlYWY7ICAgICAgICAgICAgICAvKio8IExlYWYuICovCisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgfSBkZWY7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2Ugb2JqZWN0X2NvbnRleHQ7ICAgIC8qKjwgT2JqZWN0IENvbnRleHQuICovCisgICAgICAgIH0gb2JqZWN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fc3RkX2F0dHJpYnV0ZV92YWx1ZSBhdHRyaWJ1dGU7ICAgICAgICAgICAgICAvKio8IEF0dHJpYnV0ZS4gKi8KKyAgICAgICAgfSBzdGFuZGFyZF9hdHRyaWJ1dGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9zdGRfYWN0aW9uX3ZhbHVlX2Jhc2UgYWN0aW9uOyAgICAgICAgICAgICAgIC8qKjwgQWN0aW9uLiAqLworICAgICAgICB9IHN0YW5kYXJkX2FjdGlvbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2UgYXR0cmlidXRlOyAgICAgICAgLyoqPCBBdHRyaWJ1dGUuICovCisgICAgICAgIH0gZXh0ZW5kZWRfYXR0cmlidXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9hY3Rpb25fdmFsdWVfYmFzZSBhY3Rpb247ICAgICAgICAgICAgICAvKio8IEFjdGlvbi4gKi8KKyAgICAgICAgfSBleHRlbmRlZF9hY3Rpb247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHVua25vd25fY291bnQ7IC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHVua25vd24uICovCisgICAgICAgICAgICB1aW50OF90ICp1bmtub3duOyAgICAgICAvKio8IFVua25vd24uICovCisgICAgICAgIH0gZW5kOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlOworCisvKiogRFBvRSBWZW5kb3IgRXh0ZW5kZWQgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb3Bjb2RlIG9wOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgT3AuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCB2YXJzX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHZhcnMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvciAqdmFyczsgIC8qKjwgVmFycy4gKi8KKyAgICAgICAgfSBnZXRfcmVxdWVzdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdmFyc19jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB2YXJzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlICp2YXJzOyAgLyoqPCBWYXJzLiAqLworICAgICAgICB9IGdldF9yZXNwb25zZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdmFyc19jb3VudDsgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdmFycy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZSAqdmFyczsgIC8qKjwgVmFycy4gKi8KKyAgICAgICAgfSBzZXRfcmVxdWVzdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdmFyc19jb3VudDsgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdmFycy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZSAqdmFyczsgICAgICAvKio8IFZhcnMuICovCisgICAgICAgIH0gc2V0X3Jlc3BvbnNlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9yZWdfY29kZSBhY3Rpb25fY29kZTsgICAgLyoqPCBBY3Rpb24gQ29kZS4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IG11bHRpY2FzdF9sbGlkOyAgICAvKio8IE11bHRpY2FzdCBMTElELiAqLworICAgICAgICB9IG1jYXN0X3JlZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfY3RybF9yZXNwX2NvZGUgc3RhdHVzOyAgIC8qKjwgU3RhdHVzLiAqLworICAgICAgICAgICAgdWludDE2X3QgbXVsdGljYXN0X2xsaWQ7ICAgIC8qKjwgTXVsdGljYXN0IExMSUQuICovCisgICAgICAgIH0gbWNhc3RfcmVnX3Jlc3A7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qga2V5X251bWJlcjsgICAgICAgICAvKio8IEtleSBOdW1iZXIuICovCisgICAgICAgICAgICB1aW50OF90IGtleV9sZW5ndGg7ICAgICAgICAgLyoqPCBLZXkgTGVuZ3RoLiAqLworICAgICAgICAgICAgdWludDhfdCAqa2V5X2RhdGE7ICAgICAgICAgIC8qKjwgS2V5IERhdGEuICovCisgICAgICAgIH0ga2V5X2V4Y2hhbmdlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Jhc2UgZmlsZV90cmFuc2ZlcjsgIC8qKjwgRmlsZSBUcmFuc2Zlci4gKi8KKyAgICAgICAgfSBmaWxlX3RyYW5zZmVyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9jdHJsX2FjdGlvbiBhY3Rpb247ICAgICAgICAgIC8qKjwgQWN0aW9uLiAqLworICAgICAgICAgICAgdWludDE2X3QgbGxpZDsgICAgICAgICAgICAgICAgICAvKio8IExMSUQuICovCisgICAgICAgICAgICB1aW50OF90IGlwc2FbMTZdOyAgICAgICAgICAgICAgIC8qKjwgSVAgU0EuICovCisgICAgICAgICAgICB1aW50OF90IGlwZGFbMTZdOyAgICAgICAgICAgICAgIC8qKjwgSVAgREEuICovCisgICAgICAgICAgICBiY21vc19tYWNfYWRkcmVzcyBjbGllbnRfbWFjOyAgIC8qKjwgQ2xpZW50IE1hYy4gKi8KKyAgICAgICAgfSBkeW5hbWljX2lwbWNhc3RfY3RybDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfY3RybF9yZXNwX2NvZGUgcmVzdWx0X2NvZGU7ICAvKio8IFJlc3VsdCBDb2RlLiAqLworICAgICAgICB9IGR5bmFtaWNfaXBtY2FzdF9jdHJsX3Jlc3A7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X2N0cmxfYWN0aW9uIGFjdGlvbjsgICAgICAgICAgLyoqPCBBY3Rpb24uICovCisgICAgICAgICAgICB1aW50MTZfdCBsbGlkOyAgICAgIC8qKjwgTExJRC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgaXBzYVsxNl07ICAgLyoqPCBJUCBTQS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgaXBkYVsxNl07ICAgLyoqPCBJUCBEQS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgcG9ydDsgICAgICAgLyoqPCBQb3J0LiAqLworICAgICAgICB9IHN0YXRpY19pcG1jYXN0X2N0cmw7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X2N0cmxfcmVzcF9jb2RlIHJlc3VsdF9jb2RlOyAgLyoqPCBSZXN1bHQgQ29kZS4gKi8KKyAgICAgICAgfSBzdGF0aWNfaXBtY2FzdF9jdHJsX3Jlc3A7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZTsKKworLyoqIFRMUyBWZXJzaW9uLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX3Rsc192ZXJzaW9uCit7CisgICAgdWludDhfdCBtYWpvcjsgIC8qKjwgTWFqb3IuICovCisgICAgdWludDhfdCBtaW5vcjsgIC8qKjwgTWlub3IuICovCit9IGJjbW9sdF9lcG9uX29hbV90bHNfdmVyc2lvbjsKKworLyoqIFRMUyBSYW5kb20uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fdGxzX3JhbmRvbQoreworICAgIHVpbnQzMl90IHVuaXhfdGltZTsgLyoqPCBVbml4IFRpbWUuICovCisgICAgdWludDhfdCByYW5kb21bMjhdOyAvKio8IFJhbmRvbS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rsc19yYW5kb207CisKKy8qKiBUTFMgU2Vzc2lvbiBJRC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV90bHNfc2Vzc2lvbl9pZAoreworICAgIHVpbnQ4X3QgbGVuZ3RoOyAgICAgICAgIC8qKjwgTGVuZ3RoLiAqLworICAgIHVpbnQ4X3QgKnNlc3Npb25faWQ7ICAgIC8qKjwgU2Vzc2lvbiBJRC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rsc19zZXNzaW9uX2lkOworCisvKiogVExTIENpcGhlcnN1aXRlIExpc3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlX2xpc3QKK3sKKyAgICB1aW50MTZfdCBsZW5ndGg7ICAgIC8qKjwgTGVuZ3RoLiAqLworICAgIGJjbW9sdF9lcG9uX29hbV90bHNfY2lwaGVyc3VpdGUgKmNpcGhlcnN1aXRlczsgIC8qKjwgQ2lwaGVyc3VpdGVzLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlX2xpc3Q7CisKKy8qKiBUTFMgQ29tcHJlc3Npb24gTGlzdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV90bHNfY29tcHJlc3Npb25fbGlzdAoreworICAgIHVpbnQ4X3QgbGVuZ3RoOyAvKio8IExlbmd0aC4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX21ldGhvZCAqbWV0aG9kczsgICAgLyoqPCBNZXRob2RzLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX2xpc3Q7CisKKy8qKiBUTFMgQ2VydGlmaWNhdGUgTGlzdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfbGlzdAoreworICAgIHVpbnQzMl90IGNlcnRpZmljYXRlX2xpc3RfY291bnQ7ICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIGNlcnRpZmljYXRlX2xpc3QuICovCisgICAgYmNtb2x0X2Vwb25fb2FtX2NlcnRpZmljYXRlICpjZXJ0aWZpY2F0ZV9saXN0OyAgLyoqPCBDZXJ0aWZpY2F0ZSBMaXN0LiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX2xpc3Q7CisKKy8qKiBUTFMgQ2VydGlmaWNhdGUgVHlwZSBMaXN0LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV90eXBlX2xpc3QKK3sKKyAgICB1aW50OF90IGxlbmd0aDsgLyoqPCBMZW5ndGguICovCisgICAgYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV90eXBlICpjZXJ0aWZpY2F0ZV90eXBlczsgICAgLyoqPCBDZXJ0aWZpY2F0ZSBUeXBlcy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV90eXBlX2xpc3Q7CisKKy8qKiBUTFMgSGFuZHNoYWtlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZV90eXBlIGlkOyAgICAgICAgICAgICAgICAgICAgICAvKio8IElELiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rsc192ZXJzaW9uIHZlcnNpb247ICAgICAgICAgICAgICAgIC8qKjwgVmVyc2lvbi4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90bHNfcmFuZG9tIHJhbmRvbTsgICAgICAgICAgICAgICAgICAvKio8IFJhbmRvbS4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90bHNfc2Vzc2lvbl9pZCBzZXNzaW9uX2lkOyAgICAgICAgICAvKio8IFNlc3Npb24gSUQuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlX2xpc3QgY2lwaGVyX3N1aXRlczsgLyoqPCBDaXBoZXIgU3VpdGVzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9saXN0IGNvbXByZXNzaW9uX21ldGhvZHM7ICAgLyoqPCBDb21wcmVzc2lvbiBNZXRob2RzLiAqLworICAgICAgICB9IGNsaWVudF9oZWxsbzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rsc192ZXJzaW9uIHZlcnNpb247ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBWZXJzaW9uLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rsc19yYW5kb20gcmFuZG9tOyAgICAgICAgICAgICAgLyoqPCBSYW5kb20uICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGxzX3Nlc3Npb25faWQgc2Vzc2lvbl9pZDsgICAgICAvKio8IFNlc3Npb24gSUQuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlIGNpcGhlcnN1aXRlOyAgICAvKio8IENpcGhlcnN1aXRlLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9tZXRob2QgY29tcHJlc3Npb25fbWV0aG9kOyAgICAgICAgICAvKio8IENvbXByZXNzaW9uIE1ldGhvZC4gKi8KKyAgICAgICAgfSBzZXJ2ZXJfaGVsbG87CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfbGlzdCB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBjZXJ0aWZpY2F0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV90eXBlX2xpc3QgY2VydGlmaWNhdGVfdHlwZXM7ICAgICAgICAvKio8IENlcnRpZmljYXRlIFR5cGVzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZV9saXN0IGNlcnRpZmljYXRlX2F1dGhvcml0aWVzOyAgICAvKio8IENlcnRpZmljYXRlIEF1dGhvcml0aWVzLiAqLworICAgICAgICB9IGNlcnRpZmljYXRlX3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGhhc2hfc2l6ZTsgICAgICAgICAgICAgICAgICAgICAvKio8IEhhc2ggU2l6ZS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKmVuY3J5cHRlZF9oYXNoOyAgICAgICAgICAgICAgICAvKio8IEVuY3J5cHRlZCBIYXNoLiAqLworICAgICAgICB9IGNlcnRpZmljYXRlX3ZlcmlmeTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3Qgc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgU2l6ZS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKmVuY3J5cHRlZF9wcmVfbWFzdGVyX3NlY3JldDsgICAvKio8IEVuY3J5cHRlZCBQcmUgTWFzdGVyIFNlY3JldC4gKi8KKyAgICAgICAgfSBjbGllbnRfa2V5X2V4Y2hhbmdlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCB2ZXJpZnlfZGF0YV9jb3VudDsgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdmVyaWZ5X2RhdGEuICovCisgICAgICAgICAgICB1aW50OF90ICp2ZXJpZnlfZGF0YTsgICAgICAgICAgICAgICAgICAgLyoqPCBWZXJpZnkgRGF0YS4gKi8KKyAgICAgICAgfSBmaW5pc2hlZDsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlOworCisvKiogVExTIFJlY29yZC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Rsc19jb250ZW50X3R5cGUgY29udGVudF90eXBlOyAgICAgICAgICAgICAgLyoqPCBDb250ZW50IFR5cGUuICovCisgICAgYmNtb2x0X2Vwb25fb2FtX3Rsc192ZXJzaW9uIHZlcnNpb247ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBWZXJzaW9uLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgaGFuZHNoYWtlX3JlY29yZHNfY291bnQ7ICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIGhhbmRzaGFrZV9yZWNvcmRzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2UgKmhhbmRzaGFrZV9yZWNvcmRzOyAgIC8qKjwgSGFuZHNoYWtlIFJlY29yZHMuICovCisgICAgICAgIH0gaGFuZHNoYWtlOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmQ7CisKKy8qKiBFQVAgVExTIE1lc3NhZ2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19tZXNzYWdlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Rsc19mbGFncyBmbGFnczsgICAgICAgICAgICAvKio8IEZsYWdzLiAqLworICAgIHVpbnQzMl90IGxlbmd0aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMZW5ndGguICovCisgICAgdWludDMyX3QgdGxzX3JlY29yZHNfY291bnQ7ICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB0bHNfcmVjb3Jkcy4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZCAqdGxzX3JlY29yZHM7ICAgIC8qKjwgVExTIFJlY29yZHMuICovCit9IGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX21lc3NhZ2U7CisKKy8qKiBFQVAgVExTIEhlYWRlci4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX2hlYWRlcgoreworICAgIGJjbW9sdF9lcG9uX29hbV90bHNfc3VidHlwZSBzdWJfdHlwZTsgICAgICAgICAgIC8qKjwgU3ViIFR5cGUuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19tZXNzYWdlIHZhbHVlOyAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBhdXRoZW50aWNhdGlvbjsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX2hlYWRlcjsKKworLyoqIEVBUCBGcmFtZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9lYXBfZnJhbWUKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZWFwX2NvZGUgY29kZTsgICAgICAgICAgICAgICAgICAvKio8IENvZGUuICovCisgICAgdWludDhfdCBpZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBJRC4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX2hlYWRlciB2YWx1ZTsgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHJlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX2hlYWRlciB2YWx1ZTsgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHJlc3BvbnNlOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2VhcF9mcmFtZTsKKworLyoqIEVBUE9MIFBEVS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9lYXBvbF9wZHUKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZWFwb2xfdHlwZSB0eXBlOyAgICAgICAgICAgIC8qKjwgVHlwZS4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9lYXBfZnJhbWUgdmFsdWU7ICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gcGFja2V0OworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3BkdTsKKworLyoqIEVBUE9MIFByb3RvY29sLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3Byb3RvY29sCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3ZlcnNpb24gdmVyc2lvbjsgICAgICAvKio8IFZlcnNpb24uICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZWFwb2xfcGR1IHZhbHVlOyAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGRlZjsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9lYXBvbF9wcm90b2NvbDsKKworLyoqIFZMQU4gVmFsdWUuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fdmxhbl92YWx1ZQoreworICAgIHVpbnQ4X3QgcGNwOyAgICAvKio8IFBDUC4gKi8KKyAgICB1aW50OF90IGNmaTsgICAgLyoqPCBDRkkuICovCisgICAgdWludDE2X3QgdmlkOyAgIC8qKjwgVklELiAqLworfSBiY21vbHRfZXBvbl9vYW1fdmxhbl92YWx1ZTsKKworLyoqIEktVGFnIFZhbHVlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2l0YWdfdmFsdWUKK3sKKyAgICB1aW50OF90IHBjcDsgICAgLyoqPCBQQ1AuICovCisgICAgdWludDhfdCBkZWk7ICAgIC8qKjwgREVJLiAqLworICAgIHVpbnQ4X3QgdWNhOyAgICAvKio8IFVDQS4gKi8KKyAgICB1aW50OF90IHJlczsgICAgLyoqPCBSRVMuICovCisgICAgdWludDMyX3QgaXNpZDsgIC8qKjwgSS1TSUQuICovCit9IGJjbW9sdF9lcG9uX29hbV9pdGFnX3ZhbHVlOworCisvKiogVGVrIEluZm8gVExWLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX3Rla19pbmZvX3RsdgoreworICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHZfdHlwZSB0eXBlOyAgICAgICAgICAgICAgICAgLyoqPCBUeXBlLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB2ZXJzaW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBWZXJzaW9uLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19yZXBvcnRfbW9kZXMgcmVwb3J0X21vZGU7ICAgLyoqPCBGb3IgdGhlIE9MVCB0aGVzZSBhcmUgdGhlIHN1cHBvcnRlZCBtb2RlcyAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19yZXBvcnRfbW9kZXMgcHJlZmVycmVkX3JlcG9ydF9tb2RlOyAvKio8IE9ubHkgc2VudCBieSBPTFQgKi8KKyAgICAgICAgfSBleHRlbnNpb25fc3VwcG9ydDsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHY7CisKKy8qKiBPcmdhbml6YXRpb24gU3BlY2lmaWMgSW5mby4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mbworeworICAgIGJjbW9sdF9lcG9uX29hbV93ZWxsX2tub3duX291aSBvdWk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgT1VJLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19pbmZvX3RsdiB0bHZzOyAgICAgICAgICAgICAgICAgIC8qKjwgVExWcy4gKi8KKyAgICAgICAgfSB0ZWs7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgZXh0ZW5zaW9uX3N1cHBvcnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEV4dGVuc2lvbiBTdXBwb3J0LiAqLworICAgICAgICAgICAgdWludDhfdCB2ZXJzaW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmVyc2lvbi4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IHN1cHBfdmVyc2lvbl9jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBzdXBwX3ZlcnNpb24uICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX291aV92ZXJzaW9uX3BhaXIgKnN1cHBfdmVyc2lvbjsgLyoqPCBTdXBwIFZlcnNpb24uICovCisgICAgICAgIH0gY3RjOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9pbmZvX3RsdiBkcG9lX2luZm9fdGx2OyAgICAgICAgLyoqPCBEUG9FIEluZm8gVExWLiAqLworICAgICAgICB9IGRwb2U7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2luZm87CisKKy8qKiBMb2NhbC9SZW1vdGUgSW5mb3JtYXRpb24uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm8KK3sKKyAgICB1aW50OF90IG9hbV92ZXJzaW9uOyAgICAvKio8IE9BTSBWZXJzaW9uLiAqLworICAgIHVpbnQxNl90IHJldmlzaW9uOyAgICAgIC8qKjwgUmV2aXNpb24uICovCisgICAgYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvX3N0YXRlIHN0YXRlOyAgICAgICAgICAvKio8IFN0YXRlLiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mb19jb25maWcgb2FtX2NvbmZpZzsgICAgLyoqPCBPQU0gQ29uZmlndXJhdGlvbi4gKi8KKyAgICB1aW50MTZfdCBtYXhfcGR1X3NpemU7ICAgICAgICAgICAgICAgICAgLyoqPCBNYXggUERVIFNpemUuICovCisgICAgYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpIG91aTsgICAgIC8qKjwgT1VJLiAqLworICAgIHVpbnQ4X3QgdmVuZG9yX3NwZWNpZmljX2luZm9ybWF0aW9uWzRdOyAvKio8IFZlbmRvciBTcGVjaWZpYyBJbmZvcm1hdGlvbi4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvOworCisvKiogSW5mbyBUTFYgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X3R5cGUgdHlwZTsgLyoqPCBUeXBlLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19pbmZvIHZhbHVlOyAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gb3JnYW5pemF0aW9uX3NwZWNpZmljOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCB1bmtub3duX2NvdW50OyAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdW5rbm93bi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnVua25vd247ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFVua25vd24uICovCisgICAgICAgIH0gZW5kOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm8gaW5mbzsgLyoqPCBJbmZvLiAqLworICAgICAgICB9IHJlbW90ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvIGluZm87IC8qKjwgSW5mby4gKi8KKyAgICAgICAgfSBsb2NhbDsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl9iYXNlOworCisvKiogT3JnYW5pemF0aW9uIFNwZWNpZmljIExpbmsgRXZlbnQgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfbGlua19ldmVudF9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpIG91aTsgICAgICAgICAgICAgICAgIC8qKjwgT1VJLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19hbGFybV9jb2RlIGFsYXJtX2NvZGU7ICAvKio8IEFsYXJtIENvZGUuICovCisgICAgICAgICAgICBiY21vc19ib29sIHJhaXNlZDsgIC8qKjwgUmFpc2VkLiAqLworICAgICAgICAgICAgdWludDE2X3QgcG9ydDsgICAgICAvKio8IFBvcnQuICovCisgICAgICAgICAgICB1aW50MTZfdCBsaW5rOyAgICAgIC8qKjwgTGluay4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IHF1ZXVlOyAgICAgLyoqPCBRdWV1ZS4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29udGV4dCBhbGFybV9jb250ZXh0OyAgICAvKio8IEFsYXJtIENvbnRleHQuICovCisgICAgICAgIH0gdGVrOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9ldmVudF9iYXNlIHZhbHVlOyAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBkcG9lOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2FsYXJtX2VudHJ5IHZhbHVlOyAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBjdGM7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2xpbmtfZXZlbnRfYmFzZTsKKworLyoqIExpbmsgRXZlbnQgVExWIEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90bHZfYmFzZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3R5cGUgdHlwZTsgICAvKio8IFR5cGUuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCB1bmtub3duX2NvdW50OyAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHVua25vd24uICovCisgICAgICAgICAgICB1aW50OF90ICp1bmtub3duOyAgICAgICAgICAgICAgIC8qKjwgVW5rbm93bi4gKi8KKyAgICAgICAgfSBlbmQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfbGlua19ldmVudF9iYXNlIHZhbHVlOyAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG9yZ2FuaXphdGlvbl9zcGVjaWZpYzsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3Rsdl9iYXNlOworCisvKiogVmFyIERlc2NyaXB0b3IgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV92YXJfZGVzY3JpcHRvcl9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Zhcl9icmFuY2ggYnJhbmNoOyAgICAgICAgICAgICAgICAgIC8qKjwgQnJhbmNoLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgbGVhZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IExlYWYuICovCisgICAgICAgIH0gZGVmOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCB1bmtub3duX2NvdW50OyAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHVua25vd24uICovCisgICAgICAgICAgICB1aW50OF90ICp1bmtub3duOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVW5rbm93bi4gKi8KKyAgICAgICAgfSBlbmQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9vYmplY3QgbGVhZjsgICAgICAgLyoqPCBMZWFmLiAqLworICAgICAgICB9IG9iamVjdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX3BhY2thZ2UgbGVhZjsgICAgICAvKio8IExlYWYuICovCisgICAgICAgIH0gcGFja2FnZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX25hbWVfYmluZGluZyBsZWFmOyAvKio8IExlYWYuICovCisgICAgICAgIH0gbmFtZV9iaW5kaW5nOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlIGxlYWY7ICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgfSBhdHRyaWJ1dGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hY3Rpb24gbGVhZjsgICAgICAgLyoqPCBMZWFmLiAqLworICAgICAgICB9IGFjdGlvbjsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV92YXJfZGVzY3JpcHRvcl9iYXNlOworCisvKiogVmFyIENvbnRhaW5lciBCYXNlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZQoreworICAgIGJjbW9sdF9lcG9uX29hbV92YXJfYnJhbmNoIGJyYW5jaDsgICAgICAgICAgICAgIC8qKjwgQnJhbmNoLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgbGVhZjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICB9IGRlZjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdW5rbm93bl9jb3VudDsgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHVua25vd24uICovCisgICAgICAgICAgICB1aW50OF90ICp1bmtub3duOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBVbmtub3duLiAqLworICAgICAgICB9IGVuZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX29iamVjdCBsZWFmOyAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZV9jb3VudDsgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB2YWx1ZS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnZhbHVlOyAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gb2JqZWN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfcGFja2FnZSBsZWFmOyAgLyoqPCBMZWFmLiAqLworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlX2NvdW50OyAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHZhbHVlLiAqLworICAgICAgICAgICAgdWludDhfdCAqdmFsdWU7ICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBwYWNrYWdlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfbmFtZV9iaW5kaW5nIGxlYWY7IC8qKjwgTGVhZi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZV9jb3VudDsgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB2YWx1ZS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnZhbHVlOyAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gbmFtZV9iaW5kaW5nOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlIGxlYWY7ICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZV9jb3VudDsgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB2YWx1ZS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnZhbHVlOyAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gYXR0cmlidXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uIGxlYWY7ICAgLyoqPCBMZWFmLiAqLworICAgICAgICAgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlX2NvdW50OyAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHZhbHVlLiAqLworICAgICAgICAgICAgdWludDhfdCAqdmFsdWU7ICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBhY3Rpb247CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlOworCisvKiogVGVrIE9iamVjdCBRdWV1ZSBOYW1lLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfcXVldWVfbmFtZQoreworICAgIHVpbnQxNl90IHBvcnRfbnVtYmVyOyAgIC8qKjwgUG9ydCBOdW1iZXIuICovCisgICAgdWludDE2X3QgbGlua19udW1iZXI7ICAgLyoqPCBMaW5rIE51bWJlci4gKi8KKyAgICB1aW50MTZfdCBxdWV1ZV9udW1iZXI7ICAvKio8IFF1ZXVlIE51bWJlci4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfcXVldWVfbmFtZTsKKworLyoqIFRlayBPYmplY3QgQ29udGV4dC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHQKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF90eXBlIG9iamVjdF90eXBlOyAgICAvKio8IE9iamVjdCBUeXBlLiAqLworICAgIHVpbnQ4X3QgbGVuZ3RoOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgTGVuZ3RoLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgbGlua19udW1iZXJfY291bnQ7IC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIGxpbmtfbnVtYmVyLiAqLworICAgICAgICAgICAgdWludDhfdCAqbGlua19udW1iZXI7ICAgICAgIC8qKjwgTGluayBOdW1iZXIuICovCisgICAgICAgIH0gbG9naWNhbF9saW5rOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9xdWV1ZV9uYW1lIHZhbHVlOyAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHF1ZXVlX25hbWU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHBvcnRfbnVtYmVyX2NvdW50OyAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHBvcnRfbnVtYmVyLiAqLworICAgICAgICAgICAgdWludDhfdCAqcG9ydF9udW1iZXI7ICAgLyoqPCBQb3J0IE51bWJlci4gKi8KKyAgICAgICAgfSBwb3J0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9xdWV1ZV9uYW1lIHZhbHVlOyAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGFsbF9xdWV1ZXM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHBvbl9udW1iZXJfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHBvbl9udW1iZXIuICovCisgICAgICAgICAgICB1aW50OF90ICpwb25fbnVtYmVyOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUE9OIE51bWJlci4gKi8KKyAgICAgICAgfSBuZXR3b3JrX3BvbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgcG9uX251bWJlcl9jb3VudDsgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBwb25fbnVtYmVyLiAqLworICAgICAgICAgICAgdWludDhfdCAqcG9uX251bWJlcjsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFBPTiBOdW1iZXIuICovCisgICAgICAgIH0gdXNlcl9wb247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9mbG93X2RpcmVjdGlvbiBkaXJlY3Rpb247ICAgLyoqPCBEaXJlY3Rpb24uICovCisgICAgICAgIH0gZmxvd19kaXJlY3Rpb247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGJyaWRnZV9udW1iZXJfY291bnQ7ICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gYnJpZGdlX251bWJlci4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKmJyaWRnZV9udW1iZXI7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBCcmlkZ2UgTnVtYmVyLiAqLworICAgICAgICB9IGJyaWRnZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgcG9ydF9udW1iZXJfY291bnQ7ICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBwb3J0X251bWJlci4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnBvcnRfbnVtYmVyOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBQb3J0IE51bWJlci4gKi8KKyAgICAgICAgfSBicmlkZ2VfcG9ydDsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHQ7CisKKy8qKiBUZWsgVmFyIERlc2NyaXB0b3IuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjcmlwdG9yCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19icmFuY2ggYnJhbmNoOyAgLyoqPCBCcmFuY2guICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBsZWFmOyAgICAgICAgICAgICAgLyoqPCBMZWFmLiAqLworICAgICAgICB9IGRlZjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdW5rbm93bl9jb3VudDsgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHVua25vd24uICovCisgICAgICAgICAgICB1aW50OF90ICp1bmtub3duOyAgICAgICAgICAgLyoqPCBVbmtub3duLiAqLworICAgICAgICB9IGVuZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dCBvYmplY3RfY29udGV4dDsgIC8qKjwgT2JqZWN0IENvbnRleHQuICovCisgICAgICAgIH0gbmFtZV9iaW5kaW5nOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYXR0cmlidXRlIGxlYWY7ICAgICAgICAgICAgLyoqPCBMZWFmLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19hbGFybV9jb2RlIGFsYXJtX2NvZGU7ICAgICAgICAgIC8qKjwgQWxhcm0gQ29kZS4gKi8KKyAgICAgICAgfSBhdHRyaWJ1dGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hY3Rpb24gbGVhZjsgICAgICAgICAgICAgICAvKio8IExlYWYuICovCisgICAgICAgIH0gYWN0aW9uOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY3JpcHRvcjsKKworLyoqIExVRSBGaWVsZCBTZWxlY3QgRW50cnkuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fbHVlX2ZpZWxkX3NlbGVjdF9lbnRyeQoreworICAgIHVpbnQ4X3QgbGF5ZXJfc2VsZWN0OyAgIC8qKjwgTGF5ZXIgU2VsZWN0LiAqLworICAgIHVpbnQ4X3QgZHdvcmRfb2Zmc2V0OyAgIC8qKjwgRHdvcmQgb2Zmc2V0LiAqLworICAgIHVpbnQ4X3QgZmllbGRfbGVuZ3RoOyAgIC8qKjwgRmllbGQgTGVuZ3RoLiAqLworICAgIHVpbnQ4X3QgYml0X29mZnNldDsgICAgIC8qKjwgQml0IG9mZnNldC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX2x1ZV9maWVsZF9zZWxlY3RfZW50cnk7CisKKy8qKiBUZWsgT05VIFJ1bGUgQ2xhdXNlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9jbGF1c2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9maWVsZF9zZWxlY3QgZmllbGRfc2VsZWN0OyAgLyoqPCBGaWVsZCBTZWxlY3QuICovCisgICAgdWludDY0X3QgbG9va3VwX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAvKio8IExvb2t1cCBWYWx1ZS4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX29wZXJhdG9yIG9wOyAgIC8qKjwgT3AuICovCit9IGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfY2xhdXNlOworCisvKiogVGVrIE9OVSBSdWxlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZQoreworICAgIHVpbnQ4X3QgZGlyZWN0aW9uOyAgLyoqPCBEaXJlY3Rpb24uICovCisgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9mbGFncyBmbGFnczsgICAvKio8IEZsYWdzLiAqLworICAgIHVpbnQ4X3QgcG9ydF9saW5rOyAgLyoqPCBQb3J0L0xpbmsuICovCisgICAgdWludDhfdCBxdWV1ZTsgICAgICAvKio8IFF1ZXVlLiAqLworICAgIHVpbnQxNl90IHZpZF9jb3M7ICAgLyoqPCBWSUQvQ29TLiAqLworICAgIHVpbnQ4X3QgcmVzZXJ2ZWQ7ICAgLyoqPCBSZXNlcnZlZC4gKi8KKyAgICB1aW50OF90IHByZWNlZGVuY2U7IC8qKjwgUHJlY2VkZW5jZS4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2FjdGlvbiBhY3Rpb247ICAgICAvKio8IEFjdGlvbi4gKi8KKyAgICB1aW50OF90IGNsYXVzZXNfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IENsYXVzZXMgQ291bnQuICovCisgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9jbGF1c2UgKmNsYXVzZXM7ICAgLyoqPCBDbGF1c2VzLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlOworCisvKiogVGVrIE9OVSBJR01QIFZMQU4uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX3ZsYW4KK3sKKyAgICBiY21vc192bGFuX3RhZyBlcG9uX3ZsYW47ICAgLyoqPCBFUE9OIFZMQU4uICovCisgICAgYmNtb3Nfdmxhbl90YWcgdXNlcl92bGFuOyAgIC8qKjwgVXNlciBWTEFOLiAqLworICAgIHVpbnQ4X3QgbWF4X2FsbG93ZWRfZ3JvdXBzOyAvKio8IE1heCBBbGxvd2VkIEdyb3Vwcy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF92bGFuOworCisvKiogVGVrIFZMQU4gRGVzdGluYXRpb24gTWFwcGluZy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9tYXBwaW5nCit7CisgICAgYmNtb3Nfdmxhbl90YWcgdmxhbl90YWc7ICAgIC8qKjwgVkxBTiBUYWcuICovCisgICAgdWludDhfdCBsaW5rX2luZGV4OyAgICAgICAgIC8qKjwgTGluayBJbmRleC4gKi8KKyAgICB1aW50OF90IHF1ZXVlX2luZGV4OyAgICAgICAgLyoqPCBRdWV1ZSBJbmRleC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX21hcHBpbmc7CisKKy8qKiBMb2FkIFRpbWVzdGFtcCAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX3Rla19maXJtd2FyZV90aW1lc3RhbXAKK3sKKyAgICB1aW50MTZfdCB5ZWFyOyAgLyoqPCBZZWFyLiAqLworICAgIHVpbnQ4X3QgbW9udGg7ICAvKio8IE1vbnRoLiAqLworICAgIHVpbnQ4X3QgZGF5OyAgICAvKio8IERheS4gKi8KKyAgICB1aW50OF90IGhvdXI7ICAgLyoqPCBIb3VyLiAqLworICAgIHVpbnQ4X3QgbWluOyAgICAvKio8IE1pbi4gKi8KKyAgICB1aW50OF90IHNlYzsgICAgLyoqPCBTZWMuICovCit9IGJjbW9sdF9lcG9uX29hbV90ZWtfZmlybXdhcmVfdGltZXN0YW1wOworCisvKiogUnVsZSBFbnRyeS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9ydWxlX2VudHJ5Cit7CisgICAgdWludDE2X3QgbGVhcm5pbmdfZG9tYWluOyAgIC8qKjwgTGVhcm5pbmcgRG9tYWluLiAqLworICAgIHVpbnQ4X3Qgc3RhdDsgICAgICAgICAgICAgICAvKio8IFN0YXRpYy4gKi8KKyAgICB1aW50OF90IHJpZ2h0X21hc2s7ICAgICAgICAgLyoqPCBSaWdodCBNYXNrLiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZmllbGRfc2VsZWN0X3R5cGUgYmluc2VsZWN0OyAgICAgICAgICAgICAvKio8IEJpblNlbGVjdC4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfbWFjIHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBzYTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9tYWMgdmFsdWU7ICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGRhOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3NzbV9pcCB2YWx1ZTsgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc3NtX3BsdXNfaXBkYTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9wcm9ncmFtbWFibGUgdmFsdWU7ICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHByb2dfZmllbGQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfY3ZpZCB2YWx1ZTsgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBjdmxhbl92aWQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfc3ZsYW5fcGx1c19jdmxhbiB2YWx1ZTsgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBzdmxhbl92aWRfY3ZsYW5fdmlkOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX3J1bGVfZW50cnk7CisKKy8qKiBUZWsgQXR0cmlidXRlIFZhbHVlIFJ1bGUuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9ydWxlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3J1bGVfdHlwZSBsZWFmOyAvKio8IExlYWYuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHByaW9yaXR5OyAgICAgICAvKio8IFByaW9yaXR5LiAqLworICAgICAgICB9IGhlYWRlcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3J1bGVfZmllbGRfc2VsZWN0IGZpZWxkX3NlbGVjdDsgLyoqPCBGaWVsZCBTZWxlY3QuICovCisgICAgICAgICAgICB1aW50OF90IGZpZWxkX2luc3RhbmNlOyAgICAgICAgICAgICAgICAgLyoqPCBGaWVsZCBJbnN0YW5jZS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbXNiX21hc2s7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IE1TQiBNYXNrLiAqLworICAgICAgICAgICAgdWludDhfdCBsc2JfbWFzazsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTFNCIE1hc2suICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fcnVsZV9vcGVyYXRvciBvcGVyYXRvcjsgLyoqPCBPcGVyYXRvci4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IG1hdGNoX3ZhbHVlX2NvdW50OyAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBtYXRjaF92YWx1ZS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKm1hdGNoX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAvKio8IE1hdGNoIFZhbHVlLiAqLworICAgICAgICB9IGNsYXVzZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3J1bGVfYWN0aW9uIHJlc3VsdDsgICAgIC8qKjwgUmVzdWx0LiAqLworICAgICAgICAgICAgdWludDMyX3QgcGFyYW1ldGVyX2NvdW50OyAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHBhcmFtZXRlci4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnBhcmFtZXRlcjsgICAgICAgICAgICAgICAgICAgICAvKio8IFBhcmFtZXRlci4gKi8KKyAgICAgICAgfSByZXN1bHQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9ydWxlX2VudHJ5IHZhbHVlOyAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGVudHJ5OworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfcnVsZTsKKworLyoqIFVuaSBTaGFwZXIuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fdW5pX3NoYXBlcgoreworICAgIHVpbnQzMl90IHF1ZXVlX2JpdG1hcDsgIC8qKjwgUXVldWUgQml0bWFwLiAqLworICAgIHVpbnQzMl90IHNoYXBlX3JhdGU7ICAgIC8qKjwgVW5pdHMgMiBrYnBzICovCisgICAgdWludDE2X3QgYnVyc3Rfc2l6ZTsgICAgLyoqPCBVbml0IDI1NiBieXRlcyAqLworfSBiY21vbHRfZXBvbl9vYW1fdW5pX3NoYXBlcjsKKworLyoqIERldGFpbGVkIHZlcnNpb24gbnVtYmVyIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fZXh0ZW5kZWRfdmVyc2lvbl9udW1iZXIKK3sKKyAgICB1aW50OF90IG1ham9yOyAgLyoqPCBNYWpvciB2ZXJzaW9uIG51bWJlciAqLworICAgIHVpbnQ4X3QgbWlub3I7ICAvKio8IE1pbm9yIHZlcnNpb24gbnVtYmVyICovCisgICAgdWludDE2X3QgcGF0Y2g7IC8qKjwgUGF0Y2ggcmV2aXNpb24gbnVtYmVyICovCit9IGJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF92ZXJzaW9uX251bWJlcjsKKworLyoqIEV4dGVuZGVkIExvYWQgTGFiZWwuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fZXh0ZW5kZWRfbG9hZF9sYWJlbAoreworICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfbWF0dXJpdHkgbWF0dXJpdHk7ICAgICAgICAgICAgICAvKio8IE1hdHVyaXR5LiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF92ZXJzaW9uX251bWJlciB2ZXJzaW9uOyAgICAvKio8IFZlcnNpb24uICovCit9IGJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF9sb2FkX2xhYmVsOworCisvKiogRmlsZSBJbmZvIEZpcm13YXJlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2ZpbGVfaW5mb19maXJtd2FyZQoreworICAgIHVpbnQxNl90IGxlZ2FjeV92ZXJzaW9uOyAgICAvKio8IExlZ2FjeSBWZXJzaW9uLiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF9sb2FkX2xhYmVsIG5ld192ZXJzaW9uOyAgICAvKio8IE5ldyBWZXJzaW9uLiAqLworICAgIHVpbnQzMl90IHN0cmVhbTsgICAgLyoqPCBTdHJlYW0uICovCisgICAgdWludDMyX3QgcmV2aXNpb247ICAvKio8IFJldmlzaW9uLiAqLworICAgIHVpbnQzMl90IGNyYzsgICAgICAgLyoqPCBDUkMuICovCisgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19maXJtd2FyZV90aW1lc3RhbXAgdGltZXN0YW1wOyAgIC8qKjwgVGltZXN0YW1wLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Zpcm13YXJlOworCisvKiogRmlsZSBJbmZvIEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZmlsZV90eXBlIGZpbGVfdHlwZTsgICAgICAgICAgICAgICAgLyoqPCBGaWxlIFR5cGUuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Zpcm13YXJlIGluZm87ICAgIC8qKjwgSW5mby4gKi8KKyAgICAgICAgfSBib290OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Zpcm13YXJlIGluZm87ICAgIC8qKjwgSW5mby4gKi8KKyAgICAgICAgfSBhcHBfbWFpbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2ZpbGVfaW5mb19maXJtd2FyZSBpbmZvOyAgICAvKio8IEluZm8uICovCisgICAgICAgIH0gYXBwX2JhY2t1cDsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fYmFzZTsKKworLyoqIE9BTSBFUG9DIEJpdCBMb2FkLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX2JpdF9sb2FkCit7CisgICAgdWludDhfdCBpZHg7ICAgIC8qKjwgQmFuZCBpbmRleCAqLworICAgIHVpbnQ4X3QgdmFsdWU7ICAvKio8IExvYWRpbmcgVmFsdWUgKi8KK30gYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX2JpdF9sb2FkOworCisvKiogT2FtIEVwb2MgQml0IExvYWRpbmcuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2NfYml0X2xvYWRpbmcKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2NfYml0X2xvYWQgbG9hZFszMl07IC8qKjwgTG9hZC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX2JpdF9sb2FkaW5nOworCisvKiogT2FtIEVwb2MgU3RhdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19zdGF0Cit7CisgICAgdWludDE2X3QgaWR4OyAgICAgICAgICAgLyoqPCBTdGF0aXN0aWMgaW5kZXggKi8KKyAgICB1aW50MzJfdCB2YWx1ZV9jb3VudDsgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB2YWx1ZS4gKi8KKyAgICB1aW50OF90ICp2YWx1ZTsgICAgICAgICAvKio8IFN0YXRpc3RpYyB2YWx1ZSAqLworfSBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdDsKKworLyoqIERlZmluZXMgYSBsaW5rL3BvcnQgcHJpb3JpdHkgCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YycHJpb3JpdHkKK3sKKyAgICB1aW50OF90IGxldmVsOyAgICAgICAgICAvKio8IFByaW9yaXR5IGxldmVsIG9mIHRoaXMgcHJpb3JpdHkgKi8KKyAgICB1aW50OF90IHdlaWdodDsgICAgICAgICAvKio8IFBlcmNlbnRhZ2Ugd2VpZ2h0IG9mIHRoaXMgcHJpb3JpdHkgKDAgZm9yIFNQKSAqLworICAgIHVpbnQ4X3QgcXVldWVfY291bnQ7ICAgIC8qKjwgTnVtYmVyIG9mIHF1ZXVlcyBhdCB0aGlzIHByaW9yaXR5ICovCisgICAgdWludDE2X3QgKnF1ZXVlX3NpemVzOyAgLyoqPCBRdWV1ZSBzaXplcyAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5OworCisvKiogVGVrIFF1ZXVlIENvbmZpZyBWMiBCYXNlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJiYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJzdWJ0eXBlIHN1YnR5cGU7ICAgICAvKio8IFR5cGUgb2YgZGF0YSBpbiB0aGlzIHZhcmlhYmxlIGNvbnRhaW5lciAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19yZXBvcnRfbW9kZSByZXBvcnRfY29uZmlnOyAgLyoqPCBSZXBvcnRpbmcgbW9kZSBmb3IgT05VICovCisgICAgICAgIH0gaGVhZGVyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHByaW9yaXR5X2NvdW50OyAvKio8IE51bWJlciBvZiBwcmlvcml0aWVzIGZvciB0aGlzIGxpbmsgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YycHJpb3JpdHkgKnByaW9yaXRpZXM7ICAgIC8qKjwgRGVmaW5pdGlvbiBvZiBwcmlvcml0aWVzICovCisgICAgICAgIH0gbGluazsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBwcmlvcml0eV9jb3VudDsgLyoqPCBOdW1iZXIgb2YgcHJpb3JpdGllcyBmb3IgdGhpcyBwb3J0ICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5ICpwcmlvcml0aWVzOyAgICAvKio8IERlZmluaXRpb24gb2YgcHJpb3JpdGllcyAqLworICAgICAgICB9IHBvcnQ7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MmJhc2U7CisKKy8qKiBUZWsgU2VxdWVuY2UgTnVtYmVyLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX3Rla19zZXF1ZW5jZV9udW1iZXIKK3sKKyAgICBiY21vc19ib29sIGVuZF9vZl9zZXF1ZW5jZTsgLyoqPCBFbmQgb2Ygc2VxdWVuY2UuICovCisgICAgdWludDE2X3Qgc2VxdWVuY2VfbnVtYmVyOyAgIC8qKjwgU2VxdWVuY2UgTnVtYmVyLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX3NlcXVlbmNlX251bWJlcjsKKworLyoqIE9OVSBDbG9jayBUcmFuc3BvcnQgQ29uZmlnLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX29udV9jbG9ja190cmFuc3BvcnRfY29uZmlnCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Nsb2NrX3RyYW5zcG9ydF9rZXkga2V5OyAgICAvKio8IEtleS4gKi8KKyAgICBiY21vc19ib29sIHJlX2luaXQ7ICAgICAgICAgICAgIC8qKjwgUmUtIEluaXQuICovCisgICAgYmNtb3NfYm9vbCB0b2RfZW5hYmxlOyAgICAgICAgICAvKio8IFRPRCBFbmFibGUuICovCisgICAgYmNtb3NfYm9vbCBvbmVfcHBzX2VuYWJsZTsgICAgICAvKio8IDFQUFMgRW5hYmxlLiAqLworICAgIGludDMyX3Qgb25lX3Bwc19vZmZzZXQ7ICAgICAgICAgLyoqPCAxUFBTIE9mZnNldC4gKi8KKyAgICB1aW50MzJfdCByb3VuZF90cmlwX3RpbWU7ICAgICAgIC8qKjwgUm91bmQgVHJpcCBUaW1lLiAqLworICAgIHVpbnQzMl90IG9uZV9wcHNfaGFsZl9wZXJpb2Q7ICAgLyoqPCAxUFBTIEhhbGYgUGVyaW9kLiAqLworfSBiY21vbHRfZXBvbl9vYW1fb251X2Nsb2NrX3RyYW5zcG9ydF9jb25maWc7CisKKy8qKiBPQU0gTWNhc3QgRG9tYWluIFBvcnQgSW5mby4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3BvcnRfaW5mbworeworICAgIHVpbnQ4X3QgcG9ydDsgICAgICAgICAgIC8qKjwgUG9ydC4gKi8KKyAgICB1aW50OF90IGdyb3VwX2xpbWl0OyAgICAvKio8IEdyb3VwIExpbWl0LiAqLworICAgIHVpbnQ4X3QgZmNfbGltaXQ7ICAgICAgIC8qKjwgRm9yIGxhdGVyIHVzZSAqLworICAgIHVpbnQ4X3QgYWN0aW9uOyAgICAgICAgIC8qKjwgRm9yIGxhdGVyIHVzZSAqLworICAgIHVpbnQxNl90IHVwX2Vwb25fdmlkOyAgIC8qKjwgVXAgRVBPTiBWaWQuICovCisgICAgdWludDE2X3QgdXBfdW5pX3ZpZDsgICAgLyoqPCBVcCBVbmkgVmlkLiAqLworICAgIHVpbnQ4X3QgdXBfbGluazsgICAgICAgIC8qKjwgTm90IHBvcnQgcmVsYXRpdmUgKi8KKyAgICB1aW50OF90IGRucTsgICAgICAgICAgICAvKio8IERuUS4gKi8KKyAgICB1aW50OF90IHVwcTsgICAgICAgICAgICAvKio8IFVwUS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5fcG9ydF9pbmZvOworCisvKiogT2FtIE1jYXN0IERvbWFpbiBJbmZvLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5faW5mbworeworICAgIHVpbnQ4X3QgaWQ7ICAgICAgICAgLyoqPCBJRC4gKi8KKyAgICB1aW50OF90IGRuX2xpbms7ICAgIC8qKjwgRG4gTGluay4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fZG9tYWluX29wdGlvbiBvcHRpb25zOyAgICAgIC8qKjwgT3B0aW9ucy4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fZm9yd2FyZF9xdWFsaWZpZXIgZndkX3F1YWw7IC8qKjwgRndkIFF1YWwuICovCisgICAgdWludDhfdCByZXNlcnZlZDsgICAgICAgLyoqPCBSZXNlcnZlZC4gKi8KKyAgICB1aW50OF90IGFjdGlvbjsgICAgICAgICAvKio8IEFjdGlvbi4gKi8KKyAgICB1aW50MTZfdCBkbl9lcG9uX3ZpZDsgICAvKio8IERuIEVQT04gVmlkLiAqLworICAgIHVpbnQxNl90IGRuX3VuaV92aWQ7ICAgIC8qKjwgRG4gVW5pIFZpZC4gKi8KKyAgICB1aW50OF90IG51bV9wb3J0OyAgICAgICAvKio8IE51bSBQb3J0LiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3BvcnRfaW5mbyAqcG9ydF9pbmZvOyAgLyoqPCBQb3J0IEluZm8uICovCit9IGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX2luZm87CisKKy8qKiBPYW0gTWNhc3QgRG9tYWluIFJlY29yZC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3JlY29yZAoreworICAgIHVpbnQ4X3QgbnVtX2RvbWFpbnM7ICAgIC8qKjwgTnVtIERvbWFpbnMuICovCisgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5faW5mbyAqZG9tYWluOyAgLyoqPCBEb21haW4uICovCit9IGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3JlY29yZDsKKworLyoqIFRlayBBdHRyaWJ1dGUgVmFsdWUuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZQoreworICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hdHRyaWJ1dGUgbGVhZjsgICAgLyoqPCBMZWFmLiAqLworICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgIC8qKjwgV2lkdGguICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGlkeDsgICAgLyoqPCBJbmRleC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9sdWVfZmllbGRfc2VsZWN0X2VudHJ5IGRlZjsgLyoqPCBEZWZhdWx0LiAqLworICAgICAgICB9IGx1ZV9maWVsZF9zZWxlY3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBzdGRfbWFjX2ZyYW1lc190eF9vazsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7ICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHN0ZF9tYWNfc2luZ2xlX2NvbGxfZnJhbWVzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc3RkX21hY19tdWx0aXBsZV9jb2xsX2ZyYW1lczsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7ICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHN0ZF9tYWNfZnJhbWVzX3J4X29rOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc3RkX21hY19mY3NfZXJyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc3RkX21hY19hbGlnbl9lcnI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBzdGRfbWFjX29jdGV0c190eF9vazsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7ICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHN0ZF9tYWNfbGF0ZV9jb2xsaXNpb25zOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc3RkX21hY19leGNlc3NpdmVfY29sbGlzaW9uczsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7ICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHN0ZF9tYWNfb2N0ZXRzX3J4X29rOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc3RkX21hY19tY2FzdF9mcmFtZXNfdHhfb2s7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBzdGRfbWFjX2JjYXN0X2ZyYW1lc190eF9vazsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7ICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHN0ZF9tYWNfbWNhc3RfZnJhbWVzX3J4X29rOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc3RkX21hY19iY2FzdF9mcmFtZXNfcnhfb2s7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBzdGRfbWFjX2luX3JhbmdlX2xlbl9lcnI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBzdGRfbWFjX2ZyYW1lX3Rvb19sb25nOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGVuYWJsZWQ7ICAgICAgICAgICAgICAgIC8qKjwgRW5hYmxlZC4gKi8KKyAgICAgICAgfSBzdGRfbWFjX2VuYWJsZV9zdGF0dXM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBzdGRfcGh5X3N5bWJvbF9lcnJfZHVyaW5nX2NhcnJpZXI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBzdGRfbWFjX2N0cmxfcGF1c2VfdHg7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBzdGRfbWFjX2N0cmxfcGF1c2Vfcng7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBzdGRfb2FtX2xvY2FsX2Vycl9mcmFtZV9zZWNzX2V2ZW50OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc3RkX29hbV9lbXVsX2NyYzhlcnI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBzdGRfbXBjcF9tYWNfY3RybF9mcmFtZXNfdHg7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBzdGRfbXBjcF9tYWNfY3RybF9mcmFtZXNfcng7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBzdGRfbXBjcF90eF9yZWdfYWNrOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc3RkX21wY3BfdHhfcmVnX3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBzdGRfbXBjcF90eF9yZXBvcnQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBzdGRfbXBjcF9yeF9nYXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc3RkX21wY3BfcnhfcmVnaXN0ZXI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IHRhYmxlX3NpemU7ICAgICAgICAgICAgLyoqPCBUYWJsZSBTaXplLiAqLworICAgICAgICB9IGR5bl9sZWFybl90Ymxfc2l6ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgYWdlX2xpbWl0OyAgICAgICAgICAgICAvKio8IEFnZSBMaW1pdC4gKi8KKyAgICAgICAgfSBkeW5fbGVhcm5fYWdlX2xpbWl0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gcnhfdW5pY2FzdF9mcmFtZXM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSB0eF91bmljYXN0X2ZyYW1lczsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7ICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHJ4X2ZyYW1lX3Rvb19zaG9ydDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7ICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHJ4X2ZyYW1lNjQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSByeF9mcmFtZTY1dG8xMjc7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSByeF9mcmFtZTEyOHRvMjU1OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gcnhfZnJhbWUyNTZ0bzUxMTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7ICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHJ4X2ZyYW1lNTEydG8xMDIzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gcnhfZnJhbWUxMDI0dG8xNTE4OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gcnhfZnJhbWUxNTE5cGx1czsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7ICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHR4X2ZyYW1lNjQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSB0eF9mcmFtZTY1dG8xMjc7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSB0eF9mcmFtZTEyOHRvMjU1OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gdHhfZnJhbWUyNTZ0bzUxMTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7ICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHR4X2ZyYW1lNTEydG8xMDIzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gdHhfZnJhbWUxMDI0dG8xNTE4OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gdHhfZnJhbWUxNTE5cGx1czsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBkZWxheV90aHJlc2hvbGQ7ICAgICAgICAvKio8IERlbGF5IFRocmVzaG9sZC4gKi8KKyAgICAgICAgfSB0eF9kZWxheV90aHJlc2hvbGQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IGRlbGF5OyAgICAgICAgICAgICAgICAgLyoqPCBEZWxheS4gKi8KKyAgICAgICAgfSB0eF9kZWxheTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7ICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHR4X2ZyYW1lc19kcm9wcGVkOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gdHhfYnl0ZXNfZHJvcHBlZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7ICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHR4X2J5dGVzX2RlbGF5ZWQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSB0eF9ieXRlc191bnVzZWQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgZGVsYXlfdGhyZXNob2xkOyAgICAgICAgLyoqPCBEZWxheSBUaHJlc2hvbGQuICovCisgICAgICAgIH0gcnhfZGVsYXlfdGhyZXNob2xkOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCBkZWxheTsgICAgICAgICAgICAgICAgIC8qKjwgRGVsYXkuICovCisgICAgICAgIH0gcnhfZGVsYXk7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSByeF9mcmFtZXNfZHJvcHBlZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7ICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHJ4X2J5dGVzX2Ryb3BwZWQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOyAgICAgICAgICAgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSByeF9ieXRlc19kZWxheWVkOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBzdGF0aXN0aWNfaWQ7ICAgICAgICAgIC8qKjwgU3RhdGlzdGljIElELiAqLworICAgICAgICAgICAgdWludDMyX3QgcmlzaW5nX3RocmVzaG9sZDsgICAgICAvKio8IFJpc2luZyBUaHJlc2hvbGQuICovCisgICAgICAgICAgICB1aW50MzJfdCBmYWxsaW5nX3RocmVzaG9sZDsgICAgIC8qKjwgRmFsbGluZyBUaHJlc2hvbGQuICovCisgICAgICAgIH0gcG9ydF9zdGF0X3RocmVzaG9sZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3Qgc3RhdGlzdGljX2lkOyAgICAgICAgICAvKio8IFN0YXRpc3RpYyBJRC4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IHJpc2luZ190aHJlc2hvbGQ7ICAgICAgLyoqPCBSaXNpbmcgVGhyZXNob2xkLiAqLworICAgICAgICAgICAgdWludDMyX3QgZmFsbGluZ190aHJlc2hvbGQ7ICAgICAvKio8IEZhbGxpbmcgVGhyZXNob2xkLiAqLworICAgICAgICB9IGxpbmtfc3RhdF90aHJlc2hvbGQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IHRpbWU7ICAgICAgICAgICAgICAgICAgLyoqPCBUaW1lLiAqLworICAgICAgICB9IGVuY3J5cHRfa2V5X2V4cGlyeV90aW1lOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGxlbl9lcnJvcl9kaXNjYXJkOyAgICAgIC8qKjwgTGVuIEVycm9yIERpc2NhcmQuICovCisgICAgICAgIH0gbGVuX2Vycm9yX2Rpc2NhcmQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHRocmVzaG9sZHNfY291bnQ7ICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhyZXNob2xkcy4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90ICp0aHJlc2hvbGRzOyAgICAgICAgICAgLyoqPCBUaHJlc2hvbGRzLiAqLworICAgICAgICB9IHJlcG9ydF90aHJlc2hvbGRzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCB2bGFuX2V0aGVyX3R5cGU7ICAgICAgIC8qKjwgVmxhbiBFdGhlclR5cGUuICovCisgICAgICAgICAgICBiY21vc19ib29sIHVzZV9mb3JfdXBzdHJlYW07ICAgIC8qKjwgVXNlIEZvciBVcHN0cmVhbS4gKi8KKyAgICAgICAgICAgIGJjbW9zX2Jvb2wgdXNlX2Zvcl9kb3duc3RyZWFtOyAgLyoqPCBVc2UgRm9yIERvd25zdHJlYW0uICovCisgICAgICAgIH0gdmxhbl9ldGhlcnR5cGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGN1cnJlbnRfY2FwczsgICAgICAgICAgLyoqPCBDdXJyZW50IENhcHMuICovCisgICAgICAgICAgICB1aW50MTZfdCBwaHlzaWNhbF9jYXBzOyAgICAgICAgIC8qKjwgUGh5c2ljYWwgQ2Fwcy4gKi8KKyAgICAgICAgfSBwb3J0X2NhcGFiaWxpdHk7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHJ1bGVzX2NvdW50OyAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gcnVsZXMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlICpydWxlczsgICAgICAgIC8qKjwgUnVsZXMuICovCisgICAgICAgIH0gbmV3X2RuX2ZpbHRlcl90Ymw7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHJ1bGVzX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gcnVsZXMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlICpydWxlczsgICAgICAgIC8qKjwgUnVsZXMuICovCisgICAgICAgIH0gbmV3X3VwX2ZpbHRlcl90Ymw7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGRlc3RpbmF0aW9uX2JpdG1hcDsgICAgICAgICAgICAgICAgLyoqPCBEZXN0aW5hdGlvbiBCaXRtYXAuICovCisgICAgICAgIH0gYXJwX3JlcGxpY2F0ZV9kZXN0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBkZXN0aW5hdGlvbl9iaXRtYXA7ICAgICAgICAgICAgICAgIC8qKjwgRGVzdGluYXRpb24gQml0bWFwLiAqLworICAgICAgICB9IGxhY3BfZGVzdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBhY3Rpb25fZm9yX3VubWFuX2dycDsgICAgICAgICAgICAgICAvKio8IEFjdGlvbiBGb3IgVW5tYW4gR3JwLiAqLworICAgICAgICAgICAgdWludDhfdCB2bGFuc19jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFZsYW5zIENvdW50LiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF92bGFuICp2bGFuczsgICAvKio8IFZsYW5zLiAqLworICAgICAgICB9IG9udV9pZ21wX3ZsYW47CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgbGVhcm5pbmdfbW9kZTsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMZWFybmluZyBNb2RlLiAqLworICAgICAgICB9IGR5bl9sZWFybmluZ19tb2RlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBsaW1pdDsgICAgICAgICAgICAgICAgICAgICAvKio8IExpbWl0LiAqLworICAgICAgICB9IG1pbl9tYWNfbGltaXQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgbGltaXQ7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTGltaXQuICovCisgICAgICAgIH0gb251X2FnZ3JlZ2F0ZV9saW1pdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgZGF0YV9jb3VudDsgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gZGF0YS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKmRhdGE7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRGF0YS4gKi8KKyAgICAgICAgfSBudnNfc2NyYXRjaHBhZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBmbG9vZF91bmtub3duX29wdDsgICAgICAgICAgLyoqPCBGbG9vZCBVbmtub3duIE9wdC4gKi8KKyAgICAgICAgfSBmbG9vZF91bmtub3duOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGxvY2FsX3N3aXRjaF9vcHQ7ICAgICAgICAgICAvKio8IExvY2FsIFN3aXRjaCBPcHQuICovCisgICAgICAgIH0gbG9jYWxfc3dpdGNoaW5nOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGRvd25fYnVyc3RfdG9sbF9vcHQ7ICAgICAgICAvKio8IERvd24gQnVyc3QgVG9sbCBPcHQuICovCisgICAgICAgIH0gZG93bl9idXJzdF90b2xsOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGRvd25zdHJlYW1fZmVjOyAgICAgICAgICAgICAvKio8IERvd25zdHJlYW0gRkVDLiAqLworICAgICAgICAgICAgdWludDhfdCB1cHN0cmVhbV9mZWM7ICAgICAgICAgICAgICAgLyoqPCBVcHN0cmVhbSBGRUMuICovCisgICAgICAgIH0gZmVjX21vZGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHRlbXBlcmF0dXJlOyAgICAgICAgICAgICAgIC8qKjwgVGVtcGVyYXR1cmUuICovCisgICAgICAgIH0gcG93ZXJfbW9uX3RlbXBlcmF0dXJlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB2Y2M7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFZDQy4gKi8KKyAgICAgICAgfSBwb3dlcl9tb25fdmNjOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCBiaWFzOyAgICAgICAgICAgICAgICAgICAgICAvKio8IEJpYXMuICovCisgICAgICAgIH0gcG93ZXJfbW9uX3R4X2JpYXM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHBvd2VyOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgUG93ZXIuICovCisgICAgICAgIH0gcG93ZXJfbW9uX3R4X3Bvd2VyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCBwb3dlcjsgICAgICAgICAgICAgICAgICAgICAvKio8IFBvd2VyLiAqLworICAgICAgICB9IHBvd2VyX21vbl9yeF9wb3dlcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBuZXR3b3JrX2Vwb25fcG9ydHNfY291bnQ7ICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gTmV0d29yayBFUE9OIFBvcnRzICovCisgICAgICAgICAgICB1aW50OF90ICpuZXR3b3JrX2Vwb25fcG9ydHM7ICAgICAgICAvKio8IE5ldHdvcmsgRVBPTiBQb3J0cy4gKi8KKyAgICAgICAgfSBuZXR3b3JrX3Bvbl9tYXA7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vbnVfcHNzdGF0ZSBzdGF0ZTsgIC8qKjwgU3RhdGUuICovCisgICAgICAgIH0gcHNzdGF0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBmaWVsZF9zZWxlY3Q7ICAgICAgICAgICAgICAgLyoqPCBUaGUgZmllbGQgc2VsZWN0IHRvIHVzZSBmb3IgU0xFICgwIG1lYW5zIGRpc2FibGUpICovCisgICAgICAgIH0gc2xlX21vZGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhcm5fdGFibGVfbW9kZSBsZWFybl90YWJsZV9tb2RlOyAgLyoqPCBMZWFybiBUYWJsZSBNb2RlLiAqLworICAgICAgICB9IGxlYXJuX3RhYmxlX21vZGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX2Jvb2wgc2lnbmFsX2RldGVjdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgV2hldGhlciBvciBub3Qgc2lnbmFsIGlzIGRldGVjdGVkICovCisgICAgICAgIH0gdHJhbnNjZWl2ZXJfc2lnbmFsX2RldGVjdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB1c2VyX3BvcnRfdG9fbmV0d29ya19wb3J0X2NvdW50OyAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gVXNlciBQb3J0IFRvIE5ldHdvcmsgUG9ydCAqLworICAgICAgICAgICAgdWludDhfdCAqdXNlcl9wb3J0X3RvX25ldHdvcmtfcG9ydDsgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBXaGljaCBuZXR3b3JrIHBvcnQgZWFjaCB1c2VyIHBvcnQgaXMgY3VycmVudGx5IGNvbm5lY3RlZCB0byAoMHhGRiBmb3Igbm90IGNvbm5lY3RlZCkgKi8KKyAgICAgICAgfSBjcm9zc2Jhcl9jb25maWc7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX2Jvb2wgYnVyc3RfYWN0aXZpdHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgV2hldGhlciBvciBub3QgdGhlcmUgaXMgYW55IGJ1cnN0IGFjdGl2aXR5IChMb1MpICovCisgICAgICAgIH0gdHJhbnNjZWl2ZXJfYnVyc3RfYWN0aXZpdHk7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgbmV0d29ya19wb3J0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgV2hpY2ggbmV0d29yayBwb3J0IHRoZSBJUE4gc2hvdWxkIHVzZSBmb3IgbWFuYWdlbWVudCAqLworICAgICAgICB9IGNvbnRyb2xfcG9ydDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX21hdGNoX21vZGUgbWF0Y2hfbW9kZTsgLyoqPCBNYXRjaCBNb2RlLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX2ZsYWdzIGZsYWdzOyAgICAgICAgICAgLyoqPCBGbGFncy4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgZGVmYXVsdF9saW5rX2luZGV4OyAgICAgLyoqPCBEZWZhdWx0IExpbmsgSW5kZXguICovCisgICAgICAgICAgICB1aW50OF90IGRlZmF1bHRfcXVldWVfaW5kZXg7ICAgIC8qKjwgRGVmYXVsdCBRdWV1ZSBJbmRleC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbWFwcGluZ3NfY291bnQ7ICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gTWFwcGluZ3MgKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9tYXBwaW5nICptYXBwaW5nczsgLyoqPCBNYXBwaW5ncy4gKi8KKyAgICAgICAgfSB2bGFuX2Rlc3RpbmF0aW9uczsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19lbmNyeXB0aW9uX21vZGUgbW9kZTsgICAgICAgICAgICAgICAvKio8IE1vZGUuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2VuY3J5cHRpb25fb3B0aW9ucyBvcHRpb25zOyAgICAgICAgIC8qKjwgT3B0aW9ucy4gKi8KKyAgICAgICAgfSBlbmNyeXB0aW9uX21vZGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbTsgICAgLyoqPCBTdHJlYW0uICovCisgICAgICAgICAgICB1aW50MzJfdCByZXZpc2lvbjsgIC8qKjwgUmV2aXNpb24uICovCisgICAgICAgIH0gaW50ZXJuYWxfdmVyc2lvbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19maXJtd2FyZV90aW1lc3RhbXAgdGltZXN0YW1wOyAgIC8qKjwgVGltZXN0YW1wLiAqLworICAgICAgICB9IGZpcm13YXJlX3RpbWVzdGFtcDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfcnVsZSBydWxlOyAgICAgIC8qKjwgUnVsZS4gKi8KKyAgICAgICAgfSBvbnVfcnVsZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Zsb3dfZGlyZWN0aW9uIGRpcmVjdGlvbjsgICAgICAgICAgIC8qKjwgRGlyZWN0aW9uLiAqLworICAgICAgICAgICAgdWludDhfdCBwb2xpY2VyX2lkOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgUG9saWNlciBJZC4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IGJ1cnN0X3NpemU7ICAgICAgICAgICAgICAgICAgICAvKio8IEJ1cnN0IFNpemUuICovCisgICAgICAgICAgICB1aW50MzJfdCB0cmFmZmljX3JhdGU7ICAgICAgICAgICAgICAgICAgLyoqPCBUcmFmZmljIFJhdGUuICovCisgICAgICAgIH0gcG9saWNlcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBudW1iZXJfb2Zfc2hhcGVyczsgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIFNoYXBlcnMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdW5pX3NoYXBlciAqdW5pX3NoYXBlcjsgLyoqPCBVbmkgU2hhcGVyLiAqLworICAgICAgICB9IHVuaV9zaGFwZXI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF9sb2FkX2xhYmVsIHZlcnNpb247ICAgIC8qKjwgTWF0dXJpdHkgb2YgZnJpbXdhcmUgKi8KKyAgICAgICAgfSBleHRfZmlybXdhcmVfdmVyc2lvbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2RpcmVjdGlvbiBkaXJlY3Rpb247ICAgICAgICAgICAgLyoqPCBEaXJlY3Rpb24gb2Yga2V5ICovCisgICAgICAgICAgICB1aW50OF90IGtleV9pbmRleDsgIC8qKjwgSW5kZXggb2Yga2V5ICovCisgICAgICAgICAgICB1aW50OF90IGtleV9sZW5ndGg7IC8qKjwgQnl0ZSBjb3VudCBvZiBrZXkgZGF0YSAqLworICAgICAgICAgICAgdWludDhfdCAqa2V5X2RhdGE7ICAvKio8IEtleSBkYXRhICovCisgICAgICAgIH0gZW5jcnlwdGlvbl9rZXk7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fYmFzZSBmaWxlX2luZm87ICAgLyoqPCBGaWxlIEluZm8uICovCisgICAgICAgIH0gZmlsZV9pbmZvOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHN5c3RlbV9ydWxlX29wdGlvbnM7ICAgICAgICAgICAgICAgIC8qKjwgT3B0aW9ucyBmb3Igc3lzdGVtIHJ1bGVzICovCisgICAgICAgIH0gc3lzdGVtX3J1bGVfb3B0aW9uczsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgbXR1OyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBNVFUuICovCisgICAgICAgIH0gbXR1OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fbnZzX3N0YXRlIHN0YXRlOyAgICAvKio8IFN0YXRlLiAqLworICAgICAgICB9IG52c19zdGF0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBwcmlvcml0eV9jb3VudDsgICAgICAgICAgICAgLyoqPCBQcmlvcml0eSBDb3VudC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnByaW9yaXR5X21hcDsgICAgICAgICAgICAgIC8qKjwgUHJpb3JpdHkgTWFwLiAqLworICAgICAgICB9IHF1ZXVlcHJpbWFwOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2NfYml0X2xvYWRpbmcgdmFsdWU7ICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gZXBvY19kb3duX2JpdF9sb2FkaW5nOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2NfYml0X2xvYWRpbmcgdmFsdWU7ICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gZXBvY191cF9iaXRfbG9hZGluZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXQgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGVwb2Nfc2RtX3BoYXNlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdCB2YWx1ZTsgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gZXBvY19zZG1fYW1wbGl0dWRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdCB2YWx1ZTsgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gZXBvY19zZG1fcXVhbnRpemVyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdCB2YWx1ZTsgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gZXBvY191bnVzZWQwOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdCB2YWx1ZTsgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gZXBvY191bnVzZWQxOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdCB2YWx1ZTsgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gZXBvY191bnVzZWQyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdCB2YWx1ZTsgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gZXBvY191bnVzZWQzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdCB2YWx1ZTsgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gZXBvY191bnVzZWQ0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MmJhc2UgcXVldWVfY29uZmlnOyAgIC8qKjwgUXVldWUgQ29uZmlnLiAqLworICAgICAgICB9IHF1ZXVlX2NvbmZpZ192MjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19mZWF0dXJlX3NldCBmZWF0dXJlX3NldDsgICAgICAgICAgICAvKio8IEZlYXR1cmUgU2V0LiAqLworICAgICAgICB9IGZlYXR1cmVfc2V0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fc3RkX3BoeV90eXBlIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc3RkX3BoeV90eXBlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX3NlcXVlbmNlX251bWJlciB2YWx1ZTsgICAgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc2VxdWVuY2VfbnVtYmVyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBwdWxzZV90aW1lOyAgICAvKio8IE1QQ1AgdGltZSB0byBwdWxzZS4gKi8KKyAgICAgICAgfSBtcGNwX2Nsb2NrOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb251X2Nsb2NrX3RyYW5zcG9ydF9jb25maWcgdmFsdWU7ICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBtcGNwX2Nsb2NrX2NvbXBlbnNhdGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgcm9idXN0bmVzc19jb3VudDsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUm9idXN0bmVzcyBDb3VudC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbG1xX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTE1RIENvdW50LiAqLworICAgICAgICAgICAgYmNtb3NfYm9vbCBmYXN0X2xlYXZlX2VuYWJsZTsgICAgICAgICAgICAgICAgICAgLyoqPCBGYXN0IExlYXZlIEVuYWJsZS4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9tY2FzdF9zbm9vcF9tb2RlIG1vZGU7ICAgICAgICAgIC8qKjwgTW9kZS4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9pcG1jX2dsb2JhbF9vcHRpb25zIG9wdGlvbnM7ICAgIC8qKjwgT3B0aW9ucy4gKi8KKyAgICAgICAgfSBtY2FzdF9nbG9iYWxfY29uZmlnOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9yZWNvcmQgdmFsdWU7ICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1jYXN0X2RvbWFpbl9jb25maWc7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdGltZTsgICAvKio8IFRoZSBhbW91bnQgb2YgdGltZSB0aGUgT05VIHNob3VsZCB3YWl0IGFmdGVyIGxvc3Mgb2Ygc2lnbmFsIG9yIGxvc3Mgb2YgZ2F0ZSB0byByZXNldCB0aGUgbGlua3MgaW4gMTAgbXMgaW5jcmVtZW50cy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfaG9sZG92ZXJfZmxhZ3MgZmxhZ3M7ICAgLyoqPCBPTlUgaG9sZG92ZXIgY29uZmlndXJhdGlvbiBmbGFncy4gKi8KKyAgICAgICAgfSBvbnVfaG9sZG92ZXI7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29kZSBhbGFybV9jb2RlOyAgLyoqPCBBbGFybSBDb2RlLiAqLworICAgICAgICAgICAgdWludDMyX3QgcmFpc2VfdGhyZXNob2xkOyAgICAgICAgICAgICAgICAgICAvKio8IFJhaXNlIFRocmVzaG9sZC4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IGNsZWFyX3RocmVzaG9sZDsgICAgICAgICAgICAgICAgICAgLyoqPCBDbGVhciBUaHJlc2hvbGQuICovCisgICAgICAgIH0gYWxhcm1fdGhyZXNob2xkOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IGNvdW50X29mX2ZhaWxzYWZlX21lY2g7ICAgICAgICAgICAgIC8qKjwgQ291bnQgT2YgRmFpbHNhZmUgTWVjaC4gKi8KKyAgICAgICAgICAgIGJjbW9zX2Jvb2wgZmFpbHNhZmVfc3RhdGU7ICAgICAgICAgICAgICAgICAgLyoqPCBGYWlsc2FmZSBTdGF0ZS4gKi8KKyAgICAgICAgfSBmYWlsc2FmZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3Qgc3RhdGlzdGljX2lkOyAgICAgICAgICAgICAgICAgICAgICAvKio8IFN0YXRpc3RpYyBJRC4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGludGVydmFsOyAgICAgIC8qKjwgSW50ZXJ2YWwuICovCisgICAgICAgIH0gcG9ydF9zdGF0c190aHJlc2hvbGRfaW50ZXJ2YWw7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IHN0YXRpc3RpY19pZDsgIC8qKjwgU3RhdGlzdGljIElELiAqLworICAgICAgICAgICAgdWludDE2X3QgaW50ZXJ2YWw7ICAgICAgLyoqPCBJbnRlcnZhbC4gKi8KKyAgICAgICAgfSBsaW5rX3N0YXRzX3RocmVzaG9sZF9pbnRlcnZhbDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX21hY19kdXBsZXhfc3RhdHVzIHN0YXR1czsgICAgICAgICAgIC8qKjwgU3RhdHVzLiAqLworICAgICAgICB9IHN0ZF9tYWNfZHVwbGV4X3N0YXR1czsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2F1dG9uZWdvdGlhdGVfYWRtaW5fc3RhdGUgc3RhdGU7ICAgIC8qKjwgU3RhdGUuICovCisgICAgICAgIH0gc3RkX2F1dG9fbmVnX2FkbWluX3N0YXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fbWF1X21lZGlhX2F2YWlsYWJsZSBzdGF0dXM7ICAgICAgICAgLyoqPCBTdGF0dXMuICovCisgICAgICAgIH0gc3RkX21hdV9tZWRpYV9hdmFpbDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX21kaV9tb2RlIG1vZGU7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTW9kZS4gKi8KKyAgICAgICAgfSBtZGlfY3Jvc3NvdmVyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19tYWNfYWRkcmVzcyBhZGRyZXNzOyAgLyoqPCBBZGRyZXNzLiAqLworICAgICAgICB9IHN0ZF9tYWNfYWRkcjsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlOworCisvKiogVGVrIE9OVSBRdWV1ZSBDb25maWcuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWcKK3sKKyAgICB1aW50OF90IHF1ZXVlX3NpemVzX2NvdW50OyAgLyoqPCBRdWV1ZSBTaXplcyBDb3VudC4gKi8KKyAgICB1aW50OF90ICpxdWV1ZV9zaXplczsgICAgICAgLyoqPCBRdWV1ZSBTaXplcy4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnOworCisvKiogVGVrIElHTVAgU25vb3BpbmcgUG9ydCBDb25maWcuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfc25vb3BpbmdfcG9ydF9jb25maWcKK3sKKyAgICB1aW50OF90IG51bWJlcl9vZl9pZ21wX2dyb3VwczsgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIE9mIElHTVAgR3JvdXBzLiAqLworICAgIHVpbnQ4X3QgcmVsYXRpdmVfcXVldWVfZm9yX2NsYXNzaWZpY2F0aW9uOyAgLyoqPCBSZWxhdGl2ZSBRdWV1ZSBGb3IgQ2xhc3NpZmljYXRpb24uICovCit9IGJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9zbm9vcGluZ19wb3J0X2NvbmZpZzsKKworLyoqIFRlayBPTlUgSUdNUCBHcm91cCBObyBWSUQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX2dyb3VwX25vX3ZpZAoreworICAgIGJjbW9zX2lwdjRfYWRkcmVzcyBncm91cDsgICAvKio8IEdyb3VwLiAqLworICAgIHVpbnQ4X3QgcG9ydHM7ICAgICAgICAgICAgICAvKio8IFBvcnRzLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX2dyb3VwX25vX3ZpZDsKKworLyoqIFRlayBBY3Rpb24gVmFsdWUgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYWN0aW9uIGxlYWY7ICAgLyoqPCBMZWFmLiAqLworICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzIG1hYzsgIC8qKjwgTUFDLiAqLworICAgICAgICB9IGFkZF9zdGF0aWNfZW50cnk7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzIG1hYzsgIC8qKjwgTUFDLiAqLworICAgICAgICB9IGRlbF9zdGF0aWNfZW50cnk7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHJ1bGVzX2NvdW50OyAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHJ1bGVzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZSAqcnVsZXM7ICAgICAgICAgICAgLyoqPCBSdWxlcy4gKi8KKyAgICAgICAgfSBhZGRfcnVsZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZSBydWxlczsgICAgICAgICAgICAgLyoqPCBSdWxlcy4gKi8KKyAgICAgICAgfSBuZXdfYWRkX3J1bGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHJ1bGVzX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHJ1bGVzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZSAqcnVsZXM7ICAgICAgICAgICAgLyoqPCBSdWxlcy4gKi8KKyAgICAgICAgfSBuZXdfZGVsX3J1bGU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHJ1bGVzX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHJ1bGVzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZSAqcnVsZXM7ICAgICAgICAgICAgLyoqPCBSdWxlcy4gKi8KKyAgICAgICAgfSBkZWxldGVfcnVsZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgZ3Bpb19jb25maWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBHUElPIENvbmZpZy4gKi8KKyAgICAgICAgfSBzZXRfZ3Bpb19jb25maWc7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgbGlua3NfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTGlua3MgQ291bnQuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWcgKmxpbmtzOyAgICAvKio8IExpbmtzLiAqLworICAgICAgICAgICAgdWludDhfdCBwb3J0c19jb3VudDsgICAgLyoqPCBQb3J0cyBDb3VudC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZyAqcG9ydHM7ICAgIC8qKjwgUG9ydHMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWcgbXVsdGljYXN0OyAvKio8IE11bHRpY2FzdC4gKi8KKyAgICAgICAgfSBzZXRfcXVldWVfY29uZmlnOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHJvYnVzdG5lc3NfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFJvYnVzdG5lc3MgQ291bnQuICovCisgICAgICAgICAgICB1aW50OF90IGxhc3RfbWVtYmVyX3F1ZXJ5X2NvdW50OyAgICAgICAgICAgICAgICAvKio8IExhc3QgTWVtYmVyIFF1ZXJ5IENvdW50LiAqLworICAgICAgICAgICAgdWludDhfdCBwb3J0c19jb3VudDsgICAgLyoqPCBQb3J0cyBDb3VudC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9zbm9vcGluZ19wb3J0X2NvbmZpZyAqcG9ydHM7ICAgICAgIC8qKjwgUG9ydHMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfZm9yd2FyZGluZ19xdWFsaWZlciBncnBfZm9yd2FyZDsgICAvKio8IEdycCBGb3J3YXJkLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX29wdGlvbnMgb3B0aW9uczsgICAgICAgICAgLyoqPCBPcHRpb25zLiAqLworICAgICAgICB9IHNldF9pZ21wX2NvbmZpZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBncm91cHNfY291bnQ7ICAgLyoqPCBHcm91cHMgQ291bnQuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX2dyb3VwX25vX3ZpZCAqZ3JvdXBzOyAgLyoqPCBHcm91cHMuICovCisgICAgICAgIH0gYWRkX2lnbXBfZ3JvdXA7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgbWF4X29hbV9yYXRlOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBNYXggT0FNIFJhdGUuICovCisgICAgICAgICAgICB1aW50OF90IG1pbl9vYW1fcmF0ZTsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTWluIE9BTSBSYXRlLiAqLworICAgICAgICB9IHNldF9vYW1fcmF0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3Qgb2ZmX3RpbWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE9mZiBUaW1lLiAqLworICAgICAgICB9IGJjX2xhc2VyX3Bvd2VyX29mZjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgdGltZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFRpbWUuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fc2xlZXBfb3B0aW9ucyBvcHRpb25zOyAgICAgIC8qKjwgT3B0aW9ucy4gKi8KKyAgICAgICAgfSBzbGVlcDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Zsb3dfZGlyZWN0aW9uIGRpcmVjdGlvbjsgICAvKio8IERpcmVjdGlvbi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgcG9saWNlcl9pZDsgICAgIC8qKjwgUG9saWNlciBJZC4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IGJ1cnN0X3NpemU7ICAgIC8qKjwgQnVyc3QgU2l6ZS4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IHRyYWZmaWNfcmF0ZTsgIC8qKjwgVHJhZmZpYyBSYXRlLiAqLworICAgICAgICB9IGVuYWJsZV9wb2xpY2VyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZmxvd19kaXJlY3Rpb24gZGlyZWN0aW9uOyAgIC8qKjwgRGlyZWN0aW9uLiAqLworICAgICAgICAgICAgdWludDhfdCBwb2xpY2VyX2lkOyAvKio8IFBvbGljZXIgSWQuICovCisgICAgICAgIH0gZGlzYWJsZV9wb2xpY2VyOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZXBvY19zdGF0X2dhdGhlcl9tb2RlcyBtb2RlOyAgICAgICAgLyoqPCBNb2RlLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Vwb2Nfc2RtMjUwc3RhdF9pbmRleCBzdGF0X2luZGV4OyAgIC8qKjwgU3RhdCBJbmRleC4gKi8KKyAgICAgICAgfSBnZXRfZXBvY19zZG1fc3RhdHM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9lcG9jX3N0YXRfZ2F0aGVyX21vZGVzIG1vZGU7ICAgICAgICAvKio8IE1vZGUuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZXBvY19jbWNfc3RhdF9pbmRleCBzdGF0X2luZGV4OyAgICAgLyoqPCBTdGF0IEluZGV4LiAqLworICAgICAgICB9IGdldF9lcG9jX2NtY19zdGF0czsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Vwb2Nfc3RhdF9nYXRoZXJfbW9kZXMgbW9kZTsgICAgICAgIC8qKjwgTW9kZS4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9lcG9jX2NudV9zdGF0X2luZGV4IHN0YXRfaW5kZXg7ICAgICAvKio8IFN0YXQgSW5kZXguICovCisgICAgICAgIH0gZ2V0X2Vwb2NfY251X3N0YXRzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHBvcnRfY291bnQ7ICAgICAgICAgLyoqPCBOdW1iZXIgb2YgVU5JIHBvcnRzLiAqLworICAgICAgICAgICAgdWludDhfdCAqcXVldWVfcGVyX3BvcnQ7ICAgIC8qKjwgV2hpY2ggbG9naWNhbCBxdWV1ZSBudW1iZXIgdG8gdXNlLCBpbmRleGVkIGJ5IFVOSSBwb3J0LiAqLworICAgICAgICB9IHNldF9kbl9iY2FzdF9xdWV1ZTsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2U7CisKKy8qKiBUZWsgVmFyIENvbnRhaW5lci4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lcgoreworICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfYnJhbmNoIGJyYW5jaDsgIC8qKjwgQnJhbmNoLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgbGVhZjsgICAgICAgICAgICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3Qgd2lkdGg7ICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgICAgICB9IGRlZjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdW5rbm93bl9jb3VudDsgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHVua25vd24uICovCisgICAgICAgICAgICB1aW50OF90ICp1bmtub3duOyAgICAgICAgICAgLyoqPCBVbmtub3duLiAqLworICAgICAgICB9IGVuZDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dCBvYmplY3RfY29udGV4dDsgIC8qKjwgT2JqZWN0IENvbnRleHQuICovCisgICAgICAgIH0gbmFtZV9iaW5kaW5nOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZSBhdHRyaWJ1dGU7ICAgICAgLyoqPCBBdHRyaWJ1dGUuICovCisgICAgICAgIH0gYXR0cmlidXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlIGFjdGlvbjsgICAgICAgLyoqPCBBY3Rpb24uICovCisgICAgICAgIH0gYWN0aW9uOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyOworCisvKiogVGVrIFNldCBSZXNwIEFjdGlvbiBWYWx1ZSBCYXNlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZQoreworICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hY3Rpb24gbGVhZjsgICAvKio8IExlYWYuICovCisgICAgdWludDhfdCB3aWR0aDsgICAgICAgICAgICAgICAgICAvKio8IFdpZHRoLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdW5rbm93bl9jb3VudDsgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdW5rbm93bi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnVua25vd247ICAgICAgIC8qKjwgVW5rbm93bi4gKi8KKyAgICAgICAgfSBkZWY7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgbGlua3NfY291bnQ7ICAgIC8qKjwgTGlua3MgQ291bnQuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWcgKmxpbmtzOyAgICAvKio8IExpbmtzLiAqLworICAgICAgICAgICAgdWludDhfdCBwb3J0c19jb3VudDsgICAgLyoqPCBQb3J0cyBDb3VudC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZyAqcG9ydHM7ICAgIC8qKjwgUG9ydHMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWcgbXVsdGljYXN0OyAvKio8IE11bHRpY2FzdC4gKi8KKyAgICAgICAgfSBnZXRfcXVldWVfY29uZmlnOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHJvYnVzdG5lc3NfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFJvYnVzdG5lc3MgQ291bnQuICovCisgICAgICAgICAgICB1aW50OF90IGxhc3RfbWVtYmVyX3F1ZXJ5X2NvdW50OyAgICAgICAgICAgICAgICAvKio8IExhc3QgTWVtYmVyIFF1ZXJ5IENvdW50LiAqLworICAgICAgICAgICAgdWludDhfdCBwb3J0c19jb3VudDsgICAgLyoqPCBQb3J0cyBDb3VudC4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9zbm9vcGluZ19wb3J0X2NvbmZpZyAqcG9ydHM7ICAgICAgIC8qKjwgUG9ydHMuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfZm9yd2FyZGluZ19xdWFsaWZlciBncnBfZm9yd2FyZDsgICAvKio8IEdycCBGb3J3YXJkLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX29wdGlvbnMgb3B0aW9uczsgICAgICAgICAgLyoqPCBPcHRpb25zLiAqLworICAgICAgICB9IGdldF9pZ21wX2NvbmZpZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBncm91cHNfY291bnQ7ICAgLyoqPCBHcm91cHMgQ291bnQuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX2dyb3VwX25vX3ZpZCAqZ3JvdXBzOyAgLyoqPCBHcm91cHMuICovCisgICAgICAgIH0gZ2V0X2lnbXBfZ3JvdXBfaW5mbzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBtYXhfb2FtX3JhdGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTWF4IE9BTSBSYXRlLiAqLworICAgICAgICAgICAgdWludDhfdCBtaW5fb2FtX3JhdGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTWluIE9BTSBSYXRlLiAqLworICAgICAgICB9IGdldF9vYW1fcmF0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgYm9vdF92ZXJzaW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQm9vdCBWZXJzaW9uLiAqLworICAgICAgICAgICAgdWludDMyX3QgYm9vdF9jcmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQm9vdCBDUkMuICovCisgICAgICAgICAgICB1aW50MTZfdCBwZXJzb25hbGl0eV92ZXJzaW9uOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBQZXJzb25hbGl0eSBWZXJzaW9uLiAqLworICAgICAgICAgICAgdWludDMyX3QgcGVyc29uYWxpdHlfY3JjOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUGVyc29uYWxpdHkgQ1JDLiAqLworICAgICAgICAgICAgdWludDE2X3QgYXBwMHZlcnNpb247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQVBQMCBWZXJzaW9uLiAqLworICAgICAgICAgICAgdWludDMyX3QgYXBwMGNyYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQVBQMCBDUkMuICovCisgICAgICAgICAgICB1aW50MTZfdCBhcHAxdmVyc2lvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBBUFAxIFZlcnNpb24uICovCisgICAgICAgICAgICB1aW50MzJfdCBhcHAxY3JjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBBUFAxIENSQy4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGRpYWdub3N0aWNfdmVyc2lvbjsgICAgICAgICAgICAgICAgICAgICAgICAvKio8IERpYWdub3N0aWMgVmVyc2lvbi4gKi8KKyAgICAgICAgICAgIHVpbnQzMl90IGRpYWdub3N0aWNfY3JjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IERpYWdub3N0aWMgQ1JDLiAqLworICAgICAgICB9IGdldF9sb2FkX2luZm87CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9lcG9jX3NkbTI1MHN0YXRfaW5kZXggc3RhdF9pbmRleDsgICAvKio8IFN0YXQgSW5kZXguICovCisgICAgICAgICAgICB1aW50OF90IGNvdW50ZXJfdmFsdWVfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gQ291bnRlciBWYWx1ZSAqLworICAgICAgICAgICAgdWludDhfdCAqY291bnRlcl92YWx1ZTsgICAgICAgICAvKio8IExlbmd0aCBvZiB6ZXJvIGlmIG5vdCBhcHBsaWNhYmxlICovCisgICAgICAgICAgICB1aW50OF90IHJhdGVfdmFsdWVfY291bnQ7ICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIFJhdGUgVmFsdWUgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnJhdGVfdmFsdWU7ICAgICAgICAgICAgLyoqPCBMZW5ndGggb2YgemVybyBpZiBub3QgYXBwbGljYWJsZSAqLworICAgICAgICAgICAgdWludDhfdCByYXRlX2ludGVydmFsX2NvdW50OyAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBSYXRlIEludGVydmFsICovCisgICAgICAgICAgICB1aW50OF90ICpyYXRlX2ludGVydmFsOyAgICAgICAgIC8qKjwgTGVuZ3RoIG9mIHplcm8gaWYgbm90IGFwcGxpY2FibGUgKi8KKyAgICAgICAgfSBnZXRfZXBvY19zZG1fc3RhdHM7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9lcG9jX2NtY19zdGF0X2luZGV4IHN0YXRfaW5kZXg7IC8qKjwgU3RhdCBJbmRleC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgY291bnRlcl92YWx1ZV9jb3VudDsgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIENvdW50ZXIgVmFsdWUgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKmNvdW50ZXJfdmFsdWU7ICAgICAgICAgLyoqPCBMZW5ndGggb2YgemVybyBpZiBub3QgYXBwbGljYWJsZSAqLworICAgICAgICAgICAgdWludDhfdCByYXRlX3ZhbHVlX2NvdW50OyAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBSYXRlIFZhbHVlICovCisgICAgICAgICAgICB1aW50OF90ICpyYXRlX3ZhbHVlOyAgICAgICAgICAgIC8qKjwgTGVuZ3RoIG9mIHplcm8gaWYgbm90IGFwcGxpY2FibGUgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgcmF0ZV9pbnRlcnZhbF9jb3VudDsgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gUmF0ZSBJbnRlcnZhbCAqLworICAgICAgICAgICAgdWludDhfdCAqcmF0ZV9pbnRlcnZhbDsgICAgICAgICAvKio8IExlbmd0aCBvZiB6ZXJvIGlmIG5vdCBhcHBsaWNhYmxlICovCisgICAgICAgIH0gZ2V0X2Vwb2NfY21jX3N0YXRzOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZXBvY19jbnVfc3RhdF9pbmRleCBzdGF0X2luZGV4OyAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBDb3VudGVyIFZhbHVlICovCisgICAgICAgICAgICB1aW50OF90IGNvdW50ZXJfdmFsdWVfY291bnQ7ICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBDb3VudGVyIFZhbHVlICovCisgICAgICAgICAgICB1aW50OF90ICpjb3VudGVyX3ZhbHVlOyAgICAgICAgIC8qKjwgTGVuZ3RoIG9mIHplcm8gaWYgbm90IGFwcGxpY2FibGUgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgcmF0ZV92YWx1ZV9jb3VudDsgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gUmF0ZSBWYWx1ZSAqLworICAgICAgICAgICAgdWludDhfdCAqcmF0ZV92YWx1ZTsgICAgICAgICAgICAvKio8IExlbmd0aCBvZiB6ZXJvIGlmIG5vdCBhcHBsaWNhYmxlICovCisgICAgICAgICAgICB1aW50OF90IHJhdGVfaW50ZXJ2YWxfY291bnQ7ICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIFJhdGUgSW50ZXJ2YWwgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnJhdGVfaW50ZXJ2YWw7ICAgICAgICAgLyoqPCBMZW5ndGggb2YgemVybyBpZiBub3QgYXBwbGljYWJsZSAqLworICAgICAgICB9IGdldF9lcG9jX2NudV9zdGF0czsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBwb3J0X2NvdW50OyAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBVTkkgcG9ydHMuICovCisgICAgICAgICAgICB1aW50OF90ICpxdWV1ZV9wZXJfcG9ydDsgICAgICAgIC8qKjwgV2hpY2ggbG9naWNhbCBxdWV1ZSBudW1iZXIgdG8gdXNlLCBpbmRleGVkIGJ5IFVOSSBwb3J0LiAqLworICAgICAgICB9IGdldF9kbl9iY2FzdF9xdWV1ZTsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2U7CisKKy8qKiBUZWsgU2V0IFJlc3AgVmFyIENvbnRhaW5lciBCYXNlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF92YXJfY29udGFpbmVyX2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2JyYW5jaCBicmFuY2g7ICAvKio8IEJyYW5jaC4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGxlYWY7ICAgICAgICAgICAgICAvKio8IExlYWYuICovCisgICAgICAgICAgICB1aW50OF90IHdpZHRoOyAgICAgICAgICAgICAgLyoqPCBXaWR0aC4gKi8KKyAgICAgICAgfSBkZWY7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHVua25vd25fY291bnQ7ICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB1bmtub3duLiAqLworICAgICAgICAgICAgdWludDhfdCAqdW5rbm93bjsgICAgICAgICAgIC8qKjwgVW5rbm93bi4gKi8KKyAgICAgICAgfSBlbmQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHQgb2JqZWN0X2NvbnRleHQ7ICAgICAgLyoqPCBPYmplY3QgQ29udGV4dC4gKi8KKyAgICAgICAgfSBuYW1lX2JpbmRpbmc7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlIGF0dHJpYnV0ZTsgICAgICAgICAgLyoqPCBBdHRyaWJ1dGUuICovCisgICAgICAgIH0gYXR0cmlidXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlIGFjdGlvbjsgIC8qKjwgQWN0aW9uLiAqLworICAgICAgICB9IGFjdGlvbjsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfdmFyX2NvbnRhaW5lcl9iYXNlOworCisvKiogVGVrIFZlbmRvciBFeHRlbmRlZC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19vcGNvZGUgb3A7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgT3AuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBmaXJtd2FyZV92ZXJzaW9uOyAgICAgICAgICAgICAgICAgIC8qKjwgRmlybXdhcmUgVmVyc2lvbi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3Qgb3VpWzNdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBPVUkuICovCisgICAgICAgICAgICB1aW50MTZfdCBwcm9kdWN0X2lkOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgUHJvZHVjdCBJRC4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IHZlcnNpb247ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBWZXJzaW9uLiAqLworICAgICAgICAgICAgdWludDhfdCBleHRlbmRlZF9pZFs2NF07ICAgICAgICAgICAgICAgICAgICAvKio8IEV4dGVuZGVkIElELiAqLworICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgYmFzZV9tYWM7ICAgICAgICAgICAgICAgICAvKio8IEJhc2UgTUFDLiAqLworICAgICAgICAgICAgdWludDhfdCBtYXhfbGlua3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE1heCBMaW5rcy4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgbnVtX3BvcnRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW0gUG9ydHMuICovCisgICAgICAgICAgICB1aW50OF90IG51bV9hc3NpZ25hYmxlX3Vwc3RyZWFtX3F1ZXVlczsgICAgIC8qKjwgTnVtIEFzc2lnbmFibGUgVXBzdHJlYW0gUXVldWVzLiAqLworICAgICAgICAgICAgdWludDhfdCBtYXhfcXVldWVzX3Blcl9saW5rX3Vwc3RyZWFtOyAgICAgICAvKio8IE1heCBRdWV1ZXMgUGVyIExpbmsgVXBzdHJlYW0uICovCisgICAgICAgICAgICB1aW50OF90IHF1ZXVlX2luY3JlbWVudF91cHN0cmVhbTsgICAgICAgICAgIC8qKjwgUXVldWUgSW5jcmVtZW50IFVwc3RyZWFtLiAqLworICAgICAgICAgICAgdWludDhfdCBudW1fYXNzaWduYWJsZV9kb3duc3RyZWFtX3F1ZXVlczsgICAvKio8IE51bSBBc3NpZ25hYmxlIERvd25zdHJlYW0gUXVldWVzLiAqLworICAgICAgICAgICAgdWludDhfdCBtYXhfcXVldWVzX3Blcl9saW5rX2Rvd25zdHJlYW07ICAgICAvKio8IE1heCBRdWV1ZXMgUGVyIExpbmsgRG93bnN0cmVhbS4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgcXVldWVfaW5jcmVtZW50X2Rvd25zdHJlYW07ICAgICAgICAgLyoqPCBRdWV1ZSBJbmNyZW1lbnQgRG93bnN0cmVhbS4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IHVwc3RyZWFtX2J1ZmZlcl9hdmFpbGFibGU7ICAgICAgICAgLyoqPCBVcHN0cmVhbSBCdWZmZXIgQXZhaWxhYmxlLiAqLworICAgICAgICAgICAgdWludDE2X3QgZG93bnN0cmVhbV9idWZmZXJfYXZhaWxhYmxlOyAgICAgICAvKio8IERvd25zdHJlYW0gQnVmZmVyIEF2YWlsYWJsZS4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGplZGVjX21hbnVmYWN0dXJlcl9pZDsgICAgICAgICAgICAgLyoqPCBKRURFQyBNYW51ZmFjdHVyZXIgSUQuICovCisgICAgICAgICAgICB1aW50MTZfdCBjaGlwX2lkOyAgICAgICAvKio8IENoaXAgSUQuICovCisgICAgICAgICAgICB1aW50MzJfdCBjaGlwX3ZlcnNpb247ICAvKio8IENoaXAgVmVyc2lvbi4gKi8KKyAgICAgICAgfSBpbmZvOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCB2YXJzX2NvdW50OyAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB2YXJzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY3JpcHRvciAqdmFyczsgICAgICAgICAgICAgICAvKio8IFZhcnMuICovCisgICAgICAgIH0gZ2V0X3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHZhcnNfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdmFycy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lciAqdmFyczsgICAgICAgICAgICAgICAgLyoqPCBWYXJzLiAqLworICAgICAgICB9IGdldF9yZXNwb25zZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgdmFyc19jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB2YXJzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyICp2YXJzOyAgICAgICAgICAgICAgICAvKio8IFZhcnMuICovCisgICAgICAgIH0gc2V0X3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHZhcnNfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdmFycy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfdmFyX2NvbnRhaW5lcl9iYXNlICp2YXJzOyAgLyoqPCBWYXJzLiAqLworICAgICAgICB9IHNldF9yZXNwb25zZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2llZWVfcmVnaXN0ZXJfZmxhZ3MgZmxhZ3M7ICAgICAgICAgICAgICAvKio8IEZsYWdzLiAqLworICAgICAgICAgICAgdWludDE2X3QgbXVsdGljYXN0X2xsaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBNdWx0aWNhc3QgTExJRC4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IHVuaWNhc3RfbGxpZDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVW5pY2FzdCBMTElELiAqLworICAgICAgICB9IG11bHRpY2FzdF9yZWdpc3RlcjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2llZWVfcmVnaXN0ZXJfYWNrX2ZsYWdzIGZsYWdzOyAgLyoqPCBGbGFncy4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IG11bHRpY2FzdF9sbGlkOyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTXVsdGljYXN0IExMSUQuICovCisgICAgICAgICAgICB1aW50MTZfdCB1bmljYXN0X2xsaWQ7ICAvKio8IFVuaWNhc3QgTExJRC4gKi8KKyAgICAgICAgfSBtdWx0aWNhc3RfcmVnaXN0ZXJfcmVzcG9uc2U7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qga2V5X251bWJlcjsgICAgIC8qKjwgS2V5IE51bWJlci4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3Qga2V5X2xlbmd0aDsgICAgIC8qKjwgS2V5IExlbmd0aC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKmtleV9kYXRhOyAgICAgIC8qKjwgS2V5IERhdGEuICovCisgICAgICAgIH0ga2V5X2V4Y2hhbmdlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBibG9jazsgICAgICAgICAvKio8IEJsb2NrLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19maWxlX3RyYW5zZmVyX2Vycm9yIGVycm9yOyAgLyoqPCBFcnJvci4gKi8KKyAgICAgICAgfSBmaWxlX2FjazsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgYmxvY2s7ICAgICAvKio8IEJsb2NrLiAqLworICAgICAgICAgICAgdWludDE2X3QgbGVuZ3RoOyAgICAvKio8IExlbmd0aC4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKmRhdGE7ICAgICAgLyoqPCBEYXRhLiAqLworICAgICAgICB9IGZpbGVfZGF0YTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19maWxlX3R5cGUgZmlsZV90eXBlOyAgICAgICAgICAgICAgICAvKio8IEZpbGUgVHlwZS4gKi8KKyAgICAgICAgfSBmaWxlX3JlYWRfcmVxdWVzdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19maWxlX3R5cGUgZmlsZV90eXBlOyAgICAgICAgICAgICAgICAvKio8IEZpbGUgVHlwZS4gKi8KKyAgICAgICAgfSBmaWxlX3dyaXRlX3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHZhcmlhYmxlX2NvbnRhaW5lcnNfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdmFyaWFibGVfY29udGFpbmVycy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lciAqdmFyaWFibGVfY29udGFpbmVyczsgLyoqPCBWYXJpYWJsZSBDb250YWluZXJzLiAqLworICAgICAgICB9IHVuYWNrZWRfYWN0aW9uOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWQ7CisKKy8qKiBQTUMgRmlsZSBCYXNlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfb3AgZmlsZV9vcDsgICAgICAgICAgICAgICAgLyoqPCBGaWxlIE9wLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgZmlsZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IEZpbGUuICovCisgICAgICAgICAgICB1aW50MzJfdCBub3RfZmlsZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTm90IEZpbGUuICovCisgICAgICAgICAgICB1aW50MTZfdCBjcmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQ3JjLiAqLworICAgICAgICB9IGhlYWQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGxlbmd0aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMZW5ndGguICovCisgICAgICAgICAgICB1aW50MTZfdCBibG9jazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQmxvY2suICovCisgICAgICAgICAgICB1aW50MzJfdCBkYXRhX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIGRhdGEuICovCisgICAgICAgICAgICB1aW50OF90ICpkYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRGF0YS4gKi8KKyAgICAgICAgfSBkYXRhOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBpZHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgSW5kZXguICovCisgICAgICAgIH0gaWR4OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfb3AgZnJhbWVfdHlwZV9hY2s7IC8qKjwgRnJhbWUgVHlwZSBBY2suICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fcG1jX2Vycm9yX2NvZGUgZXJyb3JfY29kZTsgIC8qKjwgRXJyb3IgQ29kZS4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGJsb2NrX3J4OyAgLyoqPCBCbG9jayBSeC4gKi8KKyAgICAgICAgfSBhY2s7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfYmFzZTsKKworLyoqIFBNQyBWZW5kb3IgRXh0ZW5kZWQgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9wbWNfdmVuZG9yX2V4dGVuZGVkX2Jhc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fcG1jX29wX2NvZGUgb3A7IC8qKjwgT3AuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfYmFzZSBmaWxlX2luZm87ICAgIC8qKjwgRmlsZSBJbmZvLiAqLworICAgICAgICB9IGZpcm13YXJlX3VwZGF0ZTsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9wbWNfdmVuZG9yX2V4dGVuZGVkX2Jhc2U7CisKKy8qKiBWZW5kb3IgRXh0ZW5kZWQgT0FNIEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fdmVuZG9yX2V4dGVuZGVkX29hbV9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpIG91aTsgICAgICAgICAgICAgICAgICAgICAvKio8IE9VSS4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHVua25vd25fY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHVua25vd24uICovCisgICAgICAgICAgICB1aW50OF90ICp1bmtub3duOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFVua25vd24uICovCisgICAgICAgIH0gZGVmOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlIHZhbHVlOyAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGN0YzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWQgdmFsdWU7ICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSB0ZWs7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9wbWNfdmVuZG9yX2V4dGVuZGVkX2Jhc2UgdmFsdWU7IC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gcG1jOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZSB2YWx1ZTsgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBkcG9lOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlIHZhbHVlOyAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBrdDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NvbmZpZ19iYXNlIGNvbmZpZzsgICAgICAgICAgIC8qKjwgQ29uZmlnLiAqLworICAgICAgICB9IGRhc2FuOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHZlcnNpb247ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBWZXJzaW9uIG51bWJlciAqLworICAgICAgICAgICAgdWludDE2X3Qgc2VxdWVuY2VfbnVtYmVyOyAgICAgICAgICAgICAgIC8qKjwgU2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBmcmFtZSB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhlIE9BTSBtZXNzYWdlICovCisgICAgICAgICAgICB1aW50MTZfdCBudW1fdG90YWxfZXhwZWN0ZWRfcGFja2V0czsgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHBhY2tldHMgcmVxdWlyZWQgZm9yIHRoZSBPQU0gbWVzc2FnZSB0byBiZSBjb21wbGV0ZSAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlIHBkdTsgIC8qKjwgVGhlIEJSQ00gT0FNIFBEVSBkYXRhICovCisgICAgICAgIH0gYnJjbTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2UgdmFsdWU7ICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc2llcG9uX2E7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fdmVuZG9yX2V4dGVuZGVkX29hbV9iYXNlOworCisvKiogUm9vdCBzdHJ1Y3R1cmUgZm9yIE9BTSBtZXNzYWdlcyAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudAoreworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fb3Bjb2RlIGNvZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQ29kZS4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHRsdnNfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB0bHZzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X2Jhc2UgKnRsdnM7ICAgICAgICAgICAgICAgIC8qKjwgVExWcy4gKi8KKyAgICAgICAgfSBpbmZvOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBzZXF1ZW5jZV9udW1iZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBTZXF1ZW5jZSBOdW1iZXIuICovCisgICAgICAgICAgICB1aW50MzJfdCB0bHZzX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGx2cy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3Rsdl9iYXNlICp0bHZzOyAgICAgICAgICAvKio8IFRMVnMuICovCisgICAgICAgIH0gZXZlbnRfbm90aWZpY2F0aW9uOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCB2YXJzX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdmFycy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV92YXJfZGVzY3JpcHRvcl9iYXNlICp2YXJzOyAgICAgICAgICAvKio8IFZhcnMuICovCisgICAgICAgIH0gdmFyX3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHZhcnNfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiB2YXJzLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZSAqdmFyczsgICAgICAgICAgIC8qKjwgVmFycy4gKi8KKyAgICAgICAgfSB2YXJfcmVzcG9uc2U7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9yZW1vdGVfbG9vcGJhY2tfY29tbWFuZCBjb21tYW5kOyAgICAvKio8IENvbW1hbmQuICovCisgICAgICAgIH0gbG9vcGJhY2tfY29udHJvbDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3ZlbmRvcl9leHRlbmRlZF9vYW1fYmFzZSB2YWx1ZTsgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gb3JnYW5pemF0aW9uX3NwZWNpZmljOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudDsKKworLyoqIE1hc3RlciBFbmQgUG9pbnQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2VuZF9wb2ludAoreworICAgIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfZW5kX3BvaW50X3R5cGUgdHlwZTsgLyoqPCBUeXBlLiAqLworICAgIHVpbnQ4X3QgaWQ7IC8qKjwgSUQuICovCit9IGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfZW5kX3BvaW50OworCisvKiogT05VIE1hc3RlciBPQU0gQ29udGVudC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX29hbV9jb250ZW50Cit7CisgICAgdWludDE2X3QgbGluazsgIC8qKjwgTGluay4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50IG9hbV9jb250ZW50OyAgICAvKio8IE9BTSBDb250ZW50LiAqLworfSBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9vYW1fY29udGVudDsKKworLyoqIE9BTSBSZWcgSW5mbyBWZW5kb3IgT1VJLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3Jfb3VpCit7CisgICAgdWludDI0X3Qgb3VpOyAgIC8qKjwgVmVuZG9yIE9VSSB0byByZWdpc3RlciAqLworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbiBhY3Rpb247IC8qKjwgUmVnaXN0cmF0aW9uIGFjdGlvbiB0byBwZXJmb3JtIGZvciB2ZW5kb3IgT1VJIChNVVNUIGJlIFJlZ2lzdGVyIG9yIFVucmVnaXN0ZXIpLiAqLworICAgIHVpbnQxNl90IGxlbmd0aF9yZXNlcnZlZDsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdyAqLworfSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvcl9vdWk7CisKKy8qKiBPQU0gUmVnIEluZm8gVmVuZG9yLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3IKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb24gYWN0aW9uOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgUmVnaXN0cmF0aW9uIGFjdGlvbiB0byBwZXJmb3JtIGZvciB2ZW5kb3Igc3BlY2lmaWMgSW5mbyBUTFZzLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB2ZW5kb3Jfb3VpX3JlZ19jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgdmVuZG9yIE9VSSByZWdpc3RyYXRpb25zICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvcl9vdWkgKnZlbmRvcl9vdWlfcmVnOyAgICAvKio8IFZlbmRvciBPVUkgcmVnaXN0cmF0aW9ucyAqLworICAgICAgICB9IGNvbnQ7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvcjsKKworLyoqIE9BTSBSZWcgSW5mbyBUTFYuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3RsdgoreworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdHlwZSB0eXBlOyAgICAgICAgICAgICAgICAgLyoqPCBJbmZvIFRMViB0eXBlIHRvIHJlZ2lzdGVyICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb24gYWN0aW9uOyAvKio8IFJlZ2lzdHJhdGlvbiBhY3Rpb24gdG8gcGVyZm9ybSBmb3IgSW5mbyBUTFYgdHlwZS4gKi8KKyAgICAgICAgICAgIHVpbnQxNl90IGxlbmd0aF9yZXNlcnZlZDsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdyAqLworICAgICAgICB9IGRlZjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3IgdmFsdWU7ICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSB2ZW5kb3I7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3RsdjsKKworLyoqIE9BTSBSZWcgSW5mbyBDb250LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19jb250Cit7CisgICAgdWludDhfdCBpbmZvX3JlZ19jb3VudDsgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBJbmZvIFRMViB0eXBlIHJlZ2lzdHJhdGlvbnMgKG1heGltdW0gb25lIHJlZ2lzdHJhdGlvbiBwZXIgdHlwZSkuICovCisgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb190bHYgKmluZm9fcmVnOyAvKio8IEluZm8gVExWIHR5cGUgcmVnaXN0cmF0aW9ucyAqLworfSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX2NvbnQ7CisKKy8qKiBPQU0gUmVnIEluZm8uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uIGFjdGlvbjsgICAgIC8qKjwgUmVnaXN0cmF0aW9uIGFjdGlvbiB0byBwZXJmb3JtIGZvciBpbmZvIGZyYW1lcyAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19jb250IHZhbHVlOyAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGNvbnQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fY29udCB2YWx1ZTsgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSByZWdpc3Rlcl9hbmRfY29udGludWU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fY29udCB2YWx1ZTsgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSB1bnJlZ2lzdGVyX2FuZF9jb250aW51ZTsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm87CisKKy8qKiBPQU0gUmVnIENUQyBWYXIgRGVzYy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJfZGVzYworeworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfYnJhbmNoIGJyYW5jaDsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBCcmFuY2guICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBsZWFmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IExlYWYuICovCisgICAgICAgIH0gZGVmOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlIGxlYWY7ICAgICAgICAvKio8IExlYWYuICovCisgICAgICAgIH0gYXR0cmlidXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uIGxlYWY7ICAgICAgICAgICAvKio8IExlYWYuICovCisgICAgICAgIH0gYWN0aW9uOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfZXh0X2F0dHJpYnV0ZSBsZWFmOyAgICAvKio8IExlYWYuICovCisgICAgICAgIH0gZXh0X2F0dHJpYnV0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hY3Rpb24gbGVhZjsgICAgICAgLyoqPCBMZWFmLiAqLworICAgICAgICB9IGV4dF9hY3Rpb247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYXR0cmlidXRlIGxlYWY7ICAgICAgICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgfSBrdGF0dHJpYnV0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hY3Rpb24gbGVhZjsgICAgICAgICAgICAgLyoqPCBMZWFmLiAqLworICAgICAgICB9IGt0YWN0aW9uOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3Zhcl9kZXNjOworCisvKiogT0FNIFJlZyBDVEMgVmFyaWFibGUuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGUKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyX2Rlc2MgZGVzY3JpcHRvcjsgICAgLyoqPCBDVEMgdmFyaWFibGUgZGVzY3JpcHRvciAqLworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbiBhY3Rpb247ICAgICAvKio8IFJlZ2lzdHJhdGlvbiBhY3Rpb24gdG8gcGVyZm9ybSBmb3IgdmFyaWFibGUgZGVzY3JpcHRvciAoTVVTVCBiZSBSZWdpc3RlciBvciBVbnJlZ2lzdGVyKS4gKi8KKyAgICB1aW50MTZfdCBsZW5ndGhfcmVzZXJ2ZWQ7ICAgLyoqPCBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93ICovCit9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZTsKKworLyoqIE9BTSBSZWcgQ1RDIFZhcmlhYmxlIExpc3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfbGlzdAoreworICAgIHVpbnQ4X3QgdmFyaWFibGVfY291bnQ7IC8qKjwgTnVtYmVyIG9mIENUQyB2YXJpYWJsZSByZWdpc3RyYXRpb25zICovCisgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlICp2YXJpYWJsZXM7ICAgIC8qKjwgQ1RDIHZhcmlhYmxlIHJlZ2lzdHJhdGlvbnMgKi8KK30gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlX2xpc3Q7CisKKy8qKiBPQU0gUmVnIENUQyBPcCBWYXJpYWJsZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcF92YXJpYWJsZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbiBhY3Rpb247ICAgICAgICAgICAgIC8qKjwgUmVnaXN0cmF0aW9uIGFjdGlvbiB0byBwZXJmb3JtIGZvciBDVEMgdmFyaWFibGUgcmVxdWVzdHMuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfbGlzdCB2YWx1ZTsgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBjb250OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfbGlzdCB2YWx1ZTsgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSByZWdpc3Rlcl9hbmRfY29udGludWU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZV9saXN0IHZhbHVlOyAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHVucmVnaXN0ZXJfYW5kX2NvbnRpbnVlOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wX3ZhcmlhYmxlOworCisvKiogT0FNIFJlZyBDVEMgT3Bjb2RlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wY29kZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9jdGNfb3Bjb2RlIG9wY29kZTsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBPcGNvZGUgdG8gcmVnaXN0ZXIgKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbiBhY3Rpb247IC8qKjwgUmVnaXN0cmF0aW9uIGFjdGlvbiB0byBwZXJmb3JtIGZvciBDVEMgb3Bjb2RlICovCisgICAgICAgICAgICB1aW50MTZfdCBsZW5ndGhfcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cgKi8KKyAgICAgICAgfSBkZWY7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcF92YXJpYWJsZSB2YWx1ZTsgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gZ2V0X3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcF92YXJpYWJsZSB2YWx1ZTsgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc2V0X3JlcXVlc3Q7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3Bjb2RlOworCisvKiogT0FNIFJlZyBDVEMgQ29udC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19jb250Cit7CisgICAgdWludDhfdCBvcGNvZGVfY291bnQ7ICAgLyoqPCBOdW1iZXIgb2YgQ1RDIG9wY29kZSByZWdpc3RyYXRpb25zICovCisgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wY29kZSAqb3Bjb2RlczsgICAgLyoqPCBDVEMgb3Bjb2RlIHJlZ2lzdHJhdGlvbnMgKi8KK30gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX2NvbnQ7CisKKy8qKiBPQU0gUmVnIENUQy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0YworeworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbiBhY3Rpb247IC8qKjwgUmVnaXN0cmF0aW9uIGFjdGlvbiB0byBwZXJmb3JtIGZvciBDVEMgT1VJICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfY29udCB2YWx1ZTsgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBjb250OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfY29udCB2YWx1ZTsgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSByZWdpc3Rlcl9hbmRfY29udGludWU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19jb250IHZhbHVlOyAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHVucmVnaXN0ZXJfYW5kX2NvbnRpbnVlOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjOworCisvKiogT0FNIFJlZyBUZWsgVmFyIERlc2MuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyX2Rlc2MKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2JyYW5jaCBicmFuY2g7ICAgICAgICAgICAgICAgICAgLyoqPCBCcmFuY2guICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBsZWFmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgfSBkZWY7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hdHRyaWJ1dGUgbGVhZjsgICAgLyoqPCBMZWFmLiAqLworICAgICAgICB9IGF0dHJpYnV0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2FjdGlvbiBsZWFmOyAgICAgICAvKio8IExlYWYuICovCisgICAgICAgIH0gYWN0aW9uOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3Zhcl9kZXNjOworCisvKiogT0FNIFJlZyBUZWsgVmFyaWFibGUuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGUKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyX2Rlc2MgZGVzY3JpcHRvcjsgICAgLyoqPCBUZWsgdmFyaWFibGUgZGVzY3JpcHRvciAqLworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbiBhY3Rpb247ICAgICAvKio8IFJlZ2lzdHJhdGlvbiBhY3Rpb24gdG8gcGVyZm9ybSBmb3IgdmFyaWFibGUgZGVzY3JpcHRvciAoTVVTVCBiZSBSZWdpc3RlciBvciBVbnJlZ2lzdGVyKS4gKi8KKyAgICB1aW50MTZfdCBsZW5ndGhfcmVzZXJ2ZWQ7ICAgLyoqPCBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93ICovCit9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZTsKKworLyoqIE9BTSBSZWcgVGVrIFZhcmlhYmxlIExpc3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfbGlzdAoreworICAgIHVpbnQ4X3QgdmFyaWFibGVfY291bnQ7IC8qKjwgTnVtYmVyIG9mIFRlayB2YXJpYWJsZSByZWdpc3RyYXRpb25zICovCisgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlICp2YXJpYWJsZXM7ICAgIC8qKjwgVGVrIHZhcmlhYmxlIHJlZ2lzdHJhdGlvbnMgKi8KK30gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlX2xpc3Q7CisKKy8qKiBPQU0gUmVnIFRlayBPcCBWYXJpYWJsZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcF92YXJpYWJsZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbiBhY3Rpb247ICAgICAgICAgICAgIC8qKjwgUmVnaXN0cmF0aW9uIGFjdGlvbiB0byBwZXJmb3JtIGZvciBUZWsgdmFyaWFibGUgcmVxdWVzdHMuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfbGlzdCB2YWx1ZTsgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBjb250OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfbGlzdCB2YWx1ZTsgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSByZWdpc3Rlcl9hbmRfY29udGludWU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZV9saXN0IHZhbHVlOyAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHVucmVnaXN0ZXJfYW5kX2NvbnRpbnVlOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wX3ZhcmlhYmxlOworCisvKiogT0FNIFJlZyBUZWsgT3Bjb2RlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wY29kZQoreworICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfb3Bjb2RlIG9wY29kZTsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBPcGNvZGUgdG8gcmVnaXN0ZXIgKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbiBhY3Rpb247IC8qKjwgUmVnaXN0cmF0aW9uIGFjdGlvbiB0byBwZXJmb3JtIGZvciBUZWsgb3Bjb2RlICovCisgICAgICAgICAgICB1aW50MTZfdCBsZW5ndGhfcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cgKi8KKyAgICAgICAgfSBkZWY7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcF92YXJpYWJsZSB2YWx1ZTsgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gZ2V0X3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcF92YXJpYWJsZSB2YWx1ZTsgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc2V0X3JlcXVlc3Q7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3Bjb2RlOworCisvKiogT0FNIFJlZyBUZWsgQ29udC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19jb250Cit7CisgICAgdWludDhfdCBvcGNvZGVfY291bnQ7ICAgLyoqPCBOdW1iZXIgb2YgVGVrIG9wY29kZSByZWdpc3RyYXRpb25zICovCisgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wY29kZSAqb3Bjb2RlczsgICAgLyoqPCBUZWsgb3Bjb2RlIHJlZ2lzdHJhdGlvbnMgKi8KK30gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX2NvbnQ7CisKKy8qKiBPQU0gUmVnIFRlay4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3RlaworeworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbiBhY3Rpb247IC8qKjwgUmVnaXN0cmF0aW9uIGFjdGlvbiB0byBwZXJmb3JtIGZvciBUZWsgT1VJICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfY29udCB2YWx1ZTsgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBjb250OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfY29udCB2YWx1ZTsgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSByZWdpc3Rlcl9hbmRfY29udGludWU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19jb250IHZhbHVlOyAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHVucmVnaXN0ZXJfYW5kX2NvbnRpbnVlOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrOworCisvKiogT0FNIFJlZyBEUG9FIFZhciBEZXNjLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJfZGVzYworeworICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX2JyYW5jaCBicmFuY2g7ICAgICAgICAgICAgICAgICAvKio8IEJyYW5jaC4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGxlYWY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBMZWFmLiAqLworICAgICAgICB9IGRlZjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2F0dHJpYnV0ZSBsZWFmOyAgICAvKio8IExlYWYuICovCisgICAgICAgIH0gc3RhbmRhcmRfYXR0cmlidXRlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uIGxlYWY7ICAgICAgIC8qKjwgTGVhZi4gKi8KKyAgICAgICAgfSBzdGFuZGFyZF9hY3Rpb247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYXR0cmlidXRlIGxlYWY7ICAgLyoqPCBMZWFmLiAqLworICAgICAgICB9IGV4dGVuZGVkX2F0dHJpYnV0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hY3Rpb24gbGVhZjsgICAgICAvKio8IExlYWYuICovCisgICAgICAgIH0gZXh0ZW5kZWRfYWN0aW9uOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJfZGVzYzsKKworLyoqIE9BTSBSZWcgRFBvRSBWYXJpYWJsZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGUKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3Zhcl9kZXNjIGRlc2NyaXB0b3I7ICAgLyoqPCBEUG9FIHZhcmlhYmxlIGRlc2NyaXB0b3IgKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb24gYWN0aW9uOyAgICAgLyoqPCBSZWdpc3RyYXRpb24gYWN0aW9uIHRvIHBlcmZvcm0gZm9yIHZhcmlhYmxlIGRlc2NyaXB0b3IgKE1VU1QgYmUgUmVnaXN0ZXIgb3IgVW5yZWdpc3RlcikuICovCisgICAgdWludDE2X3QgbGVuZ3RoX3Jlc2VydmVkOyAgIC8qKjwgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdyAqLworfSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlOworCisvKiogT0FNIFJlZyBEUG9FIFZhcmlhYmxlIExpc3QuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlX2xpc3QKK3sKKyAgICB1aW50OF90IHZhcmlhYmxlX2NvdW50OyAvKio8IE51bWJlciBvZiBEUG9FIHZhcmlhYmxlIHJlZ2lzdHJhdGlvbnMgKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlICp2YXJpYWJsZXM7ICAgLyoqPCBEUG9FIHZhcmlhYmxlIHJlZ2lzdHJhdGlvbnMgKi8KK30gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9saXN0OworCisvKiogT0FNIFJlZyBEUG9FIE9wIFZhcmlhYmxlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcF92YXJpYWJsZQoreworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbiBhY3Rpb247ICAgICAgICAgICAgIC8qKjwgUmVnaXN0cmF0aW9uIGFjdGlvbiB0byBwZXJmb3JtIGZvciBEUG9FIHZhcmlhYmxlIHJlcXVlc3RzLiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9saXN0IHZhbHVlOyAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gY29udDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9saXN0IHZhbHVlOyAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gcmVnaXN0ZXJfYW5kX2NvbnRpbnVlOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlX2xpc3QgdmFsdWU7ICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSB1bnJlZ2lzdGVyX2FuZF9jb250aW51ZTsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3BfdmFyaWFibGU7CisKKy8qKiBPQU0gUmVnIERQb0UgT3Bjb2RlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcGNvZGUKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9vcGNvZGUgb3Bjb2RlOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgT3Bjb2RlIHRvIHJlZ2lzdGVyICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb24gYWN0aW9uOyAvKio8IFJlZ2lzdHJhdGlvbiBhY3Rpb24gdG8gcGVyZm9ybSBmb3IgRFBvRSBvcGNvZGUuICovCisgICAgICAgICAgICB1aW50MTZfdCBsZW5ndGhfcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cgKi8KKyAgICAgICAgfSBkZWY7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3BfdmFyaWFibGUgdmFsdWU7IC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gZ2V0X3JlcXVlc3Q7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3BfdmFyaWFibGUgdmFsdWU7IC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gc2V0X3JlcXVlc3Q7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wY29kZTsKKworLyoqIE9BTSBSZWcgRFBvRSBDb250LiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9jb250Cit7CisgICAgdWludDhfdCBvcGNvZGVfY291bnQ7ICAgLyoqPCBOdW1iZXIgb2YgRFBvRSBvcGNvZGUgcmVnaXN0cmF0aW9ucyAqLworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3Bjb2RlICpvcGNvZGVzOyAgIC8qKjwgRFBvRSBvcGNvZGUgcmVnaXN0cmF0aW9ucyAqLworfSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX2NvbnQ7CisKKy8qKiBPQU0gUmVnIERQb0UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fYWN0aW9uIGFjdGlvbjsgICAgIC8qKjwgUmVnaXN0cmF0aW9uIGFjdGlvbiB0byBwZXJmb3JtIGZvciBEUG9FIE9VSSAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9jb250IHZhbHVlOyAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGNvbnQ7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfY29udCB2YWx1ZTsgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSByZWdpc3Rlcl9hbmRfY29udGludWU7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfY29udCB2YWx1ZTsgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSB1bnJlZ2lzdGVyX2FuZF9jb250aW51ZTsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2U7CisKKy8qKiBPQU0gUmVnIFZlbmRvciBPVUkuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3Jfb3VpCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpIG91aTsgICAgICAgICAgICAgICAgICAgICAvKio8IFZlbmRvciBPVUkgdG8gcmVnaXN0ZXIgKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbiBhY3Rpb247IC8qKjwgUmVnaXN0cmF0aW9uIGFjdGlvbiB0byBwZXJmb3JtIGZvciB2ZW5kb3IgT1VJIChNVVNUIGJlIFJlZ2lzdGVyIG9yIFVucmVnaXN0ZXIpICovCisgICAgICAgICAgICB1aW50MTZfdCBsZW5ndGg7ICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cgKi8KKyAgICAgICAgfSBkZWY7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0YyB2YWx1ZTsgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gY3RjOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWsgdmFsdWU7ICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHRlazsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZSB2YWx1ZTsgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBkcG9lOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX291aTsKKworLyoqIE9BTSBSZWcgVmVuZG9yIENvbnQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfY29udAoreworICAgIHVpbnQ4X3QgdmVuZG9yX291aV9yZWdfY291bnQ7ICAgLyoqPCBOdW1iZXIgb2YgVmVuZG9yIE9VSSByZWdpc3RyYXRpb25zICovCisgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX291aSAqdmVuZG9yX291aV9yZWc7IC8qKjwgVmVuZG9yIE9VSSByZWdpc3RyYXRpb25zICovCit9IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9jb250OworCisvKiogT0FNIFJlZyBWZW5kb3IuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3IKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb24gYWN0aW9uOyAgICAgLyoqPCBSZWdpc3RyYXRpb24gYWN0aW9uIHRvIHBlcmZvcm0gZm9yIG9yZ2FuaXphdGlvbiBzcGVjaWZpYyBmcmFtZXMuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfY29udCB2YWx1ZTsgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gY29udDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX2NvbnQgdmFsdWU7ICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHJlZ2lzdGVyX2FuZF9jb250aW51ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX2NvbnQgdmFsdWU7ICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHVucmVnaXN0ZXJfYW5kX2NvbnRpbnVlOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yOworCisvKiogT0FNIFJlZyBPcGNvZGUuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19vcGNvZGUKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX29wY29kZSBvcGNvZGU7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgSUVFRSBPQU0gb3Bjb2RlIHRvIHJlZ2lzdGVyICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb24gYWN0aW9uOyAvKio8IFJlZ2lzdHJhdGlvbiBhY3Rpb24gdG8gcGVyZm9ybSBmb3Igb3Bjb2RlIChNVVNUIGJlIFJlZ2lzdGVyIG9yIFVucmVnaXN0ZXIpLiAqLworICAgICAgICAgICAgdWludDE2X3QgbGVuZ3RoX3Jlc2VydmVkOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93ICovCisgICAgICAgIH0gZGVmOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvIHZhbHVlOyAgICAgICAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGluZm87CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvciB2YWx1ZTsgICAgICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gb3JnYW5pemF0aW9uX3NwZWNpZmljOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfb3Bjb2RlOworCisvKiogT0FNIFJlZ2lzdHJhdGlvbi4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uCit7CisgICAgdWludDhfdCBtYXN0ZXJfaWQ7ICAvKio8IFRoZSBJRCBvZiB0aGUgbWFzdGVyIHRoYXQgdGhpcyByZWdpc3RyYXRpb24gYXBwbGllcyB0by4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb24gYWN0aW9uOyAgICAgICAgIC8qKjwgUmVzZXJ2ZWQgKG11c3QgYmUgQ29udGludWUpICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHJlZ2lzdHJhdGlvbl9jb3VudDsgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBPQU0gb3Bjb2RlIHJlZ2lzdHJhdGlvbnMgZm9yIHRoaXMgbWFzdGVyIChtYXhpbXVtIG9uZSByZWdpc3RyYXRpb24gcGVyIG9wY29kZSkuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19vcGNvZGUgKnJlZ2lzdHJhdGlvbjsgICAvKio8IE9BTSBvcGNvZGUgcmVnaXN0cmF0aW9ucyAqLworICAgICAgICB9IGNvbnQ7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbjsKKworLyoqIFRoaXMgcmVjb3JkIGlzIHVzZWQgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIE9OVSBNYXN0ZXIgZG9lcyBOT1QgaGF2ZSB0aGUgT0FNIAorICogTWFzdGVyIG9wdGlvbiBlbmFibGVkLiBJdCBjYW4gYmUgdXNlZCB0byBpbmRpY2F0ZSBjZXJ0YWluIE9BTSBtZXNzYWdlcyB0aGF0IAorICogdGhlIG1hc3RlciB3aXNoZXMgdG8gcHJvY2VzcyBpdHNlbGYuIFJhdGhlciB0aGFuIHByb2Nlc3NpbmcgdGhlc2UgbWVzc2FnZXMsIAorICogdGhlIE9OVSB3aWxsIHNlbmQgdGhlc2UgbWVzc2FnZXMgdG8gdGhlIG1hc3Rlci4gIEJ5IGRlZmF1bHQgYWxsIE9BTSBmcmFtZXMgCisgKiBhcmUgY29uc2lkZXJlZCBVbnJlZ2lzdGVyZWQgYW5kIHdpbGwgYmUgcHJvY2Vzc2VkIGJ5IHRoZSBPTlUsIHVubGVzcyB0aGlzIAorICogcmVjb3JkIHNwZWNpZmljYWxseSBjb250YWlucyBhIFJlZ2lzdGVyIGFjdGlvbiBmb3IgdGhhdCB0eXBlIG9mIGZyYW1lLiBUaGlzIAorICogcmVjb3JkIGlzIGhpZXJhcmNoaWNhbCBhbGxvd2luZyBoaWdoIGxldmVsIGFjdGlvbnMgdG8gYmUgb3ZlcnJpZGRlbiBieSBsb3dlciAKKyAqIGxldmVsIGFjdGlvbnMuIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSB0aGUgZm9sbG93aW5nIHRocmVlIGNvbmRpdGlvbmFscyAKKyAqIChlYWNoIHN1Y2Nlc3NpdmVseSBuZXN0ZWQgdW5kZXIgdGhlIHByZXZpb3VzKTogICogSWYgWCBUaGVuIFJlZ2lzdGVyIEFuZCAKKyAqIENvbnRpbnVlICogSWYgWSBUaGVuIFVucmVnaXN0ZXIgQW5kIENvbnRpbnVlICogSWYgWiBUaGVuIFJlZ2lzdGVyICBUaGVuIAorICogZnJhbWVzIHdoaWNoIG1hdGNoIG9ubHkgWCBvciBYLCBZIGFuZCBaIHdvdWxkIGJlIGZvcndhcmRlZCwgd2hpbGUgZnJhbWVzIAorICogbWF0Y2hpbmcgWCBhbmQgWSwgYnV0IG5vdCBaIHdvdWxkIGJlIHByb2Nlc3NlZCBieSB0aGUgT05VLiBOb3RlIHRoYXQgZHVlIHRvIAorICogdGhlIGhpZXJhcmNoaWNhbCBvcmdhbml6YXRpb24gb2YgdGhlIHN0cnVjdHVyZSBpdCBpcyBsb2dpY2FsbHkgaW1wb3NzaWJsZSAKKyAqIGZvciBhIGZyYW1lIHRvIG1hdGNoIFkgb3IgWiB3aXRob3V0IG1hdGNoaW5nIFguICBOb3RlIHRoYXQgdGhlcmUgYXJlIHNvbWUgCisgKiBsaW1pdGF0aW9ucyB3aGVuIHJlZ2lzdGVyaW5nIGJyYW5jaC9sZWFmIGNvZGVzIChWYXJpYWJsZXMpLiBGb3IgdmFyaWFibGVzIAorICogdGhhdCBhcmUgcmVhZC93cml0ZSwgaXQgaXMgbmVjZXNzYXJ5IHRvIHJlZ2lzdGVyIHRoZSB2YXJpYWJsZSB1bmRlciBib3RoIHRoZSAKKyAqIGdldCByZXF1ZXN0IGFuZCBzZXQgcmVxdWVzdCBvcGNvZGVzLiBBIHNpbmdsZSBnZXQgb3Igc2V0IHJlcXVlc3QgY2FuIGFsc28gCisgKiBjb250YWluIG11bHRpcGxlIHZhcmlhYmxlcyB3aGljaCBtYXkgaGF2ZSBjb25mbGljdGluZyByZWdpc3RyYXRpb24gc3RhdGVzLiBBIAorICogZnJhbWUgd2lsbCBiZSBmb3J3YXJkZWQgdG8gdGhlIG1hc3RlciBpZiBpdCB3YXMgcmVnaXN0ZXJlZCBhdCBhIGhpZ2hlciBsZXZlbCAKKyAqIGFuZCBjb250YWlucyBubyB2YXJpYWJsZXMgd2hpY2ggd2VyZSBleHBsaWNpdGx5IHVucmVnaXN0ZXJlZCBvciBpZiBpdCAKKyAqIGNvbnRhaW5zIGFueSB2YXJpYWJsZXMgdGhhdCB3ZXJlIGV4cGxpY2l0bHkgcmVnaXN0ZXJlZC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2xpc3QKK3sKKyAgICB1aW50OF90IHJlZ2lzdHJhdGlvbnNfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgT05VIE1hc3RlciBPQU0gcmVnaXN0cmF0aW9ucyAobWF4aW11bSAxIHBlciBtYXN0ZXIpLiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uICpyZWdpc3RyYXRpb25zOyAgICAvKio8IE9OVSBNYXN0ZXIgT0FNIHJlZ2lzdHJhdGlvbnMgKi8KK30gYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fbGlzdDsKKworLyoqIE1hc3RlciBDb250ZXh0IFRMVi4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHYKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdHlwZSB0eXBlOyAgIC8qKjwgVHlwZS4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgcG9ydF9pbmRleDsgICAgICAgICAgICAgICAgIC8qKjwgUG9ydCBJbmRleC4gKi8KKyAgICAgICAgfSBuZXR3b3JrX3BvbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCBsaW5rX2luZGV4OyAgICAgICAgICAgICAgICAgLyoqPCBMaW5rIEluZGV4LiAqLworICAgICAgICB9IGxpbms7CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgcG9ydF9pbmRleDsgICAgICAgICAgICAgICAgIC8qKjwgUG9ydCBJbmRleC4gKi8KKyAgICAgICAgfSB1c2VyX3BvcnQ7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdGx2OworCisvKiogTmVnb3RpYXRlZCBPQU0uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW0KK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fd2VsbF9rbm93bl9vdWkgb3VpOyAgICAgICAgICAgICAvKio8IE9VSS4gKi8KKyAgICBiY21vc19ib29sIG5lZ290aWF0ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IE5lZ290aWF0ZWQuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlcnNpb24gdmVyc2lvbjsgICAgLyoqPCBWZXJzaW9uLiAqLworICAgICAgICB9IGN0YzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVyc2lvbiB2ZXJzaW9uOyAgIC8qKjwgVmVyc2lvbi4gKi8KKyAgICAgICAgfSBkcG9lOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtOworCisvKiogTmVnb3RpYXRlZCBPQU0gTGlzdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbV9saXN0Cit7CisgICAgdWludDhfdCBjb3VudDsgIC8qKjwgQ291bnQuICovCisgICAgYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtICpuZWdvdGlhdGVkX29hbXM7ICAgIC8qKjwgTmVnb3RpYXRlZCBPQU1zLiAqLworfSBiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fbGlzdDsKKworLyoqIE9OVSBNYXN0ZXIgQ29tbWFuZC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmQKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kX2lkIGNvbW1hbmQ7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQ29tbWFuZC4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2xpc3Qgb2FtX3JlZ2lzdHJhdGlvbnM7ICAgIC8qKjwgT0FNIFJlZ2lzdHJhdGlvbnMuICovCisgICAgICAgIH0gc2V0X29hbV9yZWdpc3RyYXRpb247CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHYgbGlua19jb250ZXh0OyAgICAgICAgICAgIC8qKjwgTGluayBDb250ZXh0LiAqLworICAgICAgICB9IGdldF9uZWdvdGlhdGVkX29hbTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3RsdiBsaW5rX2NvbnRleHQ7ICAgICAgICAgICAgLyoqPCBMaW5rIENvbnRleHQuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fbGlzdCBuZWdvdGlhdGVkX29hbTsgICAgICAgICAvKio8IE5lZ290aWF0ZWQgT0FNLiAqLworICAgICAgICB9IHNldF9uZWdvdGlhdGVkX29hbTsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmQ7CisKKy8qKiBPTlUgTWFzdGVyIFJlc3BvbnNlLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcmVzcG9uc2UKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kX2lkIGNvbW1hbmQ7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQ29tbWFuZC4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9yZXNwb25zZV9jb2RlIHJlc3BvbnNlX2NvZGU7ICAgICAgICAgICAgIC8qKjwgUmVzcG9uc2UgQ29kZS4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vbnVfc3RhdGUgc3RhdGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgU3RhdGUuICovCisgICAgICAgIH0gZ2V0X29udV9zdGF0ZTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fbGlzdCBvYW1fcmVnaXN0cmF0aW9uczsgICAgLyoqPCBPQU0gUmVnaXN0cmF0aW9ucy4gKi8KKyAgICAgICAgfSBnZXRfb2FtX3JlZ2lzdHJhdGlvbjsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3RsdiBsaW5rX2NvbnRleHQ7ICAgICAgICAgICAgLyoqPCBMaW5rIENvbnRleHQuICovCisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fbGlzdCBuZWdvdGlhdGVkX29hbTsgICAgICAgICAvKio8IE5lZ290aWF0ZWQgT0FNLiAqLworICAgICAgICB9IGdldF9uZWdvdGlhdGVkX29hbTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3RsdiBsaW5rX2NvbnRleHQ7ICAgICAgICAgICAgLyoqPCBMaW5rIENvbnRleHQuICovCisgICAgICAgIH0gc2V0X25lZ290aWF0ZWRfb2FtOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcmVzcG9uc2U7CisKKy8qKiBPTlUgTWFzdGVyIENvbW11bmljYXRpb24uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tdW5pY2F0aW9uCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbXVuaWNhdGlvbl90eXBlIHR5cGU7IC8qKjwgVHlwZS4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmQgdmFsdWU7ICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBjb21tYW5kOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9yZXNwb25zZSB2YWx1ZTsgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gcmVzcG9uc2U7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tdW5pY2F0aW9uOworCisvKiogTWFzdGVyIFBEVSBDb21tb24uIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX3BkdV9jb21tb24KK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9wcm90b2NvbCBwcm90b2NvbDsgICAgICAgICAgIC8qKjwgUHJvdG9jb2wuICovCisgICAgdWludDE2X3QgY29ycmVsYXRpb25fdGFnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IENvcnJlbGF0aW9uIFRhZy4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3BpbmdfZmxhZ3MgZmxhZ3M7ICAgIC8qKjwgRmxhZ3MuICovCisgICAgICAgIH0gcGluZzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9lbmRfcG9pbnQgZG1lcDsgICAgICAgICAgLyoqPCBETUVQLiAqLworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9lbmRfcG9pbnQgc21lcDsgICAgICAgICAgLyoqPCBTTUVQLiAqLworICAgICAgICAgICAgdWludDE2X3QgZnJhbWVfbGVuZ3RoOyAgLyoqPCBGcmFtZSBMZW5ndGguICovCisgICAgICAgICAgICB1aW50OF90ICpmcmFtZV9kYXRhOyAgICAvKio8IEZyYW1lIERhdGEuICovCisgICAgICAgIH0gZW5jYXBzdWxhdGVkX2ZyYW1lOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9vYW1fY29udGVudCB2YWx1ZTsgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG9hbV9jb250ZW50OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9vYW1fY29udGVudCB2YWx1ZTsgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHJlZ2lzdGVyZWRfb2FtOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tdW5pY2F0aW9uIHZhbHVlOyAvKio8IFZhbHVlLiAqLworICAgICAgICB9IG1hc3Rlcl9jb21tdW5pY2F0aW9uOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9wZHVfY29tbW9uOworCisvKiogT3JnYW5pemF0aW9uIFNwZWNpZmljIFNsb3cgUHJvdG9jb2wuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX3Nsb3dfcHJvdG9jb2wKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fd2VsbF9rbm93bl9vdWkgb3VpOyAgICAgICAgICAgICAgICAgLyoqPCBPVUkuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX3BkdV9jb21tb24gdmFsdWU7ICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gdGVrOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19zbG93X3Byb3RvY29sOworCisvKiogU2xvdyBQcm90b2NvbC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9zbG93X3Byb3RvY29sCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Nsb3dfcHJvdG9jb2xfc3VidHlwZSBzdWJ0eXBlOyAgICAgIC8qKjwgU3VidHlwZS4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fZmxhZ3MgZmxhZ3M7ICAgICAgICAgICAgLyoqPCBGbGFncy4gKi8KKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnQgY29udGVudDsgICAgLyoqPCBDb250ZW50LiAqLworICAgICAgICB9IG9hbTsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19zbG93X3Byb3RvY29sIHZhbHVlOyAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBvcmdhbml6YXRpb25fc3BlY2lmaWM7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbDsKKworLyoqIEV0aGVybmV0IFByb3RvY29sLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Byb3RvY29sX3R5cGUgZXRoZXJ0eXBlOyAgICAgICAgLyoqPCBFdGhlcnR5cGUuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCB1bmtub3duX2NvdW50OyAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdW5rbm93bi4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnVua25vd247ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFVua25vd24uICovCisgICAgICAgIH0gZGVmOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBwYWRkaW5nX2NvdW50OyAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gcGFkZGluZy4gKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgKnBhZGRpbmc7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IFBhZGRpbmcuICovCisgICAgICAgIH0gemVybzsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3ZsYW5fdmFsdWUgdmFsdWU7ICAgICAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gY3ZsYW47CisKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV92bGFuX3ZhbHVlIHZhbHVlOyAgICAgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IHN2bGFuOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1faXRhZ192YWx1ZSB2YWx1ZTsgICAgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBpdGFnOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbCB2YWx1ZTsgICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBzbG93X3Byb3RvY29sOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZWFwb2xfcHJvdG9jb2wgdmFsdWU7ICAgLyoqPCBWYWx1ZS4gKi8KKyAgICAgICAgfSBlYXBvbDsKKyAgICB9IHU7Cit9IGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbDsKKworLyoqIEV0aGVybmV0IEZyYW1lLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lCit7CisgICAgYmNtb3NfbWFjX2FkZHJlc3MgZGE7ICAgICAgIC8qKjwgRGVzdGluYXRpb24gQWRkcmVzcy4gKi8KKyAgICBiY21vc19tYWNfYWRkcmVzcyBzYTsgICAgICAgLyoqPCBTb3VyY2UgQWRkcmVzcy4gKi8KKyAgICB1aW50MzJfdCBwcm90b2NvbHNfY291bnQ7ICAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gcHJvdG9jb2xzLiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbCAqcHJvdG9jb2xzOyAgIC8qKjwgUHJvdG9jb2xzLiAqLworfSBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWU7CisKKy8qKiBPQU0gUGR1IEJhc2UuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9iYXNlCit7CisgICAgYmNtb3NfbWFjX2FkZHJlc3MgZGE7ICAgLyoqPCBEZXN0aW5hdGlvbiBBZGRyZXNzLiAqLworICAgIGJjbW9zX21hY19hZGRyZXNzIHNhOyAgIC8qKjwgU291cmNlIEFkZHJlc3MuICovCisgICAgYmNtb2x0X2Vwb25fb2FtX3Byb3RvY29sX3R5cGUgcHJvdG9jb2xfdHlwZTsgICAgLyoqPCBQcm90b2NvbCBUeXBlLiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9zbG93X3Byb3RvY29sX3N1YnR5cGUgc3VidHlwZTsgIC8qKjwgU3VidHlwZS4gKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX2ZsYWdzIGZsYWdzOyAgICAgICAgICAgICAgICAvKio8IEZsYWdzLiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnQgY29udGVudDsgICAgICAgIC8qKjwgQ29udGVudC4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfYmFzZTsKKworLyoqIE9BTSBUZWsgRXZlbnQgR1BJTy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9vYW1fdGVrX2V2ZW50X2dwaW8KK3sKKyAgICB1aW50MzJfdCByZXNlcnZlZDsgICAgICAvKio8IFJlc2VydmVkLiAqLworICAgIHVpbnQzMl90IGdwaW9fc3RhdGUxZzsgIC8qKjwgR1BJTyBTdGF0ZSAoMUcpLiAqLworICAgIHVpbnQ2NF90IGdwaW9fc3RhdGUxMGc7IC8qKjwgR1BJTyBTdGF0ZSAoMTBHKS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnRfZ3BpbzsKKworLyoqIE9BTSBUZWsgRXZlbnQuIAorICovCit0eXBlZGVmIHN0cnVjdCBiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudAoreworICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29kZSBhbGFybV9jb2RlOyAgLyoqPCBBbGFybSBDb2RlLiAqLworICAgIGJjbW9zX2Jvb2wgcmFpc2VkOyAgLyoqPCBSYWlzZWQuICovCisgICAgdWludDE2X3QgcG9ydDsgICAgICAvKio8IFBvcnQuICovCisgICAgdWludDE2X3QgbGluazsgICAgICAvKio8IExpbmsuICovCisgICAgdWludDE2X3QgcXVldWU7ICAgICAvKio8IFF1ZXVlLiAqLworICAgIGJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29udGV4dCBhbGFybV9jb250ZXh0OyAgICAvKio8IEFsYXJtIENvbnRleHQuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYXR0cmlidXRlIHN0YXRfaWQ7IC8qKjwgU3RhdCBJRC4gKi8KKyAgICAgICAgfSBzdGF0X2FsYXJtOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudF9ncGlvIHZhbHVlOyAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gZ3Bpb19saW5rX2ZhdWx0OworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudF9ncGlvIHZhbHVlOyAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gZ3Bpb19keWluZ19nYXNwOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudF9ncGlvIHZhbHVlOyAgIC8qKjwgVmFsdWUuICovCisgICAgICAgIH0gZ3Bpb19jcml0aWNhbF9ldmVudDsKKworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnRfZ3BpbyB2YWx1ZTsgICAvKio8IFZhbHVlLiAqLworICAgICAgICB9IGdwaW9fb3RoZXI7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudDsKKworLyoqIFN0ZCBNQUMgQWRkcmVzcy4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV9zdGRfbWFjX2FkZHJlc3MKK3sKKyAgICBiY21vc19tYWNfYWRkcmVzcyBhZGRyZXNzOyAgLyoqPCBBZGRyZXNzLiAqLworfSBiY21vbHRfZXBvbl9vYW1fc3RkX21hY19hZGRyZXNzOworCisvKiogVGVrIFZhciBEZXNjIEF0dHIgQmFzZS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NfYXR0cl9iYXNlCit7CisgICAgYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2F0dHJpYnV0ZSBhdHRyaWJ1dGU7ICAgLyoqPCBBdHRyaWJ1dGUuICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYXR0cmlidXRlIHN0YXQ7ICAgIC8qKjwgU3RhdC4gKi8KKyAgICAgICAgfSBwb3J0X3N0YXRfdGhyZXNob2xkOworCisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYXR0cmlidXRlIHN0YXQ7ICAgIC8qKjwgU3RhdC4gKi8KKyAgICAgICAgfSBsaW5rX3N0YXRfdGhyZXNob2xkOworICAgIH0gdTsKK30gYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY19hdHRyX2Jhc2U7CisKKy8qKiBUTFMgUmVjb3JkIENvbnRpbnVlZC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX2NvbnRpbnVlZAoreworICAgIGJjbW9sdF9lcG9uX29hbV90bHNfY29udGVudF90eXBlIGNvbnRlbnRfdHlwZTsgIC8qKjwgQ29udGVudCBUeXBlLiAqLworICAgIGJjbW9sdF9lcG9uX29hbV90bHNfdmVyc2lvbiB2ZXJzaW9uOyAgICAgICAgICAgIC8qKjwgVmVyc2lvbi4gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGRhdGFfY291bnQ7ICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBlbGVtZW50cyBpbiBkYXRhLiAqLworICAgICAgICAgICAgdWludDhfdCAqZGF0YTsgIC8qKjwgRGF0YS4gKi8KKyAgICAgICAgfSBkZWY7CisgICAgfSB1OworfSBiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZF9jb250aW51ZWQ7CisKKy8qKiBUTFMgU2lnbmF0dXJlIEFuZCBIYXNoIEFsZ29yaXRobS4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobQoreworICAgIGJjbW9sdF9lcG9uX29hbV90bHNfaGFzaF9hbGdvcml0aG0gaGFzaDsgICAgLyoqPCBIYXNoLiAqLworICAgIGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FsZ29yaXRobSBzaWduYXR1cmU7ICAvKio8IFNpZ25hdHVyZS4gKi8KK30gYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtOworCisvKiogVExTIFNpZ25hdHVyZSBBbmQgSGFzaCBBbGdvcml0aG0gTGlzdC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobV9saXN0Cit7CisgICAgdWludDMyX3Qgc3VwcG9ydGVkX3NpZ25hdHVyZV9hbGdvcml0aG1zX2NvdW50OyAgLyoqPCBOdW1iZXIgb2YgZWxlbWVudHMgaW4gc3VwcG9ydGVkX3NpZ25hdHVyZV9hbGdvcml0aG1zLiAqLworICAgIGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobSAqc3VwcG9ydGVkX3NpZ25hdHVyZV9hbGdvcml0aG1zOyAgIC8qKjwgU3VwcG9ydGVkIFNpZ25hdHVyZSBBbGdvcml0aG1zLiAqLworfSBiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbmRfaGFzaF9hbGdvcml0aG1fbGlzdDsKKworLyoqIEB9ICovCisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9hbGFybV9jb25maWdfbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYWxhcm1fY29uZmlnX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fYWxhcm1fY29uZmlnX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYWxhcm1fY29uZmlnX21vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYWxhcm1fY29uZmlnX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9hbGFybV9jb25maWdfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2F1dG9uZWdvdGlhdGVfYWRtaW5fc3RhdGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2F1dG9uZWdvdGlhdGVfYWRtaW5fc3RhdGVfcGFjayhiY21vbHRfZXBvbl9vYW1fYXV0b25lZ290aWF0ZV9hZG1pbl9zdGF0ZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9hdXRvbmVnb3RpYXRlX2FkbWluX3N0YXRlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2F1dG9uZWdvdGlhdGVfYWRtaW5fc3RhdGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9hdXRvbmVnb3RpYXRlX2FkbWluX3N0YXRlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYXV0b19uZWdvdGlhdGlvbl9hdXRvX2NvbmZpZyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYXV0b19uZWdvdGlhdGlvbl9hdXRvX2NvbmZpZ19wYWNrKGJjbW9sdF9lcG9uX29hbV9hdXRvX25lZ290aWF0aW9uX2F1dG9fY29uZmlnIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2F1dG9fbmVnb3RpYXRpb25fYXV0b19jb25maWcgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYXV0b19uZWdvdGlhdGlvbl9hdXRvX2NvbmZpZ191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2F1dG9fbmVnb3RpYXRpb25fYXV0b19jb25maWcgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9hdXRvX25lZ290aWF0aW9uX2NhcGFiaWxpdHkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2F1dG9fbmVnb3RpYXRpb25fY2FwYWJpbGl0eV9wYWNrKGJjbW9sdF9lcG9uX29hbV9hdXRvX25lZ290aWF0aW9uX2NhcGFiaWxpdHkgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYXV0b19uZWdvdGlhdGlvbl9jYXBhYmlsaXR5IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2F1dG9fbmVnb3RpYXRpb25fY2FwYWJpbGl0eV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2F1dG9fbmVnb3RpYXRpb25fY2FwYWJpbGl0eSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2F1dG9fcmVtb3RlX3NpZyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYXV0b19yZW1vdGVfc2lnX3BhY2soYmNtb2x0X2Vwb25fb2FtX2F1dG9fcmVtb3RlX3NpZyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9hdXRvX3JlbW90ZV9zaWcgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYXV0b19yZW1vdGVfc2lnX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYXV0b19yZW1vdGVfc2lnICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYXV0b19zZWxlY3RvciB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYXV0b19zZWxlY3Rvcl9wYWNrKGJjbW9sdF9lcG9uX29hbV9hdXRvX3NlbGVjdG9yIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2F1dG9fc2VsZWN0b3IgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYXV0b19zZWxlY3Rvcl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2F1dG9fc2VsZWN0b3IgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZmllbGRfc2VsZWN0X3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9maWVsZF9zZWxlY3RfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZmllbGRfc2VsZWN0X3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2ZpZWxkX3NlbGVjdF90eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9maWVsZF9zZWxlY3RfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9maWVsZF9zZWxlY3RfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3JlcXVlc3Rfb3B0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXF1ZXN0X29wdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXF1ZXN0X29wdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXF1ZXN0X29wdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19yZXF1ZXN0X29wdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3JlcXVlc3Rfb3B0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVzdWx0X2NvZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3Jlc3VsdF9jb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3Jlc3VsdF9jb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3Jlc3VsdF9jb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3Jlc3VsdF9jb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfcmVzdWx0X2NvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19hbm5leCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfYW5uZXhfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfYW5uZXggdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfYW5uZXggZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfYW5uZXhfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19hbm5leCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGZfdHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50Zl90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGZfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRmX3R5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50Zl90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50Zl90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX3N0YXR1cyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX3N0YXR1c19wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2Vfc3RhdHVzIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9zdGF0dXMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX3N0YXR1c191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9zdGF0dXMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmxlYXZlciB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJsZWF2ZXJfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJsZWF2ZXIgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJsZWF2ZXIgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJsZWF2ZXJfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmxlYXZlciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2xvYWRfYmFsYW5jZV9tZXRob2QgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2xvYWRfYmFsYW5jZV9tZXRob2RfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfbG9hZF9iYWxhbmNlX21ldGhvZCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19sb2FkX2JhbGFuY2VfbWV0aG9kIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2xvYWRfYmFsYW5jZV9tZXRob2RfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19sb2FkX2JhbGFuY2VfbWV0aG9kICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfbW9kdWxhdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfbW9kdWxhdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19tb2R1bGF0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX21vZHVsYXRpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfbW9kdWxhdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX21vZHVsYXRpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY191c19tb2R1bGF0aW9uX3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3VzX21vZHVsYXRpb25fdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY191c19tb2R1bGF0aW9uX3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfdXNfbW9kdWxhdGlvbl90eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3VzX21vZHVsYXRpb25fdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3VzX21vZHVsYXRpb25fdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3VzX3Byb2ZpbGVfdHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfdXNfcHJvZmlsZV90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3VzX3Byb2ZpbGVfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY191c19wcm9maWxlX3R5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfdXNfcHJvZmlsZV90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfdXNfcHJvZmlsZV90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfY29ubmVjdGl2aXR5X3N0YXRlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9jb25uZWN0aXZpdHlfc3RhdGVfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfY29ubmVjdGl2aXR5X3N0YXRlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X2Nvbm5lY3Rpdml0eV9zdGF0ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9jb25uZWN0aXZpdHlfc3RhdGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9jb25uZWN0aXZpdHlfc3RhdGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9kb2NzaXNfdmVyc2lvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfZG9jc2lzX3ZlcnNpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfZG9jc2lzX3ZlcnNpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfZG9jc2lzX3ZlcnNpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfZG9jc2lzX3ZlcnNpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9kb2NzaXNfdmVyc2lvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X2lwYWRkcl90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9pcGFkZHJfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9pcGFkZHJfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9pcGFkZHJfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9pcGFkZHJfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X2lwYWRkcl90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X29wY29kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X29wY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfb3Bjb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9vcGNvZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X29wY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9vcGNvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jbG9ja190cmFuc3BvcnRfa2V5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jbG9ja190cmFuc3BvcnRfa2V5X3BhY2soYmNtb2x0X2Vwb25fb2FtX2Nsb2NrX3RyYW5zcG9ydF9rZXkgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY2xvY2tfdHJhbnNwb3J0X2tleSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jbG9ja190cmFuc3BvcnRfa2V5X3VucGFjayhiY21vbHRfZXBvbl9vYW1fY2xvY2tfdHJhbnNwb3J0X2tleSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2FjdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2FjdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hY3Rpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYWN0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2VuYWJsZWRfc3RhdGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19lbmFibGVkX3N0YXRlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19lbmFibGVkX3N0YXRlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19lbmFibGVkX3N0YXRlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19lbmFibGVkX3N0YXRlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2VuYWJsZWRfc3RhdGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfYWN0aXZhdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2FjdGl2YXRpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2FjdGl2YXRpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2FjdGl2YXRpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2FjdGl2YXRpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfYWN0aXZhdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX21hbmFnZW1lbnRfb2JqZWN0IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9tYW5hZ2VtZW50X29iamVjdF9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9tYW5hZ2VtZW50X29iamVjdCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9tYW5hZ2VtZW50X29iamVjdCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9tYW5hZ2VtZW50X29iamVjdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX21hbmFnZW1lbnRfb2JqZWN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9hbGFybV9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9hbGFybV9pZF9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2FsYXJtX2lkIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfYWxhcm1faWQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9hbGFybV9pZF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfYWxhcm1faWQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfcG93ZXJfYWxhcm1fY29kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3Bvd2VyX2FsYXJtX2NvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3Bvd2VyX2FsYXJtX2NvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3Bvd2VyX2FsYXJtX2NvZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3Bvd2VyX2FsYXJtX2NvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfcG93ZXJfYWxhcm1fY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19wb25faWZfc3dpdGNoX2NvZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19wb25faWZfc3dpdGNoX2NvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3Bvbl9pZl9zd2l0Y2hfY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfcG9uX2lmX3N3aXRjaF9jb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19wb25faWZfc3dpdGNoX2NvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfcG9uX2lmX3N3aXRjaF9jb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hdHRyaWJ1dGVfcGFjayhiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfYXR0cmlidXRlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX2F0dHJpYnV0ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hdHRyaWJ1dGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9hdHRyaWJ1dGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfZmVjX3N1cHBvcnQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19mZWNfc3VwcG9ydF9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZmVjX3N1cHBvcnQgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2ZlY19zdXBwb3J0IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19mZWNfc3VwcG9ydF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19mZWNfc3VwcG9ydCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19mZWNfc3RhdGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19mZWNfc3RhdGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2ZlY19zdGF0ZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfZmVjX3N0YXRlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19mZWNfc3RhdGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZmVjX3N0YXRlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2NodXJuaW5nX29wX2NvZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19vcF9jb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19vcF9jb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19vcF9jb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19vcF9jb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2NodXJuaW5nX29wX2NvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfY2xhc3NpZmljYXRpb25fb3BlcmF0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfY2xhc3NpZmljYXRpb25fb3BlcmF0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19jbGFzc2lmaWNhdGlvbl9vcGVyYXRpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2NsYXNzaWZpY2F0aW9uX29wZXJhdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfY2xhc3NpZmljYXRpb25fb3BlcmF0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2NsYXNzaWZpY2F0aW9uX29wZXJhdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfYWNrIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2Fja19wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2FjayB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2FjayBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2Fja191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfYWNrICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9vcGNvZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2Vfb3Bjb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2Vfb3Bjb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2Vfb3Bjb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2Vfb3Bjb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9vcGNvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2ZsYWcgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfZmxhZ19wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2ZsYWcgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9mbGFnIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfZmxhZ191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfZmxhZyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfb3BfY29kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9vcF9jb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfb3BfY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX29wX2NvZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9vcF9jb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9vcF9jb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2Vhcmx5X3dha2VfdXBfbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2Vhcmx5X3dha2VfdXBfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZWFybHlfd2FrZV91cF9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19lYXJseV93YWtlX3VwX21vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2Vhcmx5X3dha2VfdXBfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19lYXJseV93YWtlX3VwX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfYnJhbmNoIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfYnJhbmNoX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19icmFuY2ggdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2JyYW5jaCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfYnJhbmNoX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2JyYW5jaCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9lcnJvcl9jb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fZXJyb3JfY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fZXJyb3JfY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fZXJyb3JfY29kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fZXJyb3JfY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9lcnJvcl9jb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfb2xkX21hbmFnZW1lbnRfb2JqZWN0IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9vbGRfbWFuYWdlbWVudF9vYmplY3RfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfb2xkX21hbmFnZW1lbnRfb2JqZWN0IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX29sZF9tYW5hZ2VtZW50X29iamVjdCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9vbGRfbWFuYWdlbWVudF9vYmplY3RfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9vbGRfbWFuYWdlbWVudF9vYmplY3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfcG9ydF90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfcG9ydF90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19wb3J0X3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3BvcnRfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfcG9ydF90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3BvcnRfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hdHRyaWJ1dGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hdHRyaWJ1dGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfZXh0X2F0dHJpYnV0ZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYXR0cmlidXRlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hdHRyaWJ1dGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYXR0cmlidXRlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfZXh0X2FjdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfZXh0X2FjdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbGVhZl9leHRfYWN0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hY3Rpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2xlYWZfZXh0X2FjdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19sZWFmX2V4dF9hY3Rpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYXR0cmlidXRlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYXR0cmlidXRlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hdHRyaWJ1dGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2F0dHJpYnV0ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYXR0cmlidXRlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2F0dHJpYnV0ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19lbmFibGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19lbmFibGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2V0aF9wb3J0X3BvbGljaW5nX2VuYWJsZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfZW5hYmxlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19lbmFibGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfZW5hYmxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N1Yl90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3ViX3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N1Yl90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdWJfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3ViX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3ViX3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3RhdHVzIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3RhdHVzX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXMgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N0YXR1cyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3RhdHVzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N0YXR1cyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2xlZXBfZmxhZyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zbGVlcF9mbGFnX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2xlZXBfZmxhZyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NsZWVwX2ZsYWcgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zbGVlcF9mbGFnX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zbGVlcF9mbGFnICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zbGVlcF9tb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NsZWVwX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zbGVlcF9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2xlZXBfbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NsZWVwX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NsZWVwX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9wcHBvX2V0ZXN0X3N0YXR1cyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcHBwb19ldGVzdF9zdGF0dXNfcGFjayhiY21vbHRfZXBvbl9vYW1fcHBwb19ldGVzdF9zdGF0dXMgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fcHBwb19ldGVzdF9zdGF0dXMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcHBwb19ldGVzdF9zdGF0dXNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9wcHBvX2V0ZXN0X3N0YXR1cyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3BwcG9fZXRlc3RfZmFpbF9yZWFzb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3BwcG9fZXRlc3RfZmFpbF9yZWFzb25fcGFjayhiY21vbHRfZXBvbl9vYW1fcHBwb19ldGVzdF9mYWlsX3JlYXNvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9wcHBvX2V0ZXN0X2ZhaWxfcmVhc29uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3BwcG9fZXRlc3RfZmFpbF9yZWFzb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9wcHBvX2V0ZXN0X2ZhaWxfcmVhc29uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fc3RhcnRfb3Jfc3RvcF9pbmRpY2F0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zdGFydF9vcl9zdG9wX2luZGljYXRpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fc3RhcnRfb3Jfc3RvcF9pbmRpY2F0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3N0YXJ0X29yX3N0b3BfaW5kaWNhdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zdGFydF9vcl9zdG9wX2luZGljYXRpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9zdGFydF9vcl9zdG9wX2luZGljYXRpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9wcHBvX2VhdXRoX21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3BwcG9fZWF1dGhfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9wcHBvX2VhdXRoX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fcHBwb19lYXV0aF9tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3BwcG9fZWF1dGhfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3BwcG9fZWF1dGhfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19zdXBwb3J0ZWRfc2VydmljZXMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19zdXBwb3J0ZWRfc2VydmljZXNfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3N1cHBvcnRlZF9zZXJ2aWNlcyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfc3VwcG9ydGVkX3NlcnZpY2VzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19zdXBwb3J0ZWRfc2VydmljZXNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfc3VwcG9ydGVkX3NlcnZpY2VzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3NlcnZpY2Vfc2xhX29wZXJhdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3NlcnZpY2Vfc2xhX29wZXJhdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfc2VydmljZV9zbGFfb3BlcmF0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19zZXJ2aWNlX3NsYV9vcGVyYXRpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3NlcnZpY2Vfc2xhX29wZXJhdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19zZXJ2aWNlX3NsYV9vcGVyYXRpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2RiYV9zY2hlZHVsaW5nX3NjaGVtZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9kYmFfc2NoZWR1bGluZ19zY2hlbWVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9kYmFfc2NoZWR1bGluZ19zY2hlbWUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9kYmFfc2NoZWR1bGluZ19zY2hlbWUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9kYmFfc2NoZWR1bGluZ19zY2hlbWVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2RiYV9zY2hlZHVsaW5nX3NjaGVtZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfdHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3R5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9wcm90ZWN0aW9uX3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfcHJvdGVjdGlvbl90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfcHJvdGVjdGlvbl90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfcHJvdGVjdGlvbl90eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfcHJvdGVjdGlvbl90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9wcm90ZWN0aW9uX3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2ludGVyZmFjZV90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2ludGVyZmFjZV90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfaW50ZXJmYWNlX3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9pbnRlcmZhY2VfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2ludGVyZmFjZV90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9pbnRlcmZhY2VfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfZ2xvYmFsX3BhcmFtc193aWR0aCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9nbG9iYWxfcGFyYW1zX3dpZHRoX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfZ2xvYmFsX3BhcmFtc193aWR0aCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X2dsb2JhbF9wYXJhbXNfd2lkdGggZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9nbG9iYWxfcGFyYW1zX3dpZHRoX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX214dV9nbG9iYWxfcGFyYW1zX3dpZHRoICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9zbm1wX3BhcmFtc193aWR0aCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9zbm1wX3BhcmFtc193aWR0aF9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X3NubXBfcGFyYW1zX3dpZHRoIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfc25tcF9wYXJhbXNfd2lkdGggZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9zbm1wX3BhcmFtc193aWR0aF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfc25tcF9wYXJhbXNfd2lkdGggKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3Bvd2VyX3N1cHBseV9jb250cm9sX3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfcG93ZXJfc3VwcGx5X2NvbnRyb2xfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3Bvd2VyX3N1cHBseV9jb250cm9sX3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9wb3dlcl9zdXBwbHlfY29udHJvbF90eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfcG93ZXJfc3VwcGx5X2NvbnRyb2xfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfcG93ZXJfc3VwcGx5X2NvbnRyb2xfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX2ZpZWxkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfZmllbGRfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX2ZpZWxkIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9maWVsZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfZmllbGRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfZmllbGQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3IgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcl9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfb3BlcmF0b3IgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX29wZXJhdG9yIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvcl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9vcGVyYXRvciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9vcGVyYXRpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9vcGVyYXRpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX29wZXJhdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fb3BlcmF0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9vcGVyYXRpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fb3BlcmF0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF90YWdfbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF90YWdfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfdGFnX21vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF90YWdfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfdGFnX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3N3aXRjaF9tb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3N3aXRjaF9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfc3dpdGNoX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9zd2l0Y2hfbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3N3aXRjaF9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9zd2l0Y2hfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9hY3Rpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9hY3Rpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2FjdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfYWN0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9hY3Rpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfYWN0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF90eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pcF9wcm90b2NvbCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaXBfcHJvdG9jb2xfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaXBfcHJvdG9jb2wgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaXBfcHJvdG9jb2wgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaXBfcHJvdG9jb2xfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pcF9wcm90b2NvbCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV9pcG1vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV9pcG1vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX2lwbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfaXBtb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV9pcG1vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfaXBtb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3BwcG9lX21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19wcHBvZV9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19wcHBvZV9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19wcHBvZV9tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19wcHBvZV9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3BwcG9lX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfdGFnZ2luZ19tb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfdGFnZ2luZ19tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV90YWdnaW5nX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX3RhZ2dpbmdfbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfdGFnZ2luZ19tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX3RhZ2dpbmdfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19oMjQ4cmVnX21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19oMjQ4cmVnX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2gyNDhyZWdfbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfaDI0OHJlZ19tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19oMjQ4cmVnX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfaDI0OHJlZ19tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2gyNDhoZWFydGJlYXRfbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2gyNDhoZWFydGJlYXRfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfaDI0OGhlYXJ0YmVhdF9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19oMjQ4aGVhcnRiZWF0X21vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2gyNDhoZWFydGJlYXRfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19oMjQ4aGVhcnRiZWF0X21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfcnRwX3RpZF9tb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfcnRwX3RpZF9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ydHBfdGlkX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3J0cF90aWRfbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfcnRwX3RpZF9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3J0cF90aWRfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV90Mzhtb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfdDM4bW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfdDM4bW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfdDM4bW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdm9pY2VfdDM4bW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV90Mzhtb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX2ZheF9tb2RlbV9jb250cm9sX21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV9mYXhfbW9kZW1fY29udHJvbF9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV9mYXhfbW9kZW1fY29udHJvbF9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV9mYXhfbW9kZW1fY29udHJvbF9tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192b2ljZV9mYXhfbW9kZW1fY29udHJvbF9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZvaWNlX2ZheF9tb2RlbV9jb250cm9sX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX29wZXJhdGlvbl9zdGF0dXMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfb3BlcmF0aW9uX3N0YXR1c19wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX29wZXJhdGlvbl9zdGF0dXMgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9vcGVyYXRpb25fc3RhdHVzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfb3BlcmF0aW9uX3N0YXR1c191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfb3BlcmF0aW9uX3N0YXR1cyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9zdGF0dXMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9zdGF0dXNfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9wb3J0X3N0YXR1cyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX3BvcnRfc3RhdHVzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9zdGF0dXNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX3BvcnRfc3RhdHVzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9wb3J0X3NlcnZpY2Vfc3RhdGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9zZXJ2aWNlX3N0YXRlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9zZXJ2aWNlX3N0YXRlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9zZXJ2aWNlX3N0YXRlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfcG9ydF9zZXJ2aWNlX3N0YXRlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9wb3J0X3NlcnZpY2Vfc3RhdGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX3BvcnRfY29kZWNfbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9wb3J0X2NvZGVjX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9wb3J0X2NvZGVjX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9wb3J0X2NvZGVjX21vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2lhZF9wb3J0X2NvZGVjX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX3BvcnRfY29kZWNfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfb3BlcmF0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX29wZXJhdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX29wZXJhdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX29wZXJhdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfaWFkX29wZXJhdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19pYWRfb3BlcmF0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fenRlX29udV9wb3J0X21hY19vcGVyYXRpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3p0ZV9vbnVfcG9ydF9tYWNfb3BlcmF0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX3p0ZV9vbnVfcG9ydF9tYWNfb3BlcmF0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3p0ZV9vbnVfcG9ydF9tYWNfb3BlcmF0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3p0ZV9vbnVfcG9ydF9tYWNfb3BlcmF0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fenRlX29udV9wb3J0X21hY19vcGVyYXRpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV96dGVfaXNvbGF0ZV9tb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV96dGVfaXNvbGF0ZV9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3p0ZV9pc29sYXRlX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fenRlX2lzb2xhdGVfbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV96dGVfaXNvbGF0ZV9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fenRlX2lzb2xhdGVfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3p0ZV9idWZmZXJfbWFuYWdlX21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3p0ZV9idWZmZXJfbWFuYWdlX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fenRlX2J1ZmZlcl9tYW5hZ2VfbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV96dGVfYnVmZmVyX21hbmFnZV9tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3p0ZV9idWZmZXJfbWFuYWdlX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV96dGVfYnVmZmVyX21hbmFnZV9tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fenRlX2RzYnVmX2RpcmVjdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fenRlX2RzYnVmX2RpcmVjdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV96dGVfZHNidWZfZGlyZWN0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3p0ZV9kc2J1Zl9kaXJlY3Rpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fenRlX2RzYnVmX2RpcmVjdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3p0ZV9kc2J1Zl9kaXJlY3Rpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV96dGVfc3RhdGlzdGljc19hY3Rpb25fbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fenRlX3N0YXRpc3RpY3NfYWN0aW9uX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fenRlX3N0YXRpc3RpY3NfYWN0aW9uX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fenRlX3N0YXRpc3RpY3NfYWN0aW9uX21vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fenRlX3N0YXRpc3RpY3NfYWN0aW9uX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV96dGVfc3RhdGlzdGljc19hY3Rpb25fbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3p0ZV9zdGF0aXN0aWNzX3Jlc2V0X21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3p0ZV9zdGF0aXN0aWNzX3Jlc2V0X21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fenRlX3N0YXRpc3RpY3NfcmVzZXRfbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV96dGVfc3RhdGlzdGljc19yZXNldF9tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3p0ZV9zdGF0aXN0aWNzX3Jlc2V0X21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV96dGVfc3RhdGlzdGljc19yZXNldF9tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdW5pX2Zsb3dfc3RhdGlzdGljc19jb2xsZWN0X2NvbnRyb2xfbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdW5pX2Zsb3dfc3RhdGlzdGljc19jb2xsZWN0X2NvbnRyb2xfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV91bmlfZmxvd19zdGF0aXN0aWNzX2NvbGxlY3RfY29udHJvbF9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3VuaV9mbG93X3N0YXRpc3RpY3NfY29sbGVjdF9jb250cm9sX21vZGUgZnJvbSAKKyAqIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV91bmlfZmxvd19zdGF0aXN0aWNzX2NvbGxlY3RfY29udHJvbF9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdW5pX2Zsb3dfc3RhdGlzdGljc19jb2xsZWN0X2NvbnRyb2xfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2xpZ2h0X2luZGljYXRpb25fbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbGlnaHRfaW5kaWNhdGlvbl9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2xpZ2h0X2luZGljYXRpb25fbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9saWdodF9pbmRpY2F0aW9uX21vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbGlnaHRfaW5kaWNhdGlvbl9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fbGlnaHRfaW5kaWNhdGlvbl9tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fbWF0Y2hfbWFjX2FkZHJlc3NfbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWF0Y2hfbWFjX2FkZHJlc3NfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9tYXRjaF9tYWNfYWRkcmVzc19tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX21hdGNoX21hY19hZGRyZXNzX21vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWF0Y2hfbWFjX2FkZHJlc3NfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX21hdGNoX21hY19hZGRyZXNzX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV96dGVfbGlnaHRfY29udHJvbF9hY3Rpb25fbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fenRlX2xpZ2h0X2NvbnRyb2xfYWN0aW9uX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fenRlX2xpZ2h0X2NvbnRyb2xfYWN0aW9uX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fenRlX2xpZ2h0X2NvbnRyb2xfYWN0aW9uX21vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fenRlX2xpZ2h0X2NvbnRyb2xfYWN0aW9uX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV96dGVfbGlnaHRfY29udHJvbF9hY3Rpb25fbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29udV9leGNsX2FiaWxpdHkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9leGNsX2FiaWxpdHlfcGFjayhiY21vbHRfZXBvbl9vYW1fb251X2V4Y2xfYWJpbGl0eSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vbnVfZXhjbF9hYmlsaXR5IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9leGNsX2FiaWxpdHlfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfZXhjbF9hYmlsaXR5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9lYXJseV93YWtlX2NhcGFiaWxpdHkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfZWFybHlfd2FrZV9jYXBhYmlsaXR5X3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfZWFybHlfd2FrZV9jYXBhYmlsaXR5IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfZWFybHlfd2FrZV9jYXBhYmlsaXR5IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfZWFybHlfd2FrZV9jYXBhYmlsaXR5X3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9lYXJseV93YWtlX2NhcGFiaWxpdHkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfcG9ydF9kaXNhYmxlX29uX2xvb3BfZGV0ZWN0ZWRfc3RhdGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19wb3J0X2Rpc2FibGVfb25fbG9vcF9kZXRlY3RlZF9zdGF0ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfcG9ydF9kaXNhYmxlX29uX2xvb3BfZGV0ZWN0ZWRfc3RhdGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3BvcnRfZGlzYWJsZV9vbl9sb29wX2RldGVjdGVkX3N0YXRlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19wb3J0X2Rpc2FibGVfb25fbG9vcF9kZXRlY3RlZF9zdGF0ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19wb3J0X2Rpc2FibGVfb25fbG9vcF9kZXRlY3RlZF9zdGF0ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19tb25pdG9yaW5nX3N0YXR1cyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX21vbml0b3Jpbmdfc3RhdHVzX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tb25pdG9yaW5nX3N0YXR1cyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbW9uaXRvcmluZ19zdGF0dXMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX21vbml0b3Jpbmdfc3RhdHVzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX21vbml0b3Jpbmdfc3RhdHVzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2ZpbGVfY2hlY2tfb3Bjb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19vcGNvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2ZpbGVfY2hlY2tfb3Bjb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19maWxlX2NoZWNrX29wY29kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19vcGNvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19vcGNvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfcnBzX2NvZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ycHNfY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfcnBzX2NvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3Jwc19jb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ycHNfY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ycHNfY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfYXV0aF9jb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2F1dGhfY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2F1dGhfY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2F1dGhfY29kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2F1dGhfY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfYXV0aF9jb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fd2VsbF9rbm93bl9vdWkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpX3BhY2soYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3dlbGxfa25vd25fb3VpX3VucGFjayhiY21vbHRfZXBvbl9vYW1fd2VsbF9rbm93bl9vdWkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfcnVsZV9vcGVyYXRvciB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGVfb3BlcmF0b3JfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGVfb3BlcmF0b3IgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGVfb3BlcmF0b3IgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGVfb3BlcmF0b3JfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfcnVsZV9vcGVyYXRvciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19zb2Z0d2FyZV9kb3dubG9hZF9kYXRhX3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19zb2Z0d2FyZV9kb3dubG9hZF9kYXRhX3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3NvZnR3YXJlX2Rvd25sb2FkX2RhdGFfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfZGF0YV90eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19zb2Z0d2FyZV9kb3dubG9hZF9kYXRhX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfZGF0YV90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfb3BfY29kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfb3BfY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9vcF9jb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX29wX2NvZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfb3BfY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX29wX2NvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3Jfb3Bjb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3Jfb3Bjb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9vcGNvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX29wY29kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3Jfb3Bjb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX29wY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9hY3RpdmF0ZV9pbWFnZV9mbGFnIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYWN0aXZhdGVfaW1hZ2VfZmxhZ19wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYWN0aXZhdGVfaW1hZ2VfZmxhZyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYWN0aXZhdGVfaW1hZ2VfZmxhZyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYWN0aXZhdGVfaW1hZ2VfZmxhZ191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9hY3RpdmF0ZV9pbWFnZV9mbGFnICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2FjayB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2Fja19wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYWNrIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9hY2sgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2Fja191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9hY2sgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9rdG9wdGljYWxfcG93ZXJfYWxhcm1fc3RhdHVzIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdG9wdGljYWxfcG93ZXJfYWxhcm1fc3RhdHVzX3BhY2soYmNtb2x0X2Vwb25fb2FtX2t0b3B0aWNhbF9wb3dlcl9hbGFybV9zdGF0dXMgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fa3RvcHRpY2FsX3Bvd2VyX2FsYXJtX3N0YXR1cyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdG9wdGljYWxfcG93ZXJfYWxhcm1fc3RhdHVzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fa3RvcHRpY2FsX3Bvd2VyX2FsYXJtX3N0YXR1cyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hY3Rpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hY3Rpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fa3RsZWFmX2FjdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYWN0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0bGVhZl9hY3Rpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9rdGxlYWZfYWN0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX29wY29kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29wY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb3Bjb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19vcGNvZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29wY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vcGNvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9rdG9udV9ldmVudF90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdG9udV9ldmVudF90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2t0b251X2V2ZW50X3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdG9udV9ldmVudF90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2t0bG9vcF9kZXRlY3RfZXZlbnQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0bG9vcF9kZXRlY3RfZXZlbnRfcGFjayhiY21vbHRfZXBvbl9vYW1fa3Rsb29wX2RldGVjdF9ldmVudCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9rdGxvb3BfZGV0ZWN0X2V2ZW50IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0bG9vcF9kZXRlY3RfZXZlbnRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9rdGxvb3BfZGV0ZWN0X2V2ZW50ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fa3RvcHRpY2FsX3Bvd2VyX2FsYXJtX2V2ZW50IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdG9wdGljYWxfcG93ZXJfYWxhcm1fZXZlbnRfcGFjayhiY21vbHRfZXBvbl9vYW1fa3RvcHRpY2FsX3Bvd2VyX2FsYXJtX2V2ZW50IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2t0b3B0aWNhbF9wb3dlcl9hbGFybV9ldmVudCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdG9wdGljYWxfcG93ZXJfYWxhcm1fZXZlbnRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9rdG9wdGljYWxfcG93ZXJfYWxhcm1fZXZlbnQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jbGFzc2lmaWVyX2NvbW1hbmQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NsYXNzaWZpZXJfY29tbWFuZF9wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jbGFzc2lmaWVyX2NvbW1hbmQgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY2xhc3NpZmllcl9jb21tYW5kIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NsYXNzaWZpZXJfY29tbWFuZF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NsYXNzaWZpZXJfY29tbWFuZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2RpcmVjdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fZGlyZWN0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2RpcmVjdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9kaXJlY3Rpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fZGlyZWN0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fZGlyZWN0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fZmlsdGVyX2ZpZWxkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9maWx0ZXJfZmllbGRfcGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fZmlsdGVyX2ZpZWxkIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2ZpbHRlcl9maWVsZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9maWx0ZXJfZmllbGRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9maWx0ZXJfZmllbGQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9maWx0ZXJfYWN0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9maWx0ZXJfYWN0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2ZpbHRlcl9hY3Rpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fZmlsdGVyX2FjdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9maWx0ZXJfYWN0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fZmlsdGVyX2FjdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ByaV90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wcmlfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wcmlfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wcmlfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wcmlfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ByaV90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fb3Bjb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9vcGNvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fb3Bjb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX29wY29kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9vcGNvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9vcGNvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0c19zZXFfdHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX3R5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0c19zZXFfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRfaWQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRfaWRfcGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdF9pZCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0X2lkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0X2lkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZGlyZWN0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kaXJlY3Rpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fZGlyZWN0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2RpcmVjdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kaXJlY3Rpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kaXJlY3Rpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kb21haW5fb3B0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kb21haW5fb3B0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2RvbWFpbl9vcHRpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZG9tYWluX29wdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kb21haW5fb3B0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZG9tYWluX29wdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hY3Rpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hY3Rpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFmX2FjdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYWN0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hY3Rpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYWN0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9sb29wYmFja19sb2NhdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9sb29wYmFja19sb2NhdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2xvb3BiYWNrX2xvY2F0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbG9vcGJhY2tfbG9jYXRpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9sb29wYmFja19sb2NhdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbG9vcGJhY2tfbG9jYXRpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xsaWRfYWN0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xsaWRfYWN0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGxpZF9hY3Rpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9sbGlkX2FjdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xsaWRfYWN0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9sbGlkX2FjdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYWxhcm1fY29kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hbGFybV9jb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYWxhcm1fY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2FsYXJtX2NvZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hbGFybV9jb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9hbGFybV9jb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFmX2F0dHJpYnV0ZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFmX2F0dHJpYnV0ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYWZfYXR0cmlidXRlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hdHRyaWJ1dGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFmX2F0dHJpYnV0ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hdHRyaWJ1dGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xpbmtfc3RhdGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGlua19zdGF0ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2xpbmtfc3RhdGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9saW5rX3N0YXRlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGlua19zdGF0ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGlua19zdGF0ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhcm5pbmdfbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFybmluZ19tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhcm5pbmdfbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xlYXJuaW5nX21vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFybmluZ19tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9sZWFybmluZ19tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9icmFuY2ggdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYnJhbmNoX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYnJhbmNoIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYnJhbmNoIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYnJhbmNoX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9icmFuY2ggKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZW5jcnlwdGlvbl9tb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2VuY3J5cHRpb25fbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2VuY3J5cHRpb25fbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2VuY3J5cHRpb25fbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2VuY3J5cHRpb25fbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZW5jcnlwdGlvbl9tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fcnVsZV90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9ydWxlX3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fcnVsZV90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3J1bGVfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9ydWxlX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9ydWxlX3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpZWxkX2NvZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmllbGRfY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpZWxkX2NvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWVsZF9jb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmllbGRfY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmllbGRfY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3J1bGVfb3BlcmF0b3IgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3J1bGVfb3BlcmF0b3JfcGFjayhiY21vbHRfZXBvbl9vYW1fcnVsZV9vcGVyYXRvciB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9ydWxlX29wZXJhdG9yIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3J1bGVfb3BlcmF0b3JfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9ydWxlX29wZXJhdG9yICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9yZXN1bHQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmVzdWx0X3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmVzdWx0IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmVzdWx0IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmVzdWx0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9yZXN1bHQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2xheWVyX3NlbGVjdCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9sYXllcl9zZWxlY3RfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9sYXllcl9zZWxlY3QgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9sYXllcl9zZWxlY3QgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9sYXllcl9zZWxlY3RfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2xheWVyX3NlbGVjdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3RyYWZmaWNfYml0bWFwIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90cmFmZmljX2JpdG1hcF9wYWNrKGJjbW9sdF9lcG9uX29hbV90cmFmZmljX2JpdG1hcCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90cmFmZmljX2JpdG1hcCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90cmFmZmljX2JpdG1hcF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3RyYWZmaWNfYml0bWFwICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fcmF0ZV91bml0cyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcmF0ZV91bml0c19wYWNrKGJjbW9sdF9lcG9uX29hbV9yYXRlX3VuaXRzIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3JhdGVfdW5pdHMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcmF0ZV91bml0c191bnBhY2soYmNtb2x0X2Vwb25fb2FtX3JhdGVfdW5pdHMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZlY19tb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZlY19tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmVjX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9mZWNfbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZlY19tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9mZWNfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcG9ydF90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3BvcnRfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3BvcnRfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX3BvcnRfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3BvcnRfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcG9ydF90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9pcG1jX2ZvcndhcmRpbmdfZmxhZ3MgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaXBtY19mb3J3YXJkaW5nX2ZsYWdzX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaXBtY19mb3J3YXJkaW5nX2ZsYWdzIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaXBtY19mb3J3YXJkaW5nX2ZsYWdzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaXBtY19mb3J3YXJkaW5nX2ZsYWdzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9pcG1jX2ZvcndhcmRpbmdfZmxhZ3MgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Bvd2VyX3NhdmluZ19tb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Bvd2VyX3NhdmluZ19tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcG93ZXJfc2F2aW5nX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9wb3dlcl9zYXZpbmdfbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Bvd2VyX3NhdmluZ19tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9wb3dlcl9zYXZpbmdfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXJyb3JfY29kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9lcnJvcl9jb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXJyb3JfY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2Vycm9yX2NvZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9lcnJvcl9jb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9lcnJvcl9jb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX29wY29kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX29wY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfb3Bjb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9vcGNvZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX29wY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9vcGNvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3R5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9lcnJvciB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Vycm9yX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9lcnJvciB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfZXJyb3IgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Vycm9yX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Vycm9yICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9pbmZvX3Rsdl90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2luZm9fdGx2X3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9pbmZvX3Rsdl90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaW5mb190bHZfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2luZm9fdGx2X3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2luZm9fdGx2X3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X2N0cmxfYWN0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X2N0cmxfYWN0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfY3RybF9hY3Rpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9jdHJsX2FjdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X2N0cmxfYWN0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9jdHJsX2FjdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfY3RybF9yZXNwX2NvZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfY3RybF9yZXNwX2NvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9jdHJsX3Jlc3BfY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X2N0cmxfcmVzcF9jb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfY3RybF9yZXNwX2NvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X2N0cmxfcmVzcF9jb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9yZWdfY29kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9yZWdfY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX21jYXN0X3JlZ19jb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfcmVnX2NvZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9tY2FzdF9yZWdfY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWNhc3RfcmVnX2NvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9zdGRfcGh5X3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3N0ZF9waHlfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9zdGRfcGh5X3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fc3RkX3BoeV90eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3N0ZF9waHlfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3N0ZF9waHlfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9zdGF0ZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3N0YXRlX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9zdGF0ZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fc3RhdGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3N0YXRlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3N0YXRlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fbWF1X21lZGlhX2F2YWlsYWJsZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWF1X21lZGlhX2F2YWlsYWJsZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9tYXVfbWVkaWFfYXZhaWxhYmxlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX21hdV9tZWRpYV9hdmFpbGFibGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWF1X21lZGlhX2F2YWlsYWJsZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX21hdV9tZWRpYV9hdmFpbGFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9zdGRfYXV0b19uZWdvaXRhdGlvbl9jYXBhYmlsaXR5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zdGRfYXV0b19uZWdvaXRhdGlvbl9jYXBhYmlsaXR5X3BhY2soYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdXRvX25lZ29pdGF0aW9uX2NhcGFiaWxpdHkgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fc3RkX2F1dG9fbmVnb2l0YXRpb25fY2FwYWJpbGl0eSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zdGRfYXV0b19uZWdvaXRhdGlvbl9jYXBhYmlsaXR5X3VucGFjayhiY21vbHRfZXBvbl9vYW1fc3RkX2F1dG9fbmVnb2l0YXRpb25fY2FwYWJpbGl0eSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX21hY19kdXBsZXhfc3RhdHVzIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tYWNfZHVwbGV4X3N0YXR1c19wYWNrKGJjbW9sdF9lcG9uX29hbV9tYWNfZHVwbGV4X3N0YXR1cyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9tYWNfZHVwbGV4X3N0YXR1cyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tYWNfZHVwbGV4X3N0YXR1c191bnBhY2soYmNtb2x0X2Vwb25fb2FtX21hY19kdXBsZXhfc3RhdHVzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZmVjX3N1cHBvcnQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2ZlY19zdXBwb3J0X3BhY2soYmNtb2x0X2Vwb25fb2FtX2ZlY19zdXBwb3J0IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2ZlY19zdXBwb3J0IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2ZlY19zdXBwb3J0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fZmVjX3N1cHBvcnQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9zdGRfZmVjX21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3N0ZF9mZWNfbW9kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9zdGRfZmVjX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fc3RkX2ZlY19tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3N0ZF9mZWNfbW9kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3N0ZF9mZWNfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb3Bjb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX29wY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX29wY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX29wY29kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX29wY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb3Bjb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZXJzaW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlcnNpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV92ZXJzaW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVyc2lvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlcnNpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlcnNpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9lYXBfY29kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZWFwX2NvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZWFwX2NvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZWFwX2NvZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZWFwX2NvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9lYXBfY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rsc19zdWJ0eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfc3VidHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfc3VidHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfc3VidHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfc3VidHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19zdWJ0eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGxzX2ZsYWdzIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfZmxhZ3NfcGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2ZsYWdzIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rsc19mbGFncyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfZmxhZ3NfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfZmxhZ3MgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfY29udGVudF90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY29udGVudF90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19jb250ZW50X3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGxzX2NvbnRlbnRfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY29udGVudF90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2NvbnRlbnRfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2VfdHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZV90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2VfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlX3R5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZV90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZV90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY2lwaGVyc3VpdGVfcGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY2lwaGVyc3VpdGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfY2lwaGVyc3VpdGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfY29tcHJlc3Npb25fbWV0aG9kIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY29tcHJlc3Npb25fbWV0aG9kX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9tZXRob2QgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX21ldGhvZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY29tcHJlc3Npb25fbWV0aG9kX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX21ldGhvZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZWFwb2xfdHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZWFwb2xfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9lYXBvbF90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3R5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZWFwb2xfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9lYXBvbF92ZXJzaW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lYXBvbF92ZXJzaW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3ZlcnNpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZWFwb2xfdmVyc2lvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lYXBvbF92ZXJzaW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZWFwb2xfdmVyc2lvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Vwb2NfY21jX3N0YXRfaW5kZXggdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Vwb2NfY21jX3N0YXRfaW5kZXhfcGFjayhiY21vbHRfZXBvbl9vYW1fZXBvY19jbWNfc3RhdF9pbmRleCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9lcG9jX2NtY19zdGF0X2luZGV4IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Vwb2NfY21jX3N0YXRfaW5kZXhfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9lcG9jX2NtY19zdGF0X2luZGV4ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZXBvY19jbnVfc3RhdF9pbmRleCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZXBvY19jbnVfc3RhdF9pbmRleF9wYWNrKGJjbW9sdF9lcG9uX29hbV9lcG9jX2NudV9zdGF0X2luZGV4IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Vwb2NfY251X3N0YXRfaW5kZXggZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZXBvY19jbnVfc3RhdF9pbmRleF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Vwb2NfY251X3N0YXRfaW5kZXggKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9lcG9jX3NkbTI1MHN0YXRfaW5kZXggdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Vwb2Nfc2RtMjUwc3RhdF9pbmRleF9wYWNrKGJjbW9sdF9lcG9uX29hbV9lcG9jX3NkbTI1MHN0YXRfaW5kZXggdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZXBvY19zZG0yNTBzdGF0X2luZGV4IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Vwb2Nfc2RtMjUwc3RhdF9pbmRleF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Vwb2Nfc2RtMjUwc3RhdF9pbmRleCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Vwb2Nfc3RhdF9nYXRoZXJfbW9kZXMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Vwb2Nfc3RhdF9nYXRoZXJfbW9kZXNfcGFjayhiY21vbHRfZXBvbl9vYW1fZXBvY19zdGF0X2dhdGhlcl9tb2RlcyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9lcG9jX3N0YXRfZ2F0aGVyX21vZGVzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Vwb2Nfc3RhdF9nYXRoZXJfbW9kZXNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9lcG9jX3N0YXRfZ2F0aGVyX21vZGVzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fcHJvdG9jb2xfdHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcHJvdG9jb2xfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9wcm90b2NvbF90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Byb3RvY29sX3R5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcHJvdG9jb2xfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Byb3RvY29sX3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9zbG93X3Byb3RvY29sX3N1YnR5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Nsb3dfcHJvdG9jb2xfc3VidHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9zbG93X3Byb3RvY29sX3N1YnR5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbF9zdWJ0eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Nsb3dfcHJvdG9jb2xfc3VidHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Nsb3dfcHJvdG9jb2xfc3VidHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9mbGFncyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX2ZsYWdzX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9mbGFncyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fZmxhZ3MgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX2ZsYWdzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX2ZsYWdzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX29wY29kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX29wY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fb3Bjb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9vcGNvZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX29wY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9vcGNvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1faW5mb190bHZfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1faW5mb190bHZfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19pbmZvX3Rsdl90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHZfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHZfdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHZfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHZfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19pbmZvX3Rsdl90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX3JlcG9ydF9tb2RlcyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3JlcG9ydF9tb2Rlc19wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfcmVwb3J0X21vZGVzIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19yZXBvcnRfbW9kZXMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3JlcG9ydF9tb2Rlc191bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19yZXBvcnRfbW9kZXMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mb19zdGF0ZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm9fc3RhdGVfcGFjayhiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm9fc3RhdGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm9fc3RhdGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm9fc3RhdGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mb19zdGF0ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvX2NvbmZpZyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm9fY29uZmlnX3BhY2soYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvX2NvbmZpZyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mb19jb25maWcgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm9fY29uZmlnX3VucGFjayhiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm9fY29uZmlnICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2FsYXJtX2NvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2FsYXJtX2NvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX2FsYXJtX2NvZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2FsYXJtX2NvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19hbGFybV9jb250ZXh0IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29udGV4dF9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29udGV4dCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29udGV4dCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfYWxhcm1fY29udGV4dF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19hbGFybV9jb250ZXh0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdmFyX2JyYW5jaCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmFyX2JyYW5jaF9wYWNrKGJjbW9sdF9lcG9uX29hbV92YXJfYnJhbmNoIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Zhcl9icmFuY2ggZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmFyX2JyYW5jaF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Zhcl9icmFuY2ggKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9vYmplY3QgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX29iamVjdF9wYWNrKGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9vYmplY3QgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfb2JqZWN0IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX29iamVjdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX29iamVjdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX3BhY2thZ2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX3BhY2thZ2VfcGFjayhiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfcGFja2FnZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9wYWNrYWdlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX3BhY2thZ2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9wYWNrYWdlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfbmFtZV9iaW5kaW5nIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9uYW1lX2JpbmRpbmdfcGFjayhiY21vbHRfZXBvbl9vYW1fdmFyX2xlYWZfbmFtZV9iaW5kaW5nIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Zhcl9sZWFmX25hbWVfYmluZGluZyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9uYW1lX2JpbmRpbmdfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV92YXJfbGVhZl9uYW1lX2JpbmRpbmcgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9yZW1vdGVfbG9vcGJhY2tfY29tbWFuZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcmVtb3RlX2xvb3BiYWNrX2NvbW1hbmRfcGFjayhiY21vbHRfZXBvbl9vYW1fcmVtb3RlX2xvb3BiYWNrX2NvbW1hbmQgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fcmVtb3RlX2xvb3BiYWNrX2NvbW1hbmQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcmVtb3RlX2xvb3BiYWNrX2NvbW1hbmRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9yZW1vdGVfbG9vcGJhY2tfY29tbWFuZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19vcGNvZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vcGNvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29wY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfb3Bjb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vcGNvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfb3Bjb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX2JyYW5jaCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2JyYW5jaF9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfYnJhbmNoIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19icmFuY2ggZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2JyYW5jaF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19icmFuY2ggKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF90eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Zsb3dfZGlyZWN0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9mbG93X2RpcmVjdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9mbG93X2RpcmVjdGlvbiB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9mbG93X2RpcmVjdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9mbG93X2RpcmVjdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Zsb3dfZGlyZWN0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYXR0cmlidXRlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hdHRyaWJ1dGVfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYXR0cmlidXRlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2F0dHJpYnV0ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hdHRyaWJ1dGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hdHRyaWJ1dGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hY3Rpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2FjdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhZl9hY3Rpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX2xlYWZfYWN0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2FjdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19sZWFmX2FjdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9mbGFncyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2ZsYWdzX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9mbGFncyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfZmxhZ3MgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2ZsYWdzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2ZsYWdzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2FjdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2FjdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfYWN0aW9uIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9hY3Rpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2FjdGlvbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9hY3Rpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X2ZpZWxkX3NlbGVjdCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9maWVsZF9zZWxlY3RfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29udV9maWVsZF9zZWxlY3QgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9maWVsZF9zZWxlY3QgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9maWVsZF9zZWxlY3RfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X2ZpZWxkX3NlbGVjdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9vcGVyYXRvciB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX29wZXJhdG9yX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9vcGVyYXRvciB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfb3BlcmF0b3IgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX29wZXJhdG9yX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX29wZXJhdG9yICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb251X3Bzc3RhdGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9wc3N0YXRlX3BhY2soYmNtb2x0X2Vwb25fb2FtX29udV9wc3N0YXRlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29udV9wc3N0YXRlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9wc3N0YXRlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb251X3Bzc3RhdGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhcm5fdGFibGVfbW9kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2xlYXJuX3RhYmxlX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2xlYXJuX3RhYmxlX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX2xlYXJuX3RhYmxlX21vZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2xlYXJuX3RhYmxlX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfbGVhcm5fdGFibGVfbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX21hdGNoX21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX21hdGNoX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3ZsYW5fZGVzdGluYXRpb25fbWF0Y2hfbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9tYXRjaF9tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX21hdGNoX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9tYXRjaF9tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX3ZsYW5fZGVzdGluYXRpb25fZmxhZ3MgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX2ZsYWdzX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX2ZsYWdzIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX2ZsYWdzIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX2ZsYWdzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3ZsYW5fZGVzdGluYXRpb25fZmxhZ3MgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfZW5jcnlwdGlvbl9tb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfZW5jcnlwdGlvbl9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19lbmNyeXB0aW9uX21vZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX2VuY3J5cHRpb25fbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfZW5jcnlwdGlvbl9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2VuY3J5cHRpb25fbW9kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19lbmNyeXB0aW9uX29wdGlvbnMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19lbmNyeXB0aW9uX29wdGlvbnNfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2VuY3J5cHRpb25fb3B0aW9ucyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfZW5jcnlwdGlvbl9vcHRpb25zIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19lbmNyeXB0aW9uX29wdGlvbnNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfZW5jcnlwdGlvbl9vcHRpb25zICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fcnVsZV9maWVsZF9zZWxlY3QgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3J1bGVfZmllbGRfc2VsZWN0X3BhY2soYmNtb2x0X2Vwb25fb2FtX3J1bGVfZmllbGRfc2VsZWN0IHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3J1bGVfZmllbGRfc2VsZWN0IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3J1bGVfZmllbGRfc2VsZWN0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fcnVsZV9maWVsZF9zZWxlY3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9ydWxlX2FjdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcnVsZV9hY3Rpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fcnVsZV9hY3Rpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fcnVsZV9hY3Rpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcnVsZV9hY3Rpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9ydWxlX2FjdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19tYXR1cml0eSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX21hdHVyaXR5X3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19tYXR1cml0eSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfbWF0dXJpdHkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX21hdHVyaXR5X3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX21hdHVyaXR5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZmlsZV90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9maWxlX3R5cGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZmlsZV90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2ZpbGVfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9maWxlX3R5cGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9maWxlX3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9udnNfc3RhdGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX252c19zdGF0ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9udnNfc3RhdGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fbnZzX3N0YXRlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX252c19zdGF0ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX252c19zdGF0ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJzdWJ0eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3Yyc3VidHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3Yyc3VidHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3Yyc3VidHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3Yyc3VidHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJzdWJ0eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX3JlcG9ydF9tb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfcmVwb3J0X21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3JlcG9ydF9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19yZXBvcnRfbW9kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfcmVwb3J0X21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfcmVwb3J0X21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfZmVhdHVyZV9zZXQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19mZWF0dXJlX3NldF9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfZmVhdHVyZV9zZXQgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX2ZlYXR1cmVfc2V0IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19mZWF0dXJlX3NldF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19mZWF0dXJlX3NldCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX21jYXN0X3Nub29wX21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX21jYXN0X3Nub29wX21vZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fbWNhc3Rfc25vb3BfbW9kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9tY2FzdF9zbm9vcF9tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX21jYXN0X3Nub29wX21vZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9tY2FzdF9zbm9vcF9tb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1faXBtY19nbG9iYWxfb3B0aW9ucyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1faXBtY19nbG9iYWxfb3B0aW9uc19wYWNrKGJjbW9sdF9lcG9uX29hbV9pcG1jX2dsb2JhbF9vcHRpb25zIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2lwbWNfZ2xvYmFsX29wdGlvbnMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1faXBtY19nbG9iYWxfb3B0aW9uc191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2lwbWNfZ2xvYmFsX29wdGlvbnMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9mb3J3YXJkX3F1YWxpZmllciB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZm9yd2FyZF9xdWFsaWZpZXJfcGFjayhiY21vbHRfZXBvbl9vYW1fZm9yd2FyZF9xdWFsaWZpZXIgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZm9yd2FyZF9xdWFsaWZpZXIgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZm9yd2FyZF9xdWFsaWZpZXJfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9mb3J3YXJkX3F1YWxpZmllciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19ob2xkb3Zlcl9mbGFncyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2hvbGRvdmVyX2ZsYWdzX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19ob2xkb3Zlcl9mbGFncyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfaG9sZG92ZXJfZmxhZ3MgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2hvbGRvdmVyX2ZsYWdzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2hvbGRvdmVyX2ZsYWdzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fbWRpX21vZGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX21kaV9tb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX21kaV9tb2RlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX21kaV9tb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX21kaV9tb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fbWRpX21vZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9mb3J3YXJkaW5nX3F1YWxpZmVyIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9mb3J3YXJkaW5nX3F1YWxpZmVyX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX2ZvcndhcmRpbmdfcXVhbGlmZXIgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfZm9yd2FyZGluZ19xdWFsaWZlciBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9mb3J3YXJkaW5nX3F1YWxpZmVyX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfZm9yd2FyZGluZ19xdWFsaWZlciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX29wdGlvbnMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX29wdGlvbnNfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfc25vb3Bpbmdfb3B0aW9ucyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9zbm9vcGluZ19vcHRpb25zIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX29wdGlvbnNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9zbm9vcGluZ19vcHRpb25zICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fc2xlZXBfb3B0aW9ucyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc2xlZXBfb3B0aW9uc19wYWNrKGJjbW9sdF9lcG9uX29hbV9zbGVlcF9vcHRpb25zIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3NsZWVwX29wdGlvbnMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc2xlZXBfb3B0aW9uc191bnBhY2soYmNtb2x0X2Vwb25fb2FtX3NsZWVwX29wdGlvbnMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9pZWVlX3JlZ2lzdGVyX2ZsYWdzIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9pZWVlX3JlZ2lzdGVyX2ZsYWdzX3BhY2soYmNtb2x0X2Vwb25fb2FtX2llZWVfcmVnaXN0ZXJfZmxhZ3MgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1faWVlZV9yZWdpc3Rlcl9mbGFncyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9pZWVlX3JlZ2lzdGVyX2ZsYWdzX3VucGFjayhiY21vbHRfZXBvbl9vYW1faWVlZV9yZWdpc3Rlcl9mbGFncyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2llZWVfcmVnaXN0ZXJfYWNrX2ZsYWdzIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9pZWVlX3JlZ2lzdGVyX2Fja19mbGFnc19wYWNrKGJjbW9sdF9lcG9uX29hbV9pZWVlX3JlZ2lzdGVyX2Fja19mbGFncyB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9pZWVlX3JlZ2lzdGVyX2Fja19mbGFncyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9pZWVlX3JlZ2lzdGVyX2Fja19mbGFnc191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2llZWVfcmVnaXN0ZXJfYWNrX2ZsYWdzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX2ZpbGVfdHJhbnNmZXJfZXJyb3IgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19maWxlX3RyYW5zZmVyX2Vycm9yX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19maWxlX3RyYW5zZmVyX2Vycm9yIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19maWxlX3RyYW5zZmVyX2Vycm9yIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19maWxlX3RyYW5zZmVyX2Vycm9yX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2ZpbGVfdHJhbnNmZXJfZXJyb3IgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfZmlsZV90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfZmlsZV90eXBlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19maWxlX3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX2ZpbGVfdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfZmlsZV90eXBlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2ZpbGVfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3BtY19vcF9jb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9wbWNfb3BfY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9wbWNfb3BfY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9wbWNfb3BfY29kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9wbWNfb3BfY29kZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3BtY19vcF9jb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfb3AgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX29wX3BhY2soYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX29wIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX29wIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX29wX3VucGFjayhiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfb3AgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9wbWNfZXJyb3JfY29kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcG1jX2Vycm9yX2NvZGVfcGFjayhiY21vbHRfZXBvbl9vYW1fcG1jX2Vycm9yX2NvZGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fcG1jX2Vycm9yX2NvZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcG1jX2Vycm9yX2NvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9wbWNfZXJyb3JfY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcHJvdG9jb2wgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcHJvdG9jb2xfcGFjayhiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9wcm90b2NvbCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3Byb3RvY29sIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcHJvdG9jb2xfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3Byb3RvY29sICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9waW5nX2ZsYWdzIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3BpbmdfZmxhZ3NfcGFjayhiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9waW5nX2ZsYWdzIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcGluZ19mbGFncyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3BpbmdfZmxhZ3NfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3BpbmdfZmxhZ3MgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfZW5kX3BvaW50X3R5cGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgVGhlIGVudW1lcmF0aW9uIHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9lbmRfcG9pbnRfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfZW5kX3BvaW50X3R5cGUgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2VuZF9wb2ludF90eXBlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgZW51bWVyYXRpb24gdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9lbmRfcG9pbnRfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9lbmRfcG9pbnRfdHlwZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbXVuaWNhdGlvbl90eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW11bmljYXRpb25fdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW11bmljYXRpb25fdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW11bmljYXRpb25fdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW11bmljYXRpb25fdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbXVuaWNhdGlvbl90eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kX2lkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmRfaWRfcGFjayhiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kX2lkIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbWFuZF9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmRfaWRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmRfaWQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9hY3Rpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2FjdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb190eXBlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdHlwZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdHlwZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb190eXBlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdHlwZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdHlwZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90eXBlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3R5cGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdHlwZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3R5cGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfdmVyc2lvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlcnNpb25fcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZlcnNpb24gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlcnNpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlcnNpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdmVyc2lvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcmVzcG9uc2VfY29kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9yZXNwb25zZV9jb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcmVzcG9uc2VfY29kZSB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3Jlc3BvbnNlX2NvZGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9yZXNwb25zZV9jb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9yZXNwb25zZV9jb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb251X3N0YXRlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfc3RhdGVfcGFjayhiY21vbHRfZXBvbl9vYW1fb251X3N0YXRlIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29udV9zdGF0ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfc3RhdGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfc3RhdGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9tZGlfY3Jvc3NvdmVyIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tZGlfY3Jvc3NvdmVyX3BhY2soYmNtb2x0X2Vwb25fb2FtX21kaV9jcm9zc292ZXIgdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fbWRpX2Nyb3Nzb3ZlciBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tZGlfY3Jvc3NvdmVyX3VucGFjayhiY21vbHRfZXBvbl9vYW1fbWRpX2Nyb3Nzb3ZlciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3NkbV9zdGF0IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zZG1fc3RhdF9wYWNrKGJjbW9sdF9lcG9uX29hbV9zZG1fc3RhdCB0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9zZG1fc3RhdCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zZG1fc3RhdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3NkbV9zdGF0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGxzX2hhc2hfYWxnb3JpdGhtIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFRoZSBlbnVtZXJhdGlvbiB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfaGFzaF9hbGdvcml0aG1fcGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2hhc2hfYWxnb3JpdGhtIHRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rsc19oYXNoX2FsZ29yaXRobSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIGVudW1lcmF0aW9uIHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfaGFzaF9hbGdvcml0aG1fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfaGFzaF9hbGdvcml0aG0gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FsZ29yaXRobSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBUaGUgZW51bWVyYXRpb24gdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbGdvcml0aG1fcGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbGdvcml0aG0gdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbGdvcml0aG0gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBlbnVtZXJhdGlvbiB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gV2hldGhlciBvciBub3QgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbGdvcml0aG1fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FsZ29yaXRobSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9jdmlkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X2N2aWRfcGFjayhiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X2N2aWQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9jdmlkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfY3ZpZF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9jdmlkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X2N2aWQgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X2N2aWRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X21hYyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9tYWNfcGFjayhiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X21hYyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X21hYyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X21hY191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9tYWMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfbWFjIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9tYWNfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3Byb2dyYW1tYWJsZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9wcm9ncmFtbWFibGVfcGFjayhiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3Byb2dyYW1tYWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3Byb2dyYW1tYWJsZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3Byb2dyYW1tYWJsZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9wcm9ncmFtbWFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfcHJvZ3JhbW1hYmxlIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9wcm9ncmFtbWFibGVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3NzbV9pcCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9zc21faXBfcGFjayhiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3NzbV9pcCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3NzbV9pcCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3NzbV9pcF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9zc21faXAgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfc3NtX2lwIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9zc21faXBfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3N2bGFuX3BsdXNfY3ZsYW4gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfc3ZsYW5fcGx1c19jdmxhbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfc3ZsYW5fcGx1c19jdmxhbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3N2bGFuX3BsdXNfY3ZsYW4gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JpbmFyeV9lbnRyeV9zdmxhbl9wbHVzX2N2bGFuX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYmluYXJ5X2VudHJ5X3N2bGFuX3BsdXNfY3ZsYW4gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfc3ZsYW5fcGx1c19jdmxhbiBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9iaW5hcnlfZW50cnlfc3ZsYW5fcGx1c19jdmxhbl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfb3B0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX29wdGlvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfb3B0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfb3B0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfb3B0aW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX29wdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9vcHRpb24gc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX29wdGlvbl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfcmVzdWx0IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdF9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfcmVzdWx0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfcmVzdWx0IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NoYW5uZWxfcmVzdWx0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2JyY21fY2hhbm5lbF9yZXN1bHQgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jaGFubmVsX3Jlc3VsdF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19jbGFzc2lmaWVyX2NvbmZpZ19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfY2xhc3NpZmllcl9jb25maWdfZGF0YV9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19jbGFzc2lmaWVyX2NvbmZpZ19kYXRhICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19jbGFzc2lmaWVyX2NvbmZpZ19kYXRhIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2NsYXNzaWZpZXJfY29uZmlnX2RhdGFfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2NsYXNzaWZpZXJfY29uZmlnX2RhdGEgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19jbGFzc2lmaWVyX2NvbmZpZ19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19jbGFzc2lmaWVyX2NvbmZpZ19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfY2xhc3NpZmllcl9jb25maWdfZGF0YSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2NsYXNzaWZpZXJfY29uZmlnX2RhdGEgc3RydWN0IAorICogYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfY2xhc3NpZmllcl9jb25maWdfZGF0YV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2VfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9kYXRhX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9kYXRhICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX2RhdGEgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2VfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX2RhdGEgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2VfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50ZXJmYWNlX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRlcmZhY2VfZGF0YSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGVyZmFjZV9kYXRhX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGZfc3RhdHNfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGZfc3RhdHNfZGF0YV9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19pbnRmX3N0YXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGZfc3RhdHNfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50Zl9zdGF0c19kYXRhX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50Zl9zdGF0c19kYXRhICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfaW50Zl9zdGF0c19kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX2ludGZfc3RhdHNfZGF0YV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9jb25maWdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX2NvbmZpZ19kYXRhX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX2NvbmZpZ19kYXRhICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2ZfY29uZmlnX2RhdGEgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9jb25maWdfZGF0YV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2ZfY29uZmlnX2RhdGEgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9jb25maWdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2ZfY29uZmlnX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9jb25maWdfZGF0YSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX2NvbmZpZ19kYXRhIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX2NvbmZpZ19kYXRhX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX3N0YXRzX2RhdGEgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9zdGF0c19kYXRhX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX3N0YXRzX2RhdGEgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX3N0YXRzX2RhdGEgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fY21jX3NmX3N0YXRzX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9zdGF0c19kYXRhICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbWNfc2Zfc3RhdHNfZGF0YSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NtY19zZl9zdGF0c19kYXRhX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X21hY19hZGRyX3JhbmdlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfbWFjX2FkZHJfcmFuZ2VfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfbWFjX2FkZHJfcmFuZ2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X21hY19hZGRyX3JhbmdlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9tYWNfYWRkcl9yYW5nZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X21hY19hZGRyX3JhbmdlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfbWFjX2FkZHJfcmFuZ2Ugc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfbWFjX2FkZHJfcmFuZ2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfdXNfY2hhbl9kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfdXNfY2hhbl9kYXRhX3BhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3VzX2NoYW5fZGF0YSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3VzX2NoYW5fZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3VzX2NoYW5fZGF0YV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfdXNfY2hhbl9kYXRhICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfdXNfY2hhbl9kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV91c19jaGFuX2RhdGFfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV91c19jaGFuX2RhdGEgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV91c19jaGFuX2RhdGEgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfdXNfY2hhbl9kYXRhX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3N0YXR1c19kYXRhIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfc3RhdHVzX2RhdGFfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfc3RhdHVzX2RhdGEgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9zdGF0dXNfZGF0YSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3N0YXR1c19kYXRhX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9zdGF0dXNfZGF0YSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3N0YXR1c19kYXRhIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX2NudV9zdGF0dXNfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fY251X3N0YXR1c19kYXRhICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfc3RhdHVzX2RhdGEgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9jbnVfc3RhdHVzX2RhdGFfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9kb3duc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllcyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fZG93bnN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXNfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9kb3duc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllcyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9kb3duc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllcyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV9kb3duc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllc191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fZG93bnN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9icmNtX2Rvd25zdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzIAorICogc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fZG93bnN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXNfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllc19wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllcyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wcm9wZXJ0aWVzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Byb3BlcnRpZXMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllcyBzdHJ1Y3QgCisgKiBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcHJvcGVydGllc19zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX3NpZ25hbF9xdWFsaXR5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9zaWduYWxfcXVhbGl0eV9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX3NpZ25hbF9xdWFsaXR5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX3NpZ25hbF9xdWFsaXR5IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX3NpZ25hbF9xdWFsaXR5X3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9zaWduYWxfcXVhbGl0eSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fc2lnbmFsX3F1YWxpdHkgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9zaWduYWxfcXVhbGl0eV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcG93ZXIgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcG93ZXJfcGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV91cHN0cmVhbV9jaGFubmVsX3Bvd2VyICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcG93ZXIgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wb3dlcl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wb3dlciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2JyY21fdXBzdHJlYW1fY2hhbm5lbF9wb3dlciBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX3Vwc3RyZWFtX2NoYW5uZWxfcG93ZXJfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2JyY21fb2FtX3BkdV9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fYnJjbV9vYW1fcGR1X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9icmNtX29hbV9wZHVfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jZXJ0aWZpY2F0ZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2NlcnRpZmljYXRlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2NlcnRpZmljYXRlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fY2VydGlmaWNhdGUgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jZXJ0aWZpY2F0ZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY2VydGlmaWNhdGUgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jZXJ0aWZpY2F0ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY2VydGlmaWNhdGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jZXJ0aWZpY2F0ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2NlcnRpZmljYXRlIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2NlcnRpZmljYXRlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19hY3Rpb25fdmFsdWUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfYWN0aW9uX3ZhbHVlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19hY3Rpb25fdmFsdWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9jdGNfYWN0aW9uX3ZhbHVlIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX2FjdGlvbl92YWx1ZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX2FjdGlvbl92YWx1ZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19hY3Rpb25fdmFsdWUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19hY3Rpb25fdmFsdWVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfYWN0aW9uX3ZhbHVlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fY3RjX2FjdGlvbl92YWx1ZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfYWN0aW9uX3ZhbHVlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19hbGFybV9lbnRyeSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19hbGFybV9lbnRyeV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfYWxhcm1fZW50cnkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9jdGNfYWxhcm1fZW50cnkgd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfYWxhcm1fZW50cnlfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19hbGFybV9lbnRyeSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19hbGFybV9lbnRyeSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2FsYXJtX2VudHJ5X3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2FsYXJtX2VudHJ5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fY3RjX2FsYXJtX2VudHJ5IHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19hbGFybV9lbnRyeV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfYXR0cmlidXRlX3ZhbHVlX2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2F0dHJpYnV0ZV92YWx1ZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2F0dHJpYnV0ZV92YWx1ZV9iYXNlIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfYXR0cmlidXRlX3ZhbHVlX2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfYXR0cmlidXRlX3ZhbHVlX2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19hdHRyaWJ1dGVfdmFsdWVfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19hdHRyaWJ1dGVfdmFsdWVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2N0Y19hdHRyaWJ1dGVfdmFsdWVfYmFzZSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2NodXJuaW5nX3Byb3ZfYmFzZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19wcm92X2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2NodXJuaW5nX3Byb3ZfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19wcm92X2Jhc2Ugd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfY2h1cm5pbmdfcHJvdl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfY2h1cm5pbmdfcHJvdl9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2NodXJuaW5nX3Byb3ZfYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2NodXJuaW5nX3Byb3ZfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19wcm92X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfY2h1cm5pbmdfcHJvdl9iYXNlIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19jaHVybmluZ19wcm92X2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfYmFzZSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19jb21taXRfaW1hZ2VfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfY29tbWl0X2ltYWdlX2Jhc2Ugc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2NvbW1pdF9pbWFnZV9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcXVldWVfc2V0IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9xdWV1ZV9zZXRfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9xdWV1ZV9zZXQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcXVldWVfc2V0IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3F1ZXVlX3NldF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcXVldWVfc2V0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9xdWV1ZV9zZXQgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9xdWV1ZV9zZXRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9wcm92X2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3Byb3ZfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3Byb3ZfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcHJvdl9iYXNlIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9wcm92X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcHJvdl9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9wcm92X2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19kYmFfcHJvdl9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2RiYV9wcm92X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3Byb3ZfYmFzZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZGJhX3Byb3ZfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfb2xkX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb2xkX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29sZF9tYW5hZ2VtZW50X29iamVjdF9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9lcG9uX29hbV9jdGNfb2xkX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2Ugd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX29sZF9tYW5hZ2VtZW50X29iamVjdF9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfb2xkX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfb2xkX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbGRfbWFuYWdlbWVudF9vYmplY3RfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbGRfbWFuYWdlbWVudF9vYmplY3RfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbGRfbWFuYWdlbWVudF9vYmplY3RfYmFzZSBzdHJ1Y3QgCisgKiBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb2xkX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbWFuYWdlbWVudF9vYmplY3RfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbWFuYWdlbWVudF9vYmplY3RfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19tYW5hZ2VtZW50X29iamVjdF9iYXNlIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19tYW5hZ2VtZW50X29iamVjdF9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tYW5hZ2VtZW50X29iamVjdF9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX21hbmFnZW1lbnRfb2JqZWN0X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfbWFuYWdlbWVudF9vYmplY3RfYmFzZSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbWFuYWdlbWVudF9vYmplY3RfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfZW1wdHlfdmFyX2NvbnRhaW5lcl9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2VtcHR5X3Zhcl9jb250YWluZXJfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZW1wdHlfdmFyX2NvbnRhaW5lcl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2VtcHR5X3Zhcl9jb250YWluZXJfYmFzZSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19lbXB0eV92YXJfY29udGFpbmVyX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19lbXB0eV92YXJfY29udGFpbmVyX2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfZW1wdHlfdmFyX2NvbnRhaW5lcl9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZW1wdHlfdmFyX2NvbnRhaW5lcl9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2VtcHR5X3Zhcl9jb250YWluZXJfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2N0Y19lbXB0eV92YXJfY29udGFpbmVyX2Jhc2Ugc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2VtcHR5X3Zhcl9jb250YWluZXJfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfZW1wdHlfdmFyX2NvbnRhaW5lcl9iYXNlX2VuZF9jb3VudF91bmtub3duKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfY29uZmlnX2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfY29uZmlnX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2V0aF9wb3J0X3BvbGljaW5nX2NvbmZpZ19iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfY29uZmlnX2Jhc2Ugd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX2V0aF9wb3J0X3BvbGljaW5nX2NvbmZpZ19iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfY29uZmlnX2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfY29uZmlnX2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19jb25maWdfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19jb25maWdfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldGhfcG9ydF9wb2xpY2luZ19jb25maWdfYmFzZSBzdHJ1Y3QgCisgKiBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXRoX3BvcnRfcG9saWNpbmdfY29uZmlnX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX2V0aF9wb3J0X3BvbGljaW5nX2NvbmZpZ19iYXNlX2RlZl9jb3VudF91bmtub3duKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfZW50cnkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfZW50cnlfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2VudHJ5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfZW50cnkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9lbnRyeV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9lbnRyeSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9lbnRyeSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfZW50cnlfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N0YXR1c19lbnRyeSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXNfZW50cnlfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N0YXR1c19lbnRyeSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N0YXR1c19lbnRyeSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3N0YXR1c19lbnRyeV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXNfZW50cnkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfc3RhdHVzX2VudHJ5IHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9zdGF0dXNfZW50cnlfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3RocmVzaG9sZF9lbnRyeSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF90aHJlc2hvbGRfZW50cnlfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3RocmVzaG9sZF9lbnRyeSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3RocmVzaG9sZF9lbnRyeSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X3RocmVzaG9sZF9lbnRyeV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF90aHJlc2hvbGRfZW50cnkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfdGhyZXNob2xkX2VudHJ5IHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF90aHJlc2hvbGRfZW50cnlfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9iYXNlIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ldmVudF9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2V2ZW50X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfYmFzZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXZlbnRfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2FjdGlvbl92YWx1ZV9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hY3Rpb25fdmFsdWVfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2FjdGlvbl92YWx1ZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hY3Rpb25fdmFsdWVfYmFzZSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYWN0aW9uX3ZhbHVlX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYWN0aW9uX3ZhbHVlX2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2FjdGlvbl92YWx1ZV9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2FjdGlvbl92YWx1ZV9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hY3Rpb25fdmFsdWVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYWN0aW9uX3ZhbHVlX2Jhc2Ugc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hY3Rpb25fdmFsdWVfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX3RhYmxlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV90YWJsZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX3RhYmxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX3RhYmxlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX3RhYmxlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV90YWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfdGFibGUgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV90YWJsZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV9iYXNlIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfc2VydmljZV9zbGFfYmFzZSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X3NlcnZpY2Vfc2xhX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9zZXJ2aWNlX3NsYV9iYXNlX2RlZl9jb3VudF9zZXJ2aWNlcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9pbnRlcmZhY2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2ludGVyZmFjZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2ludGVyZmFjZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9pbnRlcmZhY2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfaW50ZXJmYWNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9pbnRlcmZhY2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2ludGVyZmFjZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2ludGVyZmFjZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X2dsb2JhbF9wYXJhbXNfYmFzZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfZ2xvYmFsX3BhcmFtc19iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfZ2xvYmFsX3BhcmFtc19iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9nbG9iYWxfcGFyYW1zX2Jhc2UgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X2dsb2JhbF9wYXJhbXNfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX214dV9nbG9iYWxfcGFyYW1zX2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X2dsb2JhbF9wYXJhbXNfYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9nbG9iYWxfcGFyYW1zX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X2dsb2JhbF9wYXJhbXNfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfZ2xvYmFsX3BhcmFtc19iYXNlIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfZ2xvYmFsX3BhcmFtc19iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfc25tcF9wYXJhbXNfYmFzZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfc25tcF9wYXJhbXNfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X3NubXBfcGFyYW1zX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X3NubXBfcGFyYW1zX2Jhc2UgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfbXh1X3NubXBfcGFyYW1zX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfc25tcF9wYXJhbXNfYmFzZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfc25tcF9wYXJhbXNfYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9zbm1wX3BhcmFtc19iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX214dV9zbm1wX3BhcmFtc19iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fY3RjX214dV9zbm1wX3BhcmFtc19iYXNlIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19teHVfc25tcF9wYXJhbXNfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudF9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9lbGVtZW50X3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2VsZW1lbnQgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fZWxlbWVudF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl90cmFuc2xhdGlvbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3RyYW5zbGF0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3RyYW5zbGF0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl90cmFuc2xhdGlvbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fdHJhbnNsYXRpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl90cmFuc2xhdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3RyYW5zbGF0aW9uIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3RyYW5zbGF0aW9uX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2FnZ3JlZ2F0ZV90YWJsZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2FnZ3JlZ2F0ZV90YWJsZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9hZ2dyZWdhdGVfdGFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9hZ2dyZWdhdGVfdGFibGUgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9hZ2dyZWdhdGVfdGFibGVfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2FnZ3JlZ2F0ZV90YWJsZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2FnZ3JlZ2F0ZV90YWJsZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fYWdncmVnYXRlX3RhYmxlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fYWdncmVnYXRlX3RhYmxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fYWdncmVnYXRlX3RhYmxlIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX2FnZ3JlZ2F0ZV90YWJsZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3Byb3ZfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3Byb3ZfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3Byb3ZfYmFzZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdmxhbl9wcm92X2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlX3RyYW5zbGF0aW9uX2NvdW50X3RyYW5zbGF0aW9ucyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlX3RydW5rX2NvdW50X3Blcm1pdHRlZF92bGFucyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZsYW5fcHJvdl9iYXNlX3RydW5rX21kdV9jb3VudF9wZXJtaXR0ZWRfdmxhbnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192bGFuX3Byb3ZfYmFzZV9oeWJyaWRfY291bnRfcGVybWl0dGVkX3ZsYW5zKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfY2xhdXNlX2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfY2xhdXNlX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX2NsYXVzZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX2NsYXVzZV9iYXNlIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9jbGFzc2lmX2NsYXVzZV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfY2xhdXNlX2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfY2xhdXNlX2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9jbGF1c2VfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9jbGF1c2VfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfY2xhc3NpZl9jbGF1c2VfYmFzZSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2NsYXNzaWZfY2xhdXNlX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfcnVsZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfcnVsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19ydWxlIHdvdWxkIG9jY3VweSBvbiB0aGUgCisgKiB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGVfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19ydWxlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19ydWxlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3J1bGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfcnVsZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfcnVsZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fcHJvdiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9wcm92X3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9wcm92ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX3Byb3YgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fcHJvdl9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX3Byb3YgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fcHJvdiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF92bGFuX3Byb3ZfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3ZsYW5fcHJvdiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9wcm92IHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9wcm92X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9wcm92X2RlbGV0ZV9jb3VudF9tdWx0aWNhc3RfdmxhbnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9wcm92X2FkZF9jb3VudF9tdWx0aWNhc3RfdmxhbnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3Rfdmxhbl9wcm92X2xpc3RfY291bnRfbXVsdGljYXN0X3ZsYW5zKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfaXB0dl92bGFuX2VudHJ5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2lwdHZfdmxhbl9lbnRyeV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfaXB0dl92bGFuX2VudHJ5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfaXB0dl92bGFuX2VudHJ5IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfaXB0dl92bGFuX2VudHJ5X3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2lwdHZfdmxhbl9lbnRyeSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2N0Y19pcHR2X3ZsYW5fZW50cnkgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2lwdHZfdmxhbl9lbnRyeV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19vcGVyYXRpb25fYmFzZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfdGFnX29wZXJhdGlvbl9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfdGFnX29wZXJhdGlvbl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19vcGVyYXRpb25fYmFzZSB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19vcGVyYXRpb25fYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF90YWdfb3BlcmF0aW9uX2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19vcGVyYXRpb25fYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF90YWdfb3BlcmF0aW9uX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X3RhZ19vcGVyYXRpb25fYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfdGFnX29wZXJhdGlvbl9iYXNlIHN0cnVjdCAKKyAqIGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfdGFnX29wZXJhdGlvbl9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX29ubHkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19vbmx5X3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX29ubHkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX29ubHkgZnJvbSAKKyAqIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfb25seV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX29ubHkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19vbmx5IAorICogc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX29ubHlfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c192bGFuX2lkIHRvIAorICogYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19wbHVzX3ZsYW5faWRfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c192bGFuX2lkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19wbHVzX3ZsYW5faWQgCisgKiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c192bGFuX2lkX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c192bGFuX2lkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCAKKyAqIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19wbHVzX3ZsYW5faWQgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c192bGFuX2lkX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfaXB2NHNhIHRvIAorICogYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19wbHVzX2lwdjRzYV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19wbHVzX2lwdjRzYSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY0c2EgCisgKiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY0c2FfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19wbHVzX2lwdjRzYSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgCisgKiBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY0c2Egc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY0c2Ffc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9pcHBsdXNfbWNhc3Rfdmxhbl9pZCAKKyAqIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9pcHBsdXNfbWNhc3Rfdmxhbl9pZF9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX2lwcGx1c19tY2FzdF92bGFuX2lkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIAorICogYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfaXBwbHVzX21jYXN0X3ZsYW5faWQgZnJvbSAKKyAqIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9pcHBsdXNfbWNhc3Rfdmxhbl9pZF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfaXBwbHVzX21jYXN0X3ZsYW5faWQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIAorICogYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfaXBwbHVzX21jYXN0X3ZsYW5faWQgc3RydWN0IAorICogYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9pcHBsdXNfbWNhc3Rfdmxhbl9pZF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIAorICogYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfaXB2NnBsdXNfbWNhc3Rfdmxhbl9pZCB0byAKKyAqIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9pcHY2cGx1c19tY2FzdF92bGFuX2lkX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfaXB2NnBsdXNfbWNhc3Rfdmxhbl9pZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSAKKyAqIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX2lwdjZwbHVzX21jYXN0X3ZsYW5faWQgZnJvbSAKKyAqIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9pcHY2cGx1c19tY2FzdF92bGFuX2lkX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9pcHY2cGx1c19tY2FzdF92bGFuX2lkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCAKKyAqIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX2lwdjZwbHVzX21jYXN0X3ZsYW5faWQgCisgKiBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9pcHY2cGx1c19tY2FzdF92bGFuX2lkX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9lbnRyeV9nZGFfbWFjX3BsdXNfaXB2NnNhIHRvIAorICogYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19wbHVzX2lwdjZzYV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19wbHVzX2lwdjZzYSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY2c2EgCisgKiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY2c2FfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfZW50cnlfZ2RhX21hY19wbHVzX2lwdjZzYSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgCisgKiBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY2c2Egc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2VudHJ5X2dkYV9tYWNfcGx1c19pcHY2c2Ffc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbCB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2xfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2wgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfbXVsdGljYXN0X2NvbnRyb2wgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9nZGFfbWFjX29ubHlfY291bnRfZW50cmllcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2dkYV9tYWNfcGx1c192bGFuX2lkX2NvdW50X2VudHJpZXMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9nZGFfbWFjX3BsdXNfaXB2NHNhX2NvdW50X2VudHJpZXMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9nZGFfaXBwbHVzX21jYXN0X3ZsYW5faWRfY291bnRfZW50cmllcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX211bHRpY2FzdF9jb250cm9sX2dkYV9pcHY2cGx1c19tY2FzdF92bGFuX2lkX2NvdW50X2VudHJpZXMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19tdWx0aWNhc3RfY29udHJvbF9nZGFfbWFjX3BsdXNfaXB2NnNhX2NvdW50X2VudHJpZXMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfbGxpZF9xdWV1ZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfbGxpZF9xdWV1ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfb251X2xsaWRfcXVldWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfbGxpZF9xdWV1ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9sbGlkX3F1ZXVlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX29udV9sbGlkX3F1ZXVlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fY3RjX29udV9sbGlkX3F1ZXVlIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19vbnVfbGxpZF9xdWV1ZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV96dGVfdmxhbl9tYWMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV96dGVfdmxhbl9tYWNfcGFjayhiY21vbHRfZXBvbl9vYW1fenRlX3ZsYW5fbWFjICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV96dGVfdmxhbl9tYWMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3p0ZV92bGFuX21hY191bnBhY2soYmNtb2x0X2Vwb25fb2FtX3p0ZV92bGFuX21hYyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3p0ZV92bGFuX21hYyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV96dGVfdmxhbl9tYWNfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2UgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2F0dHJpYnV0ZV92YWx1ZV9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfZXh0X2F0dHJpYnV0ZV92YWx1ZV9iYXNlIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19leHRfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9kZWZfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9lbmRfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX2V4dF9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9maXJtd2FyZV92ZXJzaW9uX2NvdW50X2Zpcm13YXJlX3ZlcnNpb24oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19maWxlX2NoZWNrX2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19maWxlX2NoZWNrX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19iYXNlIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX2ZpbGVfY2hlY2tfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX2ZpbGVfY2hlY2tfYmFzZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19maWxlX2NoZWNrX2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19maWxlX2NoZWNrX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fY3RjX2ZpbGVfY2hlY2tfYmFzZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfZmlsZV9jaGVja19iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19vdWlfdmVyc2lvbl9wYWlyIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX291aV92ZXJzaW9uX3BhaXJfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX291aV92ZXJzaW9uX3BhaXIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19vdWlfdmVyc2lvbl9wYWlyIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfb3VpX3ZlcnNpb25fcGFpcl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19vdWlfdmVyc2lvbl9wYWlyICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fY3RjX291aV92ZXJzaW9uX3BhaXIgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX291aV92ZXJzaW9uX3BhaXJfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3BlcmZvcm1hbmNlX21vbml0b3JpbmdfZGF0YSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2RhdGFfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3BlcmZvcm1hbmNlX21vbml0b3JpbmdfZGF0YSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3BlcmZvcm1hbmNlX21vbml0b3JpbmdfZGF0YSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3BlcmZvcm1hbmNlX21vbml0b3JpbmdfZGF0YV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y19wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2RhdGEgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfcGVyZm9ybWFuY2VfbW9uaXRvcmluZ19kYXRhIHN0cnVjdCAKKyAqIGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19wZXJmb3JtYW5jZV9tb25pdG9yaW5nX2RhdGFfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2Ugd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9iYXNlIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZV93cml0ZV9yZXF1ZXN0X2NvdW50X2ZpbGVuYW1lKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfdGZ0cF9iYXNlX3dyaXRlX3JlcXVlc3RfY291bnRfbW9kZShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX3RmdHBfYmFzZV9kYXRhX2NvdW50X2RhdGEoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y190ZnRwX2Jhc2VfZXJyb3JfY291bnRfbWVzc2FnZShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9iYXNlIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y19zd21pcnJvcl9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3N3bWlycm9yX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYmFzZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfc3dtaXJyb3JfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfcHJvdl9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3NvZnR3YXJlX2Rvd25sb2FkX3Byb3ZfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfcHJvdl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfcHJvdl9iYXNlIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y19zb2Z0d2FyZV9kb3dubG9hZF9wcm92X2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2N0Y19zb2Z0d2FyZV9kb3dubG9hZF9wcm92X2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfcHJvdl9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfc29mdHdhcmVfZG93bmxvYWRfcHJvdl9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3NvZnR3YXJlX2Rvd25sb2FkX3Byb3ZfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2N0Y19zb2Z0d2FyZV9kb3dubG9hZF9wcm92X2Jhc2Ugc3RydWN0IAorICogYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3NvZnR3YXJlX2Rvd25sb2FkX3Byb3ZfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9rdHF1ZXVlX2Ryb3BfY291bnRlciB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0cXVldWVfZHJvcF9jb3VudGVyX3BhY2soYmNtb2x0X2Vwb25fb2FtX2t0cXVldWVfZHJvcF9jb3VudGVyICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9rdHF1ZXVlX2Ryb3BfY291bnRlciBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fa3RxdWV1ZV9kcm9wX2NvdW50ZXJfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9rdHF1ZXVlX2Ryb3BfY291bnRlciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2t0cXVldWVfZHJvcF9jb3VudGVyIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0cXVldWVfZHJvcF9jb3VudGVyX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2t0YXR0cmlidXRlX3ZhbHVlX2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdGF0dHJpYnV0ZV92YWx1ZV9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2t0YXR0cmlidXRlX3ZhbHVlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9rdGF0dHJpYnV0ZV92YWx1ZV9iYXNlIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fa3RhdHRyaWJ1dGVfdmFsdWVfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fa3RhdHRyaWJ1dGVfdmFsdWVfYmFzZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2t0YXR0cmlidXRlX3ZhbHVlX2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0YXR0cmlidXRlX3ZhbHVlX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9rdGF0dHJpYnV0ZV92YWx1ZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fa3RhdHRyaWJ1dGVfdmFsdWVfYmFzZSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdGF0dHJpYnV0ZV92YWx1ZV9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2t0YWN0aW9uX3ZhbHVlX2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdGFjdGlvbl92YWx1ZV9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2t0YWN0aW9uX3ZhbHVlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9rdGFjdGlvbl92YWx1ZV9iYXNlIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fa3RhY3Rpb25fdmFsdWVfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fa3RhY3Rpb25fdmFsdWVfYmFzZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2t0YWN0aW9uX3ZhbHVlX2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0YWN0aW9uX3ZhbHVlX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9rdGFjdGlvbl92YWx1ZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fa3RhY3Rpb25fdmFsdWVfYmFzZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9rdGFjdGlvbl92YWx1ZV9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2t0YWN0aW9uX3ZhbHVlX2Jhc2VfcmVzdG9yZV9vbnVfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9jb250YWluZXJfYmFzZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfY29udGFpbmVyX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9jb250YWluZXJfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfY29udGFpbmVyX2Jhc2Ugd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2NvbnRhaW5lcl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2NvbnRhaW5lcl9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9jb250YWluZXJfYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9jb250YWluZXJfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfY29udGFpbmVyX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2NvbnRhaW5lcl9iYXNlIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfY29udGFpbmVyX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9jb250YWluZXJfYmFzZV9lbmRfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9kZXNjcmlwdG9yIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9kZXNjcmlwdG9yX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfZGVzY3JpcHRvciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfZGVzY3JpcHRvciB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfZGVzY3JpcHRvcl9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9kZXNjcmlwdG9yICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9kZXNjcmlwdG9yIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2Rlc2NyaXB0b3JfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2Rlc2NyaXB0b3IgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfdmFyX2Rlc2NyaXB0b3Igc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3Zhcl9kZXNjcmlwdG9yX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192YXJfZGVzY3JpcHRvcl9lbmRfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfYmFzZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0b251X2V2ZW50X2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2t0b251X2V2ZW50X2Jhc2Ugd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9rdG9udV9ldmVudF9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9rdG9udV9ldmVudF9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fa3RvbnVfZXZlbnRfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2t0b251X2V2ZW50X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9rdG9udV9ldmVudF9iYXNlIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2t0b251X2V2ZW50X2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2Ugc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9nZXRfcmVxdWVzdF9jb3VudF92YXJzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfZ2V0X3Jlc3BvbnNlX2NvdW50X3ZhcnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9zZXRfcmVxdWVzdF9jb3VudF92YXJzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9jdGNfdmVuZG9yX2V4dGVuZGVkX2Jhc2Vfc2V0X3Jlc3BvbnNlX2NvdW50X3ZhcnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2N0Y192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9zb2Z0d2FyZV9kb3dubG9hZF9jb3VudF9tZXNzYWdlcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fY3RjX3ZlbmRvcl9leHRlbmRlZF9iYXNlX2t0b251X2V2ZW50X2NvdW50X2V2ZW50cyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY2xhc3NpZmllcl9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY2xhc3NpZmllcl9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NsYXNzaWZpZXJfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NsYXNzaWZpZXJfYmFzZSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NsYXNzaWZpZXJfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZGFzYW5fY2xhc3NpZmllcl9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY2xhc3NpZmllcl9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jbGFzc2lmaWVyX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jbGFzc2lmaWVyX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jbGFzc2lmaWVyX2Jhc2Ugc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY2xhc3NpZmllcl9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW4gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW4gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW4gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW5fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fdmxhbiBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW5fcG9ydCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW5fcG9ydF9wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuX3BvcnQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuX3BvcnQgd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kYXNhbl92bGFuX3BvcnRfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW5fcG9ydCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW5fcG9ydCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fdmxhbl9wb3J0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fdmxhbl9wb3J0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fdmxhbl9wb3J0IHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3ZsYW5fcG9ydF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2NvbmZpZyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfY29uZmlnX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfY29uZmlnICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2NvbmZpZyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9jb25maWdfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2NvbmZpZyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfY29uZmlnIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfY29uZmlnX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfc3RhdHMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X3N0YXRzX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfc3RhdHMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfc3RhdHMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfc3RhdHNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X3N0YXRzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9zdGF0cyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X3N0YXRzX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfZXJyb3Jfc3RhdHMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2Vycm9yX3N0YXRzX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfZXJyb3Jfc3RhdHMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfZXJyb3Jfc3RhdHMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3BvcnRfZXJyb3Jfc3RhdHNfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2Vycm9yX3N0YXRzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fcG9ydF9lcnJvcl9zdGF0cyBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9wb3J0X2Vycm9yX3N0YXRzX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0c19zZXFfYmFzZSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0c19zZXFfYmFzZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0c19zZXFfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRzX3NlcV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX2Jhc2Ugc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdHNfc2VxX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdF92YWx1ZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRfdmFsdWVfcGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdF92YWx1ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdF92YWx1ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fc3RhdF92YWx1ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRfdmFsdWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9zdGF0X3ZhbHVlIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX3N0YXRfdmFsdWVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY29uZmlnX2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jb25maWdfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jb25maWdfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NvbmZpZ19iYXNlIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY29uZmlnX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NvbmZpZ19iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZGFzYW5fY29uZmlnX2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rhc2FuX2NvbmZpZ19iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZGFzYW5fY29uZmlnX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jb25maWdfYmFzZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jb25maWdfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kYXNhbl9jb25maWdfYmFzZV9vbnVfc3RhdGlzdGljX2NvdW50X3NlcXVlbmNlcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWUgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZV9saXN0IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lX2xpc3RfcGFjayhiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfbGlzdCAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZV9saXN0X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfbGlzdCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZV9saXN0IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kaXN0aW5ndWlzaGVkX25hbWVfbGlzdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rpc3Rpbmd1aXNoZWRfbmFtZV9saXN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lX2xpc3Qgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lX2xpc3Rfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZGlzdGluZ3Vpc2hlZF9uYW1lX2xpc3RfY291bnRfbmFtZXMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGVfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZSB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX21hY190YWJsZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbWFjX3RhYmxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGUgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9tYWNfdGFibGVfY291bnRfbWFjX2FkZHJlc3MoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYWN0aW9uX3ZhbHVlX2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2FjdGlvbl92YWx1ZV9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYWN0aW9uX3ZhbHVlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2FjdGlvbl92YWx1ZV9iYXNlIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hY3Rpb25fdmFsdWVfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZHBvZV9hY3Rpb25fdmFsdWVfYmFzZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYWN0aW9uX3ZhbHVlX2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYWN0aW9uX3ZhbHVlX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2FjdGlvbl92YWx1ZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hY3Rpb25fdmFsdWVfYmFzZSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2FjdGlvbl92YWx1ZV9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfc2V0IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9zZXRfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9zZXQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3NldCB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfc2V0X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3NldCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfc2V0IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3NldF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfc2V0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9zZXQgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9zZXRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcXVldWVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9kcG9lX29iamVjdF9jb250ZXh0X2Jhc2Ugc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZV9uZXR3b3JrX3Bvbl9jb3VudF9wb24oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZV9saW5rX2NvdW50X2xpbmsoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZV91c2VyX3BvcnRfY291bnRfcG9ydChiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9vYmplY3RfY29udGV4dF9iYXNlX2JyaWRnZV9jb3VudF9icmlkZ2UoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfb2JqZWN0X2NvbnRleHRfYmFzZV9icmlkZ2VfcG9ydF9jb3VudF9wb3J0KGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9kZXNjcmlwdG9yIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvcl9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9kZXNjcmlwdG9yICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvciB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2Rlc2NyaXB0b3JfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2Rlc2NyaXB0b3IgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9kZXNjcmlwdG9yIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9kZXNjcmlwdG9yX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2Rlc2NyaXB0b3Igc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfZGVzY3JpcHRvcl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9kZXNjcmlwdG9yX2VuZF9jb3VudF91bmtub3duKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX3N0YXRpc3RpY190aHJlc2hvbGQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3N0YXRpc3RpY190aHJlc2hvbGRfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9zdGF0aXN0aWNfdGhyZXNob2xkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9zdGF0aXN0aWNfdGhyZXNob2xkIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9zdGF0aXN0aWNfdGhyZXNob2xkX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9kcG9lX3N0YXRpc3RpY190aHJlc2hvbGQgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX3N0YXRpc3RpY190aHJlc2hvbGQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc3RhdGlzdGljX3RocmVzaG9sZF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc3RhdGlzdGljX3RocmVzaG9sZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc3RhdGlzdGljX3RocmVzaG9sZCBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3N0YXRpc3RpY190aHJlc2hvbGRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWVsZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmllbGRfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9maWVsZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWVsZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWVsZF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmllbGQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpZWxkIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmllbGRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZF92MiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGRfdjJfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZF92MiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZF92MiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZF92Ml91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGRfdjIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X2ZpZWxkX3YyIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGRfdjJfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGRfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9maWVsZF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X2ZpZWxkIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfZmllbGRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHQgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0ICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfcmVzdWx0IHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9yZXN1bHRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3Jlc3VsdF9zZXRfY291bnRfdmFsdWUoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGUgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX3J1bGVfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ydWxlIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcnVsZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX3NoYXBlciB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc2hhcGVyX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc2hhcGVyICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX3NoYXBlciBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9zaGFwZXJfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3NoYXBlciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc2hhcGVyIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2Vfc2hhcGVyX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmF0ZV9sZXZlbCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmF0ZV9sZXZlbF9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3JhdGVfbGV2ZWwgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmF0ZV9sZXZlbCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9yYXRlX2xldmVsX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9yYXRlX2xldmVsICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fZHBvZV9yYXRlX2xldmVsIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfcmF0ZV9sZXZlbF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X29wdGlvbnMgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X29wdGlvbnNfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9ldmVudF9vcHRpb25zICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X29wdGlvbnMgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXZlbnRfb3B0aW9uc191bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXZlbnRfb3B0aW9ucyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXZlbnRfb3B0aW9ucyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X29wdGlvbnNfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdTE2X2xpc3RfdTggdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV91MTZfbGlzdF91OF9wYWNrKGJjbW9sdF9lcG9uX29hbV91MTZfbGlzdF91OCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX3UxNl9saXN0X3U4IHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdTE2X2xpc3RfdThfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3UxNl9saXN0X3U4ICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdTE2X2xpc3RfdTggZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3UxNl9saXN0X3U4X3VucGFjayhiY21vbHRfZXBvbl9vYW1fdTE2X2xpc3RfdTggKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV91MTZfbGlzdF91OCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV91MTZfbGlzdF91OF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Ugc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2RlZl9jb3VudF91bmtub3duKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX21hbnVmYWN0dXJlcl9pbmZvX2NvdW50X2RlZihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9maXJtd2FyZV9maWxlbmFtZV9jb3VudF9maXJtd2FyZV9maWxlbmFtZShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9tZnJfbmFtZV9jb3VudF9tYW5fbmFtZShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV92ZW5kb3JfbmFtZV9jb3VudF92ZW5kb3JfbmFtZShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9tb2RlbF9udW1iZXJfY291bnRfbW9kZWxfbnVtYmVyKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2h3X3ZlcnNpb25fY291bnRfaHdfdmVyc2lvbihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9vcHRfbW9uX3RlbXBlcmF0dXJlX2NvdW50X2N1cnJlbnRfdGVtcGVyYXR1cmUoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfb3B0X21vbl92Y2NfY291bnRfY3VycmVudF92Y2MoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfb3B0X21vbl90eF9iaWFzX2NvdW50X2N1cnJlbnRfdHhfYmlhcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9vcHRfbW9uX3R4X3Bvd2VyX2NvdW50X2N1cnJlbnRfdHhfcG93ZXIoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX2Jhc2Vfb3B0X21vbl9yeF9wb3dlcl9jb3VudF9jdXJyZW50X3J4X3Bvd2VyKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX2RvbnVfcG9ydF90eXBlX2NvdW50X3BvcnRfdHlwZShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfYmFzZV9zdXNwZW5kX3Jlc3VtZV9hbGFybV9yZXBvcnRpbmdfY291bnRfZGVmKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9iYXNlX3RpbWVfdHJhbnNmZXJfY291bnRfdG9kX3N0cmluZyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfbWFjX3RhYmxlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfbWFjX3RhYmxlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX21hY190YWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfbWFjX3RhYmxlIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX21hY190YWJsZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfbWFjX3RhYmxlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfbWFjX3RhYmxlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9tYWNfdGFibGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9tYWNfdGFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9kcG9lX2F0dHJpYnV0ZV92YWx1ZV9tYWNfdGFibGUgc3RydWN0IAorICogYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9hdHRyaWJ1dGVfdmFsdWVfbWFjX3RhYmxlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfYXR0cmlidXRlX3ZhbHVlX21hY190YWJsZV9jb3VudF9tYWNfYWRkcmVzcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9ldmVudF9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ldmVudF9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXZlbnRfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXZlbnRfYmFzZSB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZXZlbnRfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZHBvZV9ldmVudF9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9ldmVudF9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9kcG9lX2V2ZW50X2Jhc2Ugc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9ldmVudF9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfYmFzZSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfYmFzZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX2ZpbGVfdHJhbnNmZXJfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Jhc2Ugc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Jhc2VfZmlsZV93cml0ZV9jb3VudF9maWxlbmFtZShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9pbmZvX3RsdiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaW5mb190bHZfcGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV9pbmZvX3RsdiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaW5mb190bHYgd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX2luZm9fdGx2X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9kcG9lX2luZm9fdGx2ICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV9pbmZvX3RsdiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV9pbmZvX3Rsdl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaW5mb190bHYgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9kcG9lX2luZm9fdGx2IHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfaW5mb190bHZfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdTh2YWx1ZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3U4dmFsdWVfcGFjayhiY21vbHRfZXBvbl9vYW1fdTh2YWx1ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdTh2YWx1ZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdTh2YWx1ZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3U4dmFsdWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV91OHZhbHVlIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3U4dmFsdWVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3U2NHZhbHVlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdTY0dmFsdWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV91NjR2YWx1ZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9zdGRfYXR0cmlidXRlX3ZhbHVlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc3RkX2F0dHJpYnV0ZV92YWx1ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9zdGRfYXR0cmlidXRlX3ZhbHVlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fc3RkX2F0dHJpYnV0ZV92YWx1ZSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdHRyaWJ1dGVfdmFsdWVfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdHRyaWJ1dGVfdmFsdWUgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9zdGRfYXR0cmlidXRlX3ZhbHVlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zdGRfYXR0cmlidXRlX3ZhbHVlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fc3RkX2F0dHJpYnV0ZV92YWx1ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdHRyaWJ1dGVfdmFsdWUgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc3RkX2F0dHJpYnV0ZV92YWx1ZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9zdGRfYXR0cmlidXRlX3ZhbHVlX2F1dG9fbmVnX2xvY2FsX3RlY2hfYWJpbGl0eV9jb3VudF9jYXBhYmlsaXRpZXMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3N0ZF9hdHRyaWJ1dGVfdmFsdWVfYXV0b19uZWdfYWR2ZXJ0aXNlZF90ZWNoX2FiaWxpdHlfY291bnRfY2FwYWJpbGl0aWVzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9zdGRfYXR0cmlidXRlX3ZhbHVlX2F1dG9fbmVnX3J4X3RlY2hfY291bnRfY2FwYWJpbGl0aWVzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9zdGRfYXR0cmlidXRlX3ZhbHVlX21hY19jdHJsX2Z1bmNzX3N1cHBvcnRlZF9jb3VudF9mdW5jdGlvbnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3N0ZF9hY3Rpb25fdmFsdWVfYmFzZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3N0ZF9hY3Rpb25fdmFsdWVfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9zdGRfYWN0aW9uX3ZhbHVlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3N0ZF9hY3Rpb25fdmFsdWVfYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc3RkX2FjdGlvbl92YWx1ZV9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fc3RkX2FjdGlvbl92YWx1ZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fc3RkX2FjdGlvbl92YWx1ZV9iYXNlIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3N0ZF9hY3Rpb25fdmFsdWVfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2UgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlX2VuZF9jb3VudF91bmtub3duKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2Ugc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlX2dldF9yZXF1ZXN0X2NvdW50X3ZhcnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfZ2V0X3Jlc3BvbnNlX2NvdW50X3ZhcnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2Vfc2V0X3JlcXVlc3RfY291bnRfdmFycyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZV9zZXRfcmVzcG9uc2VfY291bnRfdmFycyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGxzX3ZlcnNpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfdmVyc2lvbl9wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfdmVyc2lvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGxzX3ZlcnNpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc192ZXJzaW9uX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX3ZlcnNpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV90bHNfdmVyc2lvbiBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfdmVyc2lvbl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfcmFuZG9tIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3JhbmRvbV9wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfcmFuZG9tICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfcmFuZG9tIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfcmFuZG9tX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX3JhbmRvbSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3Rsc19yYW5kb20gc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3JhbmRvbV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfc2Vzc2lvbl9pZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19zZXNzaW9uX2lkX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19zZXNzaW9uX2lkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fdGxzX3Nlc3Npb25faWQgd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90bHNfc2Vzc2lvbl9pZF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGxzX3Nlc3Npb25faWQgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfc2Vzc2lvbl9pZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3Nlc3Npb25faWRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfc2Vzc2lvbl9pZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3Rsc19zZXNzaW9uX2lkIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19zZXNzaW9uX2lkX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZV9saXN0IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlX2xpc3RfcGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV90bHNfY2lwaGVyc3VpdGVfbGlzdCB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZV9saXN0X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV90bHNfY2lwaGVyc3VpdGVfbGlzdCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZV9saXN0IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY2lwaGVyc3VpdGVfbGlzdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19jaXBoZXJzdWl0ZV9saXN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlX2xpc3Qgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2NpcGhlcnN1aXRlX2xpc3Rfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX2xpc3QgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY29tcHJlc3Npb25fbGlzdF9wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfY29tcHJlc3Npb25fbGlzdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9saXN0IHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX2xpc3RfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9saXN0ICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX2xpc3QgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19jb21wcmVzc2lvbl9saXN0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGxzX2NvbXByZXNzaW9uX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV90bHNfY29tcHJlc3Npb25fbGlzdCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY29tcHJlc3Npb25fbGlzdF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfbGlzdCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV9saXN0X3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV9saXN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX2xpc3Qgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfbGlzdF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX2xpc3QgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfbGlzdCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX2xpc3RfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfbGlzdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV9saXN0IHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV9saXN0X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV9saXN0X2NvdW50X2NlcnRpZmljYXRlX2xpc3QoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV90eXBlX2xpc3QgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZV9saXN0X3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV90eXBlX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZV9saXN0IAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX3R5cGVfbGlzdF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX3R5cGVfbGlzdCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV90eXBlX2xpc3QgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19jZXJ0aWZpY2F0ZV90eXBlX2xpc3RfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZV9saXN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fdGxzX2NlcnRpZmljYXRlX3R5cGVfbGlzdCBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfY2VydGlmaWNhdGVfdHlwZV9saXN0X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fdGxzX2hhbmRzaGFrZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfaGFuZHNoYWtlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rsc19oYW5kc2hha2VfZmluaXNoZWRfY291bnRfdmVyaWZ5X2RhdGEoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmRfaGFuZHNoYWtlX2NvdW50X2hhbmRzaGFrZV9yZWNvcmRzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX21lc3NhZ2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX21lc3NhZ2VfcGFjayhiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19tZXNzYWdlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19tZXNzYWdlIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19tZXNzYWdlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX21lc3NhZ2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX21lc3NhZ2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfbWVzc2FnZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfbWVzc2FnZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfbWVzc2FnZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX21lc3NhZ2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19tZXNzYWdlX2NvdW50X3Rsc19yZWNvcmRzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX2hlYWRlciB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfaGVhZGVyX3BhY2soYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfaGVhZGVyICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19oZWFkZXIgd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX2hlYWRlcl9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19oZWFkZXIgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX2hlYWRlciBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZWFwX3Rsc19oZWFkZXJfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9lYXBfdGxzX2hlYWRlciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfaGVhZGVyIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2VhcF90bHNfaGVhZGVyX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2VhcF9mcmFtZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2VhcF9mcmFtZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9lYXBfZnJhbWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9lYXBfZnJhbWUgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9lYXBfZnJhbWVfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2VhcF9mcmFtZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2VhcF9mcmFtZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZWFwX2ZyYW1lX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZWFwX2ZyYW1lICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fZWFwX2ZyYW1lIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2VhcF9mcmFtZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9lYXBvbF9wZHUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lYXBvbF9wZHVfcGFjayhiY21vbHRfZXBvbl9vYW1fZWFwb2xfcGR1ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fZWFwb2xfcGR1IHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZWFwb2xfcGR1X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9lYXBvbF9wZHUgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9lYXBvbF9wZHUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3BkdV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3BkdSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3BkdSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lYXBvbF9wZHVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZWFwb2xfcHJvdG9jb2wgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lYXBvbF9wcm90b2NvbF9wYWNrKGJjbW9sdF9lcG9uX29hbV9lYXBvbF9wcm90b2NvbCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3Byb3RvY29sIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZWFwb2xfcHJvdG9jb2xfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3Byb3RvY29sICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZWFwb2xfcHJvdG9jb2wgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2VhcG9sX3Byb3RvY29sX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZWFwb2xfcHJvdG9jb2wgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9lYXBvbF9wcm90b2NvbCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9lYXBvbF9wcm90b2NvbF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV92bGFuX3ZhbHVlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmxhbl92YWx1ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV92bGFuX3ZhbHVlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV92bGFuX3ZhbHVlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV92bGFuX3ZhbHVlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdmxhbl92YWx1ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3ZsYW5fdmFsdWUgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmxhbl92YWx1ZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9pdGFnX3ZhbHVlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1faXRhZ192YWx1ZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9pdGFnX3ZhbHVlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9pdGFnX3ZhbHVlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9pdGFnX3ZhbHVlX3VucGFjayhiY21vbHRfZXBvbl9vYW1faXRhZ192YWx1ZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2l0YWdfdmFsdWUgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1faXRhZ192YWx1ZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHYgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHZfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2luZm9fdGx2ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fdGVrX2luZm9fdGx2IHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX2luZm9fdGx2X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHYgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHYgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19pbmZvX3Rsdl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19pbmZvX3RsdiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3Rla19pbmZvX3RsdiBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfaW5mb190bHZfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2luZm8gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mb19wYWNrKGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mbyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19pbmZvIAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2luZm9fZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19pbmZvICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2luZm8gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19pbmZvX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2luZm8gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mbyBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mb19zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mb19jdGNfY291bnRfc3VwcF92ZXJzaW9uKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mbyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvX3BhY2soYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mbyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm9fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mbyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl9iYXNlIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1faW5mb190bHZfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1faW5mb190bHZfYmFzZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1faW5mb190bHZfYmFzZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9pbmZvX3Rsdl9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X2Jhc2VfZW5kX2NvdW50X3Vua25vd24oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19saW5rX2V2ZW50X2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfbGlua19ldmVudF9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19saW5rX2V2ZW50X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19saW5rX2V2ZW50X2Jhc2Ugd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfbGlua19ldmVudF9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfbGlua19ldmVudF9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2xpbmtfZXZlbnRfYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2xpbmtfZXZlbnRfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19saW5rX2V2ZW50X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfbGlua19ldmVudF9iYXNlIAorICogc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19saW5rX2V2ZW50X2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90bHZfYmFzZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdGx2X2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90bHZfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdGx2X2Jhc2Ugd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3Rsdl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3Rsdl9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90bHZfYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90bHZfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdGx2X2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9saW5rX2V2ZW50X3Rsdl9iYXNlIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2xpbmtfZXZlbnRfdGx2X2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fbGlua19ldmVudF90bHZfYmFzZV9lbmRfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdmFyX2Rlc2NyaXB0b3JfYmFzZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Zhcl9kZXNjcmlwdG9yX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fdmFyX2Rlc2NyaXB0b3JfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX3Zhcl9kZXNjcmlwdG9yX2Jhc2Ugd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV92YXJfZGVzY3JpcHRvcl9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV92YXJfZGVzY3JpcHRvcl9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdmFyX2Rlc2NyaXB0b3JfYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmFyX2Rlc2NyaXB0b3JfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Zhcl9kZXNjcmlwdG9yX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV92YXJfZGVzY3JpcHRvcl9iYXNlIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Zhcl9kZXNjcmlwdG9yX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdmFyX2Rlc2NyaXB0b3JfYmFzZV9lbmRfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV92YXJfY29udGFpbmVyX2Jhc2Ugc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZV9lbmRfY291bnRfdW5rbm93bihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX29iamVjdF9jb3VudF92YWx1ZShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdmFyX2NvbnRhaW5lcl9iYXNlX3BhY2thZ2VfY291bnRfdmFsdWUoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZV9uYW1lX2JpbmRpbmdfY291bnRfdmFsdWUoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZV9hdHRyaWJ1dGVfY291bnRfdmFsdWUoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Zhcl9jb250YWluZXJfYmFzZV9hY3Rpb25fY291bnRfdmFsdWUoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfcXVldWVfbmFtZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfcXVldWVfbmFtZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X3F1ZXVlX25hbWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfcXVldWVfbmFtZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9xdWV1ZV9uYW1lX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9xdWV1ZV9uYW1lICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9xdWV1ZV9uYW1lIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfcXVldWVfbmFtZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHRfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0IHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHQgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X2xvZ2ljYWxfbGlua19jb3VudF9saW5rX251bWJlcihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X3BvcnRfY291bnRfcG9ydF9udW1iZXIoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19vYmplY3RfY29udGV4dF9uZXR3b3JrX3Bvbl9jb3VudF9wb25fbnVtYmVyKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHRfdXNlcl9wb25fY291bnRfcG9uX251bWJlcihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX29iamVjdF9jb250ZXh0X2JyaWRnZV9jb3VudF9icmlkZ2VfbnVtYmVyKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfb2JqZWN0X2NvbnRleHRfYnJpZGdlX3BvcnRfY291bnRfcG9ydF9udW1iZXIoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY3JpcHRvciB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY3JpcHRvcl9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NyaXB0b3IgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NyaXB0b3Igd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NyaXB0b3JfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY3JpcHRvciAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY3JpcHRvciBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjcmlwdG9yX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjcmlwdG9yICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjcmlwdG9yIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY3JpcHRvcl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NyaXB0b3JfZW5kX2NvdW50X3Vua25vd24oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2x1ZV9maWVsZF9zZWxlY3RfZW50cnkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9sdWVfZmllbGRfc2VsZWN0X2VudHJ5X3BhY2soYmNtb2x0X2Vwb25fb2FtX2x1ZV9maWVsZF9zZWxlY3RfZW50cnkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2x1ZV9maWVsZF9zZWxlY3RfZW50cnkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2x1ZV9maWVsZF9zZWxlY3RfZW50cnlfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9sdWVfZmllbGRfc2VsZWN0X2VudHJ5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fbHVlX2ZpZWxkX3NlbGVjdF9lbnRyeSBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9sdWVfZmllbGRfc2VsZWN0X2VudHJ5X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9jbGF1c2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfY2xhdXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9jbGF1c2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9jbGF1c2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9jbGF1c2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfY2xhdXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX2NsYXVzZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfY2xhdXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGUgd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3J1bGVfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9ydWxlIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcnVsZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X2lnbXBfdmxhbiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF92bGFuX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF92bGFuICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X2lnbXBfdmxhbiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX3ZsYW5fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X2lnbXBfdmxhbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF92bGFuIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF92bGFuX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX21hcHBpbmcgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9tYXBwaW5nX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX21hcHBpbmcgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX21hcHBpbmcgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla192bGFuX2Rlc3RpbmF0aW9uX21hcHBpbmdfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9tYXBwaW5nICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fdGVrX3ZsYW5fZGVzdGluYXRpb25fbWFwcGluZyBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfdmxhbl9kZXN0aW5hdGlvbl9tYXBwaW5nX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19maXJtd2FyZV90aW1lc3RhbXAgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfZmlybXdhcmVfdGltZXN0YW1wX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19maXJtd2FyZV90aW1lc3RhbXAgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19maXJtd2FyZV90aW1lc3RhbXAgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19maXJtd2FyZV90aW1lc3RhbXBfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfZmlybXdhcmVfdGltZXN0YW1wICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fdGVrX2Zpcm13YXJlX3RpbWVzdGFtcCBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfZmlybXdhcmVfdGltZXN0YW1wX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3J1bGVfZW50cnkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9ydWxlX2VudHJ5X3BhY2soYmNtb2x0X2Vwb25fb2FtX3J1bGVfZW50cnkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9ydWxlX2VudHJ5IHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fcnVsZV9lbnRyeV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fcnVsZV9lbnRyeSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3J1bGVfZW50cnkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3J1bGVfZW50cnlfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9ydWxlX2VudHJ5ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fcnVsZV9lbnRyeSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9ydWxlX2VudHJ5X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfcnVsZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfcnVsZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3J1bGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3J1bGUgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3J1bGVfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfcnVsZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfcnVsZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9ydWxlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9ydWxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9ydWxlIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfcnVsZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3J1bGVfY2xhdXNlX2NvdW50X21hdGNoX3ZhbHVlKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3J1bGVfcmVzdWx0X2NvdW50X3BhcmFtZXRlcihiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdW5pX3NoYXBlciB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3VuaV9zaGFwZXJfcGFjayhiY21vbHRfZXBvbl9vYW1fdW5pX3NoYXBlciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdW5pX3NoYXBlciBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdW5pX3NoYXBlcl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3VuaV9zaGFwZXIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV91bmlfc2hhcGVyIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3VuaV9zaGFwZXJfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZXh0ZW5kZWRfdmVyc2lvbl9udW1iZXIgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF92ZXJzaW9uX251bWJlcl9wYWNrKGJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF92ZXJzaW9uX251bWJlciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZXh0ZW5kZWRfdmVyc2lvbl9udW1iZXIgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2V4dGVuZGVkX3ZlcnNpb25fbnVtYmVyX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZXh0ZW5kZWRfdmVyc2lvbl9udW1iZXIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF92ZXJzaW9uX251bWJlciBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF92ZXJzaW9uX251bWJlcl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF9sb2FkX2xhYmVsIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZXh0ZW5kZWRfbG9hZF9sYWJlbF9wYWNrKGJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF9sb2FkX2xhYmVsICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF9sb2FkX2xhYmVsIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9leHRlbmRlZF9sb2FkX2xhYmVsX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZXh0ZW5kZWRfbG9hZF9sYWJlbCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2V4dGVuZGVkX2xvYWRfbGFiZWwgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZXh0ZW5kZWRfbG9hZF9sYWJlbF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fZmlybXdhcmUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fZmlybXdhcmVfcGFjayhiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Zpcm13YXJlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fZmlybXdhcmUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2ZpbGVfaW5mb19maXJtd2FyZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2ZpbGVfaW5mb19maXJtd2FyZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2ZpbGVfaW5mb19maXJtd2FyZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fZmlybXdhcmVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX2ZpbGVfaW5mb19iYXNlIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX2ZpbGVfaW5mb19iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2ZpbGVfaW5mb19iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fZmlsZV9pbmZvX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fYmFzZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9maWxlX2luZm9fYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19iaXRfbG9hZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX2JpdF9sb2FkX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX2JpdF9sb2FkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19iaXRfbG9hZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2NfYml0X2xvYWRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19iaXRfbG9hZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX2JpdF9sb2FkIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX2JpdF9sb2FkX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX2JpdF9sb2FkaW5nIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2NfYml0X2xvYWRpbmdfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2NfYml0X2xvYWRpbmcgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX2JpdF9sb2FkaW5nIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19iaXRfbG9hZGluZ191bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX2JpdF9sb2FkaW5nICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2NfYml0X2xvYWRpbmcgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2NfYml0X2xvYWRpbmdfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXQgd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19zdGF0X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19zdGF0ICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vYW1fZXBvY19zdGF0IHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9lcG9jX3N0YXRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX2Vwb2Nfc3RhdF9jb3VudF92YWx1ZShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5X3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJwcmlvcml0eSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJwcmlvcml0eSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJwcmlvcml0eV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5ICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YycHJpb3JpdHlfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YycHJpb3JpdHkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YycHJpb3JpdHkgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MnByaW9yaXR5X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJiYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MmJhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MmJhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YyYmFzZSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJiYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YyYmFzZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJiYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfcXVldWVfY29uZmlnX3YyYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19xdWV1ZV9jb25maWdfdjJiYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MmJhc2Ugc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3F1ZXVlX2NvbmZpZ192MmJhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX3NlcXVlbmNlX251bWJlciB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19zZXF1ZW5jZV9udW1iZXJfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3NlcXVlbmNlX251bWJlciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX3NlcXVlbmNlX251bWJlciBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3NlcXVlbmNlX251bWJlcl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19zZXF1ZW5jZV9udW1iZXIgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV90ZWtfc2VxdWVuY2VfbnVtYmVyIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19zZXF1ZW5jZV9udW1iZXJfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb251X2Nsb2NrX3RyYW5zcG9ydF9jb25maWcgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfY2xvY2tfdHJhbnNwb3J0X2NvbmZpZ19wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfY2xvY2tfdHJhbnNwb3J0X2NvbmZpZyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb251X2Nsb2NrX3RyYW5zcG9ydF9jb25maWcgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9jbG9ja190cmFuc3BvcnRfY29uZmlnX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb251X2Nsb2NrX3RyYW5zcG9ydF9jb25maWcgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vbnVfY2xvY2tfdHJhbnNwb3J0X2NvbmZpZyBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfY2xvY2tfdHJhbnNwb3J0X2NvbmZpZ19zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3BvcnRfaW5mbyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5fcG9ydF9pbmZvX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5fcG9ydF9pbmZvICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3BvcnRfaW5mbyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9wb3J0X2luZm9fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3BvcnRfaW5mbyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5fcG9ydF9pbmZvIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5fcG9ydF9pbmZvX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5faW5mbyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5faW5mb19wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX2luZm8gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX2luZm8gd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX2luZm9fZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5faW5mbyAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5faW5mbyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9pbmZvX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9pbmZvICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9pbmZvIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5faW5mb19zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3JlY29yZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5fcmVjb3JkX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5fcmVjb3JkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9yZWNvcmQgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3JlY29yZF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9yZWNvcmQgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3JlY29yZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX21jYXN0X2RvbWFpbl9yZWNvcmRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fbWNhc3RfZG9tYWluX3JlY29yZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5fcmVjb3JkIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9tY2FzdF9kb21haW5fcmVjb3JkX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWUgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWUgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfYXR0cmlidXRlX3ZhbHVlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19hdHRyaWJ1dGVfdmFsdWVfcmVwb3J0X3RocmVzaG9sZHNfY291bnRfdGhyZXNob2xkcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9uZXdfZG5fZmlsdGVyX3RibF9jb3VudF9ydWxlcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9uZXdfdXBfZmlsdGVyX3RibF9jb3VudF9ydWxlcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX2F0dHJpYnV0ZV92YWx1ZV9udnNfc2NyYXRjaHBhZF9jb3VudF9kYXRhKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWcgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZ19nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWcgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9xdWV1ZV9jb25maWdfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfb251X3F1ZXVlX2NvbmZpZyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfcXVldWVfY29uZmlnX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX3BvcnRfY29uZmlnIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfc25vb3BpbmdfcG9ydF9jb25maWdfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfc25vb3BpbmdfcG9ydF9jb25maWcgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX3BvcnRfY29uZmlnIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfaWdtcF9zbm9vcGluZ19wb3J0X2NvbmZpZ191bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19pZ21wX3Nub29waW5nX3BvcnRfY29uZmlnICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfc25vb3BpbmdfcG9ydF9jb25maWcgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2lnbXBfc25vb3BpbmdfcG9ydF9jb25maWdfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX2dyb3VwX25vX3ZpZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF9ncm91cF9ub192aWRfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX2dyb3VwX25vX3ZpZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX2dyb3VwX25vX3ZpZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX29udV9pZ21wX2dyb3VwX25vX3ZpZF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF9ncm91cF9ub192aWQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV90ZWtfb251X2lnbXBfZ3JvdXBfbm9fdmlkIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19vbnVfaWdtcF9ncm91cF9ub192aWRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV90ZWtfYWN0aW9uX3ZhbHVlX2Jhc2Ugc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19hY3Rpb25fdmFsdWVfYmFzZV9hZGRfcnVsZV9jb3VudF9ydWxlcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlX25ld19kZWxfcnVsZV9jb3VudF9ydWxlcyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX2FjdGlvbl92YWx1ZV9iYXNlX2RlbGV0ZV9ydWxlX2NvdW50X3J1bGVzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lciB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9jb250YWluZXIgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lcl9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9jb250YWluZXIgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lciBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9jb250YWluZXJfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2NvbnRhaW5lciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfY29udGFpbmVyX2VuZF9jb3VudF91bmtub3duKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2Ugd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF9hY3Rpb25fdmFsdWVfYmFzZSBzdHJ1Y3QgCisgKiBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfYWN0aW9uX3ZhbHVlX2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX2FjdGlvbl92YWx1ZV9iYXNlX2RlZl9jb3VudF91bmtub3duKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfdmFyX2NvbnRhaW5lcl9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX3Zhcl9jb250YWluZXJfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfdmFyX2NvbnRhaW5lcl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSAKKyAqIGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfdmFyX2NvbnRhaW5lcl9iYXNlIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF92YXJfY29udGFpbmVyX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF92YXJfY29udGFpbmVyX2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfdmFyX2NvbnRhaW5lcl9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfdmFyX2NvbnRhaW5lcl9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX3Zhcl9jb250YWluZXJfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3Rla19zZXRfcmVzcF92YXJfY29udGFpbmVyX2Jhc2Ugc3RydWN0IAorICogYW5kIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3NldF9yZXNwX3Zhcl9jb250YWluZXJfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfc2V0X3Jlc3BfdmFyX2NvbnRhaW5lcl9iYXNlX2VuZF9jb3VudF91bmtub3duKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZF9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZCB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWQgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWQgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90ZWtfdmVuZG9yX2V4dGVuZGVkX2dldF9yZXF1ZXN0X2NvdW50X3ZhcnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfZ2V0X3Jlc3BvbnNlX2NvdW50X3ZhcnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla192ZW5kb3JfZXh0ZW5kZWRfc2V0X3JlcXVlc3RfY291bnRfdmFycyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZF9zZXRfcmVzcG9uc2VfY291bnRfdmFycyhiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGVrX3ZlbmRvcl9leHRlbmRlZF91bmFja2VkX2FjdGlvbl9jb3VudF92YXJpYWJsZV9jb250YWluZXJzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfYmFzZSB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3BtY19maWxlX2Jhc2Ugc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcG1jX2ZpbGVfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9wbWNfZmlsZV9iYXNlX2RhdGFfY291bnRfZGF0YShiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fcG1jX3ZlbmRvcl9leHRlbmRlZF9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcG1jX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3BhY2soYmNtb2x0X2Vwb25fb2FtX3BtY192ZW5kb3JfZXh0ZW5kZWRfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX3BtY192ZW5kb3JfZXh0ZW5kZWRfYmFzZSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3BtY192ZW5kb3JfZXh0ZW5kZWRfYmFzZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fcG1jX3ZlbmRvcl9leHRlbmRlZF9iYXNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fcG1jX3ZlbmRvcl9leHRlbmRlZF9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9wbWNfdmVuZG9yX2V4dGVuZGVkX2Jhc2VfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9wbWNfdmVuZG9yX2V4dGVuZGVkX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9wbWNfdmVuZG9yX2V4dGVuZGVkX2Jhc2Ugc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fcG1jX3ZlbmRvcl9leHRlbmRlZF9iYXNlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3ZlbmRvcl9leHRlbmRlZF9vYW1fYmFzZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3ZlbmRvcl9leHRlbmRlZF9vYW1fYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV92ZW5kb3JfZXh0ZW5kZWRfb2FtX2Jhc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV92ZW5kb3JfZXh0ZW5kZWRfb2FtX2Jhc2UgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV92ZW5kb3JfZXh0ZW5kZWRfb2FtX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3ZlbmRvcl9leHRlbmRlZF9vYW1fYmFzZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3ZlbmRvcl9leHRlbmRlZF9vYW1fYmFzZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdmVuZG9yX2V4dGVuZGVkX29hbV9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdmVuZG9yX2V4dGVuZGVkX29hbV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fdmVuZG9yX2V4dGVuZGVkX29hbV9iYXNlIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3ZlbmRvcl9leHRlbmRlZF9vYW1fYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV92ZW5kb3JfZXh0ZW5kZWRfb2FtX2Jhc2VfZGVmX2NvdW50X3Vua25vd24oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudF9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnQgd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnRfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50X3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50IHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnRfaW5mb19jb3VudF90bHZzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnRfZXZlbnRfbm90aWZpY2F0aW9uX2NvdW50X3RsdnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudF92YXJfcmVxdWVzdF9jb3VudF92YXJzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnRfdmFyX3Jlc3BvbnNlX2NvdW50X3ZhcnMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9lbmRfcG9pbnQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfZW5kX3BvaW50X3BhY2soYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9lbmRfcG9pbnQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9lbmRfcG9pbnQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9lbmRfcG9pbnRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfZW5kX3BvaW50ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2VuZF9wb2ludCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfZW5kX3BvaW50X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfb2FtX2NvbnRlbnQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX29hbV9jb250ZW50X3BhY2soYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfb2FtX2NvbnRlbnQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX29hbV9jb250ZW50IHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9vYW1fY29udGVudF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9vYW1fY29udGVudCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfb2FtX2NvbnRlbnQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfb2FtX2NvbnRlbnRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX29hbV9jb250ZW50ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9vYW1fY29udGVudCBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX29hbV9jb250ZW50X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3Jfb3VpIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvcl9vdWlfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvcl9vdWkgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3Jfb3VpIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdmVuZG9yX291aV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3Jfb3VpICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvcl9vdWkgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvcl9vdWlfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvciB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3JfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3Igd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdmVuZG9yX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdmVuZG9yICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvciBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3ZlbmRvcl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3IgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdmVuZG9yIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb192ZW5kb3Jfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3RsdiB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb190bHZfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3RsdiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb190bHYgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdGx2X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdGx2ICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3RsdiBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX3Rsdl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb190bHYgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fdGx2IHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb190bHZfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX2NvbnQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fY29udF9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fY29udCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19jb250IHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX2NvbnRfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19jb250ICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX2NvbnQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb19jb250X3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX2NvbnQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fY29udCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fY29udF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm8gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19pbmZvX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm8gKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm8gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mb191bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mbyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfaW5mbyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2luZm9fc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyX2Rlc2MgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJfZGVzY19wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJfZGVzYyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyX2Rlc2MgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3Zhcl9kZXNjX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyX2Rlc2MgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJfZGVzYyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJfZGVzY19zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlX2xpc3QgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZV9saXN0X3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZV9saXN0IAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfbGlzdF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfbGlzdCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlX2xpc3QgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX3ZhcmlhYmxlX2xpc3RfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZV9saXN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfdmFyaWFibGVfbGlzdCBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y192YXJpYWJsZV9saXN0X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wX3ZhcmlhYmxlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3BfdmFyaWFibGVfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3BfdmFyaWFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcF92YXJpYWJsZSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wX3ZhcmlhYmxlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcF92YXJpYWJsZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wX3ZhcmlhYmxlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcF92YXJpYWJsZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wX3ZhcmlhYmxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3BfdmFyaWFibGUgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3BfdmFyaWFibGVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3Bjb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3Bjb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wY29kZSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX29wY29kZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3Bjb2RlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3Bjb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcGNvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcGNvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19vcGNvZGUgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfb3Bjb2RlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX2NvbnQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19jb250X3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX2NvbnQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19jb250IHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfY29udF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfY29udCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX2NvbnQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX2NvbnRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19jb250ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfY29udCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y19jb250X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGMgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0YyB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0YyAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2N0Y191bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfY3RjICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGMgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19jdGNfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyX2Rlc2MgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJfZGVzY19wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJfZGVzYyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyX2Rlc2MgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3Zhcl9kZXNjX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyX2Rlc2MgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJfZGVzYyBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJfZGVzY19zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlX2xpc3QgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZV9saXN0X3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZV9saXN0IAorICogd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfbGlzdF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfbGlzdCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlX2xpc3QgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX3ZhcmlhYmxlX2xpc3RfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZV9saXN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfdmFyaWFibGVfbGlzdCBzdHJ1Y3QgYW5kIAorICogY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla192YXJpYWJsZV9saXN0X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wX3ZhcmlhYmxlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3BfdmFyaWFibGVfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3BfdmFyaWFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcF92YXJpYWJsZSAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wX3ZhcmlhYmxlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcF92YXJpYWJsZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wX3ZhcmlhYmxlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcF92YXJpYWJsZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wX3ZhcmlhYmxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3BfdmFyaWFibGUgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3BfdmFyaWFibGVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3Bjb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3Bjb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wY29kZSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX29wY29kZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3Bjb2RlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3Bjb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcGNvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcGNvZGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19vcGNvZGUgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfb3Bjb2RlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX2NvbnQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19jb250X3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX2NvbnQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19jb250IHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfY29udF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfY29udCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX2NvbnQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX2NvbnRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19jb250ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfY29udCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla19jb250X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWsgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3RlayB3b3VsZCBvY2N1cHkgb24gCisgKiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3RlayAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3Rla191bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdGVrICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWsgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ190ZWtfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3Zhcl9kZXNjIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3Zhcl9kZXNjX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJfZGVzYyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3Zhcl9kZXNjIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyX2Rlc2NfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyX2Rlc2MgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyX2Rlc2Mgc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3Zhcl9kZXNjX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGVfbGlzdCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9saXN0X3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9saXN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlX2xpc3QgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGVfbGlzdF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlX2xpc3QgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGVfbGlzdCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3ZhcmlhYmxlX2xpc3RfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfdmFyaWFibGVfbGlzdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9saXN0IHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV92YXJpYWJsZV9saXN0X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcF92YXJpYWJsZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcF92YXJpYWJsZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3BfdmFyaWFibGUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3BfdmFyaWFibGUgCisgKiB3b3VsZCBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3BfdmFyaWFibGVfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcF92YXJpYWJsZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcF92YXJpYWJsZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wX3ZhcmlhYmxlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wX3ZhcmlhYmxlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wX3ZhcmlhYmxlIHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcF92YXJpYWJsZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3Bjb2RlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wY29kZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3Bjb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wY29kZSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcGNvZGVfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcGNvZGUgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3Bjb2RlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Vfb3Bjb2RlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9vcGNvZGUgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX29wY29kZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfY29udCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9jb250X3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9jb250ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX2NvbnQgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfY29udF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX2NvbnQgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfY29udCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX2NvbnRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfY29udCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9jb250IHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9jb250X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2Ugd291bGQgb2NjdXB5IG9uIAorICogdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX2Rwb2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19kcG9lIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IAorICogcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfZHBvZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9vdWkgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9vdWlfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3Jfb3VpICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3Jfb3VpIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3Jfb3VpX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9vdWkgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9vdWkgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX291aV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX291aSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX291aSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9vdWlfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfY29udCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX2NvbnRfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfY29udCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX2NvbnQgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9jb250X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9jb250ICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfY29udCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfY29udF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX2NvbnQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9jb250IHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX2NvbnRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3IgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvciAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3JfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3IgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfdmVuZG9yX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ192ZW5kb3IgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvciBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX3ZlbmRvcl9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX29wY29kZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfb3Bjb2RlX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfb3Bjb2RlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19vcGNvZGUgd291bGQgb2NjdXB5IAorICogb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX29wY29kZV9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19vcGNvZGUgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX29wY29kZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ19vcGNvZGVfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnX29wY29kZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfb3Bjb2RlIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdfb3Bjb2RlX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb24gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbiAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb24gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbiBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fbGlzdCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fbGlzdF9wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2xpc3Qgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vYW1fcmVnaXN0cmF0aW9uX2xpc3RfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fbGlzdCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fbGlzdCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9saXN0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9saXN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX3JlZ2lzdHJhdGlvbl9saXN0IHN0cnVjdCBhbmQgCisgKiBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9yZWdpc3RyYXRpb25fbGlzdF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHYgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHZfcGFjayhiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdGx2ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdGx2IHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX2NvbnRleHRfdGx2X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHYgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHYgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3Rsdl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3RsdiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9jb250ZXh0X3RsdiBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfY29udGV4dF90bHZfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW0gdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbV9wYWNrKGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtIHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW0gZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtX3VucGFjayhiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW0gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbV9saXN0IHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fbGlzdF9wYWNrKGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbV9saXN0ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fbGlzdCB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtX2xpc3RfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtX2xpc3QgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbV9saXN0IGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9uZWdvdGlhdGVkX29hbV9saXN0X3VucGFjayhiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fbGlzdCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX25lZ290aWF0ZWRfb2FtX2xpc3Qgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbmVnb3RpYXRlZF9vYW1fbGlzdF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmRfcGFjayhiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kIHdvdWxkIAorICogb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tYW5kX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmQgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbWFuZF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbWFuZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbWFuZCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIAorICogbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW1hbmRfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9yZXNwb25zZSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcmVzcG9uc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9yZXNwb25zZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcmVzcG9uc2Ugd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3Jlc3BvbnNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3Jlc3BvbnNlICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9yZXNwb25zZSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9yZXNwb25zZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcmVzcG9uc2UgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX3Jlc3BvbnNlIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfcmVzcG9uc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tdW5pY2F0aW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tdW5pY2F0aW9uX3BhY2soYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbXVuaWNhdGlvbiAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbXVuaWNhdGlvbiAKKyAqIHdvdWxkIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX29udV9tYXN0ZXJfY29tbXVuaWNhdGlvbl9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tdW5pY2F0aW9uICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tdW5pY2F0aW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW11bmljYXRpb25fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW11bmljYXRpb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vbnVfbWFzdGVyX2NvbW11bmljYXRpb24gc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb251X21hc3Rlcl9jb21tdW5pY2F0aW9uX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9wZHVfY29tbW9uIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX3BkdV9jb21tb25fcGFjayhiY21vbHRfZXBvbl9vYW1fbWFzdGVyX3BkdV9jb21tb24gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfcGR1X2NvbW1vbiB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9wZHVfY29tbW9uX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfcGR1X2NvbW1vbiAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9wZHVfY29tbW9uIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9tYXN0ZXJfcGR1X2NvbW1vbl91bnBhY2soYmNtb2x0X2Vwb25fb2FtX21hc3Rlcl9wZHVfY29tbW9uICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX3BkdV9jb21tb24gc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fbWFzdGVyX3BkdV9jb21tb25fc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX3Nsb3dfcHJvdG9jb2wgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfc2xvd19wcm90b2NvbF9wYWNrKGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfc2xvd19wcm90b2NvbCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgCisgKiBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX3Nsb3dfcHJvdG9jb2wgd291bGQgb2NjdXB5IG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX3Nsb3dfcHJvdG9jb2xfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19zbG93X3Byb3RvY29sICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX3Nsb3dfcHJvdG9jb2wgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19zbG93X3Byb3RvY29sX3VucGFjayhiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX3Nsb3dfcHJvdG9jb2wgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfc2xvd19wcm90b2NvbCAKKyAqIHN0cnVjdCBhbmQgY29sbGVjdHMgbWVtb3J5IHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfc2xvd19wcm90b2NvbF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9zbG93X3Byb3RvY29sIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbF9wYWNrKGJjbW9sdF9lcG9uX29hbV9zbG93X3Byb3RvY29sICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbCB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Nsb3dfcHJvdG9jb2xfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Nsb3dfcHJvdG9jb2wgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9zbG93X3Byb3RvY29sIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9zbG93X3Byb3RvY29sX3VucGFjayhiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3Nsb3dfcHJvdG9jb2wgc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgCisgKiByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbF9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sX3BhY2soYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2wgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2wgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2xfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sX2RlZl9jb3VudF91bmtub3duKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBDb3VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGludW91cyBsaXN0IAorICoKKyAqIFxwYXJhbSBidWYgQnVmZmVyIHBvaW50aW5nIHRvIHBhY2tlZCBsaXN0IAorICogXHJldHVybiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbF96ZXJvX2NvdW50X3BhZGRpbmcoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWVfcGFjayhiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWUgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSB3b3VsZCBvY2N1cHkgCisgKiBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWUgc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWVfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWVfY291bnRfcHJvdG9jb2xzKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2Jhc2UgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2Jhc2VfcGFjayhiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9iYXNlIHdvdWxkIG9jY3VweSBvbiAKKyAqIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9iYXNlX2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2Jhc2UgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfYmFzZV91bnBhY2soYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfYmFzZSBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2Jhc2Vfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogUGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudF9ncGlvIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudF9ncGlvX3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnRfZ3BpbyAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudF9ncGlvIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fdGVrX2V2ZW50X2dwaW9fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fdGVrX2V2ZW50X2dwaW8gKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV9vYW1fdGVrX2V2ZW50X2dwaW8gc3RydWN0IGFuZCBjb2xsZWN0cyAKKyAqIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudF9ncGlvX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnQgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fdGVrX2V2ZW50X3BhY2soYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnQgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGJjbW9sdF9lcG9uX29hbV9vYW1fdGVrX2V2ZW50IHdvdWxkIG9jY3VweSAKKyAqIG9uIHRoZSB3aXJlIAorICoKKyAqIFxyZXR1cm4gVGhlIHN0cnVjdHVyZSBzaXplIGluIGJ5dGVzIAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudCAqdGhpcyk7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnQgZnJvbSBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gdW5wYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tIAorICogXHBhcmFtIGV4dHJhX21lbSBQb2ludGVyIHRvIHRoZSBmaXJzdCBsb2NhdGlvbiBpbiBtZW1vcnkgdG8gdXNlIHRvIHN0b3JlIAorICogcG9pbnRlciBmaWVsZHMgdGhhdCBhcmUgTlVMTC4gIFNldHRpbmcgdGhpcyB0byBOVUxMIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiAKKyAqIGEgTlVMTCBwb2ludGVyIGlzIGVuY291bnRlcmVkLiAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgdW5wYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX29hbV90ZWtfZXZlbnRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV9vYW1fdGVrX2V2ZW50ICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fb2FtX3Rla19ldmVudCBzdHJ1Y3QgYW5kIGNvbGxlY3RzIG1lbW9yeSAKKyAqIHJlcXVpcmVtZW50cyBhYm92ZSBhbmQgYmV5b25kIHNpemVvZigpIAorICoKKyAqIFxwYXJhbSBwYWNrZWQgQSBzdHJlYW0gcG9pbnRpbmcgdG8gdGhlIHBhY2tlZCBieXRlIHN0cmVhbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gTnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RvcmFnZSBieXRlcyByZXF1aXJlZCAKKyAqIFxyZXR1cm4gVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBmYWlsdXJlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV9vYW1fdGVrX2V2ZW50X3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3N0ZF9tYWNfYWRkcmVzcyB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3N0ZF9tYWNfYWRkcmVzc19wYWNrKGJjbW9sdF9lcG9uX29hbV9zdGRfbWFjX2FkZHJlc3MgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBVbnBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3N0ZF9tYWNfYWRkcmVzcyBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fc3RkX21hY19hZGRyZXNzX3VucGFjayhiY21vbHRfZXBvbl9vYW1fc3RkX21hY19hZGRyZXNzICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYsIHZvaWQgKipleHRyYV9tZW0pOworCisvKiogU2NhbnMgcGFzdCBhIHBhY2tlZCBiY21vbHRfZXBvbl9vYW1fc3RkX21hY19hZGRyZXNzIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3N0ZF9tYWNfYWRkcmVzc19zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NfYXR0cl9iYXNlIHRvIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byBwYWNrIAorICogXHBhcmFtIGJ1ZiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gd3JpdGUgdG8gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjX2F0dHJfYmFzZV9wYWNrKGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NfYXR0cl9iYXNlICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjX2F0dHJfYmFzZSB3b3VsZCAKKyAqIG9jY3VweSBvbiB0aGUgd2lyZSAKKyAqCisgKiBccmV0dXJuIFRoZSBzdHJ1Y3R1cmUgc2l6ZSBpbiBieXRlcyAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY19hdHRyX2Jhc2VfZ2V0X3BhY2tlZF9sZW5ndGgoYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY19hdHRyX2Jhc2UgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NfYXR0cl9iYXNlIGZyb20gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHVucGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJlYWQgZnJvbSAKKyAqIFxwYXJhbSBleHRyYV9tZW0gUG9pbnRlciB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4gbWVtb3J5IHRvIHVzZSB0byBzdG9yZSAKKyAqIHBvaW50ZXIgZmllbGRzIHRoYXQgYXJlIE5VTEwuICBTZXR0aW5nIHRoaXMgdG8gTlVMTCB3aWxsIGNhdXNlIGFuIGVycm9yIHdoZW4gCisgKiBhIE5VTEwgcG9pbnRlciBpcyBlbmNvdW50ZXJlZC4gCisgKiBccmV0dXJuIFRSVUUgaWYgdGhlIHVucGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90ZWtfdmFyX2Rlc2NfYXR0cl9iYXNlX3VucGFjayhiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjX2F0dHJfYmFzZSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3Rla192YXJfZGVzY19hdHRyX2Jhc2Ugc3RydWN0IGFuZCAKKyAqIGNvbGxlY3RzIG1lbW9yeSByZXF1aXJlbWVudHMgYWJvdmUgYW5kIGJleW9uZCBzaXplb2YoKSAKKyAqCisgKiBccGFyYW0gcGFja2VkIEEgc3RyZWFtIHBvaW50aW5nIHRvIHRoZSBwYWNrZWQgYnl0ZSBzdHJlYW0gCisgKiBccGFyYW0gZXh0cmFfbWVtIE51bWJlciBvZiBhZGRpdGlvbmFsIHN0b3JhZ2UgYnl0ZXMgcmVxdWlyZWQgCisgKiBccmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGVrX3Zhcl9kZXNjX2F0dHJfYmFzZV9zY2FuKGJjbW9sdF9lcG9uX29hbV9idWYgKnBhY2tlZCwgdWludDMyX3QgKmV4dHJhX21lbSk7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX2NvbnRpbnVlZCB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmRfY29udGludWVkX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmRfY29udGludWVkICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYSBiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZF9jb250aW51ZWQgd291bGQgCisgKiBvY2N1cHkgb24gdGhlIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX2NvbnRpbnVlZF9nZXRfcGFja2VkX2xlbmd0aChiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZF9jb250aW51ZWQgKnRoaXMpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX2NvbnRpbnVlZCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3JlY29yZF9jb250aW51ZWRfdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfcmVjb3JkX2NvbnRpbnVlZCAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmRfY29udGludWVkIHN0cnVjdCBhbmQgY29sbGVjdHMgCisgKiBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmRfY29udGludWVkX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIENvdW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb250aW51b3VzIGxpc3QgCisgKgorICogXHBhcmFtIGJ1ZiBCdWZmZXIgcG9pbnRpbmcgdG8gcGFja2VkIGxpc3QgCisgKiBccmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdCAKKyAqLwordWludDMyX3QgYmNtb2x0X2Vwb25fb2FtX3Rsc19yZWNvcmRfY29udGludWVkX2RlZl9jb3VudF9kYXRhKGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBQYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobSB0byBieXRlcyAKKyAqCisgKiBccGFyYW0gdGhpcyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gcGFjayAKKyAqIFxwYXJhbSBidWYgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvIAorICogXHJldHVybiBUUlVFIGlmIHRoZSBwYWNrIHdhcyBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtX3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtICp0aGlzLCBiY21vbHRfZXBvbl9vYW1fYnVmICpidWYpOworCisvKiogVW5wYWNrcyBhIGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobSBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbmRfaGFzaF9hbGdvcml0aG1fdW5wYWNrKGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobSAqdGhpcywgYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmLCB2b2lkICoqZXh0cmFfbWVtKTsKKworLyoqIFNjYW5zIHBhc3QgYSBwYWNrZWQgYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtIHN0cnVjdCAKKyAqIGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtX3NjYW4oYmNtb2x0X2Vwb25fb2FtX2J1ZiAqcGFja2VkLCB1aW50MzJfdCAqZXh0cmFfbWVtKTsKKworLyoqIFBhY2tzIGEgYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtX2xpc3QgdG8gYnl0ZXMgCisgKgorICogXHBhcmFtIHRoaXMgUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIHBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byB3cml0ZSB0byAKKyAqIFxyZXR1cm4gVFJVRSBpZiB0aGUgcGFjayB3YXMgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlIAorICovCitiY21vc19ib29sIGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobV9saXN0X3BhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Zik7CisKKy8qKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIAorICogYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtX2xpc3Qgd291bGQgb2NjdXB5IG9uIHRoZSAKKyAqIHdpcmUgCisgKgorICogXHJldHVybiBUaGUgc3RydWN0dXJlIHNpemUgaW4gYnl0ZXMgCisgKi8KK3VpbnQzMl90IGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobV9saXN0X2dldF9wYWNrZWRfbGVuZ3RoKGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobV9saXN0ICp0aGlzKTsKKworLyoqIFVucGFja3MgYSBiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbmRfaGFzaF9hbGdvcml0aG1fbGlzdCBmcm9tIGJ5dGVzIAorICoKKyAqIFxwYXJhbSB0aGlzIFBvaW50ZXIgdG8gdGhlIG9iamVjdCB0byB1bnBhY2sgCisgKiBccGFyYW0gYnVmIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gCisgKiBccGFyYW0gZXh0cmFfbWVtIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGxvY2F0aW9uIGluIG1lbW9yeSB0byB1c2UgdG8gc3RvcmUgCisgKiBwb2ludGVyIGZpZWxkcyB0aGF0IGFyZSBOVUxMLiAgU2V0dGluZyB0aGlzIHRvIE5VTEwgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIAorICogYSBOVUxMIHBvaW50ZXIgaXMgZW5jb3VudGVyZWQuIAorICogXHJldHVybiBUUlVFIGlmIHRoZSB1bnBhY2sgd2FzIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAKKyAqLworYmNtb3NfYm9vbCBiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbmRfaGFzaF9hbGdvcml0aG1fbGlzdF91bnBhY2soYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtX2xpc3QgKnRoaXMsIGJjbW9sdF9lcG9uX29hbV9idWYgKmJ1Ziwgdm9pZCAqKmV4dHJhX21lbSk7CisKKy8qKiBTY2FucyBwYXN0IGEgcGFja2VkIGJjbW9sdF9lcG9uX29hbV90bHNfc2lnbmF0dXJlX2FuZF9oYXNoX2FsZ29yaXRobV9saXN0IAorICogc3RydWN0IGFuZCBjb2xsZWN0cyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFib3ZlIGFuZCBiZXlvbmQgc2l6ZW9mKCkgCisgKgorICogXHBhcmFtIHBhY2tlZCBBIHN0cmVhbSBwb2ludGluZyB0byB0aGUgcGFja2VkIGJ5dGUgc3RyZWFtIAorICogXHBhcmFtIGV4dHJhX21lbSBOdW1iZXIgb2YgYWRkaXRpb25hbCBzdG9yYWdlIGJ5dGVzIHJlcXVpcmVkIAorICogXHJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUgCisgKi8KK2JjbW9zX2Jvb2wgYmNtb2x0X2Vwb25fb2FtX3Rsc19zaWduYXR1cmVfYW5kX2hhc2hfYWxnb3JpdGhtX2xpc3Rfc2NhbihiY21vbHRfZXBvbl9vYW1fYnVmICpwYWNrZWQsIHVpbnQzMl90ICpleHRyYV9tZW0pOworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRpbnVvdXMgbGlzdCAKKyAqCisgKiBccGFyYW0gYnVmIEJ1ZmZlciBwb2ludGluZyB0byBwYWNrZWQgbGlzdCAKKyAqIFxyZXR1cm4gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0IAorICovCit1aW50MzJfdCBiY21vbHRfZXBvbl9vYW1fdGxzX3NpZ25hdHVyZV9hbmRfaGFzaF9hbGdvcml0aG1fbGlzdF9jb3VudF9zdXBwb3J0ZWRfc2lnbmF0dXJlX2FsZ29yaXRobXMoYmNtb2x0X2Vwb25fb2FtX2J1ZiAqYnVmKTsKKyNlbmRpZiAvKiBCQ01PTFRfRVBPTl9PQU1fVFlQRVNfSF8gKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nL01ha2VmaWxlIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2cvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThkMjQ0ZQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nL01ha2VmaWxlCkBAIC0wLDAgKzEsNDMgQEAKKyMgU3RhY2sKKyMKK01PRF9OQU1FID0gZGV2X2xvZworTU9EX1RZUEUgPSBsaWIKKworaWZlcSAoIiQoRU5BQkxFX0xPRykiLCAieSIpCisJTU9EX0RFUFMgPSBjbGkgdXRpbHMKKwlNT0RfREVGUyA9IC1ERU5BQkxFX0xPRworCVVTRV9MSU5UID0geWVzCisJc3JjcyA9IGJjbV9kZXZfbG9nLmMgYmNtX2Rldl9sb2dfdGFzay5jCisJaWZlcSAoIiQoRkVBVFVSRV9MT0cpIiwgInkiKQorCQlNT0RfREVGUyArPSAtRFRSSUdHRVJfTE9HR0VSX0ZFQVRVUkUKKwllbmRpZgorCisJaWZlcSAoIiQoREVWX0xPR19ERUJVRykiLCAieSIpCisJCU1PRF9ERUZTICs9IC1EREVWX0xPR19ERUJVRworCWVuZGlmCisJCisJaWZlcSAoIiQoRU5BQkxFX0NMSSkiLCAieSIpCisJCXNyY3MgKz0gYmNtX2Rldl9sb2dfY2xpLmMKKwllbmRpZgorCQorCWlmZXEgKCIkKFRPT0xDSEFJTikiLCAiZ2NjIikKKwkJRVhUUkFfQ0ZMQUdTICArPSAtV25vLWZvcm1hdC1zZWN1cml0eQorCWVuZGlmCisJCisJaWZlcSAoIiQoU1VCU1lTVEVNKSIsICJob3N0IikKKyAgICAgICBpZmVxICgiJChPU19LRVJORUwpIiwgImxpbnV4IikKKyAgICAgICAgICAgaWZlcSAoIiQoUkVMRUFTRV9CVUlMRCkiLCAieSIpCisgICAgICAgICAgICAgICBFWFRSQV9JTkNMVURFUyArPSAtSSQoVE9QX0RJUikvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZ19saW51eAorICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICBFWFRSQV9JTkNMVURFUyArPSAtSSQoVE9QX0RJUikvaG9zdC9kZXZfbG9nX2xpbnV4CisgICAgICAgICAgIGVuZGlmCisgICAgICAgZW5kaWYKKwllbmRpZgorCQorICAgIGlmZXEgKCIkKE9TKSIsICJwb3NpeCIpCisgICAgICAgIEVOQUJMRV9MT0dfU1lTTE9HID89IHkKKyAgICAgICAgaWZlcSAoIiQoRU5BQkxFX0xPR19TWVNMT0cpIiwgInkiKQorICAgICAgICAgICAgTU9EX0RFRlMgKz0gLURERVZfTE9HX1NZU0xPRworICAgICAgICBlbmRpZiAgICAgICAgICAgICAgICAgICAgICAKKyAgICBlbmRpZgorZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nL2JjbV9kZXZfbG9nLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZy9iY21fZGV2X2xvZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjOGNjMjUKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZy9iY21fZGV2X2xvZy5jCkBAIC0wLDAgKzEsNDA5IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaWZkZWYgRU5BQkxFX0xPRworCisjaW5jbHVkZSAiYmNtX2Rldl9sb2dfdGFzay5oIgorI2luY2x1ZGUgImJjbV9kZXZfbG9nX3Rhc2tfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJiY21fZGV2X2xvZy5oIgorCitzdGF0aWMgYmNtb3NfdGltZXIgZGV2X2xvZ190aW1lcjsKKworLyogU3RvcmUgdGltZXN0YW1wIHBlciBldmVyeSByYXRlLWxpbWl0ZWQgbG9nIElELiAqLworc3RhdGljIHVpbnQ2NF90IHJhdGVfbGltaXRfaWQydGltZXN0YW1wW0RFVl9MT0dfUkFURV9MSU1JVF9JRF9fTlVNX09GXTsKKworY29uc3QgY2hhciAqZGV2X2xvZ19iYXNlbmFtZShjb25zdCBjaGFyICpzdHIpCit7CisgICAgY29uc3QgY2hhciAqc2xhc2g7CisgICAgaWYgKChzbGFzaCA9IHN0cmNocihzdHIsICcvJykpKQorICAgIHsKKyAgICAgICAgY29uc3QgY2hhciAqc3RyMCA9IHN0cjsKKyAgICAgICAgc3RyID0gc3RyY2hyKHNsYXNoKzEsICcgJyk7CisgICAgICAgIC8qIElmIGxvZyBmb3JtYXQgc3RyaW5nIHdhcyBjcmVhdGVkIGJ5IEJDTV9MT0cgbWFjcm8gYW5kIHRoZXJlIGlzIG5vIGNvcnJ1cHRpb24gb2Ygc29tZSBraW5kCisgICAgICAgICAqIHN0ciBhYm92ZSBpcyBndWFyYW50ZWVkIHRvIGJlICE9IE5VTEwuIEhvd2V2ZXIsIG1ha2luZyBzdHIhPU5VTEwgYXNzdW1wdGlvbiBtYWtlcyBkZXZfbG9nCisgICAgICAgICAqIHZ1bG5lcmFibGUgdG8gYnVncyBpbiB0aGUgY2FsbGVyLiBJbiB0aGlzIGNhc2UgdGhlIGZvbGxvd2luZyBpbmV4cGVuc2l2ZSBjaGVjayBwcmV2ZW50cyBjcmFzaAorICAgICAgICAgKiBpbiBkZXZfTG9nIGFuZCBoZWxwcyBpbiBpZGVudGlmeWluZyB0aGUgcmVhbCBjdWxwcml0LgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCFzdHIpCisgICAgICAgICAgICByZXR1cm4gc3RyMDsKKyAgICAgICAgd2hpbGUgKHN0clswXSAhPSAnLycpCisgICAgICAgICAgICBzdHItLTsKKyAgICAgICAgc3RyKys7CisgICAgfQorICAgIHJldHVybiBzdHI7Cit9CisKKyNpZmRlZiBUUklHR0VSX0xPR0dFUl9GRUFUVVJFCisKKy8qIGNoZWNrIGlmIHRoZSBtZXNzYWdlIGZpdHMgdGhlIGxldmVsIGFuZCB0aGUgb3RoZXIgY3JpdGVyaWEgZm9yIGEgdHJpZ2dlcgorICAgcmV0dXJuIDEgaWYgeWVzLCB0aGUgbWVzc2FnZSB3aWxsIGJlIHByaW50ZWQKKyAgIGFuZCByZXR1cm5zIDAgaWYgdGhlIG1lc3NhZ2Ugd2lsbCBub3QgYmUgcHJpbnRlZAorKi8KK3N0YXRpYyBiY21vc19ib29sIGNoZWNrX3RyaWdnZXIoZGV2X2xvZ19pZF9wYXJtICp4aV9pZCwgYmNtX2Rldl9sb2dfbGV2ZWwgeGlfbG9nX2xldmVsKQoreworICAgIC8qIHRoZSBsZXZlbCBvZiB0aGUgbWVzc2FnZSBtdXN0IGJlIGV4YWN0bHkgdGhlIHRyaWdnZXIgbGV2ZWwgKi8KKyAgICBpZiAoeGlfaWQtPnRyaWdnZXJfbG9nX2xldmVsICE9IHhpX2xvZ19sZXZlbCkKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOyAvKiBkbyBub3QgcHJpbnQgdGhlIG1lc3NhZ2UgIC0gdGhlIGxldmVsIGRvZXMgbm90IGZpdCAqLworICAgIAorICAgIHhpX2lkLT50cmlnZ2VyLmNvdW50ZXIrKzsKKyAgICBpZiAoeGlfaWQtPnRyaWdnZXIuY291bnRlciA+PSB4aV9pZC0+dHJpZ2dlci5zdGFydF90aHJlc2hvbGQpCisgICAgeworICAgICAgICBpZiAoeGlfaWQtPnRyaWdnZXIuY291bnRlciA+PSB4aV9pZC0+dHJpZ2dlci5zdG9wX3RocmVzaG9sZCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogdHJpZ2dlciBmaW5pc2hlZCwgY2hlY2sgcmVwZWF0ICovCisgICAgICAgICAgICBpZiAoeGlfaWQtPnRyaWdnZXIucmVwZWF0X3RocmVzaG9sZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB4aV9pZC0+dHJpZ2dlci5yZXBlYXQrKzsKKyAgICAgICAgICAgICAgICBpZiAoeGlfaWQtPnRyaWdnZXIucmVwZWF0IDwgeGlfaWQtPnRyaWdnZXIucmVwZWF0X3RocmVzaG9sZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIHJld2luZCB0cmlnZ2VyIGNvbmRpdGlvbnMgKi8KKyAgICAgICAgICAgICAgICAgICAgeGlfaWQtPnRyaWdnZXIuY291bnRlciA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgLyogdHJpZ2dlciBpcyBhY3RpdmUgOiBjb3VudGVyIGdyZWF0ZXIgdGhhbiBzdGFydCBhbmQgbGVzcyB0aGFuIGVuZCAqLworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7IC8qIHByaW50IHRoZSBtZXNzYWdlICovCisgICAgfQorICAgIHJldHVybiBCQ01PU19GQUxTRTsvKiBkbyBub3QgcHJpbnQgdGhlIG1lc3NhZ2UgIC0gc3RpbGwgbGVzcyB0aGFuIHN0YXJ0IHRocmVzaG9sZCAqLworfQorCisvKiBjaGVjayBpZiB0aGUgbWVzc2FnZSBmaXRzIHRoZSBsZXZlbCBhbmQgdGhlIGNyaXRlcmlhIGZvciB0aHJvdHRsZQorICAgcmV0dXJuIDEgaWYgeWVzLCB0aGUgbWVzc2FnZSB3aWxsIGJlIHByaW50ZWQKKyAgIGFuZCByZXR1cm5zIDAgaWYgdGhlIG1lc3NhZ2Ugd2lsbCBub3QgYmUgcHJpbnRlZAorKi8KK3N0YXRpYyBiY21vc19ib29sIGNoZWNrX3Rocm90dGxlKGRldl9sb2dfaWRfcGFybSAqeGlfaWQsIGJjbV9kZXZfbG9nX2xldmVsIHhpX2xvZ19sZXZlbCkKK3sKKyAgICAvKiBjaGVjayBpZiBhbnkgdGhyb3R0bGUgaXMgZGVmaW5lZCAqLworICAgIGlmICh4aV9pZC0+dGhyb3R0bGVfbG9nX2xldmVsICE9IERFVl9MT0dfTEVWRUxfTk9fTE9HKQorICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsgLyogcHJpbnQgdGhlIG1lc3NhZ2UgIC0gbm8gdHJpZ2dlciBpcyBzZXQgKi8KKyAgICAKKyAgICAvKiB0aGUgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgbXVzdCBiZSBleGFjdGx5IHRoZSB0aHJvdHRsZSBsZXZlbCAqLworICAgIGlmICh4aV9pZC0+dGhyb3R0bGVfbG9nX2xldmVsICE9IHhpX2xvZ19sZXZlbCkKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOyAvKiBkbyBub3QgcHJpbnQgdGhlIG1lc3NhZ2UgIC0gdGhlIGxldmVsIGRvZXMgbm90IGZpdCAqLworICAgIAorICAgIHhpX2lkLT50aHJvdHRsZS5jb3VudGVyKys7CisgICAgaWYgKHhpX2lkLT50aHJvdHRsZS5jb3VudGVyID49IHhpX2lkLT50aHJvdHRsZS50aHJlc2hvbGQpCisgICAgeworICAgICAgICB4aV9pZC0+dGhyb3R0bGUuY291bnRlciA9IDA7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKyAgICByZXR1cm4gQkNNT1NfRkFMU0U7LyogZG8gbm90IHByaW50IHRoZSBtZXNzYWdlICAtIHN0aWxsIGxlc3MgdGhhbiBzdGFydCB0aHJlc2hvbGQgKi8KK30KKworI2VuZGlmCisKK3N0YXRpYyBiY21vc190aW1lcl9yYyBiY21fZGV2X2xvZ19tc2dfc2VuZF90aW1lcl9jYihiY21vc190aW1lciAqdGltZXIsIGxvbmcgZGF0YSkKK3sKKyAgICBiY21vc19tc2cgKm1zZyA9IChiY21vc19tc2cgKilkYXRhOworICAgIGJjbW9zX21zZ19zZW5kKCZkZXZfbG9nLnNhdmVfcXVldWUsIG1zZywgQkNNT1NfTVNHX1NFTkRfQVVUT19GUkVFKTsKKyAgICByZXR1cm4gQkNNT1NfVElNRVJfT0s7Cit9CisKK3VpbnQ4X3QgYmNtX2Rldl9sb2dfcG9vbF9vY2N1cGFuY3lfcGVyY2VudF9nZXQodm9pZCkKK3sKKyAgICBiY21vc19tc2dfcG9vbF9pbmZvIG1zZ19wb29sX2luZm87CisgICAgYmNtb3NfZXJybm8gZXJyb3IgPSBiY21vc19tc2dfcG9vbF9xdWVyeSgmZGV2X2xvZy5wb29sLCAmbXNnX3Bvb2xfaW5mbyk7CisgICAgaWYgKGVycm9yICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBERVZfTE9HX0VSUk9SX1BSSU5URigiYmNtb3NfbXNnX3Bvb2xfcXVlcnkoKSByZXR1cm5lZCAlcyAoJWQpXG4iLCBiY21vc19zdHJlcnJvcihlcnJvciksIGVycm9yKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAodWludDhfdCkoKDEwMCAqIChtc2dfcG9vbF9pbmZvLnBhcm0uc2l6ZSAtIG1zZ19wb29sX2luZm8uc3RhdC5mcmVlKSkgLyBtc2dfcG9vbF9pbmZvLnBhcm0uc2l6ZSk7Cit9CisKK3N0YXRpYyBiY21vc19ib29sIGJjbV9kZXZfbG9nX3Nob3VsZF9kcm9wKAorICAgIGRldl9sb2dfaWRfcGFybSAqaWQsCisgICAgYmNtX2Rldl9sb2dfbGV2ZWwgbG9nX2xldmVsLAorICAgIHVpbnQzMl90IHJhdGVfdXMsCisgICAgZGV2X2xvZ19yYXRlX2xpbWl0X2lkIHJhdGVfbGltaXRfaWQpCit7CisgICAgLyogSWYgdGhlIG1zZyBwb29sIGlzIHN1ZmZpY2llbnRseSBmdWxsLCBkcm9wIGFsbCBub24tZXJyb3IgbWVzc2FnZXMgKi8KKyAgICBpZiAoIWJjbV9kZXZfbG9nX2xldmVsX2lzX2Vycm9yKGxvZ19sZXZlbCkgJiYKKyAgICAgICAgYmNtX2Rldl9sb2dfcG9vbF9vY2N1cGFuY3lfcGVyY2VudF9nZXQoKSA+PSBERVZfTE9HX0VSUk9SX09OTFlfVEhSRVNIT0xEX1BFUkNFTlQpCisgICAgeworICAgICAgICBiY21fZGV2X2xvZ19kcm9wX3JlcG9ydCgpOworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisgICAgCisjaWZkZWYgVFJJR0dFUl9MT0dHRVJfRkVBVFVSRQorICAgIC8qIGlmIHRyaWdnZXIgZGVmaW5lZCAtIGlnbm9yZSB0aHJvdHRsZSBhbmQgcHJpbnRpbmcgbGV2ZWwgKi8KKyAgICBpZiAoaWQtPnRyaWdnZXJfbG9nX2xldmVsICE9IERFVl9MT0dfTEVWRUxfTk9fTE9HKQorICAgICAgICByZXR1cm4gY2hlY2tfdHJpZ2dlcihpZCwgbG9nX2xldmVsKTsKKyNlbmRpZgorICAgIAorICAgIC8qIGlmIHRyaWdnZXIgaXMgbm90IGZ1bGxmaWxsZWQgLSBjaGVjayBvdGhlciBjb25kaXRpb25zICovCisgICAgaWYgKGxvZ19sZXZlbCA+IGlkLT5sb2dfbGV2ZWxfcHJpbnQgJiYgbG9nX2xldmVsID4gaWQtPmxvZ19sZXZlbF9zYXZlKQorICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAKKyNpZmRlZiBUUklHR0VSX0xPR0dFUl9GRUFUVVJFCisgICAgaWYgKCFjaGVja190aHJvdHRsZShpZCwgbG9nX2xldmVsKSkKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisjZW5kaWYKKworICAgIGlmIChyYXRlX3VzICYmIHJhdGVfbGltaXRfaWQgIT0gREVWX0xPR19SQVRFX0xJTUlUX0lEX05PTkUpCisgICAgeworICAgICAgICB1aW50NjRfdCBjdXJyX3RpbWVzdGFtcDsKKworICAgICAgICAvKiBEbyByYXRlIGxpbWl0LiAqLworICAgICAgICBjdXJyX3RpbWVzdGFtcCA9IGJjbW9zX3RpbWVzdGFtcDY0KCk7CisgICAgICAgIGlmIChjdXJyX3RpbWVzdGFtcCAtIHJhdGVfbGltaXRfaWQydGltZXN0YW1wW3JhdGVfbGltaXRfaWRdIDwgcmF0ZV91cykKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOyAvKiBGaWx0ZXIgb3V0IHRoaXMgbWVzc2FnZS4gKi8KKyAgICAgICAgcmF0ZV9saW1pdF9pZDJ0aW1lc3RhbXBbcmF0ZV9saW1pdF9pZF0gPSBjdXJyX3RpbWVzdGFtcDsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfRkFMU0U7Cit9CisKK3N0YXRpYyB2b2lkIF9iY21fZGV2X2xvZ192bG9nKGRldl9sb2dfaWQgeGlfaWQsCisgICAgYmNtX2Rldl9sb2dfbGV2ZWwgeGlfbG9nX2xldmVsLAorICAgIHVpbnQzMl90IHhpX2ZsYWdzLAorICAgIHVpbnQzMl90IHJhdGVfdXMsCisgICAgZGV2X2xvZ19yYXRlX2xpbWl0X2lkIHJhdGVfbGltaXRfaWQsIAorICAgIGNvbnN0IGNoYXIgKmZtdCwKKyAgICB2YV9saXN0IGFyZ3MpCit7CisgICAgZGV2X2xvZ19pZF9wYXJtICppZCA9IChkZXZfbG9nX2lkX3Bhcm0gKil4aV9pZDsKKyAgICBkZXZfbG9nX3F1ZXVlX21zZyAqbG9nX3F1ZXVlX21zZzsKKyAgICBiY21vc19lcnJubyBlcnJvciA9IEJDTV9FUlJfT0s7CisgICAgYmNtb3NfbXNnICptc2c7CisKKyAgICBpZiAoZGV2X2xvZy5zdGF0ZSAhPSBCQ01fREVWX0xPR19TVEFURV9FTkFCTEVEKQorICAgIHsKKyAgICAgICAgaWYgKGRldl9sb2cuZmxhZ3MgJiBCQ01fREVWX0xPR19GTEFHX0RJU0FCTEVEX1dJVEhfUFJJTlRGKQorICAgICAgICAgICAgREVWX0xPR19WUFJJTlRGKGZtdCwgYXJncyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCF4aV9pZCB8fCAoeGlfaWQgPT0gREVWX0xPR19JTlZBTElEX0lEKSkKKyAgICB7CisgICAgICAgIC8qIElmIHRoaXMgSUQgd2FzIG5vdCByZWdpc3RlcmVkIC0gb3IgcmVnaXN0ZXJlZCBpbmNvcnJlY3RseSAqLworICAgICAgICBERVZfTE9HX0VSUk9SX1BSSU5URigiRXJyb3I6IHhpX2lkIG5vdCB2YWxpZCAoMHgleClcbiIsICh1bnNpZ25lZCBpbnQpeGlfaWQpOworICAgICAgICBERVZfTE9HX1ZQUklOVEYoZm10LCBhcmdzKTsgLyogVGhpcyB3aWxsIGFsbG93IHVzIHRvIGRlYnVnIHdoYXQgbGluZSBjYXVzZWQgdGhlIGJ1Zy4gKi8KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoKHhpX2xvZ19sZXZlbCA+PSBERVZfTE9HX0xFVkVMX05VTV9PRikgfHwgKHhpX2xvZ19sZXZlbCA9PSBERVZfTE9HX0xFVkVMX05PX0xPRykpCisgICAgeworICAgICAgICBERVZfTE9HX0VSUk9SX1BSSU5URigieGlfbG9nX2xldmVsICgldSkgaXMgaW52YWxpZFxuIiwgeGlfbG9nX2xldmVsKTsKKyAgICAgICAgREVWX0xPR19WUFJJTlRGKGZtdCwgYXJncyk7IC8qIFRoaXMgd2lsbCBhbGxvdyB1cyB0byBkZWJ1ZyB3aGF0IGxpbmUgY2F1c2VkIHRoZSBidWcuICovCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGlkLT5sb2dfdHlwZSA9PSBERVZfTE9HX0lEX1RZUEVfTk9ORSkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisjaWZkZWYgQkNNX1NVQlNZU1RFTV9IT1NUCisgICAgLyogQWx3YXlzIHVzZSBDQUxMRVJfRk1UIG1vZGUgb24gdGhlIGhvc3QgdG8gYXZvaWQgcG9ydGFiaWxpdHkgaXNzdWVzIHdpdGgKKyAgICAgKiB0cmFuc2ZlcnJpbmcgdmFfbGlzdCBhcyBhbiBhcnJheSAqLworICAgIHhpX2ZsYWdzIHw9IEJDTV9MT0dfRkxBR19DQUxMRVJfRk1UOworI2VuZGlmCisKKyAgICAvKiBVcGRhdGUgbG9nIGlkIGNvdW50ZXJzICAqLworICAgIGlkLT5jb3VudGVyc1t4aV9sb2dfbGV2ZWxdKys7CisKKyAgICBpZiAoYmNtX2Rldl9sb2dfc2hvdWxkX2Ryb3AoaWQsIHhpX2xvZ19sZXZlbCwgcmF0ZV91cywgcmF0ZV9saW1pdF9pZCkpCisgICAgICAgIHJldHVybjsKKworICAgIG1zZyA9IGJjbW9zX21zZ19wb29sX2FsbG9jKCZkZXZfbG9nLnBvb2wpOworICAgIGlmICghbXNnKQorICAgIHsKKyAgICAgICAgYmNtX2Rldl9sb2dfZHJvcF9yZXBvcnQoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBsb2dfcXVldWVfbXNnID0gbXNnLT5kYXRhOworICAgIC8qIENyZWF0ZSBsb2cgbWVzc2FnZSAqLworICAgIGxvZ19xdWV1ZV9tc2ctPmxvZ19pZCA9IGlkOworICAgIGxvZ19xdWV1ZV9tc2ctPnRpbWVfc3RhbXAgPSBkZXZfbG9nLmRldl9sb2dfcGFybS5nZXRfdGltZV9jYigpOworICAgIGxvZ19xdWV1ZV9tc2ctPm1zZ19sZXZlbCA9IHhpX2xvZ19sZXZlbDsKKyAgICBsb2dfcXVldWVfbXNnLT5mbGFncyA9IHhpX2ZsYWdzOworI2lmbmRlZiBCQ01fU1VCU1lTVEVNX0hPU1QKKyAgICAvKiBJdCBpcyBub3QgcmVhbGx5IG5lY2Vzc2FyeSB0byBjb21waWxlIG91dCBub24gQ0FMTEVSX0ZNVCBjYXNlIG9uIHRoZSBob3N0LgorICAgICAqIEhvd2V2ZXIsIGtlZXBpbmcgdW51c2VkIGNvZGUgd2lsbCBtYWtlIENvdmVyaXR5IHVuaGFwcHkgKi8KKyAgICBpZiAodW5saWtlbHkoeGlfZmxhZ3MgJiBCQ01fTE9HX0ZMQUdfQ0FMTEVSX0ZNVCkpCisgICAgeworI2VuZGlmIC8qICNpZm5kZWYgQkNNX1NVQlNZU1RFTV9IT1NUICovCisgICAgICAgIHZzbnByaW50Zihsb2dfcXVldWVfbXNnLT51LnN0ciwgTUFYX0RFVl9MT0dfU1RSSU5HX1NJWkUsICh4aV9mbGFncyAmIEJDTV9MT0dfRkxBR19GSUxFTkFNRV9JTl9GTVQpID8gZGV2X2xvZ19iYXNlbmFtZShmbXQpIDogZm10LCBhcmdzKTsKKyNpZm5kZWYgQkNNX1NVQlNZU1RFTV9IT1NUCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHVpbnQzMl90IGk7CisgICAgICAgIHVpbnQzMl90IG9mZnNldDsKKyAgICAgICAgbG9nX3F1ZXVlX21zZy0+dS5mbXRfYXJncy5mbXQgPSBmbXQ7CisKKyAgICAgICAgb2Zmc2V0ID0gKChsb25nKWxvZ19xdWV1ZV9tc2ctPnUuZm10X2FyZ3MuYXJncyAlIDggPT0gMCkgPyAwIDogMTsgLyogc3RhcnQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5ICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBERVZfTE9HX01BWF9BUkdTOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZ19xdWV1ZV9tc2ctPnUuZm10X2FyZ3MuYXJnc1tpICsgb2Zmc2V0XSA9IHZhX2FyZyhhcmdzLCB2b2lkICopOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qICNpZm5kZWYgQkNNX1NVQlNZU1RFTV9IT1NUICovCisKKyAgICBpZiAoYmNtb3Nfc2VtX3Bvc3RfaXNfYWxsb3dlZCgpKQorICAgIHsKKyAgICAgICAgZXJyb3IgPSBiY21vc19tc2dfc2VuZCgmZGV2X2xvZy5zYXZlX3F1ZXVlLCBtc2csIEJDTU9TX01TR19TRU5EX0FVVE9fRlJFRSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbW9zX3RpbWVyX3Bhcm0gdGltZXJfcGFyYW1zID0KKyAgICAgICAgeworICAgICAgICAgICAgLm5hbWUgPSAiZGV2X2xvZ190aW1lciIsCisgICAgICAgICAgICAuaGFuZGxlciA9IGJjbV9kZXZfbG9nX21zZ19zZW5kX3RpbWVyX2NiLAorICAgICAgICB9OworCisgICAgICAgIGlmICghKGRldl9sb2dfdGltZXIuZmxhZ3MgJiBCQ01PU19USU1FUl9GTEFHX1ZBTElEKSkKKyAgICAgICAgICAgIGJjbW9zX3RpbWVyX2NyZWF0ZSgmZGV2X2xvZ190aW1lciwgJnRpbWVyX3BhcmFtcyk7CisgICAgICAgIC8qIExpbWl0YXRpb246IFdlIGRvbid0IHNlbmQgbW9yZSB0aGFuIDEgbG9nZ2VyIG1lc3NhZ2UgZXZlbiBpZiBfYmNtX2Rldl9sb2dfdmxvZygpIHdhcyBjYWxsZWQgbXVsdGlwbGUgdGltZXJzIGluIElSUXMgZGlzYWJsZWQgbW9kZSBiZWNhdXNlIHdlIGhhdmUgYSBzaW5nbGUgdGltZXIuICovCisgICAgICAgIGlmICghYmNtb3NfdGltZXJfaXNfcnVubmluZygmZGV2X2xvZ190aW1lcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RpbWVyX2hhbmRsZXJfc2V0KCZkZXZfbG9nX3RpbWVyLCBiY21fZGV2X2xvZ19tc2dfc2VuZF90aW1lcl9jYiwgKGxvbmcpbXNnKTsKKyAgICAgICAgICAgIGJjbW9zX3RpbWVyX3N0YXJ0KCZkZXZfbG9nX3RpbWVyLCAwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChlcnJvciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgaWQtPmxvc3RfbXNnX2NudCsrOworICAgIH0KK30KKwordm9pZCBiY21fZGV2X2xvZ192bG9nKGRldl9sb2dfaWQgeGlfaWQsCisgICAgYmNtX2Rldl9sb2dfbGV2ZWwgeGlfbG9nX2xldmVsLAorICAgIHVpbnQzMl90IHhpX2ZsYWdzLAorICAgIGNvbnN0IGNoYXIgKmZtdCwKKyAgICB2YV9saXN0IGFyZ3MpCit7CisgICAgX2JjbV9kZXZfbG9nX3Zsb2coeGlfaWQsIHhpX2xvZ19sZXZlbCwgeGlfZmxhZ3MsIDAsIERFVl9MT0dfUkFURV9MSU1JVF9JRF9OT05FLCBmbXQsIGFyZ3MpOworfQorCisvKiBJTVBPUlRBTlQhISEKKyAqIFRoZSBmdW5jdGlvbiBiY21fZGV2X2xvZ19sb2coKSBtdXN0IGhhdmUgZXZlbiBudW1iZXIgb2YgYXJndW1lbnRzIGJlZm9yZSB0aGUgJy4uLicgKHNlZSBjb21tZW50cyBvbiBoZWFkZXIgZmlsZSkuCisgKi8KK3ZvaWQgYmNtX2Rldl9sb2dfbG9nKGRldl9sb2dfaWQgeGlfaWQsCisgICAgYmNtX2Rldl9sb2dfbGV2ZWwgeGlfbG9nX2xldmVsLAorICAgIHVpbnQzMl90IHhpX2ZsYWdzLAorICAgIGNvbnN0IGNoYXIgKmZtdCwKKyAgICAuLi4pCit7CisgICAgdmFfbGlzdCBhcmdzOworCisgICAgdmFfc3RhcnQoYXJncywgZm10KTsKKyAgICBiY21fZGV2X2xvZ192bG9nKHhpX2lkLCB4aV9sb2dfbGV2ZWwsIHhpX2ZsYWdzLCBmbXQsIGFyZ3MpOworICAgIHZhX2VuZChhcmdzKTsKK30KKwordm9pZCBiY21fZGV2X2xvZ19sb2dfcmF0ZWxpbWl0KGRldl9sb2dfaWQgeGlfaWQsCisgICAgYmNtX2Rldl9sb2dfbGV2ZWwgeGlfbG9nX2xldmVsLAorICAgIHVpbnQzMl90IHhpX2ZsYWdzLAorICAgIHVpbnQzMl90IHJhdGVfdXMsCisgICAgZGV2X2xvZ19yYXRlX2xpbWl0X2lkIHJhdGVfbGltaXRfaWQsCisgICAgY29uc3QgY2hhciAqZm10LAorICAgIC4uLikKK3sKKyAgICB2YV9saXN0IGFyZ3M7CisKKyAgICB2YV9zdGFydChhcmdzLCBmbXQpOworICAgIF9iY21fZGV2X2xvZ192bG9nKHhpX2lkLCB4aV9sb2dfbGV2ZWwsIHhpX2ZsYWdzLCByYXRlX3VzLCByYXRlX2xpbWl0X2lkLCBmbXQsIGFyZ3MpOworICAgIHZhX2VuZChhcmdzKTsKK30KKworI2lmZGVmIEJDTU9TX1RSQUNFX0lOX0RFVl9MT0cKKworc3RhdGljIGRldl9sb2dfaWQgYmNtb3NfdHJhY2VfZGV2X2xvZ19pZFtdID0KK3sKKyAgICBbQkNNT1NfVFJBQ0VfTEVWRUxfTk9ORV0gPSBERVZfTE9HX0lOVkFMSURfSUQsCisgICAgW0JDTU9TX1RSQUNFX0xFVkVMX0VSUk9SXSA9IERFVl9MT0dfSU5WQUxJRF9JRCwKKyAgICBbQkNNT1NfVFJBQ0VfTEVWRUxfSU5GT10gPSBERVZfTE9HX0lOVkFMSURfSUQsCisgICAgW0JDTU9TX1RSQUNFX0xFVkVMX1ZFUkJPU0VdID0gREVWX0xPR19JTlZBTElEX0lELAorICAgIFtCQ01PU19UUkFDRV9MRVZFTF9ERUJVR10gPSBERVZfTE9HX0lOVkFMSURfSUQKK307CisKK3N0YXRpYyBiY21fZGV2X2xvZ19sZXZlbCBiY21vc190cmFjZV9kZXZfbG9nX2xldmVsW10gPQoreworICAgIFtCQ01PU19UUkFDRV9MRVZFTF9FUlJPUl0gPSBERVZfTE9HX0xFVkVMX0VSUk9SLAorICAgIFtCQ01PU19UUkFDRV9MRVZFTF9JTkZPXSA9IERFVl9MT0dfTEVWRUxfSU5GTywKKyAgICBbQkNNT1NfVFJBQ0VfTEVWRUxfVkVSQk9TRV0gPSBERVZfTE9HX0xFVkVMX0lORk8sCisgICAgW0JDTU9TX1RSQUNFX0xFVkVMX0RFQlVHXSA9IERFVl9MT0dfTEVWRUxfREVCVUcKK307CisKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOYW1lOiBiY21fZGV2X2xvZ19vc190cmFjZV9pbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBYnN0cmFjdDogRGlyZWN0IGJjbW9zX3RyYWNlKCkgb3V0cHV0IHRvIGxvZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBcmd1bWVudHM6IE5PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm4gVmFsdWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIGJjbW9zX2Vycm5vIC0gU3VjY2VzcyBjb2RlIChCQ01fRVJSX09LKSBvciBFcnJvciBjb2RlIChzZWUgYmNtb3NfZXJybm8uaCkgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBiY21fZGV2X2xvZ19vc190cmFjZV9pbml0KHZvaWQpCit7CisjaWZkZWYgQkNNT1NfVFJBQ0VfSU5fREVWX0xPRworICAgIGJjbW9zX3RyYWNlX2Rldl9sb2dfaWRbQkNNT1NfVFJBQ0VfTEVWRUxfRVJST1JdID0gYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIoInRyYWNlX2Vycm9yIiwKKyAgICAgICAgREVWX0xPR19MRVZFTF9FUlJPUiwgREVWX0xPR19JRF9UWVBFX0JPVEgpOworICAgIGJjbW9zX3RyYWNlX2Rldl9sb2dfaWRbQkNNT1NfVFJBQ0VfTEVWRUxfSU5GT10gPSBiY21fZGV2X2xvZ19pZF9yZWdpc3RlcigidHJhY2VfaW5mbyIsCisgICAgICAgIERFVl9MT0dfTEVWRUxfSU5GTywgREVWX0xPR19JRF9UWVBFX0JPVEgpOworICAgIGJjbW9zX3RyYWNlX2Rldl9sb2dfaWRbQkNNT1NfVFJBQ0VfTEVWRUxfVkVSQk9TRV0gPSBiY21vc190cmFjZV9kZXZfbG9nX2lkW0JDTU9TX1RSQUNFX0xFVkVMX0lORk9dOworICAgIGJjbW9zX3RyYWNlX2Rldl9sb2dfaWRbQkNNT1NfVFJBQ0VfTEVWRUxfREVCVUddID0gYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIoInRyYWNlX2RlYnVnIiwKKyAgICAgICAgREVWX0xPR19MRVZFTF9ERUJVRywgREVWX0xPR19JRF9UWVBFX0JPVEgpOworICAgIGlmIChiY21vc190cmFjZV9kZXZfbG9nX2lkW0JDTU9TX1RSQUNFX0xFVkVMX0VSUk9SXSA9PSBERVZfTE9HX0lOVkFMSURfSUQgfHwKKyAgICAgICAgYmNtb3NfdHJhY2VfZGV2X2xvZ19pZFtCQ01PU19UUkFDRV9MRVZFTF9JTkZPXSAgPT0gREVWX0xPR19JTlZBTElEX0lEIHx8CisgICAgICAgIGJjbW9zX3RyYWNlX2Rldl9sb2dfaWRbQkNNT1NfVFJBQ0VfTEVWRUxfREVCVUddID09IERFVl9MT0dfSU5WQUxJRF9JRCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PUkVTOworICAgIH0KKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyNlbHNlIC8qICNpZmRlZiBCQ01PU19UUkFDRV9JTl9ERVZfTE9HICovCisgICAgcmV0dXJuIEJDTV9FUlJfTk9UX1NVUFBPUlRFRDsKKyNlbmRpZgorfQorCisjaWZkZWYgQkNNT1NfVFJBQ0VfSU5fREVWX0xPRworCisvKiBEaXJlY3QgT1MgdHJhY2UgdG8gZGV2X2xvZyAqLwordm9pZCBiY21vc190cmFjZShiY21vc190cmFjZV9sZXZlbCBsZXZlbCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgICAgdmFfbGlzdCBhcmdzOworCisgICAgdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKyAgICBpZiAoYmNtb3NfdHJhY2VfZGV2X2xvZ19pZFtsZXZlbF0gIT0gREVWX0xPR19JTlZBTElEX0lEICYmIGRldl9sb2cuc3RhdGUgPT0gQkNNX0RFVl9MT0dfU1RBVEVfRU5BQkxFRCkKKyAgICB7CisgICAgICAgIGlmIChsZXZlbCA9PSBCQ01PU19UUkFDRV9MRVZFTF9FUlJPUikKKyAgICAgICAgICAgIGJjbV9kZXZfbG9nX3Zsb2coYmNtb3NfdHJhY2VfZGV2X2xvZ19pZFtsZXZlbF0sIGJjbW9zX3RyYWNlX2Rldl9sb2dfbGV2ZWxbbGV2ZWxdLCBCQ01fTE9HX0ZMQUdfQ0FMTEVSX0ZNVCwgZm9ybWF0LCBhcmdzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYmNtX2Rldl9sb2dfdmxvZyhiY21vc190cmFjZV9kZXZfbG9nX2lkW2xldmVsXSwgYmNtb3NfdHJhY2VfZGV2X2xvZ19sZXZlbFtsZXZlbF0sIDAsIGZvcm1hdCwgYXJncyk7CisgICAgfQorCisgICAgdmFfZW5kKGFyZ3MpOworfQorCisjZW5kaWYKKworI2VuZGlmIC8qIEVOQUJMRV9MT0cgKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nL2JjbV9kZXZfbG9nLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZy9iY21fZGV2X2xvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5ZTE1NmUKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZy9iY21fZGV2X2xvZy5oCkBAIC0wLDAgKzEsMjI0IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaWZuZGVmIF9fQkNNX0RFVl9MT0dfSF8KKyNkZWZpbmUgX19CQ01fREVWX0xPR19IXworCisjaWZkZWYgRU5BQkxFX0xPRworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSAiYmNtX2Rldl9sb2dfdGFzay5oIgorI2lmZGVmIEVOQUJMRV9DTEkKKyNpbmNsdWRlICJiY21fZGV2X2xvZ19jbGkuaCIKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBMb2cgbWFjcm9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTUFDUk9fQVJHX04oXzEsXzIsXzMsXzQsXzUsXzYsXzcsXzgsXzksXzEwLF8xMSxfMTIsXzEzLF8xNCxfMTUsXzE2LF8xNyxfMTgsXzE5LF8yMCxfMjEsXzIyLF8yMyxfMjQsXzI1LF8yNixfMjcsXzI4LF8yOSxfMzAsXzMxLF8zMixOLC4uLikgTgorI2RlZmluZSBNQUNST1NfQVJHU19TRVFVRU5DRSAzMiwgMzEsIDMwLCAyOSwgMjgsIDI3LCAyNiwgMjUsIDI0LCAyMywgMjIsIDIxLCAyMCwgMTksIDE4LCAxNywgMTYsIDE1LCAxNCwgMTMsIDEyLCAxMSwgMTAsIDksIDgsIDcsIDYsIDUsIDQsIDMsIDIsIDEsIDAKKyNkZWZpbmUgTUFDUk9fTlVNX0FSR1NfSEVMUEVSKC4uLikgICAgTUFDUk9fQVJHX04oX19WQV9BUkdTX18pCisjZGVmaW5lIE1BQ1JPX05VTV9BUkdTKC4uLikgICAgIE1BQ1JPX05VTV9BUkdTX0hFTFBFUihfX1ZBX0FSR1NfXywgTUFDUk9TX0FSR1NfU0VRVUVOQ0UpCisKKy8qIElNUE9SVEFOVCEgRE8gTk9UIFVTRSBUSEVTRSBNQUNST1MsIFVTRSBCQ01fTE9HIE9OTFkgISAqLworLyogVGhlc2UgbWFjcm9zIGZvcmNlIG51bWJlciBvZiBhcmd1bWVudHMgaW4gY29tcGlsZSB0aW1lLiBBIHNpbmdsZSBtYWNybyBmb3IgZWFjaCBudW1iZXIgb2YgYXJndW1lbnRzIChpbmNsdWRpbmcgdGhlIGZvcm1hdCkgKi8KKyNpZmRlZiBfX0JBU0VOQU1FX18KKyNkZWZpbmUgX0JDTV9MT0dfQVJHUzEobGV2ZWwsIGlkLCBmbGFncywgLi4uKSBcCisgICAgYmNtX2Rldl9sb2dfbG9nKGlkLCBsZXZlbCwgZmxhZ3MsIFNUUklOR0lGWV9FWFBBTkQoX19CQVNFTkFNRV9fKSAiICIgU1RSSU5HSUZZX0VYUEFORChfX0xJTkVfXykgInwgIiBfX1ZBX0FSR1NfXykKKyNlbHNlCisjZGVmaW5lIF9CQ01fTE9HX0FSR1MxKGxldmVsLCBpZCwgZmxhZ3MsIC4uLikgXAorICAgIGJjbV9kZXZfbG9nX2xvZyhpZCwgbGV2ZWwsIGZsYWdzIHwgQkNNX0xPR19GTEFHX0ZJTEVOQU1FX0lOX0ZNVCwgX19GSUxFX18gIiAiIFNUUklOR0lGWV9FWFBBTkQoX19MSU5FX18pICJ8ICIgX19WQV9BUkdTX18pCisjZW5kaWYKKyNkZWZpbmUgX0JDTV9MT0dfQVJHUzIoLi4uKSBfQkNNX0xPR19BUkdTMShfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0JDTV9MT0dfQVJHUzMoLi4uKSBfQkNNX0xPR19BUkdTMShfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0JDTV9MT0dfQVJHUzQoLi4uKSBfQkNNX0xPR19BUkdTMShfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0JDTV9MT0dfQVJHUzUoLi4uKSBfQkNNX0xPR19BUkdTMShfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0JDTV9MT0dfQVJHUzYoLi4uKSBfQkNNX0xPR19BUkdTMShfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0JDTV9MT0dfQVJHUzcoLi4uKSBfQkNNX0xPR19BUkdTMShfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0JDTV9MT0dfQVJHUzgoLi4uKSBfQkNNX0xPR19BUkdTMShfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0JDTV9MT0dfQVJHUzkoLi4uKSBfQkNNX0xPR19BUkdTMShfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0JDTV9MT0dfQVJHUzEwKC4uLikgX0JDTV9MT0dfQVJHUzEoX19WQV9BUkdTX18pCisjZGVmaW5lIF9CQ01fTE9HX0FSR1MxMSguLi4pIF9CQ01fTE9HX0FSR1MxKF9fVkFfQVJHU19fKQorI2RlZmluZSBfQkNNX0xPR19BUkdTMTIoLi4uKSBfQkNNX0xPR19BUkdTMShfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0JDTV9MT0dfQVJHUzEzKC4uLikgX0JDTV9MT0dfQVJHUzEoX19WQV9BUkdTX18pCisjZGVmaW5lIF9CQ01fTE9HX0FSR1MxNCguLi4pIF9CQ01fTE9HX0FSR1MxKF9fVkFfQVJHU19fKQorI2RlZmluZSBfQkNNX0xPR19BUkdTMTUoLi4uKSBfQkNNX0xPR19BUkdTMShfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0JDTV9MT0dfQVJHUzE2KC4uLikgX0JDTV9MT0dfQVJHUzEoX19WQV9BUkdTX18pCisjZGVmaW5lIF9CQ01fTE9HX0FSR1MxNyguLi4pIF9CQ01fTE9HX0FSR1MxKF9fVkFfQVJHU19fKQorI2RlZmluZSBfQkNNX0xPR19BUkdTMTgoLi4uKSBfQkNNX0xPR19BUkdTMShfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0JDTV9MT0dfQVJHUzE5KC4uLikgX0JDTV9MT0dfQVJHUzEoX19WQV9BUkdTX18pCisjZGVmaW5lIF9CQ01fTE9HX0FSR1MyMCguLi4pIF9CQ01fTE9HX0FSR1MxKF9fVkFfQVJHU19fKQorI2RlZmluZSBfQkNNX0xPR19BUkdTMjEoLi4uKSBfQkNNX0xPR19BUkdTMShfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0JDTV9MT0dfQVJHUzIyKC4uLikgX0JDTV9MT0dfQVJHUzEoX19WQV9BUkdTX18pCisjZGVmaW5lIF9CQ01fTE9HX0FSR1MyMyguLi4pIF9CQ01fTE9HX0FSR1MxKF9fVkFfQVJHU19fKQorI2RlZmluZSBfQkNNX0xPR19BUkdTMjQoLi4uKSBfQkNNX0xPR19BUkdTMShfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0JDTV9MT0dfQVJHUzI1KC4uLikgX0JDTV9MT0dfQVJHUzEoX19WQV9BUkdTX18pCisjZGVmaW5lIF9CQ01fTE9HX0FSR1MyNiguLi4pIF9CQ01fTE9HX0FSR1MxKF9fVkFfQVJHU19fKQorI2RlZmluZSBfQkNNX0xPR19BUkdTMjcoLi4uKSBfQkNNX0xPR19BUkdTMShfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0JDTV9MT0dfQVJHUzI4KC4uLikgX0JDTV9MT0dfQVJHUzEoX19WQV9BUkdTX18pCisjZGVmaW5lIF9CQ01fTE9HX0FSR1MyOSguLi4pIF9CQ01fTE9HX0FSR1MxKF9fVkFfQVJHU19fKQorI2RlZmluZSBfQkNNX0xPR19BUkdTMzAoLi4uKSBfQkNNX0xPR19BUkdTMShfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0JDTV9MT0dfQVJHUzMxKC4uLikgX0JDTV9MT0dfQVJHUzEoX19WQV9BUkdTX18pCisjZGVmaW5lIF9CQ01fTE9HX0FSR1MzMiguLi4pIF9CQ01fTE9HX0FSR1MxKF9fVkFfQVJHU19fKQorI2RlZmluZSBfQkNNX0xPR19BUkdTMzMoLi4uKSBfQkNNX0xPR19BUkdTMShfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0JDTV9MT0dfQVJHUzM0KC4uLikgX0JDTV9MT0dfQVJHUzEoX19WQV9BUkdTX18pCisjZGVmaW5lIF9CQ01fTE9HX0FSR1MzNSguLi4pIF9CQ01fTE9HX0FSR1MxKF9fVkFfQVJHU19fKQorI2RlZmluZSBfQkNNX0xPR19BUkdTMzYoLi4uKSBfQkNNX0xPR19BUkdTMShfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0JDTV9MT0dfQVJHUyhuKSBfQkNNX0xPR19BUkdTIyNuCisjZGVmaW5lIF9CQ01fTE9HX0VYUEFORChuLC4uLikgX0JDTV9MT0dfQVJHUyhuKSAoX19WQV9BUkdTX18pCisKKy8qCisgKiBJTVBPUlRBTlQhIHlvdSBzaG91bGQgdXNlIG9ubHkgdGhpcyBtYWNybyBmb3IgbG9nZ2luZworICoKKyAqIDEuIFN1cHBvcnQgcHJpbnRzIHVwIHRvIERFVl9MT0dfTUFYX0FSR1MgcGFyYW1ldGVycyBlYWNoIHdpdGggbWF4aW11bSBzaXplIG9mIDMyYml0cworICogMi4gU3VwcG9ydCBhbHNvIHByaW50cyBvZiBhcmd1bWVudHMgd2l0aCBzaXplIDY0Yml0cyBidXQgZWFjaCBvbmUgY291bnRlZCBhcyB0d28gYXJndW1lbnRzIG9mIDMyYml0cywKKyAqICAgIHNvIHlvdSBjYW4gb25seSBwcmludCB1cCB0byAoREVWX0xPR19NQVhfQVJHUy8yKSBhcmd1bWVudHMgb2YgNjRiaXRzLgorICogICAgTWl4IG9mIDY0IGFuZCAzMiBhcmUgYWxsb3dlZCBhcyBsb25nIHlvdSBkb24ndCBleGNlZWQgREVWX0xPR19NQVhfQVJHUy4KKyAqIDMuIEFueSBwb3NzaWJsZSBjb21iaW5hdGlvbiBvZiBtaXggMzIgYW5kIDY0IGFyZ3VtZW50cyBhcmUgYWxsb3dlZC4KKyAqLworI2RlZmluZSBCQ01fTE9HKGxldmVsLCBpZCwgLi4uKSBfQkNNX0xPR19FWFBBTkQoTUFDUk9fTlVNX0FSR1MoX19WQV9BUkdTX18pLCBERVZfTE9HX0xFVkVMXyMjbGV2ZWwsIGlkLCAwLCBfX1ZBX0FSR1NfXykKKy8qIFNhbWUgYXMgQkNNX0xPRygpLCBidXQgb3ZlcnJpZGVzIEJDTV9MT0coKSBkZWZhdWx0IGJlaGF2aW9yIGJ5IGxldHRpbmcgdGhlIGZvcm1hdCBiZSBkb25lIGluIHRoZSBjb250ZXh0IG9mIHRoZSBjYWxsZXIgdGFzay4gVGhpcyBhbGxvd3MgdXNpbmcgc3RhY2svaGVhcCBzdHJpbmdzCisgKiBmb3IgZm10IGFuZCBhcmdzLiBTZWUgY29tbWVudCBmb3IgQkNNX0xPR19GTEFHX0NBTExFUl9GTVQuICovCisjZGVmaW5lIEJDTV9MT0dfQ0FMTEVSX0ZNVChsZXZlbCwgaWQsIC4uLikgX0JDTV9MT0dfRVhQQU5EKE1BQ1JPX05VTV9BUkdTKF9fVkFfQVJHU19fKSwgREVWX0xPR19MRVZFTF8jI2xldmVsLCBpZCwgQkNNX0xPR19GTEFHX0NBTExFUl9GTVQsIF9fVkFfQVJHU19fKQorCisvKiBTYW1lIGFzIEJDTV9MT0coKSwgYnV0IHRoZSBsZXZlbCBpcyBub3QgZ2l2ZW4gYXMgYSB0b2tlbiBmb3IgY29uY2F0ZW5hdGlvbiwgYnV0IGFzIGEgcmVndWxhciBlbnVtLiAqLworI2RlZmluZSBCQ01fTE9HX0xFVkVMKGxldmVsLCBpZCwgLi4uKSBfQkNNX0xPR19FWFBBTkQoTUFDUk9fTlVNX0FSR1MoX19WQV9BUkdTX18pLCBsZXZlbCwgaWQsIDAsIF9fVkFfQVJHU19fKQorCisjZGVmaW5lIEJDTV9MT0dfRkxBR19OT05FIDAKKyNkZWZpbmUgQkNNX0xPR19GTEFHX05PX0hFQURFUiAoMSA8PCAwKSAvKiBBdm9pZCBpbnNlcnRpbmcgaGVhZGVyIHRvIGVhY2ggbWVzc2FnZS4gKi8KKyNkZWZpbmUgQkNNX0xPR19GTEFHX0NBTExFUl9GTVQgKDEgPDwgMSkgLyogVGhlIGxvZyBtZXNzYWdlIHdpbGwgYmUgZm9ybWF0dGVkIGluIHRoZSBjb250ZXh0IG9mIHRoZSBjYWxsZXIgdGFzaywgbm90IHRoZSBsb2dnZXIgdGFzayAob3ZlcnJpZGUgZGVmYXVsdCBiZWhhdmlvcikuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFRoaXMgaGFzIGEgcGVuYWx0eSAtIGJjbV9kZXZfbG9nX2xvZygpIGJlY29tZXMgc2xvd2VyLiAqLworI2RlZmluZSBCQ01fTE9HX0ZMQUdfRklMRU5BTUVfSU5fRk1UICgxIDw8IDIpIC8qIEluZGljYXRlcyB0aGF0IF9fRklMRV9fIGlzIGluc2VydGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1lc3NhZ2UgZm9ybWF0LiAqLworI2RlZmluZSBCQ01fTE9HX0ZMQUdfRE9OVF9TS0lQX1BSSU5UICgxIDw8IDMpIC8qIFRoZSBtZXNzYWdlIHNob3VsZCBhbHdheXMgYmUgcHJpbnRlZCBldmVuIGlmIHRoZSBtc2cgcG9vbCBpcyBuZWFybHkgZnVsbC4gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQ2FsbGJhY2tzIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGdW5jdGlvbnMgcHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2NvbnN0IGNoYXIgKmRldl9sb2dfYmFzZW5hbWUoY29uc3QgY2hhciAqc3RyKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5hbWU6IGJjbV9kZXZfbG9nX2xvZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQWJzdHJhY3Q6IExvZyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgSXQgaXMgYmV0dGVyIHVzaW5nIHRoZSBtYWNyb3MgYW5kIG5vdCB0aGUgZnVuY3Rpb24gZGlyZWN0bHkuICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQXJndW1lbnRzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIC0geGlfaWQgICAgICAgICAgICAtIFRoZSBMb2cgSUQgdGhpcyBtZXNzYWdlIGlzIGNvbm5lY3RlZCB0by4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgKFRoZSBJRCB3ZSBnb3QgZm9ybSBiY21fZGV2X2xvZ19pZF9yZWdpc3RlcikgICAgICAgICAgICAgICAgICAqLworLyogICAtIHhpX2xvZ19sZXZlbCAgICAgLSBUaGUgTG9nIGxldmVsIG9mIHRoaXMgbWVzc2FnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIC0geGlfZmxhZ3MgICAgICAgICAtIENhbiBiZSBvbmUgb2YgQkNNX0xPR19GTEFHX1hYWCBhYm92ZS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgLSBmbXQgICAgICAgICAgICAgIC0gVGhlIHByaW50IGZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIE5vdGU6ICAgICAgICAgICAgICBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byBmb3JtYXQgdGhlIHN0cmluZyBpbiB0aGUgbG9nZ2VyICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgIHRhc2sgY29udGV4dCwgbm90IHRoZSBjYWxsZXIgdGFzayBjb250ZXh0LCB0byByZWR1Y2UgdGhlICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgcGVuYWx0eSBvZiBjYWxsaW5nIGJjbV9kZXZfbG9nX2xvZygpLiBUaGlzIG1lYW5zICdmbXQnIGNhbiAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICBwb2ludCBvbmx5IHRvIHN0cmluZ3MgaW4gZGF0YSBzZWdtZW50LCBidXQgbm90IHRvIGhlYWQvc3RhY2suICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgIFlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBiZWhhdmlvciB3aXRoIEJDTV9MT0dfRkxBR19DQUxMRVJfRk1ULiAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAtIHBhcmFtMSAgICAgICAgICAgLSBGb3JtYXQgcGFyYW1ldGVyIE5vLiAxLiBMaWtlICdmbXQnLCBjYW4gcmVzaWRlIG9ubHkgaW4gZGF0YSAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQsIHVubGVzcyBjaG9vc2luZyBCQ01fTE9HX0ZMQUdfQ0FMTEVSX0ZNVCAgICAgICAgICAgICAgKi8KKy8qICAgLSAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAtIHBhcmFtTiAgICAgICAgICAgLSBGb3JtYXQgcGFyYW1ldGVyIE5vLiBOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIElNUE9SVEFOVCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogMS4gVGhlIGZ1bmN0aW9uIGJjbV9kZXZfbG9nX2xvZygpIG11c3QgaGF2ZSBldmVuIG51bWJlciBvZiBhcmd1bWVudHMgYmVmb3JlIHRoZSAnLi4uJyovCisvKiAgICBUaGlzIGNvbWVzIGZyb20gdGhlIDY0Yml0cyBsaW1pdGF0aW9uIHRoYXQgbXVzdCBiZSBhbGlnbiB0byA4Ynl0ZXMgaW4gc29tZSAgICAgICAgKi8KKy8qICAgIHBsYXRmb3JtcyB3aG8gZG9lc24ndCBzdXBwb3J0IHVuYWxpZ25lZCBhY2Nlc3MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgb24geHBvbnN3ICh4ODYpIGl0IGRvZXNuJ3QgbWF0dGVyIGJ1dCBvbiBkZXZpY2UgKGFybSkgeW91IG11c3QgaGF2ZSB0aGF0LiAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21fZGV2X2xvZ19sb2coZGV2X2xvZ19pZCB4aV9pZCwKKyAgICBiY21fZGV2X2xvZ19sZXZlbCB4aV9sb2dfbGV2ZWwsCisgICAgdWludDMyX3QgeGlfZmxhZ3MsCisgICAgY29uc3QgY2hhciAqZm10LAorICAgIC4uLikgX19hdHRyaWJ1dGVfXygoZm9ybWF0KF9fcHJpbnRmX18sIDQsIDUpKSk7IC8qIGNvbXBpbGVyIGF0dHJpYnV0ZSB0byBjaGVjayBhcyBwcmludGYgc3R5bGUgZm9yIGFyZ3VtZW50cyA0IChmbXQpIGFuZCA1IChhbGwgb3RoZXIpICovCisKK3ZvaWQgYmNtX2Rldl9sb2dfdmxvZyhkZXZfbG9nX2lkIHhpX2lkLAorICAgIGJjbV9kZXZfbG9nX2xldmVsIHhpX2xvZ19sZXZlbCwKKyAgICB1aW50MzJfdCB4aV9mbGFncywKKyAgICBjb25zdCBjaGFyICpmbXQsCisgICAgdmFfbGlzdCBhcmdzKTsKKwordHlwZWRlZiBlbnVtCit7CisgICAgREVWX0xPR19SQVRFX0xJTUlUX0lEX05PTkUsCisgICAgREVWX0xPR19SQVRFX0xJTUlUX0lEX0JXU19EQkFfQkRfQUREX0FMTE9DX0ZBSUxFRCwKKyAgICBERVZfTE9HX1JBVEVfTElNSVRfSURfQldTX0NCUl9SVF9BRERfQUxMT0NfRkFJTEVELAorICAgIERFVl9MT0dfUkFURV9MSU1JVF9JRF9CV1NfQ0JSX1JUX0FERF9BQ0NFU1NfRkFJTEVELAorICAgIERFVl9MT0dfUkFURV9MSU1JVF9JRF9CV1NfUVdfQ0JSX1JUX0FERF9BQ0NFU1NfRkFJTEVELAorICAgIERFVl9MT0dfUkFURV9MSU1JVF9JRF9CV1NfQ0JSX05SVF9BRERfQUxMT0NfRkFJTEVELAorICAgIERFVl9MT0dfUkFURV9MSU1JVF9JRF9CV1NfQ0JSX0NPTVBFTlNBVElPTl9BRERfQUNDRVNTX0ZBSUxFRCwKKyAgICBERVZfTE9HX1JBVEVfTElNSVRfSURfQldTX0NCUl9OT19DT01QRU5TQVRJT05fQUREX0FDQ0VTU19GQUlMRUQsCisgICAgREVWX0xPR19SQVRFX0xJTUlUX0lEX0JXU19DQlJfQ09QWV9DT01QRU5TQVRJT05fQUREX0FDQ0VTU19GQUlMRUQsCisgICAgREVWX0xPR19SQVRFX0xJTUlUX0lEX0JXU19DQlJfUlRfU0FWRV9BQ0NFU1NfRk9SX0NPTVBFTlNBVElPTl9GQUlMRUQsCisgICAgREVWX0xPR19SQVRFX0xJTUlUX0lEX0JXU19DQlJfTlJUX1NBVkVfQUNDRVNTX0ZPUl9DT01QRU5TQVRJT05fRkFJTEVELAorICAgIERFVl9MT0dfUkFURV9MSU1JVF9JRF9CV1NfQ0JSX0ZMVVNIX0ZBSUxFRCwKKyAgICBERVZfTE9HX1JBVEVfTElNSVRfSURfX05VTV9PRiwKK30gZGV2X2xvZ19yYXRlX2xpbWl0X2lkOworCit2b2lkIGJjbV9kZXZfbG9nX2xvZ19yYXRlbGltaXQoZGV2X2xvZ19pZCB4aV9pZCwKKyAgICBiY21fZGV2X2xvZ19sZXZlbCB4aV9sb2dfbGV2ZWwsCisgICAgdWludDMyX3QgeGlfZmxhZ3MsCisgICAgdWludDMyX3QgcmF0ZV91cywKKyAgICBkZXZfbG9nX3JhdGVfbGltaXRfaWQgcmF0ZV9saW1pdF9pZCwKKyAgICBjb25zdCBjaGFyICpmbXQsCisgICAgLi4uKSBfX2F0dHJpYnV0ZV9fKChmb3JtYXQoX19wcmludGZfXywgNiwgNykpKTsgLyogY29tcGlsZXIgYXR0cmlidXRlIHRvIGNoZWNrIGFzIHByaW50ZiBzdHlsZSBmb3IgYXJndW1lbnRzIDYgKGZtdCkgYW5kIDcgKGFsbCBvdGhlcikgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTmFtZTogYmNtX2Rldl9sb2dfb3NfdHJhY2VfaW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQWJzdHJhY3Q6IERpcmVjdCBiY21vc190cmFjZSgpIG91dHB1dCB0byBsb2cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQXJndW1lbnRzOiBOT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuIFZhbHVlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBiY21vc19lcnJubyAtIFN1Y2Nlc3MgY29kZSAoQkNNX0VSUl9PSykgb3IgRXJyb3IgY29kZSAoc2VlIGJjbW9zX2Vycm5vLmgpICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfb3NfdHJhY2VfaW5pdCh2b2lkKTsKKworI2Vsc2UgLyogI2lmbmRlZiBFTkFCTEVfTE9HICovCisKKyNkZWZpbmUgQkNNX0xPRyhsZXZlbCwgaWQsIC4uLikKKyNkZWZpbmUgQkNNX0xPR19DQUxMRVJfRk1UKGxldmVsLCBpZCwgLi4uKQorCisjZW5kaWYgLyogRU5BQkxFX0xPRyAqLworCisjZW5kaWYgLyogX19CQ01fREVWX0xPR19IXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2cvYmNtX2Rldl9sb2dfY2xpLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZy9iY21fZGV2X2xvZ19jbGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGZmYjU5Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2cvYmNtX2Rldl9sb2dfY2xpLmMKQEAgLTAsMCArMSw2ODQgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21fZGV2X2xvZy5oPgorI2luY2x1ZGUgPGJjbV9kZXZfbG9nX3Rhc2tfaW50ZXJuYWwuaD4KKworLyogV2UgZG9uJ3Qgc3VwcG9ydCBkZXZfbG9nIENMSSBpbiBsaW51eCBrZXJuZWwgc3BhY2UgKi8KKyNpZm5kZWYgX19LRVJORUxfXworCisvKiBEZXYgbG9nIENMSSBzZXNzaW9uIHN1cHBvcnRzIHJlY2VpdmluZyBsb25nIGxpbmVzIC0gd2Ugc2hhbGwgc2ltcGx5IHNwbGl0IHRoZW0gaW50byBzaG9ydGVyIGxvZyBtZXNzYWdlcy4gKi8KKyNkZWZpbmUgREVWX0xPR19DTElfU0VTU0lPTl9NQVhfTVNHX1NJWkUgKE1BWF9ERVZfTE9HX1NUUklOR19ORVRfU0laRSAqIDEwKQorCitlbnVtCit7CisgICAgSURfQllfSU5ERVgsCisgICAgSURfQllfTkFNRSwKK307CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21fZGV2X2xvZ19maWxlX3ByaW50KHVpbnQzMl90IGZpbGVfaW5kZXgsIGludDMyX3QgeGlfbXNnc19udW0sIGJjbV9kZXZfbG9nX3ByaW50X2NiIHhpX3ByaW50X2NhbGxiYWNrLCB2b2lkICphcmcsIGJjbW9zX2Jvb2wgY2xlYXIpCit7CisgICAgYmNtX2Rldl9sb2dfZmlsZSAqZmlsZTsKKyAgICBjaGFyIGxvZ19zdHJpbmdbTUFYX0RFVl9MT0dfU1RSSU5HX1NJWkVdOworICAgIGludCBsZW5ndGg7CisgICAgdWludDMyX3QgbnVtX21zZ3M7CisgICAgdWludDMyX3QgaTsKKyAgICB1aW50MzJfdCBvZmZzZXQgPSAwOworICAgIGJjbW9zX2Vycm5vIGVyciA9IEJDTV9FUlJfT0s7CisKKyAgICBmaWxlID0gYmNtX2Rldl9sb2dfZmlsZV9nZXQoZmlsZV9pbmRleCk7CisgICAgaWYgKCFmaWxlKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworCisgICAgbnVtX21zZ3MgPSBiY21fZGV2X2xvZ19nZXRfbnVtX29mX21lc3NhZ2VzKGZpbGUpOworICAgIGlmICh4aV9tc2dzX251bSAmJiB4aV9tc2dzX251bSA8IG51bV9tc2dzKQorICAgICAgICBudW1fbXNncyA9IHhpX21zZ3NfbnVtOworCisgICAgREVWX0xPR19JTkZPX1BSSU5URigiZmlsZT0lcCwgcHJpbnQgJWQgbXNncyBmcm9tIGZpbGUgKG9yaWc6ICVkKVxuIiwgKHZvaWQgKilmaWxlLCAoaW50KW51bV9tc2dzLCAoaW50KXhpX21zZ3NfbnVtKTsKKworICAgIC8qIFByaW50IGZpbGUgKi8KKyAgICBmb3IgKGkgPSAwOyAoaSA8IHhpX21zZ3NfbnVtKSB8fCAheGlfbXNnc19udW07IGkrKykKKyAgICB7CisgICAgICAgIC8qIFJlYWQgZnJvbSBmaWxlICovCisgICAgICAgIGxlbmd0aCA9IGJjbV9kZXZfbG9nX2ZpbGVfcmVhZChmaWxlLCAmb2Zmc2V0LCBsb2dfc3RyaW5nLCBzaXplb2YobG9nX3N0cmluZykpOworICAgICAgICBpZiAoIWxlbmd0aCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB4aV9wcmludF9jYWxsYmFjayhhcmcsIGxvZ19zdHJpbmcpOworICAgIH0KKworICAgIGlmIChjbGVhciA9PSBCQ01PU19UUlVFKQorICAgICAgICBlcnIgPSBiY21fZGV2X2xvZ19maWxlX2NsZWFyKGZpbGUpOworCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmRldl9sb2dfc3RyX3N0eWxlKGJjbV9kZXZfbG9nX3N0eWxlIHN0eWxlKQoreworICAgIHN0YXRpYyBjb25zdCBjaGFyICpzdHJpbmdzW10gPQorICAgIHsKKyAgICAgICAgW0JDTV9ERVZfTE9HX1NUWUxFX05PUk1BTF0gPSAiTk9STUFMIiwKKyAgICAgICAgW0JDTV9ERVZfTE9HX1NUWUxFX0JPTERdID0gIkJPTEQiLAorICAgICAgICBbQkNNX0RFVl9MT0dfU1RZTEVfVU5ERVJMSU5FXSA9ICJVTkRFUkxJTkUiLAorICAgICAgICBbQkNNX0RFVl9MT0dfU1RZTEVfQkxJTktdID0gIkJMSU5LIiwKKyAgICAgICAgW0JDTV9ERVZfTE9HX1NUWUxFX1JFVkVSU0VfVklERU9dID0gIlJFVkVSU0VfVklERU8iLAorICAgIH07CisgICAgcmV0dXJuIHN0cmluZ3Nbc3R5bGUgPiBCQ01fREVWX0xPR19TVFlMRV9SRVZFUlNFX1ZJREVPID8gQkNNX0RFVl9MT0dfU1RZTEVfUkVWRVJTRV9WSURFTyA6IHN0eWxlXTsKK30KKyNpZmRlZiBUUklHR0VSX0xPR0dFUl9GRUFUVVJFCitzdGF0aWMgdm9pZCBiY21fZGV2X2xvZ19jbGlfc2Vzc2lvbl9wcmludF9mZWF0dXJlcyhiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqdGFicywgY29uc3QgZGV2X2xvZ19pZF9wYXJtICppZF9wYXJtKQoreworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sCisgICAgICAgICIlc3Rocm90dGxlIDogbGV2ZWwgPSAlYywgdGhyZXNob2xkID0gJS01dVxuIiwKKyAgICAgICAgdGFicywKKyAgICAgICAgbG9nX2xldmVsX3N0cltpZF9wYXJtLT50aHJvdHRsZV9sb2dfbGV2ZWxdLAorICAgICAgICBpZF9wYXJtLT50aHJvdHRsZS50aHJlc2hvbGQpOworCisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwKKyAgICAgICAgIiVzdHJpZ2dlciA6IGxldmVsID0gJWMsIHN0YXJ0ID0gJS01dSwgc3RvcCA9ICUtNXUsIHJlcGVhdCA9ICUtNXVcbiIsCisgICAgICAgIHRhYnMsCisgICAgICAgIGxvZ19sZXZlbF9zdHJbaWRfcGFybS0+dHJpZ2dlcl9sb2dfbGV2ZWxdLAorICAgICAgICBpZF9wYXJtLT50cmlnZ2VyLnN0YXJ0X3RocmVzaG9sZCwKKyAgICAgICAgaWRfcGFybS0+dHJpZ2dlci5zdG9wX3RocmVzaG9sZCwKKyAgICAgICAgaWRfcGFybS0+dHJpZ2dlci5yZXBlYXRfdGhyZXNob2xkKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBiY21fZGV2X2xvZ19jbGlfc2Vzc2lvbl9wcmludF9pZF9wYXJtKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBjaGFyICp0YWJzLCBjb25zdCBkZXZfbG9nX2lkX3Bhcm0gKmlkX3Bhcm0pCit7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwKKyAgICAgICAgIm5hbWU9JTE2cywgbG9nX3R5cGU9JXUsIGRlZmF1bHRfbG9nX3R5cGU9JXUsIGxvZ19sZXZlbF9wcmludD0lYyAoJXUpLCBsb2dfbGV2ZWxfc2F2ZT0lYyAoJXUpLCBkZWZhdWx0X2xvZ19sZXZlbD0lYyAoJXUpLCBzdHlsZT0lcyAoJXUpLCBsb3N0X21zZ19jbnQ9JXUsIHByaW50X3NraXBwZWRfY291bnQ9JXVcbiIsCisgICAgICAgIGlkX3Bhcm0tPm5hbWUsCisgICAgICAgIGlkX3Bhcm0tPmxvZ190eXBlLAorICAgICAgICBpZF9wYXJtLT5kZWZhdWx0X2xvZ190eXBlLAorICAgICAgICBsb2dfbGV2ZWxfc3RyW2lkX3Bhcm0tPmxvZ19sZXZlbF9wcmludF0sCisgICAgICAgIGlkX3Bhcm0tPmxvZ19sZXZlbF9wcmludCwKKyAgICAgICAgbG9nX2xldmVsX3N0cltpZF9wYXJtLT5sb2dfbGV2ZWxfc2F2ZV0sCisgICAgICAgIGlkX3Bhcm0tPmxvZ19sZXZlbF9zYXZlLAorICAgICAgICBsb2dfbGV2ZWxfc3RyW2lkX3Bhcm0tPmRlZmF1bHRfbG9nX2xldmVsXSwKKyAgICAgICAgaWRfcGFybS0+ZGVmYXVsdF9sb2dfbGV2ZWwsCisgICAgICAgIGRldl9sb2dfc3RyX3N0eWxlKGlkX3Bhcm0tPnN0eWxlKSwKKyAgICAgICAgaWRfcGFybS0+c3R5bGUsCisgICAgICAgIGlkX3Bhcm0tPmxvc3RfbXNnX2NudCwKKyAgICAgICAgaWRfcGFybS0+cHJpbnRfc2tpcHBlZF9jb3VudCk7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwKKyAgICAgICAgIiVzY291bnRlcnMgICAgICAgICAgPSB7JWMgJS01dSwlYyAlLTV1LCVjICUtNXUsJWMgJS01dSwlYyAlLTV1LCVjICUtNXV9XG4iLAorICAgICAgICB0YWJzLAorICAgICAgICBsb2dfbGV2ZWxfc3RyW0RFVl9MT0dfTEVWRUxfTk9fTE9HXSwKKyAgICAgICAgaWRfcGFybS0+Y291bnRlcnNbREVWX0xPR19MRVZFTF9OT19MT0ddLAorICAgICAgICBsb2dfbGV2ZWxfc3RyW0RFVl9MT0dfTEVWRUxfRkFUQUxdLAorICAgICAgICBpZF9wYXJtLT5jb3VudGVyc1tERVZfTE9HX0xFVkVMX0ZBVEFMXSwKKyAgICAgICAgbG9nX2xldmVsX3N0cltERVZfTE9HX0xFVkVMX0VSUk9SXSwKKyAgICAgICAgaWRfcGFybS0+Y291bnRlcnNbREVWX0xPR19MRVZFTF9FUlJPUl0sCisgICAgICAgIGxvZ19sZXZlbF9zdHJbREVWX0xPR19MRVZFTF9XQVJOSU5HXSwKKyAgICAgICAgaWRfcGFybS0+Y291bnRlcnNbREVWX0xPR19MRVZFTF9XQVJOSU5HXSwKKyAgICAgICAgbG9nX2xldmVsX3N0cltERVZfTE9HX0xFVkVMX0lORk9dLAorICAgICAgICBpZF9wYXJtLT5jb3VudGVyc1tERVZfTE9HX0xFVkVMX0lORk9dLAorICAgICAgICBsb2dfbGV2ZWxfc3RyW0RFVl9MT0dfTEVWRUxfREVCVUddLAorICAgICAgICBpZF9wYXJtLT5jb3VudGVyc1tERVZfTE9HX0xFVkVMX0RFQlVHXSk7CisjaWZkZWYgVFJJR0dFUl9MT0dHRVJfRkVBVFVSRQorICAgIGJjbV9kZXZfbG9nX2NsaV9zZXNzaW9uX3ByaW50X2ZlYXR1cmVzKHNlc3Npb24sIHRhYnMsIGlkX3Bhcm0pOworI2VuZGlmCit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21fZGV2X2xvZ19jbGlfcHJpbnRfZGV2X2xvZygKKyAgICBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwKKyAgICBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLAorICAgIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgdWludDMyX3QgaTsKKyAgICBiY21fZGV2X2xvZ19maWxlICpmaWxlOworCisgICAgZm9yIChpID0gMDsgaSA8IERFVl9MT0dfTUFYX0ZJTEVTOyBpKyspCisgICAgeworICAgICAgICBmaWxlID0gYmNtX2Rldl9sb2dfZmlsZV9nZXQoaSk7CisgICAgICAgIGlmICghZmlsZSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCBUQUIgICJmaWxlWyV1XTpcbiIsIGkpOworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCBUQUIyICJtYXhfbXNncyA9ICV1XG4iLCBiY21fZGV2X2xvZ19nZXRfbnVtX29mX21lc3NhZ2VzKGZpbGUpKTsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgVEFCMiAiZmlsZV9wYXJtOlxuIik7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sIFRBQjMgInN0YXJ0X2FkZHIgPSAlcFxuIiwgZGV2X2xvZy5maWxlc1tpXS5maWxlX3Bhcm0uc3RhcnRfYWRkcik7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sIFRBQjMgInNpemUgICAgICAgPSAldVxuIiwgZGV2X2xvZy5maWxlc1tpXS5maWxlX3Bhcm0uc2l6ZSk7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sIFRBQjMgInJlYWRfY2IgICAgPSAlcFxuIiwgKHZvaWQgKilkZXZfbG9nLmZpbGVzW2ldLmZpbGVfcGFybS5yZWFkX2NiKTsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgVEFCMyAid3JpdGVfY2IgICA9ICVwXG4iLCAodm9pZCAqKWRldl9sb2cuZmlsZXNbaV0uZmlsZV9wYXJtLndyaXRlX2NiKTsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgVEFCMyAiZmxhZ3MgICAgICA9ICV4XG4iLCBkZXZfbG9nLmZpbGVzW2ldLmZpbGVfcGFybS5mbGFncyk7CisgICAgfQorICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sIFRBQiAic3RhdGUgICAgID0gJXVcbiIsIGRldl9sb2cuc3RhdGUpOworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sIFRBQiAibXNnX2NvdW50ID0gJXVcbiIsIGRldl9sb2cubXNnX2NvdW50KTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCBUQUIgInNhdmVfcXVldWU6XG4iKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCBUQUIyICJpc193YWl0aW5nICA9ICV1XG4iLCBkZXZfbG9nLnNhdmVfcXVldWUuaXNfd2FpdGluZyk7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgVEFCICJwcmludF9xdWV1ZTpcbiIpOworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sIFRBQjIgImlzX3dhaXRpbmcgID0gJXVcbiIsIGRldl9sb2cucHJpbnRfcXVldWUuaXNfd2FpdGluZyk7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgVEFCICJzYXZlX3Rhc2s6XG4iKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCBUQUIyICJhY3RpdmVfbW9kdWxlcyAgPSAldVxuIiwgZGV2X2xvZy5zYXZlX3Rhc2suYWN0aXZlX21vZHVsZXMpOworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sIFRBQjIgImN1cnJlbnRfbW9kdWxlICA9ICV1XG4iLCBkZXZfbG9nLnNhdmVfdGFzay5jdXJyZW50X21vZHVsZSk7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgVEFCICJwcmludF90YXNrOlxuIik7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgVEFCMiAiYWN0aXZlX21vZHVsZXMgID0gJXVcbiIsIGRldl9sb2cucHJpbnRfdGFzay5hY3RpdmVfbW9kdWxlcyk7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgVEFCMiAiY3VycmVudF9tb2R1bGUgID0gJXVcbiIsIGRldl9sb2cucHJpbnRfdGFzay5jdXJyZW50X21vZHVsZSk7CisKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCBUQUIgIm51bV9pZHMgPSAldVxuIiwgZGV2X2xvZy5udW1faWRzKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCBUQUIgICJpZHNbXTpcbiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBkZXZfbG9nLm51bV9pZHM7IGkrKykKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sIFRBQjIgICJpZHNbJTJ1XTogIiwgaSk7CisgICAgICAgIGJjbV9kZXZfbG9nX2NsaV9zZXNzaW9uX3ByaW50X2lkX3Bhcm0oc2Vzc2lvbiwgVEFCMywgJmRldl9sb2cuaWRzW2ldKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbG9nX25hbWVfdGFibGVfaW5kZXg7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChsb2dzX25hbWVzW2ldLmZpcnN0X2luc3RhbmNlID09IExPR19OQU1FX05PX0lOU1RBTkNFKQorICAgICAgICB7CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCBUQUIyICAiJXNcbiIsIGxvZ3NfbmFtZXNbaV0ubmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCBUQUIyICAiJXMgJWQgLSAlZFxuIiwgbG9nc19uYW1lc1tpXS5uYW1lLCBsb2dzX25hbWVzW2ldLmZpcnN0X2luc3RhbmNlLCBsb2dzX25hbWVzW2ldLmxhc3RfaW5zdGFuY2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21fZGV2X2xvZ19jbGlfbG9nZ2VyX2NvbnRyb2woYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgYmNtX2Rldl9sb2dfc2V0X2NvbnRyb2wocGFybVswXS52YWx1ZS51bnVtYmVyICE9IDApOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfY2xpX2ZpbGVfcHJpbnQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgcmV0dXJuIGJjbV9kZXZfbG9nX2ZpbGVfcHJpbnQoCisgICAgICAgIHBhcm1bMF0udmFsdWUudW51bWJlciwKKyAgICAgICAgMCwKKyAgICAgICAgKGJjbV9kZXZfbG9nX3ByaW50X2NiKWJjbWNsaV9zZXNzaW9uX3ByaW50LAorICAgICAgICBzZXNzaW9uLAorICAgICAgICAoYmNtb3NfYm9vbClwYXJtWzFdLnZhbHVlLnVudW1iZXIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfY2xpX2ZpbGVfY2xlYXIoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgYmNtX2Rldl9sb2dfZmlsZSAqZmlsZSA9IGJjbV9kZXZfbG9nX2ZpbGVfZ2V0KHBhcm1bMF0udmFsdWUudW51bWJlcik7CisgICAgaWYgKCFmaWxlKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIHJldHVybiBiY21fZGV2X2xvZ19maWxlX2NsZWFyKGZpbGUpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfY2xpX2ZpbGVfc2V0X2ZsYWdzKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGRldl9sb2cuZmlsZXNbcGFybVswXS52YWx1ZS51bnVtYmVyXS5maWxlX3Bhcm0uZmxhZ3MgfD0gKGJjbV9kZXZfbG9nX2ZpbGVfZmxhZ3MpcGFybVsxXS52YWx1ZS51bnVtYmVyOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfY2xpX2ZpbGVfcmVzZXRfZmxhZ3MoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgZGV2X2xvZy5maWxlc1twYXJtWzBdLnZhbHVlLnVudW1iZXJdLmZpbGVfcGFybS5mbGFncyA9IDA7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21fZGV2X2xvZ19jbGlfaWRfZ2V0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGRldl9sb2dfaWQgaWQ7CisgICAgZGV2X2xvZ19pZF9wYXJtIGlkX3Bhcm07CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgaWQgPSBwYXJtWzBdLnZhbHVlLnVudW1iZXIgPT0gSURfQllfSU5ERVggPyBiY21fZGV2X2xvZ19pZF9nZXRfYnlfaW5kZXgocGFybVsxXS52YWx1ZS51bnVtYmVyKSA6CisgICAgICAgIGJjbV9kZXZfbG9nX2lkX2dldF9ieV9uYW1lKHBhcm1bMV0udmFsdWUuc3RyaW5nKTsKKyAgICBpZiAoaWQgPT0gREVWX0xPR19JTlZBTElEX0lEKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9OT0VOVDsKKworICAgIGVyciA9IGJjbV9kZXZfbG9nX2lkX2dldChpZCwgJmlkX3Bhcm0pOworICAgIGlmIChlcnIpCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiRXJyb3I6IGNhbiBnZXQgaWQgKGVycjogJWQpXG4iLCBlcnIpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJjbV9kZXZfbG9nX2NsaV9zZXNzaW9uX3ByaW50X2lkX3Bhcm0oc2Vzc2lvbiwgVEFCLCAmaWRfcGFybSk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2NsaV9pZF9zZXRfdHlwZShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBkZXZfbG9nX2lkIGlkOworCisgICAgaWQgPSBiY21fZGV2X2xvZ19pZF9nZXRfYnlfaW5kZXgocGFybVswXS52YWx1ZS51bnVtYmVyKTsKKyAgICBpZiAoaWQgPT0gREVWX0xPR19JTlZBTElEX0lEKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9OT0VOVDsKKworICAgIHJldHVybiBiY21fZGV2X2xvZ19pZF9zZXRfdHlwZShpZCwgKGJjbV9kZXZfbG9nX2lkX3R5cGUpcGFybVsxXS52YWx1ZS51bnVtYmVyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2NsaV9pZF9zZXRfbGV2ZWwoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgZGV2X2xvZ19pZCBpZDsKKworICAgIGlkID0gYmNtX2Rldl9sb2dfaWRfZ2V0X2J5X2luZGV4KHBhcm1bMF0udmFsdWUudW51bWJlcik7CisgICAgaWYgKGlkID09IERFVl9MT0dfSU5WQUxJRF9JRCkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9FTlQ7CisKKyAgICByZXR1cm4gYmNtX2Rldl9sb2dfaWRfc2V0X2xldmVsKAorICAgICAgICBpZCwKKyAgICAgICAgKGJjbV9kZXZfbG9nX2xldmVsKXBhcm1bMV0udmFsdWUudW51bWJlciwKKyAgICAgICAgKGJjbV9kZXZfbG9nX2xldmVsKXBhcm1bMl0udmFsdWUudW51bWJlcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21fZGV2X2xvZ19jbGlfbmFtZV9zZXRfbGV2ZWwoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgZGV2X2xvZ19pZCBpZDsKKworICAgIGlkID0gYmNtX2Rldl9sb2dfaWRfZ2V0X2J5X25hbWUocGFybVswXS52YWx1ZS5zdHJpbmcpOworICAgIGlmIChpZCA9PSBERVZfTE9HX0lOVkFMSURfSUQpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT0VOVDsKKyAgICB9CisKKyAgICByZXR1cm4gYmNtX2Rldl9sb2dfaWRfc2V0X2xldmVsKAorICAgICAgICBpZCwKKyAgICAgICAgKGJjbV9kZXZfbG9nX2xldmVsKXBhcm1bMV0udmFsdWUudW51bWJlciwKKyAgICAgICAgKGJjbV9kZXZfbG9nX2xldmVsKXBhcm1bMl0udmFsdWUudW51bWJlcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21fZGV2X2xvZ19jbGlfaWRfc2V0X3RvX2RlZmF1bHQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgZGV2X2xvZ19pZCBpZDsKKworICAgIGlkID0gYmNtX2Rldl9sb2dfaWRfZ2V0X2J5X2luZGV4KHBhcm1bMF0udmFsdWUudW51bWJlcik7CisgICAgaWYgKGlkID09IERFVl9MT0dfSU5WQUxJRF9JRCkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9FTlQ7CisKKyAgICByZXR1cm4gYmNtX2Rldl9sb2dfaWRfc2V0X2xldmVsc19hbmRfdHlwZV90b19kZWZhdWx0KGlkKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2NsaV9pZF9zZXRfc3R5bGUoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgZGV2X2xvZ19pZCBpZDsKKyAgICBiY21fZGV2X2xvZ19zdHlsZSBzdHlsZTsKKworICAgIGlkID0gYmNtX2Rldl9sb2dfaWRfZ2V0X2J5X2luZGV4KGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImluZGV4IiktPnZhbHVlLnVudW1iZXIpOworICAgIGlmIChpZCA9PSBERVZfTE9HX0lOVkFMSURfSUQpCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PRU5UOworICAgIHN0eWxlID0gKGJjbV9kZXZfbG9nX3N0eWxlKWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0eWxlIiktPnZhbHVlLnVudW1iZXI7CisKKyAgICByZXR1cm4gYmNtX2Rldl9sb2dfaWRfc2V0X3N0eWxlKGlkLCBzdHlsZSk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21fZGV2X2xvZ19jbGlfaWRfY2xlYXJfY291bnRlcnMoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgZGV2X2xvZ19pZCBpZDsKKworICAgIGlkID0gYmNtX2Rldl9sb2dfaWRfZ2V0X2J5X2luZGV4KHBhcm1bMF0udmFsdWUudW51bWJlcik7CisgICAgaWYgKGlkID09IERFVl9MT0dfSU5WQUxJRF9JRCkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9FTlQ7CisKKyAgICByZXR1cm4gYmNtX2Rldl9sb2dfaWRfY2xlYXJfY291bnRlcnMoaWQpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfY2xpX2xvZyhiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBkZXZfbG9nX2lkIGlkOworICAgIGJjbV9kZXZfbG9nX2xldmVsIGxvZ19sZXZlbDsKKyAgICB1aW50MzJfdCBjb3VudCA9IDE7CisgICAgY29uc3QgY2hhciAqc3RyaW5nOworICAgIGJjbWNsaV9jbWRfcGFybSAqY21kX3Bhcm07CisKKyAgICBpZCA9IGJjbV9kZXZfbG9nX2lkX2dldF9ieV9pbmRleChwYXJtWzBdLnZhbHVlLnVudW1iZXIpOworICAgIGlmIChpZCA9PSBERVZfTE9HX0lOVkFMSURfSUQpCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PRU5UOworCisgICAgaWYgKChjbWRfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNvdW50IikpKQorICAgIHsKKyAgICAgICAgY291bnQgPSBjbWRfcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICAgICAgaWYgKCFjb3VudCkKKyAgICAgICAgeworICAgICAgICAgICAgY291bnQgPSAxOworICAgICAgICB9CisgICAgfQorCisgICAgbG9nX2xldmVsID0gKGJjbV9kZXZfbG9nX2xldmVsKXBhcm1bMV0udmFsdWUudW51bWJlcjsKKyAgICBzdHJpbmcgPSBwYXJtWzJdLnZhbHVlLnN0cmluZzsKKworICAgIHdoaWxlIChjb3VudC0tKQorICAgIHsKKyAgICAgICAgYmNtX2Rldl9sb2dfbG9nKGlkLCBsb2dfbGV2ZWwsIEJDTV9MT0dfRkxBR19OT05FLCAiJTV1fCBNZXNzYWdlOiAlc1xuIiwgY291bnQsIHN0cmluZyk7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21fZGV2X2xvZ19jbGlfaW5zdGFuY2VfZW5hYmxlKAorICAgIGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIHN0YXRpYyBjaGFyIGxvZ19uYW1lW01BWF9ERVZfTE9HX0lEX05BTUVdOworICAgIGJjbW9zX2Jvb2wgZW5hYmxlID0gKGJjbW9zX2Jvb2wpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZW5hYmxlIiktPnZhbHVlLnVudW1iZXI7CisgICAgdWludDMyX3QgaW5zdCA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImluc3RhbmNlIiktPnZhbHVlLnVudW1iZXI7CisgICAgZGV2X2xvZ19pZCBsb2dfaWQ7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIHVpbnQzMl90IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbG9nX25hbWVfdGFibGVfaW5kZXg7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChsb2dzX25hbWVzW2ldLmZpcnN0X2luc3RhbmNlICE9IExPR19OQU1FX05PX0lOU1RBTkNFICYmCisgICAgICAgICAgICBpbnN0ID49IGxvZ3NfbmFtZXNbaV0uZmlyc3RfaW5zdGFuY2UgJiYKKyAgICAgICAgICAgIGluc3QgPD0gbG9nc19uYW1lc1tpXS5sYXN0X2luc3RhbmNlKQorICAgICAgICB7CisgICAgICAgICAgICBzbnByaW50Zihsb2dfbmFtZSwgc2l6ZW9mKGxvZ19uYW1lKSwgIiVzJXUiLCBsb2dzX25hbWVzW2ldLm5hbWUsIGluc3QpOworICAgICAgICAgICAgbG9nX2lkID0gYmNtX2Rldl9sb2dfaWRfZ2V0X2J5X25hbWUobG9nX25hbWUpOworICAgICAgICAgICAgaWYgKGxvZ19pZCA9PSBERVZfTE9HX0lOVkFMSURfSUQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIkVycm9yOiBsb2cgSUQgbm90IGZvdW5kOiAlc1xuIiwgbG9nX25hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXJyID0gYmNtX2Rldl9sb2dfaWRfc2V0X3R5cGUobG9nX2lkLCBlbmFibGUgPyBERVZfTE9HX0lEX1RZUEVfQk9USCA6IERFVl9MT0dfSURfVFlQRV9OT05FKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiRXJyb3Igc2V0dGluZyBsb2cgdHlwZTogJXNcbiIsIGJjbW9zX3N0cmVycm9yKGVycikpOworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiTG9nICclcycgJXNcbiIsIGxvZ19uYW1lLCBlbmFibGUgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisjaWZkZWYgVFJJR0dFUl9MT0dHRVJfRkVBVFVSRQorc3RhdGljIGJjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2NsaV90aHJvdHRsZShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBkZXZfbG9nX2lkIGlkOworCisgICAgaWQgPSBiY21fZGV2X2xvZ19pZF9nZXRfYnlfaW5kZXgocGFybVswXS52YWx1ZS51bnVtYmVyKTsKKyAgICBpZiAoaWQgPT0gREVWX0xPR19JTlZBTElEX0lEKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9OT0VOVDsKKworICAgIHJldHVybiBiY21fZGV2X2xvZ19zZXRfdGhyb3R0bGUoaWQsIHBhcm1bMV0udmFsdWUudW51bWJlciwgcGFybVsyXS52YWx1ZS51bnVtYmVyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2NsaV90cmlnZ2VyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGRldl9sb2dfaWQgaWQ7CisgICAgaW50MzJfdCByZXBlYXQgPSAwOworICAgIGJjbWNsaV9jbWRfcGFybSAqY21kX3Bhcm07CisKKyAgICBpZCA9IGJjbV9kZXZfbG9nX2lkX2dldF9ieV9pbmRleChwYXJtWzBdLnZhbHVlLnVudW1iZXIpOworICAgIGlmIChpZCA9PSBERVZfTE9HX0lOVkFMSURfSUQpCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PRU5UOworCisgICAgaWYgKChjbWRfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInJlcGVhdCIpKSkKKyAgICAgICAgcmVwZWF0ID0gY21kX3Bhcm0tPnZhbHVlLm51bWJlcjsKKworICAgIHJldHVybiBiY21fZGV2X2xvZ19zZXRfdHJpZ2dlcihpZCwgcGFybVsxXS52YWx1ZS51bnVtYmVyLCBwYXJtWzJdLnZhbHVlLnVudW1iZXIsIHBhcm1bM10udmFsdWUudW51bWJlciwgcmVwZWF0KTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2NsaV9nZXRfZmVhdHVyZXMoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgZGV2X2xvZ19pZCBpZDsKKyAgICBkZXZfbG9nX2lkX3Bhcm0gaWRfcGFybTsKKyAgICBiY21vc19lcnJubyBlcnI7CisKKyAgICBpZCA9IGJjbV9kZXZfbG9nX2lkX2dldF9ieV9pbmRleChwYXJtWzBdLnZhbHVlLnVudW1iZXIpOworICAgIGlmIChpZCA9PSBERVZfTE9HX0lOVkFMSURfSUQpCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PRU5UOworCisgICAgZXJyID0gYmNtX2Rldl9sb2dfaWRfZ2V0KGlkLCAmaWRfcGFybSk7CisgICAgaWYgKGVycikKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJFcnJvcjogY2FuIGdldCBpZCAoZXJyOiAlZClcbiIsIGVycik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtX2Rldl9sb2dfY2xpX3Nlc3Npb25fcHJpbnRfZmVhdHVyZXMoc2Vzc2lvbiwgVEFCLCAmaWRfcGFybSk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGRldl9sb2dfY2xpX3Nlc3Npb25fd3JpdGVfY2IoYmNtY2xpX3Nlc3Npb24gKmNsaV9zZXNzaW9uLCBjb25zdCBjaGFyICpidWYsIHVpbnQzMl90IHNpemUpCit7CisgICAgYmNtX2Rldl9sb2dfY2xpX3Nlc3Npb24gKnNlc3Npb24gPSBiY21jbGlfc2Vzc2lvbl91c2VyX3ByaXYoY2xpX3Nlc3Npb24pOworICAgIGNoYXIgdG1wX3N0cltERVZfTE9HX0NMSV9TRVNTSU9OX01BWF9NU0dfU0laRV0gPSB7fTsKKyAgICBjaGFyICpwOworICAgIHVpbnQzMl90IHRtcF9zdHJfbGVuOworCisgICAgc3RybmNweSh0bXBfc3RyLCBidWYsIHNpemVvZih0bXBfc3RyKSAtIDEpOyAvKiBsZWF2ZSByb29tIGZvciB0aGUgdGVybWluYXRvciAqLworCisgICAgcCA9IHRtcF9zdHI7CisgICAgdG1wX3N0cl9sZW4gPSBzdHJsZW4odG1wX3N0cik7CisgICAgd2hpbGUgKHRtcF9zdHJfbGVuID4gc2Vzc2lvbi0+ZnJlZV9sZW4pCisgICAgeworICAgICAgICAvKiBOb3QgZW5vdWdoIHNwYWNlIGluICdzdHInIGZvciBjb25jYXRlbmF0aW5nIHdoYXQncyBpbiAncCcgLT4gc3BsaXQgaXQuICovCisgICAgICAgIHN0cm5jYXQoc2Vzc2lvbi0+c3RyLCBwLCBzZXNzaW9uLT5mcmVlX2xlbik7CisgICAgICAgIGJjbV9kZXZfbG9nX2xvZygKKyAgICAgICAgICAgIHNlc3Npb24tPmxvZ19pZCwgc2Vzc2lvbi0+bG9nX2xldmVsLCBCQ01fTE9HX0ZMQUdfTk9fSEVBREVSIHwgQkNNX0xPR19GTEFHX0NBTExFUl9GTVQsICIlcyIsIHNlc3Npb24tPnN0cik7CisgICAgICAgICpzZXNzaW9uLT5zdHIgPSAnXDAnOworICAgICAgICBwICs9IHNlc3Npb24tPmZyZWVfbGVuOworICAgICAgICB0bXBfc3RyX2xlbiAtPSBzZXNzaW9uLT5mcmVlX2xlbjsKKyAgICAgICAgc2Vzc2lvbi0+ZnJlZV9sZW4gPSBNQVhfREVWX0xPR19TVFJJTkdfTkVUX1NJWkUgLSAxOworICAgIH0KKworICAgIC8qIEVub3VnaCBzcGFjZSBpbiAnc3RyJyBmb3IgY29uY2F0ZW5hdGluZyB3aGF0J3MgaW4gJ3AnLiAqLworICAgIHN0cm5jYXQoc2Vzc2lvbi0+c3RyLCBwLCB0bXBfc3RyX2xlbik7CisgICAgc2Vzc2lvbi0+ZnJlZV9sZW4gLT0gdG1wX3N0cl9sZW47CisKKyAgICAvKiBJZiB0aGUgbWVzc2FnZSBpcyBub3QgdGVybWluYXRlZCBieSAnXG4nLCBkbyBub3Qgc3VibWl0IHRoZSBtZXNzYWdlIHRvIGxvZ2dlciB5ZXQKKyAgICAgKiAocmF0aGVyIHNhdmUgaXQsIHdhaXRpbmcgZm9yIGEgbGF0ZXIgbWVzc2FnZSB3aXRoICdcbicpLiAqLworICAgIGlmIChzZXNzaW9uLT5zdHJbc3RybGVuKHNlc3Npb24tPnN0cikgLSAxXSA9PSAnXG4nKQorICAgIHsKKyAgICAgICAgYmNtX2Rldl9sb2dfbG9nKAorICAgICAgICAgICAgc2Vzc2lvbi0+bG9nX2lkLCBzZXNzaW9uLT5sb2dfbGV2ZWwsIEJDTV9MT0dfRkxBR19OT19IRUFERVIgfCBCQ01fTE9HX0ZMQUdfQ0FMTEVSX0ZNVCwgIiVzIiwgc2Vzc2lvbi0+c3RyKTsKKyAgICAgICAgKnNlc3Npb24tPnN0ciA9ICdcMCc7CisgICAgICAgIHNlc3Npb24tPmZyZWVfbGVuID0gTUFYX0RFVl9MT0dfU1RSSU5HX05FVF9TSVpFIC0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gc2l6ZTsKK30KKworYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfY2xpX3Nlc3Npb25fY3JlYXRlKAorICAgIGRldl9sb2dfaWQgbG9nX2lkLAorICAgIGJjbV9kZXZfbG9nX2xldmVsIGxvZ19sZXZlbCwKKyAgICBiY21fZGV2X2xvZ19jbGlfc2Vzc2lvbiAqKnNlc3Npb24pCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbWNsaV9zZXNzaW9uX3Bhcm0gc2Vzc2lvbl9wYXJhbXMgPSB7IC53cml0ZSA9IGRldl9sb2dfY2xpX3Nlc3Npb25fd3JpdGVfY2IgfTsKKworICAgICpzZXNzaW9uID0gYmNtb3NfY2FsbG9jKHNpemVvZihiY21fZGV2X2xvZ19jbGlfc2Vzc2lvbikpOworICAgIGlmICgqc2Vzc2lvbiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorCisgICAgc2Vzc2lvbl9wYXJhbXMudXNlcl9wcml2ID0gKnNlc3Npb247CisgICAgZXJyID0gYmNtY2xpX3Nlc3Npb25fb3Blbigmc2Vzc2lvbl9wYXJhbXMsICYoKCpzZXNzaW9uKS0+c2Vzc2lvbikpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIGJjbW9zX2ZyZWUoKnNlc3Npb24pOworICAgICAgICAqc2Vzc2lvbiA9IE5VTEw7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgKCpzZXNzaW9uKS0+bG9nX2lkID0gbG9nX2lkOworICAgICgqc2Vzc2lvbiktPmxvZ19sZXZlbCA9IGxvZ19sZXZlbDsKKyAgICAoKnNlc3Npb24pLT5mcmVlX2xlbiA9IE1BWF9ERVZfTE9HX1NUUklOR19ORVRfU0laRSAtIDE7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbWNsaV9lbnRyeSAqYmNtX2Rldl9sb2dfY2xpX2luaXQoYmNtY2xpX2VudHJ5ICpyb290X2RpcikKK3sKKyAgICBiY21jbGlfZW50cnkgKmRpcjsKKyAgICBzdGF0aWMgYmNtY2xpX2VudW1fdmFsIGVudW1fdGFibGVfbG9nX2xldmVsW10gPQorICAgIHsKKyAgICAgICAgeyAubmFtZSA9ICJOT19MT0ciLCAudmFsID0gKGxvbmcpREVWX0xPR19MRVZFTF9OT19MT0cgfSwKKyAgICAgICAgeyAubmFtZSA9ICJGQVRBTCIsIC52YWwgPSAobG9uZylERVZfTE9HX0xFVkVMX0ZBVEFMIH0sCisgICAgICAgIHsgLm5hbWUgPSAiRVJST1IiLCAudmFsID0gKGxvbmcpREVWX0xPR19MRVZFTF9FUlJPUiB9LAorICAgICAgICB7IC5uYW1lID0gIldBUk5JTkciLCAudmFsID0gKGxvbmcpREVWX0xPR19MRVZFTF9XQVJOSU5HfSwKKyAgICAgICAgeyAubmFtZSA9ICJJTkZPIiwgLnZhbCA9IChsb25nKURFVl9MT0dfTEVWRUxfSU5GTyB9LAorICAgICAgICB7IC5uYW1lID0gIkRFQlVHIiwgLnZhbCA9IChsb25nKURFVl9MT0dfTEVWRUxfREVCVUcgfSwKKyAgICAgICAgQkNNQ0xJX0VOVU1fTEFTVAorICAgIH07CisKKyAgICBpZiAoKGRpciA9IGJjbWNsaV9kaXJfZmluZChOVUxMLCAibG9nZ2VyIikpICE9IE5VTEwpCisgICAgICAgIHJldHVybiBkaXI7CisKKyAgICBkaXIgPSBiY21jbGlfZGlyX2FkZChyb290X2RpciwgImxvZ2dlciIsICJEZXYgTG9nIiwgQkNNQ0xJX0FDQ0VTU19HVUVTVCwgTlVMTCk7CisKKyAgICB7CisgICAgICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oZGlyLCAicHJpbnRfZGV2X2xvZyIsICJQcmludCBEZXYgbG9nIiwgYmNtX2Rldl9sb2dfY2xpX3ByaW50X2Rldl9sb2cpOworICAgIH0KKyAgICB7CisgICAgICAgIEJDTUNMSV9NQUtFX0NNRChkaXIsICJsb2dnZXJfY29udHJvbCIsICJMb2dnZXIgQ29udHJvbCIsIGJjbV9kZXZfbG9nX2NsaV9sb2dnZXJfY29udHJvbCwKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fUkFOR0UoImVuYWJsZSIsICJlbmFibGUiLCBCQ01DTElfUEFSTV9VREVDSU1BTCwgMCwgMCwgMSkpOworICAgIH0KKyAgICB7CisgICAgICAgIEJDTUNMSV9NQUtFX0NNRChkaXIsICJmaWxlX3ByaW50IiwgIlByaW50IGxvZ2dlciBmaWxlIiwgYmNtX2Rldl9sb2dfY2xpX2ZpbGVfcHJpbnQsCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJpbmRleCIsICJpbmRleCIsIEJDTUNMSV9QQVJNX1VERUNJTUFMLCAwKSwKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fUkFOR0UoImNsZWFyIiwgImNsZWFyIiwgQkNNQ0xJX1BBUk1fVURFQ0lNQUwsIDAsIDAsIDEpKTsKKyAgICB9CisgICAgeworICAgICAgICBCQ01DTElfTUFLRV9DTUQoZGlyLCAiZmlsZV9jbGVhciIsICJDbGVhciBmaWxlIiwgYmNtX2Rldl9sb2dfY2xpX2ZpbGVfY2xlYXIsCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJpbmRleCIsICJpbmRleCIsIEJDTUNMSV9QQVJNX1VERUNJTUFMLCAwKSk7CisgICAgfQorICAgIHsKKyAgICAgICAgc3RhdGljIGJjbWNsaV9lbnVtX3ZhbCBlbnVtX3RhYmxlX2ZpbGVfZmxhZ3NbXSA9CisgICAgICAgIHsKKyAgICAgICAgICAgIHsgLm5hbWUgPSAiVkFMSUQiLCAudmFsID0gKGxvbmcpQkNNX0RFVl9MT0dfRklMRV9GTEFHX1ZBTElEIH0sCisgICAgICAgICAgICB7IC5uYW1lID0gIldSQVBfQVJPVU5EIiwgLnZhbCA9IChsb25nKUJDTV9ERVZfTE9HX0ZJTEVfRkxBR19XUkFQX0FST1VORCB9LAorICAgICAgICAgICAgeyAubmFtZSA9ICJTVE9QX1dIRU5fRlVMTCIsIC52YWwgPSAobG9uZylCQ01fREVWX0xPR19GSUxFX0ZMQUdfU1RPUF9XSEVOX0ZVTEwgfSwKKyAgICAgICAgICAgIEJDTUNMSV9FTlVNX0xBU1QKKyAgICAgICAgfTsKKyAgICAgICAgQkNNQ0xJX01BS0VfQ01EKGRpciwgImZpbGVfc2V0X2ZsYWdzIiwgIlNldCBmaWxlIGZsYWdzIiwgYmNtX2Rldl9sb2dfY2xpX2ZpbGVfc2V0X2ZsYWdzLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9SQU5HRSgiaW5kZXgiLCAiaW5kZXgiLCBCQ01DTElfUEFSTV9VREVDSU1BTCwgMCwgMCwgREVWX0xPR19NQVhfRklMRVMtMSksCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oImZsYWdzIiwgImZsYWdzIiwgZW51bV90YWJsZV9maWxlX2ZsYWdzLCAwKSk7CisgICAgfQorICAgIHsKKyAgICAgICAgQkNNQ0xJX01BS0VfQ01EKGRpciwgImZpbGVfcmVzZXRfZmxhZ3MiLCAiUmVzZXQgZmlsZSBmbGFncyIsIGJjbV9kZXZfbG9nX2NsaV9maWxlX3Jlc2V0X2ZsYWdzLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9SQU5HRSgiaW5kZXgiLCAiaW5kZXgiLCBCQ01DTElfUEFSTV9VREVDSU1BTCwgMCwgMCwgREVWX0xPR19NQVhfRklMRVMtMSkpOworICAgIH0KKyAgICB7CisgICAgICAgIHN0YXRpYyBiY21jbGlfY21kX3Bhcm0gc2V0MVtdPQorICAgICAgICB7CisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJpbmRleCIsICJpbmRleCIsIEJDTUNMSV9QQVJNX1VERUNJTUFMLCAwKSwKKyAgICAgICAgICAgIEJDTUNMSV9QQVJNX0xJU1RfVEVSTUlOQVRPUgorICAgICAgICB9OworICAgICAgICBzdGF0aWMgYmNtY2xpX2NtZF9wYXJtIHNldDJbXSA9CisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oIm5hbWUiLCAibmFtZSIsIEJDTUNMSV9QQVJNX1NUUklORywgMCksCisgICAgICAgICAgICBCQ01DTElfUEFSTV9MSVNUX1RFUk1JTkFUT1IKKyAgICAgICAgfTsKKyAgICAgICAgc3RhdGljIGJjbWNsaV9lbnVtX3ZhbCBzZWxlY3Rvcl90YWJsZVtdID0KKyAgICAgICAgeworICAgICAgICAgICAgeyAubmFtZSA9ICJieV9pbmRleCIsIC52YWwgPSBJRF9CWV9JTkRFWCwgLnBhcm1zID0gc2V0MSB9LAorICAgICAgICAgICAgeyAubmFtZSA9ICJieV9uYW1lIiwgLnZhbCA9IElEX0JZX05BTUUsIC5wYXJtcyA9IHNldDIgfSwKKyAgICAgICAgICAgIEJDTUNMSV9FTlVNX0xBU1QKKyAgICAgICAgfTsKKyAgICAgICAgQkNNQ0xJX01BS0VfQ01EKGRpciwgImlkX2dldCIsICJpZF9nZXQiLCBiY21fZGV2X2xvZ19jbGlfaWRfZ2V0LAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9TRUxFQ1RPUigiYnkiLCAiYnkiLCBzZWxlY3Rvcl90YWJsZSwgMCkpOworICAgIH0KKyAgICB7CisgICAgICAgIHN0YXRpYyBiY21jbGlfZW51bV92YWwgZW51bV90YWJsZVtdID0KKyAgICAgICAgeworICAgICAgICAgICAgeyAubmFtZSA9ICJub25lIiwgLnZhbCA9IChsb25nKURFVl9MT0dfSURfVFlQRV9OT05FIH0sCisgICAgICAgICAgICB7IC5uYW1lID0gInByaW50IiwgLnZhbCA9IChsb25nKURFVl9MT0dfSURfVFlQRV9QUklOVCB9LAorICAgICAgICAgICAgeyAubmFtZSA9ICJzYXZlIiwgLnZhbCA9IChsb25nKURFVl9MT0dfSURfVFlQRV9TQVZFIH0sCisgICAgICAgICAgICB7IC5uYW1lID0gImJvdGgiLCAudmFsID0gKGxvbmcpREVWX0xPR19JRF9UWVBFX0JPVEggfSwKKyAgICAgICAgICAgIEJDTUNMSV9FTlVNX0xBU1QKKyAgICAgICAgfTsKKyAgICAgICAgQkNNQ0xJX01BS0VfQ01EKGRpciwgImlkX3NldF90eXBlIiwgImlkX3NldF90eXBlIiwgYmNtX2Rldl9sb2dfY2xpX2lkX3NldF90eXBlLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiaW5kZXgiLCAiaW5kZXgiLCBCQ01DTElfUEFSTV9VREVDSU1BTCwgMCksCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oImxvZ190eXBlIiwgImxvZ190eXBlIiwgZW51bV90YWJsZSwgMCkpOworICAgIH0KKyAgICB7CisgICAgICAgIEJDTUNMSV9NQUtFX0NNRChkaXIsICJpZF9zZXRfbGV2ZWwiLCAiaWRfc2V0X2xldmVsIiwgYmNtX2Rldl9sb2dfY2xpX2lkX3NldF9sZXZlbCwKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImluZGV4IiwgImluZGV4IiwgQkNNQ0xJX1BBUk1fVURFQ0lNQUwsIDApLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNKCJsb2dfbGV2ZWxfcHJpbnQiLCAibG9nX2xldmVsIiwgZW51bV90YWJsZV9sb2dfbGV2ZWwsIDApLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNKCJsb2dfbGV2ZWxfc2F2ZSIsICJsb2dfbGV2ZWwiLCBlbnVtX3RhYmxlX2xvZ19sZXZlbCwgMCkpOworICAgIH0KKyAgICB7CisgICAgICAgIEJDTUNMSV9NQUtFX0NNRChkaXIsICJuYW1lX3NldF9sZXZlbCIsICJuYW1lX3NldF9sZXZlbCIsIGJjbV9kZXZfbG9nX2NsaV9uYW1lX3NldF9sZXZlbCwKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oIm5hbWUiLCAibmFtZSIsIEJDTUNMSV9QQVJNX1NUUklORywgMCksCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oImxvZ19sZXZlbF9wcmludCIsICJsb2dfbGV2ZWwiLCBlbnVtX3RhYmxlX2xvZ19sZXZlbCwgMCksCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oImxvZ19sZXZlbF9zYXZlIiwgImxvZ19sZXZlbCIsIGVudW1fdGFibGVfbG9nX2xldmVsLCAwKSk7CisgICAgfQorICAgIHsKKyAgICAgICAgQkNNQ0xJX01BS0VfQ01EKGRpciwgImlkX3NldF90b19kZWZhdWx0IiwgImlkX3NldF90b19kZWZhdWx0IiwgYmNtX2Rldl9sb2dfY2xpX2lkX3NldF90b19kZWZhdWx0LAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiaW5kZXgiLCAiaW5kZXgiLCBCQ01DTElfUEFSTV9VREVDSU1BTCwgMCkpOworICAgIH0KKyAgICB7CisgICAgICAgIHN0YXRpYyBiY21jbGlfZW51bV92YWwgZW51bV90YWJsZV9sb2dfc3R5bGVbXSA9CisgICAgICAgIHsKKyAgICAgICAgICAgIHsgLm5hbWUgPSAibm9ybWFsIiwgLnZhbCA9IChsb25nKUJDTV9ERVZfTE9HX1NUWUxFX05PUk1BTCB9LAorICAgICAgICAgICAgeyAubmFtZSA9ICJib2xkIiwgLnZhbCA9IChsb25nKUJDTV9ERVZfTE9HX1NUWUxFX0JPTEQgfSwKKyAgICAgICAgICAgIHsgLm5hbWUgPSAidW5kZXJsaW5lIiwgLnZhbCA9IChsb25nKUJDTV9ERVZfTE9HX1NUWUxFX1VOREVSTElORSB9LAorICAgICAgICAgICAgeyAubmFtZSA9ICJibGluayIsIC52YWwgPSAobG9uZylCQ01fREVWX0xPR19TVFlMRV9CTElOSyB9LAorICAgICAgICAgICAgeyAubmFtZSA9ICJyZXZlcnNlX3ZpZGVvIiwgLnZhbCA9IChsb25nKUJDTV9ERVZfTE9HX1NUWUxFX1JFVkVSU0VfVklERU8gfSwKKyAgICAgICAgICAgIEJDTUNMSV9FTlVNX0xBU1QKKyAgICAgICAgfTsKKyAgICAgICAgQkNNQ0xJX01BS0VfQ01EKGRpciwgImlkX3NldF9zdHlsZSIsICJpZF9zZXRfc3R5bGUiLCBiY21fZGV2X2xvZ19jbGlfaWRfc2V0X3N0eWxlLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiaW5kZXgiLCAiaW5kZXgiLCBCQ01DTElfUEFSTV9VREVDSU1BTCwgMCksCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oInN0eWxlIiwgInN0eWxlIiwgZW51bV90YWJsZV9sb2dfc3R5bGUsIDApKTsKKyAgICB9CisgICAgeworICAgICAgICBCQ01DTElfTUFLRV9DTUQoZGlyLCAiaWRfY2xlYXJfY291bnRlcnMiLCAiaWRfY2xlYXJfY291bnRlcnMiLCBiY21fZGV2X2xvZ19jbGlfaWRfY2xlYXJfY291bnRlcnMsCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJpbmRleCIsICJpbmRleCIsIEJDTUNMSV9QQVJNX1VERUNJTUFMLCAwKSk7CisgICAgfQorICAgIHsKKyAgICAgICAgQkNNQ0xJX01BS0VfQ01EKGRpciwgImxvZyIsICJsb2ciLCBiY21fZGV2X2xvZ19jbGlfbG9nLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiaW5kZXgiLCAiaW5kZXgiLCBCQ01DTElfUEFSTV9VREVDSU1BTCwgMCksCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oImxvZ19sZXZlbF9wcmludCIsICJsb2dfbGV2ZWwiLCBlbnVtX3RhYmxlX2xvZ19sZXZlbCwgMCksCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJzdHJpbmciLCAic3RyaW5nIiwgQkNNQ0xJX1BBUk1fU1RSSU5HLCAwKSwKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImNvdW50IiwgIk51bWJlciBvZiBtZXNzYWdlcyB0byBzZW5kIiwgQkNNQ0xJX1BBUk1fVURFQ0lNQUwsIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwpKTsKKyAgICB9CisgICAgeworICAgICAgICBCQ01DTElfTUFLRV9DTUQoZGlyLCAiaW5zdGFuY2VfZW5hYmxlIiwgImVuYWJsZS9kaXNhYmxlIGluc3RhbmNlIG51bWJlciIsIGJjbV9kZXZfbG9nX2NsaV9pbnN0YW5jZV9lbmFibGUsCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oImVuYWJsZSIsICJlbmFibGUiLCBiY21jbGlfZW51bV9ib29sX3RhYmxlLCAwKSwKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImluc3RhbmNlIiwgImluc3RhbmNlIG51bWJlciIsIEJDTUNMSV9QQVJNX1VERUNJTUFMLCAwKSk7CisgICAgfQorI2lmZGVmIFRSSUdHRVJfTE9HR0VSX0ZFQVRVUkUKKyAgICB7CisgICAgICAgIEJDTUNMSV9NQUtFX0NNRChkaXIsICJpZF9zZXRfdGhyb3R0bGUiLCAic2V0IHRocm90dGxlIiwgYmNtX2Rldl9sb2dfY2xpX3Rocm90dGxlLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiaW5kZXgiLCAiaW5kZXgiLCBCQ01DTElfUEFSTV9VREVDSU1BTCwgMCksCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oImxvZ19sZXZlbF9wcmludCIsICJsb2dfbGV2ZWwiLCBlbnVtX3RhYmxlX2xvZ19sZXZlbCwgMCksCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJ0aHJvdHRsZSIsICJ0aHJvdHRsZSIsIEJDTUNMSV9QQVJNX1VERUNJTUFMLCAwKSk7CisgICAgfQorICAgIHsKKyAgICAgICAgQkNNQ0xJX01BS0VfQ01EKGRpciwgImlkX3NldF90cmlnZ2VyIiwgInNldCB0cmlnZ2VyIiwgYmNtX2Rldl9sb2dfY2xpX3RyaWdnZXIsCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJpbmRleCIsICJpbmRleCIsIEJDTUNMSV9QQVJNX1VERUNJTUFMLCAwKSwKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fRU5VTSgibG9nX2xldmVsX3ByaW50IiwgImxvZ19sZXZlbCIsIGVudW1fdGFibGVfbG9nX2xldmVsLCAwKSwKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oInN0YXJ0IiwgInN0YXJ0IiwgQkNNQ0xJX1BBUk1fVURFQ0lNQUwsIDApLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgic3RvcCIsICJzdG9wIiwgQkNNQ0xJX1BBUk1fVURFQ0lNQUwsIDApLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgicmVwZWF0IiwgInJlcGVhdCIsIEJDTUNMSV9QQVJNX0RFQ0lNQUwsIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwpKTsKKyAgICB9CisgICAgeworICAgICAgICBCQ01DTElfTUFLRV9DTUQoZGlyLCAiaWRfZ2V0X2ZlYXR1cmUiLCAiZ2V0IGZlYXR1cmUiLCBiY21fZGV2X2xvZ19jbGlfZ2V0X2ZlYXR1cmVzLAorICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJpbmRleCIsICJpbmRleCIsIEJDTUNMSV9QQVJNX1VERUNJTUFMLCAwKSk7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIGRpcjsKK30KKworI2VuZGlmIC8qICNpZm5kZWYgX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2cvYmNtX2Rldl9sb2dfY2xpLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZy9iY21fZGV2X2xvZ19jbGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTA5MGI0Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2cvYmNtX2Rldl9sb2dfY2xpLmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBCQ01fREVWX0xPR19DTElfSF8KKyNkZWZpbmUgQkNNX0RFVl9MT0dfQ0xJX0hfCisKKyNpbmNsdWRlIDxiY21jbGkuaD4KKyNpbmNsdWRlIDxiY21jbGlfc2Vzc2lvbi5oPgorI2luY2x1ZGUgImJjbV9kZXZfbG9nX3Rhc2suaCIKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbjsKKyAgICBkZXZfbG9nX2lkIGxvZ19pZDsKKyAgICBiY21fZGV2X2xvZ19sZXZlbCBsb2dfbGV2ZWw7CisgICAgY2hhciBzdHJbTUFYX0RFVl9MT0dfU1RSSU5HX05FVF9TSVpFXTsKKyAgICB1aW50MzJfdCBmcmVlX2xlbjsKK30gYmNtX2Rldl9sb2dfY2xpX3Nlc3Npb247CisKKy8qIGNyZWF0ZSBhIENMSSBzZXNzaW9uIGFkYXB0YXRpb24gbGF5ZXIgdGhhdCBvdXRwdXRzIHRvIGEgZGV2IGxvZyBpbnN0ZWFkIG9mIHRvIGEgQ0xJIHNoZWxsICovCitiY21vc19lcnJubyBiY21fZGV2X2xvZ19jbGlfc2Vzc2lvbl9jcmVhdGUoCisgICAgZGV2X2xvZ19pZCBsb2dfaWQsCisgICAgYmNtX2Rldl9sb2dfbGV2ZWwgbG9nX2xldmVsLAorICAgIGJjbV9kZXZfbG9nX2NsaV9zZXNzaW9uICoqc2Vzc2lvbik7CisKKy8qIGluaXRpYWxpemUgdGhlIGRldiBsb2cgQ0xJIGZ1bmN0aW9ucyAqLworYmNtY2xpX2VudHJ5ICpiY21fZGV2X2xvZ19jbGlfaW5pdChiY21jbGlfZW50cnkgKnJvb3RfZGlyKTsKKworI2VuZGlmIC8qIEJDTV9ERVZfTE9HX0NMSV9IXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2cvYmNtX2Rldl9sb2dfdGFzay5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2cvYmNtX2Rldl9sb2dfdGFzay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NjU1ODgKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZy9iY21fZGV2X2xvZ190YXNrLmMKQEAgLTAsMCArMSwxNzUyIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaWZkZWYgRU5BQkxFX0xPRworCisjaW5jbHVkZSAiYmNtX2Rldl9sb2dfdGFzay5oIgorI2luY2x1ZGUgImJjbV9kZXZfbG9nX3Rhc2tfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJiY21fZGV2X2xvZy5oIgorI2lmIGRlZmluZWQoTElOVVhfS0VSTkVMX1NQQUNFKSAmJiAhZGVmaW5lZChfX0tFUk5FTF9fKQorI2luY2x1ZGUgImJjbW9sdF9kZXZfbG9nX2xpbnV4LmgiCisjZW5kaWYKKworI2lmZGVmIERFVl9MT0dfU1lTTE9HCisjaW5jbHVkZSA8c3lzbG9nLmg+CisjZW5kaWYKKworI2RlZmluZSBVU0VfQU5TSV9FU0NBUEVfQ09ERVMKKworI2lmZGVmIFVTRV9BTlNJX0VTQ0FQRV9DT0RFUworI2RlZmluZSBERVZfTE9HX1NUWUxFX05PUk1BTCAgICAgICAgIlwwMzNbMG1cMDMzIzUiCisjZGVmaW5lIERFVl9MT0dfU1RZTEVfQk9MRCAgICAgICAgICAiXDAzM1sxbSIKKyNkZWZpbmUgREVWX0xPR19TVFlMRV9VTkRFUkxJTkUgICAgICJcMDMzWzRtIgorI2RlZmluZSBERVZfTE9HX1NUWUxFX0JMSU5LICAgICAgICAgIlwwMzNbNW0iCisjZGVmaW5lIERFVl9MT0dfU1RZTEVfUkVWRVJTRV9WSURFTyAiXDAzM1s3bSIKKyNlbHNlCisjZGVmaW5lIERFVl9MT0dfU1RZTEVfTk9STUFMICAgICAgICAiICAgICIKKyNkZWZpbmUgREVWX0xPR19TVFlMRV9CT0xEICAgICAgICAgICIqKiogIgorI2RlZmluZSBERVZfTE9HX1NUWUxFX1VOREVSTElORSAgICAgIl9fXyAiCisjZGVmaW5lIERFVl9MT0dfU1RZTEVfQkxJTksgICAgICAgICAib19vICIKKyNkZWZpbmUgREVWX0xPR19TVFlMRV9SRVZFUlNFX1ZJREVPICIhISEgIgorI2VuZGlmCisKKyNkZWZpbmUgREVWX0xPR19NU0dfU1RBUlRfQ0hBUiAgICAgIDB4MWUgICAgICAgIC8qIHJlY29yZCBzZXBhcmF0b3IgY2hhcmFjdGVyICovCisKKyNkZWZpbmUgTUVNX0ZJTEVfSERSX1NJWkUgICAgICAgc2l6ZW9mKGRldl9sb2dfbWVtX2ZpbGVfaGVhZGVyKQorCisjZGVmaW5lIExPR19NSU4oYSxiKSAgICAgICAgKCgoaW50KShhKSA8PSAoaW50KShiKSkgPyAoYSkgOiAoYikpCisKK2Rldl9sb2dfaWQgZGVmX2xvZ19pZDsKKworc3RhdGljIGJjbV9kZXZfbG9nX3N0eWxlIGRldl9sb2dfbGV2ZWwyc3R5bGVbREVWX0xPR19MRVZFTF9OVU1fT0ZdID0KK3sKKyAgICBbREVWX0xPR19MRVZFTF9GQVRBTF0gPSBCQ01fREVWX0xPR19TVFlMRV9OT1JNQUwsCisgICAgW0RFVl9MT0dfTEVWRUxfRVJST1JdID0gQkNNX0RFVl9MT0dfU1RZTEVfTk9STUFMLAorICAgIFtERVZfTE9HX0xFVkVMX1dBUk5JTkddID0gQkNNX0RFVl9MT0dfU1RZTEVfTk9STUFMLAorICAgIFtERVZfTE9HX0xFVkVMX0lORk9dID0gQkNNX0RFVl9MT0dfU1RZTEVfTk9STUFMLAorICAgIFtERVZfTE9HX0xFVkVMX0RFQlVHXSA9IEJDTV9ERVZfTE9HX1NUWUxFX05PUk1BTCwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpkZXZfbG9nX3N0eWxlX2FycmF5W10gPQoreworICAgIFtCQ01fREVWX0xPR19TVFlMRV9OT1JNQUxdID0gREVWX0xPR19TVFlMRV9OT1JNQUwsCisgICAgW0JDTV9ERVZfTE9HX1NUWUxFX0JPTERdID0gREVWX0xPR19TVFlMRV9CT0xELAorICAgIFtCQ01fREVWX0xPR19TVFlMRV9VTkRFUkxJTkVdID0gREVWX0xPR19TVFlMRV9VTkRFUkxJTkUsCisgICAgW0JDTV9ERVZfTE9HX1NUWUxFX0JMSU5LXSA9IERFVl9MT0dfU1RZTEVfQkxJTkssCisgICAgW0JDTV9ERVZfTE9HX1NUWUxFX1JFVkVSU0VfVklERU9dID0gREVWX0xPR19TVFlMRV9SRVZFUlNFX1ZJREVPLAorfTsKKworYmNtX2Rldl9sb2cgZGV2X2xvZyA9IHt7MH19OworY29uc3QgY2hhciAqbG9nX2xldmVsX3N0ciA9ICI/RkVXSUQiOworCitzdGF0aWMgdm9pZCBiY21fZGV2X2xvZ19zaHV0ZG93bl9tc2dfcmVsZWFzZShiY21vc19tc2cgKm0pCit7CisgICAgKHZvaWQpbTsgLyogZG8gbm90aGluZywgdGhlIG1lc3NhZ2UgaXMgc3RhdGljYWxseSBhbGxvY2F0ZWQgKi8KK30KKworc3RhdGljIGJjbW9zX21zZyBzaHV0ZG93bl9tc2cgPSB7IC5yZWxlYXNlID0gYmNtX2Rldl9sb2dfc2h1dGRvd25fbXNnX3JlbGVhc2UgfTsKKworc3RhdGljIHZvaWQgYmNtX2Rldl9sb2dfZmlsZV9zYXZlX21zZyhiY21fZGV2X2xvZ19maWxlICpmaWxlcywgY29uc3QgY2hhciAqbWVzc2FnZSkKK3sKKyAgICB1aW50MzJfdCBpOworICAgIHVpbnQzMl90IGxlbiA9IHN0cmxlbihtZXNzYWdlKSArIDE7IC8qIGluY2x1ZGluZyAwIHRlcm1pbmF0b3IgKi8KKworICAgIGZvciAoaSA9IDA7IChpIDwgREVWX0xPR19NQVhfRklMRVMpICYmIChmaWxlc1tpXS5maWxlX3Bhcm0uZmxhZ3MgJiBCQ01fREVWX0xPR19GSUxFX0ZMQUdfVkFMSUQpOyBpKyspCisgICAgeworICAgICAgICBmaWxlc1tpXS5maWxlX3Bhcm0ud3JpdGVfY2IoJmZpbGVzW2ldLCBtZXNzYWdlLCBsZW4pOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZGV2X2xvZ19zYXZlX3Rhc2tfaGFuZGxlX21lc3NhZ2UoYmNtb3NfbXNnICptc2cpCit7CisgICAgc3RhdGljIGNoYXIgbG9nX3N0cmluZ1tNQVhfREVWX0xPR19TVFJJTkdfU0laRV07CisgICAgdWludDMyX3QgbGVuZ3RoOworICAgIGNoYXIgdGltZV9zdHJbMTddOworICAgIGRldl9sb2dfcXVldWVfbXNnICpyZWNlaXZlX21zZyA9IG1zZy0+ZGF0YTsKKyAgICBkZXZfbG9nX2lkX3Bhcm0gKmxvZ19pZCA9IHJlY2VpdmVfbXNnLT5sb2dfaWQ7CisgICAgYmNtX2Rldl9sb2dfbGV2ZWwgbXNnX2xldmVsID0gcmVjZWl2ZV9tc2ctPm1zZ19sZXZlbDsKKworICAgIC8qIEJ1aWxkIG1lc3NhZ2UgaGVhZGVyICovCisgICAgKmxvZ19zdHJpbmcgPSAnXDAnOworICAgIGlmICghKHJlY2VpdmVfbXNnLT5mbGFncyAmIEJDTV9MT0dfRkxBR19OT19IRUFERVIpKQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gc2l6ZW9mKHRpbWVfc3RyKTsKKyAgICAgICAgZGV2X2xvZy5kZXZfbG9nX3Bhcm0udGltZV90b19zdHJfY2IocmVjZWl2ZV9tc2ctPnRpbWVfc3RhbXAsIHRpbWVfc3RyLCBsZW5ndGgpOworICAgICAgICBzbnByaW50ZigKKyAgICAgICAgICAgIGxvZ19zdHJpbmcsCisgICAgICAgICAgICBzaXplb2YobG9nX3N0cmluZyksCisgICAgICAgICAgICAiWyVzOiAlYyAlLTIwc10gIiwKKyAgICAgICAgICAgIHRpbWVfc3RyLAorICAgICAgICAgICAgbG9nX2xldmVsX3N0clttc2dfbGV2ZWxdLAorICAgICAgICAgICAgbG9nX2lkLT5uYW1lKTsKKyAgICB9CisKKyAgICAvKiBNb2RpZnkgdGhlIF9fRklMRV9fIGZvcm1hdCBzbyBpdCB3b3VsZCBwcmludCB0aGUgZmlsZW5hbWUgb25seSB3aXRob3V0IHRoZSBwYXRoLgorICAgICAqIElmIHVzaW5nIEJDTV9MT0dfRkxBR19DQUxMRVJfRk1ULCBpdCBpcyBkb25lIGluIGNhbGxlciBjb250ZXh0LCBiZWNhdXNlIGZpbGVuYW1lIG1pZ2h0IGJlIGxvbmcsIHRha2luZyBhIGxvdCBvZgorICAgICAqIHRoZSBzcGFjZSBvZiB0aGUgbWVzc2FnZSBpdHNlbGYuICovCisgICAgaWYgKChyZWNlaXZlX21zZy0+ZmxhZ3MgJiBCQ01fTE9HX0ZMQUdfRklMRU5BTUVfSU5fRk1UKSAmJiAhKHJlY2VpdmVfbXNnLT5mbGFncyAmIEJDTV9MT0dfRkxBR19DQUxMRVJfRk1UKSkKKyAgICAgICAgcmVjZWl2ZV9tc2ctPnUuZm10X2FyZ3MuZm10ID0gZGV2X2xvZ19iYXNlbmFtZShyZWNlaXZlX21zZy0+dS5mbXRfYXJncy5mbXQpOworCisgICAgaWYgKHJlY2VpdmVfbXNnLT5mbGFncyAmIEJDTV9MT0dfRkxBR19DQUxMRVJfRk1UKQorICAgIHsKKyAgICAgICAgLyogQ29weSB1c2VyIHN0cmluZyB0byBidWZmZXIgKi8KKyAgICAgICAgc3RybmNhdChsb2dfc3RyaW5nLCByZWNlaXZlX21zZy0+dS5zdHIsIHNpemVvZihsb2dfc3RyaW5nKSAtIHN0cmxlbihsb2dfc3RyaW5nKSAtIDEpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB1aW50MzJfdCBvZmZzZXQgPSAoKGxvbmcpcmVjZWl2ZV9tc2ctPnUuZm10X2FyZ3MuYXJncyAlIDggPT0gMCkgPyAwIDogMTsgLyogc3RhcnQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5ICovCisgICAgICAgIHZhX2xpc3QgYXA7CisgICAgICAgICoodm9pZCAqKikmYXAgPSAmcmVjZWl2ZV9tc2ctPnUuZm10X2FyZ3MuYXJnc1tvZmZzZXRdOworCisgICAgICAgIC8qIENvcHkgdXNlciBzdHJpbmcgdG8gYnVmZmVyICovCisgICAgICAgIHZzbnByaW50Zihsb2dfc3RyaW5nICsgc3RybGVuKGxvZ19zdHJpbmcpLAorICAgICAgICAgICAgc2l6ZW9mKGxvZ19zdHJpbmcpIC0gc3RybGVuKGxvZ19zdHJpbmcpLAorICAgICAgICAgICAgcmVjZWl2ZV9tc2ctPnUuZm10X2FyZ3MuZm10LAorICAgICAgICAgICAgYXApOworICAgIH0KKworICAgIC8qIEZvcmNlIGxhc3QgY2hhciB0byBiZSBlbmQgb2Ygc3RyaW5nICovCisgICAgbG9nX3N0cmluZ1tNQVhfREVWX0xPR19TVFJJTkdfU0laRSAtIDFdID0gJ1wwJzsKKworICAgIC8qIEF0IHRoaXMgcG9pbnQsIGlmIHRoZSBtZXNzYWdlIGlzIGdvaW5nIHRvIGJlIHNlbnQgdG8gdGhlIHByaW50IHRhc2ssIHNhdmUgdGhlIGZvcm1hdHRlZCBzdHJpbmcgdGhlbiBmb3J3YXJkIGl0LgorICAgICAqIE90aGVyd2lzZSwgd2UgY2FuIHJlbGVhc2UgdGhlIG1lc3NhZ2UgYmVmb3JlIHdyaXRpbmcgaXQgdG8gUkFNLiAqLworICAgIGlmICgobG9nX2lkLT5sb2dfdHlwZSAmIERFVl9MT0dfSURfVFlQRV9QUklOVCkgJiYKKyAgICAgICAgKG1zZ19sZXZlbCA8PSBsb2dfaWQtPmxvZ19sZXZlbF9wcmludCkpCisgICAgeworICAgICAgICBpZiAoIWJjbV9kZXZfbG9nX2xldmVsX2lzX2Vycm9yKG1zZ19sZXZlbCkgJiYKKyAgICAgICAgICAgIChyZWNlaXZlX21zZy0+ZmxhZ3MgJiBCQ01fTE9HX0ZMQUdfRE9OVF9TS0lQX1BSSU5UKSAhPSAwICYmCisgICAgICAgICAgICBiY21fZGV2X2xvZ19wb29sX29jY3VwYW5jeV9wZXJjZW50X2dldCgpID49IERFVl9MT0dfU0tJUF9QUklOVF9USFJFU0hPTERfUEVSQ0VOVCkKKyAgICAgICAgeworICAgICAgICAgICAgbG9nX2lkLT5wcmludF9za2lwcGVkX2NvdW50Kys7CisgICAgICAgICAgICBiY21vc19tc2dfZnJlZShtc2cpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc3RyY3B5KHJlY2VpdmVfbXNnLT51LnN0ciwgbG9nX3N0cmluZyk7IC8qIHNvIHRoZSBwcmludCB0YXNrIGRvZXNuJ3QgbmVlZCB0byByZS1mb3JtYXQgaXQgKi8KKyAgICAgICAgICAgIGJjbW9zX21zZ19zZW5kKCZkZXZfbG9nLnByaW50X3F1ZXVlLCBtc2csIDApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbW9zX21zZ19mcmVlKG1zZyk7CisgICAgfQorCisgICAgLyogU2F2ZSB0byBmaWxlICovCisgICAgaWYgKChsb2dfaWQtPmxvZ190eXBlICYgREVWX0xPR19JRF9UWVBFX1NBVkUpICYmCisgICAgICAgIChtc2dfbGV2ZWwgPD0gbG9nX2lkLT5sb2dfbGV2ZWxfc2F2ZSkpCisgICAgeworICAgICAgICBiY21fZGV2X2xvZ19maWxlX3NhdmVfbXNnKGRldl9sb2cuZmlsZXMsIGxvZ19zdHJpbmcpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZGV2X2xvZ19wcmludF90YXNrX2hhbmRsZV9tZXNzYWdlKGJjbW9zX21zZyAqbXNnKQoreworICAgIHN0YXRpYyBjaGFyIGxvZ19zdHJpbmdbTUFYX0RFVl9MT0dfU1RSSU5HX1NJWkVdOworICAgIGRldl9sb2dfcXVldWVfbXNnICpyZWNlaXZlX21zZyA9IG1zZy0+ZGF0YTsKKyAgICBkZXZfbG9nX2lkX3Bhcm0gKmxvZ19pZCA9IHJlY2VpdmVfbXNnLT5sb2dfaWQ7CisgICAgYmNtX2Rldl9sb2dfbGV2ZWwgbXNnX2xldmVsID0gcmVjZWl2ZV9tc2ctPm1zZ19sZXZlbDsKKworICAgIC8qIG1ha2UgYSBsb2NhbCBjb3B5IG9mIHRoZSBwcmUtZm9ybWF0dGVkIHN0cmluZyAoaXQgd2FzIGZvcm1hdHRlZCBpbiB0aGUgc2F2ZSB0YXNrKSAqLworICAgIHN0cmNweShsb2dfc3RyaW5nLCByZWNlaXZlX21zZy0+dS5zdHIpOworCisgICAgLyogZnJlZSB0aGUgbWVzc2FnZSBBU0FQIHNpbmNlIHByaW50aW5nIG1pZ2h0IHRha2Ugc29tZSB0aW1lICovCisgICAgYmNtb3NfbXNnX2ZyZWUobXNnKTsKKworICAgIGlmIChsb2dfaWQtPnN0eWxlID09IEJDTV9ERVZfTE9HX1NUWUxFX05PUk1BTCAmJgorICAgICAgICBkZXZfbG9nX2xldmVsMnN0eWxlW21zZ19sZXZlbF0gPT0gQkNNX0RFVl9MT0dfU1RZTEVfTk9STUFMKQorICAgIHsKKyAgICAgICAgZGV2X2xvZy5kZXZfbG9nX3Bhcm0ucHJpbnRfY2IoZGV2X2xvZy5kZXZfbG9nX3Bhcm0ucHJpbnRfY2JfYXJnLCAiJXMiLCBsb2dfc3RyaW5nKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogSWYgc3R5bGUgd2FzIHNldCBwZXIgbG9nIGlkLCB0aGVuIHVzZSBpdC4gKi8KKyAgICAgICAgaWYgKGxvZ19pZC0+c3R5bGUgIT0gQkNNX0RFVl9MT0dfU1RZTEVfTk9STUFMKQorICAgICAgICB7CisgICAgICAgICAgICBkZXZfbG9nLmRldl9sb2dfcGFybS5wcmludF9jYigKKyAgICAgICAgICAgICAgICBkZXZfbG9nLmRldl9sb2dfcGFybS5wcmludF9jYl9hcmcsCisgICAgICAgICAgICAgICAgIiVzJXMlcyIsCisgICAgICAgICAgICAgICAgZGV2X2xvZ19zdHlsZV9hcnJheVtsb2dfaWQtPnN0eWxlXSwKKyAgICAgICAgICAgICAgICBsb2dfc3RyaW5nLAorICAgICAgICAgICAgICAgIGRldl9sb2dfc3R5bGVfYXJyYXlbQkNNX0RFVl9MT0dfU1RZTEVfTk9STUFMXSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBPdGhlcndpc2UgLSBzdHlsZSB3YXMgc2V0IHBlciBsb2cgbGV2ZWwuICovCisgICAgICAgICAgICBkZXZfbG9nLmRldl9sb2dfcGFybS5wcmludF9jYigKKyAgICAgICAgICAgICAgICBkZXZfbG9nLmRldl9sb2dfcGFybS5wcmludF9jYl9hcmcsCisgICAgICAgICAgICAgICAgIiVzJXMlcyIsCisgICAgICAgICAgICAgICAgZGV2X2xvZ19zdHlsZV9hcnJheVtkZXZfbG9nX2xldmVsMnN0eWxlW21zZ19sZXZlbF1dLAorICAgICAgICAgICAgICAgIGxvZ19zdHJpbmcsCisgICAgICAgICAgICAgICAgZGV2X2xvZ19zdHlsZV9hcnJheVtCQ01fREVWX0xPR19TVFlMRV9OT1JNQUxdKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGludCBkZXZfbG9nX3ByaW50X3Rhc2sobG9uZyBkYXRhKQoreworICAgIGJjbW9zX21zZyAqbTsKKyAgICBiY21vc19lcnJubyBlcnJvcjsKKyAgICBjb25zdCBjaGFyIGVycm9yX3N0cltNQVhfREVWX0xPR19TVFJJTkdfU0laRV0gPSAiRXJyb3I6IENhbid0IHJlY2VpdmUgZnJvbSBxdWV1ZSAtIGRldl9sb2cgcHJpbnQgdGFzayBleGl0XG4iOworCisgICAgd2hpbGUgKDEpCisgICAgeworICAgICAgICBlcnJvciA9IGJjbW9zX21zZ19yZWN2KCZkZXZfbG9nLnByaW50X3F1ZXVlLCBCQ01PU19XQUlUX0ZPUkVWRVIsICZtKTsKKyAgICAgICAgaWYgKGVycm9yICE9IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIERFVl9MT0dfRVJST1JfUFJJTlRGKCIlcyIsIGVycm9yX3N0cik7CisgICAgICAgICAgICBkZXZfbG9nLmRldl9sb2dfcGFybS5wcmludF9jYihkZXZfbG9nLmRldl9sb2dfcGFybS5wcmludF9jYl9hcmcsICIlcyIsIGVycm9yX3N0cik7CisgICAgICAgICAgICBiY21fZGV2X2xvZ19maWxlX3NhdmVfbXNnKGRldl9sb2cuZmlsZXMsIGVycm9yX3N0cik7CisgICAgICAgICAgICByZXR1cm4gKGludCllcnJvcjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtID09ICZzaHV0ZG93bl9tc2cpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX21zZ19mcmVlKG0pOworICAgICAgICAgICAgYnJlYWs7IC8qIHNodXQgZG93biBncmFjZWZ1bGx5ICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBkZXZfbG9nX3ByaW50X3Rhc2tfaGFuZGxlX21lc3NhZ2UobSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBiY21vc19zZW1fcG9zdCgmZGV2X2xvZy5wcmludF90YXNrX2lzX3Rlcm1pbmF0ZWQpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGV2X2xvZ19zYXZlX3Rhc2sobG9uZyBkYXRhKQoreworICAgIGJjbW9zX21zZyAqbTsKKyAgICBiY21vc19lcnJubyBlcnJvcjsKKyAgICBjb25zdCBjaGFyIGVycm9yX3N0cltNQVhfREVWX0xPR19TVFJJTkdfU0laRV0gPSAiRXJyb3I6IENhbid0IHJlY2VpdmUgZnJvbSBxdWV1ZSAtIGRldl9sb2cgc2F2ZSB0YXNrIGV4aXRcbiI7CisKKyAgICB3aGlsZSAoMSkKKyAgICB7CisgICAgICAgIGVycm9yID0gYmNtb3NfbXNnX3JlY3YoJmRldl9sb2cuc2F2ZV9xdWV1ZSwgQkNNT1NfV0FJVF9GT1JFVkVSLCAmbSk7CisgICAgICAgIGlmIChlcnJvciAhPSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICBERVZfTE9HX0VSUk9SX1BSSU5URigiJXMiLCBlcnJvcl9zdHIpOworICAgICAgICAgICAgZGV2X2xvZy5kZXZfbG9nX3Bhcm0ucHJpbnRfY2IoZGV2X2xvZy5kZXZfbG9nX3Bhcm0ucHJpbnRfY2JfYXJnLCAiJXMiLCBlcnJvcl9zdHIpOworICAgICAgICAgICAgYmNtX2Rldl9sb2dfZmlsZV9zYXZlX21zZyhkZXZfbG9nLmZpbGVzLCBlcnJvcl9zdHIpOworICAgICAgICAgICAgcmV0dXJuIChpbnQpZXJyb3I7CisgICAgICAgIH0KKworICAgICAgICBpZiAobSA9PSAmc2h1dGRvd25fbXNnKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19tc2dfZnJlZShtKTsKKyAgICAgICAgICAgIGJyZWFrOyAvKiBzaHV0IGRvd24gZ3JhY2VmdWxseSAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZGV2X2xvZ19zYXZlX3Rhc2tfaGFuZGxlX21lc3NhZ2UobSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBiY21vc19zZW1fcG9zdCgmZGV2X2xvZy5zYXZlX3Rhc2tfaXNfdGVybWluYXRlZCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWZhdWx0X3RpbWVfdG9fc3RyKHVpbnQzMl90IHRpbWVfc3RhbXAsIGNoYXIgKnRpbWVfc3RyLCBpbnQgdGltZV9zdHJfc2l6ZSkKK3sKKyAgICByZXR1cm4gc25wcmludGYodGltZV9zdHIsIHRpbWVfc3RyX3NpemUsICIldSIsIHRpbWVfc3RhbXApOworfQorCitzdGF0aWMgdWludDMyX3QgZGVmYXVsdF9nZXRfdGltZSh2b2lkKQoreworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlZmF1bHRfcHJpbnQodm9pZCAqYXJnLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKyAgICB2YV9saXN0IGFyZ3M7CisKKyAgICB2YV9zdGFydChhcmdzLCBmb3JtYXQpOworICAgIGJjbW9zX3ZwcmludGYoZm9ybWF0LCBhcmdzKTsKKyAgICB2YV9lbmQoYXJncyk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBkZWZhdWx0X29wZW5fY2FsbGJhY2tfY29uZF9yZXNldChjb25zdCBiY21fZGV2X2xvZ19maWxlX3Bhcm0gKmZpbGVfcGFybSwgYmNtX2Rldl9sb2dfZmlsZSAqZmlsZSwgYmNtb3NfYm9vbCBpc19yZXdpbmQpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgaWYgKCFmaWxlLT5maWxlX3Bhcm0uc3RhcnRfYWRkciB8fCBmaWxlLT5maWxlX3Bhcm0uc2l6ZSA8PSBNRU1fRklMRV9IRFJfU0laRSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKworICAgIC8qIENyZWF0ZSBmaWxlIG11dGV4ICovCisgICAgZXJyID0gYmNtb3NfbXV0ZXhfY3JlYXRlKCZmaWxlLT51Lm1lbV9maWxlLm11dGV4LCAwLCBOVUxMKTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBERVZfTE9HX0VSUk9SX1BSSU5URigiRXJyb3I6IENhbid0IGNyZWF0ZSBtdXRleCAoZXJyb3I6ICVkKVxuIiwgKGludCllcnIpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIC8qIENoZWNrIGZpbGUgbWFnaWMgc3RyaW5nICovCisgICAgbWVtY3B5KCZmaWxlLT51Lm1lbV9maWxlLmZpbGVfaGVhZGVyLCAodWludDhfdCAqKWZpbGUtPmZpbGVfcGFybS5zdGFydF9hZGRyLCBNRU1fRklMRV9IRFJfU0laRSk7CisgICAgaWYgKG1lbWNtcChGSUxFX01BR0lDX1NUUiwgZmlsZS0+dS5tZW1fZmlsZS5maWxlX2hlYWRlci5maWxlX21hZ2ljLCBGSUxFX01BR0lDX1NUUl9TSVpFKSkKKyAgICB7CisgICAgICAgIERFVl9MT0dfSU5GT19QUklOVEYoIk5vIGZpbGUgbWFnaWMgc3RyaW5nIC0gZmlsZSBpcyBlbXB0eS9jb3JydXB0XG4iKTsKKyAgICAgICAgaWYgKCFpc19yZXdpbmQgfHwgIWZpbGUtPmZpbGVfcGFybS5yZXdpbmRfY2IpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX211dGV4X2Rlc3Ryb3koJmZpbGUtPnUubWVtX2ZpbGUubXV0ZXgpOworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9FTlQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZpbGUtPmZpbGVfcGFybS5yZXdpbmRfY2IoZmlsZSk7CisgICAgfQorCisgICAgREVWX0xPR19JTkZPX1BSSU5URigiQXR0YWNoZWQgdG8gZXhpc3RpbmcgZmlsZVxuIik7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGRlZmF1bHRfb3Blbl9jYWxsYmFjayhjb25zdCBiY21fZGV2X2xvZ19maWxlX3Bhcm0gKmZpbGVfcGFybSwgYmNtX2Rldl9sb2dfZmlsZSAqZmlsZSkKK3sKKyAgICByZXR1cm4gZGVmYXVsdF9vcGVuX2NhbGxiYWNrX2NvbmRfcmVzZXQoZmlsZV9wYXJtLCBmaWxlLCBCQ01PU19UUlVFKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGRlZmF1bHRfY2xvc2VfY2FsbGJhY2soYmNtX2Rldl9sb2dfZmlsZSAqZmlsZSkKK3sKKyAgICBiY21vc19tdXRleF9kZXN0cm95KCZmaWxlLT51Lm1lbV9maWxlLm11dGV4KTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogTG9vayBmb3Igc3RhcnQgb2YgbXNnIGNoYXJhY3RlciAqLworc3RhdGljIGludCBnZXRfbXNnX3N0YXJ0X29mZnNldChiY21fZGV2X2xvZ19maWxlICpmaWxlLCB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IG1heF9sZW4pCit7CisgICAgdWludDhfdCAqYnVmLCAqbXNnOworCisgICAgYnVmID0gKHVpbnQ4X3QgKilmaWxlLT5maWxlX3Bhcm0uc3RhcnRfYWRkciArIG9mZnNldCArIE1FTV9GSUxFX0hEUl9TSVpFOworICAgIG1zZyA9IG1lbWNocihidWYsIERFVl9MT0dfTVNHX1NUQVJUX0NIQVIsIG1heF9sZW4pOworICAgIGlmICghbXNnKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIChtc2cgLSBidWYgKyAxKTsKK30KKworLyogTG9vayBmb3IgMC10ZXJtaW5hdG9yICovCitzdGF0aWMgaW50IGdldF9tc2dfZW5kX29mZnNldChiY21fZGV2X2xvZ19maWxlICpmaWxlLCB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IG1heF9sZW4pCit7CisgICAgdWludDhfdCAqYnVmLCAqZW5kOworCisgICAgYnVmID0gKHVpbnQ4X3QgKilmaWxlLT5maWxlX3Bhcm0uc3RhcnRfYWRkciArIG9mZnNldCArIE1FTV9GSUxFX0hEUl9TSVpFOworICAgIGVuZCA9IG1lbWNocihidWYsIDAsIG1heF9sZW4pOworICAgIGlmICghZW5kKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIChlbmQgLSBidWYgKyAxKTsKK30KKworc3RhdGljIGludCBkZWZhdWx0X3JlYWRfY2FsbGJhY2soYmNtX2Rldl9sb2dfZmlsZSAqbG9nX2ZpbGUsIHVpbnQzMl90ICpwX29mZnNldCwgdm9pZCAqYnVmLCB1aW50MzJfdCBsZW5ndGgpCit7CisgICAgdWludDMyX3Qgb2Zmc2V0ID0gKnBfb2Zmc2V0OworICAgIHVpbnQzMl90IHJlYWxfbGVuZ3RoID0gMDsKKyAgICBpbnQgc3RhcnQsIGVuZDsKKworICAgIC8qIElmIGZpbGUgd3JhcHBlZCBhcm91bmQsIG9mZnNldCBzdGFydHMgZnJvbSB3cml0ZV9vZmZzZXQsIG90aGVyd2lzZSwKKyAgICAgKiBpdCBzdGFydHMgZnJvbSB0aGUgYmVnaW5uaW5nCisgICAgICovCisgICAgaWYgKGxvZ19maWxlLT51Lm1lbV9maWxlLmZpbGVfaGVhZGVyLmZpbGVfd3JhcF9jbnQpCisgICAgeworICAgICAgICBpZiAob2Zmc2V0ICsgbGVuZ3RoID49IGxvZ19maWxlLT51Lm1lbV9maWxlLmZpbGVfaGVhZGVyLmRhdGFfc2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgbGVuZ3RoID0gbG9nX2ZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIuZGF0YV9zaXplIC0gb2Zmc2V0OworICAgICAgICAgICAgaWYgKGxlbmd0aCA8PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIG9mZnNldCArPSBsb2dfZmlsZS0+dS5tZW1fZmlsZS5maWxlX2hlYWRlci53cml0ZV9vZmZzZXQ7CisgICAgICAgIGlmIChvZmZzZXQgPj0gbG9nX2ZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIuZGF0YV9zaXplKQorICAgICAgICAgICAgb2Zmc2V0IC09IGxvZ19maWxlLT51Lm1lbV9maWxlLmZpbGVfaGVhZGVyLmRhdGFfc2l6ZTsKKyAgICAgICAgLyogRmluZCBiZWdpbm5pbmcgb2YgdGhlIG5leHQgbWVzc2FnZSAqLworICAgICAgICBzdGFydCA9IGdldF9tc2dfc3RhcnRfb2Zmc2V0KGxvZ19maWxlLCBvZmZzZXQsIExPR19NSU4obG9nX2ZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIuZGF0YV9zaXplIC0gb2Zmc2V0LAorICAgICAgICAgICAgTUFYX0RFVl9MT0dfU1RSSU5HX1NJWkUpKTsKKyAgICAgICAgaWYgKHN0YXJ0IDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogRGlkbid0IGZpbmQgYW55IHVwIHRvIHRoZSBlbmQgb2YgYnVmZmVyLiBMb29rIGZyb20gdGhlIHN0YXJ0ICovCisgICAgICAgICAgICBvZmZzZXQgPSAwOworICAgICAgICAgICAgaWYgKCFsb2dfZmlsZS0+dS5tZW1fZmlsZS5maWxlX2hlYWRlci53cml0ZV9vZmZzZXQpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBzdGFydCA9IGdldF9tc2dfc3RhcnRfb2Zmc2V0KGxvZ19maWxlLCAwLCBMT0dfTUlOKGxvZ19maWxlLT51Lm1lbV9maWxlLmZpbGVfaGVhZGVyLndyaXRlX29mZnNldCAtIDEsCisgICAgICAgICAgICAgICAgTUFYX0RFVl9MT0dfU1RSSU5HX1NJWkUpKTsKKyAgICAgICAgICAgIGlmIChzdGFydCA8PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIG9mZnNldCArPSBzdGFydDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogU3RhcnQgYmVnaW5uaW5nIG9mIG1lc3NhZ2UuIFdpdGhvdXQgd3JhcC1hcm91bmQgaXQgc2hvdWxkIGJlIHJpZ2h0IGF0IHRoZSBvZmZzZXQsCisgICAgICAgICAqIHNvLCBpdCBpcyBqdXN0IGEgcHJlY2F1dGlvbiAqLworICAgICAgICBzdGFydCA9IGdldF9tc2dfc3RhcnRfb2Zmc2V0KGxvZ19maWxlLCBvZmZzZXQsIExPR19NSU4obG9nX2ZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIuZGF0YV9zaXplIC0gb2Zmc2V0LAorICAgICAgICAgICAgTUFYX0RFVl9MT0dfU1RSSU5HX1NJWkUpKTsKKyAgICAgICAgaWYgKHN0YXJ0IDw9IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgb2Zmc2V0ICs9IHN0YXJ0OworICAgICAgICAvKiBTdG9wIHJlYWRpbmcgd2hlbiByZWFjaGVkIHdyaXRlX29mZnNldCAqLworICAgICAgICBpZiAob2Zmc2V0ICsgbGVuZ3RoID49IGxvZ19maWxlLT51Lm1lbV9maWxlLmZpbGVfaGVhZGVyLndyaXRlX29mZnNldCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBsb2dfZmlsZS0+dS5tZW1fZmlsZS5maWxlX2hlYWRlci53cml0ZV9vZmZzZXQpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBsZW5ndGggPSBsb2dfZmlsZS0+dS5tZW1fZmlsZS5maWxlX2hlYWRlci53cml0ZV9vZmZzZXQgLSBvZmZzZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBXZSBoYXZlIHRoZSBiZWdpbm5pbmcuIE5vdyBmaW5kIHRoZSBlbmQgb2YgbWVzc2FnZSBhbmQgY29weSB0byB0aGUgdXNlcgorICAgICAqIGJ1ZmZlciBpZiB0aGVyZSBpcyBlbm91Z2ggcm9vbSAqLworICAgIGlmIChvZmZzZXQgKyBsZW5ndGggPiBsb2dfZmlsZS0+dS5tZW1fZmlsZS5maWxlX2hlYWRlci5kYXRhX3NpemUpCisgICAgeworICAgICAgICB1aW50MzJfdCBsZW5ndGgxID0gb2Zmc2V0ICsgbGVuZ3RoIC0gbG9nX2ZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIuZGF0YV9zaXplOyAvKiB0YWlsIGxlbmd0aCAqLworICAgICAgICBsZW5ndGggLT0gbGVuZ3RoMTsKKyAgICAgICAgZW5kID0gZ2V0X21zZ19lbmRfb2Zmc2V0KGxvZ19maWxlLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgICAgIGlmIChlbmQgPj0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgbWVtY3B5KGJ1ZiwgKHVpbnQ4X3QgKilsb2dfZmlsZS0+ZmlsZV9wYXJtLnN0YXJ0X2FkZHIgKyBvZmZzZXQgKyBNRU1fRklMRV9IRFJfU0laRSwgZW5kKTsKKyAgICAgICAgICAgICpwX29mZnNldCArPSBlbmQgKyBzdGFydDsKKyAgICAgICAgICAgIHJldHVybiBlbmQ7CisgICAgICAgIH0KKworICAgICAgICAvKiBEaWRuJ3QgZmluZCBlbmQgb2YgbWVzc2FnZSBpbiB0aGUgZW5kIG9mIGZpbGUgZGF0YSBidWZmZXIuIHdyYXAgYXJvdW5kICovCisgICAgICAgIG1lbWNweShidWYsICh1aW50OF90ICopbG9nX2ZpbGUtPmZpbGVfcGFybS5zdGFydF9hZGRyICsgb2Zmc2V0ICsgTUVNX0ZJTEVfSERSX1NJWkUsIGxlbmd0aCk7CisgICAgICAgIHJlYWxfbGVuZ3RoID0gbGVuZ3RoOworICAgICAgICBidWYgPSAodWludDhfdCAqKWJ1ZiArIGxlbmd0aDsKKyAgICAgICAgbGVuZ3RoID0gbGVuZ3RoMTsKKyAgICAgICAgb2Zmc2V0ID0gMDsKKyAgICB9CisgICAgZW5kID0gZ2V0X21zZ19lbmRfb2Zmc2V0KGxvZ19maWxlLCBvZmZzZXQsIE1BWF9ERVZfTE9HX1NUUklOR19TSVpFKTsKKyAgICBpZiAoZW5kIDw9IDApCisgICAgeworICAgICAgICAvKiBzb21ldGhpbmcgaXMgd3JvbmcuIG1zZyBpcyBub3QgdGVybWluYXRlZCAqLworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgLyogSWYgdGhlcmUgaXMgbm8gcm9vbSBmb3IgdGhlIHdob2xlIG1lc3NhZ2UgLSByZXR1cm4gb3ZlcmZsb3cgKi8KKyAgICBpZiAoZW5kID4gbGVuZ3RoKQorICAgICAgICByZXR1cm4gKGludClCQ01fRVJSX09WRVJGTE9XOworCisgICAgbWVtY3B5KGJ1ZiwgKHVpbnQ4X3QgKilsb2dfZmlsZS0+ZmlsZV9wYXJtLnN0YXJ0X2FkZHIgKyBvZmZzZXQgKyBNRU1fRklMRV9IRFJfU0laRSwgZW5kKTsKKyAgICByZWFsX2xlbmd0aCArPSBlbmQ7CisKKyAgICAqcF9vZmZzZXQgKz0gcmVhbF9sZW5ndGggKyBzdGFydDsKKworICAgIHJldHVybiByZWFsX2xlbmd0aDsKK30KKworc3RhdGljIGludCBnZXRfbnVtX29mX292ZXJ3cml0dGVuX21lc3NhZ2VzKHVpbnQ4X3QgKmJ1ZiwgdWludDMyX3QgbGVuZ3RoKQoreworICAgIHVpbnQ4X3QgKnA7CisgICAgaW50IG4gPSAwOworCisgICAgZG8KKyAgICB7CisgICAgICAgIHAgPSBtZW1jaHIoYnVmLCBERVZfTE9HX01TR19TVEFSVF9DSEFSLCBsZW5ndGgpOworICAgICAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICsrbjsKKyAgICAgICAgbGVuZ3RoIC09IChwICsgMSAtIGJ1Zik7CisgICAgICAgIGJ1ZiA9IHAgKyAxOworICAgIH0gd2hpbGUobGVuZ3RoKTsKKworICAgIHJldHVybiBuOworfQorCitzdGF0aWMgaW50IGRlZmF1bHRfd3JpdGVfY2FsbGJhY2soYmNtX2Rldl9sb2dfZmlsZSAqZmlsZSwgY29uc3Qgdm9pZCAqYnVmLCB1aW50MzJfdCBsZW5ndGgpCit7CisgICAgdWludDMyX3Qgb2Zmc2V0LCBuZXh0X29mZnNldDsKKyAgICB1aW50OF90ICpwOworICAgIGludCBuX292ZXJ3cml0dGVuID0gMDsKKworICAgIGlmICgoZmlsZS0+ZmlsZV9wYXJtLmZsYWdzICYgQkNNX0RFVl9MT0dfRklMRV9GTEFHX1NUT1BfV0hFTl9GVUxMKSAmJiBmaWxlLT5pc19mdWxsKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmICghbGVuZ3RoKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGJjbW9zX211dGV4X2xvY2soJmZpbGUtPnUubWVtX2ZpbGUubXV0ZXgpOworCisgICAgb2Zmc2V0ID0gZmlsZS0+dS5tZW1fZmlsZS5maWxlX2hlYWRlci53cml0ZV9vZmZzZXQ7CisgICAgbmV4dF9vZmZzZXQgPSBvZmZzZXQgKyBsZW5ndGggKyAxOyAvKiAxIGV4dHJhIGNoYXJhY3RlciBmb3IgcmVjb3JkIGRlbGltaXRlciAqLworCisgICAgLyogSGFuZGxlIG92ZXJmbG93ICovCisgICAgaWYgKG5leHRfb2Zmc2V0ID49IGZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIuZGF0YV9zaXplKQorICAgIHsKKyAgICAgICAgdWludDMyX3QgdGFpbF9sZW5ndGg7CisKKyAgICAgICAgLyogU3BsaXQgYnVmZmVyIGluIDIgKi8KKyAgICAgICAgdGFpbF9sZW5ndGggPSBuZXh0X29mZnNldCAtIGZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIuZGF0YV9zaXplOyAgIC8qIDJuZCBzZWdtZW50IGxlbmd0aCAqLworCisgICAgICAgIGlmICgoZmlsZS0+ZmlsZV9wYXJtLmZsYWdzICYgQkNNX0RFVl9MT0dfRklMRV9GTEFHX1NUT1BfV0hFTl9GVUxMKSAmJiB0YWlsX2xlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgZmlsZS0+aXNfZnVsbCA9IEJDTU9TX1RSVUU7CisgICAgICAgICAgICBiY21vc19tdXRleF91bmxvY2soJmZpbGUtPnUubWVtX2ZpbGUubXV0ZXgpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBsZW5ndGggLT0gdGFpbF9sZW5ndGg7CisgICAgICAgIC8qICJpZiAobmV4dF9vZmZzZXQgPj0gZmlsZS0+dS5tZW1fZmlsZS5maWxlX2hlYWRlci5kYXRhX3NpemUpIiBjb25kaXRpb24KKyAgICAgICAgICogZ3VhcmFudGVlcyB0aGF0IHRoZXJlIGlzIHJvb20gZm9yIGF0IGxlYXN0IDEgY2hhcmFjdGVyIGluIHRoZSBlbmQgb2YgZmlsZSAqLworICAgICAgICBwID0gKHVpbnQ4X3QgKilmaWxlLT5maWxlX3Bhcm0uc3RhcnRfYWRkciArIG9mZnNldCArIE1FTV9GSUxFX0hEUl9TSVpFOworICAgICAgICBpZiAoZmlsZS0+dS5tZW1fZmlsZS5maWxlX2hlYWRlci5maWxlX3dyYXBfY250KQorICAgICAgICAgICAgbl9vdmVyd3JpdHRlbiArPSBnZXRfbnVtX29mX292ZXJ3cml0dGVuX21lc3NhZ2VzKHAsIGxlbmd0aCArIDEpOworICAgICAgICAqcCA9IERFVl9MT0dfTVNHX1NUQVJUX0NIQVI7CisgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1lbWNweShwICsgMSwgYnVmLCBsZW5ndGgpOworICAgICAgICAgICAgYnVmID0gKGNvbnN0IHVpbnQ4X3QgKilidWYgKyBsZW5ndGg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRhaWxfbGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICBwID0gKHVpbnQ4X3QgKilmaWxlLT5maWxlX3Bhcm0uc3RhcnRfYWRkciArIE1FTV9GSUxFX0hEUl9TSVpFOworICAgICAgICAgICAgaWYgKGZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIuZmlsZV93cmFwX2NudCkKKyAgICAgICAgICAgICAgICBuX292ZXJ3cml0dGVuICs9IGdldF9udW1fb2Zfb3ZlcndyaXR0ZW5fbWVzc2FnZXMocCwgdGFpbF9sZW5ndGgpOworICAgICAgICAgICAgbWVtY3B5KHAsIGJ1ZiwgdGFpbF9sZW5ndGgpOworICAgICAgICAgICAgKytmaWxlLT51Lm1lbV9maWxlLmZpbGVfaGVhZGVyLmZpbGVfd3JhcF9jbnQ7CisgICAgICAgIH0KKyAgICAgICAgbmV4dF9vZmZzZXQgPSB0YWlsX2xlbmd0aDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcCA9ICh1aW50OF90ICopZmlsZS0+ZmlsZV9wYXJtLnN0YXJ0X2FkZHIgKyBNRU1fRklMRV9IRFJfU0laRSArIG9mZnNldDsKKyAgICAgICAgaWYgKGZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIuZmlsZV93cmFwX2NudCkKKyAgICAgICAgICAgIG5fb3ZlcndyaXR0ZW4gKz0gZ2V0X251bV9vZl9vdmVyd3JpdHRlbl9tZXNzYWdlcyhwLCBsZW5ndGggKyAxKTsKKyAgICAgICAgKihwKyspID0gREVWX0xPR19NU0dfU1RBUlRfQ0hBUjsKKyAgICAgICAgbWVtY3B5KHAsIGJ1ZiwgbGVuZ3RoKTsKKyAgICB9CisgICAgZmlsZS0+dS5tZW1fZmlsZS5maWxlX2hlYWRlci53cml0ZV9vZmZzZXQgPSBuZXh0X29mZnNldDsKKyAgICBmaWxlLT51Lm1lbV9maWxlLmZpbGVfaGVhZGVyLm51bV9tc2dzICs9ICgxIC0gbl9vdmVyd3JpdHRlbik7CisKKyAgICAvKiB1cGRhdGUgdGhlIGhlYWRlciAqLworICAgIG1lbWNweSgodWludDhfdCAqKWZpbGUtPmZpbGVfcGFybS5zdGFydF9hZGRyLCAmZmlsZS0+dS5tZW1fZmlsZS5maWxlX2hlYWRlciwgTUVNX0ZJTEVfSERSX1NJWkUpOworCisgICAgLyogc2VuZCBhbG1vc3QgZnVsbCBpbmRpY2F0aW9uIGlmIG5lY2Vzc2FyeSAqLworICAgIGlmIChmaWxlLT5hbG1vc3RfZnVsbC5zZW5kX2luZF9jYiAmJgorICAgICAgICAhZmlsZS0+YWxtb3N0X2Z1bGwuaW5kX3NlbnQgJiYKKyAgICAgICAgZmlsZS0+dS5tZW1fZmlsZS5maWxlX2hlYWRlci53cml0ZV9vZmZzZXQgPiBmaWxlLT5hbG1vc3RfZnVsbC50aHJlc2hvbGQpCisgICAgeworICAgICAgICBmaWxlLT5hbG1vc3RfZnVsbC5pbmRfc2VudCA9IChmaWxlLT5hbG1vc3RfZnVsbC5zZW5kX2luZF9jYihmaWxlLT5hbG1vc3RfZnVsbC5wcml2KSA9PSBCQ01fRVJSX09LKTsKKyAgICB9CisKKyAgICBiY21vc19tdXRleF91bmxvY2soJmZpbGUtPnUubWVtX2ZpbGUubXV0ZXgpOworCisgICAgcmV0dXJuIGxlbmd0aDsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGRlZmF1bHRfcmV3aW5kX2NhbGxiYWNrKGJjbV9kZXZfbG9nX2ZpbGUgKmZpbGUpCit7CisgICAgYmNtb3NfbXV0ZXhfbG9jaygmZmlsZS0+dS5tZW1fZmlsZS5tdXRleCk7CisKKyAgICBERVZfTE9HX0lORk9fUFJJTlRGKCJDbGVhciBmaWxlXG4iKTsKKyAgICBmaWxlLT51Lm1lbV9maWxlLmZpbGVfaGVhZGVyLmZpbGVfd3JhcF9jbnQgPSAwOworICAgIGZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIud3JpdGVfb2Zmc2V0ID0gMDsKKyAgICBmaWxlLT51Lm1lbV9maWxlLmZpbGVfaGVhZGVyLmRhdGFfc2l6ZSA9IGZpbGUtPmZpbGVfcGFybS5zaXplIC0gTUVNX0ZJTEVfSERSX1NJWkU7CisgICAgZmlsZS0+dS5tZW1fZmlsZS5maWxlX2hlYWRlci5udW1fbXNncyA9IDA7CisgICAgc3RyY3B5KGZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIuZmlsZV9tYWdpYywgRklMRV9NQUdJQ19TVFIpOworICAgIG1lbWNweSgodWludDhfdCAqKWZpbGUtPmZpbGVfcGFybS5zdGFydF9hZGRyLCAmZmlsZS0+dS5tZW1fZmlsZS5maWxlX2hlYWRlciwgTUVNX0ZJTEVfSERSX1NJWkUpOworICAgIGZpbGUtPmFsbW9zdF9mdWxsLmluZF9zZW50ID0gQkNNT1NfRkFMU0U7CisKKyAgICBiY21vc19tdXRleF91bmxvY2soJmZpbGUtPnUubWVtX2ZpbGUubXV0ZXgpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKworc3RhdGljIHZvaWQgc2V0X2RlZmF1bHRfZmlsZV9jYWxsYmFja3MoYmNtX2Rldl9sb2dfZmlsZSAqZmlsZSkKK3sKKyAgICBmaWxlLT5maWxlX3Bhcm0ub3Blbl9jYiAgPSBkZWZhdWx0X29wZW5fY2FsbGJhY2s7CisgICAgZmlsZS0+ZmlsZV9wYXJtLmNsb3NlX2NiICA9IGRlZmF1bHRfY2xvc2VfY2FsbGJhY2s7CisgICAgZmlsZS0+ZmlsZV9wYXJtLnJlYWRfY2IgID0gZGVmYXVsdF9yZWFkX2NhbGxiYWNrOworICAgIGZpbGUtPmZpbGVfcGFybS53cml0ZV9jYiA9IGRlZmF1bHRfd3JpdGVfY2FsbGJhY2s7CisgICAgZmlsZS0+ZmlsZV9wYXJtLnJld2luZF9jYiA9IGRlZmF1bHRfcmV3aW5kX2NhbGxiYWNrOworfQorCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgYmNtX2Rldl9sb2dfaXNfbWVtb3J5X2ZpbGUoYmNtX2Rldl9sb2dfZmlsZSAqZmlsZSkKK3sKKyAgICByZXR1cm4gKGZpbGUtPmZpbGVfcGFybS5vcGVuX2NiID09IGRlZmF1bHRfb3Blbl9jYWxsYmFjayk7Cit9CisKK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2ZpbGVfY2xlYXIoYmNtX2Rldl9sb2dfZmlsZSAqZmlsZSkKK3sKKyAgICBpZiAoIWZpbGUgfHwgIShmaWxlLT5maWxlX3Bhcm0uZmxhZ3MgJiBCQ01fREVWX0xPR19GSUxFX0ZMQUdfVkFMSUQpKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworCisgICAgaWYgKCFmaWxlLT5maWxlX3Bhcm0ucmV3aW5kX2NiKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworCisgICAgcmV0dXJuIGZpbGUtPmZpbGVfcGFybS5yZXdpbmRfY2IoZmlsZSk7Cit9CisKKy8qIEZpbGUgaW5kZXggdG8gZmlsZSBoYW5kbGUgKi8KK2JjbV9kZXZfbG9nX2ZpbGUgKmJjbV9kZXZfbG9nX2ZpbGVfZ2V0KHVpbnQzMl90IGZpbGVfaW5kZXgpCit7CisgICAgYmNtX2Rldl9sb2dfZmlsZSAqZmlsZSA9ICZkZXZfbG9nLmZpbGVzW2ZpbGVfaW5kZXhdOworCisgICAgaWYgKChmaWxlX2luZGV4ID49IERFVl9MT0dfTUFYX0ZJTEVTKSB8fCAhKGZpbGUtPmZpbGVfcGFybS5mbGFncyAmIEJDTV9ERVZfTE9HX0ZJTEVfRkxBR19WQUxJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBmaWxlOworfQorCisvKiBSZWFkIGZyb20gZmlsZSAqLworaW50IGJjbV9kZXZfbG9nX2ZpbGVfcmVhZChiY21fZGV2X2xvZ19maWxlICpmaWxlLCB1aW50MzJfdCAqb2Zmc2V0LCBjaGFyICpidWYsIHVpbnQzMl90IGJ1Zl9sZW4pCit7CisgICAgaW50IGxlbjsKKyAgICBpZiAoIWZpbGUgfHwgIWJ1ZiB8fCAhKGZpbGUtPmZpbGVfcGFybS5mbGFncyAmIEJDTV9ERVZfTE9HX0ZJTEVfRkxBR19WQUxJRCkpCisgICAgICAgIHJldHVybiAoaW50KUJDTV9FUlJfUEFSTTsKKworICAgIGxlbiA9IGZpbGUtPmZpbGVfcGFybS5yZWFkX2NiKGZpbGUsIG9mZnNldCwgYnVmLCBidWZfbGVuKTsKKyAgICAvKiBJZiBub3RoaW5nIG1vcmUgdG8gcmVhZCBhbmQgQ0xFQVJfQUZURVJfUkVBRCBtb2RlLCByZWFkIGFnYWluIHVuZGVyIGxvY2sgYW5kIGNsZWFyIGlmIG5vIG5ldyByZWNvcmRzICovCisgICAgaWYgKCFsZW4gJiYgYmNtX2Rldl9sb2dfaXNfbWVtb3J5X2ZpbGUoZmlsZSkgJiYgKGZpbGUtPmZpbGVfcGFybS5mbGFncyAmIEJDTV9ERVZfTE9HX0ZJTEVfRkxBR19DTEVBUl9BRlRFUl9SRUFEKSkKKyAgICB7CisgICAgICAgIGJjbW9zX211dGV4X2xvY2soJmZpbGUtPnUubWVtX2ZpbGUubXV0ZXgpOworICAgICAgICBsZW4gPSBmaWxlLT5maWxlX3Bhcm0ucmVhZF9jYihmaWxlLCBvZmZzZXQsIGJ1ZiwgYnVmX2xlbik7CisgICAgICAgIGlmICghbGVuKQorICAgICAgICAgICAgZmlsZS0+ZmlsZV9wYXJtLnJld2luZF9jYihmaWxlKTsKKyAgICAgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZmaWxlLT51Lm1lbV9maWxlLm11dGV4KTsKKyAgICB9CisgICAgcmV0dXJuIGxlbjsKK30KKworLyogQXR0YWNoIGZpbGUgdG8gbWVtb3J5IGJ1ZmZlciAqLworYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfZmlsZV9hdHRhY2godm9pZCAqYnVmLCB1aW50MzJfdCBidWZfbGVuLCBiY21fZGV2X2xvZ19maWxlICpmaWxlKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGRldl9sb2dfbWVtX2ZpbGVfaGVhZGVyICpoZHIgPSAoZGV2X2xvZ19tZW1fZmlsZV9oZWFkZXIgKilidWY7CisKKyAgICBpZiAoIWJ1ZiB8fCAhZmlsZSB8fCBidWZfbGVuIDw9IE1FTV9GSUxFX0hEUl9TSVpFKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworCisgICAgaWYgKG1lbWNtcChGSUxFX01BR0lDX1NUUiwgaGRyLT5maWxlX21hZ2ljLCBGSUxFX01BR0lDX1NUUl9TSVpFKSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9FTlQ7CisKKyNpZiBERVZfTE9HX0VORElBTiAhPSBCQ01fQ1BVX0VORElBTgorICAgIGhkci0+ZmlsZV93cmFwX2NudCA9IGJjbW9zX2VuZGlhbl9zd2FwX3UzMihoZHItPmZpbGVfd3JhcF9jbnQpOworICAgIGhkci0+d3JpdGVfb2Zmc2V0ID0gYmNtb3NfZW5kaWFuX3N3YXBfdTMyKGhkci0+d3JpdGVfb2Zmc2V0KTsKKyAgICBoZHItPmRhdGFfc2l6ZSA9IGJjbW9zX2VuZGlhbl9zd2FwX3UzMihoZHItPmRhdGFfc2l6ZSk7CisgICAgaGRyLT5udW1fbXNncyA9IGJjbW9zX2VuZGlhbl9zd2FwX3UzMihoZHItPm51bV9tc2dzKTsKKyNlbmRpZgorCisgICAgbWVtc2V0KGZpbGUsIDAsIHNpemVvZigqZmlsZSkpOworICAgIGZpbGUtPmZpbGVfcGFybS5zdGFydF9hZGRyID0gYnVmOworICAgIGZpbGUtPmZpbGVfcGFybS5zaXplID0gYnVmX2xlbjsKKyAgICBmaWxlLT5maWxlX3Bhcm0uZmxhZ3MgPSBCQ01fREVWX0xPR19GSUxFX0ZMQUdfVkFMSUQ7CisgICAgc2V0X2RlZmF1bHRfZmlsZV9jYWxsYmFja3MoZmlsZSk7CisgICAgcmMgPSBkZWZhdWx0X29wZW5fY2FsbGJhY2tfY29uZF9yZXNldCgmZmlsZS0+ZmlsZV9wYXJtLCBmaWxlLCBCQ01PU19GQUxTRSk7CisgICAgaWYgKHJjKQorICAgICAgICByZXR1cm4gcmM7CisKKyAgICBpZiAoIWZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIubnVtX21zZ3MpCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PRU5UOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIERldGFjaCBmaWxlIGhhbmRsZSBmcm9tIG1lbW9yeSBidWZmZXIgKi8KK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2ZpbGVfZGV0YWNoKGJjbV9kZXZfbG9nX2ZpbGUgKmZpbGUpCit7CisgICAgaWYgKCFmaWxlIHx8ICEoZmlsZS0+ZmlsZV9wYXJtLmZsYWdzICYgQkNNX0RFVl9MT0dfRklMRV9GTEFHX1ZBTElEKSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICBmaWxlLT5maWxlX3Bhcm0uZmxhZ3MgPSBCQ01fREVWX0xPR19GSUxFX0ZMQUdfVkFMSUQ7CisgICAgYmNtb3NfbXV0ZXhfZGVzdHJveSgmZmlsZS0+dS5tZW1fZmlsZS5tdXRleCk7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKworI2lmZGVmIEJDTV9PU19QT1NJWAorICAgIC8qIFJlZ3VsYXIgZmlsZSBjYWxsYmFja3MgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBPUEVOIENBTExCQUNLOiBvcGVuIG1lbW9yeS9maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIGZpbGVfcGFybSAtIGZpbGUgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogZmlsZSAgICAgIC0gZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBfZGV2X2xvZ19yZWdfZmlsZV9vcGVuKGNvbnN0IGJjbV9kZXZfbG9nX2ZpbGVfcGFybSAqZmlsZV9wYXJtLCBiY21fZGV2X2xvZ19maWxlICpmaWxlKQoreworICAgIGJjbW9zX2Vycm5vIGVyciA9IEJDTV9FUlJfT0s7CisKKyAgICBmaWxlLT5maWxlX3Bhcm0gPSAqZmlsZV9wYXJtOworICAgIGZpbGUtPnUucmVnX2ZpbGVfaGFuZGxlID0gZm9wZW4oKGNoYXIgKilmaWxlX3Bhcm0tPnVkZWZfcGFybXMsICJ3KyIpOworICAgIGlmICghZmlsZS0+dS5yZWdfZmlsZV9oYW5kbGUpCisgICAgeworICAgICAgICBiY21vc19wcmludGYoIkRFVl9MT0c6IGNhbid0IG9wZW4gZmlsZSAlcyBmb3Igd3JpdGluZ1xuIiwgKGNoYXIgKilmaWxlX3Bhcm0tPnVkZWZfcGFybXMpOworICAgICAgICBlcnIgPSBCQ01fRVJSX0lPOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIENMT1NFIENBTExCQUNLOiBjbG9zZSBtZW1vcnkvZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBmaWxlICAgICAgLSBmaWxlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGJjbW9zX2Vycm5vIF9kZXZfbG9nX3JlZ19maWxlX2Nsb3NlKGJjbV9kZXZfbG9nX2ZpbGUgKmZpbGUpCit7CisgICAgaWYgKGZpbGUtPnUucmVnX2ZpbGVfaGFuZGxlKQorICAgIHsKKyAgICAgICAgZmNsb3NlKGZpbGUtPnUucmVnX2ZpbGVfaGFuZGxlKTsKKyAgICAgICAgZmlsZS0+dS5yZWdfZmlsZV9oYW5kbGUgPSBOVUxMOworICAgIH0KKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBSRVdJTkQgQ0FMTEJBQ0s6IGNsZWFycyBtZW1vcnkvZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIGZpbGUgICAgICAtIGZpbGUgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gX2Rldl9sb2dfcmVnX2ZpbGVfcmV3aW5kKGJjbV9kZXZfbG9nX2ZpbGUgKmZpbGUpCit7CisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKyAgICBGSUxFICpmOworCisgICAgaWYgKGZpbGUtPnUucmVnX2ZpbGVfaGFuZGxlKQorICAgIHsKKyAgICAgICAgZiA9IGZyZW9wZW4oKGNvbnN0IGNoYXIgKilmaWxlLT5maWxlX3Bhcm0udWRlZl9wYXJtcywgIncrIiwgZmlsZS0+dS5yZWdfZmlsZV9oYW5kbGUpOworICAgICAgICBpZiAoTlVMTCAhPSBmKQorICAgICAgICB7CisgICAgICAgICAgICBmaWxlLT51LnJlZ19maWxlX2hhbmRsZSA9IGY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBlcnIgPSBCQ01fRVJSX0lPOworICAgICAgICAgICAgYmNtb3NfcHJpbnRmKCJERVZfTE9HOiBjYW4ndCBvcGVuIGZpbGUgJXMgZm9yIHdyaXRpbmdcbiIsIChjaGFyICopZmlsZS0+ZmlsZV9wYXJtLnVkZWZfcGFybXMpOworICAgICAgICB9CisKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBSRUFEX0NBTExCQUNLOiByZWFkIGZvcm0gbWVtb3J5L2ZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIG9mZnNldCAtIHRoZSBvZmZzZXQgaW4gYnl0ZXMgdG8gcmVhZCBmcm9tLCBvdXRwdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogYnVmICAgIC0gV2hlcmUgdG8gcHV0IHRoZSByZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBsZW5ndGggLSBCdWZmZXIgbGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoaXMgZnVuY3Rpb24gc2hvdWxkIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQgZnJvbSBmaWxlIG9yIDAgaWYgRU9GICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IF9kZXZfbG9nX3JlZ19maWxlX3JlYWQoYmNtX2Rldl9sb2dfZmlsZSAqZmlsZSwgdWludDMyX3QgKm9mZnNldCwgdm9pZCAqYnVmLCB1aW50MzJfdCBsZW5ndGgpCit7CisgICAgaW50IG4gPSAwOworICAgIGlmIChmaWxlLT51LnJlZ19maWxlX2hhbmRsZSkKKyAgICB7CisgICAgICAgIGlmICghZnNlZWsoZmlsZS0+dS5yZWdfZmlsZV9oYW5kbGUsIFNFRUtfU0VULCAqb2Zmc2V0KSkKKyAgICAgICAgICAgIG4gPSBmcmVhZChidWYsIDEsIGxlbmd0aCwgZmlsZS0+dS5yZWdfZmlsZV9oYW5kbGUpOworICAgICAgICAqb2Zmc2V0ID0gZnRlbGwoZmlsZS0+dS5yZWdfZmlsZV9oYW5kbGUpOworICAgIH0KKyAgICByZXR1cm4gKG4gPCAwKSA/IDAgOiBuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFdSSVRFX0NBTExCQUNLOiB3cml0ZSBmb3JtIG1lbW9yeS9maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogYnVmICAgIC0gVGhlIGJ1ZmZlciB0aGF0IHNob3VsZCBiZSB3cml0dGVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBsZW5ndGggLSBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoaXMgZnVuY3Rpb24gc2hvdWxkIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4gdG8gZmlsZSBvciAwIGlmIEVPRiAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IF9kZXZfbG9nX3JlZ19maWxlX3dyaXRlKGJjbV9kZXZfbG9nX2ZpbGUgKmZpbGUsIGNvbnN0IHZvaWQgKmJ1ZiwgdWludDMyX3QgbGVuZ3RoKQoreworICAgIGNvbnN0IGNoYXIgKmNidWYgPSAoY29uc3QgY2hhciAqKWJ1ZjsKKyAgICBpbnQgbiA9IDA7CisgICAgaWYgKGZpbGUtPnUucmVnX2ZpbGVfaGFuZGxlKQorICAgIHsKKyAgICAgICAgLyogUmVtb3ZlIDAgdGVybWluYXRvciAqLworICAgICAgICBpZiAobGVuZ3RoICYmICFjYnVmW2xlbmd0aC0xXSkKKyAgICAgICAgICAgIC0tbGVuZ3RoOworICAgICAgICBuID0gZndyaXRlKGJ1ZiwgMSwgbGVuZ3RoLCBmaWxlLT51LnJlZ19maWxlX2hhbmRsZSk7CisgICAgICAgIGZmbHVzaChmaWxlLT51LnJlZ19maWxlX2hhbmRsZSk7CisgICAgfQorICAgIHJldHVybiBuOworfQorCitzdGF0aWMgdm9pZCBzZXRfcmVndWxhcl9maWxlX2NhbGxiYWNrcyhiY21fZGV2X2xvZ19maWxlICpmaWxlKQoreworICAgIGZpbGUtPmZpbGVfcGFybS5vcGVuX2NiICA9IF9kZXZfbG9nX3JlZ19maWxlX29wZW47CisgICAgZmlsZS0+ZmlsZV9wYXJtLmNsb3NlX2NiICA9IF9kZXZfbG9nX3JlZ19maWxlX2Nsb3NlOworICAgIGZpbGUtPmZpbGVfcGFybS5yZWFkX2NiICA9IF9kZXZfbG9nX3JlZ19maWxlX3JlYWQ7CisgICAgZmlsZS0+ZmlsZV9wYXJtLndyaXRlX2NiID0gX2Rldl9sb2dfcmVnX2ZpbGVfd3JpdGU7CisgICAgZmlsZS0+ZmlsZV9wYXJtLnJld2luZF9jYiA9IF9kZXZfbG9nX3JlZ19maWxlX3Jld2luZDsKK30KKworI2VuZGlmIC8qICNpZmRlZiBCQ01fT1NfUE9TSVggKi8KKworI2lmZGVmIERFVl9MT0dfU1lTTE9HCisgICAgLyogbGludXggc3lzbG9nIGludGVncmF0aW9uICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE9QRU4gQ0FMTEJBQ0s6IG9wZW4gc3lzbG9nIGludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogZmlsZV9wYXJtLT51ZGVmX3Bhcm0gY29udGFpbnMgb3B0aW9uYWwgbG9nIGlkZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19lcnJubyBfZGV2X2xvZ19zeXNsb2dfZmlsZV9vcGVuKGNvbnN0IGJjbV9kZXZfbG9nX2ZpbGVfcGFybSAqZmlsZV9wYXJtLCBiY21fZGV2X2xvZ19maWxlICpmaWxlKQoreworICAgIGZpbGUtPmZpbGVfcGFybSA9ICpmaWxlX3Bhcm07CisgICAgb3BlbmxvZygoY29uc3QgY2hhciAqKWZpbGVfcGFybS0+dWRlZl9wYXJtcywgMCwgTE9HX1VTRVIpOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIENMT1NFIENBTExCQUNLOiBjbG9zZSBzeXNsb2cgaW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gX2Rldl9sb2dfc3lzbG9nX2ZpbGVfY2xvc2UoYmNtX2Rldl9sb2dfZmlsZSAqZmlsZSkKK3sKKyAgICBjbG9zZWxvZygpOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFJFV0lORCBDQUxMQkFDSzogbm90IHN1cHBvcnRlZCBieSBzeXNsb2cuIFJldHVybiBPSyB0byBwcmV2ZW50IHJlcXVlc3QgZmFpbHVyZSAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYmNtb3NfZXJybm8gX2Rldl9sb2dfc3lzbG9nX2ZpbGVfcmV3aW5kKGJjbV9kZXZfbG9nX2ZpbGUgKmZpbGUpCit7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUkVBRF9DQUxMQkFDSzogcmVhZGluZyBmcm9tIHN5c2xvZyBpcyBub3Qgc3VwcG9ydGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgX2Rldl9sb2dfc3lzbG9nX2ZpbGVfcmVhZChiY21fZGV2X2xvZ19maWxlICpmaWxlLCB1aW50MzJfdCAqb2Zmc2V0LCB2b2lkICpidWYsIHVpbnQzMl90IGxlbmd0aCkKK3sKKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBXUklURV9DQUxMQkFDSzogd3JpdGUgdG8gc3lzbG9nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIGJ1ZiAgICAtIFRoZSBidWZmZXIgdGhhdCBzaG91bGQgYmUgd3JpdHRlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogbGVuZ3RoIC0gVGhlIG51bWJlciBvZiBieXRlcyB0byB3cml0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSB3cml0dGVuIHRvIGZpbGUgb3IgMCBpZiBFT0YgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBfZGV2X2xvZ19zeXNsb2dfZmlsZV93cml0ZShiY21fZGV2X2xvZ19maWxlICpmaWxlLCBjb25zdCB2b2lkICpidWYsIHVpbnQzMl90IGxlbmd0aCkKK3sKKyAgICBjb25zdCBjaGFyICpjYnVmID0gKGNvbnN0IGNoYXIgKilidWY7CisgICAgc3RhdGljIGludCBsb2dfcHJpb3JpdHkgPSBMT0dfREVCVUc7CisKKyAgICAvKiBJZGVudGlmeSBsb2cgbG92ZWwgKi8KKyAgICBpZiAoY2J1ZiAmJiBjYnVmWzBdID09ICdbJykKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIgKmNsZXZlbCA9IHN0cmNocihjYnVmLCAnICcpOworICAgICAgICBpZiAoY2xldmVsKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKCooY2xldmVsICsgMSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlICdGJzoKKyAgICAgICAgICAgICAgICBsb2dfcHJpb3JpdHkgPSBMT0dfQ1JJVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ0UnOgorICAgICAgICAgICAgICAgIGxvZ19wcmlvcml0eSA9IExPR19FUlI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdXJzoKKyAgICAgICAgICAgICAgICBsb2dfcHJpb3JpdHkgPSBMT0dfV0FSTklORzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ0knOgorICAgICAgICAgICAgICAgIGxvZ19wcmlvcml0eSA9IExPR19JTkZPOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnRCc6CisgICAgICAgICAgICAgICAgbG9nX3ByaW9yaXR5ID0gTE9HX0RFQlVHOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBzeXNsb2cobG9nX3ByaW9yaXR5LCAiJXMiLCBjYnVmKTsKKyAgICByZXR1cm4gbGVuZ3RoOworfQorCitzdGF0aWMgdm9pZCBzZXRfc3lzbG9nX2ZpbGVfY2FsbGJhY2tzKGJjbV9kZXZfbG9nX2ZpbGUgKmZpbGUpCit7CisgICAgZmlsZS0+ZmlsZV9wYXJtLm9wZW5fY2IgID0gX2Rldl9sb2dfc3lzbG9nX2ZpbGVfb3BlbjsKKyAgICBmaWxlLT5maWxlX3Bhcm0uY2xvc2VfY2IgID0gX2Rldl9sb2dfc3lzbG9nX2ZpbGVfY2xvc2U7CisgICAgZmlsZS0+ZmlsZV9wYXJtLnJlYWRfY2IgID0gX2Rldl9sb2dfc3lzbG9nX2ZpbGVfcmVhZDsKKyAgICBmaWxlLT5maWxlX3Bhcm0ud3JpdGVfY2IgPSBfZGV2X2xvZ19zeXNsb2dfZmlsZV93cml0ZTsKKyAgICBmaWxlLT5maWxlX3Bhcm0ucmV3aW5kX2NiID0gX2Rldl9sb2dfc3lzbG9nX2ZpbGVfcmV3aW5kOworfQorCisjZW5kaWYgLyogI2lmZGVmIERFVl9MT0dfU1lTTE9HICovCisKK3N0YXRpYyBiY21vc19lcnJubyBiY21fZGV2X2xvZ19jcmVhdGUoCisgICAgY29uc3QgYmNtX2Rldl9sb2dfcGFybSAqZGV2X2xvZ19wYXJtLAorICAgIGNvbnN0IGJjbW9zX3Rhc2tfcGFybSAqc2F2ZV90YXNrX3Bhcm0sCisgICAgY29uc3QgYmNtb3NfdGFza19wYXJtICpwcmludF90YXNrX3Bhcm0sCisgICAgY29uc3QgYmNtb3NfbXNnX3F1ZXVlX3Bhcm0gKnNhdmVfcXVldWVfcGFybSwKKyAgICBjb25zdCBiY21vc19tc2dfcXVldWVfcGFybSAqcHJpbnRfcXVldWVfcGFybSwKKyAgICBjb25zdCBiY21vc19tc2dfcG9vbF9wYXJtICpwb29sX3Bhcm0pCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGludCBpOworCisgICAgaWYgKCFkZXZfbG9nX3Bhcm0pCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisKKyAgICBpZiAoZGV2X2xvZy5zdGF0ZSAhPSBCQ01fREVWX0xPR19TVEFURV9VTklOSVRJQUxJWkVEKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9BTFJFQURZOworCisgICAgLyogU2V0IHVzZXIgY2FsbGJhY2tzICovCisgICAgZGV2X2xvZy5kZXZfbG9nX3Bhcm0gPSAqZGV2X2xvZ19wYXJtOworICAgIGlmICghZGV2X2xvZy5kZXZfbG9nX3Bhcm0ucHJpbnRfY2IpCisgICAgICAgIGRldl9sb2cuZGV2X2xvZ19wYXJtLnByaW50X2NiID0gZGVmYXVsdF9wcmludDsKKyAgICBpZiAoIWRldl9sb2cuZGV2X2xvZ19wYXJtLmdldF90aW1lX2NiKQorICAgICAgICBkZXZfbG9nLmRldl9sb2dfcGFybS5nZXRfdGltZV9jYiA9IGRlZmF1bHRfZ2V0X3RpbWU7CisgICAgaWYgKCFkZXZfbG9nLmRldl9sb2dfcGFybS50aW1lX3RvX3N0cl9jYikKKyAgICAgICAgZGV2X2xvZy5kZXZfbG9nX3Bhcm0udGltZV90b19zdHJfY2IgPSBkZWZhdWx0X3RpbWVfdG9fc3RyOworCisgICAgZm9yIChpID0gMDsgKGkgPCBERVZfTE9HX01BWF9GSUxFUykgJiYgKGRldl9sb2dfcGFybS0+bG9nX2ZpbGVbaV0uZmxhZ3MgJiBCQ01fREVWX0xPR19GSUxFX0ZMQUdfVkFMSUQpOyBpKyspCisgICAgeworICAgICAgICAvKiBDb3B5IGxvZyBmaWxlcyAqLworICAgICAgICBkZXZfbG9nLmZpbGVzW2ldLmZpbGVfcGFybSA9IGRldl9sb2dfcGFybS0+bG9nX2ZpbGVbaV07CisgICAgICAgIGlmICghZGV2X2xvZy5maWxlc1tpXS5maWxlX3Bhcm0ub3Blbl9jYikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGRldl9sb2cuZmlsZXNbaV0uZmlsZV9wYXJtLnR5cGUgPT0gQkNNX0RFVl9MT0dfRklMRV9NRU1PUlkpCisgICAgICAgICAgICAgICAgc2V0X2RlZmF1bHRfZmlsZV9jYWxsYmFja3MoJmRldl9sb2cuZmlsZXNbaV0pOworI2lmZGVmIEJDTV9PU19QT1NJWAorICAgICAgICAgICAgZWxzZSBpZiAoZGV2X2xvZy5maWxlc1tpXS5maWxlX3Bhcm0udHlwZSA9PSBCQ01fREVWX0xPR19GSUxFX1JFR1VMQVIpCisgICAgICAgICAgICAgICAgc2V0X3JlZ3VsYXJfZmlsZV9jYWxsYmFja3MoJmRldl9sb2cuZmlsZXNbaV0pOworI2VuZGlmCisjaWZkZWYgREVWX0xPR19TWVNMT0cKKyAgICAgICAgICAgIGVsc2UgaWYgKGRldl9sb2cuZmlsZXNbaV0uZmlsZV9wYXJtLnR5cGUgPT0gQkNNX0RFVl9MT0dfRklMRV9TWVNMT0cpCisgICAgICAgICAgICAgICAgc2V0X3N5c2xvZ19maWxlX2NhbGxiYWNrcygmZGV2X2xvZy5maWxlc1tpXSk7CisjZW5kaWYKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBERVZfTE9HX0VSUk9SX1BSSU5URigiZmlsZSVkOiBvcGVuX2NiIG11c3QgYmUgc2V0IGZvciB1c2VyLWRlZmluZWQgZmlsZVxuXG4iLCBpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlcnIgPSBkZXZfbG9nLmZpbGVzW2ldLmZpbGVfcGFybS5vcGVuX2NiKCZkZXZfbG9nLmZpbGVzW2ldLmZpbGVfcGFybSwgJmRldl9sb2cuZmlsZXNbaV0pOworICAgICAgICBpZiAoZXJyKQorICAgICAgICB7CisgICAgICAgICAgICBERVZfTE9HX0VSUk9SX1BSSU5URigiZmlsZSVkOiBvcGVuIGZhaWxlZDogJXMgKCVkKVxuXG4iLCBpLCBiY21vc19zdHJlcnJvcihlcnIpLCBlcnIgKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIERFVl9MT0dfSU5GT19QUklOVEYoImZpbGU6IHN0YXJ0X2FkZHI6IDB4JXAsIHNpemU6ICV1LCBtYXggbXNnIHNpemUgJXVcbiIsCisgICAgICAgICAgICBkZXZfbG9nLmZpbGVzW2ldLmZpbGVfcGFybS5zdGFydF9hZGRyLCBkZXZfbG9nLmZpbGVzW2ldLmZpbGVfcGFybS5zaXplLCBNQVhfREVWX0xPR19TVFJJTkdfU0laRSk7CisgICAgfQorCisgICAgLyogQ3JlYXRlIHBvb2wgKi8KKyAgICBlcnIgPSBiY21vc19tc2dfcG9vbF9jcmVhdGUoJmRldl9sb2cucG9vbCwgcG9vbF9wYXJtKTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBERVZfTE9HX0VSUk9SX1BSSU5URigiRXJyb3I6IENhbid0IGNyZWF0ZSBwb29sIChlcnJvcjogJWQpXG4iLCAoaW50KWVycik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgLyogQ3JlYXRlIG1lc3NhZ2UgcXVldWVzICovCisgICAgZXJyID0gYmNtb3NfbXNnX3F1ZXVlX2NyZWF0ZSgmZGV2X2xvZy5zYXZlX3F1ZXVlLCBzYXZlX3F1ZXVlX3Bhcm0pOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIERFVl9MT0dfRVJST1JfUFJJTlRGKCIoJXMpIEVycm9yOiBDYW4ndCBjcmVhdGUgc2F2ZSBxdWV1ZSAoZXJyb3I6ICVkKVxuIiwgX19GVU5DVElPTl9fLCAoaW50KWVycik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIGVyciA9IGJjbW9zX21zZ19xdWV1ZV9jcmVhdGUoJmRldl9sb2cucHJpbnRfcXVldWUsIHByaW50X3F1ZXVlX3Bhcm0pOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIERFVl9MT0dfRVJST1JfUFJJTlRGKCIoJXMpIEVycm9yOiBDYW4ndCBjcmVhdGUgcHJpbnQgcXVldWUgKGVycm9yOiAlZClcbiIsIF9fRlVOQ1RJT05fXywgKGludCllcnIpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIC8qIENyZWF0ZSB0YXNrcyAqLworICAgIGVyciA9IGJjbW9zX3Rhc2tfY3JlYXRlKCZkZXZfbG9nLnNhdmVfdGFzaywgc2F2ZV90YXNrX3Bhcm0pOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIERFVl9MT0dfRVJST1JfUFJJTlRGKCJFcnJvcjogQ2FuJ3Qgc3Bhd24gc2F2ZSB0YXNrIChlcnJvcjogJWQpXG4iLCAoaW50KWVycik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIGVyciA9IGJjbW9zX3Rhc2tfY3JlYXRlKCZkZXZfbG9nLnByaW50X3Rhc2ssIHByaW50X3Rhc2tfcGFybSk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgREVWX0xPR19FUlJPUl9QUklOVEYoIkVycm9yOiBDYW4ndCBzcGF3biBwcmludCB0YXNrIChlcnJvcjogJWQpXG4iLCAoaW50KWVycik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYmNtb3Nfc2VtX2NyZWF0ZSgmZGV2X2xvZy5zYXZlX3Rhc2tfaXNfdGVybWluYXRlZCwgMCwgMCwgInNhdmVfdGFza19zZW0iKTsKKyAgICBiY21vc19zZW1fY3JlYXRlKCZkZXZfbG9nLnByaW50X3Rhc2tfaXNfdGVybWluYXRlZCwgMCwgMCwgInByaW50X3Rhc2tfc2VtIik7CisKKyAgICBkZXZfbG9nLnN0YXRlID0gQkNNX0RFVl9MT0dfU1RBVEVfRU5BQkxFRDsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCit2b2lkIGJjbV9kZXZfbG9nX2Rlc3Ryb3kodm9pZCkKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgdWludDMyX3QgaTsKKyAgICBiY21vc19tc2dfc2VuZF9mbGFncyBtc2dfZmxhZ3M7CisKKyAgICBpZiAoZGV2X2xvZy5zdGF0ZSA9PSBCQ01fREVWX0xPR19TVEFURV9VTklOSVRJQUxJWkVEKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIFNlbmQgYSBzaHV0ZG93biBtZXNzYWdlIHRvIGVhY2ggdGFzay4gV2hlbiByZWNlaXZlZCBieSB0aGUgbWFpbiBsb29wcywgaXQgd2lsbCB0ZWFyIGRvd24gdGhlIHRhc2tzIGdyYWNlZnVsbHkuCisgICAgICogSWYgdGhlIGZsYWcgaXMgc2V0IHRvIHRlYXIgZG93biBpbW1lZGlhdGVseSwgd2UnbGwgc2VuZCBhbiBVUkdFTlQgdGVhcmRvd24gbWVzc2FnZSwgc28gaXQnbGwgYmUgaGFuZGxlZCBiZWZvcmUKKyAgICAgKiBhbGwgb3VzdGFuZGluZyBsb2cgbWVzc2FnZXMgKHRoZSBvdXN0YW5kaW5nIGxvZyBtZXNzYWdlcyB3aWxsIGJlIGZyZWVkIGR1cmluZyBiY21vc19tc2dfcXVldWVfZGVzdHJveSkuICovCisgICAgbXNnX2ZsYWdzID0gQkNNT1NfTVNHX1NFTkRfTk9MSU1JVDsKKyAgICBpZiAoKGRldl9sb2cuZmxhZ3MgJiBCQ01fREVWX0xPR19GTEFHX0RFU1RST1lfSU1NRURJQVRFTFkpICE9IDApCisgICAgICAgIG1zZ19mbGFncyB8PSBCQ01PU19NU0dfU0VORF9VUkdFTlQ7CisKKyAgICAvKiBUaGUgc2F2ZSB0YXNrIGRlcGVuZHMgb24gdGhlIHByaW50IHRhc2ssIHNvIHdlIHRlcm1pbmF0ZSB0aGUgc2F2ZSB0YXNrIGZpcnN0LiAqLworICAgIGJjbW9zX21zZ19zZW5kKCZkZXZfbG9nLnNhdmVfcXVldWUsICZzaHV0ZG93bl9tc2csIG1zZ19mbGFncyk7CisgICAgYmNtb3Nfc2VtX3dhaXQoJmRldl9sb2cuc2F2ZV90YXNrX2lzX3Rlcm1pbmF0ZWQsIEJDTU9TX1dBSVRfRk9SRVZFUik7CisKKyAgICBiY21vc19tc2dfc2VuZCgmZGV2X2xvZy5wcmludF9xdWV1ZSwgJnNodXRkb3duX21zZywgbXNnX2ZsYWdzKTsKKyAgICBiY21vc19zZW1fd2FpdCgmZGV2X2xvZy5wcmludF90YXNrX2lzX3Rlcm1pbmF0ZWQsIEJDTU9TX1dBSVRfRk9SRVZFUik7CisKKyAgICBiY21vc19zZW1fZGVzdHJveSgmZGV2X2xvZy5zYXZlX3Rhc2tfaXNfdGVybWluYXRlZCk7CisgICAgYmNtb3Nfc2VtX2Rlc3Ryb3koJmRldl9sb2cucHJpbnRfdGFza19pc190ZXJtaW5hdGVkKTsKKworICAgIGVyciA9IGJjbW9zX3Rhc2tfZGVzdHJveSgmZGV2X2xvZy5zYXZlX3Rhc2spOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIERFVl9MT0dfRVJST1JfUFJJTlRGKCJFcnJvcjogQ2FuJ3QgZGVzdHJveSBkZXZfbG9nIHNhdmUgdGFzayAoZXJyb3I6ICVkKVxuIiwgKGludCllcnIpOworICAgIH0KKworICAgIGVyciA9IGJjbW9zX3Rhc2tfZGVzdHJveSgmZGV2X2xvZy5wcmludF90YXNrKTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBERVZfTE9HX0VSUk9SX1BSSU5URigiRXJyb3I6IENhbid0IGRlc3Ryb3kgZGV2X2xvZyBwcmludCB0YXNrIChlcnJvcjogJWQpXG4iLCAoaW50KWVycik7CisgICAgfQorCisgICAgZXJyID0gYmNtb3NfbXNnX3F1ZXVlX2Rlc3Ryb3koJmRldl9sb2cuc2F2ZV9xdWV1ZSk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgREVWX0xPR19FUlJPUl9QUklOVEYoIkVycm9yOiBDYW4ndCBkZXN0cm95IHNhdmUgcXVldWUgKGVycm9yOiAlZClcbiIsIChpbnQpZXJyKTsKKyAgICB9CisKKyAgICBlcnIgPSBiY21vc19tc2dfcXVldWVfZGVzdHJveSgmZGV2X2xvZy5wcmludF9xdWV1ZSk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgREVWX0xPR19FUlJPUl9QUklOVEYoIkVycm9yOiBDYW4ndCBkZXN0cm95IHByaW50IHF1ZXVlIChlcnJvcjogJWQpXG4iLCAoaW50KWVycik7CisgICAgfQorCisgICAgZXJyID0gYmNtb3NfbXNnX3Bvb2xfZGVzdHJveSgmZGV2X2xvZy5wb29sKTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBERVZfTE9HX0VSUk9SX1BSSU5URigiRXJyb3I6IENhbid0IGRlc3Ryb3kgcG9vbCAoZXJyb3I6ICVkKVxuIiwgKGludCllcnIpOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IChpIDwgREVWX0xPR19NQVhfRklMRVMpICYmIChkZXZfbG9nLmRldl9sb2dfcGFybS5sb2dfZmlsZVtpXS5mbGFncyAmIEJDTV9ERVZfTE9HX0ZJTEVfRkxBR19WQUxJRCk7IGkrKykKKyAgICB7CisgICAgICAgIGRldl9sb2cuZmlsZXNbaV0uZmlsZV9wYXJtLmNsb3NlX2NiKCZkZXZfbG9nLmZpbGVzW2ldKTsKKyAgICB9CisKKyAgICBkZXZfbG9nLnN0YXRlID0gQkNNX0RFVl9MT0dfU1RBVEVfVU5JTklUSUFMSVpFRDsKK30KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21vc19tc2cgbXNnOworICAgIGRldl9sb2dfcXVldWVfbXNnIGxvZ19xdWV1ZV9tc2c7CisgICAgYmNtb3NfYm9vbCBsb2NrOworICAgIGJjbW9zX2Zhc3Rsb2NrIGZhc3Rsb2NrOworfSBiY21fZGV2X2xvZ19kcm9wX21zZzsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21fZGV2X2xvZ19kcm9wX21zZyBtc2c7CisgICAgdWludDMyX3QgZHJvcHM7CisgICAgdWludDMyX3QgcmVwb3J0ZWRfZHJvcHM7CisgICAgYmNtb3NfdGltZXIgdGltZXI7CisgICAgdWludDMyX3QgbGFzdF9yZXBvcnRfdGltZXN0YW1wOworfSBiY21fZGV2X2xvZ19kcm9wOworCitzdGF0aWMgYmNtX2Rldl9sb2dfZHJvcCBkZXZfbG9nX2Ryb3A7CisKK3N0YXRpYyB2b2lkIGJjbV9kZXZfbG9nX2xvZ19tZXNzYWdlX3JlbGVhc2VfZHJvcChiY21vc19tc2cgKm0pCit7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgIGZsYWdzID0gYmNtb3NfZmFzdGxvY2tfbG9jaygmZGV2X2xvZ19kcm9wLm1zZy5mYXN0bG9jayk7CisgICAgZGV2X2xvZ19kcm9wLm1zZy5sb2NrID0gQkNNT1NfRkFMU0U7CisgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZkZXZfbG9nX2Ryb3AubXNnLmZhc3Rsb2NrLCBmbGFncyk7CisKKyAgICAvKiBTY2hlZHVsZSBhIHRpbWVyIHRvIHJlcG9ydCBleHRyYSBkcm9wcywgYmVjYXVzZSB3ZSBtYXkgbm90IG1lZXQgREVWX0xPR19EUk9QX1JFUE9SVF9EUk9QX1RIUkVTSE9MRCBzb29uLiAqLworICAgIGJjbW9zX3RpbWVyX3N0YXJ0KCZkZXZfbG9nX2Ryb3AudGltZXIsIERFVl9MT0dfRFJPUF9SRVBPUlRfUkFURV9VUyk7Cit9CisKK3N0YXRpYyB2b2lkIF9iY21fZGV2X2xvZ19kcm9wX3JlcG9ydCh2b2lkKQoreworICAgIGJjbW9zX21zZyAqbXNnOworICAgIGRldl9sb2dfcXVldWVfbXNnICpsb2dfcXVldWVfbXNnOworCisgICAgbXNnID0gJmRldl9sb2dfZHJvcC5tc2cubXNnOworICAgIG1zZy0+cmVsZWFzZSA9IGJjbV9kZXZfbG9nX2xvZ19tZXNzYWdlX3JlbGVhc2VfZHJvcDsKKyAgICBsb2dfcXVldWVfbXNnID0gJmRldl9sb2dfZHJvcC5tc2cubG9nX3F1ZXVlX21zZzsKKyAgICBsb2dfcXVldWVfbXNnLT5mbGFncyA9IEJDTV9MT0dfRkxBR19ET05UX1NLSVBfUFJJTlQ7CisgICAgbG9nX3F1ZXVlX21zZy0+dGltZV9zdGFtcCA9IGRldl9sb2cuZGV2X2xvZ19wYXJtLmdldF90aW1lX2NiKCk7CisgICAgbG9nX3F1ZXVlX21zZy0+bXNnX2xldmVsID0gREVWX0xPR19MRVZFTF9FUlJPUjsKKyAgICBsb2dfcXVldWVfbXNnLT51LmZtdF9hcmdzLmZtdCA9ICJMb2cgbWVzc2FnZSBwb29sIGV4aGF1c3RlZCwgZHJvcHBlZCBtZXNzYWdlIGNvdW50PSV1XG4iOworICAgIGxvZ19xdWV1ZV9tc2ctPnUuZm10X2FyZ3MuYXJnc1swXSA9IChjb25zdCB2b2lkICopKHVuc2lnbmVkIGxvbmcpKGRldl9sb2dfZHJvcC5kcm9wcyAtIGRldl9sb2dfZHJvcC5yZXBvcnRlZF9kcm9wcyk7CisgICAgbG9nX3F1ZXVlX21zZy0+dS5mbXRfYXJncy5hcmdzWzFdID0KKyAgICAgICAgbG9nX3F1ZXVlX21zZy0+dS5mbXRfYXJncy5hcmdzWzBdOyAvKiBhcmdzWzBdIG1heSBvciBtYXkgbm90IGJlIHNraXBwZWQgZGVwZW5kaW5nIG9uIGFsaWdubWVudCAqLworICAgIGxvZ19xdWV1ZV9tc2ctPmxvZ19pZCA9IChkZXZfbG9nX2lkX3Bhcm0gKilkZWZfbG9nX2lkOworICAgIGxvZ19xdWV1ZV9tc2ctPnRpbWVfc3RhbXAgPSBkZXZfbG9nLmRldl9sb2dfcGFybS5nZXRfdGltZV9jYigpOworICAgIGRldl9sb2dfZHJvcC5yZXBvcnRlZF9kcm9wcyA9IGRldl9sb2dfZHJvcC5kcm9wczsKKyAgICBkZXZfbG9nX2Ryb3AubGFzdF9yZXBvcnRfdGltZXN0YW1wID0gYmNtb3NfdGltZXN0YW1wKCk7CisKKyAgICBtc2ctPmRhdGEgPSBsb2dfcXVldWVfbXNnOworICAgIG1zZy0+c2l6ZSA9IHNpemVvZigqbG9nX3F1ZXVlX21zZyk7CisgICAgYmNtb3NfbXNnX3NlbmQoJmRldl9sb2cuc2F2ZV9xdWV1ZSwgbXNnLCAwKTsKK30KKwordm9pZCBiY21fZGV2X2xvZ19kcm9wX3JlcG9ydCh2b2lkKQoreworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICBkZXZfbG9nX2Ryb3AuZHJvcHMrKzsKKworICAgIGZsYWdzID0gYmNtb3NfZmFzdGxvY2tfbG9jaygmZGV2X2xvZ19kcm9wLm1zZy5mYXN0bG9jayk7CisgICAgLyogVGhlIDFzdCBkcm9wIHJlcG9ydCB3aWxsIGJlIGRvbmUgaW1tZWRpYXRlbHksIGJlY2F1c2UgYWx0aG91Z2ggREVWX0xPR19EUk9QX1JFUE9SVF9EUk9QX1RIUkVTSE9MRCBpc24ndCByZWFjaGVkLCB0aGUgdGltZSBkaWZmZXJlbmNlIGlzIGdyZWF0ZXIgdGhhbgorICAgICAqIERFVl9MT0dfRFJPUF9SRVBPUlRfUkFURV9VUy4gKi8KKyAgICBpZiAoZGV2X2xvZ19kcm9wLm1zZy5sb2NrIHx8CisgICAgICAgICgoZGV2X2xvZ19kcm9wLmRyb3BzIC0gZGV2X2xvZ19kcm9wLnJlcG9ydGVkX2Ryb3BzIDwgREVWX0xPR19EUk9QX1JFUE9SVF9EUk9QX1RIUkVTSE9MRCkgJiYKKyAgICAgICAgKGJjbW9zX3RpbWVzdGFtcCgpIC0gZGV2X2xvZ19kcm9wLmxhc3RfcmVwb3J0X3RpbWVzdGFtcCA8IERFVl9MT0dfRFJPUF9SRVBPUlRfUkFURV9VUykpKQorICAgIHsKKyAgICAgICAgYmNtb3NfZmFzdGxvY2tfdW5sb2NrKCZkZXZfbG9nX2Ryb3AubXNnLmZhc3Rsb2NrLCBmbGFncyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBkZXZfbG9nX2Ryb3AubXNnLmxvY2sgPSBCQ01PU19UUlVFOworICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmZGV2X2xvZ19kcm9wLm1zZy5mYXN0bG9jaywgZmxhZ3MpOworCisgICAgLyogRG8gdGhlIGFjdHVhbCByZXBvcnQuICovCisgICAgX2JjbV9kZXZfbG9nX2Ryb3BfcmVwb3J0KCk7Cit9CisKK3N0YXRpYyBiY21vc190aW1lcl9yYyBiY21fZGV2X2xvZ19kcm9wX3RpbWVyX2NiKGJjbW9zX3RpbWVyICp0aW1lciwgbG9uZyBkYXRhKQoreworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICBmbGFncyA9IGJjbW9zX2Zhc3Rsb2NrX2xvY2soJmRldl9sb2dfZHJvcC5tc2cuZmFzdGxvY2spOworICAgIGlmIChkZXZfbG9nX2Ryb3AubXNnLmxvY2spCisgICAgeworICAgICAgICBiY21vc19mYXN0bG9ja191bmxvY2soJmRldl9sb2dfZHJvcC5tc2cuZmFzdGxvY2ssIGZsYWdzKTsKKyAgICAgICAgLyogTG9nZ2VyIHRhc2sgaGFzbid0IHJlbGVhc2VkIHRoZSBsb2NrIHlldCAodGhlIGRyb3AgbWVzc2FnZSBoYXNuJ3QgYmVlbiByZXBvcnRlZCB5ZXQpIC0+IHJlc2NoZWR1bGUgdGhlIHRpbWVyLiAqLworICAgICAgICBiY21vc190aW1lcl9zdGFydCgmZGV2X2xvZ19kcm9wLnRpbWVyLCBERVZfTE9HX0RST1BfUkVQT1JUX1JBVEVfVVMpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoZGV2X2xvZ19kcm9wLmRyb3BzID09IGRldl9sb2dfZHJvcC5yZXBvcnRlZF9kcm9wcykKKyAgICAgICAgeworICAgICAgICAgICAgLyogTm8gbmV3IGRyb3BzIHRvIHJlcG9ydC4gKi8KKyAgICAgICAgICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmZGV2X2xvZ19kcm9wLm1zZy5mYXN0bG9jaywgZmxhZ3MpOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RJTUVSX09LOworICAgICAgICB9CisgICAgICAgIGRldl9sb2dfZHJvcC5tc2cubG9jayA9IEJDTU9TX1RSVUU7CisgICAgICAgIGJjbW9zX2Zhc3Rsb2NrX3VubG9jaygmZGV2X2xvZ19kcm9wLm1zZy5mYXN0bG9jaywgZmxhZ3MpOworCisgICAgICAgIC8qIERvIHRoZSBhY3R1YWwgcmVwb3J0LiAqLworICAgICAgICBfYmNtX2Rldl9sb2dfZHJvcF9yZXBvcnQoKTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVElNRVJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2luaXRfZGVmYXVsdF9sb2dnZXJfZXh0KAorICAgIGJjbV9kZXZfbG9nX3Bhcm0gKmRldl9sb2dfcGFybSwKKyAgICB1aW50MzJfdCBudW1fZmlsZXMsCisgICAgdWludDMyX3Qgc3RhY2tfc2l6ZSwKKyAgICBiY21vc190YXNrX3ByaW9yaXR5IHByaW9yaXR5LAorICAgIHVpbnQzMl90IHBvb2xfc2l6ZSkKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb3NfdGFza19wYXJtIHNhdmVfdGFza19wYXJtID0gezB9OworICAgIGJjbW9zX3Rhc2tfcGFybSBwcmludF90YXNrX3Bhcm0gPSB7MH07CisgICAgYmNtb3NfbXNnX3F1ZXVlX3Bhcm0gcHJpbnRfcXVldWVfcGFybSA9IHswfTsKKyAgICBiY21vc19tc2dfcXVldWVfcGFybSBzYXZlX3F1ZXVlX3Bhcm0gPSB7MH07CisgICAgYmNtb3NfbXNnX3Bvb2xfcGFybSBwb29sX3Bhcm0gPSB7MH07CisgICAgYmNtb3NfdGltZXJfcGFybSB0aW1lcl9wYXJhbXMgPQorICAgIHsKKyAgICAgICAgLm5hbWUgPSAiZGV2X2xvZ19kcm9wX3RpbWVyIiwKKyAgICAgICAgLm93bmVyID0gQkNNT1NfTU9EVUxFX0lEX05PTkUsIC8qIFdpbGwgYmUgY2FsbGVkIGluIElTUiBjb250ZXh0ICovCisgICAgICAgIC5oYW5kbGVyID0gYmNtX2Rldl9sb2dfZHJvcF90aW1lcl9jYiwKKyAgICB9OworCisgICAgaWYgKCFkZXZfbG9nX3Bhcm0pCisgICAgeworICAgICAgICBERVZfTE9HX0VSUk9SX1BSSU5URigiRXJyb3I6IGRldl9sb2dfcGFybSBtdXN0IGJlIHNldFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgc2F2ZV90YXNrX3Bhcm0ucHJpb3JpdHkgPSBwcmlvcml0eTsKKyAgICBzYXZlX3Rhc2tfcGFybS5zdGFja19zaXplID0gc3RhY2tfc2l6ZTsKKyAgICBzYXZlX3Rhc2tfcGFybS5uYW1lID0gImRldl9sb2dfc2F2ZSI7CisgICAgc2F2ZV90YXNrX3Bhcm0uaGFuZGxlciA9IGRldl9sb2dfc2F2ZV90YXNrOworICAgIHNhdmVfdGFza19wYXJtLmRhdGEgPSAwOworCisgICAgcHJpbnRfdGFza19wYXJtLnByaW9yaXR5ID0gcHJpb3JpdHk7CisgICAgcHJpbnRfdGFza19wYXJtLnN0YWNrX3NpemUgPSBzdGFja19zaXplOworICAgIHByaW50X3Rhc2tfcGFybS5uYW1lID0gImRldl9sb2dfcHJpbnQiOworICAgIHByaW50X3Rhc2tfcGFybS5oYW5kbGVyID0gZGV2X2xvZ19wcmludF90YXNrOworICAgIHByaW50X3Rhc2tfcGFybS5kYXRhID0gMDsKKworICAgIC8qIEl0IGlzIGltcG9ydGFudCB0byBhdm9pZCB0ZXJtaW5hdGluZyBsb2dnZXIgdGFzayBkdXJpbmcgYW4gZXhjZXB0aW9uLCBhcyBsb2dnZXIgdGFzayBpcyBsb3cgcHJpb3JpdHkgYW5kIG1pZ2h0IGhhdmUgYmFja2xvZyBvZiB1bmhhbmRsZWQgbWVzc2FnZXMuCisgICAgICogRXZlbiBpZiBhcyBhIHJlc3VsdCBvZiB0aGUgZXhjZXB0aW9uIHRoZSBsb2dnZXIgdGFzayB3aWxsIGJlIGluIGEgZGVhZGxvY2sgd2FpdGluZyBmb3IgYSByZXNvdXJjZSAoc2VtYXBob3JlL211dGV4L3RpbWVyKSwgaXQgaXMgaW4gbG93ZXIgcHJpb3JpdHkgdGhhbiBDTEkgYW5kIHRodXMgc2hvdWxkIG5vdCBibG9jaworICAgICAqIENMSS4gKi8KKyAgICBzYXZlX3Rhc2tfcGFybS5mbGFncyA9IEJDTU9TX1RBU0tfRkxBR19OT19TVVNQRU5EX09OX09PUFM7CisgICAgcHJpbnRfdGFza19wYXJtLmZsYWdzID0gQkNNT1NfVEFTS19GTEFHX05PX1NVU1BFTkRfT05fT09QUzsKKworICAgIHNhdmVfcXVldWVfcGFybS5uYW1lID0gImRldl9sb2dfc2F2ZSI7CisgICAgc2F2ZV9xdWV1ZV9wYXJtLnNpemUgPSAwOyAvKiB1bmxpbWl0ZWQgKi8KKyAgICBwcmludF9xdWV1ZV9wYXJtLm5hbWUgPSAiZGV2X2xvZ19wcmludCI7CisgICAgcHJpbnRfcXVldWVfcGFybS5zaXplID0gMDsgLyogdW5saW1pdGVkICovCisKKyAgICBwb29sX3Bhcm0ubmFtZSA9ICJkZXZfbG9nIjsKKyAgICBwb29sX3Bhcm0uc2l6ZSA9IHBvb2xfc2l6ZTsKKyAgICBwb29sX3Bhcm0uZGF0YV9zaXplID0gc2l6ZW9mKGRldl9sb2dfcXVldWVfbXNnKTsKKworICAgIGRlZl9sb2dfaWQgPSBiY21fZGV2X2xvZ19pZF9yZWdpc3RlcigiZGVmYXVsdCIsIERFVl9MT0dfTEVWRUxfSU5GTywgREVWX0xPR19JRF9UWVBFX0JPVEgpOworICAgIGVyciA9IGJjbW9zX3RpbWVyX2NyZWF0ZSgmZGV2X2xvZ19kcm9wLnRpbWVyLCAmdGltZXJfcGFyYW1zKTsKKyAgICBCQ01PU19UUkFDRV9DSEVDS19SRVRVUk4oZXJyLCBlcnIsICJiY21vc190aW1lcl9jcmVhdGUiKTsKKyAgICBiY21vc19mYXN0bG9ja19pbml0KCZkZXZfbG9nX2Ryb3AubXNnLmZhc3Rsb2NrLCAwKTsKKworICAgIGlmICghZGV2X2xvZ19wYXJtLT5nZXRfdGltZV9jYikKKyAgICAgICAgZGV2X2xvZ19wYXJtLT5nZXRfdGltZV9jYiA9IGJjbW9zX3RpbWVzdGFtcDsKKworICAgIGVyciA9IGJjbV9kZXZfbG9nX2NyZWF0ZSgKKyAgICAgICAgZGV2X2xvZ19wYXJtLAorICAgICAgICAmc2F2ZV90YXNrX3Bhcm0sCisgICAgICAgICZwcmludF90YXNrX3Bhcm0sCisgICAgICAgICZzYXZlX3F1ZXVlX3Bhcm0sCisgICAgICAgICZwcmludF9xdWV1ZV9wYXJtLAorICAgICAgICAmcG9vbF9wYXJtKTsKKyAgICBCQ01PU19UUkFDRV9DSEVDS19SRVRVUk4oZXJyLCBlcnIsICJiY21fZGV2X2xvZ19jcmVhdGUiKTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfaW5pdF9kZWZhdWx0X2xvZ2dlcih2b2lkICoqc3RhcnRfYWRkcmVzc2VzLAorICAgIHVpbnQzMl90ICpzaXplcywKKyAgICBiY21fZGV2X2xvZ19maWxlX2ZsYWdzICpmbGFncywKKyAgICB1aW50MzJfdCBudW1fZmlsZXMsCisgICAgdWludDMyX3Qgc3RhY2tfc2l6ZSwKKyAgICBiY21vc190YXNrX3ByaW9yaXR5IHByaW9yaXR5LAorICAgIHVpbnQzMl90IHBvb2xfc2l6ZSkKK3sKKyAgICBiY21fZGV2X2xvZ19wYXJtIGRldl9sb2dfcGFybSA9IHswfTsKKyAgICB1aW50MzJfdCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IG51bV9maWxlczsgaSsrKQorICAgIHsKKyAgICAgICAgZGV2X2xvZ19wYXJtLmxvZ19maWxlW2ldLnN0YXJ0X2FkZHIgPSBzdGFydF9hZGRyZXNzZXNbaV07CisgICAgICAgIGRldl9sb2dfcGFybS5sb2dfZmlsZVtpXS5zaXplID0gc2l6ZXNbaV07CisgICAgICAgIC8qIHNpemVbaV0gbWlnaHQgYmUgMCBpbiBzaW11bGF0aW9uIGJ1aWxkIGZvciBzcmFtIGJ1ZmZlci4gKi8KKyAgICAgICAgZGV2X2xvZ19wYXJtLmxvZ19maWxlW2ldLmZsYWdzID0gKHNpemVzW2ldID8gQkNNX0RFVl9MT0dfRklMRV9GTEFHX1ZBTElEIDogQkNNX0RFVl9MT0dfRklMRV9GTEFHX05PTkUpIHwKKyAgICAgICAgICAgIChmbGFncyA/IGZsYWdzW2ldIDogQkNNX0RFVl9MT0dfRklMRV9GTEFHX1dSQVBfQVJPVU5EKTsKKyAgICB9CisKKyAgICByZXR1cm4gYmNtX2Rldl9sb2dfaW5pdF9kZWZhdWx0X2xvZ2dlcl9leHQoJmRldl9sb2dfcGFybSwgbnVtX2ZpbGVzLCBzdGFja19zaXplLCBwcmlvcml0eSwKKyAgICAgICAgcG9vbF9zaXplKTsKK30KKworbG9nX25hbWVfdGFibGUgbG9nc19uYW1lc1tERVZfTE9HX01BWF9JRFNdOwordWludDhfdCBsb2dfbmFtZV90YWJsZV9pbmRleCA9IDA7CisKK3N0YXRpYyB2b2lkIGRldl9sb2dfYWRkX2xvZ19uYW1lX3RvX3RhYmxlKGNvbnN0IGNoYXIgKnhpX25hbWUpCit7CisgICAgY2hhciBuYW1lW01BWF9ERVZfTE9HX0lEX05BTUUgKyAxXSA9IHt9OworICAgIGNoYXIgKnAgPSBuYW1lOworICAgIGNoYXIgKnBfZW5kOworICAgIGludCBpID0gMDsKKyAgICBsb25nIHZhbCA9IC0xOworCisgICAgc3RybmNweShuYW1lLCB4aV9uYW1lLCBNQVhfREVWX0xPR19JRF9OQU1FKTsKKyAgICB3aGlsZSAoKnApCisgICAgeworICAgICAgICAvKiBXaGlsZSB0aGVyZSBhcmUgbW9yZSBjaGFyYWN0ZXJzIHRvIHByb2Nlc3MuLi4gKi8KKyAgICAgICAgaWYgKGlzZGlnaXQoKnApKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBVcG9uIGZpbmRpbmcgYSBkaWdpdCwgLi4uICovCisgICAgICAgICAgICB2YWwgPSBzdHJ0b2wocCwgJnBfZW5kLCAxMCk7IC8qIFJlYWQgYSBudW1iZXIsIC4uLiAqLworICAgICAgICAgICAgaWYgKChuYW1lICsgc3RybGVuKG5hbWUpKSAhPSBwX2VuZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBERVZfTE9HX0VSUk9SX1BSSU5URigiRXJyb3I6IGRldl9sb2dfYWRkX2xvZ19uYW1lX3RvX3RhYmxlICVzKVxuIiwgeGlfbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqcCA9ICdcMCc7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogT3RoZXJ3aXNlLCBtb3ZlIG9uIHRvIHRoZSBuZXh0IGNoYXJhY3Rlci4gKi8KKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbG9nX25hbWVfdGFibGVfaW5kZXg7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChzdHJjbXAobmFtZSwgbG9nc19uYW1lc1tpXS5uYW1lKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodmFsIDwgbG9nc19uYW1lc1tpXS5maXJzdF9pbnN0YW5jZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dzX25hbWVzW2ldLmZpcnN0X2luc3RhbmNlID0gdmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHZhbCA+IGxvZ3NfbmFtZXNbaV0ubGFzdF9pbnN0YW5jZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dzX25hbWVzW2ldLmxhc3RfaW5zdGFuY2UgPSB2YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoKGkgPT0gbG9nX25hbWVfdGFibGVfaW5kZXgpICYmIChpIDwgREVWX0xPR19NQVhfSURTKSkKKyAgICB7CisgICAgICAgIHN0cm5jcHkobG9nc19uYW1lc1tpXS5uYW1lLCBuYW1lLCBNQVhfREVWX0xPR19JRF9OQU1FKTsKKyAgICAgICAgaWYgKHZhbCA9PSAtMSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsID0gTE9HX05BTUVfTk9fSU5TVEFOQ0U7CisgICAgICAgIH0KKyAgICAgICAgbG9nc19uYW1lc1tpXS5sYXN0X2luc3RhbmNlID0gdmFsOworICAgICAgICBsb2dzX25hbWVzW2ldLmZpcnN0X2luc3RhbmNlID0gdmFsOworICAgICAgICBsb2dfbmFtZV90YWJsZV9pbmRleCsrOworICAgIH0KK30KKwordm9pZCBkZXZfbG9nX2dldF9sb2dfbmFtZV90YWJsZShjaGFyICpidWZmZXIsIHVpbnQzMl90IGJ1Zl9sZW4pCit7CisgICAgdWludDMyX3QgaSA9IDA7CisgICAgdWludDMyX3QgYnVmX2xlbl9mcmVlICA9IGJ1Zl9sZW47CisKKyAgICBidWZmZXJbMF0gPSAnXDAnOworICAgIGZvciAoaSA9IDA7IGkgPCBsb2dfbmFtZV90YWJsZV9pbmRleDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKGxvZ3NfbmFtZXNbaV0uZmlyc3RfaW5zdGFuY2UgPT0gTE9HX05BTUVfTk9fSU5TVEFOQ0UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNucHJpbnRmKCZidWZmZXJbc3RybGVuKGJ1ZmZlcildLCBidWZfbGVuX2ZyZWUsICIlc1xuIiwgbG9nc19uYW1lc1tpXS5uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHNucHJpbnRmKCZidWZmZXJbc3RybGVuKGJ1ZmZlcildLCBidWZfbGVuX2ZyZWUsICIlcyAlZCAtICVkXG4iLCBsb2dzX25hbWVzW2ldLm5hbWUsIGxvZ3NfbmFtZXNbaV0uZmlyc3RfaW5zdGFuY2UsIGxvZ3NfbmFtZXNbaV0ubGFzdF9pbnN0YW5jZSk7CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyW2J1Zl9sZW4gLSAxXSA9ICdcMCc7CisgICAgICAgIGJ1Zl9sZW5fZnJlZSA9IGJ1Zl9sZW4gLSBzdHJsZW4oYnVmZmVyKTsKKyAgICAgICAgaWYgKGJ1Zl9sZW5fZnJlZSA8PSAxKQorICAgICAgICB7CisgICAgICAgICAgICBERVZfTE9HX0VSUk9SX1BSSU5URigiRXJyb3I6IGRldl9sb2dfZ2V0X2xvZ19uYW1lX3RhYmxlIHRvbyBsb25nXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCitkZXZfbG9nX2lkIGJjbV9kZXZfbG9nX2lkX3JlZ2lzdGVyKGNvbnN0IGNoYXIgKnhpX25hbWUsCisgICAgYmNtX2Rldl9sb2dfbGV2ZWwgeGlfZGVmYXVsdF9sb2dfbGV2ZWwsCisgICAgYmNtX2Rldl9sb2dfaWRfdHlwZSB4aV9kZWZhdWx0X2xvZ190eXBlKQoreworICAgIGRldl9sb2dfaWRfcGFybSAqbmV3X2lkOworCisgICAgLyogQ2hlY2sgdGhhdCB3ZSBoYXZlIHJvb20gZm9yIG9uZSBtb3JlIElEICovCisgICAgaWYgKGRldl9sb2cubnVtX2lkcyA9PSBCQ01fU0laRU9GQVJSQVkoZGV2X2xvZy5pZHMpKQorICAgIHsKKyAgICAgICAgREVWX0xPR19FUlJPUl9QUklOVEYoIkVycm9yOiB3cm9uZyBwYXJhbWV0ZXJzXG4iKTsKKyAgICAgICAgcmV0dXJuIERFVl9MT0dfSU5WQUxJRF9JRDsKKyAgICB9CisKKyAgICAvKiBHZXQgbmV4dCBmcmVlIGxvZ19pZCBpbiBhcnJheSBhbmQgaW5jcmVtZW50IG5leHRfaWQuCisgICAgICogVGhlIG5ld19pZCBzdHJ1Y3R1cmUgaXMgY2xlYW4gYmVjYXVzZSB0aGUgd2hvbGUgZGV2X2xvZyBhcnJheSBpcyBpbiBCU1MKKyAgICAgKi8KKyAgICBuZXdfaWQgPSAmZGV2X2xvZy5pZHNbZGV2X2xvZy5udW1faWRzKytdOworCisgICAgLyogQWRkIHByZWZpeCBmb3Iga2VybmVsIGxvZ19pZHMgaW4gb3JkZXIgdG8gYXZvaWQgY2xhc2ggd2l0aCBzaW1pbGFybHktbmFtZXMgbG9ncyBpbiB0aGUgdXNlciBzcGFjZSAqLworI2lmZGVmIF9fS0VSTkVMX18KKyAgICBzdHJjcHkobmV3X2lkLT5uYW1lLCAia18iKTsKKyNlbmRpZgorCisgICAgLyogU2V0IGxvZ19pZCBwYXJhbWV0ZXJzICovCisgICAgc3RybmNhdChuZXdfaWQtPm5hbWUsIHhpX25hbWUsIHNpemVvZihuZXdfaWQtPm5hbWUpLXN0cmxlbihuZXdfaWQtPm5hbWUpKTsKKyAgICBuZXdfaWQtPm5hbWVbTUFYX0RFVl9MT0dfSURfTkFNRS0xXSA9ICdcMCc7CisKKyAgICBuZXdfaWQtPmRlZmF1bHRfbG9nX3R5cGUgID0geGlfZGVmYXVsdF9sb2dfdHlwZTsKKyAgICBuZXdfaWQtPmRlZmF1bHRfbG9nX2xldmVsID0geGlfZGVmYXVsdF9sb2dfbGV2ZWw7CisKKyAgICBkZXZfbG9nX2FkZF9sb2dfbmFtZV90b190YWJsZShuZXdfaWQtPm5hbWUpOworCisgICAgYmNtX2Rldl9sb2dfaWRfc2V0X2xldmVsc19hbmRfdHlwZV90b19kZWZhdWx0KChkZXZfbG9nX2lkKW5ld19pZCk7CisgICAgbmV3X2lkLT5zdHlsZSA9IEJDTV9ERVZfTE9HX1NUWUxFX05PUk1BTDsKKworICAgIHJldHVybiAoZGV2X2xvZ19pZCluZXdfaWQ7Cit9CisKK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2lkX3NldF90eXBlKGRldl9sb2dfaWQgeGlfaWQsIGJjbV9kZXZfbG9nX2lkX3R5cGUgeGlfbG9nX3R5cGUpCit7CisgICAgZGV2X2xvZ19pZF9wYXJtICppZCA9IChkZXZfbG9nX2lkX3Bhcm0gKil4aV9pZDsKKworICAgIGlmICgheGlfaWQgfHwgKHhpX2lkID09IERFVl9MT0dfSU5WQUxJRF9JRCkpCisgICAgeworICAgICAgICBERVZfTE9HX0VSUk9SX1BSSU5URigiRXJyb3I6IHhpX2lkIG5vdCB2YWxpZCAoMHgleClcbiIsICh1bnNpZ25lZCBpbnQpeGlfaWQpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIC8qIEluIGxpbnV4IGtlcm5lbCB3ZSBvbmx5IHN1cHBvcnQgc2F2ZSAqLworI2lmZGVmIF9fS0VSTkVMX18KKyAgICBpZiAoeGlfbG9nX3R5cGUgJiBERVZfTE9HX0lEX1RZUEVfQk9USCkKKyAgICAgICAgeGlfbG9nX3R5cGUgPSBERVZfTE9HX0lEX1RZUEVfU0FWRTsKKyNlbmRpZgorCisgICAgREVWX0xPR19JTkZPX1BSSU5URigiSUQ6IDB4JWx4LCBOZXcgbG9nIHR5cGU6ICVkXG4iLCB4aV9pZCwgKGludCl4aV9sb2dfdHlwZSk7CisKKyAgICBpZC0+bG9nX3R5cGUgPSB4aV9sb2dfdHlwZTsKKworICAgIC8qIEluIGxpbnV4IHVzZXIgc3BhY2Ugd2UgbmVlZCB0byBub3RpZnkga2VybmVsIGludGVncmF0aW9uIGNvZGUgKi8KKyNpZiBkZWZpbmVkKExJTlVYX0tFUk5FTF9TUEFDRSkgJiYgIWRlZmluZWQoX19LRVJORUxfXykKKyAgICBiY21fZGV2X2xvZ19saW51eF9pZF9zZXRfdHlwZSh4aV9pZCwgeGlfbG9nX3R5cGUpOworI2VuZGlmCisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfaWRfc2V0X2xldmVsKGRldl9sb2dfaWQgeGlfaWQsIGJjbV9kZXZfbG9nX2xldmVsIHhpX2xvZ19sZXZlbF9wcmludCwgYmNtX2Rldl9sb2dfbGV2ZWwgeGlfbG9nX2xldmVsX3NhdmUpCit7CisgICAgZGV2X2xvZ19pZF9wYXJtICppZCA9IChkZXZfbG9nX2lkX3Bhcm0gKil4aV9pZDsKKworICAgIGlmICgheGlfaWQgfHwgKHhpX2lkID09IERFVl9MT0dfSU5WQUxJRF9JRCkpCisgICAgeworICAgICAgICBERVZfTE9HX0VSUk9SX1BSSU5URigiRXJyb3I6IHhpX2lkIG5vdCB2YWxpZCAoMHgleClcbiIsICh1bnNpZ25lZCBpbnQpeGlfaWQpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIGlmICgoeGlfbG9nX2xldmVsX3ByaW50ID49IERFVl9MT0dfTEVWRUxfTlVNX09GKSB8fCAoeGlfbG9nX2xldmVsX3NhdmUgPj0gREVWX0xPR19MRVZFTF9OVU1fT0YpKQorICAgIHsKKyAgICAgICAgREVWX0xPR19FUlJPUl9QUklOVEYoIkVycm9yOiB3cm9uZyBwYXJhbWV0ZXJzXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBERVZfTE9HX0lORk9fUFJJTlRGKCJJRDogMHglcCwgTmV3OiB4aV9sb2dfbGV2ZWxfcHJpbnQ9JXUsIHhpX2xvZ19sZXZlbF9zYXZlPSV1XG4iLAorICAgICAgICAodm9pZCAqKWlkLAorICAgICAgICB4aV9sb2dfbGV2ZWxfcHJpbnQsCisgICAgICAgIHhpX2xvZ19sZXZlbF9zYXZlKTsKKworICAgIGlkLT5sb2dfbGV2ZWxfcHJpbnQgPSB4aV9sb2dfbGV2ZWxfcHJpbnQ7CisgICAgaWQtPmxvZ19sZXZlbF9zYXZlID0geGlfbG9nX2xldmVsX3NhdmU7CisKKyAgICAvKiBJbiBsaW51eCB1c2VyIHNwYWNlIHdlIG5lZWQgdG8gbm90aWZ5IGtlcm5lbCBpbnRlZ3JhdGlvbiBjb2RlICovCisjaWYgZGVmaW5lZChMSU5VWF9LRVJORUxfU1BBQ0UpICYmICFkZWZpbmVkKF9fS0VSTkVMX18pCisgICAgYmNtX2Rldl9sb2dfbGludXhfaWRfc2V0X2xldmVsKHhpX2lkLCB4aV9sb2dfbGV2ZWxfcHJpbnQsIHhpX2xvZ19sZXZlbF9zYXZlKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2lkX3NldF9sZXZlbHNfYW5kX3R5cGVfdG9fZGVmYXVsdChkZXZfbG9nX2lkIHhpX2lkKQoreworICAgIGRldl9sb2dfaWRfcGFybSAqaWQgPSAoZGV2X2xvZ19pZF9wYXJtICopeGlfaWQ7CisKKyAgICBpZiAoIXhpX2lkIHx8ICh4aV9pZCA9PSBERVZfTE9HX0lOVkFMSURfSUQpKQorICAgIHsKKyAgICAgICAgREVWX0xPR19FUlJPUl9QUklOVEYoIkVycm9yOiB4aV9pZCBub3QgdmFsaWQgKDB4JXgpXG4iLCAodW5zaWduZWQgaW50KXhpX2lkKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBpZC0+bG9nX2xldmVsX3ByaW50ID0gaWQtPmRlZmF1bHRfbG9nX2xldmVsOworICAgIGlkLT5sb2dfbGV2ZWxfc2F2ZSA9IGlkLT5kZWZhdWx0X2xvZ19sZXZlbDsKKyAgICBpZC0+bG9nX3R5cGUgPSBpZC0+ZGVmYXVsdF9sb2dfdHlwZTsKKworI2lmZGVmIFRSSUdHRVJfTE9HR0VSX0ZFQVRVUkUKKyAgICBtZW1zZXQoJmlkLT50aHJvdHRsZSwwLCBzaXplb2YoZGV2X2xvZ19pZF90aHJvdHRsZSkpOworICAgIG1lbXNldCgmaWQtPnRyaWdnZXIsIDAsIHNpemVvZihkZXZfbG9nX2lkX3RyaWdnZXIpKTsKKyAgICBpZC0+dGhyb3R0bGVfbG9nX2xldmVsID0gREVWX0xPR19MRVZFTF9OT19MT0c7CisgICAgaWQtPnRyaWdnZXJfbG9nX2xldmVsID0gREVWX0xPR19MRVZFTF9OT19MT0c7CisjZW5kaWYKKworICAgIC8qIEluIGxpbnV4IGtlcm5lbCBzcGFjZSB3ZSBkb24ndCBzdXBwb3J0IFBSSU5ULCBvbmx5IFNBVkUgKi8KKyNpZmRlZiBfX0tFUk5FTF9fCisgICAgaWYgKGlkLT5sb2dfdHlwZSAmIERFVl9MT0dfSURfVFlQRV9CT1RIKQorICAgICAgICBpZC0+bG9nX3R5cGUgPSBERVZfTE9HX0lEX1RZUEVfU0FWRTsKKyNlbmRpZgorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3ZvaWQgYmNtX2Rldl9sb2dfbGV2ZWxfc2V0X3N0eWxlKGJjbV9kZXZfbG9nX2xldmVsIGxldmVsLCBiY21fZGV2X2xvZ19zdHlsZSB4aV9zdHlsZSkKK3sKKyAgICBkZXZfbG9nX2xldmVsMnN0eWxlW2xldmVsXSA9IHhpX3N0eWxlOworfQorCitiY21vc19lcnJubyBiY21fZGV2X2xvZ19pZF9zZXRfc3R5bGUoZGV2X2xvZ19pZCB4aV9pZCwgYmNtX2Rldl9sb2dfc3R5bGUgeGlfc3R5bGUpCit7CisgICAgZGV2X2xvZ19pZF9wYXJtICppZCA9IChkZXZfbG9nX2lkX3Bhcm0gKil4aV9pZDsKKworICAgIGlmICgheGlfaWQgfHwgKHhpX2lkID09IERFVl9MT0dfSU5WQUxJRF9JRCkpCisgICAgeworICAgICAgICBERVZfTE9HX0VSUk9SX1BSSU5URigiRXJyb3I6IHhpX2lkIG5vdCB2YWxpZCAoMHgleClcbiIsICh1bnNpZ25lZCBpbnQpeGlfaWQpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKyAgICBpZC0+c3R5bGUgPSB4aV9zdHlsZTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfaWRfY2xlYXJfY291bnRlcnMoZGV2X2xvZ19pZCB4aV9pZCkKK3sKKyAgICBkZXZfbG9nX2lkX3Bhcm0gKmlkID0gKGRldl9sb2dfaWRfcGFybSAqKXhpX2lkOworCisgICAgaWYgKCF4aV9pZCB8fCAoeGlfaWQgPT0gREVWX0xPR19JTlZBTElEX0lEKSkKKyAgICB7CisgICAgICAgIERFVl9MT0dfRVJST1JfUFJJTlRGKCJFcnJvcjogeGlfaWQgbm90IHZhbGlkICgweCV4KVxuIiwgKHVuc2lnbmVkIGludCl4aV9pZCk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorICAgIG1lbXNldChpZC0+Y291bnRlcnMsIDAsIHNpemVvZihpZC0+Y291bnRlcnMpKTsKKyAgICBpZC0+bG9zdF9tc2dfY250ID0gMDsKKyAgICBpZC0+cHJpbnRfc2tpcHBlZF9jb3VudCA9IDA7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfaWRfZ2V0KGRldl9sb2dfaWQgeGlfaWQsIGRldl9sb2dfaWRfcGFybSAqeG9faWQpCit7CisgICAgZGV2X2xvZ19pZF9wYXJtICppZCA9IChkZXZfbG9nX2lkX3Bhcm0gKil4aV9pZDsKKworICAgIGlmICgheGlfaWQgfHwgKHhpX2lkID09IERFVl9MT0dfSU5WQUxJRF9JRCkpCisgICAgeworICAgICAgICBERVZfTE9HX0VSUk9SX1BSSU5URigiRXJyb3I6IHhpX2lkIG5vdCB2YWxpZCAoMHgleClcbiIsICh1bnNpZ25lZCBpbnQpeGlfaWQpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgICp4b19pZCA9ICppZDsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19lcnJubyBiY21fZGV2X2xvZ19pZF9zZXQoZGV2X2xvZ19pZCB4aV9pZCwgZGV2X2xvZ19pZF9wYXJtICpwYXJtcykKK3sKKyAgICBkZXZfbG9nX2lkX3Bhcm0gKmlkID0gKGRldl9sb2dfaWRfcGFybSAqKXhpX2lkOworCisgICAgaWYgKCF4aV9pZCB8fCAoeGlfaWQgPT0gREVWX0xPR19JTlZBTElEX0lEKSkKKyAgICB7CisgICAgICAgIERFVl9MT0dfRVJST1JfUFJJTlRGKCJFcnJvcjogeGlfaWQgbm90IHZhbGlkICgweCV4KVxuIiwgKHVuc2lnbmVkIGludCl4aV9pZCk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgKmlkID0gKnBhcm1zOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2Rldl9sb2dfaWQgYmNtX2Rldl9sb2dfaWRfZ2V0X2J5X2luZGV4KHVpbnQzMl90IHhpX2luZGV4KQoreworICAgIGlmICh4aV9pbmRleCA+PSBkZXZfbG9nLm51bV9pZHMpCisgICAgeworICAgICAgICByZXR1cm4gREVWX0xPR19JTlZBTElEX0lEOworICAgIH0KKyAgICByZXR1cm4gKGRldl9sb2dfaWQpJihkZXZfbG9nLmlkc1t4aV9pbmRleF0pOworfQorCit1aW50MzJfdCBiY21fZGV2X2xvZ19nZXRfaW5kZXhfYnlfaWQoZGV2X2xvZ19pZCB4aV9pZCkKK3sKKyAgICB1aW50MzJfdCBpZHggPSAoZGV2X2xvZ19pZF9wYXJtICopeGlfaWQgLSAmZGV2X2xvZy5pZHNbMF07CisgICAgaWYgKGlkeCA+PSBkZXZfbG9nLm51bV9pZHMpCisgICAgICAgIGlkeCA9IERFVl9MT0dfSU5WQUxJRF9JTkRFWDsKKyAgICByZXR1cm4gaWR4OworfQorCitkZXZfbG9nX2lkIGJjbV9kZXZfbG9nX2lkX2dldF9ieV9uYW1lKGNvbnN0IGNoYXIgKnhpX25hbWUpCit7CisgICAgdWludDMyX3QgaTsKKworICAgIGlmICh4aV9uYW1lID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gREVWX0xPR19JTlZBTElEX0lEOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGk8ZGV2X2xvZy5udW1faWRzOyBpKyspCisgICAgeworICAgICAgICBpZiAoIXN0cmNtcChkZXZfbG9nLmlkc1tpXS5uYW1lLCB4aV9uYW1lKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChkZXZfbG9nX2lkKSYoZGV2X2xvZy5pZHNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgREVWX0xPR19FUlJPUl9QUklOVEYoIkVycm9yOiBjYW4ndCBmaW5kIG5hbWVcbiIpOworICAgIHJldHVybiBERVZfTE9HX0lOVkFMSURfSUQ7Cit9CisKK3VpbnQzMl90IGJjbV9kZXZfbG9nX2dldF9udW1fb2ZfZW50cmllcyh2b2lkKQoreworICAgIHJldHVybiBkZXZfbG9nLm51bV9pZHM7Cit9CisKK2JjbW9zX2Jvb2wgYmNtX2Rldl9sb2dfZ2V0X2NvbnRyb2wodm9pZCkKK3sKKyAgICByZXR1cm4gZGV2X2xvZy5zdGF0ZSA9PSBCQ01fREVWX0xPR19TVEFURV9FTkFCTEVEOworfQorCit1aW50MzJfdCBiY21fZGV2X2xvZ19nZXRfbnVtX29mX21lc3NhZ2VzKGJjbV9kZXZfbG9nX2ZpbGUgKmZpbGUpCit7CisgICAgcmV0dXJuIGZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIubnVtX21zZ3M7Cit9CisKK3ZvaWQgYmNtX2Rldl9sb2dfc2V0X2NvbnRyb2woYmNtb3NfYm9vbCBjb250cm9sKQoreworICAgIGlmIChjb250cm9sICYmIGRldl9sb2cuc3RhdGUgPT0gQkNNX0RFVl9MT0dfU1RBVEVfRElTQUJMRUQpCisgICAgICAgIGRldl9sb2cuc3RhdGUgPSBCQ01fREVWX0xPR19TVEFURV9FTkFCTEVEOworICAgIGVsc2UgaWYgKCFjb250cm9sICYmIGRldl9sb2cuc3RhdGUgPT0gQkNNX0RFVl9MT0dfU1RBVEVfRU5BQkxFRCkKKyAgICAgICAgZGV2X2xvZy5zdGF0ZSA9IEJDTV9ERVZfTE9HX1NUQVRFX0RJU0FCTEVEOworfQorCitiY21fZGV2X2xvZ19maWxlX2ZsYWdzIGJjbV9kZXZfbG9nX2dldF9maWxlX2ZsYWdzKHVpbnQzMl90IGZpbGVfaWQpCit7CisgICAgcmV0dXJuIGRldl9sb2cuZmlsZXNbZmlsZV9pZF0uZmlsZV9wYXJtLmZsYWdzOworfQorCit2b2lkIGJjbV9kZXZfbG9nX3NldF9maWxlX2ZsYWdzKHVpbnQzMl90IGZpbGVfaWQsIGJjbV9kZXZfbG9nX2ZpbGVfZmxhZ3MgZmxhZ3MpCit7CisgICAgZGV2X2xvZy5maWxlc1tmaWxlX2lkXS5maWxlX3Bhcm0uZmxhZ3MgPSBmbGFnczsKK30KKworYmNtX2Rldl9sb2dfZmxhZ3MgYmNtX2Rldl9sb2dfZ2V0X2ZsYWdzKHZvaWQpCit7CisgICAgcmV0dXJuIGRldl9sb2cuZmxhZ3M7Cit9CisKK3ZvaWQgYmNtX2Rldl9sb2dfc2V0X2ZsYWdzKGJjbV9kZXZfbG9nX2ZsYWdzIGZsYWdzKQoreworICAgIGRldl9sb2cuZmxhZ3MgPSBmbGFnczsKK30KKwordm9pZCBiY21fZGV2X2xvZ19zZXRfcHJpbnRfY2IoYmNtX2Rldl9sb2dfcHJpbnRfY2IgY2IpCit7CisgICAgZGV2X2xvZy5kZXZfbG9nX3Bhcm0ucHJpbnRfY2IgPSBjYjsKK30KKwordm9pZCBiY21fZGV2X2xvZ19zZXRfZ2V0X3RpbWVfY2IoYmNtX2Rldl9sb2dfZ2V0X3RpbWVfY2IgY2IpCit7CisgICAgZGV2X2xvZy5kZXZfbG9nX3Bhcm0uZ2V0X3RpbWVfY2IgPSBjYjsKK30KKwordm9pZCBiY21fZGV2X2xvZ19zZXRfdGltZV90b19zdHJfY2IoYmNtX2Rldl9sb2dfdGltZV90b19zdHJfY2IgY2IpCit7CisgICAgZGV2X2xvZy5kZXZfbG9nX3Bhcm0udGltZV90b19zdHJfY2IgPSBjYjsKK30KKworI2lmZGVmIFRSSUdHRVJfTE9HR0VSX0ZFQVRVUkUKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkqLworLyogTmFtZTogYmNtX2Rldl9sb2dfc2V0X3Rocm90dGxlCQkJCQkJCQkJCQkJCQkJKi8KKy8qCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkqLworLyogQWJzdHJhY3Q6IFNldCB0aHJvdHRsZSBsZXZlbCBmb3IgdGhlIHNwZWNpZmljIGxvZyBpcyBhbmQgaXRzIGxldmVsCQkJCQkJKi8KKy8qCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkqLworLyogQXJndW1lbnRzOgkJCQkJCQkJCQkJCQkJCQkJCQkJKi8KKy8qICAgLSB4aV9pZAkJLSBUaGUgSUQgaW4gdGhlIERldiBsb2cgKHdoYXQgd2UgZ290IGZvcm0gYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIpCQkqLworLyogICAtIHhpX2xvZ19sZXZlbAktIGxvZyBsZXZlbAkJCQkJCQkJCQkJCSAgICAgICAgICAgICAgICAqLworLyogICAtIHhpX3Rocm90dGxlCS0gdGhyb3R0bGUgbnVtYmVyLCAwIC0gbm8gdGhyb3R0bGUJCQkJCQkJCQkJKi8KKy8qCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkqLworLyogUmV0dXJuIFZhbHVlOgkJCQkJCQkJCQkJCQkJCQkJCQkqLworLyogICBiY21vc19lcnJubyAtIFN1Y2Nlc3MgY29kZSAoQkNNX0VSUl9PSykgb3IgRXJyb3IgY29kZSAoc2VlIGJjbW9zX2Vycm5vLmgpICAgICAgICAgICAgICAqLworLyoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBiY21fZGV2X2xvZ19zZXRfdGhyb3R0bGUoZGV2X2xvZ19pZCB4aV9pZCwgYmNtX2Rldl9sb2dfbGV2ZWwgeGlfbG9nX2xldmVsLCB1aW50MzJfdCB4aV90aHJvdHRsZSkKK3sKKyAgICBkZXZfbG9nX2lkX3Bhcm0gKmlkID0gKGRldl9sb2dfaWRfcGFybSAqKXhpX2lkOworCisgICAgaWYgKCF4aV9pZCB8fCAoeGlfaWQgPT0gREVWX0xPR19JTlZBTElEX0lEKSkKKyAgICB7CisgICAgICAgIERFVl9MT0dfRVJST1JfUFJJTlRGKCJFcnJvcjogeGlfaWQgbm90IHZhbGlkICgweCV4KVxuIiwgKHVuc2lnbmVkIGludCl4aV9pZCk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorICAgIGlkLT50aHJvdHRsZV9sb2dfbGV2ZWwgPSB4aV9sb2dfbGV2ZWw7CisgICAgaWQtPnRocm90dGxlLnRocmVzaG9sZCA9IHhpX3Rocm90dGxlOworICAgIGlkLT50aHJvdHRsZS5jb3VudGVyID0gMDsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJKi8KKy8qIE5hbWU6IGJjbV9kZXZfbG9nX3NldF90cmlnZ2VyCQkJCQkJCQkJCQkJCQkJKi8KKy8qCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkqLworLyogQWJzdHJhY3Q6IFNldCB0cmlnZ2VyIGNvdW50ZXJzIGZvciB0aGUgc3BlY2lmaWMgbG9nIGlzIGFuZCBpdHMgbGV2ZWwJCQkJCQkqLworLyoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSovCisvKiBBcmd1bWVudHM6CQkJCQkJCQkJCQkJCQkJCQkJCQkqLworLyogICAtIHhpX2lkCQktIFRoZSBJRCBpbiB0aGUgRGV2IGxvZyAod2hhdCB3ZSBnb3QgZm9ybSBiY21fZGV2X2xvZ19pZF9yZWdpc3RlcikJCSovCisvKiAgIC0geGlfbG9nX2xldmVsCS0gbG9nIGxldmVsCQkJCQkJCQkJCQkgICAgICAgICAgICAgICAgCSovCisvKiAgIC0geGlfc3RhcnQgCS0gc3RhcnQgcHJpbnRpbmcgYWZ0ZXIgdGhpcyBudW1iZXIsIDAgLSBubyB0cmlnZ2VyCQkJCQkJKi8KKy8qICAgLSB4aV9zdG9wICAgCS0gc3RvcCBwcmludGluZyBhZnRlciB0aGlzIG51bWJlciwgIDAgLSBkbyBub3Qgc3RvcAkJCQkJCSovCisvKiAgIC0geGlfcmVwZWF0IAktIHN0YXJ0IHByaW50aW5nIGFmdGVyIHRoaXMgbnVtYmVyLCAwIC0gbm8gcmVwZWF0LCAtMSBhbHdheXMJCQkqLworLyoJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSovCisvKiBSZXR1cm4gVmFsdWU6CQkJCQkJCQkJCQkJCQkJCQkJCSovCisvKiAgIGJjbW9zX2Vycm5vIC0gU3VjY2VzcyBjb2RlIChCQ01fRVJSX09LKSBvciBFcnJvciBjb2RlIChzZWUgYmNtb3NfZXJybm8uaCkgICAgICAgICAgICAgICovCisvKgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX3NldF90cmlnZ2VyKGRldl9sb2dfaWQgeGlfaWQsIGJjbV9kZXZfbG9nX2xldmVsIHhpX2xvZ19sZXZlbCwgdWludDMyX3QgeGlfc3RhcnQsIHVpbnQzMl90IHhpX3N0b3AsIGludDMyX3QgeGlfcmVwZWF0KQoreworICAgIGRldl9sb2dfaWRfcGFybSAqaWQgPSAoZGV2X2xvZ19pZF9wYXJtICopeGlfaWQ7CisKKyAgICBpZiAoIXhpX2lkIHx8ICh4aV9pZCA9PSBERVZfTE9HX0lOVkFMSURfSUQpKQorICAgIHsKKyAgICAgICAgREVWX0xPR19FUlJPUl9QUklOVEYoIkVycm9yOiB4aV9pZCBub3QgdmFsaWQgKDB4JXgpXG4iLCAodW5zaWduZWQgaW50KXhpX2lkKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgaWQtPnRyaWdnZXJfbG9nX2xldmVsID0geGlfbG9nX2xldmVsOworICAgIGlkLT50cmlnZ2VyLnN0YXJ0X3RocmVzaG9sZCA9IHhpX3N0YXJ0OworICAgIGlkLT50cmlnZ2VyLnN0b3BfdGhyZXNob2xkID0geGlfc3RvcDsKKyAgICBpZC0+dHJpZ2dlci5yZXBlYXRfdGhyZXNob2xkID0geGlfcmVwZWF0OworICAgIGlkLT50cmlnZ2VyLmNvdW50ZXIgPSAwOworICAgIGlkLT50cmlnZ2VyLnJlcGVhdCA9IDA7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKyNlbmRpZiAvKiBUUklHR0VSX0xPR0dFUl9GRUFUVVJFICovCisKKy8qIEdldCBmaWxlIGluZm86IG1heCBkYXRhIHNpemUsIHVzZWQgYnl0ZXMgKi8KK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2dldF9maWxlX2luZm8oYmNtX2Rldl9sb2dfZmlsZSAqZmlsZSwgdWludDMyX3QgKmZpbGVfc2l6ZSwgdWludDMyX3QgKnVzZWRfYnl0ZXMpCit7CisgICAgaWYgKCFmaWxlIHx8ICFmaWxlX3NpemUgfHwgIXVzZWRfYnl0ZXMpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgLyogT25seSBzdXBwb3J0ZWQgZm9yIG1lbW9yeSBmaWxlcyAqLworICAgIGlmICghYmNtX2Rldl9sb2dfaXNfbWVtb3J5X2ZpbGUoZmlsZSkpCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisgICAgKmZpbGVfc2l6ZSA9IGZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIuZGF0YV9zaXplOworICAgICp1c2VkX2J5dGVzID0gKGZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIuZmlsZV93cmFwX2NudCB8fCBmaWxlLT5pc19mdWxsKSA/CisgICAgICAgIGZpbGUtPnUubWVtX2ZpbGUuZmlsZV9oZWFkZXIuZGF0YV9zaXplIDogZmlsZS0+dS5tZW1fZmlsZS5maWxlX2hlYWRlci53cml0ZV9vZmZzZXQ7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIFJlZ2lzdGVyIGluZGljYXRpb24gdG8gYmUgc2VudCB3aGVuIGZpbGUgdXRpbGl6YXRpb24gY3Jvc3NlcyB0aHJlc2hvbGQgKi8KK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2FsbW9zdF9mdWxsX2luZF9yZWdpc3RlcihiY21fZGV2X2xvZ19maWxlICpmaWxlLCB1aW50MzJfdCB1c2VkX2J5dGVzX3RocmVzaG9sZCwKKyAgICBGX2Rldl9sb2dfZmlsZV9hbG1vc3RfZnVsbCBzZW5kX2luZF9jYiwgbG9uZyBpbmRfY2JfcHJpdikKK3sKKyAgICBpZiAoIWZpbGUgfHwgKHVzZWRfYnl0ZXNfdGhyZXNob2xkICYmICFzZW5kX2luZF9jYikpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgLyogT25seSBzdXBwb3J0ZWQgZm9yIG1lbW9yeSBmaWxlcyAqLworICAgIGlmICghYmNtX2Rldl9sb2dfaXNfbWVtb3J5X2ZpbGUoZmlsZSkpCisgICAgICAgIHJldHVybiBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisKKyAgICBiY21vc19tdXRleF9sb2NrKCZmaWxlLT51Lm1lbV9maWxlLm11dGV4KTsKKyAgICBmaWxlLT5hbG1vc3RfZnVsbC50aHJlc2hvbGQgPSB1c2VkX2J5dGVzX3RocmVzaG9sZDsKKyAgICBmaWxlLT5hbG1vc3RfZnVsbC5zZW5kX2luZF9jYiA9IHNlbmRfaW5kX2NiOworICAgIGZpbGUtPmFsbW9zdF9mdWxsLnByaXYgPSBpbmRfY2JfcHJpdjsKKyAgICBmaWxlLT5hbG1vc3RfZnVsbC5pbmRfc2VudCA9IEJDTU9TX0ZBTFNFOworICAgIGJjbW9zX211dGV4X3VubG9jaygmZmlsZS0+dS5tZW1fZmlsZS5tdXRleCk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworI2VuZGlmIC8qIEVOQUJMRV9MT0cgKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nL2JjbV9kZXZfbG9nX3Rhc2suaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nL2JjbV9kZXZfbG9nX3Rhc2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjdiYjEyCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2cvYmNtX2Rldl9sb2dfdGFzay5oCkBAIC0wLDAgKzEsNjUxIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaWZuZGVmIF9fQkNNX0RFVl9MT0dfVEFTS19IXworI2RlZmluZSBfX0JDTV9ERVZfTE9HX1RBU0tfSF8KKworLyogQmVjYXVzZSB3ZSBjYXN0IGZyb20gZGV2X2xvZ19pZCB0byBwb2ludGVyIHR5cGUgaW4gYmNtX2Rldl9sb2cuYywgd2Ugd2FudCBpdCB0byBiZSB0aGUgc2FtZSBzaXplIGFzIGEgcG9pbnRlciBzaXplIChlLmc6ICJ0eXBlZGVmIHVpbnQzMl90IGRldl9sb2dfaWQiIHdvbid0IHdvcmsKKyAqIG9uIDY0Yml0IHBsYXRmb3JtKS4gKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBkZXZfbG9nX2lkOworCisjZGVmaW5lIERFVl9MT0dfSU5WQUxJRF9JRCAgICAgICAgICAgICAgKGRldl9sb2dfaWQpVUlOVF9NQVgKKworI2lmZGVmIEVOQUJMRV9MT0cKKworLyogVW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZSB0byBlbmFibGUgaW5mbyBwcmludHMgZm9yIGRldl9sb2cgZGVidWdnaW5nICovCisvKiAjZGVmaW5lIERFVl9MT0dfREVCVUcgKi8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBMb2cgbWFjcm9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERlZmluZXMvVHlwZWRlZnMgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBTVFJJTkdJRlkoeCkgI3gKKyNkZWZpbmUgU1RSSU5HSUZZX0VYUEFORChzdHIpIFNUUklOR0lGWShzdHIpCisKKyNpZmRlZiBfX0tFUk5FTF9fCisjZGVmaW5lIERFVl9MT0dfUFJJTlRGIHByaW50aworI2RlZmluZSBERVZfTE9HX1ZQUklOVEYgdnByaW50aworI2Vsc2UKKyNkZWZpbmUgREVWX0xPR19QUklOVEYgYmNtb3NfcHJpbnRmCisjZGVmaW5lIERFVl9MT0dfVlBSSU5URiBiY21vc192cHJpbnRmCisjZW5kaWYKKworI2lmZGVmIERFVl9MT0dfREVCVUcKKyNkZWZpbmUgREVWX0xPR19JTkZPX1BSSU5URihmbXQsIGFyZ3MuLi4pIERFVl9MT0dfUFJJTlRGKCIoJXM6IiBTVFJJTkdJRllfRVhQQU5EKF9fTElORV9fKSAiKSAiIGZtdCwgX19GVU5DVElPTl9fLCAjI2FyZ3MpCisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGRldl9sb2dfaW5mb19wcmludGZfaWdub3JlKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSB7IH0KKyNkZWZpbmUgREVWX0xPR19JTkZPX1BSSU5URihmbXQsIGFyZ3MuLi4pIGRldl9sb2dfaW5mb19wcmludGZfaWdub3JlKGZtdCwgIyNhcmdzKQorI2VuZGlmCisjZGVmaW5lIERFVl9MT0dfRVJST1JfUFJJTlRGKGZtdCwgYXJncy4uLikgREVWX0xPR19QUklOVEYoIiglczoiIFNUUklOR0lGWV9FWFBBTkQoX19MSU5FX18pICIpICIgZm10LCBfX0ZVTkNUSU9OX18sICMjYXJncykKKworLyogSU1QT1JUQU5UISB3aGVuIG1vZGlmeWluZyBERVZfTE9HX01BWF9BUkdTLAorICogZG9uJ3QgZm9yZ2V0IHRvIGFkZC9yZW1vdmUgX0JDTV9MT0dfQVJHUy4uLiBtYWNyb3MgaW4gb3JkZXIgdG8gZm9yY2UgbnVtYmVyIG9mIGFyZ3VtZW50cyBpbiBjb21waWxlIHRpbWUKKyAqLworI2RlZmluZSBERVZfTE9HX01BWF9BUkdTICAgICAgICAgICAgICAgIDM2CisvKiBTdHJpbmcgYmlnZ2VyIHRoYW4gdGhpcyBzaXplIHdpbGwgYmUgY3V0ICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUFYX0RFVl9MT0dfSURfTkFNRSAgICAgICAgICAgICAzMiAgLyogTWF4aW11bSBzaXplIG9mIGxvZ19pZCBuYW1lICovCisjZGVmaW5lIERFVl9MT0dfTUFYX0lEUyAgICAgICAgICAgICAgICAgNTEyCisjZGVmaW5lIERFVl9MT0dfTUFYX0ZJTEVTICAgICAgICAgICAgICAgMgorI2RlZmluZSBNQVhfREVWX0xPR19TVFJJTkdfU0laRSAgICAgICAgIDI1NiAvKiBOb3RlIHRoYXQgdGhpcyBzaXplIGluY2x1ZGVzIGhlYWRlci4gKi8KKyNkZWZpbmUgTUFYX0RFVl9MT0dfSEVBREVSX1NJWkUgICAgICAgICAoNyArIDE2ICsgMjApIC8qICh0aW1lPTE2LCBJRD0yMCwgZGVsaW1pdGVycz03KSAqLworI2RlZmluZSBNQVhfREVWX0xPR19TVFJJTkdfTkVUX1NJWkUgICAgIChNQVhfREVWX0xPR19TVFJJTkdfU0laRSAtIE1BWF9ERVZfTE9HX0hFQURFUl9TSVpFKQorI2RlZmluZSBERVZfTE9HX0lOVkFMSURfSU5ERVggICAgICAgICAgIFVJTlRfTUFYCisjZGVmaW5lIERFVl9MT0dfRFJPUF9SRVBPUlRfUkFURV9VUyAgICAgMTAwMDAwMCAvKiAxIHNlY29uZCAqLworI2RlZmluZSBERVZfTE9HX0RST1BfUkVQT1JUX0RST1BfVEhSRVNIT0xEIDEwMDAKKyNkZWZpbmUgREVWX0xPR19FTkRJQU4gICAgICAgICAgICAgICAgICBCQ01PU19FTkRJQU5fTElUVExFCisKKy8qIElmIHRoZSBsb2cgbWVzc2FnZSBwb29sIHV0aWxpemF0aW9uIGlzID49IHRoaXMgcGVyY2VudGFnZSwgZG8gbm90IHByaW50IG1lc3NhZ2VzIChvbmx5IHNhdmUgdGhlbSkuCisgKiAobm90ZSB0aGF0IGVycm9yL2ZhdGFsIG1lc3NhZ2VzIHdpbGwgbm90IG9iamV5IHRoaXMgcnVsZSkuICovCisjZGVmaW5lIERFVl9MT0dfU0tJUF9QUklOVF9USFJFU0hPTERfUEVSQ0VOVCA1MAorCisvKiBJZiB0aGUgbG9nIG1lc3NhZ2UgcG9vbCB1dGlsaXphdGlvbiBpcyA+PSB0aGlzIHBlcmNlbnRhZ2UsIGRyb3AgYWxsIG1lc3NhZ2VzIHRoYXQgYXJlbid0ICdlcnJvcicgb3IgJ2ZhdGFsJyBsZXZlbC4gKi8KKyNkZWZpbmUgREVWX0xPR19FUlJPUl9PTkxZX1RIUkVTSE9MRF9QRVJDRU5UIDc1CisKKy8qIExvZyBsZXZlbCBlbnVtICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBERVZfTE9HX0xFVkVMX05PX0xPRyA9IDAsCisgICAgREVWX0xPR19MRVZFTF9GQVRBTCwKKyAgICBERVZfTE9HX0xFVkVMX0VSUk9SLAorICAgIERFVl9MT0dfTEVWRUxfV0FSTklORywKKyAgICBERVZfTE9HX0xFVkVMX0lORk8sCisgICAgREVWX0xPR19MRVZFTF9ERUJVRywKKworICAgIERFVl9MT0dfTEVWRUxfTlVNX09GCit9IGJjbV9kZXZfbG9nX2xldmVsOworCisvKiBMb2cgdHlwZSBlbnVtICovCit0eXBlZGVmIGVudW0KK3sKKyAgICAvKiBCaXRbMF0gLSBQcmludCBFbmFibGUsIEJpdFsxXSAtIFNhdmUgRW5hYmxlICovCisgICAgREVWX0xPR19JRF9UWVBFX05PTkUgPSAwLCAgICAgICAvKiBOTyBTQVZFLCBOTyBQUklOVCovCisgICAgREVWX0xPR19JRF9UWVBFX1BSSU5UID0gMSwKKyAgICBERVZfTE9HX0lEX1RZUEVfU0FWRSA9IDEgPDwgMSwKKyAgICBERVZfTE9HX0lEX1RZUEVfQk9USCA9IERFVl9MT0dfSURfVFlQRV9QUklOVCB8IERFVl9MT0dfSURfVFlQRV9TQVZFLCAvKiBTQVZFICYgUFJJTlQgKi8KK30gYmNtX2Rldl9sb2dfaWRfdHlwZTsKKwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNX0RFVl9MT0dfRkxBR19OT05FID0gMCwKKworICAgIC8qIEV2ZW4gaWYgbG9nZ2VyIGlzIGRpc2FibGVkLCBCQ01fTE9HKCkgY2FsbHMgYXJlIHJlZGlyZWN0ZWQgdG8gYmNtb3NfcHJpbnRmKCkuICovCisgICAgQkNNX0RFVl9MT0dfRkxBR19ESVNBQkxFRF9XSVRIX1BSSU5URiA9IDEgPDwgMCwKKworICAgIC8qIFdoZW4gYmNtX2Rldl9sb2dfZGVzdHJveSgpIGlzIGNhbGxlZCwgZG8gbm90IHdhaXQgZm9yIG91dHN0YW5kaW5nIGxvZyBtZXNzYWdlcyB0byBiZSBkcmFpbmVkLiBEaXNjYXJkIHRoZQorICAgICAqIG1lc3NhZ2VzIGFuZCBkZXN0cm95IHRoZSB0YXNrIGltbWVkaWF0ZWx5LiAqLworICAgIEJDTV9ERVZfTE9HX0ZMQUdfREVTVFJPWV9JTU1FRElBVEVMWSA9IDEgPDwgMSwKK30gYmNtX2Rldl9sb2dfZmxhZ3M7CisKK3R5cGVkZWYgZW51bQoreworICAgIEJDTV9ERVZfTE9HX0ZJTEVfRkxBR19OT05FID0gMCwKKyAgICBCQ01fREVWX0xPR19GSUxFX0ZMQUdfVkFMSUQgPSAxLCAvKio8IGZpbGUgaXMgdmFsaWQgKi8KKyAgICBCQ01fREVWX0xPR19GSUxFX0ZMQUdfV1JBUF9BUk9VTkQgPSAxIDw8IDEsIC8qKjwgbmV3IG1lc3NhZ2VzIHdpbGwgb3ZlcnJpZGUgb2xkICovCisgICAgQkNNX0RFVl9MT0dfRklMRV9GTEFHX1NUT1BfV0hFTl9GVUxMID0gMSA8PCAyLCAvKio8IHN0b3AgbG9nZ2luZyBpZiB0aGUgZmlsZSBpcyBmdWxsICovCisgICAgQkNNX0RFVl9MT0dfRklMRV9GTEFHX0NMRUFSX0FGVEVSX1JFQUQgPSAxIDw8IDQsIC8qKjwgYXV0by1jbGVhciBsb2cgd2hlbiBpdCBpcyBmdWxseSByZWFkICovCit9IGJjbV9kZXZfbG9nX2ZpbGVfZmxhZ3M7CisKK3R5cGVkZWYgZW51bQoreworICAgIEJDTV9ERVZfTE9HX1NUWUxFX05PUk1BTCwKKyAgICBCQ01fREVWX0xPR19TVFlMRV9CT0xELAorICAgIEJDTV9ERVZfTE9HX1NUWUxFX1VOREVSTElORSwKKyAgICBCQ01fREVWX0xPR19TVFlMRV9CTElOSywKKyAgICBCQ01fREVWX0xPR19TVFlMRV9SRVZFUlNFX1ZJREVPLAorfSBiY21fZGV2X2xvZ19zdHlsZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQ2FsbGJhY2tzIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBEZWZhdWx0IGxvZ2dlciBJRCAqLworZXh0ZXJuIGRldl9sb2dfaWQgZGVmX2xvZ19pZDsKKworLyogTG9nIGZpbGUgdHlwZSAqLwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNX0RFVl9MT0dfRklMRV9NRU1PUlksICAgIC8qKjwgTWVtb3J5IGZpbGUgKi8KKyNpZmRlZiBCQ01fT1NfUE9TSVgKKyAgICBCQ01fREVWX0xPR19GSUxFX1JFR1VMQVIsICAgLyoqPCBSZWd1bGFyIGZpbGUgKi8KKyNlbmRpZgorI2lmZGVmIERFVl9MT0dfU1lTTE9HCisgICAgQkNNX0RFVl9MT0dfRklMRV9TWVNMT0csICAgIC8qKjwgc3lzbG9nICJmaWxlIiAqLworI2VuZGlmCisgICAgQkNNX0RFVl9MT0dfRklMRV9VREVGICAgICAgIC8qKjwgVXNlci1kZWZpbmVkIGZpbGUgKi8KK30gYmNtX2Rldl9sb2dfZmlsZV90eXBlOworCit0eXBlZGVmIHN0cnVjdCBiY21fZGV2X2xvZ19maWxlX3Bhcm0gYmNtX2Rldl9sb2dfZmlsZV9wYXJtOwordHlwZWRlZiBzdHJ1Y3QgYmNtX2Rldl9sb2dfZmlsZSBiY21fZGV2X2xvZ19maWxlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE9QRU4gQ0FMTEJBQ0s6IG9wZW4gbWVtb3J5L2ZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogZmlsZV9wYXJtIC0gZmlsZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBmaWxlICAgICAgLSBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBiY21vc19lcnJubyAoKmJjbV9kZXZfbG9nX2ZpbGVfb3Blbl9jYikoY29uc3QgYmNtX2Rldl9sb2dfZmlsZV9wYXJtICpmaWxlX3Bhcm0sIGJjbV9kZXZfbG9nX2ZpbGUgKmZpbGUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIENMT1NFIENBTExCQUNLOiBjbG9zZSBtZW1vcnkvZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBmaWxlICAgICAgLSBmaWxlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBiY21vc19lcnJubyAoKmJjbV9kZXZfbG9nX2ZpbGVfY2xvc2VfY2IpKGJjbV9kZXZfbG9nX2ZpbGUgKmZpbGUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFJFV0lORCBDQUxMQkFDSzogY2xlYXJzIG1lbW9yeS9maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogZmlsZSAgICAgIC0gZmlsZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgYmNtb3NfZXJybm8gKCpiY21fZGV2X2xvZ19maWxlX3Jld2luZF9jYikoYmNtX2Rldl9sb2dfZmlsZSAqZmlsZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUkVBRF9DQUxMQkFDSzogcmVhZCBmb3JtIG1lbW9yeS9maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBvZmZzZXQgLSB0aGUgb2Zmc2V0IGluIGJ5dGVzIHRvIHJlYWQgZnJvbSwgb3V0cHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIGJ1ZiAgICAtIFdoZXJlIHRvIHB1dCB0aGUgcmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogbGVuZ3RoIC0gQnVmZmVyIGxlbmd0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkIGZyb20gZmlsZSBvciAwIGlmIEVPRiAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBpbnQgKCpiY21fZGV2X2xvZ19maWxlX3JlYWRfY2IpKGJjbV9kZXZfbG9nX2ZpbGUgKmZpbGUsIHVpbnQzMl90ICpvZmZzZXQsIHZvaWQgKmJ1ZiwgdWludDMyX3QgbGVuZ3RoKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBXUklURV9DQUxMQkFDSzogd3JpdGUgZm9ybSBtZW1vcnkvZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIGJ1ZiAgICAtIFRoZSBidWZmZXIgdGhhdCBzaG91bGQgYmUgd3JpdHRlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogbGVuZ3RoIC0gVGhlIG51bWJlciBvZiBieXRlcyB0byB3cml0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSB3cml0dGVuIHRvIGZpbGUgb3IgMCBpZiBFT0YgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBpbnQgKCpiY21fZGV2X2xvZ19maWxlX3dyaXRlX2NiKShiY21fZGV2X2xvZ19maWxlICpmaWxlLCBjb25zdCB2b2lkICpidWYsIHVpbnQzMl90IGxlbmd0aCk7CisKKy8qIEZpbGUgYWxtb3N0IGZ1bGwgaW5kaWNhdGlvbiBjYWxsYmFjayBwcm90b3R5cGUgKi8KK3R5cGVkZWYgYmNtb3NfZXJybm8gKCpGX2Rldl9sb2dfZmlsZV9hbG1vc3RfZnVsbCkobG9uZyBwcml2KTsKKworLyogRmlsZSBwYXJhbWV0ZXJzICovCitzdHJ1Y3QgYmNtX2Rldl9sb2dfZmlsZV9wYXJtCit7CisgICAgYmNtX2Rldl9sb2dfZmlsZV90eXBlIHR5cGU7CisgICAgLyogRmlsZS1hY2Nlc3MgY2FsbGJhY2tzIGNhbiBiZSBOVUxMIGZvciBtZW1vcnkgZmlsZXMsIGluIHRoaXMgY2FzZSBzdGFydF9hZGRyICAgICovCisgICAgLyogc2hvdWxkIGJlIGEgdmFsaWQgbWVtb3J5IGFkZHJlc3MsIGFsbCByZWFkL3dyaXRlcyBvcHRpb25zIHdpbGwgYmUgICAgICAgICovCisgICAgLyogcGVyZm9ybWVkIGRpcmVjdGx5IHRvIHRoaXMgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgdm9pZCAqc3RhcnRfYWRkcjsKKyAgICB1aW50MzJfdCBzaXplOworICAgIGJjbV9kZXZfbG9nX2ZpbGVfb3Blbl9jYiBvcGVuX2NiOworICAgIGJjbV9kZXZfbG9nX2ZpbGVfY2xvc2VfY2IgY2xvc2VfY2I7CisgICAgYmNtX2Rldl9sb2dfZmlsZV93cml0ZV9jYiB3cml0ZV9jYjsKKyAgICBiY21fZGV2X2xvZ19maWxlX3JlYWRfY2IgcmVhZF9jYjsKKyAgICBiY21fZGV2X2xvZ19maWxlX3Jld2luZF9jYiByZXdpbmRfY2I7CisgICAgYmNtX2Rldl9sb2dfZmlsZV9mbGFncyBmbGFnczsKKyAgICB2b2lkICp1ZGVmX3Bhcm1zOworfTsKKworI2RlZmluZSBGSUxFX01BR0lDX1NUUl9TSVpFICAgICAgICAgICAgIDE2CisjZGVmaW5lIEZJTEVfTUFHSUNfU1RSICJATE9HRklMRSBNQUdJQ0AiIC8qIGxlbmd0aCBzaG91bGQgYmUgRklMRV9NQUdJQ19TVFJfU0laRSAoaW5jbHVkaW5nICdcMCcpICovCisKKy8qIEZpbGUgYWxtb3N0IGZ1bGwgaW5kaWNhdGlvbiBjb250cm9sIGluZm8gKi8KK3R5cGVkZWYgc3RydWN0IGRldl9sb2dfYWxtb3N0X2Z1bGxfaW5mbworeworICAgIEZfZGV2X2xvZ19maWxlX2FsbW9zdF9mdWxsIHNlbmRfaW5kX2NiOworICAgIHVpbnQzMl90IHRocmVzaG9sZDsKKyAgICBiY21vc19ib29sIGluZF9zZW50OworICAgIGxvbmcgcHJpdjsKK30gZGV2X2xvZ19hbG1vc3RfZnVsbF9pbmZvOworCisvKiBNZW1vcnkgZmlsZSBoZWFkZXIgKi8KK3R5cGVkZWYgc3RydWN0IGRldl9sb2dfbWVtX2ZpbGVfaGVhZGVyCit7CisgICAgdWludDMyX3QgZmlsZV93cmFwX2NudDsKKyAgICB1aW50MzJfdCB3cml0ZV9vZmZzZXQ7CisgICAgdWludDMyX3QgZGF0YV9zaXplOworICAgIHVpbnQzMl90IG51bV9tc2dzOworICAgIGNoYXIgZmlsZV9tYWdpY1tGSUxFX01BR0lDX1NUUl9TSVpFXTsKKyAgICBjaGFyIG1zZ19idWZmZXJbMF07Cit9IGRldl9sb2dfbWVtX2ZpbGVfaGVhZGVyOworCitzdHJ1Y3QgYmNtX2Rldl9sb2dfZmlsZQoreworICAgIGJjbV9kZXZfbG9nX2ZpbGVfcGFybSBmaWxlX3Bhcm07CisgICAgZGV2X2xvZ19hbG1vc3RfZnVsbF9pbmZvIGFsbW9zdF9mdWxsOworICAgIGJjbW9zX2Jvb2wgaXNfZnVsbDsKKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgLyogTWVtb3J5IGZpbGUgKi8KKyAgICAgICAgc3RydWN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX211dGV4IG11dGV4OyAvKiBNdXRleCB0byBsb2NrIGZpbGUgYWNjZXNzIHdoaWxlIHByaW50aW5nIGl0ICovCisgICAgICAgICAgICBkZXZfbG9nX21lbV9maWxlX2hlYWRlciBmaWxlX2hlYWRlcjsKKyAgICAgICAgfSBtZW1fZmlsZTsKKworI2lmZGVmIEJDTV9PU19QT1NJWAorICAgICAgICBGSUxFICpyZWdfZmlsZV9oYW5kbGU7CisjZW5kaWYKKworICAgICAgICAvKiBVc2VyLWRlZmluZWQgZmlsZSBoYW5kbGUgKi8KKyAgICAgICAgdW5zaWduZWQgbG9uZyB1ZGVmX2hhbmRsZTsKKyAgICB9IHU7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEdldCB0aW1lIGNhbGxiYWNrIHNob3VsZCByZXR1cm4gYW4gaW50ZWdlciByZXByZXNlbnRpbmcgdGltZS4gSWYgTlVMTCB0aW1lIHByaW50cyB3aWxsIGJlIGRpc2FibGVkLiAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHVpbnQzMl90ICgqYmNtX2Rldl9sb2dfZ2V0X3RpbWVfY2IpKHZvaWQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBUaW1lIHRvIHN0cmluZyBjYWxsYmFjayByZWNlaXZlcyB0aW1lc3RhbXAgKHVzKSBhbmQgc2hvdWxkIGNvbnZlcnQgaW50byB0aW1lX3N0ciAgICAgICAgICAgICAgICAgICAgICovCisvKiB0aW1lX3N0cl9zaXplIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBiZSBjb3BpZWQuIEluIHRoZSBlbmQgZnVuY3Rpb24gc2hvdWxkIHVwZGF0ZSB0aGUgICAgICovCisvKiBudW1iZXIgYnl0ZXMgYWN0dWFsbHkgd3JpdHRlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBJZiBOVUxMIHRpbWUgd2lsbCBwcmludGVkIGFzIGFuIHVuc2lnbmVkIGludGVnZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIGludCAoKmJjbV9kZXZfbG9nX3RpbWVfdG9fc3RyX2NiKSh1aW50MzJfdCB0aW1lLCBjaGFyICp0aW1lX3N0ciwgaW50IHRpbWVfc3RyX3NpemUpOwordHlwZWRlZiBpbnQgKCpiY21fZGV2X2xvZ19wcmludF9jYikodm9pZCAqYXJnLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFN0cnVjdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21fZGV2X2xvZ19nZXRfdGltZV9jYiBnZXRfdGltZV9jYjsKKyAgICBiY21fZGV2X2xvZ190aW1lX3RvX3N0cl9jYiB0aW1lX3RvX3N0cl9jYjsKKyAgICBiY21fZGV2X2xvZ19wcmludF9jYiBwcmludF9jYjsKKyAgICB2b2lkICpwcmludF9jYl9hcmc7CisgICAgYmNtX2Rldl9sb2dfZmlsZV9wYXJtIGxvZ19maWxlW0RFVl9MT0dfTUFYX0ZJTEVTXTsKK30gYmNtX2Rldl9sb2dfcGFybTsKKworI2lmZGVmIFRSSUdHRVJfTE9HR0VSX0ZFQVRVUkUKK3R5cGVkZWYgc3RydWN0Cit7CisgICB1aW50MzJfdCB0aHJlc2hvbGQ7ICAvKiBldmVyeSB0aHJlc2hvbGQgbWVzc2FnZXMsIHByaW50IG9uZSAqLworICAgdWludDMyX3QgY291bnRlcjsgICAgLyogY3VycmVudCBpbmRleCAtIHJ1bnMgZnJvbSAwIHRvIHRocmVzaG9sZCwgcGVyaW9kaWNhbGx5ICovCit9IGRldl9sb2dfaWRfdGhyb3R0bGU7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICB1aW50MzJfdCBzdGFydF90aHJlc2hvbGQ7IC8qIHN0YXJ0IHByaW50aW5nIHdoZW4gdGhyZXNob2xkIGlzIHJlYWNoZWQgKi8KKyAgIHVpbnQzMl90IHN0b3BfdGhyZXNob2xkOyAgLyogc3RvcCBwcmludGluZyB3aGVuIHRocmVzaG9sZCBpcyByZWFjaGVkLCBzdGFydGluZyBjb3VudGluZyBmcm9tIHN0YXJ0LCBpZiAwLCBkbyBubyBzdG9wICovCisgICB1aW50MzJfdCBjb3VudGVyOyAgICAgICAgIC8qIGN1cnJlbnQgaW5kZXggLSBydW5zIDogZmlyc3QgLSBmcm9tIDAgdG8gc3RhcnRfdGhyZXNob2xkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kIC0gZnJvbSBzdGFydF90aHJlc2hvbGQgdG8gc3RvcF90aHJlc2hvbGQgKi8KKyAgIGludDMyX3QgcmVwZWF0X3RocmVzaG9sZDsvKiB0aGUgdHJpZ2dlciBwZXJpb2QsIGhvdyBtYW55IHRpbWVzIHRoZSB0cmlnZ2VyIGlzIHNldCwgLTEgPSBhbHdheXMgKi8KKyAgIGludDMyX3QgcmVwZWF0OyAgICAgICAgICAvKiBjdXJyZW50IHJlcGVhdCBjb3VudGVyICovCit9IGRldl9sb2dfaWRfdHJpZ2dlcjsKKyNlbmRpZgordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBjaGFyIG5hbWVbTUFYX0RFVl9MT0dfSURfTkFNRV07CisgICAgYmNtX2Rldl9sb2dfaWRfdHlwZSBsb2dfdHlwZTsKKyAgICBiY21fZGV2X2xvZ19pZF90eXBlIGRlZmF1bHRfbG9nX3R5cGU7CisgICAgYmNtX2Rldl9sb2dfbGV2ZWwgbG9nX2xldmVsX3ByaW50OworICAgIGJjbV9kZXZfbG9nX2xldmVsIGxvZ19sZXZlbF9zYXZlOworICAgIGJjbV9kZXZfbG9nX2xldmVsIGRlZmF1bHRfbG9nX2xldmVsOworICAgIGJjbV9kZXZfbG9nX3N0eWxlIHN0eWxlOworICAgIHVpbnQzMl90IGxvc3RfbXNnX2NudDsKKyAgICB1aW50MzJfdCBwcmludF9za2lwcGVkX2NvdW50OyAvKiBzZWUgREVWX0xPR19TS0lQX1BSSU5UX1RIUkVTSE9MRF9QRVJDRU5UICovCisgICAgdWludDMyX3QgY291bnRlcnNbREVWX0xPR19MRVZFTF9OVU1fT0ZdOworI2lmZGVmIFRSSUdHRVJfTE9HR0VSX0ZFQVRVUkUKKyAgICBiY21fZGV2X2xvZ19sZXZlbCB0aHJvdHRsZV9sb2dfbGV2ZWw7CisgICAgZGV2X2xvZ19pZF90aHJvdHRsZSB0aHJvdHRsZTsKKyAgICBiY21fZGV2X2xvZ19sZXZlbCB0cmlnZ2VyX2xvZ19sZXZlbDsKKyAgICBkZXZfbG9nX2lkX3RyaWdnZXIgdHJpZ2dlcjsKKyNlbmRpZgorfSBkZXZfbG9nX2lkX3Bhcm07CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZ1bmN0aW9ucyBwcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqIFRlYXIgZG93biB0aGUgZGV2X2xvZywgZnJlZWluZyBhbGwgT1MgcmVzb3VyY2VzLiAqLwordm9pZCBiY21fZGV2X2xvZ19kZXN0cm95KHZvaWQpOworCisvKiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgZGVmYXVsdCBsb2dnZXIgdGhhdCBzdXBwb3J0cyBsb2dnaW5nIG9uIHRoZSBzY3JlZW4gYW5kCisgKiBpbnRvIDAgb3IgbW9yZSBtZW1vcnkgZmlsZXMuCisgKi8KK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2luaXRfZGVmYXVsdF9sb2dnZXIodm9pZCAqKnN0YXJ0X2FkZHJlc3NlcywKKyAgICB1aW50MzJfdCAqc2l6ZXMsCisgICAgYmNtX2Rldl9sb2dfZmlsZV9mbGFncyAqZmxhZ3MsCisgICAgdWludDMyX3QgbnVtX2ZpbGVzLAorICAgIHVpbnQzMl90IHN0YWNrX3NpemUsCisgICAgYmNtb3NfdGFza19wcmlvcml0eSBwcmlvcml0eSwKKyAgICB1aW50MzJfdCBwb29sX3NpemUpOworCisvKiBUaGlzIGZ1bmN0aW9uIGlzIG1vcmUgZmxleGlibGUgY29tcGFyaW5nIHdpdGggYmNtX2Rldl9sb2dfaW5pdF9kZWZhdWx0X2xvZ2dlcigpLgorICogSXQgY3JlYXRlcyBsb2dnZXIgdGhhdCBzdXBwb3J0cyBsb2dnaW5nIG9uIHRoZSBzY3JlZW4gYW5kIGludG8gMCBvciBtb3JlCisgKiBtZW1vcnksIHJlZ3VsYXIgYW5kIHVzZXItZGVmaW5lZCBmaWxlcy4KKyAqLworYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfaW5pdF9kZWZhdWx0X2xvZ2dlcl9leHQoCisgICAgYmNtX2Rldl9sb2dfcGFybSAqZGV2X2xvZ19wYXJtLAorICAgIHVpbnQzMl90IG51bV9maWxlcywKKyAgICB1aW50MzJfdCBzdGFja19zaXplLAorICAgIGJjbW9zX3Rhc2tfcHJpb3JpdHkgcHJpb3JpdHksCisgICAgdWludDMyX3QgcG9vbF9zaXplKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOYW1lOiBiY21fZGV2X2xvZ19pZF9yZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEFic3RyYWN0OiBBZGQgbmV3IElEIHRvIGRldl9sb2cgYW5kIHJldHVybiBpdCB0byB1c2VyICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQXJndW1lbnRzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgeGlfbmFtZSAgICAgICAgICAgICAgICAtIElEIG5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHhpX2RlZmF1bHRfbG9nX2xldmVsICAgLSBJRCBkZWZhdWx0IGxvZyBsZXZlbCAgICAgICAgICAgICAgICAgICAgICAqLworLyogICB4aV9kZWZhdWx0X2xvZ190eXBlICAgIC0gSUQgZGVmYXVsdCBsb2cgdHlwZSAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm4gVmFsdWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBuZXcgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZGV2X2xvZ19pZCBiY21fZGV2X2xvZ19pZF9yZWdpc3Rlcihjb25zdCBjaGFyICp4aV9uYW1lLAorICAgIGJjbV9kZXZfbG9nX2xldmVsIHhpX2RlZmF1bHRfbG9nX2xldmVsLAorICAgIGJjbV9kZXZfbG9nX2lkX3R5cGUgeGlfZGVmYXVsdF9sb2dfdHlwZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5hbWU6IGJjbV9kZXZfbG9nX2lkX3NldF90eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEFic3RyYWN0OiBTZXQgY3VycmVudCBsb2cgdHlwZSBmb3IgYW4gSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEFyZ3VtZW50czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgLSB4aV9pZCAgICAgICAgLSBUaGUgSUQgaW4gdGhlIERldiBsb2cgKHdoYXQgd2UgZ290IGZvcm0gYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIpICAgICAgKi8KKy8qICAgLSB4aV9sb2dfdHlwZSAgLSBOZXcgbG9nIHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybiBWYWx1ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgYmNtb3NfZXJybm8gLSBTdWNjZXNzIGNvZGUgKEJDTV9FUlJfT0spIG9yIEVycm9yIGNvZGUgKHNlZSBiY21vc19lcnJuby5oKSAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2lkX3NldF90eXBlKGRldl9sb2dfaWQgeGlfaWQsIGJjbV9kZXZfbG9nX2lkX3R5cGUgeGlfbG9nX3R5cGUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOYW1lOiBiY21fZGV2X2xvZ19pZF9zZXRfbGV2ZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBYnN0cmFjdDogU2V0IGN1cnJlbnQgbG9nIGxldmVsIGZvciBhbiBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBcmd1bWVudHM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIC0geGlfaWQgICAgICAgIC0gVGhlIElEIGluIHRoZSBEZXYgbG9nICh3aGF0IHdlIGdvdCBmb3JtIGJjbV9kZXZfbG9nX2lkX3JlZ2lzdGVyKSAgICAgICovCisvKiAgIC0geGlfbG9nX2xldmVsIC0gTmV3IGxvZyBsZXZlbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm4gVmFsdWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIGJjbW9zX2Vycm5vIC0gU3VjY2VzcyBjb2RlIChCQ01fRVJSX09LKSBvciBFcnJvciBjb2RlIChzZWUgYmNtb3NfZXJybm8uaCkgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBiY21fZGV2X2xvZ19pZF9zZXRfbGV2ZWwoZGV2X2xvZ19pZCB4aV9pZCwgYmNtX2Rldl9sb2dfbGV2ZWwgeGlfbG9nX2xldmVsX3ByaW50LCBiY21fZGV2X2xvZ19sZXZlbCB4aV9sb2dfbGV2ZWxfc2F2ZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5hbWU6IGJjbV9kZXZfbG9nX2lkX3NldF90b19kZWZhdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEFic3RyYWN0OiBTZXQgbG9nX3R5cGUgYW5kIGxvZ19sZXZlbCB0byBkZWZhdWx0IChjcmVhdGlvbikgdmFsdWVzIGZvciBhbiBJRCAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEFyZ3VtZW50czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgLSB4aV9pZCAgICAtIFRoZSBJRCBpbiB0aGUgRGV2IGxvZyAod2hhdCB3ZSBnb3QgZm9ybSBiY21fZGV2X2xvZ19pZF9yZWdpc3RlcikgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybiBWYWx1ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgYmNtb3NfZXJybm8gLSBTdWNjZXNzIGNvZGUgKEJDTV9FUlJfT0spIG9yIEVycm9yIGNvZGUgKHNlZSBiY21vc19lcnJuby5oKSAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2lkX3NldF9sZXZlbHNfYW5kX3R5cGVfdG9fZGVmYXVsdChkZXZfbG9nX2lkIHhpX2lkKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTmFtZTogYmNtX2Rldl9sb2dfbGV2ZWxfc2V0X3N0eWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQWJzdHJhY3Q6IFNldCBsb2cgc3R5bGUgcGVyIGxldmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQXJndW1lbnRzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAtIHhpX2xldmVsICAgIC0gTG9nIGxldmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAtIHhpX3N0eWxlICAgIC0gVGhlIHN0eWxlIG9mIHRoZSBsb2csIE5PUk1BTCwgQk9MRCwgVU5ERVJMSU5FLCBCTElOSywgUkVWRVJTRV9WSURFTyAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuIFZhbHVlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBiY21vc19lcnJubyAtIFN1Y2Nlc3MgY29kZSAoQkNNX0VSUl9PSykgb3IgRXJyb3IgY29kZSAoc2VlIGJjbW9zX2Vycm5vLmgpICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBiY21fZGV2X2xvZ19sZXZlbF9zZXRfc3R5bGUoYmNtX2Rldl9sb2dfbGV2ZWwgbGV2ZWwsIGJjbV9kZXZfbG9nX3N0eWxlIHhpX3N0eWxlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTmFtZTogYmNtX2Rldl9sb2dfaWRfc2V0X3N0eWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQWJzdHJhY3Q6IFNldCBsb2cgc3R5bGUgcGVyIGxvZyBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQXJndW1lbnRzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAtIHhpX2lkICAgIC0gVGhlIElEIGluIHRoZSBEZXYgbG9nICh3aGF0IHdlIGdvdCBmb3JtIGJjbV9kZXZfbG9nX2lkX3JlZ2lzdGVyKSAgICAgICAgICAqLworLyogICAtIHhpX3N0eWxlICAgIC0gVGhlIHN0eWxlIG9mIHRoZSBsb2csIE5PUk1BTCwgQk9MRCwgVU5ERVJMSU5FLCBCTElOSywgUkVWRVJTRV9WSURFTyAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuIFZhbHVlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBiY21vc19lcnJubyAtIFN1Y2Nlc3MgY29kZSAoQkNNX0VSUl9PSykgb3IgRXJyb3IgY29kZSAoc2VlIGJjbW9zX2Vycm5vLmgpICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfaWRfc2V0X3N0eWxlKGRldl9sb2dfaWQgeGlfaWQsIGJjbV9kZXZfbG9nX3N0eWxlIHhpX3N0eWxlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOYW1lOiBiY21fZGV2X2xvZ19pZF9jbGVhcl9jb3VudGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEFic3RyYWN0OiBDbGVhciBjb3VudGVyIGZvciBhbiBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQXJndW1lbnRzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgLSB4aV9pZCAgICAgICAgICAgICAgICAtIFRoZSBJRCBpbiB0aGUgRGV2IGxvZyAod2hhdCB3ZSBnb3QgZm9ybSBiY21fZGV2X2xvZ19pZF9yZWdpc3RlcikgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuIFZhbHVlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgYmNtb3NfZXJybm8gLSBTdWNjZXNzIGNvZGUgKEJDTV9FUlJfT0spIG9yIEVycm9yIGNvZGUgKHNlZSBiY21vc19lcnJuby5oKSAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2lkX2NsZWFyX2NvdW50ZXJzKGRldl9sb2dfaWQgeGlfaWQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOYW1lOiBiY21fZGV2X2xvZ19pZF9nZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBYnN0cmFjdDogR2V0IHRoZSBJRCBzdGF0dXMgKHR5cGUsIGxldmVsLCBjb3VudGVycyAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBcmd1bWVudHM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIC0geGlfaWQgICAgICAgICAgICAtIFRoZSBJRCBpbiB0aGUgRGV2IGxvZyAod2hhdCB3ZSBnb3QgZm9ybSBiY21fZGV2X2xvZ19pZF9yZWdpc3RlcikgICovCisvKiAgIC0geG9faWRfc3RhdHVzICAgICAtIFJldHVybmVkIHN0YXR1cyBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm4gVmFsdWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIGJjbW9zX2Vycm5vIC0gU3VjY2VzcyBjb2RlIChCQ01fRVJSX09LKSBvciBFcnJvciBjb2RlIChzZWUgYmNtb3NfZXJybm8uaCkgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBiY21fZGV2X2xvZ19pZF9nZXQoZGV2X2xvZ19pZCB4aV9pZCwgZGV2X2xvZ19pZF9wYXJtICp4b19pZF9zdGF0dXMpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOYW1lOiBiY21fZGV2X2xvZ19pZF9zZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBYnN0cmFjdDogc2V0IHRoZSBJRCBzdGF0dXMgKHR5cGUsIGxldmVsLCBzdHlsZSAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBcmd1bWVudHM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIC0geGlfaWQgICAgICAgICAgICAtIFRoZSBJRCBpbiB0aGUgRGV2IGxvZyAod2hhdCB3ZSBnb3QgZm9ybSBiY21fZGV2X2xvZ19pZF9yZWdpc3RlcikgICovCisvKiAgIC0geGlfcGFybXMgICAgICAgICAtIHN0cnVjdHVyZSB0byBzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm4gVmFsdWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIGJjbW9zX2Vycm5vIC0gU3VjY2VzcyBjb2RlIChCQ01fRVJSX09LKSBvciBFcnJvciBjb2RlIChzZWUgYmNtb3NfZXJybm8uaCkgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBiY21fZGV2X2xvZ19pZF9zZXQoZGV2X2xvZ19pZCB4aV9pZCwgZGV2X2xvZ19pZF9wYXJtICp4aV9wYXJtcyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5hbWU6IGJjbV9kZXZfbG9nX2lkX2dldF9ieV9pbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEFic3RyYWN0OiBSZXR1cm4gSUQgZm9yIGluZGV4LCBpZiBubyBzdWNoIGluZGV4IHJldHVybiAoREVWX0xPR19JTlZBTElEX0lEKSAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEFyZ3VtZW50czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIHhpX2luZGV4ICAgICAgICAgLSBUaGUgaW5kZXggb2YgdGhlIElEIGluIHRoZSBnbG9iYWwgYXJyYXkuICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybiBWYWx1ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgdWludDMyX3QgLSBUaGUgSUQgKERFVl9MT0dfSU5WQUxJRF9JRCBpZiBpbmRleCBpcyBub3QgdmFsaWQpICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2Rldl9sb2dfaWQgYmNtX2Rldl9sb2dfaWRfZ2V0X2J5X2luZGV4KHVpbnQzMl90IHhpX2luZGV4KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTmFtZTogYmNtX2Rldl9sb2dfZ2V0X2luZGV4X2J5X2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQWJzdHJhY3Q6IFJldHVybiBJRCBmb3IgaW5kZXgsIGlmIG5vIHN1Y2ggaW5kZXggcmV0dXJuIChERVZfTE9HX0lOVkFMSURfSUQpICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQXJndW1lbnRzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogeGlfaWQgICAgICAgICAgICAgICAgICAgICAgICAtIExvZyBpZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuIFZhbHVlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICB1aW50MzJfdCAtIFRoZSBpbmRleCBJRCAoREVWX0xPR19JTlZBTElEX0lOREVYIGlmIGlkIGlzIG5vdCB2YWxpZCkgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QgYmNtX2Rldl9sb2dfZ2V0X2luZGV4X2J5X2lkKGRldl9sb2dfaWQgeGlfaWQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOYW1lOiBiY21fZGV2X2xvZ19pZF9nZXRfYnlfbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBYnN0cmFjdDogUmV0dXJuIElEIGluZGV4IGZvciBuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBcmd1bWVudHM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiB4aV9fbmFtZSAgICAgICAgIC0gVGhlIG5hbWUgb2YgdGhlIElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSZXR1cm4gVmFsdWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIGludDMyX3QgLSBUaGUgSUQgaW5kZXggKC0xIGlmIG5hbWUgaXMgbm90IHZhbGlkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitkZXZfbG9nX2lkIGJjbV9kZXZfbG9nX2lkX2dldF9ieV9uYW1lKGNvbnN0IGNoYXIqIHhpX25hbWUpOworCit1aW50MzJfdCBiY21fZGV2X2xvZ19nZXRfbnVtX29mX2VudHJpZXModm9pZCk7CisKK2JjbW9zX2Jvb2wgYmNtX2Rldl9sb2dfZ2V0X2NvbnRyb2wodm9pZCk7Cit2b2lkIGJjbV9kZXZfbG9nX3NldF9jb250cm9sKGJjbW9zX2Jvb2wgY29udHJvbCk7CisKK2JjbV9kZXZfbG9nX2ZpbGVfZmxhZ3MgYmNtX2Rldl9sb2dfZ2V0X2ZpbGVfZmxhZ3ModWludDMyX3QgZmlsZV9pZCk7Cit2b2lkIGJjbV9kZXZfbG9nX3NldF9maWxlX2ZsYWdzKHVpbnQzMl90IGZpbGVfaWQsIGJjbV9kZXZfbG9nX2ZpbGVfZmxhZ3MgZmxhZ3MpOworCitiY21fZGV2X2xvZ19mbGFncyBiY21fZGV2X2xvZ19nZXRfZmxhZ3Modm9pZCk7Cit2b2lkIGJjbV9kZXZfbG9nX3NldF9mbGFncyhiY21fZGV2X2xvZ19mbGFncyBmbGFncyk7CisKK3ZvaWQgYmNtX2Rldl9sb2dfc2V0X3ByaW50X2NiKGJjbV9kZXZfbG9nX3ByaW50X2NiIGNiKTsKK3ZvaWQgYmNtX2Rldl9sb2dfc2V0X2dldF90aW1lX2NiKGJjbV9kZXZfbG9nX2dldF90aW1lX2NiIGNiKTsKK3ZvaWQgYmNtX2Rldl9sb2dfc2V0X3RpbWVfdG9fc3RyX2NiKGJjbV9kZXZfbG9nX3RpbWVfdG9fc3RyX2NiIGNiKTsKKworLyogRmlsZSBpbmRleCB0byBmaWxlIGhhbmRsZSAqLworYmNtX2Rldl9sb2dfZmlsZSAqYmNtX2Rldl9sb2dfZmlsZV9nZXQodWludDMyX3QgZmlsZV9pbmRleCk7CisKKy8qIEdldCBudW1iZXIgb2YgbWVzc2FnZXMgc3RvcmVkIGluIHRoZSBmaWxlICovCit1aW50MzJfdCBiY21fZGV2X2xvZ19nZXRfbnVtX29mX21lc3NhZ2VzKGJjbV9kZXZfbG9nX2ZpbGUgKmZpbGUpOworCisvKiBHZXQgZmlsZSBpbmZvOiBtYXggZGF0YSBzaXplLCB1c2VkIGJ5dGVzICovCitiY21vc19lcnJubyBiY21fZGV2X2xvZ19nZXRfZmlsZV9pbmZvKGJjbV9kZXZfbG9nX2ZpbGUgKmZpbGUsIHVpbnQzMl90ICpmaWxlX3NpemUsIHVpbnQzMl90ICp1c2VkX2J5dGVzKTsKKworLyogUmVhZCBmcm9tIGZpbGUuCisgKiBccGFyYW1baW5dICAgICAgICAgICBmaWxlICAgIEZpbGUgdG8gcmVhZCBmcm9tCisgKiBccGFyYW1baW4sb3V0XSAgICAgICBvZmZzZXQgIG9mZnNldCB0byByZWFkIGZyb20uIDA9cmVhZCBmcm9tIHRoZSBzdGFydAorICogXHBhcmFtW2luLG91dF0gICAgICAgYnVmICAgICBidWZmZXIgdG8gcmVhZCByZWNvcmRzIHRvCisgKiBccGFyYW1baW5dICAgICAgICAgICBidWZfbGVuIGJ1ZiBzaXplCisgKiBccmV0dXJucyAtIG51bWJlciBvZiBieXRlcyByZWFkID49IDAgb3IgYmNtb3NfZXJybm8gPCAwCisgKiAwID0gbm8gbW9yZSByZWNvcmRzIHRvIHJlYWQKKyAqIEJDTV9FUlJfT1ZFUkZMT1cgLSBidWZmZXIgaXMgdG9vIHNob3J0IGZvciBsb2cgcmVjb3JkCisgKi8KK2ludCBiY21fZGV2X2xvZ19maWxlX3JlYWQoYmNtX2Rldl9sb2dfZmlsZSAqZmlsZSwgdWludDMyX3QgKm9mZnNldCwgY2hhciAqYnVmLCB1aW50MzJfdCBidWZfbGVuKTsKKworLyogQ2xlYXIgZmlsZQorICogXHBhcmFtW2luXSAgICAgICAgICAgZmlsZSAgICBGaWxlIGhhbmRsZQorICogXHJldHVybnMgICAgIGJjbW9zX2Vycm5vIGVycm9yIGNvZGUKKyAqLworYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfZmlsZV9jbGVhcihiY21fZGV2X2xvZ19maWxlICpmaWxlKTsKKworLyogQXR0YWNoIGZpbGUgdG8gbWVtb3J5IGJ1ZmZlci4KKyAqIFRoZSBmaWxlIGRhdGEgY2FuIGJlIHJlYWQgdXNpbmcgYmNtX2Rldl9sb2dfZmlsZV9yZWFkIG9yIGJjbV9kZXZfbG9nX2ZpbGVfcmVhZF9jdXQKKyAqIFxwYXJhbVtpbl0gICAgICAgICAgIGJ1ZiAgICAgYnVmZmVyIHRvIGJlIGludGVycHJldGVkIGFzIG1lbW9yeSBmaWxlCisgKiBccGFyYW1baW5dICAgICAgICAgICBidWZfbGVuIGJ1ZiBzaXplCisgKiBccGFyYW1bb3V0XSAgICAgICAgICBmaWxlICAgIEZpbGUgaGFuZGxlLgorICogZmlsZV9oYW5kbGUgaGFzIHRvIGJlIGRlc3Ryb3llZCB1c2luZyBiY21fZGV2X2xvZ19maWxlX2RldGFjaCgpIHdoZW4gbm8gbG9uZ2VyIG5lZWRlZC4KKyAqIFxyZXR1cm5zICAgICBiY21vc19lcnJubyBlcnJvciBjb2RlCisgKi8KK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2ZpbGVfYXR0YWNoKHZvaWQgKmJ1ZiwgdWludDMyX3QgYnVmX2xlbiwgYmNtX2Rldl9sb2dfZmlsZSAqZmlsZSk7CisKKy8qIERldGFjaCBmaWxlIGhhbmRsZSBmcm9tIG1lbW9yeSBidWZmZXIuCisgKiBGb2xsb3dpbmcgdGhpcyBjYWxsLCB0aGUgZmlsZSBoYW5kbGUgYmVjb21lcyBpbnZhbGlkCisgKiBccGFyYW1baW5dICAgICAgICAgICBmaWxlICAgIEZpbGUgaGFuZGxlLgorICogXHJldHVybnMgICAgIGJjbW9zX2Vycm5vIGVycm9yIGNvZGUKKyAqLworYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfZmlsZV9kZXRhY2goYmNtX2Rldl9sb2dfZmlsZSAqZmlsZSk7CisKKy8qIFJlZ2lzdGVyIGluZGljYXRpb24gdG8gYmUgc2VudCB3aGVuIGZpbGUgdXRpbGl6YXRpb24gY3Jvc3NlcyB0aHJlc2hvbGQgKi8KK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2FsbW9zdF9mdWxsX2luZF9yZWdpc3RlcihiY21fZGV2X2xvZ19maWxlICpmaWxlLCB1aW50MzJfdCB1c2VkX2J5dGVzX3RocmVzaG9sZCwKKyAgICBGX2Rldl9sb2dfZmlsZV9hbG1vc3RfZnVsbCBzZW5kX2luZF9jYiwgbG9uZyBpbmRfY2JfcHJpdik7CisKK3ZvaWQgZGV2X2xvZ19nZXRfbG9nX25hbWVfdGFibGUoY2hhciAqYnVmZmVyLCB1aW50MzJfdCBidWZfbGVuKTsKKwordm9pZCBiY21fZGV2X2xvZ19kcm9wX3JlcG9ydCh2b2lkKTsKKworLyoqIEhlbHBlciBmdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgYSBnaXZlbiBsb2cgbGV2ZWwgcXVhbGlmaWVzIGFzIGFuIGVycm9yLiAqLworc3RhdGljIGlubGluZSBiY21vc19ib29sIGJjbV9kZXZfbG9nX2xldmVsX2lzX2Vycm9yKGJjbV9kZXZfbG9nX2xldmVsIGxvZ19sZXZlbCkKK3sKKyAgICByZXR1cm4gbG9nX2xldmVsID09IERFVl9MT0dfTEVWRUxfRkFUQUwgfHwgbG9nX2xldmVsID09IERFVl9MT0dfTEVWRUxfRVJST1I7Cit9CisKKy8qKiBSZXR1cm5zIHRoZSBwZXJjZW50YWdlICgwIC0gMTAwKSBvZiB0aGUgbXNnIHBvb2wgdGhhdCBpcyBjdXJyZW50bHkgaW4gdXNlLiAqLwordWludDhfdCBiY21fZGV2X2xvZ19wb29sX29jY3VwYW5jeV9wZXJjZW50X2dldCh2b2lkKTsKKworI2lmZGVmIFRSSUdHRVJfTE9HR0VSX0ZFQVRVUkUKK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX3NldF90aHJvdHRsZShkZXZfbG9nX2lkIHhpX2lkLCBiY21fZGV2X2xvZ19sZXZlbCB4aV9sb2dfbGV2ZWwsIHVpbnQzMl90IHhpX3Rocm90dGxlKTsKKworYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfc2V0X3RyaWdnZXIoZGV2X2xvZ19pZCB4aV9pZCwgYmNtX2Rldl9sb2dfbGV2ZWwgeGlfbG9nX2xldmVsLCB1aW50MzJfdCB4aV9zdGFydCwgdWludDMyX3QgeGlfc3RvcCwgaW50MzJfdCB4aV9yZXBlYXQpOworI2VuZGlmIC8qIFRSSUdHRVJfTE9HR0VSX0ZFQVRVUkUgKi8KKworI2VuZGlmIC8qIEVOQUJMRV9MT0cgKi8KKworI2VuZGlmIC8qIF9fQkNNX0RFVl9MT0dfVEFTS19IXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2cvYmNtX2Rldl9sb2dfdGFza19pbnRlcm5hbC5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2cvYmNtX2Rldl9sb2dfdGFza19pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhYTNlODEKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZy9iY21fZGV2X2xvZ190YXNrX2ludGVybmFsLmgKQEAgLTAsMCArMSwxMDEgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgX19CQ01fREVWX0xPR19UQVNLX0lOVEVSTkFMX0hfCisjZGVmaW5lIF9fQkNNX0RFVl9MT0dfVEFTS19JTlRFUk5BTF9IXworCisjaWZkZWYgRU5BQkxFX0xPRworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisKKyNkZWZpbmUgTE9HX05BTUVfTk9fSU5TVEFOQ0UgMHhmZgorI2RlZmluZSBMT0dfTkFNRV9MRU5HVEggICAgICAxMDAKKwordHlwZWRlZiBlbnVtCit7CisgICAgQkNNX0RFVl9MT0dfU1RBVEVfVU5JTklUSUFMSVpFRCwKKyAgICBCQ01fREVWX0xPR19TVEFURV9ESVNBQkxFRCwKKyAgICBCQ01fREVWX0xPR19TVEFURV9FTkFCTEVELAorfSBiY21fZGV2X2xvZ19zdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21fZGV2X2xvZ19wYXJtIGRldl9sb2dfcGFybTsKKyAgICBiY21fZGV2X2xvZ19maWxlIGZpbGVzW0RFVl9MT0dfTUFYX0ZJTEVTXTsgLyogbG9nIGZpbGVzICovCisgICAgdWludDMyX3QgbXNnX2NvdW50OyAvKiBNZXNzYWdlIGNvdW50ZXIgKi8KKyAgICBkZXZfbG9nX2lkX3Bhcm0gaWRzW0RFVl9MT0dfTUFYX0lEU107IC8qIGRldl9sb2cgSURTIGFycmF5ICovCisgICAgdWludDMyX3QgbnVtX2lkczsgLyogTnVtYmVyIG9mIGFjdHVhbGx5IHJlZ2lzdGVyZWQgaWRzICovCisgICAgYmNtX2Rldl9sb2dfc3RhdGUgc3RhdGU7CisgICAgYmNtb3NfbXNnX3F1ZXVlIHNhdmVfcXVldWU7IC8qIExvZyBtZXNzYWdlcyB0byBiZSBzYXZlZCB0byBSQU0gKGZpcnN0IHN0YWdlIG9mIHBpcGVsaW5lKSAqLworICAgIGJjbW9zX21zZ19xdWV1ZSBwcmludF9xdWV1ZTsgLyogTG9nIG1lc3NhZ2VzIHRvIGJlIHByaW50ZWQgKHNlY29uZCBzdGFnZSBvZiBwaXBlbGluZSkgKi8KKyAgICBiY21vc190YXNrIHNhdmVfdGFzazsKKyAgICBiY21vc190YXNrIHByaW50X3Rhc2s7CisgICAgYmNtb3Nfc2VtIHNhdmVfdGFza19pc190ZXJtaW5hdGVkOworICAgIGJjbW9zX3NlbSBwcmludF90YXNrX2lzX3Rlcm1pbmF0ZWQ7CisgICAgYmNtb3NfbXNnX3Bvb2wgcG9vbDsKKyAgICBiY21fZGV2X2xvZ19mbGFncyBmbGFnczsgLyogR2VuZXJhbCBmbGFncyBhcHBsaWVkIG9uIHRoZSBlbnRpcmUgZmVhdHVyZSAodW5saWtlIGZpbGUgZmxhZ3Mgd2hpY2ggcmVzaWRlIGluICdmaWxlcycgc3ViLXN0cnVjdHVyZSkuICovCit9IGJjbV9kZXZfbG9nOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGRldl9sb2dfaWRfcGFybSAqbG9nX2lkOworICAgIHVpbnQzMl90IHRpbWVfc3RhbXA7CisgICAgYmNtX2Rldl9sb2dfbGV2ZWwgbXNnX2xldmVsOworICAgIHVpbnQzMl90IGZsYWdzOworICAgIHVuaW9uCisgICAgeworICAgICAgICBzdHJ1Y3QKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgY2hhciAqZm10OworICAgICAgICAgICAgLyogUm9vbSBmb3IgTUFYICsgMSBhcmd1bWVudHMgc2luY2UgdGhlIGFyZ3VtZW50IGxpc3QgbmVlZHMgdG8gc3RhcnQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IC0gdGhlIGZpcnN0CisgICAgICAgICAgICAgKiBlbnRyeSBtYXkgYmUgdW51c2VkIGlmIHRoZSBhcnJheSBkb2Vzbid0IG5hdHVyYWxseSBzdGFydCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuICovCisgICAgICAgICAgICBjb25zdCB2b2lkICphcmdzW0RFVl9MT0dfTUFYX0FSR1MgKyAxXTsKKyAgICAgICAgfSBmbXRfYXJnczsgLyogUmVsZXZhbnQgaW4gZGVmYXVsdCBtb2RlIC0gd2hlbiBub3QgdXNpbmcgQkNNX0xPR19GTEFHX0NBTExFUl9GTVQgKi8KKyAgICAgICAgY2hhciBzdHJbTUFYX0RFVl9MT0dfU1RSSU5HX1NJWkVdOyAvKiBSZWxldmFudCBvbmx5IGlmIHVzaW5nIEJDTV9MT0dfRkxBR19DQUxMRVJfRk1UICovCisgICAgfSB1OworfSBkZXZfbG9nX3F1ZXVlX21zZzsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBjaGFyIG5hbWVbTE9HX05BTUVfTEVOR1RIXTsKKyAgICB1aW50OF90IGZpcnN0X2luc3RhbmNlOworICAgIHVpbnQ4X3QgbGFzdF9pbnN0YW5jZTsKK31sb2dfbmFtZV90YWJsZTsKKworZXh0ZXJuIGJjbV9kZXZfbG9nIGRldl9sb2c7CitleHRlcm4gY29uc3QgY2hhciAqbG9nX2xldmVsX3N0cjsKKworZXh0ZXJuIGxvZ19uYW1lX3RhYmxlIGxvZ3NfbmFtZXNbREVWX0xPR19NQVhfSURTXTsKK2V4dGVybiB1aW50OF90IGxvZ19uYW1lX3RhYmxlX2luZGV4OworCitiY21vc19lcnJubyBfYmNtX2Rldl9sb2dfZmlsZV9jbGVhcl9ub19sb2NrKHVpbnQzMl90IGZpbGVfaW5kZXgpOworCisjZW5kaWYgLyogRU5BQkxFX0xPRyAqLworCisjZW5kaWYgLyogX19CQ01fREVWX0xPR19UQVNLX0lOVEVSTkFMX0hfICovCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZ19saW51eC9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ODJjYmMKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZ19saW51eC9NYWtlZmlsZQpAQCAtMCwwICsxLDE3IEBACisjIGRldl9sb2cgbGludXggc3VwcG9ydAorIyBsaW51eCB1c2VyIHNwYWNlCisjIAorCitpZmVxICgiJChPU19LRVJORUwpIiwgImxpbnV4IikKKworTU9EX05BTUUgPSBkZXZfbG9nX2xpbnV4CitNT0RfVFlQRSA9IGxpYgorCitpZmVxICgiJChFTkFCTEVfTE9HKSIsICJ5IikKKworTU9EX0RFUFMgPSBkZXZfbG9nCitzcmNzID0gYmNtb2x0X2Rldl9sb2dfbGludXguYworCitlbmRpZgorCitlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2dfbGludXgvYmNtb2x0X2Rldl9sb2dfbGludXguYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2JjbW9sdF9kZXZfbG9nX2xpbnV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVhMmFkNQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2JjbW9sdF9kZXZfbG9nX2xpbnV4LmMKQEAgLTAsMCArMSwyNzAgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKy8qCisgKiBiY21fZGV2X2xvZ19saW51eC5jCisgKgorICogTGludXgtc3BlY2lmaWMgY29kZS4gVXNlciBzcGFjZQorICovCisKKyNpbmNsdWRlIDxiY21vbHRfZGV2X2xvZ19saW51eC5oPgorI2luY2x1ZGUgPGtlcm5lbC9iY21vbHRfZGV2X2xvZ19pb2N0bC5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjZGVmaW5lIEJDTV9ERVZfTE9HX0ZJTEVfTkFNRSAgICAgICAgICAgIi9kZXYvYmNtX2xvZyIKKyNkZWZpbmUgQkNNX0RFVl9MT0dfUE9MTF9JTlRFUlZBTF9VUyAgICAxMDAwMAorCitzdGF0aWMgaW50IGRldl9sb2dfZmlsZTsKK3N0YXRpYyBiY21vc190YXNrIGRldl9sb2dfcmVhZF90YXNrOworc3RhdGljIGludCBtYXhfa2VybmVsX2lkX2luZGV4OworLyoKKyAqIEludGVybmFsIGhlbHBlcnMKKyAqLworCisvKiByZWFkIGtlcm5lbCBEQiAqLworc3RhdGljIGJjbW9zX2Vycm5vIF9kZXZfbG9nX2tlcm5lbF9kYl9yZWFkKHZvaWQpCit7CisgICAgZGV2X2xvZ19pb19wYXJhbSBpb19wYXJhbTsKKyAgICBpbnQgaTsKKworICAgIGlmIChpb2N0bChkZXZfbG9nX2ZpbGUsIERFVl9MT0dfQ0hSREVWX0RCX1JFQUQsICZpb19wYXJhbSkgPT0gLTEpCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9JTywgIkNhbid0IHJlYWQga2VybmVsIGRhdGEgYmFzZS4gRXJyb3IgJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgfQorCisgICAgLyogUmVnaXN0ZXIga2VybmVsIGxvZyBpZHMgKi8KKyAgICBmb3IgKGk9MDsgaTxpb19wYXJhbS5kYl9yZWFkLm51bV9pZHM7IGkrKykKKyAgICB7CisgICAgICAgIGJjbV9kZXZfbG9nX2lkX3JlZ2lzdGVyKGlvX3BhcmFtLmRiX3JlYWQuaWRzW2ldLm5hbWUsCisgICAgICAgICAgICBpb19wYXJhbS5kYl9yZWFkLmlkc1tpXS5kZWZhdWx0X2xldmVsLAorICAgICAgICAgICAgaW9fcGFyYW0uZGJfcmVhZC5pZHNbaV0uZGVmYXVsdF90eXBlKTsKKyAgICB9CisgICAgbWF4X2tlcm5lbF9pZF9pbmRleCA9IGk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogaWRlbnRpZnkgbG9nIGxldmVsIGJ5IGxldmVsIGNoYXIgKi8KK3N0YXRpYyBiY21fZGV2X2xvZ19sZXZlbCBfZGV2X2xvZ19sZXZlbF9ieV9jaGFyKGNoYXIgY2xldmVsKQoreworICAgIGJjbV9kZXZfbG9nX2xldmVsIGxldmVsOworCisgICAgc3dpdGNoIChjbGV2ZWwpCisgICAgeworICAgIGNhc2UgJ0YnOiBsZXZlbCA9IERFVl9MT0dfTEVWRUxfRkFUQUw7IGJyZWFrOworICAgIGNhc2UgJ0UnOiBsZXZlbCA9IERFVl9MT0dfTEVWRUxfRVJST1I7IGJyZWFrOworICAgIGNhc2UgJ1cnOiBsZXZlbCA9IERFVl9MT0dfTEVWRUxfV0FSTklORzsgYnJlYWs7CisgICAgY2FzZSAnSSc6IGxldmVsID0gREVWX0xPR19MRVZFTF9JTkZPOyBicmVhazsKKyAgICBjYXNlICdEJzogbGV2ZWwgPSBERVZfTE9HX0xFVkVMX0RFQlVHOyBicmVhazsKKyAgICBkZWZhdWx0OiBsZXZlbCA9IERFVl9MT0dfTEVWRUxfTk9fTE9HOyBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gbGV2ZWw7Cit9CisKKy8qIHJlYWRfYnVmIHRhc2sgaGFuZGxlciAqLworc3RhdGljIGludCBfZGV2X2xvZ19yZWFkX2tlcm5lbF9idWZfaGFuZGxlcihsb25nIGRhdGEpCit7CisgICAgZGV2X2xvZ19pb19wYXJhbSBpb19wYXJhbSA9IHt9OworICAgIHVuc2lnbmVkIGxvbmcgbG9nX3RpbWU7CisgICAgY2hhciBsZXZlbF9jaGFyOworICAgIGNoYXIgbG9nX25hbWVbTUFYX0RFVl9MT0dfSURfTkFNRV07CisgICAgaW50IG47CisgICAgZGV2X2xvZ19pZCBpZDsKKyAgICBiY21fZGV2X2xvZ19sZXZlbCBsZXZlbDsKKworICAgIHdoaWxlIChkZXZfbG9nX2ZpbGUpCisgICAgeworICAgICAgICBpZiAoaW9jdGwoZGV2X2xvZ19maWxlLCBERVZfTE9HX0NIUkRFVl9NU0dfUkVBRCwgJmlvX3BhcmFtKSA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIElmIG5vIGVudHJpZXMgLSBzbGVlcCBhbnQgcmV0cnkuIE90aGVyd2lzZSAtIHN0b3AgKi8KKyAgICAgICAgICAgIGlmIChlcnJubyA9PSBFQUdBSU4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtb3NfdXNsZWVwKEJDTV9ERVZfTE9HX1BPTExfSU5URVJWQUxfVVMpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJpb2N0bCgpLT4lZCAoJXMpXG4iLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogcGFyc2Uga2VybmVsIG1lc3NhZ2UgKi8KKyAgICAgICAgbiA9IHNzY2FuZihpb19wYXJhbS5tc2dfcmVhZC5tc2csICJbJWx1OiAlYyAlMjBzXSIsICZsb2dfdGltZSwgJmxldmVsX2NoYXIsIGxvZ19uYW1lKTsKKyAgICAgICAgaWYgKG4gPCAzKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PU19UUkFDRV9FUlIoIkNhbid0IHBhcnNlIGtlcm5lbCBsb2c6ICVzXG4iLCBpb19wYXJhbS5tc2dfcmVhZC5tc2cpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvKiBJZGVudGlmeSBsb2dfaWQgKi8KKyAgICAgICAgaWQgPSBiY21fZGV2X2xvZ19pZF9nZXRfYnlfbmFtZShsb2dfbmFtZSk7CisgICAgICAgIGlmIChpZCA9PSBERVZfTE9HX0lOVkFMSURfSUQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTU9TX1RSQUNFX0VSUigiQ2FuJ3QgaWRlbnRpZnkgbG9nIGlkOiAlc1xuIiwgaW9fcGFyYW0ubXNnX3JlYWQubXNnKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLyogSWRlbnRpZnkgbG9nX2xldmVsICovCisgICAgICAgIGxldmVsID0gX2Rldl9sb2dfbGV2ZWxfYnlfY2hhcihsZXZlbF9jaGFyKTsKKyAgICAgICAgaWYgKGxldmVsID09IERFVl9MT0dfTEVWRUxfTk9fTE9HKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PU19UUkFDRV9FUlIoIkNhbid0IGlkZW50aWZ5IGxvZyBsZXZlbDogJXNcbiIsIGlvX3BhcmFtLm1zZ19yZWFkLm1zZyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGxvZyBrZXJuZWwgbWVzc2FnZSBpbiB1c2VyLXNwYWNlIGxvZ2dlci4KKyAgICAgICAgICogRG8gbm90IGdlbmVyYXRlIGhlYWRlci4gSXQgaXMgYWxyZWFkeSBpbiB0aGUgbWVzc2FnZQorICAgICAgICAgKi8KKyAgICAgICAgYmNtX2Rldl9sb2dfbG9nKGlkLCBsZXZlbCwgQkNNX0xPR19GTEFHX05PX0hFQURFUiB8IEJDTV9MT0dfRkxBR19DQUxMRVJfRk1ULCAiJXMiLCBpb19wYXJhbS5tc2dfcmVhZC5tc2cpOworICAgIH0KKyAgICBCQ01PU19UUkFDRV9JTkZPKCJLZXJuZWwgbG9nZ2VyIGRhZW1vbiB0ZXJtaW5hdGVkXG4iKTsKKworICAgIHJldHVybiAwOworfQorCisvKiogTGludXgtc3BlY2lmaWMgaW5pdCAqLworYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfbGludXhfaW5pdCh2b2lkKQoreworICAgIHN0YXRpYyBjaGFyICp0YXNrX25hbWUgPSAia2VybmVsX2xvZyI7CisgICAgYmNtb3NfdGFza19wYXJtIHRhc2twID0KKyAgICB7CisgICAgICAgIC5uYW1lID0gdGFza19uYW1lLAorICAgICAgICAucHJpb3JpdHkgPSBUQVNLX1BSSU9SSVRZX0RFVl9MT0dfS0VSTkVMLAorICAgICAgICAuaGFuZGxlciA9IF9kZXZfbG9nX3JlYWRfa2VybmVsX2J1Zl9oYW5kbGVyCisgICAgfTsKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIGlmIChkZXZfbG9nX2ZpbGUpCisgICAgICAgIHJldHVybiBCQ01fRVJSX0FMUkVBRFk7CisKKyAgICAvKiBSZWFkIGtlcm5lbCByZWdpc3RyYXRpb25zICovCisgICAgZGV2X2xvZ19maWxlID0gb3BlbihCQ01fREVWX0xPR19GSUxFX05BTUUsIE9fUkRXUik7CisgICAgaWYgKGRldl9sb2dfZmlsZSA8IDApCisgICAgeworICAgICAgICBkZXZfbG9nX2ZpbGUgPSAwOworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9OT0VOVCwgIkNhbid0IG9wZW4gJXMgZm9yIHJlYWQvd3JpdGUuIEVycm9yICVzXG4iLAorICAgICAgICAgICAgQkNNX0RFVl9MT0dfRklMRV9OQU1FLCBzdHJlcnJvcihlcnJubykpOworICAgIH0KKworICAgIC8qIFJlYWQga2VybmVsIGRhdGEgYmFzZSAqLworICAgIHJjID0gX2Rldl9sb2dfa2VybmVsX2RiX3JlYWQoKTsKKyAgICBpZiAocmMpCisgICAgeworICAgICAgICBjbG9zZShkZXZfbG9nX2ZpbGUpOworICAgICAgICBkZXZfbG9nX2ZpbGUgPSAwOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgLyogQ3JlYXRlIGEgdGFzayB0aGF0IHdpbGwgcG9sbCBrZXJuZWwgYnVmZmVyICovCisgICAgcmMgPSBiY21vc190YXNrX2NyZWF0ZSgmZGV2X2xvZ19yZWFkX3Rhc2ssICZ0YXNrcCk7CisgICAgaWYgKHJjKQorICAgIHsKKyAgICAgICAgY2xvc2UoZGV2X2xvZ19maWxlKTsKKyAgICAgICAgZGV2X2xvZ19maWxlID0gMDsKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKHJjLCAiQ2FuJ3QgY3JlYXRlIHJlYWRfa2VybmVsX2J1ZiB0YXNrXG4iKTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyoqIExpbnV4LXNwZWNpZmljIGNsZWFudXAgKi8KK3ZvaWQgYmNtX2Rldl9sb2dfbGludXhfZXhpdCh2b2lkKQoreworICAgIGludCBmID0gZGV2X2xvZ19maWxlOworICAgIGlmICghZGV2X2xvZ19maWxlKQorICAgICAgICByZXR1cm47CisgICAgZGV2X2xvZ19maWxlID0gMDsKKyAgICBjbG9zZShmKTsgLyogd2lsbCBjYXVzZSBwZW5kaW5nIGlvY3RsIHRvIHVubG9jayAqLworICAgIGJjbW9zX3Rhc2tfZGVzdHJveSgmZGV2X2xvZ19yZWFkX3Rhc2spOworfQorCisvKiBub3RpZnkgZGV2X2xvZyBpbiBrZXJuZWwgc3BhY2UgYWJvdXQgbG9nX3R5cGUgY2hhbmdlICovCitiY21vc19lcnJubyBiY21fZGV2X2xvZ19saW51eF9pZF9zZXRfdHlwZShkZXZfbG9nX2lkIGxvZ19pZCwgYmNtX2Rldl9sb2dfaWRfdHlwZSBsb2dfdHlwZSkKK3sKKyAgICBkZXZfbG9nX2lvX3BhcmFtIGlvX3BhcmFtOworICAgIHVpbnQzMl90IGlkeDsKKworICAgIGlmICghZGV2X2xvZ19maWxlKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9TVEFURTsKKworICAgIC8qIG1hcCB0byBpbmRleC4gaWQgaW4ga2VybmVsIHNwYWNlIGlzIGRpZmZlcmVudCAqLworICAgIGlkeCA9IGJjbV9kZXZfbG9nX2dldF9pbmRleF9ieV9pZChsb2dfaWQpOworICAgIGlmIChpZHggPT0gREVWX0xPR19JTlZBTElEX0lOREVYKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfUEFSTSwgIkNhbid0IG1hcCBsb2dfaWQgdG8gaW5kZXhcbiIpOworICAgIH0KKworICAgIC8qIElnbm9yZSB0aGUgcmVxdWVzdCBpZiBsb2dfaWQgaXMgbm90IGluIHRoIGVrZXJuZWwgKi8KKyAgICBpZiAoaWR4ID4gbWF4X2tlcm5lbF9pZF9pbmRleCkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisKKyAgICBpb19wYXJhbS50eXBlX3NldC5pbmRleCA9IGlkeDsKKyAgICBpb19wYXJhbS50eXBlX3NldC50eXBlID0gbG9nX3R5cGU7CisgICAgaWYgKGlvY3RsKGRldl9sb2dfZmlsZSwgREVWX0xPR19DSFJERVZfVFlQRV9TRVQsICZpb19wYXJhbSkgPT0gLTEpCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9JTywgIkNhbid0IHNldCB0eXBlIGZvciBrZXJuZWwgbG9nIGlkICVsdS4gRXJyb3IgJXNcbiIsIGxvZ19pZCwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLyogbm90aWZ5IGRldl9sb2cgaW4ga2VybmVsIHNwYWNlIGFib3V0IGxvZ19sZXZlbCBjaGFuZ2UgKi8KK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2xpbnV4X2lkX3NldF9sZXZlbChkZXZfbG9nX2lkIGxvZ19pZCwgYmNtX2Rldl9sb2dfbGV2ZWwgbG9nX2xldmVsX3ByaW50LCBiY21fZGV2X2xvZ19sZXZlbCBsb2dfbGV2ZWxfc2F2ZSkKK3sKKyAgICB1aW50MzJfdCBpZHg7CisgICAgZGV2X2xvZ19pb19wYXJhbSBpb19wYXJhbTsKKworICAgIGlmICghZGV2X2xvZ19maWxlKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9TVEFURTsKKworICAgIC8qIG1hcCB0byBpbmRleC4gaWQgaW4ga2VybmVsIHNwYWNlIGlzIGRpZmZlcmVudCAqLworICAgIGlkeCA9IGJjbV9kZXZfbG9nX2dldF9pbmRleF9ieV9pZChsb2dfaWQpOworICAgIGlmIChpZHggPT0gREVWX0xPR19JTlZBTElEX0lOREVYKQorICAgIHsKKyAgICAgICAgQkNNT1NfVFJBQ0VfUkVUVVJOKEJDTV9FUlJfUEFSTSwgIkNhbid0IG1hcCBsb2dfaWQgdG8gaW5kZXhcbiIpOworICAgIH0KKworICAgIC8qIElnbm9yZSB0aGUgcmVxdWVzdCBpZiBsb2dfaWQgaXMgbm90IGluIHRoZSBrZXJuZWwgKi8KKyAgICBpZiAoaWR4ID4gbWF4X2tlcm5lbF9pZF9pbmRleCkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisKKyAgICBpb19wYXJhbS5sZXZlbF9zZXQuaW5kZXggPSBpZHg7CisgICAgaW9fcGFyYW0ubGV2ZWxfc2V0LmxldmVsX3ByaW50ID0gbG9nX2xldmVsX3ByaW50OworICAgIGlvX3BhcmFtLmxldmVsX3NldC5sZXZlbF9zYXZlID0gbG9nX2xldmVsX3NhdmU7CisKKyAgICBpZiAoaW9jdGwoZGV2X2xvZ19maWxlLCBERVZfTE9HX0NIUkRFVl9MRVZFTF9TRVQsICZpb19wYXJhbSkgPT0gLTEpCisgICAgeworICAgICAgICBCQ01PU19UUkFDRV9SRVRVUk4oQkNNX0VSUl9JTywgIkNhbid0IHNldCBsZXZlbCBmb3Iga2VybmVsIGxvZyBpZCAlbHUuIEVycm9yICVzXG4iLCBsb2dfaWQsIHN0cmVycm9yKGVycm5vKSk7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZ19saW51eC9iY21vbHRfZGV2X2xvZ19saW51eC5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2dfbGludXgvYmNtb2x0X2Rldl9sb2dfbGludXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDM2ZTEzCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2dfbGludXgvYmNtb2x0X2Rldl9sb2dfbGludXguaApAQCAtMCwwICsxLDY5IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisvKgorICogYmNtX2Rldl9sb2dfbGludXguaAorICoKKyAqIExpbnV4LXNwZWNpZmljIGNvZGUuIFVzZXIgc3BhY2UKKyAqLworCisjaWZuZGVmIEJDTU9MVF9ERVZfTE9HX0xJTlVYX0hfCisjZGVmaW5lIEJDTU9MVF9ERVZfTE9HX0xJTlVYX0hfCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21fZGV2X2xvZy5oPgorCisvKiogTGludXgtc3BlY2lmaWMgaW5pdCAqLworYmNtb3NfZXJybm8gYmNtX2Rldl9sb2dfbGludXhfaW5pdCh2b2lkKTsKKworLyoqIExpbnV4LXNwZWNpZmljIGNsZWFudXAgKi8KK3ZvaWQgYmNtX2Rldl9sb2dfbGludXhfZXhpdCh2b2lkKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFic3RyYWN0OiBTZXQgY3VycmVudCBsb2cgdHlwZSBmb3IgYW4gSUQKKyAqCisgKiBccGFyYW1baW5dICAgbG9nX2lkICAgICAgTG9nIGlkCisgKiBccGFyYW1baW5dICAgbG9nX3R5cGUgICAgTG9nIHR5cGUKKyAqCisgKiBccmV0dXJucyAwPU9LIG9yIGVycm9yIGNvZGUgPDAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBiY21fZGV2X2xvZ19saW51eF9pZF9zZXRfdHlwZShkZXZfbG9nX2lkIGxvZ19pZCwgYmNtX2Rldl9sb2dfaWRfdHlwZSBsb2dfdHlwZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBYnN0cmFjdDogU2V0IGN1cnJlbnQgbG9nIGxldmVsIGZvciBhbiBJRAorICoKKyAqIFxwYXJhbVtpbl0gICBsb2dfaWQgICAgICAgICAgTG9nIGlkCisgKiBccGFyYW1baW5dICAgbG9nX2xldmVsX3ByaW50IFByaW50IGxldmVsCisgKiBccGFyYW1baW5dICAgbG9nX2xldmVsX3NhdmUgIFNhdmUgbGV2ZWwKKyAqCisgKiBccmV0dXJucyAwPU9LIG9yIGVycm9yIGNvZGUgPDAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitiY21vc19lcnJubyBiY21fZGV2X2xvZ19saW51eF9pZF9zZXRfbGV2ZWwoZGV2X2xvZ19pZCBsb2dfaWQsIGJjbV9kZXZfbG9nX2xldmVsIGxvZ19sZXZlbF9wcmludCwgYmNtX2Rldl9sb2dfbGV2ZWwgbG9nX2xldmVsX3NhdmUpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2tlcm5lbC9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2tlcm5lbC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2U0MTU4Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2dfbGludXgva2VybmVsL01ha2VmaWxlCkBAIC0wLDAgKzEsMjQgQEAKKyMgZGV2X2xvZyAtIGtlcm5lbCBzdXBwb3J0CisjCitpZmVxICgiJChPU19LRVJORUwpIiwgImxpbnV4IikKKworTU9EX05BTUUgPSBkZXZfbG9nX2tlcm5lbAorTU9EX1RZUEUgPSBsaW51eF9saWIKKworaWZlcSAoIiQoRU5BQkxFX0xPRykiLCAieSIpCisKK01PRF9ERUZTID0gLURFTkFCTEVfTE9HCisKK3NyY3MgPSBiY21fZGV2X2xvZy5jIGJjbV9kZXZfbG9nX3Rhc2suYyBiY21vbHRfZGV2X2xvZ19rZXJuZWwuYyAKKworIyBJZiBjYWxsZWQgYnkgbGludXgga2VybmVsIGJ1aWxkZXIgLSBhZGQgaW5jbHVkZSBwYXRocyBtYW51YWxseS4KKyMgSXQgaXMgbm90IGVsZWdhbnQsIGJ1dCB3ZSdsbCBub3QgaGF2ZSBtYW55IGxpbnV4IG1vZHVsZXMKK2lmbmVxICgiJChLQlVJTERfU1JDKSIsICIiKQorICAgIC1pbmNsdWRlICQoT1VUX0RJUl9CQVNFKS9NYWtlZmlsZS5jb25maWcuJChNT0RfTkFNRSkKK2VuZGlmCisKKyMgaWZlcSAoIiQoRU5BQkxFX0xPRykiLCAieSIpCitlbmRpZgorCisjIGlmZXEgKCIkKE9TX0tFUk5FTCkiLCAibGludXgiKQorZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2tlcm5lbC9iY21fZGV2X2xvZy5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2dfbGludXgva2VybmVsL2JjbV9kZXZfbG9nLmMKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMDdiNzlhZAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2tlcm5lbC9iY21fZGV2X2xvZy5jCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2cvYmNtX2Rldl9sb2cuYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2tlcm5lbC9iY21fZGV2X2xvZy5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2dfbGludXgva2VybmVsL2JjbV9kZXZfbG9nLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZWQzMDFiZAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2tlcm5lbC9iY21fZGV2X2xvZy5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2cvYmNtX2Rldl9sb2cuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2tlcm5lbC9iY21fZGV2X2xvZ19jbGkuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2tlcm5lbC9iY21fZGV2X2xvZ19jbGkuYwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5hYTMxNmE3Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2dfbGludXgva2VybmVsL2JjbV9kZXZfbG9nX2NsaS5jCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2cvYmNtX2Rldl9sb2dfY2xpLmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZ19saW51eC9rZXJuZWwvYmNtX2Rldl9sb2dfY2xpLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZ19saW51eC9rZXJuZWwvYmNtX2Rldl9sb2dfY2xpLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYzQ0ODBlYgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2tlcm5lbC9iY21fZGV2X2xvZ19jbGkuaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nL2JjbV9kZXZfbG9nX2NsaS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2dfbGludXgva2VybmVsL2JjbV9kZXZfbG9nX3Rhc2suYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2tlcm5lbC9iY21fZGV2X2xvZ190YXNrLmMKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYzRhOGIyYgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2tlcm5lbC9iY21fZGV2X2xvZ190YXNrLmMKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vaG9zdF9yZWZlcmVuY2UvZGV2X2xvZy9iY21fZGV2X2xvZ190YXNrLmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZ19saW51eC9rZXJuZWwvYmNtX2Rldl9sb2dfdGFzay5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2dfbGludXgva2VybmVsL2JjbV9kZXZfbG9nX3Rhc2suaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi45OWFjZDZkCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2dfbGludXgva2VybmVsL2JjbV9kZXZfbG9nX3Rhc2suaApAQCAtMCwwICsxIEBACisuLi8uLi8uLi9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nL2JjbV9kZXZfbG9nX3Rhc2suaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2tlcm5lbC9iY21fZGV2X2xvZ190YXNrX2ludGVybmFsLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZ19saW51eC9rZXJuZWwvYmNtX2Rldl9sb2dfdGFza19pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjU1NzM4ODIKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZ19saW51eC9rZXJuZWwvYmNtX2Rldl9sb2dfdGFza19pbnRlcm5hbC5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2cvYmNtX2Rldl9sb2dfdGFza19pbnRlcm5hbC5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2dfbGludXgva2VybmVsL2JjbW9sdF9kZXZfbG9nX2lvY3RsLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2X2xvZ19saW51eC9rZXJuZWwvYmNtb2x0X2Rldl9sb2dfaW9jdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzM1MzZjCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2dfbGludXgva2VybmVsL2JjbW9sdF9kZXZfbG9nX2lvY3RsLmgKQEAgLTAsMCArMSw4NiBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBCQ01PTFRfREVWX0xPR19JT0NUTF9IXworI2RlZmluZSBCQ01PTFRfREVWX0xPR19JT0NUTF9IXworCisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKworI2luY2x1ZGUgPGJjbV9kZXZfbG9nLmg+CisKKyNkZWZpbmUgREVWX0xPR19DSFJERVZfTUFYX0tFUk5FTF9JRFMgICAzMgorCisvKiBJRCBkZXNjcmlwdG9yICovCit0eXBlZGVmIHN0cnVjdCBkZXZfbG9nX2lkX2luZm8KK3sKKyAgICB1aW50MzJfdCBpbmRleDsKKyAgICBjaGFyIG5hbWVbTUFYX0RFVl9MT0dfSURfTkFNRSArIDFdOworICAgIGJjbV9kZXZfbG9nX2xldmVsIGRlZmF1bHRfbGV2ZWw7CisgICAgYmNtX2Rldl9sb2dfaWRfdHlwZSBkZWZhdWx0X3R5cGU7Cit9IGRldl9sb2dfaWRfaW5mbzsKKworLyogaW9jdGwgcGFyYW1ldGVycyAqLwordHlwZWRlZiB1bmlvbiBkZXZfbG9nX2lvX3BhcmFtCit7CisgICAgc3RydWN0CisgICAgeworICAgICAgICBpbnQgbnVtX2lkczsKKyAgICAgICAgZGV2X2xvZ19pZF9pbmZvIGlkc1tERVZfTE9HX0NIUkRFVl9NQVhfS0VSTkVMX0lEU107CisgICAgfSBkYl9yZWFkOworCisgICAgc3RydWN0CisgICAgeworICAgICAgICB1aW50MzJfdCBpbmRleDsKKyAgICAgICAgYmNtX2Rldl9sb2dfbGV2ZWwgbGV2ZWxfcHJpbnQ7CisgICAgICAgIGJjbV9kZXZfbG9nX2xldmVsIGxldmVsX3NhdmU7CisgICAgfSBsZXZlbF9zZXQ7CisKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICAgIHVpbnQzMl90IGluZGV4OworICAgICAgICBiY21fZGV2X2xvZ19pZF90eXBlIHR5cGU7CisgICAgfSB0eXBlX3NldDsKKworICAgIHN0cnVjdAorICAgIHsKKyAgICAgICAgdWludDMyX3Qgb2Zmc2V0OworICAgICAgICBjaGFyIG1zZ1tNQVhfREVWX0xPR19TVFJJTkdfU0laRSArIDFdOworICAgIH0gbXNnX3JlYWQ7CisKK30gZGV2X2xvZ19pb19wYXJhbTsKKworLyogVXNlICdTJyBhcyBtYWdpYyBudW1iZXIgKi8KKyNkZWZpbmUgREVWX0xPR19DSFJERVZfSU9DX01BR0lDICAnUycKKworI2RlZmluZSBERVZfTE9HX0NIUkRFVl9EQl9SRUFEICAgICAgICAgIF9JT1IoREVWX0xPR19DSFJERVZfSU9DX01BR0lDLCAxLCBkZXZfbG9nX2lvX3BhcmFtKQorI2RlZmluZSBERVZfTE9HX0NIUkRFVl9MRVZFTF9TRVQgICAgICAgIF9JT1coREVWX0xPR19DSFJERVZfSU9DX01BR0lDLCAyLCBkZXZfbG9nX2lvX3BhcmFtKQorI2RlZmluZSBERVZfTE9HX0NIUkRFVl9UWVBFX1NFVCAgICAgICAgIF9JT1coREVWX0xPR19DSFJERVZfSU9DX01BR0lDLCAzLCBkZXZfbG9nX2lvX3BhcmFtKQorI2RlZmluZSBERVZfTE9HX0NIUkRFVl9NU0dfUkVBRCAgICAgICAgIF9JT1IoREVWX0xPR19DSFJERVZfSU9DX01BR0lDLCA0LCBkZXZfbG9nX2lvX3BhcmFtKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2tlcm5lbC9iY21vbHRfZGV2X2xvZ19rZXJuZWwuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2tlcm5lbC9iY21vbHRfZGV2X2xvZ19rZXJuZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzMzNjc0Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2dfbGludXgva2VybmVsL2JjbW9sdF9kZXZfbG9nX2tlcm5lbC5jCkBAIC0wLDAgKzEsMzI4IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPiAgICAgICAvKiBldmVyeXRoaW5nLi4uICovCisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4gICAgLyogT19BQ0NNT0RFICovCisjaW5jbHVkZSA8bGludXgvYWlvLmg+CisjaW5jbHVkZSA8bGludXgvY2Rldi5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorCisjaW5jbHVkZSA8YmNtX2Rldl9sb2dfdGFzay5oPgorI2luY2x1ZGUgPGJjbW9sdF9kZXZfbG9nX2tlcm5lbC5oPgorI2luY2x1ZGUgPGJjbW9sdF9kZXZfbG9nX2lvY3RsLmg+CisKK2ludCBkZXZfbG9nX2NocmRldl9tYWpvciA9IDIxNTsgICAgICAgICAvKiBTaG91bGQgY29tcGx5IHRoZSB2YWx1ZSBpbiB0YXJnZXRzL21ha2VEZXYgKi8KK21vZHVsZV9wYXJhbShkZXZfbG9nX2NocmRldl9tYWpvciwgaW50LCBTX0lSVVNSIHwgU19JUkdSUCB8IFNfSVdHUlApOworTU9EVUxFX1BBUk1fREVTQyhkZXZfbG9nX2NocmRldl9tYWpvciwgImRldmxvZ19tYWpvciIpOworCitpbnQgZGV2X2xvZ19idWZmZXJfc2l6ZV9rYiA9IDIwNDg7ICAgICAgLyogQnVmZmVyIHNpemUgaW4ga0IgKi8KK21vZHVsZV9wYXJhbShkZXZfbG9nX2J1ZmZlcl9zaXplX2tiLCBpbnQsIFNfSVJVU1IgfCBTX0lSR1JQIHwgU19JV0dSUCk7CitNT0RVTEVfUEFSTV9ERVNDKGRldl9sb2dfYnVmZmVyX3NpemVfa2IsICJkZXZsb2dfYnVmc2l6ZV9rYiIpOworCitpbnQgZGV2X2xvZ19xdWV1ZV9zaXplID0gMjU2OyAgICAgICAgICAgLyogUXVldWUgc2l6ZSAqLworbW9kdWxlX3BhcmFtKGRldl9sb2dfcXVldWVfc2l6ZSwgaW50LCBTX0lSVVNSIHwgU19JUkdSUCB8IFNfSVdHUlApOworTU9EVUxFX1BBUk1fREVTQyhkZXZfbG9nX3F1ZXVlX3NpemUsICJkZXZsb2dfcXNpemUiKTsKKworc3RhdGljIGJjbW9zX211dGV4IGRldl9sb2dfbG9jazsKK3N0YXRpYyBpbnQgZGV2X2xvZ19udW1fdXNlcnM7CitzdGF0aWMgY2hhciAqZGV2X2xvZ19idWZmZXI7CisKKy8qCisgKiBPcGVuIGFuZCBjbG9zZQorICovCitzdGF0aWMgaW50IGRldl9sb2dfY2hyZGV2X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisgICAgQkNNT1NfVFJBQ0VfREVCVUcoIlxuIik7CisgICAgYmNtb3NfbXV0ZXhfbG9jaygmZGV2X2xvZ19sb2NrKTsKKyAgICBpZiAoZGV2X2xvZ19udW1fdXNlcnMgPj0gMSkKKyAgICB7CisgICAgICAgIGJjbW9zX211dGV4X3VubG9jaygmZGV2X2xvZ19sb2NrKTsKKyAgICAgICAgcmV0dXJuIC1FQlVTWTsKKyAgICB9CisgICAgKytkZXZfbG9nX251bV91c2VyczsKKyAgICBiY21vc19tdXRleF91bmxvY2soJmRldl9sb2dfbG9jayk7CisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBkZXZfbG9nX2NocmRldl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworICAgIEJDTU9TX1RSQUNFX0RFQlVHKCJcbiIpOworICAgIC0tZGV2X2xvZ19udW1fdXNlcnM7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRldl9sb2dfY2hyZGV2X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpmX3BvcykKK3sKKyAgICByZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKK3N0YXRpYyBsb25nIGRldl9sb2dfY2hyZGV2X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKyAgICBpbnQgbGludXhfcmMgPSAwOworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGRldl9sb2dfaW9fcGFyYW0gaW9fcGFyYW07CisgICAgZGV2X2xvZ19pZCBpZDsKKworICAgIC8qIGRvbid0IGV2ZW4gZGVjb2RlIHdyb25nIGNtZHM6IGJldHRlciByZXR1cm5pbmcgIEVOT1RUWSB0aGFuIEVGQVVMVCAqLworICAgIGlmIChfSU9DX1RZUEUoY21kKSAhPSBERVZfTE9HX0NIUkRFVl9JT0NfTUFHSUMpCisgICAgICAgIHJldHVybiAtRU5PVFRZOworCisgICAgLyoKKyAgICAgKiB0aGUgdHlwZSBpcyBhIGJpdG1hc2ssIGFuZCBWRVJJRllfV1JJVEUgY2F0Y2hlcyBSL1cKKyAgICAgKiB0cmFuc2ZlcnMuIE5vdGUgdGhhdCB0aGUgdHlwZSBpcyB1c2VyLW9yaWVudGVkLCB3aGlsZQorICAgICAqIHZlcmlmeV9hcmVhIGlzIGtlcm5lbC1vcmllbnRlZCwgc28gdGhlIGNvbmNlcHQgb2YgInJlYWQiIGFuZAorICAgICAqICJ3cml0ZSIgaXMgcmV2ZXJzZWQKKyAgICAgKi8KKyAgICBpZiAoX0lPQ19ESVIoY21kKSAmIF9JT0NfUkVBRCkKKyAgICAgICAgbGludXhfcmMgPSAhYWNjZXNzX29rKFZFUklGWV9XUklURSwgKHZvaWQgX191c2VyICopYXJnLCBfSU9DX1NJWkUoY21kKSk7CisgICAgZWxzZSBpZiAoX0lPQ19ESVIoY21kKSAmIF9JT0NfV1JJVEUpCisgICAgICAgIGxpbnV4X3JjID0gICFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsICh2b2lkIF9fdXNlciAqKWFyZywgX0lPQ19TSVpFKGNtZCkpOworICAgIGlmIChsaW51eF9yYykKKyAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisKKyAgICBzd2l0Y2ggKGNtZCkKKyAgICB7CisKKyAgICBjYXNlIERFVl9MT0dfQ0hSREVWX0RCX1JFQUQ6CisgICAgeworICAgICAgICBpbnQgaTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYmNtX2Rldl9sb2dfZ2V0X251bV9vZl9lbnRyaWVzKCk7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZGV2X2xvZ19pZF9wYXJtIGlkX3Bhcm0gPSB7fTsKKworICAgICAgICAgICAgaWQgPSBiY21fZGV2X2xvZ19pZF9nZXRfYnlfaW5kZXgoaSk7CisgICAgICAgICAgICBpZiAoaWQgPT0gREVWX0xPR19JTlZBTElEX0lEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYmNtX2Rldl9sb2dfaWRfZ2V0KGlkLCAmaWRfcGFybSk7CisgICAgICAgICAgICBpb19wYXJhbS5kYl9yZWFkLmlkc1tpXS5pbmRleCA9IGk7CisgICAgICAgICAgICBzdHJuY3B5KGlvX3BhcmFtLmRiX3JlYWQuaWRzW2ldLm5hbWUsIGlkX3Bhcm0ubmFtZSwgc2l6ZW9mKGlvX3BhcmFtLmRiX3JlYWQuaWRzW2ldLm5hbWUpKTsKKyAgICAgICAgICAgIGlvX3BhcmFtLmRiX3JlYWQuaWRzW2ldLmRlZmF1bHRfdHlwZSA9IGlkX3Bhcm0uZGVmYXVsdF9sb2dfdHlwZTsKKyAgICAgICAgICAgIGlvX3BhcmFtLmRiX3JlYWQuaWRzW2ldLmRlZmF1bHRfbGV2ZWwgPSBpZF9wYXJtLmRlZmF1bHRfbG9nX2xldmVsOworICAgICAgICAgICAgLyogUmVzZXQgdG8gZGVmYXVsdHMgdG8ga2VlcCBpbiBzeW5jIHdpdGggdGhlIHVzZXIgc3BhY2UgKi8KKyAgICAgICAgICAgIGJjbV9kZXZfbG9nX2lkX3NldF9sZXZlbHNfYW5kX3R5cGVfdG9fZGVmYXVsdChpZCk7CisgICAgICAgIH0KKyAgICAgICAgaW9fcGFyYW0uZGJfcmVhZC5udW1faWRzID0gaTsKKyAgICAgICAgbGludXhfcmMgPSBjb3B5X3RvX3VzZXIoKGNoYXIgKilhcmcsIChjaGFyICopJmlvX3BhcmFtLmRiX3JlYWQsIHNpemVvZihpb19wYXJhbS5kYl9yZWFkKSk7CisgICAgfQorICAgIGJyZWFrOworCisgICAgY2FzZSBERVZfTE9HX0NIUkRFVl9MRVZFTF9TRVQ6CisgICAgeworICAgICAgICBsaW51eF9yYyA9IGNvcHlfZnJvbV91c2VyKChjaGFyICopJmlvX3BhcmFtLmxldmVsX3NldCwgKGNoYXIgKilhcmcsIHNpemVvZihpb19wYXJhbS5sZXZlbF9zZXQpKTsKKyAgICAgICAgaWYgKGxpbnV4X3JjIDwgMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZCA9IGJjbV9kZXZfbG9nX2lkX2dldF9ieV9pbmRleChpb19wYXJhbS5sZXZlbF9zZXQuaW5kZXgpOworICAgICAgICBpZiAoaWQgPT0gREVWX0xPR19JTlZBTElEX0lEKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PU19UUkFDRV9FUlIoImxvZ19pZCBpbmRleCAldSBpcyBpbnZhbGlkXG4iLCBpb19wYXJhbS5sZXZlbF9zZXQuaW5kZXgpOworICAgICAgICB9CisgICAgICAgIHJjID0gYmNtX2Rldl9sb2dfaWRfc2V0X2xldmVsKGlkLCBpb19wYXJhbS5sZXZlbF9zZXQubGV2ZWxfcHJpbnQsIGlvX3BhcmFtLmxldmVsX3NldC5sZXZlbF9zYXZlKTsKKyAgICAgICAgaWYgKHJjKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PU19UUkFDRV9FUlIoImJjbV9kZXZfbG9nX2lkX3NldF9sZXZlbCglbGQsJWQsJWQpLT4lc1xuIiwKKyAgICAgICAgICAgICAgICAobG9uZylpZCwgKGludClpb19wYXJhbS5sZXZlbF9zZXQubGV2ZWxfcHJpbnQsIChpbnQpaW9fcGFyYW0ubGV2ZWxfc2V0LmxldmVsX3NhdmUsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgICAgICAgICBsaW51eF9yYyA9IC1FSU5WQUw7CisgICAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisKKyAgICBjYXNlIERFVl9MT0dfQ0hSREVWX1RZUEVfU0VUOgorICAgIHsKKyAgICAgICAgbGludXhfcmMgPSBjb3B5X2Zyb21fdXNlcigoY2hhciAqKSZpb19wYXJhbS50eXBlX3NldCwgKGNoYXIgKilhcmcsIHNpemVvZihpb19wYXJhbS50eXBlX3NldCkpOworICAgICAgICBpZiAobGludXhfcmMgPCAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8qIE1hcCBpbmRleCB0byBsb2cgaWQgKi8KKyAgICAgICAgaWQgPSBiY21fZGV2X2xvZ19pZF9nZXRfYnlfaW5kZXgoaW9fcGFyYW0udHlwZV9zZXQuaW5kZXgpOworICAgICAgICBpZiAoaWQgPT0gREVWX0xPR19JTlZBTElEX0lEKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01PU19UUkFDRV9FUlIoImxvZ19pZCBpbmRleCAldSBpcyBpbnZhbGlkXG4iLCBpb19wYXJhbS50eXBlX3NldC5pbmRleCk7CisgICAgICAgIH0KKyAgICAgICAgcmMgPSBiY21fZGV2X2xvZ19pZF9zZXRfdHlwZShpZCwgaW9fcGFyYW0udHlwZV9zZXQudHlwZSk7CisgICAgICAgIGlmIChyYykKKyAgICAgICAgeworICAgICAgICAgICAgQkNNT1NfVFJBQ0VfRVJSKCJiY21fZGV2X2xvZ19pZF9zZXRfdHlwZSglbGQsJWQpLT4lc1xuIiwKKyAgICAgICAgICAgICAgICAobG9uZylpZCwgKGludClpb19wYXJhbS50eXBlX3NldC50eXBlLCBiY21vc19zdHJlcnJvcihyYykpOworICAgICAgICAgICAgbGludXhfcmMgPSAtRUlOVkFMOworICAgICAgICB9CisgICAgfQorICAgIGJyZWFrOworCisgICAgY2FzZSBERVZfTE9HX0NIUkRFVl9NU0dfUkVBRDoKKyAgICB7CisgICAgICAgIHVpbnQzMl90IGJ1Zl9sZW4gPSBzaXplb2YoaW9fcGFyYW0ubXNnX3JlYWQubXNnKTsKKyAgICAgICAgYmNtX2Rldl9sb2dfZmlsZSAqbG9nX2ZpbGUgPSBiY21fZGV2X2xvZ19maWxlX2dldCgwKTsKKworICAgICAgICBpZiAoIWxvZ19maWxlKQorICAgICAgICB7CisgICAgICAgICAgICBsaW51eF9yYyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGxpbnV4X3JjID0gY29weV9mcm9tX3VzZXIoKGNoYXIgKikmaW9fcGFyYW0ubXNnX3JlYWQsIChjaGFyICopYXJnLCBzaXplb2YoaW9fcGFyYW0ubXNnX3JlYWQub2Zmc2V0KSk7CisgICAgICAgIGlmIChsaW51eF9yYyA8IDApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICByYyA9IGJjbV9kZXZfbG9nX2ZpbGVfcmVhZChsb2dfZmlsZSwgJmlvX3BhcmFtLm1zZ19yZWFkLm9mZnNldCwgaW9fcGFyYW0ubXNnX3JlYWQubXNnLCBidWZfbGVuKTsKKyAgICAgICAgaWYgKHJjIDw9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChyYyA9PSAwKQorICAgICAgICAgICAgICAgIGxpbnV4X3JjID0gLUVBR0FJTjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBsaW51eF9yYyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBsaW51eF9yYyA9IGNvcHlfdG9fdXNlcigoY2hhciAqKWFyZywgKGNoYXIgKikmaW9fcGFyYW0ubXNnX3JlYWQsCisgICAgICAgICAgICBvZmZzZXRvZihkZXZfbG9nX2lvX3BhcmFtLCBtc2dfcmVhZC5tc2cpICsgcmMpOworICAgIH0KKyAgICBicmVhazsKKworICAgIGRlZmF1bHQ6ICAvKiByZWR1bmRhbnQsIGFzIGNtZCB3YXMgY2hlY2tlZCBhZ2FpbnN0IE1BWE5SICovCisgICAgICAgIHJjID0gLUVOT1RUWTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGxpbnV4X3JjOworfQorCisvKgorICogVGhlIGZvcHMKKyAqLworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGV2X2xvZ19jaHJkZXZfZm9wcyA9Cit7CisgICAgLm93bmVyID0gVEhJU19NT0RVTEUsCisgICAgLm9wZW4gPSBkZXZfbG9nX2NocmRldl9vcGVuLAorICAgIC5yZWxlYXNlID0gZGV2X2xvZ19jaHJkZXZfcmVsZWFzZSwKKyAgICAud3JpdGUgPSBkZXZfbG9nX2NocmRldl93cml0ZSwKKyAgICAudW5sb2NrZWRfaW9jdGwgPSBkZXZfbG9nX2NocmRldl9pb2N0bAorfTsKKworc3RhdGljIHN0cnVjdCBjZGV2IGRldl9sb2dfY2hyZGV2X2NkZXY7CitzdGF0aWMgaW50IGlzX2NocmRldl9yZWcsIGlzX2NkZXZfYWRkOworCitzdGF0aWMgYmNtb3NfZXJybm8gZGV2X2xvZ19jaHJkZXZfaW5pdCh2b2lkKQoreworICAgIGRldl90IGRldiA9IE1LREVWKGRldl9sb2dfY2hyZGV2X21ham9yLCAwKTsKKyAgICBpbnQgbGludXhfcmM7CisKKyAgICBpc19jaHJkZXZfcmVnID0gMDsKKyAgICBpc19jZGV2X2FkZCA9IDA7CisgICAgLyoKKyAgICAgKiBSZWdpc3RlciB5b3VyIG1ham9yLCBhbmQgYWNjZXB0IGEgZHluYW1pYyBudW1iZXIuCisgICAgICovCisgICAgaWYgKCFkZXZfbG9nX2NocmRldl9tYWpvcikKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGxpbnV4X3JjID0gcmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihkZXYsIDAsICJkZXZfbG9nIik7CisgICAgaWYgKGxpbnV4X3JjIDwgMCkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX0lPLCAicmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbigpLT4lZFxuIiwgbGludXhfcmMpOworICAgIH0KKyAgICBpc19jaHJkZXZfcmVnID0gMTsKKworICAgIGNkZXZfaW5pdCgmZGV2X2xvZ19jaHJkZXZfY2RldiwgJmRldl9sb2dfY2hyZGV2X2ZvcHMpOworICAgIGxpbnV4X3JjID0gY2Rldl9hZGQoJmRldl9sb2dfY2hyZGV2X2NkZXYsIGRldiwgMSk7CisgICAgaWYgKGxpbnV4X3JjIDwgMCkKKyAgICB7CisgICAgICAgIEJDTU9TX1RSQUNFX1JFVFVSTihCQ01fRVJSX0lPLCAiY2Rldl9hZGQoKS0+JWRcbiIsIGxpbnV4X3JjKTsKKyAgICB9CisgICAgaXNfY2Rldl9hZGQgPSAxOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyB2b2lkIGRldl9sb2dfY2hyZGV2X2V4aXQodm9pZCkKK3sKKyAgICBpZiAoaXNfY2Rldl9hZGQpCisgICAgICAgIGNkZXZfZGVsKCZkZXZfbG9nX2NocmRldl9jZGV2KTsKKyAgICBpZiAoaXNfY2hyZGV2X3JlZykKKyAgICAgICAgdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKE1LREVWKGRldl9sb2dfY2hyZGV2X21ham9yLCAwKSwgMSk7Cit9CisKK3N0YXRpYyBpbnQgZGV2X2xvZ190aW1lX3RvX3N0cl9jYih1aW50MzJfdCB0aW1lX3N0YW1wLCBjaGFyICp0aW1lX3N0ciwgaW50IHRpbWVfc3RyX3NpemUpCit7CisgICAgcmV0dXJuIHNucHJpbnRmKHRpbWVfc3RyLCB0aW1lX3N0cl9zaXplLCAiJXUiLCB0aW1lX3N0YW1wIC8gMTAwMCk7IC8qIENvbnZlcnQgZnJvbSB1c2VjIHRvIG1zZWMuICovCit9CisKKy8qKiBJbml0aWFsaXplIGRldl9sb2cgbGludXgga2VybmVsIHN1cHBvcnQgKi8KK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2xpbnV4X2luaXQodm9pZCkKK3sKKyAgICB2b2lkICphZGRyZXNzZXNbMV07CisgICAgdWludDMyX3Qgc2l6ZXNbMV0gPSB7IGRldl9sb2dfYnVmZmVyX3NpemVfa2IgKiAxMDI0IH07CisgICAgdWludDMyX3QgZmxhZ3NbMV0gPSB7IEJDTV9ERVZfTE9HX0ZJTEVfRkxBR19XUkFQX0FST1VORCB9OworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgaWYgKCFkZXZfbG9nX3F1ZXVlX3NpemUgfHwgIWRldl9sb2dfYnVmZmVyX3NpemVfa2IpCisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisKKyAgICByYyA9IGRldl9sb2dfY2hyZGV2X2luaXQoKTsKKyAgICBpZiAocmMpCisgICAgICAgIHJldHVybiByYzsKKworICAgIC8qIEluaXRpYWxpemUgbG9nZ2VyICovCisgICAgZGV2X2xvZ19idWZmZXIgPSB2bWFsbG9jKGRldl9sb2dfYnVmZmVyX3NpemVfa2IgKiAxMDI0KTsKKyAgICBpZiAoIWRldl9sb2dfYnVmZmVyKQorICAgIHsKKyAgICAgICAgZGV2X2xvZ19jaHJkZXZfZXhpdCgpOworICAgICAgICBCQ01PU19UUkFDRV9FUlIoIkNhbid0IGFsbG9jYXRlIGRldl9sb2cgYnVmZmVyICglZCBieXRlcylcbiIsIGRldl9sb2dfYnVmZmVyX3NpemVfa2IgKiAxMDI0KTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorICAgIGFkZHJlc3Nlc1swXSA9IGRldl9sb2dfYnVmZmVyOworICAgIHJjID0gYmNtX2Rldl9sb2dfaW5pdF9kZWZhdWx0X2xvZ2dlcihhZGRyZXNzZXMsIHNpemVzLCBmbGFncywgQkNNX1NJWkVPRkFSUkFZKGFkZHJlc3NlcyksIDB4NDAwMCwgVEFTS19QUklPUklUWV9ERVZfTE9HLCBkZXZfbG9nX3F1ZXVlX3NpemUpOworICAgIGlmIChyYykKKyAgICB7CisgICAgICAgIGRldl9sb2dfY2hyZGV2X2V4aXQoKTsKKyAgICAgICAgdmZyZWUoZGV2X2xvZ19idWZmZXIpOworICAgICAgICBCQ01PU19UUkFDRV9FUlIoIkZhaWxlZCB0byBjcmVhdGUgbG9nZ2VyLiBFcnJvciAlc1xuIiwgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIGJjbV9kZXZfbG9nX3NldF90aW1lX3RvX3N0cl9jYihkZXZfbG9nX3RpbWVfdG9fc3RyX2NiKTsKKworICAgIGJjbW9zX211dGV4X2NyZWF0ZSgmZGV2X2xvZ19sb2NrLCAwLCBOVUxMKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiogQ2xlYW4tdXAgZGV2X2xvZyBsaW51eCBrZXJuZWwgc3VwcG9ydCAqLwordm9pZCBiY21fZGV2X2xvZ19saW51eF9leGl0KHZvaWQpCit7CisgICAgZGV2X2xvZ19jaHJkZXZfZXhpdCgpOworICAgIGlmIChkZXZfbG9nX2J1ZmZlcikKKyAgICB7CisgICAgICAgIHZmcmVlKGRldl9sb2dfYnVmZmVyKTsKKyAgICB9CisgICAgYmNtb3NfbXV0ZXhfZGVzdHJveSgmZGV2X2xvZ19sb2NrKTsKK30KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2tlcm5lbC9iY21vbHRfZGV2X2xvZ19rZXJuZWwuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZfbG9nX2xpbnV4L2tlcm5lbC9iY21vbHRfZGV2X2xvZ19rZXJuZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWVlM2MxCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2Rldl9sb2dfbGludXgva2VybmVsL2JjbW9sdF9kZXZfbG9nX2tlcm5lbC5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgQkNNT0xUX0RFVl9MT0dfS0VSTkVMX0hfCisjZGVmaW5lIEJDTU9MVF9ERVZfTE9HX0tFUk5FTF9IXworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisKKy8qKiBJbml0aWFsaXplIGRldl9sb2cgbGludXgga2VybmVsIHN1cHBvcnQgKi8KK2JjbW9zX2Vycm5vIGJjbV9kZXZfbG9nX2xpbnV4X2luaXQodm9pZCk7CisKKy8qKiBDbGVhbi11cCBkZXZfbG9nIGxpbnV4IGtlcm5lbCBzdXBwb3J0ICovCit2b2lkIGJjbV9kZXZfbG9nX2xpbnV4X2V4aXQodm9pZCk7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2aWNlX3NlbGVjdG9yL01ha2VmaWxlIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2RldmljZV9zZWxlY3Rvci9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjI0ZjIyCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2RldmljZV9zZWxlY3Rvci9NYWtlZmlsZQpAQCAtMCwwICsxLDYgQEAKKyMgQ3VycmVudCBkZXZpb2NlIHNlbGVjdG9yCisjCitNT0RfTkFNRSA9IGRldmljZV9zZWxlY3RvcgorTU9EX1RZUEUgPSBsaWIKK01PRF9ERVBTID0gY29tbW9uX2FwaSBtb2RlbCBjbGkKK3NyY3MgPSBiY21vbHRfZGV2X3NlbGVjdG9yLmMKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZpY2Vfc2VsZWN0b3IvYmNtb2x0X2Rldl9zZWxlY3Rvci5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2RldmljZV9zZWxlY3Rvci9iY21vbHRfZGV2X3NlbGVjdG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk0NTM4MwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZpY2Vfc2VsZWN0b3IvYmNtb2x0X2Rldl9zZWxlY3Rvci5jCkBAIC0wLDAgKzEsMTA2IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisvKgorICogYmNtb2x0X2Rldl9zZWxlY3Rvci5jCisgKiBTZXQgLyBnZXQgY3VycmVudCBkZXZpY2UgZm9yIGFsbCBDTEkgY29tbWFuZHMKKyAqLworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbWNsaS5oPgorI2luY2x1ZGUgPGJjbW9sdF9kZXZfc2VsZWN0b3IuaD4KKworLyogQ3VycmVudCBkZXZpY2UuIEV4dGVybmFsIHZhcmlhYmxlICovCisKKy8qIERldmljZSBjaGFuZ2UgY2FsbGJhY2sgcmVnaXN0cmF0aW9uIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgZGV2X3NlbF9zdWJzY3JpYmVyIGRldl9zZWxfc3Vic2NyaWJlcjsKK3N0cnVjdCBkZXZfc2VsX3N1YnNjcmliZXIKK3sKKyAgICBGX2N1cnJlbnRfZGV2aWNlX2NoYW5nZV9pbmQgY2I7ICAgICAvKiBTdWJzY3JpYmVyJ3MgY2FsbGJhY2sgKi8KKyAgICBTVEFJTFFfRU5UUlkoZGV2X3NlbF9zdWJzY3JpYmVyKSBuZXh0OworfTsKKworc3RhdGljIFNUQUlMUV9IRUFEKGRldl9zZWxfc3Vic2NyaWJlcl9saXN0LCBkZXZfc2VsX3N1YnNjcmliZXIpIHN1YnNjcmliZXJfbGlzdDsKKworLyogR2V0L3NldCB0aGUgY3VycmVudCBkZXZpY2UgQ0xJIGhhbmRsZXIKKyAqLworc3RhdGljIGJjbW9zX2Vycm5vIF9kZXZfc2VsX2RldmljZV9oYW5kbGVyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgLyogSWYgY3VycmVudCBkZXZpY2Ugd2FzIHNldCAtIG5vdGlmeSBhbGwgc3Vic2NyaWJlcnMuCisgICAgICogRG8gbm90IGNoZWNrIGlmIGl0IGNoYW5nZWQgaGVyZS4gU29tZXRpbWVzIGl0IGlzIGdvb2QgdG8gYmUgYWJsZQorICAgICAqIHRvIHJlZnJlc2guCisgICAgICovCisgICAgaWYgKG5wYXJtcykKKyAgICB7CisgICAgICAgIGRldl9zZWxfc3Vic2NyaWJlciAqc3ViczsKKworICAgICAgICBjdXJyZW50X2RldmljZSA9IHBhcm1bMF0udmFsdWUubnVtYmVyOworCisgICAgICAgIC8qIE5vdGlmeSBhbGwgc3Vic2NyaWJlcnMgKi8KKyAgICAgICAgU1RBSUxRX0ZPUkVBQ0goc3VicywgJnN1YnNjcmliZXJfbGlzdCwgbmV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgc3Vicy0+Y2Ioc2Vzc2lvbiwgY3VycmVudF9kZXZpY2UpOworICAgICAgICB9CisgICAgfQorCisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIkN1cnJlbnQgZGV2aWNlOiAlbGRcbiIsIChsb25nKWN1cnJlbnRfZGV2aWNlKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisKKy8qIFJlZ2lzdGVyIGZvciBjdXJyZW50IGRldmljZSBjaGFuZ2Ugbm90aWZpY2F0aW9uLgorICogTXVsdGlwbGUgY2xpZW50cyBjYW4gcmVnaXN0ZXIuCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9kZXZfc2VsX2luZF9yZWdpc3RlcihGX2N1cnJlbnRfZGV2aWNlX2NoYW5nZV9pbmQgY2IpCit7CisgICAgZGV2X3NlbF9zdWJzY3JpYmVyICpzdWJzID0gYmNtb3NfY2FsbG9jKHNpemVvZihkZXZfc2VsX3N1YnNjcmliZXIpKTsKKworICAgIGlmICghc3VicykKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisKKyAgICBzdWJzLT5jYiA9IGNiOworICAgIFNUQUlMUV9JTlNFUlRfVEFJTCgmc3Vic2NyaWJlcl9saXN0LCBzdWJzLCBuZXh0KTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvKiBJbml0aWFsaXplIGRldmljZSBzZWxlY3RvciBtb2R1bGUgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9kZXZfc2VsX2luaXQoYmNtY2xpX2VudHJ5ICpwYXJlbnRfZGlyKQoreworICAgIFNUQUlMUV9JTklUKCZzdWJzY3JpYmVyX2xpc3QpOworCisgICAgLyogR2V0L3NldCBjdXJyZW50IGRldmljZSAqLworICAgIEJDTUNMSV9NQUtFX0NNRChwYXJlbnRfZGlyLCAiZGV2aWNlIiwgIkdldC9TZXQgdGhlIGN1cnJlbnQgZGV2aWNlIiwgX2Rldl9zZWxfZGV2aWNlX2hhbmRsZXIsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fUkFOR0UoImRldmljZSIsICJEZXZpY2UgaW5kZXgiLCBCQ01DTElfUEFSTV9OVU1CRVIsIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwsCisgICAgICAgICAgICAwLCBCQ01UUl9NQVhfT0xUUy0xKSk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2aWNlX3NlbGVjdG9yL2JjbW9sdF9kZXZfc2VsZWN0b3IuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9kZXZpY2Vfc2VsZWN0b3IvYmNtb2x0X2Rldl9zZWxlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZGZiMDgKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvZGV2aWNlX3NlbGVjdG9yL2JjbW9sdF9kZXZfc2VsZWN0b3IuaApAQCAtMCwwICsxLDUzIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisvKgorICogYmNtb2x0X2Rldl9zZWxlY3Rvci5oCisgKiBTZXQgLyBnZXQgY3VycmVudCBkZXZpY2UgZm9yIGFsbCBDTEkgY29tbWFuZHMKKyAqLworCisjaWZuZGVmIF9CQ01PTFRfREVWX1NFTEVDVE9SX0hfCisjZGVmaW5lIF9CQ01PTFRfREVWX1NFTEVDVE9SX0hfCisKKyNpbmNsdWRlIDxiY21vbHRfbW9kZWxfdHlwZXMuaD4KKyNpbmNsdWRlIDxiY21jbGkuaD4KKworLyogQ3VycmVudCBkZXZpY2UgY2hhbmdlIG5vdGlmaWNhdGlvbiBjYWxsYmFjayAqLwordHlwZWRlZiB2b2lkICgqRl9jdXJyZW50X2RldmljZV9jaGFuZ2VfaW5kKShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYmNtb2x0X2RldmlkIGRldik7CisKKy8qIFJlZ2lzdGVyIGZvciBjdXJyZW50IGRldmljZSBjaGFuZ2Ugbm90aWZpY2F0aW9uLgorICogTXVsdGlwbGUgY2xpZW50cyBjYW4gcmVnaXN0ZXIuCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9kZXZfc2VsX2luZF9yZWdpc3RlcihGX2N1cnJlbnRfZGV2aWNlX2NoYW5nZV9pbmQgY2IpOworCisvKiBJbml0aWFsaXplIGRldmljZSBzZWxlY3RvciBtb2R1bGUgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9kZXZfc2VsX2luaXQoYmNtY2xpX2VudHJ5ICpwYXJlbnRfZGlyKTsKKworCisjZW5kaWYgLyogX0JDTU9MVF9ERVZfU0VMRUNUT1JfSF8gKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9saW5lbm9pc2UvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvbGluZW5vaXNlL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMTFmMDMKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvbGluZW5vaXNlL01ha2VmaWxlCkBAIC0wLDAgKzEsMjIgQEAKKyMgbGluZW5vaXNlIC0gc2ltcGxlIGxpbmUgZWRpdGluZyBsaWJyYXJ5CisjIHNob3VsZCB3b3JrIG9uIGFueSBWVC0xMDAtY29tcGF0aWJsZSB0ZXJtaW5hbAorTU9EX05BTUUgPSBsaW5lbm9pc2UKK01PRF9UWVBFID0gbGliCitNT0RfREVGUyA9IC1EQ09ORklHX0xJTkVOT0lTRSAtRENPTkZJR19FRElUTElORQorCitzcmNzID0gbGluZW5vaXNlLmMKKworIyBUaGUgZm9sbG93aW5nIGRlZmluZXMgc2hvdWxkIGJlIHNldCBmb3IgT1MgdGhhdCBkb2Vzbid0IGhhdmUgc3VwcG9ydCBmb3IgdHR5IGFuZC9vciBmaWxlIElPCitMSU5FTk9JU0VfRElTQUJMRV9JT0NUTCA/PSBuCitMSU5FTk9JU0VfRElTQUJMRV9URVJNSU9TID89IG4KK0xJTkVOT0lTRV9ESVNBQkxFX0hJU1RfU0FWRSA/PSBuCisKK2lmZXEgKCIkKExJTkVOT0lTRV9ESVNBQkxFX0lPQ1RMKSIsICJ5IikKKyAgICBFWFRSQV9ERUZJTkVTICs9IC1ETElORU5PSVNFX0RJU0FCTEVfSU9DVEwKK2VuZGlmCitpZmVxICgiJChMSU5FTk9JU0VfRElTQUJMRV9URVJNSU9TKSIsICJ5IikKKyAgICBFWFRSQV9ERUZJTkVTICs9IC1ETElORU5PSVNFX0RJU0FCTEVfVEVSTUlPUworZW5kaWYKK2lmZXEgKCIkKExJTkVOT0lTRV9ESVNBQkxFX0hJU1RfU0FWRSkiLCAieSIpCisgICAgRVhUUkFfREVGSU5FUyArPSAtRExJTkVOT0lTRV9ESVNBQkxFX0hJU1RfU0FWRQorZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9saW5lbm9pc2UvbGluZW5vaXNlLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvbGluZW5vaXNlL2xpbmVub2lzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMTJhMWEKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvbGluZW5vaXNlL2xpbmVub2lzZS5jCkBAIC0wLDAgKzEsMTM1OCBAQAorLyogbGluZW5vaXNlLmMgLS0gZ3VlcnJpbGxhIGxpbmUgZWRpdGluZyBsaWJyYXJ5IGFnYWluc3QgdGhlIGlkZWEgdGhhdCBhCisgKiBsaW5lIGVkaXRpbmcgbGliIG5lZWRzIHRvIGJlIDIwLDAwMCBsaW5lcyBvZiBDIGNvZGUuCisgKgorICogWW91IGNhbiBmaW5kIHRoZSBsYXRlc3Qgc291cmNlIGNvZGUgYXQ6CisgKgorICogICBodHRwOi8vZ2l0aHViLmNvbS9hbnRpcmV6L2xpbmVub2lzZQorICoKKyAqIERvZXMgYSBudW1iZXIgb2YgY3JhenkgYXNzdW1wdGlvbnMgdGhhdCBoYXBwZW4gdG8gYmUgdHJ1ZSBpbiA5OS45OTk5JSBvZgorICogdGhlIDIwMTAgVU5JWCBjb21wdXRlcnMgYXJvdW5kLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDEzLCBTYWx2YXRvcmUgU2FuZmlsaXBwbyA8YW50aXJleiBhdCBnbWFpbCBkb3QgY29tPgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTMsIFBpZXRlciBOb29yZGh1aXMgPHBjbm9vcmRodWlzIGF0IGdtYWlsIGRvdCBjb20+CisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgKiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogICogIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogUmVmZXJlbmNlczoKKyAqIC0gaHR0cDovL2ludmlzaWJsZS1pc2xhbmQubmV0L3h0ZXJtL2N0bHNlcXMvY3Rsc2Vxcy5odG1sCisgKiAtIGh0dHA6Ly93d3cuM3dheWxhYnMuY29tL253L1dXVy9wcm9kdWN0cy93aXpjb24vdnQyMjAuaHRtbAorICoKKyAqIFRvZG8gbGlzdDoKKyAqIC0gRmlsdGVyIGJvZ3VzIEN0cmwrPGNoYXI+IGNvbWJpbmF0aW9ucy4KKyAqIC0gV2luMzIgc3VwcG9ydAorICoKKyAqIEJsb2F0OgorICogLSBIaXN0b3J5IHNlYXJjaCBsaWtlIEN0cmwrciBpbiByZWFkbGluZT8KKyAqCisgKiBMaXN0IG9mIGVzY2FwZSBzZXF1ZW5jZXMgdXNlZCBieSB0aGlzIHByb2dyYW0sIHdlIGRvIGV2ZXJ5dGhpbmcganVzdAorICogd2l0aCB0aHJlZSBzZXF1ZW5jZXMuIEluIG9yZGVyIHRvIGJlIHNvIGNoZWFwIHdlIG1heSBoYXZlIHNvbWUKKyAqIGZsaWNrZXJpbmcgZWZmZWN0IHdpdGggc29tZSBzbG93IHRlcm1pbmFsLCBidXQgdGhlIGxlc3NlciBzZXF1ZW5jZXMKKyAqIHRoZSBtb3JlIGNvbXBhdGlibGUuCisgKgorICogQ0hBIChDdXJzb3IgSG9yaXpvbnRhbCBBYnNvbHV0ZSkKKyAqICAgIFNlcXVlbmNlOiBFU0MgWyBuIEcKKyAqICAgIEVmZmVjdDogbW92ZXMgY3Vyc29yIHRvIGNvbHVtbiBuCisgKgorICogRUwgKEVyYXNlIExpbmUpCisgKiAgICBTZXF1ZW5jZTogRVNDIFsgbiBLCisgKiAgICBFZmZlY3Q6IGlmIG4gaXMgMCBvciBtaXNzaW5nLCBjbGVhciBmcm9tIGN1cnNvciB0byBlbmQgb2YgbGluZQorICogICAgRWZmZWN0OiBpZiBuIGlzIDEsIGNsZWFyIGZyb20gYmVnaW5uaW5nIG9mIGxpbmUgdG8gY3Vyc29yCisgKiAgICBFZmZlY3Q6IGlmIG4gaXMgMiwgY2xlYXIgZW50aXJlIGxpbmUKKyAqCisgKiBDVUYgKENVcnNvciBGb3J3YXJkKQorICogICAgU2VxdWVuY2U6IEVTQyBbIG4gQworICogICAgRWZmZWN0OiBtb3ZlcyBjdXJzb3IgZm9yd2FyZCBvZiBuIGNoYXJzCisgKgorICogV2hlbiBtdWx0aSBsaW5lIG1vZGUgaXMgZW5hYmxlZCwgd2UgYWxzbyB1c2UgYW4gYWRkaXRpb25hbCBlc2NhcGUKKyAqIHNlcXVlbmNlLiBIb3dldmVyIG11bHRpIGxpbmUgZWRpdGluZyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgorICoKKyAqIENVVSAoQ3Vyc29yIFVwKQorICogICAgU2VxdWVuY2U6IEVTQyBbIG4gQQorICogICAgRWZmZWN0OiBtb3ZlcyBjdXJzb3IgdXAgb2YgbiBjaGFycy4KKyAqCisgKiBDVUQgKEN1cnNvciBEb3duKQorICogICAgU2VxdWVuY2U6IEVTQyBbIG4gQgorICogICAgRWZmZWN0OiBtb3ZlcyBjdXJzb3IgZG93biBvZiBuIGNoYXJzLgorICoKKyAqIFRoZSBmb2xsb3dpbmcgYXJlIHVzZWQgdG8gY2xlYXIgdGhlIHNjcmVlbjogRVNDIFsgSCBFU0MgWyAyIEoKKyAqIFRoaXMgaXMgYWN0dWFsbHkgY29tcG9zZWQgb2YgdHdvIHNlcXVlbmNlczoKKyAqCisgKiBjdXJzb3Job21lCisgKiAgICBTZXF1ZW5jZTogRVNDIFsgSAorICogICAgRWZmZWN0OiBtb3ZlcyB0aGUgY3Vyc29yIHRvIHVwcGVyIGxlZnQgY29ybmVyCisgKgorICogRUQyIChDbGVhciBlbnRpcmUgc2NyZWVuKQorICogICAgU2VxdWVuY2U6IEVTQyBbIDIgSgorICogICAgRWZmZWN0OiBjbGVhciB0aGUgd2hvbGUgc2NyZWVuCisgKgorICovCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaWZuZGVmIExJTkVOT0lTRV9ESVNBQkxFX1RFUk1JT1MKKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CisjZW5kaWYKKyNpZm5kZWYgTElORU5PSVNFX0RJU0FCTEVfSU9DVEwKKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNlbmRpZgorI2luY2x1ZGUgImxpbmVub2lzZS5oIgorCisjaWZuZGVmIFNURElOX0ZJTEVOTworI2RlZmluZSBTVERJTl9GSUxFTk8gIDAKKyNlbmRpZgorCisjaWZuZGVmIFNURE9VVF9GSUxFTk8KKyNkZWZpbmUgU1RET1VUX0ZJTEVOTyAxCisjZW5kaWYKKworI2RlZmluZSBMSU5FTk9JU0VfREVGQVVMVF9ISVNUT1JZX01BWF9MRU4gMTAwCisjZGVmaW5lIExJTkVOT0lTRV9NQVhfTElORSA0MDk2CisKKy8qIFRoZSBsaW5lbm9pc2VTdGF0ZSBzdHJ1Y3R1cmUgcmVwcmVzZW50cyB0aGUgc3RhdGUgZHVyaW5nIGxpbmUgZWRpdGluZy4KKyAqIFdlIHBhc3MgdGhpcyBzdGF0ZSB0byBmdW5jdGlvbnMgaW1wbGVtZW50aW5nIHNwZWNpZmljIGVkaXRpbmcKKyAqIGZ1bmN0aW9uYWxpdGllcy4gKi8KK3N0cnVjdCBsaW5lbm9pc2VTdGF0ZSB7CisgICAgbG9uZyBpZmQ7ICAgICAgICAgICAvKiBUZXJtaW5hbCBzdGRpbiBmaWxlIGRlc2NyaXB0b3IuICovCisgICAgY2hhciAqYnVmOyAgICAgICAgICAvKiBFZGl0ZWQgbGluZSBidWZmZXIuICovCisgICAgaW50IGJ1ZmxlbjsgICAgICAgICAvKiBFZGl0ZWQgbGluZSBidWZmZXIgc2l6ZS4gKi8KKyAgICBjb25zdCBjaGFyICpwcm9tcHQ7IC8qIFByb21wdCB0byBkaXNwbGF5LiAqLworICAgIGludCBwbGVuOyAgICAgICAgICAgLyogUHJvbXB0IGxlbmd0aC4gKi8KKyAgICBpbnQgcG9zOyAgICAgICAgICAgIC8qIEN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uLiAqLworICAgIGludCBvbGRwb3M7ICAgICAgICAgLyogUHJldmlvdXMgcmVmcmVzaCBjdXJzb3IgcG9zaXRpb24uICovCisgICAgaW50IGxlbjsgICAgICAgICAgICAvKiBDdXJyZW50IGVkaXRlZCBsaW5lIGxlbmd0aC4gKi8KKyAgICBpbnQgY29sczsgICAgICAgICAgIC8qIE51bWJlciBvZiBjb2x1bW5zIGluIHRlcm1pbmFsLiAqLworICAgIGludCBtYXhyb3dzOyAgICAgICAgLyogTWF4aW11bSBudW0gb2Ygcm93cyB1c2VkIHNvIGZhciAobXVsdGlsaW5lIG1vZGUpICovCisgICAgaW50IGhpc3RvcnlfaW5kZXg7ICAvKiBUaGUgaGlzdG9yeSBpbmRleCB3ZSBhcmUgY3VycmVudGx5IGVkaXRpbmcuICovCit9OworCisvKiBTZXNzaW9uICovCitzdHJ1Y3QgbGluZW5vaXNlU2Vzc2lvbiB7CisgICAgc3RydWN0IGxpbmVub2lzZVNlc3Npb24gKm5leHQ7CisgICAgc3RydWN0IGxpbmVub2lzZVN0YXRlIHN0YXRlOworICAgIGxpbmVub2lzZVNlc3Npb25JTyBpbzsKKyAgICBsaW5lbm9pc2VDb21wbGV0aW9uQ2FsbGJhY2sgKmNvbXBsZXRpb25DYWxsYmFjazsKKyAgICBjaGFyICpyZWFkX2FoZWFkX2J1ZjsKKyAgICBpbnQgcmVhZF9haGVhZF9wb3M7CisgICAgaW50IGhpc3RvcnlfbWF4X2xlbjsKKyAgICBpbnQgaGlzdG9yeV9sZW47CisgICAgY2hhciAqKmhpc3Rvcnk7CisgICAgaW50IG1sbW9kZTsgICAgICAgICAvKiBNdWx0aSBsaW5lIG1vZGUuIERlZmF1bHQgaXMgc2luZ2xlIGxpbmUuICovCisgICAgaW50IHJhd21vZGU7ICAgICAgICAvKiBGb3IgYXRleGl0KCkgZnVuY3Rpb24gdG8gY2hlY2sgaWYgcmVzdG9yZSBpcyBuZWVkZWQqLworI2lmbmRlZiBMSU5FTk9JU0VfRElTQUJMRV9URVJNSU9TCisgICAgc3RydWN0IHRlcm1pb3Mgb3JpZ190ZXJtaW9zOyAvKiBJbiBvcmRlciB0byByZXN0b3JlIGF0IGV4aXQuKi8KKyNlbmRpZgorICAgIGludCBkdW1iX3Rlcm1pbmFsOworICAgIGludCBmb3JjZWRfZHVtYjsKKyAgICBpbnQgbmNvbHJlcXM7ICAgICAgICAvKiBPdXRzdGFuZGlnZSBnZXQgY29sdW1ucyByZXF1ZXN0cyAqLworICAgIHZvaWQgKnNlc3Npb25fZGF0YTsKK307CisKK2VudW0gS0VZX0FDVElPTnsKKyAgICBLRVlfTlVMTCA9IDAsCS8qIE5VTEwgKi8KKyAgICBDVFJMX0EgPSAxLCAgICAgICAgIC8qIEN0cmwrYSAqLworICAgIENUUkxfQiA9IDIsICAgICAgICAgLyogQ3RybC1iICovCisgICAgQ1RSTF9DID0gMywgICAgICAgICAvKiBDdHJsLWMgKi8KKyAgICBDVFJMX0QgPSA0LCAgICAgICAgIC8qIEN0cmwtZCAqLworICAgIENUUkxfRSA9IDUsICAgICAgICAgLyogQ3RybC1lICovCisgICAgQ1RSTF9GID0gNiwgICAgICAgICAvKiBDdHJsLWYgKi8KKyAgICBDVFJMX0ggPSA4LCAgICAgICAgIC8qIEN0cmwtaCAqLworICAgIEtFWV9UQUIgPSA5LCAgICAgICAgLyogVGFiICovCisgICAgQ1RSTF9LID0gMTEsICAgICAgICAvKiBDdHJsK2sgKi8KKyAgICBDVFJMX0wgPSAxMiwgICAgICAgIC8qIEN0cmwrbCAqLworICAgIEtFWV9MRiA9IDEwLCAgICAgICAgLyogRW50ZXI6IFxuICovCisgICAgS0VZX0NSID0gMTMsICAgICAgICAvKiBFbnRlcjogXHIgKi8KKyAgICBDVFJMX04gPSAxNCwgICAgICAgIC8qIEN0cmwtbiAqLworICAgIENUUkxfUCA9IDE2LCAgICAgICAgLyogQ3RybC1wICovCisgICAgQ1RSTF9UID0gMjAsICAgICAgICAvKiBDdHJsLXQgKi8KKyAgICBDVFJMX1UgPSAyMSwgICAgICAgIC8qIEN0cmwrdSAqLworICAgIENUUkxfVyA9IDIzLCAgICAgICAgLyogQ3RybCt3ICovCisgICAgRVNDID0gMjcsICAgICAgICAgICAvKiBFc2NhcGUgKi8KKyAgICBCQUNLU1BBQ0UgPSAgMTI3ICAgIC8qIEJhY2tzcGFjZSAqLworfTsKKworc3RhdGljIHZvaWQgcmVmcmVzaExpbmUobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbik7CitzdGF0aWMgdm9pZCBmcmVlSGlzdG9yeShsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uKTsKK3N0YXRpYyBpbnQgbGluZW5vaXNlUmF3KGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24sIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZmxlbiwgY29uc3QgY2hhciAqcHJvbXB0KTsKKworLyogRGVidWdnaW5nIG1hY3JvLiAqLworLyogI2RlZmluZSBMSU5FTk9JU0VfREVCVUdfTU9ERSAqLworCisjaWZkZWYgTElORU5PSVNFX0RFQlVHX01PREUKKyNkZWZpbmUgbG5kZWJ1ZyhmbXQsIGFyZ3MuLi4pIFwKKyAgICBkbyB7XAorICAgICAgICBiY21vc19wcmludGYoIiVzOiVkICIgZm10LCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCAjI2FyZ3MpO1wKKyAgICB9IHdoaWxlKDApCisjZWxzZQorI2RlZmluZSBsbmRlYnVnKGZtdCwgLi4uKQorI2VuZGlmCisKKworLyogU2Vzc2lvbiBsaXN0LiBUb0RvOiBwcm90ZWN0IHVwZGF0ZSAqLworc3RhdGljIGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb25zOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PSBMb3cgbGV2ZWwgdGVybWluYWwgaGFuZGxpbmcgPT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiBTZXQgaWYgdG8gdXNlIG9yIG5vdCB0aGUgbXVsdGkgbGluZSBtb2RlLiAqLwordm9pZCBsaW5lbm9pc2VTZXRNdWx0aUxpbmUobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbiwgaW50IG1sKSB7CisgICAgc2Vzc2lvbi0+bWxtb2RlID0gbWw7Cit9CisKK2ludCBsaW5lbm9pc2VHZXRNdWx0aUxpbmUobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbikgeworICAgIHJldHVybiBzZXNzaW9uLT5tbG1vZGU7Cit9CisKK2ludCBsaW5lbm9pc2VHZXREdW1iVGVybWluYWwobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbikgeworICAgIHJldHVybiBzZXNzaW9uLT5kdW1iX3Rlcm1pbmFsOworfQorCisvKiBSYXcgbW9kZTogMTk2MCBtYWdpYyBzaGl0LiAqLworc3RhdGljIGludCBlbmFibGVSYXdNb2RlKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24pIHsKKyNpZm5kZWYgTElORU5PSVNFX0RJU0FCTEVfVEVSTUlPUworICAgIHN0cnVjdCB0ZXJtaW9zIHJhdzsKKworICAgIGlmICh0Y2dldGF0dHIoc2Vzc2lvbi0+c3RhdGUuaWZkLCAmc2Vzc2lvbi0+b3JpZ190ZXJtaW9zKSA9PSAtMSkgZ290byBmYXRhbDsKKworICAgIHJhdyA9IHNlc3Npb24tPm9yaWdfdGVybWlvczsgIC8qIG1vZGlmeSB0aGUgb3JpZ2luYWwgbW9kZSAqLworICAgIC8qIGlucHV0IG1vZGVzOiBubyBicmVhaywgbm8gQ1IgdG8gTkwsIG5vIHBhcml0eSBjaGVjaywgbm8gc3RyaXAgY2hhciwKKyAgICAgKiBubyBzdGFydC9zdG9wIG91dHB1dCBjb250cm9sLiAqLworICAgIHJhdy5jX2lmbGFnICY9IH4oQlJLSU5UIHwgSUdOQlJLIHwgSUNSTkwgfCBJTlBDSyB8IElTVFJJUCB8IElYT04gfCBJWE9GRik7CisKKyAgICAvKiBvdXRwdXQgbW9kZXMgLSBkaXNhYmxlIHBvc3QgcHJvY2Vzc2luZyAqLworICAgIC8qIHJhdy5jX29mbGFnICY9IH4oT1BPU1QpOyAqLworCisgICAgLyogY29udHJvbCBtb2RlcyAtIHNldCA4IGJpdCBjaGFycyAqLworICAgIHJhdy5jX2NmbGFnIHw9IChDUzggLyogfCBJU0lHICovKTsKKworICAgIC8qIGxvY2FsIG1vZGVzIC0gZWNob2luZyBvZmYsIGNhbm9uaWNhbCBvZmYsIG5vIGV4dGVuZGVkIGZ1bmN0aW9ucywKKyAgICAgKiBubyBzaWduYWwgY2hhcnMgKF5aLF5DKSAqLworICAgIHJhdy5jX2xmbGFnICY9IH4oRUNITyB8IElDQU5PTiB8IElFWFRFTik7CisgICAgLyogY29udHJvbCBjaGFycyAtIHNldCByZXR1cm4gY29uZGl0aW9uOiBtaW4gbnVtYmVyIG9mIGJ5dGVzIGFuZCB0aW1lci4KKyAgICAgKiBXZSB3YW50IHJlYWQgdG8gcmV0dXJuIGV2ZXJ5IHNpbmdsZSBieXRlLCB3aXRob3V0IHRpbWVvdXQuICovCisgICAgcmF3LmNfY2NbVk1JTl0gPSAxOyByYXcuY19jY1tWVElNRV0gPSAwOyAvKiAxIGJ5dGUsIG5vIHRpbWVyICovCisKKyAgICAvKiBwdXQgdGVybWluYWwgaW4gcmF3IG1vZGUgYWZ0ZXIgZmx1c2hpbmcgKi8KKyAgICBpZiAodGNzZXRhdHRyKHNlc3Npb24tPnN0YXRlLmlmZCwgVENTQUZMVVNILCAmcmF3KSA8IDApIGdvdG8gZmF0YWw7CisgICAgc2Vzc2lvbi0+cmF3bW9kZSA9IDE7CisgICAgcmV0dXJuIDA7CisKK2ZhdGFsOgorICAgIGVycm5vID0gRU5PVFRZOworICAgIHJldHVybiAtMTsKKyNlbHNlCisgICAgc2Vzc2lvbi0+cmF3bW9kZSA9IDE7CisgICAgcmV0dXJuIDA7IC8qIGFzc3VtZSByYXcgbW9kZSAqLworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIGRpc2FibGVSYXdNb2RlKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24pIHsKKyAgICAvKiBEb24ndCBldmVuIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgYXMgaXQncyB0b28gbGF0ZS4gKi8KKyNpZm5kZWYgTElORU5PSVNFX0RJU0FCTEVfVEVSTUlPUworICAgIGlmIChzZXNzaW9uLT5yYXdtb2RlICYmIHRjc2V0YXR0cihzZXNzaW9uLT5zdGF0ZS5pZmQsVENTQUZMVVNILCZzZXNzaW9uLT5vcmlnX3Rlcm1pb3MpICE9IC0xKQorICAgICAgICBzZXNzaW9uLT5yYXdtb2RlID0gMDsKKyNlbmRpZgorfQorCisKKy8qIHdyaXRlIEVTQyBzZXF1ZW5jZSAqLworc3RhdGljIGludCB3cml0ZUVzY1NlcXVlbmNlKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24sIGNvbnN0IGNoYXIgKnNlcSwgaW50IHNlcV9sZW4pCit7CisgICAgaW50IG47CisgICAgaWYgKCFzZXFfbGVuKQorICAgICAgICBzZXFfbGVuID0gc3RybGVuKHNlcSk7CisgICAgbiA9IHNlc3Npb24tPmlvLndyaXRlKHNlc3Npb24tPmlvLmZkX291dCwgc2VxLCBzZXFfbGVuKTsKKyAgICByZXR1cm4gbjsKK30KKworCisvKiBUcnkgdG8gZ2V0IHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgY3VycmVudCB0ZXJtaW5hbCwgb3IgYXNzdW1lIDgwCisgKiBpZiBpdCBmYWlscy4gKi8KK3N0YXRpYyBpbnQgZ2V0Q29sdW1uc1JlcXVlc3QobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbikgeworICAgIHN0cnVjdCBsaW5lbm9pc2VTdGF0ZSAqbCA9ICZzZXNzaW9uLT5zdGF0ZTsKKyNpZm5kZWYgTElORU5PSVNFX0RJU0FCTEVfSU9DVEwKKyAgICBzdHJ1Y3Qgd2luc2l6ZSB3czsKKyAgICBpZiAoaW9jdGwoMSwgVElPQ0dXSU5TWiwgJndzKSA9PSAwICYmIHdzLndzX2NvbCAhPSAwKQorICAgIHsKKyAgICAgICAgbC0+Y29scyA9IHdzLndzX2NvbDsKKyAgICB9CisjZW5kaWYKKyAgICB7CisgICAgICAgIC8qIDQgc2VxdWVuY2VzOiBzdG9yZSBwb3NpdGlvbiwgZ28gdG8gcmlnaHQgbWFyZ2luLCByZXF1ZXN0IHBvc2l0aW9uLCByZXN0b3JlIHBvc2l0aW9uLiAqLworICAgICAgICBpZiAod3JpdGVFc2NTZXF1ZW5jZShzZXNzaW9uLCAiXHgxYiIgIjciICJceDFiIiAiWzk5OUMiICJceDFiIiAiWzZuIiAiXHgxYiIgIjgiLCAxNCkgIT0gMTQpCisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgKytzZXNzaW9uLT5uY29scmVxczsKKyAgICB9CisgICAgcmV0dXJuIGwtPmNvbHM7CisKK2ZhaWxlZDoKKyAgICBsbmRlYnVnKCJnZXRDb2x1bW5zUmVxdWVzdCBmYWlsZWQ6IGNvbHM9ODBcbiIpOworICAgIHJldHVybiA4MDsKK30KKworLyogQ2xlYXIgdGhlIHNjcmVlbi4gVXNlZCB0byBoYW5kbGUgY3RybCtsICovCit2b2lkIGxpbmVub2lzZUNsZWFyU2NyZWVuKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24pIHsKKyNpZm5kZWYgTElORU5PSVNFX0RFQlVHX01PREUKKyAgICBpZiAod3JpdGVFc2NTZXF1ZW5jZShzZXNzaW9uLCAiXHgxYltIXHgxYlsySiIsIDcpIDw9IDApIHsKKyAgICAgICAgLyogbm90aGluZyB0byBkbywganVzdCB0byBhdm9pZCB3YXJuaW5nLiAqLworICAgIH0KKyNlbmRpZgorfQorCisvKiBCZWVwLCB1c2VkIGZvciBjb21wbGV0aW9uIHdoZW4gdGhlcmUgaXMgbm90aGluZyB0byBjb21wbGV0ZSBvciB3aGVuIGFsbAorICogdGhlIGNob2ljZXMgd2VyZSBhbHJlYWR5IHNob3duLiAqLworc3RhdGljIHZvaWQgbGluZW5vaXNlQmVlcCh2b2lkKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJceDciKTsKKyAgICBmZmx1c2goc3RkZXJyKTsKK30KKworc3RhdGljIGludCBsaW5lbm9pc2VEZWZhdWx0UmVhZENoYXIobG9uZyBmZF9pbiwgY2hhciAqYykKK3sKKwlpbnQgbjsKKyAgICBkbyB7CisgICAgICAgIG4gPSByZWFkKGZkX2luLCBjLCAxKTsKKyAgICB9IHdoaWxlKCFuIHx8IChuPT0xICYmICEgKmMpKTsKKyAgICByZXR1cm4gbjsKK30KKworc3RhdGljIGludCBsaW5lbm9pc2VEZWZhdWx0V3JpdGUobG9uZyBmZF9vdXQsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKyAgICByZXR1cm4gd3JpdGUoZmRfb3V0LCBidWYsIGxlbik7Cit9CisKK2ludCBsaW5lbm9pc2VTZXNzaW9uT3Blbihjb25zdCBsaW5lbm9pc2VTZXNzaW9uSU8gKmlvLCB2b2lkICpzZXNzaW9uX2RhdGEsIGxpbmVub2lzZVNlc3Npb24gKipzZXNzaW9uKQoreworICAgIGxpbmVub2lzZVNlc3Npb24gKnM7CisgICAgaWYgKCFpbyB8fCAhc2Vzc2lvbikKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHMgPSBiY21vc19jYWxsb2Moc2l6ZW9mKCpzKSk7CisgICAgaWYgKCFzKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcy0+aGlzdG9yeV9tYXhfbGVuID0gTElORU5PSVNFX0RFRkFVTFRfSElTVE9SWV9NQVhfTEVOOworICAgIHMtPmlvID0gKmlvOworICAgIHMtPmR1bWJfdGVybWluYWwgPSBpby0+ZHVtYl90ZXJtaW5hbDsKKyAgICBzLT5zZXNzaW9uX2RhdGEgPSBzZXNzaW9uX2RhdGE7CisgICAgKnNlc3Npb24gPSBzOworICAgIHMtPm5leHQgPSBzZXNzaW9uczsKKyAgICBzZXNzaW9ucyA9IHM7CisKKyAgICBpZiAoIXMtPmlvLnJlYWRfY2hhcikKKyAgICB7CisgICAgICAgIHMtPmlvLnJlYWRfY2hhciA9IGxpbmVub2lzZURlZmF1bHRSZWFkQ2hhcjsKKyAgICAgICAgaWYgKCFzLT5pby5mZF9pbikKKyAgICAgICAgICAgIHMtPmlvLmZkX2luID0gU1RESU5fRklMRU5POworICAgIH0KKyAgICBpZiAoIXMtPmlvLndyaXRlKQorICAgIHsKKyAgICAgICAgcy0+aW8ud3JpdGUgPSBsaW5lbm9pc2VEZWZhdWx0V3JpdGU7CisgICAgICAgIGlmICghcy0+aW8uZmRfb3V0KQorICAgICAgICAgICAgcy0+aW8uZmRfb3V0ID0gU1RET1VUX0ZJTEVOTzsKKyAgICB9CisKKyAgICAvKiBJVDogdGVtcCAqLworICAgIHMtPm1sbW9kZSA9IDE7CisgICAgcy0+c3RhdGUuaWZkID0gU1RESU5fRklMRU5POworCisgICAgcmV0dXJuIDA7Cit9CisKKwordm9pZCBsaW5lbm9pc2VTZXNzaW9uQ2xvc2UobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBsaW5lbm9pc2VTZXNzaW9uICpzID0gc2Vzc2lvbnMsICpwcmV2PU5VTEw7CisgICAgd2hpbGUgKHMgJiYgcyAhPSBzZXNzaW9uKQorICAgIHsKKyAgICAgICAgcHJldiA9IHM7CisgICAgICAgIHMgPSBzLT5uZXh0OworICAgIH0KKyAgICBpZiAocykKKyAgICB7CisgICAgICAgIGlmIChwcmV2KQorICAgICAgICAgICAgcHJldi0+bmV4dCA9IHMtPm5leHQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNlc3Npb25zID0gcy0+bmV4dDsKKyAgICAgICAgZGlzYWJsZVJhd01vZGUocyk7CisgICAgICAgIGZyZWVIaXN0b3J5KHMpOworICAgICAgICBpZiAocy0+cmVhZF9haGVhZF9idWYpCisgICAgICAgICAgICBiY21vc19mcmVlKHMtPnJlYWRfYWhlYWRfYnVmKTsKKyAgICAgICAgYmNtb3NfZnJlZShzKTsKKyAgICB9Cit9CisKK3ZvaWQgKmxpbmVub2lzZVNlc3Npb25EYXRhKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24pIHsKKyAgICByZXR1cm4gc2Vzc2lvbi0+c2Vzc2lvbl9kYXRhOworfQorCisKK3ZvaWQgbGluZW5vaXNlU2V0RHVtYlRlcm1pbmFsKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24sIGludCBkdW1iKSB7CisgICAgaWYgKCFzZXNzaW9uLT5pby5kdW1iX3Rlcm1pbmFsKQorICAgIHsKKyAgICAgICAgc2Vzc2lvbi0+ZHVtYl90ZXJtaW5hbCA9IGR1bWI7CisgICAgICAgIHNlc3Npb24tPmZvcmNlZF9kdW1iID0gZHVtYjsKKyAgICB9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDb21wbGV0aW9uID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qIFRoaXMgaXMgYW4gaGVscGVyIGZ1bmN0aW9uIGZvciBsaW5lbm9pc2VFZGl0KCkgYW5kIGlzIGNhbGxlZCB3aGVuIHRoZQorICogdXNlciB0eXBlcyB0aGUgPHRhYj4ga2V5IGluIG9yZGVyIHRvIGNvbXBsZXRlIHRoZSBzdHJpbmcgY3VycmVudGx5IGluIHRoZQorICogaW5wdXQuIEl0IGNhbiBjYWxsIGxpbmVub2lzZVNldEJ1ZmZlciBpbiBvcmRlciB0byByZXBsYWNlIHRoZSBjdXJyZW50IGVkaXQgYnVmZmVyCisgKi8KK3N0YXRpYyB2b2lkIGNvbXBsZXRlTGluZShsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uKSB7CisgICAgc3RydWN0IGxpbmVub2lzZVN0YXRlICpscyA9ICZzZXNzaW9uLT5zdGF0ZTsKKworICAgIGlmICghc2Vzc2lvbi0+Y29tcGxldGlvbkNhbGxiYWNrKHNlc3Npb24sIGxzLT5idWYsIGxzLT5wb3MpKQorICAgIHsKKyAgICAgICAgbGluZW5vaXNlQmVlcCgpOworICAgIH0KKyAgICByZWZyZXNoTGluZShzZXNzaW9uKTsKK30KKworLyogUmVnaXN0ZXIgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgZm9yIHRhYi1jb21wbGV0aW9uLiAqLwordm9pZCBsaW5lbm9pc2VTZXRDb21wbGV0aW9uQ2FsbGJhY2sobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbiwgbGluZW5vaXNlQ29tcGxldGlvbkNhbGxiYWNrICpmbikgeworICAgIHNlc3Npb24tPmNvbXBsZXRpb25DYWxsYmFjayA9IGZuOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHJlZ2lzdGVyZWQgYnkgdGhlIHVzZXIKKyAqIGluIG9yZGVyIHRvIGFkZCBjb21wbGV0aW9uIG9wdGlvbnMgZ2l2ZW4gdGhlIGlucHV0IHN0cmluZyB3aGVuIHRoZQorICogdXNlciB0eXBlZCA8dGFiPi4gU2VlIHRoZSBleGFtcGxlLmMgc291cmNlIGNvZGUgZm9yIGEgdmVyeSBlYXN5IHRvCisgKiB1bmRlcnN0YW5kIGV4YW1wbGUuICovCit2b2lkIGxpbmVub2lzZVNldEJ1ZmZlcihsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uLCBjb25zdCBjaGFyICpidWYsIGludCBwb3MpCit7CisgICAgaWYgKCFzZXNzaW9uLT5zdGF0ZS5idWYpCisgICAgICAgIHJldHVybjsKKyAgICBzdHJuY3B5KHNlc3Npb24tPnN0YXRlLmJ1ZiwgYnVmLCBzZXNzaW9uLT5zdGF0ZS5idWZsZW4gLSAxKTsKKyAgICBzZXNzaW9uLT5zdGF0ZS5idWZbc2Vzc2lvbi0+c3RhdGUuYnVmbGVuIC0gMV0gPSAwOworICAgIHNlc3Npb24tPnN0YXRlLmxlbiA9IHN0cmxlbihzZXNzaW9uLT5zdGF0ZS5idWYpOworICAgIHNlc3Npb24tPnN0YXRlLnBvcyA9IChwb3MgPj0gMCAmJiBwb3MgPCBzZXNzaW9uLT5zdGF0ZS5sZW4pID8gcG9zIDogc2Vzc2lvbi0+c3RhdGUubGVuOworICAgIHJlZnJlc2hMaW5lKHNlc3Npb24pOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gTGluZSBlZGl0aW5nID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiBXZSBkZWZpbmUgYSB2ZXJ5IHNpbXBsZSAiYXBwZW5kIGJ1ZmZlciIgc3RydWN0dXJlLCB0aGF0IGlzIGFuIGhlYXAKKyAqIGFsbG9jYXRlZCBzdHJpbmcgd2hlcmUgd2UgY2FuIGFwcGVuZCB0by4gVGhpcyBpcyB1c2VmdWwgaW4gb3JkZXIgdG8KKyAqIHdyaXRlIGFsbCB0aGUgZXNjYXBlIHNlcXVlbmNlcyBpbiBhIGJ1ZmZlciBhbmQgZmx1c2ggdGhlbSB0byB0aGUgc3RhbmRhcmQKKyAqIG91dHB1dCBpbiBhIHNpbmdsZSBjYWxsLCB0byBhdm9pZCBmbGlja2VyaW5nIGVmZmVjdHMuICovCitzdHJ1Y3QgYWJ1ZiB7CisgICAgY2hhciAqYjsKKyAgICBpbnQgbGVuOworfTsKKworc3RhdGljIHZvaWQgYWJJbml0KHN0cnVjdCBhYnVmICphYikgeworICAgIGFiLT5iID0gTlVMTDsKKyAgICBhYi0+bGVuID0gMDsKK30KKworc3RhdGljIHZvaWQgYWJBcHBlbmQoc3RydWN0IGFidWYgKmFiLCBjb25zdCBjaGFyICpzLCBpbnQgbGVuKSB7CisgICAgY2hhciAqbmV3ID0gYmNtb3NfYWxsb2MoYWItPmxlbitsZW4pOworICAgIGlmIChuZXcgPT0gTlVMTCkgcmV0dXJuOworICAgIG1lbWNweShuZXcsYWItPmIsYWItPmxlbik7CisgICAgbWVtY3B5KG5ldythYi0+bGVuLHMsbGVuKTsKKyAgICBiY21vc19mcmVlKGFiLT5iKTsKKyAgICBhYi0+YiA9IG5ldzsKKyAgICBhYi0+bGVuICs9IGxlbjsKK30KKworc3RhdGljIHZvaWQgYWJGcmVlKHN0cnVjdCBhYnVmICphYikgeworICAgIGJjbW9zX2ZyZWUoYWItPmIpOworfQorCisvKiBTaW5nbGUgbGluZSBsb3cgbGV2ZWwgY3Vyc29yIHJlZnJlc2guCisgKi8KK3N0YXRpYyB2b2lkIHJlZnJlc2hDdXJzb3JTaW5nbGVMaW5lKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24pIHsKKyAgICBzdHJ1Y3QgbGluZW5vaXNlU3RhdGUgKmwgPSAmc2Vzc2lvbi0+c3RhdGU7CisgICAgY2hhciBzZXFbNjRdOworICAgIHNpemVfdCBwbGVuID0gc3RybGVuKGwtPnByb21wdCk7CisgICAgY2hhciAqYnVmID0gbC0+YnVmOworICAgIHNpemVfdCBsZW4gPSBsLT5sZW47CisgICAgc2l6ZV90IHBvcyA9IGwtPnBvczsKKyAgICBzdHJ1Y3QgYWJ1ZiBhYjsKKworICAgIHdoaWxlKChwbGVuK3BvcykgPj0gbC0+Y29scykgeworICAgICAgICBidWYrKzsKKyAgICAgICAgbGVuLS07CisgICAgICAgIHBvcy0tOworICAgIH0KKyAgICB3aGlsZSAocGxlbitsZW4gPiBsLT5jb2xzKSB7CisgICAgICAgIGxlbi0tOworICAgIH0KKworICAgIGFiSW5pdCgmYWIpOworICAgIC8qIEN1cnNvciB0byBsZWZ0IGVkZ2UgKi8KKyAgICBzbnByaW50ZihzZXEsNjQsIlx4MWJbOTk5RCIpOworICAgIGFiQXBwZW5kKCZhYixzZXEsc3RybGVuKHNlcSkpOworICAgIGlmIChwb3MrcGxlbikKKyAgICB7CisgICAgICAgIHNucHJpbnRmKHNlcSw2NCwiXHgxYlslZEMiLCAoaW50KShwb3MrcGxlbikpOworICAgICAgICBhYkFwcGVuZCgmYWIsc2VxLHN0cmxlbihzZXEpKTsKKyAgICB9CisgICAgaWYgKHdyaXRlRXNjU2VxdWVuY2Uoc2Vzc2lvbiwgYWIuYiwgYWIubGVuKSA9PSAtMSkge30gLyogQ2FuJ3QgcmVjb3ZlciBmcm9tIHdyaXRlIGVycm9yLiAqLworICAgIGFiRnJlZSgmYWIpOworfQorCisvKiBTaW5nbGUgbGluZSBsb3cgbGV2ZWwgbGluZSByZWZyZXNoLgorICoKKyAqIFJld3JpdGUgdGhlIGN1cnJlbnRseSBlZGl0ZWQgbGluZSBhY2NvcmRpbmdseSB0byB0aGUgYnVmZmVyIGNvbnRlbnQsCisgKiBjdXJzb3IgcG9zaXRpb24sIGFuZCBudW1iZXIgb2YgY29sdW1ucyBvZiB0aGUgdGVybWluYWwuICovCitzdGF0aWMgdm9pZCByZWZyZXNoU2luZ2xlTGluZShsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uKSB7CisgICAgc3RydWN0IGxpbmVub2lzZVN0YXRlICpsID0gJnNlc3Npb24tPnN0YXRlOworICAgIGNoYXIgc2VxWzY0XTsKKyAgICBzaXplX3QgcGxlbiA9IHN0cmxlbihsLT5wcm9tcHQpOworICAgIGNoYXIgKmJ1ZiA9IGwtPmJ1ZjsKKyAgICBzaXplX3QgbGVuID0gbC0+bGVuOworICAgIHNpemVfdCBwb3MgPSBsLT5wb3M7CisgICAgc3RydWN0IGFidWYgYWI7CisKKyAgICB3aGlsZSgocGxlbitwb3MpID49IGwtPmNvbHMpIHsKKyAgICAgICAgYnVmKys7CisgICAgICAgIGxlbi0tOworICAgICAgICBwb3MtLTsKKyAgICB9CisgICAgd2hpbGUgKHBsZW4rbGVuID4gbC0+Y29scykgeworICAgICAgICBsZW4tLTsKKyAgICB9CisKKyAgICBhYkluaXQoJmFiKTsKKyAgICAvKiBDdXJzb3IgdG8gbGVmdCBlZGdlICovCisgICAgc25wcmludGYoc2VxLDY0LCJceDFiWzk5OUQiKTsKKyAgICBhYkFwcGVuZCgmYWIsc2VxLHN0cmxlbihzZXEpKTsKKyAgICAvKiBXcml0ZSB0aGUgcHJvbXB0IGFuZCB0aGUgY3VycmVudCBidWZmZXIgY29udGVudCAqLworICAgIGFiQXBwZW5kKCZhYixsLT5wcm9tcHQsc3RybGVuKGwtPnByb21wdCkpOworICAgIGFiQXBwZW5kKCZhYixidWYsbGVuKTsKKyAgICAvKiBFcmFzZSB0byByaWdodCAqLworICAgIHNucHJpbnRmKHNlcSw2NCwiXHgxYlswSyIpOworICAgIGFiQXBwZW5kKCZhYixzZXEsc3RybGVuKHNlcSkpOworICAgIC8qIE1vdmUgY3Vyc29yIHRvIG9yaWdpbmFsIHBvc2l0aW9uLiAqLworICAgIHNucHJpbnRmKHNlcSw2NCwiXHgxYls5OTlEIik7CisgICAgYWJBcHBlbmQoJmFiLHNlcSxzdHJsZW4oc2VxKSk7CisgICAgaWYgKHBvcytwbGVuKQorICAgIHsKKyAgICAgICAgc25wcmludGYoc2VxLDY0LCJceDFiWyVkQyIsIChpbnQpKHBvcytwbGVuKSk7CisgICAgICAgIGFiQXBwZW5kKCZhYixzZXEsc3RybGVuKHNlcSkpOworICAgIH0KKyAgICBpZiAod3JpdGVFc2NTZXF1ZW5jZShzZXNzaW9uLCBhYi5iLCBhYi5sZW4pID09IC0xKSB7fSAvKiBDYW4ndCByZWNvdmVyIGZyb20gd3JpdGUgZXJyb3IuICovCisgICAgYWJGcmVlKCZhYik7Cit9CisKKy8qIE11bHRpIGxpbmUgbG93IGxldmVsIGN1cnNvciBwb3NpdGlvbiByZWZyZXNoLgorICoKKyAqIFJld3JpdGUgdGhlIGN1cnJlbnRseSBlZGl0ZWQgbGluZSBhY2NvcmRpbmdseSB0byB0aGUgYnVmZmVyIGNvbnRlbnQsCisgKiBjdXJzb3IgcG9zaXRpb24sIGFuZCBudW1iZXIgb2YgY29sdW1ucyBvZiB0aGUgdGVybWluYWwuICovCitzdGF0aWMgdm9pZCByZWZyZXNoQ3Vyc29yTXVsdGlMaW5lKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24pIHsKKyAgICBzdHJ1Y3QgbGluZW5vaXNlU3RhdGUgKmwgPSAmc2Vzc2lvbi0+c3RhdGU7CisgICAgY2hhciBzZXFbNjRdOworICAgIGludCBwbGVuID0gc3RybGVuKGwtPnByb21wdCk7CisgICAgaW50IG9sZF9ycG9zID0gKHBsZW4rbC0+b2xkcG9zK2wtPmNvbHMpL2wtPmNvbHM7IC8qIGN1cnNvciByZWxhdGl2ZSByb3cuICovCisgICAgaW50IG5ld19ycG9zID0gKHBsZW4rbC0+cG9zK2wtPmNvbHMpL2wtPmNvbHM7IC8qIGN1cnNvciByZWxhdGl2ZSByb3cuICovCisgICAgaW50IG9sZF9jcG9zID0gKHBsZW4rbC0+b2xkcG9zKSVsLT5jb2xzOyAvKiBjdXJzb3IgcmVsYXRpdmUgcm93LiAqLworICAgIGludCBuZXdfY3BvcyA9IChwbGVuK2wtPnBvcyklbC0+Y29sczsgLyogY3Vyc29yIHJlbGF0aXZlIHJvdy4gKi8KKyAgICBzdHJ1Y3QgYWJ1ZiBhYjsKKworICAgIC8qIFVwZGF0ZSBtYXhyb3dzIGlmIG5lZWRlZC4gKi8KKyAgICBpZiAobmV3X3Jwb3MgPiAoaW50KWwtPm1heHJvd3MpIG5ld19ycG9zID0gbC0+bWF4cm93czsKKworICAgIGxuZGVidWcoIm9sZHA9JWQgbmV3cD0lZCBvcj0lZCBucj0lZCBvYz0lZCBuYz0lZFxuXG4iLCBsLT5vbGRwb3MsIGwtPnBvcywgb2xkX3Jwb3MsIG5ld19ycG9zLCBvbGRfY3BvcywgbmV3X2Nwb3MpOworCisgICAgYWJJbml0KCZhYik7CisKKyAgICAvKiBIYW5kbGUgcm93ICovCisgICAgaWYgKG5ld19ycG9zID4gb2xkX3Jwb3MpCisgICAgeworICAgICAgICBzbnByaW50ZihzZXEsNjQsIlx4MWJbJWRCIiwgbmV3X3Jwb3MgLSBvbGRfcnBvcyk7CisgICAgICAgIGFiQXBwZW5kKCZhYixzZXEsc3RybGVuKHNlcSkpOworICAgIH0KKyAgICBlbHNlIGlmIChuZXdfcnBvcyA8IG9sZF9ycG9zKQorICAgIHsKKyAgICAgICAgc25wcmludGYoc2VxLDY0LCJceDFiWyVkQSIsIG9sZF9ycG9zIC0gbmV3X3Jwb3MpOworICAgICAgICBhYkFwcGVuZCgmYWIsc2VxLHN0cmxlbihzZXEpKTsKKyAgICB9CisKKyAgICAvKiBIYW5kbGUgY29sdW1uICovCisgICAgaWYgKG5ld19jcG9zID4gb2xkX2Nwb3MpCisgICAgeworICAgICAgICBzbnByaW50ZihzZXEsNjQsIlx4MWJbJWRDIiwgbmV3X2Nwb3MgLSBvbGRfY3Bvcyk7CisgICAgICAgIGFiQXBwZW5kKCZhYixzZXEsc3RybGVuKHNlcSkpOworICAgIH0KKyAgICBlbHNlIGlmIChuZXdfY3BvcyA8IG9sZF9jcG9zKQorICAgIHsKKyAgICAgICAgc25wcmludGYoc2VxLDY0LCJceDFiWyVkRCIsIG9sZF9jcG9zIC0gbmV3X2Nwb3MpOworICAgICAgICBhYkFwcGVuZCgmYWIsc2VxLHN0cmxlbihzZXEpKTsKKyAgICB9CisKKyAgICBsLT5vbGRwb3MgPSBsLT5wb3M7CisKKyAgICBpZiAod3JpdGVFc2NTZXF1ZW5jZShzZXNzaW9uLCBhYi5iLCBhYi5sZW4pID09IC0xKSB7fSAvKiBDYW4ndCByZWNvdmVyIGZyb20gd3JpdGUgZXJyb3IuICovCisgICAgYWJGcmVlKCZhYik7Cit9CisKKy8qIE11bHRpIGxpbmUgbG93IGxldmVsIGxpbmUgcmVmcmVzaC4KKyAqCisgKiBSZXdyaXRlIHRoZSBjdXJyZW50bHkgZWRpdGVkIGxpbmUgYWNjb3JkaW5nbHkgdG8gdGhlIGJ1ZmZlciBjb250ZW50LAorICogY3Vyc29yIHBvc2l0aW9uLCBhbmQgbnVtYmVyIG9mIGNvbHVtbnMgb2YgdGhlIHRlcm1pbmFsLiAqLworc3RhdGljIHZvaWQgcmVmcmVzaE11bHRpTGluZShsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uKSB7CisgICAgc3RydWN0IGxpbmVub2lzZVN0YXRlICpsID0gJnNlc3Npb24tPnN0YXRlOworICAgIGNoYXIgc2VxWzY0XTsKKyAgICBpbnQgcGxlbiA9IHN0cmxlbihsLT5wcm9tcHQpOworICAgIGludCByb3dzID0gKHBsZW4rbC0+bGVuK2wtPmNvbHMtMSkvbC0+Y29sczsgLyogcm93cyB1c2VkIGJ5IGN1cnJlbnQgYnVmLiAqLworICAgIGludCBycG9zID0gKHBsZW4rbC0+b2xkcG9zK2wtPmNvbHMpL2wtPmNvbHM7IC8qIGN1cnNvciByZWxhdGl2ZSByb3cuICovCisgICAgaW50IHJwb3MyOyAvKiBycG9zIGFmdGVyIHJlZnJlc2guICovCisgICAgaW50IG9sZF9yb3dzID0gbC0+bWF4cm93czsKKyAgICBpbnQgcG9zOworICAgIGludCBqOworICAgIHN0cnVjdCBhYnVmIGFiOworCisgICAgLyogVXBkYXRlIG1heHJvd3MgaWYgbmVlZGVkLiAqLworICAgIGlmIChyb3dzID4gKGludClsLT5tYXhyb3dzKSBsLT5tYXhyb3dzID0gcm93czsKKworICAgIC8qIEZpcnN0IHN0ZXA6IGNsZWFyIGFsbCB0aGUgbGluZXMgdXNlZCBiZWZvcmUuIFRvIGRvIHNvIHN0YXJ0IGJ5CisgICAgICogZ29pbmcgdG8gdGhlIGxhc3Qgcm93LiAqLworICAgIGFiSW5pdCgmYWIpOworICAgIGlmIChvbGRfcm93cy1ycG9zID4gMCkgeworICAgICAgICBsbmRlYnVnKCJnbyBkb3duICVkIiwgb2xkX3Jvd3MtcnBvcyk7CisgICAgICAgIHNucHJpbnRmKHNlcSw2NCwiXHgxYlslZEIiLCBvbGRfcm93cy1ycG9zKTsKKyAgICAgICAgYWJBcHBlbmQoJmFiLHNlcSxzdHJsZW4oc2VxKSk7CisgICAgfQorCisgICAgLyogTm93IGZvciBldmVyeSByb3cgY2xlYXIgaXQsIGdvIHVwLiAqLworICAgIGZvciAoaiA9IDA7IGogPCBvbGRfcm93cy0xOyBqKyspIHsKKyAgICAgICAgbG5kZWJ1ZygiY2xlYXIrdXAiKTsKKyAgICAgICAgc25wcmludGYoc2VxLDY0LCJceDFiWzk5OURceDFiWzBLXHgxYlsxQSIpOworICAgICAgICBhYkFwcGVuZCgmYWIsc2VxLHN0cmxlbihzZXEpKTsKKyAgICB9CisKKyAgICAvKiBDbGVhbiB0aGUgdG9wIGxpbmUuICovCisgICAgbG5kZWJ1ZygiY2xlYXIiKTsKKyAgICBzbnByaW50ZihzZXEsNjQsIlx4MWJbOTk5RFx4MWJbMEsiKTsKKyAgICBhYkFwcGVuZCgmYWIsc2VxLHN0cmxlbihzZXEpKTsKKworICAgIC8qIFdyaXRlIHRoZSBwcm9tcHQgYW5kIHRoZSBjdXJyZW50IGJ1ZmZlciBjb250ZW50ICovCisgICAgYWJBcHBlbmQoJmFiLGwtPnByb21wdCxzdHJsZW4obC0+cHJvbXB0KSk7CisgICAgYWJBcHBlbmQoJmFiLGwtPmJ1ZixsLT5sZW4pOworCisgICAgLyogSWYgd2UgYXJlIGF0IHRoZSB2ZXJ5IGVuZCBvZiB0aGUgc2NyZWVuIHdpdGggb3VyIHByb21wdCwgd2UgbmVlZCB0bworICAgICAqIGVtaXQgYSBuZXdsaW5lIGFuZCBtb3ZlIHRoZSBwcm9tcHQgdG8gdGhlIGZpcnN0IGNvbHVtbi4gKi8KKyAgICBpZiAobC0+cG9zICYmCisgICAgICAgIGwtPnBvcyA9PSBsLT5sZW4gJiYKKyAgICAgICAgKGwtPnBvcytwbGVuKSAlIGwtPmNvbHMgPT0gMCkKKyAgICB7CisgICAgICAgIGxuZGVidWcoIjxuZXdsaW5lPiIpOworICAgICAgICBhYkFwcGVuZCgmYWIsIlxuIiwxKTsKKyAgICAgICAgc25wcmludGYoc2VxLDY0LCJceDFiWzk5OUQiKTsKKyAgICAgICAgYWJBcHBlbmQoJmFiLHNlcSxzdHJsZW4oc2VxKSk7CisgICAgICAgIHJvd3MrKzsKKyAgICAgICAgaWYgKHJvd3MgPiAoaW50KWwtPm1heHJvd3MpIGwtPm1heHJvd3MgPSByb3dzOworICAgIH0KKworICAgIC8qIE1vdmUgY3Vyc29yIHRvIHJpZ2h0IHBvc2l0aW9uLiAqLworICAgIHJwb3MyID0gKHBsZW4rbC0+cG9zK2wtPmNvbHMpL2wtPmNvbHM7IC8qIGN1cnJlbnQgY3Vyc29yIHJlbGF0aXZlIHJvdy4gKi8KKyAgICBsbmRlYnVnKCJycG9zMiAlZCIsIHJwb3MyKTsKKworICAgIC8qIEdvIHVwIHRpbGwgd2UgcmVhY2ggdGhlIGV4cGVjdGVkIHBvc2l0b24uICovCisgICAgaWYgKHJvd3MtcnBvczIgPiAwKSB7CisgICAgICAgIGxuZGVidWcoImdvLXVwICVkIiwgcm93cy1ycG9zMik7CisgICAgICAgIHNucHJpbnRmKHNlcSw2NCwiXHgxYlslZEEiLCByb3dzLXJwb3MyKTsKKyAgICAgICAgYWJBcHBlbmQoJmFiLHNlcSxzdHJsZW4oc2VxKSk7CisgICAgfQorCisgICAgLyogU2V0IGNvbHVtbi4gKi8KKyAgICBsbmRlYnVnKCJzZXQgY29sICVkIiwgMSsoKHBsZW4rKGludClsLT5wb3MpICUgKGludClsLT5jb2xzKSk7CisgICAgc25wcmludGYoc2VxLDY0LCJceDFiWzk5OUQiKTsKKyAgICBhYkFwcGVuZCgmYWIsc2VxLHN0cmxlbihzZXEpKTsKKyAgICBwb3MgPSAoKHBsZW4rKGludClsLT5wb3MpICUgKGludClsLT5jb2xzKTsKKyAgICBpZiAocG9zKQorICAgIHsKKyAgICAgICAgc25wcmludGYoc2VxLDY0LCJceDFiWyVkQyIsIHBvcyk7CisgICAgICAgIGFiQXBwZW5kKCZhYixzZXEsc3RybGVuKHNlcSkpOworICAgIH0KKyAgICBsbmRlYnVnKCJcbiIpOworICAgIGwtPm9sZHBvcyA9IGwtPnBvczsKKworICAgIGlmICh3cml0ZUVzY1NlcXVlbmNlKHNlc3Npb24sIGFiLmIsIGFiLmxlbikgPT0gLTEpIHt9IC8qIENhbid0IHJlY292ZXIgZnJvbSB3cml0ZSBlcnJvci4gKi8KKyAgICBhYkZyZWUoJmFiKTsKKworICAgIGxuZGVidWcoIiAtIG91dFxuIik7Cit9CisKKy8qIENhbGxzIHRoZSB0d28gbG93IGxldmVsIGZ1bmN0aW9ucyByZWZyZXNoQ3Vyc29yU2luZ2xlTGluZSgpIG9yCisgKiByZWZyZXNoQ3Vyc29yTXVsdGlMaW5lKCkgYWNjb3JkaW5nIHRvIHRoZSBzZWxlY3RlZCBtb2RlLiAqLworc3RhdGljIHZvaWQgcmVmcmVzaEN1cnNvcihsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uKSB7CisgICAgaWYgKHNlc3Npb24tPm1sbW9kZSkKKyAgICAgICAgcmVmcmVzaEN1cnNvck11bHRpTGluZShzZXNzaW9uKTsKKyAgICBlbHNlCisgICAgICAgIHJlZnJlc2hDdXJzb3JTaW5nbGVMaW5lKHNlc3Npb24pOworfQorCisvKiBDYWxscyB0aGUgdHdvIGxvdyBsZXZlbCBmdW5jdGlvbnMgcmVmcmVzaFNpbmdsZUxpbmUoKSBvcgorICogcmVmcmVzaE11bHRpTGluZSgpIGFjY29yZGluZyB0byB0aGUgc2VsZWN0ZWQgbW9kZS4gKi8KK3N0YXRpYyB2b2lkIHJlZnJlc2hMaW5lKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24pIHsKKyAgICBpZiAoc2Vzc2lvbi0+bWxtb2RlKQorICAgICAgICByZWZyZXNoTXVsdGlMaW5lKHNlc3Npb24pOworICAgIGVsc2UKKyAgICAgICAgcmVmcmVzaFNpbmdsZUxpbmUoc2Vzc2lvbik7Cit9CisKKy8qIEluc2VydCB0aGUgY2hhcmFjdGVyICdjJyBhdCBjdXJzb3IgY3VycmVudCBwb3NpdGlvbi4KKyAqCisgKiBPbiBlcnJvciB3cml0aW5nIHRvIHRoZSB0ZXJtaW5hbCAtMSBpcyByZXR1cm5lZCwgb3RoZXJ3aXNlIDAuICovCitzdGF0aWMgaW50IGxpbmVub2lzZUVkaXRJbnNlcnQobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbiwgY2hhciBjKSB7CisgICAgc3RydWN0IGxpbmVub2lzZVN0YXRlICpsID0gJnNlc3Npb24tPnN0YXRlOworICAgIGlmIChsLT5sZW4gPCBsLT5idWZsZW4pIHsKKyAgICAgICAgaWYgKGwtPmxlbiA9PSBsLT5wb3MpIHsKKyAgICAgICAgICAgIGludCBwbGVuID0gc3RybGVuKGwtPnByb21wdCk7CisgICAgICAgICAgICBpbnQgcm93cyA9IChwbGVuK2wtPmxlbitsLT5jb2xzKS9sLT5jb2xzOworCisgICAgICAgICAgICBsLT5idWZbbC0+cG9zXSA9IGM7CisgICAgICAgICAgICBsLT5wb3MrKzsKKyAgICAgICAgICAgIGwtPmxlbisrOworICAgICAgICAgICAgbC0+YnVmW2wtPmxlbl0gPSAnXDAnOworICAgICAgICAgICAgbG5kZWJ1ZygiIHBsZW49JWQgbGVuPSVkIHBvcz0lZCBjb2xzPSVkIGJ1Zj08JXM+XG4iLAorICAgICAgICAgICAgICAgIChpbnQpbC0+cGxlbiwgKGludClsLT5sZW4sIChpbnQpbC0+cG9zLCAoaW50KWwtPmNvbHMsIGwtPmJ1Zik7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbi0+aW8ud3JpdGUoc2Vzc2lvbi0+aW8uZmRfb3V0LCAmYywgMSkgPT0gLTEpIHJldHVybiAtMTsKKyAgICAgICAgICAgIGwtPm9sZHBvcyA9IGwtPnBvczsKKyAgICAgICAgICAgIGwtPm1heHJvd3MgPSByb3dzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVtbW92ZShsLT5idWYrbC0+cG9zKzEsbC0+YnVmK2wtPnBvcyxsLT5sZW4tbC0+cG9zKTsKKyAgICAgICAgICAgIGwtPmJ1ZltsLT5wb3NdID0gYzsKKyAgICAgICAgICAgIGwtPmxlbisrOworICAgICAgICAgICAgbC0+cG9zKys7CisgICAgICAgICAgICBsLT5idWZbbC0+bGVuXSA9ICdcMCc7CisgICAgICAgICAgICBsbmRlYnVnKCIgcGxlbj0lZCBsZW49JWQgcG9zPSVkIGNvbHM9JWQgYnVmPTwlcz5cbiIsCisgICAgICAgICAgICAgICAgbC0+cGxlbiwgbC0+bGVuLCBsLT5wb3MsIGwtPmNvbHMsIGwtPmJ1Zik7CisgICAgICAgICAgICByZWZyZXNoTGluZShzZXNzaW9uKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyogTW92ZSBjdXJzb3Igb24gdGhlIGxlZnQuICovCitzdGF0aWMgdm9pZCBsaW5lbm9pc2VFZGl0TW92ZUxlZnQobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbikgeworICAgIHN0cnVjdCBsaW5lbm9pc2VTdGF0ZSAqbCA9ICZzZXNzaW9uLT5zdGF0ZTsKKyAgICBpZiAobC0+cG9zID4gMCkgeworICAgICAgICBsLT5wb3MtLTsKKyAgICAgICAgcmVmcmVzaEN1cnNvcihzZXNzaW9uKTsKKyAgICB9Cit9CisKKy8qIE1vdmUgY3Vyc29yIG9uIHRoZSByaWdodC4gKi8KK3N0YXRpYyB2b2lkIGxpbmVub2lzZUVkaXRNb3ZlUmlnaHQobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbikgeworICAgIHN0cnVjdCBsaW5lbm9pc2VTdGF0ZSAqbCA9ICZzZXNzaW9uLT5zdGF0ZTsKKyAgICBpZiAobC0+cG9zICE9IGwtPmxlbikgeworICAgICAgICBsLT5wb3MrKzsKKyAgICAgICAgcmVmcmVzaEN1cnNvcihzZXNzaW9uKTsKKyAgICB9Cit9CisKKy8qIE1vdmUgY3Vyc29yIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZS4gKi8KK3N0YXRpYyB2b2lkIGxpbmVub2lzZUVkaXRNb3ZlSG9tZShsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uKSB7CisgICAgc3RydWN0IGxpbmVub2lzZVN0YXRlICpsID0gJnNlc3Npb24tPnN0YXRlOworICAgIGlmIChsLT5wb3MgIT0gMCkgeworICAgICAgICBsLT5wb3MgPSAwOworICAgICAgICByZWZyZXNoQ3Vyc29yKHNlc3Npb24pOworICAgIH0KK30KKworLyogTW92ZSBjdXJzb3IgdG8gdGhlIGVuZCBvZiB0aGUgbGluZS4gKi8KK3N0YXRpYyB2b2lkIGxpbmVub2lzZUVkaXRNb3ZlRW5kKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24pIHsKKyAgICBzdHJ1Y3QgbGluZW5vaXNlU3RhdGUgKmwgPSAmc2Vzc2lvbi0+c3RhdGU7CisgICAgaWYgKGwtPnBvcyAhPSBsLT5sZW4pIHsKKyAgICAgICAgbC0+cG9zID0gbC0+bGVuOworICAgICAgICByZWZyZXNoQ3Vyc29yKHNlc3Npb24pOworICAgIH0KK30KKworLyogc3RyZHVwIGltcGxlbWVudGF0aW9uICovCitzdGF0aWMgaW5saW5lIGNoYXIgKmxpbmVub2lzZV9zdHJkdXAoY29uc3QgY2hhciAqcykKK3sKKyAgICBzaXplX3Qgc2l6ZSA9IHN0cmxlbihzKSArIDE7CisgICAgY2hhciAqbmV3ID0gYmNtb3NfYWxsb2Moc2l6ZSk7CisgICAgaWYgKG5ldykKKyAgICAgICAgbWVtY3B5KG5ldywgcywgc2l6ZSk7CisgICAgcmV0dXJuIG5ldzsKK30KKworLyogU3Vic3RpdHV0ZSB0aGUgY3VycmVudGx5IGVkaXRlZCBsaW5lIHdpdGggdGhlIG5leHQgb3IgcHJldmlvdXMgaGlzdG9yeQorICogZW50cnkgYXMgc3BlY2lmaWVkIGJ5ICdkaXInLiAqLworI2RlZmluZSBMSU5FTk9JU0VfSElTVE9SWV9ORVhUIDAKKyNkZWZpbmUgTElORU5PSVNFX0hJU1RPUllfUFJFViAxCitzdGF0aWMgdm9pZCBsaW5lbm9pc2VFZGl0SGlzdG9yeU5leHQobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbiwgaW50IGRpcikgeworICAgIHN0cnVjdCBsaW5lbm9pc2VTdGF0ZSAqbCA9ICZzZXNzaW9uLT5zdGF0ZTsKKyAgICBpZiAoc2Vzc2lvbi0+aGlzdG9yeV9sZW4gPiAxKSB7CisgICAgICAgIC8qIFVwZGF0ZSB0aGUgY3VycmVudCBoaXN0b3J5IGVudHJ5IGJlZm9yZSB0bworICAgICAgICAgKiBvdmVyd3JpdGUgaXQgd2l0aCB0aGUgbmV4dCBvbmUuICovCisgICAgICAgIGJjbW9zX2ZyZWUoc2Vzc2lvbi0+aGlzdG9yeVtzZXNzaW9uLT5oaXN0b3J5X2xlbiAtIDEgLSBsLT5oaXN0b3J5X2luZGV4XSk7CisgICAgICAgIHNlc3Npb24tPmhpc3Rvcnlbc2Vzc2lvbi0+aGlzdG9yeV9sZW4gLSAxIC0gbC0+aGlzdG9yeV9pbmRleF0gPSBsaW5lbm9pc2Vfc3RyZHVwKGwtPmJ1Zik7CisgICAgICAgIC8qIFNob3cgdGhlIG5ldyBlbnRyeSAqLworICAgICAgICBsLT5oaXN0b3J5X2luZGV4ICs9IChkaXIgPT0gTElORU5PSVNFX0hJU1RPUllfUFJFVikgPyAxIDogLTE7CisgICAgICAgIGlmIChsLT5oaXN0b3J5X2luZGV4IDwgMCkgeworICAgICAgICAgICAgbC0+aGlzdG9yeV9pbmRleCA9IDA7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAobC0+aGlzdG9yeV9pbmRleCA+PSBzZXNzaW9uLT5oaXN0b3J5X2xlbikgeworICAgICAgICAgICAgbC0+aGlzdG9yeV9pbmRleCA9IHNlc3Npb24tPmhpc3RvcnlfbGVuLTE7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc3RybmNweShsLT5idWYsc2Vzc2lvbi0+aGlzdG9yeVtzZXNzaW9uLT5oaXN0b3J5X2xlbiAtIDEgLSBsLT5oaXN0b3J5X2luZGV4XSxsLT5idWZsZW4pOworICAgICAgICBsLT5idWZbbC0+YnVmbGVuLTFdID0gJ1wwJzsKKyAgICAgICAgbC0+bGVuID0gbC0+cG9zID0gc3RybGVuKGwtPmJ1Zik7CisgICAgICAgIHJlZnJlc2hMaW5lKHNlc3Npb24pOworICAgIH0KK30KKworLyogRGVsZXRlIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIHJpZ2h0IG9mIHRoZSBjdXJzb3Igd2l0aG91dCBhbHRlcmluZyB0aGUgY3Vyc29yCisgKiBwb3NpdGlvbi4gQmFzaWNhbGx5IHRoaXMgaXMgd2hhdCBoYXBwZW5zIHdpdGggdGhlICJEZWxldGUiIGtleWJvYXJkIGtleS4gKi8KK3N0YXRpYyB2b2lkIGxpbmVub2lzZUVkaXREZWxldGUobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbikgeworICAgIHN0cnVjdCBsaW5lbm9pc2VTdGF0ZSAqbCA9ICZzZXNzaW9uLT5zdGF0ZTsKKyAgICBpZiAobC0+bGVuID4gMCAmJiBsLT5wb3MgPCBsLT5sZW4pIHsKKyAgICAgICAgbWVtbW92ZShsLT5idWYrbC0+cG9zLGwtPmJ1ZitsLT5wb3MrMSxsLT5sZW4tbC0+cG9zLTEpOworICAgICAgICBsLT5sZW4tLTsKKyAgICAgICAgbC0+YnVmW2wtPmxlbl0gPSAnXDAnOworICAgICAgICByZWZyZXNoTGluZShzZXNzaW9uKTsKKyAgICB9Cit9CisKKy8qIEJhY2tzcGFjZSBpbXBsZW1lbnRhdGlvbi4gKi8KK3N0YXRpYyB2b2lkIGxpbmVub2lzZUVkaXRCYWNrc3BhY2UobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbikgeworICAgIHN0cnVjdCBsaW5lbm9pc2VTdGF0ZSAqbCA9ICZzZXNzaW9uLT5zdGF0ZTsKKyAgICBpZiAobC0+cG9zID4gMCAmJiBsLT5sZW4gPiAwKSB7CisgICAgICAgIG1lbW1vdmUobC0+YnVmK2wtPnBvcy0xLGwtPmJ1ZitsLT5wb3MsbC0+bGVuLWwtPnBvcyk7CisgICAgICAgIGwtPnBvcy0tOworICAgICAgICBsLT5sZW4tLTsKKyAgICAgICAgbC0+YnVmW2wtPmxlbl0gPSAnXDAnOworICAgICAgICByZWZyZXNoTGluZShzZXNzaW9uKTsKKyAgICB9Cit9CisKKy8qIERlbGV0ZSB0aGUgcHJldmlvc3Ugd29yZCwgbWFpbnRhaW5pbmcgdGhlIGN1cnNvciBhdCB0aGUgc3RhcnQgb2YgdGhlCisgKiBjdXJyZW50IHdvcmQuICovCitzdGF0aWMgdm9pZCBsaW5lbm9pc2VFZGl0RGVsZXRlUHJldldvcmQobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbikgeworICAgIHN0cnVjdCBsaW5lbm9pc2VTdGF0ZSAqbCA9ICZzZXNzaW9uLT5zdGF0ZTsKKyAgICBzaXplX3Qgb2xkX3BvcyA9IGwtPnBvczsKKyAgICBzaXplX3QgZGlmZjsKKworICAgIHdoaWxlIChsLT5wb3MgPiAwICYmIGwtPmJ1ZltsLT5wb3MtMV0gPT0gJyAnKQorICAgICAgICBsLT5wb3MtLTsKKyAgICB3aGlsZSAobC0+cG9zID4gMCAmJiBsLT5idWZbbC0+cG9zLTFdICE9ICcgJykKKyAgICAgICAgbC0+cG9zLS07CisgICAgZGlmZiA9IG9sZF9wb3MgLSBsLT5wb3M7CisgICAgbWVtbW92ZShsLT5idWYrbC0+cG9zLGwtPmJ1ZitvbGRfcG9zLGwtPmxlbi1vbGRfcG9zKzEpOworICAgIGwtPmxlbiAtPSBkaWZmOworICAgIHJlZnJlc2hMaW5lKHNlc3Npb24pOworfQorCitzdGF0aWMgaW50IGxpbmVub2lzZVJlYWRDaGFyKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24sIGNoYXIgKmMpCit7CisgICAgaW50IG47CisKKyAgICBkbyB7CisgICAgICAgIGlmIChzZXNzaW9uLT5yZWFkX2FoZWFkX2J1ZikKKyAgICAgICAgeworICAgICAgICAgICAgKmMgPSBzZXNzaW9uLT5yZWFkX2FoZWFkX2J1ZltzZXNzaW9uLT5yZWFkX2FoZWFkX3BvcysrXTsKKyAgICAgICAgICAgIGxuZGVidWcoInJlYWQgY2hhciBmcm9tIGJ1ZiAlZCglYylcbiIsICpjLCAqYyk7CisgICAgICAgICAgICBpZiAoKmMpCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICBiY21vc19mcmVlKHNlc3Npb24tPnJlYWRfYWhlYWRfYnVmKTsKKyAgICAgICAgICAgIHNlc3Npb24tPnJlYWRfYWhlYWRfYnVmID0gTlVMTDsKKyAgICAgICAgICAgIC8qIEZhbGwgdGhyb3VnaCAqLworICAgICAgICB9CisgICAgICAgIG4gPSBzZXNzaW9uLT5pby5yZWFkX2NoYXIoc2Vzc2lvbi0+aW8uZmRfaW4sIGMpOworICAgIH0gd2hpbGUgKCFuIHx8IChuID09IDEgJiYgISAqYykpOworICAgIGxuZGVidWcoInJlYWQgY2hhciBmcm9tIGlvICVkKCVjKSBuPSVkXG4iLCAqYywgKmMsIG4pOworICAgIHJldHVybiBuOworfQorCitzdGF0aWMgaW50IGxpbmVub2lzZUhhbmRsZUVzY1NlcXVlbmNlKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24pCit7CisgICAgc3RydWN0IGxpbmVub2lzZVN0YXRlICpsID0gJnNlc3Npb24tPnN0YXRlOworICAgIGNoYXIgc2VxWzMyXTsKKworICAgIC8qIFJlYWQgdGhlIG5leHQgdHdvIGJ5dGVzIHJlcHJlc2VudGluZyB0aGUgZXNjYXBlIHNlcXVlbmNlLgorICAgICAqIFVzZSB0d28gY2FsbHMgdG8gaGFuZGxlIHNsb3cgdGVybWluYWxzIHJldHVybmluZyB0aGUgdHdvCisgICAgICogY2hhcnMgYXQgZGlmZmVyZW50IHRpbWVzLiAqLworICAgIGlmIChsaW5lbm9pc2VSZWFkQ2hhcihzZXNzaW9uLCBzZXEpID09IC0xKSByZXR1cm4gLTE7CisgICAgaWYgKGxpbmVub2lzZVJlYWRDaGFyKHNlc3Npb24sIHNlcSsxKSA9PSAtMSkgcmV0dXJuIC0xOworICAgIGxuZGVidWcoInNlcT0lMDJ4KCVjKSBzZXExPSUwMngoJWMpXG4iLCBzZXFbMF0sIHNlcVswXSwgc2VxWzFdLCBzZXFbMV0pOworCisgICAgLyogRVNDIFsgc2VxdWVuY2VzLiAqLworICAgIGlmIChzZXFbMF0gPT0gJ1snKSB7CisgICAgICAgIGlmIChzZXFbMV0gPj0gJzAnICYmIHNlcVsxXSA8PSAnOScpIHsKKyAgICAgICAgICAgIGludCBuID0gMjsKKyAgICAgICAgICAgIGNoYXIgdGVybWluYXRvciA9IDA7CisKKyAgICAgICAgICAgIC8qIEV4dGVuZGVkIGVzY2FwZSwgcmVhZCBhZGRpdGlvbmFsIGJ5dGUocykgKi8KKyAgICAgICAgICAgIHdoaWxlIChsaW5lbm9pc2VSZWFkQ2hhcihzZXNzaW9uLCBzZXErbikgIT0gLTEgJiYgbiA8IHNpemVvZihzZXEpIC0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXJtaW5hdG9yID0gc2VxW24rK107CisgICAgICAgICAgICAgICAgaWYgKCAhKHRlcm1pbmF0b3IgPj0gJzAnICYmIHRlcm1pbmF0b3IgPD0gJzknKSAmJiB0ZXJtaW5hdG9yICE9ICc7JykKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXFbbl0gPSAwOworICAgICAgICAgICAgc3dpdGNoICh0ZXJtaW5hdG9yICkgeworICAgICAgICAgICAgICAgIGNhc2UgJ34nOgorICAgICAgICAgICAgICAgICAgICBsaW5lbm9pc2VFZGl0RGVsZXRlKHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdSJzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCByb3csIGNvbDsKKyAgICAgICAgICAgICAgICAgICAgLyogUG9zaXRpb24gcmVwb3J0ICovCisgICAgICAgICAgICAgICAgICAgIHNlcVtuLTFdID0gMDsgLyogQ3V0IFIgKi8KKyAgICAgICAgICAgICAgICAgICAgc3NjYW5mKHNlcSsxLCAiJWQ7JWQiLCAmcm93LCAmY29sKTsKKyAgICAgICAgICAgICAgICAgICAgbC0+Y29scyA9IGNvbDsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+bmNvbHJlcXMgPSAwOworICAgICAgICAgICAgICAgICAgICBsbmRlYnVnKCJwb3NpdGlvbiByZXBvcnQgcm93PSVkIGNvbD0lZFxuIiwgcm93LCBjb2wpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN3aXRjaChzZXFbMV0pIHsKKyAgICAgICAgICAgIGNhc2UgJ0EnOiAvKiBVcCAqLworICAgICAgICAgICAgICAgIGxpbmVub2lzZUVkaXRIaXN0b3J5TmV4dChzZXNzaW9uLCBMSU5FTk9JU0VfSElTVE9SWV9QUkVWKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ0InOiAvKiBEb3duICovCisgICAgICAgICAgICAgICAgbGluZW5vaXNlRWRpdEhpc3RvcnlOZXh0KHNlc3Npb24sIExJTkVOT0lTRV9ISVNUT1JZX05FWFQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnQyc6IC8qIFJpZ2h0ICovCisgICAgICAgICAgICAgICAgbGluZW5vaXNlRWRpdE1vdmVSaWdodChzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ0QnOiAvKiBMZWZ0ICovCisgICAgICAgICAgICAgICAgbGluZW5vaXNlRWRpdE1vdmVMZWZ0KHNlc3Npb24pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnSCc6IC8qIEhvbWUgKi8KKyAgICAgICAgICAgICAgICBsaW5lbm9pc2VFZGl0TW92ZUhvbWUoc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdGJzogLyogRW5kKi8KKyAgICAgICAgICAgICAgICBsaW5lbm9pc2VFZGl0TW92ZUVuZChzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBFU0MgTyBzZXF1ZW5jZXMuICovCisgICAgZWxzZSBpZiAoc2VxWzBdID09ICdPJykgeworICAgICAgICBzd2l0Y2goc2VxWzFdKSB7CisgICAgICAgIGNhc2UgJ0gnOiAvKiBIb21lICovCisgICAgICAgICAgICBsaW5lbm9pc2VFZGl0TW92ZUhvbWUoc2Vzc2lvbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnRic6IC8qIEVuZCovCisgICAgICAgICAgICBsaW5lbm9pc2VFZGl0TW92ZUVuZChzZXNzaW9uKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgdGhlIGNvcmUgb2YgdGhlIGxpbmUgZWRpdGluZyBjYXBhYmlsaXR5IG9mIGxpbmVub2lzZS4KKyAqIEl0IGV4cGVjdHMgJ2ZkJyB0byBiZSBhbHJlYWR5IGluICJyYXcgbW9kZSIgc28gdGhhdCBldmVyeSBrZXkgcHJlc3NlZAorICogd2lsbCBiZSByZXR1cm5lZCBBU0FQIHRvIHJlYWQoKS4KKyAqCisgKiBUaGUgcmVzdWx0aW5nIHN0cmluZyBpcyBwdXQgaW50byAnYnVmJyB3aGVuIHRoZSB1c2VyIHR5cGUgZW50ZXIsIG9yCisgKiB3aGVuIGN0cmwrZCBpcyB0eXBlZC4KKyAqCisgKiBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBjdXJyZW50IGJ1ZmZlci4gKi8KK3N0YXRpYyBpbnQgbGluZW5vaXNlRWRpdChsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uLCBjaGFyICpidWYsIHNpemVfdCBidWZsZW4sIGNvbnN0IGNoYXIgKnByb21wdCkKK3sKKyAgICBzdHJ1Y3QgbGluZW5vaXNlU3RhdGUgKmwgPSAmc2Vzc2lvbi0+c3RhdGU7CisgICAgaW50IG5yZWFkID0gMDsKKworICAgIC8qIFBvcHVsYXRlIHRoZSBsaW5lbm9pc2Ugc3RhdGUgdGhhdCB3ZSBwYXNzIHRvIGZ1bmN0aW9ucyBpbXBsZW1lbnRpbmcKKyAgICAgKiBzcGVjaWZpYyBlZGl0aW5nIGZ1bmN0aW9uYWxpdGllcy4gKi8KKyAgICBsLT5idWYgPSBidWY7CisgICAgbC0+YnVmbGVuID0gYnVmbGVuOworICAgIGwtPnByb21wdCA9IHByb21wdDsKKyAgICBsLT5wbGVuID0gc3RybGVuKHByb21wdCk7CisgICAgbC0+b2xkcG9zID0gbC0+cG9zID0gMDsKKyAgICBsLT5sZW4gPSAwOworICAgIGlmICghbC0+Y29scykKKyAgICAgICAgbC0+Y29scyA9IDgwOworICAgIGdldENvbHVtbnNSZXF1ZXN0KHNlc3Npb24pOworICAgIGwtPm1heHJvd3MgPSAwOworICAgIGwtPmhpc3RvcnlfaW5kZXggPSAwOworCisgICAgLyogQnVmZmVyIHN0YXJ0cyBlbXB0eS4gKi8KKyAgICBsLT5idWZbMF0gPSAnXDAnOworICAgIGwtPmJ1Zmxlbi0tOyAvKiBNYWtlIHN1cmUgdGhlcmUgaXMgYWx3YXlzIHNwYWNlIGZvciB0aGUgbnVsdGVybSAqLworCisgICAgLyogVGhlIGxhdGVzdCBoaXN0b3J5IGVudHJ5IGlzIGFsd2F5cyBvdXIgY3VycmVudCBidWZmZXIsIHRoYXQKKyAgICAgKiBpbml0aWFsbHkgaXMganVzdCBhbiBlbXB0eSBzdHJpbmcuICovCisgICAgbGluZW5vaXNlSGlzdG9yeUFkZChzZXNzaW9uLCAiIik7CisgICAgaWYgKGwtPnBsZW4gJiYgc2Vzc2lvbi0+aW8ud3JpdGUoc2Vzc2lvbi0+aW8uZmRfb3V0LCBwcm9tcHQsIGwtPnBsZW4pID09IC0xKSByZXR1cm4gLTE7CisgICAgd2hpbGUoMSkgeworICAgICAgICBjaGFyIGM7CisKKyAgICAgICAgbnJlYWQgPSBsaW5lbm9pc2VSZWFkQ2hhcihzZXNzaW9uLCAmYyk7CisgICAgICAgIGlmIChucmVhZCA8PSAwKSBnb3RvIGVkaXRfb3V0OworCisgICAgICAgIGxuZGVidWcoImM9JTAyeCglYylcbiIsIGMsIGMpOworICAgICAgICAvKiBPbmx5IGF1dG9jb21wbGV0ZSB3aGVuIHRoZSBjYWxsYmFjayBpcyBzZXQuIEl0IHJldHVybnMgPCAwIHdoZW4KKyAgICAgICAgICogdGhlcmUgd2FzIGFuIGVycm9yIHJlYWRpbmcgZnJvbSBmZC4gT3RoZXJ3aXNlIGl0IHdpbGwgcmV0dXJuIHRoZQorICAgICAgICAgKiBjaGFyYWN0ZXIgdGhhdCBzaG91bGQgYmUgaGFuZGxlZCBuZXh0LiAqLworICAgICAgICBpZiAoYyA9PSBLRVlfVEFCICYmIHNlc3Npb24tPmNvbXBsZXRpb25DYWxsYmFjayAhPSBOVUxMKSB7CisgICAgICAgICAgICBjb21wbGV0ZUxpbmUoc2Vzc2lvbik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaChjKSB7CisgICAgICAgIGNhc2UgS0VZX0NSOiAgICAvKiBlbnRlciAqLworICAgICAgICBjYXNlIEtFWV9MRjogICAgLyogZW50ZXIgKi8KKyAgICAgICAgICAgIHNlc3Npb24tPmhpc3RvcnlfbGVuLS07CisgICAgICAgICAgICBiY21vc19mcmVlKHNlc3Npb24tPmhpc3Rvcnlbc2Vzc2lvbi0+aGlzdG9yeV9sZW5dKTsKKyAgICAgICAgICAgIGdvdG8gZWRpdF9vdXQ7CisgICAgICAgIGNhc2UgQ1RSTF9DOiAgICAgLyogY3RybC1jICovCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGNhc2UgQkFDS1NQQUNFOiAgIC8qIGJhY2tzcGFjZSAqLworICAgICAgICBjYXNlIDg6ICAgICAvKiBjdHJsLWggKi8KKyAgICAgICAgICAgIGxpbmVub2lzZUVkaXRCYWNrc3BhY2Uoc2Vzc2lvbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDVFJMX0Q6ICAgICAvKiBjdHJsLWQsIHJlbW92ZSBjaGFyIGF0IHJpZ2h0IG9mIGN1cnNvciwgb3Igb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgaXMgZW1wdHksIGFjdCBhcyBlbmQtb2YtZmlsZS4gKi8KKyAgICAgICAgICAgIGlmIChsLT5sZW4gPiAwKSB7CisgICAgICAgICAgICAgICAgbGluZW5vaXNlRWRpdERlbGV0ZShzZXNzaW9uKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi0+aGlzdG9yeV9sZW4tLTsKKyAgICAgICAgICAgICAgICBiY21vc19mcmVlKHNlc3Npb24tPmhpc3Rvcnlbc2Vzc2lvbi0+aGlzdG9yeV9sZW5dKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDVFJMX1Q6ICAgIC8qIGN0cmwtdCwgc3dhcHMgY3VycmVudCBjaGFyYWN0ZXIgd2l0aCBwcmV2aW91cy4gKi8KKyAgICAgICAgICAgIGlmIChsLT5wb3MgPiAwICYmIGwtPnBvcyA8IGwtPmxlbikgeworICAgICAgICAgICAgICAgIGludCBhdXggPSBidWZbbC0+cG9zLTFdOworICAgICAgICAgICAgICAgIGJ1ZltsLT5wb3MtMV0gPSBidWZbbC0+cG9zXTsKKyAgICAgICAgICAgICAgICBidWZbbC0+cG9zXSA9IGF1eDsKKyAgICAgICAgICAgICAgICBpZiAobC0+cG9zICE9IGwtPmxlbi0xKSBsLT5wb3MrKzsKKyAgICAgICAgICAgICAgICByZWZyZXNoTGluZShzZXNzaW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENUUkxfQjogICAgIC8qIGN0cmwtYiAqLworICAgICAgICAgICAgbGluZW5vaXNlRWRpdE1vdmVMZWZ0KHNlc3Npb24pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1RSTF9GOiAgICAgLyogY3RybC1mICovCisgICAgICAgICAgICBsaW5lbm9pc2VFZGl0TW92ZVJpZ2h0KHNlc3Npb24pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1RSTF9QOiAgICAvKiBjdHJsLXAgKi8KKyAgICAgICAgICAgIGxpbmVub2lzZUVkaXRIaXN0b3J5TmV4dChzZXNzaW9uLCBMSU5FTk9JU0VfSElTVE9SWV9QUkVWKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENUUkxfTjogICAgLyogY3RybC1uICovCisgICAgICAgICAgICBsaW5lbm9pc2VFZGl0SGlzdG9yeU5leHQoc2Vzc2lvbiwgTElORU5PSVNFX0hJU1RPUllfTkVYVCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFU0M6ICAgIC8qIGVzY2FwZSBzZXF1ZW5jZSAqLworICAgICAgICAgICAgbGluZW5vaXNlSGFuZGxlRXNjU2VxdWVuY2Uoc2Vzc2lvbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmIChsaW5lbm9pc2VFZGl0SW5zZXJ0KHNlc3Npb24sYykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG5kZWJ1ZygiZWRpdEluc2VydCBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDVFJMX1U6IC8qIEN0cmwrdSwgZGVsZXRlIHRoZSB3aG9sZSBsaW5lLiAqLworICAgICAgICAgICAgYnVmWzBdID0gJ1wwJzsKKyAgICAgICAgICAgIGwtPnBvcyA9IGwtPmxlbiA9IDA7CisgICAgICAgICAgICByZWZyZXNoTGluZShzZXNzaW9uKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENUUkxfSzogLyogQ3RybCtrLCBkZWxldGUgZnJvbSBjdXJyZW50IHRvIGVuZCBvZiBsaW5lLiAqLworICAgICAgICAgICAgYnVmW2wtPnBvc10gPSAnXDAnOworICAgICAgICAgICAgbC0+bGVuID0gbC0+cG9zOworICAgICAgICAgICAgcmVmcmVzaExpbmUoc2Vzc2lvbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDVFJMX0E6IC8qIEN0cmwrYSwgZ28gdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lICovCisgICAgICAgICAgICBsaW5lbm9pc2VFZGl0TW92ZUhvbWUoc2Vzc2lvbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDVFJMX0U6IC8qIGN0cmwrZSwgZ28gdG8gdGhlIGVuZCBvZiB0aGUgbGluZSAqLworICAgICAgICAgICAgbGluZW5vaXNlRWRpdE1vdmVFbmQoc2Vzc2lvbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDVFJMX0w6IC8qIGN0cmwrbCwgY2xlYXIgc2NyZWVuICovCisgICAgICAgICAgICBsaW5lbm9pc2VDbGVhclNjcmVlbihzZXNzaW9uKTsKKyAgICAgICAgICAgIHJlZnJlc2hMaW5lKHNlc3Npb24pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1RSTF9XOiAvKiBjdHJsK3csIGRlbGV0ZSBwcmV2aW91cyB3b3JkICovCisgICAgICAgICAgICBsaW5lbm9pc2VFZGl0RGVsZXRlUHJldldvcmQoc2Vzc2lvbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK2VkaXRfb3V0OgorICAgIGxuZGVidWcoIiAtIG91dC4gbGVuPSVkIGJ1Zj08JXM+XG4iLCBsLT5sZW4sIGJ1Zik7CisgICAgcmV0dXJuIChucmVhZCA+PSAwKSA/IGwtPmxlbiA6IC0xOworfQorCisvKiBHZXQgd2l0aG91dCBlZGl0aW5nICovCitzdGF0aWMgaW50IGxpbmVub2lzZU5vZWRpdChsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uLCBjaGFyICpidWYsIHNpemVfdCBidWZsZW4pIHsKKyAgICBjaGFyIGM7CisgICAgaW50IGxlbiA9IDA7CisgICAgaW50IHN3aXRjaF90b19zbWFydF9tb2RlID0gMDsKKyAgICBpbnQgbnJlYWQgPSAwOworI2lmbmRlZiBMSU5FTk9JU0VfRElTQUJMRV9URVJNSU9TCisgICAgaW50IGF0dHlfdGVybSA9IGlzYXR0eShTVERJTl9GSUxFTk8pOworI2Vsc2UKKyAgICBpbnQgYXR0eV90ZXJtID0gMTsKKyNlbmRpZgorCisgICAgd2hpbGUgKChucmVhZCA9IGxpbmVub2lzZVJlYWRDaGFyKHNlc3Npb24sICZjKSkgIT0gLTEgJiYgbGVuIDwgYnVmbGVuIC0gMSkKKyAgICB7CisgICAgICAgIGlmIChjID09ICdcbicgfHwgYyA9PSAnXHInKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGJ1ZltsZW4rK10gPSBjOworICAgICAgICAvKiBJZiBidWZmZXIgY29udGFpbnMgRVNDIHNlcXVlbmNlIC0gcGVyaGFwcyB0aGUgdGVybWluYWwgaXMgbm90IGR1bWIgYWZ0ZXIgYWxsICovCisgICAgICAgIGlmIChjID09IEVTQyAmJiAhc2Vzc2lvbi0+aW8uZHVtYl90ZXJtaW5hbCAmJiAhc2Vzc2lvbi0+Zm9yY2VkX2R1bWIgJiYgYXR0eV90ZXJtKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2hfdG9fc21hcnRfbW9kZSA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvKiBFY2hvIGhlcmUgaXMgdGVybWluYWwgaXMgaW4gcmF3IG1vZGUgKi8KKyAgICAgICAgaWYgKHNlc3Npb24tPnJhd21vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNlc3Npb24tPmlvLndyaXRlKHNlc3Npb24tPmlvLmZkX291dCwgJmMsIDEpOworICAgICAgICB9CisgICAgfQorICAgIGJ1ZltsZW5dID0gMDsKKyAgICBpZiAoc3dpdGNoX3RvX3NtYXJ0X21vZGUpCisgICAgeworICAgICAgICAvKiBDb3B5IGJ1ZmZlciBpbnRvIHJlYWQtYWhlYWQgYnVmZmVyIGFuZCByZS1wYXJzZSAqLworICAgICAgICBsbmRlYnVnKCJzd2l0Y2hpbmcgdG8gc21hcnQgbW9kZVxuIik7CisgICAgICAgIC8qIElmIHRoZXJlIGFscmVhZHkgaXMgcmVhZF9haGVhZCBidWYgLSByZWFsbG9jIGl0ICovCisgICAgICAgIGlmIChzZXNzaW9uLT5yZWFkX2FoZWFkX2J1ZikKKyAgICAgICAgeworICAgICAgICAgICAgY2hhciAqbmV3X2J1ZjsKKyAgICAgICAgICAgIG5ld19idWYgPSBiY21vc19hbGxvYyhzdHJsZW4oc2Vzc2lvbi0+cmVhZF9haGVhZF9idWYpIC0gc2Vzc2lvbi0+cmVhZF9haGVhZF9wb3MgKyBsZW4gKyAxKTsKKyAgICAgICAgICAgIGlmICghbmV3X2J1ZikKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBtZW1jcHkobmV3X2J1ZiwgYnVmLCBsZW4pOworICAgICAgICAgICAgc3RyY3B5KCZuZXdfYnVmW2xlbl0sICZzZXNzaW9uLT5yZWFkX2FoZWFkX2J1ZltzZXNzaW9uLT5yZWFkX2FoZWFkX3Bvc10pOworICAgICAgICAgICAgYmNtb3NfZnJlZShzZXNzaW9uLT5yZWFkX2FoZWFkX2J1Zik7CisgICAgICAgICAgICBzZXNzaW9uLT5yZWFkX2FoZWFkX2J1ZiA9IG5ld19idWY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzZXNzaW9uLT5yZWFkX2FoZWFkX2J1ZiA9IGJjbW9zX2FsbG9jKGxlbiArIDEpOworICAgICAgICAgICAgaWYgKCFzZXNzaW9uLT5yZWFkX2FoZWFkX2J1ZikKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBzdHJjcHkoc2Vzc2lvbi0+cmVhZF9haGVhZF9idWYsIGJ1Zik7CisgICAgICAgIH0KKyAgICAgICAgc2Vzc2lvbi0+cmVhZF9haGVhZF9wb3MgPSAwOworICAgICAgICBzZXNzaW9uLT5kdW1iX3Rlcm1pbmFsID0gMDsKKyAgICAgICAgc2Vzc2lvbi0+bmNvbHJlcXMgPSAwOworICAgICAgICAqYnVmID0gMDsKKyAgICAgICAgbnJlYWQgPSBsaW5lbm9pc2VFZGl0KHNlc3Npb24sIGJ1ZiwgYnVmbGVuLCAiIik7CisgICAgfQorICAgIGxuZGVidWcoIiAtIG91dC4gbGVuPSVkIGJ1Zj08JXM+IG5yZWFkPSVkXG4iLCAoaW50KXN0cmxlbihidWYpLCBidWYsIG5yZWFkKTsKKyAgICByZXR1cm4gKG5yZWFkID49MCkgPyBzdHJsZW4oYnVmKSA6IC0xOworfQorCisKKy8qIFRoaXMgZnVuY3Rpb24gY2FsbHMgdGhlIGxpbmUgZWRpdGluZyBmdW5jdGlvbiBsaW5lbm9pc2VFZGl0KCkgdXNpbmcKKyAqIHRoZSBTVERJTiBmaWxlIGRlc2NyaXB0b3Igc2V0IGluIHJhdyBtb2RlLiAqLworc3RhdGljIGludCBsaW5lbm9pc2VSYXcobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbiwgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuLCBjb25zdCBjaGFyICpwcm9tcHQpIHsKKyAgICBpbnQgcmMgPSAwOworCisgICAgbG5kZWJ1ZygiXG4iKTsKKyNpZm5kZWYgTElORU5PSVNFX0RJU0FCTEVfVEVSTUlPUworICAgIGlmICghaXNhdHR5KFNURElOX0ZJTEVOTykpIHsKKyAgICAgICAgLyogTm90IGEgdHR5OiByZWFkIGZyb20gZmlsZSAvIHBpcGUuICovCisJcmMgPSBsaW5lbm9pc2VOb2VkaXQoc2Vzc2lvbiwgYnVmLCBidWZsZW4pOworCWlmIChyYyA+PSAwKQorCSAgICBzZXNzaW9uLT5pby53cml0ZShzZXNzaW9uLT5pby5mZF9vdXQsICJcbiIsIDEpOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICB7CisgICAgICAgIC8qIEludGVyYWN0aXZlIGVkaXRpbmcuICovCisgICAgICAgIGlmIChlbmFibGVSYXdNb2RlKHNlc3Npb24pID09IC0xKSByZXR1cm4gLTE7CisKKyAgICAgICAgaWYgKCFzZXNzaW9uLT5kdW1iX3Rlcm1pbmFsICYmIHNlc3Npb24tPm5jb2xyZXFzID4gMSkKKyAgICAgICAgeworICAgICAgICAgICAgc2Vzc2lvbi0+ZHVtYl90ZXJtaW5hbCA9IDE7CisgICAgICAgICAgICBsbmRlYnVnKCJkdW1iX3Rlcm1pbmFsPSVkXG4iLCBzZXNzaW9uLT5kdW1iX3Rlcm1pbmFsKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2Vzc2lvbi0+ZHVtYl90ZXJtaW5hbCkgeworICAgICAgICAgICAgc2Vzc2lvbi0+aW8ud3JpdGUoc2Vzc2lvbi0+aW8uZmRfb3V0LCBwcm9tcHQsIHN0cmxlbihwcm9tcHQpKTsKKyAgICAgICAgICAgIHJjID0gbGluZW5vaXNlTm9lZGl0KHNlc3Npb24sIGJ1ZiwgYnVmbGVuKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJjID0gbGluZW5vaXNlRWRpdChzZXNzaW9uLCBidWYsIGJ1ZmxlbiwgcHJvbXB0KTsKKyAgICAgICAgfQorCisgICAgICAgIGRpc2FibGVSYXdNb2RlKHNlc3Npb24pOworICAgICAgICBpZiAocmMgPj0gMCkKKyAgICAgICAgICAgIHNlc3Npb24tPmlvLndyaXRlKHNlc3Npb24tPmlvLmZkX291dCwgIlxuIiwgMSk7CisgICAgfQorICAgIGxuZGVidWcoIiAtIG91dC4gbGVuPSVkIGJ1Zj08JXM+IHJjPSVkXG4iLCAoaW50KXN0cmxlbihidWYpLCBidWYsIHJjKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qIFRoZSBoaWdoIGxldmVsIGZ1bmN0aW9uIHRoYXQgaXMgdGhlIG1haW4gQVBJIG9mIHRoZSBsaW5lbm9pc2UgbGlicmFyeS4KKyAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIHRoZSB0ZXJtaW5hbCBoYXMgYmFzaWMgY2FwYWJpbGl0aWVzLCBqdXN0IGNoZWNraW5nCisgKiBmb3IgYSBibGFja2xpc3Qgb2Ygc3R1cGlkIHRlcm1pbmFscywgYW5kIGxhdGVyIGVpdGhlciBjYWxscyB0aGUgbGluZQorICogZWRpdGluZyBmdW5jdGlvbiBvciB1c2VzIGR1bW15IGZnZXRzKCkgc28gdGhhdCB5b3Ugd2lsbCBiZSBhYmxlIHRvIHR5cGUKKyAqIHNvbWV0aGluZyBldmVuIGluIHRoZSBtb3N0IGRlc3BlcmF0ZSBvZiB0aGUgY29uZGl0aW9ucy4gKi8KK2NoYXIgKmxpbmVub2lzZShsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uLCBjb25zdCBjaGFyICpwcm9tcHQsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpIHsKKworICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgZXJybm8gPSBFSU5WQUw7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qIENvbmZpZ3VyZSB0ZXJtaW5hbCBhcyBkdW1iIGlmIGl0IGRvZXNuJ3Qgc3VwcG9ydCBiYXNpYyBFU0Mgc2VxdWVuY2VzICovCisgICAgaWYgKHNlc3Npb24tPmlvLmR1bWJfdGVybWluYWwgfHwgc2Vzc2lvbi0+Zm9yY2VkX2R1bWIpIHsKKyAgICAgICAgaW50IHJjOworCisgICAgICAgIHNlc3Npb24tPmlvLndyaXRlKHNlc3Npb24tPmlvLmZkX291dCwgcHJvbXB0LCBzdHJsZW4ocHJvbXB0KSk7CisgICAgICAgIHJjID0gbGluZW5vaXNlTm9lZGl0KHNlc3Npb24sIGJ1Ziwgc2l6ZSk7CisgICAgICAgIHNlc3Npb24tPmlvLndyaXRlKHNlc3Npb24tPmlvLmZkX291dCwgIlxuIiwgMSk7CisgICAgICAgIGxuZGVidWcoIiAtIG91dC4gbGVuPSVkIGJ1Zj08JXM+XG4iLCAoaW50KXN0cmxlbihidWYpLCBidWYpOworICAgICAgICByZXR1cm4gKHJjID09IC0xKSA/IE5VTEwgOiBidWY7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGxpbmVub2lzZVJhdyhzZXNzaW9uLCBidWYsIHNpemUsIHByb21wdCkgPT0gLTEpIHJldHVybiBOVUxMOworICAgICAgICBsbmRlYnVnKCIgLSBvdXQuIGxlbj0lZCBidWY9PCVzPlxuIiwgKGludClzdHJsZW4oYnVmKSwgYnVmKTsKKyAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICB9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEhpc3RvcnkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qIEZyZWUgdGhlIGhpc3RvcnksIGJ1dCBkb2VzIG5vdCByZXNldCBpdC4gT25seSB1c2VkIHdoZW4gd2UgaGF2ZSB0bworICogZXhpdCgpIHRvIGF2b2lkIG1lbW9yeSBsZWFrcyBhcmUgcmVwb3J0ZWQgYnkgdmFsZ3JpbmQgJiBjby4gKi8KK3N0YXRpYyB2b2lkIGZyZWVIaXN0b3J5KGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24pIHsKKyAgICBpZiAoc2Vzc2lvbi0+aGlzdG9yeSkgeworICAgICAgICBpbnQgajsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgc2Vzc2lvbi0+aGlzdG9yeV9sZW47IGorKykKKyAgICAgICAgICAgIGJjbW9zX2ZyZWUoc2Vzc2lvbi0+aGlzdG9yeVtqXSk7CisgICAgICAgIGJjbW9zX2ZyZWUoc2Vzc2lvbi0+aGlzdG9yeSk7CisgICAgICAgIHNlc3Npb24tPmhpc3RvcnkgPSBOVUxMOworICAgIH0KK30KKworLyogVGhpcyBpcyB0aGUgQVBJIGNhbGwgdG8gYWRkIGEgbmV3IGVudHJ5IGluIHRoZSBsaW5lbm9pc2UgaGlzdG9yeS4KKyAqIEl0IHVzZXMgYSBmaXhlZCBhcnJheSBvZiBjaGFyIHBvaW50ZXJzIHRoYXQgYXJlIHNoaWZ0ZWQgKG1lbW1vdmVkKQorICogd2hlbiB0aGUgaGlzdG9yeSBtYXggbGVuZ3RoIGlzIHJlYWNoZWQgaW4gb3JkZXIgdG8gcmVtb3ZlIHRoZSBvbGRlcgorICogZW50cnkgYW5kIG1ha2Ugcm9vbSBmb3IgdGhlIG5ldyBvbmUsIHNvIGl0IGlzIG5vdCBleGFjdGx5IHN1aXRhYmxlIGZvciBodWdlCisgKiBoaXN0b3JpZXMsIGJ1dCB3aWxsIHdvcmsgd2VsbCBmb3IgYSBmZXcgaHVuZHJlZCBvZiBlbnRyaWVzLgorICoKKyAqIFVzaW5nIGEgY2lyY3VsYXIgYnVmZmVyIGlzIHNtYXJ0ZXIsIGJ1dCBhIGJpdCBtb3JlIGNvbXBsZXggdG8gaGFuZGxlLiAqLworaW50IGxpbmVub2lzZUhpc3RvcnlBZGQobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqbGluZSkgeworICAgIGNoYXIgKmxpbmVjb3B5OworCisgICAgaWYgKHNlc3Npb24tPmhpc3RvcnlfbWF4X2xlbiA9PSAwKSByZXR1cm4gMDsKKworICAgIC8qIEluaXRpYWxpemF0aW9uIG9uIGZpcnN0IGNhbGwuICovCisgICAgaWYgKHNlc3Npb24tPmhpc3RvcnkgPT0gTlVMTCkgeworICAgICAgICBzZXNzaW9uLT5oaXN0b3J5ID0gYmNtb3NfYWxsb2Moc2l6ZW9mKGNoYXIqKSpzZXNzaW9uLT5oaXN0b3J5X21heF9sZW4pOworICAgICAgICBpZiAoc2Vzc2lvbi0+aGlzdG9yeSA9PSBOVUxMKSByZXR1cm4gMDsKKyAgICAgICAgbWVtc2V0KHNlc3Npb24tPmhpc3RvcnksMCwoc2l6ZW9mKGNoYXIqKSpzZXNzaW9uLT5oaXN0b3J5X21heF9sZW4pKTsKKyAgICB9CisKKyAgICAvKiBEb24ndCBhZGQgZHVwbGljYXRlZCBsaW5lcy4gKi8KKyAgICBpZiAoc2Vzc2lvbi0+aGlzdG9yeV9sZW4gJiYgIXN0cmNtcChzZXNzaW9uLT5oaXN0b3J5W3Nlc3Npb24tPmhpc3RvcnlfbGVuLTFdLCBsaW5lKSkgcmV0dXJuIDA7CisKKyAgICAvKiBBZGQgYW4gaGVhcCBhbGxvY2F0ZWQgY29weSBvZiB0aGUgbGluZSBpbiB0aGUgaGlzdG9yeS4KKyAgICAgKiBJZiB3ZSByZWFjaGVkIHRoZSBtYXggbGVuZ3RoLCByZW1vdmUgdGhlIG9sZGVyIGxpbmUuICovCisgICAgbGluZWNvcHkgPSBsaW5lbm9pc2Vfc3RyZHVwKGxpbmUpOworICAgIGlmICghbGluZWNvcHkpIHJldHVybiAwOworICAgIGlmIChzZXNzaW9uLT5oaXN0b3J5X2xlbiA9PSBzZXNzaW9uLT5oaXN0b3J5X21heF9sZW4pIHsKKyAgICAgICAgYmNtb3NfZnJlZShzZXNzaW9uLT5oaXN0b3J5WzBdKTsKKyAgICAgICAgbWVtbW92ZShzZXNzaW9uLT5oaXN0b3J5LHNlc3Npb24tPmhpc3RvcnkrMSxzaXplb2YoY2hhciopKihzZXNzaW9uLT5oaXN0b3J5X21heF9sZW4tMSkpOworICAgICAgICBzZXNzaW9uLT5oaXN0b3J5X2xlbi0tOworICAgIH0KKyAgICBzZXNzaW9uLT5oaXN0b3J5W3Nlc3Npb24tPmhpc3RvcnlfbGVuXSA9IGxpbmVjb3B5OworICAgIHNlc3Npb24tPmhpc3RvcnlfbGVuKys7CisgICAgcmV0dXJuIDE7Cit9CisKKy8qIFNldCB0aGUgbWF4aW11bSBsZW5ndGggZm9yIHRoZSBoaXN0b3J5LiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgZXZlbgorICogaWYgdGhlcmUgaXMgYWxyZWFkeSBzb21lIGhpc3RvcnksIHRoZSBmdW5jdGlvbiB3aWxsIG1ha2Ugc3VyZSB0byByZXRhaW4KKyAqIGp1c3QgdGhlIGxhdGVzdCAnbGVuJyBlbGVtZW50cyBpZiB0aGUgbmV3IGhpc3RvcnkgbGVuZ3RoIHZhbHVlIGlzIHNtYWxsZXIKKyAqIHRoYW4gdGhlIGFtb3VudCBvZiBpdGVtcyBhbHJlYWR5IGluc2lkZSB0aGUgaGlzdG9yeS4gKi8KK2ludCBsaW5lbm9pc2VIaXN0b3J5U2V0TWF4TGVuKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24sIGludCBsZW4pIHsKKyAgICBjaGFyICoqbmV3OworCisgICAgaWYgKGxlbiA8IDEpIHJldHVybiAwOworICAgIGlmIChzZXNzaW9uLT5oaXN0b3J5KSB7CisgICAgICAgIGludCB0b2NvcHkgPSBzZXNzaW9uLT5oaXN0b3J5X2xlbjsKKworICAgICAgICBuZXcgPSBiY21vc19hbGxvYyhzaXplb2YoY2hhciopKmxlbik7CisgICAgICAgIGlmIChuZXcgPT0gTlVMTCkgcmV0dXJuIDA7CisKKyAgICAgICAgLyogSWYgd2UgY2FuJ3QgY29weSBldmVyeXRoaW5nLCBmcmVlIHRoZSBlbGVtZW50cyB3ZSdsbCBub3QgdXNlLiAqLworICAgICAgICBpZiAobGVuIDwgdG9jb3B5KSB7CisgICAgICAgICAgICBpbnQgajsKKworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHRvY29weS1sZW47IGorKykgYmNtb3NfZnJlZShzZXNzaW9uLT5oaXN0b3J5W2pdKTsKKyAgICAgICAgICAgIHRvY29weSA9IGxlbjsKKyAgICAgICAgfQorICAgICAgICBtZW1zZXQobmV3LDAsc2l6ZW9mKGNoYXIqKSpsZW4pOworICAgICAgICBtZW1jcHkobmV3LHNlc3Npb24tPmhpc3RvcnkrKHNlc3Npb24tPmhpc3RvcnlfbGVuLXRvY29weSksIHNpemVvZihjaGFyKikqdG9jb3B5KTsKKyAgICAgICAgYmNtb3NfZnJlZShzZXNzaW9uLT5oaXN0b3J5KTsKKyAgICAgICAgc2Vzc2lvbi0+aGlzdG9yeSA9IG5ldzsKKyAgICB9CisgICAgc2Vzc2lvbi0+aGlzdG9yeV9tYXhfbGVuID0gbGVuOworICAgIGlmIChzZXNzaW9uLT5oaXN0b3J5X2xlbiA+IHNlc3Npb24tPmhpc3RvcnlfbWF4X2xlbikKKyAgICAgICAgc2Vzc2lvbi0+aGlzdG9yeV9sZW4gPSBzZXNzaW9uLT5oaXN0b3J5X21heF9sZW47CisgICAgcmV0dXJuIDE7Cit9CisKK2ludCBsaW5lbm9pc2VTZXRSYXcobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbiwgaW50IHJhdykKK3sKKyAgICBpbnQgcmMgPSAwOworICAgIGlmIChyYXcpCisgICAgICAgIHJjID0gZW5hYmxlUmF3TW9kZShzZXNzaW9uKTsKKyAgICBlbHNlCisgICAgICAgIGRpc2FibGVSYXdNb2RlKHNlc3Npb24pOworICAgIHJldHVybiByYzsKK30KKworaW50IGxpbmVub2lzZUdldFJhdyhsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uKQoreworICAgIHJldHVybiBzZXNzaW9uLT5yYXdtb2RlOworfQorCisjaWZuZGVmIExJTkVOT0lTRV9ESVNBQkxFX0hJU1RfU0FWRQorCisvKiBTYXZlIHRoZSBoaXN0b3J5IGluIHRoZSBzcGVjaWZpZWQgZmlsZS4gT24gc3VjY2VzcyAwIGlzIHJldHVybmVkCisgKiBvdGhlcndpc2UgLTEgaXMgcmV0dXJuZWQuICovCitpbnQgbGluZW5vaXNlSGlzdG9yeVNhdmUobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqZmlsZW5hbWUpIHsKKyAgICBGSUxFICpmcCA9IGZvcGVuKGZpbGVuYW1lLCJ3Iik7CisgICAgaW50IGo7CisKKyAgICBpZiAoZnAgPT0gTlVMTCkgcmV0dXJuIC0xOworICAgIGZvciAoaiA9IDA7IGogPCBzZXNzaW9uLT5oaXN0b3J5X2xlbjsgaisrKQorICAgICAgICBmcHJpbnRmKGZwLCIlc1xuIixzZXNzaW9uLT5oaXN0b3J5W2pdKTsKKyAgICBmY2xvc2UoZnApOworICAgIHJldHVybiAwOworfQorCisvKiBMb2FkIHRoZSBoaXN0b3J5IGZyb20gdGhlIHNwZWNpZmllZCBmaWxlLiBJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdAorICogemVybyBpcyByZXR1cm5lZCBhbmQgbm8gb3BlcmF0aW9uIGlzIHBlcmZvcm1lZC4KKyAqCisgKiBJZiB0aGUgZmlsZSBleGlzdHMgYW5kIHRoZSBvcGVyYXRpb24gc3VjY2VlZGVkIDAgaXMgcmV0dXJuZWQsIG90aGVyd2lzZQorICogb24gZXJyb3IgLTEgaXMgcmV0dXJuZWQuICovCitpbnQgbGluZW5vaXNlSGlzdG9yeUxvYWQobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqZmlsZW5hbWUpIHsKKyAgICBGSUxFICpmcCA9IGZvcGVuKGZpbGVuYW1lLCJyIik7CisgICAgY2hhciAqYnVmOworCisgICAgaWYgKGZwID09IE5VTEwpIHJldHVybiAtMTsKKyAgICBidWYgPSBiY21vc19hbGxvYyhMSU5FTk9JU0VfTUFYX0xJTkUpOworICAgIGlmICghYnVmKQorICAgIHsKKyAgICAgICAgZmNsb3NlKGZwKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHdoaWxlIChmZ2V0cyhidWYsTElORU5PSVNFX01BWF9MSU5FLGZwKSAhPSBOVUxMKSB7CisgICAgICAgIGNoYXIgKnA7CisKKyAgICAgICAgcCA9IHN0cmNocihidWYsJ1xyJyk7CisgICAgICAgIGlmICghcCkgcCA9IHN0cmNocihidWYsJ1xuJyk7CisgICAgICAgIGlmIChwKSAqcCA9ICdcMCc7CisgICAgICAgIGxpbmVub2lzZUhpc3RvcnlBZGQoc2Vzc2lvbiwgYnVmKTsKKyAgICB9CisgICAgZmNsb3NlKGZwKTsKKyAgICBiY21vc19mcmVlKGJ1Zik7CisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL2xpbmVub2lzZS9saW5lbm9pc2UuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9saW5lbm9pc2UvbGluZW5vaXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk4MDQ4YgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9saW5lbm9pc2UvbGluZW5vaXNlLmgKQEAgLTAsMCArMSw3OSBAQAorLyogbGluZW5vaXNlLmggLS0gZ3VlcnJpbGxhIGxpbmUgZWRpdGluZyBsaWJyYXJ5IGFnYWluc3QgdGhlIGlkZWEgdGhhdCBhCisgKiBsaW5lIGVkaXRpbmcgbGliIG5lZWRzIHRvIGJlIDIwLDAwMCBsaW5lcyBvZiBDIGNvZGUuCisgKgorICogU2VlIGxpbmVub2lzZS5jIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgU2FsdmF0b3JlIFNhbmZpbGlwcG8gPGFudGlyZXogYXQgZ21haWwgZG90IGNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAxMCwgUGlldGVyIE5vb3JkaHVpcyA8cGNub29yZGh1aXMgYXQgZ21haWwgZG90IGNvbT4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqIAorICogICogIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqICAqICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9fTElORU5PSVNFX0gKKyNkZWZpbmUgX19MSU5FTk9JU0VfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IGxpbmVub2lzZVNlc3Npb25JTworeworICAgIGxvbmcgZmRfaW47CisgICAgbG9uZyBmZF9vdXQ7CisgICAgaW50ICgqcmVhZF9jaGFyKShsb25nIGZkX2luLCBjaGFyICpjKTsKKyAgICBpbnQgKCp3cml0ZSkobG9uZyBmZF9vdXQsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbik7CisgICAgaW50IGR1bWJfdGVybWluYWw7IC8qIDE9ZHVtYiB0ZXJtaW5hbC4gZG8gbm90IHVzZSBlc2NhcGUgc2VxdWVuY2VzICovCit9IGxpbmVub2lzZVNlc3Npb25JTzsKKwordHlwZWRlZiBzdHJ1Y3QgbGluZW5vaXNlU2Vzc2lvbiBsaW5lbm9pc2VTZXNzaW9uOworCit0eXBlZGVmIGludCAobGluZW5vaXNlQ29tcGxldGlvbkNhbGxiYWNrKShsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uLCBjb25zdCBjaGFyICosIGludCBwb3MpOworaW50IGxpbmVub2lzZVNlc3Npb25PcGVuKGNvbnN0IGxpbmVub2lzZVNlc3Npb25JTyAqaW8sIHZvaWQgKnNlc3Npb25fZGF0YSwgbGluZW5vaXNlU2Vzc2lvbiAqKnNlc3Npb24pOwordm9pZCBsaW5lbm9pc2VTZXNzaW9uQ2xvc2UobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbik7Cit2b2lkICpsaW5lbm9pc2VTZXNzaW9uRGF0YShsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uKTsKK3ZvaWQgbGluZW5vaXNlU2V0Q29tcGxldGlvbkNhbGxiYWNrKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24sIGxpbmVub2lzZUNvbXBsZXRpb25DYWxsYmFjayAqKTsKK3ZvaWQgbGluZW5vaXNlU2V0QnVmZmVyKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24sIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IHBvcyk7CisKK2NoYXIgKmxpbmVub2lzZShsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uLCBjb25zdCBjaGFyICpwcm9tcHQsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpOworaW50IGxpbmVub2lzZUhpc3RvcnlBZGQobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqbGluZSk7CitpbnQgbGluZW5vaXNlSGlzdG9yeVNldE1heExlbihsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uLCBpbnQgbGVuKTsKK2ludCBsaW5lbm9pc2VIaXN0b3J5U2F2ZShsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uLCBjb25zdCBjaGFyICpmaWxlbmFtZSk7CitpbnQgbGluZW5vaXNlSGlzdG9yeUxvYWQobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqZmlsZW5hbWUpOwordm9pZCBsaW5lbm9pc2VDbGVhclNjcmVlbihsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uKTsKK3ZvaWQgbGluZW5vaXNlU2V0TXVsdGlMaW5lKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24sIGludCBtbCk7Cit2b2lkIGxpbmVub2lzZVNldER1bWJUZXJtaW5hbChsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uLCBpbnQgZHVtYik7CitpbnQgbGluZW5vaXNlR2V0TXVsdGlMaW5lKGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24pOworaW50IGxpbmVub2lzZUdldER1bWJUZXJtaW5hbChsaW5lbm9pc2VTZXNzaW9uICpzZXNzaW9uKTsKK2ludCBsaW5lbm9pc2VTZXRSYXcobGluZW5vaXNlU2Vzc2lvbiAqc2Vzc2lvbiwgaW50IHJhdyk7CitpbnQgbGluZW5vaXNlR2V0UmF3KGxpbmVub2lzZVNlc3Npb24gKnNlc3Npb24pOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19MSU5FTk9JU0VfSCAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3JlbW90ZV9jbGkvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvcmVtb3RlX2NsaS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTJmZTZlCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3JlbW90ZV9jbGkvTWFrZWZpbGUKQEAgLTAsMCArMSw5IEBACitpZmVxICgiJChPUykiLCAicG9zaXgiKQ0KK2lmZXEgKCIkKEVOQUJMRV9DTEkpIiwgInkiKQ0KKyAgICBNT0RfTkFNRSA9IGJjbV9yZW1vdGVfY2xpDQorICAgIE1PRF9UWVBFID0gbGliDQorICAgIE1PRF9ERVBTID0gY2xpIGFwaV9jbGkNCisgICAgc3JjcyA9IGJjbW9sdF9yZW1vdGVfY2xpLmMNCisgICAgVVNFX0xJTlQgPSB5ZXMNCitlbmRpZg0KK2VuZGlmDQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3JlbW90ZV9jbGkvYmNtb2x0X3JlbW90ZV9jbGkuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9yZW1vdGVfY2xpL2JjbW9sdF9yZW1vdGVfY2xpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNhOWQyZQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9yZW1vdGVfY2xpL2JjbW9sdF9yZW1vdGVfY2xpLmMKQEAgLTAsMCArMSw1NDMgQEAKKy8qDQorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkDQorDQorICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQ0KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQNCisNCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlDQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZA0KK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMg0KKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLA0KK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6DQorDQorICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQ0KKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZA0KKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXINCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50DQorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuDQorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcw0KKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zDQorICAgb2YgdGhlIHNvZnR3YXJlLg0KKw0KK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQ0KK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZA0KK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yDQord3JpdHRlbiBjb25zZW50Lg0KKw0KKzo+DQorICovDQorDQorI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPg0KKyNpbmNsdWRlIDxiY210cl9pbnRlcmZhY2UuaD4NCisjaW5jbHVkZSA8YmNtdHJfaGVhZGVyLmg+DQorI2luY2x1ZGUgPGJjbW9sdF9hcGkuaD4NCisjaW5jbHVkZSA8YmNtX2FwaV9jbGlfaGVscGVycy5oPg0KKyNpbmNsdWRlIDxiY210cl9kZWJ1Zy5oPg0KKyNpbmNsdWRlIDxiY21jbGlfc2Vzc2lvbi5oPg0KKyNpbmNsdWRlICJiY21vbHRfcmVtb3RlX2NsaS5oIg0KKyNpZmRlZiBFTkFCTEVfTE9HDQorI2luY2x1ZGUgImJjbV9kZXZfbG9nLmgiDQorI2VuZGlmDQorDQorI2RlZmluZSBSRU1PVEVfQ0xJX0JVRkZFUl9NQVggNjU2MzUgLyogTWF4IHJlYXNzZW1ibGVkIHBhY2tldCBwbHVzIGhlYWRlciAqLw0KKyNkZWZpbmUgUkVNT1RFX0NMSV9NRVNTQUdFX1FVRVVFX0RFUFRIIEJDTU9TX01TR19QT09MX0RFRkFVTFRfU0laRQ0KKw0KK3R5cGVkZWYgZW51bQ0KK3sNCisgICAgUkVNT1RFX0NMSV9PUENPREVfQ0xJX0NPTU1BTkQsDQorICAgIFJFTU9URV9DTElfT1BDT0RFX0lORElDQVRJT04sDQorICAgIFJFTU9URV9DTElfT1BDT0RFX1BST1hZX1JYDQorfSByZW1vdGVfY2xpX29wY29kZTsNCisNCisvKiBTdGF0aXN0aWNzICovDQordHlwZWRlZiBzdHJ1Y3QNCit7DQorICAgIHVuc2lnbmVkIGxvbmcgcnhfcmVxdWVzdHM7DQorICAgIHVuc2lnbmVkIGxvbmcgdHhfcmVzcG9uc2VzOw0KKyAgICB1bnNpZ25lZCBsb25nIGluZGljYXRpb25zOw0KKyAgICB1bnNpZ25lZCBsb25nIHByb3h5X3J4czsNCisgICAgdW5zaWduZWQgbG9uZyB1bnBhY2tfZXJyb3JzOw0KKyAgICB1bnNpZ25lZCBsb25nIHBhY2tfZXJyb3JzOw0KKyAgICB1bnNpZ25lZCBsb25nIGNvcnJlbGF0aW9uX2Vycm9yczsNCisgICAgdW5zaWduZWQgbG9uZyB0eF9zb2NrZXRfZXJyb3JzOw0KKyAgICB1bnNpZ25lZCBsb25nIHJ4X3NvY2tldF9lcnJvcnM7DQorICAgIHVuc2lnbmVkIGxvbmcgbWVzc2FnZV9lcnJvcnM7DQorfSByZW1vdGVfY2xpX3N0YXRzOw0KKw0KK3R5cGVkZWYgc3RydWN0DQorew0KKyAgICBiY21vc190YXNrIG91dHB1dF90YXNrOw0KKyAgICBiY21vc190YXNrIHNvY2tldF90YXNrOw0KKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gY2xpZW50Ow0KKyAgICB1aW50MTZfdCBwb3J0Ow0KKyAgICBpbnQgY2xpZW50X3NvY2tldDsNCisgICAgYmNtb3NfYm9vbCBpc19ydW5uaW5nOw0KKyAgICBkZXZfbG9nX2lkIGxvZ19pZDsNCisgICAgYmNtb3NfYm9vbCBvdXRwdXRfcGVuZGluZzsNCisgICAgdWludDhfdCBpbnB1dF9idWZmZXJbUkVNT1RFX0NMSV9CVUZGRVJfTUFYXTsNCisgICAgY2hhciAqaW5wdXRfc3RyOw0KKyAgICB1aW50OF90IG91dHB1dF9idWZmZXJbUkVNT1RFX0NMSV9CVUZGRVJfTUFYXTsNCisgICAgdWludDE2X3Qgb3V0cHV0X2N1cnJlbnRfY2hhcjsNCisgICAgYmNtb3NfbXV0ZXggb3V0cHV0X2xvY2s7DQorICAgIGludCBjdXJyZW50X2NvcnJfdGFnOw0KKyAgICBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbjsNCisgICAgcmVtb3RlX2NsaV9zdGF0cyBzdGF0czsNCit9IHJlbW90ZV9jbGlfY29udHJvbF9ibG9jazsNCisNCitzdGF0aWMgcmVtb3RlX2NsaV9jb250cm9sX2Jsb2NrIHJlbW90ZV9jbGlfZGF0YVtCQ01UUl9NQVhfT0xUU107DQorDQorc3RhdGljIGJjbW9zX2Vycm5vIHJlbW90ZV9jbGlfc3RhdHNfY21kKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpDQorew0KKyAgICBpbnQgZGV2aWNlID0gKGludClwYXJtWzBdLnZhbHVlLm51bWJlcjsNCisNCisgICAgaWYgKGRldmljZSA+PSBCQ01UUl9NQVhfT0xUUykNCisgICAgew0KKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7DQorICAgIH0NCisNCisgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIlLTE2czogJWx1XG4iLCAicnhfcmVxdWVzdHMiLCByZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5zdGF0cy5yeF9yZXF1ZXN0cyk7DQorICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiJS0xNnM6ICVsdVxuIiwgInR4X3Jlc3BvbnNlcyIsIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLnN0YXRzLnR4X3Jlc3BvbnNlcyk7DQorICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiJS0xNnM6ICVsdVxuIiwgImluZGljYXRpb25zIiwgcmVtb3RlX2NsaV9kYXRhW2RldmljZV0uc3RhdHMuaW5kaWNhdGlvbnMpOw0KKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiUtMTZzOiAlbHVcbiIsICJwcm94eV9yeHMiLCByZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5zdGF0cy5wcm94eV9yeHMpOw0KKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiUtMTZzOiAlbHVcbiIsICJ1bnBhY2tfZXJyb3JzIiwgcmVtb3RlX2NsaV9kYXRhW2RldmljZV0uc3RhdHMudW5wYWNrX2Vycm9ycyk7DQorICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiJS0xNnM6ICVsdVxuIiwgInBhY2tfZXJyb3JzIiwgcmVtb3RlX2NsaV9kYXRhW2RldmljZV0uc3RhdHMucGFja19lcnJvcnMpOw0KKyAgICBiY21jbGlfcHJpbnQoc2Vzc2lvbiwgIiUtMTZzOiAlbHVcbiIsICJ0eF9zb2NrZXRfZXJyb3JzIiwgcmVtb3RlX2NsaV9kYXRhW2RldmljZV0uc3RhdHMudHhfc29ja2V0X2Vycm9ycyk7DQorICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiJS0xNnM6ICVsdVxuIiwgInJ4X3NvY2tldF9lcnJvcnMiLCByZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5zdGF0cy5yeF9zb2NrZXRfZXJyb3JzKTsNCisgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICIlLTE2czogJWx1XG4iLCAibWVzc2FnZV9lcnJvcnMiLCByZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5zdGF0cy5tZXNzYWdlX2Vycm9ycyk7DQorICAgIG1lbXNldCgmcmVtb3RlX2NsaV9kYXRhW2RldmljZV0uc3RhdHMsIDAsIHNpemVvZihyZW1vdGVfY2xpX3N0YXRzKSk7DQorDQorICAgIHJldHVybiBCQ01fRVJSX09LOw0KK30NCisNCitzdGF0aWMgdm9pZCBzZW5kX291dHB1dF9wYWNrZXRzKGJjbW9sdF9kZXZpZCBkZXZpY2UsIHJlbW90ZV9jbGlfb3Bjb2RlIG9wY29kZSwgdWludDE2X3QgY29ycl90YWcpDQorew0KKyAgICBiY21vbHRfYnVmIGJ1ZiA9IHt9Ow0KKyAgICBzdGF0aWMgdWludDhfdCBzY3JhdGNoX2J1ZmZlcltSRU1PVEVfQ0xJX0JVRkZFUl9NQVhdOw0KKyAgICBzc2l6ZV90IGxlbjsNCisgICAgYmNtb3NfYm9vbCBvayA9IEJDTU9TX1RSVUU7DQorDQorICAgIGlmIChyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5vdXRwdXRfY3VycmVudF9jaGFyID09IDApDQorICAgIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKw0KKyAgICBiY21vbHRfYnVmX2luaXQoJmJ1ZiwgUkVNT1RFX0NMSV9CVUZGRVJfTUFYLCBzY3JhdGNoX2J1ZmZlciwgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpOw0KKyAgICBvayA9IG9rICYmIGJjbW9sdF9idWZfd3JpdGVfdTgoJmJ1ZiwgKHVpbnQ4X3Qpb3Bjb2RlKTsNCisgICAgb2sgPSBvayAmJiBiY21vbHRfYnVmX3dyaXRlX3UxNl9iZSgmYnVmLCBjb3JyX3RhZyk7DQorICAgIG9rID0gb2sgJiYgYmNtb2x0X2J1Zl93cml0ZSgNCisgICAgICAgICZidWYsDQorICAgICAgICByZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5vdXRwdXRfYnVmZmVyLA0KKyAgICAgICAgcmVtb3RlX2NsaV9kYXRhW2RldmljZV0ub3V0cHV0X2N1cnJlbnRfY2hhcik7DQorDQorICAgIGlmICghb2spDQorICAgIHsNCisgICAgICAgICsrcmVtb3RlX2NsaV9kYXRhW2RldmljZV0uc3RhdHMucGFja19lcnJvcnM7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisNCisgICAgLyogU2VuZCB0byBjbGllbnQgKi8NCisgICAgbGVuID0gc2VuZHRvKA0KKyAgICAgICAgcmVtb3RlX2NsaV9kYXRhW2RldmljZV0uY2xpZW50X3NvY2tldCwNCisgICAgICAgIGJ1Zi5zdGFydCwNCisgICAgICAgIGJjbW9sdF9idWZfZ2V0X3VzZWQoJmJ1ZiksDQorICAgICAgICAwLA0KKyAgICAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSZyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5jbGllbnQsDQorICAgICAgICBzaXplb2YocmVtb3RlX2NsaV9kYXRhW2RldmljZV0uY2xpZW50KSk7DQorDQorICAgIGlmIChsZW4gPD0gMCkNCisgICAgew0KKyAgICAgICAgKytyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5zdGF0cy50eF9zb2NrZXRfZXJyb3JzOw0KKyAgICB9DQorfQ0KKw0KK3N0YXRpYyB2b2lkIHByb2Nlc3NfY2xpX2lucHV0KGJjbW9sdF9kZXZpZCBkZXZpY2UpDQorew0KKyAgICBiY21vc19tdXRleF9sb2NrKCZyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5vdXRwdXRfbG9jayk7DQorICAgIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLm91dHB1dF9jdXJyZW50X2NoYXIgPSAwOw0KKyAgICBtZW1zZXQocmVtb3RlX2NsaV9kYXRhW2RldmljZV0ub3V0cHV0X2J1ZmZlciwgMCwgc2l6ZW9mKHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLm91dHB1dF9idWZmZXIpKTsNCisgICAgYmNtY2xpX3BhcnNlKHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLnNlc3Npb24sIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLmlucHV0X3N0cik7DQorICAgIGJjbW9zX211dGV4X3VubG9jaygmcmVtb3RlX2NsaV9kYXRhW2RldmljZV0ub3V0cHV0X2xvY2spOw0KK30NCisNCitzdGF0aWMgaW50IHJlbW90ZV9jbGlfc2Vzc2lvbl93cml0ZV9jYihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgY2hhciAqYnVmLCB1aW50MzJfdCBzaXplKQ0KK3sNCisgICAgaW50IGk7DQorICAgIGJjbW9sdF9kZXZpZCBkZXZpY2UgPSAqKChiY21vbHRfZGV2aWQgKiliY21jbGlfc2Vzc2lvbl91c2VyX3ByaXYoc2Vzc2lvbikpOw0KKw0KKyAgICBiY21vc19tdXRleF9sb2NrKCZyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5vdXRwdXRfbG9jayk7DQorICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyArK2kpDQorICAgIHsNCisgICAgICAgIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLm91dHB1dF9idWZmZXJbcmVtb3RlX2NsaV9kYXRhW2RldmljZV0ub3V0cHV0X2N1cnJlbnRfY2hhcl0gPSBidWZbaV07DQorICAgICAgICArK3JlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLm91dHB1dF9jdXJyZW50X2NoYXI7DQorICAgIH0NCisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5vdXRwdXRfbG9jayk7DQorDQorICAgIHJldHVybiBzaXplOw0KK30NCisNCitzdGF0aWMgYmNtb3NfZXJybm8gcmVtb3RlX2NsaV9vcGVuX3Nlc3Npb24oYmNtb2x0X2RldmlkIGRldmljZSkNCit7DQorICAgIGJjbW9zX2Vycm5vIHJjOw0KKyAgICBiY21jbGlfc2Vzc2lvbl9wYXJtIHNlc3NfcGFybSA9IHt9Ow0KKyAgICBzZXNzX3Bhcm0uYWNjZXNzX3JpZ2h0ID0gQkNNQ0xJX0FDQ0VTU19ERUJVRzsNCisgICAgc2Vzc19wYXJtLndyaXRlID0gcmVtb3RlX2NsaV9zZXNzaW9uX3dyaXRlX2NiOw0KKyAgICBzZXNzX3Bhcm0udXNlcl9wcml2ID0gYmNtb3NfY2FsbG9jKHNpemVvZihkZXZpY2UpKTsNCisgICAgc2Vzc19wYXJtLmxpbmVfZWRpdF9tb2RlID0gQkNNQ0xJX0xJTkVfRURJVF9ESVNBQkxFOw0KKyAgICBCVUdfT04oc2Vzc19wYXJtLnVzZXJfcHJpdiA9PSBOVUxMKTsNCisgICAgKigoYmNtb2x0X2RldmlkICopc2Vzc19wYXJtLnVzZXJfcHJpdikgPSBkZXZpY2U7DQorICAgIHJjID0gYmNtY2xpX3Nlc3Npb25fb3Blbigmc2Vzc19wYXJtLCAmcmVtb3RlX2NsaV9kYXRhW2RldmljZV0uc2Vzc2lvbik7DQorDQorICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQ0KKyAgICB7DQorICAgICAgICBwZXJyb3IoIkNhbid0IG9wZW4gc2Vzc2lvbiIpOw0KKyNpZmRlZiBFTkFCTEVfTE9HDQorICAgICAgICBCQ01fTE9HKA0KKyAgICAgICAgICAgIEVSUk9SLA0KKyAgICAgICAgICAgIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLmxvZ19pZCwNCisgICAgICAgICAgICAiQ2FuJ3Qgb3BlbiBzZXNzaW9uXG4iKTsNCisjZW5kaWYNCisgICAgICAgIHNodXRkb3duKHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLmNsaWVudF9zb2NrZXQsIFNIVVRfUkRXUik7DQorICAgIH0NCisgICAgcmV0dXJuIHJjOw0KK30NCisNCitzdGF0aWMgYmNtb3NfZXJybm8gcmVtb3RlX2NsaV9vcGVuX3NvY2tldChiY21vbHRfZGV2aWQgZGV2aWNlKQ0KK3sNCisgICAgc3RydWN0IHNvY2thZGRyX2luIHNhID0ge307DQorICAgIC8qIFN0YXJ0IGxpc3RlbmluZyBvbiBwb3J0ICovDQorICAgIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLmNsaWVudF9zb2NrZXQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7DQorICAgIGlmIChyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5jbGllbnRfc29ja2V0IDwgMCkNCisgICAgew0KKyAgICAgICAgcGVycm9yKCJDYW4ndCBjcmVhdGUgc29ja2V0Iik7DQorI2lmZGVmIEVOQUJMRV9MT0cNCisgICAgICAgIEJDTV9MT0coDQorICAgICAgICAgICAgRVJST1IsDQorICAgICAgICAgICAgcmVtb3RlX2NsaV9kYXRhW2RldmljZV0ubG9nX2lkLA0KKyAgICAgICAgICAgICJDYW4ndCBjcmVhdGUgc29ja2V0XG4iKTsNCisjZW5kaWYNCisgICAgICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOw0KKyAgICB9DQorDQorICAgIC8qIEJpbmQgbG9jYWwgKi8NCisgICAgc2Euc2luX2ZhbWlseSA9IEFGX0lORVQ7DQorICAgIHNhLnNpbl9wb3J0ID0gKGluX3BvcnRfdClodG9ucyhyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5wb3J0KTsNCisgICAgc2Euc2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsNCisgICAgaWYgKGJpbmQocmVtb3RlX2NsaV9kYXRhW2RldmljZV0uY2xpZW50X3NvY2tldCwgKHN0cnVjdCBzb2NrYWRkciopJnNhLCBzaXplb2Yoc2EpKSA9PSAtMSkNCisgICAgew0KKyAgICAgICAgcGVycm9yKCJDYW4ndCBiaW5kIHRvIHNvY2tldCIpOw0KKyNpZmRlZiBFTkFCTEVfTE9HDQorICAgICAgICBCQ01fTE9HKA0KKyAgICAgICAgICAgIEVSUk9SLA0KKyAgICAgICAgICAgIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLmxvZ19pZCwNCisgICAgICAgICAgICAiQ2FuJ3QgYmluZCBzb2NrZXQgdG8gcG9ydCAldVxuIiwNCisgICAgICAgICAgICByZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5wb3J0KTsNCisjZW5kaWYNCisgICAgICAgIHNodXRkb3duKHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLmNsaWVudF9zb2NrZXQsIFNIVVRfUkRXUik7DQorICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsNCisgICAgfQ0KKyAgICByZXR1cm4gQkNNX0VSUl9PSzsNCit9DQorDQorc3RhdGljIHZvaWQgcmVtb3RlX2NsaV9pbmRpY2F0aW9uX2NiKGJjbW9zX21vZHVsZV9pZCBtb2R1bGVfaWQsIGJjbW9zX21zZyAqbXNnKQ0KK3sNCisgICAgYmNtb2x0X2RldmlkIGRldmljZSA9IChiY21vbHRfZGV2aWQpKG1vZHVsZV9pZCAtIEJDTU9TX01PRFVMRV9JRF9SRU1PVEVfQ0xJX0RFVjApOw0KKyAgICBiY21vbHRfbXNnICppbmQgPSBtc2ctPmRhdGE7DQorDQorICAgIGJjbW9zX211dGV4X2xvY2soJnJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLm91dHB1dF9sb2NrKTsNCisgICAgcmVtb3RlX2NsaV9kYXRhW2RldmljZV0ub3V0cHV0X2N1cnJlbnRfY2hhciA9IDA7DQorICAgIG1lbXNldChyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5vdXRwdXRfYnVmZmVyLCAwLCBzaXplb2YocmVtb3RlX2NsaV9kYXRhW2RldmljZV0ub3V0cHV0X2J1ZmZlcikpOw0KKw0KKyAgICBhcGljbGlfbXNnX2R1bXAocmVtb3RlX2NsaV9kYXRhW2RldmljZV0uc2Vzc2lvbiwgaW5kKTsNCisgICAgaWYgKGluZC0+Z3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9BVVRPKQ0KKyAgICB7DQorICAgICAgICBzZW5kX291dHB1dF9wYWNrZXRzKGRldmljZSwgUkVNT1RFX0NMSV9PUENPREVfSU5ESUNBVElPTiwgaW5kLT5jb3JyX3RhZyk7DQorICAgICAgICArK3JlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLnN0YXRzLmluZGljYXRpb25zOw0KKyAgICB9DQorICAgIGVsc2UgaWYgKGluZC0+Z3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9QUk9YWV9SWCkNCisgICAgew0KKyAgICAgICAgc2VuZF9vdXRwdXRfcGFja2V0cyhkZXZpY2UsIFJFTU9URV9DTElfT1BDT0RFX1BST1hZX1JYLCBpbmQtPmNvcnJfdGFnKTsNCisgICAgICAgICsrcmVtb3RlX2NsaV9kYXRhW2RldmljZV0uc3RhdHMucHJveHlfcnhzOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyNpZmRlZiBFTkFCTEVfTE9HDQorICAgICAgICBCQ01fTE9HKA0KKyAgICAgICAgICAgIEVSUk9SLA0KKyAgICAgICAgICAgIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLmxvZ19pZCwNCisgICAgICAgICAgICAiVW5rbm93biBncm91cCB0eXBlICV1XG4iLA0KKyAgICAgICAgICAgIGluZC0+Z3JvdXApOw0KKyNlbmRpZg0KKyAgICB9DQorICAgIGJjbW9zX211dGV4X3VubG9jaygmcmVtb3RlX2NsaV9kYXRhW2RldmljZV0ub3V0cHV0X2xvY2spOw0KKw0KKyAgICBiY21vbHRfbXNnX2ZyZWUoaW5kKTsNCit9DQorDQorc3RhdGljIHZvaWQgcmVtb3RlX2NsaV9vdXRwdXRfY2IoYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZCwgYmNtb3NfbXNnICptc2cpDQorew0KKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlID0gKGJjbW9sdF9kZXZpZCkobW9kdWxlX2lkIC0gQkNNT1NfTU9EVUxFX0lEX1JFTU9URV9DTElfREVWMCk7DQorICAgIHByb2Nlc3NfY2xpX2lucHV0KGRldmljZSk7DQorICAgIHNlbmRfb3V0cHV0X3BhY2tldHMoZGV2aWNlLCBSRU1PVEVfQ0xJX09QQ09ERV9DTElfQ09NTUFORCwgcmVtb3RlX2NsaV9kYXRhW2RldmljZV0uY3VycmVudF9jb3JyX3RhZyk7DQorICAgIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLm91dHB1dF9wZW5kaW5nID0gQkNNT1NfRkFMU0U7DQorICAgICsrcmVtb3RlX2NsaV9kYXRhW2RldmljZV0uc3RhdHMudHhfcmVzcG9uc2VzOw0KK30NCisNCitzdGF0aWMgaW50IHJlbW90ZV9jbGlfc29ja2V0X3Rhc2sobG9uZyBkYXRhKQ0KK3sNCisgICAgYmNtb2x0X2RldmlkIGRldmljZSA9IChiY21vbHRfZGV2aWQpZGF0YTsNCisgICAgc3RydWN0IHNvY2thZGRyX2luIHNlbmRlcjsNCisgICAgc29ja2xlbl90IHNlbmRzaXplID0gc2l6ZW9mKHNlbmRlcik7DQorICAgIGJjbW9sdF9idWYgYnVmOw0KKyAgICBzc2l6ZV90IGxlbjsNCisgICAgdWludDhfdCBvcGNvZGUgPSAwOw0KKyAgICB1aW50MTZfdCBjb3JyX3RhZyA9IDA7DQorICAgIGJjbW9zX2Jvb2wgb2sgPSBCQ01PU19UUlVFOw0KKyAgICBiY21vc19tc2cgb3V0cHV0X21zZyA9IHsgLmhhbmRsZXIgPSByZW1vdGVfY2xpX291dHB1dF9jYiB9Ow0KKyAgICBiY21vc19lcnJubyByYzsNCisNCisgICAgcmMgPSByZW1vdGVfY2xpX29wZW5fc29ja2V0KGRldmljZSk7DQorICAgIEJDTU9TX0NIRUNLX1JFVFVSTihyYyAhPSBCQ01fRVJSX09LLCByYywgLTEpOw0KKyAgICByYyA9IHJlbW90ZV9jbGlfb3Blbl9zZXNzaW9uKGRldmljZSk7DQorICAgIEJDTU9TX0NIRUNLX1JFVFVSTihyYyAhPSBCQ01fRVJSX09LLCByYywgLTEpOw0KKw0KKyAgICB3aGlsZSAocmVtb3RlX2NsaV9kYXRhW2RldmljZV0uaXNfcnVubmluZykNCisgICAgew0KKyAgICAgICAgaWYgKHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLm91dHB1dF9wZW5kaW5nKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGJjbW9zX3VzbGVlcCgxMDAwKTsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLmN1cnJlbnRfY29ycl90YWcgPSAtMTsNCisgICAgICAgIG1lbXNldChyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5pbnB1dF9idWZmZXIsIDAsIHNpemVvZihyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5pbnB1dF9idWZmZXIpKTsNCisNCisgICAgICAgIG1lbXNldCgmc2VuZGVyLCAwLCBzaXplb2Yoc2VuZGVyKSk7DQorICAgICAgICBsZW4gPSByZWN2ZnJvbSgNCisgICAgICAgICAgICByZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5jbGllbnRfc29ja2V0LA0KKyAgICAgICAgICAgIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLmlucHV0X2J1ZmZlciwNCisgICAgICAgICAgICBzaXplb2YocmVtb3RlX2NsaV9kYXRhW2RldmljZV0uaW5wdXRfYnVmZmVyKSwNCisgICAgICAgICAgICAwLA0KKyAgICAgICAgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2VuZGVyLA0KKyAgICAgICAgICAgICZzZW5kc2l6ZSk7DQorICAgICAgICBpZiAobGVuIDwgMCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBiY21vc191c2xlZXAoMTAwMDAwMCk7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICArK3JlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLnN0YXRzLnJ4X3JlcXVlc3RzOw0KKw0KKyAgICAgICAgaWYgKChyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5jbGllbnQuc2luX2FkZHIuc19hZGRyICE9IHNlbmRlci5zaW5fYWRkci5zX2FkZHIpIHx8DQorICAgICAgICAgICAgKHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLmNsaWVudC5zaW5fcG9ydCAhPSBzZW5kZXIuc2luX3BvcnQpKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLmNsaWVudCA9IHNlbmRlcjsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8qIFVucGFjayByZWNlaXZlZCBtZXNzYWdlICovDQorICAgICAgICBiY21vbHRfYnVmX2luaXQoJmJ1ZiwgKHVpbnQzMl90KWxlbiwgcmVtb3RlX2NsaV9kYXRhW2RldmljZV0uaW5wdXRfYnVmZmVyLCBCQ01PTFRfQlVGX0VORElBTl9GSVhFRCk7DQorICAgICAgICBvayA9IG9rICYmIGJjbW9sdF9idWZfcmVhZF91OCgmYnVmLCAmb3Bjb2RlKTsNCisgICAgICAgIG9rID0gb2sgJiYgYmNtb2x0X2J1Zl9yZWFkX3UxNl9iZSgmYnVmLCAmY29ycl90YWcpOw0KKw0KKyAgICAgICAgaWYgKCFvaykNCisgICAgICAgIHsNCisgICAgICAgICAgICArK3JlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLnN0YXRzLnVucGFja19lcnJvcnM7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorDQorICAgICAgICBpZiAoKHJlbW90ZV9jbGlfb3Bjb2RlKW9wY29kZSAhPSBSRU1PVEVfQ0xJX09QQ09ERV9DTElfQ09NTUFORCkNCisgICAgICAgIHsNCisgICAgICAgICAgICArK3JlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLnN0YXRzLnVucGFja19lcnJvcnM7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorDQorICAgICAgICBpZiAoKHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLmN1cnJlbnRfY29ycl90YWcgIT0gY29ycl90YWcpICYmIChyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5jdXJyZW50X2NvcnJfdGFnID49IDApKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgICsrcmVtb3RlX2NsaV9kYXRhW2RldmljZV0uc3RhdHMuY29ycmVsYXRpb25fZXJyb3JzOw0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcmVtb3RlX2NsaV9kYXRhW2RldmljZV0uaW5wdXRfc3RyID0gKGNoYXIgKiliY21vbHRfYnVmX3NuYXBfZ2V0KCZidWYpOw0KKyAgICAgICAgcmVtb3RlX2NsaV9kYXRhW2RldmljZV0uaW5wdXRfc3RyW2JjbW9sdF9idWZfZ2V0X3JlbWFpbmluZ19zaXplKCZidWYpXSA9ICdcMCc7DQorICAgICAgICByZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5jdXJyZW50X2NvcnJfdGFnID0gY29ycl90YWc7DQorICAgICAgICByZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5vdXRwdXRfcGVuZGluZyA9IEJDTU9TX1RSVUU7DQorICAgICAgICByYyA9IGJjbW9zX21zZ19zZW5kX3RvX21vZHVsZSgNCisgICAgICAgICAgICBiY21vc19tb2R1bGVfaWRfZm9yX2RldmljZShCQ01PU19NT0RVTEVfSURfUkVNT1RFX0NMSV9ERVYwLCBkZXZpY2UpLA0KKyAgICAgICAgICAgICZvdXRwdXRfbXNnLA0KKyAgICAgICAgICAgIEJDTU9TX01TR19TRU5EX0FVVE9fRlJFRSk7DQorICAgICAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykNCisgICAgICAgIHsNCisgICAgICAgICAgICArK3JlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLnN0YXRzLm1lc3NhZ2VfZXJyb3JzOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIGJjbW9zX2ZyZWUoYmNtY2xpX3Nlc3Npb25fdXNlcl9wcml2KHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLnNlc3Npb24pKTsNCisgICAgYmNtY2xpX3Nlc3Npb25fY2xvc2UocmVtb3RlX2NsaV9kYXRhW2RldmljZV0uc2Vzc2lvbik7DQorICAgIHNodXRkb3duKHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLmNsaWVudF9zb2NrZXQsIFNIVVRfUkRXUik7DQorICAgIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLnNvY2tldF90YXNrLmRlc3Ryb3llZCA9IEJDTU9TX1RSVUU7DQorICAgIHJldHVybiAwOw0KK30NCisNCitzdGF0aWMgYmNtb3NfZXJybm8gcmVtb3RlX2NsaV9zdGFydChiY21vbHRfZGV2aWQgZGV2aWNlLCB1aW50MzJfdCByZW1vdGVfY2xpX3BvcnQpDQorew0KKyAgICBiY21vc19lcnJubyByYzsNCisgICAgYmNtb3NfdGFza19wYXJtIG91dHB1dF90YXNrX3BhcmFtcyA9DQorICAgIHsNCisgICAgICAgIC5uYW1lID0gInJlbW90ZV9jbGlfaW5kaWNhdGlvbiIsDQorICAgICAgICAucHJpb3JpdHkgPSBUQVNLX1BSSU9SSVRZX1RSQU5TUE9SVF9SRU1PVEVfQ0xJDQorICAgIH07DQorDQorICAgIGJjbW9zX3Rhc2tfcGFybSBzb2NrZXRfdGFza19wYXJhbXMgPQ0KKyAgICB7DQorICAgICAgICAubmFtZSA9ICJyZW1vdGVfY2xpX21haW4iLA0KKyAgICAgICAgLmhhbmRsZXIgPSByZW1vdGVfY2xpX3NvY2tldF90YXNrLA0KKyAgICAgICAgLnByaW9yaXR5ID0gVEFTS19QUklPUklUWV9UUkFOU1BPUlRfUkVNT1RFX0NMSSwNCisgICAgICAgIC5kYXRhID0gKGxvbmcpZGV2aWNlDQorICAgIH07DQorDQorICAgIGJjbW9zX21vZHVsZV9wYXJtIG1vZHVsZV9wYXJhbXMgPQ0KKyAgICB7DQorICAgICAgICAucXBhcm0gPSB7IC5uYW1lID0gInJlbW90ZV9jbGkiLCAuc2l6ZSA9IFJFTU9URV9DTElfTUVTU0FHRV9RVUVVRV9ERVBUSCB9DQorICAgIH07DQorDQorICAgIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLnBvcnQgPSByZW1vdGVfY2xpX3BvcnQ7DQorICAgIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLmN1cnJlbnRfY29ycl90YWcgPSAtMTsNCisgICAgcmVtb3RlX2NsaV9kYXRhW2RldmljZV0uaXNfcnVubmluZyA9IEJDTU9TX1RSVUU7DQorDQorICAgIC8qIENyZWF0ZSB0aHJlYWQgbGlzdGVuaW5nIGZvciBpbmNvbWluZyBBUElzICovDQorICAgIHJjID0gYmNtb3NfdGFza19jcmVhdGUoJnJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLnNvY2tldF90YXNrLCAmc29ja2V0X3Rhc2tfcGFyYW1zKTsNCisgICAgQlVHX09OKEJDTV9FUlJfT0sgIT0gcmMpOw0KKyAgICByYyA9IGJjbW9zX3Rhc2tfY3JlYXRlKCZyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5vdXRwdXRfdGFzaywgJm91dHB1dF90YXNrX3BhcmFtcyk7DQorICAgIEJVR19PTihCQ01fRVJSX09LICE9IHJjKTsNCisgICAgYmNtb3NfbXV0ZXhfY3JlYXRlKCZyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5vdXRwdXRfbG9jaywgMCwgInJlbW90ZV9jbGkiKTsNCisNCisgICAgcmMgPSBiY21vc19tb2R1bGVfY3JlYXRlKA0KKyAgICAgICAgYmNtb3NfbW9kdWxlX2lkX2Zvcl9kZXZpY2UoQkNNT1NfTU9EVUxFX0lEX1JFTU9URV9DTElfREVWMCwgZGV2aWNlKSwNCisgICAgICAgICZyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5vdXRwdXRfdGFzaywNCisgICAgICAgICZtb2R1bGVfcGFyYW1zKTsNCisgICAgQlVHX09OKEJDTV9FUlJfT0sgIT0gcmMpOw0KKw0KKyNpZmRlZiBFTkFCTEVfTE9HDQorICAgIEJDTV9MT0coDQorICAgICAgICBJTkZPLA0KKyAgICAgICAgcmVtb3RlX2NsaV9kYXRhW2RldmljZV0ubG9nX2lkLA0KKyAgICAgICAgIkJDTTY4NjIwIHJlbW90ZSBjbGkgZm9yIGRldmljZSAlZCBpcyBsaXN0ZW5pbmcgb24gcG9ydCAldVxuIiwNCisgICAgICAgIChpbnQpZGV2aWNlLA0KKyAgICAgICAgcmVtb3RlX2NsaV9kYXRhW2RldmljZV0ucG9ydCk7DQorI2VuZGlmDQorDQorICAgIHJldHVybiBCQ01fRVJSX09LOw0KK30NCisNCisvKiBBdXRvIC8gcHJveHkgbWVzc2FnZSBoYW5kbGVyICovDQordm9pZCBiY21vbHRfcmVtb3RlX2NsaV9hdXRvX3J4X2NiKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9tc2cgKm1zZykNCit7DQorICAgIGJjbW9zX2Vycm5vIGVycjsNCisgICAgYmNtb2x0X21zZyAqaW5kX2Nsb25lID0gTlVMTDsNCisNCisgICAgaWYgKGRldmljZSA+PSBCQ01UUl9NQVhfT0xUUykNCisgICAgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorDQorICAgIGlmIChyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5pc19ydW5uaW5nKQ0KKyAgICB7DQorICAgICAgICBlcnIgPSBiY21vbHRfbXNnX2Nsb25lKCZpbmRfY2xvbmUsIG1zZyk7DQorICAgICAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spDQorICAgICAgICB7DQorI2lmZGVmIEVOQUJMRV9MT0cNCisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCByZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5sb2dfaWQsICJJbmRpY2F0aW9uIGNsb25lIGZhaWxlZDogJXNcbiIsIGJjbW9zX3N0cmVycm9yKGVycikpOw0KKyNlbmRpZg0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisNCisgICAgICAgIGluZF9jbG9uZS0+b3NfbXNnLmhhbmRsZXIgPSByZW1vdGVfY2xpX2luZGljYXRpb25fY2I7DQorICAgICAgICBpbmRfY2xvbmUtPm9zX21zZy5kYXRhID0gaW5kX2Nsb25lOw0KKyAgICAgICAgZXJyID0gYmNtb3NfbXNnX3NlbmRfdG9fbW9kdWxlKA0KKyAgICAgICAgICAgIGJjbW9zX21vZHVsZV9pZF9mb3JfZGV2aWNlKEJDTU9TX01PRFVMRV9JRF9SRU1PVEVfQ0xJX0RFVjAsIGRldmljZSksDQorICAgICAgICAgICAgJmluZF9jbG9uZS0+b3NfbXNnLA0KKyAgICAgICAgICAgIDApOw0KKyAgICAgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgICsrcmVtb3RlX2NsaV9kYXRhW2RldmljZV0uc3RhdHMubWVzc2FnZV9lcnJvcnM7DQorICAgICAgICB9DQorICAgIH0NCit9DQorDQorYmNtb3NfZXJybm8gYmNtb2x0X3JlbW90ZV9jbGlfaW5pdChiY21jbGlfZW50cnkgKnJvb3QsIGJjbW9sdF9kZXZpZCBkZXZpY2UsIHVpbnQzMl90IHJlbW90ZV9jbGlfcG9ydCkNCit7DQorICAgIGJjbWNsaV9lbnRyeSAqZGlyOw0KKyAgICBpZiAoZGV2aWNlID49IEJDTVRSX01BWF9PTFRTKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOw0KKyAgICB9DQorDQorICAgIGlmIChyZW1vdGVfY2xpX2RhdGFbZGV2aWNlXS5pc19ydW5uaW5nKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gQkNNX0VSUl9BTFJFQURZOw0KKyAgICB9DQorDQorICAgIEJDTV9NRU1aRVJPX1NUUlVDVCgmcmVtb3RlX2NsaV9kYXRhW2RldmljZV0pOw0KKw0KKyNpZmRlZiBFTkFCTEVfTE9HDQorICAgIHsNCisgICAgY2hhciBsb2dfaWRbMzJdOw0KKyAgICBzbnByaW50Zihsb2dfaWQsIHNpemVvZihsb2dfaWQpIC0gMSwgInJlbW90ZV9jbGlfJWQiLCAoaW50KWRldmljZSk7DQorICAgIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLmxvZ19pZCA9DQorICAgICAgICBiY21fZGV2X2xvZ19pZF9yZWdpc3Rlcihsb2dfaWQsIERFVl9MT0dfTEVWRUxfSU5GTywgREVWX0xPR19JRF9UWVBFX0JPVEgpOw0KKyAgICB9DQorI2Vsc2UNCisgICAgcmVtb3RlX2NsaV9kYXRhW2RldmljZV0ubG9nX2lkID0gREVWX0xPR19JTlZBTElEX0lEOw0KKyNlbmRpZg0KKw0KKyAgICBkaXIgPSBiY21jbGlfZGlyX2FkZChyb290LCAicmVtb3RlX2NsaSIsICJSZW1vdGUgQ0xJIiwgQkNNQ0xJX0FDQ0VTU19HVUVTVCwgTlVMTCk7DQorICAgIGlmICghZGlyKQ0KKyAgICB7DQorI2lmZGVmIEVOQUJMRV9MT0cNCisgICAgICAgIEJDTV9MT0coRVJST1IsIHJlbW90ZV9jbGlfZGF0YVtkZXZpY2VdLmxvZ19pZCwgIkNhbid0IGNyZWF0ZSByZW1vdGUgQ0xJIGRpcmVjdG9yeVxuIik7DQorI2VuZGlmDQorICAgICAgICBCVUcoKTsNCisgICAgfQ0KKw0KKyAgICBCQ01DTElfTUFLRV9DTUQoZGlyLCAic3RhdCIsICJSZW1vdGUgQ0xJIHN0YXRpc3RpY3MiLCByZW1vdGVfY2xpX3N0YXRzX2NtZCwNCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fUkFOR0UoDQorICAgICAgICAgICAgImRldmljZSIsDQorICAgICAgICAgICAgIkRldmljZSBpbmRleCIsDQorICAgICAgICAgICAgQkNNQ0xJX1BBUk1fTlVNQkVSLA0KKyAgICAgICAgICAgIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwsDQorICAgICAgICAgICAgMCwNCisgICAgICAgICAgICBCQ01UUl9NQVhfT0xUUyAtIDEpKTsNCisNCisgICAgcmV0dXJuIHJlbW90ZV9jbGlfc3RhcnQoZGV2aWNlLCByZW1vdGVfY2xpX3BvcnQpOw0KK30NCisNCit2b2lkIGJjbW9sdF9yZW1vdGVfY2xpX3N0b3Aodm9pZCkNCit7DQorICAgIGludCBpOw0KKyAgICBiY21vc19ib29sIHdhc19ydW5uaW5nW0JDTVRSX01BWF9PTFRTXSA9IHt9Ow0KKw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgQkNNVFJfTUFYX09MVFM7IGkrKykNCisgICAgew0KKyAgICAgICAgd2FzX3J1bm5pbmdbaV0gPSByZW1vdGVfY2xpX2RhdGFbaV0uaXNfcnVubmluZzsNCisgICAgICAgIGlmICh3YXNfcnVubmluZ1tpXSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBzaHV0ZG93bihyZW1vdGVfY2xpX2RhdGFbaV0uY2xpZW50X3NvY2tldCwgU0hVVF9SRFdSKTsNCisgICAgICAgICAgICByZW1vdGVfY2xpX2RhdGFbaV0uaXNfcnVubmluZyA9IEJDTU9TX0ZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIGZvciAoaSA9IDA7IGkgPCBCQ01UUl9NQVhfT0xUUzsgaSsrKQ0KKyAgICB7DQorICAgICAgICBpZiAoIXdhc19ydW5uaW5nW2ldKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgd2hpbGUgKCFyZW1vdGVfY2xpX2RhdGFbaV0uc29ja2V0X3Rhc2suZGVzdHJveWVkKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGJjbW9zX3VzbGVlcCgxMDAwMCk7DQorICAgICAgICB9DQorICAgICAgICBiY21vc190YXNrX2Rlc3Ryb3koJnJlbW90ZV9jbGlfZGF0YVtpXS5zb2NrZXRfdGFzayk7DQorICAgICAgICBiY21vc19tb2R1bGVfZGVzdHJveShiY21vc19tb2R1bGVfaWRfZm9yX2RldmljZShCQ01PU19NT0RVTEVfSURfUkVNT1RFX0NMSV9ERVYwLCAoYmNtb2x0X2RldmlkKWkpKTsNCisgICAgICAgIGJjbW9zX3Rhc2tfZGVzdHJveSgmcmVtb3RlX2NsaV9kYXRhW2ldLm91dHB1dF90YXNrKTsNCisgICAgICAgIGJjbW9zX211dGV4X2Rlc3Ryb3koJnJlbW90ZV9jbGlfZGF0YVtpXS5vdXRwdXRfbG9jayk7DQorICAgIH0NCit9DQorDQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3JlbW90ZV9jbGkvYmNtb2x0X3JlbW90ZV9jbGkuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9yZW1vdGVfY2xpL2JjbW9sdF9yZW1vdGVfY2xpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIwYTY0YgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS9yZW1vdGVfY2xpL2JjbW9sdF9yZW1vdGVfY2xpLmgKQEAgLTAsMCArMSw0NCBAQAorLyoNCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQNCisNCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tDQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZA0KKw0KK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UNCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkDQordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyDQorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsDQord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToNCisNCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlDQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kDQorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cg0KKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQNCisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4NCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzDQorICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMNCisgICBvZiB0aGUgc29mdHdhcmUuDQorDQorTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lDQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkDQordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3INCit3cml0dGVuIGNvbnNlbnQuDQorDQorOj4NCisgKi8NCisNCisjaWZuZGVmIF9CQ01PTFRfUkVNT1RFX0NMSV9IXw0KKyNkZWZpbmUgX0JDTU9MVF9SRU1PVEVfQ0xJX0hfDQorDQorI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPg0KKyNpbmNsdWRlIDxiY21vbHRfbXNnLmg+DQorDQordm9pZCBiY21vbHRfcmVtb3RlX2NsaV9hdXRvX3J4X2NiKGJjbW9sdF9kZXZpZCBvbHQsIGJjbW9sdF9tc2cgKm1zZyk7DQorDQorYmNtb3NfZXJybm8gYmNtb2x0X3JlbW90ZV9jbGlfaW5pdChiY21jbGlfZW50cnkgKnJvb3QsIGJjbW9sdF9kZXZpZCBkZXZpY2UsIHVpbnQzMl90IHJlbW90ZV9jbGlfcG9ydCk7DQorDQordm9pZCBiY21vbHRfcmVtb3RlX2NsaV9zdG9wKHZvaWQpOw0KKw0KKyNlbmRpZg0KKw0KKw0KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS90aW1lX21lYXN1cmVtZW50L01ha2VmaWxlIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3RpbWVfbWVhc3VyZW1lbnQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjdiNTBkYQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS90aW1lX21lYXN1cmVtZW50L01ha2VmaWxlCkBAIC0wLDAgKzEsMTEgQEAKKyMgQ29tbW9uIEFQSQorIworTU9EX05BTUUgPSB0aW1lX21lYXN1cmVtZW50CitNT0RfVFlQRSA9IGxpYgorTU9EX0RFUFMgPSBkZXZfbG9nCisKK2lmZXEgKCIkKEVOQUJMRV9MT0cpIiwgInkiKQorICAgIHNyY3MgPSBiY21vbHRfdGltZV9tZWFzdXJlbWVudC5jCitlbmRpZgorCitVU0VfTElOVCA9IHllcwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3RpbWVfbWVhc3VyZW1lbnQvYmNtb2x0X3RpbWVfbWVhc3VyZW1lbnQuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS90aW1lX21lYXN1cmVtZW50L2JjbW9sdF90aW1lX21lYXN1cmVtZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTY2NTA5NQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS90aW1lX21lYXN1cmVtZW50L2JjbW9sdF90aW1lX21lYXN1cmVtZW50LmMKQEAgLTAsMCArMSwxMTcgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTQ6cHJvcHJpZXRhcnk6c3RhbmRhcmQKKyAKKyAgIENvcHlyaWdodCAoYykgMjAxNCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorIAorVGhpcyBwcm9ncmFtIGlzIHRoZSBwcm9wcmlldGFyeSBzb2Z0d2FyZSBvZiBCcm9hZGNvbSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzCitsaWNlbnNvcnMsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBkdXBsaWNhdGVkLCBtb2RpZmllZCBvciBkaXN0cmlidXRlZCBwdXJzdWFudAordG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIGEgc2VwYXJhdGUsIHdyaXR0ZW4gbGljZW5zZSBhZ3JlZW1lbnQgZXhlY3V0ZWQKK2JldHdlZW4geW91IGFuZCBCcm9hZGNvbSAoYW4gIkF1dGhvcml6ZWQgTGljZW5zZSIpLiAgRXhjZXB0IGFzIHNldCBmb3J0aCBpbgorYW4gQXV0aG9yaXplZCBMaWNlbnNlLCBCcm9hZGNvbSBncmFudHMgbm8gbGljZW5zZSAoZXhwcmVzcyBvciBpbXBsaWVkKSwgcmlnaHQKK3RvIHVzZSwgb3Igd2FpdmVyIG9mIGFueSBraW5kIHdpdGggcmVzcGVjdCB0byB0aGUgU29mdHdhcmUsIGFuZCBCcm9hZGNvbQorZXhwcmVzc2x5IHJlc2VydmVzIGFsbCByaWdodHMgaW4gYW5kIHRvIHRoZSBTb2Z0d2FyZSBhbmQgYWxsIGludGVsbGVjdHVhbAorcHJvcGVydHkgcmlnaHRzIHRoZXJlaW4uICBJRiBZT1UgSEFWRSBOTyBBVVRIT1JJWkVEIExJQ0VOU0UsIFRIRU4gWU9VIEhBVkUKK05PIFJJR0hUIFRPIFVTRSBUSElTIFNPRlRXQVJFIElOIEFOWSBXQVksIEFORCBTSE9VTEQgSU1NRURJQVRFTFkgTk9USUZZCitCUk9BRENPTSBBTkQgRElTQ09OVElOVUUgQUxMIFVTRSBPRiBUSEUgU09GVFdBUkUuCisgCitFeGNlcHQgYXMgZXhwcmVzc2x5IHNldCBmb3J0aCBpbiB0aGUgQXV0aG9yaXplZCBMaWNlbnNlLAorIAorMS4gVGhpcyBwcm9ncmFtLCBpbmNsdWRpbmcgaXRzIHN0cnVjdHVyZSwgc2VxdWVuY2UgYW5kIG9yZ2FuaXphdGlvbiwKKyAgICBjb25zdGl0dXRlcyB0aGUgdmFsdWFibGUgdHJhZGUgc2VjcmV0cyBvZiBCcm9hZGNvbSwgYW5kIHlvdSBzaGFsbCB1c2UKKyAgICBhbGwgcmVhc29uYWJsZSBlZmZvcnRzIHRvIHByb3RlY3QgdGhlIGNvbmZpZGVudGlhbGl0eSB0aGVyZW9mLCBhbmQgdG8KKyAgICB1c2UgdGhpcyBpbmZvcm1hdGlvbiBvbmx5IGluIGNvbm5lY3Rpb24gd2l0aCB5b3VyIHVzZSBvZiBCcm9hZGNvbQorICAgIGludGVncmF0ZWQgY2lyY3VpdCBwcm9kdWN0cy4KKyAKKzIuIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIgorICAgIEFORCBXSVRIIEFMTCBGQVVMVFMgQU5EIEJST0FEQ09NIE1BS0VTIE5PIFBST01JU0VTLCBSRVBSRVNFTlRBVElPTlMgT1IKKyAgICBXQVJSQU5USUVTLCBFSVRIRVIgRVhQUkVTUywgSU1QTElFRCwgU1RBVFVUT1JZLCBPUiBPVEhFUldJU0UsIFdJVEgKKyAgICBSRVNQRUNUIFRPIFRIRSBTT0ZUV0FSRS4gIEJST0FEQ09NIFNQRUNJRklDQUxMWSBESVNDTEFJTVMgQU5ZIEFORAorICAgIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgVElUTEUsIE1FUkNIQU5UQUJJTElUWSwgTk9OSU5GUklOR0VNRU5ULAorICAgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBMQUNLIE9GIFZJUlVTRVMsIEFDQ1VSQUNZIE9SCisgICAgQ09NUExFVEVORVNTLCBRVUlFVCBFTkpPWU1FTlQsIFFVSUVUIFBPU1NFU1NJT04gT1IgQ09SUkVTUE9OREVOQ0UKKyAgICBUTyBERVNDUklQVElPTi4gWU9VIEFTU1VNRSBUSEUgRU5USVJFIFJJU0sgQVJJU0lORyBPVVQgT0YgVVNFIE9SCisgICAgUEVSRk9STUFOQ0UgT0YgVEhFIFNPRlRXQVJFLgorIAorMy4gVE8gVEhFIE1BWElNVU0gRVhURU5UIFBFUk1JVFRFRCBCWSBMQVcsIElOIE5PIEVWRU5UIFNIQUxMIEJST0FEQ09NIE9SCisgICAgSVRTIExJQ0VOU09SUyBCRSBMSUFCTEUgRk9SIChpKSBDT05TRVFVRU5USUFMLCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICAgIElORElSRUNULCBPUiBFWEVNUExBUlkgREFNQUdFUyBXSEFUU09FVkVSIEFSSVNJTkcgT1VUIE9GIE9SIElOIEFOWQorICAgIFdBWSBSRUxBVElORyBUTyBZT1VSIFVTRSBPRiBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBTT0ZUV0FSRSBFVkVOCisgICAgSUYgQlJPQURDT00gSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTOworICAgIE9SIChpaSkgQU5ZIEFNT1VOVCBJTiBFWENFU1MgT0YgVEhFIEFNT1VOVCBBQ1RVQUxMWSBQQUlEIEZPUiBUSEUKKyAgICBTT0ZUV0FSRSBJVFNFTEYgT1IgVS5TLiAkMSwgV0hJQ0hFVkVSIElTIEdSRUFURVIuIFRIRVNFIExJTUlUQVRJT05TCisgICAgU0hBTEwgQVBQTFkgTk9UV0lUSFNUQU5ESU5HIEFOWSBGQUlMVVJFIE9GIEVTU0VOVElBTCBQVVJQT1NFIE9GIEFOWQorICAgIExJTUlURUQgUkVNRURZLgorOj4KKyovCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlICJiY21vbHRfdGltZV9tZWFzdXJlbWVudC5oIgorCit0eXBlZGVmIHN0cnVjdAoreworICAgIGRldl9sb2dfaWQgbG9nX2lkOworICAgIHVpbnQzMl90IG51bV9jeWNsZXNfZm9yX2F2ZXJhZ2U7CisgICAgRl9iY21vbHRfdGltZV9tZWFzdXJlbWVudF90aWNrc190b19ucyB0aWNrc190b19uczsKKyAgICBGX2JjbW9sdF90aW1lX21lYXN1cmVtZW50X2F2Z19kb25lIGF2Z19kb25lOworICAgIHVpbnQzMl90IGN5Y2xlX251bTsKK30gYmNtb2x0X3RpbWVfbWVhc3VyZW1lbnRfY29udGV4dDsKKworc3RhdGljIGJjbW9sdF90aW1lX21lYXN1cmVtZW50X2NvbnRleHQgdGltZV9tZWFzdXJlbWVudF9jb250ZXh0ID0geyBERVZfTE9HX0lOVkFMSURfSUQsIDAsIE5VTEwsIE5VTEwsIDAgfTsKKwordm9pZCBiY21vbHRfdGltZV9tZWFzdXJlbWVudF9pbml0KAorICAgIGRldl9sb2dfaWQgbG9nX2lkLAorICAgIHVpbnQzMl90IG51bV9jeWNsZXNfZm9yX2F2ZXJhZ2UsCisgICAgRl9iY21vbHRfdGltZV9tZWFzdXJlbWVudF90aWNrc190b19ucyB0aWNrc190b19ucywKKyAgICBGX2JjbW9sdF90aW1lX21lYXN1cmVtZW50X2F2Z19kb25lIGF2Z19kb25lKQoreworICAgIHRpbWVfbWVhc3VyZW1lbnRfY29udGV4dCA9IChiY21vbHRfdGltZV9tZWFzdXJlbWVudF9jb250ZXh0KQorICAgICAgICB7IGxvZ19pZCwgbnVtX2N5Y2xlc19mb3JfYXZlcmFnZSwgdGlja3NfdG9fbnMsIGF2Z19kb25lLCAwIH07Cit9CisKK3ZvaWQgYmNtb2x0X3RpbWVfbWVhc3VyZW1lbnRfc2FtcGxlX2VuZCh1aW50NjRfdCAqdG90YWxfdGlja3MsIHVpbnQzMl90ICpudW1fb2Zfc2FtcGxlcywgY29uc3QgY2hhciAqbWVhc3VyZW1lbnRfbmFtZSkKK3sKKyAgICAvKiBEb24ndCBkbyBhbnl0aGluZyBpZiB3ZSBoYXZlbid0IHJ1biBlbm91Z2ggY3ljbGVzIHRvIHByb2R1Y2UgYW4gYXZlcmFnZS4gKi8KKyAgICBpZiAodGltZV9tZWFzdXJlbWVudF9jb250ZXh0LmN5Y2xlX251bSA8ICh0aW1lX21lYXN1cmVtZW50X2NvbnRleHQubnVtX2N5Y2xlc19mb3JfYXZlcmFnZSAtIDEpKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICgqbnVtX29mX3NhbXBsZXMgIT0gMCAmJiB0aW1lX21lYXN1cmVtZW50X2NvbnRleHQudGlja3NfdG9fbnMgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8qIENvbnZlcnQgdGhlIHNhbXBsZSB0aW1lIGZyb20gdGlja3MgdG8gbnMuICovCisgICAgICAgIHVpbnQ2NF90IGR1cmF0aW9uX2F2ZXJhZ2VfbnMgPSB0aW1lX21lYXN1cmVtZW50X2NvbnRleHQudGlja3NfdG9fbnMoKnRvdGFsX3RpY2tzIC8gKm51bV9vZl9zYW1wbGVzKTsKKworICAgICAgICAvKiBUaGUgIjoiIGlzIHVzZWQgYXMgZGVsaW1pdGVyIHdoZW4gaW1wb3J0aW5nIHRvIGV4Y2VsLiAqLworICAgICAgICBCQ01fTE9HKAorICAgICAgICAgICAgREVCVUcsCisgICAgICAgICAgICB0aW1lX21lYXN1cmVtZW50X2NvbnRleHQubG9nX2lkLAorICAgICAgICAgICAgIjolczogJWxsdS4lMDNsbHUgdXMgKCV1IGhpdHMpXG4iLAorICAgICAgICAgICAgbWVhc3VyZW1lbnRfbmFtZSwKKyAgICAgICAgICAgIChsb25nIGxvbmcgdW5zaWduZWQgaW50KShkdXJhdGlvbl9hdmVyYWdlX25zIC8gMTAwMCksCisgICAgICAgICAgICAobG9uZyBsb25nIHVuc2lnbmVkIGludCkoZHVyYXRpb25fYXZlcmFnZV9ucyAlIDEwMDApLAorICAgICAgICAgICAgKm51bV9vZl9zYW1wbGVzKTsKKyAgICB9CisKKyAgICAqdG90YWxfdGlja3MgPSAwOworICAgICpudW1fb2Zfc2FtcGxlcyA9IDA7Cit9CisKK3ZvaWQgYmNtb2x0X3RpbWVfbWVhc3VyZW1lbnRfY3ljbGVfZW5kKHZvaWQpCit7CisgICAgaWYgKHRpbWVfbWVhc3VyZW1lbnRfY29udGV4dC5jeWNsZV9udW0gPT0gKHRpbWVfbWVhc3VyZW1lbnRfY29udGV4dC5udW1fY3ljbGVzX2Zvcl9hdmVyYWdlIC0gMSkpCisgICAgeworICAgICAgICBpZiAodGltZV9tZWFzdXJlbWVudF9jb250ZXh0LmF2Z19kb25lICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRpbWVfbWVhc3VyZW1lbnRfY29udGV4dC5hdmdfZG9uZSgpOworICAgICAgICB9CisKKyAgICAgICAgLyogUHJpbnQgYSBkZWxpbWl0aW5nIGxpbmUuICovCisgICAgICAgIEJDTV9MT0coREVCVUcsIHRpbWVfbWVhc3VyZW1lbnRfY29udGV4dC5sb2dfaWQsICJcbiIpOworICAgICAgICB0aW1lX21lYXN1cmVtZW50X2NvbnRleHQuY3ljbGVfbnVtID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKyt0aW1lX21lYXN1cmVtZW50X2NvbnRleHQuY3ljbGVfbnVtOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS90aW1lX21lYXN1cmVtZW50L2JjbW9sdF90aW1lX21lYXN1cmVtZW50LmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdGltZV9tZWFzdXJlbWVudC9iY21vbHRfdGltZV9tZWFzdXJlbWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJiNDFiODQKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdGltZV9tZWFzdXJlbWVudC9iY21vbHRfdGltZV9tZWFzdXJlbWVudC5oCkBAIC0wLDAgKzEsMTQzIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE0OnByb3ByaWV0YXJ5OnN0YW5kYXJkCisgCisgICBDb3B5cmlnaHQgKGMpIDIwMTQgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAKK1RoaXMgcHJvZ3JhbSBpcyB0aGUgcHJvcHJpZXRhcnkgc29mdHdhcmUgb2YgQnJvYWRjb20gQ29ycG9yYXRpb24gYW5kL29yIGl0cworbGljZW5zb3JzLCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgZHVwbGljYXRlZCwgbW9kaWZpZWQgb3IgZGlzdHJpYnV0ZWQgcHVyc3VhbnQKK3RvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiBhIHNlcGFyYXRlLCB3cml0dGVuIGxpY2Vuc2UgYWdyZWVtZW50IGV4ZWN1dGVkCitiZXR3ZWVuIHlvdSBhbmQgQnJvYWRjb20gKGFuICJBdXRob3JpemVkIExpY2Vuc2UiKS4gIEV4Y2VwdCBhcyBzZXQgZm9ydGggaW4KK2FuIEF1dGhvcml6ZWQgTGljZW5zZSwgQnJvYWRjb20gZ3JhbnRzIG5vIGxpY2Vuc2UgKGV4cHJlc3Mgb3IgaW1wbGllZCksIHJpZ2h0Cit0byB1c2UsIG9yIHdhaXZlciBvZiBhbnkga2luZCB3aXRoIHJlc3BlY3QgdG8gdGhlIFNvZnR3YXJlLCBhbmQgQnJvYWRjb20KK2V4cHJlc3NseSByZXNlcnZlcyBhbGwgcmlnaHRzIGluIGFuZCB0byB0aGUgU29mdHdhcmUgYW5kIGFsbCBpbnRlbGxlY3R1YWwKK3Byb3BlcnR5IHJpZ2h0cyB0aGVyZWluLiAgSUYgWU9VIEhBVkUgTk8gQVVUSE9SSVpFRCBMSUNFTlNFLCBUSEVOIFlPVSBIQVZFCitOTyBSSUdIVCBUTyBVU0UgVEhJUyBTT0ZUV0FSRSBJTiBBTlkgV0FZLCBBTkQgU0hPVUxEIElNTUVESUFURUxZIE5PVElGWQorQlJPQURDT00gQU5EIERJU0NPTlRJTlVFIEFMTCBVU0UgT0YgVEhFIFNPRlRXQVJFLgorIAorRXhjZXB0IGFzIGV4cHJlc3NseSBzZXQgZm9ydGggaW4gdGhlIEF1dGhvcml6ZWQgTGljZW5zZSwKKyAKKzEuIFRoaXMgcHJvZ3JhbSwgaW5jbHVkaW5nIGl0cyBzdHJ1Y3R1cmUsIHNlcXVlbmNlIGFuZCBvcmdhbml6YXRpb24sCisgICAgY29uc3RpdHV0ZXMgdGhlIHZhbHVhYmxlIHRyYWRlIHNlY3JldHMgb2YgQnJvYWRjb20sIGFuZCB5b3Ugc2hhbGwgdXNlCisgICAgYWxsIHJlYXNvbmFibGUgZWZmb3J0cyB0byBwcm90ZWN0IHRoZSBjb25maWRlbnRpYWxpdHkgdGhlcmVvZiwgYW5kIHRvCisgICAgdXNlIHRoaXMgaW5mb3JtYXRpb24gb25seSBpbiBjb25uZWN0aW9uIHdpdGggeW91ciB1c2Ugb2YgQnJvYWRjb20KKyAgICBpbnRlZ3JhdGVkIGNpcmN1aXQgcHJvZHVjdHMuCisgCisyLiBUTyBUSEUgTUFYSU1VTSBFWFRFTlQgUEVSTUlUVEVEIEJZIExBVywgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIKKyAgICBBTkQgV0lUSCBBTEwgRkFVTFRTIEFORCBCUk9BRENPTSBNQUtFUyBOTyBQUk9NSVNFUywgUkVQUkVTRU5UQVRJT05TIE9SCisgICAgV0FSUkFOVElFUywgRUlUSEVSIEVYUFJFU1MsIElNUExJRUQsIFNUQVRVVE9SWSwgT1IgT1RIRVJXSVNFLCBXSVRICisgICAgUkVTUEVDVCBUTyBUSEUgU09GVFdBUkUuICBCUk9BRENPTSBTUEVDSUZJQ0FMTFkgRElTQ0xBSU1TIEFOWSBBTkQKKyAgICBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIFRJVExFLCBNRVJDSEFOVEFCSUxJVFksIE5PTklORlJJTkdFTUVOVCwKKyAgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgTEFDSyBPRiBWSVJVU0VTLCBBQ0NVUkFDWSBPUgorICAgIENPTVBMRVRFTkVTUywgUVVJRVQgRU5KT1lNRU5ULCBRVUlFVCBQT1NTRVNTSU9OIE9SIENPUlJFU1BPTkRFTkNFCisgICAgVE8gREVTQ1JJUFRJT04uIFlPVSBBU1NVTUUgVEhFIEVOVElSRSBSSVNLIEFSSVNJTkcgT1VUIE9GIFVTRSBPUgorICAgIFBFUkZPUk1BTkNFIE9GIFRIRSBTT0ZUV0FSRS4KKyAKKzMuIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLCBJTiBOTyBFVkVOVCBTSEFMTCBCUk9BRENPTSBPUgorICAgIElUUyBMSUNFTlNPUlMgQkUgTElBQkxFIEZPUiAoaSkgQ09OU0VRVUVOVElBTCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAgICBJTkRJUkVDVCwgT1IgRVhFTVBMQVJZIERBTUFHRVMgV0hBVFNPRVZFUiBBUklTSU5HIE9VVCBPRiBPUiBJTiBBTlkKKyAgICBXQVkgUkVMQVRJTkcgVE8gWU9VUiBVU0UgT0YgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgU09GVFdBUkUgRVZFTgorICAgIElGIEJST0FEQ09NIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUzsKKyAgICBPUiAoaWkpIEFOWSBBTU9VTlQgSU4gRVhDRVNTIE9GIFRIRSBBTU9VTlQgQUNUVUFMTFkgUEFJRCBGT1IgVEhFCisgICAgU09GVFdBUkUgSVRTRUxGIE9SIFUuUy4gJDEsIFdISUNIRVZFUiBJUyBHUkVBVEVSLiBUSEVTRSBMSU1JVEFUSU9OUworICAgIFNIQUxMIEFQUExZIE5PVFdJVEhTVEFORElORyBBTlkgRkFJTFVSRSBPRiBFU1NFTlRJQUwgUFVSUE9TRSBPRiBBTlkKKyAgICBMSU1JVEVEIFJFTUVEWS4KKzo+CisqLworI2lmbmRlZiBfQkNNT0xUX1RJTUVfTUVBU1VSRU1FTlRfSF8KKyNkZWZpbmUgX0JDTU9MVF9USU1FX01FQVNVUkVNRU5UX0hfCisKKyNpbmNsdWRlIDxiY21vc19jb21tb24uaD4KKyNpbmNsdWRlIDxiY21fZGV2X2xvZy5oPgorCisvKiBIb3cgdG8gdXNlIHRoZSB0aW1lIG1lYXN1cmVtZW50IGxpYnJhcnk6CisgKiAKKyAqIEJlZm9yZSBpbmNsdWRpbmcgYmNtb2x0X3RpbWVfbWVhc3VyZW1lbnQuaCwgeW91IG11c3QgZGVmaW5lIEJDTU9MVF9USU1FX01FQVNVUkVNRU5UX1RJTUVTVEFNUC4gIFRoaXMgbWFjcm8gbXVzdCBiZQorICogZGVmaW5lZCBpbiBzdWNoIGEgd2F5IHRoYXQgdGhpcyBpcyBsZWdhbDogInVpbnQzMl90IHRpbWVzdGFtcF9pbl90aWNrcyA9IEJDTU9MVF9USU1FX01FQVNVUkVNRU5UX1RJTUVTVEFNUCgpIi4gIFdlCisgKiB1c2UgYSBtYWNybyBpbnN0ZWFkIG9mIGEgZnVuY3Rpb24gdG8gb3B0aW1pemUgZm9yIHRpbWUgKHdlIHdhbnQgdG8gYXZvaWQgdGhlIG92ZXJoZWFkIG9mIGEgZnVuY3Rpb24gY2FsbCkuCisgKgorICogWW91IGNhbiBoYXZlIGFzIG1hbnkgbmFtZWQgbWVhc3VyZW1lbnQgY2F0ZWdvcmllcyBhcyBkZXNpcmVkLiAgRm9yIGVhY2ggY2F0ZWdvcnksIHlvdSBuZWVkIHRvIGNhbGwgZWl0aGVyOgorICogLSBCQ01PTFRfVElNRV9NRUFTVVJFTUVOVF9TQU1QTEVfREVDTF9TVEFUSUMoKSAtIGlmIHRoZSBtZWFzdXJlbWVudHMgYXJlIGFsbCB0YWtlbiBpbiB0aGUgc2FtZSBmaWxlCisgKiBvcjoKKyAqIC0gQkNNT0xUX1RJTUVfTUVBU1VSRU1FTlRfU0FNUExFX0RFQ0woKSArIEJDTU9MVF9USU1FX01FQVNVUkVNRU5UX1NBTVBMRV9ERUNMX0VYVEVSTigpCisgKgorICogQXQgaW5pdCB0aW1lLCB5b3UgbXVzdCBjYWxsIGJjbW9sdF90aW1lX21lYXN1cmVtZW50X2luaXQoKS4KKyAqCisgKiBGb3IgdGhlIGFjdHVhbCBtZWFzdXJlbWVudHMsIHlvdSBtdXN0IHN1cnJvdW5kIHRoZSBjb2RlIHlvdSdyZSB0cnlpbmcgdG8gbWVhc3VyZSB3aXRoIAorICogQkNNT0xUX1RJTUVfTUVBU1VSRU1FTlRTX1NBTVBMRV9CRUZPUkUoKSBhbmQgQkNNT0xUX1RJTUVfTUVBU1VSRU1FTlRTX1NBTVBMRV9BRlRFUigpLiAgQXQgdGhlIGVuZCBvZiBhIGZ1bGwKKyAqIG1lYXN1cmVtZW50IGN5Y2xlLCB5b3UgbXVzdCBjYWxsIEJDTU9MVF9USU1FX01FQVNVUkVNRU5UU19TQU1QTEVfRU5EKCkgZm9yIGVhY2ggbmFtZWQgbWVhc3VyZW1lbnQgY2F0ZWdvcnksIHRoZW4KKyAqIGZpbmFsbHkgY2FsbCBCQ01PTFRfVElNRV9NRUFTVVJFTUVOVFNfQ1lDTEVfRU5EKCkuCisgKi8KKwordHlwZWRlZiB1aW50NjRfdCAoKkZfYmNtb2x0X3RpbWVfbWVhc3VyZW1lbnRfdGlja3NfdG9fbnMpKHVpbnQ2NF90IHRpY2tzKTsKK3R5cGVkZWYgdm9pZCAoKkZfYmNtb2x0X3RpbWVfbWVhc3VyZW1lbnRfYXZnX2RvbmUpKHZvaWQpOworCisvKiogQ2FsbGVkIGZvciBlYWNoIG1lYXN1cmVtZW50IGNhdGVnb3J5IGF0IGNvbXBpbGUgdGltZSAoc2VlIGhvdy10byBhdCB0b3Agb2YgZmlsZSkuICovCisjZGVmaW5lIEJDTU9MVF9USU1FX01FQVNVUkVNRU5UX1NBTVBMRV9ERUNMX1NUQVRJQyhtZWFzdXJlbWVudF9uYW1lKSBcCisgICAgc3RhdGljIHVpbnQzMl90IG1lYXN1cmVtZW50X25hbWUgIyMgX3N0YXJ0X3RpY2s7IFwKKyAgICBzdGF0aWMgdWludDY0X3QgbWVhc3VyZW1lbnRfbmFtZSAjIyBfdG90YWxfdGlja3M7IFwKKyAgICBzdGF0aWMgdWludDMyX3QgbWVhc3VyZW1lbnRfbmFtZSAjIyBfbnVtX29mX3NhbXBsZXM7CisKKy8qKiBDYWxsZWQgZm9yIGVhY2ggbWVhc3VyZW1lbnQgY2F0ZWdvcnkgYXQgY29tcGlsZSB0aW1lIChzZWUgaG93LXRvIGF0IHRvcCBvZiBmaWxlKS4gKi8KKyNkZWZpbmUgQkNNT0xUX1RJTUVfTUVBU1VSRU1FTlRfU0FNUExFX0RFQ0wobWVhc3VyZW1lbnRfbmFtZSkgXAorICAgIHVpbnQzMl90IG1lYXN1cmVtZW50X25hbWUgIyMgX3N0YXJ0X3RpY2s7IFwKKyAgICB1aW50NjRfdCBtZWFzdXJlbWVudF9uYW1lICMjIF90b3RhbF90aWNrczsgXAorICAgIHVpbnQzMl90IG1lYXN1cmVtZW50X25hbWUgIyMgX251bV9vZl9zYW1wbGVzOworCisvKiogQ2FsbGVkIGZvciBlYWNoIG1lYXN1cmVtZW50IGNhdGVnb3J5IGF0IGNvbXBpbGUgdGltZSAoc2VlIGhvdy10byBhdCB0b3Agb2YgZmlsZSkuICovCisjZGVmaW5lIEJDTU9MVF9USU1FX01FQVNVUkVNRU5UX1NBTVBMRV9ERUNMX0VYVEVSTihtZWFzdXJlbWVudF9uYW1lKSBcCisgICAgZXh0ZXJuIHVpbnQzMl90IG1lYXN1cmVtZW50X25hbWUgIyMgX3N0YXJ0X3RpY2s7IFwKKyAgICBleHRlcm4gdWludDY0X3QgbWVhc3VyZW1lbnRfbmFtZSAjIyBfdG90YWxfdGlja3M7IFwKKyAgICBleHRlcm4gdWludDMyX3QgbWVhc3VyZW1lbnRfbmFtZSAjIyBfbnVtX29mX3NhbXBsZXM7CisKKy8qKiBDYWxsZWQgYmVmb3JlIGVhY2ggYmxvY2sgb2YgY29kZSB0aGF0IG5lZWRzIHRvIGJlIHRpbWVkIChzZWUgaG93LXRvIGF0IHRvcCBvZiBmaWxlKS4gKi8KKyNkZWZpbmUgQkNNT0xUX1RJTUVfTUVBU1VSRU1FTlRTX1NBTVBMRV9CRUZPUkUobWVhc3VyZW1lbnRfbmFtZSkgXAorICAgIGRvIFwKKyAgICB7IFwKKyAgICAgICAgbWVhc3VyZW1lbnRfbmFtZSAjIyBfc3RhcnRfdGljayA9IEJDTU9MVF9USU1FX01FQVNVUkVNRU5UX1RJTUVTVEFNUCgpOyBcCisgICAgfSBcCisgICAgd2hpbGUgKDApCisKKy8qKiBDYWxsZWQgYWZ0ZXIgZWFjaCBibG9jayBvZiBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgdGltZWQgKHNlZSBob3ctdG8gYXQgdG9wIG9mIGZpbGUpLiAqLworI2RlZmluZSBCQ01PTFRfVElNRV9NRUFTVVJFTUVOVFNfU0FNUExFX0FGVEVSKG1lYXN1cmVtZW50X25hbWUpIFwKKyAgICBkbyBcCisgICAgeyBcCisgICAgICAgIC8qIEV2ZW4gaWYgdGltZXN0YW1wIG92ZXJmbG93cyB3ZSBhcmUgc3RpbGwgb2sgLSB1bnNpZ25lZCBhcml0aG1ldGljIHdpbGwgc3RpbGwgYmUgdmFsaWQuICovIFwKKyAgICAgICAgbWVhc3VyZW1lbnRfbmFtZSAjIyBfdG90YWxfdGlja3MgKz0gQkNNT0xUX1RJTUVfTUVBU1VSRU1FTlRfVElNRVNUQU1QKCkgLSBtZWFzdXJlbWVudF9uYW1lICMjIF9zdGFydF90aWNrOyBcCisgICAgICAgICsrbWVhc3VyZW1lbnRfbmFtZSAjIyBfbnVtX29mX3NhbXBsZXM7IFwKKyAgICB9IFwKKyAgICB3aGlsZSAoMCkKKworLyoqIENhbGxlZCBmb3IgZWFjaCBtZWFzdXJlbWVudCBjYXRlZ29yeSBhdCB0aGUgZW5kIG9mIGEgY3ljbGUgKHNlZSBob3ctdG8gYXQgdG9wIG9mIGZpbGUpLiAqLworI2RlZmluZSBCQ01PTFRfVElNRV9NRUFTVVJFTUVOVFNfU0FNUExFX0VORChtZWFzdXJlbWVudF9uYW1lKSBcCisgICAgZG8gXAorICAgIHsgXAorICAgICAgICBiY21vbHRfdGltZV9tZWFzdXJlbWVudF9zYW1wbGVfZW5kKCBcCisgICAgICAgICAgICAmbWVhc3VyZW1lbnRfbmFtZSAjIyBfdG90YWxfdGlja3MsIFwKKyAgICAgICAgICAgICZtZWFzdXJlbWVudF9uYW1lICMjIF9udW1fb2Zfc2FtcGxlcywgXAorICAgICAgICAgICAgIyBtZWFzdXJlbWVudF9uYW1lKTsgXAorICAgIH0gXAorICAgIHdoaWxlICgwKQorCisvKiogQ2FsbGVkIHdoZW4gdGhlIGVudGlyZSBtZWFzdXJlbWVudCBjeWNsZSBpcyBjb21wbGV0ZSAoc2VlIGhvdy10byBhdCB0b3Agb2YgZmlsZSkuICovCisjZGVmaW5lIEJDTU9MVF9USU1FX01FQVNVUkVNRU5UU19DWUNMRV9FTkQoKSBiY21vbHRfdGltZV9tZWFzdXJlbWVudF9jeWNsZV9lbmQoKQorCisvKiogTXVzdCBiZSBjYWxsZWQgYXQgaW5pdCB0aW1lIHRvIGluaXRpYWxpemUgdGhlIHRpbWUgbWVhc3VyZW1lbnQgbGlicmFyeS4KKyAqIFxwYXJhbSBsb2dfaWQgICAgICAgICAgICAgICAgIExvZyBJRCB0byB1c2UgZm9yIGRpc3BsYXlpbmcgZGF0YSAod2lsbCB1c2UgJ0RFQlVHJyBsb2cgbGV2ZWwpLgorICogXHBhcmFtIG51bV9jeWNsZXNfZm9yX2F2ZXJhZ2UgTnVtYmVyIG9mIG1lYXN1cmVtZW50IGN5Y2xlcyB0byBydW4gYmVmb3JlIGNhbGN1bGF0aW5nIGFuZCBsb2dnaW5nIGF2ZXJhZ2VzLgorICogXHBhcmFtIHRpY2tzX3RvX25zICAgICAgICAgICAgRnVuY3Rpb24gdGhhdCB0cmFuc2xhdGVzIHRpbWVzdGFtcCByZXNvbHV0aW9uICh0aWNrcykgaW50byBuYW5vc2Vjb25kcy4KKyAqIFxwYXJhbSBhdmdfZG9uZSAgICAgICAgICAgICAgIEZ1bmN0aW9uIHRvIGNhbGwgYWZ0ZXIgYXZlcmFnZXMgaGF2ZSBiZWVuIGNvbXB1dGVkIChlLmcuIHRvIGxvZyBhIGN1c3RvbSBoZWFkZXIpLgorICovCit2b2lkIGJjbW9sdF90aW1lX21lYXN1cmVtZW50X2luaXQoCisgICAgZGV2X2xvZ19pZCBsb2dfaWQsCisgICAgdWludDMyX3QgbnVtX2N5Y2xlc19mb3JfYXZlcmFnZSwKKyAgICBGX2JjbW9sdF90aW1lX21lYXN1cmVtZW50X3RpY2tzX3RvX25zIHRpY2tzX3RvX25zLAorICAgIEZfYmNtb2x0X3RpbWVfbWVhc3VyZW1lbnRfYXZnX2RvbmUgYXZnX2RvbmUpOworCisvKiogRG8gbm90IGNhbGwgdGhpcyBkaXJlY3RseSAtIGNhbGwgQkNNT0xUX1RJTUVfTUVBU1VSRU1FTlRTX1NBTVBMRV9FTkQoKSBpbnN0ZWFkLiAqLwordm9pZCBiY21vbHRfdGltZV9tZWFzdXJlbWVudF9zYW1wbGVfZW5kKHVpbnQ2NF90ICp0b3RhbF90aWNrcywgdWludDMyX3QgKm51bV9vZl9zYW1wbGVzLCBjb25zdCBjaGFyICptZWFzdXJlbWVudF9uYW1lKTsKKworLyoqIERvIG5vdCBjYWxsIHRoaXMgZGlyZWN0bHkgLSBjYWxsIEJDTU9MVF9USU1FX01FQVNVUkVNRU5UU19DWUNMRV9FTkQoKSBpbnN0ZWFkLiAqLwordm9pZCBiY21vbHRfdGltZV9tZWFzdXJlbWVudF9jeWNsZV9lbmQodm9pZCk7CisKKyNlbmRpZiAvKiBfQkNNT0xUX1RJTUVfTUVBU1VSRU1FTlRfSF8gKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZGY3OTUKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL01ha2VmaWxlCkBAIC0wLDAgKzEsMjggQEAKK2lmZXEgKCIkKEVOQUJMRV9DTEkpIiwgInkiKQorCU1PRF9OQU1FID0gYmNtX3VzZXJfYXBwbAorCU1PRF9UWVBFID0gYXBwCisJTU9EX0RFUFMgPSBob3N0X2FwaSBhcGlfZGV2X2xvZyBiY21fYm9hcmQgYmNtX3VzZXJfYXBwbF9wcyBiY21fdXNlcl9hcHBsX2VvbiBiY21fdXNlcl9hcHBsX29tb24gXAorICAgICAgICAgICAgICAgIGJjbV91c2VyX2FwcGxfZXBvbl9vYW0gYmNtX3VzZXJfYXBwbF9lcG9uX29hbV9jbGkgcGNpZSBwY2llX21vZCBcCisgICAgICAgICAgICAgICAgYmNtX3VzZXJfYXBwbF9lcG9uX2hkZSBiY21fYXBpX3Byb3h5IGNvbW1vbl9lcG9uX29hbSBjb21tb25fZ3BvbiBiY21faW1hZ2VfdHJhbnNmZXIgYmNtX3N3X3VwZ3JhZGUgXAorICAgICAgICAgICAgICAgIGRldmljZV9zZWxlY3RvciBiY21fcmVtb3RlX2NsaSBiY21fdXNlcl9hcHBsX3BsYXliYWNrIGJjbV91c2VyX2FwcGxfZHBvZV9zZWMKKworaWZuZXEgKCIkKFJFTEVBU0VfQlVJTEQpIiwgInkiKQorICAgIE1PRF9ERVBTICs9CWJjbV91c2VyX2FwcGxfZ3Bvbl9zdHJlc3MgYmNtX3VzZXJfYXBwbF9ncG9uX2RzX29tY2kgXAorICAgICAgICAgICAgICAgIGJjbV91c2VyX2FwcGxfZ3Bvbl9zbl9hY3F1aXNpdGlvbiBiY21fdXNlcl9hcHBsX2dwb25fc3RhdGlzdGljcyBcCisgICAgICAgICAgICAgICAgYmNtX3VzZXJfYXBwbF9ncG9uX21hY19sZWFybmluZyBiY21fdXNlcl9hcHBsX2dwb25fcnNzaSBcCisJCWJjbV91c2VyX2FwcGxfb21jaV9zd2RsIGJjbV91c2VyX2FwcGxfcmVtb3RlX2xvZ2dlciBiY21fdXNlcl9hcHBsX29udV90dW5pbmcKK2VuZGlmCisKKwlNT0RfSU5DX0RJUlMgPSAkKFRPUCkvaG9zdC9ib2FyZC93cnggJChUT1ApL2NvbW1vbi9kcml2ZXJzL21hcGxlL3BjaWUKKwlzcmNzID0gYmNtb2x0X3VzZXJfYXBwbC5jIGJjbW9sdF91c2VyX2FwcGxfY2xpLmMgYmNtb2x0X3VzZXJfYXBwbF9leF9jbGkuYyBiY21vbHRfdXNlcl9hcHBsX2dwb25fdXRpbHMuYworCisJaWZlcSAoIiQoT1NfS0VSTkVMKSIsICJsaW51eCIpCisJCU1PRF9ERVBTICs9IGRldl9sb2dfbGludXgKKwllbmRpZgorCWlmZXEgKCQoRU5BQkxFX0tUMiksIHkpCisJCU1PRF9ERUZTICs9IC1ERU5BQkxFX0tUMgorCQkjRVhUUkFfSU5DTFVERVMgKz0gLUkkKFRPUF9ESVIpL2NvbW1vbi9jbGkKKwllbmRpZgorCisJTU9EX0RFUFMgKz0gdHJhbnNwb3J0CitlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9iY21vbHRfdXNlcl9hcHBsLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2JjbW9sdF91c2VyX2FwcGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzljMzE0Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9iY21vbHRfdXNlcl9hcHBsLmMKQEAgLTAsMCArMSw1MjAgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpbmNsdWRlIDxiY21vbHRfaG9zdF9hcGkuaD4KKyNpbmNsdWRlIDxiY21vbHRfYm9hcmQuaD4KKyNpbmNsdWRlIDxiY21vbHRfYm9hcmRfY2xpLmg+CisjaW5jbHVkZSA8YmNtb2x0X3VzZXJfYXBwbF9jbGkuaD4KKyNpbmNsdWRlIDxiY21vbHRfdXNlcl9hcHBsX2V4X2NsaS5oPgorI2luY2x1ZGUgPGJjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW0uaD4KKyNpZiBkZWZpbmVkKExJTlVYX0tFUk5FTF9TUEFDRSkKKyNpbmNsdWRlIDxiY21vbHRfZGV2X2xvZ19saW51eC5oPgorI2VuZGlmCisjaW5jbHVkZSA8YmNtb2x0X2Rldl9zZWxlY3Rvci5oPgorI2luY2x1ZGUgPGJjbV9hcGlfY2xpLmg+CisjaW5jbHVkZSA8YmNtb2x0X2FwaV9wcm94eS5oPgorI2luY2x1ZGUgPGJjbW9sdF9yZW1vdGVfY2xpLmg+CisjaW5jbHVkZSA8YmNtb2x0X2ltYWdlX3RyYW5zZmVyLmg+CisKKyNpZmRlZiBTSU1VTEFUSU9OX0JVSUxECisgICAgc3RhdGljIHZvaWQgdXNpbmdfaW5iYW5kX3NldChiY21vc19ib29sIHVzaW5nX2luYmFuZCl7fQorICAgIHN0YXRpYyBiY21vc19ib29sIHVzaW5nX2luYmFuZF9nZXQodm9pZCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisgICAgZXh0ZXJuIHVpbnQzMl90IGJjbXRyX2hvc3RfaXA7CisgICAgZXh0ZXJuIHVpbnQxNl90IGJjbXRyX2hvc3RfdWRwX3BvcnQ7CisgICAgZXh0ZXJuIHVpbnQzMl90IGJjbXRyX29sdF9pcFtCQ01UUl9NQVhfT0xUU107CisgICAgZXh0ZXJuIHVpbnQxNl90IGJjbXRyX29sdF91ZHBfcG9ydFtCQ01UUl9NQVhfT0xUU107CisjZWxzZQorICAgICNpbmNsdWRlIDxiY210cl9wbHVnaW4uaD4KKyNlbmRpZgorCisKKyNkZWZpbmUgQ0xJX0hPU1RfUFJPTVBUX0ZPUk1BVCAiQkNNLiV1PiAiCisKK3N0YXRpYyBiY21jbGlfc2Vzc2lvbiAqY3VycmVudF9zZXNzaW9uOworCisvLyNpZiBkZWZpbmVkKFNJTVVMQVRJT05fQlVJTEQpICYmIGRlZmluZWQoTElOVVhfVVNFUl9TUEFDRSkKKy8vZXh0ZXJuIHVpbnQzMl90IGJjbXRyX2hvc3RfaXA7CisvL2V4dGVybiB1aW50MTZfdCBiY210cl9ob3N0X3VkcF9wb3J0OworLy9leHRlcm4gdWludDMyX3QgYmNtdHJfb2x0X2lwW0JDTVRSX01BWF9PTFRTXTsKKy8vZXh0ZXJuIHVpbnQxNl90IGJjbXRyX29sdF91ZHBfcG9ydFtCQ01UUl9NQVhfT0xUU107CisvLyNlbmRpZgorCisjaWZkZWYgRU5BQkxFX0xPRworc3RhdGljIGludCBub2xvZ2dlcj0wOworI2VuZGlmCisKK3N0YXRpYyBpbnQgX2NtZF91c2luZ19pbmJhbmQoYmNtY2xpX3Nlc3Npb24gKnNlc3MsIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5QYXJtcykKK3sKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzLCAiTWFwbGUgbWFuYWdlbWVudCB1c2luZyAlc1xuIiwgKHVzaW5nX2luYmFuZF9nZXQoKSk/ICJJbi1CYW5kIiA6ICJQQ0llIik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX2NsaV9oZWxwKGNvbnN0IGNoYXIgKmNtZCkKK3sKKyAgICBjb25zdCBjaGFyICpwOworCisgICAgd2hpbGUgKChwID0gc3RyY2hyKGNtZCwgJy8nKSkpCisgICAgeworICAgICAgICBjbWQgPSBwICsgMTsKKyAgICB9CisKKyAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICIlcyBbLWwgPGxldmVsPl0iCisjaWYgZGVmaW5lZChTSU1VTEFUSU9OX0JVSUxEKSAmJiBkZWZpbmVkKExJTlVYX1VTRVJfU1BBQ0UpCisgICAgICAgICAgICAiIFstcCB1ZHBfcG9ydF9kZXZpY2UxXSBbLXAgdWRwX3BvcnRfZGV2aWNlMl0gLi4uXG4iCisgICAgICAgICAgICAiT1JcbiIKKyAgICAgICAgICAgICIgWy1vbHQgaXBfZGV2aWNlMTpwb3J0X2RldmljZTFdIFstb2x0IGlwX2RldmljZTI6cG9ydF9kZXZpY2UyXSAuLi5cbiIKKyAgICAgICAgICAgICIgWy1saXN0ZW4gaXA6cG9ydF1cbiIKKyNlbmRpZgorI2lmZGVmIEVOQUJMRV9MT0cKKyAgICAgICAgICAgICIgWy1ubF1cbiIKKyNlbmRpZgorICAgICAgICAgICAgIiBbLW5lXVxuIgorICAgICAgICAgICAgIiBbLWRldl1cbiIKKyAgICAgICAgICAgICIgWy1pZl9tYXNrIG1hc2tdXG4iCisgICAgICAgICAgICAiIFstcHJveHkgcHJveHlfcG9ydF9kZXZpY2UxXSBbLXByb3h5IHByb3h5X3BvcnRfZGV2aWNlMl0gLi4uXG4iCisgICAgICAgICAgICAiIFstdWRdXG4iCisgICAgICAgICAgICAiIFstb25fcmVhZHkgY21kXVxuIiwgY21kKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICJcdFx0IGxldmVsID09IGd1ZXN0IHwgYWRtaW4gfCBkZWJ1Z1xuIgorI2lmZGVmIEVOQUJMRV9MT0cKKyAgICAgICAgICAgICJcdFx0IC1ubCAtIGRpc2FibGUga2VybmVsIGxvZ2dlciBpbnRlZ3JhdGlvblxuIgorI2VuZGlmCisgICAgICAgICAgICAiXHRcdCAtbmUgLSBkaXNhYmxlIGxpbmUgZWRpdGluZ1xuIgorICAgICAgICAgICAgIlx0XHQgLWRldiAtIGRldmljZSBJRCB0byBhdXRvLXJlZ2lzdGVyIGZvciBpbmRpY2F0aW9ucyBhbmQgcnVuIHByb3h5IG9uIChkZWZhdWx0IDApXG4iCisgICAgICAgICAgICAiXHRcdCAtaWZfbWFzayAtIFBPTiBOSSBtYXNrIHRvIGFwcGx5IHRvIGF1dG8tcmVnaXN0cmF0aW9uIG9mIGluZGljYXRpb25zXG4iCisgICAgICAgICAgICAiXHRcdCAtcHJveHkgLSBydW4gdGhlIEFQSSBwcm94eSBsaXN0ZW5pbmcgb24gdGhpcyBVRFAgcG9ydFxuIgorICAgICAgICAgICAgIlx0XHQgLXVkIC0gdXNlIGEgdW5peCBkb21haW4gY29ubmVjdGlvbiB0byBhIHVzZXIgc3BhY2UgZGV2aWNlIGNvbnRyb2wiCisgICAgICAgICAgICAiXHRcdCAtb25fcmVhZHkgLSBjb21tYW5kIGZvciBBUEkgcHJveHkgdG8gZXhlY3V0ZSBhZnRlciByZWNlaXZpbmcgZGV2aWNlIHJlYWR5IGluZGljYXRpb25cbiIpOworICAgIHJldHVybiAtRUlOVkFMOworfQorCisvKiBxdWl0IGNvbW1hbmQgaGFuZGxlciAqLworc3RhdGljIGludCBfY21kX3F1aXQoYmNtY2xpX3Nlc3Npb24gKnNlc3MsIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5QYXJtcykKK3sKKyAgICBiY21jbGlfc3RvcChzZXNzKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzLCAiTWFwbGUgQ0xJIHRlcm1pbmF0ZWQgYnkgJ1F1aXQnIGNvbW1hbmRcbiIpOworICAgIHJldHVybiAwOworfQorCisjaWYgZGVmaW5lZChTSU1VTEFUSU9OX0JVSUxEKSAmJiBkZWZpbmVkKExJTlVYX1VTRVJfU1BBQ0UpCisvKiBwYXJzZSBpcDpwb3J0ICovCitzdGF0aWMgYmNtb3NfZXJybm8gX3BhcnNlX2lwX3BvcnQoY29uc3QgY2hhciAqcywgdWludDMyX3QgKmlwLCB1aW50MTZfdCAqcG9ydCkKK3sKKyAgICBpbnQgbjsKKyAgICB1aW50MzJfdCBpcDEsIGlwMiwgaXAzLCBpcDQsIHBwOworCisgICAgbiA9IHNzY2FuZihzLCAiJXUuJXUuJXUuJXU6JXUiLCAmaXAxLCAmaXAyLCAmaXAzLCAmaXA0LCAmcHApOworICAgIGlmIChuICE9IDUgfHwgaXAxID4gMHhmZiB8fCBpcDIgPiAweGZmIHx8IGlwMyA+IDB4ZmYgfHwgaXA0ID4gMHhmZiB8fCBwcCA+IDB4ZmZmZikKKyAgICB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2FuJ3QgcGFyc2UgJXMuIE11c3QgYmUgaXBfYWRkcmVzczpwb3J0XG4iLCBzKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgKmlwID0gKGlwMSA8PCAyNCkgfCAoaXAyIDw8IDE2KSB8IChpcDMgPDwgOCkgfCBpcDQ7CisgICAgKnBvcnQgPSBwcDsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKyNlbmRpZgorCisvKiBUcnkgdG8gbGVhcm4gc3lzdGVtIG1vZGUgKi8KK3N0YXRpYyBiY21vbHRfc3lzdGVtX21vZGUgX2dldF9zeXN0ZW1fbW9kZShiY21vbHRfZGV2aWQgZGV2KQoreworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGtleSA9IHt9OworICAgIGJjbW9sdF9kZXZpY2VfY2ZnIGRldl9jZmc7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmRldl9jZmcsIGRldmljZSwga2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZkZXZfY2ZnLCBkZXZpY2UsIHN5c3RlbV9tb2RlKTsKKyAgICByYyA9IGJjbW9sdF9jZmdfZ2V0KGRldiwgJmRldl9jZmcuaGRyKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIGJjbW9zX3ByaW50ZigiRGV2aWNlICV1OiBmYWlsZWQgdG8gcmVhZCBzeXN0ZW0gbW9kZSAoJXMpLiBXYWl0aW5nIGZvciBjb25maWd1cmF0aW9uXG4iLAorICAgICAgICAgICAgKHVuc2lnbmVkKWRldiwgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICAgICAgcmV0dXJuIEJDTU9MVF9TWVNURU1fTU9ERV9fTlVNX09GOworICAgIH0KKyAgICBiY21vc19wcmludGYoIkRldmljZSAldTogU3lzdGVtIG1vZGU6ICVzXG4iLAorICAgICAgICAodW5zaWduZWQpZGV2LCBiY21vbHRfc3lzdGVtX21vZGVfbmFtZShkZXZfY2ZnLmRhdGEuc3lzdGVtX21vZGUpKTsKKyAgICByZXR1cm4gZGV2X2NmZy5kYXRhLnN5c3RlbV9tb2RlOworfQorCisjaWZkZWYgRU5BQkxFX0xPRworc3RhdGljIGludCBkZXZfbG9nX3RpbWVfdG9fc3RyX2NiKHVpbnQzMl90IHRpbWVfc3RhbXAsIGNoYXIgKnRpbWVfc3RyLCBpbnQgdGltZV9zdHJfc2l6ZSkKK3sKKyAgICByZXR1cm4gc25wcmludGYodGltZV9zdHIsIHRpbWVfc3RyX3NpemUsICIldSIsIHRpbWVfc3RhbXAgLyAxMDAwKTsgLyogY29udmVydCBmcm9tIHVzZWMgdG8gbXNlYy4gKi8KK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbV9pbml0X2xvZ2dlcih2b2lkKQoreworI2RlZmluZSBERVZfTE9HX1NJWkUxIDE8PDExCisjZGVmaW5lIERFVl9MT0dfU0laRTIgMTw8MTMKKyNkZWZpbmUgREVWX0xPR19RVUVVRV9TSVpFIDEwMDAKKworICAgIHN0YXRpYyB1aW50OF90IGxvZ2dlcl9idWYxW0RFVl9MT0dfU0laRTFdOworICAgIHN0YXRpYyB1aW50OF90IGxvZ2dlcl9idWYyW0RFVl9MT0dfU0laRTJdOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICB2b2lkICphZGRyZXNzZXNbREVWX0xPR19NQVhfRklMRVNdID0ge2xvZ2dlcl9idWYxLCBsb2dnZXJfYnVmMn07CisgICAgdWludDMyX3Qgc2l6ZXNbREVWX0xPR19NQVhfRklMRVNdID0ge3NpemVvZihsb2dnZXJfYnVmMSksIHNpemVvZihsb2dnZXJfYnVmMil9OworICAgIHVpbnQzMl90IGZsYWdzW0RFVl9MT0dfTUFYX0ZJTEVTXSA9IHtCQ01fREVWX0xPR19GSUxFX0ZMQUdfU1RPUF9XSEVOX0ZVTEwsIEJDTV9ERVZfTE9HX0ZJTEVfRkxBR19XUkFQX0FST1VORH07CisKKyAgICBlcnIgPSBiY21fZGV2X2xvZ19pbml0X2RlZmF1bHRfbG9nZ2VyKGFkZHJlc3Nlcywgc2l6ZXMsIGZsYWdzLCBCQ01fU0laRU9GQVJSQVkoYWRkcmVzc2VzKSwgMHg0MDAwLCBUQVNLX1BSSU9SSVRZX0RFVl9MT0csIERFVl9MT0dfUVVFVUVfU0laRSk7CisgICAgQkNNT1NfVFJBQ0VfQ0hFQ0tfUkVUVVJOKGVyciwgZXJyLCAiYmNtX2Rldl9sb2dfaW5pdGlhbGl6ZV9kZXZfbG9nZ2VyX2RlZmF1bHQoKVxuIik7CisKKyAgICBiY21fZGV2X2xvZ19sZXZlbF9zZXRfc3R5bGUoREVWX0xPR19MRVZFTF9GQVRBTCwgQkNNX0RFVl9MT0dfU1RZTEVfQk9MRCk7CisgICAgYmNtX2Rldl9sb2dfbGV2ZWxfc2V0X3N0eWxlKERFVl9MT0dfTEVWRUxfRVJST1IsIEJDTV9ERVZfTE9HX1NUWUxFX0JPTEQpOworCisgICAgYmNtX2Rldl9sb2dfc2V0X3RpbWVfdG9fc3RyX2NiKGRldl9sb2dfdGltZV90b19zdHJfY2IpOworCisjaWYgZGVmaW5lZChMSU5VWF9LRVJORUxfU1BBQ0UpCisgICAgaWYgKCFub2xvZ2dlcikKKyAgICB7CisgICAgICAgIGVyciA9IGJjbV9kZXZfbG9nX2xpbnV4X2luaXQoKTsKKyAgICAgICAgQkNNT1NfVFJBQ0VfQ0hFQ0tfUkVUVVJOKGVyciwgZXJyLCAiYmNtX2Rldl9sb2dfbGludXhfaW5pdCgpXG4iKTsKKyAgICB9CisjZW5kaWYKKworICAgIEJDTV9MT0coSU5GTywgZGVmX2xvZ19pZCwgIkhlbGxvIExvZ2dlclxuIik7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBoYW5kbGVfc3lzdGVtX21vZGVfY2hhbmdlKGJjbW9sdF9kZXZpZCBkZXYpCit7CisgICAgYmNtY2xpX2VudHJ5ICpjdXJfZGlyID0gYmNtY2xpX2Rpcl9nZXQoY3VycmVudF9zZXNzaW9uKTsKKyAgICBjaGFyIG9sZF9kaXJfbmFtZVszMl0gPSAiIjsKKyAgICBiY21vbHRfc3lzdGVtX21vZGUgc3lzdGVtX21vZGU7CisKKyAgICBiY21vbHRfc3lzdGVtX21vZGVfZ2V0KGRldiwgJnN5c3RlbV9tb2RlKTsKKyAgICBiY21fY29tbW9uX2dwb25faW5pdChzeXN0ZW1fbW9kZSk7CisKKyAgICBpZiAoZGV2ID09IGN1cnJlbnRfZGV2aWNlKQorICAgIHsKKyAgICAgICAgaWYgKGN1cl9kaXIpCisgICAgICAgICAgICBzdHJuY3B5KG9sZF9kaXJfbmFtZSwgYmNtY2xpX3Rva2VuX25hbWUoY3VyX2RpciksIHNpemVvZihvbGRfZGlyX25hbWUpIC0gMSk7CisKKyAgICAgICAgYXBpX2NsaV9zZXRfY29tbWFuZHMoY3VycmVudF9zZXNzaW9uKTsKKworICAgICAgICAvKiBSZXN0b3JlIGN1cnJlbnQgQ0xJIGRpcmVjdG9yeSAqLworICAgICAgICBjdXJfZGlyID0gYmNtY2xpX2Rpcl9maW5kKE5VTEwsIG9sZF9kaXJfbmFtZSk7CisgICAgICAgIGlmIChjdXJfZGlyKQorICAgICAgICAgICAgYmNtY2xpX2Rpcl9zZXQoY3VycmVudF9zZXNzaW9uLCBjdXJfZGlyKTsKKyAgICB9CisKKyAgICBiY21vbHRfdXNlcl9hcHBsX2NsaV9oYW5kbGVfc3lzdGVtX21vZGVfY2hhbmdlKGRldik7Cit9CisKK3N0YXRpYyB2b2lkIGNsaV9nZXRfcHJvbXB0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjaGFyICpidWYsIHVpbnQzMl90IG1heF9sZW4pCit7CisgICAgc25wcmludGYoYnVmLCBtYXhfbGVuLCBDTElfSE9TVF9QUk9NUFRfRk9STUFULCBjdXJyZW50X2RldmljZSk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgYmNtY2xpX3Nlc3Npb25fcGFybSBtb25fc2Vzc2lvbl9wYXJtOworI2lmbmRlZiBTSU1VTEFUSU9OX0JVSUxECisgICAgdWludDMyX3QgZnBnYV92ZXJzaW9uOworI2VuZGlmCisgICAgaW50IG5vZWRpdCA9IDA7CisgICAgaW50IHJjOworICAgIGludCBpOworICAgIGJjbW9sdF9ob3N0X2luaXRfcGFyYW1zIHBhcmFtcyA9CisgICAgeworI2lmZGVmIEVOQUJMRV9MT0cKKyAgICAgICAgLmxvZ2dlcl9pbml0X2NiID0gYmNtX2luaXRfbG9nZ2VyLAorI2VuZGlmCisgICAgICAgIC5ydW5fZGV2X2N0cmwgPSBCQ01PU19GQUxTRQorICAgIH07CisgICAgYmNtb2x0X2RldmlkIGRldmljZSA9IDA7CisgICAgYmNtb3NfYm9vbCBzcGVjaWZpY19kZXZpY2UgPSBCQ01PU19GQUxTRTsKKyAgICBiY21vc19ib29sIHJ1bl9wcm94eSA9IEJDTU9TX0ZBTFNFOworICAgIGJjbW9zX2Jvb2wgcnVuX3JlbW90ZV9jbGkgPSBCQ01PU19GQUxTRTsKKyAgICB1aW50MzJfdCBwcm94eV9wb3J0W0JDTVRSX01BWF9PTFRTXSA9IHt9OworICAgIHVpbnQzMl90IHJlbW90ZV9jbGlfcG9ydCA9IDA7CisgICAgaW50IGN1cl9wcm94eV9kZXYgPSAwOworICAgIGNoYXIgKm9uX3JlYWR5X2NtZCA9IE5VTEw7CisgICAgc3RydWN0IGJjbW9sdF9yeF9jZmcgcnhfY2ZnID0KKyAgICB7CisgICAgICAgIC5vYmpfdHlwZSA9IEJDTU9MVF9PQkpFQ1RfQU5ZLAorICAgICAgICAuZmxhZ3MgPSBCQ01PTFRfQVVUT19GTEFHU19OT05FLAorICAgIH07CisjaWYgZGVmaW5lZChTSU1VTEFUSU9OX0JVSUxEKSAmJiBkZWZpbmVkKExJTlVYX1VTRVJfU1BBQ0UpCisgICAgaW50IGN1cl9vbHQgPSAwOworI2VuZGlmCisKKyAgICAodm9pZClub2VkaXQ7IC8qIHByZXZlbnQgd2FybmluZyAqLworCisgICAgbWVtc2V0KCZtb25fc2Vzc2lvbl9wYXJtLCAwLCBzaXplb2YobW9uX3Nlc3Npb25fcGFybSkpOworICAgIG1vbl9zZXNzaW9uX3Bhcm0uZ2V0X3Byb21wdCA9IGNsaV9nZXRfcHJvbXB0OworICAgIG1vbl9zZXNzaW9uX3Bhcm0uYWNjZXNzX3JpZ2h0ID0gQkNNQ0xJX0FDQ0VTU19BRE1JTjsKKworICAgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspCisgICAgeworICAgICAgICBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWwiKSkKKyAgICAgICAgeworICAgICAgICAgICAgKytpOworICAgICAgICAgICAgaWYgKCFzdHJjbXAoYXJndltpXSwgImFkbWluIikpCisgICAgICAgICAgICAgICAgbW9uX3Nlc3Npb25fcGFybS5hY2Nlc3NfcmlnaHQgPSBCQ01DTElfQUNDRVNTX0FETUlOOworICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiZ3Vlc3QiKSkKKyAgICAgICAgICAgICAgICBtb25fc2Vzc2lvbl9wYXJtLmFjY2Vzc19yaWdodCA9IEJDTUNMSV9BQ0NFU1NfR1VFU1Q7CisgICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICJkZWJ1ZyIpKQorICAgICAgICAgICAgICAgIG1vbl9zZXNzaW9uX3Bhcm0uYWNjZXNzX3JpZ2h0ID0gQkNNQ0xJX0FDQ0VTU19ERUJVRzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NsaV9oZWxwKGFyZ3ZbMF0pOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1uZSIpKQorICAgICAgICB7CisgICAgICAgICAgICBub2VkaXQgPSAxOworICAgICAgICB9CisjaWZkZWYgRU5BQkxFX0xPRworICAgICAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItbmwiKSkKKyAgICAgICAgeworICAgICAgICAgICAgbm9sb2dnZXIgPSAxOworICAgICAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFNJTVVMQVRJT05fQlVJTEQpICYmIGRlZmluZWQoTElOVVhfVVNFUl9TUEFDRSkKKyAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLXAiKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGN1cl9vbHQgPj0gQkNNVFJfTUFYX09MVFMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJUb28gbWFueSAtcCBhbmQvb3IgLW9sdCBvcHRpb25zXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK2k7CisgICAgICAgICAgICBiY210cl9vbHRfdWRwX3BvcnRbY3VyX29sdF0gPSBzdHJ0b2woYXJndltpXSwgTlVMTCwgMCk7CisgICAgICAgICAgICArK2N1cl9vbHQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLW9sdCIpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY3VyX29sdCA+PSBCQ01UUl9NQVhfT0xUUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIlRvbyBtYW55IC1wIGFuZC9vciAtb2x0IG9wdGlvbnNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgIGlmIChfcGFyc2VfaXBfcG9ydChhcmd2W2ldLCAmYmNtdHJfb2x0X2lwW2N1cl9vbHRdLCAmYmNtdHJfb2x0X3VkcF9wb3J0W2N1cl9vbHRdKSAhPSBCQ01fRVJSX09LKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICsrY3VyX29sdDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItbGlzdGVuIikpCisgICAgICAgIHsKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgIGlmIChfcGFyc2VfaXBfcG9ydChhcmd2W2ldLCAmYmNtdHJfaG9zdF9pcCwgJmJjbXRyX2hvc3RfdWRwX3BvcnQpICE9IEJDTV9FUlJfT0spCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWRldiIpKQorICAgICAgICB7CisgICAgICAgICAgICArK2k7CisgICAgICAgICAgICBkZXZpY2UgPSAoYmNtb2x0X2RldmlkKXN0cnRvdWwoYXJndltpXSwgTlVMTCwgMCk7CisgICAgICAgICAgICBpZiAoZGV2aWNlID49IEJDTVRSX01BWF9PTFRTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50ZigiSW52YWxpZCBkZXZpY2UgSURcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGN1cnJlbnRfZGV2aWNlID0gZGV2aWNlOworICAgICAgICAgICAgc3BlY2lmaWNfZGV2aWNlID0gQkNNT1NfVFJVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItaWZfbWFzayIpKQorICAgICAgICB7CisgICAgICAgICAgICArK2k7CisgICAgICAgICAgICByeF9jZmcucG9uX25pX21hc2sgPSAodWludDMyX3Qpc3RydG91bChhcmd2W2ldLCBOVUxMLCAwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItcHJveHkiKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGN1cl9wcm94eV9kZXYgPj0gQkNNVFJfTUFYX09MVFMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJUb28gbWFueSAtcHJveHkgb3B0aW9uc1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKytpOworICAgICAgICAgICAgcnVuX3Byb3h5ID0gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgIHByb3h5X3BvcnRbY3VyX3Byb3h5X2Rldl0gPSAodWludDMyX3Qpc3RydG91bChhcmd2W2ldLCBOVUxMLCAwKTsKKyAgICAgICAgICAgIGlmIChwcm94eV9wb3J0W2N1cl9wcm94eV9kZXZdID4gMHhmZmZmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50ZigiSW52YWxpZCBwcm94eSBwb3J0ICV1XG4iLCAodW5zaWduZWQpcHJveHlfcG9ydFtjdXJfcHJveHlfZGV2XSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKytjdXJfcHJveHlfZGV2OworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1yZW1vdGUiKSkKKyAgICAgICAgeworICAgICAgICAgICAgKytpOworICAgICAgICAgICAgcnVuX3JlbW90ZV9jbGkgPSBCQ01PU19UUlVFOworICAgICAgICAgICAgcmVtb3RlX2NsaV9wb3J0ID0gKHVpbnQzMl90KXN0cnRvdWwoYXJndltpXSwgTlVMTCwgMCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLXVkIikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nX2luYmFuZF9zZXQoQkNNT1NfVFJVRSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLW9uX3JlYWR5IikpCisgICAgICAgIHsKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgIG9uX3JlYWR5X2NtZCA9IGFyZ3ZbaV07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX2NsaV9oZWxwKGFyZ3ZbMF0pOworICAgICAgICB9CisgICAgfQorCisgICAgcmMgPSBiY21vbHRfaG9zdF9pbml0KCZwYXJhbXMpOworICAgIEJVR19PTihyYyk7CisKKyAgICBiY21vc190cmFjZV9sZXZlbF9zZXQoQkNNT1NfVFJBQ0VfTEVWRUxfREVCVUcpOworCisgICAgaWYgKG5vZWRpdCkKKyAgICB7CisgICAgICAgIG1vbl9zZXNzaW9uX3Bhcm0ubGluZV9lZGl0X21vZGUgPSBCQ01DTElfTElORV9FRElUX0RJU0FCTEU7CisgICAgfQorICAgIGlmIChiY21jbGlfc2Vzc2lvbl9vcGVuKCZtb25fc2Vzc2lvbl9wYXJtLCAmY3VycmVudF9zZXNzaW9uKSkKKyAgICB7CisgICAgICAgIHByaW50ZigiQ2FuJ3Qgb3BlbiBDTEkgc2Vzc2lvblxuIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIC8qIFRyeSB0byBsZWFybiBzeXN0ZW0gbW9kZSBmb3IgYWxsIGRldmljZXMgKi8KKyAgICBpZiAoc3BlY2lmaWNfZGV2aWNlKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3N5c3RlbV9tb2RlX3NldChjdXJyZW50X2RldmljZSwgX2dldF9zeXN0ZW1fbW9kZShjdXJyZW50X2RldmljZSkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgQkNNVFJfTUFYX09MVFM7IGkrKykKKyAgICAgICAgICAgIGJjbW9sdF9zeXN0ZW1fbW9kZV9zZXQoaSwgX2dldF9zeXN0ZW1fbW9kZShpKSk7CisgICAgfQorCisgICAgLyogSW5pdCBkZXZpY2Ugc2VsZWN0b3IgKi8KKyAgICByYyA9IGJjbW9sdF9kZXZfc2VsX2luaXQoTlVMTCk7CisKKyAgICAvKiBBZGQgTWFwbGUgQVBJIGNvbW1hbmRzICovCisgICAgcmMgPSByYyA/IHJjIDogYXBpX2NsaV9pbml0KE5VTEwsIGN1cnJlbnRfc2Vzc2lvbik7CisKKyAgICAvKiAoeClHUE9OIGluaXQuIERvZXMgbm90aGluZyBpZiBzeXN0ZW0gbW9kZSBpcyBub3QgKHgpR1BPTiAqLworICAgIGlmIChyYyA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3N5c3RlbV9tb2RlIHN5c3RlbV9tb2RlID0gQkNNT0xUX1NZU1RFTV9NT0RFX19OVU1fT0Y7CisgICAgICAgIGJjbW9sdF9zeXN0ZW1fbW9kZV9nZXQoY3VycmVudF9kZXZpY2UsICZzeXN0ZW1fbW9kZSk7CisgICAgICAgIGJjbV9jb21tb25fZ3Bvbl9pbml0KHN5c3RlbV9tb2RlKTsKKyAgICB9CisKKyAgICAvKiBBZGQgdHJhbnNwb3J0IGNvbW1hbmRzICovCisgICAgcmMgPSByYyA/IHJjIDogYmNtdHJfY2xpX2luaXQoKTsKKworICAgIC8qIEFkZCBjYXB0dXJlLCBsb2csIGRlYnVnIGNvbW1hbmRzICovCisgICAgcmMgPSByYyA/IHJjIDogYmNtdHJfY2xkX2luaXQoY3VycmVudF9zZXNzaW9uKTsKKworICAgIC8qIEluaXRpYWxpemUgZW1iZWRkZWQgQ0xJIG1vZHVsZSAqLworICAgIHJjID0gcmMgPyByYyA6IGJjbV9lbWJlZGRlZF9jbGlfaW5pdCgpOworCisgICAgcmMgPSByYyA/IHJjIDogYmNtb3NfY2xpX2luaXQoTlVMTCk7CisKKyAgICByYyA9IHJjID8gcmMgOiBiY21vbHRfdXNlcl9hcHBsX2NsaV9pbml0KE5VTEwpOworCisgICAgcmMgPSByYyA/IHJjIDogYmNtb2x0X3VzZXJfYXBwbF9leF9jbGlfaW5pdCgpOworCisKKyNpZiBkZWZpbmVkKExJTlVYX0tFUk5FTF9TUEFDRSkKKyAgICByYyA9IHJjID8gcmMgOiBiY21fYm9hcmRfaW5pdCgpOworICAgIHJjID0gcmMgPyByYyA6IGJjbV9ib2FyZF9jbGlfaW5pdChOVUxMKTsKKyNlbmRpZgorCisjaWZkZWYgRU5BQkxFX0xPRworICAgIC8qIGxvZ2dlciBDTEkgZGlyZWN0b3J5ICovCisgICAgYmNtX2Rldl9sb2dfY2xpX2luaXQoTlVMTCk7CisjZW5kaWYKKworICAgIGlmIChydW5fcHJveHkpCisgICAgeworICAgICAgICAvKiBJZiBleGVjdXRpbmcgZm9yIHNwZWNpZmljIGRldmljZSwgcnVuIG9ubHkgMSBwcm94eSBpbnN0YW5jZS4KKyAgICAgICAgICogT3RoZXJ3aXNlLCBjcmVhdGUgYXMgbWFueSBpbnN0YW5jZXMgYXMgcmVxdWVzdGVkCisgICAgICAgICAqLworICAgICAgICBpZiAoc3BlY2lmaWNfZGV2aWNlKQorICAgICAgICAgICAgcmMgPSByYyA/IHJjIDogYmNtb2x0X2FwaV9wcm94eV9pbml0KE5VTEwsIGRldmljZSwgcHJveHlfcG9ydFswXSwgb25fcmVhZHlfY21kKTsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY3VyX3Byb3h5X2RldjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gcmMgPyByYyA6IGJjbW9sdF9hcGlfcHJveHlfaW5pdChOVUxMLCBpLCBwcm94eV9wb3J0W2ldLCBvbl9yZWFkeV9jbWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHJ1bl9yZW1vdGVfY2xpKQorICAgIHsKKyAgICAgICAgcmMgPSByYyA/IHJjIDogYmNtb2x0X3JlbW90ZV9jbGlfaW5pdChOVUxMLCBkZXZpY2UsIHJlbW90ZV9jbGlfcG9ydCk7CisgICAgfQorCisgICAgLyogQWRkIG90aGVyIGNvbW1hbmRzLCBlLmcuLCBhY2Nlc3MgdG8gZW1iZWRkZWQgQ0xJICovCisgICAgaWYgKHJjKQorICAgICAgICByZXR1cm4gcmM7CisKKyAgICByeF9jZmcucnhfY2IgPSBiY21vbHRfdXNlcl9hcHBsX2luZGljYXRpb25fY2I7CisgICAgcmMgPSBiY21vbHRfYXV0b19yeF9jYl9zZXQoZGV2aWNlLCAmcnhfY2ZnKTsKKyAgICBCVUdfT04oQkNNX0VSUl9PSyAhPSByYyk7CisgICAgcnhfY2ZnLnJ4X2NiID0gYmNtb2x0X3VzZXJfYXBwbF9wcm94eV9yeF9jYjsKKyAgICByYyA9IGJjbW9sdF9wcm94eV9yeF9jYl9zZXQoZGV2aWNlLCAmcnhfY2ZnKTsKKyAgICBCVUdfT04oQkNNX0VSUl9PSyAhPSByYyk7CisKKyAgICBiY21vbHRfdXNlcl9tZnRwX2luaXQoKTsKKworICAgIHNtX2NoYW5nZV9jYiA9IGhhbmRsZV9zeXN0ZW1fbW9kZV9jaGFuZ2U7CisKKyAgICBCQ01DTElfTUFLRV9DTURfTk9QQVJNKE5VTEwsICJxdWl0IiwgIlF1aXQiLCBfY21kX3F1aXQpOworICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oTlVMTCwgInVzaW5nX2luYmFuZCIsICJVc2luZyBJbiBCYW5kIiwgX2NtZF91c2luZ19pbmJhbmQpOworCisjaWZuZGVmIFNJTVVMQVRJT05fQlVJTEQKKyAgICBiY21fYm9hcmRfZnBnYV92ZXJzaW9uX2dldCgmZnBnYV92ZXJzaW9uKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChjdXJyZW50X3Nlc3Npb24sICJGUEdBIHZlcnNpb246ICVkXG4iLCBmcGdhX3ZlcnNpb24pOworI2VuZGlmCisKKyAgICAvKiBQcm9jZXNzIHVzZXIgaW5wdXQgdW50aWwgRU9GIG9yIHF1aXQgY29tbWFuZCAqLworICAgIGJjbWNsaV9kcml2ZXIoY3VycmVudF9zZXNzaW9uKTsKKworI2lmIGRlZmluZWQoTElOVVhfS0VSTkVMX1NQQUNFKQorICAgIGJjbV9ib2FyZF91bmluaXQoKTsKKyNlbmRpZgorICAgIGJjbXRyX2V4aXQoKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9jbG9zZShjdXJyZW50X3Nlc3Npb24pOworICAgIGJjbWNsaV90b2tlbl9kZXN0cm95KE5VTEwpOworCisgICAgaWYgKHJ1bl9wcm94eSkKKyAgICB7CisgICAgICAgIGJjbW9sdF9hcGlfcHJveHlfc3RvcCgpOworICAgIH0KKworICAgIGlmIChydW5fcmVtb3RlX2NsaSkKKyAgICB7CisgICAgICAgIGJjbW9sdF9yZW1vdGVfY2xpX3N0b3AoKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvYmNtb2x0X3VzZXJfYXBwbF9jbGkuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvYmNtb2x0X3VzZXJfYXBwbF9jbGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzYyMWRhCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9iY21vbHRfdXNlcl9hcHBsX2NsaS5jCkBAIC0wLDAgKzEsNTY4IEBACisvKgorICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyAgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICBvZiB0aGUgc29mdHdhcmUuCisKKyAgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisgIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorICB3cml0dGVuIGNvbnNlbnQuCisKKyAgOj4KKyovCisKKyNpbmNsdWRlIDxiY21vbHRfbXNnLmg+CisjaW5jbHVkZSA8YmNtb2x0X2FwaS5oPgorI2luY2x1ZGUgPGJjbWNsaS5oPgorI2luY2x1ZGUgPGJjbV9hcGlfY2xpLmg+CisjaW5jbHVkZSA8YmNtX2FwaV9kZXZfbG9nLmg+CisjaW5jbHVkZSA8YmNtX2Rldl9sb2cuaD4KKyNpbmNsdWRlIDxiY21vbHRfbXNnX3BhY2suaD4KKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX2NsaS5oIgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfZ3Bvbl91dGlscy5oIgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfcHMuaCIKKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX3BzX2NsaS5oIgorI2lmbmRlZiBSRUxFQVNFX0JVSUxECisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9vbWNpX3N3ZGxfY2xpLmgiCisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9vbWNpX3N3ZGwuaCIKKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX2dwb25fbWFjX2xlYXJuaW5nX2NsaS5oIgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfZ3Bvbl9tYWNfbGVhcm5pbmcuaCIKKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX2dwb25fc3RyZXNzX2NsaS5oIgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfZ3Bvbl9zdHJlc3MuaCIKKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX2dwb25fc25fYWNxdWlzaXRpb25fY2xpLmgiCisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9ncG9uX3NuX2FjcXVpc2l0aW9uLmgiCisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9ncG9uX2RzX29tY2lfY2xpLmgiCisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9ncG9uX2RzX29tY2kuaCIKKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX2dwb25fc3RhdGlzdGljc19jbGkuaCIKKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX2dwb25fc3RhdGlzdGljcy5oIgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfZ3Bvbl9yc3NpX2NsaS5oIgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfZ3Bvbl9yc3NpLmgiCisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9yZW1vdGVfbG9nZ2VyX2NsaS5oIgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfcmVtb3RlX2xvZ2dlci5oIgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfb251X3R1bmluZ19jbGkuaCIKKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX29udV90dW5pbmcuaCIKKyNlbmRpZiAvKiBOb3QgUkVMRUFTRV9CVUlMRCAqLworI2luY2x1ZGUgImJjbW9sdF9lb24uaCIKKyNpbmNsdWRlICJiY21vbHRfZXBvbl9oZGUuaCIKKyNpZm5kZWYgU0lNVUxBVElPTl9CVUlMRAorI2luY2x1ZGUgIm9tb24uaCIKKyNpbmNsdWRlIDxiY21vbHRfZGV2X2N0cmxfaW9jdGwuaD4KKyNpbmNsdWRlIDxiY210cl9wY2llLmg+CisjZW5kaWYgLyogI2VuZGlmIFNJTVVMQVRJT05fQlVJTEQgKi8KKyNpbmNsdWRlICJiY21vbHRfYm9hcmQuaCIKKyNpbmNsdWRlICJiY21vbHRfYXBpX3Byb3h5LmgiCisjaW5jbHVkZSAiYmNtb2x0X3JlbW90ZV9jbGkuaCIKKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtX2NsaS5oIgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW0uaCIKKyNpbmNsdWRlICJiY21vbHRfaW1hZ2VfdHJhbnNmZXJfY2xpLmgiCisjaW5jbHVkZSAiYmNtb2x0X3N3X3VwZ3JhZGVfY2xpLmgiCisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9wbGF5YmFjay5oIgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfZHBvZV9zZWMuaCIKKworI2lmZGVmIEVOQUJMRV9MT0cKK3N0YXRpYyB1aW50MzJfdCAqYmNtbGNsaV9wY2lfZHVtcHB0cjsKK3N0YXRpYyBkZXZfbG9nX2lkIHVzZXJfYXBwbF9sb2dfaWQ7CitzdGF0aWMgZGV2X2xvZ19pZCBpbmRfbG9nX2lkW0JDTVRSX01BWF9JTlNUQU5DRVNdOworc3RhdGljIGJjbWNsaV9lbnRyeSAqdXNlcl9kaXI7CitzdGF0aWMgYmNtb3NfYm9vbCBzeXNfbW9kZV9zZXRbQkNNVFJfTUFYX09MVFNdID0ge307CisKK3N0YXRpYyB2b2lkIHVzZXJfYXBwbF9hcGlfbXNnX2R1bXAoY29uc3QgY2hhciAqdGl0bGUsIGJjbW9sdF9tc2cgKm1zZykKK3sKKyAgICB1aW50OF90IGluc3QgPSBiY21vbHRfbXNnX2luc3RhbmNlKG1zZyk7CisgICAgaW5zdCA9IChpbnN0ID4gQkNNVFJfTUFYX0lOU1RBTkNFUykgPyAwIDogaW5zdDsKKyAgICBiY21vbHRfbXNnX2xvZyhpbmRfbG9nX2lkW2luc3RdLCBtc2cpOworfQorCisjaWZuZGVmIFJFTEVBU0VfQlVJTEQKK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfdXNlcl9hcHBsX3Byb2Nlc3NfZXhjZXB0aW9uX2luZChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21vbHRfYXV0byAqaW5kKQoreworICAgIHN3aXRjaCAoaW5kLT5oZHIub2JqX3R5cGUpCisgICAgeworICAgIGNhc2UgQkNNT0xUX09CSl9JRF9ERVZJQ0U6CisgICAgICAgIHN3aXRjaCAoaW5kLT5oZHIuc3ViZ3JvdXApCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX1NXX0VYQ0VQVElPTjoKKyAgICAgICAgY2FzZSBCQ01PTFRfREVWSUNFX0FVVE9fQ0ZHX0lEX1NXX0VSUk9SOgorICAgICAgICAgICAgLyogU3RvcCBhbGwgdXNlciBhcHBsaWNhdGlvbiB0YXNrcy4gKi8KKyAgICAgICAgICAgIGlmIChiY21vbHRfZ3Bvbl9tYWNfbGVhcm5pbmdfYXBwbF9pc19ydW5uaW5nKGRldmljZV9pZCkpCisgICAgICAgICAgICAgICAgYmNtb2x0X2dwb25fbWFjX2xlYXJuaW5nX2FwcGxfc3RvcChkZXZpY2VfaWQpOworICAgICAgICAgICAgaWYgKGJjbW9sdF9ncG9uX3N0cmVzc19hcHBsX2lzX3J1bm5pbmcoZGV2aWNlX2lkKSkKKyAgICAgICAgICAgICAgICBiY21vbHRfZ3Bvbl9zdHJlc3NfYXBwbF9zdG9wKGRldmljZV9pZCk7CisgICAgICAgICAgICBpZiAoYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb25fYXBwbF9pc19ydW5uaW5nKGRldmljZV9pZCkpCisgICAgICAgICAgICAgICAgYmNtb2x0X2dwb25fc25fYWNxdWlzaXRpb25fYXBwbF9zdG9wKGRldmljZV9pZCk7CisgICAgICAgICAgICBpZiAoYmNtb2x0X3VzZXJfYXBwbF9ncG9uX3N0YXRpc3RpY3NfaXNfcnVubmluZyhkZXZpY2VfaWQpKQorICAgICAgICAgICAgICAgIGJjbW9sdF91c2VyX2FwcGxfZ3Bvbl9zdGF0aXN0aWNzX3N0b3AoZGV2aWNlX2lkKTsKKyAgICAgICAgICAgIGlmIChiY21vbHRfZ3Bvbl9kc19vbWNpX2FwcGxfaXNfcnVubmluZyhkZXZpY2VfaWQpKQorICAgICAgICAgICAgICAgIGJjbW9sdF9ncG9uX2RzX29tY2lfYXBwbF9zdG9wKGRldmljZV9pZCk7CisgICAgICAgICAgICBpZiAoYmNtb2x0X2dwb25fcnNzaV9hcHBsX2lzX3J1bm5pbmcoZGV2aWNlX2lkKSkKKyAgICAgICAgICAgICAgICBiY21vbHRfZ3Bvbl9yc3NpX2FwcGxfc3RvcChkZXZpY2VfaWQpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisjZW5kaWYKKwordm9pZCBiY21vbHRfdXNlcl9hcHBsX2luZGljYXRpb25fY2IoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtb2x0X21zZyAqbXNnKQoreworICAgIHVpbnQ4X3QgaW5zdGFuY2UgID0gYmNtb2x0X21zZ19pbnN0YW5jZShtc2cpOworICAgIGJjbW9sdF9hdXRvICppbmQgPSAoYmNtb2x0X2F1dG8gKiltc2c7CisgICAgYmNtb2x0X3BzX3BvbiBwc19wb24gPSB7IGRldmljZV9pZCwgaW5zdGFuY2UgfTsKKworICAgIHVzZXJfYXBwbF9hcGlfbXNnX2R1bXAoIkluZGljYXRpb24iLCBtc2cpOworICAgIGJjbW9sdF9wc19wcm9jZXNzX2luZCgmcHNfcG9uLCBpbmQpOworCisjaWZuZGVmIFJFTEVBU0VfQlVJTEQKKyAgICBiY21vbHRfdXNlcl9hcHBsX3Byb2Nlc3NfZXhjZXB0aW9uX2luZChkZXZpY2VfaWQsIGluZCk7CisgICAgLyogRm9yd2FyZCB0aGUgaW5kaWNhdGlvbiB0byBlYWNoIHVzZXIgYXBwbGljYXRpb24uICBUaGVzZSBhcHBsaWNhdGlvbnMgd2lsbCBpZ25vcmUgaW5kaWNhdGlvbnMgdGhhdCBhcmVuJ3QKKyAgICAgKiByZWxldmFudCBhbmQgZXJyb3JzIHdpbGwgYmUgcHJpbnRlZCB0byBkZWRpY2F0ZWQgbG9nIElEcyBwZXIgYXBwbGljYXRpb24uICovCisgICAgYmNtb2x0X2dwb25fbWFjX2xlYXJuaW5nX3Byb2Nlc3NfaW5kKGRldmljZV9pZCwgaW5kKTsKKyAgICBiY21vbHRfZ3Bvbl9zdHJlc3NfcHJvY2Vzc19pbmQoZGV2aWNlX2lkLCBpbmQpOworICAgIGJjbW9sdF9ncG9uX3NuX2FjcXVpc2l0aW9uX3Byb2Nlc3NfaW5kKGRldmljZV9pZCwgaW5kKTsKKyAgICBiY21vbHRfdXNlcl9hcHBsX2dwb25fc3RhdGlzdGljc19wcm9jZXNzX2luZChkZXZpY2VfaWQsIGluZCk7CisgICAgYmNtb2x0X2dwb25fZHNfb21jaV9wcm9jZXNzX2luZChkZXZpY2VfaWQsIGluZCk7CisgICAgYmNtb2x0X2dwb25fcnNzaV9wcm9jZXNzX2luZChkZXZpY2VfaWQsIGluZCk7CisgICAgYmNtb2x0X29udV90dW5pbmdfcHJvY2Vzc19pbmQoZGV2aWNlX2lkLCBpbmQpOworI2VuZGlmIC8qIE5vdCBSRUxFQVNFX0JVSUxEICovCisKKyNpZm5kZWYgU0lNVUxBVElPTl9CVUlMRAorICAgIGJjbW9sdF91c2VyX2FwcGxfb21vbl9oYW5kbGVfaW5kKGRldmljZV9pZCwgaW5zdGFuY2UsIGluZCk7CisjZW5kaWYKKworICAgIGJjbW9sdF9hcGlfcHJveHlfYXV0b19yeF9jYihkZXZpY2VfaWQsIG1zZyk7CisgICAgYmNtb2x0X3JlbW90ZV9jbGlfYXV0b19yeF9jYihkZXZpY2VfaWQsIG1zZyk7CisKKyAgICAvKiBGcmVlIHRoZSBpbmRpY2F0aW9uIHNpbmNlIHdlJ3JlIGRvbmUgcHJvY2Vzc2luZyBpdCAqLworICAgIGJjbW9sdF9tc2dfZnJlZShtc2cpOworfQorCit2b2lkIGJjbW9sdF91c2VyX2FwcGxfcHJveHlfcnhfY2IoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGJjbW9sdF9wcm94eV9yeCAqcHJveHlfcnggPSAoYmNtb2x0X3Byb3h5X3J4ICopbXNnOworCisjaWZuZGVmIFJFTEVBU0VfQlVJTEQKKyAgICBiY21vbHRfb21jaV9zd2RsX3Byb2Nlc3NfcHJveHlfcngoZGV2aWNlX2lkLCBwcm94eV9yeCk7CisKKyAgICAvKiBEdW1wIFJYIHBhY2tldCBpZiBPTUNJIFNXREwgaXMgTm90IHJ1bm5pbmcqLworICAgIGlmICghYmNtb2x0X29tY2lfc3dkbF9hcHBsX2lzX3J1bm5pbmcoZGV2aWNlX2lkKSkKKyAgICB7CisgICAgICAgIHVzZXJfYXBwbF9hcGlfbXNnX2R1bXAoIlByb3h5IFJ4IiwgbXNnKTsKKyAgICB9CisjZWxzZQorICAgIHVzZXJfYXBwbF9hcGlfbXNnX2R1bXAoIlByb3h5IFJ4IiwgbXNnKTsKKyNlbmRpZiAvKiBOb3QgUkVMRUFTRV9CVUlMRCAqLworCisgICAgYmNtb2x0X2FwaV9wcm94eV9hdXRvX3J4X2NiKGRldmljZV9pZCwgbXNnKTsKKyAgICBiY21vbHRfcmVtb3RlX2NsaV9hdXRvX3J4X2NiKGRldmljZV9pZCwgbXNnKTsKKyAgICBiY21vbHRfdXNlcl9hcHBsX2Vvbl9wcm9jZXNzX3J4KGRldmljZV9pZCwgcHJveHlfcngpOworICAgIGJjbW9sdF9lcG9uX2hkZV9wcm9jZXNzX3J4KGRldmljZV9pZCwgYmNtb2x0X21zZ19pbnN0YW5jZShtc2cpLCBwcm94eV9yeCk7CisgICAgYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29hbV9oYW5kbGVfcngoZGV2aWNlX2lkLCBwcm94eV9yeCwgTlVMTCk7CisgICAgYmNtb2x0X3VzZXJfYXBwbF9kcG9lX3NlY19wcm9jZXNzX3Byb3h5X3J4KGRldmljZV9pZCwgcHJveHlfcngpOworICAgIGJjbW9sdF9tc2dfZnJlZShtc2cpOworfQorCisvKiBleGFtcGxlIG9uIGhvdyB0byByZWFkIHRoZSBlbWJlZGRlZCBsb2dnZXIgZnJvbSB0aGUgaG9zdCAqLworc3RhdGljIGJjbW9zX2Vycm5vIF9hcGljbGlfcmVhZF9lbWJlZGRlZF9sb2dnZXIoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICBiY21vbHRfbG9nZ2VyX2NmZyAgY2ZnOworICAgIGJjbW9sdF9sb2dnZXJfa2V5IGtleSA9IHsuZmlsZV9pZCA9IHBhcm1bMF0udmFsdWUudW51bWJlciwgLnJlc2VydmVkID0gMH07CisgICAgaW50IHJjOworCisgICAgYmNtX2Rldl9sb2dfbG9nKAorICAgICAgICB1c2VyX2FwcGxfbG9nX2lkLCBERVZfTE9HX0xFVkVMX0RFQlVHLCBCQ01fTE9HX0ZMQUdfTk9fSEVBREVSLAorICAgICAgICAiJXMiLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworICAgIGJjbV9kZXZfbG9nX2xvZygKKyAgICAgICAgdXNlcl9hcHBsX2xvZ19pZCwgREVWX0xPR19MRVZFTF9ERUJVRywgQkNNX0xPR19GTEFHX05PX0hFQURFUiwKKyAgICAgICAgICAgICAgInwgZGV2aWNlICV1IGxvZ2dlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiIsIGN1cnJlbnRfZGV2aWNlKTsKKyAgICBiY21fZGV2X2xvZ19sb2codXNlcl9hcHBsX2xvZ19pZCwgREVWX0xPR19MRVZFTF9ERUJVRywgQkNNX0xPR19GTEFHX05PX0hFQURFUiwKKyAgICAgICAgIiVzIiwgInwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfFxuIik7CisKKyAgICB3aGlsZSAoMSkKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBsb2dnZXIsIGtleSk7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgbG9nZ2VyLCBidWZmZXIpOworICAgICAgICByYyA9IGJjbW9sdF9jZmdfZ2V0KGN1cnJlbnRfZGV2aWNlLCAmY2ZnLmhkcik7CisgICAgICAgIGlmIChyYyA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3ByaW50ZigiZ2V0IG9iaiBlcnJvciAlZFxuIiwgcmMpOworICAgICAgICB9CisgICAgICAgIGJjbW9zX3ByaW50ZigiJXMiLCBjZmcuZGF0YS5idWZmZXIuYnVmZik7CisgICAgICAgIGlmIChjZmcuZGF0YS5idWZmZXIubXNnX3RvX3JlYWQgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIGV4YW1wbGUgb24gaG93IHRvIHJlYWQgYWxsIHRoZSBlbWJlZGRlZCBsb2cgZW50cmllcyBmcm9tIHRoZSBob3N0ICovCitzdGF0aWMgYmNtb3NfZXJybm8gX2FwaWNsaV9nZXRfYWxsX2xvZ19lbnRyaWVzKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgYmNtb2x0X2xvZ19lbnRyeV9jZmcgIGNmZzsKKyAgICBiY21vbHRfbG9nX2VudHJ5X2tleSBrZXkgPSB7LmxvZ19pZCA9IDAsIC5yZXNlcnZlZD0wfTsKKyAgICBpbnQgcmM7CisKKyAgICBjaGFyICpfbG9nX2xldmVsW10gPQorICAgIHsKKyAgICAgICAgIk5PX0xPRyIsCisgICAgICAgICJGQVRBTCIsCisgICAgICAgICJFUlJPUiIsCisgICAgICAgICJXQVJOSU5HIiwKKyAgICAgICAgIklORk8iICwKKyAgICAgICAgIkRFQlVHIgorICAgIH07CisKKyAgICBjaGFyICpfbG9nX3R5cGVbXSA9CisgICAgeworICAgICAgICAiTk9ORSIsCisgICAgICAgICJQUklOVCIsCisgICAgICAgICJTQVZFIiwKKyAgICAgICAgIkJPVEgiCisgICAgfTsKKworICAgIGNoYXIgKl9sb2dfc3R5bGVbXSA9CisgICAgeworICAgICAgICAiTk9STUFMIiwKKyAgICAgICAgIkJPTEQiLAorICAgICAgICAiVU5ERVJMSU5FIiwKKyAgICAgICAgIkJMSUsiLAorICAgICAgICAiUkVWRVJTRV9WSURFTyIKKyAgICB9OworCisgICAgYmNtX2Rldl9sb2dfbG9nKAorICAgICAgICB1c2VyX2FwcGxfbG9nX2lkLCBERVZfTE9HX0xFVkVMX0RFQlVHLCBCQ01fTE9HX0ZMQUdfTk9fSEVBREVSLAorICAgICAgICAiJXMiLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworICAgIGJjbV9kZXZfbG9nX2xvZygKKyAgICAgICAgdXNlcl9hcHBsX2xvZ19pZCwgREVWX0xPR19MRVZFTF9ERUJVRywgQkNNX0xPR19GTEFHX05PX0hFQURFUiwKKyAgICAgICAgIiVzIiwgInwgTE9HIElEIHwgICAgICAgIExPRyBOQU1FICAgICAgIHwgTE9HIGxldmVsIHByaW50IHwgTE9HIGxldmVsIHNhdmUgIHwgbG9nIHR5cGUgfCAgICBsb2cgc3R5bGUgICAgfFxuIik7CisgICAgYmNtX2Rldl9sb2dfbG9nKHVzZXJfYXBwbF9sb2dfaWQsIERFVl9MT0dfTEVWRUxfREVCVUcsIEJDTV9MT0dfRkxBR19OT19IRUFERVIsCisgICAgICAgICIlcyIsICJ8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiIpOworCisgICAgd2hpbGUgKDEpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgbG9nX2VudHJ5LCBrZXkpOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZjZmcsIGxvZ19lbnRyeSwgYWxsX3Byb3BlcnRpZXMpOworICAgICAgICByYyA9IGJjbW9sdF9jZmdfZ2V0KGN1cnJlbnRfZGV2aWNlLCAmY2ZnLmhkcik7CisgICAgICAgIGlmIChyYykKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYmNtX2Rldl9sb2dfbG9nKHVzZXJfYXBwbF9sb2dfaWQsIERFVl9MT0dfTEVWRUxfREVCVUcsIEJDTV9MT0dfRkxBR19OT19IRUFERVIgfCBCQ01fTE9HX0ZMQUdfQ0FMTEVSX0ZNVCwKKyAgICAgICAgICAgICJ8JS04ZHwlLTIzc3wlLTE3c3wlLTE3c3wlLTEwc3wlLTE3c3xcbiIsCisgICAgICAgICAgICBrZXkubG9nX2lkLAorICAgICAgICAgICAgY2ZnLmRhdGEubG9nX25hbWUuc3RyLAorICAgICAgICAgICAgX2xvZ19sZXZlbFtjZmcuZGF0YS5sb2dfbGV2ZWxfcHJpbnRdLAorICAgICAgICAgICAgX2xvZ19sZXZlbFtjZmcuZGF0YS5sb2dfbGV2ZWxfc2F2ZV0sCisgICAgICAgICAgICBfbG9nX3R5cGVbY2ZnLmRhdGEubG9nX3R5cGVdLAorICAgICAgICAgICAgX2xvZ19zdHlsZVtjZmcuZGF0YS5sb2dfc3R5bGVdKTsKKyAgICAgICAgYmNtX2Rldl9sb2dfbG9nKHVzZXJfYXBwbF9sb2dfaWQsIERFVl9MT0dfTEVWRUxfREVCVUcsIEJDTV9MT0dfRkxBR19OT19IRUFERVIsCisgICAgICAgICAgICAiJXMiLCAifC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4iKTsKKyAgICAgICAga2V5LmxvZ19pZCsrOworCisgICAgfQorICAgIGJjbV9kZXZfbG9nX2xvZyh1c2VyX2FwcGxfbG9nX2lkLCBERVZfTE9HX0xFVkVMX0RFQlVHLCBCQ01fTE9HX0ZMQUdfTk9fSEVBREVSLAorICAgICAgICAiJXMiLCAifC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4iKTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9hcGljbGlfaW5kaWNhdGlvbl9oYW5kbGVyKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgc3RydWN0IGJjbW9sdF9yeF9jZmcgcnhfY2ZnID0KKyAgICB7CisgICAgICAgIC5vYmpfdHlwZSA9IEJDTU9MVF9PQkpFQ1RfQU5ZLAorICAgICAgICAucnhfY2IgPSBiY21vbHRfdXNlcl9hcHBsX2luZGljYXRpb25fY2IsCisgICAgICAgIC5mbGFncyA9IEJDTU9MVF9BVVRPX0ZMQUdTX05PTkUsCisgICAgICAgIC5wb25fbmlfbWFzayA9IHBhcm1bMF0udmFsdWUudW51bWJlcgorICAgIH07CisgICAgcmV0dXJuIGJjbW9sdF9hdXRvX3J4X2NiX3NldChjdXJyZW50X2RldmljZSwgJnJ4X2NmZyk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfYXBpY2xpX3Byb3h5X3J4X2hhbmRsZXIoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICBzdHJ1Y3QgYmNtb2x0X3J4X2NmZyByeF9jZmcgPQorICAgIHsKKyAgICAgICAgLm9ial90eXBlID0gQkNNT0xUX09CSkVDVF9BTlksCisgICAgICAgIC5yeF9jYiA9IGJjbW9sdF91c2VyX2FwcGxfcHJveHlfcnhfY2IsCisgICAgICAgIC5mbGFncyA9IEJDTU9MVF9BVVRPX0ZMQUdTX05PTkUsCisgICAgICAgIC5wb25fbmlfbWFzayA9IHBhcm1bMF0udmFsdWUudW51bWJlcgorICAgIH07CisgICAgcmV0dXJuIGJjbW9sdF9wcm94eV9yeF9jYl9zZXQoY3VycmVudF9kZXZpY2UsICZyeF9jZmcpOworfQorI2VuZGlmCisKKyNpZm5kZWYgU0lNVUxBVElPTl9CVUlMRAorc3RhdGljIGJjbW9zX2Vycm5vIF9hcGljbGlfcGNpc3RhdChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICB1aW50OF90IHN0YXJ0OworICAgIGJjbV9wY2llZF9zdGF0ICpzdGF0OworCisgICAgc3RhcnQgPSAwOworICAgIGlmIChuX3Bhcm1zID4gMCkKKyAgICB7CisgICAgICAgIGlmICghc3RybmNtcChwYXJtWzBdLnZhbHVlLnN0cmluZywgInllcyIsIHN0cmxlbigieWVzIikpKQorICAgICAgICAgICAgc3RhcnQgPSAxOworICAgIH0KKworICAgIHJjID0gYmNtX2JvYXJkX3BjaV9kZWJ1ZygwLCBNQVBMRV9ERVZfQ1RSTF9JT0NUTF9PUF9QQ0lfU1RBVCwgc3RhcnQsIDAsIGJjbWxjbGlfcGNpX2R1bXBwdHIpOworICAgIHN0YXQgPSAoYmNtX3BjaWVkX3N0YXQgKiliY21sY2xpX3BjaV9kdW1wcHRyOworICAgIEJDTU9TX1RSQUNFX0NIRUNLX1JFVFVSTihyYywgcmMsICJiY21fYm9hcmRfcGNpX2RlYnVnKCkgZmFpbGVkXG4iKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiUmVjZWl2ZWQgICAgIDogJWRcbiIsIHN0YXQtPnJ4X2NvdW50ZXIpOworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJTZW5kICAgICAgICAgOiAlZFxuIiwgc3RhdC0+dHhfY291bnRlcik7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIlJ4IERvbmUgSXNyICA6ICVkXG4iLCBzdGF0LT5yeF9kb25lX2lzcl9jb3VudGVyKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiUnggRXJyIElzciAgIDogJWRcbiIsIHN0YXQtPnJ4X2Vycl9pc3JfY291bnRlcik7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIlR4IERvbmUgSXNyICA6ICVkXG4iLCBzdGF0LT50eF9kb25lX2lzcl9jb3VudGVyKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiVHggRXJyIElzciAgIDogJWRcbiIsIHN0YXQtPnR4X2Vycl9pc3JfY291bnRlcik7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIlJ4IGVtcHR5ICAgICA6ICVkXG4iLCBzdGF0LT5yeF9wY2llX2VtcHR5X2NvdW50ZXIpOworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJUeCBmdWxsICAgICAgOiAlZFxuXG4iLCBzdGF0LT50eF9wY2llX2Z1bGxfY291bnRlcik7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KK3N0YXRpYyBiY21vc19lcnJubyBfYXBpY2xpX3BjaWR1bXAoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgdWludDMyX3QgY29tbWFuZDsKKyAgICBpbnQzMl90IHN0YXJ0LCBob3dtYW55OworCisgICAgc3RhcnQgPSAtMTsKKyAgICBob3dtYW55ID0gMTsKKworICAgIGlmIChuX3Bhcm1zID4gMSkKKyAgICB7CisgICAgICAgIHN0YXJ0ID0gcGFybVsxXS52YWx1ZS5udW1iZXI7CisgICAgICAgIGhvd21hbnkgPSAxOworICAgICAgICBpZiAobl9wYXJtcyA+IDIpCisgICAgICAgICAgICBob3dtYW55ID0gcGFybVsyXS52YWx1ZS5udW1iZXI7CisgICAgfQorICAgIGlmICghc3RybmNtcChwYXJtWzBdLnZhbHVlLnN0cmluZywgInR4Iiwgc3RybGVuKCJ0eCIpKSkKKyAgICB7CisgICAgICAgIGNvbW1hbmQgPSBNQVBMRV9ERVZfQ1RSTF9JT0NUTF9PUF9QQ0lfRFVNUF9UWDsKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cm5jbXAocGFybVswXS52YWx1ZS5zdHJpbmcsICJyeCIsIHN0cmxlbigicngiKSkpCisgICAgeworICAgICAgICBjb21tYW5kID0gTUFQTEVfREVWX0NUUkxfSU9DVExfT1BfUENJX0RVTVBfUlg7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJFcnJvciAtIHdyb25nIGNvbW1hbmQ6ICVzXG4iLCBwYXJtWzBdLnZhbHVlLnN0cmluZyk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgcmMgPSBiY21fYm9hcmRfcGNpX2RlYnVnKDAsIGNvbW1hbmQsIHN0YXJ0LCBob3dtYW55LCBiY21sY2xpX3BjaV9kdW1wcHRyKTsKKyAgICBCQ01PU19UUkFDRV9DSEVDS19SRVRVUk4ocmMsIHJjLCAiYmNtX2JvYXJkX3BjaV9kZWJ1ZygpIGZhaWxlZFxuIik7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIiVzIiwgKGNoYXIgKiliY21sY2xpX3BjaV9kdW1wcHRyKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGJjbW9sdF91c2VyX2FwcGxfY2xpX3N0YXJ0X2Vwb24odm9pZCkKK3sKKyAgICBiY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtX2luaXQoKTsKKyAgICBiY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtX2NsaV9pbml0KHVzZXJfZGlyKTsKKworICAgIGJjbW9sdF91c2VyX2FwcGxfZW9uX2luaXQoKTsKKyAgICBiY21vbHRfdXNlcl9hcHBsX2Vvbl9jbGlfaW5pdCh1c2VyX2Rpcik7CisKKyNpZm5kZWYgU0lNVUxBVElPTl9CVUlMRAorICAgIGJjbW9sdF9lcG9uX29tb25fYXBwbF9pbml0KCk7CisgICAgYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29tb25fY2xpX2luaXQodXNlcl9kaXIpOworCisgICAgYmNtb2x0X2Vwb25faGRlX2FwcGxfaW5pdCgpOworICAgIGJjbW9sdF9lcG9uX2hkZV9hcHBsX2NsaV9pbml0KHVzZXJfZGlyKTsKKyNlbmRpZgorCisgICAgYmNtb2x0X3VzZXJfYXBwbF9kcG9lX3NlY19pbml0KCk7CisgICAgYmNtb2x0X3VzZXJfYXBwbF9kcG9lX3NlY19jbGlfaW5pdCh1c2VyX2Rpcik7Cit9CisKK3N0YXRpYyB2b2lkIGJjbW9sdF91c2VyX2FwcGxfY2xpX3N0YXJ0X2dwb24oYmNtb2x0X2RldmlkIGRldikKK3sKKyAgICBiY21vbHRfdXNlcl9hcHBsX2dwb25fdXRpbHNfaW5pdCh1c2VyX2Rpcik7CisKKyNpZm5kZWYgUkVMRUFTRV9CVUlMRAorICAgIGJjbW9sdF9ncG9uX21hY19sZWFybmluZ19hcHBsX2luaXQoZGV2KTsKKyAgICBiY21vbHRfdXNlcl9hcHBsX2dwb25fbWFjX2xlYXJuaW5nX2NsaV9pbml0KHVzZXJfZGlyKTsKKworICAgIGJjbW9sdF9ncG9uX3N0cmVzc19hcHBsX2luaXQoZGV2KTsKKyAgICBiY21vbHRfdXNlcl9hcHBsX2dwb25fc3RyZXNzX2NsaV9pbml0KHVzZXJfZGlyKTsKKworICAgIGJjbW9sdF9ncG9uX3NuX2FjcXVpc2l0aW9uX2FwcGxfaW5pdChkZXYpOworICAgIGJjbW9sdF91c2VyX2FwcGxfZ3Bvbl9zbl9hY3F1aXNpdGlvbl9jbGlfaW5pdCh1c2VyX2Rpcik7CisKKyAgICBiY21vbHRfdXNlcl9hcHBsX2dwb25fc3RhdGlzdGljc19pbml0KGRldik7CisgICAgYmNtb2x0X3VzZXJfYXBwbF9ncG9uX3N0YXRpc3RpY3NfY2xpX2luaXQodXNlcl9kaXIpOworCisgICAgYmNtb2x0X2dwb25fZHNfb21jaV9hcHBsX2luaXQoZGV2KTsKKyAgICBiY21vbHRfdXNlcl9hcHBsX2dwb25fZHNfb21jaV9jbGlfaW5pdCh1c2VyX2Rpcik7CisKKyAgICBiY21vbHRfb21jaV9zd2RsX2FwcGxfaW5pdChkZXYpOworICAgIGJjbW9sdF91c2VyX2FwcGxfb21jaV9zd2RsX2NsaV9pbml0KHVzZXJfZGlyKTsKKworICAgIGJjbW9sdF9ncG9uX3Jzc2lfYXBwbF9pbml0KGRldik7CisgICAgYmNtb2x0X3VzZXJfYXBwbF9ncG9uX3Jzc2lfY2xpX2luaXQodXNlcl9kaXIpOworI2VuZGlmIC8qIE5vdCBSRUxFQVNFX0JVSUxEICovCit9CisKK3N0YXRpYyB2b2lkIGJjbW9sdF91c2VyX2FwcGxfY2xpX3N0YXJ0X3hncG9uKGJjbW9sdF9kZXZpZCBkZXYpCit7CisgICAgYmNtb2x0X3VzZXJfYXBwbF9ncG9uX3V0aWxzX2luaXQodXNlcl9kaXIpOworCisjaWZuZGVmIFJFTEVBU0VfQlVJTEQKKworICAgIGJjbW9sdF9ncG9uX3N0cmVzc19hcHBsX2luaXQoZGV2KTsKKyAgICBiY21vbHRfdXNlcl9hcHBsX2dwb25fc3RyZXNzX2NsaV9pbml0KHVzZXJfZGlyKTsKKworICAgIGJjbW9sdF9ncG9uX3NuX2FjcXVpc2l0aW9uX2FwcGxfaW5pdChkZXYpOworICAgIGJjbW9sdF91c2VyX2FwcGxfZ3Bvbl9zbl9hY3F1aXNpdGlvbl9jbGlfaW5pdCh1c2VyX2Rpcik7CisKKyAgICBiY21vbHRfdXNlcl9hcHBsX2dwb25fc3RhdGlzdGljc19pbml0KGRldik7CisgICAgYmNtb2x0X3VzZXJfYXBwbF9ncG9uX3N0YXRpc3RpY3NfY2xpX2luaXQodXNlcl9kaXIpOworCisgICAgYmNtb2x0X2dwb25fZHNfb21jaV9hcHBsX2luaXQoZGV2KTsKKyAgICBiY21vbHRfdXNlcl9hcHBsX2dwb25fZHNfb21jaV9jbGlfaW5pdCh1c2VyX2Rpcik7CisKKyAgICBiY21vbHRfZ3Bvbl9yc3NpX2FwcGxfaW5pdChkZXYpOworICAgIGJjbW9sdF91c2VyX2FwcGxfZ3Bvbl9yc3NpX2NsaV9pbml0KHVzZXJfZGlyKTsKKworICAgIGJjbW9sdF9vbnVfdHVuaW5nX2FwcGxfaW5pdChkZXYpOworICAgIGJjbW9sdF91c2VyX2FwcGxfb251X3R1bmluZ19jbGlfaW5pdCh1c2VyX2Rpcik7CisjZW5kaWYgLyogTm90IFJFTEVBU0VfQlVJTEQgKi8KK30KKwordm9pZCBiY21vbHRfdXNlcl9hcHBsX2NsaV9oYW5kbGVfc3lzdGVtX21vZGVfY2hhbmdlKGJjbW9sdF9kZXZpZCBkZXYpCit7CisgICAgYmNtb2x0X3N5c3RlbV9tb2RlIHN5c19tb2RlOworCisgICAgaWYgKHN5c19tb2RlX3NldFtkZXZdID09IEJDTU9TX1RSVUUpCisgICAgeworICAgICAgICByZXR1cm47IC8qIG9ubHkgcnVuIG9uY2UgKi8KKyAgICB9CisKKyAgICBzeXNfbW9kZV9zZXRbZGV2XSA9IEJDTU9TX1RSVUU7CisgICAgKHZvaWQpYmNtb2x0X3N5c3RlbV9tb2RlX2dldChkZXYsICZzeXNfbW9kZSk7CisgICAgc3dpdGNoIChzeXNfbW9kZSkKKyAgICB7CisgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fMTZfWDoKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX184X1g6CisgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fNF9YOgorICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzhfWF9DT0VYSVNURU5DRV9URE1BOgorICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzRfWF9DT0VYSVNURU5DRV9URE1BOgorICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzhfWF8xMF9HOgorICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzRfWF8xMF9HOgorICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzJfWF8xMF9HOgorICAgICAgICBiY21vbHRfdXNlcl9hcHBsX2NsaV9zdGFydF9lcG9uKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0dQT05fXzE2X1g6CisgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfR1BPTl9fOF9YOgorICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0dQT05fXzRfWDoKKyAgICAgICAgYmNtb2x0X3VzZXJfYXBwbF9jbGlfc3RhcnRfZ3BvbihkZXYpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9YR1BPTl8xX184X1g6CisgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfWEdQT05fMV9fNF9YOgorICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX1hHU19fMl9YXzEwX0c6CisgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfTkdQT04yX18yX1hfMTBfRzoKKyAgICAgICAgYmNtb2x0X3VzZXJfYXBwbF9jbGlfc3RhcnRfeGdwb24oZGV2KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfX05VTV9PRjogLyogdW5jb25maWd1cmVkICovCisgICAgICAgIHN5c19tb2RlX3NldFtkZXZdID0gQkNNT1NfRkFMU0U7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIC8qIGRvIG5vdGhpbmcgKi8KKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitiY21vc19lcnJubyBiY21vbHRfdXNlcl9hcHBsX2NsaV9pbml0KGJjbWNsaV9lbnRyeSAqdG9wX2RpcikKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtbGNsaV9wY2lfZHVtcHB0ciA9IGJjbW9zX2FsbG9jKDEwMjQqNSk7CisgICAgdWludDhfdCBpbnN0OworCisgICAgaWYgKCFiY21sY2xpX3BjaV9kdW1wcHRyKQorICAgIHsKKyAgICAgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKCFiY21sY2xpX3BjaV9kdW1wcHRyLCBCQ01fRVJSX05PTUVNKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTlVMTDsKKyAgICB9CisjaWZkZWYgRU5BQkxFX0xPRworICAgIHN0YXRpYyBiY21jbGlfZW51bV92YWwgZW51bV90YWJsZV9maWxlX2lkW10gPQorICAgIHsKKyAgICAgICAgeyAubmFtZSA9ICJTUkFNIiwgLnZhbCA9IEJDTU9MVF9MT0dfRklMRV9JRF9TUkFNIH0sCisgICAgICAgIHsgLm5hbWUgPSAiRERSIiwgLnZhbCA9IEJDTU9MVF9MT0dfRklMRV9JRF9ERFIgfSwKKyAgICAgICAgQkNNQ0xJX0VOVU1fTEFTVAorICAgIH07CisKKyAgICBiY21vbHRfbXNnX2xvZ19pbml0KCk7IC8qIGluaXRpYWxpemUgQVBJL2xvZ2dlciBpbnRlZ3JhdGlvbiAqLworICAgIHVzZXJfYXBwbF9sb2dfaWQgPSBiY21fZGV2X2xvZ19pZF9yZWdpc3RlcigidXNlcl9hcHBsIiwgREVWX0xPR19MRVZFTF9ERUJVRywgREVWX0xPR19JRF9UWVBFX0JPVEgpOworICAgIGZvciAoaW5zdCA9IDA7IGluc3QgPCBCQ01UUl9NQVhfSU5TVEFOQ0VTOyBpbnN0KyspCisgICAgeworICAgICAgICBjaGFyIGxvZ19uYW1lW01BWF9ERVZfTE9HX0lEX05BTUVdOworICAgICAgICBzcHJpbnRmKGxvZ19uYW1lLCAiaW5kX21zZyV1IiwgaW5zdCk7CisgICAgICAgIGluZF9sb2dfaWRbaW5zdF0gPSBiY21fZGV2X2xvZ19pZF9yZWdpc3Rlcihsb2dfbmFtZSwgREVWX0xPR19MRVZFTF9ERUJVRywgREVWX0xPR19JRF9UWVBFX0JPVEgpOworICAgIH0KKyNlbmRpZgorICAgIHVzZXJfZGlyID0gYmNtY2xpX2Rpcl9hZGQodG9wX2RpciwgInVzZXIiLCAiVXNlciBhcHBsaWNhdGlvbiIsIEJDTUNMSV9BQ0NFU1NfQURNSU4sIE5VTEwpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUighdXNlcl9kaXIsIEJDTV9FUlJfTk9NRU0pOworI2lmZGVmIEVOQUJMRV9MT0cKKyAgICBCQ01DTElfTUFLRV9DTUQodXNlcl9kaXIsICJyZWdpc3Rlcl9pbmRpY2F0aW9uX2hhbmRsZXIiLCAiUmVnaXN0ZXIgaW5kaWNhdGlvbiBoYW5kbGVyIiwgX2FwaWNsaV9pbmRpY2F0aW9uX2hhbmRsZXIsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fREVGVkFMKCJwb25fbmlfbWFzayIsICJQT05fTkkgaW50ZXJmYWNlIGJpdG1hc2suIDA9YWxsIiwgQkNNQ0xJX1BBUk1fVU5VTUJFUiwgMCwgMCkpOworICAgIEJDTUNMSV9NQUtFX0NNRCh1c2VyX2RpciwgInJlZ2lzdGVyX3Byb3h5X3J4X2hhbmRsZXIiLCAiUmVnaXN0ZXIgUHJveHkgUnggaGFuZGxlciIsIF9hcGljbGlfcHJveHlfcnhfaGFuZGxlciwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9ERUZWQUwoInBvbl9uaV9tYXNrIiwgIlBPTl9OSSBpbnRlcmZhY2UgYml0bWFzay4gMD1hbGwiLCBCQ01DTElfUEFSTV9VTlVNQkVSLCAwLCAwKSk7CisgICAgQkNNQ0xJX01BS0VfQ01EKHVzZXJfZGlyLCAicmVhZF9lbWJlZGRlZF9sb2dnZXIiLCAiUmVhZCBlbWJlZGRlZCBsb2dnZXIiLCBfYXBpY2xpX3JlYWRfZW1iZWRkZWRfbG9nZ2VyLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oImZpbGVfaWQiLCAiZmlsZV9pZCIsIGVudW1fdGFibGVfZmlsZV9pZCwgMCkpOworCisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTSh1c2VyX2RpciwgImdldF9hbGxfbG9nX2VudHJpZXMiLCAiR2V0IGFsbCBlbWJlZGRlZCBsb2cgZW50cmllcyIsIF9hcGljbGlfZ2V0X2FsbF9sb2dfZW50cmllcyk7CisjZW5kaWYKKworI2lmbmRlZiBTSU1VTEFUSU9OX0JVSUxECisgICAgQkNNQ0xJX01BS0VfQ01EKHVzZXJfZGlyLCAicGNpc3RhdCIsICJQcmludCBQQ0llIHN0YXRpc3RpY3MiLCBfYXBpY2xpX3BjaXN0YXQsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImNsZWFyIiwgImNsZWFyIiwgQkNNQ0xJX1BBUk1fU1RSSU5HLCBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMKSk7CisgICAgQkNNQ0xJX01BS0VfQ01EKHVzZXJfZGlyLCAicGNpZHVtcCIsICJQcmludCBQQ0llIHJpbmciLCBfYXBpY2xpX3BjaWR1bXAsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImRpciIsICJkaXJlY3Rpb246IHR4IG9yIHJ4IiwgQkNNQ0xJX1BBUk1fU1RSSU5HLCAwKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiZnJvbSIsICJzdGFydCBpbmRleCIsIEJDTUNMSV9QQVJNX05VTUJFUiwgQkNNQ0xJX1BBUk1fRkxBR19PUFRJT05BTCksCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImhvd21hbnkiLCAiaG93bWFueSIsIEJDTUNMSV9QQVJNX05VTUJFUiwgQkNNQ0xJX1BBUk1fRkxBR19PUFRJT05BTCkpOworI2VuZGlmCisKKyNpZm5kZWYgUkVMRUFTRV9CVUlMRAorICAgIGJjbW9sdF9yZW1vdGVfbG9nZ2VyX2FwcGxfaW5pdCgpOworICAgIGJjbW9sdF9yZW1vdGVfbG9nZ2VyX2FwcGxfY2xpX2luaXQodXNlcl9kaXIpOworI2VuZGlmCisKKyAgICBlcnIgPSBiY21vbHRfdXNlcl9hcHBsX2NsaV9pbWFnZV90cmFuc2Zlcl9pbml0KHVzZXJfZGlyKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoZXJyICE9IEJDTV9FUlJfT0ssIGVycik7CisKKyAgICBlcnIgPSBiY21vbHRfdXNlcl9hcHBsX2NsaV9zd191cGdyYWRlX2luaXQodXNlcl9kaXIpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihlcnIgIT0gQkNNX0VSUl9PSywgZXJyKTsKKworICAgIGJjbW9sdF9wc19hcHBsX2luaXQoKTsKKyAgICBlcnIgPSBiY21vbHRfdXNlcl9hcHBsX3BzX2NsaV9pbml0KHVzZXJfZGlyKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoZXJyICE9IEJDTV9FUlJfT0ssIGVycik7CisKKyAgICBiY21vbHRfdXNlcl9hcHBsX3BsYXliYWNrX2luaXQoKTsKKyAgICBiY21vbHRfdXNlcl9hcHBsX3BsYXliYWNrX2NsaV9pbml0KHVzZXJfZGlyKTsKKworICAgIGJjbW9sdF91c2VyX2FwcGxfY2xpX2hhbmRsZV9zeXN0ZW1fbW9kZV9jaGFuZ2UoY3VycmVudF9kZXZpY2UpOworCisgICAgcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvYmNtb2x0X3VzZXJfYXBwbF9jbGkuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvYmNtb2x0X3VzZXJfYXBwbF9jbGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2ExMDVlCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9iY21vbHRfdXNlcl9hcHBsX2NsaS5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgX0JDTU9MVF9VU0VSX0FQUExfQ0xJX0hfCisjZGVmaW5lIF9CQ01PTFRfVVNFUl9BUFBMX0NMSV9IXworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtb2x0X21zZy5oPgorCit2b2lkIGJjbW9sdF91c2VyX2FwcGxfaW5kaWNhdGlvbl9jYihiY21vbHRfZGV2aWQgZGV2LCBiY21vbHRfbXNnICptc2cpOworCit2b2lkIGJjbW9sdF91c2VyX2FwcGxfcHJveHlfcnhfY2IoYmNtb2x0X2RldmlkIGRldiwgYmNtb2x0X21zZyAqbXNnKTsKKwordm9pZCBiY21vbHRfdXNlcl9hcHBsX2NsaV9oYW5kbGVfc3lzdGVtX21vZGVfY2hhbmdlKGJjbW9sdF9kZXZpZCBkZXYpOworCitiY21vc19lcnJubyBiY21vbHRfdXNlcl9hcHBsX2NsaV9pbml0KGJjbWNsaV9lbnRyeSAqdG9wX2Rpcik7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2JjbW9sdF91c2VyX2FwcGxfZXhfY2xpLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2JjbW9sdF91c2VyX2FwcGxfZXhfY2xpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZhYzAxNgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvYmNtb2x0X3VzZXJfYXBwbF9leF9jbGkuYwpAQCAtMCwwICsxLDc3MSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2luY2x1ZGUgPGJjbW9sdF9tc2cuaD4KKyNpbmNsdWRlIDxiY21vbHRfYXBpLmg+CisjaW5jbHVkZSA8YmNtY2xpLmg+CisjaW5jbHVkZSA8YmNtX2FwaV9jbGkuaD4KKyNpbmNsdWRlIDxiY21fYXBpX2NsaV9oZWxwZXJzLmg+CisjaW5jbHVkZSA8YmNtX2Rldl9sb2cuaD4KKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX2V4X2NsaS5oIgorCisjaWZkZWYgRU5BQkxFX0xPRworc3RhdGljIGRldl9sb2dfaWQgdXNlcl9hcHBsX2V4X2xvZ19pZDsKKworc3RhdGljIHZvaWQgdXNlcl9hcHBsX2dlbmVyYWxfaW5kaWNhdGlvbl9jYihiY21vbHRfZGV2aWQgb2x0LCBiY21vbHRfbXNnICptc2cpCit7CisgICAgYmNtX2Rldl9sb2dfbG9nKHVzZXJfYXBwbF9leF9sb2dfaWQsIERFVl9MT0dfTEVWRUxfREVCVUcsIEJDTV9MT0dfRkxBR19OT19IRUFERVIsCisgICAgICAgICJbLS0gRGV2ICV1OiBJbmRpY2F0aW9uIFJlY2VpdmVkIC0tXVxuIiwgb2x0KTsKKyAgICBzd2l0Y2ggKG1zZy0+b2JqX3R5cGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9PQkpfSURfREVCVUc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fTkk6CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy0+c3ViZ3JvdXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX0xPUzoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfZ3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkICppbmQgPSAoYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCopbXNnOworICAgICAgICAgICAgICAgICAgICBiY21fZGV2X2xvZ19sb2codXNlcl9hcHBsX2V4X2xvZ19pZCwgREVWX0xPR19MRVZFTF9ERUJVRywgQkNNX0xPR19GTEFHX05PX0hFQURFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJEZXYgJXU6IHBvbiBuaSBzdGF0ZSBjaGFuZ2VkIG5ld19zdGF0ZSAlZCwgcHJldiBzdGF0ZSAlZCwgcmVzdWx0ICVkIFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9sdCwgaW5kLT5kYXRhLm5ld19zdGF0ZSwgaW5kLT5kYXRhLnByZXZpb3VzX3N0YXRlLCBpbmQtPmRhdGEucmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIC8qIC4uLiAqLworICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fT05VOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLyogLi4uICovCisgICAgfQorICAgIGJjbW9sdF9tc2dfZnJlZShtc2cpOworfQorCitzdGF0aWMgdm9pZCB1c2VyX2FwcGxfcG9uX25pX2luZGljYXRpb25fY2IoYmNtb2x0X2RldmlkIG9sdCwgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGJjbV9kZXZfbG9nX2xvZyh1c2VyX2FwcGxfZXhfbG9nX2lkLCBERVZfTE9HX0xFVkVMX0RFQlVHLCBCQ01fTE9HX0ZMQUdfTk9fSEVBREVSLAorICAgICAgICAiWy0tIERldiAldTogUG9uIE5JIEluZGljYXRpb24gUmVjZWl2ZWQgLS1dXG4iLCBvbHQpOworICAgIHN3aXRjaCAobXNnLT5vYmpfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX05JOgorICAgICAgICAgICAgc3dpdGNoIChtc2ctPnN1Ymdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9MT1M6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fTklfQVVUT19JRF9TVEFURV9DSEFOR0VfQ09NUExFVEVEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCAqaW5kID0gKGJjbW9sdF9ncG9uX25pX3N0YXRlX2NoYW5nZV9jb21wbGV0ZWQqKW1zZzsKKyAgICAgICAgICAgICAgICAgICAgYmNtX2Rldl9sb2dfbG9nKHVzZXJfYXBwbF9leF9sb2dfaWQsIERFVl9MT0dfTEVWRUxfREVCVUcsIEJDTV9MT0dfRkxBR19OT19IRUFERVIsCisgICAgICAgICAgICAgICAgICAgICAgICAiRGV2ICV1OiBwb24gbmkgc3RhdGUgY2hhbmdlZCBuZXdfc3RhdGUgJWQsIHByZXYgc3RhdGUgJWQsIHJlc3VsdCAlZCBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBvbHQsIGluZC0+ZGF0YS5uZXdfc3RhdGUsIGluZC0+ZGF0YS5wcmV2aW91c19zdGF0ZSwgaW5kLT5kYXRhLnJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJjbV9kZXZfbG9nX2xvZyh1c2VyX2FwcGxfZXhfbG9nX2lkLCBERVZfTE9HX0xFVkVMX0RFQlVHLCBCQ01fTE9HX0ZMQUdfTk9fSEVBREVSLAorICAgICAgICAgICAgICAgICJbLS0gRGV2ICV1OiBzb21lIG90aGVyIGluZGljYXRpb24gIC0tXVxuIiwgb2x0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAvKiAuLi4gKi8KKyAgICB9CisgICAgYmNtb2x0X21zZ19mcmVlKG1zZyk7Cit9CisKK3N0YXRpYyB2b2lkIHVzZXJfYXBwbF9kZXZpY2VfbG9nZ2VyX2luZGljYXRpb25fY2IoYmNtb2x0X2RldmlkIG9sdCwgYmNtb2x0X21zZyAqbXNnKQoreworICAgIGlmIChtc2ctPnN1Ymdyb3VwID09IEJDTU9MVF9ERUJVR19BVVRPX0lEX0NMSV9PVVRQVVQpCisgICAgeworICAgICAgICBiY21vbHRfZGVidWdfY2xpX291dHB1dCAqaW5kID0gKGJjbW9sdF9kZWJ1Z19jbGlfb3V0cHV0ICopbXNnOworICAgICAgICBiY21fZGV2X2xvZ19sb2codXNlcl9hcHBsX2V4X2xvZ19pZCwgREVWX0xPR19MRVZFTF9ERUJVRywgQkNNX0xPR19GTEFHX05PX0hFQURFUiwKKyAgICAgICAgICAgICJEZXYgJXU6IFtkZXZpY2UgbG9nZ2VyXSAlc1xuIiwgb2x0LCBpbmQtPmRhdGEuZGF0YS52YWwpOworICAgfQorfQorCitzdGF0aWMgYmNtb3NfZXJybm8gdXNlcl9hcHBsX2luZGljYXRpb25faGFuZGxlcihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIGJjbW9sdF9yeF9jZmcgcnhfY2ZnOworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgcnhfY2ZnLm9ial90eXBlID0gQkNNT0xUX09CSl9JRF9ERUJVRzsKKyAgICByeF9jZmcucnhfY2IgPXVzZXJfYXBwbF9kZXZpY2VfbG9nZ2VyX2luZGljYXRpb25fY2I7CisgICAgcnhfY2ZnLmZsYWdzID0gQkNNT0xUX0FVVE9fRkxBR1NfTk9ORTsKKyAgICByYyA9IGJjbW9sdF9hdXRvX3J4X2NiX3NldChjdXJyZW50X2RldmljZSwgJnJ4X2NmZyk7CisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgcnhfY2ZnLm9ial90eXBlID0gQkNNT0xUX09CSl9JRF9HUE9OX05JOworICAgIHJ4X2NmZy5yeF9jYiA9IHVzZXJfYXBwbF9wb25fbmlfaW5kaWNhdGlvbl9jYjsKKyAgICByeF9jZmcuZmxhZ3MgPSBCQ01PTFRfQVVUT19GTEFHU19OT05FOworICAgIHJjID0gYmNtb2x0X2F1dG9fcnhfY2Jfc2V0KGN1cnJlbnRfZGV2aWNlLCAmcnhfY2ZnKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICByeF9jZmcub2JqX3R5cGUgPSBCQ01PTFRfT0JKRUNUX0FOWTsKKyAgICByeF9jZmcucnhfY2IgPSB1c2VyX2FwcGxfZ2VuZXJhbF9pbmRpY2F0aW9uX2NiOworICAgIHJ4X2NmZy5mbGFncyA9IEJDTU9MVF9BVVRPX0ZMQUdTX05PTkU7CisgICAgcmV0dXJuIGJjbW9sdF9hdXRvX3J4X2NiX3NldChjdXJyZW50X2RldmljZSwgJnJ4X2NmZyk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyB1c2VyX2FwcGxfbG9nX2VudHJ5X3NldChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfbG9nX2VudHJ5X2NmZyBjZmc7IC8qKjwgZGVjbGFyZSBtYWluIEFQSSBzdHJ1Y3QgKi8KKyAgICBiY21vbHRfbG9nX2VudHJ5X2tleSBrZXkgPSB7LmxvZ19pZD0gMH07IC8qKjwgZGVjbGFyZSBrZXkgKi8KKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgbG9nX2VudHJ5LCBrZXkpOworCisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBsb2dfZW50cnksIGxvZ19sZXZlbF9wcmludCwgQkNNT0xUX0xPR19MRVZFTF9JTkZPKTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGxvZ19lbnRyeSwgbG9nX2xldmVsX3NhdmUsIEJDTU9MVF9MT0dfTEVWRUxfREVCVUcpOworICAgIC8qIGNhbGwgQVBJICovCisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoMCwgJmNmZy5oZHIpOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyB1c2VyX2FwcGxfZ3Bvbl9uaV9kaXNhYmxlX2luZGljYXRpb24gKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9ncG9uX25pX2F1dG9fY2ZnIGNmZzsgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7LnBvbl9uaT0gMH07IC8qKjwgZGVjbGFyZSBrZXkgKi8KKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfQVVUT19DRkdfSU5JVCgmY2ZnLCBncG9uX25pLCBrZXkpOworCisgICAgQkNNT0xUX0FVVE9fQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fbmksIHNlcmlhbF9udW1iZXJfYWNxdWlzaXRpb25fY3ljbGVfc3RhcnQsIEJDTU9TX0ZBTFNFKTsKKyAgICBCQ01PTFRfQVVUT19DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9uaSwgc3RhdF9hbGFybV9jbGVhcmVkLCBCQ01PU19GQUxTRSk7CisgICAgLyogY2FsbCBBUEkgKi8KKyAgICBlcnIgPSBiY21vbHRfYXV0b19jZmdfc2V0KDAsICZjZmcuaGRyKTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gdXNlcl9hcHBsX3JlZGlyZWN0X2RldmljZV9sb2dnZXIgKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgYmNtb2x0X2RlYnVnX2NmZyBjZmc7CisgICAgYmNtb2x0X2RlYnVnX2tleSBrZXkgPSB7fTsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBkZWJ1Zywga2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRlYnVnLCBjb25zb2xlX3JlZGlyZWN0aW9uLCBCQ01PTFRfQ09OU09MRV9SRURJUkVDVElPTl9DTE9ORSk7CisgICAgYmNtb2x0X2NmZ19zZXQoMCwgJmNmZy5oZHIpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyB1c2VyX2FwcGxfZ3Bvbl9kZXZpY2VfaW5pdChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIGJjbW9sdF9kZXZpY2VfY2ZnIGNmZzsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2RldmljZV9rZXkga2V5ID0gey5yZXNlcnZlZCA9IDB9OworICAgIGJjbW9sdF9kZXZpY2Vfbm5pX3NwZWVkIG5uaV9zcGVlZCA9IHt9OyAvKio8IERldmljZSBuZXR3b3JrIGludGVyZmFjZSBzcGVlZCBjb25maWd1cmF0aW9uICovCisgICAgYmNtb2x0X2RldmljZV9jb25uZWN0IG9wZXI7CisKKyAgICBubmlfc3BlZWQuZmlyc3RfaGFsZiA9IEJDTU9MVF9OTklfU1BFRURfR0JQU18xOworICAgIG5uaV9zcGVlZC5zZWNvbmRfaGFsZiA9IEJDTU9MVF9OTklfU1BFRURfR0JQU18xOworCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGRldmljZSwga2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwgc3lzdGVtX21vZGUsIEJDTU9MVF9TWVNURU1fTU9ERV9HUE9OX18xNl9YKTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwga2VlcGFsaXZlX2ludGVydmFsLCA1KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGRldmljZSwga2VlcGFsaXZlX3RvbGVyYW5jZSwgNSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBkZXZpY2UsIG5uaV9zcGVlZCwgbm5pX3NwZWVkKTsKKyAgICBlcnIgPSBiY21vbHRfY2ZnX3NldCgwLCAmY2ZnLmhkcik7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBkZXZpY2UsIGNvbm5lY3QsIGtleSk7CisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KDAsICZvcGVyLmhkcik7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHVzZXJfYXBwbF9ncG9uX3NldF90cngoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICBiY21vbHRfZ3Bvbl90cnhfY2ZnIGNmZzsKKyAgICBiY21vbHRfZ3Bvbl90cnhfa2V5IGtleSA9IHsucG9uX25pID0gMH07CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl90cngsIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX3RyeCwgdHJhbnNjZWl2ZXJfdHlwZSwgQkNNT0xUX1RSWF9UWVBFX1NPVVJDRV9QSE9UT05JQ1MpOworICAgIHJldHVybiBiY21vbHRfY2ZnX3NldCgwLCAmY2ZnLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyB1c2VyX2FwcGxfZ3Bvbl9zZXRfaW50ZXJ3b3JraW5nX21vZGUoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICBiY21vbHRfZ3Bvbl9pd2ZfY2ZnIGNmZzsKKyAgICBiY21vbHRfZ3Bvbl9pd2Zfa2V5IGtleSA9IHsucG9uX25pID0gMH07CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9pd2YsIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3ZiwgaXdmX21vZGUsIEJDTU9MVF9JV0ZfTU9ERV9QRVJfRkxPV19NT0RFKTsKKyAgICByZXR1cm4gYmNtb2x0X2NmZ19zZXQoMCwgJmNmZy5oZHIpOworCit9CisKK3N0YXRpYyBiY21vc19lcnJubyB1c2VyX2FwcGxfZ3Bvbl9zZXRfbWFjX3RhYmxlX2NvbmZpZyhiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIGJjbW9sdF9ncG9uX2l3Zl9jZmcgY2ZnX2l3ZjsKKyAgICBiY21vbHRfZ3Bvbl9pd2Zfa2V5IGtleV9pd2YgPSB7LnBvbl9uaSA9IDB9OworICAgIGJjbW9sdF9tYWNfdGFibGVfY29uZmlndXJhdGlvbiBtYWNfdGFibGVfY29uZmlndXJhdGlvbjsKKyAgICBtYWNfdGFibGVfY29uZmlndXJhdGlvbi5hZ2luZ190aW1lID0gMTAwMDA7CisgICAgbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24uYXV0b21hdGljX21hY19hZ2luZyA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU7CisgICAgbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24uYXV0b21hdGljX21hY19sZWFybmluZyA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0RJU0FCTEU7CisgICAgbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24uYXV0b21hdGljX21hY19tb3ZlID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRElTQUJMRTsKKyAgICBtYWNfdGFibGVfY29uZmlndXJhdGlvbi5hdXRvbWF0aWNfc3RhdGljX21vZGUgPSBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFOworICAgIG1hY190YWJsZV9jb25maWd1cmF0aW9uLmRlZmF1bHRfZmxvd19pZCA9IDYwMDsKKyAgICBtYWNfdGFibGVfY29uZmlndXJhdGlvbi5sZWFybmluZ19tb2RlID0gQkNNT0xUX01BQ19UQUJMRV9MRUFSTklOR19NT0RFX05PUk1BTDsKKyAgICBtYWNfdGFibGVfY29uZmlndXJhdGlvbi5taXNzX2ZhbGxiYWNrID0gQkNNT0xUX01BQ19UQUJMRV9NSVNTX0ZBTExCQUNLX0RFRkFVTFRfRkxPVzsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnX2l3ZiwgZ3Bvbl9pd2YsIGtleV9pd2YpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZ19pd2YsIGdwb25faXdmLCBtYWNfdGFibGVfY29uZmlndXJhdGlvbiwgbWFjX3RhYmxlX2NvbmZpZ3VyYXRpb24pOworICAgIC8qIG11c3Qgc2V0IHRoZSBJV0YgdG8gcGVyIGZvdyBmb3IgbWFjIHRhYmxlIG1hcHBpbmcgdG8gd29yayAqLworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZ19pd2YsIGdwb25faXdmLCBpd2ZfbW9kZSwgQkNNT0xUX0lXRl9NT0RFX1BFUl9GTE9XX01PREUpOworICAgIHJldHVybiBiY21vbHRfY2ZnX3NldCgwLCAmY2ZnX2l3Zi5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gdXNlcl9hcHBsX2dwb25fYWN0aXZhdGVfcG9uKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZSBvcGVyX25pOworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXlfbmkgPSB7LnBvbl9uaSA9IDB9OworCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3Blcl9uaSwgZ3Bvbl9uaSwgc2V0X3Bvbl9zdGF0ZSwga2V5X25pKTsKKyAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3Blcl9uaSwgZ3Bvbl9uaSwgc2V0X3Bvbl9zdGF0ZSwgcG9uX3N0YXRlLCBCQ01PTFRfUE9OX09QRVJBVElPTl9BQ1RJVkVfV09SS0lORyk7CisgICAgcmV0dXJuIGJjbW9sdF9vcGVyX3N1Ym1pdCgwLCAmb3Blcl9uaS5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gdXNlcl9hcHBsX2dwb25fc3RhcnRfc25fYWNxdWlzaXRpb24oYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICBiY21vbHRfZ3Bvbl9uaV9jZmcgY2ZnX25pOworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXlfbmkgPSB7LnBvbl9uaSA9IDB9OworICAgIGJjbW9sdF9ncG9uX3NuX2FjcXVpc2l0aW9uIHNuX2FjcXVpc2l0aW9uOworCisgICAgc25fYWNxdWlzaXRpb24uY29udHJvbCA9IEJDTU9MVF9DT05UUk9MX1NUQVRFX0VOQUJMRTsKKyAgICBzbl9hY3F1aXNpdGlvbi5pbnRlcnZhbCA9IDc3MDAwOworICAgIHNuX2FjcXVpc2l0aW9uLm9udV9wb3N0X2Rpc2NvdmVyeV9tb2RlID0gQkNNT0xUX09OVV9QT1NUX0RJU0NPVkVSWV9NT0RFX0RJU0FCTEU7CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZ19uaSwgZ3Bvbl9uaSwga2V5X25pKTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmdfbmksIGdwb25fbmksIHNuX2FjcXVpc2l0aW9uLCBzbl9hY3F1aXNpdGlvbik7CisgICAgcmV0dXJuIGJjbW9sdF9jZmdfc2V0KDAsICZjZmdfbmkuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHVzZXJfYXBwbF9ncG9uX25pX2dldF9zdGF0cyhiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIGJjbW9sdF9ncG9uX25pX3N0YXQgc3RhdDsgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7fTsgLyoqPCBkZWNsYXJlIGtleSAqLworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9TVEFUX0lOSVQoJnN0YXQsIGdwb25fbmksIGtleSk7CisgICAgQkNNT0xUX1NUQVRfUFJPUF9HRVQoJnN0YXQsIGdwb25fbmksIGFsbF9wcm9wZXJ0aWVzKTsKKyAgICByZXR1cm4gYmNtb2x0X3N0YXRfZ2V0KDAsICZzdGF0LmhkciwgQkNNT1NfVFJVRSk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyB1c2VyX2FwcGxfZ3Bvbl9vbnVfY29uZmlnKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgYmNtb2x0X2dwb25fb251X2NmZyBjZmc7CisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7LnBvbl9uaSA9IDAsIC5vbnVfaWQgPSAyfTsKKyAgICBiY21vbHRfc2VyaWFsX251bWJlciBzZXJpYWxfbnVtYmVyID0gey52ZW5kb3JfaWQgPSB7MHgwMCwweDAwLDB4MDAsIDB4MDB9LCAudmVuZG9yX3NwZWNpZmljID0gezB4MDAsMHgwMCwweDAwLCAweDAyfX07CisgICAgYmNtb2x0X2Fycl91OF8xMCBwYXNzd29yZCA9IHsuYXJyID0gezB4MDAsMHgwMCwweDAwLCAweDAwLCAweDAwLDB4MDAsMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH19OworCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fb251LCBrZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIHNlcmlhbF9udW1iZXIsIHNlcmlhbF9udW1iZXIpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIHBhc3N3b3JkLCBwYXNzd29yZCk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgYXV0b19wYXNzd29yZF9sZWFybmluZywgQkNNT1NfVFJVRSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgdXNfZmVjLCBCQ01PU19GQUxTRSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgb21jaV9wb3J0X2lkLCAyKTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBkc19iZXJfcmVwb3J0aW5nX2ludGVydmFsLCA1MDAwKTsKKyAgICByZXR1cm4gYmNtb2x0X2NmZ19zZXQoMCwgJmNmZy5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gdXNlcl9hcHBsX2dwb25fYWN0aXZhdGVfb251KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGUgb3BlcjsKKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsucG9uX25pID0gMCwgLm9udV9pZCA9IDJ9OworCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZ3Bvbl9vbnUsIHNldF9vbnVfc3RhdGUsIGtleSk7CisgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25fb251LCBzZXRfb251X3N0YXRlLCBvbnVfc3RhdGUsIEJDTU9MVF9PTlVfT1BFUkFUSU9OX0FDVElWRSk7CisgICAgcmV0dXJuIGJjbW9sdF9vcGVyX3N1Ym1pdCgwLCAmb3Blci5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gdXNlcl9hcHBsX2dwb25fYWxsb2NfaWRfY29uZmlnKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgYmNtb2x0X2dwb25fYWxsb2NfY2ZnIGNmZzsKKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19rZXkga2V5ID0gey5wb25fbmkgPSAwLCAuYWxsb2NfaWQgPSAzMjB9OworCisgICAgYmNtb2x0X3Bvbl9hbGxvY19zbGEgc2xhOyAvKio8IEFsbG9jIElEIFNMQS4gKi8KKworICAgIHNsYS5hZGRpdGlvbmFsX2J3X2VsaWdpYmlsaXR5ID0gQkNNT0xUX0FERElUSU9OQUxfQldfRUxJR0lCSUxJVFlfTk9OX0FTU1VSRUQ7CisgICAgc2xhLmNicl9ydF9idyA9IDA7CisgICAgc2xhLmNicl9ucnRfYncgPSAxNDAwMDAwMDA7CisgICAgc2xhLmd1YXJhbnRlZWRfYncgPSAxNDAwMDAwMDA7CisgICAgc2xhLm1heGltdW1fYncgPSAxNDAwMDAwMDA7CisgICAgc2xhLmFsbG9jX3R5cGUgPSBCQ01PTFRfQUxMT0NfVFlQRV9OU1I7CisgICAgc2xhLmNicl9ydF9jb21wZW5zYXRpb24gPSBCQ01PU19GQUxTRTsKKyAgICBzbGEuY2JyX25ydF9hcF9pbmRleCA9IDA7CisgICAgc2xhLmNicl9ydF9hcF9pbmRleCA9IDA7CisgICAgc2xhLndlaWdodCA9IDA7CisgICAgc2xhLnByaW9yaXR5ID0gMDsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2FsbG9jLCBrZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9hbGxvYywgb251X2lkLCAyKTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fYWxsb2MsIHNsYSwgc2xhKTsKKyAgICByZXR1cm4gYmNtb2x0X2NmZ19zZXQoMCwgJmNmZy5oZHIpOworfQorCisvKiBDb25maWd1cmUgYSBHRU0gLSBmb3IgRFMgb3IgYmlkaXJlY3Rpb25hbCB0cmFmZmljICovCitzdGF0aWMgYmNtb3NfZXJybm8gdXNlcl9hcHBsX2dwb25fZ2VtX3BvcnRfY29uZmlnKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgYmNtb2x0X2dwb25fZ2VtX3BvcnRfY2ZnIGNmZzsKKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkga2V5ID0gey5wb25fbmkgPSAwLCAuZ2VtX3BvcnRfaWQgPSAzMjB9OworCisgICAgYmNtb2x0X2dlbV9wb3J0X2NvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IHsuZGlyZWN0aW9uID0gQkNNT0xUX0dFTV9QT1JUX0RJUkVDVElPTl9CSURJUkVDVElPTkFMLCAudHlwZSA9IEJDTU9MVF9HRU1fUE9SVF9UWVBFX1VOSUNBU1R9OworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2dlbV9wb3J0LCBrZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgb251X2lkLCAyKTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGRvd25zdHJlYW1fZW5jcnlwdGlvbl9tb2RlLCBCQ01PTFRfQ09OVFJPTF9TVEFURV9ESVNBQkxFKTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGNvbmZpZ3VyYXRpb24sIGNvbmZpZ3VyYXRpb24pOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9nZW1fcG9ydCwgdXBzdHJlYW1fZGVzdGluYXRpb25fcXVldWUsIEJDTU9MVF9VU19HRU1fUE9SVF9ERVNUSU5BVElPTl9EQVRBKTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fZ2VtX3BvcnQsIGNvbnRyb2wsIEJDTU9MVF9DT05UUk9MX1NUQVRFX0VOQUJMRSk7CisgICAgcmV0dXJuIGJjbW9sdF9jZmdfc2V0KDAsICZjZmcuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHVzZXJfYXBwbF9ncG9uX2RzX2dlbV9wb3J0X21vZGlmeShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIC8qIHRoaXMgY2FuIG9ubHkgYmUgY2FsbGVkIGluIFBFUiBmbG93IG1vZGUgKi8KKyAgICAvKiBzZXQgRFMgcG9ydCBtYXBwaW5nIGluaXRpYWwgR0VNIDMwMCwgZmluYWwgR0VNIDMyMCAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvd19rZXkga2V5ID0gey5wb25fbmkgPSAwLCAuZmxvd19pZCA9IDMwMH07CisgICAgYmNtb2x0X2dwb25faXdmX2RzX2VncmVzc19mbG93X2NmZyBjZmc7CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9pd2ZfZHNfZWdyZXNzX2Zsb3csIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl9kc19lZ3Jlc3NfZmxvdywgZ2VtX3BvcnQsIDMyMCk7CisgICAgcmV0dXJuIGJjbW9sdF9jZmdfc2V0KDAsICZjZmcuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHVzZXJfYXBwbF9ncG9uX3NldF9kc19wZXJfdmxhbl9tYXBwaW5nX21ldGhvZChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIC8qIFdoZW4gd29ya2luZyB3aXRoIHBlciBmbG93IG1vZGUgdGhlIHVzZXIgbXVzdCBhZGQgYW4gZW50cnkgZm9yIGVhY2ggVklEIChmbG93KSB0aGlzIHdheSAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfa2V5IGtleSA9IHsucG9uX25pID0gMCwgLnZsYW5faWQgPSAzMDB9OworICAgIGJjbW9sdF9ncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3dfY2ZnIGNmZzsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIG1hcHBpbmdfbWV0aG9kLCBCQ01PTFRfVkxBTl9UT19GTE9XX01BUFBJTkdfTUVUSE9EX1ZJRCk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIG1hcHBpbmdfdGFnLCBCQ01PTFRfTUFQUElOR19UQUdfTUVUSE9EX09VVEVSX1ZJRCk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl9kc19pbmdyZXNzX2Zsb3csIHZsYW5fYWN0aW9uLCBCQ01PTFRfRFNfVkxBTl9BQ1RJT05fVFJBTlNQQVJFTlQpOworICAgIHJldHVybiBiY21vbHRfY2ZnX3NldCgwLCAmY2ZnLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyB1c2VyX2FwcGxfZ3Bvbl9zZW5kX29tY2lfcGFja2V0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgYmNtb2x0X2dwb25fb251X2NwdV9wYWNrZXRzIHByb3h5OyAvKio8IGRlY2xhcmUgbWFpbiBBUEkgc3RydWN0ICovCisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7LnBvbl9uaSA9IDAsIC5vbnVfaWQgPSAyfTsgLyoqPCBkZWNsYXJlIGtleSAqLworICAgIGJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OCBidWZmZXI7CisgICAgdWludDhfdCBjcHVfYnVmWzEwMF07CisgICAgYnVmZmVyLmxlbiA9IDQ4OworICAgIGJ1ZmZlci52YWwgPSBjcHVfYnVmOworCisgICAgLyogaW5pdCB0aGUgQVBJIHN0cnVjdCAqLworICAgIEJDTU9MVF9QUk9YWV9JTklUKCZwcm94eSwgZ3Bvbl9vbnUsIGNwdV9wYWNrZXRzLCBrZXkpOworICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fb251LCBjcHVfcGFja2V0cywgcGFja2V0X3R5cGUsIEJDTU9MVF9QQUNLRVRfVFlQRV9PTUNJKTsKKyAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCBncG9uX29udSwgY3B1X3BhY2tldHMsIGNhbGNfY3JjLCBCQ01PU19UUlVFKTsKKyAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCBncG9uX29udSwgY3B1X3BhY2tldHMsIG51bWJlcl9vZl9wYWNrZXRzLCAxKTsKKyAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCBncG9uX29udSwgY3B1X3BhY2tldHMsIHBhY2tldF9zaXplLCA0OCk7CisgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgZ3Bvbl9vbnUsIGNwdV9wYWNrZXRzLCBidWZmZXIsIGJ1ZmZlcik7CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIHJldHVybiBiY21vbHRfcHJveHlfc2VuZCgwLCAmcHJveHkuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHVzZXJfYXBwbF9ncG9uX3NlbmRfY3B1X3BhY2tldHNfb3Zlcl9nZW1fcG9ydHMoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICBiY21vbHRfZ3Bvbl9uaV9jcHVfcGFja2V0cyBwcm94eTsgLyoqPCBkZWNsYXJlIG1haW4gQVBJIHN0cnVjdCAqLworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7LnBvbl9uaSA9IDB9OyAvKio8IGRlY2xhcmUga2V5ICovCisgICAgYmNtb2x0X2dwb25fZ2VtX2lkIGdlbV9wb3J0X2lkX2FycmF5WzEwXTsKKyAgICBiY21vbHRfZ3Bvbl9nZW1faWRfbGlzdF91OF9tYXhfMTYgZ2VtX3BvcnRfbGlzdDsKKyAgICBiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDggYnVmZmVyOworICAgIHVpbnQ4X3QgY3B1X2J1ZlsxMDBdOworICAgIGJ1ZmZlci5sZW4gPSA5NjsKKyAgICBidWZmZXIudmFsID0gY3B1X2J1ZjsKKworICAgIGdlbV9wb3J0X2xpc3QubGVuID0gMTA7CisgICAgZ2VtX3BvcnRfbGlzdC52YWwgPSBnZW1fcG9ydF9pZF9hcnJheTsKKworICAgIC8qIGluaXQgdGhlIEFQSSBzdHJ1Y3QgKi8KKyAgICBCQ01PTFRfUFJPWFlfSU5JVCgmcHJveHksIGdwb25fbmksIGNwdV9wYWNrZXRzLCBrZXkpOworICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fbmksIGNwdV9wYWNrZXRzLCBwYWNrZXRfdHlwZSwgQkNNT0xUX1BBQ0tFVF9UWVBFX0NQVSk7CisgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgZ3Bvbl9uaSwgY3B1X3BhY2tldHMsIGNhbGNfY3JjLCBCQ01PU19UUlVFKTsKKyAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCBncG9uX25pLCBjcHVfcGFja2V0cywgZ2VtX3BvcnRfbGlzdCwgZ2VtX3BvcnRfbGlzdCk7CisgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgZ3Bvbl9uaSwgY3B1X3BhY2tldHMsIGJ1ZmZlciwgYnVmZmVyKTsKKworICAgIC8qIGNhbGwgQVBJICovCisgICAgcmV0dXJuIGJjbW9sdF9wcm94eV9zZW5kKDAsICZwcm94eS5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gdXNlcl9hcHBsX2dwb25fYWRkX21hY19lbnRyeShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3QgbnBhcm1zKQoreworICAgIC8qIHRoaXMgY2FuIG9ubHkgYmUgY2FsbGVkIGluIHBlciBmbG93IG1vZGUuICovCisgICAgLyogSW4gb3JkZXIgdG8gcGFzcyB0cmFmZmljIHlvdSBtdXN0IGFsc28gYWRkIGFuIGVudHJ5IHRvIElXRiBpbmdyZXNzIHBvcnQgYXMgZGVzY3JpYmVkIGluIF9ncG9uX3NldF9wZXJfdmxhbl9tYXBwaW5nX21ldGhvZCAqLworICAgIGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfY2ZnIGNmZzsKKyAgICBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSBrZXkgPSB7LnBvbl9uaSA9IDAsIC5tYWNfYWRkcmVzcy51OCA9IHsweDAwLDB4MDAsMHgwMCwgMHgwMCwgMHgwMCwweDAwfSwgLnZsYW4gPSAzMjB9OworCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmX21hY190YWJsZSwga2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX21hY190YWJsZSwgZmxvd19pZCwgMzIwKTsKKyAgICByZXR1cm4gYmNtb2x0X2NmZ19zZXQoMCwgJmNmZy5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gdXNlcl9hcHBsX2dwb25fZHVtcF9tYWNfdGFibGUoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICBjb25zdCB1aW50MTZfdCBtYXhfbXNnc19wZXJfY2FsbCA9IDEwOworICAgIGNvbnN0IGJjbW9sdF9kZXZpZCBkZXZpY2UgPSAwOworICAgIGNvbnN0IHVpbnQxNl90IHBvbiA9IDA7CisKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X21zZ19zZXQgKm1zZ19zZXQ7CisgICAgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmcgZmlsdGVyOworICAgIHVpbnQxNl90IGk7CisgICAgdWludDE2X3QgY291bnQgPSAwOworCisgICAgLyogYSBrZXkgb2YgYWxsIEZzIG1lYW5zICJzdGFydCBmcm9tIHRoZSBiZWdpbm5pbmciICovCisgICAgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkgd2lsZGNhcmRfa2V5ID0KKyAgICAgICAgeyAucG9uX25pID0gcG9uLCAubWFjX2FkZHJlc3MudTggPSB7IDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYgfSwgLnZsYW4gPSAweEZGRkYgfTsKKworICAgIC8qIGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgcmV0dXJuIHZhbHVlcyAqLworICAgIGVyciA9IGJjbW9sdF9tc2dfc2V0X2FsbG9jKEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfTUFDX1RBQkxFLCBCQ01PTFRfTUdUX0dST1VQX0NGRywgbWF4X21zZ3NfcGVyX2NhbGwsICZtc2dfc2V0KTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIC8qIGluaXRpYWxpemUgdGhlIGZpbHRlciBzdHJ1Y3R1cmUgYW5kIGFzayB0byByZWFkIHRoZSBmbG93IElEIC8gc3RhdGljIGZsYWcgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmZpbHRlciwgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCB3aWxkY2FyZF9rZXkpOworICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGdwb25faXdmX21hY190YWJsZSwgZmxvd19pZCk7CisgICAgQkNNT0xUX01TR1NFVF9DRkdfUFJPUF9HRVQobXNnX3NldCwgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBzdGF0KTsKKworICAgIC8qIGZpbHRlciB0byBvbmx5IGluY2x1ZGUgbm9uLXN0YXRpYyBlbnRyaWVzICh5b3UgY291bGQgYWxzbyBmaWx0ZXIgb24gZmxvdyBJRCwgb3Igb21pdCB0aGlzIHRvIGluY2x1ZGUgYWxsKSAqLworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmZpbHRlciwgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBzdGF0LCBCQ01PU19GQUxTRSk7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgLyogY2FsbCBnZXQgbXVsdGlwbGUgb2JqZWN0cyBBUEkgZnVuY3Rpb24gKi8KKyAgICAgICAgZXJyID0gYmNtb2x0X2NmZ19nZXRfbXVsdGkoZGV2aWNlLCAmZmlsdGVyLmhkciwgQkNNT0xUX0ZJTFRFUl9GTEFHU19OT05FLCBtc2dfc2V0KTsKKyAgICAgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiYmNtb2x0X2NmZ19nZXRfbXVsdGkgcmV0dXJuZWQgZXJyb3I6ICVzICglZClcbiIsIGJjbW9zX3N0cmVycm9yKGVyciksIGVycik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHByaW50IGVhY2gga2V5L2NvbmZpZyBzdHJ1Y3R1cmUgdGhhdCB3YXMgcmVjZWl2ZWQgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG1zZ19zZXQtPm51bV9pbnN0YW5jZXM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmcgKmNmZyA9IChiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZyAqKW1zZ19zZXQtPm1zZ1tpXTsKKyAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KAorICAgICAgICAgICAgICAgIHNlc3Npb24sCisgICAgICAgICAgICAgICAgImVudHJ5WyVkXSBNQUM6ICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLAorICAgICAgICAgICAgICAgIGNvdW50LAorICAgICAgICAgICAgICAgIGNmZy0+a2V5Lm1hY19hZGRyZXNzLnU4WzBdLAorICAgICAgICAgICAgICAgIGNmZy0+a2V5Lm1hY19hZGRyZXNzLnU4WzFdLAorICAgICAgICAgICAgICAgIGNmZy0+a2V5Lm1hY19hZGRyZXNzLnU4WzJdLAorICAgICAgICAgICAgICAgIGNmZy0+a2V5Lm1hY19hZGRyZXNzLnU4WzNdLAorICAgICAgICAgICAgICAgIGNmZy0+a2V5Lm1hY19hZGRyZXNzLnU4WzRdLAorICAgICAgICAgICAgICAgIGNmZy0+a2V5Lm1hY19hZGRyZXNzLnU4WzVdKTsKKyAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJlbnRyeVslZF0gVklEOiAlZFxuIiwgY291bnQsIGNmZy0+a2V5LnZsYW4pOworICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgImVudHJ5WyVkXSBmbG93IElEOiAlZFxuIiwgY291bnQsIGNmZy0+ZGF0YS5mbG93X2lkKTsKKyAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJlbnRyeVslZF0gc3RhdGljOiAlc1xuIiwgY291bnQsIGNmZy0+ZGF0YS5zdGF0ID8gInllcyIgOiAibm8iKTsKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgIH0KKworICAgICAgICAvKiB1cGRhdGUgdGhlIGtleSBmb3IgbmV4dCBjYWxsICovCisgICAgICAgIGZpbHRlci5rZXkgPSAqKChiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSAqKW1zZ19zZXQtPm5leHRfa2V5KTsKKworICAgIC8qIGtlZXAgY2FsbGluZyB0aGUgZnVuY3Rpb24gdW50aWwgd2UgaGF2ZSByZXRyaWV2ZWQgYWxsIGVudHJpZXMgKi8KKyAgICB9IHdoaWxlIChtc2dfc2V0LT5tb3JlKTsKKworICAgIGJjbW9sdF9tc2dfc2V0X2ZyZWUobXNnX3NldCk7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyB1c2VyX2FwcGxfZ3Bvbl9zZXRfdXNfZmxvd19jb25maWd1cmF0aW9uKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgYmNtb2x0X2dwb25faXdmX3VzX2Zsb3dfY2ZnIGNmZzsKKyAgICBiY21vbHRfZ3Bvbl9pd2ZfdXNfZmxvd19rZXkga2V5ID0gey5wb25fbmkgPSAwLCAuZ2VtX3BvcnRfaWQgPSAzMjB9OworICAgIGJjbW9sdF92bGFuX3RhZyB2bGFuX3RhZzsKKworICAgIC8qIHZsYWQgdGFnIHBhcmFtZXRlcnMgZm9yIHRoZSBhZGQgdmxhbiAqLworICAgIHZsYW5fdGFnLnBiaXQgPSA5OworICAgIHZsYW5fdGFnLnZsYW5faWQgPSAzMDA7CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9pd2ZfdXNfZmxvdywga2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIGZsb3dfaWQsIDMyMCk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl91c19mbG93LCBtYWNfbGVhcm5pbmcsIEJDTU9TX0ZBTFNFKTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIHZsYW5fYWN0aW9uLCBCQ01PTFRfVVNfVkxBTl9BQ1RJT05fQUREKTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX3VzX2Zsb3csIHZsYW5fdGFnLCB2bGFuX3RhZyk7CisgICAgLyogd2hhdCBpcyB0aGUgdHBpZCBpbmRleCAqLworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfdXNfZmxvdywgdHBpZF9pbmRleCwgMCk7CisgICAgcmV0dXJuIGJjbW9sdF9jZmdfc2V0KDAsICZjZmcuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHVzZXJfYXBwbF9ncG9uX2NvbmZpZ3VyZV9hbmRfYWN0aXZhdGVfcG9uKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgLyogVFJYIGFuZCBQT04gTGluayBjb25maWd1cmF0aW9uIHN0cnVjdHVyZXMgKyBQT04gY29udHJvbCBvcGVyYXRpb24gKi8KKyAgICBiY21vc19lcnJubyByYzsKKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5X25pID0gey5wb25fbmkgPSAwfTsKKyAgICBiY21vbHRfZ3Bvbl9uaV9jZmcgY2ZnX25pOworICAgIGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGUgb3Blcl9uaTsKKworICAgIGJjbW9sdF9ncG9uX3NuX2FjcXVpc2l0aW9uIHNuX2FjcXVpc2l0aW9uID0gey5jb250cm9sID0gQkNNT0xUX0NPTlRST0xfU1RBVEVfRU5BQkxFLCAuaW50ZXJ2YWwgPSAxMDAwMCwgLm9udV9wb3N0X2Rpc2NvdmVyeV9tb2RlID0gQkNNT0xUX09OVV9QT1NUX0RJU0NPVkVSWV9NT0RFX05PTkV9OworICAgIGJjbW9sdF9wb25fZHJpZnRfY29udHJvbCBkcmlmdF9jb250cm9sID0gey5kcmlmdF9pbnRlcnZhbCA9IDEwMDAsIC5kcmlmdF9saW1pdCA9IDQsIC50cmFuc21pc3Npb25fY29udHJvbF9saW1pdCA9IDh9OworICAgIGJjbW9sdF9iZXJfbW9uaXRvcl9wYXJhbXMgYmVyX21vbml0b3IgPSB7LnVzX2Jlcl9pbnRlcnZhbCA9IDEwMDAsIC5zZF90aHJlc2hvbGQgPSA1LCAuc2ZfdGhyZXNob2xkID0gM307CisgICAgYmNtb2x0X2dwb25fdHJ4X2tleSBrZXlfdHJ4ID0gey5wb25fbmkgPSAwfTsKKyAgICBiY21vbHRfZ3Bvbl90cnhfY2ZnIGNmZ190cng7CisgICAgYmNtb2x0X3RyeF9kZWxpbWl0ZXIgZGVsaW1pdGVyID0ge307CisKKyAgICAvKiBvdmVyaWRlIG9ubHkgdGhlIHJlbGV2YW50IHBhcmFtZXRlcnMgKi8KKyAgICBkZWxpbWl0ZXIucGF0dGVyblswXSA9IDB4MEI7CisgICAgZGVsaW1pdGVyLnBhdHRlcm5bMV0gPSAweDU5OworICAgIGRlbGltaXRlci5wYXR0ZXJuWzJdID0gMHg4MzsKKyAgICBkZWxpbWl0ZXIuc2l6ZSA9IDM7CisgICAgZGVsaW1pdGVyLndpbmRvd19zaXplID0gMTI0OworCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmdfdHJ4LCBncG9uX3RyeCwga2V5X3RyeCk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnX3RyeCwgZ3Bvbl90cngsIHRyYW5zY2VpdmVyX3R5cGUsIEJDTU9MVF9UUlhfVFlQRV9TT1VSQ0VfUEhPVE9OSUNTKTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmdfdHJ4LCBncG9uX3RyeCwgZGVsaW1pdGVyLCBkZWxpbWl0ZXIpOworICAgIHJjID0gYmNtb2x0X2NmZ19zZXQoMCwgJmNmZ190cnguaGRyKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIGJjbV9kZXZfbG9nX2xvZyh1c2VyX2FwcGxfZXhfbG9nX2lkLCBERVZfTE9HX0xFVkVMX0RFQlVHLCBCQ01fTE9HX0ZMQUdfTk9fSEVBREVSLAorICAgICAgICAiRXJyb3IgaW4gc2V0IHRyeCAlZCIsIHJjKTsKKyAgICB9CisKKyAgICAvKiBJbml0aWFsaXplIGFuZCBjb25maWd1cmUgUE9OICovCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmdfbmksIGdwb25fbmksIGtleV9uaSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnX25pLCBncG9uX25pLCBzbl9hY3F1aXNpdGlvbiwgc25fYWNxdWlzaXRpb24pOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZ19uaSwgZ3Bvbl9uaSwgZHJpZnRfY29udHJvbCwgZHJpZnRfY29udHJvbCk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnX25pLCBncG9uX25pLCBiZXJfbW9uaXRvciwgYmVyX21vbml0b3IpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZ19uaSwgZ3Bvbl9uaSwgZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbCwgMTAwMCk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnX25pLCBncG9uX25pLCBwcmVhc3NpZ25lZF9lcXVhbGl6YXRpb25fZGVsYXksIDApOworICAgIHJjID0gYmNtb2x0X2NmZ19zZXQoMCwgJmNmZ19uaS5oZHIpOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXJfbmksIGdwb25fbmksIHNldF9wb25fc3RhdGUsIGtleV9uaSk7CisgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXJfbmksIGdwb25fbmksIHNldF9wb25fc3RhdGUsIHBvbl9zdGF0ZSwgQkNNT0xUX1BPTl9PUEVSQVRJT05fQUNUSVZFX1dPUktJTkcpOworICAgIHJldHVybiBiY21vbHRfb3Blcl9zdWJtaXQoMCwgJm9wZXJfbmkuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGdwb25fYWRkX2FjdGl2YXRlX29udSAoYmNtb2x0X2RldmlkIGRldiwgYmNtb2x0X2dwb25fbmkgcG9uX25pLCBiY21vbHRfZ3Bvbl9vbnVfaWQgb251X2lkLCBiY21vbHRfc2VyaWFsX251bWJlciBzZXJpYWxfbnVtYmVyKQoreworICAgIGJjbW9sdF9ncG9uX29udV9jZmcgb251X2NmZzsKKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IG9udV9rZXkgPSB7LnBvbl9uaSA9IHBvbl9uaSwgLm9udV9pZCA9IG9udV9pZH07CisgICAgYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGUgb251X29wZXI7CisgICAgYmNtb2x0X2Fycl91OF8xMCBwYXNzd29yZCA9IHsuYXJyID0gezAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDl9fTsKKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jZmcgZ2VtX2NmZzsKKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9rZXkgZ2VtX2tleSA9IHsucG9uX25pID0gcG9uX25pLCAuZ2VtX3BvcnRfaWQgPSBvbnVfaWR9OworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgQkNNT0xUX0NGR19JTklUKCZvbnVfY2ZnLCBncG9uX29udSwgb251X2tleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmb251X2NmZywgZ3Bvbl9vbnUsIHNlcmlhbF9udW1iZXIsIHNlcmlhbF9udW1iZXIpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJm9udV9jZmcsIGdwb25fb251LCBwYXNzd29yZCwgcGFzc3dvcmQpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJm9udV9jZmcsIGdwb25fb251LCBhdXRvX3Bhc3N3b3JkX2xlYXJuaW5nLCBCQ01PU19UUlVFKTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZvbnVfY2ZnLCBncG9uX29udSwgdXNfZmVjLCBCQ01PU19UUlVFKTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZvbnVfY2ZnLCBncG9uX29udSwgb21jaV9wb3J0X2lkLCAyKTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZvbnVfY2ZnLCBncG9uX29udSwgZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbCwgNTAwMCk7CisgICAgcmMgPSBiY21vbHRfY2ZnX3NldChkZXYsICZvbnVfY2ZnLmhkcik7CisgICAgaWYgKHJjKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIEJDTU9MVF9DRkdfSU5JVCgmZ2VtX2NmZywgZ3Bvbl9nZW1fcG9ydCwgZ2VtX2tleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmZ2VtX2NmZywgZ3Bvbl9nZW1fcG9ydCwgZG93bnN0cmVhbV9lbmNyeXB0aW9uX21vZGUsIEJDTU9MVF9DT05UUk9MX1NUQVRFX0VOQUJMRSk7CisgICAgcmMgPSBiY21vbHRfY2ZnX3NldChkZXYsICZnZW1fY2ZnLmhkcik7CisgICAgaWYgKHJjKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9udV9vcGVyLCBncG9uX29udSwgc2V0X29udV9zdGF0ZSwgb251X2tleSk7CisgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9udV9vcGVyLCBncG9uX29udSwgc2V0X29udV9zdGF0ZSwgb251X3N0YXRlLCBCQ01PTFRfT05VX09QRVJBVElPTl9BQ1RJVkUpOworICAgIHJjID0gYmNtb2x0X29wZXJfc3VibWl0KGRldiwgJm9udV9vcGVyLmhkcik7CisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gdXNlcl9hcHBsX2dwb25fY29uZmlnX2FuZF9hY3RpdmF0ZV9vbnUgKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBucGFybXMpCit7CisgICAgYmNtb2x0X3NlcmlhbF9udW1iZXIgc2VyaWFsX251bWJlciA9IHsudmVuZG9yX2lkID0gezB4MDAsMHgwMCwweDAwLCAweDAwfSwgLnZlbmRvcl9zcGVjaWZpYyA9IHsweDAwLDB4MDAsMHgwMCwgMHgwMn19OworICAgIHJldHVybiBncG9uX2FkZF9hY3RpdmF0ZV9vbnUoMCwgMCwgMiwgc2VyaWFsX251bWJlcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyB1c2VyX2FwcGxfZXBvbl9nZXRfYWxsX2xpbmtfYWxhcm1zKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG5wYXJtcykKK3sKKyAgICBjb25zdCB1aW50MTZfdCBtYXhfbXNnc19wZXJfY2FsbCA9IDEwOworICAgIGNvbnN0IGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQgPSAwOworICAgIGNvbnN0IHVpbnQxNl90IHBvbiA9IDA7CisgICAgLyogY29uZmlndXJlIGZpbHRlciB0byBzZWxlY3Qgb25seSBsaW5rcyB3aGljaCBkbyBOT1QgaGF2ZSBhbGwgYWxhcm1zIG9mZiAqLworICAgIGNvbnN0IGJjbW9sdF9maWx0ZXJfZmxhZ3MgZmxhZ3MgPSBCQ01PTFRfRklMVEVSX0ZMQUdTX0lOVkVSVF9TRUxFQ1RJT047CisgICAgY29uc3QgYmNtb2x0X2Vwb25fbGlua19hbGFybV9zdGF0ZSBhbGFybV9zdGF0ZV9maWx0ZXIgPQorICAgICAgICB7CisgICAgICAgICAgICAuaW52YWxpZF9tcGNwX3JlcG9ydF9yZWNlaXZlZCA9IEJDTU9MVF9TVEFUVVNfT0ZGLAorICAgICAgICAgICAgLmtleV9leGNoYW5nZV9mYWlsdXJlID0gQkNNT0xUX1NUQVRVU19PRkYsCisgICAgICAgICAgICAubXBjcF9yZXBvcnRfdGltZW91dCA9IEJDTU9MVF9TVEFUVVNfT0ZGLAorICAgICAgICAgICAgLm9hbV9rZWVwYWxpdmVfdGltZW91dCA9IEJDTU9MVF9TVEFUVVNfT0ZGLAorICAgICAgICB9OworCisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKyAgICBiY21vbHRfbXNnX3NldCAqbXNnX3NldDsKKyAgICBiY21vbHRfZXBvbl9saW5rX2NmZyBmaWx0ZXI7CisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkgd2lsZGNhcmRfa2V5OworICAgIHVpbnQxNl90IGk7CisKKyAgICAvKiByZXRyaWV2ZSB0aGUgRVBPTiBOSSBNQUMgYWRkcmVzcyAqLworICAgIGJjbW9sdF9lcG9uX25pX2NmZyBwb25fY2ZnOworICAgIGJjbW9sdF9lcG9uX25pX2tleSBwb25fa2V5ID0geyAuZXBvbl9uaSA9IHBvbiB9OworCisgICAgQkNNT0xUX0NGR19JTklUKCZwb25fY2ZnLCBlcG9uX25pLCBwb25fa2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZwb25fY2ZnLCBlcG9uX25pLCBtYWNfYWRkcmVzcyk7CisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlX2lkLCAmcG9uX2NmZy5oZHIpOworICAgIGlmIChCQ01fRVJSX09LICE9IGVycikKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJGYWlsZWQgdG8gcmV0cmlldmUgRVBPTiBOSSBNQUMgYWRkcmVzcyFcbiIpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIC8qIGEga2V5IHdpdGggdGhlIEVQT04gTkkgTUFDIGFkZHJlc3MgbWVhbnMgInN0YXJ0IGZyb20gdGhlIGJlZ2lubmluZyIgKi8KKyAgICB3aWxkY2FyZF9rZXkuZXBvbl9uaSA9IHBvbjsKKyAgICB3aWxkY2FyZF9rZXkubWFjX2FkZHJlc3MgPSBwb25fY2ZnLmRhdGEubWFjX2FkZHJlc3M7CisKKyAgICAvKiBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHJldHVybiB2YWx1ZXMgKi8KKyAgICBlcnIgPSBiY21vbHRfbXNnX3NldF9hbGxvYyhCQ01PTFRfT0JKX0lEX0VQT05fTElOSywgQkNNT0xUX01HVF9HUk9VUF9DRkcsIG1heF9tc2dzX3Blcl9jYWxsLCAmbXNnX3NldCk7CisgICAgaWYgKEJDTV9FUlJfT0sgIT0gZXJyKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBzcGFjZSBmb3IgcmV0dXJuIVxuIik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgLyogaW5pdGlhbGl6ZSB0aGUgZmlsdGVyIHN0cnVjdHVyZSBhbmQgYXNrIHRvIHJlYWQgdGhlIGFsYXJtIHN0YXRlICovCisgICAgQkNNT0xUX0NGR19JTklUKCZmaWx0ZXIsIGVwb25fbGluaywgd2lsZGNhcmRfa2V5KTsKKyAgICBCQ01PTFRfTVNHU0VUX0NGR19QUk9QX0dFVChtc2dfc2V0LCBlcG9uX2xpbmssIGFsYXJtX3N0YXRlKTsKKworICAgIC8qIGFwcGx5IGZpbHRlciAqLworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmZpbHRlciwgZXBvbl9saW5rLCBhbGFybV9zdGF0ZSwgYWxhcm1fc3RhdGVfZmlsdGVyKTsKKworICAgIGRvCisgICAgeworICAgICAgICAvKiBjYWxsIGdldCBtdWx0aXBsZSBvYmplY3RzIEFQSSBmdW5jdGlvbiAqLworICAgICAgICBlcnIgPSBiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2VfaWQsICZmaWx0ZXIuaGRyLCBmbGFncywgbXNnX3NldCk7CisgICAgICAgIGlmIChCQ01fRVJSX09LICE9IGVycikKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgImJjbW9sdF9jZmdfZ2V0X211bHRpIHJldHVybmVkIGVycm9yOiAlcyAoJWQpXG4iLCBiY21vc19zdHJlcnJvcihlcnIpLCBlcnIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBwcmludCBlYWNoIGtleS9jb25maWcgdGhhdCB3YXMgcmVjZWl2ZWQgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG1zZ19zZXQtPm51bV9pbnN0YW5jZXM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fbGlua19jZmcgKmNmZyA9IChiY21vbHRfZXBvbl9saW5rX2NmZyopbXNnX3NldC0+bXNnW2ldOworICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIkxpbms6IE5JICV1LCBNQUMgJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZnLT5rZXkuZXBvbl9uaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmZy0+a2V5Lm1hY19hZGRyZXNzLnU4WzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZnLT5rZXkubWFjX2FkZHJlc3MudThbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZmctPmtleS5tYWNfYWRkcmVzcy51OFsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmZy0+a2V5Lm1hY19hZGRyZXNzLnU4WzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZnLT5rZXkubWFjX2FkZHJlc3MudThbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZmctPmtleS5tYWNfYWRkcmVzcy51OFs1XSk7CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiXHRJbnZhbGlkIE1QQ1AgUmVwb3J0IFJlY2VpdmVkOiAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmZy0+ZGF0YS5hbGFybV9zdGF0ZS5pbnZhbGlkX21wY3BfcmVwb3J0X3JlY2VpdmVkKTsKKyAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJcdEtleSBFeGNoYW5nZSBmYWlsdXJlOiAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmZy0+ZGF0YS5hbGFybV9zdGF0ZS5rZXlfZXhjaGFuZ2VfZmFpbHVyZSk7CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiXHRNUENQIFJlcG9ydCBUaW1lb3V0OiAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmZy0+ZGF0YS5hbGFybV9zdGF0ZS5tcGNwX3JlcG9ydF90aW1lb3V0KTsKKyAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJcdE9BTSBLZWVwYWxpdmUgVGltZW91dDogJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZmctPmRhdGEuYWxhcm1fc3RhdGUub2FtX2tlZXBhbGl2ZV90aW1lb3V0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHVwZGF0ZSB0aGUga2V5IGZvciBuZXh0IGNhbGwgKi8KKyAgICAgICAgZmlsdGVyLmtleSA9ICooKGJjbW9sdF9lcG9uX2xpbmtfa2V5Kiltc2dfc2V0LT5uZXh0X2tleSk7CisKKyAgICAgICAgLyoga2VlcCBjYWxsaW5nIHRoZSBmdW5jdGlvbiB1bnRpbCB3ZSBoYXZlIHJldHJpZXZlZCBhbGwgZW50cmllcyAqLworICAgIH0gd2hpbGUgKG1zZ19zZXQtPm1vcmUpOworCisgICAgYmNtb2x0X21zZ19zZXRfZnJlZShtc2dfc2V0KTsKKyAgICByZXR1cm4gZXJyOworfQorI2VuZGlmCisKK2JjbW9zX2Vycm5vIGJjbW9sdF91c2VyX2FwcGxfZXhfY2xpX2luaXQodm9pZCkKK3sKKyAgICBiY21jbGlfZW50cnkgKnBhcmVudCA9IGJjbWNsaV9kaXJfZmluZChOVUxMLCAidXNlciIpOworICAgIGJjbWNsaV9lbnRyeSAqZGlyOworCisjaWZkZWYgRU5BQkxFX0xPRworICAgIHVzZXJfYXBwbF9leF9sb2dfaWQgPSBiY21fZGV2X2xvZ19pZF9yZWdpc3RlcigidXNlcl9hcHBsX2V4IiwgREVWX0xPR19MRVZFTF9ERUJVRywgREVWX0xPR19JRF9UWVBFX0JPVEgpOworI2VuZGlmCisKKyAgICBkaXIgPSBiY21jbGlfZGlyX2FkZChwYXJlbnQsICJleGFtcGxlIiwgIlVzZXIgYXBwbGljYXRpb24iLCBCQ01DTElfQUNDRVNTX0FETUlOLCBOVUxMKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoIWRpciwgQkNNX0VSUl9OT01FTSk7CisjaWZkZWYgRU5BQkxFX0xPRworCisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJncG9uX2RldmljZV9pbml0IiwgImdwb24gZGV2aWNlIGluaXQiLCB1c2VyX2FwcGxfZ3Bvbl9kZXZpY2VfaW5pdCk7CisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJpbmRpY2F0aW9uX2hhbmRsZXIiLCAiaW5kaWNhdGlvbiBoYW5kbGVyIiwgdXNlcl9hcHBsX2luZGljYXRpb25faGFuZGxlcik7CisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJsb2dfZW50cnlfc2V0IiwgImxvZyBlbnJ0eSBzZXQiLCB1c2VyX2FwcGxfbG9nX2VudHJ5X3NldCk7CisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJyZWRpcmVjdF9kZXZpY2VfbG9nZ2VyIiwgInJlZGlyZWN0IGRldmljZSBsb2dnZXIiLCB1c2VyX2FwcGxfcmVkaXJlY3RfZGV2aWNlX2xvZ2dlcik7CisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJncG9uX25pX2Rpc2FibGVfaW5kaWNhdGlvbiIsICJncG9uX25pX2Rpc2FibGVfaW5kaWNhdGlvbiIsIHVzZXJfYXBwbF9ncG9uX25pX2Rpc2FibGVfaW5kaWNhdGlvbik7CisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJncG9uX25pX2dldF9zdGF0cyIsICJncG9uX25pX2dldF9zdGF0cyIsIHVzZXJfYXBwbF9ncG9uX25pX2dldF9zdGF0cyk7CisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJncG9uX3N0YXJ0X3NuX2FjcXVpc2l0aW9uIiwgImdwb24gc3RhcnQgc24gYWNxdWlzaXRpb24iLCB1c2VyX2FwcGxfZ3Bvbl9zdGFydF9zbl9hY3F1aXNpdGlvbik7CisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJncG9uX3NldF9tYWNfdGFibGVfY29uZmlnIiwgImdwb24gc2V0IG1hYyB0YWJsZSBjb25maWciLCB1c2VyX2FwcGxfZ3Bvbl9zZXRfbWFjX3RhYmxlX2NvbmZpZyk7CisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJncG9uX3NldF9pbnRlcndvcmtpbmdfbW9kZSIsICJncG9uIHNldCBpbnRlcndvcmtpbmcgbW9kZSIsIHVzZXJfYXBwbF9ncG9uX3NldF9pbnRlcndvcmtpbmdfbW9kZSk7CisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJncG9uX3NldF90cngiLCAiZ3BvbiBzZXQgdHJ4IiwgdXNlcl9hcHBsX2dwb25fc2V0X3RyeCk7CisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJncG9uX2FjdGl2YXRlX3BvbiIsICJncG9uIGFjdGl2YXRlIHBvbiIsIHVzZXJfYXBwbF9ncG9uX2FjdGl2YXRlX3Bvbik7CisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJncG9uX29udV9jb25maWciLCAiZ3BvbiBvbnUgY29uZmlnIiwgdXNlcl9hcHBsX2dwb25fb251X2NvbmZpZyk7CisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJncG9uX2FjdGl2YXRlX29udSIsICJncG9uIGFjdGl2YXRlIG9udSIsIHVzZXJfYXBwbF9ncG9uX2FjdGl2YXRlX29udSk7CisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJncG9uX2FsbG9jX2lkX2NvbmZpZyIsICJncG9uIGFsbG9jIGNvbmZpZyIsIHVzZXJfYXBwbF9ncG9uX2FsbG9jX2lkX2NvbmZpZyk7CisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJncG9uX2dlbV9wb3J0X2NvbmZpZyIsICJncG9uIGdlbSBwb3J0IGNvbmZpZyIsIHVzZXJfYXBwbF9ncG9uX2dlbV9wb3J0X2NvbmZpZyk7CisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJncG9uX2FkZF9tYWNfZW50cnkiLCAiZ3BvbiBhZGQgbWFjIGVudHJ5IiwgdXNlcl9hcHBsX2dwb25fYWRkX21hY19lbnRyeSk7CisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJncG9uX2R1bXBfbWFjX3RhYmxlIiwgInByaW50IGVudGlyZSBHUE9OIE1BQyB0YWJsZSIsIHVzZXJfYXBwbF9ncG9uX2R1bXBfbWFjX3RhYmxlKTsKKyAgICBCQ01DTElfTUFLRV9DTURfTk9QQVJNKGRpciwgImdwb25fZHNfZ2VtX3BvcnRfbW9kaWZ5IiwgIiBncG9uIGRzIGdlbSBwb3J0IG1vZGlmeSIsIHVzZXJfYXBwbF9ncG9uX2RzX2dlbV9wb3J0X21vZGlmeSk7CisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJncG9uX3NldF9wZXJfdmxhbl9tYXBwaW5nX21ldGhvZCIsICJncG9uIHNldCBwZXIgdmxhbiBtYXBwaW5nIG1ldGhvZCIsIHVzZXJfYXBwbF9ncG9uX3NldF9kc19wZXJfdmxhbl9tYXBwaW5nX21ldGhvZCk7CisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJncG9uX3NldF91c19mbG93X2NvbmZpZ3VyYXRpb24iLCAiZ3BvbiBzZXQgdXMgZmxvdyBjb25maWd1cmF0aW9uIiwgdXNlcl9hcHBsX2dwb25fc2V0X3VzX2Zsb3dfY29uZmlndXJhdGlvbik7CisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJncG9uX3NlbmRfb21jaV9wYWNrZXQiLCAiYXBwbCBncG9uIHNlbmQgb21jaSBwYWNrZXQiLCB1c2VyX2FwcGxfZ3Bvbl9zZW5kX29tY2lfcGFja2V0KTsKKyAgICBCQ01DTElfTUFLRV9DTURfTk9QQVJNKGRpciwgImdwb25fc2VuZF9jcHVfcGFja2V0c19vdmVyX2dlbV9wb3J0cyIsICJncG9uIHNlbmQgY3B1IHBhY2tldHMgb3ZlciBnZW0gcG9ydHMiLCB1c2VyX2FwcGxfZ3Bvbl9zZW5kX2NwdV9wYWNrZXRzX292ZXJfZ2VtX3BvcnRzKTsKKyAgICBCQ01DTElfTUFLRV9DTURfTk9QQVJNKGRpciwgImdwb25fY29uZmlndXJlX2FuZF9hY3RpdmF0ZV9wb24iLCAiY29uZmlndXJlIGFuZCBhY3RpdmF0ZSBwb24iLCB1c2VyX2FwcGxfZ3Bvbl9jb25maWd1cmVfYW5kX2FjdGl2YXRlX3Bvbik7CisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJncG9uX2NvbmZpZ19hbmRfYWN0aXZhdGVfb251IiwgImNvbmZpZyBhbmQgYWN0aXZhdGUgb251IiwgdXNlcl9hcHBsX2dwb25fY29uZmlnX2FuZF9hY3RpdmF0ZV9vbnUpOworICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oZGlyLCAiZXBvbl9nZXRfYWxsX2xpbmtfYWxhcm1zIiwgInJldHJpZXZlIGFsbCBsaW5rIGFsYXJtcyIsIHVzZXJfYXBwbF9lcG9uX2dldF9hbGxfbGlua19hbGFybXMpOworI2VuZGlmCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvYmNtb2x0X3VzZXJfYXBwbF9leF9jbGkuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvYmNtb2x0X3VzZXJfYXBwbF9leF9jbGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjVlNTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9iY21vbHRfdXNlcl9hcHBsX2V4X2NsaS5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgX0JDTU9MVF9VU0VSX0FQUExfRVhfQ0xJX0hfCisjZGVmaW5lIF9CQ01PTFRfVVNFUl9BUFBMX0VYX0NMSV9IXworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtb2x0X21zZy5oPgorCitiY21vc19lcnJubyBiY21vbHRfdXNlcl9hcHBsX2V4X2NsaV9pbml0KHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvYmNtb2x0X3VzZXJfYXBwbF9ncG9uX3V0aWxzLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2JjbW9sdF91c2VyX2FwcGxfZ3Bvbl91dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkOGQ0YTcKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2JjbW9sdF91c2VyX2FwcGxfZ3Bvbl91dGlscy5jCkBAIC0wLDAgKzEsNzY4IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaW5jbHVkZSA8YmNtb2x0X2hvc3RfYXBpLmg+CisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9ncG9uX3V0aWxzLmgiCisjaW5jbHVkZSA8YmNtb2x0X2Rldl9zZWxlY3Rvci5oPgorCitzdGF0aWMgYmNtY2xpX2VudHJ5ICpncG9uX3V0aWxzX2NsaV9kaXI7CitzdGF0aWMgYmNtY2xpX2VudHJ5ICpncG9uX3V0aWxzX2NsaV90b3BfZGlyOworc3RhdGljIGJjbW9zX2Jvb2wgZ3Bvbl91dGlsc19pc19yZWdpc3RlcmVkOworCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X3VzZXJfYXBwbF9ncG9uX3V0aWxzX2NyZWF0ZShiY21jbGlfZW50cnkgKnRvcF9kaXIpOworCisjZGVmaW5lIE1BWF9HRU1fUE9SVFNfRk9SX1NFTkQgICAgIDY0CisjZGVmaW5lIE1BWF9PTlVTX0ZPUl9TRU5EICAgICAgICAgIDY0CisjZGVmaW5lIE1BWF9QQUNLRVRfU0laRSAgICAgICAgICAgIDIwNDgKKwordHlwZWRlZiBlbnVtCit7CisgICAgR0VORVJBVEVEX1BBQ0tFVF9QQVRURVJOX0JZVEVfQ1lDTEUsCisgICAgR0VORVJBVEVEX1BBQ0tFVF9QQVRURVJOX1dPUkRfQ1lDTEUsCisgICAgR0VORVJBVEVEX1BBQ0tFVF9QQVRURVJOX0NPTlNUCit9IGdlbmVyYXRlZF9wYWNrZXRfcGF0dGVybjsKKwordHlwZWRlZiBlbnVtCit7CisgICAgUE9OX01PREVfR1BPTiwKKyAgICBQT05fTU9ERV9YR1BPTiwKKyAgICBQT05fTU9ERV9JTlZBTElECit9IHBvbl9tb2RlOworCitzdGF0aWMgdWludDhfdCBzYXZlZF9wYWNrZXRbTUFYX1BBQ0tFVF9TSVpFXTsKK3N0YXRpYyBiY21vbHRfcGFja2V0X3R5cGUgc2F2ZWRfcGFja2V0X3R5cGU7CitzdGF0aWMgYmNtb3NfYm9vbCBzYXZlZF9wYWNrZXRfY2FsY19jcmM7CitzdGF0aWMgdWludDE2X3Qgc2F2ZWRfcGFja2V0X2xlbiA9IDA7CisKK3N0YXRpYyB2b2lkIGdwb25fdXRpbHNfY2xpX2Rpcl9jbGlfZGVzdHJveSh2b2lkKQoreworICAgIGlmIChncG9uX3V0aWxzX2NsaV9kaXIpCisgICAgeworICAgICAgICBiY21jbGlfdG9rZW5fZGVzdHJveShncG9uX3V0aWxzX2NsaV9kaXIpOworICAgICAgICBncG9uX3V0aWxzX2NsaV9kaXIgPSBOVUxMOworICAgIH0KK30KKworLyogQ3VycmVudCBkZXZpY2UgY2hhbmdlIGluZGljYXRpb24gKi8KK3N0YXRpYyB2b2lkIGJjbW9sdF91c2VyX2FwcGxfZ3Bvbl91dGlsc19kZXZpY2VfY2hhbmdlX2luZChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYmNtb2x0X2RldmlkIGRldikKK3sKKyAgICBiY21vbHRfc3lzdGVtX21vZGUgc3lzdGVtX21vZGU7CisgICAgYmNtb3NfZXJybm8gZXJyID0gYmNtb2x0X3N5c3RlbV9tb2RlX2dldChkZXYsICZzeXN0ZW1fbW9kZSk7CisKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiRXJyb3IgZGV2aWNlIElkXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChzeXN0ZW1fbW9kZSA9PSBCQ01PTFRfU1lTVEVNX01PREVfR1BPTl9fMTZfWCB8fAorICAgICAgICBzeXN0ZW1fbW9kZSA9PSBCQ01PTFRfU1lTVEVNX01PREVfR1BPTl9fOF9YIHx8CisgICAgICAgIHN5c3RlbV9tb2RlID09IEJDTU9MVF9TWVNURU1fTU9ERV9HUE9OX180X1ggfHwKKyAgICAgICAgc3lzdGVtX21vZGUgPT0gQkNNT0xUX1NZU1RFTV9NT0RFX1hHUE9OXzFfXzhfWCB8fAorICAgICAgICBzeXN0ZW1fbW9kZSA9PSBCQ01PTFRfU1lTVEVNX01PREVfWEdQT05fMV9fNF9YIHx8CisgICAgICAgIHN5c3RlbV9tb2RlID09IEJDTU9MVF9TWVNURU1fTU9ERV9YR1NfXzJfWF8xMF9HIHx8CisgICAgICAgIHN5c3RlbV9tb2RlID09IEJDTU9MVF9TWVNURU1fTU9ERV9OR1BPTjJfXzJfWF8xMF9HKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIkJ1aWxkaW5nIGdwb25fdXRpbHMgQ0xJIGZvciBkZXZpY2UgJWRcbiIsIGRldik7CisKKyAgICAgICAgZXJyID0gYmNtb2x0X3VzZXJfYXBwbF9ncG9uX3V0aWxzX2NyZWF0ZShncG9uX3V0aWxzX2NsaV90b3BfZGlyKTsKKyAgICAgICAgaWYgKGVycikKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIkVycm9yIGJ1aWxkaW5nIGdwb25fdXRpbHMgQ0xJXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBncG9uX3V0aWxzX2NsaV9kaXJfY2xpX2Rlc3Ryb3koKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgcG9uX21vZGUgcG9uX21vZGVfZ2V0KGJjbW9sdF9wb25fbmkgcG9uX2lkKQoreworICAgIGJjbW9sdF9zeXN0ZW1fbW9kZSBzeXN0ZW1fbW9kZTsKKyAgICBiY21vc19lcnJubyBlcnIgPSBiY21vbHRfc3lzdGVtX21vZGVfZ2V0KGN1cnJlbnRfZGV2aWNlLCAmc3lzdGVtX21vZGUpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBQT05fTU9ERV9JTlZBTElEOworICAgIH0KKworICAgIGlmIChzeXN0ZW1fbW9kZSA9PSBCQ01PTFRfU1lTVEVNX01PREVfR1BPTl84X1hHUE9OXzRfWF9DT0VYSVNURU5DRSkKKyAgICB7CisgICAgICAgIC8qIHNwZWNpYWwgaGFuZGxpbmcgZm9yIHRoZSA4eCBHUE9OIC8gNHggWEdQT04gY28tZXhpc3RlbmNlIG1vZGUgKi8KKyAgICAgICAgcmV0dXJuIHBvbl9pZCA8IDggPyBQT05fTU9ERV9YR1BPTiA6IFBPTl9NT0RFX0dQT047CisgICAgfQorICAgIGVsc2UgaWYgKGJjbW9sdF9vYmpfdGFnX3ZhbGlkX2Zvcl9zeXN0ZW1fbW9kZShzeXN0ZW1fbW9kZSwgQkNNT0xUX09CSl9UQUdfR1BPTikpCisgICAgeworICAgICAgICByZXR1cm4gUE9OX01PREVfR1BPTjsKKyAgICB9CisgICAgZWxzZSBpZiAoYmNtb2x0X29ial90YWdfdmFsaWRfZm9yX3N5c3RlbV9tb2RlKHN5c3RlbV9tb2RlLCBCQ01PTFRfT0JKX1RBR19YR1BPTikpCisgICAgeworICAgICAgICByZXR1cm4gUE9OX01PREVfWEdQT047CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBQT05fTU9ERV9JTlZBTElEOworICAgIH0KK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJ1aWxkX3BhY2tldChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYmNtb2x0X3BhY2tldF90eXBlIHR5cGUpCit7CisgICAgdWludDE2X3QgaTsKKyAgICBiY21vc19ib29sIGNhbGNfY3JjID0gKGJjbW9zX2Jvb2wpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY2FsY19jcmMiKS0+dmFsdWUudW51bWJlcjsKKyAgICB1aW50MTZfdCBwYWNrZXRfc2l6ZSA9ICh1aW50MTZfdCliY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwYWNrZXRfc2l6ZSIpLT52YWx1ZS51bnVtYmVyOworICAgIGdlbmVyYXRlZF9wYWNrZXRfcGF0dGVybiBwYXR0ZXJuID0gCisgICAgICAgIChnZW5lcmF0ZWRfcGFja2V0X3BhdHRlcm4pYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicGF0dGVybiIpLT52YWx1ZS51bnVtYmVyOworICAgIHVpbnQ4X3QgY29uc3RfdmFsdWUgPSAodWludDhfdCliY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb25zdF92YWx1ZSIpLT52YWx1ZS51bnVtYmVyOworICAgIHVpbnQxNl90IGRhdGFfb2Zmc2V0OworICAgIAorICAgIC8qIHNhdmUgcGFja2V0IHR5cGUgLyBzaXplIC8gQ1JDIGZsYWcgKi8KKyAgICBzYXZlZF9wYWNrZXRfdHlwZSA9IHR5cGU7CisgICAgc2F2ZWRfcGFja2V0X2xlbiA9IHBhY2tldF9zaXplOworICAgIHNhdmVkX3BhY2tldF9jYWxjX2NyYyA9IGNhbGNfY3JjOworCisgICAgaWYgKHR5cGUgPT0gQkNNT0xUX1BBQ0tFVF9UWVBFX0NQVSkKKyAgICB7CisgICAgICAgIGJjbW9zX21hY19hZGRyZXNzIGV0aF9kYSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImV0aF9kYSIpLT52YWx1ZS5tYWM7CisgICAgICAgIGJjbW9zX21hY19hZGRyZXNzIGV0aF9zYSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImV0aF9zYSIpLT52YWx1ZS5tYWM7CisKKyAgICAgICAgLyogY29weSBkZXN0aW5hdGlvbiBNQUMgKi8KKyAgICAgICAgbWVtY3B5KHNhdmVkX3BhY2tldCwgJmV0aF9kYSwgNik7CisKKyAgICAgICAgLyogY29weSBzb3VyY2UgTUFDICovCisgICAgICAgIG1lbWNweSgmc2F2ZWRfcGFja2V0WzZdLCAmZXRoX3NhLCA2KTsKKworICAgICAgICAvKiB3cml0ZSBFdGhlclR5cGUgb2YgMDAwMCAqLworICAgICAgICBtZW1zZXQoJnNhdmVkX3BhY2tldFsxMl0sIDAsIDIpOworCisgICAgICAgIC8qIGRhdGEgc3RhcnRzIGFmdGVyIEV0aGVyVHlwZSAqLworICAgICAgICBkYXRhX29mZnNldCA9IDE0OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBmaWxsIHRoZSBlbnRpcmUgcGFja2V0ICovCisgICAgICAgIGRhdGFfb2Zmc2V0ID0gMDsKKyAgICB9CisKKyAgICAvKiBmaWxsIHRoZSByZXN0IG9mIHRoZSBidWZmZXIgdXNpbmcgdGhlIHNwZWNpZmllZCBkYXRhIHBhdHRlcm4gKi8KKyAgICBzd2l0Y2ggKHBhdHRlcm4pCisgICAgeworICAgIGNhc2UgR0VORVJBVEVEX1BBQ0tFVF9QQVRURVJOX0JZVEVfQ1lDTEU6CisgICAgICAgIGNvbnN0X3ZhbHVlID0gMDsKKyAgICAgICAgZm9yIChpID0gZGF0YV9vZmZzZXQ7IGkgPCBwYWNrZXRfc2l6ZTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBzYXZlZF9wYWNrZXRbaV0gPSBjb25zdF92YWx1ZSsrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0VORVJBVEVEX1BBQ0tFVF9QQVRURVJOX1dPUkRfQ1lDTEU6CisgICAgICAgIC8qIGZpcnN0IDQgYnl0ZXMgPSAwMDAwMDAwMCwgbmV4dCA0ID0gMTExMTExMTEsIG5leHQgNCA9IDIyMjIyMjIyLCBldGMgKi8KKyAgICAgICAgY29uc3RfdmFsdWUgPSAwOworICAgICAgICBmb3IgKGkgPSBkYXRhX29mZnNldDsgaSA8IHBhY2tldF9zaXplOyBpICs9IDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90IGo7CisgICAgICAgICAgICBmb3IgKGogPSBpOyBqIDwgaSArIDQgJiYgaiA8IHBhY2tldF9zaXplOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2F2ZWRfcGFja2V0W2pdID0gY29uc3RfdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25zdF92YWx1ZSA9IChjb25zdF92YWx1ZSA9PSAweEZGKSA/IDAgOiBjb25zdF92YWx1ZSArIDB4MTE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHRU5FUkFURURfUEFDS0VUX1BBVFRFUk5fQ09OU1Q6CisgICAgICAgIGZvciAoaSA9IGRhdGFfb2Zmc2V0OyBpIDwgcGFja2V0X3NpemU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgc2F2ZWRfcGFja2V0W2ldID0gY29uc3RfdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIltFcnJvcl0gSW52YWxpZCBwYXR0ZXJuOiAldVxuIiwgcGF0dGVybik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYnVpbGRfY3B1X3BhY2tldF9jYihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21vc19lcnJubyBlcnIgPSBidWlsZF9wYWNrZXQoc2Vzc2lvbiwgQkNNT0xUX1BBQ0tFVF9UWVBFX0NQVSk7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIkNQVSBwYWNrZXQgYnVmZmVyIHNhdmVkIHN1Y2Nlc3NmdWxseVxuIik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJbRXJyb3JdIHNhdmluZyBDUFUgcGFja2V0IGJ1ZmZlcjogJXNcbiIsIGJjbW9zX3N0cmVycm9yKGVycikpOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYnVpbGRfb21jaV9wYWNrZXRfY2IoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgYmNtb3NfZXJybm8gZXJyID0gYnVpbGRfcGFja2V0KHNlc3Npb24sIEJDTU9MVF9QQUNLRVRfVFlQRV9PTUNJKTsKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiT01DSSBwYWNrZXQgYnVmZmVyIHNhdmVkIHN1Y2Nlc3NmdWxseVxuIik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJbRXJyb3JdIHNhdmluZyBPTUNJIHBhY2tldCBidWZmZXI6ICVzXG4iLCBiY21vc19zdHJlcnJvcihlcnIpKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHNlbmRfcGFja2V0X3RvX2dwb25fZ2VtX2xpc3QoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIHVpbnQxNl90IGdlbV9jb3VudCwgYmNtb2x0X2dwb25fZ2VtX2lkICpnZW1zKQoreworICAgIHVpbnQxNl90IGNvdW50ID0gMTsKKyAgICB1aW50MTZfdCBpOworICAgIHVpbnQxNl90IGdlbV9pZHg7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbWNsaV9jbWRfcGFybSAqcGFybTsKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlID0gKGJjbW9sdF9kZXZpZCliY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJkZXZpY2UiKS0+dmFsdWUudW51bWJlcjsKKyAgICBiY21vbHRfcG9uX25pIHBvbl9uaSA9IChiY21vbHRfcG9uX25pKWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbl9uaSIpLT52YWx1ZS51bnVtYmVyOworICAgIGJjbW9sdF9ncG9uX25pX2tleSBwb25fbmlfa2V5ID0geyAucG9uX25pID0gcG9uX25pIH07CisgICAgYmNtb2x0X2dwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2IGdlbV9wb3J0X2xpc3Q7CisgICAgYmNtb2x0X2dwb25fbmlfY3B1X3BhY2tldHMgcHJveHk7CisgICAgYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4IGJ1ZmZlciA9IHsgLmxlbiA9IHNhdmVkX3BhY2tldF9sZW4sIC52YWwgPSBzYXZlZF9wYWNrZXQgfTsKKworICAgIGlmIChzYXZlZF9wYWNrZXRfbGVuID09IDApCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiW0Vycm9yXSB5b3UgbXVzdCBidWlsZC9zYXZlIGEgcGFja2V0IGJlZm9yZSB5b3UgY2FuIHNlbmQgaXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIHBhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb3VudCIpOworICAgIGlmIChwYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBjb3VudCA9ICh1aW50MTZfdClwYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KAorICAgICAgICBzZXNzaW9uLAorICAgICAgICAiU2VuZGluZyAldSBwcm94eSBwYWNrZXQlcyB0byAldSBHRU0gcG9ydCVzLi4uXG4iLAorICAgICAgICBjb3VudCwKKyAgICAgICAgY291bnQgPT0gMSA/ICIiIDogInMiLAorICAgICAgICBnZW1fY291bnQsCisgICAgICAgIGdlbV9jb3VudCA9PSAxID8gIiIgOiAicyIpOworCisgICAgLyogYnVpbGQgdGhlIHByb3h5IEFQSSBtZXNzYWdlLCBleGNlcHQgdGhlIEdFTSBwb3J0IGxpc3QgKi8KKyAgICBCQ01PTFRfUFJPWFlfSU5JVCgmcHJveHksIGdwb25fbmksIGNwdV9wYWNrZXRzLCBwb25fbmlfa2V5KTsKKyAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCBncG9uX25pLCBjcHVfcGFja2V0cywgcGFja2V0X3R5cGUsIHNhdmVkX3BhY2tldF90eXBlKTsKKyAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCBncG9uX25pLCBjcHVfcGFja2V0cywgY2FsY19jcmMsIHNhdmVkX3BhY2tldF9jYWxjX2NyYyk7CisgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgZ3Bvbl9uaSwgY3B1X3BhY2tldHMsIGJ1ZmZlciwgYnVmZmVyKTsKKworICAgIC8qIGNhbGwgdGhlIHByb3h5IEFQSSA8Y291bnQ+IHRpbWVzICovCisgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgeworICAgICAgICAvKiB3ZSBtYXkgbmVlZCB0byBzcGxpdCB0aGlzIHVwIGludG8gbXVsdGlwbGUgQVBJIGNhbGxzIChvbmx5IDE2IEdFTSBwb3J0cyBhcmUgYWxsb3dlZCBwZXIgcHJveHkgQVBJKSAqLworICAgICAgICBmb3IgKGdlbV9pZHggPSAwOyBnZW1faWR4IDwgZ2VtX2NvdW50OyBnZW1faWR4ICs9IDE2KQorICAgICAgICB7CisgICAgICAgICAgICBnZW1fcG9ydF9saXN0LmxlbiA9IE1JTigxNiwgZ2VtX2NvdW50IC0gZ2VtX2lkeCk7CisgICAgICAgICAgICBnZW1fcG9ydF9saXN0LnZhbCA9ICZnZW1zW2dlbV9pZHhdOworICAgICAgICAgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgZ3Bvbl9uaSwgY3B1X3BhY2tldHMsIGdlbV9wb3J0X2xpc3QsIGdlbV9wb3J0X2xpc3QpOworCisgICAgICAgICAgICBlcnIgPSBiY21vbHRfcHJveHlfc2VuZChkZXZpY2UsICZwcm94eS5oZHIpOworICAgICAgICAgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KAorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAiW0Vycm9yXSBwcm94eSBzZW5kOiBwYWNrZXQgaW5kZXggJXUgR0VNIGluZGV4ICV1OiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgZ2VtX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgYmNtb3Nfc3RyZXJyb3IoZXJyKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIldSBwcm94eSBwYWNrZXQlcyBzZW50IHN1Y2Nlc3NmdWxseSFcbiIsIGNvdW50LCBjb3VudCA9PSAxID8gIiIgOiAicyIpOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gc2VuZF9wYWNrZXRfdG9feGdwb25fZ2VtX2xpc3QoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIHVpbnQxNl90IGdlbV9jb3VudCwgYmNtb2x0X3hncG9uX2dlbV9pZCAqZ2VtcykKK3sKKyAgICB1aW50MTZfdCBjb3VudCA9IDE7CisgICAgdWludDE2X3QgaTsKKyAgICB1aW50MTZfdCBnZW1faWR4OworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21jbGlfY21kX3Bhcm0gKnBhcm07CisgICAgYmNtb2x0X2RldmlkIGRldmljZSA9IChiY21vbHRfZGV2aWQpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGV2aWNlIiktPnZhbHVlLnVudW1iZXI7CisgICAgYmNtb2x0X3Bvbl9uaSBwb25fbmkgPSAoYmNtb2x0X3Bvbl9uaSliY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKS0+dmFsdWUudW51bWJlcjsKKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IHBvbl9uaV9rZXkgPSB7IC5wb25fbmkgPSBwb25fbmkgfTsKKyAgICBiY21vbHRfeGdwb25fZ2VtX2lkX2xpc3RfdThfbWF4XzE2IGdlbV9wb3J0X2xpc3Q7CisgICAgYmNtb2x0X3hncG9uX25pX2NwdV9wYWNrZXRzIHByb3h5OworICAgIGJjbW9sdF91OF9saXN0X3UzMl9tYXhfMjA0OCBidWZmZXIgPSB7IC5sZW4gPSBzYXZlZF9wYWNrZXRfbGVuLCAudmFsID0gc2F2ZWRfcGFja2V0IH07CisKKyAgICBpZiAoc2F2ZWRfcGFja2V0X2xlbiA9PSAwKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIltFcnJvcl0geW91IG11c3QgYnVpbGQvc2F2ZSBhIHBhY2tldCBiZWZvcmUgeW91IGNhbiBzZW5kIGl0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICBwYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiY291bnQiKTsKKyAgICBpZiAocGFybSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY291bnQgPSAodWludDE2X3QpcGFybS0+dmFsdWUudW51bWJlcjsKKyAgICB9CisKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludCgKKyAgICAgICAgc2Vzc2lvbiwKKyAgICAgICAgIlNlbmRpbmcgJXUgcHJveHkgcGFja2V0JXMgdG8gJXUgR0VNIHBvcnQlcy4uLlxuIiwKKyAgICAgICAgY291bnQsCisgICAgICAgIGNvdW50ID09IDEgPyAiIiA6ICJzIiwKKyAgICAgICAgZ2VtX2NvdW50LAorICAgICAgICBnZW1fY291bnQgPT0gMSA/ICIiIDogInMiKTsKKworICAgIC8qIGJ1aWxkIHRoZSBwcm94eSBBUEkgbWVzc2FnZSwgZXhjZXB0IHRoZSBHRU0gcG9ydCBsaXN0ICovCisgICAgQkNNT0xUX1BST1hZX0lOSVQoJnByb3h5LCB4Z3Bvbl9uaSwgY3B1X3BhY2tldHMsIHBvbl9uaV9rZXkpOworICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIHhncG9uX25pLCBjcHVfcGFja2V0cywgcGFja2V0X3R5cGUsIHNhdmVkX3BhY2tldF90eXBlKTsKKyAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCB4Z3Bvbl9uaSwgY3B1X3BhY2tldHMsIGNhbGNfY3JjLCBzYXZlZF9wYWNrZXRfY2FsY19jcmMpOworICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIHhncG9uX25pLCBjcHVfcGFja2V0cywgYnVmZmVyLCBidWZmZXIpOworCisgICAgLyogY2FsbCB0aGUgcHJveHkgQVBJIDxjb3VudD4gdGltZXMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICB7CisgICAgICAgIC8qIHdlIG1heSBuZWVkIHRvIHNwbGl0IHRoaXMgdXAgaW50byBtdWx0aXBsZSBBUEkgY2FsbHMgKG9ubHkgMTYgR0VNIHBvcnRzIGFyZSBhbGxvd2VkIHBlciBwcm94eSBBUEkpICovCisgICAgICAgIGZvciAoZ2VtX2lkeCA9IDA7IGdlbV9pZHggPCBnZW1fY291bnQ7IGdlbV9pZHggKz0gMTYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdlbV9wb3J0X2xpc3QubGVuID0gTUlOKDE2LCBnZW1fY291bnQgLSBnZW1faWR4KTsKKyAgICAgICAgICAgIGdlbV9wb3J0X2xpc3QudmFsID0gJmdlbXNbZ2VtX2lkeF07CisgICAgICAgICAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCB4Z3Bvbl9uaSwgY3B1X3BhY2tldHMsIGdlbV9wb3J0X2xpc3QsIGdlbV9wb3J0X2xpc3QpOworCisgICAgICAgICAgICBlcnIgPSBiY21vbHRfcHJveHlfc2VuZChkZXZpY2UsICZwcm94eS5oZHIpOworICAgICAgICAgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KAorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAiW0Vycm9yXSBwcm94eSBzZW5kOiBwYWNrZXQgaW5kZXggJXUgR0VNIGluZGV4ICV1OiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgZ2VtX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgYmNtb3Nfc3RyZXJyb3IoZXJyKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIldSBwcm94eSBwYWNrZXQlcyBzZW50IHN1Y2Nlc3NmdWxseSFcbiIsIGNvdW50LCBjb3VudCA9PSAxID8gIiIgOiAicyIpOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gc2VuZF90b19nZW1fY2IoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpnZW1fcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImdlbSIpOworICAgIGJjbW9sdF9wb25fbmkgcG9uX2lkID0gKGJjbW9sdF9wb25fbmkpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIiktPnZhbHVlLnVudW1iZXI7CisgICAgdWludDE2X3QgaTsKKyAgICBwb25fbW9kZSBtb2RlID0gcG9uX21vZGVfZ2V0KHBvbl9pZCk7CisKKyAgICBpZiAobW9kZSA9PSBQT05fTU9ERV9HUE9OKQorICAgIHsKKyAgICAgICAgc3RhdGljIGJjbW9sdF9ncG9uX2dlbV9pZCBnZW1faWRfYnVmW01BWF9HRU1fUE9SVFNfRk9SX1NFTkRdOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZ2VtX3Bhcm0tPmFycmF5X3NpemU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZ2VtX2lkX2J1ZltpXSA9IChiY21vbHRfZ3Bvbl9nZW1faWQpZ2VtX3Bhcm0tPnZhbHVlc1tpXS51bnVtYmVyOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzZW5kX3BhY2tldF90b19ncG9uX2dlbV9saXN0KHNlc3Npb24sICh1aW50MTZfdClnZW1fcGFybS0+YXJyYXlfc2l6ZSwgZ2VtX2lkX2J1Zik7CisgICAgfSAKKyAgICBlbHNlIGlmIChtb2RlID09IFBPTl9NT0RFX1hHUE9OKQorICAgIHsKKyAgICAgICAgc3RhdGljIGJjbW9sdF94Z3Bvbl9nZW1faWQgZ2VtX2lkX2J1ZltNQVhfR0VNX1BPUlRTX0ZPUl9TRU5EXTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGdlbV9wYXJtLT5hcnJheV9zaXplOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGdlbV9pZF9idWZbaV0gPSAoYmNtb2x0X3hncG9uX2dlbV9pZClnZW1fcGFybS0+dmFsdWVzW2ldLnVudW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNlbmRfcGFja2V0X3RvX3hncG9uX2dlbV9saXN0KHNlc3Npb24sICh1aW50MTZfdClnZW1fcGFybS0+YXJyYXlfc2l6ZSwgZ2VtX2lkX2J1Zik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJbRXJyb3JdIEludmFsaWQgc3lzdGVtIG1vZGVcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICB9Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBzZW5kX3BhY2tldF90b19ncG9uX29udV9saXN0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCB1aW50MTZfdCBvbnVfY291bnQsIGJjbW9sdF9ncG9uX29udV9pZCAqb251cykKK3sKKyAgICB1aW50MTZfdCBjb3VudCA9IDE7CisgICAgdWludDE2X3QgaTsKKyAgICB1aW50MTZfdCBvbnVfaWR4OworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21jbGlfY21kX3Bhcm0gKnBhcm07CisgICAgYmNtb2x0X2RldmlkIGRldmljZSA9IChiY21vbHRfZGV2aWQpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGV2aWNlIiktPnZhbHVlLnVudW1iZXI7CisgICAgYmNtb2x0X3Bvbl9uaSBwb25fbmkgPSAoYmNtb2x0X3Bvbl9uaSliY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKS0+dmFsdWUudW51bWJlcjsKKworICAgIGlmIChzYXZlZF9wYWNrZXRfbGVuID09IDApCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiW0Vycm9yXSB5b3UgbXVzdCBidWlsZC9zYXZlIGEgcGFja2V0IGJlZm9yZSB5b3UgY2FuIHNlbmQgaXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIHBhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb3VudCIpOworICAgIGlmIChwYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBjb3VudCA9ICh1aW50MTZfdClwYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KAorICAgICAgICBzZXNzaW9uLAorICAgICAgICAiU2VuZGluZyAldSBwcm94eSBwYWNrZXQlcyB0byAldSBPTlUlcy4uLlxuIiwKKyAgICAgICAgY291bnQsCisgICAgICAgIGNvdW50ID09IDEgPyAiIiA6ICJzIiwKKyAgICAgICAgb251X2NvdW50LAorICAgICAgICBvbnVfY291bnQgPT0gMSA/ICIiIDogInMiKTsKKworICAgIC8qIGNhbGwgdGhlIHByb3h5IEFQSSAocG90ZW50aWFsbHkgc2V2ZXJhbCB0aW1lcykgZm9yIGVhY2ggT05VICovCisgICAgZm9yIChvbnVfaWR4ID0gMDsgb251X2lkeCA8IG9udV9jb3VudDsgb251X2lkeCsrKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fb251X2tleSBvbnVfa2V5ID0geyAucG9uX25pID0gcG9uX25pLCAub251X2lkID0gb251c1tvbnVfaWR4XSB9OworICAgICAgICBiY21vbHRfdThfbGlzdF91MzJfbWF4XzIwNDggYnVmZmVyID0geyAudmFsID0gc2F2ZWRfcGFja2V0IH07CisgICAgICAgIGJjbW9sdF9ncG9uX29udV9jcHVfcGFja2V0cyBwcm94eTsKKyAgICAgICAgdWludDE2X3QgcGFja2V0c19wZXJfcHJveHk7CisKKyAgICAgICAgLyogYnVpbGQgdGhlIHByb3h5IEFQSSBtZXNzYWdlLCBleGNlcHQgdGhlIGJ1ZmZlci9udW1iZXIgb2YgcGFja2V0cyAqLworICAgICAgICBCQ01PTFRfUFJPWFlfSU5JVCgmcHJveHksIGdwb25fb251LCBjcHVfcGFja2V0cywgb251X2tleSk7CisgICAgICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fb251LCBjcHVfcGFja2V0cywgcGFja2V0X3R5cGUsIHNhdmVkX3BhY2tldF90eXBlKTsKKyAgICAgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgZ3Bvbl9vbnUsIGNwdV9wYWNrZXRzLCBjYWxjX2NyYywgc2F2ZWRfcGFja2V0X2NhbGNfY3JjKTsKKyAgICAgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgZ3Bvbl9vbnUsIGNwdV9wYWNrZXRzLCBwYWNrZXRfc2l6ZSwgc2F2ZWRfcGFja2V0X2xlbik7CisKKyAgICAgICAgLyogY2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgcGFja2V0cyB3ZSBjYW4gZml0IHBlciBpbnZvY2F0aW9uIG9mIHRoZSBwcm94eSBBUEkgKi8KKyAgICAgICAgcGFja2V0c19wZXJfcHJveHkgPSBNSU4oY291bnQsIDIwNDggLyBzYXZlZF9wYWNrZXRfbGVuKTsKKyAgICAgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgZ3Bvbl9vbnUsIGNwdV9wYWNrZXRzLCBudW1iZXJfb2ZfcGFja2V0cywgcGFja2V0c19wZXJfcHJveHkpOworCisgICAgICAgIC8qIHByZXBhcmUgdGhlIGJ1ZmZlciBkYXRhIHdpdGggc2V2ZXJhbCBjb3BpZXMgb2YgdGhlIHNhbWUgcGFja2V0IGluIGEgcm93ICovCisgICAgICAgIGZvciAoaSA9IDE7IGkgPCBwYWNrZXRzX3Blcl9wcm94eTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBtZW1jcHkoJnNhdmVkX3BhY2tldFtpICogc2F2ZWRfcGFja2V0X2xlbl0sIHNhdmVkX3BhY2tldCwgc2F2ZWRfcGFja2V0X2xlbik7IAorICAgICAgICB9CisKKyAgICAgICAgLyogY2FsbCB0aGUgcHJveHkgQVBJIGVub3VnaCB0aW1lcyB0byBzZW5kIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIHBhY2tldHMgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpICs9IHBhY2tldHNfcGVyX3Byb3h5KQorICAgICAgICB7CisgICAgICAgICAgICB1aW50MTZfdCBudW1iZXJfb2ZfcGFja2V0cyA9IE1JTihwYWNrZXRzX3Blcl9wcm94eSwgY291bnQgLSBpKTsKKyAgICAgICAgICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fb251LCBjcHVfcGFja2V0cywgbnVtYmVyX29mX3BhY2tldHMsIG51bWJlcl9vZl9wYWNrZXRzKTsKKworICAgICAgICAgICAgYnVmZmVyLmxlbiA9IG51bWJlcl9vZl9wYWNrZXRzICogc2F2ZWRfcGFja2V0X2xlbjsKKyAgICAgICAgICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIGdwb25fb251LCBjcHVfcGFja2V0cywgYnVmZmVyLCBidWZmZXIpOworCisgICAgICAgICAgICBlcnIgPSBiY21vbHRfcHJveHlfc2VuZChkZXZpY2UsICZwcm94eS5oZHIpOworICAgICAgICAgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KAorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAiW0Vycm9yXSBwcm94eSBzZW5kOiBPTlUgJXUgcGFja2V0IGluZGV4ICV1OiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgb251c1tvbnVfaWR4XSwKKyAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgYmNtb3Nfc3RyZXJyb3IoZXJyKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIldSBwcm94eSBwYWNrZXQlcyBzZW50IHN1Y2Nlc3NmdWxseSFcbiIsIGNvdW50LCBjb3VudCA9PSAxID8gIiIgOiAicyIpOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gc2VuZF9wYWNrZXRfdG9feGdwb25fb251X2xpc3QoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIHVpbnQxNl90IG9udV9jb3VudCwgYmNtb2x0X3hncG9uX29udV9pZCAqb251cykKK3sKKyAgICB1aW50MTZfdCBjb3VudCA9IDE7CisgICAgdWludDE2X3QgaTsKKyAgICB1aW50MTZfdCBvbnVfaWR4OworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21jbGlfY21kX3Bhcm0gKnBhcm07CisgICAgYmNtb2x0X2RldmlkIGRldmljZSA9IChiY21vbHRfZGV2aWQpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGV2aWNlIiktPnZhbHVlLnVudW1iZXI7CisgICAgYmNtb2x0X3Bvbl9uaSBwb25fbmkgPSAoYmNtb2x0X3Bvbl9uaSliY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb25fbmkiKS0+dmFsdWUudW51bWJlcjsKKworICAgIGlmIChzYXZlZF9wYWNrZXRfbGVuID09IDApCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiW0Vycm9yXSB5b3UgbXVzdCBidWlsZC9zYXZlIGEgcGFja2V0IGJlZm9yZSB5b3UgY2FuIHNlbmQgaXRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKworICAgIHBhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJjb3VudCIpOworICAgIGlmIChwYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBjb3VudCA9ICh1aW50MTZfdClwYXJtLT52YWx1ZS51bnVtYmVyOworICAgIH0KKworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KAorICAgICAgICBzZXNzaW9uLAorICAgICAgICAiU2VuZGluZyAldSBwcm94eSBwYWNrZXQlcyB0byAldSBPTlUlcy4uLlxuIiwKKyAgICAgICAgY291bnQsCisgICAgICAgIGNvdW50ID09IDEgPyAiIiA6ICJzIiwKKyAgICAgICAgb251X2NvdW50LAorICAgICAgICBvbnVfY291bnQgPT0gMSA/ICIiIDogInMiKTsKKworICAgIC8qIGNhbGwgdGhlIHByb3h5IEFQSSAocG90ZW50aWFsbHkgc2V2ZXJhbCB0aW1lcykgZm9yIGVhY2ggT05VICovCisgICAgZm9yIChvbnVfaWR4ID0gMDsgb251X2lkeCA8IG9udV9jb3VudDsgb251X2lkeCsrKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX29udV9rZXkgb251X2tleSA9IHsgLnBvbl9uaSA9IHBvbl9uaSwgLm9udV9pZCA9IG9udXNbb251X2lkeF0gfTsKKyAgICAgICAgYmNtb2x0X3U4X2xpc3RfdTMyX21heF8yMDQ4IGJ1ZmZlciA9IHsgLnZhbCA9IHNhdmVkX3BhY2tldCB9OworICAgICAgICBiY21vbHRfeGdwb25fb251X2NwdV9wYWNrZXRzIHByb3h5OworICAgICAgICB1aW50MTZfdCBwYWNrZXRzX3Blcl9wcm94eTsKKworICAgICAgICAvKiBidWlsZCB0aGUgcHJveHkgQVBJIG1lc3NhZ2UsIGV4Y2VwdCB0aGUgYnVmZmVyL251bWJlciBvZiBwYWNrZXRzICovCisgICAgICAgIEJDTU9MVF9QUk9YWV9JTklUKCZwcm94eSwgeGdwb25fb251LCBjcHVfcGFja2V0cywgb251X2tleSk7CisgICAgICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIHhncG9uX29udSwgY3B1X3BhY2tldHMsIHBhY2tldF90eXBlLCBzYXZlZF9wYWNrZXRfdHlwZSk7CisgICAgICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmcHJveHksIHhncG9uX29udSwgY3B1X3BhY2tldHMsIGNhbGNfY3JjLCBzYXZlZF9wYWNrZXRfY2FsY19jcmMpOworICAgICAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCB4Z3Bvbl9vbnUsIGNwdV9wYWNrZXRzLCBwYWNrZXRfc2l6ZSwgc2F2ZWRfcGFja2V0X2xlbik7CisKKyAgICAgICAgLyogY2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgcGFja2V0cyB3ZSBjYW4gZml0IHBlciBpbnZvY2F0aW9uIG9mIHRoZSBwcm94eSBBUEkgKi8KKyAgICAgICAgcGFja2V0c19wZXJfcHJveHkgPSBNSU4oY291bnQsIDIwNDggLyBzYXZlZF9wYWNrZXRfbGVuKTsKKyAgICAgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgeGdwb25fb251LCBjcHVfcGFja2V0cywgbnVtYmVyX29mX3BhY2tldHMsIHBhY2tldHNfcGVyX3Byb3h5KTsKKworICAgICAgICAvKiBwcmVwYXJlIHRoZSBidWZmZXIgZGF0YSB3aXRoIHNldmVyYWwgY29waWVzIG9mIHRoZSBzYW1lIHBhY2tldCBpbiBhIHJvdyAqLworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgcGFja2V0c19wZXJfcHJveHk7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgbWVtY3B5KCZzYXZlZF9wYWNrZXRbaSAqIHNhdmVkX3BhY2tldF9sZW5dLCBzYXZlZF9wYWNrZXQsIHNhdmVkX3BhY2tldF9sZW4pOyAKKyAgICAgICAgfQorCisgICAgICAgIC8qIGNhbGwgdGhlIHByb3h5IEFQSSBlbm91Z2ggdGltZXMgdG8gc2VuZCB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiBwYWNrZXRzICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSArPSBwYWNrZXRzX3Blcl9wcm94eSkKKyAgICAgICAgeworICAgICAgICAgICAgdWludDE2X3QgbnVtYmVyX29mX3BhY2tldHMgPSBNSU4ocGFja2V0c19wZXJfcHJveHksIGNvdW50IC0gaSk7CisgICAgICAgICAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJnByb3h5LCB4Z3Bvbl9vbnUsIGNwdV9wYWNrZXRzLCBudW1iZXJfb2ZfcGFja2V0cywgbnVtYmVyX29mX3BhY2tldHMpOworCisgICAgICAgICAgICBidWZmZXIubGVuID0gbnVtYmVyX29mX3BhY2tldHMgKiBzYXZlZF9wYWNrZXRfbGVuOworICAgICAgICAgICAgQkNNT0xUX1BST1hZX1BST1BfU0VUKCZwcm94eSwgeGdwb25fb251LCBjcHVfcGFja2V0cywgYnVmZmVyLCBidWZmZXIpOworCisgICAgICAgICAgICBlcnIgPSBiY21vbHRfcHJveHlfc2VuZChkZXZpY2UsICZwcm94eS5oZHIpOworICAgICAgICAgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KAorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAiW0Vycm9yXSBwcm94eSBzZW5kOiBPTlUgJXUgcGFja2V0IGluZGV4ICV1OiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgb251c1tvbnVfaWR4XSwKKyAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgYmNtb3Nfc3RyZXJyb3IoZXJyKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIldSBwcm94eSBwYWNrZXQlcyBzZW50IHN1Y2Nlc3NmdWxseSFcbiIsIGNvdW50LCBjb3VudCA9PSAxID8gIiIgOiAicyIpOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gc2VuZF90b19vbnVfY2IoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICpvbnVfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm9udSIpOworICAgIGJjbW9sdF9wb25fbmkgcG9uX2lkID0gKGJjbW9sdF9wb25fbmkpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uX25pIiktPnZhbHVlLnVudW1iZXI7CisgICAgdWludDE2X3QgaTsKKyAgICBwb25fbW9kZSBtb2RlID0gcG9uX21vZGVfZ2V0KHBvbl9pZCk7CisKKyAgICBpZiAobW9kZSA9PSBQT05fTU9ERV9HUE9OKQorICAgIHsKKyAgICAgICAgc3RhdGljIGJjbW9sdF9ncG9uX29udV9pZCBvbnVfaWRfYnVmW01BWF9PTlVTX0ZPUl9TRU5EXTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG9udV9wYXJtLT5hcnJheV9zaXplOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIG9udV9pZF9idWZbaV0gPSAoYmNtb2x0X2dwb25fb251X2lkKW9udV9wYXJtLT52YWx1ZXNbaV0udW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2VuZF9wYWNrZXRfdG9fZ3Bvbl9vbnVfbGlzdChzZXNzaW9uLCAodWludDE2X3Qpb251X3Bhcm0tPmFycmF5X3NpemUsIG9udV9pZF9idWYpOworICAgIH0gCisgICAgZWxzZSBpZiAobW9kZSA9PSBQT05fTU9ERV9YR1BPTikKKyAgICB7CisgICAgICAgIHN0YXRpYyBiY21vbHRfeGdwb25fb251X2lkIG9udV9pZF9idWZbTUFYX09OVVNfRk9SX1NFTkRdOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb251X3Bhcm0tPmFycmF5X3NpemU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgb251X2lkX2J1ZltpXSA9IChiY21vbHRfeGdwb25fb251X2lkKW9udV9wYXJtLT52YWx1ZXNbaV0udW51bWJlcjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2VuZF9wYWNrZXRfdG9feGdwb25fb251X2xpc3Qoc2Vzc2lvbiwgKHVpbnQxNl90KW9udV9wYXJtLT5hcnJheV9zaXplLCBvbnVfaWRfYnVmKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIltFcnJvcl0gSW52YWxpZCBzeXN0ZW0gbW9kZVxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1NUQVRFOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZHVtcF9zYXZlZF9tYWMoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIHVpbnQxNl90IG9mZnNldCkKK3sKKyAgICB1aW50MTZfdCBpOworICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgeworICAgICAgICBpZiAoaSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiOiIpOworICAgICAgICB9CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIlMDJYIiwgc2F2ZWRfcGFja2V0W29mZnNldCArIGldKTsKKyAgICB9Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBkdW1wX3BhY2tldF9jYihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICB1aW50MTZfdCBpOworICAgIHVpbnQxNl90IGRhdGFfb2Zmc2V0OworCisgICAgaWYgKHNhdmVkX3BhY2tldF9sZW4gPT0gMCkKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJObyBwYWNrZXQgaGFzIGJlZW4gYnVpbHQgeWV0XG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIlNhdmVkIHBhY2tldCBwYXJhbWV0ZXJzOlxuIik7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIiAgICBUeXBlOiAlc1xuIiwgc2F2ZWRfcGFja2V0X3R5cGUgPT0gQkNNT0xUX1BBQ0tFVF9UWVBFX0NQVSA/ICJDUFUiIDogIk9NQ0kiKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiICAgIExlbmd0aDogJXVcbiIsIHNhdmVkX3BhY2tldF9sZW4pOworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIgICAgQXV0by1jYWxjdWxhdGUgQ1JDOiAlc1xuIiwgc2F2ZWRfcGFja2V0X2NhbGNfY3JjID8gInllcyIgOiAibm8iKTsKKworICAgIGlmIChzYXZlZF9wYWNrZXRfdHlwZSA9PSBCQ01PTFRfUEFDS0VUX1RZUEVfQ1BVKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIiAgICBFdGhlcm5ldCBEQTogIik7CisgICAgICAgIGR1bXBfc2F2ZWRfbWFjKHNlc3Npb24sIDApOworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiXG4iKTsKKworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiICAgIEV0aGVybmV0IFNBOiAiKTsKKyAgICAgICAgZHVtcF9zYXZlZF9tYWMoc2Vzc2lvbiwgNik7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJcbiIpOworCisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIgICAgRXRoZXJUeXBlOiAweCUwMlglMDJYXG4iLCBzYXZlZF9wYWNrZXRbMTJdLCBzYXZlZF9wYWNrZXRbMTNdKTsKKyAgICAgICAgZGF0YV9vZmZzZXQgPSAxNDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZGF0YV9vZmZzZXQgPSAwOworICAgIH0KKworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJEYXRhIGJ5dGVzIChzdGFydGluZyBhdCBvZmZzZXQgJXUpOiIsIGRhdGFfb2Zmc2V0KTsKKyAgICBmb3IgKGkgPSBkYXRhX29mZnNldDsgaSA8IHNhdmVkX3BhY2tldF9sZW47IGkrKykKKyAgICB7CisgICAgICAgIGlmICgoaSAtIGRhdGFfb2Zmc2V0KSAlIDE2ID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJcbiAgICAiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIgIik7CisgICAgICAgIH0KKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIiUwMlgiLCBzYXZlZF9wYWNrZXRbaV0pOworICAgIH0KKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiXG4iKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19lcnJubyBiY21vbHRfdXNlcl9hcHBsX2dwb25fdXRpbHNfaW5pdChiY21jbGlfZW50cnkgKnRvcF9kaXIpCit7CisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKworICAgIGlmICghZ3Bvbl91dGlsc19pc19yZWdpc3RlcmVkKQorICAgIHsKKyAgICAgICAgZ3Bvbl91dGlsc19pc19yZWdpc3RlcmVkID0gQkNNT1NfVFJVRTsKKworICAgICAgICAvKiBTdWJzY3JpYmUgZm9yIGRldmljZSBjaGFuZ2UgaW5kaWNhdGlvbiAqLworICAgICAgICBlcnIgPSBiY21vbHRfZGV2X3NlbF9pbmRfcmVnaXN0ZXIoYmNtb2x0X3VzZXJfYXBwbF9ncG9uX3V0aWxzX2RldmljZV9jaGFuZ2VfaW5kKTsKKyAgICB9CisgICAgcmV0dXJuIGVyciA/IGVyciA6IGJjbW9sdF91c2VyX2FwcGxfZ3Bvbl91dGlsc19jcmVhdGUodG9wX2Rpcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfdXNlcl9hcHBsX2dwb25fdXRpbHNfY3JlYXRlKGJjbWNsaV9lbnRyeSAqdG9wX2RpcikKK3sKKyAgICBzdGF0aWMgYmNtY2xpX2VudW1fdmFsIGdlbmVyYXRlZF9wYWNrZXRfcGF0dGVybl90YWJsZVtdID0KKyAgICB7CisgICAgICAgIHsgLm5hbWUgPSAiYnl0ZV9jeWNsZSIsIC52YWwgPSBHRU5FUkFURURfUEFDS0VUX1BBVFRFUk5fQllURV9DWUNMRSB9LAorICAgICAgICB7IC5uYW1lID0gIndvcmRfY3ljbGUiLCAudmFsID0gR0VORVJBVEVEX1BBQ0tFVF9QQVRURVJOX1dPUkRfQ1lDTEUgfSwKKyAgICAgICAgeyAubmFtZSA9ICJjb25zdCIsICAgICAgLnZhbCA9IEdFTkVSQVRFRF9QQUNLRVRfUEFUVEVSTl9DT05TVCB9LAorICAgICAgICBCQ01DTElfRU5VTV9MQVNUCisgICAgfTsKKworICAgIHN0YXRpYyBiY21jbGlfcGFybV92YWx1ZSBnZW1fcG9ydF9pZHNbTUFYX0dFTV9QT1JUU19GT1JfU0VORF07CisgICAgc3RhdGljIGJjbWNsaV9wYXJtX3ZhbHVlIG9udV9pZHNbTUFYX09OVVNfRk9SX1NFTkRdOworCisgICAgYmNtY2xpX2VudHJ5ICpkaXI7CisKKyAgICBpZiAoYmNtY2xpX2Rpcl9maW5kKHRvcF9kaXIsICJncG9uIikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisKKyAgICBncG9uX3V0aWxzX2NsaV9kaXJfY2xpX2Rlc3Ryb3koKTsKKworICAgIGRpciA9IGJjbWNsaV9kaXJfYWRkKHRvcF9kaXIsICJncG9uIiwgIkNvbW1vbiBHUE9OL1hHUE9OIGZ1bmN0aW9ucyIsIEJDTUNMSV9BQ0NFU1NfQURNSU4sIE5VTEwpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUighZGlyLCBCQ01fRVJSX05PTUVNKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRCgKKyAgICAgICAgZGlyLAorICAgICAgICAiYnVpbGRfY3B1X3BhY2tldCIsCisgICAgICAgICJCdWlsZCBhbmQgc2F2ZSBDUFUgcGFja2V0IiwKKyAgICAgICAgYnVpbGRfY3B1X3BhY2tldF9jYiwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNKCJjYWxjX2NyYyIsICJBdXRvLWNhbGN1bGF0ZSBDUkMiLCBiY21jbGlfZW51bV9ib29sX3RhYmxlLCBCQ01DTElfUEFSTV9GTEFHX05PTkUpLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX1JBTkdFKAorICAgICAgICAgICAgInBhY2tldF9zaXplIiwgIkZ1bGwgcGFja2V0IHNpemUiLCBCQ01DTElfUEFSTV9VTlVNQkVSLCBCQ01DTElfUEFSTV9GTEFHX05PTkUsIDAsIE1BWF9QQUNLRVRfU0laRSksCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fRU5VTSgicGF0dGVybiIsICJCYWNrZ3JvdW5kIHBhdHRlcm4iLCBnZW5lcmF0ZWRfcGFja2V0X3BhdHRlcm5fdGFibGUsIEJDTUNMSV9QQVJNX0ZMQUdfTk9ORSksCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fUkFOR0UoImNvbnN0X3ZhbHVlIiwgIkNvbnN0IHZhbHVlIiwgQkNNQ0xJX1BBUk1fVU5VTUJFUiwgQkNNQ0xJX1BBUk1fRkxBR19OT05FLCAwLCAweEZGKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiZXRoX2RhIiwgIkV0aGVybmV0IGRlc3RpbmF0aW9uIGFkZHJlc3MiLCBCQ01DTElfUEFSTV9NQUMsIEJDTUNMSV9QQVJNX0ZMQUdfTk9ORSksCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImV0aF9zYSIsICJFdGhlcm5ldCBzb3VyY2UgYWRkcmVzcyIsIEJDTUNMSV9QQVJNX01BQywgQkNNQ0xJX1BBUk1fRkxBR19OT05FKSk7CisKKyAgICBCQ01DTElfTUFLRV9DTUQoCisgICAgICAgIGRpciwKKyAgICAgICAgImJ1aWxkX29tY2lfcGFja2V0IiwKKyAgICAgICAgIkJ1aWxkIGFuZCBzYXZlIE9NQ0kgcGFja2V0IiwKKyAgICAgICAgYnVpbGRfb21jaV9wYWNrZXRfY2IsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fRU5VTSgiY2FsY19jcmMiLCAiQXV0by1jYWxjdWxhdGUgQ1JDIiwgYmNtY2xpX2VudW1fYm9vbF90YWJsZSwgQkNNQ0xJX1BBUk1fRkxBR19OT05FKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9SQU5HRSgKKyAgICAgICAgICAgICJwYWNrZXRfc2l6ZSIsICJGdWxsIHBhY2tldCBzaXplIiwgQkNNQ0xJX1BBUk1fVU5VTUJFUiwgQkNNQ0xJX1BBUk1fRkxBR19OT05FLCAwLCBNQVhfUEFDS0VUX1NJWkUpLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oInBhdHRlcm4iLCAiQmFja2dyb3VuZCBwYXR0ZXJuIiwgZ2VuZXJhdGVkX3BhY2tldF9wYXR0ZXJuX3RhYmxlLCBCQ01DTElfUEFSTV9GTEFHX05PTkUpLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX1JBTkdFKCJjb25zdF92YWx1ZSIsICJDb25zdCB2YWx1ZSIsIEJDTUNMSV9QQVJNX1VOVU1CRVIsIEJDTUNMSV9QQVJNX0ZMQUdfTk9ORSwgMCwgMHhGRikpOworCisgICAgQkNNQ0xJX01BS0VfQ01EKAorICAgICAgICBkaXIsCisgICAgICAgICJzZW5kX3RvX2dlbSIsCisgICAgICAgICJTZW5kIHNhdmVkIENQVS9PTUNJIHBhY2tldCB0byBHRU0gcG9ydChzKSIsCisgICAgICAgIHNlbmRfdG9fZ2VtX2NiLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJkZXZpY2UiLCAiRGV2aWNlIElEIiwgQkNNQ0xJX1BBUk1fVU5VTUJFUiwgQkNNQ0xJX1BBUk1fRkxBR19OT05FKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgicG9uX25pIiwgIlBPTiBOSSIsIEJDTUNMSV9QQVJNX1VOVU1CRVIsIEJDTUNMSV9QQVJNX0ZMQUdfTk9ORSksCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fQVJSQVkoCisgICAgICAgICAgICAiZ2VtIiwKKyAgICAgICAgICAgICJHRU0gcG9ydCBJRHMsIGNvbW1hIHNlcGFyYXRlZCIsCisgICAgICAgICAgICBCQ01DTElfUEFSTV9VTlVNQkVSLAorICAgICAgICAgICAgQkNNQ0xJX1BBUk1fRkxBR19OT05FLAorICAgICAgICAgICAgTUFYX0dFTV9QT1JUU19GT1JfU0VORCwKKyAgICAgICAgICAgIGdlbV9wb3J0X2lkcyksCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImNvdW50IiwgIk51bWJlciBvZiBwYWNrZXRzIChkZWZhdWx0IDEpIiwgQkNNQ0xJX1BBUk1fVU5VTUJFUiwgQkNNQ0xJX1BBUk1fRkxBR19PUFRJT05BTCkpOworCisgICAgQkNNQ0xJX01BS0VfQ01EKAorICAgICAgICBkaXIsCisgICAgICAgICJzZW5kX3RvX29udSIsCisgICAgICAgICJTZW5kIHNhdmVkIENQVS9PTUNJIHBhY2tldCB0byBPTlUocykgKE9NQ0kgR0VNIHBvcnQpIiwKKyAgICAgICAgc2VuZF90b19vbnVfY2IsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImRldmljZSIsICJEZXZpY2UgSUQiLCBCQ01DTElfUEFSTV9VTlVNQkVSLCBCQ01DTElfUEFSTV9GTEFHX05PTkUpLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJwb25fbmkiLCAiUE9OIE5JIiwgQkNNQ0xJX1BBUk1fVU5VTUJFUiwgQkNNQ0xJX1BBUk1fRkxBR19OT05FKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9BUlJBWSgKKyAgICAgICAgICAgICJvbnUiLAorICAgICAgICAgICAgIk9OVSBJRHMsIGNvbW1hIHNlcGFyYXRlZCIsCisgICAgICAgICAgICBCQ01DTElfUEFSTV9VTlVNQkVSLAorICAgICAgICAgICAgQkNNQ0xJX1BBUk1fRkxBR19OT05FLAorICAgICAgICAgICAgTUFYX09OVVNfRk9SX1NFTkQsCisgICAgICAgICAgICBvbnVfaWRzKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiY291bnQiLCAiTnVtYmVyIG9mIHBhY2tldHMgKGRlZmF1bHQgMSkiLCBCQ01DTElfUEFSTV9VTlVNQkVSLCBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMKSk7CisKKyAgICBCQ01DTElfTUFLRV9DTURfTk9QQVJNKAorICAgICAgICBkaXIsCisgICAgICAgICJkdW1wX3BhY2tldCIsCisgICAgICAgICJQcmludCBzYXZlZCBDUFUvT01DSSBwYWNrZXQgZGF0YSIsCisgICAgICAgIGR1bXBfcGFja2V0X2NiKTsKKworICAgIGdwb25fdXRpbHNfY2xpX2RpciA9IGRpcjsKKyAgICBncG9uX3V0aWxzX2NsaV90b3BfZGlyID0gdG9wX2RpcjsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvYmNtb2x0X3VzZXJfYXBwbF9ncG9uX3V0aWxzLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2JjbW9sdF91c2VyX2FwcGxfZ3Bvbl91dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMzgwYzkKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2JjbW9sdF91c2VyX2FwcGxfZ3Bvbl91dGlscy5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgX0JDTU9MVF9VU0VSX0FQUExfR1BPTl9VVElMU19IXworI2RlZmluZSBfQkNNT0xUX1VTRVJfQVBQTF9HUE9OX1VUSUxTX0hfCisKKyNpbmNsdWRlIDxiY21vbHRfaG9zdF9hcGkuaD4KKworYmNtb3NfZXJybm8gYmNtb2x0X3VzZXJfYXBwbF9ncG9uX3V0aWxzX2luaXQoYmNtY2xpX2VudHJ5ICp0b3BfZGlyKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Rwb2Vfc2VjL01ha2VmaWxlIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTY3ZTIzCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9NYWtlZmlsZQpAQCAtMCwwICsxLDEyIEBACisjIERQb0UgU2VjdXJpdHkKKworaWZlcSAoIiQoRU5BQkxFX0NMSSkiLCAieSIpCisKKwlNT0RfTkFNRSA9IGJjbV91c2VyX2FwcGxfZHBvZV9zZWMKKwlNT0RfVFlQRSA9IGxpYgorCU1PRF9ERVBTID0gb3MgaG9zdF9hcGkgYmNtX3VzZXJfYXBwbF9lcG9uX29hbQorCisJc3JjcyA9IGJjbW9sdF91c2VyX2FwcGxfZHBvZV9zZWMuYyBkcG9lX2VhcF90bHMuYyBkcG9lX3NlY19mc20uYyBkcG9lX3NlY19ta2FfZnNtLmMgZHBvZV9zZWNfdXRpbC5jIG1rYS5jCisKK2VuZGlmCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZHBvZV9zZWMvYmNtb2x0X3VzZXJfYXBwbF9kcG9lX3NlYy5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9iY21vbHRfdXNlcl9hcHBsX2Rwb2Vfc2VjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRiY2IxMgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZHBvZV9zZWMvYmNtb2x0X3VzZXJfYXBwbF9kcG9lX3NlYy5jCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyAgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICBvZiB0aGUgc29mdHdhcmUuCisKKyAgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisgIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorICB3cml0dGVuIGNvbnNlbnQuCisKKyAgOj4KKyovCisKKyNpbmNsdWRlICJiY21vc19zeXN0ZW0uaCIKKyNpbmNsdWRlICJiY21vbHRfbW9kZWxfdHlwZXMuaCIKKyNpbmNsdWRlICJiY21vbHRfZXBvbl9vYW1fdHlwZXMuaCIKKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX2Rwb2Vfc2VjLmgiCisjaW5jbHVkZSAiZHBvZV9zZWNfZnNtLmgiCisKK3N0YXRpYyBiY21vc19ib29sIGlzX3J1bm5pbmcgPSBCQ01PU19GQUxTRTsKKworc3RhdGljIGJjbW9zX2Jvb2wgY2VydF9hdXRob3JpdHlfdHJ1c3RfcGxhY2Vob2xkZXIoZHBvZV9zZWNfbGlua19yZWMqIGxpbmtfcmVjKQoreworICAgIEJDTV9MT0coSU5GTywgZHBvZV9zZWNfbG9nX2lkW2xpbmtfcmVjLT5kZXZpY2VdLCAiVGhpcyBmdW5jdGlvbiBzaG91bGQgdmFsaWRhdGUgdGhlIGNlcnRpZmljYXRlIGluZm9ybWF0aW9uIHN0b3JlZCBpbiB0aGUgbGluayByZWNvcmQgYW5kIGRlY2lkZSB3aGV0aGVyIHRvIGFjY2VwdCB0aGlzIGF1dGhlbnRpY2F0aW9uLlxuIik7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKK3N0YXRpYyB2b2lkIGZzbV9jb21wbGV0ZV9wbGFjZWhvbGRlcihiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfZXBvbl9saW5rX2tleSBsaW5rX2tleSwgYmNtb3NfZXJybm8gc3RhdHVzKQoreworICAgIGlmIChzdGF0dXMgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIEJDTV9MT0coSU5GTywgZHBvZV9zZWNfbG9nX2lkW2RldmljZV0sICJUaGUgRFBvRSBTZWN1cml0eSBGU00gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4gVGhpcyBsaW5rIGNhbiBub3cgYmUgY29uZmlndXJlZCBmb3Igc2VydmljZS5cbiIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBCQ01fTE9HKElORk8sIGRwb2Vfc2VjX2xvZ19pZFtkZXZpY2VdLCAiVGhlIERQb0UgU2VjdXJpdHkgRlNNIGZhaWxlZCBkdWUgdG8gJXMgKCVkKS4gQXBwcm9wcmlhdGUgYWN0aW9uIHNob3VsZCBiZSB0YWtlbiB0byBjb3JyZWN0IHRoaXMgZXJyb3IuXG4iLCBiY21vc19zdHJlcnJvcihzdGF0dXMpLCBzdGF0dXMpOworICAgIH0KK30KKworI2lmZGVmIEVOQUJMRV9DTEkKK3N0YXRpYyBiY21vc19lcnJubyBkcG9lX3NlY19jbGlfYXV0aChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBsaW5rX2tleTsKKyAgICBkcG9lX3NlY19mc21fc3RhcnRfZGF0YSBjZmc7CisKKyAgICBsaW5rX2tleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInBvbiIpLT52YWx1ZS51bnVtYmVyOworICAgIGxpbmtfa2V5Lm1hY19hZGRyZXNzID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib251IiktPnZhbHVlLm1hYzsKKyAgICBjZmcuZW5jX21vZGUgPSAoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZW5jcnlwdGlvbl9tb2RlKWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1vZGUiKS0+dmFsdWUuZW51bV92YWw7CisgICAgY2ZnLmF1dGggPSBCQ01PU19UUlVFOworCisgICAgcmV0dXJuIGRwb2Vfc2VjX2ZzbV9saW5rX3N0YXJ0KGN1cnJlbnRfZGV2aWNlLCBsaW5rX2tleSwgJmNmZyk7Cit9CisjZW5kaWYKKwordm9pZCBiY21vbHRfdXNlcl9hcHBsX2Rwb2Vfc2VjX2NsaV9pbml0KGJjbWNsaV9lbnRyeSAqdG9wX2RpcikKK3sKKyNpZmRlZiBFTkFCTEVfQ0xJCisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmRpcl9uYW1lID0gImRwb2Vfc2VjIjsKKworICAgIGlmIChiY21jbGlfZGlyX2ZpbmQodG9wX2RpciwgZGlyX25hbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJjbWNsaV9lbnRyeSAqZHBvZV9zZWNfZGlyID0gYmNtY2xpX2Rpcl9hZGQodG9wX2RpciwgZGlyX25hbWUsICJEUG9FIFNlY3VyaXR5IiwgQkNNQ0xJX0FDQ0VTU19BRE1JTiwgTlVMTCk7CisgICAgQlVHX09OKE5VTEwgPT0gZHBvZV9zZWNfZGlyKTsKKworICAgIHN0YXRpYyBiY21jbGlfZW51bV92YWwgZW5jX21vZGVfdGFibGVbXSA9CisgICAgeworICAgICAgICB7Im5vbmUiLCAobG9uZylCQ01PTFRfRVBPTl9PQU1fRFBPRV9FTkNSWVBUSU9OX01PREVfTk9ORX0sCisgICAgICAgIHsiMWRvd24iLCAobG9uZylCQ01PTFRfRVBPTl9PQU1fRFBPRV9FTkNSWVBUSU9OX01PREVfT05FX0RPV059LAorICAgICAgICB7IjEwZG93biIsIChsb25nKUJDTU9MVF9FUE9OX09BTV9EUE9FX0VOQ1JZUFRJT05fTU9ERV9URU5fRE9XTn0sCisgICAgICAgIHsiMTBiaSIsIChsb25nKUJDTU9MVF9FUE9OX09BTV9EUE9FX0VOQ1JZUFRJT05fTU9ERV9URU5fQkl9LAorICAgICAgICBCQ01DTElfRU5VTV9MQVNUCisgICAgfTsKKworICAgIEJDTUNMSV9NQUtFX0NNRChkcG9lX3NlY19kaXIsICJhdXRoIiwgIkF1dGhlbnRpY2F0ZSBPTlUiLCBkcG9lX3NlY19jbGlfYXV0aCwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgicG9uIiwgIlBPTiBOSSIsIEJDTUNMSV9QQVJNX1VERUNJTUFMLCBCQ01DTElfUEFSTV9GTEFHX05PTkUpLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJvbnUiLCAiT05VIE1BQyIsIEJDTUNMSV9QQVJNX01BQywgQkNNQ0xJX1BBUk1fRkxBR19OT05FKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNKCJtb2RlIiwgIkVuY3J5cHRpb24gbW9kZSIsIGVuY19tb2RlX3RhYmxlLCBCQ01DTElfUEFSTV9GTEFHX05PTkUpKTsKKyNlbmRpZgorfQorCit2b2lkIGJjbW9sdF91c2VyX2FwcGxfZHBvZV9zZWNfcHJvY2Vzc19wcm94eV9yeChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21vbHRfcHJveHlfcnggKnByb3h5X3J4KQoreworICAgIGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWQgKmNhcCA9IChiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkKilwcm94eV9yeDsKKworICAgIGlmICgoQkNNT0xUX09CSl9JRF9FUE9OX0xJTksgPT0gcHJveHlfcngtPmhkci5vYmpfdHlwZSkgJiYKKyAgICAgICAgKEJDTU9MVF9FUE9OX0xJTktfUFJPWFlfUlhfSURfRlJBTUVfQ0FQVFVSRUQgPT0gcHJveHlfcngtPmhkci5zdWJncm91cCkpCisgICAgeworICAgICAgICBpZiAoKGNhcC0+ZGF0YS5mcmFtZS52YWxbMTJdID09IDB4ODgpICYmCisgICAgICAgICAgICAoY2FwLT5kYXRhLmZyYW1lLnZhbFsxM10gPT0gMHgwOSkgJiYKKyAgICAgICAgICAgIChjYXAtPmRhdGEuZnJhbWUudmFsWzE0XSA9PSAweDAzKSkKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCAqZnJhbWVfY29weTsKKworICAgICAgICAgICAgZnJhbWVfY29weSA9IGJjbW9zX2FsbG9jKGNhcC0+ZGF0YS5mcmFtZS5sZW4pOworICAgICAgICAgICAgbWVtY3B5KGZyYW1lX2NvcHksIGNhcC0+ZGF0YS5mcmFtZS52YWwsIGNhcC0+ZGF0YS5mcmFtZS5sZW4pOworCisgICAgICAgICAgICBkcG9lX3NlY19mc21fbGlua19yeF9vYW0oZGV2aWNlX2lkLCBjYXAtPmtleSwgZnJhbWVfY29weSwgY2FwLT5kYXRhLmZyYW1lLmxlbik7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuOyAvKiBub3QgYSBmcmFtZSBjYXB0dXJlZCBvbiBhIGxpbmsgLSBpZ25vcmUgKi8KKyAgICB9Cit9CisKK3ZvaWQgYmNtb2x0X3VzZXJfYXBwbF9kcG9lX3NlY19pbml0KHZvaWQpCit7CisgICAgaWYgKGlzX3J1bm5pbmcpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZHBvZV9zZWNfZnNtX2luaXQoY2VydF9hdXRob3JpdHlfdHJ1c3RfcGxhY2Vob2xkZXIsIGZzbV9jb21wbGV0ZV9wbGFjZWhvbGRlcik7CisKKyAgICBpc19ydW5uaW5nID0gQkNNT1NfVFJVRTsKK30KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9iY21vbHRfdXNlcl9hcHBsX2Rwb2Vfc2VjLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Rwb2Vfc2VjL2JjbW9sdF91c2VyX2FwcGxfZHBvZV9zZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODcyZjhjCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9iY21vbHRfdXNlcl9hcHBsX2Rwb2Vfc2VjLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBfQkNNT0xUX1VTRVJfQVBQTF9EUE9FX1NFQ19IXworI2RlZmluZSBfQkNNT0xUX1VTRVJfQVBQTF9EUE9FX1NFQ19IXworCisjaW5jbHVkZSAiYmNtY2xpLmgiCisKK3ZvaWQgYmNtb2x0X3VzZXJfYXBwbF9kcG9lX3NlY19wcm9jZXNzX3Byb3h5X3J4KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbW9sdF9wcm94eV9yeCAqcHJveHlfcngpOworCit2b2lkIGJjbW9sdF91c2VyX2FwcGxfZHBvZV9zZWNfY2xpX2luaXQoYmNtY2xpX2VudHJ5ICp0b3BfZGlyKTsKKwordm9pZCBiY21vbHRfdXNlcl9hcHBsX2Rwb2Vfc2VjX2luaXQodm9pZCk7CisKKyNlbmRpZiAvKiBfQkNNT0xUX1VTRVJfQVBQTF9EUE9FX1NFQ19IXyAqLworCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZHBvZV9zZWMvZHBvZV9lYXBfdGxzLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Rwb2Vfc2VjL2Rwb2VfZWFwX3Rscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZWE4MGEKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Rwb2Vfc2VjL2Rwb2VfZWFwX3Rscy5jCkBAIC0wLDAgKzEsMTQ4MyBAQAorLyoKKyAgPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICBBbGwgUmlnaHRzIFJlc2VydmVkCisKKyAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorICBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCisgIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyAgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgb2YgdGhlIHNvZnR3YXJlLgorCisgIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyAgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKKyAgd3JpdHRlbiBjb25zZW50LgorCisgIDo+CisqLworCisjaW5jbHVkZSAiZHBvZV9lYXBfdGxzLmgiCisjaW5jbHVkZSAiYmNtb2x0X2J1Zi5oIgorI2luY2x1ZGUgImRwb2Vfc2VjX2ZzbS5oIgorCisvKiBUaGUgZGVzdGluYXRpb24gbXVsdGljYXN0IE1BQyBhZGRyZXNzIGZvciBFQVBPTCBwYWNrZXRzLiAqLworc3RhdGljIGNvbnN0IGJjbW9zX21hY19hZGRyZXNzIGVhcG9sX2RzdF9tYWMgPSB7IHsgMHgwMSwgMHg4MCwgMHhjMiwgMHgwMCwgMHgwMCwgMHgwMyB9IH07CisKKy8qIFRoZSBsZW5ndGggb2YgdGhlIFJTQSBrZXkgdXNlZCBpbiB0aGUgc2VydmVyX2tleV9leGNoYW5nZSBUTFMgbWVzc2FnZSBzZW50IHRvIHRoZSBPTlUgZHVyaW5nIERQb0UgYmktZGlyZWN0aW9uYWwKKyAgIGF1dGhlbnRpY2F0aW9uLiAqLworI2RlZmluZSBEUE9FX0JJX1JTQV9LRVlfU0laRSAyMDQ4CisKKy8qIDIgMTIwMCBieXRlIGNlcnRzICsgc29tZSBvdmVyaGVhZC4uLi4gKi8KKyNkZWZpbmUgRUFQT0xfUEtUX1NJWkUgNTAwMAorCit0eXBlZGVmIGVudW0KK3sKKyAgICBFQVBfQ09ERV9SRVFVRVNUID0gMSwKKyAgICBFQVBfQ09ERV9SRVNQT05TRSwKKyAgICBFQVBfQ09ERV9TVUNDRVNTLAorICAgIEVBUF9DT0RFX0ZBSUxVUkUKK30gZWFwX2NvZGU7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDhfdCBlYXBfY29kZTsKKyAgICB1aW50OF90IGlkOworICAgIHVpbnQxNl90IGxlbmd0aDsKK30gZWFwX2ZyYW1lOworCisjZGVmaW5lIEVBUF9GUkFNRV9TSVpFIDQKKwordHlwZWRlZiBlbnVtCit7CisgICAgRUFQX1RZUEVfSURFTlRJVFkgPSAxLAorICAgIEVBUF9UWVBFX05PVElGSUNBVElPTiwKKyAgICBFQVBfVFlQRV9OQUssCisgICAgRUFQX1RZUEVfTUQ1LAorICAgIEVBUF9UWVBFX09UUCwKKyAgICBFQVBfVFlQRV9HRU5FUklDX1RPS0VOX0NBUkQsCisgICAgRUFQX1RZUEVfVExTID0gMTMKK30gZWFwX3R5cGU7CisKKyNkZWZpbmUgVExTX01BSk9SX1ZFUlNJT04gMworI2RlZmluZSBUTFNfTUlOT1JfVkVSU0lPTiAyCisKKy8qIEZpcnN0IHRoZSBFQVAgc3RydWN0dXJlcy4uLi4gKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDhfdCBhdXRoX3N1Yl90eXBlOworICAgIHVpbnQ4X3QgZWFwX3Rsc19mbGFnczsKK30gZWFwX3Rsc19oZHI7CisKKyNkZWZpbmUgRUFQX1RMU19IRFJfU0laRSAyCisKKyNkZWZpbmUgRUFQX0hEUl9TSVpFIChFQVBfRlJBTUVfU0laRSArIEVBUF9UTFNfSERSX1NJWkUpCisKK3R5cGVkZWYgZW51bQoreworICAgIFRMU19DSEFOR0VfQ0lQSEVSX1NQRUNfSUQgPSAyMCwKKyAgICBUTFNfQUxFUlRfSUQgPSAyMSwKKyAgICBUTFNfSEFORFNIQUtFX0lEID0gMjIsCisgICAgVExTX0FQUExJQ0FUSU9OX0RBVEFfSUQgPSAyMywKK30gdGxzX2NvbnRlbnRfdHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50OF90IGNvbnRlbnRfdHlwZTsKKyAgICB0bHNfcHJvdG9jb2xfdmVyc2lvbiB0bHNfdmVyc2lvbjsKKyAgICB1aW50MTZfdCB0bHNfcmVjb3JkX2xlbmd0aDsKK30gdGxzX3JlY29yZF9oZHI7CisKKyNkZWZpbmUgVExTX1JFQ09SRF9IRFJfU0laRSAoMyArIFBST1RPQ09MX1ZFUlNJT05fU0laRSkKKworI2RlZmluZSBFQVBfVExTX0ZMQUdfTEVOR1RIX09GRlNFVCA3CisjZGVmaW5lIEVBUF9UTFNfRkxBR19NT1JFX09GRlNFVCA2CisjZGVmaW5lIEVBUF9UTFNfRkxBR19TVEFSVF9PRkZTRVQgNQorI2RlZmluZSBFQVBfVExTX0ZMQUdfTEVOR1RIX0JJVCAoMVUgPDwgRUFQX1RMU19GTEFHX0xFTkdUSF9PRkZTRVQpCisjZGVmaW5lIEVBUF9UTFNfRkxBR19NT1JFX0JJVCAoMVUgPDwgRUFQX1RMU19GTEFHX01PUkVfT0ZGU0VUKQorI2RlZmluZSBFQVBfVExTX0ZMQUdfU1RBUlRfQklUICgxVSA8PCBFQVBfVExTX0ZMQUdfU1RBUlRfT0ZGU0VUKQorCit0eXBlZGVmIHN0cnVjdAoreworICAgIGVhcF9mcmFtZSBoZHI7CisgICAgZWFwX3Rsc19oZHIgdGxzOworfSBlYXBfbXNnX2J1ZjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBlYXBvbF9tc2dfaGRyIGhkcjsKKyAgICBlYXBfbXNnX2J1ZiBlYXBfbXNnOworfSBlYXBvbF9tc2c7CisKKy8qIE5vdyB0aGUgVExTIHJlY29yZHMuICovCit0eXBlZGVmIHN0cnVjdCB0bHNfc2Vzc2lvbl9pZAoreworICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgIHVpbnQ4X3Qgc2Vzc2lvbl9pZFtTSVpFX09GX1RMU19TRVNTSU9OX0lEXTsKK30gdGxzX3Nlc3Npb25faWQ7CisKK3R5cGVkZWYgZW51bQoreworICAgIGNtX251bGwgPSAwCit9IGNvbXByZXNzaW9uX21ldGhvZDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50OF90IGxlbmd0aDsKKyAgICB1aW50OF90IGNvbXByZXNzaW9uX21ldGhvZDsKK30gY29tcHJlc3Npb25fbWV0aG9kczsKKwordHlwZWRlZiBlbnVtCit7CisgICAgUlNBX1NJR04gICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwKKyAgICBEU1NfU0lHTiAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLAorICAgIFJTQV9GSVhFRF9ESCAgICAgICAgICAgICAgICAgICAgICA9IDMsCisgICAgRFNTX0ZJWEVEX0RIICAgICAgICAgICAgICAgICAgICAgID0gNCwKKyAgICBSU0FfRVBIRU1FUkFMX0RIX1JFU0VSVkVEICAgICAgICAgPSA1LAorICAgIERTU19FUEhFTUVSQUxfREhfUkVTRVJWRUQgICAgICAgICA9IDYsCisgICAgRk9SVEVaWkFfRE1TX1JFU0VSVkVEICAgICAgICAgICAgID0gMjAsCit9IGNsaWVudF9jZXJ0aWZpY2F0ZV90eXBlOworCisvKiBGb3IgMjA0OCBiaXQgUlNBIGtleSAqLworI2RlZmluZSBTSVpFX09GX1JTQV9NT0RVTFVTIDI1NgorI2RlZmluZSBTSVpFX09GX1JTQV9FWFBPTkVOVCAzCisKK3R5cGVkZWYgZW51bQoreworICAgIEhTX0hFTExPX1JFUVVFU1QgPSAwLAorICAgIEhTX0NMSUVOVF9IRUxMTyA9IDEsCisgICAgSFNfU0VSVkVSX0hFTExPID0gMiwKKyAgICBIU19DRVJUSUZJQ0FURSA9IDExLAorICAgIEhTX1NFUlZFUl9LRVlfRVhDSEFOR0UgPSAxMiwKKyAgICBIU19DRVJUSUZJQ0FURV9SRVFVRVNUID0gMTMsCisgICAgSFNfU0VSVkVSX0hFTExPX0RPTkUgPSAxNCwKKyAgICBIU19DRVJUSUZJQ0FURV9WRVJJRlkgPSAxNSwKKyAgICBIU19DTElFTlRfS0VZX0VYQ0hBTkdFID0gMTYsCisgICAgSFNfRklOSVNIRUQgPSAyMCwKK30gaGFuZHNoYWtlX3R5cGU7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDhfdCBtc2dfaWQ7CisgICAgdWludDMyX3QgbXNnX2xlbmd0aDsgLyogYWN0dWFsbHkgVTI0ICovCit9IHRsc19oYW5kc2hha2U7CisKKyNkZWZpbmUgVExTX0hBTkRTSEFLRV9TSVpFIDQKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50OF90ICplYXBvbDsKKyAgICB1aW50OF90ICplYXA7CisgICAgdWludDhfdCAqZWFwX3RsczsKKyAgICB1aW50OF90ICp0bHNfcmVjOworfSBlYXBfbGVuZ3RoX2ZpZWxkczsKKworc3RhdGljIGZfZHBvZV9zZWNfY2VydF90cnVzdF9jYiBfY2VydF90cnVzdDsKK3N0YXRpYyBmX2Rwb2Vfc2VjX2F1dGhfY2IgX2F1dGhfY29tcGxldGU7CisKK3N0YXRpYyB2b2lkIF9idWZmZXJfaGFzaF9kYXRhKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgY29uc3QgdWludDhfdCAqYnVmLCB1aW50MzJfdCBsZW4pCit7CisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGJ1ZiA9PSBOVUxMKTsKKworICAgIGRwb2Vfc2VjX3NoYTFfdXBkYXRlKCZsaW5rX3JlYy0+YXV0aF9jdHJsLnRyYW5zX2RhdGEuc2hhMV9oYXNoLCBidWYsIGxlbik7CisgICAgZHBvZV9zZWNfbWQ1X3VwZGF0ZSgmbGlua19yZWMtPmF1dGhfY3RybC50cmFuc19kYXRhLm1kNV9oYXNoLCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyB2b2lkIF9kcG9lX2VhcF90bHNfY29tcHV0ZV9tYXN0ZXJfc2Vzc2lvbl9rZXkoYXV0aF90cmFuc19kYXRhICp0cmFuc19kYXRhKQoreworICAgIHVpbnQ4X3Qgc2VlZFsoMiogQ09VTlRfT0ZfUkFORE9NX0JZVEVTKV07CisgICAgdWludDMyX3Qgc2VlZF9sZW4gPSAwOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04odHJhbnNfZGF0YSA9PSBOVUxMKTsKKworICAgIC8qIFRoZSBzZWVkIHRvIHRoZSBQUkYgaXMgdGhlIGNsaWVudCByYW5kb20gdmFsdWUgY29uY2F0ZW5hdGVkIHdpdGggdGhlIHNlcnZlciByYW5kb20gdmFsdWUuICovCisgICAgbWVtY3B5KCZzZWVkW3NlZWRfbGVuXSwgdHJhbnNfZGF0YS0+Y2xpZW50X3JhbmRvbSwgQ09VTlRfT0ZfUkFORE9NX0JZVEVTKTsKKyAgICBzZWVkX2xlbiArPSBDT1VOVF9PRl9SQU5ET01fQllURVM7CisgICAgbWVtY3B5KCZzZWVkW3NlZWRfbGVuXSwgdHJhbnNfZGF0YS0+c2VydmVyX3JhbmRvbSwgQ09VTlRfT0ZfUkFORE9NX0JZVEVTKTsKKyAgICBzZWVkX2xlbiArPSBDT1VOVF9PRl9SQU5ET01fQllURVM7CisKKyAgICBkcG9lX3NlY19wcmZfZXhwYW5kXzQzNDYoCisgICAgICAgIHRyYW5zX2RhdGEtPnByZV9tYXN0ZXJfc2VjcmV0LAorICAgICAgICBzaXplb2YodHJhbnNfZGF0YS0+cHJlX21hc3Rlcl9zZWNyZXQpLAorICAgICAgICAoY29uc3QgdWludDhfdCAqKSJtYXN0ZXIgc2VjcmV0IiwKKyAgICAgICAgc3RybGVuKCJtYXN0ZXIgc2VjcmV0IiksCisgICAgICAgIHNlZWQsCisgICAgICAgIHNlZWRfbGVuLAorICAgICAgICB0cmFuc19kYXRhLT5tYXN0ZXJfc2VjcmV0LAorICAgICAgICBzaXplb2YodHJhbnNfZGF0YS0+bWFzdGVyX3NlY3JldCkpOworICAgIGRwb2Vfc2VjX3ByZl9leHBhbmRfNDM0NigKKyAgICAgICAgdHJhbnNfZGF0YS0+bWFzdGVyX3NlY3JldCwKKyAgICAgICAgc2l6ZW9mKHRyYW5zX2RhdGEtPm1hc3Rlcl9zZWNyZXQpLAorICAgICAgICAoY29uc3QgdWludDhfdCAqKSJjbGllbnQgRUFQIGVuY3J5cHRpb24iLAorICAgICAgICBzdHJsZW4oImNsaWVudCBFQVAgZW5jcnlwdGlvbiIpLAorICAgICAgICBzZWVkLAorICAgICAgICBzZWVkX2xlbiwKKyAgICAgICAgdHJhbnNfZGF0YS0+a2V5X21hdGVyaWFsLAorICAgICAgICBzaXplb2YodHJhbnNfZGF0YS0+a2V5X21hdGVyaWFsKSk7CisKKyAgICBtZW1jcHkodHJhbnNfZGF0YS0+bWFzdGVyX3Nlc3Npb25fa2V5LCB0cmFuc19kYXRhLT5rZXlfbWF0ZXJpYWwsIHNpemVvZih0cmFuc19kYXRhLT5tYXN0ZXJfc2Vzc2lvbl9rZXkpKTsKK30KKworc3RhdGljIGJjbW9zX2Jvb2wgX2Rwb2VfZWFwX3Rsc19wcmVwYXJlX3NlY3VyaXR5X2RhdGEoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjKQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworCisgICAgLyogSWYgYmlkaXJlY3Rpb25hbCwgY29tcHV0ZSB0aGUgbWFzdGVyIHNlc3Npb24ga2V5IGFuZCBnZW5lcmF0ZSB0aGUgUlNBIHB1YmxpYy9wcml2YXRlIGtleSBwYWlyICovCisgICAgaWYgKGxpbmtfcmVjLT5jZmcuZW5jX21vZGUgPT0gQkNNT0xUX0VQT05fT0FNX0RQT0VfRU5DUllQVElPTl9NT0RFX1RFTl9CSSkKKyAgICB7CisgICAgICAgIF9kcG9lX2VhcF90bHNfY29tcHV0ZV9tYXN0ZXJfc2Vzc2lvbl9rZXkoJmxpbmtfcmVjLT5hdXRoX2N0cmwudHJhbnNfZGF0YSk7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKK3N0YXRpYyBiY21vc19ib29sIF9kcG9lX2VhcF90bHNfc2tpcF9sZW5ndGgoYmNtb2x0X2J1ZiAqYnVmLCB1aW50MzJfdCBza2lwLCB1aW50OF90KiogbGVuKQoreworICAgICpsZW4gPSBiY21vbHRfYnVmX3NuYXBfZ2V0KGJ1Zik7CisgICAgcmV0dXJuIGJjbW9sdF9idWZfc2tpcChidWYsIHNraXApOworfQorCitzdGF0aWMgYmNtb3NfYm9vbCBfZHBvZV9lYXBfdGxzX2luaXRfZWFwX2hkcigKKyAgICBkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsCisgICAgYmNtb2x0X2J1ZiAqYnVmLAorICAgIGVhcF9jb2RlIGNvZGUsCisgICAgZWFwX2xlbmd0aF9maWVsZHMgKmxmKQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihidWYgPT0gTlVMTCk7CisKKyAgICByZXR1cm4KKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhidWYsIGVhcG9sX2RzdF9tYWMpICYmCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfbWFjX2FkZHJlc3MoYnVmLCBsaW5rX3JlYy0+bmlfbWFjKSAmJgorICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3UxNl9iZShidWYsIEVUSEVSVFlQRV9FQVBPTCkgJiYKKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIEVBUE9MX1BST1RPQ09MX1ZFUlNJT05fRFBPRSkgJiYKKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIEVBUE9MX1RZUEVfUEFDS0VUKSAmJgorICAgICAgICAvKiBFYXBvbCBMZW5ndGggLSB3ZSByZS1jb21wdXRlIHRoaXMgYWZ0ZXIgYnVpbGRpbmcgdGhlIHBhY2tldCAqLworICAgICAgICBfZHBvZV9lYXBfdGxzX3NraXBfbGVuZ3RoKGJ1Ziwgc2l6ZW9mKHVpbnQxNl90KSwgJmxmLT5lYXBvbCkgJiYKKyAgICAgICAgLyogRUFQIGxheWVyIGhlYWRlcnMgKi8KKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIGNvZGUpICYmCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCBsaW5rX3JlYy0+YXV0aF9jdHJsLmN1cnJlbnRfcGFja2V0X2lkKyspICYmCisgICAgICAgIC8qIEVBUCBsZW5ndGggLSBhZ2FpbiwgY29tcHV0ZWQgd2hlbiB0aGUgcGFja2V0IGlzIHBhY2tlZCEgKi8KKyAgICAgICAgX2Rwb2VfZWFwX3Rsc19za2lwX2xlbmd0aChidWYsIHNpemVvZih1aW50MTZfdCksICZsZi0+ZWFwKTsKK30KKworc3RhdGljIGJjbW9zX2Jvb2wgX2Rwb2VfZWFwX3Rsc19pbml0X3Rsc19oZHIoYmNtb2x0X2J1ZiAqYnVmLCB1aW50OF90IGVhcFRsc0ZsYWdzLCBlYXBfbGVuZ3RoX2ZpZWxkcyAqbGYpCit7CisgICAgYmNtb3NfYm9vbCByYyA9IEJDTU9TX0ZBTFNFOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04oYnVmID09IE5VTEwpOworCisgICAgaWYgKGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCBFQVBfVFlQRV9UTFMpICYmCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCBlYXBUbHNGbGFncykpCisgICAgeworICAgICAgICBpZiAoKGVhcFRsc0ZsYWdzICYgRUFQX1RMU19GTEFHX0xFTkdUSF9CSVQpID09IEVBUF9UTFNfRkxBR19MRU5HVEhfQklUKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBFQVAtVExTIGxlbmd0aCAtIGNvbXB1dGVkIGF0IHBhY2sgY29tcGxldGlvbiBvbmx5IGFsbG9jYXRlIHJvb20gZm9yIHRoaXMgaWYgRWFwVGxzRmxhZ0xlbmd0aEJpdCBpcyBzZXQKKyAgICAgICAgICAgICAgIEJ1dCBpZiB0aGUgRWFwVGxzRmxhZ0xlbmd0aEJpdCBpcyBzZXQsIHdlIGFsc28gd3JpdGUgdGhlIFRMUyBSZWNvcmQgaGVhZGVyLiAqLworICAgICAgICAgICAgaWYgKF9kcG9lX2VhcF90bHNfc2tpcF9sZW5ndGgoYnVmLCBzaXplb2YodWludDMyX3QpLCAmbGYtPmVhcF90bHMpICYmCisgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIFRMU19IQU5EU0hBS0VfSUQpICYmCisgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIFRMU19NQUpPUl9WRVJTSU9OKSAmJgorICAgICAgICAgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCBUTFNfTUlOT1JfVkVSU0lPTikgJiYKKyAgICAgICAgICAgICAgICAvKiBBbm90aGVyIGxlbmd0aCBmaWVsZCwgdGhlIFRMUyByZWNvcmQgbGVuZ3RoICovCisgICAgICAgICAgICAgICAgX2Rwb2VfZWFwX3Rsc19za2lwX2xlbmd0aChidWYsIHNpemVvZih1aW50MTZfdCksICZsZi0+dGxzX3JlYykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmMgPSBCQ01PU19UUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBCQ01PU19UUlVFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBfZHBvZV9lYXBfdGxzX3BhY2tfaGFuZHNoYWtlX2xlbmd0aCgKKyAgICBkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsCisgICAgYmNtb2x0X2J1ZiAqYnVmLAorICAgIHVpbnQ4X3QgKnN0YXJ0LAorICAgIHVpbnQ4X3QgKmxlbikKK3sKKyAgICB1aW50MzJfdCByZWNfbGVuOworICAgIHVpbnQ4X3QgKmVuZDsKKworICAgIC8qIE5vdyBnbyBiYWNrIGFuZCBmaWxsIGluIHRoZSBsZW5ndGggZmllbGQuICBUaGlzIGlzIHRoZSBsZW5ndGggb2YgdGhlIFRsc0hhbmRzaGFrZSByZWNvcmQgKi8KKyAgICBlbmQgPSBiY21vbHRfYnVmX3NuYXBfZ2V0KGJ1Zik7CisgICAgcmVjX2xlbiA9IGVuZCAtIHN0YXJ0OworICAgIGJjbW9sdF9idWZfc25hcF9yZXN0b3JlKGJ1ZiwgbGVuKTsKKyAgICBiY21vbHRfYnVmX3dyaXRlX3UyNChidWYsIHVpbnQzMl90b18yNChyZWNfbGVuIC0gVExTX0hBTkRTSEFLRV9TSVpFKSk7CisgICAgYmNtb2x0X2J1Zl9zbmFwX3Jlc3RvcmUoYnVmLCBlbmQpOworICAgIF9idWZmZXJfaGFzaF9kYXRhKGxpbmtfcmVjLCBzdGFydCwgcmVjX2xlbik7Cit9CisKK3N0YXRpYyBiY21vc19ib29sIF9kcG9lX2VhcF90bHNfcGFja19zZXJ2ZXJfaGVsbG9faHMoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCAqc3RhcnQ7CisgICAgdWludDhfdCAqbGVuOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGJ1ZiA9PSBOVUxMKTsKKworICAgIHN0YXJ0ID0gYmNtb2x0X2J1Zl9zbmFwX2dldChidWYpOworICAgIGlmIChiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgSFNfU0VSVkVSX0hFTExPKSAmJgorICAgICAgICAobGVuID0gYmNtb2x0X2J1Zl9zbmFwX2dldChidWYpLCBiY21vbHRfYnVmX3NraXAoYnVmLCBzaXplb2YodWludDI0X3QpKSkgJiYKKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIGxpbmtfcmVjLT5hdXRoX2N0cmwudmVyc2lvbi5tYWpvcikgJiYKKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIGxpbmtfcmVjLT5hdXRoX2N0cmwudmVyc2lvbi5taW5vcikgJiYKKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZShidWYsIGxpbmtfcmVjLT5hdXRoX2N0cmwudHJhbnNfZGF0YS5zZXJ2ZXJfcmFuZG9tLCBDT1VOVF9PRl9SQU5ET01fQllURVMpICYmCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCBDT1VOVF9PRl9SQU5ET01fQllURVMpICYmCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGUoYnVmLCBsaW5rX3JlYy0+YXV0aF9jdHJsLnRyYW5zX2RhdGEuc2VydmVyX3JhbmRvbSwgQ09VTlRfT0ZfUkFORE9NX0JZVEVTKSAmJgorCisgICAgICAgIC8qIENpcGhlciBTdWl0ZXMgLSB3ZSB3cml0ZSAwIGFzIHRoZSBsZW5ndGggb2YgdGhlIENpcGhlciBTdWl0ZXMKKyAgICAgICAgICAgU2hvcnQgY2lyY3VpdCBpZiB1c2luZyBwcmUtcmVsZWFzZSBhdXRoZW50aWNhdGlvbiAqLworICAgICAgICAoKGxpbmtfcmVjLT5hdXRoX2N0cmwudmVyc2lvbi5taW5vciA9PSAzKSB8fCBiY21vbHRfYnVmX3dyaXRlX3UxNl9iZShidWYsIDApKSAmJgorCisgICAgICAgIC8qIENvbXByZXNzaW9uTWV0aG9kcyBhbHNvIHdyaXRlIDAgYXMgdGhlIGxlbmd0aCAqLworICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgMCkpCisgICAgeworICAgICAgICBfZHBvZV9lYXBfdGxzX3BhY2tfaGFuZHNoYWtlX2xlbmd0aChsaW5rX3JlYywgYnVmLCBzdGFydCwgbGVuKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorICAgIHJldHVybiBCQ01PU19GQUxTRTsKK30KKworc3RhdGljIGJjbW9zX2Jvb2wgX2Rwb2VfZWFwX3Rsc19wYWNrX3NlcnZlcl9rZXlfZXhjaGFuZ2VfaHMoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCAqc3RhcnQ7CisgICAgdWludDhfdCAqbGVuOworICAgIHVpbnQ4X3QgcnNhX21vZHVsdXNbU0laRV9PRl9SU0FfTU9EVUxVU10gPSB7fTsKKyAgICB1aW50OF90IHJzYV9leHBvbmVudFtTSVpFX09GX1JTQV9FWFBPTkVOVF0gPSB7fTsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihidWYgPT0gTlVMTCk7CisKKyAgICAvKiBJZiBub3QgYmlkaXJlY3Rpb25hbCwganVzdCByZXR1cm4gQkNNT1NfVFJVRSAqLworICAgIGlmIChsaW5rX3JlYy0+Y2ZnLmVuY19tb2RlICE9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0VOQ1JZUFRJT05fTU9ERV9URU5fQkkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICAvKiBWZXJpZnkgdGhhdCB0aGUgbGVuZ3RoIG9mIHRoZSBwdWJsaWMga2V5IChtb2R1bHVzKSBvZiB0aGUgcHJpdmF0ZSBrZXkgbWF0Y2hlcyB0aGUgZXhwZWN0ZWQgbGVuZ3RoLiBBbHNvLCB2ZXJpZnkKKyAgICAgICB0aGF0IHRoZSBtb2R1bHVzIGlzIHN1Y2Nlc3NmdWxseSByZWFkIGZyb20gdGhlIFJTQSBrZXkuICovCisgICAgc3RhcnQgPSBiY21vbHRfYnVmX3NuYXBfZ2V0KGJ1Zik7CisgICAgaWYgKChkcG9lX3NlY19yc2FfcHVibGljX2dldChsaW5rX3JlYy0+YXV0aF9jdHJsLnRyYW5zX2RhdGEucnNhLCByc2FfbW9kdWx1cywgcnNhX2V4cG9uZW50KSkgJiYKKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIEhTX1NFUlZFUl9LRVlfRVhDSEFOR0UpICYmCisgICAgICAgIChsZW4gPSBiY21vbHRfYnVmX3NuYXBfZ2V0KGJ1ZiksIGJjbW9sdF9idWZfc2tpcChidWYsIHNpemVvZih1aW50MjRfdCkpKSAmJgorICAgICAgICBiY21vbHRfYnVmX3dyaXRlKGJ1ZiwgcnNhX21vZHVsdXMsIHNpemVvZihyc2FfbW9kdWx1cykpICYmCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGUoYnVmLCByc2FfZXhwb25lbnQsIHNpemVvZihyc2FfZXhwb25lbnQpKSkKKyAgICB7CisgICAgICAgIF9kcG9lX2VhcF90bHNfcGFja19oYW5kc2hha2VfbGVuZ3RoKGxpbmtfcmVjLCBidWYsIHN0YXJ0LCBsZW4pOworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworfQorCitzdGF0aWMgYmNtb3NfYm9vbCBfZHBvZV9lYXBfdGxzX3BhY2tfY2VydF9yZXFfaHMoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDhfdCAqc3RhcnQ7CisgICAgdWludDhfdCAqbGVuOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGJ1ZiA9PSBOVUxMKTsKKworICAgIHN0YXJ0ID0gYmNtb2x0X2J1Zl9zbmFwX2dldChidWYpOworICAgIGlmIChiY21vbHRfYnVmX3dyaXRlX3U4KGJ1ZiwgSFNfQ0VSVElGSUNBVEVfUkVRVUVTVCkgJiYKKyAgICAgICAgKGxlbiA9IGJjbW9sdF9idWZfc25hcF9nZXQoYnVmKSwgYmNtb2x0X2J1Zl9za2lwKGJ1Ziwgc2l6ZW9mKHVpbnQyNF90KSkpICYmCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCAxKSAmJiAvKiBsZW5ndGggb2YgJ0NlcnRpZmljYXRlIFR5cGUnICovCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCBSU0FfU0lHTikgJiYgLyogQ2VydGlmaWNhdGUgVHlwZSAqLworICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3UxNl9iZShidWYsIDApKSAvKiB6ZXJvIGxlbmd0aCBmb3IgY2VydCBhdXRob3JpdGllcyAqLworICAgIHsKKyAgICAgICAgX2Rwb2VfZWFwX3Rsc19wYWNrX2hhbmRzaGFrZV9sZW5ndGgobGlua19yZWMsIGJ1Ziwgc3RhcnQsIGxlbik7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKyAgICByZXR1cm4gQkNNT1NfRkFMU0U7Cit9CisKK3N0YXRpYyBiY21vc19ib29sIF9kcG9lX2VhcF90bHNfcGFja19zZXJ2ZXJfaGVsbG9fZG9uZV9ocyhkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90ICpzdGFydDsKKyAgICB1aW50OF90ICpsZW47CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04oYnVmID09IE5VTEwpOworCisgICAgc3RhcnQgPSBiY21vbHRfYnVmX3NuYXBfZ2V0KGJ1Zik7CisgICAgaWYgKGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCBIU19TRVJWRVJfSEVMTE9fRE9ORSkgJiYKKyAgICAgICAgKGxlbiA9IGJjbW9sdF9idWZfc25hcF9nZXQoYnVmKSwgYmNtb2x0X2J1Zl9za2lwKGJ1Ziwgc2l6ZW9mKHVpbnQyNF90KSkpKQorICAgIHsKKyAgICAgICAgX2Rwb2VfZWFwX3Rsc19wYWNrX2hhbmRzaGFrZV9sZW5ndGgobGlua19yZWMsIGJ1Ziwgc3RhcnQsIGxlbik7CisgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgIH0KKyAgICByZXR1cm4gQkNNT1NfRkFMU0U7Cit9CisKK3N0YXRpYyBiY21vc19ib29sIF9kcG9lX2VhcF90bHNfcGFja19maW5pc2hlZF9ocyhkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICB1aW50OF90ICpzdGFydDsKKyAgICB1aW50OF90ICpsZW47CisKKyAgICBzdGFydCA9IGJjbW9sdF9idWZfc25hcF9nZXQoYnVmKTsKKyAgICBpZiAoYmNtb2x0X2J1Zl93cml0ZV91OChidWYsIEhTX0ZJTklTSEVEKSAmJgorICAgICAgICAobGVuID0gYmNtb2x0X2J1Zl9zbmFwX2dldChidWYpLCBiY21vbHRfYnVmX3NraXAoYnVmLCBzaXplb2YodWludDI0X3QpKSkpCisgICAgeworICAgICAgICBfZHBvZV9lYXBfdGxzX3BhY2tfaGFuZHNoYWtlX2xlbmd0aChsaW5rX3JlYywgYnVmLCBzdGFydCwgbGVuKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgfQorICAgIHJldHVybiBCQ01PU19GQUxTRTsKK30KKworc3RhdGljIGJjbW9zX2Jvb2wgX2Rwb2VfZWFwX3Rsc19wYWNrX21zZ19sZW5ndGhzKGJjbW9sdF9idWYgKmJ1ZiwgdWludDhfdCBlYXBfdGxzX2ZsYWdzLCBlYXBfbGVuZ3RoX2ZpZWxkcyAqbGYpCit7CisgICAgdWludDE2X3QgZWFwb2xfbGVuZ3RoOworICAgIHVpbnQzMl90IGVhcF90bHNfbGVuZ3RoOworICAgIHVpbnQ4X3QgKnNuYXAgPSBiY21vbHRfYnVmX3NuYXBfZ2V0KGJ1Zik7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihidWYgPT0gTlVMTCk7CisgICAgQlVHX09OKGxmID09IE5VTEwpOworCisgICAgZWFwb2xfbGVuZ3RoID0gYmNtb2x0X2J1Zl9nZXRfdXNlZChidWYpIC0gRUFQT0xfTVNHX0hEUl9TSVpFOworCisgICAgLyogU2VlbXMgb2RkIHRoYXQgdGhlc2UgdHdvIHdvdWxkIGJlIHRoZSBzYW1lLiBCdXQgZWFwb2xMZW5ndGggaXMgZGVmaW5lZCBhcyB0aGUgbGVuZ3RoIG9mIHRoZSBib2R5IGZpZWxkcyBvZiB0aGUKKyAgICAgICBFYXBvbCBidWZmZXIsIHdoaWNoIGRvZXMgbm90IGluY2x1ZGUgdGhlIEVhcG9sIGhlYWRlci4gRUFQIGlzIGRpZmZlcmVudCwgdGhlIEVBUCBsZW5ndGggaXMgZGVmaW5lIHRvIGluY2x1ZGUgdGhlCisgICAgICAgZW50aXJlIEVBUCBwYWNrZXQsIGluY2x1ZGluZyB0aGUgaGVhZGVyLiAqLworICAgIGJjbW9sdF9idWZfc25hcF9yZXN0b3JlKGJ1ZiwgbGYtPmVhcG9sKTsKKyAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTE2X2JlKGJ1ZiwgZWFwb2xfbGVuZ3RoKSkKKyAgICB7CisgICAgICAgIGJjbW9sdF9idWZfc25hcF9yZXN0b3JlKGJ1Ziwgc25hcCk7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICBiY21vbHRfYnVmX3NuYXBfcmVzdG9yZShidWYsIGxmLT5lYXApOworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTZfYmUoYnVmLCBlYXBvbF9sZW5ndGgpKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2J1Zl9zbmFwX3Jlc3RvcmUoYnVmLCBzbmFwKTsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmICgoZWFwX3Rsc19mbGFncyAmIEVBUF9UTFNfRkxBR19MRU5HVEhfQklUKSA9PSBFQVBfVExTX0ZMQUdfTEVOR1RIX0JJVCkKKyAgICB7CisgICAgICAgIC8qIFRoZSBUTFMgbWVzc2FnZSBsZW5ndGggLSB0YWtlIGF3YXkgdGhlIEVhcFRsc0hkciwgQU5EIHRoZSBFYXBNc2dIZHIgd2hpY2gsIHN1cnByaXNpbmdseSB3YXMgbm90IHJlbW92ZWQgaW4KKyAgICAgICAgICAgdGhlIHByZXZpb3VzIHN0ZXAuICovCisgICAgICAgIGVhcF90bHNfbGVuZ3RoID0gZWFwb2xfbGVuZ3RoIC0gKEVBUF9GUkFNRV9TSVpFICsgRUFQX1RMU19IRFJfU0laRSArIHNpemVvZih1aW50MzJfdCkpOworCisgICAgICAgIGJjbW9sdF9idWZfc25hcF9yZXN0b3JlKGJ1ZiwgbGYtPmVhcF90bHMpOworICAgICAgICBpZiAoIWJjbW9sdF9idWZfd3JpdGVfdTMyX2JlKGJ1ZiwgZWFwX3Rsc19sZW5ndGgpKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfYnVmX3NuYXBfcmVzdG9yZShidWYsIHNuYXApOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgYmNtb2x0X2J1Zl9zbmFwX3Jlc3RvcmUoYnVmLCBsZi0+dGxzX3JlYyk7CisgICAgICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91MTZfYmUoYnVmLCAodWludDE2X3QpZWFwX3Rsc19sZW5ndGggLSBUTFNfUkVDT1JEX0hEUl9TSVpFKSkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2J1Zl9zbmFwX3Jlc3RvcmUoYnVmLCBzbmFwKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJjbW9sdF9idWZfc25hcF9yZXN0b3JlKGJ1Ziwgc25hcCk7CisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfZHBvZV9lYXBfdGxzX3BhY2tfc3RhcnQoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX05PTUVNOworICAgIHVpbnQ4X3QgZmxhZ3MgPSBFQVBfVExTX0ZMQUdfU1RBUlRfQklUOworICAgIGVhcF9sZW5ndGhfZmllbGRzIGxmOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGJ1ZiA9PSBOVUxMKTsKKworICAgIGlmIChfZHBvZV9lYXBfdGxzX2luaXRfZWFwX2hkcihsaW5rX3JlYywgYnVmLCBFQVBfQ09ERV9SRVFVRVNULCAmbGYpICYmCisgICAgICAgIF9kcG9lX2VhcF90bHNfaW5pdF90bHNfaGRyKGJ1ZiwgZmxhZ3MsICZsZikgJiYKKyAgICAgICAgX2Rwb2VfZWFwX3Rsc19wYWNrX21zZ19sZW5ndGhzKGJ1ZiwgZmxhZ3MsICZsZikpCisgICAgeworICAgICAgICByYyA9IEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgYmNtb3NfYm9vbCBfZHBvZV9lYXBfdGxzX3NlbmRfY2VydF9yZXF1ZXN0KGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYykKK3sKKyAgICBiY21vc19ib29sIHJjID0gQkNNT1NfRkFMU0U7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9idWYgYnVmOworICAgIHVpbnQ4X3QgKm1zZyA9IE5VTEw7CisgICAgZWFwX2xlbmd0aF9maWVsZHMgbGY7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKworICAgIG1zZyA9IGJjbW9zX2NhbGxvYyhFQVBPTF9QS1RfU0laRSk7CisgICAgaWYgKG1zZyA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIC8qIEluaXRpYWxpemUgdGhlIG1heGltdW0gc3VwcG9ydGVkIGxlbmd0aCBFQVAtVExTIG1lc3NhZ2UgYnVmZmVyLiBUaGUgdmFyaW91cyBUTFMgcmVjb3JkcyBjb250YWluZWQgaW4gYW4gRUFQLVRMUworICAgICAgIG1lc3NhZ2UgYXJlIHZhcmlhYmxlIHNpemUuIEhvd2V2ZXIsIHRoaXMgY2FuIG9ubHkgYmUgYSBjb21iaW5lZCBtYXhpbXVtIGxlbmd0aC4gKi8KKyAgICBiY21vbHRfYnVmX2luaXQoJmJ1ZiwgRUFQT0xfUEtUX1NJWkUsIG1zZywgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpOworICAgIGlmIChfZHBvZV9lYXBfdGxzX2luaXRfZWFwX2hkcihsaW5rX3JlYywgJmJ1ZiwgRUFQX0NPREVfUkVRVUVTVCwgJmxmKSAmJgorICAgICAgICBfZHBvZV9lYXBfdGxzX2luaXRfdGxzX2hkcigmYnVmLCBFQVBfVExTX0ZMQUdfTEVOR1RIX0JJVCwgJmxmKSkKKyAgICB7CisgICAgICAgIC8qIFRoZSBDZXJ0IHJlcXVlc3QgY29udGFpbnMgMyBvciA0IFRMUyByZWNvcmRzICgzIGZvciBEUy1vbmx5IGFuZCA0IGZvciBiaS1kaXJlY3Rpb25hbCkuIFRoZSBUTFMgcmVjb3JkcyBhcmUKKyAgICAgICAgICAgb3JkZXJlZCBhczoKKyAgICAgICAgICAgLSBTZXJ2ZXIgSGVsbG8KKyAgICAgICAgICAgLSBTZXJ2ZXIgS2V5IEV4Y2hhbmdlIChpZiBiaS1kaXJlY3Rpb25hbCkKKyAgICAgICAgICAgLSBDZXJ0aWZpY2F0ZSBSZXF1ZXN0CisgICAgICAgICAgIC0gU2VydmVyIEhlbGxvIERvbmUgKi8KKyAgICAgICAgaWYgKF9kcG9lX2VhcF90bHNfcGFja19zZXJ2ZXJfaGVsbG9faHMobGlua19yZWMsICZidWYpICYmCisgICAgICAgICAgICBfZHBvZV9lYXBfdGxzX3BhY2tfc2VydmVyX2tleV9leGNoYW5nZV9ocyhsaW5rX3JlYywgJmJ1ZikgJiYKKyAgICAgICAgICAgIF9kcG9lX2VhcF90bHNfcGFja19jZXJ0X3JlcV9ocyhsaW5rX3JlYywgJmJ1ZikgJiYKKyAgICAgICAgICAgIF9kcG9lX2VhcF90bHNfcGFja19zZXJ2ZXJfaGVsbG9fZG9uZV9ocyhsaW5rX3JlYywgJmJ1ZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9kcG9lX2VhcF90bHNfcGFja19tc2dfbGVuZ3RocygmYnVmLCBFQVBfVExTX0ZMQUdfTEVOR1RIX0JJVCwgJmxmKTsKKworICAgICAgICAgICAgLyogU2VuZCB0aGUgbWVzc2FnZSAqLworICAgICAgICAgICAgZXJyID0gZHBvZV9zZWNfc2VuZF9lYXBvbChsaW5rX3JlYy0+ZGV2aWNlLCAmbGlua19yZWMtPmtleSwgbXNnLCBiY21vbHRfYnVmX2dldF91c2VkKCZidWYpKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21vc19mcmVlKG1zZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBBdXRoZW50aWNhdGlvbiBoYXMgYmVndW4uICovCisgICAgICAgICAgICBsaW5rX3JlYy0+YXV0aF9jdHJsLm9udV9hdXRoX3N0YXRlID0gRFBPRV9PTlVfQVVUSF9TVEFURV9FQVBfU1RBUlQ7CisgICAgICAgICAgICByYyA9IEJDTU9TX1RSVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBGcmVlIHRoZSBtZXNzYWdlLiAqLworICAgIGJjbW9zX2ZyZWUobXNnKTsKKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9kcG9lX2VhcF90bHNfc2VuZF9maW5pc2hlZF9ocyhkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09WRVJGTE9XOworICAgIGJjbW9sdF9idWYgYnVmOworICAgIHVpbnQ4X3QgKm1zZyA9IE5VTEw7CisgICAgZWFwX2xlbmd0aF9maWVsZHMgbGY7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKworICAgIG1zZyA9IGJjbW9zX2NhbGxvYyhFQVBPTF9QS1RfU0laRSk7CisgICAgaWYgKG1zZyA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgRUFQLVRMUyBtZXNzYWdlIGJ1ZmZlci4gKi8KKyAgICBiY21vbHRfYnVmX2luaXQoJmJ1ZiwgRUFQT0xfUEtUX1NJWkUsIG1zZywgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpOworICAgIGlmIChfZHBvZV9lYXBfdGxzX2luaXRfZWFwX2hkcihsaW5rX3JlYywgJmJ1ZiwgRUFQX0NPREVfUkVRVUVTVCwgJmxmKSAmJgorICAgICAgICBfZHBvZV9lYXBfdGxzX2luaXRfdGxzX2hkcigmYnVmLCBFQVBfVExTX0ZMQUdfTEVOR1RIX0JJVCwgJmxmKSAmJgorICAgICAgICBfZHBvZV9lYXBfdGxzX3BhY2tfZmluaXNoZWRfaHMobGlua19yZWMsICZidWYpKQorICAgIHsKKyAgICAgICAgX2Rwb2VfZWFwX3Rsc19wYWNrX21zZ19sZW5ndGhzKCZidWYsIEVBUF9UTFNfRkxBR19MRU5HVEhfQklULCAmbGYpOworICAgICAgICAvKiBObyBlcnJvciBkZXRlY3Rpb24gaGVyZS4gV2UgaGF2ZSBhbHJlYWR5IGF1dGhlbnRpY2F0ZWQuIHRoaXMgbWVzc2FnZSBpcyBqdXN0IGZvciBzdGFuZGFyZHMgY29tcGxpYW5jZSAqLworICAgICAgICByYyA9IGRwb2Vfc2VjX3NlbmRfZWFwb2wobGlua19yZWMtPmRldmljZSwgJmxpbmtfcmVjLT5rZXksIG1zZywgYmNtb2x0X2J1Zl9nZXRfdXNlZCgmYnVmKSk7CisgICAgfQorCisgICAgLyogRnJlZSB0aGUgbWVzc2FnZS4gKi8KKyAgICBiY21vc19mcmVlKG1zZyk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfZHBvZV9lYXBfdGxzX3NlbmRfcmVzdWx0KGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgZWFwX2NvZGUgcmVzdWx0KQoreworICAgIHVpbnQ4X3QgKm1zZzsKKyAgICBiY21vbHRfYnVmIGJ1ZjsKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfSU5URVJOQUw7CisgICAgZWFwX2xlbmd0aF9maWVsZHMgbGY7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworCisgICAgbXNnID0gYmNtb3NfY2FsbG9jKEVBUE9MX1BLVF9TSVpFKTsKKyAgICBpZiAobXNnID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICB9CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBFQVAtVExTIG1lc3NhZ2UgYnVmZmVyLiAqLworICAgIGJjbW9sdF9idWZfaW5pdCgmYnVmLCBFQVBPTF9QS1RfU0laRSwgbXNnLCBCQ01PTFRfQlVGX0VORElBTl9GSVhFRCk7CisgICAgLyogRW5jb2RlIHRoZSBFQVAtU3VjY2VzcyBtZXNzYWdlIHRvIHRoZSBidWZmZXIuICovCisgICAgaWYgKF9kcG9lX2VhcF90bHNfaW5pdF9lYXBfaGRyKGxpbmtfcmVjLCAmYnVmLCByZXN1bHQsICZsZikgJiYKKyAgICAgICAgX2Rwb2VfZWFwX3Rsc19wYWNrX21zZ19sZW5ndGhzKCZidWYsIDAsICZsZikpCisgICAgeworICAgICAgICByYyA9IGRwb2Vfc2VjX3NlbmRfZWFwb2wobGlua19yZWMtPmRldmljZSwgJmxpbmtfcmVjLT5rZXksIG1zZywgYmNtb2x0X2J1Zl9nZXRfdXNlZCgmYnVmKSk7CisgICAgfQorCisgICAgYmNtb3NfZnJlZShtc2cpOworCisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgYmNtb3NfYm9vbCBfZHBvZV9lYXBfdGxzX3BhcnNlX2NlcnRpZmljYXRlKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIGJjbW9zX2Jvb2wgICAgICAgICAgICByYyA9IEJDTU9TX0ZBTFNFOworICAgIHVpbnQyNF90IGxlbmd0aDsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihidWYgPT0gTlVMTCk7CisKKyAgICBsaW5rX3JlYy0+YXV0aF9jdHJsLmNlcnRpZmljYXRlID0gYmNtb3NfY2FsbG9jKEVBUE9MX1BLVF9TSVpFKTsKKyAgICBpZiAobGlua19yZWMtPmF1dGhfY3RybC5jZXJ0aWZpY2F0ZSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIGlmIChiY21vbHRfYnVmX3JlYWRfdTI0KGJ1ZiwgJmxlbmd0aCkgJiYKKyAgICAgICAgKChsaW5rX3JlYy0+YXV0aF9jdHJsLmNlcnRMZW4gPSAodWludDE2X3QpdWludDI0X3RvXzMyKGxlbmd0aCkpLCAobGlua19yZWMtPmF1dGhfY3RybC5jZXJ0TGVuIDw9IEVBUE9MX1BLVF9TSVpFKSkgJiYKKyAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKGJ1ZiwgbGlua19yZWMtPmF1dGhfY3RybC5jZXJ0aWZpY2F0ZSwgbGlua19yZWMtPmF1dGhfY3RybC5jZXJ0TGVuKSkKKyAgICB7CisgICAgICAgIHJjID0gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBiY21vc19ib29sIF9kcG9lX2VhcF90bHNfcGFyc2VfY2xpZW50X2tleV9leGNoYW5nZShkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBiY21vc19ib29sIHJjID0gQkNNT1NfRkFMU0U7CisgICAgdWludDE2X3QgbGVuZ3RoOworICAgIHVpbnQ4X3QgZW5jcnlwdGVkX2J1ZltTSVpFX09GX1JTQV9FTkNSWVBURURfQkxPQ0tdID0ge307CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04oYnVmID09IE5VTEwpOworCisgICAgaWYgKGJjbW9sdF9idWZfcmVhZF91MTZfYmUoYnVmLCAmbGVuZ3RoKSAmJgorICAgICAgICAobGVuZ3RoID09IChTSVpFX09GX1JTQV9FTkNSWVBURURfQkxPQ0spKSAmJgorICAgICAgICBiY21vbHRfYnVmX3JlYWQoYnVmLCBlbmNyeXB0ZWRfYnVmLCBzaXplb2YoZW5jcnlwdGVkX2J1ZikpKQorICAgIHsKKyAgICAgICAgaW50IHZhbDsKKworICAgICAgICB2YWwgPSBkcG9lX3NlY19yc2FfcHJpdmF0ZV9kZWNyeXB0KAorICAgICAgICAgICAgc2l6ZW9mKGVuY3J5cHRlZF9idWYpLAorICAgICAgICAgICAgZW5jcnlwdGVkX2J1ZiwKKyAgICAgICAgICAgIGxpbmtfcmVjLT5hdXRoX2N0cmwudHJhbnNfZGF0YS5wcmVfbWFzdGVyX3NlY3JldCwKKyAgICAgICAgICAgIGxpbmtfcmVjLT5hdXRoX2N0cmwudHJhbnNfZGF0YS5yc2EpOworCisgICAgICAgIGlmICh2YWwgPT0gU0laRV9PRl9QUkVfTUFTVEVSX1NFQ1JFVCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogV2Ugbm93IG5lZWQgdGhlIHNlY3VyaXR5IGRhdGEgLSB3ZSBoYXZlIHRoZSAiY2xpZW50IHJhbmRvbSIsICJzZXJ2ZXIgcmFuZG9tIiwgYW5kICJwcmUgbWFzdGVyIHNlY3JldCIuICovCisgICAgICAgICAgICBfZHBvZV9lYXBfdGxzX3ByZXBhcmVfc2VjdXJpdHlfZGF0YShsaW5rX3JlYyk7CisgICAgICAgICAgICByYyA9IEJDTU9TX1RSVUU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBEUE9FX1NFQ19MSU5LX0xPRyhFUlJPUiwgbGlua19yZWMsICJSU0EgZGVjcnlwdCBwcmUtbWFzdGVyIHNlY3JldCBmYWlsZWQ6ICVkXG4iLCB2YWwpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIERQT0VfU0VDX0xJTktfTE9HKEVSUk9SLCBsaW5rX3JlYywgIkZhaWxlZCB0byBwYXJzZSBjbGllbnQga2V5IGV4Y2hhbmdlOiAldVxuIiwgbGVuZ3RoKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBiY21vc19ib29sIF9kcG9lX2VhcF90bHNfcGFyc2VfY2VydF92ZXJpZnkoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgdWludDE2X3QgbGVuZ3RoOworICAgIGJjbW9zX2Jvb2wgcmV0ID0gQkNNT1NfRkFMU0U7CisKKyAgICBpZiAoYmNtb2x0X2J1Zl9yZWFkX3UxNl9iZShidWYsICZsZW5ndGgpICYmCisgICAgICAgIChsZW5ndGggPD0gKDIgKiBTSVpFX09GX1JTQV9FTkNSWVBURURfQkxPQ0spKSkKKyAgICB7CisgICAgICAgIGJjbW9sdF9idWYgY2VydF9idWY7CisgICAgICAgIHVpbnQyNF90IHRlbXA7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmNlcnQ7CisgICAgICAgIHVpbnQzMl90IGNlcnRfbGVuID0gMDsKKyAgICAgICAgdWludDhfdCBjZXJ0X3ZlcmlmeVtzaXplb2YoZHBvZV9zZWNfc2hhMV9kaWdlc3QpICsgc2l6ZW9mKGRwb2Vfc2VjX21kNV9kaWdlc3QpXTsKKyAgICAgICAgdWludDhfdCAqZW5jX2J1ZjsKKyAgICAgICAgZHBvZV9zZWNfcnNhX2tleSAqcnNhOworCisgICAgICAgIGJjbW9sdF9idWZfaW5pdCgmY2VydF9idWYsIGxpbmtfcmVjLT5hdXRoX2N0cmwuY2VydExlbiwgbGlua19yZWMtPmF1dGhfY3RybC5jZXJ0aWZpY2F0ZSwgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpOworCisgICAgICAgIC8qIEdldCB0aGUgcG9pbnRlciB0byB0aGUgT05VIGNlcnQgYW5kIGl0cyBsZW5ndGggKi8KKyAgICAgICAgYmNtb2x0X2J1Zl9yZWFkX3UyNCgmY2VydF9idWYsICZ0ZW1wKTsKKyAgICAgICAgY2VydF9sZW4gPSB1aW50MjRfdG9fMzIodGVtcCk7CisgICAgICAgIGNlcnQgPSBiY21vbHRfYnVmX3NuYXBfZ2V0KCZjZXJ0X2J1Zik7CisKKyAgICAgICAgZW5jX2J1ZiA9IGJjbW9sdF9idWZfc25hcF9nZXQoYnVmKTsKKyAgICAgICAgYmNtb2x0X2J1Zl9za2lwKGJ1ZiwgbGVuZ3RoKTsKKworICAgICAgICAvKiBHZXQgdGhlIHB1YmxpYyBrZXkgZnJvbSB0aGUgT05VIGNlcnQuICovCisgICAgICAgIHJzYSA9IGRwb2Vfc2VjX3g1MDlfcHViX2tleV9nZXQoY2VydCwgY2VydF9sZW4pOworCisgICAgICAgIC8qIGRlY3J5cHQgdGhlIHJlbWFpbmRlciBvZiB0aGUgYnVmIHdpdGggdGhlIE9OVSBjZXJ0LiAqLworICAgICAgICBpZiAocnNhICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChkcG9lX3NlY19yc2FfcHVibGljX2RlY3J5cHQobGVuZ3RoLCBlbmNfYnVmLCBjZXJ0X3ZlcmlmeSwgcnNhKSA+PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFJTQV9zaXplKCkgcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgbW9kdWx1cyBpbiBieXRlcy4gQ29udmVydCB0byBiaXRzLiAqLworICAgICAgICAgICAgICAgIGxpbmtfcmVjLT5hdXRoX2N0cmwub251X2NlcnRfa2V5X3NpemUgPSBkcG9lX3NlY19yc2Ffc2l6ZShyc2EpICogODsKKworICAgICAgICAgICAgICAgIC8qIENvbXBhcmUgdGhlIG91dHB1dCAoc2hvdWxkIGJlIDM2IGJ5dGVzKSB0byBzaGExL21kNSBtZXNzYWdlcyBkaWdlc3RzIElmIHRoZXkgbWF0Y2gsIHdlIGFyZSBnb29kICovCisgICAgICAgICAgICAgICAgaWYgKChtZW1jbXAoJmNlcnRfdmVyaWZ5WzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtfcmVjLT5hdXRoX2N0cmwudHJhbnNfZGF0YS5tZDVfZGlnZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihkcG9lX3NlY19tZDVfZGlnZXN0KSkgPT0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKG1lbWNtcCgmY2VydF92ZXJpZnlbc2l6ZW9mKGRwb2Vfc2VjX21kNV9kaWdlc3QpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rX3JlYy0+YXV0aF9jdHJsLnRyYW5zX2RhdGEuc2hhMV9kaWdlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGRwb2Vfc2VjX3NoYTFfZGlnZXN0KSkgPT0gMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiY21vbHRfYnVmX2luaXQoJmNlcnRfYnVmLCBsaW5rX3JlYy0+YXV0aF9jdHJsLmNlcnRMZW4sIGxpbmtfcmVjLT5hdXRoX2N0cmwuY2VydGlmaWNhdGUsIEJDTU9MVF9CVUZfRU5ESUFOX0ZJWEVEKTsKKworICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIHBvaW50ZXIgdG8gdGhlIE9OVSBjZXJ0aWZpY2F0ZS4gKi8KKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkX3UyNCgmY2VydF9idWYsICZ0ZW1wKTsKKyAgICAgICAgICAgICAgICAgICAgbGlua19yZWMtPmF1dGhfY3RybC5vbnVfY2VydF9sZW4gPSB1aW50MjRfdG9fMzIodGVtcCk7CisgICAgICAgICAgICAgICAgICAgIGxpbmtfcmVjLT5hdXRoX2N0cmwub251X2NlcnQgPSBiY21vbHRfYnVmX3NuYXBfZ2V0KCZjZXJ0X2J1Zik7CisKKyAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2J1Zl9za2lwKCZjZXJ0X2J1ZiwgbGlua19yZWMtPmF1dGhfY3RybC5vbnVfY2VydF9sZW4pOworCisgICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgcG9pbnRlciB0byB0aGUgTWFudWZhY3R1cmVyIENBIGNlcnRpZmljYXRlLiAqLworICAgICAgICAgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWRfdTI0KCZjZXJ0X2J1ZiwgJnRlbXApOworICAgICAgICAgICAgICAgICAgICBsaW5rX3JlYy0+YXV0aF9jdHJsLm1mZ19jZXJ0X2xlbiA9IHVpbnQyNF90b18zMih0ZW1wKTsKKyAgICAgICAgICAgICAgICAgICAgbGlua19yZWMtPmF1dGhfY3RybC5tZmdfY2VydCA9IGJjbW9sdF9idWZfc25hcF9nZXQoJmNlcnRfYnVmKTsKKworICAgICAgICAgICAgICAgICAgICByZXQgPSBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEUE9FX1NFQ19MSU5LX0xPRyhFUlJPUiwgbGlua19yZWMsICJDZXJ0IFZlcmlmeSBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEUE9FX1NFQ19MSU5LX0xPRyhFUlJPUiwgbGlua19yZWMsICJSU0EgcHVibGljIGRlY3J5cHQvdmVyaWZ5IGZhaWxlZFxuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBEUE9FX1NFQ19MSU5LX0xPRyhFUlJPUiwgbGlua19yZWMsICJGYWlsZWQgdG8gcmV0cmlldmUgUlNBIGtleVxuIik7CisgICAgICAgIH0KKworICAgICAgICBkcG9lX3NlY19yc2Ffa2V5X2ZyZWUocnNhKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgYmNtb3NfYm9vbCBfZHBvZV9lYXBfdGxzX3BhcnNlX3ZlcmlmeV9kYXRhKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYykKK3sKKyAgICBiY21vc19ib29sIHJjID0gQkNNT1NfRkFMU0U7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKworICAgIGlmIChsaW5rX3JlYy0+YXV0aF9jdHJsLnZlcnNpb24ubWlub3IgPT0gVExTX01JTk9SX1ZFUlNJT04pCisgICAgeworICAgICAgICAvKiBUaGlzIHZlcnNpb24gb2YgYXV0aGVudGljYXRpb24gZG9lcyBub3QgcGFyc2UgdmVyaWZ5IGRhdGEgKi8KKyAgICAgICAgcmMgPSBCQ01PU19UUlVFOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBiY21vc19ib29sIF9kcG9lX2VhcF90bHNfcGFyc2VfY2xpZW50X2hlbGxvKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgYmNtb2x0X2J1ZiAqYnVmKQoreworICAgIHRsc19wcm90b2NvbF92ZXJzaW9uIHZlcnNpb247CisgICAgdGxzX3Nlc3Npb25faWQgc2Vzc2lvbl9pZDsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihidWYgPT0gTlVMTCk7CisKKyAgICBpZiAoYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnZlcnNpb24ubWFqb3IpICYmCisgICAgICAgICh2ZXJzaW9uLm1ham9yID09IFRMU19NQUpPUl9WRVJTSU9OKSAmJgorICAgICAgICBiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmdmVyc2lvbi5taW5vcikgJiYKKyAgICAgICAgKHZlcnNpb24ubWlub3IgPj0gVExTX01JTk9SX1ZFUlNJT04pICYmCisgICAgICAgIGJjbW9sdF9idWZfcmVhZChidWYsIGxpbmtfcmVjLT5hdXRoX2N0cmwudHJhbnNfZGF0YS5jbGllbnRfcmFuZG9tLCBDT1VOVF9PRl9SQU5ET01fQllURVMpICYmCisgICAgICAgIGJjbW9sdF9idWZfcmVhZF91OChidWYsICZzZXNzaW9uX2lkLmxlbmd0aCkgJiYKKyAgICAgICAgKHNlc3Npb25faWQubGVuZ3RoIDw9IHNpemVvZihzZXNzaW9uX2lkLnNlc3Npb25faWQpKSAmJgorICAgICAgICBiY21vbHRfYnVmX3JlYWQoYnVmLCBzZXNzaW9uX2lkLnNlc3Npb25faWQsIHNlc3Npb25faWQubGVuZ3RoKSkKKyAgICB7CisgICAgICAgIGNvbXByZXNzaW9uX21ldGhvZHMgY29tcF9tZXRob2RzOworICAgICAgICB1aW50MTZfdCB0bHZMZW47CisgICAgICAgIHVpbnQ4X3QgY2lwaGVyX3N1aXRlc1syXTsKKyAgICAgICAgdWludDhfdCAqY21fc25hcCA9IGJjbW9sdF9idWZfc25hcF9nZXQoYnVmKTsKKworICAgICAgICBtZW1zZXQoJmNvbXBfbWV0aG9kcywgMCwgc2l6ZW9mKGNvbXBfbWV0aG9kcykpOworCisgICAgICAgIC8qIENpcGhlciBTdWl0ZXMgbWF5IGJlIHByZXNlbnQgLWlmIHNvIHBhcnNlIG92ZXIgaXQgYW5kIGl0IHdpbGwgYmUgaWdub3JlZC4gU3RpbGwgY2hlY2sgdGhhdCBjb21wIG1ldGhvZHMgaXMKKyAgICAgICAgICAgTlVMTCAqLworICAgICAgICBpZiAoYmNtb2x0X2J1Zl9yZWFkX3UxNl9iZShidWYsICZ0bHZMZW4pICYmIC8qIENpcGhlciBTdWl0ZXMgKi8KKyAgICAgICAgICAgICh0bHZMZW4gPD0gc2l6ZW9mKHVpbnQxNl90KSkgJiYKKyAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZChidWYsIGNpcGhlcl9zdWl0ZXMsIHRsdkxlbikgJiYKKyAgICAgICAgICAgIGJjbW9sdF9idWZfcmVhZF91OChidWYsICZjb21wX21ldGhvZHMubGVuZ3RoKSAmJiAvKiBDb21wcmVzc2lvbiBNZXRob2RzICovCisgICAgICAgICAgICAoY29tcF9tZXRob2RzLmxlbmd0aCA9PSBzaXplb2YoY29tcF9tZXRob2RzLmNvbXByZXNzaW9uX21ldGhvZCkpICYmCisgICAgICAgICAgICBiY21vbHRfYnVmX3JlYWQoYnVmLCAmY29tcF9tZXRob2RzLmNvbXByZXNzaW9uX21ldGhvZCwgY29tcF9tZXRob2RzLmxlbmd0aCkgJiYKKyAgICAgICAgICAgIChjb21wX21ldGhvZHMuY29tcHJlc3Npb25fbWV0aG9kID09IGNtX251bGwpICkKKyAgICAgICAgeworICAgICAgICAgICAgbGlua19yZWMtPmF1dGhfY3RybC52ZXJzaW9uLm1ham9yID0gdmVyc2lvbi5tYWpvcjsKKyAgICAgICAgICAgIGxpbmtfcmVjLT5hdXRoX2N0cmwudmVyc2lvbi5taW5vciA9IHZlcnNpb24ubWlub3I7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIE5vIGNpcGhlciBzdWl0ZXMsIGNoZWNrIHRoYXQgY29tcCBtZXRob2QgaXMgbnVsbCAqLworICAgICAgICBtZW1zZXQoJmNvbXBfbWV0aG9kcywgMCwgc2l6ZW9mKGNvbXBfbWV0aG9kcykpOworICAgICAgICBiY21vbHRfYnVmX3NuYXBfcmVzdG9yZShidWYsIGNtX3NuYXApOworICAgICAgICBpZiAoYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJmNvbXBfbWV0aG9kcy5sZW5ndGgpICYmICAvKiBDb21wcmVzc2lvbiBNZXRob2RzICovCisgICAgICAgICAgIChjb21wX21ldGhvZHMubGVuZ3RoID09IHNpemVvZihjb21wX21ldGhvZHMuY29tcHJlc3Npb25fbWV0aG9kKSkgJiYKKyAgICAgICAgICAgYmNtb2x0X2J1Zl9yZWFkKGJ1ZiwgJmNvbXBfbWV0aG9kcy5jb21wcmVzc2lvbl9tZXRob2QsIGNvbXBfbWV0aG9kcy5sZW5ndGgpICYmCisgICAgICAgICAgIChjb21wX21ldGhvZHMuY29tcHJlc3Npb25fbWV0aG9kID09IGNtX251bGwpICkKKyAgICAgICAgeworICAgICAgICAgICAgbGlua19yZWMtPmF1dGhfY3RybC52ZXJzaW9uLm1ham9yID0gdmVyc2lvbi5tYWpvcjsKKyAgICAgICAgICAgIGxpbmtfcmVjLT5hdXRoX2N0cmwudmVyc2lvbi5taW5vciA9IHZlcnNpb24ubWlub3I7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIE9rIHdlIGZhaWxlZCB0byBkZWNvZGUgd2hhdCB3YXMgc2VudCBhcyBjaXBoZXIgc3VpdGVzIGFuZCBjb21wIG1ldGhvZHMuIERvIHdlIGNhcmU/IEFic29sdXRlbHkgTm90ISAqLworICAgICAgICBsaW5rX3JlYy0+YXV0aF9jdHJsLnZlcnNpb24ubWFqb3IgPSB2ZXJzaW9uLm1ham9yOworICAgICAgICBsaW5rX3JlYy0+YXV0aF9jdHJsLnZlcnNpb24ubWlub3IgPSB2ZXJzaW9uLm1pbm9yOworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfRkFMU0U7Cit9CisKK3N0YXRpYyBiY21vc19ib29sIF9kcG9lX2VhcF90bHNfaGFuZGxlX2NsaWVudF9oZWxsb19ocyhkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04oYnVmID09IE5VTEwpOworCisgICAgaWYgKF9kcG9lX2VhcF90bHNfcGFyc2VfY2xpZW50X2hlbGxvKGxpbmtfcmVjLCBidWYpKQorICAgIHsKKyAgICAgICAgLyogV2Ugbm93IGhhdmUgdGhlIGRhdGEsIGJ1aWxkIHRoZSBFQVAgc2Vzc2lvbiBJRCAoc2VlIFJGQyA1MjE2KSAqLworICAgICAgICBsaW5rX3JlYy0+YXV0aF9jdHJsLnRyYW5zX2RhdGEuc2Vzc2lvbl9pZFswXSA9IDB4ZDsKKyAgICAgICAgbWVtY3B5KAorICAgICAgICAgICAgJmxpbmtfcmVjLT5hdXRoX2N0cmwudHJhbnNfZGF0YS5zZXNzaW9uX2lkWzFdLAorICAgICAgICAgICAgbGlua19yZWMtPmF1dGhfY3RybC50cmFuc19kYXRhLmNsaWVudF9yYW5kb20sCisgICAgICAgICAgICBDT1VOVF9PRl9SQU5ET01fQllURVMpOworICAgICAgICBtZW1jcHkoCisgICAgICAgICAgICAmbGlua19yZWMtPmF1dGhfY3RybC50cmFuc19kYXRhLnNlc3Npb25faWRbQ09VTlRfT0ZfUkFORE9NX0JZVEVTICsgMV0sCisgICAgICAgICAgICBsaW5rX3JlYy0+YXV0aF9jdHJsLnRyYW5zX2RhdGEuc2VydmVyX3JhbmRvbSwKKyAgICAgICAgICAgIENPVU5UX09GX1JBTkRPTV9CWVRFUyk7CisKKyAgICAgICAgaWYgKF9kcG9lX2VhcF90bHNfc2VuZF9jZXJ0X3JlcXVlc3QobGlua19yZWMpKQorICAgICAgICB7CisgICAgICAgICAgICBsaW5rX3JlYy0+YXV0aF9jdHJsLm9udV9hdXRoX3N0YXRlID0gRFBPRV9PTlVfQVVUSF9TVEFURV9DRVJUX1JFUVVFU1Q7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19GQUxTRTsKK30KKworc3RhdGljIGJjbW9zX2Jvb2wgX2Rwb2VfZWFwX3Rsc19oYW5kbGVfY2VydGlmaWNhdGVfaHMoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGJ1ZiA9PSBOVUxMKTsKKworICAgIGlmIChfZHBvZV9lYXBfdGxzX3BhcnNlX2NlcnRpZmljYXRlKGxpbmtfcmVjLCBidWYpKQorICAgIHsKKyAgICAgICAgaWYgKGxpbmtfcmVjLT5hdXRoX2N0cmwudmVyc2lvbi5taW5vciA9PSBUTFNfTUlOT1JfVkVSU0lPTikKKyAgICAgICAgeworICAgICAgICAgICAgbGlua19yZWMtPmF1dGhfY3RybC5vbnVfYXV0aF9zdGF0ZSA9IERQT0VfT05VX0FVVEhfU1RBVEVfQ0VSVF9SRUNFSVZFRDsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBCQ01PU19GQUxTRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBiY21vc19ib29sIF9kcG9lX2VhcF90bHNfaGFuZGxlX2NsaWVudF9rZXlfZXhjaGFuZ2VfaHMoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGJ1ZiA9PSBOVUxMKTsKKworICAgIGlmIChfZHBvZV9lYXBfdGxzX3BhcnNlX2NsaWVudF9rZXlfZXhjaGFuZ2UobGlua19yZWMsIGJ1ZikpCisgICAgeworICAgICAgICBpZiAobGlua19yZWMtPmF1dGhfY3RybC52ZXJzaW9uLm1pbm9yID09IFRMU19NSU5PUl9WRVJTSU9OKQorICAgICAgICB7CisgICAgICAgICAgICBsaW5rX3JlYy0+YXV0aF9jdHJsLm9udV9hdXRoX3N0YXRlID0gRFBPRV9PTlVfQVVUSF9TVEFURV9DTElFTlRfS0VZX1JFQ0VJVkVEOworICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBEUE9FX1NFQ19MSU5LX0xPRyhFUlJPUiwgbGlua19yZWMsICJXcm9uZyBUTFMgdmVyc2lvbiBpbiBjbGllbnQga2V5IGV4Y2hhbmdlOiAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtfcmVjLT5hdXRoX2N0cmwudmVyc2lvbi5taW5vcik7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsIGxpbmtfcmVjLCAiRmFpbGVkIHRvIHBhcnNlIGNsaWVudCBrZXkgZXhjaGFuZ2VcbiIpOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19GQUxTRTsKK30KKworc3RhdGljIGJjbW9zX2Jvb2wgX2Rwb2VfZWFwX3Rsc19oYW5kbGVfY2VydF92ZXJpZnlfaHMoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBiY21vbHRfYnVmICpidWYpCit7CisgICAgYmNtb3NfYm9vbCBzdWNjZXNzOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGJ1ZiA9PSBOVUxMKTsKKworICAgIHN1Y2Nlc3MgPSBfZHBvZV9lYXBfdGxzX3BhcnNlX2NlcnRfdmVyaWZ5KGxpbmtfcmVjLCBidWYpOworCisgICAgaWYgKHN1Y2Nlc3MpCisgICAgeworICAgICAgICBsaW5rX3JlYy0+YXV0aF9jdHJsLm9udV9hdXRoX3N0YXRlID0gRFBPRV9PTlVfQVVUSF9TVEFURV9DRVJUX1ZBTElEQVRFRDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbGlua19yZWMtPmF1dGhfY3RybC5vbnVfYXV0aF9zdGF0ZSA9IERQT0VfT05VX0FVVEhfU1RBVEVfRkFJTEVEOworICAgICAgICBpZiAoX2F1dGhfY29tcGxldGUgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgX2F1dGhfY29tcGxldGUobGlua19yZWMsIEJDTV9FUlJfT05VX0VSUl9SRVNQKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzdWNjZXNzOworfQorCitzdGF0aWMgYmNtb3NfYm9vbCBfZHBvZV9lYXBfdGxzX2hhbmRsZV9maW5pc2hlZF9ocyhkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMpCit7CisgICAgYmNtb3NfYm9vbCBzdWNjZXNzOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisKKyAgICBzdWNjZXNzID0gX2Rwb2VfZWFwX3Rsc19wYXJzZV92ZXJpZnlfZGF0YShsaW5rX3JlYyk7CisKKyAgICAvKiBBbmQgc2VuZCB0aGUgZmluYWwgRmluaXNoZWQgSHMgdG8gdGhlIE9OVSAqLworICAgIGlmIChsaW5rX3JlYy0+YXV0aF9jdHJsLnZlcnNpb24ubWlub3IgPT0gVExTX01JTk9SX1ZFUlNJT04pCisgICAgeworICAgICAgICBfZHBvZV9lYXBfdGxzX3NlbmRfZmluaXNoZWRfaHMobGlua19yZWMpOworICAgIH0KKworICAgIGlmIChzdWNjZXNzKQorICAgIHsKKyAgICAgICAgaWYgKChfY2VydF90cnVzdCA9PSBOVUxMKSB8fCAoX2NlcnRfdHJ1c3QobGlua19yZWMpKSkKKyAgICAgICAgeworICAgICAgICAgICAgbGlua19yZWMtPmF1dGhfY3RybC5vbnVfYXV0aF9zdGF0ZSA9IERQT0VfT05VX0FVVEhfU1RBVEVfQVVUSEVOVElDQVRFRDsKKyAgICAgICAgICAgIF9kcG9lX2VhcF90bHNfc2VuZF9yZXN1bHQobGlua19yZWMsIEVBUF9DT0RFX1NVQ0NFU1MpOworICAgICAgICAgICAgaWYgKF9hdXRoX2NvbXBsZXRlICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2F1dGhfY29tcGxldGUobGlua19yZWMsIEJDTV9FUlJfT0spOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbGlua19yZWMtPmF1dGhfY3RybC5vbnVfYXV0aF9zdGF0ZSA9IERQT0VfT05VX0FVVEhfU1RBVEVfRkFJTEVEOworICAgICAgICAgICAgX2Rwb2VfZWFwX3Rsc19zZW5kX3Jlc3VsdChsaW5rX3JlYywgRUFQX0NPREVfRkFJTFVSRSk7CisgICAgICAgICAgICBzdWNjZXNzID0gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICBpZiAoX2F1dGhfY29tcGxldGUgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfYXV0aF9jb21wbGV0ZShsaW5rX3JlYywgQkNNX0VSUl9JTlRFUk5BTCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogUmVzZXQgQUxMIHRoZSBzdGF0ZSB2YXJpYWJsZXMhICovCisgICAgICAgIG1lbXNldCgmbGlua19yZWMtPmF1dGhfY3RybCwgMCwgc2l6ZW9mKGxpbmtfcmVjLT5hdXRoX2N0cmwpKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3VjY2VzczsKK30KKworc3RhdGljIGJjbW9zX2Jvb2wgX2Rwb2VfZWFwX3Rsc19hbGxvY190bHNfZnJhZ19idWZmZXIob251X2F1dGhfY29udHJvbCAqYXV0aF9jdHJsKQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGF1dGhfY3RybCA9PSBOVUxMKTsKKworICAgIGlmIChhdXRoX2N0cmwtPnRsc19mcmFnX2J1ZmZlciA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgYXV0aF9jdHJsLT50bHNfZnJhZ19idWZmZXIgPSBiY21vc19jYWxsb2MoRUFQT0xfUEtUX1NJWkUpOworICAgICAgICBhdXRoX2N0cmwtPnRsc19mcmFnX2xlbmd0aCA9IDA7CisgICAgICAgIGF1dGhfY3RybC0+dGxzX3RvdGFsX2xlbmd0aCA9IDA7CisgICAgfQorCisgICAgaWYgKGF1dGhfY3RybC0+dGxzX2ZyYWdfYnVmZmVyID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKK3N0YXRpYyB2b2lkIF9kcG9lX2VhcF90bHNfZnJlZV90bHNfZnJhZ19idWZmZXIob251X2F1dGhfY29udHJvbCAqYXV0aF9jdHJsKQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGF1dGhfY3RybCA9PSBOVUxMKTsKKworICAgIGlmIChhdXRoX2N0cmwtPnRsc19mcmFnX2J1ZmZlciAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgYmNtb3NfZnJlZShhdXRoX2N0cmwtPnRsc19mcmFnX2J1ZmZlcik7CisgICAgICAgIGF1dGhfY3RybC0+dGxzX2ZyYWdfYnVmZmVyID0gTlVMTDsKKyAgICAgICAgYXV0aF9jdHJsLT50bHNfZnJhZ19sZW5ndGggPSAwOworICAgICAgICBhdXRoX2N0cmwtPnRsc190b3RhbF9sZW5ndGggPSAwOworICAgIH0KK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9kcG9lX2VhcF90bHNfc2VuZF90bHNfZnJhZ19hY2tfdG9fb251KGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYykKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBiY21vbHRfYnVmIGJ1ZjsKKyAgICB1aW50OF90ICptc2c7CisgICAgZWFwX2xlbmd0aF9maWVsZHMgbGY7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKworICAgIC8qIEFsbG9jYXRlIGEgbWVzc2FnZSBidWZmZXIgKi8KKyAgICBtc2cgPSBiY21vc19jYWxsb2MoRUFQT0xfUEtUX1NJWkUpOworICAgIGlmIChOVUxMID09IG1zZykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKworICAgIC8qIEluaXRpYWxpemUgdGhlIEVBUC1UTFMgYnVmZmVyLiAqLworICAgIGJjbW9sdF9idWZfaW5pdCgmYnVmLCBFQVBPTF9QS1RfU0laRSwgbXNnLCBCQ01PTFRfQlVGX0VORElBTl9GSVhFRCk7CisgICAgaWYgKF9kcG9lX2VhcF90bHNfaW5pdF9lYXBfaGRyKGxpbmtfcmVjLCAmYnVmLCBFQVBfQ09ERV9SRVFVRVNULCAmbGYpICYmCisgICAgICAgIF9kcG9lX2VhcF90bHNfaW5pdF90bHNfaGRyKCZidWYsIDAsICZsZikgJiYKKyAgICAgICAgX2Rwb2VfZWFwX3Rsc19wYWNrX21zZ19sZW5ndGhzKCZidWYsIDAsICZsZikpCisgICAgeworICAgICAgICAvKiBTZW5kIHRoZSBtZXNzYWdlICovCisgICAgICAgIHJjID0gZHBvZV9zZWNfc2VuZF9lYXBvbChsaW5rX3JlYy0+ZGV2aWNlLCAmbGlua19yZWMtPmtleSwgbXNnLCBiY21vbHRfYnVmX2dldF91c2VkKCZidWYpKTsKKyAgICAgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX2ZyZWUobXNnKTsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByYyA9IEJDTV9FUlJfT1ZFUkZMT1c7CisgICAgfQorCisgICAgYmNtb3NfZnJlZShtc2cpOworCisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgYmNtb3NfYm9vbCBfZHBvZV9lYXBfdGxzX3VucGFja190bHNfaGFuZHNoYWtlKGJjbW9sdF9idWYgKmJ1ZiwgdGxzX2hhbmRzaGFrZSogaHMpCit7CisgICAgdWludDI0X3QgdGVtcDsKKyAgICBiY21vc19ib29sIHJjID0gQkNNT1NfRkFMU0U7CisKKyAgICBpZiAoYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJmhzLT5tc2dfaWQpICYmCisgICAgICAgIGJjbW9sdF9idWZfcmVhZF91MjQoYnVmLCAmdGVtcCkpCisgICAgeworICAgICAgICBocy0+bXNnX2xlbmd0aCA9IHVpbnQyNF90b18zMih0ZW1wKTsKKyAgICAgICAgcmMgPSBCQ01PU19UUlVFOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9kcG9lX2VhcF90bHNfcnVuX2F1dGhfc3RhdGVfbWFjaGluZShkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIGJjbW9sdF9idWYgKmJ1ZikKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgdWludDhfdCAqaHNfc25hcDsKKyAgICB0bHNfaGFuZHNoYWtlIGhhbmRzaGFrZTsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworCisgICAgd2hpbGUgKGhzX3NuYXAgPSBiY21vbHRfYnVmX3NuYXBfZ2V0KGJ1ZiksIF9kcG9lX2VhcF90bHNfdW5wYWNrX3Rsc19oYW5kc2hha2UoYnVmLCAmaGFuZHNoYWtlKSkKKyAgICB7CisgICAgICAgIGJjbW9zX2Jvb2wgc3VjY2VzcyA9IEJDTU9TX1RSVUU7CisKKyAgICAgICAgaWYgKGhhbmRzaGFrZS5tc2dfbGVuZ3RoID4gRUFQT0xfUEtUX1NJWkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIERQT0VfU0VDX0xJTktfTE9HKERFQlVHLCBsaW5rX3JlYywgIkhhbmRzaGFrZSBsZW5ndGggaXMgaW5zYW5lOiBtc2cgJXUsIGxlbiAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRzaGFrZS5tc2dfaWQsIGhhbmRzaGFrZS5tc2dfbGVuZ3RoKTsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUlNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChoYW5kc2hha2UubXNnX2lkID09IEhTX0NMSUVOVF9IRUxMTykgJiYKKyAgICAgICAgICAgIChsaW5rX3JlYy0+YXV0aF9jdHJsLm9udV9hdXRoX3N0YXRlID09IERQT0VfT05VX0FVVEhfU1RBVEVfRUFQX1NUQVJUKSkKKyAgICAgICAgeworICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coREVCVUcsIGxpbmtfcmVjLCAiRUFQIFRMUyBSWCBtc2cgJXUgaW4gc3RhdGUgJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kc2hha2UubXNnX2lkLCBsaW5rX3JlYy0+YXV0aF9jdHJsLm9udV9hdXRoX3N0YXRlKTsKKyAgICAgICAgICAgIF9idWZmZXJfaGFzaF9kYXRhKGxpbmtfcmVjLCBoc19zbmFwLCBoYW5kc2hha2UubXNnX2xlbmd0aCArIFRMU19IQU5EU0hBS0VfU0laRSk7CisgICAgICAgICAgICBzdWNjZXNzID0gX2Rwb2VfZWFwX3Rsc19oYW5kbGVfY2xpZW50X2hlbGxvX2hzKGxpbmtfcmVjLCBidWYpOworICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coREVCVUcsIGxpbmtfcmVjLCAiTmV3IGF1dGggc3RhdGUgJXVcbiIsIGxpbmtfcmVjLT5hdXRoX2N0cmwub251X2F1dGhfc3RhdGUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChoYW5kc2hha2UubXNnX2lkID09IEhTX0NFUlRJRklDQVRFKSAmJgorICAgICAgICAgICAgICAgICAobGlua19yZWMtPmF1dGhfY3RybC5vbnVfYXV0aF9zdGF0ZSA9PSBEUE9FX09OVV9BVVRIX1NUQVRFX0NFUlRfUkVRVUVTVCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIERQT0VfU0VDX0xJTktfTE9HKERFQlVHLCBsaW5rX3JlYywgIkVBUCBUTFMgUlggbXNnICV1IGluIHN0YXRlICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZHNoYWtlLm1zZ19pZCwgbGlua19yZWMtPmF1dGhfY3RybC5vbnVfYXV0aF9zdGF0ZSk7CisgICAgICAgICAgICBfYnVmZmVyX2hhc2hfZGF0YShsaW5rX3JlYywgaHNfc25hcCwgaGFuZHNoYWtlLm1zZ19sZW5ndGggKyBUTFNfSEFORFNIQUtFX1NJWkUpOworICAgICAgICAgICAgc3VjY2VzcyA9IF9kcG9lX2VhcF90bHNfaGFuZGxlX2NlcnRpZmljYXRlX2hzKGxpbmtfcmVjLCBidWYpOworICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coREVCVUcsIGxpbmtfcmVjLCAiTmV3IGF1dGggc3RhdGUgJXVcbiIsIGxpbmtfcmVjLT5hdXRoX2N0cmwub251X2F1dGhfc3RhdGUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChoYW5kc2hha2UubXNnX2lkID09IEhTX0NMSUVOVF9LRVlfRVhDSEFOR0UpICYmCisgICAgICAgICAgICAgICAgIChsaW5rX3JlYy0+YXV0aF9jdHJsLm9udV9hdXRoX3N0YXRlID09IERQT0VfT05VX0FVVEhfU1RBVEVfQ0VSVF9SRUNFSVZFRCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIERQT0VfU0VDX0xJTktfTE9HKERFQlVHLCBsaW5rX3JlYywgIkVBUCBUTFMgUlggbXNnICV1IGluIHN0YXRlICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZHNoYWtlLm1zZ19pZCwgbGlua19yZWMtPmF1dGhfY3RybC5vbnVfYXV0aF9zdGF0ZSk7CisgICAgICAgICAgICBfYnVmZmVyX2hhc2hfZGF0YShsaW5rX3JlYywgaHNfc25hcCwgaGFuZHNoYWtlLm1zZ19sZW5ndGggKyBUTFNfSEFORFNIQUtFX1NJWkUpOworICAgICAgICAgICAgc3VjY2VzcyA9IF9kcG9lX2VhcF90bHNfaGFuZGxlX2NsaWVudF9rZXlfZXhjaGFuZ2VfaHMobGlua19yZWMsIGJ1Zik7CisgICAgICAgICAgICBEUE9FX1NFQ19MSU5LX0xPRyhERUJVRywgbGlua19yZWMsICJOZXcgYXV0aCBzdGF0ZSAldVxuIiwgbGlua19yZWMtPmF1dGhfY3RybC5vbnVfYXV0aF9zdGF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKGhhbmRzaGFrZS5tc2dfaWQgPT0gSFNfQ0VSVElGSUNBVEVfVkVSSUZZKSAmJgorICAgICAgICAgICAgICAgICAoKGxpbmtfcmVjLT5hdXRoX2N0cmwub251X2F1dGhfc3RhdGUgPT0gRFBPRV9PTlVfQVVUSF9TVEFURV9DRVJUX1JFQ0VJVkVEKSB8fAorICAgICAgICAgICAgICAgICAgKGxpbmtfcmVjLT5hdXRoX2N0cmwub251X2F1dGhfc3RhdGUgPT0gRFBPRV9PTlVfQVVUSF9TVEFURV9DTElFTlRfS0VZX1JFQ0VJVkVEKSkpCisKKyAgICAgICAgeworICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coREVCVUcsIGxpbmtfcmVjLCAiRUFQIFRMUyBSWCBtc2cgJXUgaW4gc3RhdGUgJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kc2hha2UubXNnX2lkLCBsaW5rX3JlYy0+YXV0aF9jdHJsLm9udV9hdXRoX3N0YXRlKTsKKyAgICAgICAgICAgIGRwb2Vfc2VjX3NoYTFfZmluYWwobGlua19yZWMtPmF1dGhfY3RybC50cmFuc19kYXRhLnNoYTFfZGlnZXN0LCAmbGlua19yZWMtPmF1dGhfY3RybC50cmFuc19kYXRhLnNoYTFfaGFzaCk7CisgICAgICAgICAgICBkcG9lX3NlY19tZDVfZmluYWwobGlua19yZWMtPmF1dGhfY3RybC50cmFuc19kYXRhLm1kNV9kaWdlc3QsICZsaW5rX3JlYy0+YXV0aF9jdHJsLnRyYW5zX2RhdGEubWQ1X2hhc2gpOworICAgICAgICAgICAgc3VjY2VzcyA9IF9kcG9lX2VhcF90bHNfaGFuZGxlX2NlcnRfdmVyaWZ5X2hzKGxpbmtfcmVjLCBidWYpOworICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coREVCVUcsIGxpbmtfcmVjLCAiTmV3IGF1dGggc3RhdGUgJXVcbiIsIGxpbmtfcmVjLT5hdXRoX2N0cmwub251X2F1dGhfc3RhdGUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKChoYW5kc2hha2UubXNnX2lkID09IEhTX0ZJTklTSEVEKSAmJgorICAgICAgICAgICAgICAgICAobGlua19yZWMtPmF1dGhfY3RybC5vbnVfYXV0aF9zdGF0ZSA9PSBEUE9FX09OVV9BVVRIX1NUQVRFX0NFUlRfVkFMSURBVEVEKSkKKyAgICAgICAgeworICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coREVCVUcsIGxpbmtfcmVjLCAiRUFQIFRMUyBSWCBtc2cgJXUgaW4gc3RhdGUgJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kc2hha2UubXNnX2lkLCBsaW5rX3JlYy0+YXV0aF9jdHJsLm9udV9hdXRoX3N0YXRlKTsKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSBfZHBvZV9lYXBfdGxzX2hhbmRsZV9maW5pc2hlZF9ocyhsaW5rX3JlYyk7CisgICAgICAgICAgICBEUE9FX1NFQ19MSU5LX0xPRyhERUJVRywgbGlua19yZWMsICJOZXcgYXV0aCBzdGF0ZSAldVxuIiwgbGlua19yZWMtPmF1dGhfY3RybC5vbnVfYXV0aF9zdGF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBEUE9FX1NFQ19MSU5LX0xPRyhERUJVRywgbGlua19yZWMsICJFQVAgVExTIFJYIG1zZyAldSBpbiBzdGF0ZSAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRzaGFrZS5tc2dfaWQsIGxpbmtfcmVjLT5hdXRoX2N0cmwub251X2F1dGhfc3RhdGUpOworICAgICAgICAgICAgc3VjY2VzcyA9IEJDTU9TX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFzdWNjZXNzKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBTb21ldGhpbmcgd2VudCB3cm9uZywganVzdCBhYm9ydC4uLiAqLworICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coREVCVUcsIGxpbmtfcmVjLCAiRUFQIFRMUyBoYW5kc2hha2UgcHJvY2Vzc2luZyBmYWlsZWQ6ICV1XG4iLCBoYW5kc2hha2UubXNnX2lkKTsKKyAgICAgICAgICAgIHJjID0gQkNNX0VSUl9QQVJTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGJjbW9zX2Jvb2wgX2Rwb2VfZWFwX3Rsc191bnBhY2tfdGxzX3JlY29yZF9oZHIoYmNtb2x0X2J1ZiAqYnVmLCB0bHNfcmVjb3JkX2hkciAqbXNnKQoreworICAgIHJldHVybiBiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbXNnLT5jb250ZW50X3R5cGUpICYmCisgICAgICAgIGJjbW9sdF9idWZfcmVhZF91OChidWYsICZtc2ctPnRsc192ZXJzaW9uLm1ham9yKSAmJgorICAgICAgICBiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbXNnLT50bHNfdmVyc2lvbi5taW5vcikgJiYKKyAgICAgICAgYmNtb2x0X2J1Zl9yZWFkX3UxNl9iZShidWYsICZtc2ctPnRsc19yZWNvcmRfbGVuZ3RoKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9kcG9lX2VhcF90bHNfcHJvY2Vzc190bHNfcmVjb3JkcyhkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworICAgIGJjbW9sdF9idWYgYnVmOworICAgIHRsc19yZWNvcmRfaGRyIHRsc19oZHI7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKworICAgIGJjbW9sdF9idWZfaW5pdCgmYnVmLCBsaW5rX3JlYy0+YXV0aF9jdHJsLnRsc19mcmFnX2xlbmd0aCwgbGlua19yZWMtPmF1dGhfY3RybC50bHNfZnJhZ19idWZmZXIsIEJDTU9MVF9CVUZfRU5ESUFOX0ZJWEVEKTsKKyAgICB3aGlsZSAoKHJjID09IEJDTV9FUlJfT0spICYmIF9kcG9lX2VhcF90bHNfdW5wYWNrX3Rsc19yZWNvcmRfaGRyKCZidWYsICZ0bHNfaGRyKSkKKyAgICB7CisgICAgICAgIHJjID0gX2Rwb2VfZWFwX3Rsc19ydW5fYXV0aF9zdGF0ZV9tYWNoaW5lKGxpbmtfcmVjLCAmYnVmKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBiY21vc19ib29sIF9kcG9lX2VhcF90bHNfY2hlY2tfdGxzX3ZlcnNpb24oY29uc3QgdGxzX3JlY29yZF9oZHIgKnRsc19yZWNfaGRyKQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKHRsc19yZWNfaGRyID09IE5VTEwpOworCisgICAgaWYgKCh0bHNfcmVjX2hkci0+Y29udGVudF90eXBlICE9IFRMU19IQU5EU0hBS0VfSUQpIHx8CisgICAgICAgICh0bHNfcmVjX2hkci0+dGxzX3ZlcnNpb24ubWFqb3IgIT0gVExTX01BSk9SX1ZFUlNJT04pIHx8CisgICAgICAgICh0bHNfcmVjX2hkci0+dGxzX3ZlcnNpb24ubWlub3IgPCBUTFNfTUlOT1JfVkVSU0lPTikpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworfQorCitzdGF0aWMgdm9pZCBfZHBvZV9lYXBfdGxzX2J1ZmZlcl90bHNfZGF0YShkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IGxlbmd0aCkKK3sKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04oZGF0YSA9PSBOVUxMKTsKKworICAgIC8qIGRvIG5vdCBvdmVycnVuIHRoZSBidWZmZXIsIG5vIG1hdHRlciBob3cgbXVjaCBkYXRhIHJlY2VpdmVkICovCisgICAgaWYgKChsaW5rX3JlYy0+YXV0aF9jdHJsLnRsc19mcmFnX2xlbmd0aCArIGxlbmd0aCkgPiBFQVBPTF9QS1RfU0laRSkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IEVBUE9MX1BLVF9TSVpFIC0gbGlua19yZWMtPmF1dGhfY3RybC50bHNfZnJhZ19sZW5ndGg7CisgICAgfQorCisgICAgbWVtY3B5KCZsaW5rX3JlYy0+YXV0aF9jdHJsLnRsc19mcmFnX2J1ZmZlcltsaW5rX3JlYy0+YXV0aF9jdHJsLnRsc19mcmFnX2xlbmd0aF0sIGRhdGEsIGxlbmd0aCk7CisgICAgbGlua19yZWMtPmF1dGhfY3RybC50bHNfZnJhZ19sZW5ndGggKz0gbGVuZ3RoOworfQorCitzdGF0aWMgYmNtb3NfYm9vbCBfZHBvZV9lYXBfdGxzX3VucGFja19tc2coYmNtb2x0X2J1ZiAqYnVmLCBlYXBvbF9tc2cgKm1zZykKK3sKKyAgICByZXR1cm4gZHBvZV9zZWNfZWFwb2xfdW5wYWNrKGJ1ZiwgJm1zZy0+aGRyKSAmJgorICAgICAgICBiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmbXNnLT5lYXBfbXNnLmhkci5lYXBfY29kZSkgJiYKKyAgICAgICAgYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm1zZy0+ZWFwX21zZy5oZHIuaWQpICYmCisgICAgICAgIGJjbW9sdF9idWZfcmVhZF91MTZfYmUoYnVmLCAmbXNnLT5lYXBfbXNnLmhkci5sZW5ndGgpICYmCisgICAgICAgIGJjbW9sdF9idWZfcmVhZF91OChidWYsICZtc2ctPmVhcF9tc2cudGxzLmF1dGhfc3ViX3R5cGUpICYmCisgICAgICAgIGJjbW9sdF9idWZfcmVhZF91OChidWYsICZtc2ctPmVhcF9tc2cudGxzLmVhcF90bHNfZmxhZ3MpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2Rwb2VfZWFwX3Rsc19nZW5fa2V5KGF1dGhfdHJhbnNfZGF0YSAqdHJhbnNfZGF0YSkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgZHBvZV9zZWNfcnNhX2tleSAqcnNhID0gTlVMTDsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04odHJhbnNfZGF0YSA9PSBOVUxMKTsKKworICAgIC8qIEdlbmVyYXRlIHRoZSBSU0Ega2V5IHRvIGJlIHVzZWQgaW4gdGhlIFNlcnZlcktleUV4Y2hhbmdlIGFuZCBDbGllbnRLZXlFeGNoYW5nZSAqLworICAgIHJzYSA9IGRwb2Vfc2VjX3JzYV9nZW5lcmF0ZV9rZXkoRFBPRV9CSV9SU0FfS0VZX1NJWkUpOworICAgIGlmIChyc2EgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJjID0gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogU3RvcmUgdGhlIHBvaW50ZXIgdG8gdGhlIGtleS4gKi8KKyAgICAgICAgdHJhbnNfZGF0YS0+cnNhID0gcnNhOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworYmNtb3NfZXJybm8gZHBvZV9lYXBfdGxzX3NlbmRfc3RhcnQoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKyAgICBiY21vbHRfYnVmIGJ1ZjsKKyAgICB1aW50OF90ICptc2c7CisgICAgdGltZV90IHVuaXhfdGltZTsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBhdXRoZW50aWNhdGlvbiBjb250cm9sIGRhdGEuICovCisgICAgbWVtc2V0KCZsaW5rX3JlYy0+YXV0aF9jdHJsLCAwLCBzaXplb2YobGlua19yZWMtPmF1dGhfY3RybCkpOworICAgIGRwb2Vfc2VjX3NoYTFfaW5pdCgmbGlua19yZWMtPmF1dGhfY3RybC50cmFuc19kYXRhLnNoYTFfaGFzaCk7CisgICAgZHBvZV9zZWNfbWQ1X2luaXQoJmxpbmtfcmVjLT5hdXRoX2N0cmwudHJhbnNfZGF0YS5tZDVfaGFzaCk7CisKKyAgICAvKiBQZXIgc3RhbmRhcmQsIHRoZSBmaXJzdCBmb3VyIGJ5dGVzIG9mIHRoZSBzZXJ2ZXIgcmFuZG9tIHZhbHVlIHNob3VsZCBiZSAidW5peCB0aW1lIiAqLworICAgIHVuaXhfdGltZSA9IHRpbWUoTlVMTCk7CisgICAgbWVtY3B5KGxpbmtfcmVjLT5hdXRoX2N0cmwudHJhbnNfZGF0YS5zZXJ2ZXJfcmFuZG9tLCAmdW5peF90aW1lLCBzaXplb2YodW5peF90aW1lKSk7CisgICAgZHBvZV9zZWNfZ2VuZXJhdGVfbl9ieXRlX3JhbmRvbV9udW1iZXIoJmxpbmtfcmVjLT5hdXRoX2N0cmwudHJhbnNfZGF0YS5zZXJ2ZXJfcmFuZG9tW3NpemVvZih1bml4X3RpbWUpXSwgQ09VTlRfT0ZfUkFORE9NX0JZVEVTIC0gc2l6ZW9mKHVuaXhfdGltZSkpOworCisgICAgLyogSWYgYmlkaXJlY3Rpb25hbCwgZ2VuZXJhdGUgdGhlIFJTQSBwdWJsaWMvcHJpdmF0ZSBrZXkgcGFpciBmb3IgdGhlIFNlcnZlcktleUV4Y2hhbmdlIGFuZCBDbGllbnRLZXlFeGNoYW5nZS4gKi8KKyAgICBpZiAobGlua19yZWMtPmNmZy5lbmNfbW9kZSA9PSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9FTkNSWVBUSU9OX01PREVfVEVOX0JJKQorICAgIHsKKyAgICAgICAgcmMgPSBfZHBvZV9lYXBfdGxzX2dlbl9rZXkoJmxpbmtfcmVjLT5hdXRoX2N0cmwudHJhbnNfZGF0YSk7CisgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihCQ01fRVJSX09LICE9IHJjLCByYyk7CisgICAgfQorCisgICAgLyogQWxsb2NhdGUgYSBtZXNzYWdlIGJ1ZmZlciAqLworICAgIG1zZyA9IGJjbW9zX2NhbGxvYyhFQVBPTF9QS1RfU0laRSk7CisgICAgaWYgKE5VTEwgPT0gbXNnKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgRUFQLVRMUyBidWZmZXIuICovCisgICAgYmNtb2x0X2J1Zl9pbml0KCZidWYsIEVBUE9MX1BLVF9TSVpFLCBtc2csIEJDTU9MVF9CVUZfRU5ESUFOX0ZJWEVEKTsKKworICAgIC8qIEVuY29kZSB0aGUgRUFQLVRMUyBTdGFydCBtZXNzYWdlIHRvIHRoZSBidWZmZXIuICovCisgICAgX2Rwb2VfZWFwX3Rsc19wYWNrX3N0YXJ0KGxpbmtfcmVjLCAmYnVmKTsKKworICAgIC8qIFNlbmQgdGhlIG1lc3NhZ2UgKi8KKyAgICByYyA9IGRwb2Vfc2VjX3NlbmRfZWFwb2wobGlua19yZWMtPmRldmljZSwgJmxpbmtfcmVjLT5rZXksIG1zZywgYmNtb2x0X2J1Zl9nZXRfdXNlZCgmYnVmKSk7CisgICAgYmNtb3NfZnJlZShtc2cpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihCQ01fRVJSX09LICE9IHJjLCByYyk7CisKKyAgICAvKiBBdXRoZW50aWNhdGlvbiBoYXMgYmVndW4uICovCisgICAgbGlua19yZWMtPmF1dGhfY3RybC5vbnVfYXV0aF9zdGF0ZSA9IERQT0VfT05VX0FVVEhfU1RBVEVfRUFQX1NUQVJUOworCisgICAgcmV0dXJuIHJjOworfQorCitiY21vc19lcnJubyBkcG9lX2VhcF90bHNfcHJvY2Vzc19lYXBvbF9wa3QoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCB1aW50OF90ICptc2csIHVpbnQzMl90IG1zZ19sZW4pCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX0lOVEVSTkFMOworICAgIHVpbnQzMl90IGVhcF90bHNfbGVuZ3RoOworICAgIHRsc19yZWNvcmRfaGRyIHRsc19yZWNfaGRyOworICAgIGVhcG9sX21zZyB1bnBhY2tlZF9tc2c7CisgICAgYmNtb2x0X2J1ZiBidWY7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihtc2cgPT0gTlVMTCk7CisKKyAgICBiY21vbHRfYnVmX2luaXQoJmJ1ZiwgbXNnX2xlbiwgbXNnLCBCQ01PTFRfQlVGX0VORElBTl9GSVhFRCk7CisgICAgX2Rwb2VfZWFwX3Rsc191bnBhY2tfbXNnKCZidWYsICZ1bnBhY2tlZF9tc2cpOworCisgICAgaWYgKHVucGFja2VkX21zZy5lYXBfbXNnLnRscy5hdXRoX3N1Yl90eXBlID09IEVBUF9UWVBFX05BSykKKyAgICB7CisgICAgICAgIGxpbmtfcmVjLT5hdXRoX2N0cmwub251X2F1dGhfc3RhdGUgPSBEUE9FX09OVV9BVVRIX1NUQVRFX0ZBSUxFRDsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT05VX0VSUl9SRVNQOworICAgIH0KKworICAgIGlmICh1bnBhY2tlZF9tc2cuaGRyLmVhcG9sX2xlbmd0aCAhPSB1bnBhY2tlZF9tc2cuZWFwX21zZy5oZHIubGVuZ3RoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSU0U7CisgICAgfQorCisgICAgLyogV2Ugc2hvdWxkIG9ubHkgcmVhZCB0aGUgbGVuZ3RoIGlmIHRoZSBsZW5ndGggYml0IGlzIHNldC4gKi8KKyAgICBpZiAoKHVucGFja2VkX21zZy5lYXBfbXNnLnRscy5lYXBfdGxzX2ZsYWdzICYgRUFQX1RMU19GTEFHX0xFTkdUSF9CSVQpICE9IDApCisgICAgeworICAgICAgICBiY21vbHRfYnVmX3JlYWRfdTMyX2JlKCZidWYsICZlYXBfdGxzX2xlbmd0aCk7CisgICAgICAgIHVpbnQ4X3QgKnRsc19kYXRhID0gYmNtb2x0X2J1Zl9zbmFwX2dldCgmYnVmKTsKKyAgICAgICAgX2Rwb2VfZWFwX3Rsc191bnBhY2tfdGxzX3JlY29yZF9oZHIoJmJ1ZiwgJnRsc19yZWNfaGRyKTsKKyAgICAgICAgaWYgKF9kcG9lX2VhcF90bHNfY2hlY2tfdGxzX3ZlcnNpb24oJnRsc19yZWNfaGRyKSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogSW52YWxpZCBUTFMgcmVjb3JkLCBkaXNjYXJkLi4uICovCisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJTRTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEFsbG9jYXRlIHRoZSBmcmFnbWVudGF0aW9uIGJ1ZmZlci4gTXVsdGlwbGUgY2FsbHMgdG8gdGhlIGZyYWcgYWxsb2MgZnVuY3Rpb24gaXMgYWxsb3dlZCBzaW5jZSBpdCBhbGxvY2F0ZXMgYQorICAgICAgICAgICBuZXcgYnVmZmVyIG9ubHkgaWYgdGhlcmUgaXMgbm8gZnJhZyBidWZmZXIgY3VycmVudGx5IGFsbG9jYXRlZC4gVGhlIGZyYWcgYnVmZmVyIGlzIGFsc28gZnJlZWQgaWYgdGhlIEVBUC1UTFMKKyAgICAgICAgICAgc2Vzc2lvbiBnb2VzIGRvd24gZm9yIHNvbWUgcmVhc29uLiAqLworICAgICAgICBpZiAoIV9kcG9lX2VhcF90bHNfYWxsb2NfdGxzX2ZyYWdfYnVmZmVyKCZsaW5rX3JlYy0+YXV0aF9jdHJsKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgICAgIH0KKworICAgICAgICAvKiBJZiB0aGUgbGVuZ3RoIGJpdCBpcyBzZXQsIGFuZCB0aGUgbW9yZSBiaXQgaXMgbm90LCB0aGlzIGlzIGxpa2VseSBhIHNpbmdsZSBmcmFnbWVudCBwYWNrZXQuICBJbiB0aGF0IGNhc2UKKyAgICAgICAgICAgdGhlIFRsc01zZyBsZW5ndGggbXVzdCBiZSBwcmVzZW50LCBhbmQgbWF0Y2ggdGhlIHNpemUgb2YgdGhlIGJ1ZmZlci4gSXQgaXMgYWxzbyBwb3NzaWJsZSB0aGF0IHRoaXMgaXMgYQorICAgICAgICAgICBzdWJzZXF1ZW50IGZyYWdtZW50IGFuZCB0aGUgY2xpZW50IGFsd2F5cyBhZGRzIHRoZSBsZW5ndGggKHdoaWNoIHBlciBzdGFuZGFyZCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBzZXQgb2YKKyAgICAgICAgICAgZnJhZ21lbnRzKSwgaW4gd2hpY2ggY2FzZSB3ZSBjYW5ub3QgdmFsaWRhdGUgdGhpcyBub3cuIFRoZSBiZXN0IHdlIGNhbiBkbyBpcyBzYXZlIHRoaXMgc2l6ZSwgYW5kIHZhbGlkYXRlCisgICAgICAgICAgIHdoZW4gYWxsIGZyYWdtZW50cyBoYXZlIGJlZW4gcmVjZWl2ZWQuICovCisgICAgICAgIGlmIChsaW5rX3JlYy0+YXV0aF9jdHJsLnRsc190b3RhbF9sZW5ndGggPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgbGlua19yZWMtPmF1dGhfY3RybC50bHNfdG90YWxfbGVuZ3RoID0gZWFwX3Rsc19sZW5ndGg7CisgICAgICAgIH0KKworICAgICAgICBpZiAobGlua19yZWMtPmF1dGhfY3RybC50bHNfdG90YWxfbGVuZ3RoICE9IGVhcF90bHNfbGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJTRTsKKyAgICAgICAgfQorCisgICAgICAgIF9kcG9lX2VhcF90bHNfYnVmZmVyX3Rsc19kYXRhKAorICAgICAgICAgICAgbGlua19yZWMsCisgICAgICAgICAgICB0bHNfZGF0YSwKKyAgICAgICAgICAgIHVucGFja2VkX21zZy5oZHIuZWFwb2xfbGVuZ3RoIC0gKEVBUF9GUkFNRV9TSVpFICsgRUFQX1RMU19IRFJfU0laRSArIHNpemVvZih1aW50MzJfdCkpKTsKKworICAgICAgICBpZiAoKHVucGFja2VkX21zZy5lYXBfbXNnLnRscy5lYXBfdGxzX2ZsYWdzICYgRUFQX1RMU19GTEFHX01PUkVfQklUKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBOZWVkIHRvIGFja25vd2xlZGdlIHRoZSBmcmFnbWVudCAqLworICAgICAgICAgICAgX2Rwb2VfZWFwX3Rsc19zZW5kX3Rsc19mcmFnX2Fja190b19vbnUobGlua19yZWMpOworICAgICAgICAgICAgcmMgPSBCQ01fRVJSX0lOX1BST0dSRVNTOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogRWl0aGVyIGEgc2luZ2xlIGZyYWdtZW50IHBhY2tldCwgb3IgdGhlIGxhc3QgZnJhZ21lbnQgb2YgYSBtdWx0aS1mcmFnbWVudCBwYWNrZXQuIElmIGl0IGlzIHRoZSBsYXN0CisgICAgICAgICAgICAgICBmcmFnbWVudCBvZiBhIG11bHRpLWZyYWdtZW50LCB0aGVuIGFsbCB3ZSBjYW4gY2hlY2sgaXMgdGhhdCBlYXBUbHNMZW5ndGggaXMgb25lIFRsc1JlY29yZEhkciBiaWdnZXIgdGhhbgorICAgICAgICAgICAgICAgdGhlIGJ1ZmZlcmVkIChhdXRoQ3RybC0+dGxzRnJhZ0xlbikgZGF0YSBzdHJlYW0uIFRoZSBzYW1lIGxvZ2ljIHdvcmtzIG9uIGEgc2luZ2xlIGZyYWcgcGFja2V0LiAqLworICAgICAgICAgICAgaWYgKChlYXBfdGxzX2xlbmd0aCAhPSBsaW5rX3JlYy0+YXV0aF9jdHJsLnRsc190b3RhbF9sZW5ndGgpIHx8CisgICAgICAgICAgICAgICAgKGVhcF90bHNfbGVuZ3RoICE9IGxpbmtfcmVjLT5hdXRoX2N0cmwudGxzX2ZyYWdfbGVuZ3RoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJTRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmMgPSBfZHBvZV9lYXBfdGxzX3Byb2Nlc3NfdGxzX3JlY29yZHMobGlua19yZWMpOworICAgICAgICAgICAgX2Rwb2VfZWFwX3Rsc19mcmVlX3Rsc19mcmFnX2J1ZmZlcigmbGlua19yZWMtPmF1dGhfY3RybCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdWludDhfdCAqdGxzX2RhdGEgPSBiY21vbHRfYnVmX3NuYXBfZ2V0KCZidWYpOworCisgICAgICAgIC8qIE5vIGxlbmd0aCBmaWVsZCAtIG11c3QgYmUgZnJhZ21lbnRlZCwgYW5kIG5vdCBmaXJzdCAqLworICAgICAgICBpZiAobGlua19yZWMtPmF1dGhfY3RybC50bHNfZnJhZ19idWZmZXIgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT1VUX09GX1NZTkM7CisgICAgICAgIH0KKworICAgICAgICBfZHBvZV9lYXBfdGxzX2J1ZmZlcl90bHNfZGF0YSgKKyAgICAgICAgICAgIGxpbmtfcmVjLAorICAgICAgICAgICAgdGxzX2RhdGEsCisgICAgICAgICAgICB1bnBhY2tlZF9tc2cuaGRyLmVhcG9sX2xlbmd0aCAtIChFQVBfRlJBTUVfU0laRSArIEVBUF9UTFNfSERSX1NJWkUpKTsKKworICAgICAgICAvKiBJZiB0aGUgbW9yZSBiaXQgaXMgc2V0LCB3YWl0IGZvciB0aGUgbmV4dCBmcmFnbWVudC4gT3RoZXJ3aXNlIGR1bXAgd2hhdCB3ZSBoYXZlIGludG8gdGhlIHN0YXRlIG1hY2hpbmUuICovCisgICAgICAgIGlmICgodW5wYWNrZWRfbXNnLmVhcF9tc2cudGxzLmVhcF90bHNfZmxhZ3MgJiBFQVBfVExTX0ZMQUdfTU9SRV9CSVQpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE5lZWQgdG8gYWNrbm93bGVkZ2UgdGhlIGZyYWdtZW50PyBUaGUgc3RhbmRhcmQgZG9lcyBub3QgZGVmaW5lIGEgbWVzc2FnZSBzZXQgdGhhdCB3aWxsIGdldCB1cyBoZXJlLiAqLworICAgICAgICAgICAgX2Rwb2VfZWFwX3Rsc19zZW5kX3Rsc19mcmFnX2Fja190b19vbnUobGlua19yZWMpOworICAgICAgICAgICAgcmMgPSBCQ01fRVJSX0lOX1BST0dSRVNTOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGxpbmtfcmVjLT5hdXRoX2N0cmwudGxzX3RvdGFsX2xlbmd0aCAhPSBsaW5rX3JlYy0+YXV0aF9jdHJsLnRsc19mcmFnX2xlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJTRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmMgPSBfZHBvZV9lYXBfdGxzX3Byb2Nlc3NfdGxzX3JlY29yZHMobGlua19yZWMpOworICAgICAgICAgICAgX2Rwb2VfZWFwX3Rsc19mcmVlX3Rsc19mcmFnX2J1ZmZlcigmbGlua19yZWMtPmF1dGhfY3RybCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKK3ZvaWQgZHBvZV9lYXBfdGxzX2NsZWFudXAoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjKQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisKKyAgICAvLyBXZSBhcmUgZG9uZSB3aXRoIHRoaXMuCisgICAgaWYgKGxpbmtfcmVjLT5hdXRoX2N0cmwuY2VydGlmaWNhdGUgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGJjbW9zX2ZyZWUobGlua19yZWMtPmF1dGhfY3RybC5jZXJ0aWZpY2F0ZSk7CisgICAgfQorCisgICAgaWYgKGxpbmtfcmVjLT5hdXRoX2N0cmwudHJhbnNfZGF0YS5yc2EgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGRwb2Vfc2VjX3JzYV9rZXlfZnJlZShsaW5rX3JlYy0+YXV0aF9jdHJsLnRyYW5zX2RhdGEucnNhKTsKKyAgICAgICAgbGlua19yZWMtPmF1dGhfY3RybC50cmFuc19kYXRhLnJzYSA9IE5VTEw7CisgICAgfQorCisgICAgbGlua19yZWMtPmF1dGhfY3RybC5jZXJ0TGVuID0gMDsKKworICAgIF9kcG9lX2VhcF90bHNfZnJlZV90bHNfZnJhZ19idWZmZXIoJmxpbmtfcmVjLT5hdXRoX2N0cmwpOworCisgICAgbWVtc2V0KCZsaW5rX3JlYy0+YXV0aF9jdHJsLCAwLCBzaXplb2YobGlua19yZWMtPmF1dGhfY3RybCkpOworfQorCitiY21vc19lcnJubyBkcG9lX2VhcF90bHNfaW5pdChmX2Rwb2Vfc2VjX2F1dGhfY2IgYXV0aF9jYiwgZl9kcG9lX3NlY19jZXJ0X3RydXN0X2NiIGNlcnRfdHJ1c3RfY2IpCit7CisgICAgX2F1dGhfY29tcGxldGUgPSBhdXRoX2NiOworICAgIF9jZXJ0X3RydXN0ID0gY2VydF90cnVzdF9jYjsKKworICAgIHJldHVybiBkcG9lX3NlY19ybmdfc2VlZCgpOworfQorCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Rwb2Vfc2VjL2Rwb2VfZWFwX3Rscy5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9kcG9lX2VhcF90bHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODRkNTU1Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9kcG9lX2VhcF90bHMuaApAQCAtMCwwICsxLDEyMiBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmICFkZWZpbmVkKF9EUE9FX0VBUF9UTFNfSF8pCisjZGVmaW5lIF9EUE9FX0VBUF9UTFNfSF8KKworI2luY2x1ZGUgImJjbW9zX3N5c3RlbS5oIgorI2luY2x1ZGUgImRwb2Vfc2VjX3V0aWwuaCIKKworI2RlZmluZSBDT1VOVF9PRl9SQU5ET01fQllURVMgMzIKKyNkZWZpbmUgU0laRV9PRl9NQVNURVJfU0VDUkVUIDQ4CisjZGVmaW5lIFNJWkVfT0ZfTUFTVEVSX1NFU1NJT05fS0VZIDY0CisjZGVmaW5lIFNJWkVfT0ZfS0VZX01BVEVSSUFMIDEyOAorI2RlZmluZSBTSVpFX09GX1JTQV9FTkNSWVBURURfQkxPQ0sgMjU2CisjZGVmaW5lIFNJWkVfT0ZfRUFQX1NFU1NJT05fSUQgNjUKKyNkZWZpbmUgU0laRV9PRl9UTFNfU0VTU0lPTl9JRCAzMgorCisvKiBUb3RhbCBsZW5ndGggb2YgdGhlIFByZU1hc3RlclNlY3JldCAqLworI2RlZmluZSBTSVpFX09GX1BSRV9NQVNURVJfU0VDUkVUIDQ4CisKK3R5cGVkZWYgZW51bQoreworICAgIERQT0VfT05VX0FVVEhfU1RBVEVfVU5BVVRIRU5USUNBVEVELAorICAgIERQT0VfT05VX0FVVEhfU1RBVEVfRUFQX1NUQVJULAorICAgIERQT0VfT05VX0FVVEhfU1RBVEVfQ0VSVF9SRVFVRVNULAorICAgIERQT0VfT05VX0FVVEhfU1RBVEVfQ0xJRU5UX0tFWV9SRUNFSVZFRCwKKyAgICBEUE9FX09OVV9BVVRIX1NUQVRFX0NFUlRfUkVDRUlWRUQsCisgICAgRFBPRV9PTlVfQVVUSF9TVEFURV9DRVJUX1ZBTElEQVRFRCwKKyAgICBEUE9FX09OVV9BVVRIX1NUQVRFX0FVVEhFTlRJQ0FURUQsCisgICAgRFBPRV9PTlVfQVVUSF9TVEFURV9GQUlMRUQKK30gZHBvZV9vbnVfYXV0aF9zdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50OF90IG1ham9yOworICAgIHVpbnQ4X3QgbWlub3I7Cit9IHRsc19wcm90b2NvbF92ZXJzaW9uOworCisjZGVmaW5lIFBST1RPQ09MX1ZFUlNJT05fU0laRSAyCisKKy8qIERQb0UgQXV0aGVudGljYXRpb24gdHJhbnNpZW50IGRhdGEgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDhfdCBjbGllbnRfcmFuZG9tW0NPVU5UX09GX1JBTkRPTV9CWVRFU107CisgICAgdWludDhfdCBzZXJ2ZXJfcmFuZG9tW0NPVU5UX09GX1JBTkRPTV9CWVRFU107CisgICAgdWludDhfdCBzZXNzaW9uX2lkW1NJWkVfT0ZfRUFQX1NFU1NJT05fSURdOworICAgIHVpbnQ4X3QgbWFzdGVyX3NlY3JldFtTSVpFX09GX01BU1RFUl9TRUNSRVRdOworICAgIHVpbnQ4X3Qga2V5X21hdGVyaWFsW1NJWkVfT0ZfS0VZX01BVEVSSUFMXTsKKyAgICB1aW50OF90IHByZV9tYXN0ZXJfc2VjcmV0W1NJWkVfT0ZfUFJFX01BU1RFUl9TRUNSRVRdOworICAgIGRwb2Vfc2VjX3NoYTFfaGFzaCBzaGExX2hhc2g7CisgICAgZHBvZV9zZWNfc2hhMV9kaWdlc3Qgc2hhMV9kaWdlc3Q7CisgICAgZHBvZV9zZWNfbWQ1X2hhc2ggbWQ1X2hhc2g7CisgICAgZHBvZV9zZWNfbWQ1X2RpZ2VzdCBtZDVfZGlnZXN0OworICAgIC8qICBBbGxvdyB0aGUga2V5IHRvIGRvdWJsZSBpbiBzaXplIGJlZm9yZSB3ZSBicmVhay4gKi8KKyAgICB1aW50OF90IGVuY3J5cHRlZF9jYWtbMiAqIFNJWkVfT0ZfUlNBX0VOQ1JZUFRFRF9CTE9DS107CisgICAgdWludDhfdCBtYXN0ZXJfc2Vzc2lvbl9rZXlbU0laRV9PRl9NQVNURVJfU0VTU0lPTl9LRVldOworICAgIGRwb2Vfc2VjX3JzYV9rZXkgKnJzYTsKK30gYXV0aF90cmFuc19kYXRhOworCit0eXBlZGVmIHN0cnVjdCBvbnVfYXV0aF9jb250cm9sCit7CisgICAgZHBvZV9vbnVfYXV0aF9zdGF0ZSBvbnVfYXV0aF9zdGF0ZTsKKyAgICB0bHNfcHJvdG9jb2xfdmVyc2lvbiB2ZXJzaW9uOworICAgIHVpbnQzMl90IGN1cnJlbnRfcGFja2V0X2lkOworICAgIHVpbnQ4X3QgKmNlcnRpZmljYXRlOworICAgIHVpbnQxNl90IGNlcnRMZW47CisgICAgdWludDhfdCAqb251X2NlcnQ7CisgICAgdWludDE2X3Qgb251X2NlcnRfbGVuOworICAgIHVpbnQzMl90IG9udV9jZXJ0X2tleV9zaXplOworICAgIHVpbnQ4X3QgKm1mZ19jZXJ0OworICAgIHVpbnQxNl90IG1mZ19jZXJ0X2xlbjsKKyAgICB1aW50OF90ICp0bHNfZnJhZ19idWZmZXI7CisgICAgdWludDMyX3QgdGxzX2ZyYWdfbGVuZ3RoOworICAgIHVpbnQzMl90IHRsc190b3RhbF9sZW5ndGg7CisgICAgYXV0aF90cmFuc19kYXRhIHRyYW5zX2RhdGE7Cit9IG9udV9hdXRoX2NvbnRyb2w7CisKK3N0cnVjdCBkcG9lX3NlY19saW5rX3JlYzsKKworLyogY2FsbGJhY2tzICovCisKK3R5cGVkZWYgdm9pZCAoKmZfZHBvZV9zZWNfYXV0aF9jYikoc3RydWN0IGRwb2Vfc2VjX2xpbmtfcmVjKiwgYmNtb3NfZXJybm8gc3RhdHVzKTsKKwordHlwZWRlZiBiY21vc19ib29sICgqZl9kcG9lX3NlY19jZXJ0X3RydXN0X2NiKShzdHJ1Y3QgZHBvZV9zZWNfbGlua19yZWMqKTsKKworLyogZnVuY3Rpb25zICovCisKK2JjbW9zX2Vycm5vIGRwb2VfZWFwX3Rsc19zZW5kX3N0YXJ0KHN0cnVjdCBkcG9lX3NlY19saW5rX3JlYyAqbGluayk7CisKK2JjbW9zX2Vycm5vIGRwb2VfZWFwX3Rsc19wcm9jZXNzX2VhcG9sX3BrdChzdHJ1Y3QgZHBvZV9zZWNfbGlua19yZWMgKmxpbmssIHVpbnQ4X3QgKm1zZywgdWludDMyX3QgbXNnX2xlbik7CisKK3ZvaWQgZHBvZV9lYXBfdGxzX2NsZWFudXAoc3RydWN0IGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rKTsKKworYmNtb3NfZXJybm8gZHBvZV9lYXBfdGxzX2luaXQoZl9kcG9lX3NlY19hdXRoX2NiIGF1dGhfY2IsIGZfZHBvZV9zZWNfY2VydF90cnVzdF9jYiBjZXJ0X3RydXN0X2NiKTsKKworI2VuZGlmIC8qIF9EUE9FX0VBUF9UTFNfSF8gKi8KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZHBvZV9zZWMvZHBvZV9zZWNfZnNtLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Rwb2Vfc2VjL2Rwb2Vfc2VjX2ZzbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2Yzk2ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Rwb2Vfc2VjL2Rwb2Vfc2VjX2ZzbS5jCkBAIC0wLDAgKzEsODI2IEBACisvKgorICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyAgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICBvZiB0aGUgc29mdHdhcmUuCisKKyAgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisgIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorICB3cml0dGVuIGNvbnNlbnQuCisKKyAgOj4KKyovCisKKyNpbmNsdWRlICJkcG9lX3NlY19mc20uaCIKKyNpbmNsdWRlICJkcG9lX3NlY191dGlsLmgiCisjaW5jbHVkZSAiYmNtb3NfaGFzaF90YWJsZS5oIgorI2luY2x1ZGUgImJjbW9sdF9lcG9uX29hbV90eXBlcy5oIgorI2luY2x1ZGUgImJjbW9sdF91dGlscy5oIgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW0uaCIKKyNpbmNsdWRlICJiY21vbHRfYXBpLmgiCisKKyNkZWZpbmUgRFBPRV9TRUNfRlNNX01BWF9MSU5LUyA2NAorI2RlZmluZSBEUE9FX1NFQ19GU01fVEFTS19NU0dfUV9TSVpFIDY0CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBEUE9FX1NFQ19GU01fREVGQVVMVF9PQU1fS0VZX0VYQ0hBTkdFX1BFUklPRCA9IDYwMDsgLyogMTAgbWludXRlcyAqLworLyoqCisgKiBAYnJpZWYgIE1heGltdW0gT05VIEF1dGhlbnRpY2F0aW9uIHRpbWVvdXQgdmFsdWUKKyAqIERQb0Ugc3BlY2lmaWNhdGlvbiBpbmRpY2F0ZXMgdGhhdCB0aGlzIHZhbHVlIGlzIDUgbWludXRlcy4KKyAqLworc3RhdGljIGNvbnN0IHVpbnQzMl90IERQT0VfU0VDX0FVVEhfVElNRU9VVCA9IDUgKiA2MCAqIDEwMDAgKiAxMDAwOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGJjbW9zX3Rhc2sgdGFzazsKKyAgICBjaGFyIHRhc2tfbmFtZVtNQVhfVEFTS19OQU1FX1NJWkVdOworICAgIGNoYXIgbXNnX3F1ZXVlX25hbWVbTUFYX01TR19RVUVVRV9OQU1FX1NJWkVdOworICAgIGhhc2hfdGFibGUgKmxpbmtfbWFwOworfSBkcG9lX3NlY19mc21fY3R4dDsKKworZHBvZV9zZWNfZnNtX2N0eHQgY3R4dFtCQ01UUl9NQVhfT0xUU107CisKK3R5cGVkZWYgdm9pZCAoKmZfZHBvZV9zZWNfZnNtKShkcG9lX3NlY19saW5rX3JlYyosIGRwb2Vfc2VjX2ZzbV9ldmVudF9kYXRhKik7CisKKy8qIERQb0UgU2VjdXJpdHkgRlNNIEV2ZW50IHR5cGUgdG8gc3RyaW5nIGRlZmluaXRpb25zIHVzZWQgZm9yIGRlYnVnIG91dHB1dCAqLworc3RhdGljIGNvbnN0IGNoYXIgKmRwb2Vfc2VjX2ZzbV9ldmVudF9uYW1lW0RQT0VfU0VDX0ZTTV9FVkVOVF9fQ09VTlRdID0KK3sKKyAgICBbRFBPRV9TRUNfRlNNX0VWRU5UX0VOQ1JZUFRfU1RBUlRdID0gIlN0YXJ0IEVuY3J5cHRpb24iLAorICAgIFtEUE9FX1NFQ19GU01fRVZFTlRfQVVUSF9TVEFSVF0gPSAiU3RhcnQgQXV0aGVudGljYXRpb24iLAorICAgIFtEUE9FX1NFQ19GU01fRVZFTlRfUlhfT0FNXSA9ICJSZWNlaXZlIE9BTSIsCisgICAgW0RQT0VfU0VDX0ZTTV9FVkVOVF9SWF9FQVBPTF0gPSAiUmVjZWl2ZSBFQVBPTCIsCisgICAgW0RQT0VfU0VDX0ZTTV9FVkVOVF9BVVRIX0NPTVBMRVRFXSA9ICJBdXRoZW50aWNhdGlvbiBDb21wbGV0ZSIsCisgICAgW0RQT0VfU0VDX0ZTTV9FVkVOVF9NS0FfQ09NUExFVEVdID0gIk1LQSBDb21wbGV0ZSIsCisgICAgW0RQT0VfU0VDX0ZTTV9FVkVOVF9USU1FT1VUXSA9ICJUaW1lb3V0IgorfTsKKworCisvKiBEUG9FIFNlY3VyaXR5IEZTTSBTdGF0ZSB0byBzdHJpbmcgZGVmaW5pdGlvbnMgdXNlZCBmb3IgZGVidWcgb3V0cHV0ICovCitzdGF0aWMgY29uc3QgY2hhciAqZHBvZV9zZWNfZnNtX3N0YXRlX25hbWVbRFBPRV9TRUNfRlNNX1NUQVRFX19DT1VOVF0gPQoreworICAgIFtEUE9FX1NFQ19GU01fU1RBVEVfSURMRV0gPSAiSWRsZSIsCisgICAgW0RQT0VfU0VDX0ZTTV9TVEFURV9BVVRIX1dBSVRdID0gIkF1dGhlbnRpY2F0aW9uIGluIHByb2dyZXNzIiwKKyAgICBbRFBPRV9TRUNfRlNNX1NUQVRFX0VOQ1JZUFRfRE9XTl9XQUlUXSA9ICJPQU0gS2V5IEV4Y2hhbmdlIGluIHByb2dyZXNzIiwKKyAgICBbRFBPRV9TRUNfRlNNX1NUQVRFX0VOQ1JZUFRfQklfV0FJVF0gPSAiTUtBIGluIHByb2dyZXNzIiwKKyAgICBbRFBPRV9TRUNfRlNNX1NUQVRFX0NPTVBMRVRFXSA9ICJBdXRoZW50aWNhdGlvbi9FbmNyeXB0aW9uIENvbXBsZXRlIgorfTsKKworc3RhdGljIGZfZHBvZV9zZWNfZnNtX2NiIF9mc21fY29tcGxldGU7CisKK3N0YXRpYyBiY21vc19ib29sIF9kcG9lX3NlY19mc21fZXZlbnRfdHlwZV9pc192YWxpZChkcG9lX3NlY19mc21fZXZlbnQgdHlwZSkKK3sKKyAgICByZXR1cm4gdHlwZSA8IERQT0VfU0VDX0ZTTV9FVkVOVF9fQ09VTlQ7Cit9CisKK3N0YXRpYyBiY21vc19ib29sIF9kcG9lX3NlY19mc21fc3RhdGVfaXNfdmFsaWQoZHBvZV9zZWNfZnNtX3N0YXRlIHN0YXRlKQoreworICAgIHJldHVybiBzdGF0ZSA8IERQT0VfU0VDX0ZTTV9TVEFURV9fQ09VTlQ7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpfZHBvZV9zZWNfZnNtX2V2ZW50X25hbWUoZHBvZV9zZWNfZnNtX2V2ZW50IHR5cGUpCit7CisgICAgaWYgKF9kcG9lX3NlY19mc21fZXZlbnRfdHlwZV9pc192YWxpZCh0eXBlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBkcG9lX3NlY19mc21fZXZlbnRfbmFtZVt0eXBlXTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuICJVbmtub3duIEV2ZW50IjsKKyAgICB9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpfZHBvZV9zZWNfZnNtX3N0YXRlX25hbWUoZHBvZV9zZWNfZnNtX3N0YXRlIHN0YXRlKQoreworICAgIGlmIChfZHBvZV9zZWNfZnNtX3N0YXRlX2lzX3ZhbGlkKHN0YXRlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBkcG9lX3NlY19mc21fc3RhdGVfbmFtZVtzdGF0ZV07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAiVW5rbm93biBTdGF0ZSI7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBfZHBvZV9zZWNfZnNtX2NvbXBsZXRlKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYykKK3sKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworCisgICAgaWYgKF9mc21fY29tcGxldGUgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIF9mc21fY29tcGxldGUobGlua19yZWMtPmRldmljZSwgbGlua19yZWMtPmtleSwgbGlua19yZWMtPnN0YXR1cyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBfZHBvZV9zZWNfZnNtX3N1Y2Nlc3MoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjKQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisKKyAgICBsaW5rX3JlYy0+ZnNtX3N0YXRlID0gRFBPRV9TRUNfRlNNX1NUQVRFX0NPTVBMRVRFOworICAgIGxpbmtfcmVjLT5zdGF0dXMgPSBCQ01fRVJSX09LOworCisgICAgc3dpdGNoIChsaW5rX3JlYy0+Y2ZnLmVuY19tb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9FTkNSWVBUSU9OX01PREVfTk9ORToKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9FTkNSWVBUSU9OX01PREVfVEVOX0JJOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfRU5DUllQVElPTl9NT0RFX09ORV9ET1dOOgorICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0VOQ1JZUFRJT05fTU9ERV9URU5fRE9XTjoKKyAgICAgICAgICAgIGJjbW9zX3RpbWVyX3N0YXJ0KAorICAgICAgICAgICAgICAgICZsaW5rX3JlYy0+dGltZW91dCwKKyAgICAgICAgICAgICAgICAoRFBPRV9TRUNfRlNNX0RFRkFVTFRfT0FNX0tFWV9FWENIQU5HRV9QRVJJT0QgKiAxMDAwICogMTAwMCkgKyBEUE9FX1NFQ19PQU1fVElNRU9VVCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEJVRygpOworICAgIH0KKworICAgIF9kcG9lX3NlY19mc21fY29tcGxldGUobGlua19yZWMpOworfQorCitzdGF0aWMgdm9pZCBfZHBvZV9zZWNfZnNtX3N0b3AoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBiY21vc19lcnJubyByZWFzb24pCit7CisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKworICAgIGxpbmtfcmVjLT5mc21fc3RhdGUgPSBEUE9FX1NFQ19GU01fU1RBVEVfSURMRTsKKyAgICBsaW5rX3JlYy0+c3RhdHVzID0gcmVhc29uOworCisgICAgYmNtb3NfdGltZXJfc3RvcCgmbGlua19yZWMtPnRpbWVvdXQpOworCisgICAgLyogQ2xlYW51cCBhbnkgRUFQLVRMUyBzdGF0ZS4gKi8KKyAgICBkcG9lX2VhcF90bHNfY2xlYW51cChsaW5rX3JlYyk7CisKKyAgICBfZHBvZV9zZWNfZnNtX2NvbXBsZXRlKGxpbmtfcmVjKTsKK30KKworc3RhdGljIHZvaWQgX2Rwb2Vfc2VjX2ZzbV9hdXRoX3N0YXJ0KGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgZHBvZV9zZWNfZnNtX2V2ZW50X2RhdGEgKmV2dCkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGV2dCA9PSBOVUxMKTsKKworICAgIC8qIFN0YXJ0IE9OVSBBdXRoZW50aWNhdGlvbiAqLworICAgIHJjID0gZHBvZV9lYXBfdGxzX3NlbmRfc3RhcnQobGlua19yZWMpOworICAgIGlmIChCQ01fRVJSX09LICE9IHJjKQorICAgIHsKKyAgICAgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsIGxpbmtfcmVjLCAiRmFpbGVkIHRvIHN0YXJ0IGF1dGhlbnRpY2F0aW9uOiAlcyAoJWQpXG4iLCBiY21vc19zdHJlcnJvcihyYyksIHJjKTsKKyAgICAgICAgX2Rwb2Vfc2VjX2ZzbV9zdG9wKGxpbmtfcmVjLCByYyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGxpbmtfcmVjLT5mc21fc3RhdGUgPSBEUE9FX1NFQ19GU01fU1RBVEVfQVVUSF9XQUlUOworICAgICAgICBiY21vc190aW1lcl9zdGFydCgmbGlua19yZWMtPnRpbWVvdXQsIERQT0VfU0VDX0FVVEhfVElNRU9VVCk7CisgICAgICAgIERQT0VfU0VDX0xJTktfTE9HKERFQlVHLCBsaW5rX3JlYywgIlN0YXJ0aW5nIGF1dGhlbnRpY2F0aW9uXG4iKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIF9kcG9lX3NlY19mc21fbWthX3N0YXJ0KGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYykKK3sKKyAgICBiY21vc19lcnJubyByYyA9IGRwb2Vfc2VjX21rYV9mc21fc3RhcnQobGlua19yZWMpOworICAgIGlmIChCQ01fRVJSX09LICE9IHJjKQorICAgIHsKKyAgICAgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsIGxpbmtfcmVjLCAiRmFpbGVkIHRvIHN0YXJ0IE1LQTogJXMgKCVkKVxuIiwgYmNtb3Nfc3RyZXJyb3IocmMpLCByYyk7CisgICAgICAgIF9kcG9lX3NlY19mc21fc3RvcChsaW5rX3JlYywgcmMpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBsaW5rX3JlYy0+ZnNtX3N0YXRlID0gRFBPRV9TRUNfRlNNX1NUQVRFX0VOQ1JZUFRfQklfV0FJVDsKKyAgICAgICAgRFBPRV9TRUNfTElOS19MT0coREVCVUcsIGxpbmtfcmVjLCAiU3RhcnRpbmcgTUtBXG4iKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIF9kcG9lX3NlY19mc21fZW5jcnlwdF9zdGFydChkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIGRwb2Vfc2VjX2ZzbV9ldmVudF9kYXRhICpldnQpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihldnQgPT0gTlVMTCk7CisKKyAgICBpZiAobGlua19yZWMtPmNmZy5lbmNfbW9kZSA9PSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9FTkNSWVBUSU9OX01PREVfVEVOX0JJKQorICAgIHsKKyAgICAgICAgX2Rwb2Vfc2VjX2ZzbV9ta2Ffc3RhcnQobGlua19yZWMpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByYyA9IGVwb25fb2FtX2Rwb2Vfc2V0X2VuY3J5cHRpb24oCisgICAgICAgICAgICBsaW5rX3JlYy0+ZGV2aWNlLAorICAgICAgICAgICAgbGlua19yZWMtPmtleS5lcG9uX25pLAorICAgICAgICAgICAgJmxpbmtfcmVjLT5rZXkubWFjX2FkZHJlc3MsCisgICAgICAgICAgICBsaW5rX3JlYy0+Y2ZnLmVuY19tb2RlLAorICAgICAgICAgICAgRFBPRV9TRUNfRlNNX0RFRkFVTFRfT0FNX0tFWV9FWENIQU5HRV9QRVJJT0QpOworICAgICAgICBpZiAoQkNNX0VSUl9PSyAhPSByYykKKyAgICAgICAgeworICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsIGxpbmtfcmVjLCAiRmFpbGVkIHRvIHNldCBlbmNyeXB0aW9uOiAlcyAoJWQpXG4iLCBiY21vc19zdHJlcnJvcihyYyksIHJjKTsKKyAgICAgICAgICAgIF9kcG9lX3NlY19mc21fc3RvcChsaW5rX3JlYywgcmMpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbGlua19yZWMtPmZzbV9zdGF0ZSA9IERQT0VfU0VDX0ZTTV9TVEFURV9FTkNSWVBUX0RPV05fV0FJVDsKKyAgICAgICAgICAgIGJjbW9zX3RpbWVyX3N0YXJ0KCZsaW5rX3JlYy0+dGltZW91dCwgRFBPRV9TRUNfT0FNX1RJTUVPVVQpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBfZHBvZV9zZWNfZnNtX2F1dGhfcnhfZWFwb2woZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBkcG9lX3NlY19mc21fZXZlbnRfZGF0YSAqZXZ0KQoreworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04oZXZ0ID09IE5VTEwpOworCisgICAgcmMgPSBkcG9lX2VhcF90bHNfcHJvY2Vzc19lYXBvbF9wa3QobGlua19yZWMsIGV2dC0+ZGF0YS5yeF9mcmFtZS52YWwsIGV2dC0+ZGF0YS5yeF9mcmFtZS5sZW4pOworICAgIGlmICgoQkNNX0VSUl9PSyAhPSByYykgJiYgKEJDTV9FUlJfSU5fUFJPR1JFU1MgIT0gcmMpKQorICAgIHsKKyAgICAgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsIGxpbmtfcmVjLCAiRXJyb3IgcHJvY2Vzc2luZyBFQVBPTCBwYWNrZXQ6ICVzICglZClcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSwgcmMpOworICAgICAgICBfZHBvZV9zZWNfZnNtX3N0b3AobGlua19yZWMsIHJjKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIF9kcG9lX3NlY19mc21fYXV0aF9jb21wbGV0ZShkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIGRwb2Vfc2VjX2ZzbV9ldmVudF9kYXRhICpldnQpCit7CisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04oZXZ0ID09IE5VTEwpOworCisgICAgYmNtb3NfdGltZXJfc3RvcCgmbGlua19yZWMtPnRpbWVvdXQpOworICAgIGlmIChCQ01fRVJSX09LID09IGV2dC0+ZGF0YS5zdWJfc3RhdHVzKQorICAgIHsKKyAgICAgICAgaWYgKGxpbmtfcmVjLT5jZmcuZW5jX21vZGUgPT0gQkNNT0xUX0VQT05fT0FNX0RQT0VfRU5DUllQVElPTl9NT0RFX1RFTl9CSSkKKyAgICAgICAgeworICAgICAgICAgICAgX2Rwb2Vfc2VjX2ZzbV9ta2Ffc3RhcnQobGlua19yZWMpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgX2Rwb2Vfc2VjX2ZzbV9zdWNjZXNzKGxpbmtfcmVjKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBfZHBvZV9zZWNfZnNtX3N0b3AobGlua19yZWMsIGV2dC0+ZGF0YS5zdWJfc3RhdHVzKTsKKyAgICB9Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfZHBvZV9zZWNfZnNtX2luc3RhbGxfZG5fa2V5KAorICAgIGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZSAqZHBvZSkKK3sKKyAgICBiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXIga2V5X2luZm87CisKKyAgICBpZiAoQkNNT0xUX0VQT05fT0FNX0RQT0VfRU5DUllQVElPTl9NT0RFX09ORV9ET1dOID09IGxpbmtfcmVjLT5jZmcuZW5jX21vZGUpCisgICAgeworICAgICAgICBrZXlfaW5mby5mb3JtYXQgPSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX0lORk9STUFUSU9OX0ZPUk1BVF9DRkI7CisgICAgICAgIG1lbWNweShrZXlfaW5mby51LmNmYi5rZXksIGRwb2UtPnUua2V5X2V4Y2hhbmdlLmtleV9kYXRhLCBzaXplb2Yoa2V5X2luZm8udS5jZmIua2V5KSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGtleV9pbmZvLmZvcm1hdCA9IEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fSU5GT1JNQVRJT05fRk9STUFUX0NUUjsKKyAgICAgICAgbWVtY3B5KGtleV9pbmZvLnUuY3RyLmtleSwgZHBvZS0+dS5rZXlfZXhjaGFuZ2Uua2V5X2RhdGEsIHNpemVvZihrZXlfaW5mby51LmN0ci5rZXkpKTsKKyAgICAgICAgbWVtY3B5KGtleV9pbmZvLnUuY3RyLnNjaSwgbGlua19yZWMtPm5pX21hYy51OCwgQkNNT1NfRVRIX0FMRU4pOworICAgICAgICBrZXlfaW5mby51LmN0ci5zY2lbNl0gPSAobGlua19yZWMtPmxsaWQgPj4gOCkgJiAweGZmOworICAgICAgICBrZXlfaW5mby51LmN0ci5zY2lbN10gPSAobGlua19yZWMtPmxsaWQgPj4gMCkgJiAweGZmOworICAgIH0KKworICAgIHJldHVybiBiY21vbHRfZXBvbl9saW5rX2VuY3J5cHRpb25fa2V5X3NldCgKKyAgICAgICAgbGlua19yZWMtPmRldmljZSwKKyAgICAgICAgJmxpbmtfcmVjLT5rZXksCisgICAgICAgIEJDTU9TX0ZBTFNFLAorICAgICAgICBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX01PREVfRVBPTl9aRVJPX09WRVJIRUFEX0FFUywKKyAgICAgICAgKGJjbW9sdF9lcG9uX2tleV9jaG9pY2UpZHBvZS0+dS5rZXlfZXhjaGFuZ2Uua2V5X251bWJlciwKKyAgICAgICAgJmtleV9pbmZvKTsKK30KKworc3RhdGljIHZvaWQgX2Rwb2Vfc2VjX2ZzbV9lbmNfZG5fcnhfb2FtKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgZHBvZV9zZWNfZnNtX2V2ZW50X2RhdGEgKmV2dCkKK3sKKyAgICBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWUgKm9hbV9mcmFtZTsKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZSAqZHBvZTsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGV2dCA9PSBOVUxMKTsKKworICAgIG9hbV9mcmFtZSA9IGVwb25fb2FtX3VucGFjayhsaW5rX3JlYy0+ZGV2aWNlLCBldnQtPmRhdGEucnhfZnJhbWUubGVuLCBldnQtPmRhdGEucnhfZnJhbWUudmFsKTsKKyAgICBpZiAoTlVMTCA9PSBvYW1fZnJhbWUpCisgICAgeworICAgICAgICBEUE9FX1NFQ19MSU5LX0xPRyhXQVJOSU5HLCBsaW5rX3JlYywgIkZhaWxlZCB0byBwYXJzZSBPQU0gZnJhbWVcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFlcG9uX29hbV9pc19kcG9lKG9hbV9mcmFtZSkpCisgICAgeworICAgICAgICBiY21vc19mcmVlKG9hbV9mcmFtZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBkcG9lID0gJm9hbV9mcmFtZS0+cHJvdG9jb2xzWzBdLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLnUuZHBvZS52YWx1ZTsKKworICAgIGlmIChlcG9uX29hbV9pc19kcG9lX2VuY3J5cHRfcmVzcG9uc2UoZHBvZSkpCisgICAgeworICAgICAgICBpZiAoKGRwb2UtPnUuc2V0X3Jlc3BvbnNlLnZhcnNbMF0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLndpZHRoID09IDB4ODApICYmCisgICAgICAgICAgICAoZHBvZS0+dS5zZXRfcmVzcG9uc2UudmFyc1sxXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUud2lkdGggPT0gMHg4MCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RpbWVyX3N0YXJ0KCZsaW5rX3JlYy0+dGltZW91dCwgRFBPRV9TRUNfT0FNX1RJTUVPVVQpOyAvKiByZXN0YXJ0IHRpbWVyIHRvIHdhaXQgZm9yIGtleSAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsIGxpbmtfcmVjLCAiT05VIHJlamVjdGVkIGVuY3J5cHRpb246IFswXSA9IDB4JXgsIFsxXSA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcG9lLT51LnNldF9yZXNwb25zZS52YXJzWzBdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwb2UtPnUuc2V0X3Jlc3BvbnNlLnZhcnNbMV0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLndpZHRoKTsKKyAgICAgICAgICAgIF9kcG9lX3NlY19mc21fc3RvcChsaW5rX3JlYywgQkNNX0VSUl9PTlVfRVJSX1JFU1ApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9LRVlfRVhDSEFOR0UgPT0gZHBvZS0+b3ApCisgICAgeworICAgICAgICBfZHBvZV9zZWNfZnNtX2luc3RhbGxfZG5fa2V5KGxpbmtfcmVjLCBkcG9lKTsKKyAgICAgICAgaWYgKGxpbmtfcmVjLT5jZmcuYXV0aCkKKyAgICAgICAgeworICAgICAgICAgICAgX2Rwb2Vfc2VjX2ZzbV9hdXRoX3N0YXJ0KGxpbmtfcmVjLCBldnQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgX2Rwb2Vfc2VjX2ZzbV9zdWNjZXNzKGxpbmtfcmVjKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBpZ25vcmUgb3RoZXIgT0FNICovCisgICAgfQorCisgICAgYmNtb3NfZnJlZShvYW1fZnJhbWUpOworfQorCitzdGF0aWMgdm9pZCBfZHBvZV9zZWNfZnNtX2VuY19iaV9yeF9vYW0oZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBkcG9lX3NlY19mc21fZXZlbnRfZGF0YSAqZXZ0KQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGV2dCA9PSBOVUxMKTsKKworICAgIGRwb2Vfc2VjX21rYV9mc21fcnhfb2FtKGxpbmtfcmVjLCBldnQtPmRhdGEucnhfZnJhbWUudmFsLCBldnQtPmRhdGEucnhfZnJhbWUubGVuKTsKK30KKworc3RhdGljIHZvaWQgX2Rwb2Vfc2VjX2ZzbV9lbmNfYmlfcnhfZWFwb2woZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBkcG9lX3NlY19mc21fZXZlbnRfZGF0YSAqZXZ0KQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGV2dCA9PSBOVUxMKTsKKworICAgIGRwb2Vfc2VjX21rYV9mc21fcnhfZWFwb2wobGlua19yZWMsIGV2dC0+ZGF0YS5yeF9mcmFtZS52YWwsIGV2dC0+ZGF0YS5yeF9mcmFtZS5sZW4pOworfQorCitzdGF0aWMgdm9pZCBfZHBvZV9zZWNfZnNtX21rYV9jb21wbGV0ZShkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIGRwb2Vfc2VjX2ZzbV9ldmVudF9kYXRhICpldnQpCit7CisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04oZXZ0ID09IE5VTEwpOworCisgICAgaWYgKEJDTV9FUlJfT0sgPT0gZXZ0LT5kYXRhLnN1Yl9zdGF0dXMpCisgICAgeworICAgICAgICBfZHBvZV9zZWNfZnNtX3N1Y2Nlc3MobGlua19yZWMpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBfZHBvZV9zZWNfZnNtX3N0b3AobGlua19yZWMsIGV2dC0+ZGF0YS5zdWJfc3RhdHVzKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIF9kcG9lX3NlY19mc21fY29tcF9yeF9vYW0oZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBkcG9lX3NlY19mc21fZXZlbnRfZGF0YSAqZXZ0KQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGV2dCA9PSBOVUxMKTsKKworICAgIGlmICgobGlua19yZWMtPmNmZy5lbmNfbW9kZSA9PSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9FTkNSWVBUSU9OX01PREVfT05FX0RPV04pIHx8CisgICAgICAgIChsaW5rX3JlYy0+Y2ZnLmVuY19tb2RlID09IEJDTU9MVF9FUE9OX09BTV9EUE9FX0VOQ1JZUFRJT05fTU9ERV9URU5fRE9XTikpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWUgKm9hbV9mcmFtZTsKKyAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2UgKmRwb2U7CisKKyAgICAgICAgb2FtX2ZyYW1lID0gZXBvbl9vYW1fdW5wYWNrKGxpbmtfcmVjLT5kZXZpY2UsIGV2dC0+ZGF0YS5yeF9mcmFtZS5sZW4sIGV2dC0+ZGF0YS5yeF9mcmFtZS52YWwpOworICAgICAgICBpZiAoTlVMTCA9PSBvYW1fZnJhbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIERQT0VfU0VDX0xJTktfTE9HKFdBUk5JTkcsIGxpbmtfcmVjLCAiRmFpbGVkIHRvIHBhcnNlIE9BTSBmcmFtZVxuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWVwb25fb2FtX2lzX2Rwb2Uob2FtX2ZyYW1lKSkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfZnJlZShvYW1fZnJhbWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZHBvZSA9ICZvYW1fZnJhbWUtPnByb3RvY29sc1swXS51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmRwb2UudmFsdWU7CisKKyAgICAgICAgaWYgKEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9LRVlfRVhDSEFOR0UgPT0gZHBvZS0+b3ApCisgICAgICAgIHsKKyAgICAgICAgICAgIF9kcG9lX3NlY19mc21faW5zdGFsbF9kbl9rZXkobGlua19yZWMsIGRwb2UpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBfZHBvZV9zZWNfZnNtX2NvbXBfcnhfZWFwb2woZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBkcG9lX3NlY19mc21fZXZlbnRfZGF0YSAqZXZ0KQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGV2dCA9PSBOVUxMKTsKKworICAgIGlmIChsaW5rX3JlYy0+Y2ZnLmVuY19tb2RlID09IEJDTU9MVF9FUE9OX09BTV9EUE9FX0VOQ1JZUFRJT05fTU9ERV9URU5fQkkpCisgICAgeworICAgICAgICBkcG9lX3NlY19ta2FfZnNtX3J4X2VhcG9sKGxpbmtfcmVjLCBldnQtPmRhdGEucnhfZnJhbWUudmFsLCBldnQtPmRhdGEucnhfZnJhbWUubGVuKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIF9kcG9lX3NlY19mc21fdGltZW91dChkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIGRwb2Vfc2VjX2ZzbV9ldmVudF9kYXRhICpldnQpCit7CisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04oZXZ0ID09IE5VTEwpOworCisgICAgX2Rwb2Vfc2VjX2ZzbV9zdG9wKGxpbmtfcmVjLCBCQ01fRVJSX1RJTUVPVVQpOworfQorCitzdGF0aWMgZl9kcG9lX3NlY19mc20gZHBvZV9zZWNfZnNtW0RQT0VfU0VDX0ZTTV9TVEFURV9fQ09VTlRdW0RQT0VfU0VDX0ZTTV9FVkVOVF9fQ09VTlRdID0KK3sKKyAgICBbRFBPRV9TRUNfRlNNX1NUQVRFX0lETEVdID0KKyAgICB7CisgICAgICAgIFtEUE9FX1NFQ19GU01fRVZFTlRfQVVUSF9TVEFSVF0gPSBfZHBvZV9zZWNfZnNtX2F1dGhfc3RhcnQsCisgICAgICAgIFtEUE9FX1NFQ19GU01fRVZFTlRfRU5DUllQVF9TVEFSVF0gPSBfZHBvZV9zZWNfZnNtX2VuY3J5cHRfc3RhcnQKKyAgICB9LAorICAgIFtEUE9FX1NFQ19GU01fU1RBVEVfQVVUSF9XQUlUXSA9CisgICAgeworICAgICAgICBbRFBPRV9TRUNfRlNNX0VWRU5UX1JYX0VBUE9MXSA9IF9kcG9lX3NlY19mc21fYXV0aF9yeF9lYXBvbCwKKyAgICAgICAgW0RQT0VfU0VDX0ZTTV9FVkVOVF9BVVRIX0NPTVBMRVRFXSA9IF9kcG9lX3NlY19mc21fYXV0aF9jb21wbGV0ZSwKKyAgICAgICAgW0RQT0VfU0VDX0ZTTV9FVkVOVF9USU1FT1VUXSA9IF9kcG9lX3NlY19mc21fdGltZW91dAorICAgIH0sCisgICAgW0RQT0VfU0VDX0ZTTV9TVEFURV9FTkNSWVBUX0RPV05fV0FJVF0gPQorICAgIHsKKyAgICAgICAgW0RQT0VfU0VDX0ZTTV9FVkVOVF9SWF9PQU1dID0gX2Rwb2Vfc2VjX2ZzbV9lbmNfZG5fcnhfb2FtLAorICAgICAgICBbRFBPRV9TRUNfRlNNX0VWRU5UX1RJTUVPVVRdID0gX2Rwb2Vfc2VjX2ZzbV90aW1lb3V0CisgICAgfSwKKyAgICBbRFBPRV9TRUNfRlNNX1NUQVRFX0VOQ1JZUFRfQklfV0FJVF0gPQorICAgIHsKKyAgICAgICAgW0RQT0VfU0VDX0ZTTV9FVkVOVF9SWF9PQU1dID0gX2Rwb2Vfc2VjX2ZzbV9lbmNfYmlfcnhfb2FtLAorICAgICAgICBbRFBPRV9TRUNfRlNNX0VWRU5UX1JYX0VBUE9MXSA9IF9kcG9lX3NlY19mc21fZW5jX2JpX3J4X2VhcG9sLAorICAgICAgICBbRFBPRV9TRUNfRlNNX0VWRU5UX01LQV9DT01QTEVURV0gPSBfZHBvZV9zZWNfZnNtX21rYV9jb21wbGV0ZSwKKyAgICAgICAgW0RQT0VfU0VDX0ZTTV9FVkVOVF9USU1FT1VUXSA9IF9kcG9lX3NlY19mc21fdGltZW91dAorICAgIH0sCisgICAgW0RQT0VfU0VDX0ZTTV9TVEFURV9DT01QTEVURV0gPQorICAgIHsKKyAgICAgICAgW0RQT0VfU0VDX0ZTTV9FVkVOVF9SWF9PQU1dID0gX2Rwb2Vfc2VjX2ZzbV9jb21wX3J4X29hbSwKKyAgICAgICAgW0RQT0VfU0VDX0ZTTV9FVkVOVF9SWF9FQVBPTF0gPSBfZHBvZV9zZWNfZnNtX2NvbXBfcnhfZWFwb2wsCisgICAgICAgIFtEUE9FX1NFQ19GU01fRVZFTlRfVElNRU9VVF0gPSBfZHBvZV9zZWNfZnNtX3RpbWVvdXQKKyAgICB9Cit9OworCitzdGF0aWMgdm9pZCBfZHBvZV9zZWNfZnNtX3VuZXhwZWN0ZWQoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBkcG9lX3NlY19mc21fZXZlbnRfZGF0YSAqZXZ0KQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGV2dCA9PSBOVUxMKTsKKworICAgIERQT0VfU0VDX0xJTktfTE9HKFdBUk5JTkcsIGxpbmtfcmVjLCAiVW5leHBlY3RlZCBldmVudCAlcyAoJXUpIGluIHN0YXRlICVzICgldSlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgX2Rwb2Vfc2VjX2ZzbV9ldmVudF9uYW1lKGV2dC0+dHlwZSksIGV2dC0+dHlwZSwgX2Rwb2Vfc2VjX2ZzbV9zdGF0ZV9uYW1lKGxpbmtfcmVjLT5mc21fc3RhdGUpLCBsaW5rX3JlYy0+ZnNtX3N0YXRlKTsKK30KKworc3RhdGljIHZvaWQgX2Rwb2Vfc2VjX2ZzbV9leGVjKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgZHBvZV9zZWNfZnNtX2V2ZW50X2RhdGEgKmV2dCkKK3sKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihldnQgPT0gTlVMTCk7CisKKyAgICBpZiAoZXZ0LT50eXBlIDwgRFBPRV9TRUNfRlNNX0VWRU5UX19DT1VOVCkKKyAgICB7CisgICAgICAgIGRwb2Vfc2VjX2ZzbV9zdGF0ZSBwcmVfc3RhdGUgPSBsaW5rX3JlYy0+ZnNtX3N0YXRlOworCisgICAgICAgIGlmIChkcG9lX3NlY19mc21bbGlua19yZWMtPmZzbV9zdGF0ZV1bZXZ0LT50eXBlXSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBEUE9FX1NFQ19MSU5LX0xPRyhERUJVRywgbGlua19yZWMsICJwcm9jZXNzaW5nIGV2ZW50ICVzIGluIHN0YXRlICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Rwb2Vfc2VjX2ZzbV9ldmVudF9uYW1lKGV2dC0+dHlwZSksIF9kcG9lX3NlY19mc21fc3RhdGVfbmFtZShsaW5rX3JlYy0+ZnNtX3N0YXRlKSk7CisgICAgICAgICAgICBkcG9lX3NlY19mc21bbGlua19yZWMtPmZzbV9zdGF0ZV1bZXZ0LT50eXBlXShsaW5rX3JlYywgZXZ0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIF9kcG9lX3NlY19mc21fdW5leHBlY3RlZChsaW5rX3JlYywgZXZ0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsaW5rX3JlYy0+ZnNtX3N0YXRlICE9IHByZV9zdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coREVCVUcsIGxpbmtfcmVjLCAidHJhbnNpdGlvbiBmcm9tICVzIHRvICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Rwb2Vfc2VjX2ZzbV9zdGF0ZV9uYW1lKHByZV9zdGF0ZSksIF9kcG9lX3NlY19mc21fc3RhdGVfbmFtZShsaW5rX3JlYy0+ZnNtX3N0YXRlKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsIGxpbmtfcmVjLCAiVW5rbm93biBldmVudDogJXUiLCBldnQtPnR5cGUpOworICAgIH0KK30KKworc3RhdGljIGJjbW9zX3RpbWVyX3JjIF9kcG9lX3NlY19mc21fbGlua190aW1lcl9leHBpcmVkKGJjbW9zX3RpbWVyICp0aW1lciwgbG9uZyBkYXRhKQoreworICAgIGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYyA9IChkcG9lX3NlY19saW5rX3JlYyopZGF0YTsKKyAgICBkcG9lX3NlY19mc21fZXZlbnRfZGF0YSBldnQ7CisKKyAgICBldnQudHlwZSA9IERQT0VfU0VDX0ZTTV9FVkVOVF9USU1FT1VUOworCisgICAgX2Rwb2Vfc2VjX2ZzbV9leGVjKGxpbmtfcmVjLCAmZXZ0KTsKKworICAgIHJldHVybiBCQ01PU19USU1FUl9PSzsKK30KKworc3RhdGljIHZvaWQgX2Rwb2Vfc2VjX2ZzbV9saW5rX3N0YXJ0X2hhbmRsZShiY21vc19tb2R1bGVfaWQgbW9kdWxlX2lkLCBiY21vc19tc2cgKm9zX21zZykKK3sKKyAgICBkcG9lX3NlY19mc21fbXNnICptc2cgPSAoZHBvZV9zZWNfZnNtX21zZyopb3NfbXNnOworICAgIGJjbW9sdF9kZXZpZCBkZXZpY2UgPSBvc19tc2ctPmluc3RhbmNlOworICAgIGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYzsKKyAgICBkcG9lX3NlY19mc21fZXZlbnRfZGF0YSBldnQ7CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgbGlua19yZWMgPSBoYXNoX3RhYmxlX2dldChjdHh0W2RldmljZV0ubGlua19tYXAsIChjb25zdCB1aW50OF90KikmbXNnLT5saW5rKTsKKyAgICBpZiAobGlua19yZWMgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGRwb2Vfc2VjX2xpbmtfcmVjIG5ld19saW5rOworICAgICAgICBiY21vbHRfZXBvbl9uaV9jZmcgcG9uX2NmZzsKKyAgICAgICAgYmNtb2x0X2Vwb25fbGlua19jZmcgbGlua19jZmc7CisgICAgICAgIGJjbW9sdF9lcG9uX25pX2tleSBwb25fa2V5ID0geyAuZXBvbl9uaSA9IG1zZy0+bGluay5lcG9uX25pIH07CisgICAgICAgIGJjbW9zX3RpbWVyX3Bhcm0gdHAgPQorICAgICAgICB7CisgICAgICAgICAgICAubmFtZSA9ICJkcG9lX3NlY19mc21fdGltZXIiLAorICAgICAgICAgICAgLm93bmVyID0gQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9EUE9FX1NFQyArIGRldmljZSwKKyAgICAgICAgICAgIC5wZXJpb2RpYyA9IEJDTU9TX0ZBTFNFLAorICAgICAgICAgICAgLmhhbmRsZXIgPSBfZHBvZV9zZWNfZnNtX2xpbmtfdGltZXJfZXhwaXJlZCwKKyAgICAgICAgICAgIC5mbGFncyA9IEJDTU9TX1RJTUVSX1BBUk1fRkxBR1NfTk9OX1VSR0VOVAorICAgICAgICB9OworCisgICAgICAgIC8qIHJldHJpZXZlIHRoZSBFUE9OIE5JIE1BQyBhZGRyZXNzICovCisgICAgICAgIEJDTU9MVF9DRkdfSU5JVCgmcG9uX2NmZywgZXBvbl9uaSwgcG9uX2tleSk7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJnBvbl9jZmcsIGVwb25fbmksIG1hY19hZGRyZXNzKTsKKyAgICAgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlLCAmcG9uX2NmZy5oZHIpOworICAgICAgICBCVUdfT04oQkNNX0VSUl9PSyAhPSBlcnIpOworCisgICAgICAgIEJDTU9MVF9DRkdfSU5JVCgmbGlua19jZmcsIGVwb25fbGluaywgbXNnLT5saW5rKTsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmbGlua19jZmcsIGVwb25fbGluaywgbGxpZCk7CisgICAgICAgIGVyciA9IGJjbW9sdF9jZmdfZ2V0KGRldmljZSwgJmxpbmtfY2ZnLmhkcik7CisgICAgICAgIGlmIChCQ01fRVJSX09LICE9IGVycikKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgZHBvZV9zZWNfbG9nX2lkW2RldmljZV0sICJGYWlsZWQgdG8gZ2V0IExMSURcbiIpOworICAgICAgICB9CisKKyAgICAgICAgbmV3X2xpbmsuZGV2aWNlID0gZGV2aWNlOworICAgICAgICBuZXdfbGluay5rZXkgPSBtc2ctPmxpbms7CisgICAgICAgIG5ld19saW5rLm5pX21hYyA9IHBvbl9jZmcuZGF0YS5tYWNfYWRkcmVzczsKKyAgICAgICAgbmV3X2xpbmsubGxpZCA9IGxpbmtfY2ZnLmRhdGEubGxpZDsKKyAgICAgICAgbmV3X2xpbmsuZnNtX3N0YXRlID0gRFBPRV9TRUNfRlNNX1NUQVRFX0lETEU7CisgICAgICAgIG5ld19saW5rLnN0YXR1cyA9IEJDTV9FUlJfSU5fUFJPR1JFU1M7CisKKyAgICAgICAgLyogYWRkIG5ldyByZWMgdG8gaGFzaCB0YWJsZSAqLworICAgICAgICBsaW5rX3JlYyA9IGhhc2hfdGFibGVfcHV0KGN0eHRbZGV2aWNlXS5saW5rX21hcCwgKHVpbnQ4X3QqKSZtc2ctPmxpbmssICZuZXdfbGluayk7CisgICAgICAgIGlmIChsaW5rX3JlYyA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBEUE9FX1NFQ19MSU5LX0xPRyhFUlJPUiwgJm5ld19saW5rLCAiRmFpbGVkIHRvIHN0b3JlIGxpbmsgcmVjb3JkXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHRwLmRhdGEgPSAobG9uZylsaW5rX3JlYzsKKyAgICAgICAgZXJyID0gYmNtb3NfdGltZXJfY3JlYXRlKCZsaW5rX3JlYy0+dGltZW91dCwgJnRwKTsKKyAgICAgICAgQlVHX09OKEJDTV9FUlJfT0sgIT0gZXJyKTsKKyAgICB9CisKKyAgICBsaW5rX3JlYy0+Y2ZnID0gbXNnLT5kYXRhLnN0YXJ0OworCisgICAgaWYgKCFsaW5rX3JlYy0+Y2ZnLmF1dGggfHwgKGxpbmtfcmVjLT5jZmcuZW5jX21vZGUgIT0gQkNNT0xUX0VQT05fT0FNX0RQT0VfRU5DUllQVElPTl9NT0RFX1RFTl9CSSkpCisgICAgeworICAgICAgICBldnQudHlwZSA9IERQT0VfU0VDX0ZTTV9FVkVOVF9FTkNSWVBUX1NUQVJUOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBldnQudHlwZSA9IERQT0VfU0VDX0ZTTV9FVkVOVF9BVVRIX1NUQVJUOworICAgIH0KKworICAgIF9kcG9lX3NlY19mc21fZXhlYyhsaW5rX3JlYywgJmV2dCk7CisKKyAgICBiY21vc19mcmVlKG9zX21zZyk7Cit9CisKK3N0YXRpYyB2b2lkIF9kcG9lX3NlY19mc21fbGlua19yeF9vYW1faGFuZGxlKGJjbW9zX21vZHVsZV9pZCBtb2R1bGVfaWQsIGJjbW9zX21zZyAqb3NfbXNnKQoreworICAgIGRwb2Vfc2VjX2ZzbV9tc2cgKm1zZyA9IChkcG9lX3NlY19mc21fbXNnKilvc19tc2c7CisgICAgYmNtb2x0X2RldmlkIGRldmljZSA9IG9zX21zZy0+aW5zdGFuY2U7CisgICAgZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjOworICAgIGRwb2Vfc2VjX2ZzbV9ldmVudF9kYXRhIGV2dDsKKworICAgIGxpbmtfcmVjID0gaGFzaF90YWJsZV9nZXQoY3R4dFtkZXZpY2VdLmxpbmtfbWFwLCAodWludDhfdCopJm1zZy0+bGluayk7CisgICAgaWYgKGxpbmtfcmVjID09IE5VTEwpCisgICAgeworICAgICAgICBCQ01fTE9HKERFQlVHLCBkcG9lX3NlY19sb2dfaWRbZGV2aWNlXSwgIkZhaWxlZCB0byBmaW5kIGxpbms6IFBPTiAldSwgIkJDTU9TX01BQ0FERFJfRk1UX1NUUiJcbiIsCisgICAgICAgICAgICAgICAgbXNnLT5saW5rLmVwb25fbmksIEJDTU9TX01BQ0FERFJfUEFSQU1TKCZtc2ctPmxpbmsubWFjX2FkZHJlc3MpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZXZ0LnR5cGUgPSBEUE9FX1NFQ19GU01fRVZFTlRfUlhfT0FNOworICAgICAgICBldnQuZGF0YS5yeF9mcmFtZS52YWwgPSBtc2ctPmRhdGEucnhfZnJhbWUuZnJhbWU7CisgICAgICAgIGV2dC5kYXRhLnJ4X2ZyYW1lLmxlbiA9IG1zZy0+ZGF0YS5yeF9mcmFtZS5sZW5ndGg7CisgICAgICAgIF9kcG9lX3NlY19mc21fZXhlYyhsaW5rX3JlYywgJmV2dCk7CisgICAgfQorCisgICAgYmNtb3NfZnJlZShtc2ctPmRhdGEucnhfZnJhbWUuZnJhbWUpOworICAgIGJjbW9zX2ZyZWUob3NfbXNnKTsKK30KKworc3RhdGljIHZvaWQgX2Rwb2Vfc2VjX2ZzbV9saW5rX3J4X2VhcG9sX2hhbmRsZShiY21vc19tb2R1bGVfaWQgbW9kdWxlX2lkLCBiY21vc19tc2cgKm9zX21zZykKK3sKKyAgICBkcG9lX3NlY19mc21fbXNnICptc2cgPSAoZHBvZV9zZWNfZnNtX21zZyopb3NfbXNnOworICAgIGJjbW9sdF9kZXZpZCBkZXZpY2UgPSBvc19tc2ctPmluc3RhbmNlOworICAgIGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYzsKKyAgICBkcG9lX3NlY19mc21fZXZlbnRfZGF0YSBldnQ7CisKKyAgICBsaW5rX3JlYyA9IGhhc2hfdGFibGVfZ2V0KGN0eHRbZGV2aWNlXS5saW5rX21hcCwgKHVpbnQ4X3QqKSZtc2ctPmxpbmspOworICAgIGlmIChsaW5rX3JlYyA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhJTkZPLCBkcG9lX3NlY19sb2dfaWRbZGV2aWNlXSwgIkZhaWxlZCB0byBmaW5kIGxpbms6IFBPTiAldSwgIkJDTU9TX01BQ0FERFJfRk1UX1NUUiJcbiIsCisgICAgICAgICAgICAgICAgbXNnLT5saW5rLmVwb25fbmksIEJDTU9TX01BQ0FERFJfUEFSQU1TKCZtc2ctPmxpbmsubWFjX2FkZHJlc3MpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZXZ0LnR5cGUgPSBEUE9FX1NFQ19GU01fRVZFTlRfUlhfRUFQT0w7CisgICAgICAgIGV2dC5kYXRhLnJ4X2ZyYW1lLnZhbCA9IG1zZy0+ZGF0YS5yeF9mcmFtZS5mcmFtZTsKKyAgICAgICAgZXZ0LmRhdGEucnhfZnJhbWUubGVuID0gbXNnLT5kYXRhLnJ4X2ZyYW1lLmxlbmd0aDsKKyAgICAgICAgX2Rwb2Vfc2VjX2ZzbV9leGVjKGxpbmtfcmVjLCAmZXZ0KTsKKyAgICB9CisKKyAgICBiY21vc19mcmVlKG9zX21zZyk7Cit9CisKK3N0YXRpYyB2b2lkIF9kcG9lX3NlY19mc21fbGlua19hdXRoX2NvbXBsZXRlKGRwb2Vfc2VjX2xpbmtfcmVjKiBsaW5rX3JlYywgYmNtb3NfZXJybm8gc3RhdHVzKQoreworICAgIGRwb2Vfc2VjX2ZzbV9ldmVudF9kYXRhIGV2dDsKKworICAgIGV2dC50eXBlID0gRFBPRV9TRUNfRlNNX0VWRU5UX0FVVEhfQ09NUExFVEU7CisgICAgZXZ0LmRhdGEuc3ViX3N0YXR1cyA9IHN0YXR1czsKKworICAgIF9kcG9lX3NlY19mc21fZXhlYyhsaW5rX3JlYywgJmV2dCk7Cit9CisKK3N0YXRpYyB2b2lkIF9kcG9lX3NlY19mc21fbGlua19ta2FfY29tcGxldGUoZHBvZV9zZWNfbGlua19yZWMqIGxpbmtfcmVjLCBiY21vc19lcnJubyBzdGF0dXMpCit7CisgICAgZHBvZV9zZWNfZnNtX2V2ZW50X2RhdGEgZXZ0OworCisgICAgZXZ0LnR5cGUgPSBEUE9FX1NFQ19GU01fRVZFTlRfTUtBX0NPTVBMRVRFOworICAgIGV2dC5kYXRhLnN1Yl9zdGF0dXMgPSBzdGF0dXM7CisKKyAgICBfZHBvZV9zZWNfZnNtX2V4ZWMobGlua19yZWMsICZldnQpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2Rwb2Vfc2VjX2ZzbV9pbml0X3Rhc2soYmNtb2x0X2RldmlkIGRldmljZSkKK3sKKyAgICBiY21vc190YXNrX3Bhcm0gdGFza19wYXJhbXMgPQorICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9IGN0eHRbZGV2aWNlXS50YXNrX25hbWUsCisgICAgICAgIC5wcmlvcml0eSAgICAgPSBUQVNLX1BSSU9SSVRZX1VTRVJfQVBQTF9EUE9FX1NFQywKKyAgICAgICAgLmNvcmUgICAgICAgICA9IEJDTU9TX0NQVV9DT1JFX0FOWSwgLyogTm8gQ1BVIGFmZmluaXR5ICovCisgICAgICAgIC5pbml0X2hhbmRsZXIgPSBOVUxMCisgICAgfTsKKyAgICBzbnByaW50ZihjdHh0W2RldmljZV0udGFza19uYW1lLCBzaXplb2YoY3R4dFtkZXZpY2VdLnRhc2tfbmFtZSksICJ1c2VyX2FwcGxfZHBvZV9zZWMldSIsIGRldmljZSk7CisgICAgYmNtb3NfZXJybm8gcmMgPSBiY21vc190YXNrX2NyZWF0ZSgmY3R4dFtkZXZpY2VdLnRhc2ssICZ0YXNrX3BhcmFtcyk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKworc3RhdGljIGJjbW9zX2Vycm5vIF9kcG9lX3NlY19mc21faW5pdF9tb2R1bGUoYmNtb2x0X2RldmlkIGRldmljZSkKK3sKKyAgICBiY21vc19tb2R1bGVfcGFybSBtb2R1bGVfcGFyYW1zID0KKyAgICB7CisgICAgICAgIC5xcGFybSA9IHsgLm5hbWUgPSBjdHh0W2RldmljZV0ubXNnX3F1ZXVlX25hbWUsIC5zaXplID0gRFBPRV9TRUNfRlNNX1RBU0tfTVNHX1FfU0laRSB9LAorICAgICAgICAuaW5pdCA9IE5VTEwKKyAgICB9OworICAgIHNucHJpbnRmKGN0eHRbZGV2aWNlXS5tc2dfcXVldWVfbmFtZSwgc2l6ZW9mKGN0eHRbZGV2aWNlXS5tc2dfcXVldWVfbmFtZSksICJkcG9lX3NlY19tc2dfcSV1IiwgZGV2aWNlKTsKKyAgICByZXR1cm4gYmNtb3NfbW9kdWxlX2NyZWF0ZShCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX0RQT0VfU0VDICsgZGV2aWNlLCAmY3R4dFtkZXZpY2VdLnRhc2ssICZtb2R1bGVfcGFyYW1zKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9kcG9lX3NlY19mc21fc2VuZF9vc19tc2coCisgICAgYmNtb2x0X2RldmlkIGRldmljZSwKKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBsaW5rX2tleSwKKyAgICBiY21vc19tc2dfaWQgdHlwZSwKKyAgICBkcG9lX3NlY19mc21fbXNnX2RhdGEgKmRhdGEpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgZHBvZV9zZWNfZnNtX21zZyAqbXNnID0gYmNtb3NfY2FsbG9jKHNpemVvZigqbXNnKSk7CisgICAgaWYgKG1zZyA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgZHBvZV9zZWNfbG9nX2lkW2RldmljZV0sICJPUyBNZXNzYWdlIGNhbGxvYyBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICB9CisKKyAgICBtc2ctPm9zX21zZy5pbnN0YW5jZSA9IGRldmljZTsKKyAgICBtc2ctPm9zX21zZy50eXBlID0gdHlwZTsKKyAgICBtc2ctPmxpbmsgPSBsaW5rX2tleTsKKyAgICBtc2ctPmRhdGEgPSAqZGF0YTsKKyAgICByYyA9IGJjbW9zX21zZ19kaXNwYXRjaCgmbXNnLT5vc19tc2csIEJDTU9TX01TR19TRU5EX0FVVE9fRlJFRSk7CisgICAgaWYgKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBkcG9lX3NlY19sb2dfaWRbZGV2aWNlXSwgIk9TIE1lc3NhZ2Ugc2VuZCBmYWlsZWQgKCVzKVxuIiwgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKK2JjbW9zX2Vycm5vIGRwb2Vfc2VjX2ZzbV9saW5rX3N0YXJ0KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGxpbmtfa2V5LCBkcG9lX3NlY19mc21fc3RhcnRfZGF0YSAqY2ZnKQoreworICAgIGRwb2Vfc2VjX2ZzbV9tc2dfZGF0YSBkYXRhOworCisgICAgZGF0YS5zdGFydCA9ICpjZmc7CisKKyAgICByZXR1cm4gX2Rwb2Vfc2VjX2ZzbV9zZW5kX29zX21zZyhkZXZpY2UsIGxpbmtfa2V5LCBCQ01PU19NU0dfSURfRFBPRV9TRUNfU1RBUlQsICZkYXRhKTsKK30KKworYmNtb3NfZXJybm8gZHBvZV9zZWNfZnNtX2xpbmtfcnhfb2FtKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGxpbmtfa2V5LCB1aW50OF90ICpvYW0sIHVpbnQxNl90IGxlbmd0aCkKK3sKKyAgICBkcG9lX3NlY19mc21fbXNnX2RhdGEgZGF0YTsKKworICAgIGRhdGEucnhfZnJhbWUuZnJhbWUgPSBvYW07CisgICAgZGF0YS5yeF9mcmFtZS5sZW5ndGggPSBsZW5ndGg7CisKKyAgICByZXR1cm4gX2Rwb2Vfc2VjX2ZzbV9zZW5kX29zX21zZyhkZXZpY2UsIGxpbmtfa2V5LCBCQ01PU19NU0dfSURfRFBPRV9TRUNfUlhfT0FNLCAmZGF0YSk7Cit9CisKK2JjbW9zX2Vycm5vIGRwb2Vfc2VjX2ZzbV9saW5rX3J4X2VhcG9sKAorICAgIGJjbW9sdF9kZXZpZCBkZXZpY2UsCisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkgbGlua19rZXksCisgICAgdWludDhfdCAqZWFwb2wsCisgICAgdWludDE2X3QgbGVuZ3RoKQoreworICAgIGRwb2Vfc2VjX2ZzbV9tc2dfZGF0YSBkYXRhOworCisgICAgZGF0YS5yeF9mcmFtZS5mcmFtZSA9IGVhcG9sOworICAgIGRhdGEucnhfZnJhbWUubGVuZ3RoID0gbGVuZ3RoOworCisgICAgcmV0dXJuIF9kcG9lX3NlY19mc21fc2VuZF9vc19tc2coZGV2aWNlLCBsaW5rX2tleSwgQkNNT1NfTVNHX0lEX0RQT0VfU0VDX1JYX0VBUE9MLCAmZGF0YSk7Cit9CisKK2JjbW9zX2Vycm5vIGRwb2Vfc2VjX2ZzbV9pbml0KAorICAgIGZfZHBvZV9zZWNfY2VydF90cnVzdF9jYiBjZXJ0X3RydXN0X2NiLAorICAgIGZfZHBvZV9zZWNfZnNtX2NiIGZzbV9jb21wbGV0ZV9jYikKK3sKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIGZvciAodWludDMyX3QgZGV2aWNlID0gMDsgZGV2aWNlIDwgQkNNVFJfTUFYX09MVFM7IGRldmljZSsrKQorICAgIHsKKyAgICAgICAgcmMgPSBfZHBvZV9zZWNfZnNtX2luaXRfdGFzayhkZXZpY2UpOworICAgICAgICBCVUdfT04ocmMgIT0gQkNNX0VSUl9PSyk7CisKKyAgICAgICAgcmMgPSBfZHBvZV9zZWNfZnNtX2luaXRfbW9kdWxlKGRldmljZSk7CisgICAgICAgIEJVR19PTihyYyAhPSBCQ01fRVJSX09LKTsKKworICAgICAgICBjaGFyIGxvZ19uYW1lW01BWF9ERVZfTE9HX0lEX05BTUVdOworICAgICAgICBzbnByaW50Zihsb2dfbmFtZSwgc2l6ZW9mKGxvZ19uYW1lKSwgInVzZXJfYXBwbF9kcG9lX3NlYyV1IiwgZGV2aWNlKTsKKyAgICAgICAgZHBvZV9zZWNfbG9nX2lkW2RldmljZV0gPSBiY21fZGV2X2xvZ19pZF9yZWdpc3Rlcihsb2dfbmFtZSwgREVWX0xPR19MRVZFTF9JTkZPLCBERVZfTE9HX0lEX1RZUEVfQk9USCk7CisKKyAgICAgICAgYmNtb3NfbXNnX3JlZ2lzdGVyKAorICAgICAgICAgICAgQkNNT1NfTVNHX0lEX0RQT0VfU0VDX1NUQVJULAorICAgICAgICAgICAgZGV2aWNlLAorICAgICAgICAgICAgQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9EUE9FX1NFQyArIGRldmljZSwKKyAgICAgICAgICAgIF9kcG9lX3NlY19mc21fbGlua19zdGFydF9oYW5kbGUpOworICAgICAgICBiY21vc19tc2dfcmVnaXN0ZXIoCisgICAgICAgICAgICBCQ01PU19NU0dfSURfRFBPRV9TRUNfUlhfT0FNLAorICAgICAgICAgICAgZGV2aWNlLAorICAgICAgICAgICAgQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9EUE9FX1NFQyArIGRldmljZSwKKyAgICAgICAgICAgIF9kcG9lX3NlY19mc21fbGlua19yeF9vYW1faGFuZGxlKTsKKyAgICAgICAgYmNtb3NfbXNnX3JlZ2lzdGVyKAorICAgICAgICAgICAgQkNNT1NfTVNHX0lEX0RQT0VfU0VDX1JYX0VBUE9MLAorICAgICAgICAgICAgZGV2aWNlLAorICAgICAgICAgICAgQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9EUE9FX1NFQyArIGRldmljZSwKKyAgICAgICAgICAgIF9kcG9lX3NlY19mc21fbGlua19yeF9lYXBvbF9oYW5kbGUpOworCisgICAgICAgIGN0eHRbZGV2aWNlXS5saW5rX21hcCA9IGhhc2hfdGFibGVfY3JlYXRlKAorICAgICAgICAgICAgRFBPRV9TRUNfRlNNX01BWF9MSU5LUywKKyAgICAgICAgICAgIHNpemVvZihkcG9lX3NlY19saW5rX3JlYyksCisgICAgICAgICAgICBzaXplb2YoYmNtb2x0X2Vwb25fbGlua19rZXkpLAorICAgICAgICAgICAgImRwb2Vfc2VjX2xpbmtfc3RhdGUiKTsKKyAgICAgICAgQlVHX09OKGN0eHRbZGV2aWNlXS5saW5rX21hcCA9PSBOVUxMKTsKKyAgICB9CisKKyAgICBfZnNtX2NvbXBsZXRlID0gZnNtX2NvbXBsZXRlX2NiOworCisgICAgZHBvZV9lYXBfdGxzX2luaXQoX2Rwb2Vfc2VjX2ZzbV9saW5rX2F1dGhfY29tcGxldGUsIGNlcnRfdHJ1c3RfY2IpOworICAgIGRwb2Vfc2VjX21rYV9mc21faW5pdChfZHBvZV9zZWNfZnNtX2xpbmtfbWthX2NvbXBsZXRlKTsKKworICAgIHJldHVybiByYzsKK30KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9kcG9lX3NlY19mc20uaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZHBvZV9zZWMvZHBvZV9zZWNfZnNtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE4YjNhZAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZHBvZV9zZWMvZHBvZV9zZWNfZnNtLmgKQEAgLTAsMCArMSwxMzAgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgX0RQT0VfU0VDX0ZTTV9IXworI2RlZmluZSBfRFBPRV9TRUNfRlNNX0hfCisKKyNpbmNsdWRlICJiY21vc19zeXN0ZW0uaCIKKyNpbmNsdWRlICJiY21vbHRfbW9kZWxfdHlwZXMuaCIKKyNpbmNsdWRlICJiY21vbHRfZXBvbl9vYW1fdHlwZXMuaCIKKyNpbmNsdWRlICJkcG9lX2VhcF90bHMuaCIKKyNpbmNsdWRlICJkcG9lX3NlY19ta2FfZnNtLmgiCisKKy8qIERQb0UgU2VjdXJpdHkgRlNNIEV2ZW50IFR5cGUgZGVmaW5pdGlvbnMgKi8KK3R5cGVkZWYgZW51bSBkcG9lX3NlY19mc21fZXZlbnQKK3sKKyAgICBEUE9FX1NFQ19GU01fRVZFTlRfX0ZJUlNULAorICAgIERQT0VfU0VDX0ZTTV9FVkVOVF9FTkNSWVBUX1NUQVJUID0gRFBPRV9TRUNfRlNNX0VWRU5UX19GSVJTVCwKKyAgICBEUE9FX1NFQ19GU01fRVZFTlRfQVVUSF9TVEFSVCwKKyAgICBEUE9FX1NFQ19GU01fRVZFTlRfUlhfT0FNLAorICAgIERQT0VfU0VDX0ZTTV9FVkVOVF9SWF9FQVBPTCwKKyAgICBEUE9FX1NFQ19GU01fRVZFTlRfQVVUSF9DT01QTEVURSwKKyAgICBEUE9FX1NFQ19GU01fRVZFTlRfTUtBX0NPTVBMRVRFLAorICAgIERQT0VfU0VDX0ZTTV9FVkVOVF9USU1FT1VULAorCisgICAgRFBPRV9TRUNfRlNNX0VWRU5UX19DT1VOVAorfSBkcG9lX3NlY19mc21fZXZlbnQ7CisKKy8qIERQb0UgU2VjdXJpdHkgRlNNIFN0YXRlIGRlZmluaXRpb25zICovCit0eXBlZGVmIGVudW0gZHBvZV9zZWNfZnNtX3N0YXRlCit7CisgICAgRFBPRV9TRUNfRlNNX1NUQVRFX19GSVJTVCwKKyAgICBEUE9FX1NFQ19GU01fU1RBVEVfSURMRSA9IERQT0VfU0VDX0ZTTV9TVEFURV9fRklSU1QsCisgICAgRFBPRV9TRUNfRlNNX1NUQVRFX0FVVEhfV0FJVCwKKyAgICBEUE9FX1NFQ19GU01fU1RBVEVfRU5DUllQVF9ET1dOX1dBSVQsCisgICAgRFBPRV9TRUNfRlNNX1NUQVRFX0VOQ1JZUFRfQklfV0FJVCwKKyAgICBEUE9FX1NFQ19GU01fU1RBVEVfQ09NUExFVEUsCisKKyAgICBEUE9FX1NFQ19GU01fU1RBVEVfX0NPVU5UCit9IGRwb2Vfc2VjX2ZzbV9zdGF0ZTsKKworLyogRFBvRSBTZWN1cml0eSBGU00gRXZlbnQgY29udGVudHMuIFRoaXMgaXMgYSB1bmlvbiBvZiBpbmZvcm1hdGlvbiByZXF1aXJlZCBieSB0aGUgRFBvRSBTZWN1cml0eSBGU00uIFRoaXMgZGF0YSB0eXBlCisgKiBwZXJtaXRzIGEgY29tbW9uIGZ1bmN0aW9uIHByb3RvdHlwZSBmb3IgdGhlIHN0YXRlIG1hY2hpbmUgZnVuY3Rpb24gdGFibGUuICovCit0eXBlZGVmIHN0cnVjdCBkcG9lX3NlY19mc21fZXZlbnRfZGF0YQoreworICAgIGRwb2Vfc2VjX2ZzbV9ldmVudCB0eXBlOworICAgIHVuaW9uCisgICAgeworICAgICAgICBiY21vbHRfdThfbGlzdF91MTYgcnhfZnJhbWU7CisgICAgICAgIGJjbW9zX2Vycm5vIHN1Yl9zdGF0dXM7CisgICAgfSBkYXRhOworfSBkcG9lX3NlY19mc21fZXZlbnRfZGF0YTsKKworc3RydWN0IGRwb2Vfc2VjX2xpbmtfcmVjOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX2VuY3J5cHRpb25fbW9kZSBlbmNfbW9kZTsKKyAgICBiY21vc19ib29sIGF1dGg7Cit9IGRwb2Vfc2VjX2ZzbV9zdGFydF9kYXRhOworCit0eXBlZGVmIHN0cnVjdCBkcG9lX3NlY19saW5rX3JlYworeworICAgIGJjbW9sdF9kZXZpZCBkZXZpY2U7CisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkga2V5OworICAgIGRwb2Vfc2VjX2ZzbV9zdGFydF9kYXRhIGNmZzsKKyAgICBiY21vc19tYWNfYWRkcmVzcyBuaV9tYWM7CisgICAgYmNtb2x0X2Vwb25fbGxpZCBsbGlkOworICAgIGRwb2Vfc2VjX2ZzbV9zdGF0ZSBmc21fc3RhdGU7CisgICAgYmNtb3NfZXJybm8gc3RhdHVzOworICAgIGJjbW9zX3RpbWVyIHRpbWVvdXQ7CisgICAgb251X2F1dGhfY29udHJvbCBhdXRoX2N0cmw7CisgICAgZHBvZV9zZWNfbWthX2ZzbV9jdHJsIG1rYV9jdHJsOworfSBkcG9lX3NlY19saW5rX3JlYzsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50OF90ICpmcmFtZTsKKyAgICB1aW50MTZfdCBsZW5ndGg7Cit9IGRwb2Vfc2VjX2ZzbV9yeF9mcmFtZV9kYXRhOworCit0eXBlZGVmIHVuaW9uCit7CisgICAgZHBvZV9zZWNfZnNtX3N0YXJ0X2RhdGEgc3RhcnQ7CisgICAgZHBvZV9zZWNfZnNtX3J4X2ZyYW1lX2RhdGEgcnhfZnJhbWU7Cit9IGRwb2Vfc2VjX2ZzbV9tc2dfZGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21vc19tc2cgb3NfbXNnOworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGxpbms7CisgICAgZHBvZV9zZWNfZnNtX21zZ19kYXRhIGRhdGE7Cit9IGRwb2Vfc2VjX2ZzbV9tc2c7CisKK3R5cGVkZWYgdm9pZCAoKmZfZHBvZV9zZWNfZnNtX2NiKShiY21vbHRfZGV2aWQsIGJjbW9sdF9lcG9uX2xpbmtfa2V5LCBiY21vc19lcnJubyk7CisKK2JjbW9zX2Vycm5vIGRwb2Vfc2VjX2ZzbV9saW5rX3N0YXJ0KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGxpbmtfa2V5LCBkcG9lX3NlY19mc21fc3RhcnRfZGF0YSAqY2ZnKTsKKworYmNtb3NfZXJybm8gZHBvZV9zZWNfZnNtX2xpbmtfcnhfb2FtKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGxpbmssIHVpbnQ4X3QgKm9hbSwgdWludDE2X3QgbGVuZ3RoKTsKKworYmNtb3NfZXJybm8gZHBvZV9zZWNfZnNtX2xpbmtfcnhfZWFwb2woYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X2Vwb25fbGlua19rZXkgbGluaywgdWludDhfdCAqZWFwb2wsIHVpbnQxNl90IGxlbmd0aCk7CisKK2JjbW9zX2Vycm5vIGRwb2Vfc2VjX2ZzbV9pbml0KGZfZHBvZV9zZWNfY2VydF90cnVzdF9jYiBjZXJ0X3RydXN0X2NiLCBmX2Rwb2Vfc2VjX2ZzbV9jYiBmc21fY29tcGxldGVfY2IpOworCisjZW5kaWYgLyogX0RQT0VfU0VDX0ZTTV9IXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9kcG9lX3NlY19ta2FfZnNtLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Rwb2Vfc2VjL2Rwb2Vfc2VjX21rYV9mc20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTc0ZDYzCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9kcG9lX3NlY19ta2FfZnNtLmMKQEAgLTAsMCArMSw4MzAgQEAKKy8qCisgIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCisgIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKKyAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCisgIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgIG9mIHRoZSBzb2Z0d2FyZS4KKworICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyAgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisgIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgIHdyaXR0ZW4gY29uc2VudC4KKworICA6PgorKi8KKworI2luY2x1ZGUgImRwb2Vfc2VjX2ZzbS5oIgorI2luY2x1ZGUgImRwb2Vfc2VjX21rYV9mc20uaCIKKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtLmgiCisjaW5jbHVkZSAiZHBvZV9zZWNfdXRpbC5oIgorCit0eXBlZGVmIGVudW0gZHBvZV9zZWNfbWthX2ZzbV9ldmVudF90eXBlCit7CisgICAgRFBPRV9TRUNfTUtBX0ZTTV9FVkVOVF9fSU5WQUxJRCAgICAgPSAtMSwgLyoqPCBwZXJtaXRzIGV2ZW50IHZhbGlkYXRpb24gKi8KKworICAgIERQT0VfU0VDX01LQV9GU01fRVZFTlRfSU5JVCAgICAgICAgID0gIDAsCisgICAgRFBPRV9TRUNfTUtBX0ZTTV9FVkVOVF9SWF9PQU0gICAgICAgLAorICAgIERQT0VfU0VDX01LQV9GU01fRVZFTlRfUlhfRUFQT0wgICAgICwKKyAgICBEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX1JYX1RJTUVPVVQgICwKKyAgICBEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX1RYX1RJTUVPVVQgICwKKyAgICBEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX1NUT1AgICAgICAgICAsCisKKyAgICBEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX19DT1VOVAorfSBkcG9lX3NlY19ta2FfZnNtX2V2ZW50X3R5cGU7CisKKy8qIE1LQSBGU00gRXZlbnQgY29udGVudHMuIFRoaXMgaXMgYSB1bmlvbiBvZiBpbmZvcm1hdGlvbiByZXF1aXJlZCBieSB0aGUgTUtBIEZTTS4gVGhpcyBkYXRhIHR5cGUgcGVybWl0cyBhIGNvbW1vbgorICogZnVuY3Rpb24gcHJvdG90eXBlIGZvciB0aGUgc3RhdGUgbWFjaGluZSBmdW5jdGlvbiB0YWJsZS4gKi8KK3R5cGVkZWYgc3RydWN0IGRwb2Vfc2VjX21rYV9mc21fZXZlbnQKK3sKKyAgICBkcG9lX3NlY19ta2FfZnNtX2V2ZW50X3R5cGUgdHlwZTsgLyoqPCBUeXBlIG9mIGV2ZW50Ki8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgYmNtb2x0X3U4X2xpc3RfdTE2IHJ4X2ZyYW1lOworICAgIH0gZGF0YTsKK30gZHBvZV9zZWNfbWthX2ZzbV9ldmVudDsKKwordHlwZWRlZiBiY21vc19lcnJubyAoKmZfZHBvZV9zZWNfbWthX2ZzbSkoZHBvZV9zZWNfbGlua19yZWMgKm1rYV9jdHJsLCBkcG9lX3NlY19ta2FfZnNtX2V2ZW50ICpldnQpOworCitzdGF0aWMgY29uc3QgY2hhciAqZHBvZV9zZWNfbWthX2ZzbV9ldmVudF9uYW1lW0RQT0VfU0VDX01LQV9GU01fRVZFTlRfX0NPVU5UXSA9Cit7CisgICAgW0RQT0VfU0VDX01LQV9GU01fRVZFTlRfSU5JVF0gPSAiSW5pdGlhbGl6YXRpb24iLAorICAgIFtEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX1JYX09BTV0gPSAiT0FNIFJlc3BvbnNlIiwKKyAgICBbRFBPRV9TRUNfTUtBX0ZTTV9FVkVOVF9SWF9FQVBPTF0gPSAiUlggRUFQT0wiLAorICAgIFtEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX1JYX1RJTUVPVVRdID0gIkZTTSBUaW1lb3V0IiwKKyAgICBbRFBPRV9TRUNfTUtBX0ZTTV9FVkVOVF9UWF9USU1FT1VUXSA9ICJNS0EgVGltZW91dCIsCisgICAgW0RQT0VfU0VDX01LQV9GU01fRVZFTlRfU1RPUF0gPSAiU3RvcCIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpkcG9lX3NlY19ta2FfZnNtX3N0YXRlX25hbWVbRFBPRV9TRUNfTUtBX0ZTTV9TVEFURV9fQ09VTlRdID0KK3sKKyAgICBbRFBPRV9TRUNfTUtBX0ZTTV9TVEFURV9OVUxMXSA9ICJOdWxsIiwKKyAgICBbRFBPRV9TRUNfTUtBX0ZTTV9TVEFURV9TRVRfRU5DUllQVElPTl0gPSAiU2V0IEVuY3J5cHRpb24iLAorICAgIFtEUE9FX1NFQ19NS0FfRlNNX1NUQVRFX1NUQVJUX01LQSBdID0gIlN0YXJ0IE1LQSIsCisgICAgW0RQT0VfU0VDX01LQV9GU01fU1RBVEVfU0VORF9TQUtdID0gIlNlbmQgU0FLIiwKKyAgICBbRFBPRV9TRUNfTUtBX0ZTTV9TVEFURV9PUEVSQVRJT05BTF0gPSAiT3BlcmF0aW9uYWwiLAorICAgIFtEUE9FX1NFQ19NS0FfRlNNX1NUQVRFX1NFTkRfTkVXX1NBS10gPSAiU2VuZCBOZXcgU0FLIgorfTsKKworc3RhdGljIGZfZHBvZV9zZWNfbWthX2NiIF9ta2FfZG9uZV9jYjsKKworc3RhdGljIGJjbW9zX2Vycm5vIF9kcG9lX3NlY19ta2FfZnNtX2V4ZWMoZHBvZV9zZWNfbGlua19yZWMgKmxpbmssIGRwb2Vfc2VjX21rYV9mc21fZXZlbnQgKmV2dCk7CisKK3N0YXRpYyBiY21vc19ib29sIF9kcG9lX3NlY19ta2FfZnNtX2V2ZW50X3R5cGVfaXNfdmFsaWQoZHBvZV9zZWNfbWthX2ZzbV9ldmVudF90eXBlIHR5cGUpCit7CisgICAgcmV0dXJuICh0eXBlID4gRFBPRV9TRUNfTUtBX0ZTTV9FVkVOVF9fSU5WQUxJRCkgJiYgKHR5cGUgPCBEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX19DT1VOVCk7Cit9CisKK3N0YXRpYyBiY21vc19ib29sIF9kcG9lX3NlY19ta2FfZnNtX3N0YXRlX2lzX3ZhbGlkKGRwb2Vfc2VjX21rYV9mc21fc3RhdGUgc3RhdGUpCit7CisgICAgcmV0dXJuIChzdGF0ZSA+IERQT0VfU0VDX01LQV9GU01fU1RBVEVfX0lOVkFMSUQpICYmIChzdGF0ZSA8IERQT0VfU0VDX01LQV9GU01fU1RBVEVfX0NPVU5UKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKl9kcG9lX3NlY19ta2FfZnNtX2V2ZW50X25hbWUoZHBvZV9zZWNfbWthX2ZzbV9ldmVudF90eXBlIHR5cGUpCit7CisgICAgaWYgKF9kcG9lX3NlY19ta2FfZnNtX2V2ZW50X3R5cGVfaXNfdmFsaWQodHlwZSkpCisgICAgeworICAgICAgICByZXR1cm4gZHBvZV9zZWNfbWthX2ZzbV9ldmVudF9uYW1lW3R5cGVdOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gIlVua25vd24gRXZlbnQiOworICAgIH0KK30KKworc3RhdGljIGNvbnN0IGNoYXIgKl9kcG9lX3NlY19ta2FfZnNtX3N0YXRlX25hbWUoZHBvZV9zZWNfbWthX2ZzbV9zdGF0ZSBzdGF0ZSkKK3sKKyAgICBpZiAoX2Rwb2Vfc2VjX21rYV9mc21fc3RhdGVfaXNfdmFsaWQoc3RhdGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRwb2Vfc2VjX21rYV9mc21fc3RhdGVfbmFtZVtzdGF0ZV07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAiVW5rbm93biBTdGF0ZSI7CisgICAgfQorfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2Rwb2Vfc2VjX21rYV9mc21fZXJyb3IoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBkcG9lX3NlY19ta2FfZnNtX2V2ZW50ICpldnQpCit7CisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04obGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21faW5mbyA9PSBOVUxMKTsKKyAgICBCVUdfT04oZXZ0ID09IE5VTEwpOworCisgICAgLyogVE9ETzogbG9nIHVuZXhwZWN0ZWQgZXZlbnQgKi8KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgdm9pZCBfZHBvZV9zZWNfbWthX2ZzbV9jbGVhbnVwKGRwb2Vfc2VjX21rYV9mc21fY3RybCAqbWthX2N0cmwpCit7CisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04obWthX2N0cmwgPT0gTlVMTCk7CisKKyAgICBpZiAobWthX2N0cmwtPm1rYV9pbmZvICE9IE5VTEwpCisgICAgeworICAgICAgICAvKiBDbGVhciBhbGwgTUtBIGluZm9ybWF0aW9uIGJlZm9yZSBmcmVlaW5nLiAqLworICAgICAgICBtZW1zZXQobWthX2N0cmwtPm1rYV9pbmZvLCAwLCBzaXplb2YoKm1rYV9jdHJsLT5ta2FfaW5mbykpOworICAgICAgICBiY21vc19mcmVlKG1rYV9jdHJsLT5ta2FfaW5mbyk7CisgICAgICAgIG1rYV9jdHJsLT5ta2FfaW5mbyA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKG1rYV9jdHJsLT5ta2FfZnNtX2luZm8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIC8qIENsZWFyIGFsbCBNS0EgRlNNIGluZm9ybWF0aW9uIGJlZm9yZSBmcmVlaW5nLiAqLworICAgICAgICBtZW1zZXQobWthX2N0cmwtPm1rYV9mc21faW5mbywgMCwgc2l6ZW9mKCpta2FfY3RybC0+bWthX2ZzbV9pbmZvKSk7CisgICAgICAgIGJjbW9zX2ZyZWUobWthX2N0cmwtPm1rYV9mc21faW5mbyk7CisgICAgICAgIG1rYV9jdHJsLT5ta2FfZnNtX2luZm8gPSBOVUxMOworICAgIH0KKworICAgIG1rYV9jdHJsLT5ta2FfZnNtX3N0YXRlID0gRFBPRV9TRUNfTUtBX0ZTTV9TVEFURV9OVUxMOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2Rwb2Vfc2VjX21rYV9mc21fc3RvcChkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIGRwb2Vfc2VjX21rYV9mc21fZXZlbnQgKmV2dCkKK3sKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9pbmZvID09IE5VTEwpOworICAgIEJVR19PTihldnQgPT0gTlVMTCk7CisKKyAgICAvKiBUaGUgc3RvcCBmdW5jdGlvbiBpcyBjYWxsZWQgZWFjaCB0aW1lIHRoZSBMaW5rIGRlcmVnaXN0ZXJzIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgTUtBIEZTTSBpcyBydW5uaW5nIG9yIG5vdC4KKyAgICAgICBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgaXQgaXMgbm90IHJ1bm5pbmcuICovCisgICAgaWYgKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX2luZm8gPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKworICAgIC8qIFN0b3AgYW55IHRpbWVycyB0aGF0IG1heSBiZSBydW5uaW5nLiAqLworICAgIGJjbW9zX3RpbWVyX3N0b3AoJmxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX2luZm8tPnJ4X3RpbWVyKTsKKyAgICBiY21vc190aW1lcl9zdG9wKCZsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9pbmZvLT50eF90aW1lcik7CisKKyAgICAvKiBDaGFuZ2UgdG8gdGhlIE5VTEwgc3RhdGUgKi8KKyAgICBsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9zdGF0ZSA9IERQT0VfU0VDX01LQV9GU01fU1RBVEVfTlVMTDsKKworICAgIC8qIEZyZWUgZHluYW1pYyBNS0EgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluay4gKi8KKyAgICBfZHBvZV9zZWNfbWthX2ZzbV9jbGVhbnVwKCZsaW5rX3JlYy0+bWthX2N0cmwpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc190aW1lcl9yYyBfZHBvZV9zZWNfbWthX2ZzbV9yeF90aW1lcl9leHBpcmUoYmNtb3NfdGltZXIgKnRpbWVyLCBsb25nIGRhdGEpCit7CisgICAgZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjID0gKGRwb2Vfc2VjX2xpbmtfcmVjKilkYXRhOworICAgIGRwb2Vfc2VjX21rYV9mc21fZXZlbnQgZXZudCA9IHt9OworCisgICAgLyogUGFyYW1ldGVyIENoZWNrcyAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04obGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21faW5mbyA9PSBOVUxMKTsKKworICAgIC8qIFNldCB1cCB0aGUgZXZlbnQgKi8KKyAgICBldm50LnR5cGUgPSBEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX1JYX1RJTUVPVVQ7CisKKyAgICAvKiBFeGVjdXRlIHRoZSBzdGF0ZSBtYWNoaW5lICovCisgICAgX2Rwb2Vfc2VjX21rYV9mc21fZXhlYyhsaW5rX3JlYywgJmV2bnQpOworCisgICAgcmV0dXJuIEJDTU9TX1RJTUVSX09LOworfQorCitzdGF0aWMgYmNtb3NfdGltZXJfcmMgX2Rwb2Vfc2VjX21rYV9mc21fdHhfdGltZXJfZXhwaXJlKGJjbW9zX3RpbWVyICp0aW1lciwgbG9uZyBkYXRhKQoreworICAgIGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYyA9IChkcG9lX3NlY19saW5rX3JlYyopZGF0YTsKKyAgICBkcG9lX3NlY19ta2FfZnNtX2V2ZW50IGV2bnQgPSB7fTsKKworICAgIC8qIFBhcmFtZXRlciBDaGVja3MgKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX2luZm8gPT0gTlVMTCk7CisKKyAgICAvKiBTZXQgdXAgdGhlIGV2ZW50ICovCisgICAgZXZudC50eXBlID0gRFBPRV9TRUNfTUtBX0ZTTV9FVkVOVF9UWF9USU1FT1VUOworCisgICAgLyogRXhlY3V0ZSB0aGUgc3RhdGUgbWFjaGluZSAqLworICAgIF9kcG9lX3NlY19ta2FfZnNtX2V4ZWMobGlua19yZWMsICZldm50KTsKKworICAgIHJldHVybiBCQ01PU19USU1FUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9kcG9lX3NlY19ta2FfZnNtX2luaXRpYWxpemUoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBkcG9lX3NlY19ta2FfZnNtX2V2ZW50ICpldnQpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9zX3RpbWVyX3Bhcm0gcnhfdHAgPQorICAgIHsKKyAgICAgICAgLm5hbWUgPSAiZHBvZV9zZWNfbWthX2ZzbV90aW1lciIsCisgICAgICAgIC5vd25lciA9IEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfRFBPRV9TRUMgKyBsaW5rX3JlYy0+ZGV2aWNlLAorICAgICAgICAucGVyaW9kaWMgPSBCQ01PU19GQUxTRSwKKyAgICAgICAgLmhhbmRsZXIgPSBfZHBvZV9zZWNfbWthX2ZzbV9yeF90aW1lcl9leHBpcmUsCisgICAgICAgIC5kYXRhID0gKGxvbmcpbGlua19yZWMsCisgICAgICAgIC5mbGFncyA9IEJDTU9TX1RJTUVSX1BBUk1fRkxBR1NfTk9OX1VSR0VOVAorICAgIH07CisgICAgYmNtb3NfdGltZXJfcGFybSB0eF90cCA9CisgICAgeworICAgICAgICAubmFtZSA9ICJkcG9lX3NlY19ta2FfbWthX3RpbWVyIiwKKyAgICAgICAgLm93bmVyID0gQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9EUE9FX1NFQyArIGxpbmtfcmVjLT5kZXZpY2UsCisgICAgICAgIC5wZXJpb2RpYyA9IEJDTU9TX1RSVUUsCisgICAgICAgIC5oYW5kbGVyID0gX2Rwb2Vfc2VjX21rYV9mc21fdHhfdGltZXJfZXhwaXJlLAorICAgICAgICAuZGF0YSA9IChsb25nKWxpbmtfcmVjLAorICAgICAgICAuZmxhZ3MgPSBCQ01PU19USU1FUl9QQVJNX0ZMQUdTX05PTl9VUkdFTlQKKyAgICB9OworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04oZXZ0ID09IE5VTEwpOworCisgICAgLyogQWxsb2NhdGUgdGhlIE1LQSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuICovCisgICAgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvID0gYmNtb3NfY2FsbG9jKHNpemVvZigqbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvKSk7CisgICAgaWYgKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mbyA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorCisgICAgLyogQWxsb2NhdGUgdGhlIE1LQSBGU00gaW5mb3JtYXRpb24gc3RydWN0dXJlLiAqLworICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX2luZm8gPSBiY21vc19jYWxsb2Moc2l6ZW9mKCpsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9pbmZvKSk7CisgICAgaWYgKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX2luZm8gPT0gTlVMTCkKKyAgICB7CisgICAgICAgIF9kcG9lX3NlY19ta2FfZnNtX2NsZWFudXAoJmxpbmtfcmVjLT5ta2FfY3RybCk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKworICAgIGVyciA9IGJjbW9zX3RpbWVyX2NyZWF0ZSgmbGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21faW5mby0+cnhfdGltZXIsICZyeF90cCk7CisgICAgaWYgKEJDTV9FUlJfT0sgIT0gZXJyKQorICAgIHsKKyAgICAgICAgX2Rwb2Vfc2VjX21rYV9mc21fY2xlYW51cCgmbGlua19yZWMtPm1rYV9jdHJsKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBlcnIgPSBiY21vc190aW1lcl9jcmVhdGUoJmxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX2luZm8tPnR4X3RpbWVyLCAmdHhfdHApOworICAgIGlmIChCQ01fRVJSX09LICE9IGVycikKKyAgICB7CisgICAgICAgIF9kcG9lX3NlY19ta2FfZnNtX2NsZWFudXAoJmxpbmtfcmVjLT5ta2FfY3RybCk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgLyogQ2hhbmdlIHRvIHRoZSBTRVRfTElOS19FTkNSWVBUSU9OX01PREUgc3RhdGUgKi8KKyAgICBsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9zdGF0ZSA9IERQT0VfU0VDX01LQV9GU01fU1RBVEVfU0VUX0VOQ1JZUFRJT047CisgICAgYmNtb3NfdGltZXJfc3RhcnQoJmxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX2luZm8tPnJ4X3RpbWVyLCBEUE9FX1NFQ19PQU1fVElNRU9VVCk7CisKKyAgICByZXR1cm4gZXBvbl9vYW1fZHBvZV9zZXRfZW5jcnlwdGlvbigKKyAgICAgICAgbGlua19yZWMtPmRldmljZSwKKyAgICAgICAgbGlua19yZWMtPmtleS5lcG9uX25pLAorICAgICAgICAmbGlua19yZWMtPmtleS5tYWNfYWRkcmVzcywKKyAgICAgICAgbGlua19yZWMtPmNmZy5lbmNfbW9kZSwKKyAgICAgICAgMCk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfZHBvZV9zZWNfbWthX2ZzbV9zZW5kX3N1Y2Nlc3MoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjKQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihfbWthX2RvbmVfY2IgPT0gTlVMTCk7CisKKyAgICBfbWthX2RvbmVfY2IobGlua19yZWMsIEJDTV9FUlJfT0spOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfZHBvZV9zZWNfbWthX2ZzbV9zZW5kX2ZhaWx1cmUoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBiY21vc19lcnJubyByZWFzb24pCit7CisgICAgZHBvZV9zZWNfbWthX2ZzbV9ldmVudCBldmVudCA9IHsgLnR5cGUgPSBEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX1NUT1AgfTsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihfbWthX2RvbmVfY2IgPT0gTlVMTCk7CisKKyAgICBEUE9FX1NFQ19MSU5LX0xPRyhFUlJPUiwgbGlua19yZWMsICJNS0Egc3RvcHBpbmchXG4iKTsKKworICAgIC8qIE5vdGlmeSB0aGUgRFBvRSBTZWN1cml0eSBGU00gb2YgdGhlIE1LQSBlcnJvci4gKi8KKyAgICBfbWthX2RvbmVfY2IobGlua19yZWMsIHJlYXNvbik7CisKKyAgICAvKiBTdG9wIHRoZSBGU00gZHVlIHRvIHRoZSBlcnJvci4gKi8KKyAgICByZXR1cm4gX2Rwb2Vfc2VjX21rYV9mc21fc3RvcChsaW5rX3JlYywgJmV2ZW50KTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9kcG9lX3NlY19ta2FfZnNtX3J4X3RpbWVvdXQoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBkcG9lX3NlY19ta2FfZnNtX2V2ZW50ICpldnQpCit7CisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04obGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21faW5mbyA9PSBOVUxMKTsKKyAgICBCVUdfT04oZXZ0ID09IE5VTEwpOworCisgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsIGxpbmtfcmVjLCAiVElNRU9VVCBlcnJvciFcbiIpOworCisgICAgLyogTm90aWZ5IHRoZSBEUG9FIFNlY3VyaXR5IEZTTSBvZiB0aGUgTUtBIGVycm9yLiAqLworICAgIHJldHVybiBfZHBvZV9zZWNfbWthX2ZzbV9zZW5kX2ZhaWx1cmUobGlua19yZWMsIEJDTV9FUlJfVElNRU9VVCk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfZHBvZV9zZWNfbWthX2ZzbV9yeF9vYW0oZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBkcG9lX3NlY19ta2FfZnNtX2V2ZW50ICpldnQpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSAqb2FtX2ZyYW1lOworICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX3ZlbmRvcl9leHRlbmRlZF9iYXNlICpkcG9lOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04obGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21faW5mbyA9PSBOVUxMKTsKKyAgICBCVUdfT04oZXZ0ID09IE5VTEwpOworICAgIEJVR19PTihldnQtPmRhdGEucnhfZnJhbWUudmFsID09IE5VTEwpOworCisgICAgb2FtX2ZyYW1lID0gZXBvbl9vYW1fdW5wYWNrKGxpbmtfcmVjLT5kZXZpY2UsIGV2dC0+ZGF0YS5yeF9mcmFtZS5sZW4sIGV2dC0+ZGF0YS5yeF9mcmFtZS52YWwpOworICAgIGlmIChOVUxMID09IG9hbV9mcmFtZSkKKyAgICB7CisgICAgICAgIERQT0VfU0VDX0xJTktfTE9HKEVSUk9SLCBsaW5rX3JlYywgIk9BTSB1bnBhY2sgZmFpbGVkIVxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKworICAgIGlmICghZXBvbl9vYW1faXNfZHBvZShvYW1fZnJhbWUpKQorICAgIHsKKyAgICAgICAgYmNtb3NfZnJlZShvYW1fZnJhbWUpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisKKyAgICBkcG9lID0gJm9hbV9mcmFtZS0+cHJvdG9jb2xzWzBdLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLnUuZHBvZS52YWx1ZTsKKworICAgIGlmIChlcG9uX29hbV9pc19kcG9lX2VuY3J5cHRfcmVzcG9uc2UoZHBvZSkpCisgICAgeworICAgICAgICBpZiAoKGRwb2UtPnUuc2V0X3Jlc3BvbnNlLnZhcnNbMF0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLndpZHRoID09IDB4ODApICYmCisgICAgICAgICAgICAoZHBvZS0+dS5zZXRfcmVzcG9uc2UudmFyc1sxXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUud2lkdGggPT0gMHg4MCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJjbW9zX3RpbWVyX3N0b3AoJmxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX2luZm8tPnJ4X3RpbWVyKTsKKworICAgICAgICAgICAgLyogQ2hhbmdlIHRvIHRoZSBTVEFSVF9NS0Egc3RhdGUgKi8KKyAgICAgICAgICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX3N0YXRlID0gRFBPRV9TRUNfTUtBX0ZTTV9TVEFURV9TVEFSVF9NS0E7CisKKyAgICAgICAgICAgIC8qIFNlbmQgdGhlIGluaXRpYWwgTUtBIHBhY2tldCB0byB0aGUgT05VIGZvciB0aGUgc3BlY2lmaWVkIGxpbmsuICovCisgICAgICAgICAgICByYyA9IG1rYV9zdGFydChsaW5rX3JlYyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBEUE9FX1NFQ19MSU5LX0xPRyhFUlJPUiwgbGlua19yZWMsICJPTlUgcmVqZWN0ZWQgZW5jcnlwdGlvbjogWzBdID0gMHgleCwgWzFdID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwb2UtPnUuc2V0X3Jlc3BvbnNlLnZhcnNbMF0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHBvZS0+dS5zZXRfcmVzcG9uc2UudmFyc1sxXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUud2lkdGgpOworICAgICAgICAgICAgLyogTm90aWZ5IHRoZSBEUG9FIFNlY3VyaXR5IEZTTSBvZiB0aGUgTUtBIGVycm9yLiAqLworICAgICAgICAgICAgcmMgPSBfZHBvZV9zZWNfbWthX2ZzbV9zZW5kX2ZhaWx1cmUobGlua19yZWMsIEJDTV9FUlJfT05VX0VSUl9SRVNQKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBpZ25vcmUgb3RoZXIgT0FNICovCisgICAgfQorCisgICAgYmNtb3NfZnJlZShvYW1fZnJhbWUpOworCisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2Rwb2Vfc2VjX21rYV9mc21fc3RhcnRfdGltZW91dChkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIGRwb2Vfc2VjX21rYV9mc21fZXZlbnQgKmV2dCkKK3sKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9pbmZvID09IE5VTEwpOworICAgIEJVR19PTihldnQgPT0gTlVMTCk7CisKKyAgICByZXR1cm4gbWthX3Byb2Nlc3NfdGltZW91dChsaW5rX3JlYywgTUtBX09QX1NUQVJUX1RJTUVPVVQpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2Rwb2Vfc2VjX21rYV9mc21fc3RhcnRfcnhfZWFwb2woZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBkcG9lX3NlY19ta2FfZnNtX2V2ZW50ICpldnQpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04obGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21faW5mbyA9PSBOVUxMKTsKKyAgICBCVUdfT04oZXZ0ID09IE5VTEwpOworCisgICAgcmMgPSBta2FfcHJvY2Vzc19wYWNrZXQobGlua19yZWMsIGV2dC0+ZGF0YS5yeF9mcmFtZSwgTUtBX09QX1NUQVJUX1JTUCk7CisgICAgaWYgKHJjID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXIga2V5X2luZm87CisKKyAgICAgICAgLyogUmUtc3RhcnQgdGhlIHJ4IHRpbWVyICovCisgICAgICAgIGJjbW9zX3RpbWVyX3N0YXJ0KCZsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9pbmZvLT5yeF90aW1lciwgTUtBX0xJRkVfVElNRSAqIDEwMDApOworCisgICAgICAgIC8qIEdlbmVyYXRlIHRoZSBpbml0aWFsIFNBSy4gKi8KKyAgICAgICAgbWthX2dlbmVyYXRlX3NhayhsaW5rX3JlYywgQkNNT1NfVFJVRSk7CisKKyAgICAgICAga2V5X2luZm8uZm9ybWF0ID0gQkNNT0xUX0VQT05fRU5DUllQVElPTl9JTkZPUk1BVElPTl9GT1JNQVRfQ1RSOworICAgICAgICBtZW1jcHkoa2V5X2luZm8udS5jdHIua2V5LCBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPnNhaywgc2l6ZW9mKGtleV9pbmZvLnUuY3RyLmtleSkpOworICAgICAgICBtZW1jcHkoa2V5X2luZm8udS5jdHIuc2NpLCBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPm9udV9zY2ksIHNpemVvZihrZXlfaW5mby51LmN0ci5zY2kpKTsKKworICAgICAgICAvKiBJbnN0YWxsIHRoZSBTQUsgYXMgdGhlIFVTIGVuY3J5cHRpb24ga2V5IGZvciB0aGlzIGxpbmsuICovCisgICAgICAgIHJjID0gYmNtb2x0X2Vwb25fbGlua19lbmNyeXB0aW9uX2tleV9zZXQoCisgICAgICAgICAgICBsaW5rX3JlYy0+ZGV2aWNlLAorICAgICAgICAgICAgJmxpbmtfcmVjLT5rZXksCisgICAgICAgICAgICBCQ01PU19UUlVFLAorICAgICAgICAgICAgQkNNT0xUX0VQT05fRU5DUllQVElPTl9NT0RFX0VQT05fWkVST19PVkVSSEVBRF9BRVMsCisgICAgICAgICAgICAoYmNtb2x0X2Vwb25fa2V5X2Nob2ljZSkoKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+a2V5X251bWJlciArIDEpICUgMiksCisgICAgICAgICAgICAma2V5X2luZm8pOworICAgICAgICBpZiAocmMgPT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBta2Ffc2VuZF9zYWsobGlua19yZWMsIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+c2FrKTsKKyAgICAgICAgICAgIGlmIChyYyA9PSBCQ01fRVJSX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIENoYW5nZSB0byB0aGUgU0VORF9TQUsgc3RhdGUgKi8KKyAgICAgICAgICAgICAgICBsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9zdGF0ZSA9IERQT0VfU0VDX01LQV9GU01fU1RBVEVfU0VORF9TQUs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsIGxpbmtfcmVjLCAic2VuZCBTQUsgZmFpbGVkIVxuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBEUE9FX1NFQ19MSU5LX0xPRyhFUlJPUiwgbGlua19yZWMsICJrZXkgc2V0IGZhaWxlZCAlZCFcbiIsIHJjKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBEUE9FX1NFQ19MSU5LX0xPRyhFUlJPUiwgbGlua19yZWMsICJNS0EgcHJvY2VzcyBwYWNrZXQgZmFpbGVkIVxuIik7CisgICAgfQorCisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBOb3RpZnkgdGhlIERQb0UgU2VjdXJpdHkgRlNNIG9mIHRoZSBNS0EgZXJyb3IuICovCisgICAgICAgIF9kcG9lX3NlY19ta2FfZnNtX3NlbmRfZmFpbHVyZShsaW5rX3JlYywgcmMpOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9kcG9lX3NlY19ta2FfZnNtX3Nha190aW1lb3V0KGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgZHBvZV9zZWNfbWthX2ZzbV9ldmVudCAqZXZ0KQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX2luZm8gPT0gTlVMTCk7CisgICAgQlVHX09OKGV2dCA9PSBOVUxMKTsKKworICAgIHJldHVybiBta2FfcHJvY2Vzc190aW1lb3V0KGxpbmtfcmVjLCBNS0FfT1BfU0FLX1RJTUVPVVQpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2Rwb2Vfc2VjX21rYV9mc21fc2FrX3J4X2VhcG9sKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgZHBvZV9zZWNfbWthX2ZzbV9ldmVudCAqZXZ0KQoreworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04obGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21faW5mbyA9PSBOVUxMKTsKKyAgICBCVUdfT04oZXZ0ID09IE5VTEwpOworCisgICAgcmMgPSBta2FfcHJvY2Vzc19wYWNrZXQobGlua19yZWMsIGV2dC0+ZGF0YS5yeF9mcmFtZSwgTUtBX09QX1NBS19SU1ApOworICAgIGlmIChyYyA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyIGtleV9pbmZvOworCisgICAgICAgIC8qIFJlLXN0YXJ0IHRoZSByeCB0aW1lciAqLworICAgICAgICBiY21vc190aW1lcl9zdGFydCgmbGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21faW5mby0+cnhfdGltZXIsIE1LQV9MSUZFX1RJTUUgKiAxMDAwKTsKKworICAgICAgICBrZXlfaW5mby5mb3JtYXQgPSBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX0lORk9STUFUSU9OX0ZPUk1BVF9DVFI7CisgICAgICAgIG1lbWNweShrZXlfaW5mby51LmN0ci5rZXksIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+c2FrLCBzaXplb2Yoa2V5X2luZm8udS5jdHIua2V5KSk7CisgICAgICAgIG1lbWNweShrZXlfaW5mby51LmN0ci5zY2ksIGxpbmtfcmVjLT5uaV9tYWMudTgsIEJDTU9TX0VUSF9BTEVOKTsKKyAgICAgICAga2V5X2luZm8udS5jdHIuc2NpWzZdID0gKGxpbmtfcmVjLT5sbGlkID4+IDgpICYgMHhmZjsKKyAgICAgICAga2V5X2luZm8udS5jdHIuc2NpWzddID0gKGxpbmtfcmVjLT5sbGlkID4+IDApICYgMHhmZjsKKworICAgICAgICAvKiBJbnN0YWxsIHRoZSBTQUsgYXMgdGhlIFVTIGFuZCBEUyBlbmNyeXB0aW9uIGtleSBmb3IgdGhpcyBsaW5rLiAqLworICAgICAgICByYyA9IGJjbW9sdF9lcG9uX2xpbmtfZW5jcnlwdGlvbl9rZXlfc2V0KAorICAgICAgICAgICAgbGlua19yZWMtPmRldmljZSwKKyAgICAgICAgICAgICZsaW5rX3JlYy0+a2V5LAorICAgICAgICAgICAgQkNNT1NfRkFMU0UsCisgICAgICAgICAgICBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX01PREVfRVBPTl9aRVJPX09WRVJIRUFEX0FFUywKKyAgICAgICAgICAgIChiY21vbHRfZXBvbl9rZXlfY2hvaWNlKSgobGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5rZXlfbnVtYmVyICsgMSkgJSAyKSwKKyAgICAgICAgICAgICZrZXlfaW5mbyk7CisgICAgICAgIGlmIChyYyA9PSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICByYyA9IG1rYV9zZW5kX3Nha19jb25maXJtKGxpbmtfcmVjKTsKKyAgICAgICAgICAgIGlmIChyYyA9PSBCQ01fRVJSX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIE5vdGlmeSB0aGUgRFBvRSBTZWN1cml0eSBGU00gb2YgdGhlIE1LQSByZXN1bHQuICovCisgICAgICAgICAgICAgICAgcmMgPSBfZHBvZV9zZWNfbWthX2ZzbV9zZW5kX3N1Y2Nlc3MobGlua19yZWMpOworCisgICAgICAgICAgICAgICAgLyogQ2hhbmdlIHRvIHRoZSBPUEVSQVRJT05BTCBzdGF0ZSAqLworICAgICAgICAgICAgICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX3N0YXRlID0gRFBPRV9TRUNfTUtBX0ZTTV9TVEFURV9PUEVSQVRJT05BTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogTm90aWZ5IHRoZSBEUG9FIFNlY3VyaXR5IEZTTSBvZiB0aGUgTUtBIGVycm9yLiAqLworICAgICAgICBfZHBvZV9zZWNfbWthX2ZzbV9zZW5kX2ZhaWx1cmUobGlua19yZWMsIHJjKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfZHBvZV9zZWNfbWthX2ZzbV9zZW5kX2tlZXBfYWxpdmUoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBkcG9lX3NlY19ta2FfZnNtX2V2ZW50ICpldnQpCit7CisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04obGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21faW5mbyA9PSBOVUxMKTsKKyAgICBCVUdfT04oZXZ0ID09IE5VTEwpOworCisgICAgcmV0dXJuIG1rYV9wcm9jZXNzX3RpbWVvdXQobGlua19yZWMsIE1LQV9PUF9TRU5EX0tFRVBfQUxJVkUpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2Rwb2Vfc2VjX21rYV9mc21fc2FrX3JlZnJlc2goZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBkcG9lX3NlY19ta2FfZnNtX2V2ZW50ICpldnQpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04obGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21faW5mbyA9PSBOVUxMKTsKKyAgICBCVUdfT04oZXZ0ID09IE5VTEwpOworCisgICAgYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyIGtleV9pbmZvOworCisgICAgLyogR2VuZXJhdGUgdGhlIG5ldyBTQUsuICovCisgICAgbWthX2dlbmVyYXRlX3NhayhsaW5rX3JlYywgQkNNT1NfRkFMU0UpOworCisgICAga2V5X2luZm8uZm9ybWF0ID0gQkNNT0xUX0VQT05fRU5DUllQVElPTl9JTkZPUk1BVElPTl9GT1JNQVRfQ1RSOworICAgIG1lbWNweShrZXlfaW5mby51LmN0ci5rZXksIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+c2FrLCBzaXplb2Yoa2V5X2luZm8udS5jdHIua2V5KSk7CisgICAgbWVtY3B5KGtleV9pbmZvLnUuY3RyLnNjaSwgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5vbnVfc2NpLCBzaXplb2Yoa2V5X2luZm8udS5jdHIuc2NpKSk7CisKKyAgICAvKiBJbnN0YWxsIHRoZSBuZXcgU0FLIGFzIHRoZSBVUyBlbmNyeXB0aW9uIGtleSBmb3IgdGhpcyBsaW5rLiAqLworICAgIHJjID0gYmNtb2x0X2Vwb25fbGlua19lbmNyeXB0aW9uX2tleV9zZXQoCisgICAgICAgIGxpbmtfcmVjLT5kZXZpY2UsCisgICAgICAgICZsaW5rX3JlYy0+a2V5LAorICAgICAgICBCQ01PU19UUlVFLAorICAgICAgICBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX01PREVfRVBPTl9aRVJPX09WRVJIRUFEX0FFUywKKyAgICAgICAgKGJjbW9sdF9lcG9uX2tleV9jaG9pY2UpKChsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmtleV9udW1iZXIgKyAxKSAlIDIpLAorICAgICAgICAma2V5X2luZm8pOworICAgIGlmIChyYyA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmMgPSBta2Ffc2VuZF9zYWsobGlua19yZWMsIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+bmV3X3Nhayk7CisgICAgICAgIGlmIChyYyA9PSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBDaGFuZ2UgdG8gdGhlIFNFTkRfU0FLIHN0YXRlICovCisgICAgICAgICAgICBsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9zdGF0ZSA9IERQT0VfU0VDX01LQV9GU01fU1RBVEVfU0VORF9ORVdfU0FLOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgeworICAgICAgICAvKiBOb3RpZnkgdGhlIERQb0UgU2VjdXJpdHkgRlNNIG9mIHRoZSBNS0EgZXJyb3IuICovCisgICAgICAgIF9kcG9lX3NlY19ta2FfZnNtX3NlbmRfZmFpbHVyZShsaW5rX3JlYywgcmMpOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9kcG9lX3NlY19ta2FfZnNtX2hhbmRsZV9rZWVwX2FsaXZlKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgZHBvZV9zZWNfbWthX2ZzbV9ldmVudCAqZXZ0KQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MgKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX2luZm8gPT0gTlVMTCk7CisgICAgQlVHX09OKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mbyA9PSBOVUxMKTsKKyAgICBCVUdfT04oZXZ0ID09IE5VTEwpOworCisgICAgLyogUGFzcyB0aGUga2VlcCBhbGl2ZSBtZXNzYWdlIHRvIHRoZSBNS0EgcHJvcGVyIGNvZGUuIEl0J3Mgb2theSB0byBpZ25vcmUgdGhlIHJldHVybiBzdGF0dXMuIEZhaWx1cmUgdG8gbWFpbnRhaW4KKyAgICAgICB0aGUgTUtBIGNvbm5lY3Rpb24gdGhyb3VnaCBNS0Ega2VlcCBhbGl2ZSBtZXNzYWdlcyB3aWxsIHRlYXIgZG93biB0aGUgTUtBIGNvbm5lY3Rpb24uICovCisgICAgcmMgPSBta2FfcHJvY2Vzc19wYWNrZXQobGlua19yZWMsIGV2dC0+ZGF0YS5yeF9mcmFtZSwgTUtBX09QX0tFRVBfQUxJVkUpOworCisgICAgLyogQ2hlY2sgaWYgYSBTQUsgcmVmcmVzaCBpcyBuZWVkZWQuICovCisgICAgaWYgKHJjID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICAvKiBSZS1zdGFydCB0aGUgcnggdGltZXIgKi8KKyAgICAgICAgYmNtb3NfdGltZXJfc3RhcnQoJmxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX2luZm8tPnJ4X3RpbWVyLCBNS0FfTElGRV9USU1FICogMTAwMCk7CisKKyAgICAgICAgaWYgKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+c2FrX3JlZnJlc2hfbmVlZGVkKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBTdGFydCB0aGUgU0FLIHJlZnJlc2ggcHJvY2Vzcy4gKi8KKyAgICAgICAgICAgIF9kcG9lX3NlY19ta2FfZnNtX3Nha19yZWZyZXNoKGxpbmtfcmVjLCBldnQpOworCisgICAgICAgICAgICAvKiBDbGVhciB0aGUgU0FLIHJlZnJlc2ggZmxhZyBzaW5jZSB0aGUgU0FLIHJlZnJlc2ggcHJvY2VzcyBoYXMgYmVlbiBzdGFydGVkLiAqLworICAgICAgICAgICAgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5zYWtfcmVmcmVzaF9uZWVkZWQgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9kcG9lX3NlY19ta2FfZnNtX25ld19zYWtfcnhfZWFwb2woZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBkcG9lX3NlY19ta2FfZnNtX2V2ZW50ICpldnQpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9pbmZvID09IE5VTEwpOworICAgIEJVR19PTihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8gPT0gTlVMTCk7CisgICAgQlVHX09OKGV2dCA9PSBOVUxMKTsKKworICAgIHJjID0gbWthX3Byb2Nlc3NfcGFja2V0KGxpbmtfcmVjLCBldnQtPmRhdGEucnhfZnJhbWUsIE1LQV9PUF9TQUtfUlNQKTsKKyAgICBpZiAocmMgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIFJlLXN0YXJ0IHRoZSByeCB0aW1lciAqLworICAgICAgICBiY21vc190aW1lcl9zdGFydCgmbGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21faW5mby0+cnhfdGltZXIsIE1LQV9MSUZFX1RJTUUgKiAxMDAwKTsKKworICAgICAgICBiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXIga2V5X2luZm87CisKKyAgICAgICAga2V5X2luZm8uZm9ybWF0ID0gQkNNT0xUX0VQT05fRU5DUllQVElPTl9JTkZPUk1BVElPTl9GT1JNQVRfQ1RSOworICAgICAgICBtZW1jcHkoa2V5X2luZm8udS5jdHIua2V5LCBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPnNhaywgc2l6ZW9mKGtleV9pbmZvLnUuY3RyLmtleSkpOworICAgICAgICBtZW1jcHkoa2V5X2luZm8udS5jdHIuc2NpLCBsaW5rX3JlYy0+bmlfbWFjLnU4LCBCQ01PU19FVEhfQUxFTik7CisgICAgICAgIGtleV9pbmZvLnUuY3RyLnNjaVs2XSA9IChsaW5rX3JlYy0+bGxpZCA+PiA4KSAmIDB4ZmY7CisgICAgICAgIGtleV9pbmZvLnUuY3RyLnNjaVs3XSA9IChsaW5rX3JlYy0+bGxpZCA+PiAwKSAmIDB4ZmY7CisKKyAgICAgICAgLyogSW5zdGFsbCB0aGUgbmV3IFNBSyBhcyB0aGUgVVMgYW5kIERTIGVuY3J5cHRpb24ga2V5IGZvciB0aGlzIGxpbmsuICovCisgICAgICAgIHJjID0gYmNtb2x0X2Vwb25fbGlua19lbmNyeXB0aW9uX2tleV9zZXQoCisgICAgICAgICAgICBsaW5rX3JlYy0+ZGV2aWNlLAorICAgICAgICAgICAgJmxpbmtfcmVjLT5rZXksCisgICAgICAgICAgICBCQ01PU19GQUxTRSwKKyAgICAgICAgICAgIEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fTU9ERV9FUE9OX1pFUk9fT1ZFUkhFQURfQUVTLAorICAgICAgICAgICAgKGJjbW9sdF9lcG9uX2tleV9jaG9pY2UpKChsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmtleV9udW1iZXIgKyAxKSAlIDIpLAorICAgICAgICAgICAgJmtleV9pbmZvKTsKKyAgICAgICAgaWYgKHJjID09IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gbWthX3NlbmRfc2FrX2NvbmZpcm0obGlua19yZWMpOworICAgICAgICAgICAgaWYgKHJjID09IEJDTV9FUlJfT0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogVXBkYXRlIHRoZSBjdXJyZW50IFNBSyB3aXRoIHRoZSBuZXcgU0FLICovCisgICAgICAgICAgICAgICAgbWVtY3B5KGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+c2FrLCBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPm5ld19zYWssCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPnNhaykpOworCisgICAgICAgICAgICAgICAgLyogQ2hhbmdlIHRvIHRoZSBPUEVSQVRJT05BTCBzdGF0ZSAqLworICAgICAgICAgICAgICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX3N0YXRlID0gRFBPRV9TRUNfTUtBX0ZTTV9TVEFURV9PUEVSQVRJT05BTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLyogTm90aWZ5IHRoZSBEUG9FIFNlY3VyaXR5IEZTTSBvZiB0aGUgTUtBIGVycm9yLiAqLworICAgICAgICBfZHBvZV9zZWNfbWthX2ZzbV9zZW5kX2ZhaWx1cmUobGlua19yZWMsIHJjKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKiBUaGlzIGlzIHRoZSBPTlUgRlNNIEp1bXAgVGFibGUsIGluZGV4ZWQgYnkgU1RBVEUgYW5kIEVWRU5ULiAqLworc3RhdGljIGZfZHBvZV9zZWNfbWthX2ZzbSBkcG9lX3NlY19ta2FfZnNtW0RQT0VfU0VDX01LQV9GU01fU1RBVEVfX0NPVU5UXVtEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX19DT1VOVF0gPQoreworICAgIFtEUE9FX1NFQ19NS0FfRlNNX1NUQVRFX05VTExdID0KKyAgICB7CisgICAgICAgIFtEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX0lOSVRdID0gX2Rwb2Vfc2VjX21rYV9mc21faW5pdGlhbGl6ZQorICAgIH0sCisgICAgW0RQT0VfU0VDX01LQV9GU01fU1RBVEVfU0VUX0VOQ1JZUFRJT05dID0KKyAgICB7CisgICAgICAgIFtEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX1JYX09BTV0gPSBfZHBvZV9zZWNfbWthX2ZzbV9yeF9vYW0sCisgICAgICAgIFtEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX1JYX1RJTUVPVVRdID0gX2Rwb2Vfc2VjX21rYV9mc21fcnhfdGltZW91dCwKKyAgICAgICAgW0RQT0VfU0VDX01LQV9GU01fRVZFTlRfU1RPUF0gPSBfZHBvZV9zZWNfbWthX2ZzbV9zdG9wLAorICAgIH0sCisgICAgW0RQT0VfU0VDX01LQV9GU01fU1RBVEVfU1RBUlRfTUtBXSA9CisgICAgeworICAgICAgICBbRFBPRV9TRUNfTUtBX0ZTTV9FVkVOVF9SWF9FQVBPTF0gPSBfZHBvZV9zZWNfbWthX2ZzbV9zdGFydF9yeF9lYXBvbCwKKyAgICAgICAgW0RQT0VfU0VDX01LQV9GU01fRVZFTlRfUlhfVElNRU9VVF0gPSBfZHBvZV9zZWNfbWthX2ZzbV9yeF90aW1lb3V0LAorICAgICAgICBbRFBPRV9TRUNfTUtBX0ZTTV9FVkVOVF9UWF9USU1FT1VUXSA9IF9kcG9lX3NlY19ta2FfZnNtX3N0YXJ0X3RpbWVvdXQsCisgICAgICAgIFtEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX1NUT1BdID0gX2Rwb2Vfc2VjX21rYV9mc21fc3RvcAorICAgIH0sCisgICAgW0RQT0VfU0VDX01LQV9GU01fU1RBVEVfU0VORF9TQUtdID0KKyAgICB7CisgICAgICAgIFtEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX1JYX0VBUE9MXSA9IF9kcG9lX3NlY19ta2FfZnNtX3Nha19yeF9lYXBvbCwKKyAgICAgICAgW0RQT0VfU0VDX01LQV9GU01fRVZFTlRfUlhfVElNRU9VVF0gPSBfZHBvZV9zZWNfbWthX2ZzbV9yeF90aW1lb3V0LAorICAgICAgICBbRFBPRV9TRUNfTUtBX0ZTTV9FVkVOVF9UWF9USU1FT1VUXSA9IF9kcG9lX3NlY19ta2FfZnNtX3Nha190aW1lb3V0LAorICAgICAgICBbRFBPRV9TRUNfTUtBX0ZTTV9FVkVOVF9TVE9QXSA9IF9kcG9lX3NlY19ta2FfZnNtX3N0b3AKKyAgICB9LAorICAgIFtEUE9FX1NFQ19NS0FfRlNNX1NUQVRFX09QRVJBVElPTkFMXSA9CisgICAgeworICAgICAgICBbRFBPRV9TRUNfTUtBX0ZTTV9FVkVOVF9SWF9FQVBPTF0gPSBfZHBvZV9zZWNfbWthX2ZzbV9oYW5kbGVfa2VlcF9hbGl2ZSwKKyAgICAgICAgW0RQT0VfU0VDX01LQV9GU01fRVZFTlRfUlhfVElNRU9VVF0gPSBfZHBvZV9zZWNfbWthX2ZzbV9yeF90aW1lb3V0LAorICAgICAgICBbRFBPRV9TRUNfTUtBX0ZTTV9FVkVOVF9UWF9USU1FT1VUXSA9IF9kcG9lX3NlY19ta2FfZnNtX3NlbmRfa2VlcF9hbGl2ZSwKKyAgICAgICAgW0RQT0VfU0VDX01LQV9GU01fRVZFTlRfU1RPUF0gPSBfZHBvZV9zZWNfbWthX2ZzbV9zdG9wCisgICAgfSwKKyAgICBbRFBPRV9TRUNfTUtBX0ZTTV9TVEFURV9TRU5EX05FV19TQUtdID0KKyAgICB7CisgICAgICAgIFtEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX1JYX0VBUE9MXSA9IF9kcG9lX3NlY19ta2FfZnNtX25ld19zYWtfcnhfZWFwb2wsCisgICAgICAgIFtEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX1JYX1RJTUVPVVRdID0gX2Rwb2Vfc2VjX21rYV9mc21fcnhfdGltZW91dCwKKyAgICAgICAgW0RQT0VfU0VDX01LQV9GU01fRVZFTlRfVFhfVElNRU9VVF0gPSBfZHBvZV9zZWNfbWthX2ZzbV9zZW5kX2tlZXBfYWxpdmUsCisgICAgICAgIFtEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX1NUT1BdID0gX2Rwb2Vfc2VjX21rYV9mc21fc3RvcAorICAgIH0KK307CisKK3N0YXRpYyBiY21vc19lcnJubyBfZHBvZV9zZWNfbWthX2ZzbV9leGVjKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgZHBvZV9zZWNfbWthX2ZzbV9ldmVudCAqZXZ0KQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9QQVJNOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcyAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04oZXZ0ID09IE5VTEwpOworCisgICAgaWYgKF9kcG9lX3NlY19ta2FfZnNtX2V2ZW50X3R5cGVfaXNfdmFsaWQoZXZ0LT50eXBlKSkKKyAgICB7CisgICAgICAgIGRwb2Vfc2VjX21rYV9mc21fc3RhdGUgcHJlX3N0YXRlID0gbGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21fc3RhdGU7CisKKyAgICAgICAgRFBPRV9TRUNfTElOS19MT0coREVCVUcsIGxpbmtfcmVjLCAiTUtBOiBwcm9jZXNzaW5nIGV2ZW50ICVzIGluIHN0YXRlICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfZHBvZV9zZWNfbWthX2ZzbV9ldmVudF9uYW1lKGV2dC0+dHlwZSksIF9kcG9lX3NlY19ta2FfZnNtX3N0YXRlX25hbWUocHJlX3N0YXRlKSk7CisKKyAgICAgICAgLyogY2FsbCB0aGUgRlNNICovCisgICAgICAgIGlmIChOVUxMICE9IGRwb2Vfc2VjX21rYV9mc21bbGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21fc3RhdGVdW2V2dC0+dHlwZV0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gZHBvZV9zZWNfbWthX2ZzbVtsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9zdGF0ZV1bZXZ0LT50eXBlXShsaW5rX3JlYywgZXZ0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gX2Rwb2Vfc2VjX21rYV9mc21fZXJyb3IobGlua19yZWMsIGV2dCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJlX3N0YXRlICE9IGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX3N0YXRlKQorICAgICAgICB7CisgICAgICAgICAgICBEUE9FX1NFQ19MSU5LX0xPRyhERUJVRywgbGlua19yZWMsICJNS0E6IHRyYW5zaXRpb25pbmcgZnJvbSAlcyB0byAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kcG9lX3NlY19ta2FfZnNtX3N0YXRlX25hbWUocHJlX3N0YXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kcG9lX3NlY19ta2FfZnNtX3N0YXRlX25hbWUobGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21fc3RhdGUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByYzsKK30KKwordm9pZCBkcG9lX3NlY19ta2FfZnNtX3J4X29hbShkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIHVpbnQ4X3QgKmZyYW1lLCB1aW50MTZfdCBsZW5ndGgpCit7CisgICAgZHBvZV9zZWNfbWthX2ZzbV9ldmVudCBldm50ID0ge307CisKKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisKKyAgICAvKiBTZW5kIHRoZSBPQU0gUERVIHRvIHRoZSBzdGF0ZSBtYWNoaW5lLiAqLworICAgIGV2bnQudHlwZSA9IERQT0VfU0VDX01LQV9GU01fRVZFTlRfUlhfT0FNOworICAgIGV2bnQuZGF0YS5yeF9mcmFtZS52YWwgPSBmcmFtZTsKKyAgICBldm50LmRhdGEucnhfZnJhbWUubGVuID0gbGVuZ3RoOworCisgICAgLyogRXhlY3V0ZSB0aGUgc3RhdGUgbWFjaGluZSAqLworICAgIF9kcG9lX3NlY19ta2FfZnNtX2V4ZWMobGlua19yZWMsICZldm50KTsKK30KKwordm9pZCBkcG9lX3NlY19ta2FfZnNtX3J4X2VhcG9sKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgdWludDhfdCAqZnJhbWUsIHVpbnQxNl90IGxlbmd0aCkKK3sKKyAgICBkcG9lX3NlY19ta2FfZnNtX2V2ZW50IGV2bnQgPSB7fTsKKworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKworICAgIC8qIFNlbmQgdGhlIE9BTSBQRFUgdG8gdGhlIHN0YXRlIG1hY2hpbmUuICovCisgICAgZXZudC50eXBlID0gRFBPRV9TRUNfTUtBX0ZTTV9FVkVOVF9SWF9FQVBPTDsKKyAgICBldm50LmRhdGEucnhfZnJhbWUudmFsID0gZnJhbWU7CisgICAgZXZudC5kYXRhLnJ4X2ZyYW1lLmxlbiA9IGxlbmd0aDsKKworICAgIC8qIEV4ZWN1dGUgdGhlIHN0YXRlIG1hY2hpbmUgKi8KKyAgICBfZHBvZV9zZWNfbWthX2ZzbV9leGVjKGxpbmtfcmVjLCAmZXZudCk7Cit9CisKK2JjbW9zX2Vycm5vIGRwb2Vfc2VjX21rYV9mc21fc3RhcnQoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjKQoreworICAgIGRwb2Vfc2VjX21rYV9mc21fZXZlbnQgZXZlbnQgPSB7fTsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworCisgICAgLyogSW5qZWN0IGFuIElOSVRfRVZFTlQgaW50byB0aGUgRlNNLiAqLworICAgIGV2ZW50LnR5cGUgPSBEUE9FX1NFQ19NS0FfRlNNX0VWRU5UX0lOSVQ7CisKKyAgICByZXR1cm4gX2Rwb2Vfc2VjX21rYV9mc21fZXhlYyhsaW5rX3JlYywgJmV2ZW50KTsKK30KKworYmNtb3NfYm9vbCBkcG9lX3NlY19ta2FfZnNtX3J1bm5pbmcoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjKQoreworICAgIGJjbW9zX2Jvb2wgcmMgPSBCQ01PU19GQUxTRTsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworCisgICAgaWYgKChsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9pbmZvICE9IE5VTEwpICYmCisgICAgICAgIChsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9zdGF0ZSA+IERQT0VfU0VDX01LQV9GU01fU1RBVEVfTlVMTCkpCisgICAgeworICAgICAgICByYyA9IEJDTU9TX1RSVUU7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCitiY21vc19lcnJubyBkcG9lX3NlY19ta2FfZnNtX2RlcmVnaXN0ZXIoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKyAgICBkcG9lX3NlY19ta2FfZnNtX2V2ZW50IGV2bnQgPSB7fTsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworCisgICAgLyogVGhlIGRlcmVnaXN0ZXIgZnVuY3Rpb24gaXMgY2FsbGVkIGVhY2ggdGltZSB0aGUgTGluayBkZXJlZ2lzdGVycyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIE1LQSBGU00gaXMgcnVubmluZyBvcgorICAgICAgIG5vdC4gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIGl0IGlzIG5vdCBydW5uaW5nLiAqLworICAgIGlmIChsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9pbmZvICE9IE5VTEwpCisgICAgeworICAgICAgICAvKiBJbmplY3QgYSBzdG9wIGludG8gdGhlIE1LQSBGU00uICovCisgICAgICAgIGV2bnQudHlwZSA9IERQT0VfU0VDX01LQV9GU01fRVZFTlRfU1RPUDsKKyAgICAgICAgcmMgPSBfZHBvZV9zZWNfbWthX2ZzbV9leGVjKGxpbmtfcmVjLCAmZXZudCk7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCit2b2lkIGRwb2Vfc2VjX21rYV9mc21faW5pdChmX2Rwb2Vfc2VjX21rYV9jYiBta2FfY2IpCit7CisgICAgX21rYV9kb25lX2NiID0gbWthX2NiOworfQorCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Rwb2Vfc2VjL2Rwb2Vfc2VjX21rYV9mc20uaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZHBvZV9zZWMvZHBvZV9zZWNfbWthX2ZzbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MjA5YmIKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Rwb2Vfc2VjL2Rwb2Vfc2VjX21rYV9mc20uaApAQCAtMCwwICsxLDkwIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaWZuZGVmIF9EUE9FX1NFQ19NS0FfRlNNX0hfCisjZGVmaW5lIF9EUE9FX1NFQ19NS0FfRlNNX0hfCisKKyNpbmNsdWRlICJiY21vc19zeXN0ZW0uaCIKKyNpbmNsdWRlICJkcG9lX3NlY191dGlsLmgiCisjaW5jbHVkZSAibWthLmgiCisKKy8qIC0tLSBUeXBlcyAtLS0gKi8KKwordHlwZWRlZiBlbnVtIGRwb2Vfc2VjX21rYV9mc21fc3RhdGUKK3sKKyAgICBEUE9FX1NFQ19NS0FfRlNNX1NUQVRFX19JTlZBTElEICAgICAgICAgPSAtMSwgLyoqPCBwZXJtaXRzIGV2ZW50IHZhbGlkYXRpb24gKi8KKworICAgIERQT0VfU0VDX01LQV9GU01fU1RBVEVfTlVMTCAgICAgICAgICAgICA9ICAwLAorICAgIERQT0VfU0VDX01LQV9GU01fU1RBVEVfU0VUX0VOQ1JZUFRJT04gICAsCisgICAgRFBPRV9TRUNfTUtBX0ZTTV9TVEFURV9TVEFSVF9NS0EgICAgICAgICwKKyAgICBEUE9FX1NFQ19NS0FfRlNNX1NUQVRFX1NFTkRfU0FLICAgICAgICAgLAorICAgIERQT0VfU0VDX01LQV9GU01fU1RBVEVfT1BFUkFUSU9OQUwgICAgICAsCisgICAgRFBPRV9TRUNfTUtBX0ZTTV9TVEFURV9TRU5EX05FV19TQUsgICAgICwKKworICAgIERQT0VfU0VDX01LQV9GU01fU1RBVEVfX0NPVU5UCit9IGRwb2Vfc2VjX21rYV9mc21fc3RhdGU7CisKKy8qIERQb0UgU2VjdXJpdHkgTUtBIGluZm9ybWF0aW9uIHN0b3JlZCB3aXRoIGVhY2ggbGluay4gKi8KK3R5cGVkZWYgc3RydWN0IGRwb2Vfc2VjX21rYV9mc21faW5mbworeworICAgIGJjbW9zX3RpbWVyIHJ4X3RpbWVyOyAvKio8IFRpbWVyIGVudHJ5IGZvciBNS0EgRlNNICovCisgICAgYmNtb3NfdGltZXIgdHhfdGltZXI7IC8qKjwgVGltZXIgZW50cnkgZm9yIE1LQSBtZXNzYWdlcyAqLworfSBkcG9lX3NlY19ta2FfZnNtX2luZm87CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgbWthX2xpbmtfaW5mbyAqbWthX2luZm87IC8qKjwgTUtBIGluZm9ybWF0aW9uICovCisgICAgZHBvZV9zZWNfbWthX2ZzbV9pbmZvICpta2FfZnNtX2luZm87IC8qKjwgTUtBIEZTTSBpbmZvcm1hdGlvbiAqLworICAgIGRwb2Vfc2VjX21rYV9mc21fc3RhdGUgbWthX2ZzbV9zdGF0ZTsgLyoqPCBTdGF0ZSBvZiB0aGUgRFBvRSBTZWN1cml0eSBNS0EgRlNNICovCit9IGRwb2Vfc2VjX21rYV9mc21fY3RybDsKKworc3RydWN0IGRwb2Vfc2VjX2xpbmtfcmVjOworCit0eXBlZGVmIHZvaWQgKCpmX2Rwb2Vfc2VjX21rYV9jYikoc3RydWN0IGRwb2Vfc2VjX2xpbmtfcmVjKiwgYmNtb3NfZXJybm8gc3RhdHVzKTsKKworLyogLS0tIEZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tICovCisKKy8qIFN0YXJ0IE1LQSBvbiBhIGxpbmsgKi8KK2JjbW9zX2Vycm5vIGRwb2Vfc2VjX21rYV9mc21fc3RhcnQoc3RydWN0IGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rKTsKKworLyogSGFuZGxlIHJlY2VwdGlvbiBvZiBhbiBPQU0gZnJhbWUgKi8KK3ZvaWQgZHBvZV9zZWNfbWthX2ZzbV9yeF9vYW0oc3RydWN0IGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rLCB1aW50OF90ICpmcmFtZSwgdWludDE2X3QgbGVuZ3RoKTsKKworLyogSGFuZGxlIHJlY2VwdGlvbiBvZiBhbiBFQVBPTCBmcmFtZSAqLwordm9pZCBkcG9lX3NlY19ta2FfZnNtX3J4X2VhcG9sKHN0cnVjdCBkcG9lX3NlY19saW5rX3JlYyAqbGluaywgdWludDhfdCAqZnJhbWUsIHVpbnQxNl90IGxlbmd0aCk7CisKKy8qIElzIHRoZSBNS0EgRlNNIHJ1bm5pbmcgb24gYSBsaW5rPyAqLworYmNtb3NfYm9vbCBkcG9lX3NlY19ta2FfZnNtX3J1bm5pbmcoc3RydWN0IGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rKTsKKworLyogSGFuZGxlIGxpbmsgZGUtcmVnaXN0cmF0aW9uIChzdG9wIHRoZSBNS0EgRlNNKSAqLworYmNtb3NfZXJybm8gZHBvZV9zZWNfbWthX2ZzbV9kZXJlZ2lzdGVyKHN0cnVjdCBkcG9lX3NlY19saW5rX3JlYyAqbGluayk7CisKK3ZvaWQgZHBvZV9zZWNfbWthX2ZzbV9pbml0KGZfZHBvZV9zZWNfbWthX2NiIG1rYV9jYik7CisKKyNlbmRpZiAvKiBfRFBPRV9TRUNfTUtBX0ZTTV9IXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9kcG9lX3NlY191c2VyX2NmZy5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9kcG9lX3NlY191c2VyX2NmZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNmQzZTkKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Rwb2Vfc2VjL2Rwb2Vfc2VjX3VzZXJfY2ZnLmgKQEAgLTAsMCArMSwyMDAgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgX0RQT0VfU0VDX1VTRVJfQ0ZHX0hfCisjZGVmaW5lIF9EUE9FX1NFQ19VU0VSX0NGR19IXworCisjaW5jbHVkZSAiYmNtX2Rldl9sb2cuaCIKKworZXh0ZXJuIGRldl9sb2dfaWQgZHBvZV9zZWNfbG9nX2lkW107CisKK3R5cGVkZWYgdm9pZCogZHBvZV9zZWNfc2hhMV9oYXNoOyAvKiBBIGRhdGEgdHlwZSBmb3IgaG9sZGluZyBhbiBTSEExIGhhc2ggY29udGV4dCAqLwordHlwZWRlZiB1aW50OF90IGRwb2Vfc2VjX3NoYTFfZGlnZXN0WzIwXTsgLyogQSBkYXRhIHR5cGUgZm9yIGhvbGRpbmcgYW4gU0hBMSBoYXNoICovCit0eXBlZGVmIHZvaWQqIGRwb2Vfc2VjX21kNV9oYXNoOyAvKiBBIGRhdGEgdHlwZSBmb3IgaG9sZGluZyBhbiBNRDUgaGFzaCBjb250ZXh0ICovCit0eXBlZGVmIHVpbnQ4X3QgZHBvZV9zZWNfbWQ1X2RpZ2VzdFsxNl07IC8qIEEgZGF0YSB0eXBlIGZvciBob2xkaW5nIGFuIE1ENSBoYXNoICovCit0eXBlZGVmIHZvaWQqIGRwb2Vfc2VjX3JzYV9rZXk7IC8qIEEgZGF0YSB0eXBlIGZvciBob2xkaW5nIGFuIFJTQSBrZXkgKi8KK3R5cGVkZWYgdm9pZCogZHBvZV9zZWNfYWVzX2tleTsgLyogQSBkYXRhIHR5cGUgZm9yIGhvbGRpbmcgYW4gQUVTIGtleSAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgZHBvZV9zZWNfc2hhMV9pbml0KGRwb2Vfc2VjX3NoYTFfaGFzaCAqc2hhMSkKK3sKKyAgICBCQ01fTE9HKEVSUk9SLCBkcG9lX3NlY19sb2dfaWRbY3VycmVudF9kZXZpY2VdLCAiVGhpcyBmdW5jdGlvbiBzaG91bGQgaW5pdGlhbGl6ZS9yZXNldCBhbiBTSEExIGhhc2ggY29udGV4dFxuIik7CisgICAgQlVHKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkcG9lX3NlY19zaGExX3VwZGF0ZShkcG9lX3NlY19zaGExX2hhc2ggKnNoYTEsIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBsZW4pCit7CisgICAgQkNNX0xPRyhFUlJPUiwgZHBvZV9zZWNfbG9nX2lkW2N1cnJlbnRfZGV2aWNlXSwgIlRoaXMgZnVuY3Rpb24gc2hvdWxkIHVwZGF0ZSBhbiBTSEExIGhhc2ggY29udGV4dFxuIik7CisgICAgQlVHKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkcG9lX3NlY19zaGExX2ZpbmFsKGRwb2Vfc2VjX3NoYTFfZGlnZXN0IG1kLCBkcG9lX3NlY19zaGExX2hhc2ggKnNoYTEpCit7CisgICAgQkNNX0xPRyhFUlJPUiwgZHBvZV9zZWNfbG9nX2lkW2N1cnJlbnRfZGV2aWNlXSwgIlRoaXMgZnVuY3Rpb24gc2hvdWxkIGZpbmFsaXplIGFuIFNIQTEgaGFzaCBjb250ZXh0XG4iKTsKKyAgICBCVUcoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRwb2Vfc2VjX21kNV9pbml0KGRwb2Vfc2VjX21kNV9oYXNoICptZDUpCit7CisgICAgQkNNX0xPRyhFUlJPUiwgZHBvZV9zZWNfbG9nX2lkW2N1cnJlbnRfZGV2aWNlXSwgIlRoaXMgZnVuY3Rpb24gc2hvdWxkIGluaXRpYWxpemUvcmVzZXQgYW4gTUQ1IGhhc2ggY29udGV4dFxuIik7CisgICAgQlVHKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkcG9lX3NlY19tZDVfdXBkYXRlKGRwb2Vfc2VjX21kNV9oYXNoICptZDUsIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBsZW4pCit7CisgICAgQkNNX0xPRyhFUlJPUiwgZHBvZV9zZWNfbG9nX2lkW2N1cnJlbnRfZGV2aWNlXSwgIlRoaXMgZnVuY3Rpb24gc2hvdWxkIHVwZGF0ZSBhbiBNRDUgaGFzaCBjb250ZXh0XG4iKTsKKyAgICBCVUcoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRwb2Vfc2VjX21kNV9maW5hbChkcG9lX3NlY19tZDVfZGlnZXN0IG1kLCBkcG9lX3NlY19tZDVfaGFzaCAqbWQ1KQoreworICAgIEJDTV9MT0coRVJST1IsIGRwb2Vfc2VjX2xvZ19pZFtjdXJyZW50X2RldmljZV0sICJUaGlzIGZ1bmN0aW9uIHNob3VsZCBmaW5hbGl6ZSBhbiBNRDUgaGFzaCBjb250ZXh0XG4iKTsKKyAgICBCVUcoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRwb2Vfc2VjX3ByZl9leHBhbmRfNDM0NigKKyAgICB1aW50OF90ICpzZWNyZXQsCisgICAgdWludDMyX3Qgc2VjcmV0X2xlbiwKKyAgICBjb25zdCB1aW50OF90ICpsYWJlbCwKKyAgICB1aW50MzJfdCBsYWJlbF9sZW4sCisgICAgY29uc3QgdWludDhfdCAqc2VlZCwKKyAgICB1aW50MzJfdCBzZWVkX2xlbiwKKyAgICB1aW50OF90ICpvdXRwdXQsCisgICAgdWludDMyX3Qgb3V0cHV0X2xlbikKK3sKKyAgICBCQ01fTE9HKEVSUk9SLCBkcG9lX3NlY19sb2dfaWRbY3VycmVudF9kZXZpY2VdLCAiVGhpcyBmdW5jdGlvbiBzaG91bGQgcGVyZm9ybSB0aGUgcHNldWRvLXJhbmRvbSBmdW5jdGlvbiBmb3IgZXhwYW5zaW9uIG9mIHNlY3JldHMgYXMgZGVmaW5lZCBpbiBSRkMgNDM0Niwgc2VjdGlvbiA1XG4iKTsKKyAgICBCVUcoKTsKK30KKworc3RhdGljIGlubGluZSBkcG9lX3NlY19yc2Ffa2V5ICpkcG9lX3NlY19yc2FfZ2VuZXJhdGVfa2V5KGludCBiaXRzKQoreworICAgIEJDTV9MT0coRVJST1IsIGRwb2Vfc2VjX2xvZ19pZFtjdXJyZW50X2RldmljZV0sICJUaGlzIGZ1bmN0aW9uIHNob3VsZCBnZW5lcmF0ZSBhbiBSU0Ega2V5XG4iKTsKKyAgICBCVUcoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRwb2Vfc2VjX3JzYV9rZXlfZnJlZShkcG9lX3NlY19yc2Ffa2V5ICpyc2EpCit7CisgICAgQkNNX0xPRyhFUlJPUiwgZHBvZV9zZWNfbG9nX2lkW2N1cnJlbnRfZGV2aWNlXSwgIlRoaXMgZnVuY3Rpb24gc2hvdWxkIHJlbGVhc2UgYW55IHJlc291cmNlcyBhbGxvY2F0ZWQgZm9yIGFuIFJTQSBrZXkgYnkgZWl0aGVyIGRwb2Vfc2VjX3JzYV9nZW5lcmF0ZV9rZXkgb3IgZHBvZV9zZWNfeDUwOV9wdWJfa2V5X2dldFxuIik7CisgICAgQlVHKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYmNtb3NfYm9vbCBkcG9lX3NlY19yc2FfcHVibGljX2dldChkcG9lX3NlY19yc2Ffa2V5ICpyc2EsIHVpbnQ4X3QgKnJzYV9tb2R1bHVzLCB1aW50OF90ICpyc2FfZXhwKQoreworICAgIEJDTV9MT0coRVJST1IsIGRwb2Vfc2VjX2xvZ19pZFtjdXJyZW50X2RldmljZV0sICJUaGlzIGZ1bmN0aW9uIHNob3VsZCByZXRyaWV2ZSB0aGUgcHVibGljIG1vZHVsdXMgYW5kIGV4cG9uZW50IG9mIGFuIFJTQSBrZXlcbiIpOworICAgIEJVRygpOworfQorCitzdGF0aWMgaW5saW5lIGludCBkcG9lX3NlY19yc2Ffc2l6ZShkcG9lX3NlY19yc2Ffa2V5ICpyc2EpCit7CisgICAgQkNNX0xPRyhFUlJPUiwgZHBvZV9zZWNfbG9nX2lkW2N1cnJlbnRfZGV2aWNlXSwgIlRoaXMgZnVuY3Rpb24gc2hvdWxkIHJldHVybiB0aGUgc2l6ZSBvZiBhbiBSU0Ega2V5IGluIGJ5dGVzXG4iKTsKKyAgICBCVUcoKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZHBvZV9zZWNfcnNhX3ByaXZhdGVfZGVjcnlwdCgKKyAgICBpbnQgZmxlbiwKKyAgICBjb25zdCB1aW50OF90ICpmcm9tLAorICAgIHVpbnQ4X3QgKnRvLAorICAgIGRwb2Vfc2VjX3JzYV9rZXkgKnJzYSkKK3sKKyAgICBCQ01fTE9HKEVSUk9SLCBkcG9lX3NlY19sb2dfaWRbY3VycmVudF9kZXZpY2VdLCAiVGhpcyBmdW5jdGlvbiBzaG91bGQgcGVyZm9ybSBSU0EgZGVjcnlwdGlvbiB1c2luZyBhIHByaXZhdGUga2V5XG4iKTsKKyAgICBCVUcoKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZHBvZV9zZWNfcnNhX3B1YmxpY19kZWNyeXB0KAorICAgIGludCBmbGVuLAorICAgIGNvbnN0IHVpbnQ4X3QgKmZyb20sCisgICAgdWludDhfdCAqdG8sCisgICAgZHBvZV9zZWNfcnNhX2tleSAqcnNhKQoreworICAgIEJDTV9MT0coRVJST1IsIGRwb2Vfc2VjX2xvZ19pZFtjdXJyZW50X2RldmljZV0sICJUaGlzIGZ1bmN0aW9uIHNob3VsZCBwZXJmb3JtIFJTQSBkZWNyeXB0aW9uIHVzaW5nIGEgcHVibGljIGtleSAoYWxzbyBrbm93biBhcyBzaWduYXR1cmUgdmVyaWZpY2F0aW9uKVxuIik7CisgICAgQlVHKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgZHBvZV9zZWNfcnNhX2tleSAqZHBvZV9zZWNfeDUwOV9wdWJfa2V5X2dldChjb25zdCB1aW50OF90ICpjZXJ0LCB1aW50MzJfdCBjZXJ0X2xlbikKK3sKKyAgICBCQ01fTE9HKEVSUk9SLCBkcG9lX3NlY19sb2dfaWRbY3VycmVudF9kZXZpY2VdLCAiVGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0cmlldmUgYW4gUlNBIHB1YmxpYyBrZXkgZnJvbSBhbiBYLjUwOSBjZXRpZmljYXRlXG4iKTsKKyAgICBCVUcoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRwb2Vfc2VjX2Flc19zZXRfZW5jcnlwdF9rZXkoY29uc3QgdWludDhfdCAqdXNlcl9rZXksIGNvbnN0IGludCBiaXRzLCBkcG9lX3NlY19hZXNfa2V5ICprZXkpCit7CisgICAgQkNNX0xPRyhFUlJPUiwgZHBvZV9zZWNfbG9nX2lkW2N1cnJlbnRfZGV2aWNlXSwgIlRoaXMgZnVuY3Rpb24gc2hvdWxkIGluaXRpYWxpemUgdGhlIEFFUyBrZXkgd2l0aCB0aGUgcHJvdmlkZWQgZGF0YVxuIik7CisgICAgQlVHKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkcG9lX3NlY19hZXNfd3JhcF9rZXkoCisgICAgZHBvZV9zZWNfYWVzX2tleSAqa2V5LAorICAgIHVpbnQ4X3QgKm91dCwKKyAgICBjb25zdCB1aW50OF90ICppbiwKKyAgICB1aW50MzJfdCBsZW4pCit7CisgICAgQkNNX0xPRyhFUlJPUiwgZHBvZV9zZWNfbG9nX2lkW2N1cnJlbnRfZGV2aWNlXSwgIlRoaXMgZnVuY3Rpb24gc2hvdWxkIHBlcmZvcm0gYW4gQUVTIGtleSB3cmFwIG9uIGluXG4iKTsKKyAgICBCVUcoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRwb2Vfc2VjX2Flc19jbWFjKHVpbnQ4X3QgKmtleSwgdWludDhfdCAqbXNnLCB1aW50MzJfdCBsZW4sIHVpbnQ4X3QgKmNvZGUpCit7CisgICAgQkNNX0xPRyhFUlJPUiwgZHBvZV9zZWNfbG9nX2lkW2N1cnJlbnRfZGV2aWNlXSwgIlRoaXMgZnVuY3Rpb24gc2hvdWxkIHBlcmZvcm0gQUVTIENNQUNcbiIpOworICAgIEJVRygpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHBvZV9zZWNfYWVzX2NtYWNfa2RmKAorICAgIHVpbnQ4X3QgKmtleSwKKyAgICBjb25zdCBjaGFyICpsYWJlbCwKKyAgICB1aW50OF90ICpjdHgsCisgICAgdWludDMyX3QgY3R4X2xlbiwKKyAgICB1aW50OF90ICpvdXRfYnVmKQoreworICAgIEJDTV9MT0coRVJST1IsIGRwb2Vfc2VjX2xvZ19pZFtjdXJyZW50X2RldmljZV0sICJUaGlzIGZ1bmN0aW9uIHNob3VsZCBwZXJmb3JtIHRoZSBBRVMgQ01BQyBrZXkgZGVyaXZhdGlvbiBmdW5jdGlvblxuIik7CisgICAgQlVHKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYmNtb3NfZXJybm8gZHBvZV9zZWNfc2VuZF9lYXBvbCgKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlLAorICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5ICpsaW5rX2tleSwKKyAgICB1aW50OF90ICplYXBvbCwKKyAgICB1aW50MTZfdCBsZW5ndGgpCit7CisgICAgQkNNX0xPRyhFUlJPUiwgZHBvZV9zZWNfbG9nX2lkW2N1cnJlbnRfZGV2aWNlXSwgIlRoaXMgZnVuY3Rpb24gc2hvdWxkIHRyYW5zbWl0IGFuIEVBUE9MIGZyYW1lIHRvIHRoZSBzcGVjaWZpZWQgbGlua1xuIik7CisgICAgQlVHKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYmNtb3NfZXJybm8gZHBvZV9zZWNfcm5nX3NlZWQodm9pZCkKK3sKKyAgICBCQ01fTE9HKElORk8sIGRwb2Vfc2VjX2xvZ19pZFtjdXJyZW50X2RldmljZV0sICJUaGlzIGZ1bmN0aW9uIHNob3VsZCBzZWVkIGEgY3J5cHRvZ3JhcGhpY2FsbHkgdmFsaWQgcHNldWRvLXJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yXG4iKTsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRwb2Vfc2VjX2dlbmVyYXRlX25fYnl0ZV9yYW5kb21fbnVtYmVyKHVpbnQ4X3QgKm91dHB1dCwgaW50IGxlbmd0aCkKK3sKKyAgICBCQ01fTE9HKEVSUk9SLCBkcG9lX3NlY19sb2dfaWRbY3VycmVudF9kZXZpY2VdLCAiVGhpcyBmdW5jdGlvbiBzaG91bGQgZ2VuZXJhdGUgYSBwc2V1ZG8tcmFuZG9tIG51bWJlciBvZiB0aGUgc3BlY2lmaWVkIGxlbmd0aFxuIik7CisgICAgQlVHKCk7Cit9CisKKyNlbmRpZiAvKiBfRFBPRV9TRUNfVVNFUl9DRkdfSF8gKi8KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9kcG9lX3NlY191dGlsLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Rwb2Vfc2VjL2Rwb2Vfc2VjX3V0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTMwNDdhCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9kcG9lX3NlY191dGlsLmMKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAgPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICBBbGwgUmlnaHRzIFJlc2VydmVkCisKKyAgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorICBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCisgIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyAgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgb2YgdGhlIHNvZnR3YXJlLgorCisgIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorICB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKKyAgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKKyAgd3JpdHRlbiBjb25zZW50LgorCisgIDo+CisqLworCisjaW5jbHVkZSAiZHBvZV9zZWNfdXRpbC5oIgorI2luY2x1ZGUgImJjbW9sdF9hcGkuaCIKKworZGV2X2xvZ19pZCBkcG9lX3NlY19sb2dfaWRbQkNNVFJfTUFYX09MVFNdOworCitiY21vc19ib29sIGRwb2Vfc2VjX2VhcG9sX3VucGFjayhiY21vbHRfYnVmICpidWYsIGVhcG9sX21zZ19oZHIgKmVhcG9sKQoreworICAgIHJldHVybgorICAgICAgICBiY21vbHRfYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmZWFwb2wtPmRhKSAmJgorICAgICAgICBiY21vbHRfYnVmX3JlYWRfbWFjX2FkZHJlc3MoYnVmLCAmZWFwb2wtPnNhKSAmJgorICAgICAgICBiY21vbHRfYnVmX3JlYWRfdTE2X2JlKGJ1ZiwgJmVhcG9sLT5ldGhlcl90eXBlKSAmJgorICAgICAgICBiY21vbHRfYnVmX3JlYWRfdTgoYnVmLCAmZWFwb2wtPmVhcG9sX3ZlcnNpb24pICYmCisgICAgICAgIGJjbW9sdF9idWZfcmVhZF91OChidWYsICZlYXBvbC0+ZWFwb2xfcGFja2V0X3R5cGUpICYmCisgICAgICAgIGJjbW9sdF9idWZfcmVhZF91MTZfYmUoYnVmLCAmZWFwb2wtPmVhcG9sX2xlbmd0aCk7Cit9CisKK2JjbW9zX2Vycm5vIGJjbW9sdF9lcG9uX2xpbmtfZW5jcnlwdGlvbl9rZXlfc2V0KAorICAgIGJjbW9sdF9kZXZpZCBkZXZpY2UsCisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkgKmxpbmtfa2V5LAorICAgIGJjbW9zX2Jvb2wgdXAsIC8qIFRPRE86IGNyZWF0ZSBleHBsaWNpdCB1cC9kb3duIHR5cGUgZm9yIGNsYXJpdHkgKi8KKyAgICBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX21vZGUgbW9kZSwKKyAgICBiY21vbHRfZXBvbl9rZXlfY2hvaWNlIGtleV9jaG9pY2UsCisgICAgYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyICprZXlfaW5mbykKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBiY21vbHRfZXBvbl9saW5rX2NmZyBjZmc7CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZXBvbl9saW5rLCAqbGlua19rZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZXBvbl9saW5rLCBlcG9uX2VuY3J5cHRpb24pOworICAgIHJjID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlLCAmY2ZnLmhkcik7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKEJDTV9FUlJfT0sgIT0gcmMsIHJjKTsKKworICAgIGlmICh1cCkKKyAgICB7CisgICAgICAgIGNmZy5kYXRhLmVwb25fZW5jcnlwdGlvbi51cHN0cmVhbV9tb2RlID0gbW9kZTsKKyAgICAgICAgY2ZnLmRhdGEuZXBvbl9lbmNyeXB0aW9uLnVwc3RyZWFtX2tleV9jaG9pY2UgPSBrZXlfY2hvaWNlOworICAgICAgICBjZmcuZGF0YS5lcG9uX2VuY3J5cHRpb24udXBzdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbiA9ICprZXlfaW5mbzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY2ZnLmRhdGEuZXBvbl9lbmNyeXB0aW9uLmRvd25zdHJlYW1fbW9kZSA9IG1vZGU7CisgICAgICAgIGNmZy5kYXRhLmVwb25fZW5jcnlwdGlvbi5kb3duc3RyZWFtX2tleV9jaG9pY2UgPSBrZXlfY2hvaWNlOworICAgICAgICBjZmcuZGF0YS5lcG9uX2VuY3J5cHRpb24uZG93bnN0cmVhbV9lbmNyeXB0aW9uX2luZm9ybWF0aW9uID0gKmtleV9pbmZvOworICAgIH0KKworICAgIHJldHVybiBiY21vbHRfY2ZnX3NldChkZXZpY2UsICZjZmcuaGRyKTsKK30KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9kcG9lX3NlY191dGlsLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Rwb2Vfc2VjL2Rwb2Vfc2VjX3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDJmZGRjCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9kcG9lX3NlY191dGlsLmgKQEAgLTAsMCArMSw4NiBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBfRFBPRV9TRUNfVVRJTF9IXworI2RlZmluZSBfRFBPRV9TRUNfVVRJTF9IXworCisjaW5jbHVkZSAiYmNtb3Nfc3lzdGVtLmgiCisjaW5jbHVkZSAiYmNtX2Rldl9sb2cuaCIKKyNpbmNsdWRlICJiY21vbHRfYnVmLmgiCisjaW5jbHVkZSAiYmNtb2x0X3V0aWxzLmgiCisjaW5jbHVkZSAiYmNtb2x0X21vZGVsX3R5cGVzLmgiCisjaW5jbHVkZSAiZHBvZV9zZWNfdXNlcl9jZmcuaCIKKworLyogdGhlIEVBUE9MIEV0aGVybmV0IHR5cGUgKi8KKyNkZWZpbmUgRVRIRVJUWVBFX0VBUE9MIDB4ODg4ZQorCisjZGVmaW5lIEVBUE9MX1BST1RPQ09MX1ZFUlNJT05fRFBPRSAzCisKK3R5cGVkZWYgZW51bQoreworICAgIEVBUE9MX1RZUEVfUEFDS0VULAorICAgIEVBUE9MX1RZUEVfU1RBUlQsCisgICAgRUFQT0xfVFlQRV9MT0dfT0ZGLAorICAgIEVBUE9MX1RZUEVfS0VZLAorICAgIEVBUE9MX1RZUEVfQVNGX0FMRVJULAorICAgIEVBUE9MX1RZUEVfTUtBCit9IGVhcG9sX3R5cGU7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgYmNtb3NfbWFjX2FkZHJlc3MgZGE7CisgICAgYmNtb3NfbWFjX2FkZHJlc3Mgc2E7CisgICAgdWludDE2X3QgZXRoZXJfdHlwZTsKKyAgICB1aW50OF90IGVhcG9sX3ZlcnNpb247CisgICAgdWludDhfdCBlYXBvbF9wYWNrZXRfdHlwZTsKKyAgICB1aW50MTZfdCBlYXBvbF9sZW5ndGg7Cit9IGVhcG9sX21zZ19oZHI7CisKKyNkZWZpbmUgRUFQT0xfTVNHX0hEUl9TSVpFIDE4CisKKyNkZWZpbmUgTElOS19LRVlfRk1UX1NUUiAiUE9OICV1LCAiQkNNT1NfTUFDQUREUl9GTVRfU1RSCisjZGVmaW5lIExJTktfS0VZX0RBVEEobHIpIChsciktPmtleS5lcG9uX25pLCBCQ01PU19NQUNBRERSX1BBUkFNUygmKGxyKS0+a2V5Lm1hY19hZGRyZXNzKQorCisjZGVmaW5lIERQT0VfU0VDX0xJTktfTE9HKGxldmVsLCBsciwgZm10LCBhcmdzLi4uKSBcCisgICAgQkNNX0xPRyhsZXZlbCwgZHBvZV9zZWNfbG9nX2lkWyhsciktPmRldmljZV0sIExJTktfS0VZX0ZNVF9TVFIiOiAiZm10LCBMSU5LX0tFWV9EQVRBKGxyKSwgIyNhcmdzKQorCitzdGF0aWMgY29uc3QgdWludDMyX3QgRFBPRV9TRUNfT0FNX1RJTUVPVVQgPSAyICogMTAwMCAqIDEwMDA7IC8qIDIgc2Vjb25kcyAqLworCitiY21vc19ib29sIGRwb2Vfc2VjX2VhcG9sX3VucGFjayhiY21vbHRfYnVmICpidWYsIGVhcG9sX21zZ19oZHIgKmVhcG9sKTsKKworYmNtb3NfZXJybm8gYmNtb2x0X2Vwb25fbGlua19lbmNyeXB0aW9uX2tleV9zZXQoCisgICAgYmNtb2x0X2RldmlkIGRldmljZSwKKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSAqbGlua19rZXksCisgICAgYmNtb3NfYm9vbCB1cCwKKyAgICBiY21vbHRfZXBvbl9lbmNyeXB0aW9uX21vZGUgbW9kZSwKKyAgICBiY21vbHRfZXBvbl9rZXlfY2hvaWNlIGtleV9jaG9pY2UsCisgICAgYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyICprZXlfaW5mbyk7CisKKyNlbmRpZiAvKiBfRFBPRV9TRUNfVVRJTF9IXyAqLworCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Rwb2Vfc2VjL21rYS5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9ta2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTllYjIzCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9ta2EuYwpAQCAtMCwwICsxLDE0MzQgQEAKKy8qCisgIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCisgIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKKyAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCisgIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgIG9mIHRoZSBzb2Z0d2FyZS4KKworICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyAgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisgIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgIHdyaXR0ZW4gY29uc2VudC4KKworICA6PgorKi8KKworLyoqIEBmaWxlIG1rYS5jCisgKiAgQGJyaWVmIFB1YmxpY2x5IGFjY2Vzc2libGUgQVBJcyBwcm92aWRlZCB0byBwcm9jZXNzIE1LQSByZXF1ZXN0L3Jlc3BvbnNlcy4KKyAqCisgKiAgVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCBvZiB0aGUgcHVibGljL3ByaXZhdGUgQVBJcyB1c2VkIHRvIHByb2Nlc3MgTUtBIGZyYW1lcy4KKyAqCisgKiBNS0EgRXhjaGFuZ2UgU2VxdWVuY2UgOgorICoKKyAqIDEuICBJZiBiaWRpcmVjdGlvbmFsIGVuY3J5cHRpb24gaXMgZW5hYmxlZCwgdGhlIE9MVCB3aWxsIGdlbmVyYXRlIGFuIE1LUERVCisgKiAgICAgY29udGFpbmluZyB0aGUgYmFzaWMgcGFyYW1ldGVyIHNldCBhbmQgZW1wdHkgbGl2ZSBhbmQgcG90ZW50aWFsIHBlZXIKKyAqICAgICBsaXN0cy4KKyAqIDIuICBXaGVuIHRoZSBPTlUgcmVjZWl2ZXMgdGhpcywgaXQgd2lsbCBhZGQgdGhlIE9MVCB0byBpdHMgcG90ZW50aWFsIHBlZXJzCisgKiAgICAgbGlzdC4KKyAqIDMuICBIYXZpbmcgZGlzY292ZXJlZCBhIG5ldyBwb3RlbnRpYWwgcGVlciwgdGhlIE9OVSB3aWxsIHRyYW5zbWl0IGFuIE1LUERVCisgKiAgICAgY29udGFpbmluZyB0aGUgYmFzaWMgcGFyYW1ldGVyIHNldCwgYW5kIGVtcHR5IGxpdmUgcGVlcnMgbGlzdCwgYW5kIGEKKyAqICAgICBwb3RlbnRpYWwgcGVlciBsaXN0IGNvbnRhaW5pbmcgdGhlIE9MVC4KKyAqIDQuICBXaGVuIHRoZSBPTFQgcmVjZWl2ZXMgdGhpcywgaXQgd2lsbCBhZGQgdGhlIE9OVSB0byBpdHMgbGl2ZSBwZWVycyBsaXN0LgorICogNS4gIEhhdmluZyBhZGRlZCBhIG5ldyBsaXZlIHBlZXIsIHRoZSBPTFQgd2lsbCBnZW5lcmF0ZSBhIG5ldyBTQUsgYW5kIGluc3RhbGwKKyAqICAgICBpdCBmb3IgcmVjZWl2ZSAodXNpbmcgdGhlIE9OVXMgU0NJKS4KKyAqIDYuICBUaGUgT0xUIHRoZW4gdHJhbnNtaXRzIGFuIE1LUERVIGNvbnRhaW5pbmcgdGhlIGJhc2ljIHBhcmFtZXRlciBzZXQsIGEKKyAqICAgICBsaXZlIHBlZXIgbGlzdCBjb250YWluaW5nIHRoZSBPTlUsIGFuIGVtcHR5IHBvdGVudGlhbCBwZWVyIGxpc3QsIGEKKyAqICAgICBkaXN0cmlidXRlZCBTQUssIGFuZCBhIFNBSyB1c2FnZSBwYXJhbWV0ZXIgc2V0IGluZGljYXRpbmcgdGhhdCB0aGUgbmV3CisgKiAgICAgU0FLIGhhcyBiZWVuIGluc3RhbGxlZCBmb3IgcmVjZWl2ZS4KKyAqIDcuICBXaGVuIHRoZSBPTlUgcmVjZWl2ZXMgdGhpcywgaXQgd2lsbDoKKyAqICAgICBhLiBBZGQgdGhlIE9MVCB0byBpdHMgbGl2ZSBwZWVycyBsaXN0CisgKiAgICAgYi4gSW5zdGFsbCB0aGUgbmV3IFNBSyBmb3IgcmVjZWl2ZSAodXNpbmcgdGhlIE9MVHMgU0NJKQorICogICAgIGMuIEJlY2F1c2UgdGhlIE9MVCByZXBvcnRlZCB0aGUgU0FLIGluIHVzZSBmb3IgcmVjZWl2ZSwgdGhlIE9OVSB3aWxsCisgKiAgICAgICAgaW5zdGFsbCB0aGUgU0FLIGZvciB0cmFuc21pdCAodXNpbmcgdGhlIE9OVXMgU0NJKS4KKyAqIDguICBUaGUgT05VIHdpbGwgdGhlbiB0cmFuc21pdCBhbiBNS1BEVSBjb250YWluaW5nIHRoZSBiYXNpYyBwYXJhbWV0ZXIgc2V0LAorICogICAgIGEgbGl2ZSBwZWVycyBsaXN0IGNvbnRhaW5pbmcgdGhlIE9MVCwgYW4gZW1wdHkgcG90ZW50aWFsIHBlZXIgbGlzdCwKKyAqICAgICBhbmQgYSBTQUsgdXNhZ2UgcGFyYW1ldGVyIHNldCBpbmRpY2F0aW5nIHRoYXQgdGhlIFNBSyBoYXMgYmVlbiBpbnN0YWxsZWQKKyAqICAgICBmb3IgcmVjZWl2ZSBhbmQgdHJhbnNtaXQuCisgKiA5LiAgV2hlbiB0aGUgT0xUIHJlY2VpdmVzIHRoaXMsIGl0IHdpbGwgc2VlIHRoYXQgdGhlIE9OVSBoYXMgaW5zdGFsbGVkIHRoZQorICogICAgIFNBSyBmb3IgcmVjZWl2ZSBhbmQgd2lsbCBpbnN0YWxsIHRoZSBTQUsgZm9yIHRyYW5zbWl0CisgKiAgICAgKHVzaW5nIHRoZSBPTFRzIFNDSSkuCisgKiAxMC4gVGhlIE9MVCB3aWxsIHRoZW4gdHJhbnNtaXQgYW4gTUtQRFUgY29udGFpbmluZyB0aGUgYmFzaWMgcGFyYW1ldGVyIHNldCwKKyAqICAgICBhIGxpdmUgcGVlciBsaXN0IGNvbnRhaW5pbmcgdGhlIE9OVSwgYW4gZW1wdHkgcG90ZW50aWFsIHBlZXIgbGlzdCBhbmQKKyAqICAgICBhIFNBSyB1c2FnZSBwYXJhbWV0ZXIgc2V0IGluZGljYXRpbmcgdGhlIFNBSyBoYXMgYmVlbiBpbnN0YWxsZWQgZm9yCisgKiAgICAgcmVjZWl2ZSBhbmQgdHJhbnNtaXQuICAoSaGubSBub3Qgc3VyZSBpZiB0aGlzIHN0ZXAgaXMgbmVjZXNzYXJ5KQorICogMTEuIFRoaXMgbWVzc2FnZSB3aWxsIHByb2R1Y2Ugbm8gc3RhdGUgY2hhbmdlIGF0IHRoZSBPTlUsIHNvIGl0IHdpbGwgbm90CisgKiAgICAgcmVzcG9uZCBpbW1lZGlhdGVseS4gKGJvdGggdGhlIE9OVSBhbmQgT0xUIHdpbGwgbmVlZCB0byBzdGFydCBhIDIgc2Vjb25kCisgKiAgICAgdGltZXIgZXZlcnkgdGltZSBhbiBNS1BEVSBpcyB0cmFuc21pdHRlZCA/IGlmIHRoZXkgaGF2ZSBub3QgdHJhbnNtaXR0ZWQKKyAqICAgICBhbiBNS1BEVSBkdWUgdG8gYSBzdGF0ZSBjaGFuZ2Ugd2hlbiB0aGUgdGltZXIgZXhwaXJlcywgdGhleSB3aWxsCisgKiAgICAgdHJhbnNtaXQgYW4gTUtQRFUgY29udGFpbmluZyB0aGUgYmFzaWMgcGFyYW1ldGVyIHNldCBhbmQgbGl2ZSBhbmQKKyAqICAgICBwb3RlbnRpYWwgcGVlciBsaXN0cy4gIElmIGVpdGhlciBzaWRlIGRvZXMgbm90IHJlY2VpdmUgYW4gTUtQRFUgZnJvbQorICogICAgIHRoZSBvdGhlciBmb3IgNiBzZWNvbmRzIHRoZXkgbXVzdCByZW1vdmUgdGhlbSBmcm9tIHRoZWlyIHBlZXIgbGlzdHMuKQorICogMTIuIFdoZW4gdGhlIE9MVCBkZXRlcm1pbmVzIHRoYXQgYSBuZXcgU0FLIGlzIG5lZWRlZCB0aGlzIHByb3RvY29sIHdpbGwKKyAqICAgICByZXBlYXQgc3RlcHMgNS0xMS4gKG1vZGlmaWNhdGlvbnMgdG8gdGhlIHBlZXIgbGlzdHMsIHN1Y2ggYXMgN2EsIHNob3VsZAorICogICAgIG5vdCBiZSByZXF1aXJlZCkKKyAqCisgKiAgQGRlZmdyb3VwIG1rYSBNS0EKKyAqICBAaW5ncm91cCBjbUN0cmwKKyAqCisgKi8KKworI2luY2x1ZGUgIm1rYS5oIgorI2luY2x1ZGUgImRwb2Vfc2VjX3V0aWwuaCIKKyNpbmNsdWRlICJkcG9lX3NlY19mc20uaCIKKworLyogVGhlIGRlc3RpbmF0aW9uIG11bHRpY2FzdCBNQUMgYWRkcmVzcyBmb3IgTUtBIHBhY2tldHMuICovCitzdGF0aWMgY29uc3QgYmNtb3NfbWFjX2FkZHJlc3MgbWthX2RzdF9tYWNfYWRkciA9IHsgLnU4ID0geyAweDAxLCAweDgwLCAweGMyLCAweDAwLCAweDAwLCAweDAzIH0gfTsKKworI2lmIDAKK3N0YXRpYyBjb25zdCBjaGFyICpta2Ffc3RhdGVfbmFtZXNbTUtBX1NUQVRFX19DT1VOVF0gPQoreworICAgICJJbml0aWFsIiwKKyAgICAiV2FpdGluZ0luaXRpYWxQZWVyUmVzcCIsCisgICAgIlNha1NlbnQiLAorICAgICJNa2FEb25lIgorfTsKKyNlbmRpZgorCisjZGVmaW5lIE1LQV9WRVJTSU9OICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1LQV9TRVJWRVJfUFJJT1JJVFkgICAgICAgICAweDMwCisjZGVmaW5lIE1LQV9JTklUX1JFVFJZX0NOVCAgICAgICAgICAzCisjZGVmaW5lIE1LQV9CQVNJQ19QQVJBTV9TRVRfTEVOICAgICA0NCAvKiA0OCAtIGhlYWRlciBsZW4gKDQgYnl0ZSkgKi8KKyNkZWZpbmUgTUtBX0JBU0lDX1BBUkFNX1NFVF9PUFQgICAgIDB4NjAgLyogS2V5U2VydmVyOjAsIE1BQ3NlY0Rlc2lyZWQ6MSwgTUFDc2VjIENhcGFiaWxpdHk6MiAmIGhpZ2ggNCBiaXRzIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlciBzZXQgYm9keSBsZW5ndGggKDApICovCisKKyNkZWZpbmUgTUtBX0FMR09SSVRITV9BR0lMSVRZICAgICAgIDB4MDA4MGMyMDEKKyNkZWZpbmUgTUtBX01OX0xFTiAgICAgICAgICAgICAgICAgIDQgLyogTWVzc2FnZSBOdW1iZXIgKi8KKyNkZWZpbmUgTUtBX0tOX0xFTiAgICAgICAgICAgICAgICAgIDQgLyogS2V5IE51bWJlciAqLworI2RlZmluZSBNS0FfUERVX01BWF9GUkFNRV9MRU4gICAgICAgMzAwCisjZGVmaW5lIE1LQV9IRUxMT19USU1FICAgICAgICAgICAgICAyMDAwIC8qIE1zLCAyIHNlY29uZHMgKi8KKyNkZWZpbmUgTUtBX01BWF9IRUxMT19SRVRSSUVTICAgICAgIDMgLyogTWF4IEhlbGxvIHJldHJpZXMgKi8KKyNkZWZpbmUgTUtBX09MVF9JTklUX0ZSQU1FX0xFTiAgICAgIDc2IC8qIGJhc2ljIHBhcmFtIHNldCg0OCkgKyBudWxsIGxpdmUgcGVlciBsaXN0ICg0KSArIG51bGwgcG90ZW50aWFsIHBlZXIgbGlzdCAoNCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWN2IEluZGljYXRvciAoNCkgKyBJQ1YoMTYpICovCisjZGVmaW5lIE1LQV9PTkVfUEVFUl9MRU4gICAgICAgICAgICAxNiAvKiBvbmUgbGl2ZSBwZWVyIGxlbiAqLworI2RlZmluZSBNS0FfRElTVFJJQlVURURfU0FLX0xFTiAgICAgMzIKKyNkZWZpbmUgTUtBX0lDVl9MRU4gICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIE1LQV9QRFVfTUlOX0xFTkdUSCAgICAgICAgICAzMgorI2RlZmluZSBNS0FfS0VZX1dSQVBQRURfU0FLX0xFTiAgICAgMjQKKyNkZWZpbmUgTUtBX1NBS19VU0VfUEFSQU1fQk9EWV9MRU4gIDQwCisjZGVmaW5lIE1LQV9TQUtfVVNFX1BBUkFNX0xFTSAgICAgICA0NAorI2RlZmluZSBNS0FfTUFYX0FDQ0VQVEFCTEVfUE4gICAgICAgMHhDMDAwMDAwMAorCisjZGVmaW5lIE1LQV9TQUtfVVNFX1BBUkFNX0FOX1NISUZUICAgICAgICAgIDYKKyNkZWZpbmUgTUtBX1NBS19VU0VfUEFSQU1fTEtfVFhfU0hJRlQgICAgICAgNQorI2RlZmluZSBNS0FfU0FLX1VTRV9QQVJBTV9MS19SWF9TSElGVCAgICAgICA0CisjZGVmaW5lIE1LQV9TQUtfVVNFX1BBUkFNX09MRF9LRVlfQU5fTUFTSyAgIDMKKyNkZWZpbmUgTUtBX1NBS19VU0VfUEFSQU1fT0xEX0tFWV9BTl9TRlQgICAgMgorI2RlZmluZSBNS0FfU0FLX1VTRV9QQVJBTV9PTERfS0VZX1RYX1JYICAgICAzCisjZGVmaW5lIE1LQV9TQUtfVVNFX1BBUkFNX1NFQ09ORF9PUFRfQllURSAgIDB4QzAKKworI2RlZmluZSBNS0FfS0VZX0xFTiAgICAgICAgICAgICAgICAgMTYgLyogY29tbW9uIGtleSBzaXplICovCisKKyNkZWZpbmUgTUtBX0tFS19MQUJFTF9MRU4gICAgICAgICAgIDEyIC8qIGxhYmVsIGxlbmd0aCAqLworI2RlZmluZSBNS0FfS0VLX0NPTlRFWFRfTEVOICAgICAgICAgMTYKKworI2RlZmluZSBNS0FfU0FLX0tFWV9XUkFQUEVEX0xFTiAgICAgMjQKKworI2RlZmluZSBNS0FfSUNLX0xBQkVMX0xFTiAgICAgICAgICAgMTIgLyogbGFiZWwgbGVuZ3RoICovCisjZGVmaW5lIE1LQV9JQ0tfQ09OVEVYVF9MRU4gICAgICAgICAxNgorCisjZGVmaW5lIE1LQV9DS05fTEFCRUxfTEVOICAgICAgICAgICAxNiAvKiBsYWJlbCBsZW5ndGggKi8KKyNkZWZpbmUgTUtBX0NLTl9DT05URVhUX0xFTiAgICAgICAgIChTSVpFX09GX0VBUF9TRVNTSU9OX0lEICsgKEJDTU9TX0VUSF9BTEVOICogMikpIC8qIDc3ICovCisKKyNkZWZpbmUgTUtBX0NBS19MQUJFTF9MRU4gICAgICAgICAgIDE2IC8qIGxhYmVsIGxlbmd0aCAqLworI2RlZmluZSBNS0FfQ0FLX0NPTlRFWFRfTEVOICAgICAgICAgMTIgLyogY29udGV4dCBsZW5ndGggKi8KKworLyogTUtQRFUgUGFyYW1ldGVyIHNldCB0eXBlICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBNS1BEVV9QQVJBTV9TRVRfTElWRV9QRUVSX0xJU1QgICAgICA9IDEsCisgICAgTUtQRFVfUEFSQU1fU0VUX1BPVEVOVElBTF9QRUVSX0xJU1QgPSAyLAorICAgIE1LUERVX1BBUkFNX1NFVF9NQUNTRUNfU0FLX1VTRSAgICAgID0gMywKKyAgICBNS1BEVV9QQVJBTV9TRVRfRElTVF9TQUsgICAgICAgICAgICA9IDQsCisgICAgTUtQRFVfUEFSQU1fU0VUX0RJU1RfQ0FLICAgICAgICAgICAgPSA1LAorICAgIE1LUERVX1BBUkFNX1NFVF9LTUQgICAgICAgICAgICAgICAgID0gNiwKKyAgICBNS1BEVV9QQVJBTV9TRVRfQU5OT1VOQ0VNRU5UICAgICAgICA9IDcsCisgICAgTUtQRFVfUEFSQU1fU0VUX0lDVl9JTkRJQ0FUT1IgICAgICAgPSAyNTUsCit9IG1rcGR1X3BhcmFtX3NldF90eXBlOworCit0eXBlZGVmIGVudW0KK3sKKyAgICBNS0FfTVNHX1RJTUVPVVQsCisgICAgTUtBX01TR19EQVRBX0lORAorfSBta2FfbXNnX3R5cGU7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgbWthX21zZ190eXBlIHR5cGU7CisgICAgZWFwb2xfbXNnX2hkciAqbXNnOworICAgIGJjbW9sdF9idWYgKmJ1ZjsKK30gbWthX2V2ZW50OworCisvKiBDYWxjdWxhdGUgS2V5IEVuY3J5cHRpb24gS2V5ICovCitzdGF0aWMgdm9pZCBfbWthX2NhbGNfa2VrKHVpbnQ4X3QgKmtlaywgdWludDhfdCAqY2FrLCB1aW50OF90ICpja24pCit7CisgICAgY2hhciBrZWtfbGFiZWxbTUtBX0tFS19MQUJFTF9MRU4gKyAxXSA9ICJJRUVFODAyMSBLRUsiOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04oa2VrID09IE5VTEwpOworICAgIEJVR19PTihjYWsgPT0gTlVMTCk7CisgICAgQlVHX09OKGNrbiA9PSBOVUxMKTsKKworICAgIGRwb2Vfc2VjX2Flc19jbWFjX2tkZihjYWssIGtla19sYWJlbCwgY2tuLCBNS0FfS0VLX0NPTlRFWFRfTEVOLCBrZWspOworfQorCisvKiBDYWxjdWxhdGUgSW50ZWdyaXR5IENoZWNrIHZhbHVlIEtleSAqLworc3RhdGljIHZvaWQgX21rYV9jYWxjX2ljayh1aW50OF90ICppY2ssIHVpbnQ4X3QgKmNhaywgdWludDhfdCAqY2tuKQoreworICAgIGNoYXIgaWNrX2xhYmVsW01LQV9JQ0tfTEFCRUxfTEVOICsgMV0gPSAiSUVFRTgwMjEgSUNLIjsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGljayA9PSBOVUxMKTsKKyAgICBCVUdfT04oY2FrID09IE5VTEwpOworICAgIEJVR19PTihja24gPT0gTlVMTCk7CisKKyAgICBkcG9lX3NlY19hZXNfY21hY19rZGYoY2FrLCBpY2tfbGFiZWwsIGNrbiwgTUtBX0lDS19DT05URVhUX0xFTiwgaWNrKTsKK30KKworLyogY2FsY3VsYXRlIEludGVncml0eSBDaGVjayBWYWx1ZSAqLworc3RhdGljIHZvaWQgX21rYV9jYWxjX2ljdih1aW50OF90ICppY3YsIHVpbnQ4X3QgKmljaywgdWludDhfdCAqbXNkdSwgdWludDE2X3QgbXNkdV9sZW4pCit7CisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04oaWN2ID09IE5VTEwpOworICAgIEJVR19PTihpY2sgPT0gTlVMTCk7CisgICAgQlVHX09OKG1zZHUgPT0gTlVMTCk7CisKKyAgICBkcG9lX3NlY19hZXNfY21hYyhpY2ssIG1zZHUsIG1zZHVfbGVuLCBpY3YpOworfQorCisvKiBDYWxjdWxhdGUgU2VjdXJlIENvbm5lY3Rpdml0eSBBc3NvY2lhdGlvbiBLZXkgTmFtZSAqLworc3RhdGljIHZvaWQgX21rYV9jYWxjX2NrbihkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIHVpbnQ4X3QgZWFwX3Nlc3NfaWRfbGVuKQoreworICAgIGNoYXIgY2tuX2xhYmVsW01LQV9DS05fTEFCRUxfTEVOICsgMV0gPSAiSUVFRTgwMjEgRUFQIENLTiI7CisgICAgdWludDhfdCBja25fY29udGV4dFtNS0FfQ0tOX0NPTlRFWFRfTEVOXTsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8gPT0gTlVMTCk7CisgICAgQlVHX09OKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+Y2tuID09IE5VTEwpOworICAgIEJVR19PTihsaW5rX3JlYy0+YXV0aF9jdHJsLnRyYW5zX2RhdGEubWFzdGVyX3Nlc3Npb25fa2V5ID09IE5VTEwpOworICAgIEJVR19PTihsaW5rX3JlYy0+YXV0aF9jdHJsLnRyYW5zX2RhdGEuc2Vzc2lvbl9pZCA9PSBOVUxMKTsKKworICAgIG1lbWNweSgmY2tuX2NvbnRleHRbMF0sIGxpbmtfcmVjLT5hdXRoX2N0cmwudHJhbnNfZGF0YS5zZXNzaW9uX2lkLCBlYXBfc2Vzc19pZF9sZW4pOworICAgIG1lbWNweSgmY2tuX2NvbnRleHRbZWFwX3Nlc3NfaWRfbGVuXSwgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5sZXNzZXJfbWFjLnU4LCBCQ01PU19FVEhfQUxFTik7CisgICAgbWVtY3B5KCZja25fY29udGV4dFtlYXBfc2Vzc19pZF9sZW4gKyBCQ01PU19FVEhfQUxFTl0sIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+Z3JlYXRlcl9tYWMudTgsIEJDTU9TX0VUSF9BTEVOKTsKKyAgICBkcG9lX3NlY19hZXNfY21hY19rZGYobGlua19yZWMtPmF1dGhfY3RybC50cmFuc19kYXRhLm1hc3Rlcl9zZXNzaW9uX2tleSwgY2tuX2xhYmVsLCBja25fY29udGV4dCwgTUtBX0NLTl9DT05URVhUX0xFTiwgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5ja24pOworfQorCisvKiBDYWxjdWxhdGUgU2VjdXJlIENvbm5lY3Rpdml0eSBBc3NvY2lhdGlvbiBLZXkgKi8KK3N0YXRpYyB2b2lkIF9ta2FfY2FsY19jYWsoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjKQoreworICAgIGNoYXIgY2FrX2xhYmVsW01LQV9DQUtfTEFCRUxfTEVOICsgMV0gPSAiSUVFRTgwMjEgRUFQIENBSyI7CisgICAgdWludDhfdCBjYWtfY29udGV4dFtNS0FfQ0FLX0NPTlRFWFRfTEVOXTsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8gPT0gTlVMTCk7CisgICAgQlVHX09OKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+Y2FrID09IE5VTEwpOworICAgIEJVR19PTihsaW5rX3JlYy0+YXV0aF9jdHJsLnRyYW5zX2RhdGEubWFzdGVyX3Nlc3Npb25fa2V5ID09IE5VTEwpOworCisgICAgbWVtY3B5KCZjYWtfY29udGV4dFswXSwgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5sZXNzZXJfbWFjLnU4LCBCQ01PU19FVEhfQUxFTik7CisgICAgbWVtY3B5KCZjYWtfY29udGV4dFtCQ01PU19FVEhfQUxFTl0sIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+Z3JlYXRlcl9tYWMudTgsIEJDTU9TX0VUSF9BTEVOKTsKKyAgICBkcG9lX3NlY19hZXNfY21hY19rZGYobGlua19yZWMtPmF1dGhfY3RybC50cmFuc19kYXRhLm1hc3Rlcl9zZXNzaW9uX2tleSwgY2FrX2xhYmVsLCBjYWtfY29udGV4dCwgTUtBX0NBS19DT05URVhUX0xFTiwgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5jYWspOworfQorCisvKiBHZXQgT0xUIHBvcnQgTWFjIGFuZCBsaW5rIE1hYyAmIGNvbXBhcmUuIFRoaXMgaXMgbmVlZGVkIGZvciBjYWxjdWxhdGluZyBDQUsgKi8KK3N0YXRpYyB2b2lkIF9ta2FfZ2V0X29sdF9hbmRfbGlua19tYWMoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjKQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8gPT0gTlVMTCk7CisKKyAgICAvKiBjb21wYXJlIE9MVCBhbmQgTGluayBNQUMgYWRkcmVzc2VzICovCisgICAgaWYgKG1lbWNtcChsaW5rX3JlYy0+bmlfbWFjLnU4LCBsaW5rX3JlYy0+a2V5Lm1hY19hZGRyZXNzLnU4LCBzaXplb2YoQkNNT1NfRVRIX0FMRU4pKSA+PSAwKQorICAgIHsKKyAgICAgICAgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5sZXNzZXJfbWFjID0gbGlua19yZWMtPmtleS5tYWNfYWRkcmVzczsKKyAgICAgICAgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5ncmVhdGVyX21hYyA9IGxpbmtfcmVjLT5uaV9tYWM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+bGVzc2VyX21hYyA9IGxpbmtfcmVjLT5uaV9tYWM7CisgICAgICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+Z3JlYXRlcl9tYWMgPSBsaW5rX3JlYy0+a2V5Lm1hY19hZGRyZXNzOworICAgIH0KK30KKworLyogSW5pdGlhbGl6ZSBsaW5rIE1LQSBpbmZvIHN0cnVjdHVyZSAqLworc3RhdGljIHZvaWQgX21rYV9pbml0X2xpbmtfaW5mbyhkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMpCit7CisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mbyA9PSBOVUxMKTsKKworICAgIC8qIGluaXRpYWxpemUgYWxsIGxvY2FsIHZhbHVlcyAqLworICAgIG1lbXNldChsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8sIDAsIHNpemVvZigqbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvKSk7CisgICAgZHBvZV9zZWNfZ2VuZXJhdGVfbl9ieXRlX3JhbmRvbV9udW1iZXIobGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5vbHRfbWVtYmVyX2lkLCBNS0FfTUlfTEVOKTsKKyAgICBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmN1cnJfbXNnX251bSA9IDE7IC8qIHN0YXJ0IGZyb20gMSAqLworICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+a2V5X251bWJlciA9IDE7IC8qIHN0YXJ0IGZyb20gMSAqLworICAgIF9ta2FfZ2V0X29sdF9hbmRfbGlua19tYWMobGlua19yZWMpOworICAgIF9ta2FfY2FsY19jYWsobGlua19yZWMpOworICAgIF9ta2FfY2FsY19ja24obGlua19yZWMsIFNJWkVfT0ZfRUFQX1NFU1NJT05fSUQpOworICAgIF9ta2FfY2FsY19pY2sobGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5pY2ssIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+Y2FrLCBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmNrbik7CisgICAgX21rYV9jYWxjX2tlayhsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmtlaywgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5jYWssIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+Y2tuKTsKK30KKworc3RhdGljIHZvaWQgX21rYV9jbGVhcl9saW5rX2luZm8oZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjKQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mbyA9PSBOVUxMKTsKKworICAgIG1lbXNldChsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8sIDAsIHNpemVvZigqbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvKSk7Cit9CisKKy8qIEJ1aWxkIEVBUE9MIGhlYWRlciBmb3IgTUtQRFUgKi8KK3N0YXRpYyBiY21vc19ib29sIF9ta2FfYnVpbGRfZWFwb2xfaGVhZGVyKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgYmNtb2x0X2J1ZiAqb3V0X2J1ZiwgdWludDE2X3QgbGVuZ3RoKQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihvdXRfYnVmID09IE5VTEwpOworCisgICAgcmV0dXJuCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfbWFjX2FkZHJlc3Mob3V0X2J1ZiwgbWthX2RzdF9tYWNfYWRkcikgJiYKKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhvdXRfYnVmLCBsaW5rX3JlYy0+bmlfbWFjKSAmJgorICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3UxNl9iZShvdXRfYnVmLCBFVEhFUlRZUEVfRUFQT0wpICYmCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgob3V0X2J1ZiwgRUFQT0xfUFJPVE9DT0xfVkVSU0lPTl9EUE9FKSAmJgorICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3U4KG91dF9idWYsIEVBUE9MX1RZUEVfTUtBKSAmJgorICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3UxNl9iZShvdXRfYnVmLCBsZW5ndGgpOworfQorCisvKiBCdWlsZCBCYXNpYyBwYXJhbWV0ZXIgc2V0LiBUaGlzIHBhcmFtZXRlciBzZXQgaXMgcmVxdWlyZWQgZm9yIGV2ZXJ5IE1LUERVICovCitzdGF0aWMgYmNtb3NfYm9vbCBfbWthX2J1aWxkX2Jhc2ljX3BhcmFtZXRlcl9zZXQoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBiY21vbHRfYnVmICpvdXRfYnVmKQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihvdXRfYnVmID09IE5VTEwpOworICAgIEJVR19PTihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8gPT0gTlVMTCk7CisKKyAgICByZXR1cm4KKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91OChvdXRfYnVmLCBNS0FfVkVSU0lPTikgJiYgLyogVmVyc2lvbiBOdW1iZXIsIDgwMi4xWCBQZy45OCAqLworICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3U4KG91dF9idWYsIE1LQV9TRVJWRVJfUFJJT1JJVFkpICYmIC8qIEtleSBTZXJ2ZXIgUHJpb3JpdHkgKi8KKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91OChvdXRfYnVmLCBNS0FfQkFTSUNfUEFSQU1fU0VUX09QVCkgJiYKKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91OChvdXRfYnVmLCBNS0FfQkFTSUNfUEFSQU1fU0VUX0xFTikgJiYKKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhvdXRfYnVmLCBsaW5rX3JlYy0+bmlfbWFjKSAmJiAvKiA2IGJ5dGUgb2YgU0NJICovCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTE2X2JlKG91dF9idWYsIGxpbmtfcmVjLT5sbGlkKSAmJiAvKiBsb3dlciAyIGJ5dGUgU0NJICovCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGUob3V0X2J1ZiwgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5vbHRfbWVtYmVyX2lkLCBNS0FfTUlfTEVOKSAmJgorICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3UzMl9iZShvdXRfYnVmLCBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmN1cnJfbXNnX251bSsrKSAmJiAvKiBJbXBvcnRhbnQgISEgKi8KKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91MzJfYmUob3V0X2J1ZiwgTUtBX0FMR09SSVRITV9BR0lMSVRZKSAmJgorICAgICAgICBiY21vbHRfYnVmX3dyaXRlKG91dF9idWYsIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+Y2tuLCBNS0FfQ0tOX0xFTiAvIDgpOyAvKiBDQUsgTmFtZShDS04pICovCit9CisKKy8qIEJ1aWxkIGFuIGVtcHR5IExpdmUgUGVlciBvciBQb3RlbnRpYWwgUGVlciBsaXN0IHBhcmFtZXRlciBzZXQgKi8KK3N0YXRpYyBiY21vc19ib29sIF9ta2FfYnVpbGRfZW1wdHlfcGVlcl9saXN0KGJjbW9sdF9idWYgKm91dF9idWYsIHVpbnQ4X3QgdHlwZSkKK3sKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihvdXRfYnVmID09IE5VTEwpOworCisgICAgcmV0dXJuCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgob3V0X2J1ZiwgdHlwZSkgJiYgLyogUGFyYW1ldGVyIHNldCB0eXBlICovCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgob3V0X2J1ZiwgMCkgJiYKKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91OChvdXRfYnVmLCAwKSAmJiAvKiBvcHRpb25zICYgNCBiaXQgbGVuZ3RoICovCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgob3V0X2J1ZiwgMCk7IC8qIFBhcmFtZXRlciBzZXQgYm9keSBsZW5ndGguICovCit9CisKKy8qIEJ1aWxkIExpdmUgUGVlciBMaXN0IG9yIFBvdGVudGlhbCBQZWVyIExpc3QgcGFyYW1ldGVyIHNldCAqLworc3RhdGljIGJjbW9zX2Jvb2wgX21rYV9idWlsZF9wZWVyX2xpc3QoCisgICAgYmNtb2x0X2J1ZiAqb3V0X2J1ZiwKKyAgICB1aW50OF90IHR5cGUsCisgICAgY29uc3QgdWludDhfdCAqbWVtYmVyX2lkLAorICAgIHVpbnQzMl90IG1lc3NhZ2VfbnVtKQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKG91dF9idWYgPT0gTlVMTCk7CisgICAgQlVHX09OKG1lbWJlcl9pZCA9PSBOVUxMKTsKKworICAgIHJldHVybgorICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3U4KG91dF9idWYsIHR5cGUpICYmIC8qIFBhcmFtZXRlciBzZXQgdHlwZSAqLworICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3U4KG91dF9idWYsIDApICYmCisgICAgICAgIGJjbW9sdF9idWZfd3JpdGVfdTgob3V0X2J1ZiwgMCkgJiYgLyogb3B0aW9ucyAmIDQgYml0IGxlbmd0aCAqLworICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3U4KG91dF9idWYsIE1LQV9NSV9MRU4gKyBzaXplb2YodWludDMyX3QpKSAmJiAvKiBQYXJhbWV0ZXIgc2V0IGJvZHkgbGVuZ3RoLiAqLworICAgICAgICBiY21vbHRfYnVmX3dyaXRlKG91dF9idWYsIG1lbWJlcl9pZCwgTUtBX01JX0xFTikgJiYKKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91MzJfYmUob3V0X2J1ZiwgbWVzc2FnZV9udW0pOworfQorCisvKiBCdWlsZCBJQ1YgSW5kaWNhdG9yIHBhcmFtZXRlciBzZXQgKi8KK3N0YXRpYyBiY21vc19ib29sIF9ta2FfYnVpbGRfaWN2X2luZGljYXRvcihiY21vbHRfYnVmICpvdXRfYnVmKQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKG91dF9idWYgPT0gTlVMTCk7CisKKyAgICByZXR1cm4KKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91OChvdXRfYnVmLCBNS1BEVV9QQVJBTV9TRVRfSUNWX0lORElDQVRPUikgJiYKKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91OChvdXRfYnVmLCAwKSAmJgorICAgICAgICBiY21vbHRfYnVmX3dyaXRlX3U4KG91dF9idWYsIDApICYmIC8qIG9wdGlvbnMgJiA0IGJpdCBsZW5ndGggKi8KKyAgICAgICAgYmNtb2x0X2J1Zl93cml0ZV91OChvdXRfYnVmLCBNS0FfSUNWX0xFTik7IC8qIFBhcmFtZXRlciBzZXQgYm9keSBsZW5ndGguICovCit9CisKKy8qIEJ1aWxkIERpc3RyaWJ1dGVkIFNBSyBwYXJhbWV0ZXIgc2V0IChHQ00tQUVTLTEyOCkgKi8KK3N0YXRpYyBiY21vc19ib29sIF9ta2FfYnVpbGRfZGlzdHJpYnV0ZWRfc2FrKAorICAgIGNvbnN0IGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywKKyAgICBiY21vbHRfYnVmICpvdXRfYnVmLAorICAgIGNvbnN0IHVpbnQ4X3QgKmtleV93cmFwcGVkX3NhaykKK3sKKyAgICB1aW50OF90IG9wdGlvbjsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8gPT0gTlVMTCk7CisgICAgQlVHX09OKG91dF9idWYgPT0gTlVMTCk7CisgICAgQlVHX09OKGtleV93cmFwcGVkX3NhayA9PSBOVUxMKTsKKworICAgIC8qIG5lZWQgRGlzdHJpYnV0ZWQgQU4gJiBDb25maWRlbnRpYWxpdHkgT2Zmc2V0IChiaXQgNSw0LiB1c2UgMCkgKi8KKyAgICBvcHRpb24gPSBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmFzc29jaWF0aW9uX251bWJlcjsKKworICAgIG9wdGlvbiA8PD0gTUtBX1NBS19VU0VfUEFSQU1fQU5fU0hJRlQ7IC8qIG1vdmUgdG8gYml0IDcsNiAqLworCisgICAgLyoga2V5IG51bWJlciAmIEFOIHdpbGwgYmUgaW5jcmVhc2VkIGZyb20gdGhlIGNhbGxlciAqLworICAgIGlmICghYmNtb2x0X2J1Zl93cml0ZV91OChvdXRfYnVmLCBNS1BEVV9QQVJBTV9TRVRfRElTVF9TQUspIHx8CisgICAgICAgICFiY21vbHRfYnVmX3dyaXRlX3U4KG91dF9idWYsIG9wdGlvbikgfHwKKyAgICAgICAgIWJjbW9sdF9idWZfd3JpdGVfdTgob3V0X2J1ZiwgMCkgfHwgLyogb3B0aW9ucyAmIDQgYml0IGxlbmd0aCAqLworICAgICAgICAhYmNtb2x0X2J1Zl93cml0ZV91OChvdXRfYnVmLCBNS0FfS0VZX1dSQVBQRURfU0FLX0xFTiArIE1LQV9LTl9MRU4pIHx8CisgICAgICAgICFiY21vbHRfYnVmX3dyaXRlX3UzMl9iZShvdXRfYnVmLCBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmtleV9udW1iZXIpIHx8CisgICAgICAgICFiY21vbHRfYnVmX3dyaXRlKG91dF9idWYsIGtleV93cmFwcGVkX3NhaywgTUtBX0tFWV9XUkFQUEVEX1NBS19MRU4pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworLyogQnVpbGQgTUFDc2VjIFNBSyBVc2UgcGFyYW1hdGVyIHNldCAqLworc3RhdGljIGJjbW9zX2Jvb2wgX21rYV9idWlsZF9zYWtfdXNlX3BhcmFtKAorICAgIGNvbnN0IGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywKKyAgICBiY21vbHRfYnVmICpvdXRfYnVmLAorICAgIGJjbW9zX2Jvb2wgc2V0X3R4LAorICAgIGJjbW9zX2Jvb2wgc2V0X3J4KQoreworICAgIHVpbnQ4X3Qgb3B0aW9uMSA9IDA7CisgICAgdWludDhfdCBvcHRpb24yID0gMDsKKyAgICB1aW50OF90IHRtcCA9IDA7CisgICAgdWludDMyX3Qgb2xkX2tuOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mbyA9PSBOVUxMKTsKKyAgICBCVUdfT04ob3V0X2J1ZiA9PSBOVUxMKTsKKworICAgIC8qIG9wdGlvbiAxOiBMYXRlc3QgS2V5IEFOKDc6NiksIExhdGVzdCBLZXkgVHgoNSksIExhdGVzdCBLZXkgUngoNCkgT2xkIEtleSBBTigzOjIpLCBPbGQgS2V5IFR4KDEpLCBPbGQgS2V5IFJ4KDApICovCisgICAgb3B0aW9uMSA9IGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+YXNzb2NpYXRpb25fbnVtYmVyOworICAgIG9wdGlvbjEgPDw9IE1LQV9TQUtfVVNFX1BBUkFNX0FOX1NISUZUOyAvKiBtb3ZlIHRvIGJpdCA3LDYgKEFOKSAqLworCisgICAgaWYgKHNldF90eCkKKyAgICB7CisgICAgICAgIHRtcCA9IDEgPDwgTUtBX1NBS19VU0VfUEFSQU1fTEtfVFhfU0hJRlQ7IC8qIExhdGVzdCBLZXkgVFggKi8KKyAgICB9CisgICAgaWYgKHNldF9yeCkKKyAgICB7CisgICAgICAgIHRtcCA9IHRtcCB8ICgxIDw8IE1LQV9TQUtfVVNFX1BBUkFNX0xLX1JYX1NISUZUKTsgLyogTGF0ZXN0IEtleSBSeCAqLworICAgIH0KKworICAgIC8qIGZvciBmaXJzdCBmcmFtZSwgYWxsIDAgaXMgdXNlZCBmb3Igb2xkIGtleSBpbmZvICovCisgICAgaWYgKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+cmVmcmVzaF9jbnQgIT0gMCkKKyAgICB7CisgICAgICAgIC8qIGZvciBPTEQgQU4sIHR4LCByeCBiaXRzICovCisgICAgICAgIHRtcCA9IHRtcCB8ICgobGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5hc3NvY2lhdGlvbl9udW1iZXIgJiBNS0FfU0FLX1VTRV9QQVJBTV9PTERfS0VZX0FOX01BU0spIDw8IE1LQV9TQUtfVVNFX1BBUkFNX09MRF9LRVlfQU5fU0ZUKTsKKyAgICAgICAgdG1wID0gdG1wIHwgTUtBX1NBS19VU0VfUEFSQU1fT0xEX0tFWV9UWF9SWDsgLyogc2hvdWxkIGhhdmUgYmVlbiB0eCAmIHJ4ICovCisgICAgfQorICAgIG9wdGlvbjEgfD0gdG1wOworCisgICAgLyogb3B0aW9uIDI6IG9ubHkgc2V0IGJpdCA3LDYocGxhaW4gdHggJiBwbGFpbiByeCkuIGFsbCBvdGhlciBiaXRzIGluY2x1ZGluZyA0IGJpdHMgbGVuZ3RoIGZpZWxkIHNob3VsZCBiZSAwICovCisgICAgb3B0aW9uMiA9IE1LQV9TQUtfVVNFX1BBUkFNX1NFQ09ORF9PUFRfQllURTsKKworICAgIC8qIG5lZWQgdG8gZGVjcmVtZW50IGtleSBudW1iZXIgZm9yIG9sZCBrZXkgKGJlY2F1c2Uga2V5IG51bWVyIG1heSBiZSBhbHJlYWR5IGluY3JlbWVudGVkKSAqLworICAgIGlmIChsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmtleV9udW1iZXIgPT0gMSkgLyogaW5pdGlhbCBudW1iZXIgKi8KKyAgICB7CisgICAgICAgIG9sZF9rbiA9IDE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG9sZF9rbiA9IGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+a2V5X251bWJlciAtIDE7CisgICAgfQorCisgICAgaWYgKCFiY21vbHRfYnVmX3dyaXRlX3U4KG91dF9idWYsIE1LUERVX1BBUkFNX1NFVF9NQUNTRUNfU0FLX1VTRSkgfHwKKyAgICAgICAgIWJjbW9sdF9idWZfd3JpdGVfdTgob3V0X2J1Ziwgb3B0aW9uMSkgfHwKKyAgICAgICAgIWJjbW9sdF9idWZfd3JpdGVfdTgob3V0X2J1Ziwgb3B0aW9uMikgfHwKKyAgICAgICAgIWJjbW9sdF9idWZfd3JpdGVfdTgob3V0X2J1ZiwgTUtBX1NBS19VU0VfUEFSQU1fQk9EWV9MRU4pIHx8CisgICAgICAgICFiY21vbHRfYnVmX3dyaXRlKG91dF9idWYsIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+b2x0X21lbWJlcl9pZCwgTUtBX01JX0xFTikgfHwKKyAgICAgICAgIWJjbW9sdF9idWZfd3JpdGVfdTMyX2JlKG91dF9idWYsIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+a2V5X251bWJlcikgfHwKKyAgICAgICAgIWJjbW9sdF9idWZfd3JpdGVfdTMyX2JlKG91dF9idWYsIDEpIHx8IC8qIExvd2VzdCBhY2NlcHRhYmxlIFBOLCBzdGFydCBmcm9tIDEgKi8KKyAgICAgICAgIWJjbW9sdF9idWZfd3JpdGUob3V0X2J1ZiwgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5vbHRfbWVtYmVyX2lkLCBNS0FfTUlfTEVOKSB8fAorICAgICAgICAhYmNtb2x0X2J1Zl93cml0ZV91MzJfYmUob3V0X2J1Ziwgb2xkX2tuKSB8fAorICAgICAgICAhYmNtb2x0X2J1Zl93cml0ZV91MzJfYmUob3V0X2J1ZiwgMSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RSVUU7Cit9CisKKy8qIENhbGN1bGF0ZSBJQ1YgYW5kIGF0dGFjaCBpdCBhdCB0aGUgZW5kIG9mIE1LUERVICovCitzdGF0aWMgYmNtb3NfYm9vbCBfbWthX2NhbGNfYW5kX2F0dGFjaF9pY3YobWthX2xpbmtfaW5mbyAqbWthX2luZm8sIGJjbW9sdF9idWYgKm91dF9idWYpCit7CisgICAgdWludDhfdCBpY2tbTUtBX0tFWV9MRU5dOworICAgIHVpbnQ4X3QgaWN2W01LQV9LRVlfTEVOXTsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKG1rYV9pbmZvID09IE5VTEwpOworICAgIEJVR19PTihvdXRfYnVmID09IE5VTEwpOworCisgICAgX21rYV9jYWxjX2ljayhpY2ssIG1rYV9pbmZvLT5jYWssIG1rYV9pbmZvLT5ja24pOworCisgICAgLyogSUNWIHdpbGwgYmUgY2FsY3VsYXRlZCBmcm9tIERBIHRvIGVuZCBvZiBJQ1YgaW5kaWNhdG9yICovCisgICAgX21rYV9jYWxjX2ljdihpY3YsIGljaywgb3V0X2J1Zi0+c3RhcnQsICh1aW50MTZfdCliY21vbHRfYnVmX2dldF91c2VkKG91dF9idWYpKTsKKworICAgIHJldHVybiBiY21vbHRfYnVmX3dyaXRlKG91dF9idWYsIGljdiwgTUtBX0tFWV9MRU4pOworfQorCisvKiBTZW5kIHRoZSBmaXJzdCBNS0EgZnJhbWUgdG8gT05VICovCitzdGF0aWMgYmNtb3NfYm9vbCBfbWthX3NlbmRfaW5pdF9mcmFtZShkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMpCit7CisgICAgYmNtb2x0X2J1ZiBvdXRfYnVmOworICAgIHVpbnQ4X3QgZnJhbWVbTUtBX1BEVV9NQVhfRlJBTUVfTEVOXTsKKyAgICBiY21vc19ib29sIHJldCA9IEJDTU9TX0ZBTFNFOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mbyA9PSBOVUxMKTsKKworICAgIGJjbW9sdF9idWZfaW5pdCgmb3V0X2J1ZiwgTUtBX1BEVV9NQVhfRlJBTUVfTEVOLCBmcmFtZSwgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpOworICAgIC8qIGNvbnN0cnVjdCBmcmFtZSAqLworICAgIGlmICghX21rYV9idWlsZF9lYXBvbF9oZWFkZXIobGlua19yZWMsICZvdXRfYnVmLCBNS0FfT0xUX0lOSVRfRlJBTUVfTEVOKSB8fAorICAgICAgICAhX21rYV9idWlsZF9iYXNpY19wYXJhbWV0ZXJfc2V0KGxpbmtfcmVjLCAmb3V0X2J1ZikgfHwKKyAgICAgICAgIV9ta2FfYnVpbGRfZW1wdHlfcGVlcl9saXN0KCZvdXRfYnVmLCBNS1BEVV9QQVJBTV9TRVRfTElWRV9QRUVSX0xJU1QpIHx8CisgICAgICAgICFfbWthX2J1aWxkX2VtcHR5X3BlZXJfbGlzdCgmb3V0X2J1ZiwgTUtQRFVfUEFSQU1fU0VUX1BPVEVOVElBTF9QRUVSX0xJU1QpIHx8CisgICAgICAgICFfbWthX2J1aWxkX2ljdl9pbmRpY2F0b3IoJm91dF9idWYpIHx8CisgICAgICAgICFfbWthX2NhbGNfYW5kX2F0dGFjaF9pY3YobGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLCAmb3V0X2J1ZikpIC8qIGxhc3QgaW1wb3J0YW50IHN0ZXAuIENhbGMgJiBhdHRhY2ggSUNWICovCisgICAgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmIChCQ01fRVJSX09LID09IGRwb2Vfc2VjX3NlbmRfZWFwb2wobGlua19yZWMtPmRldmljZSwgJmxpbmtfcmVjLT5rZXksIGZyYW1lLCBiY21vbHRfYnVmX2dldF91c2VkKCZvdXRfYnVmKSkpCisgICAgeworICAgICAgICBiY21vc190aW1lcl9zdGFydCgmbGlua19yZWMtPm1rYV9jdHJsLm1rYV9mc21faW5mby0+cnhfdGltZXIsIE1LQV9MSUZFX1RJTUUgKiAxMDAwKTsKKyAgICAgICAgYmNtb3NfdGltZXJfc3RhcnQoJmxpbmtfcmVjLT5ta2FfY3RybC5ta2FfZnNtX2luZm8tPnR4X3RpbWVyLCBNS0FfSEVMTE9fVElNRSAqIDEwMDApOworICAgICAgICByZXQgPSBCQ01PU19UUlVFOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qIEdlbmVyYXRlIGEgU0FLIHVzaW5nIFJORyAqLwordm9pZCBta2FfZ2VuZXJhdGVfc2FrKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYywgYmNtb3NfYm9vbCBpbml0aWFsKQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8gPT0gTlVMTCk7CisKKyAgICAvKiBHZW5lcmF0ZSBTQUsgKi8KKyAgICBpZiAoaW5pdGlhbCkKKyAgICB7CisgICAgICAgIF9ta2FfY2FsY19rZWsobGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5rZWssIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+Y2FrLCBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmNrbik7CisgICAgICAgIGRwb2Vfc2VjX2dlbmVyYXRlX25fYnl0ZV9yYW5kb21fbnVtYmVyKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+c2FrLCBNS0FfS0VZX0xFTik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGRwb2Vfc2VjX2dlbmVyYXRlX25fYnl0ZV9yYW5kb21fbnVtYmVyKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+bmV3X3NhaywgTUtBX0tFWV9MRU4pOworICAgIH0KK30KKworLyogU2VuZCB0aGUgU0FLIHRvIHRoZSBPTlUgKi8KK2JjbW9zX2Vycm5vIG1rYV9zZW5kX3NhayhkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIHVpbnQ4X3QgKnNhaykKK3sKKyAgICBiY21vbHRfYnVmIG91dF9idWY7CisgICAgdWludDhfdCBmcmFtZVtNS0FfUERVX01BWF9GUkFNRV9MRU5dOworICAgIHVpbnQ4X3Qga2V5X3dyYXBwZWRfc2FrW01LQV9LRVlfTEVOICogMl0gPSB7fTsKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfQ09NTV9GQUlMOworICAgIGRwb2Vfc2VjX2Flc19rZXkgYWVzX2tleTsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8gPT0gTlVMTCk7CisKKyAgICBiY21vbHRfYnVmX2luaXQoJm91dF9idWYsIE1LQV9QRFVfTUFYX0ZSQU1FX0xFTiwgZnJhbWUsIEJDTU9MVF9CVUZfRU5ESUFOX0ZJWEVEKTsKKyAgICAvKiBrZXkgd3JhcCBzYWsgdXNpbmcga2VrICovCisgICAgZHBvZV9zZWNfYWVzX3NldF9lbmNyeXB0X2tleShsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmtlaywgTUtBX0tFS19MRU4sICZhZXNfa2V5KTsKKyAgICBkcG9lX3NlY19hZXNfd3JhcF9rZXkoJmFlc19rZXksIGtleV93cmFwcGVkX3Nhaywgc2FrLCBNS0FfU0FLX0xFTik7CisKKyAgICAvKiBjb25zdHJ1Y3QgZnJhbWUgKi8KKyAgICBpZiAoIV9ta2FfYnVpbGRfZWFwb2xfaGVhZGVyKAorICAgICAgICAgICAgbGlua19yZWMsCisgICAgICAgICAgICAmb3V0X2J1ZiwKKyAgICAgICAgICAgIE1LQV9PTFRfSU5JVF9GUkFNRV9MRU4gKyBNS0FfT05FX1BFRVJfTEVOICsgTUtBX0RJU1RSSUJVVEVEX1NBS19MRU4gKyBNS0FfU0FLX1VTRV9QQVJBTV9MRU0pIHx8CisgICAgICAgICFfbWthX2J1aWxkX2Jhc2ljX3BhcmFtZXRlcl9zZXQobGlua19yZWMsICZvdXRfYnVmKSB8fAorICAgICAgICAhX21rYV9idWlsZF9wZWVyX2xpc3QoCisgICAgICAgICAgICAmb3V0X2J1ZiwKKyAgICAgICAgICAgIE1LUERVX1BBUkFNX1NFVF9MSVZFX1BFRVJfTElTVCwKKyAgICAgICAgICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+bGlua19tZW1lYmVyX2lkLAorICAgICAgICAgICAgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5saW5rX21zZ19udW0pIHx8CisgICAgICAgICFfbWthX2J1aWxkX2VtcHR5X3BlZXJfbGlzdCgmb3V0X2J1ZiwgTUtQRFVfUEFSQU1fU0VUX1BPVEVOVElBTF9QRUVSX0xJU1QpIHx8CisgICAgICAgICFfbWthX2J1aWxkX2Rpc3RyaWJ1dGVkX3NhayhsaW5rX3JlYywgJm91dF9idWYsIGtleV93cmFwcGVkX3NhaykgfHwKKyAgICAgICAgIV9ta2FfYnVpbGRfc2FrX3VzZV9wYXJhbShsaW5rX3JlYywgJm91dF9idWYsIEJDTU9TX0ZBTFNFLCBCQ01PU19UUlVFKSB8fCAvKiBzZXQgUlggb25seSAqLworICAgICAgICAhX21rYV9idWlsZF9pY3ZfaW5kaWNhdG9yKCZvdXRfYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09WRVJGTE9XOworICAgIH0KKworICAgIC8qIGxhc3QgaW1wb3J0YW50IHN0ZXAuIENhbGMgJiBhdHRhY2ggSUNWICovCisgICAgX21rYV9jYWxjX2FuZF9hdHRhY2hfaWN2KGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mbywgJm91dF9idWYpOworCisgICAgaWYgKEJDTV9FUlJfT0sgPT0gZHBvZV9zZWNfc2VuZF9lYXBvbChsaW5rX3JlYy0+ZGV2aWNlLCAmbGlua19yZWMtPmtleSwgZnJhbWUsIGJjbW9sdF9idWZfZ2V0X3VzZWQoJm91dF9idWYpKSkKKyAgICB7CisgICAgICAgIGJjbW9zX3RpbWVyX3N0YXJ0KCZsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9pbmZvLT50eF90aW1lciwgTUtBX0hFTExPX1RJTUUgKiAxMDAwKTsKKyAgICAgICAgcmMgPSBCQ01fRVJSX09LOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyogUmVjZWl2ZWQgU0FLIHJlc3BvbnNlLiBTZW5kIGNvbmZpcm0gZnJhbWUgdG8gT05VICovCitzdGF0aWMgYmNtb3NfYm9vbCBfbWthX3NlbmRfc2FrX2NvbmZpcm1fZnJhbWUoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjKQoreworICAgIGJjbW9sdF9idWYgb3V0X2J1ZjsKKyAgICB1aW50OF90IGZyYW1lW01LQV9QRFVfTUFYX0ZSQU1FX0xFTl07CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04obGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvID09IE5VTEwpOworCisgICAgYmNtb2x0X2J1Zl9pbml0KCZvdXRfYnVmLCBNS0FfUERVX01BWF9GUkFNRV9MRU4sIGZyYW1lLCBCQ01PTFRfQlVGX0VORElBTl9GSVhFRCk7CisgICAgaWYgKCFfbWthX2J1aWxkX2VhcG9sX2hlYWRlcihsaW5rX3JlYywgJm91dF9idWYsIE1LQV9PTFRfSU5JVF9GUkFNRV9MRU4gKyBNS0FfT05FX1BFRVJfTEVOICsgTUtBX1NBS19VU0VfUEFSQU1fTEVNKSB8fAorICAgICAgICAhX21rYV9idWlsZF9iYXNpY19wYXJhbWV0ZXJfc2V0KGxpbmtfcmVjLCAmb3V0X2J1ZikgfHwKKyAgICAgICAgIV9ta2FfYnVpbGRfcGVlcl9saXN0KAorICAgICAgICAgICAgJm91dF9idWYsIE1LUERVX1BBUkFNX1NFVF9MSVZFX1BFRVJfTElTVCwKKyAgICAgICAgICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+bGlua19tZW1lYmVyX2lkLAorICAgICAgICAgICAgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5saW5rX21zZ19udW0pIHx8CisgICAgICAgICFfbWthX2J1aWxkX2VtcHR5X3BlZXJfbGlzdCgmb3V0X2J1ZiwgTUtQRFVfUEFSQU1fU0VUX1BPVEVOVElBTF9QRUVSX0xJU1QpIHx8CisgICAgICAgICFfbWthX2J1aWxkX3Nha191c2VfcGFyYW0obGlua19yZWMsICZvdXRfYnVmLCBCQ01PU19UUlVFLCBCQ01PU19UUlVFKSB8fAorICAgICAgICAhX21rYV9idWlsZF9pY3ZfaW5kaWNhdG9yKCZvdXRfYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAvKiBsYXN0IGltcG9ydGFudCBzdGVwLiBDYWxjICYgYXR0YWNoIElDViAqLworICAgIF9ta2FfY2FsY19hbmRfYXR0YWNoX2ljdihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8sICZvdXRfYnVmKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LID09IGRwb2Vfc2VjX3NlbmRfZWFwb2wobGlua19yZWMtPmRldmljZSwgJmxpbmtfcmVjLT5rZXksIGZyYW1lLCBiY21vbHRfYnVmX2dldF91c2VkKCZvdXRfYnVmKSk7Cit9CisKKy8qIHNlbmQga2VlcC1hbGl2ZSBmcmFtZSBldmVyeSAyIHNlY29uZHMgKi8KK3N0YXRpYyBiY21vc19ib29sIF9ta2Ffc2VuZF9rZWVwYWxpdmVfZnJhbWUoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjKQoreworICAgIGJjbW9sdF9idWYgb3V0X2J1ZjsKKyAgICB1aW50OF90IGZyYW1lW01LQV9QRFVfTUFYX0ZSQU1FX0xFTl07CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04obGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvID09IE5VTEwpOworCisgICAgYmNtb2x0X2J1Zl9pbml0KCZvdXRfYnVmLCBNS0FfUERVX01BWF9GUkFNRV9MRU4sIGZyYW1lLCBCQ01PTFRfQlVGX0VORElBTl9GSVhFRCk7CisgICAgaWYgKCFfbWthX2J1aWxkX2VhcG9sX2hlYWRlcihsaW5rX3JlYywgJm91dF9idWYsIE1LQV9PTFRfSU5JVF9GUkFNRV9MRU4gKyBNS0FfT05FX1BFRVJfTEVOKSB8fAorICAgICAgICAhX21rYV9idWlsZF9iYXNpY19wYXJhbWV0ZXJfc2V0KGxpbmtfcmVjLCAmb3V0X2J1ZikgfHwKKyAgICAgICAgIV9ta2FfYnVpbGRfcGVlcl9saXN0KAorICAgICAgICAgICAgJm91dF9idWYsCisgICAgICAgICAgICBNS1BEVV9QQVJBTV9TRVRfTElWRV9QRUVSX0xJU1QsCisgICAgICAgICAgICBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmxpbmtfbWVtZWJlcl9pZCwKKyAgICAgICAgICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+bGlua19tc2dfbnVtKSB8fAorICAgICAgICAhX21rYV9idWlsZF9lbXB0eV9wZWVyX2xpc3QoJm91dF9idWYsIE1LUERVX1BBUkFNX1NFVF9QT1RFTlRJQUxfUEVFUl9MSVNUKSB8fAorICAgICAgICAhX21rYV9idWlsZF9pY3ZfaW5kaWNhdG9yKCZvdXRfYnVmKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAvKiBsYXN0IGltcG9ydGFudCBzdGVwLiBDYWxjICYgYXR0YWNoIElDViAqLworICAgIF9ta2FfY2FsY19hbmRfYXR0YWNoX2ljdihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8sICZvdXRfYnVmKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LID09IGRwb2Vfc2VjX3NlbmRfZWFwb2wobGlua19yZWMtPmRldmljZSwgJmxpbmtfcmVjLT5rZXksIGZyYW1lLCBiY21vbHRfYnVmX2dldF91c2VkKCZvdXRfYnVmKSk7Cit9CisKKy8qIEVudHJ5IHBvaW50IGZvciBNS0EgcHJvY2Vzcy4gSXQgaXMgY2FsbGVkIHRvIHN0YXJ0IHRoZSBNS0EgZXhjaGFuZ2Ugd2l0aCB0aGUgT05VIHRoYXQgb3ducyB0aGUgc3BlY2lmaWVkIGxpbmsuICovCitiY21vc19lcnJubyBta2Ffc3RhcnQoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mbyA9PSBOVUxMKTsKKworICAgIC8qIGluaXRpYWxpemUgbGluayBNS0EgaW5mbyAqLworICAgIF9ta2FfaW5pdF9saW5rX2luZm8obGlua19yZWMpOworCisgICAgLyogc2VuZCBpbml0aWFsIGZyYW1lIChiYXNpYyBwYXJhbSArIGVtcHR5IGxpdmUgJiBwb3RlbnRpYWwgcGVlciBsaXN0ICovCisgICAgaWYgKF9ta2Ffc2VuZF9pbml0X2ZyYW1lKGxpbmtfcmVjKSkKKyAgICB7CisgICAgICAgIHJjID0gQkNNX0VSUl9PSzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmMgPSBCQ01fRVJSX0NPTU1fRkFJTDsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qIENhbGN1bGF0ZSB0aGUgSUNWIG92ZXIgdGhlIG1lc3NhZ2UgYW5kIGNvbXBhcmUgd2l0aCB0aGUgSUNWIGluIHRoZSBtZXNzYWdlLiAqLworc3RhdGljIGJjbW9zX2Vycm5vIF9ta2FfY29tcGFyZV9pY3YobWthX2xpbmtfaW5mbyAqaW5mbywgY29uc3QgbWthX2V2ZW50ICptc2csIHVpbnQ4X3QgKnJ4X2ljdikKK3sKKyAgICB1aW50MTZfdCBsZW4gPSAwOworICAgIHVpbnQ4X3QgaWN2W01LQV9JQ1ZfTEVOXTsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGluZm8gPT0gTlVMTCk7CisgICAgQlVHX09OKG1zZyA9PSBOVUxMKTsKKworICAgIC8qIElmIHRoZSBJQ1YgcG9pbnRlciBpcyBOVUxMLCB0aGVuIHRoZXJlIHdhcyBubyBJQ1YgaW4gdGhlIHJlY2VpdmVkIE1LQSBwYWNrZXQuIEp1c3QgcmV0dXJuIGFuIGVycm9yLiAqLworICAgIGlmIChyeF9pY3YgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgfQorCisgICAgLyogQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciBvdmVyIHdoaWNoIHRvIGNhbGN1bGF0ZSB0aGUgSUNWLiAqLworICAgIGxlbiA9IChFQVBPTF9NU0dfSERSX1NJWkUgKyBtc2ctPm1zZy0+ZWFwb2xfbGVuZ3RoKSAtIE1LQV9JQ1ZfTEVOOworCisgICAgX21rYV9jYWxjX2ljdihpY3YsIGluZm8tPmljaywgbXNnLT5idWYtPnN0YXJ0LCBsZW4pOworCisgICAgaWYgKG1lbWNtcChpY3YsIHJ4X2ljdiwgc2l6ZW9mKGljdikpICE9IDApCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9PTlVfRVJSX1JFU1A7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKKy8qIFBhcnNlIHRoZSBCYXNpYyBQYXJhbWV0ZXIgU2V0IGluIE1LQSBQRFVzICovCitzdGF0aWMgYmNtb3NfZXJybm8gX21rYV9wYXJzZV9iYXNpY19wYXJhbV9zZXQoCisgICAgZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLAorICAgIGJjbW9sdF9idWYgKmJ1ZiwKKyAgICB1aW50MTZfdCAqYnl0ZXNfcmVhZCwKKyAgICB1aW50MTZfdCBib2R5X2xlbiwKKyAgICB1aW50OF90ICpzY2ksCisgICAgdWludDhfdCAqbWVtYmVyX2lkLAorICAgIHVpbnQzMl90ICptc2dfbnVtKQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihidWYgPT0gTlVMTCk7CisgICAgQlVHX09OKGJ5dGVzX3JlYWQgPT0gTlVMTCk7CisKKyAgICAvKiBSZWFkIHRoZSBPTlUgU0NJICovCisgICAgaWYgKCFiY21vbHRfYnVmX3JlYWQoYnVmLCBzY2ksIE1LQV9TQ0lfTEVOKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUlNFOworICAgIH0KKworICAgIC8qIFJlYWQgdGhlIE1lbWJlciBJRCAqLworICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkKGJ1ZiwgbWVtYmVyX2lkLCBNS0FfTUlfTEVOKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUlNFOworICAgIH0KKworICAgIC8qIFJlYWQgdGhlIE9OVSBtZXNzYWdlIG51bWJlci4gKi8KKyAgICBpZiAoIWJjbW9sdF9idWZfcmVhZF91MzJfYmUoYnVmLCBtc2dfbnVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUlNFOworICAgIH0KKworICAgIC8qIFRoZSBTQ0ksIE1JLCBhbmQgTU4gd2VyZSByZWFkIGZyb20gdGhlIHBhY2tldC4gKi8KKyAgICAqYnl0ZXNfcmVhZCA9IE1LQV9TQ0lfTEVOICsgTUtBX01JX0xFTiArIE1LQV9NTl9MRU47CisKKyAgICAvKiBTa2lwIHRoZSByZXN0ICovCisgICAgaWYgKCFiY21vbHRfYnVmX3NraXAoYnVmLCBib2R5X2xlbiAtICpieXRlc19yZWFkKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUlNFOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX21rYV93YWl0aW5nX2luaXRpYWxfcmVzcG9uc2VfZGF0YV9pbmQobWthX2V2ZW50ICptc2csIGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYykKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfUEFSU0U7CisgICAgdWludDhfdCAqaWN2X3B0cjsKKyAgICB1aW50OF90IHBhcmFtX3NldF90eXBlOworICAgIHVpbnQxNl90IGJvZHlfbGVuOworICAgIGJjbW9zX2Jvb2wgYmFzaWNfcGFyYW1fc2V0X2V4aXN0ID0gQkNNT1NfRkFMU0U7CisgICAgYmNtb3NfYm9vbCBsaXZlX3BlZXJfbGlzdF9leGlzdCA9IEJDTU9TX0ZBTFNFOworICAgIGJjbW9zX2Jvb2wgcG90ZW50aWFsX3BlZXJfbGlzdF9leGlzdCA9IEJDTU9TX0ZBTFNFOworICAgIHVpbnQxNl90IGJ5dGVzX3JlYWQ7CisKKyAgICAvKiBWYWxpZGF0ZSB0aGUgbXNnIHBvaW50ZXIuICovCisgICAgQlVHX09OKG1zZy0+YnVmID09IE5VTEwpOworICAgIEJVR19PTihtc2ctPm1zZyA9PSBOVUxMKTsKKworICAgIC8qIG1hcmsgSUNWIGZpZWxkIG9mZnNldCAqLworICAgIGljdl9wdHIgPSBtc2ctPmJ1Zi0+Y3VyciArIChtc2ctPm1zZy0+ZWFwb2xfbGVuZ3RoIC0gTUtBX0lDVl9MRU4pOworCisgICAgLyogVmFsaWRhdGUgdGhlIEludGVncml0eSBDaGVjayBWYWx1ZSBiZWZvcmUgY29udGludWluZyB0byBwcm9jZXNzIHRoZSBwYWNrZXQuICovCisgICAgcmMgPSBfbWthX2NvbXBhcmVfaWN2KGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mbywgbXNnLCBpY3ZfcHRyKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoQkNNX0VSUl9PSyAhPSByYywgcmMpOworCisgICAgd2hpbGUgKGJjbW9sdF9idWZfZ2V0X3JlbWFpbmluZ19zaXplKG1zZy0+YnVmKSA+IDApCisgICAgeworICAgICAgICAvKiBEb24ndCBwYXJzZSBwYXN0IHRoZSBJQ1YgUGFyYW1ldGVyIFNldCAqLworICAgICAgICBpZiAoYmNtb2x0X2J1Zl9zbmFwX2dldChtc2ctPmJ1ZikgPj0gaWN2X3B0cikKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBSZWFkIHdoYXQgc2hvdWxkIGJlIHRoZSBCYXNpYyBQYXJhbWV0ZXIgU2V0IGhlYWRlci4gKi8KKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgobXNnLT5idWYsICZwYXJhbV9zZXRfdHlwZSkgfHwKKyAgICAgICAgICAgICFiY21vbHRfYnVmX3NraXAobXNnLT5idWYsIDEpIHx8CisgICAgICAgICAgICAhYmNtb2x0X2J1Zl9yZWFkX3UxNl9iZShtc2ctPmJ1ZiwgJmJvZHlfbGVuKSkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBUaGUgYm9keSBsZW5ndGggaXMgcmVhbGx5IDEyLWJpdHMuICovCisgICAgICAgIGJvZHlfbGVuICY9IDB4MGZmZjsKKworICAgICAgICBpZiAocGFyYW1fc2V0X3R5cGUgPT0gTUtQRFVfUEFSQU1fU0VUX0xJVkVfUEVFUl9MSVNUKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBuZWVkIHRvIGZpbmQgb3V0IHdoZXRoZXIgaXQgaXMgQmFzaWMgcGFyYW1ldGVyIHNldCBPUiBMaXZlIFBlZXIgTGlzdCAqLworICAgICAgICAgICAgaWYgKGJvZHlfbGVuID49IE1LQV9CQVNJQ19QQVJBTV9TRVRfTEVOKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gX21rYV9wYXJzZV9iYXNpY19wYXJhbV9zZXQoCisgICAgICAgICAgICAgICAgICAgIGxpbmtfcmVjLAorICAgICAgICAgICAgICAgICAgICBtc2ctPmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgJmJ5dGVzX3JlYWQsCisgICAgICAgICAgICAgICAgICAgIGJvZHlfbGVuLAorICAgICAgICAgICAgICAgICAgICBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPm9udV9zY2ksCisgICAgICAgICAgICAgICAgICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+bGlua19tZW1lYmVyX2lkLAorICAgICAgICAgICAgICAgICAgICAmbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5saW5rX21zZ19udW0pOworICAgICAgICAgICAgICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsIGxpbmtfcmVjLCAicGFyc2UgYmFzaWMgcGFyYW0gc2V0IGZhaWxlZCFcbiIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBNYXJrIHRoYXQgdGhlIEJhc2ljIFBhcmFtZXRlciBTZXQgd2FzIGZvdW5kLiAqLworICAgICAgICAgICAgICAgIGJhc2ljX3BhcmFtX3NldF9leGlzdCA9IEJDTU9TX1RSVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogTGl2ZSBQZWVyIExpc3QuIHNraXAgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChtc2ctPmJ1ZiwgYm9keV9sZW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsIGxpbmtfcmVjLCAicGFyc2UgbGl2ZSBwZWVyIGxpc3QgZmFpbGVkIVxuIik7CisgICAgICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9QQVJTRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogTWFyayB0aGF0IHRoZSBMaXZlIFBlZXIgTGlzdCBQYXJhbWV0ZXIgU2V0IHdhcyBmb3VuZC4gKi8KKyAgICAgICAgICAgICAgICBsaXZlX3BlZXJfbGlzdF9leGlzdCA9IEJDTU9TX1RSVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocGFyYW1fc2V0X3R5cGUgPT0gTUtQRFVfUEFSQU1fU0VUX1BPVEVOVElBTF9QRUVSX0xJU1QpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgbWlbTUtBX01JX0xFTl07CisKKyAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkKG1zZy0+YnVmLCBtaSwgc2l6ZW9mKG1pKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsIGxpbmtfcmVjLCAicGFyc2UgcG90ZW50aWFsIHBlZXIgbGlzdCBmYWlsZWQhXG4iKTsKKyAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfUEFSU0U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFZlcmlmeSB0aGF0IHRoZSBPTFQgbWVtYmVyIElEIGluIHRoZSBQb3RlbnRpYWwgUGVlciBMaXN0IFBhcmFtZXRlciBTZXQgbWF0Y2hlcyB0aGUgZXhwZWN0ZWQgT0xUIG1lbWJlcgorICAgICAgICAgICAgICAgSUQuICovCisgICAgICAgICAgICBpZiAobWVtY21wKG1pLCBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPm9sdF9tZW1iZXJfaWQsIE1LQV9NSV9MRU4pICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsIGxpbmtfcmVjLCAid3JvbmcgbWVtYmVyIElEIVxuIik7CisgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX09OVV9FUlJfUkVTUDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogU2tpcCB0aGUgcmVtYWluaW5nIGJ5dGVzLiAqLworICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAobXNnLT5idWYsIGJvZHlfbGVuIC0gTUtBX01JX0xFTikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsIGxpbmtfcmVjLCAiYnVmZmVyIG92ZXJmbG93IVxuIik7CisgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX1BBUlNFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBNYXJrIHRoYXQgdGhlIFBvdGVudGlhbCBQZWVyIExpc3QgUGFyYW1ldGVyIFNldCB3YXMgZm91bmQuICovCisgICAgICAgICAgICBwb3RlbnRpYWxfcGVlcl9saXN0X2V4aXN0ID0gQkNNT1NfVFJVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFNraXAgb3RoZXIgUGFyYW1ldGVyIFNldCBkYXRhLiAqLworICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAobXNnLT5idWYsIGJvZHlfbGVuKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEUE9FX1NFQ19MSU5LX0xPRyhFUlJPUiwgbGlua19yZWMsICJidWZmZXIgb3ZlcmZsb3chXG4iKTsKKyAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfUEFSU0U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKHJjID09IEJDTV9FUlJfT0spICYmCisgICAgICAgIGJhc2ljX3BhcmFtX3NldF9leGlzdCAmJgorICAgICAgICBsaXZlX3BlZXJfbGlzdF9leGlzdCAmJgorICAgICAgICBwb3RlbnRpYWxfcGVlcl9saXN0X2V4aXN0ICYmCisgICAgICAgIChsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPnBlZXJfc3RhdGUgIT0gTUtBX1BFRVJfU1RBVEVfTElWRSkpCisgICAgeworICAgICAgICAvKiBwcm9jZWVkIHRvIG5leHQgc3RhdGUgKi8KKyAgICAgICAgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5wZWVyX3N0YXRlID0gTUtBX1BFRVJfU1RBVEVfTElWRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmMgPSBCQ01fRVJSX09OVV9FUlJfUkVTUDsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qIEhhbmRsZXIgZm9yIGluaXRpYWwgcmVzcG9uc2UgZnJvbSB0aGUgT05VICovCitzdGF0aWMgYmNtb3NfZXJybm8gX21rYV93YWl0aW5nX2luaXRpYWxfcmVzcG9uc2UobWthX2V2ZW50ICptc2csIGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYykKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihtc2cgPT0gTlVMTCk7CisgICAgQlVHX09OKGxpbmtfcmVjID09IE5VTEwpOworICAgIEJVR19PTihsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8gPT0gTlVMTCk7CisKKyAgICBzd2l0Y2ggKG1zZy0+dHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgTUtBX01TR19USU1FT1VUOgorICAgICAgICAgICAgLyogcmV0cnkgMyB0aW1lcyAqLworICAgICAgICAgICAgaWYgKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+cmV0cnlfY250IDwgTUtBX0lOSVRfUkVUUllfQ05UKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+cmV0cnlfY250Kys7CisgICAgICAgICAgICAgICAgKHZvaWQpX21rYV9zZW5kX2luaXRfZnJhbWUobGlua19yZWMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9ta2FfY2xlYXJfbGlua19pbmZvKGxpbmtfcmVjKTsKKyAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfVElNRU9VVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTUtBX01TR19EQVRBX0lORDoKKyAgICAgICAgICAgIHJjID0gX21rYV93YWl0aW5nX2luaXRpYWxfcmVzcG9uc2VfZGF0YV9pbmQobXNnLCBsaW5rX3JlYyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmMgPSBCQ01fRVJSX09OVV9FUlJfUkVTUDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9ta2FfaW5pdGlhbF9zYWtfc2VudF9kYXRhX2luZChta2FfZXZlbnQgKm1zZywgZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9QQVJTRTsKKyAgICB1aW50OF90ICppY3ZfcHRyOworICAgIHVpbnQ4X3QgcGFyYW1fc2V0X3R5cGU7CisgICAgdWludDhfdCBrc19wcmlvcml0eTsKKyAgICB1aW50MTZfdCBib2R5X2xlbjsKKyAgICBiY21vc19ib29sIGJhc2ljX3BhcmFtX29rID0gQkNNT1NfRkFMU0U7CisgICAgYmNtb3NfYm9vbCBsaXZlX3BlZXJfbGlzdF9vayA9IEJDTU9TX0ZBTFNFOworICAgIGJjbW9zX2Jvb2wgcG90ZW50aWFsX3BlZXJfbGlzdF9vayA9IEJDTU9TX0ZBTFNFOworICAgIGJjbW9zX2Jvb2wgc2FrX3VzZV9wYXJhbV9vayA9IEJDTU9TX0ZBTFNFOworICAgIHVpbnQxNl90IGJ5dGVzX3JlYWQ7CisKKyAgICAvKiBWYWxpZGF0ZSB0aGUgbXNnIHBvaW50ZXIuICovCisgICAgQlVHX09OKG1zZy0+bXNnID09IE5VTEwpOworICAgIEJVR19PTihtc2ctPmJ1ZiA9PSBOVUxMKTsKKworICAgIC8qIG1hcmsgSUNWIGZpZWxkIG9mZnNldCAqLworICAgIGljdl9wdHIgPSBtc2ctPmJ1Zi0+Y3VyciArIChtc2ctPm1zZy0+ZWFwb2xfbGVuZ3RoIC0gTUtBX0lDVl9MRU4pOworCisgICAgLyogVmFsaWRhdGUgdGhlIEludGVncml0eSBDaGVjayBWYWx1ZSBiZWZvcmUgY29udGludWluZyB0byBwcm9jZXNzIHRoZSBwYWNrZXQuICovCisgICAgcmMgPSBfbWthX2NvbXBhcmVfaWN2KGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mbywgbXNnLCBpY3ZfcHRyKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoQkNNX0VSUl9PSyAhPSByYywgcmMpOworCisgICAgd2hpbGUgKGJjbW9sdF9idWZfZ2V0X3JlbWFpbmluZ19zaXplKG1zZy0+YnVmKSA+IDApCisgICAgeworICAgICAgICAvKiBEb24ndCBwYXJzZSBwYXN0IHRoZSBJQ1YgUGFyYW1ldGVyIFNldCAqLworICAgICAgICBpZiAoYmNtb2x0X2J1Zl9zbmFwX2dldChtc2ctPmJ1ZikgPj0gaWN2X3B0cikKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBSZWFkIHdoYXQgc2hvdWxkIGJlIHRoZSBCYXNpYyBQYXJhbWV0ZXIgU2V0IGhlYWRlci4gKi8KKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgobXNnLT5idWYsICZwYXJhbV9zZXRfdHlwZSkgfHwKKyAgICAgICAgICAgICFiY21vbHRfYnVmX3JlYWRfdTgobXNnLT5idWYsICZrc19wcmlvcml0eSkgfHwKKyAgICAgICAgICAgICFiY21vbHRfYnVmX3JlYWRfdTE2X2JlKG1zZy0+YnVmLCAmYm9keV9sZW4pKQorICAgICAgICB7CisgICAgICAgICAgICByYyA9IEJDTV9FUlJfUEFSU0U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFRoZSBib2R5IGxlbmd0aCBpcyByZWFsbHkgMTItYml0cy4gKi8KKyAgICAgICAgYm9keV9sZW4gJj0gMHgwZmZmOworCisgICAgICAgIGlmIChwYXJhbV9zZXRfdHlwZSA9PSBNS1BEVV9QQVJBTV9TRVRfTElWRV9QRUVSX0xJU1QpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIG5lZWQgdG8gZmluZCBvdXQgd2hldGhlciBpdCBpcyBCYXNpYyBwYXJhbWV0ZXIgc2V0IE9SIExpdmUgUGVlciBMaXN0ICovCisgICAgICAgICAgICBpZiAoYm9keV9sZW4gPj0gTUtBX0JBU0lDX1BBUkFNX1NFVF9MRU4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogaW4gb3VyIGVudmlyb25tZW50LCBPTlUgY2FuIG5vdCBoYXZlIG1vcmUgdGhhbiBvbmUgbGl2ZSBwZWVyLiBTbywganVzdCBzZWVpbmcgcGFyYW0gc2V0IGJvZHkgbGVuCisgICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIGdvb2QgZW5vdWdoLiAqLworICAgICAgICAgICAgICAgIHVpbnQzMl90IGxpbmtfbW47CisgICAgICAgICAgICAgICAgdWludDhfdCBzY2lbTUtBX1NDSV9MRU5dOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbWlbTUtBX01JX0xFTl07CisKKyAgICAgICAgICAgICAgICByYyA9IF9ta2FfcGFyc2VfYmFzaWNfcGFyYW1fc2V0KGxpbmtfcmVjLCBtc2ctPmJ1ZiwgJmJ5dGVzX3JlYWQsIGJvZHlfbGVuLCBzY2ksIG1pLCAmbGlua19tbik7CisgICAgICAgICAgICAgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBWZXJpZnkgdGhhdCBPTlUgU0NJIGlzIHdoYXQncyBleHBlY3RlZC4gKi8KKyAgICAgICAgICAgICAgICBpZiAobWVtY21wKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+b251X3NjaSwgc2NpLCBNS0FfU0NJX0xFTikgIT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9PTlVfRVJSX1JFU1A7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIFZlcmlmeSB0aGF0IE9OVSBNSSBpcyB3aGF0J3MgZXhwZWN0ZWQuICovCisgICAgICAgICAgICAgICAgaWYgKG1lbWNtcChsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmxpbmtfbWVtZWJlcl9pZCwgbWksIE1LQV9NSV9MRU4pICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfT05VX0VSUl9SRVNQOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBWZXJpZnkgdGhhdCB0aGUgTU4gaXMgd2hhdCdzIGV4cGVjdGVkLiAqLworICAgICAgICAgICAgICAgIGlmIChsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmxpbmtfbXNnX251bSA8IGxpbmtfbW4pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBjb3JyZWN0IE1OISAqLworICAgICAgICAgICAgICAgICAgICBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmxpbmtfbXNnX251bSA9IGxpbmtfbW47CisgICAgICAgICAgICAgICAgICAgIGJhc2ljX3BhcmFtX29rID0gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogTGl2ZSBQZWVyIExpc3QuIHNraXAgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChtc2ctPmJ1ZiwgYm9keV9sZW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX1BBUlNFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBNYXJrIHRoYXQgdGhlIExpdmUgUGVlciBMaXN0IFBhcmFtZXRlciBTZXQgd2FzIGZvdW5kLiAqLworICAgICAgICAgICAgICAgIGxpdmVfcGVlcl9saXN0X29rID0gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChwYXJhbV9zZXRfdHlwZSA9PSBNS1BEVV9QQVJBTV9TRVRfUE9URU5USUFMX1BFRVJfTElTVCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogU2tpcCBQb3RlbnRpYWwgUGVlciBMaXN0IFBhcmFtZXRlciBTZXQuICovCisgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChtc2ctPmJ1ZiwgYm9keV9sZW4pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9QQVJTRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogTWFyayB0aGF0IHRoZSBQb3RlbnRpYWwgUGVlciBMaXN0IFBhcmFtZXRlciBTZXQgd2FzIGZvdW5kLiAqLworICAgICAgICAgICAgcG90ZW50aWFsX3BlZXJfbGlzdF9vayA9IEJDTU9TX1RSVUU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocGFyYW1fc2V0X3R5cGUgPT0gTUtQRFVfUEFSQU1fU0VUX01BQ1NFQ19TQUtfVVNFKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBjaGVjayBvbmx5IExhdGVzdCBrZXkgdHggJiByeCBiaXRzIChiaXQgNCAmIDUpICovCisgICAgICAgICAgICBpZiAoKGtzX3ByaW9yaXR5ICYgMHgzMCkgPT0gMHgzMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzYWtfdXNlX3BhcmFtX29rID0gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogU2tpcCB0aGUgTUtBIFNBSyBVc2UgUGFyYW1ldGVyIFNldC4gKi8KKyAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKG1zZy0+YnVmLCBib2R5X2xlbikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX1BBUlNFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogU2tpcCBhbGwgb3RoZXIgUGFyYW1ldGVyIFNldCBkYXRhLiAqLworICAgICAgICAgICAgaWYgKCFiY21vbHRfYnVmX3NraXAobXNnLT5idWYsIGJvZHlfbGVuKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfUEFSU0U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBFdmVyeXRoaW5nIGxvb2tzIGdvb2Qgc28gZmFyPyAqLworICAgIGlmICgocmMgPT0gQkNNX0VSUl9PSykgJiYKKyAgICAgICAgYmFzaWNfcGFyYW1fb2sgJiYKKyAgICAgICAgbGl2ZV9wZWVyX2xpc3Rfb2sgJiYKKyAgICAgICAgcG90ZW50aWFsX3BlZXJfbGlzdF9vayAmJgorICAgICAgICBzYWtfdXNlX3BhcmFtX29rKQorICAgIHsKKyAgICAgICAgRFBPRV9TRUNfTElOS19MT0coREVCVUcsIGxpbmtfcmVjLCAiR290IGdvb2QgTUtBIFNBSyByZXNwb25zZVxuIik7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKiBSZXNwb25zZSBmcmFtZSBoYW5kbGVyIGZvciB0aGUgZmlyc3QgU0FLIGZyb20gdGhlIE9MVCAqLworc3RhdGljIGJjbW9zX2Vycm5vIF9ta2FfaW5pdGlhbF9zYWtfc2VudChta2FfZXZlbnQgKm1zZywgZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKG1zZyA9PSBOVUxMKTsKKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mbyA9PSBOVUxMKTsKKworICAgIHN3aXRjaCAobXNnLT50eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBNS0FfTVNHX1RJTUVPVVQ6CisgICAgICAgICAgICBfbWthX2NsZWFyX2xpbmtfaW5mbyhsaW5rX3JlYyk7CisgICAgICAgICAgICByYyA9IEJDTV9FUlJfVElNRU9VVDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTUtBX01TR19EQVRBX0lORDoKKyAgICAgICAgICAgIHJjID0gX21rYV9pbml0aWFsX3Nha19zZW50X2RhdGFfaW5kKG1zZywgbGlua19yZWMpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJjID0gQkNNX0VSUl9PTlVfRVJSX1JFU1A7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfbWthX3Nha19kb25lX2RhdGFfaW5kKG1rYV9ldmVudCAqbXNnLCBkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX1BBUlNFOworICAgIHVpbnQ4X3QgKmljdl9wdHI7CisgICAgdWludDhfdCBwYXJhbV9zZXRfdHlwZTsKKyAgICB1aW50MTZfdCBib2R5X2xlbjsKKyAgICB1aW50OF90IGtzX3ByaW9yaXR5OworICAgIHVpbnQxNl90IGJ5dGVzX3JlYWQ7CisKKyAgICAvKiBWYWxpZGF0ZSB0aGUgbXNnIHBvaW50ZXIuICovCisgICAgQlVHX09OKG1zZy0+bXNnID09IE5VTEwpOworICAgIEJVR19PTihtc2ctPmJ1ZiA9PSBOVUxMKTsKKworICAgIC8qIG1hcmsgSUNWIGZpZWxkIG9mZnNldCAqLworICAgIGljdl9wdHIgPSBtc2ctPmJ1Zi0+Y3VyciArIChtc2ctPm1zZy0+ZWFwb2xfbGVuZ3RoIC0gTUtBX0lDVl9MRU4pOworCisgICAgLyogVmFsaWRhdGUgdGhlIEludGVncml0eSBDaGVjayBWYWx1ZSBiZWZvcmUgY29udGludWluZyB0byBwcm9jZXNzIHRoZSBwYWNrZXQuICovCisgICAgcmMgPSBfbWthX2NvbXBhcmVfaWN2KGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mbywgbXNnLCBpY3ZfcHRyKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoQkNNX0VSUl9PSyAhPSByYywgcmMpOworCisgICAgd2hpbGUgKGJjbW9sdF9idWZfZ2V0X3JlbWFpbmluZ19zaXplKG1zZy0+YnVmKSA+IDApCisgICAgeworICAgICAgICAvKiBEb24ndCBwYXJzZSBwYXN0IHRoZSBJQ1YgUGFyYW1ldGVyIFNldCAqLworICAgICAgICBpZiAoYmNtb2x0X2J1Zl9zbmFwX2dldChtc2ctPmJ1ZikgPj0gaWN2X3B0cikKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBSZWFkIHdoYXQgc2hvdWxkIGJlIHRoZSBCYXNpYyBQYXJhbWV0ZXIgU2V0IGhlYWRlci4gKi8KKyAgICAgICAgaWYgKCFiY21vbHRfYnVmX3JlYWRfdTgobXNnLT5idWYsICZwYXJhbV9zZXRfdHlwZSkgfHwKKyAgICAgICAgICAgICFiY21vbHRfYnVmX3JlYWRfdTgobXNnLT5idWYsICZrc19wcmlvcml0eSkgfHwKKyAgICAgICAgICAgICFiY21vbHRfYnVmX3JlYWRfdTE2X2JlKG1zZy0+YnVmLCAmYm9keV9sZW4pKQorICAgICAgICB7CisgICAgICAgICAgICByYyA9IEJDTV9FUlJfUEFSU0U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFRoZSBib2R5IGxlbmd0aCBpcyByZWFsbHkgMTItYml0cy4gKi8KKyAgICAgICAgYm9keV9sZW4gJj0gMHgwZmZmOworCisgICAgICAgIGlmIChwYXJhbV9zZXRfdHlwZSA9PSBNS1BEVV9QQVJBTV9TRVRfTElWRV9QRUVSX0xJU1QpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIG5lZWQgdG8gZmluZCBvdXQgd2hldGhlciBpdCBpcyBCYXNpYyBwYXJhbWV0ZXIgc2V0IE9SIExpdmUgUGVlciBMaXN0ICovCisgICAgICAgICAgICBpZiAoYm9keV9sZW4gPj0gTUtBX0JBU0lDX1BBUkFNX1NFVF9MRU4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogaW4gb3VyIGVudmlyb25tZW50LCBPTlUgY2FuIG5vdCBoYXZlIG1vcmUgdGhhbiBvbmUgbGl2ZSBwZWVyLiBTbywganVzdCBzZWVpbmcgcGFyYW0gc2V0IGJvZHkgbGVuCisgICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIGdvb2QgZW5vdWdoLiAqLworICAgICAgICAgICAgICAgIHVpbnQzMl90IGxpbmtfbW47CisgICAgICAgICAgICAgICAgdWludDhfdCBzY2lbTUtBX1NDSV9MRU5dOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbWlbTUtBX01JX0xFTl07CisKKyAgICAgICAgICAgICAgICByYyA9IF9ta2FfcGFyc2VfYmFzaWNfcGFyYW1fc2V0KGxpbmtfcmVjLCBtc2ctPmJ1ZiwgJmJ5dGVzX3JlYWQsIGJvZHlfbGVuLCBzY2ksIG1pLCAmbGlua19tbik7CisgICAgICAgICAgICAgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBWZXJpZnkgdGhhdCBPTlUgU0NJIGlzIHdoYXQncyBleHBlY3RlZC4gKi8KKyAgICAgICAgICAgICAgICBpZiAobWVtY21wKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+b251X3NjaSwgc2NpLCBNS0FfU0NJX0xFTikgIT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9PTlVfRVJSX1JFU1A7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIFZlcmlmeSB0aGF0IE9OVSBNSSBpcyB3aGF0J3MgZXhwZWN0ZWQuICovCisgICAgICAgICAgICAgICAgaWYgKG1lbWNtcChsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmxpbmtfbWVtZWJlcl9pZCwgbWksIE1LQV9NSV9MRU4pICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfT05VX0VSUl9SRVNQOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5saW5rX21zZ19udW0gPCBsaW5rX21uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogY29ycmVjdCBNTiEgKi8KKyAgICAgICAgICAgICAgICAgICAgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5saW5rX21zZ19udW0gPSBsaW5rX21uOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBMaXZlIFBlZXIgTGlzdC4gc2tpcCAqLworICAgICAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKG1zZy0+YnVmLCBib2R5X2xlbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfUEFSU0U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChwYXJhbV9zZXRfdHlwZSA9PSBNS1BEVV9QQVJBTV9TRVRfTUFDU0VDX1NBS19VU0UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGxscG47CisKKyAgICAgICAgICAgIC8qIFNraXAgdG8gdGhlIExMUE4uICovCisgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChtc2ctPmJ1ZiwgTUtBX01JX0xFTiArIE1LQV9LTl9MRU4pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9QQVJTRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogcmVhZCBMYXRlc3QgTG93ZXN0IEFjY2VwdGFibGUgUE4gKi8KKyAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl9yZWFkX3UzMl9iZShtc2ctPmJ1ZiwgJmxscG4pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9QQVJTRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxscG4gPiBNS0FfTUFYX0FDQ0VQVEFCTEVfUE4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogU2V0IGZsYWcgdG8gaW5kaWNhdGUgU0FLIHJlZnJlc2ggaXMgbmVlZGVkLiAqLworICAgICAgICAgICAgICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+c2FrX3JlZnJlc2hfbmVlZGVkID0gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogY2hlY2sgb25seSBMYXRlc3Qga2V5IHR4ICYgcnggYml0cyAoYml0IDQgJiA1KSAqLworICAgICAgICAgICAgaWYgKChrc19wcmlvcml0eSAmIDB4MzApICE9IDB4MzApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogV3JvbmcgTEsgRmxhZyAqLyAvKiBUT0RPOiB3aHkgaXNuJ3QgdGhpcyBhbiBlcnJvcj8gKi8KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogVGhlIE1JLCBLTiwgYW5kIExMUE4gd2VyZSByZWFkLiAqLworICAgICAgICAgICAgYnl0ZXNfcmVhZCA9IGJvZHlfbGVuIC0gKE1LQV9NSV9MRU4gKyBNS0FfS05fTEVOICsgc2l6ZW9mKHVpbnQzMl90KSk7CisKKyAgICAgICAgICAgIC8qIFNraXAgdGhlIHJlc3QgKi8KKyAgICAgICAgICAgIGlmICghYmNtb2x0X2J1Zl9za2lwKG1zZy0+YnVmLCBieXRlc19yZWFkKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfUEFSU0U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBTa2lwIGFsbCBvdGhlciBQYXJhbWV0ZXIgU2V0IGRhdGEuICovCisgICAgICAgICAgICBpZiAoIWJjbW9sdF9idWZfc2tpcChtc2ctPmJ1ZiwgYm9keV9sZW4pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9QQVJTRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHJlZnJlc2ggcmV0cnkgY291bnQuIFRoaXMgaXMgYSBDcml0aWNhbCBjb3VudGVyICovCisgICAgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5yZXRyeV9jbnQgPSAwOworCisgICAgcmV0dXJuIHJjOworfQorCisvKiBNS0EgZnJhbWUgaGFuZGxlciBmb3Igc3RhYmxlIHN0YXRlICovCitzdGF0aWMgYmNtb3NfZXJybm8gX21rYV9zYWtfZG9uZShta2FfZXZlbnQgKm1zZywgZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKG1zZyA9PSBOVUxMKTsKKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mbyA9PSBOVUxMKTsKKworICAgIHN3aXRjaCAobXNnLT50eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBNS0FfTVNHX1RJTUVPVVQ6CisgICAgICAgICAgICAvKiBzZW5kIGtlZXBhbGl2ZSBmcmFtZSBhdCBldmVyeSAyIHNlY29uZHMgKi8KKyAgICAgICAgICAgICh2b2lkKV9ta2Ffc2VuZF9rZWVwYWxpdmVfZnJhbWUobGlua19yZWMpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBNS0FfTVNHX0RBVEFfSU5EOgorICAgICAgICAgICAgcmMgPSBfbWthX3Nha19kb25lX2RhdGFfaW5kKG1zZywgbGlua19yZWMpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJjID0gQkNNX0VSUl9PTlVfRVJSX1JFU1A7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qIFZhbGlkYXRlIHRoZSBNS0EgcGFja2V0LiAqLworc3RhdGljIGJjbW9zX2Jvb2wgX21rYV92YWxpZGF0ZV9wa3QoYmNtb2x0X3U4X2xpc3RfdTE2IG1rYV9tc2csIGVhcG9sX21zZ19oZHIgKmVhcG9sKQoreworICAgIC8qIFBhcmFtZXRlciBjaGVja3MuICovCisgICAgQlVHX09OKGVhcG9sID09IE5VTEwpOworCisgICAgLyogVGhpcyBoYWQgYmV0dGVyIGJlIGFuIE1LQSBwYWNrZXQuICovCisgICAgaWYgKGVhcG9sLT5lYXBvbF9wYWNrZXRfdHlwZSAhPSBFQVBPTF9UWVBFX01LQSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICAvKiBUaGUgRUFQT0wgbGVuZ3RoIHBsdXMgdGhlIHNpemUgb2YgdGhlIEVhcG9sTXNnSGRyIG11c3QgZXF1YWwgdGhlIGxlbmd0aCBvZiB0aGUgcmVjZWl2ZWQgcGFja2V0LiAqLworICAgIGlmIChta2FfbXNnLmxlbiAhPSAoZWFwb2wtPmVhcG9sX2xlbmd0aCArIEVBUE9MX01TR19IRFJfU0laRSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgLyogVGhlIEVBUE9MIGxlbmd0aCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB0aGUgbWluaW11bSBzdXBwb3J0ZWQgbGVuZ3RoLCBFdGhlcm5ldCArIEVBUE9MIGhlYWRlciBsZW5ndGguICovCisgICAgaWYgKGVhcG9sLT5lYXBvbF9sZW5ndGggPCBNS0FfUERVX01JTl9MRU5HVEgpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgLyogVGhlIEVBUE9MIGxlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgZm91ci4gKi8KKyAgICBpZiAoKGVhcG9sLT5lYXBvbF9sZW5ndGggJSA0KSAhPSAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCisvKiBXcmFwcGVyIGludG8gdGhlIE1LQSBjb2RlIHRoYXQgc2VuZHMgYW4gU0FLIENvbmZpcm0gcmVzcG9uc2UgdG8gdGhlIE9OVS4gKi8KK2JjbW9zX2Vycm5vIG1rYV9zZW5kX3Nha19jb25maXJtKGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rX3JlYykKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisKKyAgICAvKiBQYXJhbWV0ZXIgY2hlY2tzLiAqLworICAgIEJVR19PTihsaW5rX3JlYyA9PSBOVUxMKTsKKyAgICBCVUdfT04obGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvID09IE5VTEwpOworCisgICAgLyogcHJvY2VlZCB0byBuZXh0IHN0YXRlICovCisgICAgaWYgKF9ta2Ffc2VuZF9zYWtfY29uZmlybV9mcmFtZShsaW5rX3JlYykpCisgICAgeworICAgICAgICAvKiBFdmVyeXRoaW5nIGxvb2tzIGdvb2Qgc28gZmFyLiBVcGRhdGUgQU4gYW5kIEtleSBOdW1iZXIgKi8KKyAgICAgICAgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5rZXlfbnVtYmVyICs9IDE7CisgICAgICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+YXNzb2NpYXRpb25fbnVtYmVyICs9IDE7CisgICAgICAgIGlmIChsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmFzc29jaWF0aW9uX251bWJlciA9PSA0KQorICAgICAgICB7CisgICAgICAgICAgICAvKiBUaGUgYXNzb2NpYXRpb24gbnVtYmVyIGlzIGNvbmNhdGVuYXRlZCB3aXRoIHRoZSBPTFQgU0NJIHRvIGlkZW50aWZ5IGEgc2VjdXJlIGFzc29jaWF0aW9uIGJldHdlZW4gT0xUIGFuZAorICAgICAgICAgICAgICAgT05VLiBUaGUgQU4gdmFsdWUgc3RhcnRzIGF0IHplcm8gYW5kIGN5Y2xlcyB0aHJvdWdoIHZhbHVlcyAwIC0gMyBhcyBhIG5ldyBTQUsgaXMgZGlzdHJpYnV0ZWQgdG8gdGhlIE9OVS4KKyAgICAgICAgICAgICAgICovCisgICAgICAgICAgICBsaW5rX3JlYy0+bWthX2N0cmwubWthX2luZm8tPmFzc29jaWF0aW9uX251bWJlciA9IDA7IC8qIEFOID0gMCB+IDMgKi8KKyAgICAgICAgfQorCisgICAgICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+c3RhdGUgPSBNS0FfU1RBVEVfTUtBX0RPTkU7CisgICAgICAgIGxpbmtfcmVjLT5ta2FfY3RybC5ta2FfaW5mby0+cmVmcmVzaF9jbnQgKz0gMTsKKyAgICAgICAgbGlua19yZWMtPm1rYV9jdHJsLm1rYV9pbmZvLT5yZXRyeV9jbnQgPSAwOworCisgICAgICAgIC8qIHN0YXJ0IGtlZXBhbGl2ZSB0aW1lciAoMiBzZWNvbmQpICovCisgICAgICAgIGJjbW9zX3RpbWVyX3N0YXJ0KCZsaW5rX3JlYy0+bWthX2N0cmwubWthX2ZzbV9pbmZvLT50eF90aW1lciwgTUtBX0hFTExPX1RJTUUgKiAxMDAwKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmMgPSBCQ01fRVJSX0NPTU1fRkFJTDsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qIFdyYXBwZXIgaW50byB0aGUgTUtBIGNvZGUgdGhhdCBoYW5kbGVzIE1LQSBQRFVzIGZyb20gdGhlIE9OVS4gKi8KK2JjbW9zX2Vycm5vIG1rYV9wcm9jZXNzX3BhY2tldChkcG9lX3NlY19saW5rX3JlYyAqbGlua19yZWMsIGJjbW9sdF91OF9saXN0X3UxNiByeF9mcmFtZSwgbWthX29wX3R5cGUgb3BfdHlwZSkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfUEFSTTsKKyAgICBta2FfZXZlbnQgbWthX21zZzsKKyAgICBiY21vbHRfYnVmIGJ1ZjsKKyAgICBlYXBvbF9tc2dfaGRyIGVhcG9sOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKHJ4X2ZyYW1lLnZhbCA9PSBOVUxMKTsKKyAgICBCVUdfT04oKG9wX3R5cGUgPD0gTUtBX09QX19JTlZBTElEKSB8fCAob3BfdHlwZSA+IE1LQV9PUF9LRUVQX0FMSVZFKSk7CisKKyAgICBiY21vbHRfYnVmX2luaXQoJmJ1ZiwgcnhfZnJhbWUubGVuLCByeF9mcmFtZS52YWwsIEJDTU9MVF9CVUZfRU5ESUFOX0ZJWEVEKTsKKyAgICBpZiAoIWRwb2Vfc2VjX2VhcG9sX3VucGFjaygmYnVmLCAmZWFwb2wpKQorICAgIHsKKyAgICAgICAgRFBPRV9TRUNfTElOS19MT0coRVJST1IsIGxpbmtfcmVjLCAiZmFpbGVkIHRvIHVucGFjayBFQVBPTCBoZWFkZXIhXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSU0U7CisgICAgfQorCisgICAgLyogVmFsaWRhdGUgdGhlIE1LQSBwYWNrZXQgbGVuZ3RoIGJlZm9yZSBwcm9jZXNzaW5nLiAqLworICAgIGlmICghX21rYV92YWxpZGF0ZV9wa3QocnhfZnJhbWUsICZlYXBvbCkpCisgICAgeworICAgICAgICBEUE9FX1NFQ19MSU5LX0xPRyhFUlJPUiwgbGlua19yZWMsICJJbnZhbGlkIE1LQSBwYWNrZXQhXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSU0U7CisgICAgfQorCisgICAgLyogUGFzcyB0aGUgcGFja2V0IHRvIHRoZSBoYW5kbGVyLiAqLworICAgIG1rYV9tc2cudHlwZSA9IE1LQV9NU0dfREFUQV9JTkQ7CisgICAgbWthX21zZy5tc2cgPSAmZWFwb2w7CisgICAgbWthX21zZy5idWYgPSAmYnVmOworCisgICAgLyogUHJvY2VzcyB0aGUgTUtBIHBhY2tldC4gKi8KKyAgICBzd2l0Y2ggKG9wX3R5cGUpCisgICAgeworICAgICAgICBjYXNlIE1LQV9PUF9TVEFSVF9SU1A6CisgICAgICAgICAgICByYyA9IF9ta2Ffd2FpdGluZ19pbml0aWFsX3Jlc3BvbnNlKCZta2FfbXNnLCBsaW5rX3JlYyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNS0FfT1BfU0FLX1JTUDoKKyAgICAgICAgICAgIHJjID0gX21rYV9pbml0aWFsX3Nha19zZW50KCZta2FfbXNnLCBsaW5rX3JlYyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNS0FfT1BfS0VFUF9BTElWRToKKyAgICAgICAgICAgIHJjID0gX21rYV9zYWtfZG9uZSgmbWthX21zZywgbGlua19yZWMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qIFdyYXBwZXIgaW50byB0aGUgTUtBIGNvZGUgdGhhdCBoYW5kbGVzIE1LQSB0aW1lb3V0cy4gKi8KK2JjbW9zX2Vycm5vIG1rYV9wcm9jZXNzX3RpbWVvdXQoZHBvZV9zZWNfbGlua19yZWMgKmxpbmtfcmVjLCBta2Ffb3BfdHlwZSBvcF90eXBlKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9USU1FT1VUOworICAgIG1rYV9ldmVudCBta2FfbXNnOworCisgICAgLyogUGFyYW1ldGVyIGNoZWNrcy4gKi8KKyAgICBCVUdfT04obGlua19yZWMgPT0gTlVMTCk7CisgICAgQlVHX09OKChvcF90eXBlIDwgTUtBX09QX1NUQVJUX1RJTUVPVVQpIHx8IChvcF90eXBlID49IE1LQV9PUF9fQ09VTlQpKTsKKworICAgIC8qIFBhc3MgdGhlIHBhY2tldCB0byB0aGUgaGFuZGxlci4gKi8KKyAgICBta2FfbXNnLnR5cGUgPSBNS0FfTVNHX1RJTUVPVVQ7CisKKyAgICAvKiBQcm9jZXNzIHRoZSBNS0EgcGFja2V0LiAqLworICAgIHN3aXRjaCAob3BfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgTUtBX09QX1NUQVJUX1RJTUVPVVQ6CisgICAgICAgICAgICByYyA9IF9ta2Ffd2FpdGluZ19pbml0aWFsX3Jlc3BvbnNlKCZta2FfbXNnLCBsaW5rX3JlYyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNS0FfT1BfU0FLX1RJTUVPVVQ6CisgICAgICAgICAgICByYyAgPSBfbWthX2luaXRpYWxfc2FrX3NlbnQoJm1rYV9tc2csIGxpbmtfcmVjKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1LQV9PUF9TRU5EX0tFRVBfQUxJVkU6CisgICAgICAgICAgICByYyA9IF9ta2Ffc2FrX2RvbmUoJm1rYV9tc2csIGxpbmtfcmVjKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Rwb2Vfc2VjL21rYS5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9ta2EuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTk1ODY0Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9kcG9lX3NlYy9ta2EuaApAQCAtMCwwICsxLDEzMCBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmICFkZWZpbmVkKE1LQV9IKQorI2RlZmluZSBNS0FfSAorCisjaW5jbHVkZSAiYmNtb3Nfc3lzdGVtLmgiCisjaW5jbHVkZSAiYmNtb2x0X21vZGVsX3R5cGVzLmgiCisKKyNkZWZpbmUgTUtBX0xJRkVfVElNRSAgICAgICAgICAgICAgIDYwMDAgLyogTXMsIDYgc2Vjb25kcyAqLworCisjZGVmaW5lIE1LQV9TQ0lfTEVOICAgICAgICAgICAgICAgICA4IC8qIGNvbW1vbiBTQ0kgc2l6ZSAqLworI2RlZmluZSBNS0FfTUlfTEVOICAgICAgICAgICAgICAgICAgMTIgLyogTWVtYmVyIElkZW50aWZpZXIgKi8KKworLyogS0VLICovCisjZGVmaW5lIE1LQV9LRUtfTEVOICAgICAgICAgICAgICAgICAxMjggLyogYml0IGxlbmd0aC4gMTYgYnl0ZXMgKi8KKworLyogU0FLICovCisjZGVmaW5lIE1LQV9TQUtfTEVOICAgICAgICAgICAgICAgICAxNgorCisvKiBJQ0sgKi8KKyNkZWZpbmUgTUtBX0lDS19MRU4gICAgICAgICAgICAgICAgIDEyOCAvKiBiaXQgbGVuZ3RoLiAxNiBieXRlcyAqLworCisvKiBDS04gKi8KKyNkZWZpbmUgTUtBX0NLTl9MRU4gICAgICAgICAgICAgICAgIDEyOCAvKiBiaXQgbGVuZ3RoLiAxNiBieXRlcyAqLworCisvKiBDQUsgKi8KKyNkZWZpbmUgTUtBX0NBS19MRU4gICAgICAgICAgICAgICAgIDEyOCAvKiBiaXQgbGVuZ3RoLiAxNiBieXRlcyAqLworCisvKiBmb3IgTUFDU2VjIEtleSBBZ3JlZW1lbnQgKi8KK3R5cGVkZWYgZW51bQoreworICAgIE1LQV9TVEFURV9JTklUSUFMICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBNS0FfU1RBVEVfV0FJVElOR19JTklUSUFMX1BFRVJfUkVTUCA9IDEsCisgICAgTUtBX1NUQVRFX1NBS19TRU5UICAgICAgICAgICAgICAgICAgPSAyLAorICAgIE1LQV9TVEFURV9NS0FfRE9ORSAgICAgICAgICAgICAgICAgID0gMywKKworICAgIE1LQV9TVEFURV9fQ09VTlQKK30gbWthX3N0YXRlOworCit0eXBlZGVmIGVudW0KK3sKKyAgICBNS0FfUEVFUl9TVEFURV9OT05FID0gMCwKKyAgICBNS0FfUEVFUl9TVEFURV9MSVZFID0gMSwKKyAgICBNS0FfUEVFUl9TVEFURV9QT1RFTlRJQUwgPSAyLAorfSBta2FfcGVlcl9zdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50OF90ICBvbnVfc2NpW01LQV9TQ0lfTEVOXTsgLyoqPCBPTlUncyBTQ0kgKi8KKyAgICB1aW50OF90ICBvbHRfbWVtYmVyX2lkW01LQV9NSV9MRU5dOyAvKio8IE9MVCBNSSAqLworICAgIHVpbnQzMl90IGN1cnJfbXNnX251bTsgLyoqPCBDdXJyZW50IE9MVCBNTiAqLworICAgIHVpbnQ4X3QgIGxpbmtfbWVtZWJlcl9pZFtNS0FfTUlfTEVOXTsgLyoqPCBMaW5rIE1JICovCisgICAgdWludDMyX3QgbGlua19tc2dfbnVtOyAvKio8IEN1cnJlbnQgTGluayBNTiAqLworICAgIHVpbnQ4X3QgIGNha1tNS0FfQ0FLX0xFTi84XTsgLyoqPCBEZXJpdmVkIENBSyAqLworICAgIHVpbnQ4X3QgIGNrbltNS0FfQ0tOX0xFTi84XTsgLyoqPCBEZXJpdmVkIENLTiAqLworICAgIHVpbnQ4X3QgIHNha1tNS0FfU0FLX0xFTl07IC8qKjwgRGVyaXZlZCBTQUsgKGEuay5hIFRFSykgKi8KKyAgICB1aW50OF90ICBuZXdfc2FrW01LQV9TQUtfTEVOXTsgLyoqPCBOZXcgZGVyaXZlZCBTQUsgZm9yIGtleSByZWZyZXNoICovCisgICAgdWludDhfdCAga2VrW01LQV9LRUtfTEVOLzhdOyAvKio8IERlcml2ZWQgS0VLICovCisgICAgdWludDhfdCAgaWNrW01LQV9JQ0tfTEVOLzhdOyAvKio8IERlcml2ZWQgSUNLICovCisgICAgdWludDMyX3Qga2V5X251bWJlcjsgLyoqPCBDdXJyZW50IEtOICovCisgICAgdWludDhfdCAgYXNzb2NpYXRpb25fbnVtYmVyOyAvKio8IEFOICovCisgICAgYmNtb3NfbWFjX2FkZHJlc3MgbGVzc2VyX21hYzsgLyoqPCBMb3dlc3QgTUFDIGFkZHJlc3Mgb2YgTUtBIHBlZXJzICovCisgICAgYmNtb3NfbWFjX2FkZHJlc3MgZ3JlYXRlcl9tYWM7IC8qKjwgR3JlYXRlc3QgTUFDIGFkZHJlc3Mgb2YgTUtBIHBlZXJzICovCisgICAgbWthX3N0YXRlIHN0YXRlOyAvKio8IFN0YXRlIG9mIE1LQSBwcm9wZXIgU00gKi8KKyAgICBta2FfcGVlcl9zdGF0ZSBwZWVyX3N0YXRlOyAvKio8IFN0YXRlIG9mIE1LQSBwZWVyICovCisgICAgdWludDhfdCAgcmV0cnlfY250OyAvKio8IE1LQSBtZXNzYWdlIHJldHJ5IGNvdW50ICovCisgICAgdWludDhfdCAgcmVmcmVzaF9jbnQ7IC8qKjwgSW1wb3J0YW50IGZvciBidWlsZGluZyBTQUsgVXNlIFBhcmFtIHNldCAqLworICAgIGJjbW9zX2Jvb2wgc2FrX3JlZnJlc2hfbmVlZGVkOyAvKio8IFNBSyByZWZyZXNoIG5lZWRlZCBmbGFnICovCit9IG1rYV9saW5rX2luZm87CisKKy8qIFRoZSB0eXBlIG9mIE1LQSBvcGVyYXRpb24gdG8gcHJvY2Vzcy4gKi8KK3R5cGVkZWYgZW51bSBta2Ffb3BfdHlwZQoreworICAgIE1LQV9PUF9fSU5WQUxJRCA9IC0xLAorCisgICAgLyogUGFja2V0IG9wZXJhdGlvbnMuICovCisgICAgTUtBX09QX1NUQVJUX1JTUCwKKyAgICBNS0FfT1BfU0FLX1JTUCwKKyAgICBNS0FfT1BfS0VFUF9BTElWRSwKKworICAgIC8qIFRpbWVvdXQgb3BlcmF0aW9ucy4gKi8KKyAgICBNS0FfT1BfU1RBUlRfVElNRU9VVCwKKyAgICBNS0FfT1BfU0FLX1RJTUVPVVQsCisgICAgTUtBX09QX1NFTkRfS0VFUF9BTElWRSwKKworICAgIE1LQV9PUF9fQ09VTlQKK30gbWthX29wX3R5cGU7CisKK3N0cnVjdCBkcG9lX3NlY19saW5rX3JlYzsKKworYmNtb3NfZXJybm8gbWthX3N0YXJ0KHN0cnVjdCBkcG9lX3NlY19saW5rX3JlYyAqbGluayk7CisKK3ZvaWQgbWthX2dlbmVyYXRlX3NhayhzdHJ1Y3QgZHBvZV9zZWNfbGlua19yZWMgKmxpbmssIGJjbW9zX2Jvb2wgaW5pdGlhbCk7CisKK2JjbW9zX2Vycm5vIG1rYV9zZW5kX3NhayhzdHJ1Y3QgZHBvZV9zZWNfbGlua19yZWMgKmxpbmssIHVpbnQ4X3QgKnNhayk7CisKK2JjbW9zX2Vycm5vIG1rYV9zZW5kX3Nha19jb25maXJtKHN0cnVjdCBkcG9lX3NlY19saW5rX3JlYyAqbGluayk7CisKK2JjbW9zX2Vycm5vIG1rYV9wcm9jZXNzX3BhY2tldChzdHJ1Y3QgZHBvZV9zZWNfbGlua19yZWMgKmxpbmssIGJjbW9sdF91OF9saXN0X3UxNiByeF9mcmFtZSwgbWthX29wX3R5cGUgb3BfdHlwZSk7CisKK2JjbW9zX2Vycm5vIG1rYV9wcm9jZXNzX3RpbWVvdXQoc3RydWN0IGRwb2Vfc2VjX2xpbmtfcmVjICpsaW5rLCBta2Ffb3BfdHlwZSBvcF90eXBlKTsKKworI2VuZGlmIC8qIE1LQV9IICovCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vvbi9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZW9uL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNGMzYTUKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vvbi9NYWtlZmlsZQpAQCAtMCwwICsxLDMzIEBACisjIEVQT04gT0FNIE5lZ290aWF0aW9uIHVzZXIgYXBwbGljYXRpb24KKworaWZlcSAoIiQoRU5BQkxFX0NMSSkiLCAieSIpCisKKwlNT0RfTkFNRSA9IGJjbV91c2VyX2FwcGxfZW9uCisJTU9EX1RZUEUgPSBsaWIKKwlNT0RfREVQUyA9IGhvc3RfYXBpIGJjbV91c2VyX2FwcGxfZXBvbl9vYW0gY29tbW9uX2Vwb25fb2FtCisKKwlpZmVxICgiJChPU19LRVJORUwpIiwgImxpbnV4IikKKwkJTU9EX0RFUFMgKz0gZGV2X2xvZ19saW51eAorCWVuZGlmCisKKwlzcmNzID0gYmNtb2x0X2Vvbi5jIG9hbV9zZXRzL29hbV9jb21tb24uYworCisJRU5BQkxFX0RQT0VfT0FNID89IHkKKwlpZmVxICgiJChFTkFCTEVfRFBPRV9PQU0pIiwgInkiKQorCQlFWFRSQV9ERUZJTkVTICs9IC1ERU9OX09BTV9TRVRfRFBPRV9TVVBQT1JURUQKKwkJc3JjcyArPSBvYW1fc2V0cy9kcG9lL2Rwb2UuYworCWVuZGlmICMgRU5BQkxFX0RQT0VfT0FNCisKKwlFTkFCTEVfQlJDTV9PQU0gPz0geQorCWlmZXEgKCIkKEVOQUJMRV9CUkNNX09BTSkiLCAieSIpCisJCUVYVFJBX0RFRklORVMgKz0gLURFT05fT0FNX1NFVF9CUkNNX1NVUFBPUlRFRAorCQlzcmNzICs9IG9hbV9zZXRzL2JyY20vYnJjbS5jCisJZW5kaWYgIyBFTkFCTEVfQlJDTV9PQU0KKworCUVOQUJMRV9DVENfT0FNID89IHkKKwlpZmVxICgiJChFTkFCTEVfQ1RDX09BTSkiLCAieSIpCisJCUVYVFJBX0RFRklORVMgKz0gLURFT05fT0FNX1NFVF9DVENfU1VQUE9SVEVECisJCXNyY3MgKz0gb2FtX3NldHMvY3RjL2N0Yy5jCisJZW5kaWYgIyBFTkFCTEVfQ1RDX09BTQorCitlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lb24vYmNtb2x0X2Vvbi5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lb24vYmNtb2x0X2Vvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxOTMxNDgKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vvbi9iY21vbHRfZW9uLmMKQEAgLTAsMCArMSw3ODMgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorKi8KKworLyogIFRoaXMgZmlsZSBpcyB0aGUgbWFzdGVyIGV2ZW50IGhhbmRsZXIgZm9yIHRoZSBFUE9OIE9BTSBuZWdvdGlhdGlvbiB0YXNrIC0KKyAgICBJdCBhY2NlcHRzIGV2ZW50cyBmcm9tIHRoZSBlbWJlZGRlZCBzb2Z0d2FyZSBhbmQgdGhlIGhvc3QgaW50ZXJmYWNlLCBzdXBwb3J0ZWQgZXZlbnRzIGFyZQorICAgIDEuICBTdGFydCBPQU0gbmVnb3RpYXRvbiAoZnJvbSBob3N0IGludGVyZmFjZSkKKyAgICAyLiAgU3RvcCBPQU0gbmVnb3RpYXRpb24gKGZyb20gaG9zdCBpbnRlcmZhY2UpCisgICAgMy4gIFJYIEZyYW1lIChmcm9tIE9OVSB2aWEgZW1iZWRkZWQgZmlybXdhcmUpCisgICAgNC4gIFRpbWVvdXQKKworICAgIEl0IGRpc3BhdGNoZXMgdGhlc2UgZXZlbnRzIHRvIHRoZSBPQU0gc3BlY2lmaWMgc3RhdGUgbWFjaGluZS4gQ3VycmVudGx5IHdlIHN1cHBvcnQKKyAgICBPQU0gbmVnb3RpYXRpb24gZm9yIEJSQ00sIERQb0UsIGFuZCBDVEMgT0FNIHN0YW5kYXJkcy4KKyovCisKKyNpbmNsdWRlICJiY21vbHRfZW9uX3ByaXZhdGUuaCIKKyNpbmNsdWRlIDxiY21vbHRfYXBpLmg+CisjaW5jbHVkZSA8YmNtb2x0X21vZGVsX3R5cGVzLmg+CisjaW5jbHVkZSA8YmNtb2x0X21zZ19wYWNrLmg+CisjaW5jbHVkZSAib2FtX3NldHMvb2FtX2NvbW1vbi5oIgorCisjZGVmaW5lIEVPTl9UQVNLX01TR19RX1NJWkUgNjQKKwordHlwZWRlZiBlbnVtCit7CisgICAgRU9OX0VWRU5UX1RZUEVfRlJBTUVfUlgsCisgICAgRU9OX0VWRU5UX1RZUEVfT0FNX05FR19TVEFSVCwKKyAgICBFT05fRVZFTlRfVFlQRV9PQU1fTkVHX1NUT1AsCisgICAgRU9OX0VWRU5UX1RZUEVfT0FNX1RJTUVSX0VYUElSRSwKKworICAgIEVPTl9FVkVOVF9UWVBFX0NPVU5UCit9IGVvbl9ldmVudF90eXBlOworCit0eXBlZGVmIHVuaW9uCit7CisgICAgZW9uX2ZyYW1lX2RhdGEgZnJhbWVfcng7Cit9IGVvbl9ldmVudF9kYXRhOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGVvbl9ldmVudF90eXBlIHR5cGU7CisgICAgZW9uX2xpbmtfc3RhdGUgKmxpbms7CisgICAgZW9uX2V2ZW50X2RhdGEgZGF0YTsKK30gZW9uX2V2ZW50OworCit0eXBlZGVmIGJjbW9zX2Vycm5vICgqZW9uX2V2ZW50X2hhbmRsZXIpKGNvbnN0IGVvbl9ldmVudCogaW5fZXZlbnQpOworCitzdGF0aWMgY29uc3QgY2hhciogX2V2bmFtZVtFT05fRVZFTlRfVFlQRV9DT1VOVF0gPQoreworICAgIFtFT05fRVZFTlRfVFlQRV9GUkFNRV9SWF0gPSAiZW9uX2V2ZW50X3R5cGVfZnJhbWVfcngiLAorICAgIFtFT05fRVZFTlRfVFlQRV9PQU1fTkVHX1NUQVJUXSA9ICJlb25fZXZlbnRfdHlwZV9vYW1fbmVnX3N0YXJ0IiwKKyAgICBbRU9OX0VWRU5UX1RZUEVfT0FNX05FR19TVE9QXSA9ICJlb25fZXZlbnRfdHlwZV9vYW1fbmVnX3N0b3AiLAorICAgIFtFT05fRVZFTlRfVFlQRV9PQU1fVElNRVJfRVhQSVJFXSA9ICJlb25fZXZlbnRfdHlwZV9vYW1fdGltZXJfZXhwaXJlIgorfTsKKworc3RhdGljIGJjbWNsaV9lbnVtX3ZhbCBlb25fb2FtX3NldF9pZF90YWJsZVtFT05fT0FNX1NFVF9JRF9DT1VOVCsxXSA9Cit7CisgICAgeyAubmFtZSA9ICJkcG9lIiwgLnZhbCA9IEVPTl9PQU1fU0VUX0lEX0RQT0UgfSwKKyAgICB7IC5uYW1lID0gImJyY20iLCAudmFsID0gRU9OX09BTV9TRVRfSURfQlJDTSB9LAorICAgIHsgLm5hbWUgPSAiY3RjIiwgLnZhbCA9IEVPTl9PQU1fU0VUX0lEX0NUQyB9LAorICAgIEJDTUNMSV9FTlVNX0xBU1QKK307CisKK2Vvbl9nbG9iYWxfc3RhdGUgZW9uX3N0YXRlW0JDTVRSX01BWF9PTFRTXSA9IHt9OworCisjZGVmaW5lIEhFQVJUQkVBVF9TRU5EX1BFUklPRCAxCisjZGVmaW5lIEhFQVJUQkVBVF9TRU5EX09GRlNFVCAxNQorI2RlZmluZSBIRUFSVEJFQVRfUkVDRUlWRV9USU1FT1VUIDUKKyNkZWZpbmUgT0FNX1RJTUVPVVRfVVMgKEhFQVJUQkVBVF9SRUNFSVZFX1RJTUVPVVQgKiAxMDAwICogMTAwMCkKKworc3RhdGljIGJjbW9zX2Jvb2wgIGVwb25fb2FtX25lZ19ydW5uaW5nID0gQkNNT1NfRkFMU0U7CisKK3N0YXRpYyBpbmxpbmUgaW50IF9saW5rX2tleV9jbXAoY29uc3QgZW9uX2xpbmtfc3RhdGUqIGEsIGNvbnN0IGVvbl9saW5rX3N0YXRlKiBiKQoreworICAgIHJldHVybiBtZW1jbXAoJmEtPmxpbmtfa2V5LmxpbmssICZiLT5saW5rX2tleS5saW5rLCBzaXplb2YoYS0+bGlua19rZXkubGluaykpOworfQorCitSQl9HRU5FUkFURV9JTkxJTkUobGlua19zdGF0ZV9tYXAsIGVvbl9saW5rX3N0YXRlLCByYl9lbnRyeSwgX2xpbmtfa2V5X2NtcCk7CisKKworc3RhdGljIGJjbW9zX2Vycm5vIF9lb25faW5pdF90YXNrKGJjbW9sdF9kZXZpZCBkZXZpY2UpCit7CisgICAgYmNtb3NfdGFza19wYXJtIHRhc2tfcGFyYW1zID0KKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSBlb25fc3RhdGVbZGV2aWNlXS50YXNrX25hbWUsCisgICAgICAgIC5wcmlvcml0eSAgICAgPSBUQVNLX1BSSU9SSVRZX1VTRVJfQVBQTF9FT04sCisgICAgICAgIC5jb3JlICAgICAgICAgPSBCQ01PU19DUFVfQ09SRV9BTlksIC8qIE5vIENQVSBhZmZpbml0eSAqLworICAgICAgICAuaW5pdF9oYW5kbGVyID0gTlVMTAorICAgIH07CisgICAgc25wcmludGYoZW9uX3N0YXRlW2RldmljZV0udGFza19uYW1lLCBzaXplb2YoZW9uX3N0YXRlW2RldmljZV0udGFza19uYW1lKSwgInVzZXJfYXBwbF9lb24ldSIsIGRldmljZSk7CisgICAgYmNtb3NfZXJybm8gcmMgPSBiY21vc190YXNrX2NyZWF0ZSgmZW9uX3N0YXRlW2RldmljZV0udGFzaywgJnRhc2tfcGFyYW1zKTsKKworICAgIHJldHVybiByYzsKK30KKworCitzdGF0aWMgYmNtb3NfZXJybm8gX2Vvbl9pbml0X21vZHVsZShiY21vbHRfZGV2aWQgZGV2aWNlKQoreworICAgIGJjbW9zX21vZHVsZV9wYXJtIG1vZHVsZV9wYXJhbXMgPQorICAgIHsKKyAgICAgICAgLnFwYXJtID0geyAubmFtZSA9IGVvbl9zdGF0ZVtkZXZpY2VdLm1zZ19xdWV1ZV9uYW1lLCAuc2l6ZSA9IEVPTl9UQVNLX01TR19RX1NJWkUgfSwKKyAgICAgICAgLmluaXQgPSBOVUxMCisgICAgfTsKKyAgICBzbnByaW50Zihlb25fc3RhdGVbZGV2aWNlXS5tc2dfcXVldWVfbmFtZSwgc2l6ZW9mKGVvbl9zdGF0ZVtkZXZpY2VdLm1zZ19xdWV1ZV9uYW1lKSwgImVvbl9tc2dfcSV1IiwgZGV2aWNlKTsKKyAgICByZXR1cm4gYmNtb3NfbW9kdWxlX2NyZWF0ZShCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX0VPTiArIGRldmljZSwgJmVvbl9zdGF0ZVtkZXZpY2VdLnRhc2ssICZtb2R1bGVfcGFyYW1zKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9lb25fc2VuZF9vc19tc2coYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb3NfbXNnX2lkIHR5cGUsIGVvbl90YXNrX21zZ19kYXRhICpkYXRhKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGVvbl90YXNrX21zZyAqbXNnID0gYmNtb3NfY2FsbG9jKHNpemVvZigqbXNnKSk7CisgICAgaWYgKG1zZyA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgRU9OX0xPRyhFUlJPUiwgZGV2aWNlLCAiT1MgTWVzc2FnZSBjYWxsb2MgZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorCisgICAgbXNnLT5vc19tc2cuaW5zdGFuY2UgPSBkZXZpY2U7CisgICAgbXNnLT5vc19tc2cudHlwZSA9IHR5cGU7CisgICAgbXNnLT5kYXRhID0gKmRhdGE7CisgICAgcmMgPSBiY21vc19tc2dfZGlzcGF0Y2goJm1zZy0+b3NfbXNnLCBCQ01PU19NU0dfU0VORF9BVVRPX0ZSRUUpOworICAgIGlmIChCQ01fRVJSX09LICE9IHJjKQorICAgIHsKKyAgICAgICAgRU9OX0xPRyhFUlJPUiwgZGV2aWNlLCAiT1MgTWVzc2FnZSBzZW5kIGZhaWxlZCAoJXMpXG4iLCBiY21vc19zdHJlcnJvcihyYykpOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgX2Vvbl9kZXN0cm95X2xpbmtfc3RhdGUoZW9uX2xpbmtfc3RhdGUqIGxpbmtfc3RhdGUpCit7CisgICAgRU9OX0xJTktfTE9HKERFQlVHLCAmbGlua19zdGF0ZS0+bGlua19rZXksICJEZXN0cm95aW5nIGxpbmtcbiIpOworICAgIGJjbW9zX3RpbWVyX2Rlc3Ryb3koJmxpbmtfc3RhdGUtPm9hbV90aW1lcik7CisgICAgUkJfUkVNT1ZFKGxpbmtfc3RhdGVfbWFwLCAmZW9uX3N0YXRlW2xpbmtfc3RhdGUtPmxpbmtfa2V5LmRldmljZV9pZF0ubGlua19zdGF0ZV9tYXAsIGxpbmtfc3RhdGUpOworICAgIGlmIChOVUxMICE9IGxpbmtfc3RhdGUtPnR4LnBheWxvYWQpCisgICAgeworICAgICAgICBiY21vc19mcmVlKGxpbmtfc3RhdGUtPnR4LnBheWxvYWQpOworICAgIH0KKyAgICBpZiAoTlVMTCAhPSBsaW5rX3N0YXRlLT5yeC5wYXlsb2FkKQorICAgIHsKKyAgICAgICAgYmNtb3NfZnJlZShsaW5rX3N0YXRlLT5yeC5wYXlsb2FkKTsKKyAgICB9CisgICAgaWYgKE5VTEwgIT0gbGlua19zdGF0ZS0+b3JnX3NwZWNfc3RhdGUpCisgICAgeworICAgICAgICBiY21vc19mcmVlKGxpbmtfc3RhdGUtPm9yZ19zcGVjX3N0YXRlKTsKKyAgICB9CisgICAgYmNtb3NfZnJlZShsaW5rX3N0YXRlKTsKK30KKworc3RhdGljIGVvbl9saW5rX3N0YXRlKiBfZW9uX2ZpbmRfbGlua19zdGF0ZShjb25zdCBlb25fbGlua19rZXkqIGxpbmtfa2V5KQoreworICAgIGVvbl9saW5rX3N0YXRlIHF1ZXJ5X2tleSA9IHsgLmxpbmtfa2V5LmxpbmsgPSBsaW5rX2tleS0+bGluayB9OworCisgICAgcmV0dXJuIFJCX0ZJTkQobGlua19zdGF0ZV9tYXAsICZlb25fc3RhdGVbbGlua19rZXktPmRldmljZV9pZF0ubGlua19zdGF0ZV9tYXAsICZxdWVyeV9rZXkpOworfQorCitzdGF0aWMgdm9pZCBfZW9uX2RlZmF1bHRfY2FsbGJhY2tfZm4odm9pZCAqY29udGV4dCwgY29uc3QgZW9uX2xpbmtfa2V5KiBsaW5rX2tleSwgYmNtb3NfZXJybm8gcmVzdWx0KQoreworICAgIGVvbl9saW5rX3N0YXRlICpsaW5rX3N0YXRlID0gX2Vvbl9maW5kX2xpbmtfc3RhdGUobGlua19rZXkpOworCisgICAgRU9OX0xJTktfTE9HKAorICAgICAgICBJTkZPLCBsaW5rX2tleSwgIk9BTSBuZWdvdGlhdGlvbiBjb21wbGV0ZWQgKCVzKSwgZmxhZ3MgJTA0eFxuIiwgYmNtb3Nfc3RyZXJyb3IocmVzdWx0KSwgbGlua19zdGF0ZS0+b2FtX3N0YXRlKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9lb25faW5qZWN0X2ZyYW1lKGVvbl9saW5rX2tleSogbGlua19rZXksIHVpbnQxNl90IHBheWxvYWRfbGVuZ3RoLCB1aW50OF90ICpwYXlsb2FkX2FkZHIpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgYmNtb2x0X2Vwb25fbGlua19pbmplY3RfZnJhbWUgaW5qZWN0X2ZyYW1lOworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGVwb25fbGlua19rZXkgPSBsaW5rX2tleS0+bGluazsKKyAgICBiY21vbHRfZXRoZXJuZXRfZnJhbWVfdW5tYXNrZWQgZnJhbWUgPQorICAgICAgICB7CisgICAgICAgICAgICAuZnJhbWVfb2N0ZXRzID0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAubGVuID0gcGF5bG9hZF9sZW5ndGgsCisgICAgICAgICAgICAgICAgLnZhbCA9IHBheWxvYWRfYWRkcgorICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgQkNNT0xUX1BST1hZX0lOSVQoJmluamVjdF9mcmFtZSwgZXBvbl9saW5rLCBpbmplY3RfZnJhbWUsIGVwb25fbGlua19rZXkpOworICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmaW5qZWN0X2ZyYW1lLCBlcG9uX2xpbmssIGluamVjdF9mcmFtZSwgZnJhbWUsIGZyYW1lKTsKKyAgICByYyA9IGJjbW9sdF9wcm94eV9zZW5kKGxpbmtfa2V5LT5kZXZpY2VfaWQsICZpbmplY3RfZnJhbWUuaGRyKTsKKyAgICBpZiAoQkNNX0VSUl9PSyAhPSByYykKKyAgICB7CisgICAgICAgIEVPTl9MSU5LX0xPRyhFUlJPUiwgbGlua19rZXksICJpbmplY3Qgb3BlcmF0aW9uIGZhaWxlZCAoJXMpXG4iLCBiY21vc19zdHJlcnJvcihyYykpOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9lb25fY2xlYXJfcHJvdihlb25fbGlua19rZXkgKmxpbmtfa2V5KQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBrZXkgPSBsaW5rX2tleS0+bGluazsKKyAgICBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RvcCBzdG9wX29wZXI7CisgICAgYmNtb2x0X29hbV9oZWFydGJlYXRfY29uZmlnIGhiX2NmZyA9IHt9OworICAgIGJjbW9sdF9lcG9uX2xpbmtfY2ZnIGxpbmtfY2ZnOworCisgICAgQkNNT0xUX09QRVJfSU5JVCgmc3RvcF9vcGVyLCBlcG9uX2xpbmssIG9hbV9rZWVwYWxpdmVfdGltZXJfc3RvcCwga2V5KTsKKyAgICBlcnIgPSBiY21vbHRfb3Blcl9zdWJtaXQobGlua19rZXktPmRldmljZV9pZCwgJnN0b3Bfb3Blci5oZHIpOworICAgIGlmIChCQ01fRVJSX09LICE9IGVycikKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaGJfY2ZnLnRyYW5zbWl0X2ZyYW1lLmxlbiA9IDA7CisgICAgaGJfY2ZnLnRyYW5zbWl0X2ZyYW1lLnZhbCA9IE5VTEw7CisgICAgaGJfY2ZnLmlnbm9yZWRfcmVjZWl2ZV9mcmFtZV90ZW1wbGF0ZS5mcmFtZV9vY3RldHMubGVuID0gMDsKKyAgICBoYl9jZmcuaWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlLmZyYW1lX29jdGV0cy52YWwgPSBOVUxMOworICAgIGhiX2NmZy5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUubWFza19vY3RldHMubGVuID0gMDsKKyAgICBoYl9jZmcuaWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlLm1hc2tfb2N0ZXRzLnZhbCA9IE5VTEw7CisgICAgaGJfY2ZnLnJlY2VpdmVfdGltZW91dCA9IDU7CisgICAgaGJfY2ZnLm1heGltdW1fcmVjZWl2ZV9zaXplID0gMDsKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmxpbmtfY2ZnLCBlcG9uX2xpbmssIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmbGlua19jZmcsIGVwb25fbGluaywgb2FtX2hlYXJ0YmVhdF9jb25maWcsIGhiX2NmZyk7CisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQobGlua19rZXktPmRldmljZV9pZCwgJmxpbmtfY2ZnLmhkcik7CisKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2Vvbl9zZXRfb2FtX2hlYXJ0YmVhdF9jb25maWcoY29uc3QgZW9uX2xpbmtfc3RhdGUgKmxpbmtfc3RhdGUpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgYmNtb2x0X29hbV9oZWFydGJlYXRfY29uZmlnIG9hbV9oZWFydGJlYXRfY29uZmlnID0ge307CisKKyAgICBvYW1faGVhcnRiZWF0X2NvbmZpZy5yZWNlaXZlX3RpbWVvdXQgPSBIRUFSVEJFQVRfUkVDRUlWRV9USU1FT1VUOworICAgIG9hbV9oZWFydGJlYXRfY29uZmlnLm1heGltdW1fcmVjZWl2ZV9zaXplID0gbGlua19zdGF0ZS0+bWF4X3BkdV9zaXplOworCisgICAgLyogVGhlIEJDTTY4NjIwIFRYIGhlYXJ0YmVhdCBwcm92aXNpb25pbmcgZG9lcyBub3QgaW5jbHVkZSB0aGUgZmlyc3QgMTUgYnl0ZXMgLSBTQSwgREEsIEV0aGVyVHlwZSBvciBTdWJ0eXBlICovCisgICAgb2FtX2hlYXJ0YmVhdF9jb25maWcudHJhbnNtaXRfZnJhbWUudmFsID0gJmxpbmtfc3RhdGUtPnR4LnBheWxvYWRbSEVBUlRCRUFUX1NFTkRfT0ZGU0VUXTsKKyAgICBvYW1faGVhcnRiZWF0X2NvbmZpZy50cmFuc21pdF9mcmFtZS5sZW4gPSBsaW5rX3N0YXRlLT50eC5sZW5ndGggLSBIRUFSVEJFQVRfU0VORF9PRkZTRVQ7CisKKyAgICBvYW1faGVhcnRiZWF0X2NvbmZpZy5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUuZnJhbWVfb2N0ZXRzLnZhbCA9IGxpbmtfc3RhdGUtPnJ4LnBheWxvYWQ7CisgICAgb2FtX2hlYXJ0YmVhdF9jb25maWcuaWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlLmZyYW1lX29jdGV0cy5sZW4gPSBsaW5rX3N0YXRlLT5yeC5sZW5ndGg7CisKKyAgICAvKiBmb3J3YXJkIE9BTSBmcmFtZXMgd2l0aCBhbnkgZGlmZmVyZW5jZXMgdG8gdGhlIGhvc3QgKi8KKyAgICBvYW1faGVhcnRiZWF0X2NvbmZpZy5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUubWFza19vY3RldHMudmFsID0gYmNtb3NfY2FsbG9jKGxpbmtfc3RhdGUtPnJ4Lmxlbmd0aCk7CisgICAgaWYgKE5VTEwgIT0gb2FtX2hlYXJ0YmVhdF9jb25maWcuaWdub3JlZF9yZWNlaXZlX2ZyYW1lX3RlbXBsYXRlLm1hc2tfb2N0ZXRzLnZhbCkKKyAgICB7CisgICAgICAgIG1lbXNldChvYW1faGVhcnRiZWF0X2NvbmZpZy5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUubWFza19vY3RldHMudmFsLCAweEZGLCBsaW5rX3N0YXRlLT5yeC5sZW5ndGgpOworICAgICAgICBvYW1faGVhcnRiZWF0X2NvbmZpZy5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUubWFza19vY3RldHMubGVuID0gbGlua19zdGF0ZS0+cngubGVuZ3RoOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICB9CisKKyAgICBiY21vbHRfZXBvbl9saW5rX2NmZyBsaW5rX2NmZzsKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmxpbmtfY2ZnLCBlcG9uX2xpbmssIGxpbmtfc3RhdGUtPmxpbmtfa2V5LmxpbmspOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmxpbmtfY2ZnLCBlcG9uX2xpbmssIG9hbV9oZWFydGJlYXRfY29uZmlnLCBvYW1faGVhcnRiZWF0X2NvbmZpZyk7CisgICAgcmMgPSBiY21vbHRfY2ZnX3NldChsaW5rX3N0YXRlLT5saW5rX2tleS5kZXZpY2VfaWQsICZsaW5rX2NmZy5oZHIpOyAvKiBjYWxsIEFQSSAqLworCisgICAgYmNtb3NfZnJlZShvYW1faGVhcnRiZWF0X2NvbmZpZy5pZ25vcmVkX3JlY2VpdmVfZnJhbWVfdGVtcGxhdGUubWFza19vY3RldHMudmFsKTsKKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9lb25fc3RhcnRfb2FtX2hlYXJ0YmVhdChlb25fbGlua19zdGF0ZSAqbGlua19zdGF0ZSkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIHJjID0gX2Vvbl9zZXRfb2FtX2hlYXJ0YmVhdF9jb25maWcobGlua19zdGF0ZSk7CisgICAgaWYgKEJDTV9FUlJfT0sgPT0gcmMpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9saW5rX2tleSBlbWJfbGlua19rZXkgPSBsaW5rX3N0YXRlLT5saW5rX2tleS5saW5rOworICAgICAgICBiY21vbHRfZXBvbl9saW5rX29hbV9rZWVwYWxpdmVfdGltZXJfc3RhcnQgc3RhcnRfaGVhcnRiZWF0X29wOworICAgICAgICBCQ01PTFRfT1BFUl9JTklUKCZzdGFydF9oZWFydGJlYXRfb3AsIGVwb25fbGluaywgb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydCwgZW1iX2xpbmtfa2V5KTsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoCisgICAgICAgICAgICAmc3RhcnRfaGVhcnRiZWF0X29wLAorICAgICAgICAgICAgZXBvbl9saW5rLAorICAgICAgICAgICAgb2FtX2tlZXBhbGl2ZV90aW1lcl9zdGFydCwKKyAgICAgICAgICAgIHNlbmRfcGVyaW9kLAorICAgICAgICAgICAgSEVBUlRCRUFUX1NFTkRfUEVSSU9EKTsKKyAgICAgICAgcmMgPSBiY21vbHRfb3Blcl9zdWJtaXQobGlua19zdGF0ZS0+bGlua19rZXkuZGV2aWNlX2lkLCAmc3RhcnRfaGVhcnRiZWF0X29wLmhkcik7CisgICAgICAgIGlmIChCQ01fRVJSX09LICE9IHJjKQorICAgICAgICB7CisgICAgICAgICAgICBFT05fTElOS19MT0coRVJST1IsICZsaW5rX3N0YXRlLT5saW5rX2tleSwgImtlZXBhbGl2ZSBzdGFydCBvcGVyYXRpb24gc3VibWl0IGZhaWxlZCAoJXMpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgRU9OX0xJTktfTE9HKEVSUk9SLCAmbGlua19zdGF0ZS0+bGlua19rZXksICJmYWlsZWQgdG8gc2V0IGhlYXJ0YmVhdCBjb25maWd1cmF0aW9uKCVzKVxuIiwgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfZW9uX3NlbmRfaW5mb19mcmFtZShlb25fbGlua19zdGF0ZSAqbGlua19zdGF0ZSkKK3sKKyAgICBlb25fZnJhbWVfZGF0YSBmcmFtZV90eF9yZXE7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICByYyA9IGJ1aWxkX3R4X2luZm9fZnJhbWUobGlua19zdGF0ZSwgJmZyYW1lX3R4X3JlcSk7CisgICAgaWYgKEJDTV9FUlJfT0sgPT0gcmMpCisgICAgeworICAgICAgICByYyA9IF9lb25faW5qZWN0X2ZyYW1lKCZsaW5rX3N0YXRlLT5saW5rX2tleSwgZnJhbWVfdHhfcmVxLmxlbmd0aCwgZnJhbWVfdHhfcmVxLnBheWxvYWQpOworICAgICAgICBpZiAoQkNNX0VSUl9PSyA9PSByYykKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb3NfdGltZXJfc3RhcnQoJmxpbmtfc3RhdGUtPm9hbV90aW1lciwgT0FNX1RJTUVPVVRfVVMpOyAvKiBzdGFydCB0aW1lciBmb3IgcnggZnJhbWUgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEVPTl9MSU5LX0xPRyhXQVJOSU5HLCAmbGlua19zdGF0ZS0+bGlua19rZXksICJmYWlsZWQgdG8gaW5qZWN0IGZyYW1lICglcylcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgICAgIH0KKyAgICAgICAgYmNtb3NfZnJlZShmcmFtZV90eF9yZXEucGF5bG9hZCk7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2Vvbl9jb21wbGV0ZV9uZWdvdGlhdGlvbihlb25fbGlua19zdGF0ZSAqbGlua19zdGF0ZSwgdWludDhfdCAqcnhfcGF5bG9hZCwgdWludDE2X3QgcnhfbGVuZ3RoKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGVvbl9mcmFtZV9kYXRhIGZyYW1lX3R4X3JlcTsKKworICAgIHJjID0gYnVpbGRfdHhfaW5mb19mcmFtZShsaW5rX3N0YXRlLCAmZnJhbWVfdHhfcmVxKTsKKyAgICBpZiAoQkNNX0VSUl9PSyAhPSByYykKKyAgICB7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisgICAgbGlua19zdGF0ZS0+dHgucGF5bG9hZCA9IGZyYW1lX3R4X3JlcS5wYXlsb2FkOworICAgIGxpbmtfc3RhdGUtPnR4Lmxlbmd0aCA9IGZyYW1lX3R4X3JlcS5sZW5ndGg7CisgICAgRU9OX0xJTktfTE9HKERFQlVHLCAmbGlua19zdGF0ZS0+bGlua19rZXksICJTZXR0aW5nIFRYIHBheWxvYWRcbiIpOworCisgICAgbGlua19zdGF0ZS0+cngucGF5bG9hZCA9IGJjbW9zX2NhbGxvYyhyeF9sZW5ndGgpOworICAgIGlmIChOVUxMID09IGxpbmtfc3RhdGUtPnJ4LnBheWxvYWQpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICB9CisgICAgbWVtY3B5KGxpbmtfc3RhdGUtPnJ4LnBheWxvYWQsIHJ4X3BheWxvYWQsIHJ4X2xlbmd0aCk7CisgICAgbGlua19zdGF0ZS0+cngubGVuZ3RoID0gcnhfbGVuZ3RoOworICAgIEVPTl9MSU5LX0xPRyhERUJVRywgJmxpbmtfc3RhdGUtPmxpbmtfa2V5LCAiU2V0dGluZyBSWCBtYXNrXG4iKTsKKworICAgIGlmIChsaW5rX3N0YXRlLT5pc19oZWFydGJlYXRfYXV0b3N0YXJ0KQorICAgIHsKKyAgICAgICAgcmMgPSBfZW9uX3N0YXJ0X29hbV9oZWFydGJlYXQobGlua19zdGF0ZSk7CisgICAgICAgIEVPTl9MSU5LX0xPRyhJTkZPLCAmbGlua19zdGF0ZS0+bGlua19rZXksICJzdGFydCBPQU0gaGVhcnRiZWF0OiAlc1xuIiwgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICB9CisgICAgbGlua19zdGF0ZS0+Y2FsbGJhY2sobGlua19zdGF0ZS0+Y29udGV4dCwgJmxpbmtfc3RhdGUtPmxpbmtfa2V5LCByYyk7CisgICAgX2Vvbl9kZXN0cm95X2xpbmtfc3RhdGUobGlua19zdGF0ZSk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9lb25fZXZlbnRfaGFuZGxlcl9mcmFtZV9yeChjb25zdCBlb25fZXZlbnQqIGV2ZW50KQoreworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgRU9OX0xJTktfTE9HKERFQlVHLCAmZXZlbnQtPmxpbmstPmxpbmtfa2V5LCAicmVjZWl2ZWQgJXUtYnl0ZSBmcmFtZSBiZWdpbm5pbmcgYXQgJXBcbiIsCisgICAgICAgICAgICAgICAgIGV2ZW50LT5kYXRhLmZyYW1lX3J4Lmxlbmd0aCwgZXZlbnQtPmRhdGEuZnJhbWVfcngucGF5bG9hZCk7CisKKyAgICAvKiB2YWxpZGF0ZXMgZnJhbWUsIHVwZGF0ZXMgZmxhZ3MgKi8KKyAgICByYyA9IGhhbmRsZV9yeF9pbmZvX2ZyYW1lKGV2ZW50LT5saW5rLCBldmVudC0+ZGF0YS5mcmFtZV9yeC5sZW5ndGgsIGV2ZW50LT5kYXRhLmZyYW1lX3J4LnBheWxvYWQpOworICAgIHN3aXRjaCAocmMpCisgICAgeworICAgICAgICBjYXNlIEJDTV9FUlJfT0s6IC8qIENvbXBsZXRlZCBOZWdvdGlhdGlvbiAqLworICAgICAgICAgICAgcmMgPSBfZW9uX2NvbXBsZXRlX25lZ290aWF0aW9uKGV2ZW50LT5saW5rLCBldmVudC0+ZGF0YS5mcmFtZV9yeC5wYXlsb2FkLCBldmVudC0+ZGF0YS5mcmFtZV9yeC5sZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNX0VSUl9JTl9QUk9HUkVTUzoKKyAgICAgICAgICAgIHJjID0gX2Vvbl9zZW5kX2luZm9fZnJhbWUoZXZlbnQtPmxpbmspOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNX0VSUl9QQVJTRToKKyAgICAgICAgICAgIEVPTl9MSU5LX0xPRyhJTkZPLCAmZXZlbnQtPmxpbmstPmxpbmtfa2V5LCAicmVjZWl2ZWQgbm9uIGluZm8gZnJhbWU7IGlnbm9yaW5nXG4iKTsKKyAgICAgICAgICAgIHJjID0gQkNNX0VSUl9PSzsgLyogLi4uYW5kIGtlZXAgcnVubmluZyAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfZW9uX2V2ZW50X2hhbmRsZXJfc3RhcnQoY29uc3QgZW9uX2V2ZW50KiBldmVudCkKK3sKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIHJjID0gX2Vvbl9jbGVhcl9wcm92KCZldmVudC0+bGluay0+bGlua19rZXkpOworICAgIGlmIChCQ01fRVJSX09LID09IHJjKQorICAgIHsKKyAgICAgICAgZXZlbnQtPmxpbmstPm9hbV9zdGF0ZSA9IEJDTU9MVF9FUE9OX09BTV9PQU1fRkxBR1NfTE9DQUxfRVZBTFVBVElORzsKKyAgICAgICAgcmMgPSBfZW9uX3NlbmRfaW5mb19mcmFtZShldmVudC0+bGluayk7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIF9lb25fZXZlbnRfaGFuZGxlcl9zdG9wKGNvbnN0IGVvbl9ldmVudCogZXZlbnQpCit7CisgICAgRU9OX0xJTktfTE9HKElORk8sICZldmVudC0+bGluay0+bGlua19rZXksICJPQU0gc3RvcCBjb21tYW5kIHJlY2VpdmVkXG4iKTsKKyAgICBfZW9uX2Rlc3Ryb3lfbGlua19zdGF0ZShldmVudC0+bGluayk7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfZW9uX2V2ZW50X2hhbmRsZXJfb2FtX3RpbWVyX2V4cGlyZShjb25zdCBlb25fZXZlbnQqIGV2ZW50KQoreworICAgIEVPTl9MSU5LX0xPRyhXQVJOSU5HLCAmZXZlbnQtPmxpbmstPmxpbmtfa2V5LCAiT0FNIHRpbWVyIGV4cGlyZWRcbiIpOworICAgIHJldHVybiBCQ01fRVJSX1RJTUVPVVQ7Cit9CisKK3N0YXRpYyBjb25zdCBlb25fZXZlbnRfaGFuZGxlciBldmVudF9zbVtFT05fRVZFTlRfVFlQRV9DT1VOVF0gPQoreworICAgIFtFT05fRVZFTlRfVFlQRV9GUkFNRV9SWF0gPSBfZW9uX2V2ZW50X2hhbmRsZXJfZnJhbWVfcngsCisgICAgW0VPTl9FVkVOVF9UWVBFX09BTV9ORUdfU1RBUlRdID0gX2Vvbl9ldmVudF9oYW5kbGVyX3N0YXJ0LAorICAgIFtFT05fRVZFTlRfVFlQRV9PQU1fTkVHX1NUT1BdID0gX2Vvbl9ldmVudF9oYW5kbGVyX3N0b3AsCisgICAgW0VPTl9FVkVOVF9UWVBFX09BTV9USU1FUl9FWFBJUkVdID0gX2Vvbl9ldmVudF9oYW5kbGVyX29hbV90aW1lcl9leHBpcmUKK307CisKK3N0YXRpYyBiY21vc19lcnJubyBfZW9uX2V2ZW50X2hhbmRsZXIoY29uc3QgZW9uX2V2ZW50KiBldmVudCkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisKKyAgICBpZiAoZXZlbnQtPnR5cGUgPCBFT05fRVZFTlRfVFlQRV9DT1VOVCkKKyAgICB7CisgICAgICAgIEVPTl9MSU5LX0xPRyhERUJVRywgJmV2ZW50LT5saW5rLT5saW5rX2tleSwgImV2ZW50ICVzXG4iLCBfZXZuYW1lW2V2ZW50LT50eXBlXSk7CisgICAgICAgIHJjID0gZXZlbnRfc21bZXZlbnQtPnR5cGVdKGV2ZW50KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgRU9OX0xJTktfTE9HKEVSUk9SLCAmZXZlbnQtPmxpbmstPmxpbmtfa2V5LCAidW5rbm93biBldmVudCAlZFxuIiwgZXZlbnQtPnR5cGUpOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgX2Vvbl9ldmVudF9kaXNwYXRjaChjb25zdCBlb25fZXZlbnQqIGV2ZW50X2luKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgcmMgPSBfZW9uX2V2ZW50X2hhbmRsZXIoZXZlbnRfaW4pOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgZXZlbnRfaW4tPmxpbmstPmNhbGxiYWNrKGV2ZW50X2luLT5saW5rLT5jb250ZXh0LCAmZXZlbnRfaW4tPmxpbmstPmxpbmtfa2V5LCByYyk7CisgICAgICAgIF9lb25fZGVzdHJveV9saW5rX3N0YXRlKGV2ZW50X2luLT5saW5rKTsKKyAgICB9Cit9CisKK3N0YXRpYyBiY21vc190aW1lcl9yYyBfZW9uX29hbV90aW1lcl9leHBpcmUoYmNtb3NfdGltZXIqIHRpbWVyLCBsb25nIHBVc2VyKQoreworICAgIGVvbl9ldmVudCBldmVudCA9IHsgLnR5cGUgPSBFT05fRVZFTlRfVFlQRV9PQU1fVElNRVJfRVhQSVJFLCAubGluayA9IChlb25fbGlua19zdGF0ZSAqKXBVc2VyIH07CisKKyAgICBfZW9uX2V2ZW50X2Rpc3BhdGNoKCZldmVudCk7CisKKyAgICByZXR1cm4gQkNNT1NfVElNRVJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfZW9uX2NyZWF0ZV9saW5rX3N0YXRlKAorICAgIGVvbl9saW5rX3N0YXRlICoqc3RhdGUsCisgICAgZW9uX2xpbmtfa2V5KiBsaW5rX2tleSwKKyAgICBlb25fb2FtX3NldF9pZCBvYW1fc2V0LAorICAgIGJjbW9sdF9lb25fcmVzdWx0X2NiIGNiLAorICAgIHZvaWQgKmNvbnRleHQsCisgICAgYmNtb3NfYm9vbCBpc19oZWFydGJlYXRfYXV0b3N0YXJ0KQoreworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGVvbl9saW5rX3N0YXRlICpsaW5rX3N0YXRlOworCisgICAgbGlua19zdGF0ZSA9IF9lb25fZmluZF9saW5rX3N0YXRlKGxpbmtfa2V5KTsKKyAgICBpZiAobGlua19zdGF0ZSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgRU9OX0xJTktfTE9HKEVSUk9SLCBsaW5rX2tleSwgIk9BTSBuZWdvdGlhdGlvbiBpcyBhbHJlYWR5IGluIHByb2dyZXNzXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfQUxSRUFEWTsKKyAgICB9CisKKyAgICBsaW5rX3N0YXRlID0gYmNtb3NfY2FsbG9jKHNpemVvZigqbGlua19zdGF0ZSkpOworICAgIGlmIChsaW5rX3N0YXRlID09IE5VTEwpCisgICAgeworICAgICAgICBFT05fTElOS19MT0coRVJST1IsIGxpbmtfa2V5LCAiRmFpbGVkIHRvIGFsbG9jYXRlIHN0YXRlIHJlY29yZFxuIik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKworICAgIGJjbW9sdF9lcG9uX25pX2tleSBuaV9rZXkgPSB7IC5lcG9uX25pID0gbGlua19rZXktPmxpbmsuZXBvbl9uaSB9OworICAgIGJjbW9sdF9lcG9uX25pX2NmZyBuaV9jZmc7CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJm5pX2NmZywgZXBvbl9uaSwgbmlfa2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZuaV9jZmcsIGVwb25fbmksIG1hY19hZGRyZXNzKTsKKyAgICByYyA9IGJjbW9sdF9jZmdfZ2V0KGxpbmtfa2V5LT5kZXZpY2VfaWQsICZuaV9jZmcuaGRyKTsKKyAgICBpZiAoQkNNX0VSUl9PSyA9PSByYykKKyAgICB7CisgICAgICAgIGxpbmtfc3RhdGUtPmVwb25fbmlfbWFjX2FkZHIgPSBuaV9jZmcuZGF0YS5tYWNfYWRkcmVzczsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgRU9OX0xJTktfTE9HKEVSUk9SLCBsaW5rX2tleSwgIkZhaWxlZCB0byByZXRyaWV2ZSBFUE9OIE5JIE1BQyBhZGRyZXNzOiAlc1xuIiwgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICAgICAgYmNtb3NfZnJlZShsaW5rX3N0YXRlKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIGJjbW9zX3RpbWVyX3Bhcm0gdGltZXJfc3BlYyA9CisgICAgeworICAgICAgICAub3duZXIgICA9IEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfRU9OICsgbGlua19rZXktPmRldmljZV9pZCwKKyAgICAgICAgLmhhbmRsZXIgPSBfZW9uX29hbV90aW1lcl9leHBpcmUsCisgICAgICAgIC5kYXRhICAgID0gKGxvbmcpbGlua19zdGF0ZQorICAgIH07CisgICAgcmMgPSBiY21vc190aW1lcl9jcmVhdGUoJmxpbmtfc3RhdGUtPm9hbV90aW1lciwgJnRpbWVyX3NwZWMpOworICAgIGlmIChCQ01fRVJSX09LICE9IHJjKQorICAgIHsKKyAgICAgICAgRU9OX0xJTktfTE9HKEVSUk9SLCBsaW5rX2tleSwgIkZhaWxlZCB0byBjcmVhdGUgdGltZXI6ICVzXG4iLCBiY21vc19zdHJlcnJvcihyYykpOworICAgICAgICBiY21vc19mcmVlKGxpbmtfc3RhdGUpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgbGlua19zdGF0ZS0+bGlua19rZXkgPSAqbGlua19rZXk7CisgICAgbGlua19zdGF0ZS0+Y2FsbGJhY2sgPSBjYiA/IGNiIDogX2Vvbl9kZWZhdWx0X2NhbGxiYWNrX2ZuOworICAgIGxpbmtfc3RhdGUtPmNvbnRleHQgPSBjb250ZXh0OworICAgIGxpbmtfc3RhdGUtPmlzX2hlYXJ0YmVhdF9hdXRvc3RhcnQgPSBpc19oZWFydGJlYXRfYXV0b3N0YXJ0OworICAgIGxpbmtfc3RhdGUtPm9hbV9zZXQgPSBvYW1fc2V0OworICAgIGxpbmtfc3RhdGUtPm1heF9wZHVfc2l6ZSA9IDE1MzY7CisKKyAgICBSQl9JTlNFUlQobGlua19zdGF0ZV9tYXAsICZlb25fc3RhdGVbbGlua19rZXktPmRldmljZV9pZF0ubGlua19zdGF0ZV9tYXAsIGxpbmtfc3RhdGUpOworCisgICAgKnN0YXRlID0gbGlua19zdGF0ZTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgdm9pZCBfZW9uX3Rhc2tfcHJvY2Vzc19yeChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBjb25zdCBiY21vbHRfcHJveHlfcnggKnJ4KQoreworICAgIGVvbl9ldmVudCBldmVudCAgPSB7IC50eXBlID0gRU9OX0VWRU5UX1RZUEVfRlJBTUVfUlggfTsKKworICAgIGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfa2V5KiBlcG9uX2xpbmtfa2V5ID0gKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfa2V5KikocnggKyAxKTsKKyAgICBlb25fbGlua19rZXkgbGlua19rZXkgPSB7IC5kZXZpY2VfaWQgPSBkZXZpY2VfaWQsIC5saW5rID0gKmVwb25fbGlua19rZXkgfTsKKyAgICBlb25fbGlua19zdGF0ZSAqbGlua19zdGF0ZSA9IF9lb25fZmluZF9saW5rX3N0YXRlKCZsaW5rX2tleSk7CisKKyAgICBpZiAobGlua19zdGF0ZSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgRU9OX0xJTktfTE9HKERFQlVHLCAmbGlua19rZXksICJmb3VuZCBleGlzdGluZyBsaW5rXG4iKTsKKyAgICAgICAgY29uc3QgYmNtb2x0X3U4X2xpc3RfdTMyIGZyYW1lID0gKChjb25zdCBiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkKilyeCktPmRhdGEuZnJhbWU7CisgICAgICAgIGV2ZW50LmxpbmsgPSBsaW5rX3N0YXRlOworICAgICAgICBldmVudC5kYXRhLmZyYW1lX3J4LnBheWxvYWQgPSBmcmFtZS52YWw7CisgICAgICAgIGV2ZW50LmRhdGEuZnJhbWVfcngubGVuZ3RoICA9IGZyYW1lLmxlbjsKKyAgICAgICAgX2Vvbl9ldmVudF9kaXNwYXRjaCgmZXZlbnQpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBFT05fTElOS19MT0coREVCVUcsICZsaW5rX2tleSwgInJ4IG9uIHVua25vd24gbGlua1xuIik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBfZW9uX2hhbmRsZV9wcm94eV9yeChiY21vc19tb2R1bGVfaWQgbW9kdWxlX2lkLCBiY21vc19tc2cgKm9zX21zZykKK3sKKyAgICBlb25fdGFza19tc2cgKm1zZyA9IChlb25fdGFza19tc2cqKW9zX21zZzsKKworICAgIF9lb25fdGFza19wcm9jZXNzX3J4KG9zX21zZy0+aW5zdGFuY2UsIG1zZy0+ZGF0YS5wcm94eV9yeC5yeCk7CisKKyAgICBiY21vbHRfbXNnX2ZyZWUoJm1zZy0+ZGF0YS5wcm94eV9yeC5yeC0+aGRyKTsgLyogZnJlZSBjbG9uZWQgaW5kaWNhdGlvbiAqLworICAgIGJjbW9zX2ZyZWUob3NfbXNnKTsKK30KKworc3RhdGljIHZvaWQgX2Vvbl9oYW5kbGVfc3RhcnQoYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZCwgYmNtb3NfbXNnICpvc19tc2cpCit7CisgICAgZW9uX3Rhc2tfbXNnICptc2cgPSAoZW9uX3Rhc2tfbXNnKilvc19tc2c7CisgICAgZW9uX2xpbmtfa2V5IGxpbmtfa2V5ID0geyAuZGV2aWNlX2lkID0gb3NfbXNnLT5pbnN0YW5jZSwgLmxpbmsgPSBtc2ctPmRhdGEuc3RhcnQubGlua19rZXkgfTsKKyAgICBlb25fZXZlbnQgZXZlbnQgPSB7IC50eXBlID0gRU9OX0VWRU5UX1RZUEVfT0FNX05FR19TVEFSVCB9OworCisgICAgaWYgKEJDTV9FUlJfT0sgPT0gX2Vvbl9jcmVhdGVfbGlua19zdGF0ZSgKKyAgICAgICAgJmV2ZW50LmxpbmssCisgICAgICAgICZsaW5rX2tleSwKKyAgICAgICAgbXNnLT5kYXRhLnN0YXJ0Lm9hbV9zZXQsCisgICAgICAgIG1zZy0+ZGF0YS5zdGFydC5jYiwKKyAgICAgICAgbXNnLT5kYXRhLnN0YXJ0LmNvbnRleHQsCisgICAgICAgIG1zZy0+ZGF0YS5zdGFydC5pc19oZWFydGJlYXRfYXV0b3N0YXJ0KSkKKyAgICB7CisgICAgICAgIF9lb25fZXZlbnRfZGlzcGF0Y2goJmV2ZW50KTsKKyAgICB9CisKKyAgICBiY21vc19mcmVlKG9zX21zZyk7Cit9CisKK3N0YXRpYyB2b2lkIF9lb25faGFuZGxlX3N0b3AoYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZCwgYmNtb3NfbXNnICpvc19tc2cpCit7CisgICAgZW9uX3Rhc2tfbXNnICptc2cgPSAoZW9uX3Rhc2tfbXNnKilvc19tc2c7CisgICAgZW9uX2xpbmtfa2V5IGxpbmtfa2V5ID0geyAuZGV2aWNlX2lkID0gb3NfbXNnLT5pbnN0YW5jZSwgLmxpbmsgPSBtc2ctPmRhdGEuc3RvcC5saW5rX2tleSB9OworICAgIGVvbl9ldmVudCBldmVudCA9IHsgLnR5cGUgPSBFT05fRVZFTlRfVFlQRV9PQU1fTkVHX1NUT1AsIC5saW5rID0gX2Vvbl9maW5kX2xpbmtfc3RhdGUoJmxpbmtfa2V5KSB9OworCisgICAgaWYgKE5VTEwgIT0gZXZlbnQubGluaykKKyAgICB7CisgICAgICAgIF9lb25fZXZlbnRfZGlzcGF0Y2goJmV2ZW50KTsKKyAgICB9CisKKyAgICBiY21vc19mcmVlKG9zX21zZyk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfZW9uX2NtZF9zdGFydChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBlb25fdGFza19tc2dfZGF0YSBtc2dfZGF0YTsKKworICAgIG1zZ19kYXRhLnN0YXJ0Lmxpbmtfa2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpLT52YWx1ZS51bnVtYmVyOworICAgIG1zZ19kYXRhLnN0YXJ0Lmxpbmtfa2V5Lm1hY19hZGRyZXNzID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKS0+dmFsdWUubWFjOworICAgIG1zZ19kYXRhLnN0YXJ0Lm9hbV9zZXQgPSAoZW9uX29hbV9zZXRfaWQpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib2FtX3NldCIpLT52YWx1ZS5lbnVtX3ZhbDsKKyAgICBtc2dfZGF0YS5zdGFydC5jYiA9IE5VTEw7CisgICAgbXNnX2RhdGEuc3RhcnQuY29udGV4dCA9IE5VTEw7CisgICAgbXNnX2RhdGEuc3RhcnQuaXNfaGVhcnRiZWF0X2F1dG9zdGFydCA9IEJDTU9TX1RSVUU7CisKKyAgICByYyA9IF9lb25fc2VuZF9vc19tc2coY3VycmVudF9kZXZpY2UsIEJDTU9TX01TR19JRF9FT05fU1RBUlQsICZtc2dfZGF0YSk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBfZW9uX2NtZF9zdG9wKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgZW9uX3Rhc2tfbXNnX2RhdGEgbXNnX2RhdGE7CisKKyAgICBtc2dfZGF0YS5zdG9wLmxpbmtfa2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpLT52YWx1ZS51bnVtYmVyOworICAgIG1zZ19kYXRhLnN0b3AubGlua19rZXkubWFjX2FkZHJlc3MgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpLT52YWx1ZS5tYWM7CisKKyAgICByYyA9IF9lb25fc2VuZF9vc19tc2coY3VycmVudF9kZXZpY2UsIEJDTU9TX01TR19JRF9FT05fU1RPUCwgJm1zZ19kYXRhKTsKKworICAgIHJldHVybiByYzsKK30KKworCitzdGF0aWMgYmNtb3NfZXJybm8gX2Vvbl9jbWRfc2hvdygKKyAgICBiY21jbGlfc2Vzc2lvbiAgICAgICAgKnNlc3Npb24sCisgICAgY29uc3QgYmNtY2xpX2NtZF9wYXJtICBwYXJtW10sCisgICAgdWludDE2X3QgICAgICAgICAgICAgICBuX3Bhcm1zKQoreworICAgIGVvbl9saW5rX3N0YXRlKiAgIGxpbmtfc3RhdGU7CisgICAgYmNtb3NfYm9vbCAgICAgICAgICBub19saW5rcyA9IEJDTU9TX1RSVUU7CisKKyAgICBSQl9GT1JFQUNIKGxpbmtfc3RhdGUsIGxpbmtfc3RhdGVfbWFwLCAmZW9uX3N0YXRlW2N1cnJlbnRfZGV2aWNlXS5saW5rX3N0YXRlX21hcCkKKyAgICB7CisgICAgICAgIG5vX2xpbmtzID0gQkNNT1NfRkFMU0U7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLT4gICJMSU5LX0tFWV9GTVRfU1RSIiAgT0FNIHNldCAldSAgIHN0YXRlICUwNHhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJTktfS0VZX0RBVEEoJmxpbmtfc3RhdGUtPmxpbmtfa2V5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua19zdGF0ZS0+b2FtX3NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua19zdGF0ZS0+b2FtX3N0YXRlKTsKKyAgICB9CisgICAgaWYgKG5vX2xpbmtzKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIm5vIGxpbmtzXG4iKTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworCit2b2lkIGJjbW9sdF91c2VyX2FwcGxfZW9uX2NsaV9pbml0KGJjbWNsaV9lbnRyeSAqdG9wX2RpcikKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZGlyX25hbWUgPSAiZW9uIjsKKworICAgIGlmIChiY21jbGlfZGlyX2ZpbmQodG9wX2RpciwgZGlyX25hbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJjbWNsaV9lbnRyeSAqZGlyID0gYmNtY2xpX2Rpcl9hZGQodG9wX2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVQT04gT0FNIG5lZ290aWF0aW9uIGNvbW1hbmRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9BQ0NFU1NfQURNSU4sIE5VTEwpOworICAgIEJVR19PTihkaXIgPT0gTlVMTCk7CisKKyAgICBCQ01DTElfTUFLRV9DTURfTk9QQVJNKGRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaG93IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJTaG93IGN1cnJlbnQgRU9OIGNvbmZpZ3VyYXRpb24gYW5kIHN0YXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lb25fY21kX3Nob3cpOworCisgICAgQkNNQ0xJX01BS0VfQ01EKGRpciwKKyAgICAgICAgICAgICAgICAgICAgInN0YXJ0X29hbV9uZWdvdGlhdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICJTdGFydCBPQU0gbmVnb3RpYXRpb24gZm9yIGFuIEVQT04gbGluayIsCisgICAgICAgICAgICAgICAgICAgIF9lb25fY21kX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJlcG9uX25pIiwgIkVQT04gTkkiLCBCQ01DTElfUEFSTV9VTlVNQkVSLCBCQ01DTElfUEFSTV9GTEFHX05PTkUpLAorICAgICAgICAgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJtYWNfYWRkcmVzcyIsICJNQUMgYWRkcmVzcyIsIEJDTUNMSV9QQVJNX01BQywgQkNNQ0xJX1BBUk1fRkxBR19OT05FKSwKKyAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNKCJvYW1fc2V0IiwgIk9BTSBzZXQiLCBlb25fb2FtX3NldF9pZF90YWJsZSwgQkNNQ0xJX1BBUk1fRkxBR19OT05FKSk7CisKKworICAgIEJDTUNMSV9NQUtFX0NNRChkaXIsCisgICAgICAgICAgICAgICAgICAgICJzdG9wX29hbV9uZWdvdGlhdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICJTdG9wIGluIHByb2dyZXNzIE9BTSBuZWdvdGlhdGlvbiBmb3IgYW4gRVBPTiBsaW5rIiwKKyAgICAgICAgICAgICAgICAgICAgX2Vvbl9jbWRfc3RvcCwKKyAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiZXBvbl9uaSIsICJFUE9OIE5JIiwgQkNNQ0xJX1BBUk1fTlVNQkVSLCBCQ01DTElfUEFSTV9GTEFHX05PTkUpLAorICAgICAgICAgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJtYWNfYWRkcmVzcyIsICJNQUMgYWRkcmVzcyIsIEJDTUNMSV9QQVJNX01BQywgQkNNQ0xJX1BBUk1fRkxBR19OT05FKSApOworfQorCisKK3ZvaWQgYmNtb2x0X3VzZXJfYXBwbF9lb25faW5pdCh2b2lkKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgaWYgKGVwb25fb2FtX25lZ19ydW5uaW5nKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAoYmNtb2x0X2RldmlkIGRldmljZSA9IDA7IGRldmljZSA8IEJDTVRSX01BWF9PTFRTOyBkZXZpY2UrKykKKyAgICB7CisgICAgICAgIHJjID0gX2Vvbl9pbml0X3Rhc2soZGV2aWNlKTsKKyAgICAgICAgQlVHX09OKHJjICE9IEJDTV9FUlJfT0spOworCisgICAgICAgIHJjID0gX2Vvbl9pbml0X21vZHVsZShkZXZpY2UpOworICAgICAgICBCVUdfT04ocmMgIT0gQkNNX0VSUl9PSyk7CisKKyAgICAgICAgY2hhciBsb2dfbmFtZVtNQVhfREVWX0xPR19JRF9OQU1FXTsKKyAgICAgICAgc25wcmludGYobG9nX25hbWUsIHNpemVvZihsb2dfbmFtZSksICJ1c2VyX2FwcGxfZW9uJXUiLCBkZXZpY2UpOworICAgICAgICBlb25fc3RhdGVbZGV2aWNlXS5sb2dfaWQgPSBiY21fZGV2X2xvZ19pZF9yZWdpc3Rlcihsb2dfbmFtZSwgREVWX0xPR19MRVZFTF9JTkZPLCBERVZfTE9HX0lEX1RZUEVfQk9USCk7CisKKyAgICAgICAgYmNtb3NfbXNnX3JlZ2lzdGVyKAorICAgICAgICAgICAgQkNNT1NfTVNHX0lEX0VPTl9TVEFSVCwKKyAgICAgICAgICAgIGRldmljZSwKKyAgICAgICAgICAgIEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfRU9OICsgZGV2aWNlLAorICAgICAgICAgICAgX2Vvbl9oYW5kbGVfc3RhcnQpOworICAgICAgICBiY21vc19tc2dfcmVnaXN0ZXIoCisgICAgICAgICAgICBCQ01PU19NU0dfSURfRU9OX1NUT1AsCisgICAgICAgICAgICBkZXZpY2UsCisgICAgICAgICAgICBCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX0VPTiArIGRldmljZSwKKyAgICAgICAgICAgIF9lb25faGFuZGxlX3N0b3ApOworICAgICAgICBiY21vc19tc2dfcmVnaXN0ZXIoCisgICAgICAgICAgICBCQ01PU19NU0dfSURfRU9OX1BST1hZX1JYLAorICAgICAgICAgICAgZGV2aWNlLAorICAgICAgICAgICAgQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9FT04gKyBkZXZpY2UsCisgICAgICAgICAgICBfZW9uX2hhbmRsZV9wcm94eV9yeCk7CisKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgc3RhdGUgbWFwCisgICAgICAgIFJCX0lOSVQoJmVvbl9zdGF0ZVtkZXZpY2VdLmxpbmtfc3RhdGVfbWFwKTsKKyAgICB9CisKKyAgICBlcG9uX29hbV9uZWdfcnVubmluZyA9IEJDTU9TX1RSVUU7Cit9CisKKy8vIHB1YmxpYyBpbmRpY2F0aW9uIGhhbmRsZXIgaW50ZXJmYWNlIC0tIGNhbGxlZCBpbiB0cmFuc3BvcnQgbGF5ZXIgY29udGV4dAorYmNtb3NfZXJybm8gYmNtb2x0X3VzZXJfYXBwbF9lb25fcHJvY2Vzc19yeChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21vbHRfcHJveHlfcnggKnJ4KQoreworICAgICBiY21vc19lcnJubyByYzsKKyAgICAgZW9uX3Rhc2tfbXNnX2RhdGEgbXNnX2RhdGEgPSB7fTsKKworICAgICAvKiBOb3QgcnVubmluZyAtLT4gc2lsZW50bHkgaWdub3JlICAqLworICAgICBpZiAoIWVwb25fb2FtX25lZ19ydW5uaW5nKQorICAgICB7CisgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgfQorCisgICAgIC8qIE5vdCBvdXIgbWVzc2FnZSAtLT4gc2lsZW50eSBpZ25vcmUgKi8KKyAgICAgaWYgKCAoQkNNT0xUX09CSl9JRF9FUE9OX0xJTksgIT0gcngtPmhkci5vYmpfdHlwZSkgfHwKKyAgICAgICAgICAoQkNNT0xUX0VQT05fTElOS19QUk9YWV9SWF9JRF9GUkFNRV9DQVBUVVJFRCAhPSByeC0+aGRyLnN1Ymdyb3VwKSApCisgICAgIHsKKyAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICB9CisKKyAgICAgLyogVGhpcyBpcyBzb21ldGhpbmcgdGhpcyBhcHBsaWNhdGlvbiBkb2VzIGNhcmUgYWJvdXQgLSBzbyBjbG9uZSB0aGUgbWVzc2FnZSBpbnRvCisgICAgICAgIG5ld2x5LWFsbG9jYXRlZCBtZW1vcnkgc28gd2UgY2FuIGhhbmRsZSBpdCBhZnRlciB0aGUgb3JpZ2luYWwgbWVzc2FnZSBoYXMgYmVlbiBmcmVlZCAqLworICAgICByYyA9IGJjbW9sdF9tc2dfY2xvbmUoKGJjbW9sdF9tc2cqKikmbXNnX2RhdGEucHJveHlfcngucngsICZyeC0+aGRyKTsKKyAgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgIHsKKyAgICAgICAgIEVPTl9MT0coRVJST1IsIGRldmljZV9pZCwgIk1lc3NhZ2UgY2xvbmUgZmFpbGVkOiAlc1xuIiwgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICAgICAgIHJldHVybiByYzsKKyAgICAgfQorCisgICAgIHJjID0gX2Vvbl9zZW5kX29zX21zZyhkZXZpY2VfaWQsIEJDTU9TX01TR19JRF9FT05fUFJPWFlfUlgsICZtc2dfZGF0YSk7CisgICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgICB7CisgICAgICAgICBiY21vbHRfbXNnX2ZyZWUoJm1zZ19kYXRhLnByb3h5X3J4LnJ4LT5oZHIpOworICAgICB9CisgICAgIHJldHVybiByYzsKK30KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lb24vYmNtb2x0X2Vvbi5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lb24vYmNtb2x0X2Vvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5M2ZjZDEKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vvbi9iY21vbHRfZW9uLmgKQEAgLTAsMCArMSw5OCBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisqLworCisjaWZuZGVmIF9CQ01PTFRfRU9OX0hfCisjZGVmaW5lIF9CQ01PTFRfRU9OX0hfCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21vbHRfYXBpLmg+CisjaW5jbHVkZSA8YmNtb2x0X21vZGVsX3R5cGVzLmg+CisjaW5jbHVkZSA8YmNtY2xpLmg+CisKKy8qIHVuaXF1ZWx5IGlkZW50aWZpZXMgc3BlY2lmaWMgRVBPTiBsaW5rcyB1bmRlciBtYW5hZ2VtZW50IGJ5IHRoaXMgYXBwbGljYXRpb24gKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgIGJjbW9sdF9kZXZpZCAgICAgICAgICBkZXZpY2VfaWQ7CisgICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5ICBsaW5rOworfSBlb25fbGlua19rZXk7CisKK3R5cGVkZWYgZW51bQoreworICAgICBFT05fT0FNX1NFVF9JRF9EUE9FLAorICAgICBFT05fT0FNX1NFVF9JRF9CUkNNLAorICAgICBFT05fT0FNX1NFVF9JRF9DVEMsCisKKyAgICAgRU9OX09BTV9TRVRfSURfQ09VTlQKK30gZW9uX29hbV9zZXRfaWQ7CisKKy8qIHNpZ25hdHVyZSBvZiBvcHRpb25hbCBjYWxsYmFjayBmdW5jdGlvbiB1c2VkIHRvIHJlcG9ydCBvdXRjb21lcyBvZiBPQU0gbmVnb3RpYXRpb25zICovCit0eXBlZGVmIHZvaWQgKCpiY21vbHRfZW9uX3Jlc3VsdF9jYikodm9pZCAqY29udGV4dCwgY29uc3QgZW9uX2xpbmtfa2V5ICpsaW5rX2tleSwgYmNtb3NfZXJybm8gcmVzdWx0KTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBsaW5rX2tleTsKKyAgICBlb25fb2FtX3NldF9pZCBvYW1fc2V0OworICAgIGJjbW9sdF9lb25fcmVzdWx0X2NiIGNiOworICAgIHZvaWQgKmNvbnRleHQ7CisgICAgYmNtb3NfYm9vbCBpc19oZWFydGJlYXRfYXV0b3N0YXJ0OworfSBlb25fdGFza19zdGFydF9kYXRhOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGxpbmtfa2V5OworfSBlb25fdGFza19zdG9wX2RhdGE7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgYmNtb2x0X3Byb3h5X3J4ICpyeDsKK30gZW9uX3Rhc2tfcHJveHlfcnhfZGF0YTsKKwordHlwZWRlZiB1bmlvbgoreworICAgIGVvbl90YXNrX3N0YXJ0X2RhdGEgc3RhcnQ7CisgICAgZW9uX3Rhc2tfc3RvcF9kYXRhIHN0b3A7CisgICAgZW9uX3Rhc2tfcHJveHlfcnhfZGF0YSBwcm94eV9yeDsKK30gZW9uX3Rhc2tfbXNnX2RhdGE7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgYmNtb3NfbXNnIG9zX21zZzsKKyAgICBlb25fdGFza19tc2dfZGF0YSBkYXRhOworfSBlb25fdGFza19tc2c7CisKKy8vIGluaXRpYWxpemUgdGhlIEVQT04gT0FNIG5lZ290aWF0aW9uIGFwcGxpY2F0aW9uIChzaG91bGQgYmUgY2FsbGVkIGFzIHBhcnQgb2YgdXNlciBhcHBsaWNhdGlvbiBzdGFydHVwKQorZXh0ZXJuIHZvaWQgYmNtb2x0X3VzZXJfYXBwbF9lb25faW5pdCh2b2lkKTsKKworLy8gcHJvY2VzcyBhIHByb3h5IHJ4CitiY21vc19lcnJubyBiY21vbHRfdXNlcl9hcHBsX2Vvbl9wcm9jZXNzX3J4KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbW9sdF9wcm94eV9yeCAqcHJveHlfcngpOworCisvLyBpbml0aWFsaXplIEVPTiBDTEkKK3ZvaWQgYmNtb2x0X3VzZXJfYXBwbF9lb25fY2xpX2luaXQoYmNtY2xpX2VudHJ5ICp0b3BfZGlyKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vvbi9iY21vbHRfZW9uX3ByaXZhdGUuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZW9uL2JjbW9sdF9lb25fcHJpdmF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MGI0NTMKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vvbi9iY21vbHRfZW9uX3ByaXZhdGUuaApAQCAtMCwwICsxLDkyIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyovCisKKyNpZm5kZWYgX0JDTU9MVF9FT05fUFJJVkFURV9IXworI2RlZmluZSBfQkNNT0xUX0VPTl9QUklWQVRFX0hfCisKKy8qIHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eAorICAgeCBUaGlzIGZpbGUgaXMgZm9yIGludGVybmFsIHVzZSB3aXRoaW4gdGhlIEVQT04gT0FNIG5lZ290aWF0aW9uIGFwcGxpY2F0aW9uLiB4CisgICB4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgKKyAgIHggT3V0c2lkZSBjb2RlIHNob3VsZCBub3QgcmVmZXIgdG8gYW55dGhpbmcgZGVmaW5lZCBvciBkZWNsYXJlZCBoZXJlaW4hICAgICAgeAorICAgeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4ICovCisKKyNpbmNsdWRlICJiY21vbHRfZW9uLmgiIC8qIHRoZSBwcml2YXRlIGludGVyZmFjZSBleHRlbmRzIHRoZSBwdWJsaWMgaW50ZXJmYWNlICovCisjaW5jbHVkZSAiYmNtb2x0X2Vwb25fb2FtX3R5cGVzLmgiCisjaW5jbHVkZSAiYmNtX2Rldl9sb2cuaCIKKyNpbmNsdWRlICJiY21vbHRfdXRpbHMuaCIKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50OF90KiBwYXlsb2FkOyAvKiBwYXlsb2FkIGJ5dGVzIGluIFtEQSxGQ1MpICovCisgICAgdWludDE2X3QgbGVuZ3RoOyAvKiBmcmFtZSBsZW5ndGggZnJvbSBEQSB0byBqdXN0IGJlZm9yZSBGQ1MgKi8KK30gZW9uX2ZyYW1lX2RhdGE7CisKKy8qIG1hcCBjb250YWluaW5nIHN0YXRlIG9mIGFsbCBFUE9OIGxpbmtzIHdpdGggT0FNIG5lZ290aWF0aW9uIHVuZGVyd2F5IG9yIGNvbXBsZXRlZCAqLwordHlwZWRlZiBzdHJ1Y3QgZW9uX2xpbmtfc3RhdGUgZW9uX2xpbmtfc3RhdGU7Cit0eXBlZGVmIHN0cnVjdCBsaW5rX3N0YXRlX21hcCBsaW5rX3N0YXRlX21hcDsKK1JCX0hFQUQobGlua19zdGF0ZV9tYXAsIGVvbl9saW5rX3N0YXRlKTsKKworc3RydWN0IGVvbl9saW5rX3N0YXRlCit7CisgICAgZW9uX2xpbmtfa2V5ICAgICAgICAgICAgICAgICBsaW5rX2tleTsgICAgICAgICAgICAgICAgICAvKiBnbG9iYWxseSB1bmlxdWUgb3BhcXVlIGVudGl0eSBpZCAqLworICAgIGJjbW9zX3RpbWVyICAgICAgICAgICAgICAgICAgb2FtX3RpbWVyOyAgICAgICAgICAgICAgICAgLyogdGltZXIgdXNlZCB3aGVuIGF3YWl0aW5nIG9hbSByZXNwb25zZXMgKi8KKyAgICBlb25fb2FtX3NldF9pZCAgICAgICAgICAgICAgIG9hbV9zZXQ7ICAgICAgICAgICAgICAgICAgIC8qIE9BTSBzZXQgYXBwbGljYWJsZSB0byB0aGUgbGluayAqLworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fZmxhZ3MgICAgb2FtX3N0YXRlOyAgICAgICAgICAgICAgICAgLyogT0FNIGxpbmsgbmVnb3RpYXRpb24gc3RhdGUgKi8KKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgIHJldmlzaW9uOyAgICAgICAgICAgICAgICAgIC8qIExvY2FsIHJldmlzaW9uICovCisgICAgdWludDE2X3QgICAgICAgICAgICAgICAgICAgICBtYXhfcGR1X3NpemU7ICAgICAgICAgICAgICAvKiBtYXggUERVIHNpemUgKi8KKyAgICBiY21vbHRfZW9uX3Jlc3VsdF9jYiAgICAgICAgIGNhbGxiYWNrOyAgICAgICAgICAgICAgICAgIC8qIGNhbGxiYWNrIHdoZW4gbmVnb3RpYXRpb24gaXMgY29tcGxldGUgKi8KKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0OyAgICAgICAgICAgICAgICAgIC8qIGNvbnRleHQgZm9yIHRoZSBhYm92ZSBjYWxsYmFjayBmdW5jdGlvbiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mbyByZW1vdGVfaW5mbzsgICAgICAgICAgLyogcHJldmlvdXMgVExWIHJlY2VpdmVkIGZyb20gdGhlIHJlbW90ZSAqLworICAgIGJjbW9zX21hY19hZGRyZXNzICAgICAgICAgICAgZXBvbl9uaV9tYWNfYWRkcjsgICAgICAgICAgLyogTUFDIGFkZHJlc3MgdG8gdXNlIGZvciBTQSBvZiBlZ3Jlc3MgT0FNIGZyYW1lcyAqLworICAgIGVvbl9mcmFtZV9kYXRhICAgICAgICAgICAgICAgcng7ICAgICAgICAgICAgICAgICAgICAgICAgLyogRmluYWwgcmVjZWl2ZWQgT0FNICovCisgICAgZW9uX2ZyYW1lX2RhdGEgICAgICAgICAgICAgICB0eDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaW5hbCBzZW50IE9BTSAqLworICAgIGJjbW9zX2Jvb2wgICAgICAgICAgICAgICAgICAgaXNfaGVhcnRiZWF0X2F1dG9zdGFydDsgICAgLyogc3RhcnQgaGVhcnRiZWF0IHVwb24gc3VjY2Vzc2Z1bCBuZWdvdGlhdGlvbiBjb21wbGV0aW9uICovCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICpvcmdfc3BlY19zdGF0ZTsgICAgICAgICAgICAvKiBTdGF0ZSBzcGVjaWZpYyB0byB0aGUgc2VsZWN0ZWQgT0FNIHNldCAqLworICAgIFJCX0VOVFJZKGVvbl9saW5rX3N0YXRlKSAgICAgcmJfZW50cnk7Cit9OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGJjbW9zX3Rhc2sgdGFzazsKKyAgICBjaGFyIHRhc2tfbmFtZVtNQVhfVEFTS19OQU1FX1NJWkVdOworICAgIGNoYXIgbXNnX3F1ZXVlX25hbWVbTUFYX01TR19RVUVVRV9OQU1FX1NJWkVdOworICAgIGRldl9sb2dfaWQgbG9nX2lkOworICAgIGxpbmtfc3RhdGVfbWFwIGxpbmtfc3RhdGVfbWFwOworfSBlb25fZ2xvYmFsX3N0YXRlOworCisjZGVmaW5lIExJTktfS0VZX0ZNVF9TVFIgIlBPTiAldSwgIkJDTU9TX01BQ0FERFJfRk1UX1NUUgorI2RlZmluZSBMSU5LX0tFWV9EQVRBKGxrZXkpIChsa2V5KS0+bGluay5lcG9uX25pLCBCQ01PU19NQUNBRERSX1BBUkFNUygmKGxrZXkpLT5saW5rLm1hY19hZGRyZXNzKQorCisjZGVmaW5lIEVPTl9MT0cobGV2ZWwsIGRldmljZSwgZm9ybWF0LCBhcmdzLi4uKSBCQ01fTE9HKGxldmVsLCBlb25fc3RhdGVbZGV2aWNlXS5sb2dfaWQsIGZvcm1hdCwgIyNhcmdzKQorI2RlZmluZSBFT05fTElOS19MT0cobGV2ZWwsIGxpbmtfa2V5LCBmbXQsIGFyZ3MuLi4pIFwKKyAgICBCQ01fTE9HKGxldmVsLCBlb25fc3RhdGVbKGxpbmtfa2V5KS0+ZGV2aWNlX2lkXS5sb2dfaWQsIExJTktfS0VZX0ZNVF9TVFIiOiAiZm10LCBMSU5LX0tFWV9EQVRBKGxpbmtfa2V5KSwgIyNhcmdzKQorCitleHRlcm4gZW9uX2dsb2JhbF9zdGF0ZSBlb25fc3RhdGVbQkNNVFJfTUFYX09MVFNdOworCisjZW5kaWYgLy8gX0JDTU9MVF9FT05fUFJJVkFURV9IXwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lb24vb2FtX3NldHMvYnJjbS9icmNtLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vvbi9vYW1fc2V0cy9icmNtL2JyY20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjE3MGY2Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lb24vb2FtX3NldHMvYnJjbS9icmNtLmMKQEAgLTAsMCArMSwxMDggQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorKi8KKworLyogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBwaWVjZXMgb2YgdGhlIE9BTSBuZWdvdGlhdGlvbiBzdGF0ZSBtYWNoaW5lIHRoYXQgYXJlIHNwZWNpZmljIHRvIEJSQ00gT0FNLiAqLworCisjaW5jbHVkZSAiYmNtb2x0X2Vvbl9wcml2YXRlLmgiCisjaW5jbHVkZSAiLi4vb2FtX2NvbW1vbi5oIgorI2luY2x1ZGUgImJyY20uaCIKKworLyogT3JnIHNwZWNpZmljIFRMViB0byBzZW5kIHRvIHRoZSBPTlUgKi8KK3N0YXRpYyBjb25zdCBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2luZm8gYnJjbV90eF90bHYgPQoreworICAgIC5vdWkgPSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfVEVLLAorICAgIC51ID0KKyAgICB7CisgICAgICAgIC50ZWsgPQorICAgICAgICB7CisgICAgICAgICAgICAudGx2cyA9CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLnR5cGUgPSBCQ01PTFRfRVBPTl9PQU1fVEVLX0lORk9fVExWX1RZUEVfRVhURU5TSU9OX1NVUFBPUlQsCisgICAgICAgICAgICAgICAgLnUgPQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLmV4dGVuc2lvbl9zdXBwb3J0ID0KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLnZlcnNpb24gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgLnJlcG9ydF9tb2RlID0gQkNNT0xUX0VQT05fT0FNX1RFS19SRVBPUlRfTU9ERVNfVEVLTk9WVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAucHJlZmVycmVkX3JlcG9ydF9tb2RlID0gQkNNT0xUX0VQT05fT0FNX1RFS19SRVBPUlRfTU9ERVNfVEVLTk9WVVMKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK307CisKK3ZvaWQgYnJjbV90eF9hZGRfdGx2KGVvbl9saW5rX3N0YXRlICpsaW5rX3N0YXRlLCBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50ICpvYW0pCit7CisgICAgaWYgKExPQ0FMX1NUQUJMRV9SRU1PVEVfU1RBQkxFID09IGxpbmtfc3RhdGUtPm9hbV9zdGF0ZSkKKyAgICB7CisgICAgICAgIG9hbS0+dS5pbmZvLnRsdnNbb2FtLT51LmluZm8udGx2c19jb3VudF0udHlwZSA9IEJDTU9MVF9FUE9OX09BTV9JTkZPX1RMVl9UWVBFX09SR0FOSVpBVElPTl9TUEVDSUZJQzsKKyAgICAgICAgb2FtLT51LmluZm8udGx2c1tvYW0tPnUuaW5mby50bHZzX2NvdW50XS51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZSA9IGJyY21fdHhfdGx2OworICAgICAgICBvYW0tPnUuaW5mby50bHZzX2NvdW50Kys7CisgICAgfQorfQorCit2b2lkIGJyY21fcnhfdGx2KAorICAgIGVvbl9saW5rX3N0YXRlICpsaW5rX3N0YXRlLAorICAgIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mbyAqb3JnX3NwZWMsCisgICAgYmNtb3NfZXJybm8gKnJjKQoreworICAgIGlmIChsaW5rX3N0YXRlLT5vYW1fc3RhdGUgPT0gTE9DQUxfU1RBQkxFX1JFTU9URV9TVEFCTEUpCisgICAgeworICAgICAgICBpZiAoKE5VTEwgPT0gb3JnX3NwZWMpIHx8CisgICAgICAgICAgICAoQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1RFSyAhPSBvcmdfc3BlYy0+b3VpKSB8fAorICAgICAgICAgICAgKEJDTU9MVF9FUE9OX09BTV9URUtfSU5GT19UTFZfVFlQRV9FWFRFTlNJT05fU1VQUE9SVCAhPSBvcmdfc3BlYy0+dS50ZWsudGx2cy50eXBlKSkKKyAgICAgICAgeworICAgICAgICAgICAgRU9OX0xJTktfTE9HKElORk8sICZsaW5rX3N0YXRlLT5saW5rX2tleSwgIkRpZG4ndCBnZXQgQlJDTSBUTFZcbiIpOworICAgICAgICAgICAgKnJjID0gQkNNX0VSUl9PTlVfRVJSX1JFU1A7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKDAgIT0gb3JnX3NwZWMtPnUudGVrLnRsdnMudS5leHRlbnNpb25fc3VwcG9ydC52ZXJzaW9uKSB8fAorICAgICAgICAgICAgICAgICgwID09CisgICAgICAgICAgICAgICAgIChCQ01PTFRfRVBPTl9PQU1fVEVLX1JFUE9SVF9NT0RFU19URUtOT1ZVUyAmIG9yZ19zcGVjLT51LnRlay50bHZzLnUuZXh0ZW5zaW9uX3N1cHBvcnQucmVwb3J0X21vZGUpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFT05fTElOS19MT0coCisgICAgICAgICAgICAgICAgICAgIElORk8sICZsaW5rX3N0YXRlLT5saW5rX2tleSwgIkJSQ00gVExWIGNvbnRhaW5lZCBiYWQgaW5mbzogdmVyc2lvbiAldSBycHQgbW9kZXMgJTAyeFxuIiwKKyAgICAgICAgICAgICAgICAgICAgb3JnX3NwZWMtPnUudGVrLnRsdnMudS5leHRlbnNpb25fc3VwcG9ydC52ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICBvcmdfc3BlYy0+dS50ZWsudGx2cy51LmV4dGVuc2lvbl9zdXBwb3J0LnJlcG9ydF9tb2RlKTsKKyAgICAgICAgICAgICAgICAqcmMgPSBCQ01fRVJSX05PVF9TVVBQT1JURUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKE5VTEwgIT0gb3JnX3NwZWMpCisgICAgICAgIHsKKyAgICAgICAgICAgIEVPTl9MSU5LX0xPRyhJTkZPLCAmbGlua19zdGF0ZS0+bGlua19rZXksICJHb3QgdW5leHBlY3RlZCBvcmdhbml6YXRpb24gc3BlY2lmaWMgVExWXG4iKTsKKyAgICAgICAgICAgICpyYyA9IEJDTV9FUlJfT05VX0VSUl9SRVNQOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vvbi9vYW1fc2V0cy9icmNtL2JyY20uaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZW9uL29hbV9zZXRzL2JyY20vYnJjbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0Yzg4NzgKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vvbi9vYW1fc2V0cy9icmNtL2JyY20uaApAQCAtMCwwICsxLDQxIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyovCisKKyNpZm5kZWYgX0JDTU9MVF9FT05fQlJDTV9IXworI2RlZmluZSBfQkNNT0xUX0VPTl9CUkNNX0hfCisKK3ZvaWQgYnJjbV90eF9hZGRfdGx2KGVvbl9saW5rX3N0YXRlICpsaW5rX3N0YXRlLCBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50ICpvYW0pOworCit2b2lkIGJyY21fcnhfdGx2KAorICAgIGVvbl9saW5rX3N0YXRlICpsaW5rX3N0YXRlLAorICAgIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mbyAqb3JnX3NwZWMsCisgICAgYmNtb3NfZXJybm8gKnJjKTsKKworI2VuZGlmIC8vIF9CQ01PTFRfRU9OX0JSQ01fSF8KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lb24vb2FtX3NldHMvY3RjL2N0Yy5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lb24vb2FtX3NldHMvY3RjL2N0Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2OGM4YjkKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vvbi9vYW1fc2V0cy9jdGMvY3RjLmMKQEAgLTAsMCArMSwyMTIgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorKi8KKworLyogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBwaWVjZXMgb2YgdGhlIE9BTSBuZWdvdGlhdGlvbiBzdGF0ZSBtYWNoaW5lIHRoYXQgYXJlIHNwZWNpZmljIHRvIENUQyBPQU0uICovCisKKyNpbmNsdWRlICJiY21vbHRfZW9uX3ByaXZhdGUuaCIKKyNpbmNsdWRlICIuLi9vYW1fY29tbW9uLmgiCisjaW5jbHVkZSAiY3RjLmgiCisKKyNkZWZpbmUgQ1RDX0VYVEVOU0lPTl9TVVBQT1JUIDB4MQorI2RlZmluZSBDVENfUFJFRkVSUkVEX1ZFUlNJT04gMHgzMAorCit0eXBlZGVmIGVudW0KK3sKKyAgICBDVENfTkVHX0FEVkVSVElTSU5HLAorICAgIENUQ19ORUdfQ09ORklSTUlORywKKyAgICBDVENfTkVHX0RPTkUKK30gY3RjX25lZ19zdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBjdGNfbmVnX3N0YXRlIHN0YXRlOworICAgIHVpbnQ4X3Qgc2VsZWN0ZWRfdmVyc2lvbjsKK30gY3RjX3N0YXRlOworCitzdGF0aWMgYmNtb2x0X2Vwb25fb2FtX2N0Y19vdWlfdmVyc2lvbl9wYWlyIGN0Y19hZHZlcnRpc2VkX3ZlcnNpb25zW10gPQoreworICAgIHsgLm91aSA9IEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9DVEMsIC52ZXJzaW9uID0gMHgzMCB9LAorICAgIHsgLm91aSA9IEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9DVEMsIC52ZXJzaW9uID0gMHgyMSB9LAorICAgIHsgLm91aSA9IEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9DVEMsIC52ZXJzaW9uID0gMHgyMCB9LAorICAgIHsgLm91aSA9IEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9DVEMsIC52ZXJzaW9uID0gMHgxMyB9LAorICAgIHsgLm91aSA9IEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9DVEMsIC52ZXJzaW9uID0gMHgwMSB9Cit9OworCisvKiBPcmcgc3BlY2lmaWMgVExWIHRvIHNlbmQgdG8gdGhlIE9OVSAqLworc3RhdGljIGNvbnN0IGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mbyBjdGNfdHhfYWR2ZXJ0aXNlX3RsdiA9Cit7CisgICAgLm91aSA9IEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9DVEMsCisgICAgLnUgPQorICAgIHsKKyAgICAgICAgLmN0YyA9CisgICAgICAgIHsKKyAgICAgICAgICAgIC5leHRlbnNpb25fc3VwcG9ydCA9IENUQ19FWFRFTlNJT05fU1VQUE9SVCwKKyAgICAgICAgICAgIC52ZXJzaW9uID0gQ1RDX1BSRUZFUlJFRF9WRVJTSU9OLAorICAgICAgICAgICAgLnN1cHBfdmVyc2lvbl9jb3VudCA9IE5VTV9FTEVNKGN0Y19hZHZlcnRpc2VkX3ZlcnNpb25zKSwKKyAgICAgICAgICAgIC5zdXBwX3ZlcnNpb24gPSBjdGNfYWR2ZXJ0aXNlZF92ZXJzaW9ucworICAgICAgICB9CisgICAgfQorfTsKKwordm9pZCBjdGNfdHhfYWRkX3Rsdihlb25fbGlua19zdGF0ZSAqbGlua19zdGF0ZSwgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudCAqb2FtKQoreworICAgIGN0Y19zdGF0ZSAqY3RjID0gbGlua19zdGF0ZS0+b3JnX3NwZWNfc3RhdGU7CisKKyAgICBpZiAoY3RjICE9IE5VTEwpCisgICAgeworICAgICAgICBzd2l0Y2ggKGN0Yy0+c3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQ1RDX05FR19BRFZFUlRJU0lORzoKKyAgICAgICAgICAgICAgICBvYW0tPnUuaW5mby50bHZzW29hbS0+dS5pbmZvLnRsdnNfY291bnRdLnR5cGUgPSBCQ01PTFRfRVBPTl9PQU1fSU5GT19UTFZfVFlQRV9PUkdBTklaQVRJT05fU1BFQ0lGSUM7CisgICAgICAgICAgICAgICAgb2FtLT51LmluZm8udGx2c1tvYW0tPnUuaW5mby50bHZzX2NvdW50XS51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZSA9IGN0Y190eF9hZHZlcnRpc2VfdGx2OworICAgICAgICAgICAgICAgIG9hbS0+dS5pbmZvLnRsdnNfY291bnQrKzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ1RDX05FR19DT05GSVJNSU5HOgorICAgICAgICAgICAgICAgIG9hbS0+dS5pbmZvLnRsdnNbb2FtLT51LmluZm8udGx2c19jb3VudF0udHlwZSA9IEJDTU9MVF9FUE9OX09BTV9JTkZPX1RMVl9UWVBFX09SR0FOSVpBVElPTl9TUEVDSUZJQzsKKyAgICAgICAgICAgICAgICBvYW0tPnUuaW5mby50bHZzW29hbS0+dS5pbmZvLnRsdnNfY291bnRdLnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLm91aSA9CisgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9DVEM7CisgICAgICAgICAgICAgICAgb2FtLT51LmluZm8udGx2c1tvYW0tPnUuaW5mby50bHZzX2NvdW50XS51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmN0Yy5leHRlbnNpb25fc3VwcG9ydCA9CisgICAgICAgICAgICAgICAgICAgIENUQ19FWFRFTlNJT05fU1VQUE9SVDsKKyAgICAgICAgICAgICAgICBvYW0tPnUuaW5mby50bHZzW29hbS0+dS5pbmZvLnRsdnNfY291bnRdLnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLnUuY3RjLnZlcnNpb24gPQorICAgICAgICAgICAgICAgICAgICBjdGMtPnNlbGVjdGVkX3ZlcnNpb247CisgICAgICAgICAgICAgICAgb2FtLT51LmluZm8udGx2c1tvYW0tPnUuaW5mby50bHZzX2NvdW50XS51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmN0Yy5zdXBwX3ZlcnNpb25fY291bnQgPSAwOworICAgICAgICAgICAgICAgIG9hbS0+dS5pbmZvLnRsdnNbb2FtLT51LmluZm8udGx2c19jb3VudF0udS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5jdGMuc3VwcF92ZXJzaW9uID0gTlVMTDsKKyAgICAgICAgICAgICAgICBvYW0tPnUuaW5mby50bHZzX2NvdW50Kys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENUQ19ORUdfRE9ORToKKyAgICAgICAgICAgICAgICBicmVhazsgLyogZG9uJ3QgYWRkIGEgVExWICovCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEVPTl9MSU5LX0xPRyhFUlJPUiwgJmxpbmtfc3RhdGUtPmxpbmtfa2V5LCAiVW5rbm93biBDVEMgc3RhdGUgJWRcbiIsIGN0Yy0+c3RhdGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIGN0Y19yeF90bHYoCisgICAgZW9uX2xpbmtfc3RhdGUgKmxpbmtfc3RhdGUsCisgICAgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19pbmZvICpvcmdfc3BlYywKKyAgICBiY21vc19lcnJubyAqcmMpCit7CisgICAgKnJjID0gQkNNX0VSUl9JTl9QUk9HUkVTUzsKKworICAgIGlmIChsaW5rX3N0YXRlLT5vcmdfc3BlY19zdGF0ZSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgY3RjX3N0YXRlICpjdGMgPSBsaW5rX3N0YXRlLT5vcmdfc3BlY19zdGF0ZTsKKworICAgICAgICBzd2l0Y2ggKGN0Yy0+c3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQ1RDX05FR19BRFZFUlRJU0lORzoKKyAgICAgICAgICAgICAgICBpZiAoKE5VTEwgPT0gb3JnX3NwZWMpIHx8IChCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQ1RDICE9IG9yZ19zcGVjLT5vdWkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRU9OX0xJTktfTE9HKElORk8sICZsaW5rX3N0YXRlLT5saW5rX2tleSwgIkRpZG4ndCBnZXQgQ1RDIGFkdmVydGlzZSBUTFZcbiIpOworICAgICAgICAgICAgICAgICAgICAqcmMgPSBCQ01fRVJSX09OVV9FUlJfUkVTUDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogZmluZCBoaWdoZXN0IGNvbW1vbiB2ZXJzaW9uICovCisgICAgICAgICAgICAgICAgICAgIGN0Yy0+c2VsZWN0ZWRfdmVyc2lvbiA9IDA7CisgICAgICAgICAgICAgICAgICAgIGZvciAodWludDhfdCBpID0gMDsgaSA8IG9yZ19zcGVjLT51LmN0Yy5zdXBwX3ZlcnNpb25fY291bnQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50OF90IGogPSAwOyBqIDwgTlVNX0VMRU0oY3RjX2FkdmVydGlzZWRfdmVyc2lvbnMpOyBqKyspCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChvcmdfc3BlYy0+dS5jdGMuc3VwcF92ZXJzaW9uW2ldLm91aSA9PSBjdGNfYWR2ZXJ0aXNlZF92ZXJzaW9uc1tqXS5vdWkpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcmdfc3BlYy0+dS5jdGMuc3VwcF92ZXJzaW9uW2ldLnZlcnNpb24gPT0gY3RjX2FkdmVydGlzZWRfdmVyc2lvbnNbal0udmVyc2lvbikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3RjX2FkdmVydGlzZWRfdmVyc2lvbnNbal0udmVyc2lvbiA+IGN0Yy0+c2VsZWN0ZWRfdmVyc2lvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RjLT5zZWxlY3RlZF92ZXJzaW9uID0gY3RjX2FkdmVydGlzZWRfdmVyc2lvbnNbal0udmVyc2lvbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoY3RjLT5zZWxlY3RlZF92ZXJzaW9uID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpyYyA9IEJDTV9FUlJfTk9UX1NVUFBPUlRFRDsgLyogbm8gY29tbW9uIHZlcnNpb24gZm91bmQgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN0Yy0+c3RhdGUgPSBDVENfTkVHX0NPTkZJUk1JTkc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENUQ19ORUdfQ09ORklSTUlORzoKKyAgICAgICAgICAgICAgICBpZiAoKE5VTEwgPT0gb3JnX3NwZWMpIHx8IChCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQ1RDICE9IG9yZ19zcGVjLT5vdWkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRU9OX0xJTktfTE9HKElORk8sICZsaW5rX3N0YXRlLT5saW5rX2tleSwgIkRpZG4ndCBnZXQgQ1RDIGNvbmZpcm0gVExWXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgKnJjID0gQkNNX0VSUl9PTlVfRVJSX1JFU1A7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChvcmdfc3BlYy0+dS5jdGMuc3VwcF92ZXJzaW9uX2NvdW50ID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcmdfc3BlYy0+dS5jdGMudmVyc2lvbiAhPSBjdGMtPnNlbGVjdGVkX3ZlcnNpb24pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJjID0gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0Yy0+c3RhdGUgPSBDVENfTkVHX0RPTkU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENUQ19ORUdfRE9ORToKKyAgICAgICAgICAgICAgICBpZiAoKE5VTEwgIT0gb3JnX3NwZWMpICYmIChvcmdfc3BlYy0+b3VpID09IEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9DVEMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRU9OX0xJTktfTE9HKAorICAgICAgICAgICAgICAgICAgICAgICAgSU5GTywgJmxpbmtfc3RhdGUtPmxpbmtfa2V5LCAiR290IHVuZXhwZWN0ZWQgQ1RDIFRMViBhZnRlciBuZWdvdGlhdGlvblxuIik7CisgICAgICAgICAgICAgICAgICAgICpyYyA9IEJDTV9FUlJfT05VX0VSUl9SRVNQOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAqcmMgPSBCQ01fRVJSX09LOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKChOVUxMICE9IG9yZ19zcGVjKSAmJiAob3JnX3NwZWMtPm91aSA9PSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfQ1RDKSkKKyAgICAgICAgeworICAgICAgICAgICAgRU9OX0xJTktfTE9HKAorICAgICAgICAgICAgICAgIElORk8sICZsaW5rX3N0YXRlLT5saW5rX2tleSwgIkdvdCB1bmV4cGVjdGVkIENUQyBUTFYgYmVmb3JlIG5lZ290aWF0aW9uXG4iKTsKKyAgICAgICAgICAgICpyYyA9IEJDTV9FUlJfT05VX0VSUl9SRVNQOworICAgICAgICB9CisKKyAgICAgICAgaWYgKExPQ0FMX1NUQUJMRV9SRU1PVEVfU1RBQkxFID09IGxpbmtfc3RhdGUtPm9hbV9zdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgY3RjX3N0YXRlICpjdGMgPSBiY21vc19jYWxsb2Moc2l6ZW9mKGN0Y19zdGF0ZSkpOworICAgICAgICAgICAgY3RjLT5zdGF0ZSA9IENUQ19ORUdfQURWRVJUSVNJTkc7CisgICAgICAgICAgICBsaW5rX3N0YXRlLT5vcmdfc3BlY19zdGF0ZSA9IGN0YzsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lb24vb2FtX3NldHMvY3RjL2N0Yy5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lb24vb2FtX3NldHMvY3RjL2N0Yy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMTA3YjQKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vvbi9vYW1fc2V0cy9jdGMvY3RjLmgKQEAgLTAsMCArMSw0MiBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisqLworCisjaWZuZGVmIF9CQ01PTFRfRU9OX0NUQ19IXworI2RlZmluZSBfQkNNT0xUX0VPTl9DVENfSF8KKwordm9pZCBjdGNfdHhfYWRkX3Rsdihlb25fbGlua19zdGF0ZSAqbGlua19zdGF0ZSwgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudCAqb2FtKTsKKwordm9pZCBjdGNfcnhfdGx2KAorICAgIGVvbl9saW5rX3N0YXRlICpsaW5rX3N0YXRlLAorICAgIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mbyAqb3JnX3NwZWMsCisgICAgYmNtb3NfZXJybm8gKnJjKTsKKworI2VuZGlmIC8vIF9CQ01PTFRfRU9OX0NUQ19IXworCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZW9uL29hbV9zZXRzL2Rwb2UvZHBvZS5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lb24vb2FtX3NldHMvZHBvZS9kcG9lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIwYWNmMQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZW9uL29hbV9zZXRzL2Rwb2UvZHBvZS5jCkBAIC0wLDAgKzEsMTIyIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyovCisKKy8qIFRoaXMgZmlsZSBjb250YWlucyB0aGUgcGllY2VzIG9mIHRoZSBPQU0gbmVnb3RpYXRpb24gc3RhdGUgbWFjaGluZSB0aGF0IGFyZSBzcGVjaWZpYyB0byBEUG9FIE9BTS4gKi8KKworI2luY2x1ZGUgImJjbW9sdF9lb25fcHJpdmF0ZS5oIgorI2luY2x1ZGUgIi4uL29hbV9jb21tb24uaCIKKyNpbmNsdWRlICJkcG9lLmgiCisKKy8qIE9yZyBzcGVjaWZpYyBUTFYgdG8gc2VuZCB0byB0aGUgT05VICovCitzdGF0aWMgY29uc3QgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19pbmZvIGRwb2VfdHhfdGx2ID0KK3sKKyAgICAub3VpID0gQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RQT0UsCisgICAgLnUgPQorICAgIHsKKyAgICAgICAgLmRwb2UgPQorICAgICAgICB7CisgICAgICAgICAgICAuZHBvZV9pbmZvX3RsdiA9CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLnR5cGUgPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9JTkZPX1RMVl9UWVBFX0RQT0VfT0FNX1NVUFBPUlQsCisgICAgICAgICAgICAgICAgLnUgPQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLmRwb2Vfb2FtX3N1cHBvcnQgPQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAuZHBvZV9vYW1fdmVyc2lvbiA9IDB4MTEKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK307CisKK3ZvaWQgZHBvZV90eF9hZGRfdGx2KGVvbl9saW5rX3N0YXRlICpsaW5rX3N0YXRlLCBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50ICpvYW0pCit7CisgICAgaWYgKChMT0NBTF9FVkFMX1JFTU9URV9FVkFMID09IGxpbmtfc3RhdGUtPm9hbV9zdGF0ZSkgfHwKKyAgICAgICAgKExPQ0FMX1NUQUJMRV9SRU1PVEVfRVZBTCA9PSBsaW5rX3N0YXRlLT5vYW1fc3RhdGUpKQorICAgIHsKKyAgICAgICAgb2FtLT51LmluZm8udGx2c1tvYW0tPnUuaW5mby50bHZzX2NvdW50XS50eXBlID0gQkNNT0xUX0VQT05fT0FNX0lORk9fVExWX1RZUEVfT1JHQU5JWkFUSU9OX1NQRUNJRklDOworICAgICAgICBvYW0tPnUuaW5mby50bHZzW29hbS0+dS5pbmZvLnRsdnNfY291bnRdLnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlID0gZHBvZV90eF90bHY7CisgICAgICAgIG9hbS0+dS5pbmZvLnRsdnNfY291bnQrKzsKKyAgICB9Cit9CisKK3ZvaWQgZHBvZV9yeF90bHYoCisgICAgZW9uX2xpbmtfc3RhdGUgKmxpbmtfc3RhdGUsCisgICAgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19pbmZvICpvcmdfc3BlYywKKyAgICBiY21vc19lcnJubyAqcmMpCit7CisgICAgaWYgKGxpbmtfc3RhdGUtPm9hbV9zdGF0ZSA9PSBMT0NBTF9TVEFCTEVfUkVNT1RFX1NUQUJMRSkKKyAgICB7CisgICAgICAgIGlmIChOVUxMICE9IG9yZ19zcGVjKQorICAgICAgICB7CisgICAgICAgICAgICBFT05fTElOS19MT0coSU5GTywgJmxpbmtfc3RhdGUtPmxpbmtfa2V5LCAiR290IHVuZXhwZWN0ZWQgb3JnYW5pemF0aW9uIHNwZWNpZmljIFRMVlxuIik7CisgICAgICAgICAgICAqcmMgPSBCQ01fRVJSX09OVV9FUlJfUkVTUDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoKE5VTEwgPT0gb3JnX3NwZWMpIHx8CisgICAgICAgICAgICAoQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RQT0UgIT0gb3JnX3NwZWMtPm91aSkgfHwKKyAgICAgICAgICAgIChCQ01PTFRfRVBPTl9PQU1fRFBPRV9JTkZPX1RMVl9UWVBFX0RQT0VfT0FNX1NVUFBPUlQgIT0gb3JnX3NwZWMtPnUuZHBvZS5kcG9lX2luZm9fdGx2LnR5cGUpKQorICAgICAgICB7CisgICAgICAgICAgICBFT05fTElOS19MT0coSU5GTywgJmxpbmtfc3RhdGUtPmxpbmtfa2V5LCAiRGlkbid0IGdldCBEUG9FIFRMVlxuIik7CisgICAgICAgICAgICAqcmMgPSBCQ01fRVJSX09OVV9FUlJfUkVTUDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAob3JnX3NwZWMtPnUuZHBvZS5kcG9lX2luZm9fdGx2LnUuZHBvZV9vYW1fc3VwcG9ydC5kcG9lX29hbV92ZXJzaW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgMHgyMjoKKyAgICAgICAgICAgICAgICBjYXNlIDB4MjE6CisgICAgICAgICAgICAgICAgY2FzZSAweDIwOgorICAgICAgICAgICAgICAgIGNhc2UgMHgxMTogLyogRFBvRSB2MS4wIEkwNSBhbmQgaGlnaGVyICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMHgwMTogLyogYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHNhbWUgYXMgMHgxMCAqLworICAgICAgICAgICAgICAgIGNhc2UgMHgwMjogLyogcHJlLURQb0UgT0FNLCBubyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgc3VwcG9ydCAqLworICAgICAgICAgICAgICAgIGNhc2UgMHgwMzogLyogcHJlLURQb0UgT0FNLCB3aXRoIENlcnRpZmljYXRlIEF1dGhvcml0eSBzdXBwb3J0ICovCisgICAgICAgICAgICAgICAgY2FzZSAweDEwOiAvKiBEUG9FIHYxLjAgSTA0IGFuZCBsb3dlciAqLworICAgICAgICAgICAgICAgICAgICBFT05fTElOS19MT0coCisgICAgICAgICAgICAgICAgICAgICAgICBXQVJOSU5HLCAmbGlua19zdGF0ZS0+bGlua19rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAiRFBvRSBUTFYgY29udGFpbmVkIG9sZCB2ZXJzaW9uOiAldSAoc29tZSBmZWF0dXJlcyBtYXkgbm90IHdvcmspXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgb3JnX3NwZWMtPnUuZHBvZS5kcG9lX2luZm9fdGx2LnUuZHBvZV9vYW1fc3VwcG9ydC5kcG9lX29hbV92ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweDAwOiAvKiB3b3JrYXJvdW5kIGZvciBFQVNXLTE3ODM5ICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIEVPTl9MSU5LX0xPRygKKyAgICAgICAgICAgICAgICAgICAgICAgIEVSUk9SLCAmbGlua19zdGF0ZS0+bGlua19rZXksICJEUG9FIFRMViBjb250YWluZWQgYmFkIHZlcnNpb246ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgb3JnX3NwZWMtPnUuZHBvZS5kcG9lX2luZm9fdGx2LnUuZHBvZV9vYW1fc3VwcG9ydC5kcG9lX29hbV92ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgKnJjID0gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lb24vb2FtX3NldHMvZHBvZS9kcG9lLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vvbi9vYW1fc2V0cy9kcG9lL2Rwb2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjZkNmYyCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lb24vb2FtX3NldHMvZHBvZS9kcG9lLmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisqLworCisjaWZuZGVmIF9CQ01PTFRfRU9OX0RQT0VfSF8KKyNkZWZpbmUgX0JDTU9MVF9FT05fRFBPRV9IXworCit2b2lkIGRwb2VfdHhfYWRkX3Rsdihlb25fbGlua19zdGF0ZSAqbGlua19zdGF0ZSwgYmNtb2x0X2Vwb25fb2FtX29hbV9wZHVfY29udGVudCAqb2FtKTsKKwordm9pZCBkcG9lX3J4X3RsdigKKyAgICBlb25fbGlua19zdGF0ZSAqbGlua19zdGF0ZSwKKyAgICBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2luZm8gKm9yZ19zcGVjLAorICAgIGJjbW9zX2Vycm5vICpyYyk7CisKKyNlbmRpZiAvLyBfQkNNT0xUX0VPTl9EUE9FX0hfCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZW9uL29hbV9zZXRzL29hbV9jb21tb24uYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZW9uL29hbV9zZXRzL29hbV9jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDkyYzkyCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lb24vb2FtX3NldHMvb2FtX2NvbW1vbi5jCkBAIC0wLDAgKzEsMzYxIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyovCisKKy8qIFRoaXMgZmlsZSBjb250YWlucyB0aGUgcGllY2VzIG9mIHRoZSBPQU0gbmVnb3RpYXRpb24gc3RhdGUgbWFjaGluZSB0aGF0IGFyZSBjb21tb24gdG8gYWxsIE9BTS4gKi8KKworI2luY2x1ZGUgIm9hbV9jb21tb24uaCIKKyNpbmNsdWRlICJiY21vbHRfdXRpbHMuaCIKKyNpbmNsdWRlICJiY21vbHRfbWF0aC5oIgorI2luY2x1ZGUgImJjbW9sdF9lb25fcHJpdmF0ZS5oIgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW0uaCIKKyNpbmNsdWRlICJkcG9lL2Rwb2UuaCIKKyNpbmNsdWRlICJicmNtL2JyY20uaCIKKyNpbmNsdWRlICJjdGMvY3RjLmgiCisKK3N0YXRpYyBjb25zdCBvYW1faW5mb19hZGRfdGx2IGFkZF9vcmdfc3BlY190bHZbRU9OX09BTV9TRVRfSURfQ09VTlRdID0KK3sKKyAgICBbRU9OX09BTV9TRVRfSURfRFBPRV0gPSBkcG9lX3R4X2FkZF90bHYsCisgICAgW0VPTl9PQU1fU0VUX0lEX0JSQ01dID0gYnJjbV90eF9hZGRfdGx2LAorICAgIFtFT05fT0FNX1NFVF9JRF9DVENdID0gY3RjX3R4X2FkZF90bHYKK307CisKK3N0YXRpYyBjb25zdCBvYW1fcnhfb3JnX3NwZWNfdGx2IHJ4X29yZ19zcGVjX3RsdltFT05fT0FNX1NFVF9JRF9DT1VOVF0gPQoreworICAgIFtFT05fT0FNX1NFVF9JRF9EUE9FXSA9IGRwb2VfcnhfdGx2LAorICAgIFtFT05fT0FNX1NFVF9JRF9CUkNNXSA9IGJyY21fcnhfdGx2LAorICAgIFtFT05fT0FNX1NFVF9JRF9DVENdID0gY3RjX3J4X3RsdgorfTsKKworc3RhdGljIHVpbnQ4X3QgZ2V0X29hbV92ZXJzaW9uKHZvaWQpCit7CisgICAgcmV0dXJuIDB4MDE7IC8qIG9ubHkgdmVyc2lvbiBjdXJyZW50bHkgc3VwcG9ydGVkICovCit9CisKK3N0YXRpYyB2b2lkIGZpbGxfbG9jYWxfdGx2KGNvbnN0IGVvbl9saW5rX3N0YXRlICpsaW5rX3N0YXRlLCBiY21vbHRfZXBvbl9vYW1fbG9jYWxfcmVtb3RlX2luZm8gKnRsdikKK3sKKyAgICB0bHYtPm9hbV92ZXJzaW9uID0gZ2V0X29hbV92ZXJzaW9uKCk7CisgICAgdGx2LT5yZXZpc2lvbiA9IGxpbmtfc3RhdGUtPnJldmlzaW9uOworICAgIHRsdi0+c3RhdGUgPQorICAgICAgICBCQ01PTFRfRVBPTl9PQU1fTE9DQUxfUkVNT1RFX0lORk9fU1RBVEVfUEFSU0VSX0FDVElPTjEgfAorICAgICAgICBCQ01PTFRfRVBPTl9PQU1fTE9DQUxfUkVNT1RFX0lORk9fU1RBVEVfTVVMVElQTEVYRVJfQUNUSU9OOworICAgIHRsdi0+b2FtX2NvbmZpZyA9CisgICAgICAgIEJDTU9MVF9FUE9OX09BTV9MT0NBTF9SRU1PVEVfSU5GT19DT05GSUdfT0FNX01PREUgfAorICAgICAgICBCQ01PTFRfRVBPTl9PQU1fTE9DQUxfUkVNT1RFX0lORk9fQ09ORklHX1VOSURJUkVDVElPTkFMX1NVUFBPUlQgfAorICAgICAgICBCQ01PTFRfRVBPTl9PQU1fTE9DQUxfUkVNT1RFX0lORk9fQ09ORklHX0xJTktfRVZFTlRTOworICAgIHRsdi0+bWF4X3BkdV9zaXplID0gbGlua19zdGF0ZS0+bWF4X3BkdV9zaXplOworICAgIHRsdi0+b3VpID0gQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1RFSzsKKyAgICB0bHYtPnZlbmRvcl9zcGVjaWZpY19pbmZvcm1hdGlvblswXSA9IDB4MDY7CisgICAgdGx2LT52ZW5kb3Jfc3BlY2lmaWNfaW5mb3JtYXRpb25bMV0gPSAweDg2OworICAgIHRsdi0+dmVuZG9yX3NwZWNpZmljX2luZm9ybWF0aW9uWzJdID0gMHgyMDsKKyAgICB0bHYtPnZlbmRvcl9zcGVjaWZpY19pbmZvcm1hdGlvblszXSA9IDB4QTA7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfc3RkX2luZm9fdGx2KGNvbnN0IGVvbl9saW5rX2tleSAqbGlua19rZXksIGNvbnN0IGNoYXIgKnR5cGUsIGJjbW9sdF9lcG9uX29hbV9sb2NhbF9yZW1vdGVfaW5mbyAqaW5mbykKK3sKKyAgICBFT05fTElOS19MT0coCisgICAgICAgIERFQlVHLAorICAgICAgICBsaW5rX2tleSwKKyAgICAgICAgIiVzOiB2ZXIgJTAyeCByZXYgJTA0eCBzdGF0ZSAlMDJ4IGNmZyAlMDJ4IHBkdSAlNXUgb3VpICUwNnggdmVuZG9yICUwMnglMDJ4JTAyeCUwMnhcbiIsCisgICAgICAgIHR5cGUsCisgICAgICAgIGluZm8tPm9hbV92ZXJzaW9uLAorICAgICAgICBpbmZvLT5yZXZpc2lvbiwKKyAgICAgICAgaW5mby0+c3RhdGUsCisgICAgICAgIGluZm8tPm9hbV9jb25maWcsCisgICAgICAgIGluZm8tPm1heF9wZHVfc2l6ZSwKKyAgICAgICAgaW5mby0+b3VpLAorICAgICAgICBpbmZvLT52ZW5kb3Jfc3BlY2lmaWNfaW5mb3JtYXRpb25bMF0sCisgICAgICAgIGluZm8tPnZlbmRvcl9zcGVjaWZpY19pbmZvcm1hdGlvblsxXSwKKyAgICAgICAgaW5mby0+dmVuZG9yX3NwZWNpZmljX2luZm9ybWF0aW9uWzJdLAorICAgICAgICBpbmZvLT52ZW5kb3Jfc3BlY2lmaWNfaW5mb3JtYXRpb25bM10pOworfQorCitzdGF0aWMgdm9pZCBkdW1wX29yZ19zcGVjX3Rsdihjb25zdCBlb25fbGlua19rZXkgKmxpbmtfa2V5LCBiY21vbHRfZXBvbl9vYW1fb3JnYW5pemF0aW9uX3NwZWNpZmljX2luZm8gKm9yZ19zcGVjKQoreworICAgIHN3aXRjaCAob3JnX3NwZWMtPm91aSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX1RFSzoKKyAgICAgICAgICAgIGlmIChCQ01PTFRfRVBPTl9PQU1fVEVLX0lORk9fVExWX1RZUEVfRVhURU5TSU9OX1NVUFBPUlQgPT0gb3JnX3NwZWMtPnUudGVrLnRsdnMudHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFT05fTElOS19MT0coCisgICAgICAgICAgICAgICAgICAgIERFQlVHLCBsaW5rX2tleSwgIkJSQ00gRXh0IFN1cHBvcnQ6IHZlciAlMDJ4IHJwdCAlMDJ4IHByZWYgJTAyeFxuIiwKKyAgICAgICAgICAgICAgICAgICAgb3JnX3NwZWMtPnUudGVrLnRsdnMudS5leHRlbnNpb25fc3VwcG9ydC52ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICBvcmdfc3BlYy0+dS50ZWsudGx2cy51LmV4dGVuc2lvbl9zdXBwb3J0LnJlcG9ydF9tb2RlLAorICAgICAgICAgICAgICAgICAgICBvcmdfc3BlYy0+dS50ZWsudGx2cy51LmV4dGVuc2lvbl9zdXBwb3J0LnByZWZlcnJlZF9yZXBvcnRfbW9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfRFBPRToKKyAgICAgICAgICAgIGlmIChCQ01PTFRfRVBPTl9PQU1fRFBPRV9JTkZPX1RMVl9UWVBFX0RQT0VfT0FNX1NVUFBPUlQgPT0gb3JnX3NwZWMtPnUuZHBvZS5kcG9lX2luZm9fdGx2LnR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRU9OX0xJTktfTE9HKAorICAgICAgICAgICAgICAgICAgICBERUJVRywgbGlua19rZXksICJEUG9FIFN1cHBvcnQ6IHZlciAlMDJ4XG4iLAorICAgICAgICAgICAgICAgICAgICBvcmdfc3BlYy0+dS5kcG9lLmRwb2VfaW5mb190bHYudS5kcG9lX29hbV9zdXBwb3J0LmRwb2Vfb2FtX3ZlcnNpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0NUQzoKKyAgICAgICAgICAgIEVPTl9MSU5LX0xPRygKKyAgICAgICAgICAgICAgICBERUJVRywgbGlua19rZXksICJDVEMgRXh0ZW5zaW9uIFN1cHBvcnQgJXUsIFByZWZlcnJlZCBWZXJzaW9uIDB4JTAyeCwgU3VwcG9ydHMgKCV1KTpcbiIsCisgICAgICAgICAgICAgICAgb3JnX3NwZWMtPnUuY3RjLmV4dGVuc2lvbl9zdXBwb3J0LAorICAgICAgICAgICAgICAgIG9yZ19zcGVjLT51LmN0Yy52ZXJzaW9uLAorICAgICAgICAgICAgICAgIG9yZ19zcGVjLT51LmN0Yy5zdXBwX3ZlcnNpb25fY291bnQpOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG9yZ19zcGVjLT51LmN0Yy5zdXBwX3ZlcnNpb25fY291bnQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFT05fTElOS19MT0coCisgICAgICAgICAgICAgICAgICAgIERFQlVHLCBsaW5rX2tleSwgIlx0T1VJICUwNngsIFZlcnNpb24gMHglMDJ4XG4iLAorICAgICAgICAgICAgICAgICAgICBvcmdfc3BlYy0+dS5jdGMuc3VwcF92ZXJzaW9uW2ldLm91aSwgb3JnX3NwZWMtPnUuY3RjLnN1cHBfdmVyc2lvbltpXS52ZXJzaW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgRU9OX0xJTktfTE9HKFdBUk5JTkcsIGxpbmtfa2V5LCAiTm8gc3VwcG9ydCBmb3IgJTA2eFxuIiwgb3JnX3NwZWMtPm91aSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfaW5mb19mcmFtZShjb25zdCBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWUgKm9hbSwgY29uc3QgZW9uX2xpbmtfc3RhdGUqIGxpbmtfc3RhdGUpCit7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGVudG5hbWVbXSA9IHsiT05VIiwiT0xUIn07CisgICAgY2hhciBkYV9idWZbTUFDX1NUUl9MRU5dOworICAgIGNoYXIgc2FfYnVmW01BQ19TVFJfTEVOXTsKKyAgICBiY21vbHRfZXBvbl9vYW1fb2FtX2ZsYWdzIGZsYWdzID0gb2FtLT5wcm90b2NvbHNbMF0udS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmZsYWdzOworICAgIHVpbnQ4X3QgaXNfb2x0ID0gKDAgPT0gbWVtY21wKGxpbmtfc3RhdGUtPmVwb25fbmlfbWFjX2FkZHIudTgsIG9hbS0+c2EudTgsIEJDTU9TX0VUSF9BTEVOKSk7CisgICAgdWludDhfdCBvbHRfc3RhYiA9IDAgIT0KKyAgICAgICAgKGZsYWdzICYgKGlzX29sdCA/IEJDTU9MVF9FUE9OX09BTV9PQU1fRkxBR1NfTE9DQUxfU1RBQkxFIDogQkNNT0xUX0VQT05fT0FNX09BTV9GTEFHU19SRU1PVEVfU1RBQkxFKSk7CisgICAgdWludDhfdCBvbnVfc3RhYiA9IDAgIT0KKyAgICAgICAgKGZsYWdzICYgKGlzX29sdCA/IEJDTU9MVF9FUE9OX09BTV9PQU1fRkxBR1NfUkVNT1RFX1NUQUJMRSA6IEJDTU9MVF9FUE9OX09BTV9PQU1fRkxBR1NfTE9DQUxfU1RBQkxFKSk7CisgICAgdWludDhfdCBvbHRfZXZhbCA9IDAgIT0KKyAgICAgICAgKGZsYWdzICYgKGlzX29sdCA/IEJDTU9MVF9FUE9OX09BTV9PQU1fRkxBR1NfTE9DQUxfRVZBTFVBVElORyA6IEJDTU9MVF9FUE9OX09BTV9PQU1fRkxBR1NfUkVNT1RFX0VWQUxVQVRJTkcpKTsKKyAgICB1aW50OF90IG9udV9ldmFsID0gMCAhPQorICAgICAgICAoZmxhZ3MgJiAoaXNfb2x0ID8gQkNNT0xUX0VQT05fT0FNX09BTV9GTEFHU19SRU1PVEVfRVZBTFVBVElORyA6IEJDTU9MVF9FUE9OX09BTV9PQU1fRkxBR1NfTE9DQUxfRVZBTFVBVElORykpOworCisgICAgRU9OX0xJTktfTE9HKAorICAgICAgICBERUJVRywgJmxpbmtfc3RhdGUtPmxpbmtfa2V5LCAiZnJvbSAlczogT0xUICVzICBPTlUgJXNcbiIsIGVudG5hbWVbaXNfb2x0XSwKKyAgICAgICAgb2x0X3N0YWIgPyAic3RhYiIgOiAob2x0X2V2YWwgPyAiZXZhbCIgOiAiTk9ORSIpLAorICAgICAgICBvbnVfc3RhYiA/ICJzdGFiIiA6IChvbnVfZXZhbCA/ICJldmFsIiA6ICJOT05FIikpOworCisgICAgRU9OX0xJTktfTE9HKERFQlVHLCAmbGlua19zdGF0ZS0+bGlua19rZXksICIgICAgICAgICAgICAgICBkYSAgICAgICAgICAgICAgICBzYSAgZXRoIHN1IGZsZ3MgY2RcbiIpOworICAgIEVPTl9MSU5LX0xPRygKKyAgICAgICAgREVCVUcsICZsaW5rX3N0YXRlLT5saW5rX2tleSwgIiVzICVzICUwNHggJTAyeCAlMDR4ICUwMnhcbiIsCisgICAgICAgIGJjbW9zX21hY18yX3N0cigmb2FtLT5kYSwgZGFfYnVmKSwgYmNtb3NfbWFjXzJfc3RyKCZvYW0tPnNhLCBzYV9idWYpLAorICAgICAgICBvYW0tPnByb3RvY29sc1swXS5ldGhlcnR5cGUsIG9hbS0+cHJvdG9jb2xzWzBdLnUuc2xvd19wcm90b2NvbC52YWx1ZS5zdWJ0eXBlLAorICAgICAgICBvYW0tPnByb3RvY29sc1swXS51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uZmxhZ3MsCisgICAgICAgIG9hbS0+cHJvdG9jb2xzWzBdLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LmNvZGUpOworICAgIEVPTl9MSU5LX0xPRygKKyAgICAgICAgREVCVUcsICZsaW5rX3N0YXRlLT5saW5rX2tleSwgIlRMVlM6ICgldSlcbiIsCisgICAgICAgIG9hbS0+cHJvdG9jb2xzWzBdLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUuaW5mby50bHZzX2NvdW50KTsKKyAgICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgPCBvYW0tPnByb3RvY29sc1swXS51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51LmluZm8udGx2c19jb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChvYW0tPnByb3RvY29sc1swXS51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51LmluZm8udGx2c1tpXS50eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9JTkZPX1RMVl9UWVBFX0xPQ0FMOgorICAgICAgICAgICAgICAgIGR1bXBfc3RkX2luZm9fdGx2KAorICAgICAgICAgICAgICAgICAgICAmbGlua19zdGF0ZS0+bGlua19rZXksCisgICAgICAgICAgICAgICAgICAgICJMT0NBTCIsCisgICAgICAgICAgICAgICAgICAgICZvYW0tPnByb3RvY29sc1swXS51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51LmluZm8udGx2c1tpXS51LmxvY2FsLmluZm8pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fSU5GT19UTFZfVFlQRV9SRU1PVEU6CisgICAgICAgICAgICAgICAgZHVtcF9zdGRfaW5mb190bHYoCisgICAgICAgICAgICAgICAgICAgICZsaW5rX3N0YXRlLT5saW5rX2tleSwKKyAgICAgICAgICAgICAgICAgICAgIlJFTU9URSIsCisgICAgICAgICAgICAgICAgICAgICZvYW0tPnByb3RvY29sc1swXS51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51LmluZm8udGx2c1tpXS51LnJlbW90ZS5pbmZvKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0lORk9fVExWX1RZUEVfT1JHQU5JWkFUSU9OX1NQRUNJRklDOgorICAgICAgICAgICAgICAgIGR1bXBfb3JnX3NwZWNfdGx2KAorICAgICAgICAgICAgICAgICAgICAmbGlua19zdGF0ZS0+bGlua19rZXksCisgICAgICAgICAgICAgICAgICAgICZvYW0tPnByb3RvY29sc1swXS51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51LmluZm8udGx2c1tpXS51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCitiY21vc19lcnJubyBidWlsZF90eF9pbmZvX2ZyYW1lKGVvbl9saW5rX3N0YXRlICpsaW5rX3N0YXRlLCBlb25fZnJhbWVfZGF0YSAqZnJhbWVfZGF0YSkKK3sKKyAgICBiY21vc19ib29sIGhhdmVfcmVtb3RlX2luZm8gPSBsaW5rX3N0YXRlLT5yZW1vdGVfaW5mby5vYW1fdmVyc2lvbiA9PSBnZXRfb2FtX3ZlcnNpb24oKTsKKyAgICBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWUgb2FtX2ZyYW1lID0ge307CisgICAgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sIHByb3RvY29sID0ge307CisgICAgYmNtb2x0X2Vwb25fb2FtX2luZm9fdGx2X2Jhc2UgdGx2c1s0XSA9IHt9OworCisgICAgRU9OX0xJTktfTE9HKERFQlVHLCAmbGlua19zdGF0ZS0+bGlua19rZXksICJCVUlMRElORyBJTkZPIEZSQU1FLCBjdXJyZW50IHN0YXRlICUwNHhcbiIsIGxpbmtfc3RhdGUtPm9hbV9zdGF0ZSk7CisKKyAgICBvYW1fZnJhbWUuZGEgPSBzbG93X3Byb3RvY29sX211bHRpY2FzdF9tYWM7CisgICAgb2FtX2ZyYW1lLnNhID0gbGlua19zdGF0ZS0+ZXBvbl9uaV9tYWNfYWRkcjsKKyAgICBvYW1fZnJhbWUucHJvdG9jb2xzX2NvdW50ID0gMTsKKyAgICBvYW1fZnJhbWUucHJvdG9jb2xzID0gJnByb3RvY29sOworICAgIHByb3RvY29sLmV0aGVydHlwZSA9IEJDTU9MVF9FUE9OX09BTV9QUk9UT0NPTF9UWVBFX1NMT1dfUFJPVE9DT0w7CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnN1YnR5cGUgPSBCQ01PTFRfRVBPTl9PQU1fU0xPV19QUk9UT0NPTF9TVUJUWVBFX09BTTsKKyAgICBwcm90b2NvbC51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uZmxhZ3MgPSBsaW5rX3N0YXRlLT5vYW1fc3RhdGU7CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQuY29kZSA9IEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX0lORk87CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5pbmZvLnRsdnNfY291bnQgPSAxOworICAgIHByb3RvY29sLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUuaW5mby50bHZzID0gdGx2czsKKyAgICB0bHZzWzBdLnR5cGUgPSBCQ01PTFRfRVBPTl9PQU1fSU5GT19UTFZfVFlQRV9MT0NBTDsKKyAgICBmaWxsX2xvY2FsX3RsdihsaW5rX3N0YXRlLCAmdGx2c1swXS51LmxvY2FsLmluZm8pOworICAgIGlmIChoYXZlX3JlbW90ZV9pbmZvKQorICAgIHsKKyAgICAgICAgdGx2c1sxXS50eXBlID0gQkNNT0xUX0VQT05fT0FNX0lORk9fVExWX1RZUEVfUkVNT1RFOworICAgICAgICB0bHZzWzFdLnUucmVtb3RlLmluZm8gPSBsaW5rX3N0YXRlLT5yZW1vdGVfaW5mbzsKKyAgICAgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5pbmZvLnRsdnNfY291bnQrKzsKKyAgICB9CisgICAgYWRkX29yZ19zcGVjX3RsdltsaW5rX3N0YXRlLT5vYW1fc2V0XShsaW5rX3N0YXRlLCAmcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQpOworICAgIHRsdnNbcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5pbmZvLnRsdnNfY291bnRdLnR5cGUgPSBCQ01PTFRfRVBPTl9PQU1fSU5GT19UTFZfVFlQRV9FTkQ7CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5pbmZvLnRsdnNfY291bnQrKzsKKworICAgIGR1bXBfaW5mb19mcmFtZSgmb2FtX2ZyYW1lLCBsaW5rX3N0YXRlKTsKKworICAgIHJldHVybiBlcG9uX29hbV9wYWNrX2ZyYW1lKCZvYW1fZnJhbWUsICZmcmFtZV9kYXRhLT5wYXlsb2FkLCAmZnJhbWVfZGF0YS0+bGVuZ3RoKTsKK30KKworLyogT0sgPSBkb25lCisgICBpbl9wcm9ncmVzcyA9IHNlbmQgbmV4dCBmcmFtZQorICAgcGFyc2UgPSBpZ25vcmUKKyAgIG90aGVyID0gc3RvcAorICAgKi8KK2JjbW9zX2Vycm5vIGhhbmRsZV9yeF9pbmZvX2ZyYW1lKGVvbl9saW5rX3N0YXRlICpsaW5rX3N0YXRlLCB1aW50MTZfdCByeF9sZW5ndGgsIHVpbnQ4X3QgKnJ4X3BheWxvYWQpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX0lOX1BST0dSRVNTOworICAgIGJjbW9sdF9lcG9uX29hbV9vYW1fZmxhZ3Mgc3RhcnRfc3RhdGU7CisgICAgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lICpmcmFtZTsKKyAgICBiY21vbHRfZXBvbl9vYW1fc2xvd19wcm90b2NvbCAqc3A7CisgICAgYmNtb2x0X2Vwb25fb2FtX29yZ2FuaXphdGlvbl9zcGVjaWZpY19pbmZvICpvcmdfc3BlYyA9IE5VTEw7CisKKyAgICBzdGFydF9zdGF0ZSA9IGxpbmtfc3RhdGUtPm9hbV9zdGF0ZTsKKyAgICBFT05fTElOS19MT0coREVCVUcsICZsaW5rX3N0YXRlLT5saW5rX2tleSwgIlJFQ0VJVkVEIElORk8gRlJBTUUsIGN1cnJlbnQgc3RhdGUgJTA0eFxuIiwgc3RhcnRfc3RhdGUpOworCisgICAgZnJhbWUgPSBlcG9uX29hbV91bnBhY2sobGlua19zdGF0ZS0+bGlua19rZXkuZGV2aWNlX2lkLCByeF9sZW5ndGgsIHJ4X3BheWxvYWQpOworCisgICAgaWYgKChmcmFtZS0+cHJvdG9jb2xzX2NvdW50ID09IDApIHx8CisgICAgICAgIChmcmFtZS0+cHJvdG9jb2xzWzBdLmV0aGVydHlwZSAhPSBCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9TTE9XX1BST1RPQ09MKSB8fAorICAgICAgICAoZnJhbWUtPnByb3RvY29sc1swXS51LnNsb3dfcHJvdG9jb2wudmFsdWUuc3VidHlwZSAhPSBCQ01PTFRfRVBPTl9PQU1fU0xPV19QUk9UT0NPTF9TVUJUWVBFX09BTSkgfHwKKyAgICAgICAgKGZyYW1lLT5wcm90b2NvbHNbMF0udS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQuY29kZSAhPSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9JTkZPKSkKKyAgICB7CisgICAgICAgIC8qIG5vdCBhbiBpbmZvIGZyYW1lLCBpZ25vcmUgKi8KKyAgICAgICAgYmNtb3NfZnJlZShmcmFtZSk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUlNFOworICAgIH0KKworICAgIGR1bXBfaW5mb19mcmFtZShmcmFtZSwgbGlua19zdGF0ZSk7CisgICAgc3AgPSAmZnJhbWUtPnByb3RvY29sc1swXS51LnNsb3dfcHJvdG9jb2wudmFsdWU7CisKKyAgICAvKiBjYXB0dXJlIGxpbmsncyBUTFYgZm9yIHN1YnNlcXVlbnQgcmV0cmFuc21pc3Npb24gKi8KKyAgICBpZiAoKHNwLT51Lm9hbS5jb250ZW50LnUuaW5mby50bHZzX2NvdW50ID4gMCkgJiYKKyAgICAgICAgKHNwLT51Lm9hbS5jb250ZW50LnUuaW5mby50bHZzWzBdLnR5cGUgPT0gQkNNT0xUX0VQT05fT0FNX0lORk9fVExWX1RZUEVfTE9DQUwpKQorICAgIHsKKyAgICAgICAgbGlua19zdGF0ZS0+cmVtb3RlX2luZm8gPSBzcC0+dS5vYW0uY29udGVudC51LmluZm8udGx2c1swXS51LmxvY2FsLmluZm87CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbW9zX2ZyZWUoZnJhbWUpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9PTlVfRVJSX1JFU1A7IC8qIG5vIGxvY2FsIGluZm8gKi8KKyAgICB9CisKKyAgICBpZiAoMCAhPSBtZW1jbXAoZnJhbWUtPmRhLnU4LCBzbG93X3Byb3RvY29sX211bHRpY2FzdF9tYWMudTgsIHNpemVvZihzbG93X3Byb3RvY29sX211bHRpY2FzdF9tYWMpKSkKKyAgICB7CisgICAgICAgIHJjID0gQkNNX0VSUl9PTlVfRVJSX1JFU1A7CisgICAgICAgIEVPTl9MSU5LX0xPRyhXQVJOSU5HLCAmbGlua19zdGF0ZS0+bGlua19rZXksCisgICAgICAgICAgICAgICAgICAgICAiREEgbWlzbWF0Y2ggIkJDTU9TX01BQ0FERFJfRk1UX1NUUiIgZXhwZWN0ZWQgdnMuICJCQ01PU19NQUNBRERSX0ZNVF9TVFIiIGFjdHVhbFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIEJDTU9TX01BQ0FERFJfUEFSQU1TKCZzbG93X3Byb3RvY29sX211bHRpY2FzdF9tYWMpLCBCQ01PU19NQUNBRERSX1BBUkFNUygmZnJhbWUtPmRhKSk7CisgICAgfQorCisgICAgaWYgKDAgIT0gbWVtY21wKGZyYW1lLT5zYS51OCwgJmxpbmtfc3RhdGUtPmxpbmtfa2V5LmxpbmsubWFjX2FkZHJlc3MsIHNpemVvZihmcmFtZS0+c2EpKSkKKyAgICB7CisgICAgICAgIHJjID0gQkNNX0VSUl9PTlVfRVJSX1JFU1A7CisgICAgICAgIEVPTl9MSU5LX0xPRyhXQVJOSU5HLCAmbGlua19zdGF0ZS0+bGlua19rZXksCisgICAgICAgICAgICAgICAgICAgICAiU0EgbWlzbWF0Y2ggIkJDTU9TX01BQ0FERFJfRk1UX1NUUiIgIGV4cGVjdGVkIHZzLiAiQkNNT1NfTUFDQUREUl9GTVRfU1RSIiBhY3R1YWxcbiIsCisgICAgICAgICAgICAgICAgICAgICBCQ01PU19NQUNBRERSX1BBUkFNUygmbGlua19zdGF0ZS0+bGlua19rZXkubGluay5tYWNfYWRkcmVzcyksIEJDTU9TX01BQ0FERFJfUEFSQU1TKCZmcmFtZS0+c2EpKTsKKyAgICB9CisKKyAgICBpZiAoc3AtPnUub2FtLmNvbnRlbnQudS5pbmZvLnRsdnNbMF0udS5sb2NhbC5pbmZvLm9hbV92ZXJzaW9uICE9IGdldF9vYW1fdmVyc2lvbigpKQorICAgIHsKKyAgICAgICAgcmMgPSBCQ01fRVJSX09OVV9FUlJfUkVTUDsKKyAgICAgICAgRU9OX0xJTktfTE9HKFdBUk5JTkcsICZsaW5rX3N0YXRlLT5saW5rX2tleSwgIm9hbSB2ZXJzaW9uIG1pc21hdGNoIDB4JTAyeCBleHBlY3RlZCB2cy4gMHglMDJ4IGFjdHVhbFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIGdldF9vYW1fdmVyc2lvbigpLCBzcC0+dS5vYW0uY29udGVudC51LmluZm8udGx2c1swXS51LmxvY2FsLmluZm8ub2FtX3ZlcnNpb24pOworICAgIH0KKworICAgIC8qIElzIHRoZSBmYXIgZW5kIGVjaG9pbmcgdGhlIFRMViB3ZSBzZW50PyAqLworICAgIGlmICgoc3AtPnUub2FtLmNvbnRlbnQudS5pbmZvLnRsdnNfY291bnQgPiAxKSAmJgorICAgICAgICAoc3AtPnUub2FtLmNvbnRlbnQudS5pbmZvLnRsdnNbMV0udHlwZSA9PSBCQ01PTFRfRVBPTl9PQU1fSU5GT19UTFZfVFlQRV9SRU1PVEUpKQorICAgIHsKKyAgICAgICAgaWYgKHNwLT51Lm9hbS5jb250ZW50LnUuaW5mby50bHZzWzBdLnUubG9jYWwuaW5mby5tYXhfcGR1X3NpemUgIT0KKyAgICAgICAgICAgIHNwLT51Lm9hbS5jb250ZW50LnUuaW5mby50bHZzWzFdLnUucmVtb3RlLmluZm8ubWF4X3BkdV9zaXplKQorICAgICAgICB7CisgICAgICAgICAgICBsaW5rX3N0YXRlLT5tYXhfcGR1X3NpemUgPSBNSU4oCisgICAgICAgICAgICAgICAgc3AtPnUub2FtLmNvbnRlbnQudS5pbmZvLnRsdnNbMF0udS5sb2NhbC5pbmZvLm1heF9wZHVfc2l6ZSwKKyAgICAgICAgICAgICAgICBzcC0+dS5vYW0uY29udGVudC51LmluZm8udGx2c1sxXS51LnJlbW90ZS5pbmZvLm1heF9wZHVfc2l6ZSk7CisgICAgICAgICAgICBsaW5rX3N0YXRlLT5yZXZpc2lvbisrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2xvY2FsX3JlbW90ZV9pbmZvIGxvY190bHYgPSB7fTsKKyAgICAgICAgICAgIGZpbGxfbG9jYWxfdGx2KGxpbmtfc3RhdGUsICZsb2NfdGx2KTsKKyAgICAgICAgICAgIGlmICgwID09IG1lbWNtcCgmbG9jX3RsdiwgJnNwLT51Lm9hbS5jb250ZW50LnUuaW5mby50bHZzWzFdLnUucmVtb3RlLmluZm8sIHNpemVvZihsb2NfdGx2KSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGlua19zdGF0ZS0+b2FtX3N0YXRlID0gKGxpbmtfc3RhdGUtPm9hbV9zdGF0ZSB8IEJDTU9MVF9FUE9OX09BTV9PQU1fRkxBR1NfTE9DQUxfU1RBQkxFKSAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKH5CQ01PTFRfRVBPTl9PQU1fT0FNX0ZMQUdTX0xPQ0FMX0VWQUxVQVRJTkcpOworICAgICAgICAgICAgICAgIEVPTl9MSU5LX0xPRyhERUJVRywgJmxpbmtfc3RhdGUtPmxpbmtfa2V5LCAic2V0dGluZyBMT0NBTCBTVEFCTEUgZmxhZ1xuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRU9OX0xJTktfTE9HKFdBUk5JTkcsICZsaW5rX3N0YXRlLT5saW5rX2tleSwgIlJlbW90ZSBUTFYgZnJvbSBPTlUgZG9lcyBOT1QgbWF0Y2ggd2hhdCB3ZSBzZW50XG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzcC0+dS5vYW0uZmxhZ3MgJiBCQ01PTFRfRVBPTl9PQU1fT0FNX0ZMQUdTX0xPQ0FMX0VWQUxVQVRJTkcpCisgICAgeworICAgICAgICBsaW5rX3N0YXRlLT5vYW1fc3RhdGUgPSAobGlua19zdGF0ZS0+b2FtX3N0YXRlIHwgQkNNT0xUX0VQT05fT0FNX09BTV9GTEFHU19SRU1PVEVfRVZBTFVBVElORykgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAofkJDTU9MVF9FUE9OX09BTV9PQU1fRkxBR1NfUkVNT1RFX1NUQUJMRSk7CisgICAgICAgIEVPTl9MSU5LX0xPRyhERUJVRywgJmxpbmtfc3RhdGUtPmxpbmtfa2V5LCAic2V0dGluZyBSRU1PVEUgRVZBTCBmbGFnXG4iKTsKKyAgICB9CisKKyAgICBpZiAoc3AtPnUub2FtLmZsYWdzICYgQkNNT0xUX0VQT05fT0FNX09BTV9GTEFHU19MT0NBTF9TVEFCTEUpCisgICAgeworICAgICAgICBsaW5rX3N0YXRlLT5vYW1fc3RhdGUgPSAobGlua19zdGF0ZS0+b2FtX3N0YXRlIHwgQkNNT0xUX0VQT05fT0FNX09BTV9GTEFHU19SRU1PVEVfU1RBQkxFKSAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh+QkNNT0xUX0VQT05fT0FNX09BTV9GTEFHU19SRU1PVEVfRVZBTFVBVElORyk7CisgICAgICAgIEVPTl9MSU5LX0xPRyhERUJVRywgJmxpbmtfc3RhdGUtPmxpbmtfa2V5LCAic2V0dGluZyBSRU1PVEUgU1RBQkxFIGZsYWdcbiIpOworICAgIH0KKworICAgIGlmIChMT0NBTF9TVEFCTEVfUkVNT1RFX1NUQUJMRSA9PSBsaW5rX3N0YXRlLT5vYW1fc3RhdGUpCisgICAgeworICAgICAgICByYyA9IEJDTV9FUlJfT0s7IC8qIGJhc2ljIG5lZ290aWF0aW9uIGNvbXBsZXRlICovCisgICAgfQorCisgICAgaWYgKChzcC0+dS5vYW0uY29udGVudC51LmluZm8udGx2c19jb3VudCA+IDIpICYmCisgICAgICAgIChzcC0+dS5vYW0uY29udGVudC51LmluZm8udGx2c1syXS50eXBlID09IEJDTU9MVF9FUE9OX09BTV9JTkZPX1RMVl9UWVBFX09SR0FOSVpBVElPTl9TUEVDSUZJQykpCisgICAgeworICAgICAgICBvcmdfc3BlYyA9ICZzcC0+dS5vYW0uY29udGVudC51LmluZm8udGx2c1syXS51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZTsKKyAgICB9CisgICAgcnhfb3JnX3NwZWNfdGx2W2xpbmtfc3RhdGUtPm9hbV9zZXRdKGxpbmtfc3RhdGUsIG9yZ19zcGVjLCAmcmMpOworCisgICAgRU9OX0xJTktfTE9HKERFQlVHLCAmbGlua19zdGF0ZS0+bGlua19rZXksICJzdGF0ZSAlMDR4IC0+ICUwNHggKCVzKVxuIiwKKyAgICAgICAgICAgICAgICAgc3RhcnRfc3RhdGUsIGxpbmtfc3RhdGUtPm9hbV9zdGF0ZSwgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKworICAgIGJjbW9zX2ZyZWUoZnJhbWUpOworCisgICAgcmV0dXJuIHJjOworfQorCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vvbi9vYW1fc2V0cy9vYW1fY29tbW9uLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vvbi9vYW1fc2V0cy9vYW1fY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBmMDhiMgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZW9uL29hbV9zZXRzL29hbV9jb21tb24uaApAQCAtMCwwICsxLDU2IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyovCisKKy8qIFRoaXMgZmlsZSBjb250YWlucyB0aGUgcGllY2VzIG9mIHRoZSBPQU0gbmVnb3RpYXRpb24gc3RhdGUgbWFjaGluZSB0aGF0IGFyZSBjb21tb24gdG8gYWxsIE9BTS4gKi8KKworI2lmbmRlZiBfT0FNX0NPTU1PTl9IXworI2RlZmluZSBfT0FNX0NPTU1PTl9IXworCisjaW5jbHVkZSAiYmNtb2x0X2Vvbl9wcml2YXRlLmgiCisKKyNkZWZpbmUgTE9DQUxfRVZBTF9SRU1PVEVfRVZBTFwKKyAgICAoQkNNT0xUX0VQT05fT0FNX09BTV9GTEFHU19MT0NBTF9FVkFMVUFUSU5HIHwgQkNNT0xUX0VQT05fT0FNX09BTV9GTEFHU19SRU1PVEVfRVZBTFVBVElORykKKyNkZWZpbmUgTE9DQUxfU1RBQkxFX1JFTU9URV9FVkFMXAorICAgIChCQ01PTFRfRVBPTl9PQU1fT0FNX0ZMQUdTX0xPQ0FMX1NUQUJMRSB8IEJDTU9MVF9FUE9OX09BTV9PQU1fRkxBR1NfUkVNT1RFX0VWQUxVQVRJTkcpCisjZGVmaW5lIExPQ0FMX1NUQUJMRV9SRU1PVEVfU1RBQkxFXAorICAgIChCQ01PTFRfRVBPTl9PQU1fT0FNX0ZMQUdTX0xPQ0FMX1NUQUJMRSB8IEJDTU9MVF9FUE9OX09BTV9PQU1fRkxBR1NfUkVNT1RFX1NUQUJMRSkKKwordHlwZWRlZiB2b2lkICgqb2FtX2luZm9fYWRkX3RsdikoZW9uX2xpbmtfc3RhdGUgKmxpbmtfc3RhdGUsIGJjbW9sdF9lcG9uX29hbV9vYW1fcGR1X2NvbnRlbnQgKm9hbSk7CisKK3R5cGVkZWYgdm9pZCAoKm9hbV9yeF9vcmdfc3BlY190bHYpKAorICAgIGVvbl9saW5rX3N0YXRlICpsaW5rX3N0YXRlLAorICAgIGJjbW9sdF9lcG9uX29hbV9vcmdhbml6YXRpb25fc3BlY2lmaWNfaW5mbyAqb3JnX3NwZWMsCisgICAgYmNtb3NfZXJybm8gKnJjKTsKKworYmNtb3NfZXJybm8gYnVpbGRfdHhfaW5mb19mcmFtZShlb25fbGlua19zdGF0ZSAqbGlua19zdGF0ZSwgZW9uX2ZyYW1lX2RhdGEgKmZyYW1lX2RhdGEpOworCitiY21vc19lcnJubyBoYW5kbGVfcnhfaW5mb19mcmFtZShlb25fbGlua19zdGF0ZSAqbGlua19zdGF0ZSwgdWludDE2X3QgcnhfbGVuZ3RoLCB1aW50OF90ICpyeF9wYXlsb2FkKTsKKworI2VuZGlmIC8vIF9PQU1fQ09NTU9OX0gKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lcG9uX2hkZS9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZXBvbl9oZGUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZmMTBmMQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZXBvbl9oZGUvTWFrZWZpbGUKQEAgLTAsMCArMSwxMSBAQAorIyBFUE9OIEhvc3QgRHJpdmVuIEVuY3J5cHRpb24NCisNCitpZmVxICgiJChFTkFCTEVfQ0xJKSIsICJ5IikNCisNCisJTU9EX05BTUUgPSBiY21fdXNlcl9hcHBsX2Vwb25faGRlDQorCU1PRF9UWVBFID0gbGliDQorCU1PRF9ERVBTID0gaG9zdF9hcGkNCisNCisJc3JjcyA9IGJjbW9sdF9lcG9uX2hkZS5jIGVuY3J5cHRfb2FtLmMNCisNCitlbmRpZg0KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZXBvbl9oZGUvYmNtb2x0X2Vwb25faGRlLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vwb25faGRlL2JjbW9sdF9lcG9uX2hkZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwY2IwNzMKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vwb25faGRlL2JjbW9sdF9lcG9uX2hkZS5jCkBAIC0wLDAgKzEsNjkzIEBACisvKgorIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKKyBhZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCisgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCisgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworIG9mIHRoZSBzb2Z0d2FyZS4KKworIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQorIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgd3JpdHRlbiBjb25zZW50LgorCisgOj4KKyAqLworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtb2x0X2FwaS5oPgorI2luY2x1ZGUgPGJjbW9sdF9tb2RlbF90eXBlcy5oPgorI2luY2x1ZGUgPGJjbWNsaV9zZXNzaW9uLmg+CisjaW5jbHVkZSA8YmNtb2x0X21zZ19wYWNrLmg+CisjaW5jbHVkZSA8YmNtX2Rldl9sb2cuaD4KKyNpbmNsdWRlIDxlbmNyeXB0X29hbS5oPgorI2luY2x1ZGUgPG9hbV9kZWZzLmg+CisjaW5jbHVkZSAiYmNtb2x0X2Vwb25faGRlLmgiCisKKyNkZWZpbmUgSERFX1RBU0tfTVNHX1FfU0laRSA2NAorI2RlZmluZSBFTkNfS0VZX0xFTkdUSF9LRVkgMTYKKyNkZWZpbmUgSERFX01BWF9OVU1fTElOS1MgNTEyCisjZGVmaW5lIEtFWV9FWENIQU5HRV9QRVJJT0QgMTUKKwordHlwZWRlZiBlbnVtCit7CisgICAgSERFX0VWRU5UX0VOQUJMRV9FTkNSWVBUSU9OLAorICAgIEhERV9FVkVOVF9ESVNBQkxFX0VOQ1JZUFRJT04sCisgICAgSERFX0VWRU5UX0ZSQU1FX1JYLAorICAgIEhERV9FVkVOVF9PQU1fVElNRU9VVCwKKyAgICBIREVfRVZFTlRfX05VTV9PRgorfSBoZGVfZXZlbnQ7CisKK3R5cGVkZWYgZW51bQoreworICAgIEhERV9TVEFURV9OT1RfRU5DUllQVEVELAorICAgIEhERV9TVEFURV9FTkNSWVBURUQsCisgICAgSERFX1NUQVRFX1dBSVRJTkdfRk9SX09BTV9BQ0ssCisgICAgSERFX1NUQVRFX19OVU1fT0YKK30gaGRlX3N0YXRlOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGJjbW9zX21zZyBvc19tc2c7CisgICAgYmNtb2x0X21zZyAqcng7CisgICAgaGRlX2tleSBrZXk7CisgICAgaGRlX2V2ZW50IGV2ZW50OworfSBoZGVfdGFza19tc2c7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgaGRlX2tleSBoZGVfbGluazsKKyAgICBoZGVfc3RhdGUgc3RhdGU7CisgICAgYmNtb3NfdGltZXIgb2FtX3RpbWVvdXRfdGltZXI7CisgICAgYmNtb2x0X2Vwb25fbGlua19yYXRlIGxpbmtfcmF0ZTsKKyAgICBiY21vbHRfZXBvbl9sbGlkIGxsaWQ7CisgICAgYmNtb3NfbWFjX2FkZHJlc3MgY29ycmVzcG9uZGluZ19wb25fcG9ydF9tYWM7Cit9IGhkZV9saW5rX2RhdGE7CisKK3N0YXRpYyBzdHJ1Y3QKK3sKKyAgICBiY21vc190YXNrIHRhc2s7CisgICAgZGV2X2xvZ19pZCBsb2dfaWRbQkNNVFJfTUFYX09MVFNdOworICAgIGhkZV9saW5rX2RhdGEgKmxpbmtzOworICAgIHVpbnQxNl90IG51bV9saW5rczsKK30gaGRlX2RhdGE7CisKK3N0YXRpYyBiY21vc19ib29sIGlzX3J1bm5pbmcgPSBCQ01PU19GQUxTRTsKKwordHlwZWRlZiB2b2lkICgqbGlua19zdGF0ZV9oYW5kbGVyKShoZGVfbGlua19kYXRhICpoZGVfbGluaywgY29uc3QgYmNtb2x0X21zZyAqaW5kKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmdldF9zdGF0ZV9zdHJpbmcoaGRlX3N0YXRlIHN0YXRlKQoreworICAgIHN3aXRjaCAoc3RhdGUpCisgICAgeworICAgIGNhc2UgSERFX1NUQVRFX05PVF9FTkNSWVBURUQ6CisgICAgICAgIHJldHVybiAibm90IGVuY3J5cHRlZCI7CisgICAgY2FzZSBIREVfU1RBVEVfRU5DUllQVEVEOgorICAgICAgICByZXR1cm4gImVuY3J5cHRlZCI7CisgICAgY2FzZSBIREVfU1RBVEVfV0FJVElOR19GT1JfT0FNX0FDSzoKKyAgICAgICAgcmV0dXJuICJ3YWl0aW5nIGZvciBvYW0gYWNrIjsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gIlVOS05PV04gU1RBVEUhISEiOworICAgIH0KK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHNldF9uZXdfa2V5KGNvbnN0IGhkZV9rZXkgKmhkZV9saW5rLCBiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXIgKm5ld19rZXksIGJjbW9sdF9lcG9uX2tleV9jaG9pY2Uga2V5X2Nob2ljZSwgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9tb2RlIG1vZGUpCit7CisgICAgYmNtb2x0X2Vwb25fbGlua19jZmcgbGlua19jZmc7CisgICAgYmNtb2x0X2Vwb25fZW5jcnlwdGlvbl9jb25maWcgZW5jcnlwdGlvbl9jb25maWcgPSB7IH07CisKKyAgICAvLyBVcC9kb3duIGZvcm1hdCBtdXN0IG1hdGNoIGV2ZW4gd2hlbiBkb2luZyBEUyBvbmx5CisgICAgZW5jcnlwdGlvbl9jb25maWcudXBzdHJlYW1fZW5jcnlwdGlvbl9pbmZvcm1hdGlvbi5mb3JtYXQgPSBuZXdfa2V5LT5mb3JtYXQ7CisKKyAgICBlbmNyeXB0aW9uX2NvbmZpZy5kb3duc3RyZWFtX2VuY3J5cHRpb25faW5mb3JtYXRpb24gPSAqbmV3X2tleTsKKyAgICBlbmNyeXB0aW9uX2NvbmZpZy5kb3duc3RyZWFtX2tleV9jaG9pY2UgPSBrZXlfY2hvaWNlOworICAgIGVuY3J5cHRpb25fY29uZmlnLmRvd25zdHJlYW1fbW9kZSA9IG1vZGU7CisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkgbGlua19rZXkgPQorICAgIHsKKyAgICAgICAgLmVwb25fbmkgPSBoZGVfbGluay0+ZXBvbl9uaSwKKyAgICAgICAgLm1hY19hZGRyZXNzID0gaGRlX2xpbmstPm1hY19hZGRyCisgICAgfTsKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmxpbmtfY2ZnLCBlcG9uX2xpbmssIGxpbmtfa2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZsaW5rX2NmZywgZXBvbl9saW5rLCBlcG9uX2VuY3J5cHRpb24sIGVuY3J5cHRpb25fY29uZmlnKTsKKyAgICByZXR1cm4gYmNtb2x0X2NmZ19zZXQoaGRlX2xpbmstPmRldmljZV9pZCwgJmxpbmtfY2ZnLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBzZXRfcG9uX2VuY3J5cHRpb25faWZfbmVlZGVkKGNvbnN0IGhkZV9rZXkgKmhkZV9saW5rKQoreworICAgIC8vIEZpcnN0IGNoZWNrIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBQT04ncyBlbmNyeXB0aW9uIG1vZGUuCisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgYmNtb2x0X2Vwb25fbmlfY2ZnIHBvbl9jZmc7CisgICAgYmNtb2x0X2Vwb25fbmlfa2V5IHBvbl9rZXkgPSB7IC5lcG9uX25pID0gaGRlX2xpbmstPmVwb25fbmkgfTsKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJnBvbl9jZmcsIGVwb25fbmksIHBvbl9rZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJnBvbl9jZmcsIGVwb25fbmksIGVuY3J5cHRpb25fY2ZnKTsKKyAgICByYyA9IGJjbW9sdF9jZmdfZ2V0KGhkZV9saW5rLT5kZXZpY2VfaWQsICZwb25fY2ZnLmhkcik7CisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBoZGVfZGF0YS5sb2dfaWRbaGRlX2xpbmstPmRldmljZV9pZF0sICJGYWlsdXJlIC0gQ2Fubm90IHF1ZXJ5IFBPTiBlbmNyeXB0aW9uIG1vZGUhLlxuIik7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBpZiAocG9uX2NmZy5kYXRhLmVuY3J5cHRpb25fY2ZnLmRvd25zdHJlYW1fZW5jcnlwdGlvbl9tb2RlICE9IEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fTU9ERV9FUE9OX1pFUk9fT1ZFUkhFQURfQUVTKQorICAgIHsKKyAgICAgICAgLy8gRW5jcnlwdGlvbiBtb2RlIGlzIG5vdCBjb3JyZWN0bHkgc2V0IG9uIHRoZSBQT04sIHNvIHNldCBpdCBub3cuCisgICAgICAgIHBvbl9jZmcuZGF0YS5lbmNyeXB0aW9uX2NmZy5kb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZSA9IEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fTU9ERV9FUE9OX1pFUk9fT1ZFUkhFQURfQUVTOworICAgICAgICBwb25fY2ZnLmRhdGEuZW5jcnlwdGlvbl9jZmcudXBzdHJlYW1fZW5jcnlwdGlvbl9tb2RlID0gQkNNT0xUX0VQT05fRU5DUllQVElPTl9NT0RFX05PX0VOQ1JZUFRJT047CisgICAgICAgIHJjID0gYmNtb2x0X2NmZ19zZXQoaGRlX2xpbmstPmRldmljZV9pZCwgJnBvbl9jZmcuaGRyKTsKKyAgICAgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGhkZV9kYXRhLmxvZ19pZFtoZGVfbGluay0+ZGV2aWNlX2lkXSwgIkZhaWx1cmUgLSBDYW5ub3Qgc2V0IFBPTiBlbmNyeXB0aW9uIG1vZGUhLlxuIik7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9sdF9lcG9uX2xpbmtfcmF0ZSBnZXRfbGlua19yYXRlKGNvbnN0IGhkZV9rZXkgKmhkZV9saW5rKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGJjbW9sdF9lcG9uX2xpbmtfY2ZnIGxpbmtfY2ZnOworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGxpbmtfa2V5ID0KKyAgICB7CisgICAgICAgIC5lcG9uX25pID0gaGRlX2xpbmstPmVwb25fbmksCisgICAgICAgIC5tYWNfYWRkcmVzcyA9IGhkZV9saW5rLT5tYWNfYWRkcgorICAgIH07CisgICAgQkNNT0xUX0NGR19JTklUKCZsaW5rX2NmZywgZXBvbl9saW5rLCBsaW5rX2tleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmbGlua19jZmcsIGVwb25fbGluaywgbGlua19yYXRlKTsKKyAgICByYyA9IGJjbW9sdF9jZmdfZ2V0KGhkZV9saW5rLT5kZXZpY2VfaWQsICZsaW5rX2NmZy5oZHIpOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgQkNNX0xPRygKKyAgICAgICAgICAgIEVSUk9SLAorICAgICAgICAgICAgaGRlX2RhdGEubG9nX2lkW2hkZV9saW5rLT5kZXZpY2VfaWRdLAorICAgICAgICAgICAgIkZhaWx1cmUgLSBjYW5ub3QgcXVlcnkgbGluayByYXRlIGZvciBsaW5rICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IS5cbiIsCisgICAgICAgICAgICBoZGVfbGluay0+bWFjX2FkZHIudThbMF0sCisgICAgICAgICAgICBoZGVfbGluay0+bWFjX2FkZHIudThbMV0sCisgICAgICAgICAgICBoZGVfbGluay0+bWFjX2FkZHIudThbMl0sCisgICAgICAgICAgICBoZGVfbGluay0+bWFjX2FkZHIudThbM10sCisgICAgICAgICAgICBoZGVfbGluay0+bWFjX2FkZHIudThbNF0sCisgICAgICAgICAgICBoZGVfbGluay0+bWFjX2FkZHIudThbNV0pOworICAgIH0KKyAgICByZXR1cm4gbGlua19jZmcuZGF0YS5saW5rX3JhdGU7Cit9CisKK3N0YXRpYyBiY21vc19tYWNfYWRkcmVzcyBnZXRfcG9uX21hYyhjb25zdCBoZGVfa2V5ICpoZGVfbGluaykKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBiY21vbHRfZXBvbl9uaV9jZmcgcG9uX2NmZzsKKyAgICBiY21vbHRfZXBvbl9uaV9rZXkgcG9uX2tleSA9IHsgLmVwb25fbmkgPSBoZGVfbGluay0+ZXBvbl9uaSB9OworICAgIEJDTU9MVF9DRkdfSU5JVCgmcG9uX2NmZywgZXBvbl9uaSwgcG9uX2tleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmcG9uX2NmZywgZXBvbl9uaSwgbWFjX2FkZHJlc3MpOworICAgIHJjID0gYmNtb2x0X2NmZ19nZXQoaGRlX2xpbmstPmRldmljZV9pZCwgJnBvbl9jZmcuaGRyKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGhkZV9kYXRhLmxvZ19pZFtoZGVfbGluay0+ZGV2aWNlX2lkXSwgIkZhaWx1cmUgLSBDYW5ub3QgcXVlcnkgUE9OIG1hYyBhZGRyZXNzIS5cbiIpOworICAgIH0KKyAgICByZXR1cm4gcG9uX2NmZy5kYXRhLm1hY19hZGRyZXNzOworfQorCitzdGF0aWMgYmNtb2x0X2Vwb25fbGxpZCBnZXRfbGxpZChjb25zdCBoZGVfa2V5ICpoZGVfbGluaykKK3sKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBiY21vbHRfZXBvbl9saW5rX2NmZyBsaW5rX2NmZzsKKyAgICBiY21vbHRfZXBvbl9saW5rX2tleSBsaW5rX2tleSA9CisgICAgeworICAgICAgICAuZXBvbl9uaSA9IGhkZV9saW5rLT5lcG9uX25pLAorICAgICAgICAubWFjX2FkZHJlc3MgPSBoZGVfbGluay0+bWFjX2FkZHIKKyAgICB9OworICAgIEJDTU9MVF9DRkdfSU5JVCgmbGlua19jZmcsIGVwb25fbGluaywgbGlua19rZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmxpbmtfY2ZnLCBlcG9uX2xpbmssIGxsaWQpOworICAgIHJjID0gYmNtb2x0X2NmZ19nZXQoaGRlX2xpbmstPmRldmljZV9pZCwgJmxpbmtfY2ZnLmhkcik7CisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBCQ01fTE9HKAorICAgICAgICAgICAgRVJST1IsCisgICAgICAgICAgICBoZGVfZGF0YS5sb2dfaWRbaGRlX2xpbmstPmRldmljZV9pZF0sCisgICAgICAgICAgICAiRmFpbHVyZSAtIGNhbm5vdCBxdWVyeSBMTElEIGZvciBsaW5rICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IS5cbiIsCisgICAgICAgICAgICBoZGVfbGluay0+bWFjX2FkZHIudThbMF0sCisgICAgICAgICAgICBoZGVfbGluay0+bWFjX2FkZHIudThbMV0sCisgICAgICAgICAgICBoZGVfbGluay0+bWFjX2FkZHIudThbMl0sCisgICAgICAgICAgICBoZGVfbGluay0+bWFjX2FkZHIudThbM10sCisgICAgICAgICAgICBoZGVfbGluay0+bWFjX2FkZHIudThbNF0sCisgICAgICAgICAgICBoZGVfbGluay0+bWFjX2FkZHIudThbNV0pOworICAgIH0KKyAgICByZXR1cm4gbGlua19jZmcuZGF0YS5sbGlkOworfQorCisvKiBCeSBzcGVjIHRoZSBTQ0kgaXMgdGhlIExMSUQgb2YgdGhlIGxpbmsgYXBwZW5kZWQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZXBvbiBwb3J0IG1hYyBhZGRyZXNzICovCitzdGF0aWMgdm9pZCBjcmVhdGVfc2NpKGNvbnN0IGJjbW9zX21hY19hZGRyZXNzICplcG9uX3BvcnRfbWFjLCBiY21vbHRfZXBvbl9sbGlkIGxsaWQsIHVpbnQ4X3QgKnNjaSkKK3sKKyAgICBzY2lbN10gPSAodWludDhfdCkgbGxpZDsKKyAgICBzY2lbNl0gPSAodWludDhfdCkgKGxsaWQgPj4gOCk7CisgICAgc2NpWzVdID0gZXBvbl9wb3J0X21hYy0+dThbNV07CisgICAgc2NpWzRdID0gZXBvbl9wb3J0X21hYy0+dThbNF07CisgICAgc2NpWzNdID0gZXBvbl9wb3J0X21hYy0+dThbM107CisgICAgc2NpWzJdID0gZXBvbl9wb3J0X21hYy0+dThbMl07CisgICAgc2NpWzFdID0gZXBvbl9wb3J0X21hYy0+dThbMV07CisgICAgc2NpWzBdID0gZXBvbl9wb3J0X21hYy0+dThbMF07Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9ub3RfZW5jcnlwdGVkX2VuYWJsZV9lbmNyeXB0aW9uKGhkZV9saW5rX2RhdGEgKmhkZV9saW5rLCBjb25zdCBiY21vbHRfbXNnICppbmQpCit7CisgICAgZHBvZV9lbmNyeXB0X21vZGUgbW9kZSA9IERQT0VfRU5DUllQVF9NT0RFX05PTkU7CisgICAgLy8gUmV0cmVpdmUgdXNlZnVsIGxpbmsgaW5mbyBhbmQgc3RvcmUgaXQgdG8gc2F2ZSBtZXNzYWdlcyBsYXRlci4KKyAgICBoZGVfbGluay0+bGlua19yYXRlID0gZ2V0X2xpbmtfcmF0ZSgmaGRlX2xpbmstPmhkZV9saW5rKTsKKyAgICBoZGVfbGluay0+Y29ycmVzcG9uZGluZ19wb25fcG9ydF9tYWMgPSBnZXRfcG9uX21hYygmaGRlX2xpbmstPmhkZV9saW5rKTsKKyAgICBoZGVfbGluay0+bGxpZCA9IGdldF9sbGlkKCZoZGVfbGluay0+aGRlX2xpbmspOworCisgICAgaWYgKGhkZV9saW5rLT5saW5rX3JhdGUgPT0gQkNNT0xUX0VQT05fTElOS19SQVRFX1RFTl9URU4gfHwgaGRlX2xpbmstPmxpbmtfcmF0ZSA9PSBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfVEVOX09ORSkKKyAgICB7CisgICAgICAgIG1vZGUgPSBEUE9FX0VOQ1JZUFRfTU9ERV8xMERPV047CisgICAgfQorICAgIGVsc2UgaWYgKGhkZV9saW5rLT5saW5rX3JhdGUgPT0gQkNNT0xUX0VQT05fTElOS19SQVRFX09ORV9PTkUpCisgICAgeworICAgICAgICBtb2RlID0gRFBPRV9FTkNSWVBUX01PREVfMURPV047CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGhkZV9kYXRhLmxvZ19pZFtoZGVfbGluay0+aGRlX2xpbmsuZGV2aWNlX2lkXSwgIkZhaWx1cmUgLSBVTktOT1dOIExJTksgUkFURSEhIS5cbiIpOworICAgIH0KKworICAgIGRwb2VfZW5jcnlwdF9vYW1fc2V0X3JlcXVlc3Rfc2VuZCgKKyAgICAgICAgJmhkZV9saW5rLT5oZGVfbGluaywKKyAgICAgICAgS0VZX0VYQ0hBTkdFX1BFUklPRCwKKyAgICAgICAgbW9kZSwKKyAgICAgICAgaGRlX2xpbmstPmNvcnJlc3BvbmRpbmdfcG9uX3BvcnRfbWFjKTsKKworICAgIGJjbW9zX3RpbWVyX3N0YXJ0KCZoZGVfbGluay0+b2FtX3RpbWVvdXRfdGltZXIsIEhERV9FTkFCTEVfT0FNX1dBSVRfVVMgKyBPQU1fVElNRU9VVF9HUkFDRV9QRVJJT0RfVVMpOworCisgICAgaGRlX2xpbmstPnN0YXRlID0gSERFX1NUQVRFX1dBSVRJTkdfRk9SX09BTV9BQ0s7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9lbmNyeXB0ZWRfZGlzYWJsZV9lbmNyeXB0aW9uKGhkZV9saW5rX2RhdGEgKmhkZV9saW5rLCBjb25zdCBiY21vbHRfbXNnICppbmQpCit7CisgICAgYmNtb2x0X2VuY3J5cHRpb25faW5mb3JtYXRpb25fY29udGFpbmVyIGVtcHR5X2tleSA9IHsgfTsKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIC8vIFR1cm4gb2ZmIGVuY3J5cHRpb24gb24gdGhlIGVtYmVkZGVkIHNpZGUuCisgICAgcmMgPSBzZXRfbmV3X2tleSgmaGRlX2xpbmstPmhkZV9saW5rLCAmZW1wdHlfa2V5LCBCQ01PTFRfRVBPTl9LRVlfQ0hPSUNFX0tFWV8wLCBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX01PREVfTk9fRU5DUllQVElPTik7CisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBoZGVfZGF0YS5sb2dfaWRbaGRlX2xpbmstPmhkZV9saW5rLmRldmljZV9pZF0sCisgICAgICAgICAgICAiRmFpbHVyZSAtIENhbm5vdCBjb21tdW5pY2F0ZSB3aXRoIHRoZSBlbWJlZGRlZCEuXG4iKTsKKyAgICB9CisKKyAgICAvLyBTZW5kIHRoZSBkaXNhYmxlIE9BTSB0byB0aGUgbGluay4gRG9uJ3QgYm90aGVyIHdhaXRpbmcgZm9yIGEgcmVzcG9uc2UuCisgICAgZHBvZV9lbmNyeXB0X29hbV9zZXRfcmVxdWVzdF9zZW5kKCZoZGVfbGluay0+aGRlX2xpbmssIDAsIERQT0VfRU5DUllQVF9NT0RFX05PTkUsIGdldF9wb25fbWFjKCZoZGVfbGluay0+aGRlX2xpbmspKTsKKworICAgIGhkZV9saW5rLT5zdGF0ZSA9IEhERV9TVEFURV9OT1RfRU5DUllQVEVEOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfZW5jcnlwdGVkX2ZyYW1lX3J4KGhkZV9saW5rX2RhdGEgKmhkZV9saW5rLCBjb25zdCBiY21vbHRfbXNnICppbmQpCit7CisgICAgY29uc3QgYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZCAqZnJhbWVfY2FwdHVyZWQgPSAoY29uc3QgYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZCopIGluZDsKKyAgICB1aW50OF90IG5ld19rZXlbMTZdOworICAgIGJjbW9sdF9lcG9uX2tleV9jaG9pY2Uga2V5X2Nob2ljZTsKKyAgICBiY21vc19lcnJubyByYzsKKyAgICBiY21vbHRfZW5jcnlwdGlvbl9pbmZvcm1hdGlvbl9jb250YWluZXIga2V5X2Zvcl9lbWJlZGRlZDsKKyAgICByYyA9IGRwb2VfZW5jcnlwdF9vYW1fcGFyc2VfbmV3X2tleSgmZnJhbWVfY2FwdHVyZWQtPmRhdGEuZnJhbWUsIG5ld19rZXksICZrZXlfY2hvaWNlKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8vIE5vdCBhIERQb0UgbmV3IGtleSwgaWdub3JlIGl0CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoaGRlX2xpbmstPmxpbmtfcmF0ZSA9PSBCQ01PTFRfRVBPTl9MSU5LX1JBVEVfVEVOX1RFTiB8fCBoZGVfbGluay0+bGlua19yYXRlID09IEJDTU9MVF9FUE9OX0xJTktfUkFURV9URU5fT05FKQorICAgIHsKKyAgICAgICAgdWludDhfdCBzY2lbOF07CisgICAgICAgIGNyZWF0ZV9zY2koJmhkZV9saW5rLT5jb3JyZXNwb25kaW5nX3Bvbl9wb3J0X21hYywgaGRlX2xpbmstPmxsaWQsIHNjaSk7CisgICAgICAgIGtleV9mb3JfZW1iZWRkZWQuZm9ybWF0ID0gQkNNT0xUX0VQT05fRU5DUllQVElPTl9JTkZPUk1BVElPTl9GT1JNQVRfQ1RSOworICAgICAgICBtZW1jcHkoa2V5X2Zvcl9lbWJlZGRlZC51LmN0ci5rZXksIG5ld19rZXksIHNpemVvZihuZXdfa2V5KSk7CisgICAgICAgIG1lbWNweShrZXlfZm9yX2VtYmVkZGVkLnUuY3RyLnNjaSwgc2NpLCBzaXplb2Yoc2NpKSk7CisgICAgfQorICAgIGVsc2UgaWYgKGhkZV9saW5rLT5saW5rX3JhdGUgPT0gQkNNT0xUX0VQT05fTElOS19SQVRFX09ORV9PTkUpCisgICAgeworICAgICAgICBrZXlfZm9yX2VtYmVkZGVkLmZvcm1hdCA9IEJDTU9MVF9FUE9OX0VOQ1JZUFRJT05fSU5GT1JNQVRJT05fRk9STUFUX0NGQjsKKyAgICAgICAgbWVtY3B5KGtleV9mb3JfZW1iZWRkZWQudS5jZmIua2V5LCBuZXdfa2V5LCBzaXplb2YobmV3X2tleSkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBoZGVfZGF0YS5sb2dfaWRbaGRlX2xpbmstPmhkZV9saW5rLmRldmljZV9pZF0sICJGYWlsdXJlIC0gVU5LTk9XTiBMSU5LIFJBVEUhISEuXG4iKTsKKyAgICB9CisKKyAgICByYyA9IHNldF9uZXdfa2V5KCZoZGVfbGluay0+aGRlX2xpbmssICZrZXlfZm9yX2VtYmVkZGVkLCBrZXlfY2hvaWNlLCBCQ01PTFRfRVBPTl9FTkNSWVBUSU9OX01PREVfRVBPTl9aRVJPX09WRVJIRUFEX0FFUyk7CisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBoZGVfZGF0YS5sb2dfaWRbaGRlX2xpbmstPmhkZV9saW5rLmRldmljZV9pZF0sCisgICAgICAgICAgICAiRmFpbHVyZSAtIENhbm5vdCBjb21tdW5pY2F0ZSB3aXRoIHRoZSBlbWJlZGRlZCEuXG4iKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV93YWl0aW5nX2Zvcl9vYW1fYWNrX29hbV90aW1lb3V0KGhkZV9saW5rX2RhdGEgKmhkZV9saW5rLCBjb25zdCBiY21vbHRfbXNnICppbmQpCit7CisgICAgQkNNX0xPRyhFUlJPUiwgaGRlX2RhdGEubG9nX2lkW2hkZV9saW5rLT5oZGVfbGluay5kZXZpY2VfaWRdLCAiRmFpbHVyZSAtIE5vIHJlc3BvbnNlIHRvIGluaXRpYWwgT0FNLlxuIik7CisgICAgaGRlX2xpbmstPnN0YXRlID0gSERFX1NUQVRFX05PVF9FTkNSWVBURUQ7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV93YWl0aW5nX2Zvcl9vYW1fYWNrX2ZyYW1lX3J4KGhkZV9saW5rX2RhdGEgKmhkZV9saW5rLCBjb25zdCBiY21vbHRfbXNnICppbmQpCit7CisgICAgY29uc3QgYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZCAqZnJhbWVfY2FwdHVyZWQgPSAoY29uc3QgYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZCopIGluZDsKKyAgICB1aW50OF90IGVuY3J5cHRfbW9kZV9yZXNwb25zZTsKKyAgICB1aW50OF90IGtleV9leHBpcnlfcmVzcG9uc2U7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICByYyA9IGRwb2VfZW5jcnlwdF9vYW1fcGFyc2Vfc2V0X3Jlc3BvbnNlKCZmcmFtZV9jYXB0dXJlZC0+ZGF0YS5mcmFtZSwgJmVuY3J5cHRfbW9kZV9yZXNwb25zZSwgJmtleV9leHBpcnlfcmVzcG9uc2UpOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgLy8gTm90IGEgZW5jcnlwdGlvbiBzZXQgcmVwb25zZSwgaWdub3JlIGl0CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiAwIHJlcHJlc2VudHMgJ25vIGVycm9yJy4gKi8KKyAgICBpZiAoKGVuY3J5cHRfbW9kZV9yZXNwb25zZSAhPSAwKSB8fCAoa2V5X2V4cGlyeV9yZXNwb25zZSAhPSAwKSkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGhkZV9kYXRhLmxvZ19pZFtoZGVfbGluay0+aGRlX2xpbmsuZGV2aWNlX2lkXSwKKyAgICAgICAgICAgICJGYWlsdXJlIC0gVGhlIGxpbmsgcmVmdXNlZCBvbmUgb2YgdGhlIHJlcXVlc3RlZCBUTFZzLlxuIik7CisgICAgICAgIGhkZV9saW5rLT5zdGF0ZSA9IEhERV9TVEFURV9OT1RfRU5DUllQVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gV2UgaGF2ZSBhbiBhcHByb3ByaWF0ZSByZXNwb25zZSwgc28gbW92ZSBvbiBub3JtYWxseS4KKyAgICBiY21vc190aW1lcl9zdG9wKCZoZGVfbGluay0+b2FtX3RpbWVvdXRfdGltZXIpOworICAgIGhkZV9saW5rLT5zdGF0ZSA9IEhERV9TVEFURV9FTkNSWVBURUQ7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV93YWl0aW5nX2Zvcl9vYW1fYWNrX2Rpc2FibGVfZW5jcnlwdGlvbihoZGVfbGlua19kYXRhICpoZGVfbGluaywgY29uc3QgYmNtb2x0X21zZyAqaW5kKQoreworICAgIGhkZV9saW5rLT5zdGF0ZSA9IEhERV9TVEFURV9OT1RfRU5DUllQVEVEOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfaWdub3JlKGhkZV9saW5rX2RhdGEgKmhkZV9saW5rLCBjb25zdCBiY21vbHRfbXNnICppbmQpCit7CisgICAgLy8gTGl0ZXJhbGx5IGRvIG5vdGhpbmcKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX2Vycm9yKGhkZV9saW5rX2RhdGEgKmhkZV9saW5rLCBjb25zdCBiY21vbHRfbXNnICppbmQpCit7CisgICAgQkNNX0xPRyhFUlJPUiwgaGRlX2RhdGEubG9nX2lkW2hkZV9saW5rLT5oZGVfbGluay5kZXZpY2VfaWRdLCAiVW5leHBlY3RlZCBldmVudCBpbiBzdGF0ZSAlc1xuIiwKKyAgICAgICAgZ2V0X3N0YXRlX3N0cmluZyhoZGVfbGluay0+c3RhdGUpKTsKK30KKworc3RhdGljIGxpbmtfc3RhdGVfaGFuZGxlciBsaW5rX3N0YXRlX21hY2hpbmVbSERFX1NUQVRFX19OVU1fT0ZdW0hERV9FVkVOVF9fTlVNX09GXSA9Cit7CisgICAgW0hERV9TVEFURV9OT1RfRU5DUllQVEVEXSA9CisgICAgeworICAgICAgICBbSERFX0VWRU5UX0VOQUJMRV9FTkNSWVBUSU9OXSA9IGhhbmRsZV9ub3RfZW5jcnlwdGVkX2VuYWJsZV9lbmNyeXB0aW9uLAorICAgICAgICBbSERFX0VWRU5UX0RJU0FCTEVfRU5DUllQVElPTl0gPSBoYW5kbGVfZXJyb3IsCisgICAgICAgIFtIREVfRVZFTlRfRlJBTUVfUlhdID0gaGFuZGxlX2lnbm9yZSwKKyAgICAgICAgW0hERV9FVkVOVF9PQU1fVElNRU9VVF0gPSBoYW5kbGVfaWdub3JlLAorICAgIH0sCisgICAgW0hERV9TVEFURV9FTkNSWVBURURdID0KKyAgICB7CisgICAgICAgIFtIREVfRVZFTlRfRU5BQkxFX0VOQ1JZUFRJT05dID0gaGFuZGxlX2Vycm9yLAorICAgICAgICBbSERFX0VWRU5UX0RJU0FCTEVfRU5DUllQVElPTl0gPSBoYW5kbGVfZW5jcnlwdGVkX2Rpc2FibGVfZW5jcnlwdGlvbiwKKyAgICAgICAgW0hERV9FVkVOVF9GUkFNRV9SWF0gPSBoYW5kbGVfZW5jcnlwdGVkX2ZyYW1lX3J4LAorICAgICAgICBbSERFX0VWRU5UX09BTV9USU1FT1VUXSA9IGhhbmRsZV9pZ25vcmUsCisgICAgfSwKKyAgICBbSERFX1NUQVRFX1dBSVRJTkdfRk9SX09BTV9BQ0tdID0KKyAgICB7CisgICAgICAgIFtIREVfRVZFTlRfRU5BQkxFX0VOQ1JZUFRJT05dID0gaGFuZGxlX2Vycm9yLAorICAgICAgICBbSERFX0VWRU5UX0RJU0FCTEVfRU5DUllQVElPTl0gPSBoYW5kbGVfd2FpdGluZ19mb3Jfb2FtX2Fja19kaXNhYmxlX2VuY3J5cHRpb24sCisgICAgICAgIFtIREVfRVZFTlRfRlJBTUVfUlhdID0gaGFuZGxlX3dhaXRpbmdfZm9yX29hbV9hY2tfZnJhbWVfcngsCisgICAgICAgIFtIREVfRVZFTlRfT0FNX1RJTUVPVVRdID0gaGFuZGxlX3dhaXRpbmdfZm9yX29hbV9hY2tfb2FtX3RpbWVvdXQsCisgICAgfQorfTsKKworc3RhdGljIGludDMyX3QgZmluZF90YWJsZV9pbmRleChjb25zdCBoZGVfa2V5ICpoZGVfbGluaykKK3sKKyAgICB1aW50MTZfdCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBoZGVfZGF0YS5udW1fbGlua3M7ICsraSkKKyAgICB7CisgICAgICAgIGlmIChtZW1jbXAoaGRlX2xpbmssICZoZGVfZGF0YS5saW5rc1tpXSwgc2l6ZW9mKCpoZGVfbGluaykpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgcmVtb3ZlX2xpbmtfZnJvbV90YWJsZShpbnQzMl90IGxpbmtfaW5kZXgpCit7CisgICAgaW50MzJfdCBpOworICAgIGZvciAoaSA9IGxpbmtfaW5kZXg7IGkgPCBoZGVfZGF0YS5udW1fbGlua3MgLSAxOyArK2kpCisgICAgeworICAgICAgICAvKiBCYWNrd2FyZHMgY29weSBhbGwgZGF0YSBleHBlY3QgZm9yIHRoZSB0aW1lciBoYW5kbGUgKi8KKyAgICAgICAgaGRlX2RhdGEubGlua3NbaV0uaGRlX2xpbmsgPSBoZGVfZGF0YS5saW5rc1tpICsgMV0uaGRlX2xpbms7CisgICAgICAgIGhkZV9kYXRhLmxpbmtzW2ldLmxpbmtfcmF0ZSA9IGhkZV9kYXRhLmxpbmtzW2kgKyAxXS5saW5rX3JhdGU7CisgICAgICAgIGhkZV9kYXRhLmxpbmtzW2ldLmxsaWQgPSBoZGVfZGF0YS5saW5rc1tpICsgMV0ubGxpZDsKKyAgICAgICAgaGRlX2RhdGEubGlua3NbaV0uc3RhdGUgPSBoZGVfZGF0YS5saW5rc1tpICsgMV0uc3RhdGU7CisgICAgfQorICAgIC8qIGFsc28gY2xlYXIgdGhlIHN0YXRlIG9mIHRoZSBub3cgZW1wdHkgbGluayAqLworICAgIGhkZV9kYXRhLmxpbmtzW2hkZV9kYXRhLm51bV9saW5rcyAtIDFdLnN0YXRlID0gSERFX1NUQVRFX05PVF9FTkNSWVBURUQ7CisgICAgaGRlX2RhdGEubnVtX2xpbmtzLS07Cit9CisKK3N0YXRpYyB2b2lkIHJ1bl9zdGF0ZV9tYWNoaW5lKGludDMyX3QgbGlua19pbmRleCwgY29uc3QgaGRlX3Rhc2tfbXNnICp0YXNrX21zZykKK3sKKyAgICBpZiAobGlua19pbmRleCA8IDApIC8vIFdlIGRvbid0IGtub3cgb2YgdGhpcyBsaW5rIHlldC4KKyAgICB7CisgICAgICAgIGlmIChoZGVfZGF0YS5udW1fbGlua3MgPT0gSERFX01BWF9OVU1fTElOS1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGhkZV9kYXRhLmxvZ19pZFt0YXNrX21zZy0+a2V5LmRldmljZV9pZF0sICJGYWlsdXJlIC0gQ2Fubm90IGFkZCBhbnkgbW9yZSBsaW5rcyEuXG4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGxpbmtfaW5kZXggPSBoZGVfZGF0YS5udW1fbGlua3M7CisgICAgICAgIGhkZV9kYXRhLmxpbmtzW2xpbmtfaW5kZXhdLmhkZV9saW5rID0gdGFza19tc2ctPmtleTsKKyAgICAgICAgbGlua19zdGF0ZV9tYWNoaW5lW2hkZV9kYXRhLmxpbmtzW2xpbmtfaW5kZXhdLnN0YXRlXVt0YXNrX21zZy0+ZXZlbnRdKCZoZGVfZGF0YS5saW5rc1tsaW5rX2luZGV4XSwgdGFza19tc2ctPnJ4KTsKKworICAgICAgICBpZiAoaGRlX2RhdGEubGlua3NbbGlua19pbmRleF0uc3RhdGUgIT0gSERFX1NUQVRFX05PVF9FTkNSWVBURUQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRoaXMgbGluayBkaWQgbm90IGVuZCBpbiB0aGUgc3RhdGUgJ25vdCBlbmNyeXB0ZWQnLCBzbyB3ZSBuZWVkIHRvIHN0YXJ0IHRyYWNraW5nIGhpbS4KKyAgICAgICAgICAgICsraGRlX2RhdGEubnVtX2xpbmtzOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgLy8gV2UgYWxyZWFkeSBrbm93IG9mIHRoaXMgbGluay4KKyAgICB7CisgICAgICAgIGxpbmtfc3RhdGVfbWFjaGluZVtoZGVfZGF0YS5saW5rc1tsaW5rX2luZGV4XS5zdGF0ZV1bdGFza19tc2ctPmV2ZW50XSgmaGRlX2RhdGEubGlua3NbbGlua19pbmRleF0sIHRhc2tfbXNnLT5yeCk7CisKKyAgICAgICAgaWYgKGhkZV9kYXRhLmxpbmtzW2xpbmtfaW5kZXhdLnN0YXRlID09IEhERV9TVEFURV9OT1RfRU5DUllQVEVEKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUaGUgbGluayBoYXMgaXMgbm8gbG9uZ2VyIGVuY3J5cHRlZCBzbyBsZXRzIGZvcmdldCBhYm91dCBoaW0uCisgICAgICAgICAgICByZW1vdmVfbGlua19mcm9tX3RhYmxlKGxpbmtfaW5kZXgpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBoZGVfaGFuZGxlX2V2ZW50KGJjbW9zX21vZHVsZV9pZCBtb2R1bGVfaWQsIGJjbW9zX21zZyAqb3NfbXNnKQoreworICAgIGhkZV90YXNrX21zZyAqdGFza19tc2cgPSAoaGRlX3Rhc2tfbXNnICopIG9zX21zZzsKKworICAgIGludDMyX3QgbGlua19pbmRleDsKKworICAgIGxpbmtfaW5kZXggPSBmaW5kX3RhYmxlX2luZGV4KCZ0YXNrX21zZy0+a2V5KTsKKyAgICBydW5fc3RhdGVfbWFjaGluZShsaW5rX2luZGV4LCB0YXNrX21zZyk7CisKKyAgICBpZiAodGFza19tc2ctPnJ4ICE9IE5VTEwpCisgICAgeworICAgICAgICBiY21vbHRfbXNnX2ZyZWUodGFza19tc2ctPnJ4KTsKKyAgICB9CisgICAgYmNtb3NfZnJlZSh0YXNrX21zZyk7Cit9CisKK3N0YXRpYyBiY21vc190aW1lcl9yYyBvYW1fcmVzcG9uc2VfdGltZW91dChiY21vc190aW1lciAqdGltZXIsIGxvbmcgZGF0YSkKK3sKKyAgICBoZGVfdGFza19tc2cgKnRhc2tfbXNnID0gYmNtb3NfY2FsbG9jKHNpemVvZigqdGFza19tc2cpKTsKKworICAgIEJVR19VTkxFU1ModGFza19tc2cpOworCisgICAgdGFza19tc2ctPmtleSA9IGhkZV9kYXRhLmxpbmtzW2RhdGFdLmhkZV9saW5rOworICAgIHRhc2tfbXNnLT5ldmVudCA9IEhERV9FVkVOVF9PQU1fVElNRU9VVDsKKyAgICB0YXNrX21zZy0+b3NfbXNnLmhhbmRsZXIgPSBoZGVfaGFuZGxlX2V2ZW50OworCisgICAgYmNtb3NfbXNnX3NlbmRfdG9fbW9kdWxlKEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfRVBPTl9IREUsICZ0YXNrX21zZy0+b3NfbXNnLCBCQ01PU19NU0dfU0VORF9BVVRPX0ZSRUUpOworICAgIHJldHVybiBCQ01PU19USU1FUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGhkZV9zZXRfZW5jcnlwdGlvbihoZGVfa2V5KiBrZXksIGJjbW9zX2Jvb2wgZW5hYmxlZCkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisKKyAgICBoZGVfdGFza19tc2cgKnRhc2tfbXNnID0gYmNtb3NfY2FsbG9jKHNpemVvZigqdGFza19tc2cpKTsKKworICAgIEJVR19VTkxFU1ModGFza19tc2cpOworCisgICAgdGFza19tc2ctPmtleSA9ICprZXk7CisgICAgdGFza19tc2ctPmV2ZW50ID0gZW5hYmxlZCA/IEhERV9FVkVOVF9FTkFCTEVfRU5DUllQVElPTiA6IEhERV9FVkVOVF9ESVNBQkxFX0VOQ1JZUFRJT047CisgICAgdGFza19tc2ctPm9zX21zZy5oYW5kbGVyID0gaGRlX2hhbmRsZV9ldmVudDsKKworICAgIHJjID0gYmNtb3NfbXNnX3NlbmRfdG9fbW9kdWxlKEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfRVBPTl9IREUsICZ0YXNrX21zZy0+b3NfbXNnLCBCQ01PU19NU0dfU0VORF9BVVRPX0ZSRUUpOworICAgIEJVR19PTihyYyAhPSBCQ01fRVJSX09LKTsKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBoZGVfY2xpX2VuYWJsZShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgaGRlX2tleSBrZXkgPQorICAgIHsKKyAgICAgICAgLmRldmljZV9pZCA9IGN1cnJlbnRfZGV2aWNlLAorICAgICAgICAuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSkoYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpLT52YWx1ZS5udW1iZXIpLAorICAgICAgICAubWFjX2FkZHIgPSAoYmNtb3NfbWFjX2FkZHJlc3MpKGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIiktPnZhbHVlLm1hYykKKyAgICB9OworCisgICAgcmMgPSBzZXRfcG9uX2VuY3J5cHRpb25faWZfbmVlZGVkKCZrZXkpOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKyAgICByZXR1cm4gaGRlX3NldF9lbmNyeXB0aW9uKCZrZXksIEJDTU9TX1RSVUUpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gaGRlX2NsaV9kaXNhYmxlKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGhkZV9rZXkga2V5ID0KKyAgICB7CisgICAgICAgIC5kZXZpY2VfaWQgPSBjdXJyZW50X2RldmljZSwKKyAgICAgICAgLmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpKGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKS0+dmFsdWUubnVtYmVyKSwKKyAgICAgICAgLm1hY19hZGRyID0gKGJjbW9zX21hY19hZGRyZXNzKShiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpLT52YWx1ZS5tYWMpCisgICAgfTsKKworICAgIHJldHVybiBoZGVfc2V0X2VuY3J5cHRpb24oJmtleSwgQkNNT1NfRkFMU0UpOworfQorCisvLyBwdWJsaWMgaW5kaWNhdGlvbiBoYW5kbGVyIGludGVyZmFjZSAtLSBjYWxsZWQgaW4gdHJhbnNwb3J0IGxheWVyIGNvbnRleHQKK2JjbW9zX2Vycm5vIGJjbW9sdF9lcG9uX2hkZV9wcm9jZXNzX3J4KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIHVpbnQ4X3QgaW5zdGFuY2UsIGJjbW9sdF9wcm94eV9yeCAqcngpCit7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworICAgIGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWQqIGFjdHVhbF9yeDsKKyAgICBoZGVfdGFza19tc2cgKnRhc2tfbXNnOworICAgIGhkZV9rZXkga2V5OworCisgICAgaWYgKCFpc19ydW5uaW5nKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgLy8gV2Ugb25seSBsb29rIGF0IG1lc3NhZ2UgdGFyZ2V0dGluZyBlcG9uIGxpbmtzLgorICAgIGlmIChyeC0+aGRyLm9ial90eXBlICE9IEJDTU9MVF9PQkpfSURfRVBPTl9MSU5LKQorICAgIHsKKyAgICAgICAgLy8gTm90IGFuIGVycm9yLCB3ZSBqdXN0IGRvbid0IGNhcmUgYWJvdXQgdGhpcyBvYmplY3QuCisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKworICAgIC8vIFRoaXMgaXMgdGhlIG9ubHkga2luZCBvZiBwcm94eSBSWCBjdXJyZW50bHkgc3VwcG9ydGVkLgorICAgIGlmIChyeC0+aGRyLnN1Ymdyb3VwICE9IEJDTU9MVF9FUE9OX0xJTktfUFJPWFlfUlhfSURfRlJBTUVfQ0FQVFVSRUQpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHNhZmUgZHVlIHRvIHRoZSBhYm92ZSBzdWJncm91cCBjaGVjay4KKyAgICBhY3R1YWxfcnggPSAoYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZCopIHJ4OworICAgIGtleS5kZXZpY2VfaWQgPSBkZXZpY2VfaWQ7CisgICAga2V5LmVwb25fbmkgPSBpbnN0YW5jZTsKKyAgICBrZXkubWFjX2FkZHIgPSBhY3R1YWxfcngtPmtleS5tYWNfYWRkcmVzczsKKworICAgIHRhc2tfbXNnID0gYmNtb3NfY2FsbG9jKHNpemVvZigqdGFza19tc2cpKTsKKyAgICBpZiAodGFza19tc2cgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJjID0gQkNNX0VSUl9OT01FTTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYmNtb2x0X21zZyAqcnhfY2xvbmUgPSBOVUxMOworICAgICAgICByYyA9IGJjbW9sdF9tc2dfY2xvbmUoJnJ4X2Nsb25lLCAmcngtPmhkcik7CisgICAgICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vc19mcmVlKHRhc2tfbXNnKTsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorICAgICAgICBhY3R1YWxfcnggPSAoYmNtb2x0X2Vwb25fbGlua19mcmFtZV9jYXB0dXJlZCopIHJ4X2Nsb25lOworCisgICAgICAgIHRhc2tfbXNnLT5yeCA9IHJ4X2Nsb25lOworICAgICAgICB0YXNrX21zZy0+a2V5ID0ga2V5OworICAgICAgICB0YXNrX21zZy0+ZXZlbnQgPSBIREVfRVZFTlRfRlJBTUVfUlg7CisgICAgICAgIHRhc2tfbXNnLT5vc19tc2cuaGFuZGxlciA9IGhkZV9oYW5kbGVfZXZlbnQ7CisgICAgICAgIHJjID0gYmNtb3NfbXNnX3NlbmRfdG9fbW9kdWxlKEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfRVBPTl9IREUsICZ0YXNrX21zZy0+b3NfbXNnLCBCQ01PU19NU0dfU0VORF9BVVRPX0ZSRUUpOworICAgICAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgaGRlX2RhdGEubG9nX2lkW2RldmljZV9pZF0sICJNZXNzYWdlIHNlbmQgZmFpbGVkIVxuIik7CisgICAgICAgICAgICBiY21vbHRfbXNnX2ZyZWUocnhfY2xvbmUpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCit2b2lkIGJjbW9sdF9lcG9uX2hkZV9hcHBsX2NsaV9pbml0KGJjbWNsaV9lbnRyeSAqdG9wX2RpcikKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZGlyX25hbWUgPSAiaGRlIjsKKworICAgIGlmIChiY21jbGlfZGlyX2ZpbmQodG9wX2RpciwgZGlyX25hbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJjbWNsaV9lbnRyeSAqZGlyID0gYmNtY2xpX2Rpcl9hZGQodG9wX2RpciwgZGlyX25hbWUsICJFUE9OIE9BTSBuZWdvdGlhdGlvbiBjb21tYW5kcyIsIEJDTUNMSV9BQ0NFU1NfQURNSU4sIE5VTEwpOworICAgIEJVR19PTihkaXIgPT0gTlVMTCk7CisKKyAgICBCQ01DTElfTUFLRV9DTUQoCisgICAgICAgIGRpciwKKyAgICAgICAgImVuYWJsZSIsCisgICAgICAgICJFbmFibGUgZW5jcnlwdGlvbiBmb3IgYW4gRVBPTiBsaW5rIiwKKyAgICAgICAgaGRlX2NsaV9lbmFibGUsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImVwb25fbmkiLCAiRVBPTiBOSSIsIEJDTUNMSV9QQVJNX05VTUJFUiwgMCksCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oIm1hY19hZGRyZXNzIiwgIk1BQyBhZGRyZXNzIiwgQkNNQ0xJX1BBUk1fTUFDLCAwKSk7CisKKyAgICBCQ01DTElfTUFLRV9DTUQoCisgICAgICAgIGRpciwKKyAgICAgICAgImRpc2FibGUiLAorICAgICAgICAiRGlzYWJsZSBlbmNyeXB0aW9uIGZvciBhbiBFUE9OIGxpbmsiLAorICAgICAgICBoZGVfY2xpX2Rpc2FibGUsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImVwb25fbmkiLCAiRVBPTiBOSSIsIEJDTUNMSV9QQVJNX05VTUJFUiwgMCksCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oIm1hY19hZGRyZXNzIiwgIk1BQyBhZGRyZXNzIiwgQkNNQ0xJX1BBUk1fTUFDLCAwKSk7Cit9CisKK3ZvaWQgYmNtb2x0X2Vwb25faGRlX2FwcGxfaW5pdCh2b2lkKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKyAgICB1aW50MzJfdCBpOworCisgICAgYmNtb3NfdGFza19wYXJtIHRhc2tfcGFyYW1zID0KKyAgICB7CisgICAgICAgIC5uYW1lID0gInVzZXJfYXBwbF9oZGUiLAorICAgICAgICAucHJpb3JpdHkgPSBUQVNLX1BSSU9SSVRZX1VTRVJfQVBQTF9FUE9OX0hERSwKKyAgICAgICAgLmNvcmUgPSBCQ01PU19DUFVfQ09SRV9BTlksIC8qIE5vIENQVSBhZmZpbml0eSAqLworICAgICAgICAuaW5pdF9oYW5kbGVyID0gTlVMTAorICAgIH07CisKKyAgICBiY21vc190aW1lcl9wYXJtIHRpbWVyX3Bhcm0gPQorICAgIHsKKyAgICAgICAgLm5hbWUgPSAib2FtX3RpbWVvdXRfdGltZXIiLAorICAgICAgICAub3duZXIgPSBCQ01PU19NT0RVTEVfSURfTk9ORSwKKyAgICAgICAgLnBlcmlvZGljID0gQkNNT1NfRkFMU0UsCisgICAgICAgIC5oYW5kbGVyID0gb2FtX3Jlc3BvbnNlX3RpbWVvdXQKKyAgICB9OworCisgICAgaWYgKGlzX3J1bm5pbmcpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaXNfcnVubmluZyA9IEJDTU9TX1RSVUU7CisKKyAgICBmb3IgKGk9MDsgaTxCQ01UUl9NQVhfT0xUUzsgaSsrKQorICAgIHsKKyAgICAgICAgY2hhciBsb2dfbmFtZVtNQVhfREVWX0xPR19JRF9OQU1FXTsKKyAgICAgICAgc25wcmludGYobG9nX25hbWUsIHNpemVvZihsb2dfbmFtZSktMSwgInVzZXJfYXBwbF9oZGVfJWQiLCBpKTsKKyAgICAgICAgaGRlX2RhdGEubG9nX2lkW2ldID0gYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIobG9nX25hbWUsIERFVl9MT0dfTEVWRUxfRVJST1IsIERFVl9MT0dfSURfVFlQRV9CT1RIKTsKKyAgICB9CisKKyAgICBoZGVfZGF0YS5saW5rcyA9IGJjbW9zX2NhbGxvYyhIREVfTUFYX05VTV9MSU5LUyAqIHNpemVvZihoZGVfZGF0YS5saW5rc1swXSkpOworICAgIEJVR19PTihoZGVfZGF0YS5saW5rcyA9PSBOVUxMKTsKKworICAgIHJjID0gYmNtb3NfdGFza19jcmVhdGUoJmhkZV9kYXRhLnRhc2ssICZ0YXNrX3BhcmFtcyk7CisgICAgQlVHX09OKHJjICE9IEJDTV9FUlJfT0spOworCisgICAgYmNtb3NfbW9kdWxlX3Bhcm0gbW9kdWxlX3BhcmFtcyA9CisgICAgeworICAgICAgICAucXBhcm0gPSB7IC5uYW1lID0gInVzZXJfYXBwbF9oZGUiLCAuc2l6ZSA9IEhERV9UQVNLX01TR19RX1NJWkUgfQorICAgIH07CisgICAgcmMgPSBiY21vc19tb2R1bGVfY3JlYXRlKEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfRVBPTl9IREUsICZoZGVfZGF0YS50YXNrLCAmbW9kdWxlX3BhcmFtcyk7CisgICAgQlVHX09OKHJjICE9IEJDTV9FUlJfT0spOworCisgICAgZm9yIChpID0gMDsgaSA8IEhERV9NQVhfTlVNX0xJTktTOyArK2kpCisgICAgeworICAgICAgICB0aW1lcl9wYXJtLmRhdGEgPSBpOworICAgICAgICByYyA9IGJjbW9zX3RpbWVyX2NyZWF0ZSgmaGRlX2RhdGEubGlua3NbaV0ub2FtX3RpbWVvdXRfdGltZXIsICZ0aW1lcl9wYXJtKTsKKyAgICAgICAgQlVHX09OKHJjICE9IEJDTV9FUlJfT0spOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZXBvbl9oZGUvYmNtb2x0X2Vwb25faGRlLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vwb25faGRlL2JjbW9sdF9lcG9uX2hkZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlN2Y5NWIKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vwb25faGRlL2JjbW9sdF9lcG9uX2hkZS5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCisgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgb2YgdGhlIHNvZnR3YXJlLgorCisgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKKyB3cml0dGVuIGNvbnNlbnQuCisKKyA6PgorICovCisKKyNpZm5kZWYgQkNNT0xUX0VQT05fSERFX0hfCisjZGVmaW5lIEJDTU9MVF9FUE9OX0hERV9IXworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtb2x0X2FwaS5oPgorI2luY2x1ZGUgPGJjbW9sdF9tb2RlbF90eXBlcy5oPgorI2luY2x1ZGUgPGJjbW9sdF91dGlscy5oPgorI2luY2x1ZGUgPGJjbWNsaS5oPgorCit0eXBlZGVmIHN0cnVjdAoreworICAgIGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQ7CisgICAgYmNtb2x0X2Vwb25fbmkgZXBvbl9uaTsKKyAgICBiY21vc19tYWNfYWRkcmVzcyBtYWNfYWRkcjsKK30gaGRlX2tleTsKKworLy8gaW5pdGlhbGl6ZSB0aGUgRVBPTiBPQU0gbmVnb3RpYXRpb24gYXBwbGljYXRpb24gKHNob3VsZCBiZSBjYWxsZWQgYXMgcGFydCBvZiB1c2VyIGFwcGxpY2F0aW9uIHN0YXJ0dXApCit2b2lkIGJjbW9sdF9lcG9uX2hkZV9hcHBsX2luaXQodm9pZCk7CisKKy8vIHByb2Nlc3MgYW4gaW5kaWNhdGlvbi4KK2JjbW9zX2Vycm5vIGJjbW9sdF9lcG9uX2hkZV9wcm9jZXNzX3J4KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIHVpbnQ4X3QgaW5zdGFuY2UsIGJjbW9sdF9wcm94eV9yeCAqcngpOworCisvLyBpbml0aWFsaXplIEhERSBDTEkKK3ZvaWQgYmNtb2x0X2Vwb25faGRlX2FwcGxfY2xpX2luaXQoYmNtY2xpX2VudHJ5ICp0b3BfZGlyKTsKKworI2VuZGlmIC8qIEJDTU9MVF9FUE9OX0hERV9IXyAqLwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lcG9uX2hkZS9lbmNyeXB0X29hbS5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lcG9uX2hkZS9lbmNyeXB0X29hbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZWY2MzIKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vwb25faGRlL2VuY3J5cHRfb2FtLmMKQEAgLTAsMCArMSwyOTEgQEAKKy8qCisgPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCisgVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKKyB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgb2YgdGhlIHNvZnR3YXJlLgorCisgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKKyB3cml0dGVuIGNvbnNlbnQuCisKKyA6PgorICovCisKKyNpbmNsdWRlICJiY21vc19zeXN0ZW0uaCIKKyNpbmNsdWRlICJiY21vbHRfbW9kZWxfdHlwZXMuaCIKKyNpbmNsdWRlICJiY21vbHRfYXBpLmgiCisjaW5jbHVkZSAib2FtX2RlZnMuaCIKKyNpbmNsdWRlICJiY21vbHRfbWF0aC5oIgorI2luY2x1ZGUgPGVuY3J5cHRfb2FtLmg+CisKK3N0YXRpYyBjb25zdCBiY21vc19tYWNfYWRkcmVzcyBzbG93X3Byb3RfbWNhc3RfbWFjID0KK3sKKyAgICAudTggPSB7IDB4MDEsIDB4ODAsIDB4QzIsIDB4MDAsIDB4MDAsIDB4MDIgfQorfTsKKworc3RhdGljIHVpbnQ4X3Qgb2FtX2J1ZmZlcltPQU1fTUFYX1BBQ0tFVF9TSVpFXTsKKworc3RhdGljIGJjbW9zX2Jvb2wgb2FtX3Zhcl9hZGRfdGx2X2hlYWRlcihiY21vbHRfYnVmICpidWYsIG9hbV92YXJfYnJhbmNoIGJyYW5jaCwgdWludDE2X3QgbGVhZiwgdWludDhfdCBsZW4pCit7CisgICAgYmNtb3NfYm9vbCBvayA9IEJDTU9TX1RSVUU7CisgICAgdWludDhfdCAqc25hcCA9IGJjbW9sdF9idWZfc25hcF9nZXQoYnVmKTsKKworICAgIG9rID0gb2sgJiYgKGxlbiA8PSBPQU1fTUFYX1RMVl9MRU5HVEgpOworICAgIG9rID0gb2sgJiYgYmNtb2x0X2J1Zl93cml0ZV91OChidWYsICh1aW50OF90KSBicmFuY2gpOworICAgIG9rID0gb2sgJiYgYmNtb2x0X2J1Zl93cml0ZV91MTZfYmUoYnVmLCBsZWFmKTsKKyAgICBvayA9IG9rICYmIGJjbW9sdF9idWZfd3JpdGVfdTgoYnVmLCBvYW1fdmFyX3Rsdl9sZW5ndGhfZW5jb2RlKGxlbikpOworICAgIG9rID0gb2sgJiYgKGJjbW9sdF9idWZfZ2V0X3JlbWFpbmluZ19zaXplKGJ1ZikgPj0gbGVuKTsKKyAgICBpZiAoIW9rKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2J1Zl9zbmFwX3Jlc3RvcmUoYnVmLCBzbmFwKTsKKyAgICB9CisgICAgcmV0dXJuIG9rOworfQorCitzdGF0aWMgYmNtb3NfYm9vbCBkcG9lX2VuY3J5cHRfdGx2X2FkZChiY21vbHRfYnVmICpvYW1idWYsIHVpbnQxNl90IHBlcmlvZCwgZHBvZV9lbmNyeXB0X21vZGUgbW9kZSkKK3sKKyAgICBiY21vc19ib29sIG9rID0gQkNNT1NfVFJVRTsKKworICAgIC8vIGVuY3J5cHRpb24gbW9kZSBUTFYKKyAgICBvayA9IG9rICYmIG9hbV92YXJfYWRkX3Rsdl9oZWFkZXIob2FtYnVmLCBPQU1fVkFSX0JSQU5DSF9EUE9FX0FUVFJJQlVURSwgKHVpbnQxNl90KSBPQU1fRFBPRV9BVFRSX0VOQ1JZUFRfTU9ERSwgMSk7CisgICAgb2sgPSBvayAmJiBiY21vbHRfYnVmX3dyaXRlX3U4KG9hbWJ1ZiwgKHVpbnQ4X3QpIG1vZGUpOworCisgICAgLyogS2V5IEV4cGlyeSBUaW1lIFRMViAqLworICAgIG9rID0gb2sgJiYgb2FtX3Zhcl9hZGRfdGx2X2hlYWRlcihvYW1idWYsIE9BTV9WQVJfQlJBTkNIX0RQT0VfQVRUUklCVVRFLCAodWludDE2X3QpIE9BTV9EUE9FX0FUVFJfS0VZX0VYUElSWV9USU1FLCAyKTsKKyAgICBvayA9IG9rICYmIGJjbW9sdF9idWZfd3JpdGVfdTE2X2JlKG9hbWJ1ZiwgcGVyaW9kKTsKKworICAgIHJldHVybiBvazsKK30KKworc3RhdGljIGJjbW9zX2Jvb2wgb2FtX3BkdV9idWlsZF9jb21tb24oYmNtb3NfbWFjX2FkZHJlc3MgcG9uX21hYywgYmNtb2x0X2J1ZiAqb3V0YnVmKQoreworICAgIGJjbW9zX2Jvb2wgb2sgPSBCQ01PU19UUlVFOworCisgICAgb2sgPSBvayAmJiBiY21vbHRfYnVmX3dyaXRlX21hY19hZGRyZXNzKG91dGJ1Ziwgc2xvd19wcm90X21jYXN0X21hYyk7ICAgICAgICAvLyBEQQorICAgIG9rID0gb2sgJiYgYmNtb2x0X2J1Zl93cml0ZV9tYWNfYWRkcmVzcyhvdXRidWYsIHBvbl9tYWMpOyAgICAgICAgICAgICAgICAgICAgLy8gU0EKKyAgICBvayA9IG9rICYmIGJjbW9sdF9idWZfd3JpdGVfdTE2X2JlKG91dGJ1ZiwgRVRIRVJUWVBFX1NMT1dQUk9UT0NPTFMpOyAgICAgICAgIC8vIFR5cGUKKyAgICBvayA9IG9rICYmIGJjbW9sdF9idWZfd3JpdGVfdTgob3V0YnVmLCAodWludDhfdCkgU0xPV19QUk9UT0NPTF9TVUJUWVBFX09BTSk7IC8vIFN1YnR5cGUKKworICAgIHJldHVybiBvazsKK30KKworLyogU2VuZHMgT0FNIGZyYW1lICdmcmFtZScgdG8gYSBsaW5rIHZpYSB0aGUgaW5qZWN0IGZyYW1lIG9wZXJhdGlvbiAqLworc3RhdGljIGJjbW9zX2Jvb2wgb2FtX3BkdV90cmFuc21pdChjb25zdCBoZGVfa2V5KiBoZGVfbGluaywgdWludDhfdCAqZnJhbWUsIHVpbnQxNl90IGxlbikKK3sKKyAgICBiY21vbHRfZXRoZXJuZXRfZnJhbWVfdW5tYXNrZWQgb2FtX2ZyYW1lOworICAgIGJjbW9sdF9lcG9uX2xpbmtfaW5qZWN0X2ZyYW1lICBpbmplY3RfZnJhbWU7CisKKyAgICBvYW1fZnJhbWUuZnJhbWVfb2N0ZXRzLmxlbiA9IGxlbjsKKyAgICBvYW1fZnJhbWUuZnJhbWVfb2N0ZXRzLnZhbCA9IGZyYW1lOworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGxpbmtfa2V5ID0KKyAgICB7CisgICAgICAgIC5lcG9uX25pID0gaGRlX2xpbmstPmVwb25fbmksCisgICAgICAgIC5tYWNfYWRkcmVzcyA9IGhkZV9saW5rLT5tYWNfYWRkcgorICAgIH07CisKKyAgICBCQ01PTFRfUFJPWFlfSU5JVCgmaW5qZWN0X2ZyYW1lLCBlcG9uX2xpbmssIGluamVjdF9mcmFtZSwgbGlua19rZXkpOworICAgIEJDTU9MVF9QUk9YWV9QUk9QX1NFVCgmaW5qZWN0X2ZyYW1lLCBlcG9uX2xpbmssIGluamVjdF9mcmFtZSwgZnJhbWUsIG9hbV9mcmFtZSk7CisgICAgaWYgKGJjbW9sdF9wcm94eV9zZW5kKGhkZV9saW5rLT5kZXZpY2VfaWQsICZpbmplY3RfZnJhbWUuaGRyKSAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCQ01PU19UUlVFOworfQorCitzdGF0aWMgYmNtb3NfYm9vbCBvYW1fdmFyX2dldF9uZXh0KGJjbW9sdF9idWYgKmJ1Ziwgb2FtX3Zhcl9nZW5lcmljICpvYW12YXIpCit7CisgICAgYmNtb3NfYm9vbCBvayA9IEJDTU9TX1RSVUU7CisgICAgdWludDhfdCBicmFuY2ggPSBPQU1fVkFSX0JSQU5DSF9URVJNSU5BVElPTjsKKworICAgIG1lbXNldChvYW12YXIsIDAsIHNpemVvZigqb2FtdmFyKSk7CisgICAgb2sgPSBvayAmJiAoYmNtb2x0X2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoYnVmKSAhPSAwKTsKKyAgICBvayA9IG9rICYmIGJjbW9sdF9idWZfcmVhZF91OChidWYsICZicmFuY2gpOyAvLyBSZWFkIHRoZSBicmFuY2guCisgICAgaWYgKG9rKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChicmFuY2gpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBPQU1fVkFSX0JSQU5DSF9BVFRSSUJVVEU6CisgICAgICAgIGNhc2UgT0FNX1ZBUl9CUkFOQ0hfQUNUSU9OOgorICAgICAgICBjYXNlIE9BTV9WQVJfQlJBTkNIX0RQT0VfQUNUOgorICAgICAgICBjYXNlIE9BTV9WQVJfQlJBTkNIX0RQT0VfQVRUUklCVVRFOgorICAgICAgICBjYXNlIE9BTV9WQVJfQlJBTkNIX0RQT0VfT0JKRUNUOgorICAgICAgICAgICAgb2FtdmFyLT5icmFuY2ggPSAob2FtX3Zhcl9icmFuY2gpIGJyYW5jaDsKKyAgICAgICAgICAgIG9rID0gb2sgJiYgYmNtb2x0X2J1Zl9yZWFkX3UxNl9iZShidWYsICZvYW12YXItPmxlYWYpOyAvLyBSZWFkIGxlYWYKKyAgICAgICAgICAgIG9rID0gb2sgJiYgYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJm9hbXZhci0+d2lkdGgpOyAvLyBSZWFkIFdpZHRoCisgICAgICAgICAgICBvYW12YXItPnZhbHVlID0gYmNtb2x0X2J1Zl9zbmFwX2dldChidWYpOyAvLyBLZWVwIHRoZSBwb3NpdGlvbiBvZiB2YWx1ZQorICAgICAgICAgICAgb2FtdmFyLT53aWR0aCA9IG9hbV92YXJfdGx2X2xlbmd0aF9lbmNvZGUob2FtdmFyLT53aWR0aCk7IC8vIFJlLWVuY29kZSB3aWR0aCB2aWEgT0FNIHNwZWMKKyAgICAgICAgICAgIG9rID0gb2sgJiYgYmNtb2x0X2J1Zl9za2lwKGJ1Ziwgb2FtdmFyLT53aWR0aCk7IC8vIFNraXAgYSAnd2lkdGgnIGFtb3VudAorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBPQU1fVkFSX0JSQU5DSF9URVJNSU5BVElPTjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIG9rID0gQkNNT1NfRkFMU0U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIG9rID0gb2sgJiYgYmNtb2x0X2J1Zl9za2lwKGJ1Ziwgb2FtdmFyLT53aWR0aCk7CisgICAgcmV0dXJuIG9rOworfQorCisvKiBMb29wcyB0aHJvdWdoICdvYW1fcmVzcCcgbG9va2luZyBmb3IgdGhlIHByb3ZpZGVkIGJyYW5jaC9sZWFmLiBJZiBmb3VuZCBpdCB3aWxsIHJldHVybiBpdC4gKi8KK3N0YXRpYyBiY21vc19ib29sIG9hbV92YXJfZ2V0X2JyYW5jaF9sZWFmKHVpbnQ4X3QgKm9hbV9yZXNwLCB1aW50MzJfdCBvYW1fcmVzcF9sZW4sIG9hbV92YXJfYnJhbmNoIGJyYW5jaCwgdWludDE2X3QgbGVhZiwgb2FtX3Zhcl9nZW5lcmljICpvYW1fdmFyKQoreworICAgIGJjbW9sdF9idWYgYnVmOworICAgIG9hbV92YXJfZ2VuZXJpYyB2YXI7CisKKyAgICBiY21vbHRfYnVmX2luaXQoJmJ1Ziwgb2FtX3Jlc3BfbGVuLCBvYW1fcmVzcCwgKGJjbW9zX2VuZGlhbikgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpOworCisgICAgd2hpbGUgKG9hbV92YXJfZ2V0X25leHQoJmJ1ZiwgJnZhcikpIC8vIEtlZXAgZ29pbmcgdGhyb3VnaCBhbGwgT0FNIHZhcnMuCisgICAgeworICAgICAgICBpZiAoKHZhci5icmFuY2ggPT0gYnJhbmNoKSAmJiAodmFyLmxlYWYgPT0gbGVhZikpIC8vIENoZWNrIHRvIHNlZSBpdCBpcyB0aGUgb25lIHdlIGFyZSBsb29raW5nIGZvci4KKyAgICAgICAgeworICAgICAgICAgICAgKm9hbV92YXIgPSB2YXI7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQkNNT1NfRkFMU0U7Cit9CisKK3N0YXRpYyBiY21vc19ib29sIG9hbV9wYXJzZV90b19kcG9lX29wY29kZShiY21vbHRfYnVmICpidWYsIG9hbV9kcG9lX29wY29kZSBvcGNvZGUpCit7CisgICAgYmNtb3NfYm9vbCBvayA9IEJDTU9TX1RSVUU7CisgICAgdWludDI0X3QgZHBvZV9vdWkgPSB7IC5sb3dfaGkgPSB7IC5oaSA9IDB4MDAsIC5taWQgPSAweDEwLCAubG93ID0gMHgwMCB9IH07CisgICAgdWludDE2X3QgdTE2OworICAgIHVpbnQ4X3QgdTg7CisgICAgdWludDI0X3QgdTI0OworICAgIG9rID0gb2sgJiYgYmNtb2x0X2J1Zl9za2lwKGJ1ZiwgMTIpOyAvLyBTa2lwIGJvdGggbWFjIGFkZHJlc3NlcworICAgIG9rID0gb2sgJiYgYmNtb2x0X2J1Zl9yZWFkX3UxNl9iZShidWYsICZ1MTYpOyAvLyBSZWFkIGV0aGVydHlwZQorICAgIG9rID0gb2sgJiYgdTE2ID09IEVUSEVSVFlQRV9TTE9XUFJPVE9DT0xTOyAvLyBNYWtlIHN1cmUgaXQgaXMgc2xvdyBwcm90b2NvbAorICAgIG9rID0gb2sgJiYgYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnU4KTsgLy8gUmVhZCB0aGUgc3VidHlwZQorICAgIG9rID0gb2sgJiYgdTggPT0gU0xPV19QUk9UT0NPTF9TVUJUWVBFX09BTTsgLy8gTWFrZSBzdXJlIGl0IGlzIE9BTQorICAgIG9rID0gb2sgJiYgYmNtb2x0X2J1Zl9za2lwKGJ1ZiwgMik7IC8vIFNraXAgZmxhZ3MKKyAgICBvayA9IG9rICYmIGJjbW9sdF9idWZfcmVhZF91OChidWYsICZ1OCk7IC8vIFJlYWQgdGhlIGNvZGUKKyAgICBvayA9IG9rICYmIHU4ID09IE9BTV9QRFVfQ09ERV9PUkdfRVhUOyAvLyBNYWtlIHN1cmUgaXQgaXMgb3JnYW5pemF0aW9uIHNwZWNpZmljCisgICAgb2sgPSBvayAmJiBiY21vbHRfYnVmX3JlYWRfdTI0KGJ1ZiwgJnUyNCk7IC8vIFJlYWQgdGhlIE9VSQorICAgIG9rID0gb2sgJiYgbWVtY21wKCZkcG9lX291aSwgJnUyNCwgc2l6ZW9mKHVpbnQyNF90KSkgPT0gMDsgLy8gTWFrZSBzdXJlIGl0IGlzIHRoZSBEUG9FIE9VSQorICAgIG9rID0gb2sgJiYgYmNtb2x0X2J1Zl9yZWFkX3U4KGJ1ZiwgJnU4KTsgLy8gUmVhZCB0aGUgb3Bjb2RlCisgICAgb2sgPSBvayAmJiBvcGNvZGUgPT0gdTg7IC8vIE1ha2Ugc3VyZSBpdCBtYXRjaGVzIHRoZSBwcm92aWRlZCBvcGNvZGUKKyAgICByZXR1cm4gb2s7Cit9CisKK2JjbW9zX2Vycm5vIGRwb2VfZW5jcnlwdF9vYW1fc2V0X3JlcXVlc3Rfc2VuZChjb25zdCBoZGVfa2V5ICpoZGVfbGluaywgdWludDE2X3QgcGVyaW9kLCBkcG9lX2VuY3J5cHRfbW9kZSBlbmNyeXB0X21vZGUsIGJjbW9zX21hY19hZGRyZXNzIHBvbl9tYWMpCit7CisgICAgLy8gc2VuZCB0aGUgZW5jcnlwdCBtb2RlIGFuZCBrZXkgZXhwaXJ5IHRpbWUgVExWcyB0byBPTlUuCisgICAgYmNtb2x0X2J1ZiBidWY7CisgICAgaWVlZV9vdWkgZHBvZV9vdWkgPSB7IHsgMHgwMCwgMHgxMCwgMHgwMCB9IH07CisgICAgYmNtb3NfYm9vbCBvayA9IEJDTU9TX1RSVUU7CisKKyAgICBtZW1zZXQob2FtX2J1ZmZlciwgMCwgc2l6ZW9mKG9hbV9idWZmZXIpKTsKKworICAgIGJjbW9sdF9idWZfaW5pdCgmYnVmLCBPQU1fTUFYX1BBQ0tFVF9TSVpFLCBvYW1fYnVmZmVyLCBCQ01PTFRfQlVGX0VORElBTl9GSVhFRCk7CisgICAgb2sgPSBvayAmJiBvYW1fcGR1X2J1aWxkX2NvbW1vbihwb25fbWFjLCAmYnVmKTsKKyAgICBvayA9IG9rICYmIGJjbW9sdF9idWZfd3JpdGVfdTE2X2JlKCZidWYsICh1aW50MTZfdCkgT0FNX1BEVV9GTEFHX1NFTkRfQU5ZKTsgLyogd3JpdGUgZmxhZ3MgKi8KKyAgICBvayA9IG9rICYmIGJjbW9sdF9idWZfd3JpdGVfdTgoJmJ1ZiwgKHVpbnQ4X3QpIE9BTV9QRFVfQ09ERV9PUkdfRVhUKTsgLyogd3JpdGUgIGNvZGUgKi8KKyAgICBvayA9IG9rICYmIGJjbW9sdF9idWZfd3JpdGUoJmJ1ZiwgZHBvZV9vdWkuYnl0ZSwgMyk7IC8qIHdyaXRlIG91aSAqLworICAgIG9rID0gb2sgJiYgYmNtb2x0X2J1Zl93cml0ZV91OCgmYnVmLCBPQU1fRFBPRV9PUENPREVfU0VUX1JFUVVFU1QpOyAvKiB3cml0ZSBvcGNvZGUgKi8KKyAgICBvayA9IG9rICYmIGRwb2VfZW5jcnlwdF90bHZfYWRkKCZidWYsIHBlcmlvZCwgZW5jcnlwdF9tb2RlKTsgLyogd3JpdGUgZW5jcnlwdGlvbiBUTFZzICovCisgICAgb2sgPSBvayAmJiBiY21vbHRfYnVmX3dyaXRlX3UxNl9iZSgmYnVmLCAwKTsgLyogd3JpdGUgRU5EICovCisgICAgb2sgPSBvayAmJiBvYW1fcGR1X3RyYW5zbWl0KGhkZV9saW5rLCBvYW1fYnVmZmVyLCBNQVgoYmNtb2x0X2J1Zl9nZXRfdXNlZCgmYnVmKSwgNjApKTsgLyogU2VuZCBpdCAqLworCisgICAgaWYgKCFvaykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisgICAgcmV0dXJuIG9rOworfQorCitiY21vc19lcnJubyBkcG9lX2VuY3J5cHRfb2FtX3BhcnNlX3NldF9yZXNwb25zZShjb25zdCBiY21vbHRfdThfbGlzdF91MzIgKmZyYW1lLCB1aW50OF90ICplbmNyeXB0X21vZGVfcmVzcG9uc2UsIHVpbnQ4X3QgKmtleV9leHBpcnlfcmVzcG9uc2UpCit7CisgICAgb2FtX3Zhcl9nZW5lcmljIGVuY3J5cHRfbW9kZTsKKyAgICBvYW1fdmFyX2dlbmVyaWMga2V5X2V4cGlyeV90aW1lOworICAgIGJjbW9sdF9idWYgYnVmOworICAgIGJjbW9sdF9idWZfaW5pdCgmYnVmLCBmcmFtZS0+bGVuLCBmcmFtZS0+dmFsLCBCQ01PTFRfQlVGX0VORElBTl9GSVhFRCk7CisKKyAgICAvLyBNb3ZlIHRoZSBPQU0gYnVmZmVyIGZvcndhcmQgdG8gdGhlIG9wY29kZQorICAgIGlmICghb2FtX3BhcnNlX3RvX2Rwb2Vfb3Bjb2RlKCZidWYsIE9BTV9EUE9FX09QQ09ERV9TRVRfUkVTUE9OU0UpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSU0U7CisgICAgfQorCisgICAgLy8gQ2hlY2sgZm9yIGVuY3J5cHQgbW9kZSBUTFYKKyAgICBpZiAoIW9hbV92YXJfZ2V0X2JyYW5jaF9sZWFmKAorICAgICAgICBiY21vbHRfYnVmX3NuYXBfZ2V0KCZidWYpLAorICAgICAgICBiY21vbHRfYnVmX2dldF9yZW1haW5pbmdfc2l6ZSgmYnVmKSwKKyAgICAgICAgT0FNX1ZBUl9CUkFOQ0hfRFBPRV9BVFRSSUJVVEUsCisgICAgICAgIE9BTV9EUE9FX0FUVFJfRU5DUllQVF9NT0RFLAorICAgICAgICAmZW5jcnlwdF9tb2RlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUlNFOworICAgIH0KKworICAgIC8vIENoZWNrIGZvciBrZXkgZXhwaXJ5IHRpbWUgVExWCisgICAgaWYgKCFvYW1fdmFyX2dldF9icmFuY2hfbGVhZigKKyAgICAgICAgYmNtb2x0X2J1Zl9zbmFwX2dldCgmYnVmKSwKKyAgICAgICAgYmNtb2x0X2J1Zl9nZXRfcmVtYWluaW5nX3NpemUoJmJ1ZiksCisgICAgICAgIE9BTV9WQVJfQlJBTkNIX0RQT0VfQVRUUklCVVRFLAorICAgICAgICBPQU1fRFBPRV9BVFRSX0tFWV9FWFBJUllfVElNRSwKKyAgICAgICAgJmtleV9leHBpcnlfdGltZSkpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJTRTsKKyAgICB9CisKKyAgICAqZW5jcnlwdF9tb2RlX3Jlc3BvbnNlID0gZW5jcnlwdF9tb2RlLndpZHRoOworICAgICprZXlfZXhwaXJ5X3Jlc3BvbnNlID0ga2V5X2V4cGlyeV90aW1lLndpZHRoOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19lcnJubyBkcG9lX2VuY3J5cHRfb2FtX3BhcnNlX25ld19rZXkoY29uc3QgYmNtb2x0X3U4X2xpc3RfdTMyICpmcmFtZSwgdWludDhfdCAqbmV3X2tleSwgYmNtb2x0X2Vwb25fa2V5X2Nob2ljZSAqa2V5X2Nob2ljZSkKK3sKKyAgICBiY21vc19ib29sIG9rID0gQkNNT1NfVFJVRTsKKyAgICB1aW50OF90IGtleV9udW1iZXI7CisgICAgdWludDhfdCBrZXlfbGVuZ3RoOworICAgIGJjbW9sdF9idWYgYnVmOworICAgIGJjbW9sdF9idWZfaW5pdCgmYnVmLCBmcmFtZS0+bGVuLCBmcmFtZS0+dmFsLCBCQ01PTFRfQlVGX0VORElBTl9GSVhFRCk7CisgICAgb2sgPSBvYW1fcGFyc2VfdG9fZHBvZV9vcGNvZGUoJmJ1ZiwgT0FNX0RQT0VfT1BDT0RFX0tFWV9FWENIQU5HRSk7CisgICAgb2sgPSBvayAmJiBiY21vbHRfYnVmX3JlYWRfdTgoJmJ1ZiwgJmtleV9udW1iZXIpOyAvLyBSZWFkIGtleSBudW1iZXIKKyAgICBvayA9IG9rICYmIGJjbW9sdF9idWZfcmVhZF91OCgmYnVmLCAma2V5X2xlbmd0aCk7IC8vIFJlYWQga2V5IGxlbmd0aAorICAgIG9rID0gb2sgJiYga2V5X2xlbmd0aCA9PSAxNjsgLy8gTWFrZSBzdXJlIHRoZSBrZXkgaXMgMTYgYnl0ZSBsZW5ndGgKKyAgICBvayA9IG9rICYmIGJjbW9sdF9idWZfcmVhZCgmYnVmLCBuZXdfa2V5LCAxNik7IC8vIFJlYWQgdGhlIGtleQorCisgICAgaWYgKCFvaykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUlNFOworICAgIH0KKworICAgIGlmIChrZXlfbnVtYmVyID09IDApCisgICAgeworICAgICAgICAqa2V5X2Nob2ljZSA9IEJDTU9MVF9FUE9OX0tFWV9DSE9JQ0VfS0VZXzA7CisgICAgfQorICAgIGVsc2UgaWYgKGtleV9udW1iZXIgPT0gMSkKKyAgICB7CisgICAgICAgICprZXlfY2hvaWNlID0gQkNNT0xUX0VQT05fS0VZX0NIT0lDRV9LRVlfMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSU0U7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vwb25faGRlL2VuY3J5cHRfb2FtLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vwb25faGRlL2VuY3J5cHRfb2FtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThjZDJlYgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZXBvbl9oZGUvZW5jcnlwdF9vYW0uaApAQCAtMCwwICsxLDU5IEBACisvKg0KKyA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQNCisNCisgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQ0KKyBBbGwgUmlnaHRzIFJlc2VydmVkDQorDQorIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UNCisgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZA0KKyB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDINCisgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsDQorIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6DQorDQorIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUNCisgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kDQorIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXINCisgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudA0KKyBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4NCisgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcw0KKyBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucw0KKyBvZiB0aGUgc29mdHdhcmUuDQorDQorIE5vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQ0KKyB0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQNCisgdW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3INCisgd3JpdHRlbiBjb25zZW50Lg0KKw0KKyA6Pg0KKyAqLw0KKw0KKyNpZm5kZWYgRU5DUllQVF9PQU1fSF8NCisjZGVmaW5lIEVOQ1JZUFRfT0FNX0hfDQorDQorI2luY2x1ZGUgIm9hbV9kZWZzLmgiDQorI2luY2x1ZGUgImJjbW9sdF9lcG9uX2hkZS5oIg0KKw0KKy8qIFNlbmQgYSBFbmNyeXB0aW9uIFJlcXVlc3QgT0FNIHRvIE9OVS4gKi8NCitiY21vc19lcnJubyBkcG9lX2VuY3J5cHRfb2FtX3NldF9yZXF1ZXN0X3NlbmQoDQorICAgIGNvbnN0IGhkZV9rZXkgKmhkZV9saW5rLA0KKyAgICB1aW50MTZfdCBwZXJpb2QsDQorICAgIGRwb2VfZW5jcnlwdF9tb2RlIGVuY3J5cHRfbW9kZSwNCisgICAgYmNtb3NfbWFjX2FkZHJlc3MgcG9uX21hYyk7DQorDQorLyogQXR0ZW1wdCB0byBwYXJzZSBhIERQb0Ugc2V0IHJlc3BvbnNlIGFuZCBmaWxsIGluIHRoZSB2YWx1ZXMgb2YgdGhlIHR3byBUTFZzIHdlIGluaXRpYWxseSBzZW50IGRvd24uDQorICogVGhpcyB3aWxsIHJldHVybiBCQ01fRVJSX1BBUlNFIGlmIGl0IGZhaWxzIHRvIGZpbGwgaW4gZWl0aGVyIG9mIHRoZSBUTFZzLg0KKyAqLw0KK2JjbW9zX2Vycm5vIGRwb2VfZW5jcnlwdF9vYW1fcGFyc2Vfc2V0X3Jlc3BvbnNlKA0KKyAgICBjb25zdCBiY21vbHRfdThfbGlzdF91MzIgKmZyYW1lLA0KKyAgICB1aW50OF90ICplbmNyeXB0X21vZGVfcmVzcG9uc2UsDQorICAgIHVpbnQ4X3QgKmtleV9leHBpcnlfcmVzcG9uc2UpOw0KKw0KKy8qIEF0dGVtcHRzIHRvIHBhcnNlIGFuIE9BTSBmcmFtZSBhbmQgZmlsbCBpbiB0aGUgdmFsdWVzIG9mIG5ld19rZXkgYW5kIGtleV9jaG9pY2UgZnJvbSB0aGF0IGZyYW1lLg0KKyAqIFRoaXMgd2lsbCByZXR1cm4gQkNNX0VSUl9QQVJTRSBpZiBpdCBmYWlscyB0byBmaWxsIGluIGVpdGhlciBuZXdfa2V5IG9yIGtleV9jaG9pY2UuDQorICovDQorYmNtb3NfZXJybm8gZHBvZV9lbmNyeXB0X29hbV9wYXJzZV9uZXdfa2V5KA0KKyAgICBjb25zdCBiY21vbHRfdThfbGlzdF91MzIgKmZyYW1lLA0KKyAgICB1aW50OF90ICpuZXdfa2V5LA0KKyAgICBiY21vbHRfZXBvbl9rZXlfY2hvaWNlICprZXlfY2hvaWNlKTsNCisNCisjZW5kaWYgLyogRU5DUllQVF9PQU1fSF8gKi8NCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vwb25faGRlL29hbV9kZWZzLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vwb25faGRlL29hbV9kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc2ZDVlYgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZXBvbl9oZGUvb2FtX2RlZnMuaApAQCAtMCwwICsxLDE1MyBAQAorLyoNCisgPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkDQorDQorIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20NCisgQWxsIFJpZ2h0cyBSZXNlcnZlZA0KKw0KKyBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlDQorIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQNCisgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyDQorICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLA0KKyB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOg0KKw0KKyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlDQorIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZA0KKyB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyDQorIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQNCisgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuDQorIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMNCisgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMNCisgb2YgdGhlIHNvZnR3YXJlLg0KKw0KKyBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUNCisgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkDQorIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yDQorIHdyaXR0ZW4gY29uc2VudC4NCisNCisgOj4NCisgKi8NCisNCisjaWZuZGVmIE9BTV9ERUZTX0hfDQorI2RlZmluZSBPQU1fREVGU19IXw0KKw0KKyNpbmNsdWRlICJiY21vbHRfbW9kZWxfdHlwZXMuaCINCisNCisjZGVmaW5lIEVUSEVSVFlQRV9TTE9XUFJPVE9DT0xTIDB4ODgwOQ0KKyNkZWZpbmUgT0FNX1RJTUVPVVRfR1JBQ0VfUEVSSU9EX1VTIDEwMDAwMA0KKyNkZWZpbmUgSERFX0VOQUJMRV9PQU1fV0FJVF9VUyAzZTYgLy8gMyBzZWNvbmRzDSNkZWZpbmUgT0FNX01BWF9QQUNLRVRfU0laRSAxNTE4DQorI2RlZmluZSBPQU1fTUFYX1RMVl9MRU5HVEggMTI4DQorDQorLyogQ29tbW9uIE9BTVBEVSBTdHJ1Y3R1cmUgKi8NCit0eXBlZGVmIGVudW0NCit7DQorICAgIFNMT1dfUFJPVE9DT0xfU1VCVFlQRV9MQUNQICAgICA9IDB4MDEsIC8qIExpbmsgQWdyZWdhdGlvbiBDb250cm9sIFByb3RvY29sICovDQorICAgIFNMT1dfUFJPVE9DT0xfU1VCVFlQRV9MQU1QICAgICA9IDB4MDIsIC8qIExpbmsgQWdyZWdhdGlvbiBNYXJrZXIgUHJvdG9jb2wgKi8NCisgICAgU0xPV19QUk9UT0NPTF9TVUJUWVBFX09BTSAgICAgID0gMHgwMywgLyogT0FNICovDQorICAgIFNMT1dfUFJPVE9DT0xfU1VCVFlQRV9PUkdfU1BFQyA9IDB4MEEgIC8qIE9yZ2FuaXphdGlvbiBTcGVjaWZpYyBTdWJ0eXBlICovDQorfSBzbG93X3Byb3RvY29sX3N1YnR5cGU7DQorDQorLyogU3RhbmRhcmQgT0FNIEZsYWdzIGZpZWxkLiAgSUVFRTgwMi4zLTIwMDhfc2VjdGlvbjUsIGNoLjU3LjQuMi4xICovDQordHlwZWRlZiBlbnVtDQorew0KKyAgICBPQU1fUERVX0ZMQUdfTElOS19GQVVMVCAgICAgPSAoMSA8PCAwKSwgLyogMHgwMDAxICovDQorICAgIE9BTV9QRFVfRkxBR19EWUlOR19HQVNQICAgICA9ICgxIDw8IDEpLCAvKiAweDAwMDIgKi8NCisgICAgT0FNX1BEVV9GTEFHX0NSSVRJQ0FMX0VWRU5UID0gKDEgPDwgMiksIC8qIDB4MDAwNCAqLw0KKyAgICBPQU1fUERVX0ZMQUdfTE9DQUxfRVZBTCAgICAgPSAoMSA8PCAzKSwgLyogMHgwMDA4ICovDQorICAgIE9BTV9QRFVfRkxBR19MT0NBTF9TVEFCTEUgICA9ICgxIDw8IDQpLCAvKiAweDAwMTAgKi8NCisgICAgT0FNX1BEVV9GTEFHX1JFTU9URV9FVkFMICAgID0gKDEgPDwgNSksIC8qIDB4MDAyMCAqLw0KKyAgICBPQU1fUERVX0ZMQUdfUkVNT1RFX1NUQUJMRSAgPSAoMSA8PCA2KSwgLyogMHgwMDQwICovDQorICAgIE9BTV9QRFVfRkxBR19TRU5EX0FOWSAgICAgICA9IChPQU1fUERVX0ZMQUdfTE9DQUxfU1RBQkxFIHwgT0FNX1BEVV9GTEFHX1JFTU9URV9TVEFCTEUpDQorfSBvYW1fcGR1X2ZsYWc7DQorDQorLyogU3RhbmRhcmQgT0FNIENvZGUgZmllbGQuICBJRUVFODAyLjMtMjAwOF9zZWN0aW9uNSwgY2guNTcuNC4yLjIgKi8NCit0eXBlZGVmIGVudW0NCit7DQorICAgIE9BTV9QRFVfQ09ERV9JTkZPICAgICAgICAgICAgICA9IDB4MCwNCisgICAgT0FNX1BEVV9DT0RFX0VWRU5UTk9USUZJQ0FUSU9OID0gMHgwMSwNCisgICAgT0FNX1BEVV9DT0RFX1ZBUlJFUVVFU1QgICAgICAgID0gMHgwMiwNCisgICAgT0FNX1BEVV9DT0RFX1ZBUlJFU1BPTlNFICAgICAgID0gMHgwMywNCisgICAgT0FNX1BEVV9DT0RFX0xPT1BCQUNLICAgICAgICAgID0gMHgwNCwNCisgICAgT0FNX1BEVV9DT0RFX09SR19FWFQgICAgICAgICAgID0gMHhmZQ0KK30gb2FtX3BkdV9jb2RlOw0KKw0KKy8qIElFRUUgT3JnYW5pemF0aW9uIFVuaXF1ZSBJZGVudGlmaWVyICovDQordHlwZWRlZiBzdHJ1Y3QNCit7DQorICAgIHVpbnQ4X3QgYnl0ZVszXTsNCit9IGllZWVfb3VpOw0KKw0KKy8qIEJyYW5jaCB0eXBlcyAqLw0KK3R5cGVkZWYgZW51bQ0KK3sNCisgICAgT0FNX1ZBUl9CUkFOQ0hfVEVSTUlOQVRJT04gICAgPSAweDAwLA0KKyAgICBPQU1fVkFSX0JSQU5DSF9BVFRSSUJVVEUgICAgICA9IDB4MDcsDQorICAgIE9BTV9WQVJfQlJBTkNIX0FDVElPTiAgICAgICAgID0gMHgwOSwNCisgICAgT0FNX1ZBUl9CUkFOQ0hfRFBPRV9PQkpFQ1QgICAgPSAweEQ2LA0KKyAgICBPQU1fVkFSX0JSQU5DSF9EUE9FX0FUVFJJQlVURSA9IDB4RDcsDQorICAgIE9BTV9WQVJfQlJBTkNIX0RQT0VfUFJPR19DVFIgID0gMHhEOCwNCisgICAgT0FNX1ZBUl9CUkFOQ0hfRFBPRV9BQ1QgICAgICAgPSAweEQ5DQorfSBvYW1fdmFyX2JyYW5jaDsNCisNCit0eXBlZGVmIGVudW0NCit7DQorICAgIE9BTV9EUE9FX09QQ09ERV9SRVNFUlZFRCAgICAgICA9IDAsDQorICAgIE9BTV9EUE9FX09QQ09ERV9HRVRfUkVRVUVTVCAgICA9IDEsDQorICAgIE9BTV9EUE9FX09QQ09ERV9HRVRfUkVTUE9OU0UgICA9IDIsDQorICAgIE9BTV9EUE9FX09QQ09ERV9TRVRfUkVRVUVTVCAgICA9IDMsDQorICAgIE9BTV9EUE9FX09QQ09ERV9TRVRfUkVTUE9OU0UgICA9IDQsDQorICAgIE9BTV9EUE9FX09QQ09ERV9JUE1DX0NUUkwgICAgICA9IDUsDQorICAgIE9BTV9EUE9FX09QQ09ERV9NQ0FTVF9SRUcgICAgICA9IDYsDQorICAgIE9BTV9EUE9FX09QQ09ERV9NQ0FTVF9SRUdfUkVTUCA9IDcsDQorICAgIE9BTV9EUE9FX09QQ09ERV9LRVlfRVhDSEFOR0UgICA9IDgsDQorICAgIE9BTV9EUE9FX09QQ09ERV9GSUxFX1RSQU5TRkVSICA9IDksDQorICAgIE9BTV9EUE9FX09QQ09ERV9JUE1DX0NUUkxfUkVTUCA9IDB4MGEgLyogRFBvRSAyLjAgKi8NCit9IG9hbV9kcG9lX29wY29kZTsNCisNCit0eXBlZGVmIGVudW0NCit7DQorICAgIE9BTV9EUE9FX0FUVFJfS0VZX0VYUElSWV9USU1FID0gMHgwNDAxLA0KKyAgICBPQU1fRFBPRV9BVFRSX0VOQ1JZUFRfTU9ERSA9IDB4MDQwMg0KK30gb2FtX2Rwb2VfYXR0cjsNCisNCisvKiBEUG9FIEtleSBFeGNoYW5nZSBPQU0gVExWIGVuY3J5cHRpb24gbW9kZSAqLw0KK3R5cGVkZWYgZW51bQ0KK3sNCisgICAgRFBPRV9FTkNSWVBUX01PREVfTk9ORSwNCisgICAgRFBPRV9FTkNSWVBUX01PREVfMURPV04sDQorICAgIERQT0VfRU5DUllQVF9NT0RFXzEwRE9XTiwNCisgICAgRFBPRV9FTkNSWVBUX01PREVfMTBCSQ0KK30gZHBvZV9lbmNyeXB0X21vZGU7DQorDQorLyogZ2VuZXJpYyBPQU0gVmFyaWFibGUgZm9ybWF0ICovDQordHlwZWRlZiBzdHJ1Y3QNCit7DQorICAgIG9hbV92YXJfYnJhbmNoIGJyYW5jaDsNCisgICAgdWludDE2X3QgbGVhZjsNCisgICAgdWludDhfdCB3aWR0aDsNCisgICAgdWludDhfdCAqdmFsdWU7DQorfSBvYW1fdmFyX2dlbmVyaWM7DQorDQorLyoqIEluIHRoZSBPQU0gcHJvdG9jb2wgbGVuZ3RoIDAgdGx2IGlzIGVuY29kZWQgYXMgMHg4MCAobm8gZXJyb3IpLg0KKyAqICBMZW5ndGggKDEtMTI3KSBhcmUgZW5jb2RlZCB3aXRoIG5vIGNoYW5nZSBhbmQgMTI4IGlzIGVuY29kZWQgYXMgMC4NCisgKg0KKyAqIFxwYXJhbSAgIHdpZHRoICAgVExWIHdpZHRoIGZpZWxkIHZhbHVlDQorICogXHJldHVybiAgZW5jb2RlZCB2YWx1ZSBmb3IgdGhlIHdpZHRoIGZpZWxkDQorICogXHJlZiAgICAgSUVFRTgwMi4zLTIwMDhfc2VjdGlvbjUsIENoLiA1Ny42LjIuMQ0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdWludDhfdCBvYW1fdmFyX3Rsdl9sZW5ndGhfZW5jb2RlKHVpbnQ4X3Qgd2lkdGgpDQorew0KKyAgICBpZiAod2lkdGggPT0gMCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIE9BTV9NQVhfVExWX0xFTkdUSDsgLyogMHgwMCBlcXVhbHMgMTI4IG9jdGV0cy4gKi8NCisgICAgfQ0KKyAgICBlbHNlIGlmICh3aWR0aCA9PSBPQU1fTUFYX1RMVl9MRU5HVEgpDQorICAgIHsNCisgICAgICAgIHJldHVybiAwOyAvKiAweDgwIHJlcHJlc2VudHMgJ25vIGVycm9yJy4gTm8gJ1ZhbHVlJyBmaWVsZC4gKi8NCisgICAgfQ0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICAgIHJldHVybiB3aWR0aDsgLyogcmVwcmVzZW50cyB0aGUgbGVuZ3RoIG9mICdWYWx1ZScuICovDQorICAgIH0NCit9DQorDQorI2VuZGlmIC8qIE9BTV9ERUZTX0hfICovDQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lcG9uX29hbS9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZXBvbl9vYW0vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY1NmI4ZgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZXBvbl9vYW0vTWFrZWZpbGUKQEAgLTAsMCArMSwxMCBAQAoraWZlcSAoIiQoRU5BQkxFX0NMSSkiLCAieSIpCisgICAgTU9EX05BTUUgPSBiY21fdXNlcl9hcHBsX2Vwb25fb2FtCisgICAgTU9EX1RZUEUgPSBsaWIKKwlNT0RfREVQUyA9IHV0aWxzIGRldl9sb2cgY29tbW9uX2Vwb25fb2FtIGNvbW1vbl9hcGkKKyAgICBzcmNzID0gYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29hbS5jCisgICAgaWZlcSAoIiQoT1NfS0VSTkVMKSIsICJsaW51eCIpCisJTU9EX0RFUFMgKz0gZGV2X2xvZ19saW51eAorICAgIGVuZGlmCitlbmRpZgorCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vwb25fb2FtL2JjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW0uYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZXBvbl9vYW0vYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29hbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ODU5NGMKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vwb25fb2FtL2JjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW0uYwpAQCAtMCwwICsxLDE0MzYgQEAKKy8qCisgIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCisgIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKKyAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCisgIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgIG9mIHRoZSBzb2Z0d2FyZS4KKworICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyAgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisgIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgIHdyaXR0ZW4gY29uc2VudC4KKworICA6PgorKi8KKworI2luY2x1ZGUgImJjbW9zX3N5c3RlbS5oIgorI2luY2x1ZGUgImJjbW9sdF9tYXRoLmgiCisjaW5jbHVkZSAiYmNtb2x0X3V0aWxzLmgiCisjaW5jbHVkZSAiYmNtX2Rldl9sb2cuaCIKKyNpbmNsdWRlICJiY21vbHRfbXNnLmgiCisjaW5jbHVkZSAiYmNtb2x0X21zZ19wYWNrLmgiCisjaW5jbHVkZSAiYmNtb2x0X2FwaS5oIgorI2luY2x1ZGUgImJjbW9sdF9tb2RlbF90eXBlcy5oIgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW0uaCIKKyNpbmNsdWRlICJiY21vc19oYXNoX3RhYmxlLmgiCisKKyNkZWZpbmUgTUFYX0NPTkNVUlJFTlRfTElOS1MgICAgMjA0OAorCit0eXBlZGVmIHN0cnVjdAoreworICAgIGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQ7CisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkga2V5OworICAgIEZJTEUgKmZpbGU7CisgICAgdm9pZCAqYnVmOworICAgIHVpbnQxNl90IGJsb2NrX3NpemU7CisgICAgdWludDE2X3QgbGFzdF9ibG9jazsKKyAgICB1aW50MTZfdCBsYXN0X2Jsb2NrX3NpemU7CisgICAgdWludDhfdCByZXRyaWVzOworICAgIGJjbW9zX2Jvb2wgZG9uZTsKKyAgICBiY21vc190aW1lciB0aW1lcjsKKyAgICB1aW50MzJfdCB0aW1lb3V0X3VzOworICAgIHVpbnQzMl90IGxhc3RfdGltZTsKK30gZXBvbl9vYW1fZHBvZV9md191cGdyYWRlX3N0YXRlOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQ7CisgICAgYmNtb2x0X3Byb3h5X3J4ICpyeDsKKyAgICBiY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtX2hhbmRsZV9yeF9jYiBjYjsKK30gZXBvbl9vYW1fcHJveHlfcnhfZGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBlcG9uX29hbV9kcG9lX2Z3X3VwZ3JhZGVfc3RhdGUgKnN0YXRlOworfSBlcG9uX29hbV90aW1lb3V0X2RhdGE7CisKK3R5cGVkZWYgdW5pb24KK3sKKyAgICBlcG9uX29hbV9wcm94eV9yeF9kYXRhIHByb3h5X3J4OworICAgIGVwb25fb2FtX3RpbWVvdXRfZGF0YSB0aW1lb3V0OworfSBlcG9uX29hbV9tc2dfZGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21vc19tc2cgb3NfbXNnOworICAgIGVwb25fb2FtX21zZ19kYXRhIGRhdGE7Cit9IGVwb25fb2FtX21zZzsKKworc3RhdGljIGJjbW9zX2Jvb2wgaXNfcnVubmluZyA9IEJDTU9TX0ZBTFNFOworc3RhdGljIGRldl9sb2dfaWQgZXBvbl9vYW1fbG9nW0JDTVRSX01BWF9PTFRTXTsKK3N0YXRpYyBjaGFyIG1hY19idWZbTUFDX1NUUl9MRU5dOworc3RhdGljIGJjbW9zX3Rhc2sgZXBvbl9vYW1fdGFzazsKK3N0YXRpYyBoYXNoX3RhYmxlICpkcG9lX2Z3X3VwZ3JhZGVfc3RhdGU7CisKK3N0YXRpYyB2b2lkIGVwb25fb2FtX2hhbmRsZV9vc19tc2coYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZCwgYmNtb3NfbXNnICpvc19tc2cpOworCisjZGVmaW5lIEVQT05fT0FNX0xPRyhsZXZlbCwgZGV2aWNlLCBsaW5rLCBmbXQsIGFyZ3MuLi4pICAgICBcCisgICAgQkNNX0xPR19DQUxMRVJfRk1UKGxldmVsLCBlcG9uX29hbV9sb2dbZGV2aWNlXSwgIiV1LSVzOiAiZm10LCAobGluayktPmVwb25fbmksIGJjbW9zX21hY18yX3N0cigmKGxpbmspLT5tYWNfYWRkcmVzcywgbWFjX2J1ZiksICMjYXJncykKKworc3RhdGljIGJjbW9zX2Vycm5vIGVwb25fb2FtX2dldF9tYWNfZGEoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtb2x0X2Vwb25fbmkgZXBvbiwgYmNtb3NfbWFjX2FkZHJlc3MgKm1hYykKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2Vwb25fbmlfY2ZnIHBvbl9jZmc7CisgICAgYmNtb2x0X2Vwb25fbmlfa2V5IHBvbl9rZXkgPSB7IC5lcG9uX25pID0gZXBvbiB9OworCisgICAgLyogcmV0cmlldmUgdGhlIEVQT04gTkkgTUFDIGFkZHJlc3MgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJnBvbl9jZmcsIGVwb25fbmksIHBvbl9rZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJnBvbl9jZmcsIGVwb25fbmksIG1hY19hZGRyZXNzKTsKKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldChkZXZpY2VfaWQsICZwb25fY2ZnLmhkcik7CisgICAgaWYgKEJDTV9FUlJfT0sgIT0gZXJyKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgZXBvbl9vYW1fbG9nW2RldmljZV9pZF0sICJGYWlsZWQgdG8gcmV0cmlldmUgRVBPTiBOSSBNQUMgYWRkcmVzcyFcbiIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAqbWFjID0gcG9uX2NmZy5kYXRhLm1hY19hZGRyZXNzOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitiY21vc19lcnJubyBlcG9uX29hbV9wYWNrX2ZyYW1lKGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSAqb2FtX2ZyYW1lLCB1aW50OF90ICoqYnVmZmVyLCB1aW50MTZfdCAqbGVuZ3RoKQoreworICAgIGJjbW9sdF9idWYgYnVmOworCisgICAgKmxlbmd0aCA9IE1BWChiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWVfZ2V0X3BhY2tlZF9sZW5ndGgob2FtX2ZyYW1lKSwgNjApOworICAgICpidWZmZXIgPSBiY21vc19jYWxsb2MoKmxlbmd0aCk7CisgICAgaWYgKE5VTEwgPT0gKmJ1ZmZlcikKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKyAgICBiY21vbHRfYnVmX2luaXQoJmJ1ZiwgKmxlbmd0aCwgKmJ1ZmZlciwgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpOworICAgIGlmICghYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lX3BhY2sob2FtX2ZyYW1lLCAmYnVmKSkKKyAgICB7CisgICAgICAgIGJjbW9zX2ZyZWUoKmJ1ZmZlcik7CisgICAgICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19lcnJubyBlcG9uX29hbV9wYWNrX2FuZF9zZW5kKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX25pIGVwb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJjbW9zX21hY19hZGRyZXNzICptYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSAqb2FtX2ZyYW1lKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZXBvbl9saW5rX2luamVjdF9mcmFtZSBpbmplY3RfZnJhbWU7CisgICAgYmNtb2x0X2Vwb25fbGlua19rZXkgbGlua19rZXkgPSB7IC5lcG9uX25pID0gZXBvbiwgLm1hY19hZGRyZXNzID0gKm1hYyB9OworICAgIGJjbW9sdF9ldGhlcm5ldF9mcmFtZV91bm1hc2tlZCBmcmFtZTsKKworICAgIGVyciA9IGVwb25fb2FtX3BhY2tfZnJhbWUob2FtX2ZyYW1lLCAmZnJhbWUuZnJhbWVfb2N0ZXRzLnZhbCwgJmZyYW1lLmZyYW1lX29jdGV0cy5sZW4pOworICAgIGlmIChCQ01fRVJSX09LICE9IGVycikKKyAgICB7CisgICAgICAgIEVQT05fT0FNX0xPRyhFUlJPUiwgZGV2aWNlX2lkLCAmbGlua19rZXksICJGYWlsZWQgdG8gcGFjayBPQU0gZnJhbWU6ICVzIVxuIiwgYmNtb3Nfc3RyZXJyb3IoZXJyKSk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgQkNNT0xUX1BST1hZX0lOSVQoJmluamVjdF9mcmFtZSwgZXBvbl9saW5rLCBpbmplY3RfZnJhbWUsIGxpbmtfa2V5KTsKKyAgICBCQ01PTFRfUFJPWFlfUFJPUF9TRVQoJmluamVjdF9mcmFtZSwgZXBvbl9saW5rLCBpbmplY3RfZnJhbWUsIGZyYW1lLCBmcmFtZSk7CisgICAgZXJyID0gYmNtb2x0X3Byb3h5X3NlbmQoZGV2aWNlX2lkLCAmaW5qZWN0X2ZyYW1lLmhkcik7CisKKyAgICBiY21vc19mcmVlKGZyYW1lLmZyYW1lX29jdGV0cy52YWwpOworCisgICAgcmV0dXJuIGVycjsKK30KKworYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lICplcG9uX29hbV91bnBhY2soYmNtb2x0X2RldmlkIGRldmljZV9pZCwgdWludDMyX3QgbGVuLCB1aW50OF90ICpieXRlcykKK3sKKyAgICBiY21vbHRfYnVmIGJ1ZjsKKyAgICB1aW50MzJfdCB1bnBhY2tfYnl0ZXMgPSBzaXplb2YoYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lKTsKKyAgICB2b2lkICp1bnBhY2tfbWVtOworICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSAqZnJhbWU7CisgICAgdm9pZCAqZXh0cmFfbWVtOworCisgICAgLyogV2UgZG9uJ3Qga25vdyBob3cgbXVjaCBzcGFjZSB3ZSdsbCBuZWVkIHRvIHVucGFjayB0aGUgT0FNIGZyYW1lLiBTdGFydGluZyB3aXRoIHRoZSBrbm93biBmaXhlZCBzaXplLCB3ZSBzY2FuIHRoZQorICAgICAgIGZyYW1lIHRvIGRldGVybWluZSB0aGUgZXhhY3Qgc3BhY2UgbmVlZGVkICovCisgICAgYmNtb2x0X2J1Zl9pbml0KCZidWYsIGxlbiwgYnl0ZXMsIEJDTU9MVF9CVUZfRU5ESUFOX0ZJWEVEKTsKKyAgICBpZiAoIWJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZV9zY2FuKCZidWYsICZ1bnBhY2tfYnl0ZXMpKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgZXBvbl9vYW1fbG9nW2RldmljZV9pZF0sICJGYWlsZWQgdG8gc2NhbiBPQU0gZnJhbWVcbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgdW5wYWNrX21lbSA9IGJjbW9zX2NhbGxvYyh1bnBhY2tfYnl0ZXMpOworICAgIGlmIChOVUxMID09IHVucGFja19tZW0pCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBlcG9uX29hbV9sb2dbZGV2aWNlX2lkXSwgIkZhaWxlZCB0byBhbGxvY2F0ZSAldSBieXRlcyByZXF1aXJlZCB0byB1bnBhY2tcbiIsIHVucGFja19ieXRlcyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBCQ01fTE9HKERFQlVHLCBlcG9uX29hbV9sb2dbZGV2aWNlX2lkXSwgIlN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQgJXUgYnl0ZXMgcmVxdWlyZWQgdG8gdW5wYWNrXG4iLCB1bnBhY2tfYnl0ZXMpOworICAgIH0KKyAgICAvKiBOb3cgdGhhdCB3ZSBoYXZlIGFuIGFwcHJvcHJpYXRlbHkgc2l6ZWQgYnVmZmVyIHRvIHVucGFjayBpbnRvLCBwb2ludCB0aGUgZml4ZWQgc3RydWN0dXJlIHRvIHRoZSBzdGFydCBvZiB0aGUKKyAgICAgICBidWZmZXIgYW5kIGRpcmVjdCB0aGUgdW5wYWNrZXIgdG8gc3RvcmUgYW55IGFkZGl0aW9uYWwgZGF0YSBpbW1lZGlhdGVseSBhZnRlciB0aGF0ICovCisgICAgZnJhbWUgPSAoYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lKil1bnBhY2tfbWVtOworICAgIGV4dHJhX21lbSA9ICh2b2lkKikoZnJhbWUgKyAxKTsKKworICAgIGJjbW9sdF9idWZfaW5pdCgmYnVmLCBsZW4sIGJ5dGVzLCBCQ01PTFRfQlVGX0VORElBTl9GSVhFRCk7CisgICAgaWYgKCFiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWVfdW5wYWNrKGZyYW1lLCAmYnVmLCAmZXh0cmFfbWVtKSkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGVwb25fb2FtX2xvZ1tkZXZpY2VfaWRdLCAiRmFpbGVkIHRvIHVucGFjayBPQU0gZnJhbWVcbiIpOworICAgICAgICBiY21vc19mcmVlKHVucGFja19tZW0pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gZnJhbWU7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBlcG9uX29hbV9tYWtlX2Rwb2VfZnJhbWUoYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lICpvYW1fZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbCAqcHJvdG9jb2wpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgb2FtX2ZyYW1lLT5kYSA9IHNsb3dfcHJvdG9jb2xfbXVsdGljYXN0X21hYzsKKyAgICBlcnIgPSBlcG9uX29hbV9nZXRfbWFjX2RhKGRldmljZV9pZCwgZXBvbiwgJm9hbV9mcmFtZS0+c2EpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihCQ01fRVJSX09LICE9IGVyciwgZXJyKTsKKyAgICBvYW1fZnJhbWUtPnByb3RvY29sc19jb3VudCA9IDE7CisgICAgb2FtX2ZyYW1lLT5wcm90b2NvbHMgPSBwcm90b2NvbDsKKyAgICBwcm90b2NvbC0+ZXRoZXJ0eXBlID0gQkNNT0xUX0VQT05fT0FNX1BST1RPQ09MX1RZUEVfU0xPV19QUk9UT0NPTDsKKyAgICBwcm90b2NvbC0+dS5zbG93X3Byb3RvY29sLnZhbHVlLnN1YnR5cGUgPSBCQ01PTFRfRVBPTl9PQU1fU0xPV19QUk9UT0NPTF9TVUJUWVBFX09BTTsKKyAgICBwcm90b2NvbC0+dS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmZsYWdzID0KKyAgICAgICAgQkNNT0xUX0VQT05fT0FNX09BTV9GTEFHU19MT0NBTF9TVEFCTEUgfCBCQ01PTFRfRVBPTl9PQU1fT0FNX0ZMQUdTX1JFTU9URV9TVEFCTEU7CisgICAgcHJvdG9jb2wtPnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LmNvZGUgPSBCQ01PTFRfRVBPTl9PQU1fT0FNX09QQ09ERV9PUkdBTklaQVRJT05fU1BFQ0lGSUM7CisgICAgcHJvdG9jb2wtPnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLm91aSA9CisgICAgICAgIEJDTU9MVF9FUE9OX09BTV9XRUxMX0tOT1dOX09VSV9EUE9FOworCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGVwb25fb2FtX3NlbmRfb3NfbXNnKGJjbW9zX21zZ19pZCB0eXBlLCBlcG9uX29hbV9tc2dfZGF0YSAqbXNnX2RhdGEpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgZXBvbl9vYW1fbXNnICptc2cgPSBiY21vc19jYWxsb2Moc2l6ZW9mKCptc2cpKTsKKworICAgIGlmIChtc2cgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGVwb25fb2FtX2xvZ1ttc2dfZGF0YS0+cHJveHlfcnguZGV2aWNlX2lkXSwgIk9TIG1zZyBjYWxsb2MgZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorCisgICAgbXNnLT5vc19tc2cudHlwZSA9IHR5cGU7CisgICAgbXNnLT5vc19tc2cuaGFuZGxlciA9IGVwb25fb2FtX2hhbmRsZV9vc19tc2c7CisgICAgbXNnLT5kYXRhID0gKm1zZ19kYXRhOworICAgIHJjID0gYmNtb3NfbXNnX3NlbmRfdG9fbW9kdWxlKEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfRVBPTl9PQU0sICZtc2ctPm9zX21zZywgMCk7CisgICAgaWYgKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBlcG9uX29hbV9sb2dbbXNnX2RhdGEtPnByb3h5X3J4LmRldmljZV9pZF0sICJPUyBtc2cgc2VuZCBmYWlsZWRcbiIpOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKK2JjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2VfZ2V0X2NyaXRpY2FsX2luZm8oYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgKm1hYykKK3sKKyAgICBiY21vc19lcnJubyBlcnIgPSBCQ01fRVJSX09LOworCisgICAgLyogT0FNIHN0dWZmICovCisgICAgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lIG9hbV9mcmFtZTsKKyAgICBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2wgcHJvdG9jb2w7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2Rlc2NyaXB0b3IgdmFyc1szXSA9IHt9OworCisgICAgZXJyID0gZXBvbl9vYW1fbWFrZV9kcG9lX2ZyYW1lKGRldmljZV9pZCwgZXBvbiwgJm9hbV9mcmFtZSwgJnByb3RvY29sKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoQkNNX0VSUl9PSyAhPSBlcnIsIGVycik7CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5kcG9lLnZhbHVlLm9wID0KKyAgICAgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0dFVF9SRVFVRVNUOworICAgIHByb3RvY29sLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLnUuZHBvZS52YWx1ZS51LmdldF9yZXF1ZXN0LnZhcnNfY291bnQgPQorICAgICAgICAzOworICAgIHByb3RvY29sLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLnUuZHBvZS52YWx1ZS51LmdldF9yZXF1ZXN0LnZhcnMgPSB2YXJzOworICAgIHZhcnNbMF0uYnJhbmNoID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VYVEVOREVEX0FUVFJJQlVURTsKKyAgICB2YXJzWzBdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmxlYWYgPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PTlVfSUQ7CisgICAgdmFyc1sxXS5icmFuY2ggPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRVhURU5ERURfQVRUUklCVVRFOworICAgIHZhcnNbMV0udS5leHRlbmRlZF9hdHRyaWJ1dGUubGVhZiA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX01BWF9MT0dJQ0FMX0xJTktTOworICAgIHZhcnNbMl0uYnJhbmNoID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VORDsKKyAgICB2YXJzWzJdLnUuZW5kLnVua25vd25fY291bnQgPSAwOworICAgIHZhcnNbMl0udS5lbmQudW5rbm93biA9IE5VTEw7CisKKyAgICByZXR1cm4gZXBvbl9vYW1fcGFja19hbmRfc2VuZChkZXZpY2VfaWQsIGVwb24sIG1hYywgJm9hbV9mcmFtZSk7Cit9CisKK2JjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2Vfc2V0X29hbV9yYXRlKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9uaSBlcG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgKm1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBtYXgpCit7CisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKworICAgIC8qIE9BTSBzdHVmZiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSBvYW1fZnJhbWU7CisgICAgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sIHByb3RvY29sOworICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZSB2YXJzWzJdID0ge307CisKKyAgICBlcnIgPSBlcG9uX29hbV9tYWtlX2Rwb2VfZnJhbWUoZGV2aWNlX2lkLCBlcG9uLCAmb2FtX2ZyYW1lLCAmcHJvdG9jb2wpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihCQ01fRVJSX09LICE9IGVyciwgZXJyKTsKKyAgICBwcm90b2NvbC51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmRwb2UudmFsdWUub3AgPQorICAgICAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU0VUX1JFUVVFU1Q7CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5kcG9lLnZhbHVlLnUuc2V0X3JlcXVlc3QudmFyc19jb3VudCA9CisgICAgICAgIDI7CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5kcG9lLnZhbHVlLnUuc2V0X3JlcXVlc3QudmFycyA9IHZhcnM7CisgICAgdmFyc1swXS5icmFuY2ggPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRVhURU5ERURfQVRUUklCVVRFOworICAgIHZhcnNbMF0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLmxlYWYgPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9PQU1fUkFURTsKKyAgICB2YXJzWzBdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51Lm9hbV9yYXRlLm1pbmltdW1fb2FtX3JhdGUgPSBtaW47CisgICAgdmFyc1swXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5vYW1fcmF0ZS5tYXhpbXVtX29hbV9yYXRlID0gbWF4OworICAgIHZhcnNbMV0uYnJhbmNoID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VORDsKKyAgICB2YXJzWzFdLnUuZW5kLnVua25vd25fY291bnQgPSAwOworICAgIHZhcnNbMV0udS5lbmQudW5rbm93biA9IE5VTEw7CisKKyAgICByZXR1cm4gZXBvbl9vYW1fcGFja19hbmRfc2VuZChkZXZpY2VfaWQsIGVwb24sIG1hYywgJm9hbV9mcmFtZSk7Cit9CisKK2JjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2Vfc2V0X3JlcG9ydF90aHJlc2hvbGRzKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9uaSBlcG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgKm1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcmVwb3J0X3ZhbHVlc19wZXJfcXVldWVfc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX3F1ZXVlX3NldHMgcXVldWVfc2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbnVtX3F1ZXVlX3NldHMpCit7CisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKworICAgIC8qIE9BTSBzdHVmZiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSBvYW1fZnJhbWU7CisgICAgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sIHByb3RvY29sOworICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZSB2YXJzWzJdID0ge307CisKKyAgICBlcnIgPSBlcG9uX29hbV9tYWtlX2Rwb2VfZnJhbWUoZGV2aWNlX2lkLCBlcG9uLCAmb2FtX2ZyYW1lLCAmcHJvdG9jb2wpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihCQ01fRVJSX09LICE9IGVyciwgZXJyKTsKKyAgICBwcm90b2NvbC51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmRwb2UudmFsdWUub3AgPQorICAgICAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU0VUX1JFUVVFU1Q7CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5kcG9lLnZhbHVlLnUuc2V0X3JlcXVlc3QudmFyc19jb3VudCA9CisgICAgICAgIDI7CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5kcG9lLnZhbHVlLnUuc2V0X3JlcXVlc3QudmFycyA9IHZhcnM7CisgICAgdmFyc1swXS5icmFuY2ggPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRVhURU5ERURfQVRUUklCVVRFOworICAgIHZhcnNbMF0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLmxlYWYgPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9SRVBPUlRfVEhSRVNIT0xEUzsKKyAgICB2YXJzWzBdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51LnJlcG9ydF90aHJlc2hvbGRzLm51bWJlcl9vZl9xdWV1ZV9zZXRzID0gbnVtX3F1ZXVlX3NldHM7CisgICAgdmFyc1swXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5yZXBvcnRfdGhyZXNob2xkcy5yZXBvcnRfdmFsdWVzX3Blcl9xdWV1ZV9zZXQgPQorICAgICAgICByZXBvcnRfdmFsdWVzX3Blcl9xdWV1ZV9zZXQ7CisgICAgdmFyc1swXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5yZXBvcnRfdGhyZXNob2xkcy5xdWV1ZV9zZXQwID0gcXVldWVfc2V0c1swXTsKKyAgICB2YXJzWzBdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51LnJlcG9ydF90aHJlc2hvbGRzLnF1ZXVlX3NldDEgPSBxdWV1ZV9zZXRzWzFdOworICAgIHZhcnNbMF0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLnUucmVwb3J0X3RocmVzaG9sZHMucXVldWVfc2V0MiA9IHF1ZXVlX3NldHNbMl07CisgICAgdmFyc1swXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5yZXBvcnRfdGhyZXNob2xkcy5xdWV1ZV9zZXQzID0gcXVldWVfc2V0c1szXTsKKyAgICB2YXJzWzFdLmJyYW5jaCA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FTkQ7CisgICAgdmFyc1sxXS51LmVuZC51bmtub3duX2NvdW50ID0gMDsKKyAgICB2YXJzWzFdLnUuZW5kLnVua25vd24gPSBOVUxMOworCisgICAgcmV0dXJuIGVwb25fb2FtX3BhY2tfYW5kX3NlbmQoZGV2aWNlX2lkLCBlcG9uLCBtYWMsICZvYW1fZnJhbWUpOworfQorCitiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX3NldF9lbmNyeXB0aW9uKAorICAgIGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiwKKyAgICBiY21vc19tYWNfYWRkcmVzcyAqbWFjLAorICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX2VuY3J5cHRpb25fbW9kZSBlbmNfbW9kZSwKKyAgICB1aW50MTZfdCBwZXJpb2QpCit7CisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKworICAgIC8qIE9BTSBzdHVmZiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSBvYW1fZnJhbWU7CisgICAgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sIHByb3RvY29sOworICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZSB2YXJzWzNdID0ge307CisKKyAgICBlcnIgPSBlcG9uX29hbV9tYWtlX2Rwb2VfZnJhbWUoZGV2aWNlX2lkLCBlcG9uLCAmb2FtX2ZyYW1lLCAmcHJvdG9jb2wpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihCQ01fRVJSX09LICE9IGVyciwgZXJyKTsKKyAgICBwcm90b2NvbC51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmRwb2UudmFsdWUub3AgPQorICAgICAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU0VUX1JFUVVFU1Q7CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5kcG9lLnZhbHVlLnUuc2V0X3JlcXVlc3QudmFyc19jb3VudCA9CisgICAgICAgIDM7CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5kcG9lLnZhbHVlLnUuc2V0X3JlcXVlc3QudmFycyA9IHZhcnM7CisgICAgdmFyc1swXS5icmFuY2ggPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRVhURU5ERURfQVRUUklCVVRFOworICAgIHZhcnNbMF0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLmxlYWYgPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9FTkNSWVBUX01PREU7CisgICAgdmFyc1swXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5lbmNyeXB0X21vZGUuZW5jcnlwdGlvbl9tZXRob2QgPSBlbmNfbW9kZTsKKyAgICB2YXJzWzFdLmJyYW5jaCA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BVFRSSUJVVEU7CisgICAgdmFyc1sxXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUubGVhZiA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX0tFWV9FWFBJUllfVElNRTsKKyAgICB2YXJzWzFdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51LmtleV9leHBpcnlfdGltZS50aW1lID0gcGVyaW9kOworICAgIHZhcnNbMl0uYnJhbmNoID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VORDsKKyAgICB2YXJzWzJdLnUuZW5kLnVua25vd25fY291bnQgPSAwOworICAgIHZhcnNbMl0udS5lbmQudW5rbm93biA9IE5VTEw7CisKKyAgICByZXR1cm4gZXBvbl9vYW1fcGFja19hbmRfc2VuZChkZXZpY2VfaWQsIGVwb24sIG1hYywgJm9hbV9mcmFtZSk7Cit9CisKK2JjbW9zX2Jvb2wgZXBvbl9vYW1faXNfZHBvZShiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWUgKm9hbSkKK3sKKyAgICByZXR1cm4gKChvYW0tPnByb3RvY29sc19jb3VudCA+IDApICYmCisgICAgICAgIChCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9TTE9XX1BST1RPQ09MID09IG9hbS0+cHJvdG9jb2xzWzBdLmV0aGVydHlwZSkgJiYKKyAgICAgICAgKEJDTU9MVF9FUE9OX09BTV9TTE9XX1BST1RPQ09MX1NVQlRZUEVfT0FNID09IG9hbS0+cHJvdG9jb2xzWzBdLnUuc2xvd19wcm90b2NvbC52YWx1ZS5zdWJ0eXBlKSAmJgorICAgICAgICAoQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfT1JHQU5JWkFUSU9OX1NQRUNJRklDID09CisgICAgICAgICBvYW0tPnByb3RvY29sc1swXS51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC5jb2RlKSAmJgorICAgICAgICAoQkNNT0xUX0VQT05fT0FNX1dFTExfS05PV05fT1VJX0RQT0UgPT0KKyAgICAgICAgIG9hbS0+cHJvdG9jb2xzWzBdLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLm91aSkpOworfQorCitiY21vc19ib29sIGVwb25fb2FtX2lzX2Rwb2VfZW5jcnlwdF9yZXNwb25zZShiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZSAqZHBvZSkKK3sKKyAgICByZXR1cm4gKEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9TRVRfUkVTUE9OU0UgPT0gZHBvZS0+b3ApICYmCisgICAgICAgIChkcG9lLT51LnNldF9yZXNwb25zZS52YXJzX2NvdW50ID4gMikgJiYKKyAgICAgICAgKEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BVFRSSUJVVEUgPT0gZHBvZS0+dS5zZXRfcmVzcG9uc2UudmFyc1swXS5icmFuY2gpICYmCisgICAgICAgIChCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9FTkNSWVBUX01PREUgPT0KKyAgICAgICAgIGRwb2UtPnUuc2V0X3Jlc3BvbnNlLnZhcnNbMF0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLmxlYWYpICYmCisgICAgICAgIChCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRVhURU5ERURfQVRUUklCVVRFID09IGRwb2UtPnUuc2V0X3Jlc3BvbnNlLnZhcnNbMV0uYnJhbmNoKSAmJgorICAgICAgICAoQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfS0VZX0VYUElSWV9USU1FID09CisgICAgICAgICBkcG9lLT51LnNldF9yZXNwb25zZS52YXJzWzFdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS5sZWFmKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2VfY2xlYXJfaW5ncmVzc19ydWxlc19tYWtlX2ZyYW1lKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vc19tYWNfYWRkcmVzcyAqbWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSAqb2FtX2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlICp2YXJzKQoreworICAgIGJjbW9zX2Vycm5vIGVyciA9IEJDTV9FUlJfT0s7CisKKyAgICAvKiBPQU0gc3R1ZmYgKi8KKyAgICBlcnIgPSBlcG9uX29hbV9tYWtlX2Rwb2VfZnJhbWUoZGV2aWNlX2lkLCBlcG9uLCBvYW1fZnJhbWUsIHByb3RvY29sKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoQkNNX0VSUl9PSyAhPSBlcnIsIGVycik7CisgICAgcHJvdG9jb2wtPnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLnUuZHBvZS52YWx1ZS5vcCA9CisgICAgICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9TRVRfUkVRVUVTVDsKKyAgICBwcm90b2NvbC0+dS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5kcG9lLnZhbHVlLnUuc2V0X3JlcXVlc3QudmFyc19jb3VudCA9CisgICAgICAgIDM7CisgICAgcHJvdG9jb2wtPnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLnUuZHBvZS52YWx1ZS51LnNldF9yZXF1ZXN0LnZhcnMgPSB2YXJzOworICAgIHZhcnNbMF0uYnJhbmNoID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX09CSkVDVDsKKyAgICB2YXJzWzFdLmJyYW5jaCA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BQ1RJT047CisgICAgdmFyc1sxXS51LmV4dGVuZGVkX2FjdGlvbi5hY3Rpb24ubGVhZiA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0NMRUFSX0lOR1JFU1NfUlVMRVM7CisgICAgdmFyc1syXS5icmFuY2ggPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRU5EOworICAgIHZhcnNbMl0udS5lbmQudW5rbm93bl9jb3VudCA9IDA7CisgICAgdmFyc1syXS51LmVuZC51bmtub3duID0gTlVMTDsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX2NsZWFyX2luZ3Jlc3NfcnVsZXNfbmV0d29ya19wb24oYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9uaSBlcG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzICptYWMpCit7CisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKworICAgIC8qIE9BTSBzdHVmZiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSBvYW1fZnJhbWU7CisgICAgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sIHByb3RvY29sOworICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZSB2YXJzWzNdID0ge307CisgICAgdWludDhfdCBwb3J0ID0gMDsKKworICAgIGVwb25fb2FtX2Rwb2VfY2xlYXJfaW5ncmVzc19ydWxlc19tYWtlX2ZyYW1lKGRldmljZV9pZCwgZXBvbiwgbWFjLCAmb2FtX2ZyYW1lLCAmcHJvdG9jb2wsIHZhcnMpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihCQ01fRVJSX09LICE9IGVyciwgZXJyKTsKKworICAgIHZhcnNbMF0udS5vYmplY3Qub2JqZWN0X2NvbnRleHQub2JqZWN0X3R5cGUgPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9ORVRXT1JLX1BPTjsKKyAgICB2YXJzWzBdLnUub2JqZWN0Lm9iamVjdF9jb250ZXh0LnUubmV0d29ya19wb24ucG9uX2NvdW50ID0gMTsKKyAgICB2YXJzWzBdLnUub2JqZWN0Lm9iamVjdF9jb250ZXh0LnUubmV0d29ya19wb24ucG9uID0gJnBvcnQ7CisKKyAgICByZXR1cm4gZXBvbl9vYW1fcGFja19hbmRfc2VuZChkZXZpY2VfaWQsIGVwb24sIG1hYywgJm9hbV9mcmFtZSk7Cit9CisKK2JjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2VfY2xlYXJfaW5ncmVzc19ydWxlc191c2VyX3BvcnQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgKm1hYykKK3sKKyAgICBiY21vc19lcnJubyBlcnIgPSBCQ01fRVJSX09LOworCisgICAgLyogT0FNIHN0dWZmICovCisgICAgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lIG9hbV9mcmFtZTsKKyAgICBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2wgcHJvdG9jb2w7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlIHZhcnNbM10gPSB7fTsKKyAgICB1aW50OF90IHBvcnQgPSAwOworCisgICAgZXBvbl9vYW1fZHBvZV9jbGVhcl9pbmdyZXNzX3J1bGVzX21ha2VfZnJhbWUoZGV2aWNlX2lkLCBlcG9uLCBtYWMsICZvYW1fZnJhbWUsICZwcm90b2NvbCwgdmFycyk7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKEJDTV9FUlJfT0sgIT0gZXJyLCBlcnIpOworCisgICAgdmFyc1swXS51Lm9iamVjdC5vYmplY3RfY29udGV4dC5vYmplY3RfdHlwZSA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX1VTRVJfUE9SVDsKKyAgICB2YXJzWzBdLnUub2JqZWN0Lm9iamVjdF9jb250ZXh0LnUudXNlcl9wb3J0LnBvcnRfY291bnQgPSAxOworICAgIHZhcnNbMF0udS5vYmplY3Qub2JqZWN0X2NvbnRleHQudS51c2VyX3BvcnQucG9ydCA9ICZwb3J0OworCisgICAgcmV0dXJuIGVwb25fb2FtX3BhY2tfYW5kX3NlbmQoZGV2aWNlX2lkLCBlcG9uLCBtYWMsICZvYW1fZnJhbWUpOworfQorCitiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX2NsZWFyX2luZ3Jlc3NfcnVsZXMoYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9uaSBlcG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzICptYWMpCit7CisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKworICAgIGVyciA9IGVwb25fb2FtX2Rwb2VfY2xlYXJfaW5ncmVzc19ydWxlc19uZXR3b3JrX3BvbihkZXZpY2VfaWQsIGVwb24sIG1hYyk7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKEJDTV9FUlJfT0sgIT0gZXJyLCBlcnIpOworCisgICAgcmV0dXJuIGVwb25fb2FtX2Rwb2VfY2xlYXJfaW5ncmVzc19ydWxlc191c2VyX3BvcnQoZGV2aWNlX2lkLCBlcG9uLCBtYWMpOworfQorCitiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX3NldF9iYXNpY19xdWV1ZV9jb25maWcoYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9uaSBlcG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzICptYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB1cF9xdWV1ZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZG5fcXVldWVfc2l6ZSkKK3sKKyAgICBiY21vc19lcnJubyBlcnIgPSBCQ01fRVJSX09LOworCisgICAgLyogT0FNIHN0dWZmICovCisgICAgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lIG9hbV9mcmFtZTsKKyAgICBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2wgcHJvdG9jb2w7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlIHZhcnNbMl0gPSB7fTsKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9xdWV1ZV9zZXQgdXBfcXVldWVfc2V0OworICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX3F1ZXVlX3NldCBkbl9xdWV1ZV9zZXQ7CisKKyAgICBlcnIgPSBlcG9uX29hbV9tYWtlX2Rwb2VfZnJhbWUoZGV2aWNlX2lkLCBlcG9uLCAmb2FtX2ZyYW1lLCAmcHJvdG9jb2wpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihCQ01fRVJSX09LICE9IGVyciwgZXJyKTsKKyAgICBwcm90b2NvbC51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmRwb2UudmFsdWUub3AgPQorICAgICAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU0VUX1JFUVVFU1Q7CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5kcG9lLnZhbHVlLnUuc2V0X3JlcXVlc3QudmFyc19jb3VudCA9CisgICAgICAgIDI7CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5kcG9lLnZhbHVlLnUuc2V0X3JlcXVlc3QudmFycyA9IHZhcnM7CisgICAgdmFyc1swXS5icmFuY2ggPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRVhURU5ERURfQVRUUklCVVRFOworICAgIHZhcnNbMF0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLmxlYWYgPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9MRUFGX0FUVFJJQlVURV9RVUVVRV9DT05GSUc7CisgICAgdmFyc1swXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5xdWV1ZV9jb25maWcubnVtYmVyX29mX2xpbmtzID0gMTsKKyAgICB2YXJzWzBdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51LnF1ZXVlX2NvbmZpZy5saW5rX2NvbmZpZ3VyYXRpb24gPSAmdXBfcXVldWVfc2V0OworICAgIHVwX3F1ZXVlX3NldC5xdWV1ZV9jb3VudCA9IDE7CisgICAgdXBfcXVldWVfc2V0LnF1ZXVlX3NpemVzID0gJnVwX3F1ZXVlX3NpemU7CisgICAgdmFyc1swXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5xdWV1ZV9jb25maWcubnVtYmVyX29mX3BvcnRzID0gMTsKKyAgICB2YXJzWzBdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51LnF1ZXVlX2NvbmZpZy5wb3J0X2NvbmZpZ3VyYXRpb24gPSAmZG5fcXVldWVfc2V0OworICAgIGRuX3F1ZXVlX3NldC5xdWV1ZV9jb3VudCA9IDE7CisgICAgZG5fcXVldWVfc2V0LnF1ZXVlX3NpemVzID0gJmRuX3F1ZXVlX3NpemU7CisgICAgdmFyc1sxXS5icmFuY2ggPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRU5EOworICAgIHZhcnNbMV0udS5lbmQudW5rbm93bl9jb3VudCA9IDA7CisgICAgdmFyc1sxXS51LmVuZC51bmtub3duID0gTlVMTDsKKworICAgIHJldHVybiBlcG9uX29hbV9wYWNrX2FuZF9zZW5kKGRldmljZV9pZCwgZXBvbiwgbWFjLCAmb2FtX2ZyYW1lKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2VfYWRkX2luZ3Jlc3NfcnVsZXNfbWFrZV9mcmFtZShiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9uaSBlcG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vc19tYWNfYWRkcmVzcyAqbWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWUgKm9hbV9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlICp2YXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcG9lX3J1bGVfdmxhbl9tb2RlIHZsYW5fbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB2bGFuX3RhZ1s0XSkKK3sKKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgdmFyX2NvdW50W0RQT0VfUlVMRV9WTEFOX01PREVfQ09VTlRdID0KKyAgICB7CisgICAgICAgIFtEUE9FX1JVTEVfVkxBTl9NT0RFX05PTkVdID0gOCwKKyAgICAgICAgW0RQT0VfUlVMRV9WTEFOX01PREVfQUREXSA9IDEwLAorICAgICAgICBbRFBPRV9SVUxFX1ZMQU5fTU9ERV9SRU1PVkVdID0gOQorICAgIH07CisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKworICAgIC8qIE9BTSBzdHVmZiAqLworICAgIGVyciA9IGVwb25fb2FtX21ha2VfZHBvZV9mcmFtZShkZXZpY2VfaWQsIGVwb24sIG9hbV9mcmFtZSwgcHJvdG9jb2wpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihCQ01fRVJSX09LICE9IGVyciwgZXJyKTsKKyAgICBwcm90b2NvbC0+dS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5kcG9lLnZhbHVlLm9wID0KKyAgICAgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1NFVF9SRVFVRVNUOworICAgIHByb3RvY29sLT51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmRwb2UudmFsdWUudS5zZXRfcmVxdWVzdC52YXJzX2NvdW50ID0KKyAgICAgICAgdmFyX2NvdW50W3ZsYW5fbW9kZV07CisgICAgcHJvdG9jb2wtPnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLnUuZHBvZS52YWx1ZS51LnNldF9yZXF1ZXN0LnZhcnMgPSB2YXJzOworICAgIHZhcnNbMF0uYnJhbmNoID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX09CSkVDVDsKKyAgICB2YXJzWzFdLmJyYW5jaCA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BVFRSSUJVVEU7CisgICAgdmFyc1sxXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUubGVhZiA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BPUlRfSU5HUkVTU19SVUxFOworICAgIHZhcnNbMV0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLnUucG9ydF9pbmdyZXNzX3J1bGUucnVsZS5zdWJ0eXBlID0gQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9IRUFERVI7CisgICAgdmFyc1sxXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5wb3J0X2luZ3Jlc3NfcnVsZS5ydWxlLnUuaGVhZGVyLnByZWNlZGVuY2UgPSAxMDsKKyAgICB2YXJzWzJdLmJyYW5jaCA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BVFRSSUJVVEU7CisgICAgdmFyc1syXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUubGVhZiA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BPUlRfSU5HUkVTU19SVUxFOworICAgIHZhcnNbMl0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLnUucG9ydF9pbmdyZXNzX3J1bGUucnVsZS5zdWJ0eXBlID0gQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9DTEFVU0U7CisgICAgdmFyc1syXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5wb3J0X2luZ3Jlc3NfcnVsZS5ydWxlLnUuY2xhdXNlLmZpZWxkX2NvZGUuY29kZSA9CisgICAgICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJRUxEX0NPREVfTDJEQTsKKyAgICB2YXJzWzJdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51LnBvcnRfaW5ncmVzc19ydWxlLnJ1bGUudS5jbGF1c2UuZmllbGRfY29kZS5pbnN0YW5jZSA9IDA7CisgICAgdmFyc1syXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5wb3J0X2luZ3Jlc3NfcnVsZS5ydWxlLnUuY2xhdXNlLm1zYl9tYXNrID0gMDsKKyAgICB2YXJzWzJdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51LnBvcnRfaW5ncmVzc19ydWxlLnJ1bGUudS5jbGF1c2UubHNiX21hc2sgPSAwOworICAgIHZhcnNbMl0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLnUucG9ydF9pbmdyZXNzX3J1bGUucnVsZS51LmNsYXVzZS5vcGVyYXRvciA9CisgICAgICAgIEJDTU9MVF9FUE9OX09BTV9SVUxFX09QRVJBVE9SX0FMV0FZU19NQVRDSDsKKyAgICB2YXJzWzJdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51LnBvcnRfaW5ncmVzc19ydWxlLnJ1bGUudS5jbGF1c2UubWF0Y2hfdmFsdWVfbGVuZ3RoID0gMDsKKyAgICB2YXJzWzJdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51LnBvcnRfaW5ncmVzc19ydWxlLnJ1bGUudS5jbGF1c2UubWF0Y2hfdmFsdWUgPSBOVUxMOworICAgIHZhcnNbM10uYnJhbmNoID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VYVEVOREVEX0FUVFJJQlVURTsKKyAgICB2YXJzWzNdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS5sZWFmID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUE9SVF9JTkdSRVNTX1JVTEU7CisgICAgdmFyc1szXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5wb3J0X2luZ3Jlc3NfcnVsZS5ydWxlLnN1YnR5cGUgPSBCQ01PTFRfRVBPTl9PQU1fUlVMRV9UWVBFX1JFU1VMVDsKKyAgICB2YXJzWzNdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51LnBvcnRfaW5ncmVzc19ydWxlLnJ1bGUudS5yZXN1bHQucmVzdWx0LnJlc3VsdCA9CisgICAgICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9RVUVVRTsKKyAgICB2YXJzWzRdLmJyYW5jaCA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BVFRSSUJVVEU7CisgICAgdmFyc1s0XS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUubGVhZiA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BPUlRfSU5HUkVTU19SVUxFOworICAgIHZhcnNbNF0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLnUucG9ydF9pbmdyZXNzX3J1bGUucnVsZS5zdWJ0eXBlID0gQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9SRVNVTFQ7CisgICAgdmFyc1s0XS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5wb3J0X2luZ3Jlc3NfcnVsZS5ydWxlLnUucmVzdWx0LnJlc3VsdC5yZXN1bHQgPQorICAgICAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfRk9SV0FSRDsKKworICAgIHN3aXRjaCAodmxhbl9tb2RlKQorICAgIHsKKyAgICAgICAgY2FzZSBEUE9FX1JVTEVfVkxBTl9NT0RFX05PTkU6CisgICAgICAgICAgICBicmVhazsgLyogbm90aGluZyB0byBkbyAqLworICAgICAgICBjYXNlIERQT0VfUlVMRV9WTEFOX01PREVfQUREOgorICAgICAgICAgICAgdmFyc1s1XS5icmFuY2ggPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRVhURU5ERURfQVRUUklCVVRFOworICAgICAgICAgICAgdmFyc1s1XS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUubGVhZiA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BPUlRfSU5HUkVTU19SVUxFOworICAgICAgICAgICAgdmFyc1s1XS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5wb3J0X2luZ3Jlc3NfcnVsZS5ydWxlLnN1YnR5cGUgPSBCQ01PTFRfRVBPTl9PQU1fUlVMRV9UWVBFX1JFU1VMVDsKKyAgICAgICAgICAgIHZhcnNbNV0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLnUucG9ydF9pbmdyZXNzX3J1bGUucnVsZS51LnJlc3VsdC5yZXN1bHQucmVzdWx0ID0KKyAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9SRVNVTFRfSU5TRVJUOworICAgICAgICAgICAgdmFyc1s1XS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5wb3J0X2luZ3Jlc3NfcnVsZS5ydWxlLnUucmVzdWx0LnJlc3VsdC51Lmluc2VydC5maWVsZC5maWVsZC5jb2RlID0KKyAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUVMRF9DT0RFX0NWTEFOOworICAgICAgICAgICAgdmFyc1s1XS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5wb3J0X2luZ3Jlc3NfcnVsZS5ydWxlLnUucmVzdWx0LnJlc3VsdC51Lmluc2VydC5maWVsZC5maWVsZC5pbnN0YW5jZSA9IDA7CisgICAgICAgICAgICB2YXJzWzZdLmJyYW5jaCA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BVFRSSUJVVEU7CisgICAgICAgICAgICB2YXJzWzZdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS5sZWFmID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUE9SVF9JTkdSRVNTX1JVTEU7CisgICAgICAgICAgICB2YXJzWzZdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51LnBvcnRfaW5ncmVzc19ydWxlLnJ1bGUuc3VidHlwZSA9IEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfUkVTVUxUOworICAgICAgICAgICAgdmFyc1s2XS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5wb3J0X2luZ3Jlc3NfcnVsZS5ydWxlLnUucmVzdWx0LnJlc3VsdC5yZXN1bHQgPQorICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9TRVQ7CisgICAgICAgICAgICB2YXJzWzZdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51LnBvcnRfaW5ncmVzc19ydWxlLnJ1bGUudS5yZXN1bHQucmVzdWx0LnUuc2V0LmZpZWxkLmZpZWxkLmNvZGUgPQorICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJRUxEX0NPREVfQ1ZMQU47CisgICAgICAgICAgICB2YXJzWzZdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51LnBvcnRfaW5ncmVzc19ydWxlLnJ1bGUudS5yZXN1bHQucmVzdWx0LnUuc2V0LmZpZWxkLmZpZWxkLmluc3RhbmNlID0gMDsKKyAgICAgICAgICAgIHZhcnNbNl0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLnUucG9ydF9pbmdyZXNzX3J1bGUucnVsZS51LnJlc3VsdC5yZXN1bHQudS5zZXQudmFsdWVfY291bnQgPSA0OworICAgICAgICAgICAgdmFyc1s2XS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5wb3J0X2luZ3Jlc3NfcnVsZS5ydWxlLnUucmVzdWx0LnJlc3VsdC51LnNldC52YWx1ZSA9IHZsYW5fdGFnOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRFBPRV9SVUxFX1ZMQU5fTU9ERV9SRU1PVkU6CisgICAgICAgICAgICB2YXJzWzVdLmJyYW5jaCA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BVFRSSUJVVEU7CisgICAgICAgICAgICB2YXJzWzVdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS5sZWFmID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfUE9SVF9JTkdSRVNTX1JVTEU7CisgICAgICAgICAgICB2YXJzWzVdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51LnBvcnRfaW5ncmVzc19ydWxlLnJ1bGUuc3VidHlwZSA9IEJDTU9MVF9FUE9OX09BTV9SVUxFX1RZUEVfUkVTVUxUOworICAgICAgICAgICAgdmFyc1s1XS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5wb3J0X2luZ3Jlc3NfcnVsZS5ydWxlLnUucmVzdWx0LnJlc3VsdC5yZXN1bHQgPQorICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX1JFU1VMVF9ERUxFVEU7CisgICAgICAgICAgICB2YXJzWzVdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51LnBvcnRfaW5ncmVzc19ydWxlLnJ1bGUudS5yZXN1bHQucmVzdWx0LnUuZGVsZXRlLmZpZWxkLmZpZWxkLmNvZGUgPQorICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJRUxEX0NPREVfQ1ZMQU47CisgICAgICAgICAgICB2YXJzWzVdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51LnBvcnRfaW5ncmVzc19ydWxlLnJ1bGUudS5yZXN1bHQucmVzdWx0LnUuZGVsZXRlLmZpZWxkLmZpZWxkLmluc3RhbmNlID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICB9CisKKyAgICB2YXJzW3Zhcl9jb3VudFt2bGFuX21vZGVdLTNdLmJyYW5jaCA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BVFRSSUJVVEU7CisgICAgdmFyc1t2YXJfY291bnRbdmxhbl9tb2RlXS0zXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUubGVhZiA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX1BPUlRfSU5HUkVTU19SVUxFOworICAgIHZhcnNbdmFyX2NvdW50W3ZsYW5fbW9kZV0tM10udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLnUucG9ydF9pbmdyZXNzX3J1bGUucnVsZS5zdWJ0eXBlID0gQkNNT0xUX0VQT05fT0FNX1JVTEVfVFlQRV9URVJNSU5BVE9SOworICAgIHZhcnNbdmFyX2NvdW50W3ZsYW5fbW9kZV0tMl0uYnJhbmNoID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VYVEVOREVEX0FDVElPTjsKKyAgICB2YXJzW3Zhcl9jb3VudFt2bGFuX21vZGVdLTJdLnUuZXh0ZW5kZWRfYWN0aW9uLmFjdGlvbi5sZWFmID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fQUREX0lOR1JFU1NfUlVMRVM7CisgICAgdmFyc1t2YXJfY291bnRbdmxhbl9tb2RlXS0xXS5icmFuY2ggPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRU5EOworICAgIHZhcnNbdmFyX2NvdW50W3ZsYW5fbW9kZV0tMV0udS5lbmQudW5rbm93bl9jb3VudCA9IDA7CisgICAgdmFyc1t2YXJfY291bnRbdmxhbl9tb2RlXS0xXS51LmVuZC51bmtub3duID0gTlVMTDsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX2FkZF9pbmdyZXNzX3J1bGVzX25ldHdvcmtfcG9uKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX25pIGVwb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzICptYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwb2VfcnVsZV92bGFuX21vZGUgdmxhbl9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHZsYW5fdGFnWzRdKQoreworICAgIGJjbW9zX2Vycm5vIGVyciA9IEJDTV9FUlJfT0s7CisKKyAgICAvKiBPQU0gc3R1ZmYgKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWUgb2FtX2ZyYW1lOworICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbCBwcm90b2NvbDsKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2UgdmFyc1sxMF0gPSB7fTsKKyAgICB1aW50OF90IHBvcnQgPSAwOworCisgICAgZXJyID0gZXBvbl9vYW1fZHBvZV9hZGRfaW5ncmVzc19ydWxlc19tYWtlX2ZyYW1lKGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2FtX2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZsYW5fbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmxhbl90YWcpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihCQ01fRVJSX09LICE9IGVyciwgZXJyKTsKKworICAgIHZhcnNbMF0udS5vYmplY3Qub2JqZWN0X2NvbnRleHQub2JqZWN0X3R5cGUgPSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9ORVRXT1JLX1BPTjsKKyAgICB2YXJzWzBdLnUub2JqZWN0Lm9iamVjdF9jb250ZXh0LnUubmV0d29ya19wb24ucG9uX2NvdW50ID0gMTsKKyAgICB2YXJzWzBdLnUub2JqZWN0Lm9iamVjdF9jb250ZXh0LnUubmV0d29ya19wb24ucG9uID0gJnBvcnQ7CisgICAgdmFyc1szXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5wb3J0X2luZ3Jlc3NfcnVsZS5ydWxlLnUucmVzdWx0LnJlc3VsdC51LnF1ZXVlLnF1ZXVlLnR5cGUgPQorICAgICAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PQkpFQ1RfVFlQRV9VU0VSX1BPUlQ7CisgICAgdmFyc1szXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5wb3J0X2luZ3Jlc3NfcnVsZS5ydWxlLnUucmVzdWx0LnJlc3VsdC51LnF1ZXVlLnF1ZXVlLmluc3RhbmNlID0gMDsKKyAgICB2YXJzWzNdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51LnBvcnRfaW5ncmVzc19ydWxlLnJ1bGUudS5yZXN1bHQucmVzdWx0LnUucXVldWUucXVldWUucXVldWUgPSAwOworCisgICAgcmV0dXJuIGVwb25fb2FtX3BhY2tfYW5kX3NlbmQoZGV2aWNlX2lkLCBlcG9uLCBtYWMsICZvYW1fZnJhbWUpOworfQorCitiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX2FkZF9pbmdyZXNzX3J1bGVzX3VzZXJfcG9ydChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzICptYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcG9lX3J1bGVfdmxhbl9tb2RlIHZsYW5fbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgdmxhbl90YWdbNF0pCit7CisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKworICAgIC8qIE9BTSBzdHVmZiAqLworICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSBvYW1fZnJhbWU7CisgICAgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X3Byb3RvY29sIHByb3RvY29sOworICAgIGJjbW9sdF9lcG9uX29hbV9kcG9lX3Zhcl9jb250YWluZXJfYmFzZSB2YXJzWzEwXSA9IHt9OworICAgIHVpbnQ4X3QgcG9ydCA9IDA7CisKKyAgICBlcnIgPSBlcG9uX29hbV9kcG9lX2FkZF9pbmdyZXNzX3J1bGVzX21ha2VfZnJhbWUoZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvYW1fZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmxhbl9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bGFuX3RhZyk7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKEJDTV9FUlJfT0sgIT0gZXJyLCBlcnIpOworCisgICAgdmFyc1swXS51Lm9iamVjdC5vYmplY3RfY29udGV4dC5vYmplY3RfdHlwZSA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX09CSkVDVF9UWVBFX1VTRVJfUE9SVDsKKyAgICB2YXJzWzBdLnUub2JqZWN0Lm9iamVjdF9jb250ZXh0LnUudXNlcl9wb3J0LnBvcnRfY291bnQgPSAxOworICAgIHZhcnNbMF0udS5vYmplY3Qub2JqZWN0X2NvbnRleHQudS51c2VyX3BvcnQucG9ydCA9ICZwb3J0OworICAgIHZhcnNbM10udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLnUucG9ydF9pbmdyZXNzX3J1bGUucnVsZS51LnJlc3VsdC5yZXN1bHQudS5xdWV1ZS5xdWV1ZS50eXBlID0KKyAgICAgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfT0JKRUNUX1RZUEVfTElOSzsKKyAgICB2YXJzWzNdLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51LnBvcnRfaW5ncmVzc19ydWxlLnJ1bGUudS5yZXN1bHQucmVzdWx0LnUucXVldWUucXVldWUuaW5zdGFuY2UgPSAwOworICAgIHZhcnNbM10udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLnUucG9ydF9pbmdyZXNzX3J1bGUucnVsZS51LnJlc3VsdC5yZXN1bHQudS5xdWV1ZS5xdWV1ZS5xdWV1ZSA9IDA7CisgICAgcmV0dXJuIGVwb25fb2FtX3BhY2tfYW5kX3NlbmQoZGV2aWNlX2lkLCBlcG9uLCBtYWMsICZvYW1fZnJhbWUpOworfQorCitiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX2FkZF9pbmdyZXNzX3J1bGVzKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX25pIGVwb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzICptYWMpCit7CisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKworICAgIGVyciA9IGVwb25fb2FtX2Rwb2VfYWRkX2luZ3Jlc3NfcnVsZXNfbmV0d29ya19wb24oZGV2aWNlX2lkLCBlcG9uLCBtYWMsIERQT0VfUlVMRV9WTEFOX01PREVfTk9ORSwgTlVMTCk7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKEJDTV9FUlJfT0sgIT0gZXJyLCBlcnIpOworCisgICAgcmV0dXJuIGVwb25fb2FtX2Rwb2VfYWRkX2luZ3Jlc3NfcnVsZXNfdXNlcl9wb3J0KGRldmljZV9pZCwgZXBvbiwgbWFjLCBEUE9FX1JVTEVfVkxBTl9NT0RFX05PTkUsIE5VTEwpOworfQorCitiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX2FkZF9pbmdyZXNzX3J1bGVzX3dpdGhfdmxhbihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzICptYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHZsYW5fdGFnWzRdKQoreworICAgIHN0YXRpYyB1aW50OF90IGV4YW1wbGVfdmxhbls0XSA9IHsgMHg4MSwgMHgwMCwgMHgxMiwgMHgzNCB9OworICAgIGJjbW9zX2Vycm5vIGVyciA9IEJDTV9FUlJfT0s7CisKKyAgICBlcnIgPSBlcG9uX29hbV9kcG9lX2FkZF9pbmdyZXNzX3J1bGVzX25ldHdvcmtfcG9uKGRldmljZV9pZCwgZXBvbiwgbWFjLCBEUE9FX1JVTEVfVkxBTl9NT0RFX1JFTU9WRSwgTlVMTCk7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKEJDTV9FUlJfT0sgIT0gZXJyLCBlcnIpOworCisgICAgaWYgKE5VTEwgPT0gdmxhbl90YWcpCisgICAgeworICAgICAgICB2bGFuX3RhZyA9IGV4YW1wbGVfdmxhbjsKKyAgICB9CisgICAgcmV0dXJuIGVwb25fb2FtX2Rwb2VfYWRkX2luZ3Jlc3NfcnVsZXNfdXNlcl9wb3J0KGRldmljZV9pZCwgZXBvbiwgbWFjLCBEUE9FX1JVTEVfVkxBTl9NT0RFX0FERCwgdmxhbl90YWcpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gX2Vwb25fb2FtX2Rwb2VfdXNlcl90cmFmZmljX3NldF9hY3Rpb24oYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9uaSBlcG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzICptYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfbGVhZl9hY3Rpb24gYWN0aW9uKQoreworICAgIGJjbW9zX2Vycm5vIGVyciA9IEJDTV9FUlJfT0s7CisKKyAgICAvKiBPQU0gc3R1ZmYgKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWUgb2FtX2ZyYW1lOworICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbCBwcm90b2NvbDsKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV92YXJfY29udGFpbmVyX2Jhc2UgdmFyc1syXSA9IHt9OworCisgICAgZXJyID0gZXBvbl9vYW1fbWFrZV9kcG9lX2ZyYW1lKGRldmljZV9pZCwgZXBvbiwgJm9hbV9mcmFtZSwgJnByb3RvY29sKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoQkNNX0VSUl9PSyAhPSBlcnIsIGVycik7CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5kcG9lLnZhbHVlLm9wID0KKyAgICAgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX1NFVF9SRVFVRVNUOworICAgIHByb3RvY29sLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLnUuZHBvZS52YWx1ZS51LnNldF9yZXF1ZXN0LnZhcnNfY291bnQgPQorICAgICAgICAyOworICAgIHByb3RvY29sLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLnUuZHBvZS52YWx1ZS51LnNldF9yZXF1ZXN0LnZhcnMgPSB2YXJzOworICAgIHZhcnNbMF0uYnJhbmNoID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VYVEVOREVEX0FDVElPTjsKKyAgICB2YXJzWzBdLnUuZXh0ZW5kZWRfYWN0aW9uLmFjdGlvbi5sZWFmID0gYWN0aW9uOworICAgIHZhcnNbMV0uYnJhbmNoID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VORDsKKyAgICB2YXJzWzFdLnUuZW5kLnVua25vd25fY291bnQgPSAwOworICAgIHZhcnNbMV0udS5lbmQudW5rbm93biA9IE5VTEw7CisKKyAgICByZXR1cm4gZXBvbl9vYW1fcGFja19hbmRfc2VuZChkZXZpY2VfaWQsIGVwb24sIG1hYywgJm9hbV9mcmFtZSk7Cit9CisKK2JjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2VfZGlzYWJsZV91c2VyX3RyYWZmaWMoYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgKm1hYykKK3sKKyAgICByZXR1cm4gX2Vwb25fb2FtX2Rwb2VfdXNlcl90cmFmZmljX3NldF9hY3Rpb24oZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX0RJU0FCTEVfVVNFUl9UUkFGRklDKTsKK30KKworYmNtb3NfZXJybm8gZXBvbl9vYW1fZHBvZV9lbmFibGVfdXNlcl90cmFmZmljKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vc19tYWNfYWRkcmVzcyAqbWFjKQoreworICAgIHJldHVybiBfZXBvbl9vYW1fZHBvZV91c2VyX3RyYWZmaWNfc2V0X2FjdGlvbihkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BQ1RJT05fRU5BQkxFX1VTRVJfVFJBRkZJQyk7Cit9CisKK3N0YXRpYyBlcG9uX29hbV9kcG9lX2Z3X3VwZ3JhZGVfc3RhdGUgKmVwb25fb2FtX2Rwb2VfZndfdXBncmFkZV9zdGF0ZV9hZGQoY29uc3QgYmNtb2x0X2Vwb25fbGlua19rZXkgKmtleSkKK3sKKyAgICBlcG9uX29hbV9kcG9lX2Z3X3VwZ3JhZGVfc3RhdGUgc3RhdGUgPSB7fTsKKyAgICByZXR1cm4gaGFzaF90YWJsZV9wdXQoZHBvZV9md191cGdyYWRlX3N0YXRlLCAoY29uc3QgdWludDhfdCopa2V5LCAmc3RhdGUpOworfQorCitzdGF0aWMgZXBvbl9vYW1fZHBvZV9md191cGdyYWRlX3N0YXRlKiBlcG9uX29hbV9kcG9lX2Z3X3VwZ3JhZGVfc3RhdGVfZ2V0KGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfa2V5ICprZXkpCit7CisgICAgcmV0dXJuIGhhc2hfdGFibGVfZ2V0KGRwb2VfZndfdXBncmFkZV9zdGF0ZSwgKGNvbnN0IHVpbnQ4X3QqKWtleSk7Cit9CisKK3N0YXRpYyB2b2lkIGVwb25fb2FtX2Rwb2VfZndfdXBncmFkZV9zdGF0ZV9yZWxlYXNlKGVwb25fb2FtX2Rwb2VfZndfdXBncmFkZV9zdGF0ZSAqc3RhdGUpCit7CisgICAgaWYgKE5VTEwgPT0gc3RhdGUpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBlcG9uX29hbV9sb2dbMF0sICJUcmllZCB0byByZWxlYXNlIE5VTEwgc3RhdGVcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKE5VTEwgIT0gc3RhdGUtPmZpbGUpCisgICAgeworICAgICAgICBmY2xvc2Uoc3RhdGUtPmZpbGUpOworICAgIH0KKyAgICBiY21vc19mcmVlKHN0YXRlLT5idWYpOworICAgIGJjbW9zX3RpbWVyX2Rlc3Ryb3koJnN0YXRlLT50aW1lcik7CisgICAgaWYgKCFoYXNoX3RhYmxlX3JlbW92ZShkcG9lX2Z3X3VwZ3JhZGVfc3RhdGUsIChjb25zdCB1aW50OF90Kikmc3RhdGUtPmtleSkpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBlcG9uX29hbV9sb2dbc3RhdGUtPmRldmljZV9pZF0sICJVbmFibGUgdG8gcmVtb3ZlIGZyb20gaGFzaCB0YWJsZVxuIik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBlcG9uX29hbV9kcG9lX3NlbmRfYmxvY2soYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiY21vbHRfZXBvbl9saW5rX2tleSAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuZ3RoKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICAvKiBPQU0gc3R1ZmYgKi8KKyAgICBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWUgb2FtX2ZyYW1lOworICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9wcm90b2NvbCBwcm90b2NvbDsKKworICAgIGVyciA9IGVwb25fb2FtX21ha2VfZHBvZV9mcmFtZShkZXZpY2VfaWQsIGtleS0+ZXBvbl9uaSwgJm9hbV9mcmFtZSwgJnByb3RvY29sKTsKKyAgICBCQ01PU19SRVRVUk5fT05fRVJST1IoZXJyKTsKKyAgICBwcm90b2NvbC51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmRwb2UudmFsdWUub3AgPQorICAgICAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfRklMRV9UUkFOU0ZFUjsKKyAgICBwcm90b2NvbC51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmRwb2UudmFsdWUudS5maWxlX3RyYW5zZmVyLmZpbGVfdHJhbnNmZXIub3Bjb2RlID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UUkFOU0ZFUl9PUENPREVfRklMRV9EQVRBOworICAgIHByb3RvY29sLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLnUuZHBvZS52YWx1ZS51LmZpbGVfdHJhbnNmZXIuZmlsZV90cmFuc2Zlci51LmZpbGVfZGF0YS5ibG9jayA9IGJsb2NrOworICAgIHByb3RvY29sLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLnUuZHBvZS52YWx1ZS51LmZpbGVfdHJhbnNmZXIuZmlsZV90cmFuc2Zlci51LmZpbGVfZGF0YS5sZW5ndGggPSBsZW5ndGg7CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5kcG9lLnZhbHVlLnUuZmlsZV90cmFuc2Zlci5maWxlX3RyYW5zZmVyLnUuZmlsZV9kYXRhLmRhdGEgPSBkYXRhOworCisgICAgaWYgKEJDTV9FUlJfT0sgIT0gZXBvbl9vYW1fcGFja19hbmRfc2VuZChkZXZpY2VfaWQsIGtleS0+ZXBvbl9uaSwgJmtleS0+bWFjX2FkZHJlc3MsICZvYW1fZnJhbWUpKQorICAgIHsKKyAgICAgICAgRVBPTl9PQU1fTE9HKEVSUk9SLCBkZXZpY2VfaWQsIGtleSwgIkZhaWxlZCB0byBzZW5kIGZ3IHVwZ3JhZGUgYmxvY2sgJXVcbiIsIGJsb2NrKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgRVBPTl9PQU1fTE9HKERFQlVHLCBkZXZpY2VfaWQsIGtleSwgIlNlbnQgYmxvY2sgJXVcbiIsIGJsb2NrKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGVwb25fb2FtX2Rwb2Vfc2VuZF9hY2soYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmNtb2x0X2Vwb25fbGlua19rZXkgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfZmlsZV90cmFuc2Zlcl9lcnJvciBlcnJvcikKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgLyogT0FNIHN0dWZmICovCisgICAgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lIG9hbV9mcmFtZTsKKyAgICBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2wgcHJvdG9jb2w7CisKKyAgICBlcnIgPSBlcG9uX29hbV9tYWtlX2Rwb2VfZnJhbWUoZGV2aWNlX2lkLCBrZXktPmVwb25fbmksICZvYW1fZnJhbWUsICZwcm90b2NvbCk7CisgICAgQkNNT1NfUkVUVVJOX09OX0VSUk9SKGVycik7CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5kcG9lLnZhbHVlLm9wID0KKyAgICAgICAgQkNNT0xUX0VQT05fT0FNX0RQT0VfT1BDT0RFX0ZJTEVfVFJBTlNGRVI7CisgICAgcHJvdG9jb2wudS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUudS5kcG9lLnZhbHVlLnUuZmlsZV90cmFuc2Zlci5maWxlX3RyYW5zZmVyLm9wY29kZSA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFJBTlNGRVJfT1BDT0RFX0ZJTEVfQUNLOworICAgIHByb3RvY29sLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLnUuZHBvZS52YWx1ZS51LmZpbGVfdHJhbnNmZXIuZmlsZV90cmFuc2Zlci51LmZpbGVfYWNrLmJsb2NrID0gMDsKKyAgICBwcm90b2NvbC51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmRwb2UudmFsdWUudS5maWxlX3RyYW5zZmVyLmZpbGVfdHJhbnNmZXIudS5maWxlX2Fjay5lcnJvciA9IGVycm9yOworCisgICAgaWYgKEJDTV9FUlJfT0sgIT0gZXBvbl9vYW1fcGFja19hbmRfc2VuZChkZXZpY2VfaWQsIGtleS0+ZXBvbl9uaSwgJmtleS0+bWFjX2FkZHJlc3MsICZvYW1fZnJhbWUpKQorICAgIHsKKyAgICAgICAgRVBPTl9PQU1fTE9HKEVSUk9SLCBkZXZpY2VfaWQsIGtleSwgIkZhaWxlZCB0byBzZW5kIGZ3IHVwZ3JhZGUgYWNrXG4iKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgRVBPTl9PQU1fTE9HKERFQlVHLCBkZXZpY2VfaWQsIGtleSwgIlNlbnQgYWNrOiBlcnJvciAldVxuIiwgZXJyb3IpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZXBvbl9vYW1fZHBvZV9yZXNldF90aW1lb3V0KGVwb25fb2FtX2Rwb2VfZndfdXBncmFkZV9zdGF0ZSAqc3RhdGUpCit7CisgICAgRVBPTl9PQU1fTE9HKERFQlVHLCBzdGF0ZS0+ZGV2aWNlX2lkLCAmc3RhdGUtPmtleSwgIk9OVSB0b29rICV1IHVzIHRvIHJlc3BvbmRcbiIsIGJjbW9zX3RpbWVzdGFtcCgpIC0gc3RhdGUtPmxhc3RfdGltZSk7CisgICAgc3RhdGUtPmxhc3RfdGltZSA9IGJjbW9zX3RpbWVzdGFtcCgpOworICAgIGJjbW9zX3RpbWVyX3N0YXJ0KCZzdGF0ZS0+dGltZXIsIHN0YXRlLT50aW1lb3V0X3VzKTsKK30KKworc3RhdGljIHZvaWQgZXBvbl9vYW1fZHBvZV9oYW5kbGVfYWNrKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmNtb2x0X2Vwb25fbGlua19rZXkgKmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiY21vbHRfZXBvbl9vYW1fZHBvZV9maWxlX3RyYW5zZmVyX2Jhc2UgKmZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW1faGFuZGxlX3J4X2NiIGNiKQoreworICAgIGVwb25fb2FtX2Rwb2VfZndfdXBncmFkZV9zdGF0ZSAqc3RhdGU7CisgICAgaW50IGJsb2NrX3NpemU7CisKKyAgICBzdGF0ZSA9IGVwb25fb2FtX2Rwb2VfZndfdXBncmFkZV9zdGF0ZV9nZXQoa2V5KTsKKworICAgIGlmIChOVUxMID09IHN0YXRlKQorICAgIHsKKyAgICAgICAgRVBPTl9PQU1fTE9HKERFQlVHLCBkZXZpY2VfaWQsIGtleSwgIlJ4IHVuZXhwZWN0ZWQgYWNrXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChzdGF0ZS0+ZG9uZSkKKyAgICB7CisgICAgICAgIGlmIChmdC0+dS5maWxlX2Fjay5ibG9jayAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBFUE9OX09BTV9MT0coRVJST1IsIGRldmljZV9pZCwga2V5LCAiRmluYWwgYWNrIGNvbnRhaW5lZCBub24temVybyBibG9jazogJXVcbiIsIGZ0LT51LmZpbGVfYWNrLmJsb2NrKTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGZ0LT51LmZpbGVfYWNrLmVycm9yKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFJBTlNGRVJfRVJST1JfT0s6CisgICAgICAgICAgICAgICAgRVBPTl9PQU1fTE9HKElORk8sIGRldmljZV9pZCwga2V5LCAiVXBncmFkZSBzdWNjZXNzZnVsXG4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgRVBPTl9PQU1fTE9HKEVSUk9SLCBkZXZpY2VfaWQsIGtleSwgIlVwZ3JhZGUgZmFpbGVkIHdpdGggZXJyb3IgJXVcbiIsIGZ0LT51LmZpbGVfYWNrLmVycm9yKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBlcG9uX29hbV9kcG9lX2Z3X3VwZ3JhZGVfc3RhdGVfcmVsZWFzZShzdGF0ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGF0ZS0+bGFzdF9ibG9jaysrOworICAgIGlmICgoc3RhdGUtPmxhc3RfYmxvY2sgLSAxKSA9PSBmdC0+dS5maWxlX2Fjay5ibG9jaykKKyAgICB7IC8qIHJldHJ5IGxhc3QgYmxvY2sgKi8KKyAgICAgICAgc3RhdGUtPmxhc3RfYmxvY2stLTsKKyAgICAgICAgc3RhdGUtPnJldHJpZXMrKzsKKyAgICAgICAgaWYgKHN0YXRlLT5yZXRyaWVzID4gMykKKyAgICAgICAgeworICAgICAgICAgICAgRVBPTl9PQU1fTE9HKEVSUk9SLCBkZXZpY2VfaWQsIGtleSwgIkV4Y2VlZGVkIHJldHJ5IGxpbWl0IG9uIGJsb2NrICV1XG4iLCBmdC0+dS5maWxlX2Fjay5ibG9jayk7CisgICAgICAgICAgICBlcG9uX29hbV9kcG9lX3NlbmRfYWNrKGRldmljZV9pZCwga2V5LCBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX0VSUk9SX1RJTUVPVVQpOworICAgICAgICAgICAgZXBvbl9vYW1fZHBvZV9md191cGdyYWRlX3N0YXRlX3JlbGVhc2Uoc3RhdGUpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZXBvbl9vYW1fZHBvZV9zZW5kX2Jsb2NrKGRldmljZV9pZCwga2V5LCBmdC0+dS5maWxlX2Fjay5ibG9jaywgc3RhdGUtPmJ1Ziwgc3RhdGUtPmxhc3RfYmxvY2tfc2l6ZSk7CisgICAgICAgICAgICBlcG9uX29hbV9kcG9lX3Jlc2V0X3RpbWVvdXQoc3RhdGUpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHN0YXRlLT5sYXN0X2Jsb2NrID09IGZ0LT51LmZpbGVfYWNrLmJsb2NrKQorICAgIHsgLyogc2VuZCBuZXh0IGJsb2NrICovCisgICAgICAgIHN0YXRlLT5yZXRyaWVzID0gMDsKKyAgICAgICAgYmxvY2tfc2l6ZSA9IGZyZWFkKHN0YXRlLT5idWYsIDEsIHN0YXRlLT5ibG9ja19zaXplLCBzdGF0ZS0+ZmlsZSk7CisgICAgICAgIGlmIChibG9ja19zaXplID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgZXBvbl9vYW1fZHBvZV9zZW5kX2Jsb2NrKGRldmljZV9pZCwga2V5LCBmdC0+dS5maWxlX2Fjay5ibG9jaywgc3RhdGUtPmJ1ZiwgYmxvY2tfc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0ZS0+ZG9uZSA9IEJDTU9TX1RSVUU7CisgICAgICAgICAgICBlcG9uX29hbV9kcG9lX3NlbmRfYWNrKGRldmljZV9pZCwga2V5LCBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX0VSUk9SX09LKTsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZS0+bGFzdF9ibG9ja19zaXplID0gYmxvY2tfc2l6ZTsKKyAgICAgICAgZXBvbl9vYW1fZHBvZV9yZXNldF90aW1lb3V0KHN0YXRlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgLyogdW5leHBlY3RlZCBibG9jayAqLworICAgICAgICBFUE9OX09BTV9MT0coRVJST1IsIGRldmljZV9pZCwga2V5LCAiVW5leHBlY3RlZCBibG9jayByZXF1ZXN0ZWQ6ICV1IChleHBlY3RpbmcgJXUpXG4iLAorICAgICAgICAgICAgICAgICAgICAgZnQtPnUuZmlsZV9hY2suYmxvY2ssIHN0YXRlLT5sYXN0X2Jsb2NrICsgMSk7CisgICAgICAgIGVwb25fb2FtX2Rwb2Vfc2VuZF9hY2soZGV2aWNlX2lkLCBrZXksIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFJBTlNGRVJfRVJST1JfQkFEX0JMT0NLKTsKKyAgICAgICAgZXBvbl9vYW1fZHBvZV9md191cGdyYWRlX3N0YXRlX3JlbGVhc2Uoc3RhdGUpOworICAgIH0KK30KKworc3RhdGljIGJjbW9zX3RpbWVyX3JjIGVwb25fb2FtX2Rwb2VfZndfdXBncmFkZV90aW1lb3V0KGJjbW9zX3RpbWVyICp0aW1lciwgbG9uZyBkYXRhKQoreworICAgIGVwb25fb2FtX21zZ19kYXRhIG1zZ19kYXRhOworCisgICAgbXNnX2RhdGEudGltZW91dC5zdGF0ZSA9IChlcG9uX29hbV9kcG9lX2Z3X3VwZ3JhZGVfc3RhdGUqKWRhdGE7CisgICAgZXBvbl9vYW1fc2VuZF9vc19tc2coQkNNT1NfTVNHX0lEX0VQT05fT0FNX1RJTUVPVVQsICZtc2dfZGF0YSk7CisKKyAgICByZXR1cm4gQkNNT1NfVElNRVJfT0s7Cit9CisKK2JjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2Vfc3RhcnRfdXBncmFkZShiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX25pIGVwb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgKm1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmd19maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGJsb2NrX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB0aW1lb3V0X3NlYykKK3sKKyAgICBiY21vc19lcnJubyBlcnIgPSBCQ01fRVJSX09LOworICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGxpbmtfa2V5ID0geyAuZXBvbl9uaSA9IGVwb24sIC5tYWNfYWRkcmVzcyA9ICptYWMgfTsKKyAgICBiY21vc190aW1lcl9wYXJtIHRwID0KKyAgICB7CisgICAgICAgIC5uYW1lID0gImZ3X3VwZ3JhZGVfdGltZXIiLAorICAgICAgICAub3duZXIgPSBCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX0VQT05fT0FNLAorICAgICAgICAucGVyaW9kaWMgPSBCQ01PU19GQUxTRSwKKyAgICAgICAgLmhhbmRsZXIgPSBlcG9uX29hbV9kcG9lX2Z3X3VwZ3JhZGVfdGltZW91dAorICAgIH07CisgICAgLyogT0FNIHN0dWZmICovCisgICAgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lIG9hbV9mcmFtZTsKKyAgICBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2wgcHJvdG9jb2w7CisgICAgZXBvbl9vYW1fZHBvZV9md191cGdyYWRlX3N0YXRlICpzdGF0ZTsKKworICAgIGlmIChOVUxMICE9IGVwb25fb2FtX2Rwb2VfZndfdXBncmFkZV9zdGF0ZV9nZXQoJmxpbmtfa2V5KSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX0FMUkVBRFk7CisgICAgfQorICAgIHN0YXRlID0gZXBvbl9vYW1fZHBvZV9md191cGdyYWRlX3N0YXRlX2FkZCgmbGlua19rZXkpOworICAgIGlmIChOVUxMID09IHN0YXRlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorCisgICAgc3RhdGUtPmRldmljZV9pZCA9IGRldmljZV9pZDsKKyAgICBzdGF0ZS0+a2V5ID0gbGlua19rZXk7CisgICAgc3RhdGUtPmZpbGUgPSBmb3Blbihmd19maWxlLCAicmIiKTsKKyAgICBpZiAoTlVMTCA9PSBzdGF0ZS0+ZmlsZSkKKyAgICB7CisgICAgICAgIGVwb25fb2FtX2Rwb2VfZndfdXBncmFkZV9zdGF0ZV9yZWxlYXNlKHN0YXRlKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU87CisgICAgfQorICAgIHN0YXRlLT5ibG9ja19zaXplID0gYmxvY2tfc2l6ZTsKKyAgICBzdGF0ZS0+YnVmID0gYmNtb3NfY2FsbG9jKGJsb2NrX3NpemUpOworICAgIGlmIChOVUxMID09IHN0YXRlLT5idWYpCisgICAgeworICAgICAgICBlcG9uX29hbV9kcG9lX2Z3X3VwZ3JhZGVfc3RhdGVfcmVsZWFzZShzdGF0ZSk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKyAgICBzdGF0ZS0+bGFzdF9ibG9jayA9IDB4ZmZmZjsvKi0xKi8KKyAgICBzdGF0ZS0+cmV0cmllcyA9IDA7CisgICAgc3RhdGUtPmRvbmUgPSBCQ01PU19GQUxTRTsKKyAgICB0cC5kYXRhID0gKGxvbmcpc3RhdGU7CisgICAgZXJyID0gYmNtb3NfdGltZXJfY3JlYXRlKCZzdGF0ZS0+dGltZXIsICZ0cCk7CisgICAgaWYgKEJDTV9FUlJfT0sgIT0gZXJyKQorICAgIHsKKyAgICAgICAgZXBvbl9vYW1fZHBvZV9md191cGdyYWRlX3N0YXRlX3JlbGVhc2Uoc3RhdGUpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBzdGF0ZS0+dGltZW91dF91cyA9IHRpbWVvdXRfc2VjICogMTAwMCAqIDEwMDA7CisgICAgc3RhdGUtPmxhc3RfdGltZSA9IGJjbW9zX3RpbWVzdGFtcCgpOworICAgIGJjbW9zX3RpbWVyX3N0YXJ0KCZzdGF0ZS0+dGltZXIsIHN0YXRlLT50aW1lb3V0X3VzKTsKKworICAgIGVyciA9IGVwb25fb2FtX21ha2VfZHBvZV9mcmFtZShkZXZpY2VfaWQsIGVwb24sICZvYW1fZnJhbWUsICZwcm90b2NvbCk7CisgICAgaWYgKEJDTV9FUlJfT0sgIT0gZXJyKQorICAgIHsKKyAgICAgICAgZXBvbl9vYW1fZHBvZV9md191cGdyYWRlX3N0YXRlX3JlbGVhc2Uoc3RhdGUpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBwcm90b2NvbC51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmRwb2UudmFsdWUub3AgPQorICAgICAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfRklMRV9UUkFOU0ZFUjsKKyAgICBwcm90b2NvbC51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmRwb2UudmFsdWUudS5maWxlX3RyYW5zZmVyLmZpbGVfdHJhbnNmZXIub3Bjb2RlID0gQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UUkFOU0ZFUl9PUENPREVfRklMRV9XUklURTsKKyAgICBwcm90b2NvbC51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmRwb2UudmFsdWUudS5maWxlX3RyYW5zZmVyLmZpbGVfdHJhbnNmZXIudS5maWxlX3dyaXRlLmZpbGVuYW1lX2NvdW50ID0gMDsKKyAgICBwcm90b2NvbC51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmRwb2UudmFsdWUudS5maWxlX3RyYW5zZmVyLmZpbGVfdHJhbnNmZXIudS5maWxlX3dyaXRlLmZpbGVuYW1lID0gTlVMTDsKKworICAgIGVyciA9IGVwb25fb2FtX3BhY2tfYW5kX3NlbmQoZGV2aWNlX2lkLCBlcG9uLCBtYWMsICZvYW1fZnJhbWUpOworICAgIGlmIChCQ01fRVJSX09LICE9IGVycikKKyAgICB7CisgICAgICAgIGVwb25fb2FtX2Rwb2VfZndfdXBncmFkZV9zdGF0ZV9yZWxlYXNlKHN0YXRlKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworYmNtb3NfZXJybm8gZXBvbl9vYW1fZHBvZV9yZXNldF9vbnUoYmNtb2x0X2RldmlkIGRldmljZV9pZCwgYmNtb2x0X2Vwb25fbmkgZXBvbiwgYmNtb3NfbWFjX2FkZHJlc3MgKm1hYykKK3sKKyAgICBiY21vc19lcnJubyBlcnIgPSBCQ01fRVJSX09LOworCisgICAgLyogT0FNIHN0dWZmICovCisgICAgYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lIG9hbV9mcmFtZTsKKyAgICBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfcHJvdG9jb2wgcHJvdG9jb2w7CisgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmFyX2NvbnRhaW5lcl9iYXNlIHZhcnNbMl0gPSB7fTsKKworICAgIGVyciA9IGVwb25fb2FtX21ha2VfZHBvZV9mcmFtZShkZXZpY2VfaWQsIGVwb24sICZvYW1fZnJhbWUsICZwcm90b2NvbCk7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKEJDTV9FUlJfT0sgIT0gZXJyLCBlcnIpOworICAgIHByb3RvY29sLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLnUuZHBvZS52YWx1ZS5vcCA9CisgICAgICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX09QQ09ERV9TRVRfUkVRVUVTVDsKKyAgICBwcm90b2NvbC51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmRwb2UudmFsdWUudS5zZXRfcmVxdWVzdC52YXJzX2NvdW50ID0KKyAgICAgICAgMjsKKyAgICBwcm90b2NvbC51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmRwb2UudmFsdWUudS5zZXRfcmVxdWVzdC52YXJzID0gdmFyczsKKyAgICB2YXJzWzBdLmJyYW5jaCA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FWFRFTkRFRF9BQ1RJT047CisgICAgdmFyc1swXS51LmV4dGVuZGVkX2FjdGlvbi5hY3Rpb24ubGVhZiA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQUNUSU9OX1JFU0VUX09OVTsKKyAgICB2YXJzWzFdLmJyYW5jaCA9IEJDTU9MVF9FUE9OX09BTV9EUE9FX0JSQU5DSF9FTkQ7CisgICAgdmFyc1sxXS51LmVuZC51bmtub3duX2NvdW50ID0gMDsKKyAgICB2YXJzWzFdLnUuZW5kLnVua25vd24gPSBOVUxMOworCisgICAgcmV0dXJuIGVwb25fb2FtX3BhY2tfYW5kX3NlbmQoZGV2aWNlX2lkLCBlcG9uLCBtYWMsICZvYW1fZnJhbWUpOworfQorCitzdGF0aWMgdm9pZCBlcG9uX29hbV9oYW5kbGVfZXZlbnQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fb2FtX3BkdV9jb250ZW50ICpjb250ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfa2V5ICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29hbV9oYW5kbGVfcnhfY2IgY2IpCit7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvbnRlbnQtPnUuZXZlbnRfbm90aWZpY2F0aW9uLnRsdnNfY291bnQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChCQ01PTFRfRVBPTl9PQU1fTElOS19FVkVOVF9UWVBFX09SR0FOSVpBVElPTl9TUEVDSUZJQyA9PSBjb250ZW50LT51LmV2ZW50X25vdGlmaWNhdGlvbi50bHZzW2ldLnR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAoY29udGVudC0+dS5ldmVudF9ub3RpZmljYXRpb24udGx2c1tpXS51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS5vdWkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfRFBPRToKKyAgICAgICAgICAgICAgICAgICAgaWYgKE5VTEwgIT0gY2IpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNiKGRldmljZV9pZCwga2V5LT5lcG9uX25pLCAma2V5LT5tYWNfYWRkcmVzcywgQkNNT0xUX1VTRVJfQVBQTF9FUE9OX09BTV9SWF9JRF9EUE9FX0VWRU5ULCBCQ01fRVJSX09LKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBFUE9OX09BTV9MT0coSU5GTywgZGV2aWNlX2lkLCBrZXksICJSZWNlaXZlZCBEUG9FIGV2ZW50ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC0+dS5ldmVudF9ub3RpZmljYXRpb24udGx2c1tpXS51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS51LmRwb2UudmFsdWUuZXZlbnRfY29kZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBlcG9uX29hbV9oYW5kbGVfZHBvZV9nZXRfcmVzcG9uc2UoYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZSAqZHBvZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiY21vbHRfZXBvbl9saW5rX2tleSAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW1faGFuZGxlX3J4X2NiIGNiKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIEVQT05fT0FNX0xPRyhERUJVRywgZGV2aWNlX2lkLCBrZXksICJSeCAldSB2YXJzXG4iLCBkcG9lLT51LmdldF9yZXNwb25zZS52YXJzX2NvdW50KTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZHBvZS0+dS5nZXRfcmVzcG9uc2UudmFyc19jb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgRVBPTl9PQU1fTE9HKERFQlVHLCBkZXZpY2VfaWQsIGtleSwgIiAldTogYnJhbmNoICV1XG4iLCBpLCBkcG9lLT51LmdldF9yZXNwb25zZS52YXJzW2ldLmJyYW5jaCk7CisgICAgICAgIGlmIChCQ01PTFRfRVBPTl9PQU1fRFBPRV9CUkFOQ0hfRVhURU5ERURfQVRUUklCVVRFID09IGRwb2UtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNbaV0uYnJhbmNoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZHBvZS0+dS5nZXRfcmVzcG9uc2UudmFyc1tpXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUud2lkdGggPgorICAgICAgICAgICAgICAgIEJDTU9MVF9FUE9OX09BTV9EUE9FX0VSUk9SX0NPREVfTk9fRVJST1IpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRVBPTl9PQU1fTE9HKEVSUk9SLCBkZXZpY2VfaWQsIGtleSwgIkVycm9yIDB4JXggZ2V0dGluZyBEUG9FIGV4dGVuZGVkIGF0dHJpYnV0ZSAweCUwNHhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwb2UtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNbaV0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcG9lLT51LmdldF9yZXNwb25zZS52YXJzW2ldLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS5sZWFmKTsKKyAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfT05VX0VSUl9SRVNQOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChkcG9lLT51LmdldF9yZXNwb25zZS52YXJzW2ldLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS5sZWFmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfTEVBRl9BVFRSSUJVVEVfT05VX0lEOgorICAgICAgICAgICAgICAgICAgICBFUE9OX09BTV9MT0coSU5GTywgZGV2aWNlX2lkLCBrZXksICJHb3QgRFBvRSBPTlVJRCAlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcG9lLT51LmdldF9yZXNwb25zZS52YXJzW2ldLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51Lm9udV9pZC5pZC51OFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwb2UtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNbaV0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLnUub251X2lkLmlkLnU4WzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHBvZS0+dS5nZXRfcmVzcG9uc2UudmFyc1tpXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5vbnVfaWQuaWQudThbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcG9lLT51LmdldF9yZXNwb25zZS52YXJzW2ldLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51Lm9udV9pZC5pZC51OFszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwb2UtPnUuZ2V0X3Jlc3BvbnNlLnZhcnNbaV0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLnUub251X2lkLmlkLnU4WzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHBvZS0+dS5nZXRfcmVzcG9uc2UudmFyc1tpXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUudS5vbnVfaWQuaWQudThbNV0pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0xFQUZfQVRUUklCVVRFX01BWF9MT0dJQ0FMX0xJTktTOgorICAgICAgICAgICAgICAgICAgICBFUE9OX09BTV9MT0coSU5GTywgZGV2aWNlX2lkLCBrZXksICJHb3QgRFBvRSBNYXggTG9naWNhbCBMaW5rcyBCaURpciAldSwgRG93bk9ubHkgJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcG9lLT51LmdldF9yZXNwb25zZS52YXJzW2ldLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51Lm1heF9sb2dpY2FsX2xpbmtzLmJpZGlyZWN0aW9uYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcG9lLT51LmdldF9yZXNwb25zZS52YXJzW2ldLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS51Lm1heF9sb2dpY2FsX2xpbmtzLmRvd25zdHJlYW1fb25seSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChOVUxMICE9IGNiKQorICAgIHsKKyAgICAgICAgY2IoZGV2aWNlX2lkLCBrZXktPmVwb25fbmksICZrZXktPm1hY19hZGRyZXNzLCBCQ01PTFRfVVNFUl9BUFBMX0VQT05fT0FNX1JYX0lEX0RQT0VfR0VUX1JFU1BPTlNFLCByYyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBlcG9uX29hbV9oYW5kbGVfZHBvZV9zZXRfcmVzcG9uc2UoYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZSAqZHBvZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiY21vbHRfZXBvbl9saW5rX2tleSAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW1faGFuZGxlX3J4X2NiIGNiKQoreworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIEVQT05fT0FNX0xPRyhERUJVRywgZGV2aWNlX2lkLCBrZXksICJSeCAldSB2YXJzXG4iLCBkcG9lLT51LnNldF9yZXNwb25zZS52YXJzX2NvdW50KTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZHBvZS0+dS5zZXRfcmVzcG9uc2UudmFyc19jb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgRVBPTl9PQU1fTE9HKERFQlVHLCBkZXZpY2VfaWQsIGtleSwgIiAldTogYnJhbmNoICV1XG4iLCBpLCBkcG9lLT51LnNldF9yZXNwb25zZS52YXJzW2ldLmJyYW5jaCk7CisgICAgICAgIHN3aXRjaCAoZHBvZS0+dS5zZXRfcmVzcG9uc2UudmFyc1tpXS5icmFuY2gpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VYVEVOREVEX0FUVFJJQlVURToKKyAgICAgICAgICAgICAgICBpZiAoZHBvZS0+dS5zZXRfcmVzcG9uc2UudmFyc1tpXS51LmV4dGVuZGVkX2F0dHJpYnV0ZS5hdHRyaWJ1dGUud2lkdGggPgorICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9FUlJPUl9DT0RFX05PX0VSUk9SKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRVBPTl9PQU1fTE9HKEVSUk9SLCBkZXZpY2VfaWQsIGtleSwgIkVycm9yIDB4JXggc2V0dGluZyBEUG9FIGV4dGVuZGVkIGF0dHJpYnV0ZSAweCUwNHhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcG9lLT51LnNldF9yZXNwb25zZS52YXJzW2ldLnUuZXh0ZW5kZWRfYXR0cmlidXRlLmF0dHJpYnV0ZS53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwb2UtPnUuc2V0X3Jlc3BvbnNlLnZhcnNbaV0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLmxlYWYpOworICAgICAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfT05VX0VSUl9SRVNQOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFUE9OX09BTV9MT0coSU5GTywgZGV2aWNlX2lkLCBrZXksICJTdWNjZXNzZnVsbHkgc2V0IERQb0UgZXh0ZW5kZWQgYXR0cmlidXRlIDB4JTA0eFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwb2UtPnUuc2V0X3Jlc3BvbnNlLnZhcnNbaV0udS5leHRlbmRlZF9hdHRyaWJ1dGUuYXR0cmlidXRlLmxlYWYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfQlJBTkNIX0VYVEVOREVEX0FDVElPTjoKKyAgICAgICAgICAgICAgICBpZiAoZHBvZS0+dS5zZXRfcmVzcG9uc2UudmFyc1tpXS51LmV4dGVuZGVkX2FjdGlvbi5hY3Rpb24ud2lkdGggPgorICAgICAgICAgICAgICAgICAgICBCQ01PTFRfRVBPTl9PQU1fRFBPRV9FUlJPUl9DT0RFX05PX0VSUk9SKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRVBPTl9PQU1fTE9HKEVSUk9SLCBkZXZpY2VfaWQsIGtleSwgIkVycm9yIDB4JXggcGVyZm9ybWluZyBEUG9FIGV4dGVuZGVkIGFjdGlvbiAweCUwNHhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcG9lLT51LnNldF9yZXNwb25zZS52YXJzW2ldLnUuZXh0ZW5kZWRfYWN0aW9uLmFjdGlvbi53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwb2UtPnUuc2V0X3Jlc3BvbnNlLnZhcnNbaV0udS5leHRlbmRlZF9hY3Rpb24uYWN0aW9uLmxlYWYpOworICAgICAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfT05VX0VSUl9SRVNQOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFUE9OX09BTV9MT0coSU5GTywgZGV2aWNlX2lkLCBrZXksICJTdWNjZXNzZnVsbHkgcGVyZm9ybWVkIERQb0UgZXh0ZW5kZWQgYWN0aW9uIDB4JTA0eFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwb2UtPnUuc2V0X3Jlc3BvbnNlLnZhcnNbaV0udS5leHRlbmRlZF9hY3Rpb24uYWN0aW9uLmxlYWYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKE5VTEwgIT0gY2IpCisgICAgeworICAgICAgICBjYihkZXZpY2VfaWQsIGtleS0+ZXBvbl9uaSwgJmtleS0+bWFjX2FkZHJlc3MsIEJDTU9MVF9VU0VSX0FQUExfRVBPTl9PQU1fUlhfSURfRFBPRV9TRVRfUkVTUE9OU0UsIHJjKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGVwb25fb2FtX2hhbmRsZV9kcG9lX2ZpbGVfdHJhbnNmZXIoYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2UgKmRwb2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfa2V5ICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW1faGFuZGxlX3J4X2NiIGNiKQoreworICAgIEVQT05fT0FNX0xPRyhERUJVRywgZGV2aWNlX2lkLCBrZXksICJHb3QgRFBvRSBGaWxlIFRyYW5zZmVyOiAldVxuIiwgZHBvZS0+dS5maWxlX3RyYW5zZmVyLmZpbGVfdHJhbnNmZXIub3Bjb2RlKTsKKyAgICBzd2l0Y2ggKGRwb2UtPnUuZmlsZV90cmFuc2Zlci5maWxlX3RyYW5zZmVyLm9wY29kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX0RQT0VfRklMRV9UUkFOU0ZFUl9PUENPREVfRklMRV9BQ0s6CisgICAgICAgICAgICBFUE9OX09BTV9MT0coREVCVUcsIGRldmljZV9pZCwga2V5LCAiUnggYWNrIGJsb2NrICV1IGVycm9yICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRwb2UtPnUuZmlsZV90cmFuc2Zlci5maWxlX3RyYW5zZmVyLnUuZmlsZV9hY2suYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgZHBvZS0+dS5maWxlX3RyYW5zZmVyLmZpbGVfdHJhbnNmZXIudS5maWxlX2Fjay5lcnJvcik7CisgICAgICAgICAgICBzd2l0Y2ggKGRwb2UtPnUuZmlsZV90cmFuc2Zlci5maWxlX3RyYW5zZmVyLnUuZmlsZV9hY2suZXJyb3IpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX0VSUk9SX09LOgorICAgICAgICAgICAgICAgICAgICBlcG9uX29hbV9kcG9lX2hhbmRsZV9hY2soZGV2aWNlX2lkLCBrZXksICZkcG9lLT51LmZpbGVfdHJhbnNmZXIuZmlsZV90cmFuc2ZlciwgY2IpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBFUE9OX09BTV9MT0coRVJST1IsIGRldmljZV9pZCwga2V5LCAiRmlsZSB0cmFuc2ZlciBmYWlsZWQgb24gYmxvY2sgJXUgd2l0aCBlcnJvciAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwb2UtPnUuZmlsZV90cmFuc2Zlci5maWxlX3RyYW5zZmVyLnUuZmlsZV9hY2suYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcG9lLT51LmZpbGVfdHJhbnNmZXIuZmlsZV90cmFuc2Zlci51LmZpbGVfYWNrLmVycm9yKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX09QQ09ERV9GSUxFX0RBVEE6CisgICAgICAgICAgICBFUE9OX09BTV9MT0coREVCVUcsIGRldmljZV9pZCwga2V5LCAiUnggZGF0YVxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX09QQ09ERV9GSUxFX1JFQUQ6CisgICAgICAgICAgICBFUE9OX09BTV9MT0coRVJST1IsIGRldmljZV9pZCwga2V5LCAiUnggcmVhZCByZXF1ZXN0XG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9EUE9FX0ZJTEVfVFJBTlNGRVJfT1BDT0RFX0ZJTEVfV1JJVEU6CisgICAgICAgICAgICBFUE9OX09BTV9MT0coRVJST1IsIGRldmljZV9pZCwga2V5LCAiUnggd3JpdGUgcmVxdWVzdFxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEVQT05fT0FNX0xPRyhFUlJPUiwgZGV2aWNlX2lkLCBrZXksICJVbmtub3duIERQb0UgRmlsZSBUcmFuc2ZlciBvcGNvZGU6ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRwb2UtPnUuZmlsZV90cmFuc2Zlci5maWxlX3RyYW5zZmVyLm9wY29kZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGVwb25fb2FtX2hhbmRsZV9kcG9lKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV92ZW5kb3JfZXh0ZW5kZWRfYmFzZSAqZHBvZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfa2V5ICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtX2hhbmRsZV9yeF9jYiBjYikKK3sKKyAgICBFUE9OX09BTV9MT0coREVCVUcsIGRldmljZV9pZCwga2V5LCAiUnggRFBvRSBvcGNvZGUgJXVcbiIsIGRwb2UtPm9wKTsKKyAgICBzd2l0Y2ggKGRwb2UtPm9wKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfR0VUX1JFU1BPTlNFOgorICAgICAgICAgICAgZXBvbl9vYW1faGFuZGxlX2Rwb2VfZ2V0X3Jlc3BvbnNlKGRldmljZV9pZCwgZHBvZSwga2V5LCBjYik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfU0VUX1JFU1BPTlNFOgorICAgICAgICAgICAgZXBvbl9vYW1faGFuZGxlX2Rwb2Vfc2V0X3Jlc3BvbnNlKGRldmljZV9pZCwgZHBvZSwga2V5LCBjYik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fRFBPRV9PUENPREVfRklMRV9UUkFOU0ZFUjoKKyAgICAgICAgICAgIGVwb25fb2FtX2hhbmRsZV9kcG9lX2ZpbGVfdHJhbnNmZXIoZGV2aWNlX2lkLCBkcG9lLCBrZXksIGNiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBiY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtX2hhbmRsZV9wcm94eV9yeChlcG9uX29hbV9wcm94eV9yeF9kYXRhICpkYXRhKQoreworICAgIGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWQgKmNhcCA9IChiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkKilkYXRhLT5yeDsKKyAgICBiY21vbHRfZXBvbl9vYW1fZXRoZXJuZXRfZnJhbWUgKm9hbV9mcmFtZTsKKworICAgIG9hbV9mcmFtZSA9IGVwb25fb2FtX3VucGFjayhkYXRhLT5kZXZpY2VfaWQsIGNhcC0+ZGF0YS5mcmFtZS5sZW4sIGNhcC0+ZGF0YS5mcmFtZS52YWwpOworICAgIGlmIChOVUxMID09IG9hbV9mcmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAob2FtX2ZyYW1lLT5wcm90b2NvbHNfY291bnQgPT0gMCkKKyAgICB7CisgICAgICAgIEVQT05fT0FNX0xPRyhFUlJPUiwgZGF0YS0+ZGV2aWNlX2lkLCAmY2FwLT5rZXksICJObyBwcm90b2NvbHMgaW4gT0FNIGZyYW1lXG4iKTsKKyAgICAgICAgYmNtb3NfZnJlZShvYW1fZnJhbWUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgRVBPTl9PQU1fTE9HKERFQlVHLCBkYXRhLT5kZXZpY2VfaWQsICZjYXAtPmtleSwgIlJ4IGV0aGVydHlwZSAlMDR4IHN1YnR5cGUgJTAyeFxuIiwKKyAgICAgICAgICAgICAgICAgb2FtX2ZyYW1lLT5wcm90b2NvbHNbMF0uZXRoZXJ0eXBlLCBvYW1fZnJhbWUtPnByb3RvY29sc1swXS51LnNsb3dfcHJvdG9jb2wudmFsdWUuc3VidHlwZSk7CisgICAgaWYgKChCQ01PTFRfRVBPTl9PQU1fUFJPVE9DT0xfVFlQRV9TTE9XX1BST1RPQ09MID09IG9hbV9mcmFtZS0+cHJvdG9jb2xzWzBdLmV0aGVydHlwZSkgJiYKKyAgICAgICAgKEJDTU9MVF9FUE9OX09BTV9TTE9XX1BST1RPQ09MX1NVQlRZUEVfT0FNID09IG9hbV9mcmFtZS0+cHJvdG9jb2xzWzBdLnUuc2xvd19wcm90b2NvbC52YWx1ZS5zdWJ0eXBlKSkKKyAgICB7CisgICAgICAgIGlmIChvYW1fZnJhbWUtPnByb3RvY29sc1swXS51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uZmxhZ3MgJiBCQ01PTFRfRVBPTl9PQU1fT0FNX0ZMQUdTX0xJTktfRkFVTFQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChOVUxMICE9IGRhdGEtPmNiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRhdGEtPmNiKGRhdGEtPmRldmljZV9pZCwgY2FwLT5rZXkuZXBvbl9uaSwgJmNhcC0+a2V5Lm1hY19hZGRyZXNzLCBCQ01PTFRfVVNFUl9BUFBMX0VQT05fT0FNX1JYX0lEX0xJTktfRkFVTFQsIEJDTV9FUlJfT0spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRVBPTl9PQU1fTE9HKEVSUk9SLCBkYXRhLT5kZXZpY2VfaWQsICZjYXAtPmtleSwgIlJlY2VpdmVkIE9BTSBsaW5rIGZhdWx0XG4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAob2FtX2ZyYW1lLT5wcm90b2NvbHNbMF0udS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmZsYWdzICYgQkNNT0xUX0VQT05fT0FNX09BTV9GTEFHU19EWUlOR19HQVNQKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoTlVMTCAhPSBkYXRhLT5jYikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkYXRhLT5jYihkYXRhLT5kZXZpY2VfaWQsIGNhcC0+a2V5LmVwb25fbmksICZjYXAtPmtleS5tYWNfYWRkcmVzcywgQkNNT0xUX1VTRVJfQVBQTF9FUE9OX09BTV9SWF9JRF9EWUlOR19HQVNQLCBCQ01fRVJSX09LKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEVQT05fT0FNX0xPRyhFUlJPUiwgZGF0YS0+ZGV2aWNlX2lkLCAmY2FwLT5rZXksICJSZWNlaXZlZCBPQU0gZHlpbmcgZ2FzcFxuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9hbV9mcmFtZS0+cHJvdG9jb2xzWzBdLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5mbGFncyAmIEJDTU9MVF9FUE9OX09BTV9PQU1fRkxBR1NfQ1JJVElDQUxfRVZFTlQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChOVUxMICE9IGRhdGEtPmNiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRhdGEtPmNiKGRhdGEtPmRldmljZV9pZCwgY2FwLT5rZXkuZXBvbl9uaSwgJmNhcC0+a2V5Lm1hY19hZGRyZXNzLCBCQ01PTFRfVVNFUl9BUFBMX0VQT05fT0FNX1JYX0lEX0NSSVRJQ0FMX0VWRU5ULCBCQ01fRVJSX09LKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEVQT05fT0FNX0xPRyhFUlJPUiwgZGF0YS0+ZGV2aWNlX2lkLCAmY2FwLT5rZXksICJSZWNlaXZlZCBPQU0gY3JpdGljYWwgZXZlbnRcbiIpOworICAgICAgICB9CisgICAgICAgIEVQT05fT0FNX0xPRyhERUJVRywgZGF0YS0+ZGV2aWNlX2lkLCAmY2FwLT5rZXksICJSeCBvcGNvZGUgJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICBvYW1fZnJhbWUtPnByb3RvY29sc1swXS51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC5jb2RlKTsKKyAgICAgICAgc3dpdGNoIChvYW1fZnJhbWUtPnByb3RvY29sc1swXS51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC5jb2RlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX0lORk86CisgICAgICAgICAgICAgICAgYnJlYWs7IC8qIGlnbm9yZSBpbmZvIC0gdGhpcyBzaG91bGQgYmUgaGFuZGxlZCBieSBlb24gKi8KKyAgICAgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fT0FNX09BTV9PUENPREVfRVZFTlRfTk9USUZJQ0FUSU9OOgorICAgICAgICAgICAgICAgIGVwb25fb2FtX2hhbmRsZV9ldmVudChkYXRhLT5kZXZpY2VfaWQsICZvYW1fZnJhbWUtPnByb3RvY29sc1swXS51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudCwgJmNhcC0+a2V5LCBkYXRhLT5jYik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX09BTV9PQU1fT1BDT0RFX09SR0FOSVpBVElPTl9TUEVDSUZJQzoKKyAgICAgICAgICAgICAgICBFUE9OX09BTV9MT0coREVCVUcsIGRhdGEtPmRldmljZV9pZCwgJmNhcC0+a2V5LCAiUnggT1VJICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYW1fZnJhbWUtPnByb3RvY29sc1swXS51LnNsb3dfcHJvdG9jb2wudmFsdWUudS5vYW0uY29udGVudC51Lm9yZ2FuaXphdGlvbl9zcGVjaWZpYy52YWx1ZS5vdWkpOworICAgICAgICAgICAgICAgIHN3aXRjaCAob2FtX2ZyYW1lLT5wcm90b2NvbHNbMF0udS5zbG93X3Byb3RvY29sLnZhbHVlLnUub2FtLmNvbnRlbnQudS5vcmdhbml6YXRpb25fc3BlY2lmaWMudmFsdWUub3VpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfRVBPTl9PQU1fV0VMTF9LTk9XTl9PVUlfRFBPRToKKyAgICAgICAgICAgICAgICAgICAgICAgIGVwb25fb2FtX2hhbmRsZV9kcG9lKGRhdGEtPmRldmljZV9pZCwgJm9hbV9mcmFtZS0+cHJvdG9jb2xzWzBdLnUuc2xvd19wcm90b2NvbC52YWx1ZS51Lm9hbS5jb250ZW50LnUub3JnYW5pemF0aW9uX3NwZWNpZmljLnZhbHVlLnUuZHBvZS52YWx1ZSwgJmNhcC0+a2V5LCBkYXRhLT5jYik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBiY21vc19mcmVlKG9hbV9mcmFtZSk7CisgICAgYmNtb2x0X21zZ19mcmVlKCZkYXRhLT5yeC0+aGRyKTsKK30KKworc3RhdGljIHZvaWQgZXBvbl9vYW1fZHBvZV9oYW5kbGVfZndfdXBncmFkZV90aW1lb3V0KGVwb25fb2FtX2Rwb2VfZndfdXBncmFkZV9zdGF0ZSAqc3RhdGUpCit7CisgICAgRVBPTl9PQU1fTE9HKEVSUk9SLCBzdGF0ZS0+ZGV2aWNlX2lkLCAmc3RhdGUtPmtleSwgIkZpcm13YXJlIHVwZ3JhZGUgdGltZWQgb3V0XG4iKTsKKyAgICBlcG9uX29hbV9kcG9lX3NlbmRfYWNrKHN0YXRlLT5kZXZpY2VfaWQsICZzdGF0ZS0+a2V5LCBCQ01PTFRfRVBPTl9PQU1fRFBPRV9GSUxFX1RSQU5TRkVSX0VSUk9SX1RJTUVPVVQpOworICAgIGVwb25fb2FtX2Rwb2VfZndfdXBncmFkZV9zdGF0ZV9yZWxlYXNlKHN0YXRlKTsKK30KKworc3RhdGljIHZvaWQgZXBvbl9vYW1faGFuZGxlX29zX21zZyhiY21vc19tb2R1bGVfaWQgbW9kdWxlX2lkLCBiY21vc19tc2cgKm9zX21zZykKK3sKKyAgICBlcG9uX29hbV9tc2cgKm1zZyA9IChlcG9uX29hbV9tc2cqKW9zX21zZzsKKworICAgIHN3aXRjaCAobXNnLT5vc19tc2cudHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT1NfTVNHX0lEX0VQT05fT0FNX1BST1hZX1JYOgorICAgICAgICAgICAgYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29hbV9oYW5kbGVfcHJveHlfcngoJm1zZy0+ZGF0YS5wcm94eV9yeCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PU19NU0dfSURfRVBPTl9PQU1fVElNRU9VVDoKKyAgICAgICAgICAgIGVwb25fb2FtX2Rwb2VfaGFuZGxlX2Z3X3VwZ3JhZGVfdGltZW91dChtc2ctPmRhdGEudGltZW91dC5zdGF0ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIGVwb25fb2FtX2xvZ1swXSwgIlVua25vd24gT1MgbWVzc2FnZSAldVxuIiwgbXNnLT5vc19tc2cudHlwZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgYmNtb3NfZnJlZShvc19tc2cpOworfQorCit2b2lkIGJjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW1faGFuZGxlX3J4KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9wcm94eV9yeCAqcngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW1faGFuZGxlX3J4X2NiIGNiKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfZnJhbWVfY2FwdHVyZWQgKmNhcCA9IChiY21vbHRfZXBvbl9saW5rX2ZyYW1lX2NhcHR1cmVkKilyeDsKKyAgICBlcG9uX29hbV9tc2dfZGF0YSBtc2dfZGF0YSA9IHt9OworCisgICAgaWYgKCFpc19ydW5uaW5nKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICgoQkNNT0xUX09CSl9JRF9FUE9OX0xJTksgIT0gcngtPmhkci5vYmpfdHlwZSkgfHwKKyAgICAgICAgKEJDTU9MVF9FUE9OX0xJTktfUFJPWFlfUlhfSURfRlJBTUVfQ0FQVFVSRUQgIT0gcngtPmhkci5zdWJncm91cCkgfHwKKyAgICAgICAgKGNhcC0+ZGF0YS5mcmFtZS52YWxbMTJdICE9IDB4ODgpIHx8CisgICAgICAgIChjYXAtPmRhdGEuZnJhbWUudmFsWzEzXSAhPSAweDA5KSB8fAorICAgICAgICAoY2FwLT5kYXRhLmZyYW1lLnZhbFsxNF0gIT0gMHgwMykpCisgICAgeworICAgICAgICByZXR1cm47IC8qIG5vdCBPQU0gZnJhbWUgY2FwdHVyZWQgb24gYSBsaW5rIC0gaWdub3JlICovCisgICAgfQorCisgICAgbXNnX2RhdGEucHJveHlfcnguZGV2aWNlX2lkID0gZGV2aWNlX2lkOworICAgIG1zZ19kYXRhLnByb3h5X3J4LmNiID0gY2I7CisgICAgcmMgPSBiY21vbHRfbXNnX2Nsb25lKChiY21vbHRfbXNnKiopJm1zZ19kYXRhLnByb3h5X3J4LnJ4LCAmcngtPmhkcik7CisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBlcG9uX29hbV9sb2dbZGV2aWNlX2lkXSwgIlByb3h5IFJ4IGNsb25lIGZhaWxlZDogJXNcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoQkNNX0VSUl9PSyAhPSBlcG9uX29hbV9zZW5kX29zX21zZyhCQ01PU19NU0dfSURfRVBPTl9PQU1fUFJPWFlfUlgsICZtc2dfZGF0YSkpCisgICAgeworICAgICAgICBiY21vbHRfbXNnX2ZyZWUoJm1zZ19kYXRhLnByb3h5X3J4LnJ4LT5oZHIpOworICAgIH0KK30KKwordm9pZCBiY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtX2luaXQodm9pZCkKK3sKKyAgICBiY21vc19tb2R1bGVfcGFybSBtb2R1bGVfcGFyYW1zID0KKyAgICB7CisgICAgICAgIC5xcGFybSA9CisgICAgICAgIHsKKyAgICAgICAgICAgIC5uYW1lID0gInVzZXJfYXBwbF9lcG9uX29hbV9tb2R1bGUiLAorICAgICAgICAgICAgLnNpemUgPSBNQVhfQ09OQ1VSUkVOVF9MSU5LUworICAgICAgICB9CisgICAgfTsKKyAgICBiY21vc190YXNrX3Bhcm0gdGFza19wYXJhbXMgPQorICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJ1c2VyX2FwcGxfZXBvbl9vYW1fdGFzayIsCisgICAgICAgIC5wcmlvcml0eSAgICAgPSBCQ01PU19UQVNLX1BSSU9SSVRZXzEyLAorICAgICAgICAuY29yZSAgICAgICAgID0gQkNNT1NfQ1BVX0NPUkVfQU5ZLCAvKiBObyBDUFUgYWZmaW5pdHkgKi8KKyAgICAgICAgLmluaXRfaGFuZGxlciA9IE5VTEwKKyAgICB9OworCisgICAgaWYgKGlzX3J1bm5pbmcpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisjaWZkZWYgRU5BQkxFX0xPRworICAgIGludCBpOworICAgIGNoYXIgbG9nX25hbWVbTUFYX0RFVl9MT0dfSURfTkFNRV0gPSB7fTsKKyAgICBmb3IgKGk9MDsgaTxCQ01UUl9NQVhfT0xUUzsgaSsrKQorICAgIHsKKyAgICAgICAgc25wcmludGYobG9nX25hbWUsIHNpemVvZihsb2dfbmFtZSktMSwgImVwb25fb2FtJWQiLCBpKTsKKyAgICAgICAgZXBvbl9vYW1fbG9nW2ldID0gYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIobG9nX25hbWUsIERFVl9MT0dfTEVWRUxfSU5GTywgREVWX0xPR19JRF9UWVBFX0JPVEgpOworICAgIH0KKyNlbmRpZgorICAgIGRwb2VfZndfdXBncmFkZV9zdGF0ZSA9IGhhc2hfdGFibGVfY3JlYXRlKE1BWF9DT05DVVJSRU5UX0xJTktTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihlcG9uX29hbV9kcG9lX2Z3X3VwZ3JhZGVfc3RhdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihiY21vbHRfZXBvbl9saW5rX2tleSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRwb2VfZndfdXBncmFkZV9zdGF0ZSIpOworICAgIGlmIChCQ01fRVJSX09LICE9IGJjbW9zX3Rhc2tfY3JlYXRlKCZlcG9uX29hbV90YXNrLCAmdGFza19wYXJhbXMpKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhGQVRBTCwgZXBvbl9vYW1fbG9nWzBdLCAiRmFpbGVkIHRvIGNyZWF0ZSBFUE9OIE9BTSB0YXNrIVxuIik7CisgICAgfQorICAgIGlmIChCQ01fRVJSX09LICE9IGJjbW9zX21vZHVsZV9jcmVhdGUoQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9FUE9OX09BTSwgJmVwb25fb2FtX3Rhc2ssICZtb2R1bGVfcGFyYW1zKSkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRkFUQUwsIGVwb25fb2FtX2xvZ1swXSwgIkZhaWxlZCB0byBjcmVhdGUgRVBPTiBPQU0gbW9kdWxlIVxuIik7CisgICAgfQorICAgIGlzX3J1bm5pbmcgPSBCQ01PU19UUlVFOworfQorCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vwb25fb2FtL2JjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW0uaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZXBvbl9vYW0vYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29hbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZGM5ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vwb25fb2FtL2JjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW0uaApAQCAtMCwwICsxLDE2NyBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBfQkNNT0xUX1VTRVJfQVBQTF9FUE9OX09BTV9IXworI2RlZmluZSBfQkNNT0xUX1VTRVJfQVBQTF9FUE9OX09BTV9IXworCisjaW5jbHVkZSAiYmNtY2xpLmgiCisjaW5jbHVkZSAiYmNtb2x0X21zZy5oIgorI2luY2x1ZGUgImJjbW9sdF9lcG9uX29hbV90eXBlcy5oIgorCisjZGVmaW5lIE1BWF9RVUVVRV9TRVRTICAgICAgICAgIDQKKyNkZWZpbmUgTUFYX1JFUE9SVF9USFJFU0hPTERTICAgOAorCitzdGF0aWMgY29uc3QgYmNtb3NfbWFjX2FkZHJlc3Mgc2xvd19wcm90b2NvbF9tdWx0aWNhc3RfbWFjID0ge3sweDAxLDB4ODAsMHhjMiwweDAwLDB4MDAsMHgwMn19OworCisvKiBUeXBlZGVmIHJlcXVpcmVkIGZvciBjb252ZXlpbmcgYSAyLWRpbWVuc2lvbmFsIGFycmF5IHRvIGVwb25fb2FtX2Rwb2Vfc2V0X3JlcG9ydF90aHJlc2hvbGRzKCkuICovCit0eXBlZGVmIHVpbnQxNl90IGJjbW9sdF9lcG9uX29hbV9xdWV1ZV9zZXRzW01BWF9RVUVVRV9TRVRTXVtNQVhfUkVQT1JUX1RIUkVTSE9MRFNdOworCit0eXBlZGVmIGVudW0KK3sKKyAgICBCQ01PTFRfVVNFUl9BUFBMX0VQT05fT0FNX1JYX0lEX0xJTktfRkFVTFQsCisgICAgQkNNT0xUX1VTRVJfQVBQTF9FUE9OX09BTV9SWF9JRF9EWUlOR19HQVNQLAorICAgIEJDTU9MVF9VU0VSX0FQUExfRVBPTl9PQU1fUlhfSURfQ1JJVElDQUxfRVZFTlQsCisgICAgQkNNT0xUX1VTRVJfQVBQTF9FUE9OX09BTV9SWF9JRF9EUE9FX0VWRU5ULAorICAgIEJDTU9MVF9VU0VSX0FQUExfRVBPTl9PQU1fUlhfSURfRFBPRV9HRVRfUkVTUE9OU0UsCisgICAgQkNNT0xUX1VTRVJfQVBQTF9FUE9OX09BTV9SWF9JRF9EUE9FX1NFVF9SRVNQT05TRSwKK30gYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29hbV9yeF9pZDsKKwordHlwZWRlZiBlbnVtCit7CisgICAgRFBPRV9SVUxFX1ZMQU5fTU9ERV9OT05FLAorICAgIERQT0VfUlVMRV9WTEFOX01PREVfQURELAorICAgIERQT0VfUlVMRV9WTEFOX01PREVfUkVNT1ZFLAorCisgICAgRFBPRV9SVUxFX1ZMQU5fTU9ERV9DT1VOVAorfSBkcG9lX3J1bGVfdmxhbl9tb2RlOworCisvKiBEdXJpbmcgcGFyc2luZyBvZiBPQU0gaW5kaWNhdGlvbiwgdGhpcyBvcHRpb25hbCBjYWxsYmFjayBtYXkgYmUgY2FsbGVkLiAqLwordHlwZWRlZiB2b2lkICgqYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29hbV9oYW5kbGVfcnhfY2IpKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fbmkgZXBvbl9uaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiY21vc19tYWNfYWRkcmVzcyAqbWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW1fcnhfaWQgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfZXJybm8gcmMpOworCisvKiBDYWxsYmFjayAnY2InIGlzIG9wdGlvbmFsLiAqLwordm9pZCBiY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtX2hhbmRsZV9yeChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfcHJveHlfcnggKnJ4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtX2hhbmRsZV9yeF9jYiBjYik7CisKK2JjbW9zX2Vycm5vIGVwb25fb2FtX3BhY2tfZnJhbWUoYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lICpvYW1fZnJhbWUsIHVpbnQ4X3QgKipidWZmZXIsIHVpbnQxNl90ICpsZW5ndGgpOworCitiY21vc19lcnJubyBlcG9uX29hbV9wYWNrX2FuZF9zZW5kKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX25pIGVwb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJjbW9zX21hY19hZGRyZXNzICptYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSAqb2FtX2ZyYW1lKTsKKworYmNtb2x0X2Vwb25fb2FtX2V0aGVybmV0X2ZyYW1lICplcG9uX29hbV91bnBhY2soYmNtb2x0X2RldmlkIGRldmljZV9pZCwgdWludDMyX3QgbGVuLCB1aW50OF90ICpieXRlcyk7CisKK2JjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2VfZ2V0X2NyaXRpY2FsX2luZm8oYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgKm1hYyk7CisKK2JjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2Vfc2V0X29hbV9yYXRlKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9uaSBlcG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgKm1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBtYXgpOworCitiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX3NldF9yZXBvcnRfdGhyZXNob2xkcyhiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzICptYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJlcG9ydF92YWx1ZXNfcGVyX3F1ZXVlX3NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX29hbV9xdWV1ZV9zZXRzIHF1ZXVlX3NldHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG51bV9xdWV1ZV9zZXRzKTsKKworYmNtb3NfZXJybm8gZXBvbl9vYW1fZHBvZV9zZXRfZW5jcnlwdGlvbigKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgIGJjbW9sdF9lcG9uX25pIGVwb24sCisgICAgYmNtb3NfbWFjX2FkZHJlc3MgKm1hYywKKyAgICBiY21vbHRfZXBvbl9vYW1fZHBvZV9lbmNyeXB0aW9uX21vZGUgZW5jX21vZGUsCisgICAgdWludDE2X3QgcGVyaW9kKTsKKworYmNtb3NfYm9vbCBlcG9uX29hbV9pc19kcG9lKGJjbW9sdF9lcG9uX29hbV9ldGhlcm5ldF9mcmFtZSAqb2FtKTsKKworYmNtb3NfYm9vbCBlcG9uX29hbV9pc19kcG9lX2VuY3J5cHRfcmVzcG9uc2UoYmNtb2x0X2Vwb25fb2FtX2Rwb2VfdmVuZG9yX2V4dGVuZGVkX2Jhc2UgKmRwb2UpOworCitiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX2NsZWFyX2luZ3Jlc3NfcnVsZXNfbmV0d29ya19wb24oYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9uaSBlcG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzICptYWMpOworYmNtb3NfZXJybm8gZXBvbl9vYW1fZHBvZV9jbGVhcl9pbmdyZXNzX3J1bGVzX3VzZXJfcG9ydChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9uaSBlcG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vc19tYWNfYWRkcmVzcyAqbWFjKTsKK2JjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2VfY2xlYXJfaW5ncmVzc19ydWxlcyhiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX25pIGVwb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgKm1hYyk7CisKK2JjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2Vfc2V0X2Jhc2ljX3F1ZXVlX2NvbmZpZyhiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX25pIGVwb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgKm1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHVwX3F1ZXVlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkbl9xdWV1ZV9zaXplKTsKKworYmNtb3NfZXJybm8gZXBvbl9vYW1fZHBvZV9hZGRfaW5ncmVzc19ydWxlc19uZXR3b3JrX3BvbihiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9uaSBlcG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vc19tYWNfYWRkcmVzcyAqbWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcG9lX3J1bGVfdmxhbl9tb2RlIHZsYW5fbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB2bGFuX3RhZ1s0XSk7CitiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX2FkZF9pbmdyZXNzX3J1bGVzX3VzZXJfcG9ydChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX21hY19hZGRyZXNzICptYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcG9lX3J1bGVfdmxhbl9tb2RlIHZsYW5fbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgdmxhbl90YWdbNF0pOworYmNtb3NfZXJybm8gZXBvbl9vYW1fZHBvZV9hZGRfaW5ncmVzc19ydWxlcyhiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9uaSBlcG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vc19tYWNfYWRkcmVzcyAqbWFjKTsKKworYmNtb3NfZXJybm8gZXBvbl9vYW1fZHBvZV9hZGRfaW5ncmVzc19ydWxlc193aXRoX3ZsYW4oYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX25pIGVwb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vc19tYWNfYWRkcmVzcyAqbWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB2bGFuX3RhZ1s0XSk7CisKK2JjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2VfZW5hYmxlX3VzZXJfdHJhZmZpYyhiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX25pIGVwb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgKm1hYyk7CisKK2JjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2VfZGlzYWJsZV91c2VyX3RyYWZmaWMoYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgKm1hYyk7CisKK2JjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2Vfc3RhcnRfdXBncmFkZShiY21vbHRfZGV2aWQgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9lcG9uX25pIGVwb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb3NfbWFjX2FkZHJlc3MgKm1hYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmd19maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGJsb2NrX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB0aW1lb3V0X3NlYyk7CisKK2JjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2VfcmVzZXRfb251KGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbW9sdF9lcG9uX25pIGVwb24sIGJjbW9zX21hY19hZGRyZXNzICptYWMpOworCit2b2lkIGJjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW1faW5pdCh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vwb25fb2FtX2NsaS9NYWtlZmlsZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZXBvbl9vYW1fY2xpL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYzA4MTEKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Vwb25fb2FtX2NsaS9NYWtlZmlsZQpAQCAtMCwwICsxLDEwIEBACitpZmVxICgiJChFTkFCTEVfQ0xJKSIsICJ5IikKKyAgICBNT0RfTkFNRSA9IGJjbV91c2VyX2FwcGxfZXBvbl9vYW1fY2xpCisgICAgTU9EX1RZUEUgPSBsaWIKKwlNT0RfREVQUyA9IHV0aWxzIGRldl9sb2cgY29tbW9uX2Vwb25fb2FtIGJjbV91c2VyX2FwcGxfZXBvbl9vYW0KKyAgICBzcmNzID0gYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29hbV9jbGkuYworICAgIGlmZXEgKCIkKE9TX0tFUk5FTCkiLCAibGludXgiKQorCU1PRF9ERVBTICs9IGRldl9sb2dfbGludXgKKyAgICBlbmRpZgorZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lcG9uX29hbV9jbGkvYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29hbV9jbGkuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZXBvbl9vYW1fY2xpL2JjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW1fY2xpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE4ZWFhNgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZXBvbl9vYW1fY2xpL2JjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW1fY2xpLmMKQEAgLTAsMCArMSwzNjAgQEAKKy8qCisgIDw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCisgIFVubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKKyAgYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAorICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAgKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCisgIHdpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgIG9mIHRoZSBzb2Z0d2FyZS4KKworICBOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKKyAgdGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCisgIHVuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCisgIHdyaXR0ZW4gY29uc2VudC4KKworICA6PgorKi8KKworI2luY2x1ZGUgImJjbW9zX3N5c3RlbS5oIgorI2luY2x1ZGUgImJjbW9sdF9tYXRoLmgiCisjaW5jbHVkZSAiYmNtX2Rldl9sb2cuaCIKKyNpbmNsdWRlICJiY21vbHRfYXBpLmgiCisjaW5jbHVkZSAiYmNtb2x0X21vZGVsX3R5cGVzLmgiCisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29hbS5oIgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW1fY2xpLmgiCisjaW5jbHVkZSAiYmNtb2x0X2Vwb25fb2FtX3R5cGVzLmgiCisKK3N0YXRpYyBiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX2dldF9jcml0aWNhbF9pbmZvX2NsaShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiA9IChiY21vbHRfZXBvbl9uaSliY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIiktPnZhbHVlLnVudW1iZXI7CisgICAgYmNtb3NfbWFjX2FkZHJlc3MgbWFjID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKS0+dmFsdWUubWFjOworCisgICAgcmV0dXJuIGVwb25fb2FtX2Rwb2VfZ2V0X2NyaXRpY2FsX2luZm8oY3VycmVudF9kZXZpY2UsIGVwb24sICZtYWMpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gZXBvbl9vYW1fZHBvZV9zZXRfb2FtX3JhdGVfY2xpKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGJjbW9sdF9lcG9uX25pIGVwb24gPSAoYmNtb2x0X2Vwb25fbmkpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpLT52YWx1ZS51bnVtYmVyOworICAgIGJjbW9zX21hY19hZGRyZXNzIG1hYyA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIiktPnZhbHVlLm1hYzsKKyAgICB1aW50OF90IG1pbiA9ICh1aW50OF90KWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1pbiIpLT52YWx1ZS51bnVtYmVyOworICAgIHVpbnQ4X3QgbWF4ID0gKHVpbnQ4X3QpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4IiktPnZhbHVlLnVudW1iZXI7CisKKyAgICByZXR1cm4gZXBvbl9vYW1fZHBvZV9zZXRfb2FtX3JhdGUoY3VycmVudF9kZXZpY2UsIGVwb24sICZtYWMsIG1pbiwgbWF4KTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2Vfc2V0X3JlcG9ydF90aHJlc2hvbGRzX2NsaShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21vbHRfZXBvbl9uaSBlcG9uID0gKGJjbW9sdF9lcG9uX25pKWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKS0+dmFsdWUudW51bWJlcjsKKyAgICBiY21vc19tYWNfYWRkcmVzcyBtYWMgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpLT52YWx1ZS5tYWM7CisgICAgYmNtY2xpX2NtZF9wYXJtICpxdWV1ZV9zZXRfcGFybXNbTUFYX1FVRVVFX1NFVFNdOworCisgICAgLyogT0FNIHN0dWZmICovCisgICAgYmNtb2x0X2Vwb25fb2FtX3F1ZXVlX3NldHMgcXVldWVfc2V0czsKKyAgICB1aW50OF90IGksIGosIG51bV9xdWV1ZV9zZXRzID0gMDsKKworICAgIC8qIHByb2Nlc3MgaW5wdXQgKi8KKyAgICBxdWV1ZV9zZXRfcGFybXNbMF0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJxdWV1ZV8wIik7CisgICAgcXVldWVfc2V0X3Bhcm1zWzFdID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicXVldWVfMSIpOworICAgIHF1ZXVlX3NldF9wYXJtc1syXSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInF1ZXVlXzIiKTsKKyAgICBxdWV1ZV9zZXRfcGFybXNbM10gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJxdWV1ZV8zIik7CisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9RVUVVRV9TRVRTOyBpKyspCisgICAgeworICAgICAgICBpZiAoTlVMTCAhPSBxdWV1ZV9zZXRfcGFybXNbaV0pCisgICAgICAgIHsKKyAgICAgICAgICAgIG51bV9xdWV1ZV9zZXRzKys7CisgICAgICAgICAgICBpZiAocXVldWVfc2V0X3Bhcm1zW2ldLT5hcnJheV9zaXplICE9IHF1ZXVlX3NldF9wYXJtc1swXS0+YXJyYXlfc2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiQWxsIHF1ZXVlIHNldHMgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiByZXBvcnQgdGhyZXNob2xkcyFcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcXVldWVfc2V0X3Bhcm1zW2ldLT5hcnJheV9zaXplOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHF1ZXVlX3NldF9wYXJtc1tpXS0+dmFsdWVzW2pdLnVudW1iZXIgPiA2NTUzNSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJRdWV1ZSBTZXQgJXUsIFRocmVzaG9sZCAldTogJWx1IGlzIG5vdCBhIHZhbGlkIHJlcG9ydCB0aHJlc2hvbGQhXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBqLCBxdWV1ZV9zZXRfcGFybXNbaV0tPnZhbHVlc1tqXS51bnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcXVldWVfc2V0c1tpXVtqXSA9ICh1aW50MTZfdClxdWV1ZV9zZXRfcGFybXNbaV0tPnZhbHVlc1tqXS51bnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChqID0gaSArIDE7IGogPCBNQVhfUVVFVUVfU0VUUzsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChOVUxMICE9IHF1ZXVlX3NldF9wYXJtc1tqXSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJJbmNsdWRlZCBxdWV1ZSBzZXRzIG11c3QgYmUgc2VxdWVudGlhbCBmcm9tIDAhXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfUEFSTTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZXBvbl9vYW1fZHBvZV9zZXRfcmVwb3J0X3RocmVzaG9sZHMoY3VycmVudF9kZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlX3NldF9wYXJtc1swXS0+YXJyYXlfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVfc2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3F1ZXVlX3NldHMpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gZXBvbl9vYW1fZHBvZV9jbGVhcl9pbmdyZXNzX3J1bGVzX25ldHdvcmtfcG9uX2NsaShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGJjbW9sdF9lcG9uX25pIGVwb24gPSAoYmNtb2x0X2Vwb25fbmkpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpLT52YWx1ZS51bnVtYmVyOworICAgIGJjbW9zX21hY19hZGRyZXNzIG1hYyA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIiktPnZhbHVlLm1hYzsKKworICAgIHJldHVybiBlcG9uX29hbV9kcG9lX2NsZWFyX2luZ3Jlc3NfcnVsZXNfbmV0d29ya19wb24oY3VycmVudF9kZXZpY2UsIGVwb24sICZtYWMpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gZXBvbl9vYW1fZHBvZV9jbGVhcl9pbmdyZXNzX3J1bGVzX3VzZXJfcG9ydF9jbGkoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGJjbW9sdF9lcG9uX25pIGVwb24gPSAoYmNtb2x0X2Vwb25fbmkpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpLT52YWx1ZS51bnVtYmVyOworICAgIGJjbW9zX21hY19hZGRyZXNzIG1hYyA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIiktPnZhbHVlLm1hYzsKKworICAgIHJldHVybiBlcG9uX29hbV9kcG9lX2NsZWFyX2luZ3Jlc3NfcnVsZXNfdXNlcl9wb3J0KGN1cnJlbnRfZGV2aWNlLCBlcG9uLCAmbWFjKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2VfY2xlYXJfaW5ncmVzc19ydWxlc19jbGkoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21vbHRfZXBvbl9uaSBlcG9uID0gKGJjbW9sdF9lcG9uX25pKWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKS0+dmFsdWUudW51bWJlcjsKKyAgICBiY21vc19tYWNfYWRkcmVzcyBtYWMgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpLT52YWx1ZS5tYWM7CisKKyAgICByZXR1cm4gZXBvbl9vYW1fZHBvZV9jbGVhcl9pbmdyZXNzX3J1bGVzKGN1cnJlbnRfZGV2aWNlLCBlcG9uLCAmbWFjKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2Vfc2V0X2Jhc2ljX3F1ZXVlX2NvbmZpZ19jbGkoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21vbHRfZXBvbl9uaSBlcG9uID0gKGJjbW9sdF9lcG9uX25pKWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKS0+dmFsdWUudW51bWJlcjsKKyAgICBiY21vc19tYWNfYWRkcmVzcyBtYWMgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpLT52YWx1ZS5tYWM7CisgICAgdWludDhfdCB1cF9xdWV1ZV9zaXplID0gKHVpbnQ4X3QpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidXBfc2l6ZSIpLT52YWx1ZS51bnVtYmVyOworICAgIHVpbnQ4X3QgZG5fcXVldWVfc2l6ZSA9ICh1aW50OF90KWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRuX3NpemUiKS0+dmFsdWUudW51bWJlcjsKKworICAgIHJldHVybiBlcG9uX29hbV9kcG9lX3NldF9iYXNpY19xdWV1ZV9jb25maWcoY3VycmVudF9kZXZpY2UsIGVwb24sICZtYWMsIHVwX3F1ZXVlX3NpemUsIGRuX3F1ZXVlX3NpemUpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gZXBvbl9vYW1fZHBvZV9hZGRfaW5ncmVzc19ydWxlc19uZXR3b3JrX3Bvbl9jbGkoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGJjbW9sdF9lcG9uX25pIGVwb24gPSAoYmNtb2x0X2Vwb25fbmkpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpLT52YWx1ZS51bnVtYmVyOworICAgIGJjbW9zX21hY19hZGRyZXNzIG1hYyA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIiktPnZhbHVlLm1hYzsKKworICAgIHJldHVybiBlcG9uX29hbV9kcG9lX2FkZF9pbmdyZXNzX3J1bGVzX25ldHdvcmtfcG9uKGN1cnJlbnRfZGV2aWNlLCBlcG9uLCAmbWFjLCBEUE9FX1JVTEVfVkxBTl9NT0RFX05PTkUsIE5VTEwpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gZXBvbl9vYW1fZHBvZV9hZGRfaW5ncmVzc19ydWxlc191c2VyX3BvcnRfY2xpKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGJjbW9sdF9lcG9uX25pIGVwb24gPSAoYmNtb2x0X2Vwb25fbmkpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpLT52YWx1ZS51bnVtYmVyOworICAgIGJjbW9zX21hY19hZGRyZXNzIG1hYyA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIiktPnZhbHVlLm1hYzsKKworICAgIHJldHVybiBlcG9uX29hbV9kcG9lX2FkZF9pbmdyZXNzX3J1bGVzX3VzZXJfcG9ydChjdXJyZW50X2RldmljZSwgZXBvbiwgJm1hYywgRFBPRV9SVUxFX1ZMQU5fTU9ERV9OT05FLCBOVUxMKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGVwb25fb2FtX2Rwb2VfYWRkX2luZ3Jlc3NfcnVsZXNfY2xpKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21vbHRfZXBvbl9uaSBlcG9uID0gKGJjbW9sdF9lcG9uX25pKWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKS0+dmFsdWUudW51bWJlcjsKKyAgICBiY21vc19tYWNfYWRkcmVzcyBtYWMgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtYWNfYWRkcmVzcyIpLT52YWx1ZS5tYWM7CisKKyAgICByZXR1cm4gZXBvbl9vYW1fZHBvZV9hZGRfaW5ncmVzc19ydWxlcyhjdXJyZW50X2RldmljZSwgZXBvbiwgJm1hYyk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX2FkZF9pbmdyZXNzX3J1bGVzX3dpdGhfdmxhbl9jbGkoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiA9IChiY21vbHRfZXBvbl9uaSliY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIiktPnZhbHVlLnVudW1iZXI7CisgICAgYmNtb3NfbWFjX2FkZHJlc3MgbWFjID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKS0+dmFsdWUubWFjOworICAgIHVpbnQzMl90IHZsYW4gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ2bGFuIiktPnZhbHVlLnVudW1iZXI7CisgICAgdWludDhfdCB2bGFuX3RhZ1s0XTsKKworICAgIHZsYW4gPSBCQ01PU19FTkRJQU5fQ1BVX1RPX0JJR19VMzIodmxhbik7CisgICAgdmxhbl90YWdbMF0gPSAodmxhbiA+PiAyNCkgJiAweGZmOworICAgIHZsYW5fdGFnWzFdID0gKHZsYW4gPj4gMTYpICYgMHhmZjsKKyAgICB2bGFuX3RhZ1syXSA9ICh2bGFuID4+IDgpICYgMHhmZjsKKyAgICB2bGFuX3RhZ1szXSA9ICh2bGFuID4+IDApICYgMHhmZjsKKworICAgIHJldHVybiBlcG9uX29hbV9kcG9lX2FkZF9pbmdyZXNzX3J1bGVzX3dpdGhfdmxhbihjdXJyZW50X2RldmljZSwgZXBvbiwgJm1hYywgdmxhbl90YWcpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gZXBvbl9vYW1fZHBvZV9lbmFibGVfdXNlcl90cmFmZmljX2NsaShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGJjbW9sdF9lcG9uX25pIGVwb24gPSAoYmNtb2x0X2Vwb25fbmkpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpLT52YWx1ZS51bnVtYmVyOworICAgIGJjbW9zX21hY19hZGRyZXNzIG1hYyA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIiktPnZhbHVlLm1hYzsKKworICAgIHJldHVybiBlcG9uX29hbV9kcG9lX2VuYWJsZV91c2VyX3RyYWZmaWMoY3VycmVudF9kZXZpY2UsIGVwb24sICZtYWMpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gZXBvbl9vYW1fZHBvZV9zdGFydF91cGdyYWRlX2NsaShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGJjbW9sdF9lcG9uX25pIGVwb24gPSAoYmNtb2x0X2Vwb25fbmkpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9uaSIpLT52YWx1ZS51bnVtYmVyOworICAgIGJjbW9zX21hY19hZGRyZXNzIG1hYyA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1hY19hZGRyZXNzIiktPnZhbHVlLm1hYzsKKyAgICBjb25zdCBjaGFyICpmd19maWxlID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZndfZmlsZSIpLT52YWx1ZS5zdHJpbmc7CisgICAgLyogVGhpcyBzaG91bGQgYmUgYmFzZWQgb24gdGhlIG5lZ290aWF0ZWQgUERVIHNpemUhICovCisgICAgdWludDE2X3QgYmxvY2tfc2l6ZSA9ICh1aW50MTZfdCliY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJibG9ja19zaXplIiktPnZhbHVlLnVudW1iZXI7CisgICAgdWludDhfdCB0aW1lb3V0ID0gKHVpbnQ4X3QpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidGltZW91dCIpLT52YWx1ZS51bnVtYmVyOworCisgICAgcmV0dXJuIGVwb25fb2FtX2Rwb2Vfc3RhcnRfdXBncmFkZShjdXJyZW50X2RldmljZSwgZXBvbiwgJm1hYywgZndfZmlsZSwgYmxvY2tfc2l6ZSwgdGltZW91dCk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBlcG9uX29hbV9kcG9lX3Jlc2V0X29udV9jbGkoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgYmNtb2x0X2Vwb25fbmkgZXBvbiA9IChiY21vbHRfZXBvbl9uaSliY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIiktPnZhbHVlLnVudW1iZXI7CisgICAgYmNtb3NfbWFjX2FkZHJlc3MgbWFjID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWFjX2FkZHJlc3MiKS0+dmFsdWUubWFjOworCisgICAgcmV0dXJuIGVwb25fb2FtX2Rwb2VfcmVzZXRfb251KGN1cnJlbnRfZGV2aWNlLCBlcG9uLCAmbWFjKTsKK30KKwordm9pZCBiY21vbHRfdXNlcl9hcHBsX2Vwb25fb2FtX2NsaV9pbml0KGJjbWNsaV9lbnRyeSAqdG9wX2RpcikKK3sKKyNpZmRlZiBFTkFCTEVfQ0xJCisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmRpcl9uYW1lID0gImVwb25fb2FtIjsKKworICAgIGlmIChiY21jbGlfZGlyX2ZpbmQodG9wX2RpciwgZGlyX25hbWUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJjbWNsaV9lbnRyeSAqb2FtX2RpciA9IGJjbWNsaV9kaXJfYWRkKHRvcF9kaXIsIGRpcl9uYW1lLCAiRVBPTiBPQU0iLCBCQ01DTElfQUNDRVNTX0FETUlOLCBOVUxMKTsKKyAgICBCVUdfT04oTlVMTCA9PSBvYW1fZGlyKTsKKworICAgIHN0YXRpYyBiY21jbGlfcGFybV92YWx1ZSBxdWV1ZV8wW01BWF9SRVBPUlRfVEhSRVNIT0xEU107CisgICAgc3RhdGljIGJjbWNsaV9wYXJtX3ZhbHVlIHF1ZXVlXzFbTUFYX1JFUE9SVF9USFJFU0hPTERTXTsKKyAgICBzdGF0aWMgYmNtY2xpX3Bhcm1fdmFsdWUgcXVldWVfMltNQVhfUkVQT1JUX1RIUkVTSE9MRFNdOworICAgIHN0YXRpYyBiY21jbGlfcGFybV92YWx1ZSBxdWV1ZV8zW01BWF9SRVBPUlRfVEhSRVNIT0xEU107CisKKyAgICBCQ01DTElfTUFLRV9DTUQob2FtX2RpciwgImRwb2VfZ2V0X2NyaXRpY2FsX2luZm8iLCAiRFBvRSBnZXQgT05VIElEIGFuZCBtYXggbGlua3MiLAorICAgICAgICAgICAgICAgICAgICBlcG9uX29hbV9kcG9lX2dldF9jcml0aWNhbF9pbmZvX2NsaSwKKyAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiZXBvbl9uaSIsICJFUE9OIE5JIiwgQkNNQ0xJX1BBUk1fVU5VTUJFUiwgMCksCisgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oIm1hY19hZGRyZXNzIiwgImxpbmsgTUFDIiwgQkNNQ0xJX1BBUk1fTUFDLCAwKSk7CisKKyAgICBCQ01DTElfTUFLRV9DTUQob2FtX2RpciwgImRwb2Vfc2V0X29hbV9yYXRlIiwgIkRQb0Ugc2V0IE9BTSByYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgZXBvbl9vYW1fZHBvZV9zZXRfb2FtX3JhdGVfY2xpLAorICAgICAgICAgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJlcG9uX25pIiwgIkVQT04gTkkiLCBCQ01DTElfUEFSTV9VTlVNQkVSLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgibWFjX2FkZHJlc3MiLCAibGluayBNQUMiLCBCQ01DTElfUEFSTV9NQUMsIDApLAorICAgICAgICAgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJtaW4iLCAiTWluaW11bSBPQU0gcmF0ZSIsIEJDTUNMSV9QQVJNX1VOVU1CRVIsIDApLAorICAgICAgICAgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJtYXgiLCAiTWF4aW11bSBPQU0gcmF0ZSIsIEJDTUNMSV9QQVJNX1VOVU1CRVIsIDApKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRChvYW1fZGlyLCAiZHBvZV9zZXRfcmVwb3J0X3RocmVzaG9sZHMiLCAiRFBvRSBzZXQgcmVwb3J0IHRocmVoc29sZHMiLAorICAgICAgICAgICAgICAgICAgICBlcG9uX29hbV9kcG9lX3NldF9yZXBvcnRfdGhyZXNob2xkc19jbGksCisgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImVwb25fbmkiLCAiRVBPTiBOSSIsIEJDTUNMSV9QQVJNX1VOVU1CRVIsIDApLAorICAgICAgICAgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJtYWNfYWRkcmVzcyIsICJsaW5rIE1BQyIsIEJDTUNMSV9QQVJNX01BQywgMCksCisgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fQVJSQVkoInF1ZXVlXzAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXBvcnQgdGhyZWhzb2xkIGZvciBxdWV1ZSBzZXQgMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX1BBUk1fVU5VTUJFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01DTElfUEFSTV9GTEFHX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1JFUE9SVF9USFJFU0hPTERTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlXzApLAorICAgICAgICAgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0FSUkFZKCJxdWV1ZV8xIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVwb3J0IHRocmVoc29sZCBmb3IgcXVldWUgc2V0IDAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9QQVJNX1VOVU1CRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX1BBUk1fRkxBR19PUFRJT05BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfUkVQT1JUX1RIUkVTSE9MRFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVfMSksCisgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fQVJSQVkoInF1ZXVlXzIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXBvcnQgdGhyZWhzb2xkIGZvciBxdWV1ZSBzZXQgMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX1BBUk1fVU5VTUJFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9SRVBPUlRfVEhSRVNIT0xEUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZV8yKSwKKyAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9BUlJBWSgicXVldWVfMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlcG9ydCB0aHJlaHNvbGQgZm9yIHF1ZXVlIHNldCAwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01DTElfUEFSTV9VTlVNQkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1JFUE9SVF9USFJFU0hPTERTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlXzMpKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRChvYW1fZGlyLCAiZHBvZV9jbGVhcl9pbmdyZXNzX3J1bGVzX25ldHdvcmtfcG9uIiwgIkRQb0UgY2xlYXIgaW5ncmVzcyBydWxlcyBmb3IgbmV0d29yayBQT04iLAorICAgICAgICAgICAgICAgICAgICBlcG9uX29hbV9kcG9lX2NsZWFyX2luZ3Jlc3NfcnVsZXNfbmV0d29ya19wb25fY2xpLAorICAgICAgICAgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJlcG9uX25pIiwgIkVQT04gTkkiLCBCQ01DTElfUEFSTV9VTlVNQkVSLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgibWFjX2FkZHJlc3MiLCAibGluayBNQUMiLCBCQ01DTElfUEFSTV9NQUMsIDApKTsKKyAgICBCQ01DTElfTUFLRV9DTUQob2FtX2RpciwgImRwb2VfY2xlYXJfaW5ncmVzc19ydWxlc191c2VyX3BvcnQiLCAiRFBvRSBjbGVhciBpbmdyZXNzIHJ1bGVzIGZvciB1c2VyIHBvcnQiLAorICAgICAgICAgICAgICAgICAgICBlcG9uX29hbV9kcG9lX2NsZWFyX2luZ3Jlc3NfcnVsZXNfdXNlcl9wb3J0X2NsaSwKKyAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiZXBvbl9uaSIsICJFUE9OIE5JIiwgQkNNQ0xJX1BBUk1fVU5VTUJFUiwgMCksCisgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oIm1hY19hZGRyZXNzIiwgImxpbmsgTUFDIiwgQkNNQ0xJX1BBUk1fTUFDLCAwKSk7CisgICAgQkNNQ0xJX01BS0VfQ01EKG9hbV9kaXIsICJkcG9lX2NsZWFyX2luZ3Jlc3NfcnVsZXMiLCAiRFBvRSBjbGVhciBpbmdyZXNzIHJ1bGVzIiwKKyAgICAgICAgICAgICAgICAgICAgZXBvbl9vYW1fZHBvZV9jbGVhcl9pbmdyZXNzX3J1bGVzX2NsaSwKKyAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiZXBvbl9uaSIsICJFUE9OIE5JIiwgQkNNQ0xJX1BBUk1fVU5VTUJFUiwgMCksCisgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oIm1hY19hZGRyZXNzIiwgImxpbmsgTUFDIiwgQkNNQ0xJX1BBUk1fTUFDLCAwKSk7CisKKyAgICBCQ01DTElfTUFLRV9DTUQob2FtX2RpciwgImRwb2Vfc2V0X2Jhc2ljX3F1ZXVlX2NvbmZpZyIsICJEUG9FIHNldCBiYXNpYyBxdWV1ZSBjb25maWcgZm9yIDEgbGluay8xIHBvcnQiLAorICAgICAgICAgICAgICAgICAgICBlcG9uX29hbV9kcG9lX3NldF9iYXNpY19xdWV1ZV9jb25maWdfY2xpLAorICAgICAgICAgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJlcG9uX25pIiwgIkVQT04gTkkiLCBCQ01DTElfUEFSTV9VTlVNQkVSLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgibWFjX2FkZHJlc3MiLCAibGluayBNQUMiLCBCQ01DTElfUEFSTV9NQUMsIDApLAorICAgICAgICAgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJ1cF9zaXplIiwgInVwc3RyZWFtIHF1ZXVlIHNpemUiLCBCQ01DTElfUEFSTV9VTlVNQkVSLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiZG5fc2l6ZSIsICJkb3duc3RyZWFtIHF1ZXVlIHNpemUiLCBCQ01DTElfUEFSTV9VTlVNQkVSLCAwKSk7CisKKyAgICBCQ01DTElfTUFLRV9DTUQob2FtX2RpciwgImRwb2VfYWRkX2luZ3Jlc3NfcnVsZXNfbmV0d29ya19wb24iLCAiRFBvRSBhZGQgaW5ncmVzcyBydWxlcyBmb3IgbmV0d29yayBQT04iLAorICAgICAgICAgICAgICAgICAgICBlcG9uX29hbV9kcG9lX2FkZF9pbmdyZXNzX3J1bGVzX25ldHdvcmtfcG9uX2NsaSwKKyAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiZXBvbl9uaSIsICJFUE9OIE5JIiwgQkNNQ0xJX1BBUk1fVU5VTUJFUiwgMCksCisgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oIm1hY19hZGRyZXNzIiwgImxpbmsgTUFDIiwgQkNNQ0xJX1BBUk1fTUFDLCAwKSk7CisgICAgQkNNQ0xJX01BS0VfQ01EKG9hbV9kaXIsICJkcG9lX2FkZF9pbmdyZXNzX3J1bGVzX3VzZXJfcG9ydCIsICJEUG9FIGFkZCBpbmdyZXNzIHJ1bGVzIGZvciB1c2VyIHBvcnQiLAorICAgICAgICAgICAgICAgICAgICBlcG9uX29hbV9kcG9lX2FkZF9pbmdyZXNzX3J1bGVzX3VzZXJfcG9ydF9jbGksCisgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImVwb25fbmkiLCAiRVBPTiBOSSIsIEJDTUNMSV9QQVJNX1VOVU1CRVIsIDApLAorICAgICAgICAgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJtYWNfYWRkcmVzcyIsICJsaW5rIE1BQyIsIEJDTUNMSV9QQVJNX01BQywgMCkpOworICAgIEJDTUNMSV9NQUtFX0NNRChvYW1fZGlyLCAiZHBvZV9hZGRfaW5ncmVzc19ydWxlcyIsICJEUG9FIGFkZCBpbmdyZXNzIHJ1bGVzIiwKKyAgICAgICAgICAgICAgICAgICAgZXBvbl9vYW1fZHBvZV9hZGRfaW5ncmVzc19ydWxlc19jbGksCisgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImVwb25fbmkiLCAiRVBPTiBOSSIsIEJDTUNMSV9QQVJNX1VOVU1CRVIsIDApLAorICAgICAgICAgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJtYWNfYWRkcmVzcyIsICJsaW5rIE1BQyIsIEJDTUNMSV9QQVJNX01BQywgMCkpOworICAgIEJDTUNMSV9NQUtFX0NNRChvYW1fZGlyLCAiZHBvZV9hZGRfaW5ncmVzc19ydWxlc193aXRoX3ZsYW4iLCAiRFBvRSBhZGQgaW5ncmVzcyBydWxlcyB3aXRoIFZMQU4iLAorICAgICAgICAgICAgICAgICAgICBlcG9uX29hbV9kcG9lX2FkZF9pbmdyZXNzX3J1bGVzX3dpdGhfdmxhbl9jbGksCisgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImVwb25fbmkiLCAiRVBPTiBOSSIsIEJDTUNMSV9QQVJNX1VOVU1CRVIsIDApLAorICAgICAgICAgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJtYWNfYWRkcmVzcyIsICJsaW5rIE1BQyIsIEJDTUNMSV9QQVJNX01BQywgMCksCisgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oInZsYW4iLCAiVkxBTiIsIEJDTUNMSV9QQVJNX1VOVU1CRVIsIDApKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRChvYW1fZGlyLCAiZHBvZV9lbmFibGVfdXNlcl90cmFmZmljIiwgIkRQb0UgZW5hYmxlIHVzZXIgdHJhZmZpYyIsCisgICAgICAgICAgICAgICAgICAgIGVwb25fb2FtX2Rwb2VfZW5hYmxlX3VzZXJfdHJhZmZpY19jbGksCisgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImVwb25fbmkiLCAiRVBPTiBOSSIsIEJDTUNMSV9QQVJNX1VOVU1CRVIsIDApLAorICAgICAgICAgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJtYWNfYWRkcmVzcyIsICJsaW5rIE1BQyIsIEJDTUNMSV9QQVJNX01BQywgMCkpOworCisgICAgQkNNQ0xJX01BS0VfQ01EKG9hbV9kaXIsICJkcG9lX2Z3X3VwZ3JhZGUiLCAiRFBvRSBmaXJ3bWFyZSB1cGdyYWRlIiwKKyAgICAgICAgICAgICAgICAgICAgZXBvbl9vYW1fZHBvZV9zdGFydF91cGdyYWRlX2NsaSwKKyAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiZXBvbl9uaSIsICJFUE9OIE5JIiwgQkNNQ0xJX1BBUk1fVU5VTUJFUiwgMCksCisgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oIm1hY19hZGRyZXNzIiwgImxpbmsgTUFDIiwgQkNNQ0xJX1BBUk1fTUFDLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiZndfZmlsZSIsICJGaXJtd2FyZSBmaWxlIiwgQkNNQ0xJX1BBUk1fU1RSSU5HLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiYmxvY2tfc2l6ZSIsICJCbG9jayBzaXplIiwgQkNNQ0xJX1BBUk1fVU5VTUJFUiwgMCksCisgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oInRpbWVvdXQiLCAiVGltZW91dCBpbiBzZWNvbmRzIiwgQkNNQ0xJX1BBUk1fVU5VTUJFUiwgMCkpOworCisgICAgQkNNQ0xJX01BS0VfQ01EKG9hbV9kaXIsICJkcG9lX3Jlc2V0X29udSIsICJEUG9FIHJlc2V0IE9OVSIsCisgICAgICAgICAgICAgICAgICAgIGVwb25fb2FtX2Rwb2VfcmVzZXRfb251X2NsaSwKKyAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiZXBvbl9uaSIsICJFUE9OIE5JIiwgQkNNQ0xJX1BBUk1fVU5VTUJFUiwgMCksCisgICAgICAgICAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oIm1hY19hZGRyZXNzIiwgImxpbmsgTUFDIiwgQkNNQ0xJX1BBUk1fTUFDLCAwKSk7CisjZW5kaWYKK30KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lcG9uX29hbV9jbGkvYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29hbV9jbGkuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZXBvbl9vYW1fY2xpL2JjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW1fY2xpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTliNGFlOAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZXBvbl9vYW1fY2xpL2JjbW9sdF91c2VyX2FwcGxfZXBvbl9vYW1fY2xpLmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBfQkNNT0xUX1VTRVJfQVBQTF9FUE9OX09BTV9DTElfSF8KKyNkZWZpbmUgX0JDTU9MVF9VU0VSX0FQUExfRVBPTl9PQU1fQ0xJX0hfCisKKyNpbmNsdWRlICJiY21jbGkuaCIKKyNpbmNsdWRlICJiY21vbHRfbXNnLmgiCisKK3ZvaWQgYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29hbV9jbGlfaW5pdChiY21jbGlfZW50cnkgKnRvcF9kaXIpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvaW1hZ2VfdHJhbnNmZXIvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2ltYWdlX3RyYW5zZmVyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMzkyZjUKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2ltYWdlX3RyYW5zZmVyL01ha2VmaWxlCkBAIC0wLDAgKzEsMTIgQEAKKyMgRmlsZSB0cmFuc2ZlciBhcHBsaWNhdGlvbgorCitpZmVxICgiJChFTkFCTEVfQ0xJKSIsICJ5IikKKyAgICBNT0RfTkFNRSA9IGJjbV9pbWFnZV90cmFuc2ZlcgorICAgIE1PRF9UWVBFID0gbGliCisgICAgTU9EX0RFUFMgPSBob3N0X2FwaQorICAgIHNyY3MgPSBiY21vbHRfaW1hZ2VfdHJhbnNmZXIuYyBiY21vbHRfaW1hZ2VfdHJhbnNmZXJfdXNlci5jIGJjbW9sdF9pbWFnZV90cmFuc2Zlcl9jbGkuYworICAgIAorICAgIGlmZXEgKCIkKE9TX0tFUk5FTCkiLCAibGludXgiKQorICAgICAgICBNT0RfREVQUyArPSBkZXZfbG9nX2xpbnV4CisgICAgZW5kaWYKK2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2ltYWdlX3RyYW5zZmVyL2JjbW9sdF9pbWFnZV90cmFuc2Zlci5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9pbWFnZV90cmFuc2Zlci9iY21vbHRfaW1hZ2VfdHJhbnNmZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDg1ZWFhCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9pbWFnZV90cmFuc2Zlci9iY21vbHRfaW1hZ2VfdHJhbnNmZXIuYwpAQCAtMCwwICsxLDUwNyBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNDpEVUFML0dQTDpzdGFuZGFyZAorCisgICBDb3B5cmlnaHQgKGMpIDIwMTQgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisjaW5jbHVkZSA8YmNtdHJfaW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YmNtY2xpLmg+CisjaW5jbHVkZSA8bGliZ2VuLmg+CisjaW5jbHVkZSAiYmNtb2x0X2FwaS5oIgorI2luY2x1ZGUgImJjbV9kZXZfbG9nLmgiCisjaW5jbHVkZSAiYmNtb2x0X2ltYWdlX3RyYW5zZmVyLmgiCisjaW5jbHVkZSAiYmNtb2x0X2ltYWdlX3RyYW5zZmVyX3VzZXIuaCIKKworc3RhdGljIGJjbXVzZXJfbWZ0cF9ibG9ja19zaXplX2dldCBtZnRwX2Jsb2NrX3NpemVfZ2V0Oworc3RhdGljIGJjbXVzZXJfbWZ0cF9jcmNfZ2V0IG1mdHBfY3JjX2dldF9jYjsKK3N0YXRpYyBiY211c2VyX21mdHBfaW1hZ2VfcmVhZCBtZnRwX3JlYWRfZGF0YV9jYjsKK3N0YXRpYyBiY211c2VyX21mdHBfbm90aWZpY2F0aW9uX3J4IG1mdHBfbm90aWZ5X3VzZXJfY2I7CitzdGF0aWMgbWZ0cF9jb250ZXh0IG1mdHBfY29udGV4dF9kYltCQ01UUl9NQVhfT0xUU107CisKK3N0YXRpYyBiY21vc19lcnJubyBtZnRwX2luZF9yeF9jYl9yZWdpc3RlcihiY21vbHRfZGV2aWQgZGV2aWNlKTsKK3N0YXRpYyBiY21vc19lcnJubyBtZnRwX2luZF9yeF9jYl91bnJlZ2lzdGVyKGJjbW9sdF9kZXZpZCBkZXZpY2UpOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworc3RhdGljIGJjbW9sdF9pbWFnZV90cmFuc2Zlcl9zdGF0dXMgbWZ0cF9lcnJfdG9fc3RhdHVzKGJjbW9zX2Vycm5vIGVycikKK3sKKyAgICBiY21vbHRfaW1hZ2VfdHJhbnNmZXJfc3RhdHVzIHN0YXR1czsKKyAgICBzd2l0Y2ggKGVycikKKyAgICB7CisgICAgY2FzZSBCQ01fRVJSX09LOgorICAgICAgICBzdGF0dXMgPSBCQ01PTFRfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX1NVQ0NFU1M7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkNNX0VSUl9OT01FTToKKyAgICAgICAgc3RhdHVzID0gQkNNT0xUX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19NRU1PUllfQUxMT0NBVElPTl9GQUlMVVJFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTV9FUlJfSU5DT01QTEVURV9URVJNSU5BVElPTjoKKyAgICAgICAgc3RhdHVzID0gQkNNT0xUX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19QUkVNQVRVUkVfVEVSTUlOQVRJT047CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkNNX0VSUl9DSEVDS1NVTToKKyAgICAgICAgc3RhdHVzID0gQkNNT0xUX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19DUkNfRVJST1I7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkNNX0VSUl9PVkVSRkxPVzoKKyAgICAgICAgc3RhdHVzID0gQkNNT0xUX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19JTlRFUk5BTF9FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCQ01fRVJSX09VVF9PRl9TWU5DOgorICAgICAgICBzdGF0dXMgPSBCQ01PTFRfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX0JMT0NLX09VVF9PRl9TWU5DOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTV9FUlJfU1RBVEU6CisgICAgICAgIHN0YXR1cyA9IEJDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfSU5WQUxJRF9TVEFURTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCQ01fRVJSX0lNQUdFX1RZUEU6CisgICAgICAgIHN0YXR1cyA9IEJDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfVU5TVVBQT1JURURfRklMRV9UWVBFOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBzdGF0dXMgPSBCQ01PTFRfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX0lOVEVSTkFMX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2NvbnN0IGNoYXIgKmJjbW9sdF91c2VyX21mdHBfc3RhdHVzX3RvX3N0cihiY21vbHRfaW1hZ2VfdHJhbnNmZXJfc3RhdHVzIHN0YXR1cykKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqbWZ0cF9zdGF0dXNfdG9fc3RyX3RhYmxlW0JDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfX05VTV9PRl0gPQorICAgIHsKKyAgICAgICAgW0JDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfU1VDQ0VTU10gPSAiU3VjY2VlZGVkIiwKKyAgICAgICAgW0JDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfTUVNT1JZX0FMTE9DQVRJT05fRkFJTFVSRV0gPSAiRVJST1I6IE1lbW9yeSBhbGxvY2F0aW9uIiwKKyAgICAgICAgW0JDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfVU5TVVBQT1JURURfRklMRV9UWVBFXSA9ICJFUlJPUjogSW52YWxpZCBpbWFnZSB0eXBlIiwKKyAgICAgICAgW0JDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfQ1JDX0VSUk9SXSA9ICJFUlJPUjogQ2hlY2tzdW0iLAorICAgICAgICBbQkNNT0xUX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19CTE9DS19PVVRfT0ZfU1lOQ10gPSAiRVJST1I6IEJsb2NrIG91dC1vZi1zeW5jIiwKKyAgICAgICAgW0JDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfSU5URVJOQUxfRVJST1JdID0gIkVSUk9SOiBCdWZmZXIgb3ZlcmZsb3ciLAorICAgICAgICBbQkNNT0xUX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19JTlZBTElEX1NUQVRFXSA9ICJFUlJPUjogSW52YWxpZCBzdGF0ZSIsCisgICAgICAgIFtCQ01PTFRfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX1BSRU1BVFVSRV9URVJNSU5BVElPTl0gPSAiRVJST1I6IFByZW1hdHVyZSB0ZXJtaW5hdGlvbiIsCisgICAgICAgIFtCQ01PTFRfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX0FDS19USU1FT1VUXSA9ICJFUlJPUjogQUNLIHRpbWVvdXQiCisgICAgfTsKKyAgICByZXR1cm4gKHN0YXR1cyA+PSBCQ01PTFRfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX19OVU1fT0YpID8gIjx1bmtub3duPiIgOiBtZnRwX3N0YXR1c190b19zdHJfdGFibGVbc3RhdHVzXTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK3N0YXRpYyBpbmxpbmUgbWZ0cF9jb250ZXh0ICptZnRwX2NvbnRleHRfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2UpCit7CisgICAgcmV0dXJuICZtZnRwX2NvbnRleHRfZGJbZGV2aWNlXTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qKiBjb252ZXJ0IGRldmljZSBJRCB0byBtb2R1bGUgSUQgKi8KK3N0YXRpYyBpbmxpbmUgYmNtb3NfbW9kdWxlX2lkIG1mdHBfZGV2aWNlX2lkX3RvX21vZHVsZV9pZChiY21vbHRfZGV2aWQgZGV2aWNlKQoreworICAgIHJldHVybiAoQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9JTUFHRV9UUkFOU0ZFUjAgKyBkZXZpY2UpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyoqIGV4YW1pbmVzIHRoZSBBQ0sgcmVzcG9uc2UuICovCitzdGF0aWMgYmNtb2x0X2ltYWdlX3RyYW5zZmVyX3N0YXR1cyBtZnRwX2NoZWNrX3BhcmFtcyhtZnRwX2NvbnRleHQgKmNvbnRleHQsCisgICAgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9kYXRhICphY2tfZGF0YSkKK3sKKyAgICBiY21vbHRfaW1hZ2VfdHJhbnNmZXJfc3RhdHVzIHN0YXR1cyA9IEJDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfU1VDQ0VTUzsKKworICAgIGlmIChjb250ZXh0LT5ibG9ja19udW0gIT0gYWNrX2RhdGEtPmJsb2NrX251bWJlcikKKyAgICB7CisgICAgICAgIEJDTV9MT0coREVCVUcsIGNvbnRleHQtPmxvZ19pZCwgIkFDSyBibG9jayAjIG1pc21hdGNoOiBleHA9JXUgYWNrPSV1XG4iLCBjb250ZXh0LT5ibG9ja19udW0sIGFja19kYXRhLT5ibG9ja19udW1iZXIpOworICAgICAgICBzdGF0dXMgPSBCQ01PTFRfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX0JMT0NLX09VVF9PRl9TWU5DOworICAgIH0KKyAgICBlbHNlIGlmIChjb250ZXh0LT5pbWFnZV90eXBlICE9IGFja19kYXRhLT5pbWFnZV90eXBlKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhERUJVRywgY29udGV4dC0+bG9nX2lkLCAiQUNLIGltYWdlIHR5cGUgbWlzbWF0Y2g6IGV4cD0ldSBhY2s9JXVcbiIsIGNvbnRleHQtPmltYWdlX3R5cGUsIGFja19kYXRhLT5pbWFnZV90eXBlKTsKKyAgICAgICAgc3RhdHVzID0gQkNNT0xUX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19VTlNVUFBPUlRFRF9GSUxFX1RZUEU7CisgICAgfQorICAgIGVsc2UgaWYgKGFja19kYXRhLT5zdGF0dXMgIT0gQkNNT0xUX0lNQUdFX1RSQU5TRkVSX1NUQVRVU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhERUJVRywgY29udGV4dC0+bG9nX2lkLCAiT0xUIHJldHVybmVkIGFuIGVycm9yOiAlc1xuIiwgYmNtb2x0X3VzZXJfbWZ0cF9zdGF0dXNfdG9fc3RyKGFja19kYXRhLT5zdGF0dXMpKTsKKyAgICAgICAgc3RhdHVzID0gYWNrX2RhdGEtPnN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK3N0YXRpYyB2b2lkIG1mdHBfdGVybWluYXRlKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHlwZSBpbWFnZV90eXBlLAorICAgIHVpbnQzMl90IGJsb2NrX251bSwgYmNtb2x0X2ltYWdlX3RyYW5zZmVyX3N0YXR1cyBzdGF0dXMpCit7CisgICAgbWZ0cF9jb250ZXh0ICpjb250ZXh0ID0gbWZ0cF9jb250ZXh0X2dldChkZXZpY2UpOworICAgIGJjbW9zX2Vycm5vIHJjID0gbWZ0cF9pbmRfcnhfY2JfdW5yZWdpc3RlcihkZXZpY2UpOworCisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBjb250ZXh0LT5sb2dfaWQsICJGYWlsZWQgdG8gdW4tcmVnaXN0ZXIgSU5EIGNhbGxiYWNrXG4iKTsKKyAgICB9CisgICAgbWZ0cF9ub3RpZnlfdXNlcl9jYihkZXZpY2UsIGltYWdlX3R5cGUsIGJsb2NrX251bSwgc3RhdHVzKTsKKyAgICBjb250ZXh0LT5zdGF0dXMgPSBNRlRQX1NUQVRVU19ESVNBQkxFRDsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qKiBTZW5kcyB0aGUgaW1hZ2UgdHJhbnNmZXIgc3RhcnQgb3BlcmF0aW9uIHRvIHRoZSBPTFQuICovCitzdGF0aWMgYmNtb3NfZXJybm8gbWZ0cF9zZW5kX3dycShiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgaW1hZ2VfdHlwZSwKKyAgICB1aW50MzJfdCBpbWFnZV9zaXplLCB1aW50MzJfdCBjcmMzMiwgYmNtb2x0X3N0cl82NCAqaW1hZ2VfbmFtZSkKK3sKKyAgICBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX3N0YXJ0IG9wZXI7CisgICAgYmNtb2x0X2RldmljZV9rZXkga2V5ID0geyB9OworCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZGV2aWNlLCBpbWFnZV90cmFuc2Zlcl9zdGFydCwga2V5KTsKKyAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZGV2aWNlLCBpbWFnZV90cmFuc2Zlcl9zdGFydCwgaW1hZ2VfdHlwZSwgaW1hZ2VfdHlwZSk7CisgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGRldmljZSwgaW1hZ2VfdHJhbnNmZXJfc3RhcnQsIGltYWdlX3NpemUsIGltYWdlX3NpemUpOworICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBkZXZpY2UsIGltYWdlX3RyYW5zZmVyX3N0YXJ0LCBjcmMzMiwgY3JjMzIpOworICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBkZXZpY2UsIGltYWdlX3RyYW5zZmVyX3N0YXJ0LCBpbWFnZV9uYW1lLCAqaW1hZ2VfbmFtZSk7CisgICAgcmV0dXJuIGJjbW9sdF9vcGVyX3N1Ym1pdChkZXZpY2UsICZvcGVyLmhkcik7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiogU2VuZHMgYSBkYXRhIGJsb2NrIHRvIHRoZSBPTFQuICovCitzdGF0aWMgYmNtb3NfZXJybm8gbWZ0cF9zZW5kX2RhdGEoYmNtb2x0X2RldmlkIGRldmljZSwgdWludDhfdCAqYnVmLCB1aW50MzJfdCBidWZfc2l6ZSwKKyAgICB1aW50MzJfdCBibG9ja19udW1iZXIsIGJjbW9zX2Jvb2wgbW9yZV9kYXRhKQoreworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGtleSA9IHsucmVzZXJ2ZWQgPSAwfTsKKyAgICBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2RhdGEgb3BlciA9IHt9OworICAgIGJjbW9sdF91OF9saXN0X3UxNl9oZXggZGF0YTsKKyAgICBkYXRhLmxlbiA9IGJ1Zl9zaXplOworICAgIGRhdGEudmFsID0gYnVmOworCisgICAgLyogQnVpbGRzIGEgdHJhbnNwb3J0IG1lc3NhZ2UgZm9yIEJDTU9MVF9ERVZJQ0VfT1BFUl9JRF9JTUFHRV9UUkFOU0ZFUl9EQVRBICovCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZGV2aWNlLCBpbWFnZV90cmFuc2Zlcl9kYXRhLCBrZXkpOworICAgIG9wZXIuaGRyLmhkci50eXBlID0gQkNNT0xUX01TR19UWVBFX1NFVDsKKyAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZGV2aWNlLCBpbWFnZV90cmFuc2Zlcl9kYXRhLCBibG9ja19udW1iZXIsIGJsb2NrX251bWJlcik7CisgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGRldmljZSwgaW1hZ2VfdHJhbnNmZXJfZGF0YSwgbW9yZV9kYXRhLCBtb3JlX2RhdGEpOworICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBkZXZpY2UsIGltYWdlX3RyYW5zZmVyX2RhdGEsIGRhdGEsIGRhdGEpOworICAgIHJldHVybiBiY21vbHRfb3Blcl9zdWJtaXQoZGV2aWNlLCAmb3Blci5oZHIpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogaGFuZGxlciBmb3IgdGhlIE9QRVJBVElPTiBkZXZpY2UuaW1hZ2VfdHJhbnNmZXJfc3RhcnQuICovCitiY21vc19lcnJubyBiY21vbHRfdXNlcl9tZnRwX3N0YXJ0KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHlwZSBpbWFnZV90eXBlKQoreworICAgIG1mdHBfY29udGV4dCAqY29udGV4dCA9IG1mdHBfY29udGV4dF9nZXQoZGV2aWNlKTsKKyAgICB1aW50MzJfdCBpbWFnZV9zaXplOworICAgIHVpbnQzMl90IGNyYzMyOworICAgIGNvbnN0IGNoYXIgKnBhdGhfbmFtZTsKKyAgICBjaGFyIGZpbGVfbmFtZVtNRlRQX01BWF9QQVRIX05BTUVfTEVOXTsKKyAgICBjaGFyICpiYXNlX25hbWU7CisgICAgYmNtb2x0X3N0cl82NCBpbWFnZV9uYW1lOworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIGlmIChjb250ZXh0LT5zdGF0dXMgIT0gTUZUUF9TVEFUVVNfRElTQUJMRUQpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9JTl9QUk9HUkVTUzsKKyAgICB9CisKKyAgICByYyA9IGJjbXVzZXJfaW1hZ2VfdHJhbnNmZXJfZmlsZV9zaXplX2dldChkZXZpY2UsIGltYWdlX3R5cGUsICZpbWFnZV9zaXplKTsKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIGNvbnRleHQtPmxvZ19pZCwgIkZhaWxlZCB0byBnZXQgdGhlIGltYWdlIHNpemVcbiIpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgcGF0aF9uYW1lID0gYmNtdXNlcl9kZXZpY2VfaW1hZ2VfbmFtZV9nZXQoaW1hZ2VfdHlwZSk7CisgICAgaWYgKHBhdGhfbmFtZSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgY29udGV4dC0+bG9nX2lkLCAiRmlsZSBub3QgZm91bmRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKyAgICBpZiAoc3RybGVuKHBhdGhfbmFtZSkgPj0gc2l6ZW9mKGZpbGVfbmFtZSkpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBjb250ZXh0LT5sb2dfaWQsICJQYXRoIG5hbWUgdG9vIGxvbmdcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKyAgICAodm9pZClzdHJjcHkoZmlsZV9uYW1lLCBwYXRoX25hbWUpOyAgICAgICAvKiB0byBtYWtlIGxpbnQgaGFwcHkuICovCisKKyAgICBiYXNlX25hbWUgPSBiYXNlbmFtZShmaWxlX25hbWUpOworICAgIGlmIChzdHJsZW4oYmFzZV9uYW1lKSA+PSBzaXplb2YoaW1hZ2VfbmFtZSkpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBjb250ZXh0LT5sb2dfaWQsICJGaWxlIG5hbWUgdG9vIGxvbmdcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJNOworICAgIH0KKyAgICAodm9pZClzdHJjcHkoaW1hZ2VfbmFtZS5zdHIsIGJhc2VfbmFtZSk7CisKKyAgICBjb250ZXh0LT5zdGF0dXMgPSBNRlRQX1NUQVRVU19XQUlUSU5HX0FDSzsKKyAgICBjb250ZXh0LT5ibG9ja19udW0gPSAwOworICAgIGNvbnRleHQtPmltYWdlX3R5cGUgPSBpbWFnZV90eXBlOworICAgIGNyYzMyID0gbWZ0cF9jcmNfZ2V0X2NiKGRldmljZSwgaW1hZ2VfdHlwZSk7CisgICAgQkNNX0xPRyhERUJVRywgY29udGV4dC0+bG9nX2lkLCAiSW1hZ2Ugc2l6ZT0ldSBjcmM9MHgleFxuIiwgaW1hZ2Vfc2l6ZSwgY3JjMzIpOworCisgICAgcmMgPSBtZnRwX2luZF9yeF9jYl9yZWdpc3RlcihkZXZpY2UpOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgY29udGV4dC0+bG9nX2lkLCAiRmFpbGVkIHRvIHJlZ2lzdGVyIElORCBjYWxsYmFja1xuIik7CisgICAgICAgIEJVRygpOworICAgIH0KKworICAgIHJjID0gbWZ0cF9zZW5kX3dycShkZXZpY2UsIGltYWdlX3R5cGUsIGltYWdlX3NpemUsIGNyYzMyLCAmaW1hZ2VfbmFtZSk7CisgICAgaWYgKEJDTV9FUlJfT0sgIT0gcmMpCisgICAgeworICAgICAgICBCQ01fTE9HKERFQlVHLCBjb250ZXh0LT5sb2dfaWQsICJXUlEgT1BFUiBmYWlsZWQuICVzXG4iLCBiY21vc19zdHJlcnJvcihyYykpOworICAgICAgICAodm9pZCltZnRwX2luZF9yeF9jYl91bnJlZ2lzdGVyKGRldmljZSk7CisgICAgICAgIGNvbnRleHQtPnN0YXR1cyA9IE1GVFBfU1RBVFVTX0RJU0FCTEVEOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBiY21vc190aW1lcl9zdGFydCgmY29udGV4dC0+dGltZXIsIE1GVFBfQUNLX1RJTUVPVVRfVVMpOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitzdGF0aWMgdm9pZCBtZnRwX3Byb2Nlc3NfbGFzdF9hY2soYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZV9kYXRhICphY2tfZGF0YSkKK3sKKyAgICBiY21vbHRfaW1hZ2VfdHJhbnNmZXJfc3RhdHVzIHN0YXR1czsKKyAgICBtZnRwX2NvbnRleHQgKmNvbnRleHQgPSBtZnRwX2NvbnRleHRfZ2V0KGRldmljZSk7CisKKyAgICBzdGF0dXMgPSBtZnRwX2NoZWNrX3BhcmFtcyhjb250ZXh0LCBhY2tfZGF0YSk7CisgICAgbWZ0cF90ZXJtaW5hdGUoZGV2aWNlLCBhY2tfZGF0YS0+aW1hZ2VfdHlwZSwgYWNrX2RhdGEtPmJsb2NrX251bWJlciwgc3RhdHVzKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qIHJlYWRzIGEgZGF0YSBibG9jayB1c2luZyBjdXN0b21lci1wcm92aWRlZCBjYWxsYmFjayBhbmQgc2VuZHMgaXQgdG8gdGhlIGVtYmVkZGVkLiAqLworc3RhdGljIHZvaWQgbWZ0cF9wcm9jZXNzX2FjayhiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfZGV2aWNlX2ltYWdlX3RyYW5zZmVyX2NvbXBsZXRlX2RhdGEgKmFja19kYXRhKQoreworICAgIHVpbnQzMl90IG9mZnNldCA9IDA7ICAgIC8qIGZpbGUtcG9zaXRpb24qLworICAgIHVpbnQzMl90IGJ5dGVzX3JlYWQgPSAwOworICAgIGJjbW9zX2Jvb2wgbW9yZV9kYXRhOworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKyAgICBiY21vbHRfaW1hZ2VfdHJhbnNmZXJfc3RhdHVzIHN0YXR1czsKKyAgICBtZnRwX2NvbnRleHQgKmNvbnRleHQgPSBtZnRwX2NvbnRleHRfZ2V0KGRldmljZSk7CisKKyAgICBzdGF0dXMgPSBtZnRwX2NoZWNrX3BhcmFtcyhjb250ZXh0LCBhY2tfZGF0YSk7CisgICAgaWYgKHN0YXR1cyAhPSBCQ01PTFRfSU1BR0VfVFJBTlNGRVJfU1RBVFVTX1NVQ0NFU1MpCisgICAgeworICAgICAgICBtZnRwX3Rlcm1pbmF0ZShkZXZpY2UsIGNvbnRleHQtPmltYWdlX3R5cGUsIGFja19kYXRhLT5ibG9ja19udW1iZXIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBvZmZzZXQgPSAoY29udGV4dC0+YmxvY2tfbnVtICogY29udGV4dC0+YmxvY2tfc2l6ZSk7CisgICAgY29udGV4dC0+YmxvY2tfbnVtKys7CisKKyAgICAvKiBDQUxMIENVU1RPTUVSLVBST1ZJREVEIENBTExCQUNLICovCisgICAgYnl0ZXNfcmVhZCA9IG1mdHBfcmVhZF9kYXRhX2NiKGRldmljZSwgY29udGV4dC0+aW1hZ2VfdHlwZSwgb2Zmc2V0LAorICAgICAgICBjb250ZXh0LT5idWYsIGNvbnRleHQtPmJsb2NrX3NpemUpOyAgLyogYmNtdXNlcl9tZnRwX3JlYWRfZGF0YSgpICovCisKKyAgICBtb3JlX2RhdGEgPSAhKGJ5dGVzX3JlYWQgPCBjb250ZXh0LT5ibG9ja19zaXplKTsKKworICAgIHJjID0gbWZ0cF9zZW5kX2RhdGEoZGV2aWNlLCBjb250ZXh0LT5idWYsIGJ5dGVzX3JlYWQsIGNvbnRleHQtPmJsb2NrX251bSwgbW9yZV9kYXRhKTsKKyAgICBpZiAoQkNNX0VSUl9PSyAhPSByYykKKyAgICB7CisgICAgICAgIEJDTV9MT0coREVCVUcsIGNvbnRleHQtPmxvZ19pZCwgIkRBVEEgT1BFUiBmYWlsZWQuIEJsb2NrICV1LiAlc1xuIiwgY29udGV4dC0+YmxvY2tfbnVtLCBiY21vc19zdHJlcnJvcihyYykpOworICAgICAgICBtZnRwX3Rlcm1pbmF0ZShkZXZpY2UsIGFja19kYXRhLT5pbWFnZV90eXBlLCBhY2tfZGF0YS0+YmxvY2tfbnVtYmVyLCBtZnRwX2Vycl90b19zdGF0dXMocmMpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEJDTV9MT0coREVCVUcsIGNvbnRleHQtPmxvZ19pZCwgIlNlbnQgYmxvY2sjPSV1IGJ1Zl9zaXplPSV1IG1vcmU9JXVcbiIsIGNvbnRleHQtPmJsb2NrX251bSwgYnl0ZXNfcmVhZCwgbW9yZV9kYXRhKTsKKworICAgIGNvbnRleHQtPnN0YXR1cyA9IChtb3JlX2RhdGEpID8gTUZUUF9TVEFUVVNfV0FJVElOR19BQ0sgOiBNRlRQX1NUQVRVU19XQUlUSU5HX0xBU1RfQUNLOworCisgICAgYmNtb3NfdGltZXJfc3RhcnQoJmNvbnRleHQtPnRpbWVyLCBNRlRQX0FDS19USU1FT1VUX1VTKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qIEFDSyBpbmRpY2F0aW9uIGNhbGxiYWNrICovCitzdGF0aWMgdm9pZCBtZnRwX3Byb2Nlc3NfaW5kKGJjbW9sdF9kZXZpZCBvbHQsIGJjbW9sdF9tc2cgKm1zZykKK3sKKyAgICBtZnRwX2NvbnRleHQgKmNvbnRleHQgPSBtZnRwX2NvbnRleHRfZ2V0KG9sdCk7CisgICAgYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZSAqYWNrOworICAgIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHJhbnNmZXJfY29tcGxldGVfZGF0YSAqYWNrX2RhdGE7CisKKyAgICBhY2sgPSAoYmNtb2x0X2RldmljZV9pbWFnZV90cmFuc2Zlcl9jb21wbGV0ZSAqKW1zZzsKKyAgICBhY2tfZGF0YSA9ICZhY2stPmRhdGE7CisKKyAgICBCQ01fTE9HKERFQlVHLCBjb250ZXh0LT5sb2dfaWQsICIjIyBBQ0s6IG9iaj0ldSwgZ3JvdXA9JXUsIGltYWdlPSV1LCBibG9jaz0ldSwgc3RhdHVzPSV1XG4iLAorICAgICAgICBtc2ctPm9ial90eXBlLCBtc2ctPmdyb3VwLCBhY2tfZGF0YS0+aW1hZ2VfdHlwZSwgYWNrX2RhdGEtPmJsb2NrX251bWJlciwgYWNrX2RhdGEtPnN0YXR1cyk7CisKKyAgICBzd2l0Y2ggKGNvbnRleHQtPnN0YXR1cykKKyAgICB7CisgICAgY2FzZSBNRlRQX1NUQVRVU19XQUlUSU5HX0FDSzoKKyAgICAgICAgYmNtb3NfdGltZXJfc3RvcCgmY29udGV4dC0+dGltZXIpOworICAgICAgICBtZnRwX3Byb2Nlc3NfYWNrKG9sdCwgYWNrX2RhdGEpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1GVFBfU1RBVFVTX1dBSVRJTkdfTEFTVF9BQ0s6CisgICAgICAgIGJjbW9zX3RpbWVyX3N0b3AoJmNvbnRleHQtPnRpbWVyKTsKKyAgICAgICAgbWZ0cF9wcm9jZXNzX2xhc3RfYWNrKG9sdCwgYWNrX2RhdGEpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICAvKiBUaGlzIGNvdWxkIGhhcHBlbiB3aGVuIHRoZSBTVEFSVCBvcGVyYXRpb24gZmFpbHMuICovCisgICAgICAgIEJDTV9MT0coREVCVUcsIGNvbnRleHQtPmxvZ19pZCwgIlVuZXhwZWN0ZWQgQUNLXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYmNtb2x0X21zZ19mcmVlKG1zZyk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitzdGF0aWMgYmNtb3NfZXJybm8gbWZ0cF9pbmRfcnhfY2JfcmVnaXN0ZXIoYmNtb2x0X2RldmlkIGRldmljZSkKK3sKKyAgICBiY210cl9oYW5kbGVyX3Bhcm0gdHBhcm0gPSB7CisgICAgICAgIC5ncm91cCA9IEJDTU9MVF9NR1RfR1JPVVBfQVVUTywKKyAgICAgICAgLm9iamVjdCA9IEJDTU9MVF9PQkpfSURfREVWSUNFLAorICAgICAgICAuc3ViZ3JvdXAgPSBCQ01PTFRfREVWSUNFX0FVVE9fSURfSU1BR0VfVFJBTlNGRVJfQ09NUExFVEUsCisgICAgICAgIC5hcHBfY2IgPSBtZnRwX3Byb2Nlc3NfaW5kLAorICAgICAgICAuZmxhZ3MgPSBCQ01PTFRfQVVUT19GTEFHU19ESVNQQVRDSCwKKyAgICB9OworICAgIG1mdHBfY29udGV4dCAqY29udGV4dCA9IG1mdHBfY29udGV4dF9nZXQoZGV2aWNlKTsKKyAgICB1aW50OF90IGluc3Q7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworCisgICAgdHBhcm0ubW9kdWxlID0gY29udGV4dC0+bW9kdWxlX2lkOworCisgICAgZm9yIChpbnN0ID0gMDsgKGluc3QgPCBCQ01UUl9NQVhfSU5TVEFOQ0VTKSAmJiAocmMgPT0gQkNNX0VSUl9PSyk7IGluc3QrKykKKyAgICB7CisgICAgICAgIHRwYXJtLmluc3RhbmNlID0gaW5zdDsKKyAgICAgICAgcmMgPSBiY210cl9tc2dfaGFuZGxlcl91bnJlZ2lzdGVyKGRldmljZSwgJnRwYXJtKTsKKyAgICAgICAgcmMgPSAocmMgPT0gQkNNX0VSUl9PSykgPyBiY210cl9tc2dfaGFuZGxlcl9yZWdpc3RlcihkZXZpY2UsICZ0cGFybSkgOiByYzsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworc3RhdGljIGJjbW9zX2Vycm5vIG1mdHBfaW5kX3J4X2NiX3VucmVnaXN0ZXIoYmNtb2x0X2RldmlkIGRldmljZSkKK3sKKyAgICBiY210cl9oYW5kbGVyX3Bhcm0gdHBhcm0gPSB7CisgICAgICAgIC5ncm91cCA9IEJDTU9MVF9NR1RfR1JPVVBfQVVUTywKKyAgICAgICAgLm9iamVjdCA9IEJDTU9MVF9PQkpfSURfREVWSUNFLAorICAgICAgICAuc3ViZ3JvdXAgPSBCQ01PTFRfREVWSUNFX0FVVE9fSURfSU1BR0VfVFJBTlNGRVJfQ09NUExFVEUsCisgICAgfTsKKyAgICB1aW50OF90IGluc3Q7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworCisgICAgZm9yIChpbnN0ID0gMDsgKGluc3QgPCBCQ01UUl9NQVhfSU5TVEFOQ0VTKSAmJiAocmMgPT0gQkNNX0VSUl9PSyk7IGluc3QrKykKKyAgICB7CisgICAgICAgIHRwYXJtLmluc3RhbmNlID0gaW5zdDsKKyAgICAgICAgcmMgPSBiY210cl9tc2dfaGFuZGxlcl91bnJlZ2lzdGVyKGRldmljZSwgJnRwYXJtKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogQUNLIHJlc3BvbnNlIHRpbWVvdXQgaGFuZGxlciAqLworc3RhdGljIGJjbW9zX3RpbWVyX3JjIG1mdHBfYWNrX3RpbWVvdXRfaGFuZGxlcihiY21vc190aW1lciAqdGltZXIsIGxvbmcgZGF0YSkKK3sKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlID0gKGJjbW9sdF9kZXZpZClkYXRhOworICAgIG1mdHBfY29udGV4dCAqY29udGV4dCA9IG1mdHBfY29udGV4dF9nZXQoZGV2aWNlKTsKKworICAgIGlmICgoY29udGV4dC0+c3RhdHVzID09IE1GVFBfU1RBVFVTX1dBSVRJTkdfQUNLKSB8fCAoY29udGV4dC0+c3RhdHVzID09IE1GVFBfU1RBVFVTX1dBSVRJTkdfTEFTVF9BQ0spKQorICAgIHsKKyAgICAgICAgbWZ0cF90ZXJtaW5hdGUoZGV2aWNlLCBjb250ZXh0LT5pbWFnZV90eXBlLCBjb250ZXh0LT5ibG9ja19udW0sIEJDTU9MVF9JTUFHRV9UUkFOU0ZFUl9TVEFUVVNfQUNLX1RJTUVPVVQpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBCQ01fTE9HKElORk8sIGNvbnRleHQtPmxvZ19pZCwgInRpbWVyIGluIGlycmVsZXZhbnQgc3RhdGVcbiIpOworICAgIH0KKyAgICByZXR1cm4gQkNNT1NfVElNRVJfU1RPUDsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK3N0YXRpYyBiY21vc19lcnJubyBtZnRwX2luaXRfdGltZXJzKGJjbW9sdF9kZXZpZCBkZXZpY2UpCit7CisgICAgbWZ0cF9jb250ZXh0ICpjb250ZXh0ID0gbWZ0cF9jb250ZXh0X2dldChkZXZpY2UpOworICAgIGJjbW9zX3RpbWVyX3Bhcm0gdGltZXJfcGFyYW1zID0ge307CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworCisgICAgLyogSWYgdGltZXIgd2FzIGFscmVhZHkgY3JlYXRlZCwgdGhlbiB3ZSBkb24ndCBuZWVkIHRvIHJlLWNyZWF0ZSBpdCAqLworICAgIGlmICgoY29udGV4dC0+dGltZXIuZmxhZ3MgJiBCQ01PU19USU1FUl9GTEFHX1ZBTElEKSAhPSAwKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKworICAgIHRpbWVyX3BhcmFtcy5uYW1lICAgICA9IGNvbnRleHQtPm5hbWU7CisgICAgdGltZXJfcGFyYW1zLm93bmVyICAgID0gY29udGV4dC0+bW9kdWxlX2lkOworICAgIHRpbWVyX3BhcmFtcy5wZXJpb2RpYyA9IEJDTU9TX0ZBTFNFOworICAgIHRpbWVyX3BhcmFtcy5oYW5kbGVyICA9IG1mdHBfYWNrX3RpbWVvdXRfaGFuZGxlcjsKKyAgICB0aW1lcl9wYXJhbXMuZGF0YSAgICAgPSAobG9uZylkZXZpY2U7CisKKyAgICByYyA9IGJjbW9zX3RpbWVyX2NyZWF0ZSgmY29udGV4dC0+dGltZXIsICZ0aW1lcl9wYXJhbXMpOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgY29udGV4dC0+bG9nX2lkLCAiVGltZXIgY3JlYXRpb24gZmFpbGVkLiAlc1xuIiwgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworc3RhdGljIGJjbW9zX2Vycm5vIG1mdHBfaW5pdF90YXNrcyhiY21vbHRfZGV2aWQgZGV2aWNlKQoreworICAgIG1mdHBfY29udGV4dCAgICAqY29udGV4dCA9IG1mdHBfY29udGV4dF9nZXQoZGV2aWNlKTsKKyAgICBiY21vc190YXNrX3Bhcm0gIHRhc2tfcGFyYW1zID0ge307CisgICAgYmNtb3NfZXJybm8gICAgICByYyA9IEJDTV9FUlJfT0s7CisKKyAgICB0YXNrX3BhcmFtcy5uYW1lICAgICAgICAgPSBjb250ZXh0LT5uYW1lOworICAgIHRhc2tfcGFyYW1zLnByaW9yaXR5ICAgICA9IFRBU0tfUFJJT1JJVFlfVVNFUl9BUFBMX0lNQUdFX1RSQU5TRkVSOworICAgIHRhc2tfcGFyYW1zLmNvcmUgICAgICAgICA9IEJDTU9TX0NQVV9DT1JFX0FOWTsgLyogTm8gQ1BVIGFmZmluaXR5ICovCisgICAgdGFza19wYXJhbXMuaW5pdF9oYW5kbGVyID0gTlVMTDsKKyAgICB0YXNrX3BhcmFtcy5kYXRhICAgICAgICAgPSAobG9uZylkZXZpY2U7CisKKyAgICByYyA9IGJjbW9zX3Rhc2tfY3JlYXRlKCZjb250ZXh0LT50YXNrLCAmdGFza19wYXJhbXMpOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgY29udGV4dC0+bG9nX2lkLCAiVGFzayBjcmVhdGlvbiBmYWlsZWQuICVzIFxuIiwgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworc3RhdGljIGJjbW9zX2Vycm5vIG1mdHBfaW5pdF9tb2R1bGVzKGJjbW9sdF9kZXZpZCBkZXZpY2UpCit7CisgICAgbWZ0cF9jb250ZXh0ICAgICAgKmNvbnRleHQgPSBtZnRwX2NvbnRleHRfZ2V0KGRldmljZSk7CisgICAgYmNtb3NfbW9kdWxlX3Bhcm0gIG1vZHVsZV9wYXJhbXMgPSB7fTsKKyAgICBiY21vc19lcnJubyAgICAgICAgcmMgPSBCQ01fRVJSX09LOworCisgICAgY29udGV4dC0+bW9kdWxlX2lkID0gbWZ0cF9kZXZpY2VfaWRfdG9fbW9kdWxlX2lkKGRldmljZSk7CisgICAgbW9kdWxlX3BhcmFtcy5xcGFybS5uYW1lID0gY29udGV4dC0+bmFtZTsKKyAgICBtb2R1bGVfcGFyYW1zLnFwYXJtLnNpemUgPSBCQ01PU19NU0dfUE9PTF9ERUZBVUxUX1NJWkU7CisgICAgbW9kdWxlX3BhcmFtcy5pbml0ICAgICAgID0gTlVMTDsKKworICAgIHJjID0gYmNtb3NfbW9kdWxlX2NyZWF0ZShjb250ZXh0LT5tb2R1bGVfaWQsICZjb250ZXh0LT50YXNrLCAmbW9kdWxlX3BhcmFtcyk7CisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBjb250ZXh0LT5sb2dfaWQsICJNb2R1bGUgY3JlYXRpb24gZmFpbGVkLiAlcyBcbiIsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qIEluaXRpYWxpemVzIHRoZSBNRlRQIHBhcmFtZXRlcnMuICovCit2b2lkIGJjbW9sdF91c2VyX21mdHBfaW5pdCh2b2lkKQoreworICAgIG1mdHBfY29udGV4dCAqY29udGV4dDsKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlOworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIC8qIFRoZSBjdXN0b21lciBzaG91bGQgcHJvdmlkZSB0aGVzZSBjYWxsYmFjayBmdW5jdGlvbnMuICovCisgICAgbWZ0cF9yZWFkX2RhdGFfY2IgPSBiY211c2VyX2ltYWdlX3RyYW5zZmVyX3JlYWRfZGF0YTsKKyAgICBtZnRwX25vdGlmeV91c2VyX2NiID0gYmNtdXNlcl9pbWFnZV90cmFuc2Zlcl9ub3RpZmljYXRpb25fcng7CisgICAgbWZ0cF9ibG9ja19zaXplX2dldCA9IGJjbXVzZXJfaW1hZ2VfdHJhbnNmZXJfYmxvY2tfc2l6ZV9nZXQ7CisgICAgbWZ0cF9jcmNfZ2V0X2NiID0gYmNtdXNlcl9pbWFnZV90cmFuc2Zlcl9jcmNfZ2V0OworCisgICAgLyogaW5pdGlhbGl6ZSBzb21lIHBhcmFtZXRlcnMsIGkuZS4gdGhlIC5zdGF0dXMgYW5kIC50aW1lci4KKyAgICAgICBvdGhlciBwYXJhbWV0ZXJzIGFyZSAocmUpYnVpbHQgdXBvbiBTVEFSVCwgc28gbm8gbmVlZCB0byBpbml0LiAqLworICAgIGZvciAoZGV2aWNlID0gMDsgKGRldmljZSA8IEJDTVRSX01BWF9PTFRTKSAmJiAocmMgPT0gQkNNX0VSUl9PSyk7IGRldmljZSsrKQorICAgIHsKKyAgICAgICAgY29udGV4dCA9IG1mdHBfY29udGV4dF9nZXQoZGV2aWNlKTsKKyAgICAgICAgY29udGV4dC0+c3RhdHVzID0gTUZUUF9TVEFUVVNfRElTQUJMRUQ7CisgICAgICAgIGNvbnRleHQtPmJsb2NrX3NpemUgPSBtZnRwX2Jsb2NrX3NpemVfZ2V0KCk7CisgICAgICAgIGNvbnRleHQtPmJ1ZiA9IGJjbW9zX2NhbGxvYyhjb250ZXh0LT5ibG9ja19zaXplKTsKKyAgICAgICAgcmMgPSAoY29udGV4dC0+YnVmID09IE5VTEwpID8gQkNNX0VSUl9OT01FTSA6IHJjOworICAgICAgICBzbnByaW50Zihjb250ZXh0LT5uYW1lLCBzaXplb2YoY29udGV4dC0+bmFtZSksICJtZnRwJXUiLCBkZXZpY2UpOworICAgICAgICByYyA9IChyYyA9PSBCQ01fRVJSX09LKSA/IG1mdHBfaW5pdF90YXNrcyhkZXZpY2UpIDogcmM7CisgICAgICAgIHJjID0gKHJjID09IEJDTV9FUlJfT0spID8gbWZ0cF9pbml0X21vZHVsZXMoZGV2aWNlKSA6IHJjOworICAgICAgICByYyA9IChyYyA9PSBCQ01fRVJSX09LKSA/IG1mdHBfaW5pdF90aW1lcnMoZGV2aWNlKSA6IHJjOworICAgICAgICBjb250ZXh0LT5sb2dfaWQgPSBiY21fZGV2X2xvZ19pZF9yZWdpc3Rlcihjb250ZXh0LT5uYW1lLCBERVZfTE9HX0xFVkVMX0lORk8sIERFVl9MT0dfSURfVFlQRV9CT1RIKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvaW1hZ2VfdHJhbnNmZXIvYmNtb2x0X2ltYWdlX3RyYW5zZmVyLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2ltYWdlX3RyYW5zZmVyL2JjbW9sdF9pbWFnZV90cmFuc2Zlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZmVhM2MKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2ltYWdlX3RyYW5zZmVyL2JjbW9sdF9pbWFnZV90cmFuc2Zlci5oCkBAIC0wLDAgKzEsODYgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTQ6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQ29weXJpZ2h0IChjKSAyMDE0IEJyb2FkY29tIENvcnBvcmF0aW9uCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBfQkNNT0xUX0lNQUdFX1RSQU5TRkVSX0hfCisjZGVmaW5lIF9CQ01PTFRfSU1BR0VfVFJBTlNGRVJfSF8KKworI2luY2x1ZGUgPGJjbW9sdF9tb2RlbF90eXBlcy5oPgorI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorCisvKiBSZXR1cm5zIGEgZGF0YSBibG9jayBvZiBnaXZlbiBzaXplIG9mIGdpdmVuIGltYWdlIHR5cGUgYXQgZ2l2ZW4gb2Zmc2V0LiAqLwordHlwZWRlZiBpbnQgKCpiY211c2VyX21mdHBfaW1hZ2VfcmVhZCkoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X2RldmljZV9pbWFnZV90eXBlIGltYWdlX3R5cGUsCisgICAgdWludDMyX3Qgb2Zmc2V0LCB1aW50OF90ICpidWYsIHVpbnQzMl90IGJ1Zl9zaXplKTsKKworLyogUmV0dXJucyB0aGUgc2l6ZSBvZiBkYXRhIGJsb2NrIHdoaWNoIGlzIHVzZWQgZm9yIHRoZSBkYXRhIHRyYW5zZmVyLiAqLwordHlwZWRlZiB1aW50MzJfdCAoKmJjbXVzZXJfbWZ0cF9ibG9ja19zaXplX2dldCkodm9pZCk7CisKKy8qIFJldHVybnMgdGhlIENSQzMyIGNoZWNrc3VtIG9mIGVudGlyZSBpbWFnZS4gKi8KK3R5cGVkZWYgdWludDMyX3QgKCpiY211c2VyX21mdHBfY3JjX2dldCkoYmNtb2x0X2RldmlkIGRldmljZSwKKyAgICBiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgaW1hZ2VfdHlwZSk7CisKKy8qIENhbGxiYWNrIHRvIG5vdGlmeSB0aGUgdXNlciBvZiB0aGUgY29tcGxldGlvbiBvZiB0aGUgaW1hZ2UgdHJhbnNmZXIuICovCit0eXBlZGVmIHZvaWQgKCpiY211c2VyX21mdHBfbm90aWZpY2F0aW9uX3J4KShiY21vbHRfZGV2aWQgZGV2aWNlLAorICAgIGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHlwZSBpbWFnZV90eXBlLCB1aW50MzJfdCBibG9ja19udW0sIGJjbW9sdF9pbWFnZV90cmFuc2Zlcl9zdGF0dXMgc3RhdHVzKTsKKwordHlwZWRlZiBlbnVtCit7CisgICAgTUZUUF9TVEFUVVNfRElTQUJMRUQsCisgICAgTUZUUF9TVEFUVVNfV0FJVElOR19BQ0ssCisgICAgTUZUUF9TVEFUVVNfV0FJVElOR19MQVNUX0FDSworfSBtZnRwX3N0YXR1czsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvKiBydW50aW1lIHBhcmFtZXRlcnMgKi8KKyAgICBtZnRwX3N0YXR1cyBzdGF0dXM7CisgICAgdWludDMyX3QgYmxvY2tfbnVtOyAgICAgLyogYmxvY2sgbnVtYmVyIHNlbnQuICovCisgICAgYmNtb2x0X2RldmljZV9pbWFnZV90eXBlIGltYWdlX3R5cGU7CisKKyAgICAvKiBpbml0LXRpbWUgcGFyYW1ldGVycyAqLworICAgIHVpbnQzMl90IGJsb2NrX3NpemU7CisgICAgdWludDhfdCAqYnVmOworICAgIGNoYXIgbmFtZVtNQVhfVElNRVJfTkFNRV9TSVpFXTsKKyAgICBiY21vc190YXNrIHRhc2s7CisgICAgYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZDsKKyAgICBiY21vc190aW1lciB0aW1lcjsKKyAgICBkZXZfbG9nX2lkIGxvZ19pZDsKK30gbWZ0cF9jb250ZXh0OworCisKK2NvbnN0IGNoYXIgKmJjbW9sdF91c2VyX21mdHBfc3RhdHVzX3RvX3N0cihiY21vbHRfaW1hZ2VfdHJhbnNmZXJfc3RhdHVzIHN0YXR1cyk7CisKKy8qKiBoYW5kbGVyIGZvciB0aGUgT1BFUkFUSU9OIGRldmljZS5pbWFnZV90cmFuc2Zlcl9zdGFydC4gKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF91c2VyX21mdHBfc3RhcnQoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X2RldmljZV9pbWFnZV90eXBlIGltYWdlX3R5cGUpOworCisvKiogSW5pdGlhbGl6ZXMgdGhlIE1GVFAgcGFyYW1ldGVycy4gKi8KK3ZvaWQgYmNtb2x0X3VzZXJfbWZ0cF9pbml0KHZvaWQpOworCisjZW5kaWYKKworCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2ltYWdlX3RyYW5zZmVyL2JjbW9sdF9pbWFnZV90cmFuc2Zlcl9jbGkuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvaW1hZ2VfdHJhbnNmZXIvYmNtb2x0X2ltYWdlX3RyYW5zZmVyX2NsaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyOTI0M2EKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2ltYWdlX3RyYW5zZmVyL2JjbW9sdF9pbWFnZV90cmFuc2Zlcl9jbGkuYwpAQCAtMCwwICsxLDg3IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE0OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIENvcHlyaWdodCAoYykgMjAxNCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorKi8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbWNsaS5oPgorI2luY2x1ZGUgPGJjbW9sdF9tb2RlbF90eXBlcy5oPgorI2luY2x1ZGUgPGJjbW9sdF9tc2cuaD4KKyNpbmNsdWRlIDxiY21vbHRfYXBpLmg+CisjaW5jbHVkZSA8YmNtX2FwaV9jbGlfaGVscGVycy5oPgorI2luY2x1ZGUgImJjbW9sdF9pbWFnZV90cmFuc2Zlci5oIgorI2luY2x1ZGUgImJjbW9sdF9pbWFnZV90cmFuc2Zlcl9jbGkuaCIKKworc3RhdGljIGJjbW9zX2Jvb2wgYmNtb2x0X3VzZXJfYXBwbF9kZXZpY2Vfc3RhdGVfaXNfcmVhZHkoYmNtb2x0X2RldmlkIGRldmljZSkKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2RldmljZV9jZmcgY2ZnID0ge307CisgICAgYmNtb2x0X2RldmljZV9rZXkga2V5ID0ge307CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZGV2aWNlLCBrZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9HRVQoJmNmZywgZGV2aWNlLCBzdGF0ZSk7CisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlLCAmY2ZnLmhkcik7CisgICAgcmV0dXJuIChlcnIgPT0gQkNNX0VSUl9PSykgJiYgKGNmZy5kYXRhLnN0YXRlID09IEJDTU9MVF9ERVZJQ0VfU1RBVEVfUkVBRFkpOworfQorCisvKiogc3RhcnQgdGhlIGltYWdlIHRyYW5zZmVyLgorICovCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X3VzZXJfYXBwbF9jbGlfaW1hZ2VfdHJhbnNmZXJfc3RhcnQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sCisgICAgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1zW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgYmNtb2x0X2RldmljZV9pbWFnZV90eXBlIGltYWdlX3R5cGU7CisgICAgYmNtb2x0X2RldmlkIGRldmljZSA9IDA7CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgaWYgKCFiY21vbHRfdXNlcl9hcHBsX2RldmljZV9zdGF0ZV9pc19yZWFkeShkZXZpY2UpKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgImRldmljZSBub3QgY29ubmVjdGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9UX0NPTk5FQ1RFRDsKKyAgICB9CisKKyAgICBpbWFnZV90eXBlID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiaW1hZ2VfdHlwZSIpLT52YWx1ZS51bnVtYmVyOworCisgICAgZXJyID0gYmNtb2x0X3VzZXJfbWZ0cF9zdGFydChkZXZpY2UsIGltYWdlX3R5cGUpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICIlc1xuIiwgYmNtb3Nfc3RyZXJyb3IoZXJyKSk7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK2JjbW9zX2Vycm5vIGJjbW9sdF91c2VyX2FwcGxfY2xpX2ltYWdlX3RyYW5zZmVyX2luaXQoYmNtY2xpX2VudHJ5ICp0b3BfZGlyKQoreworICAgIGJjbWNsaV9lbnRyeSAqZGlyID0gYmNtY2xpX2Rpcl9hZGQodG9wX2RpciwgImltYWdlX3RyYW5zZmVyIiwKKyAgICAgICAgIkltYWdlIFRyYW5zZmVyIHVzZXIgYXBwbGljYXRpb24iLCBCQ01DTElfQUNDRVNTX0FETUlOLCBOVUxMKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoIWRpciwgQkNNX0VSUl9OT01FTSk7CisKKyAgICBCQ01DTElfTUFLRV9DTUQoZGlyLCAic3RhcnQiLCAiU3RhcnQgSW1hZ2UgVHJhbnNmZXIgYXBwbGljYXRpb24iLCBiY21vbHRfdXNlcl9hcHBsX2NsaV9pbWFnZV90cmFuc2Zlcl9zdGFydCwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNKCJpbWFnZV90eXBlIiwgIkltYWdlIHR5cGUiLCBiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGVfc3RyaW5nX3RhYmxlLCBCQ01DTElfUEFSTV9GTEFHX05PTkUpKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2ltYWdlX3RyYW5zZmVyL2JjbW9sdF9pbWFnZV90cmFuc2Zlcl9jbGkuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvaW1hZ2VfdHJhbnNmZXIvYmNtb2x0X2ltYWdlX3RyYW5zZmVyX2NsaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2OWY2ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2ltYWdlX3RyYW5zZmVyL2JjbW9sdF9pbWFnZV90cmFuc2Zlcl9jbGkuaApAQCAtMCwwICsxLDM4IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE0OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIENvcHlyaWdodCAoYykgMjAxNCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorKi8KKworI2lmbmRlZiBfQkNNT0xUX0lNQUdFX1RSQU5TRkVSX0NMSV9IXworI2RlZmluZSBfQkNNT0xUX0lNQUdFX1RSQU5TRkVSX0NMSV9IXworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtY2xpLmg+CisKK2JjbW9zX2Vycm5vIGJjbW9sdF91c2VyX2FwcGxfY2xpX2ltYWdlX3RyYW5zZmVyX2luaXQoYmNtY2xpX2VudHJ5ICp0b3BfZGlyKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2ltYWdlX3RyYW5zZmVyL2JjbW9sdF9pbWFnZV90cmFuc2Zlcl91c2VyLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2ltYWdlX3RyYW5zZmVyL2JjbW9sdF9pbWFnZV90cmFuc2Zlcl91c2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYwZmM4MwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvaW1hZ2VfdHJhbnNmZXIvYmNtb2x0X2ltYWdlX3RyYW5zZmVyX3VzZXIuYwpAQCAtMCwwICsxLDIxMiBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNDpEVUFML0dQTDpzdGFuZGFyZAorCisgICBDb3B5cmlnaHQgKGMpIDIwMTQgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGlzIGNvbnRhaW5zIHRoZSBjdXN0b21lci1wcm92aWRlZCBjb2RlLgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIGFzIGFuIGV4YW1wbGUuCisgKiBUaGUgY3VzdG9tZXIgbWF5IGNoYW5nZSB0aGUgZmlsZSBwYXRoL25hbWVzLgorICogVGhlIGN1c3RvbWVyIG1heSBjaGFuZ2UgdGhlIGZpbGUgYWNjZXNzIGZ1bmN0aW9ucy4KKyAqIFRoZSBjdXN0b21lciBtYXkgYWRqdXN0IHRoZSBkYXRhIGJsb2NrIHNpemUuCisgKiBBZGRpbmcgYSBuZXcgaW1hZ2UgdHlwZSByZXF1aXJlcyB0aGUgb2JqZWN0IG1vZGVsIGNoYW5nZSBhbmQgc3luYyB1cCB3aXRoCisgKiB0aGUgZW1iZWRkZWQgc2l6ZSwgd2hpY2ggc2hvdWxkIGJlIGRvbmUgYnkgdGhlIEJyb2FkY29tIGVuZ2luZWVyaW5nLgorICovCisKKyNpbmNsdWRlIDxiY21vbHRfY29udi5oPgorI2luY2x1ZGUgImJjbW9sdF9pbWFnZV90cmFuc2Zlci5oIgorI2luY2x1ZGUgImJjbW9sdF9pbWFnZV90cmFuc2Zlcl91c2VyLmgiCisjaW5jbHVkZSAiYmNtb2x0X3V0aWxzLmgiCisKKy8qIGV4YW1wbGUgbmFtZXMgZm9yIGRlYnVnZ2luZyBwdXJwb3NlIG9ubHkgKi8KKyNkZWZpbmUgQk9PVF9GSUxFICIvb3B0L2JjbTY4NjIwL2JjbTY4NjIwX2Jvb3QuYmluIgorI2RlZmluZSBBUFBMX0ZJTEUgIi9vcHQvYmNtNjg2MjAvYmNtNjg2MjBfYXBwbC5iaW4iCisjZGVmaW5lIElUVV9QT05fT05VX0ZXX0ZJTEUgIi9vcHQvYmNtNjg2MjAvZ3Bvbl9vbnVfZncudyIKKyNkZWZpbmUgRVBPTl9PTlVfRldfRklMRSAiL29wdC9iY202ODYyMC9lcG9uX29udV9mdy50a2YiCisKK3N0YXRpYyBpbnQyc3RyX3QgaW1hZ2VfdHlwZTJzdHJbXSA9Cit7CisgICAge0JDTU9MVF9ERVZJQ0VfSU1BR0VfVFlQRV9CT09UTE9BREVSLCBCT09UX0ZJTEV9LAorICAgIHtCQ01PTFRfREVWSUNFX0lNQUdFX1RZUEVfQVBQTElDQVRJT04sIEFQUExfRklMRX0sCisgICAge0JDTU9MVF9ERVZJQ0VfSU1BR0VfVFlQRV9JVFVfUE9OX09OVV9GSVJNV0FSRSwgSVRVX1BPTl9PTlVfRldfRklMRX0sCisgICAge0JDTU9MVF9ERVZJQ0VfSU1BR0VfVFlQRV9FUE9OX09OVV9GSVJNV0FSRSwgRVBPTl9PTlVfRldfRklMRX0sCisgICAgey0xfQorfTsKKworLyoqIEdldCB0aGUgZGV2aWNlIGZpbGUgbmFtZS4KKyAqIAorICogXHBhcmFtW2luXSAgIGltYWdlX3R5cGUgICAgICBJbWFnZSB0eXBlLiBkZWZpbmVkIGluIHRoZSBvYmplY3QgbW9kZWwuCisgKiAKKyAqIFxyZXR1cm4gICAgICBzdHJpbmcgICAgICAgICAgUG9pbnRlciB0byBkZXZpY2UgaW1hZ2UgbmFtZSwgaW5jbHVkaW5nIHRoZSBwYXRoLgorICovCitjb25zdCBjaGFyICpiY211c2VyX2RldmljZV9pbWFnZV9uYW1lX2dldChiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgaW1hZ2VfdHlwZSkKK3sKKyAgICBpZiAoaW1hZ2VfdHlwZSA8IEJDTU9MVF9ERVZJQ0VfSU1BR0VfVFlQRV9fTlVNX09GKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGludDJzdHIoaW1hZ2VfdHlwZTJzdHIsIGltYWdlX3R5cGUpOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoqIE9wZW4gYSBmaWxlIHdpdGggZ2l2ZW4gaW1hZ2UgdHlwZS4KKyAqCisgKiBccGFyYW1baW5dICAgaW1hZ2VfdHlwZSAgICAgIEltYWdlIHR5cGUuIGRlZmluZWQgaW4gdGhlIG9iamVjdCBtb2RlbC4KKyAqIFxwYXJhbVtvdXRdICBmcHAgICAgICAgICAgICAgRmlsZSBwb2ludGVyCisgKgorICogXHJldHVybiAgICAgIGJjbW9zX2Vycm5vICAgICBFcnJvciBjb2RlCisgKi8KK3N0YXRpYyBiY21vc19lcnJubyBiY211c2VyX2ltYWdlX3RyYW5zZmVyX2ZpbGVfb3BlbihiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgaW1hZ2VfdHlwZSwgRklMRSAqKmZwcCkKK3sKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfUEFSTTsKKworICAgIGlmIChpbWFnZV90eXBlIDwgQkNNT0xUX0RFVklDRV9JTUFHRV9UWVBFX19OVU1fT0YpCisgICAgeworICAgICAgICBGSUxFICpmcDsKKyAgICAgICAgY29uc3QgY2hhciAqZm5hbWUgPSBiY211c2VyX2RldmljZV9pbWFnZV9uYW1lX2dldChpbWFnZV90eXBlKTsKKyAgICAgICAgZnAgPSBmb3BlbihmbmFtZSwgInJiIik7CisgICAgICAgIGlmIChmcCAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICAqZnBwID0gZnA7CisgICAgICAgICAgICByYyA9IEJDTV9FUlJfT0s7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKiogR2V0IHRoZSBzaXplIG9mIHRoZSBmaWxlLiAKKyAqIAorICogXHBhcmFtW2luXSAgIGRldmljZSAgICAgICAgICBEZXZpY2UgSUQKKyAqIFxwYXJhbVtpbl0gICBpbWFnZV90eXBlICAgICAgSW1hZ2UgdHlwZS4gZGVmaW5lZCBpbiB0aGUgb2JqZWN0IG1vZGVsLgorICogXHBhcmFtW291dF0gIGZzaXplICAgICAgICAgICBGaWxlIHNpemUKKyAqIAorICogXHJldHVybiAgICAgIGJjbW9zX2Vycm5vIAorICovCitiY21vc19lcnJubyBiY211c2VyX2ltYWdlX3RyYW5zZmVyX2ZpbGVfc2l6ZV9nZXQoYmNtb2x0X2RldmlkIGRldmljZSwKKyAgICBiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgaW1hZ2VfdHlwZSwgdWludDMyX3QgKmZzaXplKQoreworICAgIEZJTEUgKmZwOworICAgIGxvbmcgZnBfcHJldjsKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgKHZvaWQpZGV2aWNlOworCisgICAgcmMgPSBiY211c2VyX2ltYWdlX3RyYW5zZmVyX2ZpbGVfb3BlbihpbWFnZV90eXBlLCAmZnApOworICAgIGlmIChyYyA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgZnBfcHJldiA9IGZ0ZWxsKGZwKTsKKyAgICAgICAgQlVHX09OKGZwX3ByZXYgPCAwKTsKKyAgICAgICAgQlVHX09OKGZzZWVrKGZwLCAwLCBTRUVLX0VORCkgIT0gMCk7CisgICAgICAgICpmc2l6ZSA9IGZ0ZWxsKGZwKTsKKyAgICAgICAgQlVHX09OKGZzZWVrKGZwLCBmcF9wcmV2LCBTRUVLX1NFVCkgIT0gMCk7IC8qIGdvIGJhY2sgdG8gd2hlcmUgd2Ugd2VyZS4gKi8KKyAgICAgICAgQlVHX09OKGZjbG9zZShmcCkgIT0gMCk7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyoqIFJlYWQgZGF0YSBmcm9tIGdpdmVuIG9mZnNldC4KKyAqCisgKiBccGFyYW1baW5dICAgZGV2aWNlICAgICAgICAgIERldmljZSBJRAorICogXHBhcmFtW2luXSAgIGltYWdlX3R5cGUgICAgICBJbWFnZSB0eXBlLiBkZWZpbmVkIGluIHRoZSBvYmplY3QgbW9kZWwuCisgKiBccGFyYW1baW5dICAgb2Zmc2V0ICAgICAgICAgIEZpbGUgcG9zaXRpb24gaW5kaWNhdG9yCisgKiBccGFyYW1bb3V0XSAgYnVmICAgICAgICAgICAgIEJ1ZmZlciB0byBzdG9yZSB0aGUgZGF0YQorICogXHBhcmFtW2luXSAgIGJ1Zl9zaXplICAgICAgICBCdWZmZXIgc2l6ZQorICoKKyAqIFxyZXR1cm4gICAgICBCeXRlcyByZWFkCisgKi8KK2ludCBiY211c2VyX2ltYWdlX3RyYW5zZmVyX3JlYWRfZGF0YShiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgaW1hZ2VfdHlwZSwKKyAgICB1aW50MzJfdCBvZmZzZXQsIHVpbnQ4X3QgKmJ1ZiwgdWludDMyX3QgYnVmX3NpemUpCit7CisgICAgRklMRSAqZnA7CisgICAgdWludDMyX3QgYnl0ZXNfcmVhZCA9IDA7CisgICAgKHZvaWQpZGV2aWNlOworCisgICAgaWYgKGJjbXVzZXJfaW1hZ2VfdHJhbnNmZXJfZmlsZV9vcGVuKGltYWdlX3R5cGUsICZmcCkgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIEJVR19PTihmc2VlayhmcCwgMCwgU0VFS19FTkQpICE9IDApOworICAgICAgICBpZiAob2Zmc2V0IDwgZnRlbGwoZnApKQorICAgICAgICB7CisgICAgICAgICAgICBCVUdfT04oZnNlZWsoZnAsIG9mZnNldCwgU0VFS19TRVQpICE9IDApOworICAgICAgICAgICAgYnl0ZXNfcmVhZCA9IGZyZWFkKGJ1ZiwgMSwgYnVmX3NpemUsIGZwKTsKKyAgICAgICAgfQorICAgICAgICBCVUdfT04oZmNsb3NlKGZwKSAhPSAwKTsKKyAgICB9CisgICAgcmV0dXJuIGJ5dGVzX3JlYWQ7Cit9CisKKy8qKiBHZXQgdGhlIHVuaXQgc2l6ZSBvZiB0aGUgdHJhbnNmZXIgZGF0YSBibG9jay4KKyAqCisgKiBccmV0dXJuICAgICAgU2l6ZSBvZiB0aGUgYmxvY2sgaW4gYnl0ZXMuCisgKi8KK3VpbnQzMl90IGJjbXVzZXJfaW1hZ2VfdHJhbnNmZXJfYmxvY2tfc2l6ZV9nZXQodm9pZCkKK3sKKyAgICByZXR1cm4gTUZUUF9EQVRBX0JMT0NLX1NJWkU7Cit9CisKKy8qKiBSZXR1cm5zIHRoZSBDUkMzMiBjaGVja3N1bSBvZiBlbnRpcmUgaW1hZ2UuCisgKiAKKyAqIFxwYXJhbVtpbl0gICBkZXZpY2UgICAgICAgICAgRGV2aWNlIElECisgKiBccGFyYW1baW5dICAgaW1hZ2VfdHlwZSAgICAgIEltYWdlIHR5cGUuIGRlZmluZWQgaW4gdGhlIG9iamVjdCBtb2RlbC4KKyAqIAorICogXHJldHVybiAgICAgIENSQzMyIGNoZWNrc3VtIAorICovCit1aW50MzJfdCBiY211c2VyX2ltYWdlX3RyYW5zZmVyX2NyY19nZXQoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X2RldmljZV9pbWFnZV90eXBlIGltYWdlX3R5cGUpCit7CisgICAgRklMRSAqZnA7CisgICAgdWludDMyX3QgY3JjID0gMDsKKyAgICAodm9pZClkZXZpY2U7CisKKyAgICBpZiAoYmNtdXNlcl9pbWFnZV90cmFuc2Zlcl9maWxlX29wZW4oaW1hZ2VfdHlwZSwgJmZwKSA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgd2hpbGUgKDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgYnVmWzUxMl07IC8qIGFueSBzaXplIGlzIE9LLiAqLworICAgICAgICAgICAgdWludDMyX3QgYnl0ZXNfcmVhZDsKKworICAgICAgICAgICAgYnl0ZXNfcmVhZCA9IGZyZWFkKGJ1ZiwgMSwgc2l6ZW9mKGJ1ZiksIGZwKTsKKyAgICAgICAgICAgIGlmIChieXRlc19yZWFkID09IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjcmMgPSBldGhfY2FsY19jcmMzMihjcmMsIGJ1ZiwgYnl0ZXNfcmVhZCk7CisgICAgICAgIH0KKyAgICAgICAgQlVHX09OKGZjbG9zZShmcCkgIT0gMCk7CisgICAgfQorICAgIHJldHVybiBjcmM7Cit9CisKKy8qKiBQcm9jZXNzIHRoZSBub3RpZmljYXRpb24gZnJvbSB0aGUgaW1hZ2UgdHJhbnNmZXIgbW9kdWxlLgorICoKKyAqIFxwYXJhbVtpbl0gICBkZXZpY2UgICAgICAgICAgRGV2aWNlIElECisgKiBccGFyYW1baW5dICAgaW1hZ2VfdHlwZSAgICAgIEltYWdlIHR5cGUuIGRlZmluZWQgaW4gdGhlIG9iamVjdCBtb2RlbC4gCisgKiBccGFyYW1baW5dICAgYmxvY2tfbnVtICAgICAgIGxhc3QgYmxvY2sgbnVtYmVyIAorICogXHBhcmFtW2luXSAgIHN0YXR1cyAgICAgICAgICBJbWFnZSB0cmFuc2ZlciBzdGF0dXMgCisgKi8KK3ZvaWQgYmNtdXNlcl9pbWFnZV90cmFuc2Zlcl9ub3RpZmljYXRpb25fcngoYmNtb2x0X2RldmlkIGRldmljZSwKKyAgICBiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgaW1hZ2VfdHlwZSwgdWludDMyX3QgYmxvY2tfbnVtLAorICAgIGJjbW9sdF9pbWFnZV90cmFuc2Zlcl9zdGF0dXMgc3RhdHVzKQoreworICAgIGNvbnN0IGNoYXIgKnN0ciA9IGJjbW9sdF91c2VyX21mdHBfc3RhdHVzX3RvX3N0cihzdGF0dXMpOworICAgIGJjbW9zX3ByaW50ZigiSW1hZ2UgdHJhbnNmZXI6ICVzOiB0eXBlPSV1IGJsb2NrPSV1XG4iLCBzdHIsIGltYWdlX3R5cGUsIGJsb2NrX251bSk7Cit9CisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvaW1hZ2VfdHJhbnNmZXIvYmNtb2x0X2ltYWdlX3RyYW5zZmVyX3VzZXIuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvaW1hZ2VfdHJhbnNmZXIvYmNtb2x0X2ltYWdlX3RyYW5zZmVyX3VzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTAzNjZiCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9pbWFnZV90cmFuc2Zlci9iY21vbHRfaW1hZ2VfdHJhbnNmZXJfdXNlci5oCkBAIC0wLDAgKzEsMTAwIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE0OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIENvcHlyaWdodCAoYykgMjAxNCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorICovCisKKyNpZm5kZWYgX0JDTU9MVF9JTUFHRV9UUkFOU0ZFUl9VU0VSX0hfCisjZGVmaW5lIF9CQ01PTFRfSU1BR0VfVFJBTlNGRVJfVVNFUl9IXworCisjaW5jbHVkZSA8YmNtb2x0X21vZGVsX3R5cGVzLmg+CisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisKKyNkZWZpbmUgTUZUUF9EQVRBX0JMT0NLX1NJWkUgIDUxMgorCisjZGVmaW5lIE1GVFBfQUNLX1RJTUVPVVRfVVMgICAoMiAqIDEwMDAwMDApCisKKyNkZWZpbmUgTUZUUF9NQVhfUEFUSF9OQU1FX0xFTiAgMjU2CisKKy8qKiBHZXQgdGhlIGRldmljZSBmaWxlIG5hbWUuCisgKiAKKyAqIFxwYXJhbVtpbl0gICBpbWFnZV90eXBlICAgICAgSW1hZ2UgdHlwZS4gZGVmaW5lZCBpbiB0aGUgb2JqZWN0IG1vZGVsLgorICogCisgKiBccmV0dXJuICAgICAgc3RyaW5nICAgICAgICAgIERldmljZSBpbWFnZSBuYW1lLCBpbmNsdWRpbmcgdGhlIHBhdGguCisgKi8KK2NvbnN0IGNoYXIgKmJjbXVzZXJfZGV2aWNlX2ltYWdlX25hbWVfZ2V0KGJjbW9sdF9kZXZpY2VfaW1hZ2VfdHlwZSBpbWFnZV90eXBlKTsKKworLyoqIEdldCB0aGUgc2l6ZSBvZiB0aGUgZmlsZS4gCisgKiAKKyAqIFxwYXJhbVtpbl0gICBkZXZpY2UgICAgICAgICAgRGV2aWNlIElECisgKiBccGFyYW1baW5dICAgaW1hZ2VfdHlwZSAgICAgIEltYWdlIHR5cGUuIGRlZmluZWQgaW4gdGhlIG9iamVjdCBtb2RlbC4KKyAqIFxwYXJhbVtvdXRdICBmc2l6ZSAgICAgICAgICAgRmlsZSBzaXplCisgKiAKKyAqIFxyZXR1cm4gICAgICBiY21vc19lcnJubyAKKyAqLworYmNtb3NfZXJybm8gYmNtdXNlcl9pbWFnZV90cmFuc2Zlcl9maWxlX3NpemVfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2UsCisgICAgYmNtb2x0X2RldmljZV9pbWFnZV90eXBlIGltYWdlX3R5cGUsIHVpbnQzMl90ICpmc2l6ZSk7CisKKy8qKiBSZWFkIGRhdGEgZnJvbSBnaXZlbiBvZmZzZXQuCisgKgorICogXHBhcmFtW2luXSAgIGRldmljZSAgICAgICAgICBEZXZpY2UgSUQKKyAqIFxwYXJhbVtpbl0gICBpbWFnZV90eXBlICAgICAgSW1hZ2UgdHlwZS4gZGVmaW5lZCBpbiB0aGUgb2JqZWN0IG1vZGVsLgorICogXHBhcmFtW2luXSAgIG9mZnNldCAgICAgICAgICBGaWxlIHBvc2l0aW9uIGluZGljYXRvcgorICogXHBhcmFtW291dF0gIGJ1ZiAgICAgICAgICAgICBCdWZmZXIgdG8gc3RvcmUgdGhlIGRhdGEKKyAqIFxwYXJhbVtpbl0gICBidWZfc2l6ZSAgICAgICAgQnVmZmVyIHNpemUKKyAqCisgKiBccmV0dXJuICAgICAgQnl0ZXMgcmVhZAorICovCitpbnQgYmNtdXNlcl9pbWFnZV90cmFuc2Zlcl9yZWFkX2RhdGEoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X2RldmljZV9pbWFnZV90eXBlIGltYWdlX3R5cGUsCisgICAgdWludDMyX3Qgb2Zmc2V0LCB1aW50OF90ICpidWYsIHVpbnQzMl90IGJ1Zl9zaXplKTsKKworLyoqIEdldCB0aGUgdW5pdCBzaXplIG9mIHRoZSB0cmFuc2ZlciBkYXRhIGJsb2NrLgorICoKKyAqIFxyZXR1cm4gICAgICBTaXplIG9mIHRoZSBibG9jayBpbiBieXRlcy4KKyAqLwordWludDMyX3QgYmNtdXNlcl9pbWFnZV90cmFuc2Zlcl9ibG9ja19zaXplX2dldCh2b2lkKTsKKworLyoqIFJldHVybnMgdGhlIENSQzMyIGNoZWNrc3VtIG9mIGVudGlyZSBpbWFnZS4KKyAqIAorICogXHBhcmFtW2luXSAgIGRldmljZSAgICAgICAgICBEZXZpY2UgSUQKKyAqIFxwYXJhbVtpbl0gICBpbWFnZV90eXBlICAgICAgSW1hZ2UgdHlwZS4gZGVmaW5lZCBpbiB0aGUgb2JqZWN0IG1vZGVsLgorICogCisgKiBccmV0dXJuICAgICAgQ1JDMzIgY2hlY2tzdW0gCisgKi8KK3VpbnQzMl90IGJjbXVzZXJfaW1hZ2VfdHJhbnNmZXJfY3JjX2dldChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgaW1hZ2VfdHlwZSk7CisKKy8qKiBQcm9jZXNzIHRoZSBub3RpZmljYXRpb24gZnJvbSB0aGUgaW1hZ2UgdHJhbnNmZXIgbW9kdWxlLgorICoKKyAqIFxwYXJhbVtpbl0gICBkZXZpY2UgICAgICAgICAgRGV2aWNlIElECisgKiBccGFyYW1baW5dICAgaW1hZ2VfdHlwZSAgICAgIEltYWdlIHR5cGUuIGRlZmluZWQgaW4gdGhlIG9iamVjdCBtb2RlbC4gCisgKiBccGFyYW1baW5dICAgYmxvY2tfbnVtICAgICAgIGxhc3QgYmxvY2sgbnVtYmVyIAorICogXHBhcmFtW2luXSAgIHN0YXR1cyAgICAgICAgICBJbWFnZSB0cmFuc2ZlciBzdGF0dXMgCisgKi8KK3ZvaWQgYmNtdXNlcl9pbWFnZV90cmFuc2Zlcl9ub3RpZmljYXRpb25fcngoYmNtb2x0X2RldmlkIGRldmljZSwKKyAgICBiY21vbHRfZGV2aWNlX2ltYWdlX3R5cGUgaW1hZ2VfdHlwZSwgdWludDMyX3QgYmxvY2tfbnVtLCBiY21vbHRfaW1hZ2VfdHJhbnNmZXJfc3RhdHVzIHN0YXR1cyk7CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL25ncG9uMl9vbnVfdHVuaW5nL01ha2VmaWxlIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9uZ3BvbjJfb251X3R1bmluZy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NzU2ZWU1Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9uZ3BvbjJfb251X3R1bmluZy9NYWtlZmlsZQpAQCAtMCwwICsxLDEyIEBACisjIE9OVSB0dW5pbmcgYXBwbGljYXRpb24KKworaWZlcSAoIiQoRU5BQkxFX0NMSSkiLCAieSIpCisgICAgTU9EX05BTUUgPSBiY21fdXNlcl9hcHBsX29udV90dW5pbmcKKyAgICBNT0RfVFlQRSA9IGxpYgorICAgIE1PRF9ERVBTID0gaG9zdF9hcGkgY29tbW9uX2dwb24gYmNtX2JvYXJkCisgICAgc3JjcyA9IGJjbW9sdF91c2VyX2FwcGxfb251X3R1bmluZy5jIGJjbW9sdF91c2VyX2FwcGxfb251X3R1bmluZ19jbGkuYworICAgIGlmZXEgKCIkKE9TX0tFUk5FTCkiLCAibGludXgiKQorCU1PRF9ERVBTICs9IGRldl9sb2dfbGludXgKKyAgICBlbmRpZgorZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9uZ3BvbjJfb251X3R1bmluZy9iY21vbHRfdXNlcl9hcHBsX29udV90dW5pbmcuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvbmdwb24yX29udV90dW5pbmcvYmNtb2x0X3VzZXJfYXBwbF9vbnVfdHVuaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGQzYjk3YgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvbmdwb24yX29udV90dW5pbmcvYmNtb2x0X3VzZXJfYXBwbF9vbnVfdHVuaW5nLmMKQEAgLTAsMCArMSwzMTIgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorKi8KKworI2luY2x1ZGUgPGJjbW9sdF9ob3N0X2FwaS5oPgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfb251X3R1bmluZy5oIgorCisjZGVmaW5lIE9OVV9UVU5JTkdfVEFTS19NU0dfUV9TSVpFIDI1NgorCit0eXBlZGVmIHN0cnVjdAoreworICAgIGJjbW9zX21zZyBvc19tc2c7CisgICAgYmNtb2x0X2F1dG8gKmluZDsKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlX2lkOworfSBvdF90YXNrX21zZzsKKworc3RhdGljIGJjbW9sdF9vbnVfdHVuaW5nX2NvbnRleHQgb3RfY29udGV4dFtCQ01UUl9NQVhfT0xUU107CisKKworc3RhdGljIGJjbW9zX2Vycm5vIG9udV90dW5pbmdfaW5pdF90YXNrKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQpCit7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgYmNtb3NfdGFza19wYXJtIHRhc2tfcGFyYW1zID0ge307CisgICAgc25wcmludGYob3RfY29udGV4dFtkZXZpY2VfaWRdLnRhc2submFtZSwgc2l6ZW9mKG90X2NvbnRleHRbZGV2aWNlX2lkXS50YXNrLm5hbWUpLCAidXNlcl9hcHBsX29udV90dW5pbmcldSIsIGRldmljZV9pZCk7CisgICAgdGFza19wYXJhbXMubmFtZSA9IG90X2NvbnRleHRbZGV2aWNlX2lkXS50YXNrLm5hbWU7CisgICAgdGFza19wYXJhbXMucHJpb3JpdHkgPSBUQVNLX1BSSU9SSVRZX1VTRVJfQVBQTF9PTlVfVFVOSU5HOworICAgIHRhc2tfcGFyYW1zLmNvcmUgPSBCQ01PU19DUFVfQ09SRV9BTlk7IC8qIE5vIENQVSBhZmZpbml0eSAqLworICAgIHRhc2tfcGFyYW1zLmluaXRfaGFuZGxlciA9IE5VTEw7CisgICAgdGFza19wYXJhbXMuZGF0YSA9IChsb25nKWRldmljZV9pZDsKKyAgICByYyA9IGJjbW9zX3Rhc2tfY3JlYXRlKCZvdF9jb250ZXh0W2RldmljZV9pZF0udGFzaywgJnRhc2tfcGFyYW1zKTsKKyAgICBCQ01PU19UUkFDRV9DSEVDS19SRVRVUk4ocmMsIHJjLCAiYmNtb3NfdGFza19jcmVhdGUoKVxuIik7CisKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBvbnVfdHVuaW5nX2luaXRfbW9kdWxlKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQpCit7CisgICAgLyogVGhpcyB2YWx1ZSBpcyB1c2VkIGluc2lkZSBiY21vbHRfb251X3R1bmluZ19tb2R1bGVfaW5pdCBmb3IgdGltZXIgb3duZXIgKi8KKyAgICBvdF9jb250ZXh0W2RldmljZV9pZF0uZGV2aWNlID0gZGV2aWNlX2lkOworICAgIGJjbW9zX21vZHVsZV9wYXJtIG1vZHVsZV9wYXJhbXMgPQorICAgIHsKKyAgICAgICAgLnFwYXJtID0geyAubmFtZSA9ICJ1c2VyX2FwcGxfb251X3R1bmluZyIsCisJCS5zaXplID0gT05VX1RVTklOR19UQVNLX01TR19RX1NJWkUgfSwKKyAgICB9OworCisgICAgcmV0dXJuIGJjbW9zX21vZHVsZV9jcmVhdGUoQkNNT1NfTU9EVUxFX0lEX1VTRVJfQVBQTF9PTlVfVFVOSU5HX0RFVjAgKyBkZXZpY2VfaWQsICZvdF9jb250ZXh0W2RldmljZV9pZF0udGFzaywgJm1vZHVsZV9wYXJhbXMpOworfQorCit2b2lkIGJjbW9sdF9vbnVfdHVuaW5nX2FwcGxfaW5pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKworI2lmZGVmIEVOQUJMRV9MT0cKKyAgICBjaGFyIGxvZ19uYW1lW01BWF9ERVZfTE9HX0lEX05BTUVdID0ge307CisgICAgc25wcmludGYobG9nX25hbWUsIHNpemVvZihsb2dfbmFtZSkgLSAxLCAidXNlcl9hcHBsX29udV90dW5pbmcldSIsIGRldmljZV9pZCk7CisgICAgb3RfY29udGV4dFtkZXZpY2VfaWRdLmxvZ19pZCA9IGJjbV9kZXZfbG9nX2lkX3JlZ2lzdGVyKGxvZ19uYW1lLCBERVZfTE9HX0xFVkVMX0RFQlVHLCBERVZfTE9HX0lEX1RZUEVfQk9USCk7CisjZW5kaWYKKworICAgIGVyciA9IGJjbW9zX211dGV4X2NyZWF0ZSgmb3RfY29udGV4dFtkZXZpY2VfaWRdLm11dGV4LCAwLCBOVUxMKTsKKyAgICBCVUdfT04oZXJyICE9IEJDTV9FUlJfT0spOworCisgICAgZXJyID0gb251X3R1bmluZ19pbml0X3Rhc2soZGV2aWNlX2lkKTsKKyAgICBCVUdfT04oZXJyICE9IEJDTV9FUlJfT0spOworCisgICAgZXJyID0gb251X3R1bmluZ19pbml0X21vZHVsZShkZXZpY2VfaWQpOworICAgIEJVR19PTihlcnIgIT0gQkNNX0VSUl9PSyk7CisKK30KKworYmNtb3NfZXJybm8gYmNtb2x0X29udV90dW5pbmdfYXBwbF9zdGFydChiY21vbHRfZGV2aWQgZGV2aWNlX2lkKQoreworICAgIGJjbW9zX2Vycm5vIHJldCA9IEJDTV9FUlJfT0s7CisKKyAgICBiY21vc19tdXRleF9sb2NrKCZvdF9jb250ZXh0W2RldmljZV9pZF0ubXV0ZXgpOworCisgICAgaWYgKG90X2NvbnRleHRbZGV2aWNlX2lkXS5pc19ydW5uaW5nKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgb3RfY29udGV4dFtkZXZpY2VfaWRdLmxvZ19pZCwgIk9OVSB0dW5pbmcgYXBwbGljYXRpb24gYWxyZWFkeSBydW5uaW5nIG9uIGRldmljZT0ldVxuIiwgZGV2aWNlX2lkKTsKKyAgICAgICAgcmV0ID0gQkNNX0VSUl9TVEFURTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIG90X2NvbnRleHRbZGV2aWNlX2lkXS5pc19ydW5uaW5nID0gQkNNT1NfVFJVRTsKKyAgICBvdF9jb250ZXh0W2RldmljZV9pZF0uZGV2aWNlID0gZGV2aWNlX2lkOworCisgICAgQkNNX0xPRyhJTkZPLCBvdF9jb250ZXh0W2RldmljZV9pZF0ubG9nX2lkLCAiT05VIHR1bmluZyBhcHBsaWNhdGlvbiBzdGFydGVkIG9uIGRldmljZT0ldVxuIiwgZGV2aWNlX2lkKTsKKyAgICByZXQgPSBCQ01fRVJSX09LOworCitleGl0OgorICAgIGJjbW9zX211dGV4X3VubG9jaygmb3RfY29udGV4dFtkZXZpY2VfaWRdLm11dGV4KTsKKyAgICByZXR1cm4gcmV0OworfQorCitiY21vc19lcnJubyBiY21vbHRfb251X3R1bmluZ19hcHBsX3N0b3AoYmNtb2x0X2RldmlkIGRldmljZV9pZCkKK3sKKyAgICBiY21vc19lcnJubyByZXQ7CisKKyAgICBiY21vc19tdXRleF9sb2NrKCZvdF9jb250ZXh0W2RldmljZV9pZF0ubXV0ZXgpOworCisgICAgaWYgKCFvdF9jb250ZXh0W2RldmljZV9pZF0uaXNfcnVubmluZykKKyAgICB7CisgICAgICAgIHJldCA9IEJDTV9FUlJfU1RBVEU7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICBvdF9jb250ZXh0W2RldmljZV9pZF0uaXNfcnVubmluZyA9IEJDTU9TX0ZBTFNFOworICAgIGJjbW9zX3RpbWVyX3N0b3AoJm90X2NvbnRleHRbZGV2aWNlX2lkXS50aW1lcik7CisgICAgQkNNX0xPRyhJTkZPLCBvdF9jb250ZXh0W2RldmljZV9pZF0ubG9nX2lkLCAiT05VIHR1bmluZyBhcHBsaWNhdGlvbiBzdG9wcGVkIG9uIGRldmljZT0ldVxuIiwgZGV2aWNlX2lkKTsKKyAgICByZXQgPSBCQ01fRVJSX09LOworCitleGl0OgorICAgIGJjbW9zX211dGV4X3VubG9jaygmb3RfY29udGV4dFtkZXZpY2VfaWRdLm11dGV4KTsKKyAgICByZXR1cm4gcmV0OworfQorCitiY21vc19ib29sIGJjbW9sdF9vbnVfdHVuaW5nX2FwcGxfaXNfcnVubmluZyhiY21vbHRfZGV2aWQgZGV2aWNlX2lkKQoreworICAgIGJjbW9zX2Jvb2wgcmV0OworCisgICAgYmNtb3NfbXV0ZXhfbG9jaygmb3RfY29udGV4dFtkZXZpY2VfaWRdLm11dGV4KTsKKyAgICByZXQgPSBvdF9jb250ZXh0W2RldmljZV9pZF0uaXNfcnVubmluZzsKKyAgICBiY21vc19tdXRleF91bmxvY2soJm90X2NvbnRleHRbZGV2aWNlX2lkXS5tdXRleCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgYmNtb3NfYm9vbCBiY21vbHRfb251X3R1bmluZ19pc19pbnRlcmVzdGVkKGJjbW9sdF9hdXRvICppbmQpCit7CisgICAgc3dpdGNoIChpbmQtPmhkci5vYmpfdHlwZSkKKyAgICB7CisgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1hHUE9OX09OVToKKyAgICAgICAgc3dpdGNoIChpbmQtPmhkci5zdWJncm91cCkKKyAgICAgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9UVU5JTkdfUkVTUE9OU0U6CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT05VX1RVTklOR19JTl9DT01QTEVURUQ6CisJCSAgIHJldHVybiBCQ01PU19UUlVFOworCSAgICBkZWZhdWx0OgorCQkgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfRkFMU0U7Cit9CisKK3N0YXRpYyB2b2lkIGJjbW9sdF9vbnVfdHVuaW5nX2luZF9jYihiY21vc19tb2R1bGVfaWQgbW9kdWxlX2lkLCBiY21vc19tc2cgKm9zX21zZykKK3sKKwlvdF90YXNrX21zZyAqbXNnID0gKG90X3Rhc2tfbXNnICopb3NfbXNnOworCWJjbW9sdF9wb25fbmkgcG9uX25pOworCWJjbW9sdF9wb25fb251X2lkIG9udV9pZDsKKwliY21vbHRfYXV0byAqaW5kID0gbXNnLT5pbmQ7CisJYmNtb3NfZXJybm8gcmM7CisKKwlzd2l0Y2ggKG1zZy0+aW5kLT5oZHIub2JqX3R5cGUpCisJeworCWNhc2UgQkNNT0xUX09CSl9JRF9YR1BPTl9PTlU6CisJCXN3aXRjaCAobXNnLT5pbmQtPmhkci5zdWJncm91cCkKKwkJeworCQkJY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfVFVOSU5HX1JFU1BPTlNFOgorCQkJeworCQkJCWJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlICpvbnVfdHVuaW5nX3Jlc3BvbnNlID0gKGJjbW9sdF94Z3Bvbl9vbnVfdHVuaW5nX3Jlc3BvbnNlICopaW5kOworCQkJCW9udV9pZCA9IG9udV90dW5pbmdfcmVzcG9uc2UtPmtleS5vbnVfaWQ7CisJCQkJcG9uX25pID0gb251X3R1bmluZ19yZXNwb25zZS0+a2V5LnBvbl9uaTsKKworCQkJCWlmIChvbnVfdHVuaW5nX3Jlc3BvbnNlLT5kYXRhLmFjayA9PSBCQ01PU19UUlVFICYmIG9udV90dW5pbmdfcmVzcG9uc2UtPmRhdGEucmVzdWx0ID09IEJDTU9MVF9SRVNVTFRfU1VDQ0VTUykKKwkJCQl7CisJCQkJCUJDTV9MT0coSU5GTywgb3RfY29udGV4dFttc2ctPmRldmljZV9pZF0ubG9nX2lkLCAiSW5kaWNhdGlvbiBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfVFVOSU5HX1JFU1BPTlNFIGhhbmRsZWQ6IFBPTjoldSBPTlU6JXUgdGFyZ2V0X3Bvbl9uaT0ldVxuIiwgcG9uX25pLCBvbnVfaWQsIG90X2NvbnRleHRbbXNnLT5kZXZpY2VfaWRdLm9udV9kYltvbnVfaWRdLnRhcmdldF9wb25fbmkpOworCisJCQkJCS8qIHN0YXJ0IHR1bmluZyBpbiBvbnUgb24gdGFyZ2V0IHBvbiBpZCAqLworCQkJCQliY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7IC5wb25fbmkgPSBvdF9jb250ZXh0W21zZy0+ZGV2aWNlX2lkXS5vbnVfZGJbb251X2lkXS50YXJnZXRfcG9uX25pLCAub251X2lkID0gb251X2lkIH07CisJCQkJCWJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19pbiBvbnVfdHVuaW5nX2luOworCisJCQkJCUJDTU9MVF9PUEVSX0lOSVQoJm9udV90dW5pbmdfaW4sIHhncG9uX29udSwgb251X3R1bmluZ19pbiwga2V5KTsKKwkJCQkJcmMgPSBiY21vbHRfb3Blcl9zdWJtaXQobXNnLT5kZXZpY2VfaWQsICZvbnVfdHVuaW5nX2luLmhkcik7CisJCQkJCWlmIChyYyAhPSBCQ01fRVJSX09LKQorCQkJCQkJQkNNX0xPRyhFUlJPUiwgb3RfY29udGV4dFttc2ctPmRldmljZV9pZF0ubG9nX2lkLCAiT05VPSV1IHR1bmluZyBpbiB0byBQT049JXUgZmFpbGVkXG4iLCBvbnVfaWQsIG90X2NvbnRleHRbbXNnLT5kZXZpY2VfaWRdLm9udV9kYltvbnVfaWRdLnRhcmdldF9wb25fbmkpOworCQkJCX0KKworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT05VX1RVTklOR19JTl9DT01QTEVURUQ6CisJCQl7CisJCQkJYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZCAqb251X3R1bmluZ19pbl9jb21wbGV0ZWQgPSAoYmNtb2x0X3hncG9uX29udV9vbnVfdHVuaW5nX2luX2NvbXBsZXRlZCAqKWluZDsKKwkJCQlvbnVfaWQgPSBvbnVfdHVuaW5nX2luX2NvbXBsZXRlZC0+a2V5Lm9udV9pZDsKKwkJCQlwb25fbmkgPSBvbnVfdHVuaW5nX2luX2NvbXBsZXRlZC0+a2V5LnBvbl9uaTsKKwkJCQlpZiAob251X3R1bmluZ19pbl9jb21wbGV0ZWQtPmRhdGEucmVzdWx0ID09IEJDTU9MVF9SRVNVTFRfU1VDQ0VTUykKKwkJCQl7CisJCQkJCUJDTV9MT0coSU5GTywgb3RfY29udGV4dFttc2ctPmRldmljZV9pZF0ubG9nX2lkLCAiSW5kaWNhdGlvbiBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT05VX1RVTklOR19JTl9DT01QTEVURUQgaGFuZGxlZDogUE9OOiV1IE9OVToldVxuIiwgcG9uX25pLCBvbnVfaWQpOworCisJCQkJCS8qIHN0YXJ0IHR1bmluZyBvdXQgb251IG9uIHNvdXJjZSBwb24gaWQgKi8KKwkJCQkJYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyAucG9uX25pID0gb3RfY29udGV4dFttc2ctPmRldmljZV9pZF0ub251X2RiW29udV9pZF0uc291cmNlX3Bvbl9uaSwgLm9udV9pZCA9IG9udV9pZCB9OworCQkJCQliY21vbHRfeGdwb25fb251X29udV90dW5pbmdfb3V0IG9udV90dW5pbmdfb3V0OworCisJCQkJCUJDTU9MVF9PUEVSX0lOSVQoJm9udV90dW5pbmdfb3V0LCB4Z3Bvbl9vbnUsIG9udV90dW5pbmdfb3V0LCBrZXkpOworCQkJCQlCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb251X3R1bmluZ19vdXQsIHhncG9uX29udSwgb251X3R1bmluZ19vdXQsIHRhcmdldF9kc19wb25faWQsIG90X2NvbnRleHRbbXNnLT5kZXZpY2VfaWRdLm9udV9kYltvbnVfaWRdLnRhcmdldF9wb25faWQpOworCQkJCQlCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb251X3R1bmluZ19vdXQsIHhncG9uX29udSwgb251X3R1bmluZ19vdXQsIHRhcmdldF91c19wb25faWQsIG90X2NvbnRleHRbbXNnLT5kZXZpY2VfaWRdLm9udV9kYltvbnVfaWRdLnRhcmdldF9wb25faWQpOworCQkJCQlCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb251X3R1bmluZ19vdXQsIHhncG9uX29udSwgb251X3R1bmluZ19vdXQsIHRpbWVfdG9fc3dpdGNoLCAxMDAwKTsKKwkJCQkJQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9udV90dW5pbmdfb3V0LCB4Z3Bvbl9vbnUsIG9udV90dW5pbmdfb3V0LCByb2xsYmFjaywgQkNNT1NfRkFMU0UpOworCQkJCQlCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb251X3R1bmluZ19vdXQsIHhncG9uX29udSwgb251X3R1bmluZ19vdXQsIHN0YXR1cywgQkNNT0xUX1NUQVRVU19PRkYpOworCQkJCQlyYyA9IGJjbW9sdF9vcGVyX3N1Ym1pdChtc2ctPmRldmljZV9pZCwgJm9udV90dW5pbmdfb3V0Lmhkcik7CisJCQkJCWlmIChyYyAhPSBCQ01fRVJSX09LKQorCQkJCQkJQkNNX0xPRyhFUlJPUiwgb3RfY29udGV4dFttc2ctPmRldmljZV9pZF0ubG9nX2lkLCAiT05VPSV1IHR1bmluZyBvdXQgZnJvbSBQT049JXUgZmFpbGVkXG4iLCBvbnVfaWQsIG90X2NvbnRleHRbbXNnLT5kZXZpY2VfaWRdLm9udV9kYltvbnVfaWRdLnNvdXJjZV9wb25fbmkpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCX0KKwlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwkvKiBmcmVlIHRoZSBjbG9uZWQgaW5kaWNhdGlvbiBzaW5jZSB3ZSdyZSBkb25lIHByb2Nlc3NpbmcgaXQgKi8KKwliY21vbHRfbXNnX2ZyZWUoJm1zZy0+aW5kLT5oZHIpOworCS8qIGZyZWUgdGhlIGludGVybmFsIE9TIG1lc3NhZ2UgaGFuZGxlICovCisJYmNtb3NfZnJlZShvc19tc2cpOworfQorCitiY21vc19lcnJubyBiY21vbHRfb251X3R1bmluZ19wcm9jZXNzX2luZChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21vbHRfYXV0byAqaW5kKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfbXNnICppbmRfY2xvbmUgPSBOVUxMOworCisgICAgLyogaWYgdGhlIGFwcGxpY2F0aW9uIGlzbid0IHJ1bm5pbmcsIGRvbid0IGxpc3RlbiB0byBhbnkgaW5kaWNhdGlvbnMgKi8KKyAgICBpZiAoIWJjbW9sdF9vbnVfdHVuaW5nX2FwcGxfaXNfcnVubmluZyhkZXZpY2VfaWQpKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKworICAgIC8qIGNoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgaGFuZGxlciBmb3IgdGhpcyB0eXBlIG9mIGluZGljYXRpb24gKi8KKyAgICBpZiAoIWJjbW9sdF9vbnVfdHVuaW5nX2lzX2ludGVyZXN0ZWQoaW5kKSkKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisKKyAgICAvKiBjbG9uZSB0aGUgaW5kaWNhdGlvbiBpbnRvIG5ld2x5LWFsbG9jYXRlZCBtZW1vcnkgc28gd2UgY2FuIGhhbmRsZSBpdCBhZnRlciB0aGUgb3JpZ2luYWwgbWVzc2FnZSBoYXMgYmVlbiBmcmVlZCAqLworICAgIGVyciA9IGJjbW9sdF9tc2dfY2xvbmUoJmluZF9jbG9uZSwgJmluZC0+aGRyKTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBvdF9jb250ZXh0W2RldmljZV9pZF0ubG9nX2lkLCAiSW5kaWNhdGlvbiBjbG9uZSBmYWlsZWQ6ICVzXG4iLCBiY21vc19zdHJlcnJvcihlcnIpKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICAvKiBzZW5kIHRoZSBjbG9uZSB0byB0aGUgaW50ZXJuYWwgdGFzaydzIG1lc3NhZ2UgcXVldWUgKi8KKyAgICBvdF90YXNrX21zZyAqbXNnID0gYmNtb3NfY2FsbG9jKHNpemVvZigqbXNnKSk7CisgICAgaWYgKG1zZyA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgb3RfY29udGV4dFtkZXZpY2VfaWRdLmxvZ19pZCwgIk1lc3NhZ2UgY2FsbG9jIGZhaWxlZDogJXNcbiIsIGJjbW9zX3N0cmVycm9yKGVycikpOworICAgICAgICBiY21vbHRfbXNnX2ZyZWUoaW5kX2Nsb25lKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfTk9NRU07CisgICAgfQorICAgIG1zZy0+b3NfbXNnLmhhbmRsZXIgPSBiY21vbHRfb251X3R1bmluZ19pbmRfY2I7CisgICAgbXNnLT5vc19tc2cucmVsZWFzZSA9IGJjbW9sdF9vc19tc2dfcmVsZWFzZV9jYjsKKyAgICBtc2ctPmRldmljZV9pZCA9IGRldmljZV9pZDsKKyAgICBtc2ctPmluZCA9IChiY21vbHRfYXV0byAqKWluZF9jbG9uZTsKKworICAgIGVyciA9IGJjbW9zX21zZ19zZW5kX3RvX21vZHVsZShUQVNLX1BSSU9SSVRZX1VTRVJfQVBQTF9PTlVfVFVOSU5HICsgZGV2aWNlX2lkLCAmbXNnLT5vc19tc2csIDApOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIG90X2NvbnRleHRbZGV2aWNlX2lkXS5sb2dfaWQsICJNZXNzYWdlIHNlbmQgZmFpbGVkOiAlc1xuIiwgYmNtb3Nfc3RyZXJyb3IoZXJyKSk7CisgICAgICAgIGJjbW9sdF9tc2dfZnJlZShpbmRfY2xvbmUpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19lcnJubyBvbnVfdHVuaW5nX3VwZGF0ZV9vbnVfZGIgKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbW9sdF94Z3Bvbl9vbnVfaWQgb251X2lkLCBiY21vbHRfcG9uX25pIHNvdXJjZV9wb25fbmksIGJjbW9sdF9wb25fbmkgdGFyZ2V0X3Bvbl9uaSwgYmNtb2x0X3Bvbl9pZCB0YXJnZXRfcG9uX2lkLCBiY21vc19ib29sIHJvbGxiYWNrKQoreworCWJjbW9zX2Vycm5vIHJldDsKKwkgYmNtb3NfbXV0ZXhfbG9jaygmb3RfY29udGV4dFtkZXZpY2VfaWRdLm11dGV4KTsKKworCSAgICBpZiAoIW90X2NvbnRleHRbZGV2aWNlX2lkXS5pc19ydW5uaW5nKQorCSAgICB7CisJICAgICAgICByZXQgPSBCQ01fRVJSX1NUQVRFOworCSAgICAgICAgZ290byBleGl0OworCSAgICB9CisJICAgIG90X2NvbnRleHRbZGV2aWNlX2lkXS5vbnVfZGJbb251X2lkXS50YXJnZXRfcG9uX25pID0gdGFyZ2V0X3Bvbl9uaTsKKwkgICAgb3RfY29udGV4dFtkZXZpY2VfaWRdLm9udV9kYltvbnVfaWRdLnNvdXJjZV9wb25fbmkgPSBzb3VyY2VfcG9uX25pOworCSAgICBvdF9jb250ZXh0W2RldmljZV9pZF0ub251X2RiW29udV9pZF0udGFyZ2V0X3Bvbl9pZCA9IHRhcmdldF9wb25faWQ7CisJICAgIG90X2NvbnRleHRbZGV2aWNlX2lkXS5vbnVfZGJbb251X2lkXS5yb2xsYmFjayA9IHJvbGxiYWNrOworCSAgICByZXQgPSBCQ01fRVJSX09LOworCitleGl0OgorCWJjbW9zX211dGV4X3VubG9jaygmb3RfY29udGV4dFtkZXZpY2VfaWRdLm11dGV4KTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9uZ3BvbjJfb251X3R1bmluZy9iY21vbHRfdXNlcl9hcHBsX29udV90dW5pbmcuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvbmdwb24yX29udV90dW5pbmcvYmNtb2x0X3VzZXJfYXBwbF9vbnVfdHVuaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjgxZmNjMgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvbmdwb24yX29udV90dW5pbmcvYmNtb2x0X3VzZXJfYXBwbF9vbnVfdHVuaW5nLmgKQEAgLTAsMCArMSw5OCBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisqLworCisjaWZuZGVmIF9CQ01PTFRfVVNFUl9BUFBMX09OVV9UVU5JTkdfSF8KKyNkZWZpbmUgX0JDTU9MVF9VU0VSX0FQUExfT05VX1RVTklOR19IXworCisjaW5jbHVkZSA8YmNtb2x0X2hvc3RfYXBpLmg+CisKK3R5cGVkZWYgc3RydWN0Cit7CisJYmNtb2x0X3Bvbl9uaSB0YXJnZXRfcG9uX25pOworCWJjbW9sdF9wb25fbmkgc291cmNlX3Bvbl9uaTsKKwliY21vbHRfcG9uX2lkIHRhcmdldF9wb25faWQ7CisJdWludDMyX3QgdGltZV90b19zd2l0Y2g7CisJYmNtb3NfYm9vbCByb2xsYmFjazsKK31iY21vbHRfb251X3R1bmluZ19vbnVfZGI7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgYmNtb3NfdGFzayB0YXNrOworICAgIGJjbW9zX21zZ19wb29sIG1zZ19wb29sOworICAgIGJjbW9zX211dGV4IG11dGV4OworICAgIGJjbW9zX3RpbWVyIHRpbWVyOworICAgIGRldl9sb2dfaWQgbG9nX2lkOworICAgIGJjbW9zX2Jvb2wgaXNfcnVubmluZzsKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlOworICAgIHVpbnQzMl90ICp0aW1lb3V0czsKKyAgICBiY21vbHRfb251X3R1bmluZ19vbnVfZGIgb251X2RiW1hHUE9OX01BWF9OVU1fT0ZfT05VU107Cit9IGJjbW9sdF9vbnVfdHVuaW5nX2NvbnRleHQ7CisKK3R5cGVkZWYgZW51bQoreworCisJT05VX1RVTklOR19NT0RFLAorfSBiY21vbHRfb251X3R1bmluZ19tb2RlOworCisvKiogSW5pdGlhbGl6ZSB0aGUgT05VIFR1bmluZyBhcHBsaWNhdGlvbiAodGhpcyBzaG91bGQgYmUgY2FsbGVkIGFzIHBhcnQgb2YgYXBwbGljYXRpb24gc3RhcnR1cCkuICovCit2b2lkIGJjbW9sdF9vbnVfdHVuaW5nX2FwcGxfaW5pdChiY21vbHRfZGV2aWQgZGV2aWNlX2lkKTsKKworLyoqIFN0YXJ0IHRoZSBPTlUgVHVuaW5nIGFwcGxpY2F0aW9uLgorICoKKyAqIFxwYXJhbVtpbl0gZGV2aWNlICAgICAgICAgICAgVGhlIGRldmljZSBJRCBvbiB3aGljaCB0aGUgYXBwbGljYXRpb24gd2lsbCBiZSBzdGFydGVkLgorICogXHJldHVybiAgICAgICAgQkNNX0VSUl9PSyBpZiB0aGUgYXBwbGljYXRpb24gd2FzIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5LCA8MCBvdGhlcndpc2UuCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9vbnVfdHVuaW5nX2FwcGxfc3RhcnQoYmNtb2x0X2RldmlkIGRldmljZV9pZCk7CisKKy8qKiBTdG9wIHRoZSBPTlUgVHVuaW5nIGFwcGxpY2F0aW9uLgorICoKKyAqIFxyZXR1cm4gICAgICAgIEJDTV9FUlJfT0sgaWYgdGhlIGFwcGxpY2F0aW9uIHdhcyBzdG9wcGVkIHN1Y2Nlc3NmdWxseSwgPDAgb3RoZXJ3aXNlLgorICovCitiY21vc19lcnJubyBiY21vbHRfb251X3R1bmluZ19hcHBsX3N0b3AoYmNtb2x0X2RldmlkIGRldmljZV9pZCk7CisKKy8qKiBRdWVyeSB3aGV0aGVyIHRoZSBPTlUgVHVuaW5nIGFwcGxpY2F0aW9uIGlzIGN1cnJlbnRseSBydW5uaW5nLgorICoKKyAqIFxyZXR1cm4gICAgICAgIEJDTU9TX1RSVUUgaWYgdGhlIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcsIEJDTU9TX0ZBTFNFIG90aGVyd2lzZS4KKyAqLworYmNtb3NfYm9vbCBiY21vbHRfb251X3R1bmluZ19hcHBsX2lzX3J1bm5pbmcoYmNtb2x0X2RldmlkIGRldmljZV9pZCk7CisKKy8qKiBQcm9jZXNzIGFuIGluZGljYXRpb24gcmVjZWl2ZWQuICBJZiB0aGUgT05VIFR1bmluZyBhcHBsaWNhdGlvbiBpcyBpbnRlcmVzdGVkIGluIHRoZSBpbmRpY2F0aW9uLCB0aGUKKyAqIGFwcHJvcHJpYXRlIGFjdGlvbiB3aWxsIGJlIHRha2VuLiAgSWYgdGhlIGFwcGxpY2F0aW9uIGlzIG5vdCBpbnRlcmVzdGVkLCB0aGUgaW5kaWNhdGlvbiB3aWxsIGJlIGlnbm9yZWQuCisgKgorICoKKyAqIE5vdGU6IHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgZnJlZSB0aGUgaW5kaWNhdGlvbi4KKyAqIFRoZSBjYWxsZXIgbXVzdCBmcmVlIGl0IHVzaW5nIGJjbW9zX21zZ19mcmVlKCkgYWZ0ZXIgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICoKKyAqIFxwYXJhbVtpbl0gaW5kIFRoZSBpbmRpY2F0aW9uIHRoYXQgd2FzIHJlY2VpdmVkLgorICogXHJldHVybiAgICAgICAgQkNNX0VSUl9PSyBpZiB0aGUgaW5kaWNhdGlvbiB3YXMgcHJvY2Vzc2VkIHN1Y2Nlc3NmdWxseSBvciBpZ25vcmVkLCA8MCBvdGhlcndpc2UuCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9vbnVfdHVuaW5nX3Byb2Nlc3NfaW5kKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIGJjbW9sdF9hdXRvICppbmQpOworYmNtb3NfZXJybm8gb251X3R1bmluZ191cGRhdGVfb251X2RiIChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCBiY21vbHRfeGdwb25fb251X2lkIG9udV9pZCwgYmNtb2x0X3Bvbl9uaSBzb3VyY2VfcG9uX25pLCBiY21vbHRfcG9uX25pIHRhcmdldF9wb25fbmksIGJjbW9sdF9wb25faWQgdGFyZ2V0X3Bvbl9pZCwgYmNtb3NfYm9vbCByb2xsYmFjayk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9uZ3BvbjJfb251X3R1bmluZy9iY21vbHRfdXNlcl9hcHBsX29udV90dW5pbmdfY2xpLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL25ncG9uMl9vbnVfdHVuaW5nL2JjbW9sdF91c2VyX2FwcGxfb251X3R1bmluZ19jbGkuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45ZDUyOWUzCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9uZ3BvbjJfb251X3R1bmluZy9iY21vbHRfdXNlcl9hcHBsX29udV90dW5pbmdfY2xpLmMKQEAgLTAsMCArMSwxODcgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorKi8KKworI2luY2x1ZGUgPGJjbW9sdF9ob3N0X2FwaS5oPgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfb251X3R1bmluZy5oIgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfb251X3R1bmluZ19jbGkuaCIKKyNpbmNsdWRlIDxiY21vbHRfZGV2X3NlbGVjdG9yLmg+CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfdXNlcl9hcHBsX29udV90dW5pbmdfY2xpX2NyZWF0ZShiY21jbGlfZW50cnkgKnRvcF9kaXIpOworCitzdGF0aWMgYmNtY2xpX2VudHJ5ICpvbnVfdHVuaW5nX2NsaV9kaXI7CitzdGF0aWMgYmNtY2xpX2VudHJ5ICpvbnVfdHVuaW5nX2NsaV90b3BfZGlyOworc3RhdGljIGJjbW9zX2Jvb2wgb251X3R1bmluZ19pc19yZWdpc3RlcmVkOworCisvKiBEZXN0cm95IENMSSBjb21tYW5kcyAqLworc3RhdGljIHZvaWQgb251X3R1bmluZ19jbGlfZGVzdHJveSh2b2lkKQoreworICAgIGlmIChvbnVfdHVuaW5nX2NsaV9kaXIpCisgICAgeworICAgICAgICBiY21jbGlfdG9rZW5fZGVzdHJveShvbnVfdHVuaW5nX2NsaV9kaXIpOworICAgICAgICBvbnVfdHVuaW5nX2NsaV9kaXIgPSBOVUxMOworICAgIH0KK30KKworLyogQ3VycmVudCBkZXZpY2UgY2hhbmdlIGluZGljYXRpb24gKi8KK3N0YXRpYyB2b2lkIGJjbW9sdF91c2VyX2FwcGxfb251X3R1bmluZ19kZXZpY2VfY2hhbmdlX2luZChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgYmNtb2x0X2RldmlkIGRldikKK3sKKyAgICBiY21vbHRfc3lzdGVtX21vZGUgc3lzdGVtX21vZGU7CisgICAgYmNtb3NfZXJybm8gZXJyID0gYmNtb2x0X3N5c3RlbV9tb2RlX2dldChkZXYsICZzeXN0ZW1fbW9kZSk7CisKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiRXJyb3IgZGV2aWNlIElkXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChzeXN0ZW1fbW9kZSA9PSBCQ01PTFRfU1lTVEVNX01PREVfTkdQT04yX18yX1hfMTBfRykKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJCdWlsZGluZyBvbnVfdHVuaW5nIENMSSBmb3IgZGV2aWNlICVkXG4iLCBkZXYpOworCisgICAgICAgIGVyciA9IGJjbW9sdF91c2VyX2FwcGxfb251X3R1bmluZ19jbGlfY3JlYXRlKG9udV90dW5pbmdfY2xpX3RvcF9kaXIpOworICAgICAgICBpZiAoZXJyKQorICAgICAgICB7CisgICAgICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiRXJyb3IgYnVpbGRpbmcgb251X3R1bmluZyBDTElcbiIpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgCW9udV90dW5pbmdfY2xpX2Rlc3Ryb3koKTsKKyAgICB9Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBvbnVfdHVuaW5nX2NtZF9zdGFydChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1zW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgcmV0dXJuIGJjbW9sdF9vbnVfdHVuaW5nX2FwcGxfc3RhcnQoY3VycmVudF9kZXZpY2UpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gb251X3R1bmluZ19jbWRfc3RvcChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1zW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgcmV0dXJuIGJjbW9sdF9vbnVfdHVuaW5nX2FwcGxfc3RvcChjdXJyZW50X2RldmljZSk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBvbnVfaGFuZG92ZXJfY21kKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybXNbXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKwliY21vbHRfeGdwb25fb251X2lkIG9udV9pZDsKKwliY21vbHRfcG9uX25pIHRhcmdldF9wb25fbmk7CisJYmNtb2x0X3Bvbl9uaSBzb3VyY2VfcG9uX25pOworCXVpbnQzMl90IHRhcmdldF9wb25fYWRtaW5pc3RyYXRpdmVfbGFiZWw7CisJdWludDhfdCB0YXJnZXRfcG9uX2R3bGNoX2lkOworCXVpbnQzMl90IHRpbWVfdG9fc3dpdGNoOyAgICAgICAgLyogVGltZSB0byBzd2l0Y2ggaW4gbXMgKi8KKwliY21jbGlfY21kX3Bhcm0gKnJvbGxiYWNrX3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJyb2xsYmFjayIpOworCWJjbW9zX2Jvb2wgcm9sbGJhY2s7CisJYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworCWJjbW9sdF9wb25faWQgdGFyZ2V0X3Bvbl9pZDsKKworCisJc291cmNlX3Bvbl9uaSA9IChiY21vbHRfcG9uX25pKWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNvdXJjZV9wb25fbmkiKS0+dmFsdWUudW51bWJlcjsKKwl0YXJnZXRfcG9uX25pID0gKGJjbW9sdF9wb25fbmkpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidGFyZ2V0X3Bvbl9uaSIpLT52YWx1ZS51bnVtYmVyOworCW9udV9pZCA9IChiY21vbHRfcG9uX29udV9pZCliY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJvbnUiKS0+dmFsdWUudW51bWJlcjsKKwl0YXJnZXRfcG9uX2FkbWluaXN0cmF0aXZlX2xhYmVsID0gKHVpbnQzMl90KWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRhcmdldF9wb25faWRfYWRtaW5pc3RyYXRpdmVfbGFiZWwiKS0+dmFsdWUudW51bWJlcjsKKwl0YXJnZXRfcG9uX2R3bGNoX2lkID0gKHVpbnQ4X3QpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAidGFyZ2V0X3Bvbl9pZF9kd2xjaF9pZCIpLT52YWx1ZS51bnVtYmVyOworCXRhcmdldF9wb25faWQuYWRtaW5pc3RyYXRpdmVfbGFiZWwgPSB0YXJnZXRfcG9uX2FkbWluaXN0cmF0aXZlX2xhYmVsOworCXRhcmdldF9wb25faWQuZHdsY2hfaWQgPSB0YXJnZXRfcG9uX2R3bGNoX2lkOworCXRpbWVfdG9fc3dpdGNoID0gKHVpbnQzMl90KWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRpbWVfdG9fc3dpdGNoIiktPnZhbHVlLnVudW1iZXI7CisKKwlpZiAocm9sbGJhY2tfcGFybS0+dmFsdWUudW51bWJlciA9PSAwKQorCQlyb2xsYmFjayA9IEJDTU9TX0ZBTFNFOworCWVsc2UKKwkJcm9sbGJhY2sgPSBCQ01PU19UUlVFOworCS8qIHVwZGF0ZSB0dW5pbmcgaW4gcGFyYW1ldGVycyBpbiBkYXRhIGJhc2UgKi8KKwlvbnVfdHVuaW5nX3VwZGF0ZV9vbnVfZGIoY3VycmVudF9kZXZpY2UsIG9udV9pZCwgc291cmNlX3Bvbl9uaSwgdGFyZ2V0X3Bvbl9uaSwgdGFyZ2V0X3Bvbl9pZCwgcm9sbGJhY2spOworCisJYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIlR1bmluZyBvdXQgT05VPSV1IHNvdXJjZV9wb25fbmk9JXUgdGFyZ2V0X3Bvbl9uaT0ldSBcbiIsIG9udV9pZCwgc291cmNlX3Bvbl9uaSwgdGFyZ2V0X3Bvbl9uaSk7CisKKwkvKiBzdGFydCB0dW5pbmcgb3V0IG9udSBvbiBzb3VyY2UgcG9uIGlkICovCisJYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyAucG9uX25pID0gc291cmNlX3Bvbl9uaSwgLm9udV9pZCA9IG9udV9pZCB9OworCWJjbW9sdF94Z3Bvbl9vbnVfb251X3R1bmluZ19vdXQgb251X3R1bmluZ19vdXQ7CisKKwlCQ01PTFRfT1BFUl9JTklUKCZvbnVfdHVuaW5nX291dCwgeGdwb25fb251LCBvbnVfdHVuaW5nX291dCwga2V5KTsKKwlCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb251X3R1bmluZ19vdXQsIHhncG9uX29udSwgb251X3R1bmluZ19vdXQsIHRhcmdldF9kc19wb25faWQsIHRhcmdldF9wb25faWQpOworCUJDTU9MVF9PUEVSX1BST1BfU0VUKCZvbnVfdHVuaW5nX291dCwgeGdwb25fb251LCBvbnVfdHVuaW5nX291dCwgdGFyZ2V0X3VzX3Bvbl9pZCwgdGFyZ2V0X3Bvbl9pZCk7CisJQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9udV90dW5pbmdfb3V0LCB4Z3Bvbl9vbnUsIG9udV90dW5pbmdfb3V0LCB0aW1lX3RvX3N3aXRjaCwgdGltZV90b19zd2l0Y2gpOworCUJDTU9MVF9PUEVSX1BST1BfU0VUKCZvbnVfdHVuaW5nX291dCwgeGdwb25fb251LCBvbnVfdHVuaW5nX291dCwgcm9sbGJhY2ssIEJDTU9TX1RSVUUpOworCUJDTU9MVF9PUEVSX1BST1BfU0VUKCZvbnVfdHVuaW5nX291dCwgeGdwb25fb251LCBvbnVfdHVuaW5nX291dCwgc3RhdHVzLCBCQ01PTFRfU1RBVFVTX09OKTsKKwlyYyA9IGJjbW9sdF9vcGVyX3N1Ym1pdChjdXJyZW50X2RldmljZSwgJm9udV90dW5pbmdfb3V0Lmhkcik7CisJaWYgKHJjICE9IEJDTV9FUlJfT0spCisJCWJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJPTlU9JXUgdHVuaW5nIG91dCBmcm9tIFBPTj0ldSBmYWlsZWRcbiIsIG9udV9pZCwgc291cmNlX3Bvbl9uaSk7CisKKwlyZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtb2x0X3VzZXJfYXBwbF9vbnVfdHVuaW5nX2NsaV9pbml0KGJjbWNsaV9lbnRyeSAqdG9wX2RpcikKK3sKKyAgICBiY21vc19lcnJubyBlcnIgPSBCQ01fRVJSX09LOworCisgICAgLyogU3Vic2NyaWJlIGZvciBkZXZpY2UgY2hhbmdlIGluZGljYXRpb24gKi8KKyAgICBpZiAoIW9udV90dW5pbmdfaXNfcmVnaXN0ZXJlZCkKKyAgICB7CisgICAgCW9udV90dW5pbmdfaXNfcmVnaXN0ZXJlZCA9IEJDTU9TX1RSVUU7CisKKyAgICAgICAgZXJyID0gYmNtb2x0X2Rldl9zZWxfaW5kX3JlZ2lzdGVyKGJjbW9sdF91c2VyX2FwcGxfb251X3R1bmluZ19kZXZpY2VfY2hhbmdlX2luZCk7CisgICAgfQorICAgIHJldHVybiBlcnIgPyBlcnIgOiBiY21vbHRfdXNlcl9hcHBsX29udV90dW5pbmdfY2xpX2NyZWF0ZSh0b3BfZGlyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF91c2VyX2FwcGxfb251X3R1bmluZ19jbGlfY3JlYXRlKGJjbWNsaV9lbnRyeSAqdG9wX2RpcikKK3sKKyAgICBiY21jbGlfZW50cnkgKmRpcjsKKworICAgIGlmIChiY21jbGlfZGlyX2ZpbmQodG9wX2RpciwgIm9udV90dW5pbmciKSkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKworICAgIGRpciA9IGJjbWNsaV9kaXJfYWRkKAorICAgICAgICB0b3BfZGlyLAorICAgICAgICAib251X3R1bmluZyIsCisgICAgICAgICJOR1BPTjIgT05VIHR1bmluZyB1c2VyIGFwcGxpY2F0aW9uIiwKKyAgICAgICAgQkNNQ0xJX0FDQ0VTU19BRE1JTiwKKyAgICAgICAgTlVMTCk7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKCFkaXIsIEJDTV9FUlJfTk9NRU0pOworCisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJzdGFydCIsICJTdGFydCBPTlUgdHVuaW5nIGFwcGxpY2F0aW9uIiwgb251X3R1bmluZ19jbWRfc3RhcnQpOworCisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJzdG9wIiwgIlN0b3AgT05VIHR1bmluZyBhcHBsaWNhdGlvbiIsIG9udV90dW5pbmdfY21kX3N0b3ApOworCisgICAgQkNNQ0xJX01BS0VfQ01EKGRpciwgIm9udV9oYW5kb3ZlciIsICJPTlUgaGFuZG92ZXIiLCBvbnVfaGFuZG92ZXJfY21kLAorCQlCQ01DTElfTUFLRV9QQVJNKCJvbnUiLCAiT05VIElEIiwgQkNNQ0xJX1BBUk1fTlVNQkVSLCBCQ01DTElfUEFSTV9GTEFHX05PTkUpLAorCQlCQ01DTElfTUFLRV9QQVJNKCJzb3VyY2VfcG9uX25pIiwgIlNvdXJjZSBQT05fTkkiLCBCQ01DTElfUEFSTV9OVU1CRVIsIEJDTUNMSV9QQVJNX0ZMQUdfTk9ORSksCisJCUJDTUNMSV9NQUtFX1BBUk0oInRhcmdldF9wb25fbmkiLCAiVGFyZ2V0IFBPTl9OSSIsIEJDTUNMSV9QQVJNX05VTUJFUiwgQkNNQ0xJX1BBUk1fRkxBR19OT05FKSwKKwkJQkNNQ0xJX01BS0VfUEFSTSgidGFyZ2V0X3Bvbl9pZF9hZG1pbmlzdHJhdGl2ZV9sYWJlbCIsICJUYXJnZXQgUE9OIElEIEFkbWluaXN0cmF0aXZlIGxhYmVsIiwgQkNNQ0xJX1BBUk1fTlVNQkVSLCBCQ01DTElfUEFSTV9GTEFHX05PTkUpLAorCQlCQ01DTElfTUFLRV9QQVJNKCJ0YXJnZXRfcG9uX2lkX2R3bGNoX2lkIiwgIlRhcmdldCBQT04gSUQgQ2hhbm5lbCBpZCIsIEJDTUNMSV9QQVJNX05VTUJFUiwgQkNNQ0xJX1BBUk1fRkxBR19OT05FKSwKKwkJQkNNQ0xJX01BS0VfUEFSTSgidGltZV90b19zd2l0Y2giLCAiVGltZV9Ub19Td2l0Y2giLCBCQ01DTElfUEFSTV9OVU1CRVIsIEJDTUNMSV9QQVJNX0ZMQUdfTk9ORSksCisJCUJDTUNMSV9NQUtFX1BBUk1fRU5VTSgicm9sbGJhY2siLCAiUm9sbGJhY2siLCBiY21jbGlfZW51bV9ib29sX3RhYmxlLCBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMKSk7CisKKworICAgIG9udV90dW5pbmdfY2xpX2RpciA9IGRpcjsKKyAgICBvbnVfdHVuaW5nX2NsaV90b3BfZGlyID0gdG9wX2RpcjsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9uZ3BvbjJfb251X3R1bmluZy9iY21vbHRfdXNlcl9hcHBsX29udV90dW5pbmdfY2xpLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL25ncG9uMl9vbnVfdHVuaW5nL2JjbW9sdF91c2VyX2FwcGxfb251X3R1bmluZ19jbGkuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iYTlkNzY0Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9uZ3BvbjJfb251X3R1bmluZy9iY21vbHRfdXNlcl9hcHBsX29udV90dW5pbmdfY2xpLmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisqLworCisjaWZuZGVmIF9CQ01PTFRfVVNFUl9BUFBMX09OVV9UVU5JTkdfQ0xJX0hfCisjZGVmaW5lIF9CQ01PTFRfVVNFUl9BUFBMX09OVV9UVU5JTkdfQ0xJX0hfCisKKyNpbmNsdWRlIDxiY21vbHRfaG9zdF9hcGkuaD4KKworYmNtb3NfZXJybm8gYmNtb2x0X3VzZXJfYXBwbF9vbnVfdHVuaW5nX2NsaV9pbml0KGJjbWNsaV9lbnRyeSAqdG9wX2Rpcik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9vbW9uL01ha2VmaWxlIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9vbW9uL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MDA1NjIKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL29tb24vTWFrZWZpbGUKQEAgLTAsMCArMSwyMCBAQAorIyBFUE9OIG9wdGljYWwgbW9uaXRvcmluZyBhcHBsaWNhdGlvbgorCitpZmVxICgiJChFTkFCTEVfQ0xJKSIsICJ5IikKKworCU1PRF9OQU1FID0gYmNtX3VzZXJfYXBwbF9vbW9uCisJTU9EX1RZUEUgPSBsaWIKKwlNT0RfREVQUyA9IGhvc3RfYXBpCisJaWZuZXEgKCIkKFNJTVVMQVRJT05fQlVJTEQpIiwgInkiKQorCQlNT0RfREVQUyArPSAgYmNtX2JvYXJkIGkyY19kZXZzCisJZW5kaWYKKworCWlmZXEgKCIkKE9TX0tFUk5FTCkiLCAibGludXgiKQorCQlNT0RfREVQUyArPSBkZXZfbG9nX2xpbnV4CisJZW5kaWYKKworCWlmbmVxICgiJChTSU1VTEFUSU9OX0JVSUxEKSIsICJ5IikKKwkJc3JjcyA9IG9tb24uYworCWVuZGlmCisKK2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL29tb24vb21vbi5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9vbW9uL29tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzJmZjdlCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9vbW9uL29tb24uYwpAQCAtMCwwICsxLDEzODMgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorKi8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbW9sdF9hcGkuaD4KKyNpbmNsdWRlIDxiY21vbHRfbW9kZWxfdHlwZXMuaD4KKyNpbmNsdWRlIDxiY21fZGV2X2xvZy5oPgorI2luY2x1ZGUgPGJjbW9sdF9ib2FyZC5oPgorI2luY2x1ZGUgIm9tb24uaCIKKyNpbmNsdWRlICJiY21vbHRfdXRpbHMuaCIKKy8qIFRoZXNlIG1hY3JvcyBuZWVkIHRvIGJlIGRlZmluZWQgYmVmb3JlIHRoZSBmb2xsb3dpbmcgaW5jbHVkZS4gKi8KKyNkZWZpbmUgQkNNX0kyQ19ERVZfQUREUl9TVEFSVCB0eXBlZGVmIGVudW0geworI2RlZmluZSBCQ01fSTJDX0RFVl9BRERSKG5hbWUsIGRlc2MsIHZhbCkgbmFtZSA9IHZhbCwKKyNkZWZpbmUgQkNNX0kyQ19ERVZfQUREUl9FTkQgfSBiY21faTJjX2Rldl9hZGRyOworI2luY2x1ZGUgImJjbW9sdF9pMmNfZGV2c19hZGRyLmgiCisKKworLyogRml4ZWQgc2FtcGxlIGRlbGF5IGV4Y2VlZHMgdGhlIHN1bSBvZiB0aGUgbWF4aW11bSBncmFudCBzaXplIGFuZCBhIHdvcnN0IGNhc2UKKyAgIHJldHJpZXZhbCB0aW1lIGJhc2VkIG9uIHZhcmlvdXMgb3B0aWNzIG1vZHVsZXMnIGRhdGEgc2hlZXRzICovCisjZGVmaW5lIE9NT05fRklYRURfU0FNUExFX0RFTEFZX1VTICAgICAgMTIwMDAKKyNkZWZpbmUgU0ZGXzg0NzJfSURFTlRJRklFUl9BRERSICAgICAgICAweDAwICAgIC8qIFNGUCBhbmQgWEZQIElkZW50aWZpZXIgYnl0ZSovCisjZGVmaW5lIFNGRl84MDc3aV9JREVOVElGSUVSX0FERFIgICAgICAgMTI4ICAgICAvKiBYRlAgSWRlbnRpZmllciBieXRlICovCisjZGVmaW5lIFNGRl84NDcyX1JYX1BPV0VSX0FERFIgICAgICAgICAgMTA0ICAgICAvKiBTRlAgb2ZmZXNldCBpbnRvIEEyICovCisjZGVmaW5lIFNGRl84MDc3aV9SWF9QT1dFUl9BRERSICAgICAgICAgMTA0ICAgICAvKiBYRlAgYnl0ZSAxMDQvMTA1IGludG8gQTAgICh5ZXMgQTApICovCisjZGVmaW5lIFNGRl84MDc3aV9WRU5ET1JfTkFNRV9BRERSICAgICAgMTQ4ICAgICAvKiBYRlAgYnl0ZXMgMTYzLTE0OCBpbnRvIEEwICAgKi8KKyNkZWZpbmUgU0ZGXzgwNzdpX1ZFTkRPUl9OQU1FX0xFTiAgICAgICAxNiAgICAgIC8qIFhGUCBuYW1lIGxlbmd0aCAgKi8KKyNkZWZpbmUgU0ZGXzgwNzdpX1ZFTkRPUl9QTl9BRERSICAgICAgICAxNjggICAgIC8qIFhGUCBieXRlcyAxODMtMTY4IGludG8gQTAgICAqLworI2RlZmluZSBTRkZfODA3N2lfVkVORE9SX1BOX0xFTiAgICAgICAgIDE2ICAgICAgLyogWEZQIHBhcnQgbnVtYmVyIGxlbmd0aCAgICovCisjZGVmaW5lIFNGRl84MDc3aV9WRU5ET1JfUkVWX0FERFIgICAgICAgMTg0ICAgICAvKiBYRlAgYnl0ZXMgMTg1LTE4NCBpbnRvIEEwICAgKi8KKyNkZWZpbmUgU0ZGXzgwNzdpX1ZFTkRPUl9SRVZfTEVOICAgICAgICAyICAgICAgIC8qIFhGUCByZXZpc2lvbiBsZW4gICAqLworI2RlZmluZSBTRkZfODA3N2lfVkVORE9SX1NOX0FERFIgICAgICAgIDE5NiAgICAgLyogWEZQIGJ5dGVzIDIxMS0xOTYgaW50byBBMCAgICovCisjZGVmaW5lIFNGRl84MDc3aV9WRU5ET1JfU05fTEVOICAgICAgICAgMTYgICAgICAvKiBYRlAgc2VyaWFsIG51bWJlciBsZW4gICAqLworI2RlZmluZSBPTU9OX1RBU0tfTVNHX1FfU0laRSAgICAgICAgICAgIDE2ICAgICAgLyogYWxsb3cgb25lIG1lc3NhZ2UgcGVyIHBvcnQgKi8KKyNkZWZpbmUgU0ZGX1BBR0VfQUREUjEgICAgICAgICAgICAgICAgICAwICAgICAgIC8qIHVzZSBTRlBfSTJDX0FERFIxIGZvciBJMkMgcmVhZCBBMCAqLworI2RlZmluZSBTRkZfUEFHRV9BRERSMiAgICAgICAgICAgICAgICAgIDEgICAgICAgLyogdXNlIFNGUF9JMkNfQUREUjIgZm9yIDEyQyByZWFkIEEyICovCisKKyNkZWZpbmUgU0ZGXzg0NzJfVkVORE9SX05BTUVfQUREUiAgICAgIDIwICAgICAgLyogU0ZQIGJ5dGVzIDIwLTM1IGludG8gQTAgICAqLworI2RlZmluZSBTRkZfODQ3Ml9WRU5ET1JfTkFNRV9MRU4gICAgICAgMTYgICAgICAvKiBTRlAgbmFtZSBsZW5ndGggICovCisjZGVmaW5lIFNGRl84NDcyX1ZFTkRPUl9PVUlfQUREUiAgICAgICAzNyAgICAgIC8qIFNGUCBieXRlcyAzNy0zOSBpbnRvIEEwICAgKi8KKyNkZWZpbmUgU0ZGXzg0NzJfVkVORE9SX09VSV9MRU4gICAgICAgIDMgICAgICAgLyogU0ZQIG91aSBsZW5ndGggICovCisjZGVmaW5lIFNGRl84NDcyX1ZFTkRPUl9QTl9BRERSICAgICAgICA0MCAgICAgIC8qIFNGUCBieXRlcyA0MC01NSBpbnRvIEEwICAgKi8KKyNkZWZpbmUgU0ZGXzg0NzJfVkVORE9SX1BOX0xFTiAgICAgICAgIDE2ICAgICAgLyogU0ZQIHBhcnQgbnVtYmVyIGxlbmd0aCAgICovCisjZGVmaW5lIFNGRl84NDcyX1ZFTkRPUl9SRVZfQUREUiAgICAgICA1NiAgICAgIC8qIFNGUCBieXRlcyA1Ni01OSBpbnRvIEEwICAgKi8KKyNkZWZpbmUgU0ZGXzg0NzJfVkVORE9SX1JFVl9MRU4gICAgICAgIDQgICAgICAgLyogU0ZQIHJldmlzaW9uIGxlbiAgICovCisjZGVmaW5lIFNGRl84NDcyX1ZFTkRPUl9TTl9BRERSICAgICAgICA2OCAgICAgIC8qIFNGUCBieXRlcyA2OC04MyBpbnRvIEEwICAgKi8KKyNkZWZpbmUgU0ZGXzg0NzJfVkVORE9SX1NOX0xFTiAgICAgICAgIDE2ICAgICAgLyogU0ZQIHNlcmlhbCBudW1iZXIgbGVuICAgKi8KKyNkZWZpbmUgU0ZGXzg0NzJfVkVORE9SX1NGRl9BRERSICAgICAgIDk0ICAgICAgLyogU0ZQIGJ5dGVzIDk0IGludG8gQTAgICAqLworI2RlZmluZSBTRkZfODQ3Ml9WRU5ET1JfU0ZGX0xFTiAgICAgICAgMSAgICAgICAvKiBTRlAgU0ZGLTg0NzIgQ29tcGxpYW5jZSByZXZpc2lvbiBsZW4gICAqLworCisjZGVmaW5lIFNGRl84NDcyX0RJQUdfTU9OX0FERFIgICAgICAgICA5MiAgICAgIC8qIFNGUCBieXRlcyA5MiBpbnRvIEEwICAgKi8KKyNkZWZpbmUgU0ZGXzg0NzJfRU5IQU5DRURfT1BUX0FERFIgICAgIDkzICAgICAgLyogU0ZQIGJ5dGVzIDkzIGludG8gQTAgICAqLworI2RlZmluZSBTRkZfODQ3Ml9URU1QRVJBVFVSRV9BRERSICAgICAgOTYgICAgICAvKiBTRlAgYnl0ZXMgOTYgaW50byBBMCAgICovCisjZGVmaW5lIFNGRl84NDcyX0RJQUdfTU9OX0xFTiAgICAgICAgICAxICAgICAgIC8qIFNGUCBTRkYtODQ3MiBEaWFnbm9zdGljIE1vbml0b3JpbmcgVHlwZSBsZW4gICAqLworCisvKiBUYWJsZSAzMiA1LjIgSWRlbnRpZmllciB2YWx1ZXMgU0ZGODA3N2kqLworI2RlZmluZSBTRkZfSURFTlRJRklFUl9TRlAgIDB4MDMKKyNkZWZpbmUgU0ZGX0lERU5USUZJRVJfWEZQICAweDA2CisKK3R5cGVkZWYgdWludDMyX3Qgb21vbl9yc3NpX3ZhbHVlOworCisKKy8qIFVuaXF1ZWx5IGlkZW50aWZpZXMgc3BlY2lmaWMgRVBPTiBsaW5rcyB1bmRlciBtYW5hZ2VtZW50IGJ5IHRoaXMKKyAgIGFwcGxpY2F0aW9uICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQ7CisgICAgYmNtb2x0X2Vwb25fbmkgZXBvbl9uaTsKKyAgICBiY21vc19tYWNfYWRkcmVzcyBtYWNfYWRkcmVzczsKK30gb21vbl9saW5rX2tleTsKKworCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVpbnQzMl90ICBjYWRkcjsgICAgLyogSTJDIHN3aXRjaCBjb250cm9sIGFkZHJlc3MgKi8KKyAgICB1aW50MzJfdCAgc2N0cmw7ICAgIC8qIEkyQyBzd2l0Y2ggY29udHJvbCBjb21tYW5kIHZhbHVlICovCit9IGkyY19jb29yZHM7CisKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21vc19tc2cgb3NfbXNnOworICAgIG9tb25fbGlua19rZXkgbGlua19rZXk7CisgICAgdWludDE2X3QgdHJpZ2dlcl93aWR0aF9uczsKKyAgICB1aW50MTZfdCB0cmlnZ2VyX2RlbGF5X25zOworICAgIHVpbnQxNl90IHNhbXBsZV9wZXJpb2RfdXM7CisgICAgYmNtY2xpX3Nlc3Npb24gKnNlc3Npb247CisgICAgYmNtb2x0X2Vwb25fbGxpZCBsbGlkOworICAgIHVpbnQ4X3Qgc2Nhbl9tb2RlOworfSBvbW9uX3Rhc2tfbXNnOworCisKK3N0YXRpYyBkZXZfbG9nX2lkIG9tb25fbG9nX2lkID0gREVWX0xPR19JTlZBTElEX0lEOworc3RhdGljIGJjbW9zX3Rhc2sgb21vbl90YXNrOworc3RhdGljIGJjbW9zX2Jvb2wgaXNfcnVubmluZyA9IEJDTU9TX0ZBTFNFOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBCQ005Njg2MjAgcGxhdGZvcm0gZGVwZW5kZW50IEkyQyBhY2Nlc3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwordWludDhfdCBiY205Njg2MjBfY2xpZW50X3N3aXRjaGN0cmxfc2ZwWzE2XVsyXSA9Cit7CisgICAgeyAgIDB4NzIsICAgICAweDgwLCB9LAorICAgIHsgICAweDcyLCAgICAgMHg0MCwgfSwKKyAgICB7ICAgMHg3MiwgICAgIDB4MjAsIH0sCisgICAgeyAgIDB4NzIsICAgICAweDEwLCB9LAorICAgIHsgICAweDcyLCAgICAgIDB4OCwgfSwKKyAgICB7ICAgMHg3MiwgICAgICAweDQsIH0sCisgICAgeyAgIDB4NzIsICAgICAgMHgyLCB9LAorICAgIHsgICAweDcyLCAgICAgIDB4MSwgfSwKKyAgICB7ICAgMHg3MywgICAgIDB4MTAsIH0sCisgICAgeyAgIDB4NzMsICAgICAweDIwLCB9LAorICAgIHsgICAweDczLCAgICAgMHg0MCwgfSwKKyAgICB7ICAgMHg3MywgICAgIDB4ODAsIH0sCisgICAgeyAgIDB4NzMsICAgICAgMHgxLCB9LAorICAgIHsgICAweDczLCAgICAgIDB4MiwgfSwKKyAgICB7ICAgMHg3MywgICAgICAweDQsIH0sCisgICAgeyAgIDB4NzMsICAgICAgMHg4LCB9LAorfTsKKworCit1aW50OF90IGJjbTk2ODYyMF9jbGllbnRfc3dpdGNoY3RybF94ZnBbOF1bMl0gPQoreworICAgIC8qIGNhZGRyLCAgICBzY3RybCAqLworICAgIHsgICAweDcyLCAgICAgIDB4OCwgfSwKKyAgICB7ICAgMHg3MiwgICAgICAweDQsIH0sCisgICAgeyAgIDB4NzIsICAgICAgMHgyLCB9LAorICAgIHsgICAweDcyLCAgICAgIDB4MSwgfSwKKyAgICB7ICAgMHg3MywgICAgIDB4MTAsIH0sCisgICAgeyAgIDB4NzMsICAgICAweDIwLCB9LAorICAgIHsgICAweDczLCAgICAgMHg0MCwgfSwKKyAgICB7ICAgMHg3MywgICAgIDB4ODAsIH0sCit9OworCitzdGF0aWMgYmNtb3NfYm9vbCBvbW9uX2lzX2Vwb25fbmlfdmFsaWQoYmNtb2x0X2Vwb25fbmkgZXBvbikKK3sKKyAgICBiY21vbHRfc3lzdGVtX21vZGUgc3lzdGVtX21vZGU7CisKKyAgICBiY21vbHRfc3lzdGVtX21vZGVfZ2V0KGN1cnJlbnRfZGV2aWNlLCAmc3lzdGVtX21vZGUpOworCisgICAgc3dpdGNoIChzeXN0ZW1fbW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzE2X1g6CisgICAgICAgICAgICByZXR1cm4gZXBvbiA8IDE2OworICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX184X1hfQ09FWElTVEVOQ0VfVERNQToKKyAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fOF9YXzEwX0c6CisgICAgICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzhfWDoKKyAgICAgICAgICAgIHJldHVybiBlcG9uIDwgODsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fNF9YX0NPRVhJU1RFTkNFX1RETUE6CisgICAgICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzRfWF8xMF9HOgorICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX180X1g6CisgICAgICAgICAgICByZXR1cm4gZXBvbiA8IDQ7CisgICAgICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzJfWF8xMF9HOgorICAgICAgICAgICAgcmV0dXJuIGVwb24gPCAyOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KK30KKworc3RhdGljIGJjbW9zX2Jvb2wgdHJ4X2lkX2Zyb21fZXBvbl9uaShiY21vbHRfZXBvbl9uaSBlcG9uLCB1aW50OF90ICp0cnhfaWQpCit7CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgZXBvbl80eFs0XSA9IHsgMiwgMywgNiwgNyB9OworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGVwb25fMnhfMTBnWzJdID0geyAzLCA0IH07CisgICAgYmNtb2x0X3N5c3RlbV9tb2RlIHN5c3RlbV9tb2RlOworCisgICAgYmNtb2x0X3N5c3RlbV9tb2RlX2dldChjdXJyZW50X2RldmljZSwgJnN5c3RlbV9tb2RlKTsKKworICAgIHN3aXRjaCAoc3lzdGVtX21vZGUpCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX18xNl9YOgorICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX184X1g6CisgICAgICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzhfWF9DT0VYSVNURU5DRV9URE1BOgorICAgICAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX180X1hfQ09FWElTVEVOQ0VfVERNQToKKyAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fOF9YXzEwX0c6CisgICAgICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzRfWF8xMF9HOgorICAgICAgICAgICAgKnRyeF9pZCA9ICh1aW50OF90KWVwb247CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fNF9YOgorICAgICAgICAgICAgKnRyeF9pZCA9IGVwb25fNHhbZXBvbl07CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fMl9YXzEwX0c6CisgICAgICAgICAgICAqdHJ4X2lkID0gZXBvbl8yeF8xMGdbZXBvbl07CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICp0cnhfaWQgPSAodWludDhfdCktMTsKKyAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9Cit9CisKK3N0YXRpYyBjaGFyICogYmNtb2x0X2dldF9zY2FuX3Jlc3VsdChiY21vbHRfcm9ndWVfc2Nhbl9zdGF0dXMgc3RhdHVzKQoreworICAgIHN3aXRjaCAoc3RhdHVzKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfUk9HVUVfU0NBTl9TVEFUVVNfQ09NUExFVEU6CisgICAgICAgICAgICByZXR1cm4gIk9LOiBFUE9OIFJPR1VFIFNDQU4gSVMgQ09NUExFVEUiOworICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9TQ0FOX1NUQVRVU19MTElEX1NUQVRFX0lTX0JBRDoKKyAgICAgICAgICAgIHJldHVybiAiRkFJTDogUkVRVUVTVEVEIExMSUQgSVMgSU4gVVNFIjsKKyAgICAgICAgY2FzZSBCQ01PTFRfUk9HVUVfU0NBTl9TVEFUVVNfU0NBTl9FUlJfSU5URVJOQUw6CisgICAgICAgICAgICByZXR1cm4gIkZBSUw6IFNDQU4gSEFEIEFOIElOVEVSTkFMIFNXIEVSUk9SIjsKKyAgICAgICAgY2FzZSBCQ01PTFRfUk9HVUVfU0NBTl9TVEFUVVNfU0NBTl9FUlJfTk9SRVM6CisgICAgICAgICAgICByZXR1cm4gIkZBSUw6IE5PIFJFU09VUkNFUyBBVkFJTEFCTEUiOworICAgICAgICBjYXNlIEJDTU9MVF9ST0dVRV9TQ0FOX1NUQVRVU19MTElEX0lTX09PUjoKKyAgICAgICAgICAgIHJldHVybiAiRkFJTDogUkVRVUVTVEVEIExMSUQgSVMgT1VUIE9GIFJBTkdFIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiT0s6IEJDTU9MVF9ST0dVRV9TQ0FOX1NUQVRVU19DT01QTEVURSI7CisgICAgfQorfQorCisvKioKKyAqIFxicmllZiBHZXQgSTJDIGFkZHJlc3MKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIEkyQyBtdXggdGFyZ2V0IGFkZHJlc3MgZm9yIHRoZSBnaXZlbiBsaW5rX2tleQorICogb2JqZWN0LgorICoKKyAqIFxwYXJhbSBlcG9uX25pIEVQT04gcG9ydCBpbmRleAorICogXHBhcmFtIGNvb3JkcyBJMkMgbXV4IHRhcmdldCBjb250YWluZXIKKyAqCisgKiBccmV0dXJuCisgKiBOb25lCisgKi8KK3N0YXRpYwordm9pZCBvbW9uX2dldF9pMmNfY29vcmRzKHVpbnQ4X3QgdHJ4X2lkLCBpMmNfY29vcmRzKiBjb29yZHMpCit7CisgICAgYmNtb2x0X3N5c3RlbV9tb2RlIHN5c3RlbV9tb2RlOworCisgICAgYmNtb2x0X3N5c3RlbV9tb2RlX2dldCgwLCAmc3lzdGVtX21vZGUpOworCisgICAgaWYgKHN5c3RlbV9tb2RlID09IEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX184X1hfQ09FWElTVEVOQ0VfVERNQSkKKyAgICB7CisgICAgICAgIGNvb3Jkcy0+Y2FkZHIgID0gYmNtOTY4NjIwX2NsaWVudF9zd2l0Y2hjdHJsX3hmcFt0cnhfaWRdWzBdOworICAgICAgICBjb29yZHMtPnNjdHJsICA9IGJjbTk2ODYyMF9jbGllbnRfc3dpdGNoY3RybF94ZnBbdHJ4X2lkXVsxXTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY29vcmRzLT5jYWRkciAgPSBiY205Njg2MjBfY2xpZW50X3N3aXRjaGN0cmxfc2ZwW3RyeF9pZF1bMF07CisgICAgICAgIGNvb3Jkcy0+c2N0cmwgID0gYmNtOTY4NjIwX2NsaWVudF9zd2l0Y2hjdHJsX3NmcFt0cnhfaWRdWzFdOworICAgIH0KK30gLyogb21vbl9nZXRfaTJjX2Nvb3JkcyAqLworCisKKy8qKgorICogXGJyaWVmIENvbmZpZ3VyZSBJMkMgbXV4CisgKgorICogVGhpcyBmdW5jdGlvbiBjb25maWd1cmVzIHRoZSBJMkMgbXV4IHRvIHRhcmdldCB0aGUgY29ycmVjdCBvcHRpY3MgbW9kdWxlIGZvcgorICogdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgUlNTSSBtZWFzdXJlbWVudC4KKyAqCisgKiBccGFyYW0gZXBvbl9uaSBFUE9OIHBvcnQgaW5kZXgKKyAqCisgKiBccmV0dXJuCisgKiBCQ01fRVJSX09LIGlmIHN1Y2Nlc3NmdWwsIGVycm9yIGNvZGUgaWYgbm90CisgKi8KK3N0YXRpYworYmNtb3NfZXJybm8gb21vbl9wbGF0Zm9ybV9jb25maWd1cmVfaTJjKHVpbnQ4X3QgdHJ4X2lkLCB1aW50OF90IHBhZ2UpCit7CisKKyAgICAgaTJjX2Nvb3JkcyBjb29yZHM7CisgICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgIG9tb25fZ2V0X2kyY19jb29yZHModHJ4X2lkLCAmY29vcmRzKTsKKworICAgICByYyA9IGJjbV9ib2FyZF9kZXZfY2hhbmdlKGNvb3Jkcy5jYWRkcik7CisgICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgICB7CisgICAgICAgICAgQkNNX0xPRyhXQVJOSU5HLCBvbW9uX2xvZ19pZCwKKyAgICAgICAgICAgICAgICAgICJiY21fYm9hcmRfZGV2X2NoYW5nZSgldSkgZmFpbGVkXG4iLCBjb29yZHMuY2FkZHIpOworICAgICB9CisgICAgIGVsc2UKKyAgICAgeworICAgICAgICAgcmMgPSBiY21fYm9hcmRfc3dpdGNoX3dyaXRlKGNvb3Jkcy5zY3RybCk7CisgICAgICAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgIHsKKyAgICAgICAgICAgICAgQkNNX0xPRyhXQVJOSU5HLCBvbW9uX2xvZ19pZCwKKyAgICAgICAgICAgICAgICAgICAgICAiYmNtX2JvYXJkX3N3aXRjaF93cml0ZSgldSkgZmFpbGVkXG4iLCBjb29yZHMuc2N0cmwpOworICAgICAgICAgfQorICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgIGlmIChwYWdlID09IFNGRl9QQUdFX0FERFIxKQorICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgcmMgPSBiY21fYm9hcmRfZGV2X2NoYW5nZShTRlBfSTJDX0FERFIxKTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgIHsgICAvLyBTRkZfUEFHRV9BRERSMgorICAgICAgICAgICAgICAgICByYyA9IGJjbV9ib2FyZF9kZXZfY2hhbmdlKFNGUF9JMkNfQUREUjIpOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIEJDTV9MT0coV0FSTklORywgb21vbl9sb2dfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmNtX2JvYXJkX2Rldl9jaGFuZ2UoJXUpIGZhaWxlZFxuIiwgKFNGUF9JMkNfQUREUjErcGFnZSkpOworICAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgfQorICAgICByZXR1cm4gcmM7CisKK30gLyogb21vbl9wbGF0Zm9ybV9jb25maWd1cmVfaTJjICovCisKKworLyoqCisgKiBcYnJpZWYgUmVhZCBNYW51ZmFjdHVyaW5nIGRhdGEgZnJvbSBPcHRpYyBNb2R1bGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBYRlAgVHJhbmNlaXZlciBEYXRhIChhY2NvcmRpbmcgdG8KKyAqIFNGRjgwNzdpIGZvciBhbiBYRlApIGZyb20gYW4gb3B0aWNzIG1vZHVsZS4gVGhlIHJlc3VsdCBpcworICogZGlzcGxheWVkIGZvciB0aGlzIHNhbXBsZSBjb2RlLgorICoKKyAqIFxwYXJhbSBlcG9uX25pIEVQT04gTkkgdG8gdGFrZSBtZWFzdXJlbWVudAorICoKKyAqIFxyZXR1cm4KKyAqIEJDTV9FUlJfT0sgaWYgc3VjY2Vzc2Z1bCwgZXJyb3IgY29kZSBpZiBub3QKKyAqLworc3RhdGljCitiY21vc19lcnJubyBvbW9uX3RyeF9zdGF0dXNfcmVhZChiY21vbHRfZXBvbl9uaSBlcG9uX25pLCBiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICB1aW50MzJfdCBzZmZfaWRlbnRpZmllciA9IDE7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworICAgIHVpbnQ4X3QgaTsKKworICAgIC8vIDgwNzcxIFhGUCBTcGVjaWZpYyBzdHVmZgorICAgIHVpbnQzMl90IHJhd192ZW5kb3JJZF84MDc3aTsKKyAgICB1aW50OF90IHZlbmRvcklkXzgwNzdpW1NGRl84MDc3aV9WRU5ET1JfTkFNRV9MRU4rMV07CisgICAgdWludDMyX3QgcmF3X3ZlbmRvclBuXzgwNzdpOworICAgIHVpbnQ4X3QgdmVuZG9yUG5fODA3N2lbU0ZGXzgwNzdpX1ZFTkRPUl9QTl9MRU4rMV07CisgICAgdWludDMyX3QgcmF3X3ZlbmRvclNuXzgwNzdpOworICAgIHVpbnQ4X3QgdmVuZG9yU25fODA3N2lbU0ZGXzgwNzdpX1ZFTkRPUl9TTl9MRU4rMV07CisgICAgdWludDMyX3QgcmF3X3ZlbmRvclJldl84MDc3aTsKKyAgICB1aW50OF90IHZlbmRvclJldl84MDc3aVtTRkZfODA3N2lfVkVORE9SX1JFVl9MRU4rMV07CisKKyAgICBtZW1zZXQoJnZlbmRvcklkXzgwNzdpLCAwLCBzaXplb2YodmVuZG9ySWRfODA3N2kpKTsKKyAgICBtZW1zZXQoJnZlbmRvclBuXzgwNzdpLCAwLCBzaXplb2YodmVuZG9yUG5fODA3N2kpKTsKKyAgICBtZW1zZXQoJnZlbmRvclNuXzgwNzdpLCAwLCBzaXplb2YodmVuZG9yU25fODA3N2kpKTsKKyAgICBtZW1zZXQoJnZlbmRvclJldl84MDc3aSwgMCwgc2l6ZW9mKHZlbmRvclJldl84MDc3aSkpOworCisgICAgLy8gODQ3MiBTRlAgU3BlY2lmaWMgc3R1ZmYKKyAgICB1aW50MzJfdCByYXdfdmVuZG9ySWRfODQ3MjsKKyAgICB1aW50OF90IHZlbmRvcklkXzg0NzJbU0ZGXzg0NzJfVkVORE9SX05BTUVfTEVOKzFdOworICAgIHVpbnQzMl90IHJhd192ZW5kb3JQbl84NDcyOworICAgIHVpbnQ4X3QgdmVuZG9yUG5fODQ3MltTRkZfODQ3Ml9WRU5ET1JfUE5fTEVOKzFdOworICAgIHVpbnQzMl90IHJhd192ZW5kb3JTbl84NDcyOworICAgIHVpbnQ4X3QgdmVuZG9yU25fODQ3MltTRkZfODQ3Ml9WRU5ET1JfU05fTEVOKzFdOworICAgIHVpbnQzMl90IHJhd192ZW5kb3JSZXZfODQ3MjsKKyAgICB1aW50OF90IHZlbmRvclJldl84NDcyW1NGRl84NDcyX1ZFTkRPUl9SRVZfTEVOKzFdOworICAgIHVpbnQzMl90IHJhd192ZW5kb3JTZmZfODQ3MjsKKyAgICB1aW50OF90IHZlbmRvclNmZl84NDcyW1NGRl84NDcyX1ZFTkRPUl9TRkZfTEVOKzFdOworICAgIHVpbnQzMl90IHJhd192ZW5kb3JPdWlfODQ3MjsKKyAgICB1aW50OF90IHZlbmRvck91aV84NDcyW1NGRl84NDcyX1ZFTkRPUl9PVUlfTEVOKzFdOworICAgIHVpbnQzMl90IHJhd19kaWFnTW9uXzg0NzI7CisgICAgdWludDhfdCBkaWFnTW9uXzg0NzIgPSAwOworICAgIHVpbnQzMl90IHJhd19lbmhhbmNlZE9wdF84NDcyOworICAgIHVpbnQ4X3QgZW5oYW5jZWRPcHRfODQ3MiA9IDA7CisKKyAgICBtZW1zZXQoJnZlbmRvcklkXzg0NzIsIDAsIHNpemVvZih2ZW5kb3JJZF84NDcyKSk7CisgICAgbWVtc2V0KCZ2ZW5kb3JQbl84NDcyLCAwLCBzaXplb2YodmVuZG9yUG5fODQ3MikpOworICAgIG1lbXNldCgmdmVuZG9yU25fODQ3MiwgMCwgc2l6ZW9mKHZlbmRvclNuXzg0NzIpKTsKKyAgICBtZW1zZXQoJnZlbmRvclJldl84NDcyLCAwLCBzaXplb2YodmVuZG9yUmV2Xzg0NzIpKTsKKyAgICBtZW1zZXQoJnZlbmRvclNmZl84NDcyLCAwLCBzaXplb2YodmVuZG9yU2ZmXzg0NzIpKTsKKyAgICBtZW1zZXQoJnZlbmRvck91aV84NDcyLCAwLCBzaXplb2YodmVuZG9yT3VpXzg0NzIpKTsKKworICAgIHVpbnQ4X3QqIHRtcHJlc3VsdDsKKyAgICBpbnQxNl90IHRlbXBfcmVzdWx0ID0gMDsKKyAgICB1aW50MzJfdCByYXdfdGVtcF9yZXN1bHQgPSAwOworCisgICAgdWludDhfdCB0cnhfaWQ7CisKKyAgICBpZiAoICEgdHJ4X2lkX2Zyb21fZXBvbl9uaShlcG9uX25pLCAmdHJ4X2lkKSApCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBvbW9uX2xvZ19pZCwKKyAgICAgICAgICAgICAgICAiVFJYIElkIGlzIGludmFsaWQgZm9yIEVQT04gTkkgJWQgXG4iLCBlcG9uX25pKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgY2hhciAqcFNmcFR5cGU7CisKKyAgICBwU2ZwVHlwZSA9ICJVTktOIjsKKworCisgICAgLy8gQ2hlY2sgZm9yIHRyYW5zZXZpZXIgcHJlc2VuY2UKKyAgICBpZiAoIChyYyA9IG9tb25fcGxhdGZvcm1fY29uZmlndXJlX2kyYyh0cnhfaWQsIFNGRl9QQUdFX0FERFIxKSkgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIC8qIFJlYWQgbW9kdWxlIGlkZW50aWZpZXIgKi8KKyAgICAgICAgaWYgKCAocmMgPSBiY21fYm9hcmRfZGV2X3JlYWQoOCwgU0ZGXzg0NzJfSURFTlRJRklFUl9BRERSLCAmc2ZmX2lkZW50aWZpZXIpKSA9PSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKHNmZl9pZGVudGlmaWVyICYgMHgwMDBGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgU0ZGX0lERU5USUZJRVJfU0ZQOgorICAgICAgICAgICAgICAgICAgICBwU2ZwVHlwZSA9ICJTRlBcMCI7CisgICAgICAgICAgICAgICAgICAgIC8vIFJlYWQgdGhlIHZlbmRvciBJZAorICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxTRkZfODQ3Ml9WRU5ET1JfTkFNRV9MRU47IGkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSByYyB8IGJjbV9ib2FyZF9kZXZfcmVhZCg4LCBTRkZfODQ3Ml9WRU5ET1JfTkFNRV9BRERSK2ksICZyYXdfdmVuZG9ySWRfODQ3Mik7CisgICAgICAgICAgICAgICAgICAgICAgICB2ZW5kb3JJZF84NDcyW2ldID0gKHVpbnQ4X3QpcmF3X3ZlbmRvcklkXzg0NzI7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBSZWFkIHRoZSBwYXJ0IE51bWJlciwgc2VyaWFsIG51bWJlciwgU0ZGIHJldmlzaW9uLCBhbmQgUmV2aXNpb24KKyAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8U0ZGXzg0NzJfVkVORE9SX1BOX0xFTjsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByYyA9IHJjIHwgYmNtX2JvYXJkX2Rldl9yZWFkKDgsIFNGRl84NDcyX1ZFTkRPUl9QTl9BRERSK2ksICZyYXdfdmVuZG9yUG5fODQ3Mik7CisgICAgICAgICAgICAgICAgICAgICAgICB2ZW5kb3JQbl84NDcyW2ldID0gKHVpbnQ4X3QpcmF3X3ZlbmRvclBuXzg0NzI7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxTRkZfODQ3Ml9WRU5ET1JfU05fTEVOOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gcmMgfCBiY21fYm9hcmRfZGV2X3JlYWQoOCwgU0ZGXzg0NzJfVkVORE9SX1NOX0FERFIraSwgJnJhd192ZW5kb3JTbl84NDcyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvclNuXzg0NzJbaV0gPSAodWludDhfdClyYXdfdmVuZG9yU25fODQ3MjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPFNGRl84NDcyX1ZFTkRPUl9SRVZfTEVOOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gcmMgfCBiY21fYm9hcmRfZGV2X3JlYWQoOCwgU0ZGXzg0NzJfVkVORE9SX1JFVl9BRERSK2ksICZyYXdfdmVuZG9yUmV2Xzg0NzIpOworICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yUmV2Xzg0NzJbaV0gPSAodWludDhfdClyYXdfdmVuZG9yUmV2Xzg0NzI7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxTRkZfODQ3Ml9WRU5ET1JfU0ZGX0xFTjsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByYyA9IHJjIHwgYmNtX2JvYXJkX2Rldl9yZWFkKDgsIFNGRl84NDcyX1ZFTkRPUl9TRkZfQUREUitpLCAmcmF3X3ZlbmRvclNmZl84NDcyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvclNmZl84NDcyW2ldID0gKHVpbnQ4X3QpcmF3X3ZlbmRvclNmZl84NDcyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPFNGRl84NDcyX1ZFTkRPUl9PVUlfTEVOOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gcmMgfCBiY21fYm9hcmRfZGV2X3JlYWQoOCwgU0ZGXzg0NzJfVkVORE9SX09VSV9BRERSK2ksICZyYXdfdmVuZG9yT3VpXzg0NzIpOworICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yT3VpXzg0NzJbaV0gPSAodWludDhfdClyYXdfdmVuZG9yT3VpXzg0NzI7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICByYyA9IHJjIHwgYmNtX2JvYXJkX2Rldl9yZWFkKDgsIFNGRl84NDcyX0RJQUdfTU9OX0FERFIsICZyYXdfZGlhZ01vbl84NDcyKTsKKyAgICAgICAgICAgICAgICAgICAgZGlhZ01vbl84NDcyID0gKHVpbnQ4X3QpcmF3X2RpYWdNb25fODQ3MjsKKworICAgICAgICAgICAgICAgICAgICByYyA9IHJjIHwgYmNtX2JvYXJkX2Rldl9yZWFkKDgsIFNGRl84NDcyX0VOSEFOQ0VEX09QVF9BRERSLCAmcmF3X2VuaGFuY2VkT3B0Xzg0NzIpOworICAgICAgICAgICAgICAgICAgICBlbmhhbmNlZE9wdF84NDcyID0gKHVpbnQ4X3QpcmF3X2VuaGFuY2VkT3B0Xzg0NzI7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gU2hpZnQgdG8gQTIKKyAgICAgICAgICAgICAgICAgICAgcmMgPSByYyB8IG9tb25fcGxhdGZvcm1fY29uZmlndXJlX2kyYyh0cnhfaWQsIFNGRl9QQUdFX0FERFIyKTsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSByYyB8IGJjbV9ib2FyZF9kZXZfcmVhZCgxNiwgU0ZGXzg0NzJfVEVNUEVSQVRVUkVfQUREUiwgJnJhd190ZW1wX3Jlc3VsdCk7CisKKyAgICAgICAgICAgICAgICAgICAgdG1wcmVzdWx0ID0gKHVpbnQ4X3QqKSgmcmF3X3RlbXBfcmVzdWx0KTsKKworICAgICAgICAgICAgICAgICAgICB0ZW1wX3Jlc3VsdCA9IHRtcHJlc3VsdFszXTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcF9yZXN1bHQgPSAodGVtcF9yZXN1bHQgPDwgOCkgfCB0bXByZXN1bHRbMl07CisKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNGRl9JREVOVElGSUVSX1hGUDoKKworICAgICAgICAgICAgICAgICAgICBwU2ZwVHlwZSA9ICJYRlBcMCI7CisgICAgICAgICAgICAgICAgICAgIC8vIFJlYWQgdGhlIHZlbmRvciBJZAorICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxTRkZfODA3N2lfVkVORE9SX05BTUVfTEVOOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gcmMgfCBiY21fYm9hcmRfZGV2X3JlYWQoOCwgU0ZGXzgwNzdpX1ZFTkRPUl9OQU1FX0FERFIraSwgJnJhd192ZW5kb3JJZF84MDc3aSk7CisgICAgICAgICAgICAgICAgICAgICAgICB2ZW5kb3JJZF84MDc3aVtpXSA9ICh1aW50OF90KXJhd192ZW5kb3JJZF84MDc3aTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIFJlYWQgdGhlIHBhcnQgTnVtYmVyLCBTTiwgYW5kIFJldmlzaW9uCisgICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPFNGRl84MDc3aV9WRU5ET1JfUE5fTEVOOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gcmMgfCBiY21fYm9hcmRfZGV2X3JlYWQoOCwgU0ZGXzgwNzdpX1ZFTkRPUl9QTl9BRERSK2ksICZyYXdfdmVuZG9yUG5fODA3N2kpOworICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yUG5fODA3N2lbaV0gPSAodWludDhfdClyYXdfdmVuZG9yUG5fODA3N2k7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxTRkZfODA3N2lfVkVORE9SX1NOX0xFTjsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByYyA9IHJjIHwgYmNtX2JvYXJkX2Rldl9yZWFkKDgsIFNGRl84MDc3aV9WRU5ET1JfU05fQUREUitpLCAmcmF3X3ZlbmRvclNuXzgwNzdpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvclNuXzgwNzdpW2ldID0gKHVpbnQ4X3QpcmF3X3ZlbmRvclNuXzgwNzdpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8U0ZGXzgwNzdpX1ZFTkRPUl9SRVZfTEVOOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gcmMgfCBiY21fYm9hcmRfZGV2X3JlYWQoOCwgU0ZGXzgwNzdpX1ZFTkRPUl9SRVZfQUREUitpLCAmcmF3X3ZlbmRvclJldl84MDc3aSk7CisgICAgICAgICAgICAgICAgICAgICAgICB2ZW5kb3JSZXZfODA3N2lbaV0gPSAodWludDhfdClyYXdfdmVuZG9yUmV2XzgwNzdpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmMgPSBCQ01fRVJSX05PREVWOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIG9tb25fbG9nX2lkLAorICAgICAgICAgICAgICAgICAgICAiVFJYIENvdWxkIG5vdCByZWFkIGRldmljZSA6IFNGRl84NDcyX0lERU5USUZJRVJfQUREUiBmb3IgUE9OICVkIHJjICVkICglcylcbiIsCisgICAgICAgICAgICAgICAgICAgIGVwb25fbmksIHJjLCBiY21vc19zdHJlcnJvcihyYykpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIG9tb25fbG9nX2lkLAorICAgICAgICAgICAgICAgICJUUlggQ291bGQgbm90IGNvbmZpZ3VyZSBwbGF0Zm9ybSA6IFNGRl9QQUdFX0FERFIxIGZvciBQT04gJWQgcmMgJWQgKCVzKVxuIiwKKyAgICAgICAgICAgICAgICBlcG9uX25pLCByYywgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICAgICAgcmMgPSBCQ01fRVJSX05PREVWOworICAgIH0KKworCisgICAgaWYgKHJjID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBpZiAoIChzZmZfaWRlbnRpZmllciAmIDB4MDAwRikgPT0gU0ZGX0lERU5USUZJRVJfWEZQKQorICAgICAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbltPTU9OXSAlcyBUcmFuY2VpdmVyIGlzIHByZXNlbnQgb24gUE9OICVkXHJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgW09NT05dIFRyeCBWZW5kb3IgSWQgaXM6ICVzXHJcbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgW09NT05dIFZlbmRvciBQYXJ0IE51bWJlcjogJXNcclxuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBbT01PTl0gVmVuZG9yIFNlcmlhbCBOdW1iZXI6ICVzXHJcbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgW09NT05dIFZlbmRvciBSZXZpc2lvbjogJXNcclxuICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2ZwVHlwZSwgZXBvbl9uaSwgdmVuZG9ySWRfODA3N2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZW5kb3JQbl84MDc3aSwgdmVuZG9yU25fODA3N2ksIHZlbmRvclJldl84MDc3aSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBTRlAgc3R1ZmYKKyAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG5bT01PTl0gJXMgVHJhbmNlaXZlciBpcyBwcmVzZW50IG9uIFBPTiAlZFxyXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBbT01PTl0gVHJ4IFZlbmRvciBJZCBpczogJXNcclxuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgW09NT05dIFZlbmRvciBQYXJ0IE51bWJlcjogJXNcclxuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgW09NT05dIFZlbmRvciBTZXJpYWwgTnVtYmVyOiAlc1xyXG4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBbT01PTl0gVmVuZG9yIFJldmlzaW9uOiAlc1xyXG4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBbT01PTl0gVmVuZG9yIE9VSTogJXNcclxuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgW09NT05dIFRyYW5zY2VpdmVyIFRlbXBlcmF0dXJlOiAlZENcclxuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgW09NT05dIEVuaGFuY2VkIE9wdGlvbnMgU0ZGLTg0NzIgQnl0ZSA5MzogJXhcclxuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgW09NT05dIERpYWdub3N0aWMgTW9uaXRvciBUeXBlIFNGRi04NDcyIEJ5dGUgOTI6ICV4XHJcbiAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNmcFR5cGUsIGVwb25fbmksIHZlbmRvcklkXzg0NzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZW5kb3JQbl84NDcyLCB2ZW5kb3JTbl84NDcyLCB2ZW5kb3JSZXZfODQ3MiwgdmVuZG9yT3VpXzg0NzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wX3Jlc3VsdC8yNTYsIGVuaGFuY2VkT3B0Xzg0NzIsIGRpYWdNb25fODQ3MiApOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfSAvKiBvbW9uX3Jzc2lfcmVhZCAqLworCisvKioKKyAqIFxicmllZiBSZWFkIFJTU0kgcmVzdWx0cyBmcm9tIEkyQworICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIFJYIFBvd2VyIE1lYXN1cmVtZW50IChTRkY4NDcyIGZvciBhbgorICogU0ZQIGFuZCBTRkY4MDc3aSBmb3IgYW4gWEZQKSBmcm9tIGFuIG9wdGljcyBtb2R1bGUuIFRoZQorICogcmVzdWx0IGlzIHN0b3JlZCBpbiB0aGUgZ2xvYmFsIG9tb25fc3RhdGUuCisgKgorICogXHBhcmFtIGVwb25fbmkgRVBPTiBOSSB0byB0YWtlIG1lYXN1cmVtZW50CisgKiBccGFyYW0gcnNzaV92YWx1ZSBSZXR1cm5lZCBSU1NJIHZhbHVlIGlmIHN1Y2Nlc3NmdWwKKyAqCisgKiBccmV0dXJuCisgKiBCQ01fRVJSX09LIGlmIHN1Y2Nlc3NmdWwsIGVycm9yIGNvZGUgaWYgbm90CisgKi8KK3N0YXRpYworYmNtb3NfZXJybm8gb21vbl9yc3NpX3JlYWQoYmNtb2x0X2Vwb25fbmkgZXBvbl9uaSwgdWludDMyX3QgKnJzc2lfdmFsdWUpCit7CisgICAgdWludDMyX3QgcmF3X3Jzc2lfcmVzdWx0ID0gMDsKKyAgICB1aW50MzJfdCBzZmZfaWRlbnRpZmllciA9IDE7CisgICAgdWludDhfdCB0cnhfaWQ7CisgICAgdWludDMyX3QgcnNzaV9yZXN1bHQgPSAwOworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKyAgICB1aW50OF90KiByZXN1bHQ7CisKKyAgICBpZiAoICEgdHJ4X2lkX2Zyb21fZXBvbl9uaShlcG9uX25pLCAmdHJ4X2lkKSApCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBvbW9uX2xvZ19pZCwKKyAgICAgICAgICAgICAgICAiVFJYIElkIGlzIGludmFsaWQgZm9yIEVQT04gTkkgJWQgXG4iLCBlcG9uX25pKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfUkFOR0U7CisgICAgfQorCisgICAgLy8gQ2hlY2sgZm9yIHRyYW5zZXZpZXIgcHJlc2VuY2UKKyAgICBpZiAoYmNtX2JvYXJkX3RyeF9wcmVzZW50KHRyeF9pZCkgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJjID0gb21vbl9wbGF0Zm9ybV9jb25maWd1cmVfaTJjKHRyeF9pZCwgU0ZGX1BBR0VfQUREUjEpOworICAgICAgICAvKiBSZWFkIG1vZHVsZSBpZGVudGlmaWVyICovCisKKyAgICAgICAgaWYgKHJjID09IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFJlYWQgbW9kdWxlIGlkZW50aWZpZXIgKi8KKyAgICAgICAgICAgIHJjID0gYmNtX2JvYXJkX2Rldl9yZWFkKDgsIFNGRl84NDcyX0lERU5USUZJRVJfQUREUiwgJnNmZl9pZGVudGlmaWVyKTsKKworICAgICAgICAgICAgaWYgKHJjID09IEJDTV9FUlJfT0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHVpbnQ4X3QqKSgmcmF3X3Jzc2lfcmVzdWx0KTsKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoc2ZmX2lkZW50aWZpZXIgJiAweDAwMEYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFNGRl9JREVOVElGSUVSX1NGUDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gb21vbl9wbGF0Zm9ybV9jb25maWd1cmVfaTJjKHRyeF9pZCwgU0ZGX1BBR0VfQUREUjIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJjID09IEJDTV9FUlJfT0spCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSBiY21fYm9hcmRfZGV2X3JlYWQoMTYsIFNGRl84NDcyX1JYX1BPV0VSX0FERFIsICZyYXdfcnNzaV9yZXN1bHQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU0ZGX0lERU5USUZJRVJfWEZQOgorCisgICAgICAgICAgICAgICAgICAgICAgICByYyA9IGJjbV9ib2FyZF9kZXZfcmVhZCgxNiwgU0ZGXzgwNzdpX1JYX1BPV0VSX0FERFIsICZyYXdfcnNzaV9yZXN1bHQpOworCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gQkNNX0VSUl9OT0RFVjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChyYyA9PSBCQ01fRVJSX09LKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcnNzaV9yZXN1bHQgPSByZXN1bHRbM107CisgICAgICAgICAgICAgICAgICAgIHJzc2lfcmVzdWx0ID0gKHJzc2lfcmVzdWx0IDw8IDgpIHwgcmVzdWx0WzJdOworCisgICAgICAgICAgICAgICAgICAgICpyc3NpX3ZhbHVlID0gcnNzaV9yZXN1bHQ7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgb21vbl9sb2dfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAiVFJYIENvdWxkIG5vdCByZWFkIGRldmljZSA6IFNGRl84NDcyX0lERU5USUZJRVJfQUREUiBmb3IgUE9OICVkIHJjICVkICglcylcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBlcG9uX25pLCByYywgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICAgICAgICAgICAgICByYyA9IEJDTV9FUlJfSU87CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBvbW9uX2xvZ19pZCwKKyAgICAgICAgICAgICAgICAgICAgIlRSWCBDb3VsZCBub3QgcmVhZCBwbGF0Zm9ybSA6IFNGRl9QQUdFX0FERFIxIGZvciBQT04gJWQgcmMgJWQgKCVzKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgZXBvbl9uaSwgcmMsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgICAgICAgICByYyA9IEJDTV9FUlJfSU87CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmMgPSBCQ01fRVJSX05PREVWOworICAgIH0KKworICAgIHJldHVybiByYzsKK30gLyogb21vbl9yc3NpX3JlYWQgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUGxhdGZvcm0gaW5kZXBlbmRlbnQgUlNTSSBtZWFzdXJlbWVudAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBcYnJpZWYgUmVhZCBYRlAvU0ZQIERhdGEgZnJvbSBUcmFuc2NlaXZlciBNb2R1bGUxCisgKgorICogVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgbWFudWZhY3R1cmluZyBkYXRhIGZyb20gdGhlIFNGUAorICogbW9kdWxlIHZpYSBJMkMuCisgKgorICogXHBhcmFtIGxpbmtfa2V5IEVQT04gTkkKKyAqCisgKiBccmV0dXJuCisgKiBOb25lCisgKi8KK3N0YXRpYwordm9pZCBvbW9uX3RyeF9zdGF0dXNfaW5pdGlhdGUoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21vbl9saW5rX2tleSAqbGlua19rZXkpCit7CisKKyAgICBiY21vc19lcnJubyByYzsKKworICAgIC8qIFBlcmZvcm0gdGhlIEkyQyBvcGVyYXRpb25zIHNwZWNpZmllZCBpbiBTRkYtODQ3MiAoU0ZQKS9TRkYtODA3N2kgKFhGUCkgdG8KKyAgICAgICByZXRyaWV2ZSB0aGUgcG1hbnVmYWN0dXJlciBkYXRhIGZyb20gdGhlIG9wdGljcyBtb2R1bGUuICovCisKKyAgICBpZiAoISBvbW9uX2lzX2Vwb25fbmlfdmFsaWQobGlua19rZXktPmVwb25fbmkpKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgb21vbl9sb2dfaWQsCisgICAgICAgICAgICAgICAgIltPTU9OXSBUUlggU3RhdHVzOiBlcG9uX25pIG9mICglZCkgaXMgb3V0IG9mIHJhbmdlIGZvciBwbGF0Zm9ybVxuIiwgbGlua19rZXktPmVwb25fbmkpOworICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyBDaGVjayBmb3IgdHJhbnNjZWl2ZXIgcHJlc2VuY2UKKworICAgIHVpbnQ4X3QgdHJ4X2lkOworCisgICAgaWYgKCAhIHRyeF9pZF9mcm9tX2Vwb25fbmkobGlua19rZXktPmVwb25fbmksICZ0cnhfaWQpICkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIG9tb25fbG9nX2lkLAorICAgICAgICAgICAgICAgICJbT01PTl0gVFJYIElkIGlzIGludmFsaWQgZm9yIEVQT04gTkkgJWQgXG4iLCBsaW5rX2tleS0+ZXBvbl9uaSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICByYyA9IGJjbV9ib2FyZF90cnhfcHJlc2VudCh0cnhfaWQpOworCisgICAgaWYgKHJjID09IEJDTV9FUlJfTk9ERVYpCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLAorICAgICAgICAgICAgICAgICJbT01PTl0gVFJYIFN0YXR1czogVHJ4X2lkICVkIE5vdCBQcmVzZW50IG9uIFBPTiAlZFxyXG4gIiwgdHJ4X2lkLCBsaW5rX2tleS0+ZXBvbl9uaSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICByYyA9IG9tb25fdHJ4X3N0YXR1c19yZWFkKHRyeF9pZCwgc2Vzc2lvbik7CisKKyAgICBpZiAocmMgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIG9tb25fbG9nX2lkLAorICAgICAgICAgICAgICAgICJbT01PTl0gSXNzdWUgVFJYIFN0YXR1czogUmVhZCBvcGVyYXRpb24gZmFpbGVkIHdpdGggcmMgJWQgKCVzKVxuIiwKKyAgICAgICAgICAgICAgICByYywgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIE5vdGlmeSBleHRlcm5hbCBob3N0IGNvZGUgb2YgdGhlIG91dGNvbWUgdGhyb3VnaCBhbiBvcHRpb25hbCBjYWxsYmFjaywKKyAgICAgICBkZWZhdWx0aW5nIHRvIG91dHB1dCBpbiB0aGUgQ0xJIHNlc3Npb24gd2hlcmUgdGhlIGNvbW1hbmQgd2FzIGluaXRpYXRlZAorICAgICAgIGlmIG5vIGNhbGxiYWNrIGlzIHN1cHBsaWVkLiAqLworCisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiXG5bT01PTl0gVFJYIFN0YXR1czogRGF0YSBvbiBQT04gJWQgQ29tcGxldGVcclxuIiwgbGlua19rZXktPmVwb25fbmkpOworfQorLyoqCisgKiBcYnJpZWYgUmVhZCBSU1NJIE1lYXN1cmVtZW50IFJlc3VsdCBmcm9tIFRyYW5zY2VpdmVyIE1vZHVsZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIHN0b3JlZCBSU1NJIG1lYXN1cmVtZW50IGZyb20gdGhlCisgKiBYRlAvU0ZQIG1vZHVsZSB2aWEgSTJDLgorICoKKyAqIFxwYXJhbSBsaW5rX2tleSBFUE9OIE5JCisgKgorICogXHJldHVybgorICogTm9uZQorICovCitzdGF0aWMKK3ZvaWQgb21vbl9yc3NpX3JlYWRfaW5pdGlhdGUoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21vbl9saW5rX2tleSAqbGlua19rZXkpCit7CisgICAgdWludDMyX3QgcnNzaV92YWx1ZSA9IDA7CisgICAgYmNtb3NfZXJybm8gcmM7CisKKyAgICBpZiAoISBvbW9uX2lzX2Vwb25fbmlfdmFsaWQobGlua19rZXktPmVwb25fbmkpKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgb21vbl9sb2dfaWQsCisgICAgICAgICAgICAgICAgIltPTU9OXSBSc3NpIFJlYWQ6IGVwb25fbmkgb2YgKCVkKSBpcyBvdXQgb2YgcmFuZ2UgZm9yIHBsYXRmb3JtXG4iLCBsaW5rX2tleS0+ZXBvbl9uaSk7CisgICAgICAgIHJldHVybiA7CisgICAgfQorCisgICAgLyogUGVyZm9ybSB0aGUgSTJDIG9wZXJhdGlvbnMgc3BlY2lmaWVkIGluIFNGRi04NDcyIChTRlApL1NGRi04MDc3aSAoWEZQKSB0bworICAgICAgIHJldHJpZXZlIHRoZSBwb3dlciBtZWFzdXJlbWVudHMgZnJvbSB0aGUgb3B0aWNzIG1vZHVsZS4gKi8KKyAgICByYyA9IG9tb25fcnNzaV9yZWFkKGxpbmtfa2V5LT5lcG9uX25pLCAmcnNzaV92YWx1ZSk7CisKKyAgICBpZiAocmMgPT0gQkNNX0VSUl9OT0RFVikKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sCisgICAgICAgICAgICAgICAgIltPTU9OXSBSc3NpIFJlYWQ6IFRSWCBOb3QgUHJlc2VudCBvbiBQT04gJWRcclxuICIsIGxpbmtfa2V5LT5lcG9uX25pKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChyYyA9PSBCQ01fRVJSX0lPKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwKKyAgICAgICAgICAgICJbT01PTl0gUnNzaSBSZWFkOiBDb3VsZCBub3QgcmVhZCBkZXZpY2UgZm9yIFBPTiAlZCBcbiIsbGlua19rZXktPmVwb25fbmkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLAorICAgICAgICAgICAgICAgICJJc3N1ZSBSU1NJIFJlYWQgb3BlcmF0aW9uIGZhaWxlZCB3aXRoIHJjICVkICglcylcbiIsCisgICAgICAgICAgICAgICAgcmMsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLyogTm90aWZ5IGV4dGVybmFsIGhvc3QgY29kZSBvZiB0aGUgb3V0Y29tZSB0aHJvdWdoIGFuIG9wdGlvbmFsIGNhbGxiYWNrLAorICAgICAgIGRlZmF1bHRpbmcgdG8gb3V0cHV0IGluIHRoZSBDTEkgc2Vzc2lvbiB3aGVyZSB0aGUgY29tbWFuZCB3YXMgaW5pdGlhdGVkCisgICAgICAgaWYgbm8gY2FsbGJhY2sgaXMgc3VwcGxpZWQuICovCisKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLAorICAgICAgICAgICAgIltPTU9OXSBSU1NJIFJlYWQgUlggUG93ZXI6IFBvbl9uaT0lZCByeCBwb3dlciAlZC4lZHVXXHJcbiIsCisgICAgICAgICAgICBsaW5rX2tleS0+ZXBvbl9uaSwKKyAgICAgICAgICAgIHJzc2lfdmFsdWUvMTAsCisgICAgICAgICAgICByc3NpX3ZhbHVlJTEwKTsKKworICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIlxuW09NT05dIFJTU0kgUmVhZCBvbiBQT04gJWQgQ29tcGxldGVcclxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rX2tleS0+ZXBvbl9uaSk7Cit9CisvKm9tb25fcnNzaV9yZWFkX2luaXRpYXRlKi8KKworCisvKioKKyAqIFxicmllZiBSZXF1ZXN0IE1hcGxlIEZpcm13YXJlIHRvIHJ1biB0aGUgUm9ndWUgT05VIExMSUQgc2Nhbi4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNlbmRzIGFuIEFQSSBtZXNzYWdlIHRvIHRoZSBPTFQgdG8gcnVuIGEgc2NhbgorICogb24gYSBzcGVjaWZpYyBFUE9OIExMSUQgb3IgYWNyb3NzIGFsbCBMTElEcyBpbiB0aGUgUE9OLgorICogUmVzdWx0cyBhcmUgcmV0dXJuZWQgdXBvbiBjb21wbGV0aW9uLiBSb2d1ZSBMTElEcyBhcmUgbWFya2VkCisgKiBhbmQgcXVhcmVudGluZWQgZm9yIHRoZSBob3N0IHRvIGV4YW1pbmUuCisgKgorICogXHBhcmFtIGxpbmtfa2V5IEVQT04gbGluayBpbmZvcm1hdGlvbgorICogXHBhcmFtIGVwb3BuX2xsaWQgIFNwZWNpZmljIExMSUQgdG8gc2NhbgorICogXHBhcmFtIHNjYW5fbW9kZSAgIFNwZWNpZmllcyBhIHNpbmdsZSBMTElEIG9yIEFsbC4KKyAqCisgKiBccmV0dXJuCisgKiBOb25lCisgKi8KKworc3RhdGljCit2b2lkIG9tb25fcnVuX3JvZ3VlX2xsaWRfc2NhbihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbW9uX2xpbmtfa2V5ICpsaW5rX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZXBvbl9sbGlkIGxsaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzY2FuX21vZGUpCit7CisgICAgY29uc3QgYmNtb2x0X2Vwb25fbmlfa2V5IG5pX2tleSA9IHsgLmVwb25fbmkgPSBsaW5rX2tleS0+ZXBvbl9uaSB9OworICAgIGJjbW9sdF9lcG9uX25pX3JvZ3VlX2xsaWRfc2NhbiBpc3N1ZV9sbGlkX3NjYW5fb3A7CisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworCisgICAgLyogUGVyZm9ybSBhbiBBUEkgb3BlcmF0aW9uIGRpcmVjdGluZyB0aGUgTWFwbGUgZmlybXdhcmUgdG8gaXNzdWUgYW4gYmNtb2x0X2Vwb25fbmlfaXNzdWVfcm9ndWVfcnhfcG93ZXIKKyAgICAgICBSU1NJIGdyYW50IHRvIHRoZSBzcGVjaWZpZWQgRVBPTiBsaW5rLiBCQ01PTFRfRVBPTl9OSV9PUEVSX0lEX0lTU1VFX1JPR1VFX1JYX1BPV0VSKi8KKworICAgIEJDTU9MVF9PUEVSX0lOSVQoJmlzc3VlX2xsaWRfc2Nhbl9vcCwgZXBvbl9uaSwgcm9ndWVfbGxpZF9zY2FuICwgbmlfa2V5KTsKKyAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmaXNzdWVfbGxpZF9zY2FuX29wLCBlcG9uX25pLCByb2d1ZV9sbGlkX3NjYW4sIG1vZGUsIHNjYW5fbW9kZSk7CisgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJmlzc3VlX2xsaWRfc2Nhbl9vcCwgZXBvbl9uaSwgcm9ndWVfbGxpZF9zY2FuLCBsbGlkLCBsbGlkKTsKKworICAgIEJDTV9MT0dfQ0FMTEVSX0ZNVChJTkZPLCBvbW9uX2xvZ19pZCwKKyAgICAgICAgICAgICJJc3N1ZSBSb2d1ZSBTY2FuIE9wZXJhdGlvbiBmb3IgTExJRCAweCV4LCBQb25fbmk9JWRcclxuIiwgbGxpZCwgbGlua19rZXktPmVwb25fbmkpOworCisgICAgcmMgPSBiY21vbHRfb3Blcl9zdWJtaXQobGlua19rZXktPmRldmljZV9pZCwgJmlzc3VlX2xsaWRfc2Nhbl9vcC5oZHIpOworCisgICAgaWYgKHJjICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBvbW9uX2xvZ19pZCwKKyAgICAgICAgICAgICAgICAiUm9ndWUgU2NhbiBPcGVyYXRpb24gRmFpbGVkIHdpdGggcmMgJWQgKCVzKVxuIiwKKyAgICAgICAgICAgICAgICByYywgYmNtb3Nfc3RyZXJyb3IocmMpKTsKKworICAgICAgICByZXR1cm47CisgICAgfQorfS8qb21vbl9ydW5fcm9ndWVfbGxpZF9zY2FuKi8KKworLyoqCisgKiBcYnJpZWYgRXhlY3V0ZSBSU1NJIG1lYXN1cmVtZW50CisgKgorICogVGhpcyBmdW5jdGlvbiBzZW5kcyBhbiBBUEkgbWVzc2FnZSB0byB0aGUgT0xUIHRvIGlzc3VlIGFuIFJTU0kgZ3JhbnQuICBJdAorICogdGhlbiByZWFkcyBiYWNrIHRoZSByZXN1bHRzIHZpYSBJMkMuIFNldCBncmFudF9sZW5ndGhfdHEgdG8gMCB0byByZXRyZWl2ZSB0aGUKKyAqIFJTU0kgdmFsdWUgd2l0aG91dCBpc3N1aW5nIHRoZSBzdHJvYmUgY29tbWFuZCB0byB0aGUgT0xULgorICoKKyAqIFxwYXJhbSBsaW5rX2tleSBFUE9OIFJTU0kgbGluayBpbmZvcm1hdGlvbgorICogXHBhcmFtIGdyYW50X2xlbmd0aF90cSBTaXplIG9mIHRoZSBSU1NJIGdyYW50CisgKiBccGFyYW0gc3RhcnRfb2Zmc2V0IFN0cm9iZSBvZmZzZXQgZnJvbSBzdGFydCBvZiB0aGUgUlNTSSBncmFudAorICogXHBhcmFtIGVuZF9vZmZzZXQgU3Ryb2JlIG9mZnNldCBmcm9tIHRoZSBlbmQgb2YgdGhlIFJTU0kgZ3JhbnQKKyAqCisgKiBccmV0dXJuCisgKiBOb25lCisgKi8KK3N0YXRpYwordm9pZCBvbW9uX3Jzc2lfbWVhc3VyZW1lbnRfaW5pdGlhdGUoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbW9uX2xpbmtfa2V5ICpsaW5rX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHRyaWdnZXJfd2lkdGhfdHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB0cmlnZ2VyX2RlbGF5X3RxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc2FtcGxlX3BlcmlvZCkKK3sKKyAgICBjb25zdCBiY21vbHRfZXBvbl9uaV9rZXkgbmlfa2V5ID0geyAuZXBvbl9uaSA9IGxpbmtfa2V5LT5lcG9uX25pIH07CisgICAgYmNtb2x0X2Vwb25fbmlfaXNzdWVfcnNzaV9ncmFudCBpc3N1ZV9yc3NpX2dyYW50X29wOworICAgIGJjbW9zX2Vycm5vIHJjID0gQkNNX0VSUl9PSzsKKworICAgIGlmICghIG9tb25faXNfZXBvbl9uaV92YWxpZChsaW5rX2tleS0+ZXBvbl9uaSkpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBvbW9uX2xvZ19pZCwKKyAgICAgICAgICAgICAgICAiW09NT05dIFJ4IFBvd2VyOiBlcG9uX25pIG9mICglZCkgaXMgb3V0IG9mIHJhbmdlIGZvciBwbGF0Zm9ybVxuIiwgbGlua19rZXktPmVwb25fbmkpOworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIHVpbnQ4X3QgdHJ4X2lkOworCisgICAgaWYgKCAhIHRyeF9pZF9mcm9tX2Vwb25fbmkobGlua19rZXktPmVwb25fbmksICZ0cnhfaWQpICkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIG9tb25fbG9nX2lkLAorICAgICAgICAgICAgICAgICJbT01PTl0gUnggUG93ZXI6IFRSWCBJZCBpcyBpbnZhbGlkIGZvciBFUE9OIE5JICVkIFxuIiwgbGlua19rZXktPmVwb25fbmkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gQ2hlY2sgZm9yIHRyYW5zZXZpZXIgcHJlc2VuY2UKKyAgICByYyA9IGJjbV9ib2FyZF90cnhfcHJlc2VudCh0cnhfaWQpOworCisgICAgaWYgKHJjID09IEJDTV9FUlJfTk9ERVYpCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLAorICAgICAgICAgICAgICAgICJbT01PTl0gUnggUG93ZXI6IFRSWCBOb3QgUHJlc2VudCBvbiBQT04gJWRcclxuICIsIGxpbmtfa2V5LT5lcG9uX25pKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIFBlcmZvcm0gYW4gQVBJIG9wZXJhdGlvbiBkaXJlY3RpbmcgdGhlIE1hcGxlIGZpcm13YXJlIHRvIGlzc3VlIGFuIGJjbW9sdF9lcG9uX25pX2lzc3VlX3JvZ3VlX3J4X3Bvd2VyCisgICAgICAgUlNTSSBncmFudCB0byB0aGUgc3BlY2lmaWVkIEVQT04gbGluay4gQkNNT0xUX0VQT05fTklfT1BFUl9JRF9JU1NVRV9ST0dVRV9SWF9QT1dFUiovCisKKyAgICBCQ01PTFRfT1BFUl9JTklUKCZpc3N1ZV9yc3NpX2dyYW50X29wLCBlcG9uX25pLCBpc3N1ZV9yc3NpX2dyYW50ICwgbmlfa2V5KTsKKyAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmaXNzdWVfcnNzaV9ncmFudF9vcCwgZXBvbl9uaSwgaXNzdWVfcnNzaV9ncmFudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBncmFudGVkX2xpbmssIGxpbmtfa2V5LT5tYWNfYWRkcmVzcyk7CisgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJmlzc3VlX3Jzc2lfZ3JhbnRfb3AsIGVwb25fbmksIGlzc3VlX3Jzc2lfZ3JhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcl93aWR0aCwgdHJpZ2dlcl93aWR0aF90cSk7CisgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJmlzc3VlX3Jzc2lfZ3JhbnRfb3AsIGVwb25fbmksIGlzc3VlX3Jzc2lfZ3JhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcl9kZWxheSwgdHJpZ2dlcl9kZWxheV90cSk7CisgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJmlzc3VlX3Jzc2lfZ3JhbnRfb3AsIGVwb25fbmksIGlzc3VlX3Jzc2lfZ3JhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlX3BlcmlvZCwgc2FtcGxlX3BlcmlvZCk7CisKKyAgICByYyA9IGJjbW9sdF9vcGVyX3N1Ym1pdChsaW5rX2tleS0+ZGV2aWNlX2lkLCAmaXNzdWVfcnNzaV9ncmFudF9vcC5oZHIpOworICAgIGlmIChyYyAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgb21vbl9sb2dfaWQsCisgICAgICAgICAgICAgICAgImlzc3VlIFJTU0kgZ3JhbnQgb3BlcmF0aW9uIGZhaWxlZCB3aXRoIHJjICVkICglcylcbiIsCisgICAgICAgICAgICAgICAgcmMsIGJjbW9zX3N0cmVycm9yKHJjKSk7CisKKyAgICAgICAgcmV0dXJuOworICAgIH0KK30KKy8qb21vbl9yc3NpX21lYXN1cmVtZW50X2luaXRpYXRlKi8KKworLy8gcnNzaSBzcGVjaWZpYyBpbmRpY2F0aW9uIGhhbmRsZXIgaW50ZXJmYWNlIC0tCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X3VzZXJfYXBwbF9yc3NpX2hhbmRsZV9pbmQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjbW9sdF9hdXRvICppbmQpCit7CisKKyAgICBiY21vbHRfZXBvbl9uaV9yc3NpX21lYXN1cmVtZW50X2NvbXBsZXRlZCogb21vbl9pbmQ7CisgICAgdWludDMyX3QgcnNzaV92YWx1ZSA9IDA7CisgICAgYmNtb2x0X2Vwb25fbmkgZXBvbl9uaTsKKyAgICBiY21vc19lcnJubyByYyA9IEJDTV9FUlJfT0s7CisgICAgY2hhciB0QnVmWzQwXTsKKworICAgIG9tb25faW5kID0gKGJjbW9sdF9lcG9uX25pX3Jzc2lfbWVhc3VyZW1lbnRfY29tcGxldGVkICopIGluZDsKKyAgICBlcG9uX25pID0gb21vbl9pbmQtPmtleS5lcG9uX25pOworCisgICAgaWYgKG9tb25faW5kLT5kYXRhLnN0YXR1cyA9PSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1MpCisgICAgeworICAgICAgICAvKiBQZXJmb3JtIHRoZSBJMkMgb3BlcmF0aW9ucyBzcGVjaWZpZWQgaW4gU0ZGLTg0NzIgKFNGUCkvU0ZGLTgwNzdpIChYRlApIHRvCisgICAgICAgICAgIHJldHJpZXZlIHRoZSBwb3dlciBtZWFzdXJlbWVudHMgZnJvbSB0aGUgb3B0aWNzIG1vZHVsZS4gKi8KKyAgICAgICAgcmMgPSBvbW9uX3Jzc2lfcmVhZChlcG9uX25pLCAmcnNzaV92YWx1ZSk7CisKKyAgICB9CisgICAgLyogTm90aWZ5IGV4dGVybmFsIGhvc3QgY29kZSBvZiB0aGUgb3V0Y29tZSB0aHJvdWdoIGFuIG9wdGlvbmFsIGNhbGxiYWNrLAorICAgICAgIGRlZmF1bHRpbmcgdG8gb3V0cHV0IGluIHRoZSBDTEkgc2Vzc2lvbiB3aGVyZSB0aGUgY29tbWFuZCB3YXMgaW5pdGlhdGVkCisgICAgICAgaWYgbm8gY2FsbGJhY2sgaXMgc3VwcGxpZWQuICovCisKKyAgICBCQ01fTE9HX0NBTExFUl9GTVQoSU5GTywgb21vbl9sb2dfaWQsCisgICAgICAgICAgICAiIFJTU0kgSW5kaWNhdGlvbiBSY3Y6IGZvciBMaW5rIE1hYyAlcywgTExJRCAweCV4LCBEZXY9JTAxZCwgUG9uX25pPSVkXHJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX21hY18yX3N0cigmb21vbl9pbmQtPmRhdGEubGlua19tYWMsIHRCdWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgIG9tb25faW5kLT5kYXRhLmxsaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgIG9tb25faW5kLT5rZXkuZXBvbl9uaSk7CisKKyAgICBpZiAocmMgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIEJDTV9MT0coSU5GTywgb21vbl9sb2dfaWQsCisgICAgICAgICAgICAgICAgICIgJXMgbWVhc3VyZWQgcnggcG93ZXIgJWQuJWR1VyByYXdfZGF0YSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAob21vbl9pbmQtPmRhdGEuc3RhdHVzID09IEJDTU9MVF9SRVNVTFRfU1VDQ0VTUyA/ICJTdWNjZWVkZWQiIDogIkZhaWxlZCIpLAorICAgICAgICAgICAgICAgICAgIHJzc2lfdmFsdWUvMTAsIHJzc2lfdmFsdWUlMTAsIHJzc2lfdmFsdWUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBCQ01fTE9HKElORk8sIG9tb25fbG9nX2lkLAorICAgICAgICAgICAgInBvbiAlZCwgZmFpbGVkIHdpdGggZXJybm8gJWQgKCVzKVxuIiwKKyAgICAgICAgICAgICAgICAgIGVwb25fbmksIHJjLCBiY21vc19zdHJlcnJvcihyYykpOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKy8vIGVwb24gcm9ndWUgb251IHNwZWNpZmljIGluZGljYXRpb24gaGFuZGxlciBpbnRlcmZhY2UgLS0KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfdXNlcl9hcHBsX3JvZ3VlX2hhbmRsZV9pbmQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBpbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2F1dG8gKmluZCkKK3sKKyAgICAodm9pZClpbnN0YW5jZTsKKyAgICBiY21vbHRfZXBvbl9kZW5pZWRfbGlua19yb2d1ZV92aW9sYXRpb24qIHJvZ3VlX2luZDsKKyAgICBjaGFyIHRCdWZbNDBdOworCisgICAgcm9ndWVfaW5kID0gKGJjbW9sdF9lcG9uX2RlbmllZF9saW5rX3JvZ3VlX3Zpb2xhdGlvbiAqKSBpbmQ7CisKKyAgICAvKiBOb3RpZnkgZXh0ZXJuYWwgaG9zdCBjb2RlIG9mIHRoZSBvdXRjb21lIHRocm91Z2ggYW4gb3B0aW9uYWwgY2FsbGJhY2ssCisgICAgICAgZGVmYXVsdGluZyB0byBvdXRwdXQgaW4gdGhlIENMSSBzZXNzaW9uIHdoZXJlIHRoZSBjb21tYW5kIHdhcyBpbml0aWF0ZWQKKyAgICAgICBpZiBubyBjYWxsYmFjayBpcyBzdXBwbGllZC4gKi8KKworICAgIEJDTV9MT0dfQ0FMTEVSX0ZNVChJTkZPLCBvbW9uX2xvZ19pZCwKKyAgICAgICAgICAgICJSb2d1ZSBPTlUgU2NhbiBWaW9sYXRpb246IEFsbVN0YXRlID0gJXMsIExpbmsgTWFjICVzLCBMTElEIDB4JXgsIFJhbmdlPSUwZCwgUG9uX25pPSUyZFxyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAocm9ndWVfaW5kLT5kYXRhLmFsYXJtX3N0YXR1cy5hbGFybV9zdGF0dXMgPT0gQkNNT0xUX1NUQVRVU19PTiA/ICJPTiIgOiAiT0ZGIiksCisgICAgICAgICAgICAgICAgICAgICAgIGJjbW9zX21hY18yX3N0cigmcm9ndWVfaW5kLT5rZXkubWFjX2FkZHJlc3MsIHRCdWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJvZ3VlX2luZC0+ZGF0YS5hbGFybV9zdGF0dXMuZGVuaWVkX2xsaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgcm9ndWVfaW5kLT5kYXRhLmFsYXJtX3N0YXR1cy5kZW5pZWRfcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgcm9ndWVfaW5kLT5rZXkuZXBvbl9uaSk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworLy8gZXBvbiByb2d1ZSBzY2FuIGNvbXBsZXRlIHNwZWNpZmljIGluZGljYXRpb24gaGFuZGxlciBpbnRlcmZhY2UgLS0KK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfdXNlcl9hcHBsX3JvZ3VlX2NvbXBsZXRlX2hhbmRsZV9pbmQoYmNtb2x0X2RldmlkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBpbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmNtb2x0X2F1dG8gKmluZCkKK3sKKyAgICAodm9pZClpbnN0YW5jZTsKKyAgICBiY21vbHRfZXBvbl9uaV9yb2d1ZV9zY2FuX2NvbXBsZXRlKiByb2d1ZV9pbmQ7CisKKyAgICByb2d1ZV9pbmQgPSAoYmNtb2x0X2Vwb25fbmlfcm9ndWVfc2Nhbl9jb21wbGV0ZSAqKSBpbmQ7CisKKyAgICAvKiBOb3RpZnkgZXh0ZXJuYWwgaG9zdCBjb2RlIG9mIHRoZSBvdXRjb21lIHRocm91Z2ggYW4gb3B0aW9uYWwgY2FsbGJhY2ssCisgICAgICAgZGVmYXVsdGluZyB0byBvdXRwdXQgaW4gdGhlIENMSSBzZXNzaW9uIHdoZXJlIHRoZSBjb21tYW5kIHdhcyBpbml0aWF0ZWQKKyAgICAgICBpZiBubyBjYWxsYmFjayBpcyBzdXBwbGllZC4gKi8KKworICAgIEJDTV9MT0dfQ0FMTEVSX0ZNVChJTkZPLCBvbW9uX2xvZ19pZCwKKyAgICAgICAgICAgICJSb2d1ZSBPTlUgc2NhbiBjb21wbGV0ZSBmb3IgUG9uICVkLCBTdGF0dXMgPSAlc1xyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICByb2d1ZV9pbmQtPmtleS5lcG9uX25pLAorICAgICAgICAgICAgICAgICAgICAgICBiY21vbHRfZ2V0X3NjYW5fcmVzdWx0KHJvZ3VlX2luZC0+ZGF0YS5yZXR1cm5faW5kX3N0YXR1cykpOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisvLyBwdWJsaWMgaW5kaWNhdGlvbiBoYW5kbGVyIGludGVyZmFjZSAtLSBjYWxsZWQgaW4gdHJhbnNwb3J0IGxheWVyIGNvbnRleHQKK2JjbW9zX2Vycm5vIGJjbW9sdF91c2VyX2FwcGxfb21vbl9oYW5kbGVfaW5kKGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQsIHVpbnQ4X3QgaW5zdGFuY2UsIGJjbW9sdF9hdXRvICppbmQpCit7CisKKyAgICAvLyBOb3QgYW4gZXJyb3IsIHdlIGp1c3QgZG9uJ3QgY2FyZSBhYm91dCB0aGlzIGluZGljYXRpb24uCisgICAgYmNtb3NfZXJybm8gcmMgPSBCQ01fRVJSX09LOworCisgICAgLy8gV2UgbG9vayBhdCBtZXNzYWdlIHRhcmdldHRpbmcgZXBvbiBuaS4KKyAgICBpZiAoaW5kLT5oZHIub2JqX3R5cGUgPT0gQkNNT0xUX09CSl9JRF9FUE9OX05JKQorICAgIHsKKyAgICAgICAgLy8gV2UgbG9vayBhdCBSU1NJIENvbXBsZXRpb24gZXZlbnQgaW5kaWNhdGlvbnMuCisgICAgICAgIGlmIChpbmQtPmhkci5zdWJncm91cCA9PSAodWludDE2X3QpQkNNT0xUX0VQT05fTklfQVVUT19JRF9SU1NJX01FQVNVUkVNRU5UX0NPTVBMRVRFRCkKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBiY21vbHRfdXNlcl9hcHBsX3Jzc2lfaGFuZGxlX2luZChkZXZpY2VfaWQsaW5zdGFuY2UsaW5kKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFdlIGxvb2sgZm9yIFJvZ3VlIFNjYW4gQ29tcGxldGUgZXZlbnQgaW5kaWNhdGlvbnMuCisgICAgICAgICAgICBpZiAoaW5kLT5oZHIuc3ViZ3JvdXAgPT0gKHVpbnQxNl90KUJDTU9MVF9FUE9OX05JX0FVVE9fSURfUk9HVUVfU0NBTl9DT01QTEVURSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByYyA9IGJjbW9sdF91c2VyX2FwcGxfcm9ndWVfY29tcGxldGVfaGFuZGxlX2luZChkZXZpY2VfaWQsIGluc3RhbmNlLCBpbmQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHJjICE9IEJDTV9FUlJfT0sgKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HX0NBTExFUl9GTVQoSU5GTywgb21vbl9sb2dfaWQsCisgICAgICAgICAgICAgICAgICAgICJPTU9OIEhhbmRsZSBJbmRpY2F0aW9uIEVycm9yOiBQb24gJWQsIFR5cGUgJWQsIFJjICVkXHJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsIGluZC0+aGRyLnN1Ymdyb3VwLCByYyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3QgYW4gZXJyb3IsIHdlIGp1c3QgZG9uJ3QgY2FyZSBhYm91dCB0aGlzIGluZGljYXRpb24uCisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKworICAgIC8vIFdlIGxvb2sgYXQgbWVzc2FnZSB0YXJnZXR0aW5nIGVwb24gZGVuaWVkIGxpbmtzLgorICAgIGlmIChpbmQtPmhkci5vYmpfdHlwZSA9PSBCQ01PTFRfT0JKX0lEX0VQT05fREVOSUVEX0xJTkspCisgICAgeworICAgICAgICAvLyBXZSBsb29rIGF0IERlbmllZCBMaW5rIEV2ZW50cyBvZiB0aGlzIHR5cGUuCisgICAgICAgIGlmIChpbmQtPmhkci5zdWJncm91cCA9PSBCQ01PTFRfRVBPTl9ERU5JRURfTElOS19BVVRPX0lEX1JPR1VFX1ZJT0xBVElPTikKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBiY21vbHRfdXNlcl9hcHBsX3JvZ3VlX2hhbmRsZV9pbmQoZGV2aWNlX2lkLCBpbnN0YW5jZSwgaW5kKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE5vdCBhbiBlcnJvciwgd2UganVzdCBkb24ndCBjYXJlIGFib3V0IHRoaXMgb2JqZWN0LgorICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJjOworCit9IC8qIGJjbW9sdF91c2VyX2FwcGxfb21vbl9oYW5kbGVfaW5kICovCisKKy8qKgorICogXGJyaWVmIE9wdGljYWwgbW9uaXRvcmluZyB0YXNrIG1lc3NhZ2UgaGFuZGxlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdGhlIG9wdGljYWwgbW9uaXRvcmluZyB0YXNrIGhhbmRsZXIuICBBdCB0aGlzIHRpbWUgdGhlIG9ubHkKKyAqIG1lc3NhZ2UgaXMgQkNNT1NfTVNHX0lEX0lOSVRJQVRFX1JTU0lfU0FNUExFIHdoaWNoIHN0YXJ0cyB0aGUgUlNTSQorICogbWVhc3VyZW1lbnQgb24gdGhlIE9MVC4KKyAqCisgKiBccGFyYW0gbW9kdWxlX2lkIEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfT01PTgorICogXHBhcmFtIG9zX21zZyBNZXNzYWdlIGNvbnRlbnRzCisgKi8KK3N0YXRpYwordm9pZCBvbW9uX29zX21zZ19oYW5kbGUoYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZCwgYmNtb3NfbXNnICpvc19tc2cpCit7CisgICAgb21vbl90YXNrX21zZyAqbXNnID0gKG9tb25fdGFza19tc2cgKilvc19tc2c7CisKKyAgICBzd2l0Y2ggKG1zZy0+b3NfbXNnLnR5cGUpCisgICAgeworICAgIGNhc2UgQkNNT1NfTVNHX0lEX0lOSVRJQVRFX1JYX1BPV0VSOgorICAgICAgICAgICAgb21vbl9yc3NpX21lYXN1cmVtZW50X2luaXRpYXRlKG1zZy0+c2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtc2ctPmxpbmtfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLT50cmlnZ2VyX3dpZHRoX25zICwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy0+dHJpZ2dlcl9kZWxheV9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy0+c2FtcGxlX3BlcmlvZF91cyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkNNT1NfTVNHX0lEX0lOSVRJQVRFX1RSWF9TVEFUVVM6CisKKyAgICAgICAgICAgIG9tb25fdHJ4X3N0YXR1c19pbml0aWF0ZShtc2ctPnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1zZy0+bGlua19rZXkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT1NfTVNHX0lEX0lOSVRJQVRFX1JPR1VFX1NDQU46CisgICAgICAgICAgICBvbW9uX3J1bl9yb2d1ZV9sbGlkX3NjYW4obXNnLT5zZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtc2ctPmxpbmtfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy0+bGxpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2ctPnNjYW5fbW9kZSk7CisKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCQ01PU19NU0dfSURfSU5JVElBVEVfUlNTSV9SRUFEOgorICAgICAgICAgICAgb21vbl9yc3NpX3JlYWRfaW5pdGlhdGUobXNnLT5zZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtc2ctPmxpbmtfa2V5KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBiY21vc19mcmVlKG9zX21zZyk7Cit9IC8qIG9tb25fb3NfbXNnX2hhbmRsZSAqLworCisKKy8qKgorICogXGJyaWVmIFN0YXJ0IHRoZSBvcHRpY2FsIG1vbml0b3JpbmcgdGFzaworICoKKyAqIFRoaXMgZnVuY3Rpb24gc3RhcnRzIHRoZSB1c2VyIGxldmVsIG9wdGljYWwgbW9uaXRvcmluZyB0YXNrIGFuZCBjcmVhdGVzIHRoZQorICogb3B0aWNhbCBtb25pdG9yaW5nIG1vZHVsZS4gIEl0IHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbmNlIGF0IHN0YXJ0IHVwLgorICoKKyAqIFxyZXR1cm4KKyAqIE5vbmUKKyAqLwordm9pZCBiY21vbHRfZXBvbl9vbW9uX2FwcGxfaW5pdCh2b2lkKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGJjbW9zX3Rhc2tfcGFybSB0YXNrX3BhcmFtcyA9CisgICAgeworICAgICAgICAubmFtZSA9ICJ1c2VyX2FwcGxfb21vbiIsCisgICAgICAgIC5wcmlvcml0eSA9IFRBU0tfUFJJT1JJVFlfVVNFUl9BUFBMX09NT04sCisgICAgICAgIC5jb3JlID0gQkNNT1NfQ1BVX0NPUkVfQU5ZLCAvKiBObyBDUFUgYWZmaW5pdHkgKi8KKyAgICAgICAgLmluaXRfaGFuZGxlciA9IE5VTEwKKyAgICB9OworICAgIGJjbW9zX21vZHVsZV9wYXJtIG1vZHVsZV9wYXJhbXMgPQorICAgIHsKKyAgICAgICAgLnFwYXJtID0KKyAgICAgICAgeworICAgICAgICAgICAgLm5hbWUgPSAidXNlcl9hcHBsX29tb24iLAorICAgICAgICAgICAgLnNpemUgPSBPTU9OX1RBU0tfTVNHX1FfU0laRQorICAgICAgICB9CisgICAgfTsKKworICAgIGlmIChpc19ydW5uaW5nKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG9tb25fbG9nX2lkID0gYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIoInVzZXJfYXBwbF9vbW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVZfTE9HX0xFVkVMX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVWX0xPR19JRF9UWVBFX0JPVEgpOworICAgIEJVR19PTihERVZfTE9HX0lOVkFMSURfSUQgPT0gb21vbl9sb2dfaWQpOworCisgICAgcmMgPSBiY21vc190YXNrX2NyZWF0ZSgmb21vbl90YXNrLCAmdGFza19wYXJhbXMpOworICAgIEJVR19PTihyYyAhPSBCQ01fRVJSX09LKTsKKworICAgIHJjID0gYmNtb3NfbW9kdWxlX2NyZWF0ZShCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX09NT04sICZvbW9uX3Rhc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2R1bGVfcGFyYW1zKTsKKyAgICBCVUdfT04ocmMgIT0gQkNNX0VSUl9PSyk7CisKKyAgICBpc19ydW5uaW5nID0gQkNNT1NfVFJVRTsKK30gLyogYmNtb2x0X2Vwb25fb21vbl9hcHBsX2luaXQgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ0xJCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKgorICogXGJyaWVmIFJYIHBvd2VyIHNhbXBsZSBDTEkgY29tbWFuZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgInNhbXBsZSIgQ0xJIGNvbW1hbmQuICBJdCBwcm9jZXNzZXMgdGhlIENMSQorICogcGFyYW1ldGVycyBhbmQgZGlzcGF0Y2hlcyBhIHN0YXJ0IHNhbXBsZSBtZXNzYWdlIHRvIHRoZSBvcHRpY2FsIG1vbml0b3JpbmcKKyAqIHRhc2suCisgKgorICogXHBhcmFtIHNlc3Npb24gQ0xJIHNlc3Npb24gSUQKKyAqIFxwYXJhbSBwYXJtIENvbW1hbmQgcGFyYW1ldGVycworICogXHBhcmFtIG5fcGFybXMgTnVtYmVyIG9mIHBhcmFtZXRlcnMKKyAqCisgKiBccmV0dXJuCisgKiBCQ01fRVJSX09LIGlmIHN1Y2Nlc3NmdWwsIGVycm9yIGNvZGUgaWYgbm90CisgKi8KK3N0YXRpYworYmNtb3NfZXJybm8gb21vbl9jbWRfcnhfcG93ZXIoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIG9tb25fbGlua19rZXkgbGlua19rZXk7CisgICAgYmNtb3NfZXJybm8gcmM7CisgICAgYmNtY2xpX2NtZF9wYXJtICplcG9uX25pOworICAgIGJjbWNsaV9jbWRfcGFybSAqbWFjX2FkZHI7CisgICAgYmNtY2xpX2NtZF9wYXJtICpUd2lkdGhfbnM7CisgICAgYmNtY2xpX2NtZF9wYXJtICpUZGVsYXlfbnM7CisgICAgYmNtY2xpX2NtZF9wYXJtICpUc2FtcGxlX3VzOworICAgIG9tb25fdGFza19tc2cgKm1zZzsKKworICAgIC8qIEdldCB0aGUgQ0xJIHBhcmFtZXRlcnMuICovCisgICAgZXBvbl9uaSAgICA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImVwb25fbmkiKTsKKyAgICBtYWNfYWRkciAgID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZ3JhbnRlZF9saW5rIik7CisgICAgVHdpZHRoX25zICA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRyaWdnZXJfd2lkdGgiKTsgIC8vIFJTU0kgVHdpZHRoIGluIG5zCisgICAgVGRlbGF5X25zICA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInRyaWdnZXJfZGVsYXkiKTsgIC8vIFJTU0kgVGRlbGF5IGluIG5zCisgICAgVHNhbXBsZV91cyA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInNhbXBsZV9wZXJpb2QiKTsgIC8vIFJTU0kgVHNhbXBsZSBpbiB1cworCisgICAgbGlua19rZXkuZGV2aWNlX2lkID0gY3VycmVudF9kZXZpY2U7CisgICAgbGlua19rZXkuZXBvbl9uaSA9IChiY21vbHRfZXBvbl9uaSllcG9uX25pLT52YWx1ZS5udW1iZXI7CisgICAgbGlua19rZXkubWFjX2FkZHJlc3MgPSAoYmNtb3NfbWFjX2FkZHJlc3MpbWFjX2FkZHItPnZhbHVlLm1hYzsKKworICAgIC8qIFNlbmQgYW4gaW5kaWNhdGlvbiB0byB0aGUgaW50ZXJuYWwgdGFzaydzIG1lc3NhZ2UgcXVldWUgdG8gYmUKKyAgICAgICBwcm9jZXNzZWQuICovCisgICAgbXNnID0gYmNtb3NfY2FsbG9jKHNpemVvZigqbXNnKSk7CisgICAgQlVHX09OKG1zZyA9PSBOVUxMKTsKKyAgICBtc2ctPm9zX21zZy50eXBlID0gQkNNT1NfTVNHX0lEX0lOSVRJQVRFX1JYX1BPV0VSOworICAgIG1zZy0+b3NfbXNnLmhhbmRsZXIgPSBvbW9uX29zX21zZ19oYW5kbGU7CisgICAgbXNnLT5saW5rX2tleSA9IGxpbmtfa2V5OworICAgIG1zZy0+dHJpZ2dlcl93aWR0aF9ucyA9IFR3aWR0aF9ucy0+dmFsdWUubnVtYmVyOworICAgIG1zZy0+dHJpZ2dlcl9kZWxheV9ucyA9IFRkZWxheV9ucy0+dmFsdWUubnVtYmVyOworICAgIG1zZy0+c2FtcGxlX3BlcmlvZF91cyA9IFRzYW1wbGVfdXMtPnZhbHVlLm51bWJlcjsKKyAgICBtc2ctPnNlc3Npb24gPSBzZXNzaW9uOworICAgIHJjID0gYmNtb3NfbXNnX3NlbmRfdG9fbW9kdWxlKEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfT01PTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXNnLT5vc19tc2csIDApOworICAgIEJVR19PTihyYyk7CisKKworICAgIHJldHVybiByYzsKK30gLyogb21vbl9jbWRfc2FtcGxlICovCisKK3N0YXRpYworYmNtb3NfZXJybm8gb21vbl9jbWRfdHJ4X2RhdGEoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBvbW9uX2xpbmtfa2V5IGxpbmtfa2V5OworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGJjbWNsaV9jbWRfcGFybSAqZXBvbl9uaTsKKyAgICBvbW9uX3Rhc2tfbXNnICptc2c7CisKKyAgICAvKiBHZXQgdGhlIENMSSBwYXJhbWV0ZXJzLiAqLworICAgIGVwb25fbmkgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisKKyAgICBsaW5rX2tleS5kZXZpY2VfaWQgPSBjdXJyZW50X2RldmljZTsKKyAgICBsaW5rX2tleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKWVwb25fbmktPnZhbHVlLm51bWJlcjsKKworICAgIC8qIFNlbmQgYW4gaW5kaWNhdGlvbiB0byB0aGUgaW50ZXJuYWwgdGFzaydzIG1lc3NhZ2UgcXVldWUgdG8gYmUKKyAgICAgICBwcm9jZXNzZWQuICovCisgICAgbXNnID0gYmNtb3NfY2FsbG9jKHNpemVvZigqbXNnKSk7CisgICAgQlVHX09OKG1zZyA9PSBOVUxMKTsKKyAgICBtc2ctPm9zX21zZy50eXBlID0gQkNNT1NfTVNHX0lEX0lOSVRJQVRFX1RSWF9TVEFUVVM7CisgICAgbXNnLT5vc19tc2cuaGFuZGxlciA9IG9tb25fb3NfbXNnX2hhbmRsZTsKKyAgICBtc2ctPmxpbmtfa2V5ID0gbGlua19rZXk7CisgICAgbXNnLT5zZXNzaW9uID0gc2Vzc2lvbjsKKyAgICByYyA9IGJjbW9zX21zZ19zZW5kX3RvX21vZHVsZShCQ01PU19NT0RVTEVfSURfVVNFUl9BUFBMX09NT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1zZy0+b3NfbXNnLCAwKTsKKyAgICBCVUdfT04ocmMpOworCisKKyAgICByZXR1cm4gcmM7Cit9CisvKiBvbW9uX2NtZF90cnhfZGF0YSAqLworCitzdGF0aWMKK2JjbW9zX2Vycm5vIG9tb25fY21kX3JlYWRfcnNzaV9yZXN1bHQoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBvbW9uX2xpbmtfa2V5IGxpbmtfa2V5OworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGJjbWNsaV9jbWRfcGFybSAqZXBvbl9uaTsKKyAgICBvbW9uX3Rhc2tfbXNnICptc2c7CisKKyAgICAvKiBHZXQgdGhlIENMSSBwYXJhbWV0ZXJzLiAqLworICAgIGVwb25fbmkgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisKKyAgICBsaW5rX2tleS5kZXZpY2VfaWQgPSBjdXJyZW50X2RldmljZTsKKyAgICBsaW5rX2tleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKWVwb25fbmktPnZhbHVlLm51bWJlcjsKKworICAgIC8qIFNlbmQgYW4gaW5kaWNhdGlvbiB0byB0aGUgaW50ZXJuYWwgdGFzaydzIG1lc3NhZ2UgcXVldWUgdG8gYmUKKyAgICAgICBwcm9jZXNzZWQuICovCisgICAgbXNnID0gYmNtb3NfY2FsbG9jKHNpemVvZigqbXNnKSk7CisgICAgQlVHX09OKG1zZyA9PSBOVUxMKTsKKyAgICBtc2ctPm9zX21zZy50eXBlID0gQkNNT1NfTVNHX0lEX0lOSVRJQVRFX1JTU0lfUkVBRDsKKyAgICBtc2ctPm9zX21zZy5oYW5kbGVyID0gb21vbl9vc19tc2dfaGFuZGxlOworICAgIG1zZy0+bGlua19rZXkgPSBsaW5rX2tleTsKKyAgICBtc2ctPnNlc3Npb24gPSBzZXNzaW9uOworICAgIHJjID0gYmNtb3NfbXNnX3NlbmRfdG9fbW9kdWxlKEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfT01PTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXNnLT5vc19tc2csIDApOworICAgIEJVR19PTihyYyk7CisKKworICAgIHJldHVybiByYzsKK30KKy8qIG9tb25fY21kX3JlYWRfcnNzaV9yZXN1bHQgKi8KKworc3RhdGljCitiY21vc19lcnJubyBvbW9uX2NtZF9sbGlkX3NjYW4oYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBvbW9uX2xpbmtfa2V5IGxpbmtfa2V5OworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGJjbWNsaV9jbWRfcGFybSAqZXBvbl9uaTsKKyAgICBiY21jbGlfY21kX3Bhcm0gKmVwb25fbGxpZDsKKyAgICBiY21jbGlfY21kX3Bhcm0gKmVwb25fbW9kZTsKKyAgICBvbW9uX3Rhc2tfbXNnICptc2c7CisKKyAgICAvKiBHZXQgdGhlIENMSSBwYXJhbWV0ZXJzLiAqLworICAgIGVwb25fbmkgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJlcG9uX25pIik7CisgICAgZXBvbl9tb2RlID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic2Nhbl9tb2RlIik7CisgICAgZXBvbl9sbGlkID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZXBvbl9sbGlkIik7CisKKyAgICBsaW5rX2tleS5kZXZpY2VfaWQgPSBjdXJyZW50X2RldmljZTsKKyAgICBsaW5rX2tleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKWVwb25fbmktPnZhbHVlLm51bWJlcjsKKworICAgIC8qIFNlbmQgYW4gaW5kaWNhdGlvbiB0byB0aGUgaW50ZXJuYWwgdGFzaydzIG1lc3NhZ2UgcXVldWUgdG8gYmUKKyAgICAgICBwcm9jZXNzZWQuICovCisgICAgbXNnID0gYmNtb3NfY2FsbG9jKHNpemVvZigqbXNnKSk7CisgICAgQlVHX09OKG1zZyA9PSBOVUxMKTsKKyAgICBtc2ctPm9zX21zZy50eXBlID0gQkNNT1NfTVNHX0lEX0lOSVRJQVRFX1JPR1VFX1NDQU47CisgICAgbXNnLT5vc19tc2cuaGFuZGxlciA9IG9tb25fb3NfbXNnX2hhbmRsZTsKKyAgICBtc2ctPmxpbmtfa2V5ID0gbGlua19rZXk7CisgICAgbXNnLT5zZXNzaW9uID0gc2Vzc2lvbjsKKyAgICBtc2ctPmxsaWQgPSBlcG9uX2xsaWQtPnZhbHVlLm51bWJlcjsKKyAgICBtc2ctPnNjYW5fbW9kZSA9IGVwb25fbW9kZS0+dmFsdWUubnVtYmVyOworICAgIHJjID0gYmNtb3NfbXNnX3NlbmRfdG9fbW9kdWxlKEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfT01PTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXNnLT5vc19tc2csIDApOworICAgIEJVR19PTihyYyk7CisKKworICAgIHJldHVybiByYzsKK30KKworCisvKioKKyAqIFxicmllZiBJbnN0YWxsIENMSSBjb21tYW5kcworICoKKyAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhbmQgb3B0aWNhbCBtb25pdG9yaW5nIGNvbW1hbmQgZGlyZWN0b3kgIm9tb24iIGFuZAorICogaW5zdGFsbHMgb3B0aWNhbCBtb25pdG9yaW5nIENMSSBjb21tYW5kcyB0byB0aGlzIGRpcmVjdG9yeS4KKyAqCisgKiBccGFyYW0gdG9wX2RpciBQYXJlbnQgb2YgIm9tb24iIGRpcmVjdG9yeQorICoKKyAqIFxyZXR1cm4KKyAqIEJDTV9FUlJfT0sgaWYgc3VjY2Vzc2Z1bCwgZXJyb3IgY29kZSBpZiBub3QKKyAqLwordm9pZCBiY21vbHRfdXNlcl9hcHBsX2Vwb25fb21vbl9jbGlfaW5pdChiY21jbGlfZW50cnkgKnRvcF9kaXIpCit7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmRpcl9uYW1lID0gIm9tb24iOworCisgICAgaWYgKGJjbWNsaV9kaXJfZmluZCh0b3BfZGlyLCBkaXJfbmFtZSkpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYmNtY2xpX2VudHJ5ICpkaXIgPSBiY21jbGlfZGlyX2FkZCh0b3BfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRVBPTiBvcHRpY2FsIG1vbml0b3JpbmcgY29tbWFuZHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNNQ0xJX0FDQ0VTU19BRE1JTiwgTlVMTCk7CisgICAgQlVHX09OKGRpciA9PSBOVUxMKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRChkaXIsICJyeF9wb3dlciIsICJJc3N1ZSBSWCBQb3dlciBNZWFzdXJlbWVudCIsIG9tb25fY21kX3J4X3Bvd2VyLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiZXBvbl9uaSIsICJFUE9OIE5JIiwgQkNNQ0xJX1BBUk1fTlVNQkVSLCAwKSwKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImdyYW50ZWRfbGluayIsICJMaW5rIG1hYyBhZGRyZXNzLCAwMDAwMDAwMDAwMDAgZm9yIElkbGUgUG93ZXIiLCBCQ01DTElfUEFSTV9NQUMsIDApLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgidHJpZ2dlcl93aWR0aCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSU1NJIFRyaWdnZXIgV2lkdGggKFR3KSBpbiBucywgRGVzaXJlZCB3aWR0aCBvZiBSU1NJIFRyaWdnZXIgYmFzZWQgb24gdGhlIE9wdGljYWwgTW9kdWxlIFNwZWNpZmljYXRpb25zLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgaXMgYSBtYW5kYXRvcnkgcGFyYW1ldGVyIHVzZWQgZm9yIGFsbCBSWCBQb3dlciBtZWFzdXJlbWVudHMgKCBpbmNsdWRpbmcgSWRsZSBwb3dlcikgYW5kIG11c3Qgbm90IGJlIDAuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm90ZTogVGhlIGdyYW51bGFyaXR5IG9mIHRoZSBkZXZpY2UgaXMgMSBUUSAoMTZucykgdGhlIGlucHV0IHdpbGwgYmUgcm91bmRlZCB1cCB0byB0aGUgbmV4dCBUUS4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgQkNNQ0xJX1BBUk1fTlVNQkVSLCAwKSwKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oInRyaWdnZXJfZGVsYXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUlNTSSBUcmlnZ2VyIERlbGF5IChUZCkgaW4gbnMsIERlc2lyZWQgZGVsYXkgdG8gbWVldCB0aGUgdHJpZ2dlciBkZWxheSB0aW1pbmcgcmVxdWlyZW1lbnQgb2YgdGhlIE9wdGljYWwgTW9kdWxlIFNwZWNpZmljYXRpb25zLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSByc3NpIHRyaWdnZXIgZGVsYXkgaXMgbWVhc3VyZWQgZnJvbSB0aGUgc3RhcnQgb2Ygc3luY190aW1lIGFuZCBpcyBhZGp1c3RlZCBhcyBuZWVkZWQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSB0cmlnZ2VyIGRlbGF5IG1vdmVzIHRoZSBhc3NlcnRpb24gb2YgdGhlIFJTU0kgVHJpZ2dlciBzdHJvYmUgaW50byB0aGUgZ3JhbnQgd2luZG93LiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vdGU6IFRoZSBncmFudWxhcml0eSBvZiB0aGUgZGV2aWNlIGlzIDEgVFEgKDE2bnMpIHRoZSBpbnB1dCB3aWxsIGJlIHJvdW5kZWQgdXAgdG8gdGhlIG5leHQgVFEuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIEJDTUNMSV9QQVJNX05VTUJFUiwgMCksCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJzYW1wbGVfcGVyaW9kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihUaTJjKSBTYW1wbGUgcGVyaW9kIGluIHVTLCBpbnRlcm5hbCBJMkMgaG9sZC9wcm9oaWJpdCB0aW1lIHdoZXJlIGFjY2VzcyB0byBkZXZpY2UgaXMgbm90IGFsbG93ZWQuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRHVyaW5nIHRoaXMgcGVyaW9kIHRoZSBpbnRlcm5hbCBSU1NJIGRhdGEgaXMgaW52YWxpZCBhbmQgSTJDIG9wZXJ0aW9ucyBvbiB0aGlzIGRldmljZSBtdXN0IG5vdCBiZSBleGVjdXRlZC4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBIHZhbHVlIG9mIDUwMHVTIGlzIHJlY29tbWVuZGVkIGZvciBtb3N0IGFwcGxpY2F0aW9ucy4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIEJDTUNMSV9QQVJNX05VTUJFUiwgMCkpOworCisgICAgQkNNQ0xJX01BS0VfQ01EKGRpciwgInRyeF9kYXRhIiwgIlJlYWQgVHJhbmNlaXZlciBEYXRhIiwgb21vbl9jbWRfdHJ4X2RhdGEsCisgICAgICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJlcG9uX25pIiwgIkVQT04gTkkiLCBCQ01DTElfUEFSTV9OVU1CRVIsIDApKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRChkaXIsICJyZWFkX3Jzc2kiLCAiUmVhZCBSU1NJIFJlc3VsdCBmcm9tIFRyYW5jZWl2ZXIiLCBvbW9uX2NtZF9yZWFkX3Jzc2lfcmVzdWx0LAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiZXBvbl9uaSIsICJFUE9OIE5JIiwgQkNNQ0xJX1BBUk1fTlVNQkVSLCAwKSk7CisKKyAgICBCQ01DTElfTUFLRV9DTUQoZGlyLCAibGxpZF9zY2FuIiwgIlJ1biBSb2d1ZSBPTlUgTExJRCBTY2FuIiwgb21vbl9jbWRfbGxpZF9zY2FuLAorICAgICAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiZXBvbl9uaSIsICJFUE9OIE5JIiwgQkNNQ0xJX1BBUk1fTlVNQkVSLCAwKSwKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oInNjYW5fbW9kZSIsICJMTElEIHNjYW4gbW9kZSAxIGZvciBmdWxsIHBvbiBzY2FuLCAwIGZvciB0YXJnZXRlZCAobGxpZCByZXF1aXJlZCBmb3IgdGFyZ2V0ZWQpIiwgQkNNQ0xJX1BBUk1fTlVNQkVSLCAwKSwKKyAgICAgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oImVwb25fbGxpZCIsICJFUE9OIGxsaWQgdG8gc2NhbiB3aGVuIG1vZGU9MCIsIEJDTUNMSV9QQVJNX0hFWCwgMCkpOworfQorLyogYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29tb25fY2xpX2luaXQgKi8KKworCisvKiBFbmQgb2YgZmlsZSBvbW9uLmMgKi8KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9vbW9uL29tb24uaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvb21vbi9vbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUzMWI3YQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvb21vbi9vbW9uLmgKQEAgLTAsMCArMSw2OSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisqLworCisjaWZuZGVmIF9PTU9OX0hfCisjZGVmaW5lIF9PTU9OX0hfCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21vbHRfYXBpLmg+CisjaW5jbHVkZSA8YmNtb2x0X21vZGVsX3R5cGVzLmg+CisjaW5jbHVkZSA8YmNtb2x0X3V0aWxzLmg+CisjaW5jbHVkZSA8YmNtX2Rldl9sb2cuaD4KKworCisKKy8qKgorICogXGJyaWVmIFN0YXJ0IHRoZSBvcHRpY2FsIG1vbml0b3JpbmcgdGFzaworICoKKyAqIFRoaXMgZnVuY3Rpb24gc3RhcnRzIHRoZSB1c2VyIGxldmVsIG9wdGljYWwgbW9uaXRvcmluZyB0YXNrIGFuZCBjcmVhdGVzIHRoZQorICogb3B0aWNhbCBtb25pdG9yaW5nIG1vZHVsZS4gIEl0IHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbmNlIGF0IHN0YXJ0IHVwLgorICoKKyAqIFxyZXR1cm4KKyAqIE5vbmUKKyAqLworZXh0ZXJuCit2b2lkIGJjbW9sdF9lcG9uX29tb25fYXBwbF9pbml0ICh2b2lkKTsKKworCisvKioKKyAqIFxicmllZiBJbnN0YWxsIENMSSBjb21tYW5kcworICoKKyAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhbmQgb3B0aWNhbCBtb25pdG9yaW5nIGNvbW1hbmQgZGlyZWN0b3kgIm9tb24iIGFuZAorICogaW5zdGFsbHMgb3B0aWNhbCBtb25pdG9yaW5nIENMSSBjb21tYW5kcyB0byB0aGlzIGRpcmVjdG9yeS4KKyAqCisgKiBccGFyYW0gdG9wX2RpciBQYXJlbnQgb2YgIm9tb24iIGRpcmVjdG9yeQorICovCisKK3ZvaWQgYmNtb2x0X3VzZXJfYXBwbF9lcG9uX29tb25fY2xpX2luaXQoYmNtY2xpX2VudHJ5ICp0b3BfZGlyKTsKKworCitiY21vc19lcnJubyBiY21vbHRfdXNlcl9hcHBsX29tb25faGFuZGxlX2luZChiY21vbHRfZGV2aWQgZGV2aWNlX2lkLCB1aW50OF90IGluc3RhbmNlLCBiY21vbHRfYXV0byAqaW5kKTsKKworCisjZW5kaWYgLyogRW5kIG9mIGZpbGUgb21vbi5oICovCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3BsYXliYWNrL01ha2VmaWxlIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wbGF5YmFjay9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzc0MDI4Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wbGF5YmFjay9NYWtlZmlsZQpAQCAtMCwwICsxLDEyIEBACitpZmVxICgiJChFTkFCTEVfQ0xJKSIsICJ5IikKKyAgICBNT0RfTkFNRSA9IGJjbV91c2VyX2FwcGxfcGxheWJhY2sKKyAgICBNT0RfVFlQRSA9IGxpYgorICAgIE1PRF9ERVBTID0gdXRpbHMgZGV2X2xvZyBjb21tb25fYXBpIHRyYW5zcG9ydAorICAgIHNyY3MgPSBiY21vbHRfdXNlcl9hcHBsX3BsYXliYWNrLmMKKyAgICBpZmVxICgiJChPU19LRVJORUwpIiwgImxpbnV4IikKKwlNT0RfREVQUyArPSBkZXZfbG9nX2xpbnV4CisgICAgZW5kaWYKKworICAgIFVTRV9MSU5UPXllcworZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wbGF5YmFjay9iY21vbHRfdXNlcl9hcHBsX3BsYXliYWNrLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3BsYXliYWNrL2JjbW9sdF91c2VyX2FwcGxfcGxheWJhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2I0NjNiCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wbGF5YmFjay9iY21vbHRfdXNlcl9hcHBsX3BsYXliYWNrLmMKQEAgLTAsMCArMSwxNTczIEBACisvKgorICA8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworICBVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCisgIGFncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKKyAgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgICh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAorICB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICBvZiB0aGUgc29mdHdhcmUuCisKKyAgTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCisgIHRoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAorICB1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgorICB3cml0dGVuIGNvbnNlbnQuCisKKyAgOj4KKyovCisKKyNpbmNsdWRlICJiY21vc19zeXN0ZW0uaCIKKyNpbmNsdWRlICJiY21fZGV2X2xvZy5oIgorI2luY2x1ZGUgImJjbW9sdF9hcGkuaCIKKyNpbmNsdWRlICJiY21fYXBpX2NsaV9oZWxwZXJzLmgiCisjaW5jbHVkZSAiYmNtb2x0X21vZGVsX3R5cGVzLmgiCisjaW5jbHVkZSAiYmNtdHJfZGVidWcuaCIKKyNpbmNsdWRlICJiY210cl9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX3BsYXliYWNrLmgiCisjaW5jbHVkZSAiYmNtb2x0X2JpdF91dGlscy5oIgorCisvKiAnTVBCeCcgaW4gQVNDSUkgKE0pYXBsZSAoUClsYXkoYilhY2sgdmVyc2lvbiB4ICovCisjZGVmaW5lIFZFUlNJT04wICAgIDB4NGQ1MDQyMzAKKyNkZWZpbmUgVkVSU0lPTjEgICAgMHg0ZDUwNDIzMQorCitzdGF0aWMgY29uc3QgdWludDMyX3QgQ0hVTktfU0laRSA9IDIwMDA7CisKK3N0YXRpYyBjb25zdCBjaGFyICpjYXBfbG9jX3N0cltCQ01PTFRfQVBJX0NBUFRVUkVfTE9DQVRJT05fX05VTV9PRl0gPQoreworICAgICJkZXZpY2UiLAorICAgICJob3N0IgorfTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBkZXZfbG9nX2lkIGxvZ19pZDsKK30gcGxheWJhY2tfY29udGV4dDsKKworc3RhdGljIHBsYXliYWNrX2NvbnRleHQgcGJfY3R4dFtCQ01UUl9NQVhfT0xUU107CisKK3R5cGVkZWYgZW51bQoreworICAgIFBCX0ZPUk1BVF9BUElfQ0xJLAorICAgIFBCX0ZPUk1BVF9DX0FQSSwKKworICAgIFBCX0ZPUk1BVF9fQ09VTlQKK30gcGJfZm9ybWF0OworCit0eXBlZGVmIGVudW0KK3sKKyAgICBQQl9DTElfRVhUUkFfTk9ORSwKKyAgICBQQl9DTElfRVhUUkFfTVVMVEksCisgICAgUEJfQ0xJX0VYVFJBX1NUQVQsCisgICAgUEJfQ0xJX0VYVFJBX1NVQkdST1VQCit9IHBiX2NsaV9leHRyYTsKKwordHlwZWRlZiBlbnVtCit7CisgICAgUEJfRklFTERTX05PTkUsCisgICAgUEJfRklFTERTX0dFVCwKKyAgICBQQl9GSUVMRFNfTVVMVEksCisgICAgUEJfRklFTERTX1NFVAorfSBwYl9maWVsZHM7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDMyX3QgdmVyc2lvbjsKKyAgICBiY21vbHRfYXBpX2NhcHR1cmVfbG9jYXRpb24gbG9jYXRpb247CisgICAgYmNtb2x0X2Zpcm13YXJlX3N3X3ZlcnNpb24gZndfdmVyOworICAgIGJjbW9sdF9ob3N0X3N3X3ZlcnNpb24gaG9zdF92ZXI7CisgICAgdWludDMyX3QgYnVmX3NpemU7CisgICAgdm9pZCAqY2FwdHVyZV9idWZmZXI7Cit9IGJjbW9sdF9wbGF5YmFjazsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21vbHRfYnVmIGJ1ZjsKKyAgICBiY210cl9jYXB0dXJlX2VudHJ5IGhkcjsKKyAgICB1aW50OF90ICptc2dfc3RhcnQ7Cit9IHBsYXliYWNrX2l0ZXJhdG9yX3JhdzsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBwbGF5YmFja19pdGVyYXRvcl9yYXcgcmF3OworICAgIGJjbW9sdF9idWYgbXNnX2J1ZjsKKyAgICBiY21vbHRfbXNnICptc2c7CisgICAgYmNtb3NfZXJybm8gZXJyOworfSBwbGF5YmFja19pdGVyYXRvcjsKKworI2RlZmluZSBGT1JfRUFDSF9DQVBUVVJFX0VOVFJZKGl0LCBidWZmZXIsIHNpemUpIFwKKyAgICBiY21vbHRfYnVmX2luaXQoJihpdCkuYnVmLCBzaXplLCBidWZmZXIsIEJDTU9MVF9CVUZfRU5ESUFOX0ZJWEVEKTsgXAorICAgIHdoaWxlIChiY210cl9jYXB0dXJlX2VudHJ5X2dldF9uZXh0KCYoaXQpLmJ1ZiwgJihpdCkuaGRyLCAmKGl0KS5tc2dfc3RhcnQpKQorCisjZGVmaW5lIEZPUl9FQUNIX1BMQVlCQUNLX01TRyhpdCwgYnVmZmVyLCBzaXplKSBcCisgICAgYmNtb2x0X2J1Zl9pbml0KCYoaXQpLnJhdy5idWYsIHNpemUsIGJ1ZmZlciwgQkNNT0xUX0JVRl9FTkRJQU5fRklYRUQpOyBcCisgICAgKGl0KS5tc2cgPSBOVUxMOyBcCisgICAgd2hpbGUgKHBsYXliYWNrX25leHRfZW50cnlfdW5wYWNrZWQoJihpdCkpKQorCisjZGVmaW5lIERFVklDRV9SRUYgImRldmljZV9pZCIKKyNkZWZpbmUgUkNfUkVGICJyYyIKKyNkZWZpbmUgVkFMX1JFRiAidmFsIgorI2RlZmluZSBNU0dfUkVGICJtc2ciCisjZGVmaW5lIEtFWV9SRUYgImtleSIKKyNkZWZpbmUgTElTVF9NRU1fUkVGICJsaXN0X21lbSIKKyNkZWZpbmUgTVNHX1NFVF9SRUYgIm1zZ19zZXQiCisjZGVmaW5lIE1BWF9NU0dTX1JFRiAibWF4X21zZ3MiCisjZGVmaW5lIElOVkVSVF9GSUxURVJfUkVGICJpbnZlcnRfZmlsdGVyIgorI2RlZmluZSBTVEFUX0ZMQUdTX1JFRiAic3RhdF9mbGFncyIKKyNkZWZpbmUgRFlOX0xJU1RfU0laRSAiQVBJQ0xJX0RZTkFNSUNfTElTVF9CVUZGRVJfU0laRSIKKworc3RhdGljIHZvaWQgcGxheWJhY2tfaXRlcmF0b3JfY2xlYW51cChwbGF5YmFja19pdGVyYXRvciAqaXQpCit7CisgICAgaWYgKChpdC0+ZXJyID09IEJDTV9FUlJfT0spICYmIChpdC0+bXNnICE9IE5VTEwpKQorICAgIHsKKyAgICAgICAgYmNtb2x0X21zZ19mcmVlKGl0LT5tc2cpOworICAgICAgICBpdC0+bXNnID0gTlVMTDsKKyAgICB9Cit9CisKK3N0YXRpYyBiY21vc19ib29sIHBsYXliYWNrX25leHRfZW50cnlfdW5wYWNrZWQocGxheWJhY2tfaXRlcmF0b3IgKml0KQoreworICAgIHBsYXliYWNrX2l0ZXJhdG9yX2NsZWFudXAoaXQpOworICAgIGJjbW9zX2Jvb2wgcmV0ID0gYmNtdHJfY2FwdHVyZV9lbnRyeV9nZXRfbmV4dCgmaXQtPnJhdy5idWYsICZpdC0+cmF3LmhkciwgJml0LT5yYXcubXNnX3N0YXJ0KTsKKyAgICBpZiAocmV0KQorICAgIHsKKyAgICAgICAgYmNtb2x0X2J1Zl9pbml0KCZpdC0+bXNnX2J1ZiwgaXQtPnJhdy5oZHIubXNnX3NpemUsIGl0LT5yYXcubXNnX3N0YXJ0LCBCQ01PTFRfQlVGX0VORElBTl9GSVhFRCk7CisgICAgICAgIGl0LT5lcnIgPSBiY21vbHRfbXNnX3VucGFjaygmaXQtPm1zZ19idWYsICZpdC0+bXNnKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBsYXliYWNrX3JlYWRfYmxvY2sodWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBzaXplLCB1aW50OF90ICpidWYpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9kZWJ1Z19jZmcgZGVidWdfY2ZnOworICAgIGJjbW9sdF9kZWJ1Z19rZXkgZGVidWdfa2V5ID0geyB9OworICAgIGJjbW9sdF9hcGlfY2FwdHVyZV9idWZmZXJfcmVhZGVyIHJlYWRlciA9IHsgLm9mZnNldCA9IG9mZnNldCwgLnNpemUgPSBzaXplIH07CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmRlYnVnX2NmZywgZGVidWcsIGRlYnVnX2tleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmZGVidWdfY2ZnLCBkZWJ1ZywgYXBpX2NhcHR1cmVfYnVmZmVyX3JlYWQsIHJlYWRlcik7CisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoY3VycmVudF9kZXZpY2UsICZkZWJ1Z19jZmcuaGRyKTsKKyAgICBpZiAoQkNNX0VSUl9PSyAhPSBlcnIpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCBwYl9jdHh0W2N1cnJlbnRfZGV2aWNlXS5sb2dfaWQsICJGYWlsZWQgdG8gdXBkYXRlIHJlYWRlciAoJXUsICV1KSFcbiIsIG9mZnNldCwgc2l6ZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfSU5JVCgmZGVidWdfY2ZnLCBkZWJ1ZywgZGVidWdfa2V5KTsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmZGVidWdfY2ZnLCBkZWJ1ZywgYXBpX2NhcHR1cmVfYnVmZmVyKTsKKyAgICAgICAgZGVidWdfY2ZnLmRhdGEuYXBpX2NhcHR1cmVfYnVmZmVyLnZhbCA9IGJ1ZjsKKyAgICAgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoY3VycmVudF9kZXZpY2UsICZkZWJ1Z19jZmcuaGRyKTsKKyAgICAgICAgaWYgKEJDTV9FUlJfT0sgIT0gZXJyKQorICAgICAgICB7CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBwYl9jdHh0W2N1cnJlbnRfZGV2aWNlXS5sb2dfaWQsICJGYWlsZWQgdG8gcmV0cmlldmUgY2FwdHVyZSBidWZmZXIgY2h1bmsgKCV1LCAldSkhXG4iLAorICAgICAgICAgICAgICAgIG9mZnNldCwgc2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcGxheWJhY2tfcmVhZCh2b2lkICoqYnVmZmVyLCB1aW50MzJfdCAqbGVuZ3RoLCBiY21vbHRfYXBpX2NhcHR1cmVfbG9jYXRpb24gKmNhcHR1cmVfbG9jYXRpb24pCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9kZWJ1Z19jZmcgZGVidWdfY2ZnOworICAgIGJjbW9sdF9kZWJ1Z19rZXkgZGVidWdfa2V5ID0geyB9OworCisgICAgaWYgKChidWZmZXIgPT0gTlVMTCkgfHwgKGxlbmd0aCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIHBiX2N0eHRbY3VycmVudF9kZXZpY2VdLmxvZ19pZCwgImJ1ZmZlciAoJXApIGFuZCBsZW5ndGggKCVwKSBjYW5ub3QgYmUgTlVMTFxuIiwgYnVmZmVyLCBsZW5ndGgpOworICAgIH0KKworICAgIEJDTU9MVF9DRkdfSU5JVCgmZGVidWdfY2ZnLCBkZWJ1ZywgZGVidWdfa2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZkZWJ1Z19jZmcsIGRlYnVnLCBhcGlfY2FwdHVyZV9zdGF0cyk7CisgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmZGVidWdfY2ZnLCBkZWJ1ZywgYXBpX2NhcHR1cmVfY2ZnKTsKKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldChjdXJyZW50X2RldmljZSwgJmRlYnVnX2NmZy5oZHIpOworICAgIGlmIChCQ01fRVJSX09LICE9IGVycikKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIHBiX2N0eHRbY3VycmVudF9kZXZpY2VdLmxvZ19pZCwgIkZhaWxlZCB0byByZXRyaWV2ZSBjYXB0dXJlIHN0YXRzIVxuIik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHZvaWQgKmNhcHR1cmVfYnVmZmVyOworICAgICAgICB1aW50MzJfdCBidWZfc2l6ZSA9IGRlYnVnX2NmZy5kYXRhLmFwaV9jYXB0dXJlX3N0YXRzLnJlYWRhYmxlX2J5dGVzOworICAgICAgICB1aW50MzJfdCBvZmZzZXQgPSAwOworCisgICAgICAgICpjYXB0dXJlX2xvY2F0aW9uID0gZGVidWdfY2ZnLmRhdGEuYXBpX2NhcHR1cmVfY2ZnLmxvY2F0aW9uOworCisgICAgICAgIEJDTV9MT0coREVCVUcsIHBiX2N0eHRbY3VycmVudF9kZXZpY2VdLmxvZ19pZCwgIlJldHJpZXZpbmcgJXUgYnl0ZSBidWZmZXJcbiIsIGJ1Zl9zaXplKTsKKyAgICAgICAgY2FwdHVyZV9idWZmZXIgPSBiY21vc19hbGxvYyhidWZfc2l6ZSk7CisgICAgICAgIGlmIChOVUxMICE9IGNhcHR1cmVfYnVmZmVyKQorICAgICAgICB7CisgICAgICAgICAgICB3aGlsZSAoKG9mZnNldCArIENIVU5LX1NJWkUpIDwgYnVmX3NpemUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhERUJVRywgcGJfY3R4dFtjdXJyZW50X2RldmljZV0ubG9nX2lkLCAiUmVhZGluZyBieXRlcyAldSAtICV1XG4iLCBvZmZzZXQsIG9mZnNldCArIENIVU5LX1NJWkUpOworICAgICAgICAgICAgICAgIGVyciA9IHBsYXliYWNrX3JlYWRfYmxvY2sob2Zmc2V0LCBDSFVOS19TSVpFLCAodWludDhfdCopY2FwdHVyZV9idWZmZXIgKyBvZmZzZXQpOworICAgICAgICAgICAgICAgIGlmIChCQ01fRVJSX09LICE9IGVycikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gQ0hVTktfU0laRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKEJDTV9FUlJfT0sgPT0gZXJyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJDTV9MT0coREVCVUcsIHBiX2N0eHRbY3VycmVudF9kZXZpY2VdLmxvZ19pZCwgIlJlYWRpbmcgYnl0ZXMgJXUgLSAldVxuIiwgb2Zmc2V0LCBidWZfc2l6ZSk7CisgICAgICAgICAgICAgICAgZXJyID0gcGxheWJhY2tfcmVhZF9ibG9jayhvZmZzZXQsIGJ1Zl9zaXplIC0gb2Zmc2V0LCAodWludDhfdCopY2FwdHVyZV9idWZmZXIgKyBvZmZzZXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgKmJ1ZmZlciA9IGNhcHR1cmVfYnVmZmVyOworICAgICAgICAqbGVuZ3RoID0gYnVmX3NpemU7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBsYXliYWNrX2R1bXAoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIHZvaWQgKmNhcHR1cmVfYnVmLCB1aW50MzJfdCBidWZfc2l6ZSkKK3sKKyAgICBwbGF5YmFja19pdGVyYXRvciBpdDsKKyAgICBiY21vc19lcnJubyBlcnIgPSBCQ01fRVJSX09LOworCisgICAgRk9SX0VBQ0hfUExBWUJBQ0tfTVNHKGl0LCBjYXB0dXJlX2J1ZiwgYnVmX3NpemUpCisgICAgeworICAgICAgICBCQ01fTE9HKERFQlVHLCBwYl9jdHh0W2N1cnJlbnRfZGV2aWNlXS5sb2dfaWQsICJEdW1waW5nIG1lc3NhZ2UgYXQgJXUgb2YgJXUgKCV1KVxuIiwKKyAgICAgICAgICAgICAgICBiY21vbHRfYnVmX2dldF91c2VkKCZpdC5yYXcuYnVmKSwgYnVmX3NpemUsIGl0LnJhdy5oZHIubXNnX3NpemUpOworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiXG4lMDh4ICV1OlxuIiwgaXQucmF3Lmhkci50aW1lc3RhbXAsIGl0LnJhdy5oZHIuZXZlbnQpOworICAgICAgICBpZiAoQkNNX0VSUl9PSyA9PSBpdC5lcnIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVyciA9IGFwaWNsaV9tc2dfZHVtcChzZXNzaW9uLCBpdC5tc2cpOworICAgICAgICAgICAgQkNNX0xPRyhERUJVRywgcGJfY3R4dFtjdXJyZW50X2RldmljZV0ubG9nX2lkLCAiRHVtcCBzdGF0dXM6ICVzXG4iLCBiY21vc19zdHJlcnJvcihlcnIpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEJDTV9MT0coREVCVUcsIHBiX2N0eHRbY3VycmVudF9kZXZpY2VdLmxvZ19pZCwgIlVucGFja2luZyBmYWlsZWQ6ICVzXG4iLCBiY21vc19zdHJlcnJvcihlcnIpKTsKKyAgICAgICAgICAgIGlmICgoaXQucmF3Lm1zZ19zdGFydCArIGl0LnJhdy5oZHIubXNnX3NpemUpID4gKGl0LnJhdy5idWYuc3RhcnQgKyBpdC5yYXcuYnVmLmxlbikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIk1lc3NhZ2UgbGVuZ3RoIGlzIGluc2FuZSFcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbWNsaV9zZXNzaW9uX2hleGR1bXAoc2Vzc2lvbiwgaXQucmF3Lm1zZ19zdGFydCwgMCwgaXQucmF3Lmhkci5tc2dfc2l6ZSwgTlVMTCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgYmNtb3NfYm9vbCBwbGF5YmFja19zaG91bGRfc2VuZChiY21vbHRfYXBpX2NhcHR1cmVfbG9jYXRpb24gY2FwdHVyZV9sb2NhdGlvbiwgYmNtdHJfY2xkX2V2ZW50X3R5cGUgZXZlbnRfdHlwZSkKK3sKKyAgICBzd2l0Y2ggKGNhcHR1cmVfbG9jYXRpb24pCisgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9BUElfQ0FQVFVSRV9MT0NBVElPTl9ERVZJQ0U6CisgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50X3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01UUl9DTERfRVZfUkVDVjoKKyAgICAgICAgICAgICAgICBjYXNlIEJDTVRSX0NMRF9FVl9SRUNWX0RJU0NBUkQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBCQ01PTFRfQVBJX0NBUFRVUkVfTE9DQVRJT05fSE9TVDoKKyAgICAgICAgICAgIHN3aXRjaCAoZXZlbnRfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTVRSX0NMRF9FVl9TRU5EOgorICAgICAgICAgICAgICAgIGNhc2UgQkNNVFJfQ0xEX0VWX1JFU0VORDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworICAgIH0KK30KKworLypsaW50IC1lezQyOX0gKi8KK3N0YXRpYyBiY21vc19lcnJubyBwbGF5YmFja19yZXBsYXkoCisgICAgYmNtb2x0X2RldmlkIGRldmljZSwKKyAgICB2b2lkICpjYXB0dXJlX2J1ZiwKKyAgICB1aW50MzJfdCBidWZfc2l6ZSwKKyAgICBiY21vbHRfYXBpX2NhcHR1cmVfbG9jYXRpb24gbG9jYXRpb24sCisgICAgYmNtb3NfYm9vbCBrZWVwX3RpbWUpCit7CisgICAgYmNtb3NfZXJybm8gZXJyID0gQkNNX0VSUl9PSzsKKyAgICBwbGF5YmFja19pdGVyYXRvcl9yYXcgaXQ7CisgICAgdWludDMyX3QgbGFzdF90aW1lX3VzID0gMDsKKyAgICBiY21vc19ib29sIGZpcnN0ID0gQkNNT1NfVFJVRTsKKworICAgIEZPUl9FQUNIX0NBUFRVUkVfRU5UUlkoaXQsIGNhcHR1cmVfYnVmLCBidWZfc2l6ZSkKKyAgICB7CisgICAgICAgIGJjbW9sdF9idWYgbXNnX2J1ZjsKKyAgICAgICAgYmNtb2x0X21zZyAqbXNnID0gTlVMTDsKKworICAgICAgICBCQ01fTE9HKERFQlVHLCBwYl9jdHh0W2RldmljZV0ubG9nX2lkLCAiUHJvY2Vzc2luZyBtZXNzYWdlICgldSwldSwldSlcbiIsCisgICAgICAgICAgICAgICAgaXQuaGRyLmV2ZW50LCBpdC5oZHIudGltZXN0YW1wLCBpdC5oZHIubXNnX3NpemUpOworICAgICAgICBpZiAocGxheWJhY2tfc2hvdWxkX3NlbmQobG9jYXRpb24sIChiY210cl9jbGRfZXZlbnRfdHlwZSlpdC5oZHIuZXZlbnQpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoa2VlcF90aW1lKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBhcHByb3hpbWF0ZSBvcmlnaW5hbCB0aW1pbmc7IGRvZXNuJ3QgYWNjb3VudCBmb3IgcHJvY2Vzc2luZyB0aW1lIGluIHRoaXMgY29kZSAtIHRoaXMgY291bGQgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgaW1wcm92ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgQkNNX0xPRyhERUJVRywgcGJfY3R4dFtkZXZpY2VdLmxvZ19pZCwgIlNsZWVwaW5nIGZvciAldSB1c1xuIiwgaXQuaGRyLnRpbWVzdGFtcCAtIGxhc3RfdGltZV91cyk7CisgICAgICAgICAgICAgICAgICAgIGJjbW9zX3VzbGVlcChpdC5oZHIudGltZXN0YW1wIC0gbGFzdF90aW1lX3VzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGFzdF90aW1lX3VzID0gaXQuaGRyLnRpbWVzdGFtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEJDTV9MT0coREVCVUcsIHBiX2N0eHRbZGV2aWNlXS5sb2dfaWQsICJVbnBhY2tpbmcgbWVzc2FnZVxuIik7CisgICAgICAgICAgICBiY21vbHRfYnVmX2luaXQoJm1zZ19idWYsIGl0Lmhkci5tc2dfc2l6ZSwgaXQubXNnX3N0YXJ0LCBCQ01PTFRfQlVGX0VORElBTl9GSVhFRCk7CisgICAgICAgICAgICBlcnIgPSBiY21vbHRfbXNnX3VucGFjaygmbXNnX2J1ZiwgJm1zZyk7CisgICAgICAgICAgICBpZiAoQkNNX0VSUl9PSyA9PSBlcnIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQkNNX0xPRyhERUJVRywgcGJfY3R4dFtkZXZpY2VdLmxvZ19pZCwgIlNlbmRpbmcgbWVzc2FnZVxuIik7CisgICAgICAgICAgICAgICAgZXJyID0gYmNtdHJfc2VuZChkZXZpY2UsIG1zZywgQkNNVFJfU0VORF9GTEFHU19OT05FKTsKKyAgICAgICAgICAgICAgICBiY21vbHRfbXNnX2ZyZWUobXNnKTsKKyAgICAgICAgICAgICAgICBpZiAoQkNNX0VSUl9PSyAhPSBlcnIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBCQ01fTE9HKElORk8sIHBiX2N0eHRbZGV2aWNlXS5sb2dfaWQsICJTZW5kaW5nIGZhaWxlZDogJXNcbiIsIGJjbW9zX3N0cmVycm9yKGVycikpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCQ01fTE9HKElORk8sIHBiX2N0eHRbZGV2aWNlXS5sb2dfaWQsICJVbnBhY2tpbmcgZmFpbGVkOiAlc1xuIiwgYmNtb3Nfc3RyZXJyb3IoZXJyKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwbGF5YmFja19jbGlfZHVtcChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1bXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgdm9pZCAqY2FwdHVyZV9idWZmZXI7CisgICAgdWludDMyX3QgYnVmX3NpemU7CisgICAgYmNtb2x0X2FwaV9jYXB0dXJlX2xvY2F0aW9uIGxvY2F0aW9uOworCisgICAgZXJyID0gcGxheWJhY2tfcmVhZCgmY2FwdHVyZV9idWZmZXIsICZidWZfc2l6ZSwgJmxvY2F0aW9uKTsKKworICAgIGlmIChCQ01fRVJSX09LID09IGVycikKKyAgICB7CisgICAgICAgIGJjbWNsaV9wcmludChzZXNzaW9uLCAiQ2FwdHVyZSBmcm9tICVzOlxuIiwgY2FwX2xvY19zdHJbbG9jYXRpb25dKTsKKyAgICAgICAgcGxheWJhY2tfZHVtcChzZXNzaW9uLCBjYXB0dXJlX2J1ZmZlciwgYnVmX3NpemUpOworICAgIH0KKworICAgIGJjbW9zX2ZyZWUoY2FwdHVyZV9idWZmZXIpOworCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgcGxheWJhY2tfZndfdmVyc2lvbl9nZXQoYmNtb2x0X2RldmlkIGRldmljZSwgYmNtb2x0X2Zpcm13YXJlX3N3X3ZlcnNpb24gKmZ3KQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfZGV2aWNlX2NmZyBkZXZfY2ZnOworICAgIGJjbW9sdF9kZXZpY2Vfa2V5IGRldl9rZXkgPSB7IH07CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmRldl9jZmcsIGRldmljZSwgZGV2X2tleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmZGV2X2NmZywgZGV2aWNlLCBmaXJtd2FyZV9zd192ZXJzaW9uKTsKKyAgICBlcnIgPSBiY21vbHRfY2ZnX2dldChkZXZpY2UsICZkZXZfY2ZnLmhkcik7CisgICAgaWYgKEJDTV9FUlJfT0sgIT0gZXJyKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhXQVJOSU5HLCBwYl9jdHh0W2RldmljZV0ubG9nX2lkLCAiRmFpbGVkIHRvIHJldHJpZXZlIGZ3IHZlcnNpb24hXG4iKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKmZ3ID0gZGV2X2NmZy5kYXRhLmZpcm13YXJlX3N3X3ZlcnNpb247CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBwbGF5YmFja19ob3N0X3ZlcnNpb25fZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9ob3N0X3N3X3ZlcnNpb24gKmhvc3QpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9kZXZpY2VfY2ZnIGRldl9jZmc7CisgICAgYmNtb2x0X2RldmljZV9rZXkgZGV2X2tleSA9IHsgfTsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmZGV2X2NmZywgZGV2aWNlLCBkZXZfa2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfR0VUKCZkZXZfY2ZnLCBkZXZpY2UsIGhvc3Rfc3dfdmVyc2lvbik7CisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlLCAmZGV2X2NmZy5oZHIpOworICAgIGlmIChCQ01fRVJSX09LICE9IGVycikKKyAgICB7CisgICAgICAgIEJDTV9MT0coV0FSTklORywgcGJfY3R4dFtkZXZpY2VdLmxvZ19pZCwgIkZhaWxlZCB0byByZXRyaWV2ZSBob3N0IHZlcnNpb24hXG4iKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKmhvc3QgPSBkZXZfY2ZnLmRhdGEuaG9zdF9zd192ZXJzaW9uOworICAgIH0KK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBsYXliYWNrX2NsaV9zYXZlKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsZSIpLT52YWx1ZS5zdHJpbmc7CisgICAgYmNtb2x0X3BsYXliYWNrIG1wYiA9IHt9OworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBGSUxFICpmaWxlOworICAgIHVpbnQzMl90IHRlbXA7CisKKyAgICBlcnIgPSBwbGF5YmFja19yZWFkKCZtcGIuY2FwdHVyZV9idWZmZXIsICZtcGIuYnVmX3NpemUsICZtcGIubG9jYXRpb24pOworCisgICAgaWYgKEJDTV9FUlJfT0sgPT0gZXJyKQorICAgIHsKKyAgICAgICAgcGxheWJhY2tfZndfdmVyc2lvbl9nZXQoY3VycmVudF9kZXZpY2UsICZtcGIuZndfdmVyKTsKKyAgICAgICAgcGxheWJhY2tfaG9zdF92ZXJzaW9uX2dldChjdXJyZW50X2RldmljZSwgJm1wYi5ob3N0X3Zlcik7CisKKyAgICAgICAgZmlsZSA9IGZvcGVuKGZpbGVuYW1lLCAid2IiKTsKKyAgICAgICAgLyogd3JpdGUgZmlsZSB2ZXJzaW9uICovCisgICAgICAgIHRlbXAgPSBCQ01PTFRfQlVGX0VORElBTl9DUFVfVE9fQlVGKFUzMiwgVkVSU0lPTjEpOworICAgICAgICBmd3JpdGUoJnRlbXAsIHNpemVvZih1aW50MzJfdCksIDEsIGZpbGUpOworICAgICAgICAvKiB3cml0ZSBjYXB0dXJlIGxvY2F0aW9uICovCisgICAgICAgIHRlbXAgPSBCQ01PTFRfQlVGX0VORElBTl9DUFVfVE9fQlVGKFUzMiwgKHVpbnQzMl90KW1wYi5sb2NhdGlvbik7CisgICAgICAgIGZ3cml0ZSgmdGVtcCwgc2l6ZW9mKHVpbnQzMl90KSwgMSwgZmlsZSk7CisgICAgICAgIC8qIHdyaXRlIGZpcm13YXJlIHZlcnNpb24gKi8KKyAgICAgICAgZndyaXRlKCZtcGIuZndfdmVyLm1ham9yLCBzaXplb2YodWludDhfdCksIDEsIGZpbGUpOworICAgICAgICBmd3JpdGUoJm1wYi5md192ZXIubWlub3IsIHNpemVvZih1aW50OF90KSwgMSwgZmlsZSk7CisgICAgICAgIGZ3cml0ZSgmbXBiLmZ3X3Zlci5yZXZpc2lvbiwgc2l6ZW9mKHVpbnQ4X3QpLCAxLCBmaWxlKTsKKyAgICAgICAgdGVtcCA9IEJDTU9MVF9CVUZfRU5ESUFOX0NQVV9UT19CVUYoVTMyLCBtcGIuZndfdmVyLm1vZGVsKTsKKyAgICAgICAgZndyaXRlKCZ0ZW1wLCBzaXplb2YodWludDMyX3QpLCAxLCBmaWxlKTsKKyAgICAgICAgZndyaXRlKG1wYi5md192ZXIuYnVpbGRfdGltZSwgc2l6ZW9mKG1wYi5md192ZXIuYnVpbGRfdGltZSksIDEsIGZpbGUpOworICAgICAgICAvKiB3cml0ZSBob3N0IHZlcnNpb24gKi8KKyAgICAgICAgZndyaXRlKCZtcGIuaG9zdF92ZXIubWFqb3IsIHNpemVvZih1aW50OF90KSwgMSwgZmlsZSk7CisgICAgICAgIGZ3cml0ZSgmbXBiLmhvc3RfdmVyLm1pbm9yLCBzaXplb2YodWludDhfdCksIDEsIGZpbGUpOworICAgICAgICBmd3JpdGUoJm1wYi5ob3N0X3Zlci5yZXZpc2lvbiwgc2l6ZW9mKHVpbnQ4X3QpLCAxLCBmaWxlKTsKKyAgICAgICAgdGVtcCA9IEJDTU9MVF9CVUZfRU5ESUFOX0NQVV9UT19CVUYoVTMyLCBtcGIuaG9zdF92ZXIubW9kZWwpOworICAgICAgICBmd3JpdGUoJnRlbXAsIHNpemVvZih1aW50MzJfdCksIDEsIGZpbGUpOworICAgICAgICBmd3JpdGUobXBiLmhvc3RfdmVyLmJ1aWxkX3RpbWUsIHNpemVvZihtcGIuaG9zdF92ZXIuYnVpbGRfdGltZSksIDEsIGZpbGUpOworICAgICAgICAvKiB3cml0ZSBjYXB0dXJlIGJ1ZmZlciAqLworICAgICAgICB0ZW1wID0gQkNNT0xUX0JVRl9FTkRJQU5fQ1BVX1RPX0JVRihVMzIsIG1wYi5idWZfc2l6ZSk7CisgICAgICAgIGZ3cml0ZSgmdGVtcCwgc2l6ZW9mKHVpbnQzMl90KSwgMSwgZmlsZSk7CisgICAgICAgIGZ3cml0ZShtcGIuY2FwdHVyZV9idWZmZXIsIG1wYi5idWZfc2l6ZSwgMSwgZmlsZSk7CisgICAgICAgIGZjbG9zZShmaWxlKTsKKyAgICB9CisKKyAgICBiY21vc19mcmVlKG1wYi5jYXB0dXJlX2J1ZmZlcik7CisKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgYmNtb3NfYm9vbCBwbGF5YmFja192ZXJzaW9uX21hdGNoKGNvbnN0IGJjbW9sdF9wbGF5YmFjayAqbXBiKQoreworICAgIGJjbW9sdF9maXJtd2FyZV9zd192ZXJzaW9uIGZ3X2N1cnIgPSB7fTsKKyAgICBiY21vbHRfaG9zdF9zd192ZXJzaW9uIGhvc3RfY3VyciA9IHt9OworCisgICAgcGxheWJhY2tfZndfdmVyc2lvbl9nZXQoY3VycmVudF9kZXZpY2UsICZmd19jdXJyKTsKKyAgICBwbGF5YmFja19ob3N0X3ZlcnNpb25fZ2V0KGN1cnJlbnRfZGV2aWNlLCAmaG9zdF9jdXJyKTsKKworICAgIGlmICgobXBiLT5md192ZXIubW9kZWwgIT0gZndfY3Vyci5tb2RlbCkgfHwgKG1wYi0+aG9zdF92ZXIubW9kZWwgIT0gaG9zdF9jdXJyLm1vZGVsKSB8fAorICAgICAgICAoZndfY3Vyci5tb2RlbCA9PSAwKSB8fCAoaG9zdF9jdXJyLm1vZGVsID09IDApKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhXQVJOSU5HLCBwYl9jdHh0W2N1cnJlbnRfZGV2aWNlXS5sb2dfaWQsCisgICAgICAgICAgICAgICAgIlBvc3NpYmxlIHZlcnNpb24gbWlzbWF0Y2g6IENhcHR1cmUgRlcgJXUsIEhPU1QgJXU7IEN1cnJlbnQgRlcgJXUsIEhPU1QgJXVcbiIsCisgICAgICAgICAgICAgICAgbXBiLT5md192ZXIubW9kZWwsIG1wYi0+aG9zdF92ZXIubW9kZWwsIGZ3X2N1cnIubW9kZWwsIGhvc3RfY3Vyci5tb2RlbCk7CisgICAgICAgIHJldHVybiBCQ01PU19GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNT1NfVFJVRTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBsYXliYWNrX2ZpbGVfb3Blbihjb25zdCBjaGFyICpmaWxlbmFtZSwgYmNtb2x0X3BsYXliYWNrICptcGIpCit7CisgICAgRklMRSAqZmlsZTsKKyAgICB1aW50MzJfdCB0ZW1wOworICAgIGJjbW9zX2Vycm5vIGVyciA9IEJDTV9FUlJfT0s7CisgICAgdWludDMyX3QgaXRlbXNfcmVhZDsKKworICAgIGZpbGUgPSBmb3BlbihmaWxlbmFtZSwgInJiIik7CisgICAgaXRlbXNfcmVhZCA9IGZyZWFkKCZ0ZW1wLCBzaXplb2YodWludDMyX3QpLCAxLCBmaWxlKTsKKyAgICBpZiAoaXRlbXNfcmVhZCAhPSAxKQorICAgICAgICByZXR1cm4gQkNNX0VSUl9QQVJTRTsKKworICAgIG1wYi0+dmVyc2lvbiA9IEJDTU9MVF9CVUZfRU5ESUFOX0JVRl9UT19DUFUoVTMyLCB0ZW1wKTsKKyAgICBzd2l0Y2ggKG1wYi0+dmVyc2lvbikKKyAgICB7CisgICAgICAgIGNhc2UgVkVSU0lPTjA6CisgICAgICAgICAgICBpdGVtc19yZWFkID0gZnJlYWQoJnRlbXAsIHNpemVvZih1aW50MzJfdCksIDEsIGZpbGUpOworICAgICAgICAgICAgaWYgKGl0ZW1zX3JlYWQgIT0gMSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHRlbXAgPSBCQ01PTFRfQlVGX0VORElBTl9CVUZfVE9fQ1BVKFUzMiwgdGVtcCk7CisgICAgICAgICAgICBtcGItPmxvY2F0aW9uID0gKGJjbW9sdF9hcGlfY2FwdHVyZV9sb2NhdGlvbil0ZW1wOworICAgICAgICAgICAgaXRlbXNfcmVhZCA9IGZyZWFkKCZ0ZW1wLCBzaXplb2YodWludDMyX3QpLCAxLCBmaWxlKTsKKyAgICAgICAgICAgIGlmIChpdGVtc19yZWFkICE9IDEpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBtcGItPmJ1Zl9zaXplID0gQkNNT0xUX0JVRl9FTkRJQU5fQlVGX1RPX0NQVShVMzIsIHRlbXApOworICAgICAgICAgICAgbXBiLT5jYXB0dXJlX2J1ZmZlciA9IGJjbW9zX2FsbG9jKG1wYi0+YnVmX3NpemUpOworICAgICAgICAgICAgaXRlbXNfcmVhZCA9IGZyZWFkKG1wYi0+Y2FwdHVyZV9idWZmZXIsIG1wYi0+YnVmX3NpemUsIDEsIGZpbGUpOworICAgICAgICAgICAgaWYgKGl0ZW1zX3JlYWQgIT0gMSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZFUlNJT04xOgorICAgICAgICAgICAgLyogcmVhZCBjYXB0dXJlIGxvY2F0aW9uICovCisgICAgICAgICAgICBpdGVtc19yZWFkID0gZnJlYWQoJnRlbXAsIHNpemVvZih1aW50MzJfdCksIDEsIGZpbGUpOworICAgICAgICAgICAgaWYgKGl0ZW1zX3JlYWQgIT0gMSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHRlbXAgPSBCQ01PTFRfQlVGX0VORElBTl9CVUZfVE9fQ1BVKFUzMiwgdGVtcCk7CisgICAgICAgICAgICBtcGItPmxvY2F0aW9uID0gKGJjbW9sdF9hcGlfY2FwdHVyZV9sb2NhdGlvbil0ZW1wOworICAgICAgICAgICAgLyogcmVhZCBmaXJtd2FyZSB2ZXJzaW9uICovCisgICAgICAgICAgICBpdGVtc19yZWFkID0gZnJlYWQoJm1wYi0+ZndfdmVyLm1ham9yLCBzaXplb2YodWludDhfdCksIDEsIGZpbGUpOworICAgICAgICAgICAgaWYgKGl0ZW1zX3JlYWQgIT0gMSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGl0ZW1zX3JlYWQgPSBmcmVhZCgmbXBiLT5md192ZXIubWlub3IsIHNpemVvZih1aW50OF90KSwgMSwgZmlsZSk7CisgICAgICAgICAgICBpZiAoaXRlbXNfcmVhZCAhPSAxKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaXRlbXNfcmVhZCA9IGZyZWFkKCZtcGItPmZ3X3Zlci5yZXZpc2lvbiwgc2l6ZW9mKHVpbnQ4X3QpLCAxLCBmaWxlKTsKKyAgICAgICAgICAgIGlmIChpdGVtc19yZWFkICE9IDEpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpdGVtc19yZWFkID0gZnJlYWQoJnRlbXAsIHNpemVvZih1aW50MzJfdCksIDEsIGZpbGUpOworICAgICAgICAgICAgaWYgKGl0ZW1zX3JlYWQgIT0gMSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIG1wYi0+ZndfdmVyLm1vZGVsID0gQkNNT0xUX0JVRl9FTkRJQU5fQlVGX1RPX0NQVShVMzIsIHRlbXApOworICAgICAgICAgICAgaXRlbXNfcmVhZCA9IGZyZWFkKG1wYi0+ZndfdmVyLmJ1aWxkX3RpbWUsIHNpemVvZihtcGItPmZ3X3Zlci5idWlsZF90aW1lKSwgMSwgZmlsZSk7CisgICAgICAgICAgICBpZiAoaXRlbXNfcmVhZCAhPSAxKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgLyogcmVhZCBob3N0IHZlcnNpb24gKi8KKyAgICAgICAgICAgIGl0ZW1zX3JlYWQgPSBmcmVhZCgmbXBiLT5ob3N0X3Zlci5tYWpvciwgc2l6ZW9mKHVpbnQ4X3QpLCAxLCBmaWxlKTsKKyAgICAgICAgICAgIGlmIChpdGVtc19yZWFkICE9IDEpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpdGVtc19yZWFkID0gZnJlYWQoJm1wYi0+aG9zdF92ZXIubWlub3IsIHNpemVvZih1aW50OF90KSwgMSwgZmlsZSk7CisgICAgICAgICAgICBpZiAoaXRlbXNfcmVhZCAhPSAxKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaXRlbXNfcmVhZCA9IGZyZWFkKCZtcGItPmhvc3RfdmVyLnJldmlzaW9uLCBzaXplb2YodWludDhfdCksIDEsIGZpbGUpOworICAgICAgICAgICAgaWYgKGl0ZW1zX3JlYWQgIT0gMSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGl0ZW1zX3JlYWQgPSBmcmVhZCgmdGVtcCwgc2l6ZW9mKHVpbnQzMl90KSwgMSwgZmlsZSk7CisgICAgICAgICAgICBpZiAoaXRlbXNfcmVhZCAhPSAxKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgbXBiLT5ob3N0X3Zlci5tb2RlbCA9IEJDTU9MVF9CVUZfRU5ESUFOX0JVRl9UT19DUFUoVTMyLCB0ZW1wKTsKKyAgICAgICAgICAgIGl0ZW1zX3JlYWQgPSBmcmVhZChtcGItPmhvc3RfdmVyLmJ1aWxkX3RpbWUsIHNpemVvZihtcGItPmhvc3RfdmVyLmJ1aWxkX3RpbWUpLCAxLCBmaWxlKTsKKyAgICAgICAgICAgIGlmIChpdGVtc19yZWFkICE9IDEpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAvKiByZWFkIGNhcHR1cmUgYnVmZmVyICovCisgICAgICAgICAgICBpdGVtc19yZWFkID0gZnJlYWQoJnRlbXAsIHNpemVvZih1aW50MzJfdCksIDEsIGZpbGUpOworICAgICAgICAgICAgaWYgKGl0ZW1zX3JlYWQgIT0gMSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIG1wYi0+YnVmX3NpemUgPSBCQ01PTFRfQlVGX0VORElBTl9CVUZfVE9fQ1BVKFUzMiwgdGVtcCk7CisgICAgICAgICAgICBtcGItPmNhcHR1cmVfYnVmZmVyID0gYmNtb3NfYWxsb2MobXBiLT5idWZfc2l6ZSk7CisgICAgICAgICAgICBpdGVtc19yZWFkID0gZnJlYWQobXBiLT5jYXB0dXJlX2J1ZmZlciwgbXBiLT5idWZfc2l6ZSwgMSwgZmlsZSk7CisgICAgICAgICAgICBpZiAoaXRlbXNfcmVhZCAhPSAxKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBCQ01fTE9HKEVSUk9SLCBwYl9jdHh0W2N1cnJlbnRfZGV2aWNlXS5sb2dfaWQsICJVbmtub3duIHZlcnNpb246ICV1XG4iLCBtcGItPnZlcnNpb24pOworICAgICAgICAgICAgZXJyID0gQkNNX0VSUl9QQVJTRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGZjbG9zZShmaWxlKTsKKworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwbGF5YmFja19jbGlfcmVwbGF5KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZmlsZSIpLT52YWx1ZS5zdHJpbmc7CisgICAgYmNtb3NfYm9vbCBpZ25vcmVfdmVyID0gQkNNT1NfRkFMU0U7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9wbGF5YmFjayBtcGIgPSB7fTsKKworICAgIGJjbWNsaV9jbWRfcGFybSAqaXZfcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImlnbm9yZV92ZXJzaW9uIik7CisgICAgaWYgKGl2X3Bhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGlnbm9yZV92ZXIgPSBpdl9wYXJtLT52YWx1ZS5lbnVtX3ZhbCA9PSAobG9uZylCQ01PU19UUlVFOworICAgIH0KKworICAgIGVyciA9IHBsYXliYWNrX2ZpbGVfb3BlbihmaWxlbmFtZSwgJm1wYik7CisKKyAgICBpZiAoQkNNX0VSUl9PSyA9PSBlcnIpCisgICAgeworICAgICAgICBpZiAocGxheWJhY2tfdmVyc2lvbl9tYXRjaCgmbXBiKSB8fCBpZ25vcmVfdmVyKQorICAgICAgICB7CisgICAgICAgICAgICBlcnIgPSBwbGF5YmFja19yZXBsYXkoY3VycmVudF9kZXZpY2UsIG1wYi5jYXB0dXJlX2J1ZmZlciwgbXBiLmJ1Zl9zaXplLCBtcGIubG9jYXRpb24sIEJDTU9TX1RSVUUpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICJQb3NzaWJsZSB2ZXJzaW9uIG1pc21hdGNoOyB1c2UgaWdub3JlX3ZlcnNpb249eWVzIHRvIGZvcmNlIHBsYXliYWNrXG4iKTsKKyAgICAgICAgICAgIGVyciA9IEJDTV9FUlJfSU1BR0VfVFlQRTsKKyAgICAgICAgfQorICAgICAgICBiY21vc19mcmVlKG1wYi5jYXB0dXJlX2J1ZmZlcik7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBsYXliYWNrX2FwaV9jbGlfYXBwZW5kX3Byb3AoCisgICAgYmNtb2x0X3N0cmluZyAqYXBpX2NsaSwKKyAgICB1aW50MzJfdCBzaXplLAorICAgIHZvaWQgKmRhdGEsCisgICAgY29uc3QgYmNtY2xpX3Byb3BfZGVzY3IgKnBkLAorICAgIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtY2xpX3Nlc3Npb24gKnN0cjsKKyAgICB2b2lkICpwcm9wX2RhdGEgPSAodm9pZCAqKSgobG9uZylkYXRhICsgcGQtPm9mZnNldCk7CisKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IocGQtPm9mZnNldCA+PSBzaXplLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICBlcnIgPSBiY21jbGlfc2Vzc2lvbl9vcGVuX3N0cmluZygmc3RyLCBhcGlfY2xpKTsKKyAgICBCQ01PU19SRVRVUk5fSUZfRVJST1IoZXJyKTsKKyAgICBlcnIgPSBhcGljbGlfZHVtcF9wcm9wX3BhcmFtKHN0ciwgcGQsIHByb3BfZGF0YSwgcHJlZml4KTsKKyAgICBiY21jbGlfc2Vzc2lvbl9jbG9zZShzdHIpOworICAgIEJDTU9TX1JFVFVSTl9JRl9FUlJPUihlcnIpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwbGF5YmFja19hcGlfY2xpX2tleV93cml0ZSgKKyAgICBiY21vbHRfc3RyaW5nKiBhcGlfY2xpLAorICAgIGNvbnN0IGJjbW9sdF9tc2cqIG1zZywKKyAgICB1aW50MzJfdCBrZXlfc2l6ZSwKKyAgICB1aW50MzJfdCBrZXlfb2Zmc2V0KQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBjb25zdCBiY21jbGlfcHJvcF9kZXNjciAqcGQ7CisgICAgdm9pZCAqZGF0YSA9ICh2b2lkICopKChsb25nKW1zZyArIGtleV9vZmZzZXQpOworCisgICAgZm9yICh1aW50MTZfdCBwcm9wID0gMDsKKyAgICAgICAgIGFwaV9jbGlfb2JqZWN0X3Byb3BlcnR5KG1zZy0+b2JqX3R5cGUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBwcm9wLCAmcGQpID09IEJDTV9FUlJfT0s7CisgICAgICAgICArK3Byb3ApCisgICAgeworICAgICAgICBlcnIgPSBwbGF5YmFja19hcGlfY2xpX2FwcGVuZF9wcm9wKGFwaV9jbGksIGtleV9zaXplLCBkYXRhLCBwZCwgIiAiKTsKKyAgICAgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKGVycik7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwbGF5YmFja19hcGlfY2xpX3BtX3dyaXRlKGJjbW9sdF9zdHJpbmcgKmFwaV9jbGksIGNvbnN0IGJjbW9sdF9tc2cqIG1zZywgYmNtb2x0X3ByZXNlbmNlX21hc2sgcG0pCit7CisgICAgaW50IG47CisgICAgY29uc3QgYmNtY2xpX3Byb3BfZGVzY3IgKnBkOworCisgICAgZm9yICh1aW50MTZfdCBwcm9wID0gMDsKKyAgICAgICAgIGFwaV9jbGlfb2JqZWN0X3Byb3BlcnR5KG1zZy0+b2JqX3R5cGUsIG1zZy0+Z3JvdXAsIG1zZy0+c3ViZ3JvdXAsIHByb3AsICZwZCkgPT0gQkNNX0VSUl9PSzsKKyAgICAgICAgICsrcHJvcCkKKyAgICB7CisgICAgICAgIGlmICghKHBtICYgKDFVTEwgPDwgcHJvcCkpKQorICAgICAgICB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoYXBpX2NsaSwgIiAlcz15ZXMiLCBwZC0+bmFtZSk7CisgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcGxheWJhY2tfYXBpX2NsaV9wcm9wc193cml0ZSgKKyAgICBiY21vbHRfc3RyaW5nICphcGlfY2xpLAorICAgIGNvbnN0IGJjbW9sdF9tc2cqIG1zZywKKyAgICBjb25zdCBjaGFyICpwcmVmaXgsCisgICAgdWludDMyX3Qgc2l6ZSwKKyAgICB1aW50MzJfdCBvZmZzZXQpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGNvbnN0IGJjbWNsaV9wcm9wX2Rlc2NyICpwZDsKKyAgICB2b2lkICpkYXRhID0gKHZvaWQgKikoKGxvbmcpbXNnICsgb2Zmc2V0KTsKKworICAgIGZvciAodWludDE2X3QgcHJvcCA9IDA7CisgICAgICAgICBhcGlfY2xpX29iamVjdF9wcm9wZXJ0eShtc2ctPm9ial90eXBlLCBtc2ctPmdyb3VwLCBtc2ctPnN1Ymdyb3VwLCBwcm9wLCAmcGQpID09IEJDTV9FUlJfT0s7CisgICAgICAgICArK3Byb3ApCisgICAgeworICAgICAgICBpZiAoIShtc2ctPnByZXNlbmNlX21hc2sgJiAoMVVMTCA8PCBwcm9wKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGVyciA9IHBsYXliYWNrX2FwaV9jbGlfYXBwZW5kX3Byb3AoYXBpX2NsaSwgc2l6ZSwgZGF0YSwgcGQsIHByZWZpeCk7CisgICAgICAgIEJDTU9TX1JFVFVSTl9JRl9FUlJPUihlcnIpOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcGxheWJhY2tfYXBpX2NsaV9jbWRfZ2V0KAorICAgIGJjbW9sdF9zdHJpbmcgKmFwaV9jbGksCisgICAgY29uc3QgYmNtb2x0X21zZyogbXNnLAorICAgIGNvbnN0IGNoYXIgKmNtZCwKKyAgICBwYl9jbGlfZXh0cmEgZXh0cmFfcGFybXMsCisgICAgcGJfZmllbGRzIGZpZWxkX3Bhcm1zKQoreworICAgIGludCBuOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBjb25zdCBjaGFyICpuYW1lOworICAgIGNvbnN0IGNoYXIgKmRlc2M7CisgICAgdWludDMyX3Qga2V5X3NpemU7CisgICAgdWludDMyX3Qga2V5X29mZnNldDsKKyAgICB1aW50MzJfdCBkYXRhX3NpemU7CisgICAgdWludDMyX3QgZGF0YV9vZmZzZXQ7CisKKyAgICBCQ01fTE9HKERFQlVHLCBwYl9jdHh0W2N1cnJlbnRfZGV2aWNlXS5sb2dfaWQsICJTdGFydCAlc1xuIiwgY21kKTsKKworICAgIGVyciA9IGFwaV9jbGlfb2JqZWN0X25hbWUobXNnLT5vYmpfdHlwZSwgJm5hbWUsICZkZXNjKTsKKyAgICBCQ01PU19SRVRVUk5fSUZfRVJST1IoZXJyKTsKKworICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChhcGlfY2xpLCAiL2FwaS8lcyBvYmplY3Q9JXMiLCBjbWQsIG5hbWUpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworCisgICAgc3dpdGNoIChleHRyYV9wYXJtcykKKyAgICB7CisgICAgICAgIGNhc2UgUEJfQ0xJX0VYVFJBX01VTFRJOgorICAgICAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKAorICAgICAgICAgICAgICAgIGFwaV9jbGksCisgICAgICAgICAgICAgICAgIiBtYXhfbXNncz0ldSBmaWx0ZXJfaW52ZXJ0PSVzIiwKKyAgICAgICAgICAgICAgICBtc2ctPm1zZ19zZXQtPm1heF9pbnN0YW5jZXMsCisgICAgICAgICAgICAgICAgQklUU19TRVQobXNnLT5tc2dfc2V0LT5maWx0ZXJfZmxhZ3MsIEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTikgPyAieWVzIiA6ICJubyIpOworICAgICAgICAgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKG4gPD0gMCwgQkNNX0VSUl9JTlRFUk5BTCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQQl9DTElfRVhUUkFfU1RBVDoKKyAgICAgICAgICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChhcGlfY2xpLCAiIGNsZWFyPSVzIiwgQklUU19TRVQobXNnLT50eXBlLCBCQ01PTFRfTVNHX1RZUEVfQ0xFQVIpID8gInllcyIgOiAibm8iKTsKKyAgICAgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUEJfQ0xJX0VYVFJBX1NVQkdST1VQOgorICAgICAgICAgICAgZXJyID0gYXBpX2NsaV9vYmplY3Rfc3ViZ3JvdXBfbmFtZShtc2ctPm9ial90eXBlLCBtc2ctPmdyb3VwLCBtc2ctPnN1Ymdyb3VwLCAmbmFtZSwgJmRlc2MpOworICAgICAgICAgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKGVycik7CisgICAgICAgICAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoYXBpX2NsaSwgIiBzdWI9JXMiLCBuYW1lKTsKKyAgICAgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBnZXQgbWVzc2FnZSBpbmZvICovCisgICAgZXJyID0gYXBpX2NsaV9vYmplY3Rfc3RydWN0X3NpemUoCisgICAgICAgIG1zZy0+b2JqX3R5cGUsCisgICAgICAgIG1zZy0+Z3JvdXAsCisgICAgICAgIG1zZy0+c3ViZ3JvdXAsCisgICAgICAgICZrZXlfc2l6ZSwKKyAgICAgICAgJmtleV9vZmZzZXQsCisgICAgICAgICZkYXRhX3NpemUsCisgICAgICAgICZkYXRhX29mZnNldCk7CisgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKGVycik7CisKKyAgICBpZiAoQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRyAhPSBtc2ctPmdyb3VwKQorICAgIHsKKyAgICAgICAgLyogd3JpdGUga2V5ICovCisgICAgICAgIGVyciA9IHBsYXliYWNrX2FwaV9jbGlfa2V5X3dyaXRlKGFwaV9jbGksIG1zZywga2V5X3NpemUsIGtleV9vZmZzZXQpOworICAgICAgICBCQ01PU19SRVRVUk5fSUZfRVJST1IoZXJyKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGZpZWxkX3Bhcm1zKQorICAgIHsKKyAgICAgICAgY2FzZSBQQl9GSUVMRFNfR0VUOgorICAgICAgICAgICAgLyogd3JpdGUgcHJlc2VuY2UgbWFzayAqLworICAgICAgICAgICAgZXJyID0gcGxheWJhY2tfYXBpX2NsaV9wbV93cml0ZShhcGlfY2xpLCBtc2csIG1zZy0+cHJlc2VuY2VfbWFzayk7CisgICAgICAgICAgICBCQ01PU19SRVRVUk5fSUZfRVJST1IoZXJyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBCX0ZJRUxEU19NVUxUSToKKyAgICAgICAgICAgIC8qIHdyaXRlIGZpbHRlciAqLworICAgICAgICAgICAgZXJyID0gcGxheWJhY2tfYXBpX2NsaV9wcm9wc193cml0ZShhcGlfY2xpLCBtc2csICIgZmlsdGVyLiIsIGRhdGFfc2l6ZSwgZGF0YV9vZmZzZXQpOworICAgICAgICAgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKGVycik7CisgICAgICAgICAgICAvKiB3cml0ZSBwcmVzZW5jZSBtYXNrICovCisgICAgICAgICAgICBlcnIgPSBwbGF5YmFja19hcGlfY2xpX3BtX3dyaXRlKGFwaV9jbGksIG1zZywgbXNnLT5tc2dfc2V0LT5wcmVzZW5jZV9tYXNrKTsKKyAgICAgICAgICAgIEJDTU9TX1JFVFVSTl9JRl9FUlJPUihlcnIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUEJfRklFTERTX1NFVDoKKyAgICAgICAgICAgIC8qIHdyaXRlIHByb3BlcnRpZXMgKi8KKyAgICAgICAgICAgIGVyciA9IHBsYXliYWNrX2FwaV9jbGlfcHJvcHNfd3JpdGUoYXBpX2NsaSwgbXNnLCAiICIsIGRhdGFfc2l6ZSwgZGF0YV9vZmZzZXQpOworICAgICAgICAgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKGVycik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChhcGlfY2xpLCAiXG4iKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKworICAgIEJDTV9MT0coREVCVUcsIHBiX2N0eHRbY3VycmVudF9kZXZpY2VdLmxvZ19pZCwgIkVuZCAlc1xuIiwgY21kKTsKKworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwbGF5YmFja19hcGlfY2xpX2dldChiY21vbHRfc3RyaW5nKiBhcGlfY2xpLCBjb25zdCBiY21vbHRfbXNnKiBtc2cpCit7CisgICAgc3dpdGNoIChtc2ctPmdyb3VwKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLT50eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBsYXliYWNrX2FwaV9jbGlfY21kX2dldChhcGlfY2xpLCBtc2csICJnZXQiLCBQQl9DTElfRVhUUkFfTk9ORSwgUEJfRklFTERTX0dFVCk7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfR0VUX01VTFRJOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGxheWJhY2tfYXBpX2NsaV9jbWRfZ2V0KGFwaV9jbGksIG1zZywgIm11bHRpZ2V0IiwgUEJfQ0xJX0VYVFJBX01VTFRJLCBQQl9GSUVMRFNfTVVMVEkpOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBsYXliYWNrX2FwaV9jbGlfY21kX2dldChhcGlfY2xpLCBtc2csICJzZXQiLCBQQl9DTElfRVhUUkFfTk9ORSwgUEJfRklFTERTX1NFVCk7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwbGF5YmFja19hcGlfY2xpX2NtZF9nZXQoYXBpX2NsaSwgbXNnLCAiY2xlYXIiLCBQQl9DTElfRVhUUkFfTk9ORSwgUEJfRklFTERTX05PTkUpOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9TVEFUOgorICAgICAgICAgICAgcmV0dXJuIHBsYXliYWNrX2FwaV9jbGlfY21kX2dldChhcGlfY2xpLCBtc2csICJzdGF0IiwgUEJfQ0xJX0VYVFJBX1NUQVQsIFBCX0ZJRUxEU19HRVQpOworICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy0+dHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwbGF5YmFja19hcGlfY2xpX2NtZF9nZXQoYXBpX2NsaSwgbXNnLCAic2FnZXQiLCBQQl9DTElfRVhUUkFfU1VCR1JPVVAsIFBCX0ZJRUxEU19OT05FKTsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwbGF5YmFja19hcGlfY2xpX2NtZF9nZXQoYXBpX2NsaSwgbXNnLCAic2FzZXQiLCBQQl9DTElfRVhUUkFfU1VCR1JPVVAsIFBCX0ZJRUxEU19TRVQpOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9BVVRPX0NGRzoKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLT50eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBsYXliYWNrX2FwaV9jbGlfY21kX2dldChhcGlfY2xpLCBtc2csICJhY2dldCIsIFBCX0NMSV9FWFRSQV9OT05FLCBQQl9GSUVMRFNfR0VUKTsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwbGF5YmFja19hcGlfY2xpX2NtZF9nZXQoYXBpX2NsaSwgbXNnLCAiYWNzZXQiLCBQQl9DTElfRVhUUkFfTk9ORSwgUEJfRklFTERTX1NFVCk7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX09QRVI6CisgICAgICAgICAgICByZXR1cm4gcGxheWJhY2tfYXBpX2NsaV9jbWRfZ2V0KGFwaV9jbGksIG1zZywgIm9wZXIiLCBQQl9DTElfRVhUUkFfU1VCR1JPVVAsIFBCX0ZJRUxEU19TRVQpOworICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfUFJPWFk6CisgICAgICAgICAgICByZXR1cm4gcGxheWJhY2tfYXBpX2NsaV9jbWRfZ2V0KGFwaV9jbGksIG1zZywgInNlbmQiLCBQQl9DTElfRVhUUkFfU1VCR1JPVVAsIFBCX0ZJRUxEU19TRVQpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7CisgICAgfQorfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcGxheWJhY2tfY29udmVydF9hcGlfY2xpKGJjbW9sdF9wbGF5YmFjayAqbXBiLCBGSUxFICpvdXRfZmlsZSkKK3sKKyAgICBwbGF5YmFja19pdGVyYXRvciBpdDsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3N0cmluZyAqc3RyOworCisgICAgZXJyID0gYmNtb2x0X3N0cmluZ19jcmVhdGUoJnN0ciwgMjA0OCk7CisgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKGVycik7CisgICAgRk9SX0VBQ0hfUExBWUJBQ0tfTVNHKGl0LCBtcGItPmNhcHR1cmVfYnVmZmVyLCBtcGItPmJ1Zl9zaXplKQorICAgIHsKKyAgICAgICAgaWYgKHBsYXliYWNrX3Nob3VsZF9zZW5kKG1wYi0+bG9jYXRpb24sIChiY210cl9jbGRfZXZlbnRfdHlwZSlpdC5yYXcuaGRyLmV2ZW50KSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKEJDTV9FUlJfT0sgPT0gaXQuZXJyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJjbW9sdF9zdHJpbmdfcmVzZXQoc3RyKTsKKyAgICAgICAgICAgICAgICBlcnIgPSBwbGF5YmFja19hcGlfY2xpX2dldChzdHIsIGl0Lm1zZyk7CisgICAgICAgICAgICAgICAgZndyaXRlKGJjbW9sdF9zdHJpbmdfZ2V0KHN0ciksIHNpemVvZihjaGFyKSwgc3RybGVuKGJjbW9sdF9zdHJpbmdfZ2V0KHN0cikpLCBvdXRfZmlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXJyID0gaXQuZXJyOworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIHBiX2N0eHRbY3VycmVudF9kZXZpY2VdLmxvZ19pZCwgIlVucGFja2luZyBmYWlsZWQ6ICVzXG4iLCBiY21vc19zdHJlcnJvcihlcnIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBiY21vbHRfc3RyaW5nX2Rlc3Ryb3koc3RyKTsKKworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBiY21vc19ib29sIHBsYXliYWNrX2ZpZWxkX2NvbnRhaW5zX3Zhcl9saXN0KGNvbnN0IGJjbWNsaV90eXBlX2Rlc2NyICp0eXBlKQoreworICAgIGlmICh0eXBlID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHR5cGUtPmJhc2VfdHlwZSA9PSBCQ01PTFRfQkFTRV9UWVBFX0lEX0FSUl9EWU4pCisgICAgeworICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+YmFzZV90eXBlID09IEJDTU9MVF9CQVNFX1RZUEVfSURfQVJSX0ZJWEVEKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBsYXliYWNrX2ZpZWxkX2NvbnRhaW5zX3Zhcl9saXN0KHR5cGUtPnguYXJyX2ZpeGVkLmVsZW1fdHlwZSk7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmJhc2VfdHlwZSA9PSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCkKKyAgICB7CisgICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCB0eXBlLT54LnMubnVtX2ZpZWxkczsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocGxheWJhY2tfZmllbGRfY29udGFpbnNfdmFyX2xpc3QodHlwZS0+eC5zLmZpZWxkc1tpXS50eXBlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5iYXNlX3R5cGUgPT0gQkNNT0xUX0JBU0VfVFlQRV9JRF9VTklPTikKKyAgICB7CisgICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCB0eXBlLT54LnUubnVtX2NvbW1vbl9maWVsZHM7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBsYXliYWNrX2ZpZWxkX2NvbnRhaW5zX3Zhcl9saXN0KHR5cGUtPngudS5jb21tb25fZmllbGRzW2ldLnR5cGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBCQ01PU19UUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IHR5cGUtPngudS5jb21tb25fZmllbGRzW3R5cGUtPngudS5jbGFzc2lmaWVyX2lkeF0udHlwZS0+eC5lW2ldLm5hbWUgIT0gTlVMTDsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocGxheWJhY2tfZmllbGRfY29udGFpbnNfdmFyX2xpc3QodHlwZS0+eC51LnVuaW9uX2ZpZWxkc1tpXS50eXBlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBub3QgYSB2YXJpYWJsZSBzaXplZCBsaXN0ICovCisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX0ZBTFNFOworfQorCitzdGF0aWMgYmNtb3NfYm9vbCBwbGF5YmFja19tc2dfY29udGFpbnNfdmFyX2xpc3QoY29uc3QgYmNtb2x0X21zZyogbXNnKQoreworICAgIGNvbnN0IGJjbWNsaV9wcm9wX2Rlc2NyICpwZDsKKworICAgIGZvciAodWludDE2X3QgcHJvcCA9IDA7CisgICAgICAgICBhcGlfY2xpX29iamVjdF9wcm9wZXJ0eShtc2ctPm9ial90eXBlLCBtc2ctPmdyb3VwLCBtc2ctPnN1Ymdyb3VwLCBwcm9wLCAmcGQpID09IEJDTV9FUlJfT0s7CisgICAgICAgICArK3Byb3ApCisgICAgeworICAgICAgICBpZiAocGxheWJhY2tfZmllbGRfY29udGFpbnNfdmFyX2xpc3QocGQtPnR5cGUpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNT1NfVFJVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBCQ01PU19GQUxTRTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBsYXliYWNrX3N0cmluZ193cml0ZV91cHBlcihiY21vbHRfc3RyaW5nICpkZXN0LCBjb25zdCBjaGFyKiBzcmMpCit7CisgICAgaW50IG47CisKKyAgICB3aGlsZSAoKnNyYyAhPSAnXDAnKQorICAgIHsKKyAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGRlc3QsICIlYyIsIChjaGFyKXRvdXBwZXIoKGludCkqc3JjKSk7CisgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgICAgICArK3NyYzsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBsYXliYWNrX2NfYXBpX3BtX3dyaXRlKAorICAgIGJjbW9sdF9zdHJpbmcgKmNfYXBpLAorICAgIGNvbnN0IGJjbW9sdF9tc2cqIG1zZywKKyAgICBiY21vbHRfcHJlc2VuY2VfbWFzayBwbSwKKyAgICBjb25zdCBjaGFyICpleHRyYSwKKyAgICBjb25zdCBjaGFyICpmaWVsZCwKKyAgICBjb25zdCBjaGFyICpvYmopCit7CisgICAgaW50IG47CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGNvbnN0IGJjbWNsaV9wcm9wX2Rlc2NyICpwZDsKKworICAgIGZvciAodWludDE2X3QgcHJvcCA9IDA7CisgICAgICAgICBhcGlfY2xpX29iamVjdF9wcm9wZXJ0eShtc2ctPm9ial90eXBlLCBtc2ctPmdyb3VwLCBtc2ctPnN1Ymdyb3VwLCBwcm9wLCAmcGQpID09IEJDTV9FUlJfT0s7CisgICAgICAgICArK3Byb3ApCisgICAgeworICAgICAgICBpZiAoIShwbSAmICgxVUxMIDw8IHByb3ApKSkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGNfYXBpLCAiXHRCQ01PTFRfJXMiLCBleHRyYSk7CisgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgICAgICBlcnIgPSBwbGF5YmFja19zdHJpbmdfd3JpdGVfdXBwZXIoY19hcGksIGFwaWNsaV9tZ3RfZ3JvdXBfdG9fc3RyKG1zZy0+Z3JvdXApKTsKKyAgICAgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKGVycik7CisgICAgICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChjX2FwaSwgIl9QUk9QX0dFVCglcywgJXMsICVzKTtcbiIsIGZpZWxkLCBvYmosIHBkLT5uYW1lKTsKKyAgICAgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKG4gPD0gMCwgQkNNX0VSUl9JTlRFUk5BTCk7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwbGF5YmFja19jX2FwaV9hcHBlbmRfaW5pdCgKKyAgICBiY21vbHRfc3RyaW5nICpjX2FwaSwKKyAgICB2b2lkICpkYXRhLAorICAgIGNvbnN0IGJjbWNsaV90eXBlX2Rlc2NyICp0ZCwKKyAgICBjb25zdCBjaGFyKiBuYW1lKQoreworICAgIGJjbW9zX2Vycm5vIHJjOworICAgIGJjbWNsaV9zZXNzaW9uICpzdHI7CisKKyAgICByYyA9IGJjbWNsaV9zZXNzaW9uX29wZW5fc3RyaW5nKCZzdHIsIGNfYXBpKTsKKyAgICBCQ01PU19SRVRVUk5fSUZfRVJST1IocmMpOworICAgIHJjID0gYXBpY2xpX2R1bXBfZHluX2FycmF5KHN0ciwgdGQsIGRhdGEsIG5hbWUpOworICAgIGJjbWNsaV9zZXNzaW9uX2Nsb3NlKHN0cik7CisgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKHJjKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCisKK3N0YXRpYyBiY21vc19lcnJubyBwbGF5YmFja19jX2FwaV9hcHBlbmRfcHJvcCgKKyAgICBiY21vbHRfc3RyaW5nICpjX2FwaSwKKyAgICB1aW50MzJfdCBzaXplLAorICAgIHZvaWQgKmRhdGEsCisgICAgY29uc3QgYmNtY2xpX3Byb3BfZGVzY3IgKnBkKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21jbGlfc2Vzc2lvbiAqc3RyOworICAgIHZvaWQgKnByb3BfZGF0YSA9ICh2b2lkICopKChsb25nKWRhdGEgKyBwZC0+b2Zmc2V0KTsKKworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihwZC0+b2Zmc2V0ID49IHNpemUsIEJDTV9FUlJfSU5URVJOQUwpOworICAgIGVyciA9IGJjbWNsaV9zZXNzaW9uX29wZW5fc3RyaW5nKCZzdHIsIGNfYXBpKTsKKyAgICBCQ01PU19SRVRVUk5fSUZfRVJST1IoZXJyKTsKKyAgICBlcnIgPSBhcGljbGlfZHVtcF9wcm9wX2luaXRpYWxpemVyKHN0ciwgcGQsIHByb3BfZGF0YSk7CisgICAgYmNtY2xpX3Nlc3Npb25fY2xvc2Uoc3RyKTsKKyAgICBCQ01PU19SRVRVUk5fSUZfRVJST1IoZXJyKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcGxheWJhY2tfY19hcGlfbWFrZV92YXJfbGlzdHMoCisgICAgYmNtb2x0X3N0cmluZyAqY19hcGksCisgICAgY29uc3QgYmNtY2xpX3R5cGVfZGVzY3IgKnR5cGUsCisgICAgdm9pZCAqZGF0YSwKKyAgICBjb25zdCBjaGFyICpuYW1lKQoreworICAgIGludCBuOworICAgIGJjbW9zX2Vycm5vIHJjOworCisgICAgaWYgKHR5cGUgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKworICAgIGlmICh0eXBlLT5iYXNlX3R5cGUgPT0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRFlOKQorICAgIHsKKyAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGNfYXBpLCAiXHQlcyAlc1tdID0gIiwgdHlwZS0+eC5hcnJfZHluLmVsZW1fdHlwZS0+bmFtZSwgbmFtZSk7CisgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgICAgICByYyA9IHBsYXliYWNrX2NfYXBpX2FwcGVuZF9pbml0KGNfYXBpLCBkYXRhLCB0eXBlLCBuYW1lKTsKKyAgICAgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKHJjKTsKKyAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGNfYXBpLCAiO1xuIik7CisgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5iYXNlX3R5cGUgPT0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRklYRUQpCisgICAgeworICAgICAgICBmb3IgKHVpbnQxNl90IGkgPSAwOyBpIDwgdHlwZS0+eC5hcnJfZml4ZWQuc2l6ZTsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBjaGFyIGluZGV4X25hbWVbNjRdOworCisgICAgICAgICAgICBzcHJpbnRmKGluZGV4X25hbWUsICIlcyV1IiwgbmFtZSwgaSk7CisgICAgICAgICAgICByYyA9IHBsYXliYWNrX2NfYXBpX21ha2VfdmFyX2xpc3RzKGNfYXBpLCB0eXBlLT54LmFycl9maXhlZC5lbGVtX3R5cGUsIGRhdGEsIGluZGV4X25hbWUpOworICAgICAgICAgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKHJjKTsKKyAgICAgICAgICAgIGRhdGEgPSAodm9pZCopKChsb25nKWRhdGEgKyB0eXBlLT54LmFycl9maXhlZC5lbGVtX3R5cGUtPnNpemUpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmJhc2VfdHlwZSA9PSBCQ01PTFRfQkFTRV9UWVBFX0lEX1NUUlVDVCkKKyAgICB7CisgICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCB0eXBlLT54LnMubnVtX2ZpZWxkczsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBiY21jbGlfZmllbGRfZGVzY3IgKmZpZWxkID0gJnR5cGUtPngucy5maWVsZHNbaV07CisgICAgICAgICAgICByYyA9IHBsYXliYWNrX2NfYXBpX21ha2VfdmFyX2xpc3RzKGNfYXBpLCBmaWVsZC0+dHlwZSwgKHZvaWQqKSgobG9uZylkYXRhICsgZmllbGQtPm9mZnNldCksIGZpZWxkLT5uYW1lKTsKKyAgICAgICAgICAgIEJDTU9TX1JFVFVSTl9JRl9FUlJPUihyYyk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+YmFzZV90eXBlID09IEJDTU9MVF9CQVNFX1RZUEVfSURfVU5JT04pCisgICAgeworICAgICAgICBmb3IgKHVpbnQxNl90IGkgPSAwOyBpIDwgdHlwZS0+eC51Lm51bV9jb21tb25fZmllbGRzOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGJjbWNsaV9maWVsZF9kZXNjciAqZmllbGQgPSAmdHlwZS0+eC51LmNvbW1vbl9maWVsZHNbaV07CisgICAgICAgICAgICByYyA9IHBsYXliYWNrX2NfYXBpX21ha2VfdmFyX2xpc3RzKGNfYXBpLCBmaWVsZC0+dHlwZSwgKHZvaWQqKSgobG9uZylkYXRhICsgZmllbGQtPm9mZnNldCksIGZpZWxkLT5uYW1lKTsKKyAgICAgICAgICAgIEJDTU9TX1JFVFVSTl9JRl9FUlJPUihyYyk7CisgICAgICAgIH0KKyAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgdHlwZS0+eC51LmNvbW1vbl9maWVsZHNbdHlwZS0+eC51LmNsYXNzaWZpZXJfaWR4XS50eXBlLT54LmVbaV0ubmFtZSAhPSBOVUxMOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGJjbWNsaV9maWVsZF9kZXNjciAqZmllbGQgPSAmdHlwZS0+eC51LnVuaW9uX2ZpZWxkc1tpXTsKKyAgICAgICAgICAgIHJjID0gcGxheWJhY2tfY19hcGlfbWFrZV92YXJfbGlzdHMoY19hcGksIGZpZWxkLT50eXBlLCAodm9pZCopKChsb25nKWRhdGEgKyBmaWVsZC0+b2Zmc2V0KSwgZmllbGQtPm5hbWUpOworICAgICAgICAgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKHJjKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBub3QgYSB2YXJpYWJsZSBzaXplZCBsaXN0ICovCisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwbGF5YmFja19jX2FwaV9wcm9wc193cml0ZSgKKyAgICBiY21vbHRfc3RyaW5nICpjX2FwaSwKKyAgICBjb25zdCBiY21vbHRfbXNnKiBtc2csCisgICAgY29uc3QgY2hhciogb2JqZWN0LAorICAgIHVpbnQzMl90IHNpemUsCisgICAgdWludDMyX3Qgb2Zmc2V0KQoreworICAgIGludCBuOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBjb25zdCBjaGFyICpzdWJncm91cDsKKyAgICBjb25zdCBjaGFyICpkZXNjOworICAgIGNvbnN0IGJjbWNsaV9wcm9wX2Rlc2NyICpwZDsKKyAgICB2b2lkICpkYXRhID0gKHZvaWQgKikoKGxvbmcpbXNnICsgb2Zmc2V0KTsKKworICAgIGZvciAodWludDE2X3QgcHJvcCA9IDA7CisgICAgICAgICBhcGlfY2xpX29iamVjdF9wcm9wZXJ0eShtc2ctPm9ial90eXBlLCBtc2ctPmdyb3VwLCBtc2ctPnN1Ymdyb3VwLCBwcm9wLCAmcGQpID09IEJDTV9FUlJfT0s7CisgICAgICAgICArK3Byb3ApCisgICAgeworICAgICAgICBpZiAoIShtc2ctPnByZXNlbmNlX21hc2sgJiAoMVVMTCA8PCBwcm9wKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHBsYXliYWNrX2NfYXBpX21ha2VfdmFyX2xpc3RzKGNfYXBpLCBwZC0+dHlwZSwgKHZvaWQqKSgobG9uZylkYXRhICsgcGQtPm9mZnNldCksIHBkLT5uYW1lKTsKKyAgICB9CisKKyAgICBmb3IgKHVpbnQxNl90IHByb3AgPSAwOworICAgICAgICAgYXBpX2NsaV9vYmplY3RfcHJvcGVydHkobXNnLT5vYmpfdHlwZSwgbXNnLT5ncm91cCwgbXNnLT5zdWJncm91cCwgcHJvcCwgJnBkKSA9PSBCQ01fRVJSX09LOworICAgICAgICAgKytwcm9wKQorICAgIHsKKyAgICAgICAgaWYgKCEobXNnLT5wcmVzZW5jZV9tYXNrICYgKDFVTEwgPDwgcHJvcCkpKQorICAgICAgICB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHBkLT50eXBlLT5iYXNlX3R5cGUgPT0gQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QpIHx8CisgICAgICAgICAgICAocGQtPnR5cGUtPmJhc2VfdHlwZSA9PSBCQ01PTFRfQkFTRV9UWVBFX0lEX1VOSU9OKSB8fAorICAgICAgICAgICAgKHBkLT50eXBlLT5iYXNlX3R5cGUgPT0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRFlOKSB8fAorICAgICAgICAgICAgKHBkLT50eXBlLT5iYXNlX3R5cGUgPT0gQkNNT0xUX0JBU0VfVFlQRV9JRF9BUlJfRklYRUQpKQorICAgICAgICB7CisgICAgICAgICAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoY19hcGksICJcdCVzICJWQUxfUkVGIiA9ICIsIHBkLT50eXBlLT5uYW1lKTsKKyAgICAgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgICAgICAgICAgZXJyID0gcGxheWJhY2tfY19hcGlfYXBwZW5kX3Byb3AoY19hcGksIHNpemUsIGRhdGEsIHBkKTsKKyAgICAgICAgICAgIEJDTU9TX1JFVFVSTl9JRl9FUlJPUihlcnIpOworICAgICAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGNfYXBpLCAiO1xuIik7CisgICAgICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICAgICAgICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChjX2FwaSwgIlx0QkNNT0xUXyIpOworICAgICAgICAgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKG4gPD0gMCwgQkNNX0VSUl9JTlRFUk5BTCk7CisgICAgICAgICAgICBlcnIgPSBwbGF5YmFja19zdHJpbmdfd3JpdGVfdXBwZXIoY19hcGksIGFwaWNsaV9tZ3RfZ3JvdXBfdG9fc3RyKG1zZy0+Z3JvdXApKTsKKyAgICAgICAgICAgIEJDTU9TX1JFVFVSTl9JRl9FUlJPUihlcnIpOworICAgICAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGNfYXBpLCAiX1BST1BfU0VUKCZtc2csICVzIiwgb2JqZWN0KTsKKyAgICAgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgICAgICAgICAgaWYgKChtc2ctPmdyb3VwID09IEJDTU9MVF9NR1RfR1JPVVBfT1BFUikgfHwgKG1zZy0+Z3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9QUk9YWSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXJyID0gYXBpX2NsaV9vYmplY3Rfc3ViZ3JvdXBfbmFtZShtc2ctPm9ial90eXBlLCBtc2ctPmdyb3VwLCBtc2ctPnN1Ymdyb3VwLCAmc3ViZ3JvdXAsICZkZXNjKTsKKyAgICAgICAgICAgICAgICBCQ01PU19SRVRVUk5fSUZfRVJST1IoZXJyKTsKKyAgICAgICAgICAgICAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoY19hcGksICIsICVzIiwgc3ViZ3JvdXApOworICAgICAgICAgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGNfYXBpLCAiLCAlcywgIlZBTF9SRUYiKTtcbiIsIHBkLT5uYW1lKTsKKyAgICAgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGNfYXBpLCAiXHRCQ01PTFRfIik7CisgICAgICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICAgICAgICAgIGVyciA9IHBsYXliYWNrX3N0cmluZ193cml0ZV91cHBlcihjX2FwaSwgYXBpY2xpX21ndF9ncm91cF90b19zdHIobXNnLT5ncm91cCkpOworICAgICAgICAgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKGVycik7CisgICAgICAgICAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoY19hcGksICJfUFJPUF9TRVQoJm1zZywgJXMiLCBvYmplY3QpOworICAgICAgICAgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKG4gPD0gMCwgQkNNX0VSUl9JTlRFUk5BTCk7CisgICAgICAgICAgICBpZiAoKG1zZy0+Z3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9PUEVSKSB8fCAobXNnLT5ncm91cCA9PSBCQ01PTFRfTUdUX0dST1VQX1BST1hZKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBhcGlfY2xpX29iamVjdF9zdWJncm91cF9uYW1lKG1zZy0+b2JqX3R5cGUsIG1zZy0+Z3JvdXAsIG1zZy0+c3ViZ3JvdXAsICZzdWJncm91cCwgJmRlc2MpOworICAgICAgICAgICAgICAgIEJDTU9TX1JFVFVSTl9JRl9FUlJPUihlcnIpOworICAgICAgICAgICAgICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChjX2FwaSwgIiwgJXMiLCBzdWJncm91cCk7CisgICAgICAgICAgICAgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKG4gPD0gMCwgQkNNX0VSUl9JTlRFUk5BTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoY19hcGksICIsICVzLCAiLCBwZC0+bmFtZSk7CisgICAgICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICAgICAgICAgIGVyciA9IHBsYXliYWNrX2NfYXBpX2FwcGVuZF9wcm9wKGNfYXBpLCBzaXplLCBkYXRhLCBwZCk7CisgICAgICAgICAgICBCQ01PU19SRVRVUk5fSUZfRVJST1IoZXJyKTsKKyAgICAgICAgICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChjX2FwaSwgIik7XG4iKTsKKyAgICAgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwbGF5YmFja19jX2FwaV9jb2RlX2dldCgKKyAgICBiY21vbHRfc3RyaW5nKiBjX2FwaSwKKyAgICBjb25zdCBiY21vbHRfbXNnKiBtc2csCisgICAgY29uc3QgY2hhciAqY2FsbCwKKyAgICBwYl9maWVsZHMgZmllbGRfcGFybXMpCit7CisgICAgaW50IG47CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGNvbnN0IGNoYXIgKm9iamVjdDsKKyAgICBjb25zdCBjaGFyICpncm91cDsKKyAgICBjb25zdCBjaGFyICpzdWJncm91cDsKKyAgICBjb25zdCBjaGFyICpkZXNjOworICAgIHVpbnQzMl90IGtleV9zaXplOworICAgIHVpbnQzMl90IGtleV9vZmZzZXQ7CisgICAgdWludDMyX3QgZGF0YV9zaXplOworICAgIHVpbnQzMl90IGRhdGFfb2Zmc2V0OworICAgIHZvaWQgKmRhdGE7CisgICAgY29uc3QgYmNtY2xpX3Byb3BfZGVzY3IgKnBkOworICAgIGJjbW9zX2Jvb2wgdmFyX2xpc3QgPSAoQkNNT0xUX01TR19UWVBFX0dFVCA9PSBtc2ctPnR5cGUpICYmIHBsYXliYWNrX21zZ19jb250YWluc192YXJfbGlzdChtc2cpOworCisgICAgZXJyID0gYXBpX2NsaV9vYmplY3RfbmFtZShtc2ctPm9ial90eXBlLCAmb2JqZWN0LCAmZGVzYyk7CisgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKGVycik7CisgICAgZXJyID0gYXBpX2NsaV9vYmplY3Rfc3ViZ3JvdXBfbmFtZShtc2ctPm9ial90eXBlLCBtc2ctPmdyb3VwLCBtc2ctPnN1Ymdyb3VwLCAmc3ViZ3JvdXAsICZkZXNjKTsKKyAgICBCQ01PU19SRVRVUk5fSUZfRVJST1IoZXJyKTsKKworICAgIGdyb3VwID0gYXBpY2xpX21ndF9ncm91cF90b19zdHIobXNnLT5ncm91cCk7CisKKyAgICAvKiBnZXQgbWVzc2FnZSBpbmZvICovCisgICAgZXJyID0gYXBpX2NsaV9vYmplY3Rfc3RydWN0X3NpemUoCisgICAgICAgIG1zZy0+b2JqX3R5cGUsCisgICAgICAgIG1zZy0+Z3JvdXAsCisgICAgICAgIG1zZy0+c3ViZ3JvdXAsCisgICAgICAgICZrZXlfc2l6ZSwKKyAgICAgICAgJmtleV9vZmZzZXQsCisgICAgICAgICZkYXRhX3NpemUsCisgICAgICAgICZkYXRhX29mZnNldCk7CisgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKGVycik7CisKKyAgICAvKiBpbml0IHZhcmlhYmxlcyAqLworICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChjX2FwaSwgIlx0e1xuIik7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKG4gPD0gMCwgQkNNX0VSUl9JTlRFUk5BTCk7CisgICAgaWYgKChtc2ctPmdyb3VwID09IEJDTU9MVF9NR1RfR1JPVVBfT1BFUikgfHwgKG1zZy0+Z3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9QUk9YWSkpCisgICAgeworICAgICAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoY19hcGksICJcdGJjbW9sdF8lc18lcyAiTVNHX1JFRiI7XG4iLCBvYmplY3QsIHN1Ymdyb3VwKTsKKyAgICAgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKG4gPD0gMCwgQkNNX0VSUl9JTlRFUk5BTCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChjX2FwaSwgIlx0YmNtb2x0XyVzXyVzICJNU0dfUkVGIjtcbiIsIG9iamVjdCwgZ3JvdXApOworICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICB9CisgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGNfYXBpLCAiXHRiY21vbHRfJXNfa2V5ICJLRVlfUkVGIiA9IHsgfTtcbiIsIG9iamVjdCk7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKG4gPD0gMCwgQkNNX0VSUl9JTlRFUk5BTCk7CisKKyAgICBpZiAodmFyX2xpc3QpCisgICAgeworICAgICAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoY19hcGksICJcdHVpbnQ4X3QqICJMSVNUX01FTV9SRUYiO1xuIik7CisgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgIH0KKworICAgIGlmIChtc2ctPnR5cGUgPT0gQkNNT0xUX01TR19UWVBFX0dFVF9NVUxUSSkKKyAgICB7CisgICAgICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChjX2FwaSwgIlx0YmNtb2x0X21zZ19zZXQqICJNU0dfU0VUX1JFRiIgPSBOVUxMO1xuIik7CisgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgICAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoY19hcGksICJcdHVpbnQzMl90ICJNQVhfTVNHU19SRUYiO1xuIik7CisgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgICAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoY19hcGksICJcdGJjbW9zX2Jvb2wgIklOVkVSVF9GSUxURVJfUkVGIjtcblxuIik7CisgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgICAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoY19hcGksICJcdCJNQVhfTVNHU19SRUYiID0gJWQ7XG4iLCBtc2ctPm1zZ19zZXQtPm1heF9pbnN0YW5jZXMpOworICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGNfYXBpLCAiXHQiSU5WRVJUX0ZJTFRFUl9SRUYiID0gJXM7XG4iLCBCSVRTX1NFVChtc2ctPm1zZ19zZXQtPmZpbHRlcl9mbGFncywgQkNNT0xUX0ZJTFRFUl9GTEFHU19JTlZFUlRfU0VMRUNUSU9OKSA/ICJCQ01PU19UUlVFIiA6ICJCQ01PU19GQUxTRSIpOworICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGNfYXBpLCAiXHRiY21vbHRfbXNnX3NldF9hbGxvYyhCQ01PTFRfT0JKX0lEXyIpOworICAgICAgICBlcnIgPSBwbGF5YmFja19zdHJpbmdfd3JpdGVfdXBwZXIoY19hcGksIG9iamVjdCk7CisgICAgICAgIEJDTU9TX1JFVFVSTl9JRl9FUlJPUihlcnIpOworICAgICAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoY19hcGksICIsIEJDTU9MVF9NR1RfR1JPVVBfIik7CisgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgICAgICBlcnIgPSBwbGF5YmFja19zdHJpbmdfd3JpdGVfdXBwZXIoY19hcGksIGdyb3VwKTsKKyAgICAgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKGVycik7CisgICAgICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChjX2FwaSwgIiwgIk1BWF9NU0dTX1JFRiIsICYiTVNHX1NFVF9SRUYiKTtcbiIpOworICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICB9CisgICAgZWxzZSBpZiAobXNnLT5ncm91cCA9PSBCQ01PTFRfTUdUX0dST1VQX1NUQVQpCisgICAgeworICAgICAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoY19hcGksICJcdGJjbW9sdF9zdGF0X2ZsYWdzICJTVEFUX0ZMQUdTX1JFRiI7XG5cbiIpOworICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGNfYXBpLCAiXHQiU1RBVF9GTEFHU19SRUYiID0gJXM7XG4iLCBCSVRTX1NFVChtc2ctPnR5cGUsIEJDTU9MVF9NU0dfVFlQRV9DTEVBUikgPyAiQkNNT0xUX1NUQVRfRkxBR1NfQ0xFQVJfT05fUkVBRCIgOiAiQkNNT0xUX1NUQVRfRkxBR1NfTk9ORSIpOworICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGNfYXBpLCAiXG4iKTsKKyAgICAgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKG4gPD0gMCwgQkNNX0VSUl9JTlRFUk5BTCk7CisgICAgfQorCisgICAgLyogc2V0IGtleSAqLworICAgIGlmIChCQ01PTFRfTUdUX0dST1VQX0FVVE9fQ0ZHICE9IG1zZy0+Z3JvdXApCisgICAgeworICAgICAgICAvKiB3cml0ZSBrZXkgKi8KKyAgICAgICAgZGF0YSA9ICh2b2lkICopKChsb25nKW1zZyArIGtleV9vZmZzZXQpOworICAgICAgICBmb3IgKHVpbnQxNl90IHByb3AgPSAwOworICAgICAgICAgICAgIGFwaV9jbGlfb2JqZWN0X3Byb3BlcnR5KG1zZy0+b2JqX3R5cGUsIEJDTU9MVF9NR1RfR1JPVVBfS0VZLCAwLCBwcm9wLCAmcGQpID09IEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgKytwcm9wKQorICAgICAgICB7CisgICAgICAgICAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoY19hcGksICJcdCJLRVlfUkVGIi4lcyA9ICIsIHBkLT5uYW1lKTsKKyAgICAgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgICAgICAgICAgaWYgKChCQ01PTFRfQkFTRV9UWVBFX0lEX01BQyA9PSBwZC0+dHlwZS0+YmFzZV90eXBlKSB8fAorICAgICAgICAgICAgICAgIChCQ01PTFRfQkFTRV9UWVBFX0lEX0lQVjQgPT0gcGQtPnR5cGUtPmJhc2VfdHlwZSkgfHwKKyAgICAgICAgICAgICAgICAoQkNNT0xUX0JBU0VfVFlQRV9JRF9TVFJVQ1QgPT0gcGQtPnR5cGUtPmJhc2VfdHlwZSkgfHwKKyAgICAgICAgICAgICAgICAoQkNNT0xUX0JBU0VfVFlQRV9JRF9VTklPTiA9PSBwZC0+dHlwZS0+YmFzZV90eXBlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoY19hcGksICIoJXMpIiwgcGQtPnR5cGUtPm5hbWUpOworICAgICAgICAgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXJyID0gcGxheWJhY2tfY19hcGlfYXBwZW5kX3Byb3AoY19hcGksIGtleV9zaXplLCBkYXRhLCBwZCk7CisgICAgICAgICAgICBCQ01PU19SRVRVUk5fSUZfRVJST1IoZXJyKTsKKyAgICAgICAgICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChjX2FwaSwgIjtcbiIpOworICAgICAgICAgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKG4gPD0gMCwgQkNNX0VSUl9JTlRFUk5BTCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBzZXQgcHJvcGVydGllcyAqLworICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChjX2FwaSwgIlx0QkNNT0xUXyIpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgIGVyciA9IHBsYXliYWNrX3N0cmluZ193cml0ZV91cHBlcihjX2FwaSwgZ3JvdXApOworICAgIEJDTU9TX1JFVFVSTl9JRl9FUlJPUihlcnIpOworICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChjX2FwaSwgIl9JTklUKCYiTVNHX1JFRiIsICVzIiwgb2JqZWN0KTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICBpZiAoKG1zZy0+Z3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9TVEFUX0NGRykgfHwKKyAgICAgICAgKG1zZy0+Z3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9PUEVSKSB8fAorICAgICAgICAobXNnLT5ncm91cCA9PSBCQ01PTFRfTUdUX0dST1VQX1BST1hZKSkKKyAgICB7CisgICAgICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChjX2FwaSwgIiwgJXMiLCBzdWJncm91cCk7CisgICAgICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgIH0KKyAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoY19hcGksICIsICJLRVlfUkVGIik7XG4iKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKworICAgIHN3aXRjaCAoZmllbGRfcGFybXMpCisgICAgeworICAgICAgICBjYXNlIFBCX0ZJRUxEU19HRVQ6CisgICAgICAgICAgICAvKiB3cml0ZSBwcmVzZW5jZSBtYXNrICovCisgICAgICAgICAgICBlcnIgPSBwbGF5YmFja19jX2FwaV9wbV93cml0ZShjX2FwaSwgbXNnLCBtc2ctPnByZXNlbmNlX21hc2ssICIiLCAiJiJNU0dfUkVGLCBvYmplY3QpOworICAgICAgICAgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKGVycik7CisgICAgICAgICAgICBpZiAodmFyX2xpc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGNfYXBpLCAiXHQiTElTVF9NRU1fUkVGIiA9IGJjbW9zX2NhbGxvYygiRFlOX0xJU1RfU0laRSIpO1xuIik7CisgICAgICAgICAgICAgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKG4gPD0gMCwgQkNNX0VSUl9JTlRFUk5BTCk7CisgICAgICAgICAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKAorICAgICAgICAgICAgICAgICAgICBjX2FwaSwKKyAgICAgICAgICAgICAgICAgICAgIlx0QkNNT0xUX0NGR19MSVNUX0JVRl9TRVQoJiJNU0dfUkVGIiwgJXMsICJMSVNUX01FTV9SRUYiLCAiRFlOX0xJU1RfU0laRSIpO1xuIiwgb2JqZWN0KTsKKyAgICAgICAgICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBCX0ZJRUxEU19NVUxUSToKKyAgICAgICAgICAgIC8qIHdyaXRlIGZpbHRlciAqLworICAgICAgICAgICAgZXJyID0gcGxheWJhY2tfY19hcGlfcHJvcHNfd3JpdGUoY19hcGksIG1zZywgb2JqZWN0LCBkYXRhX3NpemUsIGRhdGFfb2Zmc2V0KTsKKyAgICAgICAgICAgIEJDTU9TX1JFVFVSTl9JRl9FUlJPUihlcnIpOworICAgICAgICAgICAgLyogd3JpdGUgcHJlc2VuY2UgbWFzayAqLworICAgICAgICAgICAgZXJyID0gcGxheWJhY2tfY19hcGlfcG1fd3JpdGUoY19hcGksIG1zZywgbXNnLT5wcmVzZW5jZV9tYXNrLCAiTVNHU0VUXyIsIE1TR19TRVRfUkVGLCBvYmplY3QpOworICAgICAgICAgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKGVycik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQQl9GSUVMRFNfU0VUOgorICAgICAgICAgICAgLyogd3JpdGUgcHJvcGVydGllcyAqLworICAgICAgICAgICAgZXJyID0gcGxheWJhY2tfY19hcGlfcHJvcHNfd3JpdGUoY19hcGksIG1zZywgb2JqZWN0LCBkYXRhX3NpemUsIGRhdGFfb2Zmc2V0KTsKKyAgICAgICAgICAgIEJDTU9TX1JFVFVSTl9JRl9FUlJPUihlcnIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBjYWxsIEFQSSAqLworICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChjX2FwaSwgIlx0IlJDX1JFRiIgPSBiY21vbHRfJXNfJXMoIkRFVklDRV9SRUYiLCAmIk1TR19SRUYiLmhkciIsIGdyb3VwLCBjYWxsKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICBpZiAobXNnLT50eXBlID09IEJDTU9MVF9NU0dfVFlQRV9HRVRfTVVMVEkpCisgICAgeworICAgICAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoCisgICAgICAgICAgICBjX2FwaSwKKyAgICAgICAgICAgICIsICgiSU5WRVJUX0ZJTFRFUl9SRUYiKSA/IEJDTU9MVF9GSUxURVJfRkxBR1NfSU5WRVJUX1NFTEVDVElPTiA6IEJDTU9MVF9GSUxURVJfRkxBR1NfTk9ORSwgIk1TR19TRVRfUkVGKTsKKyAgICAgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKG4gPD0gMCwgQkNNX0VSUl9JTlRFUk5BTCk7CisgICAgfQorICAgIGVsc2UgaWYgKG1zZy0+Z3JvdXAgPT0gQkNNT0xUX01HVF9HUk9VUF9TVEFUKQorICAgIHsKKyAgICAgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGNfYXBpLCAiLCAiU1RBVF9GTEFHU19SRUYpOworICAgICAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogZG8gbm90aGluZyAqLworICAgIH0KKyAgICBuID0gYmNtb2x0X3N0cmluZ19hcHBlbmQoY19hcGksICIpO1xuIik7CisgICAgQkNNT1NfQ0hFQ0tfUkVUVVJOX0VSUk9SKG4gPD0gMCwgQkNNX0VSUl9JTlRFUk5BTCk7CisgICAgbiA9IGJjbW9sdF9zdHJpbmdfYXBwZW5kKGNfYXBpLCAiXHRiY21vc19wcmludGYoXCJiY21vbHRfJXNfJXMgcmV0dXJuZWQgJSVzICglJWQpXFxuXCIsIGJjbW9zX3N0cmVycm9yKCJSQ19SRUYiKSwgIlJDX1JFRiIpO1xuIiwgZ3JvdXAsIGNhbGwpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUihuIDw9IDAsIEJDTV9FUlJfSU5URVJOQUwpOworICAgIG4gPSBiY21vbHRfc3RyaW5nX2FwcGVuZChjX2FwaSwgIlx0fVxuXG4iKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IobiA8PSAwLCBCQ01fRVJSX0lOVEVSTkFMKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcGxheWJhY2tfY19hcGlfZ2V0KGJjbW9sdF9zdHJpbmcqIGNfYXBpLCBjb25zdCBiY21vbHRfbXNnKiBtc2cpCit7CisgICAgc3dpdGNoIChtc2ctPmdyb3VwKQorICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX0NGRzoKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLT50eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX0dFVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBsYXliYWNrX2NfYXBpX2NvZGVfZ2V0KGNfYXBpLCBtc2csICJnZXQiLCBQQl9GSUVMRFNfR0VUKTsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVRfTVVMVEk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwbGF5YmFja19jX2FwaV9jb2RlX2dldChjX2FwaSwgbXNnLCAiZ2V0X211bHRpIiwgUEJfRklFTERTX01VTFRJKTsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9TRVQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwbGF5YmFja19jX2FwaV9jb2RlX2dldChjX2FwaSwgbXNnLCAic2V0IiwgUEJfRklFTERTX1NFVCk7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfQ0xFQVI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwbGF5YmFja19jX2FwaV9jb2RlX2dldChjX2FwaSwgbXNnLCAiY2xlYXIiLCBQQl9GSUVMRFNfTk9ORSk7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU5URVJOQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1NUQVQ6CisgICAgICAgICAgICByZXR1cm4gcGxheWJhY2tfY19hcGlfY29kZV9nZXQoY19hcGksIG1zZywgImdldCIsIFBCX0ZJRUxEU19HRVQpOworICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfU1RBVF9DRkc6CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy0+dHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwbGF5YmFja19jX2FwaV9jb2RlX2dldChjX2FwaSwgbXNnLCAiZ2V0IiwgUEJfRklFTERTX05PTkUpOworICAgICAgICAgICAgICAgIGNhc2UgQkNNT0xUX01TR19UWVBFX1NFVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBsYXliYWNrX2NfYXBpX2NvZGVfZ2V0KGNfYXBpLCBtc2csICJzZXQiLCBQQl9GSUVMRFNfU0VUKTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJDTU9MVF9NR1RfR1JPVVBfQVVUT19DRkc6CisgICAgICAgICAgICBzd2l0Y2ggKG1zZy0+dHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJDTU9MVF9NU0dfVFlQRV9HRVQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwbGF5YmFja19jX2FwaV9jb2RlX2dldChjX2FwaSwgbXNnLCAiZ2V0IiwgUEJfRklFTERTX0dFVCk7CisgICAgICAgICAgICAgICAgY2FzZSBCQ01PTFRfTVNHX1RZUEVfU0VUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGxheWJhY2tfY19hcGlfY29kZV9nZXQoY19hcGksIG1zZywgInNldCIsIFBCX0ZJRUxEU19TRVQpOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX0lOVEVSTkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkNNT0xUX01HVF9HUk9VUF9PUEVSOgorICAgICAgICAgICAgcmV0dXJuIHBsYXliYWNrX2NfYXBpX2NvZGVfZ2V0KGNfYXBpLCBtc2csICJzdWJtaXQiLCBQQl9GSUVMRFNfU0VUKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfTUdUX0dST1VQX1BST1hZOgorICAgICAgICAgICAgcmV0dXJuIHBsYXliYWNrX2NfYXBpX2NvZGVfZ2V0KGNfYXBpLCBtc2csICJzZW5kIiwgUEJfRklFTERTX1NFVCk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9JTlRFUk5BTDsKKyAgICB9Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwbGF5YmFja19jb252ZXJ0X2NfYXBpKGJjbW9sdF9wbGF5YmFjayAqbXBiLCBGSUxFICpvdXRfZmlsZSkKK3sKKyAgICBwbGF5YmFja19pdGVyYXRvciBpdDsKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3N0cmluZyAqc3RyOworICAgIHVpbnQzMl90IGxhc3RfdGltZV91cyA9IDA7CisgICAgYmNtb3NfYm9vbCBmaXJzdCA9IEJDTU9TX1RSVUU7CisKKyAgICBlcnIgPSBiY21vbHRfc3RyaW5nX2NyZWF0ZSgmc3RyLCAxNjM4NCk7CisgICAgQkNNT1NfUkVUVVJOX0lGX0VSUk9SKGVycik7CisgICAgZnByaW50ZihvdXRfZmlsZSwgInZvaWQgcnVuX3BsYXliYWNrKHZvaWQpXG57XG4iKTsKKyAgICBmcHJpbnRmKG91dF9maWxlLCAiXHRiY21vbHRfZGV2aWQgIkRFVklDRV9SRUYiID0gJWQ7XG4iLCBjdXJyZW50X2RldmljZSk7CisgICAgZnByaW50ZihvdXRfZmlsZSwgIlx0YmNtb3NfZXJybm8gIlJDX1JFRiIgPSBCQ01fRVJSX09LO1xuXG4iKTsKKyAgICBGT1JfRUFDSF9QTEFZQkFDS19NU0coaXQsIG1wYi0+Y2FwdHVyZV9idWZmZXIsIG1wYi0+YnVmX3NpemUpCisgICAgeworICAgICAgICBpZiAocGxheWJhY2tfc2hvdWxkX3NlbmQobXBiLT5sb2NhdGlvbiwgKGJjbXRyX2NsZF9ldmVudF90eXBlKWl0LnJhdy5oZHIuZXZlbnQpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoQkNNX0VSUl9PSyA9PSBpdC5lcnIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIGFwcHJveGltYXRlIG9yaWdpbmFsIHRpbWluZzsgZG9lc24ndCBhY2NvdW50IGZvciBwcm9jZXNzaW5nIHRpbWUgaW4gdGhpcyBjb2RlIC0gdGhpcyBjb3VsZCBiZQorICAgICAgICAgICAgICAgICAgICAgICBpbXByb3ZlZCAqLworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKG91dF9maWxlLCAiXG5cdGJjbW9zX3VzbGVlcCgldSk7XG5cbiIsIGl0LnJhdy5oZHIudGltZXN0YW1wIC0gbGFzdF90aW1lX3VzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBCQ01PU19GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGFzdF90aW1lX3VzID0gaXQucmF3Lmhkci50aW1lc3RhbXA7CisgICAgICAgICAgICAgICAgYmNtb2x0X3N0cmluZ19yZXNldChzdHIpOworICAgICAgICAgICAgICAgIGVyciA9IHBsYXliYWNrX2NfYXBpX2dldChzdHIsIGl0Lm1zZyk7CisgICAgICAgICAgICAgICAgZndyaXRlKGJjbW9sdF9zdHJpbmdfZ2V0KHN0ciksIHNpemVvZihjaGFyKSwgc3RybGVuKGJjbW9sdF9zdHJpbmdfZ2V0KHN0cikpLCBvdXRfZmlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXJyID0gaXQuZXJyOworICAgICAgICAgICAgICAgIEJDTV9MT0coRVJST1IsIHBiX2N0eHRbY3VycmVudF9kZXZpY2VdLmxvZ19pZCwgIlVucGFja2luZyBmYWlsZWQ6ICVzXG4iLCBiY21vc19zdHJlcnJvcihlcnIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBmcHJpbnRmKG91dF9maWxlLCAifVxuIik7CisgICAgYmNtb2x0X3N0cmluZ19kZXN0cm95KHN0cik7CisKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcGxheWJhY2tfY29udmVydChiY21vbHRfcGxheWJhY2sgKm1wYiwgcGJfZm9ybWF0IGZvcm1hdCwgRklMRSAqb3V0X2ZpbGUpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgc3dpdGNoIChmb3JtYXQpCisgICAgeworICAgICAgICBjYXNlIFBCX0ZPUk1BVF9BUElfQ0xJOgorICAgICAgICAgICAgZXJyID0gcGxheWJhY2tfY29udmVydF9hcGlfY2xpKG1wYiwgb3V0X2ZpbGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUEJfRk9STUFUX0NfQVBJOgorICAgICAgICAgICAgZXJyID0gcGxheWJhY2tfY29udmVydF9jX2FwaShtcGIsIG91dF9maWxlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZXJyID0gQkNNX0VSUl9QQVJNOworICAgICAgICAgICAgQkNNX0xPRyhFUlJPUiwgcGJfY3R4dFtjdXJyZW50X2RldmljZV0ubG9nX2lkLCAiVW5rbm93biBmb3JtYXQ6ICVkXG4iLCBmb3JtYXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBsYXliYWNrX2NsaV9jb252KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybVtdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGNvbnN0IGNoYXIgKmluZmlsZW5hbWUgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpbmZpbGUiKS0+dmFsdWUuc3RyaW5nOworICAgIGNvbnN0IGNoYXIgKm91dGZpbGVuYW1lID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAib3V0ZmlsZSIpLT52YWx1ZS5zdHJpbmc7CisgICAgcGJfZm9ybWF0IGZvcm1hdCA9IChwYl9mb3JtYXQpYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZm9ybWF0IiktPnZhbHVlLmVudW1fdmFsOworICAgIGJjbW9zX2Jvb2wgaWdub3JlX3ZlciA9IEJDTU9TX0ZBTFNFOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfcGxheWJhY2sgbXBiID0ge307CisgICAgRklMRSAqb3V0X2ZpbGU7CisKKyAgICBiY21jbGlfY21kX3Bhcm0gKml2X3Bhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJpZ25vcmVfdmVyc2lvbiIpOworICAgIGlmIChpdl9wYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBpZ25vcmVfdmVyID0gaXZfcGFybS0+dmFsdWUuZW51bV92YWwgPT0gKGxvbmcpQkNNT1NfVFJVRTsKKyAgICB9CisKKyAgICBlcnIgPSBwbGF5YmFja19maWxlX29wZW4oaW5maWxlbmFtZSwgJm1wYik7CisKKyAgICBpZiAoQkNNX0VSUl9PSyA9PSBlcnIpCisgICAgeworICAgICAgICBpZiAocGxheWJhY2tfdmVyc2lvbl9tYXRjaCgmbXBiKSB8fCBpZ25vcmVfdmVyKQorICAgICAgICB7CisgICAgICAgICAgICBvdXRfZmlsZSA9IGZvcGVuKG91dGZpbGVuYW1lLCAid2IiKTsKKyAgICAgICAgICAgIHBsYXliYWNrX2NvbnZlcnQoJm1wYiwgZm9ybWF0LCBvdXRfZmlsZSk7CisgICAgICAgICAgICBmY2xvc2Uob3V0X2ZpbGUpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3ByaW50KHNlc3Npb24sICJQb3NzaWJsZSB2ZXJzaW9uIG1pc21hdGNoOyB1c2UgaWdub3JlX3ZlcnNpb249eWVzIHRvIGZvcmNlIGNvbnZlcnNpb25cbiIpOworICAgICAgICAgICAgZXJyID0gQkNNX0VSUl9JTUFHRV9UWVBFOworICAgICAgICB9CisgICAgICAgIGJjbW9zX2ZyZWUobXBiLmNhcHR1cmVfYnVmZmVyKTsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCit2b2lkIGJjbW9sdF91c2VyX2FwcGxfcGxheWJhY2tfY2xpX2luaXQoYmNtY2xpX2VudHJ5ICp0b3BfZGlyKQoreworI2lmZGVmIEVOQUJMRV9DTEkKKyAgICBiY21jbGlfZW50cnkgKnBsYl9kaXIgPSBiY21jbGlfZGlyX2FkZCh0b3BfZGlyLCAicGxheWJhY2siLCAicGxheWJhY2siLCBCQ01DTElfQUNDRVNTX0FETUlOLCBOVUxMKTsKKyAgICBCVUdfT04oTlVMTCA9PSBwbGJfZGlyKTsKKworICAgIHN0YXRpYyBiY21jbGlfZW51bV92YWwgZm9ybWF0X2VudW1fdGFibGVbUEJfRk9STUFUX19DT1VOVCsxXSA9CisgICAgeworICAgICAgICB7Lm5hbWUgPSAiYXBpX2NsaSIsIC52YWwgPSAobG9uZylQQl9GT1JNQVRfQVBJX0NMSX0sCisgICAgICAgIHsubmFtZSA9ICJjX2FwaSIsIC52YWwgPSAobG9uZylQQl9GT1JNQVRfQ19BUEl9LAorICAgICAgICBCQ01DTElfRU5VTV9MQVNUCisgICAgfTsKKworICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0ocGxiX2RpciwgImR1bXAiLCAiZHVtcCBjYXB0dXJlIiwgcGxheWJhY2tfY2xpX2R1bXApOworICAgIEJDTUNMSV9NQUtFX0NNRChwbGJfZGlyLCAic2F2ZSIsICJzYXZlIGNhcHR1cmUiLCBwbGF5YmFja19jbGlfc2F2ZSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiZmlsZSIsICJmaWxlbmFtZSIsIEJDTUNMSV9QQVJNX1NUUklORywgQkNNQ0xJX1BBUk1fRkxBR19OT05FKSk7CisgICAgQkNNQ0xJX01BS0VfQ01EKHBsYl9kaXIsICJyZXBsYXkiLCAicmVwbGF5IGNhcHR1cmUiLCBwbGF5YmFja19jbGlfcmVwbGF5LAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJmaWxlIiwgImZpbGVuYW1lIiwgQkNNQ0xJX1BBUk1fU1RSSU5HLCBCQ01DTElfUEFSTV9GTEFHX05PTkUpLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oImlnbm9yZV92ZXJzaW9uIiwgIklnbm9yZSB2ZXJzaW9uIG1pc21hdGNoIiwgYmNtY2xpX2VudW1fYm9vbF90YWJsZSwgQkNNQ0xJX1BBUk1fRkxBR19PUFRJT05BTCkpOworICAgIEJDTUNMSV9NQUtFX0NNRChwbGJfZGlyLCAiY29udiIsICJDb252ZXJ0IGNhcHR1cmUiLCBwbGF5YmFja19jbGlfY29udiwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiaW5maWxlIiwgIklucHV0IGZpbGVuYW1lIiwgQkNNQ0xJX1BBUk1fU1RSSU5HLCBCQ01DTElfUEFSTV9GTEFHX05PTkUpLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJvdXRmaWxlIiwgIk91dHB1dCBmaWxlbmFtZSIsIEJDTUNMSV9QQVJNX1NUUklORywgQkNNQ0xJX1BBUk1fRkxBR19OT05FKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNKCJmb3JtYXQiLCAiT3V0cHV0IGZvcm1hdCIsIGZvcm1hdF9lbnVtX3RhYmxlLCBCQ01DTElfUEFSTV9GTEFHX05PTkUpLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oImlnbm9yZV92ZXJzaW9uIiwgIklnbm9yZSB2ZXJzaW9uIG1pc21hdGNoIiwgYmNtY2xpX2VudW1fYm9vbF90YWJsZSwgQkNNQ0xJX1BBUk1fRkxBR19PUFRJT05BTCkpOworI2VuZGlmCit9CisKK3ZvaWQgYmNtb2x0X3VzZXJfYXBwbF9wbGF5YmFja19pbml0KHZvaWQpCit7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IEJDTVRSX01BWF9PTFRTOyBpKyspCisgICAgeworICAgICAgICBjaGFyIGxvZ19uYW1lW01BWF9ERVZfTE9HX0lEX05BTUVdOworICAgICAgICBzbnByaW50Zihsb2dfbmFtZSwgc2l6ZW9mKGxvZ19uYW1lKS0xLCAidXNlcl9hcHBsX3BsYXliYWNrXyV1IiwgaSk7CisgICAgICAgIHBiX2N0eHRbaV0ubG9nX2lkID0gYmNtX2Rldl9sb2dfaWRfcmVnaXN0ZXIobG9nX25hbWUsIERFVl9MT0dfTEVWRUxfSU5GTywgREVWX0xPR19JRF9UWVBFX0JPVEgpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wbGF5YmFjay9iY21vbHRfdXNlcl9hcHBsX3BsYXliYWNrLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3BsYXliYWNrL2JjbW9sdF91c2VyX2FwcGxfcGxheWJhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjM3YzYxCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wbGF5YmFjay9iY21vbHRfdXNlcl9hcHBsX3BsYXliYWNrLmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisgKi8KKworI2lmbmRlZiBfQkNNT0xUX1VTRVJfQVBQTF9QTEFZQkFDS19IXworI2RlZmluZSBfQkNNT0xUX1VTRVJfQVBQTF9QTEFZQkFDS19IXworCisjaW5jbHVkZSAiYmNtY2xpLmgiCisKK3ZvaWQgYmNtb2x0X3VzZXJfYXBwbF9wbGF5YmFja19jbGlfaW5pdChiY21jbGlfZW50cnkgKnRvcF9kaXIpOworCit2b2lkIGJjbW9sdF91c2VyX2FwcGxfcGxheWJhY2tfaW5pdCh2b2lkKTsKKworI2VuZGlmIC8qIF9CQ01PTFRfVVNFUl9BUFBMX1BMQVlCQUNLX0hfICovCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvcHJvdGVjdGlvbl9zd2l0Y2hpbmcvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3Byb3RlY3Rpb25fc3dpdGNoaW5nL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZjJlNTUKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3Byb3RlY3Rpb25fc3dpdGNoaW5nL01ha2VmaWxlCkBAIC0wLDAgKzEsMTcgQEAKKyMgcHJvdGVjdGlvbiBzd2l0Y2hpbmcgdXNlciBhcHBsaWNhdGlvbgorCitpZmVxICgiJChFTkFCTEVfQ0xJKSIsICJ5IikKKyAgICBNT0RfTkFNRSA9IGJjbV91c2VyX2FwcGxfcHMKKyAgICBNT0RfVFlQRSA9IGxpYgorICAgIE1PRF9ERVBTID0gaG9zdF9hcGkgYmNtX2JvYXJkCisgICAgc3JjcyA9IGJjbW9sdF91c2VyX2FwcGxfcHMuYyBcCisJICAgYmNtb2x0X3VzZXJfYXBwbF9wc19jbGkuYyBcCisJICAgYmNtb2x0X3VzZXJfYXBwbF9wc19ncG9uLmMgXAorCSAgIGJjbW9sdF91c2VyX2FwcGxfcHNfZXBvbi5jIFwKKwkgICBiY21vbHRfdXNlcl9hcHBsX3BzX3hncG9uLmMKKworICAgIGlmZXEgKCIkKE9TX0tFUk5FTCkiLCAibGludXgiKQorCU1PRF9ERVBTICs9IGRldl9sb2dfbGludXgKKyAgICBlbmRpZgorZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wcm90ZWN0aW9uX3N3aXRjaGluZy9iY21vbHRfdXNlcl9hcHBsX3BzLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3Byb3RlY3Rpb25fc3dpdGNoaW5nL2JjbW9sdF91c2VyX2FwcGxfcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmM4ZDMxCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wcm90ZWN0aW9uX3N3aXRjaGluZy9iY21vbHRfdXNlcl9hcHBsX3BzLmMKQEAgLTAsMCArMSw3NTYgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorKi8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbW9sdF9hcGkuaD4KKyNpbmNsdWRlIDxiY21vbHRfbXNnX3BhY2suaD4KKyNpbmNsdWRlIDxiY21vbHRfbW9kZWxfdHlwZXMuaD4KKyNpbmNsdWRlIDxiY21fZGV2X2xvZy5oPgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfcHMuaCIKKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX3BzX2ludGVybmFsLmgiCisKKyNpZm5kZWYgU0lNVUxBVElPTl9CVUlMRAorI2luY2x1ZGUgPGJjbW9sdF9ib2FyZC5oPgorI2VuZGlmCisKKyNkZWZpbmUgUFNfREVGQVVMVF9NQVhfUEFJUlMgMTYKKyNkZWZpbmUgUFNfVEFTS19NU0dfUV9TSVpFIDY0CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgYmNtb2x0X3BzX3BhaXIgcGFpcjsKKyAgICBiY21vc19ib29sIGlzX3ZhbGlkOworfSBwc19wYWlyX3N0YXRlOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGJjbW9zX2Jvb2wgaXNfcnVubmluZzsKKyAgICBiY21vbHRfcHNfZ2xvYmFsX2NmZyBjZmc7CisgICAgcHNfcGFpcl9zdGF0ZSAqcGFpcnM7CisgICAgdWludDMyX3Qgc3dpdGNoX3N0YXJ0X3RpbWVfdXM7Cit9IHBzX2dsb2JhbF9zdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBiY21vc19tc2cgb3NfbXNnOworICAgIGJjbW9sdF9wc19wb24gcG9uOworICAgIGJjbW9sdF9hdXRvICppbmQ7Cit9IHBzX3Rhc2tfbXNnOworCit0eXBlZGVmIGVudW0KK3sKKyAgICBQU19QT05fTU9ERV9JTlZBTElELAorICAgIFBTX1BPTl9NT0RFX0dQT04sCisgICAgUFNfUE9OX01PREVfRVBPTiwKKyAgICBQU19QT05fTU9ERV9YR1BPTiwKK30gcHNfcG9uX21vZGU7CisKK3N0YXRpYyBwc19nbG9iYWxfc3RhdGUgcHNfc3RhdGUgPSB7fTsKK3N0YXRpYyBiY21vc19tdXRleCBwc19tdXRleDsKK3N0YXRpYyBiY21vc190YXNrIHBzX3Rhc2s7CisKKyNpZmRlZiBFTkFCTEVfTE9HCitzdGF0aWMgZGV2X2xvZ19pZCBwc19sb2dfaWQ7CitkZXZfbG9nX2lkIHBzX2dldF9sb2dfaWQodm9pZCkKK3sKKyAgICByZXR1cm4gcHNfbG9nX2lkOworfQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgYmNtb3NfYm9vbCBwc19wb25fZXF1YWwoY29uc3QgYmNtb2x0X3BzX3BvbiAqYSwgY29uc3QgYmNtb2x0X3BzX3BvbiAqYikKK3sKKyAgICByZXR1cm4gYS0+ZGV2aWNlX2lkID09IGItPmRldmljZV9pZCAmJiBhLT5wb25faWQgPT0gYi0+cG9uX2lkOworfQorCitzdGF0aWMgaW5saW5lIGJjbW9zX2Jvb2wgcHNfcGFpcl9lcXVhbChjb25zdCBiY21vbHRfcHNfcGFpciAqYSwgY29uc3QgYmNtb2x0X3BzX3BhaXIgKmIpCit7CisgICAgcmV0dXJuIHBzX3Bvbl9lcXVhbCgmYS0+c3RhbmRieSwgJmItPnN0YW5kYnkpICYmIHBzX3Bvbl9lcXVhbCgmYS0+d29ya2luZywgJmItPndvcmtpbmcpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X3BzX3Bvbl9wYWlyX2dldChjb25zdCBiY21vbHRfcHNfcG9uICpwb24sIGJjbW9sdF9wc19wYWlyICoqcGFpcikKK3sKKyAgICB1aW50MTZfdCBpOworCisgICAgaWYgKCFwc19zdGF0ZS5pc19ydW5uaW5nKQorICAgIHsKKyAgICAgICAgKnBhaXIgPSBOVUxMOworICAgICAgICBQU19FUlIoIlBTIGFwcGxpY2F0aW9uIG5vdCBydW5uaW5nXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfU1RBVEU7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IHBzX3N0YXRlLmNmZy5tYXhfbnVtX3BhaXJzOyBpKyspCisgICAgeworICAgICAgICBpZiAocHNfc3RhdGUucGFpcnNbaV0uaXNfdmFsaWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwc19wb25fZXF1YWwocG9uLCAmcHNfc3RhdGUucGFpcnNbaV0ucGFpci5zdGFuZGJ5KSB8fAorICAgICAgICAgICAgICAgIHBzX3Bvbl9lcXVhbChwb24sICZwc19zdGF0ZS5wYWlyc1tpXS5wYWlyLndvcmtpbmcpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpwYWlyID0gJnBzX3N0YXRlLnBhaXJzW2ldLnBhaXI7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9OT0VOVDsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2luaXRfdGFzayh2b2lkKQoreworICAgIGJjbW9zX3Rhc2tfcGFybSB0YXNrX3BhcmFtcyA9CisgICAgeworICAgICAgICAubmFtZSA9ICJ1c2VyX2FwcGxfcHMiLAorICAgICAgICAucHJpb3JpdHkgPSBUQVNLX1BSSU9SSVRZX1VTRVJfQVBQTF9QUywKKyAgICAgICAgLmNvcmUgPSBCQ01PU19DUFVfQ09SRV9BTlksIC8qIE5vIENQVSBhZmZpbml0eSAqLworICAgICAgICAuaW5pdF9oYW5kbGVyID0gTlVMTAorICAgIH07CisKKyAgICByZXR1cm4gYmNtb3NfdGFza19jcmVhdGUoJnBzX3Rhc2ssICZ0YXNrX3BhcmFtcyk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19pbml0X21vZHVsZSh2b2lkKQoreworICAgIGJjbW9zX21vZHVsZV9wYXJtIG1vZHVsZV9wYXJhbXMgPQorICAgIHsKKyAgICAgICAgLnFwYXJtID0geyAubmFtZSA9ICJ1c2VyX2FwcGxfcHMiLCAuc2l6ZSA9IFBTX1RBU0tfTVNHX1FfU0laRSB9CisgICAgfTsKKworICAgIHJldHVybiBiY21vc19tb2R1bGVfY3JlYXRlKEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfUFMsICZwc190YXNrLCAmbW9kdWxlX3BhcmFtcyk7Cit9CisKK3N0YXRpYyBwc19wb25fbW9kZSBwc19wb25fbW9kZV9nZXQoYmNtb2x0X2RldmlkIGRldikKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3N5c3RlbV9tb2RlIHN5c3RlbV9tb2RlOworCisgICAgZXJyID0gYmNtb2x0X3N5c3RlbV9tb2RlX2dldChkZXYsICZzeXN0ZW1fbW9kZSk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFBTX1BPTl9NT0RFX0lOVkFMSUQ7CisgICAgfQorICAgIHN3aXRjaCAoc3lzdGVtX21vZGUpCisgICAgeworICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0dQT05fXzRfWDoKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9HUE9OX184X1g6CisgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfR1BPTl9fMTZfWDoKKyAgICAgICAgcmV0dXJuIFBTX1BPTl9NT0RFX0dQT047CisgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fMTZfWDoKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9FUE9OX184X1g6CisgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfRVBPTl9fNF9YOgorICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzhfWF9DT0VYSVNURU5DRV9URE1BOgorICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzRfWF9DT0VYSVNURU5DRV9URE1BOgorICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzhfWF8xMF9HOgorICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzRfWF8xMF9HOgorICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX0VQT05fXzJfWF8xMF9HOgorICAgICAgICByZXR1cm4gUFNfUE9OX01PREVfRVBPTjsKKyAgICBjYXNlIEJDTU9MVF9TWVNURU1fTU9ERV9YR1BPTl8xX180X1g6CisgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfWEdQT05fMV9fOF9YOgorICAgIGNhc2UgQkNNT0xUX1NZU1RFTV9NT0RFX1hHU19fMl9YXzEwX0c6CisgICAgY2FzZSBCQ01PTFRfU1lTVEVNX01PREVfTkdQT04yX18yX1hfMTBfRzoKKyAgICAgICAgcmV0dXJuIFBTX1BPTl9NT0RFX1hHUE9OOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBQU19QT05fTU9ERV9JTlZBTElEOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcHNfaGFuZGxlX21zZyhiY21vc19tb2R1bGVfaWQgbW9kdWxlX2lkLCBiY21vc19tc2cgKm9zX21zZykKK3sKKyAgICBwc190YXNrX21zZyAqbXNnID0gKHBzX3Rhc2tfbXNnICopb3NfbXNnOworICAgIGJjbW9zX2Vycm5vIGVycjsKKworICAgIC8qIHByb2Nlc3MgdGhlIGluZGljYXRpb24gKi8KKyAgICBpZiAobXNnLT5pbmQtPmhkci5vYmpfdHlwZSA9PSBCQ01PTFRfT0JKX0lEX0RFVklDRSB8fCBtc2ctPmluZC0+aGRyLm9ial90eXBlID09IEJDTU9MVF9PQkpfSURfREVCVUcpCisgICAgeworICAgICAgICAvKiB0aGVyZSdzIG5vIG5lZWQgdG8gbWlycm9yIGRldmljZS1sZXZlbCBpbmRpY2F0aW9ucyAqLworICAgICAgICBlcnIgPSBCQ01fRVJSX09LOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzd2l0Y2ggKHBzX3Bvbl9tb2RlX2dldChtc2ctPnBvbi5kZXZpY2VfaWQpKQorICAgICAgICB7CisgICAgICAgIGNhc2UgUFNfUE9OX01PREVfR1BPTjoKKyAgICAgICAgICAgIGVyciA9IHBzX3Byb2Nlc3NfaW5kX2dwb24oJm1zZy0+cG9uLCBtc2ctPmluZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQU19QT05fTU9ERV9FUE9OOgorICAgICAgICAgICAgZXJyID0gcHNfcHJvY2Vzc19pbmRfZXBvbigmbXNnLT5wb24sIG1zZy0+aW5kKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBTX1BPTl9NT0RFX1hHUE9OOgorICAgICAgICAgICAgZXJyID0gcHNfcHJvY2Vzc19pbmRfeGdwb24oJm1zZy0+cG9uLCBtc2ctPmluZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGVyciA9IEJDTV9FUlJfU1RBVEU7IC8qIG5vdCBhIHN1cHBvcnRlZCBzeXN0ZW0gbW9kZSAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBiY21vbHRfYXV0byAqaW5kID0gbXNnLT5pbmQ7CisKKyAgICAgICAgUFNfRVJSKCJFcnJvciBwcm9jZXNzaW5nIGluZGljYXRpb24gKG9ial90eXBlPSV1LCBzdWJncm91cD0ldSk6ICVzXG4iLCBpbmQtPmhkci5vYmpfdHlwZSwgaW5kLT5oZHIuc3ViZ3JvdXAsIGJjbW9zX3N0cmVycm9yKGVycikpOworICAgIH0KKworICAgIC8qIGZyZWUgdGhlIGNsb25lZCBpbmRpY2F0aW9uIHNpbmNlIHdlJ3JlIGRvbmUgcHJvY2Vzc2luZyBpdCAqLworICAgIGJjbW9sdF9tc2dfZnJlZSgmbXNnLT5pbmQtPmhkcik7CisKKyAgICAvKiBmcmVlIHRoZSBpbnRlcm5hbCBPUyBtZXNzYWdlIGhhbmRsZSAqLworICAgIGJjbW9zX2ZyZWUob3NfbXNnKTsKK30KKwordm9pZCBiY21vbHRfcHNfYXBwbF9pbml0KHZvaWQpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworCisjaWZkZWYgRU5BQkxFX0xPRworICAgIHBzX2xvZ19pZCA9IGJjbV9kZXZfbG9nX2lkX3JlZ2lzdGVyKCJ1c2VyX2FwcGxfcHMiLCBERVZfTE9HX0xFVkVMX0lORk8sIERFVl9MT0dfSURfVFlQRV9CT1RIKTsKKyNlbmRpZgorCisgICAgZXJyID0gYmNtb3NfbXV0ZXhfY3JlYXRlKCZwc19tdXRleCwgMCwgTlVMTCk7CisgICAgQlVHX09OKGVyciAhPSBCQ01fRVJSX09LKTsKKworICAgIGVyciA9IHBzX2luaXRfdGFzaygpOworICAgIEJVR19PTihlcnIgIT0gQkNNX0VSUl9PSyk7CisKKyAgICBlcnIgPSBwc19pbml0X21vZHVsZSgpOworICAgIEJVR19PTihlcnIgIT0gQkNNX0VSUl9PSyk7Cit9CisKK2JjbW9zX2Vycm5vIGJjbW9sdF9wc19hcHBsX3N0YXJ0KGNvbnN0IGJjbW9sdF9wc19nbG9iYWxfY2ZnICpjZmcpCit7CisgICAgYmNtb3NfbXV0ZXhfbG9jaygmcHNfbXV0ZXgpOworCisgICAgaWYgKHBzX3N0YXRlLmlzX3J1bm5pbmcpCisgICAgeworICAgICAgICBiY21vc19tdXRleF91bmxvY2soJnBzX211dGV4KTsKKyAgICAgICAgUFNfRVJSKCJQUyBhcHBsaWNhdGlvbiBhbHJlYWR5IHJ1bm5pbmdcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9TVEFURTsKKyAgICB9CisKKyAgICBwc19zdGF0ZS5jZmcgPSAqY2ZnOworICAgIHBzX3N0YXRlLmNmZy5tYXhfbnVtX3BhaXJzID0gKHBzX3N0YXRlLmNmZy5tYXhfbnVtX3BhaXJzID09IDApID8gUFNfREVGQVVMVF9NQVhfUEFJUlMgOiBwc19zdGF0ZS5jZmcubWF4X251bV9wYWlyczsKKyAgICBwc19zdGF0ZS5wYWlycyA9IGJjbW9zX2NhbGxvYyhzaXplb2YoKnBzX3N0YXRlLnBhaXJzKSAqIHBzX3N0YXRlLmNmZy5tYXhfbnVtX3BhaXJzKTsKKyAgICBpZiAocHNfc3RhdGUucGFpcnMgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIEJDTV9NRU1aRVJPX1NUUlVDVCgmcHNfc3RhdGUpOworICAgICAgICBiY21vc19tdXRleF91bmxvY2soJnBzX211dGV4KTsKKyAgICAgICAgUFNfRVJSKCJtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9OT01FTTsKKyAgICB9CisKKyAgICBwc19zdGF0ZS5pc19ydW5uaW5nID0gQkNNT1NfVFJVRTsKKworICAgIGJjbW9zX211dGV4X3VubG9jaygmcHNfbXV0ZXgpOworICAgIFBTX0lORk8oIlBTIGFwcGxpY2F0aW9uIHN0YXJ0ZWRcbiIpOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19lcnJubyBiY21vbHRfcHNfYXBwbF9zdG9wKHZvaWQpCit7CisgICAgYmNtb3NfbXV0ZXhfbG9jaygmcHNfbXV0ZXgpOworCisgICAgaWYgKCFwc19zdGF0ZS5pc19ydW5uaW5nKQorICAgIHsKKyAgICAgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZwc19tdXRleCk7CisgICAgICAgIFBTX0VSUigiUFMgYXBwbGljYXRpb24gbm90IHJ1bm5pbmdcbiIpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9TVEFURTsKKyAgICB9CisKKyAgICBwc19zdGF0ZS5pc19ydW5uaW5nID0gQkNNT1NfRkFMU0U7CisKKyAgICBiY21vc19mcmVlKHBzX3N0YXRlLnBhaXJzKTsKKyAgICBCQ01fTUVNWkVST19TVFJVQ1QoJnBzX3N0YXRlKTsKKworICAgIGJjbW9zX211dGV4X3VubG9jaygmcHNfbXV0ZXgpOworICAgIFBTX0lORk8oIlBTIGFwcGxpY2F0aW9uIHN0b3BwZWRcbiIpOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19ib29sIGJjbW9sdF9wc19hcHBsX2lzX3J1bm5pbmcodm9pZCkKK3sKKyAgICBiY21vc19ib29sIHJldDsKKyAgICBiY21vc19tdXRleF9sb2NrKCZwc19tdXRleCk7CisgICAgcmV0ID0gcHNfc3RhdGUuaXNfcnVubmluZzsKKyAgICBiY21vc19tdXRleF91bmxvY2soJnBzX211dGV4KTsKKyAgICByZXR1cm4gcmV0OworfQorCitiY21vc19lcnJubyBiY21vbHRfcHNfZ2xvYmFsX2NmZ19nZXQoYmNtb2x0X3BzX2dsb2JhbF9jZmcgKmNmZykKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb3NfbXV0ZXhfbG9jaygmcHNfbXV0ZXgpOworCisgICAgaWYgKCFwc19zdGF0ZS5pc19ydW5uaW5nKQorICAgIHsKKyAgICAgICAgUFNfRVJSKCJQUyBhcHBsaWNhdGlvbiBub3QgcnVubmluZ1xuIik7CisgICAgICAgIGVyciA9IEJDTV9FUlJfU1RBVEU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICpjZmcgPSBwc19zdGF0ZS5jZmc7CisgICAgICAgIGVyciA9IEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZwc19tdXRleCk7CisgICAgcmV0dXJuIGVycjsKK30KKworYmNtb3NfZXJybm8gYmNtb2x0X3BzX2dsb2JhbF9jZmdfdXBkYXRlKGNvbnN0IGJjbW9sdF9wc19nbG9iYWxfY2ZnICpjZmcpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9zX211dGV4X2xvY2soJnBzX211dGV4KTsKKworICAgIGlmICghcHNfc3RhdGUuaXNfcnVubmluZykKKyAgICB7CisgICAgICAgIFBTX0VSUigiUFMgYXBwbGljYXRpb24gbm90IHJ1bm5pbmdcbiIpOworICAgICAgICBlcnIgPSBCQ01fRVJSX1NUQVRFOworICAgIH0KKyAgICBlbHNlIGlmIChjZmctPm1heF9udW1fcGFpcnMgIT0gcHNfc3RhdGUuY2ZnLm1heF9udW1fcGFpcnMpCisgICAgeworICAgICAgICBQU19FUlIoImNhbm5vdCBjaGFuZ2UgbWF4IG51bWJlciBvZiBwcm90ZWN0ZWQgcGFpcnMgd2hpbGUgcnVubmluZ1xuIik7CisgICAgICAgIGVyciA9IEJDTV9FUlJfUEFSTTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcHNfc3RhdGUuY2ZnID0gKmNmZzsKKyAgICAgICAgZXJyID0gQkNNX0VSUl9PSzsKKyAgICB9CisKKyAgICBiY21vc19tdXRleF91bmxvY2soJnBzX211dGV4KTsKKyAgICByZXR1cm4gZXJyOworfQorCitiY21vc19lcnJubyBiY21vbHRfcHNfcGFpcnNfZ2V0KHVpbnQxNl90IGFycmF5X2xlbiwgYmNtb2x0X3BzX3BhaXIgKnBhaXJzLCB1aW50MTZfdCAqbnVtX3dyaXR0ZW4pCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIHVpbnQxNl90IGk7CisKKyAgICBiY21vc19tdXRleF9sb2NrKCZwc19tdXRleCk7CisKKyAgICBpZiAoIXBzX3N0YXRlLmlzX3J1bm5pbmcpCisgICAgeworICAgICAgICBQU19FUlIoIlBTIGFwcGxpY2F0aW9uIG5vdCBydW5uaW5nXG4iKTsKKyAgICAgICAgZXJyID0gQkNNX0VSUl9TVEFURTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKm51bV93cml0dGVuID0gMDsKKyAgICAgICAgZXJyID0gQkNNX0VSUl9PSzsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBzX3N0YXRlLmNmZy5tYXhfbnVtX3BhaXJzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwc19zdGF0ZS5wYWlyc1tpXS5pc192YWxpZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKm51bV93cml0dGVuID09IGFycmF5X2xlbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFBTX0VSUigiYXJyYXkgc2l6ZSB0b28gc21hbGwgdG8gY29sbGVjdCBhbGwgcGFpcnNcbiIpOworICAgICAgICAgICAgICAgICAgICBlcnIgPSBCQ01fRVJSX1BBUk07CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwYWlyc1sqbnVtX3dyaXR0ZW5dID0gcHNfc3RhdGUucGFpcnNbaV0ucGFpcjsKKyAgICAgICAgICAgICAgICAoKm51bV93cml0dGVuKSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZwc19tdXRleCk7CisgICAgcmV0dXJuIGVycjsKK30KKworYmNtb3NfZXJybm8gYmNtb2x0X3BzX3BhaXJfYWRkKGNvbnN0IGJjbW9sdF9wc19wYWlyICpwYWlyKQoreworICAgIHVpbnQxNl90IGk7CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgYmNtb3NfbXV0ZXhfbG9jaygmcHNfbXV0ZXgpOworCisgICAgaWYgKCFwc19zdGF0ZS5pc19ydW5uaW5nKQorICAgIHsKKyAgICAgICAgUFNfRVJSKCJQUyBhcHBsaWNhdGlvbiBub3QgcnVubmluZ1xuIik7CisgICAgICAgIGVyciA9IEJDTV9FUlJfU1RBVEU7CisgICAgfQorICAgIGVsc2UgaWYgKHBzX3Bvbl9lcXVhbCgmcGFpci0+d29ya2luZywgJnBhaXItPnN0YW5kYnkpKQorICAgIHsKKyAgICAgICAgUFNfRVJSKCJBIFBPTiBjYW5ub3QgcHJvdGVjdCBpdHNlbGZcbiIpOworICAgICAgICBlcnIgPSBCQ01fRVJSX1BBUk07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGVyciA9IEJDTV9FUlJfT0s7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwc19zdGF0ZS5jZmcubWF4X251bV9wYWlyczsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocHNfc3RhdGUucGFpcnNbaV0uaXNfdmFsaWQgJiYKKyAgICAgICAgICAgICAgICAocHNfcG9uX2VxdWFsKCZwYWlyLT53b3JraW5nLCAmcHNfc3RhdGUucGFpcnNbaV0ucGFpci53b3JraW5nKSB8fAorICAgICAgICAgICAgICAgIHBzX3Bvbl9lcXVhbCgmcGFpci0+d29ya2luZywgJnBzX3N0YXRlLnBhaXJzW2ldLnBhaXIuc3RhbmRieSkgfHwKKyAgICAgICAgICAgICAgICBwc19wb25fZXF1YWwoJnBhaXItPnN0YW5kYnksICZwc19zdGF0ZS5wYWlyc1tpXS5wYWlyLndvcmtpbmcpIHx8CisgICAgICAgICAgICAgICAgcHNfcG9uX2VxdWFsKCZwYWlyLT5zdGFuZGJ5LCAmcHNfc3RhdGUucGFpcnNbaV0ucGFpci5zdGFuZGJ5KSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFNfRVJSKCJPbmUgb2YgdGhlIFBPTnMgd2FzIGFscmVhZHkgcHJlc2VudCBpbiBhbiBleGlzdGluZyBwYWlyXG4iKTsKKyAgICAgICAgICAgICAgICBlcnIgPSBCQ01fRVJSX0FMUkVBRFk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIGVyciA9IEJDTV9FUlJfTk9SRVM7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcHNfc3RhdGUuY2ZnLm1heF9udW1fcGFpcnM7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIXBzX3N0YXRlLnBhaXJzW2ldLmlzX3ZhbGlkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHNfc3RhdGUucGFpcnNbaV0ucGFpciA9ICpwYWlyOworICAgICAgICAgICAgICAgICAgICBwc19zdGF0ZS5wYWlyc1tpXS5pc192YWxpZCA9IEJDTU9TX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlcnIgPT0gQkNNX0VSUl9OT1JFUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQU19FUlIoIk5vdCBlbm91Z2ggbWVtb3J5IGF2YWlsYWJsZSB0byBhZGQgcGFpclxuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBiY21vc19tdXRleF91bmxvY2soJnBzX211dGV4KTsKKyAgICByZXR1cm4gZXJyOworfQorCitiY21vc19lcnJubyBiY21vbHRfcHNfcG9uX3JlbW92ZShjb25zdCBiY21vbHRfcHNfcG9uICpwb24pCit7CisgICAgdWludDE2X3QgaTsKKyAgICBiY21vc19lcnJubyBlcnI7CisKKyAgICBiY21vc19tdXRleF9sb2NrKCZwc19tdXRleCk7CisKKyAgICBpZiAoIXBzX3N0YXRlLmlzX3J1bm5pbmcpCisgICAgeworICAgICAgICBQU19FUlIoIlBTIGFwcGxpY2F0aW9uIG5vdCBydW5uaW5nXG4iKTsKKyAgICAgICAgZXJyID0gQkNNX0VSUl9TVEFURTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZXJyID0gQkNNX0VSUl9OT0VOVDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBzX3N0YXRlLmNmZy5tYXhfbnVtX3BhaXJzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwc19zdGF0ZS5wYWlyc1tpXS5pc192YWxpZCAmJgorICAgICAgICAgICAgICAgIChwc19wb25fZXF1YWwocG9uLCAmcHNfc3RhdGUucGFpcnNbaV0ucGFpci53b3JraW5nKSB8fAorICAgICAgICAgICAgICAgIHBzX3Bvbl9lcXVhbChwb24sICZwc19zdGF0ZS5wYWlyc1tpXS5wYWlyLnN0YW5kYnkpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwc19zdGF0ZS5wYWlyc1tpXS5pc192YWxpZCA9IEJDTU9TX0ZBTFNFOworICAgICAgICAgICAgICAgIGVyciA9IEJDTV9FUlJfT0s7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVyciA9PSBCQ01fRVJSX05PRU5UKQorICAgICAgICB7CisgICAgICAgICAgICBQU19FUlIoIlNwZWNpZmllZCBQT04gbm90IGZvdW5kXG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJjbW9zX211dGV4X3VubG9jaygmcHNfbXV0ZXgpOworICAgIHJldHVybiBlcnI7Cit9CisKK2JjbW9zX2Vycm5vIGJjbW9sdF9wc19wb25fc3RhdGVfZ2V0KGNvbnN0IGJjbW9sdF9wc19wb24gKnBvbiwgYmNtb2x0X3BzX3Bvbl9zdGF0ZSAqc3RhdGUsIGJjbW9sdF9wc19wb24gKnBhcnRuZXIpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9wc19wYWlyICpwYWlyOworCisgICAgYmNtb3NfbXV0ZXhfbG9jaygmcHNfbXV0ZXgpOworICAgIGVyciA9IGJjbW9sdF9wc19wb25fcGFpcl9nZXQocG9uLCAmcGFpcik7CisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZwc19tdXRleCk7CisKKyAgICBpZiAoZXJyID09IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBpZiAocHNfcG9uX2VxdWFsKHBvbiwgJnBhaXItPnN0YW5kYnkpKQorICAgICAgICB7CisgICAgICAgICAgICAqc3RhdGUgPSBCQ01PTFRfUFNfUE9OX1NUQVRFX1NUQU5EQlk7CisgICAgICAgICAgICAqcGFydG5lciA9IHBhaXItPndvcmtpbmc7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAqc3RhdGUgPSBCQ01PTFRfUFNfUE9OX1NUQVRFX1dPUktJTkc7CisgICAgICAgICAgICAqcGFydG5lciA9IHBhaXItPnN0YW5kYnk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorICAgIGVsc2UgaWYgKGVyciA9PSBCQ01fRVJSX05PRU5UKQorICAgIHsKKyAgICAgICAgKnN0YXRlID0gQkNNT0xUX1BTX1BPTl9TVEFURV9VTkFTU09DSUFURUQ7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KK30KKworYmNtb3NfZXJybm8gYmNtb2x0X3BzX3Byb2Nlc3NfaW5kKGNvbnN0IGJjbW9sdF9wc19wb24gKnBvbiwgYmNtb2x0X2F1dG8gKmluZCkKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X21zZyAqaW5kX2Nsb25lID0gTlVMTDsKKworICAgIGlmICghYmNtb2x0X3BzX2FwcGxfaXNfcnVubmluZygpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgLyogTWFrZSBhIGNvcHkgb2YgYWxsIGluZGljYXRpb25zIHJlY2VpdmVkIHNvIHRoZXkgY2FuIGJlIGhhbmRsZWQgbGF0ZXIgYXN5bmNocm9ub3VzbHkuIFdlIGRvbid0IHZhbGlkYXRlIFBPTiBzdGF0ZQorICAgICAqIGhlcmUgc2luY2UgaXQgbWlnaHQgY2hhbmdlIGJlZm9yZSB3ZSBnZXQgYXJvdW5kIHRvIGhhbmRsaW5nIGl0LgorICAgICAqCisgICAgICogTm90ZSB0aGF0IHRoaXMgY291bGQgYmUgb3B0aW1pemVkIHRvIGZpbHRlciBvdXQgaW5kaWNhdGlvbnMgdGhhdCBhcmVuJ3QgcmVsZXZhbnQgZm9yIHByb3RlY3Rpb24gc3dpdGNoaW5nIGJlZm9yZQorICAgICAqIGNvcHlpbmcgdGhlbSwgYnV0IHRoaXMgaXMgbGVmdCBvdXQgZm9yIHNpbXBsaWNpdHkuICovCisgICAgZXJyID0gYmNtb2x0X21zZ19jbG9uZSgmaW5kX2Nsb25lLCAmaW5kLT5oZHIpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIFBTX0VSUigiSW5kaWNhdGlvbiBjbG9uZSBmYWlsZWQ6ICVzXG4iLCBiY21vc19zdHJlcnJvcihlcnIpKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICAvKiBzZW5kIHRoaXMgaW5kaWNhdGlvbiB0byB0aGUgaW50ZXJuYWwgdGFzaydzIG1lc3NhZ2UgcXVldWUgdG8gYmUgcHJvY2Vzc2VkICovCisgICAgcHNfdGFza19tc2cgKm1zZyA9IGJjbW9zX2NhbGxvYyhzaXplb2YoKm1zZykpOworICAgIGlmIChtc2cgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFBTX0VSUigiTWVzc2FnZSBjYWxsb2MgZmFpbGVkXG4iKTsKKyAgICAgICAgYmNtb2x0X21zZ19mcmVlKGluZF9jbG9uZSk7CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PTUVNOworICAgIH0KKworICAgIG1zZy0+b3NfbXNnLmhhbmRsZXIgPSBwc19oYW5kbGVfbXNnOworICAgIG1zZy0+b3NfbXNnLnJlbGVhc2UgPSBiY21vbHRfb3NfbXNnX3JlbGVhc2VfY2I7CisgICAgbXNnLT5wb24gPSAqcG9uOworICAgIG1zZy0+aW5kID0gKGJjbW9sdF9hdXRvICopaW5kX2Nsb25lOworCisgICAgZXJyID0gYmNtb3NfbXNnX3NlbmRfdG9fbW9kdWxlKEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfUFMsICZtc2ctPm9zX21zZywgMCk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgUFNfRVJSKCJNZXNzYWdlIHNlbmQgZmFpbGVkOiAlc1xuIiwgYmNtb3Nfc3RyZXJyb3IoZXJyKSk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfcHNfY2hhbmdlX3Bvbl90b19zdGFuZGJ5KGNvbnN0IGJjbW9sdF9wc19wb24gKnBvbikKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisKKyAgICBQU19JTkZPKCJTd2l0Y2hpbmcgUE9OIDwlZDolZD4gd29ya2luZy0+c3RhbmRieVxuIiwgcG9uLT5kZXZpY2VfaWQsIHBvbi0+cG9uX2lkKTsKKyAgICBzd2l0Y2ggKHBzX3Bvbl9tb2RlX2dldChwb24tPmRldmljZV9pZCkpCisgICAgeworICAgIGNhc2UgUFNfUE9OX01PREVfR1BPTjoKKyAgICAgICAgZXJyID0gcHNfbW92ZV90b19zdGFuZGJ5X2dwb24ocG9uKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQU19QT05fTU9ERV9FUE9OOgorICAgICAgICBlcnIgPSBwc19tb3ZlX3RvX3N0YW5kYnlfZXBvbihwb24pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBTX1BPTl9NT0RFX1hHUE9OOgorICAgICAgICBlcnIgPSBwc19tb3ZlX3RvX3N0YW5kYnlfeGdwb24ocG9uKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgZXJyID0gQkNNX0VSUl9TVEFURTsgLyogbm90IGEgc3VwcG9ydGVkIHN5c3RlbSBtb2RlICovCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICBQU19FUlIoIjwlZDolZD4gd29ya2luZy0+c3RhbmRieSBBUEkgZmFpbGVkOiAlc1xuIiwgcG9uLT5kZXZpY2VfaWQsIHBvbi0+cG9uX2lkLCBiY21vc19zdHJlcnJvcihlcnIpKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIGJjbW9sdF9wc19jaGFuZ2VfcG9uX3RvX3dvcmtpbmcoY29uc3QgYmNtb2x0X3BzX3BvbiAqcG9uKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKworICAgIFBTX0lORk8oIlN3aXRjaGluZyBQT04gPCVkOiVkPiBzdGFuZGJ5LT53b3JraW5nXG4iLCBwb24tPmRldmljZV9pZCwgcG9uLT5wb25faWQpOworICAgIHN3aXRjaCAocHNfcG9uX21vZGVfZ2V0KHBvbi0+ZGV2aWNlX2lkKSkKKyAgICB7CisgICAgY2FzZSBQU19QT05fTU9ERV9HUE9OOgorICAgICAgICBlcnIgPSBwc19tb3ZlX3RvX3dvcmtpbmdfZ3Bvbihwb24pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBTX1BPTl9NT0RFX0VQT046CisgICAgICAgIGVyciA9IHBzX21vdmVfdG9fd29ya2luZ19lcG9uKHBvbik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUFNfUE9OX01PREVfWEdQT046CisgICAgICAgIGVyciA9IHBzX21vdmVfdG9fd29ya2luZ194Z3Bvbihwb24pOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBlcnIgPSBCQ01fRVJSX1NUQVRFOyAvKiBub3QgYSBzdXBwb3J0ZWQgc3lzdGVtIG1vZGUgKi8KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIFBTX0VSUigiPCVkOiVkPiBzdGFuZGJ5LT53b3JraW5nIEFQSSBmYWlsZWQ6ICVzXG4iLCBwb24tPmRldmljZV9pZCwgcG9uLT5wb25faWQsIGJjbW9zX3N0cmVycm9yKGVycikpOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X3BzX2Rpc2FibGVfdHhfb3B0aWNzKGNvbnN0IGJjbW9sdF9wc19wb24gKnBvbikKK3sKKyAgICBQU19JTkZPKCJEaXNhYmxpbmcgVFJYIGZvciBQT04gPCVkOiVkOiVkPlxuIiwgcG9uLT5kZXZpY2VfaWQsIHBvbi0+cG9uX2lkLCBwb24tPnRyYW5zY2VpdmVyX2lkKTsKKworICAgIC8qIFRoaXMgZGlzYWJsZXMgdGhlIFRYIG9wdGljYWwgY2hhbm5lbCBvbiBhIGdpdmVuIFBPTiBwb3J0IG9uIHRoZSBCQ002ODYyMCBTVksgYm9hcmQuCisgICAgICAgRm9yIG90aGVyIGJvYXJkcywgdGhpcyBtdXN0IGJlIGNoYW5nZWQgdG8gbWF0Y2ggdGhlIGJvYXJkIGRlc2lnbi4gKi8KKyNpZm5kZWYgU0lNVUxBVElPTl9CVUlMRAorICAgIHJldHVybiBiY21fYm9hcmRfdHJ4X2VuYWJsZShwb24tPnRyYW5zY2VpdmVyX2lkLCBCQ01PU19GQUxTRSk7CisjZWxzZQorICAgIHJldHVybiBCQ01fRVJSX09LOworI2VuZGlmCit9CisKK3N0YXRpYyBiY21vc19lcnJubyBiY21vbHRfcHNfZW5hYmxlX3R4X29wdGljcyhjb25zdCBiY21vbHRfcHNfcG9uICpwb24pCit7CisjaWZuZGVmIFNJTVVMQVRJT05fQlVJTEQKKyAgICBiY21vc19lcnJubyByZXQ7CisjZW5kaWYKKworICAgIFBTX0lORk8oIkVuYWJsaW5nIFRSWCBmb3IgUE9OIDwlZDolZDolZD5cbiIsIHBvbi0+ZGV2aWNlX2lkLCBwb24tPnBvbl9pZCwgcG9uLT50cmFuc2NlaXZlcl9pZCk7CisKKyAgICAvKiBUaGlzIGVuYWJsZXMgdGhlIFRYIG9wdGljYWwgY2hhbm5lbCBvbiBhIGdpdmVuIFBPTiBwb3J0IG9uIHRoZSBCQ002ODYyMCBTVksgYm9hcmQuCisgICAgICAgRm9yIG90aGVyIGJvYXJkcywgdGhpcyBtdXN0IGJlIGNoYW5nZWQgdG8gbWF0Y2ggdGhlIGJvYXJkIGRlc2lnbi4gKi8KKyNpZm5kZWYgU0lNVUxBVElPTl9CVUlMRAorICAgIHJldCA9IGJjbV9ib2FyZF90cnhfZW5hYmxlKHBvbi0+dHJhbnNjZWl2ZXJfaWQsIEJDTU9TX1RSVUUpOworICAgIGJjbW9zX3VzbGVlcChwc19zdGF0ZS5jZmcudHJ4X3dhcm1pbmdfZGVsYXkpOworICAgIHJldHVybiByZXQ7CisjZWxzZQorICAgIHJldHVybiBCQ01fRVJSX09LOworI2VuZGlmCit9CisKK2JjbW9zX2Vycm5vIGJjbW9sdF9wc19zd2l0Y2hfcGVyZm9ybShjb25zdCBiY21vbHRfcHNfcG9uICpwb24pCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9wc19wYWlyICpwYWlyOworICAgIGJjbW9sdF9wc19wb24gdGVtcF9wb247CisKKyAgICBiY21vc19tdXRleF9sb2NrKCZwc19tdXRleCk7CisgICAgcHNfc3RhdGUuc3dpdGNoX3N0YXJ0X3RpbWVfdXMgPSBiY21vc190aW1lc3RhbXAoKTsKKyAgICBlcnIgPSBiY21vbHRfcHNfcG9uX3BhaXJfZ2V0KHBvbiwgJnBhaXIpOworICAgIGJjbW9zX211dGV4X3VubG9jaygmcHNfbXV0ZXgpOworCisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIGlmIChwc19zdGF0ZS5jZmcuc3dpdGNoX3NlcXVlbmNlID09IEJDTU9MVF9QU19TV0lUQ0hfU0VRVUVOQ0VfVFJYX0ZJUlNUKQorICAgIHsKKyAgICAgICAgLyogc3RlcCAxOiBkaXNhYmxlIG9wdGljYWwgVFggY2hhbm5lbCBvZiB0aGUgd29ya2luZyBQT04gKi8KKyAgICAgICAgZXJyID0gYmNtb2x0X3BzX2Rpc2FibGVfdHhfb3B0aWNzKCZwYWlyLT53b3JraW5nKTsKKyAgICAgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKworICAgICAgICAvKiBzdGVwIDI6IGVuYWJsZSBvcHRpY2FsIFRYIGNoYW5uZWwgb2YgdGhlIHN0YW5kYnkgUE9OICovCisgICAgICAgIGVyciA9IGJjbW9sdF9wc19lbmFibGVfdHhfb3B0aWNzKCZwYWlyLT5zdGFuZGJ5KTsKKyAgICAgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKworICAgICAgICAvKiBzdGVwIDM6IGNoYW5nZSB0aGUgc3RhbmRieSBQT04gc3RhdGUgdG8gd29ya2luZyAqLworICAgICAgICBlcnIgPSBiY21vbHRfcHNfY2hhbmdlX3Bvbl90b193b3JraW5nKCZwYWlyLT5zdGFuZGJ5KTsKKyAgICAgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKworICAgICAgICAvKiBzdGVwIDQ6IGNoYW5nZSB0aGUgd29ya2luZyBQT04gc3RhdGUgdG8gc3RhbmRieSAqLworICAgICAgICBlcnIgPSBiY21vbHRfcHNfY2hhbmdlX3Bvbl90b19zdGFuZGJ5KCZwYWlyLT53b3JraW5nKTsKKyAgICAgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSAvKiBwc19zdGF0ZS5jZmcuc3dpdGNoX3NlcXVlbmNlID09IEJDTU9MVF9QU19TV0lUQ0hfU0VRVUVOQ0VfU1RBTkRBUkQgKi8KKyAgICB7CisgICAgICAgIC8qIHN0ZXAgMTogY2hhbmdlIHRoZSB3b3JraW5nIFBPTiBzdGF0ZSB0byBzdGFuZGJ5ICovCisgICAgICAgIGVyciA9IGJjbW9sdF9wc19jaGFuZ2VfcG9uX3RvX3N0YW5kYnkoJnBhaXItPndvcmtpbmcpOworICAgICAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHN0ZXAgMjogZGlzYWJsZSBvcHRpY2FsIFRYIGNoYW5uZWwgb2YgdGhlIHdvcmtpbmcgUE9OICovCisgICAgICAgIGVyciA9IGJjbW9sdF9wc19kaXNhYmxlX3R4X29wdGljcygmcGFpci0+d29ya2luZyk7CisgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisKKyAgICAgICAgLyogc3RlcCAzOiBlbmFibGUgb3B0aWNhbCBUWCBjaGFubmVsIG9mIHRoZSBzdGFuZGJ5IFBPTiAqLworICAgICAgICBlcnIgPSBiY21vbHRfcHNfZW5hYmxlX3R4X29wdGljcygmcGFpci0+c3RhbmRieSk7CisgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisKKyAgICAgICAgLyogc3RlcCA0OiBjaGFuZ2UgdGhlIHN0YW5kYnkgUE9OIHN0YXRlIHRvIHdvcmtpbmcgKi8KKyAgICAgICAgZXJyID0gYmNtb2x0X3BzX2NoYW5nZV9wb25fdG9fd29ya2luZygmcGFpci0+c3RhbmRieSk7CisgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisgICAgfQorCisgICAgLyogc3RlcCA1OiB1cGRhdGUgaW50ZXJuYWwgZGF0YWJhc2UgZm9yIG5ldyBQT04gc3RhdGVzICovCisgICAgYmNtb3NfbXV0ZXhfbG9jaygmcHNfbXV0ZXgpOworICAgIHRlbXBfcG9uID0gcGFpci0+d29ya2luZzsKKyAgICBwYWlyLT53b3JraW5nID0gcGFpci0+c3RhbmRieTsKKyAgICBwYWlyLT5zdGFuZGJ5ID0gdGVtcF9wb247CisgICAgYmNtb3NfbXV0ZXhfdW5sb2NrKCZwc19tdXRleCk7CisKK2V4aXQ6CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgUFNfSU5GTygKKyAgICAgICAgICAgICI8JWQ6JWQ+IHN3aXRjaG92ZXIgc3RhcnRlZCBzdWNjZXNzZnVsbHkgKDwlZDolZD4gaXMgbm93IHN0YW5kYnkpXG4iLAorICAgICAgICAgICAgcGFpci0+d29ya2luZy5kZXZpY2VfaWQsCisgICAgICAgICAgICBwYWlyLT53b3JraW5nLnBvbl9pZCwKKyAgICAgICAgICAgIHBhaXItPnN0YW5kYnkuZGV2aWNlX2lkLAorICAgICAgICAgICAgcGFpci0+c3RhbmRieS5wb25faWQpOworICAgIH0KKyAgICBlbHNlIGlmIChwYWlyKQorICAgIHsKKyAgICAgICAgUFNfSU5GTygKKyAgICAgICAgICAgICI8JWQ6JWQ+IHN3aXRjaG92ZXIgZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVzXG4iLAorICAgICAgICAgICAgcGFpci0+d29ya2luZy5kZXZpY2VfaWQsCisgICAgICAgICAgICBwYWlyLT53b3JraW5nLnBvbl9pZCwKKyAgICAgICAgICAgIGJjbW9zX3N0cmVycm9yKGVycikpOworICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKK3VpbnQzMl90IHBzX2dldF9sYXN0X3N3aXRjaF9zdGFydF90aW1lX3VzKHZvaWQpCit7CisgICAgdWludDMyX3QgcmV0OworICAgIGJjbW9zX211dGV4X2xvY2soJnBzX211dGV4KTsKKyAgICByZXQgPSBwc19zdGF0ZS5zd2l0Y2hfc3RhcnRfdGltZV91czsKKyAgICBiY21vc19tdXRleF91bmxvY2soJnBzX211dGV4KTsKKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wcm90ZWN0aW9uX3N3aXRjaGluZy9iY21vbHRfdXNlcl9hcHBsX3BzLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3Byb3RlY3Rpb25fc3dpdGNoaW5nL2JjbW9sdF91c2VyX2FwcGxfcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDIyNGJlCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wcm90ZWN0aW9uX3N3aXRjaGluZy9iY21vbHRfdXNlcl9hcHBsX3BzLmgKQEAgLTAsMCArMSwyMTAgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorKi8KKworI2lmbmRlZiBfQkNNT0xUX1VTRVJfQVBQTF9QU19IXworI2RlZmluZSBfQkNNT0xUX1VTRVJfQVBQTF9QU19IXworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtb2x0X2FwaS5oPgorI2luY2x1ZGUgPGJjbW9sdF9tb2RlbF90eXBlcy5oPgorCisvKiogQ29uZGl0aW9ucyB0aGF0IGNhbiBjYXVzZSBhIHByb3RlY3Rpb24gc3dpdGNoIHRvIGJlIHBlcmZvcm1lZC4gKi8KK3R5cGVkZWYgZW51bQoreworICAgIEJDTU9MVF9QU19TV0lUQ0hfQ09ORElUSU9OX0xPUywgICAgLyoqPCBTd2l0Y2ggd2hlbiBMb1MgYWxhcm0gaXMgcmVjZWl2ZWQgZm9yIGEgd29ya2luZyBQT04uICovCisgICAgQkNNT0xUX1BTX1NXSVRDSF9DT05ESVRJT05fTUFOVUFMLCAvKio8IERvIG5vdCBzd2l0Y2ggYXV0b21hdGljYWxseS4gKi8KK30gYmNtb2x0X3BzX3N3aXRjaF9jb25kaXRpb247CisKKy8qKiBIb3cgcHJvdmlzaW9uaW5nIHNob3VsZCBiZSBtaXJyb3JlZCBmcm9tIHdvcmtpbmcgdG8gc3RhbmRieS4gKi8KK3R5cGVkZWYgZW51bQoreworICAgIEJDTU9MVF9QU19NSVJST1JfTU9ERV9BVVRPLCAvKio8IFdoZW5ldmVyIGFuIGluZGljYXRpb24gaXMgcmVjZWl2ZWQgb24gdGhlIHdvcmtpbmcgUE9OLCBtaXJyb3IgYWxsIG5lY2Vzc2FyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gdG8gc3RhbmRieSBQT04uICovCisgICAgQkNNT0xUX1BTX01JUlJPUl9NT0RFX05PTkUsIC8qKjwgRG8gbm90IGF1dG9tYXRpY2FsbHkgbWlycm9yIGFueSBwcm92aXNpb25pbmcgZnJvbSB3b3JraW5nIHRvIHN0YW5kYnkuICovCit9IGJjbW9sdF9wc19taXJyb3JfbW9kZTsKKworLyoqIFdoYXQgdGhlIG9yZGVyIG9mIG9wZXJhdGlvbnMgc2hvdWxkIGJlIHdoZW4gcGVyZm9ybWluZyBhIHN3aXRjaG92ZXIuICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBCQ01PTFRfUFNfU1dJVENIX1NFUVVFTkNFX1NUQU5EQVJELCAgLyoqPCAic3RhbmRhcmQiIG9yZGVyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6IENoYW5nZSB0aGUgd29ya2luZyBQT04gc3RhdGUgdG8gc3RhbmRieS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOiBEaXNhYmxlIG9wdGljYWwgVFggY2hhbm5lbCBvZiB3b3JraW5nIFBPTi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOiBFbmFibGUgb3B0aWNhbCBUWCBjaGFubmVsIG9mIHN0YW5kYnkgUE9OLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ6IENoYW5nZSB0aGUgc3RhbmRieSBQT04gc3RhdGUgdG8gd29ya2luZy4gKi8KKyAgICBCQ01PTFRfUFNfU1dJVENIX1NFUVVFTkNFX1RSWF9GSVJTVCwgLyoqPCBQZXJmb3JtIHRyYW5zY2VpdmVyIGVuYWJsZS9kaXNhYmxlIGZpcnN0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6IERpc2FibGUgb3B0aWNhbCBUWCBjaGFubmVsIG9mIHdvcmtpbmcgUE9OLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI6IEVuYWJsZSBvcHRpY2FsIFRYIGNoYW5uZWwgb2Ygc3RhbmRieSBQT04uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzogQ2hhbmdlIHRoZSBzdGFuZGJ5IFBPTiBzdGF0ZSB0byB3b3JraW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ6IENoYW5nZSB0aGUgd29ya2luZyBQT04gc3RhdGUgdG8gc3RhbmRieS4gKi8KK30gYmNtb2x0X3BzX3N3aXRjaF9zZXF1ZW5jZTsKKworLyoqIEdsb2JhbCBjb25maWd1cmF0aW9uIGZvciB0aGUgcHJvdGVjdGlvbiBzd2l0Y2hpbmcgYXBwbGljYXRpb24uICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVpbnQxNl90IG1heF9udW1fcGFpcnM7ICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBNYXhpbXVtIG51bWJlciBvZiBwcm90ZWN0ZWQgcGFpcnMgc3VwcG9ydGVkLiAqLworICAgIGJjbW9sdF9wc19zd2l0Y2hfY29uZGl0aW9uIHN3aXRjaF9jb25kaXRpb247ICAgLyoqPCBDb25kaXRpb24gdGhhdCBzaG91bGQgY2F1c2UgYSBzd2l0Y2hvdmVyLiAqLworICAgIGJjbW9sdF9wc19zd2l0Y2hfc2VxdWVuY2Ugc3dpdGNoX3NlcXVlbmNlOyAgICAgLyoqPCBPcmRlciBvZiBvcGVyYXRpb25zIHdoZW4gcGVyZm9ybWluZyBhIHN3aXRjaG92ZXIuICovCisKKyAgICAvKiBUaGUgZm9sbG93aW5nIHByb3BlcnRpZXMgYXJlIG9ubHkgdXNlZCBpbiBHUE9OIG1vZGUuICovCisgICAgYmNtb2x0X3BzX21pcnJvcl9tb2RlIG1pcnJvcl9tb2RlOyAgICAgICAgICAgICAvKio8IEhvdyBwcm92aXNpb25pbmcgc2hvdWxkIGJlIG1pcnJvcmVkIGZyb20gd29ya2luZyB0byBzdGFuZGJ5LiAqLworICAgIGJjbW9zX2Jvb2wgbWlycm9yX21hY19lbnRyaWVzOyAgICAgICAgICAgICAgICAgLyoqPCBJZiBUUlVFLCBtaXJyb3IgYWxsIE1BQyBsZWFybmluZyBlbnRyaWVzIHRvIHRoZSBzdGFuZGJ5IFBPTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIGxlYXJuaW5nIGluZGljYXRpb25zIGFyZSByZWNlaXZlZCBmcm9tIHRoZSB3b3JraW5nIFBPTi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB3aWxsIGFsc28gY2F1c2UgZW50cmllcyB0byBiZSBhdXRvbWF0aWNhbGx5IGRlbGV0ZWQgd2hlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2luZyBpbmRpY2F0aW9ucyBhcmUgcmVjZWl2ZWQgYW5kIG1vdmVkIHdoZW4gTUFDIG1vdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNhdGlvbnMgYXJlIHJlY2VpdmVkLiAqLworICAgIGJjbW9zX2Jvb2wgc3RhdGljX21hY19lbnRyaWVzOyAgICAgICAgICAgICAgICAgLyoqPCBJZiBUUlVFLCB3aGVuIGVudHJpZXMgYXJlIG1pcnJvcmVkIHRvIHRoZSBzdGFuZGJ5IFBPTiwgdHJlYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbSBhcyAic3RhdGljIiAobm90IGFnZWQpLiAqLworICAgIHVpbnQzMl90IHRyeF93YXJtaW5nX2RlbGF5OyAgICAgICAgICAgICAgICAgICAgLyoqPCBEZWxheSAoaW4gdXNlYykgdG8gd2FpdCBhZnRlciBUUlggZW5hYmxlLCBpbiBvcmRlciB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWFyYW50ZWUgdGhhdCBQT1BVUCBQTE9BTXMgYXJlIGNvcnJlY3RseSBzZWVuIGJ5IE9OVXMuICovCit9IGJjbW9sdF9wc19nbG9iYWxfY2ZnOworCisvKiogQSBzaW5nbGUgUE9OIG9uIGFuIE9MVCBkZXZpY2UgLSBoYWxmIG9mIGEgcHJvdGVjdGVkIHBhaXIuICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIGJjbW9sdF9kZXZpZCBkZXZpY2VfaWQ7CisgICAgYmNtb2x0X3Bvbl9uaSBwb25faWQ7CisgICAgYmNtb2x0X3Bvbl9uaSB0cmFuc2NlaXZlcl9pZDsKK30gYmNtb2x0X3BzX3BvbjsKKworLyoqIEEgcHJvdGVjdGVkIHBhaXIgb2YgUE9Ocywgb24gdGhlIHNhbWUgT0xUIGRldmljZSBvciBkaWZmZXJlbnQgZGV2aWNlcy4gKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgYmNtb2x0X3BzX3BvbiB3b3JraW5nOworICAgIGJjbW9sdF9wc19wb24gc3RhbmRieTsKK30gYmNtb2x0X3BzX3BhaXI7CisKKy8qKiBQb3NzaWJsZSBzdGF0ZXMgZm9yIGEgc2luZ2xlIFBPTiBmcm9tIGEgcHJvdGVjdGlvbiBzd2l0Y2hpbmcgcG9pbnQtb2Ytdmlldy4gKi8KK3R5cGVkZWYgZW51bQoreworICAgIEJDTU9MVF9QU19QT05fU1RBVEVfVU5BU1NPQ0lBVEVELCAvKio8IFRoZSBQT04gaXMgbm90IHBhcnQgb2YgYSBwcm90ZWN0ZWQgcGFpci4gKi8KKyAgICBCQ01PTFRfUFNfUE9OX1NUQVRFX1dPUktJTkcsICAgICAgLyoqPCBUaGUgUE9OIGlzIGRlc2lnbmF0ZWQgYXMgd29ya2luZyB3aXRoIHRoZSBUUlggZW5hYmxlZCB3aGlsZSBhY3RpdmUuICovCisgICAgQkNNT0xUX1BTX1BPTl9TVEFURV9TVEFOREJZLCAgICAgIC8qKjwgVGhlIFBPTiBpcyBkZXNpZ25hdGVkIGFzIHN0YW5kYnkgd2l0aCB0aGUgVFJYIGRpc2FibGVkIHdoaWxlIGFjdGl2ZS4gKi8KK30gYmNtb2x0X3BzX3Bvbl9zdGF0ZTsKKworLyoqIEluaXRpYWxpemUgdGhlIHByb3RlY3Rpb24gc3dpdGNoaW5nIGFwcGxpY2F0aW9uICh0aGlzIHNob3VsZCBiZSBjYWxsZWQgYXMgcGFydCBvZiBhcHBsaWNhdGlvbiBzdGFydHVwKS4gKi8KK3ZvaWQgYmNtb2x0X3BzX2FwcGxfaW5pdCh2b2lkKTsKKworLyoqIFN0YXJ0IHRoZSBwcm90ZWN0aW9uIHN3aXRjaGluZyBhcHBsaWNhdGlvbiAodGhpcyBpcyBnbG9iYWwgZm9yIHRoZSBlbnRpcmUgc3lzdGVtKS4KKyAqCisgKiBccGFyYW1baW5dIGNmZyBHbG9iYWwgcHJvdGVjdGlvbiBzd2l0Y2hpbmcgY29uZmlndXJhdGlvbi4KKyAqIFxyZXR1cm4gICAgICAgIEJDTV9FUlJfT0sgaWYgdGhlIGFwcGxpY2F0aW9uIHdhcyBzdGFydGVkIHN1Y2Nlc3NmdWxseSwgPDAgb3RoZXJ3aXNlLgorICovCitiY21vc19lcnJubyBiY21vbHRfcHNfYXBwbF9zdGFydChjb25zdCBiY21vbHRfcHNfZ2xvYmFsX2NmZyAqY2ZnKTsKKworLyoqIFN0b3AgdGhlIHByb3RlY3Rpb24gc3dpdGNoaW5nIGFwcGxpY2F0aW9uICh0aGlzIGlzIGdsb2JhbCBmb3IgdGhlIGVudGlyZSBzeXN0ZW0pLgorICoKKyAqIFxyZXR1cm4gICAgICAgIEJDTV9FUlJfT0sgaWYgdGhlIGFwcGxpY2F0aW9uIHdhcyBzdG9wcGVkIHN1Y2Nlc3NmdWxseSwgPDAgb3RoZXJ3aXNlLgorICovCitiY21vc19lcnJubyBiY21vbHRfcHNfYXBwbF9zdG9wKHZvaWQpOworCisvKiogUXVlcnkgd2hldGhlciB0aGUgcHJvdGVjdGlvbiBzd2l0Y2hpbmcgYXBwbGljYXRpb24gaXMgY3VycmVudGx5IHJ1bm5pbmcuCisgKgorICogXHJldHVybiAgICAgICAgQkNNT1NfVFJVRSBpZiB0aGUgYXBwbGljYXRpb24gaXMgcnVubmluZywgQkNNT1NfRkFMU0Ugb3RoZXJ3aXNlLgorICovCitiY21vc19ib29sIGJjbW9sdF9wc19hcHBsX2lzX3J1bm5pbmcodm9pZCk7CisKKy8qKiBHZXQgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHJ1bm5pbmcgcHJvdGVjdGlvbiBzd2l0Y2hpbmcgYXBwbGljYXRpb24gKHRoaXMgaXMgZ2xvYmFsIGZvciB0aGUgZW50aXJlIHN5c3RlbSkuCisgKgorICogXHBhcmFtW291dF0gY2ZnIEdsb2JhbCBwcm90ZWN0aW9uIHN3aXRjaGluZyBjb25maWd1cmF0aW9uLgorICogXHJldHVybiAgICAgICAgIEJDTV9FUlJfT0sgaWYgdGhlIGNvbmZpZ3VyYXRpb24gd2FzIHJldHJpZXZlZCBzdWNjZXNzZnVsbHksIDwwIG90aGVyd2lzZS4KKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X3BzX2dsb2JhbF9jZmdfZ2V0KGJjbW9sdF9wc19nbG9iYWxfY2ZnICpjZmcpOworCisvKiogQ2hhbmdlIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBydW5uaW5nIHByb3RlY3Rpb24gc3dpdGNoaW5nIGFwcGxpY2F0aW9uICh0aGlzIGlzIGdsb2JhbCBmb3IgdGhlIGVudGlyZSBzeXN0ZW0pLgorICoKKyAqIFxwYXJhbVtpbl0gY2ZnIEdsb2JhbCBwcm90ZWN0aW9uIHN3aXRjaGluZyBjb25maWd1cmF0aW9uLgorICogXHJldHVybiAgICAgICAgQkNNX0VSUl9PSyBpZiB0aGUgY29uZmlndXJhdGlvbiB3YXMgdXBkYXRlZCBzdWNjZXNzZnVsbHksIDwwIG90aGVyd2lzZS4KKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X3BzX2dsb2JhbF9jZmdfdXBkYXRlKGNvbnN0IGJjbW9sdF9wc19nbG9iYWxfY2ZnICpjZmcpOworCisvKiogR2V0IHRoZSBsaXN0IG9mIGFsbCBwcm90ZWN0ZWQgcGFpcnMgY3VycmVudGx5IHRyYWNrZWQgYnkgdGhlIHByb3RlY3Rpb24gc3dpdGNoaW5nIGFwcGxpY2F0aW9uLgorICoKKyAqIFxwYXJhbVtpbl0gIGFycmF5X2xlbiAgIFRoZSBsZW5ndGggb2YgdGhlIHBhaXJzIGFycmF5LgorICogXHBhcmFtW291dF0gcGFpcnMgICAgICAgQW4gYXJyYXkgb2YgcHJvdGVjdGVkIHBhaXJzIHRvIGZpbGwuCisgKiBccGFyYW1bb3V0XSBudW1fd3JpdHRlbiBUaGUgbnVtYmVyIG9mIHBhaXJzIHdyaXR0ZW4gdG8gdGhlIGFycmF5LgorICogXHJldHVybiAgICAgICAgICAgICAgICAgQkNNX0VSUl9PSyBpZiB0aGUgYXJyYXkgd2FzIHdyaXR0ZW4gc3VjY2Vzc2Z1bGx5LCA8MCBvdGhlcndpc2UuCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9wc19wYWlyc19nZXQodWludDE2X3QgYXJyYXlfbGVuLCBiY21vbHRfcHNfcGFpciAqcGFpcnMsIHVpbnQxNl90ICpudW1fd3JpdHRlbik7CisKKy8qKiBBZGQgYSBwcm90ZWN0ZWQgcGFpciB0byB0aGUgcHJvdGVjdGlvbiBzd2l0Y2hpbmcgZGF0YWJhc2UuCisgKgorICogQWZ0ZXIgdGhpcyBoYXMgYmVlbiBjYWxsZWQsIHByb3Zpc2lvbmluZyB3aWxsIGJlIG1pcnJvcmVkIGZyb20gdGhlIHdvcmtpbmcgUE9OIHRvIHRoZSBzdGFuZGJ5IFBPTiBhY2NvcmRpbmcgdG8gdGhlCisgKiBtaXJyb3JfbW9kZSBnbG9iYWwgcGFyYW1ldGVyLCBhbmQgYSBzd2l0Y2ggd2lsbCBiZSBwZXJmb3JtZWQgcGVyIHRoZSBzd2l0Y2hfY29uZGl0aW9uIGdsb2JhbCBwYXJhbWV0ZXIuCisgKgorICogXHBhcmFtW2luXSBwYWlyIEEgcGFpciBvZiBQT05zIHRvIGFkZCAtIHRoZXkgY2FuIGJlIG9uIHRoZSBzYW1lIE9MVCBkZXZpY2Ugb3IgZGlmZmVyZW50IGRldmljZXMuCisgKiBccmV0dXJuICAgICAgICAgQkNNX0VSUl9PSyBpZiB0aGUgcGFpciB3YXMgYWRkZWQgc3VjY2Vzc2Z1bGx5LCA8MCBvdGhlcndpc2UuCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9wc19wYWlyX2FkZChjb25zdCBiY21vbHRfcHNfcGFpciAqcGFpcik7CisKKy8qKiBSZW1vdmUgdGhlIHByb3RlY3RlZCBwYWlyIGNvbnRhaW5pbmcgdGhlIHNwZWNpZmllZCBQT04gZnJvbSB0aGUgcHJvdGVjdGlvbiBzd2l0Y2hpbmcgZGF0YWJhc2UuCisqCisqIFxwYXJhbVtpbl0gcG9uIEEgUE9OIHRoYXQgaXMgYSBtZW1iZXIgb2YgYSBwcm90ZWN0aW9uIHBhaXIuCisqIFxyZXR1cm4gICAgICAgIEJDTV9FUlJfT0sgaWYgdGhlIFBPTiB3YXMgcmVtb3ZlZCBzdWNjZXNzZnVsbHksIDwwIG90aGVyd2lzZS4KKyovCitiY21vc19lcnJubyBiY21vbHRfcHNfcG9uX3JlbW92ZShjb25zdCBiY21vbHRfcHNfcG9uICpwb24pOworCisvKiogUXVlcnkgZm9yIHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgcHJvdGVjdGVkIFBPTi4KKyoKKyogXHBhcmFtW2luXSAgcG9uICAgICBUaGUgUE9OIHRvIHF1ZXJ5LgorKiBccGFyYW1bb3V0XSBzdGF0ZSAgIFRoZSBwcm90ZWN0aW9uIHN0YXRlIG9mIHRoZSBQT04gKGUuZy4gd29ya2luZy9zdGFuZGJ5KS4KKyogXHBhcmFtW291dF0gcGFydG5lciBJZiB0aGlzIFBPTiBpcyBwcm90ZWN0ZWQsIHRoZSBvdGhlciBoYWxmIG9mIHRoZSBwcm90ZWN0ZWQgcGFpci4KKyogXHJldHVybiAgICAgICAgICAgICBCQ01fRVJSX09LIGlmIHRoZSBQT04gd2FzIHF1ZXJpZWQgc3VjY2Vzc2Z1bGx5LCA8MCBvdGhlcndpc2UuCisqLworYmNtb3NfZXJybm8gYmNtb2x0X3BzX3Bvbl9zdGF0ZV9nZXQoY29uc3QgYmNtb2x0X3BzX3BvbiAqcG9uLCBiY21vbHRfcHNfcG9uX3N0YXRlICpzdGF0ZSwgYmNtb2x0X3BzX3BvbiAqcGFydG5lcik7CisKKy8qKiBQcm9jZXNzIGFuIGluZGljYXRpb24gcmVjZWl2ZWQgYnkgdGhlIHdvcmtpbmcgUE9OLgorICoKKyAqIFRoZSBhY3Rpb24gdGFrZW4gd2lsbCBkZXBlbmQgb24gdGhlIG9iamVjdC9pbmRpY2F0aW9uIHR5cGUgYW5kIHRoZSBtaXJyb3JfbW9kZSBnbG9iYWwgcGFyYW1ldGVyLgorICogSWYgdGhlIGFwcGxpY2F0aW9uIGlzbid0IHJ1bm5pbmcsIHRoZSBzdXBwbGllZCBQT04gaXNuJ3QgaW4gYSBwcm90ZWN0ZWQgd29ya2luZyBzdGF0ZSBvciB0aGUgaW5kaWNhdGlvbiBpc24ndAorICogcmVsZXZhbnQgZm9yIHByb3RlY3Rpb24gc3dpdGNoaW5nLCB0aGUgaW5kaWNhdGlvbiB3aWxsIGJlIGlnbm9yZWQuCisgKgorICogTm90ZTogdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBmcmVlIHRoZSBpbmRpY2F0aW9uLgorICogVGhlIGNhbGxlciBtdXN0IGZyZWUgaXQgdXNpbmcgYmNtb3NfbXNnX2ZyZWUoKSBhZnRlciBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgKgorICogXHBhcmFtW2luXSBwb24gVGhlIFBPTiBvbiB3aGljaCB0aGUgaW5kaWNhdGlvbiB3YXMgcmVjZWl2ZWQuCisgKiBccGFyYW1baW5dIGluZCBUaGUgaW5kaWNhdGlvbiB0aGF0IHdhcyByZWNlaXZlZC4KKyAqIFxyZXR1cm4gICAgICAgIEJDTV9FUlJfT0sgaWYgdGhlIGluZGljYXRpb24gd2FzIHByb2Nlc3NlZCBzdWNjZXNzZnVsbHkgb3IgaWdub3JlZCwgPDAgb3RoZXJ3aXNlLgorICovCitiY21vc19lcnJubyBiY21vbHRfcHNfcHJvY2Vzc19pbmQoY29uc3QgYmNtb2x0X3BzX3BvbiAqcG9uLCBiY21vbHRfYXV0byAqaW5kKTsKKworLyoqIEltbWVkaWF0ZWx5IHBlcmZvcm0gYSBwcm90ZWN0aW9uIHN3aXRjaCBvbiB0aGUgZ2l2ZW4gUE9OLCB3aGljaCBtdXN0IGJlbG9uZyB0byBhIHByb3RlY3RlZCBwYWlyLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgcHJpbWFyaWx5IGludGVuZGVkIGZvciB1c2Ugd2l0aCB0aGUgQkNNT0xUX1BTX1NXSVRDSF9DT05ESVRJT05fTUFOVUFMIHN3aXRjaCBjb25kaXRpb24sIG9yIGZvcgorICogZGVidWdnaW5nIHB1cnBvc2VzLgorICoKKyAqIE5vdGUgdGhhdCB0aGlzIGRvZXNuJ3Qgd2FpdCBmb3IgdGhlIHN3aXRjaCB0byBjb21wbGV0ZSAtIGl0IG1lcmVseSBqdXN0IGNvbmZpZ3VyZXMgdGhlIHRyYW5zY2VpdmVycyBhbmQgaW5pdGlhdGVzCisgKiB0aGUgUE9OIHN0YXRlIHRyYW5zaXRpb25zLiAgVG8gd2FpdCBmb3IgY29tcGxldGlvbiwgdGhlIGhvc3QgbXVzdCB3YWl0IGZvciB0aGUgUE9OIE5JIHN0YXRlIGNoYW5nZSBjb21wbGV0ZSBvcgorICogInByb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lIiBpbmRpY2F0aW9ucyB0byBiZSByZWNlaXZlZC4KKyAqCisgKiBccGFyYW1baW5dIHBhaXIgVGhlIFBPTiBvbiB3aGljaCB0byBwZXJmb3JtIHRoZSBzd2l0Y2ggKGVpdGhlciB0aGUgd29ya2luZyBvciBzdGFuZGJ5IFBPTiBvZiBhIHByb3RlY3RlZCBwYWlyKS4KKyAqIFxyZXR1cm4gICAgICAgICBCQ01fRVJSX09LIGlmIHRoZSBzd2l0Y2ggd2FzIHN1Y2Nlc3NmdWwsIDwwIG90aGVyd2lzZS4KKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X3BzX3N3aXRjaF9wZXJmb3JtKGNvbnN0IGJjbW9sdF9wc19wb24gKnBvbik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wcm90ZWN0aW9uX3N3aXRjaGluZy9iY21vbHRfdXNlcl9hcHBsX3BzX2NsaS5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wcm90ZWN0aW9uX3N3aXRjaGluZy9iY21vbHRfdXNlcl9hcHBsX3BzX2NsaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3NWJkMDAKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3Byb3RlY3Rpb25fc3dpdGNoaW5nL2JjbW9sdF91c2VyX2FwcGxfcHNfY2xpLmMKQEAgLTAsMCArMSwyOTEgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorKi8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbWNsaS5oPgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfcHNfY2xpLmgiCisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9wcy5oIgorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfY21kX3N0YXJ0KGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybXNbXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKnBhcm07CisgICAgYmNtb2x0X3BzX2dsb2JhbF9jZmcgY2ZnID0ge307CisKKyAgICBwYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWF4X3BhaXJzIik7CisgICAgaWYgKHBhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNmZy5tYXhfbnVtX3BhaXJzID0gKHVpbnQxNl90KXBhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisKKyAgICBwYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAic3dpdGNoX2NvbmRpdGlvbiIpOworICAgIGlmIChwYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBjZmcuc3dpdGNoX2NvbmRpdGlvbiA9IChiY21vbHRfcHNfc3dpdGNoX2NvbmRpdGlvbilwYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorCisgICAgcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN3aXRjaF9zZXF1ZW5jZSIpOworICAgIGlmIChwYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBjZmcuc3dpdGNoX3NlcXVlbmNlID0gKGJjbW9sdF9wc19zd2l0Y2hfc2VxdWVuY2UpcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKworICAgIHBhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJtaXJyb3JfbW9kZSIpOworICAgIGlmIChwYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBjZmcubWlycm9yX21vZGUgPSAoYmNtb2x0X3BzX21pcnJvcl9tb2RlKXBhcm0tPnZhbHVlLm51bWJlcjsKKyAgICB9CisKKyAgICBwYXJtID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAibWlycm9yX21hY19lbnRyaWVzIik7CisgICAgaWYgKHBhcm0gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNmZy5taXJyb3JfbWFjX2VudHJpZXMgPSAoYmNtb3NfYm9vbClwYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorCisgICAgcGFybSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YXRpY19tYWNfZW50cmllcyIpOworICAgIGlmIChwYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBjZmcuc3RhdGljX21hY19lbnRyaWVzID0gKGJjbW9zX2Jvb2wpcGFybS0+dmFsdWUubnVtYmVyOworICAgIH0KKworICAgIHBhcm0gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJ0cnhfd2FybWluZ19kZWxheSIpOworICAgIGlmIChwYXJtICE9IE5VTEwpCisgICAgeworICAgICAgICBjZmcudHJ4X3dhcm1pbmdfZGVsYXkgPSBwYXJtLT52YWx1ZS5udW1iZXI7CisgICAgfQorCisgICAgcmV0dXJuIGJjbW9sdF9wc19hcHBsX3N0YXJ0KCZjZmcpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfY21kX3N0b3AoYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtc1tdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIHJldHVybiBiY21vbHRfcHNfYXBwbF9zdG9wKCk7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19jbWRfZ2V0X2NmZyhiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1zW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9wc19nbG9iYWxfY2ZnIGNmZzsKKyAgICAKKyAgICBlcnIgPSBiY21vbHRfcHNfZ2xvYmFsX2NmZ19nZXQoJmNmZyk7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAibWF4X3BhaXJzPSVkXG4iLCBjZmcubWF4X251bV9wYWlycyk7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoCisgICAgICAgIHNlc3Npb24sCisgICAgICAgICJzd2l0Y2hfY29uZGl0aW9uPSVzXG4iLAorICAgICAgICBjZmcuc3dpdGNoX2NvbmRpdGlvbiA9PSBCQ01PTFRfUFNfU1dJVENIX0NPTkRJVElPTl9MT1MgPyAibG9zIiA6ICJtYW51YWwiKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludCgKKyAgICAgICAgc2Vzc2lvbiwKKyAgICAgICAgInN3aXRjaF9zZXF1ZW5jZT0lc1xuIiwKKyAgICAgICAgY2ZnLnN3aXRjaF9zZXF1ZW5jZSA9PSBCQ01PTFRfUFNfU1dJVENIX1NFUVVFTkNFX1NUQU5EQVJEID8gInN0ZCIgOiAidHJ4X2ZpcnN0Iik7CisgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoCisgICAgICAgIHNlc3Npb24sCisgICAgICAgICJtaXJyb3JfbW9kZT0lc1xuIiwKKyAgICAgICAgY2ZnLm1pcnJvcl9tb2RlID09IEJDTU9MVF9QU19NSVJST1JfTU9ERV9BVVRPID8gImF1dG8iIDogIm5vbmUiKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAibWlycm9yX21hY19lbnRyaWVzPSVzXG4iLCBjZmcubWlycm9yX21hY19lbnRyaWVzID8gInllcyIgOiAibm8iKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAic3RhdGljX21hY19lbnRyaWVzPSVzXG4iLCBjZmcuc3RhdGljX21hY19lbnRyaWVzID8gInllcyIgOiAibm8iKTsKKyAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAidHJ4X3dhcm1pbmdfZGVsYXk9JXVcbiIsIGNmZy50cnhfd2FybWluZ19kZWxheSk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2NtZF9zaG93X3BhaXJzKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybXNbXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X3BzX2dsb2JhbF9jZmcgY2ZnOworICAgIGJjbW9sdF9wc19wYWlyICpwYWlyczsKKyAgICB1aW50MTZfdCBudW1fd3JpdHRlbjsKKworICAgIGVyciA9IGJjbW9sdF9wc19nbG9iYWxfY2ZnX2dldCgmY2ZnKTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHBhaXJzID0gYmNtb3NfY2FsbG9jKHNpemVvZigqcGFpcnMpICogY2ZnLm1heF9udW1fcGFpcnMpOworCisgICAgZXJyID0gYmNtb2x0X3BzX3BhaXJzX2dldChjZmcubWF4X251bV9wYWlycywgcGFpcnMsICZudW1fd3JpdHRlbik7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgdWludDE2X3QgaTsKKworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiICAgICAgd29ya2luZyAgfCBzdGFuZGJ5XG4iKTsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIiAgICAgID09PT09PT09PSs9PT09PT09PT1cbiIpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3dyaXR0ZW47IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoCisgICAgICAgICAgICAgICAgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAiWyUyZF06ICUyZC4lMmQuJTJkIHwgJTJkLiUyZC4lMmRcbiIsCisgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICBwYWlyc1tpXS53b3JraW5nLmRldmljZV9pZCwKKyAgICAgICAgICAgICAgICBwYWlyc1tpXS53b3JraW5nLnBvbl9pZCwKKyAgICAgICAgICAgICAgICBwYWlyc1tpXS53b3JraW5nLnRyYW5zY2VpdmVyX2lkLAorICAgICAgICAgICAgICAgIHBhaXJzW2ldLnN0YW5kYnkuZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgIHBhaXJzW2ldLnN0YW5kYnkucG9uX2lkLAorICAgICAgICAgICAgICAgIHBhaXJzW2ldLnN0YW5kYnkudHJhbnNjZWl2ZXJfaWQpOworICAgICAgICB9CisgICAgfQorCisgICAgYmNtb3NfZnJlZShwYWlycyk7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2NtZF9hZGRfcGFpcihiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1zW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgYmNtY2xpX2NtZF9wYXJtICp3b3JraW5nX2RldmljZSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIndvcmtpbmcuZGV2aWNlIik7CisgICAgYmNtY2xpX2NtZF9wYXJtICp3b3JraW5nX3BvbiA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIndvcmtpbmcucG9uIik7CisgICAgYmNtY2xpX2NtZF9wYXJtICp3b3JraW5nX3RyYW5zY2VpdmVyID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAid29ya2luZy50cmFuc2NlaXZlciIpOworICAgIGJjbWNsaV9jbWRfcGFybSAqc3RhbmRieV9kZXZpY2UgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGFuZGJ5LmRldmljZSIpOworICAgIGJjbWNsaV9jbWRfcGFybSAqc3RhbmRieV9wb24gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdGFuZGJ5LnBvbiIpOworICAgIGJjbWNsaV9jbWRfcGFybSAqc3RhbmRieV90cmFuc2NlaXZlciA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgInN0YW5kYnkudHJhbnNjZWl2ZXIiKTsKKworICAgIGJjbW9sdF9wc19wYWlyIHBhaXIgPQorICAgIHsKKyAgICAgICAgLndvcmtpbmcgPQorICAgICAgICB7CisgICAgICAgICAgICAuZGV2aWNlX2lkID0gKGJjbW9sdF9kZXZpZCl3b3JraW5nX2RldmljZS0+dmFsdWUubnVtYmVyLAorICAgICAgICAgICAgLnBvbl9pZCA9IChiY21vbHRfcG9uX25pKXdvcmtpbmdfcG9uLT52YWx1ZS5udW1iZXIsCisgICAgICAgICAgICAudHJhbnNjZWl2ZXJfaWQgPSAoYmNtb2x0X3Bvbl9uaSl3b3JraW5nX3RyYW5zY2VpdmVyLT52YWx1ZS5udW1iZXIKKyAgICAgICAgfSwKKyAgICAgICAgLnN0YW5kYnkgPQorICAgICAgICB7CisgICAgICAgICAgICAuZGV2aWNlX2lkID0gKGJjbW9sdF9kZXZpZClzdGFuZGJ5X2RldmljZS0+dmFsdWUubnVtYmVyLAorICAgICAgICAgICAgLnBvbl9pZCA9IChiY21vbHRfcG9uX25pKXN0YW5kYnlfcG9uLT52YWx1ZS5udW1iZXIsCisgICAgICAgICAgICAudHJhbnNjZWl2ZXJfaWQgPSAoYmNtb2x0X3Bvbl9uaSlzdGFuZGJ5X3RyYW5zY2VpdmVyLT52YWx1ZS5udW1iZXIKKyAgICAgICAgfSwKKyAgICB9OworCisgICAgLy8gU2V0IHRyYW5zY2VpdmVyX2lkIHRvIHBvbl9pZCBpZiBkZWZhdWx0CisgICAgaWYgKHBhaXIud29ya2luZy50cmFuc2NlaXZlcl9pZCA9PSAoYmNtb2x0X3Bvbl9uaSktMSkKKyAgICB7CisgICAgICAgIHBhaXIud29ya2luZy50cmFuc2NlaXZlcl9pZCA9IHBhaXIud29ya2luZy5wb25faWQ7CisgICAgfQorICAgIGlmIChwYWlyLnN0YW5kYnkudHJhbnNjZWl2ZXJfaWQgPT0gKGJjbW9sdF9wb25fbmkpLTEpCisgICAgeworICAgICAgICBwYWlyLnN0YW5kYnkudHJhbnNjZWl2ZXJfaWQgPSBwYWlyLnN0YW5kYnkucG9uX2lkOworICAgIH0KKworICAgIHJldHVybiBiY21vbHRfcHNfcGFpcl9hZGQoJnBhaXIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfY21kX3JlbW92ZV9wb24oYmNtY2xpX3Nlc3Npb24gKnNlc3Npb24sIGNvbnN0IGJjbWNsaV9jbWRfcGFybSBwYXJtc1tdLCB1aW50MTZfdCBuX3Bhcm1zKQoreworICAgIGJjbWNsaV9jbWRfcGFybSAqZGV2aWNlID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAiZGV2aWNlIik7CisgICAgYmNtY2xpX2NtZF9wYXJtICpwb24gPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJwb24iKTsKKworICAgIGJjbW9sdF9wc19wb24gcHNfcG9uID0KKyAgICB7CisgICAgICAgIC5kZXZpY2VfaWQgPSAoYmNtb2x0X2RldmlkKWRldmljZS0+dmFsdWUubnVtYmVyLAorICAgICAgICAucG9uX2lkID0gKGJjbW9sdF9wb25fbmkpcG9uLT52YWx1ZS5udW1iZXIKKyAgICB9OworCisgICAgcmV0dXJuIGJjbW9sdF9wc19wb25fcmVtb3ZlKCZwc19wb24pOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfY21kX3BlcmZvcm1fc3dpdGNoKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybXNbXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21jbGlfY21kX3Bhcm0gKmRldmljZSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImRldmljZSIpOworICAgIGJjbWNsaV9jbWRfcGFybSAqcG9uID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9uIik7CisKKyAgICBiY21vbHRfcHNfcG9uIHBzX3BvbiA9CisgICAgeworICAgICAgICAuZGV2aWNlX2lkID0gKGJjbW9sdF9kZXZpZClkZXZpY2UtPnZhbHVlLm51bWJlciwKKyAgICAgICAgLnBvbl9pZCA9IChiY21vbHRfcG9uX25pKXBvbi0+dmFsdWUubnVtYmVyCisgICAgfTsKKworICAgIHJldHVybiBiY21vbHRfcHNfc3dpdGNoX3BlcmZvcm0oJnBzX3Bvbik7Cit9CisKK2JjbW9zX2Vycm5vIGJjbW9sdF91c2VyX2FwcGxfcHNfY2xpX2luaXQoYmNtY2xpX2VudHJ5ICp0b3BfZGlyKQoreworICAgIHN0YXRpYyBiY21jbGlfZW51bV92YWwgc3dpdGNoX2NvbmRfdGFibGVbXSA9CisgICAgeworICAgICAgICB7IC5uYW1lID0gImxvcyIsICAgIC52YWwgPSBCQ01PTFRfUFNfU1dJVENIX0NPTkRJVElPTl9MT1MgfSwKKyAgICAgICAgeyAubmFtZSA9ICJtYW51YWwiLCAudmFsID0gQkNNT0xUX1BTX1NXSVRDSF9DT05ESVRJT05fTUFOVUFMIH0sCisgICAgICAgIEJDTUNMSV9FTlVNX0xBU1QKKyAgICB9OworCisgICAgc3RhdGljIGJjbWNsaV9lbnVtX3ZhbCBzd2l0Y2hfc2VxX3RhYmxlW10gPQorICAgIHsKKyAgICAgICAgeyAubmFtZSA9ICJzdGQiLCAgICAgICAudmFsID0gQkNNT0xUX1BTX1NXSVRDSF9TRVFVRU5DRV9TVEFOREFSRCB9LAorICAgICAgICB7IC5uYW1lID0gInRyeF9maXJzdCIsIC52YWwgPSBCQ01PTFRfUFNfU1dJVENIX1NFUVVFTkNFX1RSWF9GSVJTVCB9LAorICAgICAgICBCQ01DTElfRU5VTV9MQVNUCisgICAgfTsKKworICAgIHN0YXRpYyBiY21jbGlfZW51bV92YWwgbWlycm9yX21vZGVfdGFibGVbXSA9CisgICAgeworICAgICAgICB7IC5uYW1lID0gImF1dG8iLCAudmFsID0gQkNNT0xUX1BTX01JUlJPUl9NT0RFX0FVVE8gfSwKKyAgICAgICAgeyAubmFtZSA9ICJub25lIiwgLnZhbCA9IEJDTU9MVF9QU19NSVJST1JfTU9ERV9OT05FIH0sCisgICAgICAgIEJDTUNMSV9FTlVNX0xBU1QKKyAgICB9OworCisgICAgYmNtY2xpX2VudHJ5ICpkaXIgPQorICAgICAgICBiY21jbGlfZGlyX2FkZCh0b3BfZGlyLCAicHMiLCAiUHJvdGVjdGlvbiBzd2l0Y2hpbmcgdXNlciBhcHBsaWNhdGlvbiIsIEJDTUNMSV9BQ0NFU1NfQURNSU4sIE5VTEwpOworICAgIEJDTU9TX0NIRUNLX1JFVFVSTl9FUlJPUighZGlyLCBCQ01fRVJSX05PTUVNKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRChkaXIsICJzdGFydCIsICJTdGFydCBwcm90ZWN0aW9uIHN3aXRjaGluZyBhcHBsaWNhdGlvbiIsIHBzX2NtZF9zdGFydCwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgibWF4X3BhaXJzIiwgIk1heCBudW1iZXIgb2YgcHJvdGVjdGVkIHBhaXJzIiwgQkNNQ0xJX1BBUk1fTlVNQkVSLCBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNKCJzd2l0Y2hfY29uZGl0aW9uIiwgIlN3aXRjaCBjb25kaXRpb24iLCBzd2l0Y2hfY29uZF90YWJsZSwgQkNNQ0xJX1BBUk1fRkxBR19PUFRJT05BTCksCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fRU5VTSgic3dpdGNoX3NlcXVlbmNlIiwgIlN3aXRjaCBzZXF1ZW5jZSIsIHN3aXRjaF9zZXFfdGFibGUsIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwpLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oIm1pcnJvcl9tb2RlIiwgIk1pcnJvciBtb2RlIiwgbWlycm9yX21vZGVfdGFibGUsIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwpLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oCisgICAgICAgICAgICAibWlycm9yX21hY19lbnRyaWVzIiwgIk1pcnJvciBNQUMgZW50cmllcyIsIGJjbWNsaV9lbnVtX2Jvb2xfdGFibGUsIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwpLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU0oCisgICAgICAgICAgICAic3RhdGljX21hY19lbnRyaWVzIiwgIlN0YXRpYyBNQUMgZW50cmllcyIsIGJjbWNsaV9lbnVtX2Jvb2xfdGFibGUsIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwpLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJ0cnhfd2FybWluZ19kZWxheSIsICJUUlggd2FybWluZyBkZWxheSAoaW4gdXNlYykiLCBCQ01DTElfUEFSTV9VREVDSU1BTCwgQkNNQ0xJX1BBUk1fRkxBR19PUFRJT05BTCkpOworCisgICAgQkNNQ0xJX01BS0VfQ01EX05PUEFSTShkaXIsICJzdG9wIiwgIlN0b3AgcHJvdGVjdGlvbiBzd2l0Y2hpbmcgYXBwbGljYXRpb24iLCBwc19jbWRfc3RvcCk7CisKKyAgICBCQ01DTElfTUFLRV9DTURfTk9QQVJNKGRpciwgImdldF9jZmciLCAiU2hvdyBydW5uaW5nIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyIsIHBzX2NtZF9nZXRfY2ZnKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oZGlyLCAic2hvd19wYWlycyIsICJTaG93IGN1cnJlbnQgcHJvdGVjdGVkIHBhaXJzIiwgcHNfY21kX3Nob3dfcGFpcnMpOworCisgICAgQkNNQ0xJX01BS0VfQ01EKGRpciwgImFkZF9wYWlyIiwgIkFkZCBwcm90ZWN0ZWQgcGFpciIsIHBzX2NtZF9hZGRfcGFpciwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgid29ya2luZy5kZXZpY2UiLCAiRGV2aWNlIElEIG9mIHRoZSB3b3JraW5nIFBPTiIsIEJDTUNMSV9QQVJNX05VTUJFUiwgMCksCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oIndvcmtpbmcucG9uIiwgIlBPTiBOSSBvZiB0aGUgd29ya2luZyBQT04iLCBCQ01DTElfUEFSTV9OVU1CRVIsIDApLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0RFRlZBTCgid29ya2luZy50cmFuc2NlaXZlciIsICJUcmFuc2NlaXZlciBJZCBvZiB0aGUgd29ya2luZyBQT04iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01DTElfUEFSTV9OVU1CRVIsIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwsIC0xKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgic3RhbmRieS5kZXZpY2UiLCAiRGV2aWNlIElEIG9mIHRoZSBzdGFuZGJ5IFBPTiIsIEJDTUNMSV9QQVJNX05VTUJFUiwgMCksCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oInN0YW5kYnkucG9uIiwgIlBPTiBOSSBvZiB0aGUgc3RhbmRieSBQT04iLCBCQ01DTElfUEFSTV9OVU1CRVIsIDApLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0RFRlZBTCgic3RhbmRieS50cmFuc2NlaXZlciIsICJUcmFuc2NlaXZlciBJZCBvZiB0aGUgc3RhbmRieSBQT04iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ01DTElfUEFSTV9OVU1CRVIsIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwsIC0xKSk7CisKKyAgICBCQ01DTElfTUFLRV9DTUQoZGlyLCAicmVtb3ZlX3BvbiIsICJSZW1vdmUgcHJvdGVjdGVkIHBhaXIgZm9yIChlaXRoZXIpIFBPTiIsIHBzX2NtZF9yZW1vdmVfcG9uLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJkZXZpY2UiLCAiRGV2aWNlIElEIG9mIHRoZSBlaXRoZXIgd29ya2luZy9zdGFuZGJ5IFBPTiIsIEJDTUNMSV9QQVJNX05VTUJFUiwgMCksCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk0oInBvbiIsICJQT04gTkkgb2YgdGhlIGVpdGhlciB3b3JraW5nL3N0YW5kYnkgUE9OIiwgQkNNQ0xJX1BBUk1fTlVNQkVSLCAwKSk7CisKKyAgICBCQ01DTElfTUFLRV9DTUQoZGlyLCAicGVyZm9ybV9zd2l0Y2giLCAiUGVyZm9ybSBwcm90ZWN0aW9uIHN3aXRjaCBtYW51YWxseSIsIHBzX2NtZF9wZXJmb3JtX3N3aXRjaCwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTSgiZGV2aWNlIiwgIkRldmljZSBJRCBvZiB0aGUgZWl0aGVyIHdvcmtpbmcvc3RhbmRieSBQT04iLCBCQ01DTElfUEFSTV9OVU1CRVIsIDApLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNKCJwb24iLCAiUE9OIE5JIG9mIHRoZSBlaXRoZXIgd29ya2luZy9zdGFuZGJ5IFBPTiIsIEJDTUNMSV9QQVJNX05VTUJFUiwgMCkpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3Byb3RlY3Rpb25fc3dpdGNoaW5nL2JjbW9sdF91c2VyX2FwcGxfcHNfY2xpLmggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3Byb3RlY3Rpb25fc3dpdGNoaW5nL2JjbW9sdF91c2VyX2FwcGxfcHNfY2xpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI3N2MwOQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvcHJvdGVjdGlvbl9zd2l0Y2hpbmcvYmNtb2x0X3VzZXJfYXBwbF9wc19jbGkuaApAQCAtMCwwICsxLDM4IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyovCisKKyNpZm5kZWYgX0JDTU9MVF9VU0VSX0FQUExfUFNfQ0xJX0hfCisjZGVmaW5lIF9CQ01PTFRfVVNFUl9BUFBMX1BTX0NMSV9IXworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtY2xpLmg+CisKK2JjbW9zX2Vycm5vIGJjbW9sdF91c2VyX2FwcGxfcHNfY2xpX2luaXQoYmNtY2xpX2VudHJ5ICp0b3BfZGlyKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3Byb3RlY3Rpb25fc3dpdGNoaW5nL2JjbW9sdF91c2VyX2FwcGxfcHNfZXBvbi5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wcm90ZWN0aW9uX3N3aXRjaGluZy9iY21vbHRfdXNlcl9hcHBsX3BzX2Vwb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWI5M2NiCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wcm90ZWN0aW9uX3N3aXRjaGluZy9iY21vbHRfdXNlcl9hcHBsX3BzX2Vwb24uYwpAQCAtMCwwICsxLDE4OCBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisqLworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtb2x0X2FwaS5oPgorI2luY2x1ZGUgPGJjbW9sdF9tb2RlbF90eXBlcy5oPgorI2luY2x1ZGUgPGJjbV9kZXZfbG9nLmg+CisjaW5jbHVkZSA8YmNtb3NfY29tbW9uLmg+CisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9wcy5oIgorI2luY2x1ZGUgImJjbW9sdF91c2VyX2FwcGxfcHNfaW50ZXJuYWwuaCIKKworCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfaGFuZGxlX25pX25vX3JlcG9ydHMoYmNtb2x0X3BzX2dsb2JhbF9jZmcgKiBnbG9iYWxfY2ZnLCBjb25zdCBiY21vbHRfcHNfcG9uICpwb24sIGNvbnN0IGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHMgKiBpbmQpCit7CisgICAgaWYgKGluZC0+ZGF0YS5hbGFybV9zdGF0dXMgPT0gQkNNT0xUX1NUQVRVU19PRkYpCisgICAgeworICAgICAgICBQU19JTkZPKCI8JWQ6JWQ+IExvUyBhbGFybSBjbGVhcmVkXG4iLCBwb24tPmRldmljZV9pZCwgcG9uLT5wb25faWQpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisKKyAgICBQU19JTkZPKCI8JWQ6JWQ+IExvUyBhbGFybSByYWlzZWRcbiIsIHBvbi0+ZGV2aWNlX2lkLCBwb24tPnBvbl9pZCk7CisKKyAgICBpZiAoZ2xvYmFsX2NmZy0+c3dpdGNoX2NvbmRpdGlvbiA9PSBCQ01PTFRfUFNfU1dJVENIX0NPTkRJVElPTl9NQU5VQUwpCisgICAgeworICAgICAgICAvKiBkb24ndCByZWFjdCB0byB0aGUgc3dpdGNoIGlmIHdlJ3JlIGluIG1hbnVhbCBzd2l0Y2ggbW9kZSAqLworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIGJjbW9sdF9wc19zd2l0Y2hfcGVyZm9ybShwb24pOworICAgIH0KK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9sb2dpY2FsX2xpbmtfZGlzY292ZXJlZChiY21vbHRfcHNfZ2xvYmFsX2NmZyAqIGdsb2JhbF9jZmcsIGNvbnN0IGJjbW9sdF9wc19wb24gKnBvbiwgY29uc3QgYmNtb2x0X2Vwb25fbGlua19tcGNwX2Rpc2NvdmVyZWQgKiBpbmQpCit7CisgICAgYmNtb2x0X3BzX3Bvbl9zdGF0ZSBzdGF0ZTsKKyAgICBiY21vbHRfcHNfcG9uIHBhcnRuZXI7CisgICAgYmNtb3NfZXJybm8gcmVzdWx0OworCisgICAgaWYgKGdsb2JhbF9jZmctPm1pcnJvcl9tb2RlICE9IEJDTU9MVF9QU19NSVJST1JfTU9ERV9BVVRPKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorICAgIAorICAgIC8vQXQgdGhpcyBwb2ludCB3ZSBrbm93IHdlIGhhdmUgYSBsaW5rIGRpc2NvdmVyZWQgb24gYSBQT04gdGhhdCBpcyBpbiB0aGUgUFJPVEVDVEVEIFdPUktJTkcgc3RhdGUuCisgICAgLy9UaGlzIG1lYW5zIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgaXMgaXMgc2V0dXAgb24gdGhlIFBST0NURUNURUQgU1RBTkRCWSBQT04uICBJdCBpcyBwb3NzaWJsZQorICAgIC8vVGhhdCB0aGlzIGxpbmsgaGFzIGJlZW4gcHJldmlvdXNseSBjb25maWd1cmVkIG9uIHRoZSBTVEFOREJZIFBPTiBzbyB3ZSBoYXZlIHRvIGhhbmRsZSB0aGF0IGNhc2UKKyAgICAvL2dyYWNlZnVsbHkgYXMgd2VsbC4KKyAgICByZXN1bHQgPSBiY21vbHRfcHNfcG9uX3N0YXRlX2dldChwb24sICZzdGF0ZSwgJnBhcnRuZXIpOworICAgIFBTX0lORk8oInBvbiAlZCwgYmNtb2x0X3BzX3Bvbl9zdGF0ZV9nZXQgcmVzdWx0ID09ICVkLCBzdGF0ZSA9PSAlZCwgcGFydG5lci5wb25faWQgPT0gJWRcbiIsIHBvbi0+cG9uX2lkLCByZXN1bHQsIHN0YXRlLCBwYXJ0bmVyLnBvbl9pZCk7CisgICAgaWYgKChCQ01fRVJSX09LID09IHJlc3VsdCkgJiYgKHN0YXRlID09IEJDTU9MVF9QU19QT05fU1RBVEVfV09SS0lORykpCisgICAgeworICAgICAgICBiY21vbHRfZXBvbl9uaV9hZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGluayBhZGRfc3RhbmRieSA9IHt9OworICAgICAgICBiY21vbHRfZXBvbl9uaV9rZXkga2V5ID0ge307CisgICAgICAgIFBTX0lORk8oIk1pcnJvcmluZyByZWNlaXZlZCBsaW5rIGRpc2NvdmVyZWQgb24gd29ya2luZyBQT05cbiIpOworCisgICAgICAgIGtleS5lcG9uX25pID0gKGJjbW9sdF9lcG9uX25pKXBhcnRuZXIucG9uX2lkOyAgLy9TZXR1cCB0aGUgc3RhbmRieSBQT04gYXMgdGhlIGxvY2F0aW9uIHRvIGFkZCB0aGUgbGluay4KKyAgICAgICAgCisgICAgICAgIC8vU2V0dXAgb3BlcmF0aW9uIGtleSBmb3IgYXBpIGNhbGwuCisgICAgICAgIEJDTU9MVF9PUEVSX0lOSVQoJmFkZF9zdGFuZGJ5LCBlcG9uX25pLCBhZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGluaywga2V5KTsKKworICAgICAgICAvL0NvcHkgb3ZlciB0aGUgZGF0YSBmcm9tIHRoZSByZWNlaXZlZCBtZXNzYWdlczoKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJmFkZF9zdGFuZGJ5LCBlcG9uX25pLCBhZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGluaywgbWFjX2FkZHJlc3MsIGluZC0+a2V5Lm1hY19hZGRyZXNzKTsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJmFkZF9zdGFuZGJ5LCBlcG9uX25pLCBhZGRfcHJvdGVjdGVkX3N0YW5kYnlfbGluaywgd29ya2luZ19saW5rX2luZm8sIGluZC0+ZGF0YS5saW5rX2luZm8pOworCisgICAgICAgIHJlc3VsdCA9IGJjbW9sdF9vcGVyX3N1Ym1pdChwYXJ0bmVyLmRldmljZV9pZCwgJmFkZF9zdGFuZGJ5Lmhkcik7CisKKyAgICAgICAgLy9XZSBoYXZlIG11bHRpcGxlIGFjY2VwdGFibGUgcmV0dXJuIGNvZGVzIGhlcmU6ICAKKyAgICAgICAgLy8gIEJDTV9FUlJfT0sgICAgICAtIEluZGljYXRlcyBuZXcgZW50cnkgY3JlYXRlZC4KKyAgICAgICAgLy8gIEJDTV9FUlJfQUxSRUFEWSAtIEluZGljYXRlcyB0aGUgZW50cnkgYWxyZWFkeSBleGlzdHMgKHBvc3NpYmxlIGFmdGVyIGRlcmVnaXN0cmF0aW9uL3JlcmVnaXN0cmF0aW9uKS4KKyAgICAgICAgUFNfSU5GTygiTWlycm9yaW5nIGFkZCBwcm90ZWN0ZWQgc3RhbmRieSBsaW5rIHJlc3VsdCAlZFxuIiwgcmVzdWx0KTsKKworICAgICAgICBpZiAoIChyZXN1bHQgPT0gQkNNX0VSUl9PSykgfHwgKHJlc3VsdCA9PSBCQ01fRVJSX0FMUkVBRFkpICkKKyAgICAgICAgeworICAgICAgICAgICAgYmNtb2x0X2Vwb25fbGlua19zdGF0aWNfcmVnaXN0cmF0aW9uIHN0YXRpY19yZWcgPSB7fTsKKyAgICAgICAgICAgIGJjbW9sdF9lcG9uX2xpbmtfa2V5IGxpbmtfa2V5ID0ge307CisKKyAgICAgICAgICAgIGxpbmtfa2V5LmVwb25fbmkgPSAoYmNtb2x0X2Vwb25fbmkpcGFydG5lci5wb25faWQ7CisgICAgICAgICAgICBsaW5rX2tleS5tYWNfYWRkcmVzcyA9IGluZC0+a2V5Lm1hY19hZGRyZXNzOworCisgICAgICAgICAgICAvL1NldHVwIG9wZXJhdGlvbiBrZXkgZm9yIGFwaSBjYWxsLgorICAgICAgICAgICAgQkNNT0xUX09QRVJfSU5JVCgmc3RhdGljX3JlZywgZXBvbl9saW5rLCBzdGF0aWNfcmVnaXN0cmF0aW9uLCBsaW5rX2tleSk7CisgICAgICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmc3RhdGljX3JlZywgZXBvbl9saW5rLCBzdGF0aWNfcmVnaXN0cmF0aW9uLCBsYXNlcm9uX3RpbWVfdHEsIGluZC0+ZGF0YS5saW5rX2luZm8ub251X2xhc2VyX29uX3RpbWVfdHEpOworICAgICAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJnN0YXRpY19yZWcsIGVwb25fbGluaywgc3RhdGljX3JlZ2lzdHJhdGlvbiwgbGFzZXJvZmZfdGltZV90cSwgaW5kLT5kYXRhLmxpbmtfaW5mby5vbnVfbGFzZXJfb2ZmX3RpbWVfdHEpOworICAgICAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJnN0YXRpY19yZWcsIGVwb25fbGluaywgc3RhdGljX3JlZ2lzdHJhdGlvbiwgcmFuZ2VfdmFsdWVfdHEsIGluZC0+ZGF0YS5saW5rX2luZm8ucmFuZ2VfdmFsdWVfdHEpOworICAgICAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJnN0YXRpY19yZWcsIGVwb25fbGluaywgc3RhdGljX3JlZ2lzdHJhdGlvbiwgcGVuZGluZ19ncmFudHMsIGluZC0+ZGF0YS5saW5rX2luZm8ucGVuZGluZ19ncmFudHMpOworICAgICAgICAgICAgcmVzdWx0ID0gYmNtb2x0X29wZXJfc3VibWl0KHBhcnRuZXIuZGV2aWNlX2lkLCAmc3RhdGljX3JlZy5oZHIpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBCQ01fRVJSX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBTX0VSUigiU3RhdGljIHJlZ2lzdHJhdGlvbiBmYWlsZWQgJWRcbiIsIHJlc3VsdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUFNfSU5GTygiU3RhdGljIHJlZ2lzdHJhdGlvbiBzdWNjZXNzXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFBTX0VSUigiQWRkIHByb3RlY3RlZCBzdGFuZGJ5IGZhaWxlZCAlZFxuIiwgcmVzdWx0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gcHNfcHJvY2Vzc19pbmRfZXBvbihjb25zdCBiY21vbHRfcHNfcG9uICpwb24sIGNvbnN0IGJjbW9sdF9hdXRvICppbmQpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworICAgIGJjbW9sdF9wc19nbG9iYWxfY2ZnIGdsb2JhbF9jZmc7CisKKyAgICBlcnIgPSBiY21vbHRfcHNfZ2xvYmFsX2NmZ19nZXQoJmdsb2JhbF9jZmcpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgUFNfSU5GTygicHNfcHJvY2Vzc19pbmRfZXBvbiBUeXBlOiAlZCBDRkdfSUQ6ICVkXG4iLCBpbmQtPmhkci5vYmpfdHlwZSwgaW5kLT5oZHIuc3ViZ3JvdXApOworICAgIHN3aXRjaCAoaW5kLT5oZHIub2JqX3R5cGUpCisgICAgeworICAgIGNhc2UgQkNNT0xUX09CSl9JRF9FUE9OX05JOgorICAgICAgICBzd2l0Y2ggKGluZC0+aGRyLnN1Ymdyb3VwKQorICAgICAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0VQT05fTklfQVVUT19DRkdfSURfTk9fUkVQT1JUUzoKKyAgICAgICAgICAgIHJldHVybiBwc19oYW5kbGVfbmlfbm9fcmVwb3J0cygmZ2xvYmFsX2NmZywgcG9uLCAoKGNvbnN0IGJjbW9sdF9lcG9uX25pX25vX3JlcG9ydHMgKilpbmQpKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICB9CisgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0VQT05fTElOSzoKKyAgICAgICAgc3dpdGNoIChpbmQtPmhkci5zdWJncm91cCkKKyAgICAgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9FUE9OX0xJTktfQVVUT19DRkdfSURfTVBDUF9ESVNDT1ZFUkVEOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9sb2dpY2FsX2xpbmtfZGlzY292ZXJlZCgmZ2xvYmFsX2NmZywgcG9uLCAoKGNvbnN0IGJjbW9sdF9lcG9uX2xpbmtfbXBjcF9kaXNjb3ZlcmVkICopaW5kKSk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19lcnJubyBwc19tb3ZlX3RvX3N0YW5kYnlfZXBvbihjb25zdCBiY21vbHRfcHNfcG9uICpwb24pCit7CisgICAgYmNtb2x0X2Vwb25fbmlfc2V0X2Vwb25fbmlfZW5fc3RhdGUgc2V0X3Bvbl9zdGF0ZTsgCisgICAgYmNtb2x0X2Vwb25fbmlfa2V5IGtleSA9IHt9OworICAgIGtleS5lcG9uX25pID0gcG9uLT5wb25faWQ7CisKKyAgICBCQ01PTFRfT1BFUl9JTklUKCZzZXRfcG9uX3N0YXRlLCBlcG9uX25pLCBzZXRfZXBvbl9uaV9lbl9zdGF0ZSwga2V5KTsKKyAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmc2V0X3Bvbl9zdGF0ZSwgZXBvbl9uaSwgc2V0X2Vwb25fbmlfZW5fc3RhdGUsIG5ld19zdGF0ZSwgQkNNT0xUX0VQT05fTklfRU5fU1RBVEVfUFJPVEVDVEVEX1NUQU5EQlkpOworICAgIHJldHVybiBiY21vbHRfb3Blcl9zdWJtaXQocG9uLT5kZXZpY2VfaWQsICZzZXRfcG9uX3N0YXRlLmhkcik7Cit9CisKK2JjbW9zX2Vycm5vIHBzX21vdmVfdG9fd29ya2luZ19lcG9uKGNvbnN0IGJjbW9sdF9wc19wb24gKnBvbikKK3sKKyAgICBiY21vbHRfZXBvbl9uaV9zZXRfZXBvbl9uaV9lbl9zdGF0ZSBzZXRfcG9uX3N0YXRlOworICAgIGJjbW9sdF9lcG9uX25pX2tleSBrZXkgPSB7fTsKKyAgICBrZXkuZXBvbl9uaSA9IHBvbi0+cG9uX2lkOworCisgICAgQkNNT0xUX09QRVJfSU5JVCgmc2V0X3Bvbl9zdGF0ZSwgZXBvbl9uaSwgc2V0X2Vwb25fbmlfZW5fc3RhdGUsIGtleSk7CisgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJnNldF9wb25fc3RhdGUsIGVwb25fbmksIHNldF9lcG9uX25pX2VuX3N0YXRlLCBuZXdfc3RhdGUsIEJDTU9MVF9FUE9OX05JX0VOX1NUQVRFX1BST1RFQ1RFRF9XT1JLSU5HKTsKKyAgICByZXR1cm4gYmNtb2x0X29wZXJfc3VibWl0KHBvbi0+ZGV2aWNlX2lkLCAmc2V0X3Bvbl9zdGF0ZS5oZHIpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvcHJvdGVjdGlvbl9zd2l0Y2hpbmcvYmNtb2x0X3VzZXJfYXBwbF9wc19ncG9uLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3Byb3RlY3Rpb25fc3dpdGNoaW5nL2JjbW9sdF91c2VyX2FwcGxfcHNfZ3Bvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0M2U3ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3Byb3RlY3Rpb25fc3dpdGNoaW5nL2JjbW9sdF91c2VyX2FwcGxfcHNfZ3Bvbi5jCkBAIC0wLDAgKzEsODc4IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyovCisKKyNpbmNsdWRlIDxiY21vbHRfaG9zdF9hcGkuaD4KKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX3BzLmgiCisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9wc19pbnRlcm5hbC5oIgorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfaGFuZGxlX25pX2xvcygKKyAgICBjb25zdCBiY21vbHRfcHNfZ2xvYmFsX2NmZyAqZ2xvYmFsX2NmZywKKyAgICBjb25zdCBiY21vbHRfcHNfcG9uICpwb24sCisgICAgY29uc3QgYmNtb2x0X2dwb25fbmlfbG9zICppbmQpCit7CisgICAgaWYgKGluZC0+ZGF0YS5zdGF0dXMgPT0gQkNNT0xUX1NUQVRVU19PRkYpCisgICAgeworICAgICAgICBQU19JTkZPKCI8JWQ6JWQ+IExvUyBhbGFybSBjbGVhcmVkXG4iLCBwb24tPmRldmljZV9pZCwgcG9uLT5wb25faWQpOworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisKKyAgICBQU19JTkZPKCI8JWQ6JWQ+IExvUyBhbGFybSByYWlzZWRcbiIsIHBvbi0+ZGV2aWNlX2lkLCBwb24tPnBvbl9pZCk7CisKKyAgICBpZiAoZ2xvYmFsX2NmZy0+c3dpdGNoX2NvbmRpdGlvbiA9PSBCQ01PTFRfUFNfU1dJVENIX0NPTkRJVElPTl9NQU5VQUwpCisgICAgeworICAgICAgICAvKiBkb24ndCByZWFjdCB0byB0aGUgc3dpdGNoIGlmIHdlJ3JlIGluIG1hbnVhbCBzd2l0Y2ggbW9kZSAqLworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIGJjbW9sdF9wc19zd2l0Y2hfcGVyZm9ybShwb24pOworICAgIH0KK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9uaV9zdGF0ZV9jaGFuZ2VkKAorICAgIGNvbnN0IGJjbW9sdF9wc19wb24gKnBhcnRuZXIsCisgICAgY29uc3QgYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCAqaW5kKQoreworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7IHBhcnRuZXItPnBvbl9pZCB9OworICAgIGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGUgb3BlcjsKKworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGdwb25fbmksIHNldF9wb25fc3RhdGUsIGtleSk7CisKKyAgICBpZiAoaW5kLT5kYXRhLnByZXZpb3VzX3N0YXRlID09IEJDTU9MVF9QT05fU1RBVEVfSU5BQ1RJVkUgJiYKKyAgICAgICAgaW5kLT5kYXRhLm5ld19zdGF0ZSA9PSBCQ01PTFRfUE9OX1NUQVRFX0FDVElWRV9XT1JLSU5HKQorICAgIHsKKyAgICAgICAgUFNfSU5GTygiJXM6IGFjdGl2YXRpbmcgUE9OIDwlZDolZD5cbiIsIF9fRlVOQ1RJT05fXywgcGFydG5lci0+ZGV2aWNlX2lkLCBrZXkucG9uX25pKTsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25fbmksIHNldF9wb25fc3RhdGUsIHBvbl9zdGF0ZSwgQkNNT0xUX1BPTl9PUEVSQVRJT05fQUNUSVZFX1NUQU5EQlkpOworICAgIH0KKyAgICBlbHNlIGlmIChpbmQtPmRhdGEucHJldmlvdXNfc3RhdGUgPT0gQkNNT0xUX1BPTl9TVEFURV9BQ1RJVkVfV09SS0lORyAmJgorICAgICAgICBpbmQtPmRhdGEubmV3X3N0YXRlID09IEJDTU9MVF9QT05fU1RBVEVfSU5BQ1RJVkUpCisgICAgeworICAgICAgICBQU19JTkZPKCIlczogZGVhY3RpdmF0aW5nIFBPTiA8JWQ6JWQ+XG4iLCBfX0ZVTkNUSU9OX18sIHBhcnRuZXItPmRldmljZV9pZCwga2V5LnBvbl9uaSk7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX25pLCBzZXRfcG9uX3N0YXRlLCBwb25fc3RhdGUsIEJDTU9MVF9QT05fT1BFUkFUSU9OX0lOQUNUSVZFKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogb25seSBjaGFuZ2UgdGhlIHN0YW5kYnkgUE9OJ3Mgc3RhdGUgaWYgd2UncmUgcHJlLXByb3Zpc2lvbmluZyB0aGUgd29ya2luZyBQT04KKyAgICAgICAgICAodGhlIHN3aXRjaG92ZXIgaXMgaGFuZGxlZCBzZXBhcmF0ZWx5KSAqLworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisKKyAgICByZXR1cm4gYmNtb2x0X29wZXJfc3VibWl0KHBhcnRuZXItPmRldmljZV9pZCwgJm9wZXIuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9uaV90cmFmZmljX3Jlc3VtZSgKKyAgICBjb25zdCBiY21vbHRfcHNfcG9uICpwb24sCisgICAgY29uc3QgYmNtb2x0X2dwb25fbmlfcHJvdGVjdGlvbl9zd2l0Y2hpbmdfdHJhZmZpY19yZXN1bWUgKmluZCkKK3sKKyAgICB1aW50MzJfdCBhZnRlcl91cyAgPSBiY21vc190aW1lc3RhbXAoKTsKKyAgICB1aW50MzJfdCBiZWZvcmVfdXMgPSBwc19nZXRfbGFzdF9zd2l0Y2hfc3RhcnRfdGltZV91cygpOworICAgIHVpbnQzMl90IHRpbWVfdGFrZW5fdXMgPSAoYWZ0ZXJfdXMgPiBiZWZvcmVfdXMpID8gYWZ0ZXJfdXMgLSBiZWZvcmVfdXMgOiBiZWZvcmVfdXMgLSBhZnRlcl91czsKKyAgICBjb25zdCBjaGFyICp0cmFmZmljX3Jlc3VtZV9yZXN1bHRfc3RyID0gTlVMTDsKKworICAgIHN3aXRjaCAoaW5kLT5kYXRhLnJlc3VsdCkKKyAgICB7CisgICAgY2FzZSBCQ01PTFRfVFJBRkZJQ19SRVNVTUVfUkVTVUxUX1NVQ0NFU1M6CisgICAgICAgIHRyYWZmaWNfcmVzdW1lX3Jlc3VsdF9zdHIgPSAic3VjY2VzcyI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkNNT0xUX1RSQUZGSUNfUkVTVU1FX1JFU1VMVF9GQUlMVVJFOgorICAgICAgICB0cmFmZmljX3Jlc3VtZV9yZXN1bHRfc3RyID0gImZhaWx1cmUiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJDTU9MVF9UUkFGRklDX1JFU1VNRV9SRVNVTFRfU1VTUEVDVEVEX0xPUzoKKyAgICAgICAgdHJhZmZpY19yZXN1bWVfcmVzdWx0X3N0ciA9ICJzdXNwZWN0ZWRfbG9zIjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgUFNfSU5GTygKKyAgICAgICAgIjwlZDolZD4gVHJhZmZpYyByZXN1bWUgJXMuIFRpbWUgc2luY2Ugc3RhcnQgb2Ygc3dpdGNoOiAlZCBtcy5cbiIsCisgICAgICAgIHBvbi0+ZGV2aWNlX2lkLAorICAgICAgICBwb24tPnBvbl9pZCwKKyAgICAgICAgdHJhZmZpY19yZXN1bWVfcmVzdWx0X3N0ciwKKyAgICAgICAgdGltZV90YWtlbl91cyAvIDEwMDApOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfbmlfb251c19yYW5nZWQoCisgICAgY29uc3QgYmNtb2x0X3BzX3BvbiAqcGFydG5lciwKKyAgICBjb25zdCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCAqaW5kKQoreworICAgIHVpbnQzMl90IGk7CisgICAgYmNtb3NfZXJybm8gbGFzdF9lcnIgPSBCQ01fRVJSX09LOworCisgICAgLyogYXBwbHkgYWxsIG9mIHRoZSBuZXcgT05VIEVRRHMgdG8gdGhlIHN0YW5kYnkgUE9OICovCisgICAgZm9yIChpID0gMDsgaSA8IGluZC0+ZGF0YS5vbnVzLmxlbjsgaSsrKQorICAgIHsKKyAgICAgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7IHBhcnRuZXItPnBvbl9pZCwgaW5kLT5kYXRhLm9udXMudmFsW2ldLm9udV9pZCB9OworICAgICAgICBiY21vbHRfZ3Bvbl9vbnVfY2ZnIGNmZzsKKyAgICAgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgICAgIFBTX0lORk8oCisgICAgICAgICAgICAiJXM6IHVwZGF0aW5nIEVRRCA8JWQ6JWQ+IE9OVSAlZCAtPiAlZFxuIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgIHBhcnRuZXItPmRldmljZV9pZCwKKyAgICAgICAgICAgIGtleS5wb25fbmksCisgICAgICAgICAgICBrZXkub251X2lkLAorICAgICAgICAgICAgaW5kLT5kYXRhLm9udXMudmFsW2ldLmVxZCk7CisKKyAgICAgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fb251LCBrZXkpOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCByYW5naW5nX3RpbWUsIGluZC0+ZGF0YS5vbnVzLnZhbFtpXS5lcWQpOworICAgICAgICBlcnIgPSBiY21vbHRfY2ZnX3NldChwYXJ0bmVyLT5kZXZpY2VfaWQsICZjZmcuaGRyKTsKKyAgICAgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICBQU19FUlIoIkVRRCB1cGRhdGUgZmFpbGVkOiAlc1xuIiwgYmNtb3Nfc3RyZXJyb3IoZXJyKSk7CisgICAgICAgICAgICBsYXN0X2VyciA9IGVycjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBsYXN0X2VycjsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9vbnVfcmFuZ2luZ19jb21wbGV0ZWQoCisgICAgY29uc3QgYmNtb2x0X3BzX3BvbiAqcGFydG5lciwKKyAgICBjb25zdCBiY21vbHRfZ3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWQgKmluZCkKK3sKKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsgcGFydG5lci0+cG9uX2lkLCBpbmQtPmtleS5vbnVfaWQgfTsKKyAgICBiY21vbHRfZ3Bvbl9vbnVfY2ZnIGNmZzsKKworICAgIC8qIG9ubHkgcmVhY3QgdG8gc3VjY2VzcyBpbmRpY2F0aW9ucyAqLworICAgIGlmIChpbmQtPmRhdGEuc3RhdHVzICE9IEJDTU9MVF9SRVNVTFRfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKworICAgIFBTX0lORk8oCisgICAgICAgICIlczogdXBkYXRpbmcgRVFEIDwlZDolZD4gT05VICVkIC0+ICVkXG4iLAorICAgICAgICBfX0ZVTkNUSU9OX18sCisgICAgICAgIHBhcnRuZXItPmRldmljZV9pZCwKKyAgICAgICAga2V5LnBvbl9uaSwKKyAgICAgICAga2V5Lm9udV9pZCwKKyAgICAgICAgaW5kLT5kYXRhLmVxZCk7CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9vbnUsIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgcmFuZ2luZ190aW1lLCBpbmQtPmRhdGEuZXFkKTsKKyAgICByZXR1cm4gYmNtb2x0X2NmZ19zZXQocGFydG5lci0+ZGV2aWNlX2lkLCAmY2ZnLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWQoCisgICAgY29uc3QgYmNtb2x0X3BzX3BvbiAqcGFydG5lciwKKyAgICBjb25zdCBiY21vbHRfZ3Bvbl9vbnVfa2V5X2V4Y2hhbmdlX2NvbXBsZXRlZCAqaW5kKQoreworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0geyBwYXJ0bmVyLT5wb25faWQsIGluZC0+a2V5Lm9udV9pZCB9OworICAgIGJjbW9sdF9ncG9uX29udV9jZmcgY2ZnOworCisgICAgUFNfSU5GTygiJXM6IHVwZGF0aW5nIEFFUyBrZXkgPCVkOiVkPiBPTlUgJWRcbiIsIF9fRlVOQ1RJT05fXywgcGFydG5lci0+ZGV2aWNlX2lkLCBrZXkucG9uX25pLCBrZXkub251X2lkKTsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX29udSwga2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBhZXNfZW5jcnlwdGlvbl9rZXksIGluZC0+ZGF0YS5uZXdfa2V5KTsKKyAgICByZXR1cm4gYmNtb2x0X2NmZ19zZXQocGFydG5lci0+ZGV2aWNlX2lkLCAmY2ZnLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfb251X3Bhc3N3b3JkX2F1dGhlbnRpY2F0aW9uX2NvbXBsZXRlZCgKKyAgICBjb25zdCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyLAorICAgIGNvbnN0IGJjbW9sdF9ncG9uX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWQgKmluZCkKK3sKKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsgcGFydG5lci0+cG9uX2lkLCBpbmQtPmtleS5vbnVfaWQgfTsKKyAgICBiY21vbHRfZ3Bvbl9vbnVfY2ZnIGNmZzsKKworICAgIC8qIG9ubHkgcmVhY3QgdG8gc3VjY2VzcyBpbmRpY2F0aW9ucyAqLworICAgIGlmIChpbmQtPmRhdGEuc3RhdHVzICE9IEJDTU9MVF9SRVNVTFRfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKworICAgIFBTX0lORk8oIiVzOiB1cGRhdGluZyBwYXNzd29yZCA8JWQ6JWQ+IE9OVSAlZFxuIiwgX19GVU5DVElPTl9fLCBwYXJ0bmVyLT5kZXZpY2VfaWQsIGtleS5wb25fbmksIGtleS5vbnVfaWQpOworCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fb251LCBrZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIHBhc3N3b3JkLCBpbmQtPmRhdGEucGFzc3dvcmQpOworICAgIHJldHVybiBiY21vbHRfY2ZnX3NldChwYXJ0bmVyLT5kZXZpY2VfaWQsICZjZmcuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQoCisgICAgY29uc3QgYmNtb2x0X3BzX3BvbiAqcGFydG5lciwKKyAgICBjb25zdCBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkICppbmQpCit7CisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7IHBhcnRuZXItPnBvbl9pZCwgaW5kLT5rZXkub251X2lkIH07CisgICAgYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGUgb3BlcjsKKworICAgIC8qIG9ubHkgcmVhY3QgdG8gc3VjY2VzcyBpbmRpY2F0aW9ucyAqLworICAgIGlmIChpbmQtPmRhdGEuc3RhdHVzICE9IEJDTU9MVF9SRVNVTFRfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKworICAgIFBTX0lORk8oIiVzOiBhY3RpdmF0aW5nIDwlZDolZD4gT05VICVkXG4iLCBfX0ZVTkNUSU9OX18sIHBhcnRuZXItPmRldmljZV9pZCwga2V5LnBvbl9uaSwga2V5Lm9udV9pZCk7CisKKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX29udSwgc2V0X29udV9zdGF0ZSwga2V5KTsKKyAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9vbnUsIHNldF9vbnVfc3RhdGUsIG9udV9zdGF0ZSwgQkNNT0xUX09OVV9PUEVSQVRJT05fQUNUSVZFKTsKKyAgICByZXR1cm4gYmNtb2x0X29wZXJfc3VibWl0KHBhcnRuZXItPmRldmljZV9pZCwgJm9wZXIuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCgKKyAgICBjb25zdCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyLAorICAgIGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCAqaW5kKQoreworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0geyBwYXJ0bmVyLT5wb25faWQsIGluZC0+a2V5Lm9udV9pZCB9OworICAgIGJjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlIG9wZXI7CisKKyAgICAvKiBOb3RlOiB3ZSByZWFjdCB0byB0aGlzIGluZGljYXRpb24gd2hldGhlciBvciBub3QgdGhlIGRlYWN0aXZhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4gIEZhaWx1cmUgaW5kaWNhdGVzIHRoYXQgdGhlCisgICAgICogT05VIGRpZG4ndCByZXNwb25kIHRvIHRoZSBkZWFjdGl2YXRpb24sIGJ1dCB3ZSBzdGlsbCByZW1vdmUgdGhlIE9OVSBmcm9tIE9MVCBoYXJkd2FyZSBzbyBpdCBtdXN0IGJlIG1pcnJvcmVkLiAqLworCisgICAgUFNfSU5GTygiJXM6IGRlYWN0aXZhdGluZyA8JWQ6JWQ+IE9OVSAlZFxuIiwgX19GVU5DVElPTl9fLCBwYXJ0bmVyLT5kZXZpY2VfaWQsIGtleS5wb25fbmksIGtleS5vbnVfaWQpOworCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgZ3Bvbl9vbnUsIHNldF9vbnVfc3RhdGUsIGtleSk7CisgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25fb251LCBzZXRfb251X3N0YXRlLCBvbnVfc3RhdGUsIEJDTU9MVF9PTlVfT1BFUkFUSU9OX0lOQUNUSVZFKTsKKyAgICByZXR1cm4gYmNtb2x0X29wZXJfc3VibWl0KHBhcnRuZXItPmRldmljZV9pZCwgJm9wZXIuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9vbnVfZW5hYmxlX2NvbXBsZXRlZCgKKyAgICBjb25zdCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyLAorICAgIGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZCAqaW5kKQoreworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0geyBwYXJ0bmVyLT5wb25faWQsIGluZC0+a2V5Lm9udV9pZCB9OworICAgIGJjbW9sdF9ncG9uX29udV9zZXRfb251X3N0YXRlIG9wZXI7CisKKyAgICAvKiBkb24ndCB0cnkgdG8gbWlycm9yIGJyb2FkY2FzdCBlbmFibGUvZGlzYWJsZSAqLworICAgIGlmIChrZXkub251X2lkID09IEJDTU9MVF9HUE9OX09OVV9JRF9JTlZBTElEKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgUFNfSU5GTygiJXM6IGVuYWJsaW5nIDwlZDolZD4gT05VICVkXG4iLCBfX0ZVTkNUSU9OX18sIHBhcnRuZXItPmRldmljZV9pZCwga2V5LnBvbl9uaSwga2V5Lm9udV9pZCk7CisKKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX29udSwgc2V0X29udV9zdGF0ZSwga2V5KTsKKyAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9vbnUsIHNldF9vbnVfc3RhdGUsIG9udV9zdGF0ZSwgQkNNT0xUX09OVV9PUEVSQVRJT05fRU5BQkxFKTsKKyAgICByZXR1cm4gYmNtb2x0X29wZXJfc3VibWl0KHBhcnRuZXItPmRldmljZV9pZCwgJm9wZXIuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9vbnVfZGlzYWJsZV9jb21wbGV0ZWQoCisgICAgY29uc3QgYmNtb2x0X3BzX3BvbiAqcGFydG5lciwKKyAgICBjb25zdCBiY21vbHRfZ3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkICppbmQpCit7CisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7IHBhcnRuZXItPnBvbl9pZCwgaW5kLT5rZXkub251X2lkIH07CisgICAgYmNtb2x0X2dwb25fb251X3NldF9vbnVfc3RhdGUgb3BlcjsKKworICAgIC8qIGRvbid0IHRyeSB0byBtaXJyb3IgYnJvYWRjYXN0IGVuYWJsZS9kaXNhYmxlICovCisgICAgaWYgKGtleS5vbnVfaWQgPT0gQkNNT0xUX0dQT05fT05VX0lEX0lOVkFMSUQpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisKKyAgICBQU19JTkZPKCIlczogZGlzYWJsaW5nIDwlZDolZD4gT05VICVkXG4iLCBfX0ZVTkNUSU9OX18sIHBhcnRuZXItPmRldmljZV9pZCwga2V5LnBvbl9uaSwga2V5Lm9udV9pZCk7CisKKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX29udSwgc2V0X29udV9zdGF0ZSwga2V5KTsKKyAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9vbnUsIHNldF9vbnVfc3RhdGUsIG9udV9zdGF0ZSwgQkNNT0xUX09OVV9PUEVSQVRJT05fRElTQUJMRSk7CisgICAgcmV0dXJuIGJjbW9sdF9vcGVyX3N1Ym1pdChwYXJ0bmVyLT5kZXZpY2VfaWQsICZvcGVyLmhkcik7Cit9CisKK3N0YXRpYyB2b2lkIHBzX2FsYXJtX3N0YXRlX2luaXQoYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlICphbGFybV9zdGF0ZSkKK3sKKyAgICBhbGFybV9zdGF0ZS0+bG9zaSA9IEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOworICAgIGFsYXJtX3N0YXRlLT5sb2ZpID0gQkNNT0xUX1NUQVRVU19OT19DSEFOR0U7CisgICAgYWxhcm1fc3RhdGUtPmxvYW1pID0gQkNNT0xUX1NUQVRVU19OT19DSEFOR0U7CisgICAgYWxhcm1fc3RhdGUtPmRnaSA9IEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOworICAgIGFsYXJtX3N0YXRlLT50aXdpID0gQkNNT0xUX1NUQVRVU19OT19DSEFOR0U7CisgICAgYWxhcm1fc3RhdGUtPmRvd2kgPSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRTsKKyAgICBhbGFybV9zdGF0ZS0+c3VmaSA9IEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOworICAgIGFsYXJtX3N0YXRlLT5zZmkgPSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRTsKKyAgICBhbGFybV9zdGF0ZS0+c2RpID0gQkNNT0xUX1NUQVRVU19OT19DSEFOR0U7CisgICAgYWxhcm1fc3RhdGUtPmRmaSA9IEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOworICAgIGFsYXJtX3N0YXRlLT5sb2FpID0gQkNNT0xUX1NUQVRVU19OT19DSEFOR0U7CisgICAgYWxhcm1fc3RhdGUtPmxva2kgPSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9vbnVfYWxhcm0oY29uc3QgYmNtb2x0X3BzX3BvbiAqcGFydG5lciwgY29uc3QgYmNtb2x0X2dwb25fb251X29udV9hbGFybSAqaW5kKQoreworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0geyBwYXJ0bmVyLT5wb25faWQsIGluZC0+a2V5Lm9udV9pZCB9OworICAgIGJjbW9sdF9ncG9uX29udV9jZmcgY2ZnOworICAgIGJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZSBhbGFybV9zdGF0ZTsKKworICAgIHBzX2FsYXJtX3N0YXRlX2luaXQoJmFsYXJtX3N0YXRlKTsKKyAgICBhbGFybV9zdGF0ZS5sb3NpID0gaW5kLT5kYXRhLm9udV9hbGFybS5sb3NpOworICAgIGFsYXJtX3N0YXRlLmxvZmkgPSBpbmQtPmRhdGEub251X2FsYXJtLmxvZmk7CisgICAgYWxhcm1fc3RhdGUubG9hbWkgPSBpbmQtPmRhdGEub251X2FsYXJtLmxvYW1pOworICAgIAorICAgIFBTX0lORk8oCisgICAgICAgICIlczogdXBkYXRpbmcgT05VIGFsYXJtcyA8JWQ6JWQ+IE9OVSAlZCAtPiAlZC8lZC8lZFxuIiwKKyAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICBwYXJ0bmVyLT5kZXZpY2VfaWQsCisgICAgICAgIGtleS5wb25fbmksCisgICAgICAgIGtleS5vbnVfaWQsCisgICAgICAgIGFsYXJtX3N0YXRlLmxvc2ksCisgICAgICAgIGFsYXJtX3N0YXRlLmxvZmksCisgICAgICAgIGFsYXJtX3N0YXRlLmxvYW1pKTsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX29udSwga2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBhbGFybV9zdGF0ZSwgYWxhcm1fc3RhdGUpOworICAgIHJldHVybiBiY21vbHRfY2ZnX3NldChwYXJ0bmVyLT5kZXZpY2VfaWQsICZjZmcuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9vbnVfZG93aShjb25zdCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyLCBjb25zdCBiY21vbHRfZ3Bvbl9vbnVfZG93aSAqaW5kKQoreworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0geyBwYXJ0bmVyLT5wb25faWQsIGluZC0+a2V5Lm9udV9pZCB9OworICAgIGJjbW9sdF9ncG9uX29udV9jZmcgY2ZnOworICAgIGJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZSBhbGFybV9zdGF0ZTsKKworICAgIFBTX0lORk8oCisgICAgICAgICIlczogdXBkYXRpbmcgRE9XaSA8JWQ6JWQ+IE9OVSAlZCAtPiAlZCAoRVFEICVkKVxuIiwKKyAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICBwYXJ0bmVyLT5kZXZpY2VfaWQsCisgICAgICAgIGtleS5wb25fbmksCisgICAgICAgIGtleS5vbnVfaWQsCisgICAgICAgIGluZC0+ZGF0YS5hbGFybV9zdGF0dXMsCisgICAgICAgIGluZC0+ZGF0YS5uZXdfZXFkKTsKKworICAgIHBzX2FsYXJtX3N0YXRlX2luaXQoJmFsYXJtX3N0YXRlKTsKKyAgICBhbGFybV9zdGF0ZS5kb3dpID0gaW5kLT5kYXRhLmFsYXJtX3N0YXR1czsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX29udSwga2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBhbGFybV9zdGF0ZSwgYWxhcm1fc3RhdGUpOworCisgICAgaWYgKGluZC0+ZGF0YS5hbGFybV9zdGF0dXMgPT0gQkNNT0xUX1NUQVRVU19PTikKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIHJhbmdpbmdfdGltZSwgaW5kLT5kYXRhLm5ld19lcWQpOworICAgIH0KKworICAgIHJldHVybiBiY21vbHRfY2ZnX3NldChwYXJ0bmVyLT5kZXZpY2VfaWQsICZjZmcuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9vbnVfc2ZpKGNvbnN0IGJjbW9sdF9wc19wb24gKnBhcnRuZXIsIGNvbnN0IGJjbW9sdF9ncG9uX29udV9zZmkgKmluZCkKK3sKKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsgcGFydG5lci0+cG9uX2lkLCBpbmQtPmtleS5vbnVfaWQgfTsKKyAgICBiY21vbHRfZ3Bvbl9vbnVfY2ZnIGNmZzsKKyAgICBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGUgYWxhcm1fc3RhdGU7CisKKyAgICBQU19JTkZPKAorICAgICAgICAiJXM6IHVwZGF0aW5nIFNGSSA8JWQ6JWQ+IE9OVSAlZCAtPiAlZFxuIiwKKyAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICBwYXJ0bmVyLT5kZXZpY2VfaWQsCisgICAgICAgIGtleS5wb25fbmksCisgICAgICAgIGtleS5vbnVfaWQsCisgICAgICAgIGluZC0+ZGF0YS5hbGFybV9zdGF0dXMpOworCisgICAgcHNfYWxhcm1fc3RhdGVfaW5pdCgmYWxhcm1fc3RhdGUpOworICAgIGFsYXJtX3N0YXRlLnNmaSA9IGluZC0+ZGF0YS5hbGFybV9zdGF0dXM7CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9vbnUsIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgYWxhcm1fc3RhdGUsIGFsYXJtX3N0YXRlKTsKKyAgICByZXR1cm4gYmNtb2x0X2NmZ19zZXQocGFydG5lci0+ZGV2aWNlX2lkLCAmY2ZnLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfb251X3NkaShjb25zdCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyLCBjb25zdCBiY21vbHRfZ3Bvbl9vbnVfc2RpICppbmQpCit7CisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7IHBhcnRuZXItPnBvbl9pZCwgaW5kLT5rZXkub251X2lkIH07CisgICAgYmNtb2x0X2dwb25fb251X2NmZyBjZmc7CisgICAgYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlIGFsYXJtX3N0YXRlOworCisgICAgUFNfSU5GTygKKyAgICAgICAgIiVzOiB1cGRhdGluZyBTRGkgPCVkOiVkPiBPTlUgJWQgLT4gJWRcbiIsCisgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgcGFydG5lci0+ZGV2aWNlX2lkLAorICAgICAgICBrZXkucG9uX25pLAorICAgICAgICBrZXkub251X2lkLAorICAgICAgICBpbmQtPmRhdGEuYWxhcm1fc3RhdHVzKTsKKworICAgIHBzX2FsYXJtX3N0YXRlX2luaXQoJmFsYXJtX3N0YXRlKTsKKyAgICBhbGFybV9zdGF0ZS5zZGkgPSBpbmQtPmRhdGEuYWxhcm1fc3RhdHVzOworCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fb251LCBrZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIGFsYXJtX3N0YXRlLCBhbGFybV9zdGF0ZSk7CisgICAgcmV0dXJuIGJjbW9sdF9jZmdfc2V0KHBhcnRuZXItPmRldmljZV9pZCwgJmNmZy5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfaGFuZGxlX29udV9kZmkoY29uc3QgYmNtb2x0X3BzX3BvbiAqcGFydG5lciwgY29uc3QgYmNtb2x0X2dwb25fb251X2RmaSAqaW5kKQoreworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0geyBwYXJ0bmVyLT5wb25faWQsIGluZC0+a2V5Lm9udV9pZCB9OworICAgIGJjbW9sdF9ncG9uX29udV9jZmcgY2ZnOworICAgIGJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZSBhbGFybV9zdGF0ZTsKKworICAgIFBTX0lORk8oCisgICAgICAgICIlczogdXBkYXRpbmcgREZpIDwlZDolZD4gT05VICVkIC0+ICVkXG4iLAorICAgICAgICBfX0ZVTkNUSU9OX18sCisgICAgICAgIHBhcnRuZXItPmRldmljZV9pZCwKKyAgICAgICAga2V5LnBvbl9uaSwKKyAgICAgICAga2V5Lm9udV9pZCwKKyAgICAgICAgaW5kLT5kYXRhLmFsYXJtX3N0YXR1cyk7CisKKyAgICBwc19hbGFybV9zdGF0ZV9pbml0KCZhbGFybV9zdGF0ZSk7CisgICAgYWxhcm1fc3RhdGUuZGZpID0gaW5kLT5kYXRhLmFsYXJtX3N0YXR1czsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX29udSwga2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBhbGFybV9zdGF0ZSwgYWxhcm1fc3RhdGUpOworICAgIHJldHVybiBiY21vbHRfY2ZnX3NldChwYXJ0bmVyLT5kZXZpY2VfaWQsICZjZmcuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9vbnVfc3VmaShjb25zdCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyLCBjb25zdCBiY21vbHRfZ3Bvbl9vbnVfc3VmaSAqaW5kKQoreworICAgIGJjbW9sdF9ncG9uX29udV9rZXkga2V5ID0geyBwYXJ0bmVyLT5wb25faWQsIGluZC0+a2V5Lm9udV9pZCB9OworICAgIGJjbW9sdF9ncG9uX29udV9jZmcgY2ZnOworICAgIGJjbW9sdF9ncG9uX29udV9hbGFybV9zdGF0ZSBhbGFybV9zdGF0ZTsKKworICAgIFBTX0lORk8oCisgICAgICAgICIlczogdXBkYXRpbmcgU1VGaSA8JWQ6JWQ+IE9OVSAlZCAtPiAlZFxuIiwKKyAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICBwYXJ0bmVyLT5kZXZpY2VfaWQsCisgICAgICAgIGtleS5wb25fbmksCisgICAgICAgIGtleS5vbnVfaWQsCisgICAgICAgIGluZC0+ZGF0YS5hbGFybV9zdGF0dXMpOworCisgICAgcHNfYWxhcm1fc3RhdGVfaW5pdCgmYWxhcm1fc3RhdGUpOworICAgIGFsYXJtX3N0YXRlLnN1ZmkgPSBpbmQtPmRhdGEuYWxhcm1fc3RhdHVzOworCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fb251LCBrZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIGFsYXJtX3N0YXRlLCBhbGFybV9zdGF0ZSk7CisgICAgcmV0dXJuIGJjbW9sdF9jZmdfc2V0KHBhcnRuZXItPmRldmljZV9pZCwgJmNmZy5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfaGFuZGxlX29udV9sb2FpKGNvbnN0IGJjbW9sdF9wc19wb24gKnBhcnRuZXIsIGNvbnN0IGJjbW9sdF9ncG9uX29udV9sb2FpICppbmQpCit7CisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7IHBhcnRuZXItPnBvbl9pZCwgaW5kLT5rZXkub251X2lkIH07CisgICAgYmNtb2x0X2dwb25fb251X2NmZyBjZmc7CisgICAgYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlIGFsYXJtX3N0YXRlOworCisgICAgUFNfSU5GTygKKyAgICAgICAgIiVzOiB1cGRhdGluZyBMT0FpIDwlZDolZD4gT05VICVkIC0+ICVkXG4iLAorICAgICAgICBfX0ZVTkNUSU9OX18sCisgICAgICAgIHBhcnRuZXItPmRldmljZV9pZCwKKyAgICAgICAga2V5LnBvbl9uaSwKKyAgICAgICAga2V5Lm9udV9pZCwKKyAgICAgICAgaW5kLT5kYXRhLmFsYXJtX3N0YXR1cyk7CisKKyAgICBwc19hbGFybV9zdGF0ZV9pbml0KCZhbGFybV9zdGF0ZSk7CisgICAgYWxhcm1fc3RhdGUubG9haSA9IGluZC0+ZGF0YS5hbGFybV9zdGF0dXM7CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9vbnUsIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgYWxhcm1fc3RhdGUsIGFsYXJtX3N0YXRlKTsKKyAgICByZXR1cm4gYmNtb2x0X2NmZ19zZXQocGFydG5lci0+ZGV2aWNlX2lkLCAmY2ZnLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfb251X2RnaShjb25zdCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyLCBjb25zdCBiY21vbHRfZ3Bvbl9vbnVfZGdpICppbmQpCit7CisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7IHBhcnRuZXItPnBvbl9pZCwgaW5kLT5rZXkub251X2lkIH07CisgICAgYmNtb2x0X2dwb25fb251X2NmZyBjZmc7CisgICAgYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlIGFsYXJtX3N0YXRlOworCisgICAgUFNfSU5GTygKKyAgICAgICAgIiVzOiB1cGRhdGluZyBER2kgPCVkOiVkPiBPTlUgJWQgLT4gJWRcbiIsCisgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgcGFydG5lci0+ZGV2aWNlX2lkLAorICAgICAgICBrZXkucG9uX25pLAorICAgICAgICBrZXkub251X2lkLAorICAgICAgICBpbmQtPmRhdGEuYWxhcm1fc3RhdHVzKTsKKworICAgIHBzX2FsYXJtX3N0YXRlX2luaXQoJmFsYXJtX3N0YXRlKTsKKyAgICBhbGFybV9zdGF0ZS5kZ2kgPSBpbmQtPmRhdGEuYWxhcm1fc3RhdHVzOworCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25fb251LCBrZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9vbnUsIGFsYXJtX3N0YXRlLCBhbGFybV9zdGF0ZSk7CisgICAgcmV0dXJuIGJjbW9sdF9jZmdfc2V0KHBhcnRuZXItPmRldmljZV9pZCwgJmNmZy5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfaGFuZGxlX29udV90aXdpKGNvbnN0IGJjbW9sdF9wc19wb24gKnBhcnRuZXIsIGNvbnN0IGJjbW9sdF9ncG9uX29udV90aXdpICppbmQpCit7CisgICAgYmNtb2x0X2dwb25fb251X2tleSBrZXkgPSB7IHBhcnRuZXItPnBvbl9pZCwgaW5kLT5rZXkub251X2lkIH07CisgICAgYmNtb2x0X2dwb25fb251X2NmZyBjZmc7CisgICAgYmNtb2x0X2dwb25fb251X2FsYXJtX3N0YXRlIGFsYXJtX3N0YXRlOworCisgICAgUFNfSU5GTygKKyAgICAgICAgIiVzOiB1cGRhdGluZyBUSVdpIDwlZDolZD4gT05VICVkIC0+ICVkXG4iLAorICAgICAgICBfX0ZVTkNUSU9OX18sCisgICAgICAgIHBhcnRuZXItPmRldmljZV9pZCwKKyAgICAgICAga2V5LnBvbl9uaSwKKyAgICAgICAga2V5Lm9udV9pZCwKKyAgICAgICAgaW5kLT5kYXRhLmFsYXJtX3N0YXR1cyk7CisKKyAgICBwc19hbGFybV9zdGF0ZV9pbml0KCZhbGFybV9zdGF0ZSk7CisgICAgYWxhcm1fc3RhdGUudGl3aSA9IGluZC0+ZGF0YS5hbGFybV9zdGF0dXM7CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgZ3Bvbl9vbnUsIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX29udSwgYWxhcm1fc3RhdGUsIGFsYXJtX3N0YXRlKTsKKyAgICByZXR1cm4gYmNtb2x0X2NmZ19zZXQocGFydG5lci0+ZGV2aWNlX2lkLCAmY2ZnLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfb251X2xva2koY29uc3QgYmNtb2x0X3BzX3BvbiAqcGFydG5lciwgY29uc3QgYmNtb2x0X2dwb25fb251X2xva2kgKmluZCkKK3sKKyAgICBiY21vbHRfZ3Bvbl9vbnVfa2V5IGtleSA9IHsgcGFydG5lci0+cG9uX2lkLCBpbmQtPmtleS5vbnVfaWQgfTsKKyAgICBiY21vbHRfZ3Bvbl9vbnVfY2ZnIGNmZzsKKyAgICBiY21vbHRfZ3Bvbl9vbnVfYWxhcm1fc3RhdGUgYWxhcm1fc3RhdGU7CisKKyAgICBQU19JTkZPKAorICAgICAgICAiJXM6IHVwZGF0aW5nIExPS2kgPCVkOiVkPiBPTlUgJWQgLT4gJWRcbiIsCisgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgcGFydG5lci0+ZGV2aWNlX2lkLAorICAgICAgICBrZXkucG9uX25pLAorICAgICAgICBrZXkub251X2lkLAorICAgICAgICBpbmQtPmRhdGEuYWxhcm1fc3RhdHVzKTsKKworICAgIHBzX2FsYXJtX3N0YXRlX2luaXQoJmFsYXJtX3N0YXRlKTsKKyAgICBhbGFybV9zdGF0ZS5sb2tpID0gaW5kLT5kYXRhLmFsYXJtX3N0YXR1czsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX29udSwga2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25fb251LCBhbGFybV9zdGF0ZSwgYWxhcm1fc3RhdGUpOworICAgIHJldHVybiBiY21vbHRfY2ZnX3NldChwYXJ0bmVyLT5kZXZpY2VfaWQsICZjZmcuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9vbnVfb21jaV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkKAorICAgIGNvbnN0IGJjbW9sdF9wc19wb24gKnBhcnRuZXIsCisgICAgY29uc3QgYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCAqaW5kKQoreworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSBrZXkgPSB7IHBhcnRuZXItPnBvbl9pZCwgaW5kLT5kYXRhLmdlbV9wb3J0IH07CisgICAgYmNtb2x0X2dwb25fZ2VtX3BvcnRfc2V0X3N0YXRlIG9wZXI7CisKKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX2dlbV9wb3J0LCBzZXRfc3RhdGUsIGtleSk7CisKKyAgICBpZiAoaW5kLT5kYXRhLm9wZXJhdGlvbiA9PSBCQ01PTFRfT01DSV9QT1JUX0lEX09QRVJBVElPTl9DT05GSUdVUkUpCisgICAgeworICAgICAgICAvKiBkb24ndCByZWFjdCB0byB1bnN1Y2Nlc3NmdWwgYWN0aXZhdGlvbnMgKi8KKyAgICAgICAgaWYgKGluZC0+ZGF0YS5zdGF0dXMgIT0gQkNNT0xUX1JFU1VMVF9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICAgICAgfQorCisgICAgICAgIFBTX0lORk8oIiVzOiBhY3RpdmF0aW5nIDwlZDolZD4gR0VNIHBvcnQgSUQgJWRcbiIsIF9fRlVOQ1RJT05fXywgcGFydG5lci0+ZGV2aWNlX2lkLCBrZXkucG9uX25pLCBrZXkuZ2VtX3BvcnRfaWQpOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgZ3Bvbl9nZW1fcG9ydCwgc2V0X3N0YXRlLCBzdGF0ZSwgQkNNT0xUX0dFTV9QT1JUX09QRVJBVElPTl9BQ1RJVkFURSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFBTX0lORk8oCisgICAgICAgICAgICAiJXM6IGRlYWN0aXZhdGluZyA8JWQ6JWQ+IEdFTSBwb3J0IElEICVkXG4iLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgcGFydG5lci0+ZGV2aWNlX2lkLAorICAgICAgICAgICAga2V5LnBvbl9uaSwKKyAgICAgICAgICAgIGtleS5nZW1fcG9ydF9pZCk7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX2dlbV9wb3J0LCBzZXRfc3RhdGUsIHN0YXRlLCBCQ01PTFRfR0VNX1BPUlRfT1BFUkFUSU9OX0RFQUNUSVZBVEUpOworICAgIH0KKworICAgIHJldHVybiBiY21vbHRfb3Blcl9zdWJtaXQocGFydG5lci0+ZGV2aWNlX2lkLCAmb3Blci5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfaGFuZGxlX21hY190YWJsZV9uZXdfbWFjKAorICAgIGNvbnN0IGJjbW9sdF9wc19nbG9iYWxfY2ZnICpnbG9iYWxfY2ZnLAorICAgIGNvbnN0IGJjbW9sdF9wc19wb24gKnBhcnRuZXIsCisgICAgY29uc3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjICppbmQpCit7CisgICAgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkga2V5ID0geyBwYXJ0bmVyLT5wb25faWQsIGluZC0+a2V5Lm1hY19hZGRyZXNzLCBpbmQtPmtleS52bGFuIH07CisgICAgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmcgY2ZnOworCisgICAgaWYgKCFnbG9iYWxfY2ZnLT5taXJyb3JfbWFjX2VudHJpZXMpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsgLyogd2UgYXJlIG5vdCBjb25maWd1cmVkIHRvIG1pcnJvciBNQUMgZW50cmllcyAqLworICAgIH0KKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIGZsb3dfaWQsIGluZC0+ZGF0YS5mbG93X2lkKTsKKworICAgIGlmIChnbG9iYWxfY2ZnLT5zdGF0aWNfbWFjX2VudHJpZXMpCisgICAgeworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGdwb25faXdmX21hY190YWJsZSwgc3RhdCwgQkNNT1NfVFJVRSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgZ3Bvbl9pd2ZfbWFjX3RhYmxlLCBzdGF0LCBCQ01PU19GQUxTRSk7CisgICAgfQorCisgICAgcmV0dXJuIGJjbW9sdF9jZmdfc2V0KHBhcnRuZXItPmRldmljZV9pZCwgJmNmZy5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfaGFuZGxlX21hY190YWJsZV9tYWNfYWdlZCgKKyAgICBjb25zdCBiY21vbHRfcHNfZ2xvYmFsX2NmZyAqZ2xvYmFsX2NmZywKKyAgICBjb25zdCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyLAorICAgIGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2FnZWQgKmluZCkKK3sKKyAgICBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2tleSBrZXkgPSB7IHBhcnRuZXItPnBvbl9pZCwgaW5kLT5rZXkubWFjX2FkZHJlc3MsIGluZC0+a2V5LnZsYW4gfTsKKyAgICBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX2NmZyBjZmc7CisKKyAgICBpZiAoIWdsb2JhbF9jZmctPm1pcnJvcl9tYWNfZW50cmllcykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOyAvKiB3ZSBhcmUgbm90IGNvbmZpZ3VyZWQgdG8gbWlycm9yIE1BQyBlbnRyaWVzICovCisgICAgfQorCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIGdwb25faXdmX21hY190YWJsZSwga2V5KTsKKyAgICByZXR1cm4gYmNtb2x0X2NmZ19jbGVhcihwYXJ0bmVyLT5kZXZpY2VfaWQsICZjZmcuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9tYWNfdGFibGVfbWFjX21vdmUoCisgICAgY29uc3QgYmNtb2x0X3BzX2dsb2JhbF9jZmcgKmdsb2JhbF9jZmcsCisgICAgY29uc3QgYmNtb2x0X3BzX3BvbiAqcGFydG5lciwKKyAgICBjb25zdCBiY21vbHRfZ3Bvbl9pd2ZfbWFjX3RhYmxlX21hY19tb3ZlICppbmQpCit7CisgICAgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9rZXkga2V5ID0geyBwYXJ0bmVyLT5wb25faWQsIGluZC0+a2V5Lm1hY19hZGRyZXNzLCBpbmQtPmtleS52bGFuIH07CisgICAgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9jZmcgY2ZnOworCisgICAgaWYgKCFnbG9iYWxfY2ZnLT5taXJyb3JfbWFjX2VudHJpZXMpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsgLyogd2UgYXJlIG5vdCBjb25maWd1cmVkIHRvIG1pcnJvciBNQUMgZW50cmllcyAqLworICAgIH0KKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCBncG9uX2l3Zl9tYWNfdGFibGUsIGZsb3dfaWQsIGluZC0+ZGF0YS5uZXdfZmxvd19pZCk7CisgICAgcmV0dXJuIGJjbW9sdF9jZmdfc2V0KHBhcnRuZXItPmRldmljZV9pZCwgJmNmZy5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfaGFuZGxlX2FsbG9jX2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkKAorICAgIGNvbnN0IGJjbW9sdF9wc19wb24gKnBhcnRuZXIsCisgICAgY29uc3QgYmNtb2x0X2dwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQgKmluZCkKK3sKKyAgICBiY21vbHRfZ3Bvbl9hbGxvY19rZXkga2V5ID0geyBwYXJ0bmVyLT5wb25faWQsIGluZC0+a2V5LmFsbG9jX2lkIH07CisgICAgYmNtb2x0X2dwb25fYWxsb2Nfc2V0X3N0YXRlIG9wZXI7CisKKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCBncG9uX2FsbG9jLCBzZXRfc3RhdGUsIGtleSk7CisKKyAgICBpZiAoaW5kLT5kYXRhLm5ld19zdGF0ZSA9PSBCQ01PTFRfQUxMT0NfU1RBVEVfQUNUSVZFKQorICAgIHsKKyAgICAgICAgLyogZG9uJ3QgcmVhY3QgdG8gdW5zdWNjZXNzZnVsIGFjdGl2YXRpb25zICovCisgICAgICAgIGlmIChpbmQtPmRhdGEuc3RhdHVzICE9IEJDTU9MVF9SRVNVTFRfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgIH0KKworICAgICAgICBQU19JTkZPKCIlczogYWN0aXZhdGluZyA8JWQ6JWQ+IGFsbG9jICVkXG4iLCBfX0ZVTkNUSU9OX18sIHBhcnRuZXItPmRldmljZV9pZCwga2V5LnBvbl9uaSwga2V5LmFsbG9jX2lkKTsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIGdwb25fYWxsb2MsIHNldF9zdGF0ZSwgc3RhdGUsIEJDTU9MVF9BTExPQ19PUEVSQVRJT05fQUNUSVZBVEUpOworICAgIH0KKyAgICBlbHNlIGlmIChpbmQtPmRhdGEubmV3X3N0YXRlID09IEJDTU9MVF9BTExPQ19TVEFURV9JTkFDVElWRSkKKyAgICB7CisgICAgICAgIFBTX0lORk8oIiVzOiBkZWFjdGl2YXRpbmcgPCVkOiVkPiBhbGxvYyAlZFxuIiwgX19GVU5DVElPTl9fLCBwYXJ0bmVyLT5kZXZpY2VfaWQsIGtleS5wb25fbmksIGtleS5hbGxvY19pZCk7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX2FsbG9jLCBzZXRfc3RhdGUsIHN0YXRlLCBCQ01PTFRfQUxMT0NfT1BFUkFUSU9OX0RFQUNUSVZBVEUpOworICAgIH0KKyAgICBlbHNlIC8qIGluZC0+ZGF0YS5uZXdfc3RhdGUgaXMgc29tZXRoaW5nIGVsc2UgKGUuZy4gdW5wcm92aXNpb25lZCwgaWYgdGhlIGFsbG9jIHdhcyBjbGVhcmVkKSAqLworICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgcmV0dXJuIGJjbW9sdF9vcGVyX3N1Ym1pdChwYXJ0bmVyLT5kZXZpY2VfaWQsICZvcGVyLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfZ2VtX3BvcnRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQoCisgICAgY29uc3QgYmNtb2x0X3BzX3BvbiAqcGFydG5lciwKKyAgICBjb25zdCBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCAqaW5kKQoreworICAgIGJjbW9sdF9ncG9uX2dlbV9wb3J0X2tleSBrZXkgPSB7IHBhcnRuZXItPnBvbl9pZCwgaW5kLT5rZXkuZ2VtX3BvcnRfaWQgfTsKKyAgICBiY21vbHRfZ3Bvbl9nZW1fcG9ydF9zZXRfc3RhdGUgb3BlcjsKKworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIGdwb25fZ2VtX3BvcnQsIHNldF9zdGF0ZSwga2V5KTsKKworICAgIGlmIChpbmQtPmRhdGEubmV3X3N0YXRlID09IEJDTU9MVF9HUE9OX0dFTV9QT1JUX1NUQVRFX0FDVElWRSkKKyAgICB7CisgICAgICAgIC8qIGRvbid0IHJlYWN0IHRvIHVuc3VjY2Vzc2Z1bCBhY3RpdmF0aW9ucyAqLworICAgICAgICBpZiAoaW5kLT5kYXRhLnN0YXR1cyAhPSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgICAgICB9CisKKyAgICAgICAgUFNfSU5GTygiJXM6IGFjdGl2YXRpbmcgPCVkOiVkPiBHRU0gcG9ydCBJRCAlZFxuIiwgX19GVU5DVElPTl9fLCBwYXJ0bmVyLT5kZXZpY2VfaWQsIGtleS5wb25fbmksIGtleS5nZW1fcG9ydF9pZCk7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX2dlbV9wb3J0LCBzZXRfc3RhdGUsIHN0YXRlLCBCQ01PTFRfR0VNX1BPUlRfT1BFUkFUSU9OX0FDVElWQVRFKTsKKyAgICB9CisgICAgZWxzZSBpZiAoaW5kLT5kYXRhLm5ld19zdGF0ZSA9PSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9TVEFURV9JTkFDVElWRSkKKyAgICB7CisgICAgICAgIFBTX0lORk8oCisgICAgICAgICAgICAiJXM6IGRlYWN0aXZhdGluZyA8JWQ6JWQ+IEdFTSBwb3J0IElEICVkXG4iLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgcGFydG5lci0+ZGV2aWNlX2lkLAorICAgICAgICAgICAga2V5LnBvbl9uaSwKKyAgICAgICAgICAgIGtleS5nZW1fcG9ydF9pZCk7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCBncG9uX2dlbV9wb3J0LCBzZXRfc3RhdGUsIHN0YXRlLCBCQ01PTFRfR0VNX1BPUlRfT1BFUkFUSU9OX0RFQUNUSVZBVEUpOworICAgIH0KKyAgICBlbHNlIC8qIGluZC0+ZGF0YS5uZXdfc3RhdGUgaXMgc29tZXRoaW5nIGVsc2UgKGUuZy4gdW5wcm92aXNpb25lZCwgaWYgdGhlIEdFTSBwb3J0IHdhcyBjbGVhcmVkKSAqLworICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgcmV0dXJuIGJjbW9sdF9vcGVyX3N1Ym1pdChwYXJ0bmVyLT5kZXZpY2VfaWQsICZvcGVyLmhkcik7Cit9CisKK2JjbW9zX2Vycm5vIHBzX3Byb2Nlc3NfaW5kX2dwb24oY29uc3QgYmNtb2x0X3BzX3BvbiAqcG9uLCBjb25zdCBiY21vbHRfYXV0byAqaW5kKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfcHNfcG9uX3N0YXRlIHN0YXRlOworICAgIGJjbW9sdF9wc19wb24gcGFydG5lcjsKKyAgICBiY21vbHRfcHNfZ2xvYmFsX2NmZyBnbG9iYWxfY2ZnOworCisgICAgZXJyID0gYmNtb2x0X3BzX2dsb2JhbF9jZmdfZ2V0KCZnbG9iYWxfY2ZnKTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmIChnbG9iYWxfY2ZnLm1pcnJvcl9tb2RlICE9IEJDTU9MVF9QU19NSVJST1JfTU9ERV9BVVRPICYmCisgICAgICAgIGluZC0+aGRyLnN1Ymdyb3VwICE9IEJDTU9MVF9HUE9OX05JX0FVVE9fSURfTE9TKQorICAgIHsKKyAgICAgICAgLyogb25seSBoYW5kbGUgbW9zdCBpbmRpY2F0aW9ucyB3aGlsZSBpbiBtaXJyb3IgbW9kZSAnYXV0bycsIGJ1dCBwZXJmb3JtIGEgc3dpdGNob3ZlciBvbiBMb1MgaW4gYW55IGNhc2UgICovCisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOworICAgIH0KKworICAgIGVyciA9IGJjbW9sdF9wc19wb25fc3RhdGVfZ2V0KHBvbiwgJnN0YXRlLCAmcGFydG5lcik7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoc3RhdGUgIT0gQkNNT0xUX1BTX1BPTl9TVEFURV9XT1JLSU5HKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7IC8qIGlnbm9yZSBpbmRpY2F0aW9ucyBmcm9tIFBPTnMgdGhhdCBhcmVuJ3QgcHJvdGVjdGVkIHdvcmtpbmcgKi8KKyAgICB9CisKKyAgICBzd2l0Y2ggKGluZC0+aGRyLm9ial90eXBlKQorICAgIHsKKyAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9OSToKKyAgICAgICAgc3dpdGNoIChpbmQtPmhkci5zdWJncm91cCkKKyAgICAgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfTE9TOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9uaV9sb3MoJmdsb2JhbF9jZmcsIHBvbiwgKChjb25zdCBiY21vbHRfZ3Bvbl9uaV9sb3MgKilpbmQpKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9OSV9BVVRPX0lEX1NUQVRFX0NIQU5HRV9DT01QTEVURUQ6CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX25pX3N0YXRlX2NoYW5nZWQoJnBhcnRuZXIsICgoY29uc3QgYmNtb2x0X2dwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCAqKWluZCkpOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfVFJBRkZJQ19SRVNVTUU6CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX25pX3RyYWZmaWNfcmVzdW1lKHBvbiwgKChjb25zdCBiY21vbHRfZ3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSAqKWluZCkpOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX05JX0FVVE9fSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRUQ6CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX25pX29udXNfcmFuZ2VkKCZwYXJ0bmVyLCAoKGNvbnN0IGJjbW9sdF9ncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX29udXNfcmFuZ2VkICopaW5kKSk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsgLyogc2lsZW50bHkgaWdub3JlIGFsbCBvdGhlciBOSSBpbmRpY2F0aW9ucyAqLworICAgICAgICB9CisKKyAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9PTlU6CisgICAgICAgIHN3aXRjaCAoaW5kLT5oZHIuc3ViZ3JvdXApCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9SQU5HSU5HX0NPTVBMRVRFRDoKKyAgICAgICAgICAgIHJldHVybiBwc19oYW5kbGVfb251X3JhbmdpbmdfY29tcGxldGVkKCZwYXJ0bmVyLCAoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZCAqKWluZCkpOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0tFWV9FWENIQU5HRV9DT01QTEVURUQ6CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkKAorICAgICAgICAgICAgICAgICZwYXJ0bmVyLAorICAgICAgICAgICAgICAgICgoY29uc3QgYmNtb2x0X2dwb25fb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWQgKilpbmQpKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9QQVNTV09SRF9BVVRIRU5USUNBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX29udV9wYXNzd29yZF9hdXRoZW50aWNhdGlvbl9jb21wbGV0ZWQoCisgICAgICAgICAgICAgICAgJnBhcnRuZXIsCisgICAgICAgICAgICAgICAgKChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfcGFzc3dvcmRfYXV0aGVudGljYXRpb25fY29tcGxldGVkICopaW5kKSk7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT05VX0FDVElWQVRJT05fQ09NUExFVEVEOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9vbnVfYWN0aXZhdGlvbl9jb21wbGV0ZWQoCisgICAgICAgICAgICAgICAgJnBhcnRuZXIsCisgICAgICAgICAgICAgICAgKChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkICopaW5kKSk7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT05VX0RFQUNUSVZBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkKAorICAgICAgICAgICAgICAgICZwYXJ0bmVyLAorICAgICAgICAgICAgICAgICgoY29uc3QgYmNtb2x0X2dwb25fb251X29udV9kZWFjdGl2YXRpb25fY29tcGxldGVkICopaW5kKSk7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT05VX0VOQUJMRV9DT01QTEVURUQ6CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX29udV9lbmFibGVfY29tcGxldGVkKCZwYXJ0bmVyLCAoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZCAqKWluZCkpOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX09OVV9ESVNBQkxFX0NPTVBMRVRFRDoKKyAgICAgICAgICAgIHJldHVybiBwc19oYW5kbGVfb251X2Rpc2FibGVfY29tcGxldGVkKCZwYXJ0bmVyLCAoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWQgKilpbmQpKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9PTlVfQUxBUk06CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX29udV9hbGFybSgmcGFydG5lciwgKChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfb251X2FsYXJtICopaW5kKSk7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfRE9XSToKKyAgICAgICAgICAgIHJldHVybiBwc19oYW5kbGVfb251X2Rvd2koJnBhcnRuZXIsICgoY29uc3QgYmNtb2x0X2dwb25fb251X2Rvd2kgKilpbmQpKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9TRkk6CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX29udV9zZmkoJnBhcnRuZXIsICgoY29uc3QgYmNtb2x0X2dwb25fb251X3NmaSAqKWluZCkpOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX1NESToKKyAgICAgICAgICAgIHJldHVybiBwc19oYW5kbGVfb251X3NkaSgmcGFydG5lciwgKChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfc2RpICopaW5kKSk7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfREZJOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9vbnVfZGZpKCZwYXJ0bmVyLCAoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9kZmkgKilpbmQpKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9TVUZJOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9vbnVfc3VmaSgmcGFydG5lciwgKChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfc3VmaSAqKWluZCkpOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0xPQUk6CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX29udV9sb2FpKCZwYXJ0bmVyLCAoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9sb2FpICopaW5kKSk7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfREdJOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9vbnVfZGdpKCZwYXJ0bmVyLCAoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9kZ2kgKilpbmQpKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9PTlVfQVVUT19JRF9USVdJOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9vbnVfdGl3aSgmcGFydG5lciwgKChjb25zdCBiY21vbHRfZ3Bvbl9vbnVfdGl3aSAqKWluZCkpOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX09OVV9BVVRPX0lEX0xPS0k6CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX29udV9sb2tpKCZwYXJ0bmVyLCAoKGNvbnN0IGJjbW9sdF9ncG9uX29udV9sb2tpICopaW5kKSk7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fT05VX0FVVE9fSURfT01DSV9QT1JUX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9vbnVfb21jaV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkKAorICAgICAgICAgICAgICAgICZwYXJ0bmVyLAorICAgICAgICAgICAgICAgICgoY29uc3QgYmNtb2x0X2dwb25fb251X29tY2lfcG9ydF9pZF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCAqKWluZCkpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7IC8qIHNpbGVudGx5IGlnbm9yZSBhbGwgb3RoZXIgT05VIGluZGljYXRpb25zICovCisgICAgICAgIH0KKworICAgIGNhc2UgQkNNT0xUX09CSl9JRF9HUE9OX0FMTE9DOgorICAgICAgICBzd2l0Y2ggKGluZC0+aGRyLnN1Ymdyb3VwKQorICAgICAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fQUxMT0NfQVVUT19JRF9DT05GSUdVUkFUSU9OX0NPTVBMRVRFRDoKKyAgICAgICAgICAgIHJldHVybiBwc19oYW5kbGVfYWxsb2NfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQoCisgICAgICAgICAgICAgICAgJnBhcnRuZXIsCisgICAgICAgICAgICAgICAgKChjb25zdCBiY21vbHRfZ3Bvbl9hbGxvY19jb25maWd1cmF0aW9uX2NvbXBsZXRlZCAqKWluZCkpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7IC8qIHNpbGVudGx5IGlnbm9yZSBhbGwgb3RoZXIgYWxsb2MgaW5kaWNhdGlvbnMgKi8KKyAgICAgICAgfQorCisgICAgY2FzZSBCQ01PTFRfT0JKX0lEX0dQT05fR0VNX1BPUlQ6CisgICAgICAgIHN3aXRjaCAoaW5kLT5oZHIuc3ViZ3JvdXApCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9HRU1fUE9SVF9BVVRPX0lEX0NPTkZJR1VSQVRJT05fQ09NUExFVEVEOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9nZW1fcG9ydF9jb25maWd1cmF0aW9uX2NvbXBsZXRlZCgKKyAgICAgICAgICAgICAgICAmcGFydG5lciwKKyAgICAgICAgICAgICAgICAoKGNvbnN0IGJjbW9sdF9ncG9uX2dlbV9wb3J0X2NvbmZpZ3VyYXRpb25fY29tcGxldGVkICopaW5kKSk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsgLyogc2lsZW50bHkgaWdub3JlIGFsbCBvdGhlciBHRU0gcG9ydCBpbmRpY2F0aW9ucyAqLworICAgICAgICB9CisKKyAgICBjYXNlIEJDTU9MVF9PQkpfSURfR1BPTl9JV0ZfTUFDX1RBQkxFOgorICAgICAgICBzd2l0Y2ggKGluZC0+aGRyLnN1Ymdyb3VwKQorICAgICAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX0dQT05fSVdGX01BQ19UQUJMRV9BVVRPX0NGR19JRF9ORVdfTUFDOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9tYWNfdGFibGVfbmV3X21hYygKKyAgICAgICAgICAgICAgICAmZ2xvYmFsX2NmZywKKyAgICAgICAgICAgICAgICAmcGFydG5lciwKKyAgICAgICAgICAgICAgICAoY29uc3QgYmNtb2x0X2dwb25faXdmX21hY190YWJsZV9uZXdfbWFjICopaW5kKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfR1BPTl9JV0ZfTUFDX1RBQkxFX0FVVE9fQ0ZHX0lEX01BQ19BR0VEOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9tYWNfdGFibGVfbWFjX2FnZWQoCisgICAgICAgICAgICAgICAgJmdsb2JhbF9jZmcsCisgICAgICAgICAgICAgICAgJnBhcnRuZXIsCisgICAgICAgICAgICAgICAgKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX2FnZWQgKilpbmQpOworICAgICAgICBjYXNlIEJDTU9MVF9HUE9OX0lXRl9NQUNfVEFCTEVfQVVUT19DRkdfSURfTUFDX01PVkU6CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX21hY190YWJsZV9tYWNfbW92ZSgKKyAgICAgICAgICAgICAgICAmZ2xvYmFsX2NmZywgCisgICAgICAgICAgICAgICAgJnBhcnRuZXIsCisgICAgICAgICAgICAgICAgKGNvbnN0IGJjbW9sdF9ncG9uX2l3Zl9tYWNfdGFibGVfbWFjX21vdmUgKilpbmQpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7IC8qIHNpbGVudGx5IGlnbm9yZSBhbGwgb3RoZXIgbWFjIHRhYmxlIGluZGljYXRpb25zICovCisgICAgICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBCQ01fRVJSX05PVF9TVVBQT1JURUQ7IC8qIHNvbWVvbmUgZWxzZSBuZWVkcyB0byBoYW5kbGUgdGhpcyBpbmRpY2F0aW9uICovCisgICAgfQorfQorCitiY21vc19lcnJubyBwc19tb3ZlX3RvX3N0YW5kYnlfZ3Bvbihjb25zdCBiY21vbHRfcHNfcG9uICpwb24pCit7CisgICAgYmNtb2x0X2dwb25fbmlfc2V0X3Bvbl9zdGF0ZSBzZXRfcG9uX3N0YXRlOworICAgIGJjbW9sdF9ncG9uX25pX2tleSBrZXkgPSB7IChiY21vbHRfZ3Bvbl9uaSlwb24tPnBvbl9pZCB9OworCisgICAgQkNNT0xUX09QRVJfSU5JVCgmc2V0X3Bvbl9zdGF0ZSwgZ3Bvbl9uaSwgc2V0X3Bvbl9zdGF0ZSwga2V5KTsKKyAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmc2V0X3Bvbl9zdGF0ZSwgZ3Bvbl9uaSwgc2V0X3Bvbl9zdGF0ZSwgcG9uX3N0YXRlLCBCQ01PTFRfUE9OX09QRVJBVElPTl9BQ1RJVkVfU1RBTkRCWSk7CisgICAgcmV0dXJuIGJjbW9sdF9vcGVyX3N1Ym1pdChwb24tPmRldmljZV9pZCwgJnNldF9wb25fc3RhdGUuaGRyKTsKK30KKworYmNtb3NfZXJybm8gcHNfbW92ZV90b193b3JraW5nX2dwb24oY29uc3QgYmNtb2x0X3BzX3BvbiAqcG9uKQoreworICAgIGJjbW9sdF9ncG9uX25pX3NldF9wb25fc3RhdGUgc2V0X3Bvbl9zdGF0ZTsKKyAgICBiY21vbHRfZ3Bvbl9uaV9rZXkga2V5ID0geyAoYmNtb2x0X2dwb25fbmkpcG9uLT5wb25faWQgfTsKKworICAgIEJDTU9MVF9PUEVSX0lOSVQoJnNldF9wb25fc3RhdGUsIGdwb25fbmksIHNldF9wb25fc3RhdGUsIGtleSk7CisgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJnNldF9wb25fc3RhdGUsIGdwb25fbmksIHNldF9wb25fc3RhdGUsIHBvbl9zdGF0ZSwgQkNNT0xUX1BPTl9PUEVSQVRJT05fQUNUSVZFX1dPUktJTkcpOworICAgIHJldHVybiBiY21vbHRfb3Blcl9zdWJtaXQocG9uLT5kZXZpY2VfaWQsICZzZXRfcG9uX3N0YXRlLmhkcik7Cit9CmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3Byb3RlY3Rpb25fc3dpdGNoaW5nL2JjbW9sdF91c2VyX2FwcGxfcHNfaW50ZXJuYWwuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvcHJvdGVjdGlvbl9zd2l0Y2hpbmcvYmNtb2x0X3VzZXJfYXBwbF9wc19pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjM2Y3ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3Byb3RlY3Rpb25fc3dpdGNoaW5nL2JjbW9sdF91c2VyX2FwcGxfcHNfaW50ZXJuYWwuaApAQCAtMCwwICsxLDY2IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyovCisKKy8qIFRoaXMgZmlsZSBpcyBmb3IgaW50ZXJuYWwgdXNlIHdpdGhpbiB0aGUgcHJvdGVjdGlvbiBzd2l0Y2hpbmcgdXNlciBhcHBsaWNhdGlvbiAtCisgICBubyBmdW5jdGlvbnMgaGVyZSBzaG91bGQgYmUgY2FsbGVkIGZyb20gYW55d2hlcmUgZWxzZSEgKi8KKworI2lmbmRlZiBfQkNNT0xUX1VTRVJfQVBQTF9QU19JTlRFUk5BTF9IXworI2RlZmluZSBfQkNNT0xUX1VTRVJfQVBQTF9QU19JTlRFUk5BTF9IXworCisjaW5jbHVkZSA8YmNtX2Rldl9sb2cuaD4KKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX3BzLmgiCisKKyNpZmRlZiBFTkFCTEVfTE9HCitkZXZfbG9nX2lkIHBzX2dldF9sb2dfaWQodm9pZCk7CisjZGVmaW5lIFBTX0VSUiguLi4pIEJDTV9MT0coRVJST1IsIHBzX2dldF9sb2dfaWQoKSwgX19WQV9BUkdTX18pCisjZGVmaW5lIFBTX0lORk8oLi4uKSBCQ01fTE9HKElORk8sIHBzX2dldF9sb2dfaWQoKSwgX19WQV9BUkdTX18pCisjZWxzZQorI2RlZmluZSBQU19FUlIoLi4uKSBiY21vc19wcmludGYoIltQUyBFUlJPUl0gIiBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgUFNfSU5GTyguLi4pIGJjbW9zX3ByaW50ZigiW1BTIElORk9dICIgX19WQV9BUkdTX18pCisjZW5kaWYKKworLyogSGVscGVyIGZ1bmN0aW9ucyAqLwordWludDMyX3QgcHNfZ2V0X2xhc3Rfc3dpdGNoX3N0YXJ0X3RpbWVfdXModm9pZCk7CisKKy8qIEdQT04tc3BlY2lmaWMgZnVuY3Rpb25hbGl0eSAqLworYmNtb3NfZXJybm8gcHNfcHJvY2Vzc19pbmRfZ3Bvbihjb25zdCBiY21vbHRfcHNfcG9uICpwb24sIGNvbnN0IGJjbW9sdF9hdXRvICppbmQpOworYmNtb3NfZXJybm8gcHNfbW92ZV90b19zdGFuZGJ5X2dwb24oY29uc3QgYmNtb2x0X3BzX3BvbiAqcG9uKTsKK2JjbW9zX2Vycm5vIHBzX21vdmVfdG9fd29ya2luZ19ncG9uKGNvbnN0IGJjbW9sdF9wc19wb24gKnBvbik7CisKKy8qIEVQT04tc3BlY2lmaWMgZnVuY3Rpb25hbGl0eSAqLworYmNtb3NfZXJybm8gcHNfcHJvY2Vzc19pbmRfZXBvbihjb25zdCBiY21vbHRfcHNfcG9uICpwb24sIGNvbnN0IGJjbW9sdF9hdXRvICppbmQpOworYmNtb3NfZXJybm8gcHNfbW92ZV90b19zdGFuZGJ5X2Vwb24oY29uc3QgYmNtb2x0X3BzX3BvbiAqcG9uKTsKK2JjbW9zX2Vycm5vIHBzX21vdmVfdG9fd29ya2luZ19lcG9uKGNvbnN0IGJjbW9sdF9wc19wb24gKnBvbik7CisKKy8qIFhHUE9OLXNwZWNpZmljIGZ1bmN0aW9uYWxpdHkgKi8KK2JjbW9zX2Vycm5vIHBzX3Byb2Nlc3NfaW5kX3hncG9uKGNvbnN0IGJjbW9sdF9wc19wb24gKnBvbiwgY29uc3QgYmNtb2x0X2F1dG8gKmluZCk7CitiY21vc19lcnJubyBwc19tb3ZlX3RvX3N0YW5kYnlfeGdwb24oY29uc3QgYmNtb2x0X3BzX3BvbiAqcG9uKTsKK2JjbW9zX2Vycm5vIHBzX21vdmVfdG9fd29ya2luZ194Z3Bvbihjb25zdCBiY21vbHRfcHNfcG9uICpwb24pOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvcHJvdGVjdGlvbl9zd2l0Y2hpbmcvYmNtb2x0X3VzZXJfYXBwbF9wc194Z3Bvbi5jIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wcm90ZWN0aW9uX3N3aXRjaGluZy9iY21vbHRfdXNlcl9hcHBsX3BzX3hncG9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFhMTY3YQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvcHJvdGVjdGlvbl9zd2l0Y2hpbmcvYmNtb2x0X3VzZXJfYXBwbF9wc194Z3Bvbi5jCkBAIC0wLDAgKzEsNjU1IEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyovCisKKyNpbmNsdWRlIDxiY21vbHRfaG9zdF9hcGkuaD4KKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX3BzLmgiCisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9wc19pbnRlcm5hbC5oIgorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfaGFuZGxlX25pX2xvcygKKyAgICBjb25zdCBiY21vbHRfcHNfZ2xvYmFsX2NmZyAqZ2xvYmFsX2NmZywKKyAgICBjb25zdCBiY21vbHRfcHNfcG9uICpwb24sCisgICAgY29uc3QgYmNtb2x0X3hncG9uX25pX2xvcyAqaW5kKQoreworICAgIGlmIChpbmQtPmRhdGEuc3RhdHVzID09IEJDTU9MVF9TVEFUVVNfT0ZGKQorICAgIHsKKyAgICAgICAgUFNfSU5GTygiPCVkOiVkPiBMb1MgYWxhcm0gY2xlYXJlZFxuIiwgcG9uLT5kZXZpY2VfaWQsIHBvbi0+cG9uX2lkKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgUFNfSU5GTygiPCVkOiVkPiBMb1MgYWxhcm0gcmFpc2VkXG4iLCBwb24tPmRldmljZV9pZCwgcG9uLT5wb25faWQpOworCisgICAgaWYgKGdsb2JhbF9jZmctPnN3aXRjaF9jb25kaXRpb24gPT0gQkNNT0xUX1BTX1NXSVRDSF9DT05ESVRJT05fTUFOVUFMKQorICAgIHsKKyAgICAgICAgLyogZG9uJ3QgcmVhY3QgdG8gdGhlIHN3aXRjaCBpZiB3ZSdyZSBpbiBtYW51YWwgc3dpdGNoIG1vZGUgKi8KKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBiY21vbHRfcHNfc3dpdGNoX3BlcmZvcm0ocG9uKTsKKyAgICB9Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfbmlfc3RhdGVfY2hhbmdlZCgKKyAgICBjb25zdCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyLAorICAgIGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9zdGF0ZV9jaGFuZ2VfY29tcGxldGVkICppbmQpCit7CisgICAgYmNtb2x0X3hncG9uX25pX2tleSBrZXkgPSB7IHBhcnRuZXItPnBvbl9pZCB9OworICAgIGJjbW9sdF94Z3Bvbl9uaV9zZXRfcG9uX3N0YXRlIG9wZXI7CisKKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCB4Z3Bvbl9uaSwgc2V0X3Bvbl9zdGF0ZSwga2V5KTsKKworICAgIGlmIChpbmQtPmRhdGEucHJldmlvdXNfc3RhdGUgPT0gQkNNT0xUX1BPTl9TVEFURV9JTkFDVElWRSAmJgorICAgICAgICBpbmQtPmRhdGEubmV3X3N0YXRlID09IEJDTU9MVF9QT05fU1RBVEVfQUNUSVZFX1dPUktJTkcpCisgICAgeworICAgICAgICBQU19JTkZPKCIlczogYWN0aXZhdGluZyBQT04gPCVkOiVkPlxuIiwgX19GVU5DVElPTl9fLCBwYXJ0bmVyLT5kZXZpY2VfaWQsIGtleS5wb25fbmkpOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fbmksIHNldF9wb25fc3RhdGUsIHBvbl9zdGF0ZSwgQkNNT0xUX1BPTl9PUEVSQVRJT05fQUNUSVZFX1NUQU5EQlkpOworICAgIH0KKyAgICBlbHNlIGlmIChpbmQtPmRhdGEucHJldmlvdXNfc3RhdGUgPT0gQkNNT0xUX1BPTl9TVEFURV9BQ1RJVkVfV09SS0lORyAmJgorICAgICAgICBpbmQtPmRhdGEubmV3X3N0YXRlID09IEJDTU9MVF9QT05fU1RBVEVfSU5BQ1RJVkUpCisgICAgeworICAgICAgICBQU19JTkZPKCIlczogZGVhY3RpdmF0aW5nIFBPTiA8JWQ6JWQ+XG4iLCBfX0ZVTkNUSU9OX18sIHBhcnRuZXItPmRldmljZV9pZCwga2V5LnBvbl9uaSk7CisgICAgICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9uaSwgc2V0X3Bvbl9zdGF0ZSwgcG9uX3N0YXRlLCBCQ01PTFRfUE9OX09QRVJBVElPTl9JTkFDVElWRSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIG9ubHkgY2hhbmdlIHRoZSBzdGFuZGJ5IFBPTidzIHN0YXRlIGlmIHdlJ3JlIHByZS1wcm92aXNpb25pbmcgdGhlIHdvcmtpbmcgUE9OCisgICAgICAgICAgKHRoZSBzd2l0Y2hvdmVyIGlzIGhhbmRsZWQgc2VwYXJhdGVseSkgKi8KKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgcmV0dXJuIGJjbW9sdF9vcGVyX3N1Ym1pdChwYXJ0bmVyLT5kZXZpY2VfaWQsICZvcGVyLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfbmlfdHJhZmZpY19yZXN1bWUoCisgICAgY29uc3QgYmNtb2x0X3BzX3BvbiAqcG9uLAorICAgIGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ190cmFmZmljX3Jlc3VtZSAqaW5kKQoreworICAgIHVpbnQzMl90IGFmdGVyX3VzICA9IGJjbW9zX3RpbWVzdGFtcCgpOworICAgIHVpbnQzMl90IGJlZm9yZV91cyA9IHBzX2dldF9sYXN0X3N3aXRjaF9zdGFydF90aW1lX3VzKCk7CisgICAgdWludDMyX3QgdGltZV90YWtlbl91cyA9IChhZnRlcl91cyA+IGJlZm9yZV91cykgPyBhZnRlcl91cyAtIGJlZm9yZV91cyA6IGJlZm9yZV91cyAtIGFmdGVyX3VzOworICAgIGNvbnN0IGNoYXIgKnRyYWZmaWNfcmVzdW1lX3Jlc3VsdF9zdHIgPSBOVUxMOworCisgICAgc3dpdGNoIChpbmQtPmRhdGEucmVzdWx0KQorICAgIHsKKyAgICBjYXNlIEJDTU9MVF9UUkFGRklDX1JFU1VNRV9SRVNVTFRfU1VDQ0VTUzoKKyAgICAgICAgdHJhZmZpY19yZXN1bWVfcmVzdWx0X3N0ciA9ICJzdWNjZXNzIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBCQ01PTFRfVFJBRkZJQ19SRVNVTUVfUkVTVUxUX0ZBSUxVUkU6CisgICAgICAgIHRyYWZmaWNfcmVzdW1lX3Jlc3VsdF9zdHIgPSAiZmFpbHVyZSI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkNNT0xUX1RSQUZGSUNfUkVTVU1FX1JFU1VMVF9TVVNQRUNURURfTE9TOgorICAgICAgICB0cmFmZmljX3Jlc3VtZV9yZXN1bHRfc3RyID0gInN1c3BlY3RlZF9sb3MiOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBQU19JTkZPKAorICAgICAgICAiPCVkOiVkPiBUcmFmZmljIHJlc3VtZSAlcy4gVGltZSBzaW5jZSBzdGFydCBvZiBzd2l0Y2g6ICVkIG1zLlxuIiwKKyAgICAgICAgcG9uLT5kZXZpY2VfaWQsCisgICAgICAgIHBvbi0+cG9uX2lkLAorICAgICAgICB0cmFmZmljX3Jlc3VtZV9yZXN1bHRfc3RyLAorICAgICAgICB0aW1lX3Rha2VuX3VzIC8gMTAwMCk7CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9uaV9vbnVzX3JhbmdlZCgKKyAgICBjb25zdCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyLAorICAgIGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCAqaW5kKQoreworICAgIHVpbnQzMl90IGk7CisgICAgYmNtb3NfZXJybm8gbGFzdF9lcnIgPSBCQ01fRVJSX09LOworCisgICAgLyogYXBwbHkgYWxsIG9mIHRoZSBuZXcgT05VIEVRRHMgdG8gdGhlIHN0YW5kYnkgUE9OICovCisgICAgZm9yIChpID0gMDsgaSA8IGluZC0+ZGF0YS5vbnVzLmxlbjsgaSsrKQorICAgIHsKKyAgICAgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyBwYXJ0bmVyLT5wb25faWQsIGluZC0+ZGF0YS5vbnVzLnZhbFtpXS5vbnVfaWQgfTsKKyAgICAgICAgYmNtb2x0X3hncG9uX29udV9jZmcgY2ZnOworICAgICAgICBiY21vc19lcnJubyBlcnI7CisKKyAgICAgICAgUFNfSU5GTygKKyAgICAgICAgICAgICIlczogdXBkYXRpbmcgRVFEIDwlZDolZD4gT05VICVkIC0+ICVkXG4iLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgcGFydG5lci0+ZGV2aWNlX2lkLAorICAgICAgICAgICAga2V5LnBvbl9uaSwKKyAgICAgICAgICAgIGtleS5vbnVfaWQsCisgICAgICAgICAgICBpbmQtPmRhdGEub251cy52YWxbaV0uZXFkKTsKKworICAgICAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fb251LCBrZXkpOworICAgICAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgcmFuZ2luZ190aW1lLCBpbmQtPmRhdGEub251cy52YWxbaV0uZXFkKTsKKyAgICAgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQocGFydG5lci0+ZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgUFNfRVJSKCJFUUQgdXBkYXRlIGZhaWxlZDogJXNcbiIsIGJjbW9zX3N0cmVycm9yKGVycikpOworICAgICAgICAgICAgbGFzdF9lcnIgPSBlcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbGFzdF9lcnI7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfb251X3JhbmdpbmdfY29tcGxldGVkKAorICAgIGNvbnN0IGJjbW9sdF9wc19wb24gKnBhcnRuZXIsCisgICAgY29uc3QgYmNtb2x0X3hncG9uX29udV9yYW5naW5nX2NvbXBsZXRlZCAqaW5kKQoreworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgcGFydG5lci0+cG9uX2lkLCBpbmQtPmtleS5vbnVfaWQgfTsKKyAgICBiY21vbHRfeGdwb25fb251X2NmZyBjZmc7CisKKyAgICAvKiBvbmx5IHJlYWN0IHRvIHN1Y2Nlc3MgaW5kaWNhdGlvbnMgKi8KKyAgICBpZiAoaW5kLT5kYXRhLnN0YXR1cyAhPSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1MpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisKKyAgICBQU19JTkZPKAorICAgICAgICAiJXM6IHVwZGF0aW5nIEVRRCA8JWQ6JWQ+IE9OVSAlZCAtPiAlZFxuIiwKKyAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICBwYXJ0bmVyLT5kZXZpY2VfaWQsCisgICAgICAgIGtleS5wb25fbmksCisgICAgICAgIGtleS5vbnVfaWQsCisgICAgICAgIGluZC0+ZGF0YS5lcWQpOworCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX29udSwga2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgcmFuZ2luZ190aW1lLCBpbmQtPmRhdGEuZXFkKTsKKyAgICByZXR1cm4gYmNtb2x0X2NmZ19zZXQocGFydG5lci0+ZGV2aWNlX2lkLCAmY2ZnLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWQoCisgICAgY29uc3QgYmNtb2x0X3BzX3BvbiAqcG9uLAorICAgIGNvbnN0IGJjbW9sdF9wc19wb24gKnBhcnRuZXIsCisgICAgY29uc3QgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkICppbmQpCit7CisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyBwYXJ0bmVyLT5wb25faWQsIGluZC0+a2V5Lm9udV9pZCB9OworICAgIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnIGNmZzsKKworICAgIFBTX0lORk8oIiVzOiB1cGRhdGluZyBBRVMga2V5IDwlZDolZD4gT05VICVkXG4iLCBfX0ZVTkNUSU9OX18sIHBhcnRuZXItPmRldmljZV9pZCwga2V5LnBvbl9uaSwga2V5Lm9udV9pZCk7CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fb251LCBrZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBjdXJyZW50X2VuY3J5cHRpb25fa2V5LCBpbmQtPmRhdGEubmV3X2tleSk7CisgICAgcmV0dXJuIGJjbW9sdF9jZmdfc2V0KHBvbi0+ZGV2aWNlX2lkLCAmY2ZnLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfb251X2FjdGl2YXRpb25fY29tcGxldGVkKAorICAgIGNvbnN0IGJjbW9sdF9wc19wb24gKnBvbiwKKyAgICBjb25zdCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyLAorICAgIGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkICppbmQpCit7CisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyBwYXJ0bmVyLT5wb25faWQsIGluZC0+a2V5Lm9udV9pZCB9OworICAgIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnIGNmZzsKKyAgICBiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGUgb3BlcjsKKyAgICBiY21vc19lcnJubyBlcnI7CisKKyAgICAvKiBvbmx5IHJlYWN0IHRvIHN1Y2Nlc3MgaW5kaWNhdGlvbnMgKi8KKyAgICBpZiAoaW5kLT5kYXRhLnN0YXR1cyAhPSBCQ01PTFRfUkVTVUxUX1NVQ0NFU1MpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisKKyAgICBQU19JTkZPKAorICAgICAgICAiJXM6IHByb3Zpc2lvbmluZyByZWdpc3RyYXRpb24gSUQgLyBrZXlzIGZvciBuZXdseS1hY3RpdmF0ZWQgT05VIDwlZDolZD4gT05VICVkXG4iLAorICAgICAgICBfX0ZVTkNUSU9OX18sCisgICAgICAgIHBhcnRuZXItPmRldmljZV9pZCwKKyAgICAgICAga2V5LnBvbl9uaSwKKyAgICAgICAga2V5Lm9udV9pZCk7CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fb251LCBrZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCByZWdpc3RyYXRpb25faWQsIGluZC0+ZGF0YS5yZWdpc3RyYXRpb25faWQpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCByZWdpc3RyYXRpb25fZW5jcnlwdGlvbl9rZXlzLCBpbmQtPmRhdGEucmVnaXN0cmF0aW9uX2VuY3J5cHRpb25fa2V5cyk7CisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQocGFydG5lci0+ZGV2aWNlX2lkLCAmY2ZnLmhkcik7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBQU19JTkZPKCIlczogYWN0aXZhdGluZyA8JWQ6JWQ+IE9OVSAlZFxuIiwgX19GVU5DVElPTl9fLCBwYXJ0bmVyLT5kZXZpY2VfaWQsIGtleS5wb25fbmksIGtleS5vbnVfaWQpOworCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fb251LCBzZXRfb251X3N0YXRlLCBrZXkpOworICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9vbnUsIHNldF9vbnVfc3RhdGUsIG9udV9zdGF0ZSwgQkNNT0xUX09OVV9PUEVSQVRJT05fQUNUSVZFKTsKKyAgICByZXR1cm4gYmNtb2x0X29wZXJfc3VibWl0KHBhcnRuZXItPmRldmljZV9pZCwgJm9wZXIuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCgKKyAgICBjb25zdCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyLAorICAgIGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQgKmluZCkKK3sKKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7IHBhcnRuZXItPnBvbl9pZCwgaW5kLT5rZXkub251X2lkIH07CisgICAgYmNtb2x0X3hncG9uX29udV9zZXRfb251X3N0YXRlIG9wZXI7CisKKyAgICAvKiBOb3RlOiB3ZSByZWFjdCB0byB0aGlzIGluZGljYXRpb24gd2hldGhlciBvciBub3QgdGhlIGRlYWN0aXZhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4gIEZhaWx1cmUgaW5kaWNhdGVzIHRoYXQgdGhlCisgICAgICogT05VIGRpZG4ndCByZXNwb25kIHRvIHRoZSBkZWFjdGl2YXRpb24sIGJ1dCB3ZSBzdGlsbCByZW1vdmUgdGhlIE9OVSBmcm9tIE9MVCBoYXJkd2FyZSBzbyBpdCBtdXN0IGJlIG1pcnJvcmVkLiAqLworCisgICAgUFNfSU5GTygiJXM6IGRlYWN0aXZhdGluZyA8JWQ6JWQ+IE9OVSAlZFxuIiwgX19GVU5DVElPTl9fLCBwYXJ0bmVyLT5kZXZpY2VfaWQsIGtleS5wb25fbmksIGtleS5vbnVfaWQpOworCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3BlciwgeGdwb25fb251LCBzZXRfb251X3N0YXRlLCBrZXkpOworICAgIEJDTU9MVF9PUEVSX1BST1BfU0VUKCZvcGVyLCB4Z3Bvbl9vbnUsIHNldF9vbnVfc3RhdGUsIG9udV9zdGF0ZSwgQkNNT0xUX09OVV9PUEVSQVRJT05fSU5BQ1RJVkUpOworICAgIHJldHVybiBiY21vbHRfb3Blcl9zdWJtaXQocGFydG5lci0+ZGV2aWNlX2lkLCAmb3Blci5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfaGFuZGxlX29udV9lbmFibGVfY29tcGxldGVkKAorICAgIGNvbnN0IGJjbW9sdF9wc19wb24gKnBhcnRuZXIsCisgICAgY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfZW5hYmxlX2NvbXBsZXRlZCAqaW5kKQoreworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgcGFydG5lci0+cG9uX2lkLCBpbmQtPmtleS5vbnVfaWQgfTsKKyAgICBiY21vbHRfeGdwb25fb251X3NldF9vbnVfc3RhdGUgb3BlcjsKKworICAgIC8qIGRvbid0IHRyeSB0byBtaXJyb3IgYnJvYWRjYXN0IGVuYWJsZS9kaXNhYmxlICovCisgICAgaWYgKGtleS5vbnVfaWQgPT0gQkNNT0xUX1hHUE9OX09OVV9JRF9JTlZBTElEKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgfQorCisgICAgUFNfSU5GTygiJXM6IGVuYWJsaW5nIDwlZDolZD4gT05VICVkXG4iLCBfX0ZVTkNUSU9OX18sIHBhcnRuZXItPmRldmljZV9pZCwga2V5LnBvbl9uaSwga2V5Lm9udV9pZCk7CisKKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCB4Z3Bvbl9vbnUsIHNldF9vbnVfc3RhdGUsIGtleSk7CisgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX29udSwgc2V0X29udV9zdGF0ZSwgb251X3N0YXRlLCBCQ01PTFRfT05VX09QRVJBVElPTl9FTkFCTEUpOworICAgIHJldHVybiBiY21vbHRfb3Blcl9zdWJtaXQocGFydG5lci0+ZGV2aWNlX2lkLCAmb3Blci5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfaGFuZGxlX29udV9kaXNhYmxlX2NvbXBsZXRlZCgKKyAgICBjb25zdCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyLAorICAgIGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2Rpc2FibGVfY29tcGxldGVkICppbmQpCit7CisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyBwYXJ0bmVyLT5wb25faWQsIGluZC0+a2V5Lm9udV9pZCB9OworICAgIGJjbW9sdF94Z3Bvbl9vbnVfc2V0X29udV9zdGF0ZSBvcGVyOworCisgICAgLyogZG9uJ3QgdHJ5IHRvIG1pcnJvciBicm9hZGNhc3QgZW5hYmxlL2Rpc2FibGUgKi8KKyAgICBpZiAoa2V5Lm9udV9pZCA9PSBCQ01PTFRfWEdQT05fT05VX0lEX0lOVkFMSUQpCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisKKyAgICBQU19JTkZPKCIlczogZGlzYWJsaW5nIDwlZDolZD4gT05VICVkXG4iLCBfX0ZVTkNUSU9OX18sIHBhcnRuZXItPmRldmljZV9pZCwga2V5LnBvbl9uaSwga2V5Lm9udV9pZCk7CisKKyAgICBCQ01PTFRfT1BFUl9JTklUKCZvcGVyLCB4Z3Bvbl9vbnUsIHNldF9vbnVfc3RhdGUsIGtleSk7CisgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX29udSwgc2V0X29udV9zdGF0ZSwgb251X3N0YXRlLCBCQ01PTFRfT05VX09QRVJBVElPTl9ESVNBQkxFKTsKKyAgICByZXR1cm4gYmNtb2x0X29wZXJfc3VibWl0KHBhcnRuZXItPmRldmljZV9pZCwgJm9wZXIuaGRyKTsKK30KKworc3RhdGljIHZvaWQgcHNfYWxhcm1fc3RhdGVfaW5pdChiY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlICphbGFybV9zdGF0ZSkKK3sKKyAgICBhbGFybV9zdGF0ZS0+bG9zaSA9IEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOworICAgIGFsYXJtX3N0YXRlLT5sb2JpID0gQkNNT0xUX1NUQVRVU19OT19DSEFOR0U7CisgICAgYWxhcm1fc3RhdGUtPmxvcGNpID0gQkNNT0xUX1NUQVRVU19OT19DSEFOR0U7CisgICAgYWxhcm1fc3RhdGUtPmxvcGNpX21pY19lcnJvciA9IEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOworICAgIGFsYXJtX3N0YXRlLT5sb29jaSA9IEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOworICAgIGFsYXJtX3N0YXRlLT50aXdpID0gQkNNT0xUX1NUQVRVU19OT19DSEFOR0U7CisgICAgYWxhcm1fc3RhdGUtPmRvd2kgPSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRTsKKyAgICBhbGFybV9zdGF0ZS0+c3VmaSA9IEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOworICAgIGFsYXJtX3N0YXRlLT5zZmkgPSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRTsKKyAgICBhbGFybV9zdGF0ZS0+c2RpID0gQkNNT0xUX1NUQVRVU19OT19DSEFOR0U7CisgICAgYWxhcm1fc3RhdGUtPmRmaSA9IEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOworICAgIGFsYXJtX3N0YXRlLT5kZ2kgPSBCQ01PTFRfU1RBVFVTX05PX0NIQU5HRTsKKyAgICBhbGFybV9zdGF0ZS0+cHFzaSA9IEJDTU9MVF9TVEFUVVNfTk9fQ0hBTkdFOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfaGFuZGxlX29udV9hbGFybShjb25zdCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyLCBjb25zdCBiY21vbHRfeGdwb25fb251X29udV9hbGFybSAqaW5kKQoreworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgcGFydG5lci0+cG9uX2lkLCBpbmQtPmtleS5vbnVfaWQgfTsKKyAgICBiY21vbHRfeGdwb25fb251X2NmZyBjZmc7CisgICAgYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZSBhbGFybV9zdGF0ZTsKKworICAgIHBzX2FsYXJtX3N0YXRlX2luaXQoJmFsYXJtX3N0YXRlKTsKKyAgICBhbGFybV9zdGF0ZS5sb3NpID0gaW5kLT5kYXRhLm9udV9hbGFybS5sb3NpOworICAgIGFsYXJtX3N0YXRlLmxvYmkgPSBpbmQtPmRhdGEub251X2FsYXJtLmxvYmk7CisgICAgYWxhcm1fc3RhdGUubG9wY2kgPSBpbmQtPmRhdGEub251X2FsYXJtLmxvcGNpX21pc3M7CisgICAgYWxhcm1fc3RhdGUubG9wY2lfbWljX2Vycm9yID0gaW5kLT5kYXRhLm9udV9hbGFybS5sb3BjaV9taWNfZXJyb3I7CisKKyAgICBQU19JTkZPKAorICAgICAgICAiJXM6IHVwZGF0aW5nIE9OVSBhbGFybXMgPCVkOiVkPiBPTlUgJWRcbiIsCisgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgcGFydG5lci0+ZGV2aWNlX2lkLAorICAgICAgICBrZXkucG9uX25pLAorICAgICAgICBrZXkub251X2lkKTsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9vbnUsIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGFsYXJtX3N0YXRlLCBhbGFybV9zdGF0ZSk7CisgICAgcmV0dXJuIGJjbW9sdF9jZmdfc2V0KHBhcnRuZXItPmRldmljZV9pZCwgJmNmZy5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfaGFuZGxlX29udV9kb3dpKGNvbnN0IGJjbW9sdF9wc19wb24gKnBhcnRuZXIsIGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfZG93aSAqaW5kKQoreworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgcGFydG5lci0+cG9uX2lkLCBpbmQtPmtleS5vbnVfaWQgfTsKKyAgICBiY21vbHRfeGdwb25fb251X2NmZyBjZmc7CisgICAgYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZSBhbGFybV9zdGF0ZTsKKworICAgIFBTX0lORk8oCisgICAgICAgICIlczogdXBkYXRpbmcgRE9XaSA8JWQ6JWQ+IE9OVSAlZCAtPiAlZCAoRVFEICVkKVxuIiwKKyAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICBwYXJ0bmVyLT5kZXZpY2VfaWQsCisgICAgICAgIGtleS5wb25fbmksCisgICAgICAgIGtleS5vbnVfaWQsCisgICAgICAgIGluZC0+ZGF0YS5hbGFybV9zdGF0dXMsCisgICAgICAgIGluZC0+ZGF0YS5uZXdfZXFkKTsKKworICAgIHBzX2FsYXJtX3N0YXRlX2luaXQoJmFsYXJtX3N0YXRlKTsKKyAgICBhbGFybV9zdGF0ZS5kb3dpID0gaW5kLT5kYXRhLmFsYXJtX3N0YXR1czsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9vbnUsIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGFsYXJtX3N0YXRlLCBhbGFybV9zdGF0ZSk7CisKKyAgICBpZiAoaW5kLT5kYXRhLmFsYXJtX3N0YXR1cyA9PSBCQ01PTFRfU1RBVFVTX09OKQorICAgIHsKKyAgICAgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIHJhbmdpbmdfdGltZSwgaW5kLT5kYXRhLm5ld19lcWQpOworICAgIH0KKworICAgIHJldHVybiBiY21vbHRfY2ZnX3NldChwYXJ0bmVyLT5kZXZpY2VfaWQsICZjZmcuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9vbnVfc2ZpKGNvbnN0IGJjbW9sdF9wc19wb24gKnBhcnRuZXIsIGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc2ZpICppbmQpCit7CisgICAgYmNtb2x0X3hncG9uX29udV9rZXkga2V5ID0geyBwYXJ0bmVyLT5wb25faWQsIGluZC0+a2V5Lm9udV9pZCB9OworICAgIGJjbW9sdF94Z3Bvbl9vbnVfY2ZnIGNmZzsKKyAgICBiY21vbHRfeGdwb25fb251X2FsYXJtX3N0YXRlIGFsYXJtX3N0YXRlOworCisgICAgUFNfSU5GTygKKyAgICAgICAgIiVzOiB1cGRhdGluZyBTRkkgPCVkOiVkPiBPTlUgJWQgLT4gJWRcbiIsCisgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgcGFydG5lci0+ZGV2aWNlX2lkLAorICAgICAgICBrZXkucG9uX25pLAorICAgICAgICBrZXkub251X2lkLAorICAgICAgICBpbmQtPmRhdGEuYWxhcm1fc3RhdHVzKTsKKworICAgIHBzX2FsYXJtX3N0YXRlX2luaXQoJmFsYXJtX3N0YXRlKTsKKyAgICBhbGFybV9zdGF0ZS5zZmkgPSBpbmQtPmRhdGEuYWxhcm1fc3RhdHVzOworCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX29udSwga2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgYWxhcm1fc3RhdGUsIGFsYXJtX3N0YXRlKTsKKyAgICByZXR1cm4gYmNtb2x0X2NmZ19zZXQocGFydG5lci0+ZGV2aWNlX2lkLCAmY2ZnLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfb251X3NkaShjb25zdCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyLCBjb25zdCBiY21vbHRfeGdwb25fb251X3NkaSAqaW5kKQoreworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgcGFydG5lci0+cG9uX2lkLCBpbmQtPmtleS5vbnVfaWQgfTsKKyAgICBiY21vbHRfeGdwb25fb251X2NmZyBjZmc7CisgICAgYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZSBhbGFybV9zdGF0ZTsKKworICAgIFBTX0lORk8oCisgICAgICAgICIlczogdXBkYXRpbmcgU0RpIDwlZDolZD4gT05VICVkIC0+ICVkXG4iLAorICAgICAgICBfX0ZVTkNUSU9OX18sCisgICAgICAgIHBhcnRuZXItPmRldmljZV9pZCwKKyAgICAgICAga2V5LnBvbl9uaSwKKyAgICAgICAga2V5Lm9udV9pZCwKKyAgICAgICAgaW5kLT5kYXRhLmFsYXJtX3N0YXR1cyk7CisKKyAgICBwc19hbGFybV9zdGF0ZV9pbml0KCZhbGFybV9zdGF0ZSk7CisgICAgYWxhcm1fc3RhdGUuc2RpID0gaW5kLT5kYXRhLmFsYXJtX3N0YXR1czsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9vbnUsIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGFsYXJtX3N0YXRlLCBhbGFybV9zdGF0ZSk7CisgICAgcmV0dXJuIGJjbW9sdF9jZmdfc2V0KHBhcnRuZXItPmRldmljZV9pZCwgJmNmZy5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfaGFuZGxlX29udV9kZmkoY29uc3QgYmNtb2x0X3BzX3BvbiAqcGFydG5lciwgY29uc3QgYmNtb2x0X3hncG9uX29udV9kZmkgKmluZCkKK3sKKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7IHBhcnRuZXItPnBvbl9pZCwgaW5kLT5rZXkub251X2lkIH07CisgICAgYmNtb2x0X3hncG9uX29udV9jZmcgY2ZnOworICAgIGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGUgYWxhcm1fc3RhdGU7CisKKyAgICBQU19JTkZPKAorICAgICAgICAiJXM6IHVwZGF0aW5nIERGaSA8JWQ6JWQ+IE9OVSAlZCAtPiAlZFxuIiwKKyAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICBwYXJ0bmVyLT5kZXZpY2VfaWQsCisgICAgICAgIGtleS5wb25fbmksCisgICAgICAgIGtleS5vbnVfaWQsCisgICAgICAgIGluZC0+ZGF0YS5hbGFybV9zdGF0dXMpOworCisgICAgcHNfYWxhcm1fc3RhdGVfaW5pdCgmYWxhcm1fc3RhdGUpOworICAgIGFsYXJtX3N0YXRlLmRmaSA9IGluZC0+ZGF0YS5hbGFybV9zdGF0dXM7CisKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgeGdwb25fb251LCBrZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgeGdwb25fb251LCBhbGFybV9zdGF0ZSwgYWxhcm1fc3RhdGUpOworICAgIHJldHVybiBiY21vbHRfY2ZnX3NldChwYXJ0bmVyLT5kZXZpY2VfaWQsICZjZmcuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHBzX2hhbmRsZV9vbnVfc3VmaShjb25zdCBiY21vbHRfcHNfcG9uICpwYXJ0bmVyLCBjb25zdCBiY21vbHRfeGdwb25fb251X3N1ZmkgKmluZCkKK3sKKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7IHBhcnRuZXItPnBvbl9pZCwgaW5kLT5rZXkub251X2lkIH07CisgICAgYmNtb2x0X3hncG9uX29udV9jZmcgY2ZnOworICAgIGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGUgYWxhcm1fc3RhdGU7CisKKyAgICBQU19JTkZPKAorICAgICAgICAiJXM6IHVwZGF0aW5nIFNVRmkgPCVkOiVkPiBPTlUgJWQgLT4gJWRcbiIsCisgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgcGFydG5lci0+ZGV2aWNlX2lkLAorICAgICAgICBrZXkucG9uX25pLAorICAgICAgICBrZXkub251X2lkLAorICAgICAgICBpbmQtPmRhdGEuYWxhcm1fc3RhdHVzKTsKKworICAgIHBzX2FsYXJtX3N0YXRlX2luaXQoJmFsYXJtX3N0YXRlKTsKKyAgICBhbGFybV9zdGF0ZS5zdWZpID0gaW5kLT5kYXRhLmFsYXJtX3N0YXR1czsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCB4Z3Bvbl9vbnUsIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX1NFVCgmY2ZnLCB4Z3Bvbl9vbnUsIGFsYXJtX3N0YXRlLCBhbGFybV9zdGF0ZSk7CisgICAgcmV0dXJuIGJjbW9sdF9jZmdfc2V0KHBhcnRuZXItPmRldmljZV9pZCwgJmNmZy5oZHIpOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcHNfaGFuZGxlX29udV90aXdpKGNvbnN0IGJjbW9sdF9wc19wb24gKnBhcnRuZXIsIGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfdGl3aSAqaW5kKQoreworICAgIGJjbW9sdF94Z3Bvbl9vbnVfa2V5IGtleSA9IHsgcGFydG5lci0+cG9uX2lkLCBpbmQtPmtleS5vbnVfaWQgfTsKKyAgICBiY21vbHRfeGdwb25fb251X2NmZyBjZmc7CisgICAgYmNtb2x0X3hncG9uX29udV9hbGFybV9zdGF0ZSBhbGFybV9zdGF0ZTsKKworICAgIFBTX0lORk8oCisgICAgICAgICIlczogdXBkYXRpbmcgVElXaSA8JWQ6JWQ+IE9OVSAlZCAtPiAlZFxuIiwKKyAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICBwYXJ0bmVyLT5kZXZpY2VfaWQsCisgICAgICAgIGtleS5wb25fbmksCisgICAgICAgIGtleS5vbnVfaWQsCisgICAgICAgIGluZC0+ZGF0YS5hbGFybV9zdGF0dXMpOworCisgICAgcHNfYWxhcm1fc3RhdGVfaW5pdCgmYWxhcm1fc3RhdGUpOworICAgIGFsYXJtX3N0YXRlLnRpd2kgPSBpbmQtPmRhdGEuYWxhcm1fc3RhdHVzOworCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX29udSwga2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgYWxhcm1fc3RhdGUsIGFsYXJtX3N0YXRlKTsKKyAgICByZXR1cm4gYmNtb2x0X2NmZ19zZXQocGFydG5lci0+ZGV2aWNlX2lkLCAmY2ZnLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfb251X2xvb2NpKGNvbnN0IGJjbW9sdF9wc19wb24gKnBhcnRuZXIsIGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfbG9vY2kgKmluZCkKK3sKKyAgICBiY21vbHRfeGdwb25fb251X2tleSBrZXkgPSB7IHBhcnRuZXItPnBvbl9pZCwgaW5kLT5rZXkub251X2lkIH07CisgICAgYmNtb2x0X3hncG9uX29udV9jZmcgY2ZnOworICAgIGJjbW9sdF94Z3Bvbl9vbnVfYWxhcm1fc3RhdGUgYWxhcm1fc3RhdGU7CisKKyAgICBQU19JTkZPKAorICAgICAgICAiJXM6IHVwZGF0aW5nIExPT0NpIDwlZDolZD4gT05VICVkIC0+ICVkXG4iLAorICAgICAgICBfX0ZVTkNUSU9OX18sCisgICAgICAgIHBhcnRuZXItPmRldmljZV9pZCwKKyAgICAgICAga2V5LnBvbl9uaSwKKyAgICAgICAga2V5Lm9udV9pZCwKKyAgICAgICAgaW5kLT5kYXRhLmFsYXJtX3N0YXR1cyk7CisKKyAgICBwc19hbGFybV9zdGF0ZV9pbml0KCZhbGFybV9zdGF0ZSk7CisgICAgYWxhcm1fc3RhdGUubG9vY2kgPSBpbmQtPmRhdGEuYWxhcm1fc3RhdHVzOworCisgICAgQkNNT0xUX0NGR19JTklUKCZjZmcsIHhncG9uX29udSwga2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIHhncG9uX29udSwgYWxhcm1fc3RhdGUsIGFsYXJtX3N0YXRlKTsKKyAgICByZXR1cm4gYmNtb2x0X2NmZ19zZXQocGFydG5lci0+ZGV2aWNlX2lkLCAmY2ZnLmhkcik7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyBwc19oYW5kbGVfYWxsb2NfaWRfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQoCisgICAgY29uc3QgYmNtb2x0X3BzX3BvbiAqcGFydG5lciwKKyAgICBjb25zdCBiY21vbHRfeGdwb25fYWxsb2NfY29uZmlndXJhdGlvbl9jb21wbGV0ZWQgKmluZCkKK3sKKyAgICBiY21vbHRfeGdwb25fYWxsb2Nfa2V5IGtleSA9IHsgcGFydG5lci0+cG9uX2lkLCBpbmQtPmtleS5hbGxvY19pZCB9OworICAgIGJjbW9sdF94Z3Bvbl9hbGxvY19zZXRfc3RhdGUgb3BlcjsKKworICAgIEJDTU9MVF9PUEVSX0lOSVQoJm9wZXIsIHhncG9uX2FsbG9jLCBzZXRfc3RhdGUsIGtleSk7CisKKyAgICBpZiAoaW5kLT5kYXRhLm5ld19zdGF0ZSA9PSBCQ01PTFRfQUxMT0NfU1RBVEVfQUNUSVZFKQorICAgIHsKKyAgICAgICAgLyogb25seSByZWFjdCB0byBzdWNjZXNzIGluZGljYXRpb25zICovCisgICAgICAgIGlmIChpbmQtPmRhdGEuc3RhdHVzICE9IEJDTU9MVF9SRVNVTFRfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7CisgICAgICAgIH0KKworICAgICAgICBQU19JTkZPKCIlczogYWN0aXZhdGluZyA8JWQ6JWQ+IGFsbG9jICVkXG4iLCBfX0ZVTkNUSU9OX18sIHBhcnRuZXItPmRldmljZV9pZCwga2V5LnBvbl9uaSwga2V5LmFsbG9jX2lkKTsKKyAgICAgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJm9wZXIsIHhncG9uX2FsbG9jLCBzZXRfc3RhdGUsIHN0YXRlLCBCQ01PTFRfQUxMT0NfT1BFUkFUSU9OX0FDVElWQVRFKTsKKyAgICB9CisgICAgZWxzZSBpZiAoaW5kLT5kYXRhLm5ld19zdGF0ZSA9PSBCQ01PTFRfQUxMT0NfU1RBVEVfSU5BQ1RJVkUpCisgICAgeworICAgICAgICBQU19JTkZPKCIlczogZGVhY3RpdmF0aW5nIDwlZDolZD4gYWxsb2MgJWRcbiIsIF9fRlVOQ1RJT05fXywgcGFydG5lci0+ZGV2aWNlX2lkLCBrZXkucG9uX25pLCBrZXkuYWxsb2NfaWQpOworICAgICAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmb3BlciwgeGdwb25fYWxsb2MsIHNldF9zdGF0ZSwgc3RhdGUsIEJDTU9MVF9BTExPQ19PUEVSQVRJT05fREVBQ1RJVkFURSk7CisgICAgfQorICAgIGVsc2UgLyogaW5kLT5kYXRhLm5ld19zdGF0ZSBpcyBzb21ldGhpbmcgZWxzZSAoZS5nLiB1bnByb3Zpc2lvbmVkLCBpZiB0aGUgYWxsb2Mgd2FzIGNsZWFyZWQpICovCisgICAgeworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisKKyAgICByZXR1cm4gYmNtb2x0X29wZXJfc3VibWl0KHBhcnRuZXItPmRldmljZV9pZCwgJm9wZXIuaGRyKTsKK30KKworYmNtb3NfZXJybm8gcHNfcHJvY2Vzc19pbmRfeGdwb24oY29uc3QgYmNtb2x0X3BzX3BvbiAqcG9uLCBjb25zdCBiY21vbHRfYXV0byAqaW5kKQoreworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfcHNfcG9uX3N0YXRlIHN0YXRlOworICAgIGJjbW9sdF9wc19wb24gcGFydG5lcjsKKyAgICBiY21vbHRfcHNfZ2xvYmFsX2NmZyBnbG9iYWxfY2ZnOworCisgICAgZXJyID0gYmNtb2x0X3BzX2dsb2JhbF9jZmdfZ2V0KCZnbG9iYWxfY2ZnKTsKKyAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmIChnbG9iYWxfY2ZnLm1pcnJvcl9tb2RlICE9IEJDTU9MVF9QU19NSVJST1JfTU9ERV9BVVRPICYmCisgICAgICAgIGluZC0+aGRyLnN1Ymdyb3VwICE9IEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX0xPUykKKyAgICB7CisgICAgICAgIC8qIG9ubHkgaGFuZGxlIG1vc3QgaW5kaWNhdGlvbnMgd2hpbGUgaW4gbWlycm9yIG1vZGUgJ2F1dG8nLCBidXQgcGVyZm9ybSBhIHN3aXRjaG92ZXIgb24gTG9TIGluIGFueSBjYXNlICAqLworICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsKKyAgICB9CisKKyAgICBlcnIgPSBiY21vbHRfcHNfcG9uX3N0YXRlX2dldChwb24sICZzdGF0ZSwgJnBhcnRuZXIpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKHN0YXRlICE9IEJDTU9MVF9QU19QT05fU1RBVEVfV09SS0lORykKKyAgICB7CisgICAgICAgIHJldHVybiBCQ01fRVJSX09LOyAvKiBpZ25vcmUgaW5kaWNhdGlvbnMgZnJvbSBQT05zIHRoYXQgYXJlbid0IHByb3RlY3RlZCB3b3JraW5nICovCisgICAgfQorCisgICAgc3dpdGNoIChpbmQtPmhkci5vYmpfdHlwZSkKKyAgICB7CisgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1hHUE9OX05JOgorICAgICAgICBzd2l0Y2ggKGluZC0+aGRyLnN1Ymdyb3VwKQorICAgICAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfTE9TOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9uaV9sb3MoJmdsb2JhbF9jZmcsIHBvbiwgKChjb25zdCBiY21vbHRfeGdwb25fbmlfbG9zICopaW5kKSk7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfU1RBVEVfQ0hBTkdFX0NPTVBMRVRFRDoKKyAgICAgICAgICAgIHJldHVybiBwc19oYW5kbGVfbmlfc3RhdGVfY2hhbmdlZCgmcGFydG5lciwgKChjb25zdCBiY21vbHRfeGdwb25fbmlfc3RhdGVfY2hhbmdlX2NvbXBsZXRlZCAqKWluZCkpOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9OSV9BVVRPX0lEX1BST1RFQ1RJT05fU1dJVENISU5HX1RSQUZGSUNfUkVTVU1FOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9uaV90cmFmZmljX3Jlc3VtZShwb24sICgoY29uc3QgYmNtb2x0X3hncG9uX25pX3Byb3RlY3Rpb25fc3dpdGNoaW5nX3RyYWZmaWNfcmVzdW1lICopaW5kKSk7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX05JX0FVVE9fSURfUFJPVEVDVElPTl9TV0lUQ0hJTkdfT05VU19SQU5HRUQ6CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX25pX29udXNfcmFuZ2VkKCZwYXJ0bmVyLCAoKGNvbnN0IGJjbW9sdF94Z3Bvbl9uaV9wcm90ZWN0aW9uX3N3aXRjaGluZ19vbnVzX3JhbmdlZCAqKWluZCkpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJDTV9FUlJfT0s7IC8qIHNpbGVudGx5IGlnbm9yZSBhbGwgb3RoZXIgTkkgaW5kaWNhdGlvbnMgKi8KKyAgICAgICAgfQorCisgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1hHUE9OX09OVToKKyAgICAgICAgc3dpdGNoIChpbmQtPmhkci5zdWJncm91cCkKKyAgICAgICAgeworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9SQU5HSU5HX0NPTVBMRVRFRDoKKyAgICAgICAgICAgIHJldHVybiBwc19oYW5kbGVfb251X3JhbmdpbmdfY29tcGxldGVkKCZwYXJ0bmVyLCAoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfcmFuZ2luZ19jb21wbGV0ZWQgKilpbmQpKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfS0VZX0VYQ0hBTkdFX0NPTVBMRVRFRDoKKyAgICAgICAgICAgIHJldHVybiBwc19oYW5kbGVfb251X2tleV9leGNoYW5nZV9jb21wbGV0ZWQoCisgICAgICAgICAgICAgICAgcG9uLAorICAgICAgICAgICAgICAgICZwYXJ0bmVyLAorICAgICAgICAgICAgICAgICgoY29uc3QgYmNtb2x0X3hncG9uX29udV9rZXlfZXhjaGFuZ2VfY29tcGxldGVkICopaW5kKSk7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09OVV9BQ1RJVkFUSU9OX0NPTVBMRVRFRDoKKyAgICAgICAgICAgIHJldHVybiBwc19oYW5kbGVfb251X2FjdGl2YXRpb25fY29tcGxldGVkKAorICAgICAgICAgICAgICAgIHBvbiwKKyAgICAgICAgICAgICAgICAmcGFydG5lciwKKyAgICAgICAgICAgICAgICAoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2FjdGl2YXRpb25fY29tcGxldGVkICopaW5kKSk7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX09OVV9ERUFDVElWQVRJT05fQ09NUExFVEVEOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9vbnVfZGVhY3RpdmF0aW9uX2NvbXBsZXRlZCgKKyAgICAgICAgICAgICAgICAmcGFydG5lciwKKyAgICAgICAgICAgICAgICAoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2RlYWN0aXZhdGlvbl9jb21wbGV0ZWQgKilpbmQpKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT05VX0VOQUJMRV9DT01QTEVURUQ6CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX29udV9lbmFibGVfY29tcGxldGVkKCZwYXJ0bmVyLCAoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfb251X2VuYWJsZV9jb21wbGV0ZWQgKilpbmQpKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT05VX0RJU0FCTEVfQ09NUExFVEVEOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9vbnVfZGlzYWJsZV9jb21wbGV0ZWQoJnBhcnRuZXIsICgoY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfZGlzYWJsZV9jb21wbGV0ZWQgKilpbmQpKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfT05VX0FMQVJNOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9vbnVfYWxhcm0oJnBhcnRuZXIsICgoY29uc3QgYmNtb2x0X3hncG9uX29udV9vbnVfYWxhcm0gKilpbmQpKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfRE9XSToKKyAgICAgICAgICAgIHJldHVybiBwc19oYW5kbGVfb251X2Rvd2koJnBhcnRuZXIsICgoY29uc3QgYmNtb2x0X3hncG9uX29udV9kb3dpICopaW5kKSk7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1NGSToKKyAgICAgICAgICAgIHJldHVybiBwc19oYW5kbGVfb251X3NmaSgmcGFydG5lciwgKChjb25zdCBiY21vbHRfeGdwb25fb251X3NmaSAqKWluZCkpOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9TREk6CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX29udV9zZGkoJnBhcnRuZXIsICgoY29uc3QgYmNtb2x0X3hncG9uX29udV9zZGkgKilpbmQpKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfREZJOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9vbnVfZGZpKCZwYXJ0bmVyLCAoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfZGZpICopaW5kKSk7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX09OVV9BVVRPX0lEX1NVRkk6CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX29udV9zdWZpKCZwYXJ0bmVyLCAoKGNvbnN0IGJjbW9sdF94Z3Bvbl9vbnVfc3VmaSAqKWluZCkpOworICAgICAgICBjYXNlIEJDTU9MVF9YR1BPTl9PTlVfQVVUT19JRF9USVdJOgorICAgICAgICAgICAgcmV0dXJuIHBzX2hhbmRsZV9vbnVfdGl3aSgmcGFydG5lciwgKChjb25zdCBiY21vbHRfeGdwb25fb251X3Rpd2kgKilpbmQpKTsKKyAgICAgICAgY2FzZSBCQ01PTFRfWEdQT05fT05VX0FVVE9fSURfTE9PQ0k6CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX29udV9sb29jaSgmcGFydG5lciwgKChjb25zdCBiY21vbHRfeGdwb25fb251X2xvb2NpICopaW5kKSk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsgLyogc2lsZW50bHkgaWdub3JlIGFsbCBvdGhlciBPTlUgaW5kaWNhdGlvbnMgKi8KKyAgICAgICAgfQorCisgICAgY2FzZSBCQ01PTFRfT0JKX0lEX1hHUE9OX0FMTE9DOgorICAgICAgICBzd2l0Y2ggKGluZC0+aGRyLnN1Ymdyb3VwKQorICAgICAgICB7CisgICAgICAgIGNhc2UgQkNNT0xUX1hHUE9OX0FMTE9DX0FVVE9fSURfQ09ORklHVVJBVElPTl9DT01QTEVURUQ6CisgICAgICAgICAgICByZXR1cm4gcHNfaGFuZGxlX2FsbG9jX2lkX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkKAorICAgICAgICAgICAgICAgICZwYXJ0bmVyLAorICAgICAgICAgICAgICAgICgoY29uc3QgYmNtb2x0X3hncG9uX2FsbG9jX2NvbmZpZ3VyYXRpb25fY29tcGxldGVkICopaW5kKSk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkNNX0VSUl9PSzsgLyogc2lsZW50bHkgaWdub3JlIGFsbCBvdGhlciBhbGxvYyBpbmRpY2F0aW9ucyAqLworICAgICAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQkNNX0VSUl9OT1RfU1VQUE9SVEVEOyAvKiBzb21lb25lIGVsc2UgbmVlZHMgdG8gaGFuZGxlIHRoaXMgaW5kaWNhdGlvbiAqLworICAgIH0KK30KKworYmNtb3NfZXJybm8gcHNfbW92ZV90b19zdGFuZGJ5X3hncG9uKGNvbnN0IGJjbW9sdF9wc19wb24gKnBvbikKK3sKKyAgICBiY21vbHRfeGdwb25fbmlfc2V0X3Bvbl9zdGF0ZSBzZXRfcG9uX3N0YXRlOworICAgIGJjbW9sdF94Z3Bvbl9uaV9rZXkga2V5ID0geyAoYmNtb2x0X3hncG9uX25pKXBvbi0+cG9uX2lkIH07CisKKyAgICBCQ01PTFRfT1BFUl9JTklUKCZzZXRfcG9uX3N0YXRlLCB4Z3Bvbl9uaSwgc2V0X3Bvbl9zdGF0ZSwga2V5KTsKKyAgICBCQ01PTFRfT1BFUl9QUk9QX1NFVCgmc2V0X3Bvbl9zdGF0ZSwgeGdwb25fbmksIHNldF9wb25fc3RhdGUsIHBvbl9zdGF0ZSwgQkNNT0xUX1BPTl9PUEVSQVRJT05fQUNUSVZFX1NUQU5EQlkpOworICAgIHJldHVybiBiY21vbHRfb3Blcl9zdWJtaXQocG9uLT5kZXZpY2VfaWQsICZzZXRfcG9uX3N0YXRlLmhkcik7Cit9CisKK2JjbW9zX2Vycm5vIHBzX21vdmVfdG9fd29ya2luZ194Z3Bvbihjb25zdCBiY21vbHRfcHNfcG9uICpwb24pCit7CisgICAgYmNtb2x0X3hncG9uX25pX3NldF9wb25fc3RhdGUgc2V0X3Bvbl9zdGF0ZTsKKyAgICBiY21vbHRfeGdwb25fbmlfa2V5IGtleSA9IHsgKGJjbW9sdF94Z3Bvbl9uaSlwb24tPnBvbl9pZCB9OworCisgICAgQkNNT0xUX09QRVJfSU5JVCgmc2V0X3Bvbl9zdGF0ZSwgeGdwb25fbmksIHNldF9wb25fc3RhdGUsIGtleSk7CisgICAgQkNNT0xUX09QRVJfUFJPUF9TRVQoJnNldF9wb25fc3RhdGUsIHhncG9uX25pLCBzZXRfcG9uX3N0YXRlLCBwb25fc3RhdGUsIEJDTU9MVF9QT05fT1BFUkFUSU9OX0FDVElWRV9XT1JLSU5HKTsKKyAgICByZXR1cm4gYmNtb2x0X29wZXJfc3VibWl0KHBvbi0+ZGV2aWNlX2lkLCAmc2V0X3Bvbl9zdGF0ZS5oZHIpOworfQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9yZW1vdGVfbG9nZ2VyL01ha2VmaWxlIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9yZW1vdGVfbG9nZ2VyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZTdkZjYKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3JlbW90ZV9sb2dnZXIvTWFrZWZpbGUKQEAgLTAsMCArMSwxNSBAQAorIyBVc2VyIGFwcGxpY2F0aW9uIHRvIGNvcHkgbG9nIHByaW50cyBmcm9tIHRoZSBkZXZpY2UgdG8gYSBsb2NhbCBmaWxlIG9uIHRoZSBob3N0CisKK2lmZXEgKCIkKEVOQUJMRV9MT0cpIiwgInkiKQorICAgIGlmZXEgKCIkKEVOQUJMRV9DTEkpIiwgInkiKQorCU1PRF9OQU1FID0gYmNtX3VzZXJfYXBwbF9yZW1vdGVfbG9nZ2VyCisJTU9EX1RZUEUgPSBsaWIKKwlNT0RfREVQUyA9IGhvc3RfYXBpIGRldl9sb2cKKwlpZmVxICgiJChPU19LRVJORUwpIiwgImxpbnV4IikKKwkgICAgTU9EX0RFUFMgKz0gZGV2X2xvZ19saW51eAorCWVuZGlmCisJc3JjcyA9IGJjbW9sdF91c2VyX2FwcGxfcmVtb3RlX2xvZ2dlci5jIFwKKwkgICAgICAgYmNtb2x0X3VzZXJfYXBwbF9yZW1vdGVfbG9nZ2VyX2NsaS5jCisgICAgZW5kaWYKK2VuZGlmCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvcmVtb3RlX2xvZ2dlci9iY21vbHRfdXNlcl9hcHBsX3JlbW90ZV9sb2dnZXIuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvcmVtb3RlX2xvZ2dlci9iY21vbHRfdXNlcl9hcHBsX3JlbW90ZV9sb2dnZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2JlZGRmCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9yZW1vdGVfbG9nZ2VyL2JjbW9sdF91c2VyX2FwcGxfcmVtb3RlX2xvZ2dlci5jCkBAIC0wLDAgKzEsMjMyIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE2OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIEJyb2FkY29tIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuKGMpIDIwMTYgQnJvYWRjb20KKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworVW5sZXNzIHlvdSBhbmQgQnJvYWRjb20gZXhlY3V0ZSBhIHNlcGFyYXRlIHdyaXR0ZW4gc29mdHdhcmUgbGljZW5zZQorYWdyZWVtZW50IGdvdmVybmluZyB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgdGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisodGhlICJHUEwiKSwgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYnJvYWRjb20uY29tL2xpY2Vuc2VzL0dQTHYyLnBocCwKK3dpdGggdGhlIGZvbGxvd2luZyBhZGRlZCB0byBzdWNoIGxpY2Vuc2U6CisKKyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIHNvZnR3YXJlIGdpdmUKKyAgIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBzb2Z0d2FyZSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMsIGFuZAorICAgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgdGVybXMgb2YgeW91cgorICAgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZCBpbmRlcGVuZGVudAorICAgbW9kdWxlLCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdCBtb2R1bGUuCisgICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSB0aGlzCisgICBzb2Z0d2FyZS4gIFRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBkb2VzIG5vdCBhcHBseSB0byBhbnkgbW9kaWZpY2F0aW9ucworICAgb2YgdGhlIHNvZnR3YXJlLgorCitOb3Qgd2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBtYXkgeW91IGNvbWJpbmUKK3RoaXMgc29mdHdhcmUgaW4gYW55IHdheSB3aXRoIGFueSBvdGhlciBCcm9hZGNvbSBzb2Z0d2FyZSBwcm92aWRlZAordW5kZXIgYSBsaWNlbnNlIG90aGVyIHRoYW4gdGhlIEdQTCwgd2l0aG91dCBCcm9hZGNvbSdzIGV4cHJlc3MgcHJpb3IKK3dyaXR0ZW4gY29uc2VudC4KKworOj4KKyovCisKKyNpbmNsdWRlIDxiY21vc19zeXN0ZW0uaD4KKyNpbmNsdWRlIDxiY21fZGV2X2xvZy5oPgorI2luY2x1ZGUgPGJjbW9sdF9hcGkuaD4KKyNpbmNsdWRlIDxiY21vbHRfbW9kZWxfdHlwZXMuaD4KKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX3JlbW90ZV9sb2dnZXIuaCIKKworc3RhdGljIHN0cnVjdAoreworICAgIEZJTEUgKmZpbGVfaGFuZGxlOworICAgIHVpbnQ2NF90IGZpbGVfc2l6ZTsKKyAgICBiY21vbHRfcmVtb3RlX2xvZ2dlcl9jZmcgY2ZnOworICAgIGJjbW9zX3Rhc2sgdGFzazsKKyAgICBiY21vc190aW1lciB0aW1lcjsKKyAgICBkZXZfbG9nX2lkIGxvZ19pZDsKK30gcmVtb3RlX2xvZ2dlcltCQ01UUl9NQVhfT0xUU10gPSB7fTsKKworc3RhdGljIGJjbW9zX3RpbWVyX3JjIHJlbW90ZV9sb2dnZXJfdGltZXJfaGFuZGxlcihiY21vc190aW1lciAqdGltZXIsIGxvbmcgZGF0YSkKK3sKKyAgICBiY21vbHRfZGV2aWQgZGV2aWNlID0gKGJjbW9sdF9kZXZpZClkYXRhOworICAgIGludCB3cml0dGVuOworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfbG9nZ2VyX2NmZyBjZmc7CisgICAgYmNtb2x0X2xvZ2dlcl9rZXkga2V5ID0geyAuZmlsZV9pZCA9IEJDTU9MVF9MT0dfRklMRV9JRF9ERFIgfTsKKworICAgIEJDTU9MVF9DRkdfSU5JVCgmY2ZnLCBsb2dnZXIsIGtleSk7CisgICAgQkNNT0xUX0NGR19QUk9QX0dFVCgmY2ZnLCBsb2dnZXIsIGJ1ZmZlcik7CisgICAgZXJyID0gYmNtb2x0X2NmZ19nZXQoZGV2aWNlLCAmY2ZnLmhkcik7CisgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgcmVtb3RlX2xvZ2dlcltkZXZpY2VdLmxvZ19pZCwgIkxvZ2dlciBnZXQgQVBJIHJldHVybmVkICclcycgKCVkKVxuIiwgYmNtb3Nfc3RyZXJyb3IoZXJyKSwgZXJyKTsKKyAgICAgICAgYmNtb2x0X3JlbW90ZV9sb2dnZXJfYXBwbF9zdG9wKGRldmljZSk7CisgICAgICAgIHJldHVybiBCQ01PU19USU1FUl9PSzsKKyAgICB9CisKKyAgICB3cml0dGVuID0gZnByaW50ZigKKyAgICAgICAgcmVtb3RlX2xvZ2dlcltkZXZpY2VdLmZpbGVfaGFuZGxlLAorICAgICAgICAiJS4qcyIsCisgICAgICAgIChpbnQpc2l6ZW9mKGNmZy5kYXRhLmJ1ZmZlci5idWZmKSwKKyAgICAgICAgY2ZnLmRhdGEuYnVmZmVyLmJ1ZmYpOworICAgIGlmICh3cml0dGVuIDwgMCkKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIHJlbW90ZV9sb2dnZXJbZGV2aWNlXS5sb2dfaWQsICJGaWxlIHdyaXRlIHJldHVybmVkICVkXG4iLCB3cml0dGVuKTsKKyAgICAgICAgYmNtb2x0X3JlbW90ZV9sb2dnZXJfYXBwbF9zdG9wKGRldmljZSk7CisgICAgICAgIHJldHVybiBCQ01PU19USU1FUl9PSzsKKyAgICB9CisKKyAgICBmZmx1c2gocmVtb3RlX2xvZ2dlcltkZXZpY2VdLmZpbGVfaGFuZGxlKTsKKworICAgIC8qIENoZWNrIHRvIHNlZSBpZiB3ZSB3aWxsIGV4Y2VlZCB0aGUgbWF4IGZpbGUgc2l6ZSBuZXh0IHRpbWUgd2Ugd3JpdGUgYSBjaHVuay4gKi8KKyAgICByZW1vdGVfbG9nZ2VyW2RldmljZV0uZmlsZV9zaXplICs9IHdyaXR0ZW47CisgICAgaWYgKHJlbW90ZV9sb2dnZXJbZGV2aWNlXS5maWxlX3NpemUgKyBzaXplb2YoY2ZnLmRhdGEuYnVmZmVyLmJ1ZmYpID4gcmVtb3RlX2xvZ2dlcltkZXZpY2VdLmNmZy5tYXhfZmlsZV9zaXplKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChyZW1vdGVfbG9nZ2VyW2RldmljZV0uY2ZnLm1heF9maWxlX3NpemVfcmVhY2hlZF9iZWhhdmlvcikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVNT1RFX0xPR0dFUl9GSUxFX1NJWkVfUkVBQ0hFRF9CRUhBVklPUl9TVE9QOgorICAgICAgICAgICAgICAgIEJDTV9MT0coSU5GTywgcmVtb3RlX2xvZ2dlcltkZXZpY2VdLmxvZ19pZCwgIk1heCBmaWxlIHNpemUgcmVhY2hlZCAtIHJlbW90ZSBsb2dnZXIgc3RvcHBlZFxuIik7CisgICAgICAgICAgICAgICAgYmNtb2x0X3JlbW90ZV9sb2dnZXJfYXBwbF9zdG9wKGRldmljZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJDTU9TX1RJTUVSX09LOworICAgICAgICAgICAgY2FzZSBCQ01PTFRfUkVNT1RFX0xPR0dFUl9GSUxFX1NJWkVfUkVBQ0hFRF9CRUhBVklPUl9DTEVBUjoKKyAgICAgICAgICAgICAgICBCQ01fTE9HKElORk8sIHJlbW90ZV9sb2dnZXJbZGV2aWNlXS5sb2dfaWQsICJNYXggZmlsZSBzaXplIHJlYWNoZWQgLSBsb2cgZmlsZSBjbGVhcmVkXG4iKTsKKyAgICAgICAgICAgICAgICAvKiB0aGUgZWFzaWVzdCB3YXkgdG8gY2xlYXIgdGhlIGZpbGUgaXMgdG8gY2xvc2UvcmUtb3BlbiBpdCAqLworICAgICAgICAgICAgICAgIGZjbG9zZShyZW1vdGVfbG9nZ2VyW2RldmljZV0uZmlsZV9oYW5kbGUpOworICAgICAgICAgICAgICAgIHJlbW90ZV9sb2dnZXJbZGV2aWNlXS5maWxlX2hhbmRsZSA9IGZvcGVuKHJlbW90ZV9sb2dnZXJbZGV2aWNlXS5jZmcuZmlsZW5hbWUsICJ3Iik7CisgICAgICAgICAgICAgICAgQlVHX09OKHJlbW90ZV9sb2dnZXJbZGV2aWNlXS5maWxlX2hhbmRsZSA9PSBOVUxMKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY2ZnLmRhdGEuYnVmZmVyLm1zZ190b19yZWFkID09IDApCisgICAgeworICAgICAgICAvKiBUaGVyZSBhcmUgbm8gbW9yZSBtZXNzYWdlcyB0byByZWFkIHJpZ2h0IG5vdywgd2FpdCBmb3IgdGhlIGVudGlyZSBwb2xsaW5nIGludGVydmFsLiAqLworICAgICAgICBiY21vc190aW1lcl9zdGFydCgKKyAgICAgICAgICAgICZyZW1vdGVfbG9nZ2VyW2RldmljZV0udGltZXIsCisgICAgICAgICAgICByZW1vdGVfbG9nZ2VyW2RldmljZV0uY2ZnLnBvbGxpbmdfcGVyaW9kX21zICogMTAwMCk7IC8qIG1zIHRvIHVzICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIFRoZXJlIGFyZSBtb3JlIG1lc3NhZ2VzIHRvIHJlYWQgLSB3YWl0IGZvciBvbmx5IHRoZSAnc3Vic2VxdWVudCBkZWxheScgdGltZS4gKi8KKyAgICAgICAgYmNtb3NfdGltZXJfc3RhcnQoCisgICAgICAgICAgICAmcmVtb3RlX2xvZ2dlcltkZXZpY2VdLnRpbWVyLAorICAgICAgICAgICAgcmVtb3RlX2xvZ2dlcltkZXZpY2VdLmNmZy5zdWJzZXF1ZW50X2RlbGF5X21zICogMTAwMCk7IC8qIG1zIHRvIHVzICovCisgICAgfQorCisgICAgcmV0dXJuIEJDTU9TX1RJTUVSX09LOworfQorCit2b2lkIGJjbW9sdF9yZW1vdGVfbG9nZ2VyX2FwcGxfaW5pdCgpCit7CisgICAgc3RhdGljIGJjbW9zX3Rhc2tfcGFybSB0YXNrX3BhcmFtcyA9CisgICAgeworICAgICAgICAucHJpb3JpdHkgPSBUQVNLX1BSSU9SSVRZX1VTRVJfQVBQTF9SRU1PVEVfTE9HR0VSLAorICAgICAgICAuY29yZSA9IEJDTU9TX0NQVV9DT1JFX0FOWSwgLyogTm8gQ1BVIGFmZmluaXR5ICovCisgICAgICAgIC5pbml0X2hhbmRsZXIgPSBOVUxMCisgICAgfTsKKyAgICBzdGF0aWMgYmNtb3NfbW9kdWxlX3Bhcm0gbW9kdWxlX3BhcmFtcyA9CisgICAgeworICAgICAgICAucXBhcm0gPSB7IC5zaXplID0gMSB9IC8qIGp1c3QgdGhlIHRpbWVyIG1lc3NhZ2UgKi8KKyAgICB9OworICAgIHN0YXRpYyBiY21vc190aW1lcl9wYXJtIHRpbWVyX3BhcmFtcyA9CisgICAgeworICAgICAgICAucGVyaW9kaWMgPSBCQ01PU19GQUxTRSwgLyogd2Ugd2lsbCByZS1lbmFibGUgdGhlIHRpbWVyIGFmdGVyIGVhY2ggdGljayAqLworICAgICAgICAuaGFuZGxlciA9IHJlbW90ZV9sb2dnZXJfdGltZXJfaGFuZGxlcgorICAgIH07CisKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2RldmlkIGRldmljZTsKKworICAgIGZvciAoZGV2aWNlID0gMDsgZGV2aWNlIDwgQkNNVFJfTUFYX09MVFM7IGRldmljZSsrKQorICAgIHsKKyAgICAgICAgYmNtb3NfbW9kdWxlX2lkIG1vZHVsZV9pZCA9IEJDTU9TX01PRFVMRV9JRF9VU0VSX0FQUExfUkVNT1RFX0xPR0dFUl9ERVYwICsgZGV2aWNlOworICAgICAgICBzbnByaW50ZigKKyAgICAgICAgICAgIHJlbW90ZV9sb2dnZXJbZGV2aWNlXS50YXNrLm5hbWUsCisgICAgICAgICAgICBzaXplb2YocmVtb3RlX2xvZ2dlcltkZXZpY2VdLnRhc2submFtZSksCisgICAgICAgICAgICAidXNlcl9hcHBsX3JlbW90ZV9sb2dnZXIldSIsCisgICAgICAgICAgICBkZXZpY2UpOworCisgICAgICAgIHRhc2tfcGFyYW1zLm5hbWUgPSByZW1vdGVfbG9nZ2VyW2RldmljZV0udGFzay5uYW1lOworICAgICAgICBtb2R1bGVfcGFyYW1zLnFwYXJtLm5hbWUgPSByZW1vdGVfbG9nZ2VyW2RldmljZV0udGFzay5uYW1lOworICAgICAgICB0aW1lcl9wYXJhbXMub3duZXIgPSBtb2R1bGVfaWQ7CisgICAgICAgIHRpbWVyX3BhcmFtcy5uYW1lID0gcmVtb3RlX2xvZ2dlcltkZXZpY2VdLnRhc2submFtZTsKKyAgICAgICAgdGltZXJfcGFyYW1zLmRhdGEgPSAobG9uZylkZXZpY2U7CisKKyAgICAgICAgZXJyID0gYmNtb3NfdGFza19jcmVhdGUoJnJlbW90ZV9sb2dnZXJbZGV2aWNlXS50YXNrLCAmdGFza19wYXJhbXMpOworICAgICAgICBCVUdfT04oZXJyICE9IEJDTV9FUlJfT0spOworCisgICAgICAgIGVyciA9IGJjbW9zX21vZHVsZV9jcmVhdGUobW9kdWxlX2lkLCAmcmVtb3RlX2xvZ2dlcltkZXZpY2VdLnRhc2ssICZtb2R1bGVfcGFyYW1zKTsKKyAgICAgICAgQlVHX09OKGVyciAhPSBCQ01fRVJSX09LKTsKKworICAgICAgICBlcnIgPSBiY21vc190aW1lcl9jcmVhdGUoJnJlbW90ZV9sb2dnZXJbZGV2aWNlXS50aW1lciwgJnRpbWVyX3BhcmFtcyk7CisgICAgICAgIEJVR19PTihlcnIgIT0gQkNNX0VSUl9PSyk7CisKKyAgICAgICAgcmVtb3RlX2xvZ2dlcltkZXZpY2VdLmxvZ19pZCA9CisgICAgICAgICAgICBiY21fZGV2X2xvZ19pZF9yZWdpc3RlcihyZW1vdGVfbG9nZ2VyW2RldmljZV0udGFzay5uYW1lLCBERVZfTE9HX0xFVkVMX1dBUk5JTkcsIERFVl9MT0dfSURfVFlQRV9CT1RIKTsKKyAgICB9Cit9CisKK2JjbW9zX2Vycm5vIGJjbW9sdF9yZW1vdGVfbG9nZ2VyX2FwcGxfc3RhcnQoYmNtb2x0X2RldmlkIGRldmljZSkKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X2xvZ2dlcl9jZmcgY2ZnOworICAgIGJjbW9sdF9sb2dnZXJfa2V5IGtleSA9IHsgLmZpbGVfaWQgPSBCQ01PTFRfTE9HX0ZJTEVfSURfRERSIH07CisKKyAgICBpZiAoYmNtb2x0X3JlbW90ZV9sb2dnZXJfYXBwbF9pc19ydW5uaW5nKGRldmljZSkpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCByZW1vdGVfbG9nZ2VyW2RldmljZV0ubG9nX2lkLCAiUmVtb3RlIGxvZ2dlciBhcHBsaWNhdGlvbiBpcyBhbHJlYWR5IHJ1bm5pbmcuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfQUxSRUFEWTsKKyAgICB9CisKKyAgICAvKiBjb25maWd1cmUgRERSIGxvZyBmaWxlIHRvIGNsZWFyIG9uIHJlYWQgc28gd2UgY2FuIGFsd2F5cyBzdGF5IHVwLXRvLWRhdGUgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgbG9nZ2VyLCBrZXkpOworICAgIEJDTU9MVF9DRkdfUFJPUF9TRVQoJmNmZywgbG9nZ2VyLCBlbmFibGVfbG9nLCBCQ01PU19UUlVFKTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGxvZ2dlciwgY2xlYXJfYWZ0ZXJfcmVhZCwgQkNNT1NfVFJVRSk7CisgICAgZXJyID0gYmNtb2x0X2NmZ19zZXQoMCwgJmNmZy5oZHIpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIEJDTV9MT0coRVJST1IsIHJlbW90ZV9sb2dnZXJbZGV2aWNlXS5sb2dfaWQsICJMb2dnZXIgc2V0IEFQSSByZXR1cm5lZCAnJXMnICglZClcbiIsIGJjbW9zX3N0cmVycm9yKGVyciksIGVycik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgcmVtb3RlX2xvZ2dlcltkZXZpY2VdLmZpbGVfaGFuZGxlID0gZm9wZW4ocmVtb3RlX2xvZ2dlcltkZXZpY2VdLmNmZy5maWxlbmFtZSwgInciKTsKKyAgICBpZiAocmVtb3RlX2xvZ2dlcltkZXZpY2VdLmZpbGVfaGFuZGxlID09IE5VTEwpCisgICAgeworICAgICAgICBCQ01fTE9HKEVSUk9SLCByZW1vdGVfbG9nZ2VyW2RldmljZV0ubG9nX2lkLCAiQ291bGQgbm90IG9wZW4gZmlsZSAnJXMnXG4iLCByZW1vdGVfbG9nZ2VyW2RldmljZV0uY2ZnLmZpbGVuYW1lKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfSU87CisgICAgfQorICAgIHJlbW90ZV9sb2dnZXJbZGV2aWNlXS5maWxlX3NpemUgPSAwOworCisgICAgYmNtb3NfdGltZXJfc3RhcnQoJnJlbW90ZV9sb2dnZXJbZGV2aWNlXS50aW1lciwgcmVtb3RlX2xvZ2dlcltkZXZpY2VdLmNmZy5wb2xsaW5nX3BlcmlvZF9tcyAqIDEwMDApOyAvKiBtcyB0byB1cyAqLworICAgIHJldHVybiBCQ01fRVJSX09LOworfQorCitiY21vc19lcnJubyBiY21vbHRfcmVtb3RlX2xvZ2dlcl9hcHBsX3N0b3AoYmNtb2x0X2RldmlkIGRldmljZSkKK3sKKyAgICBpZiAoIWJjbW9sdF9yZW1vdGVfbG9nZ2VyX2FwcGxfaXNfcnVubmluZyhkZXZpY2UpKQorICAgIHsKKyAgICAgICAgQkNNX0xPRyhFUlJPUiwgcmVtb3RlX2xvZ2dlcltkZXZpY2VdLmxvZ19pZCwgIlJlbW90ZSBsb2dnZXIgYXBwbGljYXRpb24gaXMgbm90IHJ1bm5pbmcuXG4iKTsKKyAgICAgICAgcmV0dXJuIEJDTV9FUlJfQUxSRUFEWTsKKyAgICB9CisKKyAgICBiY21vc190aW1lcl9zdG9wKCZyZW1vdGVfbG9nZ2VyW2RldmljZV0udGltZXIpOworICAgIGZjbG9zZShyZW1vdGVfbG9nZ2VyW2RldmljZV0uZmlsZV9oYW5kbGUpOworICAgIHJlbW90ZV9sb2dnZXJbZGV2aWNlXS5maWxlX2hhbmRsZSA9IE5VTEw7CisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKK2JjbW9zX2Jvb2wgYmNtb2x0X3JlbW90ZV9sb2dnZXJfYXBwbF9pc19ydW5uaW5nKGJjbW9sdF9kZXZpZCBkZXZpY2UpCit7CisgICAgcmV0dXJuIGJjbW9zX3RpbWVyX2lzX3J1bm5pbmcoJnJlbW90ZV9sb2dnZXJbZGV2aWNlXS50aW1lcik7Cit9CisKK2JjbW9zX2Vycm5vIGJjbW9sdF9yZW1vdGVfbG9nZ2VyX2FwcGxfY2ZnX2dldChiY21vbHRfZGV2aWQgZGV2aWNlLCBiY21vbHRfcmVtb3RlX2xvZ2dlcl9jZmcgKmNmZykKK3sKKyAgICAqY2ZnID0gcmVtb3RlX2xvZ2dlcltkZXZpY2VdLmNmZzsKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtb2x0X3JlbW90ZV9sb2dnZXJfYXBwbF9jZmdfdXBkYXRlKGJjbW9sdF9kZXZpZCBkZXZpY2UsIGNvbnN0IGJjbW9sdF9yZW1vdGVfbG9nZ2VyX2NmZyAqY2ZnKQoreworICAgIHJlbW90ZV9sb2dnZXJbZGV2aWNlXS5jZmcgPSAqY2ZnOworICAgIHJldHVybiBCQ01fRVJSX09LOworfQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9yZW1vdGVfbG9nZ2VyL2JjbW9sdF91c2VyX2FwcGxfcmVtb3RlX2xvZ2dlci5oIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9yZW1vdGVfbG9nZ2VyL2JjbW9sdF91c2VyX2FwcGxfcmVtb3RlX2xvZ2dlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YTIyZmQKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3JlbW90ZV9sb2dnZXIvYmNtb2x0X3VzZXJfYXBwbF9yZW1vdGVfbG9nZ2VyLmgKQEAgLTAsMCArMSw4OSBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisqLworCisjaWZuZGVmIF9CQ01PTFRfVVNFUl9BUFBMX1JFTU9URV9MT0dHRVJfSF8KKyNkZWZpbmUgX0JDTU9MVF9VU0VSX0FQUExfUkVNT1RFX0xPR0dFUl9IXworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtb2x0X21zZy5oPgorCisjZGVmaW5lIEJDTU9MVF9SRU1PVEVfTE9HR0VSX0ZJTEVOQU1FX01BWF9MRU4gMTI4CisKKy8qKiBQb3NzaWJsZSBhY3Rpb25zIHRvIHRha2Ugd2hlbiB0aGUgbWF4IGxvZyBmaWxlIHNpemUgaXMgcmVhY2hlZC4gKi8KK3R5cGVkZWYgZW51bQoreworICAgIEJDTU9MVF9SRU1PVEVfTE9HR0VSX0ZJTEVfU0laRV9SRUFDSEVEX0JFSEFWSU9SX1NUT1AsICAvKio8IFN0b3AgdGhlIHJlbW90ZSBsb2dnZXIgYXBwbGljYXRpb24uICovCisgICAgQkNNT0xUX1JFTU9URV9MT0dHRVJfRklMRV9TSVpFX1JFQUNIRURfQkVIQVZJT1JfQ0xFQVIsIC8qKjwgQ2xlYXIgYWxsIGNvbnRlbnQgZnJvbSB0aGUgZmlsZSBhbmQgY29udGludWUuICovCit9IGJjbW9sdF9yZW1vdGVfbG9nZ2VyX2ZpbGVfc2l6ZV9yZWFjaGVkX2JlaGF2aW9yOworCisvKiogQ29uZmlndXJhdGlvbiBmb3IgdGhlIHJlbW90ZSBsb2dnZXIgYXBwbGljYXRpb24uICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHVpbnQzMl90IHBvbGxpbmdfcGVyaW9kX21zOyAgIC8qKjwgVGltZSB0byB3YWl0IGluIGJldHdlZW4gcG9sbGluZyBBUEkgY2FsbHMuICovCisgICAgdWludDMyX3Qgc3Vic2VxdWVudF9kZWxheV9tczsgLyoqPCBNaW51bXVtIHJlcXVpcmVkIHRpbWUgdG8gd2FpdCBpbiBiZXR3ZWVuIHN1c2VxdWVudCBBUEkgY2FsbHMuICovCisgICAgdWludDMyX3QgbWF4X2ZpbGVfc2l6ZTsgICAgICAgLyoqPCBNYXhpbXVtIHNpemUgZm9yIHRoZSBvdXRwdXQgZmlsZSBpbiBieXRlcy4gKi8KKworICAgIC8qKiBPdXRwdXQgZmlsZSBmdWxsIHBhdGguICovCisgICAgY2hhciBmaWxlbmFtZVtCQ01PTFRfUkVNT1RFX0xPR0dFUl9GSUxFTkFNRV9NQVhfTEVOXTsKKworICAgIC8qKiBCZWhhdmlvciB3aGVuIHRoZSBtYXggZmlsZSBzaXplIGlzIHJlYWNoZWQuICovCisgICAgYmNtb2x0X3JlbW90ZV9sb2dnZXJfZmlsZV9zaXplX3JlYWNoZWRfYmVoYXZpb3IgbWF4X2ZpbGVfc2l6ZV9yZWFjaGVkX2JlaGF2aW9yOworfSBiY21vbHRfcmVtb3RlX2xvZ2dlcl9jZmc7CisKKy8qKiBJbml0aWFsaXplIHRoZSByZW1vdGUgbG9nZ2VyIGFwcGxpY2F0aW9uICh0aGlzIHNob3VsZCBiZSBjYWxsZWQgYXMgcGFydCBvZiBhcHBsaWNhdGlvbiBzdGFydHVwKS4gKi8KK3ZvaWQgYmNtb2x0X3JlbW90ZV9sb2dnZXJfYXBwbF9pbml0KHZvaWQpOworCisvKiogU3RhcnQgdGhlIHJlbW90ZSBsb2dnZXIgYXBwbGljYXRpb24uCisgKiBccmV0dXJuICAgICAgICBCQ01fRVJSX09LIGlmIHRoZSBhcHBsaWNhdGlvbiB3YXMgc3RhcnRlZCBzdWNjZXNzZnVsbHksIDwwIG90aGVyd2lzZS4KKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X3JlbW90ZV9sb2dnZXJfYXBwbF9zdGFydChiY21vbHRfZGV2aWQgZGV2aWNlKTsKKworLyoqIFN0b3AgdGhlIHJlbW90ZSBsb2dnZXIgYXBwbGljYXRpb24uCisgKiBccmV0dXJuICAgICAgICBCQ01fRVJSX09LIGlmIHRoZSBhcHBsaWNhdGlvbiB3YXMgc3RvcHBlZCBzdWNjZXNzZnVsbHksIDwwIG90aGVyd2lzZS4KKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X3JlbW90ZV9sb2dnZXJfYXBwbF9zdG9wKGJjbW9sdF9kZXZpZCBkZXZpY2UpOworCisvKiogUXVlcnkgd2hldGhlciB0aGUgcmVtb3RlIGxvZ2dlciBhcHBsaWNhdGlvbiBpcyBjdXJyZW50bHkgcnVubmluZy4KKyAqIFxyZXR1cm4gICAgICAgIEJDTU9TX1RSVUUgaWYgdGhlIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcsIEJDTU9TX0ZBTFNFIG90aGVyd2lzZS4KKyAqLworYmNtb3NfYm9vbCBiY21vbHRfcmVtb3RlX2xvZ2dlcl9hcHBsX2lzX3J1bm5pbmcoYmNtb2x0X2RldmlkIGRldmljZSk7CisKKy8qKiBHZXQgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHJlbW90ZSBsb2dnZXIgYXBwbGljYXRpb24uCisgKiBccGFyYW1bb3V0XSBjZmcgUmVtb3RlIGxvZ2dlciBjb25maWd1cmF0aW9uLgorICogXHJldHVybiAgICAgICAgIEJDTV9FUlJfT0sgaWYgdGhlIGNvbmZpZ3VyYXRpb24gd2FzIHJldHJpZXZlZCBzdWNjZXNzZnVsbHksIDwwIG90aGVyd2lzZS4KKyAqLworYmNtb3NfZXJybm8gYmNtb2x0X3JlbW90ZV9sb2dnZXJfYXBwbF9jZmdfZ2V0KGJjbW9sdF9kZXZpZCBkZXZpY2UsIGJjbW9sdF9yZW1vdGVfbG9nZ2VyX2NmZyAqY2ZnKTsKKworLyoqIENoYW5nZSB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgcmVtb3RlIGxvZ2dlciBhcHBsaWNhdGlvbi4KKyAqIFxwYXJhbVtpbl0gY2ZnIFJlbW90ZSBsb2dnZXIgY29uZmlndXJhdGlvbi4KKyAqIFxyZXR1cm4gICAgICAgIEJDTV9FUlJfT0sgaWYgdGhlIGNvbmZpZ3VyYXRpb24gd2FzIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LCA8MCBvdGhlcndpc2UuCisgKi8KK2JjbW9zX2Vycm5vIGJjbW9sdF9yZW1vdGVfbG9nZ2VyX2FwcGxfY2ZnX3VwZGF0ZShiY21vbHRfZGV2aWQgZGV2aWNlLCBjb25zdCBiY21vbHRfcmVtb3RlX2xvZ2dlcl9jZmcgKmNmZyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9yZW1vdGVfbG9nZ2VyL2JjbW9sdF91c2VyX2FwcGxfcmVtb3RlX2xvZ2dlcl9jbGkuYyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvcmVtb3RlX2xvZ2dlci9iY21vbHRfdXNlcl9hcHBsX3JlbW90ZV9sb2dnZXJfY2xpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZjNGZkNQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvcmVtb3RlX2xvZ2dlci9iY21vbHRfdXNlcl9hcHBsX3JlbW90ZV9sb2dnZXJfY2xpLmMKQEAgLTAsMCArMSwyNTcgQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTY6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQnJvYWRjb20gUHJvcHJpZXRhcnkgYW5kIENvbmZpZGVudGlhbC4oYykgMjAxNiBCcm9hZGNvbQorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorKi8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbWNsaS5oPgorI2luY2x1ZGUgPGJjbW9sdF9hcGkuaD4KKyNpbmNsdWRlIDxiY21vbHRfbW9kZWxfdHlwZXMuaD4KKyNpbmNsdWRlICJiY21vbHRfdXNlcl9hcHBsX3JlbW90ZV9sb2dnZXJfY2xpLmgiCisjaW5jbHVkZSAiYmNtb2x0X3VzZXJfYXBwbF9yZW1vdGVfbG9nZ2VyLmgiCisjaW5jbHVkZSAiYmNtb2x0X2NvbnYuaCIKKworI2RlZmluZSBCQ01PTFRfUkVNT1RFX0xPR0dFUl9ERUZBVUxUX1BPTExJTkdfUEVSSU9EX01TICAgICA1MDAwCisjZGVmaW5lIEJDTU9MVF9SRU1PVEVfTE9HR0VSX0RFRkFVTFRfU1VCU0VRVUVOVF9ERUxBWV9NUyAgIDUKKyNkZWZpbmUgQkNNT0xUX1JFTU9URV9MT0dHRVJfREVGQVVMVF9NQVhfRklMRV9TSVpFICAgICAgICAgKDIwMCAqIDEwMDAwMDApIAorI2RlZmluZSBCQ01PTFRfUkVNT1RFX0xPR0dFUl9ERUZBVUxUX0ZJTEVfUkVBQ0hFRF9CRUhBVklPUiAic3RvcCIKKyNkZWZpbmUgQkNNT0xUX1JFTU9URV9MT0dHRVJfREVGQVVMVF9GSUxFTkFNRSAgICAgICAgICAgICAgInJlbW90ZV9sb2cudHh0IgorCitzdGF0aWMgYmNtb3NfZXJybm8gcmVtb3RlX2xvZ2dlcl9jb25maWd1cmVfbG9nKAorICAgIGJjbW9sdF9kZXZpZCBkZXZpY2UsCisgICAgY29uc3QgYmNtb2x0X2xvZ19lbnRyeV9rZXkgKmtleSwKKyAgICBiY21vbHRfbG9nX2xldmVsIGxvZ19sZXZlbF9zYXZlKQoreworICAgIGJjbW9sdF9sb2dfZW50cnlfY2ZnIGNmZzsKKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJmNmZywgbG9nX2VudHJ5LCAqa2V5KTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGxvZ19lbnRyeSwgbG9nX2xldmVsX3NhdmUsIGxvZ19sZXZlbF9zYXZlKTsKKyAgICBCQ01PTFRfQ0ZHX1BST1BfU0VUKCZjZmcsIGxvZ19lbnRyeSwgbG9nX2xldmVsX3ByaW50LCBCQ01PTFRfTE9HX0xFVkVMX1dBUk5JTkcpOworICAgIHJldHVybiBiY21vbHRfY2ZnX3NldChkZXZpY2UsICZjZmcuaGRyKTsKK30KKworc3RhdGljIGJjbW9zX2Vycm5vIHJlbW90ZV9sb2dnZXJfY29uZmlndXJlX2xvZ3MoYmNtb2x0X2RldmlkIGRldmljZSkKK3sKKyAgICBiY21vc19lcnJubyBlcnI7CisgICAgYmNtb2x0X21zZ19zZXQgKm1zZ19zZXQ7CisgICAgYmNtb2x0X2xvZ19lbnRyeV9jZmcgbXVsdGlfY2ZnOworICAgIGJjbW9sdF9sb2dfZW50cnlfa2V5IG11bHRpX2tleSA9IHsgLmxvZ19pZCA9IDAgfTsgLyogc3RhcnQgZnJvbSB0aGUgZmlyc3QgbG9nIElEICovCisgICAgdWludDE2X3QgaTsKKworICAgIC8qIGFsbG9jYXRlIHNwYWNlIGZvciBtdWx0aS1nZXQgcmV0dXJuICovCisgICAgZXJyID0gYmNtb2x0X21zZ19zZXRfYWxsb2MoQkNNT0xUX09CSl9JRF9MT0dfRU5UUlksIEJDTU9MVF9NR1RfR1JPVVBfQ0ZHLCA1MCwgJm1zZ19zZXQpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgLyogaW5pdGlhbGl6ZSB0aGUgbXVsdGktZ2V0IGNvbmZpZyBzdHJ1Y3R1cmUgKi8KKyAgICBCQ01PTFRfQ0ZHX0lOSVQoJm11bHRpX2NmZywgbG9nX2VudHJ5LCBtdWx0aV9rZXkpOworICAgIEJDTU9MVF9NU0dTRVRfQ0ZHX1BST1BfR0VUKG1zZ19zZXQsIGxvZ19lbnRyeSwgbG9nX2xldmVsX3NhdmUpOworCisgICAgZG8KKyAgICB7CisgICAgICAgIC8qIGNhbGwgbXVsdGktZ2V0IEFQSSAqLworICAgICAgICBlcnIgPSBiY21vbHRfY2ZnX2dldF9tdWx0aShkZXZpY2UsICZtdWx0aV9jZmcuaGRyLCBCQ01PTFRfRklMVEVSX0ZMQUdTX05PTkUsIG1zZ19zZXQpOworICAgICAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogZm9yIGVhY2ggbG9nIGVudHJ5LCByZWNvbmZpZ3VyZSBpdCB0byBwcmludCBvbmx5IHdhcm5pbmcgbGV2ZWwgYW5kIGFib3ZlIHRvIHRoZSBzY3JlZW4gKGtlZXBpbmcgY3VycmVudAorICAgICAgICAgKiBiZWhhdmlvciBmb3IgcHJpbnRpbmcgdG8gUkFNIGZpbGVzKSAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbXNnX3NldC0+bnVtX2luc3RhbmNlczsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBiY21vbHRfbG9nX2VudHJ5X2NmZyAqY2ZnID0gKGJjbW9sdF9sb2dfZW50cnlfY2ZnICopbXNnX3NldC0+bXNnW2ldOworICAgICAgICAgICAgZXJyID0gcmVtb3RlX2xvZ2dlcl9jb25maWd1cmVfbG9nKGRldmljZSwgJmNmZy0+a2V5LCBjZmctPmRhdGEubG9nX2xldmVsX3NhdmUpOworICAgICAgICAgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogdXBkYXRlIHRoZSBrZXkgZm9yIG5leHQgY2FsbCAqLworICAgICAgICBtdWx0aV9jZmcua2V5ID0gKigoYmNtb2x0X2xvZ19lbnRyeV9rZXkgKiltc2dfc2V0LT5uZXh0X2tleSk7CisKKyAgICAvKiBrZWVwIGNhbGxpbmcgdGhlIGZ1bmN0aW9uIHVudGlsIHdlIGhhdmUgcmV0cmlldmVkIGFsbCBlbnRyaWVzICovCisgICAgfSB3aGlsZSAobXNnX3NldC0+bW9yZSk7CisKKyAgICBiY21vbHRfbXNnX3NldF9mcmVlKG1zZ19zZXQpOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyByZW1vdGVfbG9nZ2VyX2NtZF9zdGFydChiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1zW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgLyogdGhlc2UgcGFyYW1ldGVycyB3aWxsIGFsd2F5cyBiZSBub24tTlVMTCBzaW5jZSB0aGV5IGhhdmUgZGVmYXVsdCB2YWx1ZXMgKi8KKyAgICBiY21vbHRfcmVtb3RlX2xvZ2dlcl9jZmcgY2ZnID0gCisgICAgeworICAgICAgICAubWF4X2ZpbGVfc2l6ZSA9IGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgIm1heF9maWxlX3NpemUiKS0+dmFsdWUudW51bWJlciwKKyAgICAgICAgLm1heF9maWxlX3NpemVfcmVhY2hlZF9iZWhhdmlvciA9IChiY21vbHRfcmVtb3RlX2xvZ2dlcl9maWxlX3NpemVfcmVhY2hlZF9iZWhhdmlvcikKKyAgICAgICAgICAgIGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbGVfc2l6ZV9yZWFjaGVkIiktPnZhbHVlLm51bWJlciwKKyAgICAgICAgLnBvbGxpbmdfcGVyaW9kX21zID0gYmNtY2xpX2ZpbmRfbmFtZWRfcGFybShzZXNzaW9uLCAicG9sbGluZ19wZXJpb2QiKS0+dmFsdWUudW51bWJlciwKKyAgICAgICAgLnN1YnNlcXVlbnRfZGVsYXlfbXMgPSBiY21jbGlfZmluZF9uYW1lZF9wYXJtKHNlc3Npb24sICJzdWJzZXF1ZW50X2RlbGF5IiktPnZhbHVlLnVudW1iZXIsCisgICAgfTsKKyAgICBzdHJuY3B5KAorICAgICAgICBjZmcuZmlsZW5hbWUsCisgICAgICAgIGJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImZpbGVuYW1lIiktPnZhbHVlLnN0cmluZywKKyAgICAgICAgQkNNT0xUX1JFTU9URV9MT0dHRVJfRklMRU5BTUVfTUFYX0xFTiAtIDEpOyAvKiBsZWF2ZSByb29tIGZvciB0ZXJtaW5hdG9yICovCisKKyAgICAvKiBpZiB0aGUgdXNlciByZXF1ZXN0ZWQsIHNldCBhbGwgbG9ncyBvbiB0aGUgZGV2aWNlIHRvIHByaW50IHdhcm5pbmdzL2Vycm9ycyBvbmx5ICovCisgICAgaWYgKChiY21vc19ib29sKWJjbWNsaV9maW5kX25hbWVkX3Bhcm0oc2Vzc2lvbiwgImNvbmZpZ3VyZV9sb2dzIiktPnZhbHVlLm51bWJlcikKKyAgICB7CisgICAgICAgIGVyciA9IHJlbW90ZV9sb2dnZXJfY29uZmlndXJlX2xvZ3MoY3VycmVudF9kZXZpY2UpOworICAgICAgICBpZiAoZXJyICE9IEJDTV9FUlJfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIlJlY29uZmlndXJlZCBhbGwgbG9nIGVudHJpZXMgdG8gcHJpbnQgd2FybmluZy9lcnJvciBtZXNzYWdlcyBvbmx5XG4iKTsKKyAgICB9CisKKyAgICBlcnIgPSBiY21vbHRfcmVtb3RlX2xvZ2dlcl9hcHBsX2NmZ191cGRhdGUoY3VycmVudF9kZXZpY2UsICZjZmcpOworICAgIGlmIChlcnIgIT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgZXJyID0gYmNtb2x0X3JlbW90ZV9sb2dnZXJfYXBwbF9zdGFydChjdXJyZW50X2RldmljZSk7CisgICAgaWYgKGVyciA9PSBCQ01fRVJSX09LKQorICAgIHsKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgIlJlbW90ZSBsb2dnZXIgYXBwbGljYXRpb24gc3RhcnRlZFxuIik7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBiY21vc19lcnJubyByZW1vdGVfbG9nZ2VyX2NtZF9zdG9wKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybXNbXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBiY21vc19lcnJubyBlcnIgPSBiY21vbHRfcmVtb3RlX2xvZ2dlcl9hcHBsX3N0b3AoY3VycmVudF9kZXZpY2UpOworICAgIGlmIChlcnIgPT0gQkNNX0VSUl9PSykKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJSZW1vdGUgbG9nZ2VyIGFwcGxpY2F0aW9uIHN0b3BwZWRcbiIpOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgYmNtb3NfZXJybm8gcmVtb3RlX2xvZ2dlcl9jbWRfc3RhdHVzKGJjbWNsaV9zZXNzaW9uICpzZXNzaW9uLCBjb25zdCBiY21jbGlfY21kX3Bhcm0gcGFybXNbXSwgdWludDE2X3Qgbl9wYXJtcykKK3sKKyAgICBzdGF0aWMgaW50MnN0cl90IGZpbGVfc2l6ZV9yZWFjaGVkMnN0cltdID0KKyAgICB7CisgICAgICAgIHsgQkNNT0xUX1JFTU9URV9MT0dHRVJfRklMRV9TSVpFX1JFQUNIRURfQkVIQVZJT1JfU1RPUCwgInN0b3AiIH0sCisgICAgICAgIHsgQkNNT0xUX1JFTU9URV9MT0dHRVJfRklMRV9TSVpFX1JFQUNIRURfQkVIQVZJT1JfQ0xFQVIsICJjbGVhciIgfSwKKyAgICAgICAgeyAtMSB9CisgICAgfTsKKworICAgIGJjbW9zX2Vycm5vIGVycjsKKyAgICBiY21vbHRfcmVtb3RlX2xvZ2dlcl9jZmcgY2ZnOworCisgICAgaWYgKGJjbW9sdF9yZW1vdGVfbG9nZ2VyX2FwcGxfaXNfcnVubmluZyhjdXJyZW50X2RldmljZSkpCisgICAgeworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAiUmVtb3RlIGxvZ2dlciBhcHBsaWNhdGlvbiBpcyBydW5uaW5nXG4iKTsKKyAgICAgICAgZXJyID0gYmNtb2x0X3JlbW90ZV9sb2dnZXJfYXBwbF9jZmdfZ2V0KGN1cnJlbnRfZGV2aWNlLCAmY2ZnKTsKKyAgICAgICAgaWYgKGVyciAhPSBCQ01fRVJSX09LKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisKKyAgICAgICAgYmNtY2xpX3Nlc3Npb25fcHJpbnQoc2Vzc2lvbiwgImZpbGVuYW1lPSVzXG4iLCBjZmcuZmlsZW5hbWUpOworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAibWF4X2ZpbGVfc2l6ZT0ldVxuIiwgY2ZnLm1heF9maWxlX3NpemUpOworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludCgKKyAgICAgICAgICAgIHNlc3Npb24sCisgICAgICAgICAgICAiZmlsZV9zaXplX3JlYWNoZWQ9JXNcbiIsCisgICAgICAgICAgICBpbnQyc3RyKGZpbGVfc2l6ZV9yZWFjaGVkMnN0ciwgY2ZnLm1heF9maWxlX3NpemVfcmVhY2hlZF9iZWhhdmlvcikpOworICAgICAgICBiY21jbGlfc2Vzc2lvbl9wcmludChzZXNzaW9uLCAicG9sbGluZ19wZXJpb2Q9JXVcbiIsIGNmZy5wb2xsaW5nX3BlcmlvZF9tcyk7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJzdWJzZXF1ZW50X2RlbGF5PSV1XG4iLCBjZmcuc3Vic2VxdWVudF9kZWxheV9tcyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJjbWNsaV9zZXNzaW9uX3ByaW50KHNlc3Npb24sICJSZW1vdGUgbG9nZ2VyIGFwcGxpY2F0aW9uIGlzIG5vdCBydW5uaW5nXG4iKTsKKyAgICB9CisKKyAgICByZXR1cm4gQkNNX0VSUl9PSzsKK30KKworYmNtb3NfZXJybm8gYmNtb2x0X3JlbW90ZV9sb2dnZXJfYXBwbF9jbGlfaW5pdChiY21jbGlfZW50cnkgKnRvcF9kaXIpCit7CisgICAgc3RhdGljIGJjbWNsaV9lbnVtX3ZhbCBmaWxlX3NpemVfcmVhY2hlZF9iZWhhdmlvcl90YWJsZVtdID0KKyAgICB7CisgICAgICAgIHsgInN0b3AiLCBCQ01PTFRfUkVNT1RFX0xPR0dFUl9GSUxFX1NJWkVfUkVBQ0hFRF9CRUhBVklPUl9TVE9QIH0sCisgICAgICAgIHsgImNsZWFyIiwgQkNNT0xUX1JFTU9URV9MT0dHRVJfRklMRV9TSVpFX1JFQUNIRURfQkVIQVZJT1JfQ0xFQVIgfSwKKyAgICAgICAgQkNNQ0xJX0VOVU1fTEFTVAorICAgIH07CisKKyAgICBiY21jbGlfZW50cnkgKmRpciA9IGJjbWNsaV9kaXJfYWRkKAorICAgICAgICB0b3BfZGlyLAorICAgICAgICAicmVtb3RlX2xvZ2dlciIsCisgICAgICAgICJQZXJpb2RpY2FsbHkgY29weSBkZXZpY2UgbG9nIHRvIGxvY2FsIGZpbGUiLAorICAgICAgICBCQ01DTElfQUNDRVNTX0FETUlOLAorICAgICAgICBOVUxMKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoIWRpciwgQkNNX0VSUl9OT01FTSk7CisKKyAgICBCQ01DTElfTUFLRV9DTUQoZGlyLCAic3RhcnQiLCAiU3RhcnQgcGVyaW9kaWNhbGx5IGNvcHlpbmcgZGV2aWNlIGxvZyB0byBob3N0IiwgcmVtb3RlX2xvZ2dlcl9jbWRfc3RhcnQsCisgICAgICAgIEJDTUNMSV9NQUtFX1BBUk1fREVGVkFMKAorICAgICAgICAgICAgImZpbGVuYW1lIiwKKyAgICAgICAgICAgICJPdXRwdXQgZmlsZSBwYXRoIiwKKyAgICAgICAgICAgIEJDTUNMSV9QQVJNX1NUUklORywKKyAgICAgICAgICAgIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwsCisgICAgICAgICAgICAobG9uZylCQ01PTFRfUkVNT1RFX0xPR0dFUl9ERUZBVUxUX0ZJTEVOQU1FKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9ERUZWQUwoCisgICAgICAgICAgICAibWF4X2ZpbGVfc2l6ZSIsCisgICAgICAgICAgICAiTWF4aW11bSBvdXRwdXQgZmlsZSBzaXplIGluIGJ5dGVzIiwKKyAgICAgICAgICAgIEJDTUNMSV9QQVJNX1VOVU1CRVIsCisgICAgICAgICAgICBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMLAorICAgICAgICAgICAgQkNNT0xUX1JFTU9URV9MT0dHRVJfREVGQVVMVF9NQVhfRklMRV9TSVpFKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9FTlVNX0RFRlZBTCgKKyAgICAgICAgICAgICJmaWxlX3NpemVfcmVhY2hlZCIsCisgICAgICAgICAgICAiQmVoYXZpb3Igd2hlbiBtYXggZmlsZSBzaXplIGlzIHJlYWNoZWQiLAorICAgICAgICAgICAgZmlsZV9zaXplX3JlYWNoZWRfYmVoYXZpb3JfdGFibGUsCisgICAgICAgICAgICBCQ01DTElfUEFSTV9GTEFHX09QVElPTkFMLAorICAgICAgICAgICAgQkNNT0xUX1JFTU9URV9MT0dHRVJfREVGQVVMVF9GSUxFX1JFQUNIRURfQkVIQVZJT1IpLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0RFRlZBTCgKKyAgICAgICAgICAgICJwb2xsaW5nX3BlcmlvZCIsCisgICAgICAgICAgICAiUG9sbGluZyBwZXJpb2QgaW4gbXMiLAorICAgICAgICAgICAgQkNNQ0xJX1BBUk1fVU5VTUJFUiwKKyAgICAgICAgICAgIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwsCisgICAgICAgICAgICBCQ01PTFRfUkVNT1RFX0xPR0dFUl9ERUZBVUxUX1BPTExJTkdfUEVSSU9EX01TKSwKKyAgICAgICAgQkNNQ0xJX01BS0VfUEFSTV9ERUZWQUwoCisgICAgICAgICAgICAic3Vic2VxdWVudF9kZWxheSIsCisgICAgICAgICAgICAiRGVsYXkgYmV0d2VlbiByZXBlYXRlZCBBUEkgY2FsbHMgaW4gbXMiLAorICAgICAgICAgICAgQkNNQ0xJX1BBUk1fVU5VTUJFUiwKKyAgICAgICAgICAgIEJDTUNMSV9QQVJNX0ZMQUdfT1BUSU9OQUwsCisgICAgICAgICAgICBCQ01PTFRfUkVNT1RFX0xPR0dFUl9ERUZBVUxUX1NVQlNFUVVFTlRfREVMQVlfTVMpLAorICAgICAgICBCQ01DTElfTUFLRV9QQVJNX0VOVU1fREVGVkFMKAorICAgICAgICAgICAgImNvbmZpZ3VyZV9sb2dzIiwKKyAgICAgICAgICAgICJDb25maWd1cmUgYWxsIGRldmljZSBsb2dzIHRvIHByaW50IGVycm9yL3dhcm5pbmcgb25seSIsCisgICAgICAgICAgICBiY21jbGlfZW51bV9ib29sX3RhYmxlLAorICAgICAgICAgICAgQkNNQ0xJX1BBUk1fRkxBR19PUFRJT05BTCwKKyAgICAgICAgICAgICJ5ZXMiKSk7CisKKyAgICBCQ01DTElfTUFLRV9DTURfTk9QQVJNKGRpciwgInN0b3AiLCAiU3RvcCBwZXJpb2RpY2FsbHkgY29weWluZyBkZXZpY2UgbG9nIHRvIGhvc3QiLCByZW1vdGVfbG9nZ2VyX2NtZF9zdG9wKTsKKworICAgIEJDTUNMSV9NQUtFX0NNRF9OT1BBUk0oZGlyLCAic3RhdHVzIiwgIlNob3cgc3RhdHVzIC8gY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIiwgcmVtb3RlX2xvZ2dlcl9jbWRfc3RhdHVzKTsKKworICAgIHJldHVybiBCQ01fRVJSX09LOworfQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9yZW1vdGVfbG9nZ2VyL2JjbW9sdF91c2VyX2FwcGxfcmVtb3RlX2xvZ2dlcl9jbGkuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvcmVtb3RlX2xvZ2dlci9iY21vbHRfdXNlcl9hcHBsX3JlbW90ZV9sb2dnZXJfY2xpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkxZWY4YgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvcmVtb3RlX2xvZ2dlci9iY21vbHRfdXNlcl9hcHBsX3JlbW90ZV9sb2dnZXJfY2xpLmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKzw6Y29weXJpZ2h0LUJSQ006MjAxNjpEVUFML0dQTDpzdGFuZGFyZAorCisgICBCcm9hZGNvbSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLihjKSAyMDE2IEJyb2FkY29tCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisqLworCisjaWZuZGVmIF9CQ01PTFRfVVNFUl9BUFBMX1JFTU9URV9MRUFSTklOR19DTElfSF8KKyNkZWZpbmUgX0JDTU9MVF9VU0VSX0FQUExfUkVNT1RFX0xFQVJOSU5HX0NMSV9IXworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtY2xpLmg+CisKK2JjbW9zX2Vycm5vIGJjbW9sdF9yZW1vdGVfbG9nZ2VyX2FwcGxfY2xpX2luaXQoYmNtY2xpX2VudHJ5ICp0b3BfZGlyKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3N3X3VwZ3JhZGUvTWFrZWZpbGUgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3N3X3VwZ3JhZGUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY0MWE2YgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvc3dfdXBncmFkZS9NYWtlZmlsZQpAQCAtMCwwICsxLDEyIEBACisjIFNXIHVwZ3JhZGUgYXBwbGljYXRpb24KKworaWZlcSAoIiQoRU5BQkxFX0NMSSkiLCAieSIpCisgICAgTU9EX05BTUUgPSBiY21fc3dfdXBncmFkZQorICAgIE1PRF9UWVBFID0gbGliCisgICAgTU9EX0RFUFMgPSBob3N0X2FwaQorICAgIHNyY3MgPSBiY21vbHRfc3dfdXBncmFkZV9jbGkuYworICAgIAorICAgIGlmZXEgKCIkKE9TX0tFUk5FTCkiLCAibGludXgiKQorICAgICAgICBNT0RfREVQUyArPSBkZXZfbG9nX2xpbnV4CisgICAgZW5kaWYKK2VuZGlmCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3N3X3VwZ3JhZGUvYmNtb2x0X3N3X3VwZ3JhZGVfY2xpLmMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3N3X3VwZ3JhZGUvYmNtb2x0X3N3X3VwZ3JhZGVfY2xpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzliMDNiNAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvc3dfdXBncmFkZS9iY21vbHRfc3dfdXBncmFkZV9jbGkuYwpAQCAtMCwwICsxLDcwIEBACisvKgorPDpjb3B5cmlnaHQtQlJDTToyMDE0OkRVQUwvR1BMOnN0YW5kYXJkCisKKyAgIENvcHlyaWdodCAoYykgMjAxNCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitVbmxlc3MgeW91IGFuZCBCcm9hZGNvbSBleGVjdXRlIGEgc2VwYXJhdGUgd3JpdHRlbiBzb2Z0d2FyZSBsaWNlbnNlCithZ3JlZW1lbnQgZ292ZXJuaW5nIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyh0aGUgIkdQTCIpLCBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5icm9hZGNvbS5jb20vbGljZW5zZXMvR1BMdjIucGhwLAord2l0aCB0aGUgZm9sbG93aW5nIGFkZGVkIHRvIHN1Y2ggbGljZW5zZToKKworICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mIHRoaXMgc29mdHdhcmUgZ2l2ZQorICAgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzIHNvZnR3YXJlIHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcywgYW5kCisgICB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciB0ZXJtcyBvZiB5b3VyCisgICBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCwgZm9yIGVhY2ggbGlua2VkIGluZGVwZW5kZW50CisgICBtb2R1bGUsIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgbGljZW5zZSBvZiB0aGF0IG1vZHVsZS4KKyAgIEFuIGluZGVwZW5kZW50IG1vZHVsZSBpcyBhIG1vZHVsZSB3aGljaCBpcyBub3QgZGVyaXZlZCBmcm9tIHRoaXMKKyAgIHNvZnR3YXJlLiAgVGhlIHNwZWNpYWwgZXhjZXB0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGFueSBtb2RpZmljYXRpb25zCisgICBvZiB0aGUgc29mdHdhcmUuCisKK05vdCB3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZQordGhpcyBzb2Z0d2FyZSBpbiBhbnkgd2F5IHdpdGggYW55IG90aGVyIEJyb2FkY29tIHNvZnR3YXJlIHByb3ZpZGVkCit1bmRlciBhIGxpY2Vuc2Ugb3RoZXIgdGhhbiB0aGUgR1BMLCB3aXRob3V0IEJyb2FkY29tJ3MgZXhwcmVzcyBwcmlvcgord3JpdHRlbiBjb25zZW50LgorCis6PgorKi8KKworI2luY2x1ZGUgPGJjbW9zX3N5c3RlbS5oPgorI2luY2x1ZGUgPGJjbWNsaS5oPgorI2luY2x1ZGUgPGJjbW9sdF9tb2RlbF90eXBlcy5oPgorI2luY2x1ZGUgPGJjbW9sdF9tc2cuaD4KKyNpbmNsdWRlIDxiY21vbHRfYXBpLmg+CisjaW5jbHVkZSA8YmNtX2FwaV9jbGlfaGVscGVycy5oPgorI2luY2x1ZGUgImJjbW9sdF9zd191cGdyYWRlX2NsaS5oIgorCitzdGF0aWMgYmNtb3NfZXJybm8gYmNtb2x0X3VzZXJfYXBwbF9jbGlfc3dfdXBncmFkZV9hY3RpdmF0ZShiY21jbGlfc2Vzc2lvbiAqc2Vzc2lvbiwgY29uc3QgYmNtY2xpX2NtZF9wYXJtIHBhcm1zW10sIHVpbnQxNl90IG5fcGFybXMpCit7CisgICAgYmNtb2x0X2RldmljZV9rZXkga2V5ID0ge307CisgICAgYmNtb2x0X2RldmljZV9zd191cGdyYWRlX2FjdGl2YXRlIG9wZXJfc3dfdXBncmFkZV9hY3RpdmF0ZTsKKyAgICBiY21vbHRfZGV2aWNlX2Rpc2Nvbm5lY3Qgb3Blcl9kaXNjb25uZWN0OworICAgIGJjbW9sdF9kZXZpY2VfY29ubmVjdCBvcGVyX2Nvbm5lY3Q7CisgICAgYmNtb3NfZXJybm8gZXJyOworCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3Blcl9zd191cGdyYWRlX2FjdGl2YXRlLCBkZXZpY2UsIHN3X3VwZ3JhZGVfYWN0aXZhdGUsIGtleSk7CisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KDAsICZvcGVyX3N3X3VwZ3JhZGVfYWN0aXZhdGUuaGRyKTsKKyAgICBpZiAoZXJyKQorICAgICAgICByZXR1cm4gZXJyOworCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3Blcl9kaXNjb25uZWN0LCBkZXZpY2UsIGRpc2Nvbm5lY3QsIGtleSk7CisgICAgZXJyID0gYmNtb2x0X29wZXJfc3VibWl0KDAsICZvcGVyX2Rpc2Nvbm5lY3QuaGRyKTsKKyAgICBpZiAoZXJyKQorICAgICAgICByZXR1cm4gZXJyOworCisgICAgQkNNT0xUX09QRVJfSU5JVCgmb3Blcl9jb25uZWN0LCBkZXZpY2UsIGNvbm5lY3QsIGtleSk7CisgICAgcmV0dXJuIGJjbW9sdF9vcGVyX3N1Ym1pdCgwLCAmb3Blcl9jb25uZWN0Lmhkcik7Cit9CisKK2JjbW9zX2Vycm5vIGJjbW9sdF91c2VyX2FwcGxfY2xpX3N3X3VwZ3JhZGVfaW5pdChiY21jbGlfZW50cnkgKnRvcF9kaXIpCit7CisgICAgYmNtY2xpX2VudHJ5ICpkaXIgPSBiY21jbGlfZGlyX2FkZCh0b3BfZGlyLCAic3dfdXBncmFkZSIsCisgICAgICAgICJTb2Z0d2FyZSB1cGdyYWRlIHVzZXIgYXBwbGljYXRpb24iLCBCQ01DTElfQUNDRVNTX0FETUlOLCBOVUxMKTsKKyAgICBCQ01PU19DSEVDS19SRVRVUk5fRVJST1IoIWRpciwgQkNNX0VSUl9OT01FTSk7CisKKyAgICBCQ01DTElfTUFLRV9DTURfTk9QQVJNKGRpciwgImFjdGl2YXRlIiwgIlNXIHVwZ3JhZGUgaW1hZ2UgYWN0aXZhdGlvbiIsIGJjbW9sdF91c2VyX2FwcGxfY2xpX3N3X3VwZ3JhZGVfYWN0aXZhdGUpOworCisgICAgcmV0dXJuIEJDTV9FUlJfT0s7Cit9CisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvc3dfdXBncmFkZS9iY21vbHRfc3dfdXBncmFkZV9jbGkuaCBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvc3dfdXBncmFkZS9iY21vbHRfc3dfdXBncmFkZV9jbGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTE1YTk1Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9zd191cGdyYWRlL2JjbW9sdF9zd191cGdyYWRlX2NsaS5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCis8OmNvcHlyaWdodC1CUkNNOjIwMTQ6RFVBTC9HUEw6c3RhbmRhcmQKKworICAgQ29weXJpZ2h0IChjKSAyMDE0IEJyb2FkY29tIENvcnBvcmF0aW9uCisgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1VubGVzcyB5b3UgYW5kIEJyb2FkY29tIGV4ZWN1dGUgYSBzZXBhcmF0ZSB3cml0dGVuIHNvZnR3YXJlIGxpY2Vuc2UKK2FncmVlbWVudCBnb3Zlcm5pbmcgdXNlIG9mIHRoaXMgc29mdHdhcmUsIHRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorKHRoZSAiR1BMIiksIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmJyb2FkY29tLmNvbS9saWNlbnNlcy9HUEx2Mi5waHAsCit3aXRoIHRoZSBmb2xsb3dpbmcgYWRkZWQgdG8gc3VjaCBsaWNlbnNlOgorCisgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YgdGhpcyBzb2Z0d2FyZSBnaXZlCisgICB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMgc29mdHdhcmUgd2l0aCBpbmRlcGVuZGVudCBtb2R1bGVzLCBhbmQKKyAgIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIHRlcm1zIG9mIHlvdXIKKyAgIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0LCBmb3IgZWFjaCBsaW5rZWQgaW5kZXBlbmRlbnQKKyAgIG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQgbW9kdWxlLgorICAgQW4gaW5kZXBlbmRlbnQgbW9kdWxlIGlzIGEgbW9kdWxlIHdoaWNoIGlzIG5vdCBkZXJpdmVkIGZyb20gdGhpcworICAgc29mdHdhcmUuICBUaGUgc3BlY2lhbCBleGNlcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gYW55IG1vZGlmaWNhdGlvbnMKKyAgIG9mIHRoZSBzb2Z0d2FyZS4KKworTm90IHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgbWF5IHlvdSBjb21iaW5lCit0aGlzIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgQnJvYWRjb20gc29mdHdhcmUgcHJvdmlkZWQKK3VuZGVyIGEgbGljZW5zZSBvdGhlciB0aGFuIHRoZSBHUEwsIHdpdGhvdXQgQnJvYWRjb20ncyBleHByZXNzIHByaW9yCit3cml0dGVuIGNvbnNlbnQuCisKKzo+CisqLworCisjaWZuZGVmIF9CQ01PTFRfU1dfVVBHUkFERV9DTElfSF8KKyNkZWZpbmUgX0JDTU9MVF9TV19VUEdSQURFX0NMSV9IXworCisjaW5jbHVkZSA8YmNtb3Nfc3lzdGVtLmg+CisjaW5jbHVkZSA8YmNtY2xpLmg+CisKK2JjbW9zX2Vycm5vIGJjbW9sdF91c2VyX2FwcGxfY2xpX3N3X3VwZ3JhZGVfaW5pdChiY21jbGlfZW50cnkgKnRvcF9kaXIpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9tYWtlL01ha2VmaWxlLmNvbmZpZyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9tYWtlL01ha2VmaWxlLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDgyMzlhCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL21ha2UvTWFrZWZpbGUuY29uZmlnCkBAIC0wLDAgKzEsMzkxIEBACisjIENvbW1vbiBNYWtlZmlsZSBjb25maWd1cmF0aW9uCisjCisKKyMgVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgbXVzdCBiZSBzZXQKKyMgTU9EX05BTUUgLSBtb2R1bGUgbmFtZS4gRGVwZW5kaW5nIG9uIE1PRF9UWVBFIGNhbiBiZSBlbmNhcHN1bGF0ZWQgKGUuZy4sIE1PRF9OQU1FPW9zIC0tPiBsaWJvcy5hKQorIyBNT0RfVFlQRSAtIG1vZHVsZSB0eXBlLiBTdXBwb3J0ZWQgdHlwZXMgY3VycmVudGx5IGFyZSAibGliIiwgImFwcCIsICJsaW51eF9tb2R1bGUiIGFuZCAibGludXhfbGliIgorIyAgICAgICAgICAgICAgICAgICAgICAgIE5vdGU6CisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBsaWJyYXJ5IG1vZHVsZSBpdCBpcyBwb3NzaWJsZSB0byBzcGVjaWZ5ICJ1bml0ZXN0IiB0YXJnZXQgaW4KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChNQUtFX0RFVklDRV9ESVIpL21vZHVsZXMuaG9zdCAvIGVtYmVkZGVkLgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiB0aGlzIGNhc2UgdW5pdGVzdC5jIGlzIGNvbXBpbGVkIGFuZCBsaW5rZWQgd2l0aCBpdHMgbW9kdWxlIGxpYnJhcnkuCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhvd2V2ZXIsIE1PRF9UWVBFIHJlbWFpbnMgYSAibGliIi4KKyMKKyMgVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgYXJlIG9wdGlvbmFsCisjIHNyY3MgICAgIC0gbGlzdCBvZiAuYyBzb3VyY2UgZmlsZXMgcmVsYXRpdmUgdG8gU1JDX0RJUgorIyBhc19zcmNzICAtIGxpc3Qgb2YgLnMgKGxvd2VyIGNhc2UgcykgICBzb3VyY2UgZmlsZXMgcmVsYXRpdmUgdG8gU1JDX0RJUgorIyBBU19zcmNzICAtIGxpc3Qgb2YgLlMgKHVwcGVyIGNhc2UgLlMpIHNvdXJjZSBmaWxlcyByZWxhdGl2ZSB0byBTUkNfRElSCisjIGdlbl9zcmNzIC0gbGlzdCBvZiAuYyB0aGF0IGhhdmUgdG8gYmUgZ2VuZXJhdGVkIGFzIHBhcnQgb2YgdGhlIGJ1aWxkCisjIE1PRF9ERVBTIC0gbGlzdCBvZiBtb2R1bGVzIHRoZSAiY3VycmVudCIgbW9kdWxlIGRlcGVuZHMgb24uIE9TIGFic3RyYWN0aW9uIGxheWVyIGRlcGVuZGVuY3kKKyMgICAgICAgICAgICAgICAgICAgICAgICAobW9kdWxlICJvcyIpIGlzIGFsd2F5cyBwcmVzZW50IGltcGxpY2l0bHkuIEZvciBleGFtcGxlLCBhcGlfY2xpIG1vZHVsZSdzIE1ha2VmaWxlCisjICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZXMgdGhlIGZvbGxvd2luZyBsaW5lOgorIyAgICAgICAgICAgICAgICAgICAgICAgIE1PRF9ERVBTID0gY2xpIGFwaSB1dGlscyBtb2RlbAorIyBNT0RfSU5DX0RJUlMgLSB1c2VkIHdoZW4gbW9kdWxlIGV4cG9ydHMgaW5jbHVkZXMgaW4gZGlyZWN0b3J5KHMpIG90aGVyIHRoYW4gdGhlIG1vZHVsZSBkaXJlY3RvcnkKKyMgTU9EX0RFRlMgLSBhZGRpdGlvbmFsIGRlZmluZXMsIGluY2x1ZGluZyAtRC4gdGhlIGRlZmluZXMgYXJlIGFkZGVkIHdoZW4gY29tcGlsaW5nICJ0aGlzIiBtb2R1bGUKKyMgICAgICAgICAgICAgICAgICAgICAgICBhbmQgYWxsIG1vZHVsZXMgZGVwZW5kaW5nIG9uIGl0CisjIE1PRF9MSUJTIC0gYWRkaXRpb25hbCBsaWJyYXJpZXMgcmVxdWlyZWQgYnkgdGhlIG1vZHVsZSwgaW5jbHVkaW5nIC1sIGFuZCAtTAorIyBNT0RfQ1VTVE9NIC0gaWYgc2V0ICJ5IiwgZGVmYXVsdCBydWxlIGZvciBidWlsZGluZyB0aGUgbW9kdWxlIGlzIE5PVCBwcm92aWRlZC4KKyMgICAgICAgICAgICAgICAgICAgICAgICBJbiB0aGlzIGNhc2UgdGhlIHJ1bGUgZm9yIGJ1aWxkaW5nICQoTU9EX1RBUkdFVCkgbXVzdCBiZSBwcm92aWRlZCBpbiBtb2R1bGUncyBNYWtlZmlsZQorIworIyBUaGUgZm9sbG93aW5nIHZhcmlhYmxlcyBhcmUgbm90IHJlcXVpcmVkIGluIG1vc3QgY2FzZXMsIGJ1dCBzdXBwb3J0ZWQgbm9uZXRoZWxlc3MKKyMgRVhUUkFfQ0ZMQUdTIC0gZXh0cmEgQ0ZMQUdTIHRoZSBtb2R1bGUgcmVxdWlyZXMgZm9yIGNvbXBpbGF0aW9uCisjIEVYVFJBX0lOQ0xVREVTIC0gZXh0cmEgaW5jbHVkZSBkaXJlY3RvcmllcyB0aGUgbW9kdWxlIHJlcXVpcmVzIGZvciBjb21waWxhdGlvbiAod2l0aCAtSSkKKyMgRVhUUkFfTElCU19QQVRIIC0gYWRkaXRpb25hbCBsaWJyYXJ5IHNlYXJjaCBwYXRocworIyBFWFRSQV9MSUJTIGFkZGl0aW9uYWwgbGlicmFyaWVzIHRvIGxpbmsgd2l0aAorIworIyBUaGUgZm9sbG93aW5nIHZhcmlhYmxlcyBhcmUgcHJlLXNldCBhbmQgY2FuIGJlIHVzZWQgaW4gbW9kdWxlLXNwZWNpZmljIE1ha2VmaWxlCisjIFRPUF9ESVIgLSBmdWxseSBxdWFsaWZpZWQgdG9wIGRpcmVjdG9yeQorIyBNT0RfRElSIC0gbW9kdWxlIGRpcmVjdG9yeSByZWxhdGl2ZSB0byB0aGUgdG9wIGRpcmVjdG9yeQorIyBPVVRfRElSX0JBU0UgLSBvdXRwdXQgZGlyZWN0b3J5IGJhc2UKKyMgQUxMX01PRFVMRVMgLSBsaXN0IG9mIGFsbCBtb2R1bGVzIGluIHRoZSBjdXJyZW50IHN1YnN5c3RlbSAoaG9zdC9lbWJlZGRlZCkKKyMgQUxMX0xJQl9NT0RVTEVTIC0gbGlzdCBvZiBhbGwgbGliIG1vZHVsZXMgaW4gdGhlIGN1cnJlbnQgc3Vic3lzdGVtIChob3N0L2VtYmVkZGVkKQorIyBBTExfQVBQX01PRFVMRVMgLSBsaXN0IG9mIGFsbCBhcHAgbW9kdWxlcyBpbiB0aGUgY3VycmVudCBzdWJzeXN0ZW0gKGhvc3QvZW1iZWRkZWQpCisjIFNJTVVMQVRJT05fQlVJTEQgLSBzZXQgInkiIGZvciBzaW11bGF0aW9uIGJ1aWxkIChDUk9TU19DT01QSUxFIGlzIGVtcHR5KQorIyBPUyAtIE9TCisjIEVOQUJMRV9FUE9OIC0gc2V0ICJ5IiBpZiBFUE9OIG1vZGUgaXMgaW5jbHVkZWQKKyMgRU5BQkxFX0dQT04gLSBzZXQgInkiIGlmIEdQT04gbW9kZSBpcyBpbmNsdWRlZAorIyBFTkFCTEVfWEdQT04gLSBzZXQgInkiIGlmIFhHUE9OIG1vZGUgaXMgaW5jbHVkZWQKKyMgRU5BQkxFX0dQT05fT1JfWEdQT04gLSBzZXQgInkiIGlmIEdQT04gb3IgWEdQT04gbW9kZSBpcyBpbmNsdWRlZAorIyBFTkFCTEVfQ0xJIC0gc2V0ICJuIiBpZiBob3N0IENMSSBzdXBwb3J0IGlzIG5vdCByZXF1aXJlZAorIyBFTkFCTEVfTE9HIC0gc2V0ICJuIiBpZiBob3N0IGxvZ2dlciBzdXBwb3J0IGlzIG5vdCByZXF1aXJlZAorIworIyBVU0VfQ0xBTkcgLSBzZXQgInkiIHRvIGVuYWJsZSBDTEFORyBjb2RlIHBhc3MgZm9yIGltcHJvdmVkIGRpYWdub3N0aWMKKyMKKyMgVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgYXJlIHByZS1zZXQgYW5kIGNhbiBiZSB1c2VkIGFuZC9vciBvdmVyd3JpdHRlbiBpbiBtb2R1bGUtc3BlY2lmaWMgTWFrZWZpbGUKKyMgU1JDX0RJUiAtIGZ1bGx5LXF1YWxpZmllZCBzb3VyY2UgZGlyZWN0b3J5CisjIE9VVF9ESVIgLSBtb2R1bGUgb3V0cHV0IGRpcmVjdG9yeQorIyBUQVJHRVRfTElCIC0gbGlicmFyeSBuYW1lIGZvciAibGliIiBtb2R1bGUuIEJ5IGRlZmF1bHQgaXQgaXMgJChNT0RfTkFNRSkKKyMgVEFSR0VUX0xJQl9GTkFNRSAtIG1vZHVsZSBsaWJyYXJ5IGZpbGUgbmFtZSBpbmNsdWRpbmcgcGF0aC4gQnkgZGVmYXVsdCBpdCBpcyAkKE9VVF9ESVIpL2xpYiQoVEFSR0VUX0xJQikuYQorIyBNT0RfVEFSR0VUIC0gbW9kdWxlIHRhcmdldCBuYW1lLCBpbmNsdWRpbmcgcGF0aC4gQnkgZGVmYXVsdCBpdCBpcworIyAgICAgICAkKE9VVF9ESVIpLyQoTU9EX05BTUUpIGZvciAiYXBwIiBtb2R1bGVzCisjICAgICAgICQoVEFSR0VUX0xJQl9GTkFNRSkgZm9yICJsaWIiIG1vZHVsZXMKKyMgQ09ERUdFTl9PVVRQVVRfRElSIC0gb3V0cHV0IGRpcmVjdG9yeSBjb250YWluaW5nIGdlbmVyYXRlZCBmaWxlcworCitUT09MQ0hBSU4gICAgPz0gZ2NjCitPUyAgICAgICAgICAgPz0gcG9zaXgKK0RFQlVHICAgICAgICA/PSB5CitCTERfREVQICAgICAgPz0gZ2NjCitVU0VfQ0xBTkcgCSA/PSBuCisKK2V4cG9ydCBCT0FSRAorZXhwb3J0IFRPT0xDSEFJTgorZXhwb3J0IE9TCitleHBvcnQgREVCVUcKK2V4cG9ydCBCTERfREVQCitleHBvcnQgT1NfS0VSTkVMCisKK1YgPz0gMAoraWZlcSAoeCIkKFYpIiwgeCIwIikKKyAgICBTSUxFTlRfQlVJTEQgPSBACitlbmRpZgorCisjCisjIENvbXBpbGVyIHdhcm5pbmcgY29uZmlndXJhdGlvbgorIyBTb21lIGV4dHJhIHdhcm5pbmdzIGFyZSBhbHdheXMgZW5hYmxlZC4gT3RoZXJzIG11c3QgYmUgb3B0ZWQgaW4gb24gdGhlIG1vZHVsZSBsZXZlbAorIworRU5BQkxFX0VYVFJBX1dBUk5JTkdTID89IHkKK2V4cG9ydCBFTkFCTEVfRVhUUkFfV0FSTklOR1MKKworIyBJbmNsdWRlIG9wdGlvbmFsIHBsYXRmb3JtLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24KKy1pbmNsdWRlICQoTUFLRV9ERVZJQ0VfRElSKS9NYWtlZmlsZS4kKFNVQlNZU1RFTSkuY29uZmlnCisKK0VOQUJMRV9FUE9OICAgICAgPz0geQorRU5BQkxFX0dQT04gICAgICA/PSB5CitFTkFCTEVfWEdQT04gPz0geQorCitFTkFCTEVfR1BPTl9PUl9YR1BPTiA9IG4KK2lmZXEgKCIkKEVOQUJMRV9HUE9OKSIsICJ5IikKKyAgICBFTkFCTEVfR1BPTl9PUl9YR1BPTiA9IHkKK2VuZGlmCitpZmVxICgiJChFTkFCTEVfWEdQT04pIiwgInkiKQorICAgIEVOQUJMRV9HUE9OX09SX1hHUE9OID0geQorZW5kaWYKK2V4cG9ydCBFTkFCTEVfRVBPTgorZXhwb3J0IEVOQUJMRV9HUE9OCitleHBvcnQgRU5BQkxFX1hHUE9OCitleHBvcnQgRU5BQkxFX0dQT05fT1JfWEdQT04KKworU1JDX0RJUiAgICAgICAgICA9ICQoVE9QX0RJUikvJChNT0RfRElSKQorCitpZmVxICgiJChSRUxFQVNFX0JVSUxEKSIsICJ5IikKKyAgICBPVVRfRElSX0JBU0UgPz0gJChUT1BfRElSKS9idWlsZAorICAgIE9VVF9ESVIgICAgICA9ICQoT1VUX0RJUl9CQVNFKS8kKE1PRF9ESVIpCisgICAgTU9ERUxfT1VUX0RJUj0gJChUT1BfRElSKS9ob3N0X2RyaXZlci9tb2RlbAorICAgIENPTkZJR19ESVIgICAgICA9IGhvc3RfZHJpdmVyL2NvbmZpZworZWxzZQorICAgIE9VVF9ESVJfQkFTRSA/PSAkKFRPUF9ESVIpL2J1aWxkLyQoUExBVEZPUk0pLyQoU1VCU1lTVEVNKQorICAgIE9VVF9ESVIgICAgICA9ICQoT1VUX0RJUl9CQVNFKS8kKE1PRF9ESVIpCisgICAgTU9ERUxfT1VUX0RJUj0gJChPVVRfRElSX0JBU0UpL2NvbW1vbi9tb2RlbC8kKFBMQVRGT1JNKQorICAgIENPTkZJR19ESVIgICAgICA9ICQoU1VCU1lTVEVNKS9jb25maWcKKyAgICBPU19QTEFURk9STV9ESVIgPSAkKFNVQlNZU1RFTSkvb3NfYWJzdHJhY3Rpb24vJChQTEFURk9STSkKK2VuZGlmCisKKyMgSG9zdCBDTEkgYW5kIGxvZ2dlciBzdXBwb3J0CitFTkFCTEVfQ0xJID89IHkKK0VOQUJMRV9MT0cgPz0geQorRU5BQkxFX0tUMiA/PSBuCisKK01PRF9ERUZTICs9IC1EVVNFX0RSSVZFUl9DTEk9MSAtREZVTExfRFJJVkVSPTEgLURDRkVfRFJJVkVSPTAKKworZXhwb3J0IEVOQUJMRV9DTEkKK2V4cG9ydCBFTkFCTEVfTE9HCitleHBvcnQgRU5BQkxFX0tUMgorCitpZmVxICgiJChTVUJTWVNURU0pIiwgImVtYmVkZGVkIikKKyAgICBvdmVycmlkZSBFTkFCTEVfQ0xJID0geQorICAgIG92ZXJyaWRlIEVOQUJMRV9MT0cgPSB5CitlbmRpZgorCisjCisjIyMgSW5jbHVkZSBtb2R1bGUgTWFrZWZpbGUKKyMgRm9yIE1PRF9DVVNUT00gb25seSB3aWxsIGJlIGluY2x1ZGVkIGluIE1ha2VmaWxlLnJ1bGVzIHNlY29uZCB0aW1lIGZvciBwcm9wYWdhdGUgY3VzdG9tIHJ1bGVzCisjCitpbmNsdWRlICQoU1JDX0RJUikvTWFrZWZpbGUKKworIyBDb2RlLWdlbmVyYXRvciAtIHJlbGF0ZWQgcGFyYW1ldGVycworQ09ERUdFTl9JTlBVVF9ESVIgICAgICAgID0gJChTUkNfRElSKS9jb2RlZ2VuX3RlbXBsYXRlcworQ09ERUdFTl9PVVRQVVRfRElSICAgICAgID0gJChPVVRfRElSKQorQ09ERUdFTl9ESVIgICAgICAgICAgICAgICAgICAgICAgPSAkKFRPUF9ESVIpL2Jpbi9jb2RlZ2VuCitNT0RFTF9GSUxFICAgICAgICAgICAgICAgICAgICAgICA9ICQoVE9QX0RJUikvY29tbW9uL21vZGVsLyQoUExBVEZPUk0pLyQoUExBVEZPUk0pLm9ianNldAorQ09ERUdFTl9FWEUgICAgICAgICAgICAgICAgICAgICAgPSAkKENPREVHRU5fRElSKS9UZWtub3Z1cy5NZXRhU3RydWN0dXJlLkNvZGVHZW5lcmF0b3IuZXhlCitNT05PX1ZFUiAgICAgICAgICAgID89IDQuMy4yLjQ2NworTU9OT19QQVRIICAgICAgICAgICA/PSAvb3B0L21vbm8tJChNT05PX1ZFUikvYmluL21vbm8KKworZXhwb3J0IFNSQ19ESVIKK2V4cG9ydCBPVVRfRElSX0JBU0UKK2V4cG9ydCBPVVRfRElSCitleHBvcnQgTU9ERUxfT1VUX0RJUgorCitpZmVxICgiJCh3aWxkY2FyZCAkKE1PTk9fUEFUSCkpIiwgIiIpCisgICAgIyBJZiB3ZSBjYW4ndCBmaW5kIE1vbm8gaW5zdGFsbGVkIGluIHRoZSBjb3JyZWN0IHBhdGgsIGRlZmF1bHQgdG8gdGhlIGN1cnJlbnQgUEFUSCB2ZXJzaW9uLgorICAgICMgSW4gdGhlIGZ1dHVyZSwgd2Ugc2hvdWxkIGFsd2F5cyB1c2UgTW9ubyBmcm9tIGEgY29tbW9uIHRvb2xzIGRpcmVjdG9yeS4KKyAgICAjIFRPRE86IGNoYW5nZSB0aGlzIG9uY2UgdGhlIGNvbXBpbGVyL3Rvb2xjaGFpbiBwYXRocyBhcmUgYmV0dGVyIGRlZmluZWQuCisgICAgTU9OT19QQVRIICAgICAgICA9IG1vbm8KK2VuZGlmCisKKyMgVHJlYXQgInllcyIgYW5kICJ5IiB0aGUgc2FtZQoraWZlcSAoIiQoVVNFX0NMQU5HKSIsICJ5ZXMiKQorICAgIFVTRV9DTEFORyA6PSB5CitlbmRpZgoraWZlcSAoIiQoVVNFX0NMQU5HKSIsICJ5IikKKyAgICBpbmNsdWRlICQoTUFLRV9ESVIpL2NsYW5nLm9wdHMKK2VuZGlmCisKKyMgRGlzYWJsZSBjb2RlIGdlbmVyYXRpb24gaW4gcmVsZWFzZSBidWlsZAoraWZlcSAoIiQoUkVMRUFTRV9CVUlMRCkiLCAieSIpCisgICAgc3JjcyA6PSAkKHNyY3MpICQoZ2VuX3NyY3MpCisgICAgZ2VuX3NyY3MgOj0KKyAgICAjIERpc2FibGUgTElOVCBhbmQgQ0xBTkcKKyAgICBVU0VfTElOVCA9IG4KKyAgICBVU0VfQ0xBTkcgPSBuCisJRVhUUkFfREVGSU5FUyArPSAtRFJFTEVBU0VfQlVJTEQKK2VuZGlmCisKK1NSQ1MgPSAkKHN0cmlwICQoc3JjczolPSQoU1JDX0RJUikvJSkpCisKKyMgSW4gQ09NUElMRV9BTExfSU5fT05FX0dPIG1vZGUgYWxsIC5jIGZpbGVzIG9mIGEgbW9kdWxlIGFyZSBjb21waWxlZCBpbgorIyBhIHNpbmdsZSBpbnZvY2F0aW9uIG9mIEJMRF9DQyBjb21waWxlci4gSW4gcmVzdWx0LCBvYmplY3RzIGZpbGVzIGFyZSBjcmVhdGVkCisjIGluIE9VVF9ESVIgZXZlbiBpZiBtb2R1bGUncyAuYyBmaWxlcyBhcmUgc3ByZWFkIGluIHN1Yi1kaXJlY3RvcmllcworaWZlcSAoIiQoQ09NUElMRV9BTExfSU5fT05FX0dPKSIsICJ5IikKKyAgICBzcmNzX25vX2RpciA9ICQobm90ZGlyICQoc3JjcykpCisgICAgX09CSlMgPSAkKHNyY3Nfbm9fZGlyOiUuYz0kKE9VVF9ESVIpLyUubykKK2Vsc2UKKyAgICBfT0JKUyA9ICQoc3JjczolLmM9JChPVVRfRElSKS8lLm8pCitlbmRpZgorCithc19TUkNTID0gJChzdHJpcCAkKGFzX3NyY3M6JT0kKFNSQ19ESVIpLyUpKQorYXNfT0JKUyA9ICQoYXNfc3JjczolLnM9JChPVVRfRElSKS8lLm8pCitfT0JKUyAgKz0gJChhc19PQkpTKQorCitBU19TUkNTID0gJChzdHJpcCAkKEFTX3NyY3M6JT0kKFNSQ19ESVIpLyUpKQorQVNfT0JKUyA9ICQoQVNfc3JjczolLlM9JChPVVRfRElSKS8lLm8pCitfT0JKUyAgKz0gJChBU19PQkpTKQorCitpZm5lcSAoIiQoZ2VuX3NyY3MpIiwgIiIpCisgICAgR0VOX1NSQ1MgPSAkKHN0cmlwICQoZ2VuX3NyY3M6JT0kKENPREVHRU5fT1VUUFVUX0RJUikvJSkpCisgICAgX09CSlMgKz0gJChHRU5fU1JDUzolLmM9JS5vKQorZW5kaWYKK09CSlMgPSAkKHN0cmlwICQoX09CSlMpKQorCisjIEFkZCBkZWZhdWx0IGRlcGVuZGVuY3kgb24gT1MgYWJzdHJhY3Rpb24KK2lmZXEgKCIkKE1PRF9OQU1FKSIsICIiKQorICAgIGlmbmVxICh4IiQoVikiLCB4IjAiKQorICAgICAgICAkKGluZm8gTU9EX05BTUUgaXMgbm90IHNldCBmb3IgJChTUkNfRElSKS9NYWtlZmlsZS4gU2tpcHBpbmcuLikKKyAgICBlbmRpZgorICAgIE1PRF9UWVBFID0gX3NraXBfCitlbmRpZgorCisjIEFkZCBkZWZhdWx0IGRlcGVuZGVuY3kgb24gT1MgYWJzdHJhY3Rpb24KK2lmbmVxICgiJChNT0RfU1VQUFJFU1NfT1NfREVQKSwgInkpCisgICAgaWZlcSAoIiQoTU9EX1RZUEUpIiwgImxpbnV4X21vZHVsZSIpCisgICAgICAgIF9rZXJuZWwgPSB5CisgICAgZW5kaWYKKyAgICBpZmVxICgiJChNT0RfVFlQRSkiLCAibGludXhfbGliIikKKyAgICAgICAgX2tlcm5lbCA9IHkKKyAgICBlbmRpZgorICAgIGlmZXEgKCIkKF9rZXJuZWwpIiwgInkiKQorICAgICAgICAgTU9EX0RFUFMgOj0gb3NfbGludXggJChNT0RfREVQUykKKyAgICBlbHNlCisgICAgICAgICBNT0RfREVQUyA6PSBvcyAkKE1PRF9ERVBTKQorICAgIGVuZGlmCitlbmRpZgorCisjIEdFTl9PQkpUQUdTIGRlZmluZSB3aGljaCBvYmplY3RzIGFyZSBnZW5lcmF0ZWQuIElmIG5vdCBzZXQgZXhwbGljaXRseSwKKyMgZGVyaXZlIGl0IGZyb20gRU5BQkxFX0VQT04sIEVOQUJMRV9HUE9OLCBFTkFCTEVfWEdQT04gZmxhZ3MKK2lmZXEgKCIkKEdFTl9PQkpUQUdTKSIsICIiKQorICAgIGlmZXEgKCIkKEVOQUJMRV9FUE9OKSIsICJ5IikKKyAgICAgICAgR0VOX09CSlRBR1MgOj0gJChHRU5fT0JKVEFHUyksRVBPTixBRQorICAgIGVuZGlmCisgICAgaWZlcSAoIiQoRU5BQkxFX0dQT04pIiwgInkiKQorICAgICAgICBHRU5fT0JKVEFHUyA6PSAkKEdFTl9PQkpUQUdTKSxHUE9OCisgICAgZW5kaWYKKyAgICBpZmVxICgiJChFTkFCTEVfWEdQT04pIiwgInkiKQorICAgICAgICBHRU5fT0JKVEFHUyA6PSAkKEdFTl9PQkpUQUdTKSxYR1BPTgorICAgIGVuZGlmCisgICAgaWZlcSAoIiQoR0VOX09CSlRBR1MpIiwgIiIpCisgICAgICAgICQoZXJyb3IgQXQgbGVhc3Qgb25lIG9mIEVOQUJMRV9FUE9OLCBFTkFCTEVfR1BPTiwgRU5BQkxFX1hHUE9OIG11c3QgYmUgc2V0ID15KQorICAgIGVuZGlmCitlbmRpZgorCisjIEV4dHJhIHR5cGVzIGZpbHRlcgoraWZuZXEgKCIkKEVYVFJBX1RZUEVTKSIsICIiKQorICAgIEVYVFJBX1RZUEVTIDo9ICQoc2hlbGwgZWNobyAtbiAkKEVYVFJBX1RZUEVTKSB8IHNlZCAtZSAncy8gL1xcfC9nJykKKyAgICBHRU5fRVhUUkFfVFlQRVMgOj0gLXR5cGVOYW1lRmlsdGVyPVxeXCgkKEVYVFJBX1RZUEVTKVwpXCQkCitlbmRpZgorCitPU19LRVJORUwgPz0gJChPUykKK1VDX1BMQVRGT1JNID0gJChzaGVsbCBlY2hvICQoUExBVEZPUk0pIHwgdHIgYS16IEEtWikKK1VDX1NVQlNZU1RFTSA9ICQoc2hlbGwgZWNobyAkKFNVQlNZU1RFTSkgfCB0ciBhLXogQS1aKQorVUNfT1MgPSAkKHNoZWxsIGVjaG8gJChPUykgfCB0ciBhLXogQS1aKQorVUNfT1NfS0VSTkVMID0gJChzaGVsbCBlY2hvICQoT1NfS0VSTkVMKSB8IHRyIGEteiBBLVopCisKK0JVSUxEX1RJTUUgPSAkKHNoZWxsIGRhdGUgKyVzKQorQlVJTERfVElNRV9aT05FID0gJChzaGVsbCBkYXRlICslOnopCitFWFRSQV9DRkxBR1MgKz0gLURCVUlMRF9USU1FPSQoQlVJTERfVElNRSkgLURCVUlMRF9USU1FX1pPTkU9JyIkKEJVSUxEX1RJTUVfWk9ORSkiJworCitFWFRSQV9ERUZJTkVTICAgKz0gLURCQ01fU1VCU1lTVEVNXyQoVUNfU1VCU1lTVEVNKSAtREJDTV9QTEFURk9STV8kKFVDX1BMQVRGT1JNKSAtREJDTV9PU18kKFVDX09TKQorRVhUUkFfREVGSU5FUyAgICs9IC1EJChVQ19PU19LRVJORUwpX0tFUk5FTF9TUEFDRQoraWZlcSAoIiQoRU5BQkxFX0VQT04pIiwgInkiKQorICAgIEVYVFJBX0RFRklORVMgICAgICAgKz0gLURCQ01fRVBPTgorZW5kaWYKK2lmZXEgKCIkKEVOQUJMRV9HUE9OKSIsICJ5IikKKyAgICBFWFRSQV9ERUZJTkVTICAgICAgICs9IC1EQkNNX0dQT04KK2VuZGlmCitpZmVxICgiJChFTkFCTEVfWEdQT04pIiwgInkiKQorICAgIEVYVFJBX0RFRklORVMgICAgICAgKz0gLURCQ01fWEdQT04KK2VuZGlmCisKKyMgQnVpbGQgdW5pdGVzdHMgZm9yIHNpbXVsYXRpb24gYW5kIGZyb20gSmVua2lucyBqb2JzCitVTklURVNUID89IG4KKworaWZlcSAoIiQoU0lNVUxBVElPTl9CVUlMRCkiLCAieSIpCisgICAgRVhUUkFfREVGSU5FUyArPSAtRFNJTVVMQVRJT05fQlVJTEQKKyAgICBVTklURVNUID0geQorZW5kaWYKKworaWZlcSAoIiQoSkVOS0lOU19CVUlMRCkiLCAieSIpCisgICAgVU5JVEVTVCA9IHkKK2VuZGlmCisKK0VYVFJBX0lOQ0xVREVTICArPSAtSSQoU1JDX0RJUikKKworT1BUX0RJU0FCTEVfRU1CRURERUQgPz0gbgorT1BUX0RJU0FCTEVfSE9TVCA/PW4KKworaWZlcSAoIk9QVF9ESVNBQkxFXyQoVUNfU1VCU1lTVEVNKSIsICJPUFRfRElTQUJMRV9FTUJFRERFRCIpCisgICAgT1BUX0RJU0FCTEUgOj0gJChPUFRfRElTQUJMRV9FTUJFRERFRCkKK2Vsc2UKKyAgICBPUFRfRElTQUJMRSA6PSAkKE9QVF9ESVNBQkxFX0hPU1QpCitlbmRpZgorCitBUkNIX0NGTEFHUyA9ICQoQVJDSF9GTEFHUykKK2lmZXEgKCIkKE9QVF9ESVNBQkxFKSIsICJ5IikKKyAgICBBUkNIX0NGTEFHUwkJKz0gJChERUJVR19PX0NGTEFHUykKKyAgICBFWFRSQV9MRkxBR1MgICAgKz0gJChERUJVR19PX0xGTEFHUykKKyAgICBFWFRSQV9BU0ZMQUdTICAgKz0gJChERUJVR19PX0FTRkxBR1MpCisgICAgRVhUUkFfYXNGTEFHUyAgICs9ICQoREVCVUdfT19hc0xBR1MpCitlbHNlCisgICAgQVJDSF9DRkxBR1MgICAgICs9ICQoUkVMRUFTRV9PX0NGTEFHUykKKyAgICBFWFRSQV9MRkxBR1MgICAgKz0gJChSRUxFQVNFX09fTEZMQUdTKQorICAgIEVYVFJBX0FTRkxBR1MgICArPSAkKFJFTEVBU0VfT19BU0ZMQUdTKQorICAgIEVYVFJBX2FzRkxBR1MgICArPSAkKFJFTEVBU0VfT19hc0ZMQUdTKQorZW5kaWYKKworIyBUcmVhdCBsaWIgYXMgc2hhcmVkIGxpYiBpZiBCVUlMRF9TSEFSRURfTElCUyBpcyB5CitpZmVxICAoIiQoQlVJTERfU0hBUkVEX0xJQlMpIiwgInkiKQorICAgaWZlcSAgKCIkKE1PRF9UWVBFKSIsICJsaWIiKQorICAgICAgTU9EX1RZUEUgPSBzaGFyZWRfbGliCisgICBlbmRpZgorICAgU0hBUkVEX0xJQl9QQVRIID89ICQoT1VUX0RJUl9CQVNFKS9zaGFyZWRfbGlicworZW5kaWYKKworIyBDYWxjdWxhdGUgTU9EX1RBUkdFVCBiYXNlZCBvbiBNT0RfVFlQRQoraWZlcSAgKCIkKE1PRF9UWVBFKSIsICJsaWIiKQorICAgIGlmbmVxICgiJChPQkpTKSIsICIiKQorICAgICAgICBUQVJHRVRfTElCID89ICQoTU9EX05BTUUpCisgICAgICAgIFRBUkdFVF9MSUJfRk5BTUUgPz0gJChPVVRfRElSKS9saWIkKFRBUkdFVF9MSUIpLmEKKyAgICBlbmRpZgorICAgIE1PRF9UQVJHRVQgPz0gJChUQVJHRVRfTElCX0ZOQU1FKQorZWxzZSBpZmVxICAoIiQoTU9EX1RZUEUpIiwgInNoYXJlZF9saWIiKQorCWlmbmVxICgiJChPQkpTKSIsICIiKQorCQlUQVJHRVRfTElCID89ICQoTU9EX05BTUUpCisJCVRBUkdFVF9MSUJfRk5BTUUgPz0gJChPVVRfRElSKS9saWIkKFRBUkdFVF9MSUIpLnNvCisJZW5kaWYKKwlNT0RfVEFSR0VUID89ICQoVEFSR0VUX0xJQl9GTkFNRSkKK2Vsc2UgaWZlcSAgKCIkKE1PRF9UWVBFKSIsICJhcHAiKQorICAgIE1PRF9UQVJHRVQgPz0gJChPVVRfRElSKS8kKE1PRF9OQU1FKQorZWxzZSBpZmVxICAoIiQoTU9EX1RZUEUpIiwgImxpbnV4X21vZHVsZSIpCisgICAgaWZlcSAoIiQoS0VSTkVMRElSKSIsICIiKQorICAgICAgICAkKGVycm9yIEtFUk5FTERJUiBtdXN0IGJlIHNldCBpbiBib2FyZCBwcm9maWxlKQorICAgIGVuZGlmCisgICAgaWZlcSAoIiQoS0VSTkVMX0FSQ0gpIiwgIiIpCisgICAgICAgICQoZXJyb3IgS0VSTkVMX0FSQ0ggbXVzdCBiZSBzZXQgaW4gYm9hcmQgcHJvZmlsZSkKKyAgICBlbmRpZgorICAgIGlmZXEgKCIkKEtFUk5FTF9PVVRESVIpIiwgIiIpCisgICAgICAgIEtFUk5FTF9PVVRESVIgOj0gJChLRVJORUxESVIpCisgICAgZW5kaWYKKyAgICBNT0RfVEFSR0VUID89ICQoU1JDX0RJUikvJChNT0RfTkFNRSkua28KK2Vsc2UgaWZlcSAoIiQoTU9EX1RZUEUpIiwgImxpbnV4X2xpYiIpCisgICAgTU9EX1RBUkdFVCA/PSAkKE9VVF9ESVJfQkFTRSkvJChNT0RfTkFNRSkubGludXhsaWIKK2Vsc2UgaWZlcSAoIiQoTU9EX1RZUEUpIiwgIl9za2lwXyIpCisgICAgTU9EX1RBUkdFVCA9IC5kdW1teQorZWxzZQorICAgICQoZXJyb3IgTU9EX1RZUEUgJChNT0RfVFlQRSkgaXMgaW5jb3JyZWN0IGZvciBtb2R1bGUgJChNT0RfTkFNRSkuIE11c3QgYmUgbGliIG9yIGFwcCkKK2VuZGlmCisKK2lmZXEgKCIkKE1PRF9UQVJHRVQpIiwgIiIpCisgICBNT0RfVEFSR0VUID0gJChNT0RfTkFNRSkKK2VuZGlmCisKK2lmZXEgKCIkKE9TKSIsICJwb3NpeCIpCisgICAgRVhUUkFfREVGSU5FUyArPSAtRF9YT1BFTl9TT1VSQ0U9NjAwCisgICAgTElCUyAgID0gLWxydCAtbHB0aHJlYWQgLWxtCitlbmRpZgorCisjIE1ha2Ugc3VyZSB0aGF0IHBhdGhzIGluIEVYVFJBX0lOQ0xVREVTIGFyZSBhYnNvbHV0ZQoraWZuZXEgKCIkKEVYVFJBX0lOQ0xVREVTKSIsICIiKQorICAgICMgTWFrZSBzdXJlIHRoYXQgZWFjaCBkaXJlY3RvcnkgaXMgYW4gYWJzb2x1dGUgcGF0aAorICAgIEVYVFJBX0lOQ1MgPSAkKGFkZHByZWZpeCAtSSQoVE9QX0RJUikvLCAkKHN1YnN0IC1JLCwkKHN1YnN0ICQoVE9QX0RJUikvLCwkKEVYVFJBX0lOQ0xVREVTKSkpKQorZW5kaWYKK2lmbmVxICgiJChFWFRSQV9BU0lOQ0xVREVTKSIsICIiKQorICAgICMgTWFrZSBzdXJlIHRoYXQgZWFjaCBkaXJlY3RvcnkgaXMgYW4gYWJzb2x1dGUgcGF0aAorICAgIEVYVFJBX0FTSU5DUyA9ICQoYWRkcHJlZml4IC1JJChUT1BfRElSKS8sICQoc3Vic3QgLUksLCQoc3Vic3QgJChUT1BfRElSKS8sLCQoRVhUUkFfQVNJTkNMVURFUykpKSkKK2VuZGlmCitpZm5lcSAoIiQoRVhUUkFfYXNJTkNMVURFUykiLCAiIikKKyAgICAjIE1ha2Ugc3VyZSB0aGF0IGVhY2ggZGlyZWN0b3J5IGlzIGFuIGFic29sdXRlIHBhdGgKKyAgICBFWFRSQV9hc0lOQ1MgPSAkKGFkZHByZWZpeCAtSSQoVE9QX0RJUikvLCAkKHN1YnN0IC1JLCwkKHN1YnN0ICQoVE9QX0RJUikvLCwkKEVYVFJBX2FzSU5DTFVERVMpKSkpCitlbmRpZgoraWZlcSAoIiQoVVNFX0xJTlQpIiwgInkiKQorICAgIFVTRV9MSU5UIDo9IHllcworZW5kaWYgICAgCitpZmVxICgiJChVU0VfTElOVCkiLCAieWVzIikKKyAgICBFWFRSQV9ERUZJTkVTICs9IC1EVVNFX0xJTlQKK2VuZGlmICAgIAorCitFWFRSQV9ERUZJTkVTICs9ICQoVVNFUl9FWFRSQV9ERUZJTkVTKSAkKFVTRVJfRVhUUkFfJChVQ19TVUJTWVNURU0pX0RFRklORVMpCitFWFRSQV9DRkxBR1MgKz0gJChVU0VSX0VYVFJBX0NGTEFHUykgJChVU0VSX0VYVFJBXyQoVUNfU1VCU1lTVEVNKV9DRkxBR1MpCitDRkxBR1MgICs9ICQoQVJDSF9DRkxBR1MpICQoRVhUUkFfQ0ZMQUdTKSAgJChFWFRSQV9JTkNTKSAkKEVYVFJBX0RFRklORVMpCitBU0ZMQUdTICs9ICQoQVJDSF9GTEFHUykgJChFWFRSQV9BU0ZMQUdTKSAkKEVYVFJBX0FTSU5DUykgJChFWFRSQV9BU0RFRklORVMpCithc0ZMQUdTICs9ICQoQVJDSF9GTEFHUykgJChFWFRSQV9hc0ZMQUdTKSAkKEVYVFJBX2FzSU5DUykgJChFWFRSQV9hc0RFRklORVMpCitMRkxBR1MgICs9ICQoQVJDSF9GTEFHUykgJChFWFRSQV9MRkxBR1MpCitERVBfRkxBR1MgKz0gJChFWFRSQV9DRkxBR1MpICQoRVhUUkFfSU5DUykgJChFWFRSQV9ERUZJTkVTKQorQ0xBTkdfRkxBR1MgKz0gJChFWFRSQV9DRkxBR1MpICQoRVhUUkFfSU5DUykgJChFWFRSQV9ERUZJTkVTKSAkKENMQU5HX09QVFMpCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvbWFrZS9NYWtlZmlsZS5pbml0aWFsX2NvbmZpZyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9tYWtlL01ha2VmaWxlLmluaXRpYWxfY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MWVjODQKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvbWFrZS9NYWtlZmlsZS5pbml0aWFsX2NvbmZpZwpAQCAtMCwwICsxLDYgQEAKK2lmZXEgKCIkKFRFUk0pIiwgImR1bWIiKQorICAgICAgICBCT0xEX1BSSU5UIDo9IHByaW50ZiAiXG4tLS0tICVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCitlbHNlCisgICAgICAgIEJPTERfUFJJTlQ/PXByaW50ZiAiG1swMW0lcxtbMG1cbiIKK2VuZGlmCitleHBvcnQgQk9MRF9QUklOVApkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL21ha2UvTWFrZWZpbGUubWFpbiBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9tYWtlL01ha2VmaWxlLm1haW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRkZWYxZQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9tYWtlL01ha2VmaWxlLm1haW4KQEAgLTAsMCArMSwxNTMgQEAKKyMgTWFpbiBNYWtlZmlsZSBib2R5CisjIEl0IGlzIGluY2x1ZGVkIGluIHRoZSBjZW50cmFsIE1ha2VmaWxlIHR3aWNlIC0gZm9yIGhvc3QgYW5kIGVtYmVkZGVkIHN1YnN5c3RlbXMKKyMgUEFSQU1BVEVSOiBTVUJTWVNURU0KKworVUNfU1VCU1lTVEVNID0gJChzaGVsbCBlY2hvICQoU1VCU1lTVEVNKSB8IHRyIGEteiBBLVopCisKKyQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpLy5kZXBzXyQoU1VCU1lTVEVNKV9saXN0XyQoQk9BUkQpOiAkKE1BS0VfREVWSUNFX0RJUikvbW9kdWxlcy4kKFNVQlNZU1RFTSkgXAorICAgICAgICAkKE1BS0VfRElSKS9NYWtlZmlsZS5jb25maWcgJChNQUtFX0RJUikvTWFrZWZpbGUucnVsZXMgJChNQUtFX0RJUikvTWFrZWZpbGUudGVtcGxhdGUgJChNQUtFX0RJUikvTWFrZWZpbGUubWFpbgorCUBpZiAhIHRlc3QgLWYgJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvLmRlcHNfJChTVUJTWVNURU0pX2xpc3RfJChCT0FSRCk7IHRoZW5cCisJICAgIGlmIGxzICQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpLy5kZXBzXyQoU1VCU1lTVEVNKV9saXN0XyogMj4vZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlblwKKwkgICAgCW9sZGRlcHM9YGxzICQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpLy5kZXBzXyQoU1VCU1lTVEVNKV9saXN0XypgIDsgXAorCSAgICAJb2xkX2JvYXJkPWBlY2hvICQkb2xkZGVwcyB8IHNlZCAnc0AkKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKS8uZGVwc18kKFNVQlNZU1RFTSlfbGlzdF9AQCdgIDsgXAorCQkJJChCT0xEX1BSSU5UKSAiUHJldmlvdXMgYnVpbGQgd2FzIGZvciBkaWZmZXJlbnQgYm9hcmQgJCRvbGRfYm9hcmQuIGNsZWFuaW5nIHVwLi4iO1wKKwkJCSQoTUFLRSkgLXMgQk9BUkQ9JCRvbGRfYm9hcmQgVj0wIGNsZWFuXyQoU1VCU1lTVEVNKTsgXAorCQlmaTtcCisJZmkKKwlAJChCT0xEX1BSSU5UKSAiR2VuZXJhdGluZyBsaXN0IG9mICQoU1VCU1lTVEVNKSBtb2R1bGVzIGZvciAkKFBMQVRGT1JNKSIKKwlAcm0gLWZyICQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpLy5kZXBzXyQoU1VCU1lTVEVNKV9saXN0XyoKKwlAcm0gLWZyICQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpL2FsbF9tb2R1bGVzLiQoU1VCU1lTVEVNKQorCUBybSAtZnIgJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvYWxsX2xpYl9tb2R1bGVzLiQoU1VCU1lTVEVNKQorCUBybSAtZnIgJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvYWxsX2FwcF9tb2R1bGVzLiQoU1VCU1lTVEVNKQorCUBta2RpciAtcCAkKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKQorCUB0b3VjaCAkKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKS9hbGxfbW9kdWxlcy4kKFNVQlNZU1RFTSkKKwlAdG91Y2ggJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvYWxsX2xpYl9tb2R1bGVzLiQoU1VCU1lTVEVNKQorCUB0b3VjaCAkKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKS9hbGxfYXBwX21vZHVsZXMuJChTVUJTWVNURU0pCisJQGZvciBtb2RfZGlyIGluIGBhd2sgJ3twcmludCAkJDF9JyAkKE1BS0VfREVWSUNFX0RJUikvbW9kdWxlcy4kKFNVQlNZU1RFTSlgOyBkb1wKKwkJaWYgdGVzdCAiJCRtb2RfZGlyIiA9ICIiIDsgdGhlbiBjb250aW51ZTsgZmk7IFwKKwkJbW9kX25hbWU9YCQoTUFLRSkgLXMgVj0wIFNVQlNZU1RFTT0kKFNVQlNZU1RFTSkgTU9EX0RJUj0kJG1vZF9kaXIgU0tJUF9ERVBTPXllcyAtZiAkKE1BS0VfRElSKS9NYWtlZmlsZS50ZW1wbGF0ZSBtb2R1bGVfbmFtZWA7XAorCQlpZiB0ZXN0ICIkJG1vZF9uYW1lIiA9ICIiIDsgdGhlbiBjb250aW51ZTsgZmk7IFwKKwkJbW9kX25hbWU9JCR7bW9kX25hbWV9XyQoU1VCU1lTVEVNKTtcCisJCW1vZF90eXBlPWBncmVwIC1lICdeW1s6c3BhY2U6XV0qTU9EX1RZUEVbWzpzcGFjZTpdXSo9JyAkJG1vZF9kaXIvTWFrZWZpbGUgfCBhd2sgLUY9ICd7c3ViKC9cci8sIiIpOyBwcmludCAkJDJ9JyB8IHNlZCAtZSAncy9eWyBcdF0qLy8nYDsgXAorCQllY2hvIC1uICIkJG1vZF9uYW1lICIgPj4gJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvYWxsX21vZHVsZXMuJChTVUJTWVNURU0pOyBcCisJCWlmIHRlc3QgImBlY2hvIC1uICQkbW9kX3R5cGUgfCBzZWQgLWUgJ3MvbGludXhfbGliIGxpYi9saWIvJyB8IHNlZCAtZSAncy9saWIgbGludXhfbGliL2xpYi8nYCIgPSAibGliIiA7IHRoZW5cCisJCQllY2hvIC1uICIkJG1vZF9uYW1lICIgPj4gJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvYWxsX2xpYl9tb2R1bGVzLiQoU1VCU1lTVEVNKTsgXAorCQlmaTtcCisJCWlmIHRlc3QgIiQkbW9kX3R5cGUiID0gImFwcCIgOyB0aGVuXAorCQkJZWNobyAtbiAiJCRtb2RfbmFtZSAiID4+ICQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpL2FsbF9hcHBfbW9kdWxlcy4kKFNVQlNZU1RFTSk7IFwKKwkJZmk7XAorCWRvbmUKKwlAdG91Y2ggJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvLmRlcHNfJChTVUJTWVNURU0pX2xpc3RfJChCT0FSRCkKKworJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvLmRlcHNfJChTVUJTWVNURU0pXyQoQk9BUkQpOiAkKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKS8uZGVwc18kKFNVQlNZU1RFTSlfbGlzdF8kKEJPQVJEKQorCUAkKEJPTERfUFJJTlQpICJCdWlsZGluZyAkKEJPQVJEKSBib2FyZCBlbnZpcm9ubWVudCBmb3IgJChQTEFURk9STSkiCisJJChNQUtFKSBTVUJTWVNURU09JChTVUJTWVNURU0pIE1PRF9ESVI9JCRtb2RfZGlyIE9VVF9ESVJfQkFTRT0kKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKSBTS0lQX0RFUFM9eWVzIFwKKyAgICAgICAgICAgIEFMTF9NT0RVTEVTPSJgY2F0ICQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpL2FsbF9tb2R1bGVzLiQoU1VCU1lTVEVNKWAiIFwKKyAgICAgICAgICAgIEFMTF9MSUJfTU9EVUxFUz0iYGNhdCAkKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKS9hbGxfbGliX21vZHVsZXMuJChTVUJTWVNURU0pYCIgXAorICAgICAgICAgICAgQUxMX0FQUF9NT0RVTEVTPSJgY2F0ICQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpL2FsbF9hcHBfbW9kdWxlcy4kKFNVQlNZU1RFTSlgIiBcCisgICAgICAgICAgICAtZiAkKE1BS0VfRElSKS9NYWtlZmlsZS50ZW1wbGF0ZSBib2FyZF9lbnYKKwlAJChCT0xEX1BSSU5UKSAiR2VuZXJhdGluZyAkKFNVQlNZU1RFTSkgZGVwZW5kZW5jaWVzIGZvciAkKFBMQVRGT1JNKSIKKwlAZm9yIG1vZF9kaXIgaW4gYGF3ayAne3ByaW50ICQkMX0nICQoTUFLRV9ERVZJQ0VfRElSKS9tb2R1bGVzLiQoU1VCU1lTVEVNKWA7IGRvXAorCQlpZiB0ZXN0ICIkJG1vZF9kaXIiID0gIiIgOyB0aGVuIGNvbnRpbnVlOyBmaTsgXAorCQltb2RfbmFtZT1gJChNQUtFKSAtcyBWPTAgU1VCU1lTVEVNPSQoU1VCU1lTVEVNKSBNT0RfRElSPSQkbW9kX2RpciBTS0lQX0RFUFM9eWVzIC1mICQoTUFLRV9ESVIpL01ha2VmaWxlLnRlbXBsYXRlIG1vZHVsZV9uYW1lYDtcCisJCWlmIHRlc3QgIiQkbW9kX25hbWUiID0gIiIgOyB0aGVuIGNvbnRpbnVlOyBmaTsgXAorCQlpZiAhICQoTUFLRSkgJChTSUxFTlQpIFNVQlNZU1RFTT0kKFNVQlNZU1RFTSkgTU9EX0RJUj0kJG1vZF9kaXIgT1VUX0RJUl9CQVNFPSQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpIFNLSVBfREVQUz15ZXMgXAorCQkJQUxMX01PRFVMRVM9ImBjYXQgJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvYWxsX21vZHVsZXMuJChTVUJTWVNURU0pYCIgXAorCQkJQUxMX0xJQl9NT0RVTEVTPSJgY2F0ICQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpL2FsbF9saWJfbW9kdWxlcy4kKFNVQlNZU1RFTSlgIiBcCisJCQlBTExfQVBQX01PRFVMRVM9ImBjYXQgJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvYWxsX2FwcF9tb2R1bGVzLiQoU1VCU1lTVEVNKWAiIFwKKwkJCS1mICQoTUFLRV9ESVIpL01ha2VmaWxlLnRlbXBsYXRlIG1vZGRlcDsgdGhlbiBleGl0IDE7XAorCQlmaTtcCisJZG9uZQorCUB0b3VjaCAkKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKS8uZGVwc18kKFNVQlNZU1RFTSlfJChCT0FSRCkKKworLlBIT05ZOgorCisjIE1ha2Ugc3VyZSB0aGF0IG5vbmUgb2YgbW9kdWxlIE1ha2VmaWxlcyBjaGFuZ2VkLgorIyBJZiB0aGVyZSBpcyBhIGNoYW5nZSAtIHdlIG5lZWQgdG8gcmVnZW5lcmF0ZSBkZXBlbmRlbmNpZXMKK19kZXBzXyQoU1VCU1lTVEVNKV86ICQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpLy5kZXBzXyQoU1VCU1lTVEVNKV8kKEJPQVJEKSAuUEhPTlkKKwlAY2F0ICQoTUFLRV9ERVZJQ0VfRElSKS9tb2R1bGVzLiQoU1VCU1lTVEVNKSB8IHdoaWxlIHJlYWQgLXIgbW9kX2Rpcl90YXJnOyBkb1wKKwkJCW1vZF9kaXI9YGVjaG8gJCRtb2RfZGlyX3RhcmcgfCBhd2sgJ3twcmludCAkJDF9J2A7XAorCQkJaWYgdGVzdCAiJCRtb2RfZGlyIiA9ICIiIDsgdGhlbiBjb250aW51ZTsgZmk7IFwKKwkJCWlmIHRlc3QgJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvLmRlcHNfJChTVUJTWVNURU0pX2xpc3RfJChCT0FSRCkgLW90ICQkbW9kX2Rpci9NYWtlZmlsZTsgdGhlblwKKwkJCQllY2hvICQkbW9kX2Rpci9NYWtlZmlsZSBjaGFuZ2VkLCBtdXN0IHJlZ2VuZXJhdGUgZGVwZW5kZW5jaWVzLjtcCisJCQkJZWNobyBQTEVBU0UgUkUtUlVOIG1ha2U7XAorCQkJCXJtIC1mICQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpLy5kZXBzXyQoU1VCU1lTVEVNKV9saXN0XyQoQk9BUkQpO1wKKwkJCQlleGl0IC0xO1wKKwkJCWZpO1wKKwkJZG9uZQorCitidWlsZF8kKFNVQlNZU1RFTSk6IF9kZXBzXyQoU1VCU1lTVEVNKV8KKwlAJChCT0xEX1BSSU5UKSAiQnVpbGRpbmcgJChTVUJTWVNURU0pIGltYWdlIGZvciAkKFBMQVRGT1JNKSIKKwlAY2F0ICQoTUFLRV9ERVZJQ0VfRElSKS9tb2R1bGVzLiQoU1VCU1lTVEVNKSB8IHdoaWxlIHJlYWQgLXIgbW9kX2Rpcl90YXJnOyBkb1wKKwkJbW9kX2Rpcj1gZWNobyAkJG1vZF9kaXJfdGFyZyB8IGF3ayAne3ByaW50ICQkMX0nYDtcCisJCWlmIHRlc3QgIiQkbW9kX2RpciIgPSAiIiA7IHRoZW4gY29udGludWU7IGZpOyBcCisJCW1vZF90YXJnZXRzPWBlY2hvICQkbW9kX2Rpcl90YXJnIHwgYXdrICd7cHJpbnQgJCQyICQkMyAkJDQgJCQ1fSdgO1wKKwkJaWYgISAkKE1BS0UpICQoU0lMRU5UKSBTVUJTWVNURU09JChTVUJTWVNURU0pIE1PRF9ESVI9JCRtb2RfZGlyIE9VVF9ESVJfQkFTRT0kKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKSBcCisJCQlBTExfTU9EVUxFUz0iYGNhdCAkKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKS9hbGxfbW9kdWxlcy4kKFNVQlNZU1RFTSlgIiBcCisJCQlBTExfTElCX01PRFVMRVM9ImBjYXQgJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvYWxsX2xpYl9tb2R1bGVzLiQoU1VCU1lTVEVNKWAiIFwKKwkJCUFMTF9BUFBfTU9EVUxFUz0iYGNhdCAkKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKS9hbGxfYXBwX21vZHVsZXMuJChTVUJTWVNURU0pYCIgXAorCQkJLWYgJChNQUtFX0RJUikvTWFrZWZpbGUudGVtcGxhdGUgJCRtb2RfdGFyZ2V0czsgdGhlbiBleGl0IDE7XAorCQlmaTtcCisJZG9uZQorCUAkKEJPTERfUFJJTlQpICJGaW5pc2hlZCBidWlsZGluZyAkKFNVQlNZU1RFTSkgaW1hZ2UgZm9yICQoUExBVEZPUk0pIgorCitjbGVhbl8kKFNVQlNZU1RFTSk6IEJPQVJEPSQoc2hlbGwgbHMgJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvLmRlcHNfJChTVUJTWVNURU0pX2xpc3RfKiAyPi9kZXYvbnVsbCB8IHNlZCAnc0AkKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKS8uZGVwc18kKFNVQlNZU1RFTSlfbGlzdF9AQCcpCisKK2NsZWFuXyQoU1VCU1lTVEVNKToKKwlAJChCT0xEX1BSSU5UKSAiQ2xlYW4gJChQTEFURk9STSkgJChTVUJTWVNURU0pIEJPQVJEPSQoQk9BUkQpIgorCUBmb3IgbW9kX2RpciBpbiBgYXdrICd7cHJpbnQgJCQxfScgJChNQUtFX0RFVklDRV9ESVIpL21vZHVsZXMuJChTVUJTWVNURU0pYDsgZG9cCisJCWlmIHRlc3QgIiQkbW9kX2RpciIgPSAiIiA7IHRoZW4gY29udGludWU7IGZpOyBcCisJCWlmICEgJChNQUtFKSAkKFNJTEVOVCkgU1VCU1lTVEVNPSQoU1VCU1lTVEVNKSBNT0RfRElSPSQkbW9kX2RpciBPVVRfRElSX0JBU0U9JChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikgU0tJUF9ERVBTPXllcyBcCisJCQktZiAkKE1BS0VfRElSKS9NYWtlZmlsZS50ZW1wbGF0ZSBjbGVhbl9tb2R1bGU7IHRoZW4gZXhpdCAxOyBmaTtcCisJZG9uZQorCSQoU0lMRU5UX0JVSUxEKXJtIC1mICQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpL01ha2VmaWxlLmNvbmZpZy4qCisJJChTSUxFTlRfQlVJTEQpcm0gLWYgJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvLmRlcHNfJChTVUJTWVNURU0pKgorCSQoU0lMRU5UX0JVSUxEKXJtIC1mICQoT1VUXyQoVUNfU1VCU1lTVEVNKV9ESVIpL2FsbF8qbW9kdWxlcy4kKFNVQlNZU1RFTSkKKwkkKFNJTEVOVF9CVUlMRClmaW5kICQoU1VCU1lTVEVNKSAtbmFtZSAnKn4nIC1wcmludDAgMj4vZGV2L251bGwgfCB4YXJncyAtMCBybSAtcmYKKwkkKFNJTEVOVF9CVUlMRClmaW5kICQoU1VCU1lTVEVNKSAtbmFtZSAnKi5rbycgLXByaW50MCAyPi9kZXYvbnVsbCB8IHhhcmdzIC0wIHJtIC1yZgorCSQoU0lMRU5UX0JVSUxEKWZpbmQgJChTVUJTWVNURU0pIC1uYW1lICcuKi5jbWQnIC1wcmludDAgMj4vZGV2L251bGwgfCB4YXJncyAtMCBybSAtcmYKKwkkKFNJTEVOVF9CVUlMRClmaW5kICQoU1VCU1lTVEVNKSAtbmFtZSAnKi5vJyAtcHJpbnQwIDI+L2Rldi9udWxsIHwgeGFyZ3MgLTAgcm0gLXJmCisJJChTSUxFTlRfQlVJTEQpZmluZCAkKFNVQlNZU1RFTSkgLW5hbWUgJyoubW9kLmMnIC1wcmludDAgMj4vZGV2L251bGwgfCB4YXJncyAtMCBybSAtcmYKKwkkKFNJTEVOVF9CVUlMRClmaW5kICQoU1VCU1lTVEVNKSAtbmFtZSBtb2R1bGVzLm9yZGVyIC1wcmludDAgMj4vZGV2L251bGwgfCB4YXJncyAtMCBybSAtcmYKKwkkKFNJTEVOVF9CVUlMRClmaW5kICQoU1VCU1lTVEVNKSAtbmFtZSBNb2R1bGUuc3ltdmVycyAtcHJpbnQwIDI+L2Rldi9udWxsIHwgeGFyZ3MgLTAgcm0gLXJmCisJJChTSUxFTlRfQlVJTEQpZmluZCAkKFNVQlNZU1RFTSkgLW5hbWUgLnRtcF92ZXJzaW9ucyAtcHJpbnQwIDI+L2Rldi9udWxsIHwgeGFyZ3MgLTAgcm0gLXJmCisgCitoZWxwXyQoU1VCU1lTVEVNKToKKwlAZWNobyAiJCRQTEFURk9STSAkKFNVQlNZU1RFTSkgbW9kdWxlczoiCisJQGNhdCAkKE1BS0VfREVWSUNFX0RJUikvbW9kdWxlcy4kKFNVQlNZU1RFTSkgfCB3aGlsZSByZWFkIC1yIG1vZF9kaXJfdGFyZzsgZG9cCisJCW1vZF9kaXI9YGVjaG8gJCRtb2RfZGlyX3RhcmcgfCBhd2sgJ3twcmludCAkJDF9J2A7XAorCQlpZiB0ZXN0ICIkJG1vZF9kaXIiID0gIiIgOyB0aGVuIGNvbnRpbnVlOyBmaTsgXAorCQltb2RfbmFtZT1gJChNQUtFKSAtcyBWPTAgU1VCU1lTVEVNPSQoU1VCU1lTVEVNKSBNT0RfRElSPSQkbW9kX2RpciBTS0lQX0RFUFM9eWVzIC1mICQoTUFLRV9ESVIpL01ha2VmaWxlLnRlbXBsYXRlIG1vZHVsZV9uYW1lYDtcCisJCWlmIHRlc3QgIiQkbW9kX25hbWUiID0gIiIgOyB0aGVuIGNvbnRpbnVlOyBmaTsgXAorCQllY2hvICIgICIgJCR7bW9kX25hbWV9XyQoU1VCU1lTVEVNKTtcCisJZG9uZQorCisjIFRhcmdldHMgZm9yIGJ1aWxkaW5nIGluZGl2aWR1YWwgJChTVUJTWVNURU0pIG1vZHVsZQorJV8kKFNVQlNZU1RFTSk6OiBfZGVwc18kKFNVQlNZU1RFTSlfCisJQHdoaWxlIHJlYWQgLXIgbW9kX2Rpcl90YXJnOyBkb1wKKwkJbW9kX2Rpcj1gZWNobyAkJG1vZF9kaXJfdGFyZyB8IGF3ayAne3ByaW50ICQkMX0nYDtcCisJCWlmIHRlc3QgIiQkbW9kX2RpciIgPSAiIiA7IHRoZW4gY29udGludWU7IGZpOyBcCisJCW1vZF9uYW1lPWAkKE1BS0UpIC1zIFY9MCBTVUJTWVNURU09JChTVUJTWVNURU0pIE1PRF9ESVI9JCRtb2RfZGlyIFNLSVBfREVQUz15ZXMgLWYgJChNQUtFX0RJUikvTWFrZWZpbGUudGVtcGxhdGUgbW9kdWxlX25hbWVgO1wKKwkJaWYgdGVzdCAiJCRtb2RfbmFtZSIgPSAiIiA7IHRoZW4gY29udGludWU7IGZpOyBcCisJCW1vZF9uYW1lPSQke21vZF9uYW1lfV8kKFNVQlNZU1RFTSk7XAorCQltb2RfdGFyZ2V0cz1gZWNobyAkJG1vZF9kaXJfdGFyZyB8IGF3ayAne3ByaW50ICQkMiAkJDMgJCQ0ICQkNX0nYDtcCisJCWlmIHRlc3QgIiQkbW9kX25hbWUiID0gIiRAIiA7IHRoZW5cCisJCQl0YXJnZXRfZm91bmQ9eTtcCisJCQkkKE1BS0UpICQoU0lMRU5UKSBTVUJTWVNURU09JChTVUJTWVNURU0pIE1PRF9ESVI9JCRtb2RfZGlyIE9VVF9ESVJfQkFTRT0kKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKSBcCisJCQlBTExfTU9EVUxFUz0iYGNhdCAkKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKS9hbGxfbW9kdWxlcy4kKFNVQlNZU1RFTSlgIiBcCisJCQlBTExfTElCX01PRFVMRVM9ImBjYXQgJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvYWxsX2xpYl9tb2R1bGVzLiQoU1VCU1lTVEVNKWAiIFwKKwkJCUFMTF9BUFBfTU9EVUxFUz0iYGNhdCAkKE9VVF8kKFVDX1NVQlNZU1RFTSlfRElSKS9hbGxfYXBwX21vZHVsZXMuJChTVUJTWVNURU0pYCIgXAorCQkJCS1mICQoTUFLRV9ESVIpL01ha2VmaWxlLnRlbXBsYXRlICQkbW9kX3RhcmdldHMgfHwgZXhpdCAxO1wKKwkJZmk7XAorCWRvbmUgPCAkKE1BS0VfREVWSUNFX0RJUikvbW9kdWxlcy4kKFNVQlNZU1RFTSk7XAorCWlmIHRlc3QgIiQkdGFyZ2V0X2ZvdW5kIiAhPSAieSIgOyB0aGVuXAorCQllY2hvIE5vIHJ1bGUgdG8gbWFrZSB0YXJnZXQgJEA7XAorCQlleGl0IDE7XAorCWZpCisKK2RvY3NfJChTVUJTWVNURU0pOiBfZGVwc18kKFNVQlNZU1RFTSlfCisJbWtkaXIgLXAgJChPVVRfRE9DU19ESVIpCisJc2VkIC1lICdzQCVPVVRfRE9DU19ESVJAJChPVVRfRE9DU19ESVIpQGcnIC1lICdzQCVNT0RFTF9ESVJAJChPVVRfJChVQ19TVUJTWVNURU0pX0RJUikvY29tbW9uL21vZGVsLyQoUExBVEZPUk0pQGcnIFwKKwkJLWUgJ3NAJUFQSV9ESVJAJChUT1BfRElSKS8kKFNVQlNZU1RFTSkvYXBpLyQoUExBVEZPUk0pQGcnIGRvY19jb25maWcvRG94eWZpbGUgPiAkKE9VVF9ET0NTX0RJUikvRG94eWZpbGUKKwlkb3h5Z2VuICQoT1VUX0RPQ1NfRElSKS9Eb3h5ZmlsZQorIApkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL21ha2UvTWFrZWZpbGUucnVsZXMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvbWFrZS9NYWtlZmlsZS5ydWxlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWY0YzBjCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL21ha2UvTWFrZWZpbGUucnVsZXMKQEAgLTAsMCArMSw0OTUgQEAKKyMgQ29tbW9uIE1ha2VmaWxlIHJ1bGVzCisjCisKKyMgRm9yIGxpbnV4X2xpYiB3ZSBkb24ndCBidWlsZCBhbnl0aGluZy4gT2JqZWN0IGZpbGVzIGFyZSBqdXN0IGFkZGVkCisjIHdoZW4gY29tcGlsaW5nIG1vZHVsZXMgZGVwZW5kaW5nIG9uIHRoZSBsaWJzCisKK2lmZXEgICgiJChNT0RfVFlQRSkiLCAibGludXhfbGliIikKKwkjIFNraXAgbGlicmFyaWVzIHRoYXQgbWlnaHQgaGF2ZSBjcmVwdCBpbiBkZXBlbmRlbmNpZXMKKyAgICBTS0lQX0xJQl9NT0RVTEVTID0geQorICAgIGV4cG9ydCBTS0lQX0xJQl9NT0RVTEVTCitlbmRpZiAgICAKKworaWZlcSAgKCIkKE1PRF9UWVBFKSIsICJsaW51eF9tb2R1bGUiKQorCSMgU2tpcCBsaWJyYXJpZXMgdGhhdCBtaWdodCBoYXZlIGNyZXB0IGluIGRlcGVuZGVuY2llcworICAgIFNLSVBfTElCX01PRFVMRVMgPSB5CisgICAgZXhwb3J0IFNLSVBfTElCX01PRFVMRVMKK2VuZGlmICAgIAorCitpZmVxICgiJChNT0RfVFlQRSkiLCAibGliIikKKyAgICBNT0RVTEVfSVNfQV9MSUJSQVJZID0geQorZWxzZSBpZmVxICgiJChNT0RfVFlQRSkiLCAic2hhcmVkX2xpYiIpCisgICAgTU9EVUxFX0lTX0FfTElCUkFSWSA9IHkKK2Vsc2UKKyAgICBNT0RVTEVfSVNfQV9MSUJSQVJZID0gbgorZW5kaWYKKworIyBJbmNsdWRlIG1vZHVsZSdzIG93biBhdXRvLWdlbmVyYXRlZCBNYWtlZmlsZS5jb25maWcuJChNT0RVTEUpIGZpbGUgaWYgYW55CisjIEl0IGluIHR1cm4gaW5jbHVkZXMgYWxsIGRlcGVuZGVuY2llcworaWZlcSAoeCIkKFYpIiwgeCIyIikKKyAgICAkKGluZm8gISEhTU9EX05BTUU9JChNT0RfTkFNRSkgTU9EX1RZUEU9JChNT0RfVFlQRSkgTU9EX1RBUkdFVD0kKE1PRF9UQVJHRVQpKQorICAgICQoaW5mbyAhISFJbmNsdWRpbmcgb3duIGRlcGVuZGVuY3kgZmlsZTogJChPVVRfRElSX0JBU0UpL01ha2VmaWxlLmNvbmZpZy4kKE1PRF9OQU1FKSkKK2VuZGlmCistaW5jbHVkZSAkKE9VVF9ESVJfQkFTRSkvTWFrZWZpbGUuY29uZmlnLiQoTU9EX05BTUUpCitpZmVxICh4IiQoVikiLCB4IjIiKQorICAgICQoaW5mbyAhISFBZnRlciBpbmNsdWRlIG9mICQoT1VUX0RJUl9CQVNFKS9NYWtlZmlsZS5jb25maWcuJChNT0RfTkFNRSkpCitlbmRpZgorCitpZmVxICh4IiQoVikiLCB4IjIiKQorICAgICQoaW5mbyAhISEgQnVpbGRpbmcgJChNT0RfVFlQRSkgbW9kdWxlICQoTU9EX05BTUUpOiBkZXBlbmRzIG9uICQoTU9EX0RFUFNfRklMRVMpIFNLSVBfTElCUz0kKFNLSVBfTElCX01PRFVMRVMpKQorZW5kaWYKKworIyBTa2lwIGRlZmF1bHQgcnVsZXMgZm9yIGN1c3RvbSBtb2R1bGUKK2lmbmVxICAoIiQoTU9EX0NVU1RPTSkiLCAieSIpCisgCisjIERlZmF1bHQgbGliIHJ1bGUKK2lmZXEgICgiJChNT0RfVFlQRSkiLCAibGliIikKKworaWZlcSAoIiQoU0tJUF9MSUJfTU9EVUxFUykiLCAieSIpCisKKyQoTU9EX1RBUkdFVCk6IAorCitlbHNlCisKKyMgUnVsZSB0byBjb21waWxlIGFsbCBtb2R1bGUncyBDIGZpbGVzIGluIG9uZSBnbworaWZlcSAoIiQoQ09NUElMRV9BTExfSU5fT05FX0dPKSIsICJ5IikgCisKKyQoTU9EX1RBUkdFVCk6ICQoU1JDUykgJChBU19PQkpTKSAkKGFzX09CSlMpCisKKyMgQ3JlYXRlIGxpYnJhcnkgaWYgdGhlcmUgYXJlIGFueSBvYmplY3RzIAoraWZuZXEgKCIkKFNSQ1MpJChBU19TUkNTKSQoYXNfU1JDUykkKEdFTl9TUkNTKSIsICIiKQorCitpZm5lcSAgKCIkKFNSQ1MpJChHRU5fU1JDUykiLCAiIikKK2lmZXEgKHgiJChWKSIsIHgiMCIpCisJQGVjaG8gIkNDICQoc3JjcykgJChnZW5fc3JjcykiCitlbmRpZgkKKwkkKFNJTEVOVF9CVUlMRClta2RpciAtcCAkKGRpciAkQCkKKwkkKFNJTEVOVF9CVUlMRCljZCAkKGRpciAkQCkgJiYgJChCTERfQ0MpICQoQ0ZMQUdTKSAtYyAkKFNSQ1MpICQoR0VOX1NSQ1MpCitlbmRpZgorCSQoU0lMRU5UX0JVSUxEKWNkICQoZGlyICRAKSAmJiAkKEJMRF9BUikgJChBUkZMQUdTKSAkQCAkKE9CSlMpCisJJChTSUxFTlRfQlVJTEQpdG91Y2ggJChPVVRfRElSX0JBU0UpLy4kKE1PRF9OQU1FKQorCUAkKEJPTERfUFJJTlQpICJkb25lOiAkQCIKKyMgaWZuZXEgKCIkKFNSQ1MpJChBU19TUkNTKSQoYXNfU1JDUykkKEdFTl9TUkNTKSIsICIiKQorZW5kaWYKKworIyBpZmVxICgiJChDT01QSUxFX0FMTF9JTl9PTkVfR08pIiwgInkiKQorZWxzZQorCisjIENyZWF0ZSBsaWJyYXJ5IGlmIHRoZXJlIGFyZSBhbnkgb2JqZWN0cyAKKyQoTU9EX1RBUkdFVCk6ICQoT0JKUykKK2lmbmVxICgiJChPQkpTKSIsICIiKQorCSQoU0lMRU5UX0JVSUxEKSQoQkxEX0FSKSAkKEFSRkxBR1MpICRAICQoT0JKUykKKwkkKFNJTEVOVF9CVUlMRCl0b3VjaCAkKE9VVF9ESVJfQkFTRSkvLiQoTU9EX05BTUUpCisJQCQoQk9MRF9QUklOVCkgImRvbmU6ICRAIgorZW5kaWYKKworIyBlbmQgb2YgaWZlcSAoJChDT01QSUxFX0FMTF9JTl9PTkVfR08pLCAieSIpCitlbmRpZgorCisjIGVuZCBvZiBpZmVxICgiJChTS0lQX0xJQl9NT0RVTEVTKSIsICJ5IikKK2VuZGlmCisKKyMgZW5kIG9mIGlmZXEgICgiJChNT0RfVFlQRSkiLCAibGliIikKK2VuZGlmCisgCisjIERlZmF1bHQgc2hhcmVkX2xpYiBydWxlCitpZmVxICAoIiQoTU9EX1RZUEUpIiwgInNoYXJlZF9saWIiKQorCitFWFRSQV9DRkxBR1MgKz0gLWZQSUMKKworIyBDcmVhdGUgbGlicmFyeSBpZiB0aGVyZSBhcmUgYW55IG9iamVjdHMgCiskKE1PRF9UQVJHRVQpOiAkKE9CSlMpCitpZm5lcSAoIiQoT0JKUykiLCAiIikKKwkkKFNJTEVOVF9CVUlMRCkkKEJMRF9DQykgLXNoYXJlZCAtcmR5bmFtaWMgLW8gJEAgJChPQkpTKSAkKExGTEFHUykKKwkkKFNJTEVOVF9CVUlMRClta2RpciAtcCAkKFNIQVJFRF9MSUJfUEFUSCkvCisJJChTSUxFTlRfQlVJTEQpY3AgJEAgJChTSEFSRURfTElCX1BBVEgpLworCUAkKEJPTERfUFJJTlQpICJkb25lOiAkQCIKK2VuZGlmCisJJChTSUxFTlRfQlVJTEQpdG91Y2ggJChPVVRfRElSX0JBU0UpLy4kKE1PRF9OQU1FKQorCisjIGVuZCBvZiBpZmVxICAoIiQoTU9EX1RZUEUpIiwgInNoYXJlZF9saWIiKQorZW5kaWYKKworIyBEZWZhdWx0IGFwcCBydWxlCitpZmVxICAoIiQoTU9EX1RZUEUpIiwgImFwcCIpCisKKyMgQ3VycmVudGx5LCBUaHJlYWRYIGltYWdlIGRvZXNuJ3Qgc3VwcG9ydCBhbnkgYXBwbGljYXRpb25zLCBhcGFydCBmcm9tIHRoZQorIyBpbWFnZSBpdHNlbGYuIERpc2FibGUgYnVpbGRpbmcgYXBwbGljYXRpb25zIGZvciBUaHJlYWRYCitpZm5lcSAoIiQoT1MpIiwgInRocmVhZHgiKQorCiskKE1PRF9UQVJHRVQpOiAkKE9CSlMpICQoTU9EX0RFUFNfRklMRVMpCisJJChTSUxFTlRfQlVJTEQpJChCTERfQ0MpIC1vICRAICQoT0JKUykgJChMRkxBR1MpICQoRVhUUkFfTElCU19QQVRIKSAkKExJQlNfU1RBUlRfTUFSS0VSKSAkKEVYVFJBX0xJQlMpICQoTElCU19FTkRfTUFSS0VSKSAkKExJQlMpCisJJChTSUxFTlRfQlVJTEQpdG91Y2ggJChPVVRfRElSX0JBU0UpLy4kKE1PRF9OQU1FKQorCUAkKEJPTERfUFJJTlQpICJkb25lOiAkKE9VVF9ESVIpLyQoTU9EX05BTUUpIgorCisjIGVsc2Ugb2YgaWZuZXEgKCIkKE9TKSIsICJ0aHJlYWR4IikKK2Vsc2UKKworJChNT0RfVEFSR0VUKToKKworCisjIGVuZGlmIG9mIGlmbmVxICgiJChPUykiLCAidGhyZWFkeCIpCitlbmRpZgorCisjIGVuZGlmIG9mIGlmZXEgICgiJChNT0RfVFlQRSkiLCAiYXBwIikKK2VuZGlmCisKKyMgRm9yIGxpbnV4X2xpYiB3ZSBkb24ndCBidWlsZCBhbnl0aGluZy4gT2JqZWN0IGZpbGVzIGFyZSBqdXN0IGFkZGVkCisjIHdoZW4gY29tcGlsaW5nIG1vZHVsZXMgZGVwZW5kaW5nIG9uIHRoZSBsaWJzCitpZmVxICAoIiQoTU9EX1RZUEUpIiwgImxpbnV4X2xpYiIpCisgICAgTElOVVhfTElCX09CSkVDVFMgOj0gJChzcmNzOiUuYz0kKFNSQ19ESVIpLyUubykKKworJChNT0RfVEFSR0VUKTogJChTUkNTKSAkKEdFTl9TUkNTKSAkKE1PRF9ERVBTX0ZJTEVTKQorCSQoU0lMRU5UX0JVSUxEKXRvdWNoICQoTU9EX1RBUkdFVCkKKwkkKFNJTEVOVF9CVUlMRCl0b3VjaCAkKE9VVF9ESVJfQkFTRSkvLiQoTU9EX05BTUUpCisKK2VuZGlmCisKKyMgRGVmYXVsdCBsaW51eF9tb2R1bGUkKHNyY3M6JT0kKFNSQ19ESVIpLyUpCitpZmVxICAoIiQoTU9EX1RZUEUpIiwgImxpbnV4X21vZHVsZSIpCisgICAgb2JqLW0gICAgKz0gJChNT0RfTkFNRSkubworICAgICQoTU9EX05BTUUpLW9ianMgOj0gJChzcmNzOiUuYz0lLm8pCisgICAgTElCX09CSlNfUkVMX1BBVEggPSAkKGZvcmVhY2ggb28sJChBTExfTElCX09CSlMpLCQoc2hlbGwgcHl0aG9uIC1jICJpbXBvcnQgb3MucGF0aDsgcHJpbnQgb3MucGF0aC5yZWxwYXRoKCckKG9vKScsICckKFNSQ19ESVIpJykiKSkKKworICAgIF9LRVJORUxfTUFLRVBBUk1TID0gLUMgJChLRVJORUxESVIpIE09JChTUkNfRElSKSBLQlVJTERfRVhUUkFfU1lNQk9MUz0iJChLQlVJTERfRVhUUkFfU1lNQk9MUykiIFwKKyAgICAJTz0kKEtFUk5FTF9PVVRESVIpIEFSQ0g9JChLRVJORUxfQVJDSCkgQ1JPU1NfQ09NUElMRT0kKENST1NTX0NPTVBJTEUpIFY9JChWKSBFWFRSQV9DRkxBR1M9IiQoRVhUUkFfQ0ZMQUdTKSIgXAorICAgIAlvYmotbT0kKG9iai1tKSAkKE1PRF9OQU1FKS1vYmpzPSIkKCQoTU9EX05BTUUpLW9ianMpICQoTElCX09CSlNfUkVMX1BBVEgpIgorICAgIEtFUk5FTF9NQUtFUEFSTVMgPSAkKF9LRVJORUxfTUFLRVBBUk1TOiVvc19hYnN0cmFjdGlvbi9wb3NpeD0lb3NfYWJzdHJhY3Rpb24vbGludXgpCisKKwkjIFByZXZlbnQgcGFyYWxsZWwgYnVpbGQgICAgCisuTk9UUEFSQUxMRUw6CisKKyAgICAjIE9ubHkgYnVpbGQgbGludXggbW9kdWxlIGlmIG5vdCBhbHJlYWR5IGJlaW5nIGJ1aWx0IGJ5IGFub3RoZXIgbWFrZSB0aHJlYWQuCisgICAgIyBPdGhlcndpc2UsIGxpbnV4IGJ1aWxkIHN5c3RlbSBnZXQgY29uZnVzZWQKKyAgICAjIEFsc28sIHJlbW92ZSAtcyBmbGFnIHVzaW5nIE1BS0VGTEFHUy4gT3RoZXJ3aXNlLCBsaW51eCBidWlsZCBzeXN0ZW0gd2lsbCBub3QgcHJpbnQgbmFtZXMgb2YgdGhlIGZpbGVzCisgICAgIyBiZWluZyBjb21waWxlZAorJChNT0RfVEFSR0VUKTogJChTUkNTKSAkKE1PRF9ERVBTX0ZJTEVTKQoraWZuZXEgICgiJChTUkNfRElSKSIsICIkKFRPUF9ESVIpLyQoTU9EX0RJUikiKQorCUBjcCAtZiAkKFRPUF9ESVIpLyQoTU9EX0RJUikvTWFrZWZpbGUgJChTUkNfRElSKQorZW5kaWYKKwkkKFNJTEVOVF9CVUlMRClpZiBbICEgLWYgJChTUkNfRElSKS8uJChNT0RfTkFNRSlfaW5fcHJvZ3Jlc3MgXTsgdGhlbiBcCisJCXRvdWNoICQoU1JDX0RJUikvLiQoTU9EX05BTUUpX2luX3Byb2dyZXNzOyBcCisJCU1BS0VGTEFHUz0gJChNQUtFKSAkKEtFUk5FTF9NQUtFUEFSTVMpIDtcCisJCWlmIFtbICIkJD8iICE9ICIwIiBdXTsgdGhlbiBcCisJCQlybSAtZiAkKFNSQ19ESVIpLy4kKE1PRF9OQU1FKV9pbl9wcm9ncmVzcztcCisJCQlleGl0IC0yO1wKKwkJZmk7IFwKKwkJbWtkaXIgLXAgJChPVVRfRElSX0JBU0UpL2xpbnV4X21vZHVsZXMgO1wKKwkJdG91Y2ggLWMgJChNT0RfVEFSR0VUKSA7XAorCQljcCAkKFNSQ19ESVIpLyQoTU9EX05BTUUpLmtvICQoT1VUX0RJUl9CQVNFKS9saW51eF9tb2R1bGVzLyA7XAorCQl0b3VjaCAkKE9VVF9ESVJfQkFTRSkvLiQoTU9EX05BTUUpIDtcCisJCSQoQk9MRF9QUklOVCkgImRvbmU6ICQoTU9EX1RBUkdFVCkiIDtcCisJCXJtIC1mICQoU1JDX0RJUikvLiQoTU9EX05BTUUpX2luX3Byb2dyZXNzIDtcCisJZmkKKworIyBUYWtlIGNhcmUgb2YgY29tcGlsaW5nIGdlbmVyYXRlZCBjb2RlIGZvciBsaW51eCBrZXJuZWwKK2lmbmVxICAoIiQoU1JDX0RJUikiLCAiJChUT1BfRElSKS8kKE1PRF9ESVIpIikKKworJChTUkNfRElSKS8lLmMgOiAkKENPREVHRU5fT1VUUFVUX0RJUikvLi4vJS5jCisJJChTSUxFTlRfQlVJTEQpY3AgLWYgJChDT0RFR0VOX09VVFBVVF9ESVIpLy4uLyouW2MsaF0gJChTUkNfRElSKS8KKworJChTUkNfRElSKS8lLmggOiAkKENPREVHRU5fT1VUUFVUX0RJUikvLi4vJS5oCisJJChTSUxFTlRfQlVJTEQpY3AgLWYgJChDT0RFR0VOX09VVFBVVF9ESVIpLy4uLyouW2MsaF0gJChTUkNfRElSKS8KKworZW5kaWYKKworIyBFbmQgb2YgTU9EX1RZUEU9PWxpbnV4X21vZHVsZQorZW5kaWYKKworZWxzZQorIyBvbmx5IGZvciBNT0RfQ1VTVE9NIGluY2x1ZGUgTW9kdWxlIE1ha2VmaWxlIHNlY29uZCB0aW1lIGZvciBwcm9wYWdhdGUgIAorIyBjdXN0b20gcnVsZXMsIGZpcnN0IHRpbWUgaW5jbHVkZWQgaW4gTWFrZWZpbGUuY29uZmlnIGZvciBhbGwgbW9kdWxlcyAKK2luY2x1ZGUgJChTUkNfRElSKS9NYWtlZmlsZQorIyBFbmQgb2YgaWZuZXEgKCQoTU9EX0NVU1RPTSksIHkpCitlbmRpZgorCiskKE9VVF9ESVIpLyUubzogJChTUkNfRElSKS8lLmMgJChPVVRfRElSX0JBU0UpL01ha2VmaWxlLmNvbmZpZy4kKE1PRF9OQU1FKQoraWZlcSAoeCIkKFYpIiwgeCIwIikKKwlAZWNobyAiQ0MgJDwiCitlbmRpZgorCSQoU0lMRU5UX0JVSUxEKW1rZGlyIC1wICQoZGlyICRAKQorCSQoU0lMRU5UX0JVSUxEKSQoQkxEX0NDKSAkKENGTEFHUykgLURfX0JBU0VOQU1FX189YGJhc2VuYW1lICQ8YCAtYyAtbyAkQCAkPAoraWZlcSAoeCIkKFVTRV9MSU5UKSIsIHgieWVzIikKK2lmZXEgKHgiJChWKSIsIHgiMCIpCisJQGVjaG8gIkxJTlQgJDwiCitlbmRpZgorCSQoU0lMRU5UX0JVSUxEKUZPUkNFX0xJTlQ9JChGT1JDRV9MSU5UKSAkKE1BS0VfREVWSUNFX0RJUikvbGludC5zaCAkKExJTlRfRkxBR1MpICQoZmlsdGVyIC1JJSAtRCUsICQoQ0ZMQUdTKSkgJDwgfHwgeyBybSAkQDsgZmFsc2U7IH0KK2VuZGlmCitpZmVxICh4IiQoVVNFX0NMQU5HKSIsIHgieSIpCitpZmVxICh4IiQoVikiLCB4IjAiKQorCV9mbj1gYmFzZW5hbWUgIiQ8IiAuY2AgO1wKKwlldmFsICJfZGlzYWJsZV9mbl9zZXQ9XCQke0RJU0FCTEVfQ0xBTkdfJCRfZm59IjsgXAorCWlmIHRlc3QgIiQkX2Rpc2FibGVfZm5fc2V0IiAhPSAieSIgOyB0aGVuIGVjaG8gIkNMQU5HICQ8IjsgZWxzZSBlY2hvICJDTEFORyAkPCAuLi4gc2tpcHBlZCI7IGZpCitlbmRpZgorCV9mbj1gYmFzZW5hbWUgIiQ8IiAuY2AgO1wKKwlldmFsICJfZGlzYWJsZV9mbl9zZXQ9XCQke0RJU0FCTEVfQ0xBTkdfJCRfZm59IjsgXAorCWlmIHRlc3QgIiQkX2Rpc2FibGVfZm5fc2V0IiAhPSAieSIgOyB0aGVuICAkKENMQU5HKSAkKENMQU5HX0ZMQUdTKSAtYyAkPCAtbyAkQC5jbGFuZyAmJiBybSAtZiAkQC5jbGFuZzsgZmkKKyMgaWZlcSAoeCIkKFVTRV9DTEFORykiLCB4InkiKQkKK2VuZGlmCQorCiskKE9VVF9ESVIpLyUubzogJChTUkNfRElSKS8lLnMgJChPVVRfRElSX0JBU0UpL01ha2VmaWxlLmNvbmZpZy4kKE1PRF9OQU1FKQoraWZlcSAoeCIkKFYpIiwgeCIwIikKKwlAZWNobyAiQVMgJDwiCitlbmRpZgorCSQoU0lMRU5UX0JVSUxEKW1rZGlyIC1wICQoZGlyICRAKQorCSQoU0lMRU5UX0JVSUxEKSQoQkxEX0FTKSAkKGFzRkxBR1MpIC1vICRAICQ8CisKKyQoT1VUX0RJUikvJS5vOiAkKFNSQ19ESVIpLyUuUyAkKE9VVF9ESVJfQkFTRSkvTWFrZWZpbGUuY29uZmlnLiQoTU9EX05BTUUpCitpZmVxICh4IiQoVikiLCB4IjAiKQorCUBlY2hvICJBUyAkPCIKK2VuZGlmCisJJChTSUxFTlRfQlVJTEQpbWtkaXIgLXAgJChkaXIgJEApCisJJChTSUxFTlRfQlVJTEQpJChCTERfQ0MpICQoQVNGTEFHUykgLW8gJEAgJDwKKworCiskKE9VVF9ESVIpLyUuZDogJChTUkNfRElSKS8lLmMgJChTUkNfRElSKS9NYWtlZmlsZQoraWZuZXEgKCIkKEJVSUxEX0RFUFNfSU5fQ0MpIiwgInkiKQoraWZlcSAoeCIkKFYpIiwgeCIwIikKKwlAZWNobyAiRFAgJDwiCitlbmRpZgorCSQoU0lMRU5UX0JVSUxEKW1rZGlyIC1wICQoZGlyICRAKQorCSQoU0lMRU5UX0JVSUxEKSQoQkxEX0RFUCkgLU1NIC1NVCAkKEA6LmQ9Lm8pICQoREVQX0ZMQUdTKSAkPCAgPiAkQCAmJiBzZWQgJ3MsXCgkKlwub1wpWyA6XSosXDEgJEAgOiAsZycgLWkgJEAKK2VuZGlmCisKKyQoQ09ERUdFTl9PVVRQVVRfRElSKS8lLm86ICQoQ09ERUdFTl9PVVRQVVRfRElSKS8lLmMgJChPVVRfRElSX0JBU0UpL01ha2VmaWxlLmNvbmZpZy4kKE1PRF9OQU1FKQoraWZlcSAoeCIkKFYpIiwgeCIwIikKKwlAZWNobyAiQ0MgJDwiCitlbmRpZgorCSQoU0lMRU5UX0JVSUxEKW1rZGlyIC1wICQoZGlyICRAKQorCSQoU0lMRU5UX0JVSUxEKSQoQkxEX0NDKSAkKENGTEFHUykgLURfX0JBU0VOQU1FX189YGJhc2VuYW1lICQ8YCAtYyAtbyAkQCAkPAorCiskKENPREVHRU5fT1VUUFVUX0RJUikvJS5kOiAkKENPREVHRU5fT1VUUFVUX0RJUikvJS5jICQoU1JDX0RJUikvTWFrZWZpbGUKK2lmbmVxICgiJChCVUlMRF9ERVBTX0lOX0NDKSIsICJ5IikKK2lmZXEgKHgiJChWKSIsIHgiMCIpCisJQGVjaG8gIkRQICQ8IgorZW5kaWYKKwkkKFNJTEVOVF9CVUlMRClta2RpciAtcCAkKGRpciAkQCkKKwkkKFNJTEVOVF9CVUlMRCkkKEJMRF9ERVApIC1NTSAtTVQgJChAOi5kPS5vKSAkKERFUF9GTEFHUykgJDwgID4gJEAgJiYgc2VkICdzLFwoJCpcLm9cKVsgOl0qLFwxICRAIDogLGcnIC1pICRACitlbmRpZgorCitpZm5lcSAoIiQoU0tJUF9ERVBTKSIsICJ5ZXMiKQoraWZuZXEgICgiJChNT0RfVFlQRSkiLCAibGludXhfbW9kdWxlIikKK2lmbmVxICAoIiQoTU9EX1RZUEUpIiwgImxpbnV4X2xpYiIpCistaW5jbHVkZSAkKE9CSlM6Lm89LmQpCitlbmRpZgorZW5kaWYKK2VuZGlmCisKK0JVSUxEX1VOSVRFU1QgPSAkKFVOSVRFU1QpCitpZmVxICAoIiQoT0JKUykiLCAiIikKKyAgICBCVUlMRF9VTklURVNUID0gbgorZW5kaWYgICAgCitpZmVxICgiJChPUykiLCAidGhyZWFkeCIpCisgICAgQlVJTERfVU5JVEVTVCA9IG4KK2VuZGlmICAgIAorCisjIE9ubHkgYnVpbGQgdW5pdGVzdCBpZiBsaWJyYXJ5IG9iamVjdHMgYXJlIGluY2x1ZGVkCitpZmVxICAoIiQoQlVJTERfVU5JVEVTVCkiLCAieSIpCisKK3VuaXRlc3Q6ICQoT1VUX0RJUikvdW5pdGVzdAorCiskKE9VVF9ESVIpL3VuaXRlc3Q6ICQoT1VUX0RJUikvdW5pdGVzdC5vICQoVEFSR0VUX0xJQl9GTkFNRSkgJChNT0RfREVQU19GSUxFUykKKwkkKFNJTEVOVF9CVUlMRCkkKEJMRF9DQykgLW8gJEAgJChPVVRfRElSKS91bml0ZXN0Lm8gJChMRkxBR1MpICQoRVhUUkFfTElCU19QQVRIKSAkKExJQlNfU1RBUlRfTUFSS0VSKSAkKEVYVFJBX0xJQlMpICQoTElCU19FTkRfTUFSS0VSKSAkKExJQlMpCisJJChTSUxFTlRfQlVJTEQpdG91Y2ggJChPVVRfRElSX0JBU0UpLy4kKE1PRF9OQU1FKQorCUAkKEJPTERfUFJJTlQpICJkb25lOiAkQCIKKworIyBlbHNlIG9mIGlmbmVxICAoIiQoQlVJTERfVU5JVEVTVCkiLCAieSIpCitlbHNlIAorCit1bml0ZXN0OiAkKFRBUkdFVF9MSUJfRk5BTUUpICQoTU9EX0RFUFNfRklMRVMpCisJCisjIGVuZGlmIG9mIGlmbmVxICAoIiQoQlVJTERfVU5JVEVTVCkiLCAieSIpCitlbmRpZgorCisjIEdlbmVyYXRlIHZlcnNpb24gaGVhZGVyCitNT0RFTF9SRVZJU0lPTl9GSUxFID0gJChNT0RFTF9PVVRfRElSKS9iY21vbHRfbW9kZWxfcmV2aXNpb24uaCAKKworaWZuZXEgKCIkKFJFTEVBU0VfQlVJTEQpIiwgInkiKQorJChNT0RFTF9SRVZJU0lPTl9GSUxFKTogJChNT0RFTF9GSUxFKQorCW1rZGlyIC1wICQoTU9ERUxfT1VUX0RJUikKKwlAJChUT1BfRElSKS9zY3JpcHRzL3VwZGF0ZV9tb2RlbF9yZXZpc2lvbi5zaCAkPCAkQAorCisjIEdlbmVyYXRlIHNvdXJjZXMgaWYgbmVjZXNzYXJ5CitpZm5lcSAoIiQoR0VOX1NSQ1MpIiwgIiIpCitpZm5lcSAoIiQoQ1VTVE9NX0NPREVHRU4pIiwgInkiKQorCiskKENPREVHRU5fT1VUUFVUX0RJUikvLmdlbmVyYXRlZDogJChNT0RFTF9GSUxFKSAkKHdpbGRjYXJkICQoQ09ERUdFTl9ESVIpLyopICQod2lsZGNhcmQgJChDT0RFR0VOX0lOUFVUX0RJUikvKikgJChNT0RFTF9SRVZJU0lPTl9GSUxFKQorCSQoU0lMRU5UX0JVSUxEKXJtIC1mciAkQAorCUBlY2hvICJHZW5lcmF0aW5nIGNvZGUgaW4gJChDT0RFR0VOX09VVFBVVF9ESVIpIGZyb20gbW9kZWwuLi4iCisJQG1rZGlyIC1wICQoQ09ERUdFTl9PVVRQVVRfRElSKQorCSQoU0lMRU5UX0JVSUxEKSQoTU9OT19QQVRIKSAkKENPREVHRU5fRVhFKSAtLWdlbm9iam1vZGVsIC1vYmp0YWdzPSQoR0VOX09CSlRBR1MpIC1vYmpzZXQ9JChNT0RFTF9GSUxFKSBcCisJICAgICAgJChHRU5fRVhUUkFfVFlQRVMpIC10ZW1wbGF0ZWRpcj0kKENPREVHRU5fSU5QVVRfRElSKSAtb3V0ZGlyPSQoQ09ERUdFTl9PVVRQVVRfRElSKQorCSQoU0lMRU5UX0JVSUxEKXRvdWNoICRACisJQGVjaG8gIkNvZGUgZ2VuZXJhdGlvbiBpbiAkKENPREVHRU5fT1VUUFVUX0RJUikgY29tcGxldGUhIgorCiskKEdFTl9TUkNTKTogJChDT0RFR0VOX09VVFBVVF9ESVIpLy5nZW5lcmF0ZWQKKworIyBpZm5lcSAoIiQoQ1VTVE9NX0NPREVHRU4pIiwgInkiKQorZW5kaWYKKworIyBpZm5lcSAgKCIkKEdFTl9TUkNTKSIsICIiKSAKK2VuZGlmCisKKyMgaWZuZXEgKCIkKFJFTEVBU0VfQlVJTEQpIiwgInkiKQorZW5kaWYKKworIworIyBEZXBlbmRlbmN5IHJ1bGVzIGdlbmVyYXRpb246IC0tPiBNYWtlZmlsZS5jb25maWcuJChNT0RfTkFNRSkKKyMgCisKK01PRF9DT05GSUdfRklMRSA9ICQoT1VUX0RJUl9CQVNFKS9NYWtlZmlsZS5jb25maWcuJChNT0RfTkFNRSkKK01PRF9DT05GSUdfREVGICA9ICQoTU9EX05BTUUpX0RFUF9ERUZJTkVECitpZm5lcSAoIiQoTU9EX0lOQ19ESVJTKSIsICIiKQorICAgICMgTWFrZSBzdXJlIHRoYXQgZWFjaCBkaXJlY3RvcnkgaXMgYW4gYWJzb2x1dGUgcGF0aAorICAgIE1PRF9JTkNTID0gJChhZGRwcmVmaXggLUkkKFRPUF9ESVIpLywgJChzdWJzdCAkKFRPUF9ESVIpLywsJChNT0RfSU5DX0RJUlMpKSkKK2Vsc2UKKwlNT0RfSU5DUyA9IC1JJChTUkNfRElSKQorZW5kaWYKKworIyAKKyMgR2VuZXJhdGUgTWFrZWZpbGUuY29uZmlnLiQoTU9EVUxFKSBjYXBhYmxlIG9mIHJlLWNyZWF0aW5nIHRoZSBtb2R1bGUKKyMKK21vZGRlcDogJChHRU5fU1JDUykKK2lmZXEgKHgiJChWKSIsIHgiMyIpCisJQGVjaG8gIiEhISEhICBtb2RkZXAgZm9yICBNT0RfTkFNRT0kKE1PRF9OQU1FKSBNT0RfVFlQRT0kKE1PRF9UWVBFKSBNT0RfQ1VTVE9NPSQoTU9EX0NVU1RPTSkhISEiCitlbmRpZgorCSQoU0lMRU5UX0JVSUxEKW1rZGlyIC1wICQoT1VUX0RJUl9CQVNFKQorCUBybSAtZnIgJChNT0RfQ09ORklHX0ZJTEUpCisJQHJtIC1mciAkKE9CSlM6Lm89LmQpCisKKwlAZWNobyAiaWZlcSAoeFwiJCQiIihWKVwiLCB4XCIyXCIpIiAgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisJQGVjaG8gIiAgICAkJCIiKGluZm8gISEhIE1PRFVMRT0kJCIiKE1PRF9OQU1FKSAtLT4gJChNT0RfQ09ORklHX0ZJTEUpOiAkKE1PRF9DT05GSUdfREVGKT0kJCIiKCQoTU9EX0NPTkZJR19ERUYpKSwgREVQUz0kKE1PRF9ERVBTKSkiID4+ICQoTU9EX0NPTkZJR19GSUxFKQorCUBlY2hvICJlbmRpZiIgID4+ICQoTU9EX0NPTkZJR19GSUxFKQorCisgICAgIyBQcmV2ZW50IGRvdWJsZSBpbmNsdXNpb24gCisJQGVjaG8gImlmbmVxIChcIiQkIiIoJChNT0RfQ09ORklHX0RFRikpXCIsIFwieVwiKSIgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisJQGVjaG8gIiIgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisJQGVjaG8gIiQoTU9EX0NPTkZJR19ERUYpIDo9IHkiID4+ICQoTU9EX0NPTkZJR19GSUxFKQorCisgICAgaWZlcSAgKCIkKE1PRFVMRV9JU19BX0xJQlJBUlkpIiwgInkiKQorCQlAZWNobyAiX3NraXBfaXQgOj0geSIgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisgICAgZWxzZQorCQlAZWNobyAiX3NraXBfaXQgOj0gbiIgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisgICAgZW5kaWYKKwlAZWNobyAiaWZuZXEgKFwiJCQiIihTS0lQX0xJQl9NT0RVTEVTKVwiLCBcInlcIikiID4+ICQoTU9EX0NPTkZJR19GSUxFKQorCUBlY2hvICIgICAgX3NraXBfaXQgOj0gbiIgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisJQGVjaG8gImVuZGlmIiA+PiAkKE1PRF9DT05GSUdfRklMRSkKKworCUBlY2hvICJpZm5lcSAoXCIkJCIiKF9za2lwX2l0KVwiLCBcInlcIikiICA+PiAkKE1PRF9DT05GSUdfRklMRSkKKworICAgIGlmZXEgICgiJChNT0RVTEVfSVNfQV9MSUJSQVJZKSIsICJ5IikKKyAgICAgICAgaWZuZXEgKCIkKE9CSlMpIiwgIiIpCisJCQlAZWNobyAiRVhUUkFfTElCUyArPSAkKExJQlNfTUFSS0VSKSQoVEFSR0VUX0xJQikiID4+ICQoTU9EX0NPTkZJR19GSUxFKQorCQkJQGVjaG8gIkVYVFJBX0xJQlNfUEFUSCArPSAkKExJQlNfUEFUSF9NQVJLRVIpJChPVVRfRElSKSIgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisgICAgICAgIGVuZGlmCisgICAgICAgIGlmbmVxICgiJChNT0RfTElCUykiLCAiIikKKwkJCUBlY2hvICJFWFRSQV9MSUJTICs9ICQoTU9EX0xJQlMpIiA+PiAkKE1PRF9DT05GSUdfRklMRSkKKyAgICAgICAgZW5kaWYKKwkJQGVjaG8gImlmbmVxICh4XCIkJCIiKE1PRF9OQU1FKVwiLCB4XCIkKE1PRF9OQU1FKVwiKSIgID4+ICQoTU9EX0NPTkZJR19GSUxFKQorCQlAZWNobyAiICAgTU9EX0RFUFNfRklMRVMgKz0gJChPVVRfRElSX0JBU0UpLy4kKE1PRF9OQU1FKSIgID4+ICQoTU9EX0NPTkZJR19GSUxFKQorCQlAZWNobyAiZW5kaWYiICA+PiAkKE1PRF9DT05GSUdfRklMRSkKKyAgICAgICAgaWZuZXEgKCIkKHN0YXJ0dXBfc3JjKSIsICIiKQorCQkJQGVjaG8gIiIgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisJCQlAZWNobyAiRU5UUllfUE9JTlRfU1JDID0gJChTUkNfRElSKS8kKHN0YXJ0dXBfc3JjKSIgICA+PiAkKE1PRF9DT05GSUdfRklMRSkKKwkJCUBlY2hvICIiID4+ICQoTU9EX0NPTkZJR19GSUxFKQorICAgICAgICBlbmRpZgorICAgIGVuZGlmCisKKyAgICBpZmVxICAoIiQoTU9EX1RZUEUpIiwgImxpbnV4X2xpYiIpCisgICAgICAgIGlmbmVxICgiJChPQkpTKSIsICIiKQorCQkJQGVjaG8gIkFMTF9MSUJfT0JKUyArPSAkKExJTlVYX0xJQl9PQkpFQ1RTKSIgID4+ICQoTU9EX0NPTkZJR19GSUxFKQorICAgICAgICBlbmRpZgorCQlAZWNobyAiaWZuZXEgKHhcIiQkIiIoTU9EX05BTUUpXCIsIHhcIiQoTU9EX05BTUUpXCIpIiAgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisJCUBlY2hvICIgICBNT0RfREVQU19GSUxFUyArPSAkKE9VVF9ESVJfQkFTRSkvLiQoTU9EX05BTUUpIiAgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisJCUBlY2hvICJlbmRpZiIgID4+ICQoTU9EX0NPTkZJR19GSUxFKQorICAgIGVuZGlmCisKKyAgICBpZmVxICAoIiQoTU9EX1RZUEUpIiwgImxpbnV4X21vZHVsZSIpCisJCUBlY2hvICJpZm5lcSAoeFwiJCQiIihNT0RfTkFNRSlcIiwgeFwiJChNT0RfTkFNRSlcIikiICA+PiAkKE1PRF9DT05GSUdfRklMRSkKKwkJCUBlY2hvICIgICBLQlVJTERfRVhUUkFfU1lNQk9MUyArPSAkKFNSQ19ESVIpL01vZHVsZS5zeW12ZXJzIiA+PiAkKE1PRF9DT05GSUdfRklMRSkKKwkJCUBlY2hvICIgICBNT0RfREVQU19GSUxFUyArPSAkKE9VVF9ESVJfQkFTRSkvLiQoTU9EX05BTUUpIiAgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisJCUBlY2hvICJlbmRpZiIgID4+ICQoTU9EX0NPTkZJR19GSUxFKQorICAgIGVuZGlmCisKKyAgICAjIE1vZHVsZSBjcmVhdGlvbiBydWxlcworCUBlY2hvICIkKE1PRF9OQU1FKV8kKFNVQlNZU1RFTSk6ICQoT1VUX0RJUl9CQVNFKS8uJChNT0RfTkFNRSkiICA+PiAkKE1PRF9DT05GSUdfRklMRSkKKwlAZWNobyAiIiAgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisJQGVjaG8gIiQoT1VUX0RJUl9CQVNFKS8uJChNT0RfTkFNRSk6IC5GT1JDRSIgICA+PiAkKE1PRF9DT05GSUdfRklMRSkKKyAgICBpZmVxICAoIiQoTU9EX0NVU1RPTSkiLCAieSIpCisJCUBlY2hvICIJCSQkIiIoTUFLRSkgTU9EX0RJUj0kKE1PRF9ESVIpIC1mICQoTUFLRV9ESVIpL01ha2VmaWxlLnRlbXBsYXRlICQoTU9EX1RBUkdFVCkiID4+ICQoTU9EX0NPTkZJR19GSUxFKQorICAgIGVsc2UKKyAgICBpZm5lcSAgKCIkKE9CSlMpIiwgIiIpCisJCUBlY2hvICIJCSQkIiIoTUFLRSkgTU9EX0RJUj0kKE1PRF9ESVIpIC1mICQoTUFLRV9ESVIpL01ha2VmaWxlLnRlbXBsYXRlICQoTU9EX1RBUkdFVCkiID4+ICQoTU9EX0NPTkZJR19GSUxFKQorICAgIGVuZGlmCisgICAgaWZlcSAgKCIkKE9CSlMpIiwgIiIpCisJCUBlY2hvICIJCWlmIFsgISAtZiAkKE9VVF9ESVJfQkFTRSkvLiQoTU9EX05BTUUpIF07IHRoZW4gdG91Y2ggJChPVVRfRElSX0JBU0UpLy4kKE1PRF9OQU1FKTsgZmkiID4+ICQoTU9EX0NPTkZJR19GSUxFKQorICAgIGVuZGlmCisgICAgZW5kaWYKKwlAZWNobyAiIiAgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisJQGVjaG8gIi5GT1JDRToiICAgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisJQGVjaG8gIiIgID4+ICQoTU9EX0NPTkZJR19GSUxFKQorCisgICAgaWZuZXEgKCIkKE1PRF9ERUZTKSIsICIiKQorCQlAZWNobyAiRVhUUkFfQ0ZMQUdTICs9ICQoTU9EX0RFRlMpIiA+PiAkKE1PRF9DT05GSUdfRklMRSkKKyAgICBlbmRpZgorCQorCUBlY2hvICJlbmRpZiIgID4+ICQoTU9EX0NPTkZJR19GSUxFKQorCisgICAgIyBJZiBpdCBpcyBhIGxpYnJhcnkgYW5kIHRoaXMgZmlsZSBpcyBpbmNsdWRlZCBhcyBzb21lb25lJ3MgZGVwZW5kZW5jeSAtIGV4dGVuZCBNT0RfREVQX0ZVTExfTkFNRVMKKyAgICAjIGFuZCBnZW5lcmF0ZSBhIHJ1bGUgdG8gcmVidWlsdCB0aGUgbGlicmFyeQorICAgIGlmbmVxICgiJChNT0RfREVQUykiLCAiIikKKwkJQGVjaG8gImlmZXEgKHhcIiQkIiIoVilcIiwgeFwiMlwiKSIgID4+ICQoTU9EX0NPTkZJR19GSUxFKQorCQlAZWNobyAiICAgJCQiIihpbmZvICEhISBOb3cgaW5jbHVkZSBkZXBlbmRlbmNpZXMgJChNT0RfREVQUykpIiA+PiAkKE1PRF9DT05GSUdfRklMRSkKKwkJQGVjaG8gImVuZGlmIiAgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisJCUBlY2hvICIkKE1PRF9OQU1FKV9NT0RfREVQUyA9ICQoTU9EX0RFUFMpIiA+PiAkKE1PRF9DT05GSUdfRklMRSkKKwkJQGVjaG8gImlmbmVxICh4XCIkJCIiKFNLSVBfREVQUylcIiwgeFwieWVzXCIpIiAgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisJCUBlY2hvICJpbmNsdWRlICQkIiIoJChNT0RfTkFNRSlfTU9EX0RFUFM6JT0kKE9VVF9ESVJfQkFTRSkvTWFrZWZpbGUuY29uZmlnLiUpIiA+PiAkKE1PRF9DT05GSUdfRklMRSkKKwkJQGVjaG8gImVuZGlmIiAgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisJCUBlY2hvICJpZmVxICh4XCIkJCIiKFYpXCIsIHhcIjJcIikiICA+PiAkKE1PRF9DT05GSUdfRklMRSkKKwkJQGVjaG8gIiAgICQkIiIoaW5mbyAhISEgJChNT0RfTkFNRSkgZmluaXNoZWQgaW5jbHVkaW5nIGRlcGVuZGVuY2llcykiID4+ICQoTU9EX0NPTkZJR19GSUxFKQorCQlAZWNobyAiZW5kaWYiICA+PiAkKE1PRF9DT05GSUdfRklMRSkKKyAgICBlbmRpZgorCisJQGVjaG8gIkVYVFJBX0NGTEFHUyArPSAkKE1PRF9JTkNTKSIgPj4gJChNT0RfQ09ORklHX0ZJTEUpCisKKwlAZWNobyAiIiA+PiAkKE1PRF9DT05GSUdfRklMRSkKKwlAZWNobyAiZW5kaWYiID4+ICQoTU9EX0NPTkZJR19GSUxFKQorIyAKKyMgZW5kIG9mIG1vZGRlcDogdGFyZ2V0CisjCisKK2NsZWFuX21vZHVsZToKK2lmZXEgICgiJChNT0RfVFlQRSkiLCAibGludXhfbW9kdWxlIikKKwkkKFNJTEVOVF9CVUlMRCktdGVzdCAtZiAkKFNSQ19ESVIpL01ha2VmaWxlICYmICQoTUFLRSkgJChLRVJORUxfTUFLRVBBUk1TKSBjbGVhbgorCSQoU0lMRU5UX0JVSUxEKWNkICQoU1JDX0RJUikgJiYgcm0gLWZyICQoJChNT0RfTkFNRSktb2JqcykgJCgkKE1PRF9OQU1FKS1vYmpzOi4uLyU9Li4vLiUuY21kKQorCSQoU0lMRU5UX0JVSUxEKXJtIC1mciAkKE9VVF9ESVJfQkFTRSkvbGludXhfbW9kdWxlcy8kKE1PRF9OQU1FKS5rbworZW5kaWYKK2lmZXEgICgiJChNT0RfVFlQRSkiLCAibGludXhfbGliIikKKwkkKFNJTEVOVF9CVUlMRClybSAtZnIgJChMSU5VWF9MSUJfT0JKRUNUUykKK2VuZGlmCQorCSQoU0lMRU5UX0JVSUxEKWNkICQoU1JDX0RJUikgJiYgcm0gLWZyICQocGF0c3Vic3QgJS5jLC4lLm8uY21kLCQoc3JjcykpCisJJChTSUxFTlRfQlVJTEQpWyAhIC1kICQoT1VUX0RJUikgXSB8fCBmaW5kICQoT1VUX0RJUikgLW5hbWUgJyouW28sZCxhXScgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1yZgorCSQoU0lMRU5UX0JVSUxEKVsgISAtZCAkKE9VVF9ESVIpIF0gfHwgZmluZCAkKE9VVF9ESVIpIC1uYW1lICcqficgICAgICAgIC1wcmludDAgfCB4YXJncyAtMCBybSAtcmYKKwkkKFNJTEVOVF9CVUlMRClbICEgLWQgJChPVVRfRElSKSBdIHx8IGZpbmQgJChPVVRfRElSKSAtbmFtZSAnKi5rbycgICAgICAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLXJmCisJJChTSUxFTlRfQlVJTEQpWyAhIC1kICQoT1VUX0RJUikgXSB8fCBmaW5kICQoT1VUX0RJUikgLW5hbWUgJy4qLmNtZCcgICAgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1yZgorCSQoU0lMRU5UX0JVSUxEKXJtIC1mciAkKFNSQ19ESVIpLyoubW9kLmMgJChTUkNfRElSKS9tb2R1bGVzLm9yZGVyICQoU1JDX0RJUikvTW9kdWxlLnN5bXZlcnMgJChTUkNfRElSKS8udG1wX3ZlcnNpb25zCisJJChTSUxFTlRfQlVJTEQpcm0gLWZyICQoTU9EX1RBUkdFVCkgJChPVVRfRElSKS8kKFRBUkdFVCkgJChPVVRfRElSKS91bml0ZXN0ICQoVEFSR0VUX0xJQl9GTkFNRSkKKwkkKFNJTEVOVF9CVUlMRClybSAtZnIgJChBTExfTElCX09CSlMpCisJJChTSUxFTlRfQlVJTEQpcm0gLWZyICQoR0VOX1NSQ1MpICQoQ09ERUdFTl9PVVRQVVRfRElSKS8uZ2VuZXJhdGVkCitpZm5lcSAoIiQoTU9EX05BTUUpIiwgIiIpCisJJChTSUxFTlRfQlVJTEQpcm0gLWZyICQoT1VUX0RJUl9CQVNFKS8uJChNT0RfTkFNRSkKKwkkKFNJTEVOVF9CVUlMRClybSAtZnIgJChTUkNfRElSKS8uJChNT0RfTkFNRSlfaW5fcHJvZ3Jlc3MKK2VuZGlmCQorICAgIAorY2xvYmJlcjogY2xlYW5fbW9kdWxlCisJJChTSUxFTlRfQlVJTEQpcm0gLWZyICQoT1VUX0RJUikKKworIyBPcHRpb25hbCBwbGF0Zm9ybS1zcGVjaWZpYyBydWxlcworLWluY2x1ZGUgJChNQUtFX0RFVklDRV9ESVIpL01ha2VmaWxlLiQoU1VCU1lTVEVNKS5ydWxlcworCisjIEdlbmVyYXRlIGJvYXJkLXNwZWNpZmljIGVudmlyb25tZW50IGlmIGFueQorYm9hcmRfZW52OiAkKEJPQVJEX0VOVl9SVUxFKQorCQorCittb2R1bGVfbmFtZToKKwkkKGluZm8gJChNT0RfTkFNRSkpCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvbWFrZS9NYWtlZmlsZS50ZW1wbGF0ZSBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9tYWtlL01ha2VmaWxlLnRlbXBsYXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzM2U5NjIKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvbWFrZS9NYWtlZmlsZS50ZW1wbGF0ZQpAQCAtMCwwICsxLDEyIEBACisjIENlbnRyYWwgTWFrZWZpbGUgdGVtcGxhdGUKKyMgQnVpbGRzIHNwZWNpZmljIG1vZHVsZQorIyBJbnB1dCBwYXJhbWV0ZXJzOgorIyBNT0RfRElSCisjIFRPUF9ESVIKKworaWZlcSAoeCIkKFYpIiwgeCIxIikKKyAgICAkKGluZm8gQnVpbGRpbmcgbW9kdWxlICQoTU9EX0RJUikpCitlbmRpZgorCitpbmNsdWRlICQoTUFLRV9ESVIpL01ha2VmaWxlLmNvbmZpZworaW5jbHVkZSAkKE1BS0VfRElSKS9NYWtlZmlsZS5ydWxlcwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL21ha2UvYmNtNjg2MjAvTWFrZWZpbGUuaG9zdC5jb25maWcgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvbWFrZS9iY202ODYyMC9NYWtlZmlsZS5ob3N0LmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjQyYjExCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL21ha2UvYmNtNjg2MjAvTWFrZWZpbGUuaG9zdC5jb25maWcKQEAgLTAsMCArMSwyMyBAQAorIyBNYXBsZSBob3N0IGNvbmZpZ3VyYXRpb24KKyMKKyMgU2V0IGVudmlyb25tZW50LCBleHRyYSBmbGFncywgZXRjLgorIyBJbiBwYXJ0aWN1bGFyLCBzZXQgQ1JPU1NfQ09NUElMRQorIyBGb3IgbGludXggZW52aXJvbm1lbnQgbWFrZSBzdXJlIHRvIHNldCBhbHNvIE9TX0tFUk5FTD1saW51eCwgS0VSTkVMRElSLCBLRVJORUxfT1VURElSIGFuZCBLRVJORUxfQVJDSAoraWZuZXEgKCIkKEJPQVJEKSIsICIiKQorICAgIGluY2x1ZGUgJChNQUtFX0RFVklDRV9ESVIpL2JvYXJkLiQoQk9BUkQpLmNvbmZpZworZW5kaWYKKworaW5jbHVkZSAkKE1BS0VfREVWSUNFX0RJUikvJChUT09MQ0hBSU4pLm9wdHMKKworZXhwb3J0IEtFUk5FTERJUgorZXhwb3J0IEtFUk5FTF9PVVRESVIKK2V4cG9ydCBLRVJORUxfQVJDSAorZXhwb3J0IE9TX0tFUk5FTAorCitpZmVxICgiJChVU0VfT05VX1NJTSkiLCAieSIpCisgICAgQ0ZMQUdTICs9IC1EQ09ORklHX09OVV9TSU0KKyAgICBleHBvcnQgQ09ORklHX09OVV9TSU0gOj0geQorZW5kaWYKKworTElOVF9GTEFHUyA9IC1lNjg2ICQoTUFLRV9ERVZJQ0VfRElSKS9nY2MubG50ICQoTUFLRV9ERVZJQ0VfRElSKS9jb25maWcubG50CisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9tYWtlL2JjbTY4NjIwL01ha2VmaWxlLmhvc3QucnVsZXMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvbWFrZS9iY202ODYyMC9NYWtlZmlsZS5ob3N0LnJ1bGVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YzRjNDQKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvbWFrZS9iY202ODYyMC9NYWtlZmlsZS5ob3N0LnJ1bGVzCkBAIC0wLDAgKzEsNyBAQAorIyBNYXBsZSBob3N0IHJ1bGVzCisjCisjIFBsYXRmb3JtL2JvYXJkLXNwZWNpZmljIHJ1bGVzCisjIEluIHBhcnRpY3VsYXIsIHNldCBCT0FSRF9FTlZfUlVMRSBpZiB0aGVyZSBpcyBhbnl0aGluZyBib2FyZC1zcGVjaWZpYyB0byBiZSBkb25lCitpZm5lcSAoIiQoQk9BUkQpIiwgIiIpCisgICAgLWluY2x1ZGUgJChNQUtFX0RFVklDRV9ESVIpL2JvYXJkLiQoQk9BUkQpLnJ1bGVzCitlbmRpZgpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL21ha2UvYmNtNjg2MjAvYXJtY2MubG50IGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL21ha2UvYmNtNjg2MjAvYXJtY2MubG50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YWE3NjYKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvbWFrZS9iY202ODYyMC9hcm1jYy5sbnQKQEAgLTAsMCArMSw1IEBACistaS9wcm9qZWN0cy94cG9uX2NvX2xpbnQvc291cmNlcy9zdXBwL2xudAorY28tQVJNQ0MtNS5sbnQKKy1pL3Rvb2xzL2FybS9EUy01XzUuMTguMC9MaW51eC02NC9pbmNsdWRlCistZCJfX2ludDY0PWxvbmcgbG9uZyIKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL21ha2UvYmNtNjg2MjAvYm9hcmQucmVtb3RlX3dyeC5jb25maWcgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvbWFrZS9iY202ODYyMC9ib2FyZC5yZW1vdGVfd3J4LmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2NmYjMyCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL21ha2UvYmNtNjg2MjAvYm9hcmQucmVtb3RlX3dyeC5jb25maWcKQEAgLTAsMCArMSwyNSBAQAorIyBSZW1vdGUgV1JYIGJvYXJkCisjCitleHBvcnQgQ09ORklHX1RSQU5TUE9SVF9SQVcgPSBuCisKK2lmZXEgKCIkKFNVQlNZU1RFTSkiLCAiZW1iZWRkZWQiKQorICAgICQoZXJyb3IgQ2FuJ3QgYnVpbGQgZW1iZWRkZWQgc3Vic3lzdGVtIGZvciB0aGlzIGJvYXJkKQorZWxzZQorICAgIEFSQ0hfRkxBR1MgICAgICArPSAtRUIgLW1hYmk9NjQKKyAgICBUT09MQ0hBSU5fUEFUSCAgPz0gL29wdC90b29sY2hhaW5zL21hcGxlL3Rvb2xjaGFpbnNfYmluL21pcHNjcm9zcy9saW51eC9iaW4KKyAgICBDUk9TU19DT01QSUxFICAgPSAkKFRPT0xDSEFJTl9QQVRIKS9taXBzNjQtbmxtLWxpbnV4LQorCisgICAgIyBhIGtsdWRnZSBoZXJlLiBJZiBDT05GSUdfVFJBTlNQT1JUX1JBVyBpcyBub3Qgc2V0LCB0aGF0IG1lYW5zIHRoYXQgd2UgYXJlIGJ1aWxkaW5nIGZvciAKKyAgICAjIHdyeCwgYnV0IG5vdCB0aGUgc2FtZSB3cnggd2hlcmUgTWFwbGUgaXMuIEZvciBleGFtcGxlLCBidWlsZGluZyBmb3IgV1JYIHRoYXQgY29udHJvbHMgCisgICAgIyBzd2l0Y2ggZGlyZWN0bHkgYW5kIG1hcGxlIHJlbW90ZWx5LiBJbiB0aGlzIGNhc2UsIHdlIGRvbid0IHdhbnQgYW55IGJvYXJkLXNwZWNpZmljIHN0dWZmCisgICAgIyB0byBiZSBjb21waWxlZCBpbiAoZS5nLiwgRlBHQSwgSTJDLCBldGMuKS4KKyAgICBvdmVycmlkZSBCT0FSRCA9CisgICAgCisgICAgIyBPUyBmb3IgdXNlciBzcGFjZSAKKyAgICBPUyAgICAgICAgICAgICAgPSBwb3NpeAorICAgIAorICAgIFNJTVVMQVRJT05fQlVJTEQgPSB5CisgICAKK2VuZGlmCisKKwpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL21ha2UvYmNtNjg2MjAvYm9hcmQud3J4LmNvbmZpZyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9tYWtlL2JjbTY4NjIwL2JvYXJkLndyeC5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTliZGYxMgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9tYWtlL2JjbTY4NjIwL2JvYXJkLndyeC5jb25maWcKQEAgLTAsMCArMSwxMTIgQEAKKyMgV1JYIGJvYXJkCisjCisKKyMgVXNlIHJhdyB0cmFuc3BvcnQKK2V4cG9ydCBDT05GSUdfVFJBTlNQT1JUX1JBVyA9IHkKKworRU5BQkxFX1BNQyAgID89IHkKKworaWZlcSAoIiQoRU5BQkxFX1BNQykiLCAieSIpCisgICAgRVhUUkFfQ0ZMQUdTICAgKz0gLURCQ01fUE1DX0VYSVNUCitlbmRpZgorCitpZmVxICgiJChTVUJTWVNURU0pIiwgImVtYmVkZGVkIikKKyAgICBUT09MQ0hBSU4gPSBhcm1jYworICAgIE9TPXRocmVhZHgKKwkgICAgCisgICAgIyBXZSB1c2UgZ2NjIGZvciBkZXBlbmRlbmN5IGdlbmVyYXRpb24gaW4gb3JkZXIgdG8gc3BlZWQgdXAgdGhlIGJ1aWxkIHByb2Nlc3MKKyAgICBHQ0NWRVIgPz0gNC44LjEKKyAgICAKKyAgICAjIFVzZSByYXcgdHJhbnNwb3J0CisgICAgIyBTaG91bGQgYmUgbW92ZWQgZ28gY29tbW9uIGhvc3QvZW1iZWRkZWQgc2VjdGlvbiB3aGVuIHRoZSBob3N0IGVudmlyb25tZW50IGlzIHJlYWR5CisgICAgQ09NUElMRV9BTExfSU5fT05FX0dPID89IG4KKyAgICBleHBvcnQgQ09NUElMRV9BTExfSU5fT05FX0dPCisKKyAgICAjIERlZmluaXRpb24gZm9yIGVuYWJsZSBQZXJpb2RpYyAgQVJNIERTLTUgbGljZW5zZSBtb2RlbCwgdXAgdG8gNFggaW1wcm92ZW1lbnQgZm9yIGNvbXBpbGF0aW9uIHRpbWUgCisgICAgIyB0aGUgb3V0cHV0IGZyb20gdGhlIC90b29scy9iaW4vZ2V0X2xpY19zZXJ2ZXJzIGFybTUtcGVyaW9kaWMgaXMgb3B0aW1pemVkIGZvciBlYWNoIHNpdGUsIHRoZSAKKyAgICAjICIzODIyNEBsaWMtdGx2YS0wMDE6MzgyMjRAbGljLWJsci0wMDE6MzgyMjRAbGljLWlydmEtMzUwOjM4MjI0QGxpYy1pcnZhLTAwMCIgc3RyaW5nIGlzIHZhbGlkZSBmb3IgSFogc2l0ZQorICAgIGV4cG9ydCBBUk1MTURfTElDRU5TRV9GSUxFIDo9JChzaGVsbCBpZiBbIC1mIC90b29scy9iaW4vZ2V0X2xpY19zZXJ2ZXJzIF0gOyB0aGVuIC90b29scy9iaW4vZ2V0X2xpY19zZXJ2ZXJzIGFybTUtcGVyaW9kaWMgOyBcCitlbHNlIGVjaG8gIjM4MjI0QGxpYy10bHZhLTAwMS5icm9hZGNvbS5uZXQ6MzgyMjRAbGljLWJsci0wMDEuYnJvYWRjb20ubmV0OjM4MjI0QGxpYy1pcnZhLTM1MC5icm9hZGNvbS5uZXQ6MzgyMjRAbGljLWlydmEtMDAwLmJyb2FkY29tLm5ldCI7IGZpKQorICAgIGV4cG9ydCBBUk1DQzVfQ0NPUFQgICAgICAgIDo9LS1zaXRlbGljZW5zZSAtLWxpY3JldHJ5CisgICAgZXhwb3J0IEFSTUNDNV9BU01PUFQgICAgICAgOj0tLXNpdGVsaWNlbnNlIC0tbGljcmV0cnkKKyAgICBleHBvcnQgQVJNQ0M1X0xJTktPUFQgICAgICA6PS0tc2l0ZWxpY2Vuc2UgLS1saWNyZXRyeQorICAgIGV4cG9ydCBBUk1DQzVfRlJPTUVMRk9QVCAgIDo9LS1zaXRlbGljZW5zZSAtLWxpY3JldHJ5CisgICAgZXhwb3J0IEFSTUNDNV9BUk9QVCAgICAgICAgOj0tLXNpdGVsaWNlbnNlIC0tbGljcmV0cnkKKyAgIAorICAgIFVTRV9VTkNBQ0hFX0JXX01BUCA/PSBuCisgICAgZXhwb3J0IFVTRV9VTkNBQ0hFX0JXX01BUCAKKyAgICBVU0VfVU5DQUNIRV9TUl9OU1JfQ09VTlRFUlMgPz0gbgorICAgIGV4cG9ydCBVU0VfVU5DQUNIRV9TUl9OU1JfQ09VTlRFUlMKKworICAgIGlmZXEgKCIkKFNJTVVMQVRJT04pIiwgInkiKQorICAgICAgICBFWFRSQV9ERUZJTkVTICs9IC1EU0lNVUxBVElPTgorICAgIGVuZGlmCisJCisJVVNFX1NZTV9UQUIgPz0geQorCWV4cG9ydCBVU0VfU1lNX1RBQgorCQorCWlmZXEgKCIkKFVTRV9TWU1fVEFCKSIsICJ5IikKKwkJCisJCWV4cG9ydCBTWU1UQUJfR0VOX1RPT0xTID0gJChUT1BfRElSKS9zY3JpcHRzL2JjbVN5bVRsYkdlbi5zaCAKKwkJCisJCWlmZXEgKCIkKFNZTVRBQl9OT19EQVRBKSIsICJ5IikKKwkJICAgIGV4cG9ydCBTWU1UQUJfTkQ9LW5kCisJICAgIGVuZGlmCisJCisJICAgIGlmZXEgKCIkKFNZTVRBQl9OT19MREFUQSkiLCAieSIpCisJCSAgIGV4cG9ydCBTWU1UQUJfTkxEPS1ubGQKKwkgICAgZW5kaWYKKwkKKwkgICAgaWZlcSAoIiQoU1lNVEFCX05PX0xGQU5DKSIsICJ5IikKKwkJICAgIGV4cG9ydCBTWU1UQUJfTkxGPS1ubGYKKwkgICAgZW5kaWYKKwkJCisJCUVYVFJBX0RFRklORVMgKz0gLURVU0VfU1lNX1RBQgkKKwkJCisJCWV4cG9ydCBEVU1NWV9TWU1UQUIgPSAkKFRPUF9ESVIpL2VtYmVkZGVkL3N5cy9ic3Avc3ltdGFiLmMKKwllbmRpZgorICAgIAorICAgIGlmZXEgKCIkKEVOQUJMRV9UUkFDRSkiLCAieSIpCisgICAgICAgIEVYVFJBX0RFRklORVMgKz0gLURUWF9FTkFCTEVfRVZFTlRfVFJBQ0UKKyAgICAgICAgaWZlcSAoIiQoREVCVUdfVFJBQ0VfSU5JVCkiLCAieSIpCisgICAgICAgICAgICBFWFRSQV9ERUZJTkVTICs9IC1EREVCVUdfVFJBQ0VfSU5JVAorICAgICAgICBlbmRpZgorICAgIGVuZGlmCisgICAgCQorICAgIElOVF9DSEVDSyAgICA/PSB5CisgICAgaWZlcSAoIiQoSU5UX0NIRUNLKSIsICJ5IikKKyAgICAgICAgRVhUUkFfREVGSU5FUyArPSAtRElOVEVSUlVQVF9WQUxJREFUSU9OCisgICAgZW5kaWYKK2Vsc2UKKyAgICBCT0FSRF9ESVIgICAgICAgPz0gJChUT1BfRElSKS8uLi9ib2FyZHMvY3VyLyQoQk9BUkQpCisgICAgS0VSTkVMX0JSQ01fVkVSID0gMy4wLjItbTEuMDEKKyAgICBUT09MQ0hBSU5fUEFUSCAgPz0gL29wdC90b29sY2hhaW5zL21hcGxlL3Rvb2xjaGFpbnNfYmluL21pcHNjcm9zcy9saW51eC9iaW4KKyAgICBDUk9TU19DT01QSUxFICAgPSAkKFRPT0xDSEFJTl9QQVRIKS9taXBzNjQtbmxtLWxpbnV4LQorICAgIAorICAgIEtFUk5FTERJUiAgICAgICA9ICQoQk9BUkRfRElSKS9saW51eC8kKEtFUk5FTF9CUkNNX1ZFUikvbGludXgKKyAgICBLRVJORUxfT1VURElSICA/PSAkKEtFUk5FTERJUikKKyAgICBleHBvcnQgS0VSTkVMRElSCisgICAgZXhwb3J0IEtFUk5FTF9PVVRESVIKKworCisgICAgIyB1c2UgTGludXgga2VybmVsCisgICAgZXhwb3J0IE9TX0tFUk5FTD0gbGludXgKKyAgICAjIE9TIGZvciB1c2VyIHNwYWNlIAorICAgIE9TICAgICAgICAgICAgICA9IHBvc2l4CisgICAgCisgICAgIyBBcmNoaXRlY3R1cmUgZGVmaW5pdGlvbiAgIAorICAgIEtFUk5FTF9BUkNIICAgICA9IG1pcHMKKyAgICBBUkNIX0ZMQUdTICAgICAgKz0gLUVCIC1tYWJpPTY0CisgICAgCisgICAgZXhwb3J0IEtFUk5FTF9BUkNICisgICAgZXhwb3J0IEFSQ0hfRkxBR1MKKyAgICAKKyAgICBleHBvcnQgS0VSTkVMX1RBUl9OQU1FICA9IHdyeF9saW51eC1zZGsudGFyLmJ6MgorICAgIGV4cG9ydCBMSUJTX1RBUl9OQU1FICAgID0gbGlicmFyaWVzLnRhci5iejIKKyAgICAKKyAgICAjIFJ1bGUgdHUgYnVpbGQgd3J4IGtlcm5lbC4gVGhlIHJ1bGUgaXRzZWxmIGlzIGRlZmluZWQgaW4gYm9hcmQud3J4LnJ1bGVzCisgICAgZXhwb3J0IEJPQVJEX0VOVl9SVUxFICAgPSB3cnhfbGludXhfa2VybmVsIAorICAgIAorZW5kaWYKKworCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvbWFrZS9iY202ODYyMC9ib2FyZC53cngucnVsZXMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvbWFrZS9iY202ODYyMC9ib2FyZC53cngucnVsZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU0NmY1ZAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9tYWtlL2JjbTY4NjIwL2JvYXJkLndyeC5ydWxlcwpAQCAtMCwwICsxLDI2IEBACisjIFdSWC1zcGVjaWZpYyBydWxlcworCitpZmVxICgiJChTVUJTWVNURU0pIiwgImhvc3QiKQorICAgICMgQnVpbGQgbGludXgga2VybmVsIGlmIG5vdCBkb25lIHlldAorCit3cnhfbGludXhfa2VybmVsOgorCWlmIFsgISAtZCAkKEJPQVJEX0RJUikgXTsgdGhlblwKKwkJJChCT0xEX1BSSU5UKSAiRVJST1I6ICQoQk9BUkRfRElSKSBkaXJlY3RvcnkgZG9lc24ndCBub3QgZXhpc3QiIDsgXAorCQlleGl0IC0xOyBcCisJZmk7XAorICAgIGlmIFsgLWYgICQoS0VSTkVMX09VVERJUikvdm1saW51eCBdIDsgdGhlbiBcCisgICAgICAgICQoQk9MRF9QUklOVCkgImZvdW5kIGNvbXBpbGVkICQoQk9BUkQpIGtlcm5lbCBpbiAkKEtFUk5FTF9PVVRESVIpIiA7XAorICAgICAgICBleGl0IDA7XAorICAgIGZpO1wKKwlpZiBbICEgLWYgJChCT0FSRF9ESVIpL2xpbnV4LyQoS0VSTkVMX0JSQ01fVkVSKS8kKEtFUk5FTF9UQVJfTkFNRSkgXTsgdGhlblwKKwkJJChCT0xEX1BSSU5UKSAiRVJST1I6IEtlcm5lbCB0YXIgZmlsZSBkb2Vzbid0IGV4aXN0LiBQbGVhc2UgZ2V0IHRoZSBsYXRlc3QgdmVyc2lvbiBvZiAkKEJPQVJEX0RJUikvbGludXgvJChLRVJORUxfQlJDTV9WRVIpLyQoS0VSTkVMX1RBUl9OQU1FKSAiO1wKKwkJZXhpdCAtMTtcCisJZmk7XAorCWlmIFsgISAtZiAkKEJPQVJEX0RJUikvbGludXgvJChLRVJORUxfQlJDTV9WRVIpLyQoTElCU19UQVJfTkFNRSkgXTsgdGhlbiBcCisJCSQoQk9MRF9QUklOVCkgIkVSUk9SOiBLZXJuZWwgTGlicmFyaWVzIHRhciBmaWxlIG5vdCBleGlzdHMuIFBsZWFzZSBnZXQgbGF0ZXN0IHZlcnNpb24gb2YgJChCT0FSRF9ESVIpL2xpbnV4LyQoS0VSTkVMX0JSQ01fVkVSKS8kKExJQlNfVEFSX05BTUUpICI7XAorCQlleGl0IC0xO1wKKwlmaTtcCisJJChCT0xEX1BSSU5UKSAiQnVpbGRpbmcgd3J4IGtlcm5lbCI7XAorCWNkICQoQk9BUkRfRElSKTsgICQoTUFLRSkKKworZW5kaWYKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9tYWtlL2JjbTY4NjIwL2djYy5sbnQgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvbWFrZS9iY202ODYyMC9nY2MubG50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhM2MxOTgKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvbWFrZS9iY202ODYyMC9nY2MubG50CkBAIC0wLDAgKzEsNSBAQAorLWkvcHJvamVjdHMveHBvbl9jb19saW50L3NvdXJjZXMvc3VwcC9sbnQKK2NvLWdjYy5sbnQKKy1lbWFjcm8oNjMzLCBCVUdfT04pCistcGFyZW50KHZhX2xpc3QsIF9fZ251Y192YV9saXN0KQorLXBhcmVudCh2YV9saXN0LCBfX2J1aWx0aW5fdmFfbGlzdCkKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9tYWtlL2JjbTY4NjIwL2djYy5vcHRzIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL21ha2UvYmNtNjg2MjAvZ2NjLm9wdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE4YjQwMwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9tYWtlL2JjbTY4NjIwL2djYy5vcHRzCkBAIC0wLDAgKzEsNTMgQEAKKyMgTWFwbGUgU0RLIHJlcXVpcmVzIEM5OQorRVhUUkFfQ0ZMQUdTICAgICs9IC1XYWxsIC1XZXJyb3IKK0FSRkxBR1MgPSByCisKK0JMRF9DQyA9ICQoQ0NBQ0hFKSAkKENST1NTX0NPTVBJTEUpZ2NjCitCTERfQVMgPSAkKENDQUNIRSkgJChDUk9TU19DT01QSUxFKWdjYworQkxEX0FSID0gJChDUk9TU19DT01QSUxFKWFyCitCTERfREVQID0gJChCTERfQ0MpCisKK0NGTEFHUyAgICArPSAtc3RkPWM5OQoraWZlcSAoIiQoRU5BQkxFX0VYVFJBX1dBUk5JTkdTKSIsICJ5IikKKyAgICBDRkxBR1MgICAgKz0gLVdleHRyYSAtV2JhZC1mdW5jdGlvbi1jYXN0IC1XY2FzdC1hbGlnbiAtV2Nhc3QtcXVhbCAtV2NoYXItc3Vic2NyaXB0cworICAgIENGTEFHUyAgICArPSAtV21pc3NpbmctcHJvdG90eXBlcyAtV25lc3RlZC1leHRlcm5zIC1XcG9pbnRlci1hcml0aCAtV3JlZHVuZGFudC1kZWNscworICAgIENGTEFHUyAgICArPSAtV3N0cmljdC1wcm90b3R5cGVzIC1XcGFyZW50aGVzZXMgLVdzd2l0Y2ggLVdzd2l0Y2gtZGVmYXVsdCAtV3VudXNlZCAtV3VuaW5pdGlhbGl6ZWQgLVd1bnVzZWQtYnV0LXNldC12YXJpYWJsZQorICAgIENGTEFHUyAgICArPSAtV25vLXVudXNlZC1wYXJhbWV0ZXIgLVduby1taXNzaW5nLWZpZWxkLWluaXRpYWxpemVycyAtV25vLXNpZ24tY29tcGFyZQorICAgIENGTEFHUyAgICArPSAtV3NoYWRvdyAtV25vLWlubGluZQorZW5kaWYKKworQlVJTERfREVQU19JTl9DQyAgICA/PSB5CitleHBvcnQgQlVJTERfREVQU19JTl9DQworCitpZmVxICgiJChCVUlMRF9ERVBTX0lOX0NDKSIsICJ5IikKKyAgICBDRkxBR1MgKz0gLU1NRCAtTVAKK2VuZGlmCisKK2lmZXEgKCIkKENST1NTX0NPTVBJTEUpIiwgIiIpCisgICAgQVJDSF9GTEFHUyArPSAtbTMyIC1tYXJjaD1pMzg2CisgICAgU0lNVUxBVElPTl9CVUlMRCA/PSB5CisgICAgZXhwb3J0IFNJTVVMQVRJT05fQlVJTEQKKyAgICBHQ0NWRVIgPz0gNC44LjEKKyAgICBleHBvcnQgR0NDVkVSCisgICAgIyBUZW1wb3JhcnksIHVudGlsIGJhZCBjYXN0IGluIGJjbV9kZXZfbG9nX3Rhc2suYyBpcyBmaXhlZCAoU1dNQVBMRS0yMTIzKQorICAgIENGTEFHUyArPSAtV25vLXN0cmljdC1hbGlhc2luZworZW5kaWYKKworaWZlcSAoIiQoRVhQT1JUX0RZTkFNSUNfU1lNQk9MUykiLCAieSIpCisgICAgQVJDSF9GTEFHUyArPSAtV2wsLWV4cG9ydC1keW5hbWljIAorZW5kaWYKKworaWZuZXEgKCIkKFNJTVVMQVRJT05fQlVJTEQpIiwgInkiKQorICAgIEVYVFJBX0NGTEFHUyAgICArPSAtV2ZyYW1lLWxhcmdlci10aGFuPTE2Mzg0CitlbmRpZgorCitMSUJTX01BUktFUiA9LWwKK0xJQlNfUEFUSF9NQVJLRVIgPS1MCitMSUJTX1NUQVJUX01BUktFUiA9IC1XbCwtLXN0YXJ0LWdyb3VwCitMSUJTX0VORF9NQVJLRVIgPSAtV2wsLS1lbmQtZ3JvdXAKKworIyBEZWJ1ZyBhbmQgcmVsZWFzZSBvcHRpbWl6YXRpb24gb3B0aW9ucy4gQ2FuIGJlIG92ZXJ3cml0dGVuIGluIE1ha2VmaWxlLmNvbmZpZy4kKFBMQVRGT1JNKQorREVCVUdfT19DRkxBR1MgICAgICA/PSAtZyAtZ2dkYiAtTzAKK0RFQlVHX09fTEZMQUdTICAgICAgPz0gLWcKK1JFTEVBU0VfT19DRkxBR1MgICAgPz0gLWcgLU8yCitSRUxFQVNFX09fTEZMQUdTICAgID89IC1nCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvbWFrZS9iY202ODYyMC9tb2R1bGVzLmhvc3QgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvbWFrZS9iY202ODYyMC9tb2R1bGVzLmhvc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdhMGY1OQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9tYWtlL2JjbTY4NjIwL21vZHVsZXMuaG9zdApAQCAtMCwwICsxLDY3IEBACitob3N0X2N1c3RvbWl6ZWQvZGV2X2N0cmxfbGludXgKK2hvc3RfY3VzdG9taXplZC9jb29wX2RiYV9saW51eAoraG9zdF9jdXN0b21pemVkL2VtYmVkZGVkX2NsaQoraG9zdF9jdXN0b21pemVkL2VtYmVkZGVkX2NsaS9tYWluCitob3N0X2N1c3RvbWl6ZWQvb3NfYWJzdHJhY3Rpb24KK2hvc3RfY3VzdG9taXplZC9vc19hYnN0cmFjdGlvbi9saW51eAoraG9zdF9jdXN0b21pemVkL29zX2Fic3RyYWN0aW9uL29zX2NsaQoraG9zdF9jdXN0b21pemVkL3RyYW5zcG9ydC9ubF9zb2NrZXQKK2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvdW5peF9zb2NrZXQKK2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvcGx1Z2luCitob3N0X2N1c3RvbWl6ZWQvdHJhbnNwb3J0L3BsdWdpbi9tdXgKK2hvc3RfY3VzdG9taXplZC90cmFuc3BvcnQvcGx1Z2luL3Jhd19ubAoraG9zdF9jdXN0b21pemVkL3RyYW5zcG9ydC9wbHVnaW4vcmF3X3VkCitob3N0X2N1c3RvbWl6ZWQvdHJhbnNwb3J0L3BsdWdpbi91ZHAKK2hvc3RfY3VzdG9taXplZC91c2VyX2NvbmZpZworaG9zdF9jdXN0b21pemVkL3VzZXJfY29uZmlnL2JvYXJkX3NlbGVjdG9yCitob3N0X2N1c3RvbWl6ZWQvbGxfcGNpZQoraG9zdF9jdXN0b21pemVkL3BjaWUKK2hvc3RfY3VzdG9taXplZC9pMmMKK2hvc3RfY3VzdG9taXplZC9ib2FyZC93cngKK2hvc3RfY3VzdG9taXplZC9tb2RlbF9saW51eAoraG9zdF9jdXN0b21pemVkL3V0aWxzX2xpbnV4Citob3N0X2N1c3RvbWl6ZWQvYXBpX2xpbnV4Citob3N0X2N1c3RvbWl6ZWQvaG9zdF9hcGlfbGludXgKK2hvc3RfZHJpdmVyL2FwaQoraG9zdF9kcml2ZXIvdXRpbHMKK2hvc3RfZHJpdmVyL2RlYnVnCitob3N0X2RyaXZlci9kZXZfY3RybAoraG9zdF9kcml2ZXIvY29vcF9kYmEKK2hvc3RfZHJpdmVyL2Rldl9jdHJsX2RhZW1vbgoraG9zdF9kcml2ZXIvZGV2X2N0cmxfZGFlbW9uL3VzZXIKK2hvc3RfZHJpdmVyL2hvc3RfYXBpCitob3N0X2RyaXZlci9rZWVwX2FsaXZlCitob3N0X2RyaXZlci9rZWVwX2FsaXZlL2RhZW1vbgoraG9zdF9kcml2ZXIvbW9kZWwKK2hvc3RfZHJpdmVyL3BjaWUKK2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9pbmJhbmQKK2hvc3RfZHJpdmVyL3RyYW5zcG9ydAoraG9zdF9kcml2ZXIvdHJhbnNwb3J0L211eAoraG9zdF9kcml2ZXIvdHJhbnNwb3J0L211eC9kYWVtb24KK2hvc3RfZHJpdmVyL3RyYW5zcG9ydC9wY2llX3N3X3F1ZXVlCitob3N0X2RyaXZlci9mbGQKK2hvc3RfZHJpdmVyL2NvbW1vbl9ncG9uCitob3N0X3JlZmVyZW5jZS9hcGlfY2xpCitob3N0X3JlZmVyZW5jZS9kZXZpY2Vfc2VsZWN0b3IKK2hvc3RfcmVmZXJlbmNlL2NsaQoraG9zdF9yZWZlcmVuY2UvZGV2X2xvZworaG9zdF9yZWZlcmVuY2UvZGV2X2xvZ19saW51eAoraG9zdF9yZWZlcmVuY2UvZGV2X2xvZ19saW51eC9rZXJuZWwKK2hvc3RfcmVmZXJlbmNlL2FwaV9kZXZfbG9nCitob3N0X3JlZmVyZW5jZS9saW5lbm9pc2UKK2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbAoraG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2VvbgoraG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL29tb24KK2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lcG9uX2hkZQoraG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3Byb3RlY3Rpb25fc3dpdGNoaW5nCitob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvZXBvbl9vYW0KK2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9lcG9uX29hbV9jbGkKK2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9pbWFnZV90cmFuc2ZlcgoraG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL3N3X3VwZ3JhZGUKK2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9wbGF5YmFjaworaG9zdF9yZWZlcmVuY2UvdXNlcl9hcHBsL2Rwb2Vfc2VjCitob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvbmdwb24yX29udV90dW5pbmcKK2hvc3RfcmVmZXJlbmNlL2FwaV9wcm94eQoraG9zdF9yZWZlcmVuY2UvcmVtb3RlX2NsaQoraG9zdF9yZWZlcmVuY2UvY29tbW9uX2Vwb25fb2FtCitob3N0X3JlZmVyZW5jZS90aW1lX21lYXN1cmVtZW50CmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvbWFrZS9jbGFuZy5vcHRzIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL21ha2UvY2xhbmcub3B0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjM4M2VmCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL21ha2UvY2xhbmcub3B0cwpAQCAtMCwwICsxLDYgQEAKKyMgQ0xBTkcgb3B0aW9ucworCisjIENMQU5HIHRvb2wKK2V4cG9ydCBDTEFORyA/PSBjbGFuZworZXhwb3J0IENMQU5HX09QVFMgPSAtV25vLXVudXNlZC1mdW5jdGlvbgorZXhwb3J0IExMVk1WRVIgPz0gMy42CmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvbWFrZS9jb3B5X2hvc3RfZnMuc2ggYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2UvbWFrZS9jb3B5X2hvc3RfZnMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2NmZmJmMwotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9tYWtlL2NvcHlfaG9zdF9mcy5zaApAQCAtMCwwICsxLDMxIEBACisjISAvYmluL2Jhc2gKKworI3NldCAteAorCitIT1NUX0ZTX1RBUkdFVD0ke09VVF9IT1NUX0RJUn0vZnMKK0hPU1RfT1VUUFVUX1RBUkdFVD0ke09VVF9IT1NUX0RJUn0vb3V0cHV0CisKK2VjaG8gLW4gIkNvcHlpbmcgaG9zdCBmcyB0byAke0hPU1RfRlNfVEFSR0VUfS4uLiIKK21rZGlyIC1wICR7SE9TVF9GU19UQVJHRVR9CitybSAtZnIgJHtIT1NUX0ZTX1RBUkdFVH0vKgorcHVzaGQgJHtIT1NUX0ZTX1RBUkdFVH0KK2xuIC1zICR7T1VUX0hPU1RfRElSfS9saW51eF9tb2R1bGVzLyogLgorbG4gLXMgJHtUT1BfRElSfS9ob3N0X2N1c3RvbWl6ZWQvYm9hcmQvd3J4L2ZzLyogLgorbG4gLXMgJHtUT1BfRElSfS9lbWJlZGRlZF9iaW5hcmllcy8qIC4KK2xuIC1zICR7T1VUX0hPU1RfRElSfS9ob3N0X3JlZmVyZW5jZS91c2VyX2FwcGwvYmNtX3VzZXJfYXBwbCAuCitwb3BkCisKK2VjaG8gLW4gIkNvcHlpbmcgYWxsIG1vZHVsZXMgYW5kIGxpYnJhcmllcyB0byAke0hPU1RfT1VUUFVUX1RBUkdFVH0uLi4iCitta2RpciAtcCAke0hPU1RfT1VUUFVUX1RBUkdFVH0KK3JtIC1mciAke0hPU1RfT1VUUFVUX1RBUkdFVH0vKgorcHVzaGQgJHtIT1NUX09VVFBVVF9UQVJHRVR9CitsbiAtcyAke09VVF9IT1NUX0RJUn0vbGludXhfbW9kdWxlcy8qIC4KK2xuIC1zIGBmaW5kICR7T1VUX0hPU1RfRElSfSAtbmFtZSAnbGliKi5hJ2AgLgorbG4gLXMgJHtPVVRfSE9TVF9ESVJ9L2hvc3RfcmVmZXJlbmNlL3VzZXJfYXBwbC9iY21fdXNlcl9hcHBsIC4KK3BvcGQKKworIyBFeHRyYWN0IGkyYyBhZGRyZXNzZXMgZnJvbSBiY21vbHRfaTJjX2RldnNfYWRkci5oIGludG8gdGhlIHRhaWwgb2YgYSB0YXJnZXQgZmlsZSBjYWxsZWQgaTJjX2FkZHJzLnNoLiBzdmtfaW5pdC5zaCB3aWxsIGluY2x1ZGUgaTJjX2FkZHJzLnNoIHRvIGFjY2VzcyBpMmMgYWRkcmVzc2VzLgorZ3JlcCAtdyAiQkNNX0kyQ19ERVZfQUREUiIgJHtUT1BfRElSfS9ob3N0X2N1c3RvbWl6ZWQvaTJjL2JjbW9sdF9pMmNfZGV2c19hZGRyLmggfCBzZWQgLXMgInMvQkNNX0kyQ19ERVZfQUREUihcKC4qXCksIFwoLipcKSwgMHhcKC4qXCkpL1wxPVwzLyIgPj4gJHtIT1NUX0ZTX1RBUkdFVH0vaTJjX2FkZHJzLnNoCisKK2VjaG8gIkRvbmUiCisKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy9ncG9uX3NjcmlwdHMvZ3Bvbl9hY3RpdmF0ZV9vbnUudmJzIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL3Nka19zY3JpcHRzL2dwb25fc2NyaXB0cy9ncG9uX2FjdGl2YXRlX29udS52YnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjAyYTU1NgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy9ncG9uX3NjcmlwdHMvZ3Bvbl9hY3RpdmF0ZV9vbnUudmJzCkBAIC0wLDAgKzEsMTcgQEAKKyMgJGxhbmd1YWdlID0gIlZCU2NyaXB0Ig0KKyMgJGludGVyZmFjZSA9ICIxLjAiDQorDQorU3ViIFNlbmRBcHBsaWNhdGlvbkNvbW1hbmQoc2hlbGxfY29tbWFuZCkNCisgICAgY3J0LlNjcmVlbi5TZW5kIHNoZWxsX2NvbW1hbmQgJiBWYkNyICYgVmJDcg0KKwljcnQuc2xlZXAgMTAwMA0KK0VuZCBTdWINCisNCitTdWIgbWFpbg0KKw0KKwlwb25fbmkgPSBpbnB1dGJveCgiUE9OIE5JOiBbMC0xNV0iICkNCisJb251ID0gaW5wdXRib3goIk9OVSBJRDogWzAtMTI3XSIgKQ0KKw0KKwlTZW5kQXBwbGljYXRpb25Db21tYW5kICIvYXBpL29wZXIgb2JqZWN0PWdwb25fb251IHN1Yj1zZXRfb251X3N0YXRlIHBvbl9uaT0iICYgcG9uX25pICYgIiBvbnVfaWQ9IiAmIG9udSAmICIgb251X3N0YXRlPWFjdGl2ZSIgIA0KKwljcnQuc2xlZXAgNQ0KKw0KK0VuZCBTdWINCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2Uvc2RrX3NjcmlwdHMvZ3Bvbl9zY3JpcHRzL2dwb25fY2xlYXJfb251LnZicyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy9ncG9uX3NjcmlwdHMvZ3Bvbl9jbGVhcl9vbnUudmJzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE4ZTBkNjcKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2Uvc2RrX3NjcmlwdHMvZ3Bvbl9zY3JpcHRzL2dwb25fY2xlYXJfb251LnZicwpAQCAtMCwwICsxLDE3IEBACisjICRsYW5ndWFnZSA9ICJWQlNjcmlwdCINCisjICRpbnRlcmZhY2UgPSAiMS4wIg0KKw0KK1N1YiBTZW5kQXBwbGljYXRpb25Db21tYW5kKHNoZWxsX2NvbW1hbmQpDQorICAgIGNydC5TY3JlZW4uU2VuZCBzaGVsbF9jb21tYW5kICYgVmJDciAmIFZiQ3INCisJY3J0LnNsZWVwIDEwMDANCitFbmQgU3ViDQorDQorU3ViIG1haW4NCisNCisJCXBvbl9uaSA9IGlucHV0Ym94KCJQT04gTkk6IFswLTE1XSIgKQ0KKwkJb251ID0gaW5wdXRib3goIk9OVSBJRDogWzAtMTI3XSIgKQ0KKw0KKwlTZW5kQXBwbGljYXRpb25Db21tYW5kICIvYXBpL2NsZWFyIG9iamVjdD1ncG9uX29udSBwb25fbmk9IiAmIHBvbl9uaSAmICIgb251X2lkPSIgJiBvbnUgJiAiICIgIA0KKwljcnQuc2xlZXAgMTANCisNCitFbmQgU3ViDQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL3Nka19zY3JpcHRzL2dwb25fc2NyaXB0cy9ncG9uX2NvbmZpZ19hbGxvYy52YnMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2Uvc2RrX3NjcmlwdHMvZ3Bvbl9zY3JpcHRzL2dwb25fY29uZmlnX2FsbG9jLnZicwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45YjQxNWU3Ci0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL3Nka19zY3JpcHRzL2dwb25fc2NyaXB0cy9ncG9uX2NvbmZpZ19hbGxvYy52YnMKQEAgLTAsMCArMSwyMiBAQAorIyAkbGFuZ3VhZ2UgPSAiVkJTY3JpcHQiDQorIyAkaW50ZXJmYWNlID0gIjEuMCINCisNCitTdWIgU2VuZEFwcGxpY2F0aW9uQ29tbWFuZChzaGVsbF9jb21tYW5kKQ0KKyAgICBjcnQuU2NyZWVuLlNlbmQgc2hlbGxfY29tbWFuZCAmIFZiQ3IgJiBWYkNyDQorCWNydC5zbGVlcCAxMDAwDQorRW5kIFN1Yg0KKw0KK1N1YiBtYWluDQorDQorCXBvbl9uaSA9IGlucHV0Ym94KCJQT04gTkk6IFswLTE1XSIgKQ0KKwlvbnUgPSBpbnB1dGJveCgiT05VIElEOiBbMC0xMjddIiApDQorCWFsbG9jID0gaW5wdXRib3goIkFsbG9jIElEPyIgKQ0KKw0KKwlTZW5kQXBwbGljYXRpb25Db21tYW5kICIvfiBvZmYgIg0KKwljcnQuc2xlZXAgMTAwDQorCQ0KKwlTZW5kQXBwbGljYXRpb25Db21tYW5kICIvYXBpL3NldCBvYmplY3Q9Z3Bvbl9hbGxvYyBwb25fbmk9IiAmIHBvbl9uaSAmICIgYWxsb2NfaWQ9IiAmIGFsbG9jICYgIiBvbnVfaWQ9IiAmIG9udSAmICIgc2xhLmNicl9ydF9idz01MTIwMDAwIHNsYS5jYnJfbnJ0X2J3PTAgc2xhLmd1YXJhbnRlZWRfYnc9NTEyMDAwMCBzbGEubWF4aW11bV9idz01MTIwMDAwIHNsYS5hbGxvY190eXBlPW5vbmUgc2xhLmFkZGl0aW9uYWxfYndfZWxpZ2liaWxpdHk9bm9uZSBzbGEuY2JyX3J0X2NvbXBlbnNhdGlvbj1ubyBzbGEuY2JyX3J0X2FwX2luZGV4PTAgc2xhLmNicl9ucnRfYXBfaW5kZXg9MCBzbGEud2VpZ2h0PTAgc2xhLnByaW9yaXR5PTAiDQorCWNydC5zbGVlcCAxMDANCisJU2VuZEFwcGxpY2F0aW9uQ29tbWFuZCAiL34gb24iDQorDQorRW5kIFN1Yg0KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy9ncG9uX3NjcmlwdHMvZ3Bvbl9jb25maWdfZ2VtLnZicyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy9ncG9uX3NjcmlwdHMvZ3Bvbl9jb25maWdfZ2VtLnZicwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xZDhmYTEyCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL3Nka19zY3JpcHRzL2dwb25fc2NyaXB0cy9ncG9uX2NvbmZpZ19nZW0udmJzCkBAIC0wLDAgKzEsMjIgQEAKKyMgJGxhbmd1YWdlID0gIlZCU2NyaXB0Ig0KKyMgJGludGVyZmFjZSA9ICIxLjAiDQorDQorU3ViIFNlbmRBcHBsaWNhdGlvbkNvbW1hbmQoc2hlbGxfY29tbWFuZCkNCisgICAgY3J0LlNjcmVlbi5TZW5kIHNoZWxsX2NvbW1hbmQgJiBWYkNyICYgVmJDcg0KKwljcnQuc2xlZXAgMTAwMA0KK0VuZCBTdWINCisNCitTdWIgbWFpbg0KKw0KKwlwb25fbmkgPSBpbnB1dGJveCgiUE9OIE5JOiBbMC0xNV0iICkNCisJb251ID0gaW5wdXRib3goIk9OVSBJRDogWzAtMTI3XSIgKQ0KKwlnZW0gPSBpbnB1dGJveCgiR0VNIFBPUlQgSUQ/IiApDQorCQ0KKwlTZW5kQXBwbGljYXRpb25Db21tYW5kICIvfiBvZmYgIg0KKwljcnQuc2xlZXAgMTAwDQorCVNlbmRBcHBsaWNhdGlvbkNvbW1hbmQgIi9hcGkvc2V0IG9iamVjdD1ncG9uX2dlbV9wb3J0IHBvbl9uaT0iICYgcG9uX25pICYgIiBnZW1fcG9ydF9pZD0iICYgZ2VtICYgIiBjb25maWd1cmF0aW9uLmRpcmVjdGlvbj1iaWRpcmVjdGlvbmFsIGNvbmZpZ3VyYXRpb24udHlwZT11bmljYXN0IG9udV9pZD0iICYgb251ICYgIiBkb3duc3RyZWFtX2VuY3J5cHRpb25fbW9kZT1kaXNhYmxlIHVwc3RyZWFtX2Rlc3RpbmF0aW9uX3F1ZXVlPWRhdGEgY29udHJvbD1lbmFibGUiDQorCWNydC5zbGVlcCAxMDANCisJU2VuZEFwcGxpY2F0aW9uQ29tbWFuZCAiL34gb24gIg0KKwljcnQuc2xlZXAgMTAwDQorDQorRW5kIFN1Yg0KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy9ncG9uX3NjcmlwdHMvZ3Bvbl9jb25maWdfb251LnZicyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy9ncG9uX3NjcmlwdHMvZ3Bvbl9jb25maWdfb251LnZicwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MjJiNzkyCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL3Nka19zY3JpcHRzL2dwb25fc2NyaXB0cy9ncG9uX2NvbmZpZ19vbnUudmJzCkBAIC0wLDAgKzEsMjEgQEAKKyMgJGxhbmd1YWdlID0gIlZCU2NyaXB0Ig0KKyMgJGludGVyZmFjZSA9ICIxLjAiDQorDQorU3ViIFNlbmRBcHBsaWNhdGlvbkNvbW1hbmQoc2hlbGxfY29tbWFuZCkNCisgICAgY3J0LlNjcmVlbi5TZW5kIHNoZWxsX2NvbW1hbmQgJiBWYkNyICYgVmJDcg0KKwljcnQuc2xlZXAgMTAwMA0KK0VuZCBTdWINCisNCitTdWIgbWFpbg0KKw0KKwlwb25fbmkgPSBpbnB1dGJveCgiUE9OIE5JOiBbMC0xNV0iICkNCisJb251ID0gaW5wdXRib3goIk9OVSBJRDogWzAtMTI3XSIgKQ0KKw0KKwlTZW5kQXBwbGljYXRpb25Db21tYW5kICIvfiBvZmYgIg0KKwljcnQuc2xlZXAgMTANCisJc2VyaWFsID0gc3RyaW5nKDggLSBMZW4ob251KSwgIjAiKSAmIG9udSANCisJU2VuZEFwcGxpY2F0aW9uQ29tbWFuZCAiL2FwaS9zZXQgb2JqZWN0PWdwb25fb251IHBvbl9uaT0iICYgcG9uX25pICYgIiBvbnVfaWQ9IiAmIG9udSAmICIgc2VyaWFsX251bWJlci52ZW5kb3JfaWQ9MDAwMDAwMDAgZHNfYmVyX3JlcG9ydGluZ19pbnRlcnZhbD0xMDAwMDAwIHNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljPSIgJiBzZXJpYWwgJiAiIG9tY2lfcG9ydF9pZD0iICYgb251DQorCWNydC5zbGVlcCAxMA0KKwlTZW5kQXBwbGljYXRpb25Db21tYW5kICIvfiBvbiAiDQorDQorRW5kIFN1Yg0KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy9ncG9uX3NjcmlwdHMvZ3Bvbl9tYXBsZV9pbml0LnZicyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy9ncG9uX3NjcmlwdHMvZ3Bvbl9tYXBsZV9pbml0LnZicwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42YjdhMWRlCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL3Nka19zY3JpcHRzL2dwb25fc2NyaXB0cy9ncG9uX21hcGxlX2luaXQudmJzCkBAIC0wLDAgKzEsNjggQEAKKyMgJGxhbmd1YWdlID0gIlZCU2NyaXB0Ig0KKyMgJGludGVyZmFjZSA9ICIxLjAiDQorDQorDQorU3ViIFNsZWVwKHRpbWV3YWl0KQ0KKyANCisgIElmIGNydC5zY3JlZW4ud2FpdGZvcnN0cmluZygicGF1c2UiLCB0aW1ld2FpdCkgPSB0cnVlIHRoZW4gbXNnYm94ICJzdXJwcmlzZSINCisgIA0KK0VuZCBTdWINCisNCitTdWIgU2VuZFNoZWxsQ29tbWFuZChzaGVsbF9jb21tYW5kKQ0KKwljcnQuU2NyZWVuLlNlbmQgc2hlbGxfY29tbWFuZCAmIFZiQ3INCitFbmQgU3ViDQorDQorc3ViIG1haW4NCisNCitTZW5kU2hlbGxDb21tYW5kKCJyb290IikNCitjcnQuU2xlZXAgMTAwDQorU2VuZFNoZWxsQ29tbWFuZCgicm9vdCIpDQorY3J0LlNsZWVwIDEwMA0KK1NlbmRTaGVsbENvbW1hbmQoImNkIC9vcHQvYmNtNjg2MjAvIikNCitjcnQuc2NyZWVuLldhaXRGb3JTdHJpbmcgIiMiDQorY3J0LlNsZWVwIDEwMA0KK1NlbmRTaGVsbENvbW1hbmQoIi4vc3ZrX2luaXQuc2giKQ0KK2NydC5zY3JlZW4uV2FpdEZvclN0cmluZyAiPiINCitjcnQuU2xlZXAgMTAwMA0KK2NydC5TY3JlZW4uU2VuZCBWYkNyDQorDQorJ21hbmRhdG9yeQ0KK1NlbmRTaGVsbENvbW1hbmQoIi9hcGkvc2V0IG9iamVjdD1kZXZpY2Ugc3lzdGVtX21vZGU9Z3Bvbl9fMTZfeCIpDQorY3J0LlNsZWVwIDUwDQorDQorJ09wdGlvbmFsIC0gY29uZmlndXJlIHRoZSBOTkkgc3BlZWQgaW4gb3JkZXIgdG8gd29yayB3aXRoIGEgMWcgdHJhZmZpYyBnZW5lcmF0b3INCitTZW5kU2hlbGxDb21tYW5kKCIvYXBpL3NldCBvYmplY3Q9ZGV2aWNlIG5uaV9zcGVlZC5maXJzdF9oYWxmPWdicHNfMSBubmlfc3BlZWQuc2Vjb25kX2hhbGY9Z2Jwc18xICIpDQorY3J0LlNsZWVwIDUwDQorDQorJ09wdGlvbmFsIC0gY29uZmlndXJlIHRoZSBQQ0llIGRtYSBxdWV1ZXMgc2l6ZXMgb3IgY29uZmlndXJlIHRoZSBzeXN0ZW0gbm90IHRvIGZhaWwgb24gYmFkIEFWUyBjaGVjay4gIA0KK1NlbmRTaGVsbENvbW1hbmQoIi9hcGkvc2V0IG9iamVjdD1kZXZpY2UgZGVidWcuaG9zdF9kbWFfcnhfcXVldWVfc2l6ZT0xMjggZGVidWcuaG9zdF9kbWFfdHhfcXVldWVfc2l6ZT0xMjggZGVidWcuYXZzX2NvbnRyb2w9eWVzIikNCitjcnQuU2xlZXAgNTANCisNCisnT3B0aW9uYWwgLSBjb25maWd1cmUgdGhlIGtlZXAgYWxpdmUgcGFyYW1ldGVycyAgDQorU2VuZFNoZWxsQ29tbWFuZCgiL2FwaS9zZXQgb2JqZWN0PWRldmljZSBrZWVwYWxpdmVfaW50ZXJ2YWw9NSBrZWVwYWxpdmVfdG9sZXJhbmNlPTMiKQ0KKw0KK2NydC5TY3JlZW4uU2VuZCBWYkNyDQorY3J0LnNjcmVlbi5XYWl0Rm9yU3RyaW5nICI+Ig0KK2NydC5TbGVlcCA1MA0KK2NydC5TY3JlZW4uU2VuZCBWYkNyDQorDQorDQorU2VuZFNoZWxsQ29tbWFuZCgiL3VzZXIvcmVnaXN0ZXJfaW5kaWNhdGlvbl9oYW5kbGVyIikNCitjcnQuU2NyZWVuLlNlbmQgVmJDcg0KK2NydC5TY3JlZW4uU2VuZCBWYkNyDQorY3J0LnNjcmVlbi5XYWl0Rm9yU3RyaW5nICI+Ig0KKw0KK2NydC5TY3JlZW4uU2VuZCBWYkNyDQorY3J0LlNsZWVwIDUwDQorU2VuZFNoZWxsQ29tbWFuZCgiL3VzZXIvcmVnaXN0ZXJfcHJveHlfcnhfaGFuZGxlciAiKQ0KK2NydC5TY3JlZW4uU2VuZCBWYkNyDQorY3J0LlNsZWVwIDUwDQorY3J0LlNjcmVlbi5TZW5kIFZiQ3INCitTZW5kU2hlbGxDb21tYW5kKCIvYXBpL29wZXIgb2JqZWN0PWRldmljZSBzdWI9Y29ubmVjdCAiKQ0KK2NydC5TY3JlZW4uU2VuZCBWYkNyDQorY3J0LnNjcmVlbi5XYWl0Rm9yU3RyaW5nICI+Ig0KK2NydC5TY3JlZW4uU2VuZCBWYkNyDQorDQorY3J0LlNsZWVwIDUwDQorCQkNCitFbmQgU3ViDQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL3Nka19zY3JpcHRzL2dwb25fc2NyaXB0cy9ncG9uX29udV9zdGF0aXN0aWNzLnZicyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy9ncG9uX3NjcmlwdHMvZ3Bvbl9vbnVfc3RhdGlzdGljcy52YnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDdjODdmOQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy9ncG9uX3NjcmlwdHMvZ3Bvbl9vbnVfc3RhdGlzdGljcy52YnMKQEAgLTAsMCArMSwxOCBAQAorIyAkbGFuZ3VhZ2UgPSAiVkJTY3JpcHQiDQorIyAkaW50ZXJmYWNlID0gIjEuMCINCisNCitTdWIgU2VuZEFwcGxpY2F0aW9uQ29tbWFuZChzaGVsbF9jb21tYW5kKQ0KKyAgICBjcnQuU2NyZWVuLlNlbmQgc2hlbGxfY29tbWFuZCAmIFZiQ3IgJiBWYkNyDQorCWNydC5zbGVlcCAxMDAwDQorRW5kIFN1Yg0KKw0KK1N1YiBtYWluDQorDQorCQlwb25fbmkgPSBpbnB1dGJveCgiUE9OIE5JOiBbMC0xNV0iICkNCisJCW9udSA9IGlucHV0Ym94KCJPTlUgSUQ6IFswLTEyN10iICkNCisNCisJU2VuZEFwcGxpY2F0aW9uQ29tbWFuZCAiL2FwaS9zdGF0IG9iamVjdD1ncG9uX29udSBwb25fbmk9IiAmIHBvbl9uaSAmICIgb251X2lkPSIgJiBvbnUgJiAiIGNsZWFyPW5vIiAgDQorCWNydC5zbGVlcCAxMA0KKw0KKw0KK0VuZCBTdWINCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2Uvc2RrX3NjcmlwdHMvZ3Bvbl9zY3JpcHRzL2dwb25fcG9uX2FjdGl2YXRpb24udmJzIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL3Nka19zY3JpcHRzL2dwb25fc2NyaXB0cy9ncG9uX3Bvbl9hY3RpdmF0aW9uLnZicwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lYTIxOTNmCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL3Nka19zY3JpcHRzL2dwb25fc2NyaXB0cy9ncG9uX3Bvbl9hY3RpdmF0aW9uLnZicwpAQCAtMCwwICsxLDE4IEBACisjICRsYW5ndWFnZSA9ICJWQlNjcmlwdCINCisjICRpbnRlcmZhY2UgPSAiMS4wIg0KKw0KK1N1YiBTZW5kQXBwbGljYXRpb25Db21tYW5kKHNoZWxsX2NvbW1hbmQpDQorICAgIGNydC5TY3JlZW4uU2VuZCBzaGVsbF9jb21tYW5kICYgVmJDciAmIFZiQ3INCisJY3J0LnNsZWVwIDEwMDANCitFbmQgU3ViDQorDQorU3ViIG1haW4NCisNCisJcG9uX25pID0gaW5wdXRib3goIlBPTiBOSTogWzAtMTVdIiApDQorDQorCVNlbmRBcHBsaWNhdGlvbkNvbW1hbmQgIi9ib2FyZC90cnhfZW5hYmxlIHBvbl9pZD0iICYgcG9uX25pICYgIiAiICAgDQorCWNydC5zbGVlcCAxMDANCisJU2VuZEFwcGxpY2F0aW9uQ29tbWFuZCAiL2FwaS9vcGVyIG9iamVjdD1ncG9uX25pIHN1Yj1zZXRfcG9uX3N0YXRlIHBvbl9uaT0iICYgcG9uX25pICYgIiBwb25fc3RhdGU9YWN0aXZlX3dvcmtpbmciICANCisJY3J0LnNsZWVwIDEwMA0KKw0KK0VuZCBTdWINCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2Uvc2RrX3NjcmlwdHMvZ3Bvbl9zY3JpcHRzL2dwb25fcnNzaV9pMmNfcmVhZF9yZXN1bHQudmJzIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL3Nka19zY3JpcHRzL2dwb25fc2NyaXB0cy9ncG9uX3Jzc2lfaTJjX3JlYWRfcmVzdWx0LnZicwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMDljYTgwCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL3Nka19zY3JpcHRzL2dwb25fc2NyaXB0cy9ncG9uX3Jzc2lfaTJjX3JlYWRfcmVzdWx0LnZicwpAQCAtMCwwICsxLDQyIEBACisjICRsYW5ndWFnZSA9ICJWQlNjcmlwdCINCisjICRpbnRlcmZhY2UgPSAiMS4wIg0KKw0KK1N1YiBTZW5kQXBwbGljYXRpb25Db21tYW5kKHNoZWxsX2NvbW1hbmQpDQorICAgIGNydC5TY3JlZW4uU2VuZCBzaGVsbF9jb21tYW5kICYgVmJDciAmIFZiQ3INCisJY3J0LnNsZWVwIDEwMDANCitFbmQgU3ViDQorDQorU3ViIG1haW4NCisNCisJcG9uX25pID0gaW5wdXRib3goIlBPTiBOSTogWzAtMTVdIiApDQorDQorCQ0KK2lmIHBvbl9uaSA8IDggdGhlbg0KKwlTZW5kQXBwbGljYXRpb25Db21tYW5kICIvYm9hcmQvaTJjL2Rldl9jaGFuZ2UgZGV2PXN3MiIgIA0KKwljcnQuc2xlZXAgMTAwIA0KKwlTZW5kQXBwbGljYXRpb25Db21tYW5kICIvYm9hcmQvaTJjL2Rldl93cml0ZSB3aWR0aD04IGFkZHI9MCB2YWw9MHgiICYgaGV4KDIgXiAoNyAtIHBvbl9uaSkpICYiICINCisJY3J0LnNsZWVwIDEwDQorZWxzZQ0KK1NlbmRBcHBsaWNhdGlvbkNvbW1hbmQgIi9ib2FyZC9pMmMvZGV2X2NoYW5nZSBkZXY9c3czIiAgDQorCWNydC5zbGVlcCAxMDANCitpZiBwb25fbmkgPCAxMiB0aGVuDQorCQ0KKwlTZW5kQXBwbGljYXRpb25Db21tYW5kICIvYm9hcmQvaTJjL2Rldl93cml0ZSB3aWR0aD04IGFkZHI9MCB2YWw9MHgiICYgaGV4KDIgXiAoIHBvbl9uaSAtIDQpKSAmIiAiDQorCWNydC5zbGVlcCAxMA0KK2Vsc2UNCisJU2VuZEFwcGxpY2F0aW9uQ29tbWFuZCAiL2JvYXJkL2kyYy9kZXZfd3JpdGUgd2lkdGg9OCBhZGRyPTAgdmFsPTB4IiAmIGhleCgyIF4gKCBwb25fbmkgLSAxMikpICYiICINCisJY3J0LnNsZWVwIDEwDQorDQorDQorZW5kIGlmDQorDQorZW5kIGlmDQorCVNlbmRBcHBsaWNhdGlvbkNvbW1hbmQgIi9ib2FyZC9pMmMvZGV2X2NoYW5nZSBzZnAyICINCisJY3J0LnNsZWVwIDEwDQorCVNlbmRBcHBsaWNhdGlvbkNvbW1hbmQgIi9ib2FyZC9pMmMvZGV2X3JlYWQgd2lkdGg9OCBhZGRyPTB4NjgiDQorCWNydC5zbGVlcCAxMA0KKwlTZW5kQXBwbGljYXRpb25Db21tYW5kICIvYm9hcmQvaTJjL2Rldl9yZWFkIHdpZHRoPTggYWRkcj0weDY5Ig0KKwljcnQuc2xlZXAgMTANCisNCisNCitFbmQgU3ViDQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL3Nka19zY3JpcHRzL2dwb25fc2NyaXB0cy9ncG9uX3N0YXJ0X3NuX2FjcXVpc2l0aW9uLnZicyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy9ncG9uX3NjcmlwdHMvZ3Bvbl9zdGFydF9zbl9hY3F1aXNpdGlvbi52YnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWQxMjA4OQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy9ncG9uX3NjcmlwdHMvZ3Bvbl9zdGFydF9zbl9hY3F1aXNpdGlvbi52YnMKQEAgLTAsMCArMSwxOCBAQAorIyAkbGFuZ3VhZ2UgPSAiVkJTY3JpcHQiDQorIyAkaW50ZXJmYWNlID0gIjEuMCINCisNCitTdWIgU2VuZEFwcGxpY2F0aW9uQ29tbWFuZChzaGVsbF9jb21tYW5kKQ0KKyAgICBjcnQuU2NyZWVuLlNlbmQgc2hlbGxfY29tbWFuZCAmIFZiQ3IgJiBWYkNyDQorCWNydC5zbGVlcCAxMDAwDQorRW5kIFN1Yg0KKw0KK1N1YiBtYWluDQorDQorCQlwb25fbmkgPSBpbnB1dGJveCgiUE9OIE5JOiBbMC0xNV0iICkNCisJCWludGVydmFsID0gaW5wdXRib3goImludGVydmFsIGluIE1TIiApDQorCQlvcGVyID0gaW5wdXRib3goInBvc3RfZGlzY292ZXJ5X21vZGU6bm9uZS9kaXNhYmxlL2FjdGl2YXRlIiApDQorDQorCVNlbmRBcHBsaWNhdGlvbkNvbW1hbmQgIi9hcGkvc2V0IG9iamVjdD1ncG9uX25pIHBvbl9uaT0iICYgcG9uX25pICYgIiBzbl9hY3F1aXNpdGlvbi5pbnRlcnZhbD0iICYgaW50ZXJ2YWwgJiAiIHNuX2FjcXVpc2l0aW9uLm9udV9wb3N0X2Rpc2NvdmVyeV9tb2RlPSIgJiBvcGVyICYgIiBzbl9hY3F1aXNpdGlvbi5jb250cm9sPWVuYWJsZSAiDQorCWNydC5zbGVlcCAxMDANCisNCitFbmQgU3ViDQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL3Nka19zY3JpcHRzL2dwb25fc2NyaXB0cy9ncG9uX3N0b3Bfc25fYWNxdWlzaXRpb24udmJzIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL3Nka19zY3JpcHRzL2dwb25fc2NyaXB0cy9ncG9uX3N0b3Bfc25fYWNxdWlzaXRpb24udmJzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJjZjJjODMKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2Uvc2RrX3NjcmlwdHMvZ3Bvbl9zY3JpcHRzL2dwb25fc3RvcF9zbl9hY3F1aXNpdGlvbi52YnMKQEAgLTAsMCArMSwxOCBAQAorIyAkbGFuZ3VhZ2UgPSAiVkJTY3JpcHQiDQorIyAkaW50ZXJmYWNlID0gIjEuMCINCisNCitTdWIgU2VuZEFwcGxpY2F0aW9uQ29tbWFuZChzaGVsbF9jb21tYW5kKQ0KKyAgICBjcnQuU2NyZWVuLlNlbmQgc2hlbGxfY29tbWFuZCAmIFZiQ3IgJiBWYkNyDQorCWNydC5zbGVlcCAxMDAwDQorRW5kIFN1Yg0KKw0KK1N1YiBtYWluDQorDQorCQlwb25fbmkgPSBpbnB1dGJveCgiUE9OIE5JOiBbMC0xNV0iICkNCisJCWludGVydmFsID0gMTAwMA0KKwkJb3BlciA9ICJub25lIg0KKw0KKwlTZW5kQXBwbGljYXRpb25Db21tYW5kICIvYXBpL3NldCBvYmplY3Q9Z3Bvbl9uaSBwb25fbmk9IiAmIHBvbl9uaSAmICIgc25fYWNxdWlzaXRpb24uaW50ZXJ2YWw9IiAmIGludGVydmFsICYgIiBzbl9hY3F1aXNpdGlvbi5vbnVfcG9zdF9kaXNjb3ZlcnlfbW9kZT0iICYgb3BlciAmICIgc25fYWNxdWlzaXRpb24uY29udHJvbD1kaXNhYmxlIg0KKwljcnQuc2xlZXAgMTAwDQorDQorRW5kIFN1Yg0KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy94Z3Bvbl94Z3Nfc2NyaXB0cy94Z3Bvbl9tYXBsZV9pbml0LnZicyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy94Z3Bvbl94Z3Nfc2NyaXB0cy94Z3Bvbl9tYXBsZV9pbml0LnZicwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44MTk3MDAzCi0tLSAvZGV2L251bGwKKysrIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL3Nka19zY3JpcHRzL3hncG9uX3hnc19zY3JpcHRzL3hncG9uX21hcGxlX2luaXQudmJzCkBAIC0wLDAgKzEsNjQgQEAKKyMgJGxhbmd1YWdlID0gIlZCU2NyaXB0IgorIyAkaW50ZXJmYWNlID0gIjEuMCIKKworCitTdWIgU2xlZXAodGltZXdhaXQpCisgCisgIElmIGNydC5zY3JlZW4ud2FpdGZvcnN0cmluZygicGF1c2UiLCB0aW1ld2FpdCkgPSB0cnVlIHRoZW4gbXNnYm94ICJzdXJwcmlzZSIKKyAgCitFbmQgU3ViCisKK1N1YiBTZW5kU2hlbGxDb21tYW5kKHNoZWxsX2NvbW1hbmQpCisJY3J0LlNjcmVlbi5TZW5kIHNoZWxsX2NvbW1hbmQgJiBWYkNyCitFbmQgU3ViCisKK3N1YiBtYWluCisKK1NlbmRTaGVsbENvbW1hbmQoInJvb3QiKQorY3J0LlNsZWVwIDEwMAorU2VuZFNoZWxsQ29tbWFuZCgicm9vdCIpCitjcnQuU2xlZXAgMTAwCitTZW5kU2hlbGxDb21tYW5kKCJjZCAvb3B0L2JjbTY4NjIwLyIpCitjcnQuc2NyZWVuLldhaXRGb3JTdHJpbmcgIiMiCitjcnQuU2xlZXAgMTAwCitTZW5kU2hlbGxDb21tYW5kKCIuL3N2a19pbml0LnNoIikKK2NydC5zY3JlZW4uV2FpdEZvclN0cmluZyAiPiIKK2NydC5TbGVlcCAxMDAwCitjcnQuU2NyZWVuLlNlbmQgVmJDcgorCisKK1NlbmRTaGVsbENvbW1hbmQoIi9hcGkvc2V0IG9iamVjdD1kZXZpY2Ugc3lzdGVtX21vZGU9eGdwb25fMV9fOF94IikKK2NydC5TY3JlZW4uU2VuZCBWYkNyCitjcnQuU2NyZWVuLlNlbmQgVmJDcgorY3J0LlNsZWVwIDUwCisnIHRoZSBmb2xsb3dpbmcgbGluZSBpcyBvbmx5IGlmIHlvdSB3b3VsZCBsaWtlIHRvIHNldCB0aGUga2VlcCBhbGl2ZSB2YWx1ZXMgCisnU2VuZFNoZWxsQ29tbWFuZCgiL2FwaS9zZXQgb2JqZWN0PWRldmljZSBzeXN0ZW1fbW9kZT14Z3Bvbl8xX184X3gga2VlcGFsaXZlX2ludGVydmFsPTUga2VlcGFsaXZlX3RvbGVyYW5jZT0zIikKKydjcnQuU2xlZXAgNTAKKydjcnQuU2NyZWVuLlNlbmQgVmJDcgorJ2NydC5TY3JlZW4uU2VuZCBWYkNyCisKKworU2VuZFNoZWxsQ29tbWFuZCgiL3VzZXIvcmVnaXN0ZXJfaW5kaWNhdGlvbl9oYW5kbGVyIikKK2NydC5TY3JlZW4uU2VuZCBWYkNyCitjcnQuU2NyZWVuLlNlbmQgVmJDcgorY3J0LlNsZWVwIDUwCitTZW5kU2hlbGxDb21tYW5kKCIvdXNlci9yZWdpc3Rlcl9wcm94eV9yeF9oYW5kbGVyICIpCitjcnQuU2NyZWVuLlNlbmQgVmJDcgorY3J0LlNjcmVlbi5TZW5kIFZiQ3IKK2NydC5TbGVlcCA1MAorY3J0LlNjcmVlbi5TZW5kIFZiQ3IKK1NlbmRTaGVsbENvbW1hbmQoIi9hcGkvb3BlciBvYmplY3Q9ZGV2aWNlIHN1Yj1jb25uZWN0ICIpCitjcnQuU2NyZWVuLlNlbmQgVmJDcgorY3J0LnNjcmVlbi5XYWl0Rm9yU3RyaW5nICI+IgorY3J0LlNjcmVlbi5TZW5kIFZiQ3IKKworY3J0LlNsZWVwIDUwCisKKworCisKKworCisKKwkJCitFbmQgU3ViCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2Uvc2RrX3NjcmlwdHMveGdwb25feGdzX3NjcmlwdHMveGdwb25feGdzX2NvbmZpZ19hbGxvYy52YnMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2Uvc2RrX3NjcmlwdHMveGdwb25feGdzX3NjcmlwdHMveGdwb25feGdzX2NvbmZpZ19hbGxvYy52YnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTBjMGVmMgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy94Z3Bvbl94Z3Nfc2NyaXB0cy94Z3Bvbl94Z3NfY29uZmlnX2FsbG9jLnZicwpAQCAtMCwwICsxLDQ0IEBACisjICRsYW5ndWFnZSA9ICJWQlNjcmlwdCINCisjICRpbnRlcmZhY2UgPSAiMS4wIg0KKw0KK1N1YiBTZW5kQXBwbGljYXRpb25Db21tYW5kKHNoZWxsX2NvbW1hbmQpDQorICAgIGNydC5TY3JlZW4uU2VuZCBzaGVsbF9jb21tYW5kICYgVmJDciAmIFZiQ3INCisJY3J0LnNsZWVwIDIwMA0KK0VuZCBTdWINCisNCitTdWIgbWFpbg0KKw0KKwlJZiBjcnQuQXJndW1lbnRzLkNvdW50PjAgVGhlbg0KKwkJcG9uX25pID0gY3J0LkFyZ3VtZW50cygwKQ0KKwlFbHNlDQorCQlwb25fbmkgPSBpbnB1dGJveCgiUE9OIE5JOiBYR1BPTjpbMC03XSBYR1M6WzAtMV0iKQ0KKwlFbmQgSWYNCisJDQorCUlmIGNydC5Bcmd1bWVudHMuQ291bnQ+MSBUaGVuDQorCQlvbnVfaWQgPSBjcnQuQXJndW1lbnRzKDEpDQorCUVsc2UNCisJCW9udV9pZCA9IGlucHV0Ym94KCJPTlUgaWQ6IFswLTI1NV0iKQ0KKwlFbmQgSUYNCisJDQorCUlmIGNydC5Bcmd1bWVudHMuQ291bnQ+MiBUaGVuDQorCQlhbGxvY19pZCA9IGNydC5Bcmd1bWVudHMoMikNCisJRWxzZQ0KKwkJYWxsb2NfaWQgPSBpbnB1dGJveCgiQWxsb2MgaWQiKQ0KKwlFbmQgSUYNCisJDQorCScgeW91IGNhbiBhbHNvIGNvbW1lbnQgYWxsIHRoZSBpbnB1dCB2YWx1ZXMgb3V0IGFuZCBzZXQgdGhlc2UgdmFsdWVzIG1hbnVhbGx5IAkNCisJY2JyX3J0X2J3ID0gaW5wdXRib3goImNicl9ydF9idyBbYnl0ZXMvc2VjXSIpDQorCWNicl9ucnRfYncgPSBpbnB1dGJveCgiY2JyX25ydF9idyBbYnl0ZXMvc2VjXSIpDQorCWd1YXJhbnRlZWRfYncgPSBpbnB1dGJveCgiZ3VhcmFudGVlZF9idyBbYnl0ZXMvc2VjXSIpDQorCW1heGltdW1fYncgPSBpbnB1dGJveCgibWF4aW11bV9idyBbYnl0ZXMvc2VjXSIpDQorCWNicl9ydF9jb21wZW5zYXRpb24gPSBpbnB1dGJveCgiY2JyX3J0X2NvbXBlbnNhdGlvbiBbeWVzLG5vXSIpDQorCQ0KKwkNCisJU2VuZEFwcGxpY2F0aW9uQ29tbWFuZCAiL34gb2ZmIg0KKw0KKwknY29uZmlnIGFsbG9jDQorCVNlbmRBcHBsaWNhdGlvbkNvbW1hbmQgIi9hcGkvc2V0IG9iamVjdD14Z3Bvbl9hbGxvYyBwb25fbmk9IiAmIHBvbl9uaSAmICIgYWxsb2NfaWQ9IiAmIGFsbG9jX2lkICYgIiBvbnVfaWQ9IiAmIG9udV9pZCAmICIgc2xhLmNicl9ydF9idz0iICYgY2JyX3J0X2J3ICYgIiBzbGEuY2JyX25ydF9idz0iICYgY2JyX25ydF9idyAmICIgc2xhLmd1YXJhbnRlZWRfYnc9IiAmIGd1YXJhbnRlZWRfYncgJiAiIHNsYS5tYXhpbXVtX2J3PSIgJiBtYXhpbXVtX2J3ICYgIiBzbGEuYWRkaXRpb25hbF9id19lbGlnaWJpbGl0eT1ub25fYXNzdXJlZCBzbGEuY2JyX3J0X2NvbXBlbnNhdGlvbj0iICYgY2JyX3J0X2NvbXBlbnNhdGlvbiAmICIgc2xhLmNicl9ydF9hcF9pbmRleD0wIHNsYS5jYnJfbnJ0X2FwX2luZGV4PTAgc2xhLmFsbG9jX3R5cGU9bnNyIHNsYS53ZWlnaHQ9MCBzbGEucHJpb3JpdHk9MCINCisJDQorCVNlbmRBcHBsaWNhdGlvbkNvbW1hbmQgIi9+IG9uIg0KKw0KK0VuZCBTdWINCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2Uvc2RrX3NjcmlwdHMveGdwb25feGdzX3NjcmlwdHMveGdwb25feGdzX2NvbmZpZ19hbmRfYWN0aXZlX29udS52YnMgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2Uvc2RrX3NjcmlwdHMveGdwb25feGdzX3NjcmlwdHMveGdwb25feGdzX2NvbmZpZ19hbmRfYWN0aXZlX29udS52YnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTEzN2NkOQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy94Z3Bvbl94Z3Nfc2NyaXB0cy94Z3Bvbl94Z3NfY29uZmlnX2FuZF9hY3RpdmVfb251LnZicwpAQCAtMCwwICsxLDQwIEBACisjICRsYW5ndWFnZSA9ICJWQlNjcmlwdCINCisjICRpbnRlcmZhY2UgPSAiMS4wIg0KKw0KK1N1YiBTZW5kQXBwbGljYXRpb25Db21tYW5kKHNoZWxsX2NvbW1hbmQpDQorICAgIGNydC5TY3JlZW4uU2VuZCBzaGVsbF9jb21tYW5kICYgVmJDciAmIFZiQ3INCisJY3J0LnNsZWVwIDIwMA0KK0VuZCBTdWINCisNCitTdWIgbWFpbg0KKw0KKwlJZiBjcnQuQXJndW1lbnRzLkNvdW50ID4gMCBUaGVuDQorCQlwb25fbmkgPSBjcnQuQXJndW1lbnRzKDApDQorCUVsc2UNCisJCXBvbl9uaSA9IGlucHV0Ym94KCJQT04gTkk6IFhHUE9OOlswLTddIFhHUzpbMC0xXSIpDQorCUVuZCBJZg0KKwkNCisJSWYgY3J0LkFyZ3VtZW50cy5Db3VudCA+IDEgVGhlbg0KKwkJb251X2lkID0gY3J0LkFyZ3VtZW50cygxKQ0KKwlFbHNlDQorCQlvbnVfaWQgPSBpbnB1dGJveCgiT05VIGlkOiBbMC0yNTVdIikNCisJRW5kIElGDQorCQ0KKwlJZiBjcnQuQXJndW1lbnRzLkNvdW50ID4gMiBUaGVuDQorCQlkYXRhX2J1cnN0X3Byb2ZpbGUgPSBjcnQuQXJndW1lbnRzKDIpDQorCUVsc2UNCisJCWRhdGFfYnVyc3RfcHJvZmlsZSA9IGlucHV0Ym94KCJEYXRhIGJ1cnN0IHByb2ZpbGU6IFswLTNdIiAmIFZiQ3IgJiAiMCAtIHJhbmdpbmciICYgVmJDciAmICIxIC0gZGF0YSIgJiBWYkNyICYgIjIgLSByYW5naW5nIEZFQyIgJiBWYkNyICYgIjMgLSBkYXRhIEZFQyIpDQorCUVuZCBJRg0KKwkNCisJJ1NlbmRBcHBsaWNhdGlvbkNvbW1hbmQgIi9+IG9mZiINCisJDQorCSdjb25maWcgb251DQorCXNlcmlhbCA9IHN0cmluZyg4IC0gTGVuKG9udV9pZCksICIwIikgJiBvbnVfaWQNCisJU2VuZEFwcGxpY2F0aW9uQ29tbWFuZCAiL2FwaS9zZXQgb2JqZWN0PXhncG9uX29udSBwb25fbmk9IiAmIHBvbl9uaSAmICIgb251X2lkPSIgJiBvbnVfaWQgJiAiIHNlcmlhbF9udW1iZXIudmVuZG9yX2lkPTAwMDAwMDAwIHNlcmlhbF9udW1iZXIudmVuZG9yX3NwZWNpZmljPSIgJiBzZXJpYWwgJiAiIHJlZ2lzdHJhdGlvbl9pZF9hdXRvX2xlYXJuaW5nPXllcyByYW5naW5nX2J1cnN0X3Byb2ZpbGU9MCBkYXRhX2J1cnN0X3Byb2ZpbGU9IiAmIGRhdGFfYnVyc3RfcHJvZmlsZQ0KKyAgIA0KKyAgICAnYWN0aXZhdGUgb251DQorICAgIFNlbmRBcHBsaWNhdGlvbkNvbW1hbmQgIi9hcGkvb3BlciBvYmplY3Q9eGdwb25fb251IHN1Yj1zZXRfb251X3N0YXRlIHBvbl9uaT0iICYgcG9uX25pICYgIiBvbnVfaWQ9IiAmIG9udV9pZCAmICIgb251X3N0YXRlPWFjdGl2ZSINCisgICAgDQorICAgICdTZW5kQXBwbGljYXRpb25Db21tYW5kICIvfiBvbiINCisNCitFbmQgU3ViDQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL3Nka19zY3JpcHRzL3hncG9uX3hnc19zY3JpcHRzL3hncG9uX3hnc19jb25maWdfZ2VtX3BvcnQudmJzIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL3Nka19zY3JpcHRzL3hncG9uX3hnc19zY3JpcHRzL3hncG9uX3hnc19jb25maWdfZ2VtX3BvcnQudmJzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI4Y2ZlNzAKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2Uvc2RrX3NjcmlwdHMveGdwb25feGdzX3NjcmlwdHMveGdwb25feGdzX2NvbmZpZ19nZW1fcG9ydC52YnMKQEAgLTAsMCArMSwzNiBAQAorIyAkbGFuZ3VhZ2UgPSAiVkJTY3JpcHQiDQorIyAkaW50ZXJmYWNlID0gIjEuMCINCisNCitTdWIgU2VuZEFwcGxpY2F0aW9uQ29tbWFuZChzaGVsbF9jb21tYW5kKQ0KKyAgICBjcnQuU2NyZWVuLlNlbmQgc2hlbGxfY29tbWFuZCAmIFZiQ3IgJiBWYkNyDQorCWNydC5zbGVlcCAyMDANCitFbmQgU3ViDQorDQorU3ViIG1haW4NCisNCisJSWYgY3J0LkFyZ3VtZW50cy5Db3VudD4wIFRoZW4NCisJCXBvbl9uaSA9IGNydC5Bcmd1bWVudHMoMCkNCisJRWxzZQ0KKwkJcG9uX25pID0gaW5wdXRib3goIlBPTiBOSTogWEdQT046WzAtN10gWEdTOlswLTFdIikNCisJRW5kIElmDQorCQ0KKwlJZiBjcnQuQXJndW1lbnRzLkNvdW50PjEgVGhlbg0KKwkJb251X2lkID0gY3J0LkFyZ3VtZW50cygxKQ0KKwlFbHNlDQorCQlvbnVfaWQgPSBpbnB1dGJveCgiT05VIGlkOiBbMC0yNTVdIikNCisJRW5kIElGDQorDQorCUlmIGNydC5Bcmd1bWVudHMuQ291bnQ+MiBUaGVuDQorCQlwb3J0X2lkID0gY3J0LkFyZ3VtZW50cygyKQ0KKwlFbHNlDQorCQlwb3J0X2lkID0gaW5wdXRib3goInBvcnRfaWQiKQ0KKwlFbmQgSUYNCisJDQorCVNlbmRBcHBsaWNhdGlvbkNvbW1hbmQgIi9+IG9mZiINCisJDQorCSdjb25maWcgcG9ydA0KKwlTZW5kQXBwbGljYXRpb25Db21tYW5kICIvYXBpL3NldCBvYmplY3Q9eGdwb25fZ2VtX3BvcnQgcG9uX25pPSIgJiBwb25fbmkgJiAiIGdlbV9wb3J0X2lkPSIgJiBwb3J0X2lkICYgIiBvbnVfaWQ9IiAmIG9udV9pZCAmICIgY29uZmlndXJhdGlvbi5kaXJlY3Rpb249YmlkaXJlY3Rpb25hbCBjb25maWd1cmF0aW9uLnR5cGU9dW5pY2FzdCBlbmNyeXB0aW9uX21vZGU9ZGlzYWJsZSB1cHN0cmVhbV9kZXN0aW5hdGlvbl9xdWV1ZT1kYXRhIGNvbnRyb2w9ZW5hYmxlIg0KKwkNCisJU2VuZEFwcGxpY2F0aW9uQ29tbWFuZCAiL34gb24iDQorDQorRW5kIFN1Yg0KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy94Z3Bvbl94Z3Nfc2NyaXB0cy94Z3Bvbl94Z3NfY29uZmlnX211bHRpZ2VtX3BvcnQudmJzIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL3Nka19zY3JpcHRzL3hncG9uX3hnc19zY3JpcHRzL3hncG9uX3hnc19jb25maWdfbXVsdGlnZW1fcG9ydC52YnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDc4Y2QyYgotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy94Z3Bvbl94Z3Nfc2NyaXB0cy94Z3Bvbl94Z3NfY29uZmlnX211bHRpZ2VtX3BvcnQudmJzCkBAIC0wLDAgKzEsMzYgQEAKKyMgJGxhbmd1YWdlID0gIlZCU2NyaXB0Ig0KKyMgJGludGVyZmFjZSA9ICIxLjAiDQorDQorU3ViIFNlbmRBcHBsaWNhdGlvbkNvbW1hbmQoc2hlbGxfY29tbWFuZCkNCisgICAgY3J0LlNjcmVlbi5TZW5kIHNoZWxsX2NvbW1hbmQgJiBWYkNyICYgVmJDcg0KKwljcnQuc2xlZXAgMjAwDQorRW5kIFN1Yg0KKw0KK1N1YiBtYWluDQorDQorCUlmIGNydC5Bcmd1bWVudHMuQ291bnQ+MCBUaGVuDQorCQlwb25fbmkgPSBjcnQuQXJndW1lbnRzKDApDQorCUVsc2UNCisJCXBvbl9uaSA9IGlucHV0Ym94KCJQT04gTkk6IFhHUE9OOlswLTddIFhHUzpbMC0xXSIpDQorCUVuZCBJZg0KKwkNCisJSWYgY3J0LkFyZ3VtZW50cy5Db3VudD4xIFRoZW4NCisJCW9udV9pZCA9IGNydC5Bcmd1bWVudHMoMSkNCisJRWxzZQ0KKwkJb251X2lkID0gaW5wdXRib3goIk9OVSBpZDogWzAtMjU1XSIpDQorCUVuZCBJRg0KKw0KKwlJZiBjcnQuQXJndW1lbnRzLkNvdW50PjIgVGhlbg0KKwkJcG9ydF9pZCA9IGNydC5Bcmd1bWVudHMoMikNCisJRWxzZQ0KKwkJcG9ydF9pZCA9IGlucHV0Ym94KCJwb3J0X2lkIikNCisJRW5kIElGDQorCQ0KKwlTZW5kQXBwbGljYXRpb25Db21tYW5kICIvfiBvZmYiDQorCQ0KKwknY29uZmlnIHBvcnQNCisJU2VuZEFwcGxpY2F0aW9uQ29tbWFuZCAiL2FwaS9zZXQgb2JqZWN0PXhncG9uX2dlbV9wb3J0IHBvbl9uaT0iICYgcG9uX25pICYgIiBnZW1fcG9ydF9pZD0iICYgcG9ydF9pZCAmICIgY29uZmlndXJhdGlvbi5kaXJlY3Rpb249YmlkaXJlY3Rpb25hbCBjb25maWd1cmF0aW9uLnR5cGU9bXVsdGljYXN0IGRvd25zdHJlYW1fZW5jcnlwdGlvbl9tb2RlPWRpc2FibGUgdXBzdHJlYW1fZGVzdGluYXRpb25fcXVldWU9ZGF0YSBjb250cm9sPWVuYWJsZSINCisJDQorCVNlbmRBcHBsaWNhdGlvbkNvbW1hbmQgIi9+IG9uIg0KKw0KK0VuZCBTdWINCmRpZmYgLS1naXQgYS9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2Uvc2RrX3NjcmlwdHMveGdwb25feGdzX3NjcmlwdHMveGdwb25feGdzX3Bvbl9hY3RpdmF0aW9uLnZicyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy94Z3Bvbl94Z3Nfc2NyaXB0cy94Z3Bvbl94Z3NfcG9uX2FjdGl2YXRpb24udmJzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhkMTMyNDYKLS0tIC9kZXYvbnVsbAorKysgYi9iY202ODYyMF9yZWxlYXNlL3JlbGVhc2Uvc2RrX3NjcmlwdHMveGdwb25feGdzX3NjcmlwdHMveGdwb25feGdzX3Bvbl9hY3RpdmF0aW9uLnZicwpAQCAtMCwwICsxLDUwIEBACisjICRsYW5ndWFnZSA9ICJWQlNjcmlwdCIKKyMgJGludGVyZmFjZSA9ICIxLjAiCisKK1N1YiBTZW5kQXBwbGljYXRpb25Db21tYW5kKHNoZWxsX2NvbW1hbmQpCisgICAgY3J0LlNjcmVlbi5TZW5kIHNoZWxsX2NvbW1hbmQgJiBWYkNyICYgVmJDcgorCWNydC5zbGVlcCAyMDAKK0VuZCBTdWIKKworU3ViIG1haW4KKwlJZiBjcnQuQXJndW1lbnRzLkNvdW50PjAgVGhlbgorCQlzeXNfbW9kZSA9IGNydC5Bcmd1bWVudHMoMCkKKwlFbHNlCisJCXN5c19tb2RlID0gaW5wdXRib3goInN5c3RlbSBtb2RlOiBbMDpYR1BPTiAgMTpYR1MgIDI6TkdQT04yXSIpCisJRW5kIElmCisJCisJSWYgY3J0LkFyZ3VtZW50cy5Db3VudD4wIFRoZW4KKwkJcG9uX25pID0gY3J0LkFyZ3VtZW50cygwKQorCUVsc2UKKwkJSWYgc3lzX21vZGU9MCBUaGVuCisJCQlwb25fbmkgPSBpbnB1dGJveCgiUE9OIE5JOiBbMC03XSIpCisJCUVsc2UKKwkJCXBvbl9uaSA9IGlucHV0Ym94KCJQT04gTkk6IFswLTFdIikgJyB1c2VkIGZvciBYR1MvTkdQT04yCisJCUVuZCBJZgorCUVuZCBJZgorCQorCVNlbmRBcHBsaWNhdGlvbkNvbW1hbmQgIi9+IG9mZiIKKwknZW5hYmxlIHRoZSB0cmFuc2NlaXZlciB0aGlzIGNvbW1hbmQgaXMgYm9hcmQgZGVwZW5kZW50CisJSWYgc3lzX21vZGU9MCBUaGVuCisJCVNlbmRBcHBsaWNhdGlvbkNvbW1hbmQgIi9ib2FyZC9UcnhfZW5hYmxlIHBvbl9pZD0iICYgcG9uX25pICYgIiAiCisJRWxzZQorCQlTZW5kQXBwbGljYXRpb25Db21tYW5kICIvYm9hcmQvVHJ4X2VuYWJsZSBwb25faWQ9IiAmIHBvbl9uaSArIDMgJiAiICIKKwlFbmQgSWYKKwljcnQuc2xlZXAgMTAwCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICcgb3B0aW5hbCBTZXQgUG9uCisgICAgU2VuZEFwcGxpY2F0aW9uQ29tbWFuZCAiL2FwaS9zZXQgb2JqZWN0PXhncG9uX25pIHBvbl9uaT0iICYgcG9uX25pICYgIiBod19wb25faWQucG9uX2lkXzE9MCBod19wb25faWQucG9uX2lkXzI9MCBvbnVfYWxhcm1zX3RocmVzaG9sZHMubG9zaT00IG9udV9hbGFybXNfdGhyZXNob2xkcy5sb2JpPTQgb251X2FsYXJtc190aHJlc2hvbGRzLmxvb2NpPTMgb251X2FsYXJtc190aHJlc2hvbGRzLmxvcGNpPTMgcGxvYW1faGFuZGxpbmcuYWNrX3RpbWVvdXQ9MjAwMCBwbG9hbV9oYW5kbGluZy5yZXRyYW5zX3JhbmdpbmdfdGltZT0xIHBsb2FtX2hhbmRsaW5nLnJldHJhbnNfYXNzaWduX2FsbG9jX2lkPTEgcGxvYW1faGFuZGxpbmcucmV0cmFuc19rZXlfY29udHJvbD0xIHBsb2FtX2hhbmRsaW5nLnJldHJhbnNfcmVxdWVzdF9yZWdpc3RyYXRpb249MSBwb25fZGlzdGFuY2UubWF4X2xvZ19kaXN0YW5jZT0yMCBwb25fZGlzdGFuY2UubWF4X2RpZmZfcmVhY2g9MjAiCSAgICAgICAgICAgICAgICAgICAgICAgIAorCQorICAgIElmIHN5c19tb2RlPTEgVGhlbgorCQlTZW5kQXBwbGljYXRpb25Db21tYW5kICIvYS9zIG9iamVjdD14Z3Bvbl90cnggcG9uX25pPSIgJiBwb25fbmkgJiAiIHRyYW5zY2VpdmVyX3R5cGU9bHRoXzUzMDJfcGMiCisJRW5kIElmCisgICAgSWYgc3lzX21vZGU9MiBUaGVuCisgICAgICAgIFNlbmRBcHBsaWNhdGlvbkNvbW1hbmQgIi9hL3Mgb2JqZWN0PXhncG9uX3RyeCBwb25fbmk9IiAmIHBvbl9uaSAmICIgdHJhbnNjZWl2ZXJfdHlwZT1sdHdfNjI3eF9wYyIgCisJRW5kIElmCisgICAgCisJJyBBY3RpdmF0ZSBQT04KKwlTZW5kQXBwbGljYXRpb25Db21tYW5kICIvYXBpL29wZXIgb2JqZWN0PXhncG9uX25pIHN1Yj1zZXRfcG9uX3N0YXRlIHBvbl9uaT0iICYgcG9uX25pICYgIiBwb25fc3RhdGU9YWN0aXZlX3dvcmtpbmciCisJCisJU2VuZEFwcGxpY2F0aW9uQ29tbWFuZCAiL34gb24iCisKK0VuZCBTdWIKZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy94Z3Bvbl94Z3Nfc2NyaXB0cy94Z3Bvbl94Z3NfcnNzaV9pMmNfcmVhZF9yZXN1bHQudmJzIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL3Nka19zY3JpcHRzL3hncG9uX3hnc19zY3JpcHRzL3hncG9uX3hnc19yc3NpX2kyY19yZWFkX3Jlc3VsdC52YnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDlkZjg3ZAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy94Z3Bvbl94Z3Nfc2NyaXB0cy94Z3Bvbl94Z3NfcnNzaV9pMmNfcmVhZF9yZXN1bHQudmJzCkBAIC0wLDAgKzEsMzcgQEAKKyMgJGxhbmd1YWdlID0gIlZCU2NyaXB0Ig0KKyMgJGludGVyZmFjZSA9ICIxLjAiDQorDQorU3ViIFNlbmRBcHBsaWNhdGlvbkNvbW1hbmQoc2hlbGxfY29tbWFuZCkNCisgICAgY3J0LlNjcmVlbi5TZW5kIHNoZWxsX2NvbW1hbmQgJiBWYkNyICYgVmJDcg0KKwljcnQuc2xlZXAgMTAwMA0KK0VuZCBTdWINCisNCitTdWIgbWFpbg0KKw0KKwlwb25fbmkgPSBpbnB1dGJveCgiUE9OIE5JOiBYR1BPTjpbMC03XSBYR1M6WzAtMV0iICkNCisNCisJDQoraWYgcG9uX25pIDwgNCB0aGVuDQorCVNlbmRBcHBsaWNhdGlvbkNvbW1hbmQgIi9ib2FyZC9pMmMvZGV2X2NoYW5nZSBkZXY9c3cyIiAgDQorCWNydC5zbGVlcCAxMDAgDQorCVNlbmRBcHBsaWNhdGlvbkNvbW1hbmQgIi9ib2FyZC9pMmMvZGV2X3dyaXRlIHdpZHRoPTggYWRkcj0wIHZhbD0weCIgJiBoZXgoMiBeICgzIC0gcG9uX25pKSkgJiIgIg0KKwljcnQuc2xlZXAgMTANCitlbHNlDQorU2VuZEFwcGxpY2F0aW9uQ29tbWFuZCAiL2JvYXJkL2kyYy9kZXZfY2hhbmdlIGRldj1zdzMiICANCisJY3J0LnNsZWVwIDEwMA0KKw0KKwkNCisJU2VuZEFwcGxpY2F0aW9uQ29tbWFuZCAiL2JvYXJkL2kyYy9kZXZfd3JpdGUgd2lkdGg9OCBhZGRyPTAgdmFsPTB4IiAmIGhleCgyIF4gcG9uX25pKSAmIiAiDQorCWNydC5zbGVlcCAxMA0KKw0KKw0KK2VuZCBpZg0KKwlTZW5kQXBwbGljYXRpb25Db21tYW5kICIvYm9hcmQvaTJjL2Rldl9jaGFuZ2Ugc2ZwMSAiDQorCWNydC5zbGVlcCAxMA0KKwlTZW5kQXBwbGljYXRpb25Db21tYW5kICIvYm9hcmQvaTJjL2Rldl9yZWFkIHdpZHRoPTggYWRkcj0weDY4Ig0KKwljcnQuc2xlZXAgMTANCisJU2VuZEFwcGxpY2F0aW9uQ29tbWFuZCAiL2JvYXJkL2kyYy9kZXZfcmVhZCB3aWR0aD04IGFkZHI9MHg2OSINCisJY3J0LnNsZWVwIDEwDQorDQorDQorRW5kIFN1Yg0KZGlmZiAtLWdpdCBhL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy94Z3Bvbl94Z3Nfc2NyaXB0cy94Z3Bvbl94Z3Nfc3RhcnRfc25fYWNxdWlzaXRpb24udmJzIGIvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL3Nka19zY3JpcHRzL3hncG9uX3hnc19zY3JpcHRzL3hncG9uX3hnc19zdGFydF9zbl9hY3F1aXNpdGlvbi52YnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGI2ZmIyZQotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy94Z3Bvbl94Z3Nfc2NyaXB0cy94Z3Bvbl94Z3Nfc3RhcnRfc25fYWNxdWlzaXRpb24udmJzCkBAIC0wLDAgKzEsMTggQEAKKyMgJGxhbmd1YWdlID0gIlZCU2NyaXB0Ig0KKyMgJGludGVyZmFjZSA9ICIxLjAiDQorDQorU3ViIFNlbmRBcHBsaWNhdGlvbkNvbW1hbmQoc2hlbGxfY29tbWFuZCkNCisgICAgY3J0LlNjcmVlbi5TZW5kIHNoZWxsX2NvbW1hbmQgJiBWYkNyICYgVmJDcg0KKwljcnQuc2xlZXAgMTAwMA0KK0VuZCBTdWINCisNCitTdWIgbWFpbg0KKw0KKwkJcG9uX25pID0gaW5wdXRib3goIlBPTiBOSTogWEdQT046WzAtN10gWEdTOlswLTFdIiApDQorCQlpbnRlcnZhbCA9IGlucHV0Ym94KCJpbnRlcnZhbCBpbiBNUyIgKQ0KKwkJb3BlciA9IGlucHV0Ym94KCJwb3N0X2Rpc2NvdmVyeV9tb2RlOm5vbmUvZGlzYWJsZS9hY3RpdmF0ZSIgKQ0KKw0KKwlTZW5kQXBwbGljYXRpb25Db21tYW5kICIvYXBpL3NldCBvYmplY3Q9eGdwb25fbmkgcG9uX25pPSIgJiBwb25fbmkgJiAiIHNuX2FjcXVpc2l0aW9uLmludGVydmFsPSIgJiBpbnRlcnZhbCAmICIgc25fYWNxdWlzaXRpb24ub251X3Bvc3RfZGlzY292ZXJ5X21vZGU9IiAmIG9wZXIgJiAiIHNuX2FjcXVpc2l0aW9uLmJ1cnN0X3Byb2ZpbGU9MCBzbl9hY3F1aXNpdGlvbi5jb250cm9sPWVuYWJsZSAiDQorCWNydC5zbGVlcCAxMDANCisNCitFbmQgU3ViDQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL3Nka19zY3JpcHRzL3hncG9uX3hnc19zY3JpcHRzL3hncG9uX3hnc19zdG9wX3NuX2FjcXVpc2l0aW9uLnZicyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy94Z3Bvbl94Z3Nfc2NyaXB0cy94Z3Bvbl94Z3Nfc3RvcF9zbl9hY3F1aXNpdGlvbi52YnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmIzMjZhMAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy94Z3Bvbl94Z3Nfc2NyaXB0cy94Z3Bvbl94Z3Nfc3RvcF9zbl9hY3F1aXNpdGlvbi52YnMKQEAgLTAsMCArMSwxOCBAQAorIyAkbGFuZ3VhZ2UgPSAiVkJTY3JpcHQiDQorIyAkaW50ZXJmYWNlID0gIjEuMCINCisNCitTdWIgU2VuZEFwcGxpY2F0aW9uQ29tbWFuZChzaGVsbF9jb21tYW5kKQ0KKyAgICBjcnQuU2NyZWVuLlNlbmQgc2hlbGxfY29tbWFuZCAmIFZiQ3IgJiBWYkNyDQorCWNydC5zbGVlcCAxMDAwDQorRW5kIFN1Yg0KKw0KK1N1YiBtYWluDQorDQorCQlwb25fbmkgPSBpbnB1dGJveCgiUE9OIE5JOiBYR1BPTjpbMC03XSBYR1M6WzAtMV0iICkNCisJCWludGVydmFsID0gMTAwMA0KKwkJb3BlciA9ICJub25lIg0KKw0KKwlTZW5kQXBwbGljYXRpb25Db21tYW5kICIvYXBpL3NldCBvYmplY3Q9eGdwb25fbmkgcG9uX25pPSIgJiBwb25fbmkgJiAiIHNuX2FjcXVpc2l0aW9uLmludGVydmFsPSIgJiBpbnRlcnZhbCAmICIgc25fYWNxdWlzaXRpb24ub251X3Bvc3RfZGlzY292ZXJ5X21vZGU9IiAmIG9wZXIgJiAiIHNuX2FjcXVpc2l0aW9uLmJ1cnN0X3Byb2ZpbGU9MCBzbl9hY3F1aXNpdGlvbi5jb250cm9sPWRpc2FibGUiDQorCWNydC5zbGVlcCAxMDANCisNCitFbmQgU3ViDQpkaWZmIC0tZ2l0IGEvYmNtNjg2MjBfcmVsZWFzZS9yZWxlYXNlL3Nka19zY3JpcHRzL3hncG9uX3hnc19zY3JpcHRzL3hnc19tYXBsZV9pbml0LnZicyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy94Z3Bvbl94Z3Nfc2NyaXB0cy94Z3NfbWFwbGVfaW5pdC52YnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFjYzFjMAotLS0gL2Rldi9udWxsCisrKyBiL2JjbTY4NjIwX3JlbGVhc2UvcmVsZWFzZS9zZGtfc2NyaXB0cy94Z3Bvbl94Z3Nfc2NyaXB0cy94Z3NfbWFwbGVfaW5pdC52YnMKQEAgLTAsMCArMSw2NCBAQAorIyAkbGFuZ3VhZ2UgPSAiVkJTY3JpcHQiCisjICRpbnRlcmZhY2UgPSAiMS4wIgorCisKK1N1YiBTbGVlcCh0aW1ld2FpdCkKKyAKKyAgSWYgY3J0LnNjcmVlbi53YWl0Zm9yc3RyaW5nKCJwYXVzZSIsIHRpbWV3YWl0KSA9IHRydWUgdGhlbiBtc2dib3ggInN1cnByaXNlIgorICAKK0VuZCBTdWIKKworU3ViIFNlbmRTaGVsbENvbW1hbmQoc2hlbGxfY29tbWFuZCkKKwljcnQuU2NyZWVuLlNlbmQgc2hlbGxfY29tbWFuZCAmIFZiQ3IKK0VuZCBTdWIKKworc3ViIG1haW4KKworU2VuZFNoZWxsQ29tbWFuZCgicm9vdCIpCitjcnQuU2xlZXAgMTAwCitTZW5kU2hlbGxDb21tYW5kKCJyb290IikKK2NydC5TbGVlcCAxMDAKK1NlbmRTaGVsbENvbW1hbmQoImNkIC9vcHQvYmNtNjg2MjAvIikKK2NydC5zY3JlZW4uV2FpdEZvclN0cmluZyAiIyIKK2NydC5TbGVlcCAxMDAKK1NlbmRTaGVsbENvbW1hbmQoIi4vc3ZrX2luaXQuc2giKQorY3J0LnNjcmVlbi5XYWl0Rm9yU3RyaW5nICI+IgorY3J0LlNsZWVwIDEwMDAKK2NydC5TY3JlZW4uU2VuZCBWYkNyCisKKworU2VuZFNoZWxsQ29tbWFuZCgiL2FwaS9zZXQgb2JqZWN0PWRldmljZSBzeXN0ZW1fbW9kZT14Z3NfXzJfeF8xMF9nIikKK2NydC5TY3JlZW4uU2VuZCBWYkNyCitjcnQuU2NyZWVuLlNlbmQgVmJDcgorY3J0LlNsZWVwIDUwCisnIHRoZSBmb2xsb3dpbmcgbGluZSBpcyBvbmx5IGlmIHlvdSB3b3VsZCBsaWtlIHRvIHNldCB0aGUga2VlcCBhbGl2ZSB2YWx1ZXMgCisnU2VuZFNoZWxsQ29tbWFuZCgiL2FwaS9zZXQgb2JqZWN0PWRldmljZSBzeXN0ZW1fbW9kZT14Z3NfXzJfeF8xMF9nIGtlZXBhbGl2ZV9pbnRlcnZhbD01IGtlZXBhbGl2ZV90b2xlcmFuY2U9MyIpCisnY3J0LlNsZWVwIDUwCisnY3J0LlNjcmVlbi5TZW5kIFZiQ3IKKydjcnQuU2NyZWVuLlNlbmQgVmJDcgorCisKK1NlbmRTaGVsbENvbW1hbmQoIi91c2VyL3JlZ2lzdGVyX2luZGljYXRpb25faGFuZGxlciIpCitjcnQuU2NyZWVuLlNlbmQgVmJDcgorY3J0LlNjcmVlbi5TZW5kIFZiQ3IKK2NydC5TbGVlcCA1MAorU2VuZFNoZWxsQ29tbWFuZCgiL3VzZXIvcmVnaXN0ZXJfcHJveHlfcnhfaGFuZGxlciAiKQorY3J0LlNjcmVlbi5TZW5kIFZiQ3IKK2NydC5TY3JlZW4uU2VuZCBWYkNyCitjcnQuU2xlZXAgNTAKK2NydC5TY3JlZW4uU2VuZCBWYkNyCitTZW5kU2hlbGxDb21tYW5kKCIvYXBpL29wZXIgb2JqZWN0PWRldmljZSBzdWI9Y29ubmVjdCAiKQorY3J0LlNjcmVlbi5TZW5kIFZiQ3IKK2NydC5zY3JlZW4uV2FpdEZvclN0cmluZyAiPiIKK2NydC5TY3JlZW4uU2VuZCBWYkNyCisKK2NydC5TbGVlcCA1MAorCisKKworCisKKworCisJCQorRW5kIFN1Ygo=